OmniAICreator/Qiita-1.07M huggingface dataset:
Firebaseの新しいSDKを使いたい場合は、Cocoapodsの1.0.0以上を利用する

## TL;DR

先日公開されたFirebaseの新しいSDKを使いたい場合は、Cocoapodsの1.0.0以上を利用してSDKの導入を行う。
ロギング時のAOPライブラリでAspectsを利用している場合に、エラーが出る場合はMOAspectに乗り換えよう。

## 悩んだこと

Cocoapodsのバージョン0.39.0で新しくなったFirebaseのSDKをインストールしようとすると、`Segmentation fault: 11`というエラーが発生してビルドができない。`FIR`で始まるクラスがコード上に出現しなければ（コメントアウトなどをして）ビルドが成功するので、FirebaseのSDKのインストール方法に問題がありそうな感じだった。

```
  1. While loading members for 'FIRDatabaseReference' at <invalid loc>
  2. While deserializing decl #101 (PATTERN_BINDING_DECL)
  3. While deserializing decl #2 (VAR_DECL)
```

## 解決策

StackOverflowに問題とその解決策があり、Cocoapodsのバージョンが古いことが問題のようだった。
http://stackoverflow.com/questions/37347327/upgraded-firebase-now-getting-swift-compile-error

アップデートしたら無事にコンパイルが成功した。
そんな一日。

## おまけ

Cocoapodsの1.0.0を利用すると、スクリーン表示をGoogleAnalyticsに送信する際に利用しているAspects([https://github.com/steipete/Aspects](https://github.com/steipete/Aspects))のインポート時に、エラーが出るようになってしまった。

<img width="647" alt="スクリーンショット 2016-05-23 16.12.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/20406/b492a0dc-213c-6429-586d-a01fd440ec66.png">

作っているアプリではGAへの送信のためだけにAOPを利用しているので、最悪各ViewControllerの`viewWillAppear(_:)`においてGAへの送信処理を書けば良いのだが気持よく無いので、代替ライブラリがないか、~~あるいはAspectsをCocoapodsを1.0.0で利用できるように出来ないか~~調査することにした。

### iOSでAOPを行えるライブラリ

- https://github.com/steipete/Aspects
    - Star数が3000超え
    - 幾つかのログ送信のライブラリで依存ライブラリとして使われているよう
- https://github.com/MO-AI/MOAspects
    - http://qiita.com/__moai/items/efcd43016b9320cf6d63
    - Swiftからも特にストレス無く使える

簡単に探した所、上記2つ。

### 結論

MOAspectsを利用したらすんなりいけた。
UIViewControllerの`viewWillAppear(_:)`のAfterにHookを設定し、ScreenTrackableというプロトコルに準拠したViewControllerの場合のみ、そのScreenTrackableプロトコルのtrackingというメソッドを実行するようになっている。

```swift
func setupHook() {
    MOAspects.hookInstanceMethodForClass(UIViewController.self,
        selector: #selector(UIViewController.viewWillAppear(_:)),
        position: .After,
        range: MOAspectsHookRangeAll) { (instance: AnyObject!) -> Void in
            if let instance = instance as? UIViewController {
                if let viewController = instance as? ScreenTrackable {
                    viewController.tracking()
                }
            }
    }
}
```

ちなみにScreenTrackableプロトコルはこんな感じ。

```swift:UIViewController+ScreenTrackable.swift
protocol ScreenTrackable {
    func tracking()
}

extension ScreenTrackable where Self: UIViewController {
    func tracking() {
        let sceneName = self.sceneName() // クラス名からGAに送信するファイル名を取得する(※1)
        Event.Screen(sceneName).send() // GAに送信
    }
}
```

クラス名からGAに送信するファイル名を取得する部分(※1)は、http://qiita.com/tattn/items/647e094936287a6bd2d3 などに方法が書かれている。更に、そのままクラス名を送信するのではなく、対応した日本語のスクリーン名に直して送信している。こうすることでGAで格段に見易くなる。

<img width="534" alt="スクリーンショット 2016-05-23 16.24.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/20406/76db29a2-176b-374b-7468-67513d25d30a.png">
ofxPostGlitchかからないときの備忘録


`openFrameworks`の`addon`の`ofxPostGlitch`
https://github.com/maxillacult/ofxPostGlitch
が、かからないなあと思ったときのメモ

```cpp
void Sample::draw(JsonDataAgent &agent,int arg){

    ofPushMatrix();
    ofTranslate(0,50);
    graphUIView.draw(arg);
    ofPopMatrix();

    barGraphUIView.draw(arg);

    glPushMatrix();
    glRotatef(180, 1, 0, 0);

    ofNoFill();
    ofSetColor(graphBackColor);
    ofDrawCircle(0, 0, 100);

    ofFill();//<- これつけないとglitchかからない
    FontManager::drawSmallWString(agent.name, 10, 20);
    FontManager::drawSmallString(ofToString(agent.id), 10, 30);
    FontManager::drawSmallString(agent.gender, 10, 50);
    FontManager::drawSmallString(agent.locale, 10, 70);
    FontManager::drawSmallString(agent.updated_time, 10, 90);

    glPopMatrix();
}
```

みたいなのがあったとき、`ofFill()`がなく、`ofNoFill()`のまま、fontを描画しようとする`draw()`を
`ofFbo`に描画し、glitchをかけた(`generateFx()`)ものの
glitchがかからずチカチカ点灯する問題があった。

ちなみにこのときの`FontManager`は以下のような感じだった

> 追記 2016/05/23/16:39
> `ofDrawBimapString()`でも同様の結果になった

```cpp
#include "FontManager.hpp"

ofxTrueTypeFontUL2 FontManager::mfont;
ofxTrueTypeFontUL2 FontManager::msmallfont;
ofxTrueTypeFontUL2 FontManager::mbigfont;

void FontManager::init(){
    loadFont("foo.ttf", 50);
    loadSmallFont("hoge.ttf", 10);
}

void FontManager::loadFont(string arg, int size){
    mfont.loadFont(arg, size);
}

void FontManager::drawString(string arg ,float x, float y){
    mfont.drawString(arg, x, y);
}

void FontManager::loadSmallFont(string arg, int size){
    msmallfont.loadFont(arg, size);
}

void FontManager::drawSmallWString(wstring arg ,float x, float y){
    msmallfont.drawString(arg, x, y);
}

void FontManager::drawSmallString(string arg ,float x, float y){
    msmallfont.drawString(arg, x, y);
}

void FontManager::loadBigFont(string arg, int size){
    mbigfont.loadFont(arg, size);
}

void FontManager::drawBigString(string arg ,float x, float y){
    mbigfont.drawString(arg, x, y);
}
```

個人的なメモですが、原因がいまいちわかっていないので、分かる方教えていただけると嬉しいです。

追記
おそらくfbo.drawのさいにofNoFill()のまま呼び出されただけでfontとか関係ないかも
gsutil | ファイルをアップロード / ダウンロードする

どちらも cp コマンドでおこなう。

## アップロードする場合

「ローカルパス」 → 「gcs のパス」の順で書く。

`gsutil cp example.log gs://example_bucket/`

## ダウンロードする場合

「gcs のパス」 → 「ローカルパス」の順で書く。

`gsutil cp example.log ./`


# 環境

- gsutil version: 4.19



<!-- Update From Qiita API -->

# チャットメンバー募集


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

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


# メンター受付


https://menta.work/user/5694

<!-- Update From Qiita API -->
No resource found that matches the given name (at 'drawable' with value '@drawable/abc_textfield_search_activated_mtrl_alpha') というエラーが出てしまったとき。

'@drawable/abc_textfield_search_activated_mtrl_alpha'など無い！とエラーが出てしまった時の対処法。

パスが長すぎる可能性があります。
プロジェクトルートのフォルダ名を短くしてみてください。

----------------------------------------------------
"No resource found that matches the given name (at 'drawable' with value '@drawable/abc_textfield_search_activated_mtrl_alpha') "

When you occurred error above on Android Studio. 

It might be having too long path name.
Try to rename the project folder into shorter name.
gsutil | 新しいバケットを作る

こんな感じ。

`gsutil mb gs://bucket_name`

ちなみに mb は Make Buckets の略。

# 環境

- gsutil version: 4.19



<!-- Update From Qiita API -->

# チャットメンバー募集


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

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


# メンター受付


https://menta.work/user/5694

<!-- Update From Qiita API -->
ローカル開発環境の Web サイトにスマホからアクセスする方法 (Vagrant もOK)

【環境】
OS X 10.11.4
Charles 3.11.4
iOS 9.3

✨ この記事では、Mac で起動している Vagrant サーバの Web サイトに iPhone からアクセスするための方法を紹介します。Vagrant を使用せずに、Mac のローカルホストにスマホから接続することもできます。

# 前提
* Mac と iPhone が同一 Wi-Fi 上でネットワーク接続されていること

# 準備
Charles をダウンロードします。
以下のサイトにアクセスしてDOWNLOADボタンを押して、お使いの環境に合わせてダウンロードしてください。
[Charles](http://www.charlesproxy.com/)

ダウンロードが完了したら Charles を起動します。初回に何回かダイアログが出ますが、すべて肯定するボタンを押していけばOKです。

# Mac 側の設定
1. Wi-Fi に接続します。

2. Charles の画面上部のメニューバーから `Proxy` -> `Proxy Settings...` を選び、HTTP Proxy 欄の Port を確認します。デフォルトでは8888になっていますが、変更したい場合は他と競合しないようなポート (1024〜65535) を各自で設定してください。
![http_proxy_settings_charles.png](https://qiita-image-store.s3.amazonaws.com/0/113895/0dd5e120-2225-285d-ce88-881f0f023e83.png)

3. Mac の IP アドレスを確認します。`システム環境設定` アプリを起動し、`ネットワーク`をクリックします。Wi-Fi タブに Mac の IP アドレスが書かれているのでそれをメモします。
![ip_check.png](https://qiita-image-store.s3.amazonaws.com/0/113895/723f565f-887f-79e7-7039-beee87071bd3.png)

# iPhone 側の設定
1. Mac と同じく Wi-Fi に接続します。接続する Wi-Fi は、**Mac と同じでなければいけません** 。

2. Wi-Fi の接続ができていれば`設定`アプリの `Wi-Fi`タブに接続済みの Wi-Fi のネットワーク名が表示されているはずです。その欄の右端にある `i` の丸いマークをタップするとネットワークの詳細画面が表示されます。詳細画面の一番下に `HTTPプロキシ` という項目があり、デフォルトでは「オフ」になっているので「手動」に変更します。すると入力項目が出てくるので、「サーバ」に先ほど確認した Mac の IP アドレスを入力し、「ポート」に Charles で設定したポート番号 (デフォルト: 8888) を入力します。
![http_proxy_settings_ios.png](https://qiita-image-store.s3.amazonaws.com/0/113895/48e105a1-e63e-37a8-8fd3-f4ef20830ca6.png)

⚠️ 画像ではポートが8888になっていますが、Charles でポートを変更した場合はそのポート番号を入力してください。

これで設定は完了です。

# 実際に接続してみる
iPhone で Safari を起動してください。適当に何かのサイトを開きます。すると Mac 側の Charles の画面で警告のようなダイアログが表示されるはずです。`Deny` と `Allow` というボタンが表示されているので、Allow をクリックします。これで iPhone のプロキシサーバとして Mac が設定されました。あとは Mac (Vagrant) で設定しているローカルサーバの IP アドレス (192.168.33.10 のような形式) を iPhone の Safari で入力すれば接続できます！

# 問題と解決
Q. iPhone でサイトにアクセスしても Charles で確認ダイアログが表示されない
A. IP アドレスとポートの設定が正しいかもう一度確認してみてください。Mac の IP アドレスを確認する方法は色々ありますが、上記の説明通り `システム環境設定` -> `ネットワーク` から確認するのが一番確実です。Charles のメニューバーにある `Help` -> `Local IP Address...`から確認する方法もありますが、ここに表示されているのはプライベートネットワークアドレスの可能性があるので、正しく設定できないことがあります。

Q. iOS の Chrome から接続できない、Safari ではできる
A. Chrome ではセキュリティ上、ローカルサーバのサイトにアクセスできないようになっているようです。Safari を使用してください。

Q. Charles が突然止まってしまう、しばらく放置すると警告が出る
A. Charles は有料 ($50, 2016/05/23 現在) です。無料ライセンスでも使用することはできますが、30分以上経過すると警告が出て止まってしまいます。警告が出た場合は一旦 Charles を終了してもう一度起動すれば再び使えるようになります。それが面倒な方は[購入ページ](http://www.charlesproxy.com/buy/)から有料ライセンスを取得してください。また、さっきまで接続できていたのに急に接続できなくなったという場合はこれが原因かもしれません。Charles の画面を確認してみてください。

Q. 前は接続できたのに、Wi-Fi に再接続したらできなくなった
A. これはぼくも悩まされています。設定は間違っていないはずなのに接続できないことがあります。iPhone で設定した HTTP プロキシを一旦オフにして (念のため Wi-Fi も再接続して) 通常のサイトに接続してみてOKであればもう一度プロキシの設定をして接続するとうまくいくことがあります。Charles の再起動で治ることもあります。

# 参考
[バーチャルホストで設定したローカル環境をスマホの実機から確認する方法](http://qiita.com/komeda/items/90e2ac07a8b1d5d1d44b)

[通信系のデバッグには Charles が便利](http://qiita.com/usagimaru/items/d340e87da98e62f99b60)

[俺的フロントエンドエンジニア三種の神器に認定したCharlesについて 〜その2〜 インストールと設定](http://qiita.com/dayoshix/items/d02e46b033b8f7d9f471)
Postgre SQL用　SQLメモ

# はじめに
PostgreSQLについて調べたりしたことのメモです。

# Timestamp型、Date型関連

```sql:sample.sql
--現在日時の取得
select current_timestamp;

--現在日付の取得
select current_date;

--現在時刻の取得
select current_time;

--Date型からTimestamp型への変換
select to_timestamp(to_char(current_date, 'YYYY-MM-DD'), 'YYYY-MM-DD hh:mm:ss');

--日時の加算
select current_timestamp + '1 hours 40 minutes';

--日時の減算
select current_timestamp + '-5 days';

--現在月の１日（ついたち）を取得
select date_trunc('month', current_timestamp);

--現在月の末日を取得
select date_trunc('month', current_timestamp) + '1 months -1 seconds';
```

### 解説のような何か
current_xxxはSELECT文内でそのまま使用可能。

#### Date型⇒Timestamp型の変換について

1. Date型を文字列型に変換
2. 変換した文字列をTimestamp型に変換


#### 日時の加減算について

* Timestamp型の値に「 + ’値 単位’」を付記する(上記ソース参照）
* 値の前に半角マイナス（-）を付けると減算する
* 単位はyears, months, days, hours, minutes, seconds

#### 1日と末日について

* date_trunc()で第1引数の単位未満を切捨てる（上記ソースでは「日」以下を切捨てて、1日の00：00：00となる）
* 末日で-1 secondsとすることで、月末の23:59:59を取得できる。-1 daysとすると00:00:00を取得するのでwebシステム開発などで注意する

# 文字列型

## 文字列結合
```sql:sample.sql
select 'String1' || 'String2';
```
### 解説のような何か
2つの文字列を「||」でつなぐ
Google Play Services 9.0.0 へのアップデート手順

Google Play Services 9.0.0 の内容は[このブログ記事](http://android-developers.blogspot.jp/2016/05/google-play-services-90-updates.html)にありますが、一方でアップデートの手順は少し複雑です。公式のブログ記事にもドキュメントにも、アップデートの手順について触れているものは無いようですので、ここに纏めておきます。

# `dependencies` の更新

まずは`dependencies`を更新します。最新は 9.0.0 です。SDK が正しくセットアップされていれば、AndroidStudio が警告を出してくれるはずです。

```groovy:module/build.gradle
dependencies {
  compile 'com.google.android.gms:play-services-fitness:9.0.0'
  // ... 依存している play-services-xxx をすべて 9.0.0 にする
}
```

ただしこれを行っただけでは、ビルド時に以下のようなエラーが出る事があります。

```
Error:Failed to resolve: com.google.android.gms:play-services-measurement:9.0.0 
```

この場合次の手順を実行します。

# `classpath`の更新

プロジェクトのトップレベルにある`build.gradle`の、ビルドスクリプトの依存関係を以下のように更新します。

```groovy:build.gradle

buildscript {
  dependencies {
    // 3.0.0 が出ているので更新する
    classpath 'com.google.gms:google-services:3.0.0'
  }
}
```

この状態でビルドすると、エラーメッセージが以下のように変化します。

```
Missing api_key/current_key object
```

# 新しい`google-services.json`を配置する

[このページ](https://developers.google.com/cloud-messaging/android/client#get-config)から、新しい`google-services.json`を発行し、アプリケーションのモジュール配下に設置します。

このとき、GCM は必ず有効にしておきます。
【SQLPLUS】 スクリプトで前営業日日付を取得する

初投稿です。

昔、
「処理日当日から１日ずつ遡って前営業日を取得し、
　その日からの明細を取得して処理を行う」
という機能を作ったコトがあったので、前営業日まで遡るためのバッチを備忘録として記載します。


###◆バッチ全文

```bat:example.bat
SET YY=%DATE:~0,4%
SET MM=%DATE:~5,2%
SET DD=%DATE:~8,2% 
SET TODATE=%YY%%MM%%DD%

rem DBに非営業日として登録されている場合、ここに戻る。
rem --> １日遡って非営業日として登録されているかを判定
:GETYSD

rem うるう年判定あり
SET /A DD=1%DD%-101
SET DD=00%DD%
SET DD=%DD:~-2%
SET /A YMOD=1%YY% %% 4
IF %DD%==00 (
IF %MM%==01 (SET MM=12&& SET DD=31&& SET /A YY=1%YY%-10001)
IF %MM%==02 (SET MM=01&& SET DD=31)
IF %MM%==03 (SET MM=02&& SET DD=28&& IF %YMOD%==0 (SET DD=29))
IF %MM%==04 (SET MM=03&& SET DD=31)
IF %MM%==05 (SET MM=04&& SET DD=30)
IF %MM%==06 (SET MM=05&& SET DD=31)
IF %MM%==07 (SET MM=06&& SET DD=30)
IF %MM%==08 (SET MM=07&& SET DD=31)
IF %MM%==09 (SET MM=08&& SET DD=31)
IF %MM%==10 (SET MM=09&& SET DD=30)
IF %MM%==11 (SET MM=10&& SET DD=31)
IF %MM%==12 (SET MM=11&& SET DD=30)
)
SET FROMDATE=%YY%%MM%%DD%

SQLPLUS (非営業日を登録したテーブルを"FROMDATE"で検索する処理)

rem ERRORLEVEL = 0 --> 非営業日
IF NOT %ERRORLEVEL% == 0 (
   GOTO :GETYSD
)
```

###◆問題点・課題
DBに非営業日を手作業で登録しておく必要がある。
バッチ処理として完全自動化できていないので、
非営業日情報の取得・登録をどうにかして自動化できないか、が課題。

具体的には、新しく祝日として制定された「海の日」や、
大晦日は非営業日として扱う(カレンダー上での"平日"の扱い)、など。
aws-cliはあるがjqがない場合につかえる jp.py 

#はじめに

まれにですが、[aws-cli](https://aws.amazon.com/jp/cli/)はあるのにjqが使えないという環境があります。 jqをいれればよいではないかという指摘はもっともなのですが、そうもいかない場合があるので、そんなときに使えるjp.pyを説明します。

[JAWSUG CLI支部](https://jawsug-cli.doorkeeper.jp/) のテキストで知りました。

# JMESPathとjp.py について

JSON用のクエリ言語 [JMESPath](http://jmespath.org/)のpython実装がjp.pyです。
JMESPathは aws-cliの query オプションでも利用できます。
jp.pyはaws-cliをインストールすると一緒にインストールされ、かつ、単体のコマンドで実行可能な点が嬉しいです。
JMESPathについては [チュートリアル(英語)](http://jmespath.org/tutorial.html) も参考になります。
jqと目的は一緒ですが、言語が違います。

# 使い方

aws-cliで取得したインスタンス一覧から、jp.pyでインスタンスIDを取得します。

```
$ aws --region ap-northeast-1 ec2 describe-instances |  jp.py 'Reservations[].Instances[].InstanceId'
[
    "i-297dXXXX",
    "i-c0e2XXXX",
    "i-02965fbeXXXXXXX"
]
```
jp.py --help みればわかるとおりシンプルです。

```
$ jp.py --help
usage: jp.py [-h] [-f FILENAME] [--ast] expression

positional arguments:
  expression

optional arguments:
  -h, --help            show this help message and exit
  -f FILENAME, --filename FILENAME
                        The filename containing the input data. If a filename
                        is not given then data is read from stdin.
  --ast                 Pretty print the AST, do not search the data.
```

# jp.py の悪い点

ググらビリティが低すぎる。。。。 

# 参考

以下、とても参考になりました。ありがとうございます。

[【個人メモ】JSONのパースにjmespathを使ってみよう](http://qiita.com/futoase/items/320f408ae1cfff6dd6da)
[aws-cli で使える –query = jmespath をガッツリ使い込む](https://blog.cloudpack.jp/2015/02/20/use-query-jmespath-that-parameter-of-aws-cli-usefully/)
[Python版AWS CLI 1.3の強化されたqueryオプションを使いこなすスニペット4つ](http://dev.classmethod.jp/cloud/awscli-enhanced-query-opt-snipets/)
WordPressのTwentyFifteenで投稿内容を選択禁止（コピペ防止）にする方法

\wp-content\themes\twentyfifteen\content.php
の
articleタグにクラスを適用し、下記スタイルを指定する。
http://qiita.com/kenichiro-yamato/items/c0c8666ebc69d053b7d5
JSF2.2 で DOCTYPE が書いたとおりにならない

# 背景
JSF2.2 でFaceletsに記述した通りにDOCTYPEがならない。
DOCTYPEが必ずHTML5のものになってしまう

```xml
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
```

って書いても

```html
<!DOCTYPE html>
```

になってしまう。

# 原因
仕様でした。
http://download.oracle.com/otndocs/jcp/jsf-2_2-fr-eval-spec/index.html
詳しくは1.1.1.1参照

# 対策
パススルー(記述したとおり)にするには、指定しないといけなさそうです。

```e.g.
<?xml version="1.0" encoding="UTF-8"?>
<faces-config
    xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-facesconfig_2_2.xsd"
    version="2.2">
    <faces-config-extension>
        <facelets-processing>
            <file-extension>.xhtml</file-extension>
            <process-as>xhtml</process-as>
        </facelets-processing>
    </faces-config-extension>
</faces-config>
```
特定の文字列をブラウザ上で選択できなくする方法（コピペ防止）

下記のように、選択させたくない領域にスタイルを指定する。

    <div class="hoge">コピペさせたくない文章</div>

	<style>
		.hoge{
			user-select: none;
			-moz-user-select: none;
			-webkit-user-select: none;
			-ms-user-select: none;
			unselectable="on"
			onSelectStart="return false;"
		}
	</style>
Unityで「There are 2 audio listeners in the scene.」というメッセージが表示された場合の対応

#There are 2 audio listeners in the scene.
Unityのサンプルアプリを作っていたらいつのまにか
`There are 2 audio listeners in the scene. Please ensure there is always exactly one audio listener in the scene.`
というメッセージがログに表示されていた。

どうやら「Scene内にAudio Listenerが2つ以上あるよ！」と言われているようだ。

#対応
GameObjectにCameraを追加した際にAudio Listenerもくっついていた模様。
Main Camera以外のCameraに入っていたAudio Listenerのチェックを外した。
<img width="492" alt="スクリーンショット 2016-05-23 15.02.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/6380/47b383cf-726d-d435-174a-9547611a37bc.png">

これで警告メッセージが表示されなくなった。
PlayframeworkでFixieを使う


流行に乗って、Line botをPlayframework on Herokuで作ったのでメモ。

ここでは、Play WS APIを用い、Fixieのセットアップは済んだものとして進めます。

# JVMのシステムパラメータでPROXYを指定する方法
## procfileを変更
以下のパラメータを追加する。実際の値は適宜変更のこと。

|パラメータ|値|
|:-----------|:------------|
|http.proxyHost|***xxx***.usefixie.com |
|http.proxyPort|80|
|http.proxyUser|fixie|
|http.proxyPassword|***xxxxx***|


## Proxy-Authorizationヘッダをセットする

```scala
def example(implicit ws:WSClient) {
	val encodedAuth = new BASE64Encoder().encode(new URL(System.getenv("FIXIE_URL")).getUserInfo.getBytes())
	
	val request = ws.url(LINE_API_URL).withHeaders("Proxy-Authorization" -> s"Basic $encodedAuth")
	....
}
```

これでFixie経由でリクエストが飛ぶようになりますが、これだとすべてのリクエストがFixie経由になってしまいます。

Fixieのtricycleプランは、100MB/月・500リクエスト/月の制限があるので、無駄に使いたくないですね。

同じように`http.nonProxyHosts`を指定すればいいですが、Line以外全部登録するとかだるい。


# WSProxyServerを使う

```scala
def example(implicit ws:WSClient) {
	val encodedAuth = new BASE64Encoder().encode(new URL(System.getenv("FIXIE_URL")).getUserInfo.getBytes())
	
	ws.url(LINE_API_URL)
		.withHeaders("Proxy-Authorization" -> s"Basic $encodedAuth")
		.withProxyServer(
			DefaultWSProxyServer(
				host = "xxx.usefixie.com", 
				port = 80, 
				principal = Some("fixie"), 
				password = Some("xxxxx")
			)
		)

....
}
```

こうすることで、`.withProxyServer`したリクエストのみPROXY経由になります。Procfileのパラメータは消しておきましょう。
Ansible 2.1

# 新機能

## ansible.cfg

### **display_args_to_stdout**（デフォルト＝False）
True にするとPlay実行時のTASKヘッダに引数もついた形で出力されるようになる。


False

```shell-session
TASK [docker : Copy docker repo] ***********************************************
```

True

```shell-session
TASK [docker : Copy docker repo dest=/etc/yum.repos.d/docker.repo, src=files/docker.repo, group=root, mode=0644, owner=root] ***
```
Bluemixでデータ分析！「dashDB」：大量データロードその２　ーdb2クライアントからLOADコマンド

**もっと簡単にデータロード**しよー、っていう話を今日は書きます。

dashDBへ大きいファイルをロードするケースとして先日moveToCloudというスクリプトを利用する方法をチャレンジしてみましたが、S3とかのアカウント持ってるときは楽ちんですが、そうではない場合は・・・です。
http://qiita.com/azzeten/items/549be71e7317c34ea57b

でも、ブラウザからファイルを選んで頑張る、というのも、楽ちんである一方でちょっと手作業が気になる（ブラウザのセッション切れたら悲しくなりそう）です。
http://qiita.com/azzeten/items/d10fa47d115093cffef8

なので今回は**db2コマンドを使ってdashDBへデータロードをする**ことにチャレンジしたいと思います。これでやればスクリプト化もできるので、ある程度は楽ちんかなと思います。

## 前提
db2コマンドでdashDBへ接続できるようになっていることを確認してください（db2っぽく言うと、「catalogしておいてください」）。
簡単にコマンドを紹介しておきます。詳細は以下URLご参照（Windows限定の話になってますが、Unixでも一緒です）。
http://qiita.com/azzeten/items/554552a1150da6607d35

```bash
$ db2 catalog tcpip node node1 remote ホスト名 server 50000
$ db2 catalog database bludb as dash1 at node node1
$ db2 connect to dash1 user ユーザ名 using パスワード
```

## db2コマンドでロード

ロードする前に事前にテーブル定義は必要です。

```bash:テーブル定義がされていることを確認
$ db2 "select * from load_table"

SDATE SHCODE   SCODE CUST_CODE            RNO           RECEIPT_SUBNO AMOUNT
---------- ----------- ----------- -------------------- -------------------- ------------- --------------------

  0 レコードが選択されました。
```

以下loadコマンドでロード実行します。ファイルのパス名は絶対パスにする必要があるようです。

```bash:loadコマンドの例
$ db2 "load client from /home/〜パス名〜/meisai.csv of del INSERT INTO LOAD_TABLE"

〜中略〜

SQL3515W  ユーティリティーは、"05/23/2016 03:44:01.678914" に
"BUILD" フェーズを完了しました。


読み込まれた行数        = 14
スキップされた行数      = 0
ロードされた行数        = 14
拒否された行数          = 0
削除された行数          = 0
コミットされた行数      = 14
```

内容を確認します。

```bash:loadコマンドの例
$ db2 "select * from load_table"

SDATE SHCODE   SCODE CUST_CODE            RNO           RECEIPT_SUBNO AMOUNT
---------- ----------- ----------- -------------------- -------------------- ------------- --------------------
2013-07-01       10000           1          10000000483              1518545             1                  58
2013-07-01       10000           1          10000000481              8190             5                 39342
2013-07-01       10000           1          10000000489             10210             3                   6
（以下省略）
```
NSOutlineView 開閉時の挙動を比較してみる

NSOutlineView には標準で幾つかのビヘイビアが用意されていますが、それぞれで挙動がどう異なるのかを比較してみました。

# ハイライトスタイルについて

NSTableView (NSOutlineView) の全体的な見た目やクリック時のハイライトの色などをあらかじめ OS が定義しています。これを利用することで Mac アプリでよくある見た目のリストを簡単に再現することができます。ハイライトスタイルは Interface Builder でも指定することができます。

![](https://qiita-image-store.s3.amazonaws.com/0/3603/8c59a328-f31b-fb9e-cca2-c8d534910f03.png)

コードでは `NSTableViewSelectionHighlightStyle` として enum が定義されています。

```swift:NSTableView
enum NSTableViewSelectionHighlightStyle : Int {
    case None
    case Regular
    case SourceList
}
```

## None
None スタイルは Regular のハイライト色が無い版のようなものです。

## Regular
Regular スタイルはよくある通常のアウトラインビューです。
<img width="422" alt="Capture 2016-05-23 00.36.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/3603/49fb0a5c-b033-f3ff-4755-3a8cd334f32b.png">

なお、画像のように行ごとに縞模様にするには別途 `Alternating Rows` にチェックを入れます。

```swift:NSTableView
var usesAlternatingRowBackgroundColors: Bool
```

## Source List
Finder や iTunes のサイドバーで使われているスタイルです。グループの展開のされ方が特徴的です。
<img width="190" alt="Capture 2016-05-23 00.31.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/3603/49f458dc-d53a-3637-c559-891a449d77ca.png">

# Floats Group Rows

グループ行を浮かせるかどうかの設定です。View-Based テーブルビュー（NSCell ではなく NSTableCellView）で有効です。

```swift:NSTableView
var floatsGroupRows: Bool
```

# それぞれの設定で比較

今回はカラム数1（NSTableColumn が一つ）で階層構造のデータを表示する NSOutlineView を実装して比較してみました。

## 1: ハイライトスタイル: `Regular` / Floats Group Rows: `false`
![1.gif](https://qiita-image-store.s3.amazonaws.com/0/3603/930d94d7-e4a9-78c7-4dcc-989bfcbd43de.gif)

## 2: ハイライトスタイル: `Regular` / Floats Group Rows: `true`
![2.gif](https://qiita-image-store.s3.amazonaws.com/0/3603/2c70fa78-8ba6-4483-e485-e5dd2548bd13.gif)

## 3: ハイライトスタイル: `SourceList` / Floats Group Rows: `false`
![3.gif](https://qiita-image-store.s3.amazonaws.com/0/3603/d552b35a-68ac-e8a5-81ef-417d5b0e7a33.gif)

## 4: ハイライトスタイル: `SourceList` / Floats Group Rows: `true`
![4.gif](https://qiita-image-store.s3.amazonaws.com/0/3603/248e3ac5-cf7f-4e18-63fe-596dd01560e4.gif)

ハイライトスタイル: `Regular` ではグループセルを浮かせると iOS の UITableView ヘッダーのような上に吸着する挙動を実現することができます。簡単にオンオフできるのが良いですね。

4 の条件ではグループセルの部分が微妙にずれてしまう現象に見舞われました。これはバグだと思われるので、ハイライトスタイル: `SourceList` の時はグループセルは浮かせない方が良さそうです。（そもそも浮かせるメリットも無い）

# ソースリストの HIG

ソースリスト、つまりサイドバーの具体的な使用方法が HIG で指南されています。
https://developer.apple.com/library/mac/documentation/UserExperience/Conceptual/OSXHIGuidelines/WindowSourceListDrawer.html

- （ファイルなどの）ナビゲーションが主目的である時に採用する場合
    - ハライトスタイル: `SourceList`
    - ファイルシステムを抽象化してナビゲートを補助する（例：iTunes）
    - この時、背景は半透明ブラー効果が適用される
    - 単一選択モードにする
- 階層構造を簡略化する
    - 二階層以上にすることを避ける
    - 複雑化する場合は別途 NSBrowser（Finder でいうカラム表示）を検討する
- 単一ウインドウアプリでモード選択などに使用する場合
    - ハイライトスタイル: `Regular`
    - 直接ファイルシステムとは関わりがない（アプリ内のオブジェクトを選択するような）
    - 背景は透明ブラーにはならない
- ソースリストの操作をするためのボタンは、リストの下（ウインドウの下端）に [Gradient Button](https://developer.apple.com/library/mac/documentation/UserExperience/Conceptual/OSXHIGuidelines/ControlsButtons.html#//apple_ref/doc/uid/20000957-CH48-SW8) を配置する
- ソースリストが主要な機能を提供しない場合は、Pop Over に収めて必要なときにのみ表示できるようにすることを検討する
ApacheでユーザーディレクトリでCGIが動かない際の対処memo

地味にハマって動揺したので、備忘録的に残します。

## httpd.conf を編集する

````
vi /etc/httpd/conf/httpd.conf
````

設定ファイル内の以下を編集。

````

# ユーザーディレクトリを有効にする為に、先頭に#を追加
#UserDir disabled

# ユーザーのホームディレクトリをpublic_htmlにする為に#を削除
UserDir public_html

# CGIが使えるようにする為に、先頭の#を削除
AddHandler cgi-script .cgi

# 末尾に以下を追加
<Directory /home/*/public_html>
  Options ExecCGI
</Directory>

````

保存後、httpdを再起動する。

````
service httpd restart
````

## ユーザーディレクトリにCGIを設置する

ユーザーasahiのホームディレクトリに、public_html ディレクトリを作成する。

````

# asahiのホームディレクトリに移動
cd /home/asahi/

# public_html ディレクトリを作成して、パーミッションを755にする
mkdir public_html
chmod 755 public_html

````

上記で出来た、`` /home/asahi/public_html/ `` に適当なCGIを作成する。

http://hogehoge/~asahi/test.cgi にアクセスするも、なんと403エラー…。


## 所有ユーザーを確認する。

しまった！全部rootでやってた！…ということで、作成した `` public_html/ `` フォルダや、`` test.cgi `` の権限をチェックすると、

````
drwxr-xr-x 2 root root 4096  2月 10 22:09 2016 public_html
-rwxr-xr-x 1 root root 272  2月 10 22:10 2016 test.cgi
````

…と出る。わーごめんなさい。
ということで、

````

# 所有者をユーザーasahi、グループasahiに変更する
chown asahi:asahi /home/asahi/public_html/
chown asahi:asahi /home/asahi/public_html/test.cgi

````

よし！これで！
http://hogehoge/~asahi/test.cgi にアクセスするも、なんと500エラー…。


## エラーログをチェックする。

````
less /var/log/httpd/suexec.log
````

なんかユーザーのホームディレクトリが他からも書き込み出来るとか文句言っている…？

````
directory is writable by others: (/home/asahi/public_html)
````

調べたところ、これは、「CGIを置いている上位ディレクトリのパーミッションが他人による書き込みを許可しているため」だそう。

`` public_html/ `` はちゃんと755で作成しているけれど…ということは、ユーザーのホームディレクトリ `` /home/asahi/ `` のパーミッションを調べてみる。

````

# homeディレクトリ配下の一覧情報を出す
ll /home/

# home配下の/home/asahi/の情報が返ってくる
drwx------ 3 asahi asahi 4096  2月 10 22:09 2016 asahi

````

え……？711とかじゃなくて、700…？
ともかく、このユーザーディレクトリのパーミンションが良くないらしいので、755に変更する。

````
chmod 755 /home/asahi/
````

http://hogehoge/~asahi/test.cgi にアクセスすると……動いた！！

これらの情報を得るのに、以下を参考にさせていただきましたが、
[Premature end of script headers | 帰ってきただらだら日記--](http://d.hatena.ne.jp/g5n/20080123/1201062477)

それによると、

> Apache はデフォルトで SuExec が有効で、その要件としてディレクトリが group writable でないということらしい。

ということらしいです。

あと、rootで何でもかんでもやったらダメですね…。反省。
【C++】クラスの前方宣言まとめ

C++において、余計なinlucdeを減らすためにクラスの前方宣言を利用することは、[基本的なテクニック](http://99blues.dyndns.org/blog/2010/06/effective_build_2/)だと思います。ただ、何もないシンプルなクラスの前方宣言ならまだしも、実際には名前空間があったり、templateだったりするクラスも普通に存在します。そのたびに、前方宣言の書き方を確認するのは無駄な時間なので、まとめておきます。

**以下は、前方前言を記述するクラスのヘッダファイルのみを示します
（定義部分等はなくても大体予想がつくと思うので、あくまでも前方宣言にフォーカスします）。**

# 普通の前方宣言
ごく一般的な前方宣言です。

```cpp:普通の前方宣言（ClassAのメンバ変数としてClassBを持つ場合）
class classB;
class classA
{
public:
	classA();
	~classA();
private:
	classB *objB;
};
```

# 名前空間がある場合の前方宣言
メンバ変数にしたいクラスが名前空間で囲まれていたら、下記のようにします。

```cpp:名前空間がある場合の前方宣言ClassAのメンバ変数としてClassCを持つ場合）
namespace NS_C{
	class classC;
}
class classA
{
public:
	classA();
	~classA();
private:
	NS_C::classC *objC;
};
```

# typedefされているクラスの前方宣言
メンバ変数にしたいクラスがtypdefされている場合は、同じようにtypdefしてあげます。

```cpp:typedefがある場合の前方宣言ClassAのメンバ変数としてClassDDを持つ場合）
class classD;
typedef classD classDD;
class classA
{
public:
	classA();
	~classA();
private:
	classDD *objD;
};
```

# usingされている場合の前方宣言
C++11以降では、[積極的にusingが使われるようになると思いますが](http://qiita.com/Linda_pp/items/44a67c64c14cba00eef1)、そのような場合もtypdefと同じように、usingを書いてあげます。

```cpp:using(C++11以降)がある場合の前方宣言ClassAのメンバ変数としてClassEEを持つ場合）
class classE;
using classEE = classE;
class classA
{
public:
	classA();
	~classA();
private:
	classEE *objE;
};
```

# テンプレートクラスの前方宣言
テンプレートクラスの場合は下記のように書きますが、typedefもusingもテンプレートも結局、メンバ変数にしたいクラスの記述と同じよう記述をすれば大丈夫です。

```cpp:templateクラスの前方宣言ClassAのメンバ変数としてClassFを持つ場合）
template<typename T>
class classF;
class classA
{
public:
	classA();
	~classA();
private:
	classF<int> *objF;
};
```
# ごちゃごちゃしたクラスの前方宣言
いろんな要素が入っていてごちゃごちゃしているクラスも、ちゃんと構造を理解して同じように書いてあげれば大丈夫です。

```cpp:名前空間があり、templateクラスをtypedefしてさらにusingをした場合の前方宣言ClassAのメンバ変数としてClassGGGを持つ場合）
namespace NS_G{
	template<typename T>
	class classG;
	typedef classG<int> classGG;
	using classGGG = classGG;
}
class classA
{
public:
	classA();
	~classA();
private:
	NS_G::classGGG *objG;
};
```

# 注意：インナークラスは前方宣言できない
インナークラスの場合は、前方宣言できません。とっとと諦めて、設計を見直しましょう。

```cpp:インナークラス前方宣言ClassAのメンバ変数としてClassHinnerを持たせたい、けどビルドエラーの場合）
class classH;
class classH::classHinner;  // NG! 認識できない型(classH)が利用されています
class classA
{
public:
	classA();
	~classA();
private:
	classH::classHinner *objH; // NG!
};
```


上記ソース全ソースは[Github](https://github.com/shuheilocale/foward-declaration-test)に上げています（いらないと思いますけど・・・）。

メンバにクラスポインタをもたせると、メモリ管理がめんどくさい・・・いやいや、[スマートポインタ](http://qiita.com/hmito/items/db3b14917120b285112f)使いましょう。
以上、他にもこんな前方宣言があるよって方はご教示ください。
RailsのAMPページにNREUM(NewRelic Enduser Monitoring)のコードが挿入されて困る


タイトル通り。困りました。

## AMPページと通常ページでcontrollerないしactionが別の場合

controllerに`newrelic_ignore_enduser`を追加する。
railsのfilter(before_actionとか)みたいに、`only`,`except`でaction単位でフィルタリングできる。


``` ruby:articles_ontroller.rb
class ArticleController < ApplicationController
	newrelic_ignore_enduser only: [:amp_page]
		
	def amp_page
	end
end
	
```

## AMPページと通常ページのactionが同一の場合
formatがampの場合、actionの中で`NewRelic::Agent.ignore_enduser`を呼ぶ。
respond_toとで呼ぶと便利。

``` ruby:articles_ontroller.rb
class ArticleController < ApplicationController
	def show
		respond_to do |format|
			format.html
			format.amp { NewRelic::Agent.ignore_enduser }
		end
	end
end
```
xcproj をインストールしても、.pbxproj の XML 化が直らなかったので別の方法を探した

※追記あり

#概要
`cocoapods` を使うと `.pbxproj` の中身が XML みたいな内容に変化してて
git 管理できないよ〜 ＞_＜
という問題が発生

そのへんに触れてるページ
>CocoaPodsがpbxprojをXMLに書き換えてしまう件
>http://blog.koogawa.com/entry/2015/02/04/002402
>pod update する度にpbxproj ファイルの形式が変わってしまう君へ
>http://qiita.com/masaki925/items/878ab05824b772d72da9

その問題を回避するために、引用元に書いてるように
**`xcproj`** ってヤツを入れてたはずなんだけど
なんでか再インストールしても問題が解決しない
どうしよう

#~~解決方法~~

>https://guides.cocoapods.org/using/faq.html

```
$ pod update --no-repo-update --no-integrate
```

~~本家に書いてた~~
~~英文は読んでないけど `--no-integrate` を書けば防げるっぽい~~
~~このオプションは xcproj をインスコしてるかどうかは関係なし~~
~~また、一度XML化した後に `--no-integrate` を付与しても元に戻ったりはしない~~

~~とりあえず直ったんでこれ以上調べるつもりもなし(´･ω･\`)~~

#備考
日本語で `--no-integrate` に言及してるサイト

>□ CocoaPods を使ってオープンソースのライブラリをプロジェクトで簡単に管理する
>http://program.station.ez-net.jp/special/handbook/objective-c/cocoapods/install.asp

#追記その１
`--no-integrate` するとそもそも workspace が作られないっぽい
そして自分の環境では、`diff: /Manifest.lock: No such file or directory` やら問題発生 ビルド不可
もうちょっと調べる必要がありそうです・・・(´･ω･\`)
取り急ぎ

#追記その２
`cocoapods` が `1.0.0` にバージョンアップしてたことで　XML 化しなくなりました
（少し前にアップデートした時はエラーが出て pod 使えなかったんだよね(´･ω･\`)）

俗に言う「なんだかわからんがとにかく直った」というやつですね
(´･ω･\`)「なけるぜ」

1.0.0 になったことでプロジェクトファイルの構成が変わっていたので
もう手に負えないです
これ以上の調査はえろい人に任せます
iPhone用アプリアイコン画像からAndroid用画像をImageMagickで一発生成する

[ImageMagickでAndroidアプリ用にiPhone風の角丸アイコン画像を生成する](http://kawa.at.webry.info/201011/article_3.html)（2010年の記事）からのアップデート版。

- 用意するもの：　iOS 用アプリアイコン PNG 画像 (Artwork) （1024x1024ピクセル）
- できるもの：　Android 用アプリアイコン PNG 画像（1024x1024ピクセル）

（１）　事前準備： imagemagick をインストールしておく

```sh
brew install imagemagick
```

（２）　事前準備：　角丸マスク画像を用意する

- iOS アプリアイコンの角丸は、OS ないし Apple がよろしく処理してくれます。
- Android アプリアイコンは、開発者側で、事前に角丸を処理する必要があります。
- iOS 7 以降と同等の角丸のマスク画像を用意してあります → [ios7icon-mask.png](https://qiita-image-store.s3.amazonaws.com/0/12419/91394e36-92b4-1913-5352-4e9bc1701f93.png) をダウンロードして下さい。

（３） 事前知識：　Android のガイドラインを参照

- Android アプリアイコンは正方形・長方形・円形といった形状によって、推奨されるサイズが異なります。
- iOS アプリアイコンは 1024x1024 ピクセルめいいっぱいを使って OK ですが、Android アプリでは余白を調整してあげる必要があります。[ガイドラインを参照](https://www.google.com/design/spec/style/icons.html) すると、正方形アイコンなら192ピクセル中の152ピクセルを使うように書いてあります。つまり、見た目が 80％のサイズになるように上下左右に余白を付けます。

（4）　80％サイズのバリエーション作成

- ImageMagic を使って、Android の各画面解像度ごとの画像を自動生成できます。

```sh
mkdir drawable-mdpi drawable-hdpi drawable-xhdpi drawable-xxhdpi drawable-xxxhdpi

convert ios.png -matte ios7icon-mask.png -compose copy-opacity -composite round.png

# 192x192
convert round.png -resize 152x152 -background transparent -gravity northwest -splice 20x20 -gravity southeast -splice 20x20 drawable-xxxhdpi/ic_launcher.png

# 144x144
convert round.png -resize 114x114 -background transparent -gravity northwest -splice 15x15 -gravity southeast -splice 15x15 drawable-xxhdpi/ic_launcher.png

# 96x96
convert round.png -resize 76x76 -background transparent -gravity northwest -splice 10x10 -gravity southeast -splice 10x10 drawable-xhdpi/ic_launcher.png

# 72x72
convert round.png -resize 58x58 -background transparent -gravity northwest -splice 7x7 -gravity southeast -splice 7x7 drawable-hdpi/ic_launcher.png

# 48x48
convert round.png -resize 38x38 -background transparent -gravity northwest -splice 5x5 -gravity southeast -splice 5x5 drawable-mdpi/ic_launcher.png
```

（5）　100％サイズのバリエーション作成（6/14追記）

しかし、実機でみると 80％だと小さすぎる感じがしますね。
100％ サイズで解像度のバリエーションを作る手順は以下のとおり。

```sh
mkdir drawable-mdpi drawable-hdpi drawable-xhdpi drawable-xxhdpi drawable-xxxhdpi

convert ios.png -matte ios7icon-mask.png -compose copy-opacity -composite round.png

# xxxhdpi: 192x192
convert round.png -resize 192x192 drawable-xxxhdpi/ic_launcher.png

# xxhdpi: 144x144
convert round.png -resize 144x144 drawable-xxhdpi/ic_launcher.png

# xhdpi: 96x96
convert round.png -resize 96x96 drawable-xhdpi/ic_launcher.png

# hdpi: 72x72
convert round.png -resize 72x72 drawable-hdpi/ic_launcher.png

# mdpi: 48x48
convert round.png -resize 48x48 drawable-mdpi/ic_launcher.png

# google play: 512x512
convert round.png -resize 512x512 -background transparent googleplay.png
```
input type="file"をデザインする

`<input type="file">`をデザインする方法の1つをご紹介。

![input_button.jpg](https://qiita-image-store.s3.amazonaws.com/0/62931/d51686fa-4d73-f713-81d1-64a940fc68d9.jpeg)

1. `<input type="file">` をcssで透明にし、それ独自の見た目を非表示にします。
1. `<input type="file">` を　`p`タグで囲い、任意のデザインをcssで指定します。
1. jqueryで、`<input type="file">`のファイルが選択されたら、そのファイル名を表示させるようにしてやります。

```html:html
<p class="input-file-btn">
  ファイルを選択
  <input type="file" class="input-file">
</p>
<span>選択されていません</span>
```

```css:css
.input-file-btn {
  position: relative;
  // 任意のスタイル
}
.input-file {
  opacity: 0;
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  cursor: pointer;
}
```

```js:jquery
$(function() {
   $('.input-file').on('change', function() {
     var file_name = $(this).prop('files')[0].name;
     $(this).parent().next().html(file_name);
   });
});
```
onlineTool > タイミングチャート生成

CLK, DATAなどのタイミングチャートを生成するツール

以下を見つけた
https://rawgit.com/osamutake/tchart-coffee/master/bin/editor-offline.html

プレビューで見れるのが良い。


![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/b643392f-3066-d734-c5aa-af256f04af8d.png)
ヒュベニの公式を用いて２地点の緯度・経度から距離を算出する関数(PHP)

GoogleMapsAPIを使っている時に、2地点の緯度,経度から距離を算出したい時があったので関数を実装しました。
2地点の緯度,経度を引数として渡すとその距離を返してくれます。
以下のページを参考にし、ヒュベニの公式を使いました。
参考：http://yamadarake.jp/trdi/report000001.html

```php
// 地点1の緯度,経度$lat1, $lng1
// 地点2の緯度,経度$lat2, $lng2
function compute_dist($lat1, $lng1, $lat2, $lng2){
        $GRS80_A = 6377397.155;
        $GRS80_E2 = 0.00667436061028297;
        $GRS80_MNUM = 6334832.10663254;

        $mu_y = deg2rad($lat1 + $lat2)/2;
        $W = sqrt(1-$GRS80_E2*pow(sin($mu_y),2));
        $W3 = $W*$W*$W;
        $M = $GRS80_MNUM/$W3;
        $N = $GRS80_A/$W;
        $dx = deg2rad($lng1 - $lng2);
        $dy = deg2rad($lat1 - $lat2);

        // 距離をkmで算出
        $dist = sqrt(pow($dy*$M,2) + pow($dx*$N*cos($mu_y),2)) / 1000;

        return $dist;

}
```
Raspbian Jessie Lite (2016-05-10)をRPi 1 B+で使ってみた

## download

* [Download Raspbian for Raspberry Pi](https://www.raspberrypi.org/downloads/raspbian/) zipで301MB、解凍すると1.3Gと小さくて良い。

## 起動

* 自動でパーティションサイズが拡張される。
* boot時にIPアドレスが表示されるので便利になった。
* pi : raspberry でログイン

```bash:free
$ free -m
             total       used       free     shared    buffers     cached
Mem:           434        166        267          4          6        133
-/+ buffers/cache:         26        408
Swap:           99          0         99
```

```bash:sources.list
$ cat /etc/apt/sources.list
deb http://mirrordirector.raspbian.org/raspbian/ jessie main contrib non-free rpi
# Uncomment line below then 'apt-get update' to enable 'apt-get source'
#deb-src http://archive.raspbian.org/raspbian/ jessie main contrib non-free rpi
```

```bash:
$ uname -a
Linux raspberrypi 4.4.9+ #884 Fri May 6 17:25:37 BST 2016 armv6l GNU/Linux
```

```bash:
$ cat /etc/fstab 
proc            /proc           proc    defaults          0       0
/dev/mmcblk0p1  /boot           vfat    defaults          0       2
/dev/mmcblk0p2  /               ext4    defaults,noatime  0       1
# a swapfile is not a swap partition, no line here
#   use  dphys-swapfile swap[on|off]  for that
```

## tmpfsを使う

* [CloudAtCostのDISKの遅さを少しでも早くする - Qiita](http://qiita.com/tukiyo3/items/0e7ff78104185f8f6447)

```diff:/etc/fstab
+ tmpfs  /tmp  tmpfs  defaults,noatime  0  0
+ tmpfs  /var/tmp  tmpfs  defaults,noatime  0  0
+ tmpfs  /var/cache/apt/archives  tmpfs  defaults,noatime  0  0
```

## raspi-config

```bash:
sudo raspi-config
```

* 8. Overclock ->  Medium
* [N@i Blog](http://y-naito.ddo.jp/index.php?id=1417228001)さんの記事を読むに、「Medium」にするのが安全な様子。(通常:700Mhz,Medium:900MHz)
Proxmox VEのセットアップ手順（インストール編）

#はじめに
Proxmox VEのインストール手順を解説します。キーボードだけでインストールする場合は、GUI上でAltキーを押すとボタンの一文字に下線が付きます。Altキーを押しながらこの下線のキーを押せばそのボタンをクリックできます。

#インストール
![メニュー](https://qiita-image-store.s3.amazonaws.com/0/122614/ce9db393-eb81-0966-9c43-dd59ec5d705e.png)
「Install Proxmox VE」を選択しEnterキーを押します。

![使用許諾契約書](https://qiita-image-store.s3.amazonaws.com/0/122614/2fa146c4-3fc8-2dca-24c6-f20b35a18712.png)
「I agree」をクリックします。

![ドライブ選択](https://qiita-image-store.s3.amazonaws.com/0/122614/6fa91c0e-0fc6-bacc-b024-594fd62c04f2.png)
インストール先のドライブを選び「Next」をクリックします。

![ドライブ選択オプション](https://qiita-image-store.s3.amazonaws.com/0/122614/00a72252-125d-4a1b-1785-f1e5236e17d4.png)
ZFSにインストールする場合は、さきほどの画面で「Options」をクリックし、このサブウィンドウで例えばこのように選択して、「OK」をクリックします。

![地域とタイムゾーン](https://qiita-image-store.s3.amazonaws.com/0/122614/684b14ff-d0e7-a27f-dc13-891826d06f8d.png)
地域、タイムゾーンおよびキーボードレイアウトを日本仕様にして、「Next」をクリックします。

![パスワードとメールアドレス](https://qiita-image-store.s3.amazonaws.com/0/122614/ce16c5a0-3e28-316f-4a05-d387a74f4720.png)
rootユーザーのパスワードとメールアドレスを入力して、「Next」をクリックします。ともに後でWebUIから変更できます。

![ネットワーク](https://qiita-image-store.s3.amazonaws.com/0/122614/318ae661-968e-5647-2d66-18705803bfe5.png)
ネットワークの情報を入力して、「Next」をクリックします。ホスト名は後から変更するのが大変なため、慎重に決めてください。

![インストール中](https://qiita-image-store.s3.amazonaws.com/0/122614/1feea273-f5a7-eda3-111d-c2d42802aa8b.png)
インストール中はこのような画面が表示されます。終わるまで待ちます。

![インストール完了](https://qiita-image-store.s3.amazonaws.com/0/122614/cc14b7d7-b19d-cfb3-0499-3c78af0a2dc6.png)
インストールが完了したら、「Reboot」をクリックします。

#起動
![ブートメニュー](https://qiita-image-store.s3.amazonaws.com/0/122614/a35b2848-1864-934e-4564-c690e785def5.png)
起動の際、このようなブートメニューが表示されます。デフォルトでは5秒でタイムアウトして「Proxmox Virtual Environment GNU/Linux」が自動的に起動します。通常はそれで問題ありません。

![カーネルオプション](https://qiita-image-store.s3.amazonaws.com/0/122614/3417b9e9-9d5a-4e79-3dc9-fced0147ca4a.png)
USBメモリーにインストールすると、そのままではブートに失敗する場合があります。その場合はさきほどの画面で「Proxmox Virtual Environment GNU/Linux」を選択中にeキーを押して、「linux」から始まる行に「 rootdelay=2」を書き足します。その後、F10キーでブートさせます。

![ブート後](https://qiita-image-store.s3.amazonaws.com/0/122614/0446a71d-a6c8-461c-afe3-d4bc84467b27.png)
無事に起動するとこのような画面が表示されます。ここでログインすることもできますし、WebUIおよびSSHも利用可能です。

#続き
[Proxmox VEのセットアップ手順（初期設定編）](http://qiita.com/juze9/items/87ef0a4ccd54b8393564)
ハラハラするトーナメントの日程を求めよう

# <i class='fa fa-braille' /> はじめに
- あるスポーツのトーナメント戦を**8カ国**で行います。4試合づつ7日間の試合を行うとします。
- 前評判の人気順位がわかっているものとします。
- なるべく、人気の高いペアの試合を後半にするようにして、**最後までハラハラするような日程**を作成してみましょう。

この問題を[組合せ最適化](http://qiita.com/Tsutomu-KKE@github/items/bfbf4c185ed7004b5721)で解いてみます。

# <i class='fa fa-braille' /> 定式化
変数を、国1、国2、日ごとに、その組合せを"選ぶ選ばない"を表す0-1変数とします。

また、変数に対応する、"2国(i,j)のある日(k)の試合の重み"を以下のようにします。この重みの和を最大化することにより、"あとの方の順位の小さい国 同士の試合"を優先するようになります。
$$重み = \frac{2^k}{iの順位 \times jの順位}$$


<table>
<tr><td>最大化</td><td>$\sum_i{重み_i x_i}$</td><td>重みの総和</td></tr>
<tr><td >変数</td><td>$x_i \in \{0,  1\} ~ ~ \forall i \in 候補$</td><td>その候補を選択するかどうか</td></tr>
<tr><td rowspan="2">制約条件</td><td>$\sum_{i \in j,kの組~~~~~}{x_i} = 1 ~ ~ \forall j,k \in \mbox{国}$</td><td>同じ組は1つ</td></tr>
<tr><td>$\sum_{i \in 国jを含むk日目~~~~~~~~~~~~~}{x_i} = 1 ~ ~ \forall j \in \mbox{国}, \forall k \in \mbox{日}$</td><td>同国、同日は1つ</td></tr>
</table>
この問題は、スケジューリング問題の一種です。

# <i class='fa fa-braille' /> Pythonでやってみる
まずは、組合せの表を作成します。

```py3:python3
import pandas as pd
from itertools import combinations, product
from pulp import *
ss = 'イタリア オランダ 日本 韓国 タイ ドミニカ共和国 ペルー カザフスタン'.split()
rnk = {s:(i+1) for i, s in enumerate(ss)} # 国名→順位
a = pd.DataFrame([(i, j, k, 2**k/rnk[i]/rnk[j]) for i, j in combinations(ss, 2)
                  for k in range(7)], columns='国1 国2 日 重み'.split())
a[:3]
>>>
       国1    国2    日  重み
0  イタリア  オランダ  0  0.5
1  イタリア  オランダ  1  1.0
2  イタリア  オランダ  2  2.0
```

定式化して解いてみましょう。

```py3:python3
m = LpProblem(sense=LpMaximize) # 数理モデル
a['Var'] = [LpVariable('v%d'%i, cat=LpBinary) for i in a.index] # 変数
m += lpDot(a.重み, a.Var) # 目的関数
for _, b in a.groupby(['国1', '国2']):
    m += lpSum(b.Var) == 1 # 同じ組は1つ
for s, i in product(ss, range(7)):
    # 同国、同日は1つ
    m += lpSum(a.query('(国1=="{0}" | 国2=="{0}") & 日=={1}'.format(s, i)).Var) == 1
m.solve() # 求解
a['Val'] = a.Var.apply(value) # 結果
# 表示
for i, b in a.groupby('日'):
    print(i+1, '日目 ')
    for _, r in b[b.Val > 0].iterrows():
        print(' %*s - %s'%(8-len(r.国1), r.国1, r.国2))
>>>
1 日目 
 イタリア - カザフスタン
 オランダ - ペルー
     日本 - ドミニカ共和国
     韓国 - タイ
2 日目 
 イタリア - ペルー
 オランダ - カザフスタン
     日本 - タイ
     韓国 - ドミニカ共和国
3 日目 
 イタリア - ドミニカ共和国
 オランダ - タイ
     日本 - カザフスタン
     韓国 - ペルー
4 日目 
 イタリア - タイ
 オランダ - ドミニカ共和国
     日本 - ペルー
     韓国 - カザフスタン
5 日目 
 イタリア - 韓国
 オランダ - 日本
     タイ - カザフスタン
 ドミニカ共和国 - ペルー
6 日目 
 イタリア - 日本
 オランダ - 韓国
     タイ - ペルー
 ドミニカ共和国 - カザフスタン
7 日目 
 イタリア - オランダ
     日本 - 韓国
     タイ - ドミニカ共和国
   ペルー - カザフスタン
```

各日の日程が出力されました。

他の方法としては、前半に戦力差のある組合せ、後半に拮抗した戦力差の組合せというのもあるかもしれません。

# <i class='fa fa-braille' /> おまけ
一時的に、私の直近のPython関連の投稿を、Arukasで実行できるようにしています。

- https://qiita-jupyter.arukascloud.io/
    - 各記事を開いた後で、セルを選択後、Shiftキーを押しながらEnterキーを押すと、実行できます。
- 上記の元イメージです。
    - https://hub.docker.com/r/tsutomu7/qiita-jupyter/

以上
Emacsのテーマを改造する

# この記事でやること
既存のテーマをベースにして、改造したオリジナルのテーマを作る。themeフレームワークはEmacs24以降なので、それより前のバージョンは想定しない。

# きっかけ
長らく `darcula-theme` を使っていたのだが、型名の色が暗すぎて見づらい（下画像の`MainWindowViewModel : ViewModel`の部分）ので、明るくしたいと思った。
![orig.png](https://qiita-image-store.s3.amazonaws.com/0/10771/541c57ee-83f3-98e3-3729-f3edbeae909e.png)

# カスタムテーマのパスの設定
仮にここでは`~/.emacs/theme`ディレクトリとする。読者の環境に合わせて自由に置き換えること。

以下の記述を`init.el`などに記述する。

```el
(add-to-list 'custom-theme-load-path "~/.emacs.d/themes")
(setq custom-theme-directory "~/.emacs.d/themes")
```
後でテストしやすいように、一度Emacsを再起動して上記の定義を読みこませるか、scratchバッファで評価しておくと良い。

# カスタムテーマの設定

まず、ベースにしたいテーマを現在のEmacsに適用し、`M-x customize-create-theme`を実行する。現在のテーマをベースにするかどうかをミニバッファで聞かれるので、`y` を入力する。

すると、以下のような`Custom Theme`バッファが表示される。

まずは`Theme name`を設定する。今回は`darcula`がベースなので、とりあえず`darcula-modified`としておく（末尾に`-theme`が付与されるので、入力するのはテーマ名本体のみで良い）。

![customize.png](https://qiita-image-store.s3.amazonaws.com/0/10771/2ed7ec03-da40-7c27-1d15-25a1d7f8f61f.png)

今回は `Font Lock Type Face` を編集したいので、当該項目の左側にある▷をクリックすると、実際の定義が表示されるようになる（各項目のサンプルが右側に表示されているので、変えたい部分の色を目印にすると見つけやすい）。

![def-type.png](https://qiita-image-store.s3.amazonaws.com/0/10771/3e25cf4c-ae94-7108-b04a-4213c1547441.png)

ここの `:foreground "#4e807d"` の部分を書き換えることで、型名の色が変化する。今回は明るい緑色`mediumseagreen #3cb371`に設定する。

すべての設定が終了したら、「Save Theme」のボタンをクリックすることで、`~/.emacs.d/themes/darcula-modified-theme.el`に保存される(保存先のパスは、先ほど`custom-theme-directory`で設定した)。ためしにscratchバッファで`(load-theme 'darcula-modified)`を実行すると、先ほど作成したテーマの内容が表示され、本当に読み込んでよいかを確認される。`y`を入力すると、実際にテーマが適用されるので、適当なファイルを開いて色が変化していることを確認する。今回の例だと、以下のように色が変化している（最初のスクリーンショットと比較してほしい）。

![after.png](https://qiita-image-store.s3.amazonaws.com/0/10771/47af4711-3e54-3991-3ce7-5b117f68d66b.png)

気に入らなければ、`Custom Theme`バッファに戻って変更をやりなおすことができる。

# テーマの読み込み設定

いままで`(require 'darcula-theme)`としていた部分を`(load-theme 'darcula-modified t)`とする。第二引数の`t`は、読み込みの確認をしないという意味で、これを指定しないとEmacsを立ち上げるたびに先ほどの読み込み確認が表示される。

Emacsを再起動して適当なファイルを開き、修正したテーマが適用されていればすべての手順が成功している。

# まとめ
* カスタムテーマを配置するディレクトリとして`custom-theme-load-path`を設定する
* Emacsのテーマを編集するには`customize-create-theme`を使う
* テーマの保存先は`custom-theme-directory`で設定する
* テーマを読み込むには、`load-theme`を使う
7行でRの依存ライブラリを全て入れる

釣り臭あるタイトルだが、あるスクリプトに必要なライブラリに対し、ローカルに保存してあれば読み込み、なければinstall.packagesを実行する関数を作った。（というか調べた）

ライブラリを読みこむのにはlibraryとrequireがあるが、下記のように吐いてくる値が違う。

```script.R
> print(library(hoge)) # => ライブラリが見つからないと処理が止まってしまう!
 library(hoge) でエラー:  ‘hoge’ という名前のパッケージはありません 
> print(require(hoge)) # => ライブラリが見つからないとFALSEを返す！
 要求されたパッケージ hoge をロード中です 
[1] FALSE
```

これを利用して、require(hoge)がFALSEならinstall.packagesで該当パッケージをインストールしてrequireすれば良いのだが、ライブラリ名をベクトルに詰めてこんな感じでよしなに処理しようとすると、盛大にエラーを吐く。

```gomi.R
> for(lib in libraries){
+  if(!require(lib)){
+    install.packages(lib)
+    require(lib)
+  } 
+ }
 要求されたパッケージ lib をロード中です 
Error in install.packages : Updating loaded packages
c(" 要求されたパッケージ eval をロード中です ", " 要求されたパッケージ lib をロード中です ")
Failed with error:  ‘ 'package' は長さ 1 でなければなりません ’
 要求されたパッケージ lib をロード中です 
Installing package into ‘/Users/01010357/Library/R/3.2/library’
(as ‘lib’ is unspecified)
```

これはrequireやlibraryはオブジェクトも文字列も受け取ることができるため。
libにライブラリ名が詰まっているが、requireは**libパッケージ**を読み込もうとしてしまう。

なので、install.packagesにベクトルをもたせられる事を利用し、下のコードみたいに読み込むといける

```install.packages.R
load.libs <- function(lib){
  lib.not.in.local <- lib[!(lib %in% installed.packages()[, "Package"])]
  if (length(lib.not.in.local)) 
    install.packages(lib.not.in.local, dependencies = TRUE)
  sapply(lib, require, character.only = TRUE)
}
load.libs(libraries)
```

めっちゃ楽になった。
Sparkのローカル開発環境作る方法（Scala向け）


Scalaのパッケージ管理としてsbtがあるらしいが、そもそもScala初めてで何もわからなかったので、自分の備忘録として。
せっかくだしEclipseからIntelliJに移行しようと思ったので、IntelliJベースで話進めます。Eclipserは適宜読み替えてもらえると。

##sbt
Scalaのパッケージ管理。Rubyのgemみたいにグローバル汚さないで済むし（Bundler使えば良い話だが）便利。
機能的には幾つかあるらしいが、自分は依存関係の整理にしかまだ使ってない（使いこなせてない）ので**いいプラグインあったら教えて下さい。**
Sparkの各種ライブラリもここで管理する

## IntelliJでプロジェクトを作る

-  New -> Projectで新規プロジェクトを作成する
-  Scala -> sbtを選択する。もしこの選択肢がなかったら環境設定からScalaのプラグインをインストールし再起動すると出てくる。
<img width="1440" alt="79347a7f-5b58-bcf8-c8a6-c2490a197877.png" src="https://qiita-image-store.s3.amazonaws.com/0/28555/698a3292-6309-01af-bb54-2ca777c06ee0.png">

-  適当に名前入れてfinish.勝手にプロジェクトができる。
<img width="1440" alt="92cc3587-c80c-5e93-006b-099c3f873e06.png" src="https://qiita-image-store.s3.amazonaws.com/0/28555/60fc4a35-35e2-6d06-f4ce-b9535ed9b0ce.png">

-  生成されるbuild.sbtに以下の項目を追記する
バージョンは適宜指定すること。

```scala:build.sbt
libraryDependencies ++= Seq(
  "org.apache.spark" %% "spark-core" % "1.4.1",
  "org.apache.spark" %% "spark-graphx" % "1.4.1",
  "org.apache.spark" %% "spark-sql" % "1.4.1"
)
```

-  保存してsbt実行。auto importにチェック入れておけば保存した瞬間に依存関係の整理が走る

-  正常終了すると、ディレクトリが何個かできる。この中のsrc/scala以下にパッケージ切ってコード書けばOK。試しにGraphX使ってみる。PageRankを求めてみる。

```scala:example.scala
package hellospark

import org.apache.spark.graphx.{Graph, GraphLoader}
import org.apache.spark.{SparkConf, SparkContext}

/**
 * Created by nishimuuu on 2015/08/16.
 */
object example {
  def main(args: Array[String]) {
    val conf = new SparkConf().setAppName("appname").setMaster("local[*]")
    val sc   = new SparkContext(conf)

    val edge_path = "/path/to/edge.csv"
    val node_path = "/path/to/node.csv"
    val graph: Graph[Int, Int] = GraphLoader.edgeListFile(sc, edge_path).cache()

    val ranks = graph.pageRank(0.001).vertices
    val nodes = sc.textFile(node_path).map{line =>
      val fields = line.split(",")
      (fields(0).toLong, fields(1))
    }

    val ranksByNode = nodes.join(ranks).map {
      case(id, (node, rank)) => (node, rank)
    }
    println(ranksByNode.collect().mkString("\n"))


    sc.stop()
  }
}
```

-  結果

```
(follower2 follow1 A,0.3300364712764322)
(follower2 follow0,0.4854936516596302)
(follower3 follow3,0.6927675771080204)
(follower4 follow4,0.8482247574912182)
(follower2 follow2,0.5260649857706428)
(follower2 follow1 B,0.3300364712764322)
```

こんな感じ。ファイルの場合、edgeを読み込んでnodeを張り付けていく、のが楽。
まだ細かく触ってないけど、読み込み時にゴニョゴニョやる必要がないのを知れてよかった。