OmniAICreator/Qiita-1.07M huggingface dataset:
【Swift 3】処理の完了を待ってから後続処理を行う

##背景
非同期で幾つか処理をしている状態で、値の取得が完了したら後続処理を行いたい場合がありました。
セマフォで後続処理を行わないようにしていましたが、記述箇所が増えてしまい、
見通しが悪くなってきたので、待機条件と後続処理をBlockで記述できるようにExtensionを書きました。


##コード
```swift
/// 条件をクリアするまで待ちます
///
/// - Parameters:
///   - waitContinuation: 待機条件
///   - compleation: 通過後の処理
func wait(_ waitContinuation: @escaping (()->Bool), compleation: @escaping (()->Void)) {
    var wait = waitContinuation()
    // 0.01秒周期で待機条件をクリアするまで待ちます。
    let semaphore = DispatchSemaphore(value: 0)
    DispatchQueue.global().async {
        while wait {
            DispatchQueue.main.async {
                wait = waitContinuation()
                semaphore.signal()
            }
            semaphore.wait()
            Thread.sleep(forTimeInterval: 0.01)
        }
        // 待機条件をクリアしたので通過後の処理を行います。
        DispatchQueue.main.async {
            compleation()
        }
    }
}

```

##使い方
```swift
var imgData: NSData! = nil
DispatchQueue.global().async {
    imgData = NSData(contentsOf: URL(string: "http://hogehoge.com/fugafuga.png")!)
}
// dataを取得するまで待ちます
wait( { return imgData == nil } ) {
	// 取得しました
    print("finish")
    UIImage(data: imgData as Data)
}
```
FactoryGirlのファイルアップロードを速くする


FactoryGirl + Paperclip（たぶんCarrierWaveも同じ）で画像などのファイルデータを作成したいニーズは結構あります。バリデーションの都合とかで。そんなにデータがないのであれば下記のように `fixture_file_upload` 書けばOKと思います。

```ruby
FactoryGirl.define do

  factory :image, class: Image do
    file { fixture_file_upload("spec/file/dummy.jpg", "image/jpeg") }
  end
  
end
```

しかし、僕の環境だと一定の数のテストデータを作成するとRSpecが応答不能になるという事態に遭遇しました。今回のテストだと、実際のファイル自体にたいしてテストするということはなかったので、下記のように単純にDBフィールドに適当なデータを突っ込むことで高速化できました。

```ruby
FactoryGirl.define do

  factory :image do
    file_file_name "dummy.jpg"
    file_content_type "image/jpeg"
    file_file_size "1024"
    file_updated_at "2017-01-01"
  end
  
end
```

試しにベンチマークも取ってみました。 `fixture_file_upload` 以外にも単純に `File.open` するタイプも付け足しています。

### spec/factories/images.rb

```ruby
FactoryGirl.define do

  factory :image_fixture, class: Image do
    file { fixture_file_upload("spec/file/dummy.jpg", "image/jpeg") }
  end
  
  factory :image_file, class: Image do
    file { File.open("spec/file/dummy.jpg") }
  end
  
  factory :image_field, class: Image do
    file_file_name "dummy.jpg"
    file_content_type "image/jpeg"
    file_file_size "1024"
    file_updated_at "2017-01-01"
  end

end
```

### bm.rb

```ruby
Benchmark.bm 10 do |r|
  r.report "fixture" do
    DatabaseCleaner.start
    5.times do
      FactoryGirl.create(:image_fixture)
    end
    DatabaseCleaner.clean
  end
  
  r.report "file" do
    DatabaseCleaner.start
    5.times do
      FactoryGirl.create(:image_file)
    end
    DatabaseCleaner.clean
  end
  
  r.report "field" do
    DatabaseCleaner.start
    5.times do
      FactoryGirl.create(:image_field)
    end
    DatabaseCleaner.clean
  end
end
```

### 結果

```
$ RAILS_ENV=test rails runner bm.rb

                 user     system      total        real
fixture      0.130000   0.050000   0.660000 (  0.888103)
file         0.260000   0.120000   0.840000 (  1.118591)
field        0.050000   0.010000   0.060000 (  0.075582)

```

当然ですがファイルを何もいじらないフィールドを埋めるのが一番高速ですね。
Ubuntu16.04LTS に Ruby2.2.3をインストール

#環境
OS： Ubuntu１６．０４LTS　（Xenial Xerus)
Ruby: 2.2.3をインストールしたい


#手順

(参考URL）[Ubuntu16.04（Xenial)でRoRをはじめる](http://qiita.com/knjname/items/2ea61d5ff8c89c17b704)

##1.rbenv等パッケージインストール

```
sudo apt-get install rbenv
sudo apt-get install ruby-build
sudo apt-get install ruby-dev
sudo apt-get update
```

##2.rbenvの初期化

```
echo 'eval $(rbenv init -)' >> ~/.profile
```

リロードする。

```
. /.profile
hash -r
```

PATHの確認をする

```
echo "#{PATH}"
```

##3.インストール

以下コマンドでインストール可能なrubyのバージョンを確認します。

```
rbenv install --list
```

今回は、無印の最新版である2.2.3をインストールします。

```
rbenv install 2.2.3
```

実行結果は以下の通り、、、エラーが発生しました。。。

```
Downloading ruby-2.2.3.tar.gz...
-> https://dqw8nmjcqpjn7.cloudfront.net/df795f2f99860745a416092a4004b016ccf77e8b82dec956b120f18bdc71edce
Installing ruby-2.2.3...

BUILD FAILED (Ubuntu 16.04 using ruby-build 20151028)

Inspect or clean up the working tree at /tmp/ruby-build.20170213171745.9277
Results logged to /tmp/ruby-build.20170213171745.9277.log

Last 10 log lines:
compiling ../.././ext/psych/yaml/dumper.c
compiling ../.././ext/psych/yaml/loader.c
installing default psych libraries
linking shared-object psych.so
make[2]: ディレクトリ '/tmp/ruby-build.20170213171745.9277/ruby-2.2.3/ext/psych' から出ます
linking shared-object ripper.so
make[2]: ディレクトリ '/tmp/ruby-build.20170213171745.9277/ruby-2.2.3/ext/ripper' から出ます
make[1]: ディレクトリ '/tmp/ruby-build.20170213171745.9277/ruby-2.2.3' から出ます
uncommon.mk:189: ターゲット 'build-ext' のレシピで失敗しました
make: *** [build-ext] エラー 2
```

##４.エラーの対処

上記メッセージの８行目に

```
Results logged to /tmp/ruby-build.20170213171745.9277.log
```

とあり、こちらのエラーを確認したところ、
１）libffi-dev が無いことが原因
2)open-ssl関連が悪さをしている
と２箇所怪しいところがありました。

ますは1)を解消するために、

```
sudo apt-get install libffi-dev
```

を実行するも、エラー内容は変わりません。

2)に対して、rubyインストール時のopen-ssl関連のエラーを探したところ、GitHubで以下のページを発見しました。
[Cannot install Ruby 2.2.3 in ubuntu 14.04]（https://github.com/rbenv/ruby-build/issues/834）

上記ページを参照し、以下のコマンドを実行します。

```
curl -fsSL https://gist.github.com/mislav/055441129184a1512bb5.txt | rbenv install --patch 2.2.3
```

無事インストールが完了しました^^
ES2015 フレンズ（相手のすべてを受け入れる関数の作成）

# 仕様
- 全てを肯定するメッセージを返す。
- 実行時の引数で出力する技能を渡せる。
- メソッドチェーンで賞賛してもらえる技能の変更が可能。

# サンプルコード
- [実行サンプル](http://codepen.io/yama-t/pen/LxMJWv)

## シンプル

```js
class フレンズ {
  constructor(skill) {
    this.greetList = ['わーい', 'すごーい', 'たのしー'];
    this.フレンズ(skill);  
  }
  フレンズ(skill = '何か') {
    this.skill = skill;
    return this.setMessage();
  }
  mes(){
    return this.message;
  }
  setMessage(){
    this.message = this.makeMessage();
    return this;
  }
  makeMessage() {
    return [...this.greetList, `君は${this.skill}がとくいな、フレンズなんだね!!`].join('\n');
  }
  toString() {
    return this.message;
  }
}

console.log(new フレンズ().message);
/*
わーい
すごーい
たのしー
君は何かがとくいな、フレンズなんだね!!
*/

console.log(new フレンズ('ゲーム').mes());
/*
わーい
すごーい
たのしー
君はゲームがとくいな、フレンズなんだね!!
*/

console.log(new フレンズ('パソコン').message);
/*
わーい
すごーい
たのしー
君はパソコンがとくいな、フレンズなんだね!!
*/

console.log(new フレンズ('パソコン').フレンズ('JavaScript').message);
/*
わーい
すごーい
たのしー
君はJavaScriptがとくいな、フレンズなんだね!!
*/
```

## getter, setterパターン
```js
class フレンズ {
  constructor(skill) {
    this.greetList = ['わーい', 'すごーい', 'たのしー'];
    this.フレンズ(skill);
  }
  フレンズ(skill) {
    this.skill = skill;
    this.mes = this.skill;
    return this;
  }
  get mes(){
    return this.message;
  }
  set mes(skill) {
    this.message = [...this.greetList, `君は${skill}がとくいな、フレンズなんだね!!`].join('\n');
  }
  get skill(){
    return this._skill;
  }
  set skill(skill = '何か'){
    this._skill = skill;
  }
  toString() {
    return this.message;
  }
}

console.log(new フレンズ('パソコン').message);

/*
わーい
すごーい
たのしー
君はパソコンがとくいな、フレンズなんだね!!
*/

console.log(new フレンズ('ゲーム').フレンズ('シューティングゲーム').mes);

/*
わーい
すごーい
たのしー
君はシューティングゲームがとくいな、フレンズなんだね!!
*/
```

### 得意なことをつなげる
新しい技能を渡されたら、上書きせずに以前渡された技能とつなげてまとめて出力する。

```js
class フレンズ {
  constructor(...skill) {
    this.greetList = ['わーい', 'すごーい', 'たのしー'];
    this._list = [];
    this.フレンズ(...skill);
  }
  フレンズ(...skill) {
    this.skillList = skill;
    this.skill = this.skillList;
    this.mes = this.skill;
    return this;
  }
  get mes() {
    return this.message;
  }
  set mes(skill) {
    this.message = [...this.greetList, `君は${skill}がとくいな、フレンズなんだね!!`].join('\n');
  }
  get skillList() {
    return this._list;
  }
  set skillList(skill) {
    this._list = this._list.concat(...skill);
  }
  get skill() {
    return this._skill;
  }
  set skill(skillList) {
    this._skill = skillList.map(v => v + '').filter(v => v.length > 0).join('と') || '何か';
  }
  toString() {
    return this.message;
  }
}

console.log(new フレンズ('ゲーム', 'シューティングゲーム').フレンズ('サッカー').mes);

/*
わーい
すごーい
たのしー
君はゲームとシューティングゲームとサッカーがとくいな、フレンズなんだね!
*/

console.log(new フレンズ(['サッカー', '野球']).フレンズ('バスケットボール').フレンズ('テニス').mes);

/*
わーい
すごーい
たのしー
君はサッカーと野球とバスケットボールとテニスがとくいな、フレンズなんだね!!
*/

console.log(new フレンズ('ゲーム', 'シューティングゲーム').フレンズ('サッカー').skillList);
// ["ゲーム", "シューティングゲーム", "サッカー"]

```


# まとめ
- メソッドチェーンの勉強になった。
- getter, setterの勉強にもなった。

# リンク
- [わーい、すごーい](http://qiita.com/simiraaaa/items/e8362987c10c4d572e52)
laravel5.4でDBのFetchModeを配列に切り替える

久しぶりにlaravelを利用しようとしたら、DBの結果を配列で取得できなくなっていたのでメモ。

5.4では基本的にオブジェクトでしか返さないように変更になったようです。

それでも使いたい方はイベントでフックさせてください。

```php
Event::listen(StatementPrepared::class, function ($event) {
    $event->statement->setFetchMode(PDO::FETCH_ASSOC);
});
```

laravelのクエリビルダーやEloquentをスタンドアローンで使用したい場合は、下記のとおりにしましょう。

```php
$dispatcher = new Illuminate\Events\Dispatcher;
$dispatcher->listen(Illuminate\Database\Events\StatementPrepared::class, function ($event) {
    $event->statement->setFetchMode(PDO::FETCH_ASSOC);
});
```


参考:

issue
https://github.com/laravel/framework/issues/17557
アップグレードガイド
https://laravel.com/docs/5.4/upgrade#upgrade-5.4.0
Jenkins Git publisherでデイリーリリースをタグ付けする


どの変更分までをリリースしたりテストしたりしたかを確認する必要がでてきたため、
デイリーのリリース結果としてリリース用ブランチのタグ打ちを自動化した履歴

用意されてるものだけだと普通に出来るが、
ちょっと名前など工夫入れようとしたらハマったためメモ

# 前提

* 内部で利用しているGitLabからソースを取得している
* 通信の制約上Webhookでいい感じに使えない
	* Pollingで頑張るしかない...

# Plugin

* Git plugin
	* リポジトリでGitを使っているため利用
	* タグ打ちする時にも使ってる
* Environment Injector Plugin
	* Git Publisherに渡すタグ名の環境変数を入れるために利用


# やったこと

1. 上記Pluginを入れておく

2. Gitリポジトリから取得できるよういい感じになにがしかする
	* ![test-branch-tag Config [Jenkins] 2017-02-13 17-49-43.png](https://qiita-image-store.s3.amazonaws.com/0/12433/39d9b726-4b44-6cbc-7c05-1bdb86312121.png "test-branch-tag Config [Jenkins] 2017-02-13 17-49-43.png")
	* RepositoryとCredentialsは通常通り設定
	* Advancedから表示されるNameは適宜つける(あとで使う)

3. SCMをポーリングで適宜設定する(悲しい)

4. ビルドの実行で環境変数を入れる
	* ![test-branch-tag Config [Jenkins] 2017-02-13 17-55-03.png](https://qiita-image-store.s3.amazonaws.com/0/12433/91d3331d-7473-c791-d42b-e55f2f340d73.png "test-branch-tag Config [Jenkins] 2017-02-13 17-55-03.png")
	* `echo "DATE=$(date +%Y%m%d_%H%M%S)" > tmp.prop`
		* Env Inject Pluginで読める環境変数の組をTextに落とす
	* 環境変数のインジェクトジョブで上記で作成した `tmp.prop` を呼び出してジョブ全体で使える環境変数を適用
	* gitのユーザ設定周りはJenkinsのサーバGlobalに設定していない場合やる
		* Jobごとに変わりそうだったのでここに入れている

5. Git Publisherでもろもろ設定する
	* ![test-branch-tag Config [Jenkins] 2017-02-13 17-59-09.png](https://qiita-image-store.s3.amazonaws.com/0/12433/f37862b2-1eeb-ea86-b79f-d468faae07e3.png "test-branch-tag Config [Jenkins] 2017-02-13 17-59-09.png")
	* Env Inject Pluginを使うとビルド後の処理でも環境変数を使える
		* 「ビルドから利用可能な環境変数の一覧」に記載されてるものはこのPluginで適用しなくても大丈夫な模様
	* Target remote nameはあとで使うと記載したNameを入れる


おつかれやまでした
Cognos Analyticsを無料で自己学習する① - アカウントの作成

##Cognos Analyticsとは
Cognos Analyticsとは、IBMの従来型Business Intelligenceツールである、Cognos Business Intelligenceの後継製品で、BI業界の世界3台製品の1つです。
基本的にCognos BIでの機能は継続して保持した上で、近年BI業界のトレンドになっているセルフサービスBIの機能を拡張し、よりエンドユーザーにフレンドリーになった製品がCognos Analyticsです。

Cognos Analyticsの90日間の無料トライアルを利用して、何回かに分けてCognos Analyticsを学習したいと思います。
完全にCognos初心者でも問題なく学べるように意識して記事を書きたいと思いますが、Cognos BIは経験あるがCognos Analyticsは環境が無くて学べてないという方も、是非この記事を通じて触って学んで頂ければと思います。


##Cognos Analyticsにアクセスする手順
以下のURLにアクセスして下さい。
https://www.ibm.com/analytics/us/en/technology/products/cognos-analytics/

赤枠の「Get Started Now」をクリックします。
![001.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/8ead9d1c-30e3-82fb-72f5-3638accb3618.png)

「Free trial」をクリックします。
![002.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/24c8dd6e-57a7-fe01-1d1c-9bc7bf43e24e.png)

大きな赤枠内の必要事項を記入して、小さな赤枠の「Continue」を選択します。
![003.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/b0a999b6-c62b-5792-a4e8-8547f694ee3b.png)

以下の画面が表示されますので、登録したメールを確認します。
![004.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/1812b945-c076-eb8a-0c19-4bd88338dcd9.png)

以下のようなメールが送付されてきていますので、赤枠の7桁の数字を確認し、
![005.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/1039caa5-94b4-8e7b-3896-e24033fd9a83.png)

先ほどの画面の「Confirmation code」に入力し「Register」を選択します。
![006.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/d4032437-d476-6d6c-e961-aee32eb6f235.png)

するといきなりCognos Analyticsのポータル画面にログインされますので、これにて学習が可能になります。
![007.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/44d6c634-4803-1559-955d-baf2cb9eb694.png)

ちなみにログオフする場合は、赤枠の名前を選択頂き、プルダウンから「サインアウト」を選択します。
![008.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/7537f4fb-f6d6-9459-06c4-9ed8b758e8aa.png)

二回目以降にログインする場合は、先のURLにアクセスして、「Sign-in to trial」をクリックします。
![009.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/d9522239-5fef-8c60-e992-bbd559bc5595.png)

登録したメールアドレスを入力し「Continue」を選択します。
![010.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/330ed482-7044-6a98-69b2-39fed7c00692.png)

パスワードを入力し「Sign in」を選択すると、Cognos Analyticsにログインされます。
![011.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/92e83959-4ab0-60cd-6131-e0f669e48cd3.png)


とりあえず今回はここまでで、次回以降引き続き投稿したいと思いますが、直ぐにでもCognos Analyticsの新機能を触ってみたいという方は、下の記事に色々と投稿していますので、これを参考に触ってみてください。

**Cognos Analytics 新機能紹介 - 一覧**
http://qiita.com/shinyama/items/eabf2076e7c0ecaa6b44


以降を投稿しましたら、こちらにリンクを貼ります。

**第一回：アカウントの作成**
http://qiita.com/shinyama/items/6cb67ac7e82e9cd9c889

**第二回：簡単なレポートの作成&データのアップロード**
http://qiita.com/shinyama/items/af378eede10f9c61eec2

**第三回：データモジュール**
http://qiita.com/shinyama/items/c1b7908b2a8bed2c1523

**第四回：Bluemix dashDBとの接続**
http://qiita.com/shinyama/items/5407cf12bd5575f50c47

**番外編：Cognos 10 BI と Cognos Analyticsの機能マッピング一覧**
http://qiita.com/shinyama/items/484dc322c3cbdb2cda63
Redmine Apache設定ファイルの作成



前提条件
========


0. 準備
=======


0.1. AMI設定情報ディレクトリの指定
----------------------------------

```bash:変数の指定:
DIR_CONF_AMI='config-ami-handson-20170213'
```

```bash:コマンド:
mkdir -p ${DIR_CONF_AMI}
```


1. 事前作業
===========


1.1. Apache設定ファイルの指定
-----------------------------

```bash:変数の設定:
FILE_INPUT="${DIR_CONF_AMI}/httpd-redmine.conf" \
        && echo ${FILE_INPUT}
```


2. Apacheの設定ファイル作成 (Redmine部分)
=========================================

```bash:コマンド:
cat << EOF > ${FILE_INPUT}
<Directory "/var/lib/redmine/public">
  Require all granted
  #Order allow,deny
  #Allow from all
</Directory>

# remove Passenger additional HTTP headers
#
Header always unset "X-Powered-By"
Header always unset "X-Runtime"

# Passenger tuning
# (https://www.phusionpassenger.com/library/config/apache/reference/)
PassengerMaxPoolSize 20
PassengerMaxInstancesPerApp 4
PassengerPoolIdleTime 864000
PassengerHighPerformance on
PassengerStatThrottleRate 10
PassengerSpawnMethod smart
PassengerFriendlyErrorPages off

RackBaseURI /redmine
EOF

cat ${FILE_INPUT}
```


3. 事後作業
===========


完了
====
fish shellで長いコマンドが終わったら通知する(OS X, powerline)

最近zshからfish shellに移行してみました。
shellは詳しくないんですが、fishはzshよりも気軽に書けそうな雰囲気があり、自分で設定を書いてみてます。

今回は[zsh-notify](https://github.com/marzocchi/zsh-notify)をfishで実装してみました。

# やりかた
必要なもの

- [julienXX/terminal-notifier](https://github.com/julienXX/terminal-notifier) `brew install terminal-notifier`

```~/.config/fish/config.d/fish-notify.fish
function fish_notify --on-event fish_prompt
    set _display_status $status
    if test $CMD_DURATION
        set secs (math "$CMD_DURATION / 1000")
        # 3秒以上掛かったら通知する
        if test $secs -ge 3
            terminal-notifier -title $history[1] -message "Returned $_display_status, took $secs seconds"
        end
    end
end

```

# 調べたこと

すでに同じ目的のモノがあって、

- [fish shell で長いコマンドが終わったら通知センターに知らせる - Qiita](http://qiita.com/na-o-ys/items/5f56fc96a9a07f0f0f08)

こちらではpromptのデザインを決める`function fish_prompt`の中で実行時間`$CMD_DURATION`を参照して通知するか決めていたんですが、自分は[powerline](https://github.com/powerline/powerline)も使いたかったので、上書きしない方法を検討しました。

zsh-notifyを見ると、`add-zsh-hook`というのでコマンドが出力する前に関数をhookしていたので、同様のことをfishでもできないかと調べると[--on-event](https://github.com/fish-shell/fish-shell/blob/master/doc_src/function.txt)というものがあり今回はこれを使いました。

# 参考
- [Macで時間のかかるコマンドが終わったら、自動で通知するzsh設定 - Qiita](http://qiita.com/kei_s/items/96ee6929013f587b5878)
- [$status in Fish prompt always prints 0 - Super User](http://superuser.com/questions/893186/status-in-fish-prompt-always-prints-0)
- [fish-shell/function.txt at master · fish-shell/fish-shell](https://github.com/fish-shell/fish-shell/blob/master/doc_src/function.txt)
アカウントと価格プラン

CDN は通常コミットをするもの、と思いますが、Fastly では Month-to-month の契約も提供しています。今回の記事では、その設定の方法と解約手法までを Fastly のドキュメントを基に説明したいと思います。

## アカウントとプランの種類
Fastly は色々なアカウントと価格プランを提供しています。

### 無料開発者トライアル
弊社では無償で弊社サービスをテストできる開発者トライアルを提供しています。ご利用にあたって、全ての要求を満たすか確認するために最大 $50 までの転送量を無償で提供しています。サインアップするだけでテストを始めることができます。

弊社ではトライアル期間も機能制限は行ないません。テストが完了し、弊社経由で配信を行なう準備が整ったら、有償アカウントに切り替えることができます。

### 有償アカウント（契約書なし）
トライアル期間が終了した後、契約に署名することなくファストリーのサービスを月毎のご契約で利用できます。現在の請求先住所とクレジットカード情報を必ず登録してください。その上で、「Billing」ページにアクセスして「Pricing Plan」タブにある「Pricing Plan」エリアで「Paid」を選択することで有償アカウントに変更してください。請求先住所が登録されていない場合は登録をお願いします。

![billing-pricing-plan-paid-account.png](https://qiita-image-store.s3.amazonaws.com/0/39350/84666890-dad9-1d0f-2c30-125735e47500.png)

有償プランに変更すると、開発者トライアルオプションは選択できないようになり、登録されているクレジットカードに毎月末に利用料金を請求いたします。なお、アカウントはいつでも解約することが可能です。

### コミット契約
もし転送量が毎月 2TB 以上、かつ TLS 証明書サービスオプションが必要、または転送量が毎月 4TB 以上ある場合、コミット契約を検討することも可能です。その際は、 sales@fastly.com (日本なら japan@fastly.com)に連絡してください。特定の業種向けのソリューションも提供しています。(例：Eコマースパッケージ)

### 無料オープンソース開発者アカウント
弊社は積極的にオープンソースに貢献しており、可能な限りコミュニティをサポートしています。オープンソース開発者の方であれば料金は弊社が負担します。まずは community@fastly.com までご連絡ください。

## アカウントの解約
アカウントを解約はアカウントオーナーが以下の手順に沿って行なうことができます:

1. Fastly のウェブインタフェースにログインする。
2. ユーザメニューから「Account」を選択する。

![user-menu.png](https://qiita-image-store.s3.amazonaws.com/0/39350/c7a96d1a-c32a-d425-360d-2a548eb921fe.png)

アカウント情報が表示されます。

3. 「Company Settings」で、「Cancel Account」ボタンをクリックします。

![account-company-settings.png](https://qiita-image-store.s3.amazonaws.com/0/39350/aff3cb4c-a947-6724-7d74-8c6463ad5a72.png)

確認画面が表示されます。

確認画面の「Your password」フィールドで、パスワードを入力し、「Confirm」をクリックすることでアカウントを解約することができます。
アカウントが解約されると、解約をした日の時点での残高が請求されます。最後の請求に関するご質問は、弊社請求チームにご連絡ください。もしアカウントを再度利用したい場合は、弊社サポートにご連絡いただくことで再度有効にすることができます。
Redmine データベース接続設定ファイルの作成




前提条件
========


0. 準備
=======


0.1. DB設定情報ディレクトリの指定
---------------------------------

```bash:変数の指定:
DIR_CONF_DB='config-db-handson-20170213'
```

```bash:コマンド:
mkdir -p ${DIR_CONF_DB}
```



0.2. AMI設定情報ディレクトリの指定
----------------------------------

```bash:変数の指定:
DIR_CONF_AMI='config-ami-handson-20170213'
```

```bash:コマンド:
mkdir -p ${DIR_CONF_AMI}
```


1. 事前作業
===========


1.1. db接続情報の指定
---------------------

今回は、下記の情報を使います。(ハンズオン終了後、インスタンス削除予定です。)

```bash:変数の設定:
RDS_INSTANCE_ENDPOINT='postgre-dev-20170213.cmn5szrcljpv.ap-northeast-1.rds.amazonaws.com'
```

```bash:変数の設定:
RDS_DB_NAME='redmine_db'
```

```bash:変数の設定:
RDS_USER_NAME='redmine_admin'
```

```bash:変数の設定:
RDS_USER_PASS='#DBPass123'
```


2. AMI設定情報の作成
====================

```bash:変数の設定:
FILE_INPUT="${DIR_CONF_AMI}/database.yml"
```

```bash:コマンド:
cat << ETX

        FILE_INPUT:            ${FILE_INPUT}
        RDS_INSTANCE_ENDPOINT: ${RDS_INSTANCE_ENDPOINT}
        RDS_DB_NAME:           ${RDS_DB_NAME}
        RDS_USER_NAME:         ${RDS_USER_NAME}
        RDS_USER_PASS:         ${RDS_USER_PASS}

ETX
```

```bash:コマンド:
cat << EOF > ${FILE_INPUT}
      production:
        adapter: postgresql
        database: ${RDS_DB_NAME}
        host: ${RDS_INSTANCE_ENDPOINT}
        username: ${RDS_USER_NAME}
        password: "${RDS_USER_PASS}"
        encoding: utf8
EOF

cat ${FILE_INPUT}
```


3. 事後作業
===========


完了
====
サーバーサイドもswiftで書きたい！！webフレームワーク:vapor編

# はじめに

swiftがオープンソース化して、サーバーサイドもswiftで書いてみたい！と思っていたけど
開発途中でまだ触るのは早いかな？と様子を見ていました。

そろそろ触ってみるか！と思い立って、とりあえず今勢いが良さそうなvaporを触ってみました。
サクッと使えたのでインストールや基本的な使い方についてメモしておきます。

# [vapor](https://vapor.codes/)ってなに？

* swiftのwebフレームワーク
* phpのフレームワーク[laravel](http://laravel.jp/)に影響を受けている
* Proudly sponsored by Nodes
* slackでのサポートあり
* 2017/2/13現在でgithubのスター数：８７００超え

# vaporを使うその前に・・・
## swiftenvの導入

swiftenvはswiftのバージョン管理ツール

swiftは開発速度や変更点が多いので
バージョン管理して状況に応じて切り替えて使うのがオススメ！

## インストール 

```
＄ brew install kylef/formulae/swiftenv
```

## 環境設定

```
$ echo 'if which swiftenv > /dev/null; then eval "$(swiftenv init -)"; fi' >> ~/.bash_profile
$ source ~/.bash_profile
```

## スナップショットのインストール

https://swift.org/download/#snapshots
上記からスナップショットのURLを取得してくる

```
$ swiftenv install <スナップショットのURL>
```

## インストール済みスナップショットの確認

```
$  swiftenv versions 
　　　　　　DEVELOPMENT-SNAPSHOT-2016-04-12-a 
 * DEVELOPMENT-SNAPSHOT-2017-01-27-a 
```

「*」は使用中のバージョン

## 使用するスナップショットの指定

```
$ swiftenv global <使用するバージョン>
```

# vaporの使い方

## インストール

```
$ brew install vapor/tap/toolbox
```

## プロジェクトの作成

```
$ vapor new <プロジェクト名>
```

## ビルド

```
$ cd <プロジェクト名>
$ vapor build
```

## サーバー立ち上げ

```
$ vapor run serve 
```

## 表示確認

http://0.0.0.0:8080/
にアクセスして下記画面が出ればOK

![vaporTop.png](https://qiita-image-store.s3.amazonaws.com/0/142453/887f40be-39fb-a5f1-6176-bcb7125132ac.png)

# その他メモ

## Xcodeでソースコード編集したい

```
$ cd <プロジェクト名> 
$ vapor xcode
```

# 設定ファイル周り

* jsonで記述
* Configディレクトリ下に置く
* 環境ごとに設定を変えられる
* ディレクトリは3種類
  production/development/secrets
* secretsディレクトリはどの環境でも最優先で読まれ、デフォルトで.gitignore対象

```
WorkingDirectory/
├── Config/
│   ├── server.json
│   ├── production/
│   ├── development/
│   └── secrets/
```

# vaporのコアクラス

## Droplet

ルート登録、サーバーの起動、ミドルウェアの追加などを行うVaporのコアクラス 

```
import Vapor
let drop = Droplet()

// your magic here

drop.start()
```

>蒸気(vapor)を取り込んで(import)
>雫(droplet)を作る

# 使用例

```Config/server.json 
{
  "http": {
    "host": "0.0.0.0",
    "port": 8080
}
```

```Sources/App/main.swift 
import Vapor
let drop = Droplet()

let host = drop.config["server", "http", "host"]?.string
```


## まとめ

導入はサクッとできた！
herokuにbuildpackもあるから、実際簡単に何か作りたいときはheroku使うといいかも。
筆者もherokuで試してますが、ビルドがやたら遅い。。
でも開発は活発なようなので今後の発展に期待してます!!
kintoneがWebhook対応になった。

kintoneから外部サービスへのアクセス

これまで、kintoneのレコード作成、変更、ステータス変更のイベント時に外部のWEBサービスを参照した結果を得る場合は、kintone.Promiseやkintone.proxyを使っていたが、2017年2月版kintoneからWebhookが使えるということを知った。

アプリのID,レコード番号、操作の種類（作成、変更、ステータス変更）、レコード内容まで送ってくれちゃいます。

kintoneアプリの設定　カスタマイズ／サービス連携　にあります。

![webhookregss1.png](https://qiita-image-store.s3.amazonaws.com/0/165301/737c3662-7810-5104-5581-09798da873df.png)

WebhookのURLと通知する条件をチェックするだけです。

![webhookregss.png](https://qiita-image-store.s3.amazonaws.com/0/165301/43b661e3-e120-3c2d-f2c5-3a04e84f1e1f.png)


詳しくは、

[Webhookを設定する | kintone ユーザーヘルプ](https://help.cybozu.com/ja/k/user/webhook.html?utm_medium=kintone&uiver=new)

 

結果をファイルに保存するだけのWebhook サンプルです。
データのバックアップも兼ねて、kintoneの変更履歴をログファイルに保存することも考えています。

```php:webhook.php
<?php
    $body = file_get_contents("php://input");
    if (!empty($body)) {
        file_put_contents("./ktn.json",$body);
    }
?>
PHP CodeIgniter ファイルをフォルダ分けしてZIP圧縮する

タイトルの通りファイルをフォルダ分けしてZIP圧縮するロジックです。

```php:zip_folder.php
public function zip_folder
{
  $this->load->library('zip');
  $img_folder_list = [
    'folder1' => ['http://img1.jpg', 'http://img2.jpg', 'http://img3.jpg'],
    'folder2' => ['http://img4.jpg', 'http://img5.jpg', 'http://img6.jpg'],
    'folder3' => ['http://img7.jpg', 'http://img8.jpg', 'http://img9.jpg'],
  ];

  foreach ($img_url_list as $folder_name => $img_url_list) {
    $this->zip->add_dir($folder_name);
    foreach ($img_url_list as $img_url) {
      $split_url = explode('/', $img_url);
      $this->zip->add_data($folder_name . '/' . $split_url[count($split_url) - 1], file_get_contents($img_url));
    }
  }
  $this->zip->archive('img_list.zip');
  $this->zip->download('img_list.zip');
}
```

今回はWeb上にある画像をフォルダに分けてZIPにしましたが、ローカルファイルでもそんなに変わらない処理になるでしょう。
ラズパイでスマートハブを作ろう！：プロタOS

#はじめに

ここ最近、IoTやスマートホームの市場は急速に成長していますね。
Google, Apple, Samsungなどの大手企業でも続々と関連商品を発売しています。
しかしちょっと試して見たい！という気持ちで買うには少しお高い感じもなくはありません。
そこで、ラズベリーパイで簡単に作ることができるスマートハブ、プロタパイをご紹介したいと思います。

#プロタOS、 プロタパイとは

![Screen Shot 2017-02-13 at 4.56.15 PM.png](https://qiita-image-store.s3.amazonaws.com/0/162845/ee9b7fc0-8074-88b5-b8aa-20167c6da085.png)

プロタOSは独自のアプリストアを持って、様々なスマートデバイス、またはウェブサービスを繋げて自動化ルールを実行する”スマートハブ・オペレーティングシステム”です。またプロタOSはクラウドアクセスを使用しており、スマホやタブレット、デスクトップなどの全てのプラットフォームから使用することができます。（さらに詳しい情報は公式ウェブサイトにてご確認ください！https://prota.info/) 

このプロタOSは、ラズベリーパイのOSとして使用することができます。
今回のポストではラズベリーパイでプロタOSを活用して自分だけのスマートハブを作る方法をご紹介したいと思います。

**準備するもの**
ー ラズベリーパイ（B, B+, 2, 3対応）
ー Wi-Fi, Bluetooth ドングル（３の場合は不要）
ー USBパワーケーブル
ー SDカード（８GB以上）
　- https://prota.info/prota/pi/ を訪問し、無料でプロタOSダウンロードしてください。
ープロタスペースモバイルアプリ（iOS, Android対応）

##プロタパイ設置方法

プロタパイ設置ガイド(http://docs.prota.info/101-prota-pi/) をご参考ください。

#プロタパイでできること

**1．自動化ストーリー作成**


プロタの主要機能の一つであるストーリーズは、コード知識がない人でも日常言語で自動化ルールを作成するオートメーションエンジンです。
一見難しいように見えますけど、要するに
”私が家から500m以上離れたら、電気を消す。”、または”平日の朝7時になったら、コーヒを入れる”などのような自動化を簡単設定できる！よいうことです。

![스크린샷 2017-02-09 10.55.31 AM.png](https://qiita-image-store.s3.amazonaws.com/0/162845/88b27aa2-9e77-7e5d-c7f7-da1b15169d94.png)

**2．GPIO**

![Screen Shot 2017-02-13 at 4.51.08 PM.png](https://qiita-image-store.s3.amazonaws.com/0/162845/88ce5754-45a2-5c38-4e6d-be078b334893.png)

![스크린샷 2017-02-10 4.10.09 PM.png](https://qiita-image-store.s3.amazonaws.com/0/162845/0b275e9a-454a-974e-ba0b-181aba87b5da.png)

プロタパイはGPIOを使う最も簡単な方法です。複雑なコードを書かなくても簡単にモードの入力などを行うことができるんどす。（現在のサポートにはデジタル読み出し/書き込みPWM割り込みが含まれています。UART（部分的にサポート）I2CとSPIは現在サポートしておりません。）

GPIOピンを自動化に使用することもできます!
**以下のGPIOピンを活用したDIYプロジェクトをご覧ください！**


１．ラズパイ、プロタOS、古いウェブカメラで簡単に仕上げるスマートカメラ
http://www.instructables.com/id/10-Smart-Camera-With-Raspberry-Pi/
高いスマートカメラやCCカメラを買う必要がありません！最小限の努力と最小限の費用でスマートカメラ、自作可能です。

![스크린샷 2017-02-10 4.14.39 PM.png](https://qiita-image-store.s3.amazonaws.com/0/162845/d211d2c5-5f8c-bfde-9a4c-ebb05f654190.png)

２. メッセンジャーボット（テレグラム）でスマート扇風機を遠隔操作しよう！
http://www.instructables.com/id/Macro-Button-Box-for-the-Smart-Home/ 
”Turn off”とメッセンジャーにメッセージを送って扇風機のオン・オフを操作することができます。

![Screen Shot 2017-02-13 at 9.21.47 AM.png](https://qiita-image-store.s3.amazonaws.com/0/162845/111e01fd-8d51-24d5-eb0b-916a294ead72.png)

GPIOを活用した自動化はこれからのポストでさらに詳しくご紹介したいと思います。



それ以外にもWebcamアプリでプロタをセキュリティーカメラとして活用することも、Volumioアプリで音楽を聞くことも可能です。IFTTTチャンネルも持ってますので、IFTTT対応の様々なデバイスやウェブサービスを連動することももちろん可能なのです！様々なアプリの詳細情報を確認されたい場合は、https://support.prota.info/hc/en-us のアプリガイドをご参考ください。

#まとめ

このように、プロタパイを使えば様々なホームオートメーションプロジェクトをつくることができます。
これからは、そちらのプロジェクトを公開していきたいと思います。
また、自分ならではのプロタアプリを制作できるように、APIやSDKももうすぐ公開される予定ですので、ぜひお楽しみください！

さらなるお問い合わせは、http://support.prota.info を訪問してください！

##予告

次回のポストでは4000円で完成できるスマートドアベルの作り方をご紹介します。

![KakaoTalk_Photo_2017-02-10-16-22-11_74.jpeg](https://qiita-image-store.s3.amazonaws.com/0/162845/d514942a-3ff7-487e-c482-cb7c404038ed.jpeg)
forループの練習問題（数字でピラミッドを作る）　  初級〜中級・解答編

#問題
下記のリンクの練習問題の解答（PHPで記述）になります。
http://qiita.com/takuya-kodama/items/32edabf2c27c4b4690a0

解答よりも良いコードがありましたらコメント等で教えていただければと思います！


#解答

```example.php
<?php

#問題１
for($x = 2 ; $x >= 0 ; $x -- ){
  for($y = 3 ; $y >= $x+1 ; $y --){
    echo $y-$x;
  }
  echo "<br>";
}

#問題２
for($a = 1 ; $a <= 4  ; $a ++){
  for($b = 3 ; $b >= $a ; $b --){
      echo "*";
    }
    for($c = 1 ; $c <=$a ; $c++){
      echo $c;
    }
    for($d = 3 ; $d >=6-$c ; $d--){
      echo $d-(4-$a);
    }
    echo "<br />";
}


#問題3
$z = 1;
for($x = 1 ; $x <= 3 ; $x ++){
  for($y = 1 ; $y <= 3 ; $y ++){
    echo $z;
    $z ++;
  }
  echo "<br />";
}

#問題4
$z = 1;
for($x = 1 ; $x <= 3 ; $x ++){
  for($y = 1 ; $y <= $x ; $y ++){
    echo $z;
    $z ++;
  }
  echo "<br />";
}

#問題5
$z = 9;
for($x = 1 ; $x <= 3 ; $x ++){
  for($y = 1 ; $y <= 3 ; $y ++){
    echo $z;
    $z --;
  }
  echo "<br />";
}

#問題6
$z = 6;
for($x = 1 ; $x <= 3 ; $x ++){
  for($y = 1 ; $y <= $x ; $y ++){
    echo $z;
    $z --;
  }
  echo "<br />";
}

#問題7
for($x = 1 ; $x <= 3 ; $x++){
  for($y = 1 ; $y <= $x ; $y++){
    echo $y;
  }
  echo "<br />";
}


#問題8
for($x = 3 ; $x >= 1 ; $x--){
  for($y = 1 ; $y <= $x ; $y++){
    echo $y;
  }
  echo "<br />";
}

#問題9
for($x = 1 ; $x <= 3 ; $x++){
  for($y = 3 ; $y >= $x ; $y--){
    echo $y;
  }
  echo "<br />";
}

#問題10
for($x = 3 ; $x >= 1 ; $x--){
  for($y = 3 ; $y >= $x ; $y--){
    echo $y;
  }
  echo "<br />";
}

#問題11
for($x = 1 ; $x <= 3 ; $x++){
  echo $x;
  for($y = 1 ; $y <= 2 ; $y ++){
    echo $y;
  }
  echo "<br />";
}

?>

```
今週やった勉強まとめ（H29.2.6~2.12）

paizaで有料学習が2/12まで無料ということで、今週はAWSの基礎講座を勉強しました。

AWSのインストールから導入、apacheやPHPのインストールの仕方を学びましたが、あまりしっくりきませんでした。

途中はよくわかりませんでしたが、流れでやりながらやればできたので良かったです。

##やったこと

流れは
1.AWSインストール
2.Linux仮想マシン起動
3.publicIPアドレスの設定
4.AWSへのリモートアクセス
5.Apacheのインストール
6.ローカルでのファイルをAWSへ転送
7.PHPのインストール
8.MySQL,phpAdminのインストール
9.WebサーバからHTMLファイルの表示

でした。

##感想

なかなかわからないことが多すぎて書ききれません。
ターミナルはprogateで学んだので、ファイル作成や移動、ファイルリストの表示はわかりますが、それがどんな意味を持つのか、どうやって運用するのかが未だにわかりません。
インターネットの基礎知識的な書籍で勉強する必要がありますね。

Linuxについては説明がやさしくされたので理解はできました。

IPアドレスの設定もなんとなくわかりました。

リモートアクセスは仮想マシンの理解がないとわかりません

DBのMySQLは操作方法もわかりましたが、まだ理解はできておりません。

まだまだ学ぶことは多いですが、とりあえずpaizaの無料学習は終了したので、来週からはUdemyの講座に戻ります。

##来週やること

Udemyの講座はPythonの初心者講座を見ていきます。

私はpythonの基礎的なことは理解しているつもりですが、実際paizaの基礎的な問題をやるとまったくできませんでした。
ですので、まずはいろんなコースを受講してみていろいろ勉強してみたいと思い、受講することにしました。
このコース受講後にまたpaizaのDランクコースに挑戦してみるつもりですが、それでもだめだったら、書籍を借りるか、購入することを検討してみます。

先週みたいな簡単な問題もできないのはかなり悔しいです。

##今後の目標

ここで、当面の目標を書きます。
**小目標　１日２時間学習**
**中目標　１週間合計１０時間学習**
**３月目標　Pythonで簡単な構造計算書を作成する**

これまでは毎日21時～22時半までの1時間30分でしたがこれを2時間にします。
そして１週間合計を10時間にします。これは休日の時間を省いております。
理由は休みは時間が取れると、思いサボってしまうからです。
そのために日々目標の小目標と週間目標の中目標を立てました。
それと来月からは月ごとの目標も立てます。
３月の目標は簡単な構造計算書を作るです。
私は仕事上構造計算書を作成することがあるのですが、現状Excelで行っております。
これをこれまで学んだ知識を使いPythonで作成してみます。
当然、今週学んだAWSの知識を使いたいので、ウェブサービスとして表示するとこまでやってみます。

今月は３月目標の内容の具体的な設計が必要かと思いますので、そちらを随時行っていきます。
[JAWS-UG CLI] IAM #73 インスタンスプロファイルへのロール追加 (AMI構築環境用)

前提条件
========


IAMへの権限
-----------

IAMに対してフル権限があること。


AWS CLIのバージョン
-------------------

以下のバージョンで動作確認済

* AWS CLI 1.11.14

```bash:コマンド:
aws --version
```

結果(例):

      aws-cli/1.11.34 Python/2.7.10 Darwin/15.6.0 botocore/1.4.91

バージョンが古い場合は最新版に更新しましょう。

```bash:コマンド:
sudo -H pip install -U awscli
```


0. 準備
=======


0.1. 変数の確認
---------------

プロファイルが想定のものになっていることを確認します。

```bash:変数の確認:
aws configure list
```

結果(例):

            Name                    Value             Type    Location
            ----                    -----             ----    --------
         profile       lambdaFull-prjz-mbp13        env    AWS_DEFAULT_PROFILE
      access_key     ****************XXXX shared-credentials-file
      secret_key     ****************XXXX shared-credentials-file
          region        ap-northeast-1        env    AWS_DEFAULT_REGION


0.2. インスタンスプロファイルの指定
-----------------------------------

インスタンスプロファイルを指定します。

```bash:変数の設定:
IAM_INSTANCE_PROFILE_NAME='EC2InstanceProfile_EnvAMI'
```


0.3. IAMロールの指定
--------------------

インスタンスプロファイルにアタッチするIAMロールを指定します。

```bash:変数の設定:
IAM_ROLE_NAME='EC2InstanceProfile_EnvAMI_Role'
```


1. 事前作業
===========

インスタンスプロファイルを確認します。

```bash:コマンド:
aws iam list-instance-profiles-for-role \
        --role-name ${IAM_ROLE_NAME} \
        --query 'InstanceProfiles[].InstanceProfileName'
```

結果(例):

      []


2. ロールのアタッチ
===================

インスタンスプロファイルにロールをアタッチします。

```bash:変数の確認
cat << ETX

        IAM_INSTANCE_PROFILE_NAME: ${IAM_INSTANCE_PROFILE_NAME}
        IAM_ROLE_NAME:             ${IAM_ROLE_NAME}

ETX
```

```bash:コマンド:
aws iam add-role-to-instance-profile \
        --instance-profile-name ${IAM_INSTANCE_PROFILE_NAME} \
        --role-name ${IAM_ROLE_NAME}
```

結果:

      (戻り値なし)


3. 事後作業
===========


インスタンスプロファイルの確認
------------------------------

```bash:コマンド:
aws iam list-instance-profiles-for-role \
        --role-name ${IAM_ROLE_NAME} \
        --query 'InstanceProfiles[].InstanceProfileName'
```

結果(例):

      [
          "EC2InstanceProfile_EnvAMI"
      ]


完了
====
[JAWS-UG CLI] IAM #72 インスタンスプロファイルの作成 (AMI構築環境用)

前提条件
========


IAMへの権限
-----------

IAMに対してフル権限があること。


AWS CLIのバージョン
-------------------

以下のバージョンで動作確認済

* AWS CLI 1.11.14

```bash:コマンド:
aws --version
```

結果(例):

      aws-cli/1.11.34 Python/2.7.10 Darwin/15.6.0 botocore/1.4.91

バージョンが古い場合は最新版に更新しましょう。

```bash:コマンド:
sudo -H pip install -U awscli
```


0. 準備
=======


1.1. 変数の確認
---------------

プロファイルが想定のものになっていることを確認します。

```bash:コマンド:
aws configure list
```

結果(例)

            Name                    Value             Type    Location
            ----                    -----             ----    --------
         profile         iamFull-prjz-mbp13        env    AWS_DEFAULT_PROFILE
      access_key     ****************XXXX shared-credentials-file
      secret_key     ****************XXXX shared-credentials-file
          region                         ap-northeast-1  env    AWS_DEFAULT_REGION

AssumeRoleを利用している場合はprofileが '<not set>'と表示されます。 そ
れ以外のときにprofileが '<not set>' と表示される場合は、以下を実行して
ください。

   変数の設定:

         export AWS_DEFAULT_PROFILE=<IAMユーザ名>


1.2. IAMロール名の決定
----------------------

```bash:変数の設定:
IAM_ROLE_NAME='EC2InstanceProfile_EnvAMI_Role'
```


1. 事前作業
===========


インスタンスプロファイル名の決定
--------------------------------

```bash:変数の設定:
IAM_INSTANCE_PROFILE_NAME='EC2InstanceProfile_EnvAMI'
```

同じ名前のインスタンスプロファイルが存在しないことを確認します。

```bash:コマンド:
aws iam get-instance-profile \
        --instance-profile-name ${IAM_INSTANCE_PROFILE_NAME}
```

結果(例):

      A client error (NoSuchEntity) occurred when calling the GetInstanceProfile operation: Instance Profile EC2InstanceProfile_EnvAMI cannot be found.


2. 本作業
=========


インスタンスプロファイルの作成
------------------------------

```bash:変数の確認:
cat << ETX

        IAM_INSTANCE_PROFILE_NAME: ${IAM_INSTANCE_PROFILE_NAME}

ETX
```

```bash:コマンド:
aws iam create-instance-profile \
        --instance-profile-name ${IAM_INSTANCE_PROFILE_NAME}
```

結果(例):

      {
        "InstanceProfile": {
          "InstanceProfileId": "AIPAxxxxxxxxxxxxxxxxx",
          "Roles": [],
          "CreateDate": "2017-02-13T01:23:45.678",
          "InstanceProfileName": "EC2InstanceProfile_EnvAMI",
          "Path": "/",
          "Arn": "arn:aws:iam::XXXXXXXXXXXX:instance-profile/EC2InstanceProfile_EnvAMI"
        }
      }


3. 事後作業
===========


インスタンスプロファイルの確認
------------------------------

```bash:コマンド:
aws iam get-instance-profile \
        --instance-profile-name ${IAM_INSTANCE_PROFILE_NAME}
```

結果(例):

      {
        "InstanceProfiles": [
          {
              "InstanceProfileId": "AIPAJRUJIZXNNQU4R6VZM",
              "Roles": [],
              "CreateDate": "2017-02-13T01:23:45Z",
              "InstanceProfileName": "EC2InstanceProfile_EnvAMI",
              "Path": "/",
              "Arn": "arn:aws:iam::XXXXXXXXXXXX:instance-profile/EC2InstanceProfile_EnvAMI"
          }
        ]
      }


完了
====
C++ Builder XE4, 10.2 Tokyo >TIdTCPClientを使った送信例

```txt:動作環境
C++ Builder XE4
  Windows 7 Pro: 送信元
  Windows 10 Pro: 送信先

RAD Studio 10.2 Tokyo Update 2 (追記: 2017/12/28)
```

関連 http://qiita.com/7of9/items/afd179c6c27a349f4ec6

[TClientSocketでのテキスト送信実装](http://qiita.com/7of9/items/0fdca5a350c089f9c5cf)をTIdTCPClient使用に変更しようとしている。

上記リンクと同じような処理は
http://qiita.com/7of9/items/51bd31318c6e1332adbf
のコードを参考にして、以下のようにしてみた。

```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::debugB_tcpClick(TObject *Sender)
{
	char zbuf[20] = {0};

	IdTCPClient1->Host = "192.168.2.7";
	IdTCPClient1->Port = 2000;
	IdTCPClient1->Connect();

	for(int loop=0; loop < 3; loop++) {
		Application->ProcessMessages();
		Sleep(300);
	}

	strcpy(zbuf, "TEST");
	IdTCPClient1->IOHandler->WriteLn(zbuf);

    //
	Application->ProcessMessages();
	Sleep(300);

	// if (IdTCPClient1->IOHandler->CheckForDataOnSource(1000)) {
	//     受信処理
	// }

	IdTCPClient1->IOHandler->InputBuffer->Clear();

	IdTCPClient1->Disconnect();

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

TClientSocket使用と同じように通信できた。
Carthageで管理しているライブラリのライセンスをまとめてくれるスクリプト

## はじめに

CocoaPods でライセンス表記を自動生成しようと思うと、探せばいくつも記事が出てきます。

これが Carthage になるとどういう訳かほぼ皆無に等しい。

それでも探してみると [CarthageLicenseScript] という Swift で書かれたスクリプトを見つけたので共有したいと思います。

## 使い方

使い方は非常にシンプル。

1. スクリプトを保存
2. terminal で ```$ ./PATH_TO_YOUR_SCRIPT/fetch_licenses.swift Cartfile.resolved  OUTPUT_DIR``` と書いて実行
  * ```./PATH_TO_YOUR_SCRIPT/fetch_licenses.swift``` はスクリプトへのパス
  * ```Cartfile.resolved``` は Carthage のライセンス表記を出力したいプロジェクトの Cartfile.resolved へのパス
  * ```OUTPUT_DIR``` は Licenses.plist を出力したいディレクトリへのパス

これだけで Licenses.plist が任意のディレクトリへ出力されます。

Licenses.plist は [[String: String]] になっているので、

```swift
let plistPath = Bundle.main.path(forResource: "../Licenses", ofType:"plist")
let licensesArray = NSArray(contentsOfFile: plistPath!)! as! [[String : String]]
```

というようにして読み込めば、

![写真_2017-02-13_16_47_18.png](https://qiita-image-store.s3.amazonaws.com/0/31641/645e04d2-43d3-bf00-9189-cea2bb937621.png "写真_2017-02-13_16_47_18.png")

このようにアプリ内で表示するのも簡単です。

## 実行例

![スクリーンショット_2017-02-13_16_27_44.png](https://qiita-image-store.s3.amazonaws.com/0/31641/6afd35bf-0e9b-5272-6810-bcbd2ac1b7fb.png "スクリーンショット_2017-02-13_16_27_44.png")

![スクリーンショット 2017-02-13 16.39.43.png](https://qiita-image-store.s3.amazonaws.com/0/31641/3b033fd5-645e-0d80-df37-0984b3c6435a.png "スクリーンショット 2017-02-13 16.39.43.png")

## 注意点

> I won't recommend running it as a build phase, but rather checking the generated .plist into your project.

ということなので、

* ビルドと同時にスクリプトを走らせない
* 生成された .plist を確認する

の2点は忘れないようにしましょう。特に .plist は text に改行が含まれているので、必ず確認したほうがいいと思います。またライブラリの変更は時々あると思いますので、.plist のバージョン管理を忘れないようにしましょう。

## 最後に

アプリをリリースするにあたって Qiita の記事にはとても助けられました。

自分もなにか書いて残していくことで、誰かの助けになればと思い初投稿しました。


[CarthageLicenseScript]: https://github.com/pietbrauer/CarthageLicenseScript
forループの練習問題（数字でピラミッドを作る）　  初級〜中級編

#はじめに
今回はPHPで回答を作成していますが、forループを多くの言語でも使えますので、
使いやすい言語で挑戦してみてください。
#練習問題
全部で１１問あります。
forループを使用して各問題の解答を作ってください。

回答はリンク先のページにあるので、解き終わったら参照してください。

```
問題１
1
21
321

問題2
***1
**121
*12321
1234321

問題３
123
456
789

問題４
1
23
456

問題５
987
654
321

問題６
6
54
321

問題７
1
12
123

問題８
123
12
1

問題９
321
32
3

問題１０
3
32
321

問題１１
112
212
312
```

#解答
下記のリンクに解答を載せております。
http://qiita.com/takuya-kodama/items/903d9ece52bdbfd6553d

#さらに難しい問題を解きたい方へ
上級編の問題もあるので是非チャレンジしてみてください！

**上級編**
http://qiita.com/takuya-kodama/items/5a1dd8da56e7a87ec58f
Capistrano3でサブディレクトリをデプロイ

例えばこんなディレクトリ構造のブランチがあるとする。

```
./
│
├── provision
│   └── 構成管理
│
├── application
│   └── アプリケーション本体、Capistranoもこの中にある
│
└── virtualmachine
    └── ローカル開発環境
```

ステージングやプロダクションにデプロイしたいのはapplicationディレクトリだけで、
その他のディレクトリはデプロイする必要がない。

(指定したサブディレクトリだけデプロイするとか簡単でしょ)
と思ってサクッと調べて出てきたやり方を試してみるも上手くいかない…。
どうも試したのはCapistrano2系での方法のようで、色々調べた結果下記の方法で簡単にできました。

```ruby:config/deploy.rb
set :repo_tree, 'application' # デプロイ対象のディレクトリパス
```
Windows 8.1 / Windows 10 > ClientSocketが切断される症状 > TClientSocketでもIndyでもだめ > ソフトの設計ミス

```txt:動作環境
C++ Builder XE4
```

TClientSocketを用いてTCP/IP通信をしているソフトがあり、それをWindows 7に対応させた。

Windows 7上では問題なく動作をする。一方で、同じソフトをWindows 8.1, Windows 10上で動作させた場合、ClientSocketDisconnect()イベントが発生するタイミングがある。
(互換モードでWindows 7を選択しても解消しなかった)。

## 対処方法

1. TClientSocketをやめてIndyのAPI(TIdTCPClient)を使う
2. ClientSocketDisconnect()が発生する条件を把握して対処する

方法2も興味があるが、対処したところで、他の部分で問題は残りそう。

関連 http://qiita.com/7of9/items/897eee6f09b6d37af499

関連 http://www.delphigeist.com/2010/03/indy-or-tclientsockettserversocket.html
> **Dorin Duminica, September 1, 2010 at 8:05 AM**
> I do NOT encourage third party components at anytime, yes TClientSocket/TServerSocket are pretty unstable, but Indy can do it's job also, once you get the hang of it...

### Indy使用への変更点

> TClientSocketをやめてIndyのAPI(TIdTCPClient)を使う

http://stackoverflow.com/questions/10881685/indy-tcp-read-data-in-a-loop

> TIdTCPClient is not an asynchronous component. It does not tell you when data arrives. 

TClientSocketではClientSocketRead()イベントでデータ受信時の処理をできたが、TIdTCPClientはそういうイベントがない。
`IdTCPClient1.InputBuffer.Size`をチェックする処理が必要になる。

<!--
## カスタマイズされた機能だった

通常のTClientSocketではなく、カスタマイズされたTClientSocket()のようだ。少なくとも送信部分がカスタマイズされている。

Indy使用に変更するには、カスタマイズされた部分も移植することになり、作業量が10倍にはなりそうだ。

不具合が出ている部分は、カスタマイズされた部分かどうかは切り分けできていない。
-->

### Indyに変更後

(追記 2017/02/14)

IndyのTCP/IP通信に変更したところ、同様の切断症状が見られた。

共通処理部分でWindows 8.1以降の特有の問題があるようだ。

結局、方法2の対処をすることになった。

### Windows 10の設定を確認

Windows 10のネットワークアダプタの電力設定を変更してみた。

https://www.sevenforums.com/network-sharing/363165-lan-keeps-disconnecting-connecting-constantly.html
のスクリーンショットに見られる「Allow the computer to turn off this device to save power」に該当する設定をOFFにした。

切断される症状は解消しなかった。

別途、電力設定でWindows 7において設定している項目をWindows 10でも設定したが、症状は解消していない。

## ソフトの設計ミス

http://qiita.com/7of9/items/bd75e5beb5fc59526882
に書いたように、設計ミスのようだった。

本来、定期的に動くべきところが、Windows 8.1/10になってから処理停止するようになっており、それが引き金となってTCP/IPが切断される状態になっていた。
[JAWS-UG CLI] S3:#15 バケットの作成 (作業ログ用)



前提条件
========


S3への権限
----------

S3に対してフル権限があること。


AWS CLIのバージョン
-------------------

以下のバージョンで動作確認済

* AWS CLI 1.11.28

```bash:コマンド:
aws --version
```

結果(例):

      aws-cli/1.11.34 Python/2.7.10 Darwin/15.6.0 botocore/1.4.91

バージョンが古い場合は最新版に更新しましょう。

```bash:コマンド:
sudo -H pip install -U awscli
```


0. 準備
=======


0.1. リージョンの決定
---------------------

作成するS3バケットのリージョンを決めます。

(カレントユーザが利用するカレントリージョンも切り変わります。)

```bash:変数の設定:
export AWS_DEFAULT_REGION='ap-northeast-1'
```


0.2. プロファイルの確認
-----------------------

プロファイルが想定のものになっていることを確認します。

```bash:コマンド:
aws configure list
```

結果(例)

            Name                    Value             Type    Location
            ----                    -----             ----    --------
         profile         s3Full-prjZ-mbp13        env    AWS_DEFAULT_PROFILE
      access_key     ****************XXXX shared-credentials-file
      secret_key     ****************XXXX shared-credentials-file
          region                         ap-northeast-1  env    AWS_DEFAULT_REGION

AssumeRoleを利用している場合はprofileが '<not set>'と表示されます。 そ
れ以外のときにprofileが '<not set>' と表示される場合は、以下を実行して
ください。

   変数の設定:

         export AWS_DEFAULT_PROFILE=<IAMユーザ名>


1. 事前作業
===========


1.1. プレフィクスの指定
-----------------------

```bash:変数の設定:
S3_BUCKET_PREFIX='log'
```


1.2. AWS IDの取得
-----------------

```bash:変数の設定:
AWS_ID=$( \
        aws sts get-caller-identity \
          --query 'Account' \
          --output text \
) && echo ${AWS_ID}
```

結果(例)

      XXXXXXXXXXXX


1.3. バケット名の決定
---------------------

```bash:変数の設定:
S3_BUCKET_NAME="${S3_BUCKET_PREFIX}-${AWS_ID}" \
        && echo ${S3_BUCKET_NAME}
```

同名バケットが存在しないことを確認します。

```bash:コマンド:
aws s3 ls s3://${S3_BUCKET_NAME}/
```

結果(例):

      A client error (NoSuchBucket) occurred when calling the ListObjects operation: The specified bucket does not exist


2. バケットの作成
=================

```bash:変数の確認:
cat << ETX

        S3_BUCKET_NAME:     ${S3_BUCKET_NAME}
        AWS_DEFAULT_REGION: ${AWS_DEFAULT_REGION}

ETX
```

```bash:コマンド:
aws s3api create-bucket \
        --bucket ${S3_BUCKET_NAME} \
        --create-bucket-configuration "LocationConstraint=${AWS_DEFAULT_REGION}"
```

結果(例):

      {
        "Location": "http://log-XXXXXXXXXXXX.s3.amazonaws.com/"
      }


3. 事後確認
===========

```bash:コマンド:
aws s3api get-bucket-location \
        --bucket ${S3_BUCKET_NAME}
```

結果(例):

      {
        "LocationConstraint": "ap-northeast-1"
      }


完了
====
[JAWS-UG CLI] S3:#14 バケットの作成 (設定ファイル用)




前提条件
========


S3への権限
----------

S3に対してフル権限があること。


AWS CLIのバージョン
-------------------

以下のバージョンで動作確認済

* AWS CLI 1.11.28

```bash:コマンド:
aws --version
```

結果(例):

      aws-cli/1.11.34 Python/2.7.10 Darwin/15.6.0 botocore/1.4.91

バージョンが古い場合は最新版に更新しましょう。

```bash:コマンド:
sudo -H pip install -U awscli
```


0. 準備
=======


0.1. リージョンの決定
---------------------

作成するS3バケットのリージョンを決めます。

(カレントユーザが利用するカレントリージョンも切り変わります。)

```bash:変数の設定:
export AWS_DEFAULT_REGION='ap-northeast-1'
```


0.2. プロファイルの確認
-----------------------

プロファイルが想定のものになっていることを確認します。

```bash:コマンド:
aws configure list
```

結果(例)

            Name                    Value             Type    Location
            ----                    -----             ----    --------
         profile         s3Full-prjZ-mbp13        env    AWS_DEFAULT_PROFILE
      access_key     ****************XXXX shared-credentials-file
      secret_key     ****************XXXX shared-credentials-file
          region                         ap-northeast-1  env    AWS_DEFAULT_REGION

AssumeRoleを利用している場合はprofileが '<not set>'と表示されます。 そ
れ以外のときにprofileが '<not set>' と表示される場合は、以下を実行して
ください。

   変数の設定:

         export AWS_DEFAULT_PROFILE=<IAMユーザ名>


1. 事前作業
===========


1.1. プレフィクスの指定
-----------------------

```bash:変数の設定:
S3_BUCKET_PREFIX='conf'
```


1.2. AWS IDの取得
-----------------

```bash:変数の設定:
AWS_ID=$( \
        aws sts get-caller-identity \
          --query 'Account' \
          --output text \
) && echo ${AWS_ID}
```

結果(例)

      XXXXXXXXXXXX


1.3. バケット名の決定
---------------------

```bash:変数の設定:
S3_BUCKET_NAME="${S3_BUCKET_PREFIX}-${AWS_ID}" \
        && echo ${S3_BUCKET_NAME}
```

同名バケットが存在しないことを確認します。

```bash:コマンド:
aws s3 ls s3://${S3_BUCKET_NAME}/
```

結果(例):

      A client error (NoSuchBucket) occurred when calling the ListObjects operation: The specified bucket does not exist


2. バケットの作成
=================

```bash:変数の確認:
cat << ETX

        S3_BUCKET_NAME:     ${S3_BUCKET_NAME}
        AWS_DEFAULT_REGION: ${AWS_DEFAULT_REGION}

ETX
```

```bash:コマンド:
aws s3api create-bucket \
        --bucket ${S3_BUCKET_NAME} \
        --create-bucket-configuration "LocationConstraint=${AWS_DEFAULT_REGION}"
```

結果(例):

      {
        "Location": "http://conf-XXXXXXXXXXXX.s3.amazonaws.com/"
      }


3. 事後確認
===========

```bash:コマンド:
aws s3api get-bucket-location \
        --bucket ${S3_BUCKET_NAME}
```

結果(例):

      {
        "LocationConstraint": "ap-northeast-1"
      }


完了
====
Wordpress Contact Form 7 でメール確認とラジオ縦並び


Wordpressのコンタクトフォームで、メールアドレスを確認の意味で2回入力させてチェックするというよくある入力チェック対応とラジオボタン、チェックボタンを横並びではなく、縦並びにするカスタマイズを行った。　ラジオボタンだけ縦並びにしたかったそれはできなかった。

メール確認用のタグ名は_confirmをつける仕様になっています。

テーマ編集で　functions.php　以下のものを追加した。

 
```php:functions.php
・・・
<?php
add_filter( 'wpcf7_validate_email', 'wpcf7_text_validation_filter_extend', 11, 2 );
add_filter( 'wpcf7_validate_email*', 'wpcf7_text_validation_filter_extend', 11, 2 );
function wpcf7_text_validation_filter_extend( $result, $tag ) {
    $type = $tag['type'];
    $name = $tag['name'];
    $_POST[$name] = trim( strtr( (string) $_POST[$name], "\n", " " ) );
    if ( 'email' == $type || 'email*' == $type ) {
        if (preg_match('/(.*)_confirm$/', $name, $matches)){
            $target_name = $matches[1];
            if ($_POST[$name] != $_POST[$target_name]) {
                if (method_exists($result, 'invalidate')) {
                    $result->invalidate( $tag,"確認用のメールアドレスが一致していません");
                } else {
                    $result['valid'] = false;
                    $result['reason'] = array( $name => '確認用のメールアドレスが一致していません' );
                }
            }
        }
    }
    return $result;
}

?>
<?php
add_filter( 'wpcf7_validate_radio', 'my_validate_radio', 10, 2 );
function my_validate_radio( $result, $tag ) {
    $type = $tag['type'];
    $name = $tag['name'];
 
    if ( 'radio' == $type ) {
        if ( !isset( $_POST[$name] ) || '' == $_POST[$name] ) {
            $result['valid'] = false;
            $result['reason'] = array( $name => wpcf7_get_message( 'invalid_required' ) );
        }
    }
    return $result;
}
?>
[MySQL] SQLSTATE[HY000]: General error: 1030 Got error 28 from storage engine

# Doctorineの下記のコマンドを実行した際にこのエラーが出た
```
$ php app/console doctrine:migrations:diff

  [Doctrine\DBAL\Driver\PDOException]
  SQLSTATE[HY000]: General error: 1030 Got error 28 from storage engine
```

Error 28 は、MySQLのための充分なディスク容量の空きスペースがないため発生したようでした。

df コマンドでディスク使用量を確認してみると、見事に 100% 使ってました。
```
$ df -h
```
なので、今回はdockerコンテナの再起動と不要なlogファイルの削除を行い、解決しました
Gmailに届いたメールから自動でkintoneレコードを作成後、LINE通知

まず、Zapier　（読みはザピエルかザピア―かどっちかわかりませんｗ）のサービスで、TRIGGERサービスは、GMAILにしてメールの表題やFROMアドレスの内容を判断させる。ACTIONのサービスは、kintoneにします。GMAILの特定の内容をあるアプリに自動的にレコード作成する。ZAPを作成する。


次に今度は、TRIGGERをkintoneにして新規レコードを検出させ、ACTIONをGEMAILにして、特定のタグ付き（＃email2lineとか）でGMAILでメールさせます。この時、宛先をtrigger@applet.ifttt.comにします。
 

次に今度は、IFTTT　（イフス）で、TRIGGERを　EMAILとして、”Send IFTTT an email tagged”　を選び、上記にタグを設定して、ACTIONを、LINEにして、LINEグループを選択して、Appletを作成します。
Ubuntu16.04LTSの日本語入力（Mozc）がたまにおかしくなる

iMacとデュアルブートしているUbuntu１６．０４LTSにて、
日本語入力の挙動がおかしくなるので、対処をメモする。

まず、ターミナルで、

```
$ fcitx
```

と入力。fcitxに問題がないか確かめる。

次にmozcを再インストールする

```
sudo aptitude reinstall fcitx-mozc
```

これで言語ツールを再起動したら修復できました。