shuto_log.aep

ブログ名変わりました。自分がやったことなどを備忘録的な感じで残していこうと思います。

エクスプレッション中の文字列を置換する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という大文字表記は元記事に合わせた書き方で、元記事を翻訳した箇所などで使っています。)

続きを読む

Tensorflow Playgroundを翻訳してみた

はじめに

本記事はNCC Advent Calendar 2016の7日目の記事で、Tensorflow Playgroundの日本語訳と補足になります。 playground.tensorflow.org

↑Tensorflow Playgroundはニューラルネットの学習の様子を可視化して見れるサイトで、初学者の理解の助けになります。

ちなみに、TensorflowとはGoogleが開発したオープンソース機械学習ライブラリです。C、C++Pythonなどで書けるそうです。

www.wikiwand.com

注意事項

私は機械学習を専攻しているわけではなく、研究で扱う必要があって勉強している一学生です。 最後に「個人的メモ」として自分の解釈(補足)を載せています。翻訳に関しては大きな問題はないかと思いますが、もし誤りなどあればコメントなどでご指摘お願いします。

また、機械学習?なにそれ美味しいの?と言う人は以前学内の勉強会で作成したこちらのスライドを読むと雰囲気が伝わるかもしれません。

www.slideshare.net

続きを読む

「CO5M1C R4ILR0AD」BGAメイキングブログ

はじめに

本エントリーは、下記映像作品のメイキングブログとなります。制作過程や工夫したこと、こだわりなどを記していきます。ソフトの使い方や細かい設定項目などについては割愛しています。
CGについて専門外の人にもなるべく分かりやすいように書くつもりなので、くどい表現があるかもしれません。また、飽くまで趣味範囲で個人的な内容なため、本エントリーの内容がベストとは限りませんし、考え方が一般的には不適切な可能性もありますことをご承知おきください。

CO5M1C R4ILR0AD HD

ニコニコ動画: 【BOFU2016】 CO5M1C R4ILR0AD / kanone 【BGA】 by Shuto 音楽/動画 - ニコニコ動画

Vimeo: 【BOFU2016】 CO5M1C R4ILR0AD / kanone 【BGA】 on Vimeo

BOFU2016作品ページ: 【BOFU2016 - Legendary Again - 詳細情報】 No.220 "CO5M1C R4ILR0AD / kanone " - TEAM : Futurist Voices

続きを読む

AWSにubuntu 14.04インストールして初期設定したメモ。

はじめに

この記事は、AWSを登録した直後の状態から、ubuntuのEC2インスタンスを作成し、自分のMacからsshの公開鍵でログインできる状態にした際のメモ。
あとubuntuの初期設定もした。色々と初めてなので、誤りなどの指摘ヶ所あればぜひコメントお願いします。

続きを読む

(主にC++の)ポインタ入門

C++でポインタを扱う際の超初歩的な話。
先日学んだノートとして。

ポインタとは

  • ざっくり言うとメモリを直接指し示すもの。
  • 一般に「ポインタ」とは下記の概念の総称である。
    • 「ポインタ型」:ポインタを扱うための型。
    • 「ポインタ変数」:ポインタ型の変数のこと。
    • 「ポインタ値」:変数の物理メモリ上のアドレス。
続きを読む