s = ‘1234’
print(s.zfill(10))
$ python3 test.py
0000001234
ソフトウェアエンジニアの技術ブログ:Software engineer tech blog
随机应变 ABCD: Always Be Coding and … : хороший
s = ‘1234’
print(s.zfill(10))
$ python3 test.py
0000001234
ecc.py
class FieldElement:
def __init__(self, num, prime):
if num >= prime or num < 0:
error = 'Num {} not in field range 0 to {}'.format(num, prime - 1)
raise ValueError(error)
self.num = num
self.prime = prime
def __repr__(self):
return 'FieldElement_{}({})'.format(self.prime, self.num)
def __eq__(self, other):
if other is None:
return False
return self.num == other.num and self.prime == other.prime
main.py
from ecc import FieldElement a = FieldElement(7, 13) b = FieldElement(6, 13) print(a==b) print(a==a)
__eq__メソッド は等価の条件を定める
class Person:
def __init__(self, firstname, lastname, email):
self.firstname = firstname
self.lastname = lastname
self.email = email
def __eq__(self, other):
if other is None or not isinstance(other, Person): return False
return self.firstname == other.firstname and \
self.lastname == other.lastname and \
self.email == other.email
def __ne__(self, other):
return not self.__eq__(other)
mike = Person('Mike', 'Peter', 'mike@gmail.com')
peter = Person('Mike', 'Peter', 'mike@gmail.com')
print(mike)
print(peter)
print(mike == peter)
eqの他にも、lt, ne, le, gt, geなどがある。
class Item(object):
def __init__(self, price):
self.price = price
def __eq__(self, other):
if not isinstance(other, Item):
return NotImplemented
return self.price == other.price
def __lt__(self, other):
if not isinstance(other, Item):
return NotImplemented
return self.price < other.price
def __ne__(self, other):
return not self.__eq__(other)
def __le__(self, other):
return self.__lt__(other) or self.__eq__(other)
def __gt__(self, other):
return not self.__le__(other)
def __ge__(self, other):
return not self.__lt__(other)
class MyCustomFormState extends State<MyCustomForm>{
final _formKey = GlobalKey<FormState>();
final textValidator = MultiValidator([
RequiredValidator(errorText: '入力必須の項目です。'),
MinLengthValidator(8, errorText: '8文字以上で入力してください。'),
]);
@override
Widget build(BuildContext context){
return Form(
key: _formKey,
child: Column(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
TextFormField(
validator: textValidator,
),
Padding(
padding: const EdgeInsets.symmetric(vertical: 16.0),
child: ElevatedButton(
onPressed:() {
if(_formKey.currentState!.validate()){
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text('送信完了')),
);
}
},
child: const Text('送信'),
)
)
]
)
);
}
}
class _MyHomePageState extends State<MyHomePage>{
static List<Offset> _points = [];
@override
void initState(){
super.initState();
}
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Color.fromARGB(255, 255,255,255),
appBar: AppBar(
title: Text('App Name', style: TextStyle(fontSize: 30.0),),
),
body: Center(
child: Listener(
onPointerDown: _addPoint,
child: CustomPaint(
painter: MyPainter(_points),
child: Center(),
),
),
)
);
}
void _addPoint(PointerDownEvent event) {
setState((){
_points.add(event.localPosition);
});
}
}
class MyPainter extends CustomPainter {
final List<Offset> _points;
MyPainter(this._points);
@override
void paint(Canvas canvas, Size size){
Paint p = Paint();
p.style = PaintingStyle.fill;
p.color = Color.fromARGB(100, 0, 200, 100);
for(var pos in _points) {
Rect r = Rect.fromLTWH(pos.dx - 25, pos.dy - 25, 50.0, 50.0);
canvas.drawOval(r, p);
}
}
@override
bool shouldRepaint(CustomPainter oldDelegate) => true;
}
UIウィジェットで操作
class _MyHomePageState extends State<MyHomePage>{
static double _value = 0;
static double _opaq = 0;
@override
void initState(){
super.initState();
}
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Color.fromARGB(255, 255,255,255),
appBar: AppBar(
title: Text('App Name', style: TextStyle(fontSize: 30.0),),
),
body: Column(
children: [
Padding(padding: EdgeInsets.all(10)),
Container(
width: 300,
height: 300,
child: CustomPaint(
painter: MyPainter(_value, _opaq.toInt()),
child: Center(),
),
),
Slider(
min: 0.0,
max: 300.0,
value:_value,
onChanged: _changeVal,
),
Slider(
min:0.0,
max:255.0,
value:_opaq,
onChanged: _changeOpaq,
),
],
),
);
}
void _changeVal(double value) {
setState((){
_value = value;
});
}
void _changeOpaq(double value) {
setState((){
_opaq = value;
});
}
}
class MyPainter extends CustomPainter {
final double _value;
final int _opaq;
MyPainter(this._value, this._opaq);
@override
void paint(Canvas canvas, Size size){
Paint p = Paint();
p.style = PaintingStyle.fill;
p.color = Color.fromARGB(_opaq, 0, 200, 100);
Rect r = Rect.fromLTWH(
(size.width - _value) / 2,
(size.height - _value) / 2,
_value, _value);
canvas.drawOval(r, p);
r = Rect.fromLTWH(0, 0, size.width, size.height);
p.style = PaintingStyle.stroke;
p.color = Color.fromARGB(255, 100, 100, 100);
canvas.drawRect(r, p);
}
@override
bool shouldRepaint(CustomPainter oldDelegate) => true;
}
ValueNotifierによる更新
class _MyHomePageState extends State<MyHomePage>{
static ValueNotifier<int> _value = ValueNotifier<int>(0);
@override
void initState(){
super.initState();
}
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Color.fromARGB(255, 255,255,255),
appBar: AppBar(
title: Text('App Name', style: TextStyle(fontSize: 30.0),),
),
body: Center(
child:Column(
children: [
Padding(padding: EdgeInsets.all(10)),
Container(
width: 300,
height: 300,
child: CustomPaint(
painter: MyPainter(_value),
child: Center(),
),
),
Padding(padding: EdgeInsets.all(5)),
ElevatedButton(
child: Text("Click",
style: TextStyle(fontSize: 32),),
onPressed: ()=> _value.value++,
),
],
),
),
);
}
}
class MyPainter extends CustomPainter {
final ValueNotifier<int> _value;
MyPainter(this._value);
@override
void paint(Canvas canvas, Size size){
Paint p = Paint();
p.style = PaintingStyle.fill;
p.color = Color.fromARGB(50, 0, 255, 255);
Rect r;
for (var i = 0 ; i < _value.value; i++){
r = Rect.fromLTWH(10+i*20, 10+i*20, 100, 100);
canvas.drawRect(r, p);
}
r = Rect.fromLTWH(0, 0, size.width, size.height);
p.style = PaintingStyle.stroke;
p.color = Color.fromARGB(255, 100, 100, 100);
canvas.drawRect(r, p);
if (_value.value > 10) _value.value = 0;
}
@override
bool shouldRepaint(CustomPainter oldDelegate) => true;
}
SHA–256は入力値ごとに固有のハッシュ値を生成することにより、データの完全性などをチェックするために用いられる
$original_string = "パスワード";
$hashed_string = hash('sha256', $original_string);
print_r($hashed_string);
$ php index.php
d8b076148c939d9d2d6eb60458969c486794a4c0fcf0632be58fa5bf6d15aafa
$original_string = "パスワード";
$hashed_string = hash('sha512', $original_string);
print_r($hashed_string);
e2f8de62a90c1e3039cba62afb7646401ca5fbd97ec4ef3fbada4752aeafd022cfa7eafda320d08b2df6a0a6e55f0d62b5967081792095d7eaafc58d00533283
512にすると倍になってますね。
MACはデータの完全性を保証するための仕組み
1.初期化:事前に秘密鍵sを決めて共有しておく
2.MAC生成: データmと秘密鍵sからMAC生成関数を使ってMAC値tと呼ばれる値を作り、データmと一緒にMAC値tをボブに送る
3.検証: 共有しておいた秘密鍵sと受け取ったデータmからMAC生成関数を使ってMAC値tを計算する
L MAC値tが一致していればデータmを正常に受信できたとして受理(accept)、そうでなければ不正としてreject
ECDHP:(P, aP, bP)が与えられた時にabPを求めよ
楕円離散対数問題(ECDLP): P, Aが与えられた時にA=aPとなるaを求めよ
ECDHPやECDLPが難しいとされている
楕円曲線を用いたDH鍵共有がECDH鍵共有
### 中間者攻撃
アリスとボブの間に入って、秘密鍵s, 公開鍵Sのうち、公開鍵Sを書き換える
Dec(s, c) = m
Enc(B, m) = c’
論理積 and
論理和 or
排他的論理和 xor
否定 !
論理積 &&
論理和 ||
if(TRUE and TRUE) echo "結果はTRUEです。<br>\n"; else echo "結果はFALSEです。<br>\n"; $a = 1; $b = 2; if(($a === 1) and ($b === 2)) echo "結果はTRUEです。<br>\n"; else echo "結果はFALSEです。<br>\n"; if(TRUE and FALSE) echo "結果はTRUEです。<br>\n"; else echo "結果はFALSEです。<br>\n"; $a = 1; $b = 2; if(($a === 1) and ($b === -2)) echo "結果はTRUEです。<br>\n"; else echo "結果はFALSEです。<br>\n"; if(TRUE or FALSE) echo "結果はTRUEです。<br>\n"; else echo "結果はFALSEです。<br>\n"; $a = 1; $b = 2; if(($a === 1) or ($b === -2)) echo "結果はTRUEです。<br>\n"; else echo "結果はFALSEです。<br>\n"; // 片方TRUEで両方TRUEではない if(TRUE xor FALSE) echo "結果はTRUEです。<br>\n"; else echo "結果はFALSEです。<br>\n"; $a = 1; $b = 2; if(($a + $b === 3) xor ($b - $a === -1)) echo "結果はTRUEです。<br>\n"; else echo "結果はFALSEです。<br>\n"; // 否定 if(!FALSE) echo "結果はTRUEです。<br>\n"; else echo "結果はFALSEです。<br>\n"; $a = 1; $b = 2; if(!($a + $b === -3)) echo "結果はTRUEです。<br>\n"; else echo "結果はFALSEです。<br>\n";
$ pip install timeout-decorator
タイムアウトの時間が来たら突然終わららせるのではなく、処理中のものを保存してから終了