OmniAICreator/Qiita-1.07M huggingface dataset:
ファイルが多くscpに時間がかかる時の改善方法

対象ファイルが多く scp で2分ぐらい転送にかかっていたのが、ssh + tar に置き換えたら 20秒ぐらいで終わるようになった。
同じ境遇の人のために、やり方.. コマンドをメモ

例) サーバ「hogehoge」に ~/tmp 配下をコピーする

```bash
(cd ~/tmp; tar cf - ./ 2> /dev/null | lzop -c | ssh hogehoge "lzop -d | tar xfm - -C ~/tmp")
```

ネットワーク上の転送量を抑えるため、lzop を使ってます。lz4でもよさげ。
lzop が使えない場合、gzipなどでも代用は可能だけど圧縮/解凍にかえって時間がかかる場合があるので要注意。
reactでModule parse failed



Module parse failed: fontawesome-webfont.ttf?v=4.7.0 Unexpected character '



```
ハンドルされない例外 下記ソースコードの行 5071、列 1 で発生しました。http://localhost:64258/dist/main.js?v=AXhhFHvUlrsCQah5ZNBxyrBDS2NJSr0TquwzVdDbIEQ
0x800a139e - JavaScript 実行時エラー: Module parse failed: C:\Temp\admin-lte-vs\admin-lte-vs\node_modules\font-awesome\fonts\fontawesome-webfont.ttf?v=4.7.0 Unexpected character '
```


![image](https://qiita-image-store.s3.amazonaws.com/0/49910/45bba97f-4aec-ebbe-8e39-d5807b24d68f.png)


module > rules に拡張子を追加

`  { test: /\.(png|jpg|jpeg|gif|svg|eot|woff2|woff|ttf)$/, use: 'url-loader?limit=25000' } `


```
module.exports = (env) => {
    const isDevBuild = !(env && env.prod);
    return [{
        stats: { modules: false },
        entry: { 'main': './ClientApp/boot.tsx' },
        resolve: { extensions: ['.js', '.jsx', '.ts', '.tsx'] },
        output: {
            path: path.join(__dirname, bundleOutputDir),
            filename: '[name].js',
            publicPath: 'dist/'
        },
        module: {
            rules: [
                { test: /\.tsx?$/, include: /ClientApp/, use: 'awesome-typescript-loader?silent=true' },
                { test: /\.css$/, use: isDevBuild ? ['style-loader', 'css-loader'] : ExtractTextPlugin.extract({ use: 'css-loader?minimize' }) },
                { test: /\.(png|jpg|jpeg|gif|svg|eot|woff2|woff|ttf)$/, use: 'url-loader?limit=25000' }
            ]
        },
        plugins: [
            new CheckerPlugin(),
            new webpack.DllReferencePlugin({
                context: __dirname,
                manifest: require('./wwwroot/dist/vendor-manifest.json')
            })
        ].concat(isDevBuild ? [
            // Plugins that apply in development builds only
            new webpack.SourceMapDevToolPlugin({
                filename: '[file].map', // Remove this line if you prefer inline source maps
                moduleFilenameTemplate: path.relative(bundleOutputDir, '[resourcePath]') // Point sourcemap entries to the original file locations on disk
            })
        ] : [
            // Plugins that apply in production builds only
            new webpack.optimize.UglifyJsPlugin(),
            new ExtractTextPlugin('site.css')
        ])
    }];
};
```
document.createElementNS() で 出力する XML で タグに prefix が付かないメモ


既存の XML を XMLParse して dom を作って

```
<rdf:Description xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:item="http://...../item">
</rdf:Description>
```

という XML の Description に項目を足して

```
<rdf:Description xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:item="http://...../item">
  <item:name>ほげ</item:name>
  <item:type>ほげほげ</item:type>
</rdf:Description>
```

という XML を出力したくて

```
const nsRdf  = "http://www.w3.org/1999/02/22-rdf-syntax-ns#";
const nsItem = "http://...../item";

var desc = dom.getElementsByTagNameNS(nsRdf, "Description");

let el = document.createElementNS(nsItem, "name");
el.textContent = "ほげ";
desc.appendChild(el);

el = document.createElementNS(nsItem, "type");
el.textContent = "ほげほげ";
desc.appendChild(el);

console.log(desc);
```

してみても

```
<rdf:Description xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:item="http://...../item">
  <name>ほげ</name>
  <type>ほげほげ</type>
</rdf:Description>
```

という風に、足したタグに prefix `item` が付かない。

`el.prefix` と `el.namespaceURI` を表示してみると

```
el: <name>ほげ</name>
prefix: null
nsURI: http://...../item
```

という結果。


## 結論

```
el = document.createElementNS(nsItem, "item:name");
```

と書けという事。

```
el: <item:name>ほげ</item:name>
prefix: item
nsURI: http://...../item
```

となりました。


`getElementsByTagNameNS()` では "rdf:Description" を検索してもヒットせず "Description" で検索するものだから、 namespace を指定したら prefix 外すと思い込んでいて・・・
NSAttributedStringのboundingRectのサイズにUILabelを設定したのに…になってしまう時

NSAttributedStringのサイズをboundingRectで計算してUILabelのサイズに適用すると

![Simulator Screen Shot - iPhone 6s - 2018-03-15 at 16.40.48.png](https://qiita-image-store.s3.amazonaws.com/0/24979/7a7e7a6c-fbf9-0290-0cd7-fcd2e7d0b853.png)

本来文字が入り切るサイズのはずなのにこうなることがある。

こういう時はNSAttributedStringにfontを明示的に指定する。
そうすると

![Simulator Screen Shot - iPhone 6s - 2018-03-15 at 16.40.57.png](https://qiita-image-store.s3.amazonaws.com/0/24979/802e1b1c-0cee-16f9-d831-5b7d56f0b879.png)

こんな感じになる。
おそらくUILabelとNSAttributedStringのデフォルトのフォント設定が微妙に違うんだろうなー
Emacsでmarkdownをリアルタイムにプレビューしながら編集する

先日Qiitaで初めて記事を書いた時, markdownのリアルタイムプレビュー機能に感動した.
私はmarkdownを使うことがあまりなかったので, リアルタイムにプレビューできるのはとても助かった.
そこでふと, 「自分のローカル環境でmarkdown書く時にもこの機能あるとめちゃ便利やんけ」と思ったので, やってみたという記事になります.
なお, 私はEmacsを利用してるので, Emacs以外のエディタを使ってる人は申し訳ないですがブラウザバックしてください.

## 環境
macOS Sierra 10.12.6

GNU Emacs 24.5.1

## markdown-preview-mode
Emacsでmarkdownのプレビューができるパッケージがないものか探していたら, markdown-preview-modeなるパッケージを見つけた.

[markdown-preview-mode](https://github.com/ancane/markdown-preview-mode) (githubへのリンク)

物は試しということでとりあえずインストール(Emacsのパッケージ管理ツールを利用).
なお, 上のリンク先にも書いてあるが, markdown-preview-modeの利用には, 以下のパッケージも必要なので, 一緒にインストールしておくと良い.


* websocket.el  
* web-server.el  
* uuidgen

インストール後, ,以下のコードをinit.elに記述.

```
(autoload 'markdown-preview-mode "markdown-preview-mode.el" t)
```

これで終わり. 後はEmacsでmarkdownファイルを開き, M-x markdown-preview-modeを実行すると. ブラウザが立ち上がり書いたmarkdownを見ることができる.

![markdown_demo.gif](https://qiita-image-store.s3.amazonaws.com/0/82047/67e1e69a-61aa-7155-3de9-55434fbec093.gif)


デフォルトだと黒背景にショッキングピンクや蛍光色やらを使ったcssが読み込まれており, 非常に見難い.
なので, cssを変えたい場合は以下のようなコードを設定ファイルに書き込めば良い.
(個人的にはgithubのあの見た目が好きなので, [githubのcss](https://gist.github.com/andyferra/2554919)を使用)

```
(setq markdown-preview-stylesheets (list "github.css"))
```

## まとめ
これでローカルの環境でも, markdownをリアルタイムにプレビューしながら編集できるようになった(嬉しい!).

しかし, これはどのようにやっているのだろうか.
私はEmacs Lispさっぱりなので, コードが読めないのだが, 必要なパッケージにweb-serverやらwebsocketやらがあるあたり, ローカルにwebサーバを立てて, そこにブラウザでアクセスしてるのだろうか・・・

後, いちいちM-x markdown-preview-modeのコマンドを打つのがめんどくさい.
(似たような名前のパッケージがあるから←, 補完でも微妙)
コマンド名をエイリアスかなんかで変えられるといいのだが, いかんせん調べても方法が見つからなかった・・・
誰か詳しい方がいらっしゃれば, ご教示ください!
rails-ujsで、remote:trueのリンクをjsから実行する方法


jQueryから切り離しでいろいろ問題が起こるモヨウ
[Rails 5.1+jQueryでajaxを試す (罠にハマる) - Qiita](https://qiita.com/fursich/items/c2ab11acad918000a8ea)

いまでもRails兼jQueryな世界にいるので、ついて行きたいところ。

ある要件で、Kaminariを利用したPagenationのremote:trueなボタンを
JSから実行したい時に動かなかったので知見を共有。

Rails4まで

```js
      $("#next_page").click();
```

Rail5以降

```js

      document.getElementById("next_page").click();
```

見事にjQeuryからイベント実行しても、動かなくなりました。
JSでゴリゴリ書くのはもう時代遅れなんだろうかな。。
phpMyAdminで急にエラーが出るようになった話

# はじめに
使ってるVM(homestead)上で、急にphpMyAdminから `count(): Parameter must be an array or an object that implements Countable` 的なエラーが出るようになりました。

![2018-03-15_16h24_59.png](https://qiita-image-store.s3.amazonaws.com/0/165355/cee82113-7db8-d5aa-9497-f4a6557cce36.png)


調べてみたら次のような記事が。

> phpmyadmin 4.7.4 is supposed to have "Fixed several compatibility issues with PHP 7.2"
Chances are you have an older version of phpmyadmin.
https://www.phpmyadmin.net/news/2017/8/24/phpmyadmin-474-released/

----

>ガバガバ翻訳：
`phpmyadminはPHP7.2との互換性の問題を修正しました`
古いバージョンのphpmyadminを使用している可能性があります。

+ [**stackoverFlow**](https://stackoverflow.com/questions/48001569/phpmyadmin-count-parameter-must-be-an-array-or-an-object-that-implements-co)

どうやら `phpMyAdmin` のバージョンが古くなっているのが原因のようです。

# アップデート手順

※ `/usr/share/phpmyadmin` に元のソースファイルがある前提です。

```bash:console
# superuserで入ってアプリケーションの削除
sudo su
apt remove phpymadmin
rm -rf /var/share/phpmyadmin

# 適当にワークディレクトリを作る
cd /var/www/
mkdir tmp
cd tmp

# ソースファイルのダウンロード・解凍
wget https://files.phpmyadmin.net/phpMyAdmin/4.7.9/phpMyAdmin-4.7.9-all-languages.tar.gz
# https://www.phpmyadmin.net/downloads/
tar zxvf phpMyAdmin-4.7.9-all-languages.tar.gz

# 圧縮ファイルの削除・ソースのリネーム
rm phpMyAdmin-4.7.9-all-languages.tar.gz
mv phpMyAdmin-4.7.9-all-languages phpmyadmin

# 元の場所にリプレイス
cp -R phpmyadmin /usr/share/phpmyadmin

# お好みでワークフォルダーを削除する
# cd /
# rm -R /var/www/tmp

# phpMyAdminが使用するテーブルを作成する
# まずはインポート用のsqlファイルがどこにあるか探す
find -name create_tables*
# ./phpmyadmin/sql/create_tables.sql
pwd
# /var/www/tmp

# 実際のインポート作業はMySQL側で行う
mysql

# mySQL側でインポート
source /var/www/tmp/phpmyadmin/sql/create_tables.sql
```

# 所感
もう少し分かりやすいエラーを吐いてもバチは当たらないと思う。
backlogからslack連携する方法WithZaiper

backlogからslack連携するのに、
サーバーレスアーキテクチャを使う手もあるけれど、
どうせなら無料でやりたいっていうことで、
Zaiperを利用する方法をご紹介

1. 画面上でWebhookを選択
[![Screenshot from Gyazo](https://gyazo.com/41a353dcfb3c30501c7717f9409a465d/raw)(https://gyazo.com/41a353dcfb3c30501c7717f9409a465d)

1. Catch a hook
 受けor攻めの選択です。こちらはHookの受け口のなので、受け側[Catch a hook]を選択
2. パラメータはあとで自動的に当てはめてくれるので、次へ
3. Post先のURLが表示されるので、コピーします。
4. 上記のURLをWebhookに登録し、テスト実行します。
5. するとZaiper側でリクエストOKとなるので、次へ進みます。
6. あとは、Slackへ投稿する時のメッセージなどを設定すればOK

と言った感じで、自動連携が作れます。
Redmineの標準で欲しいUIがあるので、Backlogめっちゃ良い。

エンジニアの界隈ではSlackが標準化してきているので、標準機能に欲しい所だけど、Webhookのおかげで簡単にできます。
こうなると、連携処理をイロイロ作りたくなってきますね。
時系列データを保存する

シミュレーションを行うと時系列データの管理が問題になりますが、そのための簡単なライブラリを書いたので共有しておきます。

https://github.com/termoshtt/asink
Async sink wrapper for time-series data 

使い方
------

crates.ioに上がってるのでCargoで指定するだけで使えます：

```toml:Cargo.toml
[dependencies]
asink = "0.1.1"
```

このライブラリではデータを順次流し込む先を `Sink` と呼びます。Sinkはスレッドを一つ起動してチャンネル経由でもらったデータを保存していきます。

```rust
let sink = msgpack::MsgpackSink::from_str("test.msg");
let (s, th) = sink.run();
// execute simulation...
th.join().unwrap();  // Sinkのスレッドの終了を待つ
```

この `s` は [std::sync::mpsc](https://doc.rust-lang.org/1.15.1/std/sync/mpsc/index.html)の [`Sender<T>`](https://doc.rust-lang.org/1.15.1/std/sync/mpsc/struct.Sender.html) です。`std::sync::mpsc`はその名の通り複数の生産者 (Multiple-Producer)から単一の消費者(Single-Consumer)にデータを送信できるチャンネルを提供します。送られたデータは容量無制限でFIFOに貯められ、Sink側のスレッドで消費されていきます。

送信されるデータの型 `T` は`T: Send + Serialize`を満たす型であれば何でも使えます。`Serialize`はRust標準となった(?)シリアライズ方式である[serde](https://github.com/serde-rs/serde)のtraitで`std`の標準的な型(`Vec`等)の組み合わせで出来た型についてはあらかじめ実装されているうえ、自作の構造体についても[serde-derive](https://github.com/serde-rs/serde/tree/master/serde_derive)で簡単に実装できます：

```rust
extern crate serde;
#[macro_use]
extern crate serde_derive;

#[derive(Serialize)]
struct Doc {
    time: f64,
    data: Vec<f64>,
}
```

保存先のバックエンドとしてJSON, msgpack及びMongoDBをサポートしています。いずれもあらかじめスキーマを決める必要がないため、[serde-json](https://github.com/serde-rs/json)や[rmp-serde](https://github.com/3Hren/msgpack-rust)を経由してシリアライズができます。
正しJSONとmsgpackは受け取ったデータ毎にシリアライズするため、[JSON lines](http://jsonlines.org/)

```
{"a": 1, "b": [1, 2, 3]}
{"a": 2, "b": [2, 2, 3]}
```

やmsgpack streamとしてシリアライズされます。MongoDBの場合には[bson](https://github.com/zonyitoo/bson-rs)によってシリアライズされますが、MongoDBに保存するには`BSON::Document`である必要があるので`HashMap`である必要があり、`T = Vec<f64>`のようなものは保存できません。上で定義したようなserde-deriveを使用する場合、構造体は自動的に`HashMap`になるのでその点は問題ないと思います。

Simulationから保存に関するコードを分離
--------------------

```rust
fn experiment(s: Sender<Doc>) {
    for i in 0..5 {
        // 計算のメインループ
        let doc = Doc {
            id: i,
            data: vec![i as f64],
        };
        s.send(doc).unwrap(); // データをSinkに投げる
    }
}

fn main() {
    let sink = msgpack::MsgpackSink::from_str("test.msg");
    let (s, th) = sink.run();
    experiment(s);
    th.join().unwrap();
}
```

このようにデータをどこに保存するか考えずにシミュレーションの本体を記述することが可能となります。
アーカイブ一覧（wp_get_archives）の月表記を英語表記にする


テンプレートファイル以外はなるべく修正したくないので、functions.php内で完結させました。

何もしなければ

	2018年3月
	
と、なる表記を

	2018, March
	
に変更させます。

```php:functions.php
/*英語表記に変換関数*/
function encode_date( $m ) {
	if(strpos($m,'11月') !== false){return 'November';}
	elseif(strpos($m,'12月') !== false){return 'December';}
	elseif(strpos($m,'1月') !== false){return 'January';}
	elseif(strpos($m,'2月') !== false){return 'February';}
	elseif(strpos($m,'3月') !== false){return 'March';}
	elseif(strpos($m,'4月') !== false){return 'April';}
	elseif(strpos($m,'5月') !== false){return 'May';}
	elseif(strpos($m,'6月') !== false){return 'June';}
	elseif(strpos($m,'7月') !== false){return 'July';}
	elseif(strpos($m,'8月') !== false){return 'August';}
	elseif(strpos($m,'9月') !== false){return 'September';}
	elseif(strpos($m,'10月') !== false){return 'October';}
}

function my_archives_link($html){
	$posY = mb_strpos($html, '年')+1;
	$posM = mb_strpos($html, '月');
	$m = mb_substr($html, $posY, $posM-$posY);//n月を抜き出して変数に入れる
	$m = trim($m);
	$mEn = encode_date((string) $m);
	$html = str_replace($m,$mEn,$html);
	$html = str_replace('年',', ',$html);

  return $html;
}

add_filter('get_archives_link', 'my_archives_link');
```

サイドバーなどテンプレートに、以下を記入します。

```php
<?php wp_get_archives(); ?>
```

### 参考サイト
http://design-studio-f.com/blog/wp-get-archives-list-customized/
https://www.nxworld.net/wordpress/wp-month-change.html
http://kudox.jp/php/string-function

#### 2022年3月修正
すごい今更ですけれども、それぞれの月が抽出できていなかったのを修正しました。
これで記事件数も表示できる！
terraform tfvarsでヒアドキュメントを使用した時にハマったこと

## 概要
terraformのtfavarsに改行コード入れたい時、ヒアドキュメントを使用できます。
ですが、```heredoc not terminated```といったエラーが出力されハマったので情報を残しておきます。

## 環境
```
$ terraform --version
Terraform v0.11.3
```

## 解決策
最後に空白行を追加して解決しました。

### NGパターン
```
test = <<EOF
test1
test2
EOF
```

### OKパターン
```
test = <<EOF
test1
test2
EOF

```

## 参考情報
https://github.com/hashicorp/terraform/issues/4835
民法143条「年齢計算に関する法律」に従った日基準の年齢計算のテストケース＋C#のサンプルソース

ロジックや解説に関しては以下を参照のこと

まだ年齢計算で消耗してるの？ - Qiita
https://qiita.com/kawasima/items/8fdd3939be151f33f7cf

> 年齢計算は日本の場合は、「[年齢計算ニ関スル法律](https://ja.wikipedia.org/wiki/%E5%B9%B4%E9%BD%A2%E8%A8%88%E7%AE%97%E3%83%8B%E9%96%A2%E3%82%B9%E3%83%AB%E6%B3%95%E5%BE%8B)」に基づいた計算になります。
> 
> ここで、大きく別れるのが、時刻基準で計算するか日基準で計算するかです。
> 一般的には時刻基準で計算するので、4月1日生まれの人は、4月1日の0時ちょうどに歳をとることにすればよいですが…、日基準の場合には誕生日前日に歳をとることになります。日基準で計算される有名なのは学齢がありますが、選挙権なんかも同じく日基準のようです。

この民法第143条の**日基準**の年齢計算のロジックは参照先の通りいくつかあるが、毎度ながらテストケースに迷うのでメモ。

| 誕生日   | 歳を重ねる日 | 誕生日がうるう年か | 基準日     | 基準年の歳を重ねる日 | 基準日がうるう年か | 年齢 |
|:---------|:------------:|:------------------:|:-----------|:--------------------:|:------------------:|:----:|
| 2012/3/1 | 2/28 or 2/29 | ○                 | 2016/2/28  | 2016/2/29            | ○                 | 3    |
| 2012/3/1 | 2/28 or 2/29 | ○                 | 2016/2/29  | 2016/2/29            | ○                 | 4    |
| 2012/3/1 | 2/28 or 2/29 | ○                 | 2017/2/28  | 2017/2/28            | -                  | 5    |
| 2013/4/6 | 4/5 | -                  | 2017/4/6   | 2017/4/5             | -                  | 4    |
| 2013/4/6 | 4/5          | -                  | 2017/4/5   | 2017/4/5             | -                  | 4    |
| 2013/4/6 | 4/5          | -                  | 2017/4/4   | 2017/4/5             | -                  | 3    |
| 2013/3/1 | 2/28 or 2/29 | -                  | 2016/2/28  | 2016/2/29            | ○                 | 2    |
| 2013/3/1 | 2/28 or 2/29 | -                  | 2016/2/29  | 2016/2/29            | ○                 | 3    |


参照元のソースを基にC#版の民法第143条の**日基準**の年齢計算

```C#:DateTimeExtentions.cs

        public static int CalcAge(this DateTime birthday, DateTime baseDate = new DateTime())
        {
            var calcBaseDate = baseDate.AddDays(1);
            return (int.Parse(calcBaseDate.ToString("yyyyMMdd")) - int.Parse(birthday.ToString("yyyyMMdd"))) / 10000;

        }
```

追記：

世の中にある年齢計算のツールは、ほとんどが**時間基準**の年齢計算なので、結果が違うんですよね。
上記のケースを、試しに入力してみるといくつかのケースで結果が異なるはず。

いま，何歳？ - 高精度計算サイト
http://keisan.casio.jp/exec/system/1233283157
年齢計算機/年齢早見表
http://www5d.biglobe.ne.jp/Jusl/Keisanki/JTSL/nenrei.html
AWS SDK for Ruby v3でREPLを使う

## REPLとは

Read-eval-print loopの略で、評価して表示して繰り返す。対話型評価環境を指します。
Ruby標準では、irbが使えますが、さらにそれを強力にしたのがpryというgemです。

pryの説明は主題から外れるので、はしょります。
下記参考になります。
**[今更聞けないpryの使い方と便利プラグイン集](https://qiita.com/k0kubun/items/b118e9ccaef8707c4d9f)**

↑で紹介されている通りpryはプラグインが豊富です。
pry-*で検索しただけでも100個以上ありますね。

```console
$ gem list ^pry- --remote | nl
     1	pry-aa_ancestors (0.0.1)
     2	pry-alias (0.0.1)
     3	pry-auditlog (0.3.0)
　〜省略〜
    99	pry-vterm_aliases (1.3.0)
   100	pry-windows (0.1)
   101	pry-yes (0.0.1)
```

## aws.rbとは

aws.rbとは、AWS SDK for Rubyに付属しているREPLを提供するコマンドです。
aws-sdk, pryという２つのgemを入れておけば、aws.rbコマンドが使えます。

これを使うと、AWS-SDKを使ったツールやアプリを開発する際に、APIに対話形式で
アクセスできリクエスト／レスポンスを確認しながら実装できるので捗ります。

以下、aws.rb導入＆実行例です（注. 事前にaws credentials設定が必要）

```pry
$ gem install aws-sdk pry
$ aws.rb
Aws> ec2.describe_instances
[Aws::EC2::Client 200 0.666618 0 retries] describe_instances()
=> #<struct Aws::EC2::Types::DescribeInstancesResult
 reservations=
  [#<struct Aws::EC2::Types::Reservation
    groups=[],
    instances=
     [#<struct Aws::EC2::Types::Instance
       ami_launch_index=0,
       image_id="ami-00000000",
       instance_id="i-00000000000000000",
       instance_type="t2.small",
       kernel_id=nil,
       key_name="hogehoge",
       launch_time=2018-03-09 07:38:27 UTC,
       monitoring=#<struct Aws::EC2::Types::Monitoring state="disabled">,
以下略
```

## v3で実行できない！？

この記事の主題になりますが、SDKのバージョンが 2017/8ごろにv３になりました。
（[AWS開発者ブログ](https://aws.amazon.com/jp/blogs/developer/announcing-the-modularized-aws-sdk-for-ruby-version-3/))
で、v3ではaws.rbの実行ファイル自体は存在していますが、実行するとエラーになります。

```console
$ aws.rb
rbenv: aws.rb: command not found

The `aws.rb' command exists in these Ruby versions:
  2.4.2
```

これでしばらく悩みました。。（コマンドはあるのに使えないのがハマりポイント）

## どうすれば実行できるか

端的に言うと、コマンド名が変わってました。
**aws.rb** から **aws-v3.rb**に。
[APIドキュメント](https://docs.aws.amazon.com/sdk-for-ruby/v3/api/index.html#REPL_-_AWS_Interactive_Console)にも書いてました。。まあドキュメント読めよってことですね＾＾；


## おまけ

v3では、EC2やS3などのサービスごとにgemが分かれています。
こんな感じで。

```console
$ gem list ^aws-sdk- --remote

*** REMOTE GEMS ***

aws-sdk-acm (1.3.0)
aws-sdk-alexaforbusiness (1.1.0)
aws-sdk-apigateway (1.9.0)
aws-sdk-applicationautoscaling (1.8.0)
aws-sdk-applicationdiscoveryservice (1.1.0)
aws-sdk-appstream (1.6.0)
aws-sdk-appsync (1.1.0)
```

sdkを使うだけなら、aws-sdk-ec2など、使いたいgemだけインストールしておけば
使えます。
が、aws-v3.rbを使うにはaws-sdkの多くのgemを入れる必要がありました。。
最小限となるgemの精査はしていないですが、aws-sdk-ec2, aws-sdk-coreを
入れただけでは使えませんでした。
なので、簡単に使いたいならaws-sdkを指定し、各サービスのgemを入れる必要があり
（要らないものも入っちゃいます。 140個ほど）

ということで、AWS SDK for Ruby v3でREPLを使う場合は、
aws-v3.rbコマンドを使いましょう！！
Azure Storageで静的Webサイト公開

# まずはStorage Acountを作成(2018年3月時点)
1.Azureコンソールを開く
2.リソースの作成をクリック
3.Storage Acountをクリック(なければ検索して)
4.名前を適当につける(3文字以上24文字以内の英数字)
5.あとはそのまま(リソースグループを作るくらい、既存のを選んでもいい)

# コンテナーの作成
Azure Storageでは「コンテナー」と「BLOB」と言われるもので構成されている。
個人的な認識では・・・
コンテナー ＝ フォルダ
BLOB ＝ ファイル
というざっくりとした認識(間違っているかも)

1.すべてのリソースをクリック
2.作成したStorage Acountを選択
3.メニューからコンテナーを選択
4.「＋コンテナー」をクリック
5.名前に「$root」と入力
6.パブリックアクセスレベルは「コンテナー」を選択
7.作成をクリック

$rootというフォルダを作成して配下にindex.htmlを置いて
Blob service エンドポイントのURLにアクセスすると
https://URL/index.htmlみたいな感じでアクセスできる。

# ファイルのアップロード
後は$root配下にアップロードするだけ

# 注意
例えばcssやイメージファイルをフォルダ分けしたい場合は
新たにコンテナーを作成してそっちに入れて
そこを参照するようにすればいい。

例) imgコンテナーを作成した場合
https://URL/img/sample.jpg


ちなみにコンテナー名は3文字以上63文字以下です。
確率分布をニューラルネットで学習する

##はじめに
ニューラルネットを使ったセミパラメトリックな密度推定の手法を考案しました。
[Chainerによる実装(github)](https://github.com/tmagara/probability-distribution-network)

確率密度関数 $f(x)=P(X=x)$ を直接ニューラルネットで学習しようとしても、
$$ \int_{-\infty}^{\infty}f(x)dx=1 $$
を満たすような制約を与えることは困難です。

しかし、累積分布関数 $F(x) = P(X \leq x)$ について考えると満たすべき制約は、

```math
\frac{\partial}{\partial x}F(x) \geq 0 \\
F(-\infty)=0 \\
F(\infty)=1
```

であり、このうち単調増加性についてはその制約を満たすニューラルネットモデルが存在します。

*[Monotonic Networks, J.Sill (NIPS 1997)](https://papers.nips.cc/paper/1358-monotonic-networks)*

今回はこのモデルをベースに、$F(x)$ を直接ニューラルネットに学習させてみました。

##一次元の確率変数の場合 

確率変数$ X $の観測データ$ \lbrace x_1, ...,x_N \rbrace $に対して、

$$ \underset{\theta}{\arg \min} \lbrace -\frac{1}{N}\sum_{i=1}^{N} \log f_\theta(x_i) \rbrace $$

を得たいので
$$-\frac{1}{N}\sum_{i=1}^{N}\log f_{\theta}(x_i)$$
を損失関数として$\theta$の学習を行います。
ここで、
$$f_{\theta}(x) = \frac{\partial}{\partial x}F_{\theta}(x)$$
ですが、これはChainerのDouble backpropagation機能で求めることができます([chainer.grad()](https://docs.chainer.org/en/stable/reference/core/generated/chainer.grad.html))。

###学習結果
オレンジ色の実線がモデルの出力した$P$です。

####ガウス分布
![gaussian_1d.png](https://qiita-image-store.s3.amazonaws.com/0/152511/492cf471-9936-d5c2-ccf4-fac79e147546.png)

####切断ガウス分布
![half_gaussian_1d.png](https://qiita-image-store.s3.amazonaws.com/0/152511/5bebd24b-1d3f-bf50-8c02-266a69e72b81.png)

##二次元の確率変数の場合
$$P(X, Y) = P(X) P(Y|X)$$
を計算すればよいです。
つまり$P(X)$と$P(Y|X)$をそれぞれ別のニューラルネットに学習させます。

右側がモデルの出力した確率密度です。
####混合ガウス分布
![mixed_gaussian_2d.png](https://qiita-image-store.s3.amazonaws.com/0/152511/9fded87d-8ecf-c24b-cb5e-d869fab04bd2.png)

####切断(?)ガウス分布
![half_gaussian_2d.png](https://qiita-image-store.s3.amazonaws.com/0/152511/469c1efc-f3eb-b0bd-642e-d0ea0a4462a0.png)

最後の例はあまりうまく行っていないようです。

さらに次元が増えた場合も同様となるはずですが、まだ実験できていません。
Dart Collections -- maps, lists,queues, sets

##Collectionsとは
objectを格納するAPI
- maps
- lists
- queues
- sets
の四つがdartには用意されている

##maps
keyとvalueを持っており,keyによって検索も可能。keyはユニークでなければならなく、nullを持つことはできないがどんなオブジェクトも代入可能

```dart:map
var gifts = {
  // Key:    Value
  'first': 'partridge',
  'second': 'turtledoves',
  'fifth': 'golden rings'
};
```

##lists
順番があり、indexから検索、追加、削除が可能

```dart:lists
var fruits = ['apples', 'oranges', 'bananas'];
fruits[0]; // apples
fruits.add('pears');
fruits.length == 4;
fruits.where((f) => f.startsWith('a')).toList();
```

##queues
queuesはlistsと同じく順番があり、最初と最後に追加もしくは削除ができる。しかしindexがないため真ん中の要素は触ることができない

```dart:queues
//import 'dart:collection';

var workOrders = new Queue();
workOrders.addFirst('B23432');//{B23432}
workOrders.addFirst('J78424');//{J78424, B23432}
var order = workOrders.removeFirst();
//order:J78424 wordOrders:{B23432}
workOrders.addLast('Z94093');//{B23432, Z94093}
workOrders.removeLast();//{B23432}
```

##sets
要素の順序はないが、要素は必ず被らなく同じものは入ることができない
要素の順序は必要ないが、要素は必ず被らないので、同じものを入れたくない時に使う

```dart:sets
main() {
  var emails = new Set();
  emails.add('bob@example.com');
  emails.add('john@example.com');
  emails.add('bob@example.com');
  emails.length == 2;
  print(emails); //{bob@example.com, john@example.com}
  var otherEmails = new Set();
  otherEmails.add('bob@example.com');
  otherEmails.add('joe@example.com');
  var inBoth = emails.intersection(otherEmails);
  print(inBoth);// {bob@example.com}
}
```
同じオブジェクトが飛んできても何も起こらない
とにかくカッコいいWebデザインを簡単に作るためのTipsとアイデア集

# アイデアやテクニック集
かっこよく、見やすく、それでいて簡単に！
気が向いた時にゆっくり目を通しておくと、デザイン考える時に便利ですね。

## テクニック集
まずはこんな事できるっていうのを頭に入れておくとよいかと。

[事例から学ぶ！Webアニメーションのテクニックまとめ](https://techacademy.jp/magazine/12912)

[これぞプロのデザインテクニック！UIデザインの印象がよくなるデザインの知識とテクニックのまとめ](https://coliss.com/articles/build-websites/operation/design/cheat-codes-for-designing-user-interfaces.html)

[最近のWebサイトで使われてる、UI要素をデザインするテクニックのまとめ -Little UI Details by Steve Schoger](https://coliss.com/articles/build-websites/operation/design/little-ui-details-by-steve-schoger.html)

## カッコいいサイト集
細かいパーツがわかったら、完成品を見るのが良いですね。

[アニメーションのきれいなWebサイト10選](https://boel.jp/tips/vol85_animation_web.html)

[2017 Webデザイン・UIトレンド10選](https://boel.jp/tips/vol69_webtrend2017.html)

[UI/UXが優れている！2016年オススメのWebサイト・アプリ9選](https://ferret-plus.com/5373)

# 実装する時のTips集

ライブラリを使えるならその方が早いし、なければサンプルコードを組み合わせたりして作る感じがいいですね。

## ライブラリ等

### まとめ系

[ウェブデザイナーが試したい、Webアニメーション無料プラグイン＆ライブラリ75個まとめ【保存版】](http://photoshopvip.net/103543)

[CSSアニメーションを簡単に実装できるライブラリ 10＋](https://www.nxworld.net/services-resource/css-animation-libraries.html)

### 個別で気になるライブラリ

[Bootstrap](https://getbootstrap.com/) 
レスポンシブデザインが簡単にできる、Githubで２番めに人気らしいフレームワーク。NASAも使ってるそうな。
Bootstrap4がなかなかいいらしい。-> [Bootstrap 4が全然盛り上がってないから試した → 思ったより良かった](https://qiita.com/suguruguruguru/items/20fe111ee5a2f694ed3e)

[Bootstrap-Vue](https://bootstrap-vue.js.org/)
モダンな環境でやるなら、これも良さそう。コンポーネント指向を理解して、Bootstrapのクラスとか書くのが面倒な人向け？

[Materialize](http://materializecss.com/) 
マテリアルデザイン。まだベータらしい。

[anime.js](http://animejs.com/)
割りと有名？CSSライクでデザイナでも扱いやすいそうな。

[Animate.css](https://daneden.github.io/animate.css/)
ちょっとした動きを付けるのに。軽そう？

[SPIRIT](https://spiritapp.io/)
公式ページのサンプルは可愛くてワクワクします。有償だそう。

## CSSだけで実装するパターン
CSSだけで動かしたり見た目を良くするパターンです。
本当に思った動きがしたいなら、自分でコーディングするっきゃないですね。

[ここまで動かせる！楽しいcss アニメーションのサンプル集](http://commte.net/blog/archives/5082)

[【2017年版】HTML/CSSで表現できる、すごいテキストエフェクト66選](http://photoshopvip.net/97946)

[CSSアニメーションは確実に進化している！キーフレームを使ったCSSアニメーションの実装ポイントまとめ](https://coliss.com/articles/build-websites/operation/css/how-to-use-css-animations-by-ibrahim.html)

[使える！CSSアニメーション 20選](https://lab.sonicmoov.com/markup/css/css-animation-20/)

[CSS Filtersはアニメーションで使うのがお勧め！](https://ics.media/entry/15393)

## WordPressなら

最近自分が使ってるテーマとプラグインはこれ。

[Simplicity](https://wp-simplicity.com/)
たくさんのことが設定画面でできちゃう多機能型の国産無料テーマ。
奥さん、ついでに流行りのAMP対応もできちゃいます。
ただし、手動でインストールする必要がある！…と言ってもZipを落として自分のサイトでインポートするだけ。
カスタマイズする場合は、子テーマを作ってカスタマイズすると良いそーです。

~~[Page Builder by SiteOrigin](https://siteorigin.com/page-builder/)~~
~~見やすくてかっこよくてレスポンシブな固定ページが、UI操作で簡単に作れるプラグイン~~
→ 最近のワードプレスはブロックエディタになったので、不要かと。

[Roots](https://roots.io/)
デザイン部分ではなく、技術的な部分ですが、
モダンな技術でWordpressを開発したいなら、こちら。
テーマ開発にYarnやらLaravel Mixが使えて、ワン・コマンドでローカルサーバーやらHMRやら色々準備してくれます。

# おわり

新しいのが見つかったら、時々更新していきます。
AWSにおけるSSL証明書の概要がわかる記事へのリンク

AWS公式
[Classic Load Balancer の SSL 証明書の置き換え](https://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/classic/elb-update-ssl-cert.html)

非公式
[【初心者向け】ELBにSSL証明書をインストールする](https://dev.classmethod.jp/cloud/aws/aws-beginner-elb-ssl/)
[AWSに適切なSSL証明書の購入を考える](https://dev.classmethod.jp/cloud/aws-ssl-certificate/)
Android タスクがKillされた状態を作る

開発時には以外に気づかない、というか意識していないといった事もあると思います。
リリース後、バグとして上がってくる謎のエラー。。。
なぜシングルトンのデータが吹っ飛ぶのか。。。
もしかしたらタスクがKillされる事によって発生しているかもしれません。

# タスクKillってどういう状態か？
公式サイトにのっているのですが、
Android OSの判断でメモリ開放するためにタスクを破棄するという動作が標準搭載されています。
※個人的にタスクKillと呼んでいる
その破棄された状態でアプリを起動すると、復旧する際にシングルトンで持っていたデータなどMemory毎破棄されてしまうため、NullPointerException等様々な問題が発生します。
※作りによっては上手く復旧できる場合あり

そう。。。
復旧なのです。。。
アプリが初回から始まるといった事は無く復旧。。。

詳細は本家へ！
https://developer.android.com/guide/components/tasks-and-back-stack.html
> 注: バックグラウンドには複数のタスクを一度に置くことができます。しかし、ユーザーが多数のバックグラウンド タスクを同時に実行すると、システムがメモリを回復するためにバックグラウンド アクティビティを破棄する場合があります。その結果、アクティビティの状態は失われます。アクティビティの状態セクションをご覧ください。

# タスクがKillされた状態を作り出すとなにが良いのか？
単純にいえば時短です！
メモリ解放するタイミングがOS依存なので、色々なアプリを立ち上げて、
Killされたかな？？Killされたかな？？ってやる必要があります。。。
※他にも良い方法があるかもしれませんが、私は以前上の動作で対応していました。。

# Kill状態を作り出すには
Killはプログラムで操作できた。。。
下記を埋め込めばKillできます。
※adbとかでもあるかもですが

```kotlin:MainActivity.kt
val am = getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager
am.killBackgroundProcesses("ここにKillしたいアプリのpackageを入れる")
```
なので、特定のアプリタスクをKillするアプリを別で作って簡単にテストが行えるようにしました。

# 対処方法
対処方法って書きましたが、結局か。。といった内容です。

既存アプリの状態が不明であれば、各画面単位でKillして発生ベースでエラー対応を行い、
まず落ちなくする事が最優先かと！
※設計が不明等よくあるので、調査よりKillしてTry And Errorが以外にはやい！

開発する際は初期の設計段階でタスクKillがある事を踏まえていたほうが良い。
ポイントとして、画面遷移のI/Oは明確に決めておいた方が良い
ActivityのIntentやFragmentのBundleはKillでは消えない！
最低限上記を対応する事で、復旧時にリソースを作り直す事になりそうだが、エラーでクラッシュよりは良いかと。

公式サイトに載っていますが、onSaveInstanceStateという物を使って必要なリソースを残しておく手段も良いです。
ただ、たくさんのデータを保存すると、エラーになったりしてしまうのでその点は要注意！
※詳細は本家に！w
※このバグにはまって苦労した。。。
https://developer.android.com/about/versions/nougat/android-7.0-changes.html
> その他の重要事項
> 多くのプラットフォーム API は、Binder トランザクションで送信される大きなペイロードをチェックし、暗黙的にログ記録したり、削除したりするのではなく TransactionTooLargeExceptions を RuntimeExceptions として再度スローするようになりました。一般的な例としては、Activity.onSaveInstanceState() で大量のデータを格納することです。これにより、アプリが Android 7.0 をターゲットにしている場合は、ActivityThread.StopInfo で RuntimeException がスローされます。
#MMD4Mecanimを使ってMMDモデルをfbxファイルに変換する方法

MMDモデルをダウンロードしてみたものの、普段Unityで使っているfbxデータとして利用できなかったのでその変換方法をメモがてら書いていきます。

こちらの記事を参考にさせていただきました。→https://qiita.com/hiroyuki_hon/items/931c79164b0ffe19517f

##使用するもの
- Unity
- MMD4Mecanim
- MMDモデル

今回はKizunaAiモデル(http://kizunaai.com/download-page/)
を使わせていただきます


##UnityにMMDモデルをインポート
MMDモデル(http://kizunaai.com/download-page/)
Zip形式になっているので、しっかりと展開しておきましょう。
すると以下のような画面になっているかと思います。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/242611/5ac9ef74-a78a-40be-be0f-38adee22773a.png)
しかし、今のままではUnity内で3Dモデルを扱うことができません。
MMDデータは拡張子がPMXになっているので、これをUnity内で使うFBXに変えていきましょう。

##MMD4Mecanimをダウンロードして使う
次に、以下のサイトからMMD4Mecanimをダウンロードします。(http://stereoarts.jp)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/242611/766f7727-cb99-2f68-a2b7-9b3b531ecf41.png)

すると画像の矢印のように、(モデル名).MMD4Mecanim.assetが追加されているはずです。
こちらをクリックしましょう。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/242611/12dcce2a-ec0e-bad5-9422-8cae4e540e19.png)
すると利用規約が出てくるので、3つのチェックをつけて同意ボタンを押します。

自分の場合、いつもチェックボックスがでてこないのですが、もしチェックボックスがない場合は一度Unityを終了させましょう。
すると出てくるはずです。

次の画面に変わります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/242611/4d5f0a9a-9828-9262-5590-ca84d790a082.png)
PMX/PMDの部分にPMXモデルがアタッチされいることを確認し、Processをクリックします。

すると黒い画面が出てきて物凄い勢いでコードが実行されていきますが、焦らずにゆっくり待ちましょう。

しばらくするとFBXデータに変換されていることに気づくかと思います。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/242611/d8d5b6e0-abb4-e2bd-0fc4-6aa8e28b13be.png)

後は今まで通り使えるのでこれをシーンにドロップすれば、、
![image.png](https://qiita-image-store.s3.amazonaws.com/0/242611/a0ac7090-b680-7557-5027-6c01628e4868.png)
完了です。

お疲れ様でした。

今回はMMD4Mecanimを使ってMMDモデルをUnityで使えるところまでを簡単にまとめましたが、詳しい説明はチュートリアルの方に書いてあるのでそちらを参考にしてみてください。
http://stereoarts.jp/
Jenkins Pipelineでエラーをメール通知する

## 概要
Jobエラーをメール通知する方法を調べたのでメモしておく。

## ファイル構成

```:ファイル構成
├ script
│  └ mail.groovy
└ Jenkinsfile
```

## 通知メソッド作成
外部ファイルに分離してメソッドを定義します。

```groovy:script/mail.groovy
/**
 * メール通知
 *
 */
// メールをGmailに送信する
def send(result) {
    mail to: "hoge@example.com",
        subject: "${env.JOB_NAME} #${env.BUILD_NUMBER} [${result}]",
        body: "Build URL: ${env.BUILD_URL}.\n\n"
}
return this
```

## Jenkinsfile作成
テストシナリオを作成する。

```groovy:Jenkinsfile
#!/usr/bin/env groovy

pipeline {
    agent any
    stages {
        stage('fail') {
            error('Fail')
        }
    }
    post {
        failure {
            mail = load "${pwd()}/script/mail.groovy"
            mail.send(currentBuild.currentResult)
        }
    }
}
```
Jenkins PipelineでSlackへ通知する

## 概要
Jenkins PipelineでエラーをSlackに通知したかったので調べた内容をメモしておきます。

## ファイル構成

```:ファイル構成
├ script
│  └ slack.groovy
└ Jenkinsfile
```

## slackメソッド作成
外部ファイルに分離してメソッドを定義します。

```groovy:script/slack.groovy
/**
 * Slack通知
 *
 */
def post(color, message) {
    def slack_channel = "#jenkins"
    def slack_domain  = "hoge-inc"
    def slack_icon    = ""
    def detail_link   = "(<${env.BUILD_URL}|Open>)"
    def slack_msg     = "job ${env.JOB_NAME}[No.${env.BUILD_NUMBER}] was test ${currentBuild.result}. ${detail_link} \n\n ${message}"

    withCredentials([string(credentialsId: 'slack', variable: 'Token')]) {
        slackSend channel: "${slack_channel}", color: "${color}", message: "${slack_msg}", teamDomain: "${slack_domain}", token: "${Token}"
    }
}
return this
```

## Jenkinsfile作成
テストシナリオを作成する。

```groovy:Jenkinsfile
#!/usr/bin/env groovy

pipeline {
    agent any
    stages {
        stage('run1') {
            steps {
                slack = load "${pwd()}/script/slack.groovy"
                slack.post('good', 'credential test.')
            }
        }
    }
}
```

## 参考サイト
* [pipelineで秘匿したい文字列を扱う](https://qiita.com/MugMog/items/634b0bce6c462f54f801)
RubyでCSVファイルを読み込むときのエラー処理パターン

CSVファイルに予期しないデータが入っていて、読み込むプログラムがエラーになることはよくある。
そんなとき、エラーになった行番号が表示されると調査が楽になるので、以下のように書くのをパターン化するといいかもしれない。

```rb
require "csv"

filename = "hoge.csv"

CSV.foreach(filename).with_index(1) do |row, lineno|
  begin
    # 本処理
    puts row[0].gsub("a", "b")
  rescue
    # 元の例外にメッセージを付加して投げ直す
    raise $!, "#{filename} の #{lineno} 行目を処理中にエラーが発生しました。\n#{$!.message}", $!.backtrace
  end
end
```
win10のvim8でwakatimeを動かす

# 概要
動かなかったので、とりあえず動くようにしました。改良版は考え中。

2018.03.15 追記
仕様変更で動かなくなったので、現在調査中…。

# 環境
- vim 8.0.1389
- python
- dein

# dein

起動が遅いので、lazy設定を行いました。

```:dein_lazy.toml
[[plugins]]
repo = 'wakatime/vim-wakatime'
on_idle = 1
```

# ソース書換え

deinでlazyしている為、repoのファイルを修正しました。

ファイル

```
~\.cache\dein\repos\github.com\wakatime\vim-wakatime\plugin\wakatime.vim
```


```:wakatime.vim

" 設定後、0に強制上書き
let s:has_async = 0

" 設定後、空白に強制上書き
let extra_heartbeats = ''

```
VMWare Workstation > ゲストOS間でコピー・ペーストができないときの復旧方法 (2018-03-15)

```txt:動作環境
VMWare Workstation 14 Pro v14.1.1 (以下VMWare)
ゲストOS A: Windows 7 Pro(32bit)
ゲストOS B: Windows 8.1 Pro(64bit)
```

- VMWareにて2つのウィンドウを立ち上げる
- それぞれのウィンドウで別のOSを起動する
- ゲストOS間のコピー・ペーストが下図の状況でできないとする


![](http://yuml.me/diagram/class/[OS A ]-o->[OS B], [OS B]-x->[OS A])

対処は以下の通りではあるが、どちらのOSの再起動が必要か?
[vmware > ホストとゲスト間のコピーができない > vmxファイルの書き直し > isolation.tools.copy.disable = "FALSE"などをファイルの最終行に持っていく](https://qiita.com/7of9/items/7facd5aa07497b53a2ec)

答え: OS A

OS再起動後にDropboxによるHDD 100% Usage問題がなければ、再起動のコストは低くなるのだが。。。
「 GCP Cloud Datalab」と「Cloud Translate API」を使ってみたよ

#前置き
昨今Kaggleの問題を解こうにも計算量が半端なく必要で、MacBookAirが燃えそうになっておりました。
そんで分析環境をクラウド上に持たないと、やばいと思っておりました。

そこで、「Cloud Datalab」さん登場です。

『データの探索、分析、可視化と機械学習のための使いやすいインタラクティブなツール』だそうです。

https://cloud.google.com/datalab/?hl=ja

#なぜGCPか
特に理由はないのですが、下記のGoogleの**AIの民主化**みたいな考え方とか
やっぱAmazonよりGoogleじゃね？？みたいな適当な理由からです。

https://cloud-ja.googleblog.com/2018/01/cloud-automl-making-ai-accessible-every-business.html
#Datalabの起動
GCPのアカウントがあることは前提です。

####1.プロジェクトを作りましょう
![スクリーンショット 2018-03-15 12.54.22.png](https://qiita-image-store.s3.amazonaws.com/0/242700/a5530445-a79a-ec45-44fc-77b665258ee4.png)


![スクリーンショット 2018-03-15 12.54.48.png](https://qiita-image-store.s3.amazonaws.com/0/242700/14ef3443-1750-dcb4-86ce-e27f327a5324.png)

####2.APIを有効にしましょう
下記の3つのAPIを有効にしておきましょう。
・Google Compute Engine API
・Cloud Translation API
・Cloud Source Repositories API

![スクリーンショット 2018-03-15 12.57.37.png](https://qiita-image-store.s3.amazonaws.com/0/242700/64e7c42f-0395-735a-3348-e8a239d3b3ff.png)

検索して「有効にする」を押せばOKです。
![スクリーンショット 2018-03-15 13.00.07.png](https://qiita-image-store.s3.amazonaws.com/0/242700/2cbbd458-6b51-631c-77eb-7942cd2475bd.png)


####3.Cloud Shellからプロジェクトを作成しインスタンスを作成しましょう
Cloud Shellから以下のコマンドを叩きます。
![スクリーンショット 2018-03-15 13.51.53.png](https://qiita-image-store.s3.amazonaws.com/0/242700/456f0f77-242f-65f8-f807-12e4ff06968a.png)


作成したプロジェクトを使うようにgcloudツールの設定
```$ gcloud config set core/project [project-id]
```

ゾーンの選択
```$ gcloud config set compute/zone [zone]
```
日本なら「asia-northeast1」かと。

datalabを動かすインスタンスの作成
```$ datalab create [VM-instance-name]
```

途中passphraseを聞かれますが、こちらはGoogleのアカウントに紐付くpassphraseです。

###**※注意**
結構時間かかります。


####4.Datalabを立ち上げましょう
一度ポートを8081に変更しプレビューで開いてから下記で開きましょう。
http://localhost:8081/
![スクリーンショット 2018-03-15 13.21.50.png](https://qiita-image-store.s3.amazonaws.com/0/242700/54624a2a-bf99-9395-c9d5-eafb27c4ef4c.png)

全体の流れはこちら
https://cloud.google.com/datalab/docs/quickstarts
（Google様のオフィシャルです。）

#Cloud Translate APIを使おう

####1.NoteBookを新しく立ち上げます
![スクリーンショット 2018-03-15 13.21.50.png](https://qiita-image-store.s3.amazonaws.com/0/242700/dd283791-96c7-8eab-4610-ad39d9ed4a16.png)

####2.以下のサンプルコードから実行
![スクリーンショット 2018-03-15 13.25.00.png](https://qiita-image-store.s3.amazonaws.com/0/242700/546b217a-b0dd-3851-4f5a-9888cde8d84b.png)

実行は「Shift　+Enter」です。

https://github.com/GoogleCloudPlatform/python-docs-samples/blob/master/translate/cloud-client/quickstart.py
（Googleのオフィシャルサンプルコードです）

####3.やったね!!!
結果が出力されました!!


![スクリーンショット 2018-03-15 13.24.50.png](https://qiita-image-store.s3.amazonaws.com/0/242700/98fb72f8-e7aa-4855-7455-541dc18fdbb8.png)

#おわりに
超簡単です。
しかし、Google先生がなにをオープンにしているのかわからないくらい色々とオープンになっておりまして、もはやオープン過ぎて困るレベルですね...
Googleで働くとわかるんでしょうか...
特定のキャンバスサイズでできるだけファイルサイズが大きいpng画像を生成する

## 経緯
- 複数画像アップロード機能の上限値テストにて、画像サイズが600x500固定でできるだけファイルサイズが大きいpngファイルが必要になった。

## plan
- 圧縮しにくいように、1ピクセルごとに異なる色で塗りつぶせばファイルサイズが増えるのでは？

## do
- canvasを使用。

```html
<canvas id="canvas" width="600" height="500"></canvas>
<script>
  const canvas = document.getElementById("canvas");
  const context = canvas.getContext('2d');

  init = () => {
    for (let i=0; i<600; i++) {
      for (let j=0; j<500; j++) {
        drawRect(i, j, 1, 1);
      }
    }
  }

  drawRect = (x, y, width, height) => {
    context.fillStyle = 'rgba(' + x % 255 + ',' + y % 255 + ', ' + Math.floor( Math.random() * 255 ) + ', ' + Math.random() + ' )';
    context.fillRect(x, y, width, height);
  }

  init();

</script>
```

## 結果
- 約1MBのpngファイルができました。
 - 種類: PNG
 - 横幅 x 縦幅: 600px × 500px
 - ファイサイズ: 979,712byte
ゼロから作るDeep Learning 学習備忘録 第3章ニューラルネットワーク

# ニューラルネットワーク
バイアスを明示的にし、結果を出力する際に活性化関数を用意する。
活性化関数は非線形関数を用いる必要がある。線形関数を用いると中間層がなくなるネットワークができてしまうため


```
a = b + w1*x1 + w2*x2
のとき
y = h(a)
hを活性化関数と呼ぶ
```
分類問題と回帰問題に使える。どの問題に使うかで活性化関数が変わる。

## 分類問題
データがどのクラスに存在するか。人の画像から男か女か判断する

## 回帰問題
データの予測

# 活性化関数

## ステップ関数
入力が0を超えたら1 それ以外は0 矩形波みたいになる。

```
def step_function(x):
    if x > 0:
        return 1
    else:
        return 0
```

## シグモイド関数
xが無限に近くにつれ、1に近い値を出力し、0に近くと0に近い値を出力する。
h(x) = 1 / 1 + exp(-x)

```
import numpy as np

def sigmoid(x)
    return 1 / (1 + np.exp(-x))
```

# 行列の積
多次元配列 - 行列 - に対して積をとっていく。
weight に対して注意することは、
```
w * x = c
```
のとき
wの列数と、xの行数を一致しないと積をとることはできない。出力cは、w行数、xの列数の行列となる。
numpyでは、Numpy.dotを使う。

# 実装例
forward : 入力から出力方向への伝達処理のこと
identity_function : 出力層の活性化関数として利用。恒等関数と言う。

```
import numpy as np

def sigmoid(x):
    return 1 / (1 + np.exp(-x))

def identity_function(x):
    return x

def init_network():
    network = {}
    network['W1'] = np.array([
        [0.1, 0.3, 0.5],
        [0.2, 0.4, 0.6]
    ])
    network['b1'] = np.array([0.1, 0.2, 0.3])

    network['W2'] = np.array([
        [0.1, 0.4],
        [0.2, 0.5],
        [0.3, 0.6]
    ])
    network['b2'] = np.array([0.1, 0.2])

    network['W3'] = np.array([
        [0.1, 0.3],
        [0.2, 0.4]
    ])
    network['b3'] = np.array([0.1, 0.2])

    return network

def forward(network, x):
    W1, W2, W3 = network['W1'], network['W2'], network['W3']
    b1, b2, b3 = network['b1'], network['b2'], network['b3']

    a1 = np.dot(x, W1) + b1
    z1 = sigmoid(a1)
    a2 = np.dot(z1, W2) + b2
    z2 = sigmoid(a2)
    a3 = np.dot(z2, W3) + b3
    y  = identity_function(a3)

    return y

network = init_network()
x = np.array([1.0, 0.5])
y = forward(network, x)
print(y)

```

# 出力層の設計
## 活性化関数を利用する際の注意事項
回帰問題 : 恒等関数
分類問題 : ソフトマックス関数

## 恒等関数
入力をそのまま出力にする。

## ソフトマックス関数
全ての入力信号から影響を受ける値を出力する。
0 .. 1 の間に出力が収まる。確率として解釈が可能。
cは階乗する際にオーバーフローを発生させない対策
```
import numpy as np
def softmax(a):
    c = np.max(a)
    exp_a = np.exp(a - c)
    sum_exp_a = np.sum(exp_a)
    y = exp_a / sum_exp_a
    return y
```

## 出力層のニューロンの数
解くべき問題に応じて、決定する必要がある。
0 .. 9 の手書き文字の認識では、10個の出力ニューロンを用意する。
Laravel入門

# Laravel入門

以下の記事にしたがってLaravelプログラムを動かしてみます。

ここでは、開発環境を構築しなくても、ブラウザだけで開発できる[PaizaCloud Cloud IDE](https://paiza.cloud/ja/)を使って
LaravelでHello Worldアプリを作ってみます。

手順の詳細は、以下の記事の通りですので、詳しくは[こちら](http://paiza.hatenablog.com/entry/2018/02/16/paizacloud_laravel)を参照ください。

[Laravel入門: 初心者でも10分でWebサービスを作れる！PHPフレームワークLaravelとPaizaCloudの使い方](http://paiza.hatenablog.com/entry/2018/02/16/paizacloud_laravel)

## PaizaCloudでのサーバ構築
[PaizaCloud](https://paiza.cloud/ja/)にサインアップして、サーバを作成します。
サーバ作成時には、MySQLもチェックしておきます。

https://paiza.cloud/ja/

## アプリケーション作成

以下のコマンドでアプリケーションを作成します。

```
$ laravel new myapp
```

## サーバ起動

以下のようなコマンドで、サーバを起動してみます。地球アイコンの8000と書かれたボタンがポップアップしますので、クリックするとブラウザが起動します。

```
$ cd myapp
$ php artisan serve
```

## ファイル編集

welcomeファイル(myapp/resources/view/welcome.blade.php)を書き換えれば、表示が変わります。
Hello Worldなどと入れてみましょう。

## 完成

以上で、完成です。この記事ではここまでですが、モデルなどを使ったサンプルは以下の記事にあります。

[Laravel入門: 初心者でも10分でWebサービスを作れる！PHPフレームワークLaravelとPaizaCloudの使い方](http://paiza.hatenablog.com/entry/2018/02/16/paizacloud_laravel)
Windows > link > Windows デバイスコンソール Devcon.exe > デバイスマネージャ上での操作を実行

```txt:動作環境
Windows 7 Pro(32bit)
```

[Windows デバイス コンソール (Devcon.exe)](https://msdn.microsoft.com/ja-jp/library/windows/hardware/ff544707(v=vs.85).aspx)

> DevCon を使って、デバイスの有効化、無効化、インストール、構成、削除を行うことができます。

以下は一部抜粋。

> Windows ドライバー開発者とテスト担当者は、DevCon を使って、適切な INF ファイル、ドライバー スタック、ドライバー ファイル、ドライバー パッケージを含め、ドライバーが正しくインストールおよび構成されていることを確かめることができます。

...

[デバイス コンソール (DevCon.exe) の例](https://msdn.microsoft.com/ja-jp/library/windows/hardware/ff544746(v=vs.85).aspx)


### 用途

具体的には以下のような状況で使った。

- 外部デバイスの調子が悪くUSB接続がときどき切れる症状が見られた
- 接続が切れた場合、デバイスマネージャーでのUSB関連の無効化と有効化をしないと接続が復旧しない
- 復旧処理を自動化したい
- devcon.exeの実行は開発したWinソフトから実施
Resharperのデフォルトのキーボードショートカット（一部）

サムライズムさんのハンズオンに参加したときに、JetBrainsのツールはキーボードショートカットが充実しているので、知っているとかなり便利なことを知りました。
そこで、Resharperで使えそうなので、そのときにいただいたレジュメをもとに、私が使いたいものをピックアップしました。
なお、ほかのデフォルトのショートカットはヘルプの[Default Keyboard Shortcut Schemes](https://www.jetbrains.com/help/resharper/Reference__Keyboard_Shortcuts.html)から見られます。このページの表にあるAliasを使うと、Visual Studioのオプションからキーの割り当てを変更できます。
また、ここで示しているショートカットはキーボードスキームをVisual Studioにした場合です（オプションのKeyboard&Menusから選べます）。


# 検索
空気を読むは検索というよりはアクションリストの選択といった方が良いかもしれません。
基本はCtrl+Tでしょうか。

|説明|内容|ShortCut(VS)|
|:---|:---|:---|
|空気を読む|エラーなどがあるとその対応を一覧から選ぶ|Alt+Enter|
|どこでも検索|時間はかかりますが、なんでも検索できる|Ctrl+T|
|シンボル検索|クラス名やフィールドなどのシンボルで検索|Ctrl+Alt+T|
|ファイルメンバーの検索|開いているファイルのメンバーのみ検索|Alt+\|

# ナビゲーション（移動）
F12を中心にする移動とAltと組み合わせたPgetUp,DownとHome,Endの移動を中心にピックアップしました。
F12はファンクションキーの一番最後なので覚えやすいですね。

|説明|内容|ShortCut(VS)|
|:---|:---|:---|
|1つ前のファイル|Resharperの機能ではなくVSのIDE Navigatorを使用。Tabを続けて押すことで移動|Ctrl+tab|
|定義へ|メソッド等が呼ばれているところから、定義へ。|F12|
|実装へ|InterfaceやAbstractクラスで、実装されているクラスへ遷移する|Ctrl+F12|
|利用箇所一覧|シンボルが使用されている箇所の一覧をポップアップする|Shit+Alt+F12|
|次のエラー箇所へ|問題のある箇所への移動。オリジナルではこれがF12|Alt+PageDown|
|前のエラー箇所へ|問題のある箇所への移動|Alt+PageUp|
|継承元へ|ベースクラスへ移動します|Alt+Home|
|継承先へ|派生クラスへ移動します|Alt+End|
|戻る|移動した場合に元へ戻る|Ctrl+-|
|進む|戻るのキャンセル|Ctrl+Shit+-|

# 編集・補完
補完の決定時にTabを押すと後を置き換えますが、Enterだと決定となります。

|説明|内容|ShortCut(VS)|
|:---|:---|:---|
|新規ファイル|新規でファイルを作る|Ctrl+N|
|コード補完|コードの補完|Ctrl+Space|
|スマートコード補完|型からさらに絞り込み|Ctrl+Alt+Space|
|選択範囲の拡大|選択範囲を拡大する|Ctrl+Alt+Right|
|選択範囲の縮小|選択範囲を縮小する|Ctrl+Alt+Left|
|コード整形|コードを整形する|Ctrl+Alt+Enter|
|文の完結|いい感じに文を終わらせてくれる|Ctrl+Shift+Enter|
|パラメータを見る|メソッド等のパラメーターの型情報などをポップアップする|Ctrl+Shift+Space|
|直近の編集箇所へ|編集箇所をたどる|Ctrl+Shift+Backspace|

# コード生成・リファクタ

|説明|内容|ShortCut(VS)|
|:---|:---|:---|
|Code Generate|コード生成機能のポップアップを出す|Alt+Insert|
|リファクタリングを選ぶ|リファクタリングポップアップから選択|Ctrl+Shift+R|
|リネーム|名前の変更を安全に行う|Ctrl+R,R|
|変数の抽出|式を変数に代入する|Ctrl+R,V|
|メソッドの抽出|一部のコードをメソッドにする|Ctrl+R,M|
メモ：ECSとCloudwatch LogsでRailsを運用するログ設定

この記事は
===

* ECSとCloudwatch logsでRailsを運用する場合のメモです

やりたいこと
===

* ECSからCloudwatch Logsに対してRailsのログを出力します
* Cloudwatch Logsに記録されたログは最低限tailしたり、エディタで参照したり、grepしたり、従来通りのログ調査だとかができるようにしたいです

ECSの設定
===

* 事前にCloudwatch Logsのgroupを作成しておきます
* ECSからCloudwatch Logsにログを送出する設定を入れます
* 具体的にはECSのタスク定義のところに下記のように書きます

```
{
...
  "containerDefinitions": [
    {
...
      "logConfiguration": {
        "logDriver": "awslogs",
        "options": {
          "awslogs-group": "xxx-log",
          "awslogs-region": "ap-northeast-1"
        }
...
      },
```

* この設定により、Dockerコンテナが標準出力した内容がそのままCloudwatch Logsに出力されるようになります

Railsの設定
===

* Railsのログ出力はデフォルトではファイル出力になります
* これを標準出力するように設定します

```ruby:config/environments/production.rb
config.logger = Logger.new(STDOUT)
```

awslogsの導入
===

awslogs?
---

* 上記の内容をデプロイすることで、Cloudwatch LogsにRailsのログが出るようになりますが、そのままだと、切り刻まれたファイルをブラウザからダウンロードする地獄を見る羽目になります
* クライアント側に[awslogs](https://github.com/jorgebastida/awslogs)というcliツールを入れることで、普通にtailぽい感じとか、lessでみたりとかできるようになります

awslogsのインストール
---

* 事前にaws-cliは入れて```aws configure```しておきます
* その上で下記の感じでpipでインストールします

```
pip install awslogs
```

awslogsの使い方
---

### tailっぽく

* tailぽく使いたい場合は下記のようにします
  * ```xxx-log```: ロググループ名
  * ```--aws-region```: リージョン名
  * ```-w```: tailっぽく表示
  * ```-S```: ストリーム情報を表示しない

```
awslogs get xxx-log --aws-region=ap-northeast-1 -w -S
```

### エディタで見る

* エディタで見たい場合は```-w```を取って下記のようにします
  * ```--start```: ログの開始時間（これ以降のログを表示）

```
awslogs get xxx-log --aws-region=ap-northeast-1 -S --start='1 hour' | less
```

* これで普通にlessで見れます
* ちなみに```--start```指定はpythonの[dateutil](https://dateutil.readthedocs.io/en/latest/)というライブラリの記法らしいです

### grepかける

* 上のエディタのケースのlessをgrepにするだけです

```
awslogs get xxx-log --aws-region=ap-northeast-1 -S --start='1 hour' | grep 'xxx'
```

終わりに
===

* これで何かあっても従来の方法で調査できますね

参考
===

https://tech.actindi.net/2017/08/28/rails-cloudwatchlogs.html
Macで複数バージョンのJavaを切り替える

すぐ忘れるので自分用の備忘録。

---

`.bashrc`に以下を仕込む。

```bash:~/.bashrc
export JAVA_HOME=`/usr/libexec/java_home -v "1.8"`
export PATH=$JAVA_HOME:$PATH
```

Java9にするには
`/usr/libexec/java_home -v "9"`
Tinkercad > 手順 > 2つのオブジェクトを連結する

ブラウザ動作するAutoDeskのTinkercad。

Tinkercadは複数のオブジェクトの配置方法が「一致」しかない。
SketchUp Makeと比べてオブジェクトの配置機能が弱い。

2つのオブジェクトを隙間なく連結したい場合の手順を検討した。

1. オブジェクトAを作る
    - 高さ20とする
2. ルーラーを使ってオブジェクトAのZ位置を-20にする
    - `-[オブジェクトAの高さ]`
3. オブジェクトBを作る
    - 高さは任意
4. オブジェクトBに対してdキー(drop)によりZ位置を0にする
5. オブジェクトAとオブジェクトBを「位置合わせ」機能により水平方向の位置を合わせる

下から順番にオブジェクトを配置することで、連結し続けることができる。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/f6dcf4e6-569c-ccc7-c6d5-e108cbd96f2e.png)
【Unity】Update()を使わずにuGUI長押しボタンを実装する

長押しイベントで分かりやすい記事がなかったり、Update()を使う方法の記事しか見つからなかったので、自分で作ってみました。

#概要
ボタンをタップした時と長押しした時でUIの表示が変わるゲームって見かけますよね。それを実装したいと思って調べたのですが、どうやら長押しした時の方法は公式で用意されてないようなので各自工夫する必要があるみたいです。

今回はボタンを押した時にコルーチンを開始して、待機時間終了後にボタンが押されているかどうかのフラグを見て挙動を変える実装にしています。

ちなみにボタンと言ってるのは方便で、コンポーネントはButtonではなく、EventTriggerを用います。また、ScriptからEventTriggerを登録する方法で記載してます。

[サンプルの動画](https://twitter.com/azumagoro/status/974164974435057664)

#コード

```C#:
using System.Collections;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems; //追加を忘れないように！

//長押しを発生させるuGUI(ImageやText)にアタッチして使う
public class EventCtr : MonoBehaviour
{
	//EventTriggerをアタッチしておく
	public EventTrigger _EventTrigger;

	//StopCoroutineのためにCoroutineで宣言しておく
	Coroutine PressCorutine;
	bool isPressDown = false;
	float PressTime = 2f;

	void Awake ()
	{
		//PointerDownイベントの登録
		EventTrigger.Entry pressdown = new EventTrigger.Entry ();
		pressdown.eventID = EventTriggerType.PointerDown; 
		pressdown.callback.AddListener ((data) => PointerDown ());
		_EventTrigger.triggers.Add (pressdown);

		//PointerUpイベントの登録
		EventTrigger.Entry pressup = new EventTrigger.Entry ();
		pressup.eventID = EventTriggerType.PointerUp; 
		pressup.callback.AddListener ((data) => PointerUp ());
		_EventTrigger.triggers.Add (pressup);
	}

	//EventTriggerのPointerDownイベントに登録する処理
	void PointerDown ()
	{
		Debug.Log ("Press Start");
		//連続でタップした時に長押しにならないよう前のCoroutineを止める
		if (PressCorutine != null) {
			StopCoroutine (PressCorutine);
		}
		//StopCoroutineで止められるように予め宣言したCoroutineに代入
		PressCorutine = StartCoroutine (TimeForPointerDown ());
	}

	//長押しコルーチン
	IEnumerator TimeForPointerDown ()
	{
		//プレス開始
		isPressDown = true;

		//待機時間
		yield return new WaitForSeconds (PressTime);

		//押されたままなら長押しの挙動
		if (isPressDown) {
			Debug.Log ("Long Press Done");

			//お好みの長押し時の挙動をここに書く
		}
		//プレス処理終了
		isPressDown = false;
	}

	//EventTriggerのPointerUpイベントに登録する処理
	void PointerUp ()
	{
		if (isPressDown) {
			Debug.Log ("Short Press Done");
			isPressDown = false;

			//お好みの短押し時の挙動をここに書く(無い場合は書かなくても良い)

		} 
		Debug.Log ("Press End");
	}
}
```

#ログ
```
//長押しして離した場合
Press Start
Long Press Done
Press End

//短押し（タップorクリック）した場合
Press Start
Short Press Done
Press End
```

もし参考になった場合はいいねをお願いします〜

#追記
連続タップで長押し判定にならないよう修正しました。
Androidの制限によると思われるMeshの同時接続数

#Mesh
センサーとBLEがタグと呼ばれるバッケージに封入されており、
・ボタン
・LED
・動き
・人感
・明るさ
・温度/湿度
・GPIO
の種類がある。

#Androidの接続数
ググったところ、AndroidのBluetoothの同時接続数は７個というのがあったので、iPadじゃなくて少し安めのAndroidタブレットで行けるなと思たのだが、いくつか接続してみたところ、下記の接続数だった。

Huawei MediaPad M3 Lite 10 wp : 3
ASUS ASUS ZenPad 10 (Z300M) : 4
Sony Xperia X Perfomance : 6
MediaPadM5 lite : 3 (zincjp様より情報提供いただきました。)

#iPad 
iPad(MP2J2J/A シルバー iPad Wi-Fi 128GB 2017年春モデル)はすべてのタグが接続できた。
Alpine LinuxにBlast+をインストールする

SingularityでalpineベースのBlast+コンテナを作ろうと思ったんですが、ハマったのでメモ。

## Alpine LinuxへBlast+をインストールする手順

### 1. glibcのインストール

Blast+はglibc前提の実装になっているらしく、musl-libcを使うようになっているAlpine Linuxでそのまま実行しようとすると`not found`になります。
そこで、まずはglibcをインストールします。

```
    apk --update --no-cache add --virtual=.build-deps ca-certificates wget
    wget -q -O /etc/apk/keys/sgerrand.rsa.pub https://raw.githubusercontent.com/sgerrand/alpine-pkg-glibc/master/sgerrand.rsa.pub
    wget https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.27-r0/glibc-2.27-r0.apk
    wget https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.27-r0/glibc-bin-2.27-r0.apk
    apk --no-cache add -v glibc-2.27-r0.apk
    apk --no-cache add -v glibc-bin-2.27-r0.apk
```

### 2. Blast+のダウンロード

Blast+は、https://ftp.ncbi.nlm.nih.gov/blast/executables/blast+/ からビルド済みのものをダウンロードします。

```
    wget https://ftp.ncbi.nlm.nih.gov/blast/executables/blast+/2.4.0/ncbi-blast-2.4.0+-x64-linux.tar.gz
    tar xfvz ncbi-blast-2.4.0+-x64-linux.tar.gz
    mv ncbi-blast-2.4.0+/bin/* /usr/local/bin/
```
以上の操作で、Alpine Linux上でBlast+が動作するようになります。