OmniAICreator/Qiita-1.07M huggingface dataset:
Facebook Graph API ユーザ情報の取得


Facebook Graph APIのエンドポイント


最近TwitterとかGitHubとかQiitaとか色んなAPI試してるけどGraphAPIはパーミッションが細かくて面倒


PHPでクライアント使ってリクエスト

composer.jsonに追記しているバージョンは

`"facebook/graph-sdk": "~5.3.1",`


## リクエスト用のクライアント生成

`$client`を使ってリクエストしていく

`$facebook_app_id`と`$facebook_app_secret`はfacebookアプリを作成した時にdevelopper consoleから取得できる文字列を入れる

```php
$client = new Facebook([
    'app_id'                => $facebook_app_id,
    'app_secret'            => $facebook_app_secret,
    'default_graph_version' => 'v2.2',
]);
```


## APIから実際にデータを取得するための流れ

ここの流れを追っていけばリクエストできるようになると思います
[グラフAPIを使ったユーザープロフィールの取得](https://developers.facebook.com/docs/php/howto/example_retrieve_user_profile "グラフAPIを使ったユーザープロフィールの取得")

※事前にアクセストークンを取得していることが前提となる
OAuthはここでは書きません

1. Facebook\Facebookクラスのインスタンスを生成してリクエスト用のクライアントを用意する
2. リクエストしたいAPIのドキュメントを読む ユーザ情報以外にもページとか写真とか取れます [グラフAPIリファレンス](https://developers.facebook.com/docs/graph-api/reference "グラフAPIリファレンス")
3. permissionの確認 permissionが無いと取得できないパラメータが多く存在します permissionの変更はユーザがOAuth認証するタイミングなので後で変更したい場合結構面倒くさいと思います [アクセス許可のリファレンス](https://developers.facebook.com/docs/facebook-login/permissions/ "アクセス許可のリファレンス")
4. エンドポイントの確認 リクエストしたいAPIのエンドポイントを確認しましょう 導入例という項目のHTTPの項目でURIは確認できます
5. 取得したいフィールドの確認 リクエストしたエンドポイントのままでは取得できないフィールド(項目)が存在します 例えば`/v2.2/me`で取得するデータと`/v2.2/me?fields=id,name,last_name,gender`のようなリクエストでは取得できる値が変わってきます 取得できる項目はリファレンスのフィールドという項目で確認できます 設定方法はエンドポイントの最後に`?fiels=カンマ区切りのフィールド`のような感じです
6. リクエストする 上で用意したFacebookクラスのインスタンスを使ってリクエストしていきます<br>
アクセストークンはユーザがOAuthした時に取得できるトークンです

```php
$res = $client->get('/me?fields=id,name,last_name,gender', $access_token);
// $userは取得できたユーザ情報を配列で取得できます
$user = $res->getGraphUser();
print_r($user['last_name']);
// または
$user->getName();
$user->getField('name');
```
フィールドを取得するメソッドはよく取得するフィールドには付いているようですが、`work`などは`getWork()`では取得できないようなので`getField('work')`などで取得する必要があります



## User情報 ユーザの情報を取得する

[Graph API User](https://developers.facebook.com/docs/graph-api/reference/user "Graph API User")

ユーザの職歴を取得したい場合

```php
$res = $client->get('/me?fields=id,name,work', $access_token);
// $res = $client->get('/ユーザID?fields=id,name,work', $access_token); // これでもいける
$user = $res->getGraphUser();
$user->getField('work');
```



色々追加していくと思いますが今はユーザ情報の取得だけです
API Gateway でキャッシュを無効化

どうしてこんなことで小一時間もハマってしまい、正直 Qiita に書くか悩んだが、もしかしたら同じ状況で困ってる人がいるかもしれないので、自戒の意味もこめて記録しておく。

---

AWS API Gateway において JavaScript SDK を使用している際、Internet Explorer がキャッシュを読み込んでしまい、更新時の API 再取得などで問題が発生してしまう時に、以下のようにすることでキャッシュを回避できる。

```js
var apig = apigClientFactory.newClient();

var additionalParams = {
    queryParams: {
        '_': Date.now(), // ← これをクエリパラメーターに含める！
    },
};

apig.hogeGet(params, body, additionalParams).then(function(result) {
    // なんか処理
}).catch(function(error) {
    // エラー処理
});
```

jQuery なんかは `$.ajaxSetup({ cache: false });` とすることで同様のことができるみたいだが、なぜ API Gateway の SDK にもそういうオプションがないのだろう。

しかし、どう見てもバッドノウハウじゃないか。もう IE 対応なんかしたくない…
Slack | カスタムステータスをSlackコマンドで更新 / キャンセルする

# ステータスの更新

`/status [絵文字] [メッセージ(省略可)]` と入力する。

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/bdb05460-848a-2243-f906-0da5c8fbf2f4.png)

## 結果

ステータスが変わる。

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/d1a9d80a-414e-3e34-1dd5-18fca50e8472.png)

# ステータスのキャンセル

`/status` と打つだけでOK。

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/16348bf7-6594-c19a-06fe-e410cc9c19e6.png)

# 結果

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/267411b5-3101-d697-a09a-ae26b04defec.png)








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
pythonのjsonschemaライブラリでswagger用にx-nullableに対応する方法

## はじめに

swaggerはjsonschemaと完全に互換性があるわけではない。pythonでjsonschemaでのvalidationには[jsonschema](https://github.com/Julian/jsonschema)というそのままな名前のライブラリを使うのだけれど。

以前記事を書いた通りに、[swaggerはnull typeを許容していない](http://qiita.com/podhmo/items/7b6a2e68417aa2eac727)。とは言え、nullを返したい場合もあったりするのでそれに対応する方法のメモ。

## x-nullableのサポート

幾つかのswagger用のツールではnullableのサポートに `x-nullable` という属性を追加している。swagger的には `x-` で始まる属性は自由に付けることが許されている。

これに対応する方法は以下の様な感じ。

```python
from jsonschema.validators import Draft4Validator, extend
from jsonschema._validators import type_draft4


def type_custom(validator, types, instance, schema, nullable_attr="x-nullable"):
    if schema.get(nullable_attr, False):
        if not isinstance(types, (list, tuple)):
            types = [types]
        types.append("null")
    yield from type_draft4(validator, types, instance, schema)


CustomValidator = extend(Draft4Validator, {
    "type": type_custom,
})
```

実際こんな感じで使える。

```python

schema = {
    "type": ["string", "null"]
}

validate = CustomValidator(schema).validate
print(validate(None, schema))
print(validate(None, {"type": "string", "x-nullable": True}))
```
『プログラミングの基礎』を読み進めるためにMacBookにOCaml用の環境を整備した


未経験のエンジニアとしてRubyやらJavaScriptに触れ合いつつのらりくらりやってきましたが、2年目になったことですし、
『[プログラミングの基礎](http://amzn.asia/1xG7Wzz)』という書籍を用いて基礎から勉強し直そうと思いました。

そこで、OCamlという見慣れない言語を使うことになるのですが、そのための環境を整えた話です。
『[プログラミングの基礎](http://amzn.asia/1xG7Wzz)』を読み進める上では以下に紹介する環境で十分かと思います。

## マシン環境
MacBook Pro (Retina, 13-inch, Early 2015)
macOS Sierra (Version 10.12.4)
Homebrewはインストール済みという前提です。

## OCamlのインストール
OCaml自体のインストールは単純で、以下のbrewコマンドで完了します。

`$ brew install ocaml`

以下のように、ocamlコマンドでインタプリタが立ち上がればOCamlのインストールは完了です。

```diff:OCamlインストール確認
$ ocaml
    OCaml version 4.04.0

#
```
※ちなみに、Ctrl+Dでインタプリタが終了します。

## 困った点とその対策

### カーソルキーが使えない！
デフォルト状態のインタプリタでは、カーソルキーが使用できません。
カーソルの位置を調整してtypoの修正ができなかったり、「↑」キーで直前のコマンドを再入力できなかったりで
とても不便です...

この問題は、rlwrapというツールを導入すれば解決します。
こちらもbrewコマンド一発でインストールできます。
`$ brew install rlwrap`

`rlwrap ocaml`というコマンドでOCamlインタプリタを起動すれば、カーソルキーが使用できるようになります。

毎回`rlwrap ocaml`と入力するのはダルいので、以下のようにaliasを設定しました。

`alias ocaml='rlwrap ocaml'`

### 日本語が表示できない！
OCamlのデフォルトの文字コードがEUC-JPであり、『[プログラミングの基礎](http://amzn.asia/1xG7Wzz)』でもEUC-JPで進めることになっています。
しかし、EUC-JPのまま進めるにはターミナルの文字コード設定の変更が必要だったりで面倒くさいので、
OCamlの文字コードをUTF-8に変更しました。

ホームディレクトリに以下の内容の`.ocamlinit`というファイルを追加すればOCamlの文字コードがUTF-8になります。

```diff:~/.ocamlinit
let printer ppf = Format.fprintf ppf "\"%s\"";;
#install_printer printer;;
```


## 禁じ手
OCamlの環境構築方法を調べると、opamというツールが各所でオススメされているのですが、
`opam init`するとMacが落ちるという現象に遭遇しました。

複数回試してみても、OSがYosemiteの別端末で試してみても致死率100%を誇り、
また、opamを使わなければならないほどリッチな環境にする必要もないので、opamの導入は諦めました。
【初心者目線で見る】サーバレスとは

#はじめに
<font size=2>
１年前頃から話題になっている、サーバレス。
インフラ知識ほぼゼロに等しいわたしからしてみると、
サーバレスという言葉を聞いた時、『？？？？』。
サーバレスってことはサーバがいらないってこと！？じゃあどうやってシステム動くの？
分からないことだらけです。

ということで調べてみました。
素人目線の見解なので、ツッコミポイントも多いと思いますが...ご容赦ください。
</font>

#サーバレスとは
特に決まった定義は今のところ存在しないようです。

色々と調べていく中で一番しっくり来たのがこれ。
<br>
_オンプレミスで運用していた時代から基盤の主がクラウドへ移り、システムのメンテナンス性や拡張性を柔軟にするために、クラウドの管理までなくしてしまう、サーバレスアーキテクチャという考え方が注目されています。
http://www.kobelcosys.co.jp/column/itwords/20160401/_


実際、”レス”といってもサーバ自体が全く無いわけではないです。

例えばサーバレスを実現するために

"AWS S3＋API Gateway ＋ Lambda"

を利用したとします。

これらは全てAWSのサービスなのでサーバの管理はAWS側でやってくれます。

サーバ自体は存在していますが、管理が不要なのでサーバの存在を意識せずに運用をすることができます。
この”存在を意識しない”というところがサーバレスのポイントなのかな、と思います。

※AWSを使ったサーバレスとは上記のようなサービスを使う、ということの他にEC2やRDSを使わ無い。という考え方もあるようです。
<br>
#サーバレスのメリット

・サーバの管理が不要
セキュリティのアップデートやバックアップ、容量可変など、サーバ保守が不要になる。
もちろん構築も不要。

・コストパフォーマンスに優れている
管理が不要になる分、人件費もその分カットされ、尚且つサーバレスはプログラムの処理が必要な時だけ動作させることができます。AWSなども利用料で課金されるので必要な時だけ動作するこの仕組みは非常にコストパフォーマンスに優れていると言えます。

これだけ見ていると、サーバレスってインフラ屋さんがいなくても大丈夫なのでは？と思ってしまうのですが。

例えば、短期的なキャンペーンサイトを作らなければならないとなった場合。
まずサーバの手配をしなければなりません。
ほぼ静的なサイトなので、サーバレス程度の基盤で十分。時間もコストもかけずに環境を用意したい。
サーバレスなんてどうだろう？
でも一体サーバレスな環境ってどうやって用意するの？

といった時に何も気にせずサーバレスの環境を提供してもらえたら嬉しいですよね。
こういうサービスを提供するのもインフラ屋さんのお仕事だと思っています。

もちろんサーバレスを提供する上でのコストも抑えられているので、お客様にも低価格で
サーバレス環境を素早く提供することが可能になります。
また、実際利用してみるとサーバレスでは不十分という場合にも、他のサービスを組み合わせて最適な環境を作り出すお手伝いができます。


#所感
この記事を書くまでも色々なサイトを調べ、やっとまとまってきた感じなのですが、それでもまだほわーーんとしている状態です(笑)

どの方も述べられているのが、サーバレスとはまだ未発達の分野であり、決まった定義がないということ。

オンプレミス→クラウド→サーバレス

と時代はどんどん変化していますが、変化する一番の要因はより時間とコストをかけず、
いかに楽に柔軟に運用できるか、ということ。
そしてその変化のスピードが速いのもこの業界ならでは。


インフラってあるのが当たり前であり、動いているのが当たり前。
はっきり言ってエンドユーザにとっては全く意識されていない裏の世界。
だからこそそこに従事しているエンジニアが少しでも楽をして、尚且つ更に＋αのサービスを作り出すことができるようになればいいですよね。
その上でサーバレスアーキテクチャというものが今注目されているのかな、と。
C++ Builder XE4, 10.2 Tokyo > TStringGrid > Classic表示にする > DrawingStyleオプション: gdsClassic

```txt:動作環境
C++ Builder XE4
Windows 7 Pro (32bit)
RAD Studio 10.2 Tokyo Update 2 (追記: 2017/12/28)
```

TStringGridのセルの枠が見えにくい。

http://stackoverflow.com/questions/28107621/how-to-change-the-color-of-tstringgrid-grid-lines
によると、`DrawingStyle`オプションを変更することで、昔(C++ Builder 6?)のスタイルに戻せるとのこと。

```Unit1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::B_toClassicClick(TObject *Sender)
{
	StringGrid1->DrawingStyle = gdsClassic;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::B_toThemedClick(TObject *Sender)
{
	StringGrid1->DrawingStyle = gdsThemed;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::StringGrid1Click(TObject *Sender)
{

}
//---------------------------------------------------------------------------
```

### Themed

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/6734b087-5828-f4b9-b4a8-1a9e11b76fce.png)

### Classic

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/f8da4d87-c3d4-237b-28a1-bd90b821692e.png)
Spark on EMRからGoogle Cloud Storageに接続する

基本的には[公式の手順](https://cloud.google.com/hadoop/google-cloud-storage-connector)どおりに設定するだけですが、EMRの場合はcore-site.xmlなどはクラスタ作成時にパラメータ渡していじります。

また今回、gcs-connector, credentialsの配置はbootstrap actionでやりました

以下、手順のメモ

## 環境

- emr-5.4.0
- Spark 2.1.0
- Hadoop 2.7.3

## 1. アプリの用意

アプリを`sbt assembly`して、できたjarを`s3://<your-bucket>/path/to/app.jar`に置いておきます

ここでは以下のサンプルアプリを使います

- https://github.com/ocadaruma/spark-gcloud-example

## 2. credentialの用意

- Google Cloud Platformのコンソールからサービスアカウントを作成し、p12形式のキーを落としておく
  - json形式は使えないっぽい
- キーは`s3://<your-bucket>/path/to/credentials.p12`に置いておきます

## 3. EMRクラスタの起動

bootstrap actionとconfigurationを設定して、クラスタを起動します

### bootstrap action

```bash:bootstrap.sh
#!/bin/bash

cd ~
wget https://storage.googleapis.com/hadoop-lib/gcs/gcs-connector-latest-hadoop2.jar
aws s3 cp s3://<your-bucket>/path/to/credentials.p12 .
```

### configuration

```json:configuration.json
[
    {
        "Classification": "core-site",
        "Properties": {
            "fs.gs.impl": "com.google.cloud.hadoop.fs.gcs.GoogleHadoopFileSystem",
            "fs.AbstractFileSystem.gs.impl": "com.google.cloud.hadoop.fs.gcs.GoogleHadoopFS",
            "google.cloud.auth.service.account.enable": "true",
            "google.cloud.auth.service.account.email": "example@<your-account>",
            "google.cloud.auth.service.account.keyfile": "/home/hadoop/credentials.p12",
            "fs.gs.project.id": "<your-gcp-project-id>"
        }
    },
    {
        "Classification": "hadoop-env",
        "Configurations": [
            {
                "Classification": "export",
                "Properties": {
                    "HADOOP_CLASSPATH": "\"$HADOOP_CLASSPATH:/home/hadoop/gcs-connector-latest-hadoop2.jar\""
                }
            }
        ]
    }
]
```

## 4. ジョブを流す

以下のようなカスタムJARステップを追加してみます

- jar:

`command-runner.jar`

- 引数:

```
spark-submit --deploy-mode cluster \
  --class com.example.Main \
  --master yarn-cluster \
  --conf spark.jars=/home/hadoop/gcs-connector-latest-hadoop2.jar \
  s3://<your-bucket>/path/to/app.jar \
  100 gs://<your-gcs-bucket>/output
```

- GCSに結果が出力されていることを確認します
monoDevelopショートカットメモメモ

ショートカットキーってコマンド覚えなくちゃいけないし、忘れちゃうし、思い出してるうちに遅くなるし
とか思ってました。ごめんなさい。

最近ショートカットの魅力に気づきました。社会人2年目です。
ショートカットもまだまだ身についていないので備忘録として投稿

##monoDevelopで使えるショートカットまとめ
- コードスニペット

**予約語(if,foreach,~~任天堂~~switchとか)入力してTabキー2回**

```
if ()
{

}
```
コードスニペット知るまでいつも↑手で書いてました。はい。

- リファクタリング

**command + R**
これ先輩に教えてもらってたのですが、右から左へ抜けてました。(先輩すみません)
ただ、やっぱり使う時がくるんですよね。
右クリックしてリファクタリングするようになりましたが、それでもやっぱり手間になるのでこのショートカットは是非覚えたい！！いや、覚える！！

- 短形範囲選択

**Option + マウスドラッグ選択**
こんなショートカットがあったなんて・・・。
2,3行直したい時はいつも一つ一つ直してました。

###まとめ
ご参考にさせていただいたブログです。↓
http://ameblo.jp/chicktack123/entry-11759956028.html
動き付きなのでとってもわかりやすいです。

今回は主に使いそうなショートカットの備忘録。
もっと他にもショートカットはあるし、使う時が来たらまた備忘録書こうかなと。
swaggerの仕様の確認にOpenAPISpecのrepositoryのjsonschemaを信用しない方が良い

swaggerの仕様の確認にOpenAPISpecのrepositoryのjsonschemaを信用しない方が良い。

## はじめに

swaggerのspecはOpenAPI-Specificationとして[repository](https://github.com/OAI/OpenAPI-Specification)がある。

このrepositoryの中に仕様自体の[ドキュメント](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md)もある。ところで、swagger spec(OAS)自体のjsonschemaも[ここ](https://github.com/OAI/OpenAPI-Specification/blob/master/schemas/v2.0/schema.json)に用意されているのだけれど。これがメンテされてなくて信用できないという話

## nullableについて

nullを許容するschemaをどのように書くかという話がある。このあたりの話は以下のissueを見るとわかる

- [add "null value support" in spec? · Issue #229 · OAI/OpenAPI-Specification](https://github.com/OAI/OpenAPI-Specification/issues/229)

結論から言うと以下の様になっている。

- OAS2.0(swagger spec)において、nullを許可する値の指定を行う方法は用意されていない
- (jsonschemaのsubsetと言われているものの、jsonschemaでnullを許可する方法自体はswagger spec的には正しくない)
- 幾つかのswagger用のパッケージでは `x-nullable` という属性を利用している

### jsonschemaでnullを許可する方法

通常は以下の様に書く。typeに配列を指定するかoneOfを使う。

```yaml
nullableString:
  type:
    - string
    - null
nullableString2:
  oneOf:
    - type: string
    - type: null
```

これらの方法はswagger的には良くないらしい。通常、jsonschemaではtypeの属性には配列を指定できるのだけれど。swaggerでは許していない。そもそもtypeにnull型が存在しないらしい(だからといってstringがnullも含んでいるというわけではない)。

しかもこれらがつらいのは、typeに配列を指定する方法が許可されないというのが実際の仕様には明記されていないものの暗黙の了解として存在するものだったりするところ(先程あげたissueを読むと書いてあったりする)。

ちなみに[次のバージョンの仕様(OAS3.0)](https://github.com/OAI/OpenAPI-Specification/blob/OpenAPI.next/versions/3.0.md#data-types)ではnullは使えないということが明記される様になった。

まとめると

- swaggerに `type=null` は存在しない
- swaggerに oneOf は存在しない
- swaggerでは typeに配列を書くことを許可していない

ということになるはずなのだけれど。冒頭であげたjsonschemaはメンテされていないので[ただただjsonschemaのtypeへのリンク](https://github.com/OAI/OpenAPI-Specification/blob/master/schemas/v2.0/schema.json#L1015-L1017)になっているし。つまるところnullも存在すれば配列での指定も許されるというようになっている。以下のような定義なので。

```json
{
  "definitions": {
        "type": {
            "anyOf": [
                { "$ref": "#/definitions/simpleTypes" },
                {
                    "type": "array",
                    "items": { "$ref": "#/definitions/simpleTypes" },
                    "minItems": 1,
                    "uniqueItems": true
                }
            ]
        },
        "simpleTypes": {
            "enum": [ "array", "boolean", "integer", "null", "number", "object", "string" ]
        },
  }
}
```

ちなみにOAS3.0からはnullableという属性が新たに追加された。 `nullable=true` だとnull許可ということになる。こういう感じ。

```yaml
definitions:
  nullableString3:
    type: string
    nullable: true
```
二変量正規分布

二変量正規分布を発生させたい

```math
\begin{equation}
  \begin{pmatrix}
    x \\
    y
  \end{pmatrix}
  = N
  \begin{pmatrix}
    \begin{pmatrix}
      \mu_x\\
      \mu_y
    \end{pmatrix}
    _,
    \begin{pmatrix}
      \sigma_x^2 & \rho\sigma_x\sigma_y \\
      \rho\sigma_x\sigma_y & \sigma_y^2 \\
    \end{pmatrix}
  \end{pmatrix}
\end{equation}
```

まず、$x=N(\mu_x, \sigma_x)$を発生させる。つぎに、xを固定してyを発生させれば良い。この時のyの条件付き分布は

```math
y|x \sim N(\mu_y + \rho\frac{\sigma_y}{\sigma_x}(x-\mu_x), (1-\rho^2)\sigma_y^2))
```

で与えられる。

pyhonで実装すると

```py3:python3
import numpy as np
import matplotlib.pyplot as plt

def MVNORM(mu_x, sigma_x, mu_y, sigma_y, rho, N=1):
  x = np.random.normal(mu_x, sigma_x, N)
  y = np.random.normal(mu_y + rho*sigma_y/sigma_x*(x-mu_x), np.sqrt((1-rho**2)*sigma_y**2), N)
  return([x,y])

#平均0、標準偏差9のxと相関係数0.9で相関のある平均3で標準偏差3のyを1000個発生させる
MV = MVNORM(0, 9, 3, 3, 0.9 ,1000)

plt.scatter(MV[0], MV[1])
plt.show()

SUMMARY = (np.mean(MV[0]), np.std(MV[0]), np.mean(MV[1]), np.std(MV[1]))
print("mean X: {0[0]:0.2f}, stdev X: {0[2]:0.2f}, mean Y: {0[1]:0.2f}, stdev Y: {0[3]:0.2f}".format(SUMMARY))
```
![image](https://qiita-image-store.s3.amazonaws.com/0/145593/764ff24c-e580-bfa1-97f9-b82fd8535cea.png)

```
mean X: 0.14, stdev X: 9.09, mean Y: 2.99, stdev Y: 3.08
```
テストへのリソース配分

# これなに
あなたは、ソフトウェアの試験担当です。ソフトウェアは、4つのモジュールでできています。
また、テストは、A,B,C,D,E の5つのカテゴリに分かれています。

さて、あなたは、どのカテゴリのテストをどの割合でやるかを決めなければいけません。

# 方針
過去の経験から、モジュールとテストの相関が表Aで与えられているものとします。
このとき、各テストを割合 $p$ で実施したとき、モジュール1 での障害の発見確率は、$A_1 \cdot p$で求められるものとします。

# データ作成
乱数で表Aを作ります。

```py3:python3
import numpy as np, pandas as pd
from pulp import *
from ortoolpy import addvar, addvars
np.random.seed(4)
nm, nt = 4, 5 # モジュール数、テスト数
A = pd.DataFrame(np.maximum(np.random.normal
     (-0.05,0.2,(nt,nm)), np.zeros((nt,nm))),
     columns=['モジュール%d'%(i+1) for i in range(nm)],
     index=['テスト%s'%chr(i+65) for i in range(nt)])
print(A)
```

<table>
  <thead>
    <tr style="text-align: right;">
      <th>発見確率</th>
      <th>モジュール1</th>
      <th>モジュール2</th>
      <th>モジュール3</th>
      <th>モジュール4</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>テストA</th>
      <td>0.000000</td>
      <td>0.049990</td>
      <td>0.000000</td>
      <td>0.088720</td>
    </tr>
    <tr>
      <th>テストB</th>
      <td>0.000000</td>
      <td>0.000000</td>
      <td>0.000000</td>
      <td>0.069715</td>
    </tr>
    <tr>
      <th>テストC</th>
      <td>0.016450</td>
      <td>0.000000</td>
      <td>0.073734</td>
      <td>0.000000</td>
    </tr>
    <tr>
      <th>テストD</th>
      <td>0.035014</td>
      <td>0.016451</td>
      <td>0.000000</td>
      <td>0.020199</td>
    </tr>
    <tr>
      <th>テストE</th>
      <td>0.000000</td>
      <td>0.259396</td>
      <td>0.094668</td>
      <td>0.000000</td>
    </tr>
  </tbody>
</table>

# 計算その1
全体の総和を最大化するように、Pythonで計算してみましょう。

```py3:python3
m = LpProblem(sense=LpMaximize) # 数理モデル
x = addvars(nt) # 変数(テストの割合)
m += lpDot(A.sum(1),x) # 目的関数
m += lpSum(x) == 1
m.solve()
r = np.vectorize(value)(x)
print('%s 総和 %.4f 最低 %.4f'%(LpStatus[m.status],
    r.dot(A.values).sum(), r.dot(A.values).min()))
for i,v in zip(A.index,r):
    print('%sの作業量 %.4f'%(i,v))
>>>
Optimal 総和 0.3541 最低 0.0000
テストAの作業量 0.0000
テストBの作業量 0.0000
テストCの作業量 0.0000
テストDの作業量 0.0000
テストEの作業量 1.0000
```

最も効率のよいテストEだけやるという結果になりました。

# 検討
テストEでは、モジュール1とモジュール2の障害を発見できません。
品質保証とは、ある最低ラインの品質を担保するものと考えられます。

![image](https://qiita-image-store.s3.amazonaws.com/0/13955/4c7abcf5-9241-a2cd-ae43-521c9180a1c0.png)

「計算その1」では、赤の分布のように平均的な品質が上がるようにテストをしますが、低品質になる可能性を残しています。
「計算その2」として、青の分布のように平均的な品質を上げるのではなく、低品質を避けるようなテストを考えてみましょう。

# 計算その2
モジュールごとの品質の最小値を最大化するように、計算してみましょう。

```py3:python3
m = LpProblem(sense=LpMaximize) # 数理モデル
x = addvars(nt) # 変数(テストの割合)
y = addvar() # 変数(最低ライン)
m += y + lpDot(A.sum(1),x)*0.01 # 目的関数
m += lpSum(x) == 1
for j in range(nm):
    m += y <= lpDot(A.ix[:,j],x)
m.solve()
r = np.vectorize(value)(x)
print('%s 総和 %.4f 最低 %.4f'%(LpStatus[m.status],
    r.dot(A.values).sum(), r.dot(A.values).min()))
for i,v in zip(A.index,r):
    print('%sの作業量 %.4f'%(i,v))
>>>
Optimal 総和 0.0948 最低 0.0237
テストAの作業量 0.1434
テストBの作業量 0.0000
テストCの作業量 0.2838
テストDの作業量 0.5435
テストEの作業量 0.0293
```

その1と比べて、総和は下がりましたが、最低が上がりました。

この考え方は、「[組合せ最適でゲーム理論を解く](http://qiita.com/SaitoTsutomu/items/eeb19fc086640562513e)」と同じものです。

以上
Cognos Analyticsでの「クリップボードにレポートをコピー」

##概要
Cognos Analyticsになって、Report Authoringの色々なメニューが、レポートの機能の色々な場所に散らばってしまったため、苦戦している方も多いですが、最も多く質問を受けるのが「クリップボードにレポートをコピー」はどこに行ったのか、という質問ですので、この際投稿しておきます。

##内容
こちらになります。
画面はCognos Analytics 11.0.6のものですが、左の黒帯の「ページ」アイコンをクリックし、「レポート」の文字の上で右クリックすると、このメニューが表示され、「クリップボードにレポートをコピー」「クリップボードからレポートを開く」が見つかります。
![001.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/ba940b28-d4e6-2f82-2656-bfecfe42e694.png)

##参考
Cognos Analytics 11.0.5ベースですが、Cognos 10 BIとの機能マッピング一覧をここに置いてますので、ご活用下さい。

**Cognos 10 BI と Cognos Analyticsの機能マッピング一覧**
http://qiita.com/shinyama/items/484dc322c3cbdb2cda63
X Window System用の6000番ポートを開けっ放しにする

## はじめに
以前書いた記事で、リモートのXサーバにウィンドウを飛ばす方法を紹介しました。
(http://qiita.com/kkk627/items/8db34266722488eae412)
この記事では、デフォルトでは開いていない6000番ポートを、Xサーバを起動し直すことによって開ける方法を紹介しました。

今回は、前回の記事では紹介しなかった「X Window System用の6000番ポートが開いた状態をデフォルトにする」ための方法を紹介します。
(**今回紹介する方法はCentOS7でGNOMEを利用している場合の設定です。**他のディストリビューションやKDEを利用している場合は、設定方法が異なります。)

あまりおすすめはしませんが、Xの通信をよく使うというのであれば、ポートを開きっぱなしにすると手間が省けて楽です。

**・注意点**
前回の記事にも書きましたが、**6000番ポートが開いていない状態がデフォルトになのはセキュリティ上の理由からです。**
6000番ポートが開きっぱなしになっていると、外部からディスプレイを操作されたり、スクリーンショットを撮られたりする危険があります。これを防ぐために、デフォルトでは6000番ポートを閉じているのです。
**敢えて6000番ポートを開きっぱなしするというのは、セキュリティ上のリスクが非常に高まりますので、以下の設定を行った際にはくれぐれも注意してください。**家庭内LAN等の安全なネットワーク内での利用をおすすめします。(何かしらのトラブルが起こっても、当記事の筆者は責任を負いかねます)

## 設定の手順
#### 1. /etc/gdm/custom.confを書き換える
/etc/gdm/custom.confはgdm (GNOME Display Manager) の設定ファイルです。このファイルの中身は、デフォルトだと以下のようになっています。

```text:/etc/gdm/custom.conf
# GDM configuration storage

[daemon]

[security]

[xdmcp]

[greeter]

[chooser]

[debug]

```

このファイルを、次のように書き換えます。

```text:/etc/gdm/custom.conf
# GDM configuration storage

[daemon]

[security]
DisallowTCP=false
[xdmcp]

[greeter]

[chooser]

[debug]

```

DisallowTCPをfalseに設定することで、Xサーバが起動する時の--nolisten tcpオプションが無効になります。

#### 2. ファイアウォールの設定をする
ファイアウォールの設定を変えてポートを開けるのも忘れずに。

```bash
$ sudo firewall-cmd --add-port=6000/tcp --permanent
$ sudo firewall-cmd --reload
```

**注意**
利用するディスプレイ番号が0以外の場合は、(6000+ディスプレイ番号)番のポートが使われますので、適切な方を開いてください。('echo $DISPLAY'のコマンドで確認できます)
例えば、ディスプレイ番号が2なら開けるべきポートは6002番です。

#### 3. PCを再起動する
/etc/gdm/custom.confの内容は再起動しないと反映されません。

#### 4. xhostの設定をする
Xのアクセス制御を行うxhostの設定も必要です。以下のどちらかのコマンドでxhostの設定を変更します。
(**xhostの設定は再起動するとリセットされるので、起動時には毎回必要です**)

```bash
$ xhost +(IPアドレス or ホスト名)　　   # 指定したホストからのXの通信を許可する
$ xhost +　　　　　　　　　　　　　　　 # アクセス制御をすべて無効にする
```

#### 5. 動作確認
設定がうまくいっているかチェックします。以下のコマンドによって、xeyesがちゃんと表示されれば成功です。

```bash
$ xeyes -display (設定したPCのIPアドレス or ホスト名):0
```

netstatでポートが開いているかを確認する方法もあります。

```bash
$ netstat -anp | grep 6000
```

## おわりに
繰り返しますが、セキュリティ的にリスクの高い方法ですので、利用する場合は注意してくださいね。
phpstorm チートシート

phpstorm使っているんのですが使いこなせている気がしないので適宜調べた内容をメモしていきます。
mac用ですのであしからず。

shift+cmd+fで全体検索

cmd押しながらクリックで定義元に飛べる

alt+矢印で単語移動

ctrl + l で指定した行に遷移できる
Cognosレポートの古いバージョンへの移行

##概要
Cognos BIのレポートを他の環境に移行する際に、Report Authoringのツールメニューで、「クリップボードにレポートをコピー」でレポートの定義をXML形式でクリップボードに出力し、移行先の環境で「クリップボードからレポートを開く」をやると、レポートが移行できると思います。
![001.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/12e6974f-1e48-937e-d598-e5b01423f643.png)

しかしながらこの移行は、
・同じバージョン同士
・古いバージョン→新しいバージョン
であればできますが、
・新しいバージョン→古いバージョン
ではそのままではエラーとなります。

この場合のバージョンとは、Cognos 10であれば、10.1～10.2.2の間の話で、Cognos 10 → Cognos 8の話ではないのでご注意ください。

10.2.2のレポートのXML定義を、上記の手順で10.1.1で開こうとするとエラーになりますので、そういう場合の対処方法です。

##手順
Report Authoringで「クリップボードにレポートをコピー」するとクリップボードにXML定義がコピーされますが、メモ帳に貼り付けるとこんな感じに見えます。
そして赤枠で囲っている箇所に、Cognosのバージョンが記載されています。
![002.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/e85b731f-9cce-389a-4d4e-aefee76e0d9c.png)

バージョンの対応は、以下になります。
12.0 - Cognos 10.2.2
11.0 - Cognos 10.2.1 (Fix Pack 1 or above)
10.0 - Cognos 10.2.1 (no Fix Pack)
9.0 - Cognos 10.1.1
8,0 -Cognos 10.1.0

後はこのバージョンの記載を書き換えてしまう、というのが手順になります。
Cognos 10.2.2 → 10.1.1に移行したい場合は、12.0を9.0に書き換えて、メモ帳の内容を"Ctrl + A" → "Ctrl + C"でコピーして、Cognos 10.1.1の環境で「クリップボードからレポートを開く」をします。

元ネタはこちらです。
Technoteには、Cognos 8の場合の手順も記載されていますので、必要に応じて参照してください。
**Can a report be 'downgraded' to run in a previous version**
http://www-01.ibm.com/support/docview.wss?uid=swg21454437
Serverspec書き方

## 概要
Serverspecの書き方メモ。随時追加します。

## 関連記事
[Serverspec環境構築手順](http://qiita.com/Esfahan/items/2c80f84a7ea3f71f5037)

## 書式
### service起動評価

```rb
describe service('nginx') do
  it { should be_enabled }
  it { should be_running }
end
```

### fileの中身評価

```rb
describe file('/usr/local/nginx/conf/nginx.conf') do
  text = 'server_name 192.168.33.10;'
  # should match /server_name\ 192\.168\.33\.10;/
  its(:content) { should match /#{Regexp.escape(text)}/ }
  # should match "server_name 192.168.33.10;"
  its(:content) { should match text }
end
```

### command実行結果評価

```rb
describe command('curl -L http://xxxx.com') do
  # should match /"status":201/
  its(:stdout) { should match /#{Regexp.escape('"status":200')}/ }
  # should match "\"status\":201"
  its(:stdout) { should match '"status":200' }
end
```

### commandを叩くだけ（結果は評価しない）

```rb:spec/sample_spec.rb
require 'spec_helper'

stdout = Specinfra.backend.run_command('ls').stdout.strip
puts stdout
```

## 参考
[serverspecのリソースタイプ・マッチャー](http://qiita.com/ando-masaki/items/e02960789c7a4e0c4d20)
並べ替え用の配列定数と宇宙船演算子でソートがとてもやりやすい

## 前提条件

- 並べ替え用のオーダーが設定ファイルなどで定義されている
- オーダーの降順に並び替える
- 順序未定義の物は最後へ

### 旧石器時代（5.3あたり）

```php
$order = array('hoge' => 3, 'fuga' => 2, 'foo' => 1);
$arr   = array('foo', 'hoge', 'baz', 'fuga');
usort($arr, function($a, $b) use($order) {
  // オーダーが存在しなければ-1にする
  $a = isset($order[$a]) ? $order[$a] : -1;
  $b = isset($order[$b]) ? $order[$b] : -1;

  if ($a < $b) {
    return 1;
  } elseif ($a > $b) {
    return -1;
  } else {
    return 0;
  }
});
var_dump($arr);
// array(4) {
// [0]=>
// string(4) "hoge"
// [1]=>
// string(4) "fuga"
// [2]=>
// string(3) "foo"
// [3]=>
// string(3) "baz"
// }
```

### 現代

```php
const ORDER = ['hoge' => 3, 'fuga' => 2, 'foo' => 1];
$arr = ['foo', 'hoge', 'baz', 'fuga'];
usort($arr, function($a, $b) {
  return (ORDER[$b] ?? -1) <=> (ORDER[$a] ?? -1);
});
var_dump($arr);
// array(4) {
// [0]=>
// string(4) "hoge"
// [1]=>
// string(4) "fuga"
// [2]=>
// string(3) "foo"
// [3]=>
// string(3) "baz"
// }
```

## まとめ

### 配列 `[]`
PHP5.4からシンプルに書けるように。

### 定数定義 `const`
PHP5.6から定数に配列が利用可能に。
※define定数も7.0以降は配列定数の定義が可能です。

### クロージャに変数を引き継ぐ `use`
PHPではクロージャ外の変数をバインドするのに `use($hoge)` を使う必要があります。
JavaScriptから比べるとちょっとめんどい。
なので現代版はグローバルスコープの定数を使用して回避しています。
今回は簡易化のためにクラスにはしていませんがクラス内で `const` 定数を使えば、スコープがクラス内に限定されるので使い勝手がいいです。

### 宇宙船演算子 `<=>`
PHP7.0から導入。
比較処理のために作られたような演算子。a>bなら1、a<bなら-1、a=bなら0を返す。

### null合体演算子 `??`
PHP7.0から導入。
nullならデフォルト値を使用するよくある処理を簡単に書ける。
dynamoのupdateItemで条件付き加算処理をやろうとしたらハマったメモ

- updateItemで属性値を加減算したい
- レコードがない時は新規追加にしたい

ということをやろうとして色々ハマって頑張った割に使わなくなったので実装例を備忘録に残します。

やろうとしていることは「updated_atが更新されている場合はidのレコードのvalue++、更新時刻も更新する」です。


```js
function test_add(table_name, id, updated_at)
        return new Promise(function(resolve, reject) {
            const params = {
                Key: {
                    _id: {S: id},
                },
                UpdateExpression: 'SET value = if_not_exists(value, :zero) + :one, updated_at = :updated_at',
                ConditionExpression: 'attribute_not_exists(updated_at) OR updated_at < :updated_at',
                ExpressionAttributeValues: {
                    ':updated_at': {N: updated_at},
                    ':zero': {N: '0'},
                    ':one': {N: '1'},
                }
                TableName: table_name
            };
           　　const dynamodb = new AWS.DynamoDB({region:regionId});
            dynamodb.updateItem(params, function(err, data) {
                if (err) return reject(err);    // an error occurred
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　else     return resolve(data);
            });
        });
```
主にidに対応するレコードがない場合に、

- UpdateExpression内で、ADDとSETは混在できない(※エラーで弾かれただけでよく読んでないんですが、ホントにだめなんですかね…)
- よってインクリメントの方もSETで書く必要がある
- インクリメント時に更新する元の属性値を引っ張ろうとした時に if_not_exists() でデフォルト値を書いてないと「そんな属性無いよ」と怒られる
- 更新条件の前に attribute_not_exists()　OR　... がないと「そんな属性無いよ」と怒られる

ので、こんな対応が必要になりました。
【HTML5学習】Part.2 -htmlとは-

2回目の投稿です＾＾
1回目は自己紹介がメインになりましたが、ここからは自分が学んだことをメモのような感じで書いていこうと思います。

#HTML とは#

Hyper Text Markup Language の略。
ウェブページなどを作るために必要な技術。
**Markup=文章中のこの箇所はこういう意味だと書いていくための方法**で、構造的な文書を書くことができる。
綺麗なウェブページを作るには、HTML(構造的な文書) + CSS(見た目)　が必要。

#####仕様 : #####
[w3c](https://validator.w3.org/) という団体が策定している。
([caniuse.com](http://caniuse.com/):どの機能がどのブラウザに対応しているかを調べられすサイトが便利！)


#####基本的な用語 : #####
- 要素
- 属性

書き方 :

**<開始タグ>**テキスト**</終了タグ>**

**<開始タグ 属性名＝"値">**テキスト**</終了タグ>** 　 

＊複数の属性をつけることも可能＊

HTMLではよくタグを**入れ子(要素を要素で囲む)**構造にしていく。
入れ子にする際、**親子構造(囲む方を親要素、囲まれる方を子要素)**
を分かりやすくするために**字下げ(=インデント)**をしておくこと。
Tab もしくはスペースキーで字下げ


####全体構造 : ####

```
<!doctype html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<meta name="viewport"
		  content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
	<meta http-equiv="X-UA-Compatible" content="ie=edge">
	<title>Document</title>
</head>
<body>

</body>
</html>
```


**<!DOCTYPE html>** : 「今からhtmlを書いていきます」という文章宣言のこと。決まり文句なので必ず入れる。

**&lt;html&gt;&lt;/html&gt;** : 基本的にこのhtml要素で&lt;head&gt;や&lt;body&gt;などを囲って書いていく。

**lang=”ja”** : 日本語で書いていきますという意味。

**&lt;head&gt;&lt;/head&gt;** : タイトルや著者名など、ページに関する情報を書く。
＊webページには表示されない＊

① 文字コードの指定 : **&lt;meta charset=”utf8”&gt;** 文字化けを防ぐコード。
② ページタイトルの設定 : **&lt;title&gt;〇〇〇&lt;/title&gt;**　ブラウザのタブ上の表示される。
③ CSSの読み込み : **&lt;link rel=”stylesheet” href=”  .css”&gt;**  HTMLからCSSを読み込むために必要。

**&lt;body&gt;&lt;/body&gt;** : 本文など実際に表示したい内容を書いていく。
＊ブラウザに表示されるのは&lt;body&gt;内容のみ＊




-----------------------------------------------------------------------

今回はここまで。
次回はbody内に書いていく要素たちについて書いていこうと思います。
では！
自己紹介 



#自己紹介#

Qiita初投稿、そしてプログラミング初心者の@s0sdfaaeです。
簡単に自己紹介を、愛媛県出身　今月から大阪:airplane:神奈川に越してきた、社会人６年目女性。
今月より、営業部からクリエイティブ事業部に異動しまして、フロントエンドエンジニアとして在職しています。

がしかし、フロントエンド？プログラミング？・・・全くの初心者でして、そんな肩書きを名乗るには程遠く、現在勉強中です:sweat_drops:

それまでは何をしていたかというと、服飾の専門学校を卒業し、20歳でアパレル販売員として就職。
４年弱働きましたが、自分には他にどんなことができるのだろう？と考え転職を決意。

そしてちょうど１年前に現在の会社に就職したのですが、先月までは大阪支社の別の事業部、アウトバンドのテレアポ営業をしておりました。

もともと、クリエイティブ系の仕事に興味はありましたが、縁がなく、このまま営業としてやっていくのかと考えていた時に、タイミングよく社内公募があり、恵比寿支社に異動、現在に至ります。



#どうやって勉強しよう？#

異動してちょうど２週間が経ちましたが、まだまだ知識は皆無と言っていいほど。
フロントエンドエンジニアになるにはまず何から勉強すればいいの？ここから始まりました。
まず、ネットで
- HTML とは
- CSS とは
を調べることから。

##学習サービス##

現在お世話になっている、初心者でも分かりやすいオンラインプログラミングサービスです。

- **[Progate](https://prog-8.com/)**

初心者でも気軽ににプログラミングが学習できるサービスです。
スライドで分かりやすく説明しつつ、実際にコードを書きながら進めていきます。

- **[ドットインストール](http://dotinstall.com/)**
 
こちらはコードを書いて進めるのではなく、３分間の動画を見ていくことで学習するサービスです。


まずは、この2つを使って**HTMLとは？CSSとは何ぞや？**を知ることから始めました。


##これから##
今後は自分用のメモとして、また、これからプログラミングをやってみようという方の参考に少しでもなれば...ということで、連載という形で投稿していこうと思います。
これを見てくださったみなさま、知識不足で間違いも分からないことも多々あると思いますが、アドバイスいただけると嬉しいです。
よろしくお願いします:blush:
Seabornの図のサイズ変更

matplotlibのサイズ変更はよく載ってますが、seabornの日本語のモノはあまりなかったので、メモ。
jupyter notebook上で表示することを想定してます。


パッケージのバージョンは以下の通りです。
```
Python 2.7.12
matplotlib==1.5.1
seaborn==0.7.1
```

```
import matplotlib.pyplot as plt
import seaborn as sns
sns.set()
sns.set_context("notebook")
plt.figure(figsize=(20, 10))
```
デフォルトのサイズより大きくなりましたが、figsizeに入れる数値と図の大きさに関連がないので、もう少し調べたいです。
ド素人がAWSにRuby on Railsを導入したメモ

#はじめに
いい加減見るだけでなくなにかしら自分用にでもいいからアウトプットしてみようと思ったので書いてみました｡
いままで非エンジニアとしてしかやってこなかった自分が軽い気持ちで手を出しているので､そもそも理解できてない部分が多い上に無駄な工程､逆になぜそこを書かないんだ的なところもどっさりあるかと思います｡
(一応､自分のWindows10PCに仮想環境あり､PHPとかjQueryとかMysqlとかほんの触り程度に知っているくらいですが超初級レベルです｡)

#参考にした記事とやったこと
- [ruby 2.3.1をCentOS7に導入する。](http://qiita.com/Fendo181/items/d14ebfb148223c8e5ecb)
当初yumだけで導入しようとしたら､rubyのバージョンアップ方法がわからなかったのでこちらを参考にしてrbenvを利用しました

- [rbenvとruby-buildインストール時に no such command `install' が出た原因と対処法](http://yucatio.hatenablog.com/entry/2016/05/13/000740)
タイトル通りひっかかったので参考にリポジトリ入れ直し｡コマンドラインのみだったのでちょっと手こずった(自分のせい)

- [[Rails 5] rbenvでRubyをインストールして新規Rails開発環境を準備する](https://techracho.bpsinc.jp/hachi8833/2016_12_13/30751)
rehashは要らないらしい

- [Amazon LinuxにRubyの実行環境を構築してみる](http://dev.classmethod.jp/etc/amazon-linux_rbenv/)
やっとRubyを入れられる!と思いきや｢コンパイラが～｣と言われたのでこちらを参考に
`$ sudo yum update`
`$ sudo yum install git gcc openssl-devel`


- [さくらVPS（CentOS 6）にrbenvでRubyをインストール](http://qiita.com/c8112002/items/c07083e1726c424e3666)
今度はreadlineが要るぞと言われたのですが権限でひっかかりこちらを参考｡sudoすら思いつかないって･･･(^ω^)
`$ sudo yum -y install readline-devel
`

#導入できました!
その後､rubyは入ってるのに
`$ ruby -v`
が効かなくてrehashも結局試したけどだめだったので一度接続しなおしたらバージョンが表示されました｡導入できたようです｡ヤッタネ!

#今後の課題とか所感

**Railsをインストールするディレクトリ**
何も考えずec2-user直下にインストールしたがこれで果たして良かったのか･･･
まだ何もいじっていないのでわからんですがちゃんと調べてから導入したほうがいいなと後から感じました｡

**開発環境に慣れる**
これから仕事で使うことになるので否が応でも慣れるしかない･･･まずは何ができて何ができないのかを理解するところからですかね｡

**まとめるのって難しい!**
今回こうして書いてみたら思っていた以上に書き起こすのが難しかったのと､Markdown方式できれいな記事に仕上げるのもなかなか至難の技だということがわかりました｡
あとはいろんな人の記事をもっと読んで､また自分が書こうと思ったときに書いてぼちぼち慣れていければなと思います｡
CSSだけでAmazonダッシュボタン風のLED点滅を行う

仮想のAmazonダッシュボタン的なWEBアプリを作っている過程で、CSSだけで[Amazon Dashボタン](http://amzn.to/2nFW3QS)風のLED点滅ができたので共有。

##サンプル
こんな感じで使っています。
![safe_image.gif](https://qiita-image-store.s3.amazonaws.com/0/157770/6d286bf4-398c-893b-65d5-989d61b628de.gif)

##CSS

```css:ledblink.css
 span.ledblink {
	display: block;
	width: 8px;
	height: 8px;
	background-color: rgb(180,180,180);
	box-shadow: inset 0px 1px 0px 0px rgba(250,250,250,0.5), 0px 0px 3px 2px rgba(100,100,100,0.5);
 	border-radius: 4px;
}
span.ledblink.on {
	background-color: rgb(255,255,255);
	box-shadow: inset 0px 1px 0px 0px rgba(250,250,250,0.5), 0px 0px 3px 2px rgba(187,187,187,0.5);
	animation: blinkWhite 0.9s infinite;
}
@keyframes blinkWhite {
    from { 
      background-color: rgb(180,180,180); 
      box-shadow: inset 0px 1px 0px 0px rgba(250,250,250,0.5),	0px 0px 3px 2px rgba(100,100,100,0.5);
    }
    50%  { 
      background-color: rgb(255,255,255);
      box-shadow: inset 0px 1px 0px 0px rgba(250,250,250,0.5),	0px 0px 3px 2px rgba(187,187,187,0.5);
    }
    to   { 
      background-color: rgb(180,180,180);
      box-shadow: inset 0px 1px 0px 0px rgba(250,250,250,0.5),	0px 0px 3px 2px rgba(100,100,100,0.5);
    }
}
```

#使い方

消灯

```html:sample-off.html
<span class="ledblink"></span>
```

onクラスを付けると点滅開始

```html:sample-on.html
<span class="ledblink on"></span>
```
どうがんばってもgitのcommitに含まれない場合の対処法

#前提
git 2.11.0

#本題
Swiftのプロジェクトで自作した `Resources` ディレクトリがgitに含まれていないことに気がついた。
その際に、 `.gitignore` を上から下まで見ても `Resources` に関しての記述がなかったのでどうして含まれないか謎だったのだが解決したのでメモしておく。


## そんなときは下記のコマンドを使おう！

```
git check-ignore -v path/to/missing/Resources
```
参考
http://stackoverflow.com/questions/24423067/missing-folder-in-repository-after-git-add

上記のコマンドを使用すると下記のような内容が表示される

```
/Users/[UserName]/.gitignore_global:3:Resources	path/to/missing/Resources
```

上記にあるとおりに /Users/[UserName]　に行くと　.gitignore_global　というファイルがあり、その中の３行目に
 `Resources`
って書いてありました！

該当の箇所を削除したら...ちゃんとgitに含まれるようになりました！！！！！！

#.gitignore_globalとは
なんかプロジェクトごとではなく自分の端末でgitいじる場合に必ず適用されるっぽいです。
なんでこのファイルが作成されていたかは調べたけどよくわかりませんでした...
SouceTreeを使ってるのでそれ関連かと思ったのですが違うみたいです。（SouceTreeもデフォルトで作成することがあるみたいですが、自分のものとは中身が違ったので別の原因ってことです)
ターミナルでCtrl+Shift+Vとかしたかった

CUI環境を整備してて、neovimとかfish-shellでCtrl+Shift+VとかCtrl+3使いたかった話です。

# 結論
ファンクションキーの代用とすることにして、iTerm2の設定で^3で"^[[1;2R"(F15)を送るようにした。

# 経緯
不勉強ながらただそれぞれの設定にそう書けばいいんだろうと思ってたんだけど。そうじゃないんだね。
そもそもCtrl+なんとかっていうはASCIIに含まれてて、ターミナルからコントロールキーとアルファベットキーが別々に送られるわけじゃない。ただ1バイトでぽんって送られる。

https://ja.wikipedia.org/wiki/ASCII

なんでASCIIにある範囲はいいけど、ない奴、Ctrl+3とかは何を送るかっていうのが自明じゃない。

んで1バイトに収まらない情報はエスケープコード(\e, ^[, \x1b, \033などで表される)に連ねて送るっていうルールがある。エスケープシーケンス。

https://ja.wikipedia.org/wiki/%E3%82%A8%E3%82%B9%E3%82%B1%E3%83%BC%E3%83%97%E3%82%B7%E3%83%BC%E3%82%B1%E3%83%B3%E3%82%B9

それでもCtrl+3をエスケープシーケンスでどう送るかっていうルールはないんだけど、ファンクションキーはエスケープシーケンスでどう送るっていうコンセンサスがある。

http://aperiodic.net/phil/archives/Geekery/term-function-keys.html

`infocmp xterm-256color`なんかでも見れる。

なのでCtrl+3とかはF15キーとして振る舞うようにiTerm2に設定することにした。

# 設定
iTerm2の設定＞Profiles＞どれか＞KeysのKey Mappingsで^3(Ctrl+3)の設定でActionを”Send Escape Sequence"に、Esc+を"[1;2R"

これでiTerm2から"^[[1;2R"が送られるようになった。

あとはこのシーケンスがF15であるとして共通に理解できるように各環境を設定する。

iTerm2のTerminal typeをxterm-256color
config.fishでset -x TERM xterm-256color
.tmux.confでsetw -g xterm-keys on

あたり。

これでneovimとかfishでCtrl+3(F15)が使えるようになった。ただ、fishはF21以上は使えないっぽい（ソース見たらわざわざコメントアウトしてあった)
GitHub でブラウザ閲覧中にメールアドレスなどの文字列選択をマウスでしたい

# ブラウザ閲覧中に GitHub でメールアドレスなどを選択したい
GitHub でのマークダウンによる下記のような記述で
マウス操作によりメールアドレス部分を選択(コピー)したい時になかなか難しい
(自分だけかもしれませんが)

* `abc_def@testtest.test.test` しようするメールアドレス

## マウスのドラッグによる操作で間違いにくいかもしれない手順

0. `abc` の真ん中あたりにカーソルを合わせダブルクリック(一般的な文字列選択操作)  
  ただしここで左クリックを離さないこと(マウスダウン維持)  
    * この状態では `abc_def@testtest.test.test` ではなく  
      `abc`(ブラウザによっては `abc_def` も？)が選択される
1. マウスの左ボタンを押したまま選択したい箇所まで右側にマウスをスライドさせる
    * こちらの挙動を Mac にて確認したところ、  
      選択範囲が「文字の塊」の選択が、カーソル位置ではなくマウスオーバーであるような・・・？  
      `abc` であればカーソルを `c` の右側に合わせるのではなく  
      `b` あたりに合わせても `abc` が選択されるように見える・・・

上記により期待される範囲選択が可能となる・・・はず

## 難しいと感じるポイント

* メールアドレスの開始を選択するのがむずかしい  
  さながらイライラ棒
      * これに対しダブルクリックによる選択により文字列開始を担保
      * マウスダウン時の単語選択がされるようであるので、厳密な「右端」を選択する必要もないかも？
CircleCI + Bitbucket + Laravel(PHPUnit) で自動テスト

## 環境
- CircleCI 1.0
- PHP 7.1
- Laravel 5.4
- MySQL 5.7

## やりたいこと
Bitbucket の任意のリポジトリにプッシュがある度に PHPUnit を実行し、テスト結果を表示したい。
※今回は Bitbucket だが、GitHub でもやり方はほとんど同じと思われる。

## 方法
CircleCI を使う。

## 手順
### CircleCI に登録し、Bitbucket と連携する
1. [CircleCI](https://circleci.com/) にアクセスし、`Sign UP` する
2. `Authorize Bitbucket`を押下して、Bitbucket と連携する
3. ビルドしたいリポジトリ（プロジェクト）を選択する

### circle.yml を作成する
```project-name/circle.yml
machine:
  environment:
    DB_HOST: 127.0.0.1
    DB_DATABASE: circle_test
    DB_SLAVE1: 127.0.0.1
    DB_SLAVE2: 127.0.0.1
    DB_USERNAME: ubuntu
    DB_PASSWORD:

  php:
    version: 7.1.0

database:
  override:
    - php artisan migrate --env=testing

test:
  override:
    - vendor/bin/phpunit -d memory_limit=512M
```

#### 解説
##### `environment:`
- 環境変数を設定し、元から`.env`（ここでは`.env.testing`）で設定している環境変数を上書く
    - こうすれば CircleCI でビルドされるときに、`config/database.php` に `environment:` の環境変数が適用され、コンテナ内(Localhost)のDBにアクセスされる
    - この対応をしないと `php_network_getaddresses: getaddrinfo failed: Name or service not known` などのエラーになり失敗する
    - DB名やユーザー名は CircleCI のデフォルト値

```config/database.php
'mysql' => [
            'read' => [
                'host' => [
                    env('DB_SLAVE1', ''),
                    env('DB_SLAVE2', ''),
                ],
            ],
            'write' => [
                'host' => env('DB_HOST', ''),
            ],

            'driver' => 'mysql',
            'host' => env('DB_HOST', 'localhost'),
            'port' => env('DB_PORT', '3306'),
            'database' => env('DB_DATABASE', ''),
            'username' => env('DB_USERNAME', ''),
            'password' => env('DB_PASSWORD', ''),
            'charset' => 'utf8mb4',
            'collation' => 'utf8mb4_unicode_ci',
            'prefix' => '',
            'strict' => true,
            'engine' => 'InnoDB ROW_FORMAT=DYNAMIC',
        ],
```

##### `database:`
- コンテナ内のDBにテーブルを作成するため、マイグレーションを実行している

##### `test:`
- 重いテストではメモリ不足で落ちるため、`memory_limit=512M`に上限を上げている

### CircleCI を動かす
1. `circle.yml` が作成できたら、リポジトリに追加するためにコミットしてプッシュする
2. プッシュすると自動で CircleCI が動いてビルドされ、青色の`RUNNING` になる
3. 正常にビルドされれば緑色の `SUCCESS` になる

## ビルドが失敗する場合
`Debug via SSH` タブの `Retry this build with SSH enabled` を押下すると、CircleCI のコンテナに 30 分だけ SSH できるようになる。
この機能を利用してデバッグする。

## おまけ
- `[ci skip]` をコミットメッセージに入れると CircleCI のビルドをスキップできる。
 - 文言変更などの軽微な修正時に使えそう。
 - https://circleci.com/docs/1.0/skip-a-build/

- 環境変数は CircleCI の画面（GUI）の `Environment Variables` からでも設定できる
 - `circle.yml`と GUI の両方で設定した場合は、`circle.yml`の方が反映されるもよう
matplotlib.basemapで簡単にマップを描画する

[basemap](https://basemaptutorial.readthedocs.io/en/latest/index.html): pythonで簡単に地図をプロットする。データの可視化を地図上にしたいときにとても重宝します。

![CMtYKZoWsAAWiC0-2.png](https://qiita-image-store.s3.amazonaws.com/0/158680/3002f567-3346-a1ff-f3c9-cfd7e013bcf1.png)


インストール。くそ面倒だったのが、めちゃ簡単になりました！

```bash:@mac
$ brew install geos
#$ pip install Pillow html5lib BeautifulSoup4
$ wget https://jaist.dl.sourceforge.net/project/matplotlib/matplotlib-toolkits/basemap-1.0.7/basemap-1.0.7.tar.gz
$ tar zxvf basemap-1.0.7.tar.gz
$ cd basemap-1.0.7
$ python setup.py install
```

例: ラベル付きマップ

```python:map.py
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap

fig = plt.figure(figsize=(8,4))
m = Basemap(projection='merc',
                 resolution='h',
                 llcrnrlon=131,
                 llcrnrlat=33,
                 urcrnrlon=141,
                 urcrnrlat=38)

m.drawcoastlines(color='lightgray')
m.drawcountries(color='lightgray')
m.fillcontinents(color='white', lake_color='#eeeeee');
m.drawmapboundary(fill_color='#eeeeee')
#m.drawparallels(np.arange(31.0, 38.1, 1.0), labels = [1,0,0,0], fontsize=12)
#m.drawmeridians(np.arange(132.0, 140.1, 2.0), labels = [0,0,0,1], fontsize=12)
  
sumoto_lon = 134.7687
sumoto_lat = 34.3755
hiratsuka_lon = 139.3581
hiratsuka_lat = 35.3587

x1,y1 = m(sumoto_lon, sumoto_lat)
x2,y2 = m(hiratsuka_lon, hiratsuka_lat)
m.plot(x1, y1, 'm.', markersize=10)
m.plot(x2, y2, 'm.', markersize=10)
plt.text(x1 + 10000, y1 + 10000, u"sumoto")
plt.text(x2 + 10000, y2 + 10000, u"hiratsuka")

plt.show()
fig.savefig('map.png')
```

![map.png](https://qiita-image-store.s3.amazonaws.com/0/158680/3c1ed90d-a739-f894-e748-162195d138c4.png)
How to use loggly to monitor PostgreSQL

###
```shell-session
# curl -O https://www.loggly.com/install/configure-linux.sh
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 27058  100 27058    0     0  22318      0  0:00:01  0:00:01 --:--:-- 22325

# sudo bash configure-linux.sh -a SUBDOMAIN -u USERNAME
Username is set
Please enter Loggly Password:********
INFO: Initiating Configure Loggly for Linux.
INFO: Operating system is CentOS.
INFO: Checking if logs-01.loggly.com is reachable.
INFO: logs-01.loggly.com is reachable.
INFO: Checking if logs-01.loggly.com is reachable via 514 port. This may take some time.
INFO: logs-01.loggly.com is reachable via 514 port.
INFO: Checking if 'clalpha' subdomain is valid.
INFO: https://clalpha.loggly.com is valid and reachable.
INFO: Checking if Gen2 account.
INFO: It is a Gen2 account.
INFO: Checking if provided username and password is correct.
INFO: Username and password authorized successfully.
INFO: Authentication token not provided. Trying to retrieve it from https://clalpha.loggly.com account.
INFO: Retrieved authentication token: da7f991b-bdf3-4041-8d26-193818c5129a
INFO: Checking if provided auth token is correct.
INFO: Authentication token validated successfully.
INFO: Systemd is present. Configuring logs from Systemd to rsyslog.
INFO: Restarting Systemd-journald
INFO: rsyslog is present as service.
INFO: Modified $MaxMessageSize to 64k in rsyslog.conf
INFO: Restarting the rsyslog service.
Redirecting to /bin/systemctl restart  rsyslog.service

# sudo vim /etc/rsyslog.conf

$ModLoad imudp
$UDPServerRun 514

# sudo service rsyslog restart

# vi postgresql.conf

log_destination = 'syslog'

#
Windows使いのプログラマは絶対に仕込んでおくべき最強のランチャー1選

これさえあればCLaunchもOrchisも要りません。
Windows標準の機能だけでできるのでネットワークのない環境でもできます。
所要時間は10分程度です。

#前提

Windows7/10

#ショートカット専用フォルダの作成

[共通]

Cドライブ直下あたりのわかりやすいところにフォルダを作成してください。フォルダ名は**Command**等がいいでしょう。

例：C:\Command

#ショートカットの配置

よく使うアプリやフォルダのショートカットを配置してください。この時のポイントは可能な限り**短く覚えやすい**名前にすることです。

例：
GoogleChrome→*gc*
Excel→*ex*
Dドライブ→*d*

こんな感じです

![command.jpg](https://qiita-image-store.s3.amazonaws.com/0/172548/d22115b5-4126-9659-feb3-2740f363a244.jpeg)


#環境変数の設定

環境変数に先ほどのフォルダパスを設定します。

[Windows7]

コントロールパネル→システム→システムの詳細設定→環境変数
**ユーザー環境変数**の**Path**を選択して編集、末尾に**;C:\Command**を追加してOKしてください。

※もしユーザー環境変数にPathがない場合は新規作成してください。

[Windows10]

Windowsキー+R→controlと入力してEnter→システム→システムの詳細設定→環境変数
**ユーザー環境変数**の**Path**を選択して編集
新規をクリックして**C:\Command**を入力してOKしてください。

※もしユーザー環境変数にPathがない場合は新規作成してください。

##Pathの確認

アクセサリからコマンドプロンプトを起動してpathと入力します。
表示された文字列の中にC:\Commandが存在することを確認してください。
これで準備ができました。

#ショートカットを使う

**Windowsキー+R**でファイル名を指定して実行ウインドウを表示します。
自分で名前をつけたショートカット名（gc,ex,d…）を入力してEnterを押してください。
すると！プログラムが立ち上がるではありませんか！

#あとがき

環境変数にショートカットフォルダの位置を記憶させてショートカットを叩くだけなんですが、革命的な便利さだと思います。
マウスを使わなくていいので暴発がなく快適です。ぜひお試しあれ
realm-android-adaptersでListView/RecyclerViewを実装すると楽

Realmを使って永続化されているデータをListViewやRecyclerViewに表示するアプリケーションをつくるのに便利なのが realm-android-adapters です、という話です。

https://github.com/realm/realm-android-adapters

実装を読むと簡単に仕組みはわかるけど、Liveな`OrderedRealmCollection`をAdapterに食わせておくと、別スレッドでDBに変更が加わると`OrderedRealmCollectionChangeListener`に通知が飛んでくるのでそれをきっかけにしてAdapter自身で適切に`notifyDataSetChanged`などを呼んでViewの更新を行ってくれる。

https://github.com/realm/realm-android-adapters/blob/master/adapters/src/main/java/io/realm/RealmRecyclerViewAdapter.java

詳しい実装はREADMEを。
Ubuntu に docker と docker-compose を入れる

EC2 のインスタンスに気軽に docker いれようと思ったら、Amazon Linux だと入る docker version が古かったので、Ubuntu にしてみました。

# docker をいれる

Docker CE (Community Edition) を入れます。

Ref. https://docs.docker.com/engine/installation/linux/ubuntu/#os-requirements

```shell-session
$ sudo apt-get update
sudo: unable to resolve host ip-**-**-**-**
```

いきなり unable がでたので、`/etc/hosts` を書き換えて以下のようにする。

```text
127.0.0.1 localhost ip-**-**-**-**
```

```shell-session
$ sudo apt-get update

$ sudo apt-get install \
    linux-image-extra-$(uname -r) \
    linux-image-extra-virtual

# Install packages to allow apt to use a repository over HTTPS:
$ sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    software-properties-common

# Add Docker’s official GPG key:
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

# Check architecture
$ arch
x86_64

$ sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"

$ sudo apt-get update

$ sudo apt-get install docker-ce

$ docker -v
Docker version 17.03.1-ce, build c6d412e

$ # sudo なしで、docker できるように以下を叩いて、いったん ubuntu から抜ける
$ # Ref. https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-on-ubuntu-16-04
$ sudo usermod -aG docker $(whoami)

$ docker info
```

めでたし。


# docker-compose をいれる

すでに力尽きてきたのですが、がんばって docker-compose をいれます。

```shell-session
$ docker-compose -v
The program 'docker-compose' is currently not installed. You can install it by typing:
sudo apt install docker-compose
```

Ref. https://docs.docker.com/compose/install/

ここで、バージョンを確認

- https://github.com/docker/compose/releases

```shell-session
$ sudo -i
# curl -L "https://github.com/docker/compose/releases/download/1.12.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

# chmod +x /usr/local/bin/docker-compose
# exit
$ docker-compose -v
docker-compose version 1.12.0, build b31ff33
```

めでたし。
Sakura editor にてGrepの説明

**Grepとは**

■ディスクにある複数のファイルから、指定した文字列を検索することができます。
指定したフォルダの下層のフォルダを全て検索することもできます。
・検索結果は、別のウィンドウが作成されて、そこに表示されます。
・検索結果から、条件と一致した箇所に直接ジャンプ（タグジャンプ）することができます。
・共通設定 『検索』プロパティ GREP の設定によっては、GREP結果から行をダブルクリック・Enterすることでも、該当する場所にジャンプします。
![image](https://qiita-image-store.s3.amazonaws.com/0/135064/366fec69-4e0d-875b-a7c8-f6a56ae0ac1a.png)











①(条件) …… 検索条件を指定します。何も指定せずに実行すると、ファイル名検索ができます。ただし、フォルダ名検索はできません。
②(ファイル) … 検索対象となるファイル指定します。ワイルドカードが使えます。
カンマ、スペース、セミコロン(, ;)のどれかで区切ると複数の条件を指定できます。
③ファイル名に(, ;)を含む場合は、ダブルクオーテーションで囲うことで、ひとつのファイル名として扱えます。
ファイルパターンの先頭に!を付ける(例: !*.obj)と，そのパターンに当たるファイルをGrep対象から外します。
指定位置にかかわらず除外指定は検索指定より優先されます． 
何も指定しない場合は、「*.*」を指定したことになります。
(フォルダ) … 検索対象ファイルのあるフォルダを指定します。エクスプローラなどからのフォルダのドロップも受け付けます。
[現フォルダ]ボタン
    このボタンを押すと現在開いているファイルを元に「フォルダ」を設定します。
④単語単位で探す
    単語として識別するもののみ検索します。
キーワードに単語以外を入れると何もヒットしません。
⑤サブフォルダからも検索する
    指定フォルダの下層フォルダからも検索するかどうかを指定します。
⑥現在編集中のファイルから検索
    現在編集中のファイルのみを検索対象に指定します。
    編集中の内容ではなく、最後に保存されたファイル内容から検索して一覧を作成します。※データから検索 
⑦英大文字と小文字を区別する
    半角英字の大文字と小文字を区別して検索するかどうかを指定します。
➇正規表現 … 検索条件に、正規表現を使うかどうかを指定します。
文字コードセット
    検索対象となるファイルの文字コードセットを選択します。
    自動選択、SJIS、JIS、EUC、Unicode、UnicodeBE、UTF-8、UTF-7から選択します。
    どの文字コードを選択しても、検索時には、SJISに変換してから検索します。
⑨フォルダの初期値をカレントフォルダにする
    現在開いているファイルがあるフォルダを(フォルダ)の初期値にします。次回のダイアログ表示時に反映されます。

<結果出力> … 検索条件に合致した箇所の出力方法を指定します。合致した箇所はその先頭の合致箇所の位置が示され、タイプ別設定 『カラー』プロパティで「検索結果」に指定した色でハイライト表示されます。
⑩該当行	… 合致した箇所のある行全体を表示します。
⑪該当部分	… 合致した箇所のある行のうち先頭の合致箇所だけを表示します。

ヒント
単語単位で検索したときは、すべての合致箇所が表示されます。

<結果出力形式> … 検索条件の結果の出力形式を選べます。
⑫ノーマル … 一つづつ列挙して出力します。
⑬ファイル毎	… ファイル毎にまとめて出力します。いわゆるWZ風の形式です。