【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";

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 < ・・・ なるほど、用途で選ぶのね。

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で作り直す必要がある。

うーん、前途多難だな

[Docker] Redmineのコンテナを作成してみよう

### 作成手順
ネットワークを作る -> MySQLコンテナを作る -> Redmineコンテナを作る -> 確認 -> 後始末
※WordPressとほぼ同じ構成だがオプションの名前が異なる

$ sudo docker network create redmine000net2
$ sudo docker run –name mysql000ex13 -dit –net=redmine000net2 -e MYSQL_ROOT_PASSWORD=myrootpass -e MYSQL_DATABASE=redmine000db -e MYSQL_USER=redmine000kun -e MYSQL_PASSWORD=rkunpass mysql –character-set-server=utf8mb4 –collation-server=utf8mb4_unicode_ci –default-authentication-plugin=mysql_native_password
$ sudo docker run -dit –name redmine000ex14 –network redmine000net2 -p 8086:3000 -e REDMINE_DB_MYSQL=mysql000ex13 -e REDMINE_DB_DATABASE=redmine000db -e REDMINE_DB_USERNAME=redmine000kun -e REDMINE_DB_PASSWORD=rkunpass redmine

うおおおおおお
何これ?