Tuesday, September 27, 2005

Ruby - 為何 Range 不能大到小?

(1..10).to_a
=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

(10..1).to_a
=> []

所以

for i in 1..10 do
puts i
end

會印 1 到 10

for i in 10..1 do
puts i
end

卻不會印 10 到 1

雖然可以用 10.downto(1)

不過還是太 Orz 了....


  • 留言者: Duncan
  • Email:
  • 網址:
  • 日期: 2005-09-27 11:48:25

或許 Python 更適合你。








  • 留言者: JiaYun
  • Email:
  • 網址:
  • 日期: 2005-09-27 13:49:19

Python:


for i in reversed(xrange(1,11)):

print i


這學期有個 project 有點想用 Ruby on Rails 做


如果 Python 的話也許可以用 http://www.djangoproject.com/


不過有辦法學那麼多嗎.... Orz








  • 留言者: T55555
  • Email:
  • 網址:
  • 日期: 2005-09-28 02:36:30

Please check the ruby-talk: 8993 and 39342


http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/8993

http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/39342


And be aware of Range using on Array index:

For example:

ary = %w[a b c d e]

ary[1..-1] # => ['b', 'c', 'd', 'e']


If we *assume* Range support from "big" to "small",

the example 1..-1 will like have 1, 0, -1 elements

and ary[1..-1] will returns ['b', 'a', 'e']

but the current design is not like this way ...


The main raison Range do not support from "big" to "small" is

because the Range is define base on object's "succ"( or alias "next") and ""


BTW: You could "redefine" the Range to behaviour as you like.








  • 留言者: T55555
  • Email:
  • 網址:
  • 日期: 2005-09-28 02:41:17

"succ" and " < = > "

後面是 *宇宙飛碟* operator.








  • 留言者: T55555
  • Email:
  • 網址:
  • 日期: 2005-09-28 02:55:29

Not prefect at all ( need to take care of === also, string Range ... etc),

but it seems to work for what you expect.


class Range

alias old_each each

def each(&block)

return old_each(&block) unless first > last

first.downto(last) { |e| yield e }

return self

end

end


p (1..10).to_a

p (10..1).to_a

(10..1).each { |e| p e }








  • 留言者: JiaYun
  • Email:
  • 網址:
  • 日期: 2005-09-28 03:18:35

也許它可以加個 pred 或 prev, 再把用在 array 的情形改一下, 功能上會更對稱一點....


我好像 柯南 - 引爆摩天樓 裡那個超執著對稱的森谷帝二教授.... XD








  • 留言者: Duncan
  • Email:
  • 網址:
  • 日期: 2005-09-28 16:19:31

可以用 range(1, 11)[::-1] 或是 xrange(10, 0, -1)。








  • 留言者: JiaYun
  • Email:
  • 網址:
  • 日期: 2005-09-29 01:18:24

我想搭紅寶石列車,Duncan 集團誘惑我乘巨蟒....

Thursday, September 22, 2005

膠帶殘膠去除術

有時一些東西被膠帶貼到,膠帶撕下來後上面會殘留黏黏的膠

如果是表面光滑的東西,只要用橡皮擦擦一擦,應該就能弄掉了

書的封面,塑膠表面.... 都滿好用的

Friday, September 16, 2005

柯南劇場版9 - 水平線上的陰謀

毛利小五郎又做出了偶爾會出現的細膩推理 :P

我覺得最精彩的是推測兇手為何側著身子.... 連柯南都忍不住說了句『なるほど』

如果只是不想讓人看見臉,確實只要把頭低一點或再稍微轉到一邊就好了,沒什麼必要側身

Thursday, September 15, 2005

Fedora Core 4 & Subclipse

之前 Fedora Core 3 的 Subversion rpm 沒附 javahl,要用 Subclipse 實在很麻煩(svn command line 模式又問題一堆不能用)

現在 Core 4 有 subversion-javahl 這個 rpm,只要裝好把 libsvnjavahl-1.so 這個檔 ln -s 到 java 目錄下的 jre/lib/i386 就好了,Subclipse 本身有 svn-javahl.jar 所以 subversion-javahl 附的這個 .jar 可以不用理會

Saturday, September 10, 2005

動畫兒童去上學了

我媽媽幫人帶的小女孩去上幼稚園了,她還沒生下來就開始看動畫,現在連海賊王都有看

有一天她對我說:『我去上學會不會發現魯夫?』

我說:『發現魯夫怎麼辦?』

她說:『發現魯夫,我就喜歡他!』

我說:『發現香吉士呢?』(她最喜歡魯夫和香吉士)

她說:『發現香吉士,我就打扮成水蜜桃姊姊的樣子讓他喜歡我。』

每次看到我電腦上 Eclipse 的 logo 都會說『我要看星球,快點按.... 快點....』,打開來之後她又都不覺得那就是她想看的星球....XD

Friday, September 9, 2005

開學前的不幸

硬碟掛一顆,LCD 畫面怪怪的

LCD 修理不知道要多久,還好 CRT 還留著,可以暫時用,只是畫面會閃爍抖動.... 嗚嗚

硬碟三、四年了,那時保固好像都只有一年或三年,只好再買一顆

滿有趣的是 Seagate 和 Maxtor 的硬碟現在都保固五年,Maxtor 的還終生可以維修

跟之前過保固就不修理的情形差真多,大概是為了競爭的關係?

我就受終生保修的誘惑,買了 Maxtor 的....

不過硬碟檢查工具上 Maxtor 可以再加強,之前 Seagate 提供光碟 image 檔版本了,Maxtor 還只有磁片版而已。現在 Maxtor 也有光碟 image 了,不過還沒有像 Seagate 那樣漂亮的 GUI 介面,掃描時也沒有百分比的進度表.... :P

壞掉的那顆硬碟很奇怪,比較常用的 Linux / 分割區都沒壞,從那個分割區之後開始壞

我用 SystemRescueCd 開機,再用 Partimage 把那個分割區備份出來,省了重灌 Linux 的功夫。用的時候發現 Partimage 有個要注意的地方是,要還原 image 回去的分割區不能比 image 來源分割區小.... 我一開始還想說它既然會偵測有使用的空間有多少,要還原的分割區只要比使用到的空間大就好了,原來不是。

Thursday, September 8, 2005

Eclipse - 將輸出導入檔案

有時執行程式會用 > filename 將輸出導入檔案

Eclipse 3.1 開始也可以將 output 導入檔案

這頁最底下倒數第二點

Your program's output can now be captured in a file in addition to being written to the console. The behavior is controlled by settings found on the Common tab of launch configurations.

NetBeans - 更改 Output Window 字體大小

編輯 NetBeans 目錄下的 etc/netbeans.conf

netbeans_default_options="--fontsize 16 ... 略 ..."

不過會連整個介面的字體大小都改就是了

Fedora Core 4 下 JDK 1.5 中文設定

沒記錯的話 Fedora Core 3 時 JDK 1.5 什麼都不調,中文就有正確顯示

換了 Fedora Core 4 和 JDK 1.5.0_04 中文卻變成框框,除非用 GTK look and feel 才會正常

這裡提到的設定 可以不用 GTK L&F 也能正常顯示中文

把簡單的方法節錄一下:

1. 建立 $JAVA_HOME/jre/lib/fonts/fallback 目錄

2. 將中文字體 cp 或 ln -s 到該目錄中

Sunday, September 4, 2005

美麗「得」要命

不小心看到 這串討論

感覺可以在其中看到各種類型的人

最讓我吐血的有兩種:

一種是講得好像頭頭是道,可是都是錯的

另一種是差不多先生(有些還很嗆)

感想:請愛用 教育部國語辭典,裡面就有 說明

Thursday, September 1, 2005

Array Slice

這幾天在看 Programming Ruby (2nd. Ed.)

看到 Array 部分時,好奇試了這些個東西

a = ["a", "b", "c", "d", "e"]
a[3, -2]
a[3..1]
a[-1..1]
a[-1..-3]

結果

a[3, -2] => nil
a[3..1] => []
a[-1..1] => []
a[-1..-3] => []

我想要是我來設計,大概會給它弄成這樣

a[3, -2] => ["d", "c"]
a[3..1] => ["d", "c", "b"]
a[-1..1] => ["e", "d", "c", "b"]
a[-1..-3] => ["e", "d", "c"]

因為既然負的 index 是由最後往前數(a[-1] => "e"),我會覺得取好幾個也要有由後往前取的功能 :P


  • 留言者: T55555
  • Email:
  • 網址:
  • 日期: 2005-09-01 19:21:15
Welcome to the Ruby World.





The [] rule is also apply to []=


So, if a = ['a', 'b', 'c', 'd', 'e']


and if a[3..1] => ['d', 'c', 'b']


What you would like to see if you write something like


a[3..1] = [1, 2, 3, 4] ?


a will become to ['a', 4, 3, 2, 1, 'e'] ?





One good thing about Ruby is everything are open.


Even the core library.


There are also calibre and facets project to change the array index to the way they like.





I can easily change the length negative value behavior as you like ( the Range one, leave to yourself to do it) , for example :





class Array

alias_method :old, :"[]"

def [](*args)  # define my new [] method for Array

begin

old(*args) unless args.length == 2 && args.last < 0

(0...-args.last).inject([]) { |a, i| a << self.slice(args.first - i) }

rescue

old(*args)

end

end

end



a = %w[a b c d e] #=> a = ['a', 'b', 'c', 'd', 'e']

a[3, -2]          #=> ['d', 'c']



So, if you don't like the default way, change to what you like.





On Ruby, you could even change 1+1 to become 3 if you like. :-)






  • 留言者: JiaYun
  • Email:
  • 網址:
  • 日期: 2005-09-01 20:41:12
Yes, I will let a be ['a', 4, 3, 2, 1, 'e'] after a[3..1] = [1, 2, 3, 4].





And I finished the homework, but only [] not []=.




class Array

alias_method :old, :"[]"

def [](*args)  # define my new [] method for Array

begin

if (args.length == 2 && args.last < 0)

(0...-args.last).inject([]) { |a, i| a << self.slice(args.first - i) }

elsif (args.length == 1 && args.first.class == Range)

range = args.first

first = range.first < 0 ? range.first + self.length : range.first

last = range.last < 0 ? range.last + self.length : range.last

if (first > last)

length = (first - last).abs

length += 1 unless range.exclude_end?

(0...length).inject([]) { |a, i| a << self.slice(range.first - i) }

else

old(*args)

end

else

old(*args)

end



rescue

old(*args)

end

end

end



a = %w[a b c d e]

a[-1..-3] #=> ["e", "d", "c"]

a[-1...-3] #=> ["e", "d"]

a[-1..1] #=> ["e", "d", "c", "b"]

a[-1...1] #=> ["e", "d", "c"]

a[4..2] #=> ["e", "d", "c"]

a[4...2] #=> ["e", "d"]







  • 留言者: T55555
  • Email: ruby55555@gmail.com
  • 網址:
  • 日期: 2005-09-02 00:09:54

Ooops, I found my bug ...


The line

old(*args) unless args.length == 2 && args.last < 0



should be like

return old(*args) unless args.length == 2 && args.last < 0