[Ruby] 5th street

因為CH.3後面在討論編碼的問題,不過暫時對我來說可能還用不到,不過時間有限,就來到了下一段。

3.3 Arrays

Ruby的Array類別提供了一些有趣的Method,常用的如size(同length),可以用直接回傳Array的長度。基本的東西大概都和別的語言一樣,唯一一個要注意的就是它對Out-of-bound的處理是回傳一nil,但通常別人都是直接Error了,所以可以為這種狀況做一些判斷,真是貼心呀。

來看一下Array要怎麼用:
http://gist.github.com/291064.js?file=gistfile1.rb

再上語法甜點:
http://gist.github.com/291066.js?file=gistfile1.rb

看完例子大概就很清楚要怎麼操作它了XD,而index的操作就請看前面幾篇,概念是一樣的,所以應該很好上手。

當然也要提幾個好用的東西,像是可以用「+」把兩個Array給串接起來,反之也可以用「-」把Array相符合的元素給刪除掉,來看個實際的Demo:

http://gist.github.com/291110.js?file=gistfile1.rb

水哦,還記得之前String的「<<」運算子嗎,你應該會想說,該不會在Array也可以用吧,沒錯,還真的可以用,來看看運行的情況:

http://gist.github.com/291113.js?file=gistfile1.rb

和String好像,了解一個就會這個了XD

這邊有個很有趣的就是,它也把布林運算子「&」、「|」都拿來玩了,它們是用來比較兩個Array間元素的狀況用的,廢話不多說,再來個例子:

http://gist.github.com/291115.js?file=gistfile1.rb

簡單來說,「|」就是「聯集」,而「&」就是「交集」。交集就是找出A、B兩個集合間共有的元素,而聯集就是找出A、B兩個集合的所有元素。但是在Ruby內還多了一個限制,這兩個布林運算所回傳的的結果並不會有重覆的情況(不會有[1,1 …] 這種情形)。最後,也是要特別注意的,就是Array下的這種布林運算並沒有Transitive(遞移性),即「A|B」≠「B|A」,看例子就發現其順序會相反,這要留意一下呀!!

看了這麼多例子,先來去試試看比較實在啦,文末附上Array可用的Method:

http://gist.github.com/291120.js?file=gistfile1.rb

我們下篇見XD~

[Ruby] 4th road

3.2.4 Accessing Characters and Substrings

耶,講到有趣的String了,這邊在書上有提到Ruby1.8和Ruby1.9對於String處理上面的小差異, 如果我們要存取String的子字串的話,就用「square-bracket array- index operator []吧」。其實大家應該都在別的語言上用的很習慣了,所以通常看一下Ruby對下面兩個不同版本的解釋就可以啦:
http://gist.github.com/290553.js?file=gistfile1.rb

最大的差異就是對於「單一字元」的解讀,在1.8時會回傳其ASCII碼,而在1.9時會回傳該字元(雖然我是這樣說,不過它們是各自屬於不同的Class下,在1.8,單一字元被視為Fixnum,而在1.9則被視為String,大家可以自己試試看)。

不知道之前說的單一字元的呈現如果不想用String來做的好方法還有沒有人記得?恩,就是用「?」,來看一下例子:
http://gist.github.com/290558.js?file=gistfile1.rb

上面都是如何對字串的「單一字元」做修改的例子,接下來要討論子字串了,老樣子,看例子學比較快:
http://gist.github.com/290559.js?file=gistfile1.rb

在Ruby下提供了[X,Y]的方法來讓我們存取「從第X個字元(可為負),向後抓Y長度個字元」,只是要特別小心Out-of-boundary 的問題。如果X為負則「反向從倒數第|X|個字元向後抓Y長度個字元」,很簡單吧!!?不過還有一個要注意的就是Ruby可以很彈性的依個人意識插入或是刪除字元,只要你的起始位置和長度寫好就可以了!再來個小例子吧XD
http://gist.github.com/290594.js?file=gistfile1.rb

如果你的長度Y是寫0的話,就會產生插入的效果而得到結果「HeLllo」,書上有寫出個小規則,來看一下:

If the righthand side is the empty string, this is a deletion, and if the lefthand side has zero-length, this is an insertion

所以如果右邊是Assign一個空字串,就會被視為刪除,反之如果左邊是以Y長度為0來表示的話,就視為插入!

這邊還有一個很好用的Range Object,不過因為在後面的章節會解釋的比較詳細,所以先放到後面再來說吧XD~

最後一個要講的就是我們也能利用字串來當作字串的index,如果是這樣子做的話,其回傳的值就是第一個相符合的子字串或是Nil(即Null)當沒有相符合的子字串的時候。

所以其實這個東西目前可能對我們還沒有什麼很特別的功用,不過書上也有講到,這個作法只有在當我們要取代一些子字串時會比較好用,老樣子,範例小姐請上菜:

http://gist.github.com/290625.js?file=gistfile1.rb

下面那個例子是我拿測試為什麼它while的運行狀況,結果很驚人的發現,index只印出了01也就代表說,它很精確的在一開始就找s[“l”]的位置,而不是像我預想的會以Sequential的方式來對整個String做尋找,不知道有沒有人很了解它內部真正在運作的情況是怎麼樣呢??(BTW,我的Ruby版本是1.8.6)

最後也可以用正規表達式 如 「 s[/[aeiou]/] = ‘*’ 」來做Search & Replace的動作,真是驚人!!

這節就先說到這啦,休息去XD~

[Ruby] 3rd Game

3.2.1.6 Backtick command execution

哦耶,要來講Backtick了,就是「`」這個符號,這在很多語言上面都是用來執行外部指令,這個指令真的是很方便,特別是要呼叫一些系統指令來做事的話,這個東西就一定可以幫上很多忙。

來個書上的例子:
http://gist.github.com/289810.js?file=gistfile1.rb

在這我們就可以自己去控制windows這個變數,如果是True的話就代表是在W$下執行這段程式,所以listcmd就要選擇dir,反之則用ls,真是幾行Code就把他用到出神入化XD!!而如果要在String內解析變數的話,就要用#{變數名稱}的方法,這個可能之後會很常用。

3.2.1.7 String literals and mutability

先來段原文:

Each time Ruby encounters a string literal, it creates a new object. If
you include a literal within the body of a loop, Ruby will create a new object for each
iteration.

大意是說,如果是用「字面」的方式去操作一個String的物件的話,在Ruby下會被視為不用的物件,請看下面的例子:
http://gist.github.com/289823.js?file=gistfile1.rb

恩哼,還蠻清楚的吧,我們利用times這個Method來做個實驗,發現他們各自是不同的物件,但是直覺上可能會認為是同一個,所以要避免這種做法。

3.2.1.8 The String.new method

所以我們可以用new這個method去產生個別的物件… 結束了。

其實怎麼用還是看人啦,OO玩到走火入魔的人大概會用String.new(“test”)吧,但是如果是像我這種懶人,只要避免Loop的情況,其他的就讓直譯器幫我判斷吧XD。

3.2.2 Character Literals

哦耶,一直用String真的有點煩,如果只是想要表示一個字元也來個Sring這樣不會太超過嗎??有點殺雞用屠龍刀的感覺,所以在Ruby又貼心的提供了一個方便的小東西叫「字元字面」(好鳥的名字,記英文就好啦)
http://gist.github.com/289852.js?file=gistfile1.rb
我查了一下,這類的變數是屬於「Fixnum」這個類別下的,所以它是以數字的方式來儲存這類的變數(見上例)。

3.2.3 String Operators

在String Class內提供了兩種method,一個叫「<<」、一個叫「+」,來看一下官方的解釋:

1st 「<<」
Append—Concatenates the given object to _str_

2nd「+」
Concatenation—Returns a new +String+ containing _other_str_ concatenated to _str_.

看完了解釋,可以了解到它們都是做了串接的效果,可以把兩個String的物件串接在一起,只是不同的用法而已,來看下面的例子了解一下:
http://gist.github.com/289869.js?file=gistfile1.rb
很簡單吧XD~我這個白痴都看的懂了。

先寫到這,其他的再慢慢更新。

[Ruby] 2nd round

之前忘了說明一下變數型態,下面是一個我提供的例子:
http://gist.github.com/289506.js?file=gistfile1.rb
可以知道Ruby是一種Dynamically Typed Language(和PHP一樣XD),所以在例中,只是Assign的值不同,但是Ruby卻會有不同的解釋(一個是Fixnum類別,另一個是String類別)

2.1.4.3 Punctuation in identifiers
下面這段是書上對於Variable Scope的範例:
http://gist.github.com/289500.js?file=gistfile1.rb

說實在的那樣寫對我這個白痴來說真的是很難理解,所以我又找到另外一個詳細的解說版本如下:
http://gist.github.com/289510.js?file=gistfile1.rb

是不是清楚許多了呀?最後在這邊再以一個小例子來收個尾:
http://gist.github.com/289511.js?file=gistfile1.rb

你這邊一定會說「媽呀,你根本就沒說到Instance variable和Class variables也想打混過去!!」,好吧,你都這樣說了,那我只好再想些例子來滿足你,先看看定義吧:

A class variable is a variable that is shared amongst all instances of a class. This means that only one variable value exists for all objects instantiated from this class. This means that if one object instance changes the value of the variable, that new value will essentially change for all other object instances.

Instance variables are similar to Class variables except that their values are local to specific instances of an object. For example if a class contains an instance variable called @total, if one instance of the object changes the current value of @total the change is local to only the object that made the change. Other objects of the same class have their own local copies of the variable which are independent of changes made in any other objects.

這邊就簡單的翻譯一下它的意思:

Class Variables(類別變數)就是一種可以在同一個類別下的實體物件間互相分享的一種變數,當有一個實體改變了它的值,另一個實體也會存取到被改變後的值。

而Instance Variables(實體變數)則是個別存在於各實體物件下,各自維護自己的實體變數,而不會互相產生衝突。

我知道大家一定不想看英文,我自己翻得也很爛XD,所以我自己用了一個智障簡報來講解一下,看看就好,別太在意,只是想讓大家笑一下XD

(SlideShare真是難看,用Keynote看才可以看到動畫說,我轉了一個Mov檔在下面!)
P.S.原本要直接Embed在文章裡面,不過Hax4.in有點慢…

大概就是這個意思啦,只是簡單解釋一下,反正之後用Code來說明會比較好了解。

參考:Click Me

[Ruby] Get started

最近因為一些實務上的需求(真的嗎),所以不得不試著嘗試用RoR來開發程式,但是因為萬事起頭難,最困難的就是在一開始,所以就先試著了解Ruby這個語言的特性,再來往下階段做開發。

因為說實在的,不知道為什麼國內Ruby相關的資源很少,在網路上都沒有找到什麼比較淺顯易懂的書,所以就隨性上網找到了一本名為「The Ruby Programming Language」的書,就拿它來當cookbook吧。

因為我是從PHP跑來這邊玩沙,所以說實在的我還真的有點很不習慣,先看一下PHP在Wiki上的介紹:

『PHP 原本的簡稱為 Personal Home Page[4],是Rasmus Lerdorf 為了要維護個人網頁,而用c語言開發的一些CGI工具程式集,來取代原先使用的 Perl 程式。最初這些工具程式用來顯示 Rasmus Lerdorf 的個人履歷,以及統計網頁流量[5]。他將這些程式和一些表單直譯器整合起來,稱為 PHP/FI。』– From Wiki

PHP當初是延用了C的風格,再加上一些自有的特色,使得其多了一些較彈性的設計(如使用變數時可以不需要宣告型態)。但是,當我看到Ruby之後,反而讓我有種很難上手的感覺,因為它好精簡,讓我有種當初在寫Perl的感覺(雖然我沒有寫好,對不起c9s XD)。

好啦,廢話不多說,現在就來看看我看這本書時的一些小重點。

3.2.1.4 Arbitrary delimiters for string literals

還記得剛剛為什麼我說它讓我覺得好像Perl嗎,因為它也有支援Syntax Sugar,來看看它是怎麼做到的:
http://gist.github.com/288795.js?file=gistfile1.rb
還真的是很簡單,只要在前面要加個”%”就可以了(Perl 只要 q就好了呀!!!)

下面還說到要怎麼在使用Syntax Sugar時再跳脫那些用來當標記的符號,我覺得如果真的還要這樣子就有點本末倒置了吧…

3.2.1.5 Here documents

這邊再把上面的Syntax Sugar做個延伸,是借用Unix shell的語法,叫做 Here documents,它後面的註解很有趣,它說「因為這個文件就在個原始碼內,而不是存在於外部的檔案」,真是有夠白痴,有講和沒講不是一樣XD。

來看個小Example。

http://gist.github.com/288819.js?file=gistfile1.rb

“<<"和"<<-"的差別就差在後者的close tag的前面可以有空白,但是前者的不行,就這樣子而已。還有個特別強調的地方,就是close tag的後面不能插入comment,插了就會出現一堆錯誤!!這個東西在PHP也有,通常是用來存放HTML的部分,這樣就不用一直一行一行的輸出,算是把View分離的方法,範例如下。

http://gist.github.com/288830.js?file=gistfile1.rb

1st part 就覺牛刀小試一下到這邊啦。

[Hax4] Rainbow

測試頁面:在這、專案資訊:在這

這幾天因為心血來潮,想說來練習一下pure javascript,所以就都不用jQuery來做事情(雖然最後還是有用,不過我只用來做特效而已XD)。這個Idea其實是源於我以前做的一個很爛的liu-translator,它只能單方面做字根對字的轉換,所以就想說利用Ajax的概念來實作一個線上的IME,因此我就去找了之前Luke的網蝦米來研究他的UI介面。

研究了一下後就開始著手動工整個JS的架構,邊看深入淺出Ajax邊試著實作他說的一些思惟,像是要怎麼寫的很MVC,所以就開始學著把程式切成粗略的「資料」、「模組」、「樣式」三類,雖然之間還是有些耦合性,但是比較以前的我,這次的實作算是很成功的分離了。

之後又想到行易公司的練習嘸蝦米的打字程式一直沒有跨平台,只支援該死的M$,所以為何不幫他們設計一個Cross Platform的Web Application?反正只要解決Cross Browser的問題就可以了,雖然我在Cross Browser這條路上只是一個剛入門的新手,但總比Cross Platform好多了吧…因此就把分離完的架構再修改,改成有點像是遊戲的小程式。

原本已經接近完工的狀態了,但是Bu因為是「大新倉頡」的愛好者,所以就給個建議要我加入的其字根對應表,去擴充可支援的輸入法,就又經過了一場編碼和正規表達式的戰爭後,終於把切換輸入法的功能也加上了,這完全要歸因於先前的MVC架構,讓我能夠在很短的時間完成這個動作。

最後一個也是最重要的啦,為了提高遊戲性,我設計了一段可以自動去抓使用者給定URL的頁面回來,把該頁面上所有符合UTF-8繁體中文的字全部抓下來當成題目,這又比起以前行易公司設計的那些題目多了一些趣味。多了這個設計,你還可以邊看Yahoo!奇摩新聞邊練打字咧!!

附上程式截圖:




§2010/05/13 補上程式的Demo連結,原來我都沒有放出來= = ,舊的在這,新的在這
§2011/02/05 更新連結、圖片、介紹。

[Mac] How to enable GD lib ?

意外找到這個開發者寫的pkg檔,真的是一裝就Happy Ending了,省下不少時間,

以下是該pkg檔的特色,記下來給以後有需要的人!!

連結

  • the MySQL and PostgreSQL databases
  • the cURL library for various communications protocols
  • the GD image creation library (with PNG, JPEG, PostScript Type 1 and TrueType font options).
  • the expat XML parser and WDDX support
  • XSLT transformations
  • LDAP access
  • the IMAP client library
  • mcrypt encryption functions
  • GNU gettext

[計畫]想做的事

就在剛剛終於逃離了期末考的魔爪,現在要來列個清單是關於我整個寒假的計畫,能完成多少就多少吧。

  • 讀書計畫
    1. read 愛上jQuery & 深入淺出 Ajax
    2. [Done]read Facebook:性愛與金錢、天才與背叛交織的祕辛
    3. read Introduction to Algorithms
    4. …增加中
  • 工作計畫
    1. EatMe 主站規劃
    2. Hax4   主站規劃
    3. 畢業專題構思
    4. ACM解題
    5. …增加中
  • 其餘活動
    1. 食我出遊
    2. [Done]資轉出遊
    3. 死黨聚會
    4. ??
    5. …增加中

結論就是,等著累死吧!!!!!

[評論]線上購物機制與其應用

在這網路發達的世代,現今的電腦已經不再是當初的電腦了,各種服務和網路都有許多密切的結合,這使得我一直有種想法「沒有網路的電腦,就像是沒有靈魂的空殼」。正因為網路的出現,才真正的賦予電腦生命,讓他思考、成長以及突破,也因此產生了許多可能,而其中一個魔法就是「線上購物」機制(以下稱網購)。
有別於以往,網購這種方式可以說是把『使用者付費』的動作和『網路』這個虛擬平台融合得無懈可擊,現在人們只要線上輸入信用卡號再搭配簡單的基本身份認證,想要的東西就唾手可得、手到擒來,根本就不需要走出家門一步,這種距離的不可取代性,就是促使網購發展的利器。而以下我想用一些例子來討論一下我觀察到的思惟,並從中探討其之所以吸引人之處。

  • 付費方式(Methods to pay)

  • 線上刷卡

    目前的線上刷卡付費方式有很多種,一種是在前文我們提及過的方式,在線上輸入信用卡的使用期限與背面的SecurityCode,這樣就可以做到線上刷卡付費的功能。而另一種是搭配晶片讀卡機並插上實體金融卡來付帳,但是和前者不同的是,因為他是金融卡,是有存額的卡片,所以它的運作方式是及時在刷卡的同時就直接扣除帳戶內的存額,和信用卡累積到月底再結算的制度不太一樣。
  • 線上小額付款

    小額付款系統(Micro Payment)是整合認證、授權和計費三種技術成為一個標準平台,提供給消費者和內容廠商(Internet Content Provider)安全、便利、通用的小額付款收費系統。而這種付費方式是我個人認為門檻最低的一種,因為通常我們的ISP如Hinet或是Seednet甚至是提供手機服務的公司如台灣大哥大等公司都有提供這種線上付款的方式給其用戶,只要一般人有手機或是能上網,就能輕鬆付帳。而其付款方式就是輸入相關的上網、手機資訊及個人資料以供比對後,就可以先享受後付費,在下筆帳單內才會入帳。

  • 虛擬等值貨幣
    目前全世界最大的在線支付提供商是PayPal,它們把實體的貨幣轉換成可以在網路上流通的虛擬貨幣,使得PayPal的用戶可以直接透過線上給予的方式利用網路把真實的貨幣輸送到對象那,而且重點是這是虛擬的等值貨幣,所以可以利用轉帳的方式把這筆金額的金錢轉到指定的銀行戶頭內,再提取成真實的實體貨幣。是有別於前面兩者,PayPal是唯一一個把現實和虛擬完美的接合在一起的線上付費平台,讓它不再只是以往的貨幣,而是一種能依使用者的自我意識存在於網路或是日常生活內的貨幣。
    • 幣值的陷阱(The trap of currency value)

    • 因為幣值之間的匯率不同,所以常常在轉換的時候會有一些落差,而人是一種視覺性的動物,除非你對數字極度敏感,否則通常會陷入這個陷阱,以下我用兩個網路免費空間的付費方案來當作一個例子:

  • 下RapidShare
  • 下MegaUpload(中英)

  • 如果單從數字來看的話,一般的使用者很容易因為字面上54.99比59.99小而認為RapidShare的服務比較便宜因此乎略了旁邊的€和$兩個幣值符號的差別,這就是在網路上有提供跨國服務的公司時常使用的一種商業策略,利用幣值的差異,就可以讓一般的使用者掉入他們所設下的陷阱。在這邊要補充的是,右邊那家公司在各語言版本的網頁上,放的都是同樣的價格,而且都是以美金呈現,如果沒有切換到英文版的首頁的話,我自己都會以為那是以新台幣為單位。

    • 虛擬的紅利(Invisible Bonus)

    網路最大的優勢就是他是一個虛擬的平台,所以現有的服務都是以其為基準所建立出來的,什麼是虛擬的紅利?以論壇為例,它運作的方式就是提供一個可以讓大家討論分享的環境,但是這對於論壇服務的提供者來說,要如何在這上面達到盈利就是一個很重要的問題。而最常見的手法就是利用『積分』、『權限』來吸引用戶的注意力。先以後者為例,管理員可能就會隱藏熱門討論區的可見度,只允許高於一定權限的玩家才可以進入到該區並瀏覽,再以前者為例,這時光是進入子討論區還不夠,還要再付出相對應的積分數才能看到詳細的文章內容,否則也只是枉然。
    在上面的兩個手法就可以看出,『積分』和『權限』就可以視為一種虛擬的紅利,為什麼說是紅利呢?因為管理員可以藉由增加積分和提高權限的方式,以紅利的形式發放出去來吸引更多的使用者,讓他們覺得這個網路空間成為他們生活中一個不可或缺的部分,就達到了成功吸引使用者的效果。但是在日常生活中,我們很難以個人的角度提供出什麼吸引人的優惠來增加客源,假設你是一個才剛創業而且資本額不高的小餐廳,你有可能在一開始就燒錢提供個買一送一的優惠餐券嗎?通常是不太可能的。從一些實例就可以看出,虛擬的紅利在現今的網路世界是一大武器,特別是對於那些想要經營出具有盈收的網站經營者。

    • 宣傳的平台(Advertising platform)

    最後要討論的就是宣傳平台,以前的人們是用口耳相傳的方式來宣傳,現在的人們則是大量利用媒體、新聞等第四權的力量來宣傳,但是在現實世界裡,其宣傳的費用通常不是一個人可以負擔得起的,因此佛里曼(Thomas Friedman)曾在他的書–「世界是平的(The World is Flat)」內提到了網路這台推土機。在這個資訊網路發達的世紀內,要以個人的能耐力拼大公司的話,就要善用這台推土機的力量推倒和他人之間的高牆,因此怎麼善用便成為了一個很重要的議題。所以現在有提供網購服務的站台,都開始把觸角延伸到了虛擬社交平台如目前當紅的FaceBook、Plurk、Twitter等,把一些相關的商品或是活動以訊息或是遊戲的方式滲透到了這些平台,間接的利用社群的力量來達到宣傳的效果,而和那些第四權相比之下,他相對要付出的資金和心力可以說是大大的減少了許多。
    所以如果你是一位想要善用線上購物的方式來經營的一位經營者的話,如果可以善用到上述的一些已經在網路上的應用和現象的話,就能把有限的資源做最有效的利用,就能利用這個藍色虛空打造出自己的一個王國。

    [Mac] dock crash

    之前一直常出現一種狀況,就是有時候整個電腦會停住的感覺,不能用cmd+tab去切分頁、dock整個都不會動。

    去查了一下原來是Dock crash的問題,在這邊可以利用ps or top command 搭配上 kill去把該process刪掉,而Dock就會自動重啟了。

    http://gist.github.com/277106.js?file=gistfile1.sh

    因為我是直接grep出來,所以自己的terminal也會被grep到正在做grep Dock的動作,因此只要挑長的像System/Library/CoreServices/Dock.app/Contents/MacOS/Dock -psn_0_4047836的pid就可以了

    最後就 kill pid 啦。

    2010/01/17✙補充Money說的以process為parameter的另一個指令killall,使用方法如下
    http://gist.github.com/279304.js?file=gistfile1.sh