2012年8月29日 星期三

[Shell Script] 備份檔案

凌晨12:40
備份用

耶,就隨意寫一個shell script搭配crontab

備份自己server上的一些東西...(茶)


程式碼部分
#/bin/bash
# ./backup.sh -p /var/www/sc/ -t /tmp

function usage ()
{
    echo -e "** param error. **"
    echo -e "usage:"
    echo -e "\tbackup --path /var/www/kilfu --to /var/www/"
    echo -e "\tbackup -p /var/www/kilfu -t /var/www/\n"
    echo -e "param:"
    echo -e "\t-p | --path\t\tfolder's path."
    echo -e "\t-t | --to\t\tthe path where compress into."
    exit
}

function check_folder_exist ()
{
    if [ -d "$1" ]; then
        return 1
    else
        echo -e "[$2] folder not found!"
        exit
    fi
}

if [ $# -le 0 ]; then
    usage
fi

while [ "$1" != "" ]; do
    case $1 in
        -p | --path )           shift
                                _path=$1
                                ;;
        -t | --to )             shift
                                _to=$1
                                ;;
        -h | --help )           usage
                                exit
                                ;;
        * )                     usage
                                exit 1
    esac
    shift
done

if [ $_path == "" ]; then
    $_path
fi


check_folder_exist $_path "path"
check_folder_exist $_to "to"

TODAY=`date +%Y%m%d`
IFS="/"
export IFS;
for word in $_path; do
    if [ "$word" != "" ]; then
        fname="$word"
    fi
done

cd "$_to"
echo -e "Start compressing..."
echo -e "  compress folder:\t$_path"
echo -e "  destination:\t\t$_to"

tar zcvfP "${fname}_${TODAY}.tar" "$_path"


使用方法
1:
/bin/bash backup.sh -p /var/www/sc/ -t /tmp
2: crontab
#分 時 日 月 週
# backup sc
30 3 * * * /bin/bash /var/www/sc/backup.sh --path /var/www/sc --to /home/backup/


恩,就這樣。

2012年6月21日 星期四

[Django] 建立一個google map

凌晨3:02
參考資料(references):
https://docs.djangoproject.com/en/dev/ref/contrib/gis/install/
http://jefurii.cafejosti.net/blog/2011/05/05/basic-google-maps-django/

安裝設定

先安裝geos吧,這邊是用source code自行編譯:

下載/解壓縮: (解壓縮有錯誤訊息,可能沒裝bzip2.. apt-get install bzip2)
wget http://download.osgeo.org/geos/geos-3.3.0.tar.bz2
tar xjf geos-3.3.0.tar.bz2

編譯+安裝: (編譯需要一段時間,大概5~10分鐘吧)
cd geos-3.3.0
./configure
make
sudo make install

安裝完成後,請打ldconfig,把剛剛安裝好的lib讀取進來
sudo ldconfig

django部分

先在你的app/views.py加入
from django.conf import settings
from django.shortcuts import render_to_response
from django.contrib.gis.maps.google.gmap import GoogleMap
from django.contrib.gis.maps.google.overlays import GMarker, GEvent

def google_map(request):
    points = [
        {'lat':'35.42',     'lng': '139.42', 'href':'http://en.wikipedia.org/wiki/Tokyo'},
        {'lat':'51.30',     'lng':   '0.73', 'href':'http://en.wikipedia.org/wiki/London'},
        {'lat':'40.43',     'lng': '-74.0',  'href':'http://en.wikipedia.org/wiki/New_York_City'},
        {'lat':'34.03',     'lng':'-118.15', 'href':'http://en.wikipedia.org/wiki/Los_Angeles'},
        {'lat':'36.774402', 'lng':'-119.755405', 'href':'http://en.wikipedia.org/wiki/Fresno'},]
    markers = []
    for point in points:
        marker = GMarker('POINT(%s %s)' % (point['lng'], point['lat']))
        event = GEvent('click', 'function() { location.href = "%s"}' % point['href'])
        marker.add_event(event)
        markers.append(marker)
    google = GoogleMap(center=(0,0), zoom=1, markers=markers,
                       key=settings.GOOGLE_MAPS_API_PASSWORD)
    return render_to_response('google_map.html',
                              {'google': google,})

然後建立一個template檔案為 google.map.html
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
{{ google.xhtml }}
<head>
  {{ google.style }}
  {{ google.scripts }}
</head>
<body onload="{{ google.js_module }}.map_load()" onunload="GUnload()">
  <div id="{{ google.dom_id }}" style="width:600px; height:400px;"></div>
</body>
</html>

然後到settings.py加入:
INSTALLED_APPS = (
    ...
    'django.contrib.gis',
    ...
)

GEOS_LIBRARY_PATH = '/usr/local/lib/libgeos_c.so'
GOOGLE_MAPS_API_PASSWORD = 'asdasdasdasdasd'

這邊需要google map api v2的key,由於申請方式和以前不同,

需要用到信用卡刷帳單....(雖然都是0元...需求過大的話,才須額外付費)
https://code.google.com/apis/console/

以上寫完,別忘了去設定urls.py

再去看看網址有沒有地圖出來囉。

2012年4月4日 星期三

[Debian] PPTP VPN 防火牆設定 for DNF (日版Arad)

晚上10:14


關於VPN的初始設定和架設,可以看我之前的[Debian] VPN架設 這篇文章。


恩,原本的iptables設定 基本上都可以達到VPN的功用...

但是,我在測試日版ARAD的組隊的時候,總是不夠順暢,

我也知道這遊戲組隊用到的port是UDP 5063,

中間一直用codomo的防火牆來觀察連線的狀態,

經過兩天的測試,才發現需要在iptables多一些prerouting的規則,

不然,A電腦和B電腦都用VPN組隊時,UDP的封包沒辦法轉送給對方,

導致可以組隊,但是會不夠順暢...(偶而會出現電腦的小圖示)

像是下面的圖:

┌----> VPN Server <-----┐
| |
| port:5063 | port:5063
| udp(out) | udp(out)
A B


會變成兩邊的遊戲端,都會向對方傳送組隊的封包,

VPN Server卻沒有轉送給對方,造成UDP封包送不到對方的遊戲端...(昏)
(PS: UDP的運作原理就不用多說了,請參考Google囉)



後來,我把iptables的設定改成以下:
# clean all setting
iptables -F
iptables -t nat -F
iptables -t mangle -F
iptables -X

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

# DNF port pre-routing
iptables -t nat -A PREROUTING -p udp --dport 5063 -i eth0 -j DNAT -s 0/0 --to 192.168.10.234
iptables -t nat -A PREROUTING -p udp --dport 5063 -i eth0 -j DNAT -s 0/0 --to 192.168.10.235
iptables -t nat -A PREROUTING -p udp --dport 5063 -i eth0 -j DNAT -s 192.168.10.234 --to 0.0.0.0-255.255.255.255
iptables -t nat -A PREROUTING -p udp --dport 5063 -i eth0 -j DNAT -s 192.168.10.235 --to 0.0.0.0-255.255.255.255

iptables -I FORWARD -p tcp --syn -i ppp+ -j TCPMSS --set-mss 1356
iptables -o eth0 -A FORWARD -p tcp --tcp-flags SYN,RST SYN -m tcpmss --mss 800:1536 -j TCPMSS --clamp-mss-to-pmtu


主要是DNF port pre-routing那四行,VPN Server把接收到port為5063的UDP封包,

做轉送的動作,像是下面的圖:


A傳給B:
┌----> VPN Server ------┐
| |
| port:5063 | port:5063
| udp(out) ↓ udp(in)
A B

B傳給A:
┌----- VPN Server <-----┐
| |
| port:5063 | port:5063
↓ udp(in) | udp(out)
A B


這樣就解決了ARAD組隊不順暢的問題了,

本來還在想說,遊戲連線會很聰明的直接在A和B建立一個UDP,

就不需要在經由VPN Server說...(汗)


PS: 至於可不可以和外面的人組隊的話,我還沒測試過,基本上應該沒問題才對。
但是,如果組隊雙方都是用VPN連線的話,
就需要確定提供VPN主機的人,防火牆設定有沒有調整好,

不然,只有一方的VPN有設定,另一方沒設定,
也是會有不順暢的問題!
(這我測過了,A電腦用別人家的付費VPN,B電腦是連我自己架設的VPN)

至於別人家的VPN幫不幫你設定,只好看對方的誠意了。



2012年4月3日 星期二

[Debian] VPN架設

凌晨3:50


恩...最近買了一個VPS來用拉!!!

第一件事就是先架VPN來用囉....

基本上,我是參考 這個網站 的教學

apt-get update
apt-get upgrade
apt-get install pptpd


移除這兩個#的註解
vim /etc/pptpd.conf

localip 192.168.0.234-238,192.168.0.245
remoteip 192.168.1.234-238,192.168.1.245


VPN連線時的帳號密碼,請自己設定囉
vim /etc/ppp/chap-secrets
# Secrets for authentication using CHAP
# client        server  secret                  IP addresses
fu              pptpd   passwordhere            *


把#註解拿掉
vim /etc/sysctl.conf
net.ipv4.ip_forward=1


會出現剛剛你拿掉註解的那行,沒出現的話就是有錯誤,回去看看有沒有修改到
sysctl -p


iptables的設定,他的網站"減號"有大小寫的問題,當初改了一下才成功,沒出現錯誤。
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -o eth0 -A FORWARD -p tcp --tcp-flags SYN,RST SYN \
-m tcpmss --mss 800:1536 -j TCPMSS --clamp-mss-to-pmtu


chmod +x /etc/init.d/pptpd
/usr/sbin/update-rc.d -f pptpd defaults


設定防火牆 iptables的設定
vim /etc/iptables.sh
#!/bin/sh
IPT="/sbin/iptables"
$IPT -t nat -A POSTROUTING -o eth0 -j MASQUERADE
$IPT -o eth0 -A FORWARD -p tcp --tcp-flags SYN,RST SYN \
-m tcpmss --mss 800:1536 -j TCPMSS --clamp-mss-to-pmtu


chown root /etc/iptables.sh
chmod 700 /etc/iptables.sh


加入 pre-up /etc/iptables.sh
vim /etc/network/interfaces
pre-up /etc/iptables.sh


重新開機,測試看看能不能連囉。

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, 安裝方法