Tuesday, January 5, 2021

Python - Create an empty array and apply maximum/minimum clipping limits to a vector

 The code below shows how to

1. Define array a as type = float 32. (aka Single in Matlab)

2. Create empty array of zeros b as the same shape and type as a

3. Apply min/max limits to a and the clipped results to b

4. Make a copy of as c and apply the same min/max clipping limits.

import numpy as np

#Array of float32. Without dtype, the default is float64.

a = np.array([0.21, 0.92, 0.89, 1.67, -0.12],dtype=np.float32)


#Create b with the same dimension as a

b = np.zeros(a.shape,dtype=a.dtype)


#clip

np.clip(a,0,1,out=b);


#make a copy of a as c. If use = c, the content of will change with c.

c = a.copy()

c[c>1]=1

c[c<0]=0

Variable explorer results with Spyder:



Reference:

Single-precision floating-point (Wikipedia)

Monday, October 12, 2020

Python and Openpyxl - Read in multiple txt files and store as different worksheets in a single Excel file

If you have some text file and want to combine them into different worksheets of the same Excel file, simply follow the example below using Python:

1. Create some txt files and separate data with tabs:


2. Save the following code as a python file:

import csv
import openpyxl

inputArray = ['a', 'b', 'c']

wb = openpyxl.Workbook()
output_file = 'output.xlsx'

#loop in the reversed order so that the first file is stored as the first sheet.
for item in reversed(inputArray):

    input_file = item+'.txt'
    sheet = wb.create_sheet(item, 0)

    with open(input_file, 'rt') as data:
    reader = csv.reader(data, delimiter='\t')
    for row in reader:
    sheet.append(row)

wb.save(output_file)

Note: install openpyxl using pip or miniconda if required.

3. result:



Reference:

如何使用 Python 程式操作 Excel 試算表 (TechBridge 技術共筆部落格 by kdchang)

Friday, October 9, 2020

Raspberry - Pronunciation 什麼!? 樹莓派的英文發音竟然跟你想的不一樣?

你接觸樹莓派(Raspberry Pi)多久了呢?

「樹莓」的英文字Raspberry看起來不難發音吧... 你也是唸Rasp+Berry嗎?

其實,跟想像的不一樣喔!竟然是:


p不發音!p不發音!p不發音!(很重要所以說三次!)


所以唸起來比較像是Raz-berry

記起來了嗎?


發音聽這邊:

How to say raspberry (Cambridge Dictionary YouTube) (包括英式與美式發音)

這30個台灣人常唸錯的英文字😲 你答對幾個? (Lily Chen YouTube 6:00)

Tuesday, March 8, 2016

JavaScript and JSON

If we have a JSON string like this:

{"result":{"information":[{"name":"Tom","age":25},{"name":"Andy","age":30},{"name":"Peter","age":35},{"name":"David","age":40}]}}

How do we use it in JavaScript?

The answer is very easy. Just use JSON.parse().

JavaScript code:


<script language="JavaScript">
<!--

var JSONStr ='{"result":{"information":[{"name":"Tom","age":25},{"name":"Andy","age":30},{"name":"Peter","age":35},{"name":"David","age":40}]}}';
var JSONObj = JSON.parse(JSONStr);

var count;
for (count = 0 ; count <=3 ; count++){
    document.write("<br><br>");
    document.write(JSONObj.result.information[count].name+" ");
    document.write(JSONObj.result.information[count].age);
}
</script><noscript>
Your browser doesn't support JavaScript.
</noscript>

Result:


Related Information:

Simple JavaScript code - Hello World and Current Time
iOS: Print out JSON content in Swift playground

Simple JavaScript code - Hello World and Current Time

Here is a simple JavaScript code for beginners:

<script language="JavaScript">
<!--
//Hello, World and Random Number
document.write("Hello, JavaScript!");
var myRand = Math.round(Math.random()*100);
var myStr1 = "<br><br>My Random number between 0 and 100:  <b><font size=+2 color=red>"
var myStr2 = "</font></b><br><br>"
document.write(myStr1+myRand+myStr2);

//Date and Time
var month_array = new Array("January", "February", "March", "April", "May", "June","July", "August", "September", "October", "November", "December");
var weekday_array = new Array("Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday");

var nowDate = new Date();
var year = nowDate.getFullYear();
var month = nowDate.getMonth();
var day = nowDate.getDate();
var weekday = nowDate.getDay();
var hour = nowDate.getHours();
var ampmStr = hour > 12 ? " PM" : " AM";
hour %= 12;
var minute = nowDate.getMinutes();
var second = nowDate.getSeconds();

//Add 0 if only one digit. See: http://stackoverflow.com/questions/8513032/less-than-10-add-0-to-number
hour = ('0' + hour).slice(-2)
minute = ('0' + minute).slice(-2)
second = ('0' + second).slice(-2)

document.write("Now is:<br>");
document.write(hour+":"+minute+":"+second+ampmStr+"<br>")
document.write(weekday_array[0]+"<br>"+month_array[month]+" "+day+", "+year+"<br><br>")


//Simple Calculation
var a = 3;
var b = 4;
var sum = a+b;
document.write(a+" + "+b+" = "+sum)
</script>
<noscript>
Your browser doesn't support JavaScript.
</noscript>

Result:



Related Information:

JavaScript and JSON

Friday, March 4, 2016

Sending RSA encrypted message - From Python socket server to iOS device (Raspberry Pi Part)

Secure Data Transmission: Raspberry Pi (Python) -> iOS device (Swift)

Secure communication between a mobile device client and a server is important. This tutorial selects an iPhone as the server and uses a Raspberry Pi as the client. The communication procedure is as below:

1. iPhone generates an RSA private / public key pair and sends the public key to server.
2. Server encrypts a message using the public key provided by iPhone and sends the encrypted message to iPhone
3. iPhone decrypts the encrypted message from server using the private key

This tutorial is derived from the basic communication between an iPhone and a Python socket server built on a Raspberry Pi without encryption:

Connect an iPhone to a Simple Python Socket Server (Raspberry Pi Part) (iOS Part)

For an overview on client-server communications, see this:

Communication between iOS device (Client) and Raspberry Pi (Server)

Raspberry Pi Part

Raspberry Pi 2 Model B is used. The Python version used is 2.7.3. Check the Python version with the python -V command.

1. Install Python-Crypto.

sudo apt-get install python-crypto





2. Use sudo nano server.py command to edit a python file as below:


import socket
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5

#Declartion
mysocket = socket.socket()
host = socket.gethostbyname(socket.getfqdn())
port = 7777
publicKeyType_str = "public_key="
message = "Secret message from RPi server"

if host == "127.0.1.1":
    import commands
    host = commands.getoutput("hostname -I")

print "host = " + host

#Prevent socket.error: [Errno 98] Address already in use
mysocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
mysocket.bind((host, port))
mysocket.listen(5)
c, addr = mysocket.accept()

while True:

    #Wait until data is received.
    data = c.recv(1024)
    data = data.replace("\r\n", '') #remove new line character

    if publicKeyType_str in data:

        #remove publicKey_str
        data = data.replace(publicKeyType_str, '')

        #convert string to key
        public_key = RSA.importKey(data)

        #add PKCS1 v1.5 padding
        public_key_padding = PKCS1_v1_5.new(public_key)
        #print(public_key.exportKey()) #Check this with Xcode's debug console.
        print("Client's public key received!")

        #encrypt
        encrypted = public_key_padding.encrypt(message)
        c.send(encrypted)
        print "Encrypted message sent!"

    elif data == "Quit": break

#Server to stop
print "Server stopped"
c.close()

iOS Part

Write an iOS app in Swift. See the client version of this post:

Sending RSA encrypted message - From Python socket server to iOS device (iOS Part)

Result

Run both the socket server on Raspberry Pi and iOS simulator on Mac. Press the four app buttons from top to bottom. Raspberry Pi sends "Secret message from RPi server" to iPhone:


Go back to Communication between iOS device (Client) and Raspberry Pi (Server)

Thursday, March 3, 2016

Sending RSA encrypted message - From iOS device to Python socket server (Raspberry Pi Part)

Secure Data Transmission: iOS device (Swift) -> Raspberry Pi (Python)

Secure communication between a mobile device client and a server is important. This tutorial selects a Raspberry Pi as the server and uses an iPhone simulator as the client. The communication procedure is as below:

1. Server generates an RSA private / public key pair and sends the public key to iPhone
2. iPhone encrypts a message using the public key provided by server and sends the encrypted message to server
3. Server decrypts the encrypted message from iPhone using the private key

This tutorial is derived from the basic communication between an iPhone and a Python socket server built on a Raspberry Pi without encryption:

Connect an iPhone to a Simple Python Socket Server (Raspberry Pi Part) (iOS Part)

For an overview on client-server communications, see this:

Communication between iOS device (Client) and Raspberry Pi (Server)

Raspberry Pi Part

Raspberry Pi 2 Model B is used. The Python version used is 2.7.3. Check the Python version with the python -V command.

1. Install Python-Crypto.

sudo apt-get install python-crypto




2. Use sudo nano server.py command to edit a python file as below:


import socket
from Crypto.PublicKey import RSA
from Crypto import Random

#Generate private key and public key
random_generator = Random.new().read
private_key = RSA.generate(1024, random_generator)
public_key = private_key.publickey()

#Declartion
mysocket = socket.socket()
host = socket.gethostbyname(socket.getfqdn())
port = xxxx

encrypt_str = "encrypted_message="

if host == "127.0.1.1":
    import commands
    host = commands.getoutput("hostname -I")
print "host = " + host

#Prevent socket.error: [Errno 98] Address already in use
mysocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
mysocket.bind((host, port))
mysocket.listen(5)
c, addr = mysocket.accept()

while True:

    #Wait until data is received.
    data = c.recv(1024)
    data = data.replace("\r\n", '') #remove new line character

    if data == "Client: OK":
        c.send("public_key=" + public_key.exportKey() + "\n")
        print "public key sent"

    elif encrypt_str in data:

        #remove encrypt_str
        data = data.replace(encrypt_str, '')

        #decrypt
        decrypted = private_key.decrypt(data)

        #remove padding
        if len(decrypted) > 0 and decrypted[0] == '\x02':
            pos = decrypted.find('\x00')
            if pos > 0:
                c.send("Server: OK")
                message = decrypted[pos+1:]
                print message

    elif data == "Quit": break

#Server to stop
c.send("Server stopped\n")
print "Server stopped"
c.close()


iOS Part

Write an iOS app in Swift. See the client version of this post:

Sending RSA encrypted message - From iOS device to Python socket server (iOS Part)

Result

Run both the socket server on Raspberry Pi and iOS simulator on Mac. Press the four app buttons from top to bottom. iPhone sends "Secret message from iPhone!!" to Raspberry Pi:



Reference:

How to decrypt an RSA encrypted file in Python

Go back to Communication between iOS device (Client) and Raspberry Pi (Server)