2018年2月26日 星期一

[python3] ubuntu pymongo RuntimeError: 'list' must be None or a list, not

RuntimeError: 'list' must be None or a list, not <class 'str'>

error


from pymongo import MongoClient
Traceback (most recent call last):

  File "<ipython-input-1-214d66698402>", line 1, in <module>
    from pymongo import MongoClient

  File "/usr/local/lib/python3.5/dist-packages/pymongo/__init__.py", line 77, in <module>
    from pymongo.collection import ReturnDocument

  File "/usr/local/lib/python3.5/dist-packages/pymongo/collection.py", line 29, in <module>
    from pymongo import (common,

  File "/usr/local/lib/python3.5/dist-packages/pymongo/common.py", line 28, in <module>
    from pymongo.auth import MECHANISMS

  File "/usr/local/lib/python3.5/dist-packages/pymongo/auth.py", line 120, in <module>
    from backports.pbkdf2 import pbkdf2_hmac

  File "<frozen importlib._bootstrap>", line 969, in _find_and_load

  File "<frozen importlib._bootstrap>", line 954, in _find_and_load_unlocked

  File "<frozen importlib._bootstrap>", line 892, in _find_spec

  File "<frozen importlib._bootstrap>", line 873, in _find_spec_legacy

  File "/usr/local/lib/python3.5/dist-packages/pyximport/pyximport.py", line 253, in find_module
    fp, pathname, (ext,mode,ty) = imp.find_module(fullname,package_path)

  File "/usr/lib/python3.5/imp.py", line 270, in find_module
    "not {}".format(type(name)))

RuntimeError: 'list' must be None or a list, not <class 'str'>


solve

Package "backports.pbkdf2 " is  dependence package on pymongo.  Offical website alse show this Info.
So install  backports.pbkdf2 will solve.

sudo pip3 install backports.pbkdf2

2017年12月26日 星期二

[Python3] APScheduler:TypeError: func must be a callable or a textual reference to one


[Python3] APScheduler:TypeError: func must be a callable or a textual reference to one


    網路上APScheduler的範例,通常add_jobc後面都會直接給參數func,讓我天真的以為如果要帶入func 的參數只要直接丟入 func(bar) 就可以,看了官方文件才知道:
The ``func`` argument can be given either as a callable object or a textual reference.
     所以如果要給予參數的話,必須要是 callable object 。


     沒想到只要多一個參數args 就可以了:
scheduler.add_job(tick, 'interval', seconds=i, args=(i,))
    但要注意的是,args必須要是iterable,所以也可以帶入list:
scheduler.add_job(tick, 'interval', seconds=i, args=[i])

    用class解:

2017年10月16日 星期一

python3 指數運算 開根號

冪運算 是大陸用語,台灣叫做指數運算。

1. ** 就是做指數運算 的意思。

開根號


In [7]: 4 ** 0.5
Out[7]:  2.0


2.  import math


import math

math.sqrt( x )
http://www.runoob.com/python/func-number-sqrt.html


整數除法
In [11]:5.6 //1
Out[11]: 5.0

2017年9月25日 星期一

python Decorator Pattern

     在查python code 裡面的 "at" 符號(@) 是什麼的時候,發現初學者基本上看不懂,再加上現在OO 都學得很爛。
     所以分享一個比較容易理解的,python Decorator Pattern  範例,雖然這樣用其實根本違反 Decorator Pattern 的意義,但主要是讓人理解運行狀況。
    基本上,把她想成是對某個樣本,實際做擴充就可以了。
code:


兩個輸出都是:

Hans
tow


參考:
https://en.wikipedia.org/wiki/Decorator_pattern
https://puremonkey2010.blogspot.tw/2010/11/oo-decorator-pattern.html
http://www.hansshih.com/post/85896158975/%E8%90%AC%E6%83%A1%E7%9A%84-python-decorator-%E7%A9%B6%E7%AB%9F%E6%98%AF%E4%BB%80%E9%BA%BC

2017年9月1日 星期五

ubuntu Shadowsocks python

Shadowsocks


    Shadowsocks 的使用,必須在防火牆外部建立一個Shadowsocks server,並在本基端使用支援Shadowsocks 的本機端才可以連到外部的Shadowsocks server,因為Shadowsocks 走的是socks5協定,所以不管是瀏覽器還是應用程式要使用Shadowsocks 都需要透過本機端的port(預設1080)來連線,所以local ip 跟port主要是以要連上Shadowsocks  server的裝置為主,基本上測試過 GCP 、linode、中華VPS 都有效。



安裝:


apt-get install python-pip
pip install shadowsocks

設定:


     我通常會在自己使用者底下建立ss資料夾方便管理,如果只希望用預設值的可以參考官網,請依照自己習慣動態調整設定黨位置,但注意最後一定要用 root權限,因為會呼叫一個加密lib。

mkdir ssserver
vim  ssserver.json
   server 可以打上自己的IP,port也可以自己換,官網有提到有些VPS 服務商會讓非正常port降速可以使用常見port處理,如:443,3389...,但我會建議超過1024比較好,password為倒是時候連線的密碼,method是加密方法,aes-256-cfb 是通常ubuntu server都會內建,至於會不會被破我就不得而知了

ssserver.json


{

   "server": "0.0.0.0",
   "server_port": 8388,
   "local_address": "127.0.0.1",
   "local_port": 1080,
   "password": "passwd",
   "timeout": 300,
   "method": "aes-256-cfb",
   "fast_open": false
}

執行:

-C 是指定設定黨位置,--log-file 是特別指定log黨寫入位置,-d是背景執行
sudo ssserver -c ~/sserver/ssserver.json --log-file ~/ssserver/ss.log -d start
只要出現2017-09-01 16:07:34 INFO     starting server at 0.0.0.0:8388就是正常了,可以嘗試客戶端連線

關閉:

sudo ssserver -c ~/sserver/ssserver.json --log-file ~/ssserver/ss.log -d stop

windows client

Android client

問題排除:

    通常遇到最大的問題都是被防火牆擋住了,如果是GCP 跟中華除了本機端的防火牆之外還要特別設定外部防火牆指到VPS,而本機防火牆通常是iptable 跟 ufw。

檢查是否為防火牆擋住:

sudo cat /var/etc/syslog

如果看到[UFW BLOCK] 就是被ufw擋住了:


sudo ufw allow 8388/tcp

如果看到 iptables_INPUT_denied 就是被iptables擋住了:

1.檢查防火牆:

 sudo iptables -L -n

2.如果有reject-with icmp-port-unreachable 要先移除,不然就跳過這步驟,下面是移除input第幾個:
sudo iptables -D INPUT 3
3.新增連入iptables:

sudo iptables -A INPUT -p tcp --dport 8388-j ACCEPT
4.加回iptables:
sudo iptables -A INPUT -j REJECT --reject-with icmp-port-unreachable

2017年4月16日 星期日

ubuntu 16.04 docker安裝 跟helloworld docker

ubuntu 16.04 docker安裝 跟helloworld docker


本篇文章是根據docker官網文件所編寫,幫助大家建立docker環境。
https://docs.docker.com/engine/getstarted/step_one/#docker-for-linux
https://docs.docker.com/engine/getstarted/linux_install_help/


1.curl 跟wget 之後將會用來抓取安裝shell檔,所以要先安裝起來。

sudo apt-get install curl wget

2. 抓取docker安裝文件並執行。

curl -fsSL https://get.docker.com/ | sh

3.啟動docker 服務於背景

sudo systemctl start docker
4.安裝並啟動 docker image,因為在本地端沒有image檔就會去跟網路抓。

 docker run hello-world

smarturine@smarturinebagUbuntu:~$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
                : Pull complete
Digest: 
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://cloud.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/engine/userguide/


5.確認docker有在執行

docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
a4df94953b35        hello-world         "/hello"            15 minutes ago      Exited (0) 15 minutes ago                       compassionate_shannon

有顯示出來就代表成功了~!

2017年3月21日 星期二

[python]Ascii ETX STX


處理字串偶然間遇到特殊字元ETX,STX,查了才知道原來是控制碼,一般控制碼是 ASCII 前 32 碼。在python官網有詳細的解釋。

程式:

# -*- coding: utf-8 -*-
#測試EXT STX
stx = '\x02'
etx = '\x03'

s='疵除外 )。",'

ustx=stx.encode('UTF-8')
uetx=etx.encode('UTF-8')

print s.find(etx)
print s.find(uetx)
print s.find(stx)
print s.find(ustx)

輸出:
9
9
-1
-1

NameMeaning
NUL
SOHStart of heading, console interrupt
STXStart of text
ETXEnd of text
EOTEnd of transmission
ENQEnquiry, goes with ACK flow control
ACKAcknowledgement
BELBell
BSBackspace
TABTab
HTAlias for TAB: “Horizontal tab”
LFLine feed
NLAlias for LF: “New line”
VTVertical tab
FFForm feed
CRCarriage return
SOShift-out, begin alternate character set
SIShift-in, resume default character set
DLEData-link escape
DC1XON, for flow control
DC2Device control 2, block-mode flow control
DC3XOFF, for flow control
DC4Device control 4
NAKNegative acknowledgement
SYNSynchronous idle
ETBEnd transmission block
CANCancel
EMEnd of medium
SUBSubstitute
ESCEscape
FSFile separator
GSGroup separator
RSRecord separator, block-mode terminator
USUnit separator
SPSpace
DELDelete


參考:
https://docs.python.org/2/library/curses.ascii.html