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('送信'), ) ) ] ) ); } }
Category: uncategorized
【flutter】グラフィック描画のイベント処理
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; }
sha256とsha512
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(Message Authentication Code)
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
楕円曲線暗号(elliptic curve cryptography)
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’
PHPの論理和、論理積、排他的論理和
論理積 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";
【python3】タイムアウト設定2
$ pip install timeout-decorator
タイムアウトの時間が来たら突然終わららせるのではなく、処理中のものを保存してから終了
RDS インスタンスタイプの決め方
db.r5.large などの表記で記載されているが、「r5」の部分がインスタンスタイプ、「large」がインスタンスサイズ
インスタンスタイプは、r系、m系、t系などがある。rdsもt系とm系が汎用で、t系はバースト可能クラス
### r系
・メモリ内の大きいデータセットを処理するワークロードに対して高速なパフォーマンスを実現するように設計されているメモリ最適化インスタンスに属するr系
・r6g.largeのような世代の数字の後ろにgのような文字がついているタイプは追加機能(gならばAWS Gravitonプロセッサ(最良のコストパフォーマンスを提供))
・small < medium < large < xlarge < 2xlarge < 4xlarge < ・・・
なるほど、用途で選ぶのね。
Amazon Linux2でNTPを入れる
$ pgrep -a chrony
1951 /usr/sbin/chronyd
$ chronyc sources -v
インストール不要で、デフォルトでchronydが起動しているのね
SSL Library Error: error:140AB18F:SSL routines:SSL_CTX_use_certificate:ee key too small AH00016: Configuration Failed
$ sudo less /var/log/httpd/error_log
SSL Library Error: error:140AB18F:SSL routines:SSL_CTX_use_certificate:ee key too small AH00016: Configuration Failed
キーが短すぎるの意味がそのままで、今は1024bitだと短いと判断されるらしい。
2048で作り直す必要がある。
うーん、前途多難だな