[Python] 讓Jupyter notebook可以從遠端連線

請參考jupyter官網說明
為了安全第一步請設定jupyter密碼

$ jupyter notebook password
Enter password:  ****
Verify password: ****
[NotebookPasswordApp] Wrote hashed password to /Users/you/.jupyter/jupyter_notebook_config.json

有可能會回說jupyter_notebook_config不存在之類的錯誤
代表你需要config檔 使用以下指令即可

$ jupyter notebook --generate-config

接下來修改config檔

$ vi ~/.jupyter/jupyter_notebook_config.py

新增下面資料或是將原本的註解(#)刪除即可

c.NotebookApp.ip = '*'

ip改成星號讓遠端電腦可以透過本機ip連上jupyter_note
若本機的ip為固定ip直接填上對應ip也行
現在啟動jupyter notebook應該就可以從遠端連線了
另外建議要用https加密連線 以免密碼被偷取

c.NotebookApp.certfile = u'/absolute/path/to/your/certificate/fullchain.pem'
c.NotebookApp.keyfile = u'/absolute/path/to/your/certificate/privkey.pem'

把路徑改成金鑰的位置即可 至於金鑰如何取得請自己google

在ubuntu 17.10下使用Anaconda安裝Tensorflow與Keras

此篇參考

Tensorflow + keras 深度學習人工智慧實務應用-林大貴

至Anaconda官網下載Python3版的Anaconda for Linux

Downloads

請用bash介面下載

#wget https://repo.continuum.io/archive/Anaconda3-5.1.0-Linux-x86_64.sh

安裝Anaconda, -b代表批次安裝並省略條款閱款

#bash Anaconda3-5.1.0-Linux-x86_64.sh -b

將Anaconda的路徑加到PATH

#vi ~/.bashrc

在檔案內新增

# add by Anaconda
export PATH="/home/username/anaconda3/bin:$PATH"

若是用root安裝要改成

export PATH="/root/anaconda3/bin:$PATH"

套用新的PATH

source ~/.bashrc

確認Python版本

# python3 --version
Python 3.6.4 :: Anaconda, Inc.

安裝tensorflow and keras

python -m pip install tensorflow
python -m pip install keras

建立工作目錄

mkdir -p ~/pywork
cd ~/pywork

開啟jupytor

jupytor notebook

在windows10下使用Anaconda安裝Tensorflow與Keras

此篇參考

Tensorflow + keras 深度學習人工智慧實務應用-林大貴

至Anaconda官網下載Python3版的Anaconda for windows

Downloads

依照指示安裝,安裝過程中會出現「Add Anaconda to my PATH evironment variable」這個選項必須要勾選。

安裝後請啟動cmd「命令提示字元」

建立一個工作目錄

md \pythonwork

cd \pythonwork

使用Anaconda建立給tensorflow使用的虛擬環境

conda create --name tensorflow python=3.5 anaconda
activate tensorflow

安裝tensorflow and keras

pip install tensorflow
pip install keras

啟動jupyter notebook

jupyter notebook

瀏覽器應會自動開敵jupyter notebook
要關閉jupyter請在cmd按下ctrl+c
離開虛擬環境請

deactivate tensorflow

[Python] 單底線與雙底線

[code lang=”python”]#single_double.py
class Parent(object):
def _single(self):
print("Parent single underscore")
def __double(self):
print("Parent double underscore")

class Child(Parent):
pass

c = Child()
c._single() #Parent single underscore
#Python並沒有類似C的protected member
#單底線的member在執行行並沒有實際差異
#但單底線的member表示此member不應該被其他人或是Child使用

print(dir(c))
#[‘_Parent__double’, ‘__class__’, … ‘__weakref__’, ‘_single’]

#c.__double() AttributeError: ‘Child’ object has no attribute ‘__double’
c._Parent__double()
#雙底線的member在child是沒辦法被直接存取
#Python並沒有所謂的private function,但可以用雙底線達到類似的效果
[/code]

閱讀更多[Python] 單底線與雙底線

[Python] multiple import

[code lang=”python”]#a.py
print("in a.py berfore import b")
import b
print("in a.py after import b")
[/code]
[code lang=”python”]#b.py
print ("in b.py")
[/code]
[code lang=”python”]#c.py
print("in c.py berfore import b")
import b
print("in c.py after import b")
[/code]
[code lang=”python”]#d.py
print("in d.py berfore import a")
import a
print("in d.py after import a")

print("in d.py berfore import c")
import c
print("in d.py after import c")
[/code]

in d.py berfore import a
in a.py berfore import b
in b.py
in a.py after import b
in d.py after import a
in d.py berfore import c
in c.py berfore import b
in c.py after import b
in d.py after import c
>>> a.b.x = 1
>>> c.b.x
1
>>> a.b

>>> c.b

>>> 

重複import會被視為同一個物件

[Python] mixin與ABC(Abstract Base Classes)的比較

主要用途

  • mixin: code reuse,將一個或多個method的實作封裝,讓多個類別使用(這些類別不一定有繼承關係) (ref: Python cookbook 3rd, 8.17)
  • ABC: 定義介面(interface),或說是協定(protocal)及型別(type)的實作。(ref: Python cookbook 3rd, 8.13, Fluent Python ch10&11)

共同點

  • 都不能被實體化,故都不應該有__init()__

差異

  • 實作method
    • 因為要re use code故mixin一定會實作method;ABC大多不需要實作method,不過ABC可以實作method,但僅限用於ABC本身或是其supercall,也就是說ABC不應該為了instance實作method。
  • Instance variable
    • mixin不應該有instance variable,Effective Python建議讓mixin的__slots__ = (),阻止使用者建立新的attribute。

註:任何Class都只能繼承一個實體Class,其他只能繼承ABC或是mixin

Fluent Python有提到「An ABC may also be a mixin; The reverse is not true」,作者認為ABC可能為mix-in。但我認為這兩個概念不同,是否會有一個class同時符合這兩個概念的機會,我持懷疑態度。

另外Fluent Python ch12建議我們少用繼承,若是使用了很多繼承必須檢查我們是否有幾點問題

  • 是否正在重新發明輪子
  • 正在使用一個不好的Framwork
  • 是否有過度設計
  • 你是否正在設計一個新Framwork(除非你在設計新Framwork,否則不應使用太多的繼承)

[C11] 能否使用move()回傳一個新的物件但不copy物件

最近花了很多時間研究是否能以rvalue reference在不複製物件的狀態下回傳新物件
但我仍然找不到方法

一般講到這個問題 大家一定是會回答RVO(return value optimization)
雖然目前的comple大部份都會做到RVO 但我們還是不能說RVO一定會有

我天真的以為rvalue reference跟move可以讓function的新物件的scope在return之後繼續維持
但其實只是我誤會了這個新功能
move constructor/assigment的設計上還是要先construct物件
不論如何 move constructor還是會消耗新的空間與時間用在construct
move assigment也一定要先contruct物件才能再assign
我們能處理的是member variable要怎麼複製

閱讀更多[C11] 能否使用move()回傳一個新的物件但不copy物件

[Python] python的字串與轉碼問題:string and encode in 2.7/3.x

先以Python3為例子

[code lang=”python”]>>> s = ‘你好’
>>> len(s)
2
>>> s[0]
‘你’
>>> s[1]
‘好’
>>> b = s.encode(‘utf8′)
>>> b
b’\xe4\xbd\xa0\xe5\xa5\xbd’
>>> len(b)
6
>>> b[0]
228
>>> b[1]
189
>>> type(b)
<class ‘bytes’>
>>> type(s)
<class ‘str’>
[/code]

從上面可以看出來,在Python3裡面被單引號「’」或是雙引號「”」包起來的東西會被當成一個str。
在Python3裡面str是人類可讀的字串,所以中文的「你好」就會被拆成「你」「好」兩個字
實際上在記憶體中是沒辨法直接儲存中文,必須轉換成0與1的方式來儲存,但使用STR時沒必要去了解Python是怎麼儲存str。
我們還可以把str轉換成一連串數字,這件事情叫做「編碼(encode)」
可以想像成把人類可讀的文字轉成電腦可以儲存的電腦語言,Python3就叫做bytes。
一般來說目前最常用的編碼語言是「utf8」
「你好」轉成utf8就會變成6個byte

閱讀更多[Python] python的字串與轉碼問題:string and encode in 2.7/3.x

[Python] 底線, name_mangling與private member

python並沒有所謂的private
但可以在member的前面加上一個底線 當作一個軟性的private
告訴其他人這個member不應讓其他人取用或修改 以達到安全性

我們也可以在member前面加上雙底線 這樣會產生name mangling的效果
但這樣也不能完全達到禁止存取

一般的情況下應該使用單底線來告知使用者即可(from fluent python ch9)

閱讀更多[Python] 底線, name_mangling與private member