OmniAICreator/Qiita-1.07M huggingface dataset:
AWS X-Rayで非同期メッセージをトレースする

Microservicesを構築するにあたり、各サービス間のメッセージのやりとりに、非同期処理を使うことがあると思います。

その非同期処理をぱっと簡単にトレースしたいとかってあると思いますが、それを、Serverlessにやってみたってお話です。

# やりたいこと

![image1.png](https://qiita-image-store.s3.amazonaws.com/0/24050/5a41a960-7727-76fd-7796-428f4b806eb2.png)

こんな流れを想定しています。

最初のLambdaから、SQSにメッセージを送信し、SQSをcronで起動されたLambdaがポーリングして、メッセージを取得したあと、なんしかの処理をした後、DynamoDBにデータを永続化します。

# 実際のX-Ray

![AWS_X-Ray.png](https://qiita-image-store.s3.amazonaws.com/0/24050/5690bba6-61b3-e003-f4f2-f07236a1e1b2.png)

こんな感じで出力されます。

ぱっと見でうまいことトレースができている様子ですが、実際には、publishしたメッセージがsubscribeした側との繋りがなく、トレースができているようでいて、できていません。

![AWS_X-Ray.png](https://qiita-image-store.s3.amazonaws.com/0/24050/9bc5778b-23f7-a547-b2e1-0864b302dc9c.png)

上図のように、publishのトレースを見てみると、SQSにメッセージを送信した時点で切れています。

# トレースできるようにする方法

pubしたメッセージを実際にDynamoDBに保存されるまでトレースするには、以下のような構成を取るといけます。

![AWS Icons(1).png](https://qiita-image-store.s3.amazonaws.com/0/24050/b2828f74-ddca-d14b-1305-01b5f9a1f9d4.png)

## Lambda1でpubする方法

Lambda1でメッセージを送信する際に、Lambda実行時の環境変数から、TraceIdを取り出して、SQSのメッセージに加えます。

Scalaで書くとこんな感じ。

```scala
val sqs = AmazonSQSClient.builder()
  .withRegion(region)
  .withRequestHandlers(new TracingHandler(AWSXRay.getGlobalRecorder))
  .build()

val traceId = sys.env("_X_AMZN_TRACE_ID")

sqs.sendMessage(queueUrl, traceId)
```
# Lambda2でsubする方法

Lambda2でsubするときに、SQSのメッセージからTraceIdを取得して、Lambda3をinvokeします。

Scalaで書くとこんな感じ。

```scala
val clientConfiguration = new ClientConfiguration()
clientConfiguration.addHeader("x-amzn-trace-id", message.getBody)

val lambda = AWSLambdaClient.builder()
  .withRegion(region)
  .withClientConfiguration(clientConfiguration)
  .build

val invokeRequest = new InvokeRequest()
  .withFunctionName(functionName)
  .withPayload(s"""{"id":"${message.getBody}"}""")
  .withLogType(LogType.Tail)

lambda.invoke(invokeRequest)
```

# トレースできてるX-Ray

この手法だと、以下の様にトレースできています。

![AWS_X-Ray.png](https://qiita-image-store.s3.amazonaws.com/0/24050/fd603b08-a87b-d49b-6efb-682fae85774e.png)

ちょっと複雑な感じに見えますが、これでメッセージをpubしてからDynamoDBにputするまでトレースできています。

![AWS_X-Ray.png](https://qiita-image-store.s3.amazonaws.com/0/24050/701eee1e-bbf5-6490-d497-19ad84923002.png)

このように、pubしたものが、38.5sかけて、subされてDynamoDBにputされている様子が見えます。

# まとめ

非同期を可視化してトレースできるっていうのは、Microservicesを運用していくうえで、けっこー重要な可視化ですよね。

それをX-Rayで実現していくのに、こういった方法が取れます。

とはいえ、Lambda2 => Lambda3を起動するということで、レイテンシーの低下がありますから、そのあたりが許容できるかどうかは、要件次第でもあります。

X-Rayが改善されて、このような工夫をしなくてもトレースできることを期待しています。

以上でっす。

# 検証でつくったGitHub

https://github.com/yoshiyoshifujii/async-trace-by-aws-x-ray
React Nativeチュートリアル

# はじめに

初めてReact Nativeでアプリを作るときのヒントをまとめた
一通りやると自分のスマートフォン上で開発したアプリを動かすことができる
React NativeはReact.jsでiOS, Androidアプリが作れるプラットフォームである

参考リンク
[React Nativeとは何なのか]
(https://qiita.com/Iwark/items/7c27e919bb71f8b256f6)

# 開発環境

```
OS:Mac=10.12.6(Sierra)
node=9.2.0
npm=5.5.1
react=16.0.0
react-native=23.0.0
expo=46.0.6
```

# 環境設定

まずnode.jsが入ってるかどうかを確認
バージョンが古い可能性があるので以下のコマンドでバージョンを安定版にする

```
npm install -g n
sudo n stable
```

React Native、expo（ビルドツール）をインストール

```
npm install -g create-react-native-app
npm install exp --global
```

それからスマホにExpo Clientというアプリをインストールする
このアプリ上で開発したアプリを実行する
[Expo — Get Expo tools]
(https://expo.io/tools)

参考リンク
[Macにnode.jsをインストールする手順。]
(https://qiita.com/akakuro43/items/600e7e4695588ab2958d)
[Getting Started · React Native]
(https://facebook.github.io/react-native/docs/getting-started.html)
[Expo — Learn how]
(https://expo.io/learn)

# 実行

以下のコマンドでカレントディレクトリ下に開発プロジェクトを作成する
なおこのときアカウントを作り、プロジェクト名、テンプレを指定する必要がある

```
exp init AwesomeProject
（中略）
? Choose a project name: AwesomeProject
? Choose a template type: blank
```

プロジェクトディレクトリに移動しサーバを起動

```
cd AwesomeProject
exp start
```

これでサーバが立ち上がり、QRコードが表示される
Expo Clientを起動し「Scan QR Code」をタップ、QRコードを読み取るとサンプルアプリが起動する
これで`App.js`の`<TEXT>`タグで囲まれてるテキストが画面に中央に表示されていれば成功！

サーバを起動したまま`App.js`を編集して保存すると自動的にビルドがはじまる
とりあえず`<TEXT>`タグで囲まれてるテキストを変更してみるとか、公式ドキュメントの「The Basics」のサンプルコード（例えば[これ](https://facebook.github.io/react-native/docs/props.html)とか）
をマネするとかして色々試してみよう
rails-ujsに見る、jQueryからの移行法

かつて、Railsのビューには`jquery-ujs`というライブラリが使われていました。のちに`rails-ujs`として、jQuery依存を外すことに成功しています。では、それはどのようになされたのでしょうか。

# 実際に見てみよう

`rails-ujs`は[npmにある](https://www.npmjs.com/package/rails-ujs)ので、[jsDelivr経由で参照できます](https://cdn.jsdelivr.net/npm/rails-ujs@5.1.4/lib/assets/compiled/rails-ujs.js)。実際に見ていってみましょう。

まずは、セレクタ類の定数としての定義があって、次に、`.matches`を正規化する`Rails.matches`があります。そして、DOMオブジェクトにデータを格納する`Rails.getData`/`Rails.setData`の組があります。

そして、読み進めていけばいくほど、「どこかで見たことのあるメソッド」にあふれていることがわかるかと思います。

* セレクタからDOM要素を配列として得る、`Rails.$`
* バブリングを利用して上位要素でイベントを拾う、`Rails.delegate`
* CSRFトークンも追加するAjaxのユーティリティ関数、`Rails.ajax`
* フォーム要素をクエリストリングに起こす、`Rails.serializeElement`

そして、HTMLメソッドの変更や`data-confirm`への対応などは、これらのメソッド群を通じて行っています。

# 必要は発明の母

明らかなように、これらはjQueryとほぼ共通するメソッドです。実際、「便利だから」jQueryに追加されたわけでしょうし、jQuery離れするにあたっても必要なものだった、というわけです。

実際、jQueryを外していくにあたって、このような「似たような動作をする関数群」は欠かせなくなります（もっとも、jQueryのアニメーションをCSS Transitionに書き換えるなど、全く違う実装にせざるを得ない場面もあるかとは思います）。

# その他
`rails-ujs`を`require`などで入れた場合、自動で発動しないので、`const Rails = require('rails-ujs')`としてから、`Rails.start()`を行う必要があります。

また、上に挙げた`Rails.***`メソッドは`rails-ujs`の外部からも使えます（特に、CSRFトークンに対応している`Rails.ajax`などは便利かと思います）。
Archlinuxの最新tlpで、「printf: 書き込みエラー: 無効な引数です」と表示される場合

https://github.com/linrunner/TLP/issues/271

ここで指摘されているとおり、既知のバグのようです。
gitの方では修正コミットが入っていますが、pacmanから入るtlpだとまだ取り込まれていない様子です。
なので、AURにあるtlp-gitを導入すれば治ります。


```bash
$ yaourt -S tlp-git
```
VB6のプロジェクトをVB.NETへ一括マイグレーションする

VB6からVB.Netへのマイグレーションプロジェクトを何回か経験してきました。
経験ある方はご存知だと思いますが、VB6→VB.NETにマイグレーションするにはVisualStudio2008までついいていたマイグレーション機能が必要になります。

基本的にウィザード形式で１プロジェクトごとにマイグレーションしていくのですが、中にはvbpファイルが数十個あるシステムがあったりと手作業でやっていくには面倒なことがあったので、コマンドラインで一括でマイグレできないかを調査したところ、以下のコマンドで出来ました。

```batch
Rem 以下は、VS2008のインストールパスです。他のバージョンのVSを使用する場合は適宜パスを変更してください。
cd C:\Program Files\Microsoft Visual Studio 8\VB\VBUpgrade\

Rem 上記パスに移動するとVBUpgrade.exeと言うものがあります。こいつにオプションを付けてキックします。
VBUpgrade vbpファイルのパス /Out 出力先パス (その他オプション)

Rem 例としては、以下のようになります。
VBUpgrade C:\src\vb6\Hoge.vbp  /Out C:\out\Hoge 
```

その他のオプションは以下のページに書かれています。（/Verboseと/logfileオプションは付けたほうがいいですね。）
https://msdn.microsoft.com/ja-jp/library/6fc5h7by(v=vs.90).aspx

以下、余談

ここまで来たらお次は莫大な数のコンパイルエラーと警告との戦いとなります。
サードパーティ製のOCXなんか使っているとそれこそ数百件のエラーが出てきますのでほんと大変です・・・。

平成生まれのエンジニアとしては元ソースの作成日時が生まれる前とか物心がつく前だったりすので、時代を感じながら楽しんで（？）作業しております(-.-;)
これで保守性の高いコードを書ける。単一責務の原則の簡単に理解する。

# 単一責務の原則って一体何？
良いオブジェクト指向設計を行う上で、SOLID原則を意識することは大切な事である。ただし、この中の一つ、単一責務の原則は非常にわかりにくい。　この原則の意図とする

「クラスを変更する理由が2つ以上存在してはならない」

とは何だろうか？　
# 視点を変えて理解しよう
ここで考え方を変える。インスタンス変数同士が密接に関係して入れば、２つ以上の切り口から変更される理由はないとと考えることができる。なんの事はない、70年代からあるモジュール凝集度の考え方である。
# コードでさらに理解を深めよう
例えば以下のクラスを考える

```
class AB {
   int instanceA1;
　 int instanceA2;
   int instanceA3;
   int instanceB1;
   int instanceB2;
}
```

以下のようにメソッドによって参照するインスタンス変数が偏っている。

```
void method A1()
{
   instanceA1にアクセス
   instanceA2にアクセス
   instanceA3にアクセス
}

method A2
{
   instanceA1にアクセス
   instanceA2にアクセス
   instanceA3にアクセス
}

method B1
{
   instanceB1にアクセス
   instanceB2にアクセス
}

method B2
{
   instanceB1にアクセス
   instanceB2にアクセス
};
```

上記の場合は以下のように２つのクラスに分ける事ができる。

```

class AB {
   int instanceA1;
　 int instanceA2;
   int instanceA3;
}

class AB {
   int instanceB1;
   int instanceB2;
}

```

# [WIP]割り切れない場合はどうするの？

例えば以下のようにA群とB群が混在している場合はどうすればいいのだろうか？

```
method AB1
{
   instanceA1にアクセス
   instanceA2にアクセス
   instanceA3にアクセス
   instanceB1にアクセス
   instanceB2にアクセス
};

method AB2
{
   instanceA1にアクセス
   instanceA2にアクセス
   instanceB1にアクセス
   instanceB2にアクセス
   instanceA3にアクセス
};

```
正解はないが以下のやり方がある。

* どちらかのクラスのインスタンス変数をメソッドの引数にとる。デメリットはクラス間で結合が発生する。
* いずれかのクラスでない第３クラスに処理を書く。デメリットは同じ処理があらゆるところに散らばる。
* どちらかのクラスで他方のインスタンスを所持する。デメリットは結合度が上がる。ただし、他のクラスからはその状況は見えない。

# 妥協しなければいけない事もある
設定変数をまとめたクラス等、実際には妥協しなければ行けない場合も存在する。
SQL Serverで、yyyyMMddHHmmss形式の文字列をDateTime型に変換する

OracleからSQLServerへのマイグレを行うプロジェクトに携わった時のメモ。

プログラムから渡されるyyyyMMddHHmmss形式の文字列をDateTime型に変換する際にスムーズに行かなかったので以下のやり方で対応した。

```sql:Oracle
to_date('20171121235959', 'YYYYMMDDHH24MISS')
```


```sql:SQLSERVER
--SQLServerのSTUFF関数で半角スペースと':'を挿入し、yyyyMMdd HH:mm:ss形式にすることで、convert関数そのままDateTime型にキャストすることが可能。
--※そのままというのは、第３引数が不要ということ。
convert(DateTime,stuff(stuff(stuff('20171121235959', 9, 0, ' '), 12, 0, ':'),15, 0, ':'))
```
```sql:メモ
/*
--他にもyyyy-MM-dd HH:mm:ssやyyyy/MM/dd HH:mm:ss形式に変えてから渡すとCONVERT関数の第三引数にStyle値を渡す必要がなくなる。


・・・。何でこの文章をコメントで書いているかというと、本文書くときに:mmという文字が絵文字になっちゃうため。
だれか絵文字のエスケープ教えてくださいm(_ _)m
*/
```
FallCreatorUpdate 実施後のWSL(BOW)を初期化する方法について

# 結論

　以下のフォルダを削除する。

```
C:\Users\{User}\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc\LocalState\rootfs
```
　※ {User}は自分のユーザ名

# 事象詳細
### 経緯

　「やっちまった。 "dpkg --configure -a" ですらエラー吐くよ・・・」
　という状況になったので、WSLを初期化したかった。

　Qiita・その他サイトでご教示いただいている、以下のような初期化手順を試したところ、

* コマンドプロンプトで"lxrun /uninstall /full" を実行する。
* "Windowsの機能の有効化または無効化"からWSLを入れなおす。

　**→ 直らねぇ・・・**

### 解決

　Qiitaの記事から、Windows上でのWSLのルートパスがつきとめられた。
　(非常に助かりました)

　　　[windowsストアアプリのUbuntu（bow）](https://qiita.com/kenta8813/items/1cce159b27828305d8db)

　当初、マジか？とレジストリを検索したところ、マジだった。
　↓のキー上にWSLのフォルダパスが記入されている。

#### レジストリ上のキー
```
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Lxss\{SID}\BasePath
```
　※ {SID}は環境によって異なる

### 蛇足

　"installing..." と表示された時の喜びは、一生忘れません。
ArchLinuxでNASをマウントするとエラーが出る時の対処法

# NASをマウント時にエラーがでる
```
sudo mount -t cifs //IP_ADDR/SHARE_NAME /mnt/nas/ -o username=USERNAME,password=PASSWORD,iocharset=utf8
```

すると

```
mount: /mnt/nas: bad option; for several filesystems (e.g. nfs, cifs) you might need a /sbin/mount.<type> helper program.
```
と出る。

# 解決法
[Arch Wiki](https://wiki.archlinux.jp/index.php/Samba#.E3.82.AF.E3.83.A9.E3.82.A4.E3.82.A2.E3.83.B3.E3.83.88.E3.81.AE.E8.A8.AD.E5.AE.9A)に載っていました。

**cifs-utils**のインストールが必要とのことです。

```
sudo pacman -Sy cifs-utils
```
ウェブブラウザでのコピー&ペーストを実装する

## 概要
2017/12/09時点
ブラウザで対象の文字列のコピー&ペーストを行う時があったので、そのときの実装のメモ。

### 加筆
2017/12/12時点
1. copy時の`e.clipboardData.setData`に`text/plain`を`text`に修正。textにするとosのクリップボードに貼り付けられた。
2. windows環境ではclipboard.jsのcopyによりclipboardEventが2回呼ばれてしまっていた

環境

||バージョン|
|---|---|
|macOS|10.12.6|
|safari|11.0.1 (12604.3.5.1.1)|
|chrome|62.0.3202.94|

## 利用するもの
[ClipBoardEvent](https://developer.mozilla.org/ja/docs/Web/API/ClipboardEvent)のcopyとpaste。他にcutもあるよ。

## コード
```javascript
// ctrl+vなどで動く
window.addEventListener('paste', e => {
  const clipboardData = e.clipboardData;
  if (!clipboardData) {
    alert('this browser does not work ClipboardData'); // ここはtext/plainでも上手く行ったのだがなぜ？
    return;
  }
  var clipboardText = clipboardData.getData('text');
  console.log(clipboardText);
});
// ctrl+cなどで動く
window.addEventListener('copy', e => {
  const clipboardData = e.clipboardData;
  if (!clipboardData) {
    alert('this browser does not work ClipboardData');
    return;
  }
  clipboardData.setData('text', 'コピーしたい文字列'); // textだとosに貼り付けられる
});
```

## 困った点
1. 他のサイトではclipboardDataにitemsというプロパティがあり、そこのgetAsStringからデータを読み取るようなコードもあった。
しかし、itemsについて、chromeでは利用できたが、safariからは読み取れなかった。そのためgetDataを使うようにした。

2. ~~`e.clipboardData.setData('text/plain', 'コピーしたい文字列');`
この部分はブラウザ内で利用できるclipboardにはコピーができるのだが、実際のOSのClipBoardにはコピーがされなかった。（説明が難しい）
そのため、追加でコピー時に[clipboard.js](https://clipboardjs.com/)を利用した。~~

textでいける！
Firebase Hosting と Cloud Function を組み合わせた時APIが外から呼ばれ放題な問題とかどうしようかなと思った話

最近サーバサイドの開発から始めるのがだるいのでサーバレスでやってみようという気持ちがあり（もちろんサーバレスならではの辛さが存在することは知っている)、ちょうど良さそうな Firebase Hosting と Cloud Function でちまちま遊んでます。

目指すものはまずは会員登録とかいらないで、動的にAPIで情報を引っ張ってきて表示するだけのサービスです。

## Cloud Function のURLは誰でもアクセスできる

WebアプリケーションっぽくするにはAPIから動的に情報を取ってきてそれに応じてビューを描画するのが良かろうと思ったのですが、Cloud Function の関数はURLを知っていれば誰でもアクセスできる状態になっているのが微妙でした。セキュリティグループとかぱっと調べた感じなさそう。

普通に何気なく関数を作ると、

https://自分のプロジェクト.cloudfunctions.net/helloWorld

みたいなURLが発行されて、そのURLを知っていれば誰でも実行できちゃうのは微妙ですね。外から呼ばれ放題で課金していたら料金が無駄に増える予感がします。できれば firebase hosting でホスティングしているサイトからJSを使ってアクセスしてくる場合のみ許可したい感があります。

## 匿名認証

そこでどうしようかと考えたのですが、firebase には匿名認証という機能があり、そこで認証されたユーザのみ許可すればいけるのではないかと思いました。

ホスティングされているサイトから以下のJSを読むようにします。

```javascript:anonymous.js
firebase.auth().signInAnonymously().catch(function(error) {
  // Handle Errors here.
  var errorCode = error.code;
  var errorMessage = error.message;
});

//現在認証しているユーザを取得する
firebase.auth().onAuthStateChanged(function(user) {
  // tokenを取得して、ajaxで通信する
  user.getIdToken().then(function(token) {
    var request = {
      method: 'GET',
      url: './helloWorld',
      beforeSend: function(xhr) { xhr.setRequestHeader('Authorization', 'Bearer ' + token); }
    };

    $.ajax(request).then(function(data){
      console.log(data)
    })
  });
})

```

function側では以下のような感じにします。

```javascript:functions.js
const functions = require('firebase-functions');

exports.helloWorld = functions.https.onRequest((request, response) => {
  // ここで認証されているかどうかを確認する
  if (request.headers.authorization) {
    response.send("ok");
  } else {
    response.send("non auth");
  }
});

```

これでサイトからのアクセスからは「ok」が返り、Curlなどでアクセスした場合は「non auth」が帰ってきます。アクセスされはするものの、処理を行わないように弾くことはできるようになりました。やりたいことはできた感じ。やったね。

## とはいえ微妙感

しかしなんというかこう、アプリケーション側で頑張らないといけないのがなんともいけていない感じがします。もっといい方法があるけど、見つけられていない可能性のほうが大きい感。

あとこのままだと匿名ユーザがどんどん増えていくのが微妙です。匿名ユーザが増えっぱなしでも特に問題ないならそのままでもいいかなと思ったりするけどどうなのでしょうか。

外部のAPIとか使いたいWebアプリケーションを作る場合はどうにかしてfirebase側に匿名情報をセットしたいのでCloud functionを使わないと行けない気がするのだけど、もっといい方法がありそうなきがします。引き続き調べていきたいところです。
Kerberosでexportされたkeytabをマージする

いつも忘れてしまうので、自分用メモ。
exportはOpenBSDのHeimdalで、マージはmacOS 10.13のプリインストールコマンドで実施。
macOSは、manによると[Heimdal](https://www.h5l.org)の模様。

# export
```
# kadmin -l ext_keytab -k hoge.keytab host/hoge.example.org
```

# マージ
```
# ktutil copy hoge.keytab /etc/krb5.keytab
```

# 確認
```
# ktutil -k /etc/krb5.keytab list
```

# 参考
https://support.apple.com/ja-jp/HT4419
https://kb.iu.edu/d/aumh#combine

# 宿題
macOSのLKDCについて。
`afpserver, cifs, vnc`などで使用している模様。
vim-airlineでステータスバーにgitのブランチを出力させるのに苦労した

# vim-airline
カッコいい。
カタチだけなのはダメだけど、やっぱりカタチも大事です。

GitHubに事細かに書いてくれているので、説明は割愛。
https://github.com/vim-airline/vim-airline

# 環境
OS：Ubuntu 16.04 LTS
VIM: 8.0

# 問題発生
vim-airlineを使ってカッコいいVim生活を送っていたつもりになっていたのに、ある日違和感に気付いた。
![範囲を選択_022.png](https://qiita-image-store.s3.amazonaws.com/0/64360/eef4a550-0719-f3f4-bc88-952c1b629241.png)<br/>
あれ？コレが出てない？？？
![範囲を選択_021.png](https://qiita-image-store.s3.amazonaws.com/0/64360/5f87412b-efaf-66c0-f029-085847457c3e.png)
<br/>
vim-airlineの上記ページで大量にアップされている画像たちにもしっかりブランチ名表示されてる。
自分も表示させたい！！！

# 解決方法
プラグインマネージャにdeinを使っているんですが、
fugitiveの設定がメインのTOMLと遅延ロード用のTOMLの両方に書かれてました。

```Zsh:dein.toml
[[plugins]]
repo = 'tpope/vim-fugitive'
```
遅延ロード用のTOMLにも記述があるのは誤りなので削除。
だいぶハマってしまって一回諦めかけたけど、無事解決してよかった！
![範囲を選択_023.png](https://qiita-image-store.s3.amazonaws.com/0/64360/03ca5f65-2715-0aee-da95-cfb7ed09cd37.png)
はじめてのプログラミング言語としてのGo 〜 甘口の構想

DevFest2017でプログラミングはじめて! という人のためのGoの教材を作りたいと宣言したので, それについての枠組みを書こうと思います。
あくまでもまろやかな甘口を表現していきたいという所存であります。

プログラミングは楽しいものなのだ, ということをGoを使って果たして実現できるのだろうか...そういう人が増えてくれたら嬉しいものです。

流れはこんなことを考えています。

1. Goが動くための基本的な話をします。
1. [The Go Playground](https://play.golang.org/)を利用して, プログラムの基本的な構文を学びます。
1. 自分の手元で環境構築をします。
1. FizzBuzzをやります。

## 1. Goのこと
世の中にはたくさんのプログラミング言語があって, その中でもGoはどういう子なのか。
そういう話がGopherを交えながらできればいいなあと思っています。GopherもGoの魅力のうちの一つです。GopherがいるからGoではじめたい! というプログラマーのヒヨコがいるかもしれません。
また, 静的とかGCとかはこの時点では話をしない予定です。甘口なので。

## 2. プログラムの基礎
開発環境の構築の前に, [Playground](https://play.golang.org/)を利用して, すぐにプログラミングの構文演習を行います。

### 2-1. Goの構成  
importやmainの話をします。コメントについてもココで説明をします。
ただし, この時点では, 宣言(const, type, var, func, package, import)については軽く触れるのみとし, mainの中に処理を書いていくよ, という話のみをする予定です。

```go

package main

import (
	"fmt"
)

func main() {
	// fmt.Println("Hello, これは表示しません")
	/*
 		fmt.Println("Hello, これも表示しません")
 		fmt.Println("Hello, これも表示しません")
	*/
	fmt.Println("Hello, playground")
}
```

### 2-2. 文字列の出力
文字列をそのまま出力するfmtのPrint系の話をします。

- fmt.Print
- fmt.Println

上記のバリエーションがあることを説明していきます。変数の代入(fmt.Sxxx)やフォーマット(fmt.xxxf)についてはまだココでは触れません。


また, ココでちょうど`fmt`をimportしているので, `goimports`や`gofmt`についてもplayground上で触れます。
<img width="708" alt="スクリーンショット 2017-12-12 16.23.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/41774/8a8ffd68-6dfe-add2-d0a9-039af4b1b68c.png">
ココで`Run`を押下して, `undefined: fmt`を出す。


### 2-3. 変数と型
下記について話をします。

- 変数の宣言と代入
- 型のバリエーション
    - 整数
    - 浮動小数点
    - 虚数
    - 文字列
    - Rune
    - Bool
- どういったときにエラーとなるか

### 2-4. 算術演算子
下記について話をします。
2-3.で学んだ変数をコッソリとたくさん使います。

- 足し算
- 引き算
- 掛け算
- 割り算
- 余り

### 2-5. 比較演算子
下記について話をします。

- 等しい
- 等しくない
- 未満
- 以下
- より大きい
- 以上

### 2-6. 分岐構造
通常のif, else, switchについて話をします。

### 2-7. 繰返し構造
for, break, continueについて話をします。
インクリメントやデクリメントについても説明をします。
逆にその他(whileやgoto等)についてはココでは触れません。

### 2-8. sliceとmap
この流れでsliceやmapが必要か, やや迷っています...

## 3. 環境構築
今まで色んな人と一緒に環境構築をしてきましたが, みんないつも大変そうでした。
はじめたばかりなのにここでドハマりしてしまうと, Goを嫌いになってしまうかもしれません。
ココは甘口なので, なるべく最短で動かせる状態を作れるようにしようと思っています。

3-1. brewを入れる。
3-2. Goを入れる。
3-3. bashに設定する。
3-4. 最低限必要なパッケージを`go get`する。

テキストエディタについては, はじめてならAtomやGolandあたりが良いのではないか, と思っています。
わたしは`vim-go`を利用するためにvim修行中ですが, vimそのものの環境構築だけでも大変な時間を要しました...

テキストエディタで保存時に`goimports`や`golint`しても良いのですが, 敢えて手元で実行してもらうでも良いのではないでしょうか。

## 4. FizzBuzz
`Fizz`ってなに? `Buzz`ってなに? と思ってしまうかもしれません。
 甘口な教材ではそれぞれ好きな言葉に置き換えます。`カレー`とか`リンゴ`とか。もちろんそのまま`FizzBuzz`でも問題ありません。

## 5. 触れていないこと
甘口だとこの辺はまだいらないのではと思っています。

- 宣言(const, type, var, func, package, import)
- 関数
- 構造体
- レシーバとポインタ
- インターフェース
- 並列

尻切れ感で満載ですが, これから太らせていこうとしています。
ご意見なんてもらえたら, とてもうれしいですʕ•ᴥ•ʔ
kerasで学習中の狙ったタイミングのモデルを保存する

# せっかく時間をかけて学習したのに…
- 間違えてCtrl+Cを押して終了してしまった！
- 放置しすぎて明らかに過学習してしまった！
- NaN値が飛び出してモデルが意味のないものになってしまった！
- すごい良さそうなValidationの値が出てたのに最後に保存されてるモデルはもう既にそれじゃない！

などなど、経験したことはありませんか？
時間も電気代も使ってたくさん計算したのにもう1回やり直し、なんてなったら機械学習のモチベーションは遥か彼方だと思います。

そういう事を避ける意味でも、そうでなくとも学習中の適切なタイミングのモデルを保存していきたいと思いこんなクラスを作りました。

https://gist.github.com/mercy0387/e6ffbe7d7420ea32a69bff17da1f268a

基本的な使い方は[ModelCheckpoint](https://keras.io/ja/callbacks/#modelcheckpoint)とあまり変わりませんが、これそのままだとあんまり融通が利かないんですよね。

このCustomModelCheckpointは各メトリクスやValidationメトリクスに対して、特定の値を超えた（下回った）タイミングのモデルを指定のファイル名で保存します。複数の値を指定することもでき、その場合はANDで（すべて満たす場合のみ）保存します。しかもファイル名にはメトリクスの数値を含められるのでファイルをパッと見で比較できます。

使い方

```howto.py
model.compile(optimizer=<some optimizer>,
              loss=<some loss>,
              metrics=['accuracy', custom_metrics])

checkpoint = CustomModelCheckpoint(
    filepath="./model-{epoch:05d}-{val_acc:.4f}-{val_custom_metrics:.4f}.h5",
    thresholds={
        'acc': 0.8,
        'val_acc': 0.75,
        'val_custom_metrics': 0.5
    })

model.fit(X, y, validation_data=(X_test, y_test), callbacks=[checkpoint])
```

こんな感じで自作のmetricsにも使えます。基本的なルールとしてメトリクスの名前に `val_` を付けるとValidationデータ時に計算した値が該当するようです。（また `accuracy` のみ `acc` という書き方ができるっぽい）

上の例の場合はトレーニングデータの精度が0.8以上かつバリデーションデータの精度が0.75以上かつcustom_metricsで指定した値の大きさがバリデーション時に0.5以上を満たしたepochの時のみモデルを「model-00012-0.8231-0.7821-0.6172.h5」みたいな名前で保存します。

イニシャライザに `inverse=True` を指定すると「以上」ではなく「以下」で判定します。

今のところ以上と以下を分ける程の柔軟さが無いので必要であれば正負をひっくり返したcustom_metricsにすれば良いと思います。（未検証(๑´ڡ`๑)てへぺロ）
Emacs構築メモ

## 経緯
Atomエディタを使っていましたが動作の重さと、度々起こるエラーに辟易としてきたのでEmacsに乗り換えました。
Emacsにした理由は、Linux環境やターミナル上でも使えることと、C-a, C-eなどのカーソル移動が好みだからです。
Emacsは割と玄人向けの記事が多い気がするので、これから初めて触る人の参考になればと思います。

## 環境
- macOS sierra 10.12.6
- Ubuntu 16.04

macOSとUbuntuどちらでも動く環境を構築しています。

## インストール
### macOS
	brew tap railwaycat/emacsmacport
	brew install emacs-mac

### Ubuntu
	sudo add-apt-repository ppa:kelleyk/emacs
	sudo apt update
	sudo apt install emacs25

`emacs —version`でemacs 25以上が入っているのが確認出来ると思います。

### 参考
- [Ubuntu 16.04にEmacs 25.1をインストールする](https://qiita.com/ytoda129/items/58078d8c7e74d9144014)
- [Macに最新バージョンのEmacsをインストール - 計算物理屋の研究備忘録](http://keisanbutsuriya.hateblo.jp/entry/2016/04/10/115945)

## 起動
Emacsには、端末上で起動する方法とGUIとして起動する方法の2種類があります。

### 端末上
macの場合、単に`emacs`と打てばviエディタのように端末内で起動します。
Ubuntuの場合、`emacs`ではGUIで起動するので`emacs -nw`と入力します。
端末上でのちょっとした編集やリモートアクセス時などに使用します。
パッケージによっては表示がおかしくなったりするので、`-q`オプションを付けて設定ファイルを読み込まずに起動すると良いかもしれません。
	
### GUI
挙動が安定しておりGUIでしか動かないパッケージもあるので、基本的にはこちらを利用しています。

Macの場合、`/usr/local/Cellar/emacs-mac/emacs-*/Emacs.app`にインストールされています。
Ubuntuの場合、アプリケーション一覧から選択するか、上記の通り`emacs`と入力することで起動出来ると思います。
`emacs &`とすると、引き続き端末の操作ができるのでこちらの方がいいでしょう。

MacのターミナルからGUIを起動したい場合は、
.bashrc(または .zshrc）に以下のようにエイリアスを設定します。

```
alias em='() { command /usr/local/Cellar/emacs-mac/emacs-25.3-mac-6.8/Emacs.app/Contents/MacOS/Emacs $@ &}'
```

`em [ファイル名]`でGUIのEmacsがバックグラウンドで起動するようになります。

## init.elについて
Emacsの設定は`.emacs.d/init.el`に書き込んでいきます。
公開されている`init.el`を参考に少しずつ自分好みにカスタマイズしていくのが良いと思います。

ひとつ注意点として、パッケージをパッケージマネージャーで導入した場合`(require 'xxxxx)`という記述は不要です。
起動時間の短縮につながるため、最初から書かないか[use-package](https://github.com/jwiegley/use-package)を使いましょう。
use-packageを用いることで、パッケージごとの設定を見やすくまとめる事が出来ます。

[use-packageで可読性の高いinit.elを書く - Qiita](https://qiita.com/kai2nenobu/items/5dfae3767514584f5220)
[use-package — KumaROOT 0.3.0 ドキュメント](http://kumaroot.readthedocs.io/ja/latest/emacs-use-package.html)

## パッケージについて

パッケージ管理は[Cask](https://github.com/cask/cask)を用います。
Caskを用いることで依存パッケージを列挙した`Cask`ファイルでパッケージを管理でき、他の環境に移行しやすくなります。

Caskのインストール・使い方は以下の記事が参考になります。
[Emacs Caskでパッケージ管理をしてみよう | vdeep](http://vdeep.net/emacs-cask)

`init.el`の上方でCaskの初期化をしますが、Homebrewとcurlとで書き方が異なります。

```init.el
;; curlの場合 
(require 'cask "~/.cask/cask.el")
(cask-initialize)

;; brewの場合
(require 'cask)
(cask-initialize)
```

ここで以下のように書くことで、両方の場合に対応できます。

``` init.el
(when (or (require 'cask "~/.cask/cask.el" t)
	  (require 'cask nil t))
  (cask-initialize))
```

パッケージを削除する方法は見つからなかったので、`.emacs.d/.cask/*/elpa/`以下の対象ディレクトリを削除しています。
（パッケージの依存関係などを考慮できないため、もっと良い方法があるのかもしません・・・。）

おすすめのパッケージはたくさんあるのですが、早い段階で[helm](https://github.com/emacs-helm/helm)の扱いに慣れると良いと思います。

[初心者〜初級者のためのEmacs-Helm事始め : 前編 - Qiita](https://qiita.com/jabberwocky0139/items/86df1d3108e147c69e2c)

## 設定の同期
.emacs.dを~/dotfilesディレクトリに配置し、Githubで管理しています。

初期設定をした後は、下記を実行するだけで同期が完了するため非常に楽です。

```
git pull
cask # パッケージを追加した場合
```

## まとめ

Emacsはカスタマイズの自由度が高く、慣れてくる自分好みにどんどんカスタマイズ出来るのが楽しいです。

また私が気に入っているのが`M-x コマンド名`でコマンドが実行できる点です。
他のエディタでは「これするのってどのショートカットキーだっけ・・・」というのがしょっちゅうあり、チートシートを書いたり、メニューバーからいちいち探したりしていましたが、このおかげで無理にショートカットを設定せずとも楽に使えます。
Helmを組み合わせることで、コマンドを曖昧にしか記憶していなくても検索できるためさらに便利です。
リモートサーバでVimを使いたくない人が入れておくべきVSCodeの拡張機能 ~ EC2を例に ~ 

この記事は[Visual Studio Code Advent Calendar 2017](https://qiita.com/advent-calendar/2017/vscode)の10日目の記事です

早速ですが、皆さんはリモートサーバのファイルをいじる時、どんなエディタを使っていますか？

普段はIDEを使ってるけど、仕方なくVimで、、、という人も多いと思います（自分です）
Vimはいつか使いこなせるように、、、と思いつつ、まだまだコマンドとか覚えきれてないのが現実です、、、

しかし、1つの拡張機能と簡単な設定をするだけで、みんな大好きVSCodeでもファイルの編集をすることができます！

今回は、EC2インスタンス上のファイルをVSCodeで編集できるようにしてみましょう〜

## 最終的にできること

- VSCode内のターミナルから、EC2インスタンスにsshで入り、
- EC2上のファイルをローカルのVSCodeと同期し、そのまま編集、保存する
- ローカルでの変更がEC2上のファイルにも反映されている！

## 必要なもの、設定

リモートサーバ側(EC2)

- [rmate](https://github.com/aurora/rmate)のインストール
- ポートを開ける
  - 今回はAWS上でのセキュリティグループの設定

ローカル側(VSCode)

- [Remote VSCode](https://marketplace.visualstudio.com/items?itemName=rafaelmaiolla.remote-vscode)（VSCodeの拡張機能）のインストール
- sshのconfigの設定
  - Remote VSCodeで指定したポートにsshで入るため

## まずはローカル側の設定

### あらかじめSSHのconfigを設定しておく

楽にリモート側へ入れるように、sshのcondigの設定をあらかじめしておく

~/.ssh/configで設定できます

```bash

Host hoge
  HostName hoge.jp //EC2インスタンスのグローバルIP
  User ec2-user
  IdentityFile ~/hoge //秘密鍵が置かれているところ
  IdentitiesOnly yes
  ForwardAgent yes
  RemoteForward 52698 127.0.0.1:52698
```

最後の2行が大事。あとはよしなに。

### VSCodeに拡張機能を入れる(Remote VSCode)

名前をそのまま検索して、インストールすればOK
設定を確認する(settings)

```
// Port number to use for connection.
    "remote.port": 52698,

// Launch the server on start up.
    "remote.onstartup": true
```

remote.onstartupはtrueでもfalseでもどちらでも良い
起動した時に、Remote VSCodeが立ち上がっているかどうか。

### Remote VSCodeを立ち上げる

- F1でcommand paletteを表示
- Remote:Start serverでRemote VSCodeのサーバを起動

これでローカル側の準備は完了です!

## 次はリモートサーバ側の設定

### セキュリティグループの設定

Remote VSCodeはポート52698を使用するので、あらかじめ開けておく(インバウンド、アウトバウンド両方)

- タイプ：カスタムTCPルール
- プロトコル：TCP
- ポート範囲：52698
- ソース：許可したいIPアドレス

みたいな感じでOK
このセキュリティグループをEC2インスタンスに設定しておく

### インスタンスにログインし、rmateをインストールする

VSCodeの統合ターミナルから、以下のコマンドでリモートサーバへ入りましょう

```
ssh hoge
```

設定がうまくいってれば、これで入れればとりあえずOK

ダメだった場合は、ローカルで設定したsshのconfig、もしくはEC2インスタンスのセキュリティグループを見直しましょう

リモートに入れたら、パスが通ってるところに、rmateをインストールします

```bash
wget -O /usr/bin/rmate https://raw.github.com/aurora/rmate/master/rmate
chmod a+x /usr/bin/rmate
```

これで全ての準備がOK

### 実際にリモートサーバのファイルをローカルのVSCodeに同期してみる

VSCodeでいじりたいファイルを、以下のコマンドでローカルに持ってくることができる

```bash
rmate index.html
```

VSCodeにファイルが同期されれば、バッチグーです。

そのままファイルを編集、保存すると、リモート側のファイルも変更が加わっています
別のファイルを変更する際は、上記のコマンドで改めてVSCodeと同期しましょう

あとは開発を進めていくだけですね！

## まとめ

- Remote VScodeを使えば、リモートサーバでもVimを使わなくていい
- 他のIDEでも似たような機能はあるので、色々調べてみましょう
- でも本当はVimを使いこなせたほうがいい
- Vimのコマンドをちゃんと覚えて、IDEに頼らないようにしましょう

参考資料

- [Visual Studio Codeでリモートマシン上のNode.jsファイルを直接操作（編集、デバッグ実行）する](http://helloworld-yaruzo.com/author/hitomatagi/)
- [AtomでSSH越しのファイルを編集する](https://qiita.com/informationsea/items/d2576b1ab678965d9a02)
- [Visual Studio Codeでエックスサーバー上のリモートファイルを編集する](http://carrinova.com/vscode_xserver_remote_edit/)
（1年前に）ラズパイをセットアップした話

# はじめに

この記事はたしか1年前くらいに書いたもので、ずっと下書きに残ってたものを加筆修正したものです
なので、情報が古いかもしれないことにご留意ください
ラズパイ初期化してやりなおせ？
めんどいので嫌です

# SD準備～ラズパイ起動
その辺に転がってたSDカードを使うので、最初にSDカードをフォーマット
https://www.sdcard.org/jp/downloads/formatter_4/

NOOBS（ラズパイ用のインストーラー）をダウンロード（LITEじゃないやつ）
https://www.raspberrypi.org/downloads/noobs/
zipを展開して中身をすべてSDカード直下にコピー

ラズパイにSDカードをセットしてUSB給電すれば勝手に起動する。画面はHDMIでディスプレイに繋ぐだけでおｋ
メニュー画面っぽいのが表示されるのでRaspbianを選択してインストール。結構時間がかかる

# SSH接続
ラズパイを有線でルータに直接繋いでおくと、デスクトップ左上のネットワークアイコンにマウスオーバーで

```
eth0: Configurated 192.168.1.8/24
＜以下略＞
```

みたいにローカルipが出るので、メインPCからpingを打ってみる（つながるはず）
が、このままSSH接続してもrefuseされるので、右上ラズパイアイコンから
　「設定」＞「Raspberry Piの設定」
を開いて、「インターフェイス」タブからSSHを有効化

さっきのipアドレスに対してmobaxtermあたりでpi/raspberryで接続すると

```
The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Sun Nov 27 13:17:21 2016

SSH is enabled and the default password for the 'pi' user has not been changed.
This is a security risk - please login as the 'pi' user and type 'passwd' to set a new password.

pi@raspberrypi:~ $
```

# 初回設定的な
## パスワード変更
とりあえず警告も出てることだしパスワードを変更する

```
pi@raspberrypi:~ $ passwd
pi 用にパスワードを変更中
現在の UNIX パスワード:
新しい UNIX パスワードを入力してください:
新しい UNIX パスワードを再入力してください:
passwd: パスワードは正しく更新されました
pi@raspberrypi:~ $
```

## 有線LANに固定ipを割り当てる
`/etc/dhcpcd.conf`に以下を追加

```
interface eth0
static ip_address=192.168.1.100/24
static routers=192.168.1.1
static domain_name_servers=8.8.8.8
```

8.8.8.8はgoogleのDNSサーバらしい

`/etc/network/interfaces`の以下をコメントアウト。ただしreadonlyなのでsudoする必要あり

```
iface eth0 inet manual
```

とりあえず一度再起動`sudo reboot now`

## 諸々アップデートなど

```
pi@raspberrypi:~ $ sudo apt-get update
　＜略＞
pi@raspberrypi:~ $ sudo apt-get upgrade
　＜略＞
pi@raspberrypi:~ $ sudo apt-get dist-upgrade
　＜略＞
pi@raspberrypi:~ $ sudo apt-get autoremove
　＜略＞
pi@raspberrypi:~ $ sudo reboot now
```

## vimを入れる

```
pi@raspberrypi:~ $ sudo apt-get install vim
```

## 無線LAN設定
wifi設定を書き込む

```
pi@raspberrypi:~ $ sudo sh -c "wpa_passphrase SSID PASSWORD >> /etc/wpa_supplicant/wpa_supplicant.conf"
```

`/etc/network/interfaces`に以下を追加

```
auto wlan0
allow-hotplug wlan0
iface wlan0 inet static
address 192.168.1.101
netmask 255.255.255.0
gateway 192.168.1.1
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
```

再起動して有線引っこ抜いて無線のipで繋いでみればつながるはず

# 参考
Raspberry Pi + HomeKit + IRKit = Siriで家電を音声操作できるようにする
https://datahotel.io/archives/725
raspberry pi2 で 無線 LAN 設定まで
http://qiita.com/hotchpotch/items/dfcb9bd02baf67223eb0

# おまけ
## llをaliasで設定する
`$HOME/.bash_profile`に以下を追加

```
alias ll='ls -l'
```

## 忘れがちなlinuxショートカット
https://www.skyarch.net/blog/?p=362


以上
Parcel+Riot 開発環境構築

＊追記 18/2/22　＊
riot用のプラグインが出て、もっと簡単にできるようになったよhttps://qiita.com/jude/items/76dcce54b920537d3e1a
＊＊＊＊＊＊＊＊＊＊
初投稿です！お手柔らかにお願いします。

[webpack時代の終わりとparcel時代のはじまり](https://qiita.com/bitrinjani/items/b08876e0a2618745f54a) という記事があって、parcelという設定不要のバンドラーがあるらしいのでriotで試してみたいと思います。
## 自分の環境
- Windows 10 home
- node.js v8.9.1
- npm 5.5.1

## パッケージ
```
npm init -y
npm install -g parcel-bundler riot
npm install --save-dev babel-preset-es2015-riot riot
```
## コード書いていく

**ディレクトリ構成**

```
-root
   -package.json
   -src
     -app　　　　　　　　　<<<<ここにタグファイルを入れる
       -app.tag
     -main.js
     -index.html
```

**コード**

```index.html
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>Riot,Parcel</title>
</head>
<body>
  <app-root></app-root>
  <script src="main.js"></script>
</body>
</html>

```
```main.js
import riot from 'riot'
import './app/tags' //riotのコンパイラで出力されたtags.js

riot.mount('app-root')

```
app.tag

```html
<!-- const riot = require('riot')  -->　
<app-root>
  <h4>{ title }</h4>

  <script>
    // 入れないとriot is not definedと怒られます requireの場合は外側に書く
    import riot from 'riot' 

    this.title = 'Hello, World'
  </script>
</app-root>

```
コマンドに`riot src/app/ src/app/tags.js`を実行すると`src/app/`内のタグファイルを全てコンパイルし、`src/app/tags.js`(コンパイル後のファイル)を出力します。 

`parcel src/index.html`で依存しているhtml,css,js,babel等を見つけてバンドルしてくれます。ローカルサーバもたちます.

便利！

**設定ファイル**

```package.json
・・・
  "scripts": {
    "start": "npm run build & npm run bundle",
    "bundle": "parcel src/index.html",
    "build": "riot src/app/ src/tags.js"
  },
・・・
```

## 実行

`npm start`を実行して、http://localhost:1234/ にアクセス。
Hello,Worldと表示されれば成功です.

## まとめ
riotコマンドでtagファイルをjsファイルにコンパイルし、parcelでバンドルするだけで、特別なことはしてないです。
ECMAScript 6 modules

この記事は[HAL Advent Calendar 2017](https://qiita.com/advent-calendar/2017/hal) の10日目の記事です。

担当はJavaScriptにステ振りしたHAL Osakaの4年生です。
JavaScriptのフレームワークはもう何でもいいのでデータモデリングとCSSをどうにかするのがマイブームです。

## なぜモジュールを知るのか
いったい何回それをコピペするのか。
> Don’t Repeat Yourself

Andy Hunt氏とDave Thomas氏が「[The Pragmatic Programmer: From Journeyman to Master](https://www.amazon.co.jp/Pragmatic-Programmer-Journeyman-Master/dp/020161622X)」で最初に言及したソフトウェア開発原則です。

ベストプラクティスはソースの繰り返し部分全てを抽象化するというものです。
無理しすぎると不要な抽象化も発生するので気負いすぎないことは大事だと思っています。

嫌でもその同じ関数、クラスあちこちで使っていてたら勉強することになるでしょう。
[import - JavaScript - MDN - Mozilla](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/import)
[export - JavaScript - MDN - Mozilla](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/export)

他にもモジュールの実装と仕様がありますが、ここでは一切触れません。

## どのようにモジュールを活用するのか
ずばり、ソースをファイルで切り分けてしまうことです。
validationであれば`validates.js`や`validates/email.js`のように切り分けてソースを移行してしまいましょう。
重複していたソースはなくなり今後も重複することはないので、そのvalidation処理のテストコード書き始めるのがベストだと思います。

## 一体なぜこの記事を書いたのか
一番言及したかったのは`export default`について。

[export - JavaScript - MDN - Mozilla](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/export)
> ```js
export default expression;
export default function (…) { … } // class, function* も使用可
export default function name1(…) { … } // class, function* も使用可
```

実は`export default {}`という記述はどこにもないんですよ。
然しながらエラーは発生しないです動きます。

アクセル博士[(プロフィール)](http://dr-axel.de/)の[発言](https://medium.com/@rauschma/note-that-default-exporting-objects-is-usually-an-anti-pattern-if-you-want-to-export-the-cf674423ac38)から

> Note that default-exporting objects is usually an anti-pattern (if you want to export the properties). You lose some ES6 module benefits (tree-shaking and faster access to imports).

[意訳]
プロパティをexportする時に`export default`でオブジェクトをexportすることは一般的にアンチパターン。
より早いimportへのアクセスとツリーシェイキングというES6 Moduleの利点を損なう。

つまり静的解析ができないということです。

### どうするのか

ファクトリ関数を作る

```javascript:url.js
function url() {
  return Object.assign(
    {},
    {
      apis: {
        root: 'http://localhost:8080/api/talks',
        stories: 'http://localhost:8080/api/stories',
        conversations: 'http://localhost:8080/conversations',
      },
    }
  );
}

export default url();
```

```javascript
import {url} from 'url';

fetch(url.apis.root)
  .then(function(response) {
    return response.json()
  }).then(function(json) {
    console.log('parsed json', json)
  }).catch(function(ex) {
    console.log('parsing failed', ex)
  })
```

## parcelにも言及したい
📦[parcel](https://parceljs.org/)面白いですよね。とても楽そう。
でも色々な要件があると思うのでwebpack使う現実的に戻されるのがオチ。
IBM Cloud k8s の東京リージョン切り替え方法


IBM Cloud k8s ライトプランを利用すると、現在は欧州パリDCにデプロイされる。 東京DCは従量制プランだけですが、デプロイされた場所に応じてbx cs コマンドの接続先を変えるには、どうしたら良いかと書いてみました。


## IBM Cloud へ bxコマンドでログイン
一番充実している米国南部 ダラスDCへログインします。

~~~
bx login -u <user id> -a api.ng.bluemix.net
~~~


## IBM Cloud k8s のデータセンター切替方法


### LITEプランで配置されるパリDCのk8sへ接続

~~~
bx cs init --host https://eu-central.containers.bluemix.net
~~~


### 東京DCのk8sへ接続

~~~
bx cs init --host https://ap-north.containers.bluemix.net
~~~


### 米国南部 ダラスDCのk8sへ接続

~~~
bx cs init --host https://us-south.containers.bluemix.net
~~~



## kubectlが利用できるまでの流れ
上記 IBM Cloud k8s の配備されたデータセンターへ接続を切り替えた後に、kubeclt を利用するまでの流れです。

1.接続先DCのk8sクラスタのリストを表示します。

~~~
bx cs clusters
~~~


2.kubectlでマスターノードへの認証情報を取得します。 必須項目として先にリストの中から目的のクラスタ名をセットします。

~~~
bx cs cluster-config クラスタ名
~~~

3.環境変数をセットして、kubectlを実行します。
前述のコマンドの表示結果をコピペして、環境変数をセットします。環境変数の値は常に同じなので、予めログイン・シェルに仕込んでおいても良いと思います。

~~~
export KUBECONFIG=/home/vagrant/.bluemix/plugins/container-service/clusters/mycluster1/kube-config-par01-mycluster1.yml
~~~


4.kubectl を実行して確認します
次のコマンドで、ノードのリストが表示されたら成功です。

~~~
kubectl get node
~~~



## k8s利用に必要なソフトのインストール
順番が逆かもしれませんが、必要なソフトが入ってない場合は以下を参考にしてください。

1.bxコマンドのインストール
[IBM Cloud CLI の概説](https://console.bluemix.net/docs/cli/reference/bluemix_cli/get_started.html#getting-started) からダウンロード


2.kubectlのインストール
次のコマンドでダウンロードして、/usr/local/binへ移動します。

~~~
url -s -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl
~~~


3.csプラグインのインストール
k8sのインフラ依存の操作のためのプラグインで、bx loginした後に実行します。

~~~
bx plugin install container-service -r Bluemix
~~~

4.crプラグインのインストール
k8sのコンテナレジストリ操作のためのプラグインで、同様にbx loginした後に実行します。

~~~
bx plugin install container-registry -r Bluemix
~~~


5.プラグインのリスト表示

~~~
bx plugin list
~~~
初心者の簡単bashの設定

/etc/以下のbashの設定ファイルにも依存します。

・Debian系なら
/etc/bash.bashrc
・Mac系なら
/etc/bashrc

実際に設定するファイルは
ホームディレクトリの下のファイル

```
# Debian系なら
$ sudo vim ~/.bashrc

# Mac系なら
$ sudo vim ~/.bash_profile
```
PS1っていうのがプロンプトの表示の設定です。

```txt:/etc/bash.bashrc
PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$
```
{debian_chroot:+($debian_chroot)}の部分なくても問題ないです。
カラーなどが入れる場合

```
PS1='$\[\e[1;33m\]\u@\h:\w\[\e[m\]\\$
```
こんな感じ
\[\e[1;33m\]から先は全て黄色
\[\e[m\]から先は全てデフォルトの色

<details><summary>色一覧</summary>
0;30m  ： Black
0;31m  ： Red
0;32m  ： Green
0;33m  ： Yellow
0;34m  ： Blue
0;35m  ： Purple
0;36m  ： Cyan
0;37m  ： White
</details>

<details><summary>特殊文字</summary>
 特殊文字　： 内容
\e ：　ASCIIのエスケープ文字を表示
\h ：　ホスト名のうち最初の「.」までの部分を表示
\n　： 改行
\u　： 現在のユーザー名を表示
\w　： ホームディレクトリからの絶対パスで表示
\W　： 現在の作業ディレクトリを表示
\\\\\\\\\\$ ： 一般ユーザは$で管理者の時だけ#


</details>

この場合ディレクトリが深くなりディレクトリの表示が長くなり
コマンドの部分を折り返さないといけなくなる。
非常に鬱陶しいので初めからコマンドの部分を改行する設定を行う

また、ユーザ名とホスト名は、コマンドで表示できるため
少しでも情報を少なくしたいプロンプトには、個人的に入れないのをオススメする。

しかし、vagrantなどの仮装環境や組み込みOSの場合は、本体との差をつけるために
ユーザ名だけ表示することをオススメする。

```:/etc/bashrc
#macの場合
PS1='$\[\e[1;33m\]\u\[\e[1;34m\]:\w\n\[\e[m\]\\$

#debianの場合\\$を\$に変える
```
プロンプトの見た目は下記になる

```
user:~
$
```
こうすることでディレクトリが深くなった際でも
いつもと同じようにコマンドが打てるし、シンプルで見やすい。

### プロンプトのlsを設定する
　プロンプトのlsの色がデフォルトでついている場合もあるが
ディレクトリを識別するための'\'のマークがない時がある。
下記では、ディレクトリの色と'\'を表示する設定を行う。

設定の場所は、/etc/以下のbashファイルの一番下に足せばいい。

Debianは/etc/bash.bashrc

```:/etc/bash.bashrc
alias ls='ls -F --color=auto'
alias ll='ls -alF --color=auto'
```
Macは/etc/bashrc

```:/etc/bashrc
alias ls='ls -FG'
alias ll='ls -alFG'
```

見た目はこんな感じ（Mac）
ユーザ名は、yusk
<img width="527" alt="スクリーンショット 2017-12-09 20.35.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/205341/60987f99-ca6e-a05c-c423-8a3230a8bd0d.png">
実行ファイルは、赤色で'*'
ディレクトリは、青色で'/'
テキストファイル、ソースコードなどは、デフォルトの色

以上で最低限bashで便利に使えるようになる。

---
参考
[Bashのプロンプトに色を付けよう、という話](https://qiita.com/Hiroki_lzh/items/d33184cf5ac9ec92c3a6)
Font Awesome 5がリリースされたぞ！

[![Font Awesome 5 ](https://img.fortawesome.com/349cfdf6/gh-logo.svg)
fontawesome.com](https://fontawesome.com/)
(URLも従来の.ioから移転されました。)

[v4からのアップデートガイド(英語)](https://fontawesome.com/how-to-use/upgrading-from-4)

# 更新の概要

- お金を払ってより多くのアイコンを手に入れることができる、**Proバージョン**ができました。
  * 無償版でも従来から比べてアイコン数が増え便利になりますが、ProではLightウェイト等の追加のアイコンを利用できます。
- アイコンの数はもちろん増えました。
  * 日本の開発者にとって最もうれしいアイコンは[LINEのアイコン(fab line)](https://fontawesome.com/icons/line?style=brands)ではないでしょうか。
- [**導入方法**](https://fontawesome.com/get-started)が増えました。
  * [**JavaScriptとSVGによる描画**](https://fontawesome.com/get-started/svg-with-js)が新たに追加されました。  
    ページをパースし、自動的に必要なCSSと`<i>`タグ内にsvgを挿入します。
  * もちろん、[従来のCSSとWebFontを用いたバージョン](https://fontawesome.com/get-started/web-fonts-with-css)でも可能です。
  * npmパッケージを用いれば、[サーバー(node.js)サイドで事前にSVGを埋め込む](https://fontawesome.com/get-started/advanced-options)こともできます。詳細は後述。
  * [フォントをパソコンにインストールすれば](https://fontawesome.com/get-started/desktop)、OpenTypeの合字として表示することができます。  
    対応しているソフトや使う場所が限られていますが、何かと重宝しそうです。
- **アイコンの種類**が明確に分かれました。
  * **Solid**(塗りつぶし), **Regular**(線・標準の太さ), *light*(線・細い *Proのみ*), **Brands**(ブランド)の4種類があります。
  * [アイコン一覧](https://fontawesome.com/icons)では種類ごとに使えるアイコンを見ることができます。
- `fa`プレフィックスに代わり、種類ごとのプレフィックス`fas`,`far`,*`fal`*,`fab`になりました。
  * 例えば`<i class="fab fa-line"></i>`,`<i class="fas fa-clock"></i>`など。
- 種類分けに併せて、**アイコンの命名が変わりました**。
  * より論理的に、そして無垢になりました。
  * 4から利用している方は要注意です。しかしご安心ください。`fa-v4-shim.js`を利用すれば、そのままで大丈夫です。
  * [→ アップグレードガイド](https://fontawesome.com/how-to-use/upgrading-from-4)を参照してください。

# 導入例

**サイトビルダーや一般的なビルドを行うサービス等、事前処理ができる状況**においては、JavaScriptの処理をビルド時にしてしまいたいと誰もが思うはずです。
[npmパッケージ](https://www.npmjs.com/package/@fortawesome/fontawesome-svg-core)化によってそれができるようになりました。

以下に例を示しますが、APIの説明をすっとばして実使用の場合のみを想定しています。
詳しくは[APIの説明](https://fontawesome.com/how-to-use/font-awesome-api)を読んでください。
ブラウザとnode.js双方の仕様についてたいへんわかりやすく書かれています。

## 例
例を示すと言ったな？あれは嘘だ。
公式ドキュメントを見つけたので削除しちゃいました
→https://fontawesome.com/how-to-use/on-the-web/other-topics/server-side-rendering
化学反応の時間変化を数学する

#はじめに
高校化学で登場する化学反応式も、微分方程式の力を借りて時間変化を見ることができます。今回は、化学物質濃度の時間変化を数式化し、グラフで描画、グラフがその形となる理由を説明していきます。
###【動作環境】
MacOS Sierra 10.12.6
gnuplot 5.0 patchlevel 6 

#化学反応速度
化学物質AがBに変化していく、という状況を考えます。この場合の化学反応式は

```math
A \xrightarrow{k} B
```

となります。ここで化学反応定数をkとしました。ここで、２つの化学物質の濃度[A],[B]がどのように変化していくかを見ていきます。
物質Aが減っていく速度は、元々Aがどれほどあったかに比例することが実験等でわかるので反応速度$V_A$は

```math
V_A = -k[A]
```

と書くことができます。なお、Aは減少していくので符号はマイナスです。一方、物質Bが増えていく速度$V_b$は、Aが減った分増えるので$V_A$の正負を逆にした形

```math
V_B = k[A]
```
として表現できます。
#微分方程式の出番
「微分」を用いると、モノの単位時間当たりの変化量を見ることができました。これを使って、上の反応速度を微分方程式で書き直します。なお、濃度[A],[B]をa(t),b(t)と表現します。

```math
(1.1)\qquad\left\{
\begin{align*}
\dfrac{da}{dt}&=-ka(t)\\
\dfrac{db}{dt}&=ka(t)
\end{align*}
\right.
```

#可視化
濃度$a(t),b(t)$がどのように変化しているかグラフを求めてみます。
ここでは、初期値$a(0)=100,b(0)=0,k=0.5$とします。今回は近似計算法としてEuler法を用いていますが、詳細は[こちら](https://qiita.com/Dason08/items/6a58601415cfa6aea586)で解説していますので、参照してください。

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

//初期値、反応速度定数を定義しておく
#define init_a (1)
#define init_b (0)
#define k (0.5)

double systemA(double);

int main(int argc, const char * argv[])
{
	//ファイル出力コマンド
	FILE *fp;
	FILE *gnu;
	char *fname = "chem.csv";
	fp = fopen(fname, "w");

	int i;

	//時間
	double T = 20.0;

	//ステップ数
	int m = 10000;

	//ステップ幅
	double h = T / (double)m;

	//求めたい値
	double a,b;

	//初期値
	double a0 = init_a, b0 = init_b;

	//初期値のセット
	a=a0, b=b0;

	//行名と初期値をエクセルファイル"SIRmodel.csv"に出力
	fprintf(fp, "time, a(t), b(t) \n");
	fprintf(fp, "0.0 , %lf , %lf  \n", a, b);

	//Euler法で計算
	for(i=1; i<=m; i++)
	{
		a = a + h *  systemA(a);
		b = b + h * -systemA(a);

		//計算結果をエクセルファイルに出力
		fprintf(fp, "%lf, %lf, %lf\n", i*h, a, b);	
	}

	gnu = popen ("gnuplot -persist -geometry 400x200+70+480", "w");
	fprintf(gnu ,"plot \"chem.csv\" using 1:2 w l\n");
	fprintf(gnu, "replot \"chem.csv\" using 1:3 w l\n");
	pclose(gnu); 
}

//反応速度式を関数として定義
double systemA(double a)
{
	return -k * a;
}
```

これを実行して出てくるグラフは次のようになります。
![スクリーンショット 2017-12-09 17.20.02.png](https://qiita-image-store.s3.amazonaws.com/0/221972/7c8bf2cf-4444-42d4-6cf0-4d1331da4ee8.png)

Aの濃度$a(t)$は指数関数的に単調に減少し、時刻t=20に近づくにつれて濃度も0へ近づいていきます。一方、Bの濃度$b(t)$は単調に増加し、時刻t=20に近づくにつれて濃度1へ近づいていきます。

#なぜグラフのような挙動を描くのか
AとBの濃度が上のグラフのように変化することを微分方程式を用いて説明できます。
Aの濃度の変化は次の微分方程式で表されるのでした。

```math
\dfrac{da}{dt}=-ka

```
これは、簡単に解くことができて、

```math
a(t)=a(0)e^{-kt}
```
ここで、初期値a(0)=1でしたから

```math
a(t)=e^{-kt}
```
です。この式から$a(t)$は、指数関数的に減少していくことがわかります。
では、$b(t)$はどうでしょう。式(1.1)の両辺を足すと

```math
\dfrac{da}{dt}+\dfrac{db}{dt}=0
```
から

```math
a(t)+b(t)=const.
```
つまり、総濃度数は時間変化しないということがわかります。したがって

```math
a(t)+b(t)=a(0)+b(0)=1
```
から

```math
b(t) = 1-a(t)
```
つまり

```math
b(t) = 1-e^{-kt}
```
と求まりました。この式から$b(t)$は1に向かって指数関数的に上昇して行くことがわかります。

#まとめ
＊化学反応式の反応速度は微分方程式で表現できた
＊Euler法を用いて化学物質濃度の時間変化をグラフ化して表現できた
＊グラフの形は元の微分方程式から、数学的に説明できた
略解 ConstraintLayoutの機能の内部実装

[@seto_hi](https://twitter.com/seto_hi)です。主食はMaterialDesignとViewGroupです。
[Android Advent Calendar 2017](https://qiita.com/advent-calendar/2017/android) の10日目の記事です。
DroidKaigi 2018のセッションのステマ記事です。

この記事をお読みのイケてるAndroidエンジニアの皆様におかれましては当然ConstraintLayoutをお使いのこととお慶び申し上げます。
複雑なレイアウトを1階層で簡単に実現できる魔法のようなライブラリですが、やはり年末が近づくにつれて内部実装が気になってきます。
偶然にも僕はDroidKaigi 2018で「詳解 ViewGroupのレイアウト内部実装」という発表をするので、今回は以下の機能の実現方法について解説します。

- Guideline
- Group
- Barrier
- Chain

# Guideline
Guideline、実はViewです。
Guideline自身がViewとしてLayoutされることによって、他のViewのレイアウト位置を調整しています。
指定した位置にレイアウトされるだけというクラスです。
超シンプル！

# Group
Group、実はViewです。
Viewを継承したConstraintHelperというクラスを継承しています。
レイアウト前に呼ばれる`#updatePreLayout`というメソッドで、対象となるViewのvisibilityとelevationを変更しているだけです。
超シンプル！

# Barrier
Barrier、実はViewです。
Barrier自身がViewとしてLayoutされることによって、他のViewのレイアウト位置を調整しています。
Guidelineと違い、他Viewの位置に依存するためConstraintHelperを継承しています。[^1]
シンプル！

# Chain
Chain、実はViewではありません。
上記の機能と違い、layoutのXMLに要素として記載しないので当然ですね。
ConstraintLayoutは`constraint-layout-solver`というライブラリに依存しています。
その中にあるChainクラスというstaticメソッドが2つだけあるクラスで実現しています。
実装内容は「このViewとこのViewの間隔は固定値」「このViewとこのViewの間隔は大きくなって良い」といったような条件を不等式に変換して線形計画問題[^2]に追加しているだけです。[^3]
Chainであるかの判定は循環参照の検知(例：自身の右の制約のViewの左の制約が自身であるか)です。
シンプル...?ではないですね...

# さいごに
ConstraintLayoutはソースが公開されていないのでデコンパイルされたコードを読むしかありませんが、色々と面白い実装になっているので是非コードを読まれてみると良いと思います！
無料で50時間くらいは悩める楽しいコンテンツです！
そして是非DroidKaigiで僕とConstraintLayout・ViewGroupの内部実装の話をしましょう！
DroidKaigiのセッションではもっと詳しい話をするのでご期待ください！！！

それではよいConstraintLayoutライフを！


[^1]: 別にViewクラスの直継承でも同じ機能を実現できる気がするのですが、詳しい人教えてください。ConstraintHelperだとmeasureされないので高速化できるとかそのあたりですか？

[^2]: ConstraintLayoutは内部で線形計画問題を解決してレイアウト位置を算出しています。詳しくは[@inamiyさんのiOSDCの発表](https://qiita.com/inamiy/items/a6f73438b32896ffa81e)かDroidKaigiのセッションで！

[^3]: chainStyleやViewの状態(wrap_contentかどうか、chainの一番端のViewであるか、などなど)で条件分けしてLinearSystem.addGreaterThanなどで不等式を追加しています。LinearSystemなども説明したいところですが、それだけで1万文字くらいになってしまうのでこの記事では概要だけにします。詳しくはDroidKaigiのセッションで！
GitHub, Bitbucketを100倍快適にするツールOctotreeの紹介


ちょっと感動したので記事書いてみます
## Octotreeとは
GitHubにコードツリーを表示するためのブラウザ拡張機能（Chrome、Firefox、Opera、Safari）。リポジトリ内ののソースを探索するのにめちゃくちゃ便利なツールです。ただ、GitLabにはサポートできていないとのことです (2017/12/9時点)。

[![https://gyazo.com/0670b092f520135dc786fd68ee38a479](https://i.gyazo.com/0670b092f520135dc786fd68ee38a479.gif)](https://gyazo.com/0670b092f520135dc786fd68ee38a479)

### 特徴
- IDEのように移動しやすいコードツリー
- pjaxとTurbolinksによる高速なブラウジング
- プライベートレポジトリにも対応
- GitHub Enterpriseにも対応

## 導入手順
### Chromeにいれよう
Chrome ウェブストアの[Octotree](https://chrome.google.com/webstore/detail/octotree/bkhaagjahfmjljalopjnoealnfndnagc?hl=ja)から拡張機能をインストールします
これでpublicなレポジトリは見れるようになりました！
早い！！！！！
試しに飛んで見ましょう！
https://github.com/buunguyen/octotree

### Private Repositoryへのアクセスを可能にする
#### GitHubの場合

アクセストークンを作成します

`Settings > Developer settings > Personal access tokens`
https://github.com/settings/tokens/new
ここからいけます

設定画面へ進みます。トークンの名前と権限を設定しましょう。

![eee6c0105b1fd4999ce0e770f3ce0fb3.png](https://qiita-image-store.s3.amazonaws.com/0/124015/16fbd6cd-f28f-9514-98fd-974d6efe0f6c.png "eee6c0105b1fd4999ce0e770f3ce0fb3.png")

権限はお好みで設定してください

作成できたトークンをコピーしましょう
![dd56d3f9064de1c0abb5c5a1a5d5abe3.png](https://qiita-image-store.s3.amazonaws.com/0/124015/420b89f4-9466-47fc-92d6-d97e949bc178.png "dd56d3f9064de1c0abb5c5a1a5d5abe3.png")

レポジトリに戻り左側のバーの歯車アイコンをクリック
設定画面で先程コピーしたアクセストークンをコピーして保存すれば終了です！！
![430808787ddee08cae486e8e17b2d148.png](https://qiita-image-store.s3.amazonaws.com/0/124015/c04aafca-89e4-554b-49ab-64f71b88abe7.png "430808787ddee08cae486e8e17b2d148.png")


#### Bitbucketの場合
同様にアクセストークンを作成します
`設定 > アクセス管理 > アプリパスワード > アプリパスワードの作成`
https://bitbucket.org/account/user/${your_account_name}/app-passwords/new
から飛べます

![52805bbc97df63c9353feef1c39bc3a4.png](https://qiita-image-store.s3.amazonaws.com/0/124015/f1d1f1f2-5a97-01bb-32b7-2e5a73f14b89.png "52805bbc97df63c9353feef1c39bc3a4.png")

あとはGitHubと同様にレポジトリにアクセスして設定画面からアクセストークンをコピーすれば完了です！！

---

## 参考
- https://github.com/buunguyen/octotree
Ubuntu16の上で手軽にIntel HLSを使うためにDockerでCentOS7を動かす

タイトルのまま...なのですが，
普段使いのUbuntu 16.04でIntel HLSを使おうとしたところ，gcc-4.4が必要とか32bit環境が必要とか，面倒だったので，Dockerでやりました，というメモ．

実際にやることは，@yukitaketakeさんの
[Intel HLS Compilerを使える状態にする（CentOS編）](https://qiita.com/yukitaketake/items/d78bc18d5e7ba2b5d3b0)のままです．

なお，ホストであるUbuntu 16.04環境の /opt/Intel/intelFPGA_lite/17.1/ 以下にQuartus Prime一式がインストールしてある，という想定です．

## Quartus Prime環境について
Quartus Primeは↓のようにインストールされているはず．

```
% ls /opt/Intel/intelFPGA_lite/17.1
hls/  ip/  licenses/  logs/  modelsim_ase/  nios2eds/  quartus/  uninstall/
```

そのままだと，ModelSimの実行ファイルへのパスが辿れないので，

```
ln -s /opt/Intel/intelFPGA_lite/17.1/modelsim_ase/linux \
      /opt/Intel/intelFPGA_lite/17.1/modelsim_ase/linux_rh60
```

としておく．

## 準備

適当な作業ディレクトリを用意する

```
% mkdir -p $HOME/docker/hls
% cd $HOME/docker/hls
```

とか．

## Dockerファイルの用意

↓の中身の Dockerfile という名前のファイルを$HOME/docker/hlsの下に用意する．

```
FROM centos:centos7
RUN yum -y update
RUN yum -y groupinstall "Development Tools"
RUN yum -y install epel-release
RUN yum -y install which
RUN yum -y install compat-gcc-44 compat-gcc-44-c++
RUN yum -y install glibc.i686 glibc-devel.i686 libX11.i686 libXext.i686 libXft.i686 ncurses-devel.i686
ADD quartus_env.sh /
```

最後にADDしている quartus_env.sh というファイルは環境変数設定用のスクリプト．
↓の内容を， quartus_env.sh というファイルに書いておく．

```
export QSYS_ROOTDIR=/opt/Intel/intelFPGA_lite/17.1/quartus/sopc_builder/bin
export PATH=/opt/Intel/intelFPGA_lite/17.1/quartus/bin:$PATH
export PATH=/opt/Intel/intelFPGA_lite/17.1/qsys/bin:$PATH
export PATH=/opt/Intel/intelFPGA_lite/17.1/modelsim_ase/bin:$PATH

export CPLUS_INCLUDE_PATH=/usr/lib/gcc/x86_64-redhat-linux/4.4.7:/usr/include/c++/4.4.7:/usr/include/c++/4.4.7/x86_64-redhat-linux
```

ここまで，終わると，

```
% pwd
/home/miyo/docker/hls
% ls
Dockerfile  quartus_env.sh
```

と2つのファイルが \$HOME/docker/hls に作成されたことになる (上の例では，\$HOME=/home/miyo/)．

## コンテナの作成と起動

ファイルが用意できたら，コンテナ作って起動．

```
sudo docker build -t user/hls:1.1 .
sudo docker run -v /opt:/opt --name hls-test -i -t user/hls:1.1 /bin/bash
```

ホストの/optをDockerゲスト内でも/optにマウントして使えるようにしている．
exitしたあとは，startでまた起動すればいい．

```
sudo docker start -a -i hls-test
```

## そのあとは
Docker環境で，こんな感じで動作確認．

```
% source /quartus_env.sh 
% source /opt/Intel/intelFPGA_lite/17.1/hls/init_hls.sh 
% cd /root
% cp -r /opt/Intel/intelFPGA_lite/17.1/hls/examples .
% cd examples/counter/
% make
% ./test-x86-64
% make test-gpp
% ./test-gpp
% make test-fpga
% ./test-fpga
```
IoT時代に求められる、SIMカードの管理をAPIで

IoTが巷で盛り上がっていますが、みんな繋がって当たり前だとおもってますよね？
SIMカードで3G/LTE通信をするときには、いろんな面倒な事が起こります。

例えば…
SIMに今割り振られているIPアドレスは？
いまIPセッション張ってる？
SIMの状態は？

そんなときに必要になってくるのが、コネクティビティを管理するプラットフォーム
いろいろなIoTプラットフォームがあふれる中で、CiscoのJasper Control Centerを使ってみようと思います。

![Unknown.png](https://qiita-image-store.s3.amazonaws.com/0/214709/0039ade1-3bd3-bcde-744b-1fbb4e0d3597.png)

まず、このIoTプラットフォームにアクセスするには、ユーザー名とパスワードが必要ですよね。どうやって入手するかというと…
http://devkit.m2m.com
というサイトをご存知でしょうか？Jasper Control CenterプラットフォームとSIMカードを通信事業者から買える？サイトなのです。英語版しかないのと、日本への配送をしてくれるか不明ですが、そんなときは、海外出張でホテルで受け取っちゃうなんていうのもありかもしれません。

Jasper Control CenterのIDを入手したら、パスワードを設定して、いざログイン。ユーザー名をクリックして、ユーザー設定画面で簡単に日本語に設定変更できました。
では、早速APIをつかってみようとおもいます。

ちなみに、アカウントがなくても、API自体は、DevNetにも公開されていました。
https://developer.cisco.com/site/jasper/

冒頭の、SIMに今割り振られているIPアドレスは？いまIPセッション張ってる？については、
GET https://restapi1.jasper.com/rws/api/v1/devices/{iccid}/sessionInfo
で確認できました。lastSessionEndTimeがNULLだとパケット通信セッション継続中ということみたいです。

SIMカードの状態確認は
GET https://restapi1.jasper.com/rws/api/v1/devices/{iccid}

SIMカードの状態変更は
PUT https://restapi1.jasper.com/rws/api/v1/devices/{iccid}

SMSも送れちゃうみたいです。
POST https://restapi1.jasper.com/rws/api/v1/smsMessages

SIM管理をAPIでできるのはわかったけど、実はSOAP/RESTのシュミレータ環境が無い？
そんなときは、SoapUIを使ってみてください。
http://www.soapui.org

ちなみに、上記確認は、(SoapUI 5.3.0)とMAC OS 10.12.6で試してみました。

IoTで発生する問題は、どのレイヤーで問題が発生しているか早急に判断して、対応する必要があります。3G/LTE通信での問題は、このプラットフォームやAPIを使えば、かなりの確度で判断ができそうですね。
gormでGAEから同プロジェクトのcloudSQLに接続

# 答え

```go
import (
	"github.com/jinzhu/gorm"
	_ "github.com/jinzhu/gorm/dialects/mysql"
)

db, err = gorm.Open("mysql", "ユーザー名:パスワード@unix(/cloudsql/インスタンス接続名)/DB名")
```

＊インスタンス接続名は`プロジェクトid:リージョン:インスタンス名`

# 参考

[go-sql-driver/mysql](https://github.com/go-sql-driver/mysql#dsn-data-source-name)
＊gormは内部的にgo-sql-driver/mysqlを使用しているので、困ったらこれ見ると良いと思います。