2012-11-29
2012-11-03
rubyでicalendar形式のファイルを読み込んでgoogleカレンダーに登録する
スケジュールソフトで他のソフトと連携できるようにするためにicalendar形式でデータを出力できるものがあります。
そのファイルをgoogleカレンダーで取り込むことができます。
以下に具体的に説明があります。
http://support.google.com/calendar/bin/answer.py?hl=ja&answer=37118
これと似たようなことをrubyでやる方法です。
条件としては、以下のような感じです。
・icalendarのデータを取り込むための他のデータが入っていない専用のgoogleカレンダーが一つ必要
・取り込む際に、一定期間の登録済みデータを削除する
・単純な繰り返し予定は登録可能
sample.icsファイルを読み込む場合は以下のような感じです。
gclapi
icalendar
vpim
simple-rss
が必要ですのでgemでインストールしてください。
GACCOUNT
GPASSWD
GCALNAME
を利用する環境にあわせて変更すれば利用できるはず。
以下のサイトを参考にさせていただきました。
https://github.com/wtnabe/ical2gcal
http://www.func09.com/wordpress/archives/168
そのファイルをgoogleカレンダーで取り込むことができます。
以下に具体的に説明があります。
http://support.google.com/calendar/bin/answer.py?hl=ja&answer=37118
これと似たようなことをrubyでやる方法です。
条件としては、以下のような感じです。
・icalendarのデータを取り込むための他のデータが入っていない専用のgoogleカレンダーが一つ必要
・取り込む際に、一定期間の登録済みデータを削除する
・単純な繰り返し予定は登録可能
sample.icsファイルを読み込む場合は以下のような感じです。
gclapi
icalendar
vpim
simple-rss
が必要ですのでgemでインストールしてください。
# -*- encoding: utf-8 -*-
require 'rubygems'
require 'date'
require 'gcalapi'
require 'icalendar'
require 'simple-rss'
require 'vpim/icalendar'
GACCOUNT = "googleアカウント"
GPASSWD = "googleアカウントのパスワード"
GCALNAME = "データ登録するgoogleカレンダーの名前"
DEL_TERM = 31 #登録済みデータを削除する期間
service = GoogleCalendar::Service.new(GACCOUNT,GPASSWD)
g_cals = SimpleRSS.parse( service.calendars.body ).entries
gcal_link = nil
g_cals.each do |c|
if c[:title].encode('utf-8','utf-8') == GCALNAME
gcal_link = c[:link]
break
end
end
gcal = GoogleCalendar::Calendar::new(service, gcal_link)
today = Date.today
endday = Date.today + DEL_TERM
conditions = {}
conditions['start-min'] = today
conditions['start-max'] = endday
gcal.events(conditions).each do |e|
e.destroy!
end
f = open("sample.ics")
ics = f.read
f.close
ical = Icalendar::parse(ics,true)
ical.events.each do |ie|
if ie.recurrence_rules?
fs = Time.parse(ie.dtstart.to_s.sub(/\+.*/, ''))
fe = Time.parse(ie.dtend.to_s.sub(/\+.*/, ''))
diff = fe -fs
Vpim::Rrule.new(fs,ie.recurrence_rules.first.orig_value).each(endday.to_time) do |time|
ge = gcal.create_event
ge.title = ie.summary
ge.st = time
ge.en = time + diff
ge.allday = ge.st.hour == 0 and ge.st.min == 0 and ge.en.hour == 0 and ge.en.min == 0
ge.save!
end
else
ge = gcal.create_event
ge.title = ie.summary.encode("utf-8")
ge.st = Time.parse(ie.dtstart.to_s.sub(/\+.*/, ''))
ge.en = Time.parse(ie.dtend.to_s.sub(/\+.*/, ''))
ge.allday = ge.st.hour == 0 and ge.st.min == 0 and ge.en.hour == 0 and ge.en.min == 0
ge.save!
end
end
GACCOUNT
GPASSWD
GCALNAME
を利用する環境にあわせて変更すれば利用できるはず。
以下のサイトを参考にさせていただきました。
https://github.com/wtnabe/ical2gcal
http://www.func09.com/wordpress/archives/168
ラベル:
Ruby
2012-10-28
タカラトミーの「夜空におえかき」がキニナル
タカラトミーの「夜空におえかき」というのがキニナルのです。
ものとしては、いろんな色が出るライトのようです。
これと専用の無料のiphoneアプリを使って簡単におしゃれな光で描いた絵の写真が撮れてしまうようです。
専用のアプリでなくても長時間露出できれば絵はできるとは思いますが、アニメーションなども簡単にできるようです。
詳しくは、以下を。
http://www.takaratomy-arts.co.jp/specials/oekaki/
ぜひandoridのアプリも出してもらいもんです。
2012-10-22
twitterを利用した簡易読書録を作る方法
twitterを利用して私がやっている簡易な読書録の作り方をまとめてみます。
簡単に言ってしまえば、ツィートに「#読んだ」とハッシュタグをつけるだけです。
さらに自分のつけた「#読んだ」のツィートを見れるようにするために
を利用します。
これで以下のような感じの簡易な読書録ができあがります。
私の場合は、書名とamazonへのリンク(詳しい情報はamazonさんにおまかせ)を入れています。
この書名とamazonへのリンクを入れるために私が作ったandroidアプリ
を利用しています。
BARCOTTERは、バーコード情報をカメラで読み取るか入力することでamazonで検索を行い書名などの情報を取得してtwitterなどに取得した情報を渡すアプリです。
詳しくは、以下をご覧ください。
実際の読書録を作る際の流れは以下のような感じです。
①BARCOTTERを立ち上げます。
②カメラがついていれば読取を押してカメラを起動してバーコードを読み取ります。バーコードが読み取りにくいときはフラッシュをつけたりすると読み込みやすくなるようです。
カメラがない場合は、「BARCODE or ISBN」の欄に直接バーコードを入力します。
また、「後にテキストを追加の部分」に「#読んだ」と入れておきます。
③共有を押します。(設定で読み取り後自動で共有を実行できます。)共有すると共有するアプリを選択できるのでtiwtterを選択して、適当にメモを追加してツィートします。
カメラがない場合は、「BARCODE or ISBN」の欄に直接バーコードを入力します。
また、「後にテキストを追加の部分」に「#読んだ」と入れておきます。
③共有を押します。(設定で読み取り後自動で共有を実行できます。)共有すると共有するアプリを選択できるのでtiwtterを選択して、適当にメモを追加してツィートします。
これでOKです。
ちゃんとした読書録を作りたい場合は、以下にいろいろな読書記録のサイトが紹介されているので参考になります。
http://matome.naver.jp/odai/2129578537652781601
ちなみにBARCOTTERで判別できるのは、本だけではなくCDやDVDなども判別できます。
なので読書録だけでなく音楽録や映画録などに応用もできたりもしますよ。
ちゃんとした読書録を作りたい場合は、以下にいろいろな読書記録のサイトが紹介されているので参考になります。
http://matome.naver.jp/odai/2129578537652781601
ちなみにBARCOTTERで判別できるのは、本だけではなくCDやDVDなども判別できます。
なので読書録だけでなく音楽録や映画録などに応用もできたりもしますよ。
2012-10-13
railsでsend_fileするときに日本語ファイル名を指定するとchromeでたまに文字化けする
railsでファイルダウンロードさせるためにsend_fileを使うときに日本語ファイル名でダウンロードさせるとき、私は以下のようにしていました。
cp932でencodeしているのは、utf-8でおくるとIEが文字化けしていたので、そうしています。
普段は、chromeでも特に問題がありません。
しかし、たまに文字化けが出ていました。
上記のファイル名の場合は「予」の部分で文字化けがおきてしまいます。
これの原因は、たぶん以下のサイトで書いてあることが影響している気配です。
https://sites.google.com/site/fudist/Home/grep/damemoji
で対策として以下のようにするようにしました。
これで問題なくIEでもchromeでも文字化けしないようになりました。
以下が参考になったサイトです。
filename = "今後の予定.xls".encode("cp932")
send_file(f, :filename => filename)
cp932でencodeしているのは、utf-8でおくるとIEが文字化けしていたので、そうしています。
普段は、chromeでも特に問題がありません。
しかし、たまに文字化けが出ていました。
上記のファイル名の場合は「予」の部分で文字化けがおきてしまいます。
これの原因は、たぶん以下のサイトで書いてあることが影響している気配です。
https://sites.google.com/site/fudist/Home/grep/damemoji
で対策として以下のようにするようにしました。
filename = ERB::Util.url_encode("今後の予定.xls")
send_file(f, :filename => filename)
これで問題なくIEでもchromeでも文字化けしないようになりました。
以下が参考になったサイトです。
http://kiita-it-blog.seesaa.net/article/253744186.html
ラベル:
Ruby,
Ruby on Rails
2012-10-02
お好きなYoutubeムービーをAndroidのホームにショートカットとして登録する
お好きなYoutubeムービーをAndroidのホーム画面にショートカットとして登録していつでもワンタッチで見れるようにする方法です。
まずYoutubeアプリで登録したいムービーを検索します。
ちなみにロングブレスダイエットの方法を検索してみました。
そして目的のムービーを表示します。
Youtubeで見るように選択します。常にこの操作で私用するにチェックを入れてもよいです。
目的のムービーが表示されることを確認します。
そして、またブラウザに戻ります。ブラウザ上部を触ってURL入力バーを出してタブボタンを押します。
設定を表示して、履歴を表示させます。
今日の履歴を表示して、Youtubeムービーを長押しします。
ブックマークに保存を選択します。
ラベルを好きなものして、追加先を「ホーム画面」にします。
するとホーム画面にショートカットが作成されています。これでワンタッチでムービー見れるようになったわけです。アイコンがちょっと気に入らないのですが、よしとしましょう。
まずYoutubeアプリで登録したいムービーを検索します。
ちなみにロングブレスダイエットの方法を検索してみました。
そして目的のムービーを表示します。
設定ボタンを表示して、URLをコピーします。
ここで一度Youtubeアプリを終了して、ブラウザを立ち上げてコピーしたURLを貼り付けます。
目的のムービーが表示されることを確認します。
そして、またブラウザに戻ります。ブラウザ上部を触ってURL入力バーを出してタブボタンを押します。
設定を表示して、履歴を表示させます。
今日の履歴を表示して、Youtubeムービーを長押しします。
ブックマークに保存を選択します。
ラベルを好きなものして、追加先を「ホーム画面」にします。
するとホーム画面にショートカットが作成されています。これでワンタッチでムービー見れるようになったわけです。アイコンがちょっと気に入らないのですが、よしとしましょう。
ラベル:
Android
2012-10-01
ActiveScaffoldでpaper_trailの履歴情報を表示する
ActiveRecordの履歴情報には、
paper_trail
がよさげと先日ご紹介させていただきました。
ActiveRecordの変更履歴を保存するにはpaper_trailがよさげ
そのpaper_trailで保存された履歴情報をActiveScaffoldで表示する方法です。
Blogモデルで履歴情報を残すようにして、Blogモデル用のActiveScaffoldで履歴情報をネストして表示できるようにする例です。
ActiveScaffoldでnestを利用するには、has_manyで関係が明示されていないとダメっぽいので
まずはBlogモデルの履歴表示用のBlogVersionというモデルを作ります。
以下のような感じです。
paper_trailにより作成されたVersionモデルを継承します。
そしてmethod_missing内でBlogモデルが持つattributeと同じものを利用できるようにします。
厳密にはidとcreated_atだけはVersionのものになってしまいます。
そしてBlogモデルで以下のようにします。
versionsテーブルでblogsのidを保持するのはitem_idになるのでforeign_keyに指定します。
コントローラー側です。
まずは、BlogVersion用のものです。
新規追加、変更、削除はできないようにしておきます。
そして表示するカラムは明示します。
Blog用のものは以下のような感じです。
ここのnestedでblog_versionsを指定することで各ブログエントリ毎の変更履歴を表示することができるようになります。
ちなみに、このブログでactive_scaffoldに関しての情報を他にも乗せています。
ActiveScaffoldの小ネタのまとめ
paper_trail
がよさげと先日ご紹介させていただきました。
ActiveRecordの変更履歴を保存するにはpaper_trailがよさげ
そのpaper_trailで保存された履歴情報をActiveScaffoldで表示する方法です。
Blogモデルで履歴情報を残すようにして、Blogモデル用のActiveScaffoldで履歴情報をネストして表示できるようにする例です。
ActiveScaffoldでnestを利用するには、has_manyで関係が明示されていないとダメっぽいので
まずはBlogモデルの履歴表示用のBlogVersionというモデルを作ります。
以下のような感じです。
# -*- encoding: utf-8 -*-
class BlogVersion < Version
def method_missing(action)
unless self.reify.attributes.keys.index(action.to_s).nil?
self.reify[action]
else
super
end
end
end
paper_trailにより作成されたVersionモデルを継承します。
そしてmethod_missing内でBlogモデルが持つattributeと同じものを利用できるようにします。
厳密にはidとcreated_atだけはVersionのものになってしまいます。
そしてBlogモデルで以下のようにします。
# -*- encoding: utf-8 -*- class Blog < ActiveRecord::Base has_many :blog_versions, :foreign_key => "item_id" end
versionsテーブルでblogsのidを保持するのはitem_idになるのでforeign_keyに指定します。
コントローラー側です。
まずは、BlogVersion用のものです。
class BlogVersionController < ApplicationController
active_scaffold :blog_versions do |config|
config.label = "変更履歴"
config.actions.exclude :create, :update, :delete, :search
config.columns = [:entry,
:auther,
:updated_at]
end
end
新規追加、変更、削除はできないようにしておきます。
そして表示するカラムは明示します。
Blog用のものは以下のような感じです。
# -*- encoding: utf-8 -*-
class BlogController < ApplicationController
active_scaffold :blogs do |config|
config.label = "ブログエントリ"
config.columns = [:entry,
:auther,
:created_at,
:updated_at]
config.nested.add_link(:blog_versions, :label => '変更履歴')
end
end
ここのnestedでblog_versionsを指定することで各ブログエントリ毎の変更履歴を表示することができるようになります。
ちなみに、このブログでactive_scaffoldに関しての情報を他にも乗せています。
ActiveScaffoldの小ネタのまとめ
ラベル:
ActiveScaffold,
Ruby on Rails
2012-09-29
ActiveRecordの変更履歴を保存するにはpaper_trailがよさげ
以前、rails2.3の時はActiveRecordでデータの履歴管理をするというエントリで
vestal_versions
がよさげとしていましたが、どうやら今は、
paper_trail
が人気な気配です。
https://www.ruby-toolbox.com/categories/Active_Record_Versioning
にいろいろな履歴管理のものが紹介されています。
ちなみに
paper_trail
そして
rails g paper_trail:install --with-changes
とします。するとversionsという履歴管理用のテーブルのmigrationが作成されます。
ちなみに--with-changesとつけるとchangesetというカラムに変更された場所だけ記録することができるようになります。
そして
rake db:migrate
します。
履歴を残したいmodelに以下のようにすると履歴情報が残せるようになります。
履歴情報は以下のような感じで取得できます。
すべての変更履歴情報を取得
blog.versions
最新の変更履歴情報を取得
blog.versions.last
変更前の情報を取得
blog.versions.last.reify
変更した部分だけの情報の取得
blog.versions.last.changeset
これで
{'article' => ['変更前', '変更後']}
みたいな形で取得できます。
結構他にもいろいろなことができそうです。
詳しくは以下を見てみてください。
https://github.com/airblade/paper_trail
vestal_versions
がよさげとしていましたが、どうやら今は、
paper_trail
が人気な気配です。
https://www.ruby-toolbox.com/categories/Active_Record_Versioning
にいろいろな履歴管理のものが紹介されています。
ちなみに
paper_trail
を利用するには以下のような感じです。
Gemfileに以下を追加してbundle installします。
gem 'paper_trail', '~> 2'
そして
rails g paper_trail:install --with-changes
とします。するとversionsという履歴管理用のテーブルのmigrationが作成されます。
ちなみに--with-changesとつけるとchangesetというカラムに変更された場所だけ記録することができるようになります。
そして
rake db:migrate
します。
履歴を残したいmodelに以下のようにすると履歴情報が残せるようになります。
class Blog < ActiveRecord::Base has_paper_trail end
履歴情報は以下のような感じで取得できます。
すべての変更履歴情報を取得
blog.versions
最新の変更履歴情報を取得
blog.versions.last
変更前の情報を取得
blog.versions.last.reify
変更した部分だけの情報の取得
blog.versions.last.changeset
これで
{'article' => ['変更前', '変更後']}
みたいな形で取得できます。
結構他にもいろいろなことができそうです。
詳しくは以下を見てみてください。
https://github.com/airblade/paper_trail
ラベル:
Ruby on Rails
2012-09-28
iphone4Sのケースをxperia SXにつけてみた
xperia SXを買って、スマホケースをつけてみたい気分になってみました。
しかしxperia SXのスマホケースはそんなに種類がないし、ちょっと試すには高いなぁとか思っています。
そこでiphone4Sのケースに注目してみました。
というのもxperia SXとiphone4Sのサイズがすごく近いというのに気づいたからです。
それぞれのサイズは以下のような感じです。
Xperia SX 54(W)×9.4(D)×115(H)mm
iPhone 4S 58.6(W)×9.3(D)×115.2(H)mm
さすがのiphoneはケースの品揃えもすごいし、100円ショップにもあるというのが魅力でお試しするにはよさげです。
iphone5が発売されたので、今後おしゃれなiphone4S関連商品が安くなっていく可能性があるのかもとか思っています。
で100円ショップで以下のケースを買ってみました。



しかしxperia SXのスマホケースはそんなに種類がないし、ちょっと試すには高いなぁとか思っています。
そこでiphone4Sのケースに注目してみました。
というのもxperia SXとiphone4Sのサイズがすごく近いというのに気づいたからです。
それぞれのサイズは以下のような感じです。
Xperia SX 54(W)×9.4(D)×115(H)mm
iPhone 4S 58.6(W)×9.3(D)×115.2(H)mm
さすがのiphoneはケースの品揃えもすごいし、100円ショップにもあるというのが魅力でお試しするにはよさげです。
iphone5が発売されたので、今後おしゃれなiphone4S関連商品が安くなっていく可能性があるのかもとか思っています。
で100円ショップで以下のケースを買ってみました。
これをxperia SXにつけてみました。
ぱっと見よさそうに見えます。縦と厚さは確かに問題ないのですが、幅はちょっとカパカパする感じです。
落ちてしまうということはないのですが、ちょっと気になります。
表はこんな感じなのですが、裏はこんな感じです。
カメラの位置が違います・・・
このまま写真を撮ると・・・
トイカメラ風の味があると好意的に見ることもできますが、いつもこれでは困ってしまいます。
他の面も見てみましょう。
まずは上面です。ヘッドホンをさすところがあります。
ぼけてしまっていますが、ヘッドホンの位置が違います。ヘッドホンがさせません・・・
続いて右面です。電源ボタンや音量ボタンがあります。
ケースには何もありません。ソフトケースなので電源ボタンや音量ボタンの操作はできます。
ただカパカパしているので、ちょっと使いにくいです。
左面です。microUSB端子があります。
いい感じの位置に穴が開いているようですが、小さすぎてmicroUSB端子を差すことはできません。
最後に下面です。特に何があるというわけではないです。強いて言えばストラップホールがあるぐらいです。
ケースには余計な穴が開いています。そしてストラップケースの位置とはあいません。
とりあえず実用を考えると、
①カメラの穴の位置
②microUSBが挿せない
③ヘッドホンが挿せない
が問題かなと思います。
というわけで、ソフトケースなので強引に切ってみました。
ソフトケースですが、加工は結構大変です。
まずはカメラの穴対策です。
すごく広げることになりました。そしてかっちょ悪くなりました。
しかし、カメラは普通に使えるようになりました。
この通りです。
続いてヘッドホン対策です。
ちょっと穴が小さすぎました。ぎりぎり挿せないことはないけど、とても扱いにくいです。
もっと大きな穴が必要です。
そしてやっぱり2つ穴があり、かっちょ悪いです。
最後にmicroUSB対策です。
ここの加工が一番大変でした。もともとあいている穴を広がるスペースが狭い中広げるのは、なかなか大変です。
他の二つに比べれば、かっちょ悪い感じは若干ましかもしれませんが・・・
というわけで、結論的にはiphone4ケースは、カメラをトイカメラ風に使い、ヘッドホンを利用せずにに充電時にはケースをはずして充電するようにすれば使えないことはないかな?という感じです。
普通に使いたい場合は、もっとうまくカットできて、さらに余計な穴をオシャレにふさぐなどことができる技術が必要です。
普通にxperia SXのケースを買ったほうがよさそうです。
店頭では、xperia SXのケースの数はそんなにないのですがamazonさんで調べれば結構ありました。
amazonさんでxperia SXのケース
ラベル:
モバイル
2012-09-21
ActiveScaffoldで新規作成画面にデフォルト値を表示する
ActvieScaffoldで新規作成画面にデフォルト値を埋め込む方法です。
対象のコントローラーに以下のような感じのdo_newを作成すればOKです。
superは忘れてはだめです。
そして@recordに値を設定すればOKです。
上記の例ではend_dateに今日の1ヶ月をデフォルト値として埋め込んでいる例です。
ちなみに、このブログでactive_scaffoldに関しての情報を他にも乗せています。
ActiveScaffoldの小ネタのまとめ
対象のコントローラーに以下のような感じのdo_newを作成すればOKです。
protected def do_new super @record.end_date = 1.month.from_now end
superは忘れてはだめです。
そして@recordに値を設定すればOKです。
上記の例ではend_dateに今日の1ヶ月をデフォルト値として埋め込んでいる例です。
ちなみに、このブログでactive_scaffoldに関しての情報を他にも乗せています。
ActiveScaffoldの小ネタのまとめ
ラベル:
ActiveScaffold,
Ruby on Rails
登録:
投稿 (Atom)




























