2016年7月27日 星期三

[閒聊] arduino 也算是個語言?

在 IEEE 2016 程式排行榜 裡把 arduino 算是一個語言,引起一些討論。
我個人是可以理解為什麼會列為另一種語言。
也許它被認為”足夠”降低開發門檻成功給一般人使用,而且其生態系也大到一個程度。它的前處理,著實也做了很多事,從使用者的角度,根本看不到 C/C++ 要的 ..h, .c or .cpp。在簡化的程度上,已經讓只會寫 arduino 的人,一定不會用 C/C++ 的環境寫程式。
IEEE 官網也很多人質疑,說 arduino 不過是個開發環境,應該要算在 C 上面。但是就如同 C 與 C++ 一樣會有論戰,為什麼 C 要跟 C++ 算一起?或反過來說,C 與 C++ 要算一種語言嗎?如果算一種語言,為什麼要寫 C/C++ 而不乾脆說 C? 如果算兩種語言,但是算人頭的時候又要一起算呢?
曾經在閱讀 cython 的時候,看到他們寫的 「The Cython language is a superset of the Python language that additionally supports calling C functions and declaring C types on variables and class attributes.」他們做的事情,就是讓使用者可以用一般的 python 寫程式,也可以用 cython 新增加的語法指定與 c 合作的宣告與功能。他們也是先經過自己的「前處理器」,把程式轉換過。他們自稱是 cython language。而且還是 superset 。我曾經想了很久。後來又看到 TypeScript,CoffeeScript。如果這些努力可以說是新增了一個新語言,那麼,arduino 被稱做一個語言,我是可以理解的。
我自己的臉書備份

2016年6月15日 星期三

[windows] usb碟在 windows 與 mac 之間插來插去然後就不能用了。

為了交換資料,用 mac 把一個 usb碟做成 FAT32,剛開始還正常,幾次之後發現,中文字都亂碼了。再用個幾次連容量都不對。回到 windows 看裡面有兩個分割區,比較大的那個 windows 就看不見,想用 windows 來清掉分割區又點不到那個指令,卡住了怎辦?這時候 diskpart 是救星。

有很大的資料要交換,例如影片,用網路來傳還是比較慢,家裡的 wifi 就是沒辦法每秒 25 或 50 MB 來傳。所以一個 FAT32 的 usb碟一直是我的方式。但是這次就遇到檔名亂碼的問題,隨後發生分割區看不到的問題。從 windows 這邊來看,用 mac 來割 FAT32 會弄出兩個主分割區,讓 windows 搞不懂。要救回這個 usb碟的方法,應該是用 windows 自己來切分割區了。打開磁碟管理,對著分割區按下右鍵,清除分割區的選項居然是灰色不能選,這下無解了。至少這條路不能走。難道 windows 真的無招了嗎?
還好,這問題不是只有我發生,外國人也發生,解決方法就是 diskpart.exe 這個內建程式。
我只需要做到清除分割,建立分割區還是用原來的圖形格式化工具。
步驟:
(1) 進到命令列
(2) 輸入 diskpart 之後按 <enter>
(3) 輸入 list disk,看清楚第幾個是你的 usb碟,沒看清楚會非常悲劇,一定要算對。然後用 select disk n 選到你的 usb碟,n 是列表上第幾個磁碟。選完之後,再用 detail disk 確認一下。
(4) 接下來輸入 clean 指令,清除整個分割區。
(5) 離開程式,輸入 exit。
接下來的建立分割區,就照一般的格式化做法就行了。

參考:
http://superuser.com/questions/274687/how-do-i-format-a-usb-drive-on-a-pc-that-was-formatted-on-a-mac

[python] try except raise,為什麼會需要 raise ?

在 python 裡,對於有可能錯誤的地方,就是用 try 去包住它,然後針對可能的錯誤去處理它。像是:

try:
    f = open('x','r')
except IOError:
    raise
except Exception:
    print 'other error'
    raise

有天某個人問我,為什麼,既然已經是抓到問題了,為什麼還要 raise,把它丟出去呢?也許有很多理由,但我有兩個簡單的理由:(1)我想直接讓程式被停掉,(2)我想讓執行我寫的程式的程式也知道有問題,讓它自己決定該怎麼辦。這在寫程式給別的程式用的時候很重要。

在 raise exception 的時候,我以前是寫成以下這樣:
try:
    f = open('x','r')
except Exception, ex:
    print 'other error'
    raise ex

這樣在文句上好像很正常,但是就會出現困擾的地方,就是 traceback 所指的 exception 行號是在 raise 的地上,而不是真正發生的地方。

IOError                                   Traceback (most recent call last)
 in ()
      3 except Exception, ex:
      4     print 'other error'
----> 5     raise ex

IOError: [Errno 2] No such file or directory: 'x'
後來才發現,應該直接 raise 後面不加參數,才會如下指到對的行數去。

IOError                                   Traceback (most recent call last)
 in ()
      1 try:
----> 2     f = open('x','r')
      3 except IOError:
      4     raise
      5 except Exception:

IOError: [Errno 2] No such file or directory: 'x'

2016年4月2日 星期六

[windows] 要找個執行檔在哪裡,像 linux 的 whereis 的指令?

我不知道為何可以用 curl。用著用著就習慣了。
但是突然發現不能用 request。
想要去更新又不知道到哪兒去更新。

在 linux  有 whereis 指令,但是 windows 就是不叫 whereis。
它就要叫

    where

就這樣,解決。

http://superuser.com/questions/21067/windows-equivalent-of-whereis

2016年3月16日 星期三

[windows] 殺掉佔住某個 port 的程序

今天在測試的時候,一個程式畫面死掉被關掉,但是程序(process)沒有被關掉,一直佔著。
總不能每次發生這種事的時候就重開電腦吧?
於是找了一下,有解!
救星就是 netstat。

使用以下指令:
netstat -a -n -o
會列出所有本機正在開啟的 port,還有 PID。
接下來就是用 task manager,找到那個程序,殺掉它。搞定!

參考:
http://stackoverflow.com/questions/8688949/how-to-close-tcp-and-udp-ports-via-windows-command-line

2016年3月15日 星期二

[python] django-cms 在 pythonanywhere 的安裝

django-cms 是基於 django 的 CMS (Content Management System,內容管理系統),可以快速建立可上線的網站、部落格…等等。它也是去年(2015 年)被選為最佳 CMS 的系統。(http://www.cmscritic.com/announcing-the-2015-winner-for-best-open-source-cms/)

PythonAnyWhere 則是一個服務商,可以提供以 python 為基礎的許多 web framework,例如 django。所以,在 PythonAnyWhere 上要提供一個 Django 網站是內建功能之一。其他的像 flask 或是 bottle 等 web framework 現在也支援。一般人可以申請免費服務試用,可以有 512 MB 的硬碟空間與 100 秒 cpu 時間。如果 100 秒 cpu 時間用完,其實還是可以正常運作,只是慢一點而已,拿來試用非常剛好。

把 django-cms 與 PythonAnyWhere 結合在一起是很簡單的。PythonAnyWhere 官方似乎沒有比較正式的說明,不過在經過測試之後,在 virtualenv 的環境上來做,應該會是比較好的選擇。

第一步,建立 virtualenv 環境
source virtualenvwrapper.sh
mkvirtualenv djangocms --python=python3 
在 PythonAnyWhere 上必須使用已經提供好 環境設定,所以要使用他們提供的 virtualenvwrapper.sh 與 mkvirtualenv 進入 virtualenv 的環境中。
如果要在 virtualenv 裡用到 python3,所以加上 --python=python3

如果要使用官方已經裝好的 numpy, scipy 的話,要加上這個參數 --system-site-packages。

執行完之後,就會停在 virtualenv 的環境裡:
(djangocms) 12:24 ~ $

第二步,安裝 djangocms-installer
現在 django-cms 是使用 djangocms-installer 來安裝,所以要先用 pip 安裝這個。
pip install djangocms-installer
第三步, 建立 djangocms 專案
這裡建議照我說的做,不然不小心會把自己的家目錄裡的東西砍光光。
首先,開一個目錄叫 project_name,然後進去。

(djangocms) 12:32 ~ $ mkdir project_name(djangocms) 12:33 ~ $ cd project_name/(djangocms) 12:34 ~/project_name $

然後使用以下指令建立專案:
(djangocms) 12:34 ~/project_name $ djangocms -p . my_demo

會開始問一些問題,基本上就一路按 enter,不然就照我的來選:
Database configuration (in URL format) [default sqlite://localhost/project.db]:
django CMS version (choices: 2.4, 3.0, 3.1, 3.2, stable, develop) [default stable]:
Django version (choices: 1.5, 1.6, 1.7, 1.8, 1.9, stable) [default stable]:
Activate Django I18N / L10N setting (choices: yes, no) [default yes]:
Install and configure reversion support (choices: yes, no) [default yes]:
Languages to enable. Option can be provided multiple times, or as a comma separated list. Only language codes supported by Django can be used here: en
Optional default time zone [default Etc/UTC]:
Activate Django timezone support (choices: yes, no) [default yes]:
Activate CMS permission management (choices: yes, no) [default yes]:
Use Twitter Bootstrap Theme (choices: yes, no) [default no]:
Use custom template set [default no]:
Load a starting page with examples after installation (english language only). Choose "no" if you use a custom template set. (choices: yes, no) [default no]: yes



然後就開始安裝到停下來。會要你輸入管理員的帳號、信箱、密碼。
Creating admin userUsername (leave blank to use 'ironman'): Email address: 在這裡輸入信箱Password: Password (again): Superuser created successfully.All done!


第四步,建立 web app
到 web 頁籤按下建立 web app 的按鈕,選擇 manual configuration。
設定 virtualenv 路徑設定到 /home/yourusername/.virtualenvs/djangocms。

import os
import sys
# add project folder to path
path = '/home/ironman/project_name'
if path not in sys.path:
    sys.path.append(path)
# Remove any references to your home folder (this can break Mezzanine)
while "." in sys.path:
    sys.path.remove(".")
while "" in sys.path:
    sys.path.remove("")
# specify django settings
os.environ['DJANGO_SETTINGS_MODULE'] = 'my_demo.settings'

# load default django wsgi app for Django >= 1.4
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()
到 Static files 那裡設定:
Url: /static/
Path: /home/yourusername/project_name/static
第五步,修改 db 位置設定
因為用安裝器裝的設定,有一點不一樣,所以 db 位置它指錯了。
請到 project_name/my_demo/settings.py 裡,找到這裡:
DATABASES = {
    'default': {
        'CONN_MAX_AGE': 0,
        'ENGINE': 'django.db.backends.sqlite3',
        'HOST': 'localhost',
        'NAME': 'project.db',
        'PASSWORD': '',
        'PORT': '',
        'USER': ''
    }
}

把 'NAME': 'project.db' 改成 'NAME': 'project_name/project.db'

不改會出現錯誤:no such table: cms_urlconfrevision

再按下web app 的 Reload 按鈕。
瀏覽結果,這是有選範例首頁的樣子:

這是沒選範例首頁的樣子:


接下來就是怎麼使用它的問題了。這裡有「使用者」的說明文件。http://docs.django-cms.org/en/3.2.3/user/index.html

[python] mezzanine 在 pythonanywhere 的安裝

Mezzanine 是基於 django 的 CMS (Content Management System,內容管理系統),可以快速建立可上線的網站、部落格…等等。

PythonAnyWhere 則是一個服務商,可以提供以 python 為基礎的許多 web framework,例如 django。所以,在 PythonAnyWhere 上要提供一個 Django 網站是內建功能之一。其他的像 flask 或是 bottle 等 web framework 現在也支援。一般人可以申請免費服務試用,可以有 512 MB 的硬碟空間與 100 秒 cpu 時間。如果 100 秒 cpu 時間用完,其實還是可以正常運作,只是慢一點而已,拿來試用非常剛好。

把 Mezzanie 與 PythonAnyWhere 結合在一起是很簡單的。PythonAnyWhere 官方建議在 virtualenv 的環境上來做,也給了範例如下:

第一步,建立 virtualenv 環境

source virtualenvwrapper.sh
mkvirtualenv mezzanine
在 PythonAnyWhere 上必須使用已經提供好 環境設定,所以要使用他們提供的 virtualenvwrapper.sh 與 mkvirtualenv 進入 virtualenv 的環境中。
如果要在 virtualenv 裡用到 python3,要使用以下的指令替代上面第二行指令

mkvirtualenv mezzanine --python=python3
如果要使用官方已經裝好的 numpy, scipy 的話,要加上這個參數 --system-site-packages。

執行完之後,就會停在 virtualenv 的環境裡:
(mezzanine)13:12 ~ $
第二步,安裝 mezzanine
接下來就是使用 pip install mezzanine 安裝。

第三步,建立網站專案
在經過一連串下載後,就是開始第一個專案來試用一下了。開第一個專案的指令是:
mezzanine-project project_name
cd project_name
接下來的動作是設定時區與建立資料庫內容。
首先在 settings.py 找到TIME_ZONE, 改成我們這裡的TIME_ZONE='Asia/Taipei'。
然後執行以下指令:
python manage.py createdb --noinput
會在資料庫裡建立所需要的 table。預設使用的是 sqlite3 的資料庫。眼睛利一點的會看到管理者預設帳號密碼是 admin/default。等一下要用,真的要上線一定要去改密碼。

第四步,設定 wsgi
PythonAnyWhere 與 mezzanine 的連結是靠 wsgi,請到 web 頁籤


建立一個按下建立 web app 的按鈕,選擇 manual configuration。
然後把 virtualenv 路徑設定到 /home/yourusername/.virtualenvs/mezzanine 。


找到 WSGI configuration file 所指的檔案連結按下去,改成以下這樣:
import os
import sys

# add project folder to path
path = '/home/yourusername/project_name':
if path not in sys.path:
    sys.path.append(path)

# Remove any references to your home folder (this can break Mezzanine)
while "." in sys.path:
    sys.path.remove(".")
while "" in sys.path:
    sys.path.remove("")

# specify django settings
os.environ['DJANGO_SETTINGS_MODULE'] = 'project_name.settings'

# load default django wsgi app for Django >= 1.4
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()
然後按下web app 的 Reload 按鈕,接下來要處理 static 檔案。

第五步,設定 static 檔案
在 web 頁籤,到 Static files 那裡設定:

Url: /static/
Path: /home/yourusername/project_name/static

然後執行以下指令:
python manage.py collectstatic
這樣會把 static 的檔案搬到對的地方去。再按下web app 的 Reload 按鈕。

現在就可以瀏覽一下剛才的成果。

接下來,使用的方法就又是另一個問題了。