最近在做imap收信的功能,並把目標信件的附件存起來
沒想到發email這麼簡單,收email的處理卻是這麼的麻煩…
因為email中有太多種編碼方式了
我測試的code晚點po上來,先memo一下我找到不錯的code
https://gist.github.com/baali/2633554
2016年11月17日 星期四
vlc player播放rtsp
我的IP Camera位於192.168.27.101,且有設定密碼,所以用這樣的方式
不然他會跳出輸入帳密的視窗
rtsp://admin:admin123@192.168.27.101
如果有需要在linux下錄的話,可以用vlc或是ffmpeg
其中vlc需要安裝的東西比較多,所以需要到170MB的空間
ffmpeg只需要40幾MB就夠用了
ffmpeg -i rtsp://admin:admin123@192.168.27.101 -r 15 -vcodec copy -an -t 10 ./my-video.mp4
錄製10秒,產生的訊息如下:
ffmpeg version 0.8.18-6:0.8.18-0+deb7u1, Copyright (c) 2000-2014 the Libav developers
built on Oct 4 2016 19:34:59 with gcc 4.6.3
The ffmpeg program is only provided for script compatibility and will be removed
in a future release. It has been deprecated in the Libav project to allow for
incompatible command line syntax improvements in its replacement called avconv
(see Changelog for details). Please use avconv instead.
[rtsp @ 0x40660] Estimating duration from bitrate, this may be inaccurate
Seems stream 0 codec frame rate differs from container frame rate: 50.00 (50/1) -> 45000.00 (45000/1)
Input #0, rtsp, from 'rtsp://admin:admin123@192.168.27.101':
Metadata:
title : Media Presentation
Duration: N/A, start: 0.000000, bitrate: N/A
Stream #0.0: Video: h264 (Main), yuv420p, 1280x720, 25 fps, 45k tbr, 90k tbn, 50 tbc
Output #0, mp4, to './my-video.mp4':
Metadata:
title : Media Presentation
encoder : Lavf53.21.1
Stream #0.0: Video: libx264, yuv420p, 1280x720, q=2-31, 25 tbn, 25 tbc
Stream mapping:
Stream #0.0 -> #0.0
Press ctrl-c to stop encoding
frame= 251 fps= 27 q=-1.0 Lsize= 278kB time=10.04 bitrate= 227.1kbits/s
video:275kB audio:0kB global headers:0kB muxing overhead 1.111131%
所佔的空間不多
279K Nov 8 13:59 my-video.mp4
----> 這指令也可以截一張圖
ffmpeg -i rtsp://admin:admin123@192.168.27.101 -vframes 1 ./pic.jpg
產生訊息:
ffmpeg version 0.8.18-6:0.8.18-0+deb7u1, Copyright (c) 2000-2014 the Libav developers
built on Oct 4 2016 19:34:59 with gcc 4.6.3
The ffmpeg program is only provided for script compatibility and will be removed
in a future release. It has been deprecated in the Libav project to allow for
incompatible command line syntax improvements in its replacement called avconv
(see Changelog for details). Please use avconv instead.
[rtsp @ 0x40660] Estimating duration from bitrate, this may be inaccurate
Seems stream 0 codec frame rate differs from container frame rate: 50.00 (50/1) -> 45000.00 (45000/1)
Input #0, rtsp, from 'rtsp://admin:admin123@192.168.27.101':
Metadata:
title : Media Presentation
Duration: N/A, start: 0.000000, bitrate: N/A
Stream #0.0: Video: h264 (Main), yuv420p, 1280x720, 25 fps, 45k tbr, 90k tbn, 50 tbc
Incompatible pixel format 'yuv420p' for codec 'mjpeg', auto-selecting format 'yuvj420p'
[buffer @ 0x45c20] w:1280 h:720 pixfmt:yuv420p
[avsink @ 0x4b000] auto-inserting filter 'auto-inserted scaler 0' between the filter 'src' and the filter 'out'
[scale @ 0x45540] w:1280 h:720 fmt:yuv420p -> w:1280 h:720 fmt:yuvj420p flags:0x4
Output #0, image2, to './pic.jpg':
Metadata:
title : Media Presentation
encoder : Lavf53.21.1
Stream #0.0: Video: mjpeg, yuvj420p, 1280x720, q=2-31, 200 kb/s, 90k tbn, 45k tbc
Stream mapping:
Stream #0.0 -> #0.0
Press ctrl-c to stop encoding
frame= 1 fps= 0 q=6.7 Lsize= -0kB time=0.01 bitrate= -17.6kbits/s
video:44kB audio:0kB global headers:0kB muxing overhead -100.048788%
不然他會跳出輸入帳密的視窗
rtsp://admin:admin123@192.168.27.101
如果有需要在linux下錄的話,可以用vlc或是ffmpeg
其中vlc需要安裝的東西比較多,所以需要到170MB的空間
ffmpeg只需要40幾MB就夠用了
ffmpeg -i rtsp://admin:admin123@192.168.27.101 -r 15 -vcodec copy -an -t 10 ./my-video.mp4
錄製10秒,產生的訊息如下:
ffmpeg version 0.8.18-6:0.8.18-0+deb7u1, Copyright (c) 2000-2014 the Libav developers
built on Oct 4 2016 19:34:59 with gcc 4.6.3
The ffmpeg program is only provided for script compatibility and will be removed
in a future release. It has been deprecated in the Libav project to allow for
incompatible command line syntax improvements in its replacement called avconv
(see Changelog for details). Please use avconv instead.
[rtsp @ 0x40660] Estimating duration from bitrate, this may be inaccurate
Seems stream 0 codec frame rate differs from container frame rate: 50.00 (50/1) -> 45000.00 (45000/1)
Input #0, rtsp, from 'rtsp://admin:admin123@192.168.27.101':
Metadata:
title : Media Presentation
Duration: N/A, start: 0.000000, bitrate: N/A
Stream #0.0: Video: h264 (Main), yuv420p, 1280x720, 25 fps, 45k tbr, 90k tbn, 50 tbc
Output #0, mp4, to './my-video.mp4':
Metadata:
title : Media Presentation
encoder : Lavf53.21.1
Stream #0.0: Video: libx264, yuv420p, 1280x720, q=2-31, 25 tbn, 25 tbc
Stream mapping:
Stream #0.0 -> #0.0
Press ctrl-c to stop encoding
frame= 251 fps= 27 q=-1.0 Lsize= 278kB time=10.04 bitrate= 227.1kbits/s
video:275kB audio:0kB global headers:0kB muxing overhead 1.111131%
所佔的空間不多
279K Nov 8 13:59 my-video.mp4
----> 這指令也可以截一張圖
ffmpeg -i rtsp://admin:admin123@192.168.27.101 -vframes 1 ./pic.jpg
產生訊息:
ffmpeg version 0.8.18-6:0.8.18-0+deb7u1, Copyright (c) 2000-2014 the Libav developers
built on Oct 4 2016 19:34:59 with gcc 4.6.3
The ffmpeg program is only provided for script compatibility and will be removed
in a future release. It has been deprecated in the Libav project to allow for
incompatible command line syntax improvements in its replacement called avconv
(see Changelog for details). Please use avconv instead.
[rtsp @ 0x40660] Estimating duration from bitrate, this may be inaccurate
Seems stream 0 codec frame rate differs from container frame rate: 50.00 (50/1) -> 45000.00 (45000/1)
Input #0, rtsp, from 'rtsp://admin:admin123@192.168.27.101':
Metadata:
title : Media Presentation
Duration: N/A, start: 0.000000, bitrate: N/A
Stream #0.0: Video: h264 (Main), yuv420p, 1280x720, 25 fps, 45k tbr, 90k tbn, 50 tbc
Incompatible pixel format 'yuv420p' for codec 'mjpeg', auto-selecting format 'yuvj420p'
[buffer @ 0x45c20] w:1280 h:720 pixfmt:yuv420p
[avsink @ 0x4b000] auto-inserting filter 'auto-inserted scaler 0' between the filter 'src' and the filter 'out'
[scale @ 0x45540] w:1280 h:720 fmt:yuv420p -> w:1280 h:720 fmt:yuvj420p flags:0x4
Output #0, image2, to './pic.jpg':
Metadata:
title : Media Presentation
encoder : Lavf53.21.1
Stream #0.0: Video: mjpeg, yuvj420p, 1280x720, q=2-31, 200 kb/s, 90k tbn, 45k tbc
Stream mapping:
Stream #0.0 -> #0.0
Press ctrl-c to stop encoding
frame= 1 fps= 0 q=6.7 Lsize= -0kB time=0.01 bitrate= -17.6kbits/s
video:44kB audio:0kB global headers:0kB muxing overhead -100.048788%
2016年11月6日 星期日
[Linux] ethernet在1G Lan無法正常運作的解法
遇到kernel硬體對giga lan 支援有問題…XD
可以使用ethtool降速解決
root@arm:~# apt-get install ethtool
....
root@arm:~# ethtool -s eth0 speed 10 duplex full
root@arm:~# [ 640.693560] PHY: 0:00 - Link is Down
[ 642.693546] PHY: 0:00 - Link is Up - 10/Full
root@arm:~# ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_req=1 ttl=47 time=20.0 ms
64 bytes from 8.8.8.8: icmp_req=2 ttl=47 time=19.4 ms
可以使用ethtool降速解決
root@arm:~# apt-get install ethtool
....
root@arm:~# ethtool -s eth0 speed 10 duplex full
root@arm:~# [ 640.693560] PHY: 0:00 - Link is Down
[ 642.693546] PHY: 0:00 - Link is Up - 10/Full
root@arm:~# ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_req=1 ttl=47 time=20.0 ms
64 bytes from 8.8.8.8: icmp_req=2 ttl=47 time=19.4 ms
2016年11月5日 星期六
[python] wxpython + py2exe無法成功
之前都是做console的程式,用的也都是python內建的東西,因此py2exe都沒遇到什麼特別的問題
今天使用wxpython寫了個程式,想用py2exe包給別人用,發現包不起來!
出現這樣的訊息
No such file or directory: 'MSVCP90.dll'
網路上有人提到,把msvcp90.dll排除就可以了,如下(來源):
python setup.py py2exe --dll-excludes=MSVCP90.DLL
執行檔做好了,又發現另一個問題,就是GUI視窗做好了,但是除了我要的windows視窗程式以外,也帶出來另一個console視窗,看起來很low.....
可以把
setup(console=['__main__.py'])
換成
setup(windows=['__main__.py'])
這樣就只會出現視窗,不會有console畫面了
另一個問題就是…整個要執行的程式資料夾很大,還不清楚怎麼縮小,如果有人研究出來了,再請跟我說一下~
---------- 2016/11/07 補上 -----------
因為上面的方式在沒有安裝MSVCP90.dll的電腦會有問題
補上新的方式解決,以下為主要二個檔案的內容
(參考資料為:連結1,連結2)
連同我的程式共三個檔案放在同一個資料夾中
在build完後,在[dist]中的就是我們要的執行檔,目前這個方法已經可以把所有需要的檔案都包成一個執行檔,要提供給別人非常方便
但我們會發現在同一個資料夾中還有另一個檔案[w9xpopen.exe]
這個檔案是為了在windows95, 98的電腦中使用sys.popen()這個指令用的
因為我們沒有想要相容於windows95, 98的電腦,只要XP以上能跑就可以了,所以這個檔案可以刪掉!!
把單一個執行檔提供給別人就好了!
[make.bat]的內容
echo Start_to_build_exe
cd /d E:\workspace\python\py2exe\RTUC_gui_v1.0.2_vc9_zip
python my_setup.py install
python my_setup.py py2exe
pause
[my_setup.py]的內容
#!/usr/bin/python
#setup(console=["rtuc.py"])#will show console windows
#setup(windows=["rtuc.py"])
from distutils.core import setup
import py2exe
includes = []
excludes = ['_gtkagg', '_tkagg', 'bsddb', 'curses', 'email', 'pywin.debugger',
'pywin.debugger.dbgcon', 'pywin.dialogs', 'tcl',
'Tkconstants', 'Tkinter']
packages = []
dll_excludes = ['libgdk-win32-2.0-0.dll', 'libgobject-2.0-0.dll', 'tcl84.dll',
'tk84.dll']
setup(
options = {"py2exe": {"compressed": 2,
"optimize": 2,
"includes": includes,
"excludes": excludes,
"packages": packages,
"dll_excludes": dll_excludes,
"bundle_files": 1,
"dist_dir": "dist",
"xref": False,
"skip_archive": False,
"ascii": False,
"custom_boot_script": '',
}
},
zipfile = None,
windows=['rtuc.py']
)
今天使用wxpython寫了個程式,想用py2exe包給別人用,發現包不起來!
出現這樣的訊息
No such file or directory: 'MSVCP90.dll'
網路上有人提到,把msvcp90.dll排除就可以了,如下(來源):
python setup.py py2exe --dll-excludes=MSVCP90.DLL
執行檔做好了,又發現另一個問題,就是GUI視窗做好了,但是除了我要的windows視窗程式以外,也帶出來另一個console視窗,看起來很low.....
可以把
setup(console=['__main__.py'])
換成
setup(windows=['__main__.py'])
這樣就只會出現視窗,不會有console畫面了
另一個問題就是…整個要執行的程式資料夾很大,還不清楚怎麼縮小,如果有人研究出來了,再請跟我說一下~
---------- 2016/11/07 補上 -----------
因為上面的方式在沒有安裝MSVCP90.dll的電腦會有問題
補上新的方式解決,以下為主要二個檔案的內容
(參考資料為:連結1,連結2)
連同我的程式共三個檔案放在同一個資料夾中
在build完後,在[dist]中的就是我們要的執行檔,目前這個方法已經可以把所有需要的檔案都包成一個執行檔,要提供給別人非常方便
但我們會發現在同一個資料夾中還有另一個檔案[w9xpopen.exe]
這個檔案是為了在windows95, 98的電腦中使用sys.popen()這個指令用的
因為我們沒有想要相容於windows95, 98的電腦,只要XP以上能跑就可以了,所以這個檔案可以刪掉!!
把單一個執行檔提供給別人就好了!
[make.bat]的內容
echo Start_to_build_exe
cd /d E:\workspace\python\py2exe\RTUC_gui_v1.0.2_vc9_zip
python my_setup.py install
python my_setup.py py2exe
pause
[my_setup.py]的內容
#!/usr/bin/python
#setup(console=["rtuc.py"])#will show console windows
#setup(windows=["rtuc.py"])
from distutils.core import setup
import py2exe
includes = []
excludes = ['_gtkagg', '_tkagg', 'bsddb', 'curses', 'email', 'pywin.debugger',
'pywin.debugger.dbgcon', 'pywin.dialogs', 'tcl',
'Tkconstants', 'Tkinter']
packages = []
dll_excludes = ['libgdk-win32-2.0-0.dll', 'libgobject-2.0-0.dll', 'tcl84.dll',
'tk84.dll']
setup(
options = {"py2exe": {"compressed": 2,
"optimize": 2,
"includes": includes,
"excludes": excludes,
"packages": packages,
"dll_excludes": dll_excludes,
"bundle_files": 1,
"dist_dir": "dist",
"xref": False,
"skip_archive": False,
"ascii": False,
"custom_boot_script": '',
}
},
zipfile = None,
windows=['rtuc.py']
)
2016年11月4日 星期五
[Python] 用requests把資料push到heroku的web server上
用requests把資料push到heroku的web server上
會出現insecureplatformwarning的問題
網路上有人建議安裝OpenSSL
後來看到一個方法可以一次把相關的東西安裝完成
pip install requests[security]
會出現insecureplatformwarning的問題
網路上有人建議安裝OpenSSL
後來看到一個方法可以一次把相關的東西安裝完成
pip install requests[security]
2016年10月26日 星期三
[linux] memo一下 wget用法
wget --user=NAME --password='PASSWORD' ftp://url/path/file.name
wget --user=NAME --password='PASSWORD' http://url/path/file.name
常用的中華電信測速:
wget --user=ftp --password='ftp' ftp://ftp.speed.hinet.net/test_010m.zip
有這些檔案可以測速
/test_001m.zip1MB /test_003m.zip3MB /test_005m.zip5MB /test_010m.zip10MB /test_020m.zip20MB /test_040m.zip40MB /test_100m.zip100MB /test_200m.zip200MB /test_400m.zip400MB
測試上傳
wput test_010m.zip ftp://ftp:ftp@ftp.speed.hinet.net/uploads
當然在這之前要先安裝wput
apt-get install wput
wget --user=NAME --password='PASSWORD' http://url/path/file.name
常用的中華電信測速:
wget --user=ftp --password='ftp' ftp://ftp.speed.hinet.net/test_010m.zip
有這些檔案可以測速
/test_001m.zip1MB /test_003m.zip3MB /test_005m.zip5MB /test_010m.zip10MB /test_020m.zip20MB /test_040m.zip40MB /test_100m.zip100MB /test_200m.zip200MB /test_400m.zip400MB
測試上傳
wput test_010m.zip ftp://ftp:ftp@ftp.speed.hinet.net/uploads
當然在這之前要先安裝wput
apt-get install wput
2016年10月8日 星期六
[Python] opencv basic (未完)
[OpenCV Computer Vision with Python]
1. 8-bit grayscale image 為 2D array; 24-bit BGR image 為 3D array
image[0, 0]的第一個index為y軸向,也就是row,0為最上面,第二個index為x軸向,column,0為最左邊
對gray image來說image[0,0]取得其灰階值
對 24-bit BGR image來說image[0,0]將取得左上角的點,若是藍色點,則會取得[255,0,0]的值
2.
...
== 一些想法 ==
1. 看到p28寫到可以抓mouse, keyboard的event,想到最近在學wxPython,不知道可不可以合著用,效能好不好…
還未試過,有找到文章:
http://www.cnblogs.com/lulu147/p/4901626.html
https://plus.google.com/+JoshuaBenuck/posts/1ncnLFhyvKx
2. 測試camera時發現抓回來的fps很小->很慢的意思,有人說放到thread會比較好
http://www.pyimagesearch.com/2015/12/21/increasing-webcam-fps-with-python-and-opencv/
-->可以由本來的59fps增加到143fps ?
http://www.pyimagesearch.com/2015/12/28/increasing-raspberry-pi-fps-with-python-and-opencv/
--> 這一篇是rasp pi的,由14增加到51fps
只是我用pc上跑都沒有人家rasp pi快,怪的勒! 晚一點要應用時再來了解好了。
== 問題的處理 ==
1. 無法正常開啟mp4檔的問題
把opencv的資料夾 "E:\workspace\python\opencv\opencv-2.4\build\x86\vc12\bin"加入我的path無法解決問題,最後是同這一篇的做法(另外這一篇也有提到差不多的做法,只是copy更多的檔案而已),把這資料夾中的"opencv_ffmpeg2413.dll"檔案copy到資料夾"C:\Python27"中就正常了,也不知為何…
== 不錯的參考 ==
1. 處理視頻(一): 輸入輸出
http://python.jobbole.com/85247/
1. 8-bit grayscale image 為 2D array; 24-bit BGR image 為 3D array
image[0, 0]的第一個index為y軸向,也就是row,0為最上面,第二個index為x軸向,column,0為最左邊
對gray image來說image[0,0]取得其灰階值
對 24-bit BGR image來說image[0,0]將取得左上角的點,若是藍色點,則會取得[255,0,0]的值
2.
...
== 一些想法 ==
1. 看到p28寫到可以抓mouse, keyboard的event,想到最近在學wxPython,不知道可不可以合著用,效能好不好…
還未試過,有找到文章:
http://www.cnblogs.com/lulu147/p/4901626.html
https://plus.google.com/+JoshuaBenuck/posts/1ncnLFhyvKx
2. 測試camera時發現抓回來的fps很小->很慢的意思,有人說放到thread會比較好
http://www.pyimagesearch.com/2015/12/21/increasing-webcam-fps-with-python-and-opencv/
-->可以由本來的59fps增加到143fps ?
http://www.pyimagesearch.com/2015/12/28/increasing-raspberry-pi-fps-with-python-and-opencv/
--> 這一篇是rasp pi的,由14增加到51fps
只是我用pc上跑都沒有人家rasp pi快,怪的勒! 晚一點要應用時再來了解好了。
== 問題的處理 ==
1. 無法正常開啟mp4檔的問題
把opencv的資料夾 "E:\workspace\python\opencv\opencv-2.4\build\x86\vc12\bin"加入我的path無法解決問題,最後是同這一篇的做法(另外這一篇也有提到差不多的做法,只是copy更多的檔案而已),把這資料夾中的"opencv_ffmpeg2413.dll"檔案copy到資料夾"C:\Python27"中就正常了,也不知為何…
== 不錯的參考 ==
1. 處理視頻(一): 輸入輸出
http://python.jobbole.com/85247/
2016年10月5日 星期三
[python] TCP socket連線時,指定要使用網卡IP
最近在Linux的設備上遇到有二個網路介面的情形,一個是Ethernet,一個是3G
如果二個介面都可以上網,就會由系統自動選一條路走
但如果要自己選擇呢?
比如說
Ethernet為192.168.0.3
3G網路上101.138.125.192
這時要走3G就這樣做
s3 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s3.bind(("101.138.125.192", 0))
s3.connect(("www.google.com", 80))
s3.sendall("abcd")
要走ethernet就這樣做
s4 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s4.bind(("192.168.0.3", 0))
s4.connect(("www.google.com", 80))
s4.sendall("abcd")
若是依之前的寫法,沒有特別去bind,就會依目前routting的路去走,我的系統預設是走ethernet,因此如果是自己架的Server,就會看到是由Ethernet出來的ip
s5 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s5.connect(("www.google.com", 80))
s5.sendall("abcd")
另外,如果不知道目前eth0和3G的ppp0的IP的由,可以用ipconfig, ifconfig指令取得介面的IP資料,再來指令要bind的IP,就可以解決了
如果二個介面都可以上網,就會由系統自動選一條路走
但如果要自己選擇呢?
比如說
Ethernet為192.168.0.3
3G網路上101.138.125.192
這時要走3G就這樣做
s3 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s3.bind(("101.138.125.192", 0))
s3.connect(("www.google.com", 80))
s3.sendall("abcd")
要走ethernet就這樣做
s4 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s4.bind(("192.168.0.3", 0))
s4.connect(("www.google.com", 80))
s4.sendall("abcd")
s5 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s5.connect(("www.google.com", 80))
s5.sendall("abcd")
2016年9月29日 星期四
[python] 下載python source到linux環境build
因為 debian7.8只有python3.2可以安裝,因此要python3.2的話,需要自己抓python3.4的source code來build,那~為何要用python3.4呢? 因為python-can只有在python3.3版以後才支援native的socket can,所以需要自行抓下來處理~
以下為操作的過程
wget https://www.python.org/ftp/python/3.4.5/Python-3.4.5.tgz
會有問題如下:
root@arm:/opt# wget https://www.python.org/ftp/python/3.4.3/Python-3.4.3.tgz
--2016-09-29 16:35:57-- https://www.python.org/ftp/python/3.4.3/Python-3.4.3.tgz
Resolving www.python.org (www.python.org)... 151.101.192.223, 151.101.128.223, 151.101.64.223, ...
Connecting to www.python.org (www.python.org)|151.101.192.223|:443... connected.
ERROR: The certificate of `www.python.org' is not trusted.
ERROR: The certificate of `www.python.org' hasn't got a known issuer.
查了一下是ssl的問題,安裝一下就ok了
apt-get install ca-certificates
root@arm:/tmp# wget https://www.python.org/ftp/python/3.4.5/Python-3.4.5.tgz
--2016-09-29 18:13:56-- https://www.python.org/ftp/python/3.4.5/Python-3.4.5.tgz
Resolving www.python.org (www.python.org)... 151.101.192.223, 151.101.128.223, 151.101.64.223, ...
Connecting to www.python.org (www.python.org)|151.101.192.223|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 19611207 (19M) [application/octet-stream]
Saving to: `Python-3.4.5.tgz'
100%[======================================>] 19,611,207 274K/s in 45s
2016-09-29 18:14:44 (427 KB/s) - `Python-3.4.5.tgz' saved [19611207/19611207]
這樣就搞定了
---- 接著是build python的事了 ----
cd Python-3.4.5
./configure
make
make install
就build完且安裝完成了,需要注意…以上動作都要很久,要小心服用,電腦會暫時關不了…
以下為操作的過程
wget https://www.python.org/ftp/python/3.4.5/Python-3.4.5.tgz
會有問題如下:
root@arm:/opt# wget https://www.python.org/ftp/python/3.4.3/Python-3.4.3.tgz
--2016-09-29 16:35:57-- https://www.python.org/ftp/python/3.4.3/Python-3.4.3.tgz
Resolving www.python.org (www.python.org)... 151.101.192.223, 151.101.128.223, 151.101.64.223, ...
Connecting to www.python.org (www.python.org)|151.101.192.223|:443... connected.
ERROR: The certificate of `www.python.org' is not trusted.
ERROR: The certificate of `www.python.org' hasn't got a known issuer.
查了一下是ssl的問題,安裝一下就ok了
apt-get install ca-certificates
root@arm:/tmp# wget https://www.python.org/ftp/python/3.4.5/Python-3.4.5.tgz
--2016-09-29 18:13:56-- https://www.python.org/ftp/python/3.4.5/Python-3.4.5.tgz
Resolving www.python.org (www.python.org)... 151.101.192.223, 151.101.128.223, 151.101.64.223, ...
Connecting to www.python.org (www.python.org)|151.101.192.223|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 19611207 (19M) [application/octet-stream]
Saving to: `Python-3.4.5.tgz'
100%[======================================>] 19,611,207 274K/s in 45s
2016-09-29 18:14:44 (427 KB/s) - `Python-3.4.5.tgz' saved [19611207/19611207]
這樣就搞定了
---- 接著是build python的事了 ----
cd Python-3.4.5
./configure
make
make install
就build完且安裝完成了,需要注意…以上動作都要很久,要小心服用,電腦會暫時關不了…
2016年9月27日 星期二
[python] opencv 找出barcode
想到之前機器視覺做過的作業:讀barcode
於就想找找python+opencv關於這方面的code
第一步當然是先找出barcode囉
參考的是這一篇文章
其實他說明的已經很清楚了,但cv2的很多參數我仍是不清楚
且和之前學的影像處理連不太起來,還是memo一下的好
image = cv2.imread(args["image"])
讀圖進來,這沒問題
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
轉灰階,查opencv的說明為「Converts an image from one color space to another.」
因此cvtColor是用來轉換不同color space的函式
在python中長這樣
Python: cv2.cvtColor(src, code[, dst[, dstCn]]) → dst
Python: cv.CvtColor(src, dst, code) → None -->若是有給dst就會回None
最原本長這樣
C: void cvCvtColor(const CvArr* src, CvArr* dst, int code)
--> code – color space conversion code (see the description below)
常用的有:「CV_RGB2GRAY」、「CV_BGR2HSV」
gradX = cv2.Sobel(gray, ddepth = cv2.cv.CV_32F, dx = 1, dy = 0, ksize = -1)
gradY = cv2.Sobel(gray, ddepth = cv2.cv.CV_32F, dx = 0, dy = 1, ksize = -1)
gradient = cv2.subtract(gradX, gradY)
把gradX和gradY的每一個元素相減
gradient = cv2.convertScaleAbs(gradient)
取abs,把負的變正數
blurred = cv2.blur(gradient, (9, 9))
說明文件提到「Blurs an image using the normalized box filter.」
因此是用9x9的matrix,其中每個元素都是1,讓影像模糊
(_, thresh) = cv2.threshold(blurred, 225, 255, cv2.THRESH_BINARY)
用threshold處理影像,225為threshold value,255為達到的輸出值,
而cv2.THRESH_BINARY為thresholdType,看說明文件會更清楚
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (21, 7))
取得型態學中膨脹與腐蝕的運算mask
這個function得到的如下:
array([[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]], dtype=uint8)
換個shape
>>> cv2.getStructuringElement(cv2.MORPH_CROSS, (21, 7))
array([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]], dtype=uint8)
closed = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel)
對剛剛thresh的結果進行 MORPH_CLOSE操作
一般基本操作為侵蝕、膨脹(erode、dilate) --> 進一步Close操作為先dilate再erode,這樣可以把斷掉的東西連起來,因此稱為close,反之為open
可參考這邊的說明
closed = cv2.erode(closed, None, iterations = 4)
closed = cv2.dilate(closed, None, iterations = 4)
先連續進行4次erode,再連續4次dilate運算
[未完…寫累了…晚點再寫]
於就想找找python+opencv關於這方面的code
第一步當然是先找出barcode囉
參考的是這一篇文章
其實他說明的已經很清楚了,但cv2的很多參數我仍是不清楚
且和之前學的影像處理連不太起來,還是memo一下的好
image = cv2.imread(args["image"])
讀圖進來,這沒問題
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
轉灰階,查opencv的說明為「Converts an image from one color space to another.」
因此cvtColor是用來轉換不同color space的函式
在python中長這樣
Python: cv2.cvtColor(src, code[, dst[, dstCn]]) → dst
Python: cv.CvtColor(src, dst, code) → None -->若是有給dst就會回None
最原本長這樣
C: void cvCvtColor(const CvArr* src, CvArr* dst, int code)
--> code – color space conversion code (see the description below)
常用的有:「CV_RGB2GRAY」、「CV_BGR2HSV」
gradX = cv2.Sobel(gray, ddepth = cv2.cv.CV_32F, dx = 1, dy = 0, ksize = -1)
gradY = cv2.Sobel(gray, ddepth = cv2.cv.CV_32F, dx = 0, dy = 1, ksize = -1)
接著對圖做sobel運算,來找出x向和y向邊界 --> 這邊找了一下之前還有學到Prewitt operator,但在cv2中好像沒看到…
而以前學的sobel長這樣,不知道cv2中的是不是一樣的 (一篇論文人人實作不同丫,還是抱著懷疑的好)
由cv2.Sobel的說明來看,所謂的「kernel of size 3*3」應該是指之前學過的3x3的mask
預設的ksize=3
ddepth = cv2.cv.CV_32F --> 32=2^5,這邊的CV_32F即為5
dx = 1 --> x向的差值為1
且說明中也有提到「xorder = 0, yorder = 1, ksize = 3」、「xorder = 1, yorder = 0, ksize = 3」即為之前學的(上圖)中的y向和x向的maskgradient = cv2.subtract(gradX, gradY)
把gradX和gradY的每一個元素相減
gradient = cv2.convertScaleAbs(gradient)
取abs,把負的變正數
blurred = cv2.blur(gradient, (9, 9))
說明文件提到「Blurs an image using the normalized box filter.」
因此是用9x9的matrix,其中每個元素都是1,讓影像模糊
(_, thresh) = cv2.threshold(blurred, 225, 255, cv2.THRESH_BINARY)
用threshold處理影像,225為threshold value,255為達到的輸出值,
而cv2.THRESH_BINARY為thresholdType,看說明文件會更清楚
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (21, 7))
取得型態學中膨脹與腐蝕的運算mask
這個function得到的如下:
array([[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]], dtype=uint8)
換個shape
>>> cv2.getStructuringElement(cv2.MORPH_CROSS, (21, 7))
array([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]], dtype=uint8)
closed = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel)
對剛剛thresh的結果進行 MORPH_CLOSE操作
一般基本操作為侵蝕、膨脹(erode、dilate) --> 進一步Close操作為先dilate再erode,這樣可以把斷掉的東西連起來,因此稱為close,反之為open
可參考這邊的說明
closed = cv2.erode(closed, None, iterations = 4)
closed = cv2.dilate(closed, None, iterations = 4)
先連續進行4次erode,再連續4次dilate運算
[未完…寫累了…晚點再寫]
2016年9月26日 星期一
[python] opencv環境建立
參考這一篇
https://sourceforge.net/projects/numpy/files/NumPy/1.7.1/numpy-1.7.1-win32-superpack-python2.7.exe/download
使用的軟體版本:
1. python2.7
2. numpy
3. matplotlib
4. opencv
opencv要先到這邊下載新版本的opencv,我下載的是opencv2.4.13,下載下來的是一個.exe檔,其實它是一個7z的自解壓縮檔,執行、解壓即可
然後到.\opencv\build\python\2.7\x86 中把 cv2.pyd 複製到 「C:\Python27\Lib\site-packages」中
然後以下列指令確認是否可以使用opencv
>>> import cv2
>>> print cv2.__version__
2.4.13
>>>
如上所示就ok了,但還有要讓cv2知道opencv的安裝資料夾
-->某個文章中寫的,但是我沒有設定path也能起,蠻怪的,還是有些重要的東西才沒有在cv2.pyd中呢?
把彩色圖轉為灰階
>>> import cv2
>>> image = cv2.imread('pic2.jpg')
>>> gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
>>> cv2.imwrite('gray_pic2.jpg', gray_image)
True
這樣就ok了
https://sourceforge.net/projects/numpy/files/NumPy/1.7.1/numpy-1.7.1-win32-superpack-python2.7.exe/download
使用的軟體版本:
1. python2.7
2. numpy
3. matplotlib
4. opencv
opencv要先到這邊下載新版本的opencv,我下載的是opencv2.4.13,下載下來的是一個.exe檔,其實它是一個7z的自解壓縮檔,執行、解壓即可
然後到.\opencv\build\python\2.7\x86 中把 cv2.pyd 複製到 「C:\Python27\Lib\site-packages」中
然後以下列指令確認是否可以使用opencv
>>> import cv2
>>> print cv2.__version__
2.4.13
>>>
如上所示就ok了,但還有要讓cv2知道opencv的安裝資料夾
-->某個文章中寫的,但是我沒有設定path也能起,蠻怪的,還是有些重要的東西才沒有在cv2.pyd中呢?
把彩色圖轉為灰階
>>> import cv2
>>> image = cv2.imread('pic2.jpg')
>>> gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
>>> cv2.imwrite('gray_pic2.jpg', gray_image)
True
這樣就ok了
2016年9月21日 星期三
[Javascript] 跨domain取存網頁資料的問題
本來想先在heroku上先佈署好app,有了web-api後就可以在local端寫web的code比較不用改一點就上傳,一直在等…
結果出現了錯誤如下:(後來為了求快,因此改在local端執行我的flask程式,因此會看到127.0.0.1)
XMLHttpRequest cannot load http://127.0.0.1:5000/get_meeting_room_data. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'null' is therefore not allowed access.
1.先使用flask-crossdomain:
參考這邊
http://flask.pocoo.org/snippets/56/
先安裝這個
https://pypi.python.org/pypi/flask-crossdomain/0.1
在程式開頭加入
import flask_crossdomain
然後在需要被存取的web服務加入
@crossdomain(origin='*')
比如說:
@app.route('/get_meeting_room_data2')
#@crossdomain(origin='*')
def get_meeting_room_data2():
......
但是出現了以下的錯誤:
Traceback (most recent call last):
File "E:\workspace\python\flask\flask_step2_local\app.py", line 103, in <module>
@crossdomain(origin='*')
NameError: name 'crossdomain' is not defined
仍有問題 --> 還要再了解看看是哪兒出了錯
2. 後來改用「Flask-CORS」就正常了
https://flask-cors.readthedocs.io/en/latest/先安裝
pip install -U flask-cors
在程式中加入以下即可:
from flask_cors import CORS, cross_origin
app = Flask(__name__) CORS(app)
三行就搞定收工了!
非常方便
在javascript的部份則如下
function getData3() { $.get( "http://127.0.0.1:5001/get_meeting_room_data", function( data ) { var json_obj = $.parseJSON(data); } }); }
function getData3() { $.get( "http://127.0.0.1:5001/get_meeting_room_data", function( data ) { var json_obj = $.parseJSON(data); } }); }
2016年9月20日 星期二
[html] memo一下html的標簽… 由樣板來學習
參考的頁面:
http://www.openwebdesign.org/viewdesign.phtml?id=6386&referer=%2F
先看 <head> 中的東西:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>ZEN - A Free HTML5 Template With Perfect Balance</title>
<meta name="description" content="Zen is a free XHTML template released on a creative commons attribution license" />
<meta name="keywords" content="Zen Template" />
<link rel="stylesheet" type="text/css" href="style.css"/>
<link rel="icon" href="images/favicon.ico" type="image/x-icon" />
<link href='http://fonts.googleapis.com/css?family=Voces' rel='stylesheet' type='text/css' />
</head>
<title>包起來的東西是browser上標題,有多分頁時,會顯示在分頁上
<meta name="keywords" content="Zen Template" />
網站的keyword,給搜尋引擎用的
沒有給網站描述時,搜尋引擎通常會自動抓網頁的前25字做為網頁內容摘要
<meta name="description"
則是對網站(頁)的說明
<meta>的說明可以看這邊:
http://www.pcnet.idv.tw/pcnet/html/17.htm
<link rel="stylesheet" type="text/css" href="style.css"/>
rel 屬性規定當前文檔與被鏈接文檔之間的關係。
表示rel指出style.css為「文檔的外部樣式表。」
<link rel="icon" type="image/x-icon" href="images/favicon.ico" />
指出"images/favicon.ico"為icon
<link href='http://fonts.googleapis.com/css?family=Voces' rel='stylesheet' type='text/css' />
則是使用google的提供的字型服務
==== 進入body區塊 ====
<div class="wrap">...</div>
說明可以參考這邊。
Div 這個標籤目的是將內容分為不同的區域,而每一個區域可以根據 CSS 中的宣告而有自己的樣式。Div 是一個區塊級容器 (block-level container),這代表在 </div> 標籤後會換行。
(另提一下,還有一個類似的東西叫作span功能是差不多的,在 </span> 之後並不會換行。)
而class="wrap"則引用了css中的
.wrap {
float:left;
position:relative;
right:-25%;
width: 945px;
}
其中「float:left;」可以讓文字、圖片浮動的置於「左邊」,若是寫「float:right;」
「position」比較複雜,先記著他是和定位相關的東西,基本上有static, relative, fixed
<div class="header">
定義上半部的高度,寬度
<div class="social">
則是那些twitter, fb, 的icon,因為是float:right,所以順序是由右往左排
<div id="menu">
因為是id,所以在css中是以#開頭
#menu {
float:left;
position:relative;
top:27px;
left:6px;
display:block;
width:608px;
}
<ul><li> 在menu中會把<li>包起來的項目列出來,可參考這邊,另外這邊有介紹如何用Dreamweaver做menu。
#menu ul {
list-style-type: none;
width: 608px;
}
這邊設定了每個項目前的記號為何,none (沒有)、disc (全黑圓圈)、circle (空心圓圈)、square (正方形)
#menu ul li {
display: block;
float: left;
width: 115px;
height: 32px;
}
又因為ul li這邊有設定為「float: left」,因此會變成連續排列,不換行的方框
#menu a, #menu a:visited {
display: block;
width:100px;
height:32px;
background:url(images/nav.png);
background-position:left top;
background-color:transparent;
text-align:center;
color:#ffffff;
line-height:32px;
text-decoration:none;
font-family:arial, sans-serif;
font-weight:bold;
margin-top:5px;
}
這邊設定平時呈現的樣式
#menu a:hover {
background-position: -100px 0px;
line-height:32px;
overflow:hidden;
color:#ffffff;
}
這邊設定當滑鼠經過時要呈現的樣式
若不想要有圖片為背景,可改為以下,仍有類似的效果,只是變成單一色塊而已
主要是加上的background-color
#menu a:hover {
background-position: -100px 0px;
line-height:32px;
overflow:hidden;
color:#ffffff;
background-color:#90d762;
}
#menu a, #menu a:visited {
display: block;
width:100px;
height:32px;
background-position:left top;
background-color:#6dbb14;
text-align:center;
color:#ffffff;
line-height:32px;
text-decoration:none;
font-family:arial, sans-serif;
font-weight:bold;
margin-top:5px;
}
在下半部內容的部份,以「<div class="page">」利用float配合「main」、「sidebar」,把畫面切為一左右二個部份
http://www.openwebdesign.org/viewdesign.phtml?id=6386&referer=%2F
先看 <head> 中的東西:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>ZEN - A Free HTML5 Template With Perfect Balance</title>
<meta name="description" content="Zen is a free XHTML template released on a creative commons attribution license" />
<meta name="keywords" content="Zen Template" />
<link rel="stylesheet" type="text/css" href="style.css"/>
<link rel="icon" href="images/favicon.ico" type="image/x-icon" />
<link href='http://fonts.googleapis.com/css?family=Voces' rel='stylesheet' type='text/css' />
</head>
<title>包起來的東西是browser上標題,有多分頁時,會顯示在分頁上
<meta name="keywords" content="Zen Template" />
網站的keyword,給搜尋引擎用的
沒有給網站描述時,搜尋引擎通常會自動抓網頁的前25字做為網頁內容摘要
則是對網站(頁)的說明
<meta>的說明可以看這邊:
http://www.pcnet.idv.tw/pcnet/html/17.htm
<link rel="stylesheet" type="text/css" href="style.css"/>
rel 屬性規定當前文檔與被鏈接文檔之間的關係。
表示rel指出style.css為「文檔的外部樣式表。」
<link rel="icon" type="image/x-icon" href="images/favicon.ico" />
指出"images/favicon.ico"為icon
<link href='http://fonts.googleapis.com/css?family=Voces' rel='stylesheet' type='text/css' />
則是使用google的提供的字型服務
==== 進入body區塊 ====
<div class="wrap">...</div>
說明可以參考這邊。
Div 這個標籤目的是將內容分為不同的區域,而每一個區域可以根據 CSS 中的宣告而有自己的樣式。Div 是一個區塊級容器 (block-level container),這代表在 </div> 標籤後會換行。
(另提一下,還有一個類似的東西叫作span功能是差不多的,在 </span> 之後並不會換行。)
而class="wrap"則引用了css中的
.wrap {
float:left;
position:relative;
right:-25%;
width: 945px;
}
其中「float:left;」可以讓文字、圖片浮動的置於「左邊」,若是寫「float:right;」
「position」比較複雜,先記著他是和定位相關的東西,基本上有static, relative, fixed
<div class="header">
定義上半部的高度,寬度
<div class="social">
則是那些twitter, fb, 的icon,因為是float:right,所以順序是由右往左排
<div id="menu">
因為是id,所以在css中是以#開頭
#menu {
float:left;
position:relative;
top:27px;
left:6px;
display:block;
width:608px;
}
<ul><li> 在menu中會把<li>包起來的項目列出來,可參考這邊,另外這邊有介紹如何用Dreamweaver做menu。
#menu ul {
list-style-type: none;
width: 608px;
}
這邊設定了每個項目前的記號為何,none (沒有)、disc (全黑圓圈)、circle (空心圓圈)、square (正方形)
#menu ul li {
display: block;
float: left;
width: 115px;
height: 32px;
}
又因為ul li這邊有設定為「float: left」,因此會變成連續排列,不換行的方框
#menu a, #menu a:visited {
display: block;
width:100px;
height:32px;
background:url(images/nav.png);
background-position:left top;
background-color:transparent;
text-align:center;
color:#ffffff;
line-height:32px;
text-decoration:none;
font-family:arial, sans-serif;
font-weight:bold;
margin-top:5px;
}
這邊設定平時呈現的樣式
#menu a:hover {
background-position: -100px 0px;
line-height:32px;
overflow:hidden;
color:#ffffff;
}
這邊設定當滑鼠經過時要呈現的樣式
若不想要有圖片為背景,可改為以下,仍有類似的效果,只是變成單一色塊而已
主要是加上的background-color
#menu a:hover {
background-position: -100px 0px;
line-height:32px;
overflow:hidden;
color:#ffffff;
background-color:#90d762;
}
#menu a, #menu a:visited {
display: block;
width:100px;
height:32px;
background-position:left top;
background-color:#6dbb14;
text-align:center;
color:#ffffff;
line-height:32px;
text-decoration:none;
font-family:arial, sans-serif;
font-weight:bold;
margin-top:5px;
}
在下半部內容的部份,以「<div class="page">」利用float配合「main」、「sidebar」,把畫面切為一左右二個部份
2016年9月9日 星期五
[html] 解析html, javascript code的網頁
今天同事介紹這樣的網頁還不錯
https://jsfiddle.net/
可以線上解析網頁程式,並即時呈現
還可以存成一個網頁,分享給別人一同觀看,但不知道可以保留多久~
https://jsfiddle.net/
可以線上解析網頁程式,並即時呈現
還可以存成一個網頁,分享給別人一同觀看,但不知道可以保留多久~
[html] div
最近在學python + Flask的網頁設計,發現沒有多了解html, javascript還真的不行…
有沒有只學python就能設計網頁的方法丫!! 就像以前學java時,用javalet就能把所有要顯示的東西,動畫都包起來做,沒有寫什麼html也行…
好啦~ 沒找到方法前,只能好好的學html + javascript...
最近看人家的code,很多都用div這東西,和我之前寫的很難看的網頁都用frame, table的方式很不一樣
查了一下,可以參考這一篇的說明 (如果不希望copy內容再請通知我拿掉…)
原來新一代的設計採用 CSS + DIV 的排板方式 --> 和我同事說的一樣,所以要好好學
DIV 可以解釋為區塊,用 DIV 標籤包起來的東西,瀏覽器會視為一個物件,大致長成這樣 <div>內容</div>,你可以用 div 將網頁內容的各區塊包起來,再去做 CSS 排板,目前所有的主流瀏覽器都支援 DIV 標籤
瀏覽器自動為每個 div 結尾後面加上換行的動作
要讓 DIV 由左至右排列,可以使用 float(浮動)語法來達成。
如:
<div style="float:left;width:50%;overflow:hidden;height:44px">
有沒有只學python就能設計網頁的方法丫!! 就像以前學java時,用javalet就能把所有要顯示的東西,動畫都包起來做,沒有寫什麼html也行…
好啦~ 沒找到方法前,只能好好的學html + javascript...
最近看人家的code,很多都用div這東西,和我之前寫的很難看的網頁都用frame, table的方式很不一樣
查了一下,可以參考這一篇的說明 (如果不希望copy內容再請通知我拿掉…)
原來新一代的設計採用 CSS + DIV 的排板方式 --> 和我同事說的一樣,所以要好好學
DIV 可以解釋為區塊,用 DIV 標籤包起來的東西,瀏覽器會視為一個物件,大致長成這樣 <div>內容</div>,你可以用 div 將網頁內容的各區塊包起來,再去做 CSS 排板,目前所有的主流瀏覽器都支援 DIV 標籤
瀏覽器自動為每個 div 結尾後面加上換行的動作
要讓 DIV 由左至右排列,可以使用 float(浮動)語法來達成。
如:
<div style="float:left;width:50%;overflow:hidden;height:44px">
2016年9月8日 星期四
[python] virtualenv 真方便
寫了很久的python,還直的沒使用過virtualenv
最近在使用heroku時,在一篇教學文中提到了這個東西
於是開始試著使用一下
先memo一些指令
以下指令是參考這一篇的,以後再來對自己使用的指令做memo
安裝
cd pyhack
在linux下使用這個指令
source bin/activate
在windows下使用這個指令
Scripts\activate.bat
來開始virtualenv
我的是windows就會看到提示文字變成
(pyhack) E:\workspace\python\pyhack\pyhack>
這樣就可以開始使用了!!
最近在使用heroku時,在一篇教學文中提到了這個東西
於是開始試著使用一下
先memo一些指令
以下指令是參考這一篇的,以後再來對自己使用的指令做memo
安裝
easy_install virtualenv
建環境$ virtualenv pyhack
另外這篇提到不使用原環境的套件的方法,晚一點再來試試看是不是更好$ virtualenv --no-site-packages [指定虛擬環境的名稱]
進入環境資料夾cd pyhack
在linux下使用這個指令
source bin/activate
在windows下使用這個指令
Scripts\activate.bat
來開始virtualenv
我的是windows就會看到提示文字變成
(pyhack) E:\workspace\python\pyhack\pyhack>
這樣就可以開始使用了!!
2016年9月7日 星期三
使用Flot畫圖
想要的愈多,結果就是要引入越來越多的套件…
本來只是想在Heroku上做的雲端應用,做IOT的資料庫
但資料不表現出來又覺得有所不足,就這樣越陷越深…
想把後台的資料顯非到網頁上,當然在前端的JS就需要進行畫圖的工作
這邊我找到的jquery進一步提供的套件flot
http://www.flotcharts.org/
一開始當然是看demo比較快囉
由\flot\examples\basic-usage 可以了解基本的線怎麼畫,怎麼看code就是個人造化了,有這樣的基本線索和jquery的基礎應該是不成問題的~
以下是我改的一個範例,當然要把相關js的位置配置好才行:
首先,「js/flot/jquery.min.js」、「js/flot/jquery.flot.min.js」,「css/examples.css」要先依路徑放上來才行
這樣開啟網頁就會出現隨機繪製的折線圖,大功造成!!
下一次就是把他變成動態的!! 雖然知道flot有範例,但這邊先不看,依對js的理解先寫寫看,試出來了,有時間再看看別人的是不是比較好!
當然!! 最後的最後,是要把他放到heroku上才行,並且要能和後台的python互動才行!
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Flot Examples: Basic Usage</title>
<link href="css/examples.css" rel="stylesheet" type="text/css">
<script language="javascript" type="text/javascript" src="js/flot/jquery.min.js"></script>
<script language="javascript" type="text/javascript" src="js/flot/jquery.flot.min.js"></script>
<!-- the way for static but no route
<link href="{{url_for('static', filename='css/examples.css') }}" rel="stylesheet" type="text/css">
<script type=text/javascript src="{{url_for('static', filename='js/flot/jquery.js') }}"></script>
<script type=text/javascript src="{{url_for('static', filename='js/flot/jquery.flot.min.js') }}"></script>
-->
<script type="text/javascript">
$(function() {
// plot chart2
var data = [];
var now = new Date().getTime();
for (var i=0; i<50; i++)//while (data.length < totalPoints)
{
var yData = Math.random() * 100;
var temp = [i, yData];
//var temp = [now += 60, yData];
data.push(temp);
}
$.plot("#myplace1", [data]);
});
</script>
</head>
<body>
<div id="header">
<h2>Plot Demo</h2>
</div>
<div id="content">
<div class="demo-container">
<div id="myplace1" class="demo-placeholder"></div>
</div>
</div>
</body>
</html>
本來只是想在Heroku上做的雲端應用,做IOT的資料庫
但資料不表現出來又覺得有所不足,就這樣越陷越深…
想把後台的資料顯非到網頁上,當然在前端的JS就需要進行畫圖的工作
這邊我找到的jquery進一步提供的套件flot
http://www.flotcharts.org/
一開始當然是看demo比較快囉
由\flot\examples\basic-usage 可以了解基本的線怎麼畫,怎麼看code就是個人造化了,有這樣的基本線索和jquery的基礎應該是不成問題的~
以下是我改的一個範例,當然要把相關js的位置配置好才行:
首先,「js/flot/jquery.min.js」、「js/flot/jquery.flot.min.js」,「css/examples.css」要先依路徑放上來才行
這樣開啟網頁就會出現隨機繪製的折線圖,大功造成!!
下一次就是把他變成動態的!! 雖然知道flot有範例,但這邊先不看,依對js的理解先寫寫看,試出來了,有時間再看看別人的是不是比較好!
當然!! 最後的最後,是要把他放到heroku上才行,並且要能和後台的python互動才行!
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Flot Examples: Basic Usage</title>
<link href="css/examples.css" rel="stylesheet" type="text/css">
<script language="javascript" type="text/javascript" src="js/flot/jquery.min.js"></script>
<script language="javascript" type="text/javascript" src="js/flot/jquery.flot.min.js"></script>
<!-- the way for static but no route
<link href="{{url_for('static', filename='css/examples.css') }}" rel="stylesheet" type="text/css">
<script type=text/javascript src="{{url_for('static', filename='js/flot/jquery.js') }}"></script>
<script type=text/javascript src="{{url_for('static', filename='js/flot/jquery.flot.min.js') }}"></script>
-->
<script type="text/javascript">
$(function() {
// plot chart2
var data = [];
var now = new Date().getTime();
for (var i=0; i<50; i++)//while (data.length < totalPoints)
{
var yData = Math.random() * 100;
var temp = [i, yData];
//var temp = [now += 60, yData];
data.push(temp);
}
$.plot("#myplace1", [data]);
});
</script>
</head>
<body>
<div id="header">
<h2>Plot Demo</h2>
</div>
<div id="content">
<div class="demo-container">
<div id="myplace1" class="demo-placeholder"></div>
</div>
</div>
</body>
</html>
2016年9月6日 星期二
[Flask] static file的存取
參考這邊:
http://docs.jinkan.org/docs/flask/quickstart.html#routing
在route規則中可以這樣寫
所以打入url/user/malo --> username就會是malo
另一種寫法,把post_id轉為int型態
<converter:variable_name>
但在這邊,寫了好幾個converter
http://flask.pocoo.org/docs/0.11/quickstart/#variable-rules
string和path主要分別在於path可以包含slash
http://docs.jinkan.org/docs/flask/quickstart.html#routing
在route規則中可以這樣寫
@app.route('/user/<username>') def show_user_profile(username): # show the user profile for that user return 'User %s' % username網頁url/user/username 這個username的字會被username變數接收
所以打入url/user/malo --> username就會是malo
另一種寫法,把post_id轉為int型態
<converter:variable_name>
@app.route('/post/<int:post_id>') def show_post(post_id): # show the post with the given id, the id is an integer return 'Post %d' % post_id中文的資料只有說3種converter
但在這邊,寫了好幾個converter
http://flask.pocoo.org/docs/0.11/quickstart/#variable-rules
string和path主要分別在於path可以包含slash
@app.route('/user/<username>')
def show_user_profile(username):
# show the user profile for that user
return 'User %s' % username
@app.route('/post/<int:post_id>')
def show_post(post_id):
# show the post with the given id, the id is an integer
return 'Post %d' % post_id
The following converters exist:
string | accepts any text without a slash (the default) |
int | accepts integers |
float | like int but for floating point values |
path | like the default but also accepts slashes |
any | matches one of the items provided |
uuid | accepts UUID strings |
[sublime] 初體驗,原來也可以直接run
之前一直習慣使用pyScripter開發python程式,一直覺得pyScripter最棒的地方是按著control鈕,用滑鼠點一下變數、函式,就會跳到他的定義處,超好用的
最近,看網友們常在推sublime,說這ide超好用,之前是聽寫arduino的人說好用的…
但一直都還不是很習慣,最主要應該是pyScripter有的功能在sublime一時都還找不到吧
不過覺得sublime不錯的地方是不管什麼語言都已經預設好黑底的配色,對眼睛蠻友善的
最需要的就是直接執行程式的功能了
tools/build -->就可以run程式了
要取消執行,一般要送出Ctrl^Z但是在,sublime的console中無法用鍵盤送出Ctrl^Z
因此要使用tools / cancel build 來停止
而sublime解析python code的功能,還有在程式中跳往定義,再回來的功能好像有點缺乏,用外掛也不是很強…
最近,看網友們常在推sublime,說這ide超好用,之前是聽寫arduino的人說好用的…
但一直都還不是很習慣,最主要應該是pyScripter有的功能在sublime一時都還找不到吧
不過覺得sublime不錯的地方是不管什麼語言都已經預設好黑底的配色,對眼睛蠻友善的
最需要的就是直接執行程式的功能了
tools/build -->就可以run程式了
要取消執行,一般要送出Ctrl^Z但是在,sublime的console中無法用鍵盤送出Ctrl^Z
因此要使用tools / cancel build 來停止
而sublime解析python code的功能,還有在程式中跳往定義,再回來的功能好像有點缺乏,用外掛也不是很強…
2016年1月27日 星期三
Lua: 撰寫函式庫
在Lua中要寫一個library給別人使用可以依以下寫下法處理
在my_module.lua中程式為:
local myMod = {}
function myMod.add(a, b)
return (a+b)
end
function myMod.dot(a, b)
return (a*b)
end
return myMod
在my_module.lua中程式為:
local myMod = {}
function myMod.add(a, b)
return (a+b)
end
function myMod.dot(a, b)
return (a*b)
end
return myMod
在主程式中則可以這樣引用
local myMod = require("my_module")
print(myMod.add(10, 20))
print(myMod.dot(3, 5))
print(myMod.add(2, myMod.dot(3, 4)))
require()用來把需要的library引入
若想要寫成像物件那樣好像也可以使用module的方式處理…現在還沒讀到,晚點再介紹這部份
另外,還可以幫模組(或是說變數)動態增加function
local myMod = require("my_module")
function myMod.print(a, b)
print("value=", a, b)
end
function myMod:print2(a, b, c)
print("value2=", a, b, c)
end
print(myMod.add(10, 20))
print(myMod.dot(3, 5))
print(myMod.add(2, myMod.dot(3, 4)))
myMod.print(11, 22)
myMod.print2(111, 222, 333, 444)
--[[結果為
30
15
14
value= 11 22
value2= 222 333 444
]]
這邊還不是很懂「.」和「:」的差異…
由網路查來的說法是
function myMod:print2(a, b, c)
等同於 function myMod.print(self, a, b, c)
多了一個把自己當成引數
因此把第二個function改為
function myMod:print2(a, b, c)
print("value2=", a, b, c)
print('type=', self)
end
myMod.print(111, 222, 333, 444)
則會印出
value2= 222 333 444
type= 111
2016年1月24日 星期日
Lua: String
之前有提到在做一些自訂或別人定義的protocol時會常需要使用string來組一些binary資料,因此string的各種操作就顯示蠻重要的
-----
string.byte 字串轉為byte array table
print(string.byte("abcde")) --> 97
print(string.byte("abcde", 3)) --> 99 也就是 'c'
print(string.byte("abced", 2, 4)) --> 98 99 101
------
string.char() --> 這是最重要,目前最常用的
string.char(0, 65)
--> 得到的一個string,由binary的0, 65組成 (注意是10進制的!)
------
string.len(str) 取得字串長度
------
string.rep( s, n ) 也是個方便常用的東西,測試要填重複資料時蠻好用的
print(string.rep("123_", 4))
--> 結果 123_123_123_123_
------
string.sub( s, i [, j] )
print(string.sub("abcde", 3, 4))
-->結果為 cd
------
string.upper(str) / string.lower(str)
即全變大寫 / 小寫
---------
string.find( s, pattern [, init [, plain], ] )
--> pattern 的表示方式應該蠻重要的,晚一點再多寫點範例
print(string.find("abc_123", "abc")) --> 1 3 回傳找到字串的起始index、結束index
print(string.find("abc_123", "abc", 3)) --> nil 從index=3開始找,找不到就回傳 nil
--------
string.format( formatstring [, ...] )
print(string.format('%d, %x, %X, %.4f', 10, 10, 10, 10/3))
--> 10, a, A, 3.3333
-------
string.match( s, pattern [, init] ) 在s中找pattern是否在,若有就回傳些相符的string
print(string.match('time is 2015/10/3 12:15:30', '%d+/%d+/%d'))
--> 得到 2015/10/3
-------
string.gmatch( s, pattern ) 疊代回傳所有相符的string
還不是很會用,先寫個範例
str = "it a big apple"
for item in string.gmatch(str, '%a+') do
print(item)
end
--[[回傳結果
it
a
big
apple
]]
-----
string.byte 字串轉為byte array table
print(string.byte("abcde")) --> 97
print(string.byte("abcde", 3)) --> 99 也就是 'c'
print(string.byte("abced", 2, 4)) --> 98 99 101
------
string.char() --> 這是最重要,目前最常用的
string.char(0, 65)
--> 得到的一個string,由binary的0, 65組成 (注意是10進制的!)
------
string.len(str) 取得字串長度
------
string.rep( s, n ) 也是個方便常用的東西,測試要填重複資料時蠻好用的
print(string.rep("123_", 4))
--> 結果 123_123_123_123_
------
string.sub( s, i [, j] )
print(string.sub("abcde", 3, 4))
-->結果為 cd
------
string.upper(str) / string.lower(str)
即全變大寫 / 小寫
---------
string.find( s, pattern [, init [, plain], ] )
--> pattern 的表示方式應該蠻重要的,晚一點再多寫點範例
print(string.find("abc_123", "abc")) --> 1 3 回傳找到字串的起始index、結束index
print(string.find("abc_123", "abc", 3)) --> nil 從index=3開始找,找不到就回傳 nil
--------
string.format( formatstring [, ...] )
print(string.format('%d, %x, %X, %.4f', 10, 10, 10, 10/3))
--> 10, a, A, 3.3333
-------
string.match( s, pattern [, init] ) 在s中找pattern是否在,若有就回傳些相符的string
print(string.match('time is 2015/10/3 12:15:30', '%d+/%d+/%d'))
--> 得到 2015/10/3
-------
string.gmatch( s, pattern ) 疊代回傳所有相符的string
還不是很會用,先寫個範例
str = "it a big apple"
for item in string.gmatch(str, '%a+') do
print(item)
end
--[[回傳結果
it
a
big
apple
]]
Lua: Table
Table 是很重要的,因此另外記下它的用法!
Table的索引可以是 nil外的任何類型的變數,當然最常用的還是number和string
先來個例子比較好理解
> t = {
>> name = "jeff", --> 可以理解為使用string當成取值的key
>> phone = {'09123456', '04-2222333'}, -->一樣,但值改為另一個table
>> email = 'abc@gmail.com',
>> 60, --kg --> 不指定index key,因此為流水號,為[1]
>> 170, --cm --> 不指定index key,因此為流水號,為[2]
>> [5] = 'apple' --> 指定為[5]
>> ,
>> ['sport'] = 'football'
>> }
> print(t.name, t.phone, t.email) -->第二個因為是table,所以印出來的是table的address
jeff table: 004346C0 abc@gmail.com
> print(t[1], t[2], t[3], t[4], t[5]) -->因為只有[1], [2], [5]有值,所以其它的為nil
60 170 nil nil apple
> print(t['sport'], t.phone[1])
football 09123456
> print(t.sport) -->這裡就更重要了,可看.sport和['sport']是等效的
football
> print(t['name']) -->反過來也OK
jeff
> print(t.5) --> 但是數字的index不能使用.5的方式的表示
stdin:1: ')' expected near '.5'
這邊可以看出一個現象:Lua的index是由1算起的,比較像basic不像C
--------------
取得元素的個數,這就讓我疑惑了…
> print(table.getn(t))
2
可以了解,getn()只會取得以number為index key的元素數量,且從1開始算起,直到nil為止!!
因為t[3]是nil,所以被判定為只有2個元素
--> 要很小心,不要在 Table中隨便的使用 nil,如果這一個元素真的用不到就直接remove掉
--------------
concat 把所有元素結合在一起,是個很方便的用法,等於是把所有元素都用..連起來
> t2 = {1, 2, 3, "44"}
> print(table.concat(t2))
12344
> print(table.concat(t2, ", "))
1, 2, 3, 44
> print(table.concat(t2, " ", 2, 4))
2 3 44
---------------
insert(table, [index, ] value)
> print(table.concat(t2, " ", 2, 4)
> print(table.concat(t2, ", "))
11, 1, 2, 3, 44
> table.insert(t2, 99)
> print(table.concat(t2, ", "))
11, 1, 2, 3, 44, 99
-----------------
remove(table, index)
> table.remove(t2, 1)
> print(table.concat(t2, ", "))
1, 2, 3, 44, 99
-------------------
maxn(table) 取得最大的index
> print(table.maxn(t2))
5
###!!! 要注意的,之前提到的nil的事,以下的操作並不會讓max index增加!,因此說這用法很方便,但很有陷井
> table[7] = 7
> print(table.concat(t2, ", "))
1, 2, 3, 44, 99
> print(table.maxn(t2))
5
-------------------
sort(table [, compare])
local t = {1, 2, 7, 5, 3}
table.sort( t )
print(table.concat(t, ", "))
--> 1, 2, 3, 5, 7
local function compare(x, y)
return x > y
end
table.sort(t, compare)
print(table.concat(t, ", "))
-->7, 5, 3, 2, 1
sort(table [, compare])
local t = {1, 2, 7, 5, 3}
table.sort( t )
print(table.concat(t, ", "))
--> 1, 2, 3, 5, 7
local function compare(x, y)
return x > y
end
table.sort(t, compare)
print(table.concat(t, ", "))
-->7, 5, 3, 2, 1
2016年1月23日 星期六
Lua: Function
function的基本寫法
function max(a, b)
if(a>b) then return a
else return b
end
end
print(max(10, 20))
--> 印出來的結果為 20
但如果這樣寫就會出錯,還不清楚為何…
> local function max(a, b)
>> if(a>b) then return a
>> else return b
>> end
>> end
> print(max(10, 20))
stdin:1: attempt to call global 'max' (a nil value)
stack traceback:
stdin:1: in main chunk
[C]: ?
因為function都是以「傳值」的方式在處理參數,因此會有以下的結果
> function func1(a, b)
>> local tmp = a
>> a = b
>> b = tmp
>> print("change in function:", a, b)
>> end
> x = 1
> y = 2
> func1(x, y)
change in function: 2 1
> print(x, y)
1 2
當傳入function的參數較function定義的參數多時基本上不會有問題,系統會把多的拿掉
> function func2(a, b)
>> print(a, b)
>> end
> func2(1, 2)
1 2
> func2(1, 2, 3, 4)
1 2
又或傳入的參數較function定義的參數少時也不會有問題,系統會自動補 nil進來
> function func3(a, b, c, d)
>> print(a, b, c, d)
>> end
> func3(1, 2)
1 2 nil nil
不固定數量的function參數雖然說可以用,但是我的Lua卻是error的
> funcation func4(...)
stdin:1: '=' expected near 'func4'
function max(a, b)
if(a>b) then return a
else return b
end
end
print(max(10, 20))
--> 印出來的結果為 20
但如果這樣寫就會出錯,還不清楚為何…
> local function max(a, b)
>> if(a>b) then return a
>> else return b
>> end
>> end
> print(max(10, 20))
stdin:1: attempt to call global 'max' (a nil value)
stack traceback:
stdin:1: in main chunk
[C]: ?
因為function都是以「傳值」的方式在處理參數,因此會有以下的結果
> function func1(a, b)
>> local tmp = a
>> a = b
>> b = tmp
>> print("change in function:", a, b)
>> end
> x = 1
> y = 2
> func1(x, y)
change in function: 2 1
> print(x, y)
1 2
當傳入function的參數較function定義的參數多時基本上不會有問題,系統會把多的拿掉
> function func2(a, b)
>> print(a, b)
>> end
> func2(1, 2)
1 2
> func2(1, 2, 3, 4)
1 2
又或傳入的參數較function定義的參數少時也不會有問題,系統會自動補 nil進來
> function func3(a, b, c, d)
>> print(a, b, c, d)
>> end
> func3(1, 2)
1 2 nil nil
不固定數量的function參數雖然說可以用,但是我的Lua卻是error的
> funcation func4(...)
stdin:1: '=' expected near 'func4'
Lua: 流程控制
for --> 一般的用法
--> 印出1~5的數字
for i=1, 5 do
print(i)
end
--> 印出1, 3, 5, 7, 9,第三個參數step也可以是負數
for i=1, 10, 2 do
print(i)
end
for --> 像 for...each的用法 (iterator)
a = {'a', 'b', 'c', 'd'}
for i, v in ipairs(a) do
print('index('..i..') = '..v)
end
--[[ 結果印出如下
index(1) = a
index(2) = b
index(3) = c
index(4) = d
]]
而使用 pairs也是一樣的結果? --> 這個再查一下…
for k,j in pairs(a) do
print(k, j)
end
--[[ 結果如下
1 a
2 b
3 c
4 d
]]
while
語法為
x=1
while x<5 do
x=x+1
print(x)
end
--[[結果如下
2
3
4
5
]]
可以用 break 跳出迴圈,但沒有continue ?
此外也有repeat的loop寫法,不過我想固定使用一種就好了,免的搞亂了…畢竟有時才寫一下Lua而已,簡單是王道
repeat
x=x+1
print(x)
until (x>5)
--[[結果為
2
3
4
5
6
]]
if...then...else...end
例子如下
if(5>3) then
print(5)
else
print(3)
end
--> 結果為 5
也有elseif的用法
x = 70
if(x>90) then print(">90")
elseif(x>60) then print(">60")
else print("<60")
end
--> 60
--> 印出1~5的數字
for i=1, 5 do
print(i)
end
--> 印出1, 3, 5, 7, 9,第三個參數step也可以是負數
for i=1, 10, 2 do
print(i)
end
for --> 像 for...each的用法 (iterator)
a = {'a', 'b', 'c', 'd'}
for i, v in ipairs(a) do
print('index('..i..') = '..v)
end
--[[ 結果印出如下
index(1) = a
index(2) = b
index(3) = c
index(4) = d
]]
而使用 pairs也是一樣的結果? --> 這個再查一下…
for k,j in pairs(a) do
print(k, j)
end
--[[ 結果如下
1 a
2 b
3 c
4 d
]]
while
語法為
x=1
while x<5 do
x=x+1
print(x)
end
--[[結果如下
2
3
4
5
]]
可以用 break 跳出迴圈,但沒有continue ?
此外也有repeat的loop寫法,不過我想固定使用一種就好了,免的搞亂了…畢竟有時才寫一下Lua而已,簡單是王道
repeat
x=x+1
print(x)
until (x>5)
--[[結果為
2
3
4
5
6
]]
if...then...else...end
例子如下
if(5>3) then
print(5)
else
print(3)
end
--> 結果為 5
也有elseif的用法
x = 70
if(x>90) then print(">90")
elseif(x>60) then print(">60")
else print("<60")
end
--> 60
Lua: 運算子
算數運算子
+ : 加
- : 減
* : 乘
/ : 除
% : mod, 模數
^ : power,指數運數
> print(10%3)
1
> print(10^3)
1000
關係運算子
> 大於, < 小於, >= 大於等於, <= 小於等於, == 等於, ~= 不等於
例如:
> print(3>4)
false
> print(4~=5)
true
邏輯運算子
and, or, not -->這應該不用說明就很明白了
但Lua中的這類運算子和其它語言是完全不同的喔!
and: 在lua中是沒有遇到false就一直往右找,直到false出現,再回傳,若沒有false就回傳最後一個值
or :在lua中是沒有遇到true就往右找,直到true出現
因此有以下的結果:
print(1 and 3 and 5) --> 印出 5
print(abc and 1) --> 印出nil,因為abc未用過,為nil
print(abc or 1) --> 印出 1,因為nil是false,而1是true,所以把1回傳
+ : 加
- : 減
* : 乘
/ : 除
% : mod, 模數
^ : power,指數運數
> print(10%3)
1
> print(10^3)
1000
關係運算子
> 大於, < 小於, >= 大於等於, <= 小於等於, == 等於, ~= 不等於
例如:
> print(3>4)
false
> print(4~=5)
true
邏輯運算子
and, or, not -->這應該不用說明就很明白了
但Lua中的這類運算子和其它語言是完全不同的喔!
and: 在lua中是沒有遇到false就一直往右找,直到false出現,再回傳,若沒有false就回傳最後一個值
or :在lua中是沒有遇到true就往右找,直到true出現
因此有以下的結果:
print(1 and 3 and 5) --> 印出 5
print(abc and 1) --> 印出nil,因為abc未用過,為nil
print(abc or 1) --> 印出 1,因為nil是false,而1是true,所以把1回傳
Lua start
Lua的預備資料,先memo一下
1、Lua各版本是不相兼容的… --> 目前我使用的Lua是5.1.x
2. LuaJIT vs Lua --> 因有人覺得Lua不夠快,因此使用Just-in-time的技術再把速度榨出來!
接著就是基本語法、變數型態的說明了
3. 變數有:
nil: 像c裡的null> local aa
> print aa
stdin:1: '=' expected near 'aa'
> print(aa)
nil
> aa = 10
> print(aa)
10
boolean: 有true, false
這比較特別,只有nil和false是假,其它都是真,不同於其它語言!
> a = true
> print(a)
true
> if a then
>> print("true")
>> else
>> print("false")
>> end
true
> b = 0
> if b then
>> print("true")
>> else
>> print("false")
>> end
true
number: 只使用double表示和其它程式語言差不多,就不多說了
string: 可用二種表示方式 'string' 或是 "string",和python中的string一樣不可變動內容,只能再長一個新的。
多個string用..接起來,如
> print("aaa".."bbb")
aaabbb
在寫protocol時常會需要用到binary的表示方式,可以
'Local IO'..string.char(0, 10) --> 把Local IO字串後加上binary的0和10
table: -->好像很多技術都是用這東西做的,晚點懂了再寫
function: 咦! function也是,這還蠻特別的--> 一邊看一邊學一邊記,來綠是這裡。
number: 只使用double表示和其它程式語言差不多,就不多說了
多個string用..接起來,如
> print("aaa".."bbb")
aaabbb
在寫protocol時常會需要用到binary的表示方式,可以
'Local IO'..string.char(0, 10) --> 把Local IO字串後加上binary的0和10
function: 咦! function也是,這還蠻特別的--> 一邊看一邊學一邊記,來綠是這裡。
另一本書是寫有八種: eight basic types in Lua: nil, boolean, number, string, function, userdata, thread,and table.
( 由Lua 5.0 Reference Manual來的說法)
4. 註解表示方式
-- 是註解
--[[
多行註解
]]
訂閱:
文章 (Atom)