2017年 01月の投稿を表示しています

激安 JS を作ってみた

この記事は公開されてから1年以上経過しており、情報が古い可能性があります。

こんにちは。ごみばこです。

某所で激安 CSS が盛り上がり、実際に使うとなったら JS に全部書かれていて、数字だけ入った要素に適用されると嬉しいだろうなあ~、と思ったので、作ってみました。

※激安 CSS についてはこちら > http://qiita.com/shiozaki/items/0e42e101b7483df13c8f

ソースはここ(gist)
✨安い!!お得!!激安JS!!✨

せっかくなので、ただ作るではなく、普段書かないようなメソッドや記述を盛り込んでみようかなあと。

  • ライブラリを使わない
  • document.querySelector と document.querySelectorAll で要素検索
  • テンプレートリテラルで CSS の定義
  • innerHTML じゃなくて createElement で地道に作っていく
  • let! let!
  • アロー関数でクロージャ

 

↓実際に実行するとこちらになります

 

あの大人気の掃除機が今だけナント!49800


<p>あの大人気の掃除機が今だけナント!<span class="gekiyasu">49800</span></p>
<script src="/tool/gekiyasu.js"></script>
<script>gekiyasu.initialize();</script>

 

元の CSS 作者に圧倒的感謝?

GPU で動く Tensorflow をセットアップする

この記事は公開されてから1年以上経過しており、情報が古い可能性があります。

こんにちは。ごみばこです。

ちょっと思い立って、TensorflowをGPUで動かしたくなったので、その構築メモを残しておきます。

カンタンなまとめ

  • AWS EC2 で g2.2xlarge を スポットインスタンスで使った
  • Tensorflow の学習データを 60GB の付属するストレージに置いた
  • crontab と aws-cli を使って定期的に AWS S3 に学習データ(の一部)を転送した
  • tensorflow と tensorflow_gpu を間違えるとかなしい
  • 2日くらいで試行錯誤した成果は得られなかった

 

マシンの調達

ローカルPCでも NVIDIA なグラフィックが搭載されているので実行はできたのですが、せっかくなので AWS を利用することにしました。インスタンスタイプとしては g2.2xlarge を利用しています。さらに、せっかくなので スポットインスタンス を利用したのですが、ちょっと高めの金額設定をして、2日ほど安定して稼働できました。高めとはいえ、普通に EC2 のオンデマンドインスタンスを立てるよりも圧倒的に安くできています。

オンデマンドインスタンス: $0.898 / 1時間
(参考:https://aws.amazon.com/jp/ec2/pricing/on-demand/

スポットインスタンス: およそ $0.09 - $0.15 / 1時間
(参考:https://aws.amazon.com/jp/ec2/spot/pricing/

入札前に過去の金額を見ていると、なぜか ap-northeash-1a のリージョンだけ天井価格?まで跳ねることがあるようだったので ap-northeast-1c を利用しました。

 

スポットインスタンスならではの注意点ですが、データ消失の可能性があったので、実際に学習を進めてみたとき、中間データを S3 にファイルとして保存するようにしていました。仕組みとしては crontab を利用して aws-cli を実行する程度のカンタンなものになっています。

Tensorflow 自体が中間データを保存・読み込みできるので、非常に便利でした!(※実際には TFLearn を利用)

 

また g2.2xlarge ならでは…?かわからないのですが 60GB ほどのストレージが付属しています。このストレージはそのまますぐに利用することが出来るのですが、マシンを再起動したりするとデータが消失するので Tensorflow の中間データや、出て来るログや、前処理した後などの一時ファイル置き場として利用していました。

 

環境構築

Linux + GPU 周辺に知識があるわけでもないので、参考になりそうで、よさそうな記事を探して、それどおりに進めたところ、実に上手く行きました。

(参考:http://qiita.com/yukoba/items/3692f1cb677b2383c983

// 下準備
$ sudo apt update
$ sudo apt upgrade -y

$ wget http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/7fa2af80.pub
$ cat 7fa2af80.pub | sudo apt-key add -

$ wget http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/cuda-repo-ubuntu1604_8.0.44-1_amd64.deb
$ sudo dpkg -i cuda-repo-ubuntu1604_8.0.44-1_amd64.deb
$ sudo apt update

$ sudo apt install -y linux-generic
$ sudo apt install -y cuda nvidia-367
$ sudo reboot

$ sudo apt remove -y linux-virtual
$ sudo apt-get -y autoremove

$ rm 7fa2af80.pub cuda-repo-ubuntu1604_8.0.44-1_amd64.deb

// bashrcに追加
$ vi ~/.bashrc

export PATH="/usr/local/cuda-8.0/bin:$PATH"
export LD_LIBRARY_PATH="/usr/local/cuda-8.0/lib64:$LD_LIBRARY_PATH"

// 確認
$ nvidia-smi

// CuDNN の追加
//
// NVIDIA Developer に登録するとダウンロードできる
// https://developer.nvidia.com/
//
// ローカル PC でダウンロードして scp などで転送するとよい

$ tar xzf cudnn-8.0-linux-x64-v5.1.tgz
$ sudo cp -a cuda/lib64/ /usr/local/lib/
$ sudo cp -a cuda/include/ /usr/local/include/
$ sudo ldconfig

$ rm -R -f cuda cudnn-8.0-linux-x64-v5.1.tgz

// grub編集
// 12行目
sudo vi /etc/default/grub

GRUB_CMDLINE_LINUX="systemd.unit=multi-user.target"

$ sudo update-grub
$ sudo reboot

// 後処理
$ sudo apt-get clean

CuDNN をインストールするとき NVIDIA Developer に登録しなくてはいけなかったところがちょっとつまりかけたところです。登録するときいくつか分野?を選べるのですが、適当なものを選んでもダメで「Accelerated Computing with NVIDIA ComputeWorks」で登録する必要がありました。ここまで行くと nvidia 系のコマンドが利用できるようになり GPU の動作具合を確認することができます。

 

Python + Tensorflow の準備

こちらも Python に詳しいわけではないので、良さそうな記事をいくつか見ながら統合した結果で進めました。

// pip で入れる python ライブラリに必要なライブラリ、ツールを入れる
$ sudo apt-get install -y libpng-dev libjpeg-dev libhdf5-serial-dev libatlas-base-dev libopenblas-dev build-essential autoconf libtool pkg-config

// python3 を入れる
$ sudo apt-get install -y python3-pip

// aws-cli を入れる
$ sudo apt-get install -y awscli

// pip を更新する
$ sudo pip3 install -U pip

// 公式サイトを要確認し Tensorflow を入れる
// https://www.tensorflow.org/get_started/os_setup#pip_installation
$ sudo pip3 install -U https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow_gpu-0.12.1-cp35-cp35m-linux_x86_64.whl

// 各種ライブラリを入れていく
// tflearn Tensorflow のラッパ。カンタンに Tensorflow を扱うことができるようになる。
// pandas  カンタンに csv を扱える
// Image   画像処理を行う
// h5py    Tensorflow が高速に動くために必要らしい
// scipy   科学技術計算ライブラリ。Tensorflow が高速に動くために必要らしい
$ sudo pip3 install -U tflearn
$ sudo pip3 install -U pandas
$ sudo pip3 install -U Image
$ sudo pip3 install -U h5py
$ sudo pip3 install -U scipy

// もう一度入れ直すと numpy が早くなるらしい...?未検証
$ sudo pip3 install -U --force-reinstall numpy

// g2.2xlarge の場合 60GB がついてくるのが /mnt
// ここにテンポラリを用意していく
$ sudo mkdir /mnt/tmp/

// 学習データの記録
$ sudo mkdir /mnt/tmp/checkpoint/

// Tensorflow が動作していく様子を web 上で確認できるようにするため
$ sudo mkdir /mnt/tmp/tensorboard/

// 全許可!
$ sudo chmod 777 -R /mnt/tmp/


// Tensorflow の動作確認
// GPUに関する出力がもりもりでてくるとOK
$ python3
> import tflearn

途中 Tensorflow を入れるところで、うっかり違うバージョンの Python 、 CuDNN の URL を指定すると動作しません。さらに GPU を利用しないバージョンをこれまたうっかり選んでしまうと CPU で動作する Tensorflow が入ってしまい GPU が使えません。pip3 list などで確認をしても Tensorflow としか出てこないのでどちらが入っているか確認するのがわかりづらく…。。

実際に import tensorflow とかを実施し、GPU 初期化したよ!という結果を見るのが一番でしょうか。

 

肝心の成果は…?

ここまでで、環境構築が出来たので、あとは MNIST のチュートリアルなどをすすめると、ディープラーニングの凄さ、GPU の凄さを体験できます。

ぼくはディープラーニングって何者?を体験したかったので MNIST チュートリアルをして、以前思いついていたレシートの判別(https://gomiba.co.in/blog/archives/587)をやってみてました。ニューラルネットワークやアルゴリズムがよく分からず、それっぽくニューラルネットワークを組んでみたのですが、思ったように loss が下がらず。。これはデータや組み方が悪いんだなーと思い、ディープラーニングむずかしいね、という結論でインスタンスを終了しました。

費用は2日間で $2 くらいでしたが何の成果もあげられませんでした!(もうちょっとがんばろう)

Regexp::Trie を PHP に移植した

この記事は公開されてから1年以上経過しており、情報が古い可能性があります。

こんにちは。ごみばこです。

packagist に公開してあるので composer require regexp-trie:dev-master とでもしたらすぐに使うことができます。

sters/regexp-trie - Packagist

 

use RegexpTrie\RegexpTrie;

$regexpTrie = RegexpTrie::union([
    'C','C#','C++','Clojure','CoffeeScript','CommonLisp',
    'Java','JavaScript','JScript','J#','JSX',
    'Perl','PHP','PostScript','PowerShell','Python',
]);

var_dump($regexpTrie->toRegexp());
// =>
//     /(?:C(?:(?:\+\+|lojure|o(?:ffeeScript|mmonLisp)|#))?|J(?:ava(?:Script)?|S(?:cript|X)|#)|P(?:erl|HP|o(?:stScript|werShell)|ython))/

これは正規表現において Wikipedia や はてなキーワード のような、多数のキーワードを同時に処理しようとすると、選択が多数になるものができあがり、非常にパフォーマンスが悪いものを、トライ木を使って解決するためのものです。

元ネタはこのあたり。

このトライ木による正規表現の生成ですが、ご覧のとおり Perl や Ruby ではすでに作られているようで PHP には特に見当たらなかったので Ruby のものから翻訳してみました。( Perl のソースはちょっと分からないところだらけ過ぎてつらかったので… )

追)PHP には特に見当たらなかったと思っていたのですが packagist を見たらそれっぽいものがありました。。

s9e/regexp-builder - Packagist

ちゃんと実装を追っていないのですが Regexp::Asemble っぽい挙動をしているような…?

2017年になっていました

この記事は公開されてから1年以上経過しており、情報が古い可能性があります。

みなさん、あけましておめでとうございます。
今年の僕のテーマは本気!
本気になれば自分が変わる!本気になれば全てが変わる!!
さあ、みなさん本気になって頑張っていきましょう!

松岡 修造

こんにちは。ごみばこです。

2016年の振り返りをする前に2017年が来てしまいました。来ているどころか1月も半分が終わろうとしています。

2016年の振り返り

振り返りとしては以下のようなところでしょうか。

  • お仕事の名刺に肩書きがついたよ
  • 結婚したよ
  • 機械学習あそんでるよ
  • Electronあそんでるよ
  • Minecraftあそんでるよ

 

2016年ではかなり大きなイベントとして、お仕事で肩書がついたこと、結婚したことがありました。

 

どちらも自分の考えることが変わったり変わらなかったり、関わる人も変わったり変わらなかったり、やることも変わったり変わらなかったりしてくるようになったかなーと感じています。

お仕事もプログラムを書くことが少なくなってしまい、何かを調べたり、Facebook Messenger で連絡を取ったり、頭め~~~っちゃ使ったり、なんて部分の割合がめっちゃ増えました。今の時期だからかもしれませんが……。ぼくが Facebook Messenger をよく見るようになった理由はまたどこかで。

 

そして、学生時代よりはだいぶ減りましたが、今年もゲームをよくやりました。

  • スーパーマリオRPG
  • ロックマンX2
  • モンスターハンター4G
  • STAR WARS バトルフロント
  • ドラゴンクエストヒーローズ
  • ドラゴンクエストヒーローズ 2
  • 戦国Basara 4 皇
  • Minecraft
  • Terraria
  • Saints Row IV
  • Killing Floor 2
  • Left 4 Dead 2
  • PAYDAY 2
  • CS:GO
  • Team Fortress 2
  • Euro Truck Simulator 2
  • Zombie Driver

未クリアのゲームも多数残っているのが心残りなので、今年はこれらをクリアしていきたいと思っています。

  • ドラゴンクエストヒーローズ 2
  • Crypt of the NecroDancer
  • Bio Shock
  • Bio Shock 2
  • Dead Rising 3
  • Metro 2033
  • Metro: Last Light Redux
  • クロノトリガー

 

2017年の目標とかそういうの

全部で3つあります。

1つめは今年はおうちにかける時間を増やしたいなーと思っています。いままで一人だったというところもあって、時間管理とか、土日なら夜とか朝とか関係なしに寝たりご飯したりゲームしたりと、なかなかひどい生活だったなあと。共同生活になっているわけですし、なんなら入居者が増える(人かもしれないしもふもふしたものかもしれない)だろうというところもあって、そういう生活をいつまでもしている場合じゃないなあと、いまさらながら思っています。

というわけで、今年の大きな目標はおうちにかける時間を増やしていきます!

2つめには、いろいろと権限がくっついてきているところもあるので、自分で考えて怒られるまでは好き勝手にやる(語感がわるい)というのもあります。これは昨年の夏くらいからずっと思っていたところで、必要であれば、ぼくを見ている人がツッコミしたり方向を直していくようなことをしたり、してくれって頼んだりしています。会社に云々とか、仕事に云々とか、考えた上で結論を出して動いていけるようにしていきます。

最後に、なるべく迷わないようにしていきたいなーと思っています。それこそ「お夕飯でハンバーグにするか野菜炒めにするか…うーん…嫁~どっちにする~」なんてものを減らしていきたいところです。そういう風に過ごしてきていたからこそ、なんとなくでのらりくらりと、来れたところもあると思うのですが、時間の無駄感と主張の弱さを感じはじめたので、ここらで気合い入れて、意思決定していきます。

今年もごみばこさんをよろしくお願いします!