はらへり日記

腹に弾丸

YAP(achimon)C::Asia Hachioji 2016に登壇しました

YAPCに登壇したぞ!

30分のトークとLTでそれぞれ登壇しました。

10分以上の発表は実は初めてでした。

年初のポエムで立てた対外発表の第一歩として応募して採択されたので頑張った。

sota1235.hatenablog.com

DIコンテナの話

DIの発表はよく見るけどDIコンテナの話はそんなに見ない気がしたので発表した。

YAPCのPはPHPのPだと聞いていたのでPHPのDIコンテナに絞って発表した。

speakerdeck.com

ESLintの話

LTではJavaScriptの話した。

30分トークで死ぬほど緊張した後だったのでどうにでもなれ精神で頭おかしい発表してしまった。

かわいいESLint実装誰か頼む|ω・`)

speakerdeck.com

反省会

  • 発表テーマがちょっとわかりづらいだけどに聴衆が少なかった。(そのおかげであまり緊張しなくて済んだのだけど)
  • 接続確認が甘くてスライドの下が見切れてた
  • 日本語が怪しい
  • LTそこそこ笑い取れて安心した

とはいえ、聴いてくれてた方はみなリアクションをくれたしご質問ももらったので最初にしてはまずまずかなと思ってる。

残念ながら2日目は参加できないのですが、参加される方は楽しんでください!!

今後

次はPHPカンファレンスに登壇したい!頑張ります。

社内で1年ぶりにXSSの話した

1年前

だいたい1年前、社内でXSSの認知を広めるべくXSSの話をわからないなりにしました。

1年経ったのでもう一回、社内で発表しました。

XSSの無い最高の夏を過ごそう

ほんと、タイトルの通り。 今回は座学より実践形式に重きを置いていて、いくつか例題を作って実際にみんなに触ってもらいました。

かなり時間かかったけど、解けなくて悔しがってる人が何人書いたようで攻撃サイドの気持ちになってもらうっていう意味ではとても良かったように感じました。

XSS Tour

CTFほどじゃないけどそれらしきエセサイトをいろんな問題(過去の解けなかったセキュキャン応募用紙の問題やGoogleXSS Gameあたりを参考に)を参考に用意しました。

リポジトリも公開してるので興味のある方はどうぞ。

github.com

JSのArrayBufferがよくわからなかったのでほんの少しだけ調べた

前提

初心者なりの超浅い理解です。

(というのも、元々Web Audio APIに食わせるためだけに調べてたので…)

ArrayBufferとは

ひとことで言うと「JavaScriptバイナリを扱う」ために生まれたという認識。

なので画像処理等に使われていることが多い印象です。

少なくとも僕はWeb Audio API以外で使ったことがない(´・ω・`)

ArrayBufferは以下のようにインスタンス生成することができます。

const buf = new ArrayBuffer(30);

普通にクラスみたいにnewします。引数には確保したいバイナリの長さを渡します。

この瞬間、何が起きるかというと指定した長さのメモリ空間がバイナリ保存用に確保されます。

なので当然、アホみたいにでかい数字を渡してインスタンス生成しようとすると「メモリ足りないぜよ!」となってエラーになります。

また、このArrayBufferにはもう1つの特徴があり、直接読み書きすることができません。

以下のドキュメントを見てもそれらしきAPIやプロパティが存在しないことがわかると思います。

ArrayBuffer - JavaScript | MDN

せっかくバイナリを保存するためのメモリ確保してもなんにもできないやーん、となってしまいます。

そこで出てくるのが型付き配列というものです。

型付き配列(Typed Array)

型付き配列とは、その名の通り型を持つ配列のことです。

通常のArrayとは違うものですが、通常のArrayのように使用することができます。

TypedArrayにはいくつかのサブクラスが存在し、実際にはそれらを使用します。

では実際、こいつが何の役に立つのかというとArrayBufferの確保するメモリ空間にアクセスするために使用します。

具体的には以下のような感じで使えます。

const buf  = new ArrayBuffer(100); // メモリ空間の確保
const view = new Uint8Array(buf);  // 1行めで確保されたメモリ空間へアクセスするための型付き配列

これでview変数を通じてbufで確保されているメモリ空間にアクセスすることが可能になります。

(Uint8Arrayバイナリへのアクセス方式を8bit整数(符号なし)で行いたい時に使用する型付き配列のサブクラスの一種)

これで例えば以下の様なコードを書くとbufを書き換えているのが同義になります。

view[0] = 0x12; // bufの0番めに書き込んでいるのと同義

このためのTypedArrayだったんですね~~~

まとめ

  • ArrayBufferはバイナリ保存用にメモリ空間を確保するためのもの
  • 直接の読み書きは不可
  • ArrayBufferに格納されるバイナリを読み書きするのにTypedArrayを利用する
  • TypedArrayはだいたい配列と同じノリで扱えるよ!

参考

Javascript typed arrays - JavaScript | MDN

ファイルサイズをチェックするfslint作りました

なぜ作ったのか

会社でフロントサイドJSを書く時、Browserifyとnpmでいろいろモジュール入れてゴリゴリやってたのだがファイルサイズがでかくなってしまうことが多々あった。

ファイルが1個ならいいが、吐き出すファイルが1個ではなかったしみんなが修正する度にファイルサイズチェックするのも非常に面倒だったのでeslintみたいなノリでファイルサイズをチェックできる何かが欲しいなと思ったので作った。

fslint

github.com

lint系をパクってfslintとした。

やってくれるのは本当にシンプルで、指定したファイルが指定したサイズをオーバーしてるかどうかをチェックするだけ。

使用方法はこんな感じ。

本当にこれだけ!

チェックがこけるとexit(1)するのでCIに組み込んでファイルサイズがでかすぎたら弾く、なんてこともできます。

作ってみて

npmライブラリはこれまでもいくつか作ってたんですこのfslintは作るのに全然時間がかかりませんでした。

というのも欲しい機能はだいたいnpmに落ちていたのでそれらをガッチャンコして見やすくしたくらいしか実装してないです。

ES2015で書いて公開ってのも初めてやったのでよい勉強になりました。(こちらを参考にしました!)

まとめ

気軽にファイルサイズチェックしたい人はぜひ使ってね!

node.jsでprocess.env.HOGEを書き換えようとしてハマった

nodeのコード中で環境変数を書き換えたい

そう思って以下の様なことをしてみました。

process.env.LOCAL_ENV = undefined;

/* ~略~ */

if (_.isUndefined(process.env.LOCAL_ENV)) {
  console.log('LOCAL_ENV is not specified');
}

しかし何回やってもprocess.env.LOCAL_ENVにundefinedが入ってることにならない…

process.env.HOGEにはstring型しか入らない

きちんとDocumentに書いてありました。

process Node.js v6.1.0 Manual & Documentation

process.envから生えるオブジェクトをundefinedにしたい場合は何を代入してもstring型になるのでdelete句を使う必要があります。

// 間違い ('undefined'という文字列がセットされるだけ)
process.env.LOCAL_ENV = undefined;

// こうするべき
delete process.env.LOCAL_ENV;

テスト書いてるとき見事にハマりました。。。 よく考えればわかることだった。。。