OmniAICreator/Qiita-1.07M huggingface dataset:
PHPのPDOをpdo-debugを使ってSQLロギングしてみる


最近のフレームワークなどではSQLロギングなんて当たり前だと思いますが、古いシステムなどではまだPDO直で書いてます！！！だったり、パフォーマンスのためPDO直で書いてます！！！とかそういう環境もあるとおもいます。
そんな直PDOをロギングするときに便利な[pdo-debug](https://github.com/panique/pdo-debug/blob/master/pdo-debug.php)を使ったときのメモ

## 環境

* PHP 5.6


## 参考にしたサイト

* [panique/pdo-debug](https://github.com/panique/pdo-debug)


## composer経由でインストールする

[panique/pdo-debug](https://github.com/panique/pdo-debug)のREADMEをそのままやればいいです。

```composer.json
"require-dev": {
    "panique/pdo-debug": "0.2"
}
```

でインストール

```
composer install
```

## 使い方

READMEそのまんまでOKかと

```php
$parameters = array(
    'param1' => 'hello',
    'param2' => 123,
    'param3' => null
);
$sql = "INSERT INTO test (col1, col2, col3) VALUES (:param1, :param2, :param3)";
$query = $database_connection->prepare($sql);
$query->execute($parameters);
# プレースホルダの中身がパースされてSQLが出力される
echo PdoDebugger::show($sql, $parameters);
```

これに加えて実行時間でも足したらクエリの発行時間とかわかっていいのかと

```
$parameters = array(
    'param1' => 'hello',
    'param2' => 123,
    'param3' => null
);
$sql = "INSERT INTO test (col1, col2, col3) VALUES (:param1, :param2, :param3)";
# 計測スタート
$time_start = microtime(true);
$query = $database_connection->prepare($sql);
$query->execute($parameters);
# 計測 終了
$time_end = microtime(true);

# プレースホルダの中身がパースされてSQLが出力される
$debug = array(
	'time' => $time_end - $time_start,
	'sql'  => PdoDebugger::show($sql, $parameters)
);
# ログでも吐いてみたらいかがでしょう
error_log(json_encode($debug), 3, "/var/tmp/my-errors.log");
```

jsonでログを吐けば[jq](https://stedolan.github.io/jq/)で綺麗に整形してくれるので便利

```shell
tail -f /var/tmp/my-errors.log | jq .
```

簡単なSQLプロファイラの出来上がりです。
TinyTinyRSSを格好よくするCSSスニペット

# TinyTinyRSSのnight.cssもっと格好良くする

GoogleReader亡き後に大活躍してくれているサーバインストール型のオープンソースRSSリーダー[TinyTinyRSS](http://tt-rss.org)のダークテーマを改造し、標準よりも格好よくしてみた。

![ttrss.png](https://qiita-image-store.s3.amazonaws.com/0/48238/c782aeec-b4e7-abbf-54bd-78eae47978ac.png)

* 余計なモノクロームフィルターを解除
* グレーを多様して白黒のコントラストを緩和
* 本文をリキッドレイアウトにして記事を読みやすく

# CSS

テーマを「night.css」にしてからCSSの「スタイルシートのカスタマイズ」ダイアログ内に以下をペースト。

```css
/* remove monochrome filter */
body#ttrssMain .cdm .cdmContentInner img,
body#ttrssMain .cdm img.tinyFeedIcon,
body#ttrssMain .cdm .cdmFooter img,
body#ttrssMain #feedTree img,
body#ttrssMain .postContent img {
  -webkit-filter:none;
  filter:none;
}
body#ttrssMain .hl.Selected,
body#ttrssMain .hl.active {
  background:#555 !important;
}
div.postReply div.postContent {
  padding: 2em;
  padding-top: 2em !important;
  padding-bottom: 2em !important;
  background: #292929;
  min-height: 100%;
}
div.postContent p {
  max-width: none;
}
.claro .dijitSplitterV,
.claro .dijitGutterV {
  border-right: 1px solid #222;
}
.claro .dijitSplitterV,
.claro .dijitGutterV,
body#ttrssMain #feeds-holder,
body#ttrssMain #headlines-frame,
body#ttrssMain #main-toolbar {
  background-color: #444;
}
a {
  color : hsl(-5, 75%, 55%);
  text-decoration : none;
}
body#ttrssMain #main-toolbar {
  border: none;
}
body#ttrssMain .postHeader {
  background: transparent;
  border: none;
  padding: 1em 2em;
  margin-right: 0;
}
.postTitle a {
  font-size: 1.5em;
  white-space: initial;
}
/* no icons */
.dijitIcon.dijitTreeIcon.feedIcon {display:none;}
/* remove border */
h2{border: 0;}
/* ignore <font> tag style */
font{color: inherit;}
/* error feed */
#feedTree .dijitTreeRow.Error .dijitTreeLabel {
 color: #777;
}
/* remove border */
.hl {
border-width: 0;
}
/* striped background */
.hl:nth-of-type(even){
  background-color: #484848;
}
/* change border color */
#ttrssMain #headlines-frame {
 border-bottom: 1px solid #666 !important;
}
/* change bubble color */
body#ttrssMain #feedTree .counterNode {
  border-radius: 1em;
  border: 0;
  background: brown;
}
/* force align left */
div[align] {
  text-align: left !important;
}
/* trim useless br */
br + br + br,
p:empty {
  display: none;
}
.claro .dijitMenuItem {
  color: #ddd;
}
```
Rails環境構築編

## はじめに

* [前回](http://qiita.com/yamamoto_hiroya/items/08ee8d7bf5deafeebf75)の続きです。
* `Ruby`がひと通り触れることが前提です。
* 新規で`Rails`アプリケーションを立ち上げ、基本的な書き方・読み方を覚えることがメインです。
* 初心者にも分かりやすいように黒魔術を使わない。
* 今回は導入編ということでRailsの環境を構築してアプリケーションを作成する土台を作ります。
* 基本的にMac前提で進めていきます。

## Railsとは

`Rails`とは`Ruby`のフレームワークです。
フルスタックなので大体なんでも用意されています。
個人的にはORマッパーである`ActiveRecord`が非常に優秀だと思っています。
`Rails` = `ActiveRecord`と言ってもいいくらい優秀です。

※ ORマッパーとは、「オブジェクト」と「リレーショナルデータベース」をマッピング（対応付け）するものです。簡単にいうとデータベースやテーブルの情報をオブジェクトとして紐付け、プログラム上で扱いやすくしてくれるもののこと。

## 環境構築

### Mac
* `gem install bundler`
 * bundlerはグローバルインストール
 * gemコマンドはrubyが入っていれば実行可能なはず
 * Macデフォルトのrubyを使う場合にはsudoが必要
 * グローバルなrubyではなくrbenv等でローカルのrubyを設定・使用することをオススメします
 * http://dev.classmethod.jp/server-side/language/build-ruby-environment-by-rbenv/
* `mkdir path/to/work_directory`
* `cd path/to/work_directory`
* `bundle init`
* `Gemfile`を編集
![スクリーンショット 2015-08-11 22.55.21.png](https://qiita-image-store.s3.amazonaws.com/0/67471/d3e6172a-26cc-2671-8dea-e740307924e6.png)

 * railsのコメントアウトを外す
 * railsのバージョンを指定（今回は最新安定版の4.2.3以上を指定）
* `bundle install --path=vendor/bundle`
 * 必ずpathオプションをつけること。でないとグローバルに入ってしまうので
* `bundle exec rails -v`

これでrailsのバージョンが表示されれば無事にrailsが入ったことになります。

### Windows

> http://magazine.rubyist.net/?FirstStepRuby#l5

* インストーラーがあるのでそれを利用する
* Windowsでの環境構築は一般的に大変なので仮想環境を立ち上げ、その中で環境構築するのも1つの手です。

## さぁRailsだ

* `cd path/to/work_directory`
* `bundle exec rails new . -d mysql`
 * 今回はDBにmysqlを使います。入っていない人はmysqlを入れてください。
 * Gemfileがコンフリクトするのでyで上書き

これでRailsアプリの基礎は出来上がりました。

### 余談
* ここらでプロジェクトをgit管理下においておきましょう
 * これ以下は任意ですがやっといた方が絶対に良いです。
* `git init`
* `.gitignore`に管理しないファイルを追記
 * vendor/bundle以下は管理しないのでignoreファイルに追記
* `git add .`
* `git commit -m 'first commit'`

gitは今回の記事の範疇を超えるので説明は特にしません。ご了承ください。

## 簡単なWEBアプリケーションを作ろう

とりあえずRailsに慣れるために簡単な操作が可能なアプリケーションを作ってみましょう（ここからbranch分けとくといいかも）

* `bin/rake db:create`
* `bin/rails generate scaffold user login_code:string name:string password:string`
* `bin/rake db:migrate`

データベースを作成しユーザーモデルとそれを扱うコントローラー、テンプレートをまとめて作成しマイグレーションを実行する。
これで作られたデータベースにユーザーテーブルが作成されているはずです。

* `mysql -u root`
* `show databases;`

`プロジェクト名_development`のデータベースが作成されていれば成功です。

※ DBの確認ですが、今回はユーザーをrootで指定していますが環境によっては異なります。
config/database.yml内でusernameとpasswordを指定してデータベースを作りなおしてみてください。

## サーバを立ち上げて画面から確認してみよう

* `bin/rails server -p 3000`

これでサーバが立ち上がったのでブラウザからアクセスしてみましょう。
`localhost:3000/users`にアクセス。
以下のような画面が出れば成功

![スクリーンショット 2015-08-11 0.01.48.png](https://qiita-image-store.s3.amazonaws.com/0/67471/aeceb59c-721f-e3ca-5d91-2b37886d3b33.png)

この画面から簡単なCRUD操作が可能なのでユーザーを作成したり編集したり削除したり、色々触ってみてください。
サーバーを停止させるには立ち上げたターミナルで`Ctrl-C`

### 演習問題1

userと同様にcompanyについて作成してみましょう。
companyは企業名と住所と電話番号とメールアドレスの情報を持つとします。


## おわりに

今回はこれで終わりです。
Railsを手元の環境に入れ、アプリケーションを作る土台が作りました。
次回は軽いMVCの話、Railsアプリケーションのディレクトリ構成、具体的なコードについて説明できたらと思います。


### 演習問題1解答例

`bin/rails generate scaffold company name:string address:string phone_number:string mail_address:string`
`bin/rake db:migrate`
TypeScriptでReactを書く(3)：propTypes

propTypesやdefaultPropsの設定に少しハマったのでメモ。
公式ドキュメントにはES6 classでの方法が書いてあるが、TypeScriptだとそのまま持ってきても「そんなプロパティはそのクラスには無い」と怒られる。
https://facebook.github.io/react/docs/reusable-components.html

メンバにしてstaticを付けたら出来た。付けないとフロントで実行時にwarnが出る。でもこのやり方も正攻法かわからないので詳しい方教えてください。

サンプルはToDoリストアプリに使おうと思ってる、ただの入力フォーム。入力完了イベントを親コンポーネントに投げるため、propを定義、親からメソッドを渡してもらいそれを実行する。

```ts
/// <reference path="../../../typings/bundle.d.ts" />

import * as React from 'react';

export default class TaskInputForm extends React.Component<any, any> {

  static propTypes: Object = {
    added: React.PropTypes.func.isRequired
  };

  constructor(props) {
    super(props);

    this.state = {
      text: ""
    };
  }

  onClick() {
    this.props.added(this.state.text);
  }

  onChange(e) {
    this.setState({text: e.target.value});
  }

  render() {
    return (
      <div>
        <textarea value={ this.state.text } onChange={ this.onChange.bind(this) }></textarea>
        <button onClick={ this.onClick.bind(this) }>作成</button>
      </div>
    );
  }
}
```
Windows Update エラー 80070003 で Windows10化できないとき→クリーンインストール

##背景
Windows8.1Pro >> Windows10Pro のアップデートを試みるも、Windows Update エラー 80070003　でインストールできない。
ググると「OEMパーティション削除により解消・・・」旨の情報が挙がるが、今回対象のPC ThinkPad E540　にはOEMパーティションがなかった。。。（SSDに換装しており、そのときに問題の種をまいた可能性はある）

##結果
Windows Update エラー 80070003　を解消できず、クリーンインストールした。

##クリーンインストールの手順
※ナニワトモアレ、まずはバックアップを行ってください！
####1. Windows10のISOをダウンロード

MS公式
https://www.microsoft.com/ja-jp/software-download/windows10ISO

※8月12日時点では、ISOをダウンロードするダウンローダ（ツール）をダウンロードし、ローカルでダウンローダを起動させる方式だったが、8月18日現在では、言語等をWeb上で指定して直接ダウンロードするように変わった模様。

####2. プロダクトキーをメモ

コンピュータのプロパティを開くと、下部にプロダクトキーがあります。
念のため、これをメモしてください。
（今回の手順では必要ありませんでしたが、最悪の場合にもとのWindows8.1Proに戻すことができます）

####3. インストール

ISOイメージをDVDに焼いて、DVDからブート。

以上
Google Feed APIで取得できるエントリーの内容

結構前からGoogle news APIが廃止されてFeed APIを使ってくださいねって感じになっているのですが、じゃあ、Feed APIで何が取得できるのか調べてみた

###使い方
***

jquery読み込んでAPI取得して処理を書きます。

```
<script src="http://code.jquery.com/jquery-1.10.2.min.js"></script>
<script type="text/javascript" src="https://www.google.com/jsapi"></script>

<script type="text/javascript">

google.load("feeds", "1");
function initialize() {

    //検索クエリ
    var query = ""
    //フィードの取得 
    var feed = new google.feeds.Feed("https://news.google.com/news?output=rss&q=" + query);

    //取得するエントリ数
    feed.setNumEntries(10);
    
    //フィードを取得した時の処理
    feed.load(function(result) {
        if (!result.error) {
            for (var i = 0; i < result.feed.entries.length; i++) {
                //これが1つの記事
                var entry = result.feed.entries[i]
            }
        }
    });

}

//ロードされたタイミングでinitializeメソッドを実行？
google.setOnLoadCallback(initialize);

</script>

```

###entriesの中身はなんなのか
***
entriesに含まれているのはオブジェクトで、内容は以下のとおりである。

author: 記事の執筆者?
categories: 配列。記事のカテゴリが含まれる？
content: titleやlink, authorなどが全て含まれたDOM要素
contentSnippet:contentの最初の部分から一定の文字数を取り出し、最後に「...」で締められている文字列
link: 記事へのリンク
publishedDate: "Sun, 16 Aug 2015 18:47:42 -0700"という感じの形式で、記事の書かれた日時。
title: 記事のタイトル

?のついてるものは自分の場合は空要素だったので、詳細は不明、多分公式サイトに掲載されているので後で確認して修正する。

調べたところだと、特にAPIキーも求めてこないし、取得数の制限も特に決められてない？ようなので、何かに使えそう。

###追記
コメントでご指摘頂きました。取得できるのは1000件/日くらいだそうです。ご指摘ありがとうございました。
[CakePHP] 環境によって FormHelper が使えない？ Windows と Linux の違いに注意

`$this->HTML->link();` **(HTML)**

って書くとWindowsでは動く。だがLinuxではエラーになる。

`$this->Html->link();` **(Html)**

って書くとどちらでも大丈夫。

Windowsはファイル名で小文字/大文字を区別しないので、そこでタイポがあっても動いてしまうのだ。
ローカルとリモートで開発環境が違うときなど、要注意。

*実際にはWindiws/Mac ではなくファイルシステムの違いよる。








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Bootstrap - formメモ

Bootstrapを使用してformを作成するときにいつも戸惑うので幾つかパターン化してメモ。

![Screenshot 2015-08-18 11.12.00.png](https://qiita-image-store.s3.amazonaws.com/0/82804/4dd9f1f3-30a1-f349-a982-41954a3818ea.png)

```haml:/app/views/moving_items/new.html.haml
.row
  .col-sm-6
    .form-group
      = f.label :name
      = f.text_field :name, class: "form-control", placeholder: "Name"

  .col-sm-3
    .form-group
      = f.label :room
      = f.text_field :room, class: 'form-control', placeholder: "Room"

  .col-sm-3
    .form-group
      = f.label :category
      = f.text_field :category, class: 'form-control', placeholder: "Category"
.clearfix

.row
  .col-sm-6
    .form-group
      = f.label :volume
      = f.number_field :volume, in: 0..200, step: 0.5, value: 3, class: "form-control"
    .form-group
      = f.range_field :volume, value: 3, id: "volume_slider"
  .col-sm-6
    .form-group
      = f.label :quantity
      = f.number_field :quantity, in: 0..999, step: 1, class: "form-control", value: 1
.clearfix

.form-group
  = f.label :description
  = f.text_area :description, class: 'form-control', placeholder: "Description"
.clearfix
```

http://getbootstrap.com/css/#forms
Private Nodeの注文方法と確認方法

<a href="http://softlayer-bluemix-summit.jp" target="_blank"><img src="http://softlayer-bluemix-summit.jp/wp-content/uploads/2015/07/half_banner_234x60.jpg" alt="SoftLayer Bluemix summit2015" /></a>

# Private NodeとPublic Node
Softlayerの仮想サーバにはPublic NodeとPrivate Nodeの2種類があります．
Privateの場合はハイパーバイザ[^1]が自分専用になり，計算資源を厳密に管理できるようになります．
ハイパーバイザが共通（Public Node）だと，自分の仮想マシンでCPUを使いたくても，
同じハイパーバイザ上にいる別ユーザがCPU使ってるから割り当てられない，なんてことがあるかもしれないわけです．
CPUぶん回したいけどぶベアメタル頼む程でもない，くらいの用途に使うのではないでしょうか．

このへんの話についてはNI＋Cの常田さんがわかりやすい図解付きで説明してくれています．
http://niccloud.niandc.ne.jp/?p=1197

# 注文方法
ポータル上（[https://control.softlayer.com/](https://control.softlayer.com/)）から注文しようとすこしハマるかもしれません．

マシンを注文するにはTOPページのOrderからDevicesをクリックします．
![ポータル画面](https://qiita-image-store.s3.amazonaws.com/0/58048/2b2638b3-c792-8c30-bef3-95093ba6fd29.png)

↓

クリックすると下のようなモーダルが出てきます．Private Nodeを注文するには左側を，Public Nodeを注文するには右側をクリックすればいいように見えます．
![注文選択画面](https://qiita-image-store.s3.amazonaws.com/0/58048/916f156d-489b-330b-7b7f-2d5cc0d3f010.png)

↓
privateの時間課金（上図の赤矢印）をクリックするとしたのような画面が表示されます．
必須項目（データセンターとOPERATING SYSTEM）を選択し注文するとPrivate Nodeを注文できるように見えます...が実は違います．
![注文画面](https://qiita-image-store.s3.amazonaws.com/0/58048/95baa1b3-2aaa-804f-2687-6c7df4423cd8.png)

* * *
参考：
ちなみにpublicの時間課金（右側の青矢印のほう）をクリックした時に表示される画面はこんな感じです．
先ほどと同じに見えますが...同じです．
![スクリーンショット 2015-08-17 18.06.07.png](https://qiita-image-store.s3.amazonaws.com/0/58048/e9d4ac3d-c407-deb4-e680-c61e13d64993.png)
* * *

## publicとprivateの切り替え
publicとprivateを切り替える場合は，注文画面に入る前の選択肢ではなく，注文画面内の「COMPUTING INSTANCE」の選択で行います．
クリックするとCoreの選択肢の上にpublicとprivateの切り替えタブがあります．
![切り替え](https://qiita-image-store.s3.amazonaws.com/0/58048/f56ca4fc-c053-eae5-6298-5ebee3bb672b.png)

* * *
# 確認
注文の仕方がわかったということで，次は注文済みのマシンがpublicかprivateか見分ける方法を紹介します．
稼働しているマシン一覧はDevice Listに表示されますが，Private NodeかPublic Nodeかの情報はありません．
注文時のことを思い出してほしいのですが，publicかprivateの切り替えはCPUの種別選択で行いました．
CPUの種別を確認できればpublicかprivateの確認ができるはずなのですが，
詳細画面ではどちらも「1CORE」のように表示されてしまいます．

![スクリーンショット 2015-08-17 18.18.05.png](https://qiita-image-store.s3.amazonaws.com/0/58048/db017f3b-90b1-ddee-1ac4-e8bb697ce89b.png)

というわけで，ちょっと力技ですが，赤で囲まれている「Modify Device Configuration」リンクを押してみましょう．
（青で囲んだProcessorのModifyでもいいです）

↓

構成変更画面に入ると現在の構成がデフォルトで表示されています．
ここを見ることで対象マシンがPublic NodeかPrivate Nodeか確認することができます．
CPU変更画面
![スクリーンショット 2015-08-10 12.36.25.png](https://qiita-image-store.s3.amazonaws.com/0/58048/3bda002a-52d5-7eab-1118-bc42354a9061.png)

* * *
ちなみにCPUのみ変更の場合（青で囲まれたリンクをクリックした場合）は下記のようなモーダルが表示されます．
![スクリーンショット 2015-08-10 12.31.03.png](https://qiita-image-store.s3.amazonaws.com/0/58048/8b44cf18-2538-a8cc-eece-584cd6f0cad7.png)


# おまけ
APIからの確認はVirtualGuestの中の「dedicatedAccountHostOnlyFlag」を見ることで判定できます．お試しください．
http://sldn.softlayer.com/reference/datatypes/SoftLayer_Virtual_Guest

* * *
[^1]: 仮想マシンを管理するプログラム [→ wikipedia](https://ja.wikipedia.org/wiki/%E3%83%8F%E3%82%A4%E3%83%91%E3%83%BC%E3%83%90%E3%82%A4%E3%82%B6)
【Python】pandasで指定したフォルダのcsvファイルを開く

Python2.7.6をpycharmでデータ分析をしようと思い立ったのですが、
解析対象のcsvファイルを読み込むことができず、
数時間いろいろ調べた結果、以下の方法で解決しました。

##最初にやってダメだったこと (read_csvで直接csvを読み込む)
うーん、データを分析するには、どうやらpandasっての良いらしい、
ってことで、pandasをpycharmにインストールしました。
で、pandasのread_csvっての使えばcsvの読み取りができるそうなので、
さっそく次のようにやってみました。

```lang:pandasを使ったcsv読み取り
import pandas as pd

df = pd.csv_read("/ディレクトリまでのファイルパス/test.csv")
print df
```
が、結果としては、読み込めず、以下のようなエラーメッセージが。。。

```lang:pandasでのcsv読み取り結果
IOError: File test.csv does not exist
```

##この方法で解決しました （作業ディレクトリの変更を加える）
この問題を解決するためにいろいろ調べたところ、
どうやらcsv_readメソッドでは、ファイルパスから直接
ファイルを呼び出すことができず、呼び出したいファイルの在りかまで
パスを指定し、作業ディレクトリを変更しなければいけないことが分かりました。

作業ディレクトリの変更はos.chdirを使えばいけました。

```lang:作業ディレクトリを指定し、pandasを使ったcsv読み取り
import pandas as pd
import os

# データが格納されている作業ディレクトリまでパス指定
os.chdir("/ディレクトリまでのファイルパス")
# csvの読み取り
df= pd.read_csv("test.csv")
print df
```

以上のような方法で、無事csvを読み取ることができました！
【俺メモ】Linuxでプログラミング用フォントSourceCodeProの生成＆インストール

Source Code Proといっても日本語が使えるにこしたことないし
Source Han Code JPのインストールまでやるで

# Adobe Font Development Kitのダウンロード＆設定
１．ダウンロード
　[ダウンロードサイト](http://www.adobe.com/devnet/opentype/afdko/eula.html)からLinux用の対応バージョンをダウンロードや。
２．展開＆配置
　ダウンロードしたファイルを展開して、作成されたFDKフォルダを適当の場所に置くで。
３．パス設定
　配置したFDK/Tools/Linuxににパスを通すんやで。

```
 $ export PATH=＜任意のパス＞/FDK/Tools/linux:$PATH
```

# フォントの生成＆インストール
１．ダウンロード
[GitHub公式](https://github.com/adobe-fonts/source-han-code-jp)からZipファイルでダウンロードかGitでダウンロードや

```
$ git clone https://github.com/adobe-fonts/source-han-code-jp
```
２．生成
SourceHanCode-JPをダウンロード・展開したディレクトリに移動して、コマンド実行や。

```
$ cd <展開フォルダ>
$ ./command.sh
```
３．インストール
RegularとかBoldとかのディレクトリの下にOTFのフォントファイルが出来上がっているのでダブルクリックか~/.fontsディレクトリに移動するか、とかでインストールが完了や
Golangのgormで、カスタマイズしたtime.Timeに差し変える


gormというORMで、デフォルトで定義されている論理削除可能な構造体は、下記のようなものですが、


```go
// gorm.Model
type Model struct {
    ID        uint64 `gorm:"primary_key"`
    CreatedAt time.Time
    UpdatedAt time.Time
    DeletedAt *time.Time
}
```

これをクライアント側に返却するとき、時刻をJSONエンコードなりTextエンコードなりすると思いますが、
そのまま使うと時刻文字列のフォーマットが、`RFC3339Nano`というナノ秒まで持つフォーマットを使って変換されてしまいます。

```go
// Time Format
const (
	RFC3339     = "2006-01-02T15:04:05Z07:00"
	RFC3339Nano = "2006-01-02T15:04:05.999999999Z07:00"
)

// JSON Encode
func (t Time) MarshalJSON() ([]byte, error) {
	if y := t.Year(); y < 0 || y >= 10000 {
		// RFC 3339 is clear that years are 4 digits exactly.
		// See golang.org/issue/4556#c15 for more discussion.
		return nil, errors.New("Time.MarshalJSON: year outside of range [0,9999]")
	}
	return []byte(t.Format(`"` + RFC3339Nano + `"`)), nil
}
```

クライアントによっては、ナノ秒など解釈できないものがあるためかなり不便です。
普通そんな細かい精度の時刻など必要としない場合の方が多いため、 ミリ秒以下を切り捨てたいところです。

そんなときは、時刻のタイプ自体をカスタマイズすることで解決することが出来ます。

```restime.go
package typedef

import (
	"database/sql/driver"
	"errors"
	"time"
)

// XXX: アプリでナノ秒は必要ないので秒まででフォーマット
//{
//    "createdAt": "2015-08-09T15:03:05.135166971Z",
//    "objectID": "55c112a40000a1"
//}
// See: http://qiita.com/taizo/items/2c3a338f1aeea86ce9e2
type ResourceTime struct {
	time.Time
}

func (rt ResourceTime) MarshalJSON() ([]byte, error) {
	t := rt.Time
	if y := t.Year(); y < 0 || y >= 10000 {
		return nil, errors.New("ResourceTime.MarshalJSON: year outside of range [0,9999]")
	}
	return []byte(t.Format(`"` + time.RFC3339 + `"`)), nil
}

func (rt ResourceTime) MarshalText() ([]byte, error) {
	t := rt.Time
	if y := t.Year(); y < 0 || y >= 10000 {
		return nil, errors.New("Time.MarshalText: year outside of range [0,9999]")
	}
	return []byte(t.Format(time.RFC3339)), nil
}

// Sql driver interface

func (rt *ResourceTime) Scan(value interface{}) error {
	rt.Time = value.(time.Time)
	return nil
}

func (rt ResourceTime) Value() (driver.Value, error) {
	return rt.Time, nil
}
```

やってることは、

* エンコードの時刻文字列フォーマットを秒数まで出力するものに変更
* SQL Driverが実装すべきメソッドを定義(`Scan`と`Value`)

これだけでクライアントに返却する時刻文字列のフォーマットを変更することができました。

```go
type Model struct {
    ID        uint64 `gorm:"primary_key"`
    CreatedAt ResourceTime `json:"createdAt"`
    UpdatedAt ResourceTime `json:"updatedAt"`
    DeletedAt *time.Time   `json:"deletedAt,omitempty"`
}
```

## 未解決事項

論理削除で使われる `DeleteAt`は、`time.Time`へのポインターで定義されていますが、これを `*ResourceTime`に変更するとMySQLにカラムは追加されますが、実行時、レコード追加するときにエラーになります。
今のところよくわからなかったので、別途 `view object`みたいな構造体を定義して詰め直し、時刻フォーマットを変更する方法で回避しました。
詳細は、この辺参考 [JSON and struct composition in Go](http://attilaolah.eu/2014/09/10/json-and-struct-composition-in-go/)

## 参考

* [How map embedded type?](https://github.com/jinzhu/gorm/issues/363)
* [Big Sky :: Golang のオフィシャルが提供するインタフェースまとめ](http://mattn.kaoriya.net/software/lang/go/20140501172821.htm)


## 環境

* Golang 1.4.2
* MySQL 5.6.26
AssertJで独自クラスのリストをテストする方法


AssertJで独自クラスのリストをテストする場合は、Extractを使うのが楽です。

例えば以下のようなクラスがあったとします。

```java
public class User {
    public String id;
    public int rank;

    public User(String id, int rank) {
        this.id = id;
        this.rank = rank;
    }
}
```

そのときに、以下のリストをテストしたいとします。

```java
List<User> users = new ArrayList<>();
users.add(new User("abc", 10));
users.add(new User("def", 20));
```

このときは、Extractorを使って以下のように書けます。まずクラスを使った書き方。

```java
import static org.assertj.core.api.Assertions.*;

import org.assertj.core.api.iterable.Extractor;
import org.assertj.core.groups.Tuple;

// 1つ目が展開元、2つ目が展開先(通常はTuple)
public class UserExtractor implements Extractor<User, Tuple>
{
    @Override
    public Tuple extract(User user)
    {
        // tupleはObjectの可変長引数を取るメソッド
        return tuple(user.id, user.rank);
    }
}
```

テストは以下のようにします。

```java
assertThat(users).extracting(new UserExtractor())
    .contains(tuple("abc", 10))
    .contains(tuple("def", 20));
```

もちろん、ラムダ式を使うことで、以下のように書けます。

```java
assertThat(users).extracting((u) -> tuple(u.id, u.rank))
    .contains(tuple("abc", 10))
    .contains(tuple("def", 20));
```

以下のようにフィールド名を文字列で指定することも可能です。

```java
assertThat(users).extracting("id", "rank")
    .contains(tuple("abc", 10))
    .contains(tuple("def", 20));
```
Unixプロセスがfork()したとき親から子へ継承される属性まとめ

詳解UNIXプログラミング第2版　8章プロセス制御　より

## 親から子へ継承される属性
* オープンされているファイル
* 実ユーザID、実グループID、実効ユーザID、実効グループID
* 補足グループID
* プロセスグループID
* セッションID
* 制御端末
* セットユーザIDフラグとセットグループIDフラグ
* カレント作業ディレクトリ
* ルートディレクトリ
* ファイルモード作成マスク
* シグナルマスクとシグナル処理
* オープンされたファイル記述子のクローズオンイグゼックフラグ（オープン済みファイルのファイル記述子群は close-on-exec が指定されたとき exec()時に自動的にクローズされる）
* 環境変数
* 共有メモリセグメント
* リソースリミット（ulimit）

本には書かれていなかったが

* nice値

## 親と子の違い
* forkからの戻り値
* プロセスID
* 親プロセスID
* 子側のtms_utime, tms_stime, tms_cutime, tms_ustimeの値は0になる
* 親が設定したファイルロックは子には継承されない
* 子に対する保留アラームはクリアされる
* 子に対する保留シグナルの集合は空になる
Redmine (3.1.0-0) から VisualSVN のリポジトリに接続

今の開発現場で ITS として Redmine を採用することにしました。運用環境は、Windows Server 2012 R2 です。

[bitnami](https://bitnami.com/stack/redmine/installer) から、Windows 版インストーラーをダウンロード。使用する VCS は Subversion ですが この際 Git とかも全部入りでインストールしました。

プロジェクトの作成とかユーザーの追加とかは滞りなくできたのですが、プロジェクトで使用することになっている既存の SVN リポジトリに繋ごうとすると

> リポジトリにエントリ/リビジョンが存在しません

というエラーがでてしまいます。ログを見ると 404 で リポジトリ情報が取得できていません。どうやら SVN サーバーでは VisualSVN というのを使っているようです。リポジトリは SSL/TLS で自己証明書により公開されており Redmine を導入した Windows Server 側で証明書の信用ではじかれているようです。

ぐぐると subversion_adapter.rb の修正が必要という FAQ にヒットしました。

¥<Redmine インストール先>¥apps¥redmine¥htdocs¥lib¥redmine¥scm¥adapters¥subversion_adapter.rb

を開き、以下のように修正。

##### 修正前
```ruby
   str << " --no-auth-cache --non-interactive"
```
##### 修正後
```ruby
   str << " --trust-server-cert --no-auth-cache --non-interactive"
```

しかしこれだけでは繋がりません。VisualSVN サーバーのレジストリ変えるとか HTTPS 諦めて HTTP で繋ぐように VisualSVN 設定変更するという記事が多かったのですが、SVN サーバーの変更は NG。そこで単純に VisualSVN の自己証明書を Redmine の Windows Server 2012 R2 にインストールしてみたところあっさりとリポジトリの内容を取得できました。証明書のインポートウィザードで簡単にインストールできました。

今回 Git もインストールしておいたので、MinGW 環境が使え、 tail コマンド や Vim 支えて助かりました。SVN オンリーの時でもインストールしておいて損はないですね。
[Git] リビジョンとは？ コミットとは何が違う？

コミットによって作られる、状態の単位を「リビジョン」という。
では何が「コミット」と何が違うのか。

たとえば「コミットする」とは言うが「リビジョンする」とは言わない。
なぜならリビジョンは、あくまで**「状態の単位」**をあらわすからだ。

つまり「コミット」より狭義の言葉だ。

なので、たとえば「過去のコミットに戻る」というのは。
明確には「過去のリビジョンに戻る」ということを意味する。
　

***
　
* 「git リビジョンとは」でググっても何も出てこなかったので自分なりに書いてみた。
* より分かりやすい言葉だと「バージョン」に近い。ただ「バージョン」と書くと、ソフトウェアのバージョン等と混同してしまうので「リビジョン」の方が適切だ。
* Subversion では git より「リビジョン」という言葉が使われているようだ。
* ちなみに `c77350968302fb61bccb3e604e2ecd297c9c3c02` みたいなのは「コミットのハッシュ値」とか「リビジョン番号」とか呼ぶ。
*余談だが git は、基本的概念を説明したページが非常に少ない気がする。








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Head of Line Blocking - High Performance Web 2015

# 二つの head of line(HOL) blocking

Web 周辺のコンテキストで (HOL blocking) と言うと、実際には二つの種類がある。

- HTTP での HOL Blocking
- TCP での HOL Blocking

この二つは違うものなので、話す場合は「どの」レイヤでの話なのかは明示したい。

# HTTP の HOL Blocking

HTTP/1.1 のリクエスト-レスポンスの組は、常に順番を保ち同期的に行われる必要がある。

具体的に **1 つの TCP コネクション上で**、 3 つの画像(a.png, b.png, c.png) を取得する場合、 HTTP リクエストは以下のようになる。


```
|---a.png---|
            |---b.png---|
                        |---c.png---|
```

一つのリクエストが処理され、レスポンスを受け取り終わってから、次のリクエストを投げることになる。

必ず前のリクエストが終わってからでないと、次のリクエストは投げられない。
もし a.png のリクエストが詰まってしまうと、 b, c がいくらすぐ処理できても全体としては遅くなっていまう。


```
|-------------------------------a.png------------------|
                                                       |-b.png-|
                                                               |--c.png--|
```

先攻するリクエストが詰まることで、後続も Block される。
これは HTTP/1.1 での HOL である。

単純な回避策として、別のコネクションでやるというのが考えられる。ブラウザであれば、同時に 6 本程度のコネクションを貼っているが、リソースが 6 個以上あれば、結局個々のコネクションで同様のことが起こるのをさけることはできない。

HTTP/1.1 の pipelining という仕様は、(条件付きで)リクエストだけ先に投げてしまうことで、多少これを回避するが、レスポンスはかならず順番なので、 a.png がサーバ側で詰まっていた場合、思った程効果が得られない。


## HTTP/2 の場合


HTTP/2 の場合は、リクエストはコネクション上に多重化される。
これは、 a~c.png が全て並行にリクエスト/レスポンスされる状態を意味する。
よって、 a.png が時間のかかる処理でも b, c.png は先に取得して表示できるということ。


```
|-------------------------------a.png------------------|
|-b.png-|
|--c.png--|
```

実質 HTTP/1.1 での HOL Block は HTTP/2 では起こらないと言える。

ちなみに、画像がたくさん合った場合、コネクションがパンクするのでは？という問題については、 HTTP2 はコネクション上での Flow Control や、重要なリソースを優先する Priority を仕様として備えているので、それらで細かく制御が可能。


## TCP の HOL Blocking

TCP の HOL Blocking は、HTTP のリクエスト/レスポンスを TCP のパケットレベルに置き換えたものとイメージできる。

TCP はパケット送信時に、送達を保証するため、もしパケットがロスとすると再送する。
再送が発生する場合は、パケットの順序が逆転しないように後続のパケットは待たせる。

つまり、 TCP 上で 3 つのパケットを送る際、先攻のパケットがロストすると後ろが詰まる。
これは TCP での HOL Blocking となる。

例えば、 HTTP/2 で多重化されたリクエストは、 TCP 上では単なるパケットなので、パケットが詰まると全体が遅れるという問題は回避できない。
むしろ 1 本の TCP コネクションで全部多重化している分、複数の TCP を使っていたころと比べると影響範囲が大きい可能性すらある。(1 パケット詰まると、表示全体が詰まる)


```
|-----packet1------|xxx lost xxx|-----packet1-----|
                                                  |-packet2-|
                                                            |--packet3--|
```


MTCP(multipath tcp) を使うと、複数のコネクションを別経路で貼って、より遅延などが少ない方を選ぶといったこともできるようだが、普及についてはまだまだという認識。
しかし、これは別途モバイルでの接続など、移動端末では重要になってくるが、それはまた別の話。

## QUIC の場合

QUIC は TCP ではなく UDP の上に、独自に TCP 相当の再送制御の仕組みを作り直しています。
そして、その多重化は、最初からパケットレベルの HOL Block が起こらないようにデザインされています。


```
|-----packet1------|xxx lost xxx|-----packet1-----|
|-packet2-|
|--packet3--|
```

よって HTTP/2 over QUIC になれば、両方の HOL Block の問題が解決することになります。


## link

TCP 1 本にまとめたときの影響について調査された論文がある。
http://sarulab.inf.shizuoka.ac.jp/pdf/335_shikama.pdf
高解像度のディスプレイでEclipseのアイコンが小さくなっちゃう問題を何とかする

## 対象の読者
新しめのWindows PC買ってEclipse起動したら諸々のアイコンが豆みたいになってしまったのでIntelliJに乗り換えようと思っている方

## 用意するもの
- リソースエディタ
    - [RegEdit](http://www.resedit.net/)  (私のPCではうまく動かなかった)
    - [Resource Hacker](http://www.angusj.com/resourcehacker/)

## 手順
- eclipse.exeのバックアップを作る。
- リソースエディタでマニフェストファイルを開く。
- 以下のようになっているのを確認  

```
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
	<assemblyIdentity version="3.1.0.0" processorArchitecture="*" name="Eclipse Launcher" type="win32"/>
	<description>Standard Widget Toolkit</description>
	<dependency>
		<dependentAssembly>
			<assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="*" publicKeyToken="6595b64144ccf1df" language="*"/>
		</dependentAssembly>
	</dependency>
</assembly>
```
- 以下のように編集(xmlnsにasm.v3を追加し、application以下のタグを追加)

```
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><assembly xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3" manifestVersion="1.0">
  <asmv3:application>
    <asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
      <dpiAware>false</dpiAware>
    </asmv3:windowsSettings>
  </asmv3:application>
	<assemblyIdentity version="3.1.0.0" processorArchitecture="*" name="Eclipse Launcher" type="win32"/>
	<description>Standard Widget Toolkit</description>
	<dependency>
		<dependentAssembly>
			<assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="*" publicKeyToken="6595b64144ccf1df" language="*"/>
		</dependentAssembly>
	</dependency>
</assembly>
```

- コンパイルして保存
rsyncで特定のファイルだけ同期しないようにする

jenkinsでのビルドを行っていた時に、laravelの`.env`ファイルは同期したくなかったので使いました。

書き方としては、`--exclude="***"`とすればOKなのですが、注意しないといけないのは、同期元ディレクトリからの相対パスで書かないと行けないので、絶対パスで書くと正しく認識されないことです。

* 具体的な設定例

```
rsync -rlptgoD --delete --exclude .env /web/dev.hoge/public/ /web/hoge/
```

こうすると、/web/dev.hoge/public/.envファイルは同期されなくなります。

また、同期したくないファイルが多い場合は、exclude-fromというオプションでファイル毎指定出来るみたいなので、明朝にでもその方法も追記します。
ajaxでファイルをアップロードする方法（メモ）

##たまにやるけど忘れるのでメモ
**htmlフォームの内容**

```html:index.html
<form action="" method="post">
  <input type="file" name="hoge">
  <input type="submit" name="upload" value="アップロード">
</form>
<input id="hoge" type="hidden" value="hoge">
```

**ajaxの部分**

```javascript:file.js
/*
inputにファイルが選択された時にアップロードする。
アップロードをクリックした時に動作させるためにはchangeをclickにする。
$(document).onはあとから追加した要素にも対応させるため。
*/
$(document).on('change','input[name="hoge"]',function(){
  var fd = new FormData();
  if ($("input[name='hoge']").val()!== '') {
    fd.append( "file", $("input[name='hoge']").prop("files")[0] );
  }
  fd.append("dir",$("#hoge").val());
  var postData = {
    type : "POST",
    dataType : "text",
    data : fd,
    processData : false,
    contentType : false
  };
  $.ajax(
    "ajax/index.php", postData
  ).done(function( text ){
    console.log(text);
  });
});
```
**phpでの処理**

```php:index.php
$dir = $_POST["dir"];
if($_FILES["file"]["tem_name"]){
  list($file_name,$file_type) = explode(".",$_FILES['file']['name']);
  //ファイル名を日付と時刻にしている。
  $name = date("YmdHis").".".$file_type;
  $file = "img/".$dir;
  //ディレクトリを作成してその中にアップロードしている。
  if(!file_exists($file)){
    mkdir($file,0755);
  }
  if (move_uploaded_file($_FILES['file']['tmp_name'], $file."/".$name)) {
    chmod($file."/".$name, 0644);
    var_dump($dir."/".$name);
  }
}
```
###まとめ
忘れた時に結構忘れてしまうことがある。
忘れないのが一番なんだけれども・・・

でも忘れるよね。
だって人間だもの。
amazon linux に sqlplus をインストール

amazon linux に sqlplus を入れたときのメモ

* パッケージの入手先

http://www.oracle.com/technetwork/topics/linuxx86-64soft-092277.html
(先にユーザーIDをつくってサインインしておく必要があり)

上記URIに、さまざまなパッケージがあるが、今回はsqlplusだけ欲しかったので

`oracle-instantclient12.1-sqlplus-12.1.0.2.0-1.x86_64.rpm` をダウンロードした。

* インストール

rpmなので、`rpm`コマンドでインストール

```
# rpm -ivh oracle-instantclient12.1-sqlplus-12.1.0.2.0-1.x86_64.rpm 
Preparing...                          ################################# [100%]
Updating / installing...
   1:oracle-instantclient12.1-sqlplus-################################# [100%]
```

これで、sqlplus64コマンドおよび必要なライブラリがインストールされる。

* ライブラリのパス設定

インストールしただけでは

```
# sqlplus64 
sqlplus64: error while loading shared libraries: libsqlplus.so: cannot open shared object file: No such file or directory
```

という悲しい結果になるので、ライブラリのパスを通す必要がある。

ダウンロードページの下の方にインストール方法が書いてあって、その中にライブラリのパスを通すために環境変数を設定しろ、と書いてある。

```
export LD_LIBRARY_PATH=/usr/lib/oracle/12.1/client64/lib:$LD_LIBRARY_PATH
```

これを `~/.bashrc` なんかに書いておけばよいのだが、それだとそのユーザのみ有効なので`/etc/ld.so.conf.d/oracle.conf` というファイルを作成し、ライブラリのパスを設定してみる。
(/etc/ld.so.confで include *.conf というような設定があるので拡張子が.confであればファイル名は何でもよい)

```
# cat /etc/ld.so.conf.d/oracle.conf 
/usr/lib/oracle/12.1/client64/lib
```

作成後、`ldconfig`コマンドを実行して設定を有効化する。

```
# ldconfig
# sqlplus64 

SQL*Plus: Release 12.1.0.2.0 Production on Tue Aug 18 13:45:32 2015

Copyright (c) 1982, 2014, Oracle.  All rights reserved.

Enter user-name: 
```
laravel5では簡単に開発環境と本番環境が切り替えられる

### やりたいこと

開発環境では、開発用のDBにアクセス。
本番環境では本番用のDBにアクセスしたい。

laravelだったら超簡単に出来ます。

### .envファイルを使う

`.env`ファイルというのは、laravelをcomposer経由でインストールすると自動で生成されるファイルで、環境ごとに異なるような設定を書くことが出来るファイルです。
※ この`.env`ファイルにはDBアクセス情報などを書くことになるので、ソースコードの管理配下には置かないこと。gitの場合はgitignoreに追加してください。

```bash:例
DB_HOST=localhost
DB_DATABASE=dev_db
DB_USERNAME=hogehoge_dev
DB_PASSWORD=hogehoge_dev_pass
```

このファイルを、開発環境、本番環境毎に分けて設定しておけば簡単に開発/本番の使うDBの情報を切り分けることが出来ます。


さらに、laravelではDBのマイグレーションをクラスで作ることができ、
それを `php artisan migrate` コマンド一発でテーブルやデータを突っ込むことが出来ます。

[マイグレーションの設定方法はここを参考にしました](https://laravel10.wordpress.com/2015/02/26/%E5%88%9D%E3%82%81%E3%81%A6%E3%81%AElaravel-5-8-%E3%83%9E%E3%82%A4%E3%82%B0%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E4%BD%9C%E6%88%90/)
TwitterのSearch APIでハッシュタグがあるTweetを取得する

####1. 必要なオーオースAPI
####2. Twitter API
####3. 制限

■Oauth APIは下記にダウンロードする。
https://github.com/abraham/twitteroauth

■Twitter API Key
https://apps.twitter.com
にDeveloperプログラムに参加し、取得する。

■制限
①Twitterの制限により、下記の取得方法は一回最大100件しか取得できない
→1分1回走らせる場合、1分100Tweetしか取得できないことになる（101個目から取得不可能）
1分に数回走らせたら？Twitter APIコール数の制限があるので、要注意

②Twitter Search APIを使用しているので、Twitterが検索エンジンにIndexされていないTweetがある。
（あるいは取得できないTweetがある）

③-RTオプテョンでリトイートを取得しないようになるが、ユーザーが「RTしてね」とかのRTが含まれるTweetも取得しなくなる。

④'lang'=>"jp"のオプションはTwitterが判断する(?)日本語のTweetしか取得しない

⑤Search APIはユーザーによらないため、同じハッシュタグで高い頻度で複数のユーザーがTweetされる可能性がある場合、
UserのTimelineからも同時に使用した方が良いかも（しかし、UserのTimelineからだと、
APIにハッシュタグを指定できないため、全Tweet（最新の最大200件？）を取得してから、フィルターする必要がある）

```php
require_once('./path/to/twitteroauth.php');

//twitterAppsで取得
$consumerKey        = CONSUMER_KEY; // https://apps.twitter.com から取得
$consumerSecret     = CONSUMER_SECRET;　// https://apps.twitter.com から取得
$accessToken        = ACCESS_TOKEN;　// https://apps.twitter.com から取得
$accessTokenSecret  = ACCESS_TOKEN_SECRET;　// https://apps.twitter.com から取得

$search_key = "#google -RT";　//検索キーワード, -RTはリトイートを除く

$options = array('q'=>$search_key, 'count'=>'100', 'lang'=>"jp", 'result_type' => 'recent');

$since_id = getMaxID(); //DBから現在の最大TweetIDを取得する処理
if ($since_id){
    $options['since_id'] = $since_id; //前回の最後に取得したツイートIDから
}
$twObj = new TwitterOAuth(
     $consumerKey, 
     $consumerSecret,
     $accessToken,
     $accessTokenSecret);

$json_data = $twObj->get(
    'search/tweets',
    $options
);

$statuses = null;
if ($json_data){
    $statuses = $json_data['statuses']; //ステータス情報取得
}

if ($statuses && is_array($statuses)) {
    $sts_cnt = count($statuses);
    // 一番古いデータからDBへ書き込む
    for ($i = $sts_cnt-1; $i >= 0; $i--) {
        $result = $statuses[$i];
        $has_media = true;
        $screen_name = $result['user']['screen_name'];
        $twitter_id = $result['user']['id_str'];
        
        //$cnt++;
        $tw_created_date = date('Y-m-d H:i:s', strtotime($result["created_at"]));
        $user_name      = $result['user']['name'];
        $tweet_id       = $result['id_str'];
        $profile_url    = $result['user']['profile_image_url'];
        $tweet_text     = $result['text'];

        $img_src = $short_url = $display_url = "";

        if (isset($result["entities"]['media'])){ //写真等がある場合、取得（ビデオリンクの場合、違う方法で取得可能）
            // 最初のメディアのみを取得する（全部取得できるように修正を)
            $img_src        = $result["entities"]['media'][0]['media_url'];
            $short_url      = $result["entities"]['media'][0]['url'];
            $display_url    = $result["entities"]['media'][0]['display_url'];
        }
        
        // DBへデータを書き込む処理
        writeToDatabase();
    }
}
```
cordova-plugin-statusbarの使い方。


####cordovaを使ってハイブリッドアプリを作る際、気になることが。


![スクリーンショット 2015-08-18 22.00.19.png](https://qiita-image-store.s3.amazonaws.com/0/75931/9e8e9eca-905a-b03b-8598-06eea6256759.png "スクリーンショット 2015-08-18 22.00.19.png")


そう。ステータスバー(キャリアとか充電とかのバー)とHTML5で書いたコンテンツが被ってること。見ずらいし気持ち悪いしどうにかしたい。


こんな課題を解決するpluginとして`cordova-plugin-statusbar`というものがある。
忘備録として書き残す。

##1. pluginの導入。
他のpluginの導入と同様に

```
~$ cordova plugin add cordova-plugin-statusbar
```
これでOK。一応確認してみると

```
~$ cordova plugin list                                                     
cordova-plugin-statusbar 1.0.1 "StatusBar"
cordova-plugin-whitelist 1.0.0 "Whitelist"
org.apache.cordova.console 0.2.13 "Console"
org.apache.cordova.device 0.3.0 "Device"

```
となってる。ちゃんとStatusBar入ってるね。

##2. 設定
config.xmlファイルにちょちょっと書き加えるだけでOK。

```config.xml
<preference name="StatusBarOverlaysWebView" value="false" />
<preference name="StatusBarBackgroundColor" value="#00FF00" />
```

こんな感じのコードをnameタグと同じインデントの高さで追加。
###StatusBarOverlaysWebView
「WebViewのコンテンツにステータスバーを被せるかどうか」を設定できる。被せるならvalue="true"、被せないならvalue="false"。今回、被せたくないのでvalue="false"。

###StatusBarBackgroundColor
「ステータスバーの背景色を何色にするか」を設定できる。
自分の好きな色をvalueに設定しよう。

⭐︎JSからStatusBarオブジェクトを通して設定することもできます。詳しくは本家で。




###変更後実行すると、以下のようになるはず。

![スクリーンショット 2015-08-18 21.59.42.png](https://qiita-image-store.s3.amazonaws.com/0/75931/9ad593d8-ade2-7c02-f8f4-d80935dc5ec8.png "スクリーンショット 2015-08-18 21.59.42.png")


うん、ちゃんと被ってない！すっきりですな。




##参考
[cordova-plugin-statusbar](https://github.com/apache/cordova-plugin-statusbar/)
PowerShellを使って, ADドメインにユーザを追加する


下記の記事で、Linuxのユーザ認証をADで行う設定を記載した.
http://qiita.com/rsakamot/items/6d4b6cbce7ac2aa6724a

で、ユーザを作る際, GUIで, がちゃがちゃするのはつらい.
数人だったらいいけど, 初期構築時には大量のユーザを登録することになることが多いと思う. 

そこでPowerShellを利用する.
個人的には「これがスクリプトかよ」と内心思っているが, 貧弱なbatより100倍マシであるし, 現実問題として, 他に選択肢がない.
ので, ADのユーザをPowerShellで追加する.
※AD用のコマンドレットはADインストール時に追加されているものとする.
※慣れると便利なものです. PowerShell.

正直なところWindowsのユーザ追加であれば, 下記のサイトで十分. というかすごく詳しく書いてくれている.
いろいろ参考にさせて頂いています.
http://codezine.jp/article/detail/6109

でも, UNIX用のユーザを追加するところはさすがに書かれていない.
ということで, スクリプトは下記のような感じ.
下記はNISサーバ機能が入っているとして, ```'msSFU30NisDomain'```の項目を設定しているが, これはなくてもOKです.

PowerShellでは`(バッククォート)で改行になるので注意.


```
# passwordの生成
# パスワードをインタラクティブに入れたい場合はここ
#$password = Read-Host "Password is" -AsSecureString

 
# ユーザを変数に
$user = "sakamoto"
$gid = "10000"
$uid = "10000"
$nisDomain = "saka"
 
# ユーザ追加
# UNIX属性になるのは-OtherAttributes
New-ADUser -name "$user" `
-Surname "坂本" `
-GivenName "龍馬" `
-Displayname "$user" `
-UserPrincipalName "$user@saka.example.com" `
-AccountPassword (ConvertTo-SecureString "Passw0rd" -AsPlainText -Force) `
-ChangePasswordAtLogon $True `
-Path "OU=01Users,DC=saka,DC=example,DC=com" `
-sAMAccountName $user `
-OtherAttributes `
@{'gidNumber'="$gid"; `
  'uidNumber'="$uid"; `
  'unixHomeDirectory'="/home/$user"; `
  'loginshell'="/bin/bash"; `
  'msSFU30NisDomain'="$nisDomain"} `
-Enabled $True

 
# グループにユーザを追加
$groups = "saka", "admin"
foreach($group in $groups) {
  Add-ADGroupMember $group $user
}
```

上記のようなスクリプトを自動生成するプログラムを作成して, それをドメコンで実行すれば, 一気にユーザは作成される.
たとえば、Program Filesを避ける

Unix系サーバで動かすプログラムの開発をWindows上で行う場合などには、Unix系で動くツール・ミドルウェアをWindowsに入れる必要が出てくることもあります。幸い、最近は「Windows用がない」ということも減ってはきています。それどころか、Windows用にインストーラまで用意してくれていることもあります。

# Program Filesの誘惑
もちろん、適切なフォルダにインストールしてくれる親切なインストーラもあります。ただ、ものによってはデフォルト設定で`c:\Program Files`をインストール先に指定しているものもあります。

もちろん、それでなんの問題もなく動くツールもあるとは思います。ただ、以下に2つ示すような、「抱え込まなくてもいい厄介事」を惹起してしまうケースもありますし、逆に個人マシンで使う分には「Program Filesにインストールするメリット」も特段あるわけではなさそうなので、基本的には別な場所に入れたほうがいいでしょう。

# 起きうるトラブル
## スペース入りディレクトリ
見ての通り、「Program Files」にはスペースが入っています。ツールによっては、スペースが入ったパスに入れると正常に動作しないものもあります[^1]。

もちろん、第一義的にはそれぞれのツールの**バグ**であることは間違いありません。ただ、Unix系でスペース入りのディレクトリがあまり多くないのか、うまく動かないツールは数多く遭遇します。そして、ツールを入れるディレクトリは比較的選択の自由がありますので、「スペースを含まないディレクトリにインストールする」という、バグを回避するために必要なコストは、バグを踏んでしまうリスクと比べれば、本当に微々たるものです。

## UACの介入
これはちょうど最近遭遇したケースですが、Windows用のRedisを、Program Files以下にインストールしていました。そして、Windowsではフォークがうまくできない加減でディスクへの保存に失敗して、MISCONFエラーを吐いていました。

特段保存を要するような用途ではなかったので、テキストエディタで設定ファイルを書き換えて、再起動したりもしましたが、依然として同じエラーが出続けます。エラーが出るまで数時間は動くので、エラーが出たら再起動するなどだましだまし使っていましたが、やっぱり不便なことには変わりありませんでした。

そんなある日のこと、ふと気づいて「管理者として実行」したテキストエディタで設定ファイルを見てみると、なんと**書き換わっていないまま**でした。そこで改めて保存機能を無効にすると、今まで悩まされていたエラーが、全く出なくなりました。

Program Files以下では、UACによって管理者権限のないプログラムによる書き込みが乗っ取られ、変更は別なところに保存されてしまいます。もちろん管理者実行で回避はできるのですが、最初から別な場所に入れておけばそんな心配もないわけです。


[^1]: データファイルをスペース入りのフォルダに作ったらうまく動かず、別な場所に移動させるはめになったこともあります。
Google Maps で kml データ表示（geoxml3 利用）


こんにちは。
Google Maps で kml データ表示してみました。普通は google.maps.KmlLayer 利用だと思いますが、geoxml3 を利用してローカルファイルを読み込んでみました。

下記表示例は "[KML Layers](https://developers.google.com/maps/documentation/javascript/examples/layer-kml)" (Google Maps JavaScript API) のデータを利用。
![kml.jpg](https://qiita-image-store.s3.amazonaws.com/0/54617/d7145327-8d80-a32c-6657-81c48ddec52f.jpeg)

```html
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<meta charset="utf-8">
<title>Reading KML Files with Google Maps</title>
<style type="text/css">
html, body { height: 100%; margin: 0; padding: 0;}
#map_canvas { height: 100%;}
.geoxml3_infowindow * {font-size: 90%; margin: 0}
</style>

<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></script>
<script type="text/javascript" src="http://geoxml3.googlecode.com/svn/branches/kmz/geoxml3.js"></script>

<script type="text/javascript">
var map = null;
var geoXml = null;
var par = {lon: 140.000, lat: 35.500, zoom: 10};

function gpos(obj) {
    return new google.maps.LatLng(obj['lat'], obj['lon']);
}

function initialize() {
	var maptype = google.maps.MapTypeId.ROADMAP;
	var mapOptions = {
		center: gpos(par),
		zoom: par['zoom'],
		mapTypeId: maptype,
		scaleControl: true,
	};
    var mapDiv = document.getElementById('map_canvas');
	map = new google.maps.Map(mapDiv, mapOptions);
 
	var infowindow = new google.maps.InfoWindow({});
	geoXml = new geoXML3.parser({
	                map: map,
	                infoWindow: infowindow,
	                singleInfoWindow: true,
	                zoom: true,
	            });
};

function readFiles(files) {
    for (var i = 0, file; file = files[i]; i++) {
        readKML(file);
    }
}

function readKML(inFile) {
    var reader = new FileReader();
    reader.onload=function(e){
        geoXml.parseKmlString(reader.result);
    };
    reader.readAsText(inFile, 'utf-8');
}

function handleFileSelect(evt) {
    readFiles(evt.target.files);
    document.getElementById('form').style.display = "none";
}

</script>
</head>
<body onload="initialize()">
  <form id="form" style="height:32px;background-color:#f0f0f0;"> &nbsp;
  <input type="file" id="file" name="file" title="Load local kml file" accept='.kml' />
  </form>
  <script>document.getElementById('file').addEventListener('change', handleFileSelect, false);</script>
  <div id="map_canvas"></div>
</body>
</html>
```
unity > EventSystem > ボタンを押したらToggleにフォーカスを移す > EventSystem.current.SetSelectedGameObject()を使う

```txt:動作確認
Unity 5.1.1-f1 on MacOS X 10.8.5
```

UI > Buttonを押した時、UI > Toggleにフォーカスを移す方法。
EventSystem.current.SetSelectedGameObject()を使う。

以下のスクリプトをButtonのOnClickに関連付ける。

```csharp:ButtonControl.cs
using UnityEngine;
using System.Collections;
using UnityEngine.EventSystems; // for EventSystem.XXX

public class ButtonControl : MonoBehaviour {

	public void OnClick() {
		Debug.Log ("clicked");

		GameObject go = GameObject.Find ("Toggle2");
		if (go) {
			EventSystem.current.SetSelectedGameObject (go);
		}
	}
}
```

以下はButtonをクリックした後の画像。青色の方がフォーカスが移っている。

![Scene_unity_-_150818-uiGrouping_-_PC__Mac___Linux_Standalone__Personal_.jpg](https://qiita-image-store.s3.amazonaws.com/0/32870/3393ae5b-2cfd-0980-abf1-9ef361a4ce1a.jpeg)
【機械学習超入門】chainerでサンプルコードを動かすまで

# 0. 前提条件
pyenvを用いてpythonのversionを管理しています。pyenvに関しては[こちら](http://qiita.com/1000ch/items/93841f76ea52551b6a97)を参考にしてください。本文で用いるpythonのversionは以下の通りです。

```py
python --version
>> Python 2.7.9 :: Anaconda 2.1.0 (x86_64)
```

# 1. 対象者
* 機械学習を初めて学ぶ方
* 機械学習のコードに触れてみたい方
* 機械学習を実際に動かしてみたい方

# 2. chainerのインストール
インストールは簡単です。
（詳しくは [chainer公式リポジトリ](https://github.com/pfnet/chainer)をご覧ください）
下記コマンドをターミナルで打ちます。

```py
pip install chainer
```
（ちなみにですが、python環境を整えるには[こちら](http://qiita.com/mekkoo/items/0102c571a098ea20b5eb)を参照ください）

画像処理を行う際にはGPU(Graphics Processing Unit)を用いることで高速演算を可能にします。
（機械学習とGPUについては[こちら](http://www.nvidia.co.jp/object/machine-learning-jp.html)が詳しいです）
GPUを用いるには、CUDAをインストールします（インストールしなくても問題はありません）。

```py
pip install chainer-cuda-deps
```
サンプルコードを動かすためには、[公式レポジトリ]
(https://github.com/pfnet/chainer)から git cloneしてください。

# 3. サンプルコードを動かしてみる
上述の[公式レポジトリ]
(https://github.com/pfnet/chainer)からサンプルコードをダウンロードします。chainer/examples/mnistのディレクトリにMNISTデータセットを用いたサンプルコードがあります。
MNISTデータセットとは、0 から 9 までの手書きの数字 70000 点を収録したデータセットです。

```py
python train_mnist.py
```
上記コマンドを該当ディレクトリで打つとサンプルコードが走ります。

早くサンプルコードの結果を見たい方は

```py
n_epoch = 20
```
上記のlearning_loopを減らすことをおすすめします。

# 4. おまけ：chainer解説サイトまとめ
* [chainerサンプルコードの解説サイト](http://qiita.com/kenmatsu4/items/7b8d24d4c5144a686412)
* [初心者が１からchainerのコードを書き始めるまで](http://sora-sakaki.hatenablog.com/entry/2015/07/16/195301)
* [chainerを用いたアニメ顏の深層学習](http://qiita.com/hogefugabar/items/312707a09d29632e7288)
* [chainerのサンプルコードまとめサイト](http://studylog.hateblo.jp/entry/2015/07/14/000635)
* [chainerで画像分類](http://hi-king.hatenablog.com/entry/2015/06/11/021144)
unity > EventSystem > UIのフォーカス変更には矢印キーを使う

```txt:動作確認
Unity 5.1.1-f1 on MacOS X 10.8.5
```

参考 http://wannabe-note.com/820

複数のUIコンポーネントを置いた時、フォーカスを変更するのは矢印キーを使うようだ。

![Scene_unity_-_150818-uiGrouping_-_PC__Mac___Linux_Standalone__Personal_.jpg](https://qiita-image-store.s3.amazonaws.com/0/32870/6326dbc0-8643-88c8-86df-321480131698.jpeg)

例えば上記の配置の場合、右矢印で右のToggleへ、下矢印でButtonへフォーカスが変わる。
フォーカスされているコンポーネントからの方向によるようだ。

Tabキーでフォーカスが移動していくような方法は(あるのかどうかも含めて)未調査。
Opsworks Tips


# Opsworks

障害対応のためにいろいろ試行錯誤したときに覚えたことをメモ

## Tips

## setup中のログをすぐみたい。
### ログイン
デフォルト設定のKey-pairでログインできる。
- user : ec2-user
- pass : 設定していたら。

### ログをみる

```
sudo tail -f /var/lib/aws/opsworks/chef/yyyy-MM-dd-hh-mm-ss-..log
```
## opsworks-agentが実行したときのコマンドを調べる

/var/log/aws/opsworks/opsworks-agent.process_command.logを参照する

## 手動でcookbooksを実行する

Berksfile.lockファイルのある場所（/opt/aws/opsworks/cuurent/merged-cookbooks/Berksfile.lock)で実行する

```
sudo /opt/aws/opsworks/current/bin/chef-client -j /var/lib/aws/opsworks/chef/2015-08-18-07-47-11-01.json -c /var/lib/aws/opsworks/client.stage2.rb -o hoge::default
```
- -j /var/lib/aws/opsworks/chef/の配下にあるjsonファイル（chef実行時の最終的な設定値が含まれている)
- -c /var/lib/aws/opsworks/client.stageX.rb 設定ファイル。　キャッシュの場所などいろんな設定値が書いてある。.ymlファイルが同じ階層にあり、読みやすい
- -o Run_command画面の、Recipes to executeに記述する書式とおなじ。カンマ区切りにすることで、複数のレシピを実行することができる。

## setup failedとなっているサーバに対してCookbooksを実行する方法

1. 左ペイン Stack > Run Command > Command Update Custom Cookbooksを選択する。
2. failedしたサーバを下のinstancesの中からえらびチェックし、実行。


## client.stage1やclient.stage2って何だろう（まだぼんやり）

#### client.stage1
- opsworksのcustom　cookbooksが実行される段階
- このステージが完了しないと、opsworksの設定が完了していない
- この時点では、Resourcesで指定したユーザの設定なども反映されない
- berkshelf

#### client.stage2
- ユーザが設定したcustom_cookbooksを実行される段階
- ここから、stacksettingなどで指定した設定値などが反映されてくる
- berkshelf管理下のレシピの実行もここ。
unity > EventSystem > First Selected > 開始時に選択されている

```txt:動作確認
Unity 5.1.1-f1 on MacOS X 10.8.5
```

参考
http://wannabe-note.com/820

HierarchyのEventSystemのInspectorを見ると Event System (Script)コンポーネントに「First Selected」という項目がある。
このFirst Selectedに UI > Toggleなどを関連づけすると開始時にそのToggleが選択された状態になる。

以下の画像で赤色になっている方が選択されたToggle.

![Scene_unity_-_150818-uiGrouping_-_PC__Mac___Linux_Standalone__Personal_.jpg](https://qiita-image-store.s3.amazonaws.com/0/32870/e65c94bb-1e52-b880-6888-e241f8289eda.jpeg)

ここでスペースやEnterを押すと選択された方のToggleのチェックをOFF/ONできる。
chef-zero導入

#目的
開発用にvagrantを使用してchef-zeroでchef-workstaionを構築する。
#環境
* Windows7 Professional
* Vagrant 1.7.2
* CentOS Linux release 7.0.1406 (Core) 
* Amazon Linux AMI release 2015.03

##イメージ
![image.jpg](https://qiita-image-store.s3.amazonaws.com/0/58788/147caf7b-bc51-9c6d-26ba-e9d57ceff2b3.jpeg)


#設定
##chef-zeroインストール
https://downloads.chef.io/chef-dk/

```
$ wget https://opscode-omnibus-packages.s3.amazonaws.com/el/6/x86_64/chefdk-0.3.5-1.x86_64.rpm
$ sudo rpm -Uvh chefdk-0.3.5-1.x86_64.rpm
$ sudo chef gem install knife-zero
```
##レポジトリ作成

```
$ chef generate repo chef-repo
$ cd chef-repo
```

##クックブック作成
`$ knife cookbook create nginx`

##レシピ作成
とりあえず、ノードにnginxをインストール。
`$nano ~/chef-repo/cookbooks/nginx/recipes/default.rb`

```~/chef-repo/cookbooks/nginx/recipes/default.rb
package "nginx" do
  action :install
end

service "nginx" do
  supports :status => true, :restart => true, :reload => true
  action [ :enable, :start ]
end
```

##ノード初期化
ノードにchefがインストールされ、workstationのnodeへ初期化したノードが定義される。
workstationで管理しやすいよう、`--node-name`で指定した文字列をnodenameに設定できる。
`$ sudo knife zero bootstrap ノードGIP|FQDN -x ec2-user --node-name node1 -i ~/.ssh/秘密鍵`

##レポジトリで使用するknife.rb作成
```~/chef-repo/knife.rb
#-z、--localモード
#ローカルモードでシェフクライアントを実行するために使用します。
local_mode true
chef_server_url   'http://Workstation-IP:8889'
node_name         'Workstation-nodename'
client_key        '~/.ssh/ノードに接続する際の秘密鍵'
```
##ノードにレシピ定義
`$ knife node run_list add node1 'recipe[nginx]'`

##ノードにレシピ適用
`$ sudo knife zero chef_client 'name:node1' -x ec2-user -i ~~/.ssh/秘密鍵`

##ノードにて確認
```
$ rpm -qa nginx $$ chef;ps aux | grep nginx
chef-11.18.12-1.el6.x86_64
nginx-1.6.2-1.23.amzn1.x86_64
root     28272  0.0  0.2 109516  2088 ?        Ss   11:17   0:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
nginx    28276  0.0  0.3 109936  3224 ?        S    11:17   0:00 nginx: worker process
ec2-user 28294  0.0  0.0 110404   856 pts/0    S+   11:22   0:00 grep nginx
```
![nginx.JPG](https://qiita-image-store.s3.amazonaws.com/0/58788/70db6d30-1d81-649c-fccc-cfd8ec290dd5.jpeg)
<hr>

##commit
```
>vagrant sandbox commit
[default] Committing the virtual machine...
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
```