ホーム ブログ ページ 48

ECサイト構築パッケージ「エレコマ」の初期設定@Ubuntu 10.10

0

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


よしだです。

前回の記事』では、エレコマのインストール手順を紹介しました。

今回はインストール後の初期設定について書いていきたいと思います。

 概要

エレコマのロゴ

今回はエレコマはインストール後に行う必要最低限な設定を紹介します。

主な設定は以下の3つになります。

 1. 管理者ユーザの登録

 2. ショップ情報の登録

 3. 商品情報の登録

それでは早速設定操作に移りましょう。

 1. 管理者ユーザの登録

エレコマに販売したい商品を登録するには、管理画面へアクセスする必要があります。

この管理画面にアクセスするためのユーザを管理者ユーザと呼びます。

エレコマインストール直後は、管理者ユーザが登録されていない状態なので、新しく登録します。

a. エレコマディレクトリへ移動

前回の記事でエレコマをインストールしたディレクトリに移動します。

% su - ec
ec% /usr/local/elecoma

b. 管理者ユーザ ID、パスワードの変更

管理者ユーザの ID とパスワードを任意の物に変更します。

デフォルトの ID とパスワードは admin、pass となっています。

ec% vim test/fixtures/admin_users.yml

c. 管理者ユーザの登録

下記のコマンドでデータベースに管理者ユーザの情報を登録します。

ec% rake db:fixtures:load FIXTURES=admin_users RAILS_ENV=production

d. 登録確認

登録できたことを確認するために、管理画面へのログイン画面から実際にログインします。

ログイン画面へは http://(サーバの IP アドレス)/admin からアクセスできます。

http://doruby.kbmj.com/hyoshida/files/elecoma_login.png

(ログイン画面です)

http://doruby.kbmj.com/hyoshida/files/elecoma_admin.png

(正常にログインできると管理画面にアクセスできます)

無事にログインできれば次のステップに進みます。

 2. ショップ情報の登録

商品を登録する前に、ショップ情報を入力しておきます。

ショップ情報が入力されていないと一部のページが機能しなくなるので注意が必要です。

ショップ情報を登録するには、管理画面のメニューから「店舗情報」⇒「SHOPマスタ」と辿って下さい。

登録画面で社名や住所、メールアドレスなどの必要な情報を入力します。

http://doruby.kbmj.com/hyoshida/files/elecoma_admin_shop.png

(ショップ情報を入力して登録します)

 3. 商品情報の登録

いよいよ商品情報の登録に移ります。

エレコマでは、[商品]+[規格]の組み合わせをひとつの商品情報として扱っています。

  • ◎[商品]には、商品名や画像、紹介文が関連づけることができます。
  • ◎[規格]には、たとえば同名商品の「色違い」を赤、青、緑の分類として関連づけることができます。

まず[規格]の登録方法から紹介します。

a. [規格]の登録

規格登録画面は「商品管理」⇒「規格登録」からアクセスすることができます。

ここでは例として、色違いの商品を表現するための規格と分類を登録していきます。

  1. 規格名に「色」入力して登録します。
  2. 登録した規格と同行にある「分類登録」リンクへ飛びます。
  3. 規格分類名にそれぞれ「赤」「青」「緑」と入力した3つの分類を登録します。

これで[規格]の登録は完了です。

b. [商品]の登録

商品登録画面は「商品管理」⇒「商品登録」からアクセスすることができます。

ここから商品名や画像、紹介文などを順番に入力していきます。

すべて入力し終えたら登録を済ませます。

c. [規格]+[商品]を組み合わせる

最後に先ほど登録した[規格]と[商品]を組み合わせて、ひとつの商品情報に仕上げます。

  1. 「商品管理」⇒「商品マスタ管理」から先ほど登録した商品を探します。
  2. 対象商品の行にある「規格」リンクにアクセスします。
  3. 赤、青、緑の規格のうち、有効にしたい規格にチェックを入れ、商品コードや価格を入力します。

あとはこれを登録するだけで商品情報が完成します。

できあがった商品は、「商品マスタ管理」の「確認」リンクから販売サイト視点で確認することができます。

 最後に

前回と今回で、エレコマのインストールから初期設定までを簡単に紹介しました。

説明が荒削りになっている部分もあるかとは思いますが、少しでも参考になれば幸いです。

一緒に始めようSencha Touch 2.0 入門編: 第1回 Sencha Touchを導入しよう

0

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

はじめまして、2012年新卒として入社致しました、だーますと申します。どうぞよろしくお願い致します。

今回はスマートフォンアプリのような操作性を持つWebアプリ開発フレームワークである”Sencha Touch 2.0″について解説させていただきます。

 Sencha Touchって何?

Sencha Touchとは、米国のSencha社が開発した、HTML5ベースのWebアプリ開発フレームワークです。

具体的な特徴

・スマートフォンやタブレットのWebブラウザで動く、ネイティブアプリのようなアプリを作れる!・iOS、Androidのどちらでも動作する!・HTML5って書いてはあるけど、JavaScriptさえわかれば開発できる!・AjaxやJSONPリクエストもバッチリ送れる!・無料で利用でき、しかも商用もOK!

対応OS

・iOS 4.0以上 (iPhone、iPod touch、iPad)

・Android 2.2以上

・BlackBerry

・テスト用:WebKitブラウザ (Chrome、Safari)

Windows Phoneや、WebKitでないブラウザ(IEやFirefox、Opera等)では使えません。

どんなアプリが作れるの?

Sencha社公式のデモアプリ集採用例集をご覧になると良いかと思います。(注:WebKitブラウザで見てください)

ここにあるアプリ、全部JavaScriptで書かれています。すごいですよね!

 Sencha Touch 2.0を入手する

それでは早速、Sencha Touch 2.0のライブラリを入手してみましょう。

  1. Sencha Touch 2.0のダウンロードページに飛びます
  2. Open Source Version(GPLv3ライセンス)かFree Commercial Version(商用版・独自ライセンス)のどちらかを選び、ダウンロードします。本稿執筆時点でのバージョンは2.0.1.1です。
  3. 落ちてきたZIPファイルを展開します

これでOKです。

開発環境はどうするの?

エディタ

JavaScriptが書ければなんでもOKです。私はMacでEclipseにAptana Studioを入れて使っています。

ブラウザ

PC上で動作確認をするならば、WebKitブラウザーを用意してください。

デベロッパーツールを画面横分割して使えるChromeがおすすめです。

少し前まではSafariの方がSencha Touchの動作がなめらかでしたが、最近はChromeも追いついて来ました。

Webサーバー

スマートフォンやタブレットから動作確認するなら、PC上にWebサーバーを立てておくと楽でしょう。

Mac OS Xで、有線でネットワークに接続しているなら、Web共有とAirMacでのインターネット共有を併用すれば簡単にできます。

[2012/11/13追記]

OS Xの最新版Mountain Lionでは、システム環境設定からWeb共有の設定ができなくなっています。

しかし、機能が消滅したわけではなく、以下のサイト等を参考に手動で設定可能です。

うまでしか Blog: Mountain LionにおけるWeb共有の消滅と403 Forbiddenの解決策

 とりあえず触ってみよう!

ライブラリーを入手したら、早速ソースコードを書いてみましょう。

適当なところにフォルダを作って、そこに先ほど展開したSencha Touchのフォルダごと入れてください(本稿ではsencha-touch-2.0.1.1 とします)。

index.html

作ったフォルダにindex.htmlというファイルを作り、次のように記述してください:

<!DOCTYPE html>
<html>
    <head>
        
        <title>Sencha Touch App</title>
        <link rel="stylesheet" type="text/css" href="sencha-touch-2.0.1.1/resources/css/sencha-touch.css" />
        <script type="text/javascript" src="sencha-touch-2.0.1.1/sencha-touch-all-debug.js"></script>
        <script type="text/javascript" src="app.js"></script>
    </head>
    <body></body>
</html>

“sencha-touch.css”は、UIのデザインを指定したスタイルシートです。”sencha-touch-all-debug.js”が、Sencha Touchのライブラリです。そして”app.js”が我々が作ろうとしているアプリの本体で、これから記述します。

bodyタグの中身は、何も書かないでください。bodyの中身は、ライブラリによってすべて動的に生成されます。

app.js

同じフォルダにapp.jsというファイルを作り、次のようにしてみましょう:

Ext.application({   
    launch: function() {
        Ext.Viewport.add({
            xtype: 'panel',
            items: [
            {
                xtype: 'label',
                html: 'Hello,world!'
            }]
        });
    }
});

これをPCのブラウザで確認してみましょう。以下のようなページができるはずです。

上にいくつかメソッド・関数が出てきていますが、

  • Ext.application(): アプリの大元締め
  • launch: function(): アプリが実行されて一番最初に呼び出される関数
  • Ext.Viewport.add(): 画面にUIを追加するメソッド

であると思っておいてください。

Sencha TouchのUIはオブジェクトの形式で記述する

上記のExt.Viewport.addの中身を見てみてください:

{
    xtype: 'panel',
     items: [
    {
        xtype: 'label',
        html: 'Hello,world!'
    }]
}

となっていますね。この部分でUIを定義しています。まるでJSON形式みたいな記法ですね。Sencha Touchではこの記述方法をたくさん扱いますが、Sencha Touchを修得する上で覚えられると思います。カンマやコロンを忘れたりするとちゃんと動きませんので、忘れないように。

具体的に見てみましょう。xtype: ‘panel’ となっているのは、panel形式のUIコンポーネントを配置する、という意味です。そしてこの panel コンポーネントには、次の items に記述することでサブコンポーネントを追加できます。

items の中には xtype: ‘label’ が入っており、その次の行の html: ‘Hello, world!’ がラベルとして表示する中身です。(html なのでタグによる記述も可能です)

サブコンポーネントをちょっと増やして遊んでみましょう。app.jsを以下のように書き換えてみてください:

Ext.application({
    launch: function() {
        Ext.Viewport.add({
            xtype: 'panel',
            items: [
            {
                xtype: 'label',
                html: 'Hello,world!'
            },{
                xtype: 'button',
                text: 'ボタンです'
            },{
                xtype: 'textfield',
                placeHolder: 'テキストボックスです'
            }]
        });
    }
});

実行結果です:

キャプチャプラグインの都合上ボタンの右端が切れてしまいましたが、ちゃんと表示はされるはずです。他にも様々なコンポーネントがあります。これらについては、次回以降説明することにします。

 ナビゲーション (Navigation View)

もうちょっとiOSライクなUIを見てみたいですね。app.jsを次のようにしましょう。階層が増え始めましたが、Sencha Touchではよくあることなので、慣れてください:

Ext.application({
    launch: function() {
        Ext.Viewport.add({
            xtype: 'navigationview',
            items: [{
                xtype: 'panel',
                title: 'First View',    // ナビゲーションバーに表示する文字列
                items : [
                {
                    xtype: 'label',
                    html: 'This is First View'
                },{
                    xtype: 'button',
                    text: 'Push Next View',
                   
                    // ボタンにイベントを設定
                    handler: function() {

                        // このコンポーネントの2つ上の navigationview で定義されたメソッド
                        this.parent.parent.push({
                            xtype: 'panel',
                            title: 'Second View',
                            items: [{
                                xtype: 'label',
                                html: 'This is Second View' // 画面遷移後にナビゲーションバーに表示する文字列
                            }]
                        });
                    }
                }]
            }]
        });
    }
});

これを実行すると次の画面になります:

ここにある、”Push Next View”というボタンを押すと…?!

アニメーションして上のような画面が現れます!もちろん、”Back”をタップすると、前の画面に戻れます。

これがiOSアプリでよく見られる、ナビゲーションビューというものです!

上記のソースコードではまず、一番上のコンポーネントに xtype: ‘navigationview’ を設定しています。そこで最初に表示するコンポーネント xtype: ‘panel’ を items に記述しています。その panel の中には、ナビゲーションビューがそのコンポーネントを表示している際に画面上部のバーに表示する文字列を表す title と、さらにそのサブコンポーネントとして items 内に xtype: ‘label’ と xtype: ‘button’を記述しています。

この button に注目してください。handler: function() というのがあります。ここで、そのボタンが押された時に実行する処理を記述しています。これでボタンがただの飾りから、ちゃんと動作するコンポーネントに進化しました。

さらにその handler の処理ですが、this.parent.parent.push というメソッドがあります。これは、このボタンの二つ上のコンポーネントである navigationview に定義されている push というメソッドを指しています。これはナビゲーションビューで新しい画面を呼び出すメソッドです。今回はこの中に直接新しく xtype: ‘panel’ を記述しています。”Back”ボタンは自動で生成されるので、こちらで特に記述する必要はありません。

このように、JavaScript を記述するだけで、iOSライクなインターフェースを実現することができるのです!すばらしいですね!

これらのコンポーネントは、動的に生成して表示することも可能です。これは、今後説明させていただいます。

今回はごく簡単な説明のみさせていただきましたが、様々なUIコンポーネントを組み合わせることにより、リッチなUIを持ったスマートフォン向けWebアプリケーションを作ることができるようになるのです。とても素晴らしいですね!

 次回は

様々なUIコンポーネント、そしてそれらをクラスとして定義する方法について説明する予定です。どうぞお楽しみに!

意外に知らない人が多い!Skypeを使うときに気をつけたい話(1) ~オフラインが招くトラブル~

0

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

 2012年新卒で入社いたしました、ずんです。僭越ながら今回初めてDoRubyにて記事を執筆致します。よろしくお願いします。今回はSkypeを使っていると誰でも必ず遭遇したことがあるであろうトラブルについて。check it out!!

 モバイル・インターネットの急速な発展のおかげで最近はPCだけでなくスマートフォンでも使えるようになり、より手軽に、無料で、高音質・高画質で、電話やテレビ電話に代わるコミュニケーションツールとなったSkype。

 最近ではビジネスの現場でも使われるようになった。

 社内での連絡を内線やメールを使わずに、Skypeで全て済ますことで組織運営の簡略化を図る例も珍しくない。

 しかし便利な反面、サーバが存在せずP2PでメッセージをやりとりするSkype特有の性質を知っておかないと大変なミスを引き起こすことになるかも……。

 意外に誰も気にしない問題;相手がオフラインの時に送信されたメッセージはいつ相手に届くのか

 パソコンなり、スマートフォンなりでSkypeを使ったことがある読者諸兄は多いと思う。そんな読者諸兄は一度はこういう怪奇現象に巻き込まれた事があるだろう。

※ここから、とある事の報告を頼まれて、それをSkypeのメッセージを使って送ろうとしているルークと、

仕事を頼み、報告を受け取ろうとしている上司のオビワンが居るとしよう*1

 金曜日、オビワンは仕事が落ち着いており、家族と週末を使って旅行にいくため有給休暇を取って会社に居ない。

 そこで、ルークはオビワンからの仕事を一手に引き受け、月曜日に結果をなんらかの形で報告するように指示されている。

 しかし、ルークは月曜日に有給休暇を申請しているので、金曜日に退社する時までにオビワンに何らかの方法で仕事の結果についてメッセージを残しておかなくてはならない。

状況まとめ
  1. ルーク(部下)は金曜日に出勤しているが、月曜日は居ない。
  2. オビワン(上司)は金曜日は居ないが、月曜日に出勤する。
  3. オビワンは、ルークに対して仕事の報告をメールでもSkypeでもなんでもいいので、なんらかの形で月曜日朝に出勤したときに分かるように指示している。
  4. オフィスが多くの部屋に分かれている上、在宅勤務のスタッフも居るため、普段の業務中のコミュニケーションはSkypeのテキストチャットを用いている。
  5. 2人のSkypeのアカウントは仕事用に作ったため、出勤時以外はSkypeにログインしない。

 さて、滞り無くタスクを終え、オビワンに報告を書いて退社しようとするルーク。

 普段の業務でもSkypeで、仕事の指示・報告・連絡・相談からファイルのやりとりまでやっているため、普段通りSkypeのテキストチャットでオビワン宛に報告を書いて退社した。

 そして火曜日。久々の3連休を充実して過ごし元気一杯で出勤したルーク。

 しかし彼は出勤直後にオビワンから怒られてしまう。

「報告が、届いていないじゃないか。月曜に来たときに分かるように報告を残せと言ったはずだ!」

 しかし、ルークは間違いなく金曜の退勤時にオビワンに対しSkypeで報告を投げたはずである。だが、月曜日にオビワンが確認したところそれが届いていなかった。

 彼曰く、火曜日の朝になって、たった今届いたというのだ。何故だろうか。

 なぜ、届かなかったか

 さて、間違いなくルークはオビワンに報告を送ったのは間違いない。*2

 しかし一方で、それがオビワンに対して月曜日に届いていなかった。

 その理由は、Skype特有の性質にある。Skypeでは相手がオフライン時に送られたメッセージはどのように相手に届けられるのだろうか。

 Skypeは、メッセージを中継するサーバが存在しない

 Skypeにはメッセージを中継するサーバが存在しない。そう、存在しないのだ。*3

 一般的なインスタントメッセンジャーのように、サーバ&クライアントの従属関係があって、メッセージを中継するサーバが存在している場合は、

相手がオフラインの時はメッセンジャーのサーバ側でそれを一旦預かって貰い、相手がオンラインになった瞬間、

「送り側がオンラインか否かにかかわらず」オフラインメッセージという形でメッセージが送信される。

 SkypeはP2Pでメッセージや音声、ビデオをやりとりしているためそれが無い。

 なので、メッセージが送受信されるタイミングは「お互いがSkypeを起動している」状態でないとつながらないのだ。(P2Pについては次回)

 「仕組み」を簡単に書くとこういうことではないだろうか。

ルークが、オフラインのオビワンにメッセージを送る。

 ↓

オビワンはオフラインであるため、メッセージは送信されずにルークのPCのローカルにメッセージが一旦保存される。

 ↓

ルークがPCの電源を入れ、Skypeを起動している間、オビワンがPCの電源を入れ、Skypeを起動すると、それをルークのPCのSkypeが検知して、ローカルに保存したメッセージを送信する。

 ↓

オビワンがメッセージを受信する。

 改善方法

  1. もし、グループでSkypeを使っているなら、メッセージ中継用のアカウントをグループ内に建てる。
    • それを常にオンライン状態に維持する。
    • グループ内で、その中継用アカウントが全ての発言ログを記録するため、自分がオフライン中のグループ内での他人の発言は、その中継用アカウントから取ってこれる。
  2. 相手がオフラインの時はメールで送る。
    • なんだかんだ言って、メールは必須ですよね。
  3. 同じ社内でやり取りしているなら、文書にして紙で置いておく。
    • 時にはアナログに。

 ちなみに、上記のようなトラブルは割と頻繁にある話で、僕の友人でも

「まさに同じ現象があった!でもなんで!?どういうことなの!?すごい大事な事を書いたのにすごい遅れて届いた!!」と泣く方がそれはもう多く……。

 つまり何が言いたいかというと、インターネットがだいぶ発展してきて、昔はかなり手間がかかっていたことを、クリック1つで簡単に、誰でも、しかも無料でできる世の中になりました。

 しかし前提としてまず自分の使うツールの性質をよく理解しておきましょうね……という話でした。

 次回予告

技術的な話~Skypeはどんな通信をしているのか?~

 次回は、今回の話を踏まえて

「じゃあ、Skypeでは起動してからどのような通信を行なっているか」という事を、「プロトコル」と「P2P」の話を交えつつなるべくわかりやすく書いてみようと思います。

 普段皆様何気なくSkypeを使っていると思いますが、きっと気になったことがあるかも?

 少しでもweb技術に詳しい方なら「P2P」という単語を聞いたことはあるとは思いますが、じゃあ実際SkypeにおいてP2Pがどのように使われているかは意外に知らないものです。

 ならば折角だし一緒に詳しく掘り下げてみましょう!

 大丈夫。TCPとかUDPとか聞いたことない人でも解るように書きますよ!

 DoRubyはどちらかというと技術者向けの記事が多いですが、僕はちょっと趣向を変えて、

IT技術に詳しくない人でもわかりやすく、できれば普段何気なく使っているIT関連の物の仕組みについて関心を持ってもらえるような記事を書いてみたいと思います。*4

 お便り

 単なる感想や「こんな事聞きたい・知りたい」などのお便りをお待ちしております。次の記事の種になるかもしれません。

 種にならなくとも1通でも届くと中の人が喜びます。次の記事を書くモチベーションにつながります。

※返信は致しかねます。また、頂いたメールやコメントは記事内で引用させていただく事があります。

mailto:zun.doruby@gmail.com

*1: この記事をアップした翌朝、何人かの同期に「なぜルークとオビワンなのか」と聞かれたが、単にスター・ウォーズが好きなだけである。

*2: 「普通こういうモノはメールか文書で残すものじゃないのか」というツッコミは、申し訳ないがこらえていただきたい。

*3: 正直、無いというと語弊がある。実際は「スーパーノード」と呼ばれる、Skypeを起動している端末たちの中で安定している、いわば「選ばれし端末」が色々と中継点を担っているが、調べながら執筆しているのと、詳しく書くと次のネタが無くなるので、これは次回のおはなし。

*4: 次回の掲載は、来週月曜日6月18日ごろを予定しています。ただ、中の人の状況によって1週間ズレる場合もあります。

ECサイト構築パッケージ「エレコマ」のインストール手順@Ubuntu 10.10

0

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

はじめまして、よしだです。 DoRuby 初投稿の今回は、最近になって SourceForge.jp から GitHub にこっそり移住したECサイト構築パッケージ「エレコマ」オープンソース版のインストール手順を紹介したい思います。

 概要

通販サイトを作りたい! という要望を簡単に実現してくれる EC サイト構築パッケージ。エレコマは日本初の Ruby on Rails を利用した EC サイト構築パッケージで、オープンソースであるため無料で利用することができます。

詳しい機能については『エレコマ公式サイト』を参照してください。また、実際の動作を確認できるデモサイトもあります。

今回はエレコマのインストール手順を紹介したいと思います。

 環境

OS と DB は基本的には何でも構いません。

ここでは OS に Ubuntu 10.10 を利用することにします。

(ちなみに、CentOS へのインストール手順は GitHub 上の README に書かれています)

  • ◇ OS: Ubuntu 10.10
  • ◇ DB: PostgreSQL
  • ◇ WEB: Apache
  • ◇ APP: Passenger
  • ◇ Ruby: 1.8.7
  • ◇ Ruby on Rails: 2.3.5
  • ◇ RubyGems: 1.3.5

上記が今回用意する環境になります。

 インストール手順

早速インストールしていきます。

ここでは Ubuntu 10.10 がクリーンインストールされていることを前提とします。

0. パッケージリストのアップデート(必ず行ってください!)

手始めに Ubuntu のパッケージリストを最新のものにします。

Ubuntu 10.10 の場合、初期のパッケージリストでは killapache などの脆弱性を取り込むことになってしまいます(killapache については、ととろさんの記事『apache の脆弱性』が詳しいです)。

そこで、各ソフトウェアをインストールする前にパッケージリストの更新を行っておくと安心です。

$ sudo su -
(パスワードを入力し、管理者権限に切り替えます)
# apt-get update

1. Ruby のインストール

Ruby とその他の必要なソフトウェアをインストールします。

特定バージョンの Ruby を利用するためにソースからコンパイルします。

# apt-get -y install gcc zlib1g-dev libssl-dev ncurses-dev libreadline-dev
# wget ftp://ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.7-p174.tar.gz
# tar zxf ruby-1.8.7-p174.tar.gz
# cd ruby-1.8.7-p174
# ./configure
# make
# make install
# cd

2. RubyGems のインストール

RubyGems をインストールします。

# wget http://rubyforge.org/frs/download.php/60718/rubygems-1.3.5.tgz
# tar zxf rubygems-1.3.5.tgz
# cd rubygems-1.3.5
# ruby setup.rb
# cd

3. ImageMagick のインストール

エレコマでは商品画像を扱うためのライブラリとして ImageMagick を利用します。

CentOS 向けのインストール手順では ImageMagick へのリンクがすでに切れているようです。

リンクが切れている場合は、適宜 URL を変更して実行してください。

# apt-get -y install libjpeg-dev libpng-dev libgd2-xpm-dev libfreetype6-dev
# apt-get -y install libperl-dev
# wget http://ftp.nl.netbsd.org/pub/pub/ImageMagick/ImageMagick-6.5.8-4.tar.gz
# tar zxf ImageMagick-6.5.8-4.tar.gz
# cd ImageMagick-6.5.8-4
# ./configure
# make
# make install
# cd

4. Rmagick のインストール

Rmagick は ImageMagick を Rails から扱うための Gem です。

# gem install rmagick -v 2.12.2

5. その他の依存 Gem のインストール

エレコマの各機能に必要な Gem をインストールします。

確実な動作を保障するためにバージョンを指定してインストールします。

# gem install rails -v 2.3.5
# gem install gettext -v 2.1.0
# gem install gruff -v 0.3.6
# wget http://www.artonx.org/data/lhalib/lhalib-0.8.1.gem
# gem install lhalib-0.8.1.gem
# gem install webmock -v 1.3.4
# gem install thoughtbot-factory_girl -v 1.2.2 --source http://gems.github.com
# gem install json
# gem install daemons

6. PostgreSQL のインストール

PostgreSQL 本体と Rails 用の Gem をインストールします。

# apt-get -y install postgresql libpq-dev
# gem install postgres

7. ユーザの作成

エレコマを実行するユーザを作成します。

パスワードも適当に設定しておくと良いかもしれません。

# useradd -m ec
# passwd ec
Enter new UNIX password: elephant
Retype new UNIX password: elephant

8. Git のインストール

GitHub からエレコマをダウンロードするにあたって Git が必要になるので、これをインストールします。

# apt-get -y install git-core

9. エレコマのダウンロード

いよいよエレコマのインストールに入ります。

まずは GitHub からエレコマのパッケージをダウンロードします。

# cd /usr/local
# git clone git://github.com/elecoma/elecoma.git
# chown -R ec:ec /usr/local/elecoma

10. PostgreSQL のセットアップ

エレコマ用のデータベースを用意します。

ここでは Development, Test, Production という Rails 環境に合わせて3つのデータベースを作成します。

# /etc/init.d/postgresql start
# su - postgres
postgres$ psql template1
postgres=# alter user postgres with password 'hoge';
(パスワードを適当に設定しておきます)
postgres=# q\
postgres$ createuser ec
Shall the new role be a superuser? (y/n) y
postgres$ psql template1
postgres=# alter user ec with password 'elephant';
(このパスワードは手順 11. で必要になるので覚えておきましょう)
postgres=# \q
postgres$ createdb --owner=ec ec_dev
CREATE DATABASE
postgres$ createdb --owner=ec ec_test
CREATE DATABASE
postgres$ createdb --owner=ec ec
CREATE DATABASE
postgres$ psql -l
        List of databases
   Name    |  Owner   | Encoding 
-----------+----------+----------
 ec        | ec       | UTF8
 ec_dev    | ec       | UTF8
 ec_test   | ec       | UTF8
 postgres  | postgres | UTF8
 template0 | postgres | UTF8
 template1 | postgres | UTF8
(6 rows)

11. エレコマのセットアップ

エレコマを動作させるための最低限の設定を行います。

# su - ec
ec$ cd /usr/local/elecoma/config
ec$ cp database.example.yml database.yml
ec$ vim database.yml
(データベースへのアクセスに必要なユーザ名を ec、パスワードを elephant といった具合に設定します)
ec$ diff database.example.yml database.yml
3,4c3,4
<   username: postgres
<   password: 
---
>   username: ec
>   password: elephant
ec$ cd environments
ec$ vim production.rb
(環境に合わせてメールサーバの設定を変更します)

12. プラグインのインストール

エレコマに必要な Rails プラグインをインストールします。

一部古いバージョンのプラグインを利用するために、変則的なインストール方法を取っているところがあるので注意してください。

ec$ cd /usr/local/elecoma
ec$ ruby script/plugin install git://github.com/realityforge/rails-active-form.git
ec$ ruby script/plugin install git://github.com/rails/acts_as_list.git
ec$ ruby script/plugin install git://github.com/technoweenie/acts_as_paranoid.git
ec$ ruby script/plugin install git://github.com/rails/acts_as_tree.git
ec$ ruby script/plugin install http://topfunky.net/svn/plugins/ar_fixtures/
ec$ ruby script/plugin install git://github.com/jpmobile/jpmobile.git -r 'tag 0.0.8'
ec$ ruby script/plugin install http://taslam-plugins.googlecode.com/svn/trunk/jpmobile_emoticon_filter/
ec$ cd vendor/plugins
ec$ git clone git://github.com/tmtysk/mbmail.git mbmail
ec$ cd mbmail
ec$ git checkout 654ce3ec2dfa10ac3b05cd9354eb84456d206a6d
ec$ rm -fr lib/jpmobile
ec$ rm -fr .git
ec$ cd ../../..
ec$ ruby script/plugin install git://github.com/jamesgolick/resource_controller.git
ec$ cd vendor/plugins/
ec$ git clone  git://github.com/mislav/will_paginate.git
ec$ cd will_paginate/
ec$ git checkout origin/2-3-stable
ec$ cd ../../..
ec$ ruby script/plugin install git://github.com/kakutani/yaml_waml.git
ec$ ruby script/plugin install git://github.com/rails/ssl_requirement.git
ec$ ruby script/plugin install git://github.com/DianthuDia/double_submit_protection.git
ec$ ruby script/plugin install git://github.com/champierre/image_submit_tag_ext.git
ec$ ruby script/plugin install git://github.com/dchelimsky/rspec-rails.git -r 'tag 1.2.9'
ec$ ruby script/plugin install git://github.com/dchelimsky/rspec.git -r 'tag 1.2.9'

13. データベースのセットアップ

データベースにエレコマ用のテーブルとカラムを用意します。

ec$ cd /usr/local/elecoma
ec$ rake db:migrate RAILS_ENV=production

14. Apache2 と Passenger のインストール

今回はウェブサーバに Apache2 を、アプリケーションサーバには Passenger を採用しました。

この他の、たとえば nginx + Unicorn などの組み合わせでも導入は可能です。

# apt-get -y install apache2
# apt-get -y install build-essential libcurl4-openssl-dev
# gem install passenger
# passenger-install-apache2-module

15. Apache2 の設定

アプリケーションサーバとの連携を行うための設定を施します。

バージョンの違いや、エレコマのインストール先ディレクトリによって記述に違いが出るので注意してください。

# cat > /etc/apache2/httpd.conf
LoadModule passenger_module /usr/local/lib/ruby/gems/1.8/gems/passenger-3.0.12/ext/apache2/mod_passenger.so
PassengerRoot /usr/local/lib/ruby/gems/1.8/gems/passenger-3.0.12
PassengerRuby /usr/local/bin/ruby

# cat > /etc/apache2/conf.d/ec.conf

  ServerName ec.example.com
  DocumentRoot /usr/local/elecoma/public
  RailsEnv production
  
    AllowOverride all
    Options -MultiViews
  

16. Apache2 の再起動

設定を反映するために Apache2 を再起動します。

もしかしたら reload だけでも良いかもしれませんが試してません。

# /etc/init.d/apache2 restart

 インストール完了

お疲れ様でした!

以上の手順をもって、エレコマのインストールは完了です。

(ブラウザからアクセスすると、エレコマのデモサイトが閲覧できます)

次回はインストール後の初期設定について書きます。

オンラインゲームを有利にしてみよう!

0

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

今回は、オンラインゲームで自分を有利にするチート行為に迫ってみよう

一般的に、チートはゲームをプレイするうえで、自分に有利なように働きかけるパッチやアプリケーションによって行われる。オンラインゲームではないゲームの場合、保存されているセーブデータを書き換えることで、自分のレベルを上げたり、アイテムを増やしたりすることができる。オンラインゲームの場合、そう簡単に行うことはできない。前回説明したように、チートを管理しているゲートウェイが存在しており、送られるパケットの整合性をチェックしており、そう簡単に、通過することはできない。

そもそも、ネットゲーの場合、ユーザのPCにインストールされているアプリは、あくまでもクライアントであり、実際にプレイを行っているのは、接続されたサーバ上になる。このため、どんなにPC上のクライアントを変更しようとも、その過程をチェックしているゲートウェイをだますことができなれば、チート行為は成立しない。

このゲートウェイは、ネットワークセキュリティにおける、IDSやIPSと同等のことを行っていると考えれば良いだろう。通常、やりとりされる通信の内容から、不正を見抜く方法が用いられる。この場合、何らかの方法を用いてチェックサムをチート時も書き換える必要がある。

 では、具体的にその手法についてみていこう。

チート行為を行うには、大きく分けて2種類の方法がある。1つはメモリを書き換える方法だ。先ほど書いたように、ゲームのデータそのものは、サーバ側に蓄積されている従って、これを直接書き換えることはできない。が、ゲームの仕様上、一時的にクライアントアプリのメモリ空間に持つことがある。これは、高速な回線で通信していれば問題ないが、低速な回線(100kbps以下)では、戦闘中のデータを的確に更新することが出来ず、サーバ内での戦闘とユーザの見ている戦闘が同期しないケースが出るためである。クライアントに保持される内容には激しい戦闘情報やアイテム交換など様々な要素が有り、戦闘が始まる前と終わるときに、サーバとクライアント間でデータが交換される。複数のユーザで的を倒す際も、同様の行為が行われるが、この場合はユーザが敵に対して行った攻撃情報がサーバを介して各ユーザに敵の状態と共に提供される。

このような状況で、注目すべきは、クライアントに保持されるメモリの内容だ。

このメモリの内容は、定期的にチェックされ、改ざんできないようにチェックされている。このチェックは、ユーザの目からすると常に行われているように見えるが、リアルタイムで行われているわけではなく、早い状態だと数μs程度、遅くとも数ms程度で行われている。当然として、この速度はゲーム全体の速度からすれば、かなり遅い「割り込み」であり、これ以外にも様々な「割り込み」が存在する。

 今回は、この割り込みについて注目する。

先ほども述べたように、メモリ内の改ざんチェックの割り込みは、ゲーム全体からすると、かなり遅い部類に入る。割り込みタイミングさえわかれば、次の行為を行える。

1.アイテムや経験値、金などが含まれるメモリアエリアを特定する

2.割り込みタイミングを定点観測し、どの時点での割り込みが「もっとも頻繁に行われるか」を確認する

このうち、2.が重要となるので、何度もリトライを繰り返した方が良いだろう。

1は、ゲームによって異なるが、多くの場合は、メモリの相対アドレスは決まっており、そのメモリ内に、確実にアイテムなどの情報はまとまって置かれる。

 やり方はこうだ。

1のエリアを限定した状態で、1の内容を他のエリアに一度コピーする。

2の割り込みが入った直後に、内容を改ざんする。2の割り込みが入る直前に、コピーした元の内容を書き戻す。書き戻す際には、ゲームで進行した情報は忘れずに加える。

こうすることで、メモリ内部は書き換えられ、ゲーム進行は思いのまま、得られる金や経験値、レベルなどはウハウハである。

とはいえ、これを人間業で行うことは、とうてい無理。そこで、プログラムを書くわけだが、イメージ的にはバッファオーバーフローをしかける事に似ている。

メモリを直接書き換える場合は、「割り込み」の存在を必ず忘れないように!

 パケットを改ざんする方法

先ほどは「割り込み」との戦いであったが、今度は、ゲームサーバのチートチェッカとの戦いだ。

チートチェッカは、送られてくるパケットの内容が適切であるかをチェックしている。とはいえ、すべてのパケットの内容を一つ一つ確認しているわけではなく、これも割り込みを利用している。クライアントから送信するパケットを改ざんし、送信すればたちどころに「チート行為」と見抜かれてしまう。では、どのようにするかというと、、、

パケットを改ざんしたら、必ず「チェックサムと呼ばれる物も改ざんする。」チェックサムは、そのパケットが正しいかを確認している物であり、内容(数値上の内容)とそのチェックサムさえ一致すれば、チートチェッカは素通りさせてくれる「可能性がある」。あくまでも、可能性であることを忘れてはならない。

こういった行為は、あまり頻繁にやると、「垢バン」される事になりかねない。十分注意されたい。

安価なVPSを骨の髄までしゃぶり尽くそう!

0

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

最近、安価なVPS(Virtual Private Server)が大量に出回っているのは、読者も知っているだろう。このVPSを使うにあたり、様々な問題が出ていることを知っているだろうか。今回は、そうした、VPSの問題点やセキュリティ上の不備について考えてみたいと思う。

 国内のVPS について

まず、国内のVPS事情についてだ。国内には、様々な事業者がVPSを提供している。中には、月々わずか500円足らずで借りることのできるVPSすら存在する。また、VPSでは足らずに、クラウドサービスを利用しているユーザもいる。これらのVPSでは、ディスク容量やCPUの数、スレッド数、メモリサイズなどで、事細かにサービス品目が異なる。

では、実際にいくつかのサービスについてみてみよう。

まずは、先ほど示したワンコインVPSだ。中で稼働しているOSは、Centos 5.5 だ。このサービスでは、同一サーバ上に、数多くのユーザを利用していると推測され、非常に動作が重いのが特徴だ。そこで、処理能力を計測すべく、下記のようなコマンドを実行してみた。

何はともかく、ディスクへの書き込みが異様に重いと感じる。

time sudo yum update

real 6m15.104s

user 0m5.041s

sys 0m0.683s

同様の環境を、比較的高価な別のVPSに用意し、同じ time sudo yum update を実行した結果は、下記だ。このように、非常に安価なvpsは、サービスレベルに難があるように感じられる。

time sudo yum updat

real 1m23.131s

user 0m33.218s

sys 0m19.095s

 踏み台に対する考え方

さて、お次はこれらのvpsを利用していると、セキュリティ上の問題がどのように発生しているかをみてみよう。

まず、高速かつ、安定したvpsを設置している同一のセグメントから、大量のsshアタックがやってきた。

49.212.2.xxx (www20109u.xxxxx.ne.jp): 6110 times

49.212.47.xxx (www31424u.xxxxx.ne.jp): 59 times

49.212.97.xxx (www39397u.xxxxx.ne.jp): 1576 times

これらは、すべて同一の事業者が提供しているvpsからのssh atackだ。みてわかるとおり、その数たるや尋常な数字ではない。では、こうした攻撃がなぜ発生しているか?それについて、ひもといていこう。

まず、こうしたssh atack は、管理者が適切な管理をしていないから発生していることは言うまでもない。非常に安価であり、大量にドメインを抱えたり、情報を配信したとしても、誰からも文句を言われない。そう、利用者はレンタルサーバ屋である場合がある。その証拠に、ssh atack をしているIPアドレスにアクセスすると、レンタルサーバ屋の画面が表示されることがままある。次に、何も考えずに、単なるファイル置き場として、お気楽に考えている、素人が設置しているケースだ。この場合は、apache がデフォルト画面であることや、ssh へのアカウントログインで、root が有効であったり、デフォルトパスワードがそのまま有効であることからも、素人がお気楽に使っていると推測される。

こうしたことから、同一のネットワークから、ssh atack が繰り返し行われている状況を踏まえると、比較的簡単にサーバが踏まれてる(侵入されている)事が多いことに気づかされる。

これに対し、安価なワンコインVPSでは、外部からのssh atack によって、システム全体が高負荷になることを恐れ、vpsが提供されて間もない頃に、早々に、このssh atack の回避がシステムアップデートによって行われた。通常、sshのポートは、22/tcpであるが、これを異なるポートへアップデートしたのである。

皮肉なことに、システムが不安定、かつ、遅いワンコインが、現状以上に遅く、不安定になることを恐れ、ssh ポートを変更した。これに対し、システムが安定稼働している比較的高価なシステムにおいては、現在もなお、22/tcp で稼働し、同一ネットワークからssh atackの攻撃にさらされている現状がある。

 攻撃に遭わないための対策

では、これらの攻撃に遭わないためには、どうすれば良いのだろうか?

ひとつは、安価なvpsサービスが行ったように、port を変更すればよいように思われる。しかしながら、実際には変更されたportが決まっているのであれば、その決まったportに対して攻撃を行うように変更すれば、同様に攻撃が行われるため、単なるportの変更だけでは、対応のしようがない。そこで、単なるportの変更だけではなく、ssh の鍵交換を設定すれば、仮にport番号がばれようとも、関係なくなる。もし、大量にssh atackを受けて困っているのであれば、こうした鍵交換も一つの方法として、考えてみてはいかがだろうか。

では、こうした動きを、攻撃者視点で考えてみよう。

 攻撃者はこう考えているよ

攻撃者は、特定のvpsサービスにログインできれば、その中の情報を調べる。portの開放状態を調べ、traceroute などのネットワークのコマンドを用いて、ネットワークの状態を調べるだろう。ここから、ネットワークの全体像、少なくともセグメントを見極めることができる。こうして、次に行うのは、ssh の辞書アタックだ。同一セグメントに何台のvpsがあるかはわからないが、しつこく辞書アタックを繰り返して行えば、そのうちの1つや2つ、簡単に侵入できるだろう。当然として、ヒットしたパスワードとIDの組み合わせは、他の同一サービス上の、別セグメントに対しても有効であることが多い。

 まとめ

サーバ毎に管理者IDとパスワードを変更する事は重要なことだ。

快適で安価なvpsはそれだけ、周りに不慣れな管理者が居ることにも繋がる。vpsを借りるなら、相応の管理体制をとり、攻撃者から自分のvpsを確実に守れるようになって欲しい。

第1回 PureMVC入門

0

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

はじめまして、su10です。Flex向けのフレームワークであるPureMVCについて学んだことを自分なりにまとめて解説していきたいと思います。(2012/5/25更新)

 PureMVCあるある

「うちはPureMVC使ってるから勉強しといてね」

「わかりました」

 数時間後…

「(ネット上にわかりやすい説明ない…「Cairngorm」って何だよ…帰りたいよ…)」

こんなことってよくありますよね。自分の場合は「とりあえずコード読んだらわかるだろう」と思ったらhandleNotificationが一体何なのかわからず、目から汗をかきそうになりました。

 PureMVCの基本

まずはPureMVCとは何か?最初に書きましたが、PureMVCはFlex向けのフレームワークです。Flex向けといってもJavaやC#向けもあるらしいので、これを機会に理解しておけば夢が広がります。そもそも「フレームワークってなに?」という人は「フレームワーク プリン」でググってもらうとして、まずは基礎となるMVCという概念の解説です。

Model、View、Controller

MVCはModel、View、Controllerの頭文字を取ったものです。プログラムの機能をこの3つに分けて書くことでコードがわかりやすくなります。MVCの考え方自体はRailsにもありますね。PureMVCでもこの考え方に基づき、コードを書いていくことになります。それぞれの機能は以下のようになっています。

  • ・Model … サーバとのやり取り、データの管理、ビジネスロジック
  • ・View  … ユーザに見える部分の処理
  • ・Controller … ユーザの入力などに応じてModelの機能を呼び出す

「ビジネスロジック」という単語がわかりにくいですが、要するに「ユーザに見える部分の処理とデータやデータベースの処理の間にある処理」のことです。流れとしては次のようになります。

  1. ユーザが入力を行う(View層が処理)
  2. 入力に応じてModel層の機能呼び出し(Controller層が処理)
  3. データの更新などを行う(Model層が処理)
  4. データを取得して見た目に反映する(View層が処理)

コアアクターとFacade(ファサード)

先ほど「○○層」と表現しましたが、実はPureMVCではクラスとしてModelクラス、Viewクラス、Controllerクラスが用意されていて、これら3つをまとめてコアアクターと呼びます。これらのクラスに先述のような機能をそれぞれ分けて実装していくと考えてください(実際には少し違いますが)。

また、Facadeというクラスが用意されていて、Facadeを通じてコアアクターとやりとりができます。もう少し具体的にいうと、Facadeクラスのインスタンス(もっと正確に言うとFacadeクラスを継承したサブクラスのインスタンス)経由でコアアクターの機能を利用することができます。つまり、実際にはコアアクターの3つのクラスをインスタンス化したり直接どうこうする必要はなく、コアアクターは互いを知らなくても良いのです。コアアクターに直接仕事を頼むのではなく、Facadeを通じて仕事をお願いするのです。こうすることでそれぞれのクラスの結合が疎になり、保守性が高まっています。大事なので何度も書きますが、

コアアクターはFacadeを通じてお互いの機能を利用できるので、お互いについて知っている必要はない

です。

いろいろ書いてきましたが、ここで重大発表です。実はコアアクターは先ほどMVCで述べたような仕事はしていません!(\な、なんだってェー!!/)

実際にMVCで述べたような処理を行うのはProxy、MediatorとView Component、Commandと呼ばれるプログラムたちです。コアアクターの仕事はこれらを自分に登録し、管理することです。もちろん登録はFacade経由で行います。コアアクタークラスの仕事をまとめると、次のようになります。

  • ・Model … Proxyを登録(Facade経由)し、管理する
  • ・View  … Mediatorを登録(Facade経由)し、管理する
  • ・Controller … Commandを登録(Facade経由)し、管理する

また、Proxy、MediatorおよびView Component、Commandの役割は次のようになります。

  • ・Proxy … Modelクラスに登録され、サーバとのやり取り、データの管理、ビジネスロジックを担当
  • ・Mediator … Viewクラスに登録され、View Componentの管理、Notificationの送受信を担当
    • ・View Component … Mediatorに登録され、ユーザの入力の受け取りと見た目の処理を担当
  • ・Command … Controllerクラスに登録され、Notificationに応じてProxyを呼び出す

MediatorがViewクラスに管理されてさらにView Componentを管理しているというややこしい構造になっていますが、これについては次回説明したいと思います。

また、ここで初めて出てきたNotificationはイベントにも似た概念なのですが、これについても次回説明したいと思います。

ちなみに、Proxy、Mediator、View Component、Commandにあたるプログラムは当然たくさん必要になってきますが、それらを管理するコアアクタークラス、つまりModelクラス、Viewクラス、Controllerクラスはそれらを管理する大元の存在なのでインスタンスが一つしか必要ありません。Facadeクラスもです。よってコアアクターとFacade(を継承したクラス)のインスタンスはプログラムにただ一つだけ存在し、利用されます。このような「プログラム中に一つしかインスタンスがない」ことを保証するデザインパターンのことを「シングルトンパターン」といいます。また、私が参考にしたサイト(http://translated.by/you/puremvc-implementation-idioms-and-best-practices/into-ja/ (404 Not Found))では「プログラム中に一つしかインスタンスがない」ことを指して「シングルトン」と呼んでいるので、以降はそのような意味で用いることとします。

それでは次回をお楽しみに。

スマートフォン最適化に便利な【weinre】を使ってみた

0

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


お久しぶりのwryyyです。

今流行?のスマートフォン最適化サイトを作る際、

スマートフォン実機でサイトを確認したら、デザインが崩れてる!!!となった場合、
皆様はどうしているでしょうか?

・実機だと、FireFoxのFirebugなんて便利なもの使えないし…

・気合を入れて修正しては確認して…ってのもめんどくせー!!!

ってなった時にはもう大変です。

さて、そんな時にオススメするのが今回ご紹介する

weinre

です!

さて、ではまず【weinre】とは何かから入って行きましょう。

weinreとは、簡単に行ってしまえばスマートフォンで閲覧しているページの
・HTML DOM
・CSS
・Javascript
等をPCから確認できるようにしちゃおうっていうツールです。

では、実際にインストールと使用方法について説明していきます。

※ 私のPC環境がMACのため、MACの手順で記載させて頂きます

1. ダウンロード

まずは https://github.com/phonegap/weinre/archives/master ここから

weinre-jar-1.5.0.zip
(mac OSX 10.6 Snow Leoperd 以上の方は weinre-mac-1.5.0.zip)
をダウンロードします。

※ weinre-mac-1.5.0.zip の中身は weinre をパッケージ化したものが入ってます。

2. 解凍

weinre-jar-1.5.0.zip(weinre-mac-1.5.0.zip) を解凍しましょう。

3. 設定ファイルの作成

自分のユーザのホームディレクトリ配下 「.weinre」というディレクトリを作成し、
.weinre 配下にserver.properties というファイルを作成します。

% pwd
/Users/username
% mkdir .weinre
% vim .weinre/server.properties

.weinre/server.properties の中身は以下のようになります。

% cat .weinre/server.properties
boundHost:    -all-
httpPort:     8081 

※ 設定の詳細は http://phonegap.github.com/weinre/Running.html を御覧ください。

4. 実行

・weinre-jar-1.5.0.zip を解凍した場合

% export JAVA_HOME=/System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Home
% java -jar weinre-jar/weinre.jar --boundHost 192.168.3.181

上記コマンドでweinreが起動されます。

※ weinre-jar を実行するには Java 6.0 が必要なので、
事前にexport してJava のバージョンを変えておく。

・weinre-mac-1.5.0.zipを解凍した場合

解凍したディレクトリに出来ている、weinre をダブルクリック

5. 確認

ブラウザから http://[IPアドレス]:[ポート番号] に接続します。

(アドレスは –boundHost 、ポート番号は server.properties で設定したもの)

すると、weinreのページが閲覧できるはずです。

閲覧できたら、「debug client user interface」のリンクをクリックしておいてください。

リンクを押すとchromeのデベロッパーツールのようなページが出ます。

Targets が none になっているはずです。

次はスマートフォンの操作です。

スマートフォンでブラウザから適当なサイト(https://www.google.co.jp/ とか)にアクセスしてください。

アクセスしたら「bookmarklet url in a textarea」と書かれているテキストフィールド

に入力されているJavaScript をなんとかコピーし、

スマートフォンブラウザのURL入力欄に貼りつけて実行してください。

(事前にスマートフォンで http://[IPアドレス]:[ポート番号] に接続し、テキストフィールドに入力されているJavaScript をコピーしてブックマークに登録しておくと次回からブックマークをクリックするだけで利用できるので便利です!)

貼りつけて実行しましたら、元にアクセスしていたページに戻るはずです。

ここで、さきほどPCでクリックしておいたページを見てみましょう。

Targets が緑色で

「192.168.2.83 [channel: 1200079761 id: anonymous] – https://www.google.co.jp/ 」

と表示され、Clients も緑色で表示されるようになりました!

では、上部タブの Elements をクリックしてみてください。

Chrome のデベロッパーツールのように HTML の DOM が表示されたでしょうか。

Chrome のデベロッパーツールのように、DOM 上にマウスを合わせたら、
なんとスマートフォンの画面もその DOM に当たる部分が薄い灰色っぽく反転します!

これでいろいろテストすることが可能になります。

※ いろいろ試した結果、どうもページ遷移は対応していないようで
ページ遷移する毎に weinre の JavaScript を実行させないとダメないようです。

以上がweinreの解説と実行方法になります!
※ 上記実行手順等はコチラを参考にさせていただきました。

※※ 上記サイトによると、呼び方は 「ワイナリー」 もしくは 「ワイナー」 らしいです。

   weinreを説明しているyoutubeの外人さんは「ウィ…ナー?HAHAHA」って言ってました…

是非、利用して快適なスマートフォン最適化サイト開発をお送りください!

rubyでミリ秒までの時間生成方法

0

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

「20120509104004229」、「2012-05-09T10:40:04.229Z」
のようなミリ秒までの時間文字列を時間に変換して、計算をしたいことがあります。
簡単ですが、ミリ秒までの時間オブジェクトの生成方法をご紹介します。■ruby1.8.7では下記の書き方です
>> time = Time.utc(2012, 5, 9, 10, 40, 4, 229*1000)
=> Wed May 09 10:40:04 UTC 2012
>> time.iso8601(3)
=> “2012-05-09T10:40:04.229Z”

>> time  = Time.local(2012, 5, 9, 10, 40, 4, 229*1000)
=> Wed May 09 10:40:04 +0900 2012
>> time.iso8601(3)
=> “2012-05-09T10:40:04.229+09:00”

>> time2  = Time.local(2012, 5, 9, 10, 40, 5, 300*1000)
=> Wed May 09 10:40:05 +0900 2012
>> time2 – time
=> 1.071

■ruby-1.9

ruby-1.9では、「to_r」という文字列を有理数に変換するメソッドも使えます。

ruby-1.9.2-p180 :004 > time = Time.utc(2012, 5, 9, 10, 40, 4, 229*1000)
 => 2012-05-09 10:40:04 UTC
ruby-1.9.2-p180 :005 > time.iso8601(3)
 => “2012-05-09T10:40:04.229Z”
ruby-1.9.2-p180 :006 > time.iso8601(6)
 => “2012-05-09T10:40:04.229000Z”

ruby-1.9.2-p180 :007 > time = Time.utc(2012, 5, 9, 10, 40, “4.229”.to_r)
 => 2012-05-09 10:40:04 UTC
ruby-1.9.2-p180 :008 > time.iso8601(6)
 => “2012-05-09T10:40:04.229000Z”
ruby-1.9.2-p180 :009 > time.iso8601(3)
 => “2012-05-09T10:40:04.229Z”

ちなにみ、ruby1.8.7では、
>> time = Time.utc(2012, 5, 9, 10, 40, “4.229”.to_r)
NoMethodError: undefined method `to_r’ for “4.229”:String
        from (irb):34
        from :0

絶対に笑ってはいけないRSpecの現場24時

0

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

こんにちは、SHIMADAです。 今日は現場の泥臭いRSpec話を書きます。

新しいフィーチャーを追加するとき、specがなかなか通らない、実装が思い通りに進まない、ということがありますよね。
そんなとき、自分の書いたコードが実際にはどう動いているのか確かめる方法が欲しいです。

一番簡単で広く使われているのはデバッグプリントという手法です。
コードの中に p 変数名 と書くと、specの実行途中にその変数の中身がどうなっているか確認できます。

ここで問題になるのが、specがたくさん書いてあるとデバッグプリントが一杯出てきて肝心の調べたいケースが埋もれてしまうという点です。

ちなみに今携わっているプロジェクトのspecを見てみると、examplesの数が1,000を超えてました。

これが一般的な水準で多いのか少ないのか分かりませんが、ここまできてしまうとデバッグプリントがどかどかっと表示されてあっという間に押し流されてしまうので大変です。

そういう状況でもなんとかしようと編み出した泥臭いテクニックを以下に紹介します。

説明のために簡単なバグ入りのコードと、それを検出するテストを用意しました。

コード


class Calculator
  attr_reader :answer

  def plus(a, b)
    @answer = a + a
  end
end

テスト


describe Calculator do
  subject do
    Calculator.new
  end

  it "1 + 1 = 2" do
    subject.plus(1, 1)
    subject.answer.should == 2
  end

  it "2 + 2 = 4" do
    subject.plus(2, 2)
    subject.answer.should == 4
  end

  it "2 + 3 = 5" do
    subject.plus(2, 3)
    subject.answer.should == 5
  end
end

こんな感じでコードとテストを書いたとします。
バグがあるので “2 + 3 = 5” は成功しません。

Calculator#plusにデバッグプリントを埋め込んで、引数と計算結果を調べてみましょう。


  def plus(a, b)
p :chk1
puts "b = #{b.inspect}"
puts "b = #{b.inspect}"
    @answer = a + a
  end

まず、デバッグ用のコードは通常のコードではないことを強調するために、インデントを無視して行頭から書くようにしています。
こうすることでデバッグが終わってコミットする前に、無駄なコードを消し忘れることを防ぎます。

それから、先頭の p :chk1 は僕が個人的に使っているデバッグ用のマーカーです。
RSpecはピリオドがたくさん出力されます。
デバッグ出力が行の途中から始まると折り返しが読みにくいので、:chk1という目印を使って強制的に改行します。


..........:chk1
a = 1
b = 1
......

当然、いろんなところにデバッグプリントを入れていくときは :chk1, :chk2, :chk3… と数字を増やしていきます。

ところで、このままだと全部のテストケースでデバッグプリントが出力されてしまいます。
できれば、失敗するspecの時だけデバッグプリントを出力したいですね。
そこで、specの側に一時的にこういうものを埋め込みます。


  it "2 + 3 = 5" do
$dbg=true
    subject.plus(2, 3)
$dbg=false
    subject.answer.should == 5
  end

はい。ご覧のとおり $dbg は禁断のグローバル変数です。
グローバルなのでspec内で定義して本番コードの中から参照できます。無敵です。

ちなみにコミットする前に除去する一時的なコードなので、この変数は本来のコードと被らなければどんな名前でも構いません。

使い方は、Cでよくある


#define DEBUG


#ifdef DEBUG

のペアと同じです。


  def plus(a, b)
p :chk1 if $dbg
puts "b = #{b.inspect}" if $dbg
puts "b = #{b.inspect}" if $dbg
    @answer = a + a
  end

これで、調べたいテストケースの時だけデバッグプリントを出力させることができるようになりました。
特定のケースで、どの行でどんな挙動が起こっているか確認できると、デバッグはかなり捗ります。

あとそれから、デバッグプリントだけでは足りなくてどうしてもうまくいかない難しいケースのとき、


debugger if $dbg

としたこともあります。specの実行中この箇所に到達すると、Rubyのデバッガが起動するのでステップ、トレースしながらコードを追いかけてなんとか問題を解決することができました。

最後に、コードのバグがとれてspecが通るようになったらこれらは全部消してきれいにしてからコミットします。

タネを明かせばどうっていうこともない簡単なことですが、なかなか役に立つので今までずっと使っています。みなさんもバグに手こずった時、試してみることをお薦めします。

Android UnitTest

0

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

Androidアプリのテストコードを書いてみました。
今回は画面遷移に関するテストコードです。

事前にunitテストの環境を準備する必要があります。

下記などを参考にさせて頂きました。

http://www.yaunix.com/2011/01/08/android%E3%81%A7%E3%81%AEunittest%E3%81%AE%E5%A7%8B%E3%82%81%E6%96%B9/ (410 Gone)

 Activityコード

public class MainActivity extends Activity {
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        LinearLayout contentView = getContentView();
        setContentView(contentView);
    }
    
    private LinearLayout getContentView() {
        LinearLayout l = new LinearLayout(this);
        Button button = new Button(this);
        button.setText("ターゲットへ遷移するボタン");
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent();
                intent.setClassName(getApplicationContext(), TargetActivity.class.getName());
                startActivity(intent);
            }
        });
        l.addView(button);
        return l;
    }

}

 テストコード

/**
 * 
 * ActivityInstrumentationTestCase2を継承したクラスを作成する 
* テストするクラスを指定する(MainActivity) * */ public class MainActivityTest extends ActivityInstrumentationTestCase2<mainactivity> { /** * 次の画面へ遷移するためのボタン */ private Button button; /** * コンストラクタ * テストするクラスを指定する(MainActivity) */ public MainActivityTest() { super("MainActivityTest",MainActivity.class); } /** * テスト前の準備 */ @Override protected void setUp() throws Exception { super.setUp(); /** * Buttonを取得しておく */ button = (Button) getActivity().findViewById(1); } public void testOnClick() { getActivity().runOnUiThread(new Runnable() { @Override public void run() { /** * 遷移先のクラスをMonitorにセットする */ ActivityMonitor monitor = new ActivityMonitor(TargetActivity.class.getName(), null, true); getInstrumentation().addMonitor(monitor); /** * Buttonをクリックする * (押せることもテストしておく) */ assertTrue(button.performClick()); /** * 画面遷移したあとのクラスを取得する */ Activity next = getInstrumentation().waitForMonitorWithTimeout(monitor, 10); /** * Monitorでセットしたクラスと画面遷移したクラスが同じことを検証する */ assertEquals(monitor.getHits(), 1); if ( next != null ) { /** *遷移した画面を閉じる */ next.finish(); } } }); } }

次は画面遷移以外のテストコードも投稿できればと思ってます。

参考になれば幸いです。

カテゴリで既存メソッドを拡張しようとすると表示されるwarningの対応

0

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

最近はiPhoneアプリ開発をさせてもらっているのですが、
いつからか(下記参考リンクによるとXcode4.3かららしいですが)、カテゴリを利用して既存クラスの既存メソッドを拡張(上書き)しようとすると


"category is implementing a method which will also be implemented by its primary class"

というwarningメッセージが表示されるようになりました。

やはりwarningメッセージを出しっぱなしだと気持ち悪いので、表示させない方法を調べたところ


#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wobjc-protocol-method-implementation"

// 拡張したいメソッドを記述

#pragma clang diagnostic pop

と #pragmaで囲むと表示されなくなります。

参考サイト

guard-shellでファイル監視

0

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

 概要

  • メモ取りにはSphinxがおすすめ
  • ファイル変更監視に使えるRuby GemとしてGuardがある
  • ファイル変更検知時にシェルコマンドを使いたい場合,guard-shellというgemを使う

 メモとりにはSphinxがおすすめ

 はじめまして,Ruby厨のわたなべ(hackugyo)です.

 ところでみなさんはPythonって知っていますか.最近では「グーグル独自のプログラム言語」などと新聞にも紹介されて話題の言語です(<=はい,ここ笑うところですよ).

 Pythonのコードは見た目がきれいに整うという特徴がありますよね.Rubyはコードブロックをdo-endで表現するのに対し,Pythonはインデントで表現するからです.Rubyはend地獄(Pythonはthis地獄)とはよく言われます.

 私はRuby厨ですので,インデントでブロックを表現するのにはぜんぜん慣れられないのですが,そんな私でもインデントのうまみを思い知ることがあります.

 それはテキストメモをとるときです.

典型的なテキストメモ

 業務中,私たちはコードを書いているばかりでなく,RedmineにToDoを切り出したり,Skypeチャットで議論をしたりと,いろいろ文字をうちます.特に私などは,書き出さないと考えがまったく整理できないので,ローカルのメモにも大量の書き込みをしています(大半は「うううこのコードがうまくいかない」「あああおれがばかだった」などです).

 以前は,これをwiki記法で書いていましたが,するとEmacs上での見た目はこういうふうになります:

* 2012/04/18(水)
** 今日のToDo
- コードレビュー依頼
-- 日取り・メンバを決める
** 今日取り組んでいる問題
- URL取得がうまくいかない
-- このメソッドが悪いのか?
 SuperComplexActivity # getUrlAndParseAndMakeQuery()
-- どう考えても切り分けが必要

 内容はともかく見づらいですね.

Sphinxによる見やすいテキストメモ

ここでPython流の,インデントによる構造化を取り入れてみたらどうでしょうか.

================
2012/04/18(水)
================

今日のToDo
==========

- コードレビュー依頼

  - 日取り・メンバを決める

今日取り組んでいる問題
===================

- URL取得がうまくいかない

  - このメソッドが悪いのか?


.. code-block:: java

 SuperComplexActivity # getUrlAndParseAndMakeQuery()

- どう考えてもメソッド分割が必要

見やすいですね!

 じつは上記の記法はreST記法といって,Python製のドキュメンテーションツールSphinxで読むことができます.Sphinxのよいところは,テキストファイルの状態でも上記のようにそこそこ読みやすいreST記法を扱っており,さらにそのテキストファイルをビルドすることで,HTMLやPDFなど見栄えのする形式に変換できることです.

 私も,Emacsで上記のようにメモをとったあと,`make html`のシェルコマンドにより,Wikiのような形式に変換しています.過去のメモの参照がしやすく,気分もよくなります.

 ファイル変更検知にはGuard

 さて,前節で述べたような「メモをとる=>保存する=>コマンドを叩く」の流れは,明らかに自動化すべきです.保存をかけたらそれだけでhtmlができあがっていれば便利ですね.

 ここからが本題です.「ファイル編集=>保存する=>処理実行」と言えば,Ruby厨として思い出すのは当然,Guardです.Guardは,RSpecによるテスト実行時に使うRubyGemとして有名な,ファイル変更監視ツールです.Guardを使うことで,Railsのモデルを編集しただけで自動的にRSpecを実行するなどの処理が簡単に行えます.

 Guardを,上記のようなテキストメモの監視&コマンド実行にも使えないでしょうか? もちろんできます.やってみましょう.

(もちろん,ファイル変更監視ツールは他にもいろいろあります.Rubyにもwatchrというgemがありますし,Pythonならwatchdogがあります.シェルスクリプトを組んでポーリングしてもいいでしょう.エディタがEmacsなら保存時にフックして処理を挟む手もあります.今回はRuby厨として,Guardの使い方を広げるために,Guardを使います.)

shell操作にはguard-shell

guardにシェルコマンドを叩かせるには,guard-shellというgemが必要です.

$ gem install guard-shell

これだけでGuard込みでインストールできます.逆に,Guardだけでやろうとするとうまくいきません(私はこれで1時間はまりました.下記のGuardfileにでてくるシンボル:shellをGuardに理解させるには,guard-shellが必要です.).

 インストールできたら,監視対象とするディレクトリまで移動し,下記のようなGuardfileを置きます.

# -*- coding: utf-8 -*-
guard :shell do
  watch( %r{(.*)¥.rst} ) { |m| `echo #{m.first}が更新されました` }
end

rstは,reST記法を使って書かれたドキュメントによく使われる拡張子です.上記の例では,ディレクトリ直下の*.rstファイルの変更をすべて監視させ,変更があるたびに,更新されたファイル名をechoするシェルコマンドを叩かせています.簡単ですね.

 echoの代わりに,Sphinxのコマンドmake htmlを叩かせるようにすれば,要求が実現できます.

あとは,

$ guard

のコマンドを叩くだけで,Guardが自動的にGuardfileを読み込み,ファイル更新検知をはじめてくれます.

これでテキストメモ保存時のひと手間が減りました.Guardであなたの貴重な時間を守りましょう.

 ご参考

  1. reST記法については,こちらのチュートリアルが親切です:http://sphinx-users.jp/doc11/rest.html
  2. Sphinxについては,
    • 同じくSphinx-Users.jpを参照するか,
    • 株式会社ビープラウド, *Pythonプロフェッショナルプログラミング*(秀和システム, 2012)なども勉強になります.
  3. Guardはこちらにソースがあります. https://github.com/guard/guard-shell
  4. Guard-Shellなど,Guardと組み合わせて使えるgemのリストはこちらです. https://github.com/guard/guard/wiki/List-of-available-Guards

モットときVim

0

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

今回はXcode4ユーザーに唾涎もののプラグインの紹介です。

そのプラグインとは「XVim」。

説明しなくとも分かるとは思いますが、Xcode上でVim操作を実現したプラグインです。

XVim – https://github.com/JugglerShu/XVim

このプラグインがあれば、外部エディタとしてVimを起動する必要もなく、

Xcodeの補完をはじめ様々な機能がフルに使えちゃいます。

インストール方法は簡単、ソースをダウンロードしてきてXcodeでビルドするだけで、

Xcodeのプラグインフォルダにインストールされます。

あとはXcodeを再起動すると…キャー!見慣れたステータスバーが−!

ちなみにパッケージでも提供されているようですが、

ソースからの方が最新の機能など使えるのでオススメです。

(※デイリービルドも公開されているようです)

こちらのプラグイン、hjklに始まる基本的なキーバインドだけではなく、

  • ・検索/置換
  • ・Visual
  • ・TextObject
  • ・キーマッピング
  • ・.xvimrc

などなど機能も豊富。

まだまだ、動作は不安定で、たまにXcodeごとクラッシュしますが、

Vimの機能が使える方がメリットが大きいので全然気になりません。

作者は日本の方で、開発も精力的に行われているようです。

iPhone開発者でVim好きな方は、是非1度このプラグインを試してみてください。

AndroidのScrollViewでスクロールの位置が変わったのを取得する方法

0

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

AndroidのListViewでスクロールの位置が変わったのを取得する際は、ListViewにOnScrollListenerをセットしてあげれば取得することができます。

ならScrollViewでも同じようにOnScrollListenerをセットすれば、スクロールの位置が変わったのを取得できる、、と思いきやそうもいきません。

ScrollViewの場合は、ScrollViewを継承してスクロールの位置が変わったのを取得できるScrollViewを作ります。

public class ObservableScrollView extends ScrollView {
    
    public interface ScrollViewListener {
        void onScrollChanged(ObservableScrollView scrollView, int x, int y, int oldx, int oldy);
    }
    
    private HorizontalScrollViewListener scrollViewListener = null;

    public ObservableHorizontalScrollView(Context context) {
        super(context);
    }
    
    public ObservableHorizontalScrollView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
    
    public ObservableHorizontalScrollView(Context context, AttributeSet attrs, int defs) {
        super(context, attrs, defs);
    }
    
    public void setOnScrollViewListener(HorizontalScrollViewListener scrollViewListener) {
        this.scrollViewListener = scrollViewListener;
    }

    @Override
    protected void onScrollChanged(int x, int y, int oldx, int oldy) {
        super.onScrollChanged(x, y, oldx, oldy);
        if (scrollViewListener != null) {
            scrollViewListener.onScrollChanged(this, x, y, oldx, oldy);
        }
    }
}

ポイントは、Activityなどのスクロールの位置が変わったのを伝えるためのInterfaceを用意するのと、

それを onScrollChanged(int x, int y, int oldx, int oldy)の中に組み込むことです。

ちなみにiPhoneならUIScrollViewのDelegateをセットすれば、- (void)scrollViewDidScroll:(UIScrollView *)scrollViewでスクロールの位置が変わったのを取得できます。

なんて、面倒くさいのでしょう!

Ruby on Rails Rails2からRails3へ移行後の色々

0

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


rick No25です。
今回は、Rails2からRails3へ移行後発生したバグなどを何個か紹介。

rails2の環境

ruby 1.9.1
rails 2.3.11

rails3の環境

ruby 1.9.3
rails 3.0.7

incompatible character encodings: UTF-8 and ASCII-8BI

DB(ASCII-8BI)からview(UTF8)に表示するときにこのエラーが発生します。
解決法
「force_encoding(‘UTF-8’)」の使用
使用例
@user.name.force_encoding(‘UTF-8’)

NoMethodError: private method `readline’

ファイルをアップロードするときにこのエラーが発生します。
解決法
「tempfile.__getobj__」の使用
使用例
params[:file].tempfile.__getobj__

puts delete時の挙動

ログイン系のサイトでputsやdeleteなどを使用してリンクを押下したところ
なぜかログアウトしてしまう事象が発生。
getにはhiddenにauthenticity_tokenが設定されるが、
putsやdeleteには設定されていなかった模様。
解決法
「form_authenticity_token」の使用
使用例
link_to hoge_path(削除したいitem, :authenticity_token => form_authenticity_token), {:method => :delete}

文字参照

xmlを送信したところ文字が文字参照になっていた。
これは以前からなっていて対処もconfig/initializers以下に置いてあったが、 Rails3になってから読み込む順番が変わったのか読み込まれなくなった。
解決法
cinfig/initializersのファイル内で「rack/content_length」を読み込む
使用例
require ‘rack/content_length’

メールがtext形式

html形式のメールを送っていたがtext形式になってしまい、
タグが表示されるようになってしまった。
解決法・使用例
「ActionMailer::Base.default_content_type=”text/html”」をapplication.rbに追加

エラー時メール送信

エラー時にメールが送信されなくなった。

解決法
オーバーライドメソッドの変更
使用例
def log_error(exception)

def rescue_with_handler(exception)

ruby on railsのfindについてメモ

0

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

ruby on railsのfindで取得できる値を列挙してみます。

条件に一致するものが見つからない場合に、それぞれ返却される値が違ったりするのでその確認用の記事です。

(検証環境:rails 2.3.11)

Hogehoge.find(:all) またはHogehoge.all

  Hogehogeクラスオブジェクトがレコード分の配列で返却されます
    [#<hogehoge id: 1, column1:0>, #<hogehoge id: 2, column1:1>, #<hogehoge id: 3, column1:0>]

  条件に一致するものが見つからない場合(レコードが0件の場合):[](空配列)

Hogehoge.find(:first) またはHogehoge.first

  最初のレコードが1件のみ返却されます
    #<hogehoge id: 1, column1:0>

  条件に一致するものが見つからない場合:nil

Hogehoge.find(1)

  プライマリキーが1のHogehogeクラスオブジェクトが返却されます
    #<hogehoge id: 1, column1:0>

  条件に一致するものが見つからない場合:例外

Hogehoge.find_by_column1(0)

  カラム名column1が0という条件に一致する最初のレコードが1件のみ返却されます
    #<hogehoge id: 1, column1:0>

  条件に一致するものが見つからない場合:nil

ゲーム機材の不思議(インターネットに何が送信されてるの?)

0

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

最近、インターネットに接続することを前提としたモバイル端末が各種存在しているが、今回はそうしたモバイル端末がどのような通信を行なっているかに着目してみよう。

今回取り上げるモバイル端末は、次の2種類だ。

・Nintendo 3DS

・PS Vita

 Nintendo 3DSの場合

Nintendo 3DSは、「いつの間にか通信」と呼ばれる機能があり、端末をスリープさせている間に通信を行い、動画ファイルや各種アップデートなどをダウンロードし、ユーザが利用しようと立ち上げた時に、そうした情報を告知する機能だ。では、具体的に通信内容をみてみよう。

下線1のように、定期的にkeep Aliveの通信を行い、接続を常に維持している。そして、下線2の時間になると、データを一気にダウンロードしている事がわかる。また、通信先は常に conntest.nintendowifi.net となっており、米国の任天堂に接続をしているようだ。

この時、サーバに転送している情報が以下となる。

GET / HTTP/1.1

Host: conntest.nintendowifi.net

User-Agent: CTR AC/02

HTTP_X_GAMEID: 00002400

Content-Type: application/x-www-form-urlencoded

Connection: Close

ここに、HTTP_X_GAMEID とあるのが読めるだろうか。このIDを利用することでバージョン情報やどういったゲームなのか等、本体の情報を通知していると思われる。

さて、こうした情報を通信している3DSだが、ゲームを購入する場合、下記通信を行なっている。

GET /ccs/download/0004000000045C00/00000000 HTTP/1.1

Host: ccs.cdn.c.shop.nintendowifi.net

Connection: Keep-Alive

先程のキープアライブ時は、接続先が conntest.nintendowifi.net であったのに対し、アプリを購入する場合、ccs.cdn.c.shop.nintendowifi.netに接続していることがわかる。また、FQDNより、CDN(コンテンツデリバリーネットワーク)を利用していることも想像できる。

 PS Vitaの場合

PS Vitaの場合は、起動しネットワークに接続した際、下記情報を取得する。

http://fjp01.psp2.update.playstation.net/update/psp2/list/jp/psp2-updatelist.xml?ver=01520000&sid=e57cd5a9658dab1ffcbfb174b6b49906b42d1f210cd6eb5fafa6ea358030a61d&nd=0

この情報は、ファームウェアの状態を確認し、ファームウェアの更新が必要であるかを起動時にチェックするようになっている。

より、具体的に見ていこう。

まず、上記のURLをリクエストするとき、上記のURLに現在のバージョンらしき情報も送っていることに気づくだろうか。

ver=01520000 だ。この時のリクエストでは、本体のバージョンが、1.52であることを示している。このバージョン情報を書き換えても、帰ってくる情報に変更はない。おそらく、iOSの時と同じように、Vitaに於ける国勢調査的なものだろう。

さて、リクエストした結果、psp2-updatelist.xml がダウンロードされてくる。その中には、下記の情報が含まれている。

<np level0_system_version=”01.600.000″ level1_system_version=”01.610.000″ level2_system_version=”01.610.000″ map=”00.000.000″ />

この情報は、現在の最新版が何であるかを示している。また、最新版の情報以外にも、

<recovery spkg_type=”systemdata”>

<image spkg_version=”01.000.010″ size=”56821248″>

や、

<recovery spkg_type=”preinst”>

<image spkg_version=”01.000.000″ size=”128841216″>

といった情報も含まれている。この情報を見るとわかるように、PS Vita内部では、ファームウェアとしてsystemdataと呼ばれる部分が存在していることがわかる。また、万一システムのアップデートに失敗した際、エマージェンシーモードで起動し、上記2つを強制ダウンロードすることで、システムを復旧させることができると推測される。

 カスタムファームフェイク画面を作ってみる

上記では、ファームウェアのバージョン情報をXMLが持っている事がわかった。では、この情報を書き換えて、強制的にVitaに流しこむと何が起きるだろうか。

まずは、次のものを用意する。

1.毎度おなじみのフェイクDNS

2.上記DNSの結果を反映するネットワーク

3.カスタムファームウェアを配布するサーバ

まず、1だが、どんなリクエストをおこなっても、必ず特定のIPアドレスを返す、魔法のDNSを用意する。この時、fjp01.psp2.update.playstation.net に対する答えをはじめ、常に一定のIPアドレスを内部に返答してくれる。次に、上記IPアドレスを模したネットワークを用意する。単純に、VM Wareで構築するのがいいだろう。

先ほど構築したVM Ware 上に、どのようなリクエストをされても、常にpsp2-updatelist.xml を返事するサーバを構築しよう。あとは、先ほどの

<np level0_system_version=”01.600.000″ level1_system_version=”01.610.000″ level2_system_version=”01.610.000″ map=”00.000.000″ />

の、01.600.000 を、「KBMJ Custum Edition」等のように、好きな値に書き換えよう。こうすると、PS Vita上にはそのとおりの画面が表示される。スクショを撮影し、友達に見せびらかそう。きっと驚いてくれることに違いない。

ただし、そこの表示されているファームウェア情報は、あくまでもフェイク。実在しないし、実際にファームウェアを更新することはできない。十分注意しよう

SSL証明書ペア確認コマンド

0

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

こんにちは。にゃんです。

ものぐささんにぴったりなちょっと便利な、 opensslコマンドに関して記載します。

秘密鍵とCSR作成し、CSRを認証局に提出して、証明書が発行された後に、どの鍵か不安になってしまったり、念の為合致しているか確認したい場合ってないですか?

そんな時は、以下のコマンドでペアが正しいか確認する事ができます。

#openssl x509 -noout -modulus -in server.crt | openssl md5

12345678abcdefg12345678abcdefg

#openssl rsa -noout -modulus -in server.key | openssl md5

12345678abcdefg12345678abcdefg

#openssl req -noout -modulus -in server.csr | openssl md5

12345678abcdefg12345678abcdefg

表示される結果が同じであれば、同じペアです。(=導入可能です。)

もし、表示される結果が違うのであれば、一生懸命どこかに保存したペアを探しましょう。

証明書情報を表示させたい場合は、以下ので表示させる事が可能です。

 #openssl x509 -in server.crt -text(証明書も含めて表示)

 #openssl x509 -noout -text -in server.crt(証明書を除いて表示)

上記の結果は、証明書の情報が全て表示されてしまいます。

期限だけを確認したい場合は

#openssl x509 -in server.crt -noout -dates

ディスティングイッシュネームを確認したい場合は

#openssl x509 -in server.crt -noout -subject

とする事で、表示される事が出来ます。

新卒入社時に読んでおいたら捗ったかもしれないもの2選

0

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


3月も後半に入り、卒業式シーズンまっさかりですね。この春からこの業界に入られる新卒の皆様、入社(予定)おめでとうございます。

というわけで、新卒で入社する前、入社した後あたりに読んでおいたら捗るかもしれないものをご紹介できればと思います。

対象としては以下のような方を想定しています。

  • ウェブサイトの開発を行う会社で技術系の職種に就く予定
  • これからする仕事の内容について未経験
  • 下手するとプログラミング等も未経験

学校やアルバイト、あるいは個人でモリモリ開発業務みたいなことやってましたというかたや、きちんと情報系の学問を勉強してきましたというかたにとっては、おそらく既知の情報かと思います。文系でプログラミングなども未経験というかたには、少し役に立つかもしれません(自分がそうだったので、あのころ読んでおいたら捗ったかもしれない、というものをあげています)。

 目次

  • しごとでつくる領域のこと
  • しごとでつかう領域のこと

 しごとでつくる領域のこと

読んでおいたら捗ったかもしれないもの

理由

特定の言語やフレームワークによらない、ウェブアプリケーション開発に必要な情報が満載です。HTTP についての基本的な内容はためになります。Rails で強く推されている REST についてもわかりやすく書かれており Rails での開発に役立つこと請け合いです。

Rails などのフレームワークを利用して開発すると、HTTP の仕様についてあまり意識せずに機能を実現できます。「その機能でやりたいことだけを考えて作業できる」ので、とても生産性が高いです。なので、HTTP の仕様について知識がなくても開発をすすめることができますが、知らなくていいというわけではありません。

たとえば以下のようなバグは、本当に基本的なことを知っていれば防げるようなことですが、何も考えずに作業しているとうっかり仕込んでしまうかもしれません。

  • アクセスするたびにカートに物が増える(許容される場合もあるかもしれません)
  • クローラがリンクをたどったらリソースが消えた
  • リンクを踏んだら「こんにちはこんにちは」という記事が書かれた

Rails などのフレームワークを利用して HTTP についてあまり意識せず機能を実現できる、というのは、もうすこし正確に言うと、「その機能でやりたいことを、周囲のいろいろなことから切り離して考えて作業できる」です。なので HTTP についての基本的な内容を知っておくと、バグや脆弱性の少ないウェブサイトを実現できて、捗ります!

 しごとでつかう領域のこと

読んでおいたら捗ったかもしれないもの

理由

この業界では、おそらく、開発環境は Linux や Mac などの Unix 的なもので行う可能性が高いです。Windows で開発をするとしても、.NET なので本番サーバも Windows です、というようなケースを除けば、本番は Linux の OS がのったホストでアプリケーションが動いている、という可能性が高いはずです。

なので、どこかしらで Linux 環境に触れる機会がでてくると思います。ディレクトリの移動や、ファイルの一覧を見る、ファイルの中身を見る、ということはできてあたりまえになっておくと捗ります。

また、ちゃんと基本的なことを知っておけば「なんかアプリケーションがログ吐けずに死にます、バグってるようなので、調査します」→「よくみたらディレクトリの権限がおかしかったみたいです」というような凡ミスに気付く確率があがり捗ります。

なにより、普段自分が普段作業するときに、ストレスなく作業できるようになっていれば、間違いなく捗ります。このテキストはかなりボリュームがあり挫折しそうになるかもしれませんが(自分は挫折しました)、読めば読んだだけためになると思います。

開発環境については、自分が普段つかう(つかおうと思っている)エディタや IDE についても、基本的なこととヘルプの引きかたを覚えるだけで捗り度はアップします。vim については、日本語のヘルプをひけるようにしておくと、より捗るかもしれません。

なお、設定にこだわりすぎたり、エディタ議論に絡むのは楽しいかもしれませんが、あまり捗らないのでほどほどにしておくといいと思います。

 次のステップ

基本的なことを知ったら、こんどはインフラやセキュリティ、品質を上げる知識などを学んでいくといいかもしれません。 「データベース技術[実践]入門」は「サーバインフラ本」「徳丸本」と並ぶウェブエンジニア必携の教科書 – As a Futurist… などを参考にされるとよいかと思います。

以上、ヒヨッコながらも、先輩風を吹かせてみましたが、だれかのお役に立てば幸いです。

新卒の皆さんが、楽しく捗りライフを送られることをお祈りいたします。

maven1.0.2インストーラ

0

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

いつの頃からかMaven 1.0.2がMacPortsからインストールできなくなっていたので、作成したインストーラを公開します。maven 1.0.2 を自分のプロジェクトで使っているのですが、2012-03-19現在、MacPortsからはインストールができなくなっています。一見、以下のようにインストールできそうな気がするのですが


% port search maven
maven @1.0.2 (java, devel)
    stub port, use maven1 instead

maven-ant-tasks @2.1.3 (devel, java)
    Use many of Maven's artifact handling features from Ant.

maven1 @1.1 (java, devel)
    A java-based build and project management environment.

maven2 @2.2.1 (java, devel)
    A java-based build and project management environment.

maven3 @3.0.4 (java, devel)
    A java-based build and project management environment.

maven_select @0.3 (sysutils)
    common files for selecting default Maven version

Found 6 ports.

一見インストールできそうですが、


% sudo port install maven 
Password:
--->  Configuring maven
Error: maven is a stub, use maven1 instead.
Error: Target org.macports.configure returned: obsolete port
Log for maven is at: /opt/local/var/macports/logs/_opt_local_var_macports_sources_rsync.macports.org_release_ports_java_maven/maven/main.log
Error: Status 1 encountered during processing.
To report a bug, see 

maven1使って、と言われてしまいます。しかしながらmaven1.0.xとmaven1.1.xはモノが違いますし、困るプロジェクトが世の中にはまだある…という事でインストーラを公開しました。

maven 1.0.2

/opt/local/bin/mavenとしてインストールされます。

最近人気な記事