OmniAICreator/Qiita-1.07M huggingface dataset:
Slackのfree planのintegration limitについて

# はじめに

slackのfree planを使ってるといつのまにか、`Your team is approaching the integration limit.` と警告されてしまいますが、permissionを見ると ~~`Your team has 8 apps and custom integrations already installed`などと言われていて、free planの制限は10 apps or serviceの筈( https://apc-tdl.slack.com/pricing ) じゃないか？まだ２個足せるじゃんと困惑しました。何故、limitに到達してないのに`Your team is approaching the integration limit.`と警告されるのかは、現在slackに問い合わせ中です。~~ 英文の読み間違いなのに:flushed: :flushed:、、Slackから丁寧な返信をしてもらえました。`The message indicates that you're getting closes to the 10 integrations limit since you already have 8 — is just a simple warning. You haven't reached your limit yet.` 

つまり、 *限界に近づいていますよ* というだけな軽い警告を示していて、何も制限されていないという。。:flushed: :flushed:

ここでは、何が`Your team has X apps and custom integration already installed`の`X`に含まれるかという、備忘録的なものです。

# カウンタ
## カウントされるもの

下記エントリが *enable* / *disabled* の時。

- apps ( /apps/manage )
- custom integration ( /apps/manage/custom-integrations )

## カウントされないもの

おそらく上記以外の種別と、上記のエントリを *remove* した時。

いくつかのアプリはremoveしても、approved/restrictedのエントリに表示が残るが、removeしている時点でカウンタからはマイナスされているのを確認済み。

# 補記

slack api tokenを使ってslack apiを直接叩けば、incoming webhookでカウンタを消費する必要がなくなります。しかし、お話できるbotやoutgoing webhookはslack側をトリガにするので、代替手段はないと思います。

# TODO

- [x] ~~何故、limitに到達してないのに`Your team is approaching the integration limit.`と警告されるのか~~ 何故もなにも、到達しそうだから言われてるという・・:flushed: :flushed:
【失敗則】【アホな勘違い】Promiseで ReferenceError: resolve is not defined と出たら

# <i class="fa fa-graduation-cap" aria-hidden="true"></i> 結論

引数は省略せずに書きましょう。


迷走時間30分。衝動書き。



# <i class="fa fa-cubes"></i> 概要

```js:誤
new Promise(function(res, rej) {
    resolve();
})
```

**ReferenceError: resolve is not defined**

が出る。

正しくは

```js:正
new Promise(function(resolve, reject) {
    resolve();
})
```

# <i class="fa fa-cube"></i> なぜ間違えたのか

リファレンスなどで書かれている長い変数名は省略する傾向にある。

`resolve()`という書き方は、`this.resolve()`=`Promise.resolve()`の省略形だと思っていた。(意味不明)

アロー関数`() => {}`で書いており、アロー関数の場合は(babelをかますと？)`this`を手動で`bind(this)`しなけれなならない的知識がついていた。

`console.log(this)`とすると、グローバルの`Window`が返ってきていた。

よって、`this`を`Promise`にしようと悪戦苦闘。

[JavaScript Promiseの本](http://azu.github.io/promises-book/)
のサンプルコードをコピペして見比べて発覚。

引数が関数パターンに弱い。

Promise理解していない。

$.ajaxとかでコールバックの無名関数の引数名を任意に変えるぐらいなんどもしているのだが…
elasticsearch-analysis-kuromoji-neologdの辞書を最新に置き換えて自前ビルド・インストール

本家
https://github.com/codelibs/elasticsearch-analysis-kuromoji-neologd
が5.x系のみの更新サポートになってしまったので
2.xユーザーが自前で更新する方法
環境はCentOS 7.2

git clone -b 2.4.x https://github.com/codelibs/elasticsearch-analysis-kuromoji-neologd.git
でソースを取得し、
pom.xml
の
<kuromoji-ipadic-neologd.version>5.5.2-20161110</kuromoji-ipadic-neologd.version>
を
http://maven.codelibs.org/org/codelibs/lucene-analyzers-kuromoji-ipadic-neologd/
の
luceneのバージョン 5.5.2　の最新の日付のパスに変更する。
＊例：5.5.2-20161229
　3/10追記：ディレクトリのパスでのファイル一覧表示が出来なくなったようです。本日時点での最新は5.5.2-20170213
mvn package
でビルド

＃サービスを止めてプラグインを更新
/etc/init.d/elasticsearch stop

rootで
/usr/share/elasticsearch/
から
bin/plugin install file:/＜git用のパス＞/git/elasticsearch-analysis-kuromoji-neologd/target/releases/elasticsearch-analysis-kuromoji-neologd-2.4.2-SNAPSHOT.zip
＊sudoだと「Continue with installation? [y/N]」で選択できないのでrootで実行

＃サービス再稼働
/etc/init.d/elasticsearch start



＃＃雑記
そろそろMarkdown覚えないとな・・・
unix系でディレクトリ階層状態を知りたい

最近ざっくりと調べるのに良く使うのは *tree* コマンド
図式化してくれてみやすいです。

```:オプション：サイズ(h)ディレクトリのみ(d)シンボリックリンク(l)で指定
$ tree -hdl
.
└── [4.2K]  node_modules
    ├── [ 238]  abab
    │   └── [ 136]  lib
    ├── [ 476]  acorn
    │   ├── [ 204]  bin
    │   ├── [ 204]  dist
    │   └── [ 714]  src
    │       ├── [ 102]  bin
    │       ├── [ 306]  loose
    │       └── [ 102]  walk
 :
 :
```
オプションはいろいろあるので、*man tree*で調べると面白いかも。
よく使いそうなのは

|オプション|機能
|:-:|:-:
|--help|ヘルプ
|-a|隠しファイルやフォルダも全て表示
|-d|ディレクトリのみ表示
|-l|シンボリックリンクを表示
|-f|相対パスを表示
|-h|ファイルサイズを表示
|-u|オーナーを表示
|-g|グループを表示

でも、treeが使えないときもある。
そうなると使うのは *find* このコマンドは使い慣れると便利です。

```:オプション：ディレクトリ(d)とシンボリックリンク(l)指定したlsリスト
find . \( -type d -or -type l \) -ls
```
コマンド*ls -la*で出すような詳細な情報を得られます。


ちなみに、シンボリックリンクのリストがほしければ

```
find . -type l -ls
```

環境移植するようなとき、シンボリックリンクの一覧がほしいとか、
新しい環境にシンボリックリンクを一気にかけるようなシェルがほしいとかそんなとき、
*find*と*awk*を使ってみよう。

```
find . -type d -ls | awk '{print "ln -s ",$13,$11}'
```
GoogleSpreadSheetで別ブックのセルを参照するtips

IMPORTRANGE関数でいけます。
https://support.google.com/docs/answer/3093340?hl=ja

こんな感じでブックのIDを指定すれば、あとはシートとセルを参照するだけです。

```

=IMPORTRANGE("1NB5Cq3xxxxxxxxxxxxxxxxx","デスマプロジェクト計画!D91")

```

ちなみにこの式をコピペしていっても参照セルが変更されなくて悶えます。
行全部をガバっと行きたい場合は先頭セルから配列で参照します。

```

=IMPORTRANGE("1NB5Cq3xxxxxxxxxxxxxxxxx","デスマプロジェクト計画!D91:D1000")

```
※展開先のセルに値や式が入ってるとエラーになるのでクリアしておきましょう
rails5移行を進めてるんだけど、less-railsがwarning吐きまくってうるさい

## warningを確認
下記のようなwarningがことあるたびに出てつらい…

```bash
% rails s
=> Booting Puma
=> Rails 5.0.1 application starting in development on http://localhost:3000
=> Run `rails server -h` for more startup options
DEPRECATION WARNING: Sprockets method `register_engine` is deprecated.
Please register a mime type using `register_mime_type` then
use `register_compressor` or `register_transformer`.
https://github.com/rails/sprockets/blob/master/guides/extending_sprockets.md#supporting-all-versions-of-sprockets-in-processors
 (called from block in <class:Railtie> at /Users/t00114/src/github.com/webapp/.direnv/ruby/gems/less-rails-2.8.0/lib/less/rails/railtie.rb:16)
DEPRECATION WARNING: You are using the a deprecated processor interface Less::Rails::ImportProcessor.
Please update your processor interface:
https://github.com/rails/sprockets/blob/master/guides/extending_sprockets.md#supporting-all-versions-of-sprockets-in-processors
 (called from block in <class:Railtie> at /Users/t00114/src/github.com/webapp/.direnv/ruby/gems/less-rails-2.8.0/lib/less/rails/railtie.rb:21)
A server is already running. Check /Users/t00114/src/github.com/webapp/tmp/pids/server.pid.
Exiting
```

## 対応
Gemfile書き換えて、パッチが当たったものを適用したら無事、静かになりました。:angel:

```diff:Gemfile
git diff Gemfile
diff --git a/Gemfile b/Gemfile
index 259c4bc..1d3cb41 100755
--- a/Gemfile
+++ b/Gemfile
@@ -11,7 +11,7 @@ gem 'sdoc'
 gem 'mysql2'
 gem 'turbolinks'
 gem 'uglifier'
-gem 'less-rails'
+gem 'less-rails', git: 'https://github.com/MustafaZain/less-rails'
```



## 参考
https://github.com/MustafaZain/less-rails
gitで新規ファイルをグルーピングしてstashしたい

# gitで新規ファイルをグルーピングしてstashしたい

## 新規ファイル(untracked file)を外に逃がす手段

調べると以下のやり方が一般的に紹介されてます。

```bash
$ git stash --include-untracked
or
$ git stash -u
```

ただ、このコマンドだと全ての次にstashを適用する際に個人的には不便に感じました。
理想としては、任意のファイルをグルーピングしてstashしたいです。

## ステージにあげてからだとstashが使える

一旦新規ファイルをaddしてステージにあげてからstashすると、新規ファイルでもstashできます。
まとめたいファイルを一旦addしてからstashすれば、グルーピングしてstashできるわけです。

その際に名前をつけると、次にstashを戻したい時にわかりやすいです。

```bash
$ git stash save 'stash名'
```

## 同名の新規ファイルがあって、stashをapply/popした時にConflictしてしまう場合

新規ファイル絡みでもう一つ困ったのが、
stashした新規ファイルを適用する際に同名ファイルがあった場合conflictで適用できなかったことです。

こちらもconflictしているファイルをaddして、ステージングにあげてからapply/popするとmergeできます。

＊参照＊
[stack overflow: Force git stash to overwrite added files](http://stackoverflow.com/questions/16606203/force-git-stash-to-overwrite-added-files)
[stack overflow: How do you stash an untracked file?](http://stackoverflow.com/questions/835501/how-do-you-stash-an-untracked-file)
Swiftで多次元配列を使う場合

# Swiftで多次元配列を使う
Swiftで多次元配列を使う際に引っかかってのでメモ。(swift3.0)

## 宣言方法
**正しい宣言**

``` test.swift
var test = [[string]]()
test.append(["a"])
print(test)
// 出力結果
[["a"]]
```
**誤った宣言**

``` test.swift
var test:[[string]] = [[]]
test.append(["a"])
print(test)
// 出力結果 
[[], ["a"]]
```
誤った宣言の場合はbuildは通るが、初期化の時点で配列の先頭に空の配列が出来てしまうのでNG。

## 要素を追加する場合

``` test.swift
let data = "a"
test[0].append(data)
print(test)
// 出力結果
fatal error: Index out of range
```
添字を指定して要素を追加するとIndex out of rangeになる。どうやら存在しない配列に対して要素の代入を行おうとしているかららしい。調べてみると以下の方法で解決できた。

``` test.swift
let data = "a"
test.append([String]())
test[0].append(data)
print(test)
// 出力結果
[["a"]]
```
`test.append([String]()) // この一文を追加`
上記のように予め初期化した配列を格納することで要素を追加することが出来た。しかし、もっと良い方法があると思うので分かったら再度更新します。
rake taskを上書きする

 Rakeタスクを追加するとき、同じ名前でタスクを追加してしまうと、タスクが2つ存在することになりうまく動かないことがあります。

```ruby
namespace :hoge do
  desc "print bar"
  task :task do
    p "bar"
  end
end
```
このようなtaskが定義されているとします。

```ruby
namespace :hoge do
  desc "print bar"
  task :task do
    p "bar"
  end
end

namespace :hoge do
  desc "print foo"
  task :task do
    p "foo"
  end
end
```

この状態で`rake -T`を行うと、

```bash
$ rake -T
rake hoge:task  # print bar / print foo
```
となり、2つタスクが定義されているようになってしまいます。
これを解消するには、 `clear`を使ってtaskを消してから再定義する必要があいrます。

```ruby
namespace :hoge do
  desc "print bar"
  task :task do
    p "bar"
  end
end

Rake::Task["hoge:task"].clear
namespace :hoge do
  desc "print foo"
  task :task do
    p "foo"
  end
end
```

```bash
$ rake -T
rake hoge:task  # print foo
```

これで新しく定義したtaskが動くようになります。
capistranoの内容を上書きする際にも使えます。
ObjectiveCプロジェクトからSwiftの自作frameworkを呼び出そうとするとエラーになる。




Library not loaded: @rpath


#2017-01-17

OCプロジェクトからSwiftのframeworkを呼び出そうとするとエラーになる。

```
dyld: Library not loaded: @rpath/LampFrame.framework/LampFrame
  Referenced from: /Users/lamplight02/Library/Developer/CoreSimulator/Devices/595F3047-43B1-4C37-B346-7F836665BE39/data/Containers/Bundle/Application/14CE5C50-9ED6-4216-B9AE-14792BF89595/LampFrameProject-Objective-C.app/LampFrameProject-Objective-C
  Reason: image not found
(lldb) 
```

#試したこと

・Linked Frameworks and Libraries に該当のライブラリが設定されているか確認
・Build Phases > Copy Files に該当のライブラリが設定されているか
・Build Settings > Linking > Runpath Search Paths に @loader_path/../Frameworks/ と記述

#考えられる原因

http://qiita.com/hkato193/items/a0a80c1c32d2febe978e

```
このエラーは、Swift製フレームワークからSwiftの標準ライブラリをdyld(3)しようとしたものの、そういうファイルは無いからロードできなかったために発生しています。Swiftの標準ライブラリはアプリにバンドルされたものを使うので（将来は変わるかも）、アプリの設定によって、きちんとバンドルしてあげないといけないのです。
```

#解決策を試す
http://qiita.com/hkato193/items/a0a80c1c32d2febe978e

```
この場合、ターゲットのBuild Settingsにある[Build Options]-[Embeedded Content Contains Swift Code]が、きちんとYesになっているかどうかをチェックします。そして、もしNoになっていたらYesに変更することで、解決するはずです。
```


#Embeedded Content Contains Swift Codeがない


ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIESならあったのでそれをYESにしたけど動かない

xcode build settingsの項目を追加できないか

どうやら、追加できるかもしれない

http://tamulapin.hatenablog.com/entry/2014/06/11/163708


#Build Settings にステージング環境を追加

```
Build Settings にステージング環境を追加

Project Navigator の最上部にあるプロジェクトファイルを選択
「PROJECT」ファイルのアイコンを選択し、「Info」のタブを選択
「Configuration」内の + ボタンを押下し任意の名前で追加。この例では「Staging」として追加
```

動かない


![スクリーンショット 2017-01-17 11.43.41.png](https://qiita-image-store.s3.amazonaws.com/0/135794/d791641a-f483-1aa8-b503-e1948a1befab.png "スクリーンショット 2017-01-17 11.43.41.png")


#詰まった


よく調べるに、遅くパスの問題ではないだろうか。多分、Objectib-Cのプロジェクトでは、OS組み込みのフレームワーク（/System/Library/Frameworks）以外のところにあるフレームワークは検索パスを設定しないといけないらしい。/System/Library/FrameworksにLampframeをドラッグしようとしたら出来なかった


#Framework Search Pathsを指定


```
/Library/Framewerks
だめ
```

#Libraryをプロジェクトネームにしてみる

```
/ObjectibCFrame.app/Frameworks $(PROJECT_DIR)
だめ
```

#Run Search Paths を設定

```
$(inherited) @executable_path/Products
だめ
```

#LIBRARY SEARCH PATHSを設定する

```
$SRCROOT
//絶対パス→相対パスに変更
だめ
```

```
$(SRCROOT)/Classes/
だめ
```

#Deployment Targetを合わせる

hogehoge.frameworkのBuild SettingsのOS X Deployment Targetを現在のMacのOSバージョンに合わせれば治るらしい
http://blog.dalt.me/137

だめ


__________



#次やること

http://blog.livedoor.jp/blackwingcat/archives/1587216.html

~/.bash_profile にコードを書けばいけるらしい
子供たちへのプログラミング教育のこと

# 義務教育でのプログラミング教育

2020年までに義務教育でプログラミング教育をするんですって？

本当？いや、本当じゃないかも。2020年じゃなかったかも。義務教育じゃなかったかも。
ちなみに、高校だと情報の教科が既にある。最初は数学IIの最後のほうだったけれど、今は独立した教科になっているんだっけ？違うんだっけ？

ほら、この適当な情報源から話を始めるあたりがポエムのポエムたるゆえんだ。

とにかく、街を見て驚くのが、学習塾やパソコン教室が、こぞって「小学生向けプログラミング教室」を始めていることだ。これには本当に驚く。どこにそんな教室を運営できる講師が眠っていたのかということにも驚く。

主観を言わせてもらえれば、すでに焼畑が始まっている気がしてならない。

だって、老人向けスマホ教室とかやっていたところが、いきなりプログラミング教室とか言ってるんだぜ？無理だろ？

# 初等教育過程でのプログラミング教育

初等数学と言った場合高校までの数学を指すわけだが、ここでの初等教育は小学校とする。
多分文部科学省的な初等教育の定義はあると思うけれど、調べていない。

小学生向けに何をするの？というのが一番興味あるところだが、基本はScratchでビジュアルなプログラミングをしたり、ロボットのプログラミング（これはArduinoのスケッチか？）をしたりという内容のようだ。
正直、Scratchに救われている部分が大きいように思う。
教育用と称した謎なビジュアルなプログラミング環境は色々あるが、まあScratchなら、そんな間違いをすることもむしろ難しいだろう、という気がしている。
気がしているだけで、世の中にはExcelを方眼紙として使うという予想外な人種もいるので、何が起こるのかは分からない。

またロボットのプログラミングについてなのだが、個人的にはクロスコンパイル的な環境、というか、ホストとターゲットが分離している環境って、入門者向けとしてどうなのだろうと思っている。
多分これが受け入れられているのは、高専や高校あたりでArduinoどっぷりの人が違和感を持たないからなのかなという推測もしているが、根拠はない。

Arduinoなら、そんなに違和感ないのかね。
ならいいんだけど。

でも、柔王丸がArduinoで動いているとは思えないんだけれど。

# 学校で教えるべきなのかどうか

日本の初等教育は、型は教えるが理論は教えない。
たとえば、算数で掛け算の順番があっていないとまるにならない問題が定期的に話題になるが、まさにそれである。

これは、数学とは別に数学教育学という学問があるらしく、そいつらが諸悪の根源らしい。

型を学ぶのが大事なシーンというのは確かにあって、それは学問でも芸術でも同じだけれど、日本人は（日本人だけなのかは分からないが）型を繰り替えして安心して、あっという間に本質を忘れる。見事なくらいに忘れる。

型が好きなのだろう。

だからおそらく間違いなく、小学校でのプログラミング教育も型のみを教えて本質を教えない。そういう意味で、ほぼ間違いなく失敗する。

同時に、そういうやりかたをしていると、「嫌いな子」を作りやすくなる。
算数嫌いな子、勉強嫌いな子、いるよね。
でも、実際そこそこ知的な社会において知的に生活するためには、仕事にも生活にも、算数・数学は必要だし、国語も必要である。そもそも勉強が必要だし、世の中にあふれる色々な情報を受け止めるための学問は必須なのである。

押し付けの教育は、必ず嫌いな子を作る。今はプログラミングは押し付けられていないので、プログラミングが嫌いな子はいない。
大学で勉強してできなくて脱落した人はいるかもしれないけれど、そういう人は違う道に進んでプログラミングのことなんか忘れている。
2020年以降は、プログラミングが嫌いな子供が出現するだろう。

どうしよう？

みーんなが、だーいすきな、ぷろぐらみんぐのことを、きらーいって言っちゃう子供が出てきちゃうんだ、ぞー。

そもそも現在プログラミングを生業にしている人の多くは、学校で教わらないプログラミングを独学で学んできたひとだ。無論、バックグラウンドとしての大学教育の有無の差は大きいが。だから、強制的なプログラミング教育（しかも日本式）が何をもたらすか、正直分からんのだな。

# いまのエンジニアがなすべきこと

もしあなたが、プログラミングを楽しいものだと感じるのであれば、創造的で知的でエキサイティングな活動だと感じるのであれば、その楽しさを積極的に表明するべきだ。
子供に対して見せるべき大人の姿は、人生を楽しく満喫している姿であるべきだ。
決して、苦しいけれど頑張っている姿ではない。
頑張るのは当たり前だ。だけど、それが苦しいものであってはならない。
そんな時代は戦争が終わった時点で捨て去ったはずだ。

プログラミングを楽しんで見せること。これが今のエンジニアに求められることだと思う。

# とはいえ感じる違和感

本来初等教育で教えるべきは、ロジカルな物の考え方や、アルゴリズムの組立て方、それに加えて「コンピュータを使って、何をするか」だと思う。
プログラミングは道具に過ぎない。

しかし、僕等のような特殊な人種にとっては、プログラミングは手段であると同時に目的でもある。

現在既にそうなっている気もするが、頭の良い奴が、プログラミングは道具に過ぎないという考えを持つと、次に「プログラマは道具に過ぎない」という発想に移る可能性がある。
特に、昨今の専門職に対する金銭的リスペクトの低さ、端的に言えば「お前ら、好きなことやっているんだから、金はいらないだろ？」的な発想と結びつくと、さらに残念なことになる。

初等教育でプログラミングの型だけを学んだ子供が成長した時に、全体的な底上げの結果どういう人種が増殖するのかは、注意しておかないといけないような気がしている。
middleman-blogのレイアウト設定について

## middleman-blogの記事一覧でlayoutが有効にならない

middleman-blogでlayoutの指定を行っていたのですが、なぜだか反映されません…。

```rb:config.rb
activate :blog do |blog|
  blog.name = 'blog'
  blog.prefix = 'blog'
  blog.layout = 'blog-layout' # ブログ用のカスタムレイアウトを指定。デフォルトはlayout
end
```

この状態で、 http://localhost:4567/blog/ にアクセスしてみても、`blog-layout`が反映されておらず、`layout`のままでした。

## 個別の記事は反映されていることが判明

ここで、`2017-01-17-middleman.md`という記事を作ってみます。

```md:blog/2017-01-17-middleman.md
---
title: 初めての記事
---

# ヘッダー1

初めての記事です。
```

その後、 http://localhost:4567/blog/2017/01/17/middleman.html にアクセスしてみたところ、`blog-layout`が反映されていました。
middleman-blogのlayoutでの指定は、**個別記事のレイアウト指定**であり、一覧記事のレイアウト指定は`config.rb`では、できないようです。

## 記事一覧でレイアウトを指定する方法

`index.html.erb`や、`calendar.html.erb`や、`tag.html.erb`のような記事一覧を扱うテンプレート側で、Frontmatterでレイアウトを指定すれば、個別でレイアウトを適用することができます。

```erb:index.html.erb
---
pageable: true
per_page: 10
layout: blog-layout
---

省略
```

blog.layoutが効かない！と思ったら、この辺りを変更してみるとよいかと思います。

## 一括でレイアウト指定する方法はある

個別記事も記事一覧も同じレイアウトにしたいということであれば、`config.rb`で設定することができます。

```rb:config.rb
page '/blog/*.html', layout: 'blog-layout'
```

このようにすると、`/blog/`以下は全て`blog-layout`を使うようになるので、普段はこれでもいいかもしれません。
ただし、以下のようなイレギュラーなことをしようとすると、これだと行き詰まりました。

```rb:config.rb
page '/blog/*.html', layout: 'blog-layout'
page '/blog/special/*.html', layout: 'special-layout' # 適用されずにblog-layoutになってしまう
```

こういう場合は、個別のテンプレートファイルのFrontmatterでlayoutを指定したほうがよさそうです。
VisualStudioForMacでNuGetを使う

##まずはwebView使ってみよう

と思いたったが吉日。
早速どんな感じにやるのかぐぐってみると、下記記事発見。

[Xamarin.FormsでWebビューを使用するには？](http://www.buildinsider.net/mobile/xamarintips/0046 Xamarin.FormsでWebビューを使用するには？
)

記事を参考にしてソース書いて、さてビルド！！

![errxamarin.png](https://qiita-image-store.s3.amazonaws.com/0/11543/4e954d80-9f08-b340-6efe-3fd44141b33a.png)
*The type or namespace name 'Xamarin' could not be found.*
*Are you missing an assembly reference?*

・・・・・・

ぐぐるとなんかNuGet Packageがなんとかかんとかっていう記事がちらほら。
ただVisualStudioForMacではどこでやるんだ・・・と探し始めて30分。

![スクリーンショット 2017-01-17 15.52.58.png](https://qiita-image-store.s3.amazonaws.com/0/11543/3ee98437-4a07-789f-1524-65368ef2daad.png)

30分返してほしいけど誰かに奪われたわけでもないこの気持ち。


##NuGetからパッケージを追加

プロジェクト->NuGetパッケージの追加　をクリックして、右上の検索バーで検索、右下の「パッケージを追加」をクリックするだけ。

![スクリーンショット 2017-01-17 16.40.47.png](https://qiita-image-store.s3.amazonaws.com/0/11543/e0683516-4927-09d4-4a11-7b50bd782833.png)
kubernetes入門しました

# 概要
軽くkubernetesを触ってみたのでメモっておく

## nginx公式イメージを使ってpodを立ち上げる
- クラスタを作る


```
$ gcloud container clusters create lovelytokyo-server
```

- gcloudコマンドで接続

```
$ gcloud container clusters get-credentials lovelytokyo-server --zone asia-northeast1-a --project lovelytokyo-018
```

- nginx公式イメージを使ってpodを作る

```
kubectl run nginx-test --image=nginx:1.11.3  
```

- pod リストを見る

```
$ kubectl get pods 
NAME                          READY     STATUS    RESTARTS   AGE
nginx-test-2401148870-ccwiy   1/1       Running   0          59s
```

- 外部からアクセスできるようにポートを開ける

```
$ kubectl expose deployment nginx --port 80 --type LoadBalancer
service "nginx" exposed
```

- service一覧

```
$ kubectl get services
NAME         CLUSTER-IP       EXTERNAL-IP      PORT(S)        AGE
kubernetes   10.215.240.1     <none>           443/TCP        2h
nginx        10.215.250.213   104.198.91.116   80:32090/TCP   2m
```

- ブラウザで`http://104.198.91.116`確認する

## Dockerレジストリー
- イメージをbuildする


```
$ docker build -t gcr.io/lovelytokyo-018/test:v1 .
$ docker images
REPOSITORY                                        TAG                 IMAGE ID            CREATED             SIZE
asia.gcr.io/lovelytokyo-018/test                   v1                  2f050cbeafc8        34 minutes ago      56.01 MB
alpine                                            3.3                 00b92c86273f        2 weeks ago         4.805 MB
```

- イメージをDockerレジストリーにpushする

```
$ gcloud docker push asia.gcr.io/lovelytokyo-018/test:v1
```

- イメージをDockerレジストリーからpullする

latestタグをpull

``` 
$ gcloud docker pull gcr.io/lovelytokyo-018/sample-nginx
```

タグバージョン指定pull

```
$ gcloud docker -- pull gcr.io/lovelytokyo-018/sample-nginx:0.1
```


## nginx + webアプリ（go）構成でpodを作る

https://github.com/lovelytokyo/gcp-starter/tree/master
ここのREADMEにまとめておいた

## kubectlでDockerにてjobを実行する

https://github.com/lovelytokyo/gcp-starter/tree/feature_batch
ここのREADMEにまとめておいた

## 参考記事
http://qiita.com/FumihikoSHIROYAMA/items/205fa3aebd20b3a1bace
http://blog.grasys.io/post/dokuma/1st-step-kubernetes/
http://qiita.com/techeten/items/ebb0833d50c882398b0f
リーンキャンバスをBtoBtoCで使うにはどうすればいいか

リーンキャンバスについては以下の記事がわかりやすいです。
[リーンキャンバスを理解して使えるようになる](http://qiita.com/masarufuruya/items/4e4935984b85b4745fbc)

---
ビジネスモデルとしてBtoBtoCという形も珍しくないと思いますが、アイデアを整理しようとしてリーンキャンバスを使おうと思ってもうまく落とせないと感じました。

# 顧客とは
リーンキャンバスの顧客とはアイデアが形になったものを実際に利用したり使う人ではなく、形になったものを買ってくれる人のことを指します。

例えばBtoCなら顧客はCとなりますが、B(1)toB(2)toCの場合、自分がどちらのBになるかで顧客が変わります。
B(2)なら同じく顧客はCとなりますが、B(1)の場合はB(2)が顧客になります。

リーンキャンバスではこの顧客がターゲットとなるように埋めていきますが、自分がB(1)だから顧客はB(2)と想定して書くと__BtoBビジネスとしてのキャンバス__になってしまい、その先のtoCの情報が欠けてしまいます。

# どうすればいいか
これについて先輩に相談したところ、以下のアドバイスをいただきました。

1. リーンキャンバスを改造する
2. リーンキャンバスを2枚書く

## 1.リーンキャンバスを改造する
リーンキャンバスは黄金のテンプレートではないので、BtoBtoCに合わなければ合うように改造すればよいということです。
例えば、CUSTOMER SEGMENTSの横に新たにCONSUMERを追加することで、全体で見てもtoCの情報が落ちないようにするといった感じです。

## 2. リーンキャンバスを2枚書く
これはB(1)から見たBtoBで1枚、そしてB(2)から見たBtoCで1枚と合計で2枚書くやり方もあるんじゃないといわれました。
こちらはよりそれぞれの立場の課題や請求ポイントを具体的に書くことができますが、検証して書き直してなんぼのリーンキャンバスは修正が大変そうですね。

# 結局
2のリーンキャンバスを2枚書く方法でいってみることにしました。リーンキャンパスは書けば書くほど良いアイデアに成長させることができるので、場数も踏めますね。

# おまけ
ついでにいくつか気になったところも聞いてみました。

## Q. リーンキャンバスで全部埋められなかったらそのアイデアはイマイチ?
A. そんなことはない。埋められないところは検証で明らかにすればよい。初期アイデアで6割しか埋められないとかよくある。

## Q. リーンキャンバスを見ても相手によく伝わらなければそのアイデアはイマイチ?
A. リーンキャンバスは文章を書くスペースがないので情報が欠けることはある。補足資料とセットで見てもらうのは全然アリ。

## Q. リーンキャンバスで一番大事な項目は?
A.  __収益の流れと費用構造__。お金が流れなければビジネスとして成り立たないのでこの2つに自信がないと苦しい。もちろん上の項目と整合性がないとNG。

# おまけ2
私はリーンキャンバスを書くときにMarkdownでキャンバスが書けるツールを利用しています。
[リーンキャンバスをMarkdownで書く](http://qiita.com/tanksuzuki/items/7bdf9e1f003b98b01271)

非常に便利です。

が、これをWindowsのPowerShellから呼び出したときに__文字化け__してしまいました。

`easel.exe init > canvas.md`

原因はこのコマンドをPowerShellからたたいた時に出来上がるmdファイルが__UTF16__で書かれてしまうからのようです。
同様にwatchモードもUTF16に対応していないためか文字化けしてしまいます。
これはPowerShellを使わず普通のコマンドプロンプトを使えばこのようなことは起こりません。
Gogland で保存時に go fmt を走らせる

## 追記
2017/07/04
Settings > Go > On Save > On save run で設定できるようになってました。
`go imports` を選んでおくと保存時にgo fmt, go import が走るので便利です。

## Gogland とは
JetBrains が提供する Go 言語用の IDE

公式
[ JetBrains Gogland: Up and Coming Go IDE ] (https://www.jetbrains.com/go/)

## 保存時に go fmt を走らせる
デフォでやってくれないので自前で設定する必要あり

### JetBrains 用のプラグイン `File Watchers` を入れる
[Preferences] -> [Plugins] -> [Install JetBrains plugins] から　`File Watchers` で検索、インストール、再起動

![スクリーンショット 2017-01-17 16.03.06.png](https://qiita-image-store.s3.amazonaws.com/0/47981/92fe4282-071b-729a-82b5-35c3ab2c6003.png)

### `File Wathcher` で`go fmt`の設定を登録する
[Preferences] -> [Tools] -> [File Watchers] -> [+] ボタンから新規作成

Choose Template は `<custom>` を選択する
![スクリーンショット 2017-01-17 16.11.22.png](https://qiita-image-store.s3.amazonaws.com/0/47981/438ae9a5-d6c0-a1ce-7a39-30dc5e9067d2.png)

New Watcher は以下のように設定する

Name: `Go fmt`　(わかりやすい名前を適宜)
File   type: `Go`
Scope: Project Files
Program: `/usr/local/bin/go` [^1]
Arguments: `fmt $FileDir$/$FileName$`

![スクリーンショット 2017-01-17 15.50.03.png](https://qiita-image-store.s3.amazonaws.com/0/47981/64d38632-6257-1143-d3ca-242406d8c408.png)

あとは再起動すれば保存時に`go fmt`が走ってフォーマットされる

## 追記
~~自動保存とfmtの相性が悪く　`go fmt` を使いやすいショートカットに割り当てるのが良さそう~~
~~私は手癖がついている `cmd+S` に割り当てました~~

@yagihiro さんより、コメントにて

>自動保存のくだりのところ、
>Immediate file synchronization のチェックを外すことで期待通りの動作になるかと思いますのでお試しくださいませ。

自動保存を切って、この設定を外すのが良さそうです。

[^1]: コマンド`go`へのパス。わからない場合は`which go`で出力するといいかも
rubyでSQLを書き換える

# インストール

```shell-session:rubyとsql-parserをセットアップする
[vagrant@localhost ~]$ sudo yum install ruby-devel
[vagrant@localhost ~]$ sudo gem install sql-parser
[vagrant@localhost ~]$ irb
```

# サンプルコード

```rb:SQLのfromを書き換える
irb(main):001:0> require 'sql-parser'
irb(main):002:0> parser = SQLParser::Parser.new
irb(main):003:0> ast = parser.scan_str('SELECT * FROM users WHERE id = 1')
irb(main):004:0> users = SQLParser::Statement::Table.new('users_001')
irb(main):005:0> from_clause = SQLParser::Statement::FromClause.new(users)
irb(main):006:0> where_clause = ast.query_expression.table_expression.where_clause
irb(main):007:0> table_expression = SQLParser::Statement::TableExpression.new(from_clause, where_clause)
irb(main):008:0> list = ast.query_expression.list
irb(main):009:0> select_statement = SQLParser::Statement::Select.new(list, table_expression)
irb(main):010:0> select_statement.to_sql
=> "SELECT * FROM `users_001` WHERE `id` = 1"
```

# ライブラリ

- https://github.com/cryodex/sql-parser

# 参考

- [rubyでSQL文をパースする](http://qiita.com/kacho/items/3a1d2c62131c9c13db19)

以上
外部アプリからもDjangoのORMを使ってDBを操作したい

Djangoのモデル操作や参照については、

```
python manage.py MY_COMMAND
```
とかやれば出来るのだが、これはDjangoのアプリケーション配下に `/app_name/management/commands/MY_COMMAND.py`として置き、`BaseCommand`を継承して下記のようにしなければならない。

```python:MY_COMMAND.py
from django.core.management.base import BaseCommand, CommandError
class Command(BaseCommand):
    def handle(self, *args, **options):
        print 'hogefuga'

```
こうすることで、上記の`manage.py MY_COMMAND`によってDjangoの拡張コマンドとして利用することが可能になる。
Djangoのアプリと関連した何かを作りたい時は上記で良いですね。

# Djangoのアプリと関係ないけどDBを参照したい
DjangoのDBを何かしらの管理情報のマスターとしている場合や、格納されている結果を使って全く別のプログラムと連携させたいときは、`manage.py`の拡張ではなく、外部から呼び出す形にしたい。

Djangoの裏はただのSQLiteやMySQLなので、直接アクセスして情報を読取るってのでも良いんですが、せっかくDjangoでModelを定義したのに、そのORMを使わないのもなーと
というわけで、ORMを外部から使える方法です。
※注 : 下記の方法は、アプリをDjangoプロジェクトに依存させてしまう方法です。Djangoプロジェクトのディレクトがずれたりすれば当然、参照先も変更の必要があります。

## Projectをライブラリとして読み込ませる
下記の手順で、外部からもDjangoのORMを利用できます

- sys.pathにDjangoのプロジェクトを指定
- Djangoの環境変数`DJANGO_SETTINGS_MODULE`にプロジェクト`settings.py`を指定
- modelsのimport

```python:ORM_test.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
import sys

def CallORMapper():
    sys.path.append('/YOUR/DJANGO-PROJECT')
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "DJANGO-PROJECT.settings")
    objects = MODEL_NAME.objects.all()
    from DJANGOAPPNAME.models import MODEL_NAME
    print objects

if __name__ == "__main__":
    CallORMapper()
```

# 参考
 - [DjangoモデルをDjangoプロジェクトの外から使う](http://blog.shigepon.info/blog/2015/07/28/use-django-model-outside-django-project/#.WH3BlLaLRE4)
 - [Use only some parts of Django?](http://stackoverflow.com/questions/302651/use-only-some-parts-of-django)
 - [Using only the DB part of Django](http://stackoverflow.com/questions/579511/using-only-the-db-part-of-django)
【PHP】HTTP/HTTPS エンドポイントへの Amazon SNS メッセージの送信を受け取ってパースする

```php:test.php
// Fetch the raw POST body containing the message
$postBody = file_get_contents('php://input');

// JSON decode the body to an array of message data
$message = json_decode($postBody, true);
if ($message) {
    // Do something with the data
    echo $message;
}
```




POSTに使った便利なchrome拡張機能
[DHC - Restlet Client](https://chrome.google.com/webstore/detail/dhc-restlet-client/aejoelaoggembcahagimdiliamlcdmfm)
DockerでDynamoDBのローカル環境を手に入れる

DynamoDBはAWSのサービスですが開発時にローカル環境であると便利です。
ちなみにAWSが公式で配布しています
http://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/DynamoDBLocal.html
が、何かと導入環境に左右されるのでDockerで手軽に作ります。

## Dockerイメージ
DynamoDBのDockerイメージはいくつか公開されていますが、今回は一番お手軽そうな
https://hub.docker.com/r/tray/dynamodb-local/
こちらを使わせていただきます。

## コンテナ起動
とりあえず考えずにDescriptionにあるコマンドで起動
```$ docker run -i -t -p 7777:7777 tray/dynamodb-local -inMemory -port 7777```
起動して、「あ、バックグラウンド実行じゃなかった」と気づきますがとりあえずいいです。

## 疎通確認
Pythonで疎通確認します。

```
>>> from boto.dynamodb2.layer1 import DynamoDBConnection
>>> conn = DynamoDBConnection(host='xxx.xxx.xxx.xxx', port=7777, aws_access_key_id='', aws_secret_access_key='', is_secure=False)
>>> conn.list_tables()
{u'TableNames': []}
```
起動したばかりなのでテーブルは当然存在しません。接続できなければタイムアウトするので無事起動と疎通は確認できました。
あとは煮るなり焼くなり。
AngularJSでデバッグのために変数の値を表示する

AngularJSを使用して開発を行っている際、`$scope`や`controller`に格納されている値を確認したいというケースがよくあります。そのような時、`<pre>` と `json` フィルタを使用するとUI上で値を簡易的に確認することができます。以下に例を示します。

### Controller

```js
angular
  .module('app', [])
  .controller('mainController', function($scope) {
    var vm = this;

    $scope.value1 = {
      name: '$scope',
      text: 'This is $scope value.'
    }

    vm.value2 = {
      name: 'controller',
      text: 'This is controller value.',
    };
  })
```

### View

```html
<div ng-controller="mainController as main">
  <pre>{{value1|json}}</pre>
  <pre>{{main.value2|json}}</pre>
</div>
```

[実行例](https://embed.plnkr.co/4dnHXkE6OaH2x0KsqSLJ/)

また、こちらの記事も参考になります。
[AngularJSで便利なChromeデバッグTips](http://qiita.com/Quramy/items/f9b18ea5dd7c62e1bb0f)
EC2 Windows インスタンスの Administrator パスワードを取得する

# AWS CLI の場合

```shell-session
$ aws ec2 get-password-data --instance-id  i-1234567890abcdef0 --priv-launch-key /path/to/mykey.pem
```

# AWS SDK for Ruby の場合

SDK は復号化までしてくれないので [CLI のソース](https://github.com/aws/aws-cli/blob/develop/awscli/customizations/ec2/decryptpassword.py)を参考に自分でやる。

```rb
require "aws-sdk"
require "base64"
require "openssl"

ec2_resource = Aws::EC2::Resource.new
instance = ec2_resource.instance "i-1234567890abcdef0"
password_encrypted = instance.password_data.password_data
private_key = OpenSSL::PKey::RSA.new(File.read(File.expand_path("/path/to/mykey.pem")))

p private_key.private_decrypt(Base64.decode64(password_encrypted))
```

# [ec2ctl](https://github.com/y13i/ec2ctl) の場合

拙作のツールです。

```shell-session
$ ec2ctl --attributes instance_id,tag:Name,password --private-key-file "/path/to/mykey.pem"
{
  "time": "2017-01-17 12:18:07 +0900",
  "severity": "INFO",
  "ec2_instances_summary": [
    {
      "instance_id": "i-1234567890abcdef1",
      "tag:Name": "test_win1",
      "password": "5z(bo%%o5w$eiR2L!$=H6(jB=5VqUGrV"
    },
    {
      "instance_id": "i-1234567890abcdef2",
      "tag:Name": "test_win2",
      "password": "*HQTw2brpMGXO)dh9%rlXWTvGh@=b&GQ"
    }
  ]
}
```
GoogleDriveからcurlでダウンロードする

# ファイルIDを調べる
共有可能なリンクを探す、で発行されるリンクの?id=以降の部分

```
https://drive.google.com/open?id=XXX
```
# ファイルサイズが25MB以下の場合
GoogleDriveは25MB以下の場合は以下の通りでDLできる。

```
curl -L -o hoge.tar.gz "https://drive.google.com/uc?export=download&id=XXXXXXXX"
```

# ファイルサイズが25MBより大きい場合
先ほどのURLでリクエストすると
「Google ドライブではこのファイルのウィルス スキャンを実行することはできません。」
の画面がでるので、その中の(毎回変わる)リンク先を調べる必要がある。

```
curl -c /tmp/cookie.txt -s -L "https://drive.google.com/uc?export=download&id=XXXXXXXX" |grep confirm |  sed -e "s/^.*confirm=\(.*\)&amp;id=.*$/\1/" | xargs -I{} \
curl -b /tmp/cookie.txt  -L -o hoge.tar.gz "https://drive.google.com/uc?confirm={}&export=download&id=XXXXXXXX"
```
.NET FrameworkのDataGridViewに日付を追加する(C++）

# DataGridViewとは

フォームにエクセルのようなグリッドを作成します。
フォーム内のセルは自由に追加、削除できる機能がデーターグリッドビューには装備されています。データーグリッドビューは、Visual　Studio　C++　2005バージョン以降から利用できるようになりました。

今回は、このグリッドに日付を追加してみます。下の図のDateの部分がそれになります。

![image](https://qiita-image-store.s3.amazonaws.com/0/139807/260bec3d-132f-bf6f-acf3-68346ae03600.png)

#C++コーディングの解説
.NETといえば、C#が最も多く使われる言語かもしれませんが、C++でも簡単にフォームアプリケーションが作成できます。C/C＋＋に慣れている人は、同じ言語で作成したほうが作業が楽になります。

日付を取得するには`#include <time.h>`をインクルードします。
`tm`構造体を作成し、現在の時刻を`localtime(&timer)`で取得します。

構造体には９つのメンバがありますが、年と月には注意がいります。`tm_year`は1900年からの年数、`tm_mon`は0からの月数なので、それぞれ1900と１をプラスしてコードに書きます。

さらに、メンバはint型のため、Datagridiviewに追加するにはSystem::Stringの型に直しておく必要があります。

int→string→System::Stringへと変換します。

intからstringはC++なら単純に、stringstreamを使用するのが最も簡単だと思います。`<sstream> と　<string>`をインクルードします。

setw()で桁数を設定し、setfill()で数字の隙間を０で埋めます。何も指定しなければ、`2017年1月1日1時0分`となると不格好な表示になってしまいます。これをPCらしく`2017年01月01日01時00分`のように表示させます。これを利用するには、`#include <iomanip>`をインクルードしてください。

```c++:
stringstream ss;
ss << year << "/" << setw(2) << setfill('0') << month << "/" << setw(2) << setfill('0') << day << "," << setw(2) << setfill('0') << hour << ":" << setw(2) << setfill('0') << minute << ":" << setw(2) << setfill('0') << seconds;

```

標準文字列を `System::String` に変換するには、`String^ dateTime = gcnew String(getTime.c_str());`のように記述します。この型に変換しないとグリッドに日付を表示できません。

グリッド横軸のデータ配列を作成します。日付、ID、Nameの順番になります。IDとNameも`System::String` の型に変換します。

```c++l
array<String^>^ rows0 = gcnew array<String^>{dateTime,idNum,name};`
```

グリッドに追加します。`DataGridViewRowCollection`でROW配列データまとめて追加します。

```c++:
DataGridViewRowCollection^ rows = this->dataGridView1->Rows;
rows->Add(rows0);
```

![image](https://qiita-image-store.s3.amazonaws.com/0/139807/962f0bd1-d76a-e071-47f7-96f59910cbda.png)


#今回作成したコード
ボタンクリックにコードをそのまま追加してもいいですが、関数にしてしまえばコードがわかりやすくなります。

```C++:
    time_t timer = time(0);

	struct tm *timeStruct = localtime(&timer);

	int year = 1900 + timeStruct->tm_year;
	int month = 1 + timeStruct->tm_mon;
	int day = timeStruct->tm_mday;
	int hour = timeStruct->tm_hour;
	int minute = timeStruct->tm_min;
	int seconds = timeStruct->tm_sec;
	String^ idNum = textBox1->Text;
	String^ name = textBox2->Text;

	stringstream ss;
	ss << year << "/" << setw(2) << setfill('0') << month << "/" << setw(2) << setfill('0') << day << "," << setw(2) << setfill('0') << hour << ":" << setw(2) << setfill('0') << minute << ":" << setw(2) << setfill('0') << seconds;
	string getTime = ss.str();
	String^ dateTime = gcnew String(getTime.c_str());

	array<String^>^ rows0 = gcnew array<String^>{dateTime,idNum,name};
	DataGridViewRowCollection^ rows = this->dataGridView1->Rows;
	rows->Add(rows0);



```
特定のフォルダ内のファイル検索，Google Apps Scriptプログラム

# 特定のフォルダ内のファイル検索

* サンプルプログラムを示す。
* 「**********」は，logファイルのIDとフォルダのIDに置き換える。

```java:特定のフォルダを検索してファイル名を確認するサンプル
function main(){
  var log = DocumentApp.openById("**********");//事前にドキュメントを作りIDをしらべておく
  var folder = DriveApp.getFolderById("**********");//フォルダのIDは事前に調べておく
  var files = folder.getFiles();// フォルダ内を検索，ファイルの一覧を取得

  while(files.hasNext()){// ファイルが一個でもあれば
    var file = files.next();//ファイルを取得
    var fileName = file.getName();//ファイル名をゲット
    printDoc(log,fileName+'\n');//ファイル名の確認

  }
}


//-----------------------デバッグ用の関数群
//docの中身を全部削除
function docClear(doc){
  doc.getBody().clear();//中身をクリア
  //    doc.saveAndClose();
}

function printDoc(doc,str){//docにstrを書き込む
  var docText = doc.getBody().editAsText();
  docText.appendText(str);
  //    doc.saveAndClose();
}

```
起動中のEC2インスタンスの名前一覧を取得するワンライナー

よく忘れる:frowning2:のでメモ。手元のmacで実行してます。

```bash
$ aws ec2 describe-instances --profile dev --filter Name=instance-state-code,Values=16 | jq -r ".Reservations[].Instances[].Tags | map(select(.Key == \"Name\")) | .[].Value | sort"
db1
db2
web1
web2
:
```

`instance-state-code`やtagの取得名を変えれば、**停止中のインスタンス一覧**や**特定のタグ名一覧**を取得することもできます。ユニークな値が欲しい場合は、uniqコマンドにパイプするだけです。


留意点として

- `--profile`の値は適宜読み替えてください
- 指定するprofileには、予めEC2の読み取り権限を付けておいてください
- `awscli`と`jq`コマンドを使うので、無かったらインスールしてください。
(`sort`も使いますが、たいていのディストリビューションであればインストールされていると思われます)

各コマンドのバージョンは以下になります。

```
$ aws --version
aws-cli/1.11.34 Python/2.7.13 Darwin/15.6.0 botocore/1.4.91
$ jq --version
jq-1.5
```

#### 参考
AWS CLI のインストールと設定
http://docs.aws.amazon.com/ja_jp/streams/latest/dev/kinesis-tutorial-cli-installation.html
PSD から レイヤー情報ぶっこ抜くのにもう jsx とか使わなくて良い

こんにちわ、[ユニバ](http://uniba.jp/inbrowser/home.html)の MJ です。

今日は、ある案件で PSD ファイルから座標とってそれを json 形式で管理したいという課題が出た時の対処について話します。
この話って業界的には当たり前なんですかね。。。？
当たり前だったら恥ずかしい話やで〜

## よくある既存の方法

photoshop では 作業効率を爆上げするスクリプトを `.jsx` という拡張子を使って実装する。
ただ、これを作るのはだるい。
photoshop で debug しなければいけないし、別に PSD 開きたいわけではなく、純粋にデータが欲しい。
`ExtendScript Tookkit` なるものがあるが、これで書く気にもならなかった。

## psd.js

神ツールがあった。
[psd.js](https://github.com/meltingice/psd.js)

これを使えば、psd をパースして、中身を見れます。便利な関数つき。

## how to use

`psd.js` は node module です。
次のような構成を例にしましょう。


```
- node_modules (`npm install psd` を実行しましょう)
- app.js
- test.psd
```

```app.js
var path = require('path');
var PSD = require('psd');
var psd = PSD.fromFile(path.resolve(process.argv[2]));
psd.parse();

console.log(psd.tree().export());

```

こうしたら terminal で

```
node app.js test.psd
```

を実行します。
すると terminal では psd の情報がベローっと出ているはずです。神。

## 終わりに

node 経由で psd の中身が見れるなんて夢が広がりますな。
pdffontsのインストール，mac使う大学生

おはよう御座います！最近Youtube（ https://www.youtube.com/watch?v=ogT0CjNCavQ ）やってます！！！
もちろん，大学四年生として卒論もやっています！wwwwwww

予稿(PDFファイル)のフォント埋め込み確認について，pdffontsのコマンドでやりたい人向け，
今日homebrewでpdffontsをマックに入れる方法を説明します．

まずいつも通りhomebrewのアプデートをします．
```brew update```

そして，以下のコマンドでxpdfをダウロードします．
```brew install xpdf```

私の場合はこのようなエラーが出てきました．
```Error: You must `brew link libpng` before homebrew/x11/xpdf can be installed```

なので，
```brew link libpng```
をしてみたら，
```Error: Could not symlink share/man/man5/png.5```
と言われて，うまくいかなかったです．

そこで，以下のコマンドを打ちました．
```sudo chown -R $(whoami) /usr/local/share/man/man5```

再度リンクしてみて，
```brew link libpng```

```Linking /usr/local/Cellar/libpng/1.6.28... 18 symlinks created```
これでうまく言ったぽいので

改めて，以下のコマンドでxpdfをダウロードします．
```brew install xpdf```

インストールは無事にできましたが，
```pdffonts ファイル名```
と実行した後，日本語パッケージがないため，うまくいかなかったので，

それはこちらの記事に記載しているため，以下のリンクで参照し，日本語パッケージを入れたら大丈夫です．
http://ototorosama.hatenablog.com/entry/2013/02/14/055355
or
http://nagae.github.io/itl/homebrew-packages.html
Amazon LinuxをDockerで起動してansibleを適用する


Ansibleの検証するのにいちいちEC2でAmazonLinuxを起動しないといけないのは面倒なので、dockerで試してみた。

# Dockerの準備

## Docker for Macのインストール

[Get started with Docker for Mac](https://docs.docker.com/docker-for-mac/)

## Amazon ECR registryにログイン

```bash
$ $(aws ecr get-login | sed 's/\-e none //g')
Login Succeeded
```

## イメージを取得
```bash
$ docker pull amazonlinux:latest
latest: Pulling from library/amazonlinux
c9141092a50d: Pull complete
Digest: sha256:2010c88ac1e7c118d61793eec71dcfe0e276d72b38dd86bd3e49da1f8c48bf54
Status: Downloaded newer image for amazonlinux:latest
```

## ansible-playbook適用対象として起動しておく
```bash
$ docker run -itd --name example amazonlinux:latest
```

# ansible側の準備をする

```
$ ansible --version
ansible 2.2.1.0
  config file = /Users/example/.ansible.cfg
  configured module search path = Default w/o overrides
```

## docker-pyをインストール
```
$ pip install docker-py
```

## inventory/docker.pyをプロジェクト内に取得
```
$ curl https://raw.githubusercontent.com/ansible/ansible/devel/contrib/inventory/docker.py -o inventory/docker.py
$ chmod 755 inventory/docker.py
```
## playbookを作成
```yaml:example.yml
---
- hosts: example # 先ほどdocker runで指定したnameの値を指定
  connection: docker
  user: root
  tasks:
  - name: ping
    ping:
```

# 実行
```bash
$ ansible-playbook example.yml -i inventory/docker.py

PLAY [example] *****************************************************************

TASK [setup] *******************************************************************
ok: [example]

TASK [ping] ********************************************************************
ok: [example]

PLAY RECAP *********************************************************************
example                    : ok=2    changed=0    unreachable=0    failed=0
```

# 注意点
Amazon Linux AMIとAmazon Linux Container Imageは標準で入っているモジュールが違うので、注意が必要。
AtomでMyricaフォント使用時にスペース幅がおかしくなる問題の解決

[等幅フォント比較：プログラミング用](http://qiita.com/vmmhypervisor/items/2d6b39d21ed68bd746c0#_reference-a7a788b730beeff50b7f)を見てAtomでMyrica Mを使おうとしたらハマった。

#問題
タブ幅4なのに8スペース分ずれる

![スクリーンショット 2017-01-17 13.28.49.png](https://qiita-image-store.s3.amazonaws.com/0/21606/67290f20-7f41-8814-e059-daba04131621.png)

#解決法

Setting -> Editor -> Invisibles Spaceの表示文字を半角の文字に変える。
私は**`･`**（HALFWIDTH KATAKANA MIDDLE DOT, Unicode: U+FF65）にしました。

デフォルトでは**`·`**（MIDDLE DOT, Unicode: U+00B7）になっていますが、Myricaで使われている源真ゴシックではなぜか全角なのでタブ幅がおかしくなるようです。

![スクリーンショット 2017-01-17 13.31.00.png](https://qiita-image-store.s3.amazonaws.com/0/21606/4effaf9c-ed73-0752-8ba1-150c7a0e3b38.png)

その他エディタでMyricaを利用した場合ですが、
Sublime Textは空白の表示に**`·`**を使っていないようなので問題は起こらず。
Visual Studio Codeではインデント幅はずれませんが、オートインデント周りの挙動がおかしくなるようです。
CakePHP3でフロントとバックエンドでControllerとTemplateをフォルダ分けするための設定


| cake version | 3.3.11 |
|:-:|:-:|

cakePHP3で下記のようにフロントとバックエンドでController等を分けたいことありますよね？

```
 src/
 　Controller/
 　　Front/
 　　　ItemsController.php
 　　　...
 　　Admin/
 　　　UsersController.php
 　　　...
 　Template/
 　　Front/
 　　　Items/index.ctp
 　　　...
 　　Admin/
 　　　UsersController.php
 　　　...
```

cakephp3では、routesを修正することでできます。
※コメント文は削除してます。

```php:config/routes.php
<?php
use Cake\Core\Plugin;
use Cake\Routing\RouteBuilder;
use Cake\Routing\Router;
use Cake\Routing\Route\DashedRoute;

Router::defaultRouteClass(DashedRoute::class);

Router::scope('/', function ($routes) {
    $routes->connect('/', ['controller' => 'Pages', 'action' => 'display', 'home']);

    $routes->connect('/pages/*', ['controller' => 'Pages', 'action' => 'display']);

    // 管理トップ用　↓追加
    $routes->connect('/admin', ['controller' => 'Users', 'action' => 'index', 'prefix' => 'admin']);

    // これはコメントアウトする　↓修正
    //$routes->fallbacks(DashedRoute::class);

    // フロントは、Front/ へ　↓追加
    $routes->connect('/:controller', ['action' => 'index', 'prefix' => 'front'], ['routeClass' => 'DashedRoute']);
    $routes->connect('/:controller/:action/*', ['prefix' => 'front'], ['routeClass' => 'DashedRoute']);
});

// 管理用（トップ以外）ルーティング　↓追加
Router::prefix('admin', function ($routes) {
    $routes->fallbacks('DashedRoute');
});

Plugin::routes();
```
よく使うgitコマンドのエイリアスを設定する

Webエンジニアに転職して２週間経ち
そろそろ、「git checkout ブランチ名」とか打つのが面倒くさくなってきたので、
gitのショートカットを設定してみました。

##git自体のエイリアスを設定する
まずは、gitをgで実行できるようにAliasを設定。
.bashrcにAliasを追加します。

```bash
alias g='git'
```
次に、sourceコマンドを実行して設定を読み込む。

```bash
source ~/.bashrc
```
Aliasを設定するとstatusコマンドも以下のようにかける。

```bash
$ g status
```

##gitコマンドのエイリアスを設定する
次に、statusなどのgitコマンドのAliasを設定します。
gitのconfigコマンドを使います。

```bash
$ git config [option] alias.エイリアス 実際のコマンド
```
とりあえず僕はよく使う以下の６コマンドのエイリアスを設定しました。
commitやaddは、[tig](http://qiita.com/suino/items/b0dae7e00bd7165f79ea)を使っているので外しています。

```bash
$ git config --global alias.s status
$ git config --global alias.c checkout
$ git config --global alias.b branch
$ git config --global alias.f fetch
$ git config --global alias.p push
$ git config --global alias.m merge
```

※ optionには以下のいずれかを設定可能。

| option       |    意味 |
|:------------:|:-----------:|
| オプション無し       |リポジトリ固有 |
| global           |Gitユーザ固有 |
| system           |マシン全体 |

##設定したコマンドの確認方法
```bash
$ git config --global --list
```

##GitのTab補完が効かなくなる問題
Aliasを設定下はいいけど、Tab補完が効かなくなってしまいます。
以下の方法で解決できます。

###git-completion.bashを編集する
git-completion.bashの配置場所は、.bashrcに書いてあるはずです。

僕の場合は以下の場所にありました。

```bash
/usr/local/etc/bash_completion.d/git-completion.bash
```
このファイルに以下のコードを追記します。

```bash
complete -o bashdefault -o default -o nospace -F _git g 2>/dev/null \
  || complete -o default -o nospace -F _git g
```

最後に設定を読み込むために```$ source ~/.bashrc```を実行。
これで、エイリアスを使っていてもTabの補完が有効になるはず。

###参考にした記事
- [よく使うgitコマンドのエイリアスを設定して開発効率をアップする](http://qiita.com/unsoluble_sugar/items/ce14e9ce20aa5ba34fe5)
- [bash で git を g などで alias を設定しているときでも git-completion で補完できるようにする](https://github.com/shikakun/tips/issues/55)
ポエムを書くということ

# ポエムを書こうと思った

ポエムである。巷を賑わせているポエムである。技術ポエムと限定してもよい。
技術的、専門的なことを書いている振りをしているが、実はひとりごとでしかなかったり、根拠がなかったり、検証されていなかったり、感想文だったりする奴のこと……か？
そもそも技術ポエムというのは、技術の記事ですらないのではないだろうか。

よくわからない。

よく分からないので、それでは、ポエム専門で記事を書いてみようと思った。
金にならない執筆なので、ポエムと割りきればよいだろう。

ここでいきなり、カーネルとかデバイスドライバとかプロトコルスタックとか、もう少し上位のソフトウェア開発の話とか、あるいはシステム設計・構築の話をはじめてもおもしろいのかもしれないが、そんなものはもっと優秀な人が書いているので、僕が書くまでもない。

では、ポエムを書こう。

# ポエムってなんだ？

さて、ポエムとは何であろうか？

まずおそらく、客観的であってはならない。主観的でなければならない。
たとえば、今これを書いているIMがAnthyなんだけど、最近変換がおかしくなってきていて、何かアップデートの時に辞書の構築に失敗しているのではないか、みたいな話は、「ではないか？」で終わっており、実に主観的かつ反技術的である。
「ではないか？」と思うのなら、調べてから結果だけ記事にすればよい。
プロセスは面白いかもしれないが、まあ必要ない。
たとえば、学術論文を書く場合、その論文の範囲の結論に必要なことを書くものであり、試行錯誤のプロセスは書かない。試行錯誤の途中結果が論文の結論であれば、その途中結果を導き出すために必要なものを書く。試行して失敗した場合、失敗したという結論の論文であれば失敗を記述する必要があるが、そうでなければ途中の失敗は書かない。

そう考えると、ポエムというのは、プロセスを書くとよいのではないだろうか。
たとえば、今書いている思考のダダ漏れみたいなものだ。
ちらしの裏に書けばよい種類のことだ。

加えて、おそらく結論は書かないほうがよい。結論が導出できたとしても、あえて書かないほうがよい場合もあるし、非合理的な結論を導出して書いた後に、「なーんちゃって、てへぺろ」などと書くというのも味わいがある。

おそらくポエムは、熱くなってはいけない。熱いポエムもあるかもしれないが、島本先生レベルの熱さがないと、ちょっと空回りする。
空回りしても恥ずかしくないよという雰囲気を醸し出すのも、ポエムもコツかもしれないし、だからこそポエムはうざいのかもしれない。

# ポエムを書く技術

先日、ヘルスケア系キュレーションサイトの低品質記事が問題になり、サイト自体が閉鎖された騒動があった。
これらのサイトは、クラウドソーシングで相場の1割以下の原稿料で素人同然の人に記事を書かせて、それを素材としてSEO対策をしていたのだが、ライター側からの意見というのが、以下に掲載された。

「１円ライターから見た、キュレーションサイト「炎上」の現場」
http://magazine-k.jp/2016/12/08/writing-for-curation-media/

この記事はなかなか秀逸であると思った。

まず、「普段は別名義で、小説家、ライターとしてほそぼそと活動しています。」と自己紹介している。プロの書き手であることを臭わしている。
その一方で、到底プロにはなれない人が相互に助け合いをしながら超低価格のライティングをしている「優しい場所」について説明します。この箇所になると、筆致がふわっとした感傷的なものになるのが印象的である。
その上で、「自分のことを筆力のある人間だと思っています。真剣に努力すれば、高級ライターになれるだろうと信じています。」と述べて、自分は彼女らとは違うというある種の間運ティングをしながらも、「優しい場所」の今後について憂いている。

具体的な事案やクラウドソーシングのサービスの名前を出しながらも、本論は実にふわっとしている。もちろん、問題提起の一部である「子供を抱えながら金銭的に苦しい人ができるアルバイトが必要なのだ」という点は、間違ってはいないし、専門職である記事執筆という仕事が子供を抱えながらとか何かしらのハンディキャップがあってもできるべきだとは思うが、それは能力があればという前提だと思う。

なぜなら、専門職なのだから。

優しい場所が必要な人の受け皿として、専門職の業界は適切とは言えない。

なぜなら、専門職は専門家集団であるべきなのだから。

……まあ、この部分は僕の主張なので、ここでこの記事を引用した本来の目的に戻ると、自分は問題空間から少し距離を取りながら、その問題空間をふわっとした表現でまとめてしまうこの筆者の書き方というのは、ある種の技巧を感じると同時に、そういった技巧の集大成が何の根拠もない医療・ヘルスケア情報サイトなのではないかとも思う。
これはヘルスポエムと呼んでも良いくらいだ。

おそらくポエムを書くには技術がいる。その技術は、ポエムを好んで読む人に受け入れられるための技術であり、そこで受容されることにより、技術は強化され洗練される。
かくしてポエムが真実だと信じて生きるクラスタができあがる。

もちろん、このロジックに根拠はない。「なんとなくそんな気がする」から書いてみたのであり、これこそまさにポエム的である。

といった種類の技巧を駆使しつつ、このアカウントではポエムを書き散らしていきたい。
もう少し技術よりのポエムにはしたいとは思う。
そしてポエムに溺れて幸せにひたることのできる諸氏を、溺れさせてしまいたい。
僕のポエムで、みんなを溺れさせたい。
RxJava2でFlowableにObservableをzipする

FlowableとObservableをzipする場合、`Flowable -> Observable`もしくは`Observable -> Flowable`に変換してどちらかに揃えるとzipすることができる

```
Flowable<Long> tictok = Flowable.interval(1, TimeUnit.SECONDS);
Observable<Integer> counter = Observable.fromArray(1).repeat();

tictok.zipWith(counter.toFlowable(BackpressureStrategy.LATEST), (t, c) -> t)
      .subscribeOn(Schedulers.newThread())
      .subscribe(System.out::println);
```
Laravel 5.3 でセッションドライバに Redis を用いた際にハマったこと

## 事象

.env ファイルに `SESSION_DRIVER=redis` の記述を足して、`REDIS_HOST` 等も記述して「よっしゃ！」と意気揚々にデプロイを行ったところ Oops! した。

ログには次のようなメッセージが。

```
Symfony\Component\Debug\Exception\FatalThrowableError: Call to undefined method Illuminate\Cache\ApcStore::setConnection()
```

## 解決策

config/session.php を次のように変えればOK。

```php:config/session.php(before)
<?php
return [
    // （略）
    'connection' => null,
    // （略）
    'store'      => 'memcached',
    // （略）
];
```

```php:config/session.php(after)
<?php
return [
    // （略）
    'connection' => 'default',
    // （略）
    'store'      => null,
    // （略）
];
```
Fibonacci exercise (go tour)

```go
package main

import "fmt"

func fibonacci() func() int {
    x, y := 0, 1
    return func() (r int) {
        r = x
        x, y = y, x + y
        return 
    }
}

func main() {
	f := fibonacci()
	for i := 0; i < 25; i++ {
		fmt.Println(f())
	}
}

```
Docker環境をHomebrewで手軽に作成

# 概要
Docker を使ってみたかったので mac (El Capitan/10.11.6) で環境作ってみた

# Docker for mac を homebrew でインストール
```
brew install docker
brew cask install docker   # /Applications/Docker.appができる
```
これだけ。
`/Applications/Docker.app` を立ち上げたら Docker の daemon が起動するので
`docker ps` でコンテナ確認できる

VirtualBoxとかtoolboxとか色々考慮しなくていいのがシンプルでいいですね。

参考
とりいそぎhomebrewでDocker for Mac 1.12をインストールする
http://labs.timedia.co.jp/2016/08/homebrewdocker-for-mac-112.html

※ caskって何？って方に
Macのセッティングが楽チンに！『Homebrew Cask』でソフトを簡単インストール
http://www.lifehacker.jp/2015/08/150823_homebrew_cask.html
Enumのメンバ一覧をテキストのリストで取得する

```basic:Class1.vb
''' <summary>
''' Enumから仕様書起こし用　ヘルパクラス
''' </summary>
''' <remarks></remarks>
<TestClass()>
Public Class EnumHelperClass

    ''' <summary>
    ''' DayOfWeek
    ''' </summary>
    ''' <remarks></remarks>
    <TestMethod()>
    Public Sub EnumDayOfWeek()
        Console.WriteLine("Enum DayOfWeek")
        Console.WriteLine("Member:Value")
        Console.WriteLine("------------")
        For Each rt As DayOfWeek In [Enum].GetValues(GetType(DayOfWeek))
            Console.WriteLine("{0}:{1}", rt.ToString(),
                              [Enum].Format(GetType(DayOfWeek), rt, "d"))
        Next
        Console.WriteLine("------------")
    End Sub
End Class
```
[xamarin] UI設置しようとしたらエラー

#UIの配置を試してみよう
インストールが終わったのでテストソリューション作成、ボタンとか配置してみっかなーと思ったけど、InterfaceBuilderってどこにあるんだ・・・ってなった。

ぐぐったらこんな記事発見。
[Xamarin.iOSで画面をレイアウトするには？（Xcode利用／ビルトインiOS用UIデザイナー](http://www.buildinsider.net/mobile/xamarintips/0003 Xamarin.iOSで画面をレイアウトするには？（Xcode利用／ビルトインiOS用UIデザイナー）
)

>MainStoryboard.storyboard］をダブルクリックなどで実行すると、既定の動作ではXcodeが別途起動する。
なんだ・・・結局xCode起動すんのか・・まあいいやとりあえずやってみよ、ってやってみたら
![スクリーンショット 2017-01-17 12.21.18.jpg](https://qiita-image-store.s3.amazonaws.com/0/11543/9494c789-d06d-2e34-98fd-32fc5f19cc92.jpeg)

*This file has been edited in a version of Xcode which is unsupported by the designer.*
*Documents saved in Xcode 8.2 format, or older, are supported.*


xCode8.2.1が出てましたとさ。


ちなみにまだやってないけど
[Xamarin.iOSで画面をレイアウトするには？（Xcode利用／ビルトインiOS用UIデザイナー](http://www.buildinsider.net/mobile/xamarintips/0003 Xamarin.iOSで画面をレイアウトするには？（Xcode利用／ビルトインiOS用UIデザイナー）
)
に
>　続いて、新たにXamarin Studioに搭載されたiOSデザイナーを使った画面レイアウトを行う方法を説明する。

って書いてあったから後で試す。まずはxCode8.2.1インストールしてから。


##追記（2016/1/17 13:38)

xCode8.2.1にアップデート後。
![スクリーンショット 2017-01-17 13.36.33.png](https://qiita-image-store.s3.amazonaws.com/0/11543/c3b81d49-c176-5e5c-742f-acada0d27164.png)

内部ではxCodeを起動してるんかなこれ・・？まあそうだよな、xCode古いよエラーが出たんだから。
Connect postfix to postgres 

### Connect postfix to postgres

 cf. https://wiki.gentoo.org/wiki/Complete_Virtual_Mail_Server/Postfix_to_Database#Postgres :thumbsup: 

```ini:/etc/postfix/main.cf

#
# Settings required to support virtual mail delivery using lookups in
# the Postgres database.
#
 
# A list of all virtual domains serviced by this instance of postfix.
virtual_mailbox_domains = pgsql:/etc/postfix/pgsql/virtual_mailbox_domains.cf
 
# Look up the mailbox location based on the email address received.
virtual_mailbox_maps = pgsql:/etc/postfix/pgsql/virtual_mailbox_maps.cf
 
# Any aliases that are supported by this system
virtual_alias_maps = pgsql:/etc/postfix/pgsql/virtual_alias_maps.cf
```


```ini:/etc/postfix/pgsql/virtual_alias_maps.cfvirtual_alias_maps
# virtual_alias_maps.cf
user            = postfix
password        = $password
dbname          = postfix
#hosts          = localhost
query           = SELECT goto FROM alias WHERE address='%s' AND active='1';
```

Run the query on the database to verify its output:

```shell-session:
# psql -U postfix postfix
postfix=>SELECT goto FROM alias WHERE address='testuser@example.com' AND active='1';

       goto       
------------------
 testuser@example.com
(1 row)
```

Make Postfix use this database mapping:

```shell-session
# postconf -e virtual_alias_maps=pgsql:/etc/postfix/pgsql/virtual_alias_maps.cf
```

Test if the mapping file works as expected:

```shell-session
# postmap -q jack@example.org pgsql:/etc/postfix/pgsql/virtual_alias_maps.cf
```
Yahooニュースの提供元サイトにジャンプするブックマークレット

```
javascript:location.href="http://www.google.com/search?btnI=I%27m+Feeling+Lucky&q="+document.querySelector('h1').innerText+"+-site:yahoo.co.jp"
```

[提供元](javascript:location.href="http://www.google.com/search?btnI=I%27m+Feeling+Lucky&q="+document.querySelector('h1').innerText+"+-site:yahoo.co.jp") ←をブックマークにドラッグ＆ドロップしてください。

# ソース解説
## 1.ニュースのタイトルを取得します。
Yahooニュースではh1タグにタイトルが設定されているので、querySelectorでh1タグを選択すればタイトルが取得できます。

```js
document.querySelector('h1').innerText
```

## 2.google検索にリクエストします。
location.hrefを書き換えて、google検索に遷移させます。

```js
location.href="http://www.google.com/search"
```

### google検索の仕様
getパラメータでqに検索文字列を渡せます。
http://www.google.com/search?q=qiita+-site:qiita.com

検索文字列に-site:qiita.comを付加すると、ドメインがqiita.comを除外した結果が帰ってきます。

btnIにI'm Feeling Luckyを渡すと、検索のトップのURLにリダイレクトします。
http://www.google.com/search?q=I%27m+Feeling+Lucky&btnI=I%27m+Feeling+Lucky