ホーム ブログ ページ 56

SQLの結果を見やすく表示する

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

普通にSQLを実行するとカラムが横に並んで表示されますがカラム数が増えてくるとレイアウトが崩れてしまうことが多いです。

MySQL/PostgreSQLともにカラムを縦に並べて表示する方法が用意されています。

MySQLは末尾の;を\Gに変えることで縦に表示ができます。

mysql> select * from table\G

PostgreSQLの場合は\xで縦と横の表示を切り替えることが可能です。

postgres=# \x

縦に表示することでカラム数が増えていてもレイアウトがくずれることなく見やすくなります。

サイトの配色を助けてくれる「Color Scheme Designer」

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

こんにちは。まいです。

サイトのデザインを作るとき、色をどうするか?というのも一つの悩みどころですよね。
そんな悩みをそっとサポートしてくれるのが「Color Scheme Designer」。


デザイナーにとっては色を決める時のサポートに、
デザイナー以外にとっては、サイト全体の配色をおまかせできちゃう優れたサイトです。

実際にちょっと使ってみましょうー。

まず、左にある丸いモノ…これで、サイト全体で何色使うかを選びます。
悩んだらとりあえず3色くらいを選んでおきます。

次に、左にある大きい円でメインの色を決めていきます。
もっと濃くとか薄くとかは後で調整できるので、とりあえずどのくらいの色にするか?
だけを小さい●をドラッグしながらきめていきます。

今回は黄緑で。
ちなみに、メイン以外は赤と紫になってますが、
ちょっと気に入らないなぁ、と思ったらこれも○をドラッグすることで変更できます。
2つのうちどちらかを動かす事で、もう一つも自動的に動いてバランスをとってくれます。

次に色の明るさやコントラストを調整します。
左が明度、右がコントラストの調整です。
なんだか全体的にビビッドなので、ちょっとパステルっぽく。

色はだいたい作ったけど…実際のサイトになるとどんな雰囲気になるのかな?
という素朴なニーズもカバーするのがColor Scheme Designerのニクいところ。
右下にある「Light(Dark) page example」をクリックすると、サンプルを見る事ができます。

ちょっと印象が違うかも?と思ったら色を調整し直して、何度でも確認できます。

色の調整もおわってこれでバッチリ!となったら、
左の円の下にある「Color List」をクリック。16進数の値が表示されるので、
間違いなく同じ色を使う事ができます。

Vim のタブをそこそこ活用する

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

Vim のタブ機能について書きます。

空白文字のほうのタブではなくて、インターフェイスのほうのタブです。

目次

  1. タブは何なのか
  2. タブ基本
  3. タブを少し扱いやすくしてみる
  4. タブの表示を少しわかりやすくしてみる

1. タブは何なのか

Vim のタブ

Vim のタブはタブブラウザのタブと同じようなインターフェイスで、使われかたもだいたい同じです。

だいたい同じ、というのを補足すると、

  • タブブラウザなどでは一般的に、ひとつのタブにひとつのウェブページが表示される
  • Vim のタブでは、ひとつのタブに複数のウィンドウ(バッファ)が表示され、ウィンドウの配置など画面の表示を管理できる

というところが少し違います。

Vim のタブがあると、なにがうれしいのか

バッファ切り替えだけでも複数ファイルを編集できるし、ウィンドウもひとつの画面で複数開けるし、そこに加えてなんでタブが必要なのか?と思うかもしれませんが、あったらやっぱり便利です。

考えられるうれしいかもしれないケース:

  • 違うプロジェクトのファイルを同じ画面で開いてると混乱するので、タブで分けて作業すると少しわかりやすくてうれしい
  • Rails でファイルを編集しているとき、モデルベースでタブを開いておき、作業する画面を分けると少しわかりやすくてうれしい
  • diffsplit している画面はのこしておいて、新しいタブで別のファイルを編集すると、diff 画面と行ったり来たりして参照できてうれしい

などなど、実際のところうれしいかどうかちょっと微妙なところですが、とりあえずうれしいということにしておきます。

2. タブ基本

Vim のタブは vim, gvim 問わず使えます。

ざっくりと、以下のコマンドがタブを扱うコマンドとして用意されています。

割とよく使う(と思う)コマンド
コマンドうごき
:tabe (:tabedit)新しいタブで引数のファイルを開く。引数がなければ新規ファイルを開く
:tabn (:tabnext)右隣のタブに移る。引数(数値)があれば、その番号のタブを開く(:tabn 1 とか)
:tabN (:tabNext), :tabp (:tabprevious)左隣のタブに移る。引数があればその数値分先の左のタブに移動
:tabr (:tabrewind), :tabfirst左端のタブに移る
:tabl (:tablast)右端のタブに移る
:tabc (:tabclose)今いるタブを閉じる
:tabo (:tabonly)今いるタブ以外を閉じる
:tabs開いているタブとそこに含まれるバッファ一覧を表示する
gt (ノーマルモード)右隣のタブに移る。Ngt(1gt とか) で N番目のタブに移る
gT (ノーマルモード)左隣のタブに移る。NgT(1gT とか) で 左にN個先のタブに移動する
CTRL-W gf (ノーマルモード)カーソル位置の単語から推測されるファイルを開く
そこそこ使う(と思う)コマンド
コマンドうごき
:tabf (:tabfind)引数で find して新規タブで開く
:tabm (:tabmove)引数(数値)+1番目にタブを移動させる
:tabd (:tabdo):bufdo のタブ版、後戻りのできない系のコマンドなので勇気が必要
:tab XXXXXX というウィンドウが開かれる系のコマンドを、新規タブで開くようにする

最後の :tab XXX というのは、例えば、:tab help などとすれば新規タブでヘルプが開かれ、:tab sp とすれば、今いるバッファを新規タブで開く、などということができます。

XXX の場所には diffsplit など一部のコマンド以外ならたいてい使えるので :tab copen とか :tab helpgrep xxx とかもできます。

その他、詳細は :help tabpage で確認してみてください。

3. タブを少し扱いやすくしてみる

ながくなってきたのでさっくりいきます。

上記のよく使うコマンドなどはキーマッピングしておくと便利なので、ついでにやっておきましょう。

" 一例
nnoremap <silent> <leader>tf :<c-u>tabfirst<cr>
nnoremap <silent> <leader>tl :<c-u>tablast<cr>
nnoremap <silent> <leader>tn :<c-u>tabnext<cr>
nnoremap <silent> <leader>tN :<c-u>tabNext<cr>
nnoremap <silent> <leader>tp :<c-u>tabprevious<cr>
nnoremap <silent> <leader>te :<c-u>tabedit<cr>
nnoremap <silent> <leader>tc :<c-u>tabclose<cr>
nnoremap <silent> <leader>to :<c-u>tabonly<cr>
nnoremap <silent> <leader>ts :<c-u>tabs<cr>

なんとなく似たようなマッピングなので共通部分を抽象化しておくなどしてみます。

" 一例
nnoremap [TABCMD]  <nop>
nmap     <leader>t [TABCMD]

nnoremap <silent> [TABCMD]f :<c-u>tabfirst<cr>
nnoremap <silent> [TABCMD]l :<c-u>tablast<cr>
nnoremap <silent> [TABCMD]n :<c-u>tabnext<cr>
nnoremap <silent> [TABCMD]N :<c-u>tabNext<cr>
nnoremap <silent> [TABCMD]p :<c-u>tabprevious<cr>
nnoremap <silent> [TABCMD]e :<c-u>tabedit<cr>
nnoremap <silent> [TABCMD]c :<c-u>tabclose<cr>
nnoremap <silent> [TABCMD]o :<c-u>tabonly<cr>
nnoremap <silent> [TABCMD]s :<c-u>tabs<cr>

タブ操作関連のマッピングという強い意思があらわれてよかったです。

プレフィクス・サフィックスで分離できたので変更も容易になってよかったです。

参考:キーマッピングのプレフィックスキーについての覚書 – くふんとなく(旧)

長くなってきていますが、もうすこし便利にしたいです。

たまにですが、さっきまでいたタブに戻りたいが、今どこにいるかわからないので gtgtgtgt などとやる羽目になることがあります。

そういう事態を回避するために tabrecent.vim を活用しましょう。

参考:tabrecent.vimを書いてみた – 永遠に未完成

使いかたはとてもわかりやすく、:TabRecent コマンドで直前までいたタブに戻れます。引数に数値を指定すればその数値ぶん前にいたタブに戻れます。

ということでこれもマッピングしておきます。

nnoremap <silent> [TABCMD]r :<c-u>TabRecent<cr>

4. タブの表示を少しわかりやすくしてみる

長くなってきていますが、まだもうすこし便利にしたいです。

直接タブ番号を指定して移動したいというケースはやはり頻繁にあります。なのにデフォルトではタブ番号が表示されておらず不親切です。

なので番号をふりましょう。

以下では gvim でのタブ表示の例です。ぱっと見のわかりやすさの都合で GUI のほうのタブ表示について書いています。

タブの表示は guitablabel を設定から設定できます。

見たほうが早いと思うので以下に書いてみます。

" 個別のタブの表示設定をします
function! GuiTabLabel()
  " タブで表示する文字列の初期化をします
  let l:label = ''

  " タブに含まれるバッファ(ウィンドウ)についての情報をとっておきます。
  let l:bufnrlist = tabpagebuflist(v:lnum)

  " 表示文字列にバッファ名を追加します
  " パスを全部表示させると長いのでファイル名だけを使います 詳しくは help fnamemodify()
  let l:bufname = fnamemodify(bufname(l:bufnrlist[tabpagewinnr(v:lnum) - 1]), ':t')
  " バッファ名がなければ No title としておきます。ここではマルチバイト文字を使わないほうが無難です
  let l:label .= l:bufname == '' ? 'No title' : l:bufname

  " タブ内にウィンドウが複数あるときにはその数を追加します(デフォルトで一応あるので)
  let l:wincount = tabpagewinnr(v:lnum, '$')
  if l:wincount > 1
    let l:label .= '[' . l:wincount . ']'
  endif

  " このタブページに変更のあるバッファがるときには '[+]' を追加します(デフォルトで一応あるので)
  for bufnr in l:bufnrlist
    if getbufvar(bufnr, "&modified")
      let l:label .= '[+]'
      break
    endif
  endfor

  " 表示文字列を返します
  return l:label
endfunction

" guitablabel に上の関数を設定します
" その表示の前に %N というところでタブ番号を表示させています
set guitablabel=%N:\ %{GuiTabLabel()}

設定完了です。これを $MYGVIMRC に記述して :source $MYGVIMRC などとすると反映されますが、gvim を再起動したほうが安心です。

詳しくは :help setting-guitablabel で確認してみてください。

長いわりに実のないかんじですが、Vim のタブを活用して便利に暮らしましょう!

導入したら作業効率UPなフリーソフト10選(Windows編)

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

「さっきコピーしたURLをまた張りつけたい」
「画面キャプチャするの面倒くさい」
そう思った事はありませんか?
フリーソフトからいいソフトをお勧めします。

eclipクリップボード拡張ソフトです。クリップボード履歴をインクリメンタル検索できます。 無限に保存することもできます、とてもよいです。

nami2000軽量なアウトラインエディタです、なんでもかんでもメモします。

CaptureXPデスクトップなどをキャプチャ後、自動でペイント編集画面が開きます。 Windows vistや7にあるsnipping toolの代わりに使います

gyazowinデスクトップの選択範囲をgyazoのサーバにアップロードし、そのURLをクリップボードに格納するだけ

joeタスク切り替えを行うAlt+TABを少し便利にします。 一覧は見やすく、マウス等でも選べます

qtzeroメニュー型のタスクマネージャで、不要なプロセスを素早くkillできたりします

sumatraPDF快適なPDF閲覧ソフトで、レジストリ等使いません

tclockタスクトレイを改造できます。 時計の表記を変えたり、CPU/メモリ使用率なども表示可能です。 他にもスケジューラ機能などもあり、15分間隔でメモリの解放したりしてます

afxファイラーです、windows標準のエクスプローラから乗り換えて慣れてきたら快適です

nyacuswindowsのコマンドプロンプト上で動作するコマンドラインシェルです。 補完機能やlinuxの基本的なコマンドが使えます。

ruby on railsでデータをExcelファイルに出力する。 to_xls Plugin編

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

こんにちは、KBMJの中平@railsエンジニアです。

今回はruby on railsでデータをExcelファイルに出力する 方法ついて書きます。

よく、Webシステムでデータをファイルに出力する際にはCSV形式で出してしまう事が多いと思いますが、

CSV データをExcelで開くと、「001234」というデータの頭ゼロが消されてしまい「1234」と数値として表示されてしまう事があるため、 CSVではなくExcel形式で出力したい時はないでしょうか?

また、rubyでデータをExcelに出力するプラグイン はいくつか存在しますが、

Excelがはいっていないとだめだったり、windowsでしかつかえなかったり、記述がExcelのシートや セルを意識しないとダメだったりと、めんどくさいものが多く、

ruby on railsで簡単に出力できるプラグインはあまりないのではないかと思います。

そこで、今回はruby on railsで簡単にデータをExcelファイルとして出力することができる、to_xlsというpluginの使い方について書こうと思い ます。 *csv出力の方法はこちら→http://doruby.kbmj.com/nakahira_on_rails/20100318/ruby_on_rails_CSV__to_csv_Plugin_

環境

OS : Windows Vista
Ruby : 1.8.6
ruby on rails : 2.1 (2系以上ならto_xlsが使えると思います)

to_xlsのインストール

ruby script/plugin install git://github.com/arydjmal/to_xls.git

設定ファイルの編集

config/initializers/mime_types.rb

Mime::Type.register “application/vnd.ms-excel”, :xls

を追加

コントローラーのメソッドに以下のコードを記述

def index
    @users = User.all

    respond_to do |format|
            format.html
            format.xml { render :xml => @users }
            format.xls { send_data @users.to_xls }
    end
end

@users.to_xls で取得したデータをExcel形式にしています。
また README.rdocに書いているオプションを解説すると

 @users.to_xls  
 すべてのカラムを出力

 @users.to_xls(:only => [:last_name, :role]) 
 onlyで指定したカラムを出力 

  @users.to_xls(:headers => false) 
 先頭行にカラム名を出力しない

  @users.to_xls(:except => [:last_name, :role]) 
 exceptで指定したカラム以外を出力

  @users.to_xls(:except => :role, :methods => :admin?) 
 :methodsはカラム名?で記述したカラムのデータのnullを判定しているぽい

 nullだったらfalse null以外はtrueを表示している

このような動作をするようです。
このあたりは、find時に出力データをrails側で制御してもいいかもしれません。

実際にruby on railsでデータをExcelに出力する


コントローラー名/index/hoge.xls

というようにアクション名の後ろにファイル名をつけてブラウザでアクセスすると
データがExcel形式で出力されますので、ファイルに保存後Excelで開くとデータを見ることができます。(ファイル拡張子が違うという警告が出ますが気にしない)

なお、この出力したファイルをテキストエディタで表示してみるとわかるのですが、
実はデータはXML形式になっています。これはExcelの「XMLスプレッドシート」という形式になっており、ExcelファイルをXMLで記述した形になっています。

実際にExcelから適当にファイルを作ってファイル保存する時の形式を「XMLスプレッドシート」にして保存すると同じ形式になっていることがわかると思います。

* XMLスプレッドシートはExcel2003以上で使えると思います。



また、この to_xlsは、このままではセルや文字に色をつけることができませんが、Excelから「XMLスプレッドシート」形式でファイルを作成して、XMLの記述方法を参考にすることで

色の付け方などの方法をみてto_xlsプラグインをカスタマイズすることで色をつけたり文字フォントを変えることができそうです。

このto_xlsというpluginは簡単に導入できてコードも数行で済みますので、ruby on rails からCSVではなくExcel形式でデータ出力したい場合には試してみてはいかがでしょうか?

Ary Djmal / to_xls Plugin: Export to Excel in Rails the Easy Way
 http://arydjmal.com/2009/1/11/to_xls-plugin-export-to-excel-in-rails-the-easy-way

arydjmal’s to_xls at master – GitHub
 http://github.com/arydjmal/to_xls

RubyでExcelの読み込み

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

yukiです。

RubyでのExcelの読み込み方法を紹介します。今回はSpreadsheetというライブラリを使います。
xlsの拡張子に対応しており、xlsx(Office2007)には対応していない様です。
ちなみにこのライブラリ、Microsoft. Officeに依存していないので、Microsoft. Officeが入っていなくとも使う事が出来ます。

まずは環境から。

環境

OS : Mac OS X 10.5.8
Ruby : 1.8.6

spreadsheetのインストール

sudo gem install spreadsheet
では、実際に使ってみましょう。
既存のhoge.xlsを読み込みます。
require ‘spreadsheet’

xls = Spreadsheet.open(‘hoge.xls’, ‘rb’) #Excelファイルの読み込み
sheet = xls.worksheet(0) #0番目つまり1番始めのsheetを読み込む

#読み込みの開始が’0’から始まる。
sheet[0,1] #実際のExcelでは、1行目の2列目の値を読み込み
sheet[4,6] #実際のExcelでは、5行目の6列目の値を読み込み

こんな感じで読み込むことができます。
行単位で読み込む事も出来ます。
row = sheet.row(2) #3行目のデータを読み込み
row[2] #3行目の3列目のデータを読み込み

以上です。 書き込みもできるようなのですがそこはまだ勉強不足です。

【Java】アサーション

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

最近はRubyで仕事することが増えていますが、最初の案件がJavaだったこともあって、なんとなくJavaに愛着があります。
自宅で細々と勉強しててみつけた、Javaの「こんなの使うか?」って思った機能?オプション?を紹介します。

そいつは・・・

「アサーション」

Javaプログラムのコンパイル・実行は、windowsだとコマンドプロンプトで行います。
コンパイルは、
  javac ファイル名(拡張子付)
実行は、
   java クラス名
・・・ですね。

普段はeclipseなどの統合開発環境を使ってる方が多いと思うので、こういうコマンド類はあまり意識しないかと思います。

コンパイルや実行などのコマンドにはさまざまなオプションが指定できます。
実行時に指定できるオプションの1つが「アサーション」です。

まず、Javaのソースを書きます。

class Test{
  void method (boolean b){
    assert b: "b is " + b;
    if (b){
      System.out.println("OK");
    }else{
      System.out.println("NG");
    }
  }

  public static void main(String args[]){
    Test t = new Test();
    t.method(true);
    t.method(false);
  }
}

ポイントは3行目です。
アサーションを使うには、まずプログラムの中にassert文を埋め込んでおく必要があります。
その構文は以下の2通りです。

 assert boolean式;
 assert boolean式:式2;

boolean式には、プログラム実行時に真になる条件式を書きます。
条件を満たさない場合はAssertionErrorが発生します。
また、後者の式では、条件を満たさない場合に式2の結果を出力し、AssertionError発生を知らせます。
上記のサンプルソースでは、後者の書き方をしています。

アサーションは、プログラム中に埋め込んだだけでは使えません。
実行時のコマンドオプションで、使用を指定してやる必要があります。

実行時オプションは以下のとおりです。

アサーションを有効にする
-ea:システムクラスを除くすべてのクラスのアサーションを有効化
-ea:<クラス名>:指定されたクラスのアサーションのみを有効化
-ea: ...:デフォルトパッケージとそのサブパッケージに対するアサーションを有効化
-ea:<パッケージ名>...:指定されたパッケージとそのサブパッケージに対するアサーションを有効化
-esa:システムクラスのアサーションを有効化

アサーションを無効にする
-da
クラスやパッケージを指定したいときは、アサーション有効化オプションと同様に、:でつなげる

実行コマンドの例:java -ea Test

オプションは複数指定できますが(ex::-ea:Test -ea: …)、複数指定すると後から指定したオプションが優先されます。範囲を狭くするようなオプションが先にある場合がそちらが優先されます。

さて、ここで[-da]を指定して実行してやると、「OK」と「NG」が表示されます。
アサーションを無効にしているので、当然ですね。

しかし、[-ea]を指定して実行してやると「OK」と「Exception in thread “Main Thread” java.lang.AssertionError: b is false」が表示されます。
14行目でmethod()メソッドを呼び出した時に発生しています。

・・・とまぁ、このように使います。
普段eclipseを使っているのでコマンドはほとんど触りません。
そのため、アサーションの使いどころがいまいちわからないのですが・・・(^^;
アサーションの使いどころや注意点はありますが、今回は紹介ということで〆させていただきます。

CentOSに最新のImageMagickをインストールする(RPMで)

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

CentOS 5.4 で管理されている ImageMagickは 6.2.8.0 と古く新しいRMagickやらを使うとき何かと困ることがある。

今回は最新版のImageMagickをrpmでインストールする方法をご紹介します。

src.rpmからrpmをbuildします。

コマンドと実行結果を交えて手順を示します。

なお、RPMForgeが入っている事が前提です。

RPMForgeは以下のコマンドで使用可能になります。

$ sudo rpm -Uhv http://apt.sw.be/redhat/el5/en/i386/rpmforge/RPMS/rpmforge-release-0.3.6-1.el5.rf.i386.rpm

まずSRCのRPMを取得

wget ftp://ftp.kddlabs.co.jp/graphics/ImageMagick/linux/SRPMS/ImageMagick.src.rpm

下記ディレクトリがない場合は作りましょう。

$ sudo mkdir -p /usr/src/redhat/SOURCES

ソースRPMをインストール

[user@CentOS ~]$ sudo rpm -ivh --nomd5 ImageMagick.src.rpm
   1:ImageMagick            警告: ユーザ cristy は存在しません - root を使用します
警告: グループ cristy は存在しません - root を使用します
########################################### [100%]
警告: ユーザ cristy は存在しません - root を使用します
警告: グループ cristy は存在しません - root を使用します

(cristyってだれ)

jasper は yum で持ってこれないので下記よりダウンロードしてインストールします。

64bit の場合
$ wget http://centos.karan.org/el5/extras/testing/x86_64/RPMS/jasper-libs-1.900.1-7.el5.kb.x86_64.rpm
$ wget http://centos.karan.org/el5/extras/testing/x86_64/RPMS/jasper-devel-1.900.1-7.el5.kb.x86_64.rpm

32bit の場合
$ wget http://centos.karan.org/el5/extras/testing/i386/RPMS/jasper-libs-1.900.1-7.el5.kb.i386.rpm
$ wget http://centos.karan.org/el5/extras/testing/i386/RPMS/jasper-devel-1.900.1-7.el5.kb.i386.rpm

[user@CentOS ~]$ sudo rpm -ivh jasper-libs-1.900.1-7.el5.kb.i386.rpm
準備中...                ########################################### [100%]
   1:jasper-libs            ########################################### [100%]
[userCentOS ~]$ sudo rpm -ivh jasper-devel-1.900.1-7.el5.kb.i386.rpm
準備中...                ########################################### [100%]
   1:jasper-devel           ########################################### [100%]

djvulibre-develはRPMForgeより持ってきます。

$ sudo yum --enablerepo=rpmforge install djvulibre-devel

Installed:
  djvulibre-devel.i386 0:3.5.20-1.el5.rf

Dependency Installed:
  djvulibre.i386 0:3.5.20-1.el5.rf              libmng.i386
0:1.0.9-5.1              qt.i386 1:3.3.6-23.el5

Complete!

rpmbuildをインストールしてない方は入れます。

$ sudo yum install rpm-build

SPECSディクレトリに移動してImageMagickのspecを編集します。

perl-develはCentOSの場合perlに含まれるので削除します。

$ cd /usr/src/redhat/SPECS
$ sudo vi ImageMagick.spec

上から10行目付近のperl-develを削除
BuildRequires:  libtiff-devel, giflib-devel, zlib-devel, perl-devel
↓
BuildRequires:  libtiff-devel, giflib-devel, zlib-devel

では、RPMを作ります。

$ sudo rpmbuild -ba ImageMagick.spec

色々足りないといわれます。

エラー: ビルド依存性の失敗:
        freetype-devel は ImageMagick-6.5.8-6.i386 に必要とされています
        libpng-devel は ImageMagick-6.5.8-6.i386 に必要とされています
        giflib-devel は ImageMagick-6.5.8-6.i386 に必要とされています
        libwmf-devel は ImageMagick-6.5.8-6.i386 に必要とされています
        libtool-ltdl-devel は ImageMagick-6.5.8-6.i386 に必要とされています
        libxml2-devel は ImageMagick-6.5.8-6.i386 に必要とされています
        librsvg2-devel は ImageMagick-6.5.8-6.i386 に必要とされています

足りないものはまとめてyum でインストールします。

$ sudo yum install freetype-devel libpng-devel giflib-devel libwmf-devel libtool-ltdl-devel libxml2-devel librsvg2-devel

おそらく上記だけ40個以上のパッケージを必要とするのでインストールが終わるまでしばし待ちます。

再度トライ

$ sudo rpmbuild -ba ImageMagick.spec

成功するとコンパイルが始まります。

これも時間がかかるのでコーヒーでも飲んでましょう。

成功すると下記ディレクトリにRPMが6つできあがります。

/usr/src/redhat/RPMS/{arc}/

まとめてインストールしてしまいましょう。

$ sudo yum install --nogpgcheck ImageMagick-6.5.8-6.i386.rpm ImageMagick-c++-6.5.8-6.i386.rpm ImageMagick-c++-devel-6.5.8-6.i386.rpm ImageMagick-devel-6.5.8-6.i386.rpm ImageMagick-doc-6.5.8-6.i386.rpm ImageMagick-perl-6.5.8-6.i386.rpm

Installed:
  ImageMagick.i386 0:6.5.8-6   ImageMagick-c++.i386 0:6.5.8-6
ImageMagick-c++-devel.i386 0:6.5.8-6   ImageMagick-devel.i386
0:6.5.8-6   ImageMagick-doc.i386 0:6.5.8-6   ImageMagick-perl.i386
0:6.5.8-6

Complete!

これで最新のRMagickも楽にインストールできます。

基本すべてRPMで入れていったのでいざとなれば後から削除も可能です。

keepalivedとpoundでサーバ冗長化(LB編)

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

こんにちは。サンドリバー砂川です。

プロジェクトで冗長構成のサーバを構築する際
keepalivedとIPVSだと、kernel等のバージョンに気を配らなければならないので結構面倒です。
そこで最近は、IPVSの代わりにpoundを使って手軽に冗長化してたりします。
今回はkeepalivedとpoundを使って冗長化する方法を掲載します。

※今回はLB編なのでpoundが出てきません。
poundの方を知りたい方は、数日中に記事を書くのでもうしばらくお待ちください。
この記事で使用するソフト
keepalived

サーバIP例

  • LB01(master) 10.0.0.10
  • LB02(backup) 10.0.0.11
  • virtual IP(vip) 10.0.0.30

各サーバは2台以上でも可能ですが、今回は簡潔にするために2台で構築します。

LB01,02共通の作業

keepalivedインストール

IPVSとkeepalivedを連携させて冗長化をする場合、kernelのバージョン等に注意しなければなりません。しかし今回負荷分散部分はpoundに任せるため、単純にコンパイルするだけでOKです。

# cd /usr/local/src
# wget http://www.keepalived.org/software/keepalived-1.1.19.tar.gz
# tar zxvf keepalived-1.1.19.tar.gz
# cd keepalived-1.1.19
# ./configure
.
.
.
Use VRRP Framework       : Yes
.
.

configure結果に上が出力されていればOK。コンパイルします。

# make
# make install

keepalived設定

LB01の/etc/keepalived/keepalived.confを以下のように記述

! Configuration File for keepalived

global_defs {
   notification_email { #フェイルオーバー発生時に送るメールの宛先等を設定
     example@kbmj.com
   }
   notification_email_from example@kbmj.com
   smtp_server localhost
   smtp_connect_timeout 30
}

vrrp_instance WEB {
    state MASTER #マスターかバックアップかを設定
    interface eth0
    smtp_alert
    virtual_router_id 2 #同じidを持つサーバ間で死活監視を行うので、LB01、02共に同じ数字を設定
    priority 100 #priorityが高いサーバから順にマスター設定される
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111 #LB01、02で共通のものを設定
    }
    virtual_ipaddress {
        10.0.0.30/24 #使用するvipを設定
    }
}

LB02の/etc/keepalived/keepalived.confも、基本的にLB01と同じですが、一部をBACKUP用の設定に書き換える必要があります。

state MASTER →state BACKUP
priority 100 → priority 50

LB01、02共にkeepalived.confを設定し終えたら、試しにkeepalivedを起動してみます。
両方のサーバで以下のコマンドを入力

# /usr/sbin/keepalived start

動作チェック

# ip addr show
LB01
inet 10.0.0.10/24 brd 10.0.0.255 scope global eth0
inet 10.0.0.30/24 scope global secondary eth0

LB02
inet 10.0.0.11/24 brd 10.0.0.255 scope global eth0

LB01のeth0インタフェースにvip(10.0.0.30)が割り振られているのが分かります。
この状態で10.0.0.30にpingを打つと、LB01にパケットが届きます。
今度は冗長化をテストする為にLB01のkeepalivedを停止してみます。
LB01で

# /usr/sbin/keepalived stop

# ip addr show
LB01
inet 10.0.0.10/24 brd 10.0.0.255 scope global eth0

LB02
inet 10.0.0.11/24 brd 10.0.0.255 scope global eth0
inet 10.0.0.30/24 scope global secondary eth0

LB02のkeepalivedがマスターとなり、LB02のeth0インタフェースにvipが割り振られました。
この状態で10.0.0.30にpingを打つと、LB02にパケットが届きます。
今度は再びLB01のkeepalivedを起動してみます。

LB01で

# /usr/sbin/keepalived start

# ip addr show
LB01
inet 10.0.0.10/24 brd 10.0.0.255 scope global eth0
inet 10.0.0.30/24 scope global secondary eth0

LB02
inet 10.0.0.11/24 brd 10.0.0.255 scope global eth0

LB01の方がpriorityの設定値が高いため、再びLB01にvipが割り振られました。
これで、vipでアクセスすればLBサーバが両方ともダウンしていない限り、生きているほうにアクセスできるということになります。
LBサーバが冗長化されました。

次回はpoundを使ったwebサーバの負荷分散と冗長化、keepalivedとの連携について書く予定です。

MyISAMテーブル(Sennaを使った全文検索など)を利用している場合にテストでこけた場合の対処法

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

ご無沙汰しています。KBMJのプログラマのx5rです。

今回は、MySQL+Sennaを利用したプロジェクトでrspecでテストを実行したところ、エラーが発生したため、その対処法を書いてみます。

環境

  • OS : Mac OS X 10.5.8
  • Rails : 2.2.3
  • MySQL : mysql5 @5.0.45_0+innodb+senna+server+utf8(MacPorts)

対象となるテーブルのマイグレーションは


class CreateSearches < ActiveRecord::Migration
  def self.up
    create_table :searches, :options => "ENGINE = MYISAM" do |t|
      t.text     :description
      t.timestamps
    end
    add_index :searches, [:description], :fulltext => true
  end

  def self.down
    drop_table :searches
  end
end

だいたいこんな感じです。(この記事用に想定しているテーブルです。実際にこのテーブルでは試してません.)

今回のプロジェクトでMySQL+Sennaによる全文検索テーブルを利用しているのですが、いざrspecでテストを流してみると以下のようなエラーが発生しました。(実際にこのテーブルでは試してません.)


$ rake spec
rake aborted!
Mysql::Error: The used table type doesn't support FULLTEXT indexes: CREATE FULLTEXT INDEX  `index_searches_on_description`  ON searches (`description`)

(See full trace by running task with --trace)

原因は、まだ開発初期段階でmigrationファイルがいたずらに増えるのがイヤで


$rake db:migrate:reset RAILS_ENV=test

などでテーブルを再生成していたのですが、このrakeコマンドはテーブルのスキーマ情報をダンプ、ロードして作り直しているのですが、その際にテーブルのengineを意識して作り直していないことです。

したがって、ダンプする際に、engineオプションも吐き出すようにすれば良さそうです。

そこで力技ですが、以下のパッチ的なものを書いてみました。
今のところうまく通っています。

要は30〜33行目でengineタイプがMyISAMの時にその情報もダンプに出力するように、activerecord-2.2.3/lib/active_record/schema_dumper.rbのtableメソッドを書き直しているだけです。

このファイルをconfig/initializers直下におけば、毎回ロードされて、正しくテーブルが作り直され、spec(テスト)が通るようになります。
全文検索云々ではなく、MyIASMを利用している環境でエラーが発生している場合は、お試しください。

そもそも、この状況って皆さんは遭遇してなかったりしないのですかね?
バグじゃないのかと思ったりしたのですが。。。
もし、この状況について、他に簡単な方法などをご存知の方やそもそも私の認識が間違っていましたら、ご連絡いただければと思います。

Solaris10でパッケージ管理

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

Solaris10自身でも従来のpkgaddなどによるパッケージ管理は健在なのですが、Sun自身がサポートしているソフトウェア以外のものを使いたくなった場合や、個別にパッケージを導入するのは以外と不便です。Linuxではyumやaptがありますが、Solaris10はそういうの無いんでしょうか?

と思ったらありました。pkgutilといいます。

これをインストールする事で様々なパッケージが利用できるようになります。

基本的な使い方は以下の通りです。

パッケージ情報の取得・更新# pkgutil -U
インストール可能なパッケージの一覧表示# pkgutil -a
インストール可能なパッケージの説明表示# pkgutil -D
インストール可能なパッケージの検索# pkgutil -D キーワード
インストール済みパッケージとカタログのバージョン比較# pkgutil -c
パッケージのインストール# pkgutil -i ソフトウェア名
インストール済みパッケージのアップグレード# pkgutil -u
インストール済みパッケージのアップグレード(確認省略)# pkgutil -f -u
インストール済みパッケージの削除# pkgutil -r ソフトウェア名

Rakeタスクを追加する

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

こんにちは。T氏です。

今日は自作のRakeタスクを追加する方法をご紹介します。

Rakeタスクを追加するには、まず [RAILS_ROOT]/lib/tasks にsample.rakeファイルを作成します。

ファイルの中身の記述に関しては、

desc “説明文”

task “実行タスク名” do … end または => [“Rakeコマンド”]

の2つをワンセットで書けばタスクが追加されます。

ではsample.rakeファイルにタスクを書いてみます。内容は下記になります。

それぞれ、hello world!と表示するコマンド、db:drop,db:createを実行するコマンド、db:migrate,db:fixtures:loadを実行するタスクとなります。

# [RAILS_ROOT]/lib/tasks/sample.rake

# rake hello_world
desc "print hello world!" # description.
task "hello_world" do # rake task name.
   p "hello world!" # print "hello world!"
end

namespace :sample do
  # rake sample:drop_and_create
  desc "drop and create db task."
  task "drop_and_create" => ["db:drop", "db:create"]

  # rake sample:migrate_and_fixtures
  desc "migrate and fixtures load task."
  task "migrate_and_fixtures" => ["db:migrate","db:fixtures:load"]
end

では、実際に追加されているか試してみましょう。

$ rake --task
(省略...)
rake hello_world                                      # print hello world!
(省略...)
rake sample:drop_and_create                   # drop and create db task.
rake sample:migrate_and_fixtures             # migrate and fixtures load task.
$ rake hello_world
"hello world!"

Rakeタスクが追加されている事、実行された事が確認できましたでしょうか。

皆さんも是非お試し下さい。

多対多の関係について

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

海です。

railsのテーブルの多対多の関係について参考資料がすでに十分だと思いますけど、

ここで初心者向けにもう一度まとめます。

◆多対多の関係というのは

例えば、管理サイトのアカウントを作成して、そのアカウントは権限機能を持っています。

持っている権限機能によりアカウントができる操作も異なります。

アカウントテーブル(account.rb)と権限機能テーブル(function.rb)は多対多の関係です。

多対多の関係では、上記図のように結びついているように扱えますが、実際には結合テーブル(account_functions)が必要になります。

◆多対多の関係の使用について

モデル:

account.rbには has_and_belongs_to_many :funtions

function.rbには has_and_belongs_to_many :accounts

また、account.rbには下記のように追加

  def chang_functions(selected_functions)
    function_ids = selected_functions.keys.collect {|key| key.to_i}
    self.functions = Function.find(function_ids)
  end

コントローラ:

二郎というアカウントを作成するとき、下記のように使用すれば、

二郎のデータをaccountsテーブルに挿入される同時、

二郎が持っている3つ権限機能もaccount_functionsテーブルに挿入されます。

@account= Account.new(params[:account])

if @account.save
      @account.chang_functions(params[:functions] || {})
      flash[:notice] = “データが保存しました。”
      redirect_to :action => :index
else
      #エラーがある場合

         :
end

簡単な説明ですが、ご参考になれれば。。。。。。。。…

dRubyについて

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

こんにちわ。wryyyです。

久しぶりのブログ更新です。

さて、今回はRubyのメソッドを拡張したdRubyについて書いていきたいと思います。

【dRubyとは何か?】

Rubyのメソッド呼び出しを拡張し、ネットワーク越しにメソッド呼び出しを行なえるようにするライブラリです。

【Hello, dRuby】

では、実際に「習うより慣れろ!」ということで、早速「Hello, dRuby」を印字するプログラムを見ていきましょう。

※実際の動作確認ではターミナルを2つ使用します。

<ターミナル1>
#server.rb require 'drb/drb' class Puts def initialize(stream=$stdout) @stream = stream end def puts(str) @stream.puts(str) end end uri = ARGV.shift DRb.start_service(uri, Puts.new) puts DRb.uri sleep

上記プログラムは、サーバとなります。

サーバを起動させてみます。

ruby puts.rb druby://localhost:12345

続いてクライアント側で実験をしていきたいと思います。

<ターミナル2>
irb irb(main):001:0> require 'drb/drb' => true

irbからまず始めにdrbをrequireします。続いて

irb(main):002:0> there = DRbObject.new_with_uri('druby://localhost:12345') 
=> #

DRbObject.new_with_uri はURIを指定してオブジェクトの参照を返します。

引数にはサーバ側で指定したURIを指定します

irb(main):003:0> there.puts('Hello, World.') 
=> nil

putsでサーバ側に「Hello, World」を入力しました。

サーバ側で「Hello, World」が入力されているか確認してみましょう。

<クライアント1>
druby://localhost:12345
Hello, World.

どうでしょう?サーバ側で「Hello, World」が確認できたでしょうか?

お分かりの通り、dRubyはクライアント側からサーバ側のメソッドを読み出し、サーバ側で処理を行わせることができるのです。

ここまでのやり方ですと、クライアント側はirbで実行させましたが

rubyのスクリプトを書いて実行させることも、もちろんできます。

#client.rb
require 'drb/drb'

uri = ARGV.shift
there = DRbObject.new_with_uri(uri)
there.puts('Hello, World')

上記スクリプトはirbで以前に打ったものとほぼ一緒ですね。

実際にclient.rbを実行させてみましょう。

<ターミナル2>
ruby client.rb druby://localhost:12345
<ターミナル1>
Hello, World

と表示されるはずです。

このようにサーバとクライアントを分けて、ネットワーク越しにメソッドを呼び出し

処理を行えます。

ここまで、単純な形でしたが、これ以外にもスレッド処理等複雑な処理も

行えますので、お試しください。

PostgreSQLで正規表現にマッチした文字の抽出

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

PostgreSQLでも正規表現を使える、なんてことできるんですよねっ
ってわけで、今回はそれを踏まえて正規表現にマッチした文字列を抽出しようと思います。
なんてこたぁない。

SELECT
  SUBSTRING(mobile_email FROM '(docomo|softbank|ezweb)') AS carrier2
, carrier
FROM
   users
;

これで、あるテーブルを用意し、実行結果をみると、

 carrier2 | carrier  
----------+----------
 docomo   | DoCoMo
 docomo   | DoCoMo
 ezweb    | au
 softbank | SoftBank
 softbank | SoftBank
 ezweb    | au
 docomo   | DoCoMo
 docomo   | DoCoMo

のように並びました。
上記のSQLでは、携帯のメールアドレスからdocomo、softbank、ezwebのいずれかにマッチした かどうかを見て、()内の正規表現にマッチしている文字列を記憶して、carrier2として取得しています。

これ、実は、登録されているキャリアとメールアドレスのドメインの整合性がとれているかどうかをチェックしようと思って作ってみました。

上記の内容がわかりにくいでしょうか?
Rubyで書いたら

/(docomo|softbank|ezweb)/ =~ mobile_email
p $1

といったところでしょうか。
これならピンときました?

WEBサイトのコンバージョンを増やす方法

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

こんにちは。アクセス解析チームの大山です。

サイトのコンバージョン数を上げるための施策として思いつくのは
リスティング広告の出稿・SEO業者に外部SEO依頼し、
まずは流入数を伸ばすことが一般的ではないでしょうか。


これらの施策の効果は非常に高く、優良なユーザーを引き込むことができるため
コンバージョンが上がる可能性の高い施策となります。

しかし、継続して効果を得るためにはそれなりの費用が発生します。

「費用対効果はできるだけ高いほうがいい。
  費用はあまりかけたくない」

これを解決するためには、サイト内の改善に目を向けることにあります。


たとえば、ECサイトの内部を大きく分けると「流入」「回遊」「カート内送客」「コンバージョン」と見ることができます。
これらを訪問者数の遷移で図化してみました。
流入からの直帰率、コンテンツからの回遊からの離脱、カート内総客からの離脱を得て、最終的なコンバージョンはどれほどなのかが一目でわかります。

図1


冒頭で述べた通り、リスティング広告の出稿・SEO業者に外部SEOの依頼をすることは流入が増加し、
コンバージョンを上げるきっかけにもなるでしょう。
しかし、流入が増えるのと同時に、目的の異なるユーザーまで引き込んでしまう可能性があります。
リスティング広告であれば優良なユーザーの引き込む以上に無駄クリック分の費用が発生し、直帰率・離脱率は悪化。
流入、回遊、カート内送客での遷移確立を引き上げる施策が必要となり、最終的に費用が多くかかってしまうこともあります。

図2


このような事態を防ぐには、まずはサイト内改善から確実に行うことが大切です。
アクセス解析を行い、数値を元にサイト内の問題点を洗い出します。
例えば、「回遊」部分に問題があり、改善部分を特定できれば、
少ない修正で離脱を減らしコンバージョンを伸ばすことも可能となります。

図3

遷移途中で取りこぼしの少ないサイトであるからこそ、リスティングやSEOにより流入数が増えた際に本当の効果が生まれると考えています。

部屋が汚いのに意中の人を連れてくるなんてこと、もったいないと思いませんか?
せっかく連れてくるのであれば、最善の状態でお迎えしましょう。

そうすることでより確実な売上を上げる確立はアップするのではないでしょうか。

■バックナンバー・‥‥━━★

■アクセス解析関連記事・‥‥━━★

PostgreSQLでクロス集計

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

こんにちは、sasimiです。
ユーザの属性情報を分析したい、という場合がよくあります。
例えば、キャリア毎に男性と女性の割合を表示したい、など。
そんな場合には、クロス集計が便利です。

 キャリア | 男性 | 女性 
----------+------+------
 au    |      |    
 softbank |      |    
 docomo   |     |    

こんな風に集計した結果を表示することを目指します。

まずはデータを用意しましょう

test=# create table users ( carrier varchar(10), sex varchar(1), created_at timestamp default now());  
test=# insert into users (carrier, sex) values ('docomo', 'm');
test=# insert into users (carrier, sex) values ('docomo', 'f');
test=# insert into users (carrier, sex) values ('docomo', 'f');
test=# insert into users (carrier, sex) values ('au', 'm');
test=# insert into users (carrier, sex) values ('softbank', 'm');

では、早速、クロス集計をしてみたいと思います。

SELECT
  carrier as キャリア
, sum(case when sex='m' then 1 else 0 end) as 男性
, sum(case when sex='f' then 1 else 0 end) as 女性
FROM
  users
GROUP BY
  carrier;

実行結果は

 キャリア | 男性 | 女性 
------------+------+------
 au            |    1   |    0
 softbank |    1  |    0
 docomo  |    1  |    2

これで目的どおりのものを表示できました。
さて、Excelなどでピボットテーブルなんて便利な機能がありますよね。
項目を入れ替えたりすると集計しなおす便利な機能です。
では、性別とキャリアを入れ替えてみましょう。

SELECT
  case when sex='m' then '男性'
       when sex='f' then '女性'
       end as 性別
, sum(case when carrier='docomo' then 1 else 0 end) as ドコモ
, sum(case when carrier='au' then 1 else 0 end) as au
, sum(case when carrier='softbank' then 1 else 0 end) as ソフトバンク
FROM
  users
GROUP BY
  sex;

ちょっとだけ、表示をわかりやすくするために、性別カラムで男性、女性と表示するようにしました。

 性別 | ドコモ | au | ソフトバンク 
------+--------+----+--------------
 男性 |      1   |  1   |            1
 女性 |      2   |  0   |            0

いかがでしょうか?
クロス集計は集計するときに便利な機能です。 是非、利用してみてください。

Rails のエラーページから問題のファイルを1クリックで開く for Windows

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

Rails のエラーページにはありがたいことにスタックトレースが表示されていますが、どうせならそこに書かれたファイル名をクリックするだけでエディタが開くようにしてしまおうという作戦です。

手順は以下の3ステップです 。

  1. スタックトレース中のパスをうさんくさい URL にリンクさせる
  2. うさんくさい URL を使ってエディタを起動できるようにする
  3. うさんくさい URL のプロトコルを扱えるよう Windows に教えてやる

スタックトレース中のパスをうさんくさい URL にリンクさせる

Greasemonkey を使って app/ で始まっている文字列をファイルパスとみなし、リンクを作ります。

editor という勝手に決めたプロトコルを使って、editor:///エラーが/発生した/ファイル.rb?行番号 というようなうさんくさい URL にリンクしてやります。

// ==UserScript==
// @name           rails trace: link to editor
// @namespace      http://userscripts.org/users/59751
// @include        http://colinux:3000/*
// ==/UserScript==

(function() {
  if (document.title != "Action Controller: Exception caught") return;
  var railsRoot = document.body.innerHTML.match(/RAILS_ROOT: ([^\s&]+)/)[1];
  if (!railsRoot) return;
  // samba のマウントポイントに合わせて書き換える
  railsRoot = railsRoot.replace('/home/sugimoto', '/l');
  var pattern = /(app\/[^:]+):(\d+)/g;
  document.body.innerHTML = document.body.innerHTML.replace(pattern, function(all, path, line) {
    var fullPath = railsRoot + "/" + path;
    return '&a href="editor://'+fullPath+'?'+line+'">'+all+'&/a>';
  })
})()

ダウンロード

うさんくさい URL を使ってエディタを起動できるようにする

editor URL にアクセスした時に実行するプログラムを作ります。せっかくなので Ruby で作ってみましょう。

#!/usr/bin/env ruby

require 'uri'
u = URI.parse(ARGV[0])
# Cygwin パスから Windows パスに変換。
# Cygwin を使用していない場合は適当に読み替えてください。
path = `cygpath -w "#{u.path}"`.chomp
system('C:/app/xyzzy/xyzzycli.exe "%s" -go %s' % [path, u.query])

うさんくさい URL のプロトコルを扱えるようWindows に教えてやる

これだけだとリンクをつついても、editor というプロトコルはどのプログラムにも関連づけられておらず…… と言われて悲しい思いをするだけなので、レジストリに以下のエントリを追加してやります。

[HKEY_CLASSES_ROOT\editor]
@="URL:editor Protocol"
"URL Protocol"=""

[HKEY_CLASSES_ROOT\editor\DefaultIcon]
@="\"C:\\app\\xyzzy\\xyzzy.exe\",0"

[HKEY_CLASSES_ROOT\editor\shell]

[HKEY_CLASSES_ROOT\editor\shell\open]

[HKEY_CLASSES_ROOT\editor\shell\open\command]
@="\"C:\\cygwin\\bin\\ruby\" \"C:\\home\\sugimoto\\bin\\run-editor.rb\" \"%1\""

ダウンロード

ファイルを開けば上記内容を追加できますが、内容は環境に合わせて変更してください。

おめでとうございます

リンクをつつくと……

エディタが開く!

chmodでファイルのパーミッションを再帰的に変更する

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

chmodは、ファイルのパーミッションを変更するコマンドです。
このchmodで、特定ファイルのみ再帰的にパーミッションを変更する方法を説明します。

そもそもオプションで
 -R
 ディレクトリやそこに含まれるもののアクセス権を再帰的に変更する。
というそれっぽいものがあるのですが、このオプションはディレクトリに含まれるすべてのファイル、
サブディレクトリのパーミッションを変更するため、あまり使えません。

chmodで再帰的にファイルのパーミッションを変更するには、以下のようにします。
find ./ -type f -print | xargs chmod 644

特定のファイルのみ、の場合はこのようになります。
find ./ -name *.rhtml -type f -print | xargs chmod 644
(ほかにも色々方法はあるようです)

JavaScriptでRubyのsend的なことをしてみる

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

 こんにちは。

 KBMJでRuby on Rails を使ったweb開発に携わっているyoppiといいます。

 今回はRubyの開発で僕がよく使うsend的なことをJavaScriptでやる方法を紹介したいと思います。

 早速サンプルコードを紹介します。

01 <html>
02 <head>
03 <%= javascript_include_tag 'prototype' %>
04 <%= javascript_tag %Q{
05 var testObj = {
06 a: function (){
07 alert('a called!');
08 },
09
10 b: function (){
11 alert('b called!');
12 }
13 }
14
15 function execute(event){
16 testObj[$F(Event.element(event))]();
17 }
18 }%>
19 </head>
20 <body>
21 <from>
22 <%= radio_button_tag 'funcName', 'a', true, :id => 'funcNameA' %>a
23 <%= radio_button_tag 'funcName', 'b', false, :id => 'funcNameB' %>b
24 <%= javascript_tag %Q{
25 Event.observe('funcNameA', 'click', execute);
26 Event.observe('funcNameB', 'click', execute);
27 }%>
28 </form>
29 </body>
30 </html>

 一応Railsエンジニアなので、コードがRailsなのはご容赦ください。

 肝心のところは、16行目の

testObj[$F(Event.element(event))]();

の部分ですね。

 サンプルは、ラジオボタンの値の取得処理でゴチャっとなってますが、

testObj[実行したい関数名]();

ということです。

 まあ、testObj[実行したい関数名].call()でも同様なことができるんですけどね。試しにcall使わない方法をやってみたらできたので、こっちを紹介させていただきました。もちろん引数がある関数に引数を渡すこともできます。

 ちなみに、IE7,IE8,Firefox3,Firefox3.5でのみ確認しています。もしかしたら、ブラウザによっては使えないかもしれません。もし、動作確認していただけたならコメントでお知らせしていただければと思います。

 それでは。

プレイスホルダの扱いがちょっと楽になる@PHP

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

■プレースホルダ

SQL文作成時に、 実行時に値が決まる部分を「?」に置き換えて、

「?」に当てはめたい値を変数とか配列で指定します。

そうすると、SQLインジェクション対策のためのエスケープ処理を自動で行ってくれます。

————————————

 $id = 6; $sql = select * from t_bbs where id = ?;

 query($sql, $id);

————————————

「?」のところに「6」が入ります。 プレースホルダの使い方はこんな感じです。さくっといきます。

さて本題はここからですが、

プレースホルダは代入する数だけ「?」を適切な箇所に用意する必要があります。

例えば、上記の例を少し複雑にして、 複数のid値と一致したものをt_bbsから取得したいとします。

id値の数が固定なら頑張って下記のようにできますが・・・ スマートではありません・・・

$sql = select * from t_bbses where id = ? or id = ? or id = ?;

そこで、複数のid値を配列に格納して、かつその格納した数だけ「?」を生成してあげましょう。

$id = array(1,2,3); $holder = implode(‘, ‘, array_fill(0, count($id), ‘?’));

count()で配列の中身の数を取得し、

array_fill()により、0番目から配列の中身の数だけ「?」を挿入します。

implode()により、「?」と「?」の間に「,」を挿入します。

そうすると、出来上がりは、$holder = (?, ?, ?)となります。

$sql = select * from t_bbses where id IN ($holder); query($sql, $id); IN句を使ってまとめてあげると、すっきりしたSQL文の完成です!

最近人気な記事