慕凡(@ryudoawaru)'s blog

目前還沒想到

PostgreSQL Materialized View簡介

| Comments

最近在開發某個主力產品時遇到了一個問題,就是當我們在後台編輯一些資料,包含新增 / 修改 / 刪除 ,然後在沒有完成所有編輯前不想讓修改中的資料立刻在前台生效,正在苦思如何完成這項功能時,發現了PostgreSQL有一個超好用的功能叫「Materialized View」,於是就開始survey看看。

Database View

Wikipedia中的說明為:

1
檢視表 (View) 是在關聯式資料庫中,將一組查詢指令構成的結果集,在實體資料表中的改變都可以立刻反應在檢視表中

通常我們會為了特定目的,例如將某些特定條件的查詢變成一張虛擬表之類的原因,來製作一些View,例如:

我們會用以下的方式建立一個View:

1
2
3
4
5
6
7
8
9
CREATE VIEW orders_products_users AS
SELECT
orders.user_id,
users.name,
orders.product_id,
products.name
FROM
orders JOIN users ON users.id = orders.user_id,
JOIN products ON products.id = orders.product_id

以後我們要使用這個view時只要:

1
SELECT * FROM orders_products_users;

即可

但是普通的view本身並沒有真正的儲存資料,預設情況下它只是一個查詢的捷徑而已,而且也不能透過update view來更新資料,所以對於使用Rails等ORM的人來說,即使已經有一些「把view當model」的Gem(例如activerecord-database-views)推出,還是會覺得是一個比較雞肋的功能。

Materialized View(以下簡稱M-View)

今天要介紹的這個功能和普通的View的差別,就在建立出來的view是一個查詢狀態的「快照」(Snapshot),在快照建立後,只要不更新(Refresh),即使對原本的table有任何的變更,這個M-View裡的資料也不會有任何變化,因此就可以做到前面所說的,讓後台更新的資料不影響到前台的功能,接下來讓我們來看看如何使用這個功能。

Postgresql的Materialized View

這個功能原本是出自於Oracle,號稱「開源的Oracle」的PostgreSQL也在本文撰時最新的穩定版本9.3加入了該功能,參考資料

建立Materialized View

1
2
3
CREATE MATERIALIZED VIEW table_name
    AS query
    [ WITH [ NO ] DATA ]

例如:

1
CREATE MATERIALIZED VIEW mymatview AS SELECT * FROM mytab;

以上指令會以「SELECT * FROM mytab」的查詢式建立一個名為「mymatview」的M-View,而且在refresh之前,mymatview的內容不會受到原本mytab更新的影響。

結尾的WITH DATA 和 WITH NO DATA的差別是在,會不會在建立時就把當時的資料填進去,如果WITH NO DATA的話,就必需要再使用refresh才可以把資料填進去。

更新Materialized View

1
REFRESH MATERIALIZED VIEW  M-View的名稱

一旦下了這個指令後,就可以將現在的資料內容更新到指定的M-View上

移除Materialized View

1
DROP MATERIALIZED VIEW  M-View的名稱 [CASCADE | RESTRICT]

顧名思義,即完全移除該M-View,CASCADE意即在移除此物件實「一併移除相關物件」。

Materialized View的注意事項

  1. 和普通View一樣,不可以用UPDATE或INSERT等更新內容
  2. 如果建立了M-View後,要移除關聯的資料表時需要用CASADE方式一併移除相關M-View,否則會無法移除。
  3. 可以多層重疊,意即可以透過「查詢M-View建立其它M-View」

Materialized View的用途

  1. 加速部份查詢 和一般View不同,M-View佔有獨立表空間,所以查詢M-View不會影響到關聯的資料表,意即如果我們將一些複雜或費時的查詢的結果用M-View建立快照的話,可以透過查詢該M-View節省下一次查詢的時間,例如某個交易資料表如果有10年份1000萬筆的話,將某一年份的交易資料獨立查詢到一個M-View之後,要查詢該年份的交易資料只要查詢該M-View,就不需要在查詢中scan全部10年份的交易資料了。
  2. 實現資料版本控制 這是我原本想要使用的目的,這個功能可以玩的地方還很多,例如我們

範例

今天假設有如下的表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
CREATE TABLE spree_products
(
  id serial NOT NULL,
  name character varying(255) NOT NULL DEFAULT ''::character varying,
  description text,
  available_on timestamp without time zone,
  deleted_at timestamp without time zone,
  slug character varying(255),
  meta_description text,
  meta_keywords character varying(255),
  tax_category_id integer,
  shipping_category_id integer,
  created_at timestamp without time zone,
  updated_at timestamp without time zone,
  CONSTRAINT spree_products_pkey PRIMARY KEY (id)
)

然後我們建立如下的M-View

1
2
CREATE MATERIALIZED VIEW spree_products_mview AS
 SELECT * FROM spree_products;

然後我們看現在的 spree_products表內容如下: 此時table和M-View的資料應該是一致的,此時我們將資料表的一些資料刪除:

1
DELETE FROM spree_products WHERE id = 16;

此時id為16的紀錄已經被移除 但是M-View的資料還是一樣的,如下圖 這時如果我們下了REFRESH的話:

1
REFRESH MATERIALIZED VIEW spree_products_mview;

M-View的資料就會和資料表上一樣了

以上是簡介Materizlied View在PostgreSQL的作用,接下來我們還會針對如何用Rails / ActiveRecord操作這個功能作出說明。

2013回顧[CH]

| Comments

2013大事紀

回顧2013, 最多事件發生在經營Ruby社群方面, 雖然從小以來對辦活動或是搞社團都不太熱衷, 參與社群最初的目的也只是想要精進自己的技術和交朋友, 不知不覺Ruby社群就變成生活重心之一了, 參加RubyKaigi 2013期間的所見所聞也對我產生了很大的衝擊, 明年的目標有:

  • 成功舉辦RubyConf Taiwan 2014
  • 讓某個該上線的網站上線(秘)
  • 讓上述的網站正常營運
  • 持續經營Rails Girls 社群
  • 在國外的conf發表talk或session
  • 學好日文
  • 學好英文

加油!

Rails Girls Taipei-01 活動主辦心得

| Comments

Group photo of Rails Girls Taipei-01

以下是我和高見龍 以及泰安 共同主辦第一屆Rails Girls Taipei活動的心得

Rails Girls社群

有關於Rails Girls社群的介紹可以參考Open FoundryInside的介紹, 在此就不再儹述。

緣起

女性, 在台灣的程式社群屬於稀有動物的範疇, 一般來說在各大程式研討會中女會眾的比例通常在百分之三或以下, 所以一開始知道有Rails Girls這種活動(或著可以說是社群)時並不是特別感興趣; 轉捩點是四月和高見龍一起開有心人課程時, 發現竟然有意外多的女性學員(約佔全部學員的四分之一), 讓我們重新考慮舉辦這個活動的可能性; 研究了一下之後, 發現他是可以自由申請主辦的, 因此在五月初準備Rubykaigi 2013的行程與演講時, 就試著填寫了主站上的申請表單, Rails Girls的創辦人Linda Liukas也很快的就回應我, 讓我加入了世界各地Rails Girls活動的主辦群中。

加入「世界各地的Rails Girls主辦群」之後, 就是可以加入Railsgilrs.com網站的Github Repository, 以及修改或新增網站的內容, 使用Repository內的資源(圖片/素材)之外 還有加入Rails Girls的maillist; 除此之外都要由當地的主辦人自行張羅。

在日本的見聞

我在五月底至六月初和高見龍一同前往日本參加Rubykaigi 2013時, 有幸和日本Rails Girls的主辦人柴田博志先生討論了如何教不會程式的女生上手Rails的方式, 他講到了一個重點「藉由copy & paste, 讓學員有成就感」。

在Rubykaigi三天的議程中, 我們觀察到女性會眾的比例是遠超過5%的, 也藉機在現場認識了許多女性會眾, 發現之中甚至有原本不具程式經驗, 卻因為參加過Rails Girls活動後主動來參加RubyKaigi的女會眾; 而在Rubykaigi後一天舉辦的Ruby Hiroba的主題活動Rails Girls, more extended中, 同行的高見龍也現場觀察了日本這邊的活動情形, 如名稱上的「more extended」所示, 這是普通Rails Girls活動的進階版, 是採取由學員選擇有興趣的主題, 例如前端或後端技術等, 和熟練這些主題的教練一對二或三的教學形式, 在現場就近直接觀查教學的情形, 對於我們日後的主辦也很有幫助; 整個3+1天的活動之中的所見所聞, 都增加了我們的信心和決心。

Photo with Nakawaza and Yamaneko @Rubykaigi2013 (在RubyKaigi會場和Rails Girls的學員中澤(中)以及知名的mrubyist Yamane(右)合照)

開始籌辦

從日本回來之後一直忙於各種事件, 直到七月才有空開始, 除了本來就決定要一起主辦的高見龍之外, 剛好社群的朋友泰安對於這個活動都很有興趣, 因此我們就決定一起主辦這個活動。

泰安的夫人本身是一位業餘的畫家, 就請他畫了現在各位看到的這個Logo

Rails Girls Taiwan Logo

贊助商

由於這個活動規定不能向學員收取門票, 所以最重要的是找尋贊助商; 想到之前上課的學生阿姿是國內非常知名且歷史悠久的和女性有關的網站非常婚禮verywed的員工, 於是請她幫忙介紹引薦該公司的老闆與技術主管, 在簡短的會談闡明本活動的宗旨後, 該公司也欣然同意贊助本次活動, 順帶一提的是該公司是台灣極少數以女性員工為主的網路公司, 連程式都是以女性員工佔多數, 感謝非常婚禮的幫忙。

場地

一開始由於並不知道會有多少人報名, 決定以小而精的場地為主要的考量, 就選擇了在各大程式語言社群中頗負盛名的CLBC慶隆商務俱樂部為第一順位的場地選擇; 在談完贊助後立刻前往預約, 也很幸運的預約到了想要的時間; 並且獲得老闆Tyler的同意讓我們用公益團體的優惠價格計費, 在此必需要再次的感謝CLBC。

Rails Girls Taipei-01 Venue

報名

事先大家最擔心的就是會沒有學員, 畢竟現狀就如前面所提, 程式社群的女性成員是非常稀少的, 不過事後證明這些擔心都是多餘的; 中午開放報名後, 不到2小時就超過了150人, 更在第二天下午時已經超過了320人, 只好提前關閉註冊, 接下來篩選學員的工作反而是最花時間的, 大概花了將近十天在review報名資料上, 由於場地限制的因素, 最後只能選出31位的學員。

學員的資歷方面真的是臥虎藏龍的等級, 有位學員甚至曾經在大陸的百度這種超巨型網路公司工作過, 也有學員特地從台中兩天都當日搭高鐵往返參加的, 最值得一提的是一位來自花蓮數位機會中心的老師, 為了知識傳承, 特地從東部海邊北上來參加活動。

選取標準

如同國外創立這個活動的原意, 加上參考日本方面的選取標準後, 我們希望選擇的是比較沒有其它程式經驗的人, 然後重要的是, 在自介中說明以下兩件事:

  1. 為什麼妳想參加這個活動?
  2. 讓我們了解妳是一個怎樣的人?

事前準備

雖然之前已經有一點教Ruby的經驗, 不過教完全新手的事, 從學生時代以後就沒體驗過, 這次我們決定由一位教練負責2位學員, 因此從社群徵求了15位朋友來擔任教練的工作, 在Ruby Tuesday#25的會後進行了第一次的討論; 決定了教學方向後, 教材的部份就由泰安負責主編, 其他教練協助編輯, 成果可以在Github上看到; 加上一位公費留學過歐洲, 英文非常流利的教練@JuanitoFatas幫忙翻譯了Rails Girls Guides為主的很多文件, 讓我們雖然是首次主辦, 但各方面規模與完整性並不輸給國外。

現場狀況

雖然已經主辦過如RubyConf Taiwan 這樣的年度國際研討會, 第一次主辦完全以女性為主的活動, 不免還是會擔心出席率等等的問題; 不過活動一切順利, 教練和學員的互動也出乎意外的良好, 可能是因為女生之間一起學習的關係, 一般程式社群中新人女會眾的集體沉默現象在這邊完全不復見, 學員都全程參與, 也沒有遲到早退的問題, 真是可喜可賀。

現場1 現場2

After Party

教學之外, 這個活動的目的之一是促進學員和教練之間的互動, After Party也列在官方的Guides內, 因此事先就宣布並徵詢學員的參與意願; 場地方面, 想要維持品質以及營造互動的氛圍, 決定要以Lounge Bar為主, 經友人推薦之下, 選擇了費用上不算便宜的TRIBECA, 由於學員需要自費, 原本以為會變成教練與Staff們為主的聚會, 最後還是有超過一半的學員參加, 大家也聊到了十點才散會。

Rails Girls Taipei After Party 2 Rails Girls Taipei After Party 3 Rails Girls Taipei After Party

感想

Ruby真的是一門神奇的語言啊, 原本只是基於想要改變社群性別分布不均這個現狀的心情, 從國外引進並舉辦了這個活動, 卻得到了遠遠出乎意料的反應與成果, 看來21世紀的程式學習趨勢真的不是說說而已, 今後也會繼續這個活動下去, 感謝活動過程中一路相挺的朋友們, 謝謝大家。

How to Migrate a PostgreSQL DB With Many Schemas in a Multenancy Rails Application

| Comments

PostgreSQL的schema是一個非常方便的功能, 適合拿來做所謂的Multi-Tenancy類服務; 例如無名或Pixnet這類的BSP(Blog Service Provider)或是像我的FREEBBS的免費論壇服務(Forum Service Provider), 通常稱為SAAS(Software As A Service)系統, 可以把N個相同結構的schema放在同一個資料庫裡面; 比起MySQL只能分別放在不同的資料庫裡會有很多好處。

假設今天我用PostgreSQL的schema功能來做一個BSP服務的話, DB內的schema會分成兩大類:

  • 管理用schema(只有一個)
  • Blog Schema(有無數個, 每個的結構相同)

一般狀況下, 我們在使用ActiveRecord連接PosttgreSQL時可以在連接選項設定使用Schema, 像這樣:

database.yml
1
2
3
4
5
6
development:
  adapter: postgresql
  encoding: unicode
  database: SHOPON_development
  pool: 5
  schema_search_path: base, blog1

schema_search_path的預設值是public, 如果照以上設定, 當你執行任何migration時會先從base這個schema執行起, 也就是所有的migration都只會跑在base這個schema上面,

但場景回到Rails/ActiveRecord上, 假如你要做一個BSP, 一般而言你有以下幾種方式:

  1. 管理端(管理BSP的)和服務端(Blog服務本身)分別各自一個Rails Application目錄, 然後各有各的migrate
  2. 將兩端放在同一個Rails App裡

如果用一般的方式migrate, Rails會依照你database.yml裡設定的schema_search_path的順序找第一順位來執行migrate; 這樣你要如何migrate你的資料到不同schema呢?

今天要講的就是將兩端放在同app裡的方式, 也就是

  1. 在migrate檔內設定只能在服務端schema或是管理端schema執行
  2. 單獨migrate管理端單獨migrate服務端的功能

實現1.的方式如下

migrate_control_side.rb
1
2
3
4
5
6
7
8
9
10
11
class CreateSites < ActiveRecord::Migration
  def change
    if ActiveRecord::Base.connection.schema_search_path == 'base' #base為管理端schema
      create_table :sites do |t|
        t.string :subdn
        t.string :name
        t.timestamps
      end
    end
  end
end

簡單來說就是當現在的 schema_search_path 不等於base則不執行create_table的動作; 如果是服務端, 則反過來設定schema_search_path不為base或public即可, 更進一步的可以將這兩種檢查寫成ActiveRecord::Migration的module, 像這樣:

multitenancy_migration.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
module ActiveRecord::MultitenancyMigration
  def must_migrate_in_base #管理端
    if ActiveRecord::Base.connection.schema_search_path == 'base'
      yield
    end
  end

  def must_migrate_in_site #服務端
    schema_search_path = ActiveRecord::Base.connection.schema_search_path
    if !schema_search_path.index('base') && !schema_search_path.index('public')
      yield
    end
  end
end

ActiveRecord::Migration.class_eval do
  include ActiveRecord::MultitenancyMigration
  extend ActiveRecord::MultitenancyMigration
end

由於migration檔的內部可能是以self.up(class method)或是up(instance method)的方式編寫, 因此需要同時include和extend這個模組。

實現2.的方式如下

需要建立for 管理端以及 for 服務端的task 來migrate 各自的schema

base.rake
1
2
3
4
5
6
7
8
9
10
11
12
namespace :base do
  task migrate_db: :environment do
    ActiveRecord::Base.connection.schema_search_path = 'base'
    Rake::Task['db:migrate'].invoke
  end

  task rollback_db: :environment do
    ActiveRecord::Base.connection.schema_search_path = 'base'
    Rake::Task['db:rollback'].invoke
  end

end
site.rake
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
namespace :site do

  def check_subdn_exists
    if ENV.has_key?('SUBDN')
      ActiveRecord::Base.connection.schema_search_path = ENV['SUBDN']
      yield
    else
      puts "Please assign SUBDN first!"
    end
  end


  desc 'Migrate Database of Individual site, have to assign SUBDN paramater!'
  task migrate_db: :environment do
    check_subdn_exists do
      Rake::Task['db:migrate'].invoke
    end
  end

  desc 'Rollback migration of single site'
  task rollback_db: :environment do
    check_subdn_exists do
      Rake::Task['db:rollback'].invoke
    end
  end

end

簡單來說就是在migrate前先切換schema, 然後用Rake的指令呼叫原本的db:migrate/rollback出來, 當然你也可以寫一個task是去掃現存的服務端列表然後再各自migrate, 如果要寫在controller或model的話, 則必需先require rake然後再load Rakefile才行。

以上

Introduce Ruby Taiwan Community@RubyKaigi 2013[EN,CH]

| Comments

非常榮幸本次有機會可以和台灣Ruby社群的朋友一起參加世界級的Ruby研討會RubyKaigi2013, 做為台灣Ruby社群的主持人之一, 既然參加了就想要讓世界的Ruby朋友們知道Ruby Taiwan社群的存在, 因此在LT徵稿前就打算要投稿這個主題了.


It’s my pleasure to join the world-class Ruby seminar RubyKaigi2013, as one of the organizers of Ruby Taiwan community, I wish to let the world know the exist of our community, so I plan to submit this LT.

由於是第一次在海外以英文發表, 又是只有五分鐘的LT, 如果用一般的形式會很難控制時間, 因此就想到了高橋流的方式, 在準備的過程中不斷反覆觀看高橋征義在台灣的LT影片以及簡報來練習; 對於鋪梗也是費盡心思, 感謝@ihower在去年RubyConf Taiwan 2012的十六字箴言, 以及在Rubyist Magazine將其日語漢字化的柴田先生@hsbt; 另外由於會眾日本人佔多數, 在講稿上採取英日文並行的方式, 這點要特別再特別的感謝旅居日本的台灣人Rubyist侯大偉@davidhou_tw的全力支持, 大偉不但幫我翻譯, 甚至還請了日本朋友幫忙review, 我跟他致謝時他說:「還是慎重點好 畢竟你代表台灣宣傳阿」這句話時, 真的整個超感動又熱血的.


Since this is my first time to speak outside of Taiwan and it’s a 5 mins LT session, I decided to use the Takahashi-method on my talk. I watch Takahashi-san’s slide and screencasts again and again to meditate and practice my speech. Special thanks to @ihower’s opening slide at RubyConf Taiwan 2012 and @hsbt’s Japanese translation on Rubyist Magazine gave me some content on the slide. I write both Japanese and English on my slide because the biggtest part of audience are Japanese. I have to appreciate David Hou who is a Taiwanese Rubyist working and living in Japan for translating my slide to Japanese. He even asked help from a Japanese friend. He said to me: “We should be more careful, you represent the Ruby Taiwan community after all” when I expressed my thank to him. He really moved me!

另外一個最後引起日本朋友們關注的就是桐島梗了, 其實會有這個梗是因為自從去年Rubyconf Taiwan 2012後就有在關注日本Ruby大神們的推特, 適逢今年3月時日本舉辦的大江戶RubyKaigi03其中一場由CRuby GC的作者中村成洋@nari3的演講桐島、Rubyやめるってよ持續引起大神們的討論, 看了簡報之後雖然不是很懂但是對其中引用的電影聽說桐島退社了感到興趣, 看過之後再回頭看中村的簡報就能夠理解那些梗了, 個人以為那句「戰鬥吧!這裡是我們的世界」是整個電影, 同時也是我自己參與社群經營活動的精神之體現, 作為結尾是非常適合的.


I found the most eye-catching point of my presentation for Japanese is the 「Kirishima」’s ネタ. In fact I started to follow many Japanese Rubyist’s twitter after the RubyConf Taiwan 2012 last year. I noticed Narihiro Nakamura’s presentation named 「Kirishima, stop using Ruby」 which is retwteed many times after the 「Oedo RubyKaigi 03」 on March this year. I am extremely interested by the slide’s subject which is a movie named 「The Kirishima Thing」, so I can understanded what Nakamura expressed in his slide after watched the movie and deeply impressed by it. I decided to use the most important line of the movie “Fighting, this is our world!” as the last page of my slide because I think it is the spirit of both the movie and the reason of why I join the operation of our community.

上台前一直很擔心這些梗會沒有用, 前一天晚上由於和龍哥隔天都要上台的關係緊張到幾乎沒睡; 不過現場的反應真是超乎想像意外的好, 結束後也陸續接到幾位日本朋友們的鼓勵, 真的非常窩心, 感謝你們!


I almost can’t sleep on the eve of LT and worried about if my slide can’t attract the audience. Fortunately I finished the speech and it seemed the audience’s reaction was good. I must show my gratitude for beging metioned by many Japanese Ruby friends on Twitter as below:

神奇的是, 在LT投影片上傳slideshare後的隔天竟然登上了slideshare的「Hot on Facebook」首頁排行榜, 真的是又驚又喜


It was a miracle that on the third day of RubyKaigi2013, my slide was in the 「Hot in Facebook」 area of Slideshare’s homepage.

感謝高井先生的照片, 拍的非常好.


Thanks to the high quality photo taken by Naoto Takai.

這趟日本行真的是收獲多多, 接下來還會有幾篇文章介紹; 整個從準備到上台的過程中, 心裡一直想就大偉的話, 要讓世界知道Ruby Taiwan社群的存在, 今後一樣會持續努力


I learn so much on Japan this time, and I will write many blog posts to represent my journey. On the process of preparing the presentation, I always remember what David said and try my best to let the attendee know what we(Ruby Taiwan community) do and I will continue my work in the future.

Thanks to all awesome staffs of Rubykaigi and community friends in Japan, また台湾で会お!

附上簡報檔以及當天Live如下:


Video streaming by Ustream

達人出版会徵求翻譯以及校稿志工事宜

| Comments

大家好:

達人出版会是由日本知名Rubyist, 也是高橋流簡報術的作者「高橋征義」成立, 目的是透過實踐「敏捷出版」的方式出版技術系的日文純電子書籍, 這邊有一份非常詳盡的介紹文章

最早知道這個網站是在RubyConf Taiwan 2012高橋的LT時提及的

由於個人對於其中一些在台灣可以稱為是非主流或不可能出版的書籍有興趣, 因此日前OSDC.tw 2013時, 在席間和高橋提到是否有機會將其中一些書籍翻譯成中文版, 甚至是在該平台出版中文原生電子書的事情, 沒想到高橋的回應意外的積極, 於是就不自量力的在高橋先生的首肯之下接下了這個任務, 目前正在募集譯者以及校稿志工

譯者

  • 懂日文, 基本上能看得懂日文技術書輯的程度即可
  • 懂一定程度的技術, 在達人出版會的架構中, 會有叫作「Reviewer」的校稿志工擔任實體出版社中編輯的任務, 因此譯者即使不是技術方面的強者也沒有關係
  • 最重要的就是興趣, 有愛最重要
  • 既然書有賣錢, 因此譯者是有酬勞的, 目前規劃是用計件的方式, 不過如果想用版稅的方式也是可以討論的

校稿志工

  • 對書本相關的技術有一定程度的認識
  • 在翻譯的過程中協助譯者
  • 校稿工作

對譯者和校稿志工們而言, 線上出版和實體出版最大的不同就是書籍本身可以一直改版, 所以不會有實體書那樣的壓力; 雙方協同進行翻譯工作可以同時提升日文以及技術能力, 名字會列在書上也算是一個成就.

下面是目前我覺得比較有特色可以翻譯的書籍:

有意者請mail: ryudoawaru at gmail.com 給我, 或在下面留言

目前(5/3)為止的募集情況: 校稿志工x3(包括我), 從開始募集譯者一天竟然已經超過10位, 由於報名情形遠超乎想像, 因此之後將請報名者至此填寫基本資料後再試翻作為參考, 謝謝大家!

RubyConf Taiwan 2012回憶錄(上)

| Comments

其實活動都結束半年了, 不過還是寫一下紀錄好了, 本篇為準備期間的紀錄

緣起

其實在去年OSDC.tw 2012時就開始催促@ihower了, 不過大大當時表示等D3打完再說, 然後七月初Matz回覆了可出席的時間就決定開辦了

為何要辦在中研院之外?

原因很簡單, 因為本屆大會是「MDD」(Matz Driven Development), Matz只有12/7-8有空, 剛好當日中研院場地已滿, 就此成為北部近年來第一個離開中研院的程式語言年會, 以及台灣第一個飯店conf了

找場地的過程

我們都沒有在外面找這種等級場地的經驗, 因此就先在網路上瞎找一通, 列舉一些有去現場勘察過的場地如下

  1. 沃田旅店, 天母國際會議中心(即最後的會場)

    會在下面說明

  2. 某天大學的國際會議聽

    綜合條件其實是所有會場最優, 最接近中研院的, 問題是當承辦人員聽到要收門票後就宣稱他們只接受不收費活動, 只好作罷

  3. 台師大

    最便宜, 場地狀況普通, 但是交通位置極優而且有附會館可住宿, 附近也不缺吃喝的地方; 本來都已經要簽約了, 對方突然發現每週五固定被某綠色房仲包下來當員工訓練用就GG了

為何選了這個場地

這是一個老字號的會議場地, 前身是農會訓練中心因此有住宿的服務, 我們考慮的點如下:

  • 以非學校場地而言, 價格相對合理
  • 場地的高低差讓我驚豔, 有去過的人應該都可以感受到
  • 飯店, 外國會眾可直接住在場地樓上, 方便度滿點, 住宿費因為會議的關係還有額外折扣, 還有我們都覺得飯店conf很酷, 飯店也可以提供完整的餐飲服務, 不用自己去找廠商
  • 承上, 剛好當時正在由農訓中心改建為對外經營的旅館之過程中, 想說conf時剛好是旅館設備全新的狀態, 算是一個bonus
  • 個人長期在北投唸書, 算是在地人, 而且週邊有很多我熟悉的店, 不缺餐廳招待外國朋友
  • 地點不是在鬧區因此一開始會有些疑慮, 其實場地和捷運站的距離完全不比中研院遠

最後就8月左右就決定是這裡了

講者

離開中研院的關係, 預算變得十分吃緊, 邀請講者的部份就無法像前兩屆一樣邀請歐美講者, 但是在Matz大神的光環以及ihower前兩屆建立起來的口碑, 外國講者以及與會者都十分踴躍, 最後竟然有超過10國的與會者; 陣容方面由於Matz/ko_1/a_matsuda等等的真神們領銜之下, 和歪國的Ruby系Conf比起來一點也不遜色

Party

既然已經離開了中研院, 因此以往不方便舉辦的趴踢也不再是問題了; 剛好想到場地附近就有一間「天母黎舍BAR」, 去看了一下場地情況以及當場試喝了幾杯調酒後發現非常超值, 經過討論後就決定是它了.

贊助

靠著ihower的聲望以及前兩屆的口碑, 除了一直以來情義相挺的伙伴們之外, 也加入了一些外國贊助商; 另外也感謝台灣新浪作為媒體合作夥伴, 支援了一位專業的錄影師與設備.

攝影

以往國內的開源或程式語言年會多半都是採用攝影志工, 這次要嘗試不一樣的選擇; 由於以前某次賣身event的關係認識了超級攝影師, 同時也是前總統府攝影官的「徐聖淵」, 當然不是志工就意味著一筆額外的支出; 同時在幾位人選之中他也是最貴的一位(詳見此, 下次有單身正妹願意當攝影助理志工的話請務必跟我聯絡), 但基於共事期間的經驗, 在經過討論之後就拍板定案了.

錄影

一樣因為不在中研院, 會場本身也無提供相關服務與設備, 為了能把錄影的等級提升到接近confreaks的水準可說是費盡苦心, 因為我想要做出speaker和presentation是分割畫面的情形, 於是就想到用兩台DV分別拍攝再事後剪接合成的方式; 剛好平常自己家網站合作的美術dukecroc具有數年專業MV後製剪接的經驗, 於是就決定請他幫忙; 順帶一提的是中研院可是用了價值5x萬的設備在做即時多軌合成的; 另外在準備期間為了橋收音和攝影機擺放位置的問題來回去了很多次場地.

餐點

場所的飯店本身是農會經營的(前身為士林區農會訓練中心), 場地一般是提供合菜但是在我們的要求之下改成buffet, 菜色調整了幾次之後, 一個人一天的餐費達到的驚人的230; 點心的部份, 場地有固定的合作廠商, 該廠商也是天母地區的老字號, 品質是值得信賴的不過價格也很硬, 因此量的部份就不能太要求了.

翻譯主持人

本次的邀請講者都是日本來的大神, 找尋一位有日文流利而且適合當司儀的女性主持人就成了當務之急, 好運的是透過了以往賣身event的戰友介紹了超專業的Sho, 不但是國內某大設計系conf的日語口譯, 又是專業的網站與Mobile APP的PM, 可以說是非常適合的人選.

網站

在OSDC時就已經決定請四點設計贊助網站了, 關於設計概念的部份ihower完全交給老闆P董與老闆娘Polly決定, 在經過幾次跳tone後出現了現在這一版; 一看到就驚為天人, 看來在技術系conf使用墨水風格的應該也只有我們了吧!

準備的時間花費

五個月期間, 花在準備上的時間分佈大致如下:

  • 最多的是找sponsor以及與sponsor的溝通, 應該說大半時間都花在這裡
  • 和場地人員的溝通, 包括餐點等等
  • 次之是場地的準備, 因為不在中研院的關係這部份的工作變得比以前繁重許多, 由於前面所説的改建的關係, 像是電源以及擴音/錄音設備之類的都是在10月以後才完整ready; 前面也提到了為此多花了不少時間

Ruby Tuesday#22

| Comments

由於之前已經比較久沒辦的關係, 相信大家都悶了, 剛好這次找到了相當不錯的場地HDX Cafe, 加上兩位新人講者泰安大兜, 所以就決定要開辦Tuesday啦; 這個場地好的點在於:

  • 地點好, 在程式人的聖地天瓏書局的隔壁, 也就是以前儒林書局的位置; 會前會後都可以下去敗家
  • 場地大, 2F的場地兩邊加起來可以擠上100人都沒問題
  • 投影設備, 投影幕是移動式的所以到處都可以用
  • 餐點便宜, 包場的低消是120元, 飲料餐點的水準也比以前去過的不少場地要優, 除了正餐還有麵包/蛋糕, 整體來說很超值.
  • 可以待到10點, 其實他們是9:30收, 但包場可以到10點沒問題

講者的部份, 兩位新人的演出也非常精彩(和我第一次比真的是強很多), 會場氣氛也非常熱絡; 大家也都呆到快收攤才離開; 報到率近乎100%, 整個都很讓人感動, 希望能繼續辦下去, 謝謝大家!

Ruby,Sinatra and Websocket

| Comments

近半年來花了很多時間在研究Ruby上實作Websocket的方式, 現介紹簡單心得如下

Base Solution:

Ruby系的幾乎不出這兩種, 其中又以前者為大宗, 後者顯然在Ruby界不流行而且基本上沒在更新了, 然後想當然我也只會用EM

使用過的EM類Solution:

Sinatra-Websocket

最初的嘗試, 好處是整合性極高, 可以直接登記在Sinatra的route上以及共享一切Sinatra的設定, Application Server原則上只能用thin, 不過有致命性的memory leak問題, 簡單來說就是Thin會以為已經斷線的WS連線未斷線因此長久下去會在Thin的process上留著無數的連線進而吃掉大量記憶體, 而且作者沒有配合EM-Websocket改版, 因此被判定為不可用

直接用EM-Websocket當server

現在的解法, 優點是完全自訂, 同時也是缺點; 等於從0開始設定一個socket server, DB/model…等等的設定都要自己寫; 另外我還比較搞缸的寫了init script變成系統服務, 前端使用haproxy

負載能力

非常強, 只要處理掉系統的nofile設定的話, 單一行程可以吃到破萬連線不是問題, 不過以現在的EM架構要開多行程處理數萬連線的話, 如果沒有再上一層的pub/sub機制就得要用fork出多行程的方式, 這時就得考慮類似mutex lock的問題了

IE相容問題

web-socket-js可以解決你的問題, 不過如果你要用haproxy開前端的話就必需要自己設定flash socket policy file, 使用flash_policy_server 可手動開這個服務

實際的代碼與架構會在以後說明

Sinatra課程紀錄

| Comments

這次和龍哥一起合辦有心人的課程 其中的第二天是小弟主講Sinatra & Rack, 以下是講義分享

已將課程所用之原始碼放到Github

心得:

  • 這次準備過程還是很抖, 一開始因為發現了神奇的課程Understanding Rack因此想把這篇的大意放到教材中, 不過果然還是太難把這麼硬的東西表達出來啊….

  • 刺激的是除了前一天做講義到五點之外, 十點一起來還接到了公司的message得在緊急狀態之下10分鐘修了production code, 一下課又得繼續修 & Deploy…

  • 4/5發現竟然有四位學員fork了, 真是令人感動, 其中還有人抓到我的bug..xd