archive-com.com » COM » N » NITOYON.COM

Total: 757

Choose link from "Titles, links and description words view":

Or switch to "Titles and links view".
  • Node.js の fs.watch() と fs.watchFile() の違い - てっく煮ブログ
    watch はファイルとディレクトリを監視できるが fs watchFile はファイルしか監視できない ことが分かる 歴史的見地から調べる 次に 過去をさかのぼるために ChangeLog を見てみた fs watchFile は v0 1 18 で process watchFile として登場した古い API fs watch は v0 5 9 で実装された新しい API だと分かった しかし これ以上の公式の情報が見つからなかったため 全体像が見えない ソースコードを見る 困ったらソースコードを見ろ と昔の偉い人も言っている いざ コード リーディング fs watch まずは fs watch の実装をみてみよう ソースコードは執筆時点で最新の v0 10 19 を利用する lib fs js src fs event wrap cc の順にたどっていくと uv fs event init 関数が本丸だと分かった uv で始まる関数は libuv で定義されたもの libuv は Node js のプラットフォーム間の差を吸収するためのライブラリらしく IO やスレッド タイマーなどの処理が実装されているようだ では uv fs event init の実装を見てみる deps uv src の下を grep してみると unix aix c unix cygwin c unix kqueue c unix linux inotify c unix sunos c win fs event c が引っかかった プラットフォームごとに実装が異なっているようだ ざっと読んでみると プラットフォーム 実装方法 Linux inotify を利用 MacOS BSD kqueue を利用 Windows ReadDirectoryChangesW を利用 Solaris Event Ports を利用 AIX 未対応 Cygwin 未対応 となっていた つまり fs watch はネイティブの監視処理を利用して 変更があったら OS から通知してもらっている ことが分かった fs watchFile 一方の fs watchFile を見てみる Node js には古くから実装されているが 現在では利用が推奨されていないほうの関数である lib fs js src node stat watcher cc の順にたどっていくと uv fs poll start 関数が本丸だと分かった あとは uv fs poll start の流れをつかめばおしまい deps uv src fs poll c を見てみよう なんとなくポーリングをしていそうな名前である int uv fs poll start uv fs poll t handle uv fs poll cb cb const char path unsigned int interval 初期化処理は省略 if uv fs stat loop ctx fs req ctx path poll cb abort 肝は uv fs stat の呼び出し この関数は Node js で言うところの fs stat 相当の処理だろう ファイルの更新日時の取得を依頼して 取得が完了したら poll cb が呼ばれる その poll cb を見てみよう static void poll cb uv fs t req 異常処理とか 前回と違ってたらイベント発行する処理とか Reschedule timer subtract the delay from doing the stat interval ctx interval interval uv now ctx loop ctx start time interval if uv timer start ctx timer handle timer cb interval 0 abort 実行結果の解析が終わったら interval 後に timer cb が呼ばれるようにタイマーを開始している timer cb では 再度 uv fs stat を実行している つまり 定期的に fs stat を実行している つまり fs watchFile

    Original URL path: http://tech.nitoyon.com/ja/blog/2013/10/02/node-watch-impl/ (2016-02-13)
    Open archived version from archive

  • LiveReloadX を Grunt から使えるようにした - てっく煮ブログ
    を使う方法も紹介されてるが そっちは少し煩雑そうだった LiveReloadX の一番のウリが static モードと proxy モードで JavaScript スニペットの埋め込みを Web サーバー側でやってくれる この機能を使いたかったので LiveReloadX 自体を Grunt に組み込んでみた 組み込むにあたっては Grunt のドキュメントを見たり 各種プラグインのソースを見たりすれば だいたいの方法は分かったので 比較的簡単に対応できた ブログ書くのがさらに手軽になった 個人的には 今回の機能によって ブログを書くのがとても楽になった いままでは このブログを書くにあたって jekyll と livereloadx を個別に実行していた 以前 Jekyll で watch の代わりに Grunt を使ってみるテスト で書いたとおり Jekyll を Grunt から使うことには成功していた 今回 LiveReloadX も組み合わせられるようになった つまり grunt と実行するだけで Web サーバーが起動して Jekyll のビルド結果を確認できる Markdown 記法の記事をテキストエディターから編集したら jekyll が走って HTML を生成する 表示しているページの HTML や画像が生成されたら 自動でブラウザーがリロードされる という環境が整った このブログのソースコードは nitoyon tech nitoyon

    Original URL path: http://tech.nitoyon.com/ja/blog/2013/07/29/livereloadx0-3-0/ (2016-02-13)
    Open archived version from archive

  • タグ「Jekyll」の記事一覧 - てっく煮ブログ
    Windows LiveReloadX を Grunt から使えるようにした 2013年07月29日 LiveReloadX Jekyll Node js てっく煮 Jekyll で watch の代わりに Grunt を使ってみるテスト 2013年06月25日 Jekyll Ruby Node js ブログのタグ機能が復活したよ 2013年06月17日 てっく煮 Jekyll Jekyll のカテゴリーとタグの指定方法 3 パターン 2013年04月17日 Jekyll Jekyll の 0 12 0 でシンタックス ハイライトが便利になった 2012年12月25日 Jekyll Ruby の Liquid でテンプレートに値を渡すパターン4つ 2012年10月29日 Ruby Jekyll 静的サイトで JS CSS のキャッシュを防ぎつつレポジトリをキレイに保つ 2012年10月15日 てっく煮 Jekyll 俺の最強ブログ システムが火を噴くぜ 2012年09月20日 はてな Jekyll てっく煮 タグ一覧に戻る About Profile nitoyon にとよん 京都のベンチャー会社勤務 プログラマ たまに趣味でデザイン 詳細

    Original URL path: http://tech.nitoyon.com/ja/blog/tags/jekyll/ (2016-02-13)
    Open archived version from archive

  • タグ「てっく煮」の記事一覧 - てっく煮ブログ
    てっく煮 Jekyll 俺の最強ブログ システムが火を噴くぜ 2012年09月20日 はてな Jekyll てっく煮 暫定で はてなブログ に移転した 2012年08月27日 はてな てっく煮 DISQUS へのコメントのインポートが意外に面倒 2012年07月31日 てっく煮 英語ブログを新調した話と移転計画 2012年06月27日 てっく煮 ブログのデザインを新しくしてみた 2012年03月13日 てっく煮 CSS Web デザイン はてブ受けしそうな記事を書いて 1ヶ月で約3万円を稼いだ顛末 2009年07月02日 てっく煮 Ajaxian で紹介してもらったよ 2008年01月24日 てっく煮 新デザイン移行完了 2007年03月05日 てっく煮 新デザイン移行計画 2007年02月11日

    Original URL path: http://tech.nitoyon.com/ja/blog/tags/tech-ni/ (2016-02-13)
    Open archived version from archive

  • Jekyll で --watch の代わりに Grunt を使ってみるテスト - てっく煮ブログ
    するわけだから 当然 CPU は振り切る Jekyll 1 0 になって コマンドも jekyll build watch に変わって site サイトの出力先 や git が監視対象から外れたので パフォーマンスはだいぶ改善した それでも自分の環境で常時 10 ぐらい CPU を消費し続けている ということで watch もしくは auto オプションの代わりに 流行の Grunt を使ってみることにした Grunt の設定ファイル 使っているバージョンやプラグインは次の通り Jekyll 1 0 3 Grunt 0 4 1 grunt shell spawn プラグイン grunt contrib watch プラグイン 最初は grunt shell spawn ではなく grunt jekyll を使ってたんだけど grunt jekyll は Jekyll を実行中の途中経過を表示してくれないので使うのをやめた Grunt の使い方については Getting started Grunt を見たほうが早いだろうから ここでは package json と Gruntfile js を紹介する package json name tech ni version 0 1 0 devDependencies grunt 0 4 1 grunt shell spawn 0 2 4 grunt contrib watch 0 4 4 Gruntfile js module exports function grunt grunt initConfig pkg grunt file readJSON package json shell jekyll command jekyll build options async false watch jekyll files posts md layout html includes html tasks shell jekyll grunt loadNpmTasks grunt shell spawn grunt loadNpmTasks grunt contrib watch grunt registerTask default shell jekyll Jekyll 0 12 までを使用している場合は jekyll build を jekyll で置き換えるべし 使い方 grunt watch を実行すると ファイルの監視を始める 記事や HTML が編集されたら jekyll build が実行されるようになっている しかし Jekyll で監視するよりも CPU 消費量は小さいが 0 ではない と ここで調べてみて気づいたんだけども Grunt の watch は ネイティブ API の fs watch を使ってファイルを監視していない gaze モジュールを使って定期的にファイルを stat しているだけだった これでは Ruby の directory watcher

    Original URL path: http://tech.nitoyon.com/ja/blog/2013/06/25/jekyll-grunt/ (2016-02-13)
    Open archived version from archive

  • Flickr の Set 内の写真一覧を更新する Ruby スクリプトを作った - てっく煮ブログ
    id to s page page to s photo ids concat res photo map photo photo id page res page to i 1 pages res pages to i end id res id primary res primary photo photo ids end def log str puts Time now str end def main cur set id get set YYYY MM DD new set name Date today to s new set id get set id by name new set name if new set id nil log set new set name not found exit end log set new set name found new set id Get set information cur set get photos in a set cur set id new set get photos in a set new set id log current set has cur set photo length photos if new set photo length 0 log no photo exit end log add new set photo length photo s to it Create new photo ids cur photos set Set new cur set photo photos cur set photo dup log current photos photos join modified false for photo in new set photo if cur photos set include photo log skip photo photo else log add photo photo photos unshift photo modified true end end log new photos photos join if modified log editPhotos start res flickr photosets editPhotos photoset id cur set id primary photo id cur set primary photo ids photos join log editPhotos finished else log editPhots skipped end delete set log delete photoset start flickr photosets delete photoset id new set id log delete photoset finished end if ARGV length 1 log set id not specified log ruby flickr update rb set id exit end begin main ARGV 0 rescue SystemExit rescue Exception e log exception e inspect n e backtrace join n end 使い方 あらかじめ 写真をプライベートでアップロードしておきます たとえば 2012年11月06日に公開したい写真は

    Original URL path: http://tech.nitoyon.com/ja/blog/2012/11/06/flickr-auto-update/ (2016-02-13)
    Open archived version from archive

  • Ruby の Liquid でテンプレートに値を渡すパターン4つ - てっく煮ブログ
    liquid などのメソッドが定義されている to liquid を独自実装するパターンを使うと テンプレート側から Person のメソッドを呼ぶことはできない それをやりたいなら 次に説明する Liquid Drop を使うとよい Drop を使うパターン Liquid Drop を継承してやることで テンプレート側からメソッドを呼べるようになる class Person Liquid Drop attr accessor name def initialize name nitoyon end def NAME name upcase end end template Liquid Template parse hi person name puts template render person Person new hi nitoyon template Liquid Template parse hi person NAME puts template render person Person new hi NITOYON これはとても便利だが いくつか注意すべき点がある まず 引数付きのメソッドを呼ぶことはできない 引数に対処したかったら テンプレートから name param1 param2 のようにして参照しておいて 後述の before method でがんばってパースしろ というポリシーのようだ もう1つ 別ライブラリが提供するオブジェクトを Liquid に渡したいことがある このとき Liquid Drop を継承させるのは不可能だ かといって to liquid で内部構造をいちいちハッシュに変換するのも面倒だ そんなケースに対処するために Drop 化させるクラス ToDrop を作ってみたので 次のパターンとして紹介する Drop 化させるパターン gem かなんかで こんなクラスが提供されているものと仮定する module Foo class Person attr accessor name def initialize name nitoyon end def NAME name upcase end end end 外部ライブラリーのクラスなのでいじりたくないけど このクラスのインスタンスをテンプレートに渡して name や NAME メソッドを叩きたいものとする そういうときは 次のような ToDrop クラスを定義しておけばよい class ToDrop Liquid Drop def initialize obj obj obj end def before method method if method method obj class public method defined method to s to sym obj send method to s to sym end end end 使い方は簡単 to liquid で ToDrop new self を返す処理を実装してやるだけだ これだけで期待の動作となっている module Foo class Person def to liquid ToDrop new self end end end template Liquid Template parse hi person name

    Original URL path: http://tech.nitoyon.com/ja/blog/2012/10/29/liquid-drop/ (2016-02-13)
    Open archived version from archive

  • ubygems - てっく煮ブログ
    msvcrt c ruby lib ruby site ruby c ruby lib ruby 1 8 c ruby lib ruby 1 8 i386 mswin32 不思議だったのでいろいろと情報をあたってみた 犯人は RUBYOPT 環境変数を見てみると RUBYOPT に rubygems が設定されていた ruby を起動するごとに RUBYOPT が自動的にコマンドライン引数に付加されるらしい どうやら One Click Ruby のセットアップ時に 環境変数 RUBYOPT に rubygems が設定されていたようだ 試しに RUBYOPT を空にして require sqlite3 するとエラーになった 次に rubygems オプションの仕組みが気になった ruby 本体に rubygems 用の特殊な処理が組み込まれているとは考えづらい r オプション ruby help を実行すると r はライブラリを読み込むためのオプションだと分かった 例えば MD5 モジュールを使うとき r を使わなければ次のようになる ruby e require md5 p MD5 md5 a これを r を使って書き換えると ruby r md5 e p MD5 md5 a とできる r のあとのスペースは省略できるので ruby rmd5 e p MD5 md5 a としてもよい rubygems の答え そこで rubygems なんと lib ruby site ruby 1 8 に ubygems rb というファイルが用意されていた ubygems rb は require rubygems してるだけ この ubygems rb があるおかげで ruby r rubygems foo rb の変わりに ruby rubygems foo rb と書けるわけだ rubygems は r ubygems と解釈される ubygems rb が rubygems rb を require する なるほどねー rubygems は何をやってるか 最後に rubygems が中で何をやってるかを軽く見てみた rubygems rb から呼ばれる rubygems custom require rb では Kernel require の処理を置き換えている module Kernel alias gem original require require nodoc コメントいっぱい def require path nodoc gem original require path rescue LoadError load error 例外処理いっぱい end end module Kernel ということで require rubygems するか rubygems オプションを指定すると require がラップされるようだ lib ruby

    Original URL path: http://tech.nitoyon.com/ja/blog/2008/12/02/ubygems/ (2016-02-13)
    Open archived version from archive



  •