Ruby勉強会@関西 10

投稿者 nanki 2006-05-16 04:28:00 GMT

今回は半分弱が初参加、60人の定員が満員という勢い。 バス一本乗り過ごして、10分ほど遅れて到着。

丸投げシリーズ(3) C

西本さんの発表。

CのライブラリをRubyから使うというもの。 * #include "ruby.h" * Init_foo(foorequire 'foo'される)の中に、クラス情報、あるいはメソッド情報をつらつらと書きつくる。 * mkmfライブラリを使って、Makefileを作る。 * makeする。 * 30倍から100倍程度の高速化ができることも。

実はなかなか踏み出せないでいた領域だけに(いつもRubyレベルでのアルゴリズムの最適化とかで逃げてる。逃げてるのか?)非常に役立つ内容だった。
さんざん最適化した上でNativeにしたら、相当速くなりそうだ。 非CygwinのWindowsコンパイラを探さないと。
大量のマクロとrb_*が次なる壁。

ゲーム用フレームワーク 「Miyako」

サイロス誠さんの発表。スライドの一枚目がCryossになってる気がしたけど。

本人曰く、女性参加者が予想外に多くて、ネタに対する反応が心配だったそうで、確かにちょっとヒヤヒヤ。
(概ね、高飛車な女性がMiyakoのなんたるかを博士&助手に説明するという内容)
僕は前のほうだったのであまり気にならなかったけど、文字のサイズが小さくて後ろのほうの人は見えなかったそうで、途中から、普段勉強会の会計を担当してくださっている、あゆさんが声優をやって、別の意味で盛り上がっていた。

肝心の内容のほうは、発表の形式がシナリオ形式だったので、記憶に残ってるのは主にデモ中心。
紙芝居的なゲーム(呼び方知らない)を作るなら一考の価値あり、だと思います。 Miyako自体のコードはあまりRubyっぽくないので、Rubyっぽい実装になって欲しい。 あと、プレゼンツールとしての使い道に期待する人もいるようで、今後のバージョンアップはそっちの方向に向かうとか。

それなら、フルスクリーン対応は必須になるね。

ライトニングトーク Ruby on Google SketchUP

兼重さんの発表。Googleが発表したブツを早速。 このスピード感がライトニング。 デモは、SketchUpでぐいぐい立体を作って(ここはRubyと関係ない)、PureImage(西本さん作)で作ったテクスチャーを貼り付けるというもの。

西本さん、丸投げばかりじゃなかったのね。
PureImageの回は参加できなかったのですっかり忘れてた。

Rubyと関係ないFollow Meツールがうまくいかないのでちょっとヒヤッとしてた。

Ruby 初級者向けレッスン 7 -ブロックとイテレータ-

最後はかずひこさん・コウザイさんによる発表。 もう七回目になるのか。僕が最初に参加したときは一回目だったかなぁ。 内容は、イテレータ・ブロックを使ってみる、というもの。 今回は、時間がよっぽど足りなかったらしく、途中のキリのいいところ?で終わってしまった。 * injectの引数省略知らなかった * 僕、Ruby歴2年半くらいなんですが・・・ * おじさん向け課題:パスカルの三角形

(1..9).inject([1]){|r,| p r;(r+[0]).zip([0]+r).map{|a| a[0]+a[1]}}
* いまいさんの解答、enum_consとか勉強になります。 * to_procのやつ(.map(&:+))、引数一個以上のメソッドを渡しても大丈夫なのか。むむ。 * &:+が梅干たべたパーマの外国人みたい。 * 偶然か必然か、途中までまったく一緒・・・。1..9 とか、10にすると文字が一文字増えるからだよなぁ。

小波ゼミでは最初からRubyを教え込まれるので、卒業するころにはRuby暦3年とか4年とかざらにいるみたいです。恐るべし。

発表の形式として、壇上で先生と生徒の対話みたいな形がとられていた?(→意図したものだったようで)のは聞いてる方としては入りやすいんじゃないかと思う。
Ruby/SDL上での先生と生徒の対話はちょっと食傷気味だけど。
後半の応用編(ログ解析)は次回に持ち越し?

プリンセスラインに対する京都女子大学の絶大なる影響力(ピポパで臨時便)を目の当たりにしつつ、懇親会へ。

懇親会の内容は日記になるので略。

参考:

第10回 Ruby勉強会@関西
Miyako メインサイト


Thinkpad の加速度センサをRubyから使う(2)

投稿者 nanki 2006-05-08 05:46:00 GMT

前回のバージョンはモノクロでスクリーンショットが地味だったり、放っておくと収束してしまって長い時間楽しめない、という問題があったのでバージョンアップ。

新機能は * 速度にあわせて、色相や輝度が変化。 * くっつきモード。 * すごい勢いで壁にぶつけると分裂。

など。 もうちょっと有機的にくっついたりしてくれると楽しいんだけど。

screenshot

使い方は前回同様

$ ruby leap-frog.rb
  • Tab キーで粒々生成。
  • Enter キーでくっつきモードに。

追記: 2007/03/01

この間のLiveCodingでyharaさんからライセンスについて質問されたので、 修正BSD相当とビールウェア(optional)ということにしておきます。

参考:

Thinkpad の加速度センサをRubyから使う


Rails Plugin

投稿者 nanki 2006-04-25 23:35:00 GMT

全部終わったら公開しようと思っていたけど、全く終わる気配がないので公開します。

今回は量が多いので分割しました。

全部見たい人は、 タグ:rails_pluginでどうぞ。


Rails Plugin - ActiveRecord拡張系

投稿者 nanki 2006-04-25 23:30:00 GMT
composite_primary_keys
  • 主キーとして複合キーを扱える。
  • $ gem install composite_primary_keys
  • require 'compositeprimarykeys'

class Road < ActiveRecord::Base belongsto :attribute, :foreignkey => [:attributecode, :meshcode] end

class Attribute < ActiveRecord::Base setprimarykeys :attributecode, :meshcode end

Road.find(:first).attribute #=> SELECT...WHERE roads.attributecode = attributes.attributecode and roads.meshcode = attributes.meshcode ...

pessimistic locking
  • Account.transaction do
    account = Account.find(:first, :lock => true)
    end

Account.transaction do account = Account.find(:first) account.lock # ... end

で悲観的ロックができる。 * Edgeには取り込まれたっぽい。

has_many_polymorphs
  • Rails標準の :polymorphic では、逆向きの参照が出来ない、などの制限がある。
  • 記述も少なくなる。
  • 詳しい経緯
  • 下のように変わる。あってる?
  • # Rails
    class Dog < ActiveRecord::Base
    hasmany :eaterpetfoods, :as => :eater
    hasmany :petfoods, :through => :eaterpetfoods
    end

class Cat < ActiveRecord::Base hasmany :eaterpetfoods, :as => :eater hasmany :petfoods, :through => :eaterpetfoods end

class EatersPetfood < ActiveRecord::Base belongsto :petfood belongsto :eater, :polymorphic => true end

class Petfood < ActiveRecord::Base hasmany :eaterpetfoods hasmany :eaters, :through => :eaterpetfoods # これができない end

*
# hasmanypolymorphs
class Dog < ActiveRecord::Base;end
class Cat < ActiveRecord::Base;end

class EatersPetfood < ActiveRecord::Base belongsto :petfood belongsto :eater, :polymorphic => true end

class Petfood < ActiveRecord::Base hasmanypolymorphs :eaters, :from => [:dogs, :cats] end

* eaterが増える度にPetfoodを書き換えないといけないのがかっこよくない。

store_multiplied
force uppercase
ActiveCrypto
UpdateHabtmAttributes
allow_habtm_primary_key
userstamp

class ApplicationController < ActionController::Base before_filter do |c|

<span class="constant">User</span>.current_user = <span class="constant">User</span>.find(c.session[<span class="symbol">:user</span>].id) <span class="keyword">unless</span> c.session[<span class="symbol">:user</span>].nil?

end end

class Post < ActiveRecord::Base belongsto :createdby, :classname => "User", :foreignkey => "createdby" belongsto :updatedby, :classname => "User", :foreignkey => "updatedby" end

active form
riff
enforce_column_limits
validates_numericality_of
ActiveSearch
Spatial Adapter
settings
autoescape
deadlock_retry
calculations
guid
where
count_limit_associations
file_column
filters_column
filtered_column

Rails Plugin - 認証系

投稿者 nanki 2006-04-25 23:29:00 GMT
session_timeout
access_control
validates_captcha
account_location
acts_as_authenticated
login_engine
user_engine
ssl_requirement
security_extensions
sentry

Rails Plugin - View系

投稿者 nanki 2006-04-25 23:28:00 GMT
hotkey
SimpleSidebar
google maps
InPlaceControls

<%= inplaceradio_buttons :post, :published, :choices => [[true, "Yes"],[false, "No"]] %> <!-- :choicesは、値の配列 or 値とラベルの配列 -->

<%= inplaceselect :address, :country, :choices => countryoptionsforselect %> <!-- :choicesは、値の配列 or 値とラベルの配列 or optionsfor_selectの結果 -->

* svn://rubyforge.org/var/svn/inplacecontrols

widgets
acts_as_wizard

add_step do

named <span class="string"><span class="delimiter">'</span><span class="content">Insert your dog</span><span class="delimiter">'</span></span>
controlled_by <span class="symbol">:dogs</span>
enable_actions <span class="symbol">:new</span>, <span class="symbol">:create</span>
<span class="comment"># main/finishedに飛んでもらわないと困る</span>
add_rewrite({<span class="symbol">:action</span>=&gt;<span class="string"><span class="delimiter">'</span><span class="content">list</span><span class="delimiter">'</span></span>}, {<span class="symbol">:controller</span> =&gt; <span class="string"><span class="delimiter">'</span><span class="content">main</span><span class="delimiter">'</span></span>, <span class="symbol">:action</span> =&gt; <span class="string"><span class="delimiter">'</span><span class="content">finished</span><span class="delimiter">'</span></span>})

end

add_step do

named <span class="string"><span class="delimiter">'</span><span class="content">Finished!</span><span class="delimiter">'</span></span>
controlled_by <span class="symbol">:main</span>
enable_actions <span class="symbol">:finished</span>

end end

な感じで。 * application.rbに require 'create_cat_and_dog_wizard'をお忘れなく。 * URLはそのままだと、/cats/new?wizard=create_cat_and_dogになってかっこわるいので、
# routes.rb
map.connect 'createcatand_dog/:controller/:action/:id',

        <span class="symbol">:wizard</span> =&gt; <span class="string"><span class="delimiter">'</span><span class="content">create_cat_and_dog</span><span class="delimiter">'</span></span></span></notextile></pre></div>でかっこよく。
  • wizardのURLは、
    urlfor :controller => 'cats', :action => 'new', :wizard => 'createcatanddog'
tabnav
  • タブナビゲーションを簡単に。
  • $ script/generate tabnav Main
  • <!-- layout.rhtml -->
    <%= starttabnav :main %>
    <%= @contentforlayout %>
    <%= endtabnav %>
  • class MainTabnav < Tabnav::Base     
    addtab do named 'User' # タブの名前 titled 'User!' # title属性(ブラウザによってはtooltipが出る) linksto :controller => 'user' # リンク先(url_forと同じオプション) end

add_tab do

named <span class="string"><span class="delimiter">'</span><span class="content">Admin</span><span class="delimiter">'</span></span>
links_to <span class="symbol">:controller</span> =&gt; <span class="string"><span class="delimiter">'</span><span class="content">admin</span><span class="delimiter">'</span></span>
show_if <span class="string"><span class="delimiter">&quot;</span><span class="content">params[:admin] == true</span><span class="delimiter">&quot;</span></span> <span class="comment"># 表示条件</span>

end
end

のように。 * links_toで指定されたページを表示している時は、自動的にハイライトされるが、それ以外のページでもハイライトさせたかったらhighligths_onを使う。

UJS Rails
rails-tidy
12_hour_time
live_tree
browser_filters
labeled_form_helper
label_helpers
restifarian
scriptaculous_slider
localization
css_graphs
asset_timestamping
add_query_mtime
javascript_generator_templates
us_states
wiki_engine
date_slider
head-helper
enhanced-form-tag-helper
liquid
rails_pdf
upload_progress
datebox_engine
HTML Output
syntax_highlight
theme_support
selector
safe_render
RUtils
cartographer
markaby

Rails Plugin - 開発系

投稿者 nanki 2006-04-25 23:27:00 GMT
row_version_migrations
Safe ERB
ARTS
annotate_models
assert_valid_markup
assert-valid-asset
debug_view_helper
continuous_builder
exception_notification
ar_fixtures
engines
refactor
assert_accessible
javascript-packaging
migrate_ext
Foreign Key Schema Dumper

Rails Plugin - その他

投稿者 nanki 2006-04-25 23:26:00 GMT
history

# actiontoskip アクションは対象外 historyskip :actionto_skip end

# 一個前の履歴を見る peeklastlocation(1)

# redirectで一つ前に戻る redirect_back(1)

# 現在のアクションを履歴に保存 storelocation # historyskipだろうがおかまいなし store_location(true)

inject
url_for_domain
legacy_interop
auto_hash
output_compression
Better Output Compression
google_analytics
json_webservice
numeric_spell
referenced_page_caching
foo_with_install
Flash Fixes

Web UI デザインパターン

投稿者 nanki 2006-04-22 16:20:00 GMT

AJAXだとかなんだとかでJavascriptを使ってもいい雰囲気になり、ライブラリも整備され、かなり高度なユーザインターフェースを作ることが可能になっている。

しかし、何の指針もなしに作っていたのでは、使用感に統一性の無いものがあふれかえってしまう。
そんなわけで、Railsで使えるものを中心に、使いどころ、使わないどころ、雑感を。

AutoComplete

Drag&Drop

SortableList

InPlaceEditor

ブラウザ内ウィンドウ

などなど。書き出してみると結構当たり前のことばかりか。
他にどんなのがありますかねぇ。

キー操作を扱える標準的なライブラリとかも欲しいかなぁ。

追記

2006.04.27 Ajax Pattern Screencasts


Thinkpad の加速度センサをRubyから使う

投稿者 nanki 2006-03-13 01:36:00 GMT

今回の第9回 Ruby勉強会@関西での初級者レッスンは、「わかりやすいRubyのコードを書こう」という題で、小波ゼミの学生さんのコードを元に、わかりやすくしていく、という内容。

元々のソースコードがLeap-Frog法という数値計算の手法で運動方程式を解く、というものだったので、前日に調べておいたThinkpadの加速度を読む方法を早速組み込んでみた。 (前日に調べたのは読み出す方法までで、結果がどう値に対応してるのか調べるために、こっそりPCを振るのに苦労した)

Thinkpadを傾けると、そっちの方向に重力が働くというもの。

Rubyでの情報の可視化や入力インターフェースのものめずらしさもあってか、懇親会での受けが結構よかったので公開します。 * leap-frog.zip

加速度が変わりまくるので、コード中の方法ではあんまり意味がないような。

会場からは、最適化に関する質問や、誤差に関する指摘が多かっただけにちょっと心配だけど、本質はそっちじゃないので目を瞑ってください。

Thinkpad以外のノートPCにも加速度センサを搭載しているものがあるらしいので、頑張れば動くかも。

次回の勉強会、みんなでThinkpadをフリフリしましょう。

参考

Ruby/SDL

ActiveScriptRuby

Thinkpad加速度センサを使ったソフトウェア・リンク集