OmniAICreator/Qiita-1.07M huggingface dataset:
Cognitive Took Kit(CNTK)をKerasのバックエンドで使用する

#CNTKバージョン2.1
CNTKもバージョンが2.1となりました。2.1に関して機能強化のうち特徴的なのは強化学習のフレームワークとしてdeeprlが提供されています。以下のリンクでリファレンスがあります。一部ですが、Deep Q-Learning以外にもいくつかのロジックが実装されているようです。
•[cntk.contrib.deeprl.agent.agent module](https://cntk.ai/pythondocs/cntk.contrib.deeprl.agent.agent.html)
•[cntk.contrib.deeprl.agent.agent_factory module](https://cntk.ai/pythondocs/cntk.contrib.deeprl.agent.agent_factory.html)
•[cntk.contrib.deeprl.agent.policy_gradient module](https://cntk.ai/pythondocs/cntk.contrib.deeprl.agent.policy_gradient.html)
•[cntk.contrib.deeprl.agent.qlearning module](https://cntk.ai/pythondocs/cntk.contrib.deeprl.agent.qlearning.html)
•[cntk.contrib.deeprl.agent.random_agent module](https://cntk.ai/pythondocs/cntk.contrib.deeprl.agent.random_agent.html)
•[cntk.contrib.deeprl.agent.tabular_qlearning module](https://cntk.ai/pythondocs/cntk.contrib.deeprl.agent.tabular_qlearning.html)
また、2.0からサポートされていますが、Kerasのバックエンドとして使用できるようになったことで用途が広がっている状況です。
#Kerasの例
Kerasの例として[【Using Keras and Deep Q-Network to Play FlappyBird】](https://yanpanlau.github.io/2016/07/10/FlappyBird-Keras.html)を紹介したいと思います。もともとKerasで作成された、強化学習のサンプルですが、CNTKに移植されています。cntk/Examples/ReinforcementLearning/FlappingBirdWithKerasにコードが公開されています。サンプルを動かしてみます。CNTKのインストールセットアップはRCの時代と変わらないため、[こちらの記事](https://analyticsai.wordpress.com/2017/04/04/cntk2-0b15%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab/)を参照ください。

kerasはcntkをactivateしたコマンドラインで下記でインストールできます（最新版にアップグレードしておいた方がよいですので、すでにインストールされている場合は、-Uオプションを付けた方がよいでしょう）

`pip install keras`

さらに設定ファイル~/.keras/keras.jsonを作成します。Windowsの場合はC:\Users\<ユーザ名>\.keras.jsonになります。ファイルの内容は以下です。

`{
    "epsilon": 1e-07, 
    "image_data_format": "channels_last", 
    "backend": "cntk", 
    "floatx": "float32" 
}`

上記で、kerasの動作が可能になります。下記で動作確認可能です。

・GPU動作の場合（GPUがないと恐ろしく時間がかかります）
https://github.com/fchollet/keras/blob/master/examples/mnist_cnn.py

・GPUが入っていない場合
https://github.com/fchollet/keras/blob/master/examples/mnist_mlp.py
がよいと思います。
次に、FlappingBirdの依存関係をインストールします

 
`pip install pygame
conda install scikit-learn
conda install scikit-image`

この状態で、WindowsでもLinuxでも動作可能です。また、GPUで動作しますので、高速な動作も期待できます。

#Ubuntu 16.04 LTSで実行
![screenshot-from-2017-08-03-14-52-55[1].png](https://qiita-image-store.s3.amazonaws.com/0/177932/e6847463-384a-958f-b5fc-447e4cb4d988.png)

![screenshot-from-2017-08-03-14-52-03[1].png](https://qiita-image-store.s3.amazonaws.com/0/177932/719c06ad-b281-d441-8e56-fe40eb1c9eff.png)

![screenshot-from-2017-08-03-14-52-30[1].png](https://qiita-image-store.s3.amazonaws.com/0/177932/af29bcfe-a831-be4b-e7a9-aaaf9b4911d2.png)

CNTKも2.1になり色々な部分が強化されています。これからの強化学習分野の進化がかなり期待されます。
RDS Enhanced MonitoringのメトリックをBashだけでCloudWatch Logs → Elasticsearchにログをぶん投げるスクリプト

「RDSのEnhanced Monitoring入れたけど、常時メトリックをESに書き込むのもなー。なんか問題あったときだけでいいんだよねー」というときがあると思います。というかありました。

通常なら、CloudWatch Logs -> Lambda -> ESSという手法をとるのですが、Lambda準備するのめんどくさい、ESSで必要なときだけESSインスタンス作って見たいという時向けのスクリプトです。

自分のPCからCloudWatch Logsのメトリクスデータとってきて、curlでESSに投げるという簡単なものです。
bulk APIを使っておらず、1件1件叩いています。

```
$ aws logs get-log-events --log-group-name RDSOSMetrics --log-stream-name [db-AAAAA...] --start-time [unix time mills] --end-time [unix time mills] \
| jq '.events[].message|fromjson' -c \
| while read line; do curl -s -XPOST https://[ESS Endpoint]/metrics/aurora -d "${line}" > /dev/null; done
```

> INDEX名（metrics）・TYPE名(aurora)は適当につけてるので、必要であれば変更してください。

## Tips

割りと自分用

Q. jqじゃなくてawscliのqueryは？
A. `--output text` でタブ区切りになるので、while read効かなくなる

Q. for文は？
A. 残念ながら途中で空白が入った文字列が入ってきてしまうので、そこでJSONが切られます（エラー

Q. xargsは？
A. ダブルクォート消されるのでダメ(こんな感じになります)

```
$ aws logs get-log-events --log-group-name RDSOSMetrics --log-stream-name db-1234567890ABCDEFGHIJKLMNOP --limit 1 | jq '.events[].message|fromjson' -c | xargs echo

{engine:Aurora,instanceID:hoge,instanceResourceID:db-1234567890ABCDEFGHIJKLMNOP,timestamp:2017-08-14T08:04:48Z,version:1, ...
```

Q. Kibanaに入れた後どうするの？
A. Timelionで可視化しましょう。

例:

```
.es(index=metrics, timefield=timestamp, metric=avg:diskIO.readIOsPS)
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/12031/8895ed53-476e-3bc4-50e0-ce300d497ca1.png)


メトリック一覧

```
cpuUtilization
  guest
  idle
  irq
  nice
  steal
  system
  total
  user
  wait
diskIO
  diskQueueDepth
  readIOsPS
  readLatency
  readThroughput
  writeIOsPS
  writeLatency
  writeThroughput
fileSys
  maxFiles
  mountPoint
  name
  total
  used
  usedFilePercent
  usedFiles
  usedPercent
memory
  active
  buffers
  cached
  dirty
  free
  hugePagesFree
  hugePagesRsvd
  hugePagesSize
  hugePagesSurp
  hugePagesTotal
  inactive
  mapped
  pageTables
  slab
  total
loadAverageMinute
  fifteen
  five
  one
network
  interface
  rx
  tx
numVCPUs
swap
  cached
  free
  total
tasks
  blocked
  running
  sleeping
  stopped
  total
  zombie
```
[Parse]callFunctionInBackgroundをつかってAPIをたたく

#はじめに
- Android初心者が忘備録を兼ねて書いております

#本題
##環境情報
- AndroidStudio2.3.3
- MacOS10.12.5
- parse-android 1.15.8

##事前準備
- Parse For Androidの設定をする
    - [参考]http://shingaki.me/app/android%E3%81%8B%E3%82%89parse%E3%82%92%E4%BD%BF%E3%81%86/

```
package XXX.XXXX.XXXXXX;

import com.parse.Parse;
import com.parse.ParseCloud;
import com.parse.ParseException;
import com.parse.FunctionCallback;

import java.util.HashMap;
import java.util.Map;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        //アプリケーション情報をもとに初期化する
        Parse.initialize(new Parse.Configuration.Builder(this)
                .applicationId("YOUR_APPLICATION_ID")
                .clientKey("YOUR_API_APP_CLIENT_KEY")
                .server("YOUR_API_APP_PARSE_URL")
                .build()
        );

        //パラメータを付与してPOSTする場合は設定
        Map<String, String> parameters = new HashMap<String, String>();
        parameters.put("param_key_1", "value_1");
        parameters.put("param_key_2", "value_2");

        //QUERY_NAMEのAPIを叩く
        ParseCloud.callFunctionInBackground("QUERY_NAME", parameters, new FunctionCallback<Map<String, Object>>() {
            @Override
            public void done(Map<String, Object> mapObject, ParseException e) {
                if (e == null) {
                    //エラーなし(データ取得成功時)
                    Log.d("data", "[success]" + mapObject);
                }
                else {
                    //エラーあり(データ取得失敗時)
                    Log.d("data", "[failed]" + e.getMessage());
                }
            }
        });

        setContentView(R.layout.activity_main);
    }
}

```

##その他参考にしたサイト
- http://docs.parseplatform.org/android/guide/#saving-objects
- http://j-caw.co.jp/blog/?p=1347
- http://murayama.hatenablog.com/entry/2013/11/28/080444
RailsのActiveRecordについて

# Active Recordとは

MVCのM、モデル部分を扱うものでDBのデータを参照したり、編集するのに用いる。SQLをわざわざ書く必要なくDBの操作ができる。SQLは色々な文法があるがコレのお陰でそれらの違いを内包してくれる。

# Rails5からActive Recordのclassの作り方が変わる

Rails4まではActiveRecord::Baseを継承していたが5からはApplicationRecordを継承するようになった。基本的には変わらないがActiveRecord::Baseはactiverecord gemのクラスなのに対して、AplicationControllerはアプリケーションに用意されたもの。そのため、「全コントローラーに共通する処理」を、自分でAplicationControllerに置くことができます。一方で、ActiveRecord::Baseはあまり共通する処理を置く場所がありません。

# Active Recordの使い方

基本的には

* コマンドでrails g modelでmodelとDBを作ってしまう。
    * modelはDBの名前から命名する→モデル：最初大文字、DB：最初小文字にして複数形
    * 情報を取ってくるときはPost.nameなどのようにクラス名.カラム名で引っ張ってくる。

```ruby:rei
a = Part.new
a.name = "Sample part"
a.price = 123.45
a.save
```
上記のコードは与えられた値で新しい行をデータベースに作る。これは次の SQL コマンドにほぼ等価である。

```SQL:rei
INSERT INTO parts (name, price) VALUES ('Sample part', 123.45);
```
引用：https://ja.wikipedia.org/wiki/Active_Record

# スキーマのルール

## カラム名について

### 外部キー

このカラムは テーブル名の単数形_id にする必要があります (例 item_id、order_id)これらのカラムは、Active Recordがモデル間の関連付けを作成するときに参照されます。

### 主キー

デフォルトでは id という名前を持つintegerのカラムをテーブルの主キーとして使用します。このカラムは、Active Recordマイグレーションを使用してテーブルを作成するときに自動的に作成されます。

# ActiveRecordを使う上で把握したい概念

## ORM（O/Rマッピング）

SQLを意識しなくてもかけるようにするものでオブジェクトとDBをつなぐもの。

## CoC(Convention over Configuration)

設定より規約のrailsの精神がここにも生きていて、それぞれのアプリケーションの設定で動くのではなくて規約に従う。なので命名規則などは勝手にできないようになっている。
DIGITSをGitLab CIでテストするためのDockerfileを作った

本家DIGITSは非常に使いやすいのですが、痒いところに手が届かない部分が多々あるので個人的に魔改造を加えています（おい

魔改造を加えるにあたって、やっぱりCIは組みたいということでGitLabCIを使っています。しかし、DIGITSのテストをGitLabCIで行う上で、いろいろと詰んだのでメモ。

## GitLab CI大変だよね

DIGITS本家のテストはTravisCIで行われています。

TravisCIは、`matrix`を使うことによってテストを並行して実行することができるため、DIGITSの`.travis.yml`も並行実行を前提に組まれています。

~~しかし、今のところ、GitLab CIは各テストを直列実行することしかできません。（実は並列実行できますよ的な情報ありましたら教えていただけると嬉しいです…）~~

【追記:2017/08/14】このサイト（[https://tech.drecom.co.jp/easy-ci-development-using-gitlab-ci/](https://tech.drecom.co.jp/easy-ci-development-using-gitlab-ci/)）を見る限り、jobの並列実行ができるようです。現在調査中です。

そこで、apt-getの手間だけでも減らすべく、`before_script`の部分だけDockerfileにしてしまいました。

```yaml
FROM ubuntu:trusty

RUN set -x && \
    apt-get update && \
    apt-get -y install build-essential cmake cython git graphviz libboost-filesystem-dev libboost-python-dev libboost-system-dev libboost-thread-dev libgflags-dev libgoogle-glog-dev libhdf5-serial-dev libleveldb-dev liblmdb-dev libopencv-dev libprotobuf-dev libsnappy-dev protobuf-compiler python-dev python-flask python-gevent python-gevent-websocket python-gflags python-h5py python-matplotlib python-mock python-nose python-numpy python-opencv python-pil python-pip python-protobuf python-psutil python-pydot python-requests python-scipy python-six python-skimage && \
    apt-get -y install closure-linter python-flake8 && \
    apt-get -y install libopenblas-base libopenblas-dev && \
    pip install virtualenv && \
    pip install virtualenvwrapper && \
    source /usr/local/bin/virtualenvwrapper.sh && \
```

## DockerHubからpullしたいよね

そう思ってDockerHubにも上げました。

https://hub.docker.com/r/musaprg/digits-gitlabci/

`docker pull`すればそのまま使えます。

```bash
$ sudo docker pull musaprg/digits-gitlabci
```

`docker pull`する場合は、`apt-get upgrade`を忘れずにお願いします。

また、本家側の`.travis.yml`に変更があった場合は、逐一このDockerfileを書き換えれば問題無いと思います。

僕も使うのでDocker Hubのほうも気まぐれで更新するかもしれません…( ˘ω˘ )
Illustrator②整理整頓と提出時のチェック

Illustratorの実際の操作ではなく、提出する時に他の方がみやすいように作る
心がけみたいなものをまとめてみました。

#整理整頓
流用でデザインした場合でも、端数が出ていたら、全てのコンテンツを整数にする。
テキストの始まりも整数にする。
##アードボードはサイズと間隔を統一して、名前をつける
一つのファイルでLPを別ページで複数作成するときは、アードボードをいくつか用意すると思います。
そんなときは、アードボード同士の間隔を統一して開けて、各アードボードに[index.html]等、わかりやすく名前をつけましょう。
##レイヤー名はわかりやすくつける
1.英語か日本語統一する
2.レイヤーの中にレイヤーを作らない
3.各アードボードで再利用が効くように、レイヤー名は[header][footer][image][text][bg][btn]みたいな感じで分けて作成する。
コーディングの時のことも意識して作れるようになります。
##上司・先方に確認してもらうときは、全部のロックを解除・不要な要素の削除・全部表示する
よく見落としがちなのですが、上司に確認してもらう時に不要な要素が入っていたり、
ロックがかかってたりするとミスに繋がることがあります。
きれいな状態で、提出できるように心がけましょう。
##データを渡すときはパッケージ化をして渡す
イラストレーターを人から預かったとき、リンク切れで見れない画像があったことはないですか？？
そういったミスを減らすべく、パッケージ化をしましょう。
使用した画像も全部まとめて保存してくれる機能です。
イラレのファイルからパッケージを押すと保存してくれます。
※この際、fontフォルダは不要ですので、消しちゃって大丈夫です。
##ファイル名の変更
会社でデータをクラウド上にあげて、保存するなど
デザインを保存する際にも各会社ルールがあると思います。
うちの会社では、クラウド上にあげるのですが、ファイル名の一番最初に日付を入れて保存します。
「170812_●●●●●.ai」
バックアップにもなるので正確な日付や適切なファイル名で保管しましょう。
#準備
##コーディングに入る前にイラレを調整する
1.全てのimgをスライスレイヤーにしておく。
2.デザイン横（アードボード外）にh1:20pxなどの情報を記入しておく。
ChaSen を mac にインストールする際のリンクエラー

# 状況

[ChaSen](http://chasen-legacy.osdn.jp/)をCLionにインポートして使ってみようと考えましたが, 下記のリンクエラーが出てビルドに失敗しました。

```
Undefined symbols for architecture x86_64:
  "_libiconv", referenced from:
      _jlit_init in literal.c.o
      _convUTF8 in literal.c.o
  "_libiconv_close", referenced from:
      _jlit_init in literal.c.o
      _convUTF8 in literal.c.o
  "_libiconv_open", referenced from:
      _jlit_init in literal.c.o
      _convUTF8 in literal.c.o
```

**環境**

* Mac OSX El Capitan 10.11.2 
* CMake 3.3

# 解決策

`/usr/lib/libiconv.dylib`ではなく`/usr/local/lib/libiconv.dylib`を参照するように設定します。

libiconvが何を参照しているかはFindIconvを利用
https://github.com/onyx-intl/cmake_modules/blob/master/FindIconv.cmake
numpyで最小二乗法フィッティングを行う。

Pythonの行列演算ライブラリnumpyを用いて,単一変数xによって説明されるyについて
最小二乗フィッティングを行いたいと思います。

まず、numpyを用いて確率的に3次のグラフを描画します。

```python:グラフの描画
#モジュールのインポート
import numpy as np
import matplotlib.pyplot as plt

#説明変数(1次元)
x = np.arange(-3,7,0.5)
#応答変数(説明変数の3次元関数とし、正規分布に基づいて乱数的に生成した。
y = 10*np.random.rand()+x * np.random.rand() + 
    2*np.random.rand()*x**2  +x**3

#描画
plt.scatter(x,y)
plt.show()
```

![生データグラフ](https://cl.ly/2r2a2z3B0p0g)



最小二乗法では、データと予測値のL2ノルムを
誤差(Error)と解釈し、それを最小となるように回帰線の係数を求めます。
予測したいデータをy、回帰線を$p$とすると、Errorは


```math
Error = \sum_{i=1}^{N}(y_i - p_i)

```

となります。
このErrorを最小化することが最小二乗法回帰のゴールです。

また、$p_i$は以下の様にn次式で表されます。

```math
1次式\\
p_i = a_1 x + a_0 \\
2次式\\
p_i = a_2 x^2 + a_1 x + a_0 \\
3次式 \\
p_i = a_3 x^3 +  a_2 x^2 + a_1 x + a_0 \\
n次式 \\
p_i = a_n x^n + ...  a_2 x^2 + a_1 x + a_0\\

```


今回は、numpyのpolyfit関数を用いてフィッティング後の式の係数$A=(a_0,a_1,..a_N)$を求めたいと思います。
polyfit関数により回帰式の係数を求めます。
その後、係数をn次式に当てはめて
回帰式を求めますが、複雑になってきたら
polyfit1d関数などを用いるのも便利です。

```python:フィッティングとそれにより得られたn次式の描画

#1次式
coef_1 = np.polyfit(x,y,1) #係数
y_pred_1 = coef_1[0]*x+ coef_1[1] #フィッティング関数

#2次式
coef_2 = np.polyfit(x,y,2) 
y_pred_2 = coef_2[0]*x**2+ coef_2[1]*x + coef_2[2] 

#3次式
coef_3 = np.polyfit(x,y,3) 
y_pred_3 = np.poly1d(coef_3)(x) #np.poly1d,求めた係数coef_3を自動で式に当てはめる。

#描画

plt.scatter(x,y,label="raw_data") #元のデータ
plt.plot(x,y_pred_1,label="d=1") #1次式
plt.plot(x,y_pred_2,label="d=2") #2次式
plt.plot(x,y_pred_3,label = "d=3") #3次式
plt.legend(loc="upper left")
plt.title("least square fitting")
plt.show()
```

![フィッティング後のグラフ](https://cl.ly/0O0j3q2o0r2j)

今回は3次式によるフィッティングが良さそうです。
高次になるほど誤差は小さくなりがちですが、
得られたデータセットにのみ依存する過学習
には注意しましょう。
DatadogのMonitorでEC2タグを利用してアラート送信先を変更する

# 概要
Datadogにおける監視機能としてmonitorがありますが、monitorはアラートの発生条件(しきい値やイベント)、発生した際のアクション、などについて設定を行うことができます。
EC2のタグの内容によってアクションを変えてみた、というのが本TIPSの内容になります。

# is_matchを使う
monitorの設定では通常、アラートのレベルなどで通知内容を変えたりする場合、`Say what's happening`の箇所に下記のように記述すると思います。


```
{{#is_alert}}
 Alert
 @alert通知先メールアドレス
{{/is_alert}}
{{#is_warning}}
 Warning
 @warning通知先メールアドレス
{{/is_warning}}
```
こうすると、alertの場合は本文にalertと入り、通知先はalert用アドレス、warningの場合には本文にwarningと入り、通知先はwarning用アドレス、となりますね。

このis_なんちゃらシリーズには下記のようなものがあります。

is_alert
is_alert_recovery
is_no_data
is_no_data_recovery
is_recovery
is_match
is_exact_match
is_warning
is_warning_recovery

この中で注目は is_match です。
これは、{{変数}}で展開できる変数がマッチした場合にアクションを起こすことができる機能です。

monitorの中で使用する場合は、下記のような書式になります。

```
{{#is_match "変数名" "値"}}
 アラート本文
 @通知先アドレス
{{/is_match}}
```
変数としてEC2のタグを使用する場合、{{host.Key}}となります。
たとえば、環境名としてenvというKeyのタグを使用し、valueに本番環境のインスタンスにはprod,開発環境にはdevという値をつけたとします。
その環境下で、本番環境のみアラート通知がしたいという場合、

```
{{#is_match "host.env" "prod"}}
 アラート本文
 @通知先アドレス
{{/is_match}}
```

というmonitor設定をすることにより、本番環境のみアラート通知を行うことができます。

開発環境も通知がしたいが、内容を変えたい、という場合は下記のようにすることができます。

```
{{#is_match "host.env" "prod"}}
 本番環境アラート本文
 @通知先アドレス
{{/is_match}}
{{#is_match "host.env" "dev"}}
 開発環境用アラート本文
 @通知先アドレス
{{/is_match}}
```

また、is_なんちゃらはネストすることが可能で、下記のような設定もできます。

```
{{#is_alert}}
{{#is_match "host.env" "prod"}}
 本番環境アラート本文
 @通知先アドレス
{{/is_match}}
{{#is_match "host.env" "dev"}}
 開発環境用アラート本文
 @通知先アドレス
{{/is_match}}
{{/is_alert}}
```

以上です。
Illustrator①合成フォント

#合成フォント
書式を細かく設定したい時に便利な機能。

例えば、ひらがなと漢字は明朝体で英語はゴシック体にしたい時
その都度書式を変更していたら面倒ですよね。
そんな時に合成フォントであらかじめ設定していくとこの問題が解消できます。

##操作方法
Illustratorの[書式]→[合成フォント]で設定、
サイズ等も変更できます。
<img width="1295" alt="スクリーンショット 2017-08-14 14.58.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/185341/596b5efd-9433-3978-30df-cb8b749c0cd1.png">

設定が完了した合成フォントは、フォントファミリから選択して使用できます。
ブラウザでnpmモジュールを使いたい

## まえがき
フロントで使えそうなライブラリが、npmモジュールとしてしか提供されていないときがあります。しかし、npmモジュールは2017.8現在、直接ブラウザが読み込めるものではありません。

こうなると、普段はビルドツールなぞ使わず、雑なジャヴァスクリプトをべた書きしているプログラマ(私)であっても、ビルドツールを使わざるをえません。現在の代表的なビルドツールといえば、webpackです。

さて、世の中的にはふつう、ターミナルが大得意な人たちがモダンでイケてる開発をやるためにwebpackを使っています。ですから、このような雑なニーズに初歩的な操作で対応する方法は、言うまでもないぜという感じであり、意外に転がっていなかったりします。

そこで、このようなことをやる記事を書いてみます。

## markdown-it-katex
今回は、Markdownで数式を入力したい人に関係のある
`markdown-it-katex` というnpmモジュールをブラウザに読み込ませてみます。

（以下は記事の主題とは無関係なので読み飛ばしてOK）

多くのmarkdownパーサは、その仕様上、`$`内の\を尊重してくれません。
しかし、数式入力で最もメジャーな記法であるLaTeXにとって\は頻出記号です。
そのままだと、MarkdownとLaTeXの共存に頭をひねる必要があって面倒です。

>基本的に markdownの解釈をした後にTeX記法を解釈してるから起こってる問題な気がする・・・。 何が原因かわかるまでめちゃくちゃデバッグしました(ノД`)

from: [はてなブログのTeX記法で数式を書く時用のチートシートと注意点](http://cocodrips.hateblo.jp/entry/2017/04/11/032000)

Markdownで数式を書きたい人にとって、`$`内の\を尊重してくれると嬉しいです。
`markdown-it-katex`とは、`markdown-it` のプラグインであり
このプラグインを挟むことで`markdown-it`が`$`内の\を尊重するようになります。

## 手順

前提として、Node.jsをインストール済みであることが求められます。
まずは、使いたいモジュールを用意するディレクトリを切り、npmモジュールを取ってきます。

（`markdown-it-katex`のみならず、`markdown-it`や`jquery`もnpmモジュールとして取ってきています。
ただし、今回の例では、普通に`<script>`から読み込んでも構いません）

ターミナルを開き、次のコマンドを叩きます。

```
mkdir xx
cd xx
npm install webpack --save-dev
npm install markdown-it markdown-it-katex jquery
```

ビルド前のスクリプトを書きます。

```js
// front.js
$  = require("jquery")
md = require('markdown-it')().use(require('markdown-it-katex'))
$(".markdown-body").html( md.render( $(".source").text() ) )
```

動作確認用のHTMLを書きます。

```html
<!-- index.html -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.5.1/katex.min.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/github-markdown-css/2.2.1/github-markdown.css"/>
<div class=markdown-body></div>
<div class=source style="display: none">

# Hello $\KaTeX$ !

</div>
<script src="bundle.js"></script>
```

webpackの設定を書きます。

これはできるだけ、最小限にしました。
ただし`source-map`はつけていて、これを与えると、
ブラウザのdevtoolsで変換元のソースにもとづきデバグができます。

```js
// webpack.config.js
module.exports = {
  entry: './front.js',
  output: {
    filename: './bundle.js'
  },
  devtool: 'source-map',
};
```

ターミナルで、ビルドを実行しましょう。

```
$(npm bin)/webpack
```

ここで `webpack.config.js` を用意することすら面倒な人は、
コマンドに引数を書くことでビルドしても構いません。

```
$(npm bin)/webpack ./front.js ./bundle.js --devtool source-map
```

ビルドの結果、ブラウザで読み込め、かつnpmモジュールの諸々が入っている `bundle.js` ができます。

## 結果

```
$ ls
bundle.js
front.js
index.html
webpack.config.js
```

ブラウザで開いてみましょう。動いていますね。

![](https://i.imgur.com/QHpV1nT.png)
Gremlin？GraphDBになぜこのネーミングか。。

#Do you know about Gremlin ?

どこかで聞いたことのある、グレムリン。Qiitaで話題とするのはグラフデータベース操作言語のグレムリンです。

![gremlin-logo.png](https://qiita-image-store.s3.amazonaws.com/0/89791/8ac288f2-f762-3115-d432-6486d7a0aeb1.png)

なんじゃ、こいつは。


ウチにもいます。こんなのが。甘やかすとデビル化します。![Image-1.jpg](https://qiita-image-store.s3.amazonaws.com/0/89791/3094a797-7b2f-768d-3c74-9c88cef6a0f4.jpeg)




##TinkerPop

![apache-tinkerpop-logo.png](https://qiita-image-store.s3.amazonaws.com/0/89791/bae5bf4a-e020-90e9-1412-08fb8abfdb4c.png)


Apache財団さまの「グラフデータベースフレームワーク」プロジェクト。
現在は３世代目となっているらしい。

まずは、
http://tinkerpop.apache.org/docs/current/tutorials/getting-started/
こちらのGetting Startからどんなものか、みてみましょう。

##グラフデータベースでの点と辺

###グレムリンの友達の友達は？というクエリはこうなる。

    g.V().has("name","gremlin").
      out("knows").out("knows").values("name")

g : Graph インスタンス
V : 頂点 (vertex)
has : Traversal Step 関数　


矢印の方向に注目して下の図を見てみよう。

![modern-edge-1-to-3-1.png](https://qiita-image-store.s3.amazonaws.com/0/89791/ef892ebd-ee43-0a34-d4f1-6db72d23ee79.png)

起点となる１はout vertex(頂点）,edge(辺） がつながり、in が対象の点。

*V().has("name","gremlin").out("knows")* 
グレムリンという名前の頂点から、knowsの辺でつながっている点（友達）

*.out("knows").values("name")*
の友達の名前。

グラフデータベースでは、点と点のつながりを辿っていく。この経路のことをTravesalと呼ぶ。traverseとは横切る、とか走査するとかの意味がある。これまでのSQLであれば、カーソル、といったインスタンスがイテレータになっていたが、グラフデータベースではTraverser になる。


- vertex 頂点 
- edge 辺
- Traversal Step 経路走査の手順


この用語を押さえておくとよいかなと思います。

具体的にこんな感じ：

     gremlin> graph = TinkerGraph.open()
    ==>tinkergraph[vertices:0 edges:0]
    gremlin> v1 = graph.addVertex(T.id, 1, T.label, "person", "name", "marko", "age", 29)
    ==>v[1]
    gremlin> v2 = graph.addVertex(T.id, 3, T.label, "software", "name", "lop", "lang", "java")
    ==>v[3]
    gremlin> v1.addEdge("created", v2, id, 9, "weight", 0.4)
    ==>e[9][1-created->3]

![modern-edge-1-to-3-1-gremlin.png](https://qiita-image-store.s3.amazonaws.com/0/89791/55b8cd39-bfc1-a47d-b77d-9d0d9316bcec.png)

##グラフデータベースフレームワーク

ThinkerPopは、上記のグレムリンを含む、いくつかのレイヤーからなるグラフデータベースフレームワーク。ある特定のデータベースやプロセッサにとらわれず、同じコードを使って、異なったグラフデータベース間で自分たちの環境に最適かどうかをテストしたり、並列化へのスケールアップもシームレスに行えます。ThinkPopAPIの下にあるproviderの切り替えで、別のグラフデータベースに入れ替えも可能なAPI形式なので、Gremlinで書いた部分からAPIを経由して、他のOLTPやOLAPを利用することができるようになっています。つまり、上層のGremlin ServerとGremlin言語でのロジックと、データのストラクチャの部分は分離されているので、その時に最適な別のグラフデータベースやプロセッサに置き換えることが可能です。

![provider-integration.png](https://qiita-image-store.s3.amazonaws.com/0/89791/7282a0fe-022f-c83a-eda1-c4103b7d336c.png)



Gremlin Serverは、RESTや WebSocketといったエンドポイントから、リモートのグレムリンスクリプトのリクエストを受けつけて、自身のグラフデータベースから応答を返すサーバーです。thinkpopのjavaドライバからサードパーティの他の言語でもWebSocketで通信することができます。（MySQLやpostgresのドライバー接続のように）

では、次回は実際に使ってみます。
Using while loop to ssh to multiple servers

If you find yourself doing this kind of task quite often, you should try Fabric

Install the Fabric following the instructions, most cases you just need sudo apt-get install fabric

Create a file named fabfile.py with following code:
```
from fabric.api import env, run

env.hosts = ['server1.mydomain.com',
             'server1.mydomain.com',
             'server1.mydomain.com']

def mytask():
    run('uname -a')
```


Then run fab mytask will give you the result you want.

https://unix.stackexchange.com/questions/107800/using-while-loop-to-ssh-to-multiple-servers
githubへgit pushすると403エラーとなる時の対応

githubへgit pushしようとしたところ403エラーでできなかったため、その解決方法のメモ書き。
# 現象
[github desktop](https://desktop.github.com/)でリモートレポジトリにpublish(＝初回のpush)しようとしたら正しく認証情報を登録しているにも関わらず、認証に関するエラーが出てpublishできなかった。
そこでコマンドライン上でgit pushしてみたところ、以下のようなエラーメッセージが出力された。

```text:出力されたエラーメッセージ
$ git push
remote: Permission to AAA/abc.git denied to BBB.
fatal: unable to access '(リポジトリURL)': The requested URL returned error: 403
```
BBBユーザ情報はもう不要なので削除方法を調べたところ、
http://qiita.com/piyomarudayo/items/ae8b040080f53e9952ee
を見つけ、この資料に従ってgit credential fillやgit credential rejectしたが反応が返ってこない…
.git/configにも特にユーザ情報の記載なし。
なお端末はMacBookPro(MacOS 10.12.6 Sierra)

# 原因
- エラーメッセージに書かれている通り、AAAユーザのリポジトリなのにBBBユーザの情報で認証しようとしているため。

# 対応方針
- BBBユーザ情報は過去に使っていただけなので削除する。

# 解決方法
- Macのアプリケーション→ユーティリティ内にある「キーチェーンアクセス」を起動して、github.comの項目から BBB アカウントの情報を削除する。

# まとめ
- .git/configに認証情報が書かれていない場合はgit credential fillコマンドによる確認が必要。
- git credential fillやrejectを実行しても何も反応がない場合はキーチェーンアクセスを確認する。

# 参考資料
- http://qiita.com/piyomarudayo/items/ae8b040080f53e9952ee
Macにpyenvを入れたらbrew doctorで怒られるようになったので対応したメモ

Ansibleの1.9系と2.0系を両方使いたくてpyenvを導入したらHomebrewに怒られた。

```bash
$ brew doctor
Please note that these warnings are just used to help the Homebrew maintainers
with debugging if you file an issue. If everything you use Homebrew for is
working fine: please don't worry and just ignore them. Thanks!

Warning: "config" scripts exist outside your system or Homebrew directories.
`./configure` scripts often look for *-config scripts to determine if
software packages are installed, and what additional flags to use when
compiling and linking.

Having additional scripts in your path can confuse software installed via
Homebrew if the config script overrides a system or Homebrew provided
script of the same name. We found the following "config" scripts:
  /Users/tsukapah/.pyenv/shims/python-config
  /Users/tsukapah/.pyenv/shims/python2-config
  /Users/tsukapah/.pyenv/shims/python2.7-config
```

PATHが通ってるところとかHomebrew関連のディレクトリに管理外の`*-config`が悪影響及ぼすかもしれないからどうにかしてねー、って感じでしょうか。

実際にPATHはこうなってた。

```bash
$ echo ${PATH}
/Users/tsukapah/.pyenv/shims:/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
```

しっかり先頭にいる。
ファイル消すわけにもいかんしPATHをどうにかする方向で検討。

brewコマンドを使うときだけpyenv用のPATHが通らなくなればいいので、brewコマンドの`alias`を以下の感じで.bash_profileの最後に設定しておけば解決。

```.bash_profile
alias brew="env PATH=${PATH/\/Users\/${USER}\/\.pyenv\/shims:/} brew"
```

あとはこの.bash_profileを読み込み直してあげればHomebrewの機嫌も直ってメデタシ。
Angular2系以上で、$scope.apply()っぽいことしたい

APIでデータ取ってきた後にデータバインドで画面を反映させたかったんだけど、うまく動きませんでした。
Angular1系だったら$scope.apply()で強引にやってたんだけど、それを2系以上でやるのってどうやるんやろか。

と思って見たら、ChangeDetectorRefというものがある模様。
組み込んでみたら、ちゃんと動きました。やったね！

動けばいいので、しくみとかはよくわかってないです。
たぶん変更を検知してDOMを更新してくれてるんだと思います。

```ts:search.ts
 // ChangeDetectorRefをインポートするらしい
 import { Component, ChangeDetectorRef } from '@angular/core';
 
 @Component({
   selector: 'page-search',
   templateUrl: 'search.html'
 })
 export class SearchPage {
   ...
   constructor(public navCtrl: NavController, private chRef: ChangeDetectorRef) {
     ...
   }
   // 検索を行う
   search(searchWords) {
     searchAPI.getResult(searchWords).then(
       (data) => {
       	this.results = data;
         // 変更検知して、DOMを更新してくれてるんだと思う
         this.chRef.detectChanges();
       }
     );
   }
 }
```

LifeCycleというものもあるそうです。
これはAngular2系なのかな。

参考
https://stackoverflow.com/questions/33174146/angular-2-0-equivalent-to-scope-apply
Quake Engine code review : Architecture (1/4)の和訳をしてみた

#概要
オンラインゲームの勉強の為に参考になりそうなサイトを探していたところ、元祖3Dマルチプレイ対応FPSゲームであるQuakeのソースコードがオープンソースで公開されているのを見つけた。
更にそのソースコードの概要をレビューしてくれているサイトがあったので、これを自分の勉強用に和訳したものをメモとして残しておく。

#Quake Engine code review : Architecture (1/4)

私は喜んでQuake Worldのソースコードを読み始めました。 ここで私が理解したことは、誰かがソースコードを理解する助けとなればと思います。

この記事は4つの部分に分かれています

1.[Architecture section](http://qiita.com/UnagiHuman/items/cf30a55bbb6b604fdb94)（本記事）
2.[Network section](http://qiita.com/UnagiHuman/items/2806ac5f2e51c6a5b3be)
3.[Prediction section](http://qiita.com/UnagiHuman/items/5ef6d1eb7c8672779561)
4.Rendition section

#Quake Client

Quakeを研究するための出発点として、qwcl（クライアント）プロジェクトがあります。 エントリポイントWinMainはsys_win.cにあります。 コードの簡単な要約は次のとおりです。

```csharp
WinMain
	{
		while (1)
		{
				newtime = Sys_DoubleTime ();
				time = newtime - oldtime;
				Host_Frame (time)
				{
					setjmp
					Sys_SendKeyEvents
					IN_Commands
					Cbuf_Execute
					
					/* Network */
					CL_ReadPackets
					CL_SendCmd
					
					/* Prediction//Collision */
					CL_SetUpPlayerPrediction(false)
					CL_PredictMove
					CL_SetUpPlayerPrediction(true)
					CL_EmitEntities
					
					/* Rendition */
					SCR_UpdateScreen
				}
				oldtime = newtime;
		}
	}
```

ここから、Quake Worldの3つの重要な要素を特定できます。
1.Network    CL_ReadPackets and CL_SendCmd
2.Prediction  CL_SetUpPlayerPrediction, CL_PredictMove and CL_EmitEntities
3.Rendition   SCR_UpdateScreen

ネットワーク層（ネットチャネルとも呼ばれる）は、ワールド情報をフレーム変数（frame_tの配列）に出力します。 それらは、予測レイヤによってピックアップされ、衝突が処理され、可視性エクリプス（cl_visedicts）およびPOV定義の形式でデータが出力されます。 VisEdictsは、シーンをレンダリングするためのPOV（cl.sim *）変数に加えて、レンディションレイヤーによって使用されます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/116884/5f9d5e8f-1b1e-5c40-046e-45bdb1c9ed8c.png)

##setjmp：
コードウェイポイントを設定します。悪いことが起きた場合、プログラムはここに戻ります。

##Sys_SendKeyEvents：
Windows OSメッセージを取得し、最小化など...エンジン変数を適切に更新します（たとえば、ウィンドウが最小化されている場合、ワールドはレンダリングされません）。

##IN_Commands：
ジョイスティックの入力を取得します。

##Cbuf_Execute：
すべてのゲームループで、バッファ内のコマンドが実行されます。 コマンドは主にコンソール経由で生成されますが、サーバーや直接のキーストロークから来る場合もあります。

ゲームはコマンドバッファ内のexec quake.rcで始まります。

##CL_ReadPacketsおよびCL_SendCmd：
エンジンのネットワーク部分の役割を担っています。 CL_SendCmdはマウス/キーボード入力を取得し、コマンドを生成して送信します。 Quake WorldはUDPを使用しているため、信頼性は主にnetChannelパケットヘッダーのsequence / sequenceACKのセットを介してreplicatedされます。 さらに、最後に送信されたコマンドは系統的に再送されます。 フロー制御に関して、クライアント側に制限はなく、更新はできるだけ速く送られる。 サーバー側では、パケットが受信され、送信レートが「チョーク」制限を下回っている場合にのみ、メッセージがクライアントに送信されます。 この制限はクライアント側から設定され、サーバーに送信されます。

上記の詳細はNetwork sectionパートに書いています。

CL_SetUpPlayerPrediction、CL_PredictMoveおよびCL_EmitEntities：

エンジンの予測部分だけでなく衝突の役割を担っています。 目標は、主にネットワーク通信の待ち時間に対処することです。

上記の詳細はPrediction sectionパートに書いています。

##SCR_UpdateScreen：
エンジンのレンダリングの役割を担っています。 この部分では、BSP / PVSが広く使用されています。 これは、include / defineに基づいてコード内でフォークが発生する場所でもあります。 Quakeエンジンは、純粋なソフトウェアまたはハードウェアを高速化して世界をレンダリングすることができます。

上記の詳細はRendition sectionパートに書いています。
アプリ開発におけるスクラム開発

# はじめに

この記事では私が立ち上げたWebアプリ開発コミュニティのマネジメントについて書きます。

コンテンツ

    1. 我流スクラム開発概要
    2. プロダクトバックログとは
    3. スプリントプランニングとは
    4. ウィークリースクラムとは
    5. レトロスペクティブとは 

では早速概要の説明に移ります。 

# 1. 我流スクラム概要

我々の開発手法はなんちゃってスクラムです。
なんちゃってスクラムですが、継続してPDCAを回すことでより良い開発体制を実現できるよう活動しています。

次の図が概要となります。

![概要](https://qiita-image-store.s3.amazonaws.com/0/186182/8e3d8822-b373-b552-6a32-89428a3f3460.png)

専門用語ばかりで読みづらいので、日本語化します。。

    プロダクトバックログ　　・・・　製品の機能（例：ユーザー検索）
    スプリントプランニング　・・・　次の開発サイクルの計画（実装する追加機能の選定やタスク割り振り）
    ウィークリースクラム　　・・・　週次定例会議（進捗や課題を話し合う）
    レトロスペクティブ　　　・・・　各開発サイクルの最後に行い、開発サイクルでのKPT(Keep：これからも続けたいこと, Try：次回挑戦したいこと, Problem：問題があったこと)を洗い出し、議論する

次の図では実際の活動はどうなっているのか、その実績を説明します。

![実績](https://qiita-image-store.s3.amazonaws.com/0/186182/61a205ca-a5bf-6e41-ea8f-5e676ddc576d.png)


以上で我流スクラム開発の概要説明は終わりです。

以降のチャプターではそれぞれのフェーズをより具体的に説明します。


# 2. プロダクトバックログとは

製品に実装する機能のこと

管理方法

    1. 浮かんだアイデアをslackの#backlogに投稿
    2. slackに投稿したアイデアに対して、受入基準・工数見積もりを付与（スレッドを活用）
    3. GitHubのissue化

サンプル

    タグ一覧のトップページ表示
    イベント作成時に日程が決まっていない場合に、日程調整機能を使用することができる
1. 思いついたらアイデアベースでslackに書き込み。
2. slack上でメンバーと議論しながら詳細をつめる。

![backlog](https://qiita-image-store.s3.amazonaws.com/0/186182/3c684b5b-a0c7-4817-8d25-2816cfe5231e.png)


3.GitHubを開いてissueを作成する

![issue](https://qiita-image-store.s3.amazonaws.com/0/186182/7b9722c1-8d4b-1aed-4ac6-4f97c54f4f9f.png)



#3. スプリントプランニングとは

今回のスプリントで実装するバックログを決め、担当者を割り振る。

GitHubのアドオンZenHubを用いて、カンバン方式（Trelloでも作成可能）で管理しているissueのうち、Pre-Backlogの状態のissueの中から本スプリントで実施するものを選定し、タスクを割り振る。

 

図. カンバン
![board](https://qiita-image-store.s3.amazonaws.com/0/186182/fac9aacf-df7d-efce-f81e-255f68be305d.png)

選定の基準となるのは、

    1. スプリント期間(2週間)でこなせる仕事量に余裕をもつ
    2. ユーザーにとって価値がある
    3. 運営を圧迫しない
の3点。
1は各自のプロジェクト・プライベートの状況に合わせて柔軟に設定。
2はUI/UXの観点から本当にユーザーに必要な機能かどうか。
3はその機能を作ることで運営側の対応が必要となり、首を絞めることにつながらないかどうか。
という観点で議論しています。

#4. ウィークリースクラムとは

そのまんまで、週次定例会議のこと。

###▶︎内容
① 進捗確認（5min × 8person = 40min）
GitHubを使い、図. カンバンのように管理されているissueを人単位でフィルターすることができるので、各自5分で自分のタスクの進捗状況を共有

② 議題 （15min × 議題の数 = (max)1hour）
実装上の課題や運用の課題などを話す

③ UATテスト（20 - 30min）
その週に追加実装された機能を統合したUAT環境で、一通りの機能の統合テストを行う。


###▶︎場所
月に1回Face to Faceでそれ以外はリモートで実施。
・リモート（skype, slackを使用して画面共有）
・Face to Face


###▶︎所要時間
基本は2時間（最大で3時間）


#5. レトロスペクティブとは

1ヶ月に1度、各開発サイクルの最後に行い、開発サイクルでのKPT(Keep：これからも続けたいこと、Try：次回挑戦したいこと、Problem：問題があったこと)を洗い出し、議論する。
議論した結果、コミュニティの運営方針に決定事項を追加する。

![retrospective](https://qiita-image-store.s3.amazonaws.com/0/186182/e70626a2-f634-1ccf-8293-73a95458dad1.png)


#おわりに

長々と書いてしまいましたが、最後まで読んでくれた方、どうも有難うございます。
もっとこうした方がいいんじゃないか、こういうところはいいと思う！など感想を書き込んでくれたら嬉しいです。

質問などありましたら、気軽にコメントしてください。
ではでは。
Check! Ansible の Dynamic Inventory を python で書くときは、shebang を忘れずに！

こんにちは、 @dz_ こと大平かづみです。

Prologue - はじめに
====
構成管理は、 Ansible を好んで使っています。今回は、インベントリを動的に指定したかったため、 Dynamic Inventory を試してみたところ… しばらく下記のエラーにはまってしまいました。対処できたので備忘録を書き留めます。

なお、 Dynamic Inventory については、下記のドキュメントを参考にしました。

- [Developing Dynamic Inventory Sources — Ansible Documentation](http://docs.ansible.com/ansible/latest/dev_guide/developing_inventory.html)
- [Ansible Dynamic Inventoryをつくろう！ - Qiita](http://qiita.com/t_nakayama0714/items/91c2d711a397df68dddc)
    - こちら、とても分かりやすい記事です！


Ansible の Dynamic Inventory を python で書くときは、shebang を忘れずに！
====
エラー内容
----

遭遇したエラーはこちらです。

```
ERROR! Attempted to execute "./dynamic-inventory.py" as inventory script: problem running ./dynamic-inventory.py --list ([Errno 8] Exec format error)
Attempted to read "./dynamic-inventory.py" as ini file: ./dynamic-inventory.py:1: Expected key=value host variable assignment, got: 
```

"スクリプトの実行を試みたけど、エラーがでるね。ついでに ini ファイルとしても読んでみたけどダメねー。" とのこと…

対処
----
しばらーく試行錯誤したのち、この issue を発見！

- [Executable bash script not working · Issue #9 · ansible/ansible-inventory-backport · GitHub](https://github.com/ansible/ansible-inventory-backport/issues/9)

> That file needs a shebang line.

なるほど、`shebang line` が必要なんだそう！ shebang?

- [シバン (Unix) - Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%B7%E3%83%90%E3%83%B3_(Unix))

> シバンまたはシェバン (shebang) とはUNIXのスクリプトの#!から始まる1行目のこと。

なるほど！！

ということで、[Python の `Shebang line`](https://docs.python.org/3/using/windows.html#shebang-lines) を参考に、私の動作環境では以下の shebang を書けばよいみたいです。

```
#!/usr/bin/env python
```

これを設定すると、すんなり動きました！(･ε･;)

Epilogue - おわりに
====
shebang は普段あんまり気にしてなかったので、思わぬ落とし穴でした！
Pythonで特定の文字が最後だったら削除する

メモです

TCPdumpとかの出力を文字で区切りたい時、IPの最後の文字が":"だったら削除したいって時ありますよね
~~そういう時は~~

```python3:laststring.py
str="1234:5678:abcd:231a:"

if(str[-1:]==":"):
    print(str[:-1])
else:
    print(str)
```

~~でいけます~~

#追記
こっちの方がよかったです

```
str="1234:5678:abcd:231a:"
print(str.rstrip(':'))
```
コマンドラインからLINEのメッセージを送るやつ

[LINE Notify 簡単なシェルスクリプトで試してみた](http://qiita.com/tbuchi888/items/f014f809a7e9f649d270)を参考にして、コマンドライン上からライングループにメッセージを送れるようにしました。
アクセストークンをあらかじめ作成した`access_token_table`というファイルから取得し、メッセージの送信先を簡単に入力できるようにしてみました。30桁くらいのアクセストークン入力しなくて済みます。


# 使い方

`./line.sh <送信先> "ラインに投稿するメッセージ"`

画像では、送信先をu1and0として登録したアクセストークンを使ってメッセージを送信しています。

![line_notify.PNG](https://qiita-image-store.s3.amazonaws.com/0/113494/cc90d432-71b2-5abc-247e-f47bbb52db15.png)


# スクリプト

```bash:line.sh
#!/bin/sh
# Usage
# ./line.sh TOKEN_NAME MESSAGE

. `cd $(dirname $0);pwd`/access_token_table  # 同ディレクトリ上のアクセストークンリスト

ACCESS_TOKEN=${token[$1]}  # ハッシュ値としてアクセストークンを取得
MSG=$2

curl -X POST -H "Authorization: Bearer $ACCESS_TOKEN" -F "message=$MSG" https://notify-api.line.me/api/notify
```

```bash:access_token_table
#!/bin/bash

declare -A token  # ハッシュ宣言

token["u1and0"]="xxXXxxXXXxxxxxxxxxxxxXXXXXxxXXXXXXX"
token["foo"]="xxXXxxXXXxxxxxxxxxxxxXXXXXxxXXXXXXX"
token["bar"]="xxXXxxXXXxxxxxxxxxxxxXXXXXxxXXXXXXX"
...
```


# 参考
* 公式: [コマンドラインから LINE にメッセージを送れる LINE Notify](https://engineering.linecorp.com/ja/blog/detail/88)
* Qiitaの元ネタ: [LINE Notify 簡単なシェルスクリプトで試してみた](http://qiita.com/tbuchi888/items/f014f809a7e9f649d270)
* [bashスクリプトのおかれているディレクトリの完全なパスを取得したい](http://qiita.com/t_cyrill/items/eb010de0fa40924bf31f)
* [Bashで連想配列を使用する](http://qiita.com/ques0942/items/a5c0e1d873dd71116e6b)
gtop でシステムモニタリングダッシュボードをターミナルに表示する

## <i class='fa fa-question-circle'></i> gtop とは？
>System monitoring dashboard for terminal.

## <i class='fa fa-download'></i> インストール
Mac 環境のインストール例です。

```sh
$ npm install gtop -g
```

## <i class='fa fa-flask'></i> デモ
![demo.gif](https://qiita-image-store.s3.amazonaws.com/0/43480/62185d7d-45a6-df42-5418-35e15d819151.gif)

## <i class='fa fa-book'></i> 関連情報
* [aksakalli/gtop: System monitoring dashboard for terminal](https://github.com/aksakalli/gtop)
スプライト画像の生成のベストプラクティスについて

## 事の経緯（読み飛ばしてOK）

1. 昔作ったReactをFiber対応するついでに、Build環境の刷新を思い立つ
2. 現状は 
 - JS:Gulp+Browserify
 - CSS:gulp-sass
 - スプライト画像：gulp-spritesmith
 - ローカル環境：gulp-server
3. browserify -> webpack3
4. gulp-sass -> node-sass
5. gulp-server -> webpack-dev-server

と、ここまできて思った

「webpackもnode-sassもCIから直接叩けるから、Gulp要らなくね？依存ファイルは少ないほうがいいし」

しかしここで問題が一つだけある

「sprite-smithどうしようかな・・・」

## 代替案

### SpriteSmith
spritesmith本体、これだけでも設定ファイル書けば使えるんだけど、かなりめんどくさい
[spritesmith](https://www.npmjs.com/package/spritesmith)
### gulp-spriteSmith or grunt-spriteSmith
使いやすいのはわかるんだけど、もはやgulpもgruntもspriteSmith以外には使う予定がないので、可能な限り避けたい
[gulp-spritesmith](https://github.com/twolfson/gulp.spritesmith)
[grunt-spritesmith](https://github.com/Ensighten/grunt-spritesmith)
### webpack-spritesmith
gulp/gruntの代替としては有力候補だが、依存ファイルがやたらと多い上に設定にクセがあって辛い、なんか書き方がコロコロ変わる印象
[webpack-spritesmith](https://www.npmjs.com/package/webpack-spritesmith)
### spritesmith-ci
なぜか知名度の低いspritesmithのCI版、使い方も簡単でJSの設定ファイルを置いて、コマンド叩くだけ 
[spritesmith-ci](https://github.com/bevacqua/spritesmith-cli)

## というわけで spritesmith-ci おすすめ

実は使うのが簡単で、やるのは「.spritesmith.js」という設定ファイルを作って

```.spritesmith.js
module.exports = {
  src: 'sprites/*.png', // スプライト画像になる元画像
  destImage: 'images/sprite.png', // 生成される画像
  destCSS: 'sass/_sprite.scss' // 生成されるスプライト用CSS
};
```

こんな感じで設定を書く、あとは

```
./node_modules/bin/spritesmith
```
とかコマンド打てばOK！

明らかに他の手段よりも簡単な上に依存ファイルも少ないし、何かのビルドシステムに依存していないので、後に違うツールで代替したり、削除したりするのも楽なのでオススメ。
Unity 3Dオブジェクトにanchorを設定する


## １つ目

アンカーポイントを設けたい3Dオブジェクトに親を作って、
親子の位置をずらしてアンカーポイントにする。

![スクリーンショット 2017-08-14 13.58.23.png](https://qiita-image-store.s3.amazonaws.com/0/37406/9ae2767c-5e40-002d-70a2-298aea7e1b98.png)


## 2つ目

Blenderなど、３Dモデルツール側で変更する。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/37406/9e3fbd90-ffb1-3b87-e3a8-fe6202757ff5.png)


## 3つ目

Jointコンポーネントを使う
[Unity]EventSystem.current.IsPointerOverGameObject()でタッチ処理をスキップする覚書


```EventSystem.current.IsPointerOverGameObject()``` を使うと、nGUI上のオブジェクトをいじってるときにはクリックを無視できる。

```csharp:タップに反応しない例
if (Input.GetMouseButtonDown (0)) {
    if (EventSystem.current.IsPointerOverGameObject()) {
        // nGUI上をクリックしているので処理をキャンセルする。
        return;
    }
}
```


ところが、実機(iPhone)では処理がスキップされなくて困った。
ぐぐってみたところ、以下の記事を発見。

[[Unity]uGUIが被ってる場合はオブジェクトタップの処理を止めたい](https://anz-note.tumblr.com/post/131875315926/unityuguiが被ってる場合はオブジェクトタップの処理を止めたい)

どうやら、```IsPointerOverGameObject()```はそのままではマウスクリックしかチェックしないらしい。
タップをチェックするには、引数に```Input.GetTouch(0).fingerId```を渡せば良いようだ。

```csharp:タップに反応する例
if (Input.GetMouseButtonDown (0)) {
    if (EventSystem.current.IsPointerOverGameObject(Input.GetTouch(0).fingerId)) {
        // nGUI上をクリックしているので処理をキャンセルする。
        return;
    }
}
```

上記のように修正したところ、うまく動いた。


**【追記:２０２２年８月２３日】**

EventSystem.current.currentSelectedGameObjectのヌルチェックをする方法もあるようだ。
（iPhoneでの動作は未確認)


```csharp

    if (EventSystem.current.currentSelectedGameObject != null) {
        return;
    }
```

参考: [https://gomafrontier.com/unity/4049](https://gomafrontier.com/unity/4049)
INTER-Mediatorをはじめよう - INTER-Mediatorのアップデート

+ 作成日 2017/08/14
+ 4分
+ YouTube: https://youtu.be/RTt4QvTapqM
+ Doc: http://qiita.com/motofumi/items/943a6d38a47fa4e90e36


# はじめに
INTER-Mediatorでは、学習用にINTER-Mediator搭載のバーチャルマシンが用意されています。INTER-Mediatorで構築されているWebページを見ながらバーチャルマシンの使い方を学習します。

# ゴール
バーチャルマシンのINTER-MediatorをGitHubからアップデートできたら完成です。



# 前提条件
* [INTER-Mediatorをはじめよう - バーチャルマシンの準備](http://qiita.com/motofumi/items/ff94924a820e9c05b0c8)を理解していること。
* ターミナル.appでコマンドを入力したことがあること。
* GitHubついて多少の知識があること。



# 手順
<details>
<summary>バーチャルマシンにアクセス</summary>URLは、『 http://192.168.56.101 』です。
</details>

<details>
<summary>gitコマンドを実行</summary>
</details>



# コマンド＆コード
ターミナル.appからVirtualマシンへアクセス
`$ ssh developer@192.168.56.101`

ディレクトリの移動
`$ cd /var/www/html/INTER-Mediator`

現在のバージョンの確認
`$ cat ./dist-docs/buildup.sh | grep version=`


gitコマンド
`$ git pull origin stable`




<!--
<details>
<summary>サマリーはこちら</summary>詳細はこちら
</details>
-->

# 参考
* Youtube [INTER-Mediatorをはじめよう - バーチャルマシンの準備](http://qiita.com/motofumi/private/ff94924a820e9c05b0c8) 
* Youtube [INTER-Mediatorをはじめよう - Webページを探索しよう](http://qiita.com/motofumi/private/ff94924a820e9c05b0c8) 
* Web [INTER-Mediator - バーチャルマシンの利用](http://inter-mediator.info/ja/for-novices/vm.html)

<!-- 管理用 -->
<!-- ムービースクリプト
+『自己紹介』
+「ムービーを見てる方は、あわせてドキュメントも開いてください」
+ はじめにを朗読
+ ゴールを朗読
+ 前提条件を解説
+ 手順に入ったら、マシンで操作しながら解説
-->
Google Play への Android アプリ登録 リジェクト事例(2017/8)

Google Play への Android アプリ登録で一度は審査の結果リジェクトとなりましたが、
Google Play 審査チームに異議申し立てすることで、無事登録／公開まで行うことができた事例のご紹介となります。

# リジェクト内容
```:From&nbsp;Google&nbsp;Play&nbsp;審査チーム
XXXXXXXXXは、審査の結果、なりすましに関するポリシーに違反しているため、
Google Play での公開が停止され、削除されました。

次の手順

ポリシー違反の詳細と例について、なりすましに関する記事を確認します。
なりすましおよび知的財産権に関するポリシーなど、デベロッパー プログラム ポリシーに含まれるすべてのポリシーに
アプリが準拠しているかどうかを確認します。
お客様のアプリが再度ポリシーに違反した場合、追加の措置を取らせていただくことがありますので、
ご注意ください。
デベロッパー コンソールにログインし、新しいパッケージ名と新しいアプリ名を指定して、
ポリシーに準拠したアプリを送信します。

コンテンツの使用許可を受けている場合

Google サポートチームに、使用が正当だとする根拠をお知らせください。
正当だとする根拠とは、たとえばアプリでこのコンテンツを使用する許可を受けていることの証明などの法的な根拠を指します。
 
今後さらにアプリが停止された場合、その停止がいかなる性質であっても、
デベロッパー アカウントの停止や、関連する Google アカウントの調査および停止につながるおそれがあります。
アカウントが停止された場合は、支払いが中止され、Google が
過去の売上代金や関連する料金（チャージバックや取引手数料など）を回収することがあります。

ポリシーをご確認のうえ、今回の停止措置が誤りだと思われる場合は、
Google の ポリシー サポートチームまでお問い合わせください。担当者が 2 営業日以内にご連絡いたします。
```

# 登場人物
- サービス提供会社 (以降「SA」)
- GooglePlayへの登録会社 (以降「RB」)
- Androidアプリ開発会社 (以降「DC」)

# 状況整理
とあるサービスを「SA」社が運営している。
「SA」社は「RB」社に、そのサービスに関連したAndroidアプリの開発及び、Androidアプリの運用を委託。
「RB」社は「DC」社に開発を再委託。
Google Playへの登録は、「RB」社のアカウントにて登録。

# 申請、リジェクト、異議申し立て、アプリ公開まで
**登録申請(初回)を実施**
↓
**約4時間後... Google Play 審査チームよりリジェクトの連絡**
↓
**異議申し立てのため「SA」社に依頼し、許諾の元委託しておりなりすましでない旨をメールにて受領
メール本文をエビデンスとして「RB」社がGoogle Play 審査チームに異議申し立てを送信**
↓
**約24時間後... Google Play 審査チームより承認の旨の連絡**

```:From&nbsp;Google&nbsp;Play&nbsp;審査チーム
Google Play チームにお問い合わせいただきまして、誠にありがとうございます。
お客様の文書を検討し、アプリ XXXXXX を元に戻すこととなりましたのでお知らせいたします。

ただし、今後同じ理由でアプリが拒否または削除されないように、下記のポリシー内容をご検討ください。

なりすましポリシーでは次のように規定されております。

別のアプリや組織のブランド、タイトル、ロゴ、または名前を、ユーザーを誤解させるような方法で使用するアプリは認められません。関連のない別の組織の推奨やそれらとの関係をほのめかしてはなりません
アプリやストアの掲載情報で第三者の知的財産（ブランド名やロゴ、画像アセットなど）を使用する権限を有していることを証明する文書がある場合は、
アプリがなりすましや知的財産違反のために不承認とならないよう、送信する前に Google Play チームにご連絡ください。
今後、コンテンツに対する権利証明をお持ちの場合は、こちらのフォーム（https://support.google.com/googleplay/android-developer/answer/6320428）から 
Google Play チームに事前にご連絡いただけます。
このリンクは [ストアの掲載情報] ページの [詳細な説明] 入力ボックスの下にも表示されております。

なお、Play ストアにアプリが表示されるようにするには、Play Console にログインし、
[更新を送信] をクリックしてアプリを再送信していただく必要がございます。

再送信が無効になっている場合は、アプリのストア掲載情報ページに少し変更を加えてみてください。
たとえば、アプリの説明の最後にスペースを追加し、それを削除することで解決する場合がございます。

他にご不明な点などございましたらお問い合わせください。

今後とも Google Play をよろしくお願いいたします。
```
↓
**Google Play Consoleからアプリの再送信を実施**
↓
**約1時間後... アプリ公開(ただし、この時点で検索ではまだヒットしませんでした)**
↓
**約16時間後(翌朝)... 検索でもヒットすることを確認(※あくまでこちらで確認できた時間ですので、もっと早くヒットするようになっていた可能性は高いです。)**

# 考察
- Google Playに登録申請するAndroidアプリの関連サービス元と異なる組織が(のアカウントで)で申請する場合には、Google Play審査チームに事前連絡しておいたほうよい。 *(不要なリジェクトの防止)*
- Google Playへの登録申請でリジェクトされた場合でも、エビデンスを提示して異議申し立てをおこなえば、Google Play 審査チームは真摯に対応してくれる。
Square APIについて

SquareというとICカードリーダーを使ったカード決済サービスというイメージがあると思います。それは合っているのですが、最近ではPOSレジを軸にさらにビジネス領域を拡大しています。

それが[Square API](https://squareup.com/jp/developers)です。APIはApplication Programming Interfaceの略で、Squareが提供するデータをプログラミングを使って自社システムに取り込んだり、逆に新しいデータを作成してSquareに登録することができるようになります。プログラミング、とついている通り何らかのシステムと連携したり、自動化するのが主な目的になります。

Square APIは幾つかのAPIを提供しています。

## Eコマース API

Squareのセキュアな決済システムをWebサイトの決済に利用できます。

[Eコマース API](https://docs.connect.squareup.com/articles/paymentform-overview)

## POSレジ API

タブレットを使ったPOSアプリなどにSquareのレジ機能を組み込めるAPIになります。

[POSレジ API](https://docs.connect.squareup.com/articles/point-of-sale-api-overview)

## 商品 API

商品や価格の登録ができるAPIです。Squareで販売している商品の在庫管理システム連携などで利用できます。

[商品 API](https://docs.connect.squareup.com/api/connect/v1/#navsection-itemmanagement)

## レポート API

商品の売り上げ、払い戻しやギフトカードの利用状況、入金情報などを取得できます。これはWebhookを使うことでリアルタイムに通知されます。

[レポート API](https://docs.connect.squareup.com/api/connect/v1/#navsection-transactions)

## 従業員 API

従業員の役割、アクセス権限を管理できるAPIです。タイムカードAPIもあります。

[従業員 API](https://docs.connect.squareup.com/api/connect/v1/#navsection-business)

## その他のAPI

[利用プラン管理API](https://docs.connect.squareup.com/api/connect/v1/#navsection-subscriptionmanagement)、[バッチ処理](https://docs.connect.squareup.com/api/connect/v1/#post-batch)APIなど多数のAPIが存在します（一部は申し込みが必要です）。

[決済および Eコマース API | Square](https://squareup.com/jp/developers)
アセットタイプの仮想通貨のプラットフォームに何を選ぶべきか

#はじめに

>「メッセンジャーアプリ大手「Kik」が独自仮想通貨（Kin）をリリース。Facebookが通貨を発行する時代も近い？」
http://www.ikedahayato.com/20170528/70778323.html

この記事では、独自仮想通貨を自社サービス内で利用している例が紹介されていました。
例えば、このKikのように自社サービス内で独自仮想通貨を使う場合、プラットフォームとして何を選べば良いのか考えてみた覚書です。


#カレンシータイプとアセットタイプの違い

仮想通貨というのはカレンシータイプとアセットタイプの2種類存在しています。

##1.カレンシータイプ
ビットコインなど、発行者が存在しない。数学的なアルゴリズムにおいて、発行量が増加する仮想通貨。
イーサリアム、リップル、ライトコイン、NEMなど。

##2.アセットタイプ
発行者が存在し、発行量などをコントロールできる仮想通貨。
株式のような感じで運用される例もある。

#CryptoAsset Marketに見るプラットフォームとしての選択肢

CryptoAsset Marketを見ると、
Ethereum,Omni,Nxt,Counterparty,BitShares,Waves,Nxtなど様々なプラットフォーム上で
アセットタイプの通貨が流通しているようです。
https://coinmarketcap.com/assets/
(以前Qiita内で紹介した http://qiita.com/oggata/items/22137dc82d26c9b188fb の記事はCounterPartyというプラットフォームを利用していたことになります。)

現時点でのAssetsのTOPを見るとCryptoAsset Market上位のPlatformはEtheriumが多くを占めているように見えます。
<img width="1103" alt="スクリーンショット 2017-08-14 12.59.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/43766/31958146-6ff2-0340-822c-017b6e39dfbf.png">

#ERC20という選択肢
イーサリアム・トークンはERC20（EthereumのためのRFC）と呼ばれる技術仕様に沿って発行されることで、
このプロトコルに沿ったトークンであれば、仮想通過のウォレットを別途用意することなく、
ERC20フォーマットのウォレットを用意することで、
どのトークンも同様に送信、受信が可能になります。
イーサリアムを用いたアセットの作成方法などは下記ページなど色々なところで紹介されています。
https://www.ethereum.org/token

#流通しているマーケット例
作られた通貨がどのような使われ方をしているか知る方法として
tokenmarketを見る方法があります。
https://tokenmarket.net/blockchain/all-assets?sorting=best&archived=true
例)
TOREKABU	TV show meets Blockchain.

#おしまい
アプリの中で使う独自アセット用のプラットフォーム選定として調べたことの覚書として書いてみました。
(本来パフォーマンスなど色々な側面から選定する必要があるはずですが、この記事ではもっとも使われている通貨は何かという観点でのみの検討となってしまいました。。)
次はこの記事の中で検討したERC20を用いたアセットを作って、ERC20対応のウォレットの中でやりとりしてみたいと思います。
discord-bcdicebotをMacで動かす

# 動機

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">（雛´-`）.｡ｏＯ（<a href="https://t.co/cTbmCHkEtf">https://t.co/cTbmCHkEtf</a> 後でもうちょっと分かりやすい形で投げなおすけど。<br>Discord で BCDice (どどんとふのダイス) を振れるようにしてくれる何か） <a href="https://t.co/GHaZX6IHDV">https://t.co/GHaZX6IHDV</a></p>&mdash; しゅんしゅんひよこ (@Shunshun94) <a href="https://twitter.com/Shunshun94/status/880460411513982976">2017年6月29日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

Flashサポート終了に伴い、どどんとふが数年内に使えなくなることが判明。
代替サービスが出てくるまでにある程度いろんなツールを試しておきたい。

と思っていたらタイミング良く上記ツールが公開されました。
Discord用のダイスボットアプリです。
Discordは普段から使っているので気軽にダイスが振れるようになるのは嬉しい。

ダウンロードはここから
https://shunshun94.github.io/discord-bcdicebot/index.html

> (推奨) Windows
> 現時点では簡易起動スクリプト (後述の start.bat) は Windows 向けの物しか用意していません。 start.bat の中身を読み解いていただければ Mac でも Linux でも動作は可能です。


メイン機Macなので start.sh を作成しました。

Mac用のバッチファイル start.command に変えました。

# start.command
```bash:start.command
SCRIPT_DIR=$(cd $(dirname ${BASH_SOURCE:-$0}); pwd)
DISCORD_BOT_TOKEN=""  # Discord BOTユーザーのToken
BCDICE_API_URL=""  # BCDice-APIサーバーのURL

cd $SCRIPT_DIR
java -jar discord-bcdicebot.jar $DISCORD_BOT_TOKEN $BCDICE_API_URL
```
文字コードは LF で保存すること。
余りにも初歩的ですが筆者はここで30分くらい詰まりました。

あとは startd.command に実行可能属性を付ければダブルクリックで起動できます。
RailsアプリをHerokuにデプロイするときのメモ

# デプロイするための準備
## Gemfileの設定
以下を記述します。使うGemの場合分けを行うためです。

```rb:Gemfile
gem 'sqlite3', group: :development
gem 'pg', group: :production
gem 'rails_12factor', group: :production
```
## database.ymlの設定
データベースの設定を行います。

```yaml:config/database.yml
production:
 <<: *default
 adapter: postgresql
 encoding: unicode
 pool: 5
````
##SSLを使う場合は

```rb:config/environments/production.rb
 config.force_ssl = true
```
##エラーログにあったので
一度デプロイしようとしたらエラーにbundlerを入れろ的なことが英語で書いてあったので入れます。

```
$ gem install bundler
```
#Heroku側の操作
Herokuへのアカウント登録や、Heroku Toolbeltのインストールは軽く調べればすぐできるので省略します。Toolbeltとは、Herokuコマンドをターミナルで使えるツールのことです。

### Herokuにログイン
```
$ heroku login
```
ここでemailとパスワード入力を指示されるので入力します。
### Heroku側でアプリを作成する
```
$ heroku create 自分でつけるアプリの名前
```
### デプロイする。
```
$ git init
$ git add .
$ git commit -m "first commit"
$ git push heroku master
```
データベース作成の際には

```
$heroku run rake db:migrate
```
### デプロイできたか確認
```
heroku open
```

これでデプロイ完了です。
# メール機能を利用したい場合
```
$ heroku addons:create sendgrid:starter
$ heroku addons:add sendgrid:starter
```

````ruby:config/environments/production.rb
Rails.application.configure do
  ...
  # 追加
  config.action_mailer.raise_delivery_errors = true
  config.action_mailer.delivery_method = :smtp
  host = '<Herokuアプリ名>.herokuapp.com'
  config.action_mailer.default_url_options = { host: host }
  ActionMailer::Base.smtp_settings = {
    :address        => 'smtp.sendgrid.net',
    :port           => '587',
    :authentication => :plain,
    :user_name      => ENV['SENDGRID_USERNAME'],
    :password       => ENV['SENDGRID_PASSWORD'],
    :domain         => 'heroku.com',
    :enable_starttls_auto => true
  }
  ...
end
```
# おまけ
デプロイしてレイアウトが崩れてブチキレそうになった（実際キレた）時はこうしたらいけます。cssのロードがうまく行われない場合があるようです。

```
 $ rake assets:precompile
```