OmniAICreator/Qiita-1.07M huggingface dataset:
Google Apps ScriptでHTMLテキストからDOMオブジェクトを生成したいが無理だった

javascriptでよく使う次のようなDOMアクセス。

```js
var x = document.getElementsByClassName("example");
```

GASのUrlfetchで得たContentからDOMオブジェクトを生成して同じように操作がしたい。

# XmlService.parseでやってみる

RSSなどのXML文字列ならXmlService.parseを使って対処できるが、HTMLではXML構文にマッチしないのでエラーが出まくる。
ならばと、なんとかHTMLからXML構造に持っていこうとしたが、

```js
  var r = UrlFetchApp.fetch("https://www.example.com");
  var text = r.getContentText()
  text = text.replace(/<link [\s\S]*?>/g,"");
  text = text.replace(/<meta [\s\S]*?>/g,"");
  text = text.replace(/<img [\s\S]*?>/g,"");
  text = text.replace(/<input [\s\S]*?>/g,"");
  text = text.replace(/<!--[\s\S]*?-->/g,"");
  text = text.replace(/ async/g,"");
  text = text.replace(/ selected/g,"");

  text = text.replace(/&url;/g,"");
  text = text.replace(/&raquo;/g,"");
  text = text.replace(/&nbsp;/g,"");
```
キリがないよ...

# documentクラスでやってみる

テキストのHTMLをDOMに変換する方法として、ググるとよく出てくるのが、空のDIVオブジェクトを作ってそのinnerHTMLを更新する方法。

```js
  var div = document.createElement('div');
  div.innerHTML = contentText;
```

うん、でも、サーバーサイドのjavascriptだから動かないね。

# DOMを諦めて正規表現で対象となる部分を抽出

```js
  var r = UrlFetchApp.fetch("https://www.example.jp");
  var text = r.getContentText()
  var res = text.match(/<li class="hogehoge">[\s\S]*?<\/li>/g);
```

でも汎用性ないねぇ。。。誰かいい方法を知りませんか。
MetabaseからAmazon Auroraにアクセスしてみた

Metabaseのアクセス先にMySQLとか書いてあったので、Aurora接続もできるだろうと思って勉強がてら試してみました。

# Metabaseとは
ベタですが、[公式ページ](https://www.metabase.com/)が一番わかりやすいっす。

# Auroraの準備
デフォルトの設定でとりあえず作成します。

1. Publicアクセスさせたかったので（色々考えるの面倒）、Publicアクセスの設定
2. お金ないのでMulti AZはなしん設定

というあたりはデフォルトと変えた感じ。それでサクッと用意しました。

![スクリーンショット 2018-01-06 21.41.00.png](https://qiita-image-store.s3.amazonaws.com/0/102769/518a1108-600c-9ab7-726a-633168a674cf.png)

# Auroraにデータを投入

こちらのページを参考に、DBとテーブルの作成など諸々行いました。

[Amazon RDS for Aurora を試してみた](https://tech.recruit-mp.co.jp/infrastructure/amazon-rds-for-aurora-preview/)

ここで紹介されている郵便データに関してですが、時間が経ったためか実際のカラムの並び順などが変わっていたので、そういう点だけ変更してあとは上記のページのまま進めます。（ありがたや）

```sql
mysql> CREATE TABLE zipcode_list (
    -> zipcode varchar(10),
    -> prefecture varchar(255),
    -> city varchar(255),
    -> street varchar(255),
    -> prefecture_kana varchar(255),
    -> city_kana varchar(255),
    -> street_kana varchar(255)
    -> ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.38 sec)
```

データ投入もすんなり行きました。

```sh
$ mysqlimport --local --compress --user=root --password --host=xxxxxxxx.xxxxxxxxx.us-east-1.rds.amazonaws.com --fields-terminated-by=',' --fields-enclosed-by='"' --lines-terminated-by='\r\n' -d metabase ./zipcode_list.csv
Enter password: 
metabase.zipcode_list: Records: 124117  Deleted: 0  Skipped: 0  Warnings: 0 
```

# Metabaseを起動する
今回はJavaで起動しました。

```sh
$ java jar metabase.jar 
```

起動したら、`localhost:3000`でアクセスできます。で、諸々画面に従って設定をしますが、MySQLベースの設定をします。

|Name|Value|
|:---|:---|
|Database|MySQL|
|URL|Auroraのエンドポイント|
|Port|3306|

![スクリーンショット 2018-01-06 21.27.43.png](https://qiita-image-store.s3.amazonaws.com/0/102769/63be5cb7-e087-9e12-f836-a049d2529d75.png)

すると無事繋がって、普通に作成したデータベースが表示されました。（予想通りでした）


データも何か欠損しているわけではなく、投入分がしっかり反映されています。

![スクリーンショット 2018-01-06 21.29.02.png](https://qiita-image-store.s3.amazonaws.com/0/102769/43b53e33-47e0-e264-23aa-198ee727baf0.png)

# まとめ
予想通り、Auroraは問題なくつなぐことができました。一応GithubのIssueではDynamoDBやAthenaへの対応の要望も出ているので、少し待てばどんどん対応されるんじゃないでしょうか。個人的にはMetabaseの操作性が抜群にいいので、Athenaのクライアントとして使ってみたいと思っています。

# おまけ
操作性が抜群にいいですねこれ。

例えば一覧でデータを表示した後に

![スクリーンショット 2018-01-06 21.29.29.png](https://qiita-image-store.s3.amazonaws.com/0/102769/427b5621-266f-249f-1cd3-ed34b748d20e.png)

絞り込みたい対象のカラムをクリックすると、その値で絞り込めるようになってる。

![スクリーンショット 2018-01-06 21.31.50.png](https://qiita-image-store.s3.amazonaws.com/0/102769/03fa07d4-7059-f149-408d-50844d6d16c7.png)

まだ試してませんが、Pulseとかも使ってみたいですね。
pyenv+pyenv-virtualenv+MacOSX環境下でmatplotlib.pyplotが使用できない問題の対応策

修正すべきファイルがある場所を探します。

```.sh
$ python -c "import matplotlib;print(matplotlib.matplotlib_fname())"
/path/to/matplotlibrc
```

matplotlibrcというファイルの`backend`というパラメータを弄ります。

```/path/to/matplotlibrc
backend : macosx
```

となっているところを、以下のように書き換えるだけです。

```
backend : Tkagg
```
Ubuntu 16.10にPyTorchを導入してみた

#前置き
- 学生時代から「単語は知ってるけど、どういうものなのかは具体的には知らない」ものが多い
- 少しでも「言葉だけ知っている」ものを減らしたい
- というか主に経験を増やしたいなと思っている
- 主に自分へのメモ & 周囲への確認のために投稿する
 <br>(環境構築はよく手順を忘れるので備忘録としても)
- 特にテーマは無い、気になったものを随時勉強する感じで
- 間違い／改善指摘があれば突っ込んでくれたら嬉しかったりする

#今回の目的
使っていなかったノートパソコンにUbuntuを入れたので、
Pythonでプログラミングができるように環境を整える。

せっかくなので、最近Hotな「でぃーぷらーにんぐ」を実行できる環境も構築したい。

TensorFlowとかchainerとか、どのパッケージが良いか考えてたけど
PyTorchが一番スッキリしている&Github上で伸び盛り？という話を聞いたので
PyTorchを導入することにした。

#Python環境構築
- pyenvの導入

```sh
$ git clone https://github.com/yyuu/pyenv.git ~/.pyenv
```

- pyenvのPATHを通す

".profile"に以下を追記する。
(本当は".bash_profile"にしたいが、作成してもログイン時に読まれないため.profileに記述 →現状原因不明)

```sh:.profile
#pyenv
export PYENV_ROOT=$HOME/.pyenv
export PATH=$PYENV_ROOT/bin:$PATH
eval "$(pyenv init -)"
```

- 最新のAnacondaバージョンを確認

```sh
$ pyenv install -l | grep anaconda3
```

- Anacondaインストール (2017-01-05時点では ver 5.0.1が最新だった)

```sh
$ pyenv install anaconda3-5.0.1
```

- AnacondaのPATHを通す

".profile"に以下を追記する。
(本当は".bash_profile"にしたいが、...同上)

```sh:.profile
#Anaconda
export PATH="$PYENV_ROOT/versions/anaconda3-5.0.1/bin:$PATH"
```

#PyTorch環境構築
公式HP (http://pytorch.org) のTopで自身の環境を指定すると、
それに応じたインストールコマンドが指定される

今回は Python3.6 + GPU無しのノートパソコンなので

```sh
$ conda install pytorch torchvision -c pytorch
```

を実行、おわり。
Pytorchの導入はすごく簡単だった。

とりあえず、最初のチュートリアル (http://pytorch.org/tutorials/beginner/blitz/tensor_tutorial.html) は
実行できたので、環境構築は問題なく出来たと信じたい。

#最後に
Python (+ PyTorch)の環境構築が完了した。
PyTorchについてはチュートリアル進めつつ、まずはMNISTのサンプルを実行・動作確認したい。

それ以外だと、

- 学生時代から会社に入ってもよく聞くFilter系(主にKalman Filter)とか
- ベイズの定理くらいしか知らないよ！なベイズ関係
<br>(どこから手を付けたら良いのか分からないけど…ベイズ推定?)
- 機械学習を基礎から勉強し直す

とかしたい。

まぁ一番の課題は、月曜日が明けると長期連休が終わっちゃうので
そのタイミングでやる気を無くして終わってしまわないことだけど。
ローカルネットワーク内でsshするための設定

自分が調べたことのメモ, ほぼどこかへのリンク.

# やろうとしたこと
* 家のローカルネットワーク内に繋がれている以下の機器間でsshでログインする
    * Raspberry Pi
    * Ubuntu 16.04
    * Mac

# 使用しているWi-Fiルーター 
* Buffalo WSR-300HP/N
    * はじめssh出来るようにするにはルータの設定が必要かと思ったがそうではなかった

# Raspberry Piの設定
* [SSH (Secure Shell)](https://www.raspberrypi.org/documentation/remote-access/ssh/) (英語. Raspberry Pi 公式)
    * qiitaで調べたものはうまくいかなったものが多かった

```
    1. Enter sudo raspi-config in a terminal window
    2. Select Interfacing Options
    3. Navigate to and select SSH
    4. Choose Yes
    5. Select Ok
    6. Choose Finish
```

* 上記の設定で, Ubuntu/Mac -> Raspberry Piへのsshのログインが可能になった

# Macの設定
* [リモートコンピュータに Mac へのアクセスを許可する](https://support.apple.com/ja-jp/guide/mac-help/mchlp1066/mac)
* 上記の設定でUbuntu/Raspberry Pi -> Macへのsshのログインが可能になった.

# Ubuntuの設定
* [Ubuntuでsshdの設定をしてリモートから接続できるようにする](http://d.hatena.ne.jp/Fiore/20080228/1204174833)
* 今のところうまく行ってない, うーむ
Haskell・Servant+Persistent/Esqueletoで作る実用WebAPI (番外編・1) Haskellで作ってみるアプリの題材は？

# はじめに
シリーズ記事が10本目まで出来たので、ポエムを1本書きます。
テーマは「Haskellで作ってみるアプリの題材は？」です。

# 実用アプリの狙い目としての「WebAPI」
関数型言語に興味ができたとして「Haskellにトライしてみようかな？」と思ったとしましょう。他の方も書かれていますが、実際にコードを書いてみないとHaskellのすごさは実感できないと思います。せっかく時間や労力をかけてコードを書くであれば、実用アプリを作った方がいいのでは?と個人的には思います。

実用アプリを作るとはいっても、やりたいことによってはHaskellでできるかどうかはわかりづらいでしょう。その点でいくと、WebAPIというのは非常にお手頃なテーマかと思います。

- 必要な入出力がはっきりしている（RDB、Webインターフェース）
- WebAPIフレームワークが用意されている（Servant, Persistent/Esqueleto）
- 必要な実装内容は（そこまで複雑ではない）データ処理だけ
- APIハンドラ実装は、純粋関数というようりアクションがメインになるので、関数型言語特有のハードルが（ちょっとだけ）低い

実は、WebAPIを実装し始めたころは、「WebAPIなんてRDBの中身をちょこっと加工して出したりするだけなのに、Haskellでやるというのも大げさか？」と思ったりしたのですが、機能が増えていくに従ってコードはどんどん大きくなっていったのでした。

# Haskellで実装して（気持ち的に）得たもの

趣味や業務で様々なプログラミング言語で数々のプログラムを30年以上作ってきましたが、Haskellをやってみて**初めて**実感したことがあります。

- 機能を実装した時に、一発動作する確率が異常に高い
- 「一から作り直したい」という気持ちが出ない

一つ目の話は、既に多くのHaskellerが語っている「ビルドが通った時点で、既に多くのテストを通った状態」というやつですね。これまでは「簡単なプログラムであっても、実装しただけで一発動作することなんて千か万にひとつかな」と思っていました。ところがHaskellだと、RDBを操作するアプリであるにも関わらず「ビルドが通ると『まず動く』」ですからね。この違いはでかいです。もちろん、最初のうちは「ビルドを通す」というところに行くまでのハードルが高かったのですが。

二つ目の話も、これも既に語られている話ですが、Haskellは「リファクタリングのハードルが非常に低い」です。これまでの経験だと「ここのテーブル定義はこうしたい」とか「データ構造や関数インターフェースはこうした方が」と思うことがあっても、その修正にトライするための（心理的な、あるいは工数的な）ハードルが高く、リファクタリングをしないことも多いです。最初のうちはそれでよくても、無理をしていくと歪みも大きくなっていくので、「どうせなら一から作り直したい」と思うシーンは必ず出ます。HaskellでWebAPIを実装するにあたって、リファクタリングをしても、それによるバグの発生はほとんどなかったため、相当の数のリファクタリングを行いました。リファクタリングの時に発生する修正作業は、コンパイラ（のエラーメッセージ）が全て教えてくれるので、頭を使う時間が短く、結果としてエディタを操作している時間が長くなり、左の小指をちょっと痛めてしまったくらい、でした（Emacs使いなもので）。

# Haskellで実装して（運用的に）得たもの
ここの話は、本題の記事で書く予定ですが、Haskell（Servant+Persistent/Esqueleto）で実装したおかげで、下記の管理が不要になりました。

- RDBのテーブル定義
- APIハンドラではない定期タスク

なお、UI側がElmであれば「APIインタフェースの型情報の共有」というメリットも得られたでしょう。

# もちろん課題もありますが

今回、実装したWebAPIについての技術課題は、概ね解決していますが、他の方の実装では別の課題が出ることもあるでしょう。正直、PHP等と比べると情報は非常に少ないでしょうが、そのデメリットを考えても差し引きプラスにもっていけるポテンシャルはあるのではないかと思っています。足りないノウハウは、積み重ねをしていけば、どうにか...ね。

# まとめ

どの技術でもそうですが、話だけをいくら聞いても意味がないので、こういった能書きの話も単体ではあまり意味はないのですが、Haskellにトライするひとつのきっかけになれば、と思います。

次のポエムは本題の方が20本目になったら書こうかな、という予定です。
リアルタイムで投稿時間からの経過時間を表示　livestamp.jsの使い方（ios対応）

#概要
RubyOnRailsでツイッターのような投稿サイトを作るときに、投稿時間からの経過時間を表示する機能を実装したいと考えやり方調べた。
ライブラリなどを使わずにデータベースに投稿時間を問い合わせて、現在時刻を引くことで、実装することは出来るが、この方法の場合、ページを更新しないと経過時間も更新されず、実態との差異が生じてしまう。

そのため、今回はlivestamp.jsというライブラリを使用してとことん簡単に実装した。

#環境
Ruby2.2.4
Rails 5.1.4

#手順
##1. 必要なライブラリの取得
今回は、ライブラリをダウンロードせずに、CDNで取得する。
必要なライブラリは、`jquery.js`、`moment.js`、`livestamp.js`の3つ。

```html:application.html.erb
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.20.1/moment.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/livestamp/1.1.0/livestamp.js"></script>
```
Memo：記載する順番に注意！
moment.jsはjquery.jsに依存し、livestamp.jsはmoment.jsに依存しているので上記の順番で記載しないとエラーが出る。

##2．投稿表示画面の編集
経過時間を表示したい場所に、以下を追記する。
`data-livestamp=""`に投稿時間を取得すれば、現在時刻から何分前に投稿されたかを計算してくれる。

```index.html.erb
<span data-livestamp="<%=post.created_at%>"></span>
```

以上

#感想
非常に簡単にリアルタイムの表示を実装することができた。
ただ、時間を表示するだけでなく、1分以内なら"a few seconds ago"と表示するなど凝った作りになっているのもすごい。

#追記！！！（iosで時間が表示されない問題について）
この機能を実装して友人に自慢したら、iosだと時間が表示されない問題が発覚した。（私はandroidユーザーなので気が付かなかった。）
iphoneでもwebアプリが使えるようにchromeのデベロッパーツールでプレビューしているが、それは仮想的に画面サイズを変えているだけなので、実際の挙動とは異なることを痛感した。

いろいろ試した結果、解決策が見つかったので追記します。
##解決法
問題の原因はDATEのデータのフォーマットがrailsのデフォルトのフォーマットではiosが対応していていないことであった。
railsのデフォルトでは```2018-01-16 14:09:45 UTC```というフォーマットで日付が「-」（ハイフン）で区切られている。しかし、iosでは-での区切りに対応していなく「/」で区切るフォーマットに変換しなくてはいけない。
そこで、上記のコードで投稿時間を取得していた```post.created_at```に変換するコードを追記し、```post.updated_at.strftime("%Y/%m/%d %H:%M %Z")```にすれば、正常に表示されるようになった。
KotlinのDefferedめも

自分用のメモです。

---

Dartのasync/awaitくらいにシンプルだったらいいのに、なんか妙に複雑そうにみえるKotlinの非同期処理まわり。
とりあえず少しだけ読み解く。

## ベースのインターフェース

### Job

https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.experimental/-job/index.html

外からはStartとCancelができて、
内部的には

* 開始前
* 実行中
* 完了
* キャンセル

の状態があるもの。


### Continuation

https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.coroutines.experimental/-continuation/index.html

内部的な状態変化のための
resumeとresumeWithExceptionというメソッドだけを規定したインターフェース

## 派生インターフェース

### CancellableContinuation

https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.experimental/-cancellable-continuation/index.html

単なる、cancelができるContinuationかな？

### Deffered

https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.experimental/-deferred/

Continuationは継承してない。
外からawaitが叩ける。awaitの返り値は、suspend関数


## Defferedをつくるには

### async

https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.experimental/async.html

ブロック内に書いた処理がDefferedになる。

のだけど、async関数では以下のようなコールバック関数のDeffered化はできない。

```
private Task<Response> getCurrentUser() {
  final TaskCompletionSource<Response> tcs = new TaskCompletionSource<>();
  
  apiService.getCurrentUser().enqueue(new Callback() {
    @Override
    public void onSuccess(Response response) {
      tcs.setResult(response);
    }
    
    @Override
    public void onError(Error error) {
      tcs.setError(error.asException());
    }
  });
  
  return tcs.getTask();
}

```

### suspendCoroutine

ちょうどTaskCompletionSourceとかPromise的な使い方ができるのは suspendCoroutine関数みたいだ。

https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.coroutines.experimental/suspend-coroutine.html


合ってるか知らんけど、こんな感じの定義になる↓

```
suspend fun getCurrentUser() = suspendCoroutine<Response> { continuation ->
  apiService.getCurrentUser().enqueue(object: Callback() {
    override fun onSuccess(Response response) {
      continuation.resume(response);
    }
    
    override fun onError(Error error) {
      continuation.resumeWithException(error.asException());
    }
  })
}

```


## まとめ

とりあえず `suspendCoroutine` で非同期タスクを定義して、 `async` でタスクをまとめたりするみたい。
【英語学習者向】シンプルな英語で書かれたwikipediaの技術系記事を読もう！

#シンプルな英語で技術系のwikipediaを読もう！
[シンプル英語版ウィキペディア](https://simple.wikipedia.org/wiki/Main_Page)とは、簡単な英語で記事が書かれたwikipediaです。知っている技術や興味のある技術の記事を読むことで、英語を読む訓練をすることができます。

## 対象者
* 英語を学習している人
* 難しい単語やイディオムは分からないが、簡単な文章を読める人
* 英語に慣れていない人

## シンプル英語版ウィキペディアとは？
簡単にいうと、英語学習者向けに簡単な単語とイディオムで記載されたwikipediaのこととです。
以下、wikipediaより引用。[シンプル英語版ウィキペディア
](https://ja.wikipedia.org/wiki/%E3%82%B7%E3%83%B3%E3%83%97%E3%83%AB%E8%8B%B1%E8%AA%9E%E7%89%88%E3%82%A6%E3%82%A3%E3%82%AD%E3%83%9A%E3%83%87%E3%82%A3%E3%82%A2)
>シンプル英語版ウィキペディア（シンプルえいごばんウィキペディア、Simple English Wikipedia）は、フリー百科事典「ウィキペディア」の英語版であり、基本的にベーシック英語とスペシャル・イングリッシュで執筆されている[1]。このサイトは、「学生や子供、学習障害にある成人など通常とは違うニーズを持った人々、または英語を学習中の人」向けの百科事典たることを目的としている[2]。2013年7月10日の時点で、記事数は107,824本、登録済み利用者は10万を超える。

## オススメ記事
技術系の記事が沢山ありますが、私が読んでおすすめしたい記事をいくつか紹介します。
まだ読み始めたばかりなのであまりご紹介できませんが、随時追加したいと思います。

* [Java (programming language) 
](https://simple.wikipedia.org/wiki/Java_(programming_language))
  * 自分が使い慣れている言語の記事を読むのもおおすすめです。 
* [Internet](https://simple.wikipedia.org/wiki/Internet) 
  * 基礎的な技術はシンプル英語版でも記述量が多いです。 
* [Google](https://simple.wikipedia.org/wiki/Google)
* [Computer](https://simple.wikipedia.org/wiki/Computer)
  * コンピュータの歴史とかとか
Mediawikiを構築したのにセッションのエラーで自分でログインできないとき

どうも、はまったので書きます。

Mediawikiをさっそく設定・構築完了し、はじめに作成した自分のアカウントでログインしようとすると、以下のようなメッセージが出ました。

>ログインのセッションに問題が発生しました。 セッション乗っ取りを防ぐため、操作を取り消しました。 前のページへ戻って再度読み込んだ後に、もう一度試してください。

ブラウザのクッキーを消してみたり、phpが動作するサーバーの`/var/lib/php5/sessions`のパーミッションを変更しましたが、それでもうまく動きません。そこで出会ったのが以下のページでした。

https://www.mediawiki.org/wiki/Topic:T7irqyk4rhfy3ohk

ようするに、`LocalSettings.php`の`$wgMainCacheType`を以下のように変更すればいいみたいです。

```php:LocalSettings.php
$wgMainCacheType = CACHE_ACCEL; //これを

$wgMainCacheType = CACHE_ANYTHING; //こうする
```

これでやっと動きました。一安心…。
ちなみに原因を調べてみたところ、セッションとクッキーをAPCuでキャッシュする関係でこうなったみたいです。
KivyのVideoで再生終了のイベント取得

#はじめに
Kivyを使用する機会があったので投稿

#やったこと
動画の再生終了後、別の動画を再生したいため再生終了イベントを取得したかった。
最初に、Kivyのドキュメントにあった以下を試したものの
うまくいかない。

video.bind(duration=callback)

そこでon_eosを取れないかどうかやってみた

video.bind(eos=callback)

どうやらこれでイベントは取得できた。
ファイルの変更、追加、削除を監視するgem

Rubyで特定のディレクトリ配下のファイルの変更を監視したいときに使えるgemが"listen"。
https://github.com/guard/listen

ファイルを監視して特定のタスクを走らせるguardというgemが有名だが、その内部で使われている。
MacOS,Linux,BSD系,Windowsに対応している。

# 使い方

listenのインストール。普通のgemと同様。Gemfileに `gem 'listen', '~> 3.0'`と書いて`bundle`を実行。

サンプルコード

```rb:listen_sample.rb
require 'listen'

listener = Listen.to('dir1', 'dir2') do |modified, added, removed|
  puts "modified absolute path: #{modified}"
  puts "added absolute path: #{added}"
  puts "removed absolute path: #{removed}"
end
listener.start # not blocking
sleep
```

これを実行して、別のターミナルでdir1やdir2の配下にファイルを作ってみる。

```shell
touch dir1/hoge
```

すると、listenを実行している方のターミナルに

```text
modified absolute path: []
added absolute path: ["/Users/murase/sandbox/listen_rb/dir1/hoge"]
removed absolute path: []
```

と表示される。
またファイルに書き込みをすると（`echo "foobar" >> dir1/hoge`を実行)、

```text
modified absolute path: ["/Users/murase/sandbox/listen_rb/dir1/hoge"]
added absolute path: []
removed absolute path: []
```

と表示される。

多くの場合はGuardを使えばことは足りると思うが、より柔軟に制御したい場合は"listen"を単体で使うと良いかもしれない。
TrelloのAPIを活用してプロダクトバックログを管理しやすくしようと調べてみました。

# Trello、便利ですよね！

タスク管理ツール、Trello。
アジャイル開発におけるカンバンとして、あるいはチームのタスクと状況の見える化ツールとして、活用されている方も多いと思います。
私自身も、仕事において複数のボードを使いつつ、さらには個人タスクの管理にも利用しています。
拡張機能も色々とあり、カスタマイズしてより便利に活用できますよね！

# Trelloをスクラム開発で使う場合に困ったこと

スクラム開発において、プロダクトバックログを定義し、それをTrelloボードにおけるカードとして登録し、開発を進めています。
ただし、そこで迷うことがありました。定義したプロダクトバックログとカードの行き来の仕方です。

- プロダクトバックログ　⇒　カード
  - ユーザーストーリーマッピングなどの手法で洗い出したプロダクトバックログをカードに１つ１つ登録するのは大変。かつ、バックログの粒度や優先順位について、リスト上では構造的に把握しずらい。
- カード　⇒　プロダクトバックログ
  - ボード毎にjsonやExcelファイルでエクスポートすることはできます。ですが、特定の項目のみとなり、カスタム項目については相互変換することができません。

# 実現したいカタチ

プロダクトバックログ　⇔　Trello　にて、それぞれの役割で担う要素、項目について
相互で取得できる状態であること。かつ、相互のマージに人力の手間が極力かからないこと。

もう少し細かく書くと、

- Trelloだけでプロダクトバックログの管理はつらい
- 外部で作成したものを取り出して、自動でカード登録できないか？
   - ただし、外部の方が正本でメンテナンスをそこでするだけ、であればTrelloを使う意味がない
- 初回は外部からカードに登録が楽にできて、その後カードをメンテしつつ開発を進め、状況・結果をきちんと外部に反映できる形で取得できる、というのがしあわせになれそう

# APIでどこまでできるのか、調べてみた。

実現したいことがどのように実現できるかを調べてみたところ、
APIが公開されていたので、試してみました。

## API実行用のキーとトークンを発行
https://trello.com/app-key にて apikey / token を発行する。

## 色々試してみる。
https://developers.trello.com/reference/
ここに丁寧なリファレンスがあり、実際に試すこともできます。
ユーザーIDをスタートとして、ボードID、リストID、カードIDを取得して
色々な処理要求が行えます。

- ボード一覧取得
  - https://trello.com/1/members/(自分のusername)/boards?key=(key)&token=(token)&fields=name
  - ボード名とボードIDを取得可能

- メンバー一覧取得
  - https://trello.com/1/boards/(ボードID)/members?key=(key)&token=(token)
  - ボード参加者のIDと名前が取得可能

- ボードのリスト一覧取得
  - https://trello.com/1/boards/(ボードID)/lists?key=(key)&token=(token)&fields=name"
  - リスト名とID一覧が取得可能
  
- カード登録
  - https://api.trello.com/1/cards?name=test&desc=test&pos=top&dueComplete=false&idList=(作成先リストID)&idLabels=&key=(key)&token=(token)
  - 上記は例。いろいろな項目を設定して登録可能。
 
- 既存のカードの情報の取得
  - 基本項目
     - listsでとれる
     - チェックリストは　https://api.trello.com/1/cards/id/checklists　で詳細取得可能
  - 添付ファイル
     - listsで有無はわかる
     - https://api.trello.com/1/cards/id/attachments で詳細取得可能
  - カスタム要素
     - https://api.trello.com/1/cards/id/pluginData　で可能
  
# ここまでのまとめ

- APIを使うことで簡単にカードの登録や更新ができる
- Pythonなどでツールを作成することで
  - 外部で作成したもの（例：CSVファイルなどの構造体）より、ボードへの一括登録が可能。
  - 項目のマージも可能（作りこめば）
- ただし、API実行には、先にボードやリストを作成し、そのIDに対して実行が必要

ということで、管理項目や運用フローが定まっていれば、
Import / Export　ツールを作ることで実現したいカタチに近づけられそうです。
Arduino Nano互換ボードでLEDライトを光らせてみた。


秋葉原のLED専門店でLEDライトとArduino Nano互換機を買いました。
LEDテープは100Vのものを買うと電源から取らないといけない。
モバイルバッテリーから動かしたかったので5Vのものを購入。
ICがついてるタイプである必要もある。
NeoPixel RGBを買いました。
Jumper wiresはオスオスのん。

![IMG_0515.jpg](https://qiita-image-store.s3.amazonaws.com/0/64334/2e233b6a-379e-c25d-5388-c62c7d42ad8d.jpeg)


# 必要なもの一覧

– Arduino Nano
– Jumper wires
– Breadboard
– WS2812B-based LED strip 

# IDEをインストール

Arduino Software (IDE) on OS X
https://www.arduino.cc/en/Guide/MacOSX

# 繋げる

<img width="834" alt="スクリーンショット 2018-01-06 22.33.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/64334/1a98bd9b-09a8-6e3b-ea6f-f0c486fcdf68.png">

![IMG_0516.jpg](https://qiita-image-store.s3.amazonaws.com/0/64334/f75c0b0f-b420-5d96-567c-e0beb54ca420.jpeg)



# コード
この通りやれば良い

https://www.mschoeffler.de/2017/08/24/how-to-control-an-led-pixel-strip-ws2812b-with-an-arduino-and-the-fastled-library/



```arduino:
#include "FastLED.h"
#define DATA_PIN 3
#define LED_TYPE WS2812B
#define COLOR_ORDER GRB
#define NUM_LEDS 30
#define BRIGHTNESS 96
CRGB leds[NUM_LEDS];
void setup() {
  delay(3000); // initial delay of a few seconds is recommended
  FastLED.addLeds<LED_TYPE,DATA_PIN,COLOR_ORDER>(leds, NUM_LEDS).setCorrection(TypicalLEDStrip); // initializes LED strip
  FastLED.setBrightness(BRIGHTNESS);// global brightness
}
...
略
```

# ライブラリをインストール

<img width="647" alt="スクリーンショット 2018-01-06 22.19.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/64334/7047f63b-4f67-7cf7-e8da-6cc2b80f3ab2.png">

<img width="804" alt="スクリーンショット 2018-01-06 22.19.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/64334/fa2370b4-a251-d004-24a1-677782ba67ff.png">

# コンパイル

<img width="496" alt="スクリーンショット 2018-01-06 22.19.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/64334/2f2ce35e-ce49-6155-f0a2-ad533ad7004d.png">

# マイコンボードに書き込む

<img width="497" alt="スクリーンショット 2018-01-06 22.23.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/64334/7d379141-3b0c-7cc9-7c96-e6a7f1bead98.png">

光るはず。

# ブチって電源抜いて終了
みんなのGo言語学習メモ

http://gihyo.jp/book/2016/978-4-7741-8392-3
みんなのGo言語を学習した際のメモ
随時更新予定

---

第1章Goによるチーム開発のはじめ方とコードを書く上での心得
===

1.1 開発環境の構築
---
https://github.com/motemen/gore
GoでREPLといえばgoreとのこと
(2018/04/13)
下記に分割しました。

* みんGo学習メモ〜コード補完もできるREPL「gore」を使ってみた  
https://qiita.com/Ken2mer/items/94301d04d65c82088c60

$GOPATH管理
https://github.com/motemen/ghq
リポジトリ間の移動
https://github.com/peco/peco
利用例：
`$ cd $(ghq list --full-path | peco)`
`$ godoc $(ghq list | peco) | less`

リリースビルド版のインストール
https://github.com/Songmu/ghg

1.2 エディタと開発環境
---
goimports
https://godoc.org/golang.org/x/tools/cmd/goimports
goimports高速化
https://github.com/monochromegane/dragon-imports

1.3 Goをはじめる
---
A Tour of Goを繰り返しやってみる
・以前できなかったExerciseができるようになっていたり、新たな発見があるかも

testdataや_で始まるディレクトリは、Goのパッケージとみなされない

依存管理
https://github.com/Masterminds/glide
利用例：
```go test $(glide novendor)```

タスクランナーとしてMakefileを使う
・タスクが複雑になりそうな場合は、スクリプトにまとめる
・_toolsディレクトリに配置し、タスクからそのスクリプトを呼び出す

1.4 Goらしいコードを書く
---
Effective Go
https://golang.org/doc/effective_go.html

stringsパッケージ
https://godoc.org/strings

regexp.Compile
https://godoc.org/regexp#Compile
regexp.MustCompile
https://godoc.org/regexp#MustCompile

可能な限りstructでtypeを宣言する
・typoをコンパイル時に検出できる
・メソッドを追加できる

mapへのアクセス時には排他制御に気をつける
・複数のgoroutineから同時にアクセスした場合など

sync.RWMutex
https://godoc.org/sync#RWMutex

巨大なstructを作らない。継承させようとしない
・再利用可能な小さな部品を組み合わせてデータ構造を定義する

runtime.NumGoroutine
https://godoc.org/runtime#NumGoroutine
runtime.ReadMemStats
https://godoc.org/runtime#ReadMemStats

各種メトリクス取得
https://github.com/fukata/golang-stats-api-handler

---

第2章マルチプラットフォームで動作する社内ツールのつくり方
2.1 Goで社内ツールをつくる理由
2.2 守るべき暗黙のルール
2.3 TUIもWindowsで動かしたい
2.4 OS固有の処理への対応
2.5 がんばるよりもまわりのツールに頼る
2.6 シングルバイナリにこだわる
2.7 Windowsアプリケーションの作成
2.8 設定ファイルの取り扱い
2.9 社内ツールのその先に

第3章実用的なアプリケーションを作るために
3.1 はじめに
3.2 バージョン管理
3.3 効率的なI/O処理
3.4 乱数を扱う
3.5 人間が扱いやすい形式の数値
3.6 Goから外部コマンドを実行する
3.7 タイムアウトする
3.8 シグナルを扱う
3.9 goroutineの停止

第4章コマンドラインツールを作る
4.1 なぜGoでCLIツールを書くのか?
4.2 デザイン
4.3 flagパッケージ
4.4 サブコマンドを持ったCLIツール
4.5 使いやすく，メンテナンスしやすいツール

第5章The Dark Arts Of Reflection
5.1 動的な型の判別
5.2 reflect パッケージ
5.3 reflect の利用例
5.4 reflect のパフォーマンスとまとめ

第6章Goのテストに関するツールセット
6.1 Goにおけるテストのあり方
6.2 testingパッケージ入門
6.3 ベンチマーク入門
6.4 テストの実践的なテクニック
RaspberryPi3とGrovePi+のインストール

記事作成のきっかけ。

NoobsのイメージでインストールしたRaspbianだと、GrovePiが認識できず、
OSの起動で止まってしまうという状況にハマってしまったため。

基本的な手順はここにあるとおりです。
https://www.dexterindustries.com/GrovePi/get-started-with-the-grovepi/

準備
起動用マイクロSDカードを別に用意する。(Raspbian for Robotsを書き込むためのもの）

1. [ここ](https://www.dexterindustries.com/howto/install-raspbian-for-robots-image-on-an-sd-card/) から　Raspbian for Robots をダウンロードして、SDカードに書き込み。
2. SDカードに書き込んだら、boot/command.txtを編集
    3. hdmi_force_hotplug=1
    4. config_hdmi_boost=4
5. Raspberry piにSDカードを差し込んで起動
6. ネットワーク環境を設定
7. sudo apt-get update
8. sudo apt-get upgrade
9. sudo curl -kL dexterindustries.com/update_grovepi | bash
10. sudo reboot
11. 起動が確認できたら sudo shutdown -h now
12. Grove PiをRaspberry Piにつけて起動する
13. sudo i2cdetect -y 1
    14. 00:行 4列目が 04であれば認識しています。
15. cd ~/Dexter/GrovePi/Firmware
16. sudo ./firmware_update.sh
17. sudo shutdown -h now
18. cd ~/Dexter/GrovePi/Troubleshooting
19. sudo ./all_tests.sh
    20. 最後にChecking for firmware version 1.2.7 ...と出力されていればOK.
15. sudo raspi-config #追記 /が100%になってしまったので、ディスク拡張しないといけなかった
    16. 7 Advanced Options
    17. A1 Expand Filesystem Ensures ...


何が足りなくてRaspbianが止まったのか正確に理解できないですが、
Dexterのイメージであれば正常に認識しました。
windowsのコンソールアプリの引数に"（ダブルクォーテーション）を渡す方法

# 文書の目的
* rscriptの引数にJSONを渡したいが、"(ダブルクォーテーション、二重引用符)が入っていても消えてしまう
* いろいろブログを見たが解決しなかったので、同様の環境の人もいると思い今回の解決策を書いておく

# 解決策
* "を\\\"に替える
* 例  rscript script.r "neko":123,"inu":234   →   rscript script.r \\\"neko\\\":123,\\\"inu\\\":234

* プログラムで呼ぶ場合
```var exePath = "rscript";
var args = "script.r \\\\\\\"neko\\\\\\\"inu\\\\\\\":234";
//7個も必要だぜー
```

# 私の環境ではうまくいかなかった例
* "で全体をくくって中で\"とする
    * http://d.hatena.ne.jp/yu-hr/20100318/1268851171
swiftで自動でアニメーションを始めたいときの注意　viewDidLoad()の中でアニメーションできない

新しい画面を開いたときに、自動でアニメーションが始まるように作った。

animeteを使ってtransformしようとした。
しかし、画面が開かれた瞬間にアニメーションで徐々にtransformされずに、いきなりtransformされた状態が表示される。


http://d.hatena.ne.jp/unk_pizza/20140823/p1
にあるように

viewDidLoad()の中でアニメーション書いたらダメみたい


https://qiita.com/Saayaman/items/37e6dd70c110db5e7396
ここにもそれっぽいことが
Google Cloud Platform(GCP)関連の記事まとめ(随時更新)

自分が今まで投稿したGoogle Cloud Platform(GCP)関連の記事のまとめページ。
投稿した記事を見つけづらくなってきたのでこのページでまとめる。
随時追加予定。

* [Google Cloud Platform(GCP)入門](https://qiita.com/NagaokaKenichi/items/449902074e9994803cb8)

* [Google Compute Engine(GCE)からCloud SQL接続でハマった](https://qiita.com/NagaokaKenichi/items/b54952e977c13f098bf5)

* [Google Cloud Platform(GCP)のCloud IAM](https://qiita.com/NagaokaKenichi/items/02e723511d244c82bd82)

* [Google Cloud FunctionsからSlackへ通知を送る](https://qiita.com/NagaokaKenichi/items/fe2a04bef38bea632621)

* [Google Cloud Launcherを使ってGCP上に2～3分でJenkinsを構築する](https://qiita.com/NagaokaKenichi/items/41ee9d8ba40555eaf2b7)

* [Google Cloud DNSでIPアドレスとドメイン名を紐付ける](https://qiita.com/NagaokaKenichi/items/95052742d40392f3215e)

* [BigQueryでクライアントライブラリを利用してデータをSELECTする](https://qiita.com/NagaokaKenichi/items/e492e87265226fe222b9)

* [PuTTYでGCPのインスタンスにSSH接続する](https://qiita.com/NagaokaKenichi/items/79f82c83a99830e9fd46)

* [GCP上にRabbitMQを構築し管理画面へアクセスする](https://qiita.com/NagaokaKenichi/items/7b5e4a928fde8077d49f)
子供がいることはエンジニアとして不利なのか友達と話し合ってみた

# 文書の目的
最近、エンジニアは自発的に勉強するもんだみたいな記事を読んで、自分は子供がいてあんまり勉強ができてないなと感じたが、それってどうなんだろうと思って、チャットで既婚者3人（女性1人）＋未婚者1人で話し合ってみた。
子供がいて勉強できなくて悩んでいる人がいれば。

# 結論
実際問題、不利にはならないように世の中よくできているなと思った。未婚のエンジニアが高値で雇用されるような世界だったら少子高齢化が加速してしまうので社会の知恵というところもあるのだろう。また、不利になるか有利にできるかは、結局のところ子供がいる、未婚既婚、いろいろ境遇はあれど、その境遇から得た経験を強みにできるかという個人の資質だと感じた。当たり前っちゃ当たり前だけど。

# 議事メモ

- 既婚女性A「まあ仕事にかけられる時間は減りますよね」
- 私「でも就業時間外の仕事や勉強はそんなに生産性が高いわけではないのかも」
- 既婚男性B「ラモスが1時間以上練習しても無駄だから日本人は休めと言っていた」
- 既婚女性A「子育てしている間、夫に負担をかけまいと頑張っていたけど間違っていたかも。結局あまり評価に反映されなかった」
- 独身男性C「僕は業務時間外に作ったアプリが売れたのでやっぱり意味はあると思う。一方で結婚や子供を通して身につく社会性も重要かも。憶測だけど」
- 既婚男性B「今は人を動かせることのほうが重要になっている気がします。それなら能力と魅力があれば女性が時短でできる」
- 既婚男性B「あとビジネス的な要素が絡むなら、いろいろ経験しておいたほうがいい。転職した時の面接官も週末もプログラミングしているような人はつまらないから雇わないといっていた」  
- 既婚男性D「子供から学ぶ事は多い」 
- 既婚男性C「子供が大きくなったら一緒にプログラムすればいいんじゃないかな」
- 私「結局のところ、子供がいるとか独身とか嫁さんが応援してくれるとかいろいろ境遇はあるけど、それを強みとして活かせる人とそうでない人がいるってことか」
SVG で描画する

SVG の描画サンプルです。

![svg_jan0601.png](https://qiita-image-store.s3.amazonaws.com/0/179446/5b2f935f-c916-3e5d-04b4-b3d1816666dc.png)

```html:index.html
<!DOCTYPE HTML>
<html lang="ja">
<head>
<meta http-equiv="Pragma" content="no-cache" />
<meta http-equiv="Cache-Control" content="no-cache" />
<meta http-equiv="CONTENT-TYPE" content="text/html; charset=utf-8" />
<title>SVG</title>
</head>
<body>
<h2>SVG</h2>

<svg width="500" height="400">
<circle cx="100" cy="60" r="50" fill="#e74c3c" stroke=black />
<ellipse cx="100" cy="170" rx="20" ry="40" fill="red" stroke="red" />
<ellipse cx="100" cy="300" rx="60" ry="20" fill="#3498db" stroke="#333333" />
<rect x="200" y="20" width="250" height="80" fill=blue stroke=blue />
<rect x="200" y="120" width="250" height="80" rx="20" ry="20" fill=yellow stroke="#333333" />
<line x1="200" y1="250" x2="350" y2="350" stroke="#333333" />
<line x1="250" y1="250" x2="400" y2="350" stroke=magenta stroke-width="10" />
<line x1="300" y1="250" x2="450" y2="350" stroke="#333333" stroke-width="5" stroke-dasharray="5 10" />
<polyline points="20,180 70,120 120,120 170,180 120,240 70,240" fill="none" stroke=green stroke-width="5" />
<polygon points="0,0 500,0 500,400 0,400" fill="none" stroke=cyan stroke-width="5" />
</svg>

<hr />
version Jan/07/2018 PM 17:14<p />
</body>
</html>
```

svg を外部ファイルにして jQuery で読み込むサンプルです。
[jQuery で SVG ファイルを読み込む](https://qiita.com/ekzemplaro/items/9425180218aa45b73db6)

参考にしたページ
[SVG要素で図形を描画【HTML5 実践編】](http://scene-live.com/page.php?page=28)
ruby 用語集

<h1>まずはじめに</h1>
<p>全体的にあってるか微妙、なのであまり過信しすぎぬようお願いする。<br>それと間違いってるところを発見したり、この情報が足りてないと思ったら、具体的にビスバス指摘していただけるとありがたいっす。<br><br>と言うわけでlet's go</p>


<h1>インスタンス</h1>
<ul>
<li>クラスにぶち込まれたオブジェクトのことを言う</li>
</ul>

<h1>オブジェクト</h1>
![fullsizeoutput_143c.jpeg](https://qiita-image-store.s3.amazonaws.com/0/225368/ea7f1198-e0e6-69af-5f8c-8b116334ef3a.jpeg)
<ul>
<li>文字列オブジェクトや数値オブジェクトなどがある。例えば、上の画像の「"hello world"」が文字列オブジェクト「1.1」が数値オブジェクト</li>
<li>画像のインスタンスもオブジェクトと言える</li>
</ul>


<h1>クラス</h1>
　<ul>
<li>クラスオブジェクトの省略形みたいな奴(多分)</li>
<li>putsとかで色々実行するときに機能を借りられる役目</li>
<li>インスタンスを生み出す奴</li>
<li>組み込みクラスと言う、あらかじめ用意されたクラスもあるけど(string classなど)。「class 」の後ろであれば自由にクラスを定義することもできる</li>
</ul>

<h1>メソッド</h1>
![fullsizeoutput_143c.jpeg](https://qiita-image-store.s3.amazonaws.com/0/225368/ea7f1198-e0e6-69af-5f8c-8b116334ef3a.jpeg)
<ul>
<li>メソッドは、オブジェクトによってつけれるものが決まってる(文字列オブジェクトには「.length」など、数値オブジェクトには「.round」など)</li>
<li>「def」使って作れたりもする</li>
<li>色々とオブジェクトに働きかける奴</li>
</ul>

<h1>インスタンスメソッド</h1>
<ul>
<li>インスタンスに働きかけるメソッドのこと</li>
</ul>

<h1>クラスメソッド</h1>
<ul>
<li>クラスに働きかけるメソッドのこと</li>
</ul>



<h1>レシーバ</h1>
<ul>
<li>メソッドの働きを受けるオブジェクトのこと</li>
</ul>


<h1>変数</h1>
<ul>
<li>「nil = "hello"」のnilの部分のこと</li>
<li>こいつを定義する時は、一文字目を小文字にせなければならない</li>
</ul>

<h1>定数</h1>
<ul>
<li>「Nil = "hello"」のNilの部分のこと</li>
<li>こいつを定義する時は、一文字目を大文字にせなければならない</li>
</ul>

<h1>インスタンス変数</h1>
<ul>
<li>「@」から始まる変数</li>
<li>インスタンスをぶち込んどくと出力してくれる</li>

</ul>
<!--

<h1></h1>
<ul>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
</ul>　
　　
<h1></h1>
<ul>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
</ul>

<h1></h1>
<ul>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
</ul>

<h1></h1>
<ul>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
</ul>

<h1></h1>
<ul>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
</ul>

-->
tracerouteコマンドの動きについて

# 概要
ネットワークのトラブルシューティングの際、必ず使うコマンドの一つ。

http://itpro.nikkeibp.co.jp/article/COLUMN/20100225/344989/
によると

> 通信のあて先となるホスト（サーバーやネットワーク機器など）までの通信経路を表示するコマンドである


# どのIPが出力されるか。
ネットワークが切り替わるタイミング、
つまり経由したレイヤー３のルーター等を経由した時にのみ出力される。
レイヤー２以下、スイッチや、無線LANのアクセスポイントを経由した場合は記録されないので、
レイヤー２以下の経路についてはこのコマンドで直接調べられない。

# 記録されるのは往路のみ。
復路の結果を知りたい場合、対向側から同様にtracerouteを実施してもらう必要がある。

#tracerouteコマンドの仕組み
パケットのTTLを利用している。
TTLはルーターを経由するごとに1づつ減る。
宛先に到達する前にTTLが0になると、[ICMP time exceeded]というメッセージが送られる。
TTLを意図的に小さくしてパケットを送ることで途中経路のルーターの存在を知ることができる。

http://web.mit.edu/freebsd/head/contrib/traceroute/traceroute.c

```
950         for (ttl = first_ttl; ttl <= max_ttl; ++ttl) {
951                 u_int32_t lastaddr = 0;
952                 int gotlastaddr = 0;
953                 int got_there = 0;
954                 int unreachable = 0;
955                 int sentfirst = 0;
956                 int loss;
957 
958                 Printf("%2d ", ttl);
959                 for (probe = 0, loss = 0; probe < nprobes; ++probe) {
960                         register int cc;
961                         struct timeval t1, t2;
962                         register struct ip *ip;
963                         struct outdata outdata;
```
WindowsでAvorionサーバーを実行する方法

Linux(CentOS)で実行する場合には[こちら](https://qiita.com/SkyLaptor/items/d918c4e5c2d74ccd706e)を参照。

## 検証環境
* Windows10 Pro 1709 64bit
* [Avorion](http://store.steampowered.com/app/445220/Avorion/) v0.15.7 日本語化済み

## 自身のSteamIDを取得する
Avorionサーバー実行時に管理者IDとしてSteamIDを指定する必要があるため、事前に取得しておく。

Steamを実行し、"自分の名前"の配下にある"プロフィール"を選択する。
![show_steamprof.jpg](https://qiita-image-store.s3.amazonaws.com/0/97774/2437752a-79ce-ef0d-ed75-f7ef262cb9fc.jpeg)

表示されたページのどこかを右クリックし、"ページのURLをコピーする"を選択する。
![copy_profurl.jpg](https://qiita-image-store.s3.amazonaws.com/0/97774/5dfb8a75-966f-a235-646d-3621783dc3a9.jpeg)

メモ帳などを起動してコピーしたURLを張り付けると、SteamIDを確認することができる。
![check_steamid.jpg](https://qiita-image-store.s3.amazonaws.com/0/97774/520a8ce8-f18c-c13b-ad44-0b64f9e6cb9f.jpeg)


## サーバー環境を用意する
サーバーディレクトリを適当な場所に作成する。ここでは例として、"G:\Games\Avorion" をサーバーディレクトリとして用意しているものとする。

以下のURLからSteamCMDをダウンロードし、"C:\Programs\SteamCMD" などの適当な場所に解凍する※。
https://developer.valvesoftware.com/wiki/SteamCMD#Downloading_SteamCMD

steamcmd.exeのショートカットをサーバーディレクトリの中に作成し、引数に `+login anonymous +force_install_dir <サーバーディレクトリ> +app_update 565060 validate +exit` と設定する。

![args_steamcmd.jpg](https://qiita-image-store.s3.amazonaws.com/0/97774/5e0a4177-7518-444d-fca1-c59fa7b47ecd.jpeg)

作成したショートカットをダブルクリックで実行すると、サーバー用Avorionバイナリがサーバーディレクトリに作成される。
![downloaded_avorion-bin.jpg](https://qiita-image-store.s3.amazonaws.com/0/97774/247a9a31-d934-480d-7c9f-585f105d3128.jpeg)

サーバーディレクトリ内にマップディレクトリを作成する。ここでは例として、"G:\Games\Avorion\galaxies" をマップディレクトリとして用意したものとする。


## マップを生成する
サーバーディレクトリ内にある"server.bat"を**別名でコピーする**。例えば"start_mygalaxy.bat"などでよい。

コピーしたbatファイルをメモ帳で開き、 `bin\AvorionServer.exe --galaxy-name <マップ名> --admin <SteamID> --datapath <マップディレクトリ>` といった形式で編集する。
![edit_serverbat.jpg](https://qiita-image-store.s3.amazonaws.com/0/97774/884c6bc7-5aed-12f5-9768-109b9f8abc14.jpeg)

編集したバッチファイルをダブルクリックで実行するとプロンプトが起動し、以下のように表示されてマップデータが生成される。

```bat:
Installed Steam exception handler
Warning: No RCON password set. RCON disabled.
Server startup complete.
Server connected to Steam successfully
Server is VAC Secure!
Game Server Steam ID: XXXXXXXXXXXXXXXXXX
```

**ファイアウォール警告が出た場合は許可しておくこと。**
![firewall_permit.jpg](https://qiita-image-store.s3.amazonaws.com/0/97774/95cb49de-34c3-0a65-a501-f26e70c3afcc.jpeg)


## サーバーに接続する
マップ生成バッチを実行した時点で、サーバーの起動も実行されている。

Avorionを起動し、"マルチプレイ"から"LANに参加"を選択する。
![start_multiplay.png](https://qiita-image-store.s3.amazonaws.com/0/97774/314fd64e-3b51-b092-9518-5452e63b1bc0.png)

サーバーが1つ見つかるはずなので、それを選択して"参加する"を選択する。
※同じパソコン上で実行しているためか、IPアドレスが変なのが気になる。
![join_server.png](https://qiita-image-store.s3.amazonaws.com/0/97774/dba22bcf-c70b-0065-85d5-3b118bd43631.png)

問題がなければ広大な宇宙に放り出される。
![success_join.png](https://qiita-image-store.s3.amazonaws.com/0/97774/e651e8e9-3fcc-bf1e-c9ff-a48cb6c210da.png)


## サーバーを停止する
`/save`と入力後に続けて`/stop`と入力する。**プロンプトを×で閉じたりしないこと。**




## 備考:マップ設定を変更する
マップ設定は生成直後ではデフォルト設定になっている。
設定を変えたい場合は、マップディレクトリ内のマップ名ディレクトリを開き、"server.ini"を変更すればよい。
細かい設定項目は以下のURLを参考にする。
https://avorion.gamepedia.com/Server#Server_Configuration_Options





## 参考
https://avorion.gamepedia.com/Setting_up_a_server
Goアプリのホットデプロイ

Go言語のサーバアプリケーションを開発するときにコードを修正したら、自動的にビルドする方法。

# gin
ginをインストールする。
`go get github.com/codegangsta/gin`

ginを実行する。
`gin.exe -p 4001 -a 4000`

ブラウザで4001ポートにアクセスすると、4000ポートで待っているgoアプリがアクセスされる。
4001ポートでアクセスされたgoアプリはコードを修正すると自動的に修正内容が反映される。
Docker Composeのインストール手順

[Windows 10 Proに構築したDocker](https://qiita.com/is_mgmt_dept/items/05aa0a6b11b2dab34bea)にDocker Composeをインストールする手順。

# pythonとpipのインストール
bashを起動して以下のコマンドを実行

```
sudo apt-get install python
curl "https://bootstrap.pypa.io/get-pip.py" -o "get-pip.py"
sudo python get-pip.py
rm python get-pip.py
```

# Docker Composeのインストール
bashを起動して以下のコマンドを実行

```
sudo pip install docker-compose
```

# Docker Composeの使い方
docker-compose.ymlのあるディレクトリに移動して、以下のコマンドを実行

```
docker-compose up -d
```

再ビルドする場合、
`docker-compose build`

キャッシュを使わない場合
`docker-compose build --no-cache`
天気情報を取得してLINEで投稿する

# 概要
- とりあえず、冬休みに何か作ろうと思った
- 毎朝、天気予報を見ているが、LINEに通知されてくれば便利かなぐらいのモチベーション

# 事前準備
1. LINE Messaging APIを利用できる環境の準備
    - [Line Developers] (https://developers.line.me/ja/services/messaging-api/)でアカウントを作成
    - https://qiita.com/yoshizaki_kkgk/items/bd4277d3943200beab26 を参考にさせて頂きました！
2. IBM BluemixでNode-Redを起動
    - 以下を参考に、Node-Red Starterを起動
    - https://qiita.com/KenichiSekine/items/6ad49b25167b3f4cdb63
    - https://qiita.com/zuhito/items/86e7ad47d14937d3e9b6#_reference-a3c8d97a4441b514a91d
   
3. Node-Redでフロー作成
    - 天気情報を取得するAPIの情報については、[天気情報を取得する](https://qiita.com/s0hno/items/b67a24bd3cbeb6e7cdc0)などでも記載されている通り、OpenWeatherMapが良さそうだったのですが、さくっと作るために、[livedoor天気](http://weather.livedoor.com/weather_hacks/webservice)を利用させて頂きました。

# Node-Redのフロー
- 以下のフローをNode-Redで読み込み→クリップボードでインポート
- Node-Redで以下のノードを目的にあわせて編集
- 参考
    - [livedoorでの全国地点定義表](http://weather.livedoor.com/forecast/rss/primary_area.xml)
    - [LINE Messaging APIリファレンス](https://developers.line.me/ja/docs/messaging-api/reference/#anchor-0c00cb0f42b970892f7c3382f92620dca5a110fc)

```
[{"id":"dfad30eb.8da4","type":"inject","z":"3647a876.1ec048","name":"毎朝6:00(JST)","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"00 21 * * *","once":false,"x":157,"y":112,"wires":[["db9264f1.82cbf8"]]},{"id":"db9264f1.82cbf8","type":"http request","z":"3647a876.1ec048","name":"Livedoorから東京都の天気予報を取得","method":"GET","ret":"txt","url":"http://weather.livedoor.com/forecast/webservice/json/v1?city=130010","tls":"","x":417,"y":123,"wires":[["a9a0ce5c.cfda8"]]},{"id":"603a26c1.e9f798","type":"debug","z":"3647a876.1ec048","name":"","active":true,"console":"false","complete":"payload","x":990,"y":200,"wires":[]},{"id":"a9a0ce5c.cfda8","type":"json","z":"3647a876.1ec048","name":"ResponseをJSONに変換","pretty":false,"x":441,"y":231,"wires":[["f309d232.26ab7"]]},{"id":"f309d232.26ab7","type":"function","z":"3647a876.1ec048","name":"天気予報結果を組立","func":"telop = msg.payload.forecasts[0].telop;\ncelsius = msg.payload.forecasts[0].temperature.max.celsius;\ndescription = msg.payload.description.text;\n\ntmp = telop+\"\\n\"+\"最高気温 \"+celsius+\"℃\\n\\n\"+description;\nmsg.text = {};\nmsg.text = tmp;\nreturn msg;","outputs":1,"noerr":0,"x":667,"y":309,"wires":[["a31c7bb7.412d28"]]},{"id":"a31c7bb7.412d28","type":"function","z":"3647a876.1ec048","name":"Lineへの応答を編集","func":"msg.headers = {};\nmsg.headers.Authorization = 'Bearer ★{channel access token}★';\nmsg.headers[\"Content-Type\"] = 'application/json';\nmsg.payload = null;\nmsg.payload = {};\nmsg.payload.to = \"★送信先のID。Webhookイベントオブジェクトで返される、userId、groupId、またはroomIdの値★\";\nmsg.payload.messages = [];\nmsg.payload.messages[0] = {};\nmsg.payload.messages[0].type = \"text\";\nmsg.payload.messages[0].text = msg.text;\nreturn msg;","outputs":1,"noerr":0,"x":517,"y":454,"wires":[["d842ea4b.16c098"]]},{"id":"d842ea4b.16c098","type":"http request","z":"3647a876.1ec048","name":"LineBotへ応答","method":"POST","ret":"txt","url":"https://api.line.me/v2/bot/message/push","tls":"","x":780,"y":500,"wires":[["603a26c1.e9f798"]]}]
```
へちょマイPCではjupyter notebook上でのDeepLearningの学習が遅すぎるので、FloydHubでスイスイ動かす方法

## 背景
マイPCがへちょすぎて、ローカルの`jupyter notebook`上での`DeepLearning`の学習が遅すぎる。
そういったとき、一部無料のクラウドサービス`FloydHub`を使ってスイスイ学習させたい。

## 事前準備その1

以下にアクセスして`Sign Up for Free`から登録
https://www.floydhub.com/
[![https://gyazo.com/ef1036d70f2dee7cb1d89ef92b2ad79c](https://i.gyazo.com/ef1036d70f2dee7cb1d89ef92b2ad79c.png)](https://gyazo.com/ef1036d70f2dee7cb1d89ef92b2ad79c)

登録したユーザ名とパスワードを覚えておくこと！

## 事前準備その2

`FloydHub`を使う場合、指定したディレクトリ以下の階層すべてがWEB上で公開されます。
なので`FloydHub`上で動かしたい`ipynb`ファイルやデータファイルは、新しいフォルダを作って場所を分けておきましょう。

## ローカルPCからFloydHubにログイン

まず、事前準備で作成したディレクトリに移動します。
その後、以下のコマンドでログイン。

```
$  floyd login -u ユーザ名 -p パスワード
```

`Login Successful as ユーザ名`と出力されたらログイン成功です。

## プロジェクトの作成

`FloydHub`はプロジェクトという単位でディレクトリが分離されています。
そして各プロジェクト内に起動させたい`py`ファイルや`csv`ファイルを格納されて、稼働していくといったイメージです。

なのでまずは以下のコマンドでプロジェクトを作成します。

```
$ floyd init プロジェクト名
```

すると以下のようにブラウザが立ち上がるので、`Create`をクリックします。
[![https://gyazo.com/ee257a0fdb594ca80bde53e4bea1a7b9](https://i.gyazo.com/ee257a0fdb594ca80bde53e4bea1a7b9.png)](https://gyazo.com/ee257a0fdb594ca80bde53e4bea1a7b9)

すると以下の画面に遷移します。

[![https://gyazo.com/0ba3ea5d944f9e898cd035da8376bf0c](https://i.gyazo.com/0ba3ea5d944f9e898cd035da8376bf0c.png)](https://gyazo.com/0ba3ea5d944f9e898cd035da8376bf0c)

ほぼ同タイミングで先ほどのコマンドの結果として下記出力があります。

```
$ floyd init プロジェクト名
Project name does not yet exist on floydhub.com. Create your new project on floydhub.com:
        https://www.floydhub.com/projects/create
Press ENTER to use project name "プロジェクト名" or enter a different name:
```

これはプロジェクト新規作成時に出力される内容です。
そのまま`ENTER`を押してください。
すると`Project "プロジェクト名" initialized in current directory
`と出力されます。

## junyper notebookごと起動させる方法

では以下のコマンドで`FloydHub`上で`junyper notebook`を起動させましょう。

```
# CPUを使用したい場合
$ floyd run --mode jupyter 

# GPUを使用したい場合
$ floyd run --mode jupyter --gpu
```

すると以下のような出力があります。

```
$ floyd run --mode jupyter
Creating project run. Total upload size: XXXKiB
Syncing code ...

JOB NAME
--------------------------------
ユーザ名/projects/プロジェクト名/1


Path to jupyter notebook: https://www.floydhub.com/ユーザ名/projects/プロジェクト名/1
```

そして以下のようにブラウザが立ち上がります。

[![https://gyazo.com/7d70681f929f6debd1675ba210d5c010](https://i.gyazo.com/7d70681f929f6debd1675ba210d5c010.png)](https://gyazo.com/7d70681f929f6debd1675ba210d5c010)

これでカレントディレクトリ以下のファイルがWEB上にアップされます。
そして`localhost`と同様に`FloydHub`上で`junyper notebook`を操作することができます。
`FloydHub`のすばらしい`CPU`(もしくは`GPU`)を利用するのでスイスイ学習が進みます！！！

## junyper notebookごと起動させるときに注意すること

`floyd run --mode jupyter`コマンドを実行したときから、`CPU`(もしくは`GPU`)利用のカウントが開始されます。

ですので、`junyper notebook`を立ち上げたらすぐに該当ファイルを起動して`Deeplerning`学習させましょう。

使用しないときは下記右上の`Cancel`を押して`CPU`(もしくは`GPU`)利用を止めましょう。

[![https://gyazo.com/7d70681f929f6debd1675ba210d5c010](https://i.gyazo.com/7d70681f929f6debd1675ba210d5c010.png)](https://gyazo.com/7d70681f929f6debd1675ba210d5c010)

## ファイル単品で起動させる方法

`floyd init プロジェクト名`のあと、カレントディレクトリ以下のファイルを起動させたいときは、以下のコマンドを実行します。

```
$ floyd run --cpu "ファイル名.拡張子"
```

これで指定したファイル名のファイルが起動します。

## その他
無料枠の範囲は以下の通りです。(2018/1/6現在)

- CPU 毎月20時間
- GPU 生涯2時間
AWS一括請求(Organizations)とクレジット(クーポン)共有・その使用権

AWS一括請求でクレジットを共有する場合（デフォルト）、はまった話です。

前提
======
親アカウントAに、子アカウントB・子アカウントCがぶらさがっています。
アカウントA,B,Cにはそれぞれ100ドルのクレジットが１つずつ付与されています。
全アカウントでEC2インスタンスが稼働しており日々課金が発生しています。

事象はこうして起こった
======
アカウントBを月の途中で一括請求から脱退します。
上記100ドルのクレジットはアカウントBのクレジットですから
一括請求脱退後も自分のアカウントの物のはずです。
実際マネコンで確認するとクレジットは残っています。

しかし、月が変わるとアカウントBに請求が届きました。
一括請求脱退後30ドル程度しか使っていないはずなのに何故…
これはおかしいと確認すると、一括請求グループに使われていたのでした。

クレジットの使用権
======
クレジットは最初に消費したアカウント（グループ）に使用権が属するようです。
つまり一括請求脱退時に残額が残っていても、それは自分の手元に戻らない。
脱退前の一括請求グループに使用権が残り続ける。
これは困りましたね。。。

AWSクレジットの問題点
======
本件を含めAWSクレジットの問題点を挙げておきます。

- 複数登録されているとランダムに使用され虫食い状態になる
- 有効期限の近い順に消費してくれない

１つめが今回の事象の原因です。
一括請求グループに存在するクーポン全体でランダムに使用されるためこのようなことに。
![credit.jpg](https://qiita-image-store.s3.amazonaws.com/0/96018/e781b3d9-6df0-c767-78c9-3d8c7b0b0b9a.jpeg)
このように同一アカウントに複数のクレジットがあっても、順番に使われず虫食い状態に使われます。
親アカウントの物から順番にとまではいかなくても、せめて１つのクレジットを使い始めたらそれを使い果たすまで他のクレジットに手を付けないといった仕組みが欲しいですね。

２つめも結構問題です。
今月末で期限切れとなるクレジットがまだ残っているのに、他のクレジットが使われることが。
そして使われないまま消えていったクレジットがあります。

まとめ
======
一括請求まわりは非常にややこしいです。
加入・脱退する場合は請求を日々確認するようにしましょう＞＜
WindowsにDockerを構築する手順

Dockerを動かすための環境を**Windows 10 Pro**に構築する手順。

# ソフトウェアのインストール
１．コントロールパネル→プログラムと機能→「Windows機能の有効化または無効化」を開いて、Hyper-VとWindows Subsystem for Linuxをインストールする。

２．[Docker for Windows](https://www.docker.com/docker-windows)をダウンロードしてインストールする。

# WSL環境(Windows Subsystem for Linux)の設定
１．スタートメニュー→設定→更新とセキュリティ→左のメニューから開発者向けを選択して、「開発者モード」にチェックする。

２．Microsoft StoreからUbuntuを検索して、インストールする。

# dockerホストをHyper-Vに構築
１．「Hyper-V マネージャー」をWindowsのアプリの検索ボックスに入力して起動する。

２．Hyper-Vマネージャーの右側のメニューから仮想スイッチマネージャーを起動して、「外部」の仮想スイッチを作成する。

３．Windows Power Shellを管理者権限で起動する。

４．以下のコマンドを実行する。
`docker-machine create --driver hyperv --hyperv-virtual-switch "上記２．で作成した仮想スイッチ名" Dockerマシン名`

例
`docker-machine create --driver hyperv --hyperv-virtual-switch "DockerNATExt" docker`

５．以下のコマンドを実行して表示されるDOCKER_HOSTとDOCKER_CERT_PATHの値を控えておく。
`docker-machine env docker`

６．bashコマンドを入力してWSLに入る。
`bash`

７．以下のコマンドを入力して.bashrcの最下行に追記する。
`vi ~/.bashrc`

追記内容：

```
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="上記５．控えたDOCKER_HOSTの値"
export DOCKER_CERT_PATH="上記５．で控えたDOCKER_CERT_PATHの値（※参照）"
export DOCKER_MACHINE_NAME="Dockerマシン名"
```
※DOCKER_CERT_PATHはWindowsのパスをLinuxのパスの形に変更すること。
C:\Users\User\.docker\machine\machines\docker
→/mnt/c/Users/User/.docker/machine/machines/docker

例：

```
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.77.13:2376"
export DOCKER_CERT_PATH="/mnt/c/Users/User/.docker/machine/machines/docker"
export DOCKER_MACHINE_NAME="docker"
```

８．環境変数の反映
`source ~/.bashrc`

９．以下のコマンドなどを実行して、Dockerが使用できることを確認する。
`docker ps`

# dockerホストの起動、停止
Windows Power Shellを管理者権限で起動する。

dockerホストの起動

```
docker-machine start dockerマシン名
```

dockerホストの停止

```
docker-machine stop dockerマシン名
```

dockerホストのIPアドレスが変わった場合
TLS 証明書の再作成

```
docker-machine regenerate-certs dockerマシン名
```

環境変数の修正

```
bash
vi ~/.bashrc
source ~/.bashrc
```
Qt/QMLをAndroidとそれ以外の両方でビルドする - Qtで作るAndroid目覚ましもどき #4-2 -

[前回](https://qiita.com/hakua-doublemoon/items/db44a5a3b093a98fe3b8)、Androidで音声ファイルを再生するのにうんぬんという話を書きましたが、そういうAndroidをようやく本格的に意識し始めたところでAndroidと他のプラットフォーム（私はCentos）の両方でQtをビルドしたりすることを話します。

# 結論
と、なんかわざわざ切り出しましたが話は簡単です。記事にする必要なかった……？

## c++ソースの場合
`__ANDROID__`マクロでAndroid用の部分をくくります。例えば↓

``` summer_clock.cpp
#ifdef    __ANDROID__
#include <QtAndroidExtras/QtAndroid>
#include <QtAndroidExtras/QAndroidJniObject>
#endif /* __ANDROID__ */
```

## .proファイルの場合
`android{ }` でAndroid用の部分をくくります。例えば↓

``` summer_clock.pro
android{
    QT += androidextras
    QT += remoteobjects

    REPC_REPLICA += pingpong.rep
    #REPC_SOURCE += pingpong.rep
}
```

# あんまりいらない説明
前回AndroidのAPIを実行するためにしれっと登場した`QAndroidJniObject`ですが、こやつを使用するプロジェクトはAndroid用のconfigureだけでしかビルドできないようです。
しかしそれだと画面の調整とかするときに、いちいち端末にデプロイすると少なからず時間がかかって、不便です。画面を見るだけならQt Creatorを動かしているプラットフォーム上で実行する方が当然速いです。
何度も何度も修正と実行を繰り返すのが好きな人のためには上記のやり方が必要でしょう。

#### QMLソース上ではAndroid用の切り分けができない
たぶん。なのでAudioオブジェクトをLinuxの時だけ使うとかはできないっぽい。
（2018/09/17 気が向いたので追記）
処理の切り分けぐらいはプラットフォームを取得することでできます。方法は……忘れた。WindowsだとOS環境変数が使えます。ただオブジェクトは共通なので、OS依存のオブジェクトがあると困ります。
あとは.proファイルそのものをOSによって切り分けるというアイデアもあります。しかしOSごとに別の構成ファイルを管理していなければならないのはとても面倒。

#### ソース/クラスによってはAndroid以外ではほとんどNOPになるものもある
前回の音声ファイル再生クラスがそうですね。Android用の再生機能＝Android以外では使えない。
それどころか全体にコンパイルすることすら……なんかカッとなってLinux用にダミーのクラスを作成し、Linux時はそちらをロードするようにしてあります。

<br>

……なんかちゃんとQtの設定がうまくいっていれば気にしなくてもいい話なんじゃないかという気がしてきましたが、まあ、もし同じような状況になってしまった人のためにこの記事は置いておきます。
Macで文字コードを一気に変換する。


nkfを使用して文字コードを一気に変換します。
 nkfとはものすごく古い漢字コード変換プログラムであるnkfをメンテナンスするプロジェクトとのことです。 

## 参考サイト
[【Mac】フォルダ内のファイルの文字コードを一括変換する - Qiita](https://qiita.com/ikemonn/items/a418658b37955a3c543d)


## nkfのインストール

以下のページから最新リリースのhkf-2.x.x.tar.gzをダウンロードする。（2018/1/6現在の最新バージョンは2.1.4）
[nkf Network Kanji Filter プロジェクト日本語トップページ \- OSDN](https://ja.osdn.net/projects/nkf/)


gzファイルを解凍した後、/usr/local/src/の配下に配置する。

/usr/local/の下にsrcフォルダがなければ作成して配置します。
以下のような感じになるかと思います。

![Kobito.G6kqMH.png](https://qiita-image-store.s3.amazonaws.com/0/49910/75499235-e19b-9a52-df48-7351b3b1886e.png "Kobito.G6kqMH.png")


## XCodeのインストール
XCodeが入ってない場合にはインストールします。
nkfをソースから実行ファイルを作成する際に必要となります。

## nkfのコンパイル

ターミナルからソースファイルのフォルダへ移動して以下のコマンドを実行します。
筆者の環境では/usr/local/src/nkf-2.1.4 で実行しました。


```
sudo make
sudo make perl
sudo cp nkf /usr/local/bin/
cd NKF.mod
sudo perl Makefile.PL
sudo make
sudo make test
sudo make install
```

インストールが終われば正しくnkfが実行できるか確認します。
`nkf --help`


## 実行方法

ターミナルで変換したいフォルダに移動して以下のようなコマンドを実行します。

カレントフォルダ配下のすべてのファイルを変換する。
`nkf -s --overwrite ./*`

カレントフォルダ配下のすべてのhtmファイルを変換する。
`nkf -s --overwrite ./*`


カレントフォルダ配下のすべてのhtmファイルを変換する。（すべてのフォルダ）
`nkf -w --overwrite **/*.htm`
キリト君のモデルをGenericからHumanoidに変更するときにハマった点


## 現象

[キリト君のモデル](https://www.yobi3d.com/ja/q/3D%E3%83%87%E3%83%BC%E3%82%BF/%E3%82%AD%E3%83%AA%E3%83%88%E3%81%AE%E5%89%A3)をダウンロード。Unityで読み込む。

[Rig] > [Animation Type] > [Humanoid]に変更して、`Apply`を押す。
するとエラーになるので`Configure`を確認。

![2018-01-06.png](https://qiita-image-store.s3.amazonaws.com/0/136286/001085b6-ddf1-6a19-4419-413ff37d9a89.png)

Headにボーンが当たっていないことがわかる。

![2018-01-06 (2).png](https://qiita-image-store.s3.amazonaws.com/0/136286/7ee33a32-7e28-1dbb-0822-5171f51922e0.png)

## 失敗例

そこでボーンを追加してみる。neckを複製してheadにリネーム。headをneckの子要素にもっていく。Optional BoneでHeadにアタッチ。`Apply`して`Done`で終了。一見成功しているように見えるが、エラーは消えない。再度`Configure`を確認すると変更が消えてしまっている。


## 成功

NeckのボーンをHeadにアタッチする。これで解決した。ボーンの追加はできず、あらかじめ存在しているボーンを付け直すというのが正攻法なのだろうか？

![2018-01-06 (3).png](https://qiita-image-store.s3.amazonaws.com/0/136286/9f0fcdb6-2581-4483-4bd7-78555f0fbf73.png)
昨日〜9日前までの日付を空白区切りで返すサンプル

## ソース

```c:datelist.c
#include <stdio.h>
#include <time.h>

int main(void) {
    time_t timer;
    struct tm *local;

    /* 現在時刻を取得 */
    time(&timer);

    int i;
    int max = 9;
    for(i=0; i<max;i++) {
        //1日分過去にする
        timer -= 24*60*60;
        /* GMTではなくローカルタイムに変換 */
        local = localtime(&timer);

        printf("%4d", local->tm_year + 1900);
        printf("%02d", local->tm_mon + 1);
        printf("%02d", local->tm_mday);
        // 最後の値には空白をつけたくない
        if(i < max-1) {
            printf(" ");
        }
    }

    return 0;
}
```

## 使い方

```sh:コンパイル
gcc datelist.c -o datelist
```

```sh:使い方
$ for i in `./datelist`;do ls access_log-$i.gz;done
access_log-20180105.gz
access_log-20180104.gz
access_log-20180103.gz
access_log-20180102.gz
access_log-20180101.gz
access_log-20171231.gz
access_log-20171230.gz
access_log-20171229.gz
access_log-20171228.gz
```
ClientからBasic認証でアクセスする時の注意点

クライアントアプリケーション(javascriptなど)からBasic認証でサーバにアクセスする時の注意点。

# preflight
リクエスト送信時のHTTPヘッダに"Authorization"が含まれていると、CORSの制約により、preflightという事前アクセス（HTTPメソッドはoptions）が行われる。

そのため、preflightによるアクセスを許可する設定をnginxのdefault.confに記述する必要がある。

```
location / {
  if ($request_method = OPTIONS ) {
    add_header Access-Control-Allow-Origin *;
    add_header Access-Control-Allow-Methods "OPTIONS";
    add_header Access-Control-Allow-Headers "Authorization";
    add_header Access-Control-Allow-Credentials "true";
    add_header Content-Length 0;
    add_header Content-Type text/plain;
    return 204;
  }
  ・・・
}
```