2014年10月29日 星期三

[NodeJS] domain-parser

晚上7:58
NodeJS - domain-parser
前言:
剛好想要這個功能,但是沒有現成的
有找到php版本,不過判斷的情況不是很完美
只好自己寫一個 XD

套件名稱:
domain-parser
https://www.npmjs.org/package/domain-parser

Version: 0.0.5 (2014/10/29)

Source Code on Github
https://github.com/kilfu0701/node-domain-parser


安裝方式 (Install)
npm install domain-parser

用法 (Usage)
var dp = require('domain-parser');

var result = dp('www.google.com.tw').domainName;
console.log(result);
// google.com.tw

result = dp('direct.jp-bank.japanpost.jp').domainName;
console.log(result);
// japanpost.jp

2014年6月10日 星期二

[Chome] 非chrome web store的套件被強制停用

凌晨2:51

2014年1月3日 星期五

[Python] sqlalchemy 輸出json格式

清晨6:57
sqlalchemy 輸出json格式

前言:
剛好有人發問,寫了一個範例,

做個記錄一下,也許以後自己會用到 XD

範例:
http://pastie.org/8595769
# -*- coding: utf-8 -*-
import hashlib
import sqlalchemy
from sqlalchemy import Column, Integer, String, ForeignKey, DateTime, Table
from sqlalchemy.schema import MetaData
from sqlalchemy.orm import relationship
from sqlalchemy.orm import Bundle
from sqlalchemy.orm import lazyload
from sqlalchemy.orm.session import Session, sessionmaker
from sqlalchemy.ext.declarative import declarative_base

engine = sqlalchemy.create_engine('mysql+mysqldb://user:passwd@host/your_db?charset=utf8')
connection = engine.connect()
session = Session(bind=connection)

my_declarative_base = lambda cls: declarative_base(cls=cls)

@my_declarative_base
class Base(object):
    @property
    def columns(self):
        return [ c.name for c in self.__table__.columns ]

    @property
    def columnitems(self):
        return dict([ (c, getattr(self, c)) for c in self.columns ])

    def __repr__(self):
        return u'{}({})'.format(self.__class__.__name__, self.columnitems)

    def to_json(self):
        return self.columnitems

    def rec_json(self, key_str):
        result = self.columnitems
        result[key_str] = getattr(self, key_str).columnitems

        return result
        
class User(Base):
    __tablename__ = 'user'
    __table_args__ = {
        'mysql_engine': 'InnoDB',
        'mysql_charset': 'utf8'
    }

    id = Column(Integer, primary_key=True)
    name = Column(String(64))
    username = Column(String(64))
    password = Column(String(256))
    address_id = Column(Integer, ForeignKey('user_address.id'))
    address = relationship("Address", lazy="joined")

    def __init__(self, name, username, password):
        self.name = name
        self.username = username
        self.password = hashlib.sha1(password).hexdigest()

    def __repr__(self):
       return u"[User('%s','%s', '%s')]" % \
           (self.name, self.username, self.password)


class Address(Base):
    __tablename__ = 'user_address'
    __table_args__ = {
        'mysql_engine': 'InnoDB',
        'mysql_charset': 'utf8'
    }

    id = Column(Integer, primary_key=True)
    address = Column(String(256), nullable=False)

    def __init__(self, address):
        self.address = address

    def __repr__(self):
        return u"[Address('%s')]" % self.address
        
        

# insert test data...
"""
Base.metadata.create_all(engine)

user_1 = User("user1", "username1", "password_1")
user_2 = User("user2", "username2", "password_2")
address_1 = Address(u'臺灣凱達格蘭大道')
user_1.address = address_1
user_2.address = address_1
session.add(user_1)
session.add(user_2)
session.commit()
"""

for r in session.query(User).options(lazyload('address')):
    print r.rec_json('address')


"""
Output Result:

{'username': 'username1', 'address_id': 17L, 'name': 'user1', 'address': {'id': 17L, 'address': u'\u81fa\u7063\u51f1\u9054\u683c\u862d\u5927\u9053'},
 'password': '3833b3a1c69cf71a31d86cb5bb4d3866789b4d1e', 'id': 33L}
{'username': 'username2', 'address_id': 17L, 'name': 'user2', 'address': {'id': 17L, 'address': u'\u81fa\u7063\u51f1\u9054\u683c\u862d\u5927\u9053'},
 'password': '148dfdc3c539d35004cb808ca84e17ff962af744', 'id': 34L}

"""

參考資料(Refs):
1. http://chimerhapsody.blogspot.tw/2013/09/python-sqlalchemy-orm-part-3-end.html
2. http://docs.sqlalchemy.org/en/rel_0_9/orm/relationships.html
3. http://blogs.gnome.org/danni/2013/03/07/generating-json-from-sqlalchemy-objects/


2014年1月1日 星期三

[Solr] 安裝Solr 4.6 in Debian

凌晨4:14
安裝Solr 4.6

前言:
距離上次寫的安裝設定很遙遠,而且那時候用的還是比較舊的版本,

就趁這次重新安裝的時候,順便寫一篇給自己以後來用 XD

安裝步驟:

這邊我是都把所有東西放到 /opt/ 底下,

依個人需求自行調整。

1. 下載 solr 4.6
cd /opt/

wget http://ftp.tc.edu.tw/pub/Apache/lucene/solr/4.6.0/solr-4.6.0.tgz
tar zxvf solr-4.6.0.tgz

2. 下載 java sdk (http://www.oracle.com/technetwork/java/javase/downloads/index.html)
tar zxvf jdk-7u45-linux-i586.gz

3. 複製solr-4.6/example到/opt/solr/
cp -pr /opt/solr-4.6.0/example/ /opt/solr/

4. 啟動solr
方法1:
cd /opt/solr/
java -Dsolr.solr.home=multicore -jar start.jar

方法2:
wget https://gist.github.com/Polzme/7367523/raw/9ccf8b040b70eca214497dc6ee2b23e9abb0b8ef/solr -O /etc/init.d/solr
chmod +x /etc/init.d/solr
# 依個人需求,修改java的路徑
vim /etc/init.d/solr

#DAEMON=/usr/bin/java
DAEMON=/opt/jdk1.7.0_45/bin/java
service solr start

5. 檢查是否已經啟動?
http://localhost:8983/solr/

6. 設定開機的時候 啟動solr
update-rc.d solr defaults

7. 設定iptables

只允許localhost access 8983的port
iptables -A INPUT -p tcp -s localhost --dport 8983 -j ACCEPT
iptables -A INPUT -p tcp --dport 8983 -j DROP



參考資料(Refs):
1. http://apache.osuosl.org/lucene/solr/ref-guide/apache-solr-ref-guide-4.6.pdf
2. http://wiki.apache.org/solr/SolrTomcat
3. https://coderwall.com/p/0s3flw
4. https://cwiki.apache.org/confluence/display/solr/Running+Solr+on+Tomcat
5. https://gist.github.com/Polzme/7367523/



2013年12月30日 星期一

[Django] Export CSV file ( 匯出CSV檔案 )

凌晨1:20
Export data to a CSV file with Django

前言:
單純因為會用到,所以就剛好寫到這個功能

想說,以後可能在別的公司or自己的server會用到,就順便整理一份範例。

Example Code:
https://gist.github.com/kilfu0701/7332112
# in some views.py, to serve a csv file in Django.
# -*- coding: utf-8 -*-
import csv

from django.http import HttpResponse

def donwload_csv(request):
    # change export csv formatting by request parameter. ( url?encode=utf-8 )
    encode = request.GET.get('encode', 'big5')
 
    response = HttpResponse(content_type='text/csv')
    response['Content-Disposition'] = 'attachment; filename="light_member.csv"'
 
    writer = csv.writer(response, delimiter=',', quotechar='"')
    header = [u'活動名稱', u'姓名', u'Email', u'會員身分', u'答案', u'活動登入日期', u'註冊日期', u'Device']
    writer.writerow([x.encode(encode) for x in header])
    # force export column by text format.
    # http://stackoverflow.com/questions/165042/stop-excel-from-automatically-converting-certain-text-values-to-dates
    deli = u'="{0}"'
 
    ## result['data'], some data from databases.
    #result = {}
    #result['data'] = list(aModel.objects.filter(**ftr).values(*fds))
    for i in result['data']:
        role = u'New' if i['new'] == 1 else u'Exist'
 
        raw_row = [i['plan'], i['name'], i['email'], role, i['option'], str(i['timestamp']), str(i['joined_at']), i['os']]
        row = [deli.format(x).encode(encode) for x in raw_row ]
        writer.writerow(row)
 
    return response


其他參考資料:
1. CSV匯出的時候,會遇到excel格式自動判斷錯誤的問題,後來在下面這篇看到解法:
http://stackoverflow.com/questions/165042/stop-excel-from-automatically-converting-certain-text-values-to-dates

2. 官方文件
https://docs.djangoproject.com/en/dev/howto/outputting-csv/

2013年1月16日 星期三

[Python] 在Debain 6上安裝python 2.7 + vritualenv

晚上7:43
剛好看到有人在gist上放了 安裝python2.7的shell script

其實安裝起來還蠻方便的..(笑)

Shell script code:
https://gist.github.com/1069219

安裝完畢後,執行python就可以看到版本是2.7.2



不過有人會想問,那要用回舊的版本勒?

其實可以修改 ~/.profile 這檔案,檔案內容大致上如下:
if [ "$BASH" ]; then
  if [ -f ~/.bashrc ]; then
    . ~/.bashrc
  fi
fi

mesg n
#if [ -d "$HOME/env/bin" ] ; then
#    PATH="$HOME/env/bin:$PATH"
#fi

PATH="$HOME/env/bin:$PATH"註解掉後,就會套用舊的環境設定。

PS: 恩...原本python2.6裝的django是1.4版的,剛好順便升級到py27 + django-1.5 好了 (茶)

2012年12月19日 星期三

[Chrome] Nico Download Manager (nicoDLM)

上午8:06
Chrome Extension - nico Download Manager
前言:
嗯..因為作者本身常常逛nico,

chrome好像沒有類似nicofox這套件能下載動畫 & comment

所以就....(ry


套件名稱:
nico Download Manager ( ニコ動 ダウンロード管理員 )

Version: 0.1.7 (2013/11/20)

Version: 0.1.6 (2013/2/11)
Version: 0.1.5 (2013/1/8)
Version: 0.1.4 (2012/12/26)
Version: 0.1.3 (2012/12/21)
Version: 0.1.2 (2012/12/20)
Version: 0.1.1 (2012/12/19)


下載點(download):
http://fs.tkafu.cc/nico_DLManager-0.1.7.crx (latest)

目前因為chrome把非app store的套件都會停用,目前還在解決中
暫時性的解決方式:
  • http://fs.tkafu.cc/nicoDLM_src.zip下載並解壓縮
  • 從chrome的工具 > 擴充功能 (或是在網址輸入 chrome://extensions ),打開"開發人員模式" > "載入未封裝擴充功能",選擇剛剛解壓縮的資料夾



0.1.7修正:
  • 修復 右鍵選單有時候會消失的BUG。
  • 修復 社群的影片會無法下載。(影片ID全為數字的情況。)

安裝方式:
1. 右鍵另存.crx檔案。
2. 開啟"工具" -> "擴充功能" 的頁面,再把.crx拖曳到chrome安裝即可。


source code at Github
https://github.com/kilfu0701/nicoDLM


使用介紹:
1. 下載.crx之後,安裝到chrome 會多出一個extension icon在右上角


2. 點選icon 會出現一個頁面,裡頭有下載清單、一般設定、語言環境、關於本套件的表格。


3. 設定調整完畢儲存後,開啟nico的影片頁面,下方會出現一個綠色的框。點選此連結,即可下載動畫以及評論。


3. 因為原宿版本要結束了,之後就要改成GINZA版本了!
不過,還是可以用0.1.6的右鍵選單下載動畫


4. 回到套件的下載清單裡,會看到剛剛新增進去的影片,
(影片名稱、敘述、下載進度、屬性等等)


5. 影片品質,可以從進度下方看到一個"HI"或是"LOW"的小圖示,
HI表示高品質、LOW則是低品質(也就是所謂的經濟模式..)

旁邊的"資料夾"小圖示,則是可以開啟檔案所在的目錄
(若檔案不存在時,不會開啟資料夾)


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


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


備註:
1. 請正確設定 下載資料夾 的位置,若有啟用UAC的功能,可能會導致檔案無法寫入!

2. 目前只設定最多兩個影片同時下載。

3. 目前尚未加入下載暫停/取消的功能,若想取消正在下載的檔案,可以將套件重啟。

4. 如果下載影片,發生403 forbidden時,建議把該影片的網址 重新再新分頁開啟後,在重新下載。

5. 檔案格式命名,目前沒有多餘的設定可改,暫時只提供%ID%和%TITLE%。

6. 目前只提供Windows的平台,但是沒有各種環境測試過,不確定有沒有相容問題。

7. 原宿版要結束了,GINZA版本 依舊可以用右鍵選單進行下載。



嗯...有發現BUG或是其他功能,可以回報給我。