2011-11-06
2011-07-21
tcpdumpの使い方メモ
例えばmysqlだと以下でselect文がみれる。
sudo /usr/sbin/tcpdump -l -i eth0 -A -n -s 0 dst port 3306 | grep SELECT
unix ドメインソケットにながしてるデータを見る方法がないかあとで調査
2011-06-25
railsのデフォルト起動ポートを変更する方法
config/boot.rbに以下を追記する
require 'rails/commands/server' module Rails class Server def default_options super.merge({ :Port => 4000, }) end end end
2011-06-04
gitで迷子になった(no branch)に復帰する方法
gitを使って開発しているときに、以前のコミットのハッシュを直接指定してブランチを切らずにcheckoutすると(no branch)という無名のブランチができます。
どうしてそんなことをするかというと、例えば、開発を進めてる途中で別のやり方を思いついて以前の状態からやり直したいけど、あんまり自信ないからbranch切って名前つけるのはめんどくさい、みたいなときとか。
まあブランチきればすむ話ですが、とにかくno branchで作業しちゃうときもあるのです。そういうときに限ってうまく実装できて、no branchで作業していることを忘れてそのままcommitしてしまったりします。
で、なにげなくmasterに戻ってみるとさっきの作業内容が見えなくなって焦るわけです。
そういうときはno branchでコミットしたときのハッシュ値を直接指定してやればno branchでの状態に戻れます。no branchでコミットしたときのハッシュ値を確認する方法は知る限り2つあります。
1つめは、no branchから別のブランチに移ったときのメッセージから拾う方法です。
% git checkout master Previous HEAD position was 49aaa59... foo Switched to branch 'master'
checkoutしたときに直前のハッシュが表示されるので、これが残ってれば問題ありません。
が、そもそもno branchがみえなくなって焦るような人は、こういうメッセージはスルーして迂闊に別作業をやっちゃったりしてると思うので期待できません。
2つめは、.git/logs/HEAD を調べる方法です。(2011-06-26追記:git reflogまたはgit log -g --oneline でも同等のものが確認できます)
.git/logs/HEADはプレーンテキストなのでこれをたどればgit logに表示されないコミットも確認できます
% cat .git/logs/HEAD 0000000000000000000000000000000000000000 2759433440f4206e12ae1f2360e5c37f960e7bb6 takayuki <hoge@gmail.com> 1307189044 +0900 commit (initial): first 2759433440f4206e12ae1f2360e5c37f960e7bb6 4aaac8e7ff28ba47eeb32c312059b7b36fe62617 takayuki <hoge@gmail.com> 1307189060 +0900 commit: second 4aaac8e7ff28ba47eeb32c312059b7b36fe62617 2759433440f4206e12ae1f2360e5c37f960e7bb6 takayuki <hoge@gmail.com> 1307189084 +0900 checkout: moving from master to 2759433440f4206e12ae1f2360e5c37f960e7bb6 2759433440f4206e12ae1f2360e5c37f960e7bb6 49aaa59fb6137ef818a8ca4129fdbad07805586f takayuki <hoge@gmail.com> 1307189119 +0900 commit: third 49aaa59fb6137ef818a8ca4129fdbad07805586f 4aaac8e7ff28ba47eeb32c312059b7b36fe62617 takayuki <hoge@gmail.com> 1307190160 +0900 checkout: moving from 49aaa59fb6137ef818a8ca4129fdbad07805586f to master
これで目的のコミットのハッシュ値を指定してmergeするなりcheckoutしてbranchきるなりすればOKです。
2011-05-29
c++のコンテナをストリームに出力するコードスニペット
どういうことがしたいかというと、
for (vector<string>::iterator it = lis.begin(); it != lis.end(); ++it) { cout << *it << endl; }
のようなループをかくのが面倒なので
cout << lis << endl;
のように書きたい。
これをやるにはtemplateパラメータにtemplateをつかってoperator<<をオーバーロードしてやればまあまあ簡単にかける。
forward_iteratorを実装してるコンテナならなんでもいけるはず。ネストしててもOK
テンプレートパラメータが3つのコンテナ用の定義でlessとgreaterに分けてるのは、コンパイラに型推論をうまくやってもらうため。(テンプレートパラメータだけではstringの型と見分けがつかないので)
2011-06-04追記
古いコンパイラだとコンパイルできないかも
2011-04-29
ruby開発環境構築メモ - xmpfilterを使ってrubyスクリプトに注釈をつける
rcodetoolsを入れて快適なemacs生活をエンジョイしたい。
sudo gem install rcodetools
rcodetoolsをいれるとxmpfilterというコマンドにrubyスクリプトを食わせると、コメントで注釈をつけてくれる
これをemacsで使うためのelispがパッケージにはいってるので、それをload-pathの通っているところにコピーする。
.emacs.d/tmpがないと実行時にエラーがでたので、mkdirしておく
cp /usr/lib/ruby/gems/1.8/gems/rcodetools-0.*/*.el ~/.emacs.d/elisp/ cp /usr/lib/ruby/gems/1.8/gems/rcodetools-0.*/*.elc ~/.emacs.d/elisp/ mkdir ~/.emacs.d/tmp
.emacsはanything-rcodetoolsにかいてある通り。(fastriのパスとかキー設定は適宜)
(require 'anything) (require 'rcodetools) (require 'anything-rcodetools) ;; Command to get all RI entries. (setq rct-get-all-methods-command "PAGER=cat /usr/bin/qri -l") (define-key anything-map "\C-z" 'anything-execute-persistent-action)
以上でM-x xmp とするとxmpfilterがバッファに適用される。
2011-04-23
rails3でrinariからmysqlにつなぐメモ
rails3でmysqlを使おうとすると、gem mysql2 を要求された。
なので、config/database.ymlには以下みたいになるが、rinari-sql は "sql-<adapter名>" という名前の関数を探しにいくので、emacs側でsql-mysql2がないというエラーになる。
development: adapter: mysql2 database: foo host: localhost port: 3306 username: bar password: baz encoding: utf8 pool: 5 timeout: 5000
これを避けるには、以下のようにしてsql-mysql2にaliasをはるelispをかけばOK
(defalias 'sql-mysql2 'sql-mysql)
2011-04-08
haskellのリスト内包表記で格子点列挙
haskellのリスト内包表記について勉強してるときにたまたまこの記事を見つけたので試しにやってみた。
http://d.hatena.ne.jp/odz/20070131/1170284561
main = mapM print (mesh [[1..10],[1..10],[1..10]]) mesh [] = [[]] mesh (x:xs) = [ x':xs' | x' <- x, xs' <- (mesh xs) ]
パフォーマンスは調べてません。
もっといいやり方はありそうだけど、そこそこ直感的。。かな?
リスト内包表記って気持ち的にはSQL書くのに近い気がする。
2011-03-27
ruby環境構築メモ - fastri編
いまさらだけど、そろそろまじめにrubyの開発環境を整えようと思ったのでとりあえずfastriを導入した。
5分でおわると思いきや地味に苦労したので作業履歴メモ
手順
- 最新版のソースをおとす
- 展開してsetup.rbを実行
- 'fastri-server -b' でインデックス作成
- 'fastri-server -B' でフルテキストのインデックス作成
- 'fastri-server' で起動
- qri Array みたいなかんじで使う
ところがqriを使おうとすると以下のようなエラーが。。
/usr/lib/ruby/1.8/rdoc/ri/ri_paths.rb:61: uninitialized constant Gem::Version (NameError) from /usr/lib/ruby/1.8/rdoc/ri/ri_paths.rb:57:in `each' from /usr/lib/ruby/1.8/rdoc/ri/ri_paths.rb:57 from /usr/local/lib/site_ruby/1.8/fastri/util.rb:38:in `require' from /usr/local/lib/site_ruby/1.8/fastri/util.rb:38 from /usr/bin/qri:6:in `require' from /usr/bin/qri:6
色々試した結果、以下のようにfastri/util.rbを書き換えたらとりあえず動くようになった。
--- /home/takayuki/tmp/util.rb 2011-03-27 01:25:51.000000000 +0900 +++ /usr/local/lib/site_ruby/1.8/fastri/util.rb 2011-03-27 01:22:55.000000000 +0900 @@ -35,7 +35,7 @@ # don't let rdoc/ri/ri_paths load rubygems.rb, that takes ~100ms ! emulation = $".all?{|x| /rubygems\.rb$/ !~ x} # 1.9 compatibility $".unshift "rubygems.rb" if emulation -require 'rdoc/ri/ri_paths' +#require 'rdoc/ri/ri_paths' $".delete "rubygems.rb" if emulation require 'rdoc/ri/ri_writer'
ちなみに環境は以下の通りです. OSはdebian Lenny
% gem --version 1.6.2 % ruby --version ruby 1.8.7 (2008-08-11 patchlevel 72) [x86_64-linux]
参考
- http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=588125
- http://arika.org/diary/2010/08/30/ruby-1-9-2-and-rubygems-1-3-7-and-gem-path
TODO
- rvmを導入する
2011-03-22
twitterやfacebookのOAuthをつかってrails+omniauthでログイン機能を実装するメモ その2
前回(http://taksatou.blogspot.com/2011/03/twitterfacebookrails.html) 、OAuthで認証するところまでできたので、今回はtwitterアカウントでログインするところを作ります。
omniauthのrailsチュートリアルビデオのpart2に大体対応してますが、ここでの内容はちょっと変えてます。
- http://railscasts.com/episodes/236-omniauth-part-2
rails generate
以下のようにしてdeviseのセットアップとmigrationをします。
emailとpasswordはつかわないので消します。
rails g devise:install rails g devise user rails g migration AddOauthTokenAndOauthTokenSecretToAuthentications oauth_token:string oauth_token_secret:string rails g migration RemoveEmailAndEncryptedPasswordAndPasswordSaltFromUsers email:string encrypted_password:string password_salt:string rake db:migrate
model
authenrication.rb
class Authentication < ActiveRecord::Base belongs_to :user end
- attr_accessibleは必要ないので消します
user.rb
class User < ActiveRecord::Base has_many :authentications devise :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable def password_required? false end end
- 今回の場合、userは一つのtwitter認証情報をもつだけなのでhas_manyはおかしいと思うかもしれないですが、今後facebookとかとも連動させたくなったときのためにこうしてます。
- devise の :validatable パラメータは削除してます。
controller
前回編集したAuthenticationsControllerをさらに以下のように編集します。
class AuthenticationsController < ApplicationController def create omniauth = request.env['omniauth.auth'] authentication = Authentication.find_by_provider_and_uid(omniauth['provider'], omniauth['uid']) if authentication sign_in_and_redirect(:user, authentication.user) elsif current_user # 既にログインしてるけど、facebookとかの権限も追加するとき current_user.authentications.create!(:provider => omniauth['provider'], :uid => omniauth['uid'], :oauth_token => omniauth['credentials']['token'], :oauth_token_secret => omniauth['credentials']['secret']) redirect_to authentications_url else # 新規ユーザのとき user = User.new user.authentications.build(:provider => omniauth['provider'], :uid => omniauth['uid'], :oauth_token => omniauth['credentials']['token'], :oauth_token_secret => omniauth['credentials']['secret']) user.save! sign_in_and_redirect(:user, user) end end
view
確認用にauthenticateのviewを以下のように編集します
<h1>Authentications</h1> <% if user_signed_in? %> Signed in as <%= current_user.id %> Not you ? <%= link_to "Sign out", destroy_user_session_path %> <% else %> <%= link_to "Sign in", "/auth/twitter" %> <% end %> <table> <tr> <th>User</th> <th>Provider</th> <th>Uid</th> </tr> <% if @authentications %> <% for authentication in @authentications %> <tr> <td><%= authentication.user_id %></td> <td><%= authentication.provider %></td> <td><%= authentication.uid %></td> <td><%= link_to "Destroy", authentication, :confirm => 'Are you sure?', :method => :delete %></td> </tr> <% end %> <% end %> </table>
routes.rb
前回設定した内容にdevise用の設定も追加します
devise_for :users resources :authentications match '/auth/:provider/callback' => 'authentications#create' root :to => "authentications#index"
確認
以上でセットアップはおわりです。
実際に http://localhost:3000/authentications にアクセスしてsign in をクリックしてうまくログインできれば成功です。
以下のようにすればコンソールでtwitterにポストの確認ができるはずです。
$ rails c Twitter.configure do |config| config.consumer_key = 'CONSUMER_KEY' config.consumer_secret = 'CONSUMER_SECRET' config.oauth_token = User.all[0].authentications[0].oauth_token config.oauth_token_secret = User.all[0].authentications[0].oauth_token_secret end Twitter.update 'hello, omniauth!'
まとめ
- 結構大変でした
- deviseとかomniauthとかそもそもrailsのことをよくわかってないので間違ってたら教えてください
twitterやfacebookのOAuthをつかってrails+omniauthでログイン機能を実装するメモ その1
OAuthをつかっていろんなサービスと連動したアプリケーションがつくりたくなったので調査。
railsでやるにはoauth_pluginとかwarden_oauthとか色々なプラグインがあるみたいだけど、omniauthがよさそうです。
rails初心者なので基本的にはomniauthのチュートリアルビデオに沿って作業します。
- https://github.com/intridea/omniauth
- http://railscasts.com/episodes/235-omniauth-part-1
自前でパスワードやメールアドレスは保持せずに、twitterやfacebookのアカウントを使ってログインできるようにするのが目標です。
ちなみにtwitter anywhereを使えば似たようなことはできそうですが、twitterに依存してしまうので今回はパス。
Contents
--
インストール
とりあえず以下を追記。nifty-generators, twitterはお好みで。deviseは後半で使います
gem 'devise' gem 'omniauth' gem 'nifty-generators', :group => :development gem 'twitter'
設定
omniauth.rb作成
config/initializers/omniauth.rbを作成
Rails.application.config.middleware.use OmniAuth::Builder do privider :twitter, 'CONSUMER_KEY', 'CONSUMER_SECRET' end
ここでセットするoauthアプリケーションは、twitter側で正しくcallback urlを設定しておく必要があります。
通常は http://yourhost.com/auth/twitter/callback のようなURLです。
そうしておかないと、twitterにリダイレクトされる前で 401 unauthorized となってはじかれます。
controller
ここではnifty generatorをつかいます
rails g nifty:scaffold authentication user_id:integer provider:string uid:string index create destroy
できたAuthenticationsControllerのcreateを以下のように書き換えます。
class AuthenticationsController < ApplicationController def create render :text => request.env['omniauth.auth'].to_yaml end
request.env['omniauth.auth']の部分は過去のバージョンではrequest.env['rack.auth']なので、うまくいかない場合はバージョンを確認してください。
routes.rb
callback用に以下を追記します
match '/auth/:provider/callback' => 'authentications#create'
ここまでやって http://localhost:3000/auth/twitter にアクセスしてtwitterで認証すると、yamlで認証情報が取得できているのが確認できます。
まとめ
以上でとりあえずOAuthでユーザ情報やcredentialをとることができました。
次回( http://taksatou.blogspot.com/2011/03/twitterfacebookoauthrailsomniauth.html )後半でtwitterでログインするところをつくります。
その他
- rails 3.0.3, ruby 1.8.7 を使用
2011-03-21
githubでPermission denied (publickey)
自分のgithubリポジトリに複数のホストからpushする方法についてメモ
% git push git@github.com:taksatou/config.git master
とかやって
Permission denied (publickey). fatal: The remote end hung up unexpectedly
なってしまう場合は公開鍵が登録されていない
のSSH Public Keys からpushしたいホストの公開鍵を登録すればOK
2011-03-19
Javascriptの統計ライブラリ jStatについて
jStat (http://www.jstat.org/) とはJavascriptでMATLABやRのような処理をするためのライブラリです。
(同名のjvm統計データ監視ツールとは関係ないです)
http://www.readwriteweb.com/hack/2011/03/jstat-its-like-r-for-javascript.php
でも紹介されてます。
R開発者のEd Borasky氏によると、これからはJavascriptでビジュアライズするのがトレンドらしいです。
というわけでちょっと遊んでみました。
準備
jStatは以下のものに依存してるけど、http://www.jstat.org/download から依存ライブラリをまとめてパッケージにしたものがダウンロードできるので特になにもしなくてOK。
- jQuery - version 1.4.4+ (http://code.jquery.com/jquery-1.4.4.min.js)
- jQuery UI - version 1.8.9+ (http://jqueryui.com/download/)
- flot - version 0.6+ (http://code.google.com/p/flot/downloads/detail?name=flot-0.6.zip&can=2&q=)
Bundleをダウンロードして(jstat-1.0.0.zip) 解凍すると、デモがindex.htmlにあるのでそれをブラウザで開くだけ。
デモ
試しにtwitterのpublic timelineに流れてるtweetの文字列長の正規分布のグラフをつくってみました。timelineがかわるとグラフも変わります。
ソースはこんなかんじです
$(document).ready(function() { $.getJSON("public_timeline.php", function(json) { var x = new Array(json.length); var sum = 0; for (var i = 0; i < json.length; ++i) { x[i] = json[i]['text'].length; sum += x[i]; } var mean = sum / json.length; var sum2 = 0; for (var i = 0; i < json.length; ++i) { sum2 += Math.pow((mean - x[i]), 2); } var variance = sum2 / json.length; var sd = Math.sqrt(variance); var distribution = jstat.dnorm(x, mean, sd); jstat.plot(x, distribution, {main: "tweet length distribution", type: "p"}); }); });
本家サイトにデモがあるのでそっちもみると雰囲気がわかると思います http://www.jstat.org/demonstration
まとめ
- 導入が簡単でブラウザさえあればいけるので、RやMATLABにくらべると敷居が低い感じ。
- jQueryがつかえればUI的な面で有利
- ブラウザでRを使いたい場合はRStudio ( http://www.rstudio.org/ ) とかもあるけど、RStudioは完全に開発者向けなのに対して、jStatはリアルタイムに集計結果を一般ユーザに見せたい、みたいなシチュエーションで重宝しそう
以下気になる点
- まだドキュメントがない
- Javascriptで実装されてるので複雑なことをやるにはちょっと非力かも??
2011-03-16
tmuxの複数セッション間でバッファを共有する方法
マルチモニタで開発してる場合、それぞれのモニタ毎に端末アプリをたちあげることになりますが、端末ウィンドウ間でコピペをしたいときにマウスを使用せざるをえなくなってめんどうです。
emacsをサーバモードで起動すれば大抵の場合は事足りるのですが、いつもemacsだけで完結できるとは限りません。
というわけでtmuxとかscreenをつかってコピペするわけですが、tmuxのセッションをまたいでバッファを共有する方法をしらなかったのでメモ。
manをみたところ、セッションをまたいでバッファをやりとりするのに以下コマンドが使えそうです。
copy-buffer [-a src-index] [-b dst-index] [-s src-session] [-t dst-session] (alias: copyb) Copy a session paste buffer to another session. If no sessions are specified, the current one is used instead.
毎回コマンドをたたくのはめんどうなので、以下のような設定をかきました
unbind C bind C run-shell "for i in `tmux list-session | awk -F':' '/attached/ {print \$1}'`; do tmux copyb -t \$i ; done"
dst-sessionは明示しないとだめなので、list-sessionでセッション一覧を取得して、アタッチ中のものすべてにコピーするようにしました。
なお、これも含めてその他もろもろの設定ファイルは以下においてます
2011-03-13
Cのプリプロセッサーについてのtips集
プリプロセッサ処理のみを行う(gccの場合)
gcc -E a.c
マクロの引数について
- ピリオド3つで可変長引数, __VA_ARGS__でその部分を展開
- 引数の頭に#をつけると文字列表記(ダブルコーテーションでくくられる)
- 引数の頭に##をつけると連結
#include <stdio.h> #define MY_PRINTF(...) fprintf(stderr, __VA_ARGS__) #define DEF(x, y) struct x##_##y##_t { static void f() { MY_PRINTF("%s, %s\n", #x, #y); } } DEF(foo, bar); int main(void) { foo_bar_t::f(); }
みたいなことができる
#ifdefと definedの違い
#if defined(VAX)は
#ifdef VAXと同じ。
definedの場合は
#if defined(VAX) && !defined(UNIX)みたいな書き方ができる
その他
- マクロの名前は特に制限はない
- 文字列やコメントの中にあるマクロ名は無視される
- コンマのはいったを引数を一つにまとめたい場合はカッコでくくる
pragmaとかpredefinedなマクロ
- 次回に続く(たぶん)