OmniAICreator/Qiita-1.07M huggingface dataset:
適当にサクっとping確認スクリプトを書いてみる

# 適当にサクっとping確認スクリプトを書いてみる

## 要件
- 対象IPは、`ip_node.list`に記載する。
- `packet loss`が少しでもあれば、メール通知する。
- ネットワークの設定やメールの設定は終えている。

## 対象IPリスト
以下の感じで記載しておく。

```
192.168.11.21
192.168.11.29
192.168.11.69
192.168.11.88
192.168.11.99
```

## スクリプト本体
こんな感じ。

```bash:bash
#!/bin/bash
LANG=C;
export LANG;
:> ~/mail.dat;
while read line;do
  _RET_=`ping -c 5 -i 1 -w 10 -s 32 ${line} | grep 'loss' | grep -oP '[0-9]+%'`;
  echo "${line} ${_RET_} loss";
  [ "0%" == "${_RET_}" ] && continue;
  echo "${line} ${_RET_} loss" >> ~/mail.dat;
done <~/ip_node.list;
_RET_=`du ~/mail.dat | awk '{print $1}' | xargs expr`;
[ ! 0 -eq ${_RET_} ] && mail -s "IP packet loss alert." -r [from addr] [to addr] < ~/mail.dat;
exit 0;
```

## スクリプト本体（コメント付）

```bash:bash
#!/bin/bash
LANG=C;
export LANG;   #日本語でPing結果が表示されるとgrepの正規表現が面倒なのでLANG=Cに固定

:> ~/mail.dat;   #メール通知用の本文を0byteにする

while read line;do   #後述doneの部分で、ファイル入力して$lineに1行ずつ変数入り

  _RET_=`ping -c 5 -i 1 -w 10 -s 32 ${line} | grep 'loss' | grep -oP '[0-9]+%'`;   #Pingを実施、オプション等はお好みで調整し、gpreでマッチした部分を取得

  echo "${line} ${_RET_} loss";

  [ "0%" == "${_RET_}" ] && continue;   # 0%以外は通知なのでこれでよい

  echo "${line} ${_RET_} loss" >> ~/mail.dat;   #通知用に書き込み

done <~/ip_node.list;

_RET_=`du ~/mail.dat | awk '{print $1}' | xargs expr`;   #通知用のファイルのサイズを取得

[ ! 0 -eq ${_RET_} ] && mail -s "IP packet loss alert." -r [from addr] [to addr] < ~/mail.dat;   #0以外であれば、通知

exit 0;
```
Xcode 11.4でFlutterの実機デバッグでエラーになった際の対応方法

# はじめに

Xcode 11.4でFlutterの実機デバッグを実行した際に以下のエラーが発生したため、対応方法についてまとめました。

```terminal
error: Building for iOS, but the linked and embedded framework 'App.framework' was built for iOS Simulator. (in target 'Runner' from project 'Runner')
```

## 実行環境

|環境|バージョン|
|:-:|:-:|
|macOS Catalina|10.15.4 Beta（19E250c）|
|Android Studio|3.6.1|
|Xcode|11.4 beta (11N111s)|

## 対処方法

Flutterの公式サイトに以下の記載[^1]がありました。

> To develop Flutter apps for iOS, you need a Mac with Xcode installed. Xcode 11.4 changed the way frameworks are linked and embedded, and you may experience issues switching between iOS devices and simulators. Flutter v1.15.3 and later will automatically migrate your Xcode project.

Xcode 11.4以降を利用する場合、Flutterをv1.15.3以降にアップデートすることで自動的に移行してくれるとあります。
このため、対処としてはFlutterのアップデートとなります。

```terminal
$flutter upgrade
$flutter clean
$flutter build ios
```
※ Android Studioなどを利用している場合、**flutter clean, flutter build ios**を明示的にコマンド実行する必要はないかもしれませんが、念のため実施しています。

私の環境では上記対応を行った後に再度実行することで、実機デバッグに成功しました。
なお、Flutterの公式サイトには自動移行に失敗した際に、手動で移行する手順も記載されていました。
このため、上記対応でうまくいかなかった場合は以下を参照してみてください。

* [Xcode 11.4 Support](https://flutter.dev/docs/development/ios-project-migration)

> If you need to manually upgrade your project, use the following steps:

>From the Flutter app directory, open ios/Runner.xcworkspace in Xcode.

>In the Navigator pane, locate the Flutter group and remove App.framework and Flutter.framework.

[^1]: https://flutter.dev/docs/development/ios-project-migration
こんなプルリクはいやだ

# はじめに
この記事では、レビュワー目線で嫌だなーって思うプルリクエストをまとめてみました。
レビューする機会がある方は共感していただけるとありがたいですmm

## 目的が書かれていない
え、こっちが汲みとれってこと！？

こういう所でエンジニアの良し悪しがわかるよね。
良いエンジニアってこういう所絶対に手を抜かない。


## CIが通っていない
レビュワーにアサインする前にテスト落ちてないかどうかぐらいは確認しようよ。

レビュワー: テストが落ちています。確認してください。
　　依頼者: 承知しました。

このやりとり本当に無駄

## コードにコメントがない
これ良くありがちだけど、一個ぐらいあるだろって思う。
こういうプルリクがくると、なんかレビュワーまかせだなって感じる。
分かりにくそうなコードの説明とか特にレビューして欲しい箇所とかに最低限コメントあってもいいんじゃないかなって思います。
レビュワー目線でいうと質問される前から説明あったらすごい楽だし、それだけでレビュワーのこと考えてるなって感じて評価上がるのに...もったいない。

## ディスカッションになっていない
レビュワーが指摘した箇所は全てマストで修正しないといけないっていう考えがあるのか返答が全て「修正します。」になってしまっている。

レビュワーの立場だと（僕だけかもしれないけど）強制的に修正させているみたいでなぜか罪悪感を覚える...

もちろんマストで修正して欲しい場合はあるけどその時はマストで修正して欲しいって伝えるのでそれ以外はこうしたほうがいいんじゃないかなーレベルの指摘。（プロジェクトにもよるけど）
最終的な責任も自分なので指摘に対して反論とかあったらどんどん言った方がいいと思う。（レビュワーも人間だから間違えて指摘したり勘違いしたりする事もあるから）
自分の書いたコードに自信があれば自然と反論とかしてくると思うから、そもそも自分のコードに自信がない現れなのかなとも思う。

# さいごに
コードを書くのも大事だけど、そのコードがマージされるまでの工程も重要。
gitでのやりとりってエンジニアにとって数少ないコミュニケーション取れる機会なのでもう少し重要視して欲しいなって思います。
PyTorchでone-hot encoding

[公式doc](https://pytorch.org/docs/stable/nn.functional.html#torch.nn.functional.one_hot)

```
one_hot = torch.nn.functional.one_hot(torch.tensor([2, 0, 1]), num_classes=4)
one_hot
# output:
# tensor([[0, 0, 1, 0],
#         [1, 0, 0, 0],
#         [0, 1, 0, 0]])
```

戻すには、以下。

```
torch.argmax(one_hot, dim=1)
# output:
# tensor([2, 0, 1])
```

なぜか検索に引っ掛かりにくいので・・・。
C++ でサクッと surface registration(global matching, non-rigid ICP) するライブラリやコードのメモ

## 背景

* メッシュの surface registration(e.g. 顔スキャン点群をマッチング, 多視点画像から三次元復元)をやりたい
  * 自前実装するにしても, リファレンスとなるものがほしい 
* Android, iOS などでも動かしたいので, cross platform のものがほしい
  * PCL や OpenCV とか使うのはビルド面倒でつらい

C++, Python あたりで顔メッシュ処理のメモ
https://qiita.com/syoyo/items/ddff2c6bdcec2e5c96a4

## 剛体系

### Super4pcs

https://github.com/nmellado/Super4PCS

OpenCV off であれば, Eigen だけ(自動ダウンロード)でビルドできるはず.

https://github.com/STORM-IRIT/OpenGR

に移行しました.

### sparseicp

https://github.com/OpenGP/sparseicp

Eigen と nanoflann を使っています.
動きはするようですが, どうも結果が違う..?


## non-rigid ICP 系

https://github.com/jpl917/NonRigidICP

dlib は自前でコンパイルして, そのパスを find_package(dlib) に渡してあげるといいでしょう.

アルゴリズムが原因なのか, コードの書き方が原因なのかは不明ですが, マルチスレッドで処理すると効率がわるくなることがわかりました. どうも NonRigidICP が利用している trimesh2 の omp コードがよく無いのかもです.

TR 1950X でマルチスレッド処理させて, 10 iteration で 1363 秒(22 分ほど)かかりました(AtA and Atb 行列の生成でとても時間がかかっている). 
OMP_NUM_THREADS=1 で 1 コアだと 215 秒くらいでした. 2 スレッドにしても性能かわりませんでした(1 スレッドより多少悪くなる).

とりあえずは OMP_NUM_THREADS=1 で実行させましょう.

イテレーションごとに .ply メッシュを生成してくれますので, 適当なタイミングで強制終了させるのも手です.

ply メッシュは meshlab などで確認できます.

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">ねんがんの non-rigid ICP での surface registration に成功したぞ!!!! 🎉🎉🎉🎉🎉🎉🎉🎉🎉🥳🥳🥳🥳🥳🥳🥳🥳🥳🥳🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰😘😘😘😘😘😘😘😍😍😍😍😍😍😍😍✌️✌️✌️✌️✌️✌️✌️✌️ ありがとうございます😊😊😊 <a href="https://t.co/f4XToD1zlT">https://t.co/f4XToD1zlT</a> <a href="https://t.co/UyRZkjRui0">pic.twitter.com/UyRZkjRui0</a></p>&mdash; Syoyo Fujita 🌸 RayWa(Ray and Peace) (@syoyo) <a href="https://twitter.com/syoyo/status/1236224594807148544?ref_src=twsrc%5Etfw">March 7, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 

## その他参考

サクっとというわけには行かないが, 結果が良さげなもの.

https://github.com/YuePanEdward/GH-ICP
liblas + PCL 1.7+ 利用
(Ubuntu 18.04 なら apt で入る)

`#include <pcl/Vertices.h>` を追加する必要あり.
 

## TODO

* [ ] `pl917/NonRigidICP` のコードを参考にして自前 non-ridid ICP 実装する 
* [ ] Eigen を置き換えるライブラリを開発したい.
* [ ] non-rigid pointset registration: Coherent Point Drift について調べる
Angular FirebaseでFirestoreの更新ができなかった

# 結論
シークレットウィンドウを試してみて

# 症状
`angularfire2`または`@angular/fire`パッケージにおいてFirestoreのwriteができない。
なぜかreadはできる。ということでプロジェクトの向き先が間違っているということもない。
セキュリティルールはオープンになっている。

```javascript
this.angularfirestore.collection('test/')
  .add({ value: test })
  .then(console.log)
  .catch(console.log);
```
みたいに書いてもログも何も出ずただ動かない。

解決まで別プロジェクト作ったりで4時間かかった……
sshを秘密鍵公開鍵認証を使う。wanから接続する。

#手順
##クライアントでの操作
クライアント側のPuTTygenなどで鍵を作る。PuTTygenがなければPuTTyをインストールしてください。

##サーバーでの操作
送った公開鍵をサーバーで利用できる形式にフォーマットする。

```
$ ssh-keygen -i -f 鍵名.pub >> authorized_keys
```

/home/user名　に.sshディレクトリを作る。

```
$ mkdir /home/user名/.ssh
```

フォーマットした公開鍵を.sshに移動する。

```
$ mv authorized_keys /home/user名/.ssh
```

authorized_keysに対するアクセス権限を設定する。

```
$ chmod 600 .ssh/authorized_keys
```
.sshのアクセス権限を設定する。

```
$ chmod 700 .ssh
```
以上の設定で、鍵認証方式でssh接続できるようになりました。ここからは、セキュリティを高めるために、サーバーの設定を変更してパスワード認証ができないようにし、ポートを変更します。

##サーバーでの操作
sshの設定ファイルをエディタで開きます。
```
$sudo vim /etc/ssh/sshd_config
```
パスワード認証ができないようにする。

```
PasswordAuthentication no
```

sshd_configのportの数字を変える。

```
#Port22
Port2000
```

sshdを再起動する

```
$service sshd restart
```
以上で設定は完了です。wanから接続する場合は、ルーターのポートフォワーディング機能を使う。

クライアントからPuTTyから秘密鍵を使ってログインする。秘密鍵はCategory:のConnectionのSSHの中のAuthの欄からパスを指定する。

#詰まったところ
linuxで公開鍵をフォーマットしなければいけないことに気づかず、セットアップに時間をかけてしまいました。

#参考サイト
[PuTTYで公開鍵認証方式でのSSH接続を行う手順まとめ](https://qiita.com/sugar_15678/items/55cb79d427b9ec21bac2)
GitHub Actionsを用いたelectron-builderのマルチプラットフォームパッケージング

GitHub Actionsを用いてelectron-builderのパッケージングの自動化を試した時の作業メモになります。
サンプルコードは[platykun/electron-webpack-quick-start at v0.0.8](https://github.com/platykun/electron-webpack-quick-start/tree/v0.0.8)にあります。

### 前提:
- electron-updater向けの実装が完了していること
- Apple Developer Programへの登録が完了しており、Developer ID Applicationの証明書、秘密鍵が用意できていること

### 実現したいこと
* GItHub Actionsを用いる
* 機密情報はGitHub Secretsへ設定する
* パッケージ対象OSはWindows、macOSとする
  * macOSのアプリケーションでは、自動アップデートを有効としたいためcode signを行う
  * macOSのnotarizationは実施しない(対象外とする)

*  [electron-userland/electron-webpack-quick-start](https://github.com/electron-userland/electron-webpack-quick-start)をベースとしたelectronアプリケーションを作成する


### 実施内容

* p12ファイルの生成
	* キーチェーンアクセスから、p12ファイルの書き出しを行う
	* パスワードは控えておく
	* 以下コマンドを実行し、base64エンコード後の値を控えておく
```
$cat  ~/Desktop/hoge.p12 | base64
```


* GitHub Secretsへの設定
    * mac向けの自動アップデート機能を有効にするため、 `CSC_LINK` , `CSC_KEY_PASSWORD` を環境変数に追加
    * p12ファイル生成で作成した値を利用
        * `CSC_LINK` へbase64エンコード済の `.p12` ファイルを設定
        * `CSC_KEY_PASSWORD` へパスワードを設定
    * GITHUBのアクセストークンを `GH_TOKEN` という名前で設定
        * デフォルトで [GITHUB_TOKEN](https://help.github.com/ja/actions/configuring-and-managing-workflows/authenticating-with-the-github_token) を提供してくれているため、通常は設定不要。デフォルトのtokenの場合他リポジトリへのアクセス権限等が付与されていないため、他リポジトリへアクセスする場合には設定が必要。

* ジョブ定義ファイルの作成

以下定義ファイルを `.github/workflows/blank.yml` に配置

```yaml
name: CI

on:
  push:
    branches:
      - master

jobs:
  build-on-mac:
    runs-on: macos-latest
    env:
      GH_TOKEN: ${{ secrets.GH_TOKEN }} # electornのpublishで必要。secrets設定の検証のために自身が設定した `github secrets` の値を取得
      CSC_LINK: ${{ secrets.CSC_LINK }} # electorn-builderのcode signingで必要な設定値
      CSC_KEY_PASSWORD: ${{ secrets.CSC_KEY_PASSWORD }} # electorn-builderのcode signingで必要な設定値
    steps:
      - uses: actions/checkout@v2
      - name: yarn install
        run: yarn
      - name: do package
        run: |
          yarn publish_dist
  build-on-win:
    runs-on: windows-latest
    env:
      GH_TOKEN: ${{ secrets.GH_TOKEN }}
    steps:
      - uses: actions/checkout@v2
      - name: yarn install
        run: yarn
      - name: do package
        run: |
          yarn publish_dist
```

### ※ハマったこと
electron-builderのバージョンが古く、以下issueと同様の事象に直面したため `electron-builder` のversionを上げました

[Building on macOS 10.15 fails. Can’t locate Mac/Memory.pm  · Issue #3990 · electron-userland/electron-builder · GitHub](https://github.com/electron-userland/electron-builder/issues/3990)

### おわりに
この程度の設定であれば、半日もあれば簡単に設定できました。
今後実務でGitHub Actionsを取り扱うにあたり、トラブルシュートのためのssh接続( [GitHub ActionsにSSHで入る(簡単3ステップ) - Qiita](https://qiita.com/shonansurvivors/items/cb8902acfe5c3a1b3ca0)  )する方法や、様々な環境向けのパッケージング等の実装方法等を確認していきたいです。
GitHub Actionsで最新のタグにcheckoutする

前に、GitHub Actionsを使って[Contentfulが更新されたら自動でデプロイする](https://qiita.com/tk07Sky/items/528658213e62aad0a055#github-actionsを使ってcontentfulでの変更を検知し自動デプロイされるようにする)っていう記事を書いたのですが、これだとなんでもかんでもmasterからデプロイしちゃいます。
僕的には最新のtagにcheckoutして、その時の状態でデプロイされたらいいのになぁと思ってたので色々試したのでメモがてら書こうと思います。

## やったこと

`actions/checkout`を実行したあとに、gitコマンドを使って最新タグを取得してcheckoutするようにしました。
`git describe`コマンドを使い、最新のtagを取得するようにしています。

```yaml
jobs:
  build:
    name: build
    runs-on: ubuntu-latest
    steps:
      - name: Checkout Repo
        uses: actions/checkout@v2
      - name: Checkout Latest tag # ← ここから4行を追加
        run: |
          git fetch --prune --unshallow
          git checkout $(git describe --tags --abbrev=0)
      ...
```


## ハマった点

`actions/checkout`はshallow cloneしています。

```bash
# shallow cloneの例
git clone --depth 1 git@github.com:<アカウント名>/<リポジトリ名>.git
```

`actions/checkout`のshallow cloneはデフォルトブランチの最新コミットしかfetchしない設定なので、そのコミットでタグが打たれていない場合、`git describe`コマンドが動きません
（これに気づくのに時間がかかった）

gitドキュメントにもこう書いてあります
> The command finds the most recent tag that is reachable from a commit. 
このコマンドは、コミットから到達可能な最新のタグを見つけます。（Google訳）
https://git-scm.com/docs/git-describe

そのため、以下のgitコマンドを実行して、すべてのコミットを取得する必要があります。

```
git fetch --prune --unshallow
```


## おわりに

これで最新tagのデータでデプロイが出来るようになりました🎉
ただ、`--unshallow`オプションだとリポジトリの情報全部持ってきちゃうので、もっと軽めのいい方法ないかなーと思ってます。
もしこっちのほうがいいよ！っていうのがあれば教えて下さい🙌
[android studio] Debugモード表示を消す

# はじめに
試作アプリをスマホに入れて遊ぶのDebugという文字がデカデカと右上にあるのはダサいので非表示にします。

# 方法①
```
MaterialApp(
 debugShowCheckedModeBanner: false
)
```
release buildするときにDebugバナーが消えます。



# 方法②
こちらも同様に非表示となります。

Inspector tab --> More Actions. --> Hide Debug Mode Banner
Atcorder157 A~C問題　C++

ABC157
https://atcoder.jp/contests/abc157
#A問題
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475270/de9525b1-8601-c097-dd32-a0670b486c47.png)

```A問題.c++
#include<bits/stdc++.h>
#define rep(i,n) for(int i=0; i<(n); i++)
using namespace std;
using ll = long long;
const ll INF = 1e9 + 7;
typedef pair<int,int> P;// pair型は２つの値の組を表せる

int main(){
    int N; cin >> N;
    int ans=0;
    if (N%2==0) ans=N/2;
    else ans=N/2+1;
    cout << ans;
}
```

#B問題
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475270/51a144ba-18bd-d7ff-a541-9dec46bd3288.png)


```B問題.c++
#include<bits/stdc++.h>
#define rep(i,n) for(int i=0; i<(n); i++)
using namespace std;
using ll = long long;
const ll INF = 1e9 + 7;
typedef pair<int,int> P;// pair型は２つの値の組を表せる

int main(){
    int boo[3][3]; //ここで全ての値をfalseにすることはできない！
    int A[3][3]; //int型の記録をすることができるメモリ領域を確保しただけ！
    
    rep(i,3)rep(j,3){
        int a; cin >> a;
        A[i][j]=a;
        boo[i][j]=false; //ここで全ての値をfalseにする！
    }
    
    int N; cin >> N;
    rep(i,N){
        int b; cin >> b;
        rep(j,3)rep(k,3){
            if (A[j][k]==b) boo[j][k]=true;
        }
    }
    
    bool ans=false;
    // true falseの一致を確かめる時、&&でするのが直感的にいい！
    rep(i,3){
        if (boo[i][0] && boo[i][1] && boo[i][2]) ans=true;
        if (boo[0][i] && boo[1][i] && boo[2][i]) ans=true;
    }
    if (boo[0][0] && boo[1][1] && boo[2][2]) ans=true;
    if (boo[0][2] && boo[1][1] && boo[2][0]) ans=true;
    
    if(ans) cout << "Yes";
    else cout << "No";
}
```

#C問題
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475270/315c3e03-0d87-9850-2d2c-e95984372dd6.png)

```C問題.c++
#include<bits/stdc++.h>
#define rep(i,n) for(int i=0; i<(n); i++)
using namespace std;
using ll = long long;
const ll INF = 1e9 + 7;
typedef pair<int,int> P;// pair型は２つの値の組を表せる

int main(){
    int n,m; cin >> n >> m; //桁数n,条件がm個
    vector<P> p(m);
    //p[i].firstが左から～桁目
    //p[i].secondがその桁の数値
    rep(i,m) cin >> p[i].first >> p[i].second;
    //候補0~999を試す
    rep(x,1000){
        string s=to_string(x);
        int keta=s.length();

        if (keta!=n) continue;
        bool ok=true;
        rep(i,m){
            if (s[p[i].first-1]!=p[i].second+'0') ok=false;
        }
        if(ok){
            cout << x << endl;
            return 0;
        }
    }
    cout << -1 << endl;
    return 0;

}
```
【React】ライブ情報シェアサービス公開〜

#はじめに
えー今回，アーティストのライブ情報を登録・閲覧のシェアすることのできる「[LiveSharing](https://livesharing.herokuapp.com/)」というサービスをリリースしてみました．
僕自身，ロックバンドが大好きでよくライブに行くので，たくさんのアーティストのライブ情報を一つのページで見れたらなあと思って作ってみました．

#サービスについて
**※本サービスはとりあえず自分の勉強したいことを中心に開発したので，技術面での改良は無数に存在するのでそこはまったり修正していきます．**

本サービスは大きく分けて３つのページで構成されており，エントランスページである「トップページ」，アーティストのライブ情報を登録できる「登録ページ」，他の人もしくは自分が登録したアーティストのライブ情報を検索できる「検索ページ」
![1583569706.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458915/930801a3-98d8-ca11-700b-1880558fd05f.jpeg)

#今後の運用
ユーザが増えてきたらバックエンドの改良とかUIとかアカウント機能とか，無限に改良していこうと思います．今回は少しでも多くの人に使ってもらえたらと思って投稿しています．どんなコメントでもリアクションでも嬉しいので，どんどんいただけると幸いでーす！
ESP32(WiFi通信モジュール)とスマートフォン(iPhone)を活用したIOTについて

# はじめに
学生時代に多少プログラムをかじっていた初心者です。
趣味の一環としてこれから少しづつではあるが成果物について載せていくので興味がある方はご覧になって下さい。
モットーとしては、初心者でもわかりやすく活用できるように紹介しようと思います。

とりあえず目指している最終形は、見出しにもあるように
<b>「ESP32(WiFi通信モジュール)とスマートフォン(iPhone)を活用したIOT」</b>
を目指してやっていく予定です。

その都度ご質問等ありましたらご連絡ください。

#開発環境
PC：MacBookPro 15.4inch(2018年モデル)
ソフト：Arduino、Xcode

#次回記事予定
ESP32周りの回路作成について
【Rails】Strong Promoters

#Strong Promoters
コントローラファイルに記載するセキュリティを強固にする仕組み
name, email,password,password_confirmationの４つのカラムがある時

```rb
params.require(:user).permit(:name, :email, :password, :password_confirmation)
```
上記のよう記載することで４つのカラムがparamsハッシュに対して受け取りを許可し、
他は無効にすることができる。

詳しく説明すると、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597913/96837c67-8fec-d447-0410-12a8225848d1.png)

上記のような画面フォームがあった時に画面内の４項目以外はデータを受け取らないようにすることができる。
これをしないと、ID情報とかを書き換えられてしまう可能性がある。
Chromebookのlinux(Debian)に最新版のPythonを入れる

Debianのバージョンは以下

```
aaaa@penguin:~$ lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description:    Debian GNU/Linux 9.12 (stretch)
Release:        9.12
Codename:       stretch
```

デフォルトでPython3.5が入っている。

```
aaaa@penguin:~$ python3 -V
Python 3.5.3
```
が最新バージョンのPythonも使いたかったので以下の手順で導入した。

現時点（2020/03)では3.8.2が最新
https://www.python.org/downloads/release/python-382/
上記ページからソースを落としてビルドする
（Files > Gzipped source tarball のリンクをwget）

```
aaaa@penguin:~$ cd /usr/local/src
aaaa@penguin:~$ wget https://www.python.org/ftp/python/3.8.2/Python-3.8.2.tgz
aaaa@penguin:~$ sudo tar zxvf Python-3.8.2.tgz
```
ビルド
※既存のpython3.6を上書きされないようにmake altinstallを実施する

```
aaaa@penguin:~$ cd  Python-3.8.2
aaaa@penguin:~$ ./configure
aaaa@penguin:~$ make
aaaa@penguin:~$ make altinstall
```

入った

```
aaaapenguin:~$ python3.8 -V
Python 3.8.2
aaaa@penguin:~$ pip3 -V
pip 20.0.2 from /usr/local/lib/python3.8/site-packages/pip (python 3.8)
```
使わないと請求される！？ EIPの不思議

クイズ。

以下、EIPを使用していて費用がかかるのはどれでしょうか。

1. EC2インスタンスにEIPが関連づけられて起動している時。
2. EC2インスタンスにEIPが関連づけられて停止している時。
3. 取得したEIPがどのEC2インスタンスにも関連づけられていない時。


正解はなんと`3`なんですよね。
要は`EIPは使われていないと費用がかかるということになります。`

以下[公式](https://aws.amazon.com/jp/premiumsupport/knowledge-center/elastic-ip-charges/)抜粋。


>次の条件が満たされている限り、Elastic IP アドレスに料金は発生しません。

>Elastic IP アドレスが EC2 インスタンスに関連付けられている。
>Elastic IP アドレスに関連付けられているインスタンスが実行中である。
>インスタンスに 1 つの Elastic IP アドレスしか添付されていない。


なんで使わないと費用がかかるかの理由は書いてないんですが、貴重なIPなんだから使え！ってことなんでしょうか。

AWSしばらく使わないからとりあえず全部停止させたけど何故か費用がかかってる！みたいな人はこういうのも確認した方が良いかもしれないです。
TypeScriptで値オブジェクトとして使えそうな文法調査ログ

Clean Architecture の文脈でEntityに書くときに使えそうなものをメモとして書いておく。

# tl;dr

とりあえずは`class`使う。

# `class`を使う

```typescript
class Id {
    constructor(readonly value: number) {}
}

class MailAddress {
    constructor(readonly value: string) {}
}

class User {
    constructor(
        readonly id: Id,
        readonly mailAddress: MailAddress,
    ) {}
}

const u = new User(new Id(0), new MailAddress("hoge@fuga.foo"));
```

[Playground Link](https://www.typescriptlang.org/play/#code/MYGwhgzhAECSAm0DeAoa7rAPYDsIBcAnAV2Hy0IApCBTMeXEAT2gDcwRiaAuaHYgLYAjGoQCUyAL4ppKUJBgBZMAEsQAQXjxaUZGgzY8RUuSq16jFu049oBQipwBzCUmmz5ugKoRRejJi49iYUlPoB6OYMOMzQKvC8CAA04RFRltACqhpaOhC8ymqa2jRQKQGu7ihyQfjQxNAAvHw0AO7QPqKUOG1w8JQADGJJLe2FOSVQlABEABZYTjQAAgBmxE5gAHQrWFjTYmIA3DV4WCA0myALlMSbWUW5pRCb1lxiQA)

good

* `instanceof`が使えるので型の特定が楽
* 関数をもたせたりできるので柔軟性が高い

bad

* 特に感じていないが、強いて言えばJavaっぽい。

# `interface`を使う

```typescript
const ID = "id";
type ID_TYPE = "id";
interface Id {
    readonly type: ID_TYPE;
    readonly value: number;
}

const MAIL_ADDRESS = "mail_address";
type MAIL_ADDRESS_TYPE = "mail_address";
interface MailAddress {
    readonly type: MAIL_ADDRESS_TYPE;
    readonly value: string;
}

const USER = "user";
type USER_TYPE = "user";
interface User {
    readonly type: USER_TYPE;
    readonly id: Id;
    readonly mailAddress: MailAddress;
}

const _id: Id = { type: ID, value: 10 };
const _mailAddress: MailAddress = { type: MAIL_ADDRESS, value: "hoge@fuga.foo" };
const u: User = {type: USER, id: _id, mailAddress: _mailAddress};
```
[Playground Link](https://www.typescriptlang.org/play/?ssl=11&ssc=1&pln=12&pc=1#)

good

* 生成後のjsがシンプル
* `Pick`とかが使える

bad?

* `typeof`とかを使うと単にプリミティブ型が出てきちゃうだけで、型の判定ができない。
    * あくまでトランスパイル時に型チェックが入るだけなので、実行時のでの判定ができない。
    * => そのため、`type`という変数を入れている。

bad部分に関しては自信ないので他の方法があれば知りたい。

# `type`を使う

```typescript
type Id = number;
type MailAddress = string;
type User = { id: Id, mailAddress: MailAddress};

const _id: Id = 20;
const _mailAddress: MailAddress = "hoge@fuga.foo";

const u: User = { id: _id, mailAddress: _mailAddress };
```
[Playground Link](https://www.typescriptlang.org/play/?ssl=1&ssc=1&pln=9&pc=56#code/FAFwngDgpgBAkgExgXhgOwK4FsBGUBOA3KJLALICGAlgDYCCCC+UAziyjCyPlWgObFw0GAFUWBDgG8YVBAC54CADQws1eo2ZsFlWgyasWAX2LAAxgHs0XGAH1ZCxBwBMABmKXrIO2r2bDOur6WuyoAEQAFhZ8UAACAGYYfBQAdPEWFmGmnjYYCmISqNIOdrIqvhoG2j5B-mwwJkA)

good

* シンプル
    * valueとかいらない

bad?

* type aliasがあるだけなので、型が違くても入れられちゃうケースがある。
    * もとが`string`だったら何でも入る、みたいな感じ

bad部分に関しては自信ないので他の方法があれば知りたい。

# まとめ

現時点では`class`使って全部定義しちゃうでいいかも。
でもオーバーヘッド掛かりそうでそこ気にしちゃうな。
あと、TypeScript Playground超便利


ツッコミマサカリは絶賛募集中です。
【Rails】resources_collectionの使い方

#collection
全部のデータに対するアクションに利用する。
例えばユーザーの検索機能である「serchアクション」を実装するとして、下記の様にコードを記載する。

```config/routes.rb
Rails.application.routes.draw do
 resources :users do
  get :search, on: :collection
 end
end
```
`get :search, on: :collection`
上記のコードで、どのユーザから見ても全てのユーザを検索できる様になっている。
GitHubを利用するための初期設定

# 本記事の趣旨
同じような情報はたくさんありますが、[「はじめての自動化」](https://techbookfest.org/product/5169385438183424)のために記述します。
GitHubでブランチを作成が完了した後の手順になります。

# gitのバージョンアップ

## gitバージョン確認
Mac PCの前提です。
デフォルトでインストールされていますが、バージョンを確認するとやや古い可能性があります。

```
~ $ git --version
git version 2.20.1 (Apple Git-117)
```

## Homebrewのインストール
様々なパッケージを簡単に利用できるようになるHomebrewをご紹介します。
以下Homebrew公式ページにインストールコマンドの記載があります。
[Homebrew](https://brew.sh/index_ja)
Macを利用している方の多くはお世話になっているのではないでしょうか。
無闇に管理者権限を与えなくてよくなるという特徴もあるためおすすめです。


## バージョンアップ
いざバージョンアップです。

```
$ brew install git
```

新しいgitにPathを通してあげます。既に通っている方はsourceコマンドでの再読み込みだけで大丈夫です。

```
$ echo 'export PATH="/usr/local/bin:$PATH"' >> ~/.bash_profile
$ source ~/.bash_profile
```

今一度バージョンを確認し、アップグレードされていればOKです。

```
~ $ git --version
git version 2.25.0
```

# git cloneしてエラーが出る
GitHubのリポジトリを作成し、
`Clone or Download` > `Clone with HTTPS`
の手順でいざClone！

ところがどっこい。以下のようなエラーが表示されると思います。

```
$ git clone https://github.com/hogehoge/fugafuga.git
Cloning into 'citest'...
remote: Repository not found.
fatal: repository 'https://github.com/hogehoge/fugafuga.git/' not found
```

先にローカルでGitHub用の設定を行ってあげましょう。


# GitHubの情報を設定する
GitHubのリポジトリを作成したアカウントの情報をPCに設定してあげましょう。

```
$ git config --global user.name "<GitHubに登録したユーザー名>"
$ git config --global user.email "<対応するメールアドレス>"
```

以下で設定されていることを確認します。

```
$ git config --list
user.name=<GitHubに登録したユーザー名>
user.email=<対応するメールアドレス>
```

それではリモートのmasterブランチをローカルに持ってこれるか確認しましょう。
右側の緑色のボタン `Clone or download`を選択すると `Clone with HTTPS`という表記とともにURLが表示されます。
![github_http_clone.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379514/2a7064a9-49c2-f7d9-4772-57aec0832426.png)

ここで表示されたURLをコピーし、以下コマンドを入力します。

```
$ git clone <コピーしたURL>
```

これで手元にブランチをCloneすることができました。
こちらのブランチを利用して作業していきましょう。

# おまけ: とても基本的なgitコマンド
基本的にGitは以下の操作を繰り返します。
他にも様々なコマンドがありますので、興味のある方は調べてみてください。

- リモートブランチをローカルに持ってくる

```
git clone <URL>
```

- ローカルで編集後にリモートに上げるファイルを選択する

```
git add <ファイル名>
```

- リモートに上げる際のメッセージを残す

```
git commit -m "<コミットメッセージ>"
```

- リモートのブランチに上げる

```
git push origin <ブランチ名>
```
オフラインどう書く第9回参考問題解答

問題はこちら->http://nabetani.sakura.ne.jp/hena/ord9nummake/

計算量に余裕がありそうですので、
mak2/2で、6か9があれば同じ数だけもう一方を加えたリストから数を作り、
最後にche/2で使いすぎていないか確認しています。
4桁だけですのでselectを4回使って数を作っています。
該当する数をfindallですべて集め、ソートしてN番目の値を求めます。

```Prolog
%swi-Prolog  version 7.4.2
%start.
%:-initialization(start). %ideone
che(N,L):-
     L=[H|_],H=\=0,not((delete(L,6,L1),delete(L1,9,L2),length(L,N1),length(L2,N2),N1-N2>N)).

mak2(L,NL):-
     include(=:=(6),L,IL),length(IL,K1),include(=:=(9),L,IL1),length(IL1,K2),K is K1+K2,
     (K1=:=0->L9=[];(length(L9,K1),maplist(=(9),L9))),append(L,L9,L96),
     (K2=:=0->L6=[];(length(L6,K2),maplist(=(6),L6))),append(L96,L6,L69),msort(L69,L0),
     select(W,L0,L1),select(X,L1,L2),select(Y,L2,L3),select(Z,L3,_),NL=[W,X,Y,Z],che(K,NL).
     
solve(N,L,R):-findall(NL,mak2(L,NL),L1),sort(L1,L2),nth1(N,L2,R).
solve(_,_,_).

start:- str(S),split_string(S,"\n\s","\s",S1),pre(S1),!.

pre([]).
pre([_,B,C|T]):-
     atomics_to_string(L,":",B),L=[X,Y],atom_number(X,X1),string_chars(Y,Y1),
     maplist(atom_number,Y1,Y2),solve(X1,Y2,R),disp(R,C),pre(T).

disp(R,Q):-
     (var(R)->S="-";(maplist(atom_number,S1,R),string_chars(S,S1))),
     (Q==S->Str=" pass ";Str=" fail  "),write(Str),writeln(S).


str("0       13:01167        1109
1       1:1234  1234
2       2:1234  1243
3       7:1234  2134
4       24:1234         4321
5       25:1234         -
6       2:1116  1119
7       2:0116  1019
8       3:6666  6696
9       16:6666         9999
10      10:01267        1097
11      14:111167       1671
12      1:1111  1111
13      2:1111  -
14      1:666633        3366
15      72:666611       9999
16      73:666622       -
17      1:666600        6006
18      52:666600       9999
19      53:666600       -
20      25:06688        8086
21      93:02566        6502
22      11:06688        6809
23      169:01268       9801
24      174:01268       9821
25      66:012288       8201").
```
【Rails】resources

#resources
RESTfulな設計を実現するために開発者自身でHTTPメソッドとURLとアクションを紐付けを行うのは手間がかかるため、
Resourcesメソッドを使い自動でRESTfulなルート定義を行う。

```route.rb
resouces :name
#nameはリソース名
```

「name」の部分が対象のモデルのテーブルになる。

例えば

```rb
#railsコマンドでモデル作成
$ rails g model product

#routes.rbに以下の定義を追加
resources :products

#自動生成されたルートを確認
$ rails routes
```
rails routesコマンド

```rb
Prefix         Verb     URI Pattern                   Controller#Action
products       GET      /products(.:format)           products#index
               POST     /products(.:format)           products#create
new_product    GET      /products/new(.:format)       products#new
edit_product   GET      /products/:id/edit(.:format)  products#edit
product        GET      /products/:id(.:format)       products#show
               PATCH    /products/:id(.:format)       products#update
               PUT      /products/:id(.:format)       products#update
               DELETE   /products/:id(.:format)       products#destroy
```
上記のようになる。

##resourcesをネストする方法
オンラインショップでの商品のレビュー情報について、
システム内部では商品のモデルとレビューのモデルが存在しており１つの商品に対して複数のレビューが存在する。

モデルクラスではそのような関連性をhas_manyやbelong_to等で表現する。

```rb
# 商品のカテゴリーの下にそれぞれreviewが存在する
/product/5/review
/product/7/review
```
上記のようなURL構造を設計するために、resourcesメソッドではネストによる記述を行う。
具体的にはroute.rbに下記のようなコードを追加する。

```routes.rb
resources :products do
    resources :reviews
end
```
するとrails routesは下記のようになる。

```
Prefix              Verb   URI Pattern                                      Controller#Action
product_reviews     GET    /products/:product_id/reviews(.:format)          reviews#index
                    POST   /products/:product_id/reviews(.:format)          reviews#create
new_product_review  GET    /products/:product_id/reviews/new(.:format)      reviews#new
edit_product_review GET    /products/:product_id/reviews/:id/edit(.:format) reviews#edit
product_review      GET    /products/:product_id/reviews/:id(.:format)      reviews#show
                    PATCH  /products/:product_id/reviews/:id(.:format)      reviews#update
                    PUT    /products/:product_id/reviews/:id(.:format)      reviews#update
                    DELETE /products/:product_id/reviews/:id(.:format)      reviews#destroy
products            GET    /products(.:format)                              products#index
                    POST   /products(.:format)                              products#create
new_product         GET    /products/new(.:format)                          products#new
edit_product        GET    /products/:id/edit(.:format)                     products#edit
product             GET    /products/:id(.:format)                          products#show
                    PATCH  /products/:id(.:format)                          products#update
                    PUT    /products/:id(.:format)                          products#update
                    DELETE /products/:id(.:format)                          
```
RaspberryPi起動時にPythonのGUIを動かしたい

今回はラズパイでpythonのGUIプログラムを書いて、起動時に実行しようとしたときに詰まったのでその時に行った解決策をまとめておこうかと思います。
#始めに
まず始めに、最新のRaspbianだと今回の方法は使えないかもしれません。風の噂でできなくなったと聞きました...orz
# 環境
- RaspberryPi 3B+
- Raspbian 10.3
- Python 3.6
- GUIはTkinter
- clock.py (GUIプログラム)

# 失敗策
起動時にプログラムを実行させるならrc.localやらsystemctlやらcronやら使え、とありますがどれもGUIのプログラムではエラーが出ました。logを見ると、DISPLAYが見つからん、というような感じだったはず...。
補足ですが、rc.localは少し前から非推奨になっています。起動時に何かしたいときはsystemctlにサービスを登録しましょう。

# 解決策
autostartを使いました。調べると様々な場所にautostartが見つかるのですが、今回動作を確認したのは、
``/etc/xdg/lxsession/LXDE-pi/autostart``
に存在するautostartをいじったときのみでした。
autostartの最後の行に、
``@lxterminal -e sh /home/pi/python_clock/run.sh``
と追記。

/home/pi/python_clock/run.shに

\#!/bin/bash 
cd /home/pi/python_clock
python3 clock.py

と書いて再起動で無事pythonで書かれたGUIプログラムが動きました。

# まとめ
今回は無事動きましたが、autostartは廃止された方法なので今後は通用しないかもしれません。他に素晴らしい方法を知っている方がいらっしゃいましたら是非コメントにお願いします。
クラスパスやエンコードを何度確認しても問題ないのに「java.lang.NoClassDefFoundError: Could not initialize class java.nio.file.FileSystems$DefaultFileSystemHolder」が発生する

ネット上探しても情報がないので共有目的で書きます。
##原因
存在しないディレクトリをカレントディレクトリにしていると発生します。

他のファイルシステム全部が同じ仕様かは知りませんが、少なくともRedHat7では、カレントディレクトリを削除すると存在しないディレクトリに居る状態になります。

```terminal
[root@******** ~]$ cd hoge
[root@******** hoge]$ rmdir ../hoge
[root@******** hoge]$ 
```

この状態で`DefaultFileSystemHolder`クラスの初期化処理が実行されると発生します。
`java.nio.file.Paths`クラスの中で使われているので、初期化処理が走る機会は結構ありそうです。

##僕の環境で起きたこと
あるプログラムを実行すると下記のような例外が発生する、と障害報告が挙がった。

```java
java.lang.NoClassDefFoundError: Could not initialize class java.nio.file.FileSystems$DefaultFileSystemHolder
        at java.nio.file.FileSystems.getDefault(FileSystems.java:176)
        at java.nio.file.Paths.get(Paths.java:84)
        ・・・
```

`NoClassDefFoundError`が出ているのでクラスパスやjarを確認するが、何度確認しても問題ない・・・。
ググってみると[こちら](https://bugs.openjdk.java.net/browse/JDK-7050570)のような「`file.encoding`がcp037だと発生する」というJDKのバグ報告が見つかるが、そもそもfile.encodingなんて触ってない・・・。
というか障害報告と同じサーバーで同じように実行しても再現しない。

このプログラムはあるディレクトリ内のファイルを外部に送信し、送信し終わったらそのディレクトリを削除する、という処理を行っている。障害報告に上がっていたスクリーンショットを良く見直してみると、削除対象のディレクトリがカレントディレクトリになっている状態で実行していた。
同じことをしてみたら再現、という流れ。

---
少しデバッグしてみたところ、DefaultFileSystemHolderの初期化処理中に「sun.nio.fs.UnixException：そのようなファイルやディレクトリはありません」が起きていたようですが、根本的な発生箇所は追い切れていません。
この記事の情報を元に詳しい人が調べてくれることを期待。
マイクロサービス

最近の学びを書き留めておきます。

# マイクロサービスって一体何者なんだ
- ECサイトを例にすると、商品検索、おすすめ商品、セール中商品、カート情報などなど、様々な情報が一つの画面に表示されるとする
- それらを一つのアプリケーションとして提供(モノリス/モノリシック)するのではない
- 検索機能やおすすめ商品表示機能などが、それぞれ個別のアプリとして動作する。

## それによって何が嬉しいの？
- 機能改修をする際に、改修したい機能だけにメスを入れることができる
   - 従来であれば、共通部品として用意したコード全てに手を加える必要が出る。
- 障害発生時の影響範囲が限定される
- 機能別の負荷をモニタリングすることによって、どの機能に負荷が集中しているか見えるようになる
- その機能だけを垂直/水平スケーリングさせることができたりする

## デメリットもあるよね？
- 機能同士を連携させたい場合に、その連結部分にどのような技術を用いるかを検討する必要がある
    - REST APIにするか、gRPCにするかなど
- 設計が大変(したことがないのでどう大変なのかは説明できない....)

# マイクロサービスアーキテクチャ + コンテナを実現するために
- Amazon EKS(https://aws.amazon.com/jp/eks/) を使うという選択肢
- GKE(https://cloud.google.com/kubernetes-engine?hl=ja) を使うという選択肢もある

## Dockerの基礎知識が活きる
- Dockerイメージの取扱いやコンテナの動かし方の理解が必須となる

## Kubernetesの読み方は職場に合わせる
- 郷に入っては郷に従う


## Kubernetesについてはこれから勉強するがそれほど難しくなさそう
- もともと基盤などインフラ設計や構築をされていた人にとってはそんなに難しくなさそう
- 「内部でLBやルーティングテーブルを飼っているネットワークなんだ」という認識
- 参考書やサイトを漁ってモリモリと知識を付けていく方向でしばらくお勉強する予定
- 意外と詳しい人がいないようなので実績としてkubernetesの名前を言えれば単価アップも狙えるかもしれない
【Ruby】ハッシュ

#Hash
オブジェクトが１つである配列に対して、オブジェクトが「キー」と「バリュー」の２つであることが特徴。

```rb
fruits = {"apple": "100円", "orange": "80円", "melon": "500"}
p fruits

【実行結果】
{:apple=>"100円", :orange=>"80円", :melon=>"500"}
```
上記のコードではapple,orengeが「キー(key)」、１００円、８０円が「バリュー(value)」にあたる。
ハッシュの利点としては`apple=>"100円"`の様に各要素に意味やつながりをつけることができる。

##Hashの基本機能

###Hashの要素を取得する

```rb
hash = {ruby:"rails",python:"Django",php:"cakePHP"}
p hash[:ruby]

【実行結果】
"rails"
```

###fetchメソッドでバリューを取り出す

```rb
hash = {ruby:"rails",python:"Django",php:"cakePHP"}
p hash.fetch(:ruby)

【実行結果】
"rails"
```
###Hashに要素を追加

```rb
hash = {ruby:"rails",python:"Django",php:"cakePHP"}
p hash
hash[:java] = "Spring"
p hash

【実行結果】
{:ruby=>"rails", :python=>"Django", :php=>"cakePHP"}
{:ruby=>"rails", :python=>"Django", :php=>"cakePHP", :java=>"Spring"}
```

###Hashのサイズを取得する

```rb
hash = {ruby:"rails",python:"Django",php:"cakePHP"}

【実行結果】
p hash.size
p hash.length
```
###Hashの要素を削除

```rb
hash = {ruby:"rails",python:"Django",php:"cakePHP"}
p hash
hash.delete(:ruby)
p hash

【実行結果】
{:ruby=>"rails", :python=>"Django", :php=>"cakePHP"}
{:python=>"Django", :php=>"cakePHP"}
```
■delete_if、rejectメソッドを使用することで条件を設定して要素を削除できる

```rb
hash = {ruby:"rails",python:"Django",php:"cakePHP"}
p hash
hash.delete_if{|key,value| value.size == 6}
p hash
hash.reject!{|key,value| value.size == 7}
p hash

【実行結果】
{:ruby=>"rails", :python=>"Django", :php=>"cakePHP"}
{:ruby=>"rails", :php=>"cakePHP"}
{:ruby=>"rails"}
```
なお、rejectは！をつけないと破壊的メソッドにはなりません。
###Hashの結合

```rb
hash1 = {ruby:"rails",php:"cakePHP"}
hash2= {python:"Django",java:"Spring"}
hash3= hash1.merge(hash2)
p hash3

【実行結果】
{:ruby=>"rails", :php=>"cakePHP", :python=>"Django", :java=>"Spring"}
```

##Hashの便利なメソッド

###find:Hashの要素を検索する

```rb
fruits = { "apple" => 100, "orange" => 80, "melon" => 500 }
p fruits.find {|k,v| k == "apple"}

【実行結果】
["apple", 100]
```
###sort:Hashの要素をソートする

```rb
h = { "def" => 2, "ghi" => 1, "abc" => 3 }
p h.sort
p h

【実行結果】
[["abc", 3], ["def", 2], ["ghi", 1]]
{"def"=>2, "ghi"=>1, "abc"=>3}
```
ハッシュのキーで昇順でソートしたい場合は上記の様に記載する。

###each：一括で値を取り出す

```rb
hash = { Samurai: 1, Ruby: 2, Rails: 3 , Swift: 4, Java: 5, PHP: 6}
hash.each { |key, value| puts "#{key} => #{value}"}

【実行結果】
Samurai => 1
Ruby => 2
Rails => 3
Swift => 4
Java => 5
PHP => 6
```
【Udemy Python3入門+応用】　37. 値が入っていない判定をするテクニック

**※この記事はUdemyの
「[現役シリコンバレーエンジニアが教えるPython3入門+応用+アメリカのシリコンバレー流コードスタイル](https://www.udemy.com/course/python-beginner/ "現役シリコンバレーエンジニアが教えるPython3入門+応用+アメリカのシリコンバレー流コードスタイル")」
の講座を受講した上での、自分用の授業ノートです。
講師の[酒井潤](https://twitter.com/sakaijun "酒井潤")さんから許可をいただいた上で公開しています。**


##■値が入っているか？入っていないか？
#####◆使うもの
```python
if is_ok:
    print('OK!')
else:
    print('No!')
```
を用意し、`is_ok`に色々入れてみて試してみる。

##■数字
#####◆1の場合
```python:is_ok
is_ok = 1

if is_ok:
    print('OK!')
else:
    print('No!')
```
```:result
OK!
```

#####◆0の場合
```python:is_ok
is_ok = 0

if is_ok:
    print('OK!')
else:
    print('No!')
```
```:result
No!
```
変数に数字が代入されている場合、
**0** ならばif文では`False`となり、
**0以外の数字**(正でも負でも) ならばif文では`True`となる。
これを利用して、変数に0以外の値が代入されているかどうかを調べることができる。

##■`False`と判定されるもの
`0` (int型)
`0.0` (float型)
`''` (str型)
`[]` (list型)
`()` (tuple型)
`{}` (dict型)
`set()` (set型)
【KMapper】プロパティ名のケースを変換してマッピングを行う【Kotlin】

自作の`Kotlin Object` to `Kotlin Object`マッパー、`KMapper`の機能紹介です。

- [GitHub ProjectMapK/KMapper: Mapper Libraly for Kotlin\.](https://github.com/ProjectMapK/KMapper)
- [JitPack ProjectMapK / KMapper](https://jitpack.io/#ProjectMapK/KMapper)

バージョンは`KMapper 0.11`で書いています。

# プロパティ名を変換してマッピングを行う
「ソースがスネークケースで、マップ先がキャメルケース」というような場合、`KMapper`では第二引数に変換関数を渡すことで、以下のように書くことができます。
この例では、変換関数として`Guava`の`com.google.common.base.CaseFormat`を利用しています。

```kotlin
class CamelCaseDst(val camelCase: String)

fun test() {
    val expected = "camelCase"
    val src = mapOf("camel_case" to expected)

    val mapper = KMapper(CamelCaseDst::class) {
        CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, it)
    }
    val result = mapper.map(src)

    assertEquals(expected, result.camelCase)
}
```

## 変換に関する実装方針
この記法変換に関しては、変換回数を最小にするため、マップ先のプロパティを変換する方針で記述しました。
そのため、変換を記述したインスタンスでは、その変換先と合致する記法のソースを用いなければマッピングを行えません。

## 補足
`KMapper`では記法の変換関数を提供しておりません。
`Guava`や`Jackson`など、プロジェクトの基盤となるライブラリではこういった変換関数が提供されているので、そちらの利用をお願いします。

手前味噌ですが、`Jackson`を使う場合は以下の記事にまとめてあります。

- [【Java】キャメルケースやスネークケースといった記法を相互変換する【Jackson】 \- Qiita](https://qiita.com/wrongwrong/items/96e8cbf3cf107876acf9)
【KMapper】複数ソースからマッピングする【Kotlin】

自作の`Kotlin Object` to `Kotlin Object`マッパー、`KMapper`の機能紹介です。

- [GitHub ProjectMapK/KMapper: Mapper Libraly for Kotlin\.](https://github.com/ProjectMapK/KMapper)
- [JitPack ProjectMapK / KMapper](https://jitpack.io/#ProjectMapK/KMapper)

バージョンは`KMapper 0.12`で書いています。

# 複数ソースからマッピングする。
`KMapper`では以下のように複数の`Pair`/`Map`/オブジェクトからマッピングを行うことができます。

```kotlin
data class Dst(
    val fooId: Int,
    val barName: String,
    val bazDescription: String?
)

// ソースになるクラス、fooIdがフィールドに無い
data class Src(
    val barName: String,
    val bazDescription: String?
)

fun mapping(fooId: Int, src: Src) {
    val mapper = KMapper(::Dst)
    // Srcに足りないフィールドをPair<String, Int>で補い、srcからマッピング
    val dst: Dst = mapper.map("fooId" to fooId, src)
}
```

## 利用想定
「1対多のテーブルで、まず1を永続化してIDを生成し、そのIDを用いて多を永続化する」というような状況や、「複数のオブジェクトを合わせて1つのオブジェクトを作る」という状況での利用を想定しています。
既存の`Java`系ライブラリでは、このような場合に「1度マッパーでオブジェクトを生成し、それに対してセッター経由でセットする」ような書き方になりがち[^hosoku]ですが、`KMapper`ではそのようなマッピング処理もまとめて書くことができます。

[^hosoku]: あくまで自分が把握している範囲の話なので、そうじゃないライブラリも有るかもしれません。

## 同名のフィールドが複数有る場合について
同名のフィールドが複数あった場合は、先に入力した方を優先して取り扱います。
従って、重要な値ほど初めに書く必要が有ります。

### 競合が解消できない場合
複数オブジェクト間で競合が発生した場合は`KGetterIgnore`アノテーションを用いて以下のように書けます。
以下は`Src1`と`Src2`の2クラスにそれぞれ`KGetterIgnore`を設定することで、どちらの値を先に入れてマップしても同じ値が返るようにした例です。

```kotlin
data class Src1(val arg1: Int, val arg2: String, @get:KGetterIgnore val arg3: Short)
data class Src2(@get:KGetterIgnore val arg2: String, val arg3: Int, val arg4: String)

data class Dst(val arg1: Int, val arg2: String, val arg3: Int, val arg4: String)

fun test() {
    val src1 = Src1(1, "2-1", 31)
    val src2 = Src2("2-2", 32, "4")

    val mapper = KMapper(::Dst)

    val dst1 = mapper.map(src1, src2)
    val dst2 = mapper.map(src2, src1)

    assertEquals(dst1, dst2)
    assertEquals(Dst(1, "2-1", 32, "4"), dst1)
}
```
【MockK】ジェネリクスが絡む関数でany()しているのにio.mockk.MockKException: no answer found for: ~が出る状況への対処【Kotlin】

# TL;DR
`every`内で`any()`を指定しているにも関わらず、`io.mockk.MockKException: no answer found for: ~`となる場合は、`any</* 引数として渡したい型 */>()`と修正することで解決できるかもしれません。
具体的には、`fun func(...): Any`（`Java`なら`Object`）と`fun <T> func(...): T`のような定義が有る場合です。

# 状況
下記の`Sample`クラスに定義した`func`メソッドの内、`KClass`を引数に取る方をモックしようとしました。

```kotlin
class Sample {
    fun <T : Any> func(value: KClass<T>): T = /* Tの生成処理 */

    fun func(value: String): Any = /* Anyを返すような処理 */
}
```

所が、下記のテストコードでは、モックしたはずの`func`関数を呼び出した所でテストが失敗しました。
エラーメッセージは`io.mockk.MockKException: no answer found for: Sample(#1).func(Target)`となっていました。

```kotlin
class Test {
    @Test
    fun test() {
        val sample = mockk<Sample>()
        every { sample.func(any()) } returns Target()

        // ここで落ちる
        val result = sample.func(Target::class)

        assertEquals(Target(), result)
        verify(exactly = 1) { sample.func(Target::class) }
    }
}
```

# 対処
以下のように`any()`にジェネリクスを指定してやることで解決します。

```kotlin
class Test {
    @Test
    fun test() {
        val sample = mockk<Sample>()
        // ジェネリクス指定を追加
        every { sample.func(any<KClass<*>>()) } returns Target()

        val result = sample.func(Target::class)

        verify(exactly = 1) { sample.func(Target::class) }
    }
}
```
【JitPack】pushでCI -> publishまで走るようにする【JitCI】

# やること
`JitCI`で`push`したら「ビルド -> テスト -> publish」まで走るようにします。

## 前提
`JitPack`にはログインできる状態になっている状態が前提です。

# やり方
## JitCIにログインする
下記URLにアクセスして`JitCI`にログインします。

- [JitCI](https://jitci.com/)

## リポジトリを追加する
`CI`をやりたいリポジトリを左上の検索から追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280230/8196d869-6a04-81fb-1dc4-03972f0306ef.png)

追加できると、以下のように一覧に追加されます（一度も`CI`を回していないときは灰色で追加されます）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280230/13d53c9e-ba0f-2cda-4fc6-34c2785b8b47.png)

## Webhooksを設定する
[公式のreadme](https://github.com/jitpack/jitci#building-on-push)通り設定すればできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280230/496d7e94-8710-603f-39ad-7beb5ba5a331.png)
Windowsのnode.jsでCannot find module が出た場合の対処

個人メモ用です。
ejsをグローバルインストール。node.jsで利用すると『Cannot find module』のエラーが発生しました。
下記の記事通りで正常に動作するようになりました。
[Windowsのnode.jsでCannot find module が出た - Qiita](https://qiita.com/takiru/items/391817ea6c62837ace5a)

補足：上記以降の対応 NODE_PATH %AppData%\Roaming\npm\node_modules を 具体的なパスに変更
【Kotlin】リフレクションの高速化テクニック雑まとめ

リフレクションを弄る中で見つけた「これをやると遅くなる/これをやると速くなる」のまとめです。
間違い等有れば指摘大歓迎です。

# kotlin.reflect.*をimportするようなことをしない
`Kotlin`のリフレクションははっきり言って遅いです。
なので、`kotlin.reflect`から何かを`import`するような処理はできるだけ避けた方が良いです。

具体的には、コンストラクタを取得する際は`class.primaryConstructor!!`とかはせず、`::class`などの方法でメソッドリファレンスを取得した方が高速です。

# リフレクションの呼び出し回数を減らす/取得結果を使いまわす
前述の通り`Kotlin`のリフレクションは遅いため、アクセス回数は当然減らした方が良いです。
また、リフレクションのプロパティへアクセスする場合でも、その実態はカスタムゲッターなどで、アクセスの度に処理を回していたりします。

このような作りになっているのは何かしら理由が有るのでしょうが、何も考えずにガンガン参照してしまうとその分だけ動作が重くなるので、実装を確認しつつ不具合が出ないならできる限り結果を使いまわした方が効率がいいです。

# KFunction.callを使う/callByを使わない
`KFunction`の呼び出しには`call`と`callBy`の2種類のインターフェースが用意されています。
この2つは以下のような特性が有ります。

- `call`
  - 引数を可変長引数で渡す
  - 引数の順番が正しい必要が有る
  - オーバーヘッドが少なく高速
- `callBy`
  - 引数を`Map<KParameter, Any?>`で渡す
  - 引数の順番は順不同
  - オーバーヘッドが大きく低速（最終的には`call`が呼ばれる）

何も考えない場合`callBy`の方が扱いやすいですが、オーバーヘッドの大きさから、高速化を考える場合は`call`一択で考えた方が良いです。

# プロパティを読み出す時はjavaGetterで行う
インスタンスからプロパティを読み出す場合、`Kotlin`のリフレクションのみを用いると大まかに以下2通りの方法で取得ができます。

```kotlin:前処理
val foo = /* 何かしらのインスタンス */

// クラス内のプロパティを取得
val properties: Collection<KProperty1<T, *>> = foo::class.memberProperties
// 値を得たいプロパティを取得
val property: KProperty1<T, *> = properties.first { /* 取得条件 */ }
```
```kotlin:手段1
val result = property.call(foo)
```
```kotlin:手段2
// プロパティのゲッターを取得
val getter: KProperty1.Getter<T, *> = property.getter
val result = getter.call(foo)
```

この2つの方法は、自分が試した限りではそれほど性能が変わりませんでした。
一方、以下の`javaGetter`で行う方法では有意な高速化が確認できました。

```kotlin
/* 手段3 */
val javaGetter = property.javaGetter!!
val result = javaGetter.invoke(src)
```
【Python】Missingno を使って欠損値を可視化


# はじめに
データ分析において、データの欠損は一番初めに立ちはだかる課題の一つです。より良いモデルを作るには、欠損値を予め把握し処理してあげる必要があります。
Missingnoは欠損値を効果的に可視化することで、データの前処理をより効率的にすることを可能にします。

## 1. Missingnoのインストール
```terminal
pip install missingno
```
で Missingnoをインストールします。


## 2. Missingno を使ってみる

MissingnoはPythonのPandasデータで利用できます。
データはKaggleのTitanicデータを使用します。

```python
import missingno as msno
import pandas as pd
```

```python
msno.matrix(df)
```

![download.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407366/7bf33a84-f637-af5d-f90e-8aa2ee99d9da.png)

欠損値がデータ全体のどこに分布しているのががわかります。


```python
msno.bar(df)
```

![download (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407366/0c00ad26-bc4b-a10f-861c-3fd85f8a4042.png)


各特徴量でどれくらい欠損値があるのかがわかります。

```python
msno.heatmap(df)
```

![download (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407366/25aac162-91ab-28f1-8b50-01f563b83be6.png)

欠損値における特徴量間の相関度を表したヒートマップです。

```python
msno.dendrogram(df)
```

![download (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407366/78935e2f-9e72-bcc3-5322-996e66291790.png)

最後に、欠損値の分布で特徴量をまとめた結果です。

詳しくは[こちら](https://github.com/ResidentMario/missingno) をご参照ください。
【CircleCI】フォーク先ブランチからのプルリクエストでCI実行を有効にする

# TL;DR
`advanced-settings`から、`Build forked pull requests`をOnにすればできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280230/5f631c2b-86a8-30c6-7075-a24f833a460c.png)

# 問題
個人のリポジトリでやっていたプロジェクトをOrganizationに移譲した所、プルリクエストを立てたときに`CI`が走らなくなりました。

# 原因
フォークからのプルリクエストは、デフォルトでは`CI`の対象になっていないことが原因でした。

# 対策
冒頭に記述した通り、`Build forked pull requests`を`On`にすればできます。
`Draft Pull Request`でも反応します。
ABC056-D "No Need" 解説

#こんにちは
黄色Difficultyです。自力ACできて嬉しいので解説を書きます。
問題はこれ。
[No Need](https://atcoder.jp/contests/abc056/tasks/arc070_b)
#概要
- $a_{1}$,$a_{2}$,...,$a_N$の$N$個の正の整数がある。
- その部分集合のうち総和が$K$以上の集合が「良い集合」。
- $a_{i}$を含む「良い集合」全てにおいて、そこから$a_{i}$を除いた集合も「良い集合」であるとき$a_{i}$は「不必要」。
- 「不必要」な数の個数を求めよ。  

#制約
- ${1} \leq{N} \leq {5000}$
- ${1} \leq{K} \leq {5000}$
- ${1} \leq{a_i} \leq {10^9}$

#考えたこと
まず、制約から$O(NK)$が通ることがわかるので、$a_{i}$それぞれに対して個別に判定して良さそうです。しかし、問題文のまま愚直に判定したのでは、$a_i$を含む集合を全て列挙し、そこから$a_{i}$を除くという煩わしい操作をする必要があります。そこで、次のように問題文の言い換えをします。

- $a_{1}$,$a_{2}$,...,$a_N$の$N$個の正の整数がある。
- その部分集合のうち総和が$K$以上の集合が「良い集合」。
- $a_i$を含まない集合のうち総和が$K$未満のものを考える。この中で総和が最大の集合に$a_i$を足した時、$K$を超えれば$a_i$は「不必要」でない。
- 「不必要」な数の個数を求めよ。  

なぜこの言い換えが成立するのか説明します。
問題概要の
>- $a_{i}$を含む「良い集合」全てにおいて、そこから$a_{i}$を除いた集合も「良い集合」であるとき$a_{i}$は「不必要」。
>

の部分の対偶をとると、

- $a_{i}$が「不必要」でないとすると、$a_i$を含む「良い集合」のうち少なくとも1つは$a_i$を引くと「良い集合」ではなくなる。

となります。

集合の総和を考えたいとなると選んだカードとそこまでの総和を状態として持つDPをしたくなります。しかし、ここで注意すべきなのは「良い集合」とは総和がK以上の集合を指すことです。「K以上」となると集合の総和がDPの状態として持つことができない大きさになってしまいます。そこでもう一度言い換えをします。

- $a_i$を含まない集合のうち総和が$K$未満のものを考える。この中で**総和が最大の集合**に$a_i$を足した時、$K$を超えれば$a_i$は「不必要」でない。

上の
>- $a_{i}$が「不必要」でないとすると、$a_i$を含む「良い集合」のうち少なくとも1つは$a_i$を引くと「良い集合」ではなくなる。
>

を判定するには**総和が最大の集合**だけ考えればよいというのが大切です。

こうなれば、 $a_i$それぞれに対して
$DP[j$番目まで$({1} \leq{j} \leq {N},i$は除く$)][$総和$k({1} \leq{k} \leq {K})]=true$ or $false$
という DPを考えることができます。しかしこれでは$O(N^2K)$となり、TLEしてしまいます。

そこで少し工夫をします。DPの配列を前からの総和で1つ、後ろからの総和で1つ持ち前計算をしておくのです。こうすれば$a_i$それぞれにおいて前からの総和、つまり$j$番目$({1} \leq {j} \leq {i-1})$を決め打ちし、後ろからのDPにおいて足して$K$を超えない最大のものを二分探索で求めることができるので、全体計算量は$O(NKlogK)$となりACできます。

#ACコード
```c++:main.cpp
#include <bits/stdc++.h>

#define int long long

#define _overload3(_1,_2,_3,name,...) name
#define _rep(i,n) repi(i,0,n)
#define repi(i,a,b) for(int i=(int)a, i##_len=(b); i<i##_len; i++)
#define rep(...) _overload3(__VA_ARGS__,repi,_rep,)(__VA_ARGS__)

#define all(box) box.begin(), box.end()

using namespace std;

using P = pair<int,int>;
using ll = long long;

const long long INF = LLONG_MAX/3;

template<class T> inline bool chmax(T& a, T b) { if (a < b) { a = b; return 1; } return 0; }
template<class T> inline bool chmin(T& a, T b) { if (a > b) { a = b; return 1; } return 0; }

bool dp[5010][5010]={},dpr[5010][5010]={};
signed main(){
	int n,k;
	cin>>n>>k;
	int a[5010];
	rep(i,n){
		cin>>a[i];
	}
	dp[0][0]=true;
	dpr[0][0]=true;
	rep(i,1,n+1){
		rep(j,k)dp[i][j]=dp[i-1][j];
		rep(j,k){
			if(dp[i-1][j]){
				if(j+a[i-1]<k)dp[i][j+a[i-1]]=true;
			}
		}
	}
	rep(i,1,n+1){
		rep(j,k)dpr[i][j]=dpr[i-1][j];
		rep(j,k){
			if(dpr[i-1][j]){
				if(j+a[n-i]<k)dpr[i][j+a[n-i]]=true;
			}
		}
	}
	int cnt=0;
	rep(i,n){
		int mn=INF;
		vector<int> s,t;
		rep(j,k){
			if(dp[i][j])s.push_back(j);
			if(dpr[n-i-1][j])t.push_back(j);
		}
		rep(j,s.size()){
			int l=lower_bound(t.begin(),t.end(),k-s[j]-a[i])-t.begin();
			if(l<t.size())chmin(mn,s[j]+a[i]+t[l]);
		}
		if(mn==INF||mn-a[i]>=k)cnt++;
	}
	cout<<cnt<<endl;
}

```
https://atcoder.jp/contests/abc056/submissions/10579800

#感想
初めて記事を書いてみましたが、自分の考えたことを文字に起こすのって案外難しいですね。わかりにくくなってしまったのは自覚していますが、なかなかうまい言い方が思いつきません。
公式解説を見る限り、もっと計算量を改善する方法があるようですが、僕には理解できませんでした。どなたか教えてくださると嬉しいです。
CakePHPインストール

導入先
EC2(amzn2-ami-hvm-2.0.20200207.1-x86_64-gp2)
apache( httpd-2.4.41-1.amzn2.0.1.x86_64.rpm)
php(7.3.14)

apacheユーザを使用したいのでnologinであれば変更

```
$ sudo su -
# usermod -s /bin/bash apache
# usermod -d /var/www apache
```

# Composer のインストール

```
# php -r "copy（ 'https://getcomposer.org/installer'、 'composer-setup.php'）;"
特にディレクトリ指定はない
```

```
# php composer-setup.php
↓出力
All settings correct for using Composer
Downloading...

Composer (version 1.9.3) successfully installed to: 
${currentdir}/composer.phar
Use it: php composer.phar
```

カレントディレクトリに2つファイルが生成される
composer.phar
composer-setup.php

composer-setup.phpのみ削除

```
# php -r "unlink('composer-setup.php');"
```

コマンド実行したい為PATHが通るディレクトに移動する

```
# mv composer.phar /usr/local/bin/composer
```

#CakePHP プロジェクトを作成

例えば
http(s)://hogehoge.co.jp をドメインとする場合

```
# su - apache
$ cd /var/www/
$ composer self-update && composer create-project --prefer-dist cakephp/app:^3.8 hogehoge.co.jp
```

バーチャルホスト設定

```
$ sudo su -
# vim /etc/httpd/conf.d/hogehoge.co.jp.conf
<VirtualHost *:80>
    ServerName hogehoge.co.jp
    CustomLog "logs/hogehoge.co.jp_access_log"
    ErrorLog  "logs/hogehoge.co.jp_error_log"

    DocumentRoot /var/www/hogehoge.co.jp/webroot
    <Directory "/var/www/hogehoge.co.jp/webroot">
        Options -Indexes +FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>
```

apache再起動

```
systemctl stop httpd.service
systemctl start httpd.service
```

ドメイン設定もろもろしたらhogehoge.co.jpにアクセス
以下画面がでれば準備完了
![WS000004.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168615/52a1acaf-b8e3-f0b5-65dd-c21acbe957dc.jpeg)
【解説】二次元配列を転置(transpose)するJavaScriptワンライナー

二次元配列を転置(transpose)するJavaScriptワンライナーをネットで見つけて使えることはすぐにわかったのですが、どのように動作するのかがすぐにわからなかったので解説を書いてみました。

## 参考
日本語記事
https://qiita.com/kznr_luk/items/790f1b154d1b6d4de398
↑の元ネタ
https://stackoverflow.com/questions/17428587/transposing-a-2d-array-in-javascript

## ワンライナー

```javascript
array[0].map((col, i) => array.map(row => row[i]));
```

## 解説
2つの部分に分けて考えるとわかりやすいです。

まず、置換**前**の各列をループします。これが転置後二次元配列の各行になります。それが、

```javascript
array[0].map((col, i) => ...));
```
の部分になります。
インデックス`0`の行を取り出してmapすることで各列のインデックス(変数`i`に入る)を使えるようにしています。forループを使うより短く書けますね。

それから、`...`の部分が実際に置換後の各行を作っているところです。それが、

```javascript
array.map(row => row[i])
```

の部分です。

置換前の二次元配列の列を一次元配列にして返します。
たとえば、`i`が`0`の場合、`array.map(row => row[0])`となり、これはもとの二次元配列の1列目を返します。

これをすべての列に対して行いくっつければ転置した二次元配列の完成です。

まとめると、

```javascript
array[0].map((col, i) =>       // 二次元配列の各列をループして、
    array.map(row => row[i])   // 各列を取り出して一次元配列にして、
);                             // くっつける。
```

となります。