Top page  1/34
11
2017

ハムスター(ながちゃん)動画集1

CATEGORYハムスター
実家では長年猫と一緒で、一人暮らしの今もペットを飼いたいが猫はNG…という事で、1月からついにハムスターをお迎えに。
哀しいことに、一匹目の子(ハム子)はお迎え後すぐに亡くなってしまったのですが(涙、二匹目の子(永ちゃん)は元気に過ごしており、無事2か月目を迎えました(*´▽`*)

んで、ちょくちょく撮った写真やら動画やらをTwitterメインでシェアしていたのですが、動画は解像度が微妙という事に気づきYouTubeに上げ直し。
せっかくなので、ここにもまとめときます('ω')ノ
(といっても、チーズもぐもぐ動画以外は微妙。)


今日撮影。可愛い(*'ω'*)


2月11日撮影。この頃はちょい禿げてた。


2月26日撮影。このハイテンションをぜひお見せしたいが、うまく撮るすべを知らぬ…

以上。今後もいろいろ撮ってきたい(=゚ω゚)ノ

Tag: ハムスター

27
2017

TypeScriptでEventEmitterイベントの型を指定する方法

CATEGORYJavaScript
最近人のソースを見てようやく知ったのだが、JavaScriptでよく見かけるイベント( on('close', ~) とか)は EventEmitter なるものを継承して実装するものだそうで、、、自前でやってたわ(汗

で、早速TypeScriptでも使おうとしたものの、イベント引数の型の指定の方法に難儀したので、その方法を書いておく。

まず大前提として、TypeScriptには「Overload on constants」なる、第1引数の値に応じて第2引数以降の型を定義する機能がある模様。
なので、on というメソッドに対して、close やら error やらのイベントごとに型を切り替えることは特に問題なくできる。

実際、JavaScriptのコードに .d.ts で型を付ける場合は特に何も考える必要はなく、普通にこんな感じに型を宣言してやればよい。
on(event: 'error', cb: (err: Error) => void): this;
on(event: 'close', cb: (code: number, message: string) => void): this;
が困ったのはこれを普通のクラス(class Xxx extends EventEmitter なもの)に書く方法。↑をそのまま持ってきても、親クラスの実装を認識せず、実装がないとコンパイルエラーになってしまう(TypeScript 2.1現在)。

で、どうしたかというと、凄く力技ながら↓のように書いて解決した(実際のコードはこれとか)。
on(event: 'error', cb: (err: Error) => void): this;
on(event: 'close', cb: (code: number, message: string) => void): this;
on(event: string | symbol, listener: Function): this {
return super.on(event, listener);
}
うん凄くイケてない。だが、とりあえず問題は解決した。手間も大したことはない。だが微妙。…これで別に困らないけど、もっと良い解決策があれば教えてくださいm(__)m

Tag: JavaScript TypeScript

16
2017

Promiseのオブジェクトを判定する方法

CATEGORYJavaScript
TypeScriptでちょっとしたライブラリを作ってたのだけど、いざそれをJavaScriptのアプリに組み込んで使ったところ、Promiseがうまく判定できずトラぶったのでメモ。

今回やりたかった事はこんな感じの、Promiseだったらそのまま、PromiseじゃなかったらPromise.resolve()でラップして返すみたいな、callback的な処理で戻り値の型を統一するような奴。
(実際のコードはcatchを付けてたりともっと複雑。このサンプルだと端折り過ぎで実害はないかも?イメージという事で。)
const result = handler(params);
if (result instanceof Promise) {
return result;
}
return Promise.resolve(result);
ごく普通の発想だとこんな感じになると思われる。ユニットテスト書いてライブラリ単体で動かしている分には特に問題なく動いていたのだが、これを多数のライブラリを組み込んだ複雑なアプリから呼び出したところで問題発覚。
戻り値にPromiseを返しているのに、明らかにif文に入っていない挙動を示した。

しばらく考えた後にどうも先日と同様のbluebird絡みの問題であるっぽいことに気づく。呼び出し元のアプリでは、諸般の事情からOSSのPromiseライブラリであるbluebirdも参照しており、どうも標準のPromiseとbluebirdのPromiseを比較して、違うクラスと判定しているようであった。

…という事でどうしたもんかとググったところ、stackoverflowで正に同じ悩みを発見。
結論から言うと「Promiseの規格では then メソッドが必ず存在するため、then の有無をチェック」すれば、標準やbluebirdのPromise、それにQといった他のPromise実装も含めて判別できるということ。なるほど。

それに基づいて修正したコードはこんな感じ。
function isPromise(obj: any): boolean {
return obj instanceof Promise || (obj && typeof obj.then === 'function');
}

const result = handler(params);
if (isPromise(result)) {
return result;
}
return Promise.resolve(result);
ただ、これだともちろん then というメソッドがあるだけの全然関係ないインスタンスもPromiseと判定されてしまうので、その辺はトレードオフ。
stackoverflowでは他にも「単にPromiseに変換したいだけなら、害はないので問答無用で Promise.resolve(obj) してしまえ」とった回答もされているので、自分の用途に合わせた方法を用いればよさそう。

Tag: JavaScript TypeScript

13
2017

Zone.jsをNode.js版ThreadLocalとして使う

CATEGORYJavaScript
Node.js でアプリ作ってて、リクエスト情報(セッションIDとかIPアドレスとか)をログとかで出したいけど、そのためにモデル層にリクエストを引き渡したくない、という事で方法を調べたところ、Zone.js というものが使えそうという事が分かったのでその話。

こういう仕組みを作る場合、グローバル変数的なものがあればそこに置いておけばいいんだけど、JavaScriptは非同期処理なので普通のグローバル変数では駄目で、リクエストごとに一意な何かが必要となる。
(PHPみたいにリクエストごとにインスタンスが破棄される言語なら普通のグローバル変数で十分だけど。)
他のマルチスレッド系の言語だと、例えばJavaのサーバーサイドには、スレッドごとに一意なグローバル変数的な存在の ThreadLocal というものがあるので、Node.jsにもこういう仕組みがないか探したところ、標準ではないけどZone.jsというライブラリを使えばできそうな事が分かった。
Node.js標準のdomainも似た機能らしいけど、6現在deprecated。)

Zone.js

Zone.js はAngularの開発チームが作ってるライブラリだそうで、Dart(JavaScript代替言語の一つ)にある同名の仕組みをJavaScriptでやろうとしたものらしい。
簡単に説明すると、Zone というものを作成して、そのZoneのrunメソッド経由で関数を実行すると、その中がスコープみたいになって、Zoneに登録したプロパティやらを参照できるというもの。

凄いことに、runメソッドの内部で実行されたものであれば、非同期処理からであっても親のZoneを参照できる。
なんかアスペクト指向的に埋め込んでる?っぽい雰囲気。

その他、非同期処理内で発生したエラーなども、onHandleErrorのイベントでキャッチしたりできて、元々はそっちの用途がメイン?
でも今回はグローバル変数的な使い方を紹介してく。

Tag: JavaScript Node.js Zone.js

04
2017

SequelizeをTypeScriptで動かす

CATEGORYJavaScript
JavaScript で一番メジャーらしいORMの Sequelize を TypeScript でも動かしてみたので、その手順とかあれこれ。
なお、Qiitaにも2015年の解説記事があり、自分も参考にさせて頂いたのだけど、バージョンが上がって?微妙に定義が変わったりしてて(TPojoTAttributesとかSequelize.Instanceの型が違うとか)混乱したので、2016年末時点の情報ということで一通り書いとく。

実際に使ってるソースは前回に続きこれ。せっかちな人はGitHubからこの辺(モデル実体, 型定義)持っていっちゃってください~。では以下解説を。

SequelizeのTypeScript対応状況

まずはSequelizeの状況説明。Sequelizeは超メジャーなライブラリだけあって、@types/sequelize にちゃんと型定義ファイルが用意されている。
なので、npmで定義ファイルを持ってくるだけで、簡単にTypeScriptに対応することができる…ライブラリ本体だけは。

Sequelize使ったことある人は分かると思うが、こいつは動的言語の秘儀を極めた、めきょめきょメソッドを生やしたりする系の邪悪なライブラリなので、普通にモデルを実装すると、TypeScriptからはI/Fが全く見えない非常に使い辛いモデルになってしまう(汗
なので、以下は、型定義ファイルを作成して、モデルに実際にはプロパティやメソッドがあるんだよ!ということをコンパイラやIDEに教えてやる作業となる。

Tag: JavaScript TypeScript Sequelize