OmniAICreator/Qiita-1.07M huggingface dataset:
Avro メモ

- Avro の記述仕様は「Specification」の項にある。
  - いわゆる構造体以外にも RPC の外形を記述できて、まとめて protocol と呼んでいる。
- AVDL : DSL として json でない新しい記述方式が追加された。
  - ドキュメントは「IDL language」の項にある。
  - 人が手で記述してメンテナンスするのに適している。
- AVPR : AVDL の json 版
  - AVDL を記述して、そこから AVPR を生成するワークフローが想定されいるようだ
- AVSC : AVRO 構造体を記述する JSON ファイル。AVPR の一部分とも言える。
  - json である。
  - json-schema と類似している。json-schema と比べて表現力は小さいが、同時に不安定さも少ない。
      - json-schema との相互変換は、当然期待される
      - 制限事項もある https://github.com/fge/json-schema-avro
  - シリアライザとは分離されている。avro binary シリアライザと同様に json シリアライザも標準的に視野に入っている。
  - protobuf のようなバージョン互換性の強制力はない。ベストプラクティスはある。
  - confluent suite では schema-registry で使われる。
      - https://docs.confluent.io/current/schema-registry/index.html
  - 構造体ごとに別の avsc にすることが多いが、仕様上は配列に格納した 1 ファイルでも良い。
        - 別ファイルにする理由は、バリデータの情報元としてコードでファイル名指定する用途があるため
- binary serializer
  - Container は schema と data を一列に並べてエンコードできる。
  - https://www.slideshare.net/seiyamizuno35/serialization-systems

## avro-tools
さまざまな形式のファイルが入り乱れるので、コマンドごとに何を扱っているのか意識して使う。

- avro-tools idl
    - AVDL から AVPR に変換する
- avro-tools idl2schemata
    - 格納されているスキーマから avsc ファイルを生成する
    - avsc 1 ファイルで検証ができるようにネストされた構造体は展開された状態になる
        - 展開されたファイルを手でメンテナンスするのは適していない
無職がElm勉強してタイピングゲームを作った話

趣味でプログラミングしていましたが、Elmを勉強しタイピングゲームを作ったので記事を書いてみたいと思いました。
よろしくおねがいします。

[これが作ったものです](https://pokosuko.work/typing1/)
[追加の別バージョン](https://pokosuko.work/typing1/#typeShortWord)
適当に試してみてください!

## Elmの難しさ
正直、自分は難しいと思いました。
関数型プログラミング言語に触れるのは初めてでそれが理由かどうかはわかりません。
うまく説明できないのですが、型です。
数学の公式をわけもわからず使って、調べてみたら難解だったというのと似てる気がします。

コンパイルエラーがたくさん親切に出てくれるので、慣れてしまおうと愚直にすすめることにしました。

恥ずかしながらいまだにHtml.mapのサンプルなどが理解できていません。


## タイピングゲームの難しさ
### パターンが多い
簡単なものなら「sushi」と表示させそれをそのまま入力させればいいのですが、「し」を「si」と入力したい人は困ってしまいます。
「ん」の処理となると「nn」「xn」「n」と3パターンの入力方法があります。
「ん」は厄介で、「んこ」だと「nko」で打てるのですが、「んよ」などは「nyo」では打てません。
「んっこ」だとこの3文字で30パターンくらいになります。

### テストを早めに作る
パターンが多すぎて手で入力できるか試してられないので、「これは入力可能」だから成功しなければならない、「これは入力不可能」だから失敗しなければならない、というものを簡単なものから追加していきました。

### Google日本語入力
[google_input](https://github.com/tomoemon/google_input)
この方法を知ったおかげでタイピングゲームを作ってみようという気になりました。
これと「基礎からわかる Elm」が出版されたことで開発が始まりました。
ありがとうございます。

実際には自分の理解が足りないのか苦労が多かったです。
高速化などは考えず実装しましたが、今のところ自分には問題ないように見えます。
[これがコードになります](https://github.com/GoldentTuft/TypingClub)

## ElmでSPA
SPAにする必要はあるのかとも思いましたが、勉強にもなるということでチャレンジしてみました。
どのような構造がいいのか変わって行き苦労しました。

### 共通情報をどうするか
各ページ共通で利用するかもしれないデータをどうするか悩みました。

```elm:Main.elm
type alias Model =
    { env : Env
    , page : Page
    }
```

このenvを各ページのinitとupdateに引数で渡してしまうことにしましたが、viewには渡していません。
理由があるわけではありません。
良い設計かどうかわからず、たぶんまた変わります。

```elm:Main.elm
update : Msg -> Model -> ( Model, Cmd Msg )
update msg model =
-- 略
        ( TypeLongWordMsg subMsg, TypeLongWordPage subModel ) ->
            let
                ( newModel, topCmd, newEnv ) =
                    Page.TypeLongWord.update subMsg subModel model.env
            in
            ( { model | env = newEnv, page = TypeLongWordPage newModel }
            , Cmd.map TypeLongWordMsg topCmd
            )
-- 略
```

### Parser
そのまま使うことはできそうですが型が追えなくてあきらめました。
かわりにfragmentで代用してしまうことにしました。

```elm:Main.elm
goTo : Url.Url -> Model -> ( Model, Cmd Msg )
goTo url model =
    let
        pEnv =
            model.env

        env =
            { pEnv | url = url }
    in
    case env.url.fragment of
        Just "post" ->
-- 略
```

しかし、後でクエリーからデータを取りたくなりページ内で結局使い「しまった」と思いました。

### 困りごと
現在あきらめてますが、ページが切り替わるとデータが消えてしまうということに気づきました。
編集ページ -> 別のページ -> 編集ページ(消えてる)

Urlでなく、ページからページへ直接データを渡すのもどうしようと悩んでいます。

## おしまい
愚直に進め過ぎで、Elmの真髄に触れていないままかもしれません。
かなり苦労もありました。
しかし最も好きな言語になりそうなので、さらにElmを勉強していきたいと思います。

ここまで読んでいただきありがとうございました。
ElectronでBrowserWindow側にメインプロセスの変数を引き渡す

# TL;DR

ElectronでBrowserWindow側にメインプロセスの変数を引き渡す際のやり方のメモ。

# 実装

以下、サンプルです。

Electronは`index.js`で開始し、その中でどこからか取得した文字列を`preload.js`経由でBrowserWindowに引き渡します。この例では定数で宣言しちゃっていますが。

```javascript:index.js
const electron = require('electron')
const app = electron.app
let mainWindow

// Electron起動時にグローバル変数を宣言しておく
global.hoge= "Hello World!"

app.on('ready', function () {
  let opt
  opt.webPreferences = {
    nodeIntegration: false,
    preload: `${__dirname}/preload.js`
  }
  mainWindow = new BrowserWindow(opt)
  mainWindow.loadURL(`file://${__dirname}/index.html`)

  mainWindow.on('closed', function () {
    mainWindow = null
  })
})
```

`BrowserWindow`が呼び出される前に実行される`preload.js`では、`remote.getGlobal()` を使ってグローバル変数を取得。

```javascript:preload.js
const { remote } = require('electron')
// リモートプロセス(Electronのメインプロセス)からグローバル変数を取得する。
global.hoge= remote.getGlobal('hoge')
```

ブラウザアプリ側では、`app.js`を読み込んで処理を行っているという想定だと、以下のように読み込んだ変数を利用できます。

```javascript:app.js
// preloadの段階ではまだNode.jsで動いているためグローバルはglobalだが、
// BrowserWindow側ではChroniumで動くのでグローバルはwindowとなる。
console.log(window.hoge)
```

他に別解はあると思いますが、まあこんなやり方もありますよ、ということで。
graphene メモ

`graphene` 自体で完成しているわけではなく、実は `graphene` の下に `graphql-core` や `graphql-relay` といったライブラリが潜り込んでいる。GraphQL はその生い立ちから JavaScript 環境下でよく利用されているので、graphql-core は移植版になっている。そのコアライブラリである `graphql` を、さらに python 的に使いやすくしたものが `graphene` となる。`graphene` のドキュメントで「記述が不足してるな」と思ったときは、実は下位ライブラリの説明部分だったりする。最終的には[リファレンス実装](https://graphql.org/code/#javascript)まで遡ると答えが見つかったりする。

graphene のフィールド定義手順は mixin で追加しやすいようになっている。クラス継承を使おうとすると落とし穴にはまるので、mixin のスタイルがおすすめ。

`graphene.relay` : relay 自体は GraphQL をベースとした追加仕様。広く使われているので、基本的に対応したほうが混乱が少ない。`Connection` と `Node` というインターフェースが目立つ。

# Node interface
`Node` では `id` から node query 経由で単体のオブジェクトが引ける。標準では見えないので、[必要に応じて用意](https://docs.graphene-python.org/en/latest/relay/nodes/#node-root-field)する。このようなアクセスパスが望ましくない場合（たとえばセキュリティ上の都合など）は、実装を省略すると良い。

`graphene.relay.Node` でアクセスしなくても `graphene.Node` でインポートできる。

# Connection interface
`Connection` の `total_count` は、ライブラリで非対応。別途手当しておくとトラブルが少ない。例えば graphene-sqlalchemy で query object から導出しないといけない場合があるので、あえて隔離してあるのだろうと推測される。

https://github.com/graphql-python/graphene/issues/776
https://github.com/graphql-python/graphene-django/issues/162

`relay.Connection` 対応では `relay.Node` 側のメタデータで `Node` interfaces 対応していることを宣言することになっている。
`graphene_sqlalchemy.SQLAlchemyConnection` では `Node` interface 宣言をいれると、二重定義を引き起こすので、うまいことやる（現状はハック的な対応で乗り切るのがよさそう）。

ConnectionField の第一引数は lambda: で遅延させると宣言順序の罠を抜け出せる。
PHP リファレンス

## リファレンスとは
・リファレンス（参照）とは、ある値を指し示すものをいう。
・変数のもつある値の格納領域を指し示す、別の名前をもつ変数のこと。

```php
<?php
$a = 10;
$b =& $a; 
//$aと$bは、どちらも10という値の格納された同じ領域を指し示す変数。
//$a が $b を 指しているわけではなく、その逆でもない。
```

##変数の再代入
・ある変数へのリファレンスとなっている変数に値を代入すると、リファレンスの指し示す変数の値が変更される。

```php
<?php
$a = 10;
$ref =& $a;
$ref = 20; //参照変数の再代入
echo $a, PHP_EOL; //20
```

##配列のリファレンス

```php
<?php
//値渡し
$arr = [1, 2, 3];
foreach( $arr as $v ){
   $v *= 2;
} 
print_r($arr);
/*
Array
(
    [0] => 1
    [1] => 2
    [2] => 3
)
*/

//リファレンス渡し
$arr = [1, 2, 3];
foreach( $arr as &$v ){
   $v *= 2;
} 
print_r($arr);
/*
Array
(
    [0] => 2
    [1] => 4
    [2] => 6
)
*/
```

##リファレンスの解除
・値の変数をunset()で破棄することで参照が解除される。


```php
<?php
$arr = [1, 2, 3];
foreach($arr as &$value){
    $value *= 2;
}

unset($value); //参照の解除

$value = 1000;

print_r($arr);
/*
Array
(
    [0] => 2
    [1] => 4
    [2] => 6
)
*/
```

##リファレンスの解除をしていないと

```php
<?php
$arr = [1, 2, 3];
foreach($arr as &$value){
    $value *= 2;
}

$value = 1000;

print_r($arr);
/*
Array
(
    [0] => 2
    [1] => 4
    [2] => 1000
)
*/
```
Laravel6+Laravel-Excel3.1でアップロードしたExcelファイルを解析して内容をDB登録する場合

あまりExcelファイルからのデータをDB取込する場合の情報がなかったので執筆

###準備

####依存対応
Laravelが動いてる環境でLaravel-Excelをインストールする際php-gdがないというエラーが出る場合がある為ない場合予めインストールしておく

```terminal
# yum install --enablerepo=remi-php73 php-gd
```
※php7.3を使用している場合

####ComposerでのLaravel-Excelのインストール

```terminal
$ composer require maatwebsite/excel
```

####ファサードを登録

```diff:config/app.php
    'providers' => [
+        Maatwebsite\Excel\ExcelServiceProvider::class,
    ],
    'aliases' => [
+        'Excel' => Maatwebsite\Excel\Facades\Excel::class,
    ],
```

####設定ファイルの生成

```terminal
php artisan vendor:publish --provider="Maatwebsite\Excel\ExcelServiceProvider"
```


###実行プログラム
※アップロードフォームおよびルーティングは省略

####インポートクラスの作成
Excel内のデータを配列に変換する場合のインポートクラス

```terminal
php artisan make:import DirectImport
```

```php
<?php
namespace App\Imports;
use Maatwebsite\Excel\Concerns\ToModel;
use Excel;
class DirectImport implements ToModel
{
    public function model(array $row)
    {
        return $row;
    }
}
```


####コントローラーでの処理

```php:app/Http/Controllers/XxxxxController
<?php
namespace App\Http\Controllers;
use App\Imports\DirectImport;
use Excel;
use Illuminate\Http\Request;
class XxxxxController extends Controller
{
    public function import(Request $request)
    {
        $file = $request->file('file');
        $book = Excel::toArray(new DirectImport(), $file->getPathname(),null,\Maatwebsite\Excel\Excel::XLSX);
        $sheet = $book[0];
        // $sheet[0][0] → A1セルなど必要な値を取り出してDBへ書き込む処理を行う
        //
        // …
        //
        return $request->all();
    }
}
```
量子コンピュータ（NISQ）のアルゴリズムを簡単に整理してみる【初心者】

#はじめに
量子コンピュータのアルゴリズムはたくさんありますが、今回は実用化が近いと言われているNISQのアルゴリズムについて理解を深めることにトライしたいと思います。

#量子コンピュータのアルゴリズム
量子コンピュータのアルゴリズムは以下の３つに大別できる。今回はNISQで使えるNear-Termアルゴリズムを対象とする。

|アルゴリズム分類|実行する量子コンピュータの方式／分類|
|---|---|
|量子アニーリング|量子アニーリング方式／量子アニーラ|
|Near-Term|ゲート方式／NISQ|
|Long-Term|ゲート方式／FTQC|

+ NISQ
Noisy Intermediate Scale Quantum Computer、ノイズのある中規模な量子コンピュータ

+ FTQC
Fault Tolerant Quantum Computation、エラー耐性量子コンピュータ

#Near-Tremアルゴリズム
代表的なNear-Termアルゴリズムについて整理する。
NISQ上での動作を想定していることから、求められる解はいずれも近似解である。

##VQE
###概要
+ Variable Quantum Eigensolver（変分量子固有値ソルバー）
+ 物質科学と量子化学への応用が期待されているアルゴリズム。
+ 物質の基底状態（安定した状態）を探索することで、その性質を明らかにすることができる。

###前提知識
+ 分子や物質の性質は電子の動きによって決まる。
+ 電子の状態はさまざまあるが、中でも基底状態（安定した状態）の性質が我々の関心事である。
+ 基底状態の電子の動きは、電子を支配する方程式である「シュレディンガー方程式」を解くことで求められる。
+ 方程式の解を求める際の問題点は、電子の数が増えると問題が指数的に難しくなることである。

###解へのアプローチ
+ 方程式の解を求める方法として「変分法」がある。
+ 変分法は古典コンピュータでも扱える計算である。
+ 量子コンピュータを用いることで、変分法の解をより効率的に計算するアルゴリズムが「VQE」である。


参考
https://dojo.qulacs.org/ja/latest/notebooks/5.1_variational_quantum_eigensolver.html
https://qiita.com/KeiichiroHiga/items/c900d430dc33d4342b24

##MDR社 湊氏によるVQEセミナー
[VQEセミナー](https://www.youtube.com/watch?v=wATJIICt6yQ)
[VQEセミナー２](https://www.youtube.com/watch?v=1NOHW5twnCA)
[VQEセミナー３](https://www.youtube.com/watch?v=xFImC57TZHM)
[VQEセミナー＃２－１（理論編）](https://www.youtube.com/watch?v=eqztdKhDGIs)


##QAOA

###概要
+ Quantum Approximate Optimization Algo（量子近似最適化アルゴリズム）
+ 量子ゲート方式で組合せ最適解問題を解く近似アルゴリズム。
+ QAA（Quantum Adiabatic Algorithm、量子断熱計算）という考え方がベースになっている。
+ 論文（MIT）：https://arxiv.org/abs/1411.4028

###参考
https://dojo.qulacs.org/ja/latest/notebooks/5.3_quantum_approximate_optimazation_algorithm.html
https://qiita.com/snhrhdt/items/ae55a94b25c06142528a

##QCL

###概要
+ Quantum Circuit Learning、量子回路学習
+ 量子コンピュータを機械学習に応用するためのアルゴリズム。
+ QCLは、ディープラーニングで利用されるニューラルネットワークを量子回路に置き換えた機械学習手法。

###メリット
+ 重ね合わせにより、指数関数的に多数の基底関数を利用してモデルを構成できる。（モデルの表現力が向上する）
+ 量子回路の満たすべき条件（ユニタリ性）により、自動的にオーバーフィッティング（過学習）を防げられる可能性がある。

###参考
https://dojo.qulacs.org/ja/latest/notebooks/5.2_Quantum_Circuit_Learning.html
https://www2.yukawa.kyoto-u.ac.jp/~qischool2019/mitaraiCTO.pdf
Dartのダブルドットな記法について

# ダブルドットで書いてあるコード
Dart特有の記法である..と言う記法。最初はなんて言う名前の書き方なのかさっぱり分からんで、こいつは一体何をしているのか分からなかったですが、**カスケード記法**と言うらしい。

## 使われ方
**同一オブジェクトに対して、複数の操作をする際に使う記法**だそうです。

### ユースケース1

```sample.dart
/*このように変数listに対して様々な処理を入れているコードは・・・*/
  var list = new List();
                    list.add(1);
  print(list);
                    list.add(2);
                    list.addAll([3,4,5,6,7,8,9,10]);
                    list.fillRange(0, 3, 99);
                    list[3] = 0;
                    list.removeLast();
  print(list);
```

```sample2.dart
/*カスケードで書き直すと、下記のようになる*/
 var list2 = new List()
                    ..add(1)
                    ..add(2)
                    ..addAll([3,4,5,6,7,8,9,10])
                    ..fillRange(0, 3, 99)
                    ..[3] = 0
                    ..removeLast();
  print(list2);
}
```
すっきりしたコードになっていますね。

こちらの記事から例としてのコードは拝借しました。個人的に1番理解しやすい例だったので。
[プログラミング言語Dart基礎](https://sbfl.net/blog/2013/09/18/dart-tutorial/)

### 注意点（但し、推測による考察）
じゃ、何でもかんでもカスケード記法を使って書けるかと言うと、実はそうではないです。

```sample3.dart
void main() {
  var a = "kujou joutarou";
    var b = a.substring(2,8);
    var c = b.replaceFirst('u','');
  print(a); /*出力結果=> "jo jo"*/
```

これをカスケード記法にしてやろうとすると、

```sample4.dart
void main() {
  var a = "kujou joutarou"
    ..substring(2,8)
    ..replaceFirst('u','');
  print(a); /*出力結果=> "kujou joutarou"*/
}
```

なんの処理もされていません。どうしてカスケードが効かないのかと言うと、それは扱う変数の
型にあると思って下記を書きましたが、どうもこの考察は間違っていました。

```
型にはミュータブルとイミュータブルの2種類が存在します。
文字列などの型は、操作すると、それは操作されたオブジェクトとして別の変数名で再定義しないと処理内容が保存されないイミュータブルなものであり、配列といったものは一旦操作すれば、別名でわざわざ再定義する必要なく、同一の変数名を使い回すことができます。
カスケード記法は**同一オブジェクトに対して、複数の操作をする際に使う記法**なので、同一オブジェクトに複数処理をかけることができないイミュータブルな型には使うことができないと言うことになると思います。
```
下記の記事がミュータブルとイミュータブルについてすごい分かりやすいです。
[ミュータブルな型とイミュータブルな型の相違を知ろう](https://qiita.com/makotoo2/items/fc3a617882916f9775f5)

正しくは、使用するメソッドの違いがあります。重要なのは、**インスタンスの内部状態が変化するかどうか**です。

言い換えると、『例で書いてるコードに使われたメソッドは加工された値返すだけで、その変数に代入されている値は変化しないでしょ？』と言うことで、もっと言うと、『非破壊的なメソッドだから変数にはなんも影響ないやろ？』ってことですね。

### ユースケース2
使用するメソッドがshuffleのように戻り値がなく、voidを返してしまう性質のメソッドだった場合、それでも操作結果を返して欲しいと思う時にも使えます。shuffleもレシーバにあたるインスタンスの値そのものを変更してしまう破壊的なメソッドであると言うことですね。

```sample5.dart
class _MyHomePageState extends State<MyHomePage> {
  static final _data = [
    Data('Apple',200),
    Data('Orange',150),
    Data('Peach',300)
  ];

  Data _item;

  @override
  void initState(){
    super.initState();
    _item = _data[0];
  }
  void _setData(){
    setState(() {
      _item = (_data..shuffle()).first;
    });
  }
```

## まとめ
と言うわけで、カスケード記法に関する使い方と気になったところのまとめでした。間違ってたらコメントください。お願いします。
神Controller とさよならするためにADRパターンでAPIを実装する（Laravel）


# これは何
ADRパターンを使った設計でAPIを作成する。
特にLaravelでの Routes, Action, Responder 実装方法について書く。

# 環境
* Laravel 6.x 
* PHP 7 

# ADRパターンとは
https://en.wikipedia.org/wiki/Action%E2%80%93domain%E2%80%93responder

> Action–domain–responder (ADR) is a software architectural pattern that was proposed by Paul M. Jones[1] as a refinement of Model–view–controller (MVC) that is better suited for web applications. 

ということで、MVCパターン類似のwebアプリを作るにあたりいい感じに使えるパターンです。

Paul M. Jones（pmjones）氏による説明: http://pmjones.io/adr/

# Laravel でADRパターンを実装する

### Action と Routing の実装
routing ではメソッド名ではなく、クラス名を指定します。

```routes/api.php
Route::get('/user_info', \App\Http\Api\User\Actions\InfoGetAction::class);
```

以下のように Actionを定義しておくと、メソッドとしてクラス名が呼ばれた時にはマジックメソッドの`__invoke()`が呼ばれます（コードはイメージです）。

```\App\Http\Api\User\Actions\InfoGetAction.php
class InfoGetAction extends Controller
{
    private $userDomainService;

    public function __construct(
        UserDomainService $userDomainService
    ) {
        $this->userDomainService = $userDomainService;
    }

    public function __invoke(Request $request)
    {   
        // user をとってくる
        $user = $this->userDomainService->get($request->input('id'));

        return new InfoGetResponder(
            $user->getName(),
            $user->getLocation()
        );
    }
```

これにより Action クラスには一つしかメソッドが生えない制約になるので、１アクション1メソッドになります。
APIにおいては、URLパスとクラス階層が対応しやすくなり管理しやすくなりますし、神Controllerが作られないメリットがあります。

### Responder の実装

```app/Http/Api/User/Responders/InfoGetResponder.php
class InfoGetResponder extends BaseResponder
{
    private $userName;
    private $userLocation;

    public function __construct(
        Name $name,
        Location $location
    ) {
        $this->userName = $name;
        $this->userLocation = $location;
    }
}
```

BaseResponder の実装は以下のようになっています。

```app/Http/Api/Shared/Responders/BaseResponder.php
abstract class BaseResponder implements Responsable
{
    public function toResponse($request): JsonResponse
    {
        return new JsonResponse(object_to_array($this));
    }
}
```

Responsable インターフェースを `implements` して `toResponse()` を実装しておくと、前述の Action における `return new InfoGetResponder()` により勝手に `toResponse()` を呼んでレスポンスにして返してくれます。
また、BaseResponder で戻り値を `JsonResponse` に固定してしまうことにより、Responder を実装した場合には Json しか返さないように縛れます。これは環境によって良し悪しだとは思いますが、自分たちしか使わないクローズなAPIの場合はデファクトのJsonに決めてしまって問題ないだろうと考えてこうなっています。

`object_to_array()` は再帰的にオブジェクトを array に変換してくれるメソッドです。 
レポジトリ： https://github.com/polidog/object-to-array


### レスポンスの例
この object を array にする形により、 /user_info にアクセスすると以下のようなレスポンスが帰ってきます。

```json
{
    "user_name": "yamotuki",
    "user_location": "tokyo"
}
```

レスポンスのjsonフィールドは Responder の引数で指定している `name` や `location` ではなくて、 Responder のクラスフィールドの以下のものを snake_case に変換したものになっています。

```php 
    private $userName;
    private $userLocation;
```

これにより、Responder を new するときにDomainを渡して、今後Domainのバリューオブジェクトの値がリファクタリングで変更されても、レスポンスフォーマットは変更されないようになっています。つまり、レスポンスの形式をドメインの実装と切り離すことができました。
緯度経度→地理インデックスの計算コード

# 背景

前回考えたZ階数曲線をベースにした地理インデックスの計算をUnityで使えるようにC#で書いてみる。
若干冗長なキャストがありそうだけど、以下コード。
bit_tableが1ビット置きに歯抜け配置に変換するためのテーブル。8ビット分をすべて用意して、4回に分けて32ビット分を処理している。
もし、簡単なビット演算だけでやる方法があったら教えてほしいです。

```GeoIndexCalc.cs
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class GeoIndexCalc
{
    private static ushort[] bit_table = new ushort[]
    {
        0,1,4,5,16,17,20,21,
        64,65,68,69,80,81,84,85,
        256,257,260,261,272,273,276,277,
        320,321,324,325,336,337,340,341,
        1024,1025,1028,1029,1040,1041,1044,1045,
        1088,1089,1092,1093,1104,1105,1108,1109,
        1280,1281,1284,1285,1296,1297,1300,1301,
        1344,1345,1348,1349,1360,1361,1364,1365,
        4096,4097,4100,4101,4112,4113,4116,4117,
        4160,4161,4164,4165,4176,4177,4180,4181,
        4352,4353,4356,4357,4368,4369,4372,4373,
        4416,4417,4420,4421,4432,4433,4436,4437,
        5120,5121,5124,5125,5136,5137,5140,5141,
        5184,5185,5188,5189,5200,5201,5204,5205,
        5376,5377,5380,5381,5392,5393,5396,5397,
        5440,5441,5444,5445,5456,5457,5460,5461,
        16384,16385,16388,16389,16400,16401,16404,16405,
        16448,16449,16452,16453,16464,16465,16468,16469,
        16640,16641,16644,16645,16656,16657,16660,16661,
        16704,16705,16708,16709,16720,16721,16724,16725,
        17408,17409,17412,17413,17424,17425,17428,17429,
        17472,17473,17476,17477,17488,17489,17492,17493,
        17664,17665,17668,17669,17680,17681,17684,17685,
        17728,17729,17732,17733,17744,17745,17748,17749,
        20480,20481,20484,20485,20496,20497,20500,20501,
        20544,20545,20548,20549,20560,20561,20564,20565,
        20736,20737,20740,20741,20752,20753,20756,20757,
        20800,20801,20804,20805,20816,20817,20820,20821,
        21504,21505,21508,21509,21520,21521,21524,21525,
        21568,21569,21572,21573,21584,21585,21588,21589,
        21760,21761,21764,21765,21776,21777,21780,21781,
        21824,21825,21828,21829,21840,21841,21844,21845
    };

    public static ulong calcIndex(double lat, double lon)
    {
        uint _lat = (uint)((lat + 90.0) * (double)UInt32.MaxValue / 180.0);
        uint _lon = (uint)((lon + 180.0) * (double)UInt32.MaxValue / 360.0);

        ulong index = 0;

		byte x_byte0 = (byte)(_lon & 0xFF);
		byte x_byte1 = (byte)((_lon >> 8) & 0xFF);
		byte x_byte2 = (byte)((_lon >> 16) & 0xFF);
		byte x_byte3 = (byte)((_lon >> 24) & 0xFF);
		index |= (ulong)bit_table[x_byte3] << 49;
		index |= (ulong)bit_table[x_byte2] << 33;
		index |= (ulong)bit_table[x_byte1] << 17;
		index |= (ulong)bit_table[x_byte0] << 1;
		byte y_byte0 = (byte)(_lat & 0xFF);
		byte y_byte1 = (byte)((_lat >> 8) & 0xFF);
		byte y_byte2 = (byte)((_lat >> 16) & 0xFF);
		byte y_byte3 = (byte)((_lat >> 24) & 0xFF);
		index |= (ulong)bit_table[y_byte3] << 48;
		index |= (ulong)bit_table[y_byte2] << 32;
		index |= (ulong)bit_table[y_byte1] << 16;
		index |= (ulong)bit_table[y_byte0];
        return index;
    }
}
```
ターミナルを見やすくして作業効率を上げよう！

# 概要
本記事では、ターミナルのテーマの変更やgitとの連携についてまとめています。
初期状態の見にくいターミナルから卒業しましょう！

## フォントを変更する
自分的に見やすいフォントは`SF Mono Regular`です。フォントサイズも大きくしておきましょう。

ターミナル -> 環境設定 -> プロファイル -> テキスト
<img width="667" alt="スクリーンショット 2019-12-25 13.17.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238466/ae828760-68f0-b8a7-b5f3-213b485ec7e0.png">


## テーマを変更する
デフォルトのテーマではなく、下記からクローンして読み込ませます。
http://cocopon.github.io/iceberg.vim/
下記の流れで読み込ませることができます。読み込ませたら、デフォルトに設定しておきましょう。

歯車マーク -> "読み込む..." -> クローンしたファイルを選択
![スクリーンショット 2019-12-25 13.20.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238466/4f3f13f9-bc16-d8de-1097-dabcb8a3cdca.png)

読み込ませたあと、背景(カラーとエフェクト)を編集してもっと見やすくしましょう。
不透明度、ブラーを編集します。
![スクリーンショット 2019-12-25 13.24.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238466/eab79db5-a2b5-7651-c072-307b0694095a.png)

ちなみに選択部分はこんな感じ。見やすい色にしてみてください。
![スクリーンショット 2019-12-25 13.37.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238466/99b6da7b-45fb-574d-3be0-10db9d5e8630.png)


## さらに色付け
`.bashrc`を編集してさらに色付けをしていきます。

```.bashrc
# default:cyan / root:red
if [ $UID -eq 0 ]; then
    PS1="\[\033[31m\]\h\[\033[00m\]:\[\033[01m\]\w\[\033[00m\]\\$ "
else
    PS1="\[\033[36m\]\h\[\033[00m\]:\[\033[01m\]\w\[\033[00m\]\\$ "
fi

# "-F":ディレクトリに"/"を表示 / "-G"でディレクトリを色表示
alias ls='ls -FG'
alias ll='ls -alFG'
```

編集したら、読み込ませるために下記を実行してください。
`$ source ~/.bashrc`

これで、このように色がついたと思います。
![スクリーンショット 2019-12-25 13.28.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238466/998d17b9-5ae8-2beb-d3f5-a65e8e6cbd2b.png)

## gitのリポジトリ・ブランチ名を表示させる
先ほどの編集ではgitのリポジトリ名・ブランチ名は表示されません。
"作業するブランチをよく間違えてしまう・・"とかの悩みを抱えている人はさらに編集していきましょう。

```.bashrc
# gitの設定
source /usr/local/etc/bash_completion.d/git-prompt.sh
source /usr/local/etc/bash_completion.d/git-completion.bash
GIT_PS1_SHOWDIRTYSTATE=true

# default:cyan / root:red
if [ $UID -eq 0 ]; then
    PS1='\[\033[31m\]\h\[\033[00m\]:\[\033[01m\]\w\[\033[31m\]$(__git_ps1)\[\033[00m\]\\$ '
else
    PS1='\[\033[36m\]\h\[\033[00m\]:\[\033[01m\]\w\[\033[31m\]$(__git_ps1)\[\033[00m\]\\$ '
fi

# "-F":ディレクトリに"/"を表示 / "-G"でディレクトリを色表示
alias ls='ls -FG'
alias ll='ls -alFG'
```

編集をし終わったら、先ほどのコマンドを再実行してください。
`$ source ~/.bashrc`

これで、リポジトリ名・ブランチ名が表示されると思います。
試しに何かしらのリポジトリにうつってみてください！

## 終わりに
まだまだ自分の理想に近づけたい・・！という人は`.bashrc`を編集して、かっこよく効率よく作業できる環境を作ってみてください！
React の state を配列やオブジェクトにするときの変更方法

# はじめに

この記事は [CodeChrysalis Advent Calendar 2019](https://qiita.com/advent-calendar/2019/codechrysalis) の記事です。

@elia が投稿を試みたのですが、なぜかスパム扱いされるので代理で投稿します（英語だからか…？）。
Eliaはアメリカ人で私のイマーシブのクラスメイトです。卒業後はIoTの会社でPython+Djangoを使ったり、現在は医薬系の会社でReactを使ったりしているそうです。

## Get started!

This article describes how to do some simple cases for updating arrays and objects on events.
この記事ではイベントが発火したときにstateの配列やオブジェクトを変更する初心者向けのシンプルなケースを紹介します。

A common feature is updating a string based on an input.
A code snippet below to do that is:

よくあるのはインプットに基づいて文字列のstateを変更するものですね。コードスニペットは以下です。

```js
const App = () => {
  const [theString, setTheString] = useState("");
  const handleChangeString = event => {
    setTheString(event.target.value);
  };
  return (
    <div className="App">
      String input: {theString}
      <input type="text" value={theString} onChange={handleChangeString} />
    </div>
  );
};
```

Now to show the case for an array, add this code snippet in the App component:
では配列のstateをどう変えるのか、componentのコードスニペットを紹介します。

[spread operator](https://javascript.info/rest-parameters-spread-operator)を使っています。

```js
const [theArray, setTheArray] = useState([
    "",
    { color: "red", code: "" },
    "stan"
  ]);

const handleChangeArray = event => {
  event.persist();
  const name = event.target.name;
  const value = event.target.value;
  setTheArray(prev => ([...prev,  value ]));
};

return (
  <p>
    Array 
    <input
      type="text"
      name={theArray[theArray.length]}
      value={theArray[theArray.length]}
      onChange={handleChangeArray}
    />
  </p>
);
```

Now to show the case for an object, to update the key test and it’s value, add this code snippet in the App component:

ではstateをオブジェクトにした場合を見てみましょう。`key` というプロパティの値を変更してみます。コードスニペットは以下のとおりです。

こちらも[spread operator](https://javascript.info/rest-parameters-spread-operator)を使っています。

```js
const [theObject, setTheObject] = useState({
  power: ["Lightning", "Strength"],
  name: { test: "", error: null }
});
const handleChangeObject = event => {
  event.persist();
  const name = event.target.name;
  const value = event.target.value;
  setTheObject(prev => ({
    ...prev,
    [name]: value
  }));
};
return (
  <p>
    Object
    <input
      type="text"
      name={theObject.name.test}
      value={theObject.name.test}
      onChange={handleChangeObject}
    />
  </p>
);
```

# さいごに

To update nested arrays or objects, you can follow the similar process. Be careful about the nested properties since it can be confusing. This is the reason where something like useReducer separates the updates easier and is recommended.

もし配列やオブジェクトをネストしていても同じように考えます。ただしネストさせるととてもバグを生みやすくなるので注意してください。もしネストする場合やそもそもオブジェクトをstateで使わないといけない場合は、`useReducer`の出番になります。
[JavaScript/TypeScript] flat()を使わずに配列をflattenする

`[[0, 1], 2, [3, 4]]` のようなネストしたりしなかったりする配列をフラットにしたい場合、ES2019 以降だと `Array.prototype.flat()` が使えるけど Node.js 10 は対応してないので他の方法を考えた。（意外と簡単だった）

```ts
const nested = [[0, 1], 2, [3, 4]]
const flat = [].concat(...nested) // => [0, 1, 2, 3, 4]
```

スプレッド演算子を使うと `[].concat([0, 1], 2, [3, 4])` のように呼び出してくれるので結合されてフラットな配列になります。
Reduxで1つのstoreを2つのrenderで共有する

例えば既存のサイトに、部分的にReact/Reduxを導入したい場合、さらにはUI的にあちこちにコンポーネントが点在している場合（ボタン押してモーダル出すとか）、どう作るか？

答えは単純に**複数回renderして同じstoreを渡せばいい**
（ググってもサンプルが出てこなかったので残しておきます。どうってことない内容ですが...）

```HogeAndFugaApp.js.jsx
import React from "react";
import ReactDOM from "react-dom";
import { connect, Provider } from "react-redux";
import { bindActionCreators, createStore, applyMiddleware } from "redux";
import createSagaMiddleware from "redux-saga";
import { createLogger } from "redux-logger";
import reducer from "./reducers";
import { commonAction } from "./actions";
import HogeComponent from "component/HogeComponent";
import FugaComponent from "component/FugaComponent";

/*globals process */
const logger = [];
if (process.env.NODE_ENV === "development") logger.push(createLogger());

const configureStore = () => {
  const sagaMiddleware = createSagaMiddleware();
  const store = createStore(
    reducer,
    applyMiddleware(sagaMiddleware, ...logger)
  );
  sagaMiddleware.run(rootSaga);
  return store;
};
const store = configureStore();

const mapStateToProps = (state) => ({
  commonProps: state.common,
});
const mapDispatchToProps = (dispatch) => ({
  commonAction: bindActionCreators(commonAction,dispatch)
});


const HogeApp = connect(mapStateToProps,mapDispatchToProps)(HogeComponent);

ReactDOM.render(
  <Provider store={store}>
    <HogeApp/>
  </Provider>,
  document.querySelector("#js-hoge")
);

const FugaApp = connect(mapStateToProps,mapDispatchToProps)(FugaComponent);

ReactDOM.render(
  <Provider store={store}>
    <FugaApp/>
  </Provider>,
  document.querySelector("#js-fuga")
);

```

だらだら1ファイルで書いてしまいましたが、要は`HogeApp`と`FugaApp`で同じstoreを参照し、それぞれ`document.querySelector()`でrenderしてるだけです。
同じcomponentを複数回renderするなら`Array.from(document.querySelectorAll("targetDom"))`でeach回してrender出来るはずです。

誰かの参考になればm(__)m
エッジで使う端末用にwheelを作ったときのメモ

# 背景
- エッジ端末でPython3を使って色々する
- armv7とかaarch64向けのwheelがPyPIにない（事が多い

# とりあえずスクリプトにしてみる
```bash:make_wheel_from_tarball.sh
#!/bin/bash
# coding: utf-8

for pathfile in ./*.tar.gz ; do
	tar zxvf $pathfile

	# python3 ${pathfile%.*}/setup.py bdist_wheel

	dir=${pathfile%.*.*}/
	cd $dir
	python3 setup.py bdist_wheel

	whl=`find ./ -iname *.whl`
	mv $whl ../

	cd ../
	rm $pathfile
	rm -r $dir
done
```

実行してtarballからwheelができることを確認。
なぜかエラーになったやつの対処をググる。

# invalid command 'bdist_wheel'のエラーが出る時

解凍したtarballの`setup.py`を1行変更すればOK

```Python3:setup.py
#from distutils.core import setup
from setuptools import setup
```

# あとがき

- エッジ端末で使う場合は複数端末に同じライブラリを入れるので、多少面倒でもwheelを作っておいたほうが展開が楽
  - pipで毎回ビルド走るより、wheel作って`/tmp`とかに展開して`pip3 -r requirements.txt`するほうが早い
- 基本tarballだから決め打ちにしたけど、zipも判定に入れたほうがいいかも
- どうせなら`setup.py`のパッチもスクリプト化したほうｇ（ｒｙ
ilasmでstack machine その3

# 概要

ilasmでstack machineやってみた。
俺言語、プリプロセッサ作って見た。

# 俺言語サンプルコード


```

    pushi   1
    set     i
loop:
    get     i
    pushi   100
    if<     bye
    get     i
    pushi   15
    %
    if      fizzbuzz
    get     i
    pushi   5
    %
    if      buzz
    get     i
    pushi   3
    %
    if      fizz
    get     i
    call    printi
    jp      tugi

fizzbuzz:
    push    "fizzbuzz"
    jp      print
buzz:
    push    "buzz"
    jp      print
fizz:
    push    "fizz"

print:
    call    prints

tugi:
    get     i
    pushi   1
    +
    set     i
    jp      loop

bye:
    ret



```


# プリプロセッサ処理後

```
 
.assembly fizzbuzz {}
.method static void main() {
.entrypoint
.locals init(int32 i)
    ldc.i4   1
    stloc     i
loop:
    ldloc     i
    ldc.i4   100
    bgt     bye
    ldloc     i
    ldc.i4   15
    rem
    brfalse      fizzbuzz
    ldloc     i
    ldc.i4   5
    rem
    brfalse      buzz
    ldloc     i
    ldc.i4   3
    rem
    brfalse      fizz
    ldloc     i
    call    void [mscorlib] System.Console::WriteLine(int32)
    br      tugi

fizzbuzz:
    ldstr    "fizzbuzz"
    br      print
buzz:
    ldstr    "buzz"
    br      print
fizz:
    ldstr    "fizz"

print:
    call    void [mscorlib] System.Console::WriteLine(string)

tugi:
    ldloc     i
    ldc.i4   1
    add
    stloc     i
    br      loop

bye:
    ret

}

```

# 成果物

https://embed.plnkr.co/okDdF3lzVwXwemOAVd7y/

以上。
ATLAS-SoCで遊ぶ (Lチカ part2)

###目的
[前回](https://qiita.com/qroquis/items/b2b0d186256f8fca188b)の動作確認時に使用したDE0_NANO_SOC_Default.vの一部を改変してLEDカウンタを作成する。
評価ボードの動作クロックが50MHzなのでカウント動作が目で追えるように分周し、その信号をそのままLEDに使用する。

###実施
とりあえず8bitカウンタを導入したときの波形の様子をmodelsimで確認する。
テストベンチはQuartusPrimeの「test bench template writer」をベースに作成
![test2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555882/777df1f4-d15f-499a-7f59-c0ce36a0ff81.jpeg)
テンプレートデータは下記ディレクトリに生成される。
./{作業ディレクトリ}/simulation/modelsim/{verilogファイル名}.vt
これを行うことでテストベンチ作成の際に必要となる信号名入力の作業が省ける。

```ruby:DE0_NANO_SOC_Default.vt
---------省略----------------
`timescale 1 ps/ 1 ps
module DE0_NANO_SOC_Default_vlg_tst();
// constants                                           
// general purpose registers
reg eachvec;
// test vector input registers
reg ADC_SDO;
reg FPGA_CLK1_50;
reg FPGA_CLK2_50;
reg FPGA_CLK3_50;
reg [35:0] treg_GPIO_0;
reg [35:0] treg_GPIO_1;
reg [1:0] KEY;
reg [3:0] SW;
// wires                                               
wire ADC_CONVST;
wire ADC_SCK;
wire ADC_SDI;
wire [35:0]  GPIO_0;
wire [35:0]  GPIO_1;
wire [7:0]  LED;

// assign statements (if any)                          
assign GPIO_0 = treg_GPIO_0;
assign GPIO_1 = treg_GPIO_1;
DE0_NANO_SOC_Default i1 (
// port map - connection between master ports and signals/registers   
	.ADC_CONVST(ADC_CONVST),
	.ADC_SCK(ADC_SCK),
	.ADC_SDI(ADC_SDI),
	.ADC_SDO(ADC_SDO),
	.FPGA_CLK1_50(FPGA_CLK1_50),
	.FPGA_CLK2_50(FPGA_CLK2_50),
	.FPGA_CLK3_50(FPGA_CLK3_50),
	.GPIO_0(GPIO_0),
	.GPIO_1(GPIO_1),
	.KEY(KEY),
	.LED(LED),
	.SW(SW)
);
---------省略----------------
```
テンプレートデータを用いてクロック部に信号を入れてやった時のテスト波形がこちら
![test2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555882/0320cec7-0960-2b61-583c-30700173618e.jpeg)
KEY はDFFのイネーブル信号です。芸はないけど気にしない:stuck_out_tongue_winking_eye:

後はLEDの点滅が目で追えるように分周部を8bitから32bitに変更して上位ビット分をLEDに繋げる。

```ruby:DE0_NANO_SOC_Default.v

---------省略----------------
reg  [31:0]	Cont;

always@(posedge FPGA_CLK1_50 or negedge KEY[0])
begin
      if(!KEY[0])
           Cont	<=	0;
      else
           Cont	<=	Cont+1;
end
	
assign LED[7:0] = Cont[31:24];

endmodule
```
以上。

期待通りLEDのカウントアップ動作が確認できました。

###参考本
[入門Verilog HDL記述―ハードウェア記述言語の速習&実践 (Design wave basic) ](https://www.amazon.co.jp/入門Verilog-HDL記述―ハードウェア記述言語の速習-Design-wave-basic/dp/4789833984/ref=pd_bxgy_14_img_3/356-9129388-7092708?_encoding=UTF8&pd_rd_i=4789833984&pd_rd_r=c135bc1e-1e6f-41c9-bc81-68c9122d332c&pd_rd_w=BvUl7&pd_rd_wg=yJSrZ&pf_rd_p=b25bd748-082b-4f2a-b724-125316a35a9c&pf_rd_r=F9N5H7KYHHPR92B2EM1W&psc=1&refRID=F9N5H7KYHHPR92B2EM1W)
[Verilog HDL&VHDLテストベンチ記述の初歩 (DESIGN WAVE MOOK)](https://www.amazon.co.jp/Verilog-VHDLテストベンチ記述の初歩-DESIGN-WAVE-MOOK/dp/4789831086)
Deeplensのパスワード初期化

# deeplensのパスワードがわからない！

Advent calendarの記事にするべく、久しぶりにdeeplensを起動したところ


<img width="1000" alt="スクリーンショット 2019-12-23 20.33.30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326414/2c926bcb-338a-9b60-4f38-c226f5971c9b.png">

ログインパスワードを失念してしまったようだ
deeplens本体にはresetボタンがあるのでリセットで初期化されると思っていたが、そんなに甘くはなかった。

<blockquote>Resetting device password is no longer possible if you don't remember the password you set. To recover from this, you will need to reset your DeepLens device to Factory Settings. Instructions to do this are provided here: 
https://docs.aws.amazon.com/deeplens/latest/dg/troubleshooting-device-software.html#troubleshooting-device-software-factory-settings<br><BR>(https://forums.aws.amazon.com/thread.jspa?messageID=879947)</blockquote>


詰んだ

という訳で、急遽deeplensを工場出荷時に戻すこととなりました。
マニュアル（ https://s3.amazonaws.com/deeplens-public/factory-restore/DeepLens_System_Restore_Instruction.pdf ）を見てみると

USB diskが必要だったので、amazonで注文。
HDMI出力も欲しいなと思い、microHDMI⇄HDMI変換ケーブルもついでに購入。
到着までしばしおあずけとなりました。



##Deeplensの初期化
![d7d6991da525cd37228c50a229acaf80.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326414/24bfa2c5-04f2-364e-c88f-0e92001684a4.jpeg)


####USB diskをパーテーションを２つに分けて、起動パーテションにubuntuを入れる。
MacでUSBディスク上にmbr付きパーテションが作れなかったので、Windows上でRuFusを使って作成。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326414/3593865b-c251-f91a-2e0d-a6aeb7693729.png" width=40%>
２つ目のパーテションにはfactory restore packageを入れる。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326414/a158dd96-8a7b-8ded-1b3b-0de0b861daaf.png">
なんだかいろいろ面倒です。

諸々の機器を接続し、BIOS起動してUSBディスクからboot
あとは自動で、初期化プロセスが起動し、あっという間に出荷時に戻りました。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326414/3d5ff864-ddb7-4bc0-500d-95c7b7cb43e5.jpeg" width=50%><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326414/56023cdf-d873-1da9-e078-90d0ad17ed70.jpeg" width=50%>
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326414/b5c369e4-4810-2fa6-6aa3-acf51798e3d5.jpeg" width=７0%>




##祝 復旧

<img width="1314" alt="スクリーンショット 2019-12-25 12.10.17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326414/648b0487-1295-6737-d4b7-579d00a905d0.png">

復旧し、デバイスの登録もできました。


<hr>
ここまででかなり時間を費やしてしまいました。
もともとやりたかった、kinesisストリームへ動画を流し、機械学習とか。
tensorflowを使って学習させ、そのモデルをdeeplensへデプロイとか。
休み中に余裕があれば、また書きます。
[php]シンプルなRSSのサンプル

RSSのサンプルを実装してみましたので
自分用メモとして残します。
特に説明は載せませんので、詳しく知りたい方は
下記参考サイトを参照してください。

参考
[【PHP入門】完全マスター!XMLを自由自在に扱う方法まとめ](https://www.sejuku.net/blog/53590)

[RSS配信している人気サイト一覧](https://berss.com/feed_channel.html)

# コード全文

```php
<?php
    $val_datas = array();
    $xml = simplexml_load_file('http://www.soumu.go.jp/news.rdf');

    foreach($xml as $val) {
        $x = array();
        $x['title'] = (string)$val->title;
        $x['link'] = (string)$val->link;
        $val_datas[] = $x;
    }
    // echo '<pre>';print_r($val_datas);echo '</pre>';
    // echo '<pre>';print_r($xml);echo '</pre>';
?>

<!DOCTYPE html>
<html lang="ja">
    <head>
        <meta charset="utf-8">
        <title>XML | RSS</title>
    </head>
    <body>
        <div class="contents">
            <?php foreach($val_datas as $val_data): ?>
                <div class="rss-set">
                    <div class="rss-title"><?= $val_data['title']; ?></div>
                    <div class="rss-link"><a href="<?= $val_data['link']; ?>" target="_blank"><?= $val_data['link']; ?></a></div>
                </div>
            <?php endforeach ?>
        </div>
    </body>
</html>

<style>
* {
    margin: 0;
    padding: 0;
    box-sizing: border-box;
}
a {
    color: #4169e1;
    text-decoration: none;
}
body {
    background: #fcfcfc;
}
.contents {
    width: 75%;
    margin: 50px auto;
}
.contents .rss-set {
    font-size: 14px;
    margin: 0 0 15px 0;
    padding: 20px;
    background: #eee;
}
.contents .rss-set .rss-link {
    overflow-wrap: break-word;
}
</style>
```

# [CDATA] SimpleXMLElementの使い方
[参考](https://www.terakoya.work/rss-xml-namespace-cdata-get/)


```php
<?php
    $rss_url = "http://tor-acofes.com/blog/feed/";
    $rss_data = simplexml_load_file( $rss_url, 'SimpleXMLElement', LIBXML_NOCDATA );
?>

<!DOCTYPE html>
<html lang="ja">
    <head>
        <meta charset="utf-8">
        <title>XML | RSS</title>
    </head>
    <body>
        <div class="contents">
            <?php foreach ( $rss_data->channel->item as $item ): ?>
                <div class="rss-set">
                    <div class="rss-title"><?= $item->title; ?></div>
                    <div class="rss-description">
                        <?= mb_substr($item->description, 1, 100); ?>
                        <a href="<?= $item->link; ?>" target="_blank">… 続きを読む →</a>
                    </div>
                    <div class="rss-date">
                        <?php
                            $datetime = date("Y.n.j", strtotime($item->pubDate));
                            echo $datetime;
                        ?>
                    </div>
                </div>
            <?php endforeach ?>
        </div>
    </body>
</html>

<style>
* {
    margin: 0;
    padding: 0;
    box-sizing: border-box;
}
a {
    color: #4169e1;
    text-decoration: none;
}
body {
    background: #fcfcfc;
}
.contents {
    width: 75%;
    margin: 50px auto;
}
.contents .rss-set {
    font-size: 14px;
    margin: 0 0 15px 0;
    padding: 20px;
    background: #eee;
}
.contents .rss-set .rss-link {
    overflow-wrap: break-word;
}
</style>
```
改行コードでハマった話　No such file or directory'nt execute 'ruby

#ハマった経緯
業務で既存サイトの改修、リニューアルを行っているのですが、
既存サイトは別会社が作成したためソースを引き継ぎdockerを起動。
docker-compose build --no-cache　問題なくビルド完了！続いて
docker-compose up -d　を実行した際エラーが発生！！
docker logs コンテナ名　でlogを確認！！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319089/22ae81f8-9b3c-b164-bbda-73267cdff845.png)

「No such file or directory'nt execute 'ruby」
なんか文字もおかしい。。webpackのファイルもちゃんとあるのに
なんで無いと言われるんだろう？？

##原因
タイトルでお察しのとおり原因は改行コードが違っておりファイルが読み込めないということでした。先方はmac,こちらはwindow。違いは下記参考サイトが纏まっておりましたので確認してみてください。
https://qiita.com/uhooi/items/dc74ff3434aecb17faa2
##解消
webpack関連ファイルの改行コードをLFからCRLFに変更。
エディタ右下(vscodeの場合)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319089/7e88fb83-8eb2-d232-fbec-ad5cecbeda71.png)

レアなケースかもしれませんがお役に立てればと思います。
UnityプロジェクトのGitHub管理をGUIだけで導入する

# 初投稿です！
本題に入る前に、軽く自己紹介。

[N高通学コース](https://nnn.ed.jp/commute_course/)でプログラミング講師をしているgousyanと申します。 
日々の授業での問題解決のために取り組んだ事だったり、個人的な技術研磨を記事にしたいと思います。

# この記事の意図
ゲーム制作に興味がある生徒達がプログラミングに取り組む際、Unityを使用する事が大半だったりしますが、
Unity本体やAssetのバージョン違い等が元となるエラーに悩まされ、弄っているうちにプロジェクトごと壊れた:sob:
…といった事例が度々見受けられました。

Unityからプログラミングを始めた初心者が、GUI操作だけで簡単にバージョン管理ツールを導入できないだろうか？
と考え、導入方法を検討した結果を以下で紹介させて頂きます。

※バージョン管理自体の説明は省きます
※GitHubアカウントは作成済なものとします

## ターゲット
- Unity使い
- GUIだけで簡単にプロジェクト管理したい人

## 手順１  Sourcetreeの導入（初回だけ）
[Sourcetree](https://www.sourcetreeapp.com/)はGUIで操作できるGitクライアント。Sourcetreeを起動して以下の初期設定を行います。
<img width="1267" alt="スクリーンショット 2019-12-25 11.50.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549772/a5db2c77-44c7-5140-bf8c-dcd33402b9b7.png">
## 手順2  GitHub fot Unityの導入
GitHubリポジトリを生成するのに使用するAsset。Unityプロジェクト上で以下の作業を行います。
<img width="1300" alt="スクリーンショット 2019-12-25 12.29.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549772/f85de1c8-46f0-3d0c-a0e8-16a87f6d1105.png">
## 手順3  GitHubリポジトリ作成
GitHub for Unityからリポジトリを作成します。Unityプロジェクト上で以下の作業を行います。
<img width="1145" alt="スクリーンショット 2019-12-25 12.30.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549772/6e48606f-167c-66bd-71c1-b3f1f4cb853b.png">
## 手順4  Sourcetreeへの登録
Sourcetreeのローカルへ登録してからコミット＆GitHubへプッシュします！
<img width="1330" alt="スクリーンショット 2019-12-25 12.51.13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549772/a44ac957-ab49-20b2-4b7e-2390188be01b.png">
## できあがり！
GitHub上にリポジトリが作成され、全ファイルが登録されていれば導入完了！
![スクリーンショット 2019-12-18 16.38.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549772/76c371bf-30db-e1fc-cdf4-5284027f734e.png)
## Ｗｈｙ？
- なぜGitHub for Unityだけを使用しないの？
 - GitHub for Unityの挙動が怪しい場合あり
 - プロジェクト自体が壊れても対処が容易
 - Sourcetreeのほうが操作性が良い(個人的感想)
- なぜSourcetreeだけを使用しないの？
 - 初期コミットまでの設定が面倒だから

# 最後に
導入はここまで。
Sourcetreeでの実際の運用にあたっては他にも記事があるので割愛させて頂きます。
Splunkで統計を勉強する（正規分布Normal distribution）

#正規分布
[wikipedia](https://ja.wikipedia.org/wiki/%E6%AD%A3%E8%A6%8F%E5%88%86%E5%B8%83)
:sweat: これがわかるなら、勉強は必要ないと思う。

##標準正規分布
```math
f(x) = \frac{1}{\sqrt{2\pi \sigma^2}} \exp \left(-\frac{(x - \mu)^2}
{2\sigma^2} \right) \hspace{20px} (-\infty < x < \infty)
```
のうち標準正規分布は平均０、標準偏差１のものなので

```math
f(x) = \frac{1}{\sqrt{2\pi}} \exp \left(-\frac{x^2}
{2} \right) \hspace{20px} (-\infty < x < \infty)
```
##ベルカーブ
```R:standardNormalDistribution.r
x<-seq(-4,4,0.1)
curve(dnorm(x,0,1),from=-4,to=4,type="l")
```
なので、これをSplunkでやってみる。

```Splunk:SPL
| makeresults count=81
| streamstats current=f count as x
| eval x = x * .10 - 4.0
| eval y= 1 / exact(sqrt(2*pi())) * exact(exp(pow(x,2) * -0.5))
| table x y
```
##解説

1. `| makeresults count=81`
 - -4〜0〜4を0.1区切りで作成する必要があるため81個の行を作成
2. `| streamstats current=f count as x`
 - **x**として0〜80までの数字を作成。_current=f_がないと1〜81となる。
3. `| eval x = x * .10 - 4.0`
 - -4.0から0.1区切りで作成するため、0.10をかけ、−4.0を引いた。<br>0を追加しているのは表示桁数を揃えるため。ここらへんがプログラムっぽい。
4. `| eval y= 1 / exact(sqrt(2*pi())) * exact(exp(pow(x,2) * -0.5))`
 - 公式通りに計算。[exact](https://docs.splunk.com/Documentation/Splunk/8.0.0/SearchReference/MathematicalFunctions#exact.28X.29)がないと切ないグラフになる。
5. `| table x y` 
 - **x**と**y**の表とする。

####x作成方法
```Splunk:SPL
| makeresults 
| eval x=split("-4.0,4.0",",")
| stats count by x
| makecontinuous span=0.1 x
```
なんかできるかなと思ったらできた。総数がわからないときはこっちでいいと思う。
##68%-95%-99.7%の法則
```Splunk:SPL
| makeresults 
| eval x=split("-4.00,4.00",",")
| stats count by x
| makecontinuous span=0.01 x
| eval y= 1 / exact(sqrt(2*pi())) * exact(exp(exact(pow(x,2)) * -0.5))
| table x y
| eval z=if(abs(x) <= 1,y,NULL)
```
![qiita.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130729/0a95692a-0aec-d06f-1693-4c7f69f9fc68.png)
確率変数Zとしたときの確率P（-1<=Z<=1)の図
このようにZの値を変えて、法則通りの値がでるか試してみる。

```Splunk:SPL
| makeresults 
| eval x=split("-4.00,4.00",",")
| stats count by x
| makecontinuous span=0.01 x
| eval y= 1 / exact(sqrt(2*pi())) * exact(exp(exact(pow(x,2)) * -0.5))
| table x y
| eval z1=if(abs(x) <= 1,y,NULL), z2=if(abs(x) <= 2,y,NULL),z3=if(abs(x) <= 3,y,NULL)
| stats sum(*) as *
| foreach y z* 
    [eval P<<MATCHSTR>>=z<<MATCHSTR>> / y * 100]
| table P*
```

P1|	P2|	P3|
--:|--:|--:|
68.51467376653717|	95.5095796320241|	99.74048181694857
それなりの値がでた。
やってみると下４桁（0.0001）で行数が多すぎですよのエラーがでた。
#まとめ
グラフ書いたら満足したので、一旦締め。
この項はいろいろ勉強しないといけないので、更新していきます。
CDNに頼りっきりだっためんどくさがり屋による vue-cliで作るPWA製作環境構築

　個人でPWA作るのは好きなのですが、レンタルサーバだと大概 `Node.js` に対応しないので、いろいろためらってたのですが、 `Vue-cli` を使えば解決することがようやく解ったので、環境の作り方などを書き置きします。

# Vue-cliにするとどうなる？
　CDNを利用すると、まれに`Webpack`（Webアプリの最適化を行うもの）のバージョン違いなどにより `Vueコンポーネント` を直接使えなかったりする制約が出てくるのですが、普通にVue.jsで作ろうとすると、今度はサーバ側に`Node.js`を求められてしまいます。（もちろんサーバ側が対応していればもっと恩恵を得られるようですが…）
　サーバ側に`Node.js`が無い場合に制作に使うのが`Vue-cli`と言う物のようです。

# 必要な開発環境
- Node.jsが使える開発環境（ `nodebrew` `npm` が使える前提で）
    - 個人的には `macOS` で `Homebrew`をインストールしてから `nodebrew` をインストール
- 開発環境（ 個人的には `IntelliJ IDEA`使ってます。 ）
- ChromeブラウザとVueプラグイン（デバッグで結構使う）

# 開発環境にnpmでvue-cliを入れる
```sh
$ npm install -g @vue/cli
+ @vue/cli@4.1.1

$ npm install -g @vue/cli-service-global
+ @vue/cli-service-global@4.1.1
```
# プロジェクトを作る
　プロジェクトの作り方は、テンプレート的に覚えておいた方が楽です。

　プロジェクト名は仮に`my-first-pwa`と名付けましょうか

```ｓｈ
$ vue create my-first-pwa
```

　初っぱなに`Manually` を選ばないとPWAプロジェクトににならないので注意

```sh
Vue CLI v4.1.1
? Please pick a preset: 
  default (babel, eslint) 
❯ Manually select features 
```
```sh
Vue CLI v4.1.1
? Please pick a preset: Manually select features
? Check the features needed for your project: 
 ◉ Babel
 ◯ TypeScript
 ◉ Progressive Web App (PWA) Support
❯◉ Router
 ◉ Vuex
 ◉ CSS Pre-processors
 ◉ Linter / Formatter
 ◯ Unit Testing
 ◯ E2E Testing
```
```sh
? Use history mode for router? (Requires proper server setup for index fallback 
in production) (Y/n) 
```
# Workbox-cliを入れる

　PWAを作る場合、`service-worker.js` とか `sw.js` とかを作成する必要がありますが、お手軽に作るなら`Workbox`という物がありますので入れておいた方が楽です。

```sh
$ npm install workbox-cli --global

npm WARN deprecated core-js@2.6.11: core-js@<3 is no longer maintained and not recommended for usage due to the number of issues. Please, upgrade your dependencies to the actual version of core-js@3.
+ workbox-webpack-plugin@4.3.1
updated 1 package and audited 29251 packages in 8.042s

19 packages are looking for funding
  run `npm fund` for details

found 0 vulnerabilities
```
なんか `core-js`が古いとかで怒られるのでとりあえず下記コマンドを…

```sh
$ npm install core-js@^3
```

```sh
$ workbox wizard

? What is the root of your web app (i.e. which directory do you deploy)? dist/
? Which file types would you like to precache? (Press <space> to select, <a> to toggle all, <i> to invert selection)css, ico, png, svg, html, js, json, txt
? Where would you like your service worker file to be saved? dist/service-worker.js
? Where would you like to save these configuration options? workbox-config.js
To build your service worker, run

  workbox generateSW workbox-config.js

as part of a build process. See https://goo.gl/fdTQBf for details.
You can further customize your service worker by making changes to workbox-config.js. See https://goo.gl/gVo87N for details.
```

ビルドの際に自動的に `service-worker.js` を生成させるために `vue.config.js` を作成

```vue.config.js
module.exports = {
  pwa: {
    workboxPluginMode: 'InjectManifest',
    workboxOptions: {
      swSrc: 'src/service-worker.js',
      swDest: 'service-worker.js',
      globPatterns: [
        '**/*.{css,ico,png,html,js,json,webapp,txt}',
      ],
    },
  },
};
```
# とりあえず…
　大体ここまでで、アプリを作成できる状態になります。そのあたりはこの記事に加筆する予定です。読みづらい文章をよんでいただきありがとうございました。
mermaid.js のガントチャートコード内にコメントを書く

## 目的

- コードで図が書けるmeriamd.jsのガントチャートのコード内にコメントを書く方法を発見したのでまとめる

## 結論

- コード内に`%%`に続けて書いたものはコメントになる。

## 書き方の例

- 公式ドキュメントに記載があったので当該コードを元に書き方の例を記載する。
- 結論と重複するが`%%`の後がコメントになる。
- 下記に例にあげるコードを記載する。(コメントアウトされている行は三行目)
- `this is a comment`がコメントとなっている。

```mermaid
gantt
    title A Gantt Diagram
    %% this is a comment
    dateFormat  YYYY-MM-DD
    section Section
    A task           :a1, 2014-01-01, 30d
    Another task     :after a1  , 20d
    section Another
    Task in sec      :2014-01-12  , 12d
    another task      : 24d
```
jupuyter notebookで括弧が補完されない時の対処方法（Macを利用している場合）

デフォルトのブラウザが「safari」に設定されているので、[chrome]に変更すると、括弧等が自動で補完されるようになりました。

解決方法
１　左上のりんごマークからシステム環境設定→一般と進む
２　デフォルトのWebブラウザがを「safari」から「chrome」に変更する

たったこれだけで、「(」と入力すると「()」と括弧を閉じてくれるようになりました。

プログラクミングを始めたばかりの初投稿ゆえ、分かりにくいかもしれませんが宜しくお願いいたします。

TK
"感度3000倍問題"を解いてみた

![1577225441746.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497826/0e47cc30-bb3a-09f6-1429-6fd4bf595d43.jpeg)

twitterで見かけたこの問題が、競技プログラミング的(AtCoderの300点問題くらい)だと感じたのでc++で解いてみた。

```c++

using namespace std;

int main(int argc, char *argv[])
{
	//init
	string orc = "ABCDE";
	sort(orc.begin(), orc.end());

	//calc
	while (next_permutation(orc.begin(), orc.end())){
		int kando = 0;
		for (size_t i = 0; i < orc.length(); i++){
			char drug = orc[i];
			switch (drug){
			case 'A':
				kando /= 2;
				break;

			case 'B':
				kando -= 900;
				break;

			case 'C':
				kando += 2000;
				break;

			case 'D':
				kando *= 5;
				break;

			case 'E':
				kando += 500;
				break;

			}
		}

		if (kando == 3000){
			cout << orc << endl;
		}
	}

	return 0;
}
```
pip でインストールができないときの対処方法 


(base) C:\Users\PycharmProjects\Graphics>pip install cx_Freeze

IDE PycharmのTerminalからpip installでCX_Freezeをインストールしようとしたら、
以下のようなエラーが出現するようになり、
PycharmのFile>settingsからモジュールをインストールしていました。

Traceback (most recent call last): 
File "C:\Users\Anaconda3\Scripts\pip-script.py", line 10, in <module>
    sys.exit(main())
TypeError: 'module' object is not callable



でも、PycharmのTerminalからpipを使ってモジュールをインストールするほうが便利なので、そのエラーの取り方を記述しました。

コマンドは２種類だけです。
1.
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
2.python get-pip.py
以上です。

実行結果を下記に記述しておきます。
手順1.
(base) C:\Users\PycharmProjects\Pythono_Programing4_Graphics>curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 1734k  100 1734k    0     0  3897k      0 --:--:-- --:--:-- --:--:-- 3897k
手順2.
(base) C:\Users\PycharmProjects\Pythono_Programing4_Graphics>python get-pip.py
Collecting pip
    Uninstalling pip-19.3.1:
      Successfully uninstalled pip-19.3.1
Successfully installed pip-19.3.1


pipのインストールが完了したら、
PycharmのTerminalからpipを使い、
cx_Freezeパッケージをインストールしてみる。

(base) C:\Users\PycharmProjects\Pythono_Programing4_Graphics>pip install cx_Freeze
Requirement already satisfied: cx_Freeze in c:\users\appdata\roaming\python\python37\site-packages (6.0)

以上。
おめでとうございました。