ホーム ブログ ページ 55

WindowsXPの起動が遅いので設定を見直してみる(wuauclt.exeの確認)

0

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

最近WindowsXPの起動が遅くて、アプリケーションの立ち上げに時間がかかります。ブラウザ立ち上げるのに5分くらいかかります。

タスクマネージャーで確認してみると、wuauclt.exeというWindowsUpdateの自動更新プロセスをなんとかしてみます。

wuauclt.exeはWindowsXP起動直後、タスクマネージャーにてプロセスをメモリ使用の大きい順でソートすると上のほうに出てきます。

このプロセスは今までのWindowsUpdateで今まで何を更新してきたかの履歴を調べ、その時点での最新のアップデートを監視するようです。なので、履歴が多ければ多いほど負荷がかかるようです。

解決方法としてはアップデート履歴を消すこと

参考URL 
http://www.inoran.com/archives/2009/0523_1753.php

↑のサイトを参考に、以下を実行します。

1. Automatic Upates(自動更新)サービスを停止
2. DateStoreフォルダの内容を削除
  ※私の場合、このフォルダの容量は200MBちょいありました。
3. AutomaticUpdates(自動更新)サービス再開

今までに比べてPC起動からブラウザ立ち上げまでの時間が少し早くなったような気がします。

画像ファイルからEXIF情報を取り出す

0

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

画像ファイルからEXIF情報を取り出すにはどうしたら良いのでしょうか?

まず、そんな疑問に今回は挑戦しました(大げさ)。

画像ファイルからEXIF情報を取り出すにはどうしたら良いのでしょうか?

まず、そんな疑問に今回は挑戦しました(大げさ)。

 [概要]

RubyのExifライブラリは幾つかあるようですが、現在も開発が進んでいるものが少ないようです。

そんな中、

http://rubyforge.org/projects/exifr

を見つけました。

ライセンスはRubyライセンスです。

今回、このexifrを利用して、画像ファイルからEXIF情報を取得します。

 [目的]

画像ファイルからEXIF情報、特にデジタルカメラのメーカー名、カメラ名を取得したいと思います。

(今回はSONY DSC-W300で撮影した画像を利用します)

 [方法]

[インストール]

gemからインストールしてみます。

sudo gem install exifr

インストールはとても簡単です。

gemが古い場合はインストール時にErrorが起こってしまいます。

sudo gem install rubygems-update
sudo update_rubygems

をしてgemのバージョンを最新版にするといいでしょう

[使用方法]

では、実際にirbから使ってみましょう。

tomonori:~# irb
irb(main):001:0> require 'rubygems'
irb(main):002:0> require 'exifr'
irb(main):003:0> file = '/path/to/filename'
irb(main):004:0> exif = EXIFR::JPEG.new(file)
irb(main):005:0> exif.make
=> "SONY"
irb(main):006:0> exif.model
=> "DSC-W300"
irb(main):007:0> exif.width
=> 2048
irb(main):008:0> exif.height
=> 1536
irb(main):009:0> exif.date_time
=> Sat Dec 20 16:14:57 +0900 2008

 [まとめ]

exifrというライブラリを利用することで簡単に画像ファイルからEXIF情報を取得できました。

これを利用することで、カメラ情報などが画像から取得できます。

今回は試しておりませんが、どのケータイから撮影されたものかもわかりますので、そのユーザが撮った画像であるかどうかの判断にも利用出来るかと思います。

ruby on railsでデータをCSV形式で出力する。 to_csv Plugin編

0

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

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

今回は、ruby on railsでデータをCSVファイル出力が簡単にできる プラグインついて書きます。

前回、ruby on railsでデータをExcelファイルに出力する方法を書きましたが

ExcelファイルよりCSVファイルに出力する機会が多いだろうと思います。

また、railsでCSVファイルを出力するのは、さまざまな方法がありますが、

今回は設定も簡単で、コードの記述も比較的少なくてすむ to_csvというpluginの使い方について書こうと思います。

環境

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

to_csvのインストール

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

fastercsvのインストール

to_csv はfastercsvが必要なため
gem install fastercsv

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

def index
    @users = User.all

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

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

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

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

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

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

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

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

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

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


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

というようにアクション名の後ろにファイル名をつけてブラウザでアクセスすると
データがCSV形式で出力されますので、ファイルに保存後エディタ等で開くとデータを見ることができます。

なお、この出力したファイルをExcelで表示してみるとわかるのですが、
なんと日本語が文字化けします。これはto_csvの出力がUTF8になっているためで、Excelはsjisでないと日本語が文字化けしてしまいます。

原因は出力時の文字コードですので、kconvなどを利用して、CSVデータを出力している部分に tosjis をしてあげればいいでしょう。

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

Ary Djmal / to_csv plugin: Better Excel Compatibility
 http://arydjmal.com/2008/6/11/to_csv-plugin-better-excel-compatibility

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

counter_cacheを使ってみよう

0

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

こんにちは。KBMJの本多です。

今回はcounter_cacheの使い方を紹介します。
counter_cacheとは、RailsActiveRecordでRDB関連の設定の1つです。
これを設定することにより、親子関係のテーブルにおいて、親テーブルが子テーブルの
件数をキャッシュすることができるようになります。
例えばいろんな商品のクチコミサイトがあるとします。

そこでは各商品毎にクチコミを複数件登録することができ、
商品一覧ページにクチコミ件数を表示したり、クチコミ件数が多い順に並び替えたりできる、という設定です。

さて、クチコミ件数が多い順に並び替える時はどんなSQLを発行しましょうか。

商品とクチコミは1対多の関係なので、各テーブルとカラムは以下の通りです。
(今回の説明に必要ないモノは省いています)

・商品(親テーブル)
モデル名:Item
テーブル名:items
カラム:id, name

・クチコミ(子テーブル)
モデル名:Comment
テーブル名:comments
カラム:id, item_id, comment

・クチコミのモデル内での商品との紐付け設定
class Comment < ActiveRecord::Base
  belongs_to :item
end
この場合、発行されるSQLはこんな感じです。
select *,
       (select count(*) from comments where comments.item_id=items.id ) as count
from items
order by count desc;
Rails的な書き方だと
Item.find(:all,
          :select => “*,(select count(*) from comments where comments.item_id=items.id ) as count”,
          :order => “count desc”)こうなります。

動けば何でも良いのであればこれで良いのですが、このやり方だとデータ量が増えた時に処理が重くなる原因になります。
対象の商品の全クチコミをカウントするので当然「index?なにそれ?」状態です。

さすがに↑のやり方は重いですが、こういう書き方もできます。
SELECT items.id, count(comments.id) as count
FROM items
      left join comments on comments.item_id=items.id
group by items.id
order by count desc;
Rails的な書き方だと
Item.find(:all,
          :select => “items.*, count(comments.id) as count”,
          :joins => “left join comments on comments.item_id=items.id”,
          :group => “items.id”,
          :order => “count desc”)こうなります。
子テーブルをleft joinで引っ張ってきて、group化する事でカウント処理を行わないようにしました。

…SQLが目に見えて複雑化していますね。
先程の1件ごとのカウントよりはだいぶマシですが、indexが使えないので後々重くなると思います。
また、group byの指定は使用するDBがMySQLの時のみこの書き方が使用可能です。
postgresの場合はselectする項目(countを除く)をすべて指定する必要があります。かなり面倒です。
今回の例題はitemsテーブルのカラムがid, nameだけなので全部書けば良いですが、実際の開発ではこんなにカラムが少ないわけもなく、
開発現場から悲鳴が聞こえてくるハメになります…。

そこで今回紹介するcounter_cacheの出番です。
先程紹介したテーブルのカラム、及びモデルの設定を以下のように追加します。

・商品(親テーブル)
モデル名:Item
テーブル名:items
カラム:id, name, comments_count

・クチコミ(子テーブル)
モデル名:Comment
テーブル名:comments
カラム:id, item_id, comment

・クチコミのモデル内での商品との紐付け設定
class Comment < ActiveRecord::Base
  belongs_to :item, :counter_cache => true
end
itemsテーブルに追加したcomments_countは:default => 0にする必要があります。
これだけでクチコミが増えたり減ったりした時にカウントを計測してitemsテーブルのcomments_countに保存されるようになります。

先程のSQLも以下のように変化します。
select *
from items
order by comments_count desc;
Rails的な書き方だと
Item.find(:all,
          :order => “comments_count desc”)こうなります。

これならリスト取得時にクチコミ数をカウントする手間がなくなり、
またcomments_countにindexを貼ることができるため処理速度が改善されます。
是非何かの役立ててください。
それでは。

GOOD RAILS!!

PoundのHTTPヘッダーサイズ(2048kbの壁)

0

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

ロードバランサーによくPoundを使用しますが、うっかりしてるととんでもない落とし穴にはまります。

ある日出社すると、、、

Mさん「テスト環境でちゃんと動作する検索フォームが本番環境だと動きません。どうやらPoundがHTTPヘッダーを2048byteしか受け取れないみたいです。Apacheは4096byte受けてるのでロードバンラサーをかましてないテストではうまくいっちゃてるみたいです。」

「おはようございます」を交わす前にこんな会話からはじまるのでした。

よくよく調べると同じ症状で困ってる先人方がたくさんおりました。

つまりGETリクエストにあまりに長いクエリーを突っ込んだり、2kbを超えるようなCookieを仕込むと「長すぎるよ」って怒られるようです。

この怒られる限度が2kbか4kbの差で挙動が変わるようです。

最新のバージョンでは改善されているようですが、CentOS を使用していた関係上yum管理のものを入れておいたほうがよいだろうと rpmforge から入れた 2.4.3-1.el5.rf を使用していました。

対処法1:最新版のソースからコンパイルして入れ替える。

対処法2:新し目のrpmを探してきて入れ替える。

今回はやっぱりrpmでいれておきたいので対処法2を模索しました。

新し目のバージョンのrpm はここから拾えます。

今回はCentOS5.4なのでEPEL 5なPound-2.4.4-1.el5.x86_64.rpmで良いでしょう。

HTTPヘッダーのサイズはPoundヘッダーソースファイル内(pound.h)に

#define MAXBUF      2048

のように定義してあるのでMAXBUFが4096であることを確認する為に、Pound-2.4.4-1.el5.src.rpmも落としてソースを確認します。

2.4.4-1.el5は MAXBUF 4096 だったのでこれなら問題は起きないはずです。

rpmforgeから入れた2.4.3-1.el5.rfからはアップデートできなかったので一度削除。

# yum remove pound -y

それからダウンロードしてきた物をインストール

# yum install Pound-2.4.4-1.el5.x86_64.rpm --nogpgcheck -y

以上を入れなおした結果、Poundを経由しても問題の長いGETクエリー(4kb以下)を発行する検索フォームも動作するようになりました。

Macとwindowsでマウスの共有

0

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

Macもwindowsも両方使いたい!
そんなあなたに捧げます。Macとwindowsでマウスの共有ができるソフトの紹介です。

環境

Mac: MacOS 10.5
Windows: WindowsXP

インストール

synergy
こちらよりソフトのダウンロード
Macは、〜OSX.tar.gz
Winは、〜.exe
をそれぞれ落とします。

今回は、Mac側をサーバー、Win側をクライアントにする説明します。

Mac側

ダウンロードしたファイルを解凍。中にある「synergys」ファイルを
/usr/local/bin/
配下にコピーします。コマンドはこんな感じ。
# sudo cp synergys /usr/local/bin/これでソフトの設置完了。
次に設定ファイルを書きます。
解凍した中に入っているsynergy.confを編集します。
section: screens
hogemac.local: #Mac側のIPアドレスなど
hogewin:                         #Win側のIPアドレスなど
end

section: links
hogemac.local:
right = hogewin

hogewin:
left = hogemac.local
end
上記設定は向かって左側にMac、右側にWinを置くと仮定した設定です。
Mac側のIPアドレスは、
システム環境設定→共有
内の、「ローカルネットワーク上のコンピュータから、次のアドレスでこのコンピュータにアクセスできます」のあとに書いてある〜.local
がそのまま使えます。
Win側は、ローカルIPなり、物理アドレスなりを設定して下さい。
設定ファイルが完成したら、# sudo mv synergy.conf /etc/で/etc/配下へ移動。これで設定ファイルの設定は完了です。
次に起動スクリプトを作成します。
アプリケーション→AppleScript→スクリプトエディタ
を起動
do shell script “/usr/local/bin/synergys -f –config /etc/synergy.conf -n hogemac.local”と書き、任意の名前で保存。このスクリプトをMacログイン時に読ませれば、自動でsynergyを起動してくれます。

これでMacの設定はおしまい。

Win側

ダウンロードしたソフトを解凍、そして起動。
Use another compute’s shared keybord and mouseにチェックを入れ、Other Computer’s Host NameにMacのローカルIPを入れて下のTestを押下。
うまく行ったらStarを押下。これで起動します。

以上で設定終了です。

これで、Macとwindowsでマウスの共有ができます。

surround.vim のつかいかた

0

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

surround.vim のつかいかたです。Vim ライトユーザにもおすすめしたいので、にほんごで簡単につかいかたを書いてみます。

 導入

例により、vim.org から ダウンドードしてきます。

つい最近、バージョン 1.9 がでています。vim.org では Vim のバージョンが 6.0 対象と書かれていますが、ヘルプをみると Vim 7 以降がオススメとあるので、Vim 7以上でも安心です。

適当に展開して plugin, doc にファイルを置き、:helptags path/to/help(ヘルプの置いてあるパス) などとしてヘルプを引けるようにしておきます。

 テキストオブジェクトおさらい

surround.vim は vim のテキストオブジェクトに対する操作を拡張するプラグインです。テキストオブジェクトをざっくりおさらいです。

テキストオブジェクトはとてもおおざっぱに言えば、あるまとまりのテキストをのことです。このまとまりに対し操作を行なうことができます。

とりあえず見れば、ああ、あれか、と思うようなものなので、とりあえず見てみます。

# before

moji1    retu

というテキストがある場面で、moji1 のどこかの文字の上にノーマルモードでカーソルがあたっているとします。

そのときに diw とコマンド入力すると、”moji1″ というひとまとまりのテキストが削除されます(ここでは、単語という単位のひとまとまりのテキスト)。

# after

    retu

また、同じ場面で daw とすると “moji1 ” というひとまとまりのテキスト+次の単語までの空白文字が削除されます(ここでは単語と、それに付随している空白というまとまり)。

# after

retu

上で出てきた diw, daw のうちの、iw や、aw がテキストオブジェクトにあたります。diw の d は削除コマンド d のことで、テキストオブジェクト iw に対する操作コマンドになります。削除してインサートモードになる c や、ビジュアルモードの v などのコマンドが使えます。

テキストオブジェクトは iw, aw のほかにも以下のようなものがあります(見た目で、うごきがわかりやすいのをあげてみます。詳しくは :help text-objects)。

iw (単語)
aw (単語+次の文字までの空白)

it (タグの内部 <strong>hoge</strong> の hoge)
at (直近の外側にあるタグ含む文字列 <p><strong>hoge</strong></p> の場合、
    hoge や、strong 上でコマンドを入力すれば、<strong>hoge</strong> が対象になる)

i( (括弧内を以下略。 ib でも可。)
a( (括弧含め以下略。 ab でも可。 b は多分ブラケットの b です)

:h text-objects (ヘルプを見ましょう)

ということで、テキストオブジェクトはこんな感じのものでした。

 surround.vim について

surround.vim の基本的な概念

surround.vim での編集方法はざっくりで二種類の分けかたができます。

  1. 既に囲んでいるものに対する編集
  2. 新たにテキストオブジェクトを囲む編集
1. 既に囲んでいるものに対する編集

何かの記号やタグなどの、囲んでいるものに対して行なう編集です。そのまんまです。

ex:
'hoge'            (囲んでいるもの: ' )
"hoge"            (囲んでいるもの: " )
(hoge)            (囲んでいるもの: ())
<tag>hoge</tag>   (囲んでいるもの: <tag> )

[hoge]

{hoge}

といった文字列に対して利用できます。この「囲んでいるもの」たちを、削除したり、違うものに変えたりする、という操作ができます。

以下のコマンドの組みあわせで実現できます。

編集コマンド(d, c) + s(surround の s) + 囲んでるもの(‘ とか ” とか <tag> とか)

囲んでいるものを削除する場合は以下のようになります。

d + s + 囲んでるもの
ds'     (今カーソルのある文字列を囲んでいる ' を消す)
ds"     (" を)
ds(     (() を)
dst     (<tag> を)

囲んでいるものを変える場合は以下のようになります。

c + s + 囲んでるもの, + 変更したいもの
cs'"            (今囲んでいる ' を " に変える)
cs"<tag>        (今囲んでいる " を <tag> に変える)
cst<tag>        (直近で囲まれてるタグを <tag> に)
2. 新たにテキストオブジェクトを囲む編集

word に対する iw とかのテキストオブジェクトを、新たに囲む編集です。そのまんまです。

hoge
{ :foo => 'bar' }
he said, i am a pen.
hogehogehogehoge
yahhooooo konnichiha-

といった文字列を囲むという操作です。

以下のコマンドの組みあわせで実現できます。

ys + 範囲 + 囲む文字列

※ 以下では ‘*’ で、今カーソルのある位置を示し、||で囲まれた範囲はビジュアルモードで選択されているものとします。

befor                   →  after                     # コマンド

h*oge                   →  "hoge"                    # ysiw"
"↑ カーソル位置の単語を " で囲う

{ *:foo => 'bar' }      →  ( { :foo => 'bar' } )     # ysa{( or ysaBb
"↑ カーソル位置の {} で囲まれた文字列を () で囲う

he said, *i am a pen.   →  he said, "i am a pen."    # ys$"
"↑ カーソル位置がら行末までを " で囲う

hogehoge|hoge|hoge      →  hogehoge"hoge"hoge        # s"
"↑ 選択範囲を " で囲う

yahho*oooo konnichiha-  →  'yahhooooo konnichiha-'   # yss'
"↑ 行全体を ' で囲う。行指向操作。

以上が、surround.vim の機能、「既に囲んでいるものに対する編集」と「新たにテキストオブジェクトを囲む編集」です。

ほか

インサートモードでも使う

<C-G>s でインサートモードでも使えます。インサートモードで、以下のようなコマンドで操作します。

入力:
  <C-G>s<tag>
結果:
  <tag>*</tag> (* はカーソル位置。タグに囲まれた状態になる。)

入力:
  <C-G>s"
結果:
  "*"
自動でインデント(yS, S)

ys を yS に変えると囲うと同時にインデントもしてくれます。<div> などのタグで囲ったとき使うと少し便利かもしれません。

hello

という文字列のある行に対して、ySS<div> という操作をすると以下のようになります。

<div>
  hello
</div>
カスタマイズ

囲う文字列は自分で追加できます。vimrc とかに書いとくと使えるようになります。

let g:surround_コマンド = "開始 \r 終了"

let g:surround_45 = "<% \r %>"
"↑ 45 は - をコマンドに使うという意味。

let g:surround_61 = "<%= \r %>"
"↑ 61 は = のこと。この数値は、- とか = の上で :ascii すればわかります。

" 以下のように書くこともできます(直感的な書きかた)
let g:surround_{char2nr("-")} = "<% \r %>
let g:surround_{char2nr("=")} = "<%= \r %>

こう書いておくと、新たな – とか = の囲うコマンドが使えるようになります。

befor       →  after               # コマンド

'hoge'      →  <%= hoge %>         # cs'=
" ↑' で囲まれている文字列を <%=  %> で囲う

@hoge.name  →  <%= @hoge.name %>   # yss=
"↑ カーソルのある行を <%=  %> で囲う

ちなみに、上記の – とか = は、rails.vim + surround.vim という環境では、erb ファイルの編集時に使えるよう、はじめから定義されています。

もっとカスタマイズ

プロンプトでいろいろ尋ねながら入力した文字列を、囲うものの要素としてつかうことができます。

	let g:surround_{char2nr("d")} = "<div\1id: \r..*\r id=\"&\"\1>\r</div>"
	" hoge に ysiwd とかすると
	" id: というのが下のコマンドラインにでてくるので何かいれると
	" (たとえば main とか)
	" <div id="main">hoge</div>
	" というふうになります。
	
	let g:surround_{char2nr("a")} = "<a href=\"\r\">\1link_text: \r..*\r&\1</a>"
	" http://doruby.com という文字列に yssa などとすると、
	" link_text: などというプロンプトがでてくるので、何かいれると
	" (たとえば ナイスブログ とか)
	" <a href="http://doruby.com">ナイスブログ</a>
	" というふうになります。
	

プロンプトで尋ねるのは7つまで使えます。

もとからある t をツブすとタグを入力するとき残念なことになるので空いてる文字をさがして適当にわりあてましょう。

大変長くなってきました。長いのでもう終わりです。

快適 vim ライフをすごしましょう!

FireFox3.6のFileAPIを使ってドラッグ&ドロップでファイルアップロード

0

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


最近リリースされたFireFox 3.6ではFileAPIという機能が使えるようになりました。

今回はFileAPIで実現出来るようになったドラッグ&ドロップでのファイル選択を使ってファイルアップロード機能を実装してみます。

今回のスクリプトはこちらのサイトを参考に書きました。

Using files from web applications – MDC

ソースは以下のとおり。

<script language="javascript">
  function MultipartData(boundary) {
    this.boundary = boundary;
    this.data = "";
    this.data += "--" + boundary + "\r\n";

    this.append = function(name,value){
      this.data += "Content-Disposition: form-data; name=\"" + name + "\"\r\n\r\n";
      this.data += value + "\r\n";
    };

    this.appendFile = function(filename,filedata){
      this.data += "Content-Disposition: form-data; name=\"uploadfile\"; filename=\"" + filename +"\";\r\n";
      this.data += "Content-Type: application/octet-stream;\r\n\r\n";
      this.data += filedata + "\r\n";
    }

    this.appendBoundary = function(last){
      if(last != undefined && last == true){
        this.data += "--" + this.boundary + "--\r\n";
      } else {
        this.data += "--" + this.boundary + "\r\n";
      }
    }
  }

  function dragenter(e){
    e.stopPropagation();
    e.preventDefault();
  }

  function dragover(e){
    e.stopPropagation();
    e.preventDefault();
  }

  function drop(e){
    e.stopPropagation();
    e.preventDefault();

    var dt = e.dataTransfer;
    var files = dt.files;
    this.files = files;
    var xhr = new XMLHttpRequest();
    boundary = "---------------------------14737809831466499882746641449";
    var multipartData = new MultipartData(boundary);

    multipartData.append("param","value");
    multipartData.appendBoundary();
    multipartData.append("multibyte_param",encodeURI("日本語"));
    multipartData.appendBoundary();
    multipartData.appendFile(encodeURI(files[0].name),files[0].getAsBinary());
    multipartData.appendBoundary(true);

    xhr.open("POST","/files/upload",true);
    xhr.onreadystatechange = function (aEvt) {
      if (xhr.readyState == 4) {
        if(xhr.status == 200){
          alert("アップロードが完了しました。");
        } else {
          alert("アップロードに失敗しました。");
        }
      }
    };
    xhr.setRequestHeader("Content-type","multipart/form-data; boundary="+boundary+ ";");
    xhr.setRequestHeader("Content-length",multipartData.data.length);
    xhr.sendAsBinary(multipartData.data);
  }

  document.getElementById("drop_area").addEventListener("dragenter",dragenter, false);
  document.getElementById("drop_area").addEventListener("dragover",dragover, false);
  document.getElementById("drop_area").addEventListener("drop",drop, false);
</script>

ドラッグ&ドロップでのファイル選択は以下のようにドロップイベントでイベントオブジェクトのdataTransferを取得するだけで簡単に実装できました。

    document.getElementById("drop_area").addEventListener("drop",drop, false);
  function drop(e){
    e.stopPropagation();
    e.preventDefault();

    var dt = e.dataTransfer;
    var files = dt.files;
    this.files = files;

さて、あとは取得したファイルのデータをアップロードするだけなのですが、これがなかなか面倒です。ファイルと一緒に他のパラメタも送信したいので、データやバウンダリーなどを追加していけるオブジェクトを作ってmultipartなリクエストを自前で作ってポストしています。

一つ注意点としては、日本語をそのままパラメタに入れてsendAsBinaryで送信するとエラーが起きるので、適当にencodeURIでエンコードして送信しています。

というわけでファイルアップロード機能が実装できました。

受け手のサーバ側はRailsで作りましたが、PHPなどでもそのまま受け取れると思います。FileAPI便利ですね!

cameraOverlayView に触れる

0

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

こんにちわ。iPhoneをもたないでiPhone開発するendです。
今日もちょっとiPhoneで遊んでみました。

UIImagePickerControllerが iPhone0S3.1 機能拡張された cameraOverlayView プロパティを利用して遊んでみました。
このcameraOverlayViewプロパティは、カメラを起動し表示される画面の上に、簡単に情報などを重ねて表示することができるものです。
拡張現実(AR)を作成するのに便利なものというところでしょうか。

今日は、ARというカッコよいものは作成できませんが、このcameraOverlayView に触れてみたいと思います。

 
    // UIImagePickerControllerのインスタンス化
    pickerController = [[UIImagePickerController alloc] init];
    // カメラモードの指定
    pickerController.sourceType = UIImagePickerControllerSourceTypeCamera;
    // シャッターボタンなどを隠す
    pickerController.showsCameraControls = NO;
    // overlayViewは, UIViewに野菜の画像を複数 addSubView したもの。
    // それをcameraOverlayViewにセットする。
    pickerController.cameraOverlayView = overlayView;
    // UIImagePickerの表示
    [self presentModalViewController:pickerController animated:NO];

 あとは、NSTimerをつかって段々近づいてくる感じにゴニョゴニョにしてみました。

1
2
3

お。簡単!!

なぜ野菜なのかは特に理由はありません。

まだ発売されていないiPadを表示して、早くもiPadをゲットしたぜ!! なんて冗談をやろうとしたのだが、

やってみたら、あまり格好よくなかったので、野菜にしました。

PowerPointでのプレゼンテーションでのひと工夫

0

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

みなさま、こんにちはえーきち。。です。

みなさまPowerPointの”アニメーション”機能って使っていますか?

取り入れますと文字の羅列だった資料にメリハリが生まれ、

相手に伝えたいことを強調することができます。

ではそのいろいろ紹介していきましょう。。。

アニメーションには大きく2種類存在してます、

 (1)ページとページをまたぐ際のアニメーション

 (2)ページ内でのアニメーション

まずは(1)ページとページをまたぐ際のアニメーション、をいろいろ見ていきましょう。

ファイルをひらいてメニュータブの[アニメーション]を選択ください。

囲った部分が主にページとページをまたぐ際のアニメーションの設定になります。

 (A)アニメーションの種類

 (B)アニメーション切り替え時の音/速度

 (C)アニメーション切り替えのタイミング

になります。

(B),(C)に関しては名前のままの設定ですので細かくは省きますが

実際に使用した感じですと”画面切り替え時の速度”は”普通”もしくは”遅く”がいいかもしれません。

(A)のアニメーションの種類については、表示されている13種類(デフォルト+12種類)以外に

実は多数存在しているのはお気づきでしょうか?

(かくいう自分はけっこう最近まで気づいてませんでした)

(A)の右端にスクロールボタンが存在しています、これでさらに種類を選択することができ合計59種類(57種類+デフォルト+ランダム)バリエーションがあります。

この中から独断と偏見による使い勝手のよいものを3つをご紹介します。

 「時計回りの輪,4 スポーク」

 「スライドアウト右下へ」

 「サークル」

いずれも、ユーザーの視点があまりぶれずにアニメーションが行われているものです。

内容やページ内のアニメーションの有無にあわせて選択すべきですが

ひとつ選択したら同じアニメーションで通すほうが

ユーザーにとっては見やすいかもしれません。

いずれにしても何度も確認を行い作成してください。

次回は(2)ページ内でのアニメーションを説明させていただきます。

【Ruby】半角/全角バリデータ【Rails】

0

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

入力項目には必ずといってもいいほど必要な「バリデーション」。
今回は、「その文字列が半角 or 全角文字のみであるか」というバリデーションをRubyで紹介します。今回の条件は以下の通りです。

半角文字:半角カタカナ、半角英数字、一部の記号(濁点、半濁点など)
全角文字:半角文字でないもの
メールアドレス、URLは除外

では、半角/全角のバリデーションのソース公開☆

KCODE = 'u'

  def self.hankaku?(str)
    return nil if str.nil?
    # 半角のみOKなので、全角が混ざっているとfalseが返る
    unless str.to_s =~ /^[ -~。-゚]*$/
      return false
    end
  return true
  end

  def self.zenkaku?(str)
    return nil if str.nil?
    # 全角のみOKなので、半角が混ざっているとfalseが返る
    unless str.to_s =~/^[^ -~。-゚]*$/
      return false
    end
    return true
  end

このままコピペすれば使えるはずです。
内容は非常に簡単で、正規表現で半角文字列にマッチするか否かを調べているだけです。

今回半角用と全角用を用意したのは、「その文字列が半角 or 全角文字だけで構成されているかどうか」を調べたかったからです。
hankakuメソッドだけでは、文字列が「全角文字と半角文字の混合」なのか「全角文字だけなのか」がわかりません。

では、住所のふりがなの入力チェックなんかに、ぜひ利用してみてください。

ブロックを使ったリファクタリング

0

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

こんにちは、shimadaです。

今日は、Rubyの特徴の一つであるブロックを引数にとるメソッドの書き方を説明します。

題材として、「あちこちに同じ順番で処理が並んでいる時のコードの整理」を取り上げたいと思います。

重要な処理を行う場合に、開始、終了、エラーが起こったときの詳細を記録しなければならない。

そんな時の処理は、だいたいこんな風になるのではないでしょうか。

class SimpleWorker
  def action(arg)
    logger = Application.logger
    begin
      logger.info("SimpleWorker.action", "start")
      do_something
    rescue => e
      logger.error("SimpleWorker.action", e.message + e.backtrace.join("¥n"))
      logger.info("SimpleWorker.action", "abnormal end")
      raise
    else
      logger.info("SimpleWorker.action", "normal end")
    end
  end
end

class ComplexWorker
  def complex_action(arg1, arg2, arg3)
    logger = Application.logger
    begin
      logger.info("ComplexWorker.complex_action", "start")
      do_complex_thing1
      do_complex_thing2
      do_complex_thing3
      do_complex_thing4
      do_complex_thing5
    rescue => e
      logger.error("ComplexWorker.complex_action", e.message + e.backtrace.join("¥n"))
      logger.info("ComplexWorker.complex_action", "abnormal end")
      raise
    else
      logger.info("ComplexWorker.complex_action", "normal end")
    end
  end
end

同じような記述がたくさん並んでいてうんざりですね。

気になる点は2つあります。

  1. “SimpleWorker.action” という文字列が何度も出てきてうざい。
  2. begin .. rescue .. else .. end のパターンが似ているっていうか同じ

これをリファクタリングしてみましょう。合い言葉は「DRY」です。

1.は変数に入れてしまえばなんとかなりそうです。

2.については、「同じ処理の並びを共有する」というところからGoFで有名なテンプレートメソッドパターンとかを思いつきます。

でも、shimadaは継承が割と嫌いです。

「重要な処理」というのはシステムの色々なところにちょこちょこ出てくるので、「必ず同じ親クラスから派生していなければいけない」という制限をかけるのは、システムを設計する上で大きな足かせになりえるのです。

ではどうするか。Rubyの特色はmix-inです。そしてshimadaの好物は高階関数です。

手続きを引数にとる手続き、つまりブロックを受け取るメソッドをモジュールとして書いてみましょう。

module LogHandler
  def logging(task_name)
    logger = Application.logger
    begin
      logger.info(task_name, "start")
      yield(logger)
    rescue => e
      logger.error(task_name, e.message, e.backtrace.join("¥n"))
      logger.info(task_name, "abnormal end")
      raise
    else
      logger.info(task_name, "normal end")
    else
    end
  end
end

早速、各クラスにincludeして使ってみます。

class SimpleWorker
  include LogHandler
  def action(arg)
    logging("SimpleWorker.action") do |logger|
      do_something
    end
  end
end

class ComplexWorker
  include LogHandler
  def complex_action(arg1, arg2, arg3)
    logging("ComplexWorker.complex_action") do |logger|
      do_complex_thing1
      do_complex_thing2
      do_complex_thing3
      do_complex_thing4
      do_complex_thing5
    end
  end
end

すっきりしましたね。

また、ブロックを使ったプログラミングで混乱しがちなのが、「ブロックが受け取る引数」です。

この例ではyield(logger)に渡された値を do |logger| で受け取っています。

処理の流れが普通の関数呼び出しの逆になるので、初めての人は慣れるまでたくさん素振りして下さい。

ところでブロックを引数にとるメソッドの書き方には何種類かありますが、引数名に ‘&’ をつける方法は、受け取ったブロックを他のメソッドにそのまま渡したい時に便利です。

def method1(obj, &block)
  obj.method2(&block)
end

例を書くための例といった感じで、なにをしたいのかさっぱり不明ですが、実際のプロジェクトでまさにこういうコードが実際に必要になったというか先週書いたばかりです。プログラミングって不思議ですね!

ところで、振る舞いのリファクタリング以外でも、ブロック渡しは例えばテストを書くとき等にも役に立ちます。

shimadaがどんな風に使ったかは、また今度の機会に紹介したいと思います。

みなさんもブロックをどんどん使ってRubyを楽しんで下さい。

rails1.2.6の豆知識

0

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

リダイレクトとreturnについて

初めてrails1.xを使って、下記のfilterにちょっと詰まった。

———————————

before_filter :login_check

before_filter :load_data

def index

:

:

end

def login_check

 if session[:user].blank?

  redirect_to :action=>”index”

  return

 end

end

def load_data

 p “this is test”

end

——————————-

rails2.3の場合、動きは大丈夫ですが、今回は ログインしていない(session[:user] = nil)のに、indexページに遷移できず、 “this is test”が出力されていました。 確認すると、rails1.xの場合、確かに「return false」にしないと、リダイレクトしてくれません。

twitter4rであそぼう

0

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

最近プログラミングとか全然できてないハチネンです。さて、「私はやらない」と思っていた twitter ですが、 気がつけば「なんとなく」使ってしまってます。 少しプログラミングをしたくなったついでに twitter4r を使って遊びたいと思います。 まず、twitter4r をgemからインストールしてください。


% sudo gem install  twitter4r -r
Building native extensions.  This could take a while...
Successfully installed json-1.2.2
Successfully installed twitter4r-0.3.2
2 gems installed
Installing ri documentation for json-1.2.2...
Installing ri documentation for twitter4r-0.3.2...
Installing RDoc documentation for json-1.2.2...
Installing RDoc documentation for twitter4r-0.3.2...

自分のtwitterアカウントのログイン情報、パスワードを書いたYAMLファイルを一つ用意します。


myinfo:
  login: hachinen
  password: mypassword

上記の情報を使ってtwitterを操作してみましょう。感覚だけつかめればいいので、今回はirbから操作します。最初に必要なライブラリを読み込みます。


irb(main):002:0> require 'rubygems'
=> true
irb(main):003:0> require 'twitter'
=> true

最初に先ほどのYAMLを使って認証済みのオブジェクトを取得します。


irb(main):008:0> tw = Twitter::Client.from_config('./twit.yml','myinfo')
=> #

このオブジェクトを使ってまずは適当につぶやいてみます。


irb(main):009:0> tw.status(:post, 'おなかへったー(hetter)')
irb(main):011:0> tw.status(:post, 'おなかへったー')

きちんとPostできたでしょうか。ブラウザからも確認してみます。

うまくいったようです次はフォローしているユーザ一覧のスクリーン名を出してみます。


irb(main):012:0> tw.my(:friends).each {|f| puts "スクリーン名 = #{f.screen_name}" }
スクリーン名 = rails
スクリーン名 = slashdotjp
スクリーン名 = DoRuby

簡単ですね。次はタイムラインとかも出してみます。


irb(main):015:0> tw.timeline_for(:me).each {|tl| puts tl }
おなかへったー
おなかへったー(hetter)

ちゃんとでました。他にも http://twitter4r.rubyforge.org/rdoc/ を見てみると色々できるみたいなので、また遊んでみようと思います。

Nagiosでログ監視!

0

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

こんにちは。wryyyです。

ディスク使用率や、Load Average等サーバに関する様々な監視が行える

Nagios

ですが、今回はNagiosでのログ監視について見て行きたいと思います。

まずは NagiosExchangeからcheck_logs.plをダウンロードし、インストールします。

(check_logs.plはperlで実行されるため、要perlです。)

そして、実行権を付けましょう!

これで、ひとまず ログ監視を実行できるようになりました。

さて、実行できたは良いものの

・どのファイルを読むのか

・どのエラーが発生した時に、メールを飛ばすようにするのか

等が設定できていないため、このままでは監視になりません。

ということで、次は「どのファイルを読み」、「どのエラーを拾うか」の設定をしていきます。

まずは、xxx.cfgというログ監視設定ファイルを作成し、/etc/nagios/check_logs/等、適当な場所へ配置します。

以下、設定ファイルの例です。

$seek_file_template='/var/lib/nagios/$log_file.check_log.seek';

# Required log files array
@log_files = (
      {'file_name' => '/var/log/syslog',
        'reg_exp' => '(ERROR|CRIT)',
     # 'lines' => 2,                #optional number of output lines  after match
     #  'new_line_reg_exp' => '^',  #optional new line regex to stop output lines
     #  'seek_file_suffix' => '2'   #optional seek file suffix
},
      {'file_name' => '/var/adm/messages',
       'reg_exp' => '(WARN|ERROR|FATAL)',
},
); 

上記、設定ファイルについて説明していきます。

まず、一番始めにある

$seek_file_template=’/var/tmp/$log_file.check_log.seek’;

これは、seekと呼ばれる、ログファイルを何行目まで読んだかを保存しておくファイルを指定しています。

次に、どのファイルを読むかについてですが、

これは、上部にある’file_name’ =>にて指定ができます。

次に、どのエラーを拾うかについては、

‘reg_exp’ => ‘(ERROR|CRIT)’を見てください。

()内に、拾いたい文言を「|」区切りで記載することにより、

()内に記載されている文言のログを拾う事ができます。

これで、基本的なログ監視の設定は以上です。

ただ、この設定だと拾わなくて良いログまで拾ってしまい、

このエラーは監視しなくて良いだろう!というログまで拾ってしまう可能性があります。

(su に失敗した時のエラーまで拾う必要はあるのか??等)

そこで、拾わなくて良いエラーがある場合は

‘neg_reg_exp’ => ‘()’

と記載することにより、()内に記載されているエラーは拾わないようになります。

以上、簡単ですがNagiosのログ監視設定でした。

監視に不必要なエラーを拾わないようにする設定は情報が少ないため、

参考にしていただけたら幸いです。

rubyでOAuthを使ってみる

0

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

Google, twitter, mixiアプリなどのAPI認可のためのOAuth(オース)という

プロトコルが利用されています。

今回は、マッシュアップなWebサービスを作る上で必要になってくるOAuthの簡単な概念とrubyでの使用例を紹介したいと思います。

 OAuthとは?

デスクトップアプリやwebアプリケーションなどにセキュアなAPI認証の

標準的な手段を提供するオープンプロトコルです。

OAuth利用することによって、ユーザのgoogleアカウント情報(ID,Password)を保持しなくてもgoogleのアドレス帳などを参照するwebサービスを作ることができます。

 OAuthが必要になった背景

OAuthがなかった場合、先程の例のようなgoogleのアドレス帳を参照するサービスを作ろうとした場合、ユーザのgoogleアカウント情報をもとにアクセスすることになります。しかし、googleのアカウントはGmailやgoogleチェックアウトなど様々なサービスに紐づいており、迂闊にこのようなアクセスをすると万一の時のリスクが高くなります。

そもそもこの例では、googleのアドレス帳にさえアクセスできれば十分で、このように限られたリーソスへのアクセスを認証するため、APIへのアクセスを認可する手段が必要となりました。

 OAuthでのAPI認証の流れ

OAuthではトークンのやりとりによって、APIのアクセスの認可を行います。

OAuthではいかの登場人物が登場します。

  • OAuth Service Provider…APIを提供する側(例:twitter, google)
  • OAuth Service Consumer…APIを利用する側(例:twitterクライアント, google API群を利用したサービス)
  • User…ConsumerがProviderが提供するAPIを利用してProviderのサービスにアクセスすることを許可する人(例:twiiterクライアントを使おうとしている人)

それでは、OAuthによるAPIの認証の流れを説明します。

1) ConsumerはProviderにアプリケーションの登録を行い、Consumer KeyとConsumer Secretを取得する。

2) Consumer KeyとConsumer Secretをもとにrequestトークンを取得する

3) 取得したrequestトークンをもとに、ユーザがAPI認可するためのURLを生成する

4) ユーザは生成されたAPI認可のページアクセスし、ConsumerがAPIを利用してProvierにアクセスすること許可(または拒否)する

5) (以下許可されたと仮定)認可されたrequestトークンを元に、access token, access secretを取得する

6) access token, access secrete, consumer keyを元にAPIにアクセスする。

大まかにこんな流れでAPIの認証が行われます。改めてここで重要なのは「ConsumerにはユーザのProviderのアカウント情報がわたっていないことです」

大まかな流れが理解できたところで、実際にOAuthを使ってみたいと思います。今回は題名の通り ruby を使って twitter でのOAuthを試してみたいと思います。

 準備

あらかじめ、twitterのアプリ登録とoauthライブラリをインストールしておきます。rubyのoauthライブラリはgemでインストールできます。

gem install oauth

また、twitterのアクセスの簡単化のため twitterのライブラリもインストールしておきます

gem install twitter

 実際にやってみる

今回は、OAuthの流れをつかみやすくするためirbで試してみました。

require 'rubygems'
require 'oauth'

CONSUMER_KEY = "your-key"
CONSUMER_SECRET = "your-secret" 

consumer = OAuth::Consumer.new(CONSUMER_KEY, CONSUMER_SECRET, :site => "http://twitter.com")

request_token = consumer.get_request_token 
# twitterに対してrequestトークンを要求

request_token.authorize_url # requrest tokenをもとに認証URLを生成

ここで表示されたURLにアクセスし、このrequest tokenを有効にしてください。

irbは止めずにこのままにしてください。

oauth_verifier = "000000" 
# 許可後した後に表示された数字を入力してください

access_token = request_token.get_access_token(:oauth_verifier => oauth_verifier )
# 有効化されたrequest_tokenをもとにaccess token, access secretを取得

access_token = access_token.token
access_secret = access_token.secret

# access_key, access_secret, consumer_key, consumer_secretをもとにAPIにアクセスする
oauth = Twitter::OAuth.new(CONSUMER_KEY, CONSUMER_SECRET)
oauth.authorize_from_access(access_token, access_secret)
twitter_client = Twitter::Base.new(oauth)

# 投稿してみる
twitter_client.update("hogehoge")

ここで、実際に書き込まれたかtwitterに書き込まれたことを確認しましょう。無事書き込まれていたら、OAuthによるAPI認証成功です。

パスフレーズなしでSCP(秘密鍵の場合)

0

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

パスフレーズなしでSCPをする方法としてはssh-agentを使う方法や、 秘密鍵を使う方法がありますが、今回は後者の秘密鍵を使う方法をご紹介します。

まず転送先のサーバで秘密鍵と公開鍵を作成します。
ここでポイントなのが秘密鍵はパスワードなしで作成するということ。
パスワードなしでも秘密鍵自体を盗まれなければ危険はありません。

(転送先での作業)
$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/hoge/.ssh/id_rsa):
Created directory ‘/home/hoge/.ssh’.
Enter passphrase (empty for no passphrase): (未入力でEnter)
Enter same passphrase again: (未入力でEnter)
Your identification has been saved in /home/hoge/.ssh/id_rsa.
Your public key has been saved in /home/hoge/.ssh/id_rsa.pub.
The key fingerprint is:
6e:f3:a4:af:aa:84:9f:d3:b2:92:84:69:34:10:21:b9 hoge@scp-to

次に作成した公開鍵(id_rsa.pub)を転送元に設定します。
※安全のため、公開鍵を設定するauthorized_keys2のパーミッションは、所有者に対しては read/write を許可し、他のユーザーには、アクセスを許可しないで下さい。

(転送元での作業)
$ vi ~/.ssh/authorized_keys2
### id_rsa.pubの内容をコピペ ###
ssh-rsa ****************************
$ chmod 600 ~/.ssh/authorized_keys2

これでパスフレーズなしでSCPができるはずです。
試してみます。

(転送元での作業)
$ echo “scp test” > /var/tmp/scp-test.txt
$ scp /var/tmp/scp-test.txt hoge@scp-to:/var/tmp
scp-test.txt 100% ****************************| 9 00:00

できました!

rubyでRSSを取得する

0

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

こんにちは。T氏です。

今日はrubyでRSSを取得する方法をご紹介します。

rubyにはRSSを取得するためのクラスが用意されているため、それを使ったサンプル

を作成しました。

クラスは [RUBY_HOME]/rss/**.rb に色々と用意されています。

※rubyは1.8.7 を使っています。

# sample.rb
class Sample
  require 'rss'
  require 'uri'

  attr_accessor :title, :description, :link, :published_at

  def initialize
    @title = nil
    @description = nil
    @link = nil
    @published_at = nil
  end

  def self.get_rss(rss_url)
begin
      ary = []
      unless rss_url.nil?
        rss_results = ""
        url = URI.parse(rss_url).normalize
        open(url) do |http|
          response = http.read
          rss_results = RSS::Parser.parse(response, false)
          rss_results.items.each do |item|
            obj = self.new
            obj.title = item.title
            obj.description = item.description
            obj.link = item.link
            obj.published_at = item.date
            ary << obj
          end
        end
      end
      return ary
    rescue => e
      raise e
    end
  end

end

さて、実際に使ってみましょう。

ここではDoRuby!記事のRSSを取得しています。

$ irb -Ku
irb(main):001:0> require 'pp'
irb(main):002:0> require 'sample'
irb(main):003:0> rss = Sample.get_rss('http://doruby.kbmj.com/t_article/20091118/Rake_/feed')
irb(main):004:0> pp rss
[#   "こんにちは。T氏です。今日は自作のRakeタスクを追加する方法をご紹介します。 ",
  @link="http://doruby.kbmj.com/t_article/20091118/Rake_",
  @published_at=Wed Nov 18 10:00:00 +0900 2009,
  @title="Rakeタスクを追加する">,
 #  @description=
   "こんにちは。T氏です。 最近は、ようやくRailsの開発にも慣れてきました。慣れてくると、
Rails以外のフレームワークも使ってみたいな、なんて思ったりします。 そこで、以前から
気になっていたMerbのインストールから起動までをご紹介したいと思います。 \n",
  @link="http://doruby.kbmj.com/t_article/20090915/Merb_1",
  @published_at=Tue Sep 15 19:00:00 +0900 2009,
  @title="Merbを使ってみる">,
 #  @description=
   "こんにちは。T氏です。\n\n今日はRailsのエラー画面(public/404.htmlや500.html)への遷移は
どうやってされているかをご紹介します。",
  @link="http://doruby.kbmj.com/t_article/20090604/Rails_",
  @published_at=Thu Jun 04 19:47:37 +0900 2009,
  @title="Railsのエラー画面への処理を読む">,
 #  @description=
   "はじめまして!KBMJでエンジニアをやっているT氏です。初投稿の今回は、rakeコマンド
についてご紹介したいと思います。*rakeとは・・・ビルドツール(AntやMake等)のruby##の事    ",
  @link="http://doruby.kbmj.com/t_article/20090317/_rake_1",
  @published_at=Tue Mar 17 18:10:00 +0900 2009,
  @title=
   "Ruby on Railsでrakeコマンドを使って様々なタスクを実行しよう">]
irb(main):005:0> exit

無事に取得出来ましたね。

皆さんも試してみてはいかがでしょうか。

スマイリーメール

0

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

こんにちは。KBMJiの佐藤です。

今回はKBMJiで開発・販売しているiPhone向けのデコメアプリ「スマイリーメール」について紹介します。

スマイリーメール

http://farm5.static.flickr.com/4059/4349758775_654b4d722b_o.png
http://farm3.static.flickr.com/2614/4349758845_0984a8335e_o.png

スマイリーメールは、iPhone用のデコメアプリです。

スマイリーメールを使えば、iPhoneでデコメが使えるようになります。

アプリをインストールしたら、メールアドレスの設定を行います。

http://farm3.static.flickr.com/2724/4350505138_63621f151f_o.png

@i.softbank.jp で終わるメールアドレスからメールを送信する場合は、ここで「はい」ボタンをタップします。

http://farm3.static.flickr.com/2708/4350505192_9c3b114530_o.png

「SMTPサーバの設定」画面が表示されますので、ユーザ名とパスワードを入力します。

先ほどの「@i.softbank.jpで終わるメールアドレスから送信しますか?」とに対して「いいえ」ボタンをタップすると、

http://farm3.static.flickr.com/2801/4349759017_367afef946_o.png

「使用したいメールアドレスのSMTPサーバの情報が分かりますか?」と聞かれます。ここで「はい」ボタンをタップすると、

http://farm5.static.flickr.com/4002/4350505314_36cd1c4895_o.png

「SMTPサーバの設定」画面が表示されますので、メールアドレス・ホスト名・ユーザ名・パスワード・SSLを使用・サーバポートの入力を行い、「完了」ボタンをタップします。

先ほどの「使用したいメールアドレスのSMTPサーバの情報が分かりますか?」に対して「いいえ」ボタンをタップすると、

「メール送信」ボタンと「メールアドレス入力」ボタンが表示されます。

http://farm3.static.flickr.com/2487/4349759111_2f8e510429_o.png

ここで「メール送信」ボタンをタップすると、

空メールを送信することによってメールアドレスを登録することができます。

「メールアドレス入力」ボタンをタップすると、メールアドレスを手入力することによって登録することができます。

http://farm5.static.flickr.com/4025/4350505414_09e516707d_o.png

SMTP以外の方法でメールアドレスを登録すると、登録したアドレスに登録確認メールが届きますので、そのメール内に記載されている登録URLをタップして、本登録を行います。

http://farm3.static.flickr.com/2770/4349759227_9d5d73cdab_o.png

この画面がでれば登録完了!!

さっそくアプリを起動してください。

http://farm3.static.flickr.com/2704/4350505514_ef0e73d1d6_o.png

では、新規作成を選んで

http://farm5.static.flickr.com/4064/4350505566_c9cc8203f4_o.png

宛先をアドレス帳から選ぶ場合は[+]ボタンをタップ。

さていよいよ本文の編集です。本文の部分をタップすると

http://farm5.static.flickr.com/4041/4350505624_c5433edc0b_o.png

左から「文字の色変更」「文字の大きさ変更」「線を引く」「左・中・右寄せ」「アイコン・バナー画像選択」「背景色変更」「往復・スクロール」のアイコンが並んでいます。

アイコン・バナーは今後どんどん増やす予定なので、お楽しみに。

http://farm5.static.flickr.com/4009/4350505656_18af27eb85_o.png
http://farm5.static.flickr.com/4063/4349759405_1baea0499a_o.png
http://farm5.static.flickr.com/4020/4349759471_360f20b774_o.png
http://farm5.static.flickr.com/4039/4350505800_2ac830c731_o.png

さて色とりどりのメールができたら送ってみましょう。

http://farm5.static.flickr.com/4066/4349759569_0b9c0bc775_o.png
http://farm5.static.flickr.com/4008/4349759617_483266181b_o.png

ここで注意!相手に迷惑メールなどのフィルタで届かないことを防ぐ為に例えばあなたが@i.softbank.jpのアドレスを使っていたら相手に必ずドメイン指定受信の設定をしてもらってくださいね。

そうしないと届かないことがあります。サーバーを介してデコメを送っているので迷惑メールと間違えられる恐れがあるのです。。。

http://farm3.static.flickr.com/2449/4349759659_f936bc5fe4_o.png

署名などははじめからテンプレートにしてもよいかもですね。

http://farm5.static.flickr.com/4013/4350506016_9ae0da33f6_o.png

本文を編集中にテンプレートとして保存を押せばテンプレートとして保存できます。

署名はテンプレートにすることをオススメします!

http://farm5.static.flickr.com/4046/4350506062_8ba68d97ee_o.png

ここまで読んでくれた人に、裏技をこっそり教えます。

設定の項目に「日本国内モード」なるものがありますが、基本的に日本国内の方はオンにして欲しいのですが、オフにすると裏技が使えます。

送り先がiPhoneなどのスマートフォンかパソコンへのメールに限られますが【文字の大きさが12段階、画像の大きさも12段階に変更可能】にまずなります。

あとさらにiPhoneとパソコンに送る場合はフォントも4種類変えられます。

このあたりの機能は日本のデコメの仕様にはないので普通の日本の携帯には送れません。

http://farm3.static.flickr.com/2680/4350506152_51f03d0772_o.png
http://farm3.static.flickr.com/2794/4350506196_e7f906c3e1_o.png

どうですか?表現力が一段と増したと思いませんか?

友達に送って驚かせましょう!

http://farm3.static.flickr.com/2791/4349759967_3309ca4cfc_o.png
http://farm3.static.flickr.com/2487/4350506280_a8993008aa_o.png

まだまだいろいろと不明点や不満点があるかと思います。

質問や改善要望を support@kbmji.comまで、お気軽にお送りください。よろしくお願いします!

mod_jkを使ってtomcatとapacheの連携

0

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

tomcat-connector(mod_jk)を使用してみる
mod_jkとはTomcatとApache間の通信を処理するモジュールです。
色々設定方法はあるのですが今回は最も簡単な設定を行いapacehとtomcatの連携をしたいと思います。

環境は centos5.3 apacheはyumからインストールしました。

1: tomcatの起動

# cd /usr/local/src
# wget http://ftp.kddilabs.jp/infosystems/apache/tomcat/tomcat-5/v5.5.28/bin/apache-tomcat-5.5.28.tar.gz
# cd 任意の場所
# gunzip -c apache-tomcat-5.5.28.tar.gz | tar xvf –
# chown 起動ユーザ apache-tomcat-5.5.28
起動ユーザ% cd apache-tomcat-5.5.2/tomcat/bin
起動ユーザ% ./startup.sh

確認
http://localhost:8080/ tomcatの画面が表示されることを確認する


2:mod_jkのインストール


# cd /usr/local/src/
# wget http://www.meisei-u.ac.jp/mirror/apache/dist/tomcat/tomcat-connectors/jk/source/jk-1.2.28/tomcat-connectors-1.2.28-src.tar.gz
# gunzip -c tomcat-connectors-1.2.28-src.tar.gz |tar xvf –
# cd tomcat-connectors-1.2.28-src/native/
# ./configure –with-apxs=/usr/sbin/apxs
# make
# make install

すると下記のライブラリがインストールされます
/etc/httpd/modules/mod_jk.so


3:apacheの設定を行う

# cd /etc/httpd/conf
# vi httpd.conf

 LoadModule jk_module modules/mod_jk.so ライブラリを読み込む設定を追加

(同じようにライブラリを読み込みこんでいる設定があるので同じ場所に追加)

mod_jkの設定ファイルを読み込むための設定を追加(一番したなどでよい)

 Include /etc/httpd/conf/jk.conf 


# touch jk.conf
# vi jk.conf

 JkWorkersFile /etc/httpd/conf/workers.properties
 JkLogFile     /etc/httpd/logs/mod_jk.log   
 JkLogLevel    info
 JkShmFile     /var/run/apache2/jk-runtime-status
 JkMount /* jk


# touch workers.properties
# vi workers.properties

worker.list=jk
worker.jk.type=ajp13
worker.jk.host=localhost
worker.jk.port=8009
worker.jk.socket_timeout=5
worker.jk.connect_timeout=1000
worker.jk.prepost_timeout=1000

設定の説明
typeはapacheとtomcatの通信間のプロトコルを指します
portはtomcatの待ち受けportです 8009はtomcatのデフォルトの設定です

4:apache2の再起動と確認

# /etc/init.d/httpd restart

確認
http://localhost で上記tomcat起動で確認した

画面が表示されればOK

Grails(2)サンプルWEBアプリ作成~起動まで

0

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

次にサンプルWEBアプリを作成してみます。
(1)grails create-app test
 ※実行したディレクトリ内にtestディレクトリが作成されます。

(2)testディレクトリに移動します。

(3)grails run-app
 実行後、「Server running. Browse to http://localhost:8080/test」というのが表示されます。

(4)http://localhost:8080/test にブラウザからアクセスして下さい。
 ⇒Welcome to Grailsという画面が表示されれば成功です。
 ※「ctrl+C」で終了できます。

次回に続く・・・・。

最近人気な記事