OmniAICreator/Qiita-1.07M huggingface dataset:
学習メモ / アセンブラ言語　CASLⅡ


##CASLⅡ
CASLⅡは基本情報技術者試験向けに開発されたアセンブラ言語。
今回はCASLⅡについての内容をまとめます。

前回、[学習メモ / アセンブラ言語の基礎](https://qiita.com/kota_sho/items/2263866e4199cde081e2)

参考文献：
[プログラミング入門 CASL2―情報処理技術者テキスト](https://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E5%85%A5%E9%96%80-CASL2%E2%80%95%E6%83%85%E5%A0%B1%E5%87%A6%E7%90%86%E6%8A%80%E8%A1%93%E8%80%85%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88-%E6%B5%85%E4%BA%95-%E5%AE%97%E6%B5%B7/dp/4407305398)

その他各種サイト

 


####命令
r:レジスタ
adr:値アドレス

例：
LAD 　r, adr, x
rにadr+x番地の値を格納する。
 
|  命令コード　| オペランド　|命令|説明　| 英語　|  
|----|---|---|---|---|
|  NOP   |  |   | no operation | 
|  LD    |  r, adr, x  | |  r  ← adr|  load | 
|  ST    |  r, adr, x |   |adr ← r| store  | 
|  LAD   |  r, adr, x    | |r  ← adr| load address  | 
|  LD 　 |  r1, r2  |   |r1  ← r2 | load  | 
|  ADDA 　| r, adr, x | 算術加算 |r ← r + 実行アドレス| add arithmetic | 
|  SUBA  　| r, adr, x   | 算術減算 |r ← r - 実行アドレス | subtract arithmetic  | 
|  ADDL 　|  r, adr, x  | 論理加算 |r ← r + 実行アドレス  | add logical  | 
|  SUBL  　| r, adr, x   |  論理減算 |r ← r - 実行アドレス |  subtract logical | 
|  ADDA 　|  r1, r2  |    |r ← r1 + r2 | add logical  | 
|  SUBA  　| r1, r2   |  |r ← r1 - r2  |  subtract logical  | 
|  ADDL 　|  r1, r2  |    |r ← r1 + r2 |  add logical   | 
|  SUBL  　|  r1, r2  |  |r ← r1 - r2  |  subtract logical  | 
|  AND  　| r, adr, x   |  論理積  |r ← r AND 実行アドレス| and  | 
|  OR  　|  r, adr, x  |  論理和  |r1 ←  r1 OR r2|  or | 
|  XOR  　|  r, adr, x  |  排他的論理和  |r ← r XOR 実行アドレス| exclusive or  | 
|  AND  　|  r1, r2   |     |r ← r1 AND r2  | and  | 
|  OR  　|  r1, r2   |     |r1  ← r1 OR r2  | or  | 
|  XOR  　|  r1, r2   |     |r1  ← r1 XOR r2 | exclusive or  | 
|  CPA  　|   r, adr, x  |  算術比較  |下記フラグレジスタを参照 | compare arithmetic  | 
|  CPL  　|   r, adr, x  |  論理比較  |下記フラグレジスタを参照 |  compare logical | 
|  CPA  　|  r1, r2   |     |下記フラグレジスタを参照 | compare arithmetic  | 
|  CPL  　|  r1, r2   |     |下記フラグレジスタを参照  |  compare logical | 
|  SLA  　| r, adr, x    |  算術左シフト  |adrで指定した分だけ左シフト|  shift left arithmetic | 
|  SRA  　| r, adr, x  | 算術右シフト  |adrで指定した分だけ右シフト | shift right arithmetic  | 
|  SLL  　| r, adr, x    | 論理左シフト  |adrで指定した分だけ左シフト | shift left logical  | 
|  SRL  　| r, adr, x    |  論理右シフト |adrで指定した分だけ右シフト | shift right logical  | 
|  JMI  　| adr, x   |   |マイナスの場合分岐 |  jump on minus   | 
|  JNZ  　| adr, x   |   |ゼロでない場合分岐 | jump on non zero  | 
|  JZE  　| adr, x   |   |ゼロの場合分岐 | jump on zero  | 
|  JUMP  　| adr, x   |  |無条件で分岐 | unconditional jump  | 
|  JPL  　| adr, x   |  |プラスの場合分岐 |  jump on plus | 
|  JOV  　| adr, x   |  |オーバーフローの場合分岐 |  jump on overflow | 
|  PUSH  　| adr, x   |  |スタックに実行アドレスを積む| push  | 
|  POP  　| r   |    |スタックの値を取り出す| pop  | 
|  CALL  　| adr, x   |  | | call subroutine  | 
|  RET  　|    |    | | return from subroutine  | 



##フラグレジスタ（FR）
FRの値は、命令の演算結果の値に応じて設定される。
以下３種類ある。

####オーバーフローフラグ（OF)
オーバーフローが発生すると１が設定される。

####サインフラグ（SF）
演算結果の符号ビットの値が設定される。
正の値：０
負の値：１

####ゼロフラグ（ZF)
演算結果がゼロの場合１が設定される。

####比較演算の結果

|  　| SF　|ZF　|
|----|---|---|
|  r1 > r2    | 0 | 0  | 
|  r1 = r2    | 0  | 1　| 
|  r1 < r2    |  1 | 0|
pyclustering.xmeansでKeyErrorが出る

# コード

```python
from pyclustering.cluster.xmeans import (
    xmeans, kmeans_plusplus_initializer
)
from pyclustering.utils import draw_clusters


initial_centers = kmeans_plusplus_initializer(df, 2).initialize()

instances = xmeans(df, initial_centers, ccore=True)
instances.process()
```

# エラー
```
KeyError: 0

During handling of the above exception, another exception occurred:

KeyError  Traceback (most recent call last)
<ipython-input-117-8ff3c8958745> in <module>
      6 
      7 instances = xmeans(X_trans_facility, initial_centers, ccore=True)
----> 8 instances.process()
      9 
     10 clusters = instances.get_clusters()
```

# 解決

`pd.DataFrame`ではなく`list`や`np.ndarray`を使う。

```python

X = df.values

initial_centers = kmeans_plusplus_initializer(X, 2).initialize()

instances = xmeans(X, initial_centers, ccore=True)
instances.process()
```

# 参考

https://stackoverflow.com/questions/58135808/how-to-fix-an-error-when-trying-to-cluster-2-rows-in-a-csv-file

## バージョン

```
Python==3.7.4
pyclustering==0.9.3.1
pandas==1.0.2
```
Perl AtCoderでベンチマーク

# はじめに
*[Perl で学ぶ逆元の３ ABC 151 E が解けた！](https://qiita.com/superrino130/items/2f8a1b5769f7d0cbe3a7)* にて **BigInt** が遅いことが分かりました。
そこで、色々とベンチマークを取ってみました。
# AtCoder
お世話になっています *[AtCoder：競技プログラミングコンテストを開催する国内最大のサイト](https://atcoder.jp/home)* 

|現テスト環境|新テスト環境(予定)|
|:--:|:--:|
|Perl(v5.18.2)|Perl(v5.26.1)|
# ループ比較
```loop.pl
use strict;
use warnings;
use Benchmark qw(:all);

my $result = timethese(100, {
  loop1 => sub {
    my $a;
    for (my $i=0; $i<1e5; $i++) {
      $a++;
    }
  },
  loop2 => sub {
    my $a;
    for my $i (1..1e5) {
      $a++;
    }
  },
  loop3 => sub {
    my $i = 0;
    my $a;
    while ($i < 1e5) {
      $a++;
      $i++;
    }
  },
  loop4 => sub {
    my $i = 0;
    my $a;
    while (1) {
      $a++;
      $i++;
      last unless $i < 1e5;
    }
  },
});

cmpthese $result;
```
```Perl(v5.18.2)
       Rate loop3 loop1 loop4 loop2
loop3 152/s    --  -12%  -14%  -45%
loop1 172/s   14%    --   -2%  -38%
loop4 175/s   16%    2%    --  -37%
loop2 278/s   83%   61%   58%    --
```
```Perl(v5.26.1)
       Rate loop4 loop3 loop1 loop2
loop4 278/s    --   -6%  -22%  -44%
loop3 294/s    6%    --  -18%  -41%
loop1 357/s   29%   21%    --  -29%
loop2 500/s   80%   70%   40%    --
```
loop2: **for my $i (1..1e5)**が一番速い結果となりました。
whileループは遅い傾向となりました。
また、AtCoderの新テスト環境(予定)は現テスト環境に比べ2倍程速くなっています。
# 問題のBigInt
```bigint.pl
use strict;
use warnings;
use Benchmark qw(:all);
use Math::BigInt;

my $result = timethese(10, {
  loop5 => sub {
    my $a = Math::BigInt->new(0);
    for my $i (1..1e5) {
      $a++;
    }
  },
  loop6 => sub {
    my $a = Math::BigInt->new(0);
    for my $i (1..1e5) {
      $a = $a->binc();
    }
  },
  loop2 => sub {
    my $a;
    for my $i (1..1e5) {
      $a++;
    }
  },
});

cmpthese $result;
```
テスト回数10、あっ察し

```Perl(v5.18.2)
        Rate  loop5  loop6  loop2
loop5 1.99/s     --   -12%   -99%
loop6 2.27/s    14%     --   -99%
loop2  333/s 16667% 14600%     --
```
```Perl(v5.26.1)
        Rate loop5 loop6 loop2
loop5 5.05/s    --   -4%  -99%
loop6 5.24/s    4%    --  -99%
loop2  500/s 9800% 9450%    --
```
**BigInt** を使用すると**100倍遅い**結果となりました。
また、AtCoderの新テスト環境(予定)は現テスト環境に比べ2倍程速くなっています。

# まとめ
+ **AtCoder** さんありがとう
+ 新テスト環境(予定)に期待
+ **BigInt** は100倍遅い
+ **for** ループ推奨

参照したサイト
[Benchmark - ベンチマーク(性能比較)を行う](https://tutorial.perlzemi.com/blog/20100509127696.html)
[Math::BigInt](https://perldoc.perl.org/Math/BigInt.html)
オブジェクト指向の本質の一つである抽象クラスやinterfaceの意味を知らずに、オブジェクト指向を使っている人が多すぎる。

##結論
結論から言うと抽象クラスの一番の目的＝本質は、文字通り**抽象化**です。

確かに、多重継承できるとか・・できないとか、インスタンス化できるとか・・できないとか、その特徴を列挙する記事を多く見かけますが、それはすべて表面上のことで、本当の目的＝本質を表してはいません。

では、抽象化とは何か、なぜこのようなクラスが必要なのかを考察します。

##抽象化とは
現実世界は非常に複雑な要素が絡み合ったカオスな世界です。
その世界をコンピュータの世界へ投影することをモデル化といいますが、カオスのままでは投影できません。
そこで、不要な要素を取り除いて、必要な要素だけに光を当てることで理解しやすくする・・・
この行為こそ、まさに抽象化の意味そのものになります。
抽象化することで、その世界の**本質**や非効率な部分、不足している箇所＝改善が必要な個所が見えてきます。

また、抽象化することで、目的の異なった複数の視点で実世界を切り取ることができるので、設計者と実装者のように目的に合った視点で物事を分離できます。

##分業
また、抽象化にもレベルがあり、物理モデル的な**オブジェクト図**と、それをさらに抽象化した論理モデル的な**クラス図**のように相対的に具体的なレベルのものと抽象的なレベルがあります。

システム開発では業務要件のような実世界に近いカオスな世界とコンピュータの秩序ある世界をなるべく隔離することが求められます。
プログラムソース全体にカオスな業務ルールがちりばめられると、変化が激しい業務ルールに翻弄されてシステムが破綻してしまいます。

そこで、業務レベルの要件を抽象クラスで受け持ち、コンピュータの実装部分をインプリメント（実装）クラスで分離します。
このことで、業務のモデル化と実装工程を分業できることも意味します。

##部品化
また、複雑な部分を分離することで、実装クラスをシンプルにでき、部品化しやすくなります。
部品化が進めば、業務が変わっても部品の入れ替えだけで済むため、開発効率が向上します。

interface以外の多重継承を制限しているのも、実装部分が複雑になることを防ぎ、部品化しやすくするためのものです。

ただし、オブジェクト指向での抽象化はinterfaceやクラス、継承など様々な場面で利用できますが、使い方によっては一番重要な部品化と分業を妨げる副作用も持っています。
そのような状況が蔓延してきたため、後付けで、多重継承の制限を設けたのではないかと推測できます。

このように、オブジェクト指向の本来の目的である、分業と部品化をこの抽象クラスでも一役買っていることこそ、その本質にほかなりません。

##最後に
その意味をしっかり心して、単に多重継承できるとか・・できないとか、インスタンス化できるとか・・できないとか、表面的なことにとらわれて副作用を招かないよう、分業と部品化のためにどう使うべきかを本質的に考えて使ってほしいと考えます。
結城浩『Java言語で学ぶデザインパターン入門』（SB Creative)読んでみた

こんにちは、ふぎとです。

今回は結城浩さんの本で、デザインパターンを学んでみ
ました。

##「デザインパターン」とは

この本を手に取ったきっかけは、情報系の友人からの薦
めがあったからでした。「実務で絶対に役に立つから」
という太鼓判を鵜呑みに、おっかなびっくり手にとった
次第です。


まず浮かんだのは、「デザインパターンってなに？」と
いうこと。これは本書冒頭に説明がありました。

 "プログラミングを行っていると、以前と同じことを繰
　り返しているなあ、と気づくときがあります。経験が
　増すにつれ、そのような「パターン」(….)を次の開発
　に当てはめていくことができるようになります。　
　Erich Gamma, Richard Helm, Ralph Johnson, John
　Vlissidesの４人が、そのような開発者の「経験」や
　「内的な蓄積」としてのパターンを
　
　「デザインパターン」

　という形に整理しました。”（「はじめに」より）

要するに、デザインパターンとは「先人の知恵」のよう
なもの。また、開発者同士の「共通言語」のようなもの、
だということです。因みに、考案した４人はthe Gang of
Four(GoF)と呼ばれているらしいです。つよそう。

##本書の章立て

本書はそのGoFが定めた23個のデザインパターンをひとつ
ずつ、Javaプログラムで実例を示しながら紹介していま
す。章立ては以下の通り。

　1． Iterator 1つ1つ数え上げる
　2． Adapter 一皮かぶせて再利用
　3． Template Method 具体的な処理をサブクラスにまかせる
　4． Factory Method インスタンス生成をサブクラスにまかせる
　5． Singleton たった１つのインスタンス
　6． Prototype コピーしてインスタンスを作る
　7． Builder　複雑なインスタンスを組み立てる
　8． Abstract Factory　関連する部品を組み合わせて製品を作る
　9． Bridge　機能の階層と実装の階層を分ける
　10．Strategy　アルゴリズムをごっそり切り替える
　11．Composite　容器と中身の同一視
　12．Decorator　飾り枠と中身の同一視
　13．Visitor　構造を渡り歩きながら仕事をする
　14．Chain of Responsibility　責任のたらい回し
　15．Facade　シンプルな窓口
　16．Mediator　相手は相談役１人だけ
　17．Observer　状態の変化を通知する
　18．Memento　状態を保存する
　19．State　状態をクラスとして表現する
　20．Flyweight　同じものを共有して無駄をなくす
　21．Proxy　必要になってから作る
　22．Command　命令をクラスにする
　23．Interpreter　文法規則をクラスで表現する

##自分が取り組んだこと

・サンプルとして掲載されたプログラムを自分で書き写
　し、実行した
　→→23のデザインパターンそれぞれについて、期待通り
　　に動かすことができた
・どのクラスがどんな役割をになっているのか、解説を
　読んで理解に努めた

##今後やりたいこと

・やり残した、章末の練習問題を解き切る
・Javaのプログラムが動く仕組みについて勉強する

##最後にひとこと

もし僕の記事に対しての補足や、「今後やりたいこと」
に対するオススメ本などありましたら、ぜひコメントで
いただけると嬉しいです！
…
では今日はこの辺で。ふぎとでした。
文字のバイト数を数える試み ｜Power Query

2020/6/14追記：別記事にて6行で書けましたので、そちらを見てください。:sweat_smile:
[文字のバイト数を数える試み～その2 ｜Power Query](https://qiita.com/tanuki_phoenix/items/f307329be24a496764f3)



Power QueryじゃExcelのLENB関数みたいなことはできないのかな、と思い調べた結果です。
日本語だけに限っても例外はありそうですので、不具合は現場で対処してください。僕もそういう気持ちで使います。:sweat:
Excelならワークシート関数のLENBを使えるので、その方が確実でしょう。

##コード
今回は挙動の確認を重視したため、関数化せずに示しました。
使えそうなら、関数化でも何でもしてください。

```pq:q_表示バイト数計算
//デバッグのため、引数宣言をコメントアウト
//(TargetTexts as text)=>
let
    //↓デバッグ用。確認できたら、コメントアウトして関数にすればいい。
    TargetTexts ="漢字ｶﾝｼﾞかんじ",

    //1字ずつばらしたテーブルにする。
    SplittedText = Table.FromValue( Text.ToList( TargetTexts ) ),

    //便宜的にリストにすることでJSONのbinaryに変換でき、バイト数を数えることができる。
    AddJsonColumn　 =Table.AddColumn(SplittedText,"JSON",each Json.FromValue( {[Value]} )),
    //JSON既定の両端の括弧とダブルクウォートの計4字を除くため、4を引く。
    半角英数判定 =Table.AddColumn(AddJsonColumn,"半角英数判定",each 1=Binary.Length( [JSON] )-4,type logical),

    //判定用に半角カタカナのリストを得る。
    半角カタカナ群 = List.Transform({65381..65439},Character.FromNumber ),

    半角カタカナ判定 =Table.AddColumn(半角英数判定,"半角カタカナ判定",each List.Contains(半角カタカナ群,[Value]),type logical ), 
    表示幅計算    = Table.AddColumn(半角カタカナ判定, "表示幅",each
                         if List.AnyTrue({[半角英数判定],[半角カタカナ判定]}) then 1
                         else 2
                        ,Int64.Type
                   )
in
    表示幅計算

```
##結果
あとは表示幅のところを集計してやれば、バイト数になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370992/921f81e9-a7c0-4440-af69-c43850432819.png)



##補足
JSONのbinaryデータがどうなっているのか、ということについての参考。
半角英数以外は1桁にならず、6桁のコードで表示されるようです。（その意味は知らないです:expressionless:）

```pq:おためしコード
let
    Source = "abcde01234あいうえお",
    Custom1 = Json.FromValue( {Source} ),
    Custom2 = Text.FromBinary( Custom1 )
in
    Custom2

```
上記のコードを入れるとこんな感じになる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370992/56d6dfd8-3d09-bd0a-84b6-2d1f0aaaf2ba.png)


##参考
UTF8のサイトを示しておられて、助かりました。
http://orange-factory.com/dnf/utf-8.html

UTF8の文字コード（英語）
https://unicode.org/charts/PDF/UFF00.pdf
デプロイツール比較

## 総評
とにかく手軽に使う
→ bash

手軽に使う、ファイル操作やデバイスの接続確認などちょっと汎用的な処理も入る
→ Fabric

ガッチガチに環境を固める、パッケージや環境のセットアップがメイン
→ Ansible,caspitrano

あたりなのかな、という印象。

## デプロイツールの比較表
|評価項目|bash|capistrano/<br>puppet/<br>chef|fabric(python2)|fabric(python3)|Salt|
|---|---|---|---|----|---|
|記述の簡潔さ|煩雑|簡潔|簡潔(Python)|簡潔(Python)|?|
|エラー処理|弱い|できる|できる|できる|-|
|冪等性|弱い|できる|できる※|弱い|-|
|デプロイ対象での準備|不要|?|不要|不要|-|
|枯れ具合|ほぼノーメンテ|ものによる|ほぼノーメンテ|ほぼノーメンテ|-|
|得意分野|ファイル操作|パッケージなどの管理?|ファイル操作<br>汎用的な操作|ファイル操作<br>汎用的な操作|-|

※ Fabric1.xでは可能。Fabric2.xではcuisineが対応しないため不可。

Githubのスター数では、
Ansible, Cspitrano, Fabricに関してはほぼ同じ10k強。
Chefは6kほど。


## Fabricについて
Fabrci1.x とFabric2.xの間で破壊的なAPIの変更が行われている。

Python3への対応が遅れており、Python3の公式FabricでCuisineを利用する術がない。
Python2のサポート期限が来月の2020年4月まで迫っており、今からPython2を利用するはちょっと苦しい。

||python2対応|python3対応|cuisine対応|
|---|---|---|---|
|Fabric1.x|○|×|○|
|Fabric2.x|○|×|×|
|Fabric3<br>(非公式フォーク)|○|○|○|

Fabricが知名度の割に開発安定してなさそうで残念だったけど、OSSはこんなもんなのかな・・・。


#### 参考
https://www.slideshare.net/greenasparagus/ss-42424543
https://qiita.com/acro5piano/items/19a5f4c0ae729aae756b
Brewfileを使う

Brewfileを使うと、アプリのインストールがすごく楽になります。
超簡単で超便利なので超おすすめです。

欲しいアプリをファイルに定義して、コマンドを叩くだけでインストールされます。

- gitなどコマンドラインで使うツール
- GoogleChromeなどインストーラーを使っていれるアプリ
- LINEなどAppStore経由でいれるアプリ

全てコマンド1つで揃います。

##導入
Homebrewが入っていれば使えます。入っていない場合には以下のコマンドでインストール

```terminal
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

##使い方
Brewfileを作って

```rb:Brewfile
cask_args appdir: "/Applications"
brew 'git'
tap 'heroku/brew'
brew 'heroku'
brew 'jpegoptim'
brew 'mackup'
brew 'mas'
brew 'pngquant'
brew 'rmtrash'

cask 'adobe-creative-cloud'
cask 'alfred'
cask 'biscuit'
cask 'docker'
cask 'tableplus'
cask 'transmit'
cask 'visual-studio-code'

# cask 'dropbox'
# cask 'google-chrome'
# cask 'karabiner-elements'

mas 'Kindle', id: 405399194
mas 'LINE', id: 539883307
mas 'Magnet', id: 441258766
mas 'Quick Stopwatch', id: 976930151
mas 'Todoist', id: 585829637
# mas 'Bitwarden', id: 1352778147
```

コマンドを叩くだけ！

```terminal
$ brew bundle
```

##Brewfileの書き方
- 冒頭に`cask_args appdir: "/Applications"`と書いて、GoogleChromeなどインストーラーを使っていれる系のアプリの保存場所を指定します。
- gitなどコマンドラインで使う系のツールは`brew '<ツール名>'`と書きます。
- GoogleChromeなどインストーラーを使う系のアプリは`cask '<アプリ名>'`と書きます。
- ツール名は`brew search <hogehoge>`で検索
- `brew search`で見つからなくても、tapすることで使えたりします。
    - サンプルのherokuの部分を参照。herokuはそもそも`brew install`でいれるときにもtapが必要
    - [brew tapとは](https://qiita.com/saa/items/85ed5e914d424fbf9fd6)
- LINEなどAppStore経由でインストールするアプリは`mas '<アプリ名'>, id: <id>`と書きます。
- アプリ名とIDは`mas search <アプリ名>`
- AppStore経由のアプリをインストールするには`brew 'mas'`を記述する必要がある。
    - サンプルを参照
doctest

```py
class Cal(object):
    def add_num_and_double(self, x, y):
        """Add and double

        >>> c = Cal()
        >>> c.add_num_and_double(1,1)
        4

        >>> c.add_num_and_double('1', '1')
        Traceback (most recent call last):
        ...
        ValueError
        """

        if type(x) is not int or type(y) is not int:
            raise ValueError
        result = x + y
        result *= 2
        return result


if __name__ == '__main__':
    import doctest
    doctest.testmod()
```
Flutterで画面遷移を実装する

実装するごとに追加していきます

## ルーティングで遷移する

```dart
class App extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      initialRoute: "/",
      routes: {
        "/": (context) => BasePage(),
        "/login": (context) => LoginPage(),
      },
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
    );
  }
}
```

```dart
class BasePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return RaisedButton(child: Text("Show Login"), onPressed: () async {
//      await Navigator.pushReplacementNamed(context, "/login");
      await Navigator.pushNamed(context, "/login");
// pop時の処理
      print("logined!");
    },);
  }

}
```
設定ファイルをmackupで管理する

`VS Code`の設定、`.vimrc`、`.zshrc`など、多くの設定ファイルを簡単に管理することができるアプリ`mackup`を使ってみました。

##導入
```terminal
$ brew install mackup
```
##基本
###バックアップ
```terminal
$ mackup backup
```
コマンド一発で、各種アプリの設定ファイルが`~/Dropbox`以下に保存されます。
そんで元々設定ファイルがあった場所には、シンボリックリンクが貼られます。

###リストア
```terminal
$ mackup restore
```

###対応ツールの確認
```terminal
$ mackup list
```

##応用
###設定ファイルの保存場所、管理対象アプリを指定
`~/.mackup.cfg`を作成して、設定ファイルの保存場所、作成するディレクトリ名、管理対象にいれるアプリ、管理対象から外すアプリなどを指定します。

```yml:~/.mackup.cfg
#icloud内に[backup]というディレクトリを作って管理
[storage]
engine = icloud
directory = backup

#sshは管理対象から外す
[applications_to_ignore]
ssh
```

###独自のバックアップルールを定義
`~/.mackup`というディレクトリを作り、その中に`<アプリ名>.cfg`というファイルを作ります。

```~/.mackup/vscode-extensions.cfg
[application]
name = vscode-extensions

#バックアップしたいファイルのパス
[configuration_files]
.vscode/extensions
```
アプリ名は何でもOKです。
ファイルを作ったら`mackup list`を叩き、作成したファイル名のアプリが追加されていることを確認しましょう。

デフォルトだと、vscodeの拡張機能以外の設定はバックアップされるのですが、拡張機能だけは管理対象外なので作ってみました。拡張機能の情報は`~/.vscode/extensions`ディレクトリ以下に全て保存されています。

公式のドキュメントがすごくわかりやすいので、英語ですが読んでみることをおすすめします。
[lra/mackup](https://github.com/lra/mackup/tree/master/doc)

###preztoの設定を管理したい場合
```yml:~/.mackup.cfg
[applications_to_ignore]
prezto
```
```yml:~/.mackup/prezto-org.cfg
[application]
name = prezto-org

[configuration_files]
.zpreztorc
.zprezto
```

##注意点
どのアプリの設定がどこまでバックアップが取れているのかがちょっとわかりづらかったりします。バックアップできていると思っていたのに、一部の設定しかできていなかったり。

バックアップ→リストアを何回かやってみると、アプリの設定がどうやって管理されているかについてかなり理解が進むのでおすすめです。


##参考
- [dotfiles, アプリケーションの設定をMackupで管理する](https://qiita.com/saboyutaka/items/b4aaa1f5fcd0ea148b2a)
Java初学者による、初学者のための、初学者のmainメソッド解説

# はじめに 
Java初心者による、情報の整理としての記事です。
修正点・記載すべき追加情報などありましたらご指摘いただけると幸いです。

#mainメソッドとは

```java
public static void main(String[]args){
//statement
}
```

・多くの場合この形で定義されるメソッド（例外パターンは記事後半に記載）

・Javaプログラムの**起点**となるメソッド（エントリーポイント）

Javaのプログラムを起動した際に一番最初に参照されるポイントです。mainメソッドが起点となるため、他のクラスで定義したメソッドなどはmainメソッド内で呼びださない限り実行されることはありません。

また、mainメソッドが存在しない場合、このようなエラーが発生します。


     Exception in thread "main" java.lang.NoSuchMethodError: main


#mainメソッドを分解する
###public修飾子
public修飾子は全てのクラスからのアクセスを許可する修飾子です。
mainメソッドにおいては、Javaプログラムの起点となるメソッドであり、様々なクラスからのアクセスを想定してpublic修飾子をつけることが必要です。

###static
staticキーワードがつけられたフィールドやメソッドの総称を**静的メンバ**と呼称します。
その中でもstaticキーワードがついたメソッドは**静的メソッド（クラスメソッド）**と呼称されます。つまり、mainメソッドは静的メソッドであるということが言えます。

静的メソッドは以下の三つの特徴を持ちます。
 　　 1.メソッド自体がクラスに属するようになる
　　  2.インスタンスにメソッドの分身がセットされる
 　　 3.インスタンスを生み出さなくとも呼び出せる

ここで、重要なのは３番目の特徴です。
mainメソッドはJavaプログラムの起点となるメソッドなので、起動時点ではJava仮想空間には１つもインスタンスが生成されていない状態が考えられます。
この状態に対処するために、mainメソッドはstaticキーワードをつける必要があるということになります。

補足的内容になりますが、他のクラス内に記述され、一旦オブジェクトを生成してから記述されたメソッドはプログラムの起動時に呼びだされる必要性がないため、staticキーワードをつける必要がないということになります。
###void
このメソッドが戻り値を返さないことを示しています。

###main
メソッド名。JVMが参照する識別子。
###String[]args
ここでのルールとしては、String型の配列、またはString型の可変長引数を指定する必要があるというものです。
なので、argsの部分については変更可能ということになります。
しかし、一般的にはargsが使用される例が多いようです。

#mainメソッドの使用上の注意点
ここまでの流れで、mainメソッドは特殊なメソッドであるということが分かりました。
ここで、実際に使用する上で注意したいパターンを一つ挙げておきます。

```java

public class Cleric {

	String name = "ユウダイ";
	int hp = 50;
	int mp = 30;
	
	public static void main(String[] args) {
	  // TODO 自動生成されたメソッド・スタブ
	  Cleric cleric = new Cleric();
	  cleric.selfAid();
	}

	public void selfAid() {
	  System.out.println(this.name + "は『自己回復』を唱えた！");
	}
```

このように一つのクラスの中に、mainメソッドと別のメソッド（ここではselfAidメソッド)が同居しているパターンです。
ここではmainメソッドはClericクラス内に記述されていますが、実際にmainメソッドはあらゆるクラスの起点となるメソッドなので、Clericクラスの持つ振る舞いとは関係がありません。しかし、この形だとあたかもmainメソッドがClericクラスと関連性のあるメソッドのように見えてしまい、コード量が増えてきたときに混乱が発生する恐れがあります。

なので対処法として独立したクラス（例えばMainクラス）を生成し、mainメソッドのみを実行するクラスとして用意するのが無難かと思います。

また、補足として基本的に１ファイルに対して１クラスでコードを記述するということも覚えておくと良いと思います。
（ただし、クラスは入れ子構造にして記述していくこともできるので、あくまでも慣れるまではという認識で）

#いろいろなmainメソッドの書き方
```java

public static void main(String args[]) { }
public static void main(String...args) { }
public static void main(final String[]args) { }
```

ありがとうございました。
以上

【参考文献】
・『スッキリわかるJava入門　第３版』
【参考URL】
・【Java入門】mainメソッドとその引数(args)、戻り値について解説
　https://www.sejuku.net/blog/65082
・Javaのmain（）メソッドの説明
　https://www.codeflow.site/ja/article/java-main-method
・mainメソッドとクラスの関係
　https://www.javadrive.jp/start/about/index4.html
・最初に呼び出されるクラスのメソッド
　https://www.javadrive.jp/start/const/index3.html
・【しっかり押さえたい】Javaのmainメソッドとは？と使い方
　https://eng-entrance.com/java-basic-main
深層学習の理解が深まるおすすめYouTube

#目的
深層学習の理解が深まるおすすめYouTubeを示す。

#これは面白い（わりと強くおすすめ）
## 第1回数理脳科学セミナー 「深層学習の源流と最近の理論の展望」 甘利俊一

https://www.youtube.com/watch?v=AVCjutAjtGs

コメント：

* 深層学習の結果は、実験式だ、というのが面白かった。
* 局所最小はあまり問題ない、というのが理解できた気がした。
* 極めて著名な先生。

キャプチャ：（こんなんです。）


<img width="250" alt="amari.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342207/f629ff55-d4eb-155c-856c-a451822c31f1.png">


#ワタシは、2回（以上）みたいと思ったもの
## 実践Deep Learning：Autoencoderを用いた教師なし異常検知
https://www.youtube.com/watch?v=vFpZrxaq5xU&list=PLg1wtJlhfh20zNXqPYhQXU6-m5SoN-4Eu

コメント：

* 動画(YouTube)の説明って、わかりやすいんだな。。。と思った。
これは、autoencoder、教師なし、の説明。


キャプチャ：（こんなんです。）

<img width="250" alt="sony2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342207/e96c5297-ea6b-6ae8-d40c-64c99da717dd.png">

#（初心者向けかもしれないが）意外とちゃんとした内容だな？と思ったもの
## 【機械学習】深層学習(ディープラーニング)とは何か
https://www.youtube.com/watch?v=s5_Pk3CjhNA

コメント：

* 『意外と』とは、**随分**偉そうな言い方ですが、個人としての、率直な感想です。


キャプチャ：（こんなんです。）

<img width="250" alt="yobiko.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342207/9de11a4d-d51f-e256-9705-f4ff9ad32c4f.png">


#まとめ
特にありません。
**評価**が変わったら、エディットします。
[Node.js] Windows10にオレオレ証明書でSSL通信のWebサーバを作る

## はじめに

Windows10にSSL通信のWebサーバを作るための備忘録
いつも忘れるのでメモ

## 必要なもの

- Windows10
    - Webサーバ構築する
    - nodejsインストール済
        - nodejs : v12.13.1
        - npm : 6.13.4
- ラズパイ
    - オレオレ証明書(SSL証明書)を作る

## オレオレ証明書を作る

```console
$ openssl genrsa 2048 > server.key
$ openssl req -new -key server.key > server.csr
$ openssl x509 -days 3650 -req -signkey server.key < server.csr > server.crt
```

## Webサイトを作る

```console
$ mkdir hoge
$ cd hoge
$ npm init
$ npm install express --save
$ mkdir ssl
$ mkdir wwwroot
$ touch wwwroot/test.html
$ touch app.js
```

※sslディレクト配下にオレオレ証明書をコピー

```console

PS C:\Users\user\nodejs\hoge> tree /f
フォルダー パスの一覧:  ボリューム Local Disk
ボリューム シリアル番号は XXXX-XXXX です
C:.
│  app.js
│  package-lock.json
│  package.json
│
│
├─node_modules
│      ・・略・・
│
├─ssl
│      server.crt
│      server.csr
│      server.key
│
└─wwwroot
        test.html
```

```html:wwwroot/test.html
<!DOCTYPE html>
<html>
<head><title>TEST</title></head>
<body>Test</body>
</html>
```


```javascript:app.js

"use strict";
var express = require("express");
var app = express();
app.use(express.static("wwwroot"));
app.get("/", function(req, res) {
  res.sendFile("wwwroot/index.html");
});

let port1 = 3000;
let port2 = 3001;

// http サーバ
var http = require("http").Server(app);
http.listen(port1,function(){
    console.log("\tサーバがポート%dで起動しました。モード:%s",port1,app.settings.env)
});

// https サーバ
var fs = require("fs");
var opt = {
  key:  fs.readFileSync("ssl/server.key"),
  cert: fs.readFileSync("ssl/server.crt"),
  passphrase: "password", // オレオレ証明書でのパスワードを書く
};
var https = require("https").Server(opt, app);  // https サーバを立てる
https.listen(port2,function(){
    console.log("\tサーバがポート%dで起動しました。モード:%s",port2,app.settings.env)
});
```

## 動作確認

```console

PS C:\Users\user\nodejs\hoge> pwd 

Path
----
C:\Users\user\nodejs\hoge


PS C:\Users\user\nodejs\hoge> node app.js
        サーバがポート3000で起動しました。モード:development
        サーバがポート3001で起動しました。モード:development
```

ブラウザで以下サイトにアクセスできれば成功

- http://localhost:3000/test.html
- https://localhost:3001/test.html
[Oracle Cloud] Fluentd をつかって、Object Storage にデータを出力してみた

# はじめに

Fluentd は、OSS で開発されているとても柔軟なデータ収集ソフトウェアです。さまざまなソースのデータを、様々な宛先に出力することが出来ます。CNCF でホストされているため、データ収集ソフトウェアでデファクトスタンダードな製品です。データの受け取り(input)とデータの出力(output)をプラグインとして実装されています。OSSでかつプラグイン方式なため、ファイルや標準出力、データベース、Public Cloud のサービスなど、多種多用なものに対応しています。また、対応していないものがあれば自作することも可能です。

今回の記事では、Fluentd の S3 プラグインを使用して、OCI の Object Storage にデータを出力する config を紹介します。



# 事前準備

Object Storage で S3互換API を提供されています。S3 プラグインでは、これを利用して接続をします。次の記事を参考に、Customer Secret Key と、Endpoint を確認します。

[https://qiita.com/sugimount/items/bb20293627d5c9973ba9#customer-secret-keys-%E3%82%92%E7%94%9F%E6%88%90](https://qiita.com/sugimount/items/bb20293627d5c9973ba9#customer-secret-keys-を生成)



# Fluentd のインストール

次の Document を見てインストールしていきます。

https://docs.fluentd.org/installation



# config

パッケージマネージャーからインストールしたので、vim で config を編集します

```
vim /etc/td-agent/td-agent.conf
```



次のconfigを入力します。事前準備で確認した内容をパラメータなどを入れていきます。

- aws_key_id : key
- aws_sec_key : secret
- s3_bucket : Bucket 名
- s3_region : Region Identifier
- s3_endpoint : S3互換APIのendpoint
- ssl_verify_peer : false を指定
- force_path_style : true を指定

```
<source>
 @type forward
</source>
 
<match debug.**>
  @type copy
  <store>
    @type stdout
  </store>
  <store>
    @type s3
    aws_key_id "your key"
    aws_sec_key "your secret"
    s3_bucket testsugi
    s3_region <region>
    s3_endpoint https://<namespace>.compat.objectstorage.<region>.oraclecloud.com
    check_apikey_on_start false
    ssl_verify_peer false
    force_path_style true
    <buffer>
      @type file
      path /var/log/td-agent/buffer/oci.buffer
      chunk_limit_size 8m
      queue_limit_length 256
      flush_at_shutdown true
      flush_interval 1s
      retry_wait 30s
      retry_max_times 9
    </buffer>
  </store>
</match>
```



Fluentd を再起動します

```
systemctl restart td-agent
```



次のコマンドを発行すると、Fluentd にデータがキューされます。

```
echo '{"I say":"hello"}' | /opt/td-agent/embedded/bin/fluent-cat debug.ok
```



td-agent.log を確認すると、末尾に stdout で文字列が表示されています

```
root@stepbox:~# tail /var/log/td-agent/td-agent.log
2020-03-20 00:46:03.443149932 +0000 debug.ok: {"I say":"hello"}
```



再度、Fluentd を再起動することで、バッファーをフラッシュして Object Storage にデータが出力されます

```
systemctl restart td-agent
```



OCI Console で確認

![1584665428689.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/5c1d012a-b585-2151-de24-aeeeccafdbce.png)



Object Storage にアップロードされている gz ファイルをダウンロードして内容を確認すると、正しくデータが書かれています

![1584665327402.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/917d62c1-cc08-1a68-c7dd-ca13e98f5d9b.png)



# 参考URL

https://www.fluentd.org/
「Ｒにより統計的学習の入門」リサンプリング法演習問題

#はじめに
今回の投稿内容は、「Rによる統計的学習の入門」演習問題5.4(4)の自分の回答です。
それでは、早速見ていきましょう。

##1.演習問題
この演習問題は、「Rによる統計的学習の入門」から引用します。

>予測変数Xが与えられたときの応答変数Yを予測するために、ある統計的学習法を使うとする。予測の標準誤差をどのように推定するかについて詳しく説明せよ。

##2.解答
ブートストラップ法の予測の標準誤差の求め方について、説明します。
ステップ１：　データセットからn個のデータを無作為抽出することにより、
　　　　　　　ブートストラップ標本を作成します。抽出の際には重複を許します。
ステップ２：　ブートストラップ標本を使い、ブートストラップ推定値を求めます。
ステップ３：　以上のことを複数回（回数は大きな値）繰り返し、
　　　　　　　異なるブートストラップデータセットと、対応する推定値を複数個を得ます。
ステップ４：　以下の式により、ブートストラップ推定値の標準誤差を求めます。
![Screenshot_2020-03-17 booknew dvi - An_Introduction_to_Statistical_Learning pdf.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/400491/8545ba2d-f5a2-708b-74f2-db77c628d576.png)
　　　　　　　ここで、Bは繰り返し回数、$\alpha^{*r}$は各ブートストラップ標本の推定値となります。

ブートストラップ法を使用するメリットは、
（１）ほとんど全ての場合で、使用することは可能です。
（２）複雑な計算は不要です。

Rでブートストラップを行う場合は、以下の二つのステップが必要です。
（１）求めたい統計量を計算する関数を作成します。
（２）boot()関数を使用して、標準の復元抽出を繰り返し、ブートストラップを行います。

#参考書籍
1．著者 G. James，D. Witten，T. Hastie，R. Tibshirani，(2017)，原著タイトル，An Introduction to Statistical Learning: with Applications in R．訳者 落海 浩，首藤 信通，(2018)，Rによる統計的学習の入門，朝倉書店.

以上です。
BeautifulSoup

```py
#pip install bs4
from bs4 import BeautifulSoup
import requests


html = requests.get('https://www.python.org')

soup = BeautifulSoup(html.text, 'lxml')

titles = soup.find_all('title')
print(titles[0].text)

intro = soup.find_all('div', {'class': 'introduction'})
print(intro[0].text)
```

```text
Welcome to Python.org

Python is a programming language that lets you work quickly and integrate systems more effectively. Learn More
```
「Repository  not found」になるGithub Private Repositoryの扱い方

Githubのプライベートリポジトリをclone, pull, pushなどしたときに、`Repository not found` と表示されることがあります。以下のようなメッセージです。

```bash
$ git push origin XXXXX
remote: Repository not found.
fatal: repository 'https://github.com/XXXXX/YYYYY.git' not found
```

SourceTreeやForkなどのGUIツールでも発生することがあります。

# 原因は？

プライベートリポジトリへのアクセス認証に失敗しているためです。gitの接続プロトコルを https にしているのが原因のことが多いです。githubから普通にcloneすると大体 https になっているのですが、仕事とプライベートで複数のgitアカウントを切り替えて使っていると、いつのまにかgithubの認証情報が切り替わって、アクセスできなくなるようです。

# 対応

gitへの接続プロトコルを ssh にすれば解決します。

## ①接続プロトコルを確認

remote.origin.url が https になっているかを確認しましょう。

```bash
$ git config -l | grep remote.origin.url
remote.origin.url=https〜 # httpsから始まるURLがセットされているか
```

もしgit@から始まる値がセットされている場合には、この記事は役に立ちませんので、別の記事を参考にしてください。

## ②リモートURLをSSHのパスに書き換え

```bash
git remote set-url origin [リポジトリのSSHパス]
git remote set-url origin git@github.com:xxx/abc.git # 例
```

SSHパスは、以下の画面よりコピーすると簡単です。

![NativeScript_NativeScript__NativeScript_is_an_open_source_framework_for_building_truly_native_mobile_apps_with_JavaScript__Use_web_skills__like_Angular_and_Vue_js__FlexBox_and_CSS__and_get_native_UI_and_performance_on_iOS_and_Android_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170712/7f1ca380-9835-b4cf-f3d8-c6c159bfdf50.png)

実行後、もう一度 `git config -l` をして、remote.origin.url が git@ で始まるSSHパスに変わっているかを確認しておきましょう。

## ③公開鍵をgithubに登録

自分のローカルマシンの公開鍵をgithubのアカウントに登録します。(既に登録済の場合はスキップして構いません。)

まず自分の公開鍵をクリップボードにコピーします。Macの場合は以下のコマンドでコピーできます。

```bash
$ pbcopy < ~/.ssh/id_rsa.pub
```

次に以下のURLを開きましょう。

https://github.com/settings/keys

「New SSH Key」を押して、コピーされた鍵を貼り付けたあと、「Add SSH key」すれば完了です。※[title]欄 には自分のマシンだとわかる名前をつけておくと良いでしょう。

これで、git pull / push が問題なく出来るようになっているはずです。
Oracle Code One 2019で興味深かったセッション

2010/1/18(土) に[Oracle Code One 2019 報告会 in 大阪](https://kanjava.connpass.com/event/161889/)で「オッス！ Oracle Code One」というタイトルで登壇させて頂きました。

そこで興味深かったセッションとして「Duke’s Star Trek with Java 12 Code Challenges」というセッションの内容を紹介いたしました。
![図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100799/f5a53559-0bcf-d464-2340-ac90c38d3fb1.png)

Oracle Code Oneは朝から晩まで4日間に渡るカンファレンスなのでいくつものセッションを聞くのですが、セッションの数が多すぎていつもセッション選びに苦労します。
しかしStar Trekの好きな私はタイトルを見ただけでほぼノータイムで予約を入れました。
内容はJDK6からJDK12までの各バージョンで取り入れられた新機能について4択のクイズ形式で紹介するというもので、アニメーションで楽しいスライドを使って進められとてもいいセッションでした。

報告会ではこのセッションで出たクイズの一部（と補足のために私が作ったオリジナル）を紹介しました。

例えばJDK7についての紹介では

```java
public class ShipDoorEp1 implements AutoCloseable {

  public void open() { throw new RuntimeException("Fail to open door."); }

  @Override
  public void close() throws Exception {
    System.out.println("Ship door is closed."); 
  }

  public static void main(String... doorMalfunction) {
    try (ShipDoorEp1 shipDoor = new ShipDoorEp1()) {
      shipDoor.open();
    } catch (Exception e) {
      System.out.println(e.getMessage());
    } finally {
      System.out.println("The end.");
    }
  }
}
```

このようなコードを実行したら以下のA, B, C, D のどれになるかというものです。
正解は報告会で使用した資料（記事の最後のリンク）を見てください。

A)
Fail to open door.
The end.
Ship door is closed.

B)
Fail to open door.
Ship door is closed.
The end.

C)
Ship door is closed.
Fail to open door.
The end.

D)
Fail to open door.
The end.

この問題はかなり簡単だと思いますが、セッションではさらに深く掘り下げて

```java
public class ShipDoorEp2 implements AutoCloseable {

  public void open() { throw new RuntimeException("Fail to open door."); }

  @Override
  public void close() throws Exception { 
    throw new RuntimeException("Fail to auto-close door."); 
  }

  public static void main(String... doorMalfunction) {
    try (ShipDoorEp2 shipDoor = new ShipDoorEp2()) {
      shipDoor.open();
    } catch (Exception e) {
      System.out.println(e.getMessage());
      System.out.println(e.getSuppressed()[0].getMessage());
    } finally {
      System.out.println("The end.");
    }
  }
}
```

このようなsuppressed exceptions（抑制済み例外）についても触れていました。
（問題の選択肢、解答は資料でご確認ください）

もちろんこのセッション以外にも興味深かったセッションはたくさんあったのですが、色々機能追加などがあったJDK6からJDK12までのバージョンアップの歴史を振り返ることができたという点でこのセッションが一番印象に残りました。

来年もOracle Code Oneに参加していいセッションが聴ければいいなあと思います。

[発表に使った資料](https://t.co/jZpmZAmT5t)です
UnityでMonaparty（WebGLとMpurse編）

たいそうなタイトルですね、、、
#まずはこちらを
・公式doc
https://docs.unity3d.com/ja/current/Manual/webgl-interactingwithbrowserscripting.html

・UnityのWebGLで外部JavaScriptライブラリを使う
h ttps://qiita.com/void_vtuber/items/2aad097eac69771826fd

・モナ版MetaMask Mpurseプログラミング超入門
https://monappy.jp/memo_logs/view/Monacoin_Charts/4654

（qiitaのリンクを張るとリンク元にもこちらの記事が反映されてしまうのは恐れ多い）

#結論
・C#からJavaScriptを呼ぼうとする時にjslibファイルを作るが、そこに await/async を書くとビルドエラーになる（たぶん）
（同じような質問もあった？？）→https://forum.unity.com/threads/unity-jslib-async-problem.809478/

・なのでJavaScriptからC#にメッセージを送ることに

```Massageを送る.html
<head>
  <script>
      async function GetAddress()
          {
            const address = await window.mpurse.getAddress();
            gameInstance.SendMessage("MyGameObject", "MyFunction", address);   
          }
  </script>
</head>
```
これでやりとりが出来ました。

jslibファイルに await/async 書けるといいけども、、、

( ´∀`)<owari
flask

```flask.py
import _sqlite3

from flask import Flask
from flask import g
from flask import render_template
from flask import request
from flask import Response

app = Flask(__name__)


def get_db():
    db = getattr(g, '_database', None)
    if db is None:
        db = g._database = _sqlite3.connect('test_sqlite.db')
    return db


@app.teardown_appcontext
def close_connection(exception):
    db = getattr(g, '_database', None)
    if db is not None:
        db.close()


@app.route('/employee', methods=['POST', 'PUT', 'DELETE'])
@app.route('/employee/<name>', methods=['GET'])
def employee(name=None):
    db = get_db()
    curs = db.cursor()
    curs.execute(
        'CREATE TABLE if NOT EXISTS persons('
        'id INTEGER PRIMARY KEY AUTOINCREMENT, name STRING)'
    )
    db.commit()

    name = request.values.get('name',name)
    if request.method == 'GET':
        curs.execute('SELECT * FROM persons WHERE name ="{}"'.format(name))
        person = curs.fetchone()
        if not person:
            return "NO", 404
        user_id, name = person
        return '{}:{}'.format(user_id,name), 200

    if request.method == 'POST':
        curs.execute('INSERT INTO persons(name) values("{}")'.format(name))
        db.commit()
        return 'created {}'.format(name), 201

    if request.method == 'PUT':
        new_name = request.values['new_name']
        curs.execute('UPDATE persons set name = "{}" WHERE name = "{}"'.format(new_name, name))
        db.commit()
        return 'updated {}: {}'.format(name, new_name), 200

    if request.method == 'DELETE':
        curs.execute('DELETE from persons WHERE name = "{}"'.format(name))
        db.commit()
        return 'deleted {}'.format(name), 200

    curs.close()

@app.route('/')
def hello_word():
    return 'top'


@app.route('/hello')
@app.route('/hello/<username>')
def hello_word2(username=None):
    #return 'hello world! {}'.format(username)
    return render_template('hello.html', username=username)


@app.route('/post', methods=['POST', 'PUT', 'DELETE'])
def show_post():
    return str(request.values)


def main():
    app.debug = True
    app.run()
    #app.run(host='127.0.0.1', port=5000)


if __name__ == '__main__':
    main()
```

```test_flask.py
import requests

r = requests.get('http://127.0.0.1:5000/employee', data={'username': 'jun'})
print(r.text)

r = requests.post('http://127.0.0.1:5000/employee', data={'username': 'jun'})
print(r.text)

r = requests.put('http://127.0.0.1:5000/employee', data={
    'username': 'jun', 'new_name': 'sakai'})
print(r.text)

r = requests.delete('http://127.0.0.1:5000/employee', data={'username': 'jun'})
print(r.text)
```

```hello.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Hello</title>
</head>
<body>

{% if username %}
Hello {{ username }}
{% else %}
Hello
{% endif %}

</body>
</html>
```
HTML なリッチテキスト を Markdown に変換する ( #WYSIWYG #Slack #GoogleChrome #Markdown )

# Paste As Markdown

Chrome拡張を使う。

![image](https://user-images.githubusercontent.com/13635059/77015531-66ee1780-69b8-11ea-886b-c4c088eb90d4.png)

https://chrome.google.com/webstore/detail/paste-as-markdown/lmelpnmpkekjahgdihfajfebaddffokl/related

# クリックボードにリッチテキストをコピーする

![image](https://user-images.githubusercontent.com/13635059/77015669-cf3cf900-69b8-11ea-8bb6-6eb222942ad3.png)


# Alt+C または Option+C でペーストする

![image](https://user-images.githubusercontent.com/13635059/77015713-e8de4080-69b8-11ea-8b65-f66027cb8724.png)

# 変換の例

> AAAAA  
> BBBBB

**Strong**YES!

-   list
-   list
-   list

1.  list
2.  list

[Docker — docker コンテナの中で vim が使えない場合](https://qiita.com/YumaInaura/items/3432cc3f8a8553e05a6e)

# Chrome以外で使う場合

いったんChromeで変換してから、Markddown変換後のテキストをコピペして、さらに他の場所で使えば良い。

親切にもChrome拡張自体に変換用にミニフォームがついているので、こちらを利用しても良い。

![image](https://user-images.githubusercontent.com/13635059/77015763-1b883900-69b9-11ea-9eed-db1ada22ceca.png)




# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/3040








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
API Gateway-lambda DBメンテナンス時はどうする？


下記の構成で、DBサーバをメンテナンスする場合にどうすればよいか？
APIの戻りとしては、エラーではなくメンテナンスのJSONを返却したい。。
－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－
API Gateway → lambda → EC2にインストールした自前のDBサーバ
－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－

##考えたこと
API Gatewayでスケジューラでメンテナンスの期間を設定できたら便利だなーと。
その時間になったら設定したメンテナンス用のJSONが返却される。

とはいえ、今はないのでどうすればよいか？

考えた方法

APIGatewayのリソースポリシーでAPIへのアクセスをすべて遮断。
アクセス拒否時のゲートウェイレスポンスのJSONをメンテナンス用に変更
そして、デプロイ

でその後、メンテナンスを終わらせてから、もとに戻す。

こんなところでしょうかねぇ。

以上です。
CakePHP4 + Vue.js 開発での .editorconfig の設定内容

新しいプロジェクトを始めるたびに .editorconfig を変更していてるので、備忘録として残します。
新しい設定が必要なったら編集して記載内容を更新する予定です。

# この記事でわかること

- CakePHP4 + Vue.js の .editorconfig の設定内容がわかります。
- この記事内のソースは以下で公開しています。
    - https://github.com/katsuhiko/cakephp-vue-study


# .editorconfig

[CakePHP4 で Vue.js ( Laravel-Mix ) を使えるようにして docker-compose で動くようにする](https://qiita.com/katsuhiko/items/82b018fbd3d61a238058) で作ったソースを元に始めます。

CakePHP4 のプロジェクトを作った時点で .editorconfig が用意されるのですが、足りない点があるので追記します。


```:.editorconfig
root = true

[*]
charset = utf-8
indent_style = space
indent_size = 4
end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true

[*.bat]
end_of_line = crlf

[*.{yml,json,scss,html,js,vue,neon}]
indent_size = 2

[*.md]
trim_trailing_whitespace = false

[*.twig]
insert_final_newline = false

[Makefile]
indent_style = tab

```

追記した点を補足します。

<dl>
  <dt>[*] > charset = utf-8</dt>
  <dd>文字コードの指定です。</dd>

  <dt>[*.{yml,json,scss,html,js,vue}] > indent_size = 2</dt>
  <dd>インデント2のファイルは yml のみになっていたので、json, scss, html, js, vue とフロント開発に必要な拡張子を追加します。</dd>

  <dt>[*.md] > trim_trailing_whitespace = false</dt>
  <dd>markdown は後方スペースで改行を示す場合がある（使いたくない機能だけど）ので false とします。</dd>
</dl>
X-Frame-Options について簡単に調べてみた

## はじめに

最近担当している対応で、外部サイトから読み込んだhtmlページを `iframe` 内で表示しようとしたときに、`X-Frame-Options` というレスポンスヘッダーが無いと読み込みができないという事象に出くわしました。

`X-Frame-Options` は今まで扱ったことがなかったため、後学のために理解も兼ねて調べてみました。

## X-Frame-Options とは

[X-Frame-Options - HTTP | MDN](https://developer.mozilla.org/ja/docs/Web/HTTP/X-Frame-Options) から引用します。

```
X-Frame-Options は HTTP のレスポンスヘッダーで、ブラウザーがページを <frame>, <iframe>, <embed>, <object> の中に表示することを許可するかどうかを示すために使用されます。
サイトはコンテンツが他のサイトに埋め込まれないよう保証することで、クリックジャッキング攻撃を防ぐために使用することができます。
```

クリックジャッキングと呼ばれる、悪意のある埋め込まれた外部サイトページ上のボタンをクリックすると、利用者に意図しない操作を実施させるといった行為を防ぐためのレスポンスヘッダーのようです。

## Webサーバ側での設定

自サーバのコンテンツを他のサイトに埋め込まれないようにするために、`X-Frame-Options` のディレクティブという値で制限の度合いを指定することができます。

ディレクティブ|意味
:--|:--
`deny`| 自サイト、他サイトどちらも読み込み不可に
`sameorigin`| 同じオリジンのサイトであれば読み込み可能
`allow-from uri`| `uri` で指定したオリジンからであれば読み込み可能

## X-Frame-Options の設定方法 

いくつか紹介します。

### Apache, nginx, IIS, HAProxy, Express の場合

以下ドキュメントにまとまっていますが、Webサーバの設定ファイルに、`X-Frame-Options` に関する設定を追加します。

[X-Frame-Options - HTTP | MDN](https://developer.mozilla.org/ja/docs/Web/HTTP/X-Frame-Options)

例えば Apache であれば以下のような形です。

```
Header always set X-Frame-Options "sameorigin"
```

### S3内のファイルの場合

S3 単体では `X-Frame-Options` ヘッダーを付けてレスポンスを返すことはできないようです。。

紹介されていたのは、CloudFront + S3 + Lambda@Edge という構成で、`X-Frame-Options` を付けてあげる方法です。

* [Adding HTTP Security Headers Using Lambda@Edge and Amazon CloudFront | Networking &amp; Content Delivery](https://aws.amazon.com/jp/blogs/networking-and-content-delivery/adding-http-security-headers-using-lambdaedge-and-amazon-cloudfront/)
* [Lambda@Edgeを使ってX-Frame-Optionsヘッダを追加してみた ｜ Developers.IO](https://dev.classmethod.jp/cloud/aws/lambdaedge-modify-header/)

## おわりに

HTTP のヘッダー周りのことはまだまだ知識不足なので、継続して学習していこうと思います。

## 参考

* [X-Frame-Options - HTTP | MDN](https://developer.mozilla.org/ja/docs/Web/HTTP/X-Frame-Options)

* [ディレクティブとは - ディレクティブ - JSP入門](https://www.javadrive.jp/servlet/jsp_directive/index1.html)
TypeScriptでモジュールのimport/exportやrequire

TypeScriptを書いていて、たまに`import`出来なかったりして、そしたら`require`したりとか、モジュールのインポートはふんいきでやっていたんですが、TypeScriptで古いJSのライブラリの型定義を書いていて気持ち悪かったので、調べました。

## ２つのモジュールインポート方法

### CommonJS (Node.js)
#### インポート方法
- `require`

#### エクスポート方法
- `module.export`
- `export`

#### exportとmodule.exportの違い
例えば、`require("some-module")`とすると、`id="some-module"`で以下のようなコードが呼ばれる

```javascript
const module = new Module(id)
(function(export, module) {
  /* モジュール本体のコードがここに差し込まれる */
  return module.export
}(module.export, module)
```

`export`と、`module.export`はモジュールが評価される関数への引数で、`export`は、`module.export`オブジェクトへのポインタ、関数が返している`module.export`は、引数で渡されている`module`の`export`プロパティなので、モジュール内で`export`を上書きすると、`export`が元のオブジェクトを指さなくなるので、期待通りに動かない。同じ理由で、moduleを上書きしてしまってもダメ。

### ES6
#### インポート方法
##### 個別
- `import { x } from "module"`
- `import * as x from "module"`

##### `export default`されたもの
- `import x from "module"`

#### エクスポート方法
##### 個別
- `export x`

##### なにか１つだけ`export`したい場合
- `export default x`

## TypeScriptとJavaScriptでの違い
ない

## どちらを使うか
インポートしたいモジュールが使っているやり方に合わせる。

## まとめ
適当に`import`やら`require`していたのを、`webpack`がきれいにしてくれていたんですね。わかってよかった。
[電子工作入門]スイッチ入力を受け取る

# 概要
スイッチを使って入力を受け取りLEDを光らせる回路を作成しました。
超入門だと思うので…

[![IMAGE ALT TEXT HERE](http://img.youtube.com/vi/0ZjakNsWo6w/0.jpg)](http://www.youtube.com/watch?v=0ZjakNsWo6w)



# 回路図
今回は、ポート2,4を利用します。
ポート4でスイッチを押しているかどうかを受け取り、ポート2でLEDを光らせます。

<img width="495" alt="スクリーンショット 2020-03-20 7.36.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89227/5c56bf72-9a22-5fc1-f1ad-f9bf231f2fb8.png">


**[スイッチの片方が抵抗を挟んでGNDに落ちている理由]**
スイッチが切れている時に電気的にGNDにも5ｖにもならない状態にしないためです。

**[LEDにも抵抗を挟んでいる理由]**
これはLEDを5vとGNDに直接つないでしまうと、大量の電流が流れるためLEDが破損する事を防ぐためです。
※ArduinoのIOは基本的に直接つないでも問題なかったと思いましたが、念の為です。

# ソースコード

```c
void setup() {
  pinMode(2, OUTPUT);
  pinMode(4, INPUT);
}

void loop() {
  int pin4=digitalRead(4);
  digitalWrite(2, pin4); 
}
```

`setup()`で各pinを初期化しています。
`loop()`ではpin4で入力を受け取り、pin2に書き込みを行っています。

github
https://github.com/hashito/arduino_startup/tree/master/switch2led

# 結果

![download.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89227/6fc8ea61-fc7b-e8e6-3fb7-0ee61d7847a6.gif)
【Day33】積み上げ日記

##予定
■スキプラさんnote③

##完了
■スキプラさんnote③

##学習時間
２h

##学習ポイント
■imageはimageクラスを作る。
→全体の横幅を揃えるときに使うため

■偶数番号だけ左右を逆にする
.親要素:nth-child(even) {
  flex-direction: row-reverse;
}

　奇数は(even)　→　odd

##疑問点
○imgタグの中にclass or classの中にimg　は何が違う？

##計画通り進んだか？
進んだ。途中、imgタグの中にclassを入れてトライしたがうまくいかなかったので、classの中にimgを入れたらうまく言った。その原因はimg箱として横幅を揃えるのに必要な要素だから。箱を作らない方法もあるが、一旦はこのやり方で統一しようと思う。
初心者によるプログラミング学習ログ 267日目

#100日チャレンジの267日目
twitterの100日チャレンジ#タグ、#100DaysOfCode実施中です。
すでに100日超えましたが、継続。
100日チャレンジは、ぱぺまぺの中ではプログラミングに限らず継続学習のために使っています。
267日目は、
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">おはようございます<br>267日目<br>・webサイト模写<br>・下層ページ1ページ目<br>・flexboxの並びがうまくできない<a href="https://twitter.com/hashtag/%E6%97%A9%E8%B5%B7%E3%81%8D%E3%83%81%E3%83%A3%E3%83%AC%E3%83%B3%E3%82%B8?src=hash&amp;ref_src=twsrc%5Etfw">#早起きチャレンジ</a><a href="https://twitter.com/hashtag/%E9%A7%86%E3%81%91%E5%87%BA%E3%81%97%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%A8%E7%B9%8B%E3%81%8C%E3%82%8A%E3%81%9F%E3%81%84?src=hash&amp;ref_src=twsrc%5Etfw">#駆け出しエンジニアと繋がりたい</a><a href="https://twitter.com/hashtag/100DaysOfCode?src=hash&amp;ref_src=twsrc%5Etfw">#100DaysOfCode</a></p>&mdash; ぱぺまぺ@webエンジニアを目指したい社畜 (@yudapinokio) <a href="https://twitter.com/yudapinokio/status/1240757548988256256?ref_src=twsrc%5Etfw">March 19, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
ubuntu の OS image ダウンロードリンク

# ubuntu の各バージョンの OS image ダウンロードリンク

自分用のメモです。

バージョンごとの ubuntu の OS image のリンクです。

http://releases.ubuntu.com/

## ミラーサイト

https://launchpad.net/ubuntu/+archivemirrors
https://ftp.udx.icscoe.jp/Linux/ubuntu-releases/
http://ftp.iij.ad.jp/pub/linux/ubuntu/releases/
http://ftp.jaist.ac.jp/pub/Linux/ubuntu-releases/

### Ubuntu 22.04.05 LTS

https://ftp.udx.icscoe.jp/Linux/ubuntu-releases/22.04.5/

### Ubuntu 24.04.01 LTS

https://ftp.udx.icscoe.jp/Linux/ubuntu-releases/24.04.1/

### Ubuntu 24.10

https://ftp.udx.icscoe.jp/Linux/ubuntu-releases/24.10/

### Ubuntu 25.04 (Plucky Puffin) Daily Build

http://ftp.jaist.ac.jp/pub/Linux/ubuntu-cdimage/daily-live/pending/
https://cdimage.ubuntu.com/daily-live/current/

### Ubuntu Server 25.04 (Plucky Puffin) Daily Build

http://ftp.jaist.ac.jp/pub/Linux/ubuntu-cdimage/ubuntu-server/daily-live/current/
http://cdimage.ubuntu.com/ubuntu-server/daily-live/current/
三項演算子?:は善である。

三項演算子`?:`は善である。異論は認めない。[^1]

[^1]: 批判のコメントは受け付けない。誤字脱字以外の編集リクも受け付けない。

## 三項演算子とは何か？

`?`と`:`のハーモニーだ。それ以外の表現は認めない。

## なぜ、善か？

理由はただ一つ、**わかりやすい**、以上だ。

どのようにわかりやすいかを見ていこう。

### 代入する値を条件によって変えるときにわかりやすい。

`a`が真であれば`b`、偽であれば`c`を`x`に代入するとした場合、`if`文で書くとこのようになる。

```C
if (a) {
    x = b;
} else {
    x = c;
}
```

三項演算子を使えば次のように書ける。

```C
x = a ? b : c;
```

5行に渡るコードが1行に収められ、非常にわかりやすくなる。

### 複数の条件を順に満たすかで確認して、代入する値を変えるときにもわかりやすい。

`a1`が真なら`b1`、`a2`が真なら`b2`、`a3`が真なら`b3`、いずれも偽なら`c`を代入するとなった場合、`if`文はさらに冗長になる。

```C
if (a1) {
    x = b1;
} else if (a2) {
    x = b2;
} else if (a3) {
    x = b3;
} else {
    x = c;
}
```

我らが三項演算子を使えば、綺麗に書くことができる。

```C
x = a1 ? b1
  : a2 ? b2
  : a3 ? b3
  : c;
```

改行がインデントには様々な流派があるが、それは些細な問題だ。

### `switch`文よりもわかりやすい。

`a`が`1`のときに`b1`、`2`のときに`b2`、`3`のときに`b3`、それ以外の時に`c`と言う場合はどうだろうか？普通の人は`switch`文を使うことだろう。

```C
switch (a) {
    case 1:
        x = b1;
        break;
    case 2:
        x = b2;
        break;
    case 3:
        x = b3;
        break;
    default:
        x = c;
}
```

これも、三項演算子を使えば解決だ。

```C
x = a == 1 ? b1
  : a == 2 ? b2
  : a == 3 ? b3
  : c;
```

三項演算子はこれだけではない。`switch`文は整数型しか使えない[^2]が、三項演算子なら任意の型の比較に使える。

```C
x = strcmp(str, "a") == 0 ? a
  : strcmp(str, "b") == 0 ? b
  : strcmp(str, "c") == 0 ? c
  : other;
```

[^2]: Java 7以上は`switch`文で文字列比較もできるが、互換性を重視する諸君なら、Java 6以下互換のコードにするために文字列比較などしないと信じている。なお、JavaScriptは変数に型が無いので問題ないものとする。

## PHPだけ左結合になるけど、どうしたらいい。

それは簡単だ。PHPを使わなければいい。

## 三項演算子が使えないときは？

残念ながら、三項演算子`?:`がない言語が存在する。次のような言語だ。

* Python
* Go
* Rust
* Scala
* Kotlin
* Nim
* CoffeeScript

これらの言語は、`?:`ではなく`if else`を使っていたり、`if`自体が式だったり、三項演算子に反逆した言語である。三項演算子をこよなく愛する諸君は使ってはならない。使う奴は裏切り者であり、粛清の対象である。

## 三項演算子が悪だと決めつける奴は抹殺せよ！

[三項演算子?:は悪である。 - Qiita](https://qiita.com/raccy/items/0b25b2f106e2a813828b)

上の記事を書いた奴は粛清され、~~洗脳~~再教育済みだ。今後も諸君らの密告を期待する。

---

はっ！私は一体…何を書いていたのだ？思い出そうとする頭痛が痛い…

え？三項演算子をどう思うかって。あんなのくそにきｍ…

サンコウエンザンシハ，スバラシイブンポウデス．セッキョクテキニツカイマショウ．
十分に発達した fizzbuzz.bat は、魔法と区別がつかない

# 十分に発達した fizzbuzz.bat は、魔法と区別がつかない

## 序
最近業務でバッチファイル読むことになったので、リハビリ兼ねてfizzbuzz書いてみた。
以前の流行りの際にも書いたものを、ちょっぴり思い出しながら(自身の書いたものならカンニングに当たらないだろう)すらすらっと書いたらそこそこ面白いものになったので晒すことにする。

```fizzbuzz.bat
@FOR /L %%n IN (1,1,100)DO @SET/AF=!(%%n%%3),B=!(%%n%%5)&CALL SET.=%%F:1=Fizz%%%%B:1=Buzz%%&CALL ECHO %%.:0=%%|FIND "z"||ECHO %%n
```
twitter に上げようと140バイト目標に code golf 駆使した129bytes の1行プログラム。


## 解説と魔術診断

``@FOR /L %%n IN (1,1,100)DO ``
バッチの FOR /L は連番を生成できる。*nix 系の seq に相当する。
終端のかっことじの後ろの空白は任意なので、こっそり1バイト稼いでいる。
ちなみに golf 的には FOR /L よりも SET/A を使った再帰になるところ。``SET/AN+=1`` で済む。

``@SET/AF=!(%%n%%3),B=!(%%n%%5)``
剰余+否定で FizzBuzzのフラグを生成、%F%と%B%に格納する。
SET 文の /A　オプションは演算時に用いるが、一度に複数の変数を弄れるので、 golf 的にはなかなか便利。
前後の空白が任意なので、こっそり2バイト稼いでいる。

``&CALL SET.=%%F:1=Fizz%%%%B:1=Buzz%%``
処理自体は %F% の ”1” を ”Fizz” に、%B% の ”1” を ”Buzz" に置換し、変数に格納するシンプルなもの。
それに対し、CALLを用いた遅延展開を行っている。
変数の展開時には前述の SET/A 文が判定されていないため、CALL文 + %のエスケープを用いて処理時に展開させている。
変数名「.」は英字にしないことで、SET文の後の空白を省くためのものである。
この辺りから魔術がちょっと顔を出す。

``&CALL ECHO %%.:0=%%|FIND "z"||ECHO %%n``
上で格納した変数の ”0” を空文字に置換して出力する。
FIND で ”z” を探して、見つかればそのまま出力、見つからない場合は数字を出力。
FINDの成功失敗で数字出力を制御するのはバッチらしくてお気に入り。

## 結
案外魔術っぽくなかった。変態なのは変数名だけか。