ホーム ブログ ページ 54

つかおう SKK

0

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

たのしいインプットメソッド、SKK をくわずぎらいのひとにもおすすめしたいです。

google 日本語入力や baidu type などあたらしい日本語入力システムが少し話題になったりして、色々試してみたかたもいるかと思いますが、そのついでに SKK も試してみてはいかがでしょうか。是非、試してみましょう。

 SKK とは何ですか?

あえて語るまでもなく、インプットメソッド(以下 IM)の一種です。詳しいことは、Wikipedia (SKK – Wikipedia)などの解説に譲ります。

おおざっぱな特徴と比較

  • SKK:
    • ユーザに依頼された部分を漢字変換する。漢字変換する部分はユーザが指定する
  • MS-IME やことえりなどの IM:
    • ユーザの入力文字列を文章の構成要素にわける。必要なら漢字の変換を行なう。ただし、IM の仕事が複雑で、ユーザの意図する単語の区切りにならない場合がある

さらにおおざっぱな特徴と比較

文章を構成要素に区切る作業を、

  • 常に自分でやるか(SKK)
  • 誤変換があったとき直すか(その他 IM)

という、ユーザの負担のタイミングと頻度が違います。

小刻みに変換の合図を送ってリズム良く入力していくか、変換を丸投げしてときどき誤変換に対応していくか、くらいの違いなので最終的にどちらを選ぶかは好みの問題ですが、SKK は慣れればテンポ良く入力していけるはずなので、比較的ストレスなく日々を過ごせるのではないかと思います。

 てっとりばやく体験してみる

こういうものは実際手をうごかしてみるのが良いと先人も言っているので、手をうごかしてみます。

Emacs で SKK のチュートリアルが用意されているので、これで試してみるのがオススメです。

準備

Debian や Ubuntu では SKK 導入のためのパッケージが用意されているのでそれを利用します(一番楽な方法)。その他の環境では「Emacs ddskk」とったキーワードで検索してみてください。

sudo aptitude install apel ddskk skkdic

それぞれ、以下のものをインストールしています。

  • apel: Emacs で使われるライブラリ
  • ddskk: Emacs で使われる SKK ライブラリ
  • skkdic: SKK で利用される辞書ライブラリ

aptitude でインストールした Emacs 等であれば、ライブラリパス等の設定の必要もなく、起動して即利用できます。

試す

emacs を起動します。そしてチュートリアルを開始します。チュートリアルは M-x skk-tutorial で開始します。

あとは言われるままにチュートリアルを進めるだけです。

 導入する

SKK は Emacs だけで利用できる IM ではありません。skkime(Windows)、aquaSKK(OSX)、uim-skk(Linux など)といった様々な OS の IM で利用できます。Vim でも skk.vim というプラグインが利用できます(skk.vim : Japanese SKK。また、Vim での SKK については eskk.vim というプラグインの開発もはじまっています)。それぞれの利用したい場所での SKK を探して日常的に利用してみましょう!

 付録:よくある問題など

  • 小指が疲弊します
    • 慣れると意外と気にならないです。別解として、sticky-shift という、小指にやさしい仕組みが世の中にはあります。sticky shift で検索してみてください。
  • Terminal.app で “▽” がきれいに表示されない
    • iTerm を使う、次のバージョンに期待するなどの対策があります。
  • 他の入力方式で入力できなくなる
    • 他の入力方式で入力するケースことがあまりなくなるはずなので、おそらく問題ないです。

みなさんが SKK を利用してたのしい生活を送られることを願ってやみません。

Pythonで画像のコピー

0

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

はい。ぼくです。

さて、iPhoneのネタたくさんあるのですが。。今日はおやすみ。

たまたま、今日iPhoneアプリの開発検証で画像が数百枚も必要になったので、1枚のサンプル画像をコピーしまくろうということで、Pythonで数行のスクリプトで処理したのでそちらを記事に。

 Pythonの画像処理ライブラリのPIL(Python Imaging Library)で処理しました。
こちらが、自分のPCに入っていなかったため下記にてインストール( Mac限定ですみません。)

$ sudo port install py26-pil

インストールできちゃえば、後はコードちょりちょり書くだけ

# vim:fileencoding=utf-8 :

from PIL import Image
from PIL import ImageFont, ImageDraw

# 元となる画像名
original_image_name = “original.png”
# コピー後の画像名フォーマット
copied_image_name = “copied_%03d.png”

# 画像の読み込み
im = Image.open(original_image_name)

# 500 枚作成
for i in range(500):
    # コピー
    copy_im = im.copy()
    draw = ImageDraw.Draw(copy_im)
    # 画像の左上あたりに画像の番号を記載
    draw.text((10, 100), “No. %03d” % i)
    copy_im.save(copied_image_name % i, quality=100)

できあがりの画像はこちら。(copied_001.png)

無駄コードもありそうですが、ものの数分で500枚の画像が作成できた。さて、検証しなきゃ。。。

Railsでrepcachedを使ってみる

0

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

Railsでセッションの保存先として、memcacheを使用する場合があります。 しかし、memcachedが落ちてしまった場合、サイトにログインできないトラブルが起きてしまうなどの懸念があります。 そこでepcachedを使用してみたいと思います。

 Repcachedとは?

  • memcachedにレプリケーション機能を追加
  • 非同期のレプリケーション
  • マルチマスタのレプリケーションをサポート(バージョン2.0より)

詳細、repcachedのインストール手順は公式サイトを参照してください。

http://lab.klab.org/wiki/Repcached

 Railsで使えるようにする

Railsのアプリケーションでrepcachedを使用するためには、memcachedクライアントのインストールとアプリケーション側の設定が必要です。

memcachedクライアントの導入

repachedの大本はmemcachedなのでmemcachedクライアントがそのまま使えます。

gem install memcached-client
gem install system-timer

railsでの設定

ここではセッションの保存先として使用する場合と、

フラグメントキャッシュで使用する場合を例示したいと思います。

※この例では、192.168.1.10と192.168.1.11でrepcachedが立ち上がっており、

この2台でレプリケーションしているとします。(ポートはいずれも11211番を使用)

セッションの保存の場合
ActionController::Base.session = {
  :memcache_server => ['192.168.1.10:11211', '192.168.1.11:11211'],
  :expire_after => 86400,
  :namespace => "app-session-#{ENV['RAILS_ENV']}"
}

ActionController::Base.session_store = :mem_cache_store

フラグメントキャッシュの保存の場合

ActionController::Base.cache_store = [
  :mem_cache_store,
  ['192.168.1.10:11211','192.168.1.11:11211'],
  {
    :namespace => "app-flagment-#{ENV['RAILS_ENV']}"
  }
]

※フラグメントキャッシュの保存にrepcachce(memcache)を使用する場合は、

expire_fragmentの引数に正規表現を取ることができなくなってしまいます。

セッションの場合も、フラグメントキャッシュの設定の場合も、基本的には通常のmemcachedとほぼ同じです。

ポイントはmemcacheのサーバの指定に、レプリケーションしているmemcachedを双方指定することです。

これによって、セッションやフラグメントキャッシュは一旦指定したmemcachedのいずれかに配置されますが、

レプリケーションによって最終的には双方のmemcachedに配置されます。

仮に片方のrepcachedが落ちた場合でも、レプリケーションされているためほとんどのセッションやキャッシュは

失われずにすみます。(※非同期のレプリケーションのため、生成されたばかりにセッションやキャッシュは失われる可能性があります)

落ちた場合も、repcahcedの再起動時にレプリケーション先を指定することによって、

内容の同期が行われ、再びレプリケーションを行うことができます。

DBに格納された絵文字を特定する

0

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

サイト上で絵文字が文字化けしてしまい、DBでSELECTしても意味不明なマークが表示されているだけ・・・。
そんな時のための絵文字特定方法をご紹介します。※かなり力技ですが・・・
今回特定する画像はDocomoの「冷や汗」絵文字。
DBはPostgreSQL、文字コードはUTF-8で作成しています。
まずpsqlで該当のレコードををみてみましょう。

hoge=# select body from entries where id=1;
body
——
 (1 row)

うーんこれではわかりませんね・・・。
そこで、一度該当のレコードがあるテーブルをpg_dumpで出力してみます。

$ pg_dump hoge -t entries > entries.sql
このファイルをlessで出力します。

$ less entries.sql
<U+E722>

これは何か意味のありそうなコードです。(Unicode)
次に以下のサイトで先程の文字列を検索します。

絵文字変換表

上記サイトでUnicodeの欄に該当する絵文字がみつかりました。

googleウェブサイトオプティマイザーを使ってみよう

0

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

2009年に公開されてから、画期的なツールと言われながらも、いまだ普及しているとは言えないGoogleの「ウェブサイトオプティマイザー」。
今回は、そのツールの解説をします。
はじめまして。アクセス解析チームのアソウです。
以後よろしくお願いいたします。

近年webサイト最適化の手段として、アクセス解析は欠かせないものとなってきました。
Google Analyticsの台頭でツール導入の敷居は非常に低くなり、いまや個人から大企業まで、多くのwebサイトが、数値を確認しています。

しかし、アクセス解析はあくまでもサイトの現状の確認を行なうものです。
その解析結果をもとに、サイトの改善施策を行なわなければ、本当の意味での効果は表れません。

今回はリニューアルほど大掛かりではないけれど、サイト改善の具体的な方法を解説したいと思います。皆様のお役にたてば幸いです。

■ウェブサイトオプティマイザーを使ってみよう

http://www.google.com/websiteoptimizer/さて、今日は「ウェブサイトオプティマイザー」について解説します。

この「ウェブサイト オプティマイザー」、googleが無料提供している、いわゆるA/Bテストをするためのサービスです。
一個のコンテンツに対し複数のデザイン案を用意しておき、どの案がより効果的かをテストすることができます。

■「A/Bテスト」と「多変量テスト」

テスト方法はふたつ用意されています。
複数のHTMLを用意し、ランダムに表示させる「A/Bテスト」と、一個のHTMLを部分的に変化させる「多変量テスト」です。

今回はより簡単に導入できる「A/Bテスト」の使い方を説明したいと思います。

■1.テストするページを用意する

まず下準備としてテストするページのオリジナルHTMLとテスト用の別バージョンHTMLファイルをそれぞれ用意します。
「A/Bテスト」では、まったく新しくHTMLを用意する必要があるので、テストパターン分のファイルを作成し、webサーバ上にアップしておきましょう。

■2.URLの登録

テストページの準備が整ったら、各ページのURLを登録します。

1.テスト名は任意に分かりやすい名前を入力します。

2.テストするオリジナルページのURLを入力します。

次にオリジナルと比較テストするためのパターンページのURLを入力します。
パターンページは任意に増やすことが可能なため、3パターン4パターンといった複数パターンでのテストも可能です。

3.最後に、コンバージョン用のURLを入力します。
通常コンバージョンページは上記オリジナルページ、テストページから遷移するゴールページのURLとします。

これらURLが実際にインターネット上に公開されているかは、URLを入力すると自動的にチェックしてくれます。問題がないようであれば「続行」をクリックして、進みます。

■3.JavaScript埋め込み

ここからは、実際にHTMLを編集してサーバ上にアップロードする作業です。

今回は自分でトラッキングコードを埋め込んでいきます。

オリジナルページのHTMLファイルには直後に「制御スクリプト」と、直前にそれぞれ「トラッキングスクリプト」を埋め込みます。

パターンページ、コンバージョンページにも、直前にそれぞれのスクリプトを埋め込みます。
パターンを増やせば増やすほど、埋め込むトラッキングスクリプトも増えます。

すべてのスクリプトをファイルに埋め込み、webサーバーにファイルをアップロードした後、検証してエラーがなければ準備は完了です。

■4.テスト開始

確認画面で、オリジナル、パターン1、コンバージョンページの一覧が表示されるので、プレビューなどでパターン表示などに間違いないことを確認したら、「テストを開始」。
これで準備はすべて完了です。

あとは数時間後にレポートが上がってくるのを待つだけです。

■5.レポートを見る

レポートでは「予測コンバージョン率」やオリジナルの掲載成果を上回る可能性など、各指標が見られます。
また、CSV形式などのダウンロードも可能となっています。

■最後に

このウェブサイトオプティマイザーを使いこなし、テストから効果的なレイアウトや文言を導き出して、一気にコンバージョンアップ。なんてことも夢ではないかもしれません。

webサイトに変更を加えるということは、作業工数がかかり、しかも逆効果になる可能性もあるなど、何かとリスクが付きまといます。
オプティマイザーは、そのリスク回避を“テスト”というカタチで可視化し、より有効な施策を見つけ出す手助けとなります。

「リニューアルしたいけど、やっぱり不安…」そんな方にオススメのツールです。

■AppiritsのGoogle アナリティクスセミナー

AppiritsのGoogle アナリティクスセミナーは、初期設定から機能解説、仕組の理解までさまざまな内容を用意しています。
ご興味のある方は是非弊社セミナーにご参加ください。

Google アナリティクス セミナー インターフェイス編
Google アナリティクスのレポート画面が把握できていない方向けの講座。
レポート画面の解説や既存機能の活用法、マルチチャネルなどの新レポートのインターフェイスを解説します。

Google アナリティクス セミナー 分析手法編
インターフェイスは把握しているが、数値の意味や考え方がよく分からないという方向けの講座です。 アクセス解析を用いた課題抽出やサイト改善の考え方を解説します。

Google アナリティクス セミナー 徹底設定編
現状のGoogle アナリティクスで取得可能な数値に物足りない方向けの講座。
外部サイトへの誘導やソーシャルボタン連携、eコマース機能などのカスタマイズ方法をレクチャーします。

KBMJ、ECサイト構築パッケージ「エレコマ」に 多店舗対応機能を付け加えた「エレコマ 2.0」を発表

0

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


宣伝です!!

ECサイト構築パッケージ「エレコマ」に 多店舗対応機能を付け加えた「エレコマ 2.0」を発表しました。

 ◆概要

エレコマロゴECサイトを構築する際に必要となるのがECパッケージです。しかし、世の中にはECパッケージは多く存在していて、何を選べば良いかが分かりません。昨年の2009年12月に公開した「エレコマ」は、日本初Ruby on Railsを利用したECサイト構築パッケージで、MITライセンスにて提供しているのでパッケージ費用が不要です。公開して5カ月が経ち、1000件近いダウンロードがありますが、今回ECモールサイトやブランドを複数お持ちの方でも利用できるよう多店舗対応機能を含んだ「エレコマ2.0」を2010年 5月10日に発表いたしました。

従来、複数ブランドをお持ち方がECサイトを構築する場合、ブランド毎のECサイトを複数立ち上げるか、多大なコストを支払ってカスタマイズするかの2パターンでした。「エレコマ2.0」は、ECサイトの中に複数の店舗を登録できるよう多店舗対応機能を含んでいます。

また、細かなバージョンアップ情報は、「エレコマ」紹介サイト(http://ec.kbmj.com/)にも掲載されますし、技術者ブログ「DoRuby」(http://doruby.kbmj.com)でも掲載させて頂いております。Twitterのハッシュタグ(#elecoma)でも情報公開中です。

※Twitterは、Twitter, Inc.の登録商標です

◆追加されたまたは変更された機能

ユーザ側

・ 商品情報に店舗名を付加

・ 店舗ごとの商品一覧表示

・ 請求の分離及び画面遷移の変更

・ 店舗ごとの情報ページの追加

管理側画面(マスターショップ)

・ 販売元編集の画面を追加

・ 管理ユーザに販売元を紐づけ

管理側画面(販売元)

・ 商品管理

・ 受注集計

・ 顧客情報

・ 受注管理

・ 在庫管理

・ 返品処理

・ 基本情報(販売元編集、メンバー管理、発送設定)のみ閲覧、変更可能。

管理側制御

・ 基本的に管理しているショップの情報以外編集不可

・ カテゴリはマスターショップで管理する

◆ECサイト構築には

ECサイトを構築する際には、まず開発ベンダーの選定が重要です。エレコマは、Ruby on Railsが利用できる開発ベンダーであれば、カスタマイズは可能です。KBMJもその開発ベンダーの中の一つでECサイトの構築やSNSパッケージ(コミュニティーサイト構築パッケージ)を合わせたソーシャルコマースの構築まで承ります。

◆多店舗対応機能とは

ECサイトの中に複数の店舗を登録でき、管理画面から各店舗が受注、商品、顧客などの情報を管理する機能です。

◆関連URL

MITライセンスのECパッケージ『エレコマ』 http://ec.kbmj.com

SEO外部対策への見直しが始まった今こそ、『SEO内部対策サービス』http://seo.kbmj.com/

構築前後のサイトの評価、課題点の洗い出しに『アクセス解析コンサルティングサービス』 http://ga.kbmj.com/

販売戦略に合わせた検索結果の最適化が行える『Advantage Search』  http://search.kbmj.com/

◆本件に関するお問合せ

株式会社ケイビーエムジェイ ITコンサルティング部

青木・鈴木

〒150-0021 東京都渋谷区恵比寿西2-20-3 代官山CAビル1F

TEL:03-6696-1207 FAX:03-6696-1245 Email:info@kbmj.com

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

0

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

M.T. です。だいぶ開いてしまいましたが、
rails の action_cache について、続きを書きます。
前回のエントリはこちら

action_cache の仕組み

前回のエントリでは rails 組み込みのキャッシュ機能についてざっと書きました。
今回は、その中から action_cache に的を絞って書いてみます。

実際に、コードを例にして見てみましょう。

# コードはこんな感じ
SampleController < ApplicationController
  caches_action :index

  def index
    @sample = Sample.find(:all)
  end
end

サンプルモデルから全件を取得して表示するだけのコントローラです。
action_cache の宣言は、cache_action :メソッド名で、指定されたメソッドが対象となります。
引数にメソッド名を指定しない場合、クラス内の全 public メソッドが対象となります。

おさらいすると、action_cache は around_filter として実装されているため、
上記のコードは、以下のような挙動になります。

キャッシュがなかった場合

  1. キャッシュの存在チェック
  2. index アクションを実行
  3. キャッシュの生成

キャッシュがあった場合

  1. キャッシュの存在チェック
  2. キャッシュを表示

注目したいのは、キャッシュがあった場合の処理です。
action_cache では、キャッシュがあった場合、キャッシュを生成するためのafter フィルタを実行しません。
もっと言うと、action_cache の before フィルタより順番が後になっている、
そのとき設定されているすべてのフィルタの実行を行いません。

以下のようなコードがあるとします。

# コードはこんな感じ
# jpmobile はインストール済みで使えるようになっていると仮定
SampleController < ApplicationController
  caches_action :index
  before_filter :mobile_required

  def index
    @sample = Sample.find(:all)
  end

  private
  def mobile_required
    unless request.mobile?
      raise "pc access"
    end
  end
end

携帯からのアクセスでなかった場合、例外が発生するコード…のように見えますが、 実際には以下のような挙動になります。

キャッシュがなかった場合、携帯からアクセス

  1. キャッシュの存在チェック
  2. index アクションを実行
  3. キャッシュの生成

キャッシュがあった場合、PCからアクセス

  1. キャッシュの存在チェック
  2. キャッシュを表示

上記のように、先に携帯でキャッシュができていた場合、action_cache の before より 後に設定されている before_filter で呼ばれる mobile_required メソッドは実行されません。

before_filter :mobile_required
caches_action :index

上記のように、順番が逆になっていれば、先に mobile_required メソッドが実行され、
キャッシュがあろうとなかろうと、PC ではアクセスができなくなります。

jpmobile を利用して携帯に対応している場合かつ action_cache を使う場合、
jpmobile も around_filter で様々な処理を行っているため、このあたりの順番が
重要になってきます。

実際に組み合わせて使う方法は、また次回ということで…
だらだらと長いエントリーですが、よかったらお付き合いくださいー。

スタイルシートの小ネタ〜idとclassの合わせ技で指定する〜

0

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

スタイルシートを適用するのにidやclassを使いますよね。今回はその使い方の中から、たまに役立つ小ネタを紹介します。スタイルシートでidやclassを指定するとき、

#hogehoge

.hogehoge

という書き方をするのはご存知の通りで、

#hogehoge .hoge

という書き方(子孫セレクタ)も普段からよく使います。

さらに実際サイトを作っているとidとclassが同じdivに指定されることもよくあります。

こんなカンジ。

ここまではよく見るコードなんですが、さらにAjaxが絡んでくるとややこしくなってきます。

例えば

・タブメニューの背景をそれぞれidで指定している

・タブを切り替えたらリロードなしでメニューの背景もいれかわる

よくある動きです。

こんなときは#hogehogeでかつ.hoge_onの時、または.hoge_offの時という指定をします。

#hogehoge.hoge_on { background-color: #ff0000; }

#hogehoge.hoge_off { background-color: #0000ff; }

子孫セレクタに良く似てますが、idとclassの間にスペースはありません。

この書き方だと

この時は背景が赤

この時は背景が青

とclassが切り替わるだけで背景を出し分ける事ができます。

実際このくらいは子孫セレクタを使えば何とかなることが多いんですが、

Ajaxのライブラリを使ったり、プログラムでアレコレしていると

子孫セレクタだけではなんともならないことがあるので、

そんなときにはこの書き方(ちょっと調べたんですが呼び名が特に見つかりませんでした…)で対処できます。

手書きで検索できるシンプルな筆順辞典「常用漢字筆順辞典」

0

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


皆さん漢字は得意ですか?
今回紹介するアプリは、常用漢字筆順事典。350円です。

最近はパソコンやケータイの普及で、漢字が苦手な人が増えてきていると言われていますね。
筆者もご多分に漏れず漢字がとても苦手です。
ミーティング中ホワイトボードに書き込もうとして手が止まってしまうこともしばしば……
ということで、シンプルな筆順辞典アプリをご紹介します。


起動するとすぐに手書き検索用のキャンパスが開きます。シンプルですね。
調べたい漢字を手書きで入力します。


候補リストが現れるので目的の漢字を選択。


なぞって筆順を確認することができます。


あーこれ 「ふな」って読むのか。ふななー。

手書き認識の精度はかなり高く、一部記憶が曖昧な漢字であっても
適当に書いてみると候補リストに出てきたりします。


「挨拶」って、何回書いても覚えられないよね。

その他、普通に画数や読み、漢字そのもので検索することも可能。

現時点では用例は少なめ、筆順データが無い漢字も割とある
というところが少々イマイチですが
頻繁にデータ追加バージョンアップが行われているようなので
これはその内解消されるかもしれません。
ちなみに、筆順データが無い漢字については筆順の確認は出来ませんが
読みや部首名を調べることは可能です。
また熟語で検索することはできません。

全体としてシンプルな使い勝手にこだわりを感じました。
350 円という価格も辞書系アプリとしてはかなり安価なので
シンプルな漢字辞書を探している方にはオススメです。

常用漢字筆順辞典


えっ「必」ってその点から書くの!?

QRコードをベクター化する方法

0

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

QRコードを作ったはいいものの、印刷物に載せるには解像度が足りない!
そんな時にQRコードをベクター化して、サイズの大きい印刷物にも使用できるようにする方法をご紹介します。

用意するもの
・ベクター化したいQRコード
・Photoshop
・Illustrator

QRコードの画像は、QRコード作成のできるサイトがいくつもありますので、
それらを利用するなどして用意してください。

それでは早速作ってみましょう。
まずは用意したQRコードをPhotoshopで開きます。
今回はこのQRコードをベクター化します。
QRコード

「選択範囲」→「色域指定」で黒い部分のみ選択されるように調整します。
黒い部分のみ選択できましたら、パスウィンドウの下の方にある
「選択範囲から作業用パスを作成」(下図の部分)をAltキーを押しながらクリックします。
選択範囲をパスに変換

許容値を入力するウィンドウが出てきますので、「0.5」と入力してOKを押します。
すると、下図のように見事選択範囲がそのままパスになります!
パスになりました
後はこれをパス選択ツールで全て選択して、Illustratorへコピペして色をつければ完成です。

ちなみに許容値は0.5~10の値で入力することができ、
数値が小さいほど詳細に、数値が大きいほどアバウトにパスへと変換することができます。
これは他の用途にも応用できますので、是非覚えておいてください。

ちなみに・・・
意外と知られていなかったりしますが、「QRコード」という単語を使用した際は
「QRコードは(株)デンソーウェーブの登録商標です」という登録商標文を記載しなければなりません。
掲載したくないorスペースがない場合は「二次元バーコード」、「二次元コード」などの言い換えを使用しましょう。

QRコードは(株)デンソーウェーブの登録商標です

Dockを多段ランチャーにする

0

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

こんにちは、たろちゃんです。Mac OSXではなかなか良い多段ランチャーに出合ったことがありません。なので、いっその事Dockを多段ランチャーにしてみました。

みなさんはMac OSXでランチャーは何を使っているでしょうか?僕は普段はQuick Silverを使っています。このランチャーはキーボードのみでさくっとアプリケーションを開いたりタスクを実行したりできるため、非常に便利です。

しかしながら、Quick Silverでも欠点があります。それはアプリケーション名を覚えていないと使いづらいという点です。アプリケーションの名称を駆使するため、どうしてもこういう状況になってしまいます。

僕自身はWindowsを使っている場合はキーボードタイプのランチャーの他に、CLaunchというソフトを併用しています。このソフトはいわゆるボタン型のランチャーで、アプリケーションをカテゴリごとに分けられるので非常に便利です。

そこで、この手のソフトを探してみたのですが、そもそもDockがあるので需要がないのか、ほとんど見つかりません。見つかったとしてもSnow Leopard対応されていないもののようなので、あまり使いたくはありません。なので、Dockに一工夫をしてボタン型のランチャーっぽいものを作ってみました。

まず初めにアプリケーションのエイリアスを格納するためのフォルダを作成します。今回は以下のようにフォルダを作成しました。

  • $HOME/ショートカット/ユーティリティ
  • $HOME/ショートカット/ネットワーク
  • $HOME/ショートカット/画像系

そして、アプリケーションフォルダにあるアプリケーションをFinderで選択してメニューから「エイリアスを作成」もしくはCommand + Lを選択してエイリアスを作成します。

作成したエイリアスは先程作成したフォルダの中にコピーをして、ファイル名で「 のエイリアス」を削除します。

あとは、これはおまけになりますが、フォルダのアイコンを変更しておきます。まずは変更先のアイコンをアプリケーションのプレビューを使って表示をして、Command + Aで選択した上で Command + C でコピーをします。そして、Finderでフォルダを選択して、メニューから「情報を見る」もしくは Command + I を選択して情報のWindowを表示し、左上のアイコンを選択した状態で Command + V を押して画像を貼りつけます(図1参照)。アイコンの変更方法の詳しいやり方はAppleのドキュメントを参考にしてください。なお、フリーのアイコンはdeviantArtなどで探すと良いでしょう。

これで準備が完了しました。あとはフォルダごとDockのTime Machineの箇所から下の方へドラッグをします。するとフォルダがDockに登録されます。

しかしながら、これだけだとフォルダのアイコンではなく、中身のアイコンが表示されてしまいます。そこでDockのフォルダを選択して右クリックを押し、表示形式でフォルダを選択します(図2)。

これで作業は完了です。どのようになったのか見てみましょう。

まず、Dockが下にあるパターンです。下の図の場合は内容の表示形式でファンを選んだ時の表示です。さっとアイコンが並ぶので結構かっこよいと思います。

次はDockを左に置いたパターンです。この場合は内容の表示形式でファンが選べません。下の図は内容の表示形式がグリッドを選んだ時の表示です。

このように簡単な作業でランチャーを作成する事ができました。標準的なしくみを使っているので、メジャーバージョンが上がっても同じテクニックが使えると思います。

git-svnによる実プロジェクトでのチーム開発

0

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

こんにちは、SHIMADAです。Gitネタはたろちゃんに先を越されてしまいましたが、自分の環境でも、実際のプロジェクトでGitを実用的に使える状況になってきたので、そのへんについて書こうと思います。

 前提

前提条件として、

1. プロジェクトのためのsvnリポジトリがサーバーに用意されていること

2. リポジトリが

PROJECT_NAME/
 `- trunk/
 `- branches/
 `- tags/

というSubversionの標準的なディレクトリ構成となっていること

3. ローカルに最新のgitがインストールされていること

が条件となります。

前者が揃っていないという人は、まずSubversionを導入できるように社内での推進をがんばってください。

申請書とUSBメモリがないとコミットできないんだよ……、という人は、残念ながらあきらめてください。

(あれはネタだと信じていますが……)

後者が揃っていない人は、がんばってググってインストールして下さい。

 下ごしらえ

さて、条件が揃ったところで、下ごしらえです。

まずローカルで、gitの設定をしましょう。

$ git config --global user.name "your name"
$ git config --global user.email account@example.com
$ git config --global color.ui auto
$ git config --global alias.co checkout
$ git config --global alias.ci commit
$ git config --global alias.st status
$ git config --global alias.br branch

git config だと カレントワーキングツリーの .git/config に書き込まれます。

  • global オプションをつけると、 ~/.gitconfig に書き込まれます。

このへんは適宜使い分けてください。

あと、 ~/.gitconfig をエディタで開いて直接編集してもいいと思います。

 リポジトリのClone

次に、プロジェクトのリポジトリからローカルのgitリポジトリにcloneしてきます。

git svn clone -s --prefix svn/ [svnリポジトリのURL] [作成したいGitリポジトリのPATH]

svnリポジトリのURLは、/trunk をつけないプロジェクトのルートまでを書くのが注意点です。

git svn の -s オプションが、自動的に trunk と branch を見分けて git のリポジトリにとりこんでくれます。

名前がないと説明に不便なので、リポジトリの名前を仮に決めておきたいと思います。プロジェクトのリポジトリURLhttps://example.com/svn/repos/myproj/ローカルのリポジトリPATH/home/me/src/myproj-git/

この場合、上記のコマンドはこうなります。

$ git svn clone -s --prefix svn/ https://example.com/svn/repos/myproj/ ~/src/myproj-git

これで、 myproj のgitリポジトリが myproj-git/ に作成されました。

内容を見てみましょう。

$ cd ~/src/myproj-git
$ find .
$ git br -a
$ git svn info

find すると、ローカルのファイルシステムになにがあるか一覧できます。

うまくいっていれば、チェックアウトされたワークツリーと、.git/ 以下のローカルリポジトリが見えるはずです。

git br -a は、リポジトリに含まれるブランチを一覧できます。

git clone に –prefix svn/ をつけたので、リモートブランチは remotes/svn/hogehoge という風に見えているはずです。

git svn info で、カレントのローカルブランチがsvn上のどのブランチに対応しているかが分かります。

clone直後はローカルブランチはmasterのはずです。これが、svn/trunkに対応していない場合は、masterを作り直してみてください。

手順は、

  1. リモートのtrunkに対応したブランチを仮の名前で作成してそこに移動する
  2. 現在のmasterブランチを削除
  3. 仮の名前をmasterにリネーム

です。具体的なコマンドは、下記のようになります。

$ git co -b master2 remotes/svn/trunk
$ git br -D master
$ git br -m master2 master
$ git co master

(この項目の情報源はこちら

全部ローカルでの作業なので、上流のsvnリポジトリには一切影響が出ません。

うまくいかなくても怖がらずに、何度でも繰り返して試せるので安心してやってみてください。

 作業用ブランチの作成

さて、これでプロジェクトのsvnリポジトリの完全なクローンが、手元にgitリポジトリとして作成されました。

もし、自分の割り当てられているタスクにsvnのブランチが割り当てられているなら、まずそちらに移動しましょう。

仮にブランチ名が ver02 だったとすると、手順はこうなります。

$ git co -b ver02 remotes/svn/ver02

このコマンドでやったことは、

https://example.com/svn/repos/myproj/branches/ver02 にあるブランチを元にしたローカルブランチ ver02 を作成してワーキングツリーにチェックアウト

です。

git svn dcommit は、デフォルトの動作としてローカルブランチと同じ名前のリモートブランチにコミットしに行きます。

ブランチ名 ver02 を合わせるのは、自分の分かりやすさと同時にgit-svnのためでもあります。

 開発環境の準備

つぎにやることは開発開発の整備です。

まず、必要なgemやライブラリをそろえた後、チェックアウトしたワークツリーで開発ができる状態になるまでコードや設定ファイルを修正することになるでしょう。

Railsならdatabase.ymlやenvironment.rbの修正などです。

いろいろ環境を設定して、script/serverが動くようになったら、ワークツリーがどうなっているか確認してみましょう。

$ git st

いろいろ表示が出てきたと思います。

既存の変更したファイルは

# Changed but not updated:

というセクションに、新しく作成したファイルは

# Untracked files:

というセクションに表示されます。

 開発

開発をはじめましょう。

新しいコードを書き始める前に、まずブランチをきってそちらに移ります。

$ git co -b new_feature

すると、

M  ファイル名

というなにか見慣れた表示が出てくると思います。

これは、git st で

# Changed but not updated:

に表示されていたファイルです。

ワーキングツリー上では変更されているけど、リポジトリにはまだ反映されていないという状態です。

そのまま開発を続けて、一段落ついたらコミットします。

まず git st してみましょう。

# Changed but not updated:
# Untracked files:

両方のセクションに、自分がコードを書いたファイルが表示されています。

まず、Untracked files: の中にある、コミットすべきファイルをgitに教えてあげましょう。

$ git add ファイル名

次に、

$ git diff

として、自分の作業を思い返しながら変更点を見返していきます。

ここで思わぬ見落としや、作業の抜け、ミススペルなどを見つけることができます。

この「作業の振り返り」はなかなかあなどれないものがありますので、忘れずにやっておきましょう。

間違いを見つけたらすぐに diff を抜けてエディタを起動し、直してまた git diff に戻ります。

出てきたファイルごとに、これで大丈夫という状態になったら、

$ git add ファイル名

します。addされたファイルは、

# Changes to be committed:

というセクションに表示されます。また、addすると次から git diff には現れません。

git diff して確認 → OKならgit addというサイクルでひとつづつ片付けていくのがおすすめです。

あと、environment.rb など、リポジトリに変更をコミットしたくないファイルもありますね。

これは、git addをしないで

# Changed but not updated:

に置いたままの状態にします。

ここが、svnなどの普通のバージョン管理システムと違うgitの大きなメリットのひとつです。

すべての必要なファイルを git add したら、ローカルの new_feature ブランチにコミットしましょう。

$ git ci -m 'コミットメッセージ'

ここで記入するコミットメッセージは、特別なことをしない限りsvnのりビジョンログにそのまま送信されますから、

開発チームのルールに沿ったメッセージを書くようにしてください。

 作業ブランチからのマージと上流へのコミット

new_featureの作業が一通り終わってうまく動いているようなら、ver02ブランチに作業内容をフィードバックしましょう。

$ git co ver02
$ git merge new_feature

マージが終わったら、ver02 に new_feature で行った作業が反映されているはずです。

テストも通って、チームのコミット基準に達しているようなら、リモートのsvnリポジトリにコミットしましょう。

まず、

# Changed but not updated:

にあるファイルをワーキングツリーから片付けないといけません。

$ git stash

これで、stashと呼ばれるリポジトリ内の格納場所に、これらのファイルの変更が保存されました。

もう一度 git st してみると、ワーキングツリーがきれいになっていることが分かります。

さっきの消えてしまった変更はどこに行ったのか?

$ git stash list

これで表示される場所にあります。元に戻したい場合は、

$ git stash pop

でいつでも戻りますから安心です。

では改めて、コミット作業に戻りましょう。

$ git stash
$ git svn fetch
$ git svn rebase

まず、fetch/rebaseでリモートリポジトリの最新の状態を持ってきます。

ここでコンフリクトなどが起きていたらリポートされますので、 >>>>> ====== <<<<< のようないつものマーカーをみつけて衝突を解消してください。

衝突したファイルは、git上では unmerged な状態になっていますので、解消したら git add して、解消したことをgitに教えてやります。

衝突がすべて解決したら、あらためてコミットします。

$ git svn dcommit

これでうまくいけば、svnリポジトリに今回の作業 new_feature が反映されているはずです。

trac/redmineやほかのsvnクライアントツールなどで、無事反映されているか確認してみて下さい。

うまくいったようなら、また開発に戻るために、さきほどstashに片付けた変更を手元に戻しておきましょう。

$ git stash pop

もし、dcommit しようとしてエラーメッセージが出てしまっても大丈夫です。

作業内容はすべて git の new_feature ブランチに残っていますし、リモートのsvnリポジトリには迷惑がかかっていません。

深呼吸して落ち着いて、エラーメッセージを読んで、ググって、試して…体で git を覚えて行って下さい。

have a nice git hacking!

rufus-scheduler という、ちょっとかわいそうな子

0

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

Webアプリとは、ユーザのリクエストに対してレスポンスを返す

アプリケーションですが、時にユーザのリクエストに関係なく

処理を行いたいシチュエーションが存在します。

そのような場合、通常「バッチ」と呼ばれるコマンドライン上で

動くアプリを作成します。

私は現在、Webアプリの開発にRailsを使っていますが、

Railsでは、下記のようにモデルとメソッドを指定すれば

特にバッチ用の各種インターフェイスを作成せずとも

Webアプリの設定をDRYに使い回して簡単にバッチを作成することができます。

ruby script/runner -e production ‘ModelClass.method(params)’

script/console コマンドと併せて大変重宝しています。

で、上記のようなバッチを「運用者のコマンドライン上での操作」という

人力を介さず、任意のタイミングで実行したいとき、*nix系OSの場合は

一般的にcronがよく使われます。

02 4 * * * rails_batch.sh

さて、ここで本題。

rufus-scheduler という gem  があります。

http://rufus.rubyforge.org/rufus-scheduler/

このgemは、Railsアプリにおいて以下の機能が行えるようになります。

あるモデルのメソッドに対して

・定期実行が可能(○秒/□分間隔)

・cronとしての予約処理が可能

詳しくは上のリンクを見てください。英語が苦手な方でも

Rails & cron がお分かりの方にはすぐに内容がつかめると思います。

さて、この rufus scheduler、従来の cron と比較してどのようなメリット/デメリットがあるでしょうか。

・記述が簡単

 ・Railsにおけるバッチ処理は基本的にモデルで完結するので、このような記法だとscript/runner よりもより簡潔に書ける

・処理が楽

 ・script/runner だと、いちいち、重たいRailsのプロセスを立ち上げるが、rufus-schedulerだと、rufus-schedulerが

 記述されたアプリ(プロセス)と同じpidで走るので立ち上げが軽い

・記述が柔軟

 毎秒/分ごとの処理の記述が、cronやwhile do hoge; sleep SLEEP_TIME; end よりも

 構造的に奇麗に記述できる。

と書くと、なかなか良い子のように思えるのですが、このrufus-scheduler、がっつり欠点もあります。

・つられて落ちる

 起動しているwebアプリが落ちるとき、webとは関係なく走ってほしいバッチ処理が走らなくなる。

・サブプロセスとして動く

 passengerなら問題になりませんが、mongrelで複数のプロセスを走らせているとき、それぞれのプロセスでschedulerが走り

 収集がつかなくなる。

といった具合に、長所が「あったらいいなぁ」というものに対して、欠点が「ゆるさない。絶対にだ」というものなので

どうしても、rufus-schedulerには出番がないわけです。

結構いいアプリだと思うのですがね。

不憫なやつです。

とりあえず自分がこれならいけるかも、と思うものは一つあります。

・クローラ

 あるバッチをバックグラウンドジョブで走らせる。そのバックグラウンドジョブで走らせているアプリの中で

 rufus-schedulerを使った処理を記述し、そのプロセスをkillするまで半永久的に

 ほぼ同じ動作を繰り返す。

例えば、クローラとか、WebAPIを叩く処理(例えばtwitterの最新の状態を反映するblogパーツ)

とかは、この処理を使うとぐっと記述しやすくなるのでしょうか。

以前はよく見かけたのですが、日本語の情報もさっぱり見つかりません。

誰かこの子の活躍の場、思いついた方、共有していただけますとありがたいです。

vim でメソッド単位で移動するコマンド

0

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

vim は色々なコマンドがありますが、色々ありすぎてなかなか覚えられません。

今回ご紹介の移動コマンド「メソッド単位で移動」も、便利っぽいけど

なかなか覚えていられないたぐいのものですので、メモがてら投稿します。

]m 次のメソッドの始めに移動


]M 次のメソッドの終わりに移動

[m 前のメソッドの始めに移動

[M 前のメソッドの終わりに移動

ぜひお試しください!

MacBookにCentOS5を入れてみた

0

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

会社で使っていたPCが壊れ、新しいPCを申請したらMacBookが来ました。ようこそ。

Macに慣れなかった為、Cent5を入れることに。

仮想サーバーとか、共存とかではなく、Macを全部消してCentを入れます。

WindowsPCにCentを入れる感覚で普通にインストールすると、普通に完了画面まで進みました。

なんだ、入るじゃん。と思いPCを再起動すると、フォルダにクエッションマークがついたアイコンが点滅していました。つまり駄目でした。

普通に入れるとブートローダーがうまく行かないらしい。

下記URLの記事通りにMacのCDでフォーマットしてからインストールしたらうまく入りました。

http://mobile-dev.izanagi-izanami.net/blog/?p=8

・MS-DOSファイルシステム、サイズ:0.1GB

ここがポイントですね。

私のMacだと0.1GBにならなくて7GBが最小単位でしたが、問題ありませんでした。

最後にMacを潰してCentを入れたメリットデメリットをご紹介。

とはいっても、まだあんまり使っていないのですが。

 メリット

(私は)開発しやすい。

なんといっても使い慣れたOSは使いやすいです。

本番環境に近い

クライアントのサーバーと近い環境で開発出来るのはバグが少なくなる気がします。

 デメリット

マウス、キーボードが一部使えない

MacBookに付いているキーボードに支障が出ています。

基本は使えますが記号系が一部互換性ないです。

致命的なのはパイプが使えません。history | grep hogeが入力出来ません。

別のキーボードを差して使っています。

Palm Pre アプリを作ってみよう (準備編)

0

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

iPhone や Android を凌ぐとも言われる[要出展]スマートフォン、Palm Pre 向けのアプリケーションを作ってみましょう。

下記の解説は Mac を用いています。Windows 版はそのうち書かれることでしょう。

SDK インストール

Palm Developer Center より、VirtualBox と Palm webOS SDK をインストールします。

Eclipse プラグインのインストール

DoRuby! は Ruby の解説サイトらしいので、Eclipse ではなく Aptana を使ってみることにします。Aptana のインストール方法は aptanaのインストールと使い方について をご覧ください。

メニューの Help > Install New Software… を開きます。

Add… ボタンを押して出る画面の Location 欄に http://cdn.downloads.palm.com/sdkdownloads/eclipse-update-site/site.xml を入力。

Palm webOS SDK を選択し、Next を押します。その後色々聞かれますが OK ないし Yes ボタンを選んでいけばインストールが完了します。

Hello world アプリケーションを作る

メニューの File > Other… を選択。

Palm webOS > Hello World Application を選択。

実行してみる

アプリケーションフォルダに入っている Palm Emulator を起動します。色々ダイアログが出ますが適当に切り抜けてください。

Aptana に戻って実行ボタン(緑色の丸に三角が描かれたボタン)を押すと見事起動します。おめでとうございます!

さいごに

Palm Pre 端末が日本でも発売されることを願っています。

モバイルでの開発の際の識別ID取得の注意

0

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

最近モバイルでの開発をしていた際、各キャリアのユーザ識別IDを取得し、自動ログインをさせる機能を作成したことがあるのですが、その識別IDはいろいろとお約束があるらしく、少しハマったところなので、メモ書き程度にまとめてみます。各キャリア(DoCoMo、au、SoftBank)で取得できる端末識別ID・ユーザ識別IDについて、いろんな決まりごとがあるので、調べた範囲で書きます。
まずはDoCoMoからー

☆DoCoMo
DoCoMoでは、端末識別番号・iモードID・UID(公式サイトのみ)が取得できます。
・iモードID
URLのパラメータに「guid=ON」を付けると取得できる半角英数7桁の識別子。
公式サイトでなくても取得出来ますが、SSL対応しているページでは取得出来ません。
・UID
DoCoMo公式サイトに限り、URLのパラメータに「uid=NULLGWDOCOMO」を付けると取得できる半角英数12桁の識別子。
これも、SSL対応ページでは取得できません。
また、「uid=NULLGWDOCOMO」となっていますが、「NULLGWDOCOMO」の部分は12桁の半角英数であれば、「NULLGWDOCOMO」である必要はないらしいです。

だから、UIDを取得するときは12桁かどうかのチェックが必要になりますね!

SSLページで取得出来ないというのは結構クリティカルでした。。。
ちなみに対応としては、SSLページへの遷移の前に1つアクションを挟む(iモードID・UIDが取得できるアクションで取得する)か、SSLページへのリンクに何かパラメータをつけて、そのパラメータが無いと自動ログインとしてみなさない、といった対応が必要です。
(セッション情報を用いた成りすましに注意!!)

au、SoftBankに関しては、また別途追記します。

findをする際にincludeを指定するとselectが無効になる

0

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

ActiveRecord(以下AR)のバージョンが低いとfindでincludeとselectの併用ができません。

※確認バージョン:1.14.4

下記findを実行するとidだけの結果を取得することができます。

Hoge.find(:all, :select => "id")

ただ古いARでincludeオプションを含めて実行するとselectが効きません。

Hoge.find(:all, :select => "id", :include => :foo)

対応策としてはincludeの代わりにjoinを使うことで回避をすることはできます。

冗長になってしまいますが。

ARのバージョンが新しければ問題無く動作します(2.1で確認)

100段階のレベル調整が出来る将棋アプリ「金沢将棋レベル100」

0

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

さて、突然出来たiPhoneアプリレビューコーナー。今回は筆者の趣味によるチョイスで「金沢将棋レベル100」を紹介します。昔からあるコンピュータ将棋の老舗、「金沢将棋」のiPhone版です。

名前からも分かる通り、本アプリの特徴はコンピュータの強さを100段階!に調節できることです。レベル1だと定跡も使わず、ほぼランダムで動かしているような印象。レベル100だとアマチュア初段ぐらいの力はありそうです。

コンピュータとの対局に勝つと、手合い(ハンデ)に応じてメダルが貰えます。飛車角を落として勝つと玉メダル。 また、貰ったメダルに応じて、使える盤・駒が増えていきます。メダルの一覧を一つずつ埋めていくのが地味に楽しいです。

個人的にはiPhoneの将棋アプリは盤の見やすさと駒の操作性が勝負と思っていますが、本アプリではメニューが簡潔に表示されていて盤が広く取ってありとても見やすく、操作もストレス無くスムーズに行えます。デフォルトではタップするとズームするようになっていますが、設定でズームをOFFにしたほうが操作がしやすいかもしれません。

さて、本アプリのメイン機能であるコンピュータとの対局も期待通りのクオリティですが、 さらに本アプリを良くしているのが、棋譜の保存とメール送信機能です。

単にコンピュータとの対局を保存してメールするだけならそれほど便利ではありませんが、自由に棋譜が入力できる対人戦モードを利用すると、外出先で指した将棋の棋譜を入力して、メール送信する事が出来ます。

しかもうれしい事に棋譜の形式は、通常テキスト形式とCSA形式から選ぶ事が出来ます。CSA形式はコンピュータにとって読み易い形式で、読み込み対応しているアプリケーションが多いため、他のアプリケーションにデータをインポートし易くて便利です。棋譜を管理できるiPhoneアプリもありますが、このアプリだけでも手軽に棋譜が保存できますね。

ご購入はこちらからどうぞ。金沢将棋レベル100

SWFバイナリ解析

0

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

こんにちは。エンジニアの はる です。
今回はちょっとだけマニアックにswfのバイナリ解析方法について書いてみたいと思います。

バイナリって何となく苦手意識のある方も多いかと思いますが、swfのバイナリ解析は数パターンの計算方法だけ抑えてしまえば意外と素直に読み解けてしまいます。

文系大学出身&英語が読めない私でも大丈夫だったので、興味のある方は是非!

用意するもの

バイナリエディタ

まずはバイナリファイルを閲覧・編集できる環境を用意します。

バイナリエディタは様々なものがありますが、自分の環境や好みに合わせて選んでみてください。代表的なものを下記します。

1. バイナリモードでswfファイルを開く
vi -b hoge.swf
2. テキスト形式から16進数ダンプ形式に変換
:%!xxd
3. 16進数ダンプ形式からテキスト形式に変換
:%!xxd -r

解析用SWF

解析するためにはSWFファイルが必要です。適当にSWFをパブリッシュして用意しておきましょう。
※今回の記事では、非圧縮のSWFをもとに解説させていただきます。解析用SWFは、「ファイル」→「パブリッシュ設定」→「SWF設定:ムービーの圧縮」のチェックをはずしたものをパブリッシュしましょう。

基数変換の基礎知識

解析中に2進数・10進数・16進数の相互変換が沢山あります。このあたりの計算方法は事前に覚えておくか、基数変換を簡単に行えるWEBサイトやソフトが沢山ありますので、用意しておきましょう。

以上の用意ができたら、解析用SWFをお好きなバイナリエディタで開けば、準備完了です。

SWFフォーマット

SWFのバイナリは下記のような形式で構成されています。
ヘッダ(header、header_movie)に基本情報が格納されており、コンテンツ(tag block)にシェイプやスクリプト等のコンテンツ情報が順々に格納されています。

SWF
header(8バイト)header_movie(可変長)tag block(可変長)tag block(可変長)..end tag
圧縮有無(3バイト)SWFのバージョン(1バイト)ファイルサイズ(4バイト)ステージの幅・高さ(可変長)フレームレート(2バイト)_rootのフレーム数(2バイト)TLC構造(可変長)TLC構造(可変長)2バイト

ヘッダ

まずはヘッダから読み解いていきましょう。ヘッダから読み取れる情報は以下の6種類です。

ヘッダから読み取れる情報

  1. 圧縮されているかどうか
  2. Flash Player のバージョン
  3. ファイルサイズ
  4. ステージの幅・高さ
  5. fps(frame per second)
  6. _rootのフレーム数

上記の情報が格納されているヘッダの構成は以下のようになっています。

ヘッダのバイナリフォーマット

ヘッダ
header(8バイト)header_movie(可変長)
圧縮有無(3バイト)SWFのバージョン(1バイト)ファイルサイズ(4バイト)ステージの幅・高さ(可変長)フレームレート(2バイト)_rootのフレーム数(2バイト)

それでは実際にバイナリを読み解いていきましょう。1バイト目から順に解説していきます。

バイナリ詳解

1. 1〜3バイト(長さ:3バイト)

SWFが圧縮されたものがどうかを判別します。

16進数説明備考
46 57 53圧縮されていないSWFFWS
43 57 53圧縮されたSWF(※SWF6以降のみ)CWS

CWSの場合、8バイト以降がZLIB圧縮されていることを示しています。この場合、8バイト以降をZLIB展開する必要があります。
※以降の解説はFWSの前提ですすめさせていただきます。

2. 4バイト目(長さ:1バイト)

SWFのバージョンが格納されています。以下の例の場合、SWF7形式であることが分かります。

16進数説明備考
07SWFのバージョン

3. 5〜8バイト(長さ:4バイト)

swfファイルのファイルサイズが格納されています。ただし、数値はリトルエンディアン形式で格納されているため、注意が必要です。

16進数説明備考
ec 52 01 00ファイルサイズリトルエンディアン形式

<計算方法>1. バイトスワップ

ec 52 01 00
逆順00 01 52 ec

2. 10進数に変換

1.の結果(16進数)000152ec
10進数86764

3. ファイルサイズ = 86764 byte

4. 9バイト〜(長さ:可変長)

ステージの幅・高さが格納されています。ただし、数値はRECT構造体で表現されているのに加え、単位はTWIPSのため、注意が必要です。

16進数説明備考
70 00 09 60 00 00 96 00 00 …ステージの幅・高さRECT構造体で表現。単位はTWIPS(トゥイップ)

<計算方法>1. 2進数に変換

16進数70 00 09 60 00 00 96 00
2進数01110000 00000000 00001001 01100000 00000000 00000000 10010110 00000000 00000000

2. 最初の5ビットを10進数に変換

2進数01110
10進数14

3. 2.の結果毎に6ビット目以降を区切る(余りのビットは捨てられます)

最初の5ビット14ビット14ビット14ビット14ビット余りのビット
01110000 00000000 00001001 01100000 00000000 00000000 10010110 00000000

4. 3.の結果を10進数に変換

X座標の最小値X座標の最大値Y座標の最小値Y座標の最大値余りのビット
16進数00000000000000010010110000000000000000000001001011000000000
10進数0480004800

5. 4.の結果がtwipのため、ptに変換(1pt=20twips)

X座標の最小値X座標の最大値Y座標の最小値Y座標の最大値
twips0480004800
pt02400240

6. 縦幅 = 240px, 横幅 = 240px

5. 長さ:2バイト

フレームレートが格納されています。

16進数説明備考
00 08フレームレート逆順にした結果の1ビット目が整数部、2ビット目が小数部

<計算方法>1. バイトスワップ

00 08
逆順08 00

2. 整数部、小数部を10進数に変換

1.の結果(16進数)08.00
10進数8.0

3. フレームレート = 8 fps

6. 長さ:2バイト

_root(メインタイムライン)のフレーム数が格納されています。

16進数説明備考
14 00_rootのフレーム数リトルエンディアン形式

<計算方法>1. バイトスワップ

14 00
逆順00 14

2. 10進数に変換

1.の結果(16進数)00 14
10進数20

3. _rootのフレーム数 = 20

ヘッダの解析はこれで終了です。SWF解析の肝は次バイトからのコンテンツ(tag block)ですが、これはヘッダ解析で行った計算方法の応用です。

ここから先は、tagの種類毎にtag blockの構造が異なるため、Adobe社が配布している『SWF file format specification』を片手にtagの種類を特定し、それに合った計算方法で解析していくことになります。

今回は一例として、ヘッダに続くtab block(SetBackgroundColor)の解説を行います。

コンテンツ

コンテンツのバイナリフォーマット

  • コンテンツは tag block毎に続き、tag blockは[ tag | length | contents ]の構造(以下、TLC構造)となる。
  • tag block の構造は2種類存在し、”「length < 3f」の場合”と”「length >= 3f」または特殊形式の場合”で異なる。

1. タグ形式1(※「length < 3f」)の場合

コンテンツ
tag block(可変長)
record header(2バイト)contents(lengthバイト)
tag(10ビット)length(6ビット)contents(lengthバイト)

2. タグ形式2(※「length >= 3f」または特殊形式)の場合

コンテンツ
tag block(可変長)
record header(6バイト)contents(lengthバイト)
tag(10ビット)3f(6ビット)length(4バイト)contents(lengthバイト)

バイナリ詳解

16進数43 02 ff ff ff ff 0a 05 00 00 00 69 6e 69 74 00 3f 03 3a 03 00 00 88 06 01 1e 00 00 …
2進数01000011 00000010 11111111 11111111 11111111 11111111 …

1〜2バイト(長さ:2バイト)

16進数説明備考
43 02tag(10ビット)+length(6ビット)リトルエンディアン形式

<解析方法>1. バイトスワップ

43 02
逆順02 43

2. 2進数に変換

16進数02 43
2進数00000010 01000011

3. 10ビット、6ビットに分割

taglength
0000001001000011

4. 『SWF file format specification』のp.271〜p.273をもとにtagの種類とlengthを算出する

2進数10進数結果
タグ種別00000010019SetBackgroundColor
length00001133

5. タグ形式2(※「length >= 3f」または特殊形式)の場合、続く4ビットを取得し、lengthを算出する6. 続くlengthバイトを取得し、『SWF file format specification』の各タグ処理の記載に沿って解析
※SetBackgroundColorの場合

RGBff ff ff

※setBackgroundColorは、必ずコンテンツの先頭に位置し、「長さ:5バイト」となる

setBackgroundColor(5バイト)
tag(1バイト)length(1バイト)RGB(3バイト)

あとはtagの種類毎に決められたフォーマットで解析していき、順々にコンテンツ(tag block)を解析していきます。
このswfのバイナリ構造を抑えておくと、例えば、Flash単体では通常取得することが困難な情報をバイナリレベルでswf内に埋め込んでから出力するアプリケーション開発したり、swfmillで出力されるxmlフォーマットもバイナリ構造と近いので理解しやすくなったりします。 皆さんもちょっとアブノーマルなバイナリの世界にいかがでしょうか?

tritonn(MYSQL+Senna)で全文検索。

0

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

MYSQLで高速な日本語全文探索を実現するため、tritonnでMYSQL+Sennaにする。
■tritonnとは?
MySQLから全文検索エンジンSennaを利用可能にするための改造を行うプロジェクトのこと。

■Sennaってなんなの?
Sennaは組み込み型の全文検索エンジン。

■Sennaの特徴
 ・組込み型
  MySQLに組み込んで使用する為、MySQLがアプリケーションからSennaを隠蔽します。
  開発者の方はSQL文を操作するだけで、全文検索を実行できます。
 ・高速
  キーワードがテキスト内のどの位置にあるかという位置情報を持った、
  完全転置インデックスを採用している為、フレーズ検索においても高速な検索が可能です。
 ・即時検索
  作成したインデックスに対して、インクリメンタルに文書の追加/変更/削除の操作を加えることができるため、
  文書に次々と変更が加えられる場合にも、一度作成したインデックスを作成し直す必要がありません。

■なんでSennaをいれる必要あるの?
1. MySQLには日本語環境で使用するための十分な全文検索機能ができない。
 ・MySQLのFULLTEXTインデックスのキーワード抽出を行うパーサが、
 「半角スペースで区切られているものをキーワードとして認識する」という実装になっているため。
   ・LIKE演算子による部分一致検索は可能だが、インデックスを一切使用することができなくなってしまうため、
  テーブルのフルスキャンが発生します。
2. MYSQLでは全文検索を行うための実装面での十分な高速化が行われていない。

■toritonn 導入について
toritonnのダウンロードについて
http://qwik.jp/tritonn/download.html
toritonnのユーザガイド
http://qwik.jp/tritonn/userguide.html

■tritonnの2ind機能(2インデックス同時使用機能)
MySQLではクエリを実行する際、1つのテーブルに対してFULLTEXTインデックスと他のインデックスを組み合わせて利用することができません。
従ってFULLTEXTインデックスを用いる用いた場合、以下のような問題が生じます。

1. limit指定で出力を制限しても応答が遅い問題
2. count(*)等で件数を取得するだけでも応答が遅い問題
3. 全文検索以外の条件で絞り込む処理が遅い問題
4. 全文検索以外の条件でソートする処理が遅い問題

上記の問題を解決するために、MySQLが全文検索用のインデックスと通常のインデックスの両方を併用できるようにするのが2ind機能です。

■2ind利用法
Tritonnパッチをあてると、MySQLのサーバ変数(SESSIONスコープ)に”senna_2ind”という変数が追加されます。

下記のどちらかの方法で、2ind機能の利用を動的にOn/Offすることができます。

・my.cnfあるいはmysqldの起動オプションで”–senna-2ind”を指定する。
・SETコマンドでONを設定してください。→ mysql> SET SESSION senna_2ind=ON;

以下、公式より2ind機能使用について、注意書きがあります。

注意:2ind機能はまだ安定度合いとしてはβ段階にあります。
   実際に利用する前に有効かどうか、利用環境で問題は無いかどうかをご確認の上、使用してください。

■参考文献

■Senna 組み込み型全文検索エンジン
http://qwik.jp/senna/FrontPageJ.html
■toritonnプロジェクト
http://qwik.jp/tritonn/
■toritonn ユーザガイド
http://qwik.jp/tritonn/userguide.html
■MySQLで全文検索 – FULLTEXTインデックスの基礎知識
http://www.tatamilab.jp/rnd/archives/000389.html

最近人気な記事