2011年11月6日 星期日

Nico Instant ( ニコニコ インスタント )

晚上10:40

前言:其實...這個在九月底就寫好了,只是...要放上Chorme套件平台,需要申請帳號並且要刷5塊美金,
因為沒有信用卡可刷,就這樣放置到現在...Orz

簡介:自己本身還蠻常逛nico動畫的,所以就趁閒暇的時候寫了一個搜尋工具。

套件名稱:Nico Instant (暫定)

下載點:https://sites.google.com/site/kilfu0701b/nico-instant/nico_instant.crx?attredirects=0&d=1
    http://goo.gl/xrGnM

使用介紹:
1. 基本上,安裝完成後會看到一個圖示,點圖示後會出現一個popup頁面(如下圖),
 這時候可以輸入你要搜尋影片的關鍵字...


2. 人氣標籤功能:當時只有寫search功能,但是...,當腦內一片空白的時候,
 連我自己也不知道要找什麼影片...(飛踢)。所以,就在左上角寫了一個小工具,
 可以找找人氣標籤。若找不到想要的名稱,可以點"人氣標籤"左鍵一下,
 會隨機抓取其他的名稱,或是直接"查看更多"



3. 一般使用:預設是關鍵字去搜尋,直接輸入要找的關鍵字,下面就會出現搜尋的結果。



4. 其他功能:其實可以用"關鍵字""標籤"去搜尋。然後,也有其他選項可排序,
 比如最新評論、上傳、撥放次數等等。



5. 若想保留剛剛的搜尋結果,不妨把頁面開到新的視窗吧。




誰適合使用此套件:
  經常逛nico、看nico影片的人

誰不適合使用此套件:
  嗯?? Nico是甚麼?好吃嗎?(誤很大)


其他:如果有任何使用問題,歡迎回報錯誤。
   若有其他想要的附加功能,也可推薦一下。







PS:目前作者轉戰Python BBS開發中,有想到其他功能再補上去!

2011年3月13日 星期日

Python with Notepad++

晚上7:46
前言
Notepad++真的是個神兵利器阿,

不只是功能齊全 還有一堆強大的外掛,

這裡就來說一下,如何使用Notepad++來開發Python


設定&使用
STEP 1:
下載安裝Notepad++

STEP 2:
安裝外掛模組...( 原本沒有安裝 )

點選 外掛模組 > plugin manager > show plugin manager

找到並勾選 NppExec,安裝他!

然後重新啟動Notepad++

STEP 3:
可以直接按F6 或是 外掛模組 > NppExec

在使用F6前,先把 外掛模組 > NppExec > Follow $(CURRENT_DIRECTORY) 勾選起來吧


然後,按F6會出現一個對話框,輸入下面這行
c:\Python27\python.exe -u "$(FULL_CURRENT_PATH)"

把它Save成你要的名稱,方便以後直接使用!

執行 GO!

下面就會出現執行的視窗...可以看執行過程。



備註:
1.
這個視窗不只是這樣而已,還可以當作一般的cmd來使用,
可以下指令yooo,還不錯用!

2.
還有就是,Notepad++預設tab可能要改一下,
不然compiler會有錯誤!
可以到 自訂 > 使用者自訂 > tab設定
在右邊的欄標(tab)設定,選python後...把"以space取代"勾起來!

3.
若真的遇到Tab卻又不知道藏在哪裡?
那可以在F6裡面加入一個新的指令:
c:\Python27\python.exe -m tabnanny "$(FULL_CURRENT_PATH)"

這樣就會跟你說哪邊會有tab問題了!

2011年3月9日 星期三

[Python] 使用BeautifulSoup

晚上7:05
前言
最近工作需求,須要從html的網頁抓取特定的資料,

本來想說用Regular expression來判斷過濾,但是這樣反而比較麻煩...

所已找到了一個套件,叫做 BeautifulSoup

它可以拿來parsing html的內容,並擷取你想要的tag以及content資料,

使用上算是蠻方便,至於執行效能上...算是普通吧(?)

廢話不多說,那來開始介紹如何使用吧!


安裝&使用
方法1: 用 pip 安裝
pip install beautifulsoup4

方法2: 用 easy_install 安裝
easy_install beautifulsoup4

方法3: 從原始碼安裝
首先要安裝setuptools
pip install -U pip setuptools

首先到 官方網站 下載python套件!
( https://www.crummy.com/software/BeautifulSoup/bs4/download/ )

解壓縮後 到該目錄下,會看到幾個.py檔案,其中會有一個setup.py,下安裝的指令:
python setup.py install

測試是否安裝成功
python -c "import bs4; print bs4.__version__"

沒有任何問題就是安裝完了!

接著開始寫程式吧...要使用這個libary時,
需要在程式裡加入:
from bs4 import BeautifulSoup

在版本3.x以前,要用這方式
from BeautifulSoup import BeautifulSoup

很多使用方法,在官方的文件都有詳細記載!
英文文件


小範例程式1
# -*- coding: UTF-8 -*-
import sys
from BeautifulSoup import BeautifulSoup
 
reload(sys)
sys.setdefaultencoding('utf8')

# HTML資料
data = [
    '<html>',
    '<head>',
    '<title>TITLE</title>',
    '</head>',
    '<body>Hi!',
    '<a href="test1.html" attr="1">Link1</a>',
    '<a href="test2.html" attr="2">Link2</a>',
    '</body>',
    '</html>'
]  

soup = BeautifulSoup(''.join(data))       # 讀進BeautifulSoup
print "[SOAP]:", soup
print "[HTML]:", soup.contents[0]         # <html>的資料
print "[TAG-NAME]", soup.contents[0].name # 該TAG的名稱
print "[HTML>HEAD]:", soup.contents[0].contents[0] # html > head

print

body = soup.contents[0].contents[1] # html > body
print "[TAG-NAME]:", body.name      # 該TAG的名稱
print "[Parent]:", body.parent      # 往上一個TAG
print "[Next]:", body.next          # 往下

print

print soup.html.head.title         # 直接用TAG的路徑找
print soup.html.head.title.string  # 取得TAG的內容
print soup.findAll('a', href=True) # 取得所有<a>
print soup.findAll('a', href=True, attr='1') # 取得<a>並且屬性attr='1'


上面是一些基本的用法,至於比較進階的用法...

還是去參考文件,有詳細的說明會比較好理解!




小範例程式2
# -*- coding: UTF-8 -*-
from __future__ import print_function

import os, sys, urllib, urllib2
from urllib2 import urlopen, Request
from bs4 import BeautifulSoup
from time import strftime


reload(sys)
sys.setdefaultencoding('utf8')

constellation = [
    [u'牡羊座', 'aries'],
    [u'金牛座', 'taurus'],
    [u'雙子座', 'gemini'],
    [u'巨蟹座', 'cancer'],
    [u'獅子座', 'leo'],
    [u'處女座', 'virgo'],
    [u'天秤座', 'libra'],
    [u'天蠍座', 'scorpio'],
    [u'射手座', 'sagittarius'],
    [u'魔羯座', 'capricorn'],
    [u'水瓶座', 'aquarius'],
    [u'雙魚座', 'pisces'],
]

web_url = "http://mindcity.sina.com.tw/west/12horos/today/"

date_t = strftime("%Y%m%d") # 取得今天日期

for x_list in constellation:
    try:
        url = web_url + x_list[1]
        print(x_list[0], url)
        data = urllib2.urlopen(url)
        soup = BeautifulSoup(data, "html.parser")

        div_lotstars = soup.find('div', {'class': 'lotstars'}) # 找出 div class="lotstars"
        if div_lotstars == None:
            print("div .lotstars NOT FOUND!!")
            continue

        soup2 = BeautifulSoup(str(div_lotstars), "html.parser")
        h4 = soup2.findAll("h4")                 # 找出h4
        p = soup2.findAll("p")                   # 找出p
        for title, value in zip(h4[:9], p[:9]):  # 取前9個
            print(title.contents[0], value.contents[0])

        print("-" * 20)

    except Exception,e:
        print(e)
(這只是測試抓取網頁某些表格資訊,資料使用的合法性我就不清楚了,還是別亂使用比較好(笑))


若比較在意執行效能的快慢,也許可以使用看看lxml這個套件

追記

(2016/10/21) 更新範例程式2, 安裝方法

2010年12月13日 星期一

C++ Vector

晚上11:09
同事問了一個問題,就是要連續輸入String...

然後,將這些String存在array裡面,直到輸入0 才結束輸入...。


剛開始想說用dynamic array去存string

後來開始寫 就想到C++可以用Vector去做到這個需求~


以下為程式碼的部分:

#include <iostream>
#include <string>
#include <vector>

using namespace std;

template <typename>

class Stack{
};

template <class>
void PrintVector(T vec ,U iteral)
{
    cout << "vector data: " ;
    for( iteral = vec.begin(); iteral < vec.end(); iteral++ )
    {
        cout << *iteral << ", ";  // 取值,印出
    }
    cout << endl;
}


int main()
{
    try
    {
        string input = "";
        vector<string> v1;
        vector<string>::iterator iter;

        cout << "### input string until 0 to exit ...### " << endl ;

        do
        {
            cout << "input : " ;
            getline( cin , input );
            v1.push_back( input );
        } while( input.compare("0")!=0 );

        cout << "### end ###" << endl ;

        // 印出Vector的所有值
        PrintVector( v1, iter);
    }
    catch(exception ex)
    {
        cout << "Error !!" << endl;
        return EXIT_FAILURE;
    }
}




...結束!

2010年12月7日 星期二

Java 解析XML ( dom4j )

下午6:03
使用dom4j parsing xml
這裡是用dom4j去parse XML的資料...

首先可以先到http://www.dom4j.org/dom4j-1.6.1/ 或是 http://dom4j.sourceforge.net/dom4j-1.6.1/download.html

下載使用,目前應該是用1.6.1的版本


然後,還需要下面的jaxen
http://jaxen.codehaus.org/releases.html
目前應該是1.1.4版本


用Yahoo的RSS來實作範例
Dom4jTest.java
package fux.xml.dom4j;

import java.io.File;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;


public class Dom4jTest {

    private static Element root;
    private static List<String> name = new ArrayList<String>();
    private static Document document;

    public static void main(String args[]){
        // 建立連線的物件
        URLConnectionUtil urlc = new URLConnectionUtil() ;
        // URL
        String urlStr = "http://hk.news.yahoo.com/rss/business/rss.xml";

        Map<String,Object> map = new HashMap<String,Object>(); 
        InputStream res = null ;

        try {
            // 連線取得資料
            res = URLConnectionUtil.doGet(urlStr, map);

            // 讀取XML檔案
            SAXReader reader = new SAXReader();
            document = reader.read(res);

            // 取得XML Root Node
            root = document.getRootElement();
            // Root Node NAME
            System.out.println( root.getName() );
            System.out.println(  );

            // 印出所有XML DATA
            printXMLTree();

            // print data => /rss/channel/item/title
            name = getAllDataByPath("/rss/channel/item/title");

        }catch (Exception e) {

        }   
    }



    /** print all xml data */
    public static void printXMLTree(){
        printElement(root, 0);
        return;
    }

    private static void printElement(Element element, int level){
        // 依照階層print
        for(int i = 0; i < level; i++){
            System.out.print("\t");
        }
        System.out.print( "<" + element.getQualifiedName() + ">" );
        // 取得該TAG的Attr
        List attributes = element.attributes();
        for(int i = 0; i < attributes.size(); i++){
            Attribute a = ((Attribute)attributes.get(i));
            System.out.print(" (Attr:\"" + a.getName() + "\"==" + a.getValue() + ")");
        }
        System.out.println( " "+element.getTextTrim());

        Iterator iter = element.elementIterator();
        while(iter.hasNext()){
            Element sub = (Element)iter.next();
            printElement(sub, level+1 );
        }
        return;
    }

    /** 從指定的檔案路徑 讀取XML檔案 */
    public static Document loadXMLFile(String filename) {
        Document document = null;
        try {
            SAXReader saxReader = new SAXReader();
            document = saxReader.read(new File(filename));
        }
        catch (Exception ex) {
            ex.printStackTrace();
        } 
        return document;
    }   

    /** 依照Path  印出所有data
    *  example: String path="/rss/channel/item/title"
    *  @param path
    */
    public static List<String> getAllDataByPath( String path ){
        List<String> data = new ArrayList<String>();
        Iterator it = document.selectNodes( path ).iterator();
        while(it.hasNext()) {  
            Element ele = (Element)it.next();
            System.out.println( path + " = "+ele.getStringValue());
            data.add(ele.getStringValue());
        }    
        return data;
    }   
}
範例程式裡面用到了...
URLConnectionUtil urlc = new URLConnectionUtil();
可以從 URLConnectionUtil.java 取得。


需要Include dom4j + jaxen 這兩個jar!


讀取XML檔案、指向XML的第一個Tag:
讀取XML檔案區要用到 org.dom4j.io.SAXReader 裡面的 read( InputStream is );

將檔案存到org.dom4j.Document document,

然後用 root = document.getRootElement(); 取得XML的第一個TAG,

可以把 root 相關的資訊print出來:
System.out.println( root.getName() );


印出XML所有的Tag、Attribute、Data:
這裡是用了下面這行來印出xml的所有資料:
printXMLTree();


其中要從 root 節點開始往下一個個跑,所以需要剛剛這行 root = document.getRootElement();

這是把該Tag裡面,所有的Attribute印出來:
List<String> data = new ArrayList<String>();
Iterator it = document.selectNodes( path ).iterator();
while(it.hasNext()) {  
    Element ele = (Element)it.next();
    System.out.println( path + " = "+ele.getStringValue());
    data.add(ele.getStringValue());
}



指定路徑,取得該TAG:
以下這行,表是用指定的路徑來指定該TAG:
name = getAllDataByPath("/rss/channel/item/title");



這個字串path是用到xpath,這就是jaxen裡的東西了,
List<string> data = new ArrayList<string>();
Iterator it = document.selectNodes( path ).iterator();
while(it.hasNext()) { 
    Element ele = (Element)it.next();
    System.out.println( path + " = "+ele.getStringValue());
    data.add(ele.getStringValue());
}




...


先寫到這裡,有其它的會再補上來!

2010年9月8日 星期三

絕版極品...ATH A9X

清晨7:31
公司裡面...有位同事也是神手級

某天竟然帶來了這支耳機...ATH A9X!!!

上網查了一下有關這耳機的資訊...

沒想到是很久以前生產的耳機啊!!!!


不多說...有圖有真相XD

ATH A9X:











...
....
.....

這支聽起的感覺和A900有一些不同...

感覺在聲音的飽滿度不及A900...

在女聲的表現上已就不失小鐵的強項XD

整體的聲音比較偏亮...但也不失去低頻的味道

不過手頭上沒有A900可以互相比較

所以...也沒辦法寫很多Orz

但是能聽到這隻耳機...真的是心滿意足阿~~~!!!

2010年9月6日 星期一

[不專業開箱] Weston UM1+Fireye I

上午9:18
在總幹事還在台灣的時候,

一起出最後的品嘉敗家試聽團...

不過,我只帶著Kenwood F504的訊源+Grado SR125
(我有帶NB...但是總幹事的uDAC不知怎樣...找不到驅動程式Orz)

那天本來想說買個一千左右的耳機來用用...

問過品嘉老闆後...就拿出Denon C260深海蛇某款(...我忘了)
(本來是要聽C252的...不過好像停產+沒貨了...)

聽完後的感想...C260低頻量真的是很多

深海蛇那隻總幹事拿去聽了...我就沒聽到XD


後來問了一下有沒有AKG K314P...

結果...停產+沒貨

所以就拿出K315P...

很特殊的是...耳機上有開小小的孔(OS:這是半開放嗎XD)

用我的元祖K14P來比較一下...

低頻的部份多出很多...似乎是要補足K14P原先低頻的不足

K315P聽起來感覺比較平均...感覺也失去了部份解析力
(後來手賤...把那個孔用手指蓋住...天阿!!聲音整個變了...有機會可以試看看XD)


後來,又聽了Weston UM1ATH A900...

UM1的隔音真的很不錯,加上又是用海綿的耳塞

一整個舒適度破表!!!(OS:突然讓我很想買下來...)

在聲音和樂器的表現上也很平均...

蠻符合我的口味...XD


A900的耳罩戴起來也很舒適...

聲音也很暖...在人聲的表現上果然只能用""來形容!!!
(OS:害我也想存錢買一隻回去享受XD)



然後,中途還有聽了一台萬元的LIBBY...

說實在的...不知道是訊源不好還是怎樣的

這台讓我沒有很心動...也沒想要成為將來升級的目標...XD



不知不覺...試聽完後就到了晚餐時間

所以,只好先去吃飯...等吃飽後再回來做選擇...

在這吃飯的途中...

一直和我心中的惡魔做掙扎奮鬥...

一方面是耳朵上享受...一方面是錢包中的銀彈怕會短缺

...
....
.....

掙扎了很久...走回品嘉後......

我還是直接買了UM1

然後也有加購火眼的活動

就順便把火眼I...一起帶回去了Orz


回到家後...老樣子先拍幾張照片

Weston UM1的盒子:


內容物:


說明書:


耳機:




海綿耳塞:


收納小盒子:






接著是加購的火眼一:


收納用小袋子:


正面外觀:


底部:



就這樣子拉...享受音樂去XD