ホーム ブログ ページ 62

Ruby on Railsでカレンダーを表示する

0

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

こんにちは。

エンジニア1年目。

Ruby始めて3週間目くらいのyukiです。

今回は、Ruby on Railsでカレンダーを作りたいと思います。

簡単にカレンダーが作れる便利なプラグイン「Calendar Helper」

というものもあるみたいですが、今回は使わず自力で作って見ます。

htmlで使える用、tableで書き出します。

ソースはこんな感じ。

helper————————————————————————————-

def table(week_count, date)

case week_count

when 0

#日曜日(赤色書き出す)

cal = “<td><span style=\”color:#ff0000;”>”#{date}</span></td>”

when 6

#土曜日(青色書き出す)

cal = “<td><span style=\”color:#0000ff;”>”#{date}</span></td>”

else

#その他の曜日

cal = “<td>”#{date}</td>”

end

cal

end

def calender(date_org)

cal = “”

cal << “<table>”

#表示するカレンダーの年月日データ

d = Date.new(date_org.year, date_org.month, date_org.day)

#表示するカレンダーの1日の曜日

youbi = d.beginning_of_month.cwday

#表示するカレンダー1日より左にある余白の数

left = (youbi == 7)? 0 : youbi

#表示するカレンダーの最終日

end_date = d.end_of_month

#表示するカレンダーの最終日の曜日

end_youbi = d.end_of_month.cwday

#表示するカレンダーの最終日の右にある余白の数

right = 6 – end_youbi

#日にち

date = 1

cal << “<tr>”

#1日より左にある余白分<td></td>を書き出す

left.times do

cal << “<td></td>”

end

#最終日の日数分回す

end_date.day.times do

if youbi == 7 && date != 1

youbi = 0

cal << “</tr>”

cal << “<tr>”

elsif youbi ==7 && date ==1

youbi = 0

end

cal << table(youbi, date)

youbi += 1

date += 1

end

#最終日の右にある余白分<td></td>を書き出す

right.times do

cal << “<td></td>”

end

cal << “</tr>”

cal << “</table>”

end

——————————————————————————————-

コントローラ(hoge) ——————————————————————–

def index

if params[:date]

begin

@date = Date.parse(params[:date])

rescue

@date = Date.today

end

else

@date = Date.today

end

end

#paramsに年月日データが入っているなら、そのデータ[@date]に入れる。

#入っていなければ、今日の年月日データを[@date]入れる。

——————————————————————————————-

view ————————————————————————————-

#@date.last_monthで先月のデータ

<%= link_to(‘先月’,:action=>’index’,:date=> @date.last_month) -%>

#@date.next_monthで来月のデータ

<%= link_to(‘来月’,:action=>’index’,:date=> @date.next_month) -%>

#これでカレンダーを書き出す。

<%= calender(@date, {:controller => ‘hoge’, :action => ‘index’}) %>

——————————————————————————————-

うん。わかりにくいね。

ヘルパーで

<table>

<tr>

<td>~</td>

<td>~</td>

</tr>

</tr>

</table>

となるようカレンダーを書き出してあげて、それをview呼び出し表示しています。

コントローラは、リンクで先月や来月の年月日を返すために使っています。

utility_beltでwirble以上にirbを拡張する

0

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

はじめまして。

KBMJでプログラマとして働いているkuromatuと申します。

今回は、rubyのコーディングの際によく使われるinteractive ruby(irb)を拡張するgemプラグインのwirbleを基に、更なる拡張を加えるutility_beltというgemプラグインについて紹介します。

インストール方法

gem install utility_belt

実行すると、utility_belt-1.1.0(2009/02/27現在)がインストールされます。

使い方

ホームディレクトリに以下の記述の.irbrcを置きます。

require 'rubygems'
require 'utility_belt'

utility_beltをrequireした際にwirbleもrequireされているので、wirbleに関する記述は必要ありません。

そのままirbを起動すると、wirbleの拡張機能と、utility_beltにデフォルトで設定されている機能を利用できるようになります。

デフォルト設定で適用される設定

irbがカラフルになる

これは、utility_beltが依存しているwirbleというgemプラグインで実装されている機能ですが、色設定がutility_beltで再定義されています。

色設定セットはdarkとlightの2種類が定義されていて、デフォルトではdarkが選択されています。

色をlightに変更したい場合には、

$RUBYGEMS/gems/utility_belt-1.1.0/lib/utility_belt.rb

というファイルの22行目にある記述を次のように書き換えてください。

UtilityBelt::Themes.background(:dark) if defined? UtilityBelt::Themes
↓
UtilityBelt::Themes.background(:light) if defined? UtilityBelt::Themes

ハッシュの追加・削除

+ – でハッシュの追加・削除ができます。

>> hoge = {:fuga => "bar" }
=> {:fuga=>"bar"}
>> hoge += {:hige => "baz"}
=> {:fuga=>"bar", :hige=>"baz"}
>> hoge -= :fuga
=> {:hige=>"baz"}

わざわざmergeやrejectを使わなくて良いので楽ですね。

コマンドヒストリが参照できる

wirbleの機能として、コマンド履歴の保存と参照(Ctrl-p、Ctrl-n)が利用できます。

utility_beltでは、その機能に関連するメソッドを追加しています。

h(history)                     - 履歴一覧を呼び出せます。引数として表示履歴数を指定できます。
h!(history_do)                 - 最後に実行したコマンドを実行できます。
hvi(history_to_vi)             - 履歴一覧をviで開き、編集できます。
history_write(filepath, lines) - 履歴一覧を指定したファイルの指定行に書き込みます。

実行例:/home/hoge/fugaというファイルに、履歴の0~100行目を書き込む

history_write(/home/hoge/fuga, 0..100)

irb中にエディタが呼び出せる

vi、emacs、textmate(MacOSのエディタ)が呼び出せます。

vi    - viの実行
emacs - emacsの実行
mate  - textmate

emacsclientを使用している方への対応はまだのようですが、

TODOとしてコメントが残されているところを見ると、今後のアップデートで実装されるかもしれません。

irb_options

irbの自動インデント設定をONにします。

irbの出力結果の有無を切り替えられる

v(verbose)  - irbの出力結果を表示する
q(quiet)    - irbの出力結果を非表示にする

その他の機能

デフォルトの機能以外にも有用な機能が実装されているので、すべて利用できるようにしてみましょう。

利用方法

$RUBYGEMS/gems/utility_belt-1.1.0/lib/utility_belt.rb

というファイルの16行目にある記述を書き換えてください。

UtilityBelt.equip(:default) unless UtilityBelt.equipped?
↓
UtilityBelt.equip(:all) unless UtilityBelt.equipped?

Windows・Linuxの場合には、書き換え後にirbの実行でエラーが出る可能性があります。その時は、先に挙げた行を以下のように書き換えて下さい。

UtilityBelt.equip(:all, :except => ["clipboard", "pastie", "google"]) unless UtilityBelt.equipped?

デフォルト設定以外の機能

findメソッドを省略できる(Rails用)

Ruby On Rails(Rails)でruby script/consoleを使う際に有効な機能です。

>> memo(1)
memo(1)
  Memo Load (0.0ms)   SELECT * FROM "memos" WHERE ("memos"."id" = 1)
=> #<memo id: 1, body: "test", created_at: "2009-02-25 12:00:00", updated_at: 12:00:00">

memo(1)と書くと、Memo.find(1)と挙動となります。

memo(:all, :order => “id”)などのように、

オプションも普通に渡すことができます。

標準出力に実行されたSQLログが流せる(Rails用)

こちらもRailsでruby script/consoleを使う際に有効な機能です。

logコマンドを実行すると、その後に実行されたSQLログを標準出力として表示します。

普段から別画面でログファイルをtailしている人にはあまり必要がないかもしれません。

ActiveRecord::Baseのメソッドを使ったコードの検証には役立つと思います。

log
=> #<logger:0x35ae4e0 ...>
>> memo(1)
memo(1)
  Memo Load (0.0ms)   SELECT * FROM "memos" WHERE ("memos"."id" = 1)
=> #<memo id: 1, body: "test", created_at: "2009-02-25 12:00:00", updated_at: 12:00:00">

notメソッドが使える

論理値を反転させることができます。

>> true.not
=> false

各オブジェクトのメソッドや、ロード済みのクラスがgrepできる

>> grep_classes "True"
=> ["TrueClass", "RubyToken::TkTRUE"]
>> String.new.grep_methods "split"
=> ["split"]

Symbol#to_proc、String#to_procが使える

Symbol#to_procはruby1.9系で実装されていますね。

>> plus = :+.to_proc
=> #<proc:0x03fe6930 @...>
>> puts plus.call(1,2)
3
=> nil

String#to_procも出番は少なさそうですが、面白い機能だと思います。

(1..3).map(&'*2')
=> [2, 4, 6]

is_an?メソッドが使える

is_a?メソッドのaliasとして、is_an?メソッドを定義しています。

文法の厳密さを求める方には良いかもしれません。

>> [].is_an? Array
=> true

クリップボードを操作する(Mac OS X用)

クリップボードの内容にアクセスする機能が利用できます。

MacClipboard.read          - クリップボードから読み込み
MacClipboard.write("hoge") - クリップボードへ書き込み

その他には、Amazon S3のアップロードコマンドとGoogle検索コマンド(どちらもMac OS X用)があります。

筆者の環境(Windows+Linux)では利用できなかったため、今回の紹介には含めませんでしたが、興味のある方は以下のページ(英文)にて利用方法をご確認いただければ幸いです。

http://utilitybelt.rubyforge.org/usage.html

その他

難点

Railsの1.2系だと、irbを起動していない場合でも、常に.irbrcが読み込まれてしまうという不具合が存在するようです。

そのため、常にutility_beltの拡張が有効となってしまいます。

この影響で、一部のRails Aprricationでscript/consoleを実行した際に、utility_beltとアプリケーションの一部のメソッドが競合する可能性があることに注意してください。

過去のバージョンで作者の方も苦労されたようです。

http://gilesbowkett.blogspot.com/2007/12/utility-belt-vs-rails.html

個人的な意見

rubyメソッドの確認・Railsのscript/console上での検証作業や、ruby-debugと組み合わせたデバッグ作業に利用しています。

問題解決、今書いているロジックの検証にとても役立っています。

最後に

最後までお読み頂き、誠にありがとうございます。

irbをよく利用される方、面白そうと思われた方は、ぜひ一度utility_beltを使ってみてはいかがでしょうか。

参考URL

Utility Belt

http://utilitybelt.rubyforge.org/

Rubyforge Projectページ

http://rubyforge.org/projects/utilitybelt/

Googleアカウント・Google Analyticsアカウントの取得方法

0

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

What’s up!? アクセス解析チーム、アシスタントのミラノです。

今回はGoogle Analytics導入を決めたあなたが、次にしなくてはならないことについて説明します。

Very first things to do!


●Googleアカウントの取得

まだGoogleアカウントをお持ちでない方は、アカウントを取得する必要があります。

Googleの公式ページからアカウントを取得することができますので、下記のURLを参照してください。

URL:https://www.google.com/accounts/NewAccount?hl=ja

必要項目を入力し利用規約を読み、“同意して、アカウントを作成します”をクリックすれば、

アカウント取得完了です。




登録したメールアドレスに、Googleから“ようこそメール”が届きます。

メールのリンクをクリックし、アカウントの開設やメールアドレスの確認をします。

Googleアカウント取得が完了しましたら、次にGoogle Analyticsアカウント取得方法に移ります。

●Google Analyticsのアカウント取得方法

 Google Analyticsのアカウント取得ページ GoogleAnalyticsログインページはこちら

Google Analytics ログインページ画面から、“Google Analyticsにアクセス”をクリックし、

取得したGoogleアカウントで”Google Analyticsにログインすることができます。

“Google Analyticsに申し込む”ボタンをクリックします。


“Analytics:新しいアカウントの作成”で下記の項目について情報入力を行います。

・ウェブサイトのURL (解析するサイトのドメインを入力してください。)

・アカウント名 (解析する上で分かりやすい任意の名前を入力してください。)

・タイムゾーンの国または地域 (日本に在住の場合でしたら「日本」で登録してください。)

・タイムゾーン (デフォルトの状態)


必要項目詳細の拡大図になりますので参照してみてください。

“Analytics:新しいアカウントの作成” 連絡先の入力必要項目を入力し、“次へ”をクリックします。




“Analytics:新しいアカウントの作成” ユーザー契約に同意規約をよく読み、

“はい、上の利用規約に同意します”をチェック、“アカウントの新規作成”をクリックします。

アカウントの新規作成をクリックすると、トラッキングコードが表示されます。

このトラッキングコードを各ページのコンテンツに貼り付けていくわけですが、この続きは次回ご説明します。 See ya;)

ユーザビリティ・デザインとは?-検索エンジンとユーザビリティの関係-

0

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

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

 ユーザビリティに配慮したWebサイトとはどのようなサイトでしょうか。

 ・ナローバンドユーザ等に使い勝手の良いテキスト主体のサイト?

 ・Flashをはじめとする音声/動画などのリッチコンテンツは使っちゃいけない?

そんなことはありません。

テキスト主体では逆に分かりづらいことだってあるし、どんな最新技術であっても使い方しだいではユーザビリティを高める効果を発揮するのです。

 ユーザビリティの最終目的は、単純に使いやすくするためのものではなく、信頼感や安心感をもたせて顧客満足を上げるといったサービスの向上のお手伝い をすることです。

SEOがユーザをサイトに招くものにあることに対し、ユーザビリティは招かれたユーザをもてなすためにあるのです。

どんなページからでもユーザをもてなそう

 ユーザビリティを考えたとき、まずトップページから考えていませんか?

もちろんトップページはサイトの顔であり、多くのユーザは迷ったらトップページに戻るでしょうし、とても重要なページです。しかし、検索キーワードを入力した後、検索結果に出るページは必ずしもトップページではなくなりつつあります。今やサイトのすべてのページがサイトへの入口ページであるのです。

 ユーザがどのページを訪問しても、ユーザの望む情報にたどり着け、ユーザの目的を達成できる道筋が用意されているページにする。そのためには、何のサイトで、何ができて、自分が今どこにいるのか、目的のページに行くにはどうすればいいのかを、ユーザが把握しやすいようなデザインが求められています。

んなページからでもユーザをもてなすことが必要です!

SEOとユーザビリティの関係

 SEOができるのは検索結果の上位に特定のページを表示させることです。集客はサイトにとって大事なものであることはアクセス解析の活用教室にてお分かりいただけるかと思います。しかし、たとえSEO対策が成功してユーザがサイトに訪れたとしても、ユーザビリティが低ければせっかくのユーザも引き返してしまいます。ユーザビリティはページをわかりやすく見せ、他のコンテンツへの移動手段があり、なによりもWebサイトそのものに対する興味や信頼感を高めるために役立つのです。

 SEO対策だけに力を入れたところで、訪問者数のアップの効果は見込めるものの、最終目的である売上や登録者数アップに直接つながるものではありません。サイトに訪れたユーザが優良顧客(リピーター)になること、利用ユーザの満足度をアップさせることが最終目的までに必要な段階であることは言うまでもありません。サイトを成長させるためにはSEOとユーザビリティと合わせて考えることが大切なのです。

 また、好感のもてるサイトに成長すれば、ユーザが個人のブログに自発的にリンクが張ってくれたり、口コミサイトで紹介され、自然と被リンクが高まる可能性もあります。SEO対策効果が高いと考えられる被リンクの増加で、ユーザの支持と検索エンジンからの支持により、レベルの高いサイトになるかもしれません。

 ユーザ思いのサイトを作ることは、サイト作りにおいて最も基本にあることをお分かりいただけたでしょうか。

 次回、実際にどうすればユーザビリティが高まるのかを考えていきます。

 週末スノボに行ったら親指を突き指してしまいました。

固定しているので身動きとれず。

「無くして気づく○○の大切さ」という感じで、私生活にて親指の大切さに気づかされる毎日です。

親指カムバック。

ではまた。

————————————————-

その他アクセス解析担当の記事

・アクセス解析の必要性については、アクセス解析の重要性を参照してください。 

・アクセス解析用語については、アクセス解析でよく使うIT用語 その1 を参照してください。

・無料かつ高性能のアクセス解析ツール「Google Analytics」のご紹介記事はこちら。

・アクセス解析教室「優良顧客で売上増加!キーワード選びから考えるアクセス解析活用術 第1回」はこちら。

優良顧客で売上増加!キーワード選びから考えるアクセス解析活用術 第1回

0

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

こんにちは。KBMJアクセス解析チームの長谷です。

WEB担当者としては、自社サイトに興味を持ちそうなユーザーをたくさん呼び込み、その後のビジネスに繋げていきたいものです。ですが優良顧客を獲得するのは難しく、施策の費用対効果も上がらず、売上げアップはどんな時でも悩みの種であるといえます。そこで・・・

今回は優良顧客を効率よく集客するためのアクセス解析活用術について紹介していきます。(全4回)

■売上げが伸び悩むWEB担当者のよくある運用方法

 WEBサイトでの収益を考えていく上で必要なことは何でしょうか?コンテンツの更新やシステム面での改修、業務の管理、プロモーション活動など、運営・維持のためにやるべきことはたくさんあり、管理するのは非常に困難です。その中でもつい後回しになるのがアクセス解析対策になります。

 一見コンテンツも豊富でブランドイメージ、デザインもしっかりしているサイトのWEB担当者に話を聞いてみると、「実はアクセス解析対策は手つかずで活用できていない・・・」というケースがいくつもあり、そういう担当者ほど売上に対する悩みが深刻な状態にあります。忘れがちなアクセス解析対策ですが、収益を考える上で非常に重要なファクターになり、アクセス解析対策を行うことが必須条件となります。

忘れがちなアクセス解析対策

■費用対効果を考えたサイト集客の重要性とは 

 通常、通販サイトに訪れた訪問者の内、商品をカートに導入し実際に商品を購入するユーザーは、全体の訪問者の内、平均して0.5%~3.0%程度のコンバージョンレートになります。勿論、取り扱っているサービスの業態や季節で若干変動することはありますが、全体の訪問者の10%が商品を購入しているという様なデータは非常に稀です。(特殊なプロモーション活動で限定的にコンバージョンレートが上昇することはあります。)

 ここで重要なことは、現在のコンバージョンレートを増加させること(サイト送客)と、サイトに訪れる訪問者数を伸ばすこと(サイト集客)、どちらがサイトの売上を伸ばす上で費用対効果が高いのか、という点です。

アクセス解析のデータから考える集客と送客施策

 例えば、月間の訪問者数が10000人でCVR(コンバージョンレート)が1.0%の場合、商品購入者数は100人になります。 この場合、購入者数を伸ばすためにCVRをさらに伸ばす施策を打っても、現状の購入者数は3倍(購入者数300人)のレベルが限界です。

 一方、サイトに訪問するユーザーを増やしていく上での限界は程遠く、SEO対策や検索連動型広告といった施策により、伸ばす余地は数多く残されています(訪問者数が100000人であれば、購入者数は1000人というように制限がない)。

 勿論、サイト内の改善も売上げ・利益を伸ばす重要な方法の1つですが、効率のよい手順で素早く売上を伸ばすためにはサイト集客の強化が次に選ぶ施策となります。

■SEMの考えに基づいた優良顧客とは

 それでは、サイトの集客を行う上での注意点はどのようなことでしょうか。 まずは低コストでユーザーを引き込むという点で「検索エンジンからの誘導=SEO」に注目すべきですが、あくまでSEOは検索結果の順位を上げるものであり、必ずしも売り上げが伸びることには直結しません。そのため、SEOではなく、ターゲット層(優良顧客)を狙ったキーワード選びを次の施策のステップとして考えることにします。

 この検索エンジンの順位だけでなくその後のサイト成約率も考え、全体での最適化を行う考えをSEMと呼びます。(※「検索連動型広告+SEO=SEM」は間違った考えですので注意してください。)

優良顧客集客の意味

 ターゲットユーザーの検索キーワードが想定キーワードと違う場合や、想定キーワードだとしても、その来訪ユーザーが商品を購入していないというデータがよ く見られます。一方、あまり意識していなかったキーワードでの商品購入率が高いことも多く、アクセス解析をすることで意外なデータが集まります。

 例えば、集客力のあるキーワードでも、入り口ページでの直帰率が70%で、多くのユーザーを入り口ページで離脱させているといったケースがよくあります。そういった「悪いワード」ではなく、直帰率が30%でサイト内に送客し購入につなげている「良いワード」からの集客、すなわち優良顧客の獲得を増やす必要があります。

 これらデータから、「悪いワード」・「良いワード」のキーワード選定を行い、優良顧客を獲得するサイト構造に作り変えることが、集客における効率的な売上げ増加に繋がります。 単純にサイト集客数を増やすのではなく、「アクセス解析データから適切なキーワードを選び、利益につなげる」といった、SEMの考えが優良顧客獲得の鍵になるわけです。

 ■終わりに

 今回は優良顧客を獲得することが売上げ増加の近道であり、そのためにはアクセス解析とSEMの考えが必要であることを説明しましたが、第2回目の記事では「実際にアクセス解析を利用したキーワード選びと優良顧客獲得の分析手法」について詳しく説明していきます。

 Dorubyではアクセス解析の情報も随時更新していますので、もしマーケティング要素が足りない方はこちらで補給してください。それでは。

————————————————-

【第2回】優良顧客で売上げ増加!キーワード選びから考えるアクセス解析活用術

■無料かつ高性能のアクセス解析ツール「Google Analytics」について

GoogleAnalyticsトラッキングコードの設置方法

Googleアカウント・Google Analyticsアカウントの取得方法

Google Analyticsで複数ドメインのサイトを計測する方法

Google Analyticsで同じURLのページの遷移のデータを取得する方法

■その他アクセス解析担当の記事

・アクセス解析の必要性については、アクセス解析の重要性を参照してください。 

・アクセス解析用語については、アクセス解析でよく使うIT用語 その1 を参照してください。

・無料かつ高性能のアクセス解析ツール「Google Analytics」のご紹介記事はこちら。

カスタマーへの活用促進とヘルススコア

0

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

ザ・モデルという本にカスタマーサクセスの少し取り上げられていたので一部のまとめる

カスタマーサクセスとは

カスタマーサクセスとはお客様との契約から運用サポートまでの一連のプロセスの総称。
営業担当や導入担当、カスタマーサポート担当などの様々なやりとりに関わる。
特にカスタマーサクセス担当者は、導入直後の活用促進やヘルススコアのUPに注力し、
契約更新の安定化とアップセル/クロスセルを行う。

活用促進

サービス活用のロードマップを定義し、
社内状況やサービス規模から次に行う施作の提案を行うこと。

活用ロードマップ例

  • レベル1 キャンペーンを行い、データをレポート化すること。
  • レベル2 過去のレポートの結果から次に行うキャンペーンや施作の意思決定を行うこと。
  • レベル3 複数の部門や組織と連携し、複数年度に渡る目標達成の計画に使用すること。
  • レベル4 グローバル展開に使用すること。

ヘルススコア

お客様のサービス活用度や社内状況から、更新リスクの可能性を数値化すること。

ヘルススコアの要素の例

  • 契約金額
  • 年少
  • 成長企業
  • 活用拡大余地
  • 活用度
  • 問い合わせ回数
  • 担当者数
  • 導入時の目的の達成度
  • 事例紹介可否
  • セミナー参加回数 etc..

参考文献
THE MODEL(MarkeZine BOOKS) マーケティング・インサイドセールス・営業・カスタマーサクセスの共業プロセス  (著) 福田 康隆

アクセス解析の重要性 時代はAIDMAからAISCEASへ

0

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

はじめまして。

アクセス解析チーム、コンサルタント見習いの大山です。

ユーザビリティ・アクセシビリティに強いコンサルタントを目指しています。

どうぞよろしくお願いします。

■「【アクセス解析×ユーザビリティ】おこしやす!アクセス解析」ってどんなブログ?

本ブログでは、「アクセス解析」の話題を

「ユーザビリティ・アクセシビリティを高める」というテーマに視点を置き、

解析結果から問題点を洗い出し、とるべき施策・その効果までを書かせていただきます。

具体的には、

・そもそもアクセス解析とは?

・分析したけど、データの活かし方がわからない・・・

・Webサイトに対するユーザの行動心理って?

・ゴールまで到達しないのはなぜ?

・サイトの回遊を促したい・・・

などなど

自身の勉強も兼ねて、少しでも解析のお役に立てるものを掲載していきたいと思います。

まだまだ見習いですので、至らない部分は多々あると思いますが、

温かい目で見守っていただければ幸いです。。。

■そもそもアクセス解析はどうして必要なの?

Webサイトを運営するに当たって欠かせないアクセス解析。

いざ、アクセス解析ツールを導入したははいいものの、

ツールはデータの収集にすぎないので、次にとるべきアクションを教えてはくれません。

使い方によっては無意味なものになることだってあります。

そもそもアクセス解析はなぜ、近年において重要視されているのでしょうか?

アクセス解析が重要視される背景として、

消費者行動の移り変わりが理由の一つとして挙げられます。

・AIDMAの法則からAISCEASの法則へ

「AIDMA(アイドマ)の法則」をご存知ですか?

学校の授業やテレビ等で一度は耳にしたことがあるかと思います。

AIDMAとは・・・

1920年代にアメリカ合衆国の販売・広告の実務書の著作者であった

サミュエル・ローランド・ホールが著作中で示した広告宣伝に対する

消費者の心理のプロセスを示した略語です。

AIDMAの法則では、消費者がある商品を知って購入に至るまでに

次のような段階があるとされる。

  1. Attention (注意)
  2. Interest (関心)
  3. Desire (欲求)
  4. Memory (記憶)
  5. Action (行動)

(Wikipediaより)

ほとんどの消費者プロセスはAIDMAによって説明付くものだと思います。

しかし、近年ではインターネットを通して物を購入することが多くなり、

消費者の行動場所が現実からパソコンの中へと移り変わりつつあります。

商品の価格比較や口コミなど、実店舗ではなかなか得られない情報を

ボタン一つで簡単に得られることが、理由の一つとして挙げられます。

そんな新しい消費者行動モデルとして、

近年、「AISCEAS(アイシーズ)の法則」((有)アンヴィコミニケーションズの商標)が提唱されています。

AISCEASとは次のような消費者行動を指します。

  1. Attention (注意)
  2. Interest (関心)
  3. Search (検索)
  4. Compare (比較)
  5. Examination (検討)
  6. Action (行動)
  7. Share (共有)

行動は細分化され、ユーザがインターネットを使い慣れてきたことが伺えます。

・AISCEASの法則からわかること

近年の細分化された消費者行動によりわかること、

それはユーザの行動履歴がインターネット上に増え続けていることです。

つまり、自身のWebサイトへ訪れたユーザの行動履歴を知ることで

より戦略的なサイト作りに欠かせない情報を得られるのです。

・自身のサイトへどのようなキーワードでSearch (検索)したのか

・Compare (比較)やExamination (検討)の対象となるページ毎の

 閲覧時間やPV数、ゴールページまでにたどり着く確立、等

・ユーザが自身のサイト内でとるAction (行動)

を、アクセス解析では見ることができます。

アクセス解析結果には、Webサイトに対するニーズやユーザの動向を知るヒントが多く存在します。

Webサイトの最適化、最大化は多くのWeb担当者の目標ではないでしょうか。

近年、激化するインターネット時代において、

Webサイトの目標を達成のための施策を打つには、

アクセス解析はなくてはならないものであると考えられます。

今回は、 アクセス解析が必要な理由を簡単に書かせいていただきましたが、

次回以降、データの収集後に次にとるべきアクションの具体策などを掲載していこうと思います。

しかし、予定は未定ですのであしからず・・・

では、また。

postgresでorder byに複数のカラムを使うとdesc句を使った場合、indexを使用しない件

0

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

Postgresqlに限らず、インデックスを利用する/利用しないは、

DBを使ったシステムの速度を決める重要な要件だったりします。

今回は、業務中に突き当たった複数のカラムを指定していた場合

DESCやASCを使っていた場合、indexを利用しなかったpostgresの

対応方法について説明します。

なお、突き当たったバージョンは8.1.9でした。

対象はたいした事は無いsql文なのですが、こういったsql文です。

SELECT

entries.id,entries.title, entries.body, entries.entry_type, entries.created_at, entries.updated_at

FROM

entries

ORDER BY

entry_type,updated_at DESC

indexは、 entry_type, updated_atの複合indexを張っています。

ですがコレがindexを利用しない。

DESC句を外すと利用するんですけどね。

というわけで幾つか検索した所、以下の2つの情報を参照して解決しました。

http://itpro.nikkeibp.co.jp/article/COLUMN/20051117/224817/?P=5

http://d.hatena.ne.jp/poch-7003/20070913/1189691482

今回はtimestamp型ですので、postgresから

rails_db=# ¥df *cmp

とした結果の

Schema | Name | Result data type | Argument data types

————+———————-+——————+———————————————————-

pg_catalog | bitcmp | integer | bit, bit

pg_catalog | bpcharcmp | integer | character, character

pg_catalog | btabstimecmp | integer | abstime, abstime

pg_catalog | btarraycmp | integer | anyarray, anyarray

pg_catalog | btboolcmp | integer | boolean, boolean

pg_catalog | btbpchar_pattern_cmp | integer | character, character

pg_catalog | btcharcmp | integer | “char”, “char”

pg_catalog | btfloat48cmp | integer | real, double precision

pg_catalog | btfloat4cmp | integer | real, real

pg_catalog | btfloat84cmp | integer | double precision, real

pg_catalog | btfloat8cmp | integer | double precision, double precision

pg_catalog | btint24cmp | integer | smallint, integer

pg_catalog | btint28cmp | integer | smallint, bigint

pg_catalog | btint2cmp | integer | smallint, smallint

pg_catalog | btint42cmp | integer | integer, smallint

pg_catalog | btint48cmp | integer | integer, bigint

pg_catalog | btint4cmp | integer | integer, integer

pg_catalog | btint82cmp | integer | bigint, smallint

pg_catalog | btint84cmp | integer | bigint, integer

pg_catalog | btint8cmp | integer | bigint, bigint

pg_catalog | btname_pattern_cmp | integer | name, name

pg_catalog | btnamecmp | integer | name, name

pg_catalog | btoidcmp | integer | oid, oid

pg_catalog | btoidvectorcmp | integer | oidvector, oidvector

pg_catalog | btreltimecmp | integer | reltime, reltime

pg_catalog | bttext_pattern_cmp | integer | text, text

pg_catalog | bttextcmp | integer | text, text

pg_catalog | bttintervalcmp | integer | tinterval, tinterval

pg_catalog | byteacmp | integer | bytea, bytea

pg_catalog | cash_cmp | integer | money, money

pg_catalog | date_cmp | integer | date, date

pg_catalog | interval_cmp | integer | interval, interval

pg_catalog | macaddr_cmp | integer | macaddr, macaddr

pg_catalog | network_cmp | integer | inet, inet

pg_catalog | numeric_cmp | integer | numeric, numeric

pg_catalog | time_cmp | integer | time without time zone, time without time zone

pg_catalog | timestamp_cmp | integer | timestamp without time zone, timestamp without time zone

pg_catalog | timestamptz_cmp | integer | timestamp with time zone, timestamp with time zone

pg_catalog | timetz_cmp | integer | time with time zone, time with time zone

pg_catalog | varbitcmp | integer | bit varying, bit varying

(40 rows)

Argument data typesに、型が書いてあるので、使いたい型を選びます。

今回は、updated_atなので、timestamp型となり、timestamp_cmpを利用しました。

で、その逆の関数を作成します。

CREATE OR REPLACE FUNCTION timestamp_cmp_rev(TIMESTAMP, TIMESTAMP) RETURNS INTEGER AS $$ SELECT timestamp_cmp($2,$1);$$ LANGUAGE sql

その後、参考URLに書いてある通り作成しました。

CREATE OPERATOR CLASS timestamp_desc_ops FOR TYPE TIMESTAMP USING BTREE AS OPERATOR 1 >, OPERATOR 2 >=, OPERATOR 3 =, OPERATOR 4 <=, OPERATOR 5 <,FUNCTION 1 timestamp_cmp(timestamp, timestamp)

で、indexを作成しました。

CREATE INDEX index_entries_on_entry_type_and_updated_at ON

entries(entry_type, updated_at timestamp_desc_ops)

これで検索するとインデックスを使用してくれました。

もし「もっと良いやり方あるよ」と言う方いらっしゃいましたら是非教えて下さい。

なお、8.3からdescで指定できるようです...苦労はなんだったんだろう。

Google Analyticsとは?

0

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

はじめまして。

KBMJいちのビギナー、アクセス解析チーム-アシスタント、ミラノです。
どうぞよろしくお願いいたします。


本日は、皆さんすでにご存じかとは思いますが、Google Analyticsについて簡単に説明させていただきます。■Google Analyticsとは?

Googleが提供する高性能な無料アクセス解析ツールです。
Googleアカウントを取得し、Webサイトの各ページに「トラッキングコード」と呼ばれるJavaScriptのコードを挿入すれば、誰でも使用が可能です。
Urchinという企業向けの高機能なアクセス解析ツールをベースとしており、
Urchinのほぼすべての機能が無料で利用できる画期的なアクセス解析ツールです。

■Google Analyticsの特徴

・グラフを多用した見やすい画面
・豊富なデータ量
・操作が(慣れれば)簡単
・充実した分析機能(ページ遷移の分析・コンバージョン測定)
・広告の効果測定
・エクスポートが簡単

*Google Analytics サンプルイメージ
Google Analyticsの見やすいグラフ

*Google Analyticsのページはこちら
 http://www.google.com/analytics/ja-JP/

■Google Analyticsでわかること

・アクセスが集中するのは何曜日の何時頃なのか?
・訪問者は一見さんなのか、常連さんなのか?
・ユーザーがたどったサイト内経路は?
・ユーザーが最後に見たページはどれか?
・人気のあるページは?
・どんな検索キーワードでページにたどり着いたのか?

Google Analyticsで上記を把握し、より良いサイト環境作りのヒントを得ることが出来ます。

最終的には、
Increase conversions, and make more money on the web!(Google Analytics Helpより)
Google Analytics使って目標を達成して、WEBでもっと儲けよう!

今後はGoogle Analyticsの設定・活用方法などを掲載していきたいと思います。

高性能で無料でCOOLなGoogle Analyticsを一緒にCheck it outしていきましょう;)

IE6でposition:absoluteしたボックスが消えるバグ

0

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

こんにちは。maiです。
IE7の登場により徐々にシェアを減らしつつあるIE6ですが、
そうはいってもまだまだ健在です。
そしてそのバグもまだまだ健在です…。

今回はpositionの値をabsoluteにしたボックスが、
なぜかIE6で見えなくなってしまうバグについてその対処法をご紹介です。

このバグ「absolute position disappearing bug」というバグらしいのですが、
代表的なものに比べると、あまり知られていないことからわかるように、
ものすごく限定状況で起きるバグです。

今回私が遭遇したのはこのケース

1:position:absoluteしたdiv
2:float:leftしたdiv
3:float:rightしたdiv

positionの値がabsoluteで、なおかつすぐ次に続く要素がfloatしていること
が私の場合の発生原因だったようです。
この場合の回避方法は…

1:position:absoluteしたdiv
2:空っぽのdiv
3:float:leftしたdiv
4:float:rightしたdiv

これです。 スマートじゃないですね。わかってます。
でもどうやらこのバグを回避するにはスマートじゃないやり方しかないようです。
一番スマートなのは、このバグが発生しないようにデザインを組むこと…ですね。

なお、上記を含めたこのバグの発生条件と回避方法については
以下のページがわかりやすくまとまってます。
Win/IEで絶対配置(position: absolute)のボックスが消えるバグの検証ページjmblog.jp

ActionScript 3 でマウスを追いかけるアニメーションを作成する

0

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

こんにちは。

KBMJの佐藤です。

今回は ActionScript 3 を使って、マウスを追いかけるアニメーションを作成してみます。

Arrow.as

package{
    import flash.display.*;

    // 矢印クラス
    public class Arrow extends Sprite {
        public function Arrow(){
            init();
        }

        // 矢印を描画する
        public function init():void{
            // 枠のスタイルを設定
            graphics.lineStyle(2,0,1);
            // 塗りつぶしの色を設定
            graphics.beginFill(0xff0000);

            graphics.moveTo(-50,-25);
            graphics.lineTo(0,-25);
            graphics.lineTo(0,-50);
            graphics.lineTo(50,0);
            graphics.lineTo(0,50);
            graphics.lineTo(0,25);
            graphics.lineTo(-50,25);
            graphics.lineTo(-50,-25);
            graphics.endFill();
        }
    }
}

ChaseCursor.as

package{
    import flash.events.*;
    import flash.display.*;

    public class ChaseCursor extends Sprite {
        // スピード
        private var s:Number = 10;
        // 矢印オブジェクト
        private var a:Arrow;

        public function ChaseCursor(){
            init();
        }

        private function init():void{
            // フレーム更新イベントを設定
            addEventListener(Event.ENTER_FRAME, onEnterFrame);
            // 矢印オブジェクトを生成
            a = new Arrow();
            // 矢印オブジェクトと画面に追加
            addChild(a);
        }

        // フレームイベント
        private function onEnterFrame(e:Event):void{
            // 矢印の座標とマウスカーソルの座標との差分を算出
            var dx:Number = mouseX - a.x, dy:Number = mouseY - a.y;
            // 矢印の座標とマウスカーソルの座標との角度を算出
            var d:Number = Math.atan2(dy, dx);
            // 矢印オブジェクトの速度を算出
            var vx:Number = Math.cos(d) * s, vy:Number = Math.sin(d) * s;
            // 速度に基づいて矢印の位置を更新
            a.x += vx, a.y += vy;
            // 矢印オブジェクトの角度を設定
            a.rotation = d / Math.PI * 180.0;
        }
    }
}

ChaseCursor-app.xml

<?xml version="1.0" encoding="UTF-8"?>
<application xmlns="http://ns.adobe.com/air/application/1.5">
  <id>ChaseCursor</id>
  <version>0.1</version>
  <filename>ChaseCursor</filename>
  <initialwindow>
    <content>ChaseCursor.swf</content>
    <visible>true</visible>
    <systemchrome>standard</systemchrome>
    <transparent>false</transparent>
  </initialwindow>
</application>

コンパイルする

% amxmlc ChaseCursor.as

実行する

% adl ChaseCursor-app.xml

実行結果

赤い矢印がマウスカーソルを追いかけます。

http://farm4.static.flickr.com/3088/3200192579_6c1c90cd0d.jpg

さいごに

ActionScript 3 でアニメーションを作成する時は、位置と速度を変数に保持すると管理しやすくなります。

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

個人ブログ 拡張現実ライフ

RMagick を使って輝きのあるバナー画像を作成する

0

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

こんにちは。

KBMJの佐藤です。

今回は RMagick を使って、Web2.0 っぽいバナー画像を作成してみます。

ImageMagick とは

ImageMagick とは、画像ファイルを加工するための機能を提供してくれるプログラムです。

RMagick とは

RMagick とは、ImageMagick を ruby で扱えるようにしたものです。

ImageMagick のインストール(MacOSX で MacPorts を使ってインストールする場合)

% sudo port install ImageMagick

RMagick のインストール

% sudo gem install rmagick

コードを書く

require 'RMagick'
include Magick

WIDTH = 650
HEIGHT = 40

# 画像リストを作成
stripes = ImageList.new

# グラデーションを作成
top_grad = GradientFill.new(0, 0, WIDTH, 0, "#dddddd", "#888888")
# グラデーション画像を作成
image1 = Image.new(WIDTH, HEIGHT, top_grad)
# グラデーション画像を保存
image1.write('image1.png')
# グラデーション画像をリストに追加
stripes << image1


# グラデーションを作成
bottom_grad = GradientFill.new(0, 0, WIDTH, 0, "#757575", "#555555")
# グラデーション画像を作成
image2 = Image.new(WIDTH, HEIGHT, bottom_grad)
# グラデーション画像を保存
image2.write('image2.png')
# グラデーション画像をリストに追加
stripes << image2

# 画像を上下方向に連結
combined_grad = stripes.append(true)
# 連結した画像を保存
combined_grad.write('image3.png')

# 連結した画像を複製
image4 = combined_grad.clone
# 文字列を描画
gc = Draw.new
gc.font = '/Library/Fonts/ヒラギノ明朝 Pro W3.otf'
gc.fill = 'white'
gc.stroke = 'none'
gc.pointsize = 60
gc.annotate(image4, 0, 0, 10, 60, "Do Ruby!")
# 文字列を描画した画像を保存
image4.write('image4.png')

処理を実行する

% ruby web20.rb

実行結果 image1.png の内容

http://farm4.static.flickr.com/3297/3197802303_3f7d0f1bca.jpg

実行結果 image2.png の内容

http://farm4.static.flickr.com/3264/3197802345_c3a5d4e67c.jpg

実行結果 image3.png の内容

http://farm4.static.flickr.com/3406/3198648982_cd7b2975a6.jpg

実行結果 image4.png の内容

http://farm4.static.flickr.com/3268/3197802383_fbae00a2a9.jpg

さいごに

RMagick を使うと、Photoshop で作成したような画像も Ruby スクリプトを記述することによって生成することができます。

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

個人ブログ 拡張現実ライフ

RMagick を使って写真の特定色域を別の色で塗りつぶす

0

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

こんにちは。

KBMJの佐藤です。

今回は RMagick を使って、写真の特定色域を別の色で塗りつぶしてみます。

ImageMagick とは

ImageMagick とは、画像ファイルを加工するための機能を提供してくれるプログラムです。

RMagick とは

RMagick とは、ImageMagick を ruby で扱えるようにしたものです。

ImageMagick のインストール

% sudo port install ImageMagick

RMagick のインストール

% sudo gem install rmagick

コードを書く

require "rubygems"
require "RMagick"

include Magick

img = ImageList.new("kbmj-src.jpg")

compare = Magick::Pixel.new(142*256,72*256,2*256) # この色と近い領域を探す
replace = Magick::Pixel.new(255*256,0,0) # この色で塗りつぶす
for y in 0...img.rows
  for x in 0...img.columns
    src = img.pixel_color(x, y) # 元画像のピクセルを取得

    dr = src.red - compare.red # 赤要素の差
    dg = src.green - compare.green # 緑要素の差
    db = src.blue - compare.blue # 青要素の差

    # RGB空間上において2つの色が近ければ置換する
    img.pixel_color(x, y, replace) if dr*dr + dg*dg + db*db < (30*256*30*256)*3
  end
end

img.write("kbmj-out.jpg")

処理対象の画像を用意する

今回は弊社のパンフレットをiPhoneのカメラで撮影したものを用意しました。

http://farm4.static.flickr.com/3416/3195992288_466c34ab2e.jpg

処理を実行する

% ruby rmagick.rb

実行結果

オレンジの領域が赤で塗りつぶされています。

http://farm4.static.flickr.com/3106/3195176725_8ab26f966f.jpg

さいごに

RMagick を使うと Ruby で画像処理ロジックを記述できますので、irb で各種実験を行うなど、手軽に画像処理を行うことが可能です。

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

個人ブログ 拡張現実ライフ

case文の落とし穴

0

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

初めまして、エンジニア一年目のサンドリバー砂川です。

今回は開発中につまずいたcase文の挙動について解説をします。

こんな感じのcase文を考えてみます。

class Obj
  class Foo
  end

  class Bar
  end
end

obj = Obj::Foo

case obj
  when Obj::Foo
    puts "obj is Foo."
  when Obj::Bar
    puts "obj is Bar"
  else
    puts "obj is unknown...."
end

スクリプトを実行してみると

obj is unknown....

何故か比較がうまいこと出来てません。

実はcase文ではこんな風に比較が行われます。

case obj
  when Obj::Foo
end
↓
if Obj::Foo === obj

問題は演算子===で、こいつは呼び出したオブジェクトの型によって挙動が変わります。

例えばString#===なら==と同じ挙動ですが、Class#===の場合はkind_of?と同じ挙動になります。

kind_of?メソッドは、引数が呼び出したオブジェクトのインスタンスの場合にtrueを返します。

今回のコードではobj = Obj::Fooとクラスオブジェクト自体を代入していたのでfalseになってしまったんですね。

なので解決策として、objにインスタンスを代入する。

obj = Obj::Foo.new

あるいはto_sメソッドを利用して比較する。

case obj.to_s
  when Obj::Foo.to_s
    puts "obj is Foo."
  when Obj::Bar.to_s
    puts "obj is Bar"
  else
    puts "obj is unknown...."
end

obj is Foo.

で解決です。

Rails と MeCab で Twitter の発言内容を解析する

0

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

こんにちは。

KBMJの佐藤です。

今回は Rails と MeCab を使って Twitter の発言内容を解析してみます。

MeCab について

MeCab はオープンソースの形態素解析エンジンです。

Mechanize のインストール

% sudo gem install mechanize

Hpricot のインストール

% sudo gem install hpricot

Mecab のインストール

% sudo port install mecab
% sudo port install mecab-ipadic-utf8
% sudo port install rb-mecab

マイグレーションファイルを書く

class CreateStatuses < ActiveRecord::Migration
  def self.up
    create_table :statuses do |t|
      t.column :text, :string
      t.column :screen_name, :string
      t.timestamps
    end
  end

  def self.down
    drop_table :statuses
  end
end

コードを書く

require "rexml/document"
require "open-uri"
require 'MeCab'

module MeCab
  class Node
    def category
      return self.feature.split(/,/)[0]
    end

    def each(&b)
      b[self]
      self.next.each(&b) if self.next
    end
  end
end

class Status < ActiveRecord::Base
  def self.get_xml_page(user, page)
    xml = open("http://twitter.com/statuses/user_timeline/#{user}.xml?page=#{page}").read # XMLを取ってくる
    doc = REXML::Document.new xml
    doc.elements.each('/statuses/status') do |s|
      text = s.elements["text"].text # 発言内容を取得
      screen_name = s.elements['user/screen_name'].text
      p "#{screen_name} #{text}"
      status = Status.new(:text => text, :screen_name => screen_name)
      if status.save # DBに挿入
        p "SUCCESS"
      else
        p "FAILED"
      end
    end
  end

  def self.parse
    m = MeCab::Tagger.new
    h={}
    Status.find(:all).each do |s|
      nodes = m.parseToNode(s.text)
      nodes.each do |node|
        next unless node.category == '名詞' # 名詞のみ解析対象とする
        if h[node.surface]
          h[node.surface] += 1 # 出現回数をカウント
        else
          h[node.surface] = 1
        end
      end
    end
    # 結果出力
    h.to_a.sort{ |a,b|
      (b[1] <=> a[1]) * 2 + (a[0] <=> b[0])
    }.each{ |e| puts "#{e[0]} #{e[1]}"}
  end

  def self.get_xml
    Status.delete_all
    1.upto(10) do |page|
      get_xml_page('akio0911', page)
    end
    parse
  end
end

処理を実行する

ruby script/runner 'Status.get_xml'

実行結果

Twitterにおいて最近よく使っているキーワードを見ることができます。

インストール 12
:// 11
http 11
com 10
ー 10
こと 9
1 7
emacs 7
メガネ 7
人 7
会 7
会社 7
勉強 7
忘年会 7
時 7
5 6
Twitter 6
tinyurl 6
さ 6
よう 6
電源 6
0911 5
2 5
akio 5
インターネット 5
ブログ 5

さいごに

Rails と MeCab を組み合わせると、ネットから取得してきた各種情報を DB に格納したり、それに対して解析を行ったりすることが手軽にできます。

次回以降、Rails と MeCab を連携することによる応用例を書いていきたいと思います。

お楽しみに!

個人ブログ 拡張現実ライフ

Mechanize, Hpricot, MeCab でブログの頻出単語を調べる

0

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

こんにちは。

KBMJの佐藤です。

今回は Mechanize, Hpricot, MeCab でブログの頻出単語を調べてみます。

http://farm4.static.flickr.com/3212/3101925914_6580eb0fc8.jpg

Mechanize について

Mechanize を使うと、ウェブサイトへのアクセスを自動化(リンクをたどる、フォームを submit する、リダイレクトをたどる、など)することができます。

Hpricot について

Hpricot は Ruby 用の HTML パーサです。HTML の解析や書き換えに威力を発揮するライブラリです。

MeCab について

MeCab はオープンソースの形態素解析エンジンです。

Mechanize のインストール

% sudo gem install mechanize

Hpricot のインストール

% sudo gem install hpricot

Mecab のインストール

% sudo port install mecab
% sudo port install mecab-ipadic-utf8
% sudo port install rb-mecab

コードを書く

require 'MeCab'
require 'rss'
require 'mechanize'
require 'kconv'
require 'hpricot'
require 'open-uri'

module MeCab
  class Node
    def category
      return self.feature.split(/,/)[0]
    end

    def each(&b)
      b[self]
      self.next.each(&b) if self.next
    end
  end
end

agent = WWW::Mechanize.new
page = agent.get('http://d.hatena.ne.jp/akio0911/archive') # ページを開く
m = MeCab::Tagger.new
h={}

# エントリへのリンクを抽出
page.links_with(:href => /\/\d{8}\/p\d/).each{ |l| 
  puts l.href
  doc = Hpricot(open(l.href))
  text = doc.search("div.section").text.toutf8.gsub(/\t/, "").gsub(/\n/,"") # 文章部分を取得

  nodes = m.parseToNode(text)
  nodes.each do |node|
    next unless node.category == '名詞' # 名詞以外はカウント対象としない
    next if node.surface =~ /^\d+$/ # 数字も対象としない
    if h[node.surface]
      h[node.surface] += 1
    else
      h[node.surface] = 1
    end
  end
}

# カウント結果を出力
h.to_a.sort{ |a,b|
  (b[1] <=> a[1]) * 2 + (a[0] <=> b[0])
}.each{ |e| puts "#{e[0]} #{e[1]}"}

さいごに

Mechanize, Hpricot, MeCab を使うと、ページ内容を解析するプログラムを簡単に書くことが出来ます。みなさんも是非試してみてはいかがでしょうか。

個人ブログ 拡張現実ライフ

CappuccinoとObjective-JでHello Worldを書いてみる

0

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

こんにちは。

KBMJの佐藤です。

今回はCappuccinoとObjective-JでHello Worldを書いてみます

Cappuccino と Objective-J を使うと iPhone や Mac 向けのアプリ開発と同じ感覚で Web アプリケーションを開発することができます。

http://farm4.static.flickr.com/3151/3064248883_ffdfecd321.jpg

CappuccinoとObjective-Jについて

Cappuccino は、デスクトップソフトウェアのユーザーがうちとけやすい見た目のアプリケーションを開発するためのオープンソースフレームワークです。

Cappuccino は JavaScript などの標準的なWeb技術の上に構築されています。そしてアップルのCocoaフレームワークに非常に近い実装がなされています。

Cappuccino でプログラムしたとき、HTML, CSS, DOM などの伝統的なWeb技術を意識する必要がありません。

複雑なクロスブラウザアプリケーションを構築する際の不愉快さはありません。

Cappuccino は Objective-C をモデルとした新しいプログラミング言語である Objective-J で実装されています。Objective-J は JavaScript の上に構築されています。Objective-J で書かれたプログラムはクライアント上で翻訳されるので、プラグインなどは必要ありません。Objective-J のライセンスは LGPL となっています。

ソースコード

Hello World のソースコードを以下に示します。

import <foundation /cpobject.j>

// アプリケーションコントローラークラスである AppController を宣言します
@implementation AppController : CPObject
{
  // ラベルオブジェクトをメンバ変数として持たせます
  CPTextField label;
}

// アプリケーションの起動時に呼ばれる関数です。ここに各種初期化処理などを記述します
- (void)applicationDidFinishLaunching:(CPNotification)aNotification
{
    // ウィンドウオブジェクトを生成し、そのビューを管理する contentView を取り出します
    var theWindow = [[CPWindow alloc] initWithContentRect:CGRectMakeZero() styleMask:CPBorderlessBridgeWindowMask],
        contentView = [theWindow contentView];

    // ラベルオブジェクトを生成します
    label = [[CPTextField alloc] initWithFrame:CGRectMakeZero()];
    // ボタンオブジェクトを生成します
    var button = [[CPButton alloc] initWithFrame: CGRectMake(
			     CGRectGetWidth([contentView bounds]) / 2.0 - 40,
			     CGRectGetMaxY([label frame]) + 100,
		    80, 18
		 )];
    // ボタンオブジェクトの自動リサイズに関する設定を行います
    [button setAutoresizingMask:CPViewMinXMargin |
	                        CPViewMaxXMargin |
	                        CPViewMinYMargin |
                        	CPViewMaxYMargin];

    // ボタンのタイトルを設定します
    [button setTitle:"swap"];

    // ボタンが押された際に呼ばれる処理を登録します
    [button setTarget:self];
    [button setAction:@selector(swap:)];

    // ビューにボタンを追加します。
    [contentView addSubview:button];

    // ラベルのキャプションとフォントを設定します
    [label setStringValue:@"Hello World!"];
    [label setFont:[CPFont boldSystemFontOfSize:24.0]];
    
    [label sizeToFit];
    
    // ラベルの自動リサイズ設定を行います
    [label setAutoresizingMask:CPViewMinXMargin | CPViewMaxXMargin | CPViewMinYMargin | CPViewMaxYMargin];
    // ラベルの位置を設定します
    [label setFrameOrigin:CGPointMake[1]CGRectGetWidth([contentView bounds]) - CGRectGetWidth([label frame] / 2.0, (CGRectGetHeight([contentView bounds]) - CGRectGetHeight([label frame])) / 2.0)];
    
    // ビューにラベルを追加します
    [contentView addSubview:label];
    
    [theWindow orderFront:self];

    // ラベルのキャプションを中央に設定します
    [label setAlignment:CPCenterTextAlignment];
    
    // メニューバーを表示します
    [CPMenu setMenuBarVisible:YES];
}

// ボタンが押された際に呼ばれる処理
-(void)swap:(id)sender
{
  // ラベルのキャプションを変更します
  if([label stringValue] == "Hello World!")
    [label setStringValue:"Goodbye!"];
  else
    [label setStringValue:"Hello World!"];
}

@end

さいごに

Cappuccino を使うと Mac や iPhone のソフト開発と同じ感覚で Web アプリケーションを開発することが可能です。

次回以降、Objective-J, Objective-C, Cocoa, Cocoa Touch などに関する記事を掲載していきたいと思います。

お楽しみに!

個人ブログ 拡張現実ライフ

References

References
1 CGRectGetWidth([contentView bounds]) - CGRectGetWidth([label frame]

[Rails]特定ビューだけで特定のヘルパーの関数を使いたい

0

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

 こんにちは。

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

 基本的にビューで使いたい関数を持っているヘルパーはコントローラー側で読み込んであげる必要があります。ただ、あるヘルパーの関数をあるビューで使いたいというニッチな要求に対しては不便な場合があります。今回は、そのニッチな要求を簡単に満たしちゃう方法を紹介したいと思います。

 方法はとても簡単で、呼び出したい関数を持っているヘルパー(今回はHogeHelper)を読み込むコードをビューに埋め込んであげればいいだけです。

 実際は以下のようになります。

<% self.class.send(:include, HogeHelper) -%>

 こうすれば、これを記述した以降の部分で読み込んだヘルパーの関数が呼び出せるようになります。

 簡単ですね。 ヘルパー内の関数は多くなりすぎですが、このテクニックを使えば、スッキリとできるかもしれません。どこまでニーズがあるかはわかりませんが、参考にしていただくと幸いです。

Let’s  find your niche!

button_to ボタンでリンク rails

0

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

こんにちはカツオです。

今日は、初心に戻ってハイパーリンクではなく、ボタンでリンクする方法を紹介します。 

 link_toやurl_forを使えば、リンクを作成することはできると思いますが

ハイパーリンクではなくボタン形式でリンクを作成する方法です。

ボタンでリンクを作成する場合には

○button_to

を使用します。

 使い方は、link_toと同じです。

button_to(“更新”, :action =>’update’)

#=><form method “post” action=”/top/update” class=”button-to”>

       <div><input type=”submit” value”更新” /></div></form>

このbutton_toポイントとしては、

・formタグで作成されるので、既にformタグの中にいる場合は使えない

・当然ボタンによるリンクになる

・postメソッドが用いられるので、データの更新がある場合などのリンクに適している。

ということがあげられます。

今日は初歩的な内容でしたね。

でわでわまた。

Objective-C + Cocoaにおけるメモリ管理について

0

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

こんにちは。

KBMJの佐藤です。

今回はObjective-CでCocoaアプリケーションを作る際における

メモリ管理について解説します。

http://farm4.static.flickr.com/3280/2987292642_b6d5e38a07.jpg

MyObject.h

#import <cocoa /cocoa.h>

// (1)
@interface MyObject : NSObject {
}

// (2)
-(void)dealloc;

@end

MyObject.m

#import "MyObject.h"

@implementation MyObject

// (3)
-(void)dealloc
{
	NSLog(@"MyObject dealloc");
	[super dealloc];
}

@end

Memory.m

#import <foundation /foundation.h>
#import "MyObject.h"

int main (int argc, const char * argv[]) {
    // (4)
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    // (5)	
    MyObject* object1;
    object1 = [[MyObject alloc] init];
    [object1 release];

    // (6)
    MyObject* object2;
    object2 = [[[MyObject alloc] init] autorelease];

    // (7)	
    NSString* string0;
    string0 = [NSString stringWithCString:"new string" encoding:NSASCIIStringEncoding];

    // (8)	
    NSString* string1;
    string1 = [[[NSString alloc] initWithCString:"new string" encoding:NSASCIIStringEncoding] autorelease];

    // (9)	
    NSLog(@"before pool release");
    [pool release];
    NSLog(@"after pool release");

    return 0;
}

コード解説(1)

@interface MyObject : NSObject {
}

MyObjectクラスを宣言します。

NSObjectを親クラスとします。

コード解説(2)

-(void)dealloc;

deallocメソッドを宣言します。

このメソッドはインスタンス解放時に呼び出されます。

コード解説(3)

-(void)dealloc
{
	NSLog(@"MyObject dealloc");
	[super dealloc];
}

deallocメソッドを実装します。

NSLog関数にてメッセージを出力し、

親クラスであるNSObjectのdeallocを呼び出します。

コード解説(4)

    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

NSAutoreleasePoolのオブジェクトを作成する。

この後に自動開放指定されたオブジェクトについては、

[pool drain] の時点で解放されます。

コード解説(5)

    MyObject* object1;
    object1 = [[MyObject alloc] init];
    [object1 release];

MyObjectオブジェクトのためのメモリを確保、

オブジェクトを初期化し、

解放します。

コード解説(6)

    MyObject* object2;
    object2 = [[[MyObject alloc] init] autorelease];

MyObjectオブジェクトのためのメモリを確保、

オブジェクトを初期化し、

自動開放指定します。

このオブジェクトは [pool drain] された時点で解放されます。

コード解説(7)

    NSString* string0;
    string0 = [NSString stringWithCString:"new string" encoding:NSASCIIStringEncoding];

NSStringオブジェクトのためのメモリを確保、

オブジェクトを初期化し、

自動開放指定します。

コード解説(8)

    NSString* string1;
    string1 = [[[NSString alloc] initWithCString:"new string" encoding:NSASCIIStringEncoding] autorelease];

NSStringオブジェクトのためのメモリを確保、

オブジェクトを初期化し、

自動開放指定します。

stringWithCString を用いる場合に比べてコードが冗長になりますので、

こういった場合は stringWithCString を呼び出した方が良いでしょう。

コード解説(9)

    NSLog(@"before pool release");
    [pool release];
    NSLog(@"after pool release");

NSAutoreleasePoolオブジェクトを解放する。

自動開放指定されたオブジェクトはこのタイミングでまとめて解放されます。

実行ログ

2008-10-30 12:15:01.597 Memory[6684:10b] MyObject dealloc
2008-10-30 12:15:01.598 Memory[6684:10b] before pool release
2008-10-30 12:15:01.599 Memory[6684:10b] MyObject dealloc
2008-10-30 12:15:01.600 Memory[6684:10b] after pool release

自動開放指定したオブジェクトが

[pool release] したタイミングで、

まとめて解放されていることが分かります。

さいごに

Objective-C + Cocoa のような参照カウント方式のメモリ管理では

オブジェクトの生存期間を意識しながらコードを書いていく必要があるかと思います。

次回以降、Objective-C や Cocoa に関する記事を掲載していきたいと思います。

お楽しみに!

個人ブログ 拡張現実ライフ

FireFoxでWebページの色を抜き出すアドオン

0

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

Web制作ではよくお世話になるブラウザFireFox。

その中で、お手軽にWebページに使われる色を抜き出すアドオンを

ご紹介します。 

アドオン名はcolorzilla。

このアドオンを入れることによって簡単にWebページで気になる色を

取得することができます。

使い方は、まずはアドオンを入手しインストール。

インストールが済めば、ブラウザ上の左下にスポイトマークが表示されるはずです。

このスポイトマークをクリックすることで、即機能が使えます。

マウスカーソルが十字になったら、後は抜き出したい色に重ねてクリックしてください。

RGBでの数値や座標、HTMLタグがステータスバーに表示されるはずです。 

この状態で、スポイトを右クリックするとカラーコードをコピーしてくれる機能も

うれしいところ。

右クリックでさらに細かい機能も使うことができます。

Firebugでもソースコードからカラーコードを調べることはできますが、

colorzillaだと画像からも直接カラーコードを抜き出せるところが違います。

画像と同じ色で背景色を指定したい、などといった場合に重宝しますね。

最近人気な記事