OmniAICreator/Qiita-1.07M huggingface dataset:
Git でブランチを上書きする

TL;DR
=====
現在のブランチを、あるブランチで上書きするには

```shell-session
$ git reset --hard 上書き元ブランチ
```

詳細
====
例えばフォークした個人用リポジトリー (例 github.com/phanect/some-repo) の `master` を、フォーク元 (例: github.com/growaspeople/some-repo) の `master` で上書きしたい (全く同じ状態にしたい) 時。

普段は `git rebase` を使って以下のようにやっていました。

```shell-session
$ git remote add upstream git@github.com:growaspeople/some-repo.git
$ git fetch upstream
$ git rebase upstream/master
```

しかし、時としてコンフリクトが発生してしまうことがあります。この場合、余計な `merge` コミットが入ってしまいます。

```shell-session
$ git rebase upstream/master
First, rewinding head to replay your work on top of it...

...

CONFLICT (content): Merge conflict in data/app_mobile/Controller/EntryController.php
Failed to merge in the changes.
Patch failed at 0002 Throw exception object so not only traces are logged
The copy of the patch that failed is found in:
   /path/to/some-repo/.git/rebase-apply/patch

When you have resolved this problem, run "git rebase --continue".
If you prefer to skip this patch, run "git rebase --skip" instead.
To check out the original branch and stop rebasing, run "git rebase --abort".
```

そういった際には、

```shell-session
$ git remote add upstream git@github.com:growaspeople/some-repo.git
$ git fetch upstream
$ git reset --hard upstream/master
```

としてあげると、現在のブランチの内容は完全に破棄され、`upstream/master` の内容で上書きされます。
本番環境DBデータをコピーするシェルスクリプト

前にHeroku運用で使ってたスクリプト
大概の環境で使えるはず。

MySQLはその辺に転がってそうだし俺にニーズがないから割愛

もちろん実運用時から色々そぎ落としてるので動作未実証

# MongoDB
```
#!/bin/sh
LOCAL_DIR=$(cd $(dirname $0)/..;pwd)/dumps
TARGET_DIR=$LOCAL_DIR/`date +%Y%m%d`
echo "mkdir $TARGET_DIR"
mkdir $LOCAL_DIR
mkdir $TARGET_DIR

# 本番環境DB設定
PRODUCTION_DBNAME=<<DB NAME>>
PRODUCTION_USERNAME=<<USER NAME>>
PRODUCTION_PASSWORD=<<PASS WORD>>
PRODUCTION_HOST=<<DATABASE HOST>>
PRODUCTION_DUMPFILE=production.sql


# ローカル環境
LOCAL_DBNAME=development_database
LOCAL_HOST=0.0.0.0:27017
LOCAL_USERNAME=<<USER NAME>>
LOCAL_PASSWORD=<<PASS WORD>>
LOCAL_DUMPFILE=local.sql


# Monogo DB
# TARGETDIR 向けに 本番環境 dump 作成
mongodump -h $PRODUCTION_HOST -d $PRODUCTION_DBNAME -u $PRODUCTION_USERNAME -p $PRODUCTION_PASSWORD -o $TARGET_DIR --excludeCollectionsWithPrefix=system

# ローカルもバックアップ
mongodump -h $LOCAL_HOST -d $LOCAL_DBNAME -o $TARGET_DIR

# ローカルDB Drop
mongo $LOCAL_DBNAME --eval "db.dropDatabase();"

# ローカルDB にRestore
mongorestore -h $LOCAL_HOST -d $LOCAL_DBNAME $TARGET_DIR/$PRODUCTION_DBNAME
```

#Postgresql

```
#!/bin/sh
LOCAL_DIR=$(cd $(dirname $0)/..;pwd)/dumps
TARGET_DIR=$LOCAL_DIR/`date +%Y%m%d`
echo "mkdir $TARGET_DIR"
mkdir $LOCAL_DIR
mkdir $TARGET_DIR

# 本番環境DB設定
PRODUCTION_DBNAME=<<DB NAME>>
PRODUCTION_USERNAME=<<USER NAME>>
PRODUCTION_PASSWORD=<<PASS WORD>>
PRODUCTION_HOST=<<DATABASE HOST>>
PRODUCTION_DUMPFILE=production.sql


# ローカル環境
LOCAL_DBNAME=development_database
LOCAL_HOST=0.0.0.0:27017
LOCAL_USERNAME=<<USER NAME>>
LOCAL_PASSWORD=<<PASS WORD>>
LOCAL_DUMPFILE=local.sql

# Postgresqp
# TARGETDIR 向けに 本番環境 dump 作成
PGPASSWORD=$PRODUCTION_PASSWORD pg_dump -C -h $PRODUCTION_HOST -U $PRODUCTION_USERNAME -Fc $PRODUCTION_DBNAME > $TARGET_DIR/$PRODUCTION_DUMPFILE

# ローカルもバックアップ
pg_dump -Fc $LOCAL_DBNAME > $TARGET_DIR/$LOCAL_DUMPFILE

# ローカルDB Drop
psql -c "drop database $TARGET_DIR;" postgres

# ローカルDB にRestore
pg_restore -d $LOCAL_DBNAME $TARGET_DIR/$PRODUCTION_DUMPFILE

```
GoogleAppScript setIntervalを使う

GoogleAppScriptでsetInterval的なことをやる方法について記載

ScriptApp.newTriggerで関数呼び出しの定義ができます。
以下は1分ごとにスプレッドシート上にダイアログを表示する例

```
function createTrigger() {
  ScriptApp.newTrigger('showMsg')
      .timeBased()
      .everyMinutes(1)  //毎分
      .create();   //トリガー
}

function showMsg(){
  Browser.inputBox("trigger!")
}
```


トリがーを止める場合は、以下のようにdeleteTrigger()にtriggerIdを指定して止める必要があります

```
function deleteTrigger(triggerId) {
  // Loop over all triggers.
  var allTriggers = ScriptApp.getProjectTriggers();
  for (var i = 0; i < allTriggers.length; i++) {
    // If the current trigger is the correct one, delete it.
    if (allTriggers[i].getUniqueId() == triggerId) {
      ScriptApp.deleteTrigger(allTriggers[i]);
      break;
    }
  }
}
```

以下は、すべてのtriggerを止めるサンプル

```
function deleteTriggerAll() {
  var allTriggers = ScriptApp.getScriptTriggers();
  for(var i=0; i < allTriggers.length; i++) {
      ScriptApp.deleteTrigger(allTriggers[i]);
  }
}
```

もしくは、「アカウント情報」の接続しているアプリの一覧から削除することで止めることができます。

1.Google drive右上のユーザーのアイコンをクリック

2.「アカウント」ボタンをクリック

3.「接続済みのアプリとサイト」から「アプリを管理」をクリック

4.不要なGoogle APP Scriptを選択

5.「削除」ボタンをクリックすると止まります


以上


参考
https://developers.google.com/apps-script/guides/triggers/installable#errors_in_triggers
Implementing functional languages を頑張って読む.15日目

# 15日目

やるき

## Applying a supercombinator

Rule 2.2ってなんだっけ.

|a0 : a1 : ... : an : s|d|h[a0 : NSupercomb [x1,..., xn] body]|f|
|:-:|:-:|:-:|:-:|
|ar : s|d|h|f|
where (h, ar ) = instantiate body h f [x1 → a1, ..., xn → an]

instantiateってなんだっけ.
あとででてくる.

scのbodyをinstantiateして,引数の名前をスタックの中で見つけた変数のアドレスに束縛して,redexのrootを含むスタックの引数を取り除いて,簡約された結果をスタックにプッシュする.
scStepの定義のイコール部分だけを見ると確かにその通りになっている.
下のwhereの部分が難しい.
new_heapとreslt_addrの詳細はまだinstantiateで隠されている.
envで環境を渡す.いわゆるシャドウイングを出来るようにするのと,変数を見つけられるようにする.
arg_bindingsはgetargsとarg_namesで引数の名前と実体との束縛関係を作る.
getargsの実装は,補助関数のget_argがわかってないからわからん.
scが定数の場合は簡単で,何も考えずに定数をヒープに乗っける.
適用の時はe1とe2についてそれぞれ再帰的にinstantiateする.
まず,e1,すなわち適用される側の式についてinstantiateして,新しいヒープと簡約結果を得る,その後,そのヒープに対してe2,すなわち適用する側の式をinstantiateすれば,最終結果のヒープと簡約結果が得られる.
このヒープに対してこれらの簡約結果を乗っけたものが最終結果となる.
変数だった場合は環境から名前のアドレスを探して帰すだけ.
letやconstrの実装は後で.

とりあえずこれで数字と適用と名前解決だけは出来るようになった…のか?

**2.3.5まで読んだ**
コピペでできるBootstrap3、簡単レスポンシブ(Grid System)させてみよう【グリッドシステム】

いま仕事で使ってるけど忘れないように書いておきます。

# コピペでBootstrapとJQuery導入

まずは空HTMLファイル用意して以下コピペしてみましょう。

```html:index.html
<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>タイトルタイトル</title>
    <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet">
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script>
  </head>
  <body>

  </body>
</html>
```

これでBootstrapとJQueryが導入できました。
必要でしたらローカルにJSとCSSをダウンロードしましょう。

# レスポンシブさせてみる
ブラウザ幅判定して要素の位置を変更させてくれるのがレスポンシブです。
まずは**グリッドの列数は12**と覚えましょう。横に12個要素が入りますみたいなイメージです。
グリッドは`<div class="col-md-3">col-md-3</div>`みたいなやつです。
とりあえず
bodyに以下追加してみましょう。

```html:
<div class="container">
  <div class="row">
    <div class="col-md-3">ノーパソ3</div>
    <div class="col-md-3">ノーパソ3</div>
    <div class="col-md-3">ノーパソ3</div>
    <div class="col-md-3">ノーパソ3</div>
  </div>
</div>
```
ブラウザの幅広げると横4つグリッド入って一定以下になると縦１列になりますよね。
これにはBootstrapには折り返し地点が決められています。

**Bootstrapの折り返し地点と対応クラス名**
<table class="mytable"><tbody><tr><th>ウインドウ幅</th><th>デバイスの種類</th><th>クラス名</th></tr><tr><td>0px以上</td><td>スマートフォン</td><td>col-xs-N</td></tr><tr><td>768px以上</td><td>タブレット</td><td>col-sm-N</td></tr><tr><td>992px以上</td><td>ノートPC</td><td>col-md-N</td><tr><td>1200px以上</td><td>大画面PC</td><td>col-lg-N</td></tr></table>

これを基準に進めていきます。Nの部分に数字入れてclassで指定してあげます。
画像でイメージ出すとこんな感じです。
![html5app11_13.jpg](https://qiita-image-store.s3.amazonaws.com/0/110510/130a47cf-c996-6669-39b8-18afe6c8935b.jpeg)
<br>
先ほどの例だとグリッドのcol-md-3×4で12なので992px以下になると折り返されます。

次にタブレット幅の場合は２つ横にグリッド表示されるよう書き換えてみましょう。

```html:
<div class="container">
  <div class="row">
    <div class="col-sm-6 col-md-3">タブ6ノーパソ3</div>
    <div class="col-sm-6 col-md-3">タブ6ノーパソ3</div>
    <div class="col-sm-6 col-md-3">タブ6ノーパソ3</div>
    <div class="col-sm-6 col-md-3">タブ6ノーパソ3</div>
  </div>
</div>
```

これで768px以下で横1つ、768~992pxの場合横２つ、992px以上で横4つになります。

こんな感じでレスポンシブ対応ができます。
try! Swiftででてきたキーワードを組み合わせたアプリを作ってみた

try! Swiftに参加しました。とても楽しい時間でした。

帰ってカンファレンスで言及されたりした技術やフレームワークなどを利用してアプリを作ってみました。

[rizumita/GetLanguages](https://github.com/rizumita/GetLanguages)

星が飛びます。星をタップします。右上のLanguagesをタップすると捕獲したものが一覧表示されます。更にタップすると詳細表示されます。Get…というのははじめはポ○モンを捕まえるようにしようとしたのですが、権利関係が怖いのでやめた名残です。

まだ未完成です。ここをこうしたら良いよ！というところがあればPRください。

## 利用した技術やフレームワーク等

このアプリに利用したのは以下の技術やフレームワーク等です。

### パッケージマネージャ
- Carthage
- CocoaPods

初日にどのパッケージマネージャが生き残るか質問したのですが、SPMだろうというお答えをいただきました。が使ってません。環境も対応状況もまだまだですね。
ちなみに私はカッセージと呼んでます。

### アーキテクチャ
- VIPER + MVVM
- Storyboard + Segue + [TransitionOperator](https://github.com/rizumita/TransitionOperator)

VIPERに似ている等で質問しました。インスタンスの所有に気をつければかなり使えると思います。
遷移コードをコントローラから分離するためのTransitionOperatorというライブラリを作成しているのでそれを利用しています。
I love storyboardです。

### DI
- Swinject

DIではDIコンテナのSwinjectを利用しました。たしか少し名前が出てきましたよね？

### ユニットテスト
- Quick
- Nimble
- OHHTTPStubs

ルートビューのモジュールのみでテストを書きました。他モジュールは時間がなかったので割愛。

### ネットワーク&JSONパーサ
- APIKit
- Himotoki

他のプロジェクトではJSONパーサはGenomeを使っていますが、今回はHimotokiです。
PawというHTTPクライアントアプリを利用したのでそのファイルもプロジェクトに入っています。

### DB
- Realm

CoreDataと悩みましたが、主催という事で。
Realmも結局スレッドを超えるのが面倒なのがあれです。

### アニメーション
- Core Animation
- XCPlayground
- PaintCode

まずXCPlaygroundを利用して動かしました。星のパスはPaintCodeで作成しました。PaintCodeのファイルもプロジェクトに入っています。

### Functional Reactive Programming
- ReactiveCocoa

try! SwiftではRxSwiftが注目されましたが、以前からReactiveCocoaを利用しているので…

### その他
- Swiftz（のオペレータのみ利用）
- R.swift

R.swiftもちらっと登場しましたね。


## 感想

Objective-C時代とは全く違う世界になってしまいました。長い事Objective-Cを使ってきましたが、少しさみしい気もします。ですが、まちがいなく楽しいです。

Swiftのフレームワークはまだ定番が定まっていない分野もあり、選択が難しいです。今回はtry! Swiftに関するものを利用しましたが、実際のプロジェクトで選定するとなると…パッケージマネージャも群雄割拠の時代に入りました。ふたつもみっつもパッケージマネージャを利用するのはできれば避けたいところです。

アプリは動きはしましたが、この書き方で良いのか、もっと良い書き方や正しい書き方があるのではないかと思いつつ書きました。更に情報が充実すると良いなと思いました。

来年はどこで開催されるのでしょう。英語を使いこなせるように頑張ります。
いや、まずSwiftを使いこなせるように頑張るんですが…
CircleCI、CodeDeploy、S3を使って、GitHubにpushしたらEC2にデプロイされる仕組みを作る

備忘録。
かなり適当なので、ツッコミ大歓迎です。



## 1. IAMでEC2用ロール作成してEC2に設定

* 作成するロールのタイプはEC2、ポリシーは`AmazonS3ReadOnlyAccess`のみ。
* EC2インスタンス作成時でないとロールは設定できない。
* なので既にEC2インスタンスが存在する場合は、作りなおす必要がある。



## 2. EC2インスタンスにCodeDeploy Agentをインストール

EC2インスタンスにログインして下記コマンド実行

```bash:bash
sudo yum update
sudo yum install aws-cli -y
cd /home/ec2-user
aws s3 cp s3://aws-codedeploy-ap-northeast-1/latest/install . --region ap-northeast-1
chmod +x ./install
sudo ./install auto
```



## 3. IAMでCodeDeploy用ロール作成

設定するタイプはCodeDeploy、ポリシーは下記URL参照。
http://docs.aws.amazon.com/codedeploy/latest/userguide/how-to-create-service-role.html

よくわからない場合は、とりあえず`AWSCodeDeployFullAccess`を設定すれば動く。



## 4. CodeDeployでアプリケーション作成

* 新しいアプリケーションを作成する
* タグはEC2インスタンスを指定
* デプロイ設定は任意のものを選ぶ
* サービスロールには前述のCodeDeploy用ロールを指定



## 5. GitHubでリポジトリ作成

プライベートリポジトリでもOK。



## 6. circle.yml設定

* リポジトリのルートに`circle.yml`を追加して下記のように設定（コメント要削除）

```yaml:circle.yml
machine: # タイムゾーンや言語バージョン設定など
    timezone: Asia/Tokyo
    node:
        version: 5.2.0
    post:
        - npm install -g npm@3.3.12
dependencies: # 依存ライブラリ等のインストール、ビルド
    post:
        - npm run build
deployment: # デプロイ設定
    staging: # 任意の文字列
        branch: master # ブランチ名
        codedeploy:
            app_app_app: # CodeDeployで作成したアプリケーション名
                deployment_group: group_group_group # CodeDeployで作成したデプロイグループ名
                application_root: /public # デプロイしたいディレクトリ
                region: ap-northeast-1
                revision_location:
                    revision_type: S3
                    s3_location:
                        bucket: xxxxxx # バケット名
                        key_pattern: '{BUILD_NUM}_{COMMIT}.zip'
```



## 7. appspec.yml設定

* デプロイしたいディレクトリのルートに`appspec.yml`を追加して下記のように設定（コメント要削除）

```yaml:appspec.yml
version: 0.0
os: linux
files:
   - source: / # ファイル参照元ディレクトリパス
     destination: /var/www/dest_dest_dest/ # ファイルコピー先ディレクトリパス
hooks:
    BeforeInstall: # ファイルコピー前に実行する内容
        - location: before_install.sh # ファイル削除とか
```



## 8. IAMでCircleCI用ユーザー作成

設定するタイプはCodeDeploy、ポリシーは下記URL参照。
http://jedipunkz.github.io/blog/2015/11/15/circleci-codedeploy/

よく分からない場合は、とりあえず`AWSCodeDeployFullAccess`と`AmazonS3FullAccess`を設定すれば動く。



## 9. CircleCIでプロジェクト追加

* `Add Projects`をクリックしてプロジェクト一覧画面に遷移
* GitHubアカウントを選択する
* `Build Project`をクリックするとプロジェクトを追加できる



## 10. CircleCIにIAMユーザーを紐付け

* `Builds`をクリックしてビルド一覧画面に遷移
* さっき作ったプロジェクトを選択
* `Project Settings`をクリックしてプロジェクト設定画面に遷移
* `AWS Permissions`をクリックしてAWS権限設定画面に遷移
* さっき作ったCircleCI用ユーザーのアクセスキーとシークレットアクセスキーを入力（ユーザー名ではないので注意）
* `Save AWS Keys`をクリックして保存



## 11. GitHubのリポジトリにpush

pushすると一連のデプロイが実行されるのでCircleCIで確認する



## 12. 完了

デプロイされているか確認する
capybaraの始めかた


```Bash
vi Gemfile
```

```Gemfile
source "https://rubygems.org"
gem 'capybara', '~> 2.6', '>= 2.6.2'
gem "selenium-webdriver"
gem "rspec"
gem 'poltergeist'
gem 'coderay'
```

```Bash
mkdir -p vendor/bundle
```

Gemをインストール

```Bash
bundle install --path vendor/bundle
```

rspecの初期ファイルを作成

```Bash
bundle exec rspec --init
```

```Bash
vi spec/spec_helper.rb
```

Chromeを使う場合

```Ruby
require 'capybara/rspec'

RSpec.configure do |config|
  config.expect_with :rspec do |expectations|
    expectations.include_chain_clauses_in_custom_matcher_descriptions = true
  end
  config.mock_with :rspec do |mocks|
    mocks.verify_partial_doubles = true
  end
  config.include Capybara::DSL
end

Capybara.register_driver :selenium do |app|
  Capybara::Selenium::Driver.new(app, :browser => :chrome)
end

Capybara.default_driver = :selenium
Capybara.app_host = 'https://github.com/'
```

chrome driverをダウンロードしておいて下さい。

```Bash
sudo mv ~/Downloads/chromedriver /usr/bin
```

```Bash
vi test.spec
```

```Ruby
require 'selenium-webdriver'

describe "GitHub" do

  before do
    visit '/'
  end

  it "トップページが表示されること" do
    expect(page).to have_content('Build software better, together.')
  end
end
```

ヘッドレスブラウザを使う場合

```Bash
brew install phantomjs
```


```Ruby
require 'capybara/rspec'
require 'capybara/poltergeist'

RSpec.configure do |config|
  config.expect_with :rspec do |expectations|
    expectations.include_chain_clauses_in_custom_matcher_descriptions = true
  end
  config.mock_with :rspec do |mocks|
    mocks.verify_partial_doubles = true
  end
  config.include Capybara::DSL
end


Capybara.javascript_driver = :poltergeist
Capybara.register_driver :poltergeist do |app|
  Capybara::Poltergeist::Driver.new(app, :js_errors => true, :timeout => 60)
end

Capybara.configure do |config|
  config.run_server = false
  config.default_driver = :poltergeist
  Capybara.app_host = 'https://github.com/'
end
```
Swiftでチェックボックスを実装する（Swift2.1, XCode7.2）

iOSにはチェックボックスがないですが、業務アプリを開発する上で必要になったのでメモしておきます。

###画像用意
![check.png](https://qiita-image-store.s3.amazonaws.com/0/40894/dbad138c-19a4-05d2-b393-e4b4481eebaf.png)

![nocheck.png](https://qiita-image-store.s3.amazonaws.com/0/40894/b2945f08-ae8a-de63-b9cf-e5e66948a9f7.png)

###プロジェクトに画像追加
作成した画像をドラッグしてプロジェクトに追加する。
<img width="287" alt="スクリーンショット 2016-03-10 18.21.15.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/40894/90ba5bc6-ab47-224f-d974-ca2eea380b0a.jpeg">


###コーディング
```swift
import UIKit

class ViewController: UIViewController {
    var myButton: UIButton!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        myButton = UIButton()
        myButton.frame = CGRectMake(0,100,200,40)
        myButton.addTarget(self, action: "onClickMyButton:", forControlEvents: .TouchUpInside)
        // ボタンに画像セット
        myButton.setImage(UIImage(named: "check.png"), forState: UIControlState.Selected)
        myButton.setImage(UIImage(named: "nocheck.png"), forState: UIControlState.Normal)
        
        self.view.addSubview(myButton)
    }
    
    internal func onClickMyButton(sender: UIButton){
        myButton.selected = !myButton.selected
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}
```

####結果
<img width="688" alt="スクリーンショット 2016-03-10 18.29.03.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/40894/6afefec5-860e-52da-ab78-7bbbc3cf89e9.jpeg">

<img width="688" alt="スクリーンショット 2016-03-10 18.29.10.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/40894/e7146844-b693-4a8c-d164-edc76225eafe.jpeg">
change ext in the folder

```perl:change_ext.pl
#!/usr/bin/perl

use strict;
use warnings;
use File::Basename;

my $ext   = "AUTO";
my @ARRAY = glob "./*.$ext";
my $dir   = "Summary";

##### main #####
my $narray = @ARRAY;

for(my $i = 0; $i < $narray; $i++)
{
    my $noext = basename($ARRAY[$i], ".$ext");
    
    printf "$ARRAY[$i] -> $noext\n";
    `mv $ARRAY[$i] ./$dir/$noext`;
    
}
テストコードとか書いてみてもいいんじゃない？

本記事はテストコードを「書いたことない」、「いらない」、「意義がわからない」
といった方々に、「書いたらちょっとはいいとこあるよ」と紹介する記事です。

## そもそも書き方がわからない
※バリバリテスト書いてる人は飛ばしてください

テストコードの書き方って習ったことありますか？
そういえばないなーなんか難しいことやるんでしょ？
って方もそれなりの数いるような気がします。
まず結論から言えば、テストコードは基本的に、
**割と泥臭いよ！**

なんか自動的にソースファイル内の関数引っ張ってきてくれて、
値評価とかもしてくれる。でも難しいんでしょ？

と思ってたりする人もいるんじゃないでしょうか。
そう思っていた時期もありました。
(探せばあると思いますがたぶんお金かかる系。むしろお金取れる系)

簡単に例を挙げますと、
犬の鳴き声を国を指定して取得する関数

```dog_bark.py
def dog_bark(country):
  if country == 'Japan':
    return u'ワンワン！'
  elif country == 'USA':
    return u'Bow wow！'
  else:
    raise NotImplementedError
```
のテストコードは

```test_dog_bark.py
from dog_bark import dog_bark

def test_dog_bark():
  assert u'ワンワン！' == dog_bark('Japan')
  assert u'Bow wow！' == dog_bark('USA')
```
となります。
実際にdog_bark関数を実行して、想定した結果文字列と直接比較するというコードです。
世に言うテストコード書こうぜ！という主張はこんな感じのコードを量産しようぜ！
ということになります。特に難しいことはないですね。
テスト実行は例えばPythonのPytestなら
```$ py.test test_dog_bark.py```
でOKです。もしテスト関数を増やしたとしても勝手にファイル内のテストを認識して
実行してくれます。
ちなみにどの言語のどのテストフレームワークもこのくらいの機能はあります。
(コンパイルがいる言語は多少手間が増えます)

## テストを書くのがめんどくさい
テストの書き方はわかったけど、「結局アプリを起動して確認すればいい」
という方、その通りです。ただ、

 - そのアプリが起動できる状態になるのはいつですか？
 - その機能をアプリ内で確認できる状態になるのはいつですか？
 - アプリ内で確認できるようになったとして、逐一コードを直す度にアプリを  
再起動して画面移動して手でパラメータ入力して目で見て確認とやるのですか？

**コマンドラインで一行コマンド打ってPCが勝手にテストしてくれるのが一番楽デショー！？**

そうです。実際のアプリ内で確認する方が回数をかさむとはるかに面倒なのです。
品質のためという主張も確かに正しいと思いますが、ここではあえて
**品質とかいいから楽するためにテスト書こうぜ！**
と主張します。テスト書くと意識が高いとかどうでもいいんですって。(暴論)
プログラマは楽するために苦労してナンボって言葉もあるし。

~~そもそもテスト書けば品質いいとかそのテスト自体の正しさは誰が保証してくれるのさ・・・~~

またそれに加えてテストが通ったところまでは完成とみなせるので、
**進んでる感を得られる**
というのもなかなかに重要。
~~仕様変更で結局捨てるはめによくなるのもお約束~~

## 設計力もつきますよ
開発中にテストを書こうとしても、
必要な関連機能が未実装とか、マスタデータがまだない
という状況ありますね。できるまで待ちますか？

**うまくモジュール分割したりモックを使ったりすれば書けるのですよ**

さらに、こうして書かれたテストは

**他モジュールや変動するマスタデータから独立した常に動くテスト**
となります。これは重要なことです。
バグフィックスや機能拡張の際の影響範囲がすぐわかるのですから。

もちろんモジュール分割等するにはそれなりの学習や経験が必要ですが、
意識するかしないかはプロダクト全体の出来に大きく関わってくると思います。
(結局意識の高さの話)

## まとめは、TDDやろう！
まとめとして
 
 - **テストコードで動作確認した方が楽**
 - **設計もいい感じになる**

というかこれら普通にTDDです。
**そもそもTDDにテスト書いて品質良くしましょうな目的はない**んですよね。
副次的にテストが残るからリグレッションとかに使えば品質も良くなるよね、
という後付けだったり。
ただ個人的に猫も杓子もTDDなのはどうかと思うので、とりあえず、
**テストコードで楽しよう！**
というまとめで。
Xcode で 新しい subversion を使う

# 課題
Xcodeが標準でサポートしているものよりも新しいバージョンの　Subversion を使いたい。

# 解決法
Xcode が参照している subversion コマンド群を新しいものと置き換える。
ターミナルを開いて、以下を実行する。
>$cd /Applications/Xcode.app/Contents/Developer/usr/bin

オリジナルの subversion コマンド群を残しておく
>$sudo mkdir org.svn
>$sudo mv svn* org.svn

Homebrew などでインストールした、新しいSVNコマンド群へのシンボリックリンクを作る
>$sudo ln -s /usr/local/bin/svn* .

Xcode を再起動する。

これでOK。
perl script works as tree command, recursive call

this has been 5 years old, but to keep it.
if any suggestions or security hole, please share them.

```perl:tree.pl
#! /usr/bin/perl

#use strict;
#use warnings;

###########################
# same as Windows NT tree #
###########################

$dir = `pwd`;
print $dir;
$dep = 1;
&dirproc($dep);

sub dirproc {
    # localize values, cz it's recursive sub-routine.
    my($dep) = @_;
    my(@files, $file);

    # get all files in the current directry.
    @files = sort(glob("*"));

    # show all files in the current directry.
    foreach $file (@files){
        if (-f $file){
            for ($i = 1; $i <= $dep; $i++){
                print "|\t";
            }
            print $file."\n";
        }
    }

    # show all directry in the current directry.
    # if directry, calls dirproc again.
    foreach $file (@files){
        if(-d $file){
            for ($i = 1; $i <= $dep; $i++){
                print "|\t";
            }
            print $file."\n";
            ++$dep;
            chdir($file);
            &dirproc($dep);
            chdir("..") or die "abort, maybe your environment is lack of memory.";
            --$dep;
        }
    }
}
雛形：UIまで手の回らないプログラマのためのBootstrap3実用ガイド

<a href="http://www.amazon.co.jp/exec/obidos/ASIN/4798135992/mmqiita-22/ref=nosim/" name="amazletlink" target="_blank">UIまで手の回らないプログラマのためのBootstrap 3実用ガイド</a>
を読み始める。
以下の初期テンプレートに色々追加しながら勉強していくぞい。


```html:index.html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <!-- The above 3 meta tags *must* come first in the head; any other head content must come *after* these tags -->
    <title>Bootstrap 101 Template</title>

    <!-- Bootstrap -->
    <link href="css/bootstrap.min.css" rel="stylesheet">

</head>
<body>
    <div class="jumbotron">

        <h1><span class="glyphicon glyphicon-book"></span>はじめてのbootstrap3</h1>

        <div class="alert alert-info">
            <button type="button" class="close" data-dismiss="alert" 
            aria-hidden="true" >&times;</button>
            <p>Bootstrap3のテスト</p>

        </div>

    </div>


    <!-- jQuery (necessary for Bootstrap's JavaScript plugins) -->
    <script src="js/jquery-1.12.1.js"></script>
    <!-- Include all compiled plugins (below), or include individual files as needed -->
    <script src="js/bootstrap.min.js"></script>

    <script type="text/javascript">
    // jQuery


    </script>
   
</body>
</html>

```

<div class="amazlet-box" style="margin-bottom:0px;"><div class="amazlet-image" style="float:left;margin:0px 12px 1px 0px;"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4798135992/mmqiita-22/ref=nosim/" name="amazletlink" target="_blank"><img src="http://ecx.images-amazon.com/images/I/51mCP2KuJmL._SL160_.jpg" alt="UIまで手の回らないプログラマのためのBootstrap 3実用ガイド" style="border: none;" /></a></div><div class="amazlet-info" style="line-height:120%; margin-bottom: 10px"><div class="amazlet-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4798135992/mmqiita-22/ref=nosim/" name="amazletlink" target="_blank">UIまで手の回らないプログラマのためのBootstrap 3実用ガイド</a><div class="amazlet-powered-date" style="font-size:80%;margin-top:5px;line-height:120%">posted with <a href="http://www.amazlet.com/" title="amazlet" target="_blank">amazlet</a> at 16.03.15</div></div><div class="amazlet-detail">大澤 文孝 <br />翔泳社 <br />売り上げランキング: 50,714<br /></div><div class="amazlet-sub-info" style="float: left;"><div class="amazlet-link" style="margin-top: 5px"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4798135992/mmqiita-22/ref=nosim/" name="amazletlink" target="_blank">Amazon.co.jpで詳細を見る</a></div></div></div><div class="amazlet-footer" style="clear: left"></div></div>
自作Pcにwindows10とubuntu14.04をいれてみた(GPU有)

#はじめに
デュアルブート自体はしたことあったんですが、GPU有りの環境でやったことがありませんでした。そしてGPU有り環境で問題が発生し結局組み立てて、デュアルブートするのに1日かかってしまったので同じ問題にぶち当たった人（いないと思いますが）がいるかもしれないので書いときます。
環境
Geforce 970 Jetstream
OS
windows10
ubuntu14.04

#最初に
windows10を入れます、で次にubuntu14.04を入れていきます。
[このサイト](https://www.abten.net/2015/05/444/)に従っていけば流れとしては問題ないです。

#問題発生
ubuntuの起動ディスクを入れ、お試し版のubuntuを起動したいのですが、画面が出力されません。
どうもLinuxにデフォルトで入っているGPUドライバーとNVIDIAのGPUと相性が良くないらしいです。

#対処方法
まずbiosの設定を行います。おそらくDisplayの設定はPrimary DisplayていうのがAutoになっていると思います。
でこいつがAutoのままだとGPUの方で画面が出力されるのでオンボードの方(CPU Graphics)に切り替えます。
そうするとubuntuが画面上に表示されるようになりますので、ubuntuをインストールします。
次に再起動するとubuntuのboot画面が通常なら出るはずなんですが、僕の場合何故かwindows10が起動しちゃいました。
解決法が分からなかったのでEasyBcdを使ってwindowsのブートメニューからubuntuを起動できるようにしました。
僕はこの[サイト](http://mikasaphp.net/easy_bcd.html)を参考にしました。
そうすると再起動するとwindowsのBootメニュー画面が出るはずなのでそっからubuntuを起動することが出来ます。

#NVIDIAのドライバーをインストール
NVIDIAの[公式サイト](http://www.nvidia.co.jp/Download/index.aspx?lang=jp)から自分の環境にあった最新のドライバをダウンロードして下さい。
そしたら一度ログイン画面に戻り、Ctrl+Alt+F1でコンソールモードに入ります。
```
$ sudo apt-get purge nvidia*
$ sudo service lightdm stop
$ sudo service gdm stop
$ sudo chmod 755 ~/Downloads/NVIDIA-Linux-x86_64-361.28.run
$ sudo ~/Downloads/NVIDIA-Linux-x86_64-361.28.run
```
これでNVIDIAのドライバが入りましたので、biosの設定をAutoに戻せばGPUからの出力でもubuntuが映るようになります。
最後にシステム設定＞ソフトウェアとアップデート＞追加のドライバーからXorgではない方のドライバーに変えれば画面が1920×1080で映るようになります。
#最後に
もっと良い方法があると思うので、知っている方いたら教えて下さい。
react + reduxでQiitaの最近の投稿をリスト表示する

reduxのサンプルがredditのAPIを叩くサンプルだったので、reddit使ったことないし日本人ならQiitaだろということで、QiitaのAPIを叩くサンプルを書いてみました。
実際、QiitaのAPIを叩くだけなら、asyncのサンプルコードを数行書き換えるだけで済みますが、練習のため１から写経しました。

- [akameco/redux-async-qiita](https://github.com/akameco/redux-async-qiita)

![react2.gif](https://qiita-image-store.s3.amazonaws.com/0/15319/d2d4582a-4145-15ee-a6b2-d147495bdc3b.gif)


## asyncサンプルについて
reduxのドキュメントとgithubのレポジトリのコードがわりと違います。
2016/3/10現在のgithubのコードの方を参考にしました。

- [redux/examples/async at master · reactjs/redux](https://github.com/reactjs/redux/tree/master/examples/async)

このサンプルのキモは、すでにstoreにデータがある場合、APIを叩かず、データがないもしくはrefreshボタンが押された場合のみデータの更新を行う点であると思います。
今回は、常にデータを取得するコードから、必要なときだけデータを更新するコードに書き換えてみました。
`git checkout always-refresh`して常にデータを更新するStoreを活用しない悪いコードを確認できます。

asyncサンプルについて詳しい説明は以下の記事が参考になりました。

- [reduxを試してみた(5日目) - ajaxを使ってUIを構築する(reduxにおける非同期の制御) - Qiita](http://qiita.com/kompiro/items/d1ffcfcba7cc34d364f0#redux%E3%81%AE%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%883-advanced%E3%82%92%E8%AA%AD%E3%82%80)

redditやQiitaだけではなく、別のAPIを叩くようなコードも`redux-trunk`を使って同じように書けると思います。

## Qiita API
QiitaのAPIは以下にまとめられています。
このようなページがきちんと用意されているところがさすがQiitaです。

- [Qiita API v2ドキュメント - Qiita:Developer](https://qiita.com/api/v2/docs)

今回は認証をしてないので、1時間に60回までリクエストまでですが、今回のデモでは使っても10回程度でしょうから大丈夫でしょう。
【超簡易的】githubにpushで、さくらサーバーに自動デプロイ


- githubにリポジトリ作成済み
- 本番サーバー：さくらのマネージドサーバーあたり

を想定してます。ここで、githubにpushしたら、
本番サーバーに自動デプロイされる流れを超簡易的に作ってみます。

#さくらサーバーにgitをインストール

下記参照
http://mattintosh.blog.so-net.ne.jp/2012-09-14

#さくらからgithubへのSSH接続の設定

パスワード入力なしで接続したいので設定します。
下記を参照
http://qiita.com/shizuma/items/2b2f873a0034839e47ce


#github から cloneする

公開ディレクトリに移動して、その直下でgit cloneします。

```
cd ~/www
git clone git@github.com:git_account/project.git .
```

#自動デプロイ用phpを作成

git pull するだけのコードです。gitはフルパスが大事です。

```php:http//yoursite.com/deploy.php
<?
exec('/home/sakura_account/local/bin/git pull', $op, $rv);
print_r($op);
print_r($rv);
?>
```

#githubのwebhookに上記を指定

http://yoursite.com/deploy.php
![alt](https://i.gyazo.com/ee8066ebf95fb602ee069c6cd8ea5fc1.png)

以上です！簡単ですね。
セキュリティとか考えてないので、ご注意ください。
ActiveHash::Enumと似た機能を持つ、Elixir用の区分値管理パッケージを作ってみました。

Railsでの区分値管理においては、下記の記事で説明されている通り、ActiveHash::Enumが非常に有用です。

[ActiveHashを使ってRailsで区分値を扱う方法](http://labs.timedia.co.jp/2014/01/activehashrails.html)

このgemを使用すると、DBに保存する区分値の管理や、ビューでプルダウンリストを表示する際に使用するコレクションの生成等が一元管理出来るので重宝していたのですが、残念ながらElixirには同様な機能を持つパッケージが(私の探した限りでは)存在しませんでした。

ということで、ActiveHash::Enumと似た機能を持つ、Elixir用の区分値管理パッケージを作成してみました。

[ex_enum](https://github.com/kenta-aktsk/ex_enum)

# 使用方法

使用方法を説明させて頂きます。READMEにも記載してありますが、まずは下記のようにモジュールを定義してみてください。

```ex
defmodule Status do
  use ExEnum
  row id: 0, type: :invalid, text: "this is invalid"
  row id: 1, type: :valid, text: "this is valid"
  accessor :type
end
```

このように定義した区分値を、下記のように取得することが出来ます。

```ex
Status.all
# => [%{id: 0, text: "this is invalid", type: :invalid},
# %{id: 1, text: "this is valid", type: :valid}]

Status.get(0)
# => %{id: 0, text: "this is invalid", type: :invalid}

Status.get_by(text: "this is valid", type: :valid)
# => %{id: 0, text: "this is valid", type: :valid}

Status.invalid
# => %{id: 0, text: "this is invalid", type: :invalid}

status = Status.valid
status.id
# => 1
status.text
# => "this is valid"
status.type
# => :valid

Status.get!(-1)
# => ** (RuntimeError) no result

Status.get_by!(type: :wrong)
# => ** (RuntimeError) no result
```

Phoenixのviewヘルパーとは下記のようにして連携可能です。

```ex

# index.html.eex
<td><%= Status.get(user.status).text %></td>

# form.html.eex
<%= select f, :status, Status.select([:text, :id]), class: "form-control" %>

# show.html.eex
<%= Status.get(@user.status).text %>

```

(2016/03/22追記)

Gettextに対応しました。READMEをご参照ください。

# Elixirのパッケージを作ってみた感想

分かっていたことではありますが、quoteとunquoteの動作を把握するのは中々大変です。

Elixirのメタプログラミングをしっかり理解するには、最低限[Metaprogramming Elixir](https://pragprog.com/book/cmelixir/metaprogramming-elixir)くらいは読破しておかないといけないかもですね。
AWS+PostfixでSMTPリレーの設定

## はじめに
AWS+postfix+smtpリレーの設定をすることになったのでそのメモになります。
最初はsendmailで設定したのですが、postfixのほうが個人的には好きなので変更しました。

環境）
お名前.com
AWS
postfix

## 概要
1. Postfixインストール
2. main.cfの変更
3. テスト

## 詳細
----
#### 1. Postfixインストール
AWSのデフォルトがsendmailだったのでpostfixを入れる。

```shell-session
# yum insatll postfix
:
# service sendmail stop
# chkconfig sendmail off
# chkconfig postfix on
```

----
#### 2. main.cfの変更
設定の変更を行います。

```shell-session
# vim /etc/postfix/main.cf
myhostname = XXXXX
mydomain = XXXXX.jp
myorigin = $mydomain
inet_interfaces = all
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain

local_header_rewrite_clients = static:all
canonical_classes = envelope_sender
canonical_maps = regexp:/etc/postfix/canonical.regexp

# vim /etc/postfix/canonical.regexp
/.*/ no-reply@XXXXX.jp
```
※SMTPリレー先のの制限でenvelope-FROMを強制的に付与させちゃいました。

```shell-session
# service postfix restart
```

----
#### 3. テスト
メール送信してみてテストする。
メール到達すればOK

```
# hostname | mail -s 'TEST' XXXX@xxxxxx.jp
```

## あとがき
とりあえずこれで、postfixで通知されることが確認できました。またPHPからの送信テストも書いてませんがやりましたが、問題なく通知されました。

## その他
参考）
[Postfix でメールリレーの設定 (SMTP クライアント + SMTP Auth)](http://www.maruko2.com/mw/Postfix_%E3%81%A7%E3%83%A1%E3%83%BC%E3%83%AB%E3%83%AA%E3%83%AC%E3%83%BC%E3%81%AE%E8%A8%AD%E5%AE%9A_(SMTP_%E3%82%AF%E3%83%A9%E3%82%A4%E3%82%A2%E3%83%B3%E3%83%88_%2B_SMTP_Auth))
[【postfix】envelope-FROMを強制的に付与する](http://ameblo.jp/server-study/entry-10270572107.html)
Google App Script を使う

Google App Scriptの使い方について記載


○Google App Scriptをスプレッドシート上で使う

1.Spred sheetを新規作成する

2.セルを選択する

3.ツール　> スクリプトエディタ　からスクリプトエディタを開く

4.コードを作成する
以下はメッセージダイアログボックスを表示する例

```gs:HelloWorld.gs
function helloWorld() {
    Browser.msgBox("hello!");
}
```

5.ツールバーのデバックボタン（虫のアイコン）の右となりのボタンから実行するfunctionを選択する

6.ルールバーから実行ボタン（三角のアイコン）を押して実行する

7.スプレッドシートに戻るとダイアログボックスが表示されている



○Google App ScriptをGoogle driveで使う
（以下の例では　webアプリケーションとして公開して確認をします）

1.Google driveを開く　設定 > アプリの管理　から右上の「アプリを追加」ボタンをクリックする

2.「Google App Script」で検索して、「+接続」ボタンをクリックする

3.Google driveのメイン画面に戻って、新規 > その他 > Google Apps Script　を選択する

4.Google Apps Scriptが新規作成されるので、以下のソースを作成、保存

```gs:HelloWorld.gs
function doGet() {
  var app = HtmlService.createHtmlOutput("Hello!");
  return app;
}
```

5.ファイル > 版を管理 を選択してバージョンの説明を追加、「新い
バージョンを保存」ボタンをクリック

6.メニューの　公開 > ウェブアプリケーションとして導入　を選択、「導入」ボタンをクリック

7.「現在のウェブアプリケーションのURL」にURLが表示されるのでコピーして「OK」をクリック

8.URLを開くとブラウザに「Hello!」が表示される



○参考
・Google Api reference 一覧
https://developers.google.com/google-apps/

・逆引き
http://www.bmoo.net/archives/google-apps-script-refference
MySQL5.6でCURRENT_TIMESTAMP()で取得できる時刻を確認する方法

特に意識せずにnow()とかCURRENT_TIMESTAMP()とか使ってたんだけど、タイムゾーン設定が間違ってる可能性があったときにググった。

# 方法

※MySQL5.6.29で動かしてます。サーバーはRHEL6系です。

```
mysql> select CURRENT_TIMESTAMP();
+---------------------+
| CURRENT_TIMESTAMP() |
+---------------------+
| 2016-03-10 08:23:07 |
+---------------------+
1 row in set (0.00 sec)
```


# メモ

## CURRENT_TIME()とかCURRENT_DATE()とかも同じ

```
mysql> select CURRENT_TIME();
+----------------+
| CURRENT_TIME() |
+----------------+
| 08:28:48       |
+----------------+
1 row in set (0.01 sec)
```

や

```
mysql> select CURRENT_DATE();
+----------------+
| CURRENT_DATE() |
+----------------+
| 2016-03-10     |
+----------------+
1 row in set (0.00 sec)
```



## あと、コレおもしろいなーって思った。
暇な時に詳しく調べてみたい。

```
mysql> select NULL;
+------+
| NULL |
+------+
| NULL |
+------+
1 row in set (0.00 sec)
```
Qiitaを利用してみる。

情報を検索しているとよくこのサイトにたどり着いていたので利用してみることにする。
ユーザー登録をしたので、はじめての投稿メモを残しておこう。

## Qiitaってなに？
https://ferret-plus.com/1856

>プログラマの技術情報共有サービス「Qiita」では、プログラミングに関する様々な知識をユーザー同士が活発に共有しており、プログラミングや開発者中心の情報共有プラットフォーム

## Qiita サポート
http://help.qiita.com/

Markdownが使えるのか

## Markdownって？
https://codeiq.jp/magazine/2015/07/24985/

>文書を記述するためのマークアップ言語です。
 元々はプレーンテキスト形式からHTMLへの変換用に開発されたが、
 現在ではパワーポイント等、他形式への変換をサポートしたソフトウェアもあります。

### Markdown記法 チートシート
http://qiita.com/Qiita/items/c686397e4a0f4f11683d


基本的には、自分のメモ・リンクになると思うが、、、
これから情報共有していけたらと思います。
Ubuntuにapache2をインストール（apt-get）

#やったこと
ubuntuにapache2をapt-getからインストール
各種設定（ajp設定、SSL設定）

#インストール手順
### セキュリティ設定
```bash
cd /etc/apache2/conf-available
cp -i security.conf{,.org}
vim security.conf
```

以下に書換え

```apache:security.conf
ServerTokens Prod
ServerSignature Off
```

### サイト設定
```bash
cd /etc/apache2/sites-available
cp -i 000-default.conf [any name].conf
vim [any name].conf
```

以下を書換え

```apache
DocumentRoot [ドキュメントルート]
```

以下を追記

```apache
<Directory "[ドキュメントルート]">
    Require all granted
</Directory>
```

### サイト設定（SSL）
```bash
cd /etc/apache2/sites-available
cp -i 000-default-ssl.conf [any name]-ssl.conf
vim [any name]-ssl.conf
```
以下を書換え

```apache
DocumentRoot [ドキュメントルート]
```

以下を追記

```apache
<Directory "[ドキュメントルート]">
    Require all granted
</Directory>
```

default-ssl.confも書き換え必要みたい・・

```bash
cp -i default-ssl.conf{,.org}
vim default-ssl.conf
```

以下を書換え

```apache
DocumentRoot [ドキュメントルート]
```

以下を追記

```apache
<Directory "[ドキュメントルート]">
    Require all granted
</Directory>
```

###ProxyPass設定
```bash
cd /etc/apache2/mods-available
vim proxy_ajp.conf
```

以下を追記

```apache:AJPポートが8009の場合
<Location /[コンテキストルート]/>
	ProxyPass ajp://localhost:8009/[コンテキストルート]/
</Location>
```

```bash
a2enmod proxy_ajp
```
こんなメッセージが出ます

```bash
Considering dependency proxy for proxy_ajp:
Enabling module proxy.
Enabling module proxy_ajp.
To activate the new configuration, you need to run:
  service apache2 restart
```

###SSL関連のモジュールを有効化
```bash
a2enmod ssl
a2ensite default-ssl
```

###Apache起動
```bash
service apache2 start
```
###自動起動設定
```bash
apt-get install sysv-rc-conf
sysv-rc-conf --list | grep apache2
sysv-rc-conf apache2 on
```

###Appendix
####注意
Apache2.4系からはドキュメントルートの記述が少し変わったらしい・・
今まで

```apache
Options Indexes FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
```

2.4系

```apache
Require all granted
```
こうしないと↓のようなエラーが発生する場合があります

```bash
[client 127.0.0.1:52597] AH01630: client denied by server configuration
```
詳細は[こちら](http://qiita.com/kpkpkp/items/30abe1a68a3a4e8881ab)を参考に


####参考サイト
http://server-setting.info/debian/apache-install-debian-ubuntu.html#apachehttpd_1
http://mole-kingdom.com/wpbl/2012/09/28/3718.html
MovableType ：ローカル環境（windows）へのインストール備忘録

毎度、手順を説明しているサイトをいくつか見ながらインストールしているので、いいかげん自分でメモしとく。

・windows7
・XAMPP
・MovableType 6.2.4


##MTのダウンロード
1. 以下のページへアクセスしてMT個人無償版をダウンロードする。
[Movable Type 個人無償版ダウンロード](https://www.sixapart.jp/inquiry/movabletype/personal_download.html)

2. ダウンロードしたファイルを解凍して、バーチャルホスト設定をしているディレクトリへ移動させる。解凍したフォルダ名を「mt」に変更する。
（例）
以下のディレクトリにバーチャルホスト設定をして、サイトを構築する場合
C:\htdocs\mt_site
解凍したフォルダを持ってきて、名前を「mt」に変更。
C:\htdocs\mt_site\mt


##cgiを実行できるようにする
apacheのhttpd.conf ファイルで設定。

```httpd.conf
<VirtualHost _default_:5000>
 DocumentRoot "C:/htdocs/mt_site/"
	<Directory "C:/htdocs/mt_site">
		Options +ExecCGI
		AddHandler cgi-script .cgi .pl
	</Directory>
</VirtualHost>
```


##CGIの関連付け
MTのcgiファイルを「Perl.exe」に関連付ける。

C:\htdocs\mt_site\mt
　　└ mt.cgi
　　└ mt-check.cgi
　　└ ...

「mt」フォルダ内の.cgiファイルの1行目に「#!/usr/bin/perl -w」と perlのパスが書かれている。これを自分のperlがインストールされているパスに変更する。
「perl」フォルダごと「/usr/bin/perl」に合わせて移動させてもOK。
perlの場所を移動したくない場合は、cgiファイルを書き換える。


##DB作成
XAMPPからApacheとMySQLを起動する。
XAMPPのメニュー画面から phpMyAdminを起動する。以下にアクセスしてもOK。
http://localhost/phpmyadmin/

「データベース」タブをクリックして、「データベースを作成する」欄に適当なDB名を入れて「作成」をクリックする。


##MTのシステムチェック
/mt/mt-check.cgi にアクセスすると、システムチェックの結果を確認できる。（※以下ポートは番号は環境に合わせる）
http://localhost:5000/mt/mt-check.cgi

```
システムのチェックを完了しました。
Movable Typeを利用できます。 
```
と、いちばん下に出ればOK。

```
DBD::mysql
MySQLデータベース(推奨)を使うにはDBD::mysqlのデータベースドライバが必要です。
```
もし上記のようなメッセージが出たら、MySQLのデータベースドライバをインストールする必要がある。
以下のコマンドでインストール。

```
ppm install DB::mysql
```


##MTのインストール
/mt/ にアクセスすると、MTのインストールウィザードの画面が表示される。
http://localhost:5000/mt/

- 「Movable Typeにサインイン」をクリック
- 言語の選択：「日本語」を選択して「開始」をクリック
- システムチェック：「必要なPerlモジュールは揃っています。」と表示されたら、「次へ」をクリック
- データベースの設定：「MySQLデータベース(推奨)」を選択すると、細かいDB設定項目が表示される。（続きは次項目へ）

| 項目 | 値 |
|:-----------|:------------|
| データベースサーバ | localhost |
| データベース名     | ※前項で作成したDB名を入力 |
| ユーザ名          | ※ユーザ名を入力 |
| パスワード        | ※パスワードを入力 |
※ユーザ名は phpMyAdminの「ユーザ」タブで確認できる。

「接続テスト」ボタンをクリックして「データベースの設定を完了しました」と出たら「次へ」をクリック

- メール設定：　システムメールアドレスを入力して「次へ」をクリック
- テンポラリディレクトリの設定：　デフォルト「C:\Windows\Temp」のままで「次へ」をクリック
- 「Movable Type Proの設定を完了しました。」と出たら「次へ」をクリック
- MTアカウントの作成：　適宜入力
- 最初のウェブサイトを作成：　ウェブサイト名、パス、URL、テーマをそれぞれ設定して「インストール」をクリック

「インストールを完了しました！」が出たら「Movable Typeにサインイン」をクリック！


* * *
＜参考＞
- [Movable type を Windows のローカル環境で動かすちょう簡単な方法Add Star](http://d.hatena.ne.jp/hsksnote/20090413/1239637796)
- [ローカル環境にMovable Typeをインストールしてみる！](http://wp-technique.com/mt-install/)
AWS+SendmailでSMTPリレーの設定

## はじめに
AWS+SendmailでSMTPリレーの設定をする機会があったのでそのまとめになります。

環境）
お名前.com
AWS
sendmail

## 概要
1. SPFレコードの追加
2. sendmailにSMART_HOSTの設定
3. 正しくリレーされるかテスト
4. メールを送信

## 詳細
### 1.SPFレコードの追加
DNSの管理画面でSPFレコードの設定を行います。

v=spf1 include:spf.XXXX.jp ~all

尚、複数設定する場合は以下のような感じで設定することができそうです。（未検証）
v=spf1 include:spf.XXXX.jp include:_spf.google.com ~all

### 2.sendmailにSMART_HOSTの設定
sendmailのコンフィグにSMART_HOSTを追加しコンパイルします。

```shell-session
# vim /etc/mail/sendmail.mc 
define(`SMART_HOST',`smtp.xxxxx.net')
:
# make sendmail.cf
WARNING: 'sendmail.mc' is modified. Please install package sendmail-cf to update your configuration.
```

AWSだとエラーがデフォルトではsendmail-cfが入ってないようなのでインストールします。

```shell-session
# yum install sendmail-cf
:
# make sendmail.cf
```

### 3.正しくリレーされるかテスト
正しくリレーされるかテストをします。relayが出ており、HOSTがSMART_HOSTの値であればOKです。

```shell-session
# sendmail -bv XXXX@xxxxxx.jp
XXXX@xxxxxx.jp... deliverable: mailer relay, host smtp.xxxxx.net, user XXXX@xxxxxx.jp
```

### 4.メールを送信
コマンドでメールを送信してみる。
デフォルトだとmailコマンドが入ってなかったのでインストールもしとく。
あとはメールが送信できてればOK。

```shell-session
# hostname | mail -s 'TEST' XXXX@xxxxxx.jp
-bash: mail: command not found

# yum install mail
：
# hostname | mail -s 'TEST' XXXX@xxxxxx.jp
```

## あとがき
sendmailでやったけどpostfixで設定したいので後ほど書きます。

## その他
参考）
[SendmailからSendGridへリレーする4つの方法](http://blog.azumakuniyuki.org/2011/08/4-ways-to-relay-email-from-sendmail-to.html)
HTML5ビデオライブラリを比較

# 参照
* https://praegnanz.de/html5video/

![video.png](https://qiita-image-store.s3.amazonaws.com/0/13451/2351d8a4-2a4b-9c8e-e4a4-00aff7669f22.png)

### 補足
* http://popcornjs.org/


# 現在
* 何も調査しなくて、videojsを使う

# 今後
* 詳しく調査して、この文書に記述する
クラスメソッドからプライベートメソッドが呼べない件

```rb
class A
  def self.x
    a = A.new
    a.y
  end

  private

  def y
  end
end

A.x
```

```
=>
  `x': private method `y' called for #<A:0x007fe5c0922fb8> (NoMethodError)
  from 13:in `<main>'
```

なんで……？
centos7にawscliのインストール

```
rpm -iUvh http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-5.noarch.rpm

# or
wget http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-5.noarch.rpm
rpm -Uvh epel-release-7-5.noarch.rpm

yum -y update

yum -y install python-pip

pip install awscli

[root ]# aws
usage: aws [options] <command> <subcommand> [<subcommand> ...] [parameters]
To see help text, you can run:

  aws help
  aws <command> help
  aws <command> <subcommand> help
  aws: error: too few arguments
[root ~]# 
```

- http://www.liquidweb.com/kb/how-to-install-pip-on-centos-7/

- http://docs.aws.amazon.com/cli/latest/userguide/installing.html
VuforiaSDKとRealmをセットで使うとSystem.err


VuforiaSDKを用いてARカメラを実装したAndroidアプリをリリースしています。
今回、アプリのDBを流行のRealmに切り替えようとした際ハマりましたので紹介します。
VuforiaSDKは5.010のjarおよび.soファイルをダウンロードしてプロジェクトに含め、Realmはver0.87.5をbuild.gradleに記述し導入しました。

````groovy:build.gradle
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'io.realm:realm-android:0.87.5'
````

## 一部の端末でVuforia初期化時にクラッシュするようになった
**System.err﹕ The library libVuforia.so could not be loaded**
Realmを導入後、上記のエラーが発生しアプリごとクラッシュする現象が発生しました。
全ての環境で発生するわけでなく、手持ち（Nexus7、MeMOPad7、XperiaZ4）のうちXperiaでのみ再現しました。

## 原因は64bit対応だった
Realmにはアーキテクチャごとのバイナリファイルが含まれており、これにはARM 64bit用ファイル(*arm64-v8a*)も入ります。
しかしVuforiaSDKでは32bit用の *armeabi-v7a*しか用意されておらず、結果としてアプリに32bitと64bitのバイナリが混在する状態になっていたためクラッシュしていたようです。
ARM 64bitに対応する端末が私の手持ちではXperiaZ4だけであるため納得です。

## build.gradleでexcludeするようにした
JARを直接編集するなどの方法もあるようですが、今回はbuild.gradle上のオプションでこれら衝突するバイナリファイルをビルドから除外することにしました。
以下では *armeabi-v7a*以外全て除外していますが、 *arm64-v8a*のみ除外しても動作するかと思われます。

````groovy:build.gradle
packagingOptions {
        exclude 'lib/arm64-v8a/librealm-jni.so'
        exclude 'lib/armeabi/librealm-jni.so'
        exclude 'lib/x86_64/librealm-jni.so'
        exclude 'lib/x86/librealm-jni.so'
        exclude 'lib/mips/librealm-jni.so'
}
````

## 参考にさせていただいた記事

+ [Realm導入によるAPK肥大化を防ぐ(Split APK) - Qiita](http://qiita.com/takke/items/8f7ca95d35e6f942eba2)
BigQuery | コンソールからのクエリ発行で、特定のプロジェクトを指定する

# 解決

オプションで --project_id を指定すればOK。

# 例

たとえばプロジェクト名が **strawberry-fields-004** なら、次のような感じ。

`$ bq ls --project_id strawberry-fields-004`

`$ bq query` とか、他のコマンドでも同じ。

# 問題

デフォルトのプロジェクト以外にクエリを発行したい。

# 参考

- https://cloud.google.com/bigquery/bq-command-line-tool

# 環境

- Google Cloud SDK 100.0.0
- bq 2.0.18



<!-- Update From Qiita API -->

# チャットメンバー募集


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

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


# メンター受付


https://menta.work/user/5694

<!-- Update From Qiita API -->
チームで開発しているiOSアプリをビルドするためには、Developerアカウントからinviteしてもらう必要がある

ほぼTitle Only。デオチ万歳。

個人で開発していると気づかない、というか必要もないんですが、いざチームで開発しようとgit cloneしてもらいビルドしようとするとエラー。1時間くらいハマったのですが、原因はこれでした。

App IDを発行しているDeveloperアカウントから開発者のApple IDをinviteすれば完了です。

Developer > People
https://developer.apple.com/membercenter/index.action#adpDev

<img width="400" alt="Screen Shot 2016-03-10 at 16.15.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/74328/0b4bb6eb-ad6e-6d73-3269-a64f7abd43bf.png">



昔はプロファイルをダウンロードしたりkeychainに登録する必要があったりしたので、少し混乱しました。
超簡単 slackに本日の予定を表示する。google calendar編

#毎朝定時にslackへ本日の予定を投稿したい...っ
そんな需要があったためメモ代わりに残しておきます。

今回は、すでに予定が記載されているgoogle calendarを
当日分だけslackに表示します。こんな感じ。
![a.png](https://qiita-image-store.s3.amazonaws.com/0/116805/dffbaa43-58e6-7380-701d-e17560398cc8.png)

導入は以下の流れです。
1.slackのインテグレーションからgoogle calendarを選択
2.毎朝slackに表示できるように設定する

##1.slackのインテグレーションからgoogle calendarを選択
https://slack.com/apps/A0F8149ED-google-calendar

##2.毎朝slackに表示できるように設定する
投稿先のチャンネルを登録。
すべてのチェックを外して、ここだけ設定します。
今回は8:00amに投稿するようにします。
![b.PNG](https://qiita-image-store.s3.amazonaws.com/0/116805/f8a38e5d-8a07-0c6b-e15d-b54bde312f92.png)
***
以上の設定で、毎朝設定した時間に当日の予定が投稿されるはずです。

もっと細かいことを行う場合はこちらが参考になると思います。
[Googleカレンダーの内容をSlackに投稿する](http://qiita.com/shibukk/items/c26a64c63e26d0d5a967)
MySQLで文字列=0の比較をすると結果が全て返ってきた

##背景
文字列を送信して、DBの対象のフィールドと比較してマッチしたものを返すという簡単なAPIを作りテストを行っていました。

その最中、なぜか数値の0を送ると全てのデータが返ってくるバグを見つけプログラムを見直したところ
数値は比較対象に限らず数値のままクエリ文に埋め込まれてしまっていたようで、その時のSQLをざっくり表すと下のような感じ。


```sql:select

mysql> SELECT id, title FROM comics WHERE title = 0;
+---------+---------------------------+
| id      | title                     |
+---------+---------------------------+
|       1 | 紅殻のパンドラ              |
|       2 | ゴールデンカムイ             |
...
+---------+---------------------------+
78 rows in set (0.02 sec)

mysql> desc comics;
+---------------+---------+------+-----+---------------------+----------------+
| Field         | Type    | Null | Key | Default             | Extra          |
+-------------------------+------+-----+---------------------+----------------+
| id            | int(11) | NO   | PRI | NULL                | auto_increment |
| title         | text    | NO   |     |                     |                |
...

```

はて？
となりながらも、とりあえず数値も文字列と比較させるなら明示的にしておく方が良いかなと修正。

```sql:modify_select

mysql> SELECT id, title FROM comics WHERE title = '0';
Empty set (0.00 sec)

```

無事想定通りの結果に。

コマンド上から行っているように見えるのはこっちの方がわかりやすいかなという理由です。
あとクラリン可愛い。

とまぁ、
とりあえずは解決したのですが、text型のフィールドに=0としてしまうと
なぜか全件返ってくる事に違和感を感じ調査してみました。

##文字列と数値の比較
結論から言うと、文字列と数値を比較したときに文字列が数値として扱れ
その際、数値に変換できない文字列は全て0として扱われるために
title=0でデータが取得できていたというわけです。

ちなみに全件取得できてしまったのは偶然で、
titleの中に数字だけのデータが存在したらそのデータは取得されませんでした。

```sql
mysql> INSERT INTO comics (title) VALUES ('300');
mysql> SELECT count(1) FROM comics WHERE title = 0;
+----------+
| count(1) |
+----------+
|    78    |
+----------+
1 row in set (0.10 sec)

mysql> SELECT count(1) FROM comics;
+----------+
| count(1) |
+----------+
|    79    | -- 増えた！
+----------+
```


###ではどうして数値として扱われるのか？
型違いの式評価について下記URLに書いてありました。
https://dev.mysql.com/doc/refman/5.6/ja/type-conversion.html
>・引数のいずれかが 10 進値の場合、比較はその他の引数に依存します。その他の引数が 10 進値または整数値の場合、引数は 10 進値として比較され、その他の引数が浮動小数点値の場合、引数は浮動小数点値として比較されます。

>・ほかのすべてのケースでは、引数は浮動小数点 (実) 数として比較されます。

つまり、数値との比較では何でもかんでも数値に変換して比較するよ。とのこと。

やっとスッキリしました！
なんで0になるかも調べたかったけどそれは時間があるときにでも追記しておきます。

##0になる？ならない？
最後にこの文字列は数値にするとどうなるの？
というのを列挙しておきます。

```sql
-- 文字列だけ
SELECT 'a' = 0 -- TRUE
SELECT 'abc' = 0 -- TRUE

-- 10進値
SELECT '1' = 0 -- FALSE
SELECT '123' = 0 -- FALSE


-- まぜまぜ
SELECT 'x1' = 0 -- TRUE

SELECT '1x' = 0 -- FALSE 最初に数値だとその値になる
SELECT '1x' = 1 -- TRUE

SELECT '12x1' = 0 -- FALSE
SELECT '12x1' = 121 -- FALSE
SELECT '12x1' = 12 -- TRUE 最初に文字が出るまでが数値となる


```

##結論
MySQLで文字列で比較するときは理由がないとき以外はちゃんとシングルクォーテーションなりで囲んだりして明示的に文字列としておきましょう。

```sql
SELECT _col FROM _table_ WHERE _string_col = '0';
```

とっても当たり前な結論でした。


##蛇足
```sql
SELECT _col FROM _table_ WHERE _string_col is false;
SELECT _col FROM _table_ WHERE _string_col = false;
```
上記もfalseが0として扱われるので結果的に同じ現象になります。
iOSアプリの状態遷移とライフサイクル

# 状態と状態遷移
![iOSアプリの状態遷移.png](https://qiita-image-store.s3.amazonaws.com/0/96952/df745634-c33e-a0c0-a9be-e53a4b240136.png)


|状態|説明|
|---|---|
|停止状態(Not Running)|アプリが実行されていない|
|非アクティブ状態(Inactive)|アプリはフォアグラウンドで実行中(イベントを受信していない)。アクティブ状態と他の状態が切り替わる時に少しの間この状態になる|
|アクティブ状態(Active)|アプリはフォアグラウンドで実行中(イベントを受信している)|
|バックグラウンド状態(Background)|アプリはバックグラウンドで実行中|
|一時停止状態(Suspended)|アプリはバックグラウンドで未実行。端末がメモリ不足になった場合iOSによって停止される場合がある|

# ライフサイクル
## 停止状態からフォアグラウンドへ
![停止状態からの起動.png](https://qiita-image-store.s3.amazonaws.com/0/96952/890dc3e9-56ef-6540-5c28-b0cd70894ef6.png)

## バックグラウンド状態からフォアグラウンドへ
![バックグラウンドからフォアグラウンド.png](https://qiita-image-store.s3.amazonaws.com/0/96952/551251f5-2658-4f80-72d2-aeeb54bb9596.png)
CakePHP2 ファイルアップロード時にwebroot以下のディレクトリを指定する


##やりたいこと
CakePHP2でファイルアップロードをしたい．
ただしアップロード時に任意のディレクトリにファイルをアップロードしたい．

## Controller側（フォームからアップされたファイルを受け取り，保存）
今からアップロードする場合に，webroot以下のディレクトリをどう選べば良いのか？
以下のように，フォームから画像を受け取る場合：

```php:script.php
if (move_uploaded_file($this->request->data['File']['file']['tmp_name'], 'test.jpg')) {
	$this->Flash->set('ファイルアップロードができました．');
} else {
	$this->Flash->set('ファイルアップロードが失敗しました．');
}
```
これが正しく実行されると，webrootの直下にtest.jpgがされます．
つまり任意のディレクトリにアップロードしたければ，以下のように，ファイルの名の前にディレクトリ名をつければよい．

```php:script.php
if (move_uploaded_file($this->request->data['File']['file']['tmp_name'], 'foo/test.jpg')) {
	$this->Flash->set('ファイルアップロードができました．');
} else {
	$this->Flash->set('ファイルアップロードが失敗しました．');
}
```


## View側（アップロードしたものを表示する）
いろいろしらべた結果，view側の処理はこれでよい．
もちろんこれは，すでにあるファイルを表示するだけの場合．

```php:script.php
echo $this->Html->image('/foo/test.jpg', array('alt' => 'baz'));
// fooディレクトリのtest.jpgファイルを表示（画像ファイルとして）
```

## 参考
http://www.sigesaba.com/2013/06/override-img-dir-in-cakephp.php
公式：http://book.cakephp.org/2.0/en/core-libraries/helpers/html.html#HtmlHelper::script
openFrameworksをサクラVPSで動かす


とある案件でサーバサイドでイメージレンダリングする必要があったのでここにメモ。
本番ではさくらクラウドのインスタンスを使った。

###前提条件

サクラVPS OS Ubuntu 14.04

### 下準備
```
$ sudo apt-get update
```

```
$ sudo apt-get upgrade
```
```
$ sudo apt-get install pkg-config
```

###o/Fインストール

linux版のoFをDLしてきて解凍。

```
$ wget http://www.openframeworks.cc/versions/v0.9.2/of_v0.9.2_linux64_release.tar.gz
```

```
$ tar zxvf of_v0.9.2_linux64_release.tar.gz
```

o/Fには各プラットフォームのインストール用のスクリプトが用意されているのでそれを使う。
今回はubuntu環境なのでlinux/ubuntuのスクリプトを使ってインストール。

```
$ cd of_v0.8.4_linux64_release/scripts/linux/ubuntu
```

```
$ sudo ./install_codeblocks.sh
```
```
$ sudo ./install_dependencies.sh
```

###仮想ディスプレイ

当たり前だがサーバマシンにはディスプレイが繋がっていないのでopenglのコンテキストが作れない。oFのコンパイルはできてもランタイムでエラーするのが問題だった。そこで仮想ディスプレイを用意する。

xvfbで仮想ディスプレイを作成

```
$ sudo apt-get install xvfb
```

```
$ Xvfb :1 -screen 0 1024x768x24 -nolisten tcp &
```

これで準備は完了。あとはプロジェクトを作ってmakeでビルドする。

###実行
 実行する時DISPLAY環境変数を与えて実行。

```
$ DISPLAY=:1 <Your App>
```

###リモートで確認

肉眼で描画されてる様子を見たいならx11xncでvncを立ててリモートから接続しながら実行。

```
$ x11vnc -listen 0.0.0.0 -rfbport 5900 -noipv6 -passwd password -display :1 -forever &
```

以上。