2012年5月28日 星期一

[python]dict[x]後串接list()

使用python寫程式時,會遇到需要整理資料的場合,最好是用資料的類別或者ID做索引,對於資料的呈現或是寫入資料庫時,程式都有比較好的架構,但是python只有支援dictionary和list並沒有整合的data structure,所以要自己寫一個。
因為當初自己寫時有遇到些問題,所以配合這一篇,把寫法記錄下來,希望對要用到的人會有幫助。

1. 在要新增一筆資料的時候檢查是否已經被初始化為list
d = {}
d[key] = list()
d[key].append(value)
初始化後就可以使用.append()當成list用了,不過需要檢查是否已經被初始化過了,避免重複初始化。
initialize
d = {}
check
if key not in d:
    d[key] = list()
d[key].append(value)
2. setdefault

initialize
d = {}
setdefault
d.setdefault(t,list()).append( c )
會將dictionary預設為list()

2012年5月20日 星期日

修改 :link :visited :hover等等CSS的預設屬性


    在寫網站CSS的時候,有會需要將一段文字超連結,所以會在文字外圍使用<a>這個標籤包覆,問題是CSS有預設:link :visited :hover的一些特性,所以可能導致自己寫得內容被覆蓋過去,這個時候在CSS檔案裡面的開頭加上

a:link
    color:inherit;
    text-decoration:inherit;
}
a:visited{
    color:inherit;
    text-decoration:inherit;
}

a:hover{
    color:inherit;
    text-decoration:inherit;
}
就會去看是否樣式已經被設定好了,如此自己寫得樣式就不會被覆蓋過去了。

2012年4月18日 星期三

打造你的專屬VIM Editor - 簡報釋出



        會有想要講這個的念頭是因為看到小畢的那場talk,其實我們很早就在預謀了(誤),在很爽快地訂日期之後馬上想到當天是自己生日,但是自己想要有個跟以往不一樣的生日,所以選擇了扛下這場演講,而且當消息放出去以後,自己就會強迫自己檢視自己到底學會了什麼,順便把以前想要學的,但是總是沒時間的技巧拿出來徹底研究,也整理了.vimrc,並認真思索怎樣才可以把一個這麼好的編輯器推廣到大家手上,也希望可以透過演講降低使用vim的門檻,選擇了一個這麼刺激的事情來當自己的生日禮物其實還蠻特別的,但是明年我會選擇吃蛋糕唱歌XD

2012年4月4日 星期三

talk (4/12): 打造你的專屬VIM Editor - Create an editor belong to yourself.


「生一個VIM會不會比較快?」...

「還在用難用的IDE寫CODE嗎?」
「如果今天你有多台電腦,還在一一調整編輯環境嗎?」
「你擁有24吋大螢幕,卻還只用14吋小空間來寫程式嗎?」
「用筆電寫程式,如果沒帶滑鼠,就像是行走在程式大漠中窒礙難行嗎?」
「常常覺得同樣的事情,但是要按很多鍵很麻煩,但又沒辦法寫個script來完成很不方便嗎?」

VIM不是什麼,
VIM是什麼!

        VIM是一個開起來很快,寫起來也很快,放棄起來更快的純文字編輯器,他有著系統預設很好的游標移動能力,跟複製、可數的操作性,是程式快速編輯不可或缺的強力大手,但是自從大一被強迫接觸他以後,很多人對他有很深的誤解,因為「他只不過是可以編輯文字的黑嘛嘛的東西。」很多人在DEV C++寫完作業以後,也只是簡單的vi :wq然後下gcc的指令去看看程式在伺服器上有沒有問題,而且他討厭的地方有很多,例如不能使用滑鼠、輸入文字要按i、存檔還要打指令,但是這其中一定有什麼誤會,其實VIM是很耐斯的,這次分享雖然不冀望會有人跳過去使用他XD,但至少知道他可以幹什麼,如果你今天要換編輯器的時候會考慮過他,減少世人對他的誤會。

        而之所以要用VIM是因為程式設計師寫程式最常接觸的,不是IDE的整合介面,也不是花花綠綠的功能列,是文字編輯介面的本身,如果是使用比較普通的IDE,最基本的要求一定是「行號」、「縮排」、「syntax highlight」,更多一點,是加速編輯的熱鍵,那如果今天打錯了,要修正怎麼辦?當然你可以說「很簡單,移動到滑鼠上點選你想編輯的地方,或是選取你想刪除的地方,或是說使用鍵盤上的←↑↓→。」直覺,但是很慢;但是如果你今天使用的是VIM,只需要切換模式(甚至不用切換),就可以利用操作和數字的組合出快速的移動並且隨心所欲的修改。

        分享的過程中,會從文字編輯器最常用到的功能開始分析比較VIM和IDE之間的差異,告訴你如何選擇一個適合你的文字編輯器,即使你最後的選擇不是VIM,也希望你知道如何找一個好的歸屬,而不是隨著程式語言漂泊在不同的IDE上;而在你熟悉基本操作之後,如何去安裝第三方的plug-in讓你的編輯速度可以快速攀升,而不在只是停滯在前面的曲線。


時間:4月12日 晚上7:33
地點:成大資訊系館 4261 教室
講者:魏聖儒 (老魏/Lucas)
講題:打造你的專屬VIM editor


一起來打造屬於你的editor \^O^/

2012年3月12日 星期一

Now.in事件,我自己的一點點心得


關於Now.in:
    最早最早,是看我妹在使用Now.in這個網站,因為上面有很多很炫的新歌,只要開著瀏覽器,就可以收聽很多歌曲,而且上面總會有些電台撥放的是自己喜歡的曲風,有人幫你規劃好了歌曲和撥放順序,對於愛聽音樂,卻懶得整理的人來說簡直是一大樂事。
    對於另外一部分的使用者來說,他裡面有個很酷的功能,就是可以一邊聽廣播,一邊和同時收聽這個電台的聽眾一起聊天,分享自己今天生活上的小事情,是不是被人欺負了、或是受到了什麼委屈,躲在匿名的後面,伴隨著DJ的背景音樂,我想那是一個很放鬆很棒的地方,多好的網站! 一直到某天,看到社群網站上大家分享的曾經,我有個夢想….,我才知道原來Now.in因為涉及侵害唱片製作人的權益,被調查局要求馬上關站,之後剩下的,就是一堆訴訟程序...

    頓時間有點錯愕,但是因為自己對於法律還有智慧財產權並不是很懂,所以上網看了許多文章,其中個人認為最理性客觀的文章有兩個:

Mr./Ms. Days (MMDays) – 我看 Now.in 爭議 (落落長)
    裡面寫到了經營Now.in網站的難度,也必須承認是Now.in的疏失,可以理解「在網站快速start-up之初,很多決定都是非要之惡。」因為當你不知道這個網站是否會成功的時候,去考慮太多財務、法律問題,只會使得你更卻步,更不用說創業的,當然是先做了,遇到問題再一起想辦法解決才是最好的,可是現在侵害了網站的權益(不論是否是平台本身),當然會被挨告,而且歷史上很多類似的事件跟有名的軟體(當年有在使用ezPeer也是看著他瞬間就被抄掉),實在很不小心。

而INSIDE - 從Now.in事件談起:盜版音樂不是打倒版權大頭的銀彈
    則花較多筆墨在描述唱片業者,面臨的問題和現在使用的方法,因為現在有點屬於新舊產業變革時,很多市場方便和利益,是需要被重新衡量的,而在本土唱片業者去改變體制之前,指有些零星的變革在嘗試改變,不過以台灣的市場來說,目前應該是沒有大規模的新模式。

而我則是利用在上完課之際,跑去和法律系的教授討論了一下這件事情,並問了一些想法如果在面對訴訟的時候是否可行

  1. 雖然Now.in提供這個服務,但是侵權的是使用服務的DJ,那我身為這個「服務提供者兼平台」,是否有觸犯法律?
    • 對於這個教授則表示說,網站本身提供的服務是沒有觸及法律,但是你今天提供了這種服務,你就是可以「明顯預期」的會發生類似侵權的事情(例如DJ手上的音樂來源是否合法?是否擁有公播權?),你就應該設法要制止,並且是有效率的;(例如Youtube本身就是會去抓使用者的影片來源是否正當,如果不正當就會進行停止撥放的行動。)
  2. 如果我在提供服務之前,就有申明「請確保自己本身擁有音樂之公播權。」等等的申明條款,是否我就沒有責任了?
    • 答案是否定的;原因就如同前面,你已經可以明顯預期會發生類似事情,你除了申明外,也是要積極制止。(當時我有想過沒有設定的原因可能是因為技術上有困難,我想到的方法只有建立一套database去進行過濾,因為Now.in上會顯示歌名)
  3. 調查局直接要求停止服務是否過當?
    • 調查局確實沒有權利要求停止服務,他只是在減少侵權損害的最小化,你也可以要求等訴訟判決確定以後,如果輸了,在停止服務,但是,當下停止所有服務有個最大的目的就是表態說「對於侵權這件事情,本身並不是故意的。」,並拿出誠意減少責任。
    在討論過後,就大抵可以了解,如果你今天是創業者本身,你自己應該要怎麼處理類似的情形,其實我當時有想過,如果只是停止侵權的部分,「那我只要把音樂撥放的軟體功能停掉就好啦!」,後來和 Ijs 聊到才說如果剩下聊天的功能好像也沒什麼用,而且如果讓使用者在不了解前提的情況下在網站上面抗議、謾罵,反而只會使這件事情越來越糟,就像事情發生之後,某些人對於這件事情馬上下定論,並且用有點族群意識的文字來聳動大家達成自己目的;

    而另一方面,在我問這個問題的當晚,成功大學內部剛好有場演講,講題是不合時宜也沒有關係-達人的價值,講者是陳瑞凱(阿凱)-1976樂團主唱,他是個超喜歡音樂的音樂人,也花了很多時間在音樂上面,唱片業者也給了他很多幫助,不過在最後他有提到,從以前,唱片業是一個很酷炫、大家都想要進入的行業,到現在的唱片業是用比他預期還要快的速度在式微,他自己本身也很希望能夠幫助唱片業者什麼;
所以到也不會覺得唱片業真的是有如握有眾多資源的洪流猛獸,他也曾經是養活很多人的一個傳統產業,而在網路種重的打擊過後,會對於很多侵犯權益的人去進行攻擊也是可以理解的,而或許我們應該站在兩方的角度想,而不是一昧地去想如何打倒唱片業這隻猛獸,去設計新的模式來製造新的局面,讓唱片業者、創業者本身、還有喜歡音樂的人能夠都取得自己需要的,並且在精簡唱片成本之後,可以更輕鬆、便宜的拿到好音樂,我想是所有人都可以嘗試著去想、去解決的問題。

2012年2月27日 星期一

"Python.h: No such file or directory"

剛才在安裝lxml的時候,遇到了一個意外的問題
Building against libxml2/libxslt in the following directory: /usr/lib
src/lxml/lxml.etree.c:4:20: fatal error: Python.h: No such file or directory
compilation terminated.
error: Setup script exited with error: command 'gcc' failed with exit status 1


只好去GOOGLE才發現原來要安裝 python-dev 就可以了

# sudo apt-get install python-dev

ps:我有安裝python2.7 python3.2 誰會知道還要安裝 python-dev 阿(翻桌)

2012年2月22日 星期三

如何處理textarea內文字編排或插入

    這次為了寫微算機project,趁機研究了一下bootstrap和textarea內的文字操作,一開始以為javascript內有函式可以引用,不過後來發現需要自己寫,而且牽涉到textarea的操作還有內建的物件的概念,所以就寫了筆記記錄下來。

因為我想要捕捉使用者游標的位置,所以我設定了一個cursor object

function cursor (e) {
 this.e = e;
 this.prefix = e.value.substring(0, e.selectionStart);
 this.suffix = e.value.substring(e.selectionEnd);
 this.start = e.selectionStart;

 this.insertTextInCursor = function(text){
  this.e.value = this.prefix + text + this.suffix; 
  codeboard.setSelectionRange(this.start+text.length,this.start+text.length);
 }
}
利用event(e)內的數值來儲存原本的文字(prefix+選取的範圍+suffix),而start則為游標的目前位置
設定+text.length則會在你插入新的文字之後,游標就會自動移動到插入文字後的位置。

裡面只有一個method用來在游標的位置插入,
把滑鼠和鍵盤對textarea做操作時候的event設定好,使得他在每次受到改變範圍的時候,都會重新建立一個位置以保持正確的位置就可以了(範例使用jQuery)


$("#codeboard").mouseup(function(){
 cur = new cursor(codeboard);
})
.keydown(function(e){
 cur = new cursor(codeboard);
});