Planet Linux of Taiwan

06月24日

sakananote's face
sakananote


縮小 展開

Python Basic Day 3 小記

Day 3

9:00 ~ 10:22

Notes
  • 自訂函數
    • 要先定義 function 才能執行 function
  • return 敘述
    • return 單獨使用,會中斷函數的執行
      • Python 對任何的回傳都有回傳值, 預設是 None
    • 可以用 tuple 回傳多個值

練習檔案

# coding=utf-8

# function 要執行之前要先定義, 如果先執行一個沒有定義的 function就會出錯
# 如果這個時候執行 ff() 就會出錯

def ff():
#註解要寫在function 裡面, 方便日後查詢
  '''Hello'''
  print('Hello')
# return 單獨使用,會中斷函數的執行,會回到
  return
# 所以這個 world 不會被列出
  print('world')

# 執行 ff()
ff()

# 這邊來觀察回傳值
r = ff()
print(r)

print('====================')
#查詢 ff 的用法
help(ff)

print('====================')

# 自訂 return 值
def dd():
  return 2+ 5

# 執行且列出
r=dd()
print(r)


輸出結果

Hello
Hello
None
====================
Help on function ff in module __main__:

ff()
   Hello

====================
7


  • yield 敘述
    • 可以回傳 generator 物件
    • 可以建立比較複雜的序列資料

練習檔案

# coding=utf-8
def ff():
# yield 可以回傳generator 物件
  yield 100
  yield 30
  yield 500
  yield 600
  yield 700

r = ff()
# 直接 print r
print(r)

# 這邊可以透過 next 按順序列出
# next() 返回迭代器的下一个项目
print(next(r))
print(next(r))
print(next(r))

# 透過 tuple方式來收多個回傳值, 使用 tuple好處是不會被更動
lst = tuple(r)

# 前面因為已經使用 3 個, 這邊就可以觀察是剩下的2個內容
print(lst)


輸出結果

<generator object ff at 0x101b82830>
100
30
500
(600, 700)

== Class break ==

10:40 ~ 12:00

  • 函數參數
    • 讓函數做更彈性的運用

練習檔案

# coding=utf-8
def ff(a):
  print('ff function', a)

# 這邊餵進去參數必須跟上面的數量一致
r = ff(10)
print(r)

print('===================')

def bb( a = 20):
  print('bb function:', a)

# 沒有指定就是使用預設值
r=bb()
print(r)

# 也可以覆寫
s = bb(30)
print(s)

print('===================')

def cc(a = 7, b = 40):
  print('cc function:', a, b)

# 參數的餵入依照位置的順序餵入
r = cc(8)
print(r)

# 使用 keyword 指定方式
s = cc( b=50)
print(s)

print('===================')


輸出結果

ff function 10
None
===================
bb function: 20
None
bb function: 30
None
===================
cc function: 8 40
None
cc function: 7 50
None
===================


  • 變數的有效範圍

練習檔案

# coding=utf-8

# 這個 x 是全域變數, 因為直接在 python 內定義
x = 100

def ff():
# x 是區域變數, 所以只在該函數有效
  x = 200
  print('ff function:', x)

ff()

# 這邊的 x 會列出 100
print(x)

print('======================')

# nonlocal 要找時間再想一下
def dd():
  x = 100
  print('dd function:', x)

  def gg():
      nonlocal x
      x = 200
      print('gg', x)

  gg()

  print('ppp', x)

dd()


輸出結果

ff function: 200
100
======================
dd function: 100
gg 200
ppp 200


  • 任意參數數量

練習檔案

# coding=utf-8
# 使用 * 來定義為 tuple
def ff(*a):
  print('ppp', a)

ff(3, 4, 5)

print('===========')

# 使用 ** 為 dict
def dd(**b):
  print('qqq', b)

dd()

x = { 'x':3, 'y':4, 'z':5}
print(x, type(x))

# 這邊要配合 dict 的方式
dd(**x)


輸出結果

ppp (3, 4, 5)
===========
qqq {}
{'z': 5, 'x': 3, 'y': 4} <class 'dict'>
qqq {'z': 5, 'x': 3, 'y': 4}


  • 引用內建外部函數
    • 使用 import 來匯入
      • Python 的 import 是去執行, 不像其他的語言是 copy and paste
    • 可以使用 as 來避免名稱衝突
  • Module
    • 每一個  .py的檔案就是一個 module
    • __name__ 會印出module的名稱


== Class break ==

13:00 ~ 14:00

  • Package
    • 為了區分及管理不同的 module可以將 module 放到 package
      • 資料夾對於 python, 稱之為 package

檔案在 testpackage/xx.py

# coding=utf-8
def ff():
  print('hello')

ff()

練習檔案

# coding=utf-8
# xx.py 放在 testpackage 資料夾下, 所以就是 import testpackage.xx
import testpackage.xx

# from testpackage import xx

# 執行的時候要寫出所有的路徑
testpackage.xx.ff()


輸出結果

hello
hello


== Class break ==

14:15 ~ 15:15

  • Decorator
    • 呼叫某個 function 之前先自動呼叫另一個方法
      • Memoization
      • security

練習檔案

# coding=utf-8
def fa(f):

  def helper():
      # fa 原本的內容
      print('fa')
      #這邊就會執行 fb
      f()

  return helper

# 使用 @fa 方式進行 decorator
# 以前的方式是 fb = fa(fb), 將fb自己傳入 fa
# 有需要先執行 fa, 就在前面加上 @fa 就會先執行
@fa
def fb():
  print('buiness')

# 希望執行 fb 之前先執行 fa
fb()


輸出結果

fa
buiness


== Class break ==
15:20 ~ 16:05

  • Decorator 解說以及自主練習

16:05 ~ 17:00
Chapter 6


  • 物件導向
    • 關鍵在物件關係的差異
      • 不同的目的, 會造成物件會有不同的關係
    • 使用人的邏輯來架構系統
  • 物件導向分析
    • Domain Object
      • 要完成某件目的所需要的元素

06月22日

ppc's face
ppc


縮小 展開

APP、網站製作

HaoJui 理念

HaoJui Inc. 擁抱著幾個核心理念,這些理念將持續的深植在我們團隊的心中,以下容我們為您介紹:

1.HaoJui的發源

HaoJui的發源,源自於2013以來的咖啡廳聚會。最初的動機,源自於我們想做什麼?我們如何做得更好?為什麼要做這個?幾個核心問題的出現,對我們都是人生轉折巨大的選擇。具體的方向來說,我們朝向的是虛實整合,但真正的動力源,則在於團隊中內心那創新的熱情。對於我們團隊來說,「創新」這個詞彙,就是內心隨時擁抱著各種靈感,哪怕聽起來有點天方夜譚,放下既有成見,專注在如何實現,才是最真實的意義;同樣的,「創新」其實是離不開「發展」來談的,發展不是一個點的激發,而是一種朝向未來眼光的動作,就像是一個探險的歷程,堅定的探險家們,看著心中地圖的目的地,膽大心細、戰戰兢兢的走向最理想的目標,這就是HaoJui團隊存在的意義。

2.我們如何燃燒彼此的肝臟

HaoJui目前屬於小團隊的運作模式,每位成員皆是重要的決策者與執行者,我們組織結構依照目前運作所需要,為平行的運作模式,雖然各自有其負責的領域,但產品的發想與設計,卻仰賴每位不同生活經驗的夥伴們,共同思考與制定;未來,HaoJui持續發展的過程中,我們將秉持著:「自由」、「尊重」、「誠信」,三大原則執行我們的營運模式,我們相信,每種不同基因的團隊組成,才是真正決定何種形式制度的根源,我們反對獨斷的信任某一種制度,並將某種制度當作營運的仙丹。我們真正相信的,是無論何種制度,如果失去了「自由」、「尊重」、「誠信」三大原則,將淪為空殼,這就是我們快樂著燃燒彼此肝臟的核心價值。

06月19日

sakananote's face
sakananote


縮小 展開

openSUSE Leap 42.2 安裝小記

openSUSE Leap 42.2 安裝小記

桌機的 HD 無預警的升天了......
所以就直接進行升級 :p

記下我安裝 openSUSE Leap 42.2 的相關過程給自己參考
想不到上次裝 openSUSE Leap 42.1 是 2015/12


中文輸入法問題:

因為就算安裝 中文輸入法也沒有出現, 所以就用之前的方式
移除 ibus
#yast2  sw_single

取消 ibus  套件

取消 CD 為安裝來源
# yast2  repositories


Google Chrome:


Freemind:
使用one click install 安裝 http://software.opensuse.org/package/freemind
我是使用 editors 那個來源的 ymp 檔案安裝

.mm 的檔案指定用 freemind  開啟


新增 Packman 套件庫:

使用 #yast2  repositories 手動加入 NCHC Packman 套件庫

#yast2  repositories

URL 為


Firefox download helper:


flash-player:
# zypper   install   flash-player


播放器:


因為 mplayber 與 smplayer 不知道為何播放 .mp4 有點問題, 但是使用 VLC 就沒有問題
所以我就安裝 VLC Media player

並將 .rmvb 以及 .mp4 預設播放器設定為  VLC


Skype:
目前的版本是 4.3.0.37 的版本


使用終端機指令下載
#wget  -O  skype-`date +%F`.rpm   http://www.skype.com/go/getskype-linux-beta-suse

下載的 rpm 會被命名為 skype-日期.rpm


因為目前 rpm base 的OS, skype 只有提供 32 bits 的套件
所以要先預先安裝一些套件

參考 http://en.opensuse.org/SDB:Skype  但是還是有些遺漏, 所以要安裝一些套件


# zypper  -n  install  libqt4-32bit   libqt4-x11-32bit   libpng12-0-32bit
# zypper  -n  install  libXss1-32bit  libQtWebKit4-32bit   libQtWebKit4
# zypper  -n  install  libXv1-32bit  xorg-x11-libs


安裝 skype 套件
# rpm -ivh skype*.rpm


使用 #yast2 sound 調整音效


Dropbox:

使用 # zypper install dropbox 來安裝, 因為發現版本比 software.opensuse.org/search 上面新

安裝完之後在終端機下 dropbox  start  -i  來安裝


安裝 GNOME Control center
# zypper  install  yast2-control-center-gnome

然後修改 /etc/sysconfig/yast2
改為
WANTED_GUI="gtk"

修改 LS_OPTIONS 變數
# vi   /etc/profile.d/ls.bash
把 root 的 LS_OPTIONS 的 -A 移除

.7z 支援:
# zypper  install  p7zip


以下為個人記事

PDF Viewer 安裝:
Foxit
因為預設的 PDF Viewer 中文顯示有問題所以使用 Foxit
https://www.foxitsoftware.com/products/pdf-reader/

Forticlient SSL VPN 安裝:
Dropbox 內2013/packages 的 source code
預先安裝
# zypper install libgthread-2_0-0-32bit
# zypper  install  gnome-themes

印表機安裝:
# yast2  printer


rdesktop 安裝與測試:
#zypper  install  freerdp

執行方式
#xfreerdp  -g  1280x1024  -u administrator  HOST_IP


VMware workstation Pro 12
http://www.vmware.com/products/workstation/workstation-evaluation.html

安裝 kernel-default-devel  
# zypper   install   kernel-default-devel
# ./VMware-Workstation-Full-12.5.2-4638234.x86_64.bundle

裝完後, 設定取消 share VM access


Yubico Key:
如果 linux 沒有抓到 Yubico 的 U2F Key可以使用以下步驟
讓 linux 支援 Yubico , 我是參考 https://www.yubico.com/faq/enable-u2f-linux/  
作法
存到 /etc/udev/rules.d/70-u2f.rules
將 linux 重開機, 接下來就可以使用了 :-)

smartgit 安裝:

下載 8.0.3

解壓縮到 /opt
# tar  zxvf   smartgit-linux-8_0_3.tar.gz  -C   /opt/

建立 link 讓一般使用者也能使用
# ln  -s   /opt/smartgit/bin/smartgit.sh   /usr/local/bin/smartgit

安裝 git
# zypper  install  git

建立 個人的 ssh key
> ssh-keygen  -t  dsa

將 ssh 的公鑰 id_dsa.pub 新增到 Github 的 Settings -- >  SSH and GPG Keys

接下來就是以一般使用者的身份執行 smartgit 指令
> smartgit

按照上面的參考設定

設定 smart git icon 使用 alacarte

在設定好之後發現無法直接開啟資料夾 ( 資料夾上面按右鍵 -- > Open )
Edit -- > Preferences --> 點選  Tools -- > 點選 Re-Add Defaults 得到解決
2016-11-24 15-48-28 的螢幕擷圖.png


ansible 安裝:
#zypper  install  ansible

安裝 pysphere:

為了 ansible and VMware Module


# zypper  install  python-pysphere


Docker 安裝:

#zypper  install  docker

#systemctl  start  docker
#systemctl  enable   docker

Franz 安裝:

將網路換回 NetworkManager - cause wifi select

桌面調校:
  • 參考 http://sakananote2.blogspot.tw/2016/12/opensuse-leap422-gnomeextension.html
    • 要裝瀏覽器的擴充功能還有, chrome-gnome-shell 套件


~ enjoy it


FourDollars's face
FourDollars


縮小 展開

拿到了 GNOME foundation membership

最近 GNOME 有推出個 Become a Foundation member 的活動,如果以前對 GNOME 做過不少貢獻就可以去申請成為會員,當然還要經過審核通過,我個人一直都是以開發者路線為主的,所以就是透過程式碼的貢獻拿到這個會員,然後就會得到一個 [at] gnome [dot] org 的 Email address alias,還會有什麼投票的權利,姓名也會出現在 Membership - GNOME 上面,應該還有一些額外的東西,不過我暫時還沒有空全部找出來,就只好先把 Email address alias 設定好,跟 Debian developer 一樣先擺著,現在寄信到 sylee [at] gnome [dot] org 也可以找到我,多了一個身份不曉得以後送 patch 會不會比較方便一些,就醬囉。

06月18日

sakananote's face
sakananote


縮小 展開

Python Basic Day 2 小記

Day 2

9:00 ~ 10:25
Chapter 3

Notes:
  • 運算子
    • 指數運算子 ** 為指數運算子, 可以計算 2的 4 次方 之類的運算
    • Python 沒有遞增 ++ 及遞減運算子 --
== Class break ==
10:40 ~ 11:35
Chapter 3

Notes:
  • 位元位移運算子
    • 左移一個位元, 可以想成是 * 2的 1 次方
    • 右移2個位元, 可以想成 除以 2 的 2 次方

11:35 ~ 12:00
自主練習


== Class break ==

13:00 ~ 14:15
Chapter 3

Notes:
  • 邏輯運算子
    • XOR,
      • 相同的值為 0 ( T / T 或 F / F ), 不同值為 1 ( T / F 或 F / T )
      • 針對選項只能選其一的時候可以使用, 例如 Male 或是 Female 只能選其一, 但是又不能都選或是都不選

相關練習程式碼


# coding=utf-8

# ** 為指數運算子, 可以計算 2的 4 次方 之類的運算
v = 2 ** 4

print(v)

# 字串運算子
a = '4'
b = '2'

# 字串運算子, 左右都必須是字串
print(a + b)

# + - * 的時候型態為 int
c = 5
d = 2
e = c + d
print(type(e))
print(e)

# 使用 / 的時候, 型態為 float
f = 5
g = 2
h = f / g
print(type(h))
print(h)

# 使用 // 來讓型態為 int,
i = 5
j = 2
k = i // 2
print( type(k) )
print(k)

# python 無遞增或是遞減運算子, 用 += 或是 -= 替代
l = 5
l += 8

print(l)

# 位元運算子
m = 128

# 左移一個位元, 可以想成是 * 2的 1 次方
print(m << 1)

n = 128

# 右移2個位元, 可以想成 除以 2 的 2 次方
print( n >> 2)


輸出結果

16
42
<class 'int'>
7
<class 'float'>
2.5
<class 'int'>
2
13
256
32


  • If 敘述是一種 two-way 的決策敘述

練習程式

# coding=utf-8
# if 敘述
if True:
  # 後面一定要放敘述, 可以使用 pass 來填充, 不會進行任何動作
  print('Test')

# if else 方式
if True:
  print('True')
else:
  print('else')

# if-else if 方式
a = 4
if a > 2:
  print("a between 3 ~ 5")
elif a > 5:
  print("a > 5")
else:
  print("a <= 2")


輸出結果
Test
True
a between 3 ~ 5

  • 條件運算子
    • Python 沒有三元運算子

== Class break ==

14:30 ~ 15:30

  • for 迴圈
    • 類似 for each, 利用 range類別產生數列

練習程式碼

# coding=utf-8
# for 迴圈練習
s = "abcdef"

c = 100

# 語法
# for item  in  range():
#     statement
for c in s:
  print(c)

# 這邊要注意會 列出 f, 因為會 overwrite 剛剛的 c, 不只限制在 for 迴圈內
print(c)

# 一般可能會用底線 _ 來命名, 代表可能不會使用這個變數
for _ in s:
  print('----')

# 使用 range() 方式來進行, 起始值為 0
for v in range(10):
  print(v)

# 從 2 開始, 不大於 5
for j in range(2, 5):
  print(j)

# 從2開始不大於8, 間隔為 2
for k in range(2, 8, 2):
  print(k)

輸出結果

a
b
c
d
e
f
f
----
----
----
----
----
----
0
1
2
3
4
5
6
7
8
9
2
3
4
2
4
6

  • 進階迴圈控制
    • break
    • continue

練習程式碼

# coding=utf-8
# break 會中斷迴圈, continue 不會中斷迴圈
for v in range(5):
  print(v, 'a')

  if v == 2:
      break

  print(v, 'b')

print('==== continue ====')

for v in range(5):
  print(v, 'a')

  if v == 2:
      continue

  print(v, 'b')


輸出結果

0 a
0 b
1 a
1 b
2 a
=============
0 a
0 b
1 a
1 b
2 a
3 a
3 b
4 a
4 b


== Class break ==

15:45 ~ 17:00
Chapter 4

Notes:
  • 序列資料
    • Bytes
      • 引號內容必須要 ASCII 字元
      • 可用於存放二進位資料
        • 圖片
        • 聲音
        • 影片
    • List
      • 表示法 []
      • 參數必須是 iterable

練習的程式碼

# coding=utf-8
lst = [1, 3, 5, 7, 9, 11, 13]
print(lst, type(lst), len(lst))

# 透過 index 列出
print(lst[0])
# 如果index 是負數, 從右邊算, 但是也是不能超過範圍
print(lst[-2])

lst[0] = 8

print(lst)

輸出結果
[1, 3, 5, 7, 9, 11, 13] <class 'list'> 7
1
11
[8, 3, 5, 7, 9, 11, 13]

  • Tuple
    • 一種不可更動內容(  immutable) 的序列資料
    • 表示法 ()

  • 資料分割 slicing

練習程式碼

# coding=utf-8
a = [1, 3, 5, 7, 9, 11]
# 如果是直接指定的方式, 會指向同一個物件, 但是只要 a 或是 b 改變, 會一起改變
b = a
# 利用 slicing 建立新的 list
c = a[:]
# 利用 slicing 取出前面 4 個
d = a[:5]

# 利用 id() 判斷是否同一個物件
print(a, id(a))
print(b, id(b))
print(c, id(c))
print(d, id(d))

輸出結果

[1, 3, 5, 7, 9, 11] 4315405768
[1, 3, 5, 7, 9, 11] 4315405768
[1, 3, 5, 7, 9, 11] 4315406024
[1, 3, 5, 7, 9] 4315405960

  • List Comprehension
    • 可以利用特定敘述來指定內容
    • a = [ 0, 1, 2, 3, 4]
    • 等同於 a = [ v for v in range(5) ]

練習的程式碼

# coding=utf-8
# 傳統的做法
a = [ 0, 1, 2, 3, 4]
# 使用 list comprehension 方式
# element for element in range()
b = [ v for v in range(5)]
# 另外一個好處是可以做一些處理, 例如 * 2
c = [ v * 2 for v in range(5)]

print(a)
print(b)
print(c)

輸出的結果

[0, 1, 2, 3, 4]
[0, 1, 2, 3, 4]
[0, 2, 4, 6, 8]


  • Dictionary
    • 類似 Map 的 key-value 的資料集合
    • 建立方式 {key:value}