プログラム

Coffee scriptでstep.jsを使う (Hubotで3秒毎に発言させる)

Hubotに3秒おきに発言させるため setTimeout 使う時、あれこれ試してみて以下の様に書いてみた。step.jsを利用してコールバックのネストが深くならなくて多少見やすいかなと思ったのですが、もっと良い書き方があったら是非知りたい。 cronJob = require('cr…

lxc-cpu-usageというツールを作った

VPSの上で複数のLXCを作ってRubyやnode.jsのアプリケーションサーバを動かしたり、DBサーバを動かしたりしているのですが、 稀に「このコンテナでどのくらいCPUが利用されているのだろう?」*1と調べることがあって、その時には 該当のLXCのinitプロセスを見…

Hubotを定期的に動かして発言させる

Hubotでcronでスクリプトを定期的に実行させる様に定期的に動かして例えばサービスのパラメータ等を通知させるのはどうするとよいのか調べたのでその際のメモ。 node-cronというnpmパッケージがあるので、これを利用するとcronと同じ書式でスケジューリング…

npm_lazyを使ってみた - A lazy local cache for npm

CastoやSTORYBOARDSでnode.js周りのアプリケーションのデプロイをする際にnpm installされる際、稀にnpm自体が重くなっていたりすることもあるので、ローカルにnpmのキャッシュサーバ的なものを立てられないかと調べていたらお手軽にできるものを見つけたの…

minaで過去にデプロイしたreleaseディレクトリを整理する

2回調べたので記録。 mina でデプロイを行った場合、以下の様にデプロイ先のホストでは管理されます。 lrwxrwxrwx current -> releases/86/ -rw-rw-r-- last_version drwxrwxr-x releases/ drwxrwxr-x scm/ drwxrwxr-x shared/ drwxrwxr-x tmp/ で、この rel…

ライブコーディングアプリ「Casto」ができるまで ep.2

もう既に@hika69 がまとめエントリを書いていてくれるのですが、別の視点でまとめてみようかなと思いまして書いてみます。ということで、ep.2。 "Casto"(キャスト)は一言でまとめると「リアルタイムで更新できるGist」といった形のWebアプリケーションです。…

Rendrで作られたnode.jsアプリをminaでデプロイする

Rendrで新しくアプリを作ろうとしていて、rendr-cliで プロジェクトの雛形を作ったので、では実際にデプロイどうしようと考えた時にminaを使ってやってみたので その際のメモ。 手順としては、 rendrアプリをデーモン化して稼働させるためにforeverで動く様…

MacOSにパッケージから入れたnode.jsをnodebrewに移行した

node.jsは公式サイトでMac用のインストーラパッケージが配布されていて非常にインストールが楽なのだけど、これをやめてnode.jsのバージョンマネージャ*1であるnodebrewを導入したのでその際のメモ。 パッケージでインストールされたnode.jsを削除する 各所…

JavaScriptのハッシュをマージする

var _hashMerge = function(target) { var sources = [].slice.call(arguments, 1); sources.forEach(function (source) { for (var prop in source) { target[prop] = source[prop]; } }); return target; }; を定義しておけば、 var origin1 = {a: "foo"};…

JavaScriptのハッシュのキーへ任意の変数名を指定する場合

JavaScriptのハッシュのキーへ任意の変数名を設定したいつもりで、以下の様に書くと意図した挙動にならない。 例えば下の場合、 var key = "foo"; var data = {key: "hoge"}; // data // Object {key: "hoge"} dataというハッシュに foo というキーを設定し…

Mocha & should.js で例外が生じるケースのテストを書く

Mocha とshould.jsでテストを書いていて例外が起こるテストを書いていて、少し詰まったのでメモ。 例えばhogeというメソッドに空文字列を渡すと例外が生じるというケースのテストを書きたいときに、 foo.hoge('').should.throw(); という書き方をすると、こ…

node.jsのプロジェクトのパッケージ管理用のファイル

2度調べたので記録。 node.jsではパッケージ管理にnpmがあって、更に package.json というjsonファイルがあるとそこに定義してあるパッケージ依存関係に基いてパッケージのインストールがされる*1 のですが、これそもそもどうやって作るの?と思って調べたの…

Minaでデプロイした際にIRCへ通知する

minaでデプロイした際にIRCへ通知を行う様にしたのでその際の対応のメモ。ゴールとしては、IRCの任意のチャンネルにデプロイ開始時等にメッセージを流したいと思います。 そういえばIRCで流す文字に色を付けたい 上の様に貼った画像の様な形でIRC上に色つき…

Chefで ~/.ssh/authorized_keys を配置する

Chefでコンフィグレーションをさせることを先日から取り組んでいて、その中でサーバに接続する予定のユーザの公開鍵を予め配置しておきたいと思っていたところ以外とあっさりとできたのでそのメモ。 状況的にはチームで共有しているユーザがあって、 対象の…

デプロイツールminaを使ってみた

いま複数あるPadrinoのアプリケーションのデプロイでmina を使ってみようと試した際のメモ。 仕事ではCapistrano(+ Webistrano)を利用していますが、RubyのプロジェクトなのとソースコードもGit管理されているので試してみました。 準備 プロジェクトのGemfi…

REMPに任意のプレイリストを取り込むガジェット

REMP にプレイリストを取り込むガジェットを作ってみたりしている昼下がり。デザインは追って調整...。 下のボタンを押すとREMPにPerfumeのYoutubeに上がっている公式動画がプレイリストとして取り込まれます。*1 *1:REMPにログインしている必要ありますが..…

ArduinoでHTTPリクエストをホスティングサーバに投げる方法

突然ですがArduinoの話題。 Arduinoにイーサシールドを接続してDHCPでIPを取得し、ホスト名で示したレンタルサーバへアクセスする際の接続例。 単純にPCからtelnetしてあげるのと同じですが、接続先が共有レンタルサーバ等の場合はHTTPのリクエストヘッダにH…

開発環境で.envに定義された環境変数を取得(Padrinoの場合)

SqaleやHerokuといったPaaSサービスを利用していると環境変数を.envというファイルに定義しておくと、アプリケーション側でそのファイルの内容を環境変数として解釈してくれますが、rack-envというGemを利用すると開発環境でも.envで記載した内容を環境変数…

ccchartでグラフを描画する

ccchartというグラフ描画ライブラリがとても使いやすくて便利だったのでメモ。もし実際に利用する場合は、サンプルやドキュメントが充実しているのでそちらを参照した方が良いと思います。 最近、REMPで運営者用の管理画面を作っていることは以前書きました…

ActiveRecordで結果を単純な配列を得る(特定のカラムの)

特定のカラムを指定して検索した結果は素直にすると、 Visitlog.select([:normalize_count]).where(:group_id => 3, :visitor => '123') => [#<Visitlog normalize_count: 0.0833333>, #<Visitlog normalize_count: 0.0833333>,...] となるのだけど、これを [0.08333, 0.0833, ...] といった具合の配列で得たい場合、ActiveRecordにpluck</visitlog></visitlog>…

Ruby gem 'parallel' で並列処理

ふたまわり位遅れてますが、gemライブラリのparallelを使うと並列処理が簡単に書けて便利。 例として、とあるグループ別に記録されている訪問ログに対して各訪問者別の処理をする場合、以下の様な具合でかける。 require 'parallel' processor_count = Paral…

"Redis To Go"でRedisを使う

RedisをSqaleで動かしている自作サービスから利用したいと思ったのですが、今、手元にすぐ利用できるサーバが無いので"Redis To Go"というRedisのホスティングサービスを利用してみました。 無償のプラン(Nanoプラン)であれば、 5MbyteまでのDBが作成可能 ホ…

Rubyで多重ループを抜ける方法

breakではなくて、catch〜throwするのが流儀なんですね。 catch :loop do foo.each do |onefoo| bar.each do |onebar| # いろいろ処理 throw :loop if count > 5 end end end なんちゃってで書いてるからこういうところで引っかかる...。 参照 スコープ、制…

Mongoidで更新日時の範囲で絞込み

2回調べたので記録しておく。 Status.where(:updated_at => 25.minute.ago..15.minute.ago) どう見てもそのまんまだろうという話なのだが、情けないかな頭にパッと出てこない。 普段から常にARとかMongoid使っていないと駄目なんだろうなぁ...。

ImpasというAPIサービスを作った

個人でささやかにWebサービスを運営されている方向けにImpasというAPIサービスを作りました。 http://impas-hideack.sqale.jp/ このサービスは「twitter上でのツイート数、facebook上でのいいね数、はてなブックマークでのブックマーク数で簡単にランキング…

PadrinoアプリでNewrelic

New relic New relicはパフォーマンス監視サービスでRackアプリケーションの場合、用意されたnewrelic_rpmというGemをインストールするのみでNew relicが用意するダッシュボードでページが表示されるまでのパフォーマンスの詳細な内訳(Ruby自体の処理時間、D…

curlコマンドでAPIサーバにJSONでPOSTリクエストする方法

APIサーバへcurlコマンドでPOSTリクエストし、そのリクエストBODYに任意のJSON文字列を指定したい場合の方法を2回調べたのでメモしておく。 curl -X POST -d '{"url":"http://remp.jp"}' http://hoge.jp/api/registration いい加減覚えよう…。

ストーリーボードのバックエンド等々のお話

ストーリーボードをSqale(http://sqale.jp )へ運用を移管したのは以前簡単にここにも書きましたが、一度どういった技術を使っているのかまとめがてら整理してみます。 実装 現在、実装周りでは、 アプリケーションフレームワーク: Padrino データベース: Mon…

Padrinoでpryを使う

Padrinoでpadrino console使うと標準ではirbが立ち上がりますが、これをPryに切り替えたい場合、Gemfileに以下の内容を追加するだけですぐに使えました。 #Gemfileに以下の2行を追加 gem "pry" gem "pry-padrino" 試してみる。 $ padrino console => Loading…

Mongoidでsumする話

SQL的に select sum(file_size) from Pictures where user_id=10; といって書く様な処理をmongoidでさせるのどうすればいいのかと調べたのでメモ。 愚直に、 size = Picture.where(user_id: 10).sum(:file_size) でよいのですね。そのまんま。

Padrinoでormをmongoidに指定した場合のGemfileにmongoが無い...?

Padrino (Padrino v. 0.10.6) でORMをmongoidに指定した場合 $ padrino g project projectname -t rspec -e erb -d mongoid $ padrino start /usr/local/Cellar/ruby/1.9.3-p125/lib/ruby/gems/1.9.1/gems/bundler-1.2.0.pre/lib/bundler/runtime.rb:68:in `…

Padrinoで追加したRakeタスクをProduction環境として実行する

padrinoで作っていたrakeタスクを... $ padrino rake tasknameといった具合に実行しようとするとdevelopで実行されていてrakeタスクの中で呼んでいたmongoidがdevelopを向いていて本番用のデータベースを向いて実行されない。 よくよく考えると環境変数設定…

Padrinoで任意のrakeタスクを追加する

Padrinoでは、rakeタスクを実行したい場合、特にRakefileを配置しなくてもrakeコマンドを付与することで実行することができる。 $ padrino rake (実行したいrakeタスク) rakeタスク自体は、Padrinoの場合、 ~/lib/tasks ~/tasks ~/test ~/spec に配置されれ…

RubyGemsでインストールしたライブラリのソースコード位置を確認する方法

2回調べたのでメモとして記録。 RubyGemsでインストールしたライブラリ等の中身を確認したくなったときに、その場所を確認するには % gem which sinatra /usr/local/Cellar/ruby/1.9.3-p125/lib/ruby/gems/1.9.1/gems/sinatra-1.3.2/lib/sinatra.rbで確認す…

Padrino事始め

いままでREMPでは、フレームワークにSinatraを使ってAPI等々の実装を行なってきたのですが、機能を足すたびに記述が長くなってしまい、またview等を追加する場合にもスケルトン生成を主導手動で行わければならないといった点があるので、やはり少し大きめの…

bit.lyで短縮されたURLのクリック数をRuby(Nokogiri)でスクレイピングする

bit.lyで短縮されたURLのクリック状況は短縮されたURLの末尾に'+'をつけると知ることができるので、そこからクリック数をスクレイピングしてみようという話。*1 # bitlycun.rb require 'nokogiri' require 'open-uri' url = "https://bit.ly/#{ARGV[0]}+" pa…

REMP Ver.2.5 リリースしました(してました)

REMP Ver.2.5をリリースしました。REMPを利用しているユーザのオンライン状態を確認できるようになり、デスクトップへの通知に対応しました。また操作パフォーマンスも大幅に向上しています。 URL2012-03-25 23:06:27 via web と、twitterではお知らせしたの…

unicornを使ってみた(2) - REMPにおけるメモリ利用量の変化

では、実際に現在のREMPの場合において、どの程度メモリ使用量が変化したのかを確認してみました。 Apacheをフロントのリバースプロキシとして、背後にRack用のWebサーバ(Thin or unicorn)を動かすという挙動はかわらないので、Thinとunicornの両方のサーバ…

unicornを使ってみた(1) - 導入

REMPで今までApacheのリバースプロキシを通してthinサーバでAPIを稼働させていたのですが、稼働時間が長くなるとメモリの利用割合が増える状況が続いていたため、どうしようかと悩んでいたところ会社でmizzyさん(@gosukenator)からunicornだとメモリ利用量が…

thinサーバをプロセス別に再起動させる方法

自分用メモ。 サーバ上で起動させているThinサーバを再起動させたい場合、 $ thin -C thin.yaml restart と行うと、yamlでthinのプロセスが常駐する様に設定していた場合、一度全部のプロセスを閉じた後、設定数分のプロセスの起動が行われるため、接続が不…

mongo DBのバックアップファイルから特定のドキュメントをリストアする

REMP開発中に誤爆して本番環境上の開発者のプレイリストがうっかり意図しない内容に更新してしまうというケースが生じたため、デイリーでとっているmongo DBのバックアップから復旧させてみました。*1 行いたいのは、特定のユーザのプレイリストのみの復旧な…

PUSHERでWebhookを行ってみる

PUSHERでWebHookができるという記事がブログで紹介されてますよ!と会社で教えてもらったので、試してみました。 先日試してみたwebsocket版の通知とは異なってWebHookなのでユーザが設定する任意のURLに対してPUSHリクエストがあったことをHTTPのPOSTで通知…

PUSHERを使ってWebsocket経由のPush通知を行ってみる

Websocket周りを使ってみたいと思っていろいろ試行錯誤をしていたのですが、PUSHERというAPIサービスを利用すると思いの外容易にWebsocketを既存のWebサービスに使えそうなので使ってみました。 (激しい一週遅れ感がありますが…。)例えば既存のWebアプリに…

Rubyでmemcachedを使う

REMPのAPI周りでキャッシュを使いたくなったので、memcachedを使おうと思ったのだけどRubyで使う場合のクライアントを知らなかったので簡単にまとめ。 Ruby用のmemcacheクライアントはいくつかある様なのだけど、dalliというクライアントが一般的な様なので…

REMP(レンプ)開発に参加してますよ

そういえば、REMP(レンプ)というYoutube動画を連続再生できるWebアプリの開発に参加してますー*1。 Mashup Award 7 にも応募したりしましたよ。 動作環境はgoogle chromeがインストールされているPCでfacebookアカウントがあれば利用することができます。 RE…

Solrの検索クエリーとMySQLの検索クエリーの対応

Solrで検索クエリーを作るときにどうしてもSQLクエリが先に出てしまうので対応をメモ。 クエリーパラメータでいうとqですね。 検索式 MySQL*1 Solr 一致検索 WHERE title="foo" title:foo 全件 (where無し) *:* AND WHERE title="foo" AND price=200 title:f…

SinatraアプリをApache2のmod_proxy_balancerを通してThinで動かす(2) -mod_proxy_balancerの設定

続けて、Apache2の設定。ここでは、既にmod_proxyが入っているものとします。 フロントのApache2から複数起動しているThinのサーバに振るためにmod_proxy_balancerを入れます。 Ubuntuであれば、 $ sudo a2enmod proxy_balancer で、mod_proxy_balancerが有…

SinatraアプリをApache2のmod_proxy_balancerを通してThinで動かす(1) - Thinの設定

今、WebアプリケーションのAPIサーバをRubyのフレームワークのSinatraでつくっていて、これを本格的に動かすときにWebサーバをどうしよう。ということになって、Thinが良いらしいという情報を得たので導入してみた。 現状、動いているApacheサーバがあるので…

RubyでHTTPSリクエスト発行する

Rubyでプログラム書いていてWeb系のAPIにHTTPSでアクセスする必要があったので調べた。 RubyでPOSTメソッドを発行するには以下の様に標準添付されているライブラリのnet/httpを利用すればよい。 #接続先ホスト名 hostname = "www.foo.bar" #接続先パス reqpa…

Rubyでnilの判定

Rubyでnil (空オブジェクト) の判定は nil? で行える。*1 if修飾子で書くと綺麗に書ける。やはりRubyで書くと読みやすいな。 def foo do res = db.find("id" => 1) return 'error' if res.nil? # resが空オブジェクトの場合は 'error' を返却 #ゴニョゴニョ…