2017年12月22日 星期五

Python networking note

Function Not ready, don't use it. 
netstat -aon

#Ethan_s.py
#!/usr/bin/python
# -*- coding: UTF-8 -*-

import socket, os, sys, time, subprocess        # Import socket module
from subprocess import Popen, PIPE
reload(sys)
sys.setdefaultencoding('utf8')
#0==================================                                #http://www.bogotobogo.com/python/python_network_programming_server_client_file_transfer.php
port = 60001                    # Reserve a port for your service.
s = socket.socket()             # Create a socket object
host = socket.gethostname()     # Get local machine name
s.bind((host, port))            # Bind to the port
s.listen(5)                     # Now wait for client connection.
print 'Server listening....'

#1==================================
while True: #Loop for listening
    conn, addr = s.accept()     # Establish connection with client.
    print 'Got connection from', addr
    print('Server received', conn.recv(1024)) #R0 Hello server!, repr() like as str()

#2==================================
    try:
        while conn:
            data = conn.recv(4096)  #R1, 4096 is recommand
            print ("Receiving...: "+data)
           
            p=subprocess.Popen(data,shell=True, stdout=PIPE, stderr=PIPE, stdin=PIPE)
            stdout,stderr =p.communicate()         

            send_data = str("\nServer got msg: \n===========START================\n"+
                        "cmd: "+data+"\n"+
                        "stdout: \n"+stdout+"\n"+
                        "stderr: \n"+stderr+"\n"+
                        "\n===========END================\n")
           

            conn.sendall(send_data) #S1, buffer不足
            #while (send_data):
            #    conn.send(send_data)
            print("Sending... "+send_data)


    except IOError as e:
        print "I/O error({0}): {1}".format(e.errno, e.strerror)
    except socket.error as msg:
        print "Socket Error: %s" % msg
    except TypeError as msg:
        print "Type Error: %s" % msg
    finally:
        print('Successfully !')
        #print('Sending finished')
        #conn.send('Thank you for connecting\n')
        conn.close()
        print '\n\n\nServer listening....'



"""
Know issue buffer not ready 如果傳太多data會lose data
"""




#Ethan_c.py
#!/usr/bin/python
# -*- coding: UTF-8 -*-

import socket, os, sys, time          # Import socket module
from subprocess import Popen   #http://www.bogotobogo.com/python/python_network_programming_server_client_file_transfer.php
reload(sys)
sys.setdefaultencoding('utf8')
#0==================================
port = 60001   
s = socket.socket()             # Create a socket object
host = socket.gethostname()     # Get local machine name
                                # Reserve a port for your service.



#1==================================
s.connect(('10.110.145.250', port))    #s.connect((host, port))

#10.110.146.77
#10.110.136.52
#10.110.136.159

s.send("Hello server!") #S0


#2==================================
try:
    while True :
        remote_cmd = raw_input("please input the cmd (default is dir): \n")#"please input the cmd (default is dir):", "dir"
     
        if remote_cmd.lower() == "":
            recv_data = s.recv(1024)
            print ("\nReceive... \n"+ recv_data)     
        elif remote_cmd.lower() == "exit" or remote_cmd.lower() == "q":
            s.send("Close by client")
            s.close()
        else:
            s.send(remote_cmd)   #S1
            print('Sending... ',repr(remote_cmd))

        time.sleep(1)   #delay
        recv_data = s.recv(1024)    #R1, buffer not enough
        if recv_data:
            print ("\nReceive... \n"+ recv_data)
            recv_data = s.recv(1024)  # keep waiting for data coming. Bug at here
            if not recv_data:
                s.close()
                break
            time.sleep(1)





except IOError as e:
    print "I/O error({0}): {1}".format(e.errno, e.strerror)
except socket.error as msg:
    print "Socket Error: %s" % msg
except TypeError as msg:
    print "Type Error: %s" % msg 
finally:
    #print("Sever: " +s.recv(1024))
    s.close()
    print('connection closed')

#p=Popen('received_file.bat')
#stdout,stderr =p.communicate()

"""
Know issue buffer not ready 如果傳太多data會lose data
"""

2017年12月14日 星期四

Game

Snes9X

FF6
https://www.ng173.com/thread-567246-1-1.html


7E1862 98

道具欄第一格種類

7E1869 xx

道具欄第一格數量99
7E1969 63

青魔法
7E1D29 FF
7E1D2A FF
7E1D2B FF

全道具
C3272D8A
C3272EEA
C3272FEA
C32741A9
C3274263
C32743EA

輸入完全部金手指後,使用一下道具欄上方「せいとん(整頓)」的指令後就會全道具出現




2017年10月14日 星期六

Tensorflow for JAVA



 微軟的線上 jupyter notebook
https://notebooks.azure.com/


Tensorflow for Python
深度學習的好網站
https://ithelp.ithome.com.tw/articles/10187648
該作者的github
https://github.com/c1mone/Tensorflow-101/blob/master/notebooks/3_MNIST_CNN_Layer_Visualization.ipynb

Tensorflow for JAVA on Windows
https://www.tensorflow.org/install/install_java

下載下面兩個檔案
https://storage.googleapis.com/tensorflow/libtensorflow/libtensorflow-1.3.0.jar
https://storage.googleapis.com/tensorflow/libtensorflow/libtensorflow_jni-cpu-windows-x86_64-1.3.0.zip

HelloTF.java的原始碼如下,紅色是我加的,其他都跟官網一樣。
import org.tensorflow.Graph;
import org.tensorflow.Session;
import org.tensorflow.Tensor;
import org.tensorflow.TensorFlow;

public class HelloTF {
  public static void main(String[] args) throws Exception {
System.loadLibrary("tensorflow_jni");
    try (Graph g = new Graph()) {
      final String value = "Hello from " + TensorFlow.version();

      // Construct the computation graph with a single operation, a constant
      // named "MyConst" with a value "value".
      try (Tensor t = Tensor.create(value.getBytes("UTF-8"))) {
        // The Java API doesn't yet include convenience functions for adding operations.
        g.opBuilder("Const", "MyConst").setAttr("dtype", t.dataType()).setAttr("value", t).build();
      }

      // Execute the "MyConst" operation in a Session.
      try (Session s = new Session(g);
           Tensor output = s.runner().fetch("MyConst").run().get(0)) {
        System.out.println(new String(output.bytesValue(), "UTF-8"));
      }
    }
  }
}


編譯
javac -cp libtensorflow-1.3.0.jar HelloTF.java
執行
java -cp libtensorflow-1.3.0.jar;. -Djava.library.path=jni HelloTF

執行
java -cp libtensorflow-1.3.0.jar;. -Djava.library.path="存放tensorflow_jni.dll檔案的資料夾" HelloTF

結果
2017-10-15 12:33:30.150485: W tensorflow/core/platform/cpu_feature_guard.cc:45]
The TensorFlow library wasn't compiled to use AVX instructions, but these are available on your machine and could speed up CPU computations.
2017-10-15 12:33:30.150485: W tensorflow/core/platform/cpu_feature_guard.cc:45]
The TensorFlow library wasn't compiled to use AVX2 instructions, but these are available on your machine and could speed up CPU computations.
Hello from 1.3.0

另一個範例程式
https://github.com/tensorflow/tensorflow/blob/r1.3/tensorflow/java/src/main/java/org/tensorflow/examples/LabelImage.java

需要搭配下面的參考檔案
https://storage.googleapis.com/download.tensorflow.org/models/inception5h.zip

執行的方式
java -cp libtensorflow-1.3.0.jar;. -Djava.library.path="存放tensorflow_jni的資料夾" -jar LabelImage.jar "放tensorflow_inception_graph.pb的資料夾"  "測試的圖片.jpg"

結果
2017-10-19 09:41:56.723777: W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use AVX instructio
ns, but these are available on your machine and could speed up CPU computations.
BEST MATCH: bolo tie (26.88% likely)





2017年9月22日 星期五

Python Note



==========py to exe with sign==========
參考網址https://steward-fu.github.io/website/driver/wdm/self_sign.htm
或這個也寫得不錯http://mqjing.blogspot.tw/2009/03/plugin-activex-cab-signtool.html

signtool get from MS SDK or Visual C++ for Python (http://aka.ms/vcpython27)

First time
Makecert -r -pe -ss YourName YourName.cer
certmgr.exe -add YourName.cer -s -r localMachine root
After
signtool sign /s YourName YourApp.exe

==========bundle exe to py.exe==========
http://blog.csdn.net/Sagittarius_Warrior/article/details/73998548

currPath = sys.path[0]
os.system(currPath+"\\exe.exe") #exe.exe can not be found if without sys.path[0]
#or  add sys.path[0] to cwd path
os.path.join(os.getcwd(),sys.path[0])

C:\Python27\Scripts\pyinstaller --uac-admin ^
--uac-uiaccess ^
--win-private-assemblies ^
--clean ^
--key 1234512345 ^
-i Home.ico ^
--add-data=exe.exe;. ^
--add-data=signtool.exe;. ^
-F exe_Test.py

註: ^ 是換行的意思


====================
====================
====================
====================
======同時安裝python2 & 3==============
https://www.zhihu.com/question/21653286
py -2 v2.py
py -3 v3.py
py -2 -m pip install package
py -3 -m pip install package
header #! python2 or #! python3

==========Server & Client的部分==========
http://www.bogotobogo.com/python/python_network_programming_server_client_file_transfer.php

加一下自己寫的東西... https://github.com/kyc1109/devcon

# Compile .py to class ==========================================
#https://stackoverflow.com/questions/14205464/converting-jython-code-into-a-java-class
Test file: A31Mod.py, A31Mod$py.class
指令如下: #若直接用Jython編譯則產出class, 但是如果直接用Python編譯則產出pyc檔。
java -jar jython-standalone-2.7.0.jar #run Jython
>>> import compileall   # import for compile multi file。
#>>> compileall.compile_dir('directory/', force=True) #compile multi file
>>> import py_compile   # import for compile single file。
>>> py_compile.compile("A31Mod.py") #compile single file from A31Mod.py to A31Mod$py.class
>>> from A31Mod import A31Mod #import A31Mod$py.class
>>> a31 = A31Mod("TC_COM_1436") # use A31Mod()
>>> a31.LAN_PING()
ping www.compal.com #result
LAN check Pass #result


Python 中文教學
http://mirror.sars.tw/Python_tut_tw/tut.html

#How to overload __init__ method based on argument type?==========================================
#https://stackoverflow.com/questions/141545/how-to-overload-init-method-based-on-argument-type
class MyData: #Quick and dirty fix
    def __init__(string=None,list=None):
        if string is not None:
            #do stuff
        elif list is not None:
            #do other stuff
        else:
            #make data empty
#===import py part 1=======================================
#Complex.py
class Complex:
    def __init__(self, realpart, imagpart): #__init__ 就是class的方法,所以等於Complex()
        self.r = realpart
        self.i = imagpart     
#test.py
from Complex import Complex
x = Complex(3.0,-4.5)
print x.r, x.i

#===import py part 2=======================================
import os, subprocess, time
#變數和呼叫的方法要前面要加self.,所以會有一堆self.xxx。
class DevCompareMod:
    def __init__(self, original_file, unoriginal_file, log_file): #__init__ equal DevCompareMod()
        self.original_file = original_file #"original.txt"
        self.unoriginal_file = unoriginal_file #"unoriginal.txt"
        self.log_file = log_file #"log_DevCompare.txt"
    def wLog(self, txtLog):
        if not os.path.exists(self.log_file):
            wLog=open(self.log_file, "w")
            wLog.write(txtLog)
            wLog.close()     
        else:
            wLog=open(self.log_file, "a")
            wLog.write(txtLog)
            wLog.close()
    self.wLog(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())+"=======================================\n")
    self.wLog(strLost)

#使用方式
from DevCompareMod import DevCompareMod
DevCompareMod("original.txt","unoriginal.txt","log_DevCompare.txt")

#===import py part 3=======================================
#__init__ 和 __name__是可以一起用的
class DevCompareMod:
    def __init__(self): #__init__ equal DevCompareMod()

if __name__ == '__main__':
if len(sys.argv) < 2 or sys.argv[1].lower()=="/h" or sys.argv[1].lower()=="-h" or sys.argv[1].lower()=="/?" or sys.argv[1].lower()=="-?" : #len小於2也就是不帶參數啦
print "no/wrong argument."
else:
DevCompareMod()
# 參考網址 http://www.kaiching.org/2012/12/Python-Constructor.html




http://usyiyi.cn/documents/python_278/library/subprocess.html
簡中的翻譯版

建議優先使用 subprocess.call()或是subprocess.check_call()或是subprocess.check_output()(回傳值不為0則丟出例外),
如果不行的話,再用Popen 搭配communicate()
#Popen VS. check_output
#因為check_outputt因為已經內建stdout,所以如果有問題只會出現error code和error msg,但不會出現執行的內容。
try:
p = subprocess.check_output(["ls non_existent_file; exit 1"],shell=True, stderr=subprocess.STDOUT) #不允許stdout因為已經內建了
print p
except subprocess.CalledProcessError,e:
    print e.output
    輸出ls: cannot access 'non_existent_file': No such file or directory

q = subprocess.Popen(["ls","-a"],shell=True, stdout=PIPE, stderr=PIPE)
stdout, stderr = q.communicate() 
print stdout
輸出README.md
輸出Test_1.ipynb



https://docs.python.org/2/library/subprocess.html
#method2, output="dmesg | grep hda"
p1 = Popen(["dmesg"], stdout=PIPE)
p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE)
p1.stdout.close()  # Allow p1 to receive a SIGPIPE if p2 exits.
output = p2.communicate()[0]

http://www.powenko.com/wordpress/?p=8697
翻譯的有點怪,但還可以接受啦



https://stackoverflow.com/questions/4348524/subprocess-variables
https://blog.aweimeow.tw/2016/09/09/python-subprocess-%E5%90%84%E5%87%BD%E5%BC%8F%E7%9A%84%E4%BD%BF%E7%94%A8%E6%99%82%E6%A9%9F/

參考上述網頁,Popen裡面的指令與參數,用逗號","取代空格" "可以避免不必要的錯誤。
透過PIPE把結果回傳到stdout或是stderr。


def subxx(): 
    import sys, os, subprocess               # Import socket module
    from subprocess import Popen, PIPE
    try:
        output = subprocess.Popen(["ping","localhost"], stdout=subprocess.PIPE, stderr=subprocess.PIPE)    #useing , not space in cmd
        stdout, stderr= output.communicate()
        print ("output: \n"+str(output))
        print ("stdout: \n"+stdout)
    except subprocess.CalledProcessError:
        print('Exception handled')

subxx()

====以下為輸出結果=============================================
output: 
<subprocess.Popen object at 0x8>
stdout: 

Ping localhost [127.0.0.1] (使用 32 位元組的資料): 
回覆自 127.0.0.1: 位元組=32 time<1ms TTL=128 
回覆自 127.0.0.1: 位元組=32 time<1ms TTL=128 
回覆自 127.0.0.1: 位元組=32 time<1ms TTL=128 
回覆自 127.0.0.1: 位元組=32 time<1ms TTL=128 

127.0.0.1 的 Ping 統計資料: 
封包: 已傳送 = 4,已收到 = 4, 已遺失 = 0 (0% 遺失), 
大約的來回時間 (毫秒): 
最小值 = 0ms,最大值 = 0ms,平均 = 0ms




















2017年9月15日 星期五

Java Screen Capture




    private static void screencapture() throws IOException, AWTException {
        //throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
        try{
            GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
            GraphicsDevice[] gs = ge.getScreenDevices();
            for (int j = 0; j < gs.length; j++) {   //get each monitor
                GraphicsDevice gd = gs[j];
                GraphicsConfiguration[] gc = gd.getConfigurations();          
                for (int i=0; i < gc.length; i++) {
                    Rectangle rec = gc[i].getBounds();  //get each screen resolution
                    BufferedImage image = new Robot().createScreenCapture(rec);
                 
                    String timeStamp = new SimpleDateFormat("MMdd_HHmm_ss").format(Calendar.getInstance().getTime());    //yyyyMMdd_HHmmss
                    ImageIO.write(image, "png", new File("Screen_"+j+"_"+ rec.width +"x"+rec.height +"_"+timeStamp +".png"));
                    System.out.println("Screen:"+j+"_"+ rec.width +"x"+rec.height +"_"+timeStamp +".png");
                    //Save file at %userprofile%\Documents\NetBeansProjects\JavaSikuli
                }  
            }
        } catch (AWTException ex) {
            Logger.getLogger(JavaSnapshot.class.getName()).log(Level.SEVERE, null, ex);          
        }
    }

2017年9月4日 星期一

Sikuli 筆記

VLC record desktop command:
vlc screen:// -I rc --screen-fps 30 :sout=#transcode{vcodec=h264}:std{access=file,dst=%homepath%/Desktop/output.mp4}
之後再打stop即可停止錄影。


1.
hover(Location(s.getBottomRight())) #終於找到了之一,S=screen, hover 可以改成click等動作
hover(Location(s.getTopLeft()).offset(100,100))    #終於找到了之二,hover offset on second monitor

#來源網址 http://www.lai18.com/content/7527573.html
#screen capture
screen = Screen()
sc = screen.capture()
shutil.move(sc.getFilename(), os.path.join(os.path.abspath('.'), "some-name.png"))

2.
跟find()有關的
Find() # FindFailed exceptions
exists() #no exceptions
Region.exists() #returns False
setFindFailedResponse(PROMPT) # PROMPT/RETRY/SKIP/ABORT/HANDLE when not found you will be prompted. 這個超好用的,在發現findfailed的時候會跳出提示,真貼心。


註:http://sikulix-2014.readthedocs.io/en/latest/region.html#exception-findfailed

3.
在Sikuli呼叫JAVA
看樣子,jar在Jython裡面被視為是一個資料夾,所以用法如方法三。

參考網站:
http://techblog.leosoto.com/jython-import-logic/
https://puremonkey2010.blogspot.tw/2014/01/jython-using-jython-to-call-java.html


下面的Jython.classJython.jar是我自己建立的測試檔案,不是官網上的Jython.jar喔!!!
#Method 1. Jython.class in *.sikuli_folder\Jython.class
import class
#Method 2. Jython.class in *.sikuli_folder\jython\Jython.class
import jython.Jython
#Method 3. Jython.jar in ..\*.sikuli_folder\sikulix\lib\Jython.jar
 import sys sys.path.append(getBundlePath()+"\\Jython.jar") #宣告jar檔案的位置 from jython import Jython #from package import class j = Jython("kyc1109","TPE") j.hello()

------Jython.jar start----------------------------------------------
package jython; /** * * @author kyc1109 */ public class Jython { private String name; private String city; /** * @param name * @param city */ public Jython(String name, String city){ this.name = name; this.city = city; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getCity() { return city; } public void setCity(String city) { this.city = city; } public void hello() { System.out.println("Hi this is Java by hello()"); } public static void main(String[] args) { // TODO code application logic here System.out.println("Hi this is Java"); } }

------Jython.jar end----------------------------------------------

# for Multi-Monitor
for i in range(0,Screen.getNumberScreens()): #1 = Monitor2, 0 = Monitor 1 s= Screen(i) print i bounds=s.getBounds() print bounds hover(s) #move cursor to screen 1,2...



2017年3月14日 星期二

My Python note in Windows

My Python note in Windows

1. Python 已經內建pip,只需要update即可
C:\Python27\Scripts
python -m pip install -U pip

2. 透過pip安裝我常用的套件
pip install matplotlib BeautifulSoup selenium pandas requests bs4 jieba scikit-learn

3. 除了 scipy要另外單獨下載安裝
下載網址,注意他有for Python的版本喔!
http://www.lfd.uci.edu/~gohlke/pythonlibs/#scipy
pip install scipy-0.19.0-cp27-cp27m-win32.whl

另外,因為scipy是獨立安裝的關係吧,需要手動安裝numpy+MKL才行。
下載網址 http://www.lfd.uci.edu/~gohlke/pythonlibs/#numpy
pip install numpy‑1.11.3+mkl‑cp27‑cp27m‑win32.whl



以上筆記參考網址如下:
https://pip.pypa.io/en/latest/installing/#upgrading-pip
http://stackoverflow.com/questions/37267399/importerror-cannot-import-name-numpy-mkl