大貓共和國

Meow

OpenFoundry疑似烏龍事件?

今天無意間發現中研院OpenFoundry有一篇文章,作者名稱是我的「本名」,但該篇文章並不是我發的。事實上,我的姓氏及名字都不是很常見,google一下大概我的本名,大概可以猜測台灣地區華人並沒有與我同名同姓的人。

中午才看完「盜圖者,剛剛賠了我十一萬」這篇文章,遇到這個狀況真怕有人誤會我盜文。為求自我保護,我立即去信OpenFoundry反應此事,在此公佈我的信件內容。因為該文上還有我的個人資料,故涉及該文及我的個資的部份,我會消音處理:

您好:

今天在瀏覽OpenFoundry網站時
無意間發現了一篇文章:「AAAAAAA
(該文網址: OOOOOOOOOOOO )
作者姓名竟然與我的名字相同,但本人並未在貴站發表該篇文章。

原懷疑為同名同姓,但本人姓名相當罕見
資訊領域有人與我同名同姓的機率應相當低。
另外,以該文標題至Google搜尋
竟然發現BBBBBB索引網站收錄該文時,附帶著我的真實姓名及E-Mail
(目前在此網址可以看到:OOOOOOOOOOO )

因此,本人懷疑此次事件為OpenFoundry網站問題,造成我的個人資料外洩
若真的是這樣的問題,我想要麻煩貴站站方做以下處理:
1.將我的名字從該篇文章中刪除
2.聯絡BBBBBB站方,將我被索引的個資刪除
3.釐清並解釋問題發生的原因,避免此問題再度發生

為避免有人懷疑我抄襲原作者的文章
基於自我保護,我會立即將本信部份內容公開於本人Blog上

期盼站方盡速處理此事

Best Regards,
XXX

Blogtrans更新

剛剛突然想到,之前Blogtrans有改一些code,但一直沒放出來。看了一下git log….2009/05/26(汗)。

順手打包了一下,上傳到sourceforce,雖然code是一年多前寫的(汗)

增加Blogger匯入功能
處理一些無名XML不是well-form的狀態,或者是出現UTF-8不合法的字元
* 增加UnitTest,順便修正了一些minor problem….

新版的程式一樣可以在Sourceforce抓到

[FLOLAC]心中有Monad,萬物皆Monad

1.打完之後才突然發現….我原本只是想打個輕鬆的心得文,怎麼搞的那麼嚴肅 Orz

2.竟然遇到小我X(消音)屆的高中+大學學弟,嚇然發現自己變老人了

3.我給了幾個人聯絡方式,可是後來才想到我沒拿任何人的聯絡方式。如果有同學看到歡迎回個文。

正文開始 Orz




星期二時,scm老師談到「今年FLOLAC中,Functional Programming的課比較少,選用的是OCaml而不是Haskell,不會討論Monad之類的東西」。有趣的是,我覺得「就Operation Semantics的角度,來討論imperative program的derivation」,這件事本身就有濃厚的FP味道存在。

首先,從最基本的<s1, s>->s’談起:給予一個statement S1及初始狀態s,會得到最終狀態s’。對於deterministic semantics,<s1, s>->s’ and <s1, s>->s” imply s’=s”。換句話說,如果將S1視為一個routine,給予相同的input,會得到相同的output,這不就是pure function的定義嗎?另外就像Josh Ko談過的:與其說FP沒有side-effect,不如說FP沒有implicit state。然而<s1, s>->s’這樣的表達法,也讓imperative language中的所有狀態變化被攤開來,使其在某些方面可以像FP一樣地分析。

接下來,舉出老師在課堂上給的兩個quiz:

原本derivation只做到statement的層次。如果要將arithmetic expression做derivation,其型別應該是什麼?(Ex. x = y + 5; )
如果語言中出現「具有side effect的arithmetic expression」,其derivation的型別是什麼? (Ex. x = ++y; )

假設算數運算的值域為整數,其中第一個應為<AExp, State> -> int。第二個應為<AExp, State> ->(int, State)。這個答案其實很直觀:前者只要求值,後者求值順便變更狀態。這不是跟State Monad中的一些型別很像嗎?
  • 語意為「修改狀態不求值」
    <Statement, State>->State
    execState :: State s a -> s -> s
  • 語意為「不改狀態只求值」
    <AExp, State> -> int
    evalState :: State s a -> s -> a
  • 語意為「又改狀態又求值」
    <AExp, State> ->(int, State)
    runState :: State s a -> s -> (a, s)

State Monad是pure functional language中可以模擬imperative language的關鍵,而Operational Semantics又以接近pure functional的方式去分析imperative language(在不涉及parallel與nondeterministic的情況下)。上OP的課時,我反而在心中印證了對於FP的認知。

2010-06 久違的Blog更新

十個月沒更新文章了,把最近的事摻在一起記一記:

  • 「大鳥共和國」改名為「大貓共和國」(Kero?)
  • 看了龍紋身的女孩(?)
  • 參加了Google Code Jam 2010的比賽,在Round 2(3000名取前500名)被刷掉了
  • 今年終於跟公司請了十天的假,去參FLOLAC 2010的課程

看完了龍紋身的女孩三部曲,讓我熱血(?)的研究了一陣子破解技術
雖然目前還只是基礎Wargame都可能卡關的肉腳程度啦

我大概還滿嚮往「在資訊領域中極度自由」的感覺的
不管是「在Open Source的世界中,想要什麼都可以自己來」
或是「在資訊安全的領域中,如入無人之境」

不過這種「想要什麼,信手拈來」的自由,先決條件是在該領域各方面都很強吧…

GCJ打到前3000名不是什麼太好看的成積
沒啥好說的,就是基礎功不夠強吧…

一直以來我都用這樣的理由說服自己
「對於這方面競賽的能力不夠強,
 只是我沒針對Online Judge比賽需要的能力(演算法、解題速度等)做特訓,
 而把學習重心放在程式語言、API設計等等,需要架構高階複雜邏輯的地方」

其實這根本是藉口藉口藉口藉口藉口
在比賽中,基本功的不足之處,會一一無所遁形的暴露出來
演算法、離散數學、機率統計(這個比較少,但寫練習時有一題是要用機率的)
甚至資料結構的規劃也有問題,有時code寫到一半才發現結構redundant & stupid

從大學、研究所、工作,常常聽到
「這些東西還好啦,除非你從事演算法或學術相關工作,否則用不太到」這樣的說詞
真的是這樣嗎?我想不是的
這些基本功的強度會直接影響思考邏輯、工作速度、程式碼品質

依我前陣的子的個性,可能是不會把這段寫出來的
(因為過個一兩年,回頭看自己的文章時會覺得「啊啊啊,當時的自己又弱又愛胡說八道」)
但依我懶惰的個性,搞不好過一陣子就忘了這件事,一年後還是沒有針對基本功做加強
寫下來給自己當的目標吧,目標GCJ 2011前25名,加油!


最後,關於FLOLAC 2010
自我一兩年前對Functional Programming産生興趣起,就一直對這個課程有興趣
今年終於向公司請假去參加了,大概也會遇到一些收看此Blog的網友吧 :)

用git管理具有external的svn Repository

睡不著爬起來寫blog,明天要早起的說 Orz



git是一套目前非常流行的分散式版本控制系統
相信很多人和我一樣,熟析git後就不會想用svn或cvs來管理源碼

我最近碰到這樣的問題:
專案主要使用svn做版本控制,但是我個人想用git管理
大家第一個想到的應該是git-svn
但git-svn對於svn external的支援並不完善

然而我目前的專案大量的使用了svn:external

src/
src/A => external to another project
src/B => external to another project
src/C => external to another project

更糟的是,因為專案開發時間的因素
A,B,C專案與主專案是共同開發的
有的時候我必需修改external library的API,並commit回去
有時其他人修改了external library,主專案必需跟著修改
(I know it doesn’t sound good, but it’s real world problem…)

我試過不管是單純的使用git-svn,或者借助一些shell script
都無法順利的處理這個工作流程

直到今天我想到一個實在是很瞎的方法:

mkdir gitrepo
cd gitrepo
git init
svn checkout svn://my-svn-repo-addr svnrepo
echo .svn > .gitignore
git add .
git commit
git chekcout -b svn-tracker

白話解釋一下:
在gitrepo/ 開一個git repository
在gitrepo/svnrepo 開一個svn repository
把.svn ignore掉 =.=
做一個名為svn-tracker的branch

這個看來愚蠢的方法 (對我目前的環境) 出手意料的好用
在改code時我都切換到其他branch (並且忘了svn的存在)
做任何svn操作時,我先切回svn-tracker branch

要做svn update的話就是
svn update
git add .
git commit -a

要commit自己的東西回svn mainstream就是
git merge work-branch
svn add *
svn commit

當然這些事可以寫shell script來完成



目前最大的缺點大概是沒法將git branch對應到svn branch (很麻煩)
不過還好我沒有很在乎….反正mainstream svn上沒有人在用branch & tag 功能,大家都只改trunk



這樣做還得到了意外的好處:
當要回退到舊版本時,如果沒有特別指定external的revision
就算update trunk to older revision,external還是會是最新版的
這樣會造成舊trunk + 新external,版本不相容的問題 (如果external行為或API有變)

上面的流程,每跑一次svn update
就等於把當時的情況做一次snapshot存進git
之後也就可以正確地回退版本….