OmniAICreator/Qiita-1.07M huggingface dataset:
IMEを使う（序章）

# IMEとは
残念ながら、キーボードのキー数はUnicodeのコードポイント全てをカバーするほど多くはありません（桁が3つほど足りませんね）。
そのため様々な文字を入力する必要のある言語では、その入力の際にInput Method Editorと呼ばれるものを挟みます。
例えば日本語では入力した文字列のかなを入力し、それを適切に漢字などに変換するという実装になっています。
例えば、

- Microsoft IME
- Google日本語入力
- ATOK
- SKKなど

アプリケーションはキーボードからではなく、IMEのAPIを通して文字列を受け取ることで日本語や韓国語、中国語といった様々な言語を共通の仕組みで扱うことができます。
また、昨今では、このIMEのAPIを挟むことで、手書き文字入力や音声入力といった様々な入力方法に対応してきています。

# IME API
IMEのAPIを直接利用する必要がある状況というのは非常に限定されたものです。
基本的には、ディスプレイ上に表示する文字列をOS標準のテキスト入力フィールド以外で編集させようとする場合です。

IMEのAPIは以下に示すように、各プラットフォームがてんでバラバラに提供してくれます。

- Windows
    - Input Method Manager
    - https://msdn.microsoft.com/ja-jp/library/cc448105.aspx
- Windows
    - Text Services Framework
    - https://msdn.microsoft.com/library/ms629032.aspx
- Windows Universal Platform
    - Windows.UI.Text.Core
    - https://msdn.microsoft.com/library/windows.ui.text.core.aspx
- GTK+
    - GtkIMContext
    - https://developer.gnome.org/gtk3/stable/GtkIMContext.html
- macOS
    - NSTextInputClient
    - https://developer.apple.com/reference/appkit/nstextinputclient?language=objc
- iOS
    - UITextInput
    - https://developer.apple.com/reference/uikit/uitextinput
- Android
    - BaseInputConnection
    - https://developer.android.com/reference/android/view/inputmethod/BaseInputConnection.html

クロスプラットフォーム？
なにそれ誰かやってくれるの？
そういう世界です。

また、IMEの自由度は各OSが提供しているこれらのAPIの自由度に大きく依存します。
各プラットフォームの詳細な説明は別の機会に譲ることにして、この記事ではおおよそ全てに共通する部分について書きたいと思います。

## 未確定文字列の変更
一般的なデフォルトのIMEでは通常、下線のついた文字列として扱われるあれです。
この状態のテキストは基本的にはアプリケーション側で描画する必要があります。
（もちろん、OSが提供するテキスト入力欄はこの処理の一切を請け負ってくれます）

この「未確定文字列」の描画方法には、大きくふたつあります。

- 未確定文字列を挿入位置の現在のテキストの上から重ねて描画する
- 未確定文字列を挿入してあたかもテキストの一部であるかのように描画する

の2パターンです。
未確定文字列が変更されるのは新しい未確定文字が追加されたときや、スペースキーを押すなど変換候補を変更した場合です。
もちろんこれ以外のタイミングで変えることはIMEの自由ですし、APIの許す範囲で様々なことができます。

## 未確定文字列の確定 (commit)
ここで初めてIME上で編集されていた未確定文字列がテキストに挿入されます。
多くの日本語IMEではこれはエンターキーを押したときの挙動に相当します。
特にテキスト編集の挙動にこだわりがないのならば、この未確定文字列の確定をもって編集履歴に追加するのが良いでしょう。

## その他
上の「未確定文字列の変更」と「未確定文字列の確定」のふたつがIMEのAPIで一番重要な部分です。
ここをしっかりしておけば、少なくともユーザーが文字列を入力できないということはなくなります。
ただし、IMEのAPIにはそれ以外にもいくつかのAPIがあります。

### 編集中のテキストの位置・属性の取得
デスクトップアプリの場合、未確定文字列の近くにその未確定文字列の変換候補や、その未確定文字列に基づいた予測変換候補が表示されます。
もちろん、このように変換候補の位置が適切に表示されるためにはIME側から指定された範囲の文字列がどこに描画されているのかという情報を返す必要があります。

ここで縦書きにはつらいのが、指定された文字列が縦書きであるか横書き出るかという情報をIME側に伝えることが**不可能**なOSもあるということです。
つまりこのような環境では変換候補がきちんと縦書きにはならず、横書きで表示されます。

このような状況はAPIの問題だけではなく、そもそもGoogle日本語入力のようにIME側が縦書きに対応していないという状況も存在します。
（こういう場合、アプリケーション側の対応としては、返す文字列の位置を実際の位置とは異なるものにするというものになります。TATEditorではそういうオプションを用意してあります）

### 未確定文字列の装飾
未確定文字列の中には、現在変換対象になっている文節とそうではない文節があります。
これらを適切に表示するためには、未確定文字列のどこをどのように装飾するかという情報が必要です。
IMEにはこのための情報を（多寡はあるとしても）アプリケーション側に伝える手段があります。
これを描画するのはもちろんアプリケーション側の責任です。

### 編集中のテキストへのアクセス
日本語には同音の異義語がたくさんあり、適切な単語を上位に上げるためには前後の文字列に応じて挙動を変える必要があります。
このため、多くのIMEのAPIにはIME側からアプリケーションで編集中のテキストへのアクセスが可能になっています。

ここで面倒なのが、テキストへのアクセス方法はOSごとに異なるため、OSごとに異なる実装をする必要があります。
特に、文字列クラスを自身で実装している場合にはそのつなぎこみに苦労することになるでしょう。

# おわりに
今日は、IMEとアプリケーションの間に立つAPIについてざっくりとお話ししました。

APIにはOSごとに強い特徴があります。
というわけで明日からは各OSでのアプリケーション側のIME API実装について簡単に紹介していきます。
Windows 10 IoTCore でFaceTrackingにチャレンジ

Windows 10 IoT Core Advent Calendar 2016 9日目って　うーん１番目ですね・・・
すみません私事がいろいろありまして、遅くなって（もうすぐ12月10日）かつ内容が変わりました。

知っている人があまりいないようなのですが、WinRTにはFaceDetectorクラスとFaceTrackerクラスがあります。
これは以前ではOpenCVなどを使って、現在はMicrosoft Cognitive Servicesなどを利用することで実現できます。
しかし、OpenCVはC#では直接使うのは無理ですし、Microsoft Cognitive Servicesでは頻繁に利用すると課金の問題があります。
FaceDetector及びFaceTrackerはWinRTに既に組み込まれていますので、C#で利用することもでき、特に費用が発生することはありません。

今回はFaceTrackerを使ってビデオ画像内の人物をリアルタイムで追跡するサンプルを作ってみました。

参考にしたのは[こちら](https://github.com/Microsoft/Windows-universal-samples/tree/master/Samples/BasicFaceTracking)です。
MS謹製サンプルは非常に参考になるのですが、一つのサンプルで複数の機能を説明するのでプログラムが見にくいと思っています。

今回のプログラムはFaceTrackerおよび必要な機能だけ（エラー処理サボっています）にしているので何をしているのかわかりやすくなっているかと思います。

サンプルプログラムはGitHubの[ここ](https://github.com/linyixian/FaceTracker_sample)にアップしていますので是非ダウンロードして試してみてください。

プログラムはUWPですので、ソリューションプラットフォームを変更することでPC,Mobile,RPiで動作します。
もちろんWebカメラは必要です。あとRPiではビデオ性能が低いためどうしても映像が乱れてしまいます。

IoTCore向けの内容とはちょっと違う感じかもしれませんが、次はFaceTrackerを使って監視カメラを作ってみたいと思います。
Heroku Postgres でデータベースサイズ100G、最大レコード数1億行のデータを扱っている話

#はじめに
この記事は、Heroku アドベントカレンダー 9日目です。

##環境
Heroku Postgres Premium系
PostgreSQL Version 9.4.x
データベースサイズ　100G超
テーブル数　100以上

#こまってたこと
1. クエリが遅くなってきた(当然でしょｗ
2. バックアップに時間がかかる。（当たり前・・・

せっかく、Paas使っているのだからインフラで困りたくないじゃないですか！　ということで、Herokuさんのスケーラビリティでどうにかならないか調べました。

#やったこと
###バックアップ作業を早くした

一時的にForkすることにしました。参考URLはこちら
https://devcenter.heroku.com/articles/heroku-postgres-data-safety-and-continuous-protection#combining-physical-and-logical-backups

上記により、バックアップにかかっていた時間が2時間から20分程度に短縮しました。（厳密には、Forkのあと2時間かかるのですがバックアップ後の予定していた作業に早く取り掛かれるし、切り戻しもForkをPromotionするだけなのでメリットがとても大きいです。）

###クエリを早くした
プランアップしました。・・・　だけじゃ追いつけなくてまじめにチューニングしました。
普通に、pg_stat_statementsを使って、Explainして、です・・・　ただし、ここでもForkがすごく便利！

本番に、カジュアルにインデックスとか張れないですし、うっかり重いクエリをなげられないじゃないですか。
そんなときは、ランチ前にForkして午後チューニング、帰宅前にForkをDestroyの繰り返しです。

参考
http://pgsqldeepdive.blogspot.jp/2012/12/sqlpgstatstatements.html

#これからやりたいこと
データベースのスケールアウトしたいです。　自動でスケールアウトできるようにならないでしょうかね。
Heroku Postgres On Pg-pool2 とかこないでしょうか。待ってます！

でも、実はこれとか [Citus Data Cloud](https://www.citusdata.com/product)とかこれとかも[Citus - Add-ons - Heroku Elements](https://elements.heroku.com/addons/citus)超絶にwatchしております。

#まとめ
Heroku Postgres の　Forkめちゃくちゃ便利なので使ってない方はバリバリ利用しましょう。
Paasでも、データベースは限界あるので自分でなんとかがんばらないといけないこともあるよね。
IntellijでKamonを使う

# 前提
* Intellij IDEA Ultimate 2016.3
* sbt 0.13.13
* Kamon 0.6.3
* aspectjweaver 1.8.9

IntelliJでRun/Debug ConfigurationsのApplicationでプログラムを動かしているとする

※ sbtでkamonの設定をした場合、オプションに`fork in run := true`を指定しなければならないが、これを入れるとIntelliJのDebug実行時にブレークポイントで止まらなくなったため


# build.sbt

適当に使いたいkamonを追加する

```
libraryDependencies ++= {
  val kamonv= "0.6.3"

  Seq(
    ...
    //メトリクス用
    "org.aspectj" % "aspectjweaver" % "1.8.9",
    "io.kamon" %% "kamon-core" % kamonv,
    "io.kamon" %% "kamon-akka" % kamonv,
    "io.kamon" %% "kamon-datadog" % kamonv,
    ...
  )
}
```

# Run/Debug Configurations

ApplicationのVM optionsに以下のオプションでaspectjweaverのパスを指定する(パスは一例)

```
-javaagent:"C:\Users\xxx\.ivy2\cache\org.aspectj\aspectjweaver\jars\aspectjweaver-1.8.9.jar"
```

Run/Debugで実行する
公開鍵を作成しパスワードなしでログインする

# 公開鍵暗号方式
秘密鍵でパスワードを暗号化し、公開鍵で複合することによって認証できるしくみ
http://www.b-chan.jp/entry/essay/public-key-cryptosystem

# 使用方法
## 公開鍵・秘密鍵のペアを作成
コマンドにて、鍵のペアを作成する。`-f`は鍵名を指定するオプションである。
デフォルトの名前は`id_rsa(秘密鍵)`と`id_rsa.pub（公開鍵）`となる。

```bash
$ ssh-keygen -f mymskey
# パスフレーズが要求されるので任意の文字列を入力
```

## 鍵の正当性を確認する
作成した鍵が正しいのか確認する

```bash
$ ssh-keygen -y -f mymskey
# パスフレーズを入力する
# 合っていれば文字列が表示される
```

## 公開鍵をサーバに配置する
１番簡単に公開鍵を配置するコマンドとして、`ssh-copy-id`がある。
デフォルトで入っていることがないので、`Homebrew`をいれておくことをおすすめする。
http://brew.sh/index_ja.html

```bash
$ ssh-copy-id -i ~/.ssh/mymskey.pub -p ポート番号 ユーザ名@ホスト名（またはIPアドレス）
```

## サーバにログインする
sshコマンドを使ってサーバにログインする

```bash
$ ssh -i ~/.ssh/mymskey -p ポート番号 ユーザ名@ホスト名（またはIPアドレス）
```

## sshのConfigファイルを使って簡単にアクセスできるようにする
事前にsshのConfigファイルに書き込むことでsshコマンドの時多くのオプションを付けずにログインすることが可能

```bash:~/.ssh/config
Host mym
  HostName        ホスト名（またはIPアドレス）
  Port            ポート番号
  IdentityFile    ~/.ssh/mymskey
  User            ユーザ名
```

```bash
$ ssh mym
```
swagger codegenを使ったオレオレジェネレータの作り方

#はじめに
swaggerが話題になってしばらくたちます。
自分は仕事でも随分と便利に使っています。
swagger-editorでAPIの定義を書いていきながら実際にリクエストを飛ばして確認したり、他のエンジニアの人にAPI叩いて確認してもらうのに間違いも減ります。
postmanなどは直接swaggerファイルをインポートできるのでswaggar -> postman -> curl生成で簡易管理コマンドを作ったり。

しかし、いざ実装に使おうとすると自分の使っているwebフレームワーク向けのジェネレーターがなかったり、httpクライアントライブラリが違うものが使われていたりと自分の環境に使うには少し足りないなんてことがあると思います。

そんな人たち向けにコードジェネレーターの使い方の紹介です。

#swagger-codegen

swagger公式のjava製コードジェネレーターです。
Plaggerな実装になっていてクライアントとサーバーどちらも生成できます。

コードのテンプレートエンジンはmustacheです。

#mustache
いろんな言語に互換実装があってswagger-codegenはjmustacheをつかっています。
Mapにreposがあればreposのメンバのnameを出力して無ければ「No repos :(」を出す例

```mustache:
{{#repos}}{{name}}{{/repos}}
{{^repos}}No repos :({{/repos}}
```


#ジェネレーターテンプレートの生成
swagger-codegenはmavenのプロジェクトになっていてビルドにはmavenをインストールしておく必要があります。
まずはチェックアウトしてビルドします。

```bash:
git clone https://github.com/swagger-api/swagger-codegen
cd swagger-codegen
mvn
```

次にジェネレーターのテンプレートを生成します。

```bash:
java -jar modules/swagger-codegen-cli/target/swagger-codegen-cli.jar meta \
  -o output/myLibrary -n myClientCodegen -p com.my.company.codegen
```

output/myLibraryにテンプレートのmavenプロジェクトが出力されます。
DefaultCodegenクラスを継承した簡単な実装になっています。

ディレクトリ構成は以下

```text:
src
└── main
    ├── java
    │   └── com
    │       └── my
    │           └── company
    │               └── codegen
    │                   └── MyclientcodegenGenerator.java
    └── resources
        ├── META-INF
        │   └── services
        │       └── io.swagger.codegen.CodegenConfig
        └── myClientCodegen (テンプレートファイル)
            ├── api.mustache
            ├── model.mustache
            └── myFile.mustache
```
定形のものはテンプレートを書き換えれば出力を変えられます。
キャメルケースをスネークケースにしたいとかはjavaで書くことになります。

試しにビルドして実行します。
なぜかテンプレートファイルが生成されていない奴があるのでそれも追加します

```bash:
cd output/myLibrary
touch src/main/resources/myClientCodegen/myFile.mustache
mvn install
cd ../../
java -cp output/myLibrary/target/myClientCodegen-swagger-codegen-1.0.0.jar:modules/swagger-codegen-cli/target/swagger-codegen-cli.jar   io.swagger.codegen.SwaggerCodegen generate -l myClientCodegen  -i http://petstore.swagger.io/v2/swagger.json   -o myClient
```


これでmyClientディレクトリにライブラリが生成されます。
##それでは快適なswggerライフを！
Python でエポック


20161209

`date` コマンドは Gnu coreutils[^1]。
[^1]: BSD date なら `date -r 1481122800 "+%Y-%M-%d %T"`, `date -j -f "%Y-%m-%d %T" "2016-12-08 00:00:00" "+%s"`

## date => epoch

```
$ date "+%s" -d"2016-12-08 00:00:00"
1481122800
$ perl -MTime::Local -le 'print timelocal(0,0,0,8,12 -1,2016)'
1481122800
$ python -c 'import datetime ; print (datetime.datetime(2016,12,8,0,0,0).strftime("%s"))'
1481122800
```

`timelocal` の年の扱いについては語られつくされてるから、いいでしょ。

## epoch => date

```
$ date "+%Y-%m-%d %T" -d@1481122800
2016-12-08 00:00:00
$ perl -MPOSIX -le 'print strftime "%Y-%m-%d %T", localtime(1481122800)'
2016-12-08 00:00:00
$ python -c 'import datetime ; print (datetime.datetime.fromtimestamp(1481122800))'
2016-12-08 00:00:00
```

## datetime の strftime

について。

>Python はプラットフォームの C ライブラリの strftime() 関数を呼び出していて、プラットフォームごとにその実装が異なるのはよくあることなので、サポートされるフォーマット記号全体はプラットフォームごとに様々です。プラットフォームでサポートされているフォーマット記号全体を見るには、 strftime(3) のドキュメントを参照してください。

[引用元](http://docs.python.jp/2/library/datetime.html#strftime-and-strptime-behavior)


って事で、`%s` とか、 `%N` とか実装してない環境もある。

### memo

```
import time
from datetime import datetime as dt
print (int(time.mktime(dt(2016,12,8,0,0,0).timetuple())))
```
スクリプト言語を bash スクリプトに埋め込むためのメモ

20161209

`perl` での知識が流用出来たからメモっとく。

Python は 2系を例にしてる


## function として

```bash
#!/bin/bash
function py () {
    python -- <<'EOF' - "$@"
import sys
print sys.argv[1]
EOF

}

function ru () {
    ruby -- <<'EOF' - "$@"
    puts ARGV[0]
EOF
}

py python
ru ruby
```

## ついでに、パイプで渡して

```shell-session
$ echo python | python -c '
import sys

for i in sys.stdin:
    print i,
'
$ echo python | python -c 'print raw_input()'

```
pydoc と複数行コメントの書き方



20161209

Python 書き始めて正味 3 日の Perl 使い



## 普段のコメントについての結論

`'''` は、ヒアドキュメント代替以外としては、 `pydoc` のためだけに存在すると割り切って、それ以外のすべてのコメントは `#`　でごりごり書くことにしよ[^1]。

[^1]: `pydoc` のソース自体が、そう書かれてるし、、、。せめて、`perl` の `=begin, =end, =cut` みたく指定できればな、、、

## コード

- 2.6, 2.7, 3.4 で確認
- お作法的な意味での、関数のネストとか、if ブロック内の class とかの可否は、考慮せず


```python:foo.py
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
'''
about NAME

DESCRIPTION
'''

__author__  = 'bunzaemon'
__version__ = '1.0'
__date__    = '2016/12/09'

x = 42
print (x)
'IGNORED comment'

def foo ():
    # of course ignored
    'DEF: foo'
    'IGNORED comment'
    def bar ():
        'DEF: bar <= IGNORED'

class Clas:
    'CLASS: Clas'
    def __init__ (self):
        'CLASS DEF: __init__'

if 1:
    'IGNORED comment'
    y = 42
    print (y)
    def buz ():
        'DEF: buz'
        def bux ():
            'IGNORED comment'
    class Clas2:
        'CLASS: Clas2'

if 0:
    z = 42
    print (z)
    class Clas3:
        'IGNORED comment'

```

## 実行結果

- `u'...'` はダメ => 2.6 系ではコケる。[^2]
- IGNORED comment を当てにしてコメントを書くと混乱させそう。[^3]

[^2]: 2.6 系考えなくてよい人はつけたほうがいい。
[^3]: 将来の自分を

```
$ python --version
Python 2.6.6
$ python ./foo.py
42
42
$ pydoc ./foo.py
Help on module foo:

NAME
    foo - about NAME

FILE
    /PATH/TO/foo.py

DESCRIPTION
    DESCRIPTION

CLASSES
    Clas
    Clas2

    class Clas
     |  CLASS: Clas
     |
     |  Methods defined here:
     |
     |  __init__(self)
     |      CLASS DEF: __init__

    class Clas2
     |  CLASS: Clas2

FUNCTIONS
    buz()
        DEF: buz

    foo()
        DEF: foo

DATA
    __author__ = 'bunzaemon'
    __date__ = '2016/12/09'
    __version__ = '1.0'
    x = 42
    y = 42

VERSION
    1.0

DATE
    2016/12/09

AUTHOR
    bunzaemon

```
【ゲリラアドカレ】UE4ゲーム実装　進捗報告 4日目(バトル画面デザイン配置)

【非公式】某会社設立記念ゲリラ Advent Calendar 2016 9日目の記事です。

FlashゲームをUE4で再実装するゲリラアドカレです。

最重量を持つバトル画面の実装に入りました。
ひとまずデザインっぽいものが出来たので書きたいと思います。


・注意
許可を取ってないので通常業務の空いた時間を利用して作成するため、作成中のゲーム、及びアドカレは完成保証がなければ、ゲーム自体もリリースされる保証も皆無なので、あんまり期待しないでください。

#バトル画面を作る

間違いなく一番実装工数が重く、一番面白くしないといけない部分です。
オリジナルのバトル画面を見てみます。
![バトル画面.png](https://qiita-image-store.s3.amazonaws.com/0/104377/a4af3360-dffb-469b-ca18-eb87480ba60b.png)

カードバトルって感じですね。完全なオートバトルになっています。
バトルの部分は3Dモデルになっています。が、大人の事情でこのステージモデルは一切使えません！
なのでバトルは一から作ることにしました。

仕様もオートバトルからRPGでよくあるコマンド選択式にしたいと思います。
時間がなかったらオートにしてしまいますが。

#デザイン

![image](https://qiita-image-store.s3.amazonaws.com/0/104377/483a1cbf-34d7-96d5-d680-bcec1446bc3b.png)
こんな感じになりました。
フィールドデザインにあうバトル用背景画像素材がなかったため、共用で使えそうな感じにしました。

背景はSM_SｋｙSphereというデフォルトで用意されているものを使いました。
![image](https://qiita-image-store.s3.amazonaws.com/0/104377/91cbc23a-b0ab-ee07-6607-b6252208f704.png)

こんな感じでくるくる回しています。
![haikei.png](https://qiita-image-store.s3.amazonaws.com/0/104377/4e95c215-1050-aa9d-4e5d-b6b61bac2147.png)

UIも作っていきます。
まずはキャラのHPとMPの表示領域を作ります。
![image](https://qiita-image-store.s3.amazonaws.com/0/104377/a9e04a90-d679-6d54-f692-da01b9625ede.png)

この時は作ってて地味に楽しかったです。
主人公キャラだけ画像が大きいため、他の二人用に別のUIを作りました。
![image](https://qiita-image-store.s3.amazonaws.com/0/104377/219c492b-6d2f-8236-9068-31bf068e70d2.png)

最終的にこのような形に並べてます。
![image](https://qiita-image-store.s3.amazonaws.com/0/104377/1458bc1b-1369-2899-89bd-09cda5eb0490.png)

3番目のキャラアイコンを変えるようにブループリントで処理を書きます。
![image](https://qiita-image-store.s3.amazonaws.com/0/104377/5ecfcdfa-05c2-de64-0f74-55a6306575d7.png)

最後にレベルブループリントでUIを表示する処理を書いています。

#とりあえずデザイン完成

ひとまずこのようなデザインになりました。

![image](https://qiita-image-store.s3.amazonaws.com/0/104377/1fa6a295-a803-1f5e-9c46-2360652f816b.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/104377/bf31dc87-85d5-f96b-0740-48345c269fdd.png)

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">とりあえずバトル画面のデザインっぽいものが出来た　<a href="https://twitter.com/hashtag/UE4Study?src=hash">#UE4Study</a> <a href="https://t.co/FMbJtFbqNu">pic.twitter.com/FMbJtFbqNu</a></p>&mdash; 荻野雄季＠クルーズから出荷された豚 (@YuukiOgino) <a href="https://twitter.com/YuukiOgino/status/807205621325971456">2016年12月9日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

おお、自分で作っといてアレですが今後に期待が出来そうな感じです。
バトルは実装しないといけない部分が山盛りなので、本日はいったんここまでにしたいと思います。

うーん、やっぱり作業工数重いなぁ……。来週中に完成すればいいなぁ。
タグのフォロー解除が分かりづらい


さて、以下の画面で、何をどうするとタグのフォローを解除できるのでしょうか？

![スクリーンショット 2016-12-09 21.54.39.png](https://qiita-image-store.s3.amazonaws.com/0/74551/a3588be6-14d1-6ecc-da9f-af7c2f765f7c.png "スクリーンショット 2016-12-09 21.54.39.png")

実は、フォロー中のボタンにマウスオーバーをすると、解除になります。
マウスオーバーでボタンが変わることが直感的ではないですね・・・

![スクリーンショット 2016-12-09 22.03.03.png](https://qiita-image-store.s3.amazonaws.com/0/74551/8b1136ae-bcc6-b940-892f-6fc1a3491948.png "スクリーンショット 2016-12-09 22.03.03.png")
逃げるは恥だがやくみつる

ruby というか rails ネタを一つ。
(タイトルはあまり関係ありませんので、あしからず)

### 契約結婚は成立するのか？
AR で引っ張ってきたオブジェクトをいじらず、主テーブルの取得条件は変えずに
別の新しいオブジェクトを作りたかった話し。
(何でわざわざそんな事する必要があんの？とかは愚痴になりそうなのでさておき)

最初、以下のように IN 句 の id 列挙で引っ張っていたのだが、データが数万件に及ぶと
どうもパフォーマンスが出ない(返ってくるのに数十秒かかってたり)。
※ 実際は SQL ゴリゴリで書いてるせいで ids も取れなくて WTF! とかつぶやいてみたり

```rb:
sql_obj = Table.where({join含む複雑な条件}).join("xxx").select("*")
new_obj = Table.where("id IN (?)", sql_obj.ids)
```

調べてみるとどうも、サブクエリーでやる方法が早いらしい。
(そもそも最初から id で引っ張る必要あったの？ とかいうツッコミも気にせず続けます)

```rb:
new_obj = Table.where("id IN (?)", sql_obj)
```

ただ実はこのままだと、最初の sql_obj の select(*) に左右されるので、
実行エラーになっちゃいます。

サブクエリーで使用するためには id だけの select にしたいので、
except を使用して、select をリセットして上書きしちゃいます。

```rb:
wk_obj = sql_obj.except(:select).select(:id)
new_obj = Table.where("id IN (?)", wk_obj)
```

すると、アラ不思議！ サブクエリーで取得できちゃうんです奥様。
レスポンスも申し分ない仕上がりで、今なら金利手数料は当社が負担いたします！(なにが？)

...というわけで簡単ではございましたが、こんな感じでよろしいんでしょうか？
決して手抜きしているわけじゃありません。

ダセェ...オレなら何かもっといい方法知ってるぜ！って方の情報
お待ちしておりますので、どしどしご応募ください。

----
*追伸.*
ruby で数値配列の合計、さくっと出せないのかなぁ... ループとか書きたくねぇ...

ハイ！

```rb:
[1, 2, 3].inject(:+)
=> 6
```

こんなイディオムが普通に存在してる ruby って、相変わらず関心しちゃうぐらい
素敵な言語ですよね。

\# ツッコミでそもそも 2.4 移行は sum が使えるみたいです...
UE4＋TortoiseSVNでのIgnoreリスト 

この記事は[東ゲ部アベントカレンダー](http://www.adventar.org/calendars/1585)9日目の記事です。

UE4で用のIgnoreリストを作成してみました。

[Epic公式ドキュメント](https://docs.unrealengine.com/latest/JPN/Engine/Basics/SourceControl/SVN/index.html)にSVNへの登録方法は記載されていますが
ignore設定やった方が便利だよね！
という事で作成してみました。
[TortoiseSVN](https://tortoisesvn.net/) 用に作成しています。
(windows用のignoreが標準搭載な為、若干楽です)

一度ignore登録しておくとcommitの際に選んでチェックマークを外す手間が省けて便利です。
（仕事でＳＶＮ他バージョン管理ソフトを使用している方は必ず設定していると思います。）
下記画像のように登録していない余分なファイルがコミット対象として検索されなくなります。

![notcommit.jpg](https://qiita-image-store.s3.amazonaws.com/0/32364/ce4eff02-ba59-5f35-e45a-869cd3bae6c5.jpeg)
左上、コミットされてないファイルがいっぱい。
左下、リポジトリの中の状況
右、ルートのフォルダをコミットしようとしても何も出ない。

# ignore list
登録するignoreリストは下記になります。


```svn:ignore
Build
DerivedDataCache
Intermediate
Saved
.vs
*.VC.db
*.aps
*.ncb
*.opendb
*.opensdf
*.sdf
*.cachefile
*.VC.db
```
# 登録方法
１、[TortoiseSVN](https://tortoisesvn.net/)でのUE4用ignore登録はUE4プロジェクトのルートのフォルダに行います。
.uprojectが有るフォルダのpropertiesへ登録してください。
![properties.jpg](https://qiita-image-store.s3.amazonaws.com/0/32364/557b4c14-a84e-a714-c641-7811c9954a09.jpeg)

２、出てきた画面でNew→Othersを選択します。
![othersを選択.jpg](https://qiita-image-store.s3.amazonaws.com/0/32364/e34f47d1-5182-f736-f25d-09b9dcb2f484.jpeg)


３、出てきた画面内でsvn:ignore選択し、ignoreリストを登録します。
![paste2.jpg](https://qiita-image-store.s3.amazonaws.com/0/32364/987661dc-53af-7fda-6737-a937f41b4692.jpeg)



４、 これでcommitの際は自動でignoreされるようになります。

# 注意点
・この設定は初回のcommit前に行わなければなりません。
ignore設定前にcommitされたファイルについてはignoreが適用されないため、
うまく動作しません。
・TortoiseSVNに標準搭載されているignoreリストは下記になります。

```svn:ignore
*.o *.lo *.la *.al .libs *.so *.so.[0-9]* *.a *.pyc *.pyo __pycache__ *.rej *~ #*# .#* .*.swp .DS_Store [Tt]humbs.db
```
聞こえないシステムエンジニアが心がけていること

# これは何ですか？
[システムエンジニア Advent Calendar 2016](http://qiita.com/advent-calendar/2016/se)の10日目です。
9日目は@kencharosさんの[システム開発のアンチパターン](http://qiita.com/kencharos/items/26e0e927f0f1a5d02fd6)でした。
明日11日目は@tenten0213さんです。

本当はこの投稿は12/10、土曜日なのですが、週末は家族で過ごす時間が多くて書く時間が取れないので12/9、金曜日にアップしちゃいます。

# 背景
私はSIerで15年働いている、聴覚障害を持つプログラマ兼システムエンジニアです。
プログラミングしているほうが好きなのですが、どうしてもお客様とやり取りし、システムの仕様を話し合って決めないといけない場面が出てきます。
お客様とのやり取りは当然、手話は使えませんので口話、あるいは筆談が主となります。
これを念頭に、以下を読んでいただければと思います。

# 困ることと、その解決方法
## お客様が求めている内容が読み取れない
聴覚障害者といっても人によってレベルの違いがありますが、私は重度の聴覚障害です。
他人の声はほぼ、耳からは聞き取れないと言っていいレベルにあります。
ではどうやって内容を理解しようと努めているのか？それは相手の口の動きを読み取っています。
しかし、お客様全員がわかりやすい口の動きをするとは限りませんし、口の動きに集中するにも限界があります。

### 解決方法
打ち合わせには、基本、聞こえる同僚と同席し、その方にメモを取っていただく形となります。
そして、そのメモを見せてもらいながら理解を補っていくしかありません。
同席する同僚が、自分の耳についての理解があることも必要です。
もちろん、お客様との最初のご挨拶時に、自分が聞こえないことを明確にお伝えする必要があります。

## 私がお伝えしたいことが相手に伝わらない
正直、発音が苦手です。
初対面の方には、わかりにくい発音となることも多々あります。

### 解決方法
可視化できるツールをどんどん使いましょう。
打ち合わせの前に準備できる資料があれば、できる限り用意しましょう。
資料も、もちろん文章だけではなく、図もふんだんに取り入れる必要があります。
また、打ち合わせに行くときは必ず筆記用具を持参しましょう。
手書きする場面が必ず出てきます。
パソコンもあると便利ですが、パソコンでの筆談はお客様との関係次第でやりやすい場合とやりにくい場合があります。

# 打ち合わせ後の取り組み
## 議事録
同席していただいた同僚の方に、メモを見せてもらってテキスト形式で文字起こしをしましょう。
同僚によっては、自分で議事録を書いてくれるかもしれません。そのときは積極的にお願いしましょう。

## 自分なりにまとめる
議事録だけで100％まかなえるとは限りません。
システム設計をするには、プラスアルファの資料が必要になることがあります。
その資料を、図も交えて作成し、同僚に見せて認識合わせを行いましょう。
認識合わせの段階で、自分が誤解していたこと、あるいは同僚が誤解していたことを洗い出せます。

## お客様との認識合わせを行う
自分なりにまとめた資料を同僚に確認してもらい、認識合わせが取れたら必要に応じてお客様に見てもらいましょう。
場合によっては、お客様の要望をこのような形で実現出来る、という形の資料となるかもしれません。

# 仕様策定、仕様書の作成以降
この段階では、聞こえる聞こえないに関係なく、意図を明確にプログラマに伝えないといけないので資料は丁寧に作成しましょう。
文章だらけの仕様書ではなく、必要に応じてフローチャートなど、図解したものも入れましょう。

# まとめ
お客様とのやり取りに関しては、聞こえる同僚の力を借りないと絶対無理です。
しかしながら、それ以外の部分に関しては、わかりやすい資料作りを心掛けることで、システムエンジニアとしてやっていける、というのが私の持論です。
資料作成のツールは、おそらくExcel方眼紙が主となってしまうと思います。
それについては、周りのツールに対する理解度も絡むのでやむを得ないでしょう。
正直、ツールは何でもいいのです。
自分がお客様にお伝えしたい、システム設計内容をわかりやすく伝えられるかどうか、を第一に考えます。

## 聞こえないエンジニアから聞こえるエンジニアへのお願い
おそらく、大半の方はお仕事で聞こえない人と一緒に仕事する機会はほとんどないかと思います。
しかしながら、いつ、新入社員、あるいは中途採用で一緒になるかわかりません。
もし、一緒に仕事することになったときは、その方が出来ることは何か、苦手なことは何か、を話し合って把握していただきたいのです。

# 懺悔
というポエムに近い文章を、図解なしで書いてしまいました。
monacoの始め方

はじめまして。kitioと申します。
スマートフォン（Galaxy S6 SC-05G android6.0.1)上でPythonの学習をするためにGoogleアプリ(QPython3)をインストールしたのですが、tkinterがインストールされていないことが判明し、他の方法を探索していたところmonacoというMicrosoft Azureにmonaco(Visual Studio Online)があることを知りまして「https://www.slideshare.net 」にアクセスしましてスライドを見ましたところ「Azure Web Sitesを新規作成する」のスライドの画面とは異なった表示（コンピューティング→WEBSITEというメニューがございませんでした）となりましてmanacoを始めることができずにおります。そこでお教えいただきたいのですが、monacoを知る前にCloud9で試してみたのですがソースコードにはエラーはなく「no display name and no $DISPLAY environment variable 」という環境に問題がありそうなメッセージが表示されてしまいました。もしmanacoを始めることができたとしても同様な環境に問題が出る可能性がございますでしょうか。manacoが使えるのでしたら、是非manacoの始め方をご教授いただきたく存じます。
nginx に CORS用 の設定をする（複数ドメイン編）

nginx に CORS用 の設定をする（複数ドメイン編）
以下のドメインを許可

- \*.example.net
- \*.example.jp

```
server {
    listen      80;
    server_name hoge.example.com;

    location / {
        if ($http_origin ~* (https?://.*\.example\.(net|jp)?$)) {
            set $cors "1";
        }

        if ($cors = "1") {
            add_header Access-Control-Allow-Origin $http_origin always;
            add_header Access-Control-Allow-Headers 'Authorization,Content-Type,Accept,Origin,User-Agent,DNT,Cache-Control,X-Mx-ReqToken,Keep-Alive,X-Requested-With,If-Modified-Since';
            add_header Access-Control-Allow-Methods 'POST, GET, OPTIONS';
            add_header Access-Control-Allow-Headers 'Origin, Authorization, Accept';
            add_header Access-Control-Allow-Credentials true;
        }
    }
}
```

# 参考
Nginx に CORS 用の設定をする。
http://qiita.com/rysk92/items/e5cf2fab8531f8ea3683
emacs clojure環境

http://stable.melpa.org/#/getting-started
https://github.com/clojure-emacs/clojure-mode

# Enable installation of packages from MELPA
Enable installation of packages from MELPA by adding an entry to package-archives after (require 'package) and before the call to package-initialize in your init.el or .emacs file:

```
(require 'package) ;; You might already have this line
(add-to-list 'package-archives
             '("melpa" . "https://melpa.org/packages/"))
(when (< emacs-major-version 24)
  ;; For important compatibility libraries like cl-lib
  (add-to-list 'package-archives '("gnu" . "http://elpa.gnu.org/packages/")))
(package-initialize) ;; You might already have this line
```
# install clojure-mode using the following command:
```
M-x package-install [RET] clojure-mode [RET]
```
# install cider
```
M-x package-install [RET] cider [RET]
```
# Emacs Cheat Sheet(ショートカット)
http://www.rgrjr.com/emacs/emacs_cheat.html
Treasure WorkflowにおけるProject名およびWorkflow名の設定方法

Treasure DataのTreasure Workflowを触っていて、Project名およびWorkflow名の関係がよくわからなかったのでメモ。
ドキュメントを見つけることができず、実際の動作を追ってのメモなので、正しい情報をご存じの方はご指摘いただけると幸いです。

## Project名

以下のコマンドを実行した際のプロジェクト名。

```
> td wf push {プロジェクト名}
```

このとき、プロジェクト名は初出のものでもOK。

## Workflow名

"td wf push" コマンドを実行した際にカレントディレクトリに存在する"*.dig"ファイルの名称。

以上。
初老向け(?)Windows用ターミナルソフトウェア

初老のみなさんこんにちわ
初老丸アドベントカレンダー9日目です

初老を迎えたエンジニアの方々は、Windowsでのターミナルソフトは何をお使いでしょうか。
世のSIerなどではteratermのシェアが高いような気がします。

かくいう私は、長い間putty派だったのですが、最近新しい端末が使えるようになったことに伴い、頑迷に同じものをつかっていていいのだろうかと考え直し、RLoginというソフトウェアを発見したので紹介します。

putty派だった私にとってRLoginのよい点は

- exeファイル1個で稼動
- 接続先サーバに対し簡単にSCPできる
- タブが使え、また複数タブに対し同時にコマンドを送れる
- ppkとpem両方使える

などがあります。
(ほかにも機能満載なのですが、なにせ初老なので覚えきれない)

ちょっといいなとおもったのは、Fontの設定だけではなく一行あたりの文字数とかを細かく設定できるところです。
老眼なので…

<img width="429" alt="rlogin2.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/55932/4d42eb70-1662-631c-cf5f-5abbaf965340.png">

公式サイトは下記です。

http://nanno.dip.jp/softlib/man/rlogin/

大掃除とともに、ふだんつかっているツールの棚卸しもいいものです。
クリスマスも黒い画面とにらめっこの初老エンジニア諸氏に幸せあれ！
laravel5でrails consoleのようなREPLを利用できるようにする

下記コマンドで本記事の内容と同じものが実現できる。
(自分の昔の記事で記載していたことに今日気付いた…。)

``` shell
% php artisan tinker
```

# 目的

laravel開発中に、rails consoleのように、プロジェクトの設定が反映されたREPLで簡単な動作確認をしたくなった。
公式サイトにもググってもそれっぽい記述が見付からなかった。

ちなみに、laravelプロジェクトの直下で`% psysh`としてREPLを立ち上げてもlaravelプロジェクトの設定は反映されない。
これらの設定も反映されたREPLを立ち上げたい。

# 実現方法

psyshを実行するartisanコマンドを作成して対応した。

``` php:app/Console/Commands/PsyshConsole.php
<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;

class PsyshConsole extends Command
{
    protected $signature = 'psysh-console';
    protected $description = 'Run console by psysh';

    public function __construct()
    {
        parent::__construct();
    }

    public function handle()
    {
        eval(\Psy\sh());
    }
}
```

``` php:app/Console/Kernel.php
    protected $commands = [
           <省略>
        Commands\PsyshConsole::class,
           <省略>
    ];
```

# 実行方法

``` shell
% php artisan psysh-console
```

これで、psysh上で色々と動作確認できる。

# 感想

本当にこんな解決方法しかないのか?
複数人で開発してるプロジェクトだと、commandを追加するのが許されないケースもありそうだし、ローカルでいちいち自分で追加するのも微妙だな。

デフォルトで提供されてるんじゃないかと思うし、そうではなくとも簡単に実現できる方法があるはずだけど、それを発見するまではこの方法で凌ぐことにする。

冒頭でも書いたが、下記コマンドで実現可能。
やっぱり用意されてるわな。

``` shell
% php artisan tinker
```
jenkinsのPipelineを試してみる

# 目的

jenkinsの2系からjobの標準項目に採用された「pipeline」がとても便利に見えたのでテストしてみます。

# 成果物

下記のようにjobの画面でjob内で設定した「stage」で区切ったステップを見やすく出してくれます。

pluginだと、[Build Pipeline Plugin](https://wiki.jenkins-ci.org/display/JENKINS/Build+Pipeline+Plugin)に近いイメージですが、job内に標準装備しているものなのでviewがいたずらに増えなくて良いです。

![Screen Shot 2016-12-09 at 19.39.59.png](https://qiita-image-store.s3.amazonaws.com/0/25582/04ce99b8-936e-bab0-427e-6d321d8ccc38.png)

***

# 設定方法

簡単に設定方法を記していきます。

### job作成

+ 赤枠に記した用にjob作成時に「Pipeline」を選択し、作成する。

![j-01.png](https://qiita-image-store.s3.amazonaws.com/0/25582/ada12cd4-a825-4bb2-5f8d-0d882863bd67.png)

***

### 設定

+ 設定画面に「Pipeline」項目があるのでそこでサンプルコードを入力します。クリックして出来るサンプルだと、「stageが無いよ！」と怒られるので下記のようにstageを入れます。

```
node {
    stage '1'
        echo 'Hello World'
}
``` 

![Screen Shot 2016-12-09 at 19.24.17.png](https://qiita-image-store.s3.amazonaws.com/0/25582/03e3bc00-e997-6eae-393a-a31b8e446465.png)

***

### 実行

あとはいつものように「ビルド実行」を行うと下記のようにviewに現れます。

![Screen Shot 2016-12-09 at 19.25.04.png](https://qiita-image-store.s3.amazonaws.com/0/25582/e61cf499-cdd9-3b62-8417-ccbb648208f7.png)

***

2回目を実行すると前回の結果の上に乗り、常に最新の結果が見やすくなっているようです。

![Screen Shot 2016-12-09 at 19.25.28.png](https://qiita-image-store.s3.amazonaws.com/0/25582/f4eb16ea-f185-7544-4979-cd1d3977268b.png)

***

### 複数stageを入れ込む

```
node {
    stage '1'
        echo 'Good Morning'
    stage '2'
        echo 'Good Evening'
    stage '3'
        echo 'Good Afternoon'            
    stage '4'
        echo 'Goodbye'
}
```

![Screen Shot 2016-12-09 at 19.28.07.png](https://qiita-image-store.s3.amazonaws.com/0/25582/22757467-97a4-25a9-a0c9-78544b16c74d.png)

***

# エラーが出た場合

強制的にエラーを出して挙動を見てみます。

### 途中で「exit」を挟んだ場合

```
node {
    stage '1'
        echo 'Good Morning'
    stage '2'
        exit
    stage '3'
        echo 'Good Afternoon'            
    stage '4'
        echo 'Goodbye'  
    
}
```

![Screen Shot 2016-12-09 at 19.29.31.png](https://qiita-image-store.s3.amazonaws.com/0/25582/14feaa6f-b1dc-4d14-ffa0-20e5afc02d0f.png)

***

### イミフなコマンドを入れた場合

```
node {
    stage '1'
        echo 'Good Morning'
    stage '2'
        ehfhaslfhsdflasfjkal
    stage '3'
        echo 'Good Afternoon'            
    stage '4'
        echo 'Goodbye'  
}
```

![Screen Shot 2016-12-09 at 19.32.56.png](https://qiita-image-store.s3.amazonaws.com/0/25582/ad04e2bd-0abb-2479-ec1d-4034996808b5.png)


***

### 入ってないコマンドを入れた場合

```
node {
    stage '1'
        echo 'Good Morning'
    stage '2'
        docker ps
    stage '3'
        echo 'Good Afternoon'            
    stage '4'
        echo 'Goodbye'     
}
```

![Screen Shot 2016-12-09 at 19.34.37.png](https://qiita-image-store.s3.amazonaws.com/0/25582/c5269868-4a35-0ce6-b9f7-80ae954ecf05.png)

***

以上のようにエラーで止まるようです。

本当はエラーの種類をちゃんと場合分けしたいところですがテストなのでここまでにします。
m2eでプロジェクトインポートすると出るエラー "Plugin execution not covered by lifecycle configuration"

標準には存在しないm2eにとっては未知のgoalを持ったプラグインを定義しているとエラーとなる。
解決するには二通りの方法がある。

## 1. 手っ取り早い方法
MaveのErrors/Warnignsの設定でignoreにしてしまう。

![スクリーンショット 2016-12-09 19.56.03.png](https://qiita-image-store.s3.amazonaws.com/0/32316/3eea9d10-30a8-c6ba-45f3-a742118c73c2.png)

## 2. めんどくさいけど個別にエラー／正常を分ける方法
MavenのLifecycle Mappingsに割り当てられている定義ファイルに記述すれば良い。といってもデフォルトでは存在しないファイルでしかも開いているワークスペースのメタデータ内のパスになっている。わかりやすい場所に変えておいた方が良いと思う。

![スクリーンショット 2016-12-09 20.35.26.png](https://qiita-image-store.s3.amazonaws.com/0/32316/dc60d510-10c7-ef9a-fac8-3a9079c327df.png)

何にせよ [Open workspace lifecycle mappings metadata] で新規のXMLファイルが開くので、以下のように記述をする。

```xml:lifecycle-mapping-metadata.xml
<?xml version="1.0" encoding="UTF-8"?>
<lifecycleMappingMetadata>
	<pluginExecutions>
		<pluginExecution>
			<pluginExecutionFilter>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-dependency-plugin</artifactId>
				<goals>
					<goal>unpack-dependencies</goal>
				</goals>
				<versionRange>[0.0,)</versionRange>
			</pluginExecutionFilter>
			<action>
				<ignore />
			</action>
		</pluginExecution>
	</pluginExecutions>
</lifecycleMappingMetadata>
```
この例ではdependency-pluginのunpack-dependenciesを無視する定義としている。
ignore以外ではm2eに[プロジェクトをインクリメンタルビルドさせるexecution](https://wiki.eclipse.org/M2E_compatible_maven_plugins)も書けるらしいが使う良い例が浮かばなかったので割愛する。

マッピングファイルを更新したら、[Reload workspace lifecycle mappings metadata]で読み込みを実行しておく。

## おわったらやること
いずれの方法も対応してすぐには反映されない。エラーの出ているプロジェクトを選択してコンテキストメニューを出し、[Update Project...]を行う必要がある。
![スクリーンショット 2016-12-09 20.46.50.png](https://qiita-image-store.s3.amazonaws.com/0/32316/d45ded4a-557f-4ab9-b6d1-e445201e0548.png)


###### 参照
- [M2Eclipse | Execution Not Covered](https://www.eclipse.org/m2e/documentation/m2e-execution-not-covered.html)
GraphQLでN+1を考える

RailsでGraphQLをつかうためには次のgemを使うことになると思う。
https://github.com/rmosolgo/graphql-ruby

GraphQLを利用すると、容易にN+1が発生する。
そこで次のようなコードを考えた。

``` ruby
module ShopsResolver
  def self.call(obj, args, ctx)
    limit    = args[:limit]
    order    = args[:order]
    bookable = args[:bookable]

    shops = Shop.visible
    shops = shops.limit(limit)              if limit.present?
    shops = shops.order('RAND()')           if order == "TRENDING" # 仮実装
    shops = shops.order('RAND()')           if order == "RANKING"  # 仮実装
    shops = shops.where(bookable: bookable) if bookable.present?

    shops = shops.includes(:area)
    shops = shops.includes(:categories)
    shops = shops.includes(:shop_categories)
    shops = shops.includes(:category_subs)
    shops = shops.includes(:shop_category_subs)
    shops = shops.includes(:situations)

    shops
  end
end
```

むやみにincludesをつけまくると、余計なSQL発行が発生して良くない。
そこで、対策を検索した。

- [Q: Prevent N+1 queries · Issue #189 · rmosolgo/graphql-ruby](https://github.com/rmosolgo/graphql-ruby/issues/189)
- [Pre-loading/Eager loading nested associations · Issue #58 · rmosolgo/graphql-ruby](https://github.com/rmosolgo/graphql-ruby/issues/58)

とりあえずincludesを全部消して https://github.com/salsify/goldiloader を入れて対応した。
goldiloaderを使ってみたところ、GraphQLではうまく動いたが、一部システムが動かなくなった。

影響範囲が大きかったため https://github.com/Shopify/graphql-batch を試すことにした（続く）
MackerelにAPI経由でホストメトリックを投稿する

Mackerelにホストメトリックを投稿するにはAgentのプラグインを作成する以外にも、API経由で投稿することも可能です。
MackerelのAPIドキュメントはこちらです。

https://mackerel.io/ja/api-docs/entry/host-metrics

# サンプルコード

サンプルコードは以下のような感じです。

```rb
require 'net/https'
require 'json'

HOST_ID = File.read('/var/lib/mackerel-agent/id')
MACKEREL_API_KEY = '*****'

uri = URI.parse('https://mackerel.io/api/v0/tsdb')
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true

req = Net::HTTP::Post.new(uri.path)
req["X-Api-Key"] = MACKEREL_API_KEY
req["Content-Type"] = "application/json"
req.body = [
  { hostId: HOST_ID, name: "custom.test.a", time: Time.now.to_i, value: Random.rand(100.0) },
  { hostId: HOST_ID, name: "custom.test.b", time: Time.now.to_i, value: Random.rand(100.0) },
  { hostId: HOST_ID, name: "custom.test.c", time: Time.now.to_i, value: Random.rand(100.0) },
].to_json
res = http.request(req)
```

Hostsのカスタムメトリックのグラフにはこのような形で表示されます。

![スクリーンショット 2016-12-09 20.16.07.png](https://qiita-image-store.s3.amazonaws.com/0/7630/ea475a92-958a-e5a2-32b7-8b8f9664f926.png)


Mackerelが生成するホストIDは `/var/lib/mackerel-agent/id` から取得できます。[(FAQ)](https://mackerel.io/ja/docs/entry/faq)
リクエストヘッダの `X-Api-Key` にAPIキーを付与する必要があります。リクエストヘッダについては[mackerel-client-ruby](https://github.com/mackerelio/mackerel-client-ruby/blob/master/lib/mackerel/client.rb#L80-L83)が参考になります。
メトリクスの名前(name)ですが、試した時点では `custom.` から始めないとServicesのメトリクスに表示されなかったので注意が必要です。(Hostsのカスタムメトリックには表示された)
Ｐｅｐｐｅｒパートナープログラム実技試験で気をつけること

#はじめに
先日Pepperパートナープログラムの実技試験を受け無事合格できたので、終わってみての振り返りとしてよかった点、悪かった点のメモとか。
参考：[ロボアプリパートナーの認定プロセス](http://www.softbank.jp/robot/developer/dev-support/program/partner/flow/)
※タイトルの通り、実技試験のことだけを書きます。

#よかった点
- Choregrapheで開発時にボックスをDiagramボックスにまとめて見やすいプロジェクトにできた。  
→Diagramを利用しないと各ボックス間の結線がすごいことになる。
- Pepperの発音を自然にできた。  
例）「ひたい」を「ヒ田い」にしたり。  
→これはサンプルプログラムや、実技試験で配られるセリフ集がかなり参考になった。  
また、発音の確認はロボットウェブページで何度も確認した。

#悪かった点
- 何のQRコードかを説明せずに持ってきているかを確認してしまった。
- お仕事かんたん生成でフリーテンプレートを使ってしまっていた。  
→つかみトークが入ってないのでフリーテンプレートはNG.課題提出直前で気づいてあわてて直した。
- 胸部のディスプレイの反応が悪く、開発時にもたつく場面があった。  
→そもそものPepper側の問題なので我慢するしかない。

#感想
アプリの作成自体初めてだったけど、基本GUIでボックスをつなげてくだけで出来たので思ってたより難しくはなかった。
サンプルプログラムも配られるので参考に（ボックスがコピペ）できた。
社内で作業しているとPepperのものめずらしさに頻繁に声をかけられて手が止まるという問題があった。けど色々聞かれる分Pepperに詳しくもなった。
Windows 8.1 > ショートカットが壊れる現象

```txt:動作環境
Windows 8.1 pro (64bit)
```

### 症状

ショートカットを作っていたのに、以下のように怒られる現象に遭遇した。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/bb338922-16fc-de97-f326-210d2c3c4958.png)

### 再現例

以下が再現例。

例 (C:\WORK\AAAA／BBBB\myFolder_v1.0.1)

1. C:\WORK\AAAA／BBBB\myFolder_v1.0.1 のショートカットをデスクトップに作る
2. C:\WORK\AAAA／BBBB\myFolder_v1.0.1をC:\WORK\AAAA／BBBB\myFolderに変更
3. デスクトップのショートカットをを開く
   - 上記のようなエラーが出る

以下の両方で再現した。
- `"_v1.0.1"`を消す
- `"_v1.0.1"`を足す

また、`AAAA／BBBB`を`AAAA_BBBB`で試しても発生した (`C:\WORK\AAAA_BBBB\myFolder`)。


### 対処

ショートカットエラーが発生したら、ショートカットのプロパティからショートカットリンクを確認して、似たような名前のフォルダがないか確認すること。

どういう条件で壊れるのかはもう少し調べないとわからない。
LaravelでEloquentのappendsを動的に変える方法

jsonとかで使うのでappendsに入れないと取得できなくなるけど
毎回欲しい訳じゃ無い情報なので動的にappendsの中身を変更できないか調べてみた結果

ソースの中身を読んでみるとappend関数自体がある模様
GoogleやQiitaで検索してもすぐにでてこなかったので短いけど投稿しておきます。

```
$guests = Guest::get();
foreach ($guests as $guest) {
  // 追加したいappendsの内容
  $guest->append('reservation_count');
}
return $guests;
```

使い道としては下記みたいなクエリが発行される系で必要でした。
http://qiita.com/t_katsura/items/3a5b46bc070778975051
Gebのto()とvia()の話

# はじめに
これは、[Geb Advent Calendar 2016](http://qiita.com/advent-calendar/2016/geb)の9日目の記事です。
今日はライトにtoとviaの話します。

# to()とvia()
## 違い

どちらもページ遷移のオブジェクトですが、下記の違いがあります。

|メソッド|atが暗黙で呼ばれるか|
|---|---|
|to |呼ばれる|
|via| 呼ばれない|

というわけで要するに、toを利用した際は、暗黙でそのページが正しいページかのチェックが走ります。
なので、遷移先のページでリダイレクトなどがあるのであれば、atチェックが暗黙でかかるとテストが落ちてしまうので、viaを使う必要があります。

## 蛇足
ちなみに、toはPageObject内でも定義できるのですが、それは下記のように複数ページを指定することができます。

```groovy
static content = {
    loginButton(to: [LoginSuccessfulPage, LoginFailedPage]) { $("input.loginButton") }
}
```

こちら、最初のページオブジェクトのatチェックが失敗すると、次のページオブジェクトのatチェックが走るようになっています。
公式には何にも書いてないので想像なのですが、この仕様、toメソッドが内部でatチェックしてるおかげで次のページを見に行けてるので、ここにもtoとviaの違いって出てきてるんだなぁと感じます。

## 参考ドキュメント
http://www.gebish.org/manual/current/#at-checking

# まとめ
toとviaはatが違う！
Firebaseの"child_added"で初期呼出しをスキップする方法

# 課題

みなさん、Firebaseへのデータ登録をNode.jsサーバで監視したい場合どうしてますか？
たとえば、チャットを構築して特定ユーザ宛てのメッセージはアラートを飛ばしたい、みたいなユースケースなど。

普通にNode.jsサーバ側で Reference.on("child_added", function) リスナを張るだけだと、"child_added" の仕様上、起動してリスナを張った直後は登録済みデータの分だけイベントが呼出されてしまい、前述のユースケースの場合、過去のメッセージの数だけアラートが飛んでしまいます。

# 解決策
そこで、Node.jsサーバ起動時にFirabase上のタイムスタンプを取得して、そのタイムスタンプと対象データのタイムスタンプを比較することで、サーバ起動後に登録されたデータだけイベントを処理させます。

ポイントはFirebase上のタイムスタンプは一度タイムスタンプを登録しないと取得できないところです。

### コードイメージ

``` js:sample
var firebase = require("firebase");
firebase.initializeApp({
  // TODO:初期化設定
});

var db = firebase.database();

/** 起動タイムスタンプ */
var STARTUP_TIMESTAMP = null;

var initialize = function() {
  // まずタイムスタンプと登録して
  db.ref("temp").set({
    "timestamp": firebase.database.ServerValue.TIMESTAMP
  });

  // 登録したタイムスタンプを取得。
  db.ref("temp").once("value", function(tSnapshot) {
    STARTUP_TIMESTAMP = tSnapshot.val().timestamp;

    // リスナ登録
    db.ref('messages').on("child_added", function(mSnapshot) {
      var messageData = mSnapshot.val();
    
      // タイムスタンプ比較
      if (messageData.timestamp > STARTUP_TIMESTAMP) {
        // TODO:イベント処理
      }
    });
  });
}

initialize();

```

このテクニックはチャットSDK[「Bメッセ」](https://www.bmesse.com/?from=qiita_20161208)で使っています。
もし他によい方法をご存知でしたらコメントください！
Go言語をMacにインストールしてみる（goenv + direnv + glide）

まだごりごりGo言語をさわれてないので、この構成でいいのかどうか、できるかどうかはこれから。
メモ的に。

## 1.goenvとgoのインストール

### ・goenvのインストール
goenvをgitで取得

```bash
git clone https://github.com/dataich/goenv.git ~/.goenv
```

.bash_profileに追加

```.bash_profile
export PATH="$HOME/.goenv/bin:$PATH"
eval "$(goenv init -)"
```

### ・goのインストール

```bash
goenv install 1.7
goenv global 1.7
```

※普通にパッケージでもインストールできるし、MacならHomebrewでインストールできる。Homebrewでのやり方は下記

```bash
brew install go --with-cc-all
```

--with-cc-allはクロスコンパイル環境を整えるため。

### ・GOPATHの設定
goでは作業ディレクトリの位置を表すGOPATHの設定が必要。
各プロジェクトに対するGOPATHの設定は後述するdirenvで設定する。
とりあえず共通のGOPATHを.bash_profileに設定しておく（任意のディレクトリ）

```.bash_profile
export GOPATH=$HOME/go
export PATH=$PATH:$GOPATH/bin
```

## 2.direnvのインストールと設定
GOPATHをプロジェクト（フォルダ）ごとに設定するために入れる
direnvは
・ディレクトリごとに環境設定が設定できる。（サブディレクトリも対象）
・ディレクトリへ入ると自動的に設定され、抜けると解除される。
という代物

### ・direnvのインストール

```bash
brew install direnv
echo 'eval "$(direnv hook bash)"' >> ~/.bash_profile
```

### ・direnvの設定
プロジェクトフォルダを作成して、設定ファイルを作成

```bash
cd ~/workspace/go_sample
direnv edit .
```

上記を実行すると、viが立ち上がるので下記を記述

```.envrc
export GOBIN=$(pwd)/bin
export GOPATH=$(pwd):$GOPATH
export PATH=$PATH:$GOBIN
// export GO15VENDOREXPERIMENT=1 ※1.6はbuildでコケることがあるらしいので、おまじない的に。 1.5はつける。 1.7はいらないと思う。
// GO15VENDOREXPERIMENTの設定は外部ライブラリをvendorフォルダにまとめることができる設定
```

```
direnv: loading .envrc
direnv: export +GOBIN ~GOPATH ~PATH
```
とでれば成功

もし、

```
direnv: error .envrc is blocked. Run `direnv allow` to approve its content.
```
とかいうエラーがでたら

```
direnv allow
```
を実行

## 3.glideのインストール
vendorフォルダ内に外部ライブラリをインストールでき、それをYAMLで管理する。
package.jsonのようなもの。

### ・glideのインストール

```command
brew install glide
```

### ・glideの設定

下記フォルダ構成にする

```folder
- $GOPATH/src/app
  |
  |-- main.go
  |
  |-- vendor
```

appフォルダへ移動し、下記でglide.yamlファイルを作る

```bash
glide create
```

あとは必要な外部ライブラリを下記コマンドでダウンロード

```bash
glide get github.com/xxx/xxx
```

通常はgo getだが、glide getでライブラリのインストールを行う
glide.yamlがある状態で記載されている外部ライブラリを全て取得したい場合は、「glide up」でする
***

以上！Go言語がんばってさわっていきたい。
LaravelのEloquentでリレーション先の集計

顧客一覧画面にて今までの予約件数がどれぐらいあるか知りたかった時
リレーションの中で集計して取得することができたので書いておきます。

テーブルの関係は下記の通りです
Guest：顧客でReservationを複数持っている
Reservation：予約情報

まずはリレーションでカウントするコード

```php:Guest.php
public function reservationCountRelation()
{
  return $this->hasOne(Reservation::class)->select('guest_id', \DB::raw('COUNT(*) as count'))->groupBy('guest_id');
}
```

select部分でCountを書いてgroupByすることで集計をしたレコードを返しています。
このままでも一応集計情報自体は取得できますがアクセスしにくいので

アクセス用の関数も追加

```php:Guest.php
public function getReservationCountAttribute()
{
  // リレーション先が無い場合0を返却
  return $this->reservationCountRelation ? $this->reservationCountRelation->count : 0;
}
```

あとはQuery発行する部分で忘れずwith指定してやればOK

{{$guest->reservation_count}}
な感じで表示できるはず
確率論 ~導入~

# はじめに
機械学習を扱っていく上で、その根底を支える数学的知見の重要性を感じ、
記事を書こうと思いました。
内容は、大学の情報系学科で教わるぐらいの難易度となると思われます。
あらかじめ、ご了承下さい。

## なぜ数学を学ぶ必要があるのか
東京大学の松岡聡さんも、同様のことを仰られておりましたが、
数学を学習することは、その技術の根底を担う基礎的な部分を理解することに繋がります。
原理の理解が徹底されていると、"量的な" 感覚が自然と身に付き、
さらに、その基礎学習から得られた知見から帰結の結論も考えれば、
「将来は大体こうなるんだろうな。」と未来の予測ができます。
すなわち、ライバル達よりも "5~10" 年は先を見通せるわけです。

日進月歩の如く技術革新を続けるこのIT業界において、
如何にして、"取り残されず" さらには "常に先を行く" 為に、
数学的知見の重要性をご理解いただければ、幸いです。

# 導入
まずは、基本事項についての定義からです。

## 標本空間

### 定義
ある事象に対して、起こり得る全ての結果の集合を標本空間という。

## 確率分布

### 定義
確率空間 $(\;Ω,\;P\;)$ において、標本空間 $Ω$ から実数空間 $R=(-∞,\;∞)$ への関数 $X$ を確率変数といい、
$X$ のとり得る値とその確率の組を $X$ の確率分布という。

## 確率関数

### 定義
確率変数 $X$ に対して、実数空間 $R$ 上の関数

```math
p(x)=\;P({X\!=\!x}),\quad-∞<x<∞
```
を $X$ の確率関数という。
カスタムデータバインディングの作り方（ビューから値を取得する方向）

データバインディングのうち、ビューから値を取得する方向のバインディングを独自定義する方法です。

例えば、EditTextの場合はこんな感じで入力されたテキストを取得できます（これは最初から定義済みです）

```xml
<!-- EditTextの入力がmodel.textにセットされる -->
<EditText
  android:width="wrap_content"
  android:height="wrap_content"
  android:text="@={model.text}"/>
```

はじめから定義されていない属性についても、自分でバインディングを書くことで上記のようにして値を取得できます。以下、リストビューの`int getCheckedItemPosition()`に対応するバインディングを作成していきます。

[完成形のサンプル](https://github.com/kobakei/InverseBindingSample)はこちらにあります。

## Step 1: 取得用の属性を定義する

- 適当にカスタムバインディングを定義するクラスを作成する
- クラスに、以下のようなアノテーションを追加
    - typeは、対象となるビューのクラス
    - attributeは、取得する際のXMLの属性
    - methodは、取得に用いるメソッド。省略すると、`get<attribute>`が呼ばれる。
        - この場合は、`getCheckedItemPosition`が呼ばれる
    - eventは、値の取得タイミング。省略すると、`<attribute>AttrChanged`というイベント時に更新される
        - 詳しくはStep 2で後述

```java
@InverseBindingMethods({
        @InverseBindingMethod(
                type = AbsListView.class,
                attribute = "checkedItemPosition"
        )
})
public class BindingAdapterUtil {
    ...
}
```

## Step 2: 取得イベントのリスナーを定義する

- データバインディングで値が取得されるタイミングは、Step 1のeventのタイミング
- このevent名で、InverseBindingListenerをセットするバインディングを用意する

```java
public class BindingAdapterUtil {

    // STEP 2:
    // <属性名>AttrChanged という属性で、InverseBindingListenerをセットするバインディングを定義する。
    // InverseBindingListener#onChange()が呼ばれるときに、取得したい値が更新される。
    @BindingAdapter(value = "checkedItemPositionAttrChanged")
    public static void setAttrChanged(AbsListView absListView, final InverseBindingListener attrChanged) {
        if (attrChanged == null) {
            absListView.setOnItemClickListener(null);
        } else {
            absListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                    attrChanged.onChange();
                }
            });
        }
    }
}
```

## Step 3: 値をビューにセットするバインディングを定義する

- これがないとコンパイルが通らないので。

```java
public class BindingAdapterUtil {

    ...

    // STEP 3:
    // 同じ属性名で、値をビューに反映する方向のバインディングも定義しないとコンパイルが通らないので定義する。
    @BindingAdapter(value = "checkedItemPosition")
    public static void setCheckedItemPosition(AbsListView absListView, int position) {
        absListView.setItemChecked(position, true);
    }
}
```

## 使い方

あとはXMLに書くだけ。

```xml
    <ListView
        android:id="@+id/listView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@id/textView"
        android:choiceMode="singleChoice"
        app:checkedItemPosition="@={model.checkedPosition}"/>
```
新技術を導入する時に大切にしていること

エムティーアイのAdvent calenderの9日目です。

こんにちは。

直前まで何書くか考えてなかったのですが、
みんながきっと技術的な内容書いてくれるから考え方的なこと書いてみようと思います。

## 導入のポイント

私が技術を導入する上で重視しているポイントは下記です。

* <font color="red">**楽しそうか**</font>
* <font color="red">**然るべきところで楽できそうか**</font>
* <font color="red">**未来がありそうか**</font>

とだいたいこの3つです。

もちろん費用対効果の観点は考えますが、
費用対効果は本当の判断軸としては気休めだと私は思っています。

いままで、費用通りにすべて事が運んだことはありますか？
大抵の場合は、やっぱりDBのスペックが、、、とかこの場合が考慮できていなくてアレを追加しないと、、、など色んな考慮漏れが出てくると思うので、
費用対効果はあくまで前提条件みたいな認識です。

## なぜこの3つか

この3つを素直に打ち出せずに導入できず、結果誰も幸せになれないパターンをよく見ているからです。
何かの壁に打ち当たったとき、幸せになれるのはこの3つの基準で選んでいる場合です。

楽しそうか
→**楽しければ壁をこえるのも楽ですね**

然るべきところで楽できそうか
→**壁がたくさんあると辛いですが、どこかで楽できてる感覚があるだけでだいぶ違います**

未来がありそうか
→**壁をこえたあとの話になりますが、その後の達成感やまわりからの熱望など、いろいろ報われるポイントです**

## 最後に

以上、自分がAWS無知識の状態でSeverlessアーキテクチャで初めて触るnode.jsを使ってサイトをリリースするということを経験した時に感じた感想でした〜。
実際のエピソードまで書けなくて申し訳ないですが、皆さん参考になるところがあればと思います。

あくまで個人の意見なので叩かないで下さいねw
Mavenでpom.xmlを使用せずにNexusにdeploy

Mavenのpackagingが[war]なpom.xmlがあって、warとjarを一緒に出力しててdeploy-pluginでNexusにjarもdeployしようとしたけどうまくいかなかったのでシェルを作った。

1. deployしたjarは、消してから登録するので同一バージョンで何度でもdeployできる
2. mvn package を実行してtargetディレクトリ配下にjarファイルが存在することが前提

#手順
以下のシェルスクリプトでpom.xmlから情報を取得してNexusにjarをdeployする。

```deploy-jar.sh
#!/bin/bash
nexusUser=Nexusのadmin
nexusPass=Nexusのadminパスワード
myGroupId=`sed -e "s/xmlns/ignore/" pom.xml | xmllint --xpath "/project/groupId/text()" -`
myArtifactId=`sed -e "s/xmlns/ignore/" pom.xml | xmllint --xpath "/project/artifactId/text()" -`
myVersion=`sed -e "s/xmlns/ignore/" pom.xml | xmllint --xpath "/project/version/text()" -`
myReleaseUrl=`sed -e "s/xmlns/ignore/" pom.xml | xmllint --xpath "/project/distributionManagement/repository/url/text()" -`

curl --request DELETE --write "%{http_code} %{url_effective}\\n" \
     --user "${nexusUser}:${nexusPass}" --output /dev/null --silent \
     ${myReleaseUrl}${myGroupId//./\/}/${myArtifactId}/${myVersion}

mvn deploy:deploy-file \
    -DgroupId=${myGroupId} -DartifactId=${myArtifactId} -Dversion=${myVersion} \
    -Dpackaging=jar -Dfile=./target/${myArtifactId}.jar -DgeneratePom=true \
    -DrepositoryId=releases -Durl=${myReleaseUrl}
```

##説明１
```myGroupId=`sed -e "s/xmlns/ignore/" pom.xml | xmllint --xpath "/project/groupId/text()" -` ```
xmllintコマンドをpom.xmlに直接使うと[XPath set is empty]になるのでネームスペースを無視するように置換する

##説明２
``` curl --request DELETE --write "%{http_code} %{url_effective}\\n" ```
curlを使って、NexusのリポジトリURLに対してDELETEコマンドを送信する
%{http_code} curlを実行したリターンコードを出力
%{url_effective} curlを実行したURLを出力

##説明３
```mvn deploy:deploy-file ```
pom.xmlから取得した各種パラメータでmvn deployコマンドを実行


※pom.xmlを使用せずってタイトルだけど、pom.xmlがあってpackageが実行してあることが前提 (´・ω・`)
Androidのセキュア設計・セキュアコーディングの基礎知識

JSSECが公開している『Androidアプリのセキュア設計・セキュアコーディングガイド』の2016-09-01版を共有用にまとめているもののうち、「3. セキュア設計・セキュアコーディングの基礎知識」のものとなります。
詳細やサンプルコードについては原著の方を参考ください

## Androidアプリのセキュリティ
 Androidは守る対象として、情報資産と機能資産があります。これらは、許可された人しか使えなければいけません
情報とは、
1. 個人の情報(アカウント情報等、スマフォ固有の情報、スマフォ内部にある情報、アプリが管理する情報)
2. 他者の情報(電話帳等)
3. アプリ自身の情報(アプリメーカーの情報、dexファイル、アプリが保持しているユーザの情報など)
を示します

機能とは、OSがアプリに提供する機能です。また、アプリ間連携機能も含まれます。これにより、適切な対策をしていないと、マルウェア等に利用され、課金が生じたりしてしまいます

脅威とは、情報の勝手な変更や参照、機能の勝手な利用のことです
1. 第三者による脅威として、サーバとアプリのネットワークの中間に立ち、アプリ、サーバに攻撃を行う等があります(通信内容の、盗聴、改竄、なりすまし)
2. マルウェアによる脅威として、端末に入った、マルウェアが、アプリ間連携や脆弱性を利用して、アプリの資産にアクセスする等があります
3. ファイルによる脅威として、攻撃ファイルをダウンロードしたユーザーが、ファイル処理アプリで開いたときに、アプリの脆弱性を利用して攻撃する等があります
4. 悪意あるユーザの脅威として、adbを利用して、アプリを解析、アプリの試算にアクセスされる等があります
5. スマフォの近くの第三者による攻撃として、覗き見、Bluetooth、端末の窃盗、破壊等があります

## 入力データの安全性
* 攻撃者が直接的、間接的にそのデータの値を操作可能な場合は、全て入力データの安全性確認が必要となります
* 例えば、Activityが受け取ったIntentは攻撃者が細工したデータの可能性があります。そのため、以下の2点に気を付ける必要があります。
 1. 受け取ったデータが想定の形式かつ、想定の範囲内であるかの確認
 2. 想定している形式、値のあらゆるデータを受け取っても、想定外の動きをしない保証

## 参考

『Android アプリのセキュア設計・セキュアコーディングガイド』【2016年9月1日版】
https://www.jssec.org/dl/android_securecoding.pdf
C言GO(TO)

私はC言語を書く際に結構GOTO文を使う人なのですが、
最初に働いた会社では、先輩にGOTOはあまり使うもんじゃないと諭されたものです。
※新人教育の一環としては正しい

そんな私も熟練のC言語プログラマ(2016年度に書いたCプログラムはごく少数です(ㅍ_ㅍ)
どういうケースでGOTOを使っているのか経験を踏まえて列挙してみました。

## ネストループからの脱出
フラグ使ってbreakを繰り返すよりスマートに書けます

```C:
for (;;) {
  for (;;) {
    if (a==b) {
      goto out;
    }
  }
}

out:
```

## エラー処理やリソース解放を末尾にまとめる
リソース確保/解放相当の処理を必ず行わなければならない場合なんかによくやる処理です。
Golangのdefer文やモダンなC++のdestoctorがほしいです。

```C:
  if (xxx) {
    goto err1;
  }
  if (xxx) {
    goto err2;
  }

err2:
  //リソース解放2
err1:
  //リソース解放1
  
  return ret;
}
```


## 長い事前処理のskip
事前処理を関数化すると見栄えが良くないし、
ネストが浅くフラットに関数全体を見渡しやすくする場合なんかに使います。

```C:
  if () {
    goto skip;
  }
  ...
  ...
  ...
skip:
  //メイン処理開始
  ...
```


## パラメータリセットしてretry
リトライ回数が決まっており、かつ初期化パラメータなんかが変動する場合を
簡潔に書きたい場合に使います。

```C:
  r=0
retry:
  a=0;
  for (;;) {
    if (;;) {
      r++;
      goto retry;
    }
  }
```


## フラグの代わりにif()thenにjump
このパターンは正直な話、1-2度くらいしか書いたことがないのですが、
linux kernelをgotoでgrepすると結構頻出するなーってことで紹介です。
基本的にはネストが深くない、フラットな構造を維持しつつ謎なフラグを減らしたいのだと考えます。

```C:
  ...
  if (first) goto then;
  ...
  ...
  if (first) {
then:
    ...
    ...
  } else {
  }

```

# まとめ

ダジャレでタイトルとか変える人は高頻度でおっさんです、私もおっさんな歳で感慨深い。

アンチGOTOに負けず、必要な個所でガンガンGOTOを使っていきましょう！