mydict = {"mike":50, "peter":30, "john":75}
total_score = sum(mydict.values())
print(total_score)
$ python3 test.py
155
ソフトウェアエンジニアの技術ブログ:Software engineer tech blog
随机应变 ABCD: Always Be Coding and … : хороший
mydict = {"mike":50, "peter":30, "john":75}
total_score = sum(mydict.values())
print(total_score)
$ python3 test.py
155
import json
class MyClass:
def __init__(self, a, b):
self.group = []
self.a = a
self.b = b
def add(self):
c = self.a + self.b
self.group.append(c)
print(self.group)
obj = MyClass(2, 4)
obj.add()
obj.add()
$ python3 test.py
[6]
[6, 6]
json.dumpする際に、sort_keysをTrueとすることで、dictionallyのkeyでソートする
import json
class MyClass:
def __init__(self, a, c, b):
self.a = a
self.c = c
self.b = b
obj = MyClass(2, 4, 6)
string = json.dumps(obj.__dict__)
print(string)
string = json.dumps(obj.__dict__, sort_keys=True)
print(string)
$ python3 test.py
{“a”: 2, “c”: 4, “b”: 6}
{“a”: 2, “b”: 6, “c”: 4}
なるほど、これで下のコードが何をやってるのか理解できたわ
import hashlib
import json
from datetime import datetime
import random
class Block:
def __init__(self, index, previous_hash, timestamp, data, validator):
self.index = index
self.previous_hash = previous_hash
self.timestamp = timestamp
self.data = data
self.validator = validator
self.hash = self.calculate_hash()
def calculate_hash(self):
block_dict = self.__dict__
if 'hash' in block_dict:
del block_dict['hash']
block_string = json.dumps(block_dict, sort_keys=True).encode()
return hashlib.sha256(block_string).hexdigest()
__dict__はオブジェクトが持つ属性とその値を格納する辞書を返す特殊属性
モジュール、クラス、インスタンスなどで参照可能
class MyClass:
def __init__(self, x, y):
self.x = x
self.y = y
obj = MyClass(2, 4)
print(obj.__dict__)
$ python3 test.py
{‘x’: 2, ‘y’: 4}
追加、更新、削除も可能
class MyClass:
def __init__(self, x, y):
self.x = x
self.y = y
obj = MyClass(2, 4)
print(obj.__dict__)
obj.__dict__['z'] = 3
print(obj.__dict__)
obj.__dict__['x'] = 10
print(obj.__dict__)
del obj.__dict__['y']
print(obj.__dict__)
$ python3 test.py
{‘x’: 2, ‘y’: 4}
{‘x’: 2, ‘y’: 4, ‘z’: 3}
{‘x’: 10, ‘y’: 4, ‘z’: 3}
{‘x’: 10, ‘z’: 3}
dictはdictionallyの略ですね。__init__と__dict__が同時に出ると、やや混乱しましたが、使い方を理解すれば合点行きます。
initがコンストラクターとなり、selfはオブジェクト自身を表す
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def share_self(self):
print("名前:", self.name)
print("年齢:", self.age, '歳')
person_1 = Person('田中', 18)
person_2 = Person('山田', 20)
person_1.share_self()
person_2.share_self()
$ python3 test.py
名前: 田中
年齢: 18 歳
名前: 山田
年齢: 20 歳
エンコードしたテキストをsha256でハッシュ化
import hashlib text = "bbb" encode_string = text.encode() print(hashlib.sha256(encode_string).hexdigest())
$ python3 test.py
3e744b9dc39389baf0c5a0660589b8402f3dbb49b89b3e75f2c9355852a3c677
liefはPE、ELFなどの実行ファイルをパースし、一部のレコードの編集を行うためのライブラリ
– 実行ファイルの一部のレコードを編集した上で新しい実行ファイルとして書き出し
– パース可能な実行ファイルフォーマットが多い
– pefile, pyelftoolsなどがあった
### LIEFのインストール(ubutu22.04)
$ git clone https://github.com/lief-project/LIEF.git
$ cd LIEF && mkdir build && cd build
$ sudo apt update
$ sudo apt install cmake
$ sudo apt install ninja-build
※ninjaはbuildを高速化するツール。よくオープンソースのbuildなどに使われる。CPUを効率的に使用しており、複数コアのCPUだと特に速くなる。
※cmakeはコンパイラに依存しない自動化ツール
$ cmake -DLIEF_PYTHON_API=on -DPYTHON_VERSION=3.6 -DCMAKE_BUILD_TYPE=Release -DLIEF_TESTS=on -GNinja ..
$ cd api/python
$ python3
Python 3.10.12 (main, Nov 20 2023, 15:14:05) [GCC 11.4.0] on linux
Type “help”, “copyright”, “credits” or “license” for more information.
>>> import lief
Traceback (most recent call last):
File “
ModuleNotFoundError: No module named ‘lief’
>>> exit()
う〜ん、よくわかりませんね。
symbol-check.py
import sys import lief
まず対象となるファイルを適当に作成します。
script.cpp
#include "headers.h" bool CheckSig(vector<unsigned char> vchSig, vector<unsigned char> vchPubKey, CScript scriptCode, const CTransaction& txTo, unsigned int nIn, int nHashType);
file_name = './script.cpp'
with open(file_name) as f:
data = f.readlines()
data.insert(1, '// Copyright (c) 2009 Satoshi Nakamoto\n')
with open(file_name, mode='w') as f:
f.writelines(data)
これだと、全部書き変わってしまう…
copyright_header.pyだと、作者をファイルごとに定義しています。
COPYRIGHT_WITH_C = r'Copyright \(c\)'
COPYRIGHT_WITHOUT_C = 'Copyright'
ANY_COPYRIGHT_STYLE = '(%s|%s)' % (COPYRIGHT_WITH_C, COPYRIGHT_WITHOUT_C)
YEAR = "20[0-9][0-9]"
YEAR_RANGE = '(%s)(-%s)?' % (YEAR, YEAR)
YEAR_LIST = '(%s)(, %s)+' % (YEAR, YEAR)
ANY_YEAR_STYLE = '(%s|%s)' % (YEAR_RANGE, YEAR_LIST)
ANY_COPYRIGHT_STYLE_OR_YEAR_STYLE = ("%s %s" % (ANY_COPYRIGHT_STYLE,
ANY_YEAR_STYLE))
ANY_COPYRIGHT_COMPILED = re.compile(ANY_COPYRIGHT_STYLE_OR_YEAR_STYLE)
def compile_copyright_regex(copyright_style, year_style, name):
return re.compile(r'%s %s,? %s( +\*)?\n' % (copyright_style, year_style, name))
EXPECTED_HOLDER_NAMES = [
r"Satoshi Nakamoto",
r"The Bitcoin Core developers",
r"BitPay Inc\.",
r"University of Illinois at Urbana-Champaign\.",
r"Pieter Wuille",
r"Wladimir J\. van der Laan",
r"Jeff Garzik",
r"Jan-Klaas Kollhof",
r"ArtForz -- public domain half-a-node",
r"Intel Corporation ?",
r"The Zcash developers",
r"Jeremy Rubin",
]
f.writelines()ではなく、f.write(”.join())で関数と引数にして書いてます。
################################################################################
# read and write to file
################################################################################
def read_file_lines(filename):
with open(filename, 'r', encoding="utf8") as f:
file_lines = f.readlines()
return file_lines
def write_file_lines(filename, file_lines):
with open(filename, 'w', encoding="utf8") as f:
f.write(''.join(file_lines))
なるほど、Pythonならギリまだいけるな..
socketはネットワーク通信に利用するファイルの一種。
そして、このソケットに紐づけられた「ファイルディスクリプタ」を用いることで、アプリケーションに対してデータを送ることができる。
ファイルディスクリプタとは、プログラムが利用する標準入出力やファイル入出力をOSが識別するための識別子です。
### サーバサイド
1. socket()作成
2. bindはsocketをローカルのアドレスにバインド
3. listen()は接続を待ち受け
4. accept()は外部からの接続に対して新しいソケットをサック製
5. send()/receive()でデータの送受信
6. close()でソケットクローズ
### クライアントサイド
1. socket()でソケット作成
2. connect()はリモートソケットに接続
3. send()/receive()でデータの送受信
5. close()でソケットクローズ、ファイルディスクリプタ削除
### ソケット通信のバリエーション/パラメータ
ソケット通信の方式を決めるためのパラメータは、主に(1)アドレスファミリー、(2)ソケットタイプ
(1)アドレスファミリー
ソケットにバインドするアドレスの種類
・AF_UNIX: ローカル通信に使用する。同一マシン間でプロセス間通信を可能とする。
・AF_INET: IPv4インターネットプロトコル, TCP
・AF_INET6: IPv6インターネットプロトコル, TCP
(2)socket Type
TCPであればSOCK_STREAM, UDPであればSOCK_DGRAM
・SOCK_STREAM: 双方向のバイトストリーム
・SOCK_DGRAM: データグラム、UDPソケットで利用
import os
import socket
class BlockingServerBase:
def __init__(self, timeout:int=60, buffer:int=1024):
self.__socket = None
self.__timeout = timeout
self.__buffer = buffer
self.close()
def __del__(self):
self.close()
def close(self) -> None:
try:
self.__socket.shutdown(socket.SHUT_RDWR)
self.__socket.close()
except:
pass
def accept(self, address, family:int, type:int, proto:int) -> None:
self.__socket = socket.socket(family, typ, proto)
self.__socket.settimeout(self.__timeout)
self.__socket.bind(address)
self.__socket.listen(1)
print("Server started:", address)
conn, _ = self.__socket.accept()
while True:
try:
message_recv = conn.recv(self.__buffer).decode('utf-8')
message_resp = self.respond(message_recv)
conn.send(message_resp.encode('utf-8'))
except ConnectionResetError:
break
except BrokenPipeError:
break
self.close()
def respond(self.message:str) -> str:
return ""
import socket
class BaseClient:
def __init__(self, timeout:int=10, buffer:int=1024)
self.__socket = None
self.__address = None
self.__timeout = timeout
self.__buffer = buffer
def connect(self, address, family:int, typ:int, proto:int):
self.__address = address
self.__socket = socket.socket(family, typ, proto)
self.__socket.settimeout(self.__timeout)
self.__socket.connect(self.__address)
def send(self, message:str="") -> None:
flag = False
while True:
if message == "":
message_send = input("> ")
else:
message_send=messsage
flag = True
self.__socket.send(message_send.encode('utf-8'))
message_recv = self.__socket.recv(self.__buffer).decode('utf-8')
self.received(message_recv)
if flag:
break
try:
self.__socket.shutdown(socket.SHUT_RDWR)
self.__socket.close()
except:
pass
def received(self, message:str):
print(message)
BASE58_ALPHABET = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz' print(BASE58_ALPHABET[-4:]) print(BASE58_ALPHABET[:-4])
$ python3 test.py
wxyz
123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuv
テストコードを実行してみれば、そのまんまだけど、一見[-4:]と[:-4]がプログラム上で並ぶと困惑しますね。