OmniAICreator/Qiita-1.07M huggingface dataset:
Nuxt.jsで一覧から詳細的な画面に遷移する

# はじめに

[前回](https://qiita.com/FrozenVoice/items/c7bc5464b7a8c77ae104)、APIからの取得結果をストアに入れるようにしたので詳細画面的な物を作ってみる。

# 詳細表示用コンポーネント

```vue:components/ItemDetail.vue
<template>
    <div class="item">
        <div>ID: {{id}}</div>
        <div>名前: {{name}}</div>
        <div>値段: {{price}}</div>
        <div>説明: {{description}}</div>
    </div>
</template>

<script>
    export default {
        name: "ItemDetail",
        props: {
            id: String,
            name: String,
            price: Number,
            description: String,
        }
    }
</script>
```

単純に内容を表示するだけのコンポーネント

# 詳細ページ

```vue:pages/items/_id.vue
<template>
    <div id="app">
        <h1>Nuxt API Test Detail</h1>
        <div class="itemContainer">
            <ItemDetail
                    v-bind:id="items[$route.params.id].id"
                    v-bind:name="items[$route.params.id].name"
                    v-bind:price="items[$route.params.id].price"
                    v-bind:description="items[$route.params.id].description"
            >
            </ItemDetail>
        </div>
        <div class="button">
            <nuxt-link to="/search">戻る</nuxt-link>
        </div>
    </div>
</template>

<script>
    import ItemDetail from '~/components/ItemDetail.vue'
    import { mapGetters } from 'vuex'

    export default {
        components: { ItemDetail },
        head: { title: 'Nuxt API Detail Test' },
        async asyncData({ store, params }) {
            if (!store.getters.fetched) {
                await store.dispatch('fetchItems')
            }
            await store.dispatch('fetchRecommended', params.id);
        },
        computed: {
            ...mapGetters(['items', 'recommended'])
        }
    }
</script>
```

# 詳細への遷移元

```vue:components/Item.vue
<template>
    <div class="item">
        <div>ID: {{id}}</div>
        <div>名前:<nuxt-link :to="`/items/${id}`">{{name}}</nuxt-link></div>
        <div>値段: {{price}}</div>
    </div>
</template>
```

名前の部分から`nuxt-link`で遷移するようにする。

# 結果

|![2018-11-05_22h25_36.png](https://qiita-image-store.s3.amazonaws.com/0/165884/8d989fce-ad5e-003f-de1d-41ac7cbd0fa6.png)|
|:--|

|![2018-11-05_22h26_17.png](https://qiita-image-store.s3.amazonaws.com/0/165884/6d6208d6-1fd9-8670-00b6-e41f01428b31.png)|
|:--|
SORACOM LTE-M ButtonからLINEにメッセージを送る



<blockquote class="twitter-tweet" data-lang="en"><p lang="ja" dir="ltr">LINEメッセージを送るだけのボタン　<a href="https://twitter.com/hashtag/SORACOM?src=hash&amp;ref_src=twsrc%5Etfw">#SORACOM</a> <a href="https://twitter.com/hashtag/AWS?src=hash&amp;ref_src=twsrc%5Etfw">#AWS</a> <a href="https://twitter.com/hashtag/%E3%81%82%E3%81%AE%E3%83%9C%E3%82%BF%E3%83%B3?src=hash&amp;ref_src=twsrc%5Etfw">#あのボタン</a> <a href="https://t.co/um7n7UMKjM">pic.twitter.com/um7n7UMKjM</a></p>&mdash; Kosuke Koiwai (@kocko) <a href="https://twitter.com/kocko/status/1059433195081330688?ref_src=twsrc%5Etfw">November 5, 2018</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>



やったことは、[LINEのAPI](https://developers.line.me/ja/reference/messaging-api/#anchor-fa99cafa93ac4294d83cd7b89b60c822c1dafa9b)に登録して、[SORACOM LTE\-M Button powered by AWS をクリックしてSlackに通知する \| Getting Started with SORACOM LTE\-M Button \| SORACOM Developers](https://dev.soracom.io/jp/start/aws_button_slack/) の、Lambdaのソースコードを下記に変えただけです。


```js
const https = require('https');

exports.handler = (event, context, callback) => {
    console.log('Received event:', JSON.stringify(event, null, 2));

   // var text = event.stdEvent.clickType;

    var payload = {
        "to": [process.env.RECIPIENT_LINE_ID],
        "messages": [{
                "type": "text",
                "text": "こんにちは! LTE-M Buttonが押されたよ！"
            }
        ]
    }

    var body = JSON.stringify(payload);

    var req = https.request({
        hostname: "api.line.me",
        port: 443,
        path: "/v2/bot/message/multicast",
        method: "POST",
        headers: {
            "Content-Type": "application/json",
            "Content-Length": Buffer.byteLength(body),
            "Authorization": "Bearer " + process.env.CHANNEL_ACCESS_TOKEN
        }
    }, function(res) {
        if (res.statusCode === 200) {
            console.log('Posted to LINE');
            callback(null, { "result": "ok" });
        }
        else {
            callback(false, { "result": "ng", "reason": 'Failed to post to LINE ' + res.statusCode });
        }
        return res;
    });
    req.write(body);
    req.end();
};

```

Lambdaの環境変数は、下記2点。
<img width="534" alt="スクリーンショット 2018-11-05 22.42.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/135431/9c45ca9d-1527-fb39-2309-8ea16e29218c.png">

　いずれも、LINEのチャネル基本設定から参照します。
アクセストークンは、ロングタームトークンの「再発行」を押すと発行できます。

<img width="853" alt="スクリーンショット 2018-11-05 22.43.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/135431/e35e7ee5-3205-9900-61fd-f21ad6ee4368.png">
 <img width="1046" alt="スクリーンショット 2018-11-05 22.44.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/135431/6f16f154-ea14-cb70-c72f-595b11b70288.png">
Utilityサービスに関して

##Utilityサービス
Utilityサービスとは便利機能を提供するサービスらしい。

>ユーティリティ (Utility) は、英単語で、「役に立つもの」「有用性」「効用」「公益」などの意味。 住宅建築におけるユーティリティールーム（家事室）のこと。
[wikipedia](https://ja.wikipedia.org/wiki/%E3%83%A6%E3%83%BC%E3%83%86%E3%82%A3%E3%83%AA%E3%83%86%E3%82%A3)

このクラスのメンバーは4つ
####newBlob
新しいブロブを作成する。そのままだ。。
スプレットシートをCSVにしたりもできるらしい。

スプレットシートを2次元配列で取得して
CSV形式の文字列を作成、
そこからCSV形式のBlobオブジェクトを生成する。

しかし、newBlobはUTF8形式で作られるので、
setFormatStringを使ってShift-JISにしないと文字化けします。

#####Blobに関して
こいつには私もハマったので、ここに記載する。




####parseCsv
これはすごい便利！
CSVの中身をとりだして2次元配列にしてくれる！

####unzip
zipファイルを解答する

####zip
対象の**フォルダ名**を**ファイル名**として、zipファイルを作成する。
Nimのバックエンドコンパイラごとのベンチマーク

# はじめに

https://qiita.com/tlllune/items/0472fc5546e40b5ad5f4
https://qiita.com/kubo39/items/0b7ebd33c60bff0e86a2
お二人の記事を見たのとたまたま[icc](https://ja.wikipedia.org/wiki/Intel_C%2B%2B_Compiler)を手に入れたので。
コンパイラ3種類 x オプション3種類です。

# 環境
i7-4600U 2.10Ghz
メモリ12GB

Nim 0.19.0

clang 6.0.0
gcc 7.3.0
icc 10.0.0.117

nim.cfgはコンパイラをclangにしているぐらいで、他はデフォルトのままです。

# コード

ほぼ変えていません。

```nim:bench.nim
import math, times

const max = 10000000

var
  sins, coses, num: float64 = 0.0
  bTime = epochTime()

for i in 0..<max:
  num = float64(i)
  sins += sin(num)
  coses += cos(num)

echo epochTime() - bTime
echo sins
echo coses
```

面倒なのでこんな感じのスクリプトを書きました。
変なechoは見栄えの問題です。

```bash

#!/bin/bash

file="bench.nim"
define=""
optimize=""

nim c -f "$define" "$optimize" --hints:off --verbosity:3 --cc:gcc -o:"gcc_bench" "$file"
nim c -f "$define" "$optimize" --hints:off --verbosity:3 --cc:icc -o:"icc_bench" "$file"
nim c -f "$define" "$optimize" --hints:off --verbosity:3 --cc:clang -o:"clang_bench" "$file"

echo "gcc"
time ./gcc_bench
echo ""

echo "icc"
time ./icc_bench
echo ""

echo "clang"
time ./clang_bench
echo ""
```

# 結果
特にオプションなし、一番早いと思われるパターン、一番実行ファイルのサイズが小さくなると思われるパターンの三種類。

オプションなし

```
gcc
0.8050589561462402
1.535343615350497
1.338538979005332

real    0m0.806s
user    0m0.803s
sys     0m0.000s

icc
0.5420560836791992
1.535343615350506
1.338538979005383

real    0m0.543s
user    0m0.543s
sys     0m0.000s

clang
0.7779979705810547
1.535343615350497
1.338538979005332

real    0m0.779s
user    0m0.777s
sys     0m0.000s
```

-d:releaseのみ


```
gcc
0.369373083114624
1.535343615350497
1.338538979005332

real    0m0.370s
user    0m0.363s
sys     0m0.004s

icc
0.4971959590911865
1.535343615350506
1.338538979005383

real    0m0.498s
user    0m0.498s
sys     0m0.000s

clang
0.4085111618041992
1.535343615350497
1.338538979005332

real    0m0.409s
user    0m0.408s
sys     0m0.000s
```

-d:release --opt:size

```
gcc
0.362727165222168
1.535343615350497
1.338538979005332

real    0m0.364s
user    0m0.363s
sys     0m0.000s

icc
0.4959828853607178
1.535343615350506
1.338538979005383

real    0m0.497s
user    0m0.495s
sys     0m0.000s

clang
0.4034528732299805
1.535343615350497
1.338538979005332

real    0m0.404s
user    0m0.404s
sys     0m0.000s


サイズ
gcc 51kB
icc 69kB
clang 51kB
```

# 結論
gccの最適化がすごい(小並)。
逆にiccはもともとそれなりに速いけど、あんまり最適化の効果が無い(たぶんコードにもよる）。
あとiccだけ計算結果が違う。
一応uccでもコンパイルしたんですが、実行ファイルのサイズがclang(デフォルト)と1バイト単位で同じになった上に、一切コンパイルメッセージが出なかったので、おそらくちゃんとコンパイル出来てないので消しました。

[対応しているコンパイラのリスト](https://nim-lang.org/faq.html)
どなたかvccとかで試してみて下さい。

ちなみにリストに入ってないやつでも動くかもねって書いてありますが、ccでコンパイルしようとすると`Error: unknown C compiler`と出たので、対応してないコンパイラを使おうと思うとnimcacheから手でコンパイルする必要がありそうです。
laravelでリダイレクト時にフリーズしてしまった

laravelでの開発時にリダイレクトをする時に、フリーズしてしまう事象が発生しました。
エラーログを見ましたが、何もエラーが出ませんでした。vagrant上では動いていたので、同じコードで
なぜ動かないのか疑問でした。

#### エラー内容
This Site Can’t Be Reached"
動かなくなった後に、出力されたエラーになります。

#### 原因 (Cookieをセットする箇所でsecure()を使っていなかった)
```
redirect('/')
```

####  対処法
```
redirect()->secure('/')
```
上のように置き換えたところ、うまく動作しました。HTTPSの環境で必要みたいです。
駆け出しエンジニアがJUnitを基礎から学んでみた

駆け出しエンジニアが自主学習の一環でつらつらと…
ご参考までに。

#JUnitとは
Javaのユニットテスト(単体テスト)を行うためのフレームワーク

#そもそもユニットテストとは
クラスやメソッドを対象としたプログラムを検証するためのテスト

#ユニットテストの種類
####ホワイトボックステスト
- 対象となる関数やメソッドの内部のロジックについて考慮して、分岐などが正しく機能しているかを確認できるテストケースを設計する
- コード自体を理解しているプログラマ自身がテストを行うことが多い

####ブラックボックステスト
- 内部のロジックについては考慮せず、外部仕様のみからテストケースを設計する
- コードそのものへの理解よりかは、そのプログラムが要件を満たしているかどうかを判断できることが求められる

ブラックボックステストには、以下の2種類の技法が存在する
######同値分割法
同じような結果をもたらす値を同じグループとし、各グループからテストデータを選択するテスト技法
######境界値分析
異なる結果をもたらす値に着目し、境界値の近傍よりテストデータを選択するテスト技法

#テストクラスとテストメソッド
テストクラス名は「テスト対象のクラス名+Test」とするのが一般的

```java
// テスト対象クラス(Target.java)
public class Target {
}
// テストクラス(TargetTest.java)
public class TargetTest {
}
```

#テストメソッドの記法
```java:TargetTest.java
@Test
public void Test() throws Exception {
// テスト対象となるクラスやメソッドの検証
}
```

- publicメソッドとする
- @org.junit.Testを付与する
- 戻り値はvoidとし、引数は持たない

#比較検証
実測値(actual value)と期待値(expected value)が一致するか否かを検証するしくみを**アサーション**と言う

```java
// テストコード
String expected = "xxx";
String actual = yyy.zzz();
assertThat(actual, is(expected));
```

<br>
(参考) https://books.rakuten.co.jp/rb/12058050/
<br>
GASでgmail の情報を抜き出す

```javascript:extractGmail.gs
function extractGmail() {
  
  /* Gmailから特定条件のスレッドを検索しメールを取り出す */
  var terms = 'label:all subject:hoge fuga';
  var msgs = [];
  var threads = GmailApp.search(terms); //スレッドを取得
  var mails = GmailApp.getMessagesForThreads(threads); //スレッドからメールを取得する　→二次元配列で格納
  
  /* 各メールから日時、送信元、件名を取り出す*/
  for(var j = 0;j < mails.length;j++){
    msgs[j] = [];
    msgs[j][0] = mails[j][0].getFrom();
    msgs[j][1] = mails[j][0].getDate();
    msgs[j][2] = mails[j][0].getSubject(); 
  }
  
  /* スプレッドシートに出力 */
  if(mails.length>0){
    SpreadsheetApp.getActiveSheet().getRange(1, 1, j, 3).setValues(msgs); //シートに貼り付け
  } 

}
```
駆け出しエンジニアがネットワークを基礎から学んでみた

駆け出しエンジニアが自主学習の一環でつらつらと…
ご参考までに。

#前提知識
- ネットワークの分類
   - WAN(Wide Area Network)
   - LAN(Local Area Network)
- DHCP(Dynamic Host Configuration Protocol)
   - ルータが自動的にプライベートIPアドレス(192.168.0.0~192.168.255.255がよく利用される)を割り振る機能
- NAT(Network Address Translation)
    - ルータが、プライベートIPアドレスをWAN環境でも利用できるグローバルIPアドレスに変換すること
- クラウド(コンピューティング)
    - インターネット上にサーバを置き、インターネットを介して共有する利用形態

| クラウドの種類 | 概要 |
|:-:|:-:|
| SaaS(Software as a Service)  | インターネット上のアプリケーション  |
| PaaS(Platform as a Service)  | OSなどのプラットフォーム  |
| IaaS(Infrastructure as a Service)  | サーバなどのハードウェア  |

- 様々なネットワークの形態
    - クライアントサーバシステム
    - ホスト集中型システム
    - イントラネットとエクストラネット
        - VPN(Virtual Private Network)により、遠隔でも該当ネットワークを利用できる

#インターネットの仕組み
- URLの構成 ( http://www.google.co.jp を例に)
    - http -> コミュニケーションプロトコル
        - httpsは、通信を暗号化し、安全にする
        - その他にも、ftpやmailto、fileなどがある
    - www.google.co.jp ドメイン名、FQDN(Fully Qualified Domain Name)
        - www -> 第4レベルドメイン
        - google -> 第3レベルドメイン
        - co -> 第2レベルドメイン(組織の種類を指定する)
        - jp -> トップレベルドメイン(分野や国で分類)
- DNS(Domain Name System)の存在
    - Webブラウザに入力されたURLをIPアドレスに変換してくれる(名前解決)
- IPv4からIPv6へ
    - １つのネットワーク上に存在するIPアドレスはすべて異なるものでなければならない
    - IPv4(xxx.xxx.xxx.xxx) -> $256^4$ ≒ 43億のIPアドレスまで指定可能
    - IPv6(xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx) -> ほぼ無限大
- IPアドレスの種類
    - グローバルIPアドレス
        - インターネット上のWebサーバやメールサーバに割り当てられ、固有のもの 
    - プライベートIPアドレス
        - オフィスや家庭など閉じられたネットワーク内で使われるIPアドレス
        - ネットワークが異なれば無限に存在する

#TCP/IPの階層化
インターネットで標準的に利用される2つの通信プロトコルであるTCPとIP以外にも様々なプロトコルが存在し、それらを4つの階層ごとにわけたものをTCP/IP階層モデルと呼ぶ

| 階層 | 概要 | プロトコルの例 |
|:-:|:-:|:-:|
| アプリケーション層  | インターネットのサービスを実現する実際的なアプリケーション  | HTTP,HTTPS,SMTP,POP3,SSH,FTPなど  |
| トランスポート層  | ポート番号の指定やエラー訂正などの役割を受け持つ  | TCP  |
| インターネット層  | どのようにしてインターネット上でデータを受けわたすかという中継の仕組みを受け持つ  | IP  |
| ネットワークインターフェイス層  | ネットワーク上で直接接続される機器同士のしくみを規定  | イーサネット、Wi-Fi  |

- データは、アプリケーション層からネットワークインターフェイス層まで順にヘッダ情報が付与(カプセル化)されて送信され、ネットワークインターフェイス層からアプリケーション層まで順にヘッダ情報が削除(非カプセル化)されて受信される

<br>
(参考) https://books.rakuten.co.jp/rb/15553483/
<br>
devDependencies と dependencies を使い分けず pkg でのビルドに失敗した


# 正しい例

```json:package.json
{
  "name": "hogehoge",
  "scripts": {
    "build": "npm run-script build:view && npm run-script build:bin",
    "build:view": "react-scripts build",
    "build:bin": "pkg .",
    "start": "react-scripts start",
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "dependencies": {
    "carlo": "^0.9.11"
  },
  "devDependencies": {
    "react-scripts": "^2.1.1",
    "pkg": "^4.3.4"
  },
  "homepage": "https://domain",
  "bin": {
    "hogehoge": "index.js"
  },
  "pkg": {
    "assets": "build/**/*",
    "targets": ["node8"]
  }
}
```

# おこる間違い

上記の `devDependencies` に書かれたものを `dependencies` に入れると
`pkg` はそれらもファイルに含めてしまう。
余計な容量が増えるしブラウザ向けの ( `es-module` で書かれた ) コードなどを読もうとしてエラーが発生する場合がある。
Google広告数値をスプレットシートへ転記する

##はじめに
AdwordsAPIに関する情報が少なすぎる！！
今、ネットにあるスクリプトを貼ってもエラーが返ってきたり、そのまま使えるものが少なかったので
調べました。

広告代理店はレポーティングに時間を取られすぎだと思う。
こんな作業はさっさと自動化して、もっと成果が出ることに時間を使おう！

##動作環境
AdWords＞一括管理＞スクリプト
で新しいファイルを作成して、貼り付けるだけ。
時間のトリガーはGoogleさんが用意してくれているので、お好きな時間で。
数値の戻りなんかも加味して、私は6時ぐらいにしてます。

##説明
シンプルなスクリプトです。
転記したいスプレットシートIDとシート名を入れて、
SELECT行に出力したい項目を入れるとそのレポートが吐き出されます。

あとは
FROM　レポート単位(アカウントかキャンペーンかグループか)
WHERE　条件(インプレッション0はなし)
DURING　期間　
で指定。

Yahooの数値と混ぜて
あとピポッドテーブルがしやすいように、
媒体列を追加しました。



```js:demo.gs
function main() {
  
  //出力先指定
  var ss = SpreadsheetApp.openById("*スプレッドシートID*");
  var sh = ss.getSheetByName("*シート名*");
  
  //日時
  var date = new Date();
  var today = Utilities.formatDate(date,"JST","yyyy/MM/dd");
  var yesterdayRaw = new Date(date.getTime() - 24 * 60 * 60 * 1000);
  var yesterday = Utilities.formatDate(yesterdayRaw,"JST","yyyyMMdd");
  
  //出力
  var report = AdWordsApp.report("SELECT Date, Device, Impressions, Clicks, Cost, AveragePosition, SearchImpressionShare, AdNetworkType1 " +
                                 "FROM ACCOUNT_PERFORMANCE_REPORT " +
                                 "WHERE Impressions > 0 " +
                                 "DURING  20180814," + yesterday);
  
  report.exportToSheet(sh);//選択した項目をスプレッドシートへ出力
  
  var lastRow = sh.getLastRow();//最終行を取得
  
  sh.getRange(1,9,1,1).setValue("Source");//A列の識別用の媒体列を追加
  sh.getRange(2,9,lastRow-1,1).setValue("Google");//A列の識別用の媒体列を追加
  
  Logger.log("完了");
}
```
自分の給料はどのように決まるの？

# 計算式
まず、労働者の給料を決めるにあたって、次のような計算式があります。

```
給与額 = 限界利益 * 労働分配率
```

```
限界利益 = 売上額 - 変動費
```

# イメージ図
図にすると以下のようになります。
![2018-11-06_19h23_21.png](https://qiita-image-store.s3.amazonaws.com/0/204910/344e0dd1-f244-06d7-9224-8fc52970fe7f.png)


# 用語説明
次に、計算式の各項目について説明します。
今回は、給料を計算する上で最低限の用語のみ言及しています。

### 変動費
売上高に比例して発生する費用のこと。
逆に、売上がないと発生しない費用です。
なので、今回は労働者が稼動すると発生する費用を変動費としましょう。
例) 交通費、残業費
### 固定費
売上高の増減に関係なく発生する費用のこと。
例) 事務、営業費
### 限界利益
売上高から変動費を引いたもの。
もしくは、固定費と利益を足したもの。
### 労働分配率
限界利益に占める人件費の比率のこと。

労働分配率は、40%～60%が適正な比率ですね。
人材ビジネス（SES、派遣など）だと、60〜70%が平均と言ったところでしょうか。

# 単価50万円の場合の給料は？
では、実際に例を挙げて給与を計算してみましょう。
請負案件の場合、考慮しなければならない要因が多々あるため、SESで一定単価の案件を例に挙げてみました。

## 前提
事業：SES事業
形態：委任
単価：50万

変動費 : 5万
労働分配率 : 50%

## 計算



```
売上 - 変動費 = 限界利益
50万 - 5万 = 45万

限界利益 × 労働分配率 = 給料
45万 * 70% = 31.5万
```

# 最後に
労働分配率は高いけど貰っている給与が低かったら、あなたの単価が低いことになります。
逆に、単価は高いけど貰っている給与が低かったら、労働分配率が低い、つまり会社の吐き出しが悪いと言えるでしょう。

3年前の話ですが、
単価の高い案件が取れなかった時は、労働分配率を上げて、相場より少し高い給料を頑張って渡していました。
単価が高く、条件も良い案件が取れるようになると、労働者が集まり、利益も上がって嬉しかったものです。笑


給与の計算方法は分かったけど、そもそも自分の単価が分からないという方は、次回の記事をお楽しみください。

次回：知らせざるIT業界の実態
JSONDecoderでdecodeできる文字コードについて

Swift4.0から利用可能となったCodable、便利ですよね。
Codableを用いたJSONのデコードで文字コードが原因となるエラーが発生したのでその原因と対処法を書きます。

## 発生したエラー
Codableを用いてData型をデコードする際にJSONDecoderでShift_JISで返ってきたJSONをdecodeしようとしたら 次のようなエラーが発生しました。

```
Thread 16: Fatal error: 'try!' expression unexpectedly raised an error: Swift.DecodingError.dataCorrupted(Swift.DecodingError.Context(codingPath: [], debugDescription: "The given data was not valid JSON.", underlyingError: Optional(Error Domain=NSCocoaErrorDomain Code=3840 "Unable to convert data to string around character 1635." UserInfo={NSDebugDescription=Unable to convert data to string around character 1635.})))
```

どうやらData型からString型への変換に失敗している模様です。

## 原因
原因はJSONがShift_JISでエンコードされていたからでした。
ではなぜShift_JISはだめなのか、何ならいいのか調べてみました(UTF-8使うの当たり前じゃんという話は悲しくなるので言わないでください)

まずJSONをデコードする際に以下のようなコードを書くと思います。

```Swift
JSONDecoder().decode(T.self, from: data)
```
この`decode`関数にdataを渡しています。
では`decode`関数の中では何をやっているのでしょうか。
Swiftのコードを見に行くと以下のようになっています。

```Swift
open func decode<T : Decodable>(_ type: T.Type, from data: Data) throws -> T {
    let topLevel: Any
    do {
        topLevel = try JSONSerialization.jsonObject(with: data)
    } catch {
        throw DecodingError.dataCorrupted(DecodingError.Context(codingPath: [], debugDescription: "The given data was not valid JSON.", underlyingError: error))
    }

    let decoder = _JSONDecoder(referencing: topLevel, options: self.options)
    guard let value = try decoder.unbox(topLevel, as: type) else {
        throw DecodingError.valueNotFound(type, DecodingError.Context(codingPath: [], debugDescription: "The given data did not contain a top-level value."))
    }

    return value
}
```

内部的で`JSONSerialization.jsonObject(with: data)`を呼び出していました。
次はJSONSerializationの`jsonObject`関数を見てみます。

```Swift
    /* Create a Foundation object from JSON data. Set the NSJSONReadingAllowFragments option if the parser should allow top-level objects that are not an NSArray or NSDictionary. Setting the NSJSONReadingMutableContainers option will make the parser generate mutable NSArrays and NSDictionaries. Setting the NSJSONReadingMutableLeaves option will make the parser generate mutable NSString objects. If an error occurs during the parse, then the error parameter will be set and the result will be nil.
       The data must be in one of the 5 supported encodings listed in the JSON specification: UTF-8, UTF-16LE, UTF-16BE, UTF-32LE, UTF-32BE. The data may or may not have a BOM. The most efficient encoding to use for parsing is UTF-8, so if you have a choice in encoding the data passed to this method, use UTF-8.
     */
    open class func jsonObject(with data: Data, options opt: JSONSerialization.ReadingOptions = []) throws -> Any
```
ここに答えが書いてありました。
`jsonObject`関数はUTF-8, UTF-16LE, UTF-16BE, UTF-32LE, UTF-32BEしかサポートしていないよと書いてあります。
そのため、Shift_JISでのデコードに失敗していました。

## 対処法
最良の方法はそもそもJSONをShift_JISでエンコードせずにUTF-8でエンコードすることでしょう。
が、やむにやまれぬ事情などでJSONはどうしてもShift_JISでエンコードされてしまう、というときには次のように単純にエンコードを無理やり変えてあげればCodableを使うことができます。

```Swift
let shiftJisJsonString = String(data: self, encoding: .shiftJIS)
let utf8Json = shiftJisJsonString.data(using: .utf8)
```
しかしこれは本当に最後の手段にしたいところです...
PythonとKerasでDeep Learning入門（1） （Colaboratory導入編）

何番煎じか分かりませんが，Kerasを使用したDeepLearningの入門編です．

この記事の内容は学習用パソコンが無い人向けに環境構築をするためのお話です．

DeepLearningでそれなりのものを学習しようとすると，GPUとある程度のRAMが必要です．
そのため，まずは学習用のPCを揃える必要があり，入門者にとっては敷居が高いと言えます．

しかし，私のような貧乏大学生は常に慢性の金欠病であり，お財布が床に臥せている状態ですので，PCを調達するにはいささか限界を感じざるを得ません．

そこで，PCを調達するのではなく，ブラウザ上で無料で学習をする方法をとります．

それがGoogleが機械学習の教育や研究用に提供している「Colaboratory」です．

Colaboratoryのメリットは以下の通りです．
・すぐに使えて，とにかく導入が容易である．
・最初からTensolflowやKerasを使うことが可能である．
・GPUが使える．
・Jupyter notebook環境で使える．

ブラウザ上で学習できるのは他にもAWSやIBM Cloudがありますが，今回はこれらのメリットからColaboratoryを使っていきます．


それでは環境を整えていきましょう．

まずは以下のURLからGoogle Colaboratoryへ飛びます．
https://colab.research.google.com/notebooks/welcome.ipynb#scrollTo=FlQq0SUepQbd
![スクリーンショット (48).png](https://qiita-image-store.s3.amazonaws.com/0/149593/97b783ee-ee72-2183-e81f-1ccd6e017e16.png)

すると，このようなサイトに飛ぶと思います（googleアカウントでログインが必要かもしれません）．


それでは試しにプログラムを実行してみましょう．
下の方にいくと下図の赤線で囲まれた箇所があります．
![スクリーンショット (51).png](https://qiita-image-store.s3.amazonaws.com/0/149593/20c2c346-f1b5-4a25-e692-e1430bcf2ad4.png)
このグレーになっているセルを下図のようにHello worldを出力するプログラムに変えて，Shift + Enterを押してみましょう．
![スクリーンショット (52).png](https://qiita-image-store.s3.amazonaws.com/0/149593/2d27570f-2ec9-3bde-4437-eb9442a09c11.png)
セルの下に書いた文字が出力されれば成功です．


ColaboratoryはJupyter notebook環境となっており，このように，グレーのセルにプログラムを書き，Shift + Enterで実行できます．
端末で実行する方法とは異なり，Matlabで書くのに近い感覚です．

Jupyter notebookの使い方はここに書くには多すぎるため，適宜調べてください．



それでは最初に書いてあるサンプルを全て消して綺麗な状態にしましょう．

「編集」→「すべてのセルを選択」をクリック
![スクリーンショット (55).png](https://qiita-image-store.s3.amazonaws.com/0/149593/47fa6acf-679d-0122-db78-a5ec77e2d7c8.png)

次に，「編集」→「選択したセルを削除」をクリック
![スクリーンショット (56).png](https://qiita-image-store.s3.amazonaws.com/0/149593/0e4a4a35-3b8f-0cf2-a98b-52f6dc837202.png)
するとこのように無駄なものが無いまっさらな状態になります．これでプログラムを書いていきましょう．
![スクリーンショット (57).png](https://qiita-image-store.s3.amazonaws.com/0/149593/57a87886-9550-1efc-dd06-793f0c1121cc.png)

プログラムを書くためのセルは左上の「＋コード」をクリックすれば出てきます．
![スクリーンショット (58).png](https://qiita-image-store.s3.amazonaws.com/0/149593/fc8ea25d-db33-286c-e1e2-c0ccfab3aae6.png)




この時点で既に学習できる環境は整っていますが，デフォルトではGPUが使用できないので，設定をします．
以下の図のように，サイトの左上の「ランタイム」→「ランタイムのタイプを変更」→「ノートブックの設定」→「ハードウェアアクセラレータ」を「None」から「GPU」に変更→「保存」
とすることでGPUが使えるようになります．
![スクリーンショット (50).png](https://qiita-image-store.s3.amazonaws.com/0/149593/7e14b311-40f3-9cae-f850-9719cb017029.png)
![スクリーンショット (49).png](https://qiita-image-store.s3.amazonaws.com/0/149593/99c294de-56af-2103-edab-0f1d66446652.png)



確認のために，セルを追加して

from tensorflow.python.client import device_lib
device_lib.list_local_devices()

を実行してください．
下図のように「device_type: "GPU"」と書いてあればGPUが使える状態になっています．
![スクリーンショット (61).png](https://qiita-image-store.s3.amazonaws.com/0/149593/36bd6e35-7cfd-16f6-43b4-6e07eac2995e.png)


もし下図のようにGPUが書かれておらず，CPUの記述しかない場合は設定が間違っているのでもう一度設定し直してみてください．
![スクリーンショット (59).png](https://qiita-image-store.s3.amazonaws.com/0/149593/e2fc4226-2863-152f-5953-0fb6f42dfef4.png)


さて，これでColaboratoryの導入は終了し，DeepLearningができる環境が整いました．

次回は実際に学習をしてみたいと思います．
https://qiita.com/ReoNagai/items/161dbd59219a8b904785
AWSの単語メモ（初心者向け）

#【経緯】
社内もくもく会にてAWSをさらっと触りました。
参考にするサイトや記事と実際に画面レイアウトが変わっていたり、新しい技術がぽんぽん更新されているAWSさんなので、この知識がどれだけ役に立つか分かりませんが、メモとして残しておきます。

# 【用語】
__■EC2(Amazon Elastic Compute Cloud)__
仮想サーバ。
GUI上でAWSが用意してくれているインスタンス（イメージディスクのようなもの？）を選択することで、既に構成されている色んな環境のOS＋ミドルウェアを使える。
コマンドラインから色々設定しなくて良いし環境をぶっ壊すこともないので非常に楽。

__■RDS(Amazon Relational Database Service)__
AWS上で使えるデータベース。
面倒なMySQLの書式設定とか言語設定とかをGUI上で操作出来る。
コマンドラインから色々設定しなくて良いので最高に楽。

__■リードレプリカ__
読み取り専用のRDS。RDS内で参照しかしない物とか、頻繁に参照する物とかをリードレプリカとして持って置き、高速で読み出せたりする。冗長化的な機能も兼ね備えている（RDSが死んだらリードレプリカをRDSと見なして動く？）らしい。

__■ELB(Elastic Load Balancing)__
ロードバランサー。アクセスが集中した場合に負荷を分散する機能。

__■VPC(Amazon Virtual Private Cloud)__
仮想ネットワーク上にプライベートなネットワークを提供する機能。

__■IGW(Internet Gateway)__
VPCとVPC以外のネットワークを繋ぐ門のようなイメージ。

__■Route53__
ドメインの取得と設定を行う機能。

__■S3(Simple Storage Service)__
AWSのクラウド上にあるストレージサービス。
ファイルサーバみたいなイメージ。

__■リージョン__
AWSの地域に紐づく拠点（データセンター）のようなもの

__■アベイラビリティーゾーン__
リージョン内にある物理的に離れた個々のデータセンターの名称

__■Lambda__
何かしらかのイベントによってAWS上で処理を自動実行する機能。
ファイルがアップロードされたら何かする、とか変更があったら何かする、とか。
実際に何をするかはAWS上でスクリプトとして実装したりアップロードしたりする。

__■ElastiCache__
キャッシュサーバ。
MemcachedとかRedisに準拠するサーバノードのデプロイと実行を簡単に実行できる機能。有料。

#【結論】
インフラはやっぱり単語が多くて難しい……。
基本的なネットワーク周りやインフラ知識がないとそもそも（おそらく初心者向けの）記載内容の単語も理解出来なかったり、どうしてそんな設定をしているのか分からなかったり。
片っ端から調べると時間がかかるので社内のAWS経験者にほぼマンツーマンみたいな形で解説してもらうこともしばしばありました。
個人的に触っている時はCUIでコマンド入力したりファイル操作したりするのも楽しかったですが、クラウド上でGUIで触れるとやっぱ楽だなあと思います。ちょくちょく個人的に触っていきたいです。

## 【参考】
・https://qiita.com/hiroshik1985/items/9de2dd02c9c2f6911f3b
・https://dev.classmethod.jp/cloud/cm-advent-calendar-2015-aws-re-entering-vpc/
どうしてPATHを通さないといけないのか

# TL;DR;

コマンドを打った時、その実体となる実行可能ファイル（exeなど）がどこにあるのか探しに行く先が環境変数`PATH`だから

# 初めに

ソフトウェア開発の入門書などを読んでいると、「PATHを通しましょう」と言われますよね。環境変数のあれです。いわゆるおまじないですが、なんでこんなことしなきゃいけないのかについて？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280975/11f216fe-9a90-902d-d8a5-d16bb77fd7f7.png)

1. 環境変数のPATHとファイルのパスがややこしいので、ここでは前者をPATH、後者をパスと書きます。
3. Win/Linux/Mac 大体同じです。少なくとも考え方は同じです。一応パスなどはWindows流で書いてます。

# そもそも環境変数とは




「変数=値のリスト」の形式でシステムに値を登録しておく手段です。
例えば```MAIL=hoge@example.com```としておけば、cmdで```MAIL```と打てば長たらしいアドレスを打たなくて済むわけです。グローバル変数みたいなもんです。（OS全体で共有されるもの、ユーザー内だけで共有されるもの、そのプロセスだけで共有されるもの等ありますが、今回は気にしません。OSまたはユーザーの設定だと思ってください）

他にも、プログラム中にハードコードできないパスワードや、マシンによって変わるIPアドレスなどを環境変数に逃がして、プログラム中から参照できるようにしたりします。

# プログラムの起動の仕方

cmdをはじめ、プログラムを起動するには

現在のディレクトリが```c:\hoge\```で、その中に```huga.exe```があるなら、

```
$ huga.exe
```

と打てばOK。

また、面倒ですが、

```
$ c:\hoge\huga.exe
```

カレントディレクトリが```c:\piyo\```でさっきの```hoge.exe```を呼びたいなら相対パスで

```
$ ..\hoge\huga.exe
```

または絶対パスで

```
$ c:\hoge\huga.exe
```

となります。階層が深いと大変です。

これは、OSがプログラム名（コマンド）からプログラムのファイル実体を探しに行く先が、基本的にカレントディレクトリだからです。

# PATHの役割

カレントディレクトリにないものは、絶対パスや相対パスで打つことになります。しかし例えば```ssh```（リモート操作のプログラム）なんかは毎回毎回```ssh.exe```のあるディレクトリに移動するか、```c:\Program\Openssh\bin\ssh.exe```なんて長たらしく打ってられません。そこでOSに「もう```c:\Program\Openssh\bin\```はカレントディレクトリじゃなくても探してよ」と伝えましょう。cmdを再起動すれば、```ssh```とだけ打てばよくなります。

この時OSに伝えたいディレクトリがPATH変数の中身です。OSがPATHを見て、「ここと、ここと、ここにsshがあるかもしれないから探そう」としてくれます。

モチロン、自動で探して欲しいディレクトリなんて沢山あるので、PATH変数の中身はセミコロン区切りで複数のパスを入れられるようになっています。

因みに```.exe```も省略できるようになってます。

# いいや、俺は絶対パス打つからいいよ！

ダメです。

cmdで実行するときはそれでもいいかもしれませんが、他のプログラムの中でそれを呼び出したい場合があります。例えば```git```の中では```ssh```を呼び出します。gitの開発者はあなたのPCの中の```ssh.exe```の場所なんて知る由もありませんから、PATHに自分で登録してね！ということになっているのです。（インストーラがうまいことやってくれたりもしますが…

# 活用

自分で便利ツールを作ったとしましょう。実行すると「maki」と表示される```yuka.exe```です。これは頻繁に使いますね。
ファイルの在りかは```c:\hogehoge\piyopiyo\znd\znd\yee\yuka.exe```

絶対パスでなんて打ちたくないですね！

環境変数PATHに```c:\hogehoge\piyopiyo\znd\znd\yee```を登録、すると

```
$ yuka
maki
```

こんな感じです。公開されているプログラムだと大体インストーラが（Linuxならmakeとかyum、apt-get）がやってくれてますが。中では環境変数PATHに登録してくれているので、何も考えずにコマンドが使えるようになっていたのです。

javacもadbもpythonもみんな実体となるexeがどこかにあって、PATHにディレクトリが登録することで、普通のコマンドと同様に使えるようにしてるのです！

# 環境変数が格納されているメモリについて

スタック領域内の、`main`関数の関数フレームよりも前（アドレス値としてはより大きい方）に格納されています。これは以下のようにすることで簡単に確認できます。

```c
auto dummyData = '.';
char* ptr = &dummyData;
while(true)
{
  cout << *ptr << ends;  flush(cout);
  ptr++;
}
```

https://onlinegdb.com/-lgAGFHSi

https://www.installsetupconfig.com/win32programming/processtoolhelpapis12.html

# プロセスの環境変数を書き換えた場合は？

先述の通り、環境変数の文字列本体はスタック領域に格納されていました。スタック領域は必要な分だけギチギチに詰まっているので、中身のデータ領域を拡張することはできません。

では、`putenv`関数は一体何なのでしょうか？答えは単純で、引数に渡したポインタの差す領域が、その環境変数の領域としてそのまま使用されます。そのため、`putenv`に渡した文字列は解放してはいけませんし、`getenv`で取得したポインタは、あくまでその瞬間の値へのポインタであり、その後環境変数が変更された場合そのポインタは無効になっている可能性を考慮しなければならないというわけです。

```c
char* hoge = "HOGE=FUGA";
putenv(hoge);
cout << (hoge + 5) == getenv("HOGE") << endl; // true
```

https://www.jpcert.or.jp/sc-rules/c-pos34-c.html
Excelで、セル内の要素の数をかぞえる

# 背景

たくさんのグループについて、そのメンバーを調べる作業がありました。グループごとのメンバー数は全くバラバラで、多くのグループによく出現するメンバーとその他のメンバーがたくさん、という感じでした。

Office しか入っていないような PC しか作業には使えない状況でした。

# 当初：主なメンバーのみの集計

主なメンバーの出現回数だけの集計でよいので、その他メンバーは適当に済まします。

Excel で 1 行に 1 グループずつ記録していきます。A 列にはグループ名を、続いて主なメンバー名ごとの列を作って「o」「x」を、その他メンバーは次の列に名前を列挙しました。
できあがった表はこんな感じ。

|A|B|C|D|E|
|----|:--:|:--:|:--:|----|
|グループ|メンバー1|メンバー2|メンバー3|その他メンバー|
|AAA|○|x|○|m1, m2, m3|
|BBB|x|○|○|m3, m4|
|CCC|○|○|○| |
|DDD|○|○|x|m1, m4, m5|
|EEE|x|○|x|m2, m3, m5, m6, m8|

メンバー 1 の出現回数は、Excel関数 `=COUNTIF(B3:B100,"○")` で数えられます。
すべての主なメンバーの出現回数は、それらの `sum()` です。

# 予定変更：全てのメンバーを集計

ところが、その他のメンバーの全数も必要になりました。
幸い、その他メンバーを個別に集計する必要はありませんでした。
ですが、セル内に列挙してあるメンバーの出現回数を数えなければいけません。

その他メンバーを 1 個ずつセルに分けてあれば `COUNTA(範囲)` で数えられますが、そのようにはなっていません。「データ」→「区切り位置」コマンドを使えばメンバーごとにセルをばらせるようですが、このときは知りませんでした。
VBA なら `Split()` と `UBound()` で調べられますが、マクロを実行したときにしか数えられません。
Excel 関数で実現できないかと思い、文字列操作関数を調べたのですが、`Split()' に相当する関数はありません。

なんとかひねり出したのが次の式でした。

```
=LEN(E3)-LEN(SUBSTITUTE(E3,",",""))+1
```

`,` を全て削除した後の文字列の長さを元の文字列の長さから引けば、`,` の個数が数えられます。メンバーの数は `,` より1個多いので '+1` します。これで列挙したメンバーの数が数えられます。
その他メンバーが全くいないグループもあるので、式を少し直します。

```
=IF(E3="",0,LEN(E3)-LEN(SUBSTITUTE(E3,",",""))+1)
```

これを `sum()` で足し算すれば、その他メンバーの全数がわかります。

# おわりに

人間が見やすいように表を作ると、機械的な集計はしづらくなる、という話でした。
picoCTF2018 Writesup

毎年アメリカの高校生向けに開催されているPICOCTFというCTFがあります。
まだ、解いてる途中ですが、解けたところまで、解説を行っていきます。
PicoCTF
https://2018game.picoctf.com/news

#Forensics Warmup 1 
　zipファイルがダウンロードできるので、解凍したファイル内にフラグがある
　**FLAG**
  picoCTF{welcome_to_forensics}
#Forensics Warmup 2 
ファイルをダウンロードしてそのまま開くとフラグがある
※問題文内にファイルが開けないとあるので、本来はファイルの拡張子を変えるのが意図と思われる 

**FLAG**
  picoCTF{extensions_are_a_lie}
#General Warmup 1 
[ASCIIコードの対応表](https://www.k-cube.co.jp/wakaba/server/ascii_code.html)より対応する文字を割り出す

**FLAG**
  picoCTF{A}
#General Warmup 2
[10進数を2進数に変換](https://hogehoge.tk/tool/number.html)し、フラグを得る

**FLAG**
  picoCTF{11011}
#General Warmup 3 
Warmup 2と同じやり方で算出する
**FLAG**
  picoCTF{61}

#Resources 
リンク先のWebページのソースファイル内にフラグがある
**FLAG**
 picoCTF{xiexie_ni_lai_zheli}

#Reversing Warmup 1
該当のファイルを調査するとELFなので、実行するとフラグを得られる
**FLAG**
picoCTF{welc0m3_t0_r3VeRs1nG}

#Reversing Warmup 2
与えられた文字列をbase64でデコードするとフラグを得られる

**FLAG**
picoCTF{th4t_w4s_s1mpL3}


#Crypto Warmup 2
与えられた文字列を[ROT13](https://ja.wikipedia.org/wiki/ROT13)で変換するとフラグを得られる

**FLAG**
picoCTF{this_is_crypto!}



#grep 1
与えられたファイルに対して、CTFなどの言葉でgrepするとフラグを得られる

**FLAG**
picoCTF{grep_and_you_will_find_d66382d8}

#net cat 
与えられた接続先にnetcatで接続するとフラグを得られる

**FLAG**
picoCTF{Netcat_iS_a_NEcESSiTy_669222ddc}

#strings
対象ファイルをstringsコマンドで文字列を抜き出し、その後、CTFなどの言葉でgrepするとフラグを得られる

**FLAG**
picoCTF{sTrIngs_sAVeS_Time_d3ffa29c}


#pipe
接続すると、文字が出力され続けるので、出力結果をgrepするとフラグを得られる

nc 2018shell3.picoctf.com 44310 | grep pico

**FLAG**
picoCTF{almoat_like_mario_a13e5b27}

#Inspect Me 
Webページのhtml、jsファイル、cssファイルのコメント内にフラグの一部があるので連結させてフラグを得る

**FLAG**
picoCTF{ur_4_real_1nspect0r_g4dget_e96dd105}

#grep 2

フォルダが複数あるので、再帰的に検索してフラグを得る

**FLAG**
picoCTF{grep_r_and_you_will_find_556620f7}

#Client Side is Still Bad
Webページのソースを見ると入力された文字列をJavaScriptで比較しているので、その内容がフラグである

**FLAG**
picoCTF{client_is_bad_9119e9}

#Logon
Webページのログインフォームがあり、
・adminでログインしようとするとadminじゃログインできない旨のメッセージが出力される
・その他のユーザだとログインできるが、フラグが表示されない
なので、なんとかadminでログインを行うことを考える。
Cookieを確認すると、adminのCookieがFalseで設定されているのでTrueに書き換えるとフラグを得られる

**FLAG**
picoCTF{l0g1ns_ar3nt_r34l_82e795f4}

#Recovering From the Snap
ファイルをFTKImagerで復元すると中にtheflag.jpgがあり、フラグが記載されている

**FLAG**
picoCTF{th3_5n4p_happ3n3d}

#admin panel
WireSharkで該当のパケットキャプチャを解析すると/login.htmlへのパケット内にpasswordが記載されている

**FLAG**
picoCTF{p4ssw0rd}

#environ 
環境変数を確認（export)するとSECRET_FLAG変数内にフラグが設定されている

**FLAG**
picoCTF{eNv1r0nM3nT_v4r14Bl3_fL4g_3758492}

#hex editor 
猫の画像が与えられるが、画像にはフラグが記載されていないので、stringsコマンドで調査するとフラグを得られる
※題名通り、バイナリエディタを利用してもよい

**FLAG**
picoCTF{and_thats_how_u_edit_hex_kittos_3E03e57d}

#No Login
Webページに行くと、Flagを出力するボタンがあるが、そのままクリックしてもadminではないので表示できない旨が表示される。Sign In、Sign Out共に未実装なリンクに飛ばされるので、ログインができない。adminである条件が何かを考えるとCookieとなるので、adminというCookieを作成し、フラグを出力するボタンをクリックすると
フラグを得られる

**FLAG**
picoCTF{n0l0g0n_n0_pr0bl3m_ed714e0e}

#Buttons
最初のWebページはそのままボタンをクリックする。
次のWebページのボタンをクリックすると、2つ目のページに遷移するが、Formが無効になっている旨が表示される。
~~謎のVideoがうるさい~~
1ページと2ページを比較すると1ページ目はPOSTしているので、Fidder等を用いて2ページ目もPOSTするとフラグを得られる


**FLAG**
picoCTF{button_button_whose_got_the_button_dfe8b73c}

#感想
基礎的な力を見る問題が多いので、これが全て解けるとかなりの力を着くはず。高校生向けのため、毎年謎の組織が出てきて、戦うというストーリーもゲームらしく楽しめる解けるいいコンテンツに仕上がっている。
LED SHIM に必要なピン接続

# LED SHIM に必要なピン接続

![](https://cdn.shopify.com/s/files/1/0174/1800/products/led-shim-medium-1_1024x1024.jpg)

[LED SHIM](https://shop.pimoroni.com/products/led-shim)は28個の小さなフルカラーLEDが一列に実装されたモジュールで、各LEDをI2Cで制御します。


# 目的

上記の画像から見て取れるようにLED SHIMはRaspberry Piのピンヘッダーにグサッと挿して使用します。
[pinoutサイト](https://pinout.xyz/pinout/led_shim)にこの製品で使われているピンの説明があるので、obnizやArduinoで使用する場合のために、その通りなのか確認した。

# LED SHIM に必要なピン接続

調査の結果、必要なピンは以下の4本でした。

![led-shim-pin.png](https://qiita-image-store.s3.amazonaws.com/0/283293/22e73bd7-638c-3afd-a20c-9e19d812d197.png)

ピン番号 | 内容
|:-:|:-:|
 3 | SDA
 4 | 5V
 5 | SCL
20 | GND

6番ピンのGND接続は不要でした。

# まとめ

この製品は基盤に開いている穴は大きめのためRaspberry Piのピンヘッダーに挿しても、実はピンと接触(通電)していないことが起きます（特に奇数番ピンの穴は楕円でダブダブ。実際、これが起きて調べる羽目に・・・）。
その場合はI2Cでエラーとなって動きません。そんなときは上記のピン番号の穴がピンと確実に接触(通電)しているか確認するとよいでしょう。
エンジニアのお金事情

#そのまえに
エンジニアの金額のまえに　東京の最低賃金のお話
東京の最低賃金は時給985円
月160時間として 月15万7600円
これは基本的に 特別な技術がなくても出来る仕事

マッサージを受けるとしたら　だいたい10分1000円。時給で6000円になる
マッサージ師の場合はそこからお店や機材の費用が引かれて時給は2000円ぐらいが多いときくが
特殊な能力には人は時給6000円をはらう
時給6000円で160時間だと　月96万円
マッサージ師とエンジニアの能力の特殊性にかんしては単純比較できないが
ある程度の能力を有した技術者なら マッサージ師以上の特殊能力だと思われる
もちろん　マッサージ師にもカリスマはいるが　そういうのは例外

#エンジニアの最高金額
エンジニアでも月100万オーバーはけっこういる
技術力が高ければ120万ぐらいまでは十分いける
160万というのもいなくもない

それ以上を狙うには、有名なOSSのコミッターだとか、コミュニティ運営してたりで
他のエンジニアを呼べる存在
アイドルランクになれば　それ以上も望めるが、それはもう技術の話ではなくなる
OSSにコミットしたり、エンジニアコミュニティを作る事は 単価アップに直結することは確実だ


が、基本的にはエンジニアでは120万程度が限界だと考えていいだろう

純粋な技術力では120万ぐらいがこの日本では限界
夢がない

#外資系や一部の会社にいく
外資系は一般的にエンジニアに対してお金を出すところが多い

#フリーランスになる
よくフリーランスになれば正社員より収入高くなるっていうがどうだろうか？

##常駐（上限120万程度）
まず常駐する場合だが、常駐した場合はやはり上記の120万付近から社内稟議が通らなくなってくる
原因を色々調べたが　会社にもよるが、特に大きな会社だと
給料は権力と密接に関りがあり、事業部の中で最も権力のある事業部長の金額を作業員が超えるとパワーバランスが崩れる
この事を嫌がる人事が多い
となれば　その会社の事業部長以下の金額が上限になる
会社次第だが一般的には　100万前後だと思われるので 上記120万ぐらいが限界だ

##持ち帰り（上限なし　ただし案件もらうの難しい＆小さいことが多い）
いわゆる業務委託で人月ではなく作業内容でお金をもらう
この場合は　たいていの場合は金額に上限はないだろう

ただし、大きな案件ほど、IPものなど　持ち帰りが厳しい案件が多い

##複数案件を請ける
週5の勤務では120万ぐらいが限界だが
週2勤務で80万なら通る事もある
やはり表面的に部長の給料を超えないからだろうか。
週2で案件を2つうければ160万になり　120万の壁を超えることが出来るかもしれない
それに持ち帰りを加えれば　バランスがうまくとれる

##フリーランスに夢を見すぎている人
社員は素晴らしいと思う
フリーランスだと仕事を自分でとってくる必要もあるし　必ずプロジェクトの穴があり
お金の入らない期間もある
開発の単価がたとえ高くても 結局それらの工数がかかる
また、高いお金をもらうには単価交渉ができることが必須だ
そして　会社と違いフリーランスは基本一人で技術を磨かなければならない
場合によっては 会社よりもスキルアップ出来ない可能性もある

もしフリーランスになりたい人は　それらを考慮したほうがいい


#まとめ
エンジニアでは120万程度が限界
有名OSSのコミッター、コミュニティー運営をしていればそれ以上も可能
120万を超えるには
名前を売る（アイドルエンジニア）か、外資にいくか、
持ち帰り案件をうけるか、複数案件を請ける必要がある
Markdown のブラウザー上 DOM 変換に挑戦

Markdown 記法は、簡単に HTML に変換できる形式として定着していますが、どうせブラウザー上では HTML から DOM に変換するのだし、ブラウザー上で直接 DOM に変換してもいいのではないかと考えて先日[挑戦してみた](https://vx68k.bitbucket.io/mdtodom.js/)ので紹介します。

目を付けたのは、ブラウザー上でも動作する Markdown パーサーである [commonmark.js]。直接 HTML を出力するのではなくて、 AST (abstract syntax tree = 抽象構文木) を生成するので DOM 変換に好適ということで、この AST を DOM 化するという方向で試行錯誤することにしました。

[commonmark.js]: https://github.com/commonmark/commonmark.js/

## DOM 変換

commonmark.js にはツリー ウォーカーがあり、基本的に単純なループで AST を巡回することができるようになってるので、後はノードの出入りに対して適切な処理を書いていくだけで実現可能でした。画像リンクがコンテナー ノードになっていて `alt` 属性用のプレーン テキスト化に多少手間取りましたが、トータルでは大きな問題もなく欲しい機能は盛り込むことができました。

詳しいことは[ソース コード](https://bitbucket.org/vx68k/mdtodom.js/src/default/mdtodom.js)で。

## Markdown ファイルの取得と表示

ここまでで HTML ファイル中に書いた Markdown を DOM にして表示するところまでできるようになったわけですが、それだけではあまり面白くないので、ついでに Fetch API を使って Markdown ファイルをサーバーから取得してみることにしました。

Fetch API については詳しく書きませんので別途調べていただくとして、ここで実現する機能としてはスクリプトから Markdown ファイルを非同期に取得し、 DOM に変換した上でページ内に差し込むということになります。

実際にやってみると、非同期ページ更新が検索エンジンから無視されるというアンチ SEO なページになってしまったので、多くの人にはおすすめできないのですが、静的ファイルしか置けないサーバーでも Markdown で書いて表示されるのは場合によっては便利なのではないかと考えて、現在もそのまま利用中です。
GCEでサブドメインを使ってWEBページを公開するときの設定

## 環境：
* Debian9 (GCE)
* nginx/1.14.0

example.comを持っていて、sample.example.comを追加することにする


## 公開するページのファイルを配置
`/var/www/sample/`に置くことにする

## nginxの設定ファイルに公開するページの設定を書く
nignxは`/etc/nginx/sites-available/`に`sample.conf`などの名前で設定を置き、`/etc/nginx/sites-enabled/`以下にそのシンボリックリンクを作成するやり方がある。
`/etc/nginx/nginx.conf`に

```
include /etc/nginx/sites-enabled/*.conf;
```

と書けば設定を読み込んでくれる。
編集するときは`sites-available/`の方を編集して、要らなくなったら`sites-enabled/`の方を消せば良い（また必要になったらシンボリックリンクを貼り直す）

`sudo vi /etc/nginx/sites-available/sample.conf`

```
server {
  listen 80;
  server_name sample.example.com;
  root /var/www/sample;
  location /{
    index index.html;
  }
  server_tokens off;
}
```

シンボリックリンク作成
`sudo ln -s /etc/nginx/sites-available/sample.conf /etc/nginx/sites-enabled/sample.conf`

再起動
`sudo service nginx restart`


## サブドメインをGCEのCloudDNSに登録する
GCEのダッシュボード左上の**≡**マークを押して、「ネットワークサービス」>「Cloud DNS」を選択
ゾーンを選択
**[レコードセットを追加]**ボタンから

DNS名
`sample.example.com`
IPv4アドレス
`当該インスタンスの外部IP`
を入力して
**[作成]**を押す


## 参考：
[Nginxでサブドメインを同じIPアドレスで処理](https://www.yanagee.com/life/other/nginx%E3%81%A7%E3%82%B5%E3%83%96%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E3%82%92%E5%90%8C%E3%81%98ip%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9%E3%81%A7%E5%87%A6%E7%90%86)
GoogleAppsScript_備忘録

##日付に関して
1日前の考え方
24時間x60分x60秒＝864,000秒戻す
new Dateはミリ秒で考えるのでx1000が必要

というかmonmentライブラリを使ったほうが
圧倒的に簡単

```js:aa.gs
var time = Moment.moment();//時間取得
var today = time.format('YYYY-MM-DD');//本日
var yesterday = time.add('days', -1).format('YYYY-MM-DD');//昨日
var tomorrow = time.add('days', +1).format('YYYY-MM-DD');//明日
```

##保存方法に関して
コンテナバインドはスクリプトが迷子になる。。。
基本的にスタンドアロンで作ることをオススメ。


##ES6非対応
宣言で**const**は使えるけど、**let**は使えない

ESとはECMAScript(エクマスクリプト）のこと
>ECMAScript（エクマスクリプト）は、JavaScriptの標準であり、Ecma Internationalのもとで標準化手続きなどが行われている。
Ecma Internationalのほか、ISO/IEC JTC 1からもISO/IEC 16262として標準化されている。日本もJIS X 3060としてJIS化している。

基本的に代入や再宣言が必要なければ、
constで固定でいいと思うけど、forのイテレーションみたいな
場合は最大入可能なvarにする。

巻き上げは起きない。

var のスコープは　関数
const　のスコープは　ブロック

>[Subterranean Flower](https://sbfl.net/blog/2016/07/14/javascript-var-let-const/)

##実行速度問題
APIはなるべく呼び出さない。
ループに入れない。

下の実行時間取得スクリプトを使って、
実行時間に気を使う。

```js:timer.gs
//実行時間ログ出力セット
var start_ms = Moment.moment();//時間計測開始
/*~~~~~~
スクリプト記述
~~~~~~*/
var end_ms = Moment.moment();//時間計測終了
var span_sec = (end - start)/1000;
Logger.log("処理時間:" + span_sec + " 秒" );

```

##記述ルール
-マジックナンバーは使わない
-定数は大文字でスネークケース
TAX_RATEなど基本不変のもの
-宣言する種類を記載する
単位があるものはアンダーバーでつける

```
str：String　//文字列
date：Date　//日付
rng：Range　//データ範囲
sh：sheet　//シート
ss : spreadsheets //スプレッドシート本体
sh : spreadsheet //シート
```
WordPressでファイル操作をする時は、PHPの標準関数を使うのは非推奨！？WP_FileSystemを使うようにしよう！

PHPでファイルの読み書きをする場合、`file_get_contents関数`や`file_put_contents関数`などを利用したりしますが、 **WordPressではこのようなPHPの標準関数を利用するのは非推奨となっているようです。** パーミッションさえあれば問題なく利用すること自体はできるのですが、WordPressで定められているテーマの品質に対するガイドラインに反した書き方となってしまうようです。実際にガイドラインに反しているかどうかは、 **[Theme Check](https://ja.wordpress.org/plugins/theme-check/)（WordPressテーマレビューチームが開発しているプラグイン）** などを利用して確認することができます。

## WordPressで推奨されたファイル操作方法

WordPressでは、WP_FileSystemというファイル操作用のオブジェクトを使用して、ファイル操作することが推奨されています。

### WP_FileSystemの使用手順

1. Wordpressインストールディレクトリ/wp-admin/includes/file.phpの読み込み
2. WP_Filesystemの初期化、$wp_filesystemオブジェクトの呼び出し
3. $wp_filesystemオブジェクトのメソッドを利用してファイル操作

今回は、ファイルの読み込みと書き込みをget_contentsメソッドとput_contentsメソッドを使って行う方法を書いていこうと思います。

## PHPの標準関数とWP_FileSystem、それぞれの記述方法

実際に、PHPの標準関数とWP_FileSystemをそれぞれ使ってファイル操作をする方法を記述していきます。

### ファイルの読み込み

```php:file_get_countents関数を使用したファイルの読み込みの場合
<?php
$path_name = '読み込むファイルのパス';
$sample_file = file_get_contents($path_name);
```

```php:WP_FileSystemを使用したファイルの読み込みの場合
<?php
//file.phpの読み込み(ABSPATHは、WordPressのインストールされたパス名を返す定数)
require_once(ABSPATH.'wp-admin/includes/file.php');

$path_name = '読み込むファイルのパス';
if(WP_Filesystem()){
    global $wp_filesystem;
    $sample_file = $wp_filesystem->get_contents($path_name);
}
```

### ファイルの書き込み

```php:file_put_countents関数を使用したファイルへの書き込みの場合
<?php
$path_name = '書き込むファイルのパス';

// 新規ファイルを作成する場合
$new_file_text = "新規テキスト\n";
file_put_contents($path_name,$new_file_text);

// 既存のファイルに追記する場合
$add_text = "追加テキスト\n";
// FILE_APPENDフラグはファイルの最後に追記することを意味します。
// LOCK_EXフラグは他の人が同時にファイルへの書き込みをできないようにすることを意味します。
file_put_contents($path_name, $add_text, FILE_APPEND | LOCK_EX);
```

```php:WP_FileSystemを使用したファイルへの書き込みの場合
<?php
// file.phpの読み込み(ABSPATHは、WordPressのインストールされたパス名を返す定数)
require_once(ABSPATH.'wp-admin/includes/file.php');

$path_name = '書き込むファイルのパス';

// 新規ファイルを作成する場合
if(WP_Filesystem()){
    global $wp_filesystem;
    $new_file_text = "新規テキスト\n";
    $wp_filesystem->put_contents($path_name,$new_file_text);
}

// 既存のファイルに追記する場合
if(WP_Filesystem()){
    global $wp_filesystem;
    $sample_file = $wp_filesystem->get_contents($path_name);
    $sample_file .= "追加テキスト\n";
    $wp_filesystem->put_contents($path_name,$sample_file);
}
```

## まとめ

PHPの標準関数とWP_FileSystemを比べると、若干WP_FileSystemを使った記述方法の方が長くなりますが、この記述をすることでWordPressのガイドラインに沿った形を実現することができます。なので、WordPressでファイル操作をしたい場合は、WP_FileSystemを利用するようにした方がいいと思います。
ハンズオン準備４：地球地図スリランカを GeoJSON Text Sequence に変換する

[ハンズオン準備](https://qiita.com/hfu/items/6026eec6816465d7e7a9)の第４回です。準備の全体の趣旨は[第１回](https://qiita.com/hfu/items/9dfc0ec57c98dffe6f23)をご覧ください。今回は、地球地図スリランカのデータを GeoJSON Text Sequence に変換します。

# 実装
地球地図データアーカイブのオンラインデータからワンパスで GeoJSON Test Sequence に変換するためのコードは既に[プロトタイプ](https://github.com/hfu/globalm-fs/blob/master/index.js)を書いていたので、これをベースに次のコードを作成して実装終了です。

```javascript
const config = require('config')
const shapefile = require('shapefile')
const fetch = require('node-fetch')

const main = async function(url, cc, layer) {
  const shp = await fetch(`${url}/${layer}_${cc}.shp`)
  const dbf = await fetch(`${url}/${layer}_${cc}.dbf`)
  shapefile.open(shp.body, dbf.body, {encoding: 'utf-8'})
    .then(source => source.read()
      .then(function dump(result) {
        if (result.done) return
        console.log(JSON.stringify(result.value))
        return source.read().then(dump)
      }))
    .catch(error => console.error(error.stack))
}

for(const layer of config.get('layers')) {
  main(config.get('url'), config.get('cc'), layer)
}
```

# データ
結果データおよびコードは [GitHub](https://github.com/hfu/gmlk20-ndjson) に置いています。なお、データの利用条件についても[README.md](https://github.com/hfu/gmlk20-ndjson/blob/master/README.md)にメモしています。

# 次回
OSM の 6-46-30 のデータと、今回の地球地図スリランカのデータを、tippecanoe の入力データに変換します。国連ベクトルタイルツールキットの方法では、ここでいわゆるベクトルタイルスキーマを作り込んでいくことになります。作業レポジトリは[spinel-produce](https://github.com/hfu/spinel-produce)になるでしょう。
【Rails】複数ファイルのmigrateに失敗した時、どこまで処理できているか確認する方法

## migrateがうまくいかない

複数のmigrationファイルを同時に処理しようとして、エラーが出てしまいました。





## そんなときは`rails db:migrate:status`

ターミナルで`rails db:migrate:status`を実行することで、
migrationファイルごとに、処理されたか否か、確認することができます。

```
$ rails db:migrate:status

database: jisibari_css_api_dev

 Status   Migration ID    Migration Name
--------------------------------------------------

   up     20181024132152  Remove 〜
   up     20181024132651  Add foreign key to 〜
   up     20181024134400  Create 〜
   up     20181030064504  Create 〜〜
  down    20181030065235  Create 〜〜〜

$
```

up   :　処理されたmigrationファイル
down :　処理されなかったmigrationファイル


`migrate`実行時のエラーの原因究明に役立てば幸いです。

今日はこのあたりで失礼します。
unityでポイントクラウド用に点を描画してみた。

今点群マップにハマっています。というのも格安LiDARを買ったので。
そこで描画するときにいくつかハマったのでハマりポイントと
unityで点が描画できることがわかったのでやり方を。

#試したこと
1.律儀にプリミティブでスフィアを作った
2.スクリプトからポリゴン書いた
3.頂点が65535を超えて描画されなかったので32bit化した
4.純粋にポリゴンじゃなくて点を描画した

※今回使用したサンプルデータは自前で記録したLiDARのデータです。

##1.律儀にプリミティブでスフィアを作った
```cs:generatePrimitive.cs
GameObject PointDot = GameObject.CreatePrimitive(PrimitiveType.Sphere);
```
これでプレハブから複製することなく基本3Dオブジェクトが生成できます。
タイプはsphere,cube,quadなど。

ただし、当たり前ですが、ポイントクラウドで点ごとにこれを行うと
ゲームオブジェクトが馬鹿みたいに増えてめちゃめちゃ重くなります。
ちょっと手っ取り早く見たいときでも避けましょう。

##2.スクリプトからポリゴン書いた
数年前、DK2の頃にポジトラ用カメラからポジトラ範囲を描画するために
自前でポリゴンを書いたことがあったので、そんな感じで各点群から三角錐なメッシュを張ってみました。

```cs:generateMesh.cs

           Vector3 center = new Vector3(x, y, z);//点群点
           //頂点
           vertices[i * Vertex_size] = center + (Vector3.up);
           vertices[i * Vertex_size + 1  ] = center + (Vector3.right   + Vector3.down + Vector3.back);
           vertices[i * Vertex_size + 2  ] = center + (Vector3.left    + Vector3.down + Vector3.back);
           vertices[i * Vertex_size + 3  ] = center + (Vector3.forward + Vector3.down               );
           //三角形

           //手前
           triangles[i * Surface_size      ] = i * Vertex_size     ;
           triangles[i * Surface_size + 1  ] = i * Vertex_size + 1 ;
           triangles[i * Surface_size + 2  ] = i * Vertex_size + 2 ;
           //左奥
           triangles[i * Surface_size + 3  ] = i * Vertex_size     ;
           triangles[i * Surface_size + 4  ] = i * Vertex_size + 2 ;
           triangles[i * Surface_size + 5  ] = i * Vertex_size + 3 ;
           //右奥
           triangles[i * Surface_size + 6  ] = i * Vertex_size     ;
           triangles[i * Surface_size + 7  ] = i * Vertex_size + 3 ;
           triangles[i * Surface_size + 8  ] = i * Vertex_size + 1 ;
           //底面
           triangles[i * Surface_size + 9  ] = i * Vertex_size + 1 ;
           triangles[i * Surface_size + 10 ] = i * Vertex_size + 2 ;
           triangles[i * Surface_size + 11 ] = i * Vertex_size + 3 ;
```

こんなかんじで頂点行列作って、面をどの頂点で作るかで行列作って点ごとに追加してmeshfilterに渡してました。
この当時はunityで点の描画が出来ると知らず、三角錐っていう発想。

##3.頂点が65535を超えて描画されなかったので32bit化した
このメッシュ化で負荷は減ったので運用していたのですが、なぜか360度ではなく60度ぐらいしか描画されませんでした。
よくよく見てみると60度あたりで頂点数が65535を越えていました。そういえば3Dモデルも65535越えたら分割されてましたっけ。
ってことで65535を越えるために32bit化しました。unity2017からの機能？


```cs:32IndexFormat.cs
Mesh mesh = new Mesh();
mesh.indexFormat = UnityEngine.Rendering.IndexFormat.UInt32;
```

これでインデックスバッファーが32bit対応になり頂点が65535越えても描画されます。
[Unity - Scripting API: Mesh.indexFormat](https://docs.unity3d.com/ScriptReference/Mesh-indexFormat.html)

##4.純粋にポリゴンじゃなくて点を描画した
65535頂点あたりを調べてて、点を描画できることがわかったので切り替え。

```cs:SetIndices.cs
　　　　int[] indices = new int[vertices.Length];
       for (int i = 0; i < vertices.Length; i++)
       {
           indices[i] = i;
       }
       filter.mesh.SetIndices(indices, MeshTopology.Points, 0);
```
MeshTopologyをPointsに切り替える（っぽい）。
indicesが点群行列。頂点行列ぶっこんでもうまく行かなくて作った。


よく見る点だけの描画はこうやってたんだねぇ、知らなかったw
nginx+php-fpmで.phpのページだけNot Foundになるとき

## 環境：
* Debian9
* nginx/1.14.0
* php7.0-fpm

nginxのerror.logに
> connect() to unix:/run/php/php7.0-fpm.sock failed (13: Permission denied) 

のようなエラーが出ている

## 方法

`sudo vi /etc/php/7.0/fpm/pool.d/www.conf`
> ;listen.owner = www-data
;listen.group = www-data

とあるのを

```
listen.owner = nginx
listen.group = nginx
```

に変更して

再起動
`sudo /etc/init.d/php7.0-fpm  restart`


## 参考：
[Permission Denied for fastcgi_pass using PHP7](https://serverfault.com/questions/777994/permission-denied-for-fastcgi-pass-using-php7)

[Nginx で「502 Bad Gateway」とか、なんだかエラーログがでるよって時](https://qiita.com/madaran0805/items/a5b064105852656cca0e)
Azure Traffic Manager を導入してWebアプリケーションを ディザスタリカバリー対応にする

本記事はMicrosoft社が開催したハンズオン”Cosmos DB と App Service によるグローバル分散アプリ構築”のTrafficManagerの項目に対し、一部修正や加筆したものです。

# 対象ユーザー
- Azure WebAppをある程度理解している。
- ディザスタリカバリー対応したい or ユーザーに最適なリージョンにアクセスを振り分けたい

# 前提条件
- Azure WebAppをリージョンを分けて2つ作っている。


# 何がおいしいの？
ディザスタリカバリーとは災害復旧を意味します。（災害に限定されないと思いますが英語自信なし(;^_^A）
本記事ではWebAppをリージョンを分けて2つ用意しており、仮にいずれかのリージョンのWebAppに障害が発生しても、もう一方のリージョンにあるWebAppに誘導して、サービス提供を維持することが可能になります。
また、本記事ではルーティング方法にパフォーマンスを選択しているため、ユーザから最も近いリージョンにアクセスするよう、TrafficManagerがコントロールするため、パフォーマンス面でのメリットもあります。
（西日本と東日本だと距離がそんなに離れていないため、パフォーマンスのメリットは小さいはず）


# 手順

## Traffic Managerの作成 
1. Azureポータルにて、[リソースの作成] － [ネットワーキング] － [Traffic Manager プロファイル] をクリックします。
2. Traffic Manager プロファイル作成画面では以下のように設定して下さい。
    3. 名前: 任意の文字列（半角英数小文字とハイフンのみ）
    4. ルーティング方法: パフォーマンス
5. [作成] をクリックします。

 
## Traffic Managerエンドポイントの設定 
以下の手順でWeb Appのプライマリリージョンとセカンダリリージョンをエンドポイントとしてそれぞれ追加します。 

1. Traffic Manager プロファイルのブレードから、[エンドポイント] － [追加] をクリックします。 
    2. 種類: Azureエンドポイント 
    3. 名前: 任意の文字列（半角英数小文字とハイフンのみ） 
    4. ターゲットリソースの種類: App Service 
    5. ターゲットリソース: プライマリリージョンとセカンダリリージョンのWebAppどちらかを選択
6. [OK] をクリックします。 
 
## Traffic Managerを経由したアプリケーションへのアクセス 
1. Traffic Manager プロファイル のブレードから [概要] を選択します。 
2. エンドポイントが両方ともオンラインになっていることを確認します。 
3. [DNS 名] のURLをクリックして、アプリケーションにアクセスします。
4. App Service個別の URLにアクセスした時と同じ画面が表示されればOK。 


# 障害発生のシミュレーションをやってみた
App Serviceのプライマリリージョンまたはセカンダリリージョンのどちらかを停止／削除しても、Traffic Manager 経由でのアプリケーション利用に問題がないことを確認します。

下図では東日本リージョンを障害発生中としてシミュレーションしているため、モニター状態が低下となっています。
一方、米国中部は正常に動作しているため、モニター状態はオンラインとなっています。
この状態でTrafficManagerのDNSのURLにアクセスすると、通常は東日本へアクセスするのですが、障害発生中のため米国中部へ誘導されてアプリの動作が継続できるようになっています。
複数リージョンにWebAppを展開済みであれば導入は非常に簡単なので、ぜひ試してみてください。

![TrafficManager.PNG](https://qiita-image-store.s3.amazonaws.com/0/310578/b7c2f010-26cf-e47b-5660-3392194767b5.png)
名前があったなあ

文法面や、動作速度の面からはあまり重視されない「名前」ですが、人間とコードの接点では重要な役割を果たします。

## 名前と規約

ふつう、プログラムコードと名前は独立なものですが、ときおり名前と動作が結びついている例があります。

* Ruby on Railsでは、`User`と名付けたモデルが自動で`users`テーブルを参照するようになるなど、「設定より規約」のコンセプトが貫かれているので、名前だけでかなりのことが進んでいきます。
* JavaのJavaBeanでは、アクセサメソッドに`get`や`set`といった接頭辞をつけることとなっています。

このような規約がある場合、それを外れるよほどの理由がなければ、素直に従うべきでしょう。

## 名前による、暗黙のアノテーション

Reactのクラスコンポーネントには、以下のようなメソッドがあります。

* `render`
* `componentDidMount`
* `componentDidUpdate`
* `componentWillUnmount`
* `getDerivedStateFromProps`
* `getSnapshotBeforeUpdate`
* `shouldComponentUpdate`

このうち、かならず使うのは`render`で、`component`で始まる3つをその次の頻度で使います。そして、残り3つは、それより使う頻度が落ちます。「あまり使わないものに長い名前をつける」ことで、直接的ではないですが使いにくくしています（なお、これからの構造変更に対応できなくなったメソッドは`UNSAFE_componentWillUpdate`のように、その旨を明示した名前となっています）。

## 名前をつけることで、存在を際立たせる

プログラムのリファクタリングにおいて、よく「共通部分を1つのメソッドやモジュールに切り出す」ということが行われます。もちろん、同じ処理を重複して書かなくて良くなるという効果が大きいのですが、副次的なメリットとして「切り出した部分に、単体の名前がつく」ことも1つの効果だと考えています。「このメソッドのこの部分」で呼ぶより、「このメソッド」と名前がついたものとして存在していることで、より注目もされるようになります（テストもやりやすいですし）。

直接コードを書く場面の話題ではないのですが、「Ajax」とか「JSONP」といった技法は、それまでに存在していた技術の組み合わせに**新たな名前**を付けて、それが定着したものです。検索エンジンでも抽象的な概念や、記号類は検索がうまく進められませんが、その概念に名前があれば検索もしやすいですし、議論の際にも言及しやすくなります。演算子なども、名前で検索すれば、いろいろ情報が出てきます。

逆を返せば、「名前が定着している」技法はそれだけ受け入れられている（あるいは、少なくとも議論の対象となっている）という指標にもなります。