OmniAICreator/Qiita-1.07M huggingface dataset:
Djangoでログイン失敗時のエラーメッセージを表示する

Django:1.10

Djangoで用意されている認証システムでログイン失敗時のエラーメッセージを表示させたい。

どうやら、Formのadd_errorを使えばよさそう。

The Forms API | Django documentation | Django
https://docs.djangoproject.com/en/1.10/ref/forms/api/#django.forms.Form.add_error

formを用意して、

```python:forms.py
from django import forms

class LoginForm(forms.Form):
    username = forms.CharField(label='LOGIN_ID', max_length=30)
    password = forms.CharField(
            label='PASSWORD', max_length=128, widget=forms.PasswordInput())
```

viewでformにadd_errorして、

```python:views.py
from django.contrib.auth import authenticate, login
from django.shortcuts import get_object_or_404, redirect, render

from .forms import LoginForm

def user_login(request):
    form = LoginForm()
    return render(request, 'polls/login.html', {'form': form})

def authentication(request):
    form = LoginForm(request.POST)
    if form.is_valid():
        username = form.cleaned_data['username']
        password = form.cleaned_data['password']
        user = authenticate(username=username, password=password)
        if user is not None:
            if user.is_active:
                login(request, user)
                return redirect('polls:index')
    form.add_error(None, 'LOGIN_ID、またはPASSWORDが違います。')
    return render(request, 'polls/login.html', {'form': form})
```

templateでエラーメッセージを表示するようにするだけ。
(add_errorの第1引数をNONEにしたので、non_field_errorsから取得する)

```html:login.html
・・・
{% for error in form.non_field_errors %}
    <p>{{ error }}</p>
{% endfor %}
・・・
```

こんな感じに表示されました。

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/147868/934d2771-268c-fe9a-c613-20604f53c72c.png)
RestfulApiの設計書

#RestfulApi纏め

##はじめに
RestfulApiの纏めです。

##1.URL
叩いたapiの実行後に叩くapiの完全なリンクをlocation headerで指定しよう。
例：`Location: http://hoge.com/api/v1/hoge`

##2.レスポンス
エンティティボディはこんな感じにしよう！(異論は認める)


* 正常例 ステータスコード：200、201など適当に

```json
{
    "data"    : "サンプルデータ",
    "message" : "Success make a article"
}
```

* バリデーションに引っかかった ステータスコード：422

```json
{
    "message"  : "Validation failed",
    "errors"   : {
        "identify" : [
            "The identify is invalid format",
            "The identify is too long",
        ],
        "password" : [
            "The password is required",
        ],
    }
}
```

* バリデーション通ったけど失敗 ステータスコード：400

```json
{
    "message"  : "Failure login",
}
```

##3.柔軟性
httpパラメータで取得するパラメーターの制限、絞り込み、並び順を指定可能にしよう。カンマ区切りで複数条件可能！
* `fields`    : 取得したいパラメーター
* `getNumber` : ページ数
* `pageSize`  : 1ページの件数
* `sort`      : 並び替え
* `q`         : 文字列の部分検索

例：`/companies/:companyId?fields=data&q=サンプル&sort=id,name`

注釈：頻繁に使用する条件はそのurlを用意しておくと、気落ちよく使えるね！

##4.フォーマット
* リクエスト、レスポンスの形式はJSONを使おう
* フィールド名はキャメルケースを使おう
* urlは-区切り
例：`/restful-api/`

##5.HTTPメソッドを適切に
できるだけこのCRUD表現で対応したい

* `GET`    : 取得
* `POST`   : 新規作成
* `PUT`    : 更新
* `DELETE` : 削除

##主要なstatus code
* 200 : OK                    : 成功
* 201 : Created               : 新規作成成功
* 204 : No Content            : 成功したが、結果何も返すものがない場合
* 400 : Bad Request           : 失敗
* 401 : Unauthorized          : 認証が必要
* 402 : Payment Required      : 支払いが必要
* 403 : Forbidden             : アクセス権がない場合や、ホストがアクセス禁止処分を受けた場合
* 404 : Not Found             : 指定したURLに対してリソースが存在しなかった場合
* 422 : Unprocessable Entity  : バリデーションに引っかかるエンティティを送った場合
* 500 : Internal Server Error :サーバ内で予期しないエラーが発生した場合や、正常稼働時には発生してはいけない状態を検知した場合

##認証
* 認可はOAuth2を使用する
    * OAuth2は認可プロトコルであり、認証プロトコルではない
    * OAuth2は脆弱性があるので、セキュリティ対策をとること

##最後に
利用者が叩きやすいApi作成を目指そう！

##参考記事
* <a href="http://qiita.com/yu1ro/items/f366ded721f03ae91d96">REST API設計者のための有名APIのURL例</a>
* <a href="http://qiita.com/shrkw/items/c6123ca25981e44a3d82">RESTfulなWeb APIを設計するときに考えること</a>
* <a href="http://qiita.com/mserizawa/items/b833e407d89abd21ee72">翻訳: WebAPI 設計のベストプラクティス</a>
* <a href="http://qiita.com/takeokunnn/items/c119e576a6c04d37e098">WebAPIの設計から実装まで〜実装編〜
</a>
* <a href="http://qiita.com/suin/items/f7ac4de914e9f3f35884">WebAPIでエラーをどう表現すべき？15のサービスを調査してみた
</a>
* <a href="http://ledyba.org/2012/07/08221601.php">HTTP1.1のLocationヘッダは、絶対URLでないとRFC違反</a>
moduleをsubmoduleとして取り込むときの作業メモ

# submodule
`git submodule add hoge`

# add settings.gradle
`include ':app', ':hoge'`

# add hoge/build.gradle 
```
    releaseCompile project(path: ':hoge', configuration: 'release')
    debugCompile project(path: ':hoge', configuration: 'debug')
```
選択（結合：外部結合)


結びつかなくても全て表示。

外部結合を使用すると指定した列のデータがテーブルのどちらか一方にしかないレコードも抽出することができます。 外部結合には左外部結合、右外部結合、完全外部結合があります。

### 左外部結合　（LEFT OUTER JOIN）

左外部結合は結合する列のデータを基準として、左側の表の内容をすべて抽出し、右側の表の内容は左側の表の内容と一致するもののみ抽出する結合です。 左外部結合を使用するにはLEFT OUTERE JOINを使用します。

```
SELECT (取得するカラム) FROM テーブル1名 LEFT OUTER JOIN テーブル名2 ON (結合条件)
```

取得するデータは2つのテーブルのカラムが混合したものとなりますので、取得するカラムの指定には「カラム名」ではなくどのテーブルのカラムなのかを表すために「テーブル名.カラム名」の形で指定

外部結合は内部結合の場合と似ているのですが、LEFT OUTER JOIN句を使用する場合は結合の対象となっているカラムの値が一致しているデータに加えて、カラムの値がFROMの後に書かれたテーブルにしかなかった場合でもデータとして取得します。



先ほどのサンプルを元にどのようにテーブルが外部結合(LEFT OUTER JOIN句)されるのかについて確認していきます。まずSELECT文の最初に記述されたテーブルの1つ目のデータに対して結合が行われます。

```
id name      deptid
--------------------
1  Yamada    1
```

結合条件は「staff.deptid = dept.id」です。このデータの「deptid」の値は「1」ですので、deptテーブルのデータの中で「id」カラムの値が「1」のものがあるかどうかを調べます。今回は1つ見つかりました。

```
id name
------------
1  Sales
```

見つかった場合にはこの2つのテーブルのデータを結合して1つのデータとして返します。

```sql
id name      deptid   id name
-------------------------------
1  Yamada    1        1  Sales
```

もし結合条件に一致しないデータがあった場合、外部結合(LEFT OUTER JOIN句)の場合にはFROMの後に書かれたテーブルのデータだけを取得します。下記のデータの場合、「deptid」カラムの値が「5」ですが、deptテーブルのデータの中には「id」カラムの値が「5」のものがありませんのでstaffテーブルの値だけを取得します。


```sql
id name      deptid   id name
-----------------------------------
1  Yamada    1        1  Sales
2  Suzuki    3        3  Publicity
3  Kuroda    2        2  Technical
4  Ishida    1        1  Sales
5  Takahashi 5
6  Eguchi    2        2  Technical
7  Adachi    1        1  Sales```
```

内部結合の場合と違い外部結合の場合は結合条件に一致しないデータでも取得することに注意して下さい。


### ON 句

ON SI.item_id = I.item_id;
ON 句では、結合するテーブルを結びつける列（結合キー）を指定します。この場合は商品 ID
（item_id）が結合キーです。いわば ON は、結合条件専用の WHERE のような役割だといえま
す。WHERE 句と同じように、複数の結合キーを指定するために、AND、OR を使うことも出来
ます。
ON 句は、内部結合を行なう場合は記述が必須です。かつ、書く場所は FROM と WHERE の
間でなくてはなりません。
numpyのインデックス検索


### 最小,最大のインデックス
- `np.argmin(max)`を使う

```python
import numpy as np
a = np.array([1,2,3,4,4])
np.argmin(a)

>>> 0
```
```python
np.argmax(a)

>>> 3
```
重複すると小さい方が採用される．

### 条件付き検索
- `np.where(条件文)`を使う

```python
import numpy as np
a = np.array([1,2,3,4,4])
print np.where(a>2)

>>>(array([2, 3, 4]),)
```

### 参考

http://oppython.hatenablog.com/entry/2016/05/31/205746
"。、¥"を".,\"にしたい


### 1. 置換を使う
`ctrl+F`で選択して全て置換

### 2. デフォルトで設定しておく
1. `システム環境設定`->キーボード->入力ソース もしくは 右上の"あ"マークをポチ->環境設定
1. ページ下部に設定するところがある

![スクリーンショット 2016-11-07 11.34.06.png](https://qiita-image-store.s3.amazonaws.com/0/146563/91fbaaed-9688-7044-7af8-d68c0a4dff25.png "スクリーンショット 2016-11-07 11.34.06.png")
リストの結合

pythonでリストをくっつけたい時に使う，`append`と`extend`の違い

## append
```
a = [1,2]
a.append(3)
>>> [1,2,3]

a = [1,2]
a.append([1,2])
>>> [1,2,[1,2]]
```

## extend

```
a = [1,2]
a.extend(3)
>>> [1,2,3]

a = [1,2]
a.extend([1,2])
>>> [1,2,1,2]
```
Swift のアプリケーションで利用しているファイルを確認

`/Library/Application Support`配下のアプリで利用しているファイルについて確認したの時のメモ

# 参考記事

+ [iOS でファイル保存、読み込み](http://xyk.hatenablog.com/entry/2015/10/26/171630)
+ [NSFileManager](https://developer.apple.com/reference/foundation/nsfilemanager)

# やってみる

```hoge.swift
// confirm directory
let path = NSHomeDirectory() + "/Library/Application Support"
print("path = " + path)
let fm = NSFileManager.defaultManager()
print("!!!!!")
print(fm.subpathsAtPath(path))
print("!!!!!")
```

ログはこんな感じに出力

```
path = /var/mobile/Containers/Data/Application/3CC85FE5-D7DD-4339-A001-A6046BC2AD2A/Library/Application Support

Optional(["xxxxx", "xxxxx/d40796a4cd4247f5b0a469b9952da59f", "xxxxx/d40796a4cd4247f5b0a469b9952da59f/events", "xxxxx/d40796a4cd4247f5b0a469b9952da59f/events/eventsFile", "xxxxx/d40796a4cd4247f5b0a469b9952da59f/preferences"])
```

iExploer では見れなかったファイルも確認できた。
TreasureDataからGoogleSpreadsheetに書き込む

# はじめに
TreasureDataで実行したクエリの結果をGoogleSpreadsheetに吐き出そうとした時にちょいハマりしたのでメモ
起こったことありのままを書くぜ
新コンソールでの手順を記します

# 手順
## Googleアカウントを紐付けない状態でSpreadsheetに出力するjobを実行する
* Googleアカウント紐付けないでSpreadsheetに出力しようとしたらGoogleアカウント紐付けてねっぽい感じで怒られます(よく読んだら違ったけれど)

紐付けます

## Googleアカウントを紐付ける
1. 左メニューから**Team**を選択
2. **自分のアカウント**を選択
3. 右上に**[CONVERT TO GOOGLE SSO]**というボタンがあるのでクリック
4. メールアドレスログインしていた人はこれからGoogle認証ログインしか使えなくなるよ！っていうアラートがでるのでそのまま**[CONTINUE]**  
![スクリーンショット 2016-11-07 19.22.08.png](https://qiita-image-store.s3.amazonaws.com/0/77113/553625d5-8b3a-4b61-e87b-4537d359270a.png)
5. よく見るGoogleアカウントの認証画面に遷移するので紐付けたいGoogleアカウントを選択する
6. メールがくるのでメール内のリンクをクリック
7. おわり＼(^o^)／

### ここでハマった点
* 紐付けようとしたら*please chose a different email*って怒られる
TDに登録しているメールアドレスを紐付けたいGoogleアカウトのgmailアドレスにしておかないとメールアドレス違うから別のアドレスで出直してきてよね怒られます  
![スクリーンショット 2016-11-07 19.24.33.png](https://qiita-image-store.s3.amazonaws.com/0/77113/4de834aa-99e9-c1a9-b29b-e5bf47bcf5a3.png)  
自分のアカウントページの**Email+Password**タブから紐付けたいGoogleアカウントのgmailアドレスに変更します

## Spreadsheetに出力したいデータのクエリを書く
左メニューの**Queries**の**（+)**からいつも通り書く

## Output resultsから出力先を選択する
クエリを書くテキストボックスの左上に**:white_medium_square:Output results**と書いてあるところがあるからクリック

## coneectionを登録
以下を設定して**[SAVE AND CONTINUE]**をクリック

```
Type: Google Spreadsheet
Name: 適当なわかりやすい名前
Email: 自分のアカウントに紐付いているGmailアドレス
```
![スクリーンショット 2016-11-07 19.38.40.png](https://qiita-image-store.s3.amazonaws.com/0/77113/f99d003b-45c9-f2a7-1028-1dc61d68d20e.png)

## Configurationを設定する
```
Spreadsheet Name: 出力先のSpreadsheetの名前
Key: Spreadsheetのhashだけど、記入しなくてもOK 
Worksheet Namr: 出力先のSheetの名前
Mode： replace(default) or append
```
### Modeについて
* replace
 * 出力する時に新規でSheetを作成して既存のものとswapするっぽいです
* append
 * 既存のSheetに追記する（詳しい挙動みてないです、すみません）

ちなみにどっちのModeでもSpreadsheetやsheetが存在しなかったら勝手に作ってくれます

## 実行！

**[RUN]**ボタンをクリック

### ここでハマった点

* どう頑張っても↓エラーが出て出力できない

```
 You must connect your Treasure Data user account to the Google Spreadsheet Account's email address indicated in the Result Export definition.
```

**結果から書くと**

* 左メニューの**Connections**から[Google Spreadsheet]を選びます
![スクリーンショット 2016-11-07 20.29.33.png](https://qiita-image-store.s3.amazonaws.com/0/77113/038a201b-ff13-d2c0-5d96-4611554ee5ee.png)

メールアドレスを入力するテキストボックスの下の文字を読みます

```
You must authorize this account via your profile page in the "old" Console
```

・・・

```
the "old" Console
```

* おっしゃられいる通り旧コンソールから認証します
 * 旧コンソールは左メニューの1番下のアイコンをクリックすると「Return to old version」って出てくるのでそこから戻せます。

旧コンソールのアカウトページに「Google Accounts」というところがあるので
**[Add Account]**

追加したらヘッダーに**【TRY NEW VERSION】**ってあるので戻ります
(あくまで新コンソールでやる)

もう一度クエリ書くあたりから同じ作業を行います

・・・

できました・・ふう(疲)

# まとめ
## やること

* TDアカウントにGoogleアカウントを紐付ける
* 旧コンソールからもGoogleアカウントを紐付ける（もしかしたらこちらだけやればいいかも）
* コネクションを登録する
 * Connectionsから登録する必要はなかったです
 * QueriesのOutput resultsから新しいコネクションを追加できます
* Output resultの設定を行う
* RUN!!

おしまい

# おわりに
新コンソール使ってみてよ！ってぐいぐい推してるわりに旧コンソールでしかできないことがあるって・・・
あと、旧コンソールでGoogleアカウト追加してってもっと頻繁に教えて欲しい
実はエラーで

```
Please see if you need more details. https://docs.treasuredata.com/articles/result-into-google-spreadsheet
```
っていうのも一緒にでて、このURLにアクセスしたらたしかに旧コンソールだった。
だったけどさ、Document更新してないだけのあれだと思ったんだよ私は、ごめんなさい。
DatadogでURL監視をやってみる

2019年に Synthetics が実装されたので、お金があるひとはそっちつかったほうがいいです。
Synthetics最高です。
以下は歴史的なメモとして残しておきますが、2020年現在、ゴミだといえます。

# 前置き
- Datadogではいろいろなサービス用のintegrationが用意されているが、残念ながら外からHTTP/HTTPSで接続してのモニタリングができるようなintegrationはない。
- 外部のサーバからHTTP/HTTPSでの接続を行い、その結果をDatadogのカスタムメトリクスに投げ込み、その状態をモニタリングすればよい、という天の声を得た。
- 幸い、監視したいとおもったシステムにはWebサーバが稼働しているリージョンとは別リージョンに管理用のサーバが存在していた。

# やったこと
- ターゲットURLへの接続ステータスをカスタムメトリクスに投げ込むスクリプトをEC2(Linux)上に設置
- 上記スクリプトをcronで定期実行する設定
- DDのdashboardで、カスタムメトリクスを表示(Query Valueを使用)

# 作成したスクリプト

```urlcheck.sh
#!/bin/sh

API_KEY=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX     # DDのIntegrations->APIsでAPIキー調べてね
URLLISTFILE=/path/to/urllist.txt             # ターゲットURLを並べただけのリストファイル

# main

LINE=1
IFS=$'\n'

for URL in $( cat $URLLISTFILE );
do
	echo $URL | egrep -v '^#' > /dev/null
	if [ $? -eq 0 ];then
		RES=`curl -k -s $URL -o /dev/null -w "%{http_code}\n"`
		if [ $RES -eq "200" ]; then
			is_code_200=1
		else
			is_code_200=0
		fi

		# DDへ投げ込み
		currenttime=$(date +%s)
		curl -s -X POST -H "Content-type: application/json" \
		-d "{ \"series\" :
	        	 [{\"metric\":\"urlcheck.httpstatus$LINE\",
			\"points\":[[$currenttime, $is_code_200]],
			\"type\":\"gauge\",
			\"host\":\"oreno-ec2\",
			\"tags\":[\"hostname:oreno-ec2\", \"region:us-east-1\"]}
			]
		}" \
		"https://app.datadoghq.com/api/v1/series?api_key=$API_KEY"
		LINE=$(( LINE + 1 ))
	fi
done
```

```urllist.txtサンプル
# ターゲットURL一覧
http://hittodayoo.com/
https://anone.hitomine.com/monitoring.php 
```

# Datadog上での使い方

- リストファイルの上から順番に urlcheck.httpstatus1,2,3…というメトリクスにステータス200の場合1,それ以外の場合0が入るので、それを使用
- 筆者の場合はQuery Valueを使い、全メトリクスのステータスを足し算した値が対象サイト数よりも少ない場合、どれかのURLで障害が発生しているという意味でバックグラウンドを赤にするというウィジェットを表示させてみた
Cognos Business Intelligence 10.2.1 インストール手順書

Cognos BI 10.2.1@Windowsでのセットアップ手順書をslideshareに投稿しました。


http://www.slideshare.net/ShinsukeYamamoto/cognos1021-install

元ファイルはExcelのファイルです。
もし元ファイルが欲しいという方がいれば、メールでご連絡頂ければ送付します。
ReactでjQuery無しのfancybox/lightbox的なライブラリを試してみて

#はじめに

ReactでjQueryで書かれたコードを書き直す半写経をしているのですが、プラグイン使っているものはどうしようかと考え、たまたま目についた[fancybox](http://fancybox.net/)的なライブラリはないか探してみました。

#条件
とりあえず

- jQuery無しで
- 画像をクリックしたらモーダルで拡大画像が表示
- 商用含めて無料で利用できるもの
- gitHubである程度(100位は）starが付いているもの

で探してみました。

ちなみにReact-Bootstrapでは
[カルーセル](http://react-bootstrap.github.io/components.html#carousels)はあったのですが、fancybox/lightbox的なものはなかったようです。
（モーダルに少し手を加えれば済みそうな気もしますが）

material-uiもざっと見て見ましたが、そのままな機能はありませんでした。

# 検索結果

```react fancybox``` や ```react lightbox``` などのキーワードでgoogle or github検索して

今回は[React Images](https://github.com/jossmac/react-images)を試すことにしました。

こちらのライブラリは検索時点でStarが**347**で見つけたライブラリの中では１番多かったのですが

本家に比べると（3000~4000）だいぶ少なく、やや不安。

次点は[React Image Lightbox](https://github.com/fritz-c/react-image-lightbox)が**49**

どちらもここ数ヶ月いないにcommitもあるようなのでStarが多い方にしました。

ライセンスも

```
License

React Images is free to use for personal and commercial projects under the MIT license.

Attribution is not required, but greatly appreciated. It does not have to be user-facing and can remain within the code.
```
問題なさそう。

# インストール

```npm install react-images --save```

その後はサンプルを見ながら

```import Lightbox from 'react-images';```

してコードを書くだけです。

ただしライブラリトップページやREADME.mdのexampleでなく、リポジトリのexamplesのコードを見た方がわかりやすいと思います。

# サンプルコード
[こちら](https://github.com/jossmac/react-images/tree/master/examples)　（React Images Githubリポジトリ）

# アニメーション・演出

実装終わってから気がついたのですが、フェードイン/アウトなどのアニメーション効果のオプションがありませんでした。どうもthemaという引数にCSSを渡して自分で実装するようです。ちょっと手間がかかりそうです。

```
const theme = {
	// container
	container: { background: 'rgba(255, 255, 255, 0.9)' },

	// arrows
	arrow: {
		backgroundColor: 'rgba(255, 255, 255, 0.8)',
		fill: '#222',
		opacity: 0.6,
		transition: 'opacity 200ms',

		':hover': {
			opacity: 1,
		},
	},
```

# 最後に

作業しながら思ったことは、当たり前なのですがReactに移行しはじめてからこういうことに気がついても遅いということで、「まえ別のサイトでやってた、画像がクリックすると拡大表示されて、左右の矢印で切り替えられるやつ」と頼まれて「Reactなので実装に時間がかかります」とか言えないですし、作って見たら微妙に使い勝手が違ったなんてこともありそうです。そもそも１から検索し直すのも数が数なら面倒です。

実際にjQueryから移行した方はプラグインで実現していた機能はどうされているのでしょうね？
はじめ、jQueryの主要プラグインとReact向けライブラリの比較をしているようなサイトがあると甘い期待をしていたのですが。
検索してみると思っていたほどには情報がないので、１から書いているのでしょうか。
Reactを選んだ時点でプラグインの組み合わせだけでやりくりするようなことを卒業すべきなのかもしれませんが
Component化という観点からだと極力１から書かずに済ませようとするのも正しいようにも思えます。

この機能はmaterial-ui、この機能はreact-bootstrap、こっちはjQueryのプラグインとか違和感しかない。

とかくjQueryをディスりがちですが、想像以上にjQueryにはお世話になっていたのだなという月並みな感想文になってしまいました。
file_get_contentsがうまくいかない


## やろうとしたこと
`file_get_content()`を用いた某サービスのWebAPIからのデータ取得。


```イメージ.php
$query = 'q=' . $searchText;
$opts = [
    'http' => [
        'method' => 'GET',
        'header' => 'user-agent:MyUserAgent'
    ]
];

$url = 'https://example.com/search?' . $query;
$result = file_get_contents($url, false, stream_context_create($opts));
```

```
... failed to open stream http request failed! HTTP/1.0 500 ...
```

## すでにやっていること
* カスタムUser-Agentを設定する（API側がUser-Agentで有効なクライアントかどうかを判定しているので。）

## 試したこと
* アクセス先がhttpsなので、`;extension=php_openssl.dll`のコメントアウトを外す：x
* `allow_url_fopen=On`にする：x

## それで結局どうしたか
結局今回の僕のケースでは、 `http_build_query` を利用することで解消しました。

今回僕が利用したAPIの場合、同じベースエンドポイントの他のAPIだとうまくデータが取得できたので、
接続方法に問題があると予想していたのですが、どうやらリクエストの仕方そのものに問題があったようです。

```php
$query = http_build_query(['q' => $search_text]);
$opts = [
    'http' => [
        'method' => 'GET',
        'header' => 'user-agent:MyUserAgent'
    ]
];

$url = 'https://example.com/search?' . $query;
$result = file_get_contents($url, false, stream_context_create($opts));
```

結局 `http_build_query` を利用するとなんで動くかはわからなかったな、そういえば... :thinking: 
@rryu さんのおっしゃる通り、$search_textの中身がいい感じにURLエンコードされたんだろうか...

## 2018.11.26 追記
ちなみに、http_build_queryには色々罠があるので、注意して使うべきです。
http_build_queryのセパレータの設定（`arg_separator.output`）がデフォルトだと `&amp;`となっているケースがあり、それに気づかずリクエストして、400しか返ってこない。。。みたいなことがあります。（僕は2回やってます。反省）
この辺よしなにやってくれているフレームワークってやっぱり最強だなと思いました。（小並感）

参考↓
http://d.hatena.ne.jp/Fivestar/20100112/1263291544
Cisco ネットワーク機器 ライセンスの注意点

Cisco ネットワーク機器はライセンスによって使える機能が異なります。
[Cisco FeatureNavigator](http://cfn.cloudapps.cisco.com/ITDIT/CFN/jsp/SearchBySoftware.jsp)でも、「FeatSet/License OR Supervisor(NX-OS specific)」という項目がありますね。

>
※IOS 15.1Y の場合
![image](https://qiita-image-store.s3.amazonaws.com/0/105131/3c83474f-4f4c-7a31-8454-076e8fee2559.png)

ライセンスは別途購入する必要があり、例えばC6509-E の場合、[CCW](https://apps.cisco.com/ccw/cpc/estimate/create)で見ると、以下のように、スーパバイザ VS-S2T-10G にてライセンスを追加することができます。

>
![image](https://qiita-image-store.s3.amazonaws.com/0/105131/81be295d-7cad-03ef-1d81-f5260368932f.png)

ところが、Catalyst2960 の場合はライセンスを追加する項目が見当たりません。

>
![image](https://qiita-image-store.s3.amazonaws.com/0/105131/284c40d8-ba7d-e144-1581-307189d519d6.png)

Catalyst2960 の場合、機器を選定した時点で対応するライセンスが決まっています。
後からアップグレードはできないので機器選定の段階で注意する必要があります。

機種とライセンスの対応表はリリースノートに記載されているので事前に確認しましょう。

>
例：[Catalyst2960X の場合](http://www.cisco.com/c/en/us/td/docs/switches/lan/catalyst2960x/software/15-2_5_e/release_notes/rn-1525e-2960x-xr.html)
>
---
![image](https://qiita-image-store.s3.amazonaws.com/0/105131/8aa8898c-4420-d667-c1d5-e15762278fb0.png)



以上。
Swift3 で今日の0時0分0秒を取得する

今日が2016年11月7日の場合の例

## Calendar.date を使う

```
let calendar = Calendar(identifier: .gregorian)
calendar.date(bySettingHour: 0, minute: 0, second: 0, of: Date()) // Nov 7, 2016, 12:00 AM
```

## Calendar.startOfDay を使う

```
let calendar = Calendar(identifier: .gregorian)
calendar.startOfDay(for: Date()) // Nov 7, 2016, 12:00 AM
```

※コメントありがとうございました！
windows10でchmファイルの内容が見えない場合の対処法

どうってことないんだけど。

win10でchmファイルの内容が見えない。
こんな時はセキュリティの問題であることがある。

chmファイルを開こうとするときに警告ポップアップが出てくるけど、警告を毎回上げない（チェックボックスからチェックを外す）ようにすれば、見えるようになる。

ただ、これだけのことなんだけど、結構迷った。
AWS Lambda ＋ API GatewayでLINE Notifyを実装してみた

#はじめに
LINEが新サービス、[LINE Notify](https://notify-bot.line.me/ja/)をリリースしました。
Webサービス（Git Hub, IFTTT, Mackerel)からの自動通知やAPIリクエストやCurlコマンドからもメッセージの送信ができます。
今回は、AWS Lambda + API Gatewayを通して通知を送信する方法をまとめさせていだだきます。
なお、環境は以下の通りです。

|項目   |環境|
|:------|:-------|
|OS     |Windows7|
|Node.js|6.7.0   |

#LINE Notifyのアクセストークンの取得
[LINE Notifyの公式サイト](https://notify-bot.line.me/ja/)右上のログインより、自分のLINE IDでログインします。
![01_ログイン.png](https://qiita-image-store.s3.amazonaws.com/0/108939/3da16b04-81f4-0f54-ad94-49602bc482f7.png)

ページ右上のログイン名称が記載されているメニューより、マイページへ移動します。
そして、ページ下部にある、トークンを発行するを選択し、送信したいグループを選択します。

![02_アクセストークン発行.png](https://qiita-image-store.s3.amazonaws.com/0/108939/4e9189a4-f8b9-2b71-5ad8-d8efc5555c04.png)

グループ選択後に表示されるアクセストークンを**大切に**保管します。（**二度と表示されないっぽいです**)

#Node.jsでHTTPSのAPIリクエストの送信
##requestモジュールのインストール
任意のフォルダで下記のコマンドでrequestモジュールをインストールします。

```
npm init
npm install --save request
```
これでrequestモジュールがインストールされます。

##実装

```
// main.js
'use strict';

const request = require('request');

// メイン処理
exports.handler = function(event, context) {
  const header_val = {
    'Content-Type':'application/x-www-form-urlencoded',
    'Authorization': 'Bearer [先ほど取得した]',
  };

  const options = {
    url: 'https://notify-api.line.me/api/notify',
    method: 'POST',
    headers: header_val,
    form: { message : 'テストメッセージ送信'}
  };

  // リクエスト送信
  request(options, (err, res, body) => {
    console.log(res.body);
  });

}
```

##動作確認
上記のコードではコマンドプロンプト上で動作確認ができませんので、exports.handler...の行と、最終行をコメントアウトした上で、main.jsを実行しましょう。
コマンドは下記の通りです。

```
node main.js
```

コンソールに、{"status":200,"message":"ok"}と出ればOKです。

#Lambda, API Gatewayの設定
##Lambdaの作成
作業の前に、先ほど作成したソースコードとフォルダ内のファイルをZip化しておきます。

まず、AWS上でLambdaを作成します。

- Subject Blueprintはスルー
- Configure TriggerをAPI Gatewayに設定し、次のページへ
![image](https://qiita-image-store.s3.amazonaws.com/0/108939/0606c1df-3631-a680-1854-23bc58298072.png)
※Security はOpen等でも可能。Openの場合誰でもアクセスしてしまうのでご注意ください。
- Configure functionを下記に設定
    - Name/Description:任意 
    - Runtime：Node.js 4.3
    - Code entry type:Upload a .zip file
    - 先ほどZip化したファイルをアップロード
    - Handler:main.handler
    - Role:任意

次ページで確認した際の状態は下記。
![image](https://qiita-image-store.s3.amazonaws.com/0/108939/97075fcd-bc87-4f0e-87c6-769880295a5a.png)

##API Gateway
作成後、Triggerタブを確認すると下記ように、URLが記載されていますので、こちらにリクエストを投げることで、メッセージを送信可能です。
![03_トリガー確認.png](https://qiita-image-store.s3.amazonaws.com/0/108939/1fdc16dd-3d6e-5fd9-9377-2fb699d31d22.png)

##APIキーの確認（Option）
APIキーによるアクセス認証を行う場合、API Gatewayのコンソールでキーを作成する必要があります。
AWSの公式サイトを参考に設定してください。
この設定をしないと誰でもリクエストを投げることができますので、設定しているほうが良いです。
設定方法は下記をご参照ください。

- https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/how-to-api-keys.html

##確認
Advanced REST client等を用いて、設定したAPIにアクセスしましょう。
ちゃんと設定できていたら、皆さんのお手元のLINEにメッセージが届きますよ。

#まとめ
今回はAPI Gatewayを直接呼び出しましたが、もちろんWebサービスからメッセージを送信することも可能です。
LINE Notifyは任意のグループにメッセージを送信することが可能ですので、運用チームでLINEのグループを作成し、そのグループにイベントを通知するようなこともできるので、かなり多様な使い方ができるのではないでしょうか。

メッセージの内容を変更する場合は、APIリクエスト時にメッセージをBodyに含めることで、
Lambdaのeventパラメータより取得可能です。
Maven pom.xmlに複数のrepositoryを書く

# これはなに？

dependenciesが複数のmaven repositoryに散らばっている場合のpom.xmlの書き方。
ここ http://www.techscore.com/tech/Java/ApacheJakarta/Maven/3-5/ を見れば解決するんだけど、なかなかたどり着けなかったもので。備忘録。

こんな感じのエラーにぶち当たっておりました。

```
Could not resolve dependencies for project hogehoge: The following artifacts could not be resolved: org.powermock:powermock-module-junit4:jar:1.6.6, org.powermock:powermock-api-mockito:jar:1.6.6, com.typesafe.akka:akka-actor_2.11:jar:2.4.12, org.jetbrains.kotlin:kotlin-stdlib:jar:1.0.4: Failure to find org.powermock:powermock-module-junit4:jar:1.6.6 in http://Central.rep/ was cached in the local repository, resolution will not be reattempted until the update interval of central has elapsed or updates are forced -> [Help 1]
```


# pom.xml(抜粋)

```
	<repositories>
		<repository>
			<id>central</id>
			<url>http://repo1.maven.org/maven2/<</url>
			<releases>
				<enabled>true</enabled>
			</releases>
		</repository>
		<repository>
		</repository>
		︙
	</repositories>


	<pluginRepositories>
		<pluginRepository>
			<id>central</id>
			<url>http://repo1.maven.org/maven2/</url>
			<releases>
				<enabled>true</enabled>
			</releases>
		</pluginRepository>
		<pluginRepository>
		</pluginRepository>
		︙
	</pluginRepositories>
```

# おまけ

repositoryは普通にブラウジング出来ます。
目的のpackageを探す場合の参考までに。

```
org.powermock:powermock-module-junit4:jar:1.6.6 の場合
http://repo1.maven.org/maven2/org/powermock/powermock-module-junit4/1.6.6/
```
docker alpineでpryデバッグ中に less -Rが立ち上がらない

docker開発環境でpryデバッグ中にlessが立ち上がらず、意外と情報なくてさまよったのでメモ。

alpineコンテナ利用していると、 less に -R オプションないよって怒られて、 methodsとか使えない。

使えない理由はalpineのlessにRオプションがない軽量なものがインストールされているから。

GNUのlessを使えば一発解決。

```sh:Dockerfile

FROM ruby:alpine

# ~~

RUN apk update && \
    apk add less

```

git diffもこれで色つくみたい！
MacでLambdaのコードのSHA256を計算する


# 注意点

Macの`zip`コマンドで圧縮する場合は毎回ハッシュが変わるので`-X`オプションを付ける。

```sh
zip -X archive.zip index.js
```

時刻の情報などが拡張属性として入ってしまうっぽい。
`man zip`より↓。

> Do not save extra file attributes (Extended Attributes on OS/2, uid/gid and file times on Unix)


参考 http://qiita.com/knaka/items/c8673dfb4ed1b83d3585

# SHA256の計算

zipファイルに対して行う。

```sh
shasum -a 256 archive.zip | awk '{print $1}' | xxd -r -p | base64
```

`openssl`コマンドでも同じことが出来る。

```sh
openssl dgst -binary -sha256 < a.zip | base64
```

# LambdaファンクションのCodeSha256の取得

既存のLambdaファンクションのCodeSha256を取得する。
`aws`コマンドで取得する方法。

```sh
aws lambda get-function-configuration --function-name ...

{
  "CodeSha256": "...",
  "FunctionName": "...",
  "CodeSize": 200,
  "MemorySize": 128,
  "FunctionArn": "arn:aws:lambda:...",
  "Version": "$LATEST",
  "Role": "arn:aws:iam::...",
  "Timeout": 5,
  "LastModified": "...",
  "Handler": "index.handler",
  "Runtime": "nodejs4.3",
  "Description": "..."
}
```
Pythonの基礎知識

# Pythonの基礎知識

## スライスを利用した並び替え
例題00."stressed"の文字列を逆順に並び替える。

```python:q00.py
#! usr/bin/pyenv python
# _*_ cording utf-8 _*_

word = "stressed"
print(word[::-1])
```
```q00.pyの出力結果
desserts
```

**Point**
スライスを用いる。
スライスは、ある文字列の一部、または全部を抜き出すことができる。
```
word[(始点):(終点):(ステップ数)] 
```
wordの始めから終わりまで全てを選択したい場合は、始点と終点は省略できる。

## スライスを利用した抽出表示
例題01."パタトクカシーー"の文字列の奇数番目の文字を出力する。また、偶数番目の文字を出力する。

```python:q01.py
#! usr/bin/pyenv python
# _*_ cording utf-8 _*_

word = "パタトクカシーー"

# 奇数番目の文字を抽出
extract1 = word[::2]
print(extract1)

# 偶数番目の文字を抽出
extract2 = word[1::2]
print(extract2)
```

```q01.pyの出力結果
パトカー
タクシー
```

**Point**
　スライスを用いる場合には、文字列が確実に決まっている場合を除いて、始点や終点は省略するとよい。

## zip関数を用いて、複数のオブジェクトを同時にループで処理
例題02."パトカー"と"タクシー"を先頭から交互に連結していき、"パタトクカシーー"を表示する。

```python:q02.py
#! usr/bin/pyenv python
# _*_ cording utf-8 _*_

word1 = "パトカー"
word2 = "タクシー"
linking = ""

for (str1, str2) in zip(word1, word2):
    linking += (str1 + str2)
print(linking)
```

```q02.pyの出力結果
パタトクカシーー
```

**Point**
　pythonでは、zip関数を用いることで複数のオブジェクトを同時にループで処理することができる。だが、複数のオブジェクトの場合、要素数が少ない方に実行回数が合わせられる。
Cisco ネットワーク機器 リリースノートの辿り方

機器がサポートする機能を調べる際は、基本的にリリースノートを見るのが良いと思います。
コマンドリファレンスでコマンドを検索して見つからなくても、リリースノートからだと辿れたりするからです。
ここでは、リリースノートの辿り方の手順を、以下の例を用いて紹介します。

#例

以下の機器が「OSPFのPrefix-Listが使えるか」調べてみましょう。

>
機器：WS-C4507R+E 
ライセンス：Enterprise Service
IOS：IOS XE 3.6.5E

#リリースノートの辿り方

[リリースノート](http://www.cisco.com/c/en/us/td/docs/switches/lan/catalyst4500/release/note/OL_32143-01.html#pgfId-2643416)を見ると、OSPFをサポートしていることは分かるけれど、詳細な機能（コマンドレベル）は確認できません。

![image](https://qiita-image-store.s3.amazonaws.com/0/105131/6f37c515-3710-db17-9a77-8a369d6e29ad.png)


リリースノートをよく見てみると、実は下の方にOSPFに関するリンクが掲載されています。

![image](https://qiita-image-store.s3.amazonaws.com/0/105131/338cc363-dd31-1af2-fc54-b076910ddb44.png)

[リンク先](http://www.cisco.com/c/en/us/td/docs/ios-xml/ios/iproute_ospf/configuration/15-e/iro-15-e-book/iro-abr-type-3.html)を参照すると、Prefix-Listに対応していることが分かりました。

![image](https://qiita-image-store.s3.amazonaws.com/0/105131/2c3d821c-0d84-6a33-d280-9be2d936f866.png)

しかしよく見るとこのページのタイトルに「IP Routing: OSPF Configuration Guide, Cisco IOS Release 15E」とあります。今回はIOS XE3.x でトレインが異なります。

#トレイン対応(3.x/15.x 等)の調べ方
CiscoのOSダウンロードサイトを見てみると、3.6.5E はファル名を見ると152-2(15.2(2))に相当することが分かります。

![image](https://qiita-image-store.s3.amazonaws.com/0/105131/28761100-9907-11b0-dc4b-3adda28f78d3.png)

以上。
Cognosで適用されているFixpackのレベルを特定する方法

よく聞かれるネタですが、CognosでFixpackのどのレベルが適用されているか、どうやって調べれば良いかという話です。

まず、Cognosの導入ディレクトリにある、以下のファイルを開きます。※Windowsの場合
C:\Program Files\ibm\cognos\c10_64\cmplst.txt

Linuxの場合、
/opt/ibm/cognos/c10_64/cmplst.txt になります。


見るべき箇所は2箇所で、とりあえずこちらを確認。

[Product Information]
C8BISRVR_version=C8BISRVR-AW64-ML-RTM-10.2.6100.235-0

さらに、少し下の方に、以下の表示が無いか確認。無ければFixpackは適用されていないと判断すれば良いです。
[Product Update Information]
C8BISRVR_UPDATE_version=C8BISRVR-AW64-ML-RTM-10.2.6106.48-0

この場合、10.2.6106 という文字を覚えて置いて、以下のサイトで確認。

How to determine the Service Pack of the Cognos Business Intelligence product installed
http://www-01.ibm.com/support/docview.wss?uid=swg21343355

この情報からわかるように、この環境ではCognos BI 10.2.2にFP6が適用されている事がわかります。
IBM Cognos 10.2.2
10.2.6100.235 - 10.2.2 GA
10.2.6101.79 - 10.2.2 FP1
10.2.6102.54 - 10.2.2 FP2
10.2.6103.26 - 10.2.2 FP3
10.2.6104.43 - 10.2.2 FP4
10.2.6105.506 - 10.2.2 FP5 (build 10.2.6105.50 indicates the withdrawn Fix Pack 5)
10.2.6106.48 - 10.2.2 FP6
React Native 開発Tips

いつも忘れる、聞かれる開発の際の細かいTipsをまとめます。
今後も追記予定。まずは、ちょっと。

# シミュレータと Chrome のデバッグツールをつなぐには

`Cmd + D` でメニューが表示される

# 実機にインストールして、Chrome のデバッグツールとつなぐには

実機を振るとメニューが出る

# XCode を開かないでシミュレータを起動する

`$ react-native run-ios`

# rnpm は古いので使わない

本体に取り込まれたので React Native のバージョンが 0.29.1 以上であれば
`$ react-native link`
を使う。それより古ければ rnpm。

# 動作 OS バージョン(React Native 0.38.0)

+ Android 4.1 (API 16) 以上 [プラットフォームのバージョン \| Android Developers](https://developer.android.com/about/dashboards/index.html#Platform)
+ iOS 8.0 以上 [App Store \- Support \- Apple Developer](https://developer.apple.com/support/app-store/)

# Android端末で動かしながら開発するとき

Android端末から開発機にbundleしたJavaScriptファイルをリクエストできるように、端末のtcp:8081で開発機のtcp:8081を参照できるようにする。

```
adb reverse tcp:8081 tcp:8081
```

# 画像をディレクトリに追加したらエラーになる

    TransformError xxx.png: Unexpected character '�' (1:0)

ってのが出たら node のパッケージサーバを再起動する

    npm start
修飾子の順番はPHPとJavaで異なる

final や public の順番は、ひっくり返しても別に動作するのだけど、なんとなく順番を決めたほうが気持ちが良いもの。調べてたらPHPとJavaで作法が違ったのでメモ。

## PHP

PSR-2が実質上の標準。
http://www.php-fig.org/psr/psr-2/

> Visibility MUST be declared on all properties and methods; `abstract` and `final` MUST be declared before the visibility; `static` MUST be declared after the visibility.

1. abstract / final (あれば)
2. visibility (private / protected / public) 常に書く
3. static (あれば)

PHPは他に修飾子がないので、3つ以上になることはない。(functionっていうキーワードを書かされるけど。。)

## Java

OpenJDKのStyleGuideがあった。
http://cr.openjdk.java.net/~alundblad/styleguide/index-v6.html

1. Access modifier (public / private / protected)
2. abstract
3. static
4. final
5. transient
6. volatile
7. default
8. synchronized
9. native
10. strictfp
adb logcatの鬱陶しいログを消そう

# 背景

こんなかんじのログが繰り返し出力されててうざい。

```
11-07 18:16:03.347 30364 30403 D BtGatt.ScanManager: handling starting scan
11-07 18:16:03.366 30364 30400 D BtGatt.ScanManager: callback done for clientIf - 5 status - 0
11-07 18:16:03.366 30364 30403 D BtGatt.ScanManager: addFilterToController: 2
11-07 18:16:03.371 30364 30400 D BtGatt.ScanManager: callback done for clientIf - 5 status - 0
11-07 18:16:03.372 30364 30403 D BtGatt.ScanManager: configureFilterParamter 500 10000 1 0
11-07 18:16:03.377 30364 30400 D BtGatt.ScanManager: callback done for clientIf - 5 status - 0
11-07 18:16:03.377 30364 30403 D BtGatt.ScanManager: configureRegularScanParams() - queue=1
11-07 18:16:03.378 30364 30403 D BtGatt.ScanManager: configureRegularScanParams() - ScanSetting Scan mode=2 mLastConfiguredScanSetting=-2147483648
11-07 18:16:03.378 30364 30403 D BtGatt.ScanManager: configureRegularScanParams - scanInterval = 8000configureRegularScanParams - scanWindow = 8000
```

自分のプロセスのログだけみるなど方法はあるけれど、
見てもしょうがないようなデバックログが繰り返し吐かれているとイラッとするので消したい.

# adbでログレベルをあげる

```shell-session
adb shell setprop log.tag.BtGatt.ScanManager INFO
```

こんな感じで特定のtagの出力レベルを変更できる。 (`log.tag.<TAG>` で指定する)
OS側が吐いているようなDEBUGレベルの垂れ流しログは代替INFOに変えちゃうのがオススメ。
ページによってNavigationPageのバックグランドカラーを変更する

ここ3ヶ月ほどXamarin + Prism.Formsで開発しているのですが、ページによってNavigationの背景色を変えたいというケースで躓きました


結論、Prismは全く関係ないのですが、Prism利用している場合NavigationServiceを利用していて、Xamarin.Forms側と切り離して考えていのかまず悩みました

## どうやったか
1. Xamarin.FormsのNavigationPageを利用してオレオレNavigationPageを作る
2. Pushed,Poppedを監視してイベント毎に適切なカラーを指定

```C#:App.xaml.cs

	public partial class App : PrismApplication
	{

		protected override void OnInitialized()
		{
			InitializeComponent();
			NavigationService.NavigateAsync("/RootPage/MyNavigationPage/MainPage");
		}

		protected override void RegisterTypes()
		{
			Container.RegisterTypeForNavigation<RootPage>();
			Container.RegisterTypeForNavigation<MyNavigationPage>();
			Container.RegisterTypeForNavigation<MainPage>();
			Container.RegisterTypeForNavigation<OtherPage>();
		}
	}

```

```C#:MyNavigationPage.xaml.cs

	public partial class MyNavigationPage : NavigationPage
	{
		public MyNavigationPage()
		{
			InitializeComponent();

			Pushed += (sender, e) => {
				CheckBarBackColor();
			};

			Popped += (sender, e) =>
			{
				CheckBarBackColor();
			};

		}

		void CheckBarBackColor()
		{
			if (CurrentPage is MainPage)
			{
				BarBackgroundColor = Color.Black;
			}
			else {
				BarBackgroundColor = Color.Gray;
			}
		}

```
![a.png](https://qiita-image-store.s3.amazonaws.com/0/8131/b95da8cb-fe3f-1ba2-554a-14be82ebaf65.png)


![b.png](https://qiita-image-store.s3.amazonaws.com/0/8131/e20c51e0-8f12-738d-fb84-b685ba737265.png)

たったこれだけなのですが、`NavigationPage.SetBackButtonTitle`とか`NavigationPage.SetHasNavigationBar`とかあるので、外から指定するもんだと思い込み結構時間を使ってしまいました(SetBarBackgroundないけれどどうすりゃいいんだっていう)
気がついてしまえば、自分で自分の状態を確認して適切な処理をする至極当たり前なのですがこういう部分で躓いたりします



これが最適解ではないかもしれないのですが、ひとまずこれで実装は可能ということで
こうした方がかっこいいとか、こうするべきとかあれば知りたいのでよろしくおねがいします〜〜
LaravelのDIが楽チンな件

順番も気にせず、とっても簡単にDI出来ます。Laravel5.3で確認しています。

### bootstrap/app.php
---

```php
class Aaa {
    public $bbb;
    public function __construct($bbb) {
        $this->bbb = $bbb;
    }
}
class Bbb {
    public $ccc;
    public function __construct($ccc) {
        $this->ccc = $ccc;
    }
}
class Ccc {
}

// 順番など気にせず、シングルトンで生成してくれる。（都度生成も出来ます。）
$app->singleton('Aaa', function($app) {
    return new Aaa($app['Bbb']);
});
$app->singleton('Bbb', function($app) {
    return new Bbb($app['Ccc']);
});
$app->singleton('Ccc', Ccc::class);

var_dump($app['Aaa']);
var_dump($app['Bbb']);
var_dump($app['Ccc']);

// output
> object(Aaa)#26 (1) {
  ["bbb"]=>
  object(Bbb)#27 (1) {
    ["ccc"]=>
    object(Ccc)#29 (0) {
    }
  }
}
object(Bbb)#27 (1) {
  ["ccc"]=>
  object(Ccc)#29 (0) {
  }
}
object(Ccc)#29 (0) {
}
```
### app/Http/Controllers/HomeController.php
---

```php
namespace App\Http\Controllers;

use Aaa;

class HomeController extends Controller
{
    /** @var Aaa */
    private $aaa;

    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct(Aaa $aaa) // ここに書くだけで注入してくれる！！
    {
        $this->aaa = $aaa;
    }

    /**
     * Show the application dashboard.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        return view('home');
    }
}
```

### まとめ
---

魔法使っている感はありますが、すごい簡単ですね(・∀・)

おそらくリフレクション使いまくりなので、本番のときは、
appキャッシュの指定を忘れないようにしたいですね。
rspecでデバックする方法


```
save_and_open_page
```

これは、実際に画面がブラウザ上で開く！

```
page.save_screenshot 'screenshot.png'
```

これは、`tmp/capybara/`に`screenshot.png`というスクリーショットが保存される。
カレンダーへの入力が`save_and_open_page`だと確認できなかったのだけど、`page.save_screenshot`だと確認ができた
rails: present? blank? nil? unless

#それぞれの定義

##present?の意味

対象のオブジェクトが`nil`もしくは空の場合に`false`それ以外の場合は`true`を返す。

[こちら](http://www.rubydoc.info/gems/activesupport/5.0.0.1/Object#present%3F-instance_method)より

>An object is present if it's not blank.

以下コメントより引用

```test.rb
require "active_support/core_ext/object"

puts "".present?     #=> false
puts "   ".present?  #=> false
puts [].present?     #=> false
puts({}.present?)    #=> false 
puts false.present?  #=> false
```
##nil?の意味

対象のオブジェクトが`nil`であれば`true`を返す。

##blank?

[こちら](http://www.rubydoc.info/gems/activesupport/5.0.0.1/Object#blank%3F-instance_method)より

>An object is blank if it's false, empty, or a whitespace string. For example, false, '', ' ', nil, [], and {} are all blank.

`false`を始めとした空欄もすべて`true`と返してくれる。
言い換えれば`present?`の真逆。つまり`!blank?`と`present?`は同義。よって`"　".blank? #true`になる。

#例えば

```
      desc "migrate category names to new db"
    task migrate_category_names: :environment do
      Category.find_each do |category|
        path = category.path.gsub("-", "/").gsub("_", "-")
        matched_record = GakkiManiaCategoryPathSetting.find_by(path: path)
        if matched_record.present?
          if matched_record.name.present?
          category.update(name: matched_record.name)
          end
        end
      end      
    end
```

これは`matched_record`が`nil`かそうでないかの精査を行っているが、仮にその行を`unless matched_record.nil?`としても同じである。回りくどいのでやらないほうが良いと思うが。このように`if`を使わなくても`unless A`でAが`false`のときに以下の処理を実行みたいなことも可能。
.git/hooks/pre-push 覚書 ver.2

ver 1 → [.git/hooks/pre-push 覚書（railsアプリ編）](http://qiita.com/amoO_O/items/e710389c3468064e633f)

`hotfix` 作業中に別タスク（ `feature` → `develop` ）のプルリクが通り、`hotfix` 終了後に誤って `git push -f origin develop` をやらかして `develop` を上書きしてしまった。 `feature` ブランチは残っていたのでプルリクを出し直してレビュワーに焼き土下座をしたが、

- `develop` に `git push -f` したらアカン
- 誤って `git push -f` しても、 `pre-push` フックで弾いて欲しい

というわけで[こちらを参考](https://gist.github.com/pixelhandler/5718585)に `.git/hooks/pre-push` を修正

```bash:.git/hooks/pre-push
#!/bin/bash

protected_branch='master|develop'

current_branch=$(git symbolic-ref HEAD | sed -e 's,refs/heads/\(.*\),\1,')
push_command=$(ps -ocommand= -p $PPID)
is_destructive='force|delete|\-f'

policy="[Policy] Never force push or delete the $protected_branch branch! (Prevented with pre-push hook.)"
proc_exit(){
  echo $policy
  exit 1
}

prevent_force_push() {
  if [[ $push_command =~ $is_destructive ]]; then
    if [[ $current_branch =~ $protected_branch ]] || [[ $push_command =~ $protected_branch ]]; then
      proc_exit
    fi
  fi
}

prevent_delete() {
  delete_reg=' :('$protected_branch')'
  if [[ $push_command =~ $delete_reg ]]; then
    proc_exit
  fi
}

proc_test() {
  activator scalastyle
  ss=$?

  activator test:scalastyle
  tss=$?

  activator test
  t=$?

  exit $(($ss || $tss || $t))
}

prevent_force_push
prevent_delete
proc_test
```

railsアプリ の場合は `proc_test` を次のように書き換える。

```
bundle exec rubocop
cop=$?

bundle exec rspec spec
pec=$?

exit $(($cop || $pec))
```
[Unity]JsonNodeを拡張してJsonをもっと自由に扱う

# UnityでJsonといえば

Unity5.3から公式でJSONに対応されたので、
今JSON使いたい！ってなった場合、例として以下の手法があります。

|手法| 目的 | Dictionary |
|:--|:--|:--|
|JsonUtility   |構造が確定しているJSON使いたい   | 不可 |
|MiniJson   |手軽にシンプルなJSONを使いたい   | 可 |
|MiniJson+JsonNode   |ある程度複雑なJSONを手軽に使いたい   | 可 |

# 問題点
上記の手法で殆どの場合解決すると思うのですが、
楽に扱うことは出来ても、「ネストの深さ」までの自由度は得られません。

例えば、実行中にユーザーが用意した任意のJSONを読み込む、というようなことをしたい場合、ある程度テンプレートが定まっていることが前提条件となってしまいます。

つまるところ、JsonNodeだと

```C#
node(json["hoge"]["bool"].Get<bool> ());
```
となるようなところを、

```C#
node.Get<bool> (new object[]{"hoge", "bool"}));
```
こんな風に取得出来るようにしようという話です。

# JsonNodeを拡張する
##スクリプト
任意のネストの深さのの値を取得できるようにJsonNodeの`Get<T>()`を改良しました。
`Get<T>()`と差し替えて使えます。

```C#:JsonNode
public Type Get<Type>(params object[] param){
	object node = this.obj;
	for (int i = 0; i < param.Length; i++) {
		if (param [i] is int)
			node = (object)(((IList)node) [(int)param [i]]);
		if (param [i] is string)
			node = (object)(((IDictionary)node) [(string)param [i]]);
	}
	if (typeof(Type) != node.GetType ())
		throw new Exception ("\n" + typeof(Type) + " => " + node.GetType ());
	return (Type)node;
}
```

##使い方
以下のようなJSONを例に説明します。

```JSON:test.json
{
    "fuga":1.23,
    "hoge":{
        "bool":true,
        "long":123,
        "list":[123,456]
    }
}
```

で、Unity側からはこんな感じで使えます。

```C#
void start(){
	TextAsset text = Resources.Load ("test.json") as TextAsset;
	JsonNode json = JsonNode.Parse (text.text);
	//拡張版の書き方
	print (json.Get<double> (new object[]{"fuga"}));
	print (json.Get<bool> (new object[]{"hoge", "bool"}));
	print (json.Get<long> (new object[]{"hoge", "long"}));
	print (json.Get<long> (new object[]{"hoge", "list", 1}));

	//従来のJsonNodeの書き方でもOK
	print (json["hoge"]["bool"].Get<bool> ());
	
}
```

まぁ、ここまで自由度を上げる必要性が出てくる場面はあまり無いと思いますが。

#参考
- [[Unity] MiniJsonをちょっと楽にするスクリプト](http://qiita.com/asus4/items/bac121c34cd3169116c0)
- [[Unity] MiniJSON 使って json 読み込み](http://qiita.com/phi/items/914bc839b543988fc0ec)
- [Unity5.3でJsonを扱うまとめ](http://qiita.com/toRisouP/items/53be639f267da8845a42)
CentOS7のGRUBをタイムアウト時間を変更する

# 初めに
この作業は起動に伴う危険な作業です。うかつに説明以外の内容を書き換えてしまうとCentOSが起動できなくなる恐れがあります。
**作業は自己責任で行ってください。起動できなくなっても責任は負いません。**

# 環境
CentOS Linux release 7.2.1511 (Core)
CUI環境(最小限環境)

# 定義
``` # ``` > root権限
``` $ ``` > 一般ユーザー権限

# 開く
``` # vi /boot/grub2/grub.cfg ```
もしくは
``` $ sudo vi /boot/grub2/grub.cfg ```
※cdで移動する場合、一般ユーザーはgrub2のディレクトリにアクセスができませんのでご注意ください。
任意でテキストエディターを変更しても問題はありません。

# 編集
63行目と67行目に ``` set timeout=5 ``` というのがあるはずです。
(検索で"timeout"と検索するのが手っ取り早いでしょう)
``` set timeout=5 ```の``` 5 ```を任意の数に変更します。単位は「秒」です。
※今回は2に設定しました。また、2つ``` timeout ```がある場合がありますので、その場合は両方変更してください。
保存してエディタを終了します。保存やエディタの終了方法はそのエディタの使い方をご確認ください。

# 再起動
``` $ sudo shutdown -r now ```
もしくは
``` $ sudo reboot ```
再起動して確認します。任意のタイムアウト時間になったら成功です。
![grubtimeout.PNG](https://qiita-image-store.s3.amazonaws.com/0/111880/9ad6dc12-3f4e-a5b9-89ab-19d1e56a7b8e.png)
BluemixでElastic searchを使って日本語検索する準備

IBMが提供する Bluemix で Compose.io が提供するオープンソースデータベースのDBaaSが利用可能になりました。
ただ、BluemixからComposeのサービスを払い出すとGUIが使えないんですよね…
と思っていたら使う方法があったので備忘録として書いておきます。

![image](https://qiita-image-store.s3.amazonaws.com/0/112854/2c558381-d955-d3e7-2e92-28409c6a7b37.png)

#####やりたいこと。
　「BluemixでElasticSearchのサービスを作成して日本語検索したい。」

#####1) Bluemix にログイン
#####2) カタログから"データ＆分析"カテゴリーを選択
#####3) ElasticSearchのアイコンをポチ
#####4) "作成"をポチ
![image](https://qiita-image-store.s3.amazonaws.com/0/112854/22bb170b-0244-bae2-1757-7107b0d1d07d.png)

#####5) Compose.io (https://app.compose.io/session/new) のサイトへGO! 

※ここからちょっとウラワザ的な…

#####6) "Forgot your password?" をポチ

![image](https://qiita-image-store.s3.amazonaws.com/0/112854/60d8ea8b-d14d-7939-17db-50cb596dff7b.png)

#####7) BluemixのIDを入力してComposeで使うパスワードを設定
![image](https://qiita-image-store.s3.amazonaws.com/0/112854/574d8cd2-6da8-4a38-2368-120138a81b2e.png)

#####8) BluemixID と 設定したパスワードを使ってログイン

#####9) Bluemixで作成したElasticSearchのサービスをポチ
![image](https://qiita-image-store.s3.amazonaws.com/0/112854/fa21ed00-a31c-3366-426f-8542702e7b03.png)

#####10) GUIが利用可能になります。
![image](https://qiita-image-store.s3.amazonaws.com/0/112854/0c95cbde-6725-106d-b27a-44e114dfe94d.png)

では日本語plug-inを導入しましょ

#####11) plug-in をポチ　analysis-kuromoji を ONにして"Set Active Plugins" をクリック
![image](https://qiita-image-store.s3.amazonaws.com/0/112854/06b57868-4df0-0514-effd-40ca17e4419e.png)

以上！　結構簡単です。
ElasticSearchがBluemixで使えるようになってマスマス便利になりました。

※ユーザーによっては上記のウラワザ的な方法でGUIを利用する事が出来ない方もいらしゃるようです。
その方はサポートにリクエストすればOKのようです。
https://help.compose.com/docs/bluemix-compose-support
Excelで「SQLで言うと”こういう”事がしたい」がすぐできる。ExcelSQL

# **ExcelSQLの使用方法**
RDBに慣れた人がExcelを使っていると、ふと**「SQLで言うと"こういう"事がしたい」**と思う時があります。Excelでも工夫すればできる事もあるのですが、「ルックアップするときはルックアップ元のデータを昇順に並び替えないといけない」等、使い続けないと忘れてしまう独特なルールが存在します。
そういったときに役立つツール「ExcelSQL」をご紹介します。
## **ExcelSQLとは？**
文字通り**ExcelでSQLが実行できます。**　**「1シート ＝ 1テーブル」**に見立てて、SQL実行。結果をシートに吐き出す事ができます。さらに、それをテーブルに見立ててSQLを実行することも可能です。
MS Excelでできる事**「タブ区切りデータの扱いに優れている」**点と、
SQLでできる事**「データを繋ぐ等、RDB(リレーショナルデータベース）としてデータの扱いに優れている」**点が
両方備わっています。

## **使ってみよう**
1. http://ltside.com/pgm/ExcelSQL.zip からファイルをダウンロードします。
2. 1のzipファイルを任意の場所に展開します。
3. 展開したファイル中の**「ExcelSQL.xlsm」**を開きます。
4. 問題無ければ[※1](#注意点)、**「編集を有効」「コンテンツの有効化」**を行います。
5. SQLが記載された状態で**「SQL,プレビュー」**ボタンを押すと、下に結果が出力されます。

- SQLが記載された状態で**「新規シート出力」**ボタンを押すと、新規シートが作成され、そこに結果が出力されます。出力されたシートは、一般のExcelシートと同様に扱うことが可能です。逆に別途シートを作成し、それをテーブルに見立てることも可能です。
- **「シート」**ボタンには**「新規シート」「新規シートに貼付（項目有・無）」**等、シートの管理に関わる機能がついています。
- **「新規シートに貼付」**は書式・スタイルを取り除いた「文字列」形式で貼り付けることができます。

## **注意点**
- **利用は自己責任でお願いします。**
> MITライセンスに準拠します。
従って、同梱されているファイルを利用した場合に発生したトラブルに関して、以下製作者の責任は問われないものとします。
[^1]:(C)RAWSEQ http://ltside.com
「編集を有効」「コンテンツの有効化」（マクロの実行）は上記製作者の素行を確認の上、自分自身で判断をお願いします。

- **データの扱いに気を付ける**
> Excelでよくある自動型変換。例えば「0001」を数値と判断し、「1」と変換されたりする、Excelのすばらしい機能によって、テーブル結合や抽出の不一致にならないよう注意してください。**「新規シートに貼付け」**はそうならないように配慮しています。

- **ODBC Excel Driverを利用しています**
> 基本構文はSQL標準の扱いができますが、関数はMS-SQLServerではなく、MS-Access-SQLに準拠しています。[参考資料:Access関数](http://www.office-kitami.com/lesson/afunction/index.html) Access-SQLの機能制約版といったイメージです。
例えば条件分岐。一般のSQLはcase文が定石ですが、ExcelSQLでは「IIF」といったVisualBasicのような書き方に似ています。

- **join 句は省略できない**
> 同様、Access SQLに準拠し、「join」ではなく、「inner join」 と明示的に指定しないといけないようです。

- **パフォーマンスはマシン次第**
> 一応、１シート999999レコード上限としていますが、RDBに最適化されている訳ではないので、処理効率については期待しないでご利用ください。

- **データの終わりに気を付ける**
> シートを修正していると、行の末端や列の末端が伸びてしまうことがあり、oreder by でソートをかけると、**空白行が先頭に溜まって**データが見えない場所に出力される場合があります。行や列の終わりの空白ができた場合は**「列削除」**を行います。
var_dump() で出力する内容を省略させない

#var_dump() で出力する内容を省略させない

結構見かける内容ですが、cliでデバッグする際によく使うのでメモ代わりです。

```php
ini_set('xdebug.var_display_max_children', -1);
ini_set('xdebug.var_display_max_data', -1);
ini_set('xdebug.var_display_max_depth', -1);
```
Macにnvm + Node.jsをインストール

## 公式サイト

https://github.com/creationix/nvm

## インストール

公式サイトの指示に従ってインストール。

````
$ curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.32.1/install.sh | bash
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 10250  100 10250    0     0   4049      0  0:00:02  0:00:02 --:--:--  4049
=> Downloading nvm from git to '/Users/sotoiwa/.nvm'
=> Cloning into '/Users/sotoiwa/.nvm'...
remote: Counting objects: 5891, done.
remote: Compressing objects: 100% (156/156), done.
remote: Total 5891 (delta 20), reused 0 (delta 0), pack-reused 5735
Receiving objects: 100% (5891/5891), 1.66 MiB | 895.00 KiB/s, done.
Resolving deltas: 100% (3550/3550), done.
Checking connectivity... done.
* (HEAD detached at v0.32.1)
  master
=> Compressing and cleaning up git repository
Counting objects: 5891, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (5856/5856), done.
Writing objects: 100% (5891/5891), done.
Total 5891 (delta 3888), reused 1894 (delta 0)

=> Profile not found. Tried  (as defined in $PROFILE), ~/.bashrc, ~/.bash_profile, ~/.zshrc, and ~/.profile.
=> Create one of them and run this script again
=> Create it (touch ) and run this script again
   OR
=> Append the following lines to the correct file yourself:

export NVM_DIR="/Users/sotoiwa/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"  # This loads nvm
=> Close and reopen your terminal to start using nvm or run the following to use it now:

export NVM_DIR="/Users/sotoiwa/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"  # This loads nvm
$ 
````

インストール時に`.bash_profile`が存在しないと必要な記述を追加してくれないので、以下の内容で作成する。あるいは`touch ~/.bash_profile`してファイルをつくってインストールをやり直してもよい。

````bash:.bash_profile
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm
````

設定反映のために一旦シェルを抜けて入り直す。あるいは`source ~/.bash_profile`する。

````
$ nvm --version
0.32.1
$ 
````

インストール可能なバージョンをリストする。

````
$ nvm ls-remote
        v0.1.14
        v0.1.15
        v0.1.16
        v0.1.17
        v0.1.18
（中略）
         v6.7.0
         v6.8.0
         v6.8.1
         v6.9.0   (LTS: Boron)
         v6.9.1   (Latest LTS: Boron)
         v7.0.0
$ 
````

今回はv4.3.1をインストールする。

````
$ nvm install v4.3.1
######################################################################## 100.0%
Computing checksum with shasum -a 256
Checksums matched!
Now using node v4.3.1 (npm v2.14.12)
Creating default alias: default -> v4.3.1
$ 
$ nvm ls
->       v4.3.1
default -> v4.3.1
node -> stable (-> v4.3.1) (default)
stable -> 4.3 (-> v4.3.1) (default)
iojs -> N/A (default)
lts/* -> lts/boron (-> N/A)
lts/argon -> v4.6.1 (-> N/A)
lts/boron -> v6.9.1 (-> N/A)
$ 
$ node --version
v4.3.1
$ 
````

## 参考にしたリンク

[Macにnvm + Node.jsをインストールする](http://qiita.com/dribble13/items/e895208727c85ef9bc52)
AndroidStudioでエラー

AndroidStudioでカウントアプリを作っているのですがエラーがでて-10カウントのボタンを押すとアプリが強制終了します。

public class MainActivity extends AppCompatActivity {

    TextView textView;
    TextView textView2;
    int count;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        textView= (TextView)findViewById(R.id.textView);
        textView2=(TextView)findViewById(R.id.textView2);
    }
    public void add(View v){
        count=count+1;

         textView.setText(count+"回ボタンが押されました!");



    }

    public void minus(View v){
        count=count-1;

        textView.setText(count+"回ボタンが押されました!");
    }

    public void add2(View v){
        count=count+10;

        textView2.setText(count+"回ボタンが押されました!");
    }

    public void minus2(View v){
        count=count-10;

        textView2.setText(count+"回ボタンが押されました!");
    }
}

どこがだめなんでしょうか？