OmniAICreator/Qiita-1.07M huggingface dataset:
LDAP用語メモ


## エントリ

entry
実世界のオブジェクトを反映したもの

## DIT

Directory Information Tree
組織構造を反映した階層ツリー

## DN

Distinguished Name
ディレクトリサービス中で一意な名前
エントリ自身の名前と上位のエントリの名前を連結したものになる。

## RDN

Relative Distinguished Name
エントリ自身の名前

## 属性

attribute
エントリに付随する情報
型と1つ以上の値のペアで表される
エントリは必ず objectClass という属性を持つ
オブジェクト指向プログラミング(以下OOP)でのオブジェクトインスタンスに対するクラスに相当
オブジェクトクラスによってどのような属性を持てるかが決まる

### ユーザ属性

権限を持ったユーザが更新できる属性

### 運用属性

システムが管理する属性（エントリの作成・更新日時etc）

## ルートエントリ, DSE, ルートDSE

Root Entry
Directory Service Entry
Root Directory Service Entry

名前を持たない概念的エントリ
サーバ固有情報を持つ

## ネーミングコンテキスト

DITを複数のサーバに分割して管理した際、あるサーバで管理している領域の最上位のエントリ

## スキーマ

属性の型やオブジェクトクラス(object class)などの情報を格納するための枠組み（の定義）
OOPの「クラス」に相当
全てのオブジェクトクラスは最上位のオブジェクトクラス"top"から派生
属性型は属性構文(attribute syntax)と照合規則(matching rule)を定義

## LDIF

LDAP Data Interchange Format
LDAPのデータをまとめて処理するためのテキスト形式
ASP.NET > WebAPI > webapi2 のルーティング指定




以下のページに説明あり

http://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2#prefixes


ルーティングの書き方は以下の２種類がある。

１メソッド毎にアトリビュートで指定するか、

```csharp
public class BooksController : ApiController
{
    [Route("api/books")]
    public IEnumerable<Book> GetBooks() { ... }

    [Route("api/books/{id:int}")]
    public Book GetBook(int id) { ... }

    [Route("api/books")]
    [HttpPost]
    public HttpResponseMessage CreateBook(Book book) { ... }
}
```

クラス宣言のアトリビュートでルートを指定し、
各メソッドには相対パス、もしくはパラメーターを指定する方法
RoutePrefixをつけた場合、各メソッドにもRouteアトリビュートをつけないと、
クライアント側からメソッドを発見できないので注意

```csharp
[RoutePrefix("api/books")]
public class BooksController : ApiController
{
    // GET api/books
    [Route("")]
    public IEnumerable<Book> Get() { ... }

    // GET api/books/5
    [Route("{id:int}")]
    public Book Get(int id) { ... }

    // POST api/books
    [Route("")]
    public HttpResponseMessage Post(Book book) { ... }
}
```


かなりはまったのでメモ
ズンドコキヨシ with Swift

変数（var）は使用しない縛りで

```swift

import Foundation

let zundoko = ["ズン", "ドコ"]
let ex = ["ズン", "ズン", "ズン", "ズン", "ドコ"]

func zunzunzundoko(list: [String])
{
    if list == ex {
        print("キ・ヨ・シ！")
        return
    }
    
    let t = zundoko[Int(arc4random_uniform(2))]
    print(t)
    
    zunzunzundoko(list[1...4] + [t])
}

zunzunzundoko(["", "", "", "", ""])

```

普通？
フリックでタブの切り替え表示を実装する(hammer.js)

フリックでタブの切り替えをしたい！って要件を本当よく見ますよね。
スマホWebってそれやっても気持ちいい動きにするのが手間だったので記事にしてみます。

## 難しいポイント

* イベントが縦スクロールと混在してしまいがち。
* フリックするとページ戻りが発生する。

## 取るべきアプローチ

* フリックの角度に応じて調整する。
* どれぐらい動かしたら処理するのかを調整する。

## フリックの実装

上の二点のアプローチを自前で実装してもいいのですが、
[hammer.js](http://hammerjs.github.io/)が優秀なので使います。
指の動きのベクトルを取得できます。

### hammerの使い方

シンプルです。

```
var mc = new Hammer(document.getElementById("swiper"));
mc.on("swipe", function(e){処理});
```

これでswipeされた時の処理を埋め込むことができます。

引数の中はこんな感じで動きがかなり整理されて入ってきます！

```
dditionalEvent:"panleft"
angle:180
changedPointers:Array[1]
deltaTime:148
deltaX:-13
deltaY:0
direction:2
distance:13
eventType:2
isFinal:false
isFirst:false
maxPointers:1
offsetDirection:2
overallVelocity:-0.08783783783783784
overallVelocityX:-0.08783783783783784
overallVelocityY:0
pointerType:"touch"
pointers:Array[1]
rotation:0
scale:1
timeStamp:1458114648821
type:"pan"
velocity:-0.06870229007633588
velocityX:-0.06870229007633588
velocityY:0
```

### panを使う

iPhoneは大きく横に動かすとページ戻りと競合するので、
短めで発火するpanにしました。

### アニメーション

実装方法はなんでもいいのですが、css3で動かすのが良いです。


今回は [jquery.transit](http://ricostacruz.com/jquery.transit/) を使いました。



## コード

```js
	var duringAnimation = false;//アニメーション中のロック用フラグ
	var mc = new Hammer(document.getElementById("swiper"));

	mc.on("pan", function(e){
		var viewItem = $(e.target).closest(".view-mode");
		var positions = $(".position > li");
		var index = $(viewItem).index();
		var length = $(".view-mode").length;
		var nextItem;

		var nextIndex;
		var direction;
		var range = 60;//判定する角度
		var easing = 'ease';

		if (e.distance < 70) return true;
                
                //範囲外だったら処理しない。
		if ( !(e.angle > -180 - range && e.angle < -180 + range) && !(e.angle < range && e.angle > -range)){
			return true;
		}

                //方向
		direction = (e.additionalEvent === "panleft") ? "left":"right";

		var step = (direction === "left") ? 1:-1;
		nextIndex = index + step;

		if (nextIndex > length-1)
		{
			nextIndex = 0;
		}else if (nextIndex < 0){
			nextIndex = length-1;
		}

		nextItem = $(".view-mode")[nextIndex];


		$(positions).removeClass("active");
		$(positions[nextIndex]).addClass("active");

		//$("#position ul").animate({left: 0}, 100, "easeOutExpo");
		$(window).scrollTop(0);

		if (duringAnimation === false) {
			duringAnimation = true;
			$(nextItem).css({"left":"100%", "display":"block"}).transition({left: "0"}, 300, easing);
			$(viewItem).transition({left: (direction === "left") ? "-100%":"100%" }, 300, easing,function () {
				$(viewItem).css({"position": "absolute", "display": "none"});
				$(nextItem).css({"margin-top": "0", "position": "relative", "display": "block"});
				duringAnimation = false;
			});
		}
	});
```
T-SQLでテーブルの文字列項目をカンマ区切りで結合したい場合

あるテーブルのある項目をカンマ区切りで結合したい場合は、 XML PATHを使う事でSQLで取得することができる。


# 単一項目を結合する場合
```sql
Select 
  Left(Main.UserNames,Len(Main.UserNames)-1) As "UserNames"
From
  (
    SELECT 
      (
        Select 
          UserName + ',' AS [text()]
        From 
          dbo.UserMaster 
        For XML PATH ('')
      ) AS UserNames
  ) [Main]
```

# グループ化して結合する場合
※こっちは参考のリンク先のSQLをほぼそのままお借りしてます

```sql
Select 
  Main.UserId,
  Left(Main.Users,Len(Main.Users)-1) As "Users"
From
  (
    Select 
      distinct U2.UserId, 
      (
        Select 
          U1.UserName + ',' AS [text()]
        From 
          dbo.Users U1
        Where 
          U1.UserId = U2.UserId
        ORDER BY U1.UserId
        For XML PATH ('')
       ) [Users]
    From dbo.Users U2
  ) [Main]
```

### 参考
[Concatenate many rows into a single text string?](http://stackoverflow.com/questions/194852/concatenate-many-rows-into-a-single-text-string)
React + jestでテスト実行時にだけjQueryを読み込む（jquery-rails向け）

## 前置き

現在開発中の [highlite](highlite.jp) では今までほぼRails + jQueryだけでゴリゴリとajax処理を書いていたんですが、何かとキツイ側面があります。
とは言え生のjsを書きまくるにしてもテストの仕方も分からないしRailsユーザとしては何か乗っかれる肩が欲しい！というわけでReact + jestに行き着いた感じです。
他のフレームワーク的なモノは少しずつ書き換えていくには重そうだし、reactがアツい！と言う話を聞いていたので試しに導入した所、非常にメリットを感じています。

TDD出来るし最高！と思ったら

## 発生した問題
ReactComponent内で `$.ajax` とかする時に、`jquery-rails` から読み出された `$` を使いたいのでComponent内では`import $ from 'jquery'` したくないが、jestでテスト実行時に `ReferenceError: $ is not defined` として怒られてしまいます。

サンプル

```js:reaction_list.jsx
import React from 'react';
// import $ from 'jquery'
// Component内で呼び出してしまうと、jquery-railsの恩恵（ajaxでPOSTする時に
// csrf-token回りを適宜やってくれるとか）が受けられなくなるので使いたくない

var ReactionList = React.createClass({

  loadReactionsFromSever: function(){
    $.ajax({
　　　　//...諸々
});
module.exports = ReactionList;
```

Component内で`$`をimportしてない状態で `jest` すると…

```
● ReactionList Component › it is React element
  - ReferenceError: $ is not defined
        at loadReactionsFromSever (app/assets/javascripts/components/reaction/reaction_list.jsx:8:7)
        at componentDidMount (app/assets/javascripts/components/reaction/reaction_list.jsx:24:10)
        at CallbackQueue.assign.notifyAll (node_modules/react/lib/CallbackQueue.js:65:22)

```

こんな感じに怒られます。
が、実際のrails環境では `browserify` されているため、ちゃんと `$` は存在するので動いています。（というのが前提なので、`jquery-rails`を使わない場合などは`import`したら良いと思います）

## 解決策
ここでタイトルの React + jestでテスト実行時にだけjQueryを読み込む、ですが、散々悩んだ割には1行で解決しました。

```js
global.$ = require('jquery');
```

こいつをテストファイルで読み込んでやればOKです。（多分devDependenciesに追加しないと怒られますが）

サンプル

```js:reaction_list_spec.js
import React from 'react';
import ReactDOM from 'react-dom';
import TestUtils from 'react-addons-test-utils';
global.$ = require('jquery');

jest.dontMock('../../reaction/reaction_list.jsx');
const ReactionList = require('../../reaction/reaction_list.jsx');

describe('ReactionList Component', () => {
//てすと
)};
 
```

これでテスト実行時には$が定義され（node_modulesから読み込まれ）、rails環境では`jquery-rails`の`$`が利用可能になります。

reactは日本語での関連情報がまだ少なそうなので、こう言う比較的ニッチっぽいネタでも書いたほうが良いかもなーと思ったので書いてみました。
ビジネスデータカタログ(BDC)の閾値


# 既定値

|Scope |Throttle Type |Enforced |Default |Max |
|---|---|:---:|---:|---:|
|Global|Connections|TRUE|200|500|
|Global|ModelSize|FALSE|10000000|50000000|
|Global|MaxNumberOfModels|FALSE|1000|2000|
|Database|Items|TRUE|2000|1000000|
|Database|Timeout|TRUE|180000|600000|
|WebService|Size|TRUE|3000000|150000000|
|WCF|Size|TRUE|3000000|150000000|
|WCF|Timeout|TRUE|180000|600000|
|WCF|MetadataSize|FALSE|3000000|150000000|
|OData|Size|TRUE|3000000|150000000|
|OData|Timeout|TRUE|180000|600000|
|OData|MetadataSize|FALSE|3000000|150000000|

出典：[Business Connectivity Services: End User Implications – Part two: Changing External System Throttling](http://lightningtools.com/bcs/business-connectivity-services-end-user-implications-part-two-changing-external-system-throttling/)

# 変更方法

```
# ex.)for database:items

# get current setting
$bcs = Get-SPServiceApplicationProxy | where{$_.GetType().FullName -eq (‘Microsoft.SharePoint.BusinessData.SharedService.’ + ‘BdcServiceApplicationProxy’)}
$BCSThrottle = Get-SPBusinessDataCatalogThrottleConfig -Scope database -ThrottleType items -ServiceApplicationProxy $bcs

# output current setting
#$BCSThrottle

# set new setting
Set-SPBusinessDataCatalogThrottleConfig -Identity $BCSThrottle -Maximum 1000000 -Default 40000 
```


## 参考
* [SharePoint 2010: Row Limits in External Lists](http://social.technet.microsoft.com/wiki/contents/articles/9628.sharepoint-2010-row-limits-in-external-lists.aspx)
* [BCS PowerShell: Introduction and Throttle Management](https://blogs.msdn.microsoft.com/bcs/2010/02/16/bcs-powershell-introduction-and-throttle-management/)
* [Large List Throttling for External Lists in SharePoint 2010](https://samlman.wordpress.com/2015/02/28/large-list-throttling-for-external-lists-in-sharepoint-2010/)
* [How to: Define Filters for External Item Picker Controls](https://msdn.microsoft.com/en-us/library/office/ff798274(v=office.14).aspx)
* [A step by step guide in designing BCS entities by using a SQL stored procedure](https://blogs.msdn.microsoft.com/jysaikia/2010/12/15/a-step-by-step-guide-in-designing-bcs-entities-by-using-a-sql-stored-procedure/)
* [Paging and sorting with BCS](http://sharepoint.stackexchange.com/questions/1530/paging-and-sorting-with-bcs)
* [Types of Filters Supported by the Business Data Connectivity Service](https://msdn.microsoft.com/en-us/library/ee556392(office.14).aspx)
* [BDC-App for Web Service with paging](http://developers.de/blogs/damir_dobric/archive/2008/01/08/bdc-app-for-web-service-with-paging.aspx)
ズンドコキヨシ with D 供養

# 三番煎じです

[ズンドコキヨシ with D by @kotet](http://qiita.com/kotet/items/9d170a372434caf0c876)
[ズンドコキヨシ with D by @cedretaber](http://qiita.com/cedretaber/items/de4e47aa9743daa1cb00)

# コードゴルフ（目標：Twitterでpaiza_run可能）の残骸

※下記のコードは、見やすいように改行とインデントをつけてます。

## D言語にパターンマッチがほしいよ編

見やすくて気に入ったけど
非推奨の`match`まで使うも縮まらず

```d:D
import std.stdio,std.random,std.regex;
void main(){
  string s;
  while(!match(s,"(.ン){4}ド.$"))
    s~=dice(1,1)?"ドコ":"ズン";
  writeln(s,"キ・ヨ・シ！");
}
```

## あと4文字が縮まらないよ編

必要最小限の標準ライブラリでやってみた
Twitterには貼れるけど、paiza_runまでは縮められず

```d:D
//#paiza_run d:  ←コレガハイラナイ
import std.stdio,std.random;
void main(){
  dstring s;
  while(s[$>9?$-10:$..$]!="ズンズンズンズンドコ")
    s~=dice(1,1)?"ドコ":"ズン";
  writeln(s,"キ・ヨ・シ！");
}
```

## 番外編（UFCSしたいマン）

`until`を見つけるまで、無限レンジを適当な所で切っていたよ
なかなかきれいに書けたけど文字数

```d:D
import std.stdio,std.random,std.range,std.algorithm;
void main(){
  auto s=[0,0,0,0,1];
  writeln(
    generate!(()=>dice(1,1))
      .until(s)
      .chain(s)
      .map!`a?"ドコ":"ズン"`
      .join,
    "キ・ヨ・シ！"
  );
}
```

# まとめ

こーどごるふを　めざしたけど　むしろ　わんらいなーに　ちかづいたよ
ふぉぼすが　ぜんぶはいる　`import std`　みたいなのほしいよ（小並感）
同僚に殴られる系のズンドコキヨシ.php

http://qiita.com/shinderuman@github/items/7c432e8cb7719d35342a

なるほど、クソコーダーとしてかかねばならぬ。

説明文を追加したが、同僚に殴られないためにはマネしない方が良いです。


＊＊＊ ver 7

```php
<?php 
eval($argv[0]);
```

- ただし、ファイル名は `while(!@strstr($l.=[ズン,ドコ][rand()%2],ズンズンズンズンドコ));@die($l.キ・ヨ・シ！);`にすること。
- ファイルシステムや、ファイラなどによっては利用文字種で作れないかも
- そんなファイル名のファイルは以下のスクリプトで作成できる(OSXで確認）

```php
<?php 
file_put_contents('while(!@strstr($l.=[ズン,ドコ][rand()%2],ズンズンズンズンドコ));@die($l.キ・ヨ・シ！);', '<?php eval($argv[0]);');
```

- 果てしの無い「もう`php -r`でいいじゃねーか」感
- 他所でみた`strtr`を使うものを越える方法がイマイチおもいつかなく(`<?php while(!@strstr($l.=rand()%2,"00001"))?><?=@strtr($l.キ・ヨ・シ！,[ズン,ドコ]);`)、そろそろネタ切れです。
- 以下のようにbase64をつかえばもっと扱いやすい（？）ですね…（だからなんだ）

```php
<?php
eval(base64_decode($argv[0]));
```

- ファイル名は「d2hpbGUoIUBzdHJzdHIoJGwuPVvjgrrjg7Ms44OJ44KzXVtyYW5kKCklMl0s44K644Oz44K644Oz44K644Oz44K644Oz44OJ44KzKSk7QGRpZSgkbC7jgq3jg7vjg6jjg7vjgrfvvIEpOyAg」にしてください
- **こういうコードを書くと致命的なセキュリティホールをつくりがちなので、勿論マネしてはいけません**。


＊＊＊ ver 6

```php
<?php
while(!@strstr($l.=[ズン,ドコ][rand()%2],ズンズンズンズンドコ))?><?=$l?>キ・ヨ・シ！
```

- ループ抜けにつかわなくなったので、dieが不要に
- 最後はテンプレートエンジンとしてのPHP力を発揮
- （依然と長さの比較がわかりづらくなるので、`<?php`の後に改行を入れているが、空白でOK）

＊＊＊ ver 5

```php
<?php
while(!@strstr($l.=[ズン,ドコ][rand()%2],ズンズンズンズンドコ));@die($l.キ・ヨ・シ！);
```

- `strstr`の引数の式で代入と判定で十分だったな…ループが終わったら`die`
- `while`に文(`｛｝`)が必要ない場合は省略できる（ただし、`;`が必要)
- `strstr`と代入が一文になったので、`@`が一個へらせた

＊＊＊ ver 4

```php
<?php
while(@$l.=[ズン,ドコ][rand()%2])@strstr($l,ズンズンズンズンドコ)?@die($l.キ・ヨ・シ！):0;
```

- 二値なら、奇数判定でよかった。

＊＊＊ ver 3

積極的にエラーを握りつぶして行くスタイルでなぐられ度アップ❤

```php
<?php
while(@$l.=[ズン,ドコ][rand(0,1)])@strstr($l,ズンズンズンズンドコ)?@die($l.キ・ヨ・シ！):0;
```

- ベアワード（"でくくられておらず、定数になっていない文字）は、エラーにはなるが表記通りの値として判定される、`@`一個あれば`"`二個いらないのだ！

＊＊＊ ver 2

１文字削れた

```php
<?php
while(@$l.=['ズン','ドコ'][rand(0,1)])strstr($l,'ズンズンズンズンドコ')?die($l.'キ・ヨ・シ！'):0;
```

- if文もカッコが多い`if()`三項演算子なら`?:`ですむ

＊＊＊ ver 1

```php
<?php
while(@$l.=['ズン','ドコ'][rand(0,1)])if(strstr($l,'ズンズンズンズンドコ'))die($l.'キ・ヨ・シ！');
```

- `while`や`if`の`{}`は一文しかないときは省略できる
- `$l='';`よりも`@`一文字のほうが少ない（未定義変数にいきなり値をいれるとエラーになるが、@で握りつぶせる）
- `[...][...]`は5.5>=phpから
- `die`は引数に文字列が来た時、それを出力しながら終了する

あるいは

```php
<?php
$l='';
while($l.=['ズン','ドコ'][rand(0,1)])
    if(strstr($l,'ズンズンズンズンドコ'))
        die($l.'キ・ヨ・シ！');
```

（PHP7.0.3）

富豪手法です。

mt？うまいのかそれ？
AndroidのProgressBarの進捗をなめらかにする


## 普通の方法

```java
private ProgressBar progressBar;
.
.
.
// 進捗が変わった時に呼び出される
private void onHogeProgressChanged(int progressInPercent){
    progressBar.setProgress(progressInPercent);
}
```

これだと進捗が変わるたびに、カクカクとバーの長さが変わっちゃいます。
UX的によくない感じなのでもっとスムーズに変わらんものかとggってみました。

Android: make a progress bar update smoothly
http://stackoverflow.com/questions/6097795/android-make-a-progress-bar-update-smoothly



## スムーズな方法

```java
private void onHogeProgressChanged(int progressInPercent){
    ObjectAnimator animation = ObjectAnimator.ofInt(progressBar, "progress", progressInPercent);
    animation.setDuration(500); // 0.5 second
    animation.setInterpolator(new DecelerateInterpolator());
    animation.start();
}
```

さすがはStackOverflowさんやわ〜。
社内で発表したい事/した事一覧

#発表したい事
- Emmetについて
- kotlinについて
- テスト手法について


#発表した事
※発表したら資料含めてここに載せる。

- [lombokについて](http://www.slideshare.net/okanikani1989/20160422lombok)
 - 2016/04/22 社内発表
 - 持ち時間２０分
 - lombokの簡単な説明と導入、アノテーションを６つ紹介
PowerShellのコマンドラインオプション

PowerShellのコマンドラインオプションについてメモ。

コマンドラインオプションを調べるには"`-?`"オプションを指定する

    c:> powershell.exe -?
    PowerShell[.exe] [-PSConsoleFile <ファイル> | -Version <バージョン>]
        [-NoLogo] [-NoExit] [-Sta] [-Mta] [-NoProfile] [-NonInteractive]
        [-InputFormat {Text | XML}] [-OutputFormat {Text | XML}]
        [-WindowStyle <スタイル>] [-EncodedCommand <Base64 エンコードのコマンド>]
        [-File <ファイル パス> <引数>] [-ExecutionPolicy <実行ポリシー>]
        [-Command { - | <スクリプト ブロック> [-args <引数の配列>]
                      | <文字列> [<コマンド パラメーター>] } ]
    (以下説明が続く)

コマンドラインオプションは、大文字と小文字を区別しない様子。また一意に定まる前方数文字だけ指定すればいい。たとえば、[vSphere PowerCLI](https://www.vmware.com/support/developer/PowerCLI/)のプロンプトを起動するショートカットは、以下になっていた。

    C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -noe -c ". \"C:\Program Files\VMware\Infrastructure\vSphere PowerCLI\Scripts\Initialize-PowerCLIEnvironment.ps1\""

この`noe`は`-NoExit`と同じ。`-c`は`-Command`と同じ。ここで`-n`だけだと`-NoLogo`とどちらか区別できないので、エラーになった。

    C:>powershell.exe -n
    Windows PowerShell
    Copyright (C) 2012 Microsoft Corporation. All rights reserved.
    
    PS C:\Users\ap745667> -n : 用語 '-n' は、コマンドレット、関数、スクリプト ファイル、または操作可能なプログラムの名前として認識されません。名前が正しく記述されていることを確認し、パスが含まれている場合はそのパスが正しいことを確認してから、再試行してください。
    発生場所 行:1 文字:1
    + -n
    + ~~

PowerShell ISEでも"`-?`"でコマンドラインオプションを確認できる。こちらはかなり少なかった。

    c:> powershell_ise.exe -?
    powershell_ise.exe [[-File] <ListOfFiles>] [-Help] [-MTA] [-NoProfile]

確認環境：PowerShell 3.0
kintone アプリから Airtable ベースを作成

kintone で外部ユーザーと情報共有する手段としては、ゲストユーザ機能がありますが、追加の月額費用が必要なため、手軽にはできません。

無料で、情報共有する手段としては、いろいろありますが、同じクラウドデータベースで無料で使用できる Airtable を試してみます。

無料枠の制限は、
 Unlimited bases
 1,200 rows / base
 2Gb attachment space / base

base は、kintone スペースに相当?。base 内に複数テーブルを持てます。
ずいぶんと太っ腹です。無料枠でAPIも使用できます。

#Airtable ダッシュボード

![airtable01.png](https://qiita-image-store.s3.amazonaws.com/0/100572/356e9f50-e0ce-1e19-bd66-84ce88f7f2ad.png)

情報共有するチーム毎に、アクセスできるデータベース（Airtable では BASE）が並びます。

#顧客情報 BASE

![airtable02.png](https://qiita-image-store.s3.amazonaws.com/0/100572/6a7dca89-7f24-4629-e266-f5e797d2e981.png)

操作方法は、どちらかというとGoogle のスプレッドシートに近いかもしれません。
一覧画面で、入力・更新・削除が可能です。入力されたデータは、すぐにデータベースに反映されます。
元に戻した場合は、Undo / Redo 操作が可能です。

便利なのは、Excel からコピペが出来ること。セル間のコピペ・ドラッグ操作など。

項目のカスタマイズなどもこの画面から変更可能です。
kintone の場合は、項目の文字列などのタイプを変更できませんが、Airtable は、可能です。

![airtable02a.png](https://qiita-image-store.s3.amazonaws.com/0/100572/d83bdc40-f1e4-1933-1afe-e7bd79ce2480.png)

#入力フォーム

![airtable03.png](https://qiita-image-store.s3.amazonaws.com/0/100572/26f5e2e6-30b8-34bb-3401-505e4badc6c9.png)

レコード単位の入力フォームは、１項目毎に配置されたものになります。
用途に合わせて、何種類かフォームを作成できます。

kintone に慣れていると、ここは物足りなく感じます。

#情報共有　チームメンバ追加

チームへメンバを追加するのは、メールアドレスと権限（Read Only, Edit Only, Creator）、招待メッセージを指定するだけです。
招待されたメンバは、送られたメールにあるリンクをクリックしてメールアドレス・名前を入力するとログインできます。
Google メールなら、１クリックで済みます。

![airtable04.png](https://qiita-image-store.s3.amazonaws.com/0/100572/e25ec749-7fd6-8db0-244c-fdfd99382b85.png)

#情報共有 Shared table views

誰でも参照できるように、テーブルを公開できます。
公開されたページは、参照のみで編集できません。

![airtable05.png](https://qiita-image-store.s3.amazonaws.com/0/100572/9fa5caf3-c9ca-99b5-d42a-9007052df8b7.png)

公開されたページ。編集以外のソートやフィルター機能が使用できます。
![airtable06.png](https://qiita-image-store.s3.amazonaws.com/0/100572/58b6586c-df0f-2f3c-5a47-a02eaa9cc371.png)

#情報共有 Airtable embed

HTML に組み込んで、公開する場合のコードが生成されます。

![airtable07.png](https://qiita-image-store.s3.amazonaws.com/0/100572/77f0e611-38f0-8dfa-36b9-0a6184fafe5c.png)

#kintone アプリのデータから Airtable の BASE を作成

一番簡単なのは、CSV に書き出して、Airtable でImport する方法です。
Unicode（UTF-8) で書き出します。
Airtable で読み込むときに、先頭項目が位置固定となりますので、キー項目が良いと思います。

![airtable08.png](https://qiita-image-store.s3.amazonaws.com/0/100572/396a0ef4-ef89-2704-9abd-61ca7b291739.png)

Airtable で、New Base 、Import　を選択します。　
あとは、ウィザードに従って、Import すると　「Imported Application」という名前で Base が作成されます。
出来上がった Base の名前や、view , 項目のタイプなどを変更すれば完成です。
変更は、変えたいところをクリックするとカスタマイズメニューが表示されます。
英語ですが簡単な単語が多いので、わかりやすいと思います。

![airtable09.png](https://qiita-image-store.s3.amazonaws.com/0/100572/84df266c-2c22-49cf-5a5f-23735dbde70b.png)


![airtable10.png](https://qiita-image-store.s3.amazonaws.com/0/100572/cbfee637-095f-811a-0adc-e130807c3d82.png)
obj\Debug\ｘｘｘ.exe" を "bin\Debug\ｘｘｘ.exe" にコピーできませんでした。10 回の再試行回数を超えたため、失敗しました。

#Windowsアップデートかな？#
ある日下記のエラーが出るようになった。
「obj\Debug\ｘｘｘ.exe" を "bin\Debug\ｘｘｘ.exe" にコピーできませんでした。10 回の再試行回数を超えたため、失敗しました。」
objフォルダを削除して1回目のコンパイルは大丈夫。2回目から必ずエラーが出る。
ネットでいろいろ調べた方法を試しても全然駄目で。あまりにも不便で放っておくわけにもいかなくて。

#良くわからないけど解決#
1. Visual Studioホスティングプロセスを有効にするのチェックを外す
![image](https://qiita-image-store.s3.amazonaws.com/0/85010/5dc3ce4f-8d69-05c7-5ace-2072500f048d.png)
1. コンパイル
→ここでなんか警告が出た
1. Visual Studioホスティングプロセスを有効にするのチェックを付ける

不思議とこれで直ってしまったよ。
AnsibleでRedmineセットアップ

忘備録
【OS】
今回はCentOS7.2_x86_64版を使用。詳細は以下を参照。
http://www.server-world.info/query?os=CentOS_7&p=install
事前準備
セットアップに必要なパッケージを事前に設定しておく必要がある。以下を全て設定する。
システム変更が発生するので管理者権限が必須。rootにsuしておく事。
【YUMパッケージ管理】
yum -y install yum-plugin-priorities
yum -y update
yum -y groupinstall "Base" "Development tools" "Japanese Support"
[EPELリポジトリ追加]
yum -y install epel-release
[Remiリポジトリ追加]
rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
[RPMforgeリポジトリ追加]
yum -y install http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el7.rf.x86_64.rpm
【Firewall無効】
systemctl stop firewalld
systemctl disable firewalld
【SELinux無効化】
vi /etc/selinux/config
SELINUX=enforcing 
SELINUX=disabled ←変更(起動時に無効にする)

Ansibleとgitのインストール
yum install -y ansible git

playbookのダウンロード
git clone https://github.com/farend/redmine-centos-ansible.git

PostgreSQLに設定するパスワードの変更
ダウンロードしたプレイブック内のファイル group_vars/redmine-servers をエディタで開き、 db_passwd_redmine を適当な内容に変更してください。これはPostgreSQLのRedmine用ユーザー redmine に設定されるパスワードです。

playbook実行
cd redmine-centos-ansible
ansible-playbook -i hosts site.yml

20分程で完了
http://localhost/redmine
で確認。
ID：admin
PW：admin

おまけ
Bootstrap4のUIに変更
{REDMINE_ROOT}/plugins/
に移動し
git clone https://github.com/ruby232/redmine_bt
apache再起動
systemctl restart httpd

![image](https://qiita-image-store.s3.amazonaws.com/0/55845/f64f101a-8a7f-0318-8bff-896da24d3d35.png)
Git | 現在のコミットハッシュを得るエイリアス

# 解決

専用コマンドがあるようだ。コメント欄を参照のこと。

# 最初の解決

エイリアスを作っておけば。
`$ git revision` と打つだけで、簡単にコミットハッシュを得られる。

```bash:.gitconfig
[alias]
  revision = !git show -s --format=%H
```

例:

```
$ git revision
55176575a31a65118760c30e64cde839e9bb20a3
```

# 応用

HEAD を指定すれば、過去のコミットハッシュを得るのも簡単だ。

`$ git revision HEAD^`

`$ git revision HEAD^^`

# 環境

- git version 2.3.8 (Apple Git-58)

# 参考

- [Git で現在チェックアウトしているコミットのID](http://blog.eiel.info/blog/2014/09/04/git-revision/)



<!-- Update From Qiita API -->

# チャットメンバー募集


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

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


# メンター受付


https://menta.work/user/5694

<!-- Update From Qiita API -->
WebStormでtypingsを使ってTypeScriptの定義ファイル管理

[tsd](https://www.npmjs.com/package/tsd)が`deprecated`になりました。
そこで型定義ファイル(*.d.ts)の管理を[Typings](https://www.npmjs.com/package/typings)に移行しましょう。

## tsdからtypingsへの移行
`tsd`から`typings`への移行はマニュアルにあるように、たった3コマンド(ディレクトリ移動含まず)で完了します。

```shell-session
$ cd /path/to/project
$ rm -rf typings
$ typings init --upgrade
$ typings install
```

ただし、このままだと`WebStorm`やtscが混乱します。
これはtypingsでは`main`と`browser`の二つをtypingsディレクトリ内に配置するため、両方を読み込むと衝突してしまうためです。

## tsconfig.jsonをtypingsに対応させる

tscが混乱しないように`tsconfig.json`の`exclude`にプロパティを下記のように変更します。

```js
{
  // いろんな設定...
  "exclude": [
     "node_modules",
     "typings/browser.d.ts", // これと
     "typings/browser",      // これを追加
     // ほかの無視したいもの...
  ]
}
```

## WebStormの混乱を収める

同様に、WebStormでProjectツリーを表示して、`typings/browser`ディレクトリを右クリック、
コンテキストメニューから`Mark Directory As` -> `Excluded` を選択して無視するようにしましょう。
gdbのpath設定関連

# libmやlibdlなんかの基本ライブラリの置き換え

```bash
(gdb) set sysroot <dir>
```

# soファイル(共有ライブラリのパスの起きかえ)

```bash
(gdb) set solib-search-path <dir>
```

# ソースファイルのビルド時と実行ファイルの作業フォルダが異なるときの対処

```bash
(gdb) directory <dir>
```

## たとえば、module/outフォルダに実行ファイルを置くけど、ビルドはmoduleディレクトリで行う場合
```bash
(gdb) directory $cwd:../
```
ズンドコキヨシ with JavaScript（後発組）

流行りに乗ってみるけど、後発の割にはたいして短くもない。

#最終版

```js
z = "ズン",
d = "ドコ",
a = [],
t = z+z+z+z+d;
while(a.join("") !== t){
  if(a.length > 4) a.shift();
  a.push(Math.random()<.5? z : d);
}
console.log(t + "キ・ヨ・シ！");
```
4ってキモい感じだからどうにかしたい！

```js
t = z+z+z+z+d;
```
ここで文字列作っちゃって`while`文の条件と最後の結果出力で使ってるけどいいよね？

```js
a.push(Math.random()<.5? z : d);
```
最初は`a.push(Math.round(Math.random())? z : d)`なんてことやってた。

`if`文と4だけどうにかならんものかー。

#関数版
一応レギュレーション（？）は自作関数なので、それを作ってみる。

```js
z = "ズン",
d = "ドコ",
a = [],
t = z+z+z+z+d;
function r() {
  if(a.length > 4) a.shift();
  a.push(Math.random()<.5? z : d);
  if(a.join("") !== t) console.log(t + "キ・ヨ・シ！");
  else r();
};
r();
```
`while`文が関数に置き換わっただけであまり意味はない。

#追記

コメントいただいた内容を反映してみた。

```js
z = "ズン",
d = "ドコ",
a = [,,,,,],
t = z+z+z+z+d;
while(a.join("") !== t){
  a.shift();
  a.push(Math.random()<.5? z : d);
}
console.log(t + "キ・ヨ・シ！");
```
サイドプロジェクトを始めよう

## みんなサイドプロジェクトに取り組んでいる？

StackOverflowが2015年に行った[大規模調査](http://stackoverflow.com/research/developer-survey-2015)があります。

> ![image](https://qiita-image-store.s3.amazonaws.com/0/153/7ee50fda-e908-770e-2c83-26241b87e0a0.png)
> [Stack Overflow Developer Survey 2015
](http://stackoverflow.com/research/developer-survey-2015#profile-sideprojects)

その調査によると、驚くべきことに9割のエンジニアが毎週1時間は何かしらのサイドプロジェクトに取り組んでいて、その内半分の人はなんと7時間以上もそういった活動を行っています。もちろんこの調査結果には「StackOverflowのアンケートに答えるような人」というバイアスが掛かっている訳ですが、サイドプロジェクトという言葉の定義次第ではあながち嘘ではない気がします。

サイドプロジェクトと言うとコードを書いて公開するいわゆるオープンソース活動みたいなのを思い浮かべるかも知れません。ですが、ここではもっと大きく捉えましょう[^1]。

[^1]: StackOverflowのアンケートで使われたサイドプロジェクトという言葉と一致するのかは調べていないので分からないです。

僕のまわりで行われているサイドプロジェクトを考えてみました。

### ボランティア活動

エンジニアとしてのITリテラシーを生かして社会に貢献する、といったところでしょうか。東日本大震災をきっかけに始まった [Hack for Japan](http://blog.hack4.jp/) の取り組みなどが代表的です。

### チームでアプリ開発

会社組織を離れて有志でチームを作ってアプリ開発を行う人たちがいます。Webサービスやモバイルアプリを分担して作ることが多そうです。例えば、先日Yahoo! Japanが開催した [Hack Day 2016](http://hackday.jp/) でグランプリを受賞した [AdriaBlue](http://adriablue.jp/) チームみたいに色々なハッカソンに出ては景品をかっさらいつつその成果を公開する、みたいなのも楽しそうですね。

### オープンソース活動

自分でコードを公開したり、他人が書いたコードを手伝ったり。最近だと [GitHub](https://github.com/) のおかげでだいぶやりやすくなりました。

### 面白ガジェットでひたすら遊ぶ

海外で発売されたガジェットを輸入してはいじり倒している知人がいます。本人はプロジェクトという意識を持っていないと思いますが、塵も積もればなんとやら、最先端のものに触れるというのは得難い経験です。お金かかりますが :money_with_wings: 

### 情報発信する

Qiitaやブログに記事を書いたり、StackOverflowで質問に答えてみるなども、見方によっては立派なサイドプロジェクトです。

## どこから始めるか

モチベーションを感じるのであれば何だっていいと思いますが、いきなり世界を変えるような凄いことを始めても限られた時間の中で形にするのは難しい。まずは身近な問題に取り組んで見るのがいいと思います。

ネタを考えるときに使えるアプローチの一つは日常でふと感じる「面倒だなー」に着目することです。残念ながら99%のサイドプロジェクトは誰からも見向きされません。しかし、この方法の良いところはそのプロジェクトの成果物を少なくともあなた自身は使うということです。

## 最新のテクノロジーに触れよう

仕事で携わる歴史あるプロダクトではほいほいと新しい便利ツールを試すということが難しいかも知れません。その点、一度限りのハッカソンや、自分だけが使うライブラリで使ってみるのは敷居が低いのでやりやすいと思います。

## 成果は公開する

特にオープンソース活動の場合ですが

> Done is better than perfect.

を肝に銘じて、不完全なものだったとしても公開しましょう。99%のサイドプロジェクトは誰からも見向きもされませんが（大事なことなので2回）、それでもその成果は外部に向けて発信すべきです。

（おそらくQiitaを見ている人の大多数が所属するであろう）Web業界は人材流動性が他業種に比べて非常に高い業界です。外から見える活動が多いほうが得をすることは多い気がします。

## おわりに

こういう話題になると必ず「とくに作りたいものがない」「やりたいものがない」という反応が返ってきます。その気持はよく分かるのですが、少なくともこの記事を読んでいる時に思いつかないからと言って匙を投げるのは早ぎます。

サイドプロジェクトの根本には「コードを書くのが好き」とか「この活動が楽しい」という想いがあるはずです。そんな主体的に取り組めるサイドプロジェクトを探してみてはいかがでしょう？なんせ9割の人が何かしらやってるんですからきっと見つかるはずです。
zsh/bashのカスタマイズ


## zsh

zshをデフォルトで使用

```bash:~/.zshrc
LANG=ja_JP.UTF-8

# 最新のディレクトリのみ表示
PS1="%1~ %(!.#.$) "

# ヒストリの設定
HISTFILE=~/.zsh_history
HISTSIZE=1000000
SAVEHIST=1000000

# cd した先のディレクトリをディレクトリスタック（履歴）に追加する
# `cd +<Tab>` でディレクトリの履歴（新しい順）が表示され、そこに移動できる
setopt AUTO_PUSHD

"~/.zshrc" 50L, 1110C

DIRSTACKSIZE=100

autoload -Uz compinit && compinit

zstyle ':completion:*' menu select
zstyle ':completion:*:cd:*' ignore-parents parent pwd
# zstyle ':completion:*:descriptions' format '%BCompleting%b %U%d%u'

# エイリアス設定
alias ls='ls -F'
alias la='ls -a'
alias ll='ls -l'
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
alias mkdir='mkdir -p'

# ディレクトリ移動
alias ..='cd ../'
alias ...='cd ../..'
alias ....='cd ../../..'

# 関数
# 差分表示
function diff(){
        git diff $1 --name-only
}

# 差分のみでzipをつくる
function zip(){
        git diff $1 --name-only | xargs -I {} zip $1.zip {} -x .DS_Store
}
```

## bash

```bash:~/.bash_profile
export PATH="$PATH:$HOME/bin"

if [ -f ~/.bashrc ]; then
	source ~/.bashrc
fi
```

```bash:~/.bashrc
LANG=ja_JP.UTF-8
PS1='\W \$ '
export LESS='--no-init'

set -o ignoreeof

# コマンド履歴設定
shopt -s histappend
HISTSIZE=1000000
HISTFILESIZE=1000000
```

※ 例えばaliasに登録したlsを一時的に無効に（本来のlsを実行）する場合は`command ls ` もしくは ` \ls `


> 参考
[新しいLinuxの教科書](http://www.amazon.co.jp/%E6%96%B0%E3%81%97%E3%81%84Linux%E3%81%AE%E6%95%99%E7%A7%91%E6%9B%B8-%E5%A4%A7%E8%A7%92-%E7%A5%90%E4%BB%8B/dp/4797380942/ref=sr_1_2?ie=UTF8&qid=1457791762&sr=8-2&keywords=linux)
Java Byte配列の定義と初期値

## Javaでbyte配列を使用する場合の備忘録

### 配列の定義の仕方

``` java:Definition.java
byte[] aaa = new byte[size];
```

### Byte配列の初期値

byteは「0」で初期化される。

初期化をする場合

``` java:init.java
//定義時に初期化する場合
byte[] aaa = new byte[size]{0};
//明示的に0埋めする場合
Arrays.fill(aaa,(byte)0);
```
C#でネイティブ関数ポインタコール

IntPtrで渡された関数ポインタをDelegateに変換。

```csharp
using System;
using System.Runtime.InteropServices;

[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
delegate int func_i_i(int v);

int CallFunc(IntPtr fp)
{
  func_i_i p;
  p = (func_i_i)Marshal.GetDelegateForFunctionPointer(fp, typeof(func_i_i));
  return p(1);
}
```
1行追記するだけでCrashlyticsで会員情報からクラッシュログを探せるたった1つの方法

# クラッシュ改善に役に立つ
ユーザさんからクラッシュすると問い合わせをいただくことがあるのですが既知のバグ以外はなかなか
ユーザさんの説明だけでは、原因を特定出来ないことがよくあります。

私が担当しているアプリでは問い合わせの際に、ユーザさんを特定出来る会員IDを一緒に頂いてるのですが
それを元にクラッシュログを探せば原因特定に近づきやすくなります。

また、クラッシュを手元で再現出来た時に本当に同じ原因か特定するのにも
発生時間が細かくわかるので、クラッシュを起こしたアカウントで同じクラッシュが上がってるか確認することも出来ます。

# Crashlyticsに会員を特定出来る情報を送信する

```objc:objective-c
[Crashlytics setUserIdentifier:@"ユーザが特定出来る何か（ユーザIDとか）"]
```

```swift:swift
Crashlytics.sharedInstance().setUserIdentifier("ユーザが特定出来る何か（ユーザIDとか）")
```

```java:java
Crashlytics.setUserIdentifier("ユーザが特定出来る何か（ユーザIDとか）")
```

たったこれだけ！！

# 実際に検索する
1. Fabricにアクセス
2. Crashlyticsのタブを選択
3. 右の方にある検索ボックスにユーザを特定出来る文字列を入れる
<img width="1059" alt="スクリーンショット 2016-03-16 11.52.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/30928/f14fc1fc-2027-4ee2-9a1f-af0a1fd87196.png">

#　特定ユーザのクラッシュログだけを抽出して見れる
<img width="683" alt="スクリーンショット 2016-03-16 11.53.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/30928/f867f791-bd57-6f9f-7252-bdf0813ca271.png">



# 他にも
メールアドレスやユーザ名なども送ることが出来ます。
iPhoneはこちら
http://support.crashlytics.com/knowledgebase/articles/92521-how-do-i-set-user-information
Androidはこちら
http://support.crashlytics.com/knowledgebase/articles/120548-how-do-i-set-user-information
Eloquent で Eager loading しながらサブテーブル検索条件つけるやつ


めんどくさかったので備忘。 


- Eloquent でも joinとかは使える。クエリビルダのノリでゴリゴリ書ける。
- JOINしても生成されるのは親テーブルのEloquentのみ
- ただしそのままjoinすると重複列名でEloquentがバグる。サブテーブルの列は`select()`とかを使って必要な奴だけ持ってくる ＆ `as`で改名
- さらにJOINした所でEager Loadingには無関係。Eager指定時に同じ条件区をつけてやる必要あり。


結果こんな感じになる。

````
$query = Customer::with(["phones"=>function($query)use($tel_type){
    $query->where("t_customer.tel_type",$tel_type);
}]);

$query->rightJoin("t_customer","t_customer.id","=","t_customer_phones.customer_id");
$query->where("t_customer_phones.tel_type",$tel_type);
$query->select([
    "t_customer.*",
    "t_customer_phones.tel_type",
]);
$eloquentCollection = $query->get();

````

テーブル名がガリガリ出てくる感じとかあまりEloquent使ってる意味感じないけど
eager でまとめて取ってくるアタリ楽に出来るのは嬉しい。

まぁ Eloquent はクエリビルダの結果をDAO付きエンティティに流しこむだけ、
みたいな感じなのでなんでも出来るのは当然かも知れない。
(ORMのためにクエリビルダを作りなおしたFなんとかとかとは、そのへんの安心度が違う)
(というか、そういう仕組ならDAO部だけトレイト分離して、Eloquentを継承ツリーから開放できないものだろうか…) 

ただ重複列名で例えばid列とかがサブテーブルIDで上書きされちゃって、
そのうえEagerLoading時にそのIDを参照するもんだからひも付けで謎のバグが起きるところとかちょっとさすがに気づきにくいので辛い。

Eager指定時に同じ検索条件二重で書くのも気持ち悪いし、もっと楽にならないものか…
ズンドコキヨシ with Mathematica

http://qiita.com/shunsugai@github/items/971a15461de29563bf90

乗り遅れた。

```
zundoko[x_, y_, z_] := Append[#,z]&@NestWhile[Append[#,RandomChoice@{x,y}]&,{},!MatchQ[#,{___,Repeated[x,{4}],y}]&];
In[] = zundoko[ズン","ドコ","キ・ヨ・シ!"]
Out[] = {"ドコ", "ズン", "ズン", "ドコ", "ドコ", "ドコ", "ズン", "ドコ", "ドコ", "ズン", "ドコ", 
"ドコ", "ズン", "ズン", "ズン", "ドコ", "ドコ", "ドコ", "ズン", "ドコ", "ズン", "ドコ", 
"ズン", "ドコ", "ドコ", "ドコ", "ズン", "ドコ", "ドコ", "ズン", "ドコ", "ズン", "ズン", 
"ズン", "ズン", "ドコ", "キ・ヨ・シ!"}
```

# ズンドコ過程の数理

最後のキヨシを除いて、ズンドコ過程で得られる配列は`{...,"ズン","ズン","ズン","ズン","ドコ"}`。
この配列の長さが$n$である確率を$P_n$とする。
最初の"ドコ"が(1|2|3|4)番目に現れる長さ$n$で過程が終わる確率を$A_n$,$B_n$,$C_n$,$D_n$とする。
ドコが1度だけしか現れずに、長さ$n$で過程が終わる確率を$O_n$とする。

(注: 以前の版では$O_n$を忘れていた。恥ずかしい。)

$P_n = O_n + A_n + B_n + C_n + D_n$
$O_n = 2^{-n}$
$A_n = \frac{1}{2}(O_{n - 1} + A_{n - 1} + B_{n - 1} + C_{n - 1} + D_{n - 1}) = \frac{1}{2}P_{n - 1}$
$B_n = \frac{1}{2}A_{n - 1}$
$C_n = \frac{1}{2}B_{n - 1}$
$D_n = \frac{1}{2}C_{n - 1}$
というマスター方程式が立つ。
あとはこれを整理すれば$P_n = P_{n - 1} - \frac{1}{32} P_{n - 5}$となり、$P_1 = P_2 = P_3 = P_4 = 0, P_5 = \frac{1}{32}$の境界条件での解は
$P_n = \alpha_1^n\beta_1+\alpha_2^n\beta_2+\alpha_3^n\beta_3+\alpha_4^n\beta_4 - \frac{1}{3 \cdot 2^n}$
となる。

$\alpha_i$は$16 x^4 - 8 x^3 - 4 x^2 -2x - 1$の根で
$\alpha_1 \approx -0.387$
$\alpha_2 \approx 0.964$
$\alpha_3 \approx -0.0382 - 0.408 i$
$\alpha_4 \approx -0.0382 + 0.408 i$

$\beta_i$は$1689 x^4 + 1126 x^3 + 232 x^2 + 10 x - 1$の根で
$\beta_1 \approx -0.234$
$\beta_2 \approx 0.044$
$\beta_3 \approx -0.239 - 0.019 i$
$\beta_4 \approx -0.239 + 0.019 i$

実際、サンプリングして$P_n$を推定するとよく一致する。

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/46436/0898cff2-743a-8149-c24b-a4093d63e4bd.png)

## ズンドコ過程の漸近形

$n \rightarrow \infty$での$P_n$の漸近形は$P_n \approx \alpha_2^n \beta_2$

$\alpha_2$は$0.9637809877...$と$1$に近く、非常に収束が遅い。
また、$\alpha_1$の減衰モードもわりと遅い。
誤って導きがちな偽の漸近形$(1-2^{-5})^n = (31/32)^n$を、サンプリングに基づいて棄却しようとすると、かなりの数のサンプリングが必要になる。

## ズンドコ過程の平均長と分散

$a_0 = \frac{1}{2}$, $b_0 = -\frac{1}{3}$とすると、$P_n = \sum_{i = 0}^{5} a_i^n b_i$

ズンドコ過程の平均長は

$E[n] = \sum_{n = 1}^{\infty} n P_n = \sum_{i = 0}^{5} \frac{a_i b_i}{(1 - a_i)^2} = 31.98354688...$

ズンドコ過程の長さの分散は

$E[n^2] = \sum_{n = 1}^{\infty} n^2 P_n = \sum_{i = 0}^{5} \frac{a_i(a_i + 1) b_i}{(1 - a_i)^3}$
$E[n^2]-(E[n])^2 = 737.0537700...$
SystemJSでhtmlファイルをimportする


webpackとか使っているとまったく躊躇なく書ける下のようなhtmlファイルの読み込み処理。

```js
...
var template = require("../template/layout.html");
...
```
これがes6(SystemJS)のときでも同じようにimportに置き換えられるかというとそんなことはない。

だがSystemJSを用いてes6使う我々には`plugin-text`が用意されている！
https://github.com/systemjs/plugin-text

たとえば[Marionetteのチュートリアル](https://marionette.gitbooks.io/marionette-guides/content/en/getting_started/tutorial/firstview.html)にあるコードをes6の形で書き直すと下っぽい感じになってrequireのように躊躇なく書ける。すばらしい。

```js
import Marionette from "marionette";
import _ from "underscore";
import layout from "../templates/layout.html!text";

var app = new (Marionette.LayoutView.extend({
  el: "#app-hook",
  template: _.template(layout)
}));

app.render();
```
vagrantコマンド実行しても、結果が返ってこない時にやること

# Problem

`vagrant up`, `vagrant reload`, `vagrant suspend`などを実行しても、結果が返ってこなくなる時が、まれにある。

# Solution

1. VirtualBoxアプリを起動して、対象のVM右クリック > 閉じる > 電源オフ
2. `vagrant up`コマンドを実行する
HipHopVM(HHVM)のPHP7モード


HHVMは3.11のリリースから、PHP7モードを備えるようになったそうな。

[PHP 7 Support « HHVM](http://hhvm.com/blog/10859/php-7-support)

試してみるぞ。

## PHP7モード設定

設定項目の案内はこちら。

[Configuration: INI Settings #php-7-settings](https://docs.hhvm.com/hhvm/configuration/INI-settings#php-7-settings)

とりあえず有効にしてみるなら、`hhvm.php7.all = 1` で良いっしょ。


## WordPressとAmazon Linuxで試してみる

HHVMは毎度自分でビルドして、AmazonLinux用のRPMを作っている。 ビルドの内訳はこちら。 => [OpsRockin/hhvm-for-amazon-linux](https://github.com/OpsRockin/hhvm-for-amazon-linux)


これをインストール済AMIがあるので、起動する。

[WordPress Powered by AMIMOTO (HHVM)](https://aws.amazon.com/marketplace/pp/B00V5JYXTO)


```shell:
      ___         _            __
     / _ | __ _  (_)_ _  ___  / /____
    / __ |/  ' \/ /  ' \/ _ \/ __/ _ \
   /_/ |_/_/_/_/_/_/_/_/\___/\__/\___/

https://aws.amazon.com/amazon-linux-ami/2015.09-release-notes/

 Nginx 1.9.12, HHVM 3.12.1, Percona MySQL 5.6.29, WP-CLI 0.22.0

 amimoto     http://www.amimoto-ami.com/
 digitalcube https://en.digitalcube.jp/
```

うむ、`3.12.1`が入ってる。PHP7モードを有効にするため、`/etc/hhvm/server.ini`を編集。

```/etc/hhvm/server.ini
...

hhvm.php7.all = true

...
```

コンパイルされたバイナリを消しつつ、リスタートしよう。

```
$ sudo service hhvm stop
$ sudo rm -f /tmp/.hhvm.hhbc 
$ sudo service hhvm start
```

このあとシステムの情報をチェックすれば、PHPバージョンが`7.0.99-hhvm`になっている。


```
## Server Environment ##

Server Info:              nginx/1.9.12
Host:                     DBH: localhost, SRV: _
Default Timezone:         UTC
MySQL Version:            5.6.29-76.2-log

-- PHP Configuration

PHP Version:              7.0.99-hhvm
PHP Post Max Size:        
PHP Time Limit:           0
PHP Max Input Vars:       
PHP Safe Mode:            No
PHP Memory Limit:         256M
PHP Upload Max Size:      
PHP Upload Max Filesize:  
PHP Arg Separator:        &
PHP Allow URL File Open:  Yes
```


## WordPress的に注意するとこ

基本的には動くんだけど、気になる点があったのでメモ。

- /var/log/hhvm/error.log に、わんさかと型のWarningがでる。
    - ちょっと厳密にチェックするようにしたせいかしらね。
    - ex: `Warning: version_compare() expects parameter 1 to be string,`
    - ex: `Warning: setcookie() expects parameter 5 to be string,`
- 管理画面から新規プラグインが探せない（ｗ
    - 多分PHPバージョンが`7.0.99-hhvm`を返すからかな？下記画像のように止まる。

![Add_Plugins_‹_HHVM_mode_php7_—_WordPress.jpg](https://qiita-image-store.s3.amazonaws.com/0/7454/ef0702ae-c169-a05e-5887-1bf581003d63.jpeg "Add_Plugins_‹_HHVM_mode_php7_—_WordPress.jpg")


このあたりはそのうち調整されそう。
VSCodeの機能拡張を公開したらインド人からメールが来たお話

# Are you on twitter
GitHubで公開しているアドレスに知らないアドレスからメールが
スパムかと思いアドレスをググったらインドでUI、UXやってる人でtwitterやGitHub、LinkedInのアカウントが出てきた
直近のツイートで[VSCodeでSVGをプレビューする機能拡張](http://qiita.com/shoooo/items/6c34427965a4ba6639fb)を紹介されている

## メールのやり取り
以下意訳。
インド人 > ツイッターやってる？
shoooo > ツイッターはやってないよ。SVGViewerをツイートしてくれてありがとう。
インド人 > ツイートしたことどうやって知ったの？気になる。
shoooo > メアドをググッて見つけた。
インド人 > ハッハー、ナイス :+1: 

## 嬉しい
まだGitHubではちょこっとしたものをちょこっとしか公開できていないのでコンタクトされたの初めてで嬉しかった。

README日本語で書いていたの英語で書き直そう
もっと色々公開したりコントリビュートしていこう

そんな感じで海の向こうからモチベーションが上がるメールを頂けたお話。
out_exec_filterでRubyの外部モジュールが動かなかったけどディレクトリ変えたら動いたよ

#前置き
[前回](http://qiita.com/bashishi/items/25e8aa062ff39277d935)、fluentdプラグインを作ろうと思ったけど、 out_exec_filterで十分目的達成できるじゃんって気付いたので、Rubyで外部モジュール作ってそっちで処理するようにしました。

#事象
自身のホームディレクトリに作ったRubyの外部モジュールを out_exec_filter で呼び出すように /etc/td-agent/td-agent.conf に記述して再起動を実行するとログにエラーが出力されて正しく動作しない。

```text:td-agent.conf
・・・
<match xxx.log>
    type exec_filter
    command /opt/td-agent/embedded/bin/ruby /home/bashishi/td-agent/exec/hogehoge.rb
    in_format json
    out_format msgpack
    tag xxx.log.parse
</match>
・・・
```

エラー
`2016-03-16 12:43:17 +0900 [error]: exec_filter process unexpectedly exited. command="/opt/td-agent/embedded/bin/ruby /home/bashishi/td-agent/exec/hogehoge.rb" ecode=256`

#解決方法
hogehoge.rb を /etc/td-agent 配下に配置した。自分の場合は /etc/td-agent/exec/ ディレクトを作り、そこに配置しました。

```text:td-agent.conf
・・・
<match xxx.log>
    type exec_filter
    command /opt/td-agent/embedded/bin/ruby /etc/td-agent/exec/hogehoge.rb
    in_format json
    out_format msgpack
    tag xxx.log.parse
</match>
・・・
```

#注意
/etc/td-agent/ の下ならどこでもいいだろうって思って /etc/td-agent/plugin/ に置くと td-agent が起動も停止もできなくなることがあります。
/etc/td-agent/plugin/ ディレクトリは起動時に読み込むプラグイン類を配置する場所の一つらしいので、ここに標準入力からの入力待ちで無限ループしているようなモジュールを置くとプラグイン読み込み処理のところで固まります。というか固まった。
そして、モジュールも消さず、/etc/td-agent/td-agent.conf も書き換えずにサーバーの再起動をして・・・。

#原因
そのうち調べます。
パーミッションの設定の問題ではない感じ。
【AWS】AWS Elasticsearchのkibanaを使うのに困ったこと

AWS Elasticsearch Serviceを使うのに困ったことを2つ。
＊間違いがあったので修正しました(2016/03/23)

**前提**

- 社内ネットワークから構築していて、社内プロキシを使った環境です

### kibanaのURLをクリックしてもいっこうにkibanaが立ち上がらない問題

**解決策：**

- *1の"Modify access policy"にてアクセスポリシーを変更することができる
- aws:SourceIpにプロキシのIPアドレスを指定する必要がある

◎Elasticsearch

![Elasticsearch.PNG](https://qiita-image-store.s3.amazonaws.com/0/77327/390cda3d-a027-1409-4067-816c65f5c4d1.png)

◎アクセスポリシー

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Sid": "",
          "Effect": "Allow",
          "Principal": {
            "AWS": "*"
          },
          "Action": "es:*",
          "Resource":"arn:aws:es:****:************:domain/Elasticsearchのドメイン名/*",
          "Condition": {
            "IpAddress": {
              "aws:SourceIp": "プロキシのIPアドレス",
            }
          }
        }
      ]
    }

### とにかく繋がらない問題

**確認してほしいこと**

- NAT

**解決策：**

- ElasticsearchServiceはVPCの外にいるので、NATで強い制限をかけていると、繋がらない。拒否される
- アクセスポリシーにプロキシのIPアドレスに加えて、NATのIPも指定してあげる

◎アクセスポリシー

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Sid": "",
          "Effect": "Allow",
          "Principal": {
            "AWS": "*"
          },
          "Action": "es:*",
          "Resource":"arn:aws:es:****:************:domain/Elasticsearchのドメイン名/*",
          "Condition": {
            "IpAddress": {
              "aws:SourceIp": [
                "プロキシのIPアドレス",
                "NATのIPアドレス"
              ]
            }
          }
        }
      ]
    }

### kibanaが重い、Elasticsearchのコンソールも重い問題

**原因**

- インスタンスタイプが小さすぎて、CPUが大忙し
    - ElasticsearchのMonitoringタブを開いてCPUUtilizationを見ると↓のように(3/10あたり)100%ではりついてしまうため、ものすごく重くなる

![CPU.PNG](https://qiita-image-store.s3.amazonaws.com/0/77327/057c3879-e0d1-e2a7-cda8-6c653c8c85e8.png)

**解決策**

- 残念ながら、Elasticsearchのドメインを新しく作りなおすしかない
- そのときに大きめのインスタンスタイプを指定することで解決できる



### おまけ

- kibanaのIPアドレスはcliを用いて、↓で調べることができる(*2のsearch～comを指定)

        $ nslookup search**********com
        Server:
        Address:
        Non-authoritative answer:

        Name:
        Address:ココ！
fabricで任意のインスタンスへデプロイする


AWSのタグ名を取得して、任意のインスタンスへのみデプロイできるようにする。

## fabricとは
>コマンドライン 経由で 任意の Python 関数 を実行するツールです。
>
>(低レベルライブラリの上に構築された)サブルーチンのライブラリで、SSH経由で 簡単に かつ Python風に シェルコマンドを実行します

チュートリアル
http://fabric-ja.readthedocs.org/en/latest/tutorial.html
Fabric実行モデル
https://fabric-ja.readthedocs.org/ja/latest/usage/execution.html

## PrivateIPの取得

条件にマッチしたインスタンスのPrivateIPを取得して、
hostsにsetすることで指定のインスタンスへのデプロイが可能。

・起動中であるインスタンス
・Roles/Enviromentのタグに任意のものを指定

```
@task
def set_hosts(e,r):
    """ホスト一覧取得"""
    client = boto3.client('ec2', region_name=region)
    # 対象インスタンスリストの取得
    instances = client.describe_instances(Filters=[
                                    {'Name':'tag:Roles', 'Values':[r]},
                                    {'Name':'tag:Environment', 'Values':[e]},
                                    {'Name': 'instance-state-name', 'Values': ['running']}
                                    ])
    # プライベートIPをenvに入れる
    for i in instances["Reservations"]:
            env.hosts.append(i["Instances"][0]["PrivateIpAddress"])
```

## 実行

例えばvimを入れる処理を追加。

```
@task
def install_vim():
  sudo("yum -y install vim")
```

実行すれば、指定のインスタンスへvimがインストールされる。

・対象
起動中、Enviroment=dev/Roles=web

```
[ec2-user@ip-172-16-66-177 fabric]$  fab set_hosts:e=dev,r=web install_vim
[172.16.66.177] Executing task 'install_vim'
[172.16.66.177] sudo: yum -y install vim
[172.16.66.177] out: Loaded plugins: priorities, update-motd, upgrade-helper
```


## まとめ
タグ名の指定をきちんとしておけば、開発環境のWeb全台へなどのデプロイが簡単できる。
PycharmでPython Interpreterの変更を行う方法

# 目的
`virtualenv`で特定のフォルダにPython環境を構築した場合に、Pycharmがそのフォルダの環境を参照するようにする。

# 環境

| 環境要素 | 値 |
| ------- | --- |
| OS | Windows 10 (HyperV上)|
| PyCharm | PyCharm Community Edtion 5.0.4 |

# 方法

(1) PyCharmを起動し、以下の順で選択していく。

```
メニューバー > File > Settings > Project: [プロジェクト名] > Project Interpreter > 歯車ボタン > Add Local
```

(2) `virtualenv`で作成した環境の`python.exe`を指定して追加する。
(3) `Project Interpreter`のセレクトボックスから追加した環境を選択する
以上で切り替え完了。
ズンドコキヨシGolang並列版

#元ネタ

http://qiita.com/shunsugai@github/items/971a15461de29563bf90


#Go並列版

途中経過の出力不可能ですが

```go
package main

import (
	"fmt"
	"math/rand"
	"runtime"
	"sync"
	"time"
)

// Zundoko is ズンドコ配列
var Zundoko = [2]string{"ズン", "ドコ"}

func main() {
	cpus := runtime.NumCPU()
	runtime.GOMAXPROCS(cpus)
	kiyoshiCh := make(chan bool, 1)
	var m sync.Mutex
	for i := 0; i < cpus; i++ {
		go zndk(kiyoshiCh, &m)
	}

	<-kiyoshiCh
	close(kiyoshiCh)
	fmt.Println("キ・ヨ・シ!")
}

func zndk(kiyoshiCh chan bool, m *sync.Mutex) {
	zdk := make([]string, 5)
	for {
		for i := 0; i < 5; i++ {
			zdk[i] = getZndk(m)
		}
		if zdk[0] == "ズン" && zdk[1] == "ズン" && zdk[2] == "ズン" && zdk[3] == "ズン" && zdk[4] == "ドコ" {
			for _, s := range zdk {
				fmt.Println(s)
			}
			kiyoshiCh <- true
			break
		}
	}
}

func getZndk(m *sync.Mutex) string {
	m.Lock()
	defer m.Unlock()
	rand.Seed(time.Now().UnixNano())
	return Zundoko[rand.Intn(2)]
}
```
[Gradle] デフォルトのjarタスク実行時にjarに含めたくないファイルを除外する

ant駆逐中に迷ったのでメモ

```groovy
// jarに含めたくないファイルを除外
jar{
    from sourceSets.main.output
    exclude("*.dicon")
    exclude("*.bat")
    exclude("*.sh")
    exclude("*.txt")
    exclude("*.dtd")
    exclude("*.xml")
}
```

既存のタスクを簡単に拡張できるってのは素晴らしいですね。
riakのbucketの確認方法やcurlでの読み書きのやり方が覚えらんなくて困った件。

riak便利！！
便利だけど、確認用のriak-adminコマンドとか使い方いっぱいあるし、
curlとか覚えてられないので、ユーザ定義関数やAliasにしてみた。 

# 動作環境
## OS
```
CentOS release 6.2 (Final)
```

## riakのバージョン
```
[root@rittan41 ~]# riak version                          
2.1.1
[root@rittan41 ~]# 
```


# 面倒なので/etc/profile.d/配下にファイルを作って、ログイン時に自動で反映されるようにした。

```bash
cat << _EOT_ >> /etc/profile.d/riak.sh
alias riak-admin-bucket-type-list='riak-admin bucket-type list'

get_buckets_list(){
curl "http://localhost:8098/types/\$1/buckets?buckets=true"
}

put_get_check(){
DST_HOST=localhost
DATE=\`date '+%Y-%m-%d %T'\`
echo \${DATE}

curl --connect-timeout 30 -X PUT -i "http://\${DST_HOST}:8098/types/health_check/buckets/test/keys/\${DST_HOST}" -H "Content-Type: application/json" -d "{server: "\${DST_HOST}", date: \${DATE}, status: "write"}"
curl --connect-timeout 30 -s "http://\${DST_HOST}:8098/types/health_check/buckets/test/keys/\${DST_HOST}"
}

_EOT_
```

# 使い方
## riak-admin-bucket-type-list
riak-admin bucket-type listのエイリアス。
bucket-type一覧を表示させたい時に。

### 実例。
```
[root@rittan41 ~]# riak-admin-bucket-type-list 
default (active)
users (active)
health_check (active)
koizumitest (active)
[root@rittan41 ~]# 
```

## get_buckets_list session
第一引数で指定した、bucket-typeの中身を表示する関数。

### 実体。
```bash
curl "http://localhost:8098/types/\$1/buckets?buckets=true"
```

### 実例。
```
[root@rittan41 ~]# get_buckets_list session
{"buckets":["test"]}[root@rittan41 ~]# 
```

## put_get_check
ローカルで読み書きテストするための関数。
監視用途にどうぞ。

* health_checkというbucket-typeは適宜読み替えて。

### 実体。
```bash
put_get_check(){
DST_HOST=localhost
DATE=\`date '+%Y-%m-%d %T'\`
echo \${DATE}

curl --connect-timeout 30 -X PUT -i "http://\${DST_HOST}:8098/types/health_check/buckets/test/keys/\${DST_HOST}" -H "Content-Type: application/json" -d "{server: "\${DST_HOST}", date: \${DATE}, status: "write"}"
curl --connect-timeout 30 -s "http://\${DST_HOST}:8098/types/health_check/buckets/test/keys/\${DST_HOST}"
}
```

### 実例。
```bash
[root@rittan41 ~]# put_get_check health_check
2016-03-16 12:27:42
HTTP/1.1 204 No Content
Vary: Accept-Encoding
Server: MochiWeb/1.1 WebMachine/1.10.8 (that head fake, tho)
Date: Wed, 16 Mar 2016 03:27:42 GMT
Content-Type: application/json
Content-Length: 0

{server: localhost, date: 2016-03-16 12:27:42, status: write}
[root@rittan41 ~]# 
```
Could not read entry ':app:package~' from cache taskArtifacts.bin と出た時の対処法


gradleビルド時に以下のエラーが出た時の対処法です。

```
FAILURE: Build failed with an exception.

* What went wrong:
Could not read entry ':app:packageDevelopDebug' from cache taskArtifacts.bin (/Users/konifar/work_private/droidkaigi2016/.gradle/2.11/taskArtifacts/taskArtifacts.bin).
> com.android.build.gradle.tasks.PackageApplication$DexPackagingPolicy
```

結論から言うと、キャッシュが悪さをしているのでプロジェクト内の`.gradle`ディレクトリを消してビルドし直せばエラー解消するはずです。このディレクトリは、ビルド時に再生成されるので消しても問題ないです。

ただし、キャッシュを消すとライブラリのダウンロードも全てやり直すので初回のビルド時間が長くなるので注意してください。
ズンドコキヨシ with Objective-C 今風

今はやりのズンドコキヨシのObjective-C での実装がすでにあったのですが、今風ではないなぁと思ったので
http://qiita.com/takezou621@github/items/84fc84645fcb94af2524
この方の実装を参考に僕が今風だと思う実装に書き換えてみました



```objc

void zundokokiyosi() {
    NSString *zun = @"ズン";
    NSString *doko = @"ドコ";
    NSArray<NSString *> *zundoko = @[zun, doko];
    NSArray<NSString *> *expected = @[zun,zun,zun,zun,doko];
    NSArray<NSString *> *list = @[@"", @"", @"", @"", @""];
    
    while (![list isEqualToArray:expected]) {
        NSUInteger val = arc4random_uniform(2);
        NSLog(@"%@", zundoko[val]);
        list = @[list[1], list[2], list[3], list[4], zundoko[val]];
    }

    NSLog(@"キ・ヨ・シ！");
}
```

ジェネリクスを使ったが意味がない...

3/18:
   テストして修正
Sublime Text > ひとつ前に検索したもので検索しなおす > Ctrl+F / 上キー

```txt:動作確認
Sublime Text2 on Windows 7 pro 32bit
```

リファクタリングを実施中。
不要となったコードをどんどん消している。

手順として

1. 削除変数で検索
2. 検索結果から該当コードへジャンプ
3. 削除
4. 2に戻る
5. 全部消えたかどうか検索

上記の手順5において、削除したキーワードで検索しなおさないといけない。でもそのキーワードはすでにソースにはない。

その場合に「ひとつ前に検索したもので検索しなおす」ことが必要となる。

手順

1. Ctrl+F
2. (Find:にフォーカスがあるようにする)
3. 上キー > 前のキーワードが出てくる
4. Enter
laravel document勉強１

- プロジェクト作成  
    ```composer create-project laravel/laravel blog "5.1.*"```
- フォルダ権限設定  
    Directories within the `storage` and the `bootstrap/cache` directories should be writable by your web server 
- Application Keyの作成  
    ```php artisan key:generate```  
  **If the application key is not set, your user sessions and other encrypted data will not be secure!**
- config cache 起動スピードアップ  
 ```php artisan config:cache```  
 - production環境ではやるべき
 - 開発環境ではconfig良く変わるので、要らない。cacheした後の変更内容は反映されなかったり、phpunitで別の設定をしても、効かない等の現象が起こる
EC2 インスタンスに割り当て可能なロールを制限する（PassRole )

##pass role
割り当て可能なロールを制限できる。
基本的に、IAMUserに設定するもの。
EC2やcodedeployなどへIAMRoleを設定する際の権限。
お前はこのRoleしか設定できないからな、みたいな。

こんな感じ

```
{
  "Version": "2012-10-17",
  "Statement": [{
    "Effect": "Allow",
    "Action": [
      "iam:PassRole",
      "iam:ListInstanceProfiles",
      "ec2:*"
    ],
    "Resource": "*"
  }]
}
```

http://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_roles_use_switch-role-ec2.html
PHPでgoto

## phpでもgoto使えたんだという話
プログラムの可読性を破壊的に低下させると噂のgoto
でもPHPでは使いドコロがない
多重ループを設定で抜けられるから `break 2;`

### プログラム
``` php:goto.php
<?php

goto end;

start:
    echo 'start.' . PHP_EOL;
goto sotti;

atti:
    echo 'atti.' . PHP_EOL;
goto start;

sotti:
    echo 'sotti.' . PHP_EOL;
exit;

end:
    echo 'end.' . PHP_EOL;
goto atti;
```

### 出力結果

```console
$ php goto.php
end.
atti.
start.
sotti.
```
この程度なら追えるけど、長くなるとヤバイ

### 制約
* 対象となるラベルは同じファイル上の同じコンテキスト
    * つまり関数外から関数内の行き来はできない
* forやifの中のラベルにもgotoできない
* ラベルにもgotoにも変数は利用できない
    * 出来たらヤバイ　便利かもしれないけど更にカオスになる