ホーム ブログ ページ 56

Linuxの基本 ~コマンド編1~

0

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

こんにちは。エンジニア初心者のlietoです。

Linuxの基本的なコマンドの使い方についてまとめていきたいと思います。

今回は、「viコマンド」についてです。

viコマンド

 Linuxでテキストファイルを加工・編集するためのコマンドです。

【viの起動】

vi ファイル名

【文字の入力】

起動直後のviは、vi専用のコマンドを受け付けるコマンドモードという状態になっています。

文字入力を行うには、文字を入力するためのコマンドを使用します。

●文字入力の基本コマンド

 ・「i」:カーソルがある位置の左側から文字入力

 ・「a」:カーソルがある位置の右側から文字入力

●カーソルを移動しながら文字入力モードに移行する

 ・「I」:カーソルがある行の先頭から文字入力

 ・「A」:カーソルがある行の末尾から文字入力

●空行の挿入を行って文字入力モードに移行する

 ・「o」:カーソルがある行の次の行に空行を挿入し、その行の先頭から文字入力

 ・「O」:カーソルがある行に空行を挿入し、その行の先頭から文字入力

【カーソルの移動】

 ・「h」「←」:左へ移動

 ・「j」「↓」:下へ移動

 ・「k」「↑」:上へ移動

 ・「l」「→」:右へ移動

【ファイルの保存とviの終了】

●データの保存

 ・「:」「w」:上書き保存

 ・「:」「w」ファイル名:ファイル名をつけて保存

●viの終了

 ・「:」「q」:終了

 ・「:」「q」「!」:強制的に終了

 ・「:」「w」「q」または「Z」「Z」:保存して終了

【カット・コピー・ペースト】

●カット

 ・「x」:一文字カット

 ・「d」「d」:一行カット

●コピー

 ・「y」「y」:一行コピー

●ペースト

 ・「p」:カーソル位置のあとにペースト

 ・「P」:カーソル位置にペースト

【取り消しと繰り返し】

●取り消し

 ・「u」:直前の操作を取り消す(直前の状態に戻る)

●繰り返し

 ・「.」:直前の操作を繰り返す

【文字列の検索】

 ・「/」検索パターン:カーソル位置からファイルの末尾に向かって検索

 ・「?」検索パターン:カーソル位置からファイルの先頭に向かって検索

 ・「n」:次の検索結果へ進む

 ・「N」:前の検索結果へ進む

【文字列の置換】

 : 置換対象の行範囲 s/ 検索パターン / 置換文字列 / [オプション]

●置換対象の行範囲

 置換をする行は、「m行目からn行目」という範囲で指定しいます。

 実際には、「m,n」の形で記述します。

 例えば、「9行目から20行目」の場合、「9,20」となります。

 また、以下のような表現も利用できます。

 ・「.」:カーソルが存在する行

 ・「$」:最終行

 ・「%」:すべての行

●検索パターン

 基本正規表現を利用して検索できます。

●置換文字列

 置換したい文字列を記述します。

●オプション

 ・「c」:置換操作を実行する前に確認する

 ・「i」:大文字と小文字を区別しない

 ・「q」:一行の中に検索パターンにマッチする文字列が複数存在した場合、そのすべてに置換を適用

これで、viコマンドの基本は終了です。 

テキストファイルを自由に加工・編集できるようになりましたか?

それでは、また次回に。。

vim で アンドゥ、リドゥを含めたアンドゥ、リドゥ

0

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

アンドゥは「元に戻す」、リドゥは「やり直し」のことですが、vimにもその機能は用意されています。 ・アンドゥ … u ・リドゥ  … Ctrl + r ですが、アンドゥやリドゥを繰り返している時に、うっかり履歴を消してしまう事が有ります。 こんな感じですね。1) 適当にタイプして… test1 test2 2) アンドゥして… test1 3) また適当にタイプすると… test1 test3 test2の履歴が消えてしまいました。 アンドゥしてもリドゥしても出てきません。 そこで、そんなときには、g- 、 g+ を使いましょう! アンドゥ、リドゥの履歴を含めたアンドゥやリドゥができますよ。

Rubyとメモリリーク

0

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

ある日、mongrelプロセスのメモリ使用量を何となく見ていたところ、
同じ処理をしている他のサーバのものと明らかに違う数値を出していた。
これってもしかして、メモリリークってやつ?

言葉はよく聞くけど、自分自身があまりこれに悩まされた事がなかったため、
今回、ちゃんと正面から向き合う事にした。このメモリリークってやつに。

1. メモリリークとは?

今更だけど、要は使用可能なメモリ容量がどんどん減っていくこと。
アプリケーションが処理のために使ったメモリは、使い終わったら解放される
のが普通だけど、これが何らかの理由で解放されずに残ってしまう事を言う。
借りたものを返さない・・・・どこの世界にも不適な輩はいるらしい。

勘違いしがちなのは、メモリをいっぱい使うのとは直接関係ないという事。
一時的にメモリを大量消費する処理があったとしても、終わった後に解放
されるなら、それはメモリリークじゃない。
むしろ、メモリリークはもっと地味なものらしく、同じ処理が何千回も実行
されて初めて「なんか怪しくね?」って話になる事もざらだとか。

2. GC = Garbage Collecter

さて、メモリリークについて調べてたら、こんな単語に行き着いた。
GC。処理が終わった後、使われなくなったメモリを自動的に回収し、
メモリリークを起きにくくする機能。そういえば、昔読んだRubyの
入門書にも、そんな事書いてあった気がするなあ。

そんなのがあるんだったら、Rubyに関してはメモリリークを気にする
必要はないじゃん、と思ったんだけど、本当にそうなのか?
試しに「ruby」「メモリリーク」で検索かけてみる。
なんだよ、結構出てくるじゃん。

いろいろ調べてわかった事は、このGC。決して完璧なわけじゃない。
例えばメモリ上に、まだ使ってるのか使ってないのかわからないオブジェクト
があった場合、強気に解放してしまうGCと、弱気に様子を見るGCの二種類が
あって、Rubyの場合は後者を使用しているとの事。
だから、本当は参照されてないのに、いつまでも解放されず、結果的に
メモリリークになってしまう事があるのだと。

あと話は変わるけど、RubyのライブラリにはC言語で書かれているものが
あって、扱うオブジェクトの中にRubyのオブジェクトじゃないものがある
ために、それらがGCの対象にならず、メモリーリークの要因になる可能性
もあるんだとか。

ただ、こういうのはすぐに報告されて、バージョンアップで修正されてる
みたいだから、バージョンに気を付けて使っていれば問題ないんじゃないか
と思う。

3. で、結局、冒頭の話はメモリリークだったのか?

わからん。
とりあえずmongrelを再起動したら(当たり前だけど)元に戻ったので、
しばらく様子見かなあ。
メモリリークの原因を追及するのと、定期的にmongrelを再起動するの
だったら、後者の方が楽だしなあ。
まあ、あとは常駐プロセスじゃないpassengerとか、近頃噂のunicornとやらを
試してみるのも手か。

最後に。Rubyのメモリリーク検出ツールなるものを見つけました。
英語マニュアルしかなかったので、自分はわかった風なところまでしか
行きませんでしたが、良かったらチャレンジしてみてください。

<Ruby用メモリリーク検出ツール「Bleak_house」>【動作環境】
 UNIX系OS
 Ruby1.8.7

【インストール】
 $ gem install bleak_house

【セットアップ】
 config/environment.rbに以下の1行を追加。
  require ‘bleak_house’ if ENV[‘BLEAK_HOUSE’]

【使い方】
 1. アプリケーションサーバを起動
  $ RAILS_ENV=production BLEAK_HOUSE=1 ruby-bleak-house ./script/server
 2. 200〜300リクエストを投げたところで、サーバを停止(Ctrl-C)。
 3. /tmp以下にダンプファイルが出来ているので、その内容を解析。
  $ bleak /tmp/bleak.20349.000.dump

【参考URL】
 http://blog.evanweaver.com/files/doc/fauna/bleak_house/files/README.html

Ruby on Rails でモデルを階層化する(サブディレクトリにモデルを入れる)方法

0

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

通常、モデルのファイルはmodelsディレクトリの直下にファイルを作成しますが、管理の都合など何らかの理由でモデルをサブディレクトリに入れたいことがあると思います。

例:models/sample/category.rb

module Sample
  class Category < ActiveRecord::Base
    set_table_name “sample_categories”
  end
end

モデルを階層化する(サブディレクトリにモデルを入れる)方法として、environment.rbでconfig.load_paths にサブディレクトリのモデルを追加する方法が色々なブログで紹介されています。

http://errtheblog.com/posts/3-organize-your-modelshttp://toolmantim.com/articles/keeping_models_in_subdirectorieshttp://www.kevinmonk.co.uk/?p=38

config.load_paths += Dir[“#{RAILS_ROOT}/app/models/**/**”]

しかし上記方法で問題が出る場合もあり、さらに簡単な方法で実現できますのでご紹介します。

サブディレクトリ内のモデルをコントローラ内で利用する際に、::Sample::Category (Sample::Category ではない!) という風に呼び出すことで config.load_paths の追加等をせずに利用することができます。
Sample::Categoryで呼び出した場合に問題が出る場合がありますので、::Sample::Categoryと先頭に「::」を付けて呼び出すことで問題が直る場合がありますのでお試しください。

Webroar を Macports の Ruby で動かすでござる

0

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

エレコマの開発を担当しているたろちゃんです。

Webroarは以前Daoka氏が紹介をしていたが、Macportsで導入したRubyの上で動作しませんでした。また、SSLのサポートも通らなかったため、両方が動くように調整をしてみました。

今回はSSL環境を構築したいため、gnutlsを導入します。

$ sudo port install gnutls

webroarの導入自体は以下のコマンドで行ないました。

$ sudo gem install webroar

ユーザガイドに沿ってインストールを行なうと以下のようにエラーとなりました。

wisp:~ btm$ sudo webroar install --ssl-support
Checking for the dependencies ...
Checking for ruby........found   at /opt/local/bin/ruby.
Checking for libruby.1.8.7.dylib........found  at /opt/local/lib.
Checking for openssl-ruby........found.
Checking for zlib-ruby........found.
Checking for ruby_headers........found   at /opt/local/lib/ruby/1.8/i686-darwin10/ruby.h.
Checking for rubygems........found.
Checking for /usr/bin/gcc-4.2........found   at /usr/bin/gcc-4.2.
Checking for make........found   at /usr/bin/make.
Checking for starling........found   at /opt/local/bin/starling.
Checking for Xcode.app........found   at /Developer/Applications/Xcode.app.
Checking for any previous installation of WebROaR ... found.

Please enter your choice from the options below:
 1. Import configuration, logs and admin panel data from the previous installation - WebROaR-0.2.6.
 2. No import required, install WebROaR-0.2.6 afresh.
> 1
Importing configuration, logs and admin panel data from the previous WebROaR-0.2.6 install ... done.
Creating directory structure ... done.
Compiling C source files ... failed.
Compilation error. Please refer 'install.log' for details.

install.logは /opt/local/lib/ruby/gems/1.8/gems/webroar-0.2.6/install.log に置かれます。それを見ると gnutls.h が見つからないというメッセージが出ていました。これは単純に -I/opt/local/include と -L/opt/local/lib をコンパイル時に渡せば良いという事ですが、実は gnutls に依存している webroar-head だけではなく、webroar-worker も -L/opt/local/lib を渡さなければならない事が後々判明しました。これは、ライブラリのパスを渡さないと MacOSX に付属している Ruby のライブラリを参照してしまうからです。

$ otool -L /opt/local/lib/ruby/gems/1.8/gems/webroar-0.2.6/bin/webroar-worker 
/opt/local/lib/ruby/gems/1.8/gems/webroar-0.2.6/bin/webroar-worker:
	/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.0.0)
	/usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 227.0.0)
	/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/libruby.1.dylib (compatibility version 1.8.0, current version 1.8.7)

このため、両方のリンク時に必ず -L/opt/local/lib を指定するようにしなくてはなりません。

今回はwebroar 0.2.6 を対象に次のようなパッチを用意しました。

--- lib/command_runner.rb.orig	2010-01-19 17:37:20.000000000 +0900
+++ lib/command_runner.rb	2010-01-19 17:36:53.000000000 +0900
@@ -56,6 +56,7 @@
   Options:
     -s, --ssl-support      Install the server with SSL support
     -d, --debug-build      Compile the server as a debug build to output extremely verbose logs 
+    -m, --macports         Compile the server with MacPorts Ruby
 
   Summary:
     Install the server
@@ -175,6 +176,10 @@
       options[:report_dir] = dir
     end
 
+    opts.on( '-m', '--macports', 'Compile with MacPorts Ruby') do
+      options[:macports] = true
+    end
+
   end
 
   begin
--- lib/installer.rb.orig	2010-01-19 17:38:03.000000000 +0900
+++ lib/installer.rb	2010-01-19 18:11:26.000000000 +0900
@@ -165,7 +165,11 @@
       ssl = true
       str = "ssl=yes "
     end
-    
+   
+    if options[:macports]
+      str += "macports=yes "
+    end
+
     if CheckUser.new.check == 0
       
 #      if File.exist?(File.join(WEBROAR_BIN_DIR,"webroar-head")) && File.exist?(File.join(WEBROAR_BIN_DIR,"webroar-worker"))
--- tasks/compile.rake.orig	2010-01-19 11:54:46.000000000 +0900
+++ tasks/compile.rake	2010-01-19 17:43:29.000000000 +0900
@@ -66,6 +66,9 @@
     puts "Adding HAVE_GNUTLS flag."
     $flags << '-DHAVE_GNUTLS'
   end
+  if ENV['macports'].eql?("yes")
+    puts "Building for MacPorts Ruby build."
+  end
   $flags = $flags.join(" ")
   $webroar_config_called=true
 end
@@ -128,12 +131,18 @@
 TEST_OBJ_DIR = File.join(OBJ_DIR, 'test').freeze
 LOG_FILES = File.join('','var','log','webroar').freeze
 TMP_FILES = File.join('','tmp').freeze
+MACPORTS_HEADER_DIR = File.join('', 'opt', 'local', 'include').freeze
+MACPORTS_LIB_DIR = File.join('', 'opt', 'local', 'lib').freeze
 
 ## Create necessory directories
 #create_directories([OBJ_DIR, WORKER_OBJ_DIR, YAML_OBJ_DIR, TEST_OBJ_DIR, TMP_FILES, LOG_FILES])
 
 include_dir = ["#{LIBEV_DIR}","#{EBB_DIR}","#{HEAD_DIR}","#{YAML_DIR}","#{HELPER_DIR}","#{UNIT_TEST_DIR}", "#{WORKER_DIR}"]
 
+if ENV['macports'].eql?("yes")
+  include_dir << "#{MACPORTS_HEADER_DIR}"
+end
+
 include_dir.each do |dir|
   $inc_flags << " -I#{dir} "
 end
@@ -244,6 +253,10 @@
   $libs += $LIBS + ' ' + Config::expand($LIBRUBYARG_SHARED,CONFIG)
   #$libs += ' '+CONFIG["LIBRUBYARG"]  
   $libs += ' -lpthread '
+  if ENV['macports'].eql?("yes")
+    puts "Compiling with MacPorts Ruby."
+    $libs += " -L#{MACPORTS_LIB_DIR} "
+  end
   out_file=File.join(BIN_DIR,'webroar-worker')
   object_files=FileList[File.join(WORKER_OBJ_DIR,'*.o'), helper_obj.keys, File.join(YAML_OBJ_DIR,'*.o')]
   # -rdynamic option to get function name in stacktrace
@@ -263,6 +276,10 @@
     puts "Compiling with gnutls library."
     $libs += ' -lgnutls '
   end
+  if ENV['macports'].eql?("yes")
+    puts "Compiling with MacPorts Ruby."
+    $libs += " -L#{MACPORTS_LIB_DIR} "
+  end
   out_file=File.join(BIN_DIR,'webroar-head')
   object_files=FileList[File.join(OBJ_DIR,'*.o'),File.join(YAML_OBJ_DIR,'*.o')]
   # -rdynamic option to get function name in stacktrace
--- tasks/gem.rake.orig	2010-01-19 17:54:13.000000000 +0900
+++ tasks/gem.rake	2010-01-19 17:54:39.000000000 +0900
@@ -118,7 +118,11 @@
   if ENV['debug_build'] == 'yes'
     opt_str += "-d "
   end 
-  
+ 
+  if ENV['macports'] == 'yes'
+    opt_str += "-m "
+  end
+
   sh "webroar install #{opt_str}" 
 end
 

パッチの内容は webroar install にオプション -m もしくは –macports を追加してMacPorts用にビルドをしたい場合はオプションを付けるようにするというものです。

これをwebroar_0.2.6_macports_patch.diffとして適当なディレクトリに用意します。

では、パッチを当ててビルドをしてみましょう。

$ cd /opt/local/lib/ruby/gems/1.8/gems/webroar-0.2.6
$ sudo patch -p 0 < ~/develop/ruby/webroar_0.2.6_macports_patch.diff
$ sudo webroar install -s -m

正常に動作するでしょうか?Admin Panelにログインができたら、後は指示に従って導入を進める事ができます。

なお、筆者のケースで、rack-1.1.0が入ってしまい上手く動作させる事ができない事がありました。これはrails-2.3.5がrack-1.0.1に依存(正確にはrailsが依存してるライブラリが依存)しているためです。しかし、このようなケースだとログに一部出力されずに分かりづらい事があります。そういう時はwebroarをdebugオプションつきでインストールをして、/var/log/webroar 以下のファイルを確認するようにしましょう。

HTML5入門

0

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

※この記事は 2010.01.18 時点のものです。現在の内容とは異なる内容が含まれている場合がございますので、ご注意ください。

こんにちは。エンジニアの はる です。

今回は巷で話題の「HTML5」について、

 ・HTML5とは?
・HTML5って何が変わるの?
・HTML5っていつから気にしなきゃいけないの?

という視点から、まずはHTML5をざっくりと知っていただくための入門的な内容を書いてみたいと思います。



・HTML5とは?

W3Cより2008年1月22日にドラフト(草案)が発表されたHTMLの最新バージョン。※2010年9月頃に正式版勧告予定。
HTML4と比べ、WEBアプリケーション向けの機能が大幅に強化されており、また、HTML4.01で非推奨とされていた要素の一部(font要素やcenter要素等)が廃止されてる予定です。
主な追加機能としては、

■新しい要素や属性の追加
(1)入力フォームの強化
(2)canvas要素
(3)文書構造を示す要素の追加(header要素、nav要素 等)
(4)その他(menu要素、command要素 等)


■新しいAPI
(1)簡易データベース(Web Storage)
(2)マルチスレッド(Web Workers)
(3)双方向通信(Web Sockets)
(4)その他(アプリケーションキャッシュ、ドラッグ&ドロップ等)


上記が主要な追加機能となります。その他にも多くの機能追加があるのですが、今回は割愛させていただきます。
それでは、次項にて具体的な各機能の内容をご紹介します。

———————————————————–

・HTML5って何が変わるの?


■新しい要素や属性の追加


(1)入力フォームの強化

□type属性に指定できる型が増える
HTML5からは、input要素のtype属性に指定できる型が増えます。
search、datetime、date、month、number、range、tel、email 等…計23種類になる見込みです。
例えば、「date」型では、date型の入力フォームをクリックするとカレンダーが表示され、そのカレンダーから日付を選択するインターフェイス(※Operaで確認できます。)がブラウザで実装され、
、「range」型では、スライダーコントロールが表示され、感覚でスライダーを動かして入力するインターフェイス(※Safariで確認できます。)がブラウザで実装されます。

例)

HTML5入門
HTML5入門
HTML5入門
HTML5入門

このように今までAjaxやFlashで実装されていたUIがHTMLの標準機能として実装可能になり、type属性の指定型が増えたことで入力項目の型をソースレベルで明確化することができます。

range型を携帯で入力する場合は左右ボタンは使えないし、どうするんだろう・・・といった不安はあるものの、優れたUIをエンドユーザーが利用できる機会が多くなるのは嬉しいですね。



□フォームの値を検証する属性が追加
これまでJavascriptで実装されてきたフォームの値の検証もHTMLの標準機能として、ある程度行えるようになります。
具体的には、必須項目のチェックと正規表現によるフォーマットチェックとなり、submitボタンを押した際にチェックが行われます。
不正値が発見された場合には不正値が入力されている項目が赤く表示され、メッセージが表示されます。(※Operaで確認できます。)

例)
必須項目のチェック(required属性)

フォーマットチェック※正規表現で指定(pattern属性)


(2)canvas要素
canvas要素は、HTML(+CSS3)で自由にグラフィックの描画(2D,3D)、写真合成、アニメーションの作成等を可能にする要素です。
canvas要素については、説明するよりも実際に見てみたほうが分かりやすいかと思いますので、いくつか参考になるサイトをご紹介します。


□Canvas参考サイト

  • ・canvas要素 + css3アニメーション

http://www.agustinfernandez.com.ar/proyectos/canvas/

  • ・canvas要素 + audio要素

http://9elements.com/io/projects/html5/canvas/

  • ・canvas要素 + jQuery

http://www.filamentgroup.com/lab/jquery_visualize_plugin_accessible_charts_graphs_from_tables_html5_canvas/


HTML5+CSS3+javascriptでゲーム等も作成可能とされていますが、現状では、3D、アニメーション、テクスチャのレンダリングが重く感じてしまいます。
canvas要素を利用することにより、AjaxやFlash、Silverlightで実装されていたリッチコンテンツをHTML5でより容易に実装可能になります。
Flash Developerとしては、Flashとの機能的な違いや両者の棲み分けがどうなされるのかという点が気になるところではありますが、リッチコンテンツ制作の間口が広がることでインターネットコンテンツの幅も広がるといいなと思います。

(3)文書構造を示す要素の追加(header要素、nav要素 等)
header要素、footer要素、nav要素、article要素等…HTMLの文書構造を明確に示すための要素が追加されます。
文書構造が明確になることにより、検索エンジンのインデックス化処理(検索ページの索引作り)が容易になります。
※現時点では、検索エンジンのインデックス化処理が容易になるというだけであって、HTML5にすることで直接的なSEO効果があるわけではないようです。

(4)その他(menu要素、command要素 等)
その他にも、menu要素、command要素、progress要素、meter要素等々…ここでは紹介しきれない程の新要素や、HTML4の時には用途が変わって実装されている要素があります。
興味のある型は是非調べてみてください。



■新しいAPI


(1)簡易データベース(Web Storage)

クライアント端末内にデータを保存するためのAPIが提供されます。簡易データベースの種類には「キー/バリュー」形式のものとデータベース形式(※Safariの場合SQLiteを使用しているようです。)(※Safariの場合、バックエンドではSQLiteを使用しているようです。)のものの2種類があります。

  • Storage

キー/バリュー形式で保存
ドメイン毎の保存(永続可能)、ウィンドウ毎の保存(ウィンドウを閉じるまで)が可能

  • データベース

SQLを用いて保存(※トランザクション必須)
非同期APIと同期APIでのアクセスが可能(永続可能)


簡易データベースを活用することで、今まで逐一サーバーと通信をして保存していたデータを必要な時のみ適宜通信をして保存したり、オフラインで編集したものをオンライン時にサーバー側に保存する等、様々な使い道がありそうです。

□参考サイト(※Safari、Chromeでご覧ください)

  • WEB Storage + オフライン作業(manifest)

http://webkit.org/demos/calendar/Calendar.html


(2)マルチスレッド(Web Workers)
バックグラウンドで動作するjavascriptスレッドのことで、これまでは計算処理を行うjavascriptがあった場合に、その処理が完了するまでUI側の操作が一時的に行えない状態になる等の影響がありましたが、
Web Workersを使用することで、例えば計算処理をワーカに渡し、UI側は計算処理中でも操作可能にするといったことも可能となります。
また、Web Wokersは、複数立ち上げることが可能(マルチスレッド)であり、postMessageを使用することで、Worker間、Workerと表示側のjavascript間等で処理結果の受け渡しや協調が可能です。
ただし、Web WorkersはDOMにアクセスできないので、注意が必要です。

(3)双方向通信(Web Sockets)
サーバーサイドプロセスとの双方向通信を可能にするAPIであり、HTTPを使用せずに効率的な双方向通信が可能となります。
HTTPヘッダやCookie情報が含まれない通信のため、トラフィックを軽減できます。

(4)その他(アプリケーションキャッシュ、ドラッグ&ドロップ等)

その他にも、アプリケーションキャッシュ(manifest)、ドラッグ&ドロップ機能等の新しいAPIがあります。興味のある型は是非調べてみてください。

 ———————————————————–

・HTML5っていつから気にしなきゃいけないの?

HTML5がどんなに話題になってもエンドユーザーが満足に利用できる環境がなくては普及はしません。
つまり、利用者側がいつから満足に使用できるかが開発者側の対応が必要になるタイミングでもあるわけですが、これはHTML5に対応したブラウザのシェアによるかと思います。
各ブラウザの対応状況は、下記サイトで確認することができます。


上記サイトで各ブラウザの対応状況をみてみると、webkitベースのブラウザ(Safari、Chrome)はかなりの対応率ですが、IEの対応状況が芳しくありません。今後の対応予定もしばらくは期待できなそうですね。
Operaは現在はまだまだといった結果ではありますが、本格的にHTML5対応を宣言しているので今後に期待です。
正直なところ、PCのブラウザが未だIEが高いシェアを保っているため、しばらくは普及が見込めなそうです。
ただし、ブラウザの入れ替わりが比較的早い携帯電話では昨今のスマートフォンブームと相まって、PC版よりも早く標準になる可能性はあるのではないでしょうか。

今回ご紹介したHTML5についての記事は、HTML5の中のほんの一部の内容です。興味のある方は是非調べてみてはいかがでしょうか。

□その他の参考にさせていただいたサイト

  • 5分で把握するHTML5 – Google Developer Dayセッションリポート

http://journal.mycom.co.jp/articles/2009/06/15/gdd1/index.html

  • 詳解! HTML 5と関連APIの最新動向 – 新タグ&API編

http://journal.mycom.co.jp/special/2009/html5-1/index.html

  • 詳解! HTML 5と関連APIの最新動向 – Webアプリ開発編

http://journal.mycom.co.jp/special/2009/html5-2/index.html

  • HTML5リファレンス

http://www.html5.jp/

tritonnのインストール方法と動作確認

0

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

メガネです。
今日はtritonnのインストールと動作確認の方法を説明します。

tritonnとはmysqlで日本語の全文検索を行えるようにしたものです。
参照:http://qwik.jp/tritonn/about.html

さっそくインストール方法です。

64ビット版のCentOSにインストールしてみます。

今回はrpmを使用します。
各rpmのファイルをダウンロード
wget http://sourceforge.jp/projects/tritonn/downloads/44614/mecab-0.98-tritonn.1.0.12a.x86_64.rpm/
wget http://sourceforge.jp/projects/tritonn/downloads/44614/mecab-ipadic-2.7.0.20070801-tritonn.1.0.12a.x86_64.rpm/
wget http://sourceforge.jp/projects/tritonn/downloads/44614/senna-1.1.4-tritonn.1.0.12a.x86_64.rpm/
wget http://sourceforge.jp/projects/tritonn/downloads/44614/MySQL-shared-5.0.87-tritonn.1.0.12a.x86_64.rpm/
wget http://sourceforge.jp/projects/tritonn/downloads/44614/MySQL-client-5.0.87-tritonn.1.0.12a.x86_64.rpm/
wget http://sourceforge.jp/projects/tritonn/downloads/44614/MySQL-server-5.0.87-tritonn.1.0.12a.x86_64.rpm/

rpmでインストール
rpm -ihv mecab-0.98-tritonn.1.0.12a.x86_64.rpm
rpm -ihv mecab-ipadic-2.7.0.20070801-tritonn.1.0.12a.x86_64.rpm
rpm -ihv senna-1.1.4-tritonn.1.0.12a.x86_64.rpm
rpm -ihv MySQL-shared-5.0.87-tritonn.1.0.12a.x86_64.rpm
rpm -ihv MySQL-client-5.0.87-tritonn.1.0.12a.x86_64.rpm
rpm -ihv MySQL-server-5.0.87-tritonn.1.0.12a.x86_64.rpm


次は動作確認方法ですが、mysqlのコンソールを開いて
テストデータベースで検証します。

> use test
> CREATE TABLE t1 (c1 TEXT, FULLTEXT INDEX ft USING NGRAM (c1)) ENGINE = MyISAM DEFAULT CHARSET utf8;
> SHOW SENNA STATUS\G
> INSERT INTO t1 VALUES (“千葉”);
> INSERT INTO t1 VALUES (“東京都”);
> SELECT * FROM t1 WHERE MATCH(c1) AGAINST(“東京”); #これを実行して東京都がとれれば成功。

次回は、RAILSで使ってみます。以上

Ruby On Rails xmlからハッシュ ハッシュからxml変換

0

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

ども、rick No.16です
今回は、Railsでxmlをハッシュにする方法とハッシュをxmlにする方法を紹介します。

環境

Rails1.2.6
Ruby1.8.6

ハッシュ化

記述する場所はmodelでもcontrollerでもいいです。

include REXML
require “rexml/document”

xml = “body” //xmlのサンプルデータ
rexml = REXML::Document.new(xml) //DOMツリー(木構造)の作成
hash = Hash.from_xml(rexml.elements[‘/xml’].to_s) //ハッシュ化

xml化

hash.to_xml //上記で作成したハッシュをxml化

ちなみに
to_xmlは日本語対応していませんので、
変数.to_xml.gsub(/&#(?:(\d*?)|(?:[xX]([0-9a-fA-F]{4})));/) { [$1.nil? ? $2.to_i(16) : $1.to_i].pack(‘U’) }
日本語使う場合これで日本語してください。

このメソッドは簡単に変換できますが、複雑な変換はあまりできません。
以上。

rails の action_cache (アクションキャッシュ)を使う、その一。

0

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

M.T.です。前開の書き込みから2ヶ月以上経ってしまいました。
ノウハウはできるだけ落としておきたいなーと思いながら、なかなか書く時間が作れません。

さて、今回は rails のキャッシュ、特に action_cache について書いてみます。

rails で提供されるキャッシング

rails にはデフォルトで 3 つのキャッシュ方法が提供されています。
ウェブ上で情報が多く、ゆえによく使われていそうな順に並べるとこんな感じでしょうか
(といっても、あくまでも実感で数値検証ないです)。

  • ページキャッシュ
  • フラグメントキャッシュ
  • アクションキャッシュ

キャッシュ方法に応じた向き不向き

3 つも実装が用意されているということは、当然それぞれ得意な処理、不得意な処理があります。
ざっくりと言ってしまうと、こんな感じです。

ページをただ単にキャッシングして表示したいならページキャッシュ。
アクセスに応じた処理(○○さんこんにちは! みたいな)が必要ならフラグメントキャッシュ。
ページをただ単に表示したいだけだけど、フィルタは使いたいならアクションキャッシュ

速度効率で言うと、ページキャッシュが圧倒的によく、残りのふたつは処理に応じて異なるので、
アクセスが多いことが想定されているようであれば、早い段階でキャッシュ処理を考えた方が吉、です。

フィルタを使いたい状況とは?

さて、アクションキャッシュはフィルタが使いたい場合と書きましたが、では具体的にどのような状況が想定できるでしょうか。

最も利用される可能性が高いのは、携帯のキャリアに応じたキャッシュを作りたい場合、でしょう。
携帯を使う場合、rails では jpmobile を使うことが圧倒的に多いと思いますが、これはフィルタを利用しています。

例えばページキャッシュを使うと、最初に見られた端末のものでキャッシュされてしまうため、絵文字等正しく表示されない、文字化けが発生してしまうなどの問題が起きます。

キャリア別にページキャッシュをした場合でも、jpmobile のフィルタによる恩恵を受けられないため、パラメータの中に日本語等が入っていた場合、正常に動作しない可能性があります(すいません、未検証です)。

もしページ内にアクセスに応じた処理が入っている場合は、フラグメントキャッシュを使った方がよいと思いますが、その場合も、アクション内でデータを取得するときにキャリアに応じた処理を入れる必要があり、恐らく rails のライブラリをオーバーライドしないと難しいでしょう(すいません、こちらも未検証です、情報お持ちの方、ぜひぜひブクマコメントなどお寄せください)。

そんなときに使えるのがアクションキャッシュです。これは、あるコントローラ内のアクションで宣言すると、around_filter として適用され、before_filter でキャッシュ生存チェックを行い、もしキャッシュがあればアクションの処理を返さずにそのままキャッシュを表示、キャッシュがなければアクションを実行した後 after_filter でキャッシュを生成します。

と、ここまで書きましたが長くなってきたので、実際にどのような処理が行われているのか、キャリアごとにキャッシュするにはどうしたらよいのか、また次回書きたいと思います。今度こそもっと早く書くぞっ!

IE6でのwebページ印刷時に幅指定をするCSS

0

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

通常、IE6で649px以上のwebページを印刷する場合、途中で切れて印刷されてしまいます。(Firefoxは賢いので切れずにちゃんと印刷してくれます)

webサイトを作ったはいいが「うまく印刷できない」と言われた時、印刷用の『CSSを用意すればいい』なんて話はよく聞きますが、印刷の為だけにCSSを書き換えるのは手間がかかります。

そこで、今回はIE6で簡単にwebページを縮小して印刷してくれるCSSを紹介します。

CSS
@media print {
body {
zoom: 80%;
}
}

上記記述をCSSに追加するだけです。

あとは印刷時にどれくらい縮小させるかを%で指定して下さい。

※zoomタグはIE規格なのでFirefoxには適応されません。

IEのwindow.onloadでthickboxが動作しない場合の対処方法

0

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

こんにちは abennu です。

今回の内容は題名の通り
IEのwindow.onloadでthickboxが動作しない場合の対処方法を書きます。

はじめにthickboxについて簡単に説明します。
thickboxは主に画像等を格好良く表示したりする
Ajaxライブラリの1つです。

もしも画像を格好良く表示したくなってきたら
thickboxのtb_show()などを使うとちょっとリッチな雰囲気を出せます。
tb_showの簡単な使い方の例は

 < input type=”button” onClick=”tb_show(”, ‘hoge.jpg’);”>

こんな感じでしょうか。
これを実行すると
ブラウザの画面が暗くなり、新しいウィンドウが生成されます。
(新しいウィンドウにはhoge.jpgが表示されます。ここにはhtml等も表示できます。)
以上がthickboxの簡単な説明でした。

では本題の対処方法について書いてゆきます。
こんな便利なthickboxなのですが
IEのwindow.onloadでtb_showを以下のように呼び出しても、画面が暗くなるだけで新しいウィンドウはでてきません。
(firefox, chromeでは正常に動作しました。)

window.onload = function(){tb_show(”, ‘hoge.jpg’)};

この場合はwindow.onloadの代わりにjQueryのsetTimeoutを使って..

jQuery(function(){
setTimeout(function(){ tb_show(”, ‘hoge.jpg’) }, 500);
});

このようにすれば動きます。

こんな感じでしょうか。
以上が対処方法です。

ドキュメント管理から始める分散バージョン管理システムの導入

0

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

こんにちは、shimadaです。

オープンソースの世界では着々と普及が進んでいる分散バージョン管理システム(DVCS)ですが、 商用開発の現場では、スケジュールの制約や実績、メンバーの習熟度の問題から、 実際のプロジェクトにはなかなか導入できないのが実情ではないでしょうか。

バージョン管理システムは、個人でちょこちょこいじってもノウハウは蓄積できません。なぜなら、チーム開発でしか起こらないコンフリクトやマージといった作業が、個人作業では発生しないからです。

僕らのチームでも、興味はあっても採用のきっかけがないという状況でした。

そこで、まずはDVCSをチームで使ってみるための入り口として、仕様書やスケジュールなどのドキュメントをDVCSで管理してみようというのが今回の試みです。

業務用のドキュメントはソースコードの他に、仕様書、設計書、スケジュールなどいろいろあります。 これは社内ではファイルサーバで共有・管理されています。

これらの管理にDVCSを導入するためのポイントは、

  • 通常業務で使うこと
  • 使う余裕のある人から段階的に導入できること
  • 使っていない人が不自由を感じないこと
  • バージョン管理システムの基本的なメリットを生かせること
  • DVCSの基本的な概念や操作を体で覚えられるようになること

といった点です。これらをクリアできるような方法を考えなければいけません。

ひとくちにDVCSといっても、今ではいろいろなソフトウェアがリリースされています。 僕のイチ押しはGitなのですが、試してみたところ日本語のファイル名がエスケープされてしまって実用になりませんでした。 そこでいろいろ実験した結果、日本語ファイル名でもそこそこ実用になりそうなMercurialを使うことにしました。

まずプロジェクトで使っているファイルサーバのディレクトリをマウントしたあと、Mercurialのリポジトリにするためのコマンドを実行します。


% hg init

これで、ディレクトリの下の .hg/ 以下にリポジトリが作成されます。


% cat >.hgignore
syntax: glob
._*
.DS_Store
^D

Macでファイルサーバにファイルを作ると、メタ情報を格納するための隠しファイルを作成するようです。 Windowsから見るとディレクトリがかなりごちゃごちゃした感じになってしまいます。 そこで、.hgignoreというファイルを作ってMercurialからは無視するように設定します。 Macの作るメタ情報は、’.DS_Store’ と ‘._元ファイル名’ の2種類で、これらをはじくように設定します。


% hg addremove

Mercurialでは、作業ディレクトリを自動でスキャンして、新しいファイルをadd, なくなっているファイルをremoveしてくれる便利な「addremove」というコマンドが備わっています。

Subversionでは、ファイルを作成したり削除したりした場合、コマンドラインからひとつずつ add/remove する必要がありました。こういう作業をコマンド一発でやってくれるのは地味に便利です。


% hg commit -m 'initial commit'

最後にコミットすればプロジェクト用のディレクトリにあるファイル一式をリポジトリに登録完了です。

つぎにローカルで作業するためのクローンを作成します。


% hg clone 《ファイルサーバのディレクトリ》 《ローカルのディレクトリ》

マウントしたファイルサーバをリポジトリとして使うと、サーバーを建てなくても ローカルと同じ手軽さで clone/push/pull を行えるので便利です。

あとは、ローカルのディレクトリでファイルを作ったり更新したりして、 作業が一区切りしたときに


% hg commit -m 'コミットメッセージ'
% hg push

この二つのコマンドでファイルサーバ側に作業したチェンジセットを送信します。

ただし、まだ Mercurial を導入していないメンバーはファイルサーバのファイルを直接編集したりしていますので、pushする前に必ずファイルサーバのディレクトリに cd して


% hg status

を実行してファイルが更新されていないか確認します。

特にワープロや表計算ソフトのドキュメントは、開いたままだと一時ファイルやロックファイルが作られるので、 そのままの状態でコミットしてしまうと面倒なことになります。 チーム内で声を掛け合って、ファイルを開いている人はいませんか、と確認したりしています。


% hg addremove
% hg commit

これでまずファイルサーバ側で更新されたファイルをリポジトリにコミットします。 そのあとローカル側のpushを実行します。そのあと、ファイルサーバの作業ディレクトリをリポジトリに同期します。


% hg update

これで、自分の更新した内容がファイルサーバに反映されたことになります。

最初、自分ひとりだけが Mercurial を使い始めたときは、ローカルでコミットしてサーバでアップデートして、とかなりまだるっこしい作業を続けていました。

でも、ある時メンバーのひとりが、重要なスケジュール表のファイルを間違って削除してしまったのです。 ここで、バージョン管理の強みが生かされました。


% hg update

これだけで、消えてしまったファイルが復活しました。やっておいてよかった、としみじみ思った瞬間です。 また、他のメンバーにドキュメントをバージョン管理するメリットを印象づけるよい機会となりました。

今、僕のプロジェクトチームでは、コアメンバーは皆ドキュメントの更新にMercurialを使っています。「いま仕様書の変更をコミットしました」 「じゃあpullして確認します」

今はこんな感じで作業が進んでいます。 一人一人のローカル環境に、リポジトリのミラーが作られるという分散バージョン管理の基本も、使っているうちに飲み込めてきています。

「あれ、headが二つできてしまった」
「コミットする前にpullしておかないとそうなるんだよね」
「とりあえずマージしておけば大丈夫だよ」

そろそろプロジェクトでは、システムの実装に作業がシフトしつつあります。 ドキュメント管理には大活躍のMercurialですが、ソースコード管理は実績とノウハウの豊富なSubversionを使う方針です。

でも。

メンバーの間では、

「git svnっていいらしいね」
「GitとMercurialってどのくらい違うのかな」
「ああ、Gitにはステージングっていう概念があって……」
「ほほう、それは便利そうだ!」

などと、話が弾んでいます。社内のプロジェクトでGit/Subversionの併用事例が増えていくのは時間の問題じゃないかな、と個人的には思っています。

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との連携について書く予定です。

最近人気な記事