Blog

  • VSCodeでThree.jsの開発環境を整える(1)

    しばらく利用していなかったVisual Studio Codeをバージョンアップしてみたらすごく速く使いやすくなっていたので、すこし本格的に環境を構築して使ってみることにしました。VSCodeおよびnodeなどもこれまでごく基本的な利用しかしていないので、それらの知識のアップデートも兼ねます。

    とりあえず、JavaScript(Three.js)の開発環境を構築することを目的にします。

    • VSCodeのIntelliSenseを利用したコード補完ができること
    • ChromeまたはFireFoxでブレークポイントを利用したデバッグが可能なこと
    • デバッグはdockerのコンテナ環境で構築すること

    上記3点ができるようになることを目的として、
    まずは任意の.jsプロジェクトでthree.jsのコード補完が可能になることを目指します。

    新規プロジェクトフォルダを作成する

    任意のフォルダ名でプロジェクトフォルダを作成して、その中にcdします。

    $ mkdir myproject
    $ cd myproject
    

    npm環境を作成する

    まず、nodeのパッケージマネージャであるnpmが利用するpackage.jsonというファイルを作成します。これは以下のコマンドを利用するとjsonファイルが作成されます。自力で作っても別にいいと思う。

    $ npm init
    

    実行すると幾つか質問されるので答えていくが、とりあえずは適当(空欄)でもいいはず。

    Three.jsをnpmでインストールする 

    npmレポジトリにthreeというパッケージが存在するので、これをnpmコマンドでインストールします。注意点として、VSCodeのIntelliSenseがJavaScriptの補完をするためにはTypeScriptの型定義ファイル(?)を利用し、これはnpmで管理されているようなメジャーなものならばレポジトリで公開されているもののようなのだが、これをVSCodeが利用できるようにするためにはpackage.jsonのdependenciesリストに対象のモジュールがリストされている必要がある(VSCodeは、ここにリストされているモジュール名をヒントにAutomatic Type Acquisitionという機能を使って型定義ファイルを自動で探しにいく。もしくはjsconfig.jsonというファイルに明示的に宣言することも可能だが、今回は省略する)
    すなわち、以下のコマンドを経由してthreeモジュールをインストールする。

    $ npm install three --save
    

    –saveオプションを忘れるとpackage.jsonが更新されないので注意する。–saveオプションは指定したモジュールをインストールすると共に、package.jsonのdependenciesリストに追加する。

     動作確認

    以上でIntelliSenseは有効な状態となります。自分のモジュールの場合はどうするのかとかは今後調べる必要があるが、たぶんTypeScriptとかで書けということなんだと思う。

    main.jsとかの適当なファイルを作成して、

    var THREE = require('three');
    THREE.
    

    ここまでタイプしてCtl+Spaceとかすると、THREEの中にあるモジュールが補完対象としてリストされるようになっているはず。もしくは、.をタイプした時点で出てくるはず。これで暗記しなくてよろしい。

  • MacBook Pro 2016用のマルチポートアダプタをkickstarterで支援しました。

    MacBook Pro 2016モデルの周辺機器問題を解消するためのアダプタを探していたんですが、なかなか「これ!」というものが見つかりませんでしたが、kickstarteで見つけて、即支援しました。

    良いところ: 

    ・thunderbolt3ポートを利用するので、高速
     前のポストでも書いたようなものはほとんどがUSB3.1の接続(たぶん)で、5Gbpsの帯域をハブで分け合っている状態で、パフォーマンスに不安がある。買ったのはMBP2016のファンクションキーモデルでThunderbolt3ポートは2つしかないので、有効に使いたい。
    ・2つのThunderbolt3ポートを塞ぐが、一つはThunderbolt3がそのまま通っているみたいなので安心。もう一つはUSB-Cの口だけど、USB3.1仕様みたいで、ディスプレイ出力もなし。このへんがUSB-Cのややこしいところ。

     不満なところ: 

    ・Ethernetアダプタは欲しかった。けど、comment欄でEthernetポートは厚すぎるというのを見てある程度納得して、別途買うことにしました。

    アダプタが届くまでの当座のしのぎ兼Ethernetアダプタとして、ANKERの下記の製品を書いました。と、いうか外部ディスプレイ出力がなければ正味これで十分かもしれない。

  • dockerのmysqldコンテナにdumpデータをロードする

    ローカルにmysqlのダンプファイルがあるとして、
    すでにmysqldが起動しているdockerコンテナが存在するとする。
    このとき、以下のようにすればローカルのdumpファイルのロードが可能。
    $ docker exec -i mysqld_container_name mysql -uroot -proot < dump.sql
    
  • docker-composeで既存のnetworkに接続する

    docker-composeを利用してコンテナを起動した場合、通常だとdocker-compose.yml(プロジェクト)単位で
    内部ネットワークが作成される。これを、例えば別のdocker-compose.ymlファイルから起動されたコンテナのnetworkの中でコンテナを作成するには、network設定をdocker-compose.yml内に記述する

    既存のネットワークの一覧

    $ docker network ls
    

    コマンドを実行すると、以下のようにネットワークの一覧が表示される。例ではexisting_nw_defaultに接続するとする。

    $ docker network ls
    NETWORK ID          NAME                DRIVER
    a36b706eb5a6        bridge              bridge              
    7ee0cd187fbd        host                host                
    39be267aeb70        existing_nw_default      bridge              
    bb39f75ad969        none                null
    

    既存のネットワークに接続するdocker-compose.ymlの例

    デフォルトでexisting_nw_default内にコンテナを作成するには、docker-compose.yml内に以下のようなnetworkの記述を追加すれば良い。

    networks:
      default:
        external:
          name: existing_nw_default
    

     参照:https://docs.docker.com/compose/networking/

  • Bloggerでシンタックスハイライトを利用する

    code-prettifyを利用する方法。
    https://github.com/google/code-prettify

    (1)ブログ管理画面の”Template”から、テンプレートのHTMLを編集する。
    haedタグの中に以下を記述する。

    <script src='https://cdn.rawgit.com/google/code-prettify/master/loader/run_prettify.js?skin=sunburst'/>
    

    (2)シンタックスハイライトを利用したい部分を、以下のタグで囲う。

    <pre class="prettyprint">
    (任意のコード)
    </pre>
    

    classに、追加で”lang-*”を指定すると対象言語を明示的に指定できる。lang-*の”*”の部分にはデフォルトで以下が利用できる

        "bsh", "c", "cc", "cpp", "cs", "csh", "cyc", "cv", "htm", "html",
        "java", "js", "m", "mxml", "perl", "pl", "pm", "py", "rb", "sh",
        "xhtml", "xml", "xsl".
    

    ヘッダ行のrun_prettify.jsを呼び出すパラメタにskinを指定すると、シンタックスハイライトのスタイルを切り替えられる。上記の例ではsunburstというスタイルを利用している。
    デフォルトで利用可能なスタイルの一覧は以下。
    https://rawgit.com/google/code-prettify/master/styles/index.html

    その他にも呼び出し時のパラメタで挙動を変更することができ、詳しい設定は以下を参照。
    https://github.com/google/code-prettify/blob/master/docs/getting_started.md

  • Raspbianでpyenv環境を構築する

    Raspbian環境をアップグレードしたついでにpyenv/pyenv-virtualenv環境を構築しようとおもいました。その際、pyenvを使ったpythonバージョンのインストールでエラーが出たので、その構築メモです。

    0.環境

    記事執筆した時点で、 $ sudo aptitude safe-upgrade した状態です。
    日本語環境を入れたりはしてるので、かならずしもデフォではないです。

    $ uname -a
    Linux raspberrypi 4.4.34+ #930 Wed Nov 23 15:12:30 GMT 2016 armv6l GNU/Linux
    


    1.エラー

    以下のようにreadlineとかbzip2とかいかにも必要そうなものがないとか怒られます。

    $ pyenv install 2.7.12
    Downloading Python-2.7.12.tar.xz...
    -> https://www.python.org/ftp/python/2.7.12/Python-2.7.12.tar.xz
    Installing Python-2.7.12...
    
    WARNING: The Python readline extension was not compiled. Missing the GNU readline lib?
    WARNING: The Python bz2 extension was not compiled. Missing the bzip2 lib?
    WARNING: The Python sqlite3 extension was not compiled. Missing the SQLite3 lib?
    ERROR: The Python ssl extension was not compiled. Missing the OpenSSL lib?
    
    Please consult to the Wiki page to fix the problem.
    https://github.com/yyuu/pyenv/wiki/Common-build-problems
    
    
    BUILD FAILED (Raspbian 8.0 using python-build 1.0.4-13-g1000c2f)
    

    2.必要なパッケージ(インストール済のものを除いた)

    下記の参照先のリンクに情報があったので、それを参考にインストール済のものは除きました。
    RapPiは非力なので、余計なインストールプロセスは省きたかった。

    $ sudo aptitude -y install libssl-dev libbz2-dev libreadline-dev libsqlite3-dev llvm libncurses5-dev libncursesw5-dev
    

    3.参照

    https://github.com/yyuu/pyenv/wiki/Common-build-problems

    あるていど予想できた結果ですが、pyenv installするとたぶんzipとかがものすごいボトルネックで時間がかかるので、実用に耐えるのかは不明です。

  • Raspbian with PIXEL閑環境で日本語環境の構築

     Raspberry Piの情報を細かく追っているわけではないので、知らない間にバージョンアップしてPIXELというデスクトップ環境になっていました。正確には、深く考えずにsudo aptitude sage-upgradeして再起動したらいきなり変わっていてびびった。
    ながらく初期インストールだけして放置していたRaspberry Pi初代(+ですらない!)を日本語かするときにPIXEL 以前の情報が多かったので、PIXEL環境で日本語入力ができるようになるまでのメモです。結論からいうと、すごく簡単になっているみたいです。
    1. 日本語フォントのインストール
      PIXELな環境からは初期で表示できるのかも?という情報もみたのですが、それをみたのがフォントをインストールした後でした…。まあ、減るもんでなしという感じでインストールしました。タカオフォントというのはIPAフォントの派生みたいです。

      $ sudo aptitude install fonts-takao 

    2. fcitx-mozc(インプットメソッド)のインストール
      界隈のブログ記事ではibus-anthyとかibus-mozcを入れてるケースが多かったけど、しらべるとibusは最近はあまりイケてなくてfcitxという系列が良いみたいなので、そちらを採用してみることにしました。なお、ibusとかfcitxというのがベースになるインプットメソッドで、変換エンジン(?)自体がAnthyとかmozcとか、という構成になるようです。なので選択肢としては、インプットメソッドとしてfcitxかibus、それぞれでの変換エンジンとしてanthyかmozcか、という考え方になるようです。このへんは正直よくわからん。

      $ sudo aptitude install fcitx-mozc
      上記で、メインメニューの「設定」のところに「fcitx設定」とか「mozc設定」とかの項目が追加されるので、そこで諸々を設定します。(ターミナル上でim-configを実行する必要があるかもしれない)

    3. 日本語ターミナル(不要っぽい)
      上記同様にjfbtermというのを入れないとターミナルで日本語が出ないよ、という記事が多いのですが、PIXEL環境では不要でした。標準のターミナルはLXTerminal 0.2.0というやつでした。 

    あとはPIXEL以前の環境と同様、ロケールやタイムゾーンの設定、あとはフォントを上述のTAKAOフォントに変えてあげたりすればOKです。

  • Android Things on Raspberry pi3でディスプレイを反転させる

    Android ThingsのRaspberry pi用OSイメージで
    RasPi3を起動した際、Raspbianのときと同じように、
    純正の7inch touchscreenの構成では画面を反転させないとUSBコネクタが
    邪魔になってしまうという状況が発生しました。

    Raspbianの場合なら、/boot/config.txtの中にlcd_rotate=2という記述を追記して際kどうすれば解消するのですが、それのAndroid Thingsでのやり方。stackoverflowに聞いたらすぐに回答してくれる人が現れました。すごい。ありがとう。

    例えば、sdカードのデバイスが/dev/sdbだとした場合、ブートパーティションは/dev/sdb1になるようです。なので、母艦となるpcなりでこのパーティションを
    マウントしてあげると、その中にconfig.txtというファイルがあるので、
    この中にlcd_rotate=2という設定を追加してあげて再起動すればよろしい。

    $ sudo mount /dev/sdb1 /mnt/disk
    $ echo ‘lcd_rotate=2’ >> /mnt/disk/config.txt

    私はmacを使っていてext4のファイルシステムをマウントするのにFUSE for macなどの
    セットアップが必要そうだったんだけど、これが時間かかるのでたまたまvirtualboxに
    設定してあったboot2dockerのOSイメージを起動して、これでマウントしてやっつけました。

    教えてくれた人によるとこれはhackみたいなもんでオフィシャルな設定とか機能ではないから、アップデートのたびにやらないといけないよ、だから機能リクエストしたほうが良いよ、とのこと。とはいえ、いったんのworkaroundとしては十分です。

    http://stackoverflow.com/questions/41165198/android-things-with-rasp3-7-inch-touchscreen/

    [12/16追記]
    その後

    ということだったので試したら、以下のようにしてmacで直接マウントできました。

    $ sudo mount -t msdos /dev/disk1s1 /mnt/sd 

  • pyenvとpyenv-virtualenvで任意のpython環境に切り替える(homebrew使用)

    pyenvを使って任意のPythonバージョンを利用できるようにする。
    さらに、pyenv-virtualenv(pyenvのプラグインということらしい)で、同一のPythonバージョン化でも任意のpython実行環境が管理できるようにする。これはpipとかでライブラリをインストールする場合に便利だろう。

    homebrewを使ってインストールすることにする。

    1. pyenvのインストール
      $ brew install pyenv
    2. pyenv-virtualenvのインストール
      $ brew install pyenv-virtualenv
    インストール自体は上記で終了。続いてPATH環境変数などを書き換える必要があるが、これは初期設定のスクリプトファイル(zshなら.zshrc)に以下の行を追記すれば良い

    if which pyenv > /dev/null; then eval “$(pyenv init -)”; fi
    if which pyenv-virtualenv > /dev/null; then eval “$(pyenv virtualenv-init -)”; fi

    これでPATHなどの環境変数を書き換えて、実際にpythonコマンドなどでpyenvの設定が有効に動作するようになる。

    具体的にはシステム全体、特定のディレクトリ配下、現在のシェル内のいずれかで任意のpython環境が利用できることになるので、pythonで複数のプロジェクトを管理するような場合には、必要な最小限だけのライブラリ環境が構築できてとても便利です。

  • USBのHDMIアダプタについての記事

    USB接続のディスプレイアダプタは使ったことがなかったので、MacBook Proでの利用検討をきっかけにいろいろと調べています。

    疑問だったのがUSB 3.0接続のマルチポートアダプタに多いのがHDMI 1.4対応で、USB 3.0の帯域幅が約5Gbpsなのに対してHDMI 1.4の帯域幅が10Gbps(4k)、普通に考えてUSB 3.1 (gen2)でも帯域幅足りないじゃないか!と思ってたんですが、とてもわかりやすい記事を見つけたのでリンク。

    「USBディスプレイアダプタの特徴を考慮してパソコンとディスプレイをUSB経由で接続する」http://www.webmagazine.kakisiti.co.jp/?p=550

    DisplayLinkという会社のパーツが使われることが多いそうで、帯域幅については(詳細はともかく)納得。でもこれだと遅延が少なからずありそうだし、動画など動きが激しいものでフレームが落ちることがあるというのも納得したので、これでFPSのゲームするとかは無理があるのかもしれず、外出時などの一時用途に割り切って考えた方が良いのかもしれない。

    たぶん以下みたいなパターン

    のUSB-CコネクタでDisplayPortプロトコルを使ってると明記しているパターンのほうがレイテンシとかは有利なんだろうけど、これはどうやって見分ければいいのか…Thunderbolt3接続となってるのを選べば良いのか。

    ということは、前の記事でいうとThunderbolt3接続のこれ

    が、USBアダプタタイプでないものなんだろうと思う。でも新型MacBook Proは既存のThunderbolt 3端末に非対応(http://iphone-mania.jp/news-143363/)という情報もあるようだしやっぱり目をこらして調べるしかないのかこれは。