shuto_log.aep

自分がやったことなどを備忘録的な感じで残していこうと思います。

Notion が良い話

2020年は自分にとって勉強の年と決めていて、思考法やIT技術全般を主軸にジャンル問わず本を読んだり、様々な物事について自分なりに考えてみる機会が多かったのですが、その過程で Notion というツールを使ってみたら非常に有用で、個人的に人生で最も魅力を感じたツールだったので紹介してみます。

ただ、単なるNotionの使い方や活用法の紹介記事は他にごまんとあるため、本記事では「僕がなぜNotionを有用と感じるか」という点に重きをおいて、僕なりの言葉で紹介していきたいと思います。

www.notion.so

Notionとは何か どんな人におすすめか

Notionはいわゆるメモ帳サービス(Evernoteの競合、とでも言ったほうが伝わりやすいかも)ですが、単なるメモ帳サービスではありません。 メモ帳サービスとしては、iOS & Android のネイティブアプリはもちろん、ブラウザアプリも存在し、ブラウザさえ使えればどんな環境からも利用できる利便性の高さや、無料プランだと多少の制約はあるものの、個人用途なら普通に実用できるのがポイントです。また、手書きメモ以外の基本的なメモ帳機能は備えており、マークダウンのような書き心地で見出しやリストの記述が行えるのはもちろん、画像やファイルのアップロード、URLのリンクから見出しやウェブの埋め込みも簡単に行うことが出来る点、またショートカットキーが豊富に用意されており、必要な記事の検索を一発で行える機能性の高さも、数ある他のメモ帳サービスと比べて劣らないポイントです。

自分の用途としては主に自身の考えを整理したり、自主制作や仕事のアイデアや「あれ学びたい、これに関する本を読みたい」と思ったこと、直近で悩んでいること、TwitterやDiscordで流れてきた有用情報、最近読んだ本に関する感想、果てはキャリアプラン設計のための自己分析など、様々な事柄をとりあえず書き留め、確保し、思考を整理する用途に活用しています。特にエンジニアやUIUXデザイナーのように、技術分野のニュースや日々使うツールのTipsが頻繁に目に入ってきたり、日々の業務で直面する問題の解決方法やら自己のスキル不足やらに悩む事があったりなど、 日常的に様々な情報が頭に入ってくるが、今すぐにそれについて考えている時間がない、けどいずれ考える必要がある という状況が多発する人にとって、 必要なタイミングですぐに必要な情報を思い出す ための一時的(そして、かつ長期的)な外部記憶装置的な役割として、また、それらの情報を元に自分の頭の中を整理するための吐き出し先として、非常に有用なツールであると感じています。

Notionの魅力

僕が特に魅力を感じているのは、自分が思いついたアイデアや気付きだけでなく、ネット上で見かけた有益情報などの 異なる流入源や性質の情報も同一的に扱い、それらをNotion一つですべて管理・保存・関連付け・一覧表示し、取り出せるような仕組み (テーブル機能)が備わっていることで、これがまさしく最初に僕が「単なるメモ帳サービスではない」と言った所以です。「テーブル機能を制する者はNotionを制する」、どこかの紹介サイトですでに語られていた気もしますが、僕の言葉でも改めてそう言えると思います。

前述の通りテーブル機能は、ネットの記事やTwitterで流れてきたTips、自分が思いついたアイデアや、旅先で気に入ったウィスキーやコーヒーの銘柄のように、様々な分野や性質の情報を、適切な方法で管理・関連付け・一覧し、適切なタイミングですぐに取り出すことが出来ます。例えば僕の場合、日常的に触れる情報の種類に「Unityの特定の機能に関するTips」や「新しいC#に関するニュース」「ソフトウェアの設計に関する知見」と言った、日々の業務でよく関わる技術に関連する内容から、「フラグメントシェーダでお絵描きをする際に必要なスニペット」や「Unityのレンダリング関連技術」のように月に数回触れるか触れない程度のもの、「最近のWeb技術情勢」や「iOSAndroidアプリ開発を始めるのに必要な知識や概念」のように趣味範囲で年に数回触るのもの、はたまた本職ではないけど自分の中で大きな興味範囲を占めるデジタルアートやグラフィックデザインの分野に関する、「DCCツールのTipsや知見」、「スクリプトプラグイン」、「素材集に関する有益情報」や、「自分がハマったトラブルシューティングの記録」など、様々な類いがあります。これらの情報は性質が異なり、それに伴い適切な一覧方式も異なります。例えば技術的な情報は基本的に「文章」であることが多く、「何に関する情報か(技術分野のより詳細な分類や関連のあるジャンル)」と「情報のタイトル」さえ見えれば問題ありません。一方で、アートやグラフィックデザインで特に気に入った作品や、気に入った作品の制作者リストは、「関連する作品のサムネイル」のようにグラフィカルに一覧する方が利便性が高い(後から情報を引き出す際の効率が良い)です。また、「あれ学びたい、これに関する本読みたい」のように、日々生じる知的欲求も、「一つの情報」としてテーブルに格納し、TODOリストとして管理することで、欲求の赴くまま学ぶのでなく、より戦略的に効率良く消化することが出来るでしょう。テーブル機能は、一つの機能でありながら、このような幅広いニーズに柔軟に対応し、情報を整理できるように作られています。様々な情報を、一つのツールで、同じ使い心地で、それぞれに適した方法で整理することができるのは、想像以上に効率が良く、魅力に満ち溢れているものでした。

f:id:shutosg:20201005031108p:plain
技術系全般に関連するメモとブックマークをリスト化

f:id:shutosg:20201005031302p:plain
作品を鑑賞して感じたことを書き溜めていく用途にも使える

少し話は逸れますが、僕は興味がある分野(そして、習得したい、自分の手で自分の満足の行くクオリティのアウトプットが出せるようにしたい、と思う分野)が広すぎるゆえ、様々なことに手を出すのですが、時間は有限でありすべての分野に精通することは困難であることは理解できています。しかし程度次第では自己満足の範囲でもあるため、「人生の隙間時間にでも少しずつ現実的な時間をかければ自分の満足のいくレベルのスキルは獲得できるのではないか」と思っています。物事やスキルを習得するための方法は何通りもあって、学校に通うでも入門書を読むでも何でも良いのですが、結局は「自分の知らない事柄をどこからかインプットしてきて、そのインプットを意識しながら、繰り返しアウトプットする」必要があると考えています。つまり、この「インプット」にあたる行為は「アウトプット」に先立って行う必要があり、質の良いインプットは良いアウトプットを行う(つまり、安定して良いアウトプットが行える状態=スキルを習得したという状態になる)ための必要条件となっていると考えています。もちろん、良いインプットを行ったからと言って、必ずしも良いアウトプットを行えるとは限りませんが、少なくとも良いインプットを行わない限り良いアウトプットは行えないということです。このように、インプットの質は非常に重要で、このインプットの質を高めるために、体系的に学べる(つまり、予め学習効率が良くなるような順序だてがなされた教育を提供する)教育機関があったり、書籍があったりするわけですが、時間効率の観点において極論を言えば、学校や書籍を買わなくとも、インターネットや日々の業務、日常生活から生まれるアイデアなど、様々な情報源から得られる質の良い情報を自分の学習プロセスにおける適切なタイミングでインプットする事によって、ある程度効果的に学習をすることができると考えています(もちろん、インプットだけでなく多くのアウトプットをすることも必要であることは言うまでもありませんが)。また、興味がある分野であるからと言って、金銭的にも時間的にも限界はあるため、軽率に教育機関に通うことができるわけではありません。そのような状況下において多くのことを学び習得するためには、まさしくNotionのような「有益情報管理ツール」は必須なのです。このようにして、学習の効率を高め、様々な分野を学び、自分の新たな視点や視座を獲得すると、また新たなアイデアや知的欲求が湧いてきます。それらを更に効率よく消化する手段としても、やはりNotionは最適なのです。

話を戻して、このように僕にとっては主に学習の効率化手段という意味合いも強いのですが、学習に限った話ではなく、様々な種類や性質の情報を整理し活用し、新たなアイデアを生み出すような、いわゆる知的生産活動を行っている人に対しては、やはり同様の理由でアウトプットの質を高めるために、一概におすすめできると考えています。もちろん、すべての状況下においてNotionが最適なツールであるとは限りませんが、日々様々な分野を横断したり、様々な状況に局面し、思考を巡らせながら生きていく人にとって、長期的に付き合っていくツールとしてはほぼ最適解だと考えています。

余談ですが、日々の業務で生じて自分にのしかかる不条理な事に対する愚痴も、Notionにアウトプットして言語化し、冷静に分析することで、実は不条理でもなんでも無くて単に自分のミスに原因があっただとか、単なるコミュニケーション不足だったとか、よくあることで、それを元に次からはどんなやり取りをすれば良さそうかとか、どうすればコミュニケーションが上手く取れるようになりそうだとか、そのアイデアを得るためにどんな本を読めば良さそうだとか、人生のPDCAを回していくのにも有用だったりします。僕個人的に、「生きていれば経験がすべて資産になる可能性がある」と考えていて、その経験を資産に変換するためにも、思考は大切で、そのためにはNotionが有力なツールなのです。

Notion以外の話

ここまで僕にとってのNotionの魅力を、僕の生き方の観点からポエム的に書き連ねてきたのですが、もちろん盲目的にNotionを崇拝しているわけではありません。

短期的な用途だったり、情報の整理を重要視しない思考プロセスでの用途としては、特定の分野に特化した他のツールに軍配が上がることもあるでしょう。たとえば、新しい製品や作品の方向性を決めるブレーンストーミングのように、ホワイトボードにグラフィカルにバンバン写真をピン留めしていくような用途では、 Milanote が今の所最適と考えています。一般的なメモ帳のように、ただ下方向に進んでいく段落や見出しのような概念よりも、グリッドの概念すら無視して自由に情報を配置できる事を重視したツールは数少ないでしょう。また、グラフィカルなリファレンスを収集する用途に特化した Eagle というツールも最近気になっています(どうやら、音声のリファレンス収集にも使えるらしいですが、詳しくはまだ調べていません)。「Notion以外のどのツールを使うのが最適なのか」という思考の整理の過程ですらも活用できてしまうNotion、恐るべし。

まとめ

長くなってしまいましたが、要はNotionは 日常的な知的生産活動における、思考のための様々な情報収集及び整理と、自身の思考の整理に最適なツールである という確信を自分の言葉で文字に落とし込んで伝えたかったので、概ねこの記事の目的は果たせたように思えます

そして、インターネットで公開されているこの記事を読んでいるあなたを含め、インターネットを活用して得られた何らかの情報を、自分の活動に活かしている人は、日常的にこの知的生産活動を行っているはずですから、やはりNotionを活用することでさらなる恩恵を得られるでしょう。(この記事の下書きや、下書きのためのNotionに対する気持ちの言語化、記事を書く目的の整理なども、Notionで書いていました)

MacBook Proを買ったらまず初めにやったことリスト

完全に個人的メモという感じですが、Macを買って初期設定したことを箇条書き。Macユーザであれば、以前のマシンからTimeMachineとか使うことでこのあたりの設定も引き継ぎできるみたいですが、なんとなくいつも設定・導入し直してしまう。

システム環境設定

トラックパッド周りは基本的にはお好みで良いと思うが、設定しないとそもそもオフになっている機能もあるので。 また、少しでも画面の作業領域を広くしたいのでDockはなるべく非表示になるようにしている。

  • Dock
    • 「サイズ」小さく
    • 「拡大エフェクト」適当に設定
    • 「自動的に表示/非表示」チェック
    • 「最近使ったアプリケーションをDockに表示」チェック外す
  • トラックパッド
    • 「フルスクリーン間アプリケーションの移動」4本指
    • 「アプリケーションをExpose」4本指
  • アクセシビリティ
    • ズーム機能→「スクロースジェスチャと修飾キーを使ってズーム」にチェック→Ctrl
      • Ctrl + 上下スクロール で画面ズームできるようになる
    • マウスとトラックパッドトラックパッドオプション→ドラッグを有効にする→3本指
      • これデフォルトでオフなのが意味不明なくらい便利
  • Mission Control
    • 「最新の使用状況に基づいて操作スペースを〜」チェック外す
      • 複数デスクトップの順番が勝手に入れ替わらないようにしてくれる

※英字キーボードを使っている場合

  • キーボード
    • 修飾キー→caps lockをCtrlに割り当て
      • caps lockは全く使っていない
続きを読む

レイトレ合宿6 参加レポート

レイトレ合宿6に参加してきました。

レイトレ合宿とは、自作のレンダラを持ち寄って画像の美しさを競うイベントで、自分は今回が初参加でした。

C++でパストレレンダラを書いて、こんな感じの画像を出力しました。 f:id:shutosg:20180904010902p:plain ※サンプル数を多めに取ってるので、実際の競技結果よりも少し綺麗です

結果は 19人中14位 と、C++自体もほぼ未経験だったためビリも覚悟していたのですが、そこそこ奮闘できたようです。

↑後日、順位に誤りがあって14位タイになりました

どうやら10位以内だと入賞扱いになるようなので、来年は入賞目指して頑張っていきたいと思います。

また、合宿には Arnold RendererRadeon ProRenderグランツーリスモの内製レンダラなどといった本職でもレンダラを開発されている方々や、CG技術書を執筆されている方、CGを専攻している学生さんなど、非常にレベルの高い方が多く参加されており、大変刺激的な時間を過ごすことができました。

今年は会話についていくのが精一杯だったので、来年はディスカッションできるように知識を増やしておこうと思います。

続きを読む

Octane Material基礎

Octaneのマニュアル を読んで理解した事をまとめた。
ここではOctane専用マテリアルについて噛み砕いて説明します。Octaneレンダラの基本的な操作等については説明しません。
はじめての人はとりあえず全容をざっくり掴んだほうが良いので、公式の ビデオチュートリアル を見ましょう。

Octane Rendererとりあえずこれ知っとけリスト

Octane Rendererでレンダリングしようとすると、使えなくなるC4D標準機能がいくつかある。
例えば標準カメラの被写界深度の設定やオブジェクトの可視・不可視の設定(Compositingタグ)、Skyオブジェクトなど。それらと同等の機能はたいていOctane専用のタグを使用することで使えることが多かったりするが、最初のうちは「そんなん知るか」って感じだし、学習効率の障壁にもなる。
そのため、以下の項目については最低限その存在と機能を知っておきたい。

続きを読む

エクスプレッション中の文字列を置換するExtededScript書いた

AfterEffectsでエクスプレッション中の記述を置換するExtendedScriptを書いたので備忘録的に残しておきたいと思います。 実行前の前提として、置換したいエクスプレッションのプロパティを複数選択した状態であることとします。 冒頭は forEach() を使えるようにするためのおまじない。

// ExtendedScriptでforEach()を使えるようにする
// Production steps of ECMA-262, Edition 5, 15.4.4.18
// Reference: http://es5.github.com/#x15.4.4.18
if ( !Array.prototype.forEach ) {
    Array.prototype.forEach = function( callback, thisArg ) {
  
      var T, k;
  
      if ( this == null ) {
        throw new TypeError( " this is null or not defined" );
      }
  
      // 1. Let O be the result of calling ToObject passing the |this| value as the argument.
      var O = Object(this);
  
      // 2. Let lenValue be the result of calling the Get internal method of O with the argument "length".
      // 3. Let len be ToUint32(lenValue).
      var len = O.length >>> 0; // Hack to convert O.length to a UInt32
  
      // 4. If IsCallable(callback) is false, throw a TypeError exception.
      // See: http://es5.github.com/#x9.11
      if ( {}.toString.call(callback) != "[object Function]" ) {
        throw new TypeError( callback + " is not a function" );
      }
  
      // 5. If thisArg was supplied, let T be thisArg; else let T be undefined.
      if ( thisArg ) {
        T = thisArg;
      }
  
      // 6. Let k be 0
      k = 0;
  
      // 7. Repeat, while k < len
      while( k < len ) {
  
        var kValue;
  
        // a. Let Pk be ToString(k).
        //   This is implicit for LHS operands of the in operator
        // b. Let kPresent be the result of calling the HasProperty internal method of O with argument Pk.
        //   This step can be combined with c
        // c. If kPresent is true, then
  
        if ( k in O ) {
  
          // i. Let kValue be the result of calling the Get internal method of O with argument Pk.
          kValue = O[ k ];
  
          // ii. Call the Call internal method of callback with T as the this value and
          // argument list containing kValue, k, and O.
          callback.call( T, kValue, k, O );
        }
        // d. Increase k by 1.
        k++;
      }
      // 8. return undefined
    };
  }
  
  // =================== ここからメイン ====================== //
  function main() {
      // 選択中のレイヤーを取得
      var layers = app.project.activeItem.selectedLayers;
      layers.forEach(function(l){
          // 選択中のプロパティを取得
          var properties = l.selectedProperties;
          properties.forEach(function(p){
              // 選択中のプロパティがエクスプレッションを記述できないタイプならスキップ
              if (p.canSetExpression != true) continue;
              $.writeln("置換前: " + p.expression);
              // ================== 使用時にここを変える ===================== //
              // TODO: Window()とかstatictext使ってGUIから入力できるようにする
              // 置換後文字列
              var s = p.expression.replace (/" "/g, '"Particular"');
              // ============================================================= //
              // 置換後の文字列をエクスプレッションに適用
              p.expression = s;
              $.writeln("置換後" + s);
              $.writeln("");
          });
      });
  }
  
  main();

C4D 新バージョンへの環境移行メモ

はじめに

このエントリーはCinema 4Dの新しいバージョンを導入する際、自分がやったことのメモです。
次のことをやりました。

  • ユーザレイアウトの引き継ぎ
  • 初期レイアウトの引き継ぎ
  • 手動インストールしたプラグインの引き継ぎ
  • カスタムコマンドの引き継ぎ
  • コンテンツブラウザ関係のファイルのHDDへの移動

一般設定フォルダの確認

まず、ユーザーごとに異なる「一般設定フォルダ」の場所と名前を確認しておきます。

ユーザレイアウトの引き継ぎ

C:\User\ユーザ名\AppData\Roaming\MAXON\CINEMA 4D R** Studio_XXXXXXXX\library\layoutにある.l4dファイルと.prfファイルを新バージョンの同じ場所へ移動

初期レイアウトの引き継ぎ

C:\User\ユーザ名\AppData\Roaming\MAXON\CINEMA 4D R** Studio_XXXXXXXX\prefs\template.l4dを新バージョンの同じ場所へ移動

手動インストールしたプラグインの引き継ぎ

C:\Program Files\MAXON\CINEMA 4D R** Studio\pluginsにあるcinema4dsdk以外を新バージョンの同じ場所へ移動

カスタムコマンドの引き継ぎ

ここで言うカスタムコマンドとは、自分好みにカスタマイズしたショートカットキーのことです。例えばデフォルトではRedoは「Ctrl+Y」になっていますが、僕はこれを「Ctrl+Shift+Z」にしています。
C:\User\ユーザ名\AppData\Roaming\MAXON\CINEMA 4D R** Studio_XXXXXXXX\prefs\shortcuttable.resを新バージョンの同じ場所へ移動
また、同フォルダにあるCINEMA 4D.prfは環境設定(メモリやGPUの設定など、一般的なC4Dの設定)ファイル、c4d_language.prfは言語設定のファイルだった。
UIカラーの引き継ぎには自分の場合dark.colファイルの移動も必要だった。
他の.prfファイルは何の設定のものなのか分からないものも多く、不便を感じるまで移動は様子を見ることにした。

コンテンツブラウザ関係のファイルのHDDへの移動

StudioやBroadbandなどについてくるプリセットなどのデータが重いのでHDDに移した上でシンボリックリンクを飛ばした。
ただ注意があって、プリセットファイル(.lib4d)の入っている「browser」というフォルダをHDDに移動し、そのbrowserフォルダに対してシンボリックリンクを飛ばしたところC4D側で認識されなかったため、フォルダ内部の.lib4dファイルに対してそれぞれ個別にシンボリックリンクを飛ばしてやる必要があった。
具体的な手順としては

  1. C4Dアップデータでコンテンツをダウンロードする
  2. ダウンロードしたコンテンツのフォルダ(C:\Program Files\MAXON\CINEMA 4D R** Studio\library\browser)をHDDの任意の場所へ移す
  3. .lib4dファイルがあった場所(C:\Program Files\MAXON\CINEMA 4D R** Studio\library\browser\)に移したファイルへのシンボリックリンクを作成する

シンボリックリンク作成はコマンドプロンプトを管理者権限で実行して各.lib4dファイルに対して
mklink /D "C:\Program Files\MAXON\CINEMA 4D R** Studio\library\browser\*********.lib4d" E:\C4D\symboliclink\R18\browser\*********.lib4d
した。

他には

日本語ドキュメント、インストーラを用いたプラグインのインストールなどは正規の手法(C4Dアップデータ経由、専用インストーラ使用)で再度導入した。

難読化された .jsxbin ファイルを読んでみる

はじめに

この記事はAfterEffects Advent Calendar 2016の11日目の記事です。

本エントリーでは、ExtendScriptの難読化ファイルである .jsxbin ファイルの解析方法及びその結果を扱った英語の記事を解説しつつ翻訳・紹介していきたいと思います。(99%元記事の二番煎じですが、自分もハンズオン的な感じで手を動かして試してみました)

想定している読者層は、プログラムを書ける人です。特定のフレームワークや特定の言語、に精通している必要はありませんが、AE上で何かしら自分で関数を作り、自動化処理などさせたことがある(ExtendScriptを少し書いたことがある)くらいだとより理解しやすいかもしれません。ただし、途中から思考実験のような内容になっていきます。プログラミング力というよりも、推測力が求められるかもしれません。。。 (結局11時間くらいぶっ続けで書いたのでくだらない誤字・誤りなどあるかと思います。意味わからないところなどあればTwitterかコメントなどでお知らせ・ご質問ください。)

元記事の紹介

まずはじめに元記事のリンクを紹介します。

Reversing JSXBIN File Type

元記事は、ExtendScriptの難読化された .jsxbin ファイルの解析方法と、その結果を紹介しています。
通常、AEのスクリプト.jsx という拡張子で記述し、保存します。普通に自分で書いて使ったり、そのまま人に配って共有する場合は全く問題ないのですが、極秘の技術やアルゴリズムを用いて作成したスクリプトを配る場合や、商品として販売する場合はこれだとソースコードが丸見えで困ります。(同じ方法を真似されてしまったり、改変してあたかも自分で書いたかのように販売されてしまうかもしれません。)
その為、Adobe公式のエディターであるExtendScript Toolkitには人間には読めないけど実行は可能な形式( .jsxbin )に変換する機能が備わっています。元記事では、その「 .jsxbin ファイルを無理矢理読解してやろう」という記事です。
結果としては、完全には復元は出来ないのですが、一部が復元出来てしまいます。本エントリーでは、その内容を日本語で紹介してみたいと思います。当然のことながら、実際に販売・配布されているjsxbinファイルを解析し、その内容を公表したりしてはいけません。飽くまで自分で作成したスクリプトにだけ使うようにしてください。
それでは、元記事の流れを踏襲しつつ、日本語で紹介していきたいと思います。(jsxbinだったりJSXBINだったり表記が揺れることがありますが、主に僕の言葉で書いているのはjsxbinという小文字表記です。JSXBINという大文字表記は元記事に合わせた書き方で、元記事を翻訳した箇所などで使っています。)

続きを読む