OmniAICreator/Qiita-1.07M huggingface dataset:
IntelliJ IDEAでのKotlin Koansでハマった話(Failed to launch checking)

　どもー、皆さんこんばんちわ！某Ａ省のHiroです。
寒くなってきましたね。
　今回は、IntelliJ IDEAでKotlin Koansをやろうとして1時間ほどハマってしまったので、そのことについて書きます。

<h1>ざっくりとこんな感じでハマりました</h1>
<a href="https://play.kotlinlang.org/koans/overview" _blank>　Kotlinの公式ページでKoans</a>をちょっとやってみて面白かったので、<b>今まで使ったことがなかった</b>IntelliJ IDEAをダウンロードして、Koansをじっくりやってみることにしました。
今後のKotlinを使ったプログラミングは、使い慣れたeclipseにKotlinプラグインを入れてやることに決めていたので、Intellij IDEAはEducational Editionを選びました。<a href="https://www.jetbrains.com/help/education/learner-start-guide.html?section=Kotlin%20Koans" _blank>こちら</a>の要領でやってみたところ、本来ならば「Check」ボタンを押したら「Correct」などが表示されるはずなのですが、一番最初のチャプターから「Failed to launch checking」と表示されました。
　<b>「・・・ふっ、闘い（パソコンの勉強）を始める前にハメてくるとは・・・さすがKotlin！！」</b>

<h1>そもそも、なぜKotlin</h1>
　因みに、Kotlinを始めた理由については、なんとなく大きく分けて、三つあります。
　１．Javaの有償化
　２．GoogleがAndroidの開発に制式採用
　３．<b>パッと見、JavaよりかっこよくてPythonの気持ち悪さがない</b>
１、２の理由については、今後、仕事が取れる技術は何か？流行りそうな言語は？っていうのを考えた時に、非常に大きいのかなー？と、私は思います。
　実は、３の理由が一番大きいです。Kotlin良いよ、という記事をちょこちょこ読んで、よく分からないけどとりあえずコードを眺めてみたり、少し突っ込んでリファレンスを読んでみたりした時に感じました。
<h1>解決は超簡単</h1>
　さて、どうやってFailed to launch checkingから抜け出したかについてですが、IntelliJ IDEAでの設定で<b>JDKへのパスを通す</b>、です！
 ・・・えっ！？それだけっ！？って感じですね（笑）
パスを通して、アプリケーションを再起動したらちゃんと使えるようになりました。（笑）
　"Failed to launch checking Kotlin Koans"のキーワードでググってみると、<a href="https://www.reddit.com/r/Kotlin/comments/8dozcz/already_stuck_with_kotlin_before_i_even_start/" _blank>こんなの</a>や<a href="https://github.com/Kotlin/kotlin-koans/issues/150" _blank>こんなの</a>が見つかるのですが、事例の数としてはそんなに多くないみたいです。（パスを通し忘れるマヌケはほとんどいないということですね…）
　が、<a href="https://intellij-support.jetbrains.com/hc/en-us#" _blank>JetBrainsのIDE系のサポートページ</a>を見ると、パスの通し忘れ以外の理由でも同様の現象が起きている人もいるようなので、環境をよく調べて原因を特定しなくてはいけないようです。
<h1>まとめ</h1>
　新しい開発環境を準備するときは、どんなところで躓くかわからないものですね（苦笑）因みに、Kotlinの勉強という点に限って言えば、Koansはブラウザ上でさくっと終わらせてしまったほうが手軽でいいです。
Docker for Winodows 上の Mattermost からデータ移管時に画像リンク切れして焦った

## 問題現象

* Mattermost のホストを引っ越ししようとデータ移管したが、過去に投稿された画像の多くが表示されず、読み込み待ち表示や空表示となってしまった。
* 一部の画像は問題なく表示されている。
* 正しく表示されない画像の URI もデータ移管先の API から取得しようとしている。

## 環境

### 移行元

* Windows Server 2016 + Docker for Windows 18.06.1-ce
* Mattermost V4.5.1
    * Docker Image: [mattermost/mattermost-preview](https://hub.docker.com/r/mattermost/mattermost-preview/)
    * Mattermost のデータは Docker コンテナのボリュームを **Windows のファイルシステムにマウント** して永続化
* GNU tar 1.30 (git for Windows V2.19.0 に同梱の tar)
    * データ移管時に使用

### 移行先

* Debian 9.5 + Docker 18.06.1-ce
* Mattermost V5.3.1
    * Docker Image: [mattermost/mattermost-preview(同上)](https://hub.docker.com/r/mattermost/mattermost-preview/)
* GNU tar 1.29

### データ移管作業

* Windows フォルダ配下にファイルとして永続化されたデータ(mattermost-data, mysql)をアーカイブしてデータ移行先へ転送。
* Windows 標準の機能で zip ファイルにアーカイブしようとしたが、扱えないファイル名があるとのエラーが出て失敗。
* 代わりに、Windows 上で GNU tar コマンドを使って tar.gz ファイルにアーカイブ。特に、エラーや警告はなし。
* 移行先では Docker コンテナのボリュームをマウントした Windows フォルダ配下に tar.gz ファイルを展開してデータ復元。

## 原因

* Mattermost でメッセージに画像を Ctrl+V で貼り付けた場合、そのデータを永続化するファイルの名前が「画像の貼り付け先: ～」となり、Windows ファイルシステムでの禁則文字 `:` を含んでしまっている。

* Windows ファイルシステム上のファイル名として `:` は禁則文字だが、Docker コンテナ内では `:` を含むファイル名も作成でき、かつ、 Docker コンテナのボリュームを Windows ファイルシステムにマウントしている場合でも、Docker コンテナ内からは `:` を含むファイル名で扱えてしまう。

* Windows 側から該当ファイルを見ると、ファイル名中の `:` が別の文字 `` に置き換えられて見える。それを GNU tar でアーカイブするとその文字が文字化けしてアーカイブされてしまう。

## 対策

* Docker コンテナ内でボリュームをアーカイブする。
    + Docker コンテナの Shell に接続
    + コンテナ内の Shell で tar コマンドを実行してボリューム上のファイル一式をアーカイブ
    
    ```
    PS> docker exec -it <container_name> /bin/bash
    bash> (cd /mm/mattermost; tar cf /tmp/mattermost-volumes.tar config/ mattermost-data/)
    bash> (cd /var/lib; tar rf /tmp/mattermost-volumes.tar mysql/)
    bash> gzip /tmp/mattermost-volumes.tar
    bash> ^C
    PS> docker cp <container_name>:/tmp/mattermost-volumes.tar.gz .
    ```

わかってしまえば対策は簡単だが、Docker for Windows のボリュームマウントでは Windows ファイルシステムでの禁則文字を含むファイル名でも保存できてしまうとは想像していなかった。

## 参考(ベストプラクティス)

あとから調べてみると、Docker コンテナのボリュームをバックアップするには、 `--volumes-from` を使ってバックアップ処理用の Data Volume Container を横付けし、そのコンテナ内からアーカイブするのがベストプラクティスのようです。

* [Backup, restore, or migrate data volumes - docker docs](https://docs.docker.com/storage/volumes/#backup-restore-or-migrate-data-volumes)
* [Dockerのシステム移行手順（バックアップおよび復元方法）](https://qiita.com/mikoski01/items/7d71ef7d167a6b78219a#3-ボリュームをバックアップ)
* [Docker の Data Volume まわりを整理する](https://qiita.com/lciel/items/e21a4ede3bac7fb3ec5a)

Data Volume Container は知っていたのですが、コンテナ内からアーカイブすべき理由を身をもって理解できました。

以上
JavaScript 基本

JavaScriptに関する自分用のメモです。
随時更新していきます。

# [jsfiddle](https://jsfiddle.net)
- html, css, jsを管理できるサービス
- Your public fiddle から自分が作成した今までのスニペットを確認できる

```
https://jsfiddle.net/user/ユーザー名/fiddles/
```

```
Run 実行
Update 保存
Set as base URLを最新にする
```



# ES6
準備中

- [もうはじめよう、ES6~ECMAScript6の基本構文まとめ(JavaScript)~](https://qiita.com/takeharu/items/cbbe017bbdd120015ca0)
- class構文
- promise（通信中、成功、失敗）
- アロー関数の省略記法（複雑なコードに出てくると見慣れない）
- 分割代入 {}



# ハマりどころ
エラーが出たり、何をして良いかわからなくなってしまったとき

- エラーを読んで原因を突き止める

```
"ReferenceError: ●●●● is not defined"
```

- ライブラリが読まれていない
- どこまでができていて、どこまでが間違っているかを `console.log()` などを使って突き止める
- import 及び export されていない
- 変数が定義されていない
- 型が間違っている
- いきなりコードを書かずにやりたい処理を紙に書いてみる
- エラーが出るのは正常な動作、むしろヒントを教えてくれているので怖がらない
- 文法エラー（SyntaxError）はよく見直す
- 何がわからないのか整理する



# 読み込みタイミング
- [jQueryの基本 - $(document).ready](https://qiita.com/8845musign/items/88a8c693c84ba63cea1d)
- [jQueryの読込み「ready」と「load」と「function」の順番について](http://web-wizardry.net/jquery/jquery%E3%81%AE%E8%AA%AD%E8%BE%BC%E3%81%BFready%E3%81%A8load%E3%81%AE%E9%A0%86%E7%95%AA%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/)

# イベント
- [JavaScriptのイベントをたくさん見られるサイトを作る](https://qiita.com/noplan1989/items/9333faad731f5ecaaccd)
- [JavaScriptのイベントをたくさん見られるサイト](https://listener.noplan.cc/)

## バブリング
- [DOMイベントのキャプチャ/バブリングを整理する 〜 JSおくのほそ道 #017](https://qiita.com/hosomichi/items/49500fea5fdf43f59c58)
- [jQuery のバブリング、preventDefault() や stopPropagation() の使用例 ｜ Tips Note by TAM](https://www.tam-tam.co.jp/tipsnote/javascript/post5050.html)
- [[jQuery]イベントのバブリングって何？ | たねっぱ！](http://taneppa.net/jquery-bubbling/)


# API
## Qiita API
https://qiita.com/api/v2/docs


# その他
## MVC モデル
- [図解！どのサイトを見てもわからなかった人のためのMVC](https://qiita.com/a24dai/items/5fddbffdbb05b2ed2894)
- [MVC、本当にわかってますか？](https://qiita.com/tshinsay/items/5b1724baf32b8b5113c2)
- [JavaScriptにおけるMVC（MVVM）　【JavaScript フレームワーク入門】](http://jsstudy.hatenablog.com/entry/JavaScript-Framework-Introduction_4-1-1_MVC-MVVM-in-JavaScript)



## モーダル
- [JSでiOSにも配慮した背景固定なスクロール対応のモーダルウィンドウ](https://spyweb.media/2017/09/21/modal-window-fixed-background-also-support-ios/)



## イディオム
- [a = a || {};](http://note.onichannn.net/archives/1381)
- [javascriptイディオム集](https://qiita.com/cocottejs/items/cb2623316a0c82b603c4)
初心者がBabelでハマったこと

#目次
1. 環境
1. Windowsではじめたら「.babelrc」ファイルが作れない
1. Babeったら「Error: Plugin/Preset files are not allowed to export objects, only functions」
1. 困った時のヒント

# 環境
ハマった時の環境です

```json:package.json
  "devDependencies": {
    "@babel/core": "^7.1.2",
    "babel-cli": "^6.26.0",
    "babel-preset-es2015": "^6.24.1",
    "babelify": "^10.0.0",
    "browserify": "^16.2.3"
  }
```

# Windowsではじめたら「.babelrc」ファイルが作れない
Windowsでは新規ファイル作成から「.babelrc」ファイルを作ろうとすると「ファイル名を入力してください」というエラーになります。

以下の方法で「.」から始まるファイルが作れます
###コマンドを利用する

```
echo { "presets": ["@babel/preset-env"] } > .babelrc
```

###エディタを利用する（サクラエディタなど）
ファイルを保存するときにファイル名「.babelrc」で保存するだけです。

# Babeったら「Error: Plugin/Preset files are not allowed to export objects, only functions」

エラーが発生している状態の設定ファイル

```json:.babelrc
{ "presets": ["es2015"] }
```

Babeってみる

```
node_modules\.bin\browserify -t babelify test.js --outfile test_out.js
```

エラーになりました。
```Error: Plugin/Preset files are not allowed to export objects, only functions.```

調べてみるとパッケージが足らないようなので、インストールします。

```
npm i @babel/preset-env
```

設定を書き換えます。

```json:.babelrc
{ "presets": ["@babel/preset-env"] }
```

再度Babeってみる

```
node_modules\.bin\browserify -t babelify test.js --outfile test_out.js
```

成功！
ちなみに「.babelrc」ファイルがなくても、コマンドにPresetsを指定することでBabeることができます。

```
node_modules\.bin\browserify -t [ babelify --presets [ @babel/preset-env] ] test.js --outfile test_out.js
```

### 困った時のヒント
node_modules\babelify配下に「README.md」というファイルがあって
ファイルの中に使い方がきちんと書いてあります。
ネットで検索しても見つからないよ～というときは初心にかえって、マニュアルやReadMeを参考にするのも大切ですね。

```sh:README.md（一部抜粋）
$ browserify -t [ babelify --presets [ @babel/preset-env @babel/preset-react ] ]
```
Makefileでエコーをオフにする

Makefileにてデフォルトでは実行するレシピのコマンドが表示される．
これを[エコー(echoing)](http://quruli.ivory.ne.jp/document/make_3.79.1/make-jp_4.html#Echoing)と呼ぶ．

```shell
$ cat Makefile
help: ## show this help.
    echo "Please use 'make <target>' where <target> is one of\n"
    awk 'BEGIN {FS = ":.*?## "} /^[a-zA-Z_-]+:.*?## / {sub("\\\\n",sprintf("\n%22c"," "), $$2);printf "\033[36m%-20s\033[0m %s\n", $$1, $$2}' $(MAKEFILE_LIST)

$ make
echo "Please use 'make <target>' where <target> is one of\n"
Please use 'make <target>' where <target> is one of

awk 'BEGIN {FS = ":.*?## "} /^[a-zA-Z_-]+:.*?## / {sub("\\\\n",sprintf("\n%22c"," "), $2);printf "\033[36m%-20s\033[0m %s\n", $1, $2}'  Makefile
help                 show this help.
```

上記実行例では，echoコマンドやawkコマンドの結果だけ出力されて欲しく，
エコーされて欲しくない．
これを解決するためにはレシピの各コマンドの前に@を付与する．

```shell
$ cat Makefile
help: ## show this help.
    @echo "Please use 'make <target>' where <target> is one of\n"
    @awk 'BEGIN {FS = ":.*?## "} /^[a-zA-Z_-]+:.*?## / {sub("\\\\n",sprintf("\n%22c"," "), $$2);printf "\033[36m%-20s\033[0m %s\n", $$1, $$2}' $(MAKEFILE_LIST)

$ make
Please use 'make <target>' where <target> is one of

help                 show this help.
```

こういったコマンドが大量にある場合で，
実行時にて実行するコマンド全てに適用したい場合は
-s/--silent/--quiet オプションを付与して実行する

```shell
$ cat Makefile
help: ## show this help.
    echo "Please use 'make <target>' where <target> is one of\n"
    awk 'BEGIN {FS = ":.*?## "} /^[a-zA-Z_-]+:.*?## / {sub("\\\\n",sprintf("\n%22c"," "), $$2);printf "\033[36m%-20s\033[0m %s\n", $$1, $$2}' $(MAKEFILE_LIST)

$ make -s
Please use 'make <target>' where <target> is one of

help                 show this help.
```

特定ターゲットに対してエコーをオフにしたい場合は
.SILENTターゲットにて対象ターゲットを指定するとよい．

```shell
$ cat Makefile
.SILENT: help
help: ## show this help.
    echo "Please use 'make <target>' where <target> is one of\n"
    awk 'BEGIN {FS = ":.*?## "} /^[a-zA-Z_-]+:.*?## / {sub("\\\\n",sprintf("\n%22c"," "), $$2);printf "\033[36m%-20s\033[0m %s\n", $$1, $$2}' $(MAKEFILE_LIST)

$ make
Please use 'make <target>' where <target> is one of

help                 show this help.
```
複数ディレクトリにまたがる重複したファイル名を表示する

## こうなってる

```shell
$ tree
.
├── dir_a
│   ├── xxx
│   └── yyy
└── dir_b
    ├── yyy
    └── zzz
```

## 重複しているファイル名（yyy）を表示

```shell
$ {ls dir_a && ls dir_b} | sort | uniq -d
yyy
```
## [コメントでもっとスマートいただきました](https://qiita.com/masakuni-ito/items/1728cd86db3ccc0ef27d#comment-836d3b5ace566b1c2645)

GNU findであればprintfのオプションできれいにできる。
gfindはMacOSだと `brew install findutils` で入る。

```shell
$ gfind . -maxdepth 2 -type f -printf '%f\n' | sort | uniq -d
yyy
```

## [さらにGNU　findじゃなくても動く方法教えてもらいました](https://qiita.com/masakuni-ito/items/1728cd86db3ccc0ef27d#comment-405c6af3f5896148420b)

すごい、このままだと無限に方法教えてもらえるぞ……！

```shell
$ find . -maxdepth 2 -type f -exec basename {} \; | sort | uniq -d
```

ありがとうございます。
DlibとOpenCVを用いたVtuber撮影システムの開発　#1(開発環境構築)

##はじめに
最近、Unity上でVtuberを実現するシステムとして、Unity版DlibとUnity版OpenCVが話題になっていますが、これらは合計**1万円越え**という**超強気の価格設定**がされているため、趣味で手軽に始めるにはつらいものがあります。

そこで、**無料で配布されている**C++版のDlib,OpenCVを使用し、同等以上の機能を持つ顔認識ソフトウェア、及びそれを基幹としたVTuber撮影システムの開発を行いました。

##1．概要
　Webカメラを使用し、バストアップ状態のVuber動画を撮影するシステム
###実行環境
+ OS: Windows 10 Home 64bit
+ CPU: Core i9 7980XE 
+ GPU: Geforce GTX1080Ti
+ RAM: 32G

##2．開発項目
　本プロジェクトにおける開発項目は以下の3点です。
　1．Dlib_WebcamFaceTracker
　　-C++プログラム　フェイストラッキングおよび表情認識を行い、Unity側に送信する
　2．FaceController
　　-Unityアセット　1の検出結果を受信し、Unity上の3Dモデル(今回はMMDモデル)に反映する。
　3．Ver3_ImagingSystem
　　-Unityプロジェクト　1,2を基本に他のアセットを組み合わせたVtuber動画撮影システム本体
　
##3．使用するソフトウェア、ライブラリ
■開発ツール
　1．Microsoft VisualStudio 2015 community
　　-C++プログラムおよびUnityアセットの開発で使用します
　2．Unity 2018f1
　　-Vtuber動画の撮影に使用します
　3．Cmake
　　-Dlibのビルドに使用します
■ライブラリ
　1．Dlib 19.16
　　-顔認識に定評がある機械学習ライブラリ　当然顔認識に使用します
　2．OpenCV 3.4.1
　　-画像処理ライブラリ　今回はWebCamの制御や画像データの加工などに使用します
　3．Boost 1.6.7
　　-なんかこれ入れないとコンパイルできなかったんで

■その他(学習済みモデル,あると便利なツールなど)
　1．shape_predictor_68_face_landmarks.dat.bz2
　　-Dlib用の学習済み顔器官検出AI
　2.サクラエディタ
　　-テキストファイルの編集などに便利

##4．環境構築手順
VisualStudioおよびUnityのインスコ方法は割愛します。
###4-1．Cmakeのインストール
[【Cmakeダウンロードページ】](https://cmake.org/download/)　から、2018年10月現在の最新版(cmake-3.12.3-win64-x64.msi)をダウンロードしてインストールします。
**※ファイル末尾に「.zip」と「.msi」の2種類の拡張子が付いたものがあるが、「.msi」を選択すること**


###4-2．Dlibのインストール
Dlibはソースコードの形で提供されているため、**解凍したままの状態では使用できません**
ダウンロード後にコンパイルを行う必要があります。
以下の操作を行い、Dlibをインストールしてください。

####(1)　Dlibのダウンロード
[【Dlibダウンロードページ】](https://ja.osdn.net/projects/sfnet_dclib/releases/)　から、2018年10月現在の最新版(Dlib 19.16)をダウンロードし、解凍したフォルダを任意の場所に配置してください。
**今回は、【C:\dnn\】に配置することとします。**

```C++:dlib19.16
C:
 └ dnn
    └ dlib-19.16
       ├dlib
       ├examples
       ├ ・・・・
```
以上のようなフォルダ構成になっていればOKです。

####(2)　Dlibソースコードのコンパイル＆インストール
コマンドプロンプトを開いて、以下のコマンドを順番に入力してください。

```C++:C\Windows\system\cmd.exe
cd C:\dnn\dlib-19.16\dlib
mkdir build
cd build
cmake.exe -G "Visual Studio 14 2015 Win64" -T host=x64 -DCMAKE_INSTALL_PREFIX=install ..
cmake.exe --build . --config Release --target INSTALL
```
大量のログが流れますが、最終的に
**「XXX個の警告　0エラー」**
という具合に、「エラー」が「0」であれば問題ありません。これでDlibのインストールは完了です。

もしも途中でエラーが吐かれた場合、もしくは何らかのトラブルでビルドが中断された場合、一旦dnn/dlib-19.16/内のファイルを全て削除し、もう一度ダウンロードファイルからコピーしてきた上でやり直してください。

###4-3．OpenCVのインストール　
####(1)　OpenCVのダウンロード
[【OpenCVダウンロードページ】](https://opencv.org/releases.html)から、2018年10月現在の最新版(OpenCV3.4.3)をダウンロードしてください。
**※ダウンロードの際は「Win pack」を選択すること**

####(2)　OpenCVのインストール
ダウンロードしたexeファイルを実行します。
インストール先フォルダは【C:\dnn\】を指定します。下記のようなフォルダ構成になればOKです。

```C++:OpenCV
C:
 └ dnn
    ├ dlib-19.16
    └ opencv 
       └ build
       └ souece
```

これで開発環境の構築は一旦完了です。
**[次回の記事　DlibとOpenCVを用いたVtuber撮影システムの開発　#2(顔認識)](https://qiita.com/kamakichi1231/private/9b84f86743664b613878)**　にて、1．Dlib_WebcamFaceTracker　を開発します。
[Android] MaterialComponentsを使っても元のStyleが出てこない時。

## Theme.MaterialComponentsを使ったらThemeがおかしくなった。

```xml
<style name="SampleTheme" parent="Theme.MaterialComponents.Light.NoActionBar">
    <item name="colorPrimaryDark">@android:color/white</item>
    <item name="colorAccent">@color/myAccent</item>
</style>
```

##　解決方法。

```xml
<item name="viewInflaterClass">androidx.appcompat.app.AppCompatViewInflater</item>
```

これを使ってください。


## 結論

```xml
<style name="SampleTheme" parent="Theme.MaterialComponents.Light.NoActionBar">
    <item name="colorPrimaryDark">@android:color/white</item>
    <item name="colorAccent">@color/myAccent</item>
　　<item name="viewInflaterClass">androidx.appcompat.app.AppCompatViewInflater</item>
</style>
```


##参考

1. [stackoverflow](https://stackoverflow.com/questions/50530247/datepickerdialog-has-blacked-out-buttons-in-androidx-fragment-app-dialogfragment/50637104)
ubuntu 18.04 LTSに「cisco anyconnect secure mobility client」を導入、VPN接続する

# 経緯

私の大学では「cisco anyconnect secure mobility client」を通じてSSL-VPN接続を行っています。
Windows版や、Mac OS版の接続方法は教示してくれますが、Linux(ubuntu)版はなかったのです！

少しハマったので、備忘録に。
詳しい解説なしに、方法だけ紹介です。

# anyconnect secure mobility clientの取得

会社、学校などでSSL-VPNサービスに接続します。
接続と同時に「cisco anyconnect secure mobility client」のインストールが始まります。

![Screenshot from 2018-10-08 23-40-42.png](https://qiita-image-store.s3.amazonaws.com/0/298545/e2646fd7-b953-9bfd-4610-8803bc984a38.png)

もし上記のようにエラーが出た場合は「AnyConnect VPN」をクリックする。
「anyconnect-linux64-　〜〜〜〜　.sh」のダウンロードの有無を聞かれるので、ダウンロードする。

ダウンロードしたフォルダで以下のコマンド

```
$ chmod +x anyconnect-linux64 ~~~~~~~~ .sh
$ sudo ./anyconnect-linux64 ~~~~~~~~ .sh
```

これにより、アクティビティから「cisco anyconnect secure mobility client」が導入されたことが確認できます。

このままでは動かないので以下もインストール

```
$ sudo apt install libpangox-1.0-0
```

これにより、「cisco anyconnect secure mobility client」によるVPN接続が可能となります。

# まとめ

こやつ「libpangox-1.0-0」の導入が分からず、長いことVPN接続できなかった....


> 参考： Cisco Anyconnect Linux Ubuntu installation
https://www.youtube.com/watch?v=ThzveFk8Dak
SyntaxError: Block-scoped declarations (let, const, function, class) not yet supported outside strict mode

久しぶりにTerminalを起動してみたら直後に下記エラーが表示された。

```
/Users/xxx/.nvm/versions/node/v4.6.0/lib/node_modules/npm/bin/npm-cli.js:85
      let notifier = require('update-notifier')({pkg})
      ^^^

SyntaxError: Block-scoped declarations (let, const, function, class) not yet supported outside strict mode
    at exports.runInThisContext (vm.js:53:16)
    at Module._compile (module.js:373:25)
    at Object.Module._extensions..js (module.js:416:10)
    at Module.load (module.js:343:32)
    at Function.Module._load (module.js:300:12)
    at Function.Module.runMain (module.js:441:10)
    at startup (node.js:139:18)
    at node.js:974:3
nvm is not compatible with the npm config "prefix" option: currently set to ""
Run `npm config delete prefix` or `nvm use --delete-prefix v4.6.0 --silent` to unset it.
```

結論からいうとnvmで指定しているnpmのデフォルトバージョンが違っているから発生していた。

```
$ nvm ls
         v4.6.0  
         v6.2.0  
        v8.11.4  
```

defaultがv4.6.0になっていたので、v6.2.0に変更したら表示されなくなった。

```
$ nvm alias default v6.2.0
default -> v6.2.0
```

## 感想
Node.jsは主にプライベートで触っているだけなので、ついていけてません。
Webの進化のスピードには驚いています。

## 参照
[nvmでnode.jsの環境をつくる。 - Qiita](https://qiita.com/544/items/7237a32c68619236f446)
勉強記録 20181008 AWS ソリューションアーキテクト – アソシエイト

# Aurora
Aurora includes a high-performance storage subsystem. Its MySQL- and PostgreSQL-compatible database engines are customized to take advantage of that fast distributed storage. The underlying storage grows automatically as needed, up to 64 terabytes

# Beanstalk
- Elastic Beanstalk は、Go、Java、PHP、.NET、Node.js、PHP、Python、および Ruby で作成されたアプリケーションと、各言語に対応するさまざまな種類のプラットフォーム設定をサポートしています。設定により、所定の環境で使用するインフラストラクチャとソフトウェアスタックが定義されます。アプリケーションをデプロイすると、Elastic Beanstalk は、Amazon EC2 インスタンスなど、1 つ以上の AWS リソースをプロビジョニングします。Amazon EC2 インスタンスで実行するソフトウェアスタックは、設定に応じて変わります。

- Elastic Beanstalk アプリケーションは、Elastic Beanstalk コンポーネントの論理コレクションで、環境、バージョン、環境設定などがあります。Elastic Beanstalk では、アプリケーションは概念的にはフォルダーと似ています。

- ワーカー環境枠で Amazon SQS キューがない場合、Elastic Beanstalk によってAmazon SQS キューが作成され、プロビジョニングされます。

# 汎用 SSD (gp2) ボリューム
- レイテンシーは 1 桁台のミリ秒であり、長時間 3,000 IOPS にバーストできます。
- 最小 100 IOPS (33.33 GiB 以下) から最大 10,000 IOPS (3,334 GiB 以上) まで、
- ベースラインパフォーマンスは 3 IOPS/GiB (ボリュームサイズ) の割合で線形に拡大します。

# スループット最適化 HDD (st1) ボリューム
- IOPS ではなくスループットでパフォーマンスを示す、低コストの磁気ストレージに使用できます。
- このボリュームタイプは、Amazon EMR、ETL、データウェアハウス、ログ処理など、サイズの大きなシーケンシャルワークロードに適しています。
- スループット最適化 HDD (st1) ボリュームは Cold HDD (sc1) ボリュームに類似していますが、アクセスが頻繁なデータをサポートするように設計されています。

# Amazon Elastic File System (Amazon EFS)
- Amazon EFS は、Amazon EC2 と併用できる拡張可能なファイルストレージを提供します。
- NFSを使ってEC2からアクセス可能

# Amazon Glacier アーカイブの取り出しオプション
- 迅速 — 迅速取り出しでは、アーカイブのサブセットが迅速に必要になった場合にデータにすばやくアクセスできます。最大規模のアーカイブ (250 MB 以上) を除くすべてのアーカイブについては、迅速取り出しでアクセスしたデータは通常 1〜5 分以内で使用可能になります。

- 標準 — 標準取り出しでは、数時間以内にすべてのアーカイブにアクセスできます。通常、標準取り出しは 3〜5 時間で完了します。デフォルトで適用されます。

- 大容量 — 大容量取り出しは、Amazon Glacier の最も安価な取り出しオプションであり、これを使用して大量のデータ (ペタバイトのデータを含む) を 1 日以内に取得できます。通常、大容量取り出しは 5〜12 時間で完了します。

# Amazon EC2 Auto Scaling のスケーリングクールダウン
- クールダウン期間は Auto Scaling グループにおける構成可能な設定で、以前の規模の拡大や縮小が適用される前に、追加のインスタンスを起動または終了しないようにします。

# Amazon CloudFront の概要
Amazon CloudFront は、静的および動的なウェブコンテンツ (.html、.css、.js、イメージファイルなど) をユーザーに高速に配信するウェブサービスです。

# Amazon S3 オブジェクトのライフサイクル管理
- 移行アクション — 別のストレージクラスにオブジェクトを移行するタイミングを定義します。たとえば、作成後 30 日目に STANDARD_IA ストレージクラスにオブジェクトを移行し、作成後 1 年目に GLACIER ストレージクラスにオブジェクトをアーカイブするよう選択することができます。

- 有効期限アクション — オブジェクトの有効期限を定義します。Amazon S3 はユーザーに代わって有効期限切れのオブジェクトを削除します。

# AWS Key Management Service とは
- AWS Key Management Service (AWS KMS) は、データの暗号化に使用される暗号化キーの作成と管理を容易にするマネージド型サービスです。AWS KMS で作成したマスターキーは、FIPS 140-2 検証済み暗号化モジュールによって保護されています。

# Amazon Redshift now supports Enhanced VPC Routing
https://aws.amazon.com/jp/about-aws/whats-new/2016/09/amazon-redshift-now-supports-enhanced-vpc-routing/
Anacondaでpyqt4をインストールするには

ターミナルからcondaを利用　バージョンを指定してやる
メジャーバージョンのみの指定で最新のバージョンがインストールされる。
conda install pyqt=4

マイナーバージョンも指定していしてもＯＫ

conda install pyqt=4.11.4

また、condaで利用可能なバージョンが知りたければ

conda search pyqt

としてやれば利用可能なバージョンがリストされる

インストール時にconflictionなどが発生した場合はvirtual envで別の環境をつくるなり対処。
Microsoft Azure VM CentOS上でjupyter serverを立ち上げ、ローカルからアクセス

製品をLinux上で開発しているため、手元のMacではなくLinux環境で検証や開発をしたいが、jupyterで可視化、トライアンドエラーしたいというモチベーションで実践した。
（結局jupyterは製品に組み込む時に面倒なので使うのをやめた）

# Azure VM CentOS
### jupyterのインストール
```
sudo pip3 install jupyter
mkdir ~/.jupyter
```

### 通信ssl化
```
cd ~/.jupyter/
openssl req -x509 -nodes -newkey rsa:2048 -keyout mycert.key -out mycert.pem
```

### パスワードハッシュ文字の取得
```
ipython3
from notebook.auth import passwd
passwd()
ローカルからのログイン用のパスワードを入力
'入力したパスワードのハッシュ文字が表示される'--->①
```

### jupyter notebookの設定ファイル作成
```
touch ~/.jupyter/jupyter_notebook_config.py
vi ~/.jupyter/jupyter_notebook_config.py
```

`jupyter_notebook_config.py`の設定内容

```
c = get_config()
c.NotebookApp.ip = '*'
c.NotebookApp.open_browser = False
c.NotebookApp.port = 18888
c.NotebookApp.password = u'①で表示されたパスワードのハッシュ文字'
c.NotebookApp.certfile = u'/home/【自分のホームディレクトリ】/.jupyter/mycert.pem'
c.NotebookApp.keyfile = u'/home/【自分のホームディレクトリ】/.jupyter/mycert.key'
```
# Azureの設定
### azureのリソースグループの設定で18888ポートを開放
`リソースグループ -> 自分のリソースグループ -> ネットワークセキュリティグループ -> 受信セキュリティ規則 -> 追加`
- 宛先ポート範囲：18888
- プロトコル：TCP
- 他はデフォルトで、名前はjupyter等わかりやすい物に。

# 運用
### サーバ起動（Azure VM）

```
jupyter notebook &
```
起動時のカレントディレクトリが、クライアント起動時のホームディレクトリとなる
Azureからsshを切ってもjupyterを継続したい場合は以下。

```
nohup jupyter notebook > /dev/null 2>&1 &
```

### ローカルのブラウザからアクセス
https://[azure vm ipアドレス]:18888

### サーバ停止
fg -> Ctrl+c -> y
SparkFun Pi Servo Hatを使うためのセットアップ

# 用意するもの

* マイクロSD 8GB
* マイクロSDライター
* Raspberry Pi Zero WH https://www.switch-science.com/catalog/3646/
* SparkFun Pi Servo Hat https://www.switch-science.com/catalog/3485/
* ピンソケット2×20（40P） https://www.switch-science.com/catalog/2020/

セットアップをする環境はMacを想定します。[参考](https://www.raspberrypi.org/documentation/installation/installing-images/mac.md)

# ピンソケットを半田付け

https://learn.sparkfun.com/tutorials/pi-servo-hat-hookup-guide を参考に半田付け。特に難しいところは無いです。

# Raspbian のセットアップ

1. Raspbian のダウンロード。今回は、DESKTOPをダウンロードする
https://www.raspberrypi.org/downloads/raspbian/

2. 20YY-MM-DD-raspbian-stretch.zip の解凍。20YY-MM-DD-raspbian-stretch.img が解凍される。

3. sdカードをマイクロSDライターに挿入し、Macに挿入
4. diskutil list でsdカードの場所を調べる。`/dev/disk2`になっていることが多いと思います。 [参考](https://qiita.com/ttyokoyama/items/7afe6404fd8d3e910d09)
5.  `sudo diskutil unmountDisk /dev/disk2` で unmount
6.  `sudo dd bs=1m if=path_of_your_image.img of=/dev/rdisk2 conv=sync`（かなり時間がかかります）

7. 次に、WiFIを設定するため、/Volumes/boot/wpa_supplicant.conf のファイルを新規作成（[参考](https://qiita.com/mascii/items/0d1a280ac58ed8f6f999)）
  ```
country=JP
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
    ssid="test"
    psk="abcd1234"
}
  ```
8. SSHを有効にするため、/Volumes/boot/ssh という空ファイルを作成
9. 電源を投入
10. `dns-sd -G v4 raspberrypi` でIPアドレスを調べる
11. `ssh pi@(調べたIP)`

# I2C を有効化

SSHにログインした状態で、以下の通り設定します。（[参考](raspbian gnu screen)）

1. `sudo apt-get update`
2. `sudo apt-get install i2c-tools`
3. `sudo raspi-config`
4. "5 Interfacing Options"->"A7 I2C" を選択してEnter
5. "Finish"を選択してEnter
6. Raspbian を再起動

# サンプルの実行

1. 以下のように接続。
    * sg90の茶色のケーブルが、外側になるように接続
    * micro usb ケーブルは、SparkFun Pi Servo Hat の方に接続
     [![Image from Gyazo](https://i.gyazo.com/5df5a7298437fd30543b900e066445e0.png)](https://gyazo.com/5df5a7298437fd30543b900e066445e0)
2. `git clone https://github.com/sparkfun/Pi_Servo_Hat.git`
3. `cd Pi_Servo_Hat/Examples`
4. `python example.py`
SESから抜け出すために今からすること【自分用】

はじめまして。
自社開発へ転職するためにはじめの一歩として記録を残す為、投稿。

## 現状のステータス
・研修で3ヶ月Javaを学んだ程度（実務経験なし）
・客先常駐して約1年（金融系）
・保守・運用業務
・オペレータに関する問い合わせ対応業務
・に関するアプリケーションの設定、変更作業
・コールセンターに関するIDの管理
・依頼書や作業マニュアルなど各種ドキュメント作成

うーん・・・はたしてこれをSEと自称して良いのか・・・

## なぜ転職しようと思ったのか
・元々開発志望。なのにインフラ関連の業務ばかり担当
・客先常駐（SES）の異常性に今更ながら気がついた
・同期の退職、同期とのレベル差
甘えてました。。はい。。

## 今後勉強するもの
・Ruby
・GitHub
・Qiita
・AWS
・ネットワーク関連
※恥ずかしながら、GitHubやQiita等、とある社長のブログを見るまで全く知らなかった。。。

出来ることから少しずつ、出来る範囲を増やしていき、アウトプットを出していきます。

何卒よろしくお願い致します。
Scalaのapply・unapllyとcase classを整理したメモ

## 概要
Scalaを触るとよく聞くapplyとunapply。特に意識せずともクラスに「case class」を付ければ動くコードを書けてしまうのですが、出来れば理解したいと思いメモを書きます。

## applyとunapplyについて
applyはオブジェクト構築時に呼ばれるメソッドです（オブジェクト構築時にapplyを書くのが省略されるケースが多いです）。unapplyはパターンマッチで引数を取得するメソッドです、オブジェクトのmatch式を書くときに自動で呼ばれます。呼び出し方のイメージは@yotsak83さんの[Scalaの抽出子(apply, unapply)サンプルと呼ばれるタイミング](https://qiita.com/yotsak83/items/d3c1495d83690dd725ef)が分かりやすいです。

## case classについて
クラスの定義の頭に「case class」を付けると、@lrf141さんの[java経験者のScala入門メモ　[ケースクラス、オブジェクト]](https://qiita.com/lrf141/items/a88bb1579c8880b417da)の記事の通り、apply・unapplyに加えcopyなどのメソッドを自動で生成してくれます。クラスを定義するときはcase classを使用することが多いですが、その意義について[Scala で case class と apply() と unapply() の関係がよくわかってなかったので調べたら関数リテラルについても学びがあった話](https://tanoshiilife.wordpress.com/2015/11/08/scala-%E3%81%AE%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E8%AA%AD%E3%82%82%E3%81%86%E3%81%A8%E6%80%9D%E3%81%A3%E3%81%A6%E3%82%B7%E3%83%B3%E3%82%BF%E3%83%83%E3%82%AF%E3%82%B9%E3%82%B7%E3%83%A5%E3%82%AC/)の記事が参考になります。

## サンプルコード
2つの文字列の引数があるコンストラクタを持つクラスで、引数を2つ文字列結合して出力をする場合を例に、サンプルコードを書いてみます。
case classを使わない場合と使う場合で分けています。

### case classを使わない場合
【クラス定義】

```
// 引数を取得するためコンストラクタにvalを設定する。
class NonApplyTest(val test1input:String ,  val test2input:String){
}
```

【呼び出し】

```
// オブジェクトをnewする。
var nonApplyTest = new NonApplyTest("test1" , "test2")
// 引数の変数名から直接値を取得する。
println(nonApplyTest.test1input + nonApplyTest.test2input)
```

### case classを使う場合
【クラス定義】

```
// unapplyがあるのでコンストラクタにvalは不要。
case class ApplyTestWithCase(test1input:String , test2input:String){
}
```

【呼び出し】

```
// ここでapplyが呼ばれる。
val applyTestWithCase = ApplyTestWithCase("test1" , "test2")
applyTestWithCase match{
  // ここでunapplyが呼ばれる
  case ApplyTestWithCase(s1 , s2) => println(s1 + s2)
  case _ => println("None")
}
```
Julia を Ubuntu で動かすためにしたこと

# Julia のダウンロード
## 最初に試してだめだったやり方

```terminal
sudo add-apt-repository ppa:staticfloat/juliareleases
sudo add-apt-repository ppa:staticfloat/julia-deps
sudo apt-get update
sudo apt-get install julia
```

Julia を Ubuntu で動かしたいなと思ったときググって最初に出てきた記事では上の4行でのインストール方法がでてきたのですが、上手くいかなかったんですよね。最後の `install julia` のところでそもそも `julia` なんてないぞって言われて。

そこで [julia 公式](https://julialang.org/downloads/platform.html)を覗いてみると、そもそも **Ubuntu** の文字なんてない。Generic Binaries をダウンロードした後 `julia` って呼べるようにしてね、とのことなので推奨通りソフトリンクで julia がでてくるようにした。

## ダウンロード
[公式ページ](https://julialang.org/downloads/index.html)から Generuc Linux Binaries for x86 をダウンロードします。

## リンクさせる
まずダウンロードしたファイルを解凍します。`home/hoge/Downloads` で

```terminal
tar -zxvf julia-1.0.1-linux-x86_64.tar.gz
```

ダウンロードした julia を管理するため root権限を使ってディレクトリを `opt` にコピー

```terminal
sudo su
cd Downloads
cp -r julia-1.0.1 /opt
```

`/home/hoge/usr/local/bin` に移動して

```terminal
sudo ln -s /opt/julia-1.0.1/bin/julia julia
```

これで `julia` ってコマンドで呼べるようになりました。

# IDE
ググってみると julia の IDE は juno がいいらしいです。[juno 公式のインストールガイドライン](http://docs.junolab.org/latest/man/installation.html)。Atom を[ここから](https://atom.io/)インストールして、`Settings/Install` から `uber-juno` と検索してこの名前のものをインストールすればいいとのこと。
`julia` ってコマンドで julia が呼び出せる環境になっていないと使えないらしいです。

# みんな大好き Jupyter
[github](https://github.com/JuliaLang/IJulia.jl) の README.md にめっちゃ書いてある。
julia を呼んでる最中のコマンドラインで以下の

```terminal
using Pkg
Pkg.add("IJulia")
```
さえやれば`IJulia`が入って次から jupyter を呼んだときには notebook で julia が使えるようになります。やったね。
PowerAppsでD365での検索(LookUp)フィールドのラベル名を表示する

#2019/2/22update
バージョンアップして、下記の手順を取らなくてもLookupフィールドを表示できるようになったらしいです！！！！

#フィールドがGUIDでしか表示できない
最近Dynamicsの活用手段としてPowerAppsを頑張っています。
今回、件名の事象を解決したのですが、もしもっといい方法があれば教えてください！！

###1.GUIDが表示される状態
新しいPowerAppsのアプリを作って、とりあえずギャラリーを追加した状態です。
データソースはD365の取引先担当者です。
フィールドは名前と所有者を表示していますが、GUIDが出ています。
<img width="1275" alt="1.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/190486/9adf49c1-e111-7264-92a7-ad32c34e3666.png">

###2.データソースを追加
検索フィールドの参照先フィールドをデータソースとして追加します。

メニューバー「ビュー」＞データソースを選択すると下記画面がでます。
データソースの追加を押下します。
<img width="1278" alt="2.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/190486/76a7bcb5-9ec0-05b8-6ec4-90c2a4312f2a.png">

今回表示したい検索フィールドの参照先エンティティである、ユーザーを選択します。
<img width="247" alt="3.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/190486/ef476110-0cc0-d686-f0f8-a3f0db83fc01.png">
データソースとして追加されています。
<img width="261" alt="4.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/190486/9bda17fe-4402-3d59-59df-1f25a582c024.png">

###3.表示部分にLookUp関数を記載
下記画像のように、表示するパーツのTextにLookUp関数を追加します。
第１引数：2.で追加したデータソース
第２引数：条件文、左辺にデータソースの参照先エンティティにおけるGUIDが入っている項目名、右辺はThisItem._[表示するフィールド名]_value
第３引数：参照先エンティティの項目のうち、PowerAppsの画面に出したい項目名
<img width="1029" alt="6.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/190486/8f8a0870-f6bc-ade7-64b8-d7b18974fdc9.png">

GUIDが入っている項目は、エンティティ名+"id"です。

以上です！！！
ファイル名が同じで拡張子のみが異なるファイルを検索する方法

題名の通りです。
あまり需要はなさそうですが、備忘録的に書き残しておきます。

<h1>ソースコード</h1>
簡単ではありますが、いくつか躓く箇所があったので。
短いコードなのでまずはソースを見てもらった方が手っ取り早いと思います。
一応、Pythonのバージョンは3.6でpathlibを使用しています。

```python:find_file_with_same_name.py
# -*- coding: utf-8 -*-
'''
ファイル名が同じファイルを抽出するプログラム
'''
from pathlib import Path


# 探索するディレクトリ
tar = '.'

# Pathオブジェクトを生成
current = Path(tar)

# ディレクトリ内のファイルを探索
files = list(current.glob('*.*'))

# ファイル一覧を保存するdict
files_dict = {}


# ファイル名をキーとして辞書型に格納する
for f in files:
    # ファイル名を取得
    file_name = f.resolve().stem

    # ファイル名をキーとしてdictに追加していく
    files_dict.setdefault(file_name, []).append(f)


# 重複ファイル一覧を保存するlist
dup_files = []

# dictに登録されたリストのサイズが1より大きい場合、重複であるとして抽出する
dup_files = [v for k, v in files_dict.items() if len(v) > 1]


print(dup_files)
```

同じディレクトリに"find_file_with_same_name.a"のようなファイルを配置してこのプログラムを実行すると以下のような結果が出力されます。
`[[WindowsPath('find_file_with_same_name.a'), WindowsPath('find_file_with_same_name.py')]]`

<h1>備考</h1>
工夫した点はdictのデータをlistで持ったところです。
pathlibを使えば拡張子を除いたファイル名をf.resolve().stemのようにして取得することが出来るので、これをキーとして辞書型にデータ(Pathオブジェクト)を格納していきます。
最終的に重複が確認されたPathオブジェクトはdup_filesにまとめられるのであとは移動するなり消去するなり好きにしてください。


より良い方法があればご教授よろしくお願いします。
Djangoで開発開始を少しでも楽に！！！

# PythonのDjangoの作業開始、終了を少しでも楽に！
注意
django
mysql
python
Virtualenvwrapper
を使用している状態でのスクリプトです

## コマンドの説明
django　環境の構築（？）を簡単にしてくれる
workon　と mysqlのサーバー立ち上げ、終了をコマンド一つで行う

## ~/.bash_profile に関数を追加

```shell:.bash_profile
function workpy() {
    # 変数に初期値を設定
    env_name=${2:-env1}
    work=${1:-none}
    # 引数を表示
    echo work status : $work
    echo workon name : $env_name

    if [ $work = start ]; then
        workon $env_name
        mysql.server start

    elif [ $work = end ]; then
        deactivate
        mysql.server stop

    else
        echo "workpy [start or end] env_name"
    
    fi
}
```

作成後に下記のコマンドを実行

```
$ source ~/.bash_profile
```


##　作成したコマンドの使い方
作業開始

```
$ workpy start [env_name]
```
[env_name]は省略可能（デフォルトでenv1を使用）

作業終了

```
$ workpy end
```
ソートアルゴリズム

# 整列（ソート）とは
- データのリストを線形順序で並べ替える
  - 昇順、降順 
- 並べ替えの対象は「キーを含むレコード」
  - レコード：データの構成単位
  - キー：レコードの中で順序比較の対象となる欄
  - 例：アドレス帳
      -  レコード：一人分の住所録情報（氏名、住所、電話番号）
      -  キー：氏名（フリガナ）

# 内部ソートと外部ソート
- 内部整列：整列の対象が主記憶に収まる
- 外部整列：二次記憶（ディスク等）を使う

# 安定ソート
- 同じキーをもつレコードの順序を保存するソートアルゴリズム

# ソートのための三大要素
- 交換
- 選択
- 挿入

ほとんどのソートアルゴリズムは、これらの考え方を応用したもの

「交換」のサンプルコード（c言語）

```c:swap.c
#include<stdio.h>

/* 値を交換する関数 */
void swap (int *x, int *y) {
  int temp;   // 値を一時的に保存する変数

  temp = *x;
  *x = *y;
  *y = temp;
}

int main (void) {
  int a = 1;
  int b = 5;

  printf("a = %d, b = %d\n", a, b);
  swap(&a, &b);
  printf("a = %d, b = %d\n", a, b);

  return 0;
}
```

実行結果

```
a = 1, b = 5
a = 5, b = 1
```

# 代表的なソートアルゴリズム
[選択ソート](https://qiita.com/omu58n/private/27d8e1a043be8cc35efb)
[挿入ソート](https://qiita.com/omu58n/private/13d1cbbb7a50dae9d3fc)
[バブルソート](https://qiita.com/omu58n/private/7e2a1055a42ef738ab8b)
[シェルソート](https://qiita.com/omu58n/private/bb9b4a88ec4351b11727)
[クイックソート](https://qiita.com/omu58n/private/7794f097b2c569a469bc)
[ヒープソート](https://qiita.com/omu58n/items/5c7cc358b1463c0a4710)
[基数ソート](https://qiita.com/omu58n/items/7c9bb5162f769caed8e2)
[マージソート](https://qiita.com/omu58n/items/2aa3c751cfb10cdbbb43)
[分布数え上げソート](https://qiita.com/omu58n/items/ede0b4df067484e93290)

# 参考
[ソートアルゴリズムを極める！ 〜 なぜソートを学ぶのか 〜](https://qiita.com/drken/items/44c60118ab3703f7727f)
[ソートアルゴリズム20種をCで作ってみた](https://qiita.com/oltWnKXcD89LapBt/items/1b7b664d58febae387af)
[【Unity】ソートアルゴリズム12種を可視化してみた](https://qiita.com/r-ngtm/items/f4fa55c77459f63a5228)
Django Girls Tutorial のアップグレード Django 1.11 → 2.0の変更点

#経緯
Django Girls Tutorialをやり遂げてGithubで管理していたところ、警告メッセージが届いてしまいました。

>ebichiki, 
>
We found a potential security vulnerability in a repository for which you have been granted security alert access.
>
ebichiki/djangogirls 
Known moderate severity security vulnerability detected in django >= 1.11.0, < 1.11.15 defined in requirements.txt.
requirements.txt update suggested: django ~> 1.11.15.

脆弱性が発見されたとのことで、Djangoのバーションが古いようです。
新しいチュートリアルが存在したのでアップグレートしました。
旧：https://djangogirlsjapan.gitbooks.io/workshop_tutorialjp/content/
新：https://tutorial.djangogirls.org/ja/

#Django 1.11 → 2.0の変更点
## ForeignKey制約の記述

参照するオブジェクトが削除された時に、それらと紐付けされたオブジェクトの振る舞いをどうするかを設定します。チュートリアルでは、on_delete=models.CASCADEで一緒に削除するようになっています。

### Django 1.11
```blog/models.py
from django.db import models
from django.utils import timezone

class Post(models.Model):
    author = models.ForeignKey('auth.User')
    title = models.CharField(max_length=200)
    text = models.TextField()
    created_date = models.DateTimeField(
            default=timezone.now)
    published_date = models.DateTimeField(
            blank=True, null=True)

    def publish(self):
        self.published_date = timezone.now()
        self.save()

    def __str__(self):
        return self.title
```

### Django 2.0
```blog/models.py
from django.db import models
from django.utils import timezone


class Post(models.Model):
    author = models.ForeignKey('auth.User', on_delete=models.CASCADE)
    title = models.CharField(max_length=200)
    text = models.TextField()
    created_date = models.DateTimeField(
            default=timezone.now)
    published_date = models.DateTimeField(
            blank=True, null=True)

    def publish(self):
        self.published_date = timezone.now()
        self.save()

    def __str__(self):
        return self.title
```
##urlの設定
Path関数で指定します。正規表現を使わないので簡単に記述できるようになりました。

###Django 1.11

```mysite/urls.py
from django.conf.urls import include, url
from django.contrib import admin

urlpatterns = [
    url(r'^admin/', include(admin.site.urls)),
    url(r'', include('blog.urls')),
]
```

###Django 2.0

```mysite/urls.py
from django.urls import path, include
from django.contrib import admin

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('blog.urls')),
]
```
jetsonのイメージバックアップとリカバリ方法

需要があるかはわかりませんがjetsonのイメージバックアップと
リカバリーの方法を記載します。

これで、作成したjetsonを無限増殖させることが可能です

実行したのはTX2ですが、TX1でも同様にできるようです。
Xaviaは不明です・・・（欲しい

#イメージ作成(jetson2PC)
jetsonの中身をPC側にイメージで保存する方法です

**1)jetpackのインストールで作成されたフォルダを捜索して下記のフォルダに入ります**

```terminal
$cd /home/ユーザー/jetpack33/64_TX2/Linux_for_Tegra
```

**2)jetsonリカバリーモード+USB接続します**
**3)イメージ作成コマンド実行**

```terminal
$ sudo ./flash.sh -r -k APP -G my_backup.img jetson-tx2 mmcblk0p1
```
結構時間が掛かるので気長に待ちます・・・

**3)作成された「my_backup.img」と「my_backup.img.raw」を適当なフォルダにコピー**

以上で終了です。

#イメージ復旧（PC2jetson)
PCからjetsonにイメージの書き込みを行います

**1)前述の方法で吸い出したイメージを保存したフォルダから**
$cd /home/ユーザー/jetpack33/64_TX2/Linux_for_Tegra
内にある「bootloader」フォルダにイメージをコピーします

```terminal
$ sudo cp ./保存先/my_backup.img.raw ./bootloader/system.img
```
**2)jetsonリカバリーモード+USB接続します**

**3)jetpackのインストールで作成されたフォルダを捜索して下記のフォルダに入ります**

```terminal
$cd /home/ユーザー/jetpack33/64_TX2/Linux_for_Tegra
```

**4)イメージ書込みコマンド実行**

```terminal
$ sudo ./flash.sh -r -k APP jetson-tx2 mmcblk0p1
```
こちらも時間が掛かるので気長に待ちます
【プロ野球】清宮の3年後の打撃成績を予測する

#はじめに
2018年のプロ野球レギュラーシーズンも残りわずかです。
今年は悪天候による中止が多く、クライマックスシリーズ初日にまだレギュラーシーズンの試合をやっているという不思議な年になりました…。

今年の注目は、なんと言っても野手最多タイ7球団競合の清宮幸太郎選手。現在の1軍成績は、あと2試合を残し、「.200 7本塁打 18打点」となっています。ルーキーにしては十分な活躍ではありますが、まだ打線の主軸を張れるような成績ではありません。当初の期待が大きすぎたために、イマイチなイメージを持たれている方も多いのではないのでしょうか。

ということで、清宮は今後ファイターズの4番を打てるような打者になるのかを、機械学習で予測してみたいと思います。

#手法
ランダムフォレスト（回帰）

#データ
プロ野球データFreakさんのデータをスクレイピングして利用させていただきました。
2009年以降のデータがあるようなので、3年後の成績が判明している2009~2014の6年間の野手ルーキーのデータを学習させることで、予測モデルを構築します。
またルーキーが初年度から1軍に出場する機会は少ないので、1軍成績とファーム成績の両方を学習させることとします。項目は以下の通りです。

- 打率
- 試合数
- 打席数
- 打数
- 安打
- 本塁打
- 打点
- 盗塁
- 四球
- 死球
- 三振
- 犠打
- 併殺打
- 出塁率
- 長打率
- OPS
- RC27
- XR27

#予測結果
**2021年 清宮幸太郎**

64試合
.240
54安打
6本塁打
28打点

出塁率 .297
長打率 .361
OPS .658

おぉ…。なんかリアル感がすごい…。

#特徴量の重要度
ランダムフォレストでは特徴量の重要度を算出することができます。
今回は目的変数を3年後のホームラン数とした時の各説明変数の重要度をグラフ化してみました。
![kiyomiya.png](https://qiita-image-store.s3.amazonaws.com/0/104983/07af6a4a-6ea5-202c-d7cf-6ba2fab807cc.png)
圧倒的に伸びているのは、2軍の試合数でした。期待されている選手ほど、出場する試合数が多くなるからでしょうか。もしくは試合の経験を多く積むほど、成長できると考えられます。
次に多いのは1軍の三振数でした。高卒ルーキーで1軍に出場することは難しいため、初年度から1軍で経験を積める選手は実力があるということでしょうか。
そのほかだと2軍の四球数が上位となっており、選球眼も求められているようです。
私は安打数、打率、本塁打数など、打撃の実力を直に表す指標が上位にくると考えていたため、この結果をちょっと意外でした。

#予測精度
テストデータでの決定係数は概ね0.2~0.4程度でした。
ただし全体のデータ数が少なく、テストデータの分割具合によって大きく変動してしまうので、あまり意味のない数字かなと思います。

#課題
- データ不足
圧倒的にデータが足りていないので、学習データセットが少し変わるだけで結果に大きく影響が出てしまいます。NPB公式HPを見たところ、2005年までならば成績があったので、データを増やせそうです。それ以前のデータについても、プロ野球の歴史は当然長いので、文献など探せばあるんでしょうが、そこまでやる気力は無く…

- 説明変数の正当性
今回の学習データでは、例えば「試合数」と「打席数」など、説明変数同士で相関がある項目が多いです。重回帰分析では多重共線性が高まり良くないようですが、ランダムフォレストだとどうなんだろうか。どちらにしろ説明変数の項目はもう少し精査する必要がありそうです。

- 説明変数の不足
ドラフト指名順位、所属チーム、守備ポジションなど、追加する余地のある変数は多そうです。

#コード
汚いですがひとまず置いておきますので、もし興味のある方がいらっしゃいましたらご覧ください。
https://github.com/Sinhalite/kiyomiya

#おわりに
高卒野手がいきなり1軍で結果を残すのは、そう簡単なことではありません。もちろん山田哲人、鈴木誠也、大谷翔平のようにすぐに活躍する選手もいますが、大半の選手は出場機会すら十分に得るのが難しいでしょう。ベイスターズの主砲・筒香も活躍し始めたのは5年目からでしたし、過度にプレッシャーをかけず、気長に見守るのがいいのではないでしょうか:angel_tone1:

少しでもこの記事が参考になる、面白いと思ったら、いいねボタンをクリックしていただけると幸いです:bow_tone2:
Dockerfileでビルド時にbashを使う

# 結論
## ずっと`bash`を使いたい
Docker 1.12から追加された`SHELL`を使う。

```Docker
SHELL ["/bin/bash", "-c"]
```

## ずっと`bash`を使いたい(Docker 1.12未満)
`/bin/sh`のシンボリックリンクを張り替える。

```Docker
RUN rm /bin/sh && ln -s /bin/bash /bin/sh
```

## 一時的に`bash`を使いたい
シェルを直接指定してコマンドを実行する。

```Docker
RUN ["/bin/bash", "-c", "echo hello"]
```


# Dockerfileでbashを使ういろいろ
Dockerfileのビルド時に`source`等を使いたい場合，デフォルトのshellである`/bin/sh`では使えないため，`/bin/bash`等を使う必要が出てくる。
ググると`RUN ["/bin/bash", "-c", "echo hello"]`などや`RUN rm /bin/sh && ln -s /bin/bash /bin/sh`などが上位にヒットする。
前者は一時的に`/bin/bash`で実行できるが全ての命令を`/bin/bash`で実行したい場合は煩雑である。
後者は`/bin/sh`を削除するため，`/bin/sh`も使いたいときは向かないが，`SHELL`が使えないDocker 1.12未満でも動くため，Dockerのバージョンが古い場合は便利である。

しかし，よくよく調べるとちゃんと[公式ドキュメントに書いてあった。](http://docs.docker.jp/engine/reference/builder.html#shell)
Docker 1.12から追加された`SHELL`を使えばデフォルトのshellを変更できる。
具体的には以下のように書く。

```Docker
SHELL ["/bin/bash", "-c"]
```

再びshellを変更したい場合は `SHELL ["/bin/sh", "-c"]`と書けば変更することができる。
Pythonのベクトルの類似度計算高速化

3万文書をベクトル化し、類似度計算するときに大量ベクトルの類似度計算にすさまじい時間がかかっていたので、効率的な計算方法を調査。scipyのライブラリを使うことで100倍くらい速くなったのでメモ。

```calc_similarity.py
from scipy.spatial import distance
# ベクトルの作成 (Mは30,000×100の配列）
M = [a.vector for a in articles] # a.vectorは100要素のnp.arrayベクトル
# 30,000の記事の総当たり類似度を計算
dist_M = distance.cdist(M, M, metric='cosine')
```
結果がコサイン類似度ではなくコサイン距離で出るので注意。

今回の場合同じ配列同士を計算しているので、上三角形だけ計算する`pdist`の方がいいらしい。（計算時間が２分の１になる）。後ほど試す。
A successful Git branching model [ブランチをちゃんと理解する！]

#はじめに
**自分があやふやだったためしっかり理解するように書きました。なぜそのようなブランチがあるのか？が分かるとgitflowのブランチについて理解できると思ったのでgitflowのブランチの役割に焦点を置いて書きました。<font color="red">見出し下太文字はブランチの流れ</font>を表しています。主に説明は図でさせて頂きました！！ブランチの流れは図を見た後に復習として見て頂ければと思います！**


参考：
http://keijinsonyaban.blogspot.com/2010/10/a-successful-git-branching-model.html?m=1

https://danielkummer.github.io/git-flow-cheatsheet/index.ja_JP.html

##masterブランチ
**releaseブランチ→masterブランチ**
masterにマージしたリリースブランチは基本削除する。がしかし、中には言語のバージョンで分けてとって置きたいこともあると思うので削除が全くの正解という訳ではない。
><img width="861" alt="スクリーンショット 2018-10-08 22.55.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/133940/2b7023f0-8987-cf24-fac8-fb07554114c6.png">

##developブランチ
**developブランチ→featureブランチ→developブランチ**
**developブランチ→releaseブランチ→masterブランチ**
develpにマージしたfeatureブランチは削除。developにマージしたものをリモートに反映するので基本featureブランチはリモート(origin)に存在しない
><img width="814" alt="スクリーンショット 2018-10-08 22.56.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/133940/9c1badce-82eb-8463-1cfc-203de46bc3cf.png">

##featureブランチ
**developブランチ→featureブランチ→developブランチ**
develpにマージしたfeatureブランチは削除。developにマージしたものをリモートに反映するので基本featureブランチはリモート(origin)に存在しない
グループ開発の時は一回リモートにプッシュし、確認、マージする人がプルし確認する。
><img width="858" alt="スクリーンショット 2018-10-08 22.56.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/133940/c190fc30-1e48-f8c3-7108-0cdcc06c011c.png">

##releaseブランチ
**developブランチ→releaseブランチ→masterブランチ**
masterにマージしたリリースブランチは基本削除する。がしかし、中には言語のバージョンで分けてとって置きたいこともあると思うので削除が全くの正解という訳ではない。
グループ開発の時は一回リモートにプッシュし、確認、マージする人がプルし確認する。
><img width="879" alt="スクリーンショット 2018-10-08 22.56.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/133940/9e2e7e7a-5123-ce2a-5aa1-0ef8da594677.png">

##hotfixブランチ
**masterブランチ→hotfixブランチ→masterブランチ**
開発にも反映
**hotfixブランチ→releaseブランチ**
リリースブランチ準備していたらリリースブランチにも反映
**hotfixブランチ→developブランチ**
masterブランチに反映が終わればhotfixブランチは削除する。
グループ開発の時は一回リモートにプッシュし、確認、マージする人がプルし確認する。
><img width="941" alt="スクリーンショット 2018-10-08 22.56.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/133940/1bc59e7f-5365-ff3b-f01e-f721f9af562f.png">

#最後に
これで再度gitflowの図を見て頂ければと思います！
間違っていないと信じていますが、違うところあればご指摘お願いします。:hatching_chick:
flutter pluginをIDEに認識させる方法

いくつかのflutterライブラリにプルリクエストを出しましたが、ネイティブ側のコードの修正時にIDEに補完やコンパイルエラーなどを任せた方が楽です。
その際に役に立つと思います。
また、ネイティブ側のコードを追っていきたい場合などにも使えます。

すでにflutterの完成度は高いですが、それぞれのライブラリでは、まだまだバグがあったりします。
この記事をきっかけに少しでもコントリビューターが増えればと思っています。

普通にXcode、AndroidStudioで開いても認識しませんので注意です。

例としてfirebase_authを使って見ます。

```
$ git clone git@github.com:flutter/plugins.git
```

flutterのライブラリは全てexampleがあるのでそれを利用するのです。

# ios

まずはiosです。

```
$ cd packages/firebase_auth/example
$ open ios/Runner.xcworkspace
```

Xcodeを開いたら、NavigatorペインでRunnerを選択 -> TARGETSを選択してGeneralのSigningで自分のTeamを選択。

![スクリーンショット 2018-10-05 14.15.03.png](https://qiita-image-store.s3.amazonaws.com/0/10494/1fc8e34d-5890-7732-82f2-5d063febd3ee.png)

```
$ cd packages/firebase_auth/example
$ flutter build ios
$ open ios/Runner.xcworkspace
```

最初にbuildするのが重要です。

NavigatorペインのPods -> Development Podsに変更したいPluginがあるのでそこに行きます。
ここにあるソースはシンボリックリンクで元のソースを参照しているので、ここを修正することで反映されます。

![スクリーンショット 2018-10-05 14.19.12.png](https://qiita-image-store.s3.amazonaws.com/0/10494/7e6141a3-7d8f-0ee0-519d-1c227d858169.png)


# android

Androidもほとんど同じです。より簡単です。

```
$ cd packages/firebase_auth/example
$ flutter build apk
```

Android Studioでexample/androidを開いて、以下を見れば良いです。

![スクリーンショット 2018-10-05 14.21.27.png](https://qiita-image-store.s3.amazonaws.com/0/10494/8caf1ed0-34fd-19d0-7343-6cd21c96e5ea.png)
GASのエラー”呼び出す権限がありません”はマニフェストファイルに問題あり

事件は，こちらの記事↓を参考に，GASで遊んでいた時に起きました．

Google Apps ScriptでWebアプリケーションにスプレッドシートの値を出力する
https://tonari-it.com/gas-web-appli-spreadsheet-append/

この記事の内容は，GASで権限がないと怒られても，マニフェストファイルをいじれば手動で追加できるよってことです，

<h1>権限がないと怒られた</h1>
<h4>スプレッドシートの値を取得する関数を実行したらエラーが発生</h4>
![スプレッドシートを呼び出す権限がないスクショ.PNG](https://qiita-image-store.s3.amazonaws.com/0/269714/d50baf24-2797-06b8-4889-d98f875cbd12.png)
SpreadsheetApp.getActiveSheet を呼び出す権限がありません。必要な権限: (https://www.googleapis.com/auth/spreadsheets.currentonly || https://www.googleapis.com/auth/spreadsheets)（行 7、ファイル「コード」）

<h4>原因はスコープに権限が追加されていないこと</h4>
怒られたときにでてきたURLが，ファイル→プロジェクトのプロパティ→スコープ にないことが原因っぽい．
![スコープがない.PNG](https://qiita-image-store.s3.amazonaws.com/0/269714/3663a184-16b4-3672-a1dc-d2a51585a77a.png)

前例を調べてみると，スクリプト実行時に何かしら権限を承認するウィンドウが出るようだが，なにも出ない...
このままではスコープに追加できない...！

<h4>【解決策】マニフェストファイルにスコープを手動で追加</h4>
表示→マニフェスト ファイルを表示 で表示されるマニフェストファイルに，以下の一行を追加

"oauthScopes": ["https://www.googleapis.com/auth/spreadsheets.currentonly", "https://www.googleapis.com/auth/spreadsheets"]

![マニフェストファイルにスコープを追加.PNG](https://qiita-image-store.s3.amazonaws.com/0/269714/11da6b17-74b1-65a7-e9bc-8303b788b70f.png)
しっかり保存を忘れずに．

スコープに追加されていることも確認．
![スコープがある.PNG](https://qiita-image-store.s3.amazonaws.com/0/269714/7deeeb04-c609-af75-58e4-f94626b89689.png)

関数を再度実行すると，”承認が必要です”と出るので，あとは表示通りに進めていくだけ．
![承認が必要です.PNG](https://qiita-image-store.s3.amazonaws.com/0/269714/66f44e7b-8455-1a2d-ccfe-2ba0e11277a5.png)

詳細→〇〇（安全ではないページ）に移動で許可．ここが分かりにくいですね．
![よく見る警告.PNG](https://qiita-image-store.s3.amazonaws.com/0/269714/b25cabfb-e1bc-198f-4210-7d73cb437e45.png)

承認すると無事実行できました．

<h4>あとがき</h4>
以上，事件発生から解決まででした．
同じ道に迷った誰かの助けになると嬉しいです．
emacs-23.4をUbuntu18(x64)でmake

# 今更ながらemacs-23をUbuntu18.04(x64)でmakeしたときのメモ

標準インストールされているgccではmakeが完了しないので記事として残しておきます。
_※2018/10/13 必要なパッケージ類を追加_

```shell
$ sudo apt install \
 libgtk-3-dev libxpm-dev libtiff5-dev librsvg2-dev \
 libgconf2-dev libgpm-dev libm17n-dev libgif-dev \
 libjpeg-dev libtiff-dev xaw3dg-dev

$ sudo apt install gcc-4.8
$ curl -L -O https://ftp.gnu.org/gnu/emacs/emacs-23.4.tar.gz
$ tar zxvf emacs-23.4.tar.gz
$ cd emacs-23.4/
$ ./configure CC=gcc-4.8 --with-crt-dir=/usr/lib/x86_64-linux-gnu --with-gif=no 
$ make
$ sudo make install
$ hash -r
$ emacs
```

そろそろ最新のemacsで.emacsを読めるように書き換えねばと思いつつ何年たったのだろうか...
いつの間にか異なるバージョンのgccをインストールして使い分ける世の中になったのですねぇ...
Pythonでエクセルの操作

Pythonでエクセルの操作をしたい場合は、`pandas`というライブラリが使えます。
Excelの読み込み → 操作 → 書き込みの流れでよく使われる最低限の関数をまとめました。

## Excelの読み込み

```python
import pandas as pd

path = 'sample.xlsx'
df = pd.read_excel(path)

df_queried = df_target.query('name == [u"Anna",u"Erza"]')
```

- `read_excel`: エクセルを読む、DataFrame型を返す [公式Doc](https://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_excel.html)
- `DataFrame.query`: 読んだエクセルのデータを絞り込む [公式Doc](https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.query.html)


## Excelの操作
```python

for index, row in df_target_queried.iterrows():
   print row['name'] # name列の要素を取得する
   print row[u'名前'] # 日本語の場合Unicode指定が必要な場合も

for column in df_target_queried:
   print column # 列ごとに展開する
```

- `DataFrame.iterrows()`: 読んだエクセルのデータを列ごとに展開するループ関数

## Excelの書き込み
```python

out = {
    'name': ['Erza', 'Anna'],
    'age': [22, 25],
    'color': ['red', 'pink']
}

df_out = pd.DataFrame(out, columns=['name', 'age', 'color'])
writer = pd.ExcelWriter("save.xlsx")
df_out.to_excel(writer, sheet_name="save")

writer.save()
```

- `ExcelWriter`: pandaのExcel書き込みオプジェクトを作成する。 DataFrame型を渡す必要がある　[公式Doc](http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.to_excel.html?highlight=excelwriter)
- `to_excel`: Excelのワークブック上のシートにデータを書き込む [公式Doc](http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.to_excel.html?highlight=to_excel#pandas.DataFrame.to_excel)
文法がRuby風味のプログラミング言語

なんとなく集めて見た

そんなに意味はない、文法がRubyっぽいからってどうこうはない


# Ruby風味のプログラミング言語って具体的に何？

## Elixir 
最近話題の言語。
ErlangのVM上で動く、動的型付けの関数型言語です。
![elixir](https://cdn-ssl-devio-img.classmethod.jp/wp-content/uploads/2015/11/elixir-flame.png)
Erlangの恩恵（耐障害性など）を受けつつ、Rubyのような書きやすさを実現した**魅力的な**言語です。
また、ElixirのWebApplicationフレームワーク、Phoenixも勢いがあります！
Phoenixのコンセプトは"Productive. Reliable. Fast."
あーーーー、もう魅力的ですね。生産性はあり、そして信頼性があり高速。
Railsの代替になるのももうすぐでしょうか。

Elixirのコード

```elixir

current_process = self()

# Spawn an Elixir process (not an operating system one!)
spawn_link(fn ->
  send current_process, {:msg, "hello world"}
end)

# Block until the message is received
receive do
  {:msg, contents} -> IO.puts contents
end
```

詳しくは。
https://qiita.com/HirofumiTamori/items/0dfdbada30c7d8f183fd
https://phoenixframework.org/

## Crystal

静的型付けのコンパイラ言語。
まだα版です。
![crystal](https://crystal-lang.org/images/crystal-h.png)

Crystalのコンセプトは"Fast as C, Slick as Ruby"
Cのように速く、Rubyのように滑らかに。
これもRubyの良さを生かしパフォーマンスがありとてもかっこいいですね！！

CrystalはElixirと違って、静的型付け言語です。
Rubyがファースト言語でしたから、静的型付けは慣れなかったんですけど、Rustを始めてから少しずつ慣れてきました。静的型付けなら実行しなくても単純なエラーをすぐに発見できるので良いですよね。（当たり前）
Rubyを書いてるようなのに静的型付けで素晴らしいと思いました。
また、Null安全性を取り入れていますよ。
そして、マクロというシステムがあり、コードの重複を排除すると言うメリットがあります。

Crystalのコード

```ruby

# A very basic HTTP server
require "http/server"

server = HTTP::Server.new do |context|
  context.response.content_type = "text/plain"
  context.response.print "Hello world, got #{context.request.path}!"
end

puts "Listening on http://127.0.0.1:8080"
server.listen(8080)

```

詳しくは。
http://ja.crystal-lang.org/

#### おまけ

### Goby

Goによる（ほぼ）Ruby実装。
主にAPIサーバやマイクロサービスの作成のための言語だそうです。
![goby](https://camo.githubusercontent.com/c10cbe7698648254c15b946e6376ad29e87a178c/687474703a2f2f692e696d6775722e636f6d2f456c47417a526e2e706e673f33)
https://github.com/goby-lang/goby

# 最後に
みなさん、Elixir,Crystal使ってみてください。