OmniAICreator/Qiita-1.07M huggingface dataset:
AmazonLinuxへのシステムワイドなNode.jsインストール方法（yum編）

AWS/EC2慣れしていない私がEC2インスタンスにNode.jsを **システムワイドにインストール** しようとして悲しい思いをしたのでメモ。

Node.jsのインストール
---

最近は`nodebrew`とか`nvm`使って、ユーザごとに好きなバージョンいれちゃいなYO!っていうのが当たり前だとは思いますが、ちょっとしたワークショップで全ユーザ共通で使えるようにセットアップしたいという要件があったので調べていました。
実際にはAnsible経由でセットアップしていたので出来ればyum使いたいなぁ、という前提条件です。

ネットにあるyumを使ったインストール方法
---

```bash
# yum install -y epel-release
# yum install -y nodejs
```

CentOSならちょっと古いもののv6.10.0がLTS最新の現在で、v6.9.4がインストールできます。

ただし、AmazonLinuxだとv0.10.48になります。AmazonLinuxだとv0.10.48になります。

正しい方法
---

[公式サイトのダウンロードページ](https://nodejs.org/en/download/)の下の方にリンク"Installing Node.js via package manager"がありました。

https://nodejs.org/en/download/package-manager/#enterprise-linux-and-fedora

```bash
# curl --silent --location https://rpm.nodesource.com/setup_6.x | bash -
```

でnodesourceのyumリポジトリが追加され、v6系最新のv6.10.0がインストールできるようになります。

v7系なら

```bash
# curl --silent --location https://rpm.nodesource.com/setup_7.x | bash -
```

まとめ
---

**公式サイトをちゃんと読もう**
Go言語 パッケージ管理ツールと、ウェブアプリケーションでよく使うセット


## パッケージ管理ツール
* [Glide](https://github.com/Masterminds/glide) 

```
$ brew install glide
$ glide get github.com/Masterminds/cookoo
```


## パッケージ検索
* [Go Search](http://go-search.org)


## よく使うパッケージ一覧

|  | パッケージ | 説明 |  
|:-----------|:------------|:------------|
| App Engine | google.golang.org/appengine | [Go App Engine packages](https://godoc.org/google.golang.org/appengine) |
| Cloud Storage | cloud.google.com/go | [Google Cloud APIs Go Client Library](https://godoc.org/cloud.google.com/go)  |
| 軽量フレームワーク<br>（URLルーティング、など） | github.com/gorilla/mux<br>github.com/gorilla/context<br>github.com/gorilla/schema<br>github.com/gorilla/sessions<br>github.com/gorilla/securecookie | [Gorilla web toolkit](http://www.gorillatoolkit.org) |
| Cloud Datastore ラップ | github.com/mjibson/goon |  |
| ログ | github.com/dsoprea/go-logging |  |
| 多言語 | github.com/nicksnyder/go-i18n |  |
| バリデーション | gopkg.in/validator.v2 |  |
ロジカルシンキング入門

## ロジカルシンキングとはなにか
一貫していて筋が通っている考え方、説明の仕方のこと。

* きちんと深掘りし、良い案をだすこと
* なるほど、とおもってもらう
* 分かりやすく伝える

人間の頭はそもそもロジカルシンキングにむいていない
→すぐに結論を出したがる
→訓練が必要

本質：頭の中でどう考えているかよりも、それが相手に伝わる「メッセージ」として具現化できているかが重要。



## ロジカルシンキングの考え方
* 考えるべきことを３つ出す
	* 具体的な要素ではなく、１つ上の概念を出すこと  
	→「開発要員が足りない」、ではなく「社外」「社内」「採用」 という”観点”を考える

	* ひたすら訓練する
		* 「ゼロ秒思考」  
		テーマについて、１分で５つ以上答えをだす（例：自分の強みは何なのか）  
		単語ではなく文章としてアウトプットする（日本語力の強化）  

* マトリックスで整理する
	* ３×Nのマトリックスをつかう  
	→軸を決めて整理することで、相手に納得感をもってもらう

### 思考のテクニック
#### ボトムアップ 
答えから考えていく方法。これをやってしまいがち。
理解しているテーマには強いが、まったく新しいことには対応しづらい。
>
例：要件定義は必要か？
→結論：Yes
→なぜ？
・システムに必要な機能要件をについて共通認識をすり合わせる
・要件を分類整理することで、必要工数など算出できる

#### トップダウン
答えを出すにあたって、必要な要素、観点を洗い出し、組み合わせて深掘りしていく方法。
新しいことを考えるにはこれが大事。
観点をふくらませるには、一つの観点に対し、対極・中間・上位・下位など相対的に考えていく。
>
例：要件定義は必要か？
→要素・観点：
・人（設計者、ユーザ、システム管理、経営層）
・モノ（サーバ、他システム、データ）
・時間（開発期間、大量データの処理時間）

#### フレームワーク
* PDCAサイクル
* ５W1H
* 現在未来過去
* ３つずつ案を出す

## ロジカルシンキングの伝え方
### テンプレートを意識

* 〜の件についてですが　　（テーマを最初に確認する）
* 〜は〜だと考えます。　　（結論を最初に言う）
* その理由は３つあります。　　（理由を列挙）
* １つめに〜であること、
* ２つめに〜であること、
* ３つめに〜であること
* よって〜は〜だと考えます。


### SCQAの型を意識する
 * 状況提示(Situation) ：御存知の通り〜ですよね
 * 複雑化(Complication)：そんな中、〜ですよね
 * 問い(Question)：だから〜について、〜するべきですよね
 * 主張・提案(Answer)：この点、〜と考えます

  * SCが難しい、答えを急ぎがちなので注意
  * 話し手はずっと考えている、聞き手は初めて聞く(SCを省きがち）



## ロジカルシンキングのトレーニング
以下を徹底する

* 結論から話す
* 理由を説明する(なぜなぜ、、、）
* 紙に書いて整理する

## 今日からやめること
* 考えるのを諦めること

## 補足
* ロジカルシンキングだけではだめ、感情力も大事
	* データ・数字より、より感情的に訴える内容のほうが心に残る（免許更新センターの動画）

## おすすめ本
ゼロ秒思考 / 赤羽 雄二
<a href="https://www.amazon.co.jp/%E3%82%BC%E3%83%AD%E7%A7%92%E6%80%9D%E8%80%83-%E9%A0%AD%E3%81%8C%E3%82%88%E3%81%8F%E3%81%AA%E3%82%8B%E4%B8%96%E7%95%8C%E4%B8%80%E3%82%B7%E3%83%B3%E3%83%97%E3%83%AB%E3%81%AA%E3%83%88%E3%83%AC%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0-%E8%B5%A4%E7%BE%BD-%E9%9B%84%E4%BA%8C/dp/447802099X/ref=as_li_ss_il?ie=UTF8&linkCode=li2&tag=nesheep5-22&linkId=e71e0f532e5dec119a3d723136ceb776" target="_blank"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=447802099X&Format=_SL160_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=nesheep5-22" ></a><img src="https://ir-jp.amazon-adsystem.com/e/ir?t=nesheep5-22&l=li2&o=9&a=447802099X" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />  


超・箇条書き / 杉野 幹人
<a href="https://www.amazon.co.jp/%E8%B6%85-%E7%AE%87%E6%9D%A1%E6%9B%B8%E3%81%8D-10%E5%80%8D%E9%80%9F%E3%81%8F-%E9%AD%85%E5%8A%9B%E7%9A%84%E3%81%AB-%E4%BC%9D%E3%81%88%E3%82%8B%E6%8A%80%E8%A1%93-%E6%9D%89%E9%87%8E-%E5%B9%B9%E4%BA%BA/dp/4478068674/ref=as_li_ss_il?s=books&ie=UTF8&qid=1487924143&sr=1-1&keywords=%E8%B6%85%E3%81%8B%E3%81%98%E3%82%87%E3%81%86%E3%81%8C%E3%81%8D&linkCode=li2&tag=nesheep5-22&linkId=95fde62e7d3e5f6ec5d1e794b9c3f412" target="_blank"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=4478068674&Format=_SL160_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=nesheep5-22" ></a><img src="https://ir-jp.amazon-adsystem.com/e/ir?t=nesheep5-22&l=li2&o=9&a=4478068674" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />
【Julia】カレントディレクトリにあるファイルのファイル名から特定のファイルの一部の文字列だけを取得する

# 2024.08.21加筆
本記事を書いてからだいぶ時間が経ち、本記事のコードは少なくともJulia v1.10.4では動作しません。`ismatch`が`occursin`に改められたためです。これから本記事をお読みになってコードを試されたい方がおられましたら、コードの先頭に
```julia
ismatch = occursin
```
を加えた後、試すようにお願いします（当然、`occursin`を`ismatch`に置き換えてから実行してもOKだし、それが本質的な対処です）。また、tenfu2teaさんからいただいたコメントの方が有益だと思いますので参考にしてみてください。
※以降の内容はほぼ当時のままです。

# はじめまして
ここ数ヶ月、データ処理や設計計算をJuliaでやるようになりました。しかし、プログラミングは本業ではなく、毎日やっている訳ではないので、調べては忘れてを繰り返してしまうことも出てきたなと思っています。そこで、今日からは、できるようになったことを忘れないように、Qiitaにメモを書いていくことにします。

# カレントディレクトリにあるファイルのファイル名から特定のファイルの一部の文字列だけを取得する。
# 例1：文字列操作ごとに変数を用意するやり方
```julia
rev="_v3"
fn_zen = readdir() #カレントディレクトリにある全ファイル名を取得
fn_dat = fn_zen[map(x->ismatch(r"\.dat$",x),fn_zen)]   #そこから、".dat"で終わるものだけを取得
fn_mat = fn_dat[map(x->ismatch(r"^matome_",x),fn_dat)] #そこから、"matome_"から始まるものだけを取得
fn     = fn_mat[map(x->ismatch(Regex(rev),x),fn_mat)]  #そこから、revの文字列を含むものだけを取得
```

# 例2：都度変数を用意しないやり方
```julia
rev="_v3"
fn = readdir() |> x->x[map(x->ismatch(r"\.dat$",x),x)]   |>
                  x->x[map(x->ismatch(r"^matome_",x),x)] |>
                  x->x[map(x->ismatch(Regex(rev),x),x)] #Regex(rev)はr"_v3"と等価
```
fnの結果は例1と同じ。fnだけが必要なら、例2の方がすっきりする印象。
【JS】JSフレームワークのSvelteを動かしてみた。（動作が超高速らしいよ！）

# Svelte

JavaScript製超高速フレームワークである[Svelte](https://svelte.technology/)を導入し、動かすところまでを紹介します。

## 動作環境
- Node.js 7.6.0
- yarn
- macOS Sierra 10.12.3
- svelte-cli v1.3.0

## Svelte-cliのインストール
```bash
yarn global add svelte-cli
```

## ファイル構成
<img width="412" alt="スクリーンショット 2017-02-24 15.13.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/32982/3da3176b-06ea-ac23-aaf1-e22ab3b2db7d.png">


## 実際にコーディング

### ベースとなるhtmlファイルの作成
```html:index.html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>svelte</title>
</head>
<body>
<main></main>
</body>
<script src="MyApp.js"></script>
<script>
    new MyApp({
        target: document.querySelector('main'),
        data: { name: 'world' }
    });
</script>
</html>
```

### MyApp.htmlファイルの作成
```html:MyApp.html
<h1>Hello {{ name }}!</h1>
```

### コンパイル
```bash
svelte compile --format iife MyApp.html > MyApp.js
```

### 表示確認
![スクリーンショット 2017-02-24 15.17.25.png](https://qiita-image-store.s3.amazonaws.com/0/32982/7c3931df-2421-3cc8-5e67-417ef2c1f856.png)

[実際のページ](https://takahashitakehiro.github.io/js-experiment/svelte/helloworld/index.html)

## 雑感
開発側でコンパイルをしているため、閲覧者のページ読み込み速度が上がるのはすごい良いなと思った。
あと、依存関係が特に無いため、読み込む順番を気にする必要が無いのは楽。
ちょっとSvelteに興味が湧いたので、これを気に何か作ってみようと思う。
次はTodoアプリとか作るので、実装したらまた投稿することにする。

## 開発でストレスを無くすために
今は、チュートリアルとして、実行しただけですが、gulp-svelteっていうプラグインがあるので、
gulpでwatchして、変更がある毎にコンパイルするようにしたりしたい。


以上。
マイクロサービスアーキテクチャの設計ポイント

どうやってマイクロサービスアーキテクチャを稼動させるか興味を持ったので、調べたことをまとめました。
一番下に参考にしたURLがあります。

#マイクロサービスアーキテクチャとは
マイクロサービスアーキテクチャはJames Lewis氏によって提案された言葉で、
ソフトウェアアプリケーションを独立して配置可能なサービスの組み合わせ(suite)として設計する特定の方法を指すもの。

http://kimitok.hateblo.jp/entry/2014/11/09/211820

---
特徴
サービスが分離しているため、サービスごとに異なるプログラミング言語やストレージが選択でき、それぞれが独立してデプロイが可能になる。

Railsのモノシリックアーキテクチャと比較される。
メリット
変更に強い柔軟なシステムを作ることができる。

デメリット
分離したことによるAPIとネットワークの管理とシステムの整合性管理が必要

---

#分離したときにサービスが煩雑になるのを防ぐには
マイクロサービスのデザインパターンがあるのでそれぞれで対応する

```
- API Gateway:API群を一つにまとめる
- Service Registry / Service Discovery：API群を管理する
- Circuit Breaker:障害時に他のAPIを遮断し、波及を防ぐ
- Polyglot Persistence：異なるデータベースを扱える
- Command Query Responsibility Segregation (CQRS)：読み込みと書き込みを分離する
- Tolerant Reader：送信を厳密に、受信を寛容に行う
- Chained Services：サービス同士を順列に接続する
- Asynchronous Messaging：メッセージを複数のサービスで共有する
- Service Instantiation：サービスをVM単位やホスト単位でインスタンス化する
- Consumer-Driven Contracts：消費者の期待するサービスを特化させ品質を上げる
- Domain Events...：サービス同士をつないで、分散型コレオグラフフィーを行うパターン

```

---

#複数に分散したAPIをまとめるには
API GatewayとService Registry / Service Discoveryを使う
APIをまとめて管理するサービスを用意する
Kongソフトウェアが主流で、APIをまとめて管理できる
- Kong:オープンソースソフトウェア、nginxとcassandraに依存している

---

#フロントエンドにAPIを合わせていくには
APIを時にはまとめてリクエスト回数を減らしたい場合などで、
BFF(Backends for Frontends)を用意し対応する。
- ユーザーとマイクロサービスの間に整形サービスを挟む

---

#通信が失敗したときのリトライ方法
何回もリトライすると負荷となり問題になるかもしれない
- エクスポネンシャルバックオフ(exponential backoff)を検討する
  - 再試行時のwait間隔を徐々に（指数関数的に）伸ばす処理

---

#共通サービスをまとめるには
Kongのプラグインにてまとめることが可能
認証の追加(OAuth2.0)
セキュリティ(ACL,IP filtering, Bot Detection, CORS, DynamicSSL)
トラフィック制御(Rate Limiting)
ログ(TCP, HTTP, loggly)

---

#障害時に他のAPIを遮断し、波及を防ぐには
Circuit Breakerを使う
サービスの利用状況を検知して、それ以降のAPIにアクセスしないようにする
Rubyであれば、circuit_breaker,Expeditorライブラリがある

---

まとめ
- マイクロサービスを導入すると、柔軟性が生まれる。
- 分離したことによる考慮は必要になる。
- マイクロサービスにもデザインパターンがあるので活用する。

---

参考

マイクロサービスアーキテクチャ/O'REILLY

https://getkong.org/

https://www.webapi.tokyo/kong%E3%81%A8%E3%81%AF/

https://uramoto.wordpress.com/2015/09/21/%E3%83%9E%E3%82%A4%E3%82%AF%E3%83%AD%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%81%AE%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3/

http://qiita.com/yamasaki-masahide/items/68b5a4fe6998222b9e3f
CocoaPods 1.2.0 で、arm64 以外への端末の Build や、archive が失敗するのでなんとかした

pod install すると、なぜかライブラリのターゲット(ActionoSheetPicker-3.0)
の BuildSettings>Archtecture>archtectures が arm64 に設定されます。


![スクリーンショット 2017-02-24 15.08.54.png](https://qiita-image-store.s3.amazonaws.com/0/2273/727ea08d-702f-6fcd-da87-431873d5df4b.png)


このままだと、iphone5 や ipadMini など arm64 でないCPUでの実行や、armv7 なども含む Build の Archive で失敗します。Project レベルだと、ふつうに Standard Architectures になっているので、下記のようなコードを Pod ファイルの末尾に書いて、target レベルの Architectures の設定を削除することで乗り切ることにしました。
Webで理由とか漁ったけどでてこんかった。なんでや！

```
post_install do |installer|
  installer.pods_project.targets.each do |target|
    next if target.name.start_with?("Pods")
    target.build_configurations.each do |config|
        config.build_settings.delete("ARCHS")
    end
  end
end
```
riotのプリプロセッサにCoffeeScriptとpugを指定したときにはまったこと

ほぼメモ書きです。

# class shorthandを使うとコンパイルエラーになる
`class={ disabled: true }`みたいに書くやつのことです。
exprオプションを付けてコンパイルするとCoffeeScriptコンパイラが余計にコンパイルしてしまうようです。
`class={^ disabled: true }`と書きましょう。

また、pugのコンパイラでもエラーになるので、`class="{^ disabled: true }"`のように書くのが最も確実です。

CoffeeScriptの件は[本家のissue](https://github.com/riot/riot/issues/1090)に載ってます。

# interpolationが被る
これは[公式ガイド](http://riotjs.com/ja/guide/)のサンプルを書き直してたときにものすごくはまりました…。

```todo.tag(抜粋)
<form onsubmit={ add }>
  <input ref="input" onkeyup={ edit }>
  <button disabled={ !text }>Add #{ items.length + 1 }</button>
</form>
```

```todo.tag(書き直した後)
form(onSubmit="{ add }")
  input(ref="input" onKeyUp="{ edit }")
  button(disabled="{ !text }")
    | Add #{ items.length + 1 }
```

と直したわけですが、これはコンパイルエラーになります。
この場合はたまたまなんですが、`Add #{ items.length + 1 }`の`#{  }`がpugのinterpolationの構文と被ってしまったわけです。

多少気持ち悪いですが`Add { '#' + (items.length + 1) }`とすることで回避できます。

あとはコンパイルオプションでriot側のブラケットを`{  }`以外にしてあげてもOKです。

ただ、pugとCoffeeScriptのinterpolationは被ったままどうしようもないので、script内でinterpolationを使おうものなら容赦なくコンパイルエラーになります…。

筆者はriotifyを使ってモジュール分割し、処理の大半を別のCoffeeScriptファイルに書き出すことでとりあえず逃げています。

このあたり上手い方法をご存知の方がいらっしゃいましたら是非コメントいただけると助かります…！

# 暗黙的なthisを明示する
上記と同じく[公式ガイド](http://riotjs.com/ja/guide/)より。

```todo.tag(抜粋)
<script>
  this.items = opts.items

  edit(e) {
    this.text = e.target.value
  }

  add(e) {
    e.preventDefault()
    if (this.text) {
      this.items.push({ title: this.text })
      this.text = this.refs.input.value = ''
    }
  }

  toggle(e) {
    var item = e.item
    item.done = !item.done
  }
</script>
```

```todo.tag(書き直した後)
script.
  @items = opts.items ? []

  edit = (e) ->
    @text = e.target.value

  add = (e) ->
    e.preventDefault()
    if @text
      @items.push title: this.text
      @text = @refs.input.value = ''

  toggle = (e) ->
    item = e.item
    item.done = not item.done
```

またもやこれだと動かないのです。

どうやらJavaScriptの性質で関数がその場の名前空間(this)にバインドされていたようです。

そのため、

```
  @edit = (e) ->
    @text = e.target.value
```

のように関数(を格納している変数)の頭に`@`(this)をつけてあげればOKです。

# さいごに
たくさんの括弧を見ると吐き気がする持病をお持ちの方、終了タグなんて書きたくないというものぐさな方(両方筆者のことですが)には天国のようなコードが書けるので、気が向いたら試してみてください。
高度合成数を列挙してみる

#高度合成数とは
Wikiでは、

>自然数で、それ未満のどの自然数よりも約数の個数が多いもの

となっている。
直感的にはわかりにくいので、簡単に言ってしまうと
**割れる数が多い割に小さい数**
といったところだろうか。
12，24，36といった数がそれに該当する。
聞き馴染みがある数だと思われる。

わかりやすく解説してくださっているサイトもいくつかあるので、
詳しくはそちらへ(´∀｀)

#本題
とりあえず定義どおりに素直に組んでみたので、いい感じの効率化を思いつけば追記します。

```Csharp:HighlyCompositeNumber.cs
//EnumerableExtention.HighlyCompositeNumber(10000);
//result:2,4,12,24,36,60,120,180,240,360,720,840,1260,1680,2520,5040,7560
public static IEnumerable<int> HighlyCompositeNumber(int limit)
{
	var maxDivisorCount = 0;
	for (int i = 2; i < limit; i++)
	{
		var divisorCount = CountDivisor(i);
		if (maxDivisorCount < divisorCount)
		{
			yield return i;
			maxDivisorCount = divisorCount;
		}
	}
}

private static int CountDivisor(int value)
{
	if (value <= 1) { return 1; }
	var divisors = new List<int>();
	for (int i = 1; i < value; i++)
	{
		if (value % i != 0) { continue; }

		var f = value / i;
		if (divisors.Contains(f)) { break; }
		divisors.Add(i);
		if (i == f) { break; }
	}
	return divisors.Count;
}
```
GoogleAppEngine + Go言語（GAE/g）で作るウェブアプリケーション 準備編

## はじめに
GoogleAppEngine(以降、GAE)のStandard Environmentで、Go言語を使った際につまずいたポイントについて、いくつかの手がかりを残しておこうと思います。

* GAEのプロジェクトでは、ローカル環境で開発後、デプロイを行う
 * ローカル開発用SDKが充実しているが、 **GoogleCloudSDK** と、 **AppEngineSDK** の2種類が必要となる
* データの保存先
 * ローカル環境での場合、基本的にローカルに保存される
 * しかし、Cloud Storageの場合のみ、GAEサービス上のstagingバケットに保存するようにする
* ADC（Google Application Default Credentials）認証
 * ローカル環境から、透過的にGAEサービスにアクセスするために、ADCという仕組みがある
 * gcloudコマンドを利用し、Googleアカウントの情報を記録することで、アプリケーションから簡単にGAEのリソースにアクセスすることができる
* GOPATHの設定
 * 割とどこにおいても良いと書いてあるが、glideというパッケージ管理ツールを利用する関係で、プロジェクトディレクトリ直下を指定している
* パッケージ管理には、glideを利用する


## ローカル開発環境（Mac）の準備
* Python 2.7.x
* [Google Cloud SDK](https://cloud.google.com/sdk/docs/quickstart-mac-os-x) v140.0.0
 * 必須コンポーネント（bg, core, gsuite, gcloud）
* [App Engine SDK](https://cloud.google.com/appengine/docs/standard/go/download) v1.9.48
* [glide](https://github.com/Masterminds/glide)（パッケージ管理ツール）
 * ```$ brew install glide```


## リソース（Datastore, Cloud Storage, Memcache）のアクセス先
元々、DatastoreはGAE用に設計されていたが、CloudStorageは別のサービスとしてリリースされていた。
GAE用のBlobStoreは廃止される予定なので、ちぐはぐになっている。

* ローカル環境
  * Datastore: ローカル
  * Cloud Storage: stagingバケット
  * Memcache: ローカル
* 運用環境
  * Datastore: GAE
  * Cloud Storage: 運用バケット（staging.が付いていない）
  * Memcache: GAE


## ADC（Google Application Default Credentials）認証

* 初回のみ（Googleアカウントの認証と、プロジェクトを紐付ける）
  * ```$ gcloud init```

* 認証関係の確認や再設定
  * ```$ gcloud {info|auth|list}```
  * ```$ gcloud auth login```
  * ```$ gcloud auth application-default login```

## GOPATHの設定例
```bash:.bash_profile
# Glide
export GO15VENDOREXPERIMENT=1

# GOPATHは,プロジェクト配下に設定
export GOPATH=$HOME/IdeaProjects/goapp/
export PATH=$PATH:$HOME/google-cloud-sdk/platform/google_appengine/goroot/bin/
export PATH=$PATH:$HOME/go_appengine/

# The next line updates PATH for the Google Cloud SDK.
if [ -f {ホームディレクトリ}/google-cloud-sdk/path.bash.inc ]; then
  source '{ホームディレクトリ}/google-cloud-sdk/path.bash.inc'
fi

# The next line enables shell command completion for gcloud.
if [ -f {ホームディレクトリ}/google-cloud-sdk/completion.bash.inc ]; then
  source '{ホームディレクトリ}/google-cloud-sdk/completion.bash.inc'
fi
```

## Glideパッケージ管理ツール
```
$ glide create                           # 初回のみ、glide.ymlを生成
$ glide get github.com/Masterminds/glide # パッケージを取得
$ glide install                          # lockファイルを更新せずにインストール
$ glide update                           # lockファイルを更新してインストール
$ glide up                               # glide installとたぶん同じ  
```
階層的クラスター分析

# クラスター分析の特徴
- 最も似ている組み合わせから順番にクラスターにしていく方法
- 近いものから順番にまとめるという方法をとるので、あらかじめクラスター数を決める必要がない。
- 分類の対象が非常に多い場合、計算量が多くなり実行が困難になったり、出来上がる樹形図が巨大になり結果が不明瞭になる。

## 重心法
- 重心法は、以下のような流れで実装される。

### 0: データ準備（標準化）

- 体重をグラムに直すと値が1000倍になってしまい、体重の変数の影響が大きくなってしまう。そのため、標準化を行い単位の影響をなくす。
- ここでは平均0、分散1で標準化を実施。

標準化前

| 動物 | 体重(kg) | 脳の重さ(g) |
|:-:|:-:|:-:|
|牛   | 465  | 423  |
|馬   | 521  | 655  |
|ゴリラ   | 207  | 406  |
|人間   | 62  | 1320  |
|チンパンジー   | 52  | 440  |

標準化後

| 動物 | 体重(-) | 脳の重さ(g) |
|:-:|:-:|:-:|
|牛   | 0.921  | -0.581  |
|馬   | 1.175  | 0.016  |
|ゴリラ   | -0.246  | -0.625  |
|人間   | -0.902  | 1.727  |
|チンパンジー   | -0.947  | -0.537  |


### 1: 変数を用いて個々の対象の距離を全て計算し、その中で距離が最も短い対象どうしを併合して最初のクラスターを作成する。

牛と馬の距離

```math
√((0.921-1.175) ^2 +  -0.581 -0.016) ^2 = 0.649
```

| 動物 | 牛 | 馬 | ゴリラ | チンパンジー |
|:-:|:-:|:-:|:-:|:-:|
|馬   | 0.649  |   |   |   |
|ゴリラ   | 1.168  | 1.159  |   |   |
|人間   | 2.942  | 2.691  | 2.442  |   |
|チンパンジー   | 1.869  | 2.192  | 0.706  | 2.265  |

- その中で距離が最も短い対象どうしを併合して最初のクラスターを作成する。
 →　牛×馬の距離が最も短いため、これをcluster1とする

### 2: 1で作成されたクラスターと他の対象との距離を計算し、1で計算された対象間の距離を含めて、最も近いものを併合する。

- cluster1の体重と脳の重さは、牛と馬との重心（平均）を用いる。
- 体重：((0.921 + 1.175)/2) = 1.048
- 脳の重さ：((-0.581 +0.016)/2) = -0.283

|  | cluster1 | ゴリラ | 人間 |
|:-:|:-:|:-:|:-:|
|cluster1   | 1.339  |   |   |
|ゴリラ   | 2.800  | 2.442  |   |
|人間   | 2.011  | 0.706  | 2.265  |


### 3. 手順2を繰り返し、全てのクラスターが併合されるまで計算を行う。

![image](https://qiita-image-store.s3.amazonaws.com/0/151919/1bf4cd1a-24a7-24ab-1a92-231d57d68319.png)

### 4. 計算結果を用いて、クラスターの併合される過程を表すデンドログラムを描く。

![image](https://qiita-image-store.s3.amazonaws.com/0/151919/486eca27-fcea-bc57-e7d9-cc32757f2f7e.png)


## ウォード法
- 2つのクラスターを併合する際に、クラスター内の平方和を最小にするようにクラスターを併合していく手法
- クラスター間の距離を平方和（散布度）の増加量で表す。平方和はクラスター内の散らばりを表すため、併合後の平方和の増加量が大きければ、２つのクラスターは類似していないと考えられる。

![image](https://qiita-image-store.s3.amazonaws.com/0/151919/8e085ecb-5841-6fce-0154-cd6bd238c432.png)

- 鎖効果が起こりにくく、実用場面でも頻繁に利用される。
    - 鎖効果
        - ある１つのクラスターに対象がひとつずつ順番に吸収されて、クラスターの形成がなされていく現象。最短距離法で起こりやすい。

![image](https://qiita-image-store.s3.amazonaws.com/0/151919/a755152a-0066-1480-1cb6-9ac34b1e59a1.png)
Rails | shoulda-matchers で Boolean 型のバリデーションを検証できない

# 問題

こんなモデルがあるとき

```rb
class Example < ActiveRecord::Base
  validates :Active, inclusion: { in: [ACTIVE_TYPES] }
end
```

Rspec で Boolean型のバリデーションを検証しようとすると

```rb
require 'rails_helper'

RSpec.describe Example, type: :model do
  it { is_expected.to validate_inclusion_of(:Active).in_array([true, false])  }
end
```

テストの削除をうながす警告が出る。

```
Warning from shoulda-matchers:

You are using `validate_inclusion_of` to assert that a boolean column
allows boolean values and disallows non-boolean ones. Be aware that it
is not possible to fully test this, as boolean columns will
automatically convert non-boolean values to boolean ones. Hence, you
should consider removing this test.
```

# 理由

「ActiveRecord が何でも Bloolean型にしてしまうので、結局ぜんぶテストが通るから意味ないよ」ってことっぽい？

```rb
Example.new(Active: 1)
# => #<Example:0x007f9f996fbe00 Active: true>

Example.new(Active: true)
# => #<Example:0x007f9f9b16f908 Active: true>

Example.new(Active: false)
# => #<Example:0x007f9f9cc92618 Active: false>

Example.new(Active: nil)
# => #<Example:0x007f9f9b1ce318 Active: nil>

Example.new(Active: 1)
# => #<Example:0x007f9f9cd7c9c0 Active: true>

Example.new(Active: 2)
# => #<Example:0x007f9f9daa34f0 Active: false>

Example.new(Active: 'TEXT')
# => #<Example:0x007f9f9cded3c8 Active: false>

```



# 環境

-  shoulda-matchers (3.1.1)
- Rails 4.2.7.1

# 参考

- https://github.com/stympy/faker/issues/714








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
MacのTerminal.appでtmuxに負けずにドラッグでコピーする

# 結論
Terminal.appでtmuxがマウスの制御を奪ってくるときは、**Cmd+R**で一度"Allow Mouse Reporting"を切ってから、ドラッグ操作でコピーする。終わったらもう一度**Cmd+R**を押せば元に戻る。

# Tips
iterm2だとOptionを押しながらで上手くいくが、Terminal.appではこうするしかない


# その後
~~甲斐性なしなので~~結局iterm2に切り替えました
MSP430 > 内部プルアップ抵抗 > 30k程度

```txt:動作環境
MSP430
```

[AQM1602](http://akizukidenshi.com/catalog/g/gK-08896/)などのI2C接続キャラクタLCDなどを使う際に関係するのがプルアップ抵抗。

[取説](http://akizukidenshi.com/download/ds/xiamen/AQM1602_rev2.pdf)には10kを推奨とある。
> 　ＳＣＬ、ＳＤＡ信号線に、この基板上のプルアップ抵抗（１０ｋ Ω）を接続する場合は。。。

( 変換基板のプルアップ抵抗を使うという方法もある。 )

MSP430の内部プルアップ抵抗は30k(Ω)のようだ。
https://e2e.ti.com/support/microcontrollers/msp430/f/166/t/18963
> If you only have one slave on the bus (and short trace lengths) you could probably use the internal pull-ups (~30K) but a more optimized solution would be to use between 5-10K external resistor.

1スレーブの場合は内部プルアップ抵抗でもいいかもしれないが、外部プルアップ抵抗(5から10k)を推奨とのこと。

内部プルアップ使用にはPxRENを設定する。
https://e2e.ti.com/support/microcontrollers/msp430/f/166/t/18698
> PxREN --> Each bit in each PxREN register enables or disables the pullup/pulldown resistor of the corresponding I/O pin.
Excel Tips

## データ入力規制のリストに、名前定義したテーブルの値を表示する

シート上で[挿入]-[テーブル]を選択し、テーブルを作成します。

![image](https://qiita-image-store.s3.amazonaws.com/0/114529/abfbc968-7893-3a70-88a2-c68d09868185.png)

[数式]-[名前の管理]を選択すると、「テーブル２」などという名前になっているので変更します。ここでは「支社店」とつけました。

![image](https://qiita-image-store.s3.amazonaws.com/0/114529/34397a35-3b2c-9b7a-3244-aad3f6463c7f.png)

リストにしたいセル位置で、[データ]-[データの入力規制]を選択し、リストを選択し「=支社店」とします。

![image](https://qiita-image-store.s3.amazonaws.com/0/114529/4a3d0ab7-8bfb-f936-16bf-7bae04a753b9.png)

リストに、テーブルの値が選択できるようになります。

![image](https://qiita-image-store.s3.amazonaws.com/0/114529/7c42c15e-e134-03f6-a77f-90d25ac8ace9.png)

テーブルの方の追加、削除に連動するので便利ですね。

![image](https://qiita-image-store.s3.amazonaws.com/0/114529/2c983c9f-6605-90c9-aa7d-6c642f16a4c4.png)

## セルに入力する文字数を制限する。

制限したいセル位置（この場合 C25）で、[データ]-[データの入力規制]を選択し、ユーザー設定の数式で以下のようにします。数式では、同じセル位置を指定します。2byteを含まない場合は LEN関数を使えます。

![image](https://qiita-image-store.s3.amazonaws.com/0/114529/9f83a252-e239-b96d-8bac-d1dae6751218.png)

ついでに、親切なエラーメッセージを設定します。

![image](https://qiita-image-store.s3.amazonaws.com/0/114529/5aaf7c57-25cb-2034-dc54-5c1e1312110e.png)

文字数が多いとメッセージが出ます。

![image](https://qiita-image-store.s3.amazonaws.com/0/114529/a1d0f2aa-76f7-c1ec-f87a-5bf48fc41c43.png)

## セルの表示形式を「年/月」だけにする。

![image](https://qiita-image-store.s3.amazonaws.com/0/114529/ace965d9-bdf5-3829-62d2-a8258fdd6063.png)

## セルの数値を左ゼロ埋めで表示する

数字のゼロを並べると桁数に足りないときは左ゼロ埋めで表示されます。ここでは [ ] という文字で囲むような整形も入っています。

![image](https://qiita-image-store.s3.amazonaws.com/0/114529/277715ca-9af5-b1ff-84b5-0d4b5ebe2c14.png)

## 時間をmsまで表示する

トレースを貼り付けた時に、msまで表示したいですよね。

![image](https://qiita-image-store.s3.amazonaws.com/0/114529/0806c25a-d651-4a91-895f-7f1810e16e70.png)

## 「名前の管理」はなぜ数式タブにあるのか？

![image](https://qiita-image-store.s3.amazonaws.com/0/114529/d45a7da4-8c82-60b8-ae6c-e992f412cc49.png)


なぞ。
【Django】ラジオボタンを設置したり、マークアップを整形したりする


##環境
Django 1.10.5

<br>

##form.pyを作る
まずはformの元となるform.pyを
ModelFormを利用する方法もありますが、今回はform.pyの中で完結するものをつくっていきます

```form.py
from django import forms
from django.contrib.admin import widgets
import os

CHOICE = {
    ('0','キュート'),
    ('1','クール'),
    ('2','パッション'),
}

form SampleForm(forms.Form):
	select = forms.ChoiceField(label='属性', widget=forms.RadioSelect, choices= CHOICE, initial=0)
```
`initial = index`とすることでデフォルトで選択されている項目を指定できます
仮に`required = False`で選択を必須としない場合は、外しておいたほうが良いでしょう
<br>

##views.pyを作る
今回は単純にこのフォームだけを渡すビューを書いていきます

```views.py
from django.shortcuts import render, get_object_or_404, redirect
from forms.forms import *

def sample_view(request):
	form = SampleForm
	return render(request,
		project/sample.html,
		{"form" : form}
	)
```
<br>

##html側でformを呼び出す
そのままです
やっていきましょう

```sample.html
{{ form }}
```

基本的にこれだけでもいいですが一つのフォームの中で複数の入力項目がある場合、以下のように個別にコントロールしてもよいです

```sample.html
{{ form.select.label　}}{{ form.select}}
```
<br>
上記で簡単にラジオボタンを設置することができますが、難点は生成されるマークアップは`<ul>`で囲まれてしまっているので、やや扱いづらいものとなっている点です
こんな感じで

```
属性
<ul id="id_select">
	<li>
		<label for="id_select_0">
			<input checked="checked" id="id_select_0" name="purpose" type="radio" value="0" />
			キュート
		</label>
	</li>
	<li>
		....
</ul>
```
<br>

##生成されるマークアップを細かくコントロールする
こちらについては[公式リファレンス](https://docs.djangoproject.com/en/1.10/ref/forms/widgets/)でも書かれている通り、forで回すことで生成されるマークアップをより細かくコントロールすることができます
例えば以下のようにやってあげると

```sample.html
{{ form.select.label }}
{% for radio in form.select %}
	{{ radio.tag }}
	<label>{{ radio.choice_label }}</label>
{% endfor %}
```

扱いやすい(であろう)ものが生成されます

```
属性
<input checked="checked" id="id_select_0" name="select" type="radio" value="0" />
<label>キュート</label>
<input id="id_select_1" name="select" type="radio" value="1" />
<label>クール</label>         
...
```

<br>
また、例えばlabelタグにラジオボタン側のidを与えたい場合などは

```sample.html
{{ form.select.label }}
{% for radio in form.select %}
	{{ radio.tag }}
	<label for="id_select_{{ radio.index }}">{{ radio.choice_label }}</label>
{% endfor %}
```

このようにすると

```
属性
<input checked="checked" id="id_select_0" name="select" type="radio" value="0" />
<label for="id_select_0">キュート</label>
<input id="id_select_1" name="select" type="radio" value="1" />
<label for="id_select_1">クール</label>         
...
```

はい
昨日作成されたレコードを取得するwhereの書き方（Railsガイド写経）

&nbsp;&nbsp;Railsガイド、Active Record クエリインターフェイス、[2.3.2 範囲条件](https://railsguides.jp/active_record_querying.html#%E7%AF%84%E5%9B%B2%E6%9D%A1%E4%BB%B6)　の写経による、小ネタになります。

&nbsp;&nbsp;顧客を表す`Client`というモデルがあり、昨日作成されたレコードを取得するActiveReocrdクエリは
以下のように書ける。

```ruby
Client.where(created_at: (Time.now.midnight - 1.day)..Time.now.midnight)
```

こういう `1.day`の使い方、カッコええやん。ちなみに`1.day`は何かといえば、

```ruby
irb> 1.day.class
=> ActiveSupport::Duration
```
[ActiveSupport::Duration](http://api.rubyonrails.org/classes/ActiveSupport/Duration.html)のオブジェクト。

テストデータを作成して上記を写経。上記の `where` から、以下のような`BETWEEN`が作成される。

```ruby
irb> Time.now
=> 2017-02-24 13:08:05 +0900
irb> Client.where(created_at: (Time.now.midnight - 1.day)..Time.now.midnight)
  Client Load (0.7ms)  SELECT `clients`.* FROM `clients` WHERE (`clients`.`created_at` BETWEEN '2017-02-23 00:00:00' AND '2017-02-24 00:00:00')
=> #<ActiveRecord::Relation [#<Client id: 201, name: "顧客-01", created_at: "2017-02-22 19:31:36",  ・・・
```

ここまではRailsガイドに書いてあるとおり。
では、`created_at: `で指定している期間を、`..`から`...`に変え、

```ruby
Client.where(created_at: (Time.now.midnight - 1.day)...Time.now.midnight)
```
とするとどうなるか。
やってみると、

```ruby
irb> Client.where(created_at: (Time.now.midnight - 1.day)...Time.now.midnight)
  Client Load (0.7ms)  SELECT `clients`.* FROM `clients` WHERE (`clients`.`created_at` >= '2017-02-23 00:00:00' AND `clients`.`created_at` < '2017-02-24 00:00:00')
=> #<ActiveRecord::Relation [#<Client id: 201, name: "顧客-01", created_at: "2017-02-22 19:31:36", ・・・
```
と、ちゃんと期待どおり、`BETWEEN`ではなく、下限以上、上限未満の`WHERE`句が生成されました。

ActiveRecord、ほんま賢いわー。
今週やった勉強まとめ（H29.2.13~2.24）

##それ以外の日：udemyにてtensorflowの勉強を行いました。
【3日で体験】 TensorFlow x Python 3 で学ぶディープラーニング
https://www.udemy.com/tensorflow/learn/v4/overview

pyhtonを少しかじったので簡単にいけると思いましたが、意外と知らないことばかり、やり方は理解できましたが、内容はさっぱりでした。
簡単に解説しますと、TensorFlowのチュートリアルの解説と、応用問題でした。
コードの内容は特に気にしず、実装をすることが目的でした。
一応、TensorFlowの実装から画像の想定まで行いました。
まず、チュートリアル
###MNIST For ML Beginners
https://www.tensorflow.org/get_started/mnist/beginners
こちらは手書きの文字から数字の当たる確率を行ういうものです。
次に
###Deep MNIST for Experts
https://www.tensorflow.org/get_started/mnist/pros
こちらは確率を上げるために色々コードを入力してMNIST for ML Beginnersより正確な値を弾き出すものでした。

最後に
###Image Recognition
https://www.tensorflow.org/tutorials/image_recognition
こちらはあらかじめある画像認識のプログラムを実装し、自分で用意した画像にも行って見るというものです。

###感想
全くの初心者でしたが、とてもわかりやすい解説でした。
内容はよくわからないものが多かったですが、一発目、初学者が画像認識やTensorFlowを学ぶにはもってこいでした。
こちらをもっと学ぶには行列や、確率などの数学的知識や統計学も必要かと勝手に思ったところです。

###学んだこと
1.ターミナルでのAnacondaからのTensorflowでブラウザでのコードの入力方法
2.画像認識（ディープラーニング？）の概要

###わからないここと
1.anaconda,python,jupyter,ターミナル色々あるけどなんで必要？
2.高校数学主に行列、確率



##2/18~2/20：社員旅行にてまったく勉強できませんでした。
pyenv自体のアンインストール方法

pyenvのアンインストール方法を記します

#pyenvをアンインストールする

サクっとアンインストールしていきましょう！
###brewでインストールしていた場合

```zsh
#pyenv-virtualenvをインストールしていたら先に削除します
brew uninstall pyenv-virtualenv

#pyenvをアンインストールする
brew uninstall pyenv
```
###git cloneでインストールしていた場合
```zsh
#.pyenvを削除
rm -rf $(pyenv root)
```
#後処理
`~/.zshrc` もしくは `~/.bash_profile`を綺麗にします。
ご自分の環境に合わせてvimで開いてください。

```zsh
vim ~/.zshrc
#vim ~/.bash_profile
```
この中にある

+ `export PYENV_ROOT="$HOME/.pyenv"`
+ `export PATH="$PYENV_ROOT/bin:$PATH"`
+ `eval "$(pyenv init -)"`
+ `eval "$(pyenv virtualenv-init -)"` (※1)

を削除してください！(※1: オプションなので、無い可能性があります)
なお、その他`brew doctor`のwarningを解消するためにpyenv関係の記述をされていた場合は、それも一緒に削除してしまって構いません。

その後

```zsh
source ~/.zshrc
#source ~/.bash_profile
```
で更新するか、あるいはシェルを再起動すれば完了です！
「オフラインリアルタイムどう書くF02の問題」の解答

「2つの矩形に含まれるマス目の数 2017.2.22 問題」
http://nabetani.sakura.ne.jp/hena/ordf02in2rec/
の解答

40分でした

``` python:main.py

import numpy as np

CEL_H = CEL_W = 10

def build(left, top, right, bottom):
  cel = np.zeros((CEL_H, CEL_W))
  for x in range(left, right+1):
    for y in range(top, bottom+1):
      cel[y, x] = 1
  
  return cel

def solve(cels):
  result = np.zeros((CEL_H, CEL_W));
  for cel in cels:
    result = result + build(cel[0], cel[1], cel[2], cel[3])
  
  return np.count_nonzero(result == 2)

def str2array(str):
  edges = str.split('-')
  lefttop = edges[0].split(',')
  rightbottom = edges[1].split(',')
  return(
    [
      int(lefttop[0]),
      int(lefttop[1]),
      int(rightbottom[0]),
      int(rightbottom[1]),
    ]
  )

def test(result, src, expected):
  str_cels = src.split('/')
  cels = []
  for cel in str_cels:
    cels.append(str2array(cel))

  result[0 if solve(cels) == int(expected) else 1] +=1

result= [0,0]
test(result, "5,1-7,9/3,2-8,6/0,5-9,5", "15" )
test(result, "0,0-9,9/0,0-9,9/0,0-9,9", "0" )
test(result, "0,0-9,9/0,0-0,9/1,0-9,9", "100" )
test(result, "2,5-7,6/0,5-7,7/2,0-8,6", "0" )
test(result, "1,9-4,9/4,9-7,9/0,3-7,4", "1" )
test(result, "6,1-6,9/5,0-7,4/5,1-7,2", "6" )
test(result, "4,0-9,8/5,1-6,8/0,2-9,7", "28" )
test(result, "2,8-8,9/7,9-8,9/8,3-8,9", "2" )
test(result, "3,3-9,4/0,1-8,4/1,2-8,9", "12" )
test(result, "2,1-8,3/0,1-3,7/8,3-8,4", "7" )
test(result, "5,4-6,9/0,0-6,0/5,3-9,8", "10" )
test(result, "1,1-9,7/1,1-3,8/3,8-7,9", "22" )
test(result, "2,4-6,7/3,2-7,8/1,0-9,4", "24" )
test(result, "0,2-1,5/8,1-8,3/1,8-6,8", "0" )
test(result, "5,2-9,5/9,1-9,2/8,0-8,6", "5" )
test(result, "5,0-6,4/2,1-6,4/3,8-3,9", "8" )
test(result, "0,4-6,9/4,1-6,9/7,6-9,7", "18" )
test(result, "0,0-5,5/0,1-2,8/5,3-9,4", "17" )
test(result, "0,2-5,6/5,6-8,7/0,1-2,6", "16" )
test(result, "7,2-8,4/1,0-6,8/1,3-7,6", "26" )
test(result, "4,3-9,3/0,0-6,5/0,0-4,8", "31" )
test(result, "3,4-4,6/2,2-4,8/2,0-8,4", "11" )
test(result, "1,2-6,5/0,5-4,7/2,8-2,9", "4" )
test(result, "4,1-7,5/2,1-9,9/1,7-2,9", "23" )
test(result, "1,6-5,6/0,3-5,7/0,2-2,6", "13" )
test(result, "1,3-3,4/1,4-3,4/9,2-9,9", "3" )
test(result, "6,3-7,6/2,2-2,3/1,3-9,8", "9" )
test(result, "2,2-9,7/1,8-9,8/2,2-8,9", "49" )
test(result, "1,2-6,9/7,6-9,9/4,3-9,9", "33" )
test(result, "6,0-7,5/0,4-3,8/1,4-5,8", "15" )
test(result, "2,0-9,7/0,5-3,8/5,1-7,7", "27" )
test(result, "1,2-8,7/3,1-4,3/2,3-5,8", "20" )
test(result, "1,0-7,7/0,1-5,4/0,0-2,3", "19" )
test(result, "2,0-3,7/1,1-3,7/5,3-5,9", "14" )
test(result, "7,2-9,8/1,0-6,8/0,2-9,9", "63" )
test(result, "1,1-5,3/0,3-8,7/2,3-8,7", "32" )
test(result, "3,4-6,6/1,0-9,1/4,0-9,9", "21" )
test(result, "0,0-4,7/0,5-5,9/0,2-4,5", "25" )
test(result, "1,1-9,9/2,2-7,4/2,4-7,7", "30" )
test(result, "3,2-9,9/2,0-6,6/0,5-8,9", "36" )
test(result, "0,1-8,8/0,5-9,8/2,3-2,4", "38" )
test(result, "0,0-8,6/4,3-9,9/7,1-9,9", "29" )
test(result, "0,0-8,8/2,4-9,8/0,1-9,2", "53" )

print("Success:" + str(result[0]) + ", Fail:" + str(result[1]))

```

結果

```
Success:43, Fail:0
```
[Centos7]Vagrantでpublic networkを使用して固定IPでアクセス可能にする

CentOS7ではnmcliを使用してIP設定を行うことが推奨されているらしいので。

##環境

* Windows 7 Professional (ホストOS
* Vagrant 1.9.1
* VirtualBox 4.3.12
* CentOS 7.2 (ゲストOS

##Vagrant側の設定

Vagrantfileのconfig.vm.networkの設定を以下の通りに編集

```text:Vagrantfile
config.vm.network :public_network, :auto_config => false
```


上記設定が終わったら、以下のコマンドでホストOSを立ち上げる

```
$vagrant up
```

##CentOS側の設定

####ネットワークインターフェースの確認

public networkの設定で新たに追加されたネットワークインターフェースの名前を確認する。
以下の例では、「enp0s8」という名前が確認できる。

```
$ip address show
・・・略
3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 08:00:27:f6:53:7b brd ff:ff:ff:ff:ff:ff
    inet 172.24.255.85/22 brd 172.24.255.255 scope global dynamic enp0s8
       valid_lft 86359sec preferred_lft 86359sec
    inet6 fe80::a00:27ff:fef6:537b/64 scope link
       valid_lft forever preferred_lft forever

```

####ネットワーク設定(nmcli)

コネクション名一覧取得

```
$nmcli c s
Wired connection 1  943a2291-111f-4ae7-95c5-5a82d1fdc67a  802-3-ethernet  enp0s8
enp0s3              3b1e3980-745e-4ba9-952f-b4a7ecf4479e  802-3-ethernet  enp0s3

```

コネクション名とインターフェース名を揃える

```
$sudo nmcli c m "Wired connection 1" connection.interface-name enp0s8 connection.id enp0s8
```

固定IPに変更

```
$sudo nmcli c m enp0s8 ipv4.method manual ipv4.addresses 172.24.253.202/32 connection.autoconnect yes
```

ネットワークインターフェースの再起動

```
$sudo nmcli c down enp0s8
$sudo nmcli c up enp0s8
```

##参考記事

* [CentOS7のnmcliコマンドについて](http://qiita.com/ytooyama/items/847250f17fa7715f3037)
Docker Hubのイメージを利用する時の注意点と判断材料

何か試したい製品があるときは、まずDocker Hubで公開されているイメージを検索してdocker runするのが当たり前になってきました。

気楽に起動できるのは良いですが、自分なりに注意している点があるので、記事にしました。

※下記の記事を大いに参考にさせていただきました。
「2016-06-07 Dockerは危険という誤解と、本当に注意すべき点」
http://paiza.hatenablog.com/entry/2016/06/07/Docker%E3%81%AF%E5%8D%B1%E9%99%BA%E3%81%A8%E3%81%84%E3%81%86%E8%AA%A4%E8%A7%A3%E3%81%A8%E3%80%81%E6%9C%AC%E5%BD%93%E3%81%AB%E6%B3%A8%E6%84%8F%E3%81%99%E3%81%B9%E3%81%8D%E7%82%B9

# 注意点

## docker run の --privileged オプション

docker run コマンドのオプションで、 ```--privileged```を指定すると、コンテナからホスト側のすべてのデバイスへのアクセスが許可されます。

ホストのマシンを制御する必要があるアプリケーションは、そう多くない（と思います）ので、privilegedを要求される場合は、要注意。

## docker run の -v オプション

-v オプションで、ホスト側のディレクトリがコンテナ側に共有されます。コンテナ側はroot権限なので、共有されたボリュームを自由に読み書きできます。

このオプション自体は便利ですし、頻繁に使うのですが「何を共有するか？」が、注意点です。

例えば「$HOME」を共有すると、自分のクレデンシャル（AWSのAPIKEYやSSH KEYなど）や、コマンドのHistoryなどが、コンテナ側に共有されます。

また「docker.sock」を共有すると、コンテナ側からDockerを制御できるようになります。

「/」を共有すると・・・（以下割愛）

ボリュームの共有は、必要最小限にしましょう。


# 心配な時の判断材料

よく分からない・心配だからというだけで、排除するのも良くないので、以下の方法で情報を拾って判断してます。

## Official イメージか？

Docker Hub のOfficialイメージなら、まぁ大丈夫（と思う）

## Dockerfileを確認する

Dockerfileが公開されているなら、イメージの内容を簡単に調べる事が出来ます。
Fromイメージは何を使っているか？どんなアプリをインストールしているか？を確認します。

## Automation Buildか？

Githubで、公開されているDockerfileから自動ビルドされている。⇒ イメージの透明性が高い（と思います）ので、ちょっと安心。


# 補足
あくまで「判断材料」ということでお願いします。
「他にもこんな事にも注意した方が良いよ」というコメントも大歓迎です。
Azure改善提案書

# 前書き
特別MSさんの回しものでもなければ、Azureが嫌いなわけでもなく、
お仕事でクラウド構築を行うことが多いので、Azureの仕様について改善してもらえたら、もっと使い勝手がいいのに・・・と思うものをつらつらと。

常に機能UPしているので、改善されたらUPします。
       ＆
動作検証を進めて、改善ポイントは随時UPしていきます。


# 改善してほしい・・・
**全般**
:angry::angry:リソース名称の変更ができない。（作り直しって・・・）
:angry::angry:Azure Portalでできないことが多すぎ。
:disappointed_relieved:英語小文字と数字のみの命名規則となっているリソースが散在している。（統一してほしい）


**仮想マシン**
:angry::angry:NICを2枚以上つけようとすると、Azure Portalから操作できない。
:angry:パブリックIPを付けられるNICは、プライマリ設定したNICのみ。（メンテナンス用で裏LANにもつけたいのに・・・）
:angry:パブリックIPを付けられるNICは、プライマリ設定したNICのみ。（メンテナンス用で裏LANにもつけたいのに・・・）

:disappointed_relieved:仮想マシン作成後、NICの追加ができない。
:disappointed_relieved:仮想マシンのタイプによってattachできるNICの枚数に制限がある。
:disappointed_relieved:キャプチャ作成がAzure Portalからできない。
:disappointed_relieved:高可用性セットは作成時のみに設定でき後付けで設定できない。

**ApplicationGateway**
:angry::angry:イチイチ設定変更に時間が掛かりすぎ（5分から10分待つのは当たり前）
:disappointed_relieved:PFX形式の証明書のみってのは柔軟性がない。


**Load Balancer**
:angry::angry:SSLオフロード(LoadBalancerへのSSL適用)が利用できない。


**AutoScaleSet**
:angry::angry:ApplicationGatewayによるScaleSetは、BackendNatが利用できず、仮想マシンにアクセスできない。（なんじゃそりゃ！！）
:angry:Azure Portalから作成するとDefaultでLoadBalancerが選択され、ApplicationGatewayによる構成はAzure Portalから作成することができない。（PowerShellやAzure CLIによる作成）

**ContainerRegistoryService**
:disappointed_relieved:まだアメリカとヨーロッパでしかサービス提供されていない。利用してみたけど、すぐに使えて、便利:smile:

**Redis Cache**
:disappointed_relieved:Premiumタイプしか内部通信してくれない。せめてStandardも内部で通信してほしい。なんのためにRedisを利用するのかを考えると、当たり前のような気がするけど。。。


**その他**
:disappointed_relieved:Azure Portalにずっと接続していると、動作が重くなる。
:disappointed_relieved:同じく、正しい情報が表示されない（ストレージアカウント情報を見ようとすると「削除」って文字だけ出力）
PHPでプレミアムフライデー（月末の金曜日）を求める

いよいよプレミアムフライデーですね！
~~働いていますが何か？~~

## 月末の金曜日
最後の曜日を計算する書式は 'last *dayname* of' です。
[PHP: 相対的な書式 - Manual](http://php.net/manual/ja/datetime.formats.relative.php)

```php
$d = new \DateTimeImmutable('last fri of');
echo $d->format('Y-m-d') . PHP_EOL;

/*
2017-02-24
 */
```

## 年間の月末の金曜日

```php
$begin = new \DateTimeImmutable('2017-01');
$end   = new \DateTimeImmutable('2017-12');

$iterator = new \DatePeriod(
	$begin->modify('last fri of'),
	\DateInterval::createFromDateString('last fri of next month'),
	$end->modify('first day of next month')
);

foreach($iterator as $date) {
    echo $date->format('Y-m-d') . PHP_EOL;
}

/*
2017-01-27
2017-02-24
2017-03-31
2017-04-28
2017-05-26
2017-06-30
2017-07-28
2017-08-25
2017-09-29
2017-10-27
2017-11-24
2017-12-29
 */
```

よい週末を
数独の数の予約について「Rubyで数独」

#はじめに

『[Rubyで数独：AIプログラミング入門](https://www.amazon.co.jp/dp/B01M2C4894/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)』の「数の予約」の説明で使っている表の記法と解説をまとめる目的でこのノートは書いています。本の中で使っているパズルは数独通信からひっぱってきているので、そのままではあれなので無料で入手可能な[Open Sudoku](http://opensudoku.moire.org/)のパズルに変更しています。
[Open Sudoku](http://opensudoku.moire.org/)のVERY HARDのステージ53をある程度まで進めた図が次の左の図になります。この状況から先に進むのに「数の予約」を使えます。下の図の大きな数字は確定済みで、小さな数字はとりうる値を意味しております。

<img width="254" alt="井桁理論3.png" src="https://qiita-image-store.s3.amazonaws.com/0/227/2277bdda-e3de-ad79-5a00-00c76fd34770.png">

ここから、「数の予約」が使えるところまで、もう少し勧めます。まず中央上段の3X3のボックスに注目するとD5ですでに5が使われているのでD1, D2には5が入りません。
<img width="254" alt="数の予約1.png" src="https://qiita-image-store.s3.amazonaws.com/0/227/f510350f-0723-a0ce-cd4f-0bae0203aba0.png">
つまり、中央上段のボックスに注目すると5はE1かF1に入ります。従って、1列目の他のマスには5は入りません(いずれにしても理論)。ここでは今後の展開に関係のあるB1の5だけ消しておきます。
<img width="254" alt="数の予約2.png" src="https://qiita-image-store.s3.amazonaws.com/0/227/108a709c-b86d-6c7b-441e-1c08512baf21.png">
それから、B1のタテとヨコにある数字をB1の候補から除くとB1の候補に1, 7, 9が残ります。
<img width="254" alt="数の予約3.png" src="https://qiita-image-store.s3.amazonaws.com/0/227/330acdd8-06b0-2915-5829-a4770dd416e2.png">
次にC列に注目するとC6に7があるので、C4, C6には7は入り得ません。
<img width="254" alt="数の予約4.png" src="https://qiita-image-store.s3.amazonaws.com/0/227/94e835fb-65f2-e8fa-8747-082b21d5e0b4.png">
すなわち、C1かC2に7が入るのですが、左上段の3x3ボックスに注目するとC1, C2以外のマスには7が入り得ないことが分かります(いずれにしても理論)。
ここでは、今後の展開に関係のあるB1の7だけ消しておきます。
<img width="254" alt="数の予約6-2.png" src="https://qiita-image-store.s3.amazonaws.com/0/227/da3fe016-769b-856a-1b37-164debe352e9.png">
次に右上部の3x3ボックスに注目します。E2とF2からG2は1,9は取りえません。またI4とI8からI3も1,9を取りえません。つまり残ったG1かI3に1, 9は入ります(セルの予約)。今後関係するG1だけ2から8の候補を消します。
<img width="254" alt="数の予約7.png" src="https://qiita-image-store.s3.amazonaws.com/0/227/5864ca45-a99c-d5fd-30db-fd91b688774f.png">
これで準備が整いました。

#解説

下の表は3行目のマスを縦軸に、その取りうる値を横軸にとっています。「はじめに」のところの最後の配置ですでに値の確定している部分に◯、入らない値については✕を入れます。1行目に注目すると、B1とG1に1と9が入ります。つまり下の表の"・"の部分は✕が入ります。このテクニックを「数の予約」と言います。
<img width="215" alt="数の予約8-2.png" src="https://qiita-image-store.s3.amazonaws.com/0/227/d5e62679-1453-ca65-ca93-5e38b5b38940.png">
"・"のところにXを入れた後の状態は次のようになります。
<img width="254" alt="数の予約8.png" src="https://qiita-image-store.s3.amazonaws.com/0/227/105196fb-9fa4-db47-165c-db9cf4bbc900.png">
lazy var の遅延参照？という面白い動き

昨日とても不可解なバグがあったため色々試してみたが、最終的にはここまでは落とし込めたので、この動作を共有するとともになぜこのようなことが発生しているのかを教えていただける親切な方々がいればと願います。

まずは下記のコードを Playground とかで見てみましょう

```swift
struct Data {
	
	var int = 1
	
	mutating func increase(completion: (Int) -> Void) {
		self.int += 1
		completion(self.int)
	}
	
}

class Manager {
	
	var data = Data()
	
	var int: Int {
		return self.data.int
	}
	
	func increase() {
		self.data.increase { (i) in
			print(i)
			print(self.int)
		}
	}
	
}

let manager = Manager()
manager.increase()
```

さてこれを実行した場合の出力はどうでしょうかな？多分みなさんわかると思いますが、1 行目と 2 行目はともに `2` です。

さて、`class Manager` の `data` を `var` から `lazy var`、つまり `lazy var data = Data()` に直すと、果たして答えはどうでしょう？

実際やってみればすぐわかると思いますが、今度は 1 行目は前と同じ `2` で出力されるが、2 行目は `1` 、つまり `data` が書き換えられる前の数値が出力されるのです。

もちろん `manager.increase()` の後にもう一回 `print(manager.int)` で見てみるとちゃんと書き換えられた後の `2` で出力されるのですが、値型で確実にデータの書き換えの同期が要求される場面では `lazy` は使わないほうがよさそうですね。（参照型は「参照先」である値が変わるわけではないので大丈夫かとは思いますが）

ところでこれはなぜでしょうか？🤔
Go言語への備忘録

#Go言語とは
Go言語とは、googleが開発している言語であり、コンパイラ言語、並列プログラミングへの特化を念頭に開発された言語である。

とにかく楽しそうなので触ってみる。

#Go言語の初め方

##Linuxへのインストール
1.GoToolを[ダウンロード](https://golang.org/doc/install?download=go1.8.linux-amd64.tar.gz)
2.ダウンロードしたファイルを"/usr/local"の下に解凍
3."/usr/local/go/bin"にパスを通す
  ```export PATH=$PATH:/usr/local/go/bin```

ちなみに他のディレクトリにインストールする場合は$GOROOTを別途指定する必要がある。
See also [golang.org](https://golang.org)
よく使うMySQLとRailsコマンド

##パスワードを指定してログインする方法
```
mysql -u root -pPASSWORD
```


##本番環境コマンド

```
$ rake db:migrate RAILS_ENV=production
```

http://yamacent.hatenablog.com/entry/2015/06/03/235900



##データベース確認

```
show databases;
```

https://www.oiax.jp/rails3book/setup_mysql.html


###テーブル確認

```
SHOW TABLES;
```

##登録状況確認

```
select user,host from mysql.user;
```


##本番環境

```
DISABLE_DATABASE_ENVIRONMENT_CHECK=1 rake db:migrate:reset RAILS_ENV=production
```


###起動

```
mysql-ctl start
```

###パスワード設定
```
SET PASSWORD = PASSWORD('some password')
SET PASSWORD FOR user = PASSWORD('some password')
```


###ホスト変更

```
rename user test@localhost to sample@example.com
```

###データベース削除

```
DROP DATABASE db_name;
```

###テーブル作成

```
CREATE TABLE db_name.tbl_name
  (col_name1 data_type1, col_name2 data_type2, ...);
create table sampledb.personal(id int, name varchar(20));
```


###Seed

```
rake db:seed RAILS_ENV=production
```
Windowsでapmが使えない時の対処法

# 1. Pathを通す

Atomのコマンドで「Window: Install Shell Commands」を探す

# 2. コマンドが無かった場合

普通は
C:\Users\ *user name*\AppData\Local\atom\bin
にPathを通せばよいので自力で通す

# 3. binフォルダが存在しなかった場合

Atomを入れなおす

# 4. 入れなおしても存在しなかった場合

1. ~~自力でビルド（他のエラーが大量に出て挫折）~~
2. C:\Users\ *user name*\AppData\Local\atom\app-*version*\resources\cli を調べる
3. 此処にatom及びapmがあれば此処にパスを通す

これもしかしてアップデートの度に貼り直しなのでは。

# 参考リンク

https://github.com/atom/apm/issues/547
Reactノート3

#ライフサイクル

ライフサイクル図 参考:
http://qiita.com/kawachi/items/092bfc281f88e3a6e456

- ライフサイクルメソッドはclass内に直接記述

```index.js

import React from 'react'
import {render} from 'react-dom'

class Number extends React.Component {
  constructor(props) {
    super(props);
  }
  componentWillMount(){
    console.log("コンポーネントのマウント前")
  }
  componentDidMount(){
    console.log("コンポーネントのマウント後")
  }
  componentWillReceiveProps(){
    console.log("コンポーネントが受け取るpropsが変化")
  }
  shouldComponentUpdate(){
    console.log("コンポーネント再描画前 trueで再描画 falseで再描画されない")
    return true;
  }
  componentWillUpdate(){
    console.log("コンポーネント再描画前")
  }
  componentDidUpdate(){
    console.log("コンポーネントが再描画された後")
  }
  componentWillUnmount(){
    console.log("コンポーネントがアンマウントされた後")
  }
  render() {
    return (
      <div>コンポーネント</div>
    )
  }
};

render(
    <Number />,
    document.getElementById('root')
  );
```

```index.js

import React from 'react'
import {render} from 'react-dom'

var MyComponent = React.createClass({
    getInitialState:function(){
        return{count:0}
    },
    render:function(){
        return React.DOM.div(
        null,
        React.DOM.input({
            type:'text',
            onChange:this.doChange
        }),
        React.DOM.span( null,this.state.count )
        );
    },
    doChange:function( e ){
        this.setState( {count:e.target.value.length});
    },
    //コンポーネントがマウントされた直後に呼び出される
    componentDidMount:function(){
        console.log( 'マウントされました' );
    },
    //コンポーネントの呼び出し直前に呼び出される
    componentWillUpdate:function( nextProps, nextState ){
        console.log( 'ステート更新:',nextState );
    }
});

render(
    <MyComponent />,
    document.getElementById('root')
  );
```

![スクリーンショット 2017-02-24 12.59.51.png](https://qiita-image-store.s3.amazonaws.com/0/62264/179ca257-71fc-f51a-55f3-536aab0e399f.png)

![スクリーンショット 2017-02-24 12.59.56.png](https://qiita-image-store.s3.amazonaws.com/0/62264/521fac0b-928e-2775-7bed-a0330398f7ce.png)


サンプル
http://codepen.io/to-r/pen/rjPzmJ



#イベント

#####UI

- 半分は「表示」

- 残り半分は「ユーザーの入力に反応」すること

　(ユーザーの入力に応じて、イベントハンドラ記述する)

###Reactでイベント処理

- Reactコンポーネントにイベントハンドラを登録

- イベントハンドラ内でコンポーネントのstateを変更する

- stateが変更されたら、コンポーネントが再描画される

- コンポーネントのrenderメソッド内でthis.stateを参照する


![スクリーンショット 2017-02-24 11.39.24.png](https://qiita-image-store.s3.amazonaws.com/0/62264/5f0b1a84-a2a1-6fc8-e351-20db848549c6.png)


```index.js

  import React from 'react'
  import {render} from 'react-dom'

  class MyComponent extends React.Component {
    constructor(props) {
      super(props);
      this.state = {
        myText : null
      };
      this.setMyText = this.setMyText.bind(this);
    }

    setMyText(){
        this.setState({
          myText : this.refs.myText.value
        });
        this.refs.myText.value='';
    }
    render() {
      return (
        <div>
          <p>入力値:{this.state.myText}</p>
          <input type="text" ref="myText"/>
          <input type="button" value="入力"　onClick={this.setMyText}/>
        </div>
      )
    }
  };

  render(
    <MyComponent />,
    document.getElementById('root')
  );
```


- ref属性:入力フィールドの値を参照
- クリック後、setMyTextメソッドが実行。
　state.myTextに入力内容が反映され再描画処理。
激安NSAttributedString

激安感を出したい時にお使いください。

この記事は
[✨安い！！お得！！激安CSS！！✨](http://qiita.com/shiozaki/items/0e42e101b7483df13c8f)をiOSでNSAttributedStringを使って実装したものです。

上記記事で使われている`Poppins`はiOSのフォントに無かったため、似ているフォントを使用しました。
まるっきり同じではありませんが、だいたい同じ感じで実装できました。

<img alt="スクリーンショット 2017-02-23 23.43.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/69901/c5382050-bf8d-a3f5-496c-12e8b21d9b19.png">



``` Swift

import UIKit

class ViewController: UIViewController {

    @IBOutlet private weak var label: UILabel!
  
    override func viewDidLoad() {
        super.viewDidLoad()

        setupLabel()
    }


	private func setupLabel() {
        let attributeText = NSMutableAttributedString(string: "19,800円")
        let textSize = attributeText.string.characters.count

        attributeText.addAttributes(baseAttributes, range: NSRange(location: 0, length: textSize))
        attributeText.addAttributes(priceLargeAttributes, range: NSRange(location: 0, length: 3))
        attributeText.addAttributes(priceSpaceAttributes, range: NSRange(location: 5, length: 2))
        attributeText.addAttributes(yenAttributets, range: NSRange(location: 6, length: 1))

        label.attributedText = attributetText
    }

    private var baseAttributes: [String: Any] {
        let shadow = NSShadow()
        shadow.shadowOffset = CGSize(width: 5.0, height: 5.0)
        shadow.shadowBlurRadius = 5.0

        let attributes: [String: Any] = [
            NSForegroundColorAttributeName: #colorLiteral(red: 0.7803921569, green: 0.01960784314, blue: 0.02352941176, alpha: 1),
            NSStrokeColorAttributeName: #colorLiteral(red: 1, green: 1, blue: 1, alpha: 1),
            NSStrokeWidthAttributeName: -3.0,
            NSShadowAttributeName: shadow,
            NSFontAttributeName: UIFont(name: "AmericanTypewriter-CondensedBold", size: 40.0)!,
            NSKernAttributeName: -2.0,
            NSObliquenessAttributeName: 0.4, // 文字を斜めにする
        ]

        return attributes
    }

    private var priceLargeAttributes: [String: Any] {
        let attributes: [String: Any] = [
            NSFontAttributeName: UIFont(name: "AmericanTypewriter-CondensedBold", size: 50.0)!,
            ]

        return attributes
    }

    private var priceSpaceAttributes: [String: Any] {
        let attributes: [String: Any] = [
            NSKernAttributeName: 7.0,
            ]

        return attributes
    }

    private var yenAttributes: [String: Any] {
        let attributes: [String: Any] = [
            NSFontAttributeName: UIFont(name: "HiraginoSans-W6", size: 25.0)!,
            NSObliquenessAttributeName: 0.0,
            ]

        return attributes
    }
}
```