OmniAICreator/Qiita-1.07M huggingface dataset:
Unity5でXcodeproject Export時にplistやプロジェクト設定を変更する方法



```PostprocessBuildPlayer.cs
using System.IO;
using UnityEditor;
using UnityEditor.iOS.Xcode;
using UnityEditor.Callbacks;

public class PostprocessBuildPlayer {
	[PostProcessBuildAttribute]
	public static void OnPostprocessBuild(BuildTarget buildTarget, string path) {
		if (buildTarget == BuildTarget.iOS) {
			string projectPath = path + "/Unity-iPhone.xcodeproj/project.pbxproj";
			PBXProject project = new PBXProject();
			project.ReadFromFile(projectPath);

			string target = project.TargetGuidByName("Unity-iPhone");
			project.SetBuildProperty(target, "ENABLE_BITCODE", "NO");
			project.WriteToFile(projectPath);

			var plistPath = Path.Combine(path, "Info.plist");
			var plist = new PlistDocument();
			plist.ReadFromFile(plistPath);
			plist.root.SetString("Privacy - Camera Usage Description", "カメラ使います。");
			plist.WriteToFile(plistPath);
		}
	}
}
```

##簡単に説明##

このコードで設定しているのは2つで、
1, BitCodeをNoに。
2, info.plistにiOS10からカメラアクセスで必須になったkey, valueを追加。

プロジェクト設定であれば、`project.SetBuildProperty(target, "Key", "Value")`
plistであれば、`plist.root.SetString("Key", "Value")`で追加という感じです。
targetとprojectPathに関しては適宜変更してください。

###配置場所###
PostprocessBuildPlayer.csはAssets/Editor/に格納してください。
一番簡単にPHPで１ヶ月前の日付とかを取得する関数

```PHP:sample.php
//１ヶ月前
echo date('Y-m-d', strtotime("-1 month"));
//2016-10-16

//現在
echo date('Y-m-d', strtotime("now"));
echo date('Y-m-d', time());
//2016-11-16

//１ヶ月後
echo date('Y-m-d', strtotime("＋1 month"));
//2016-12-16

```

こんな感じで  +1 dayとか +1 yearとかいう書き方が通用する
yesterdayとかって書いてもいけちゃう。

ちなみにLaravelだったら、

```Laravel:sample.blade.php
{{ date('Y-m-d', strtotime("-1 month")) }}
```

こう書く。


日付扱う時にはこれ最強に便利。
2016-11-16 Qiita > 「いいね」機能についての要望

[投稿記事やコメントに「いいね」できるようになりました（Contributionの算定基準も変わります）](http://blog.qiita.com/post/153200849029/qiita-like-button)

「いいね」機能が搭載されたことで、ストックした中でも「いいね」した記事が「それ以外の記事」と区別できる、と期待しました。

しかしながら、トップページに表示されるタブは以下です。

- フィード
- すべての投稿
- ストック
- 自分の投稿

「いいね」した記事の検索は用意されていないようです。

また、トップページの「ストック」タブ押下時に表示されるアイコンは「いいね」のものです (ストックではありません)。

以下を希望します。

- 「ストック」で検索できる (現状のまま残していただきたい)
- 「いいね」で検索できる
- (可能であれば)「ストック」かつ「いいね」した記事を検索できる
わたしのLaravelメモ(随時更新)

#はじめに
ドキュメント読んでもよくわかんなかったことの我流メモです

## whereHas()
Postが1つでも紐付いていて且つ、``comments.content like "foo%"``のComment

```php
$posts = Post::whereHas('comments', function ($query) {
    $query->where('content', 'like', 'foo%');
})->get();
```

## whereRaw()

where()でDB::raw()を使いたい時はwhereRaw()をつかう

```php
$hoge->where(DB::raw('DATEDIFF(started_at, CURRENT_DATE)'))->get();
```

ってやると実際のクエリは

```sql
select * from `recruit_periods` where DATEDIFF(started_at, CURRENT_DATE()) = 0 is null
```
となっていて「？？」と思って調べたらwhere()で生クエリを書きたい時はwhereRaw()でかくと出てきた
だから正解は

```php
$hoge->whereRaw('DATEDIFF(started_at, CURRENT_DATE)')->get();
```
ちなみにwhereIn()を生クエリで書きたい時は
`whereRaw('action IN ('create', 'delete')')`
みたいに書く
高信頼性システム研修6日目

## バックアップ計画
> バックアップを行う際には、そのタイミングや頻度など、運用上考慮すべき点が幾つかある

### 二つの指標

- RPO(Recovery Point Objective)
  - 目標復旧時点、データの損失が許容される時間
- RTO(Recovery Time Objective)
  - 目標復旧時間、業務停止が許容される時間

### 考える事

- When
  - バックアップを行うタイミング(毎日、毎週...)
- Where
  - バックアップ先(ハードディスク、磁気テープ..,)
- Who
  - バックアップを行うユーザ権限(一般ユーザ、root...)
- What
  - バックアップの対象データ(ファイル、ディレクトリ...)
- Why
  - バックアップの理由
- How
  - バックアップの方法(ツール、手順、リカバリ方法)
- How log
  - バックアップの保存期間(3日、半年...)


### 対象のデータ

- バックアップ対象とすべきデータ
  - 二度と同じものを作成できないデータ

- バックアップの対象外としてもよいデータ
  - 一時データ、再作成可能なデータ、バージョン管理しているデータ

### バックアップの種類

- フルバックアップ
  - すべてのデータをコピーする方法
  - 時間はかかるが、リストアは容易
- 差分バックアップ
  - 前回フルバックアップを取ってから、変更分のみをコピーする方法
  - リストアするためには、フルバックアップの内容に戻してから **最新の差分バックアップのみ** を戻す
- 増分バックアップ
  - 前回バックアップを取ってからの変更分のみを保存する方法
  -リストアするためには、フルバックアップの内容に戻してから **古いものから順に増分バックアップ分** を戻す
  
#### 差分バックアップと増分バックアップの違い
差分バックアップは、はじめに行うフルバックアップからの変更分を毎回バックアップとして残す。
一方、増分バックアップでは、はじめにフルバックアップを行うところまでは差分バックアップと同じだが、前回のバックアップからの変更点のみをバックアップとして残す。つまり、両者とも変更点をバックアップとして残すが、どこからの変更点なのかがことなる。差分バックアップは初回のフルバックアップからの変更点。増分バックアップは、前回のバックアップからの変更点。

### 代表的なバックアップツール
- データバックアップ
  - tar
  - tsync
  - cpio
  - dumprestore
- システムバックアップ
  - dd
  - Mondo Rescure

### サーバ向けバックアップソフト
  - HP Data Protector software
  - Tivoli Strage Manager Family
  - NetVault Backup

### AWS でのバックアップ

#### スナップショット
ディスクを S3 にまるまるバックアップできる機能で、EBS や RDS などで使用することができる。
S3 の耐久性は **99.999999999%** だが、オペミスなどでデータが消えてしまう可能性がある。
S3 のバージョニング機能を使うと簡単にオペミスでのデータ消失を防ぐことができる。

### バックアップ時の静止点
バックアップ取得中にバックアップ対象データが変更されてしまうとバックアップデータに不整合が起きてしまう。
安全にバックアップを取るためには、理想的にはバックアップ取得中にはシステムを停止する必要がある。
ただ、そうすると可用性が低下してしまう。

- オンプレミス
  - サービスを停止してバックアップ
    - SLA で約束すれば可用性の問題はない
    - xfs_freeze でディスクへの書き込みを停止させる
  - LVM(Logical Volume Manager) のスナップショット機能を利用する
    - サービスを停止せずに静止点を作ることが可能
  - MySQL の InnoDB などの single-transaction オプション
- クラウド
  - クラウドでも静止点が必要なのは同様・オンプレミスと同様
  - オンラインのままスナップショットを取得することも可能
    - 失敗する確率は「稀にある」くらいい

### クラウドでのスナップショットの活用
従来はバックアップ用途でスナップショットをとっていたが、AWS などのクラウドでは、スナップショット機能の柔軟性が高く、バックアップのみならず、ディスクの容量拡張などにも利用される。つまり、現在のインスタンスのスナップショットをとり、そのスナップショットを使ってより大きなディスク容量を持つインスタンスを作成するなどが可能。また、スナップショットを使ってリージョンをまたいでどういつインスタンスを立てることも可能なので、コールドスタンバイ構成が簡単に実現可能。

### LVM
LVM を使うことで、複数の物理ボリュームをまとめて論理的なボリュームグループを作成し、それを論理的なボリュームに分割することができる(パーティショニング)。例えば、500GB のハードディスク二つを繋いでいる場合、800GB と 200GB のパーティションを作成することができる。

#### LVM のスナップショット機能
- バックアップ機能ではなく、あくまで静止点を作るスナップショット機能
- ある時点以降のディスクへの書き込みをスナップショット領域に退避することで静止点とする
- スナップショット領域に書き込まれているデータがある場合はそちらを参照し、ない場合はもとのディスク領域をみることで、その静止点の時点でのデータを復元可能
pyenvでpythonの仮想環境を構築


macOSをSierraにしたらどうも、Pythonのvirtualenvがうまく動かなくないので、
仮想環境をpyenvで構築し直すことにしました。その際の手順についてまとめています。
簡単なので基本的なコマンドだけ覚えておけば問題ないでしょう！
インストールも簡単にできまるので、小学生でも問題なくできると思います！！


# 環境
* macOS Sierra 10.12.1
* Homebrew 1.0.8

# インストール
## pyenvをインストールする
* Homebrew が導入済みでHomebrewでインストールする場合

```
$ brew install pyenv
```

## Python のインストール
### インストール可能なバージョンを調べる
たくさんのバージョンが出てくるので自分の好きなバージョンをインストールしてください

```
$ pyenv install -l
Available versions:
  2.1.3
  2.2.3
  2.3.7
  2.4
  2.4.1
  2.4.2
  2.4.3
  2.4.4
  2.4.5
  2.4.6
  2.5
  2.5.1
  2.5.2
...
```
Python3.5.2をインストールする場合

```
$ pyenv install 3.5.2
```

## pyenv virtualenvをインストールする
```
$ brew install pyenv-virtualenv
```

# pyenvによるpythonのバージョンの設定
全体のpythonのバージョンを3.5.2にしたい場合

```
$ pyenv global 3.5.2
```
特定のディレクトリだけ反映させる場合
特定のディレクトリで`pyenv local XXX` とコマンドを打つとそこのディレクトリだけpythonのバージョンが適応される。

```
$ cd PROJECT_DIR
$ pyenv local 2.7.10
```

# pyenv-virtualenvによる仮想環境構築
pyenvでちょろちょろ環境変えるのは大変なので基本的にはpyenv-virtualenvで仮想環境を構築するほうが便利だと思います。

## pyenv-virtualenvで仮想環境を作る
Python3.5.2で仮想環境を作る場合。

```
$ pyenv virtualenv 3.5.2 test
```

## pyenvで仮想環境にはいる

```
$ pyenv activate XXXXX
```

## pyenvで仮想環境を抜ける

```
$ pyenv deactivate
```

## 仮想環境を削除する
NAMEは自分で作った仮想環境の名前を入れてください

```
$ pyenv uninstall NAME
pyenv-virtualenv: remove /Users/xxxx/.pyenv/versions/3.5.2/envs/test2? [yを入力]
```
Heroku Redis がアップデートされて接続できなくなってしまったら

# 概要

以前に、Heroku Redisが勝手にアップデートされて、Webサイトが適切に表示されない状態となっていました。
Heroku Redisがアップデートされると、以下のようなフィードが届きます。

<img width="365" alt="update_redis.png" src="https://qiita-image-store.s3.amazonaws.com/0/6558/4d9a53e2-dcae-1cb9-2c87-76952e7c414d.png">

アップデート前には**オーナー宛て**にメール通知が届くようですが、オーナーでない場合は把握できない可能性があります。

# 詳細

Heroku Redisのアップデートでは、**ホスト名**と**ポート**が変更され、環境変数 [REDIS_URL] が更新されます。
[REDIS_URL] は `redis://h:<password>@<hostname>:<port>` という構造になっていますので、更新された情報に従い、各種環境変数を修正します。

Laravel 5.2 の場合、`/config/database.php` にてREDISの設定をしていた環境変数 [REDIS_HOST] と [REDIS_PORT] を更新したところ、適切に表示されるようになりました。

## 環境変数の更新 (GUI)

<img width="711" alt="update_redis_02.png" src="https://qiita-image-store.s3.amazonaws.com/0/6558/ff1336e4-5bd5-a531-de3a-f31398ec4273.png">

<img width="738" alt="update_redis_03.png" src="https://qiita-image-store.s3.amazonaws.com/0/6558/5d0a782e-f1e2-5adc-13c4-0980dbd28e78.png">
gometalinterでerrorのみ表示する

gometalinterを実行するとwarningとerrorが表示されるので、
errorのみ確認したい場合は `--errors` オプションを付ける。
https://github.com/joefitzgerald/gometalinter-linter/issues/18

```zsh
$ ## warningとerrorが表示される
$ gometalinter --fast --vendor ./...
db/mysql.go:4:2:warning: a blank import should be only in a main or test package, or have a comment justifying it (golint)
$ 
$ ## errorのみ表示される
$ gometalinter --fast --vendor --errors ./...
$ 
```
PHPで配列内を重複ワード数順にソートしつつ，重複ワードを消す

えーっと，よくわからないタイトルですが，ズバリ下みたいなことがしたかったです．

## 実現したいこと

```php
$array = array(
    '1',
    '1',
    '2',
    '2',
    '2',
    '2',
    '3',
    '3',
    '3'
);
```

みたいな配列があるとき

```php
Array
(
    [0] => 2  // 2が4つあって一番多いよね
    [1] => 3  // 次に多いのが3つある3だよね
    [2] => 1  // 最後に多かったのは1でした
)
```

という配列を作りたい!!

いくら様々な配列操作を行える関数を用意しているPHPといえど，こういうことは用意されている関数一つでパッとは出来まい……．
あれ? 出来ないよね?
というか検索してもこういう処理がなかなか見付からなかった(そもそもやろうとしている人がいない?)のでロジックを作ってみました．

## 作ってみた

```php
// sort用に重複数をカウントしつつ配列のkeyに元となるvalueを入れる
foreach ((array) $array as $value) {
    if (isset($sort[$value])) {
        ++$sort[$value];
    } else {
        $sort[$value] = 1;
    }
}

// ソート
arsort($sort);

// 元となるvalueを添字から復元
foreach ((array) $sort as $key => $value) {
    $return[] = $key;
}
print_r($return);
```

どうでしょうか……?

これを使うことで，例えば投票システム?とかでも投票された順に配列に詰めるだけで順位は出せますよね(何票だったかは出す必要がない場合)．
また，今までに入力されたデータをザッと配列に出しちゃえば利用頻度の高かったデータ順に候補配列を作ったり……とかも出来そうだし便利じゃないかな!?

### いや，わざわざ作る必要なかった……

([コメント](http://qiita.com/shy_azusa/items/38f709e05d853c28f0b3#comment-4d00ae68cd675b993552)より[array_count_values](http://php.net/manual/ja/function.array-count-values.php)を使用した例を頂きましたのでこちらにも載せておきます．)

```php
$counts = array_count_values($array);
arsort($counts);
$return = array_keys($counts);
print_r($return);
```

ビックリする程簡単でわかりやすくなっている……．
このQiita記事も必要なかったんじゃないのかレベルですわ．
教えて頂きありがとうございました!!

## テストしてみる

```php
<?php

$array = array(
    '高坂 穂乃果',
    '南 ことり',
    '園田 海未',
    '南 ことり',
    '園田 海未',
    '南 ことり',
    '高坂 穂乃果',
    '南 ことり',
    '園田 海未',
    '園田 海未',
    '南 ことり',
    '高坂 穂乃果',
    '南 ことり',
    '園田 海未',
);

foreach ((array) $array as $value) {
    if (isset($sort[$value])) {
        ++$sort[$value];
    } else {
        $sort[$value] = 1;
    }
}
arsort($sort);
foreach ((array) $sort as $key => $value) {
    $return[] = $key;
}
print_r($return);

```

何かの投票結果を`$array`に雑にそのままブチ込んだと仮定して，先程の処理を行います．

```php
Array
(
    [0] => 南 ことり
    [1] => 園田 海未
    [2] => 高坂 穂乃果
)
```

おー．出来てる……．

以上です!!

もっともっと賢いやり方がありそうな気配がするので，もしもあればコメント等是非お願いいたします．
Swift 3での同期処理(排他制御)の基本

以前、以下の呟きをしましたが、わりと古い方法を利用しているコードが散見されるので、Swift 3での同期処理(排他制御)についてまとめてみます。

<blockquote class="twitter-tweet" data-lang="en"><p lang="ja" dir="ltr">getterはsyncでSwiftぽいロックになってて良いけど(　´･‿･｀)<a href="https://t.co/X2OrjyBmH7">https://t.co/X2OrjyBmH7</a> で、Foundation.Lockを使わずにDispatchQueue.sync使おうという話があった。 <a href="https://t.co/77zzkNUGLj">https://t.co/77zzkNUGLj</a></p>&mdash; mono(　´･‿･｀)🐶🍎📱⌚️ (@_mono) <a href="https://twitter.com/_mono/status/762104479625809920">August 7, 2016</a></blockquote> <script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

参考: [Concurrent Programming With GCD in Swift 3 - WWDC 2016 - Videos - Apple Developer](https://developer.apple.com/videos/play/wwdc2016/720/)

# かつての方法

WWDCスライドのpp.120-123に載っているのでご覧ください。

<img width="1204" alt="Screen Shot 2016-11-16 at 15.24.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/19398/cffed643-b3e2-8613-6af6-a6ff57f6bceb.png">

<img width="1144" alt="Screen Shot 2016-11-16 at 15.26.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/19398/bf2f09c9-d988-71f5-6ea1-d707227e1788.png">


# WWDCで勧められていた`DispatchQueue.sync`を使った方法

基本的には、こちらが良いようです。実際、扱いも簡単です。

```swift
class Account {
    private var _balance: Int = 0
    // デフォルトは、シリアルキュー
    private let lockQueue = DispatchQueue(label: "Account lock serial queue")
    // attributesに.concurrentを指定すると並行処理されるキューとなり同期処理の用途には不適切
//    private let queue = DispatchQueue(label: "", attributes: .concurrent)

    var balance: Int {
        // getterを同期処理に
        // クロージャー内で返した型をgetterの戻り値として返せる
        get {
            return lockQueue.sync { _balance }
        }
        // setterを同期処理に
        set {
            lockQueue.sync { _balance = newValue }
        }
    }

    // _balanceの増減操作をするには読み取りと書き込みをセットで括る必要あり
    func add(_ value: Int) {
        lockQueue.sync { _balance += value }
    }
}
```
ポイントは以下です。

- シリアルキュー(`lockQueue`フィールド)を作成しそれを同期処理に用いる
- `lockQueue.sync`で処理を括るだけで同期処理に出来る

また、`sync`メソッドは、いくつかオーバーロードがあり、戻り値を返すことも出来て、上の例ではbalanceの`get`のみ2つ目の戻り値ありの方、それ以外は1つ目の戻り値無しの方が使われています。

```swift
public func sync(execute block: () -> Swift.Void)
public func sync<T>(execute work: () throws -> T) rethrows -> T rethrows -> T
```

簡単にテストしてみると、無事に排他制御されていることが確認出来ます。
(下の例では、`balance`の`get`・`set`は不使用)

```swift
let account = Account()

for i in 0..<1_000 {
    DispatchQueue.global().async {
        account.add(10)
        // 次のように同期処理を介さず操作すると最終結果がズレる(低くなる)
        //account.balance += 10
    }
}

Thread.sleep(forTimeInterval: 1)
print("final balance: \(account.balance)") // 10 x 1_000 = 10_000
```

# ただし、パフォーマンスは良くない

パフォーマンスはローレベルのロック手法に比べて悪いようですが、安全・簡単なので、そのあたりがどうしても気になる処理以外は、Apple推奨の`DispatchQueue.sync`を使った方が良いかなと思っています。

- [Mutexes and closure capture in Swift](https://www.cocoawithlove.com/blog/2016/06/02/threads-and-mutexes.html)
- [Updated for Xcode 8, Swift 3; added os_unfair_lock](https://gist.github.com/steipete/36350a8a60693d440954b95ea6cbbafc)

あるいは、`DispatchQueue.sync`では要件満たせない時も、ローレベルの別のやり方を使う必要になってくると思います。
authorized_keys を管理するスクリプトを書いた

公開鍵のコメントを読み取って削除する鍵を選んだり、Webから公開鍵をDLして追加したりできる。

https://gist.github.com/nishimura/41e7ebb3ca1ecd8744b56777a79353d7

```bash
#!/usr/bin/env bash

set -ue -o pipefail
export LC_ALL=C

DATETIME=`date +"%Y%m%d%H%M%S"`
USER=""

if [ $# -ge 1 ]; then
   case "$1" in
       --help|-h)
           echo "Usage: pubkey [<username> [<url>]]"
           echo ""
           exit 0
           ;;
       *)
           USER=$1
   esac
else
    echo "User name: "
    array=()
    for home in `ls /home`; do
        array+=($home)
        echo -e "\t${#array[@]}) $home"
    done

    read -p "select user number: " NO
    if [ -z "$NO" ]; then
        exit
    fi
    if [ $NO -le ${#array[@]} ]; then
        USER=${array[NO-1]}
    else
        exit 1
    fi
fi

KEYFILE="/home/$USER/.ssh/authorized_keys"
if [ -f $KEYFILE -a -s $KEYFILE ]; then
    awk '{gsub(/^$/,"unknown",$3);print NR, $3}' $KEYFILE

    echo
    echo -e "\t1) add"
    echo -e "\t2) delete"
    read -p "select action number: " NO
    if [ "$NO" = "1" ]; then
        :
    elif [ "$NO" = "2" ]; then
        read -p "delete number: " NO
        cp -a $KEYFILE $KEYFILE.$DATETIME
        sed -i -e "${NO}d" $KEYFILE
        echo ""
        echo "Success!"
        echo -e "\tBackup file: $KEYFILE.$DATETIME"
        exit 0
        :
    else
        exit 0
    fi
fi

cp -a $KEYFILE $KEYFILE.$DATETIME
echo
echo "add public key from url."
if [ $# -ge 2 ]; then
    URL=$2
else
    read -p "URL: " URL
fi

read -p "Comment (whose key is it?): " COMMENT
if [ -z $COMMENT ]; then
    exit 1
fi
echo
echo -e "get public key file from <$URL>\n  and add to $KEYFILE"
echo -e "\tComment: $COMMENT"
echo
echo -e "\t1) OK"
echo -e "\t2) NG"
read -p "OK? :" NO
if [ "$NO" != "1" ]; then
    exit 0
fi

wget $URL -O - | awk "{gsub(/^.*\$/,\"$COMMENT\",\$3);print}" >> $KEYFILE

echo "Success!"
echo -e "\tBackup file: $KEYFILE.$DATETIME"
```

root用なんだけども一般ユーザーでも実行できる。
一般ユーザーならユーザー選択をなくした方がいいなと思いつつ、それなら`cat`でいいか…とか。

そもそも`cat`で鍵を追加できないような人は意味も分からずこのスクリプトを使うことはやめた方が良いか、とか意味が分るなら自分でwgetしてcatした方が早いかな、とか考えてたらドツボ。

変更のたびにバックアップを取るようにしているんだけれども、今時時刻ファイル名のバックアップはどうなの、とかもある。


かと言ってWeb上でユーザー管理できるツールを入れるのは、せっかく公開鍵でしかログインできないようにしてるのにセキュリティの懸念箇所を増やすのもな、とか思って考えもの。
良い方法はないものか。
Cognos 10 BI の自己学習教材

Cognos 10 BIの代表的な機能を自習する教材をこちらに公開しました。

完全初心者向けですので、Cognosをちょっと触ってみたい、という方は是非ご活用下さい。

また、元のExcelファイルを欲しいという方は、メールにてお問い合わせ下さい。

■ Cognos 10 BIの主要機能紹介資料
http://www.slideshare.net/ShinsukeYamamoto/ibm-cognos10-bi

■ Cognos BI セットアップ
http://www.slideshare.net/ShinsukeYamamoto/cognos1021-install

■ Cognos Connection
http://www.slideshare.net/ShinsukeYamamoto/2-cognos-connection

■ Query Studio
http://www.slideshare.net/ShinsukeYamamoto/3-query-studio

■ Report Authoring
http://www.slideshare.net/ShinsukeYamamoto/4-report-authoring

■ Framework Manager
http://www.slideshare.net/ShinsukeYamamoto/5-framework-manager

■ Cognos Administration
http://www.slideshare.net/ShinsukeYamamoto/6-cognos-administration-69066986

■ Active Report
http://www.slideshare.net/ShinsukeYamamoto/7-active-report


この学習教材が完了して、もう少しレポート開発を磨きたいという方は、こちらにて学習下さい。
**Cognos Report Authoring 逆引き辞典 - 目次一覧**
http://qiita.com/shinyama/items/756cb4a40d31f6cee9f8
PostgreSQL　シーケンス操作　備忘録

- シーケンス値表示

    - 現在値
```
SELECT last_value FROM シーケンス名;
```
    - 最小値
```
SELECT min_value FROM シーケンス名;
```

    - 最大値
```
SELECT max_value FROM シーケンス名;
```

<br>

- シーケンス値更新

```
SELECT setval('シーケンス名' , 更新する値);
```
middleman、出力ファイルの軽量化

いざmiddlemanでサイトを構築となったら、忘れずに設定しとくと幸せになれるかもしれません！
サイト表示高速化に役立つはずです。

#CSSとJavascriptファイルのminify処理
これらはデフォルトで用意されているので、config.rbのコメントアウトを解除すればOK
ついでに無駄なlineコメントも抹殺！

```ruby:config.rb
configure :build do
  compass_config do |config|
      config.line_comments = false
  end
  activate :minify_css
  activate :minify_javascript
end
```

ビルド時ファイルがminify化されて出力されます。

#HTMLのminify処理
こちらはgemをbundleする必要があります。

```ruby:Gemfile
gem "middleman-minify-html"
```

config.rbの上記したCSSやJSと同じ並びに追記

```ruby:config.rb
configure :build do
  compass_config do |config|
      config.line_comments = false
  end
  activate :minify_html  
  activate :minify_css
  activate :minify_javascript
end
```

#画像の圧縮
こちらもHTML同様、新規にgemを追加します。

```ruby:Gemfile
gem 'middleman-imageoptim'
```

config.rbの上記したCSSやJSと同じ並びに追記

```ruby:config.rb
configure :build do
  compass_config do |config|
      config.line_comments = false
  end
  activate :minify_html  
  activate :minify_css
  activate :minify_javascript
  activate :imageoptim do |options|
    options.pngout = false
    options.svgo  = false
  end
end
```

この状態でbuildすると

```
imageoptim  DOMAIN/***/images/***/**/*****.jpg (3.66% / 7KiB smaller)
```
コンソールにずらずらと圧縮結果が流れます。
いろいろオプションがあるので以下で確認してください。

[imageoptim options](https://github.com/plasticine/middleman-imageoptim)

#テキストファイルのGzip

これは公開しようとしているサーバーがgzipに対応していないとダメ。

[HTTP Compression Test](http://www.whatsmyip.org/http-compression-test/)

上記チェッカーで対応しているか確認しましょう。

```ruby:config.rb
configure :build do
  activate :minify_html  
  activate :minify_css
  activate :minify_javascript
  activate :imageoptim do |options|
    options.pngout = false
    options.svgo  = false
  end
  activate :gzip
end
```

buildすると

```
gzip  *******/***/****/**.html.gz (13.9 KB smaller)

```
がずらずら流れます。
SublimeText3でPythonのraw_inputを使えるようにする

# タイトル通り、SublimeText3でPythonのraw_inputを使ってみたかったのでメモ
やり方は以下の２通り。個人的にはコマンド一つでビルド可能になる２がオススメです。

1. 実行ファイル上でメニューバーから
　`Tools > SublimeREPL > Python > Python RUN current file`
を選択。これでraw_inputを含んだPythonファイルの実行が可能

2. 新規のBuild　Systemを作成。まず、メニューバーから
 `Tools > Build System > New Build System `
を選択。

```text:untitled.sublime-build
{
    "target": "run_existing_window_command", 
    "id": "repl_python_run",
    "file": "config/Python/Main.sublime-menu"
}
```
とし、任意のファイル名で保存
commnd + shift + B （Winの場合はctrl + shift + B ?）後に
上で作ったBuild Systemを選択することで実行可能。
【Ruby on Rails】「コードレビュー」してもらった。

#言語(Ruby)
- **「ture/false判定をするメソッドはメソッド名の最後に?をつける習慣がRubyにはある」**

```ruby:isXxx.rb
#### ture/false判定をするメソッドはメソッド名の最後に?をつける習慣がRubyにはある ####

# def isXxx()
#  # 処理
# end
def isXxx?
 # 処理
end

#### 呼出しも同じく ####
# if isXxx() ? true : false
if isXxx? ? true : false
```
Rubyってそんな定義できるんですね。

- **「Rubyはキャメルケースじゃなくてスネークケースね」**

```ruby:notation.rb
#### Rubyはキャメルケースじゃなくてスネークケースね ####

# isXxx()
is_xxx()
```
言われてみればRubyのメソッドってどれもこれもスネークケースな気がする。
ちなみに、Sublime Textでスネークケース⇔キャメルケースを相互変換するプラグインを教えていただいたので共有。
(https://github.com/jdc0589/CaseConversion)

#フレームワーク(Rails)
- **「トップリダイレクトは'/'ではなくてroot_pathの方が変更に強くなる。topが必ず'/'とは限らないから」**

```ruby:redirect.rb
#### トップリダイレクトは'/'ではなくてroot_pathの方が変更に強くなる。 ####
#### topが必ず'/'とは限らないから ####

# redirect_to '/'
redirect_to root_path
```
完全に知識不足。Railsには色々用意されてるのね...

#条件文
- **「returnする時は三項演算子は使わなくていいよ」**

```ruby:return.rb
#### returnする時は三項演算子は使わなくていいよ ####

# return result == 0 ? true : false 
return result == 0
```
Java上がりなのもあって三項演算子で書きたくなるけど、これだとシンプルで◎

#繰返し文
- **「rubyの配列操作はできるだけ標準装備のイテレータを使うように」**

```ruby:forFind.rb
#### rubyの配列操作はできるだけ標準装備のイテレータを使うように ####

# for str in list
#   if str == "dummy" ? return str : next
# end
return list.find{|str|
  str == "dummy"
}
```
Java上がりなのもあってfor~eachで回しちゃってたけど、Rubyだとfor~findで出来るらしい。

ちなみに、単純なfor~eachは以下の通り。
( @sakahukamaki さんからご指摘いただきました。 )

```ruby:forEach.rb
list.each{|str|
  # 処理
}
```

#正規表現
- **「正規表現は%r{パターン}を使うとエスケープ処理不要となるっぽいね」**

```ruby:regexp.rb
#### 正規表現は%r{パターン}を使うとエスケープ処理不要となるっぽいね ####

# /http:\/\/xxxx\.com\// =~ str
%r{http://xxx.com/} =~ str
```
正規表現ってエスケープ文字が増えたり長くなればなるほど可読性下がるから、こういうの出来るの良い◎

#その他当たり前な事
- **「こういうのを早期リターンと言って、こうすることでネストが深くなるのを防いで読みやすくできる」**

```ruby:reutrnEarly.rb
def hoge(param)

#### こういうのを早期リターンと言って、こうすることでネストが深くなるのを防いで読みやすくできる ####

# # 処理A()
# # 処理B()
# if param.blank?
#   return
# end

  return unless param.blank?
  # 処理A()
  # 処理B()
end
```
処理A→処理Bをした後にparamの判定をしてると、処理A→処理Bのコストが勿体ないので、先にparamの判定をしてしまおうというモノ。
これは単純なミス。
早期リターンは知ってたのに実装してしまってたという凡ミス。

- 「if文多いと読むのが面倒だから、こっちの方がシンプルだね」

```ruby:simple.rb
#### if文多いと読むのが面倒だから、こっちの方がシンプルだね ####

if !request.referer ||
   request.referer && 
```
Maya | 選択したオブジェクトのポリゴン数を調べる

```py
import maya.cmds as cmds

for obj in cmds.ls(selection=True):
    shape = cmds.listRelatives(obj, shapes=True, type="mesh")
    if shape:
        poly_num = cmds.polyEvaluate(shape[0], triangle=True)
        print obj, poly_num
```
SPF/DKIMのメモ

どちらもメールの送信者を検証する仕組みだが、微妙に違う箇所があるのでメモ
特にFromとReturn-Pathを別にしている場合に注意が必要

# SPF

* (受信者が)Return-Path(RCPT TO) に指定されたドメインを見る
  * Ｆｒｏｍではない
* 正しく設定しておかないとGmailではユーザアイコンが「？」になる

# DKIM

* (署名者が)From に指定されたドメインを見る
* 正しく設定しておかないとGmailではメールの横に赤い鍵マークが出て警告される
c++ builder > TLabel > 指定の枠におさまるString文字列の長さの取得 (5文字単位)

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

関連 http://qiita.com/7of9/items/4caba5c87522aa410447
関連 http://qiita.com/7of9/items/490f6b00b197f4e7df6e

TLabelを用意した時、そこにどの長さまでString文字列を代入できるか確認したくなった。

以下のgetMaximumStringLength()を実装した。

```Unit1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
//	String kDummyString = L"START_jfkldsajkfjdklsajfkldjsklfjaksdljfkldsjalkjfsdk_END";

//	Label1->Caption = kDummyString;

	int mxlen = getMaximumStringLength(Label1);
	String msg = L"Maxsize:" + IntToStr(mxlen);
	OutputDebugString(msg.c_str());

//	fitWithDesignedWidth(Label1);


	int nop=1;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::fitWithDesignedWidth(TLabel *lblPtr)
{
	int fntsiz[] = { 16, 14, 12, 10, 8 }; // 大きいサイズから
	int size = sizeof(fntsiz) / sizeof(fntsiz[0]);

	bool widthIsOk;

	for(int idx=0; idx<size; idx++) {
		lblPtr->Font->Size = fntsiz[idx];
		widthIsOk = checkWidthIsLargeEnough(lblPtr);
		if (widthIsOk) {
			break;
		}
	}
}

int __fastcall TForm1::getMaximumStringLength(TLabel *lblPtr)
{
	static const int kMaxLoop = 8;
	static const int kIncrease = 5;

	bool widthIsOk;
	int maxLen = 10;

	lblPtr->Caption = L"1234567890";

	int loop = 0;
	while(loop < kMaxLoop) {
		lblPtr->Caption = lblPtr->Caption + L"SAAAE"; // [kIncrease]に合わせて文字を用意
		widthIsOk = checkWidthIsLargeEnough(lblPtr);
		if (widthIsOk == false) {
			lblPtr->Caption = lblPtr->Caption.SubString(0, lblPtr->Caption.Length() - kIncrease);
			break;
		}
		maxLen += kIncrease;
		loop++;
	}

	return maxLen;
}

bool __fastcall TForm1::checkWidthIsLargeEnough(TLabel *lblPtr)
{
	int orgWdt = lblPtr->Width;

	// to check
	lblPtr->AutoSize = true;
	int aftWdt = Label1->Width;

	// recover
	lblPtr->AutoSize = false;
	lblPtr->Width = orgWdt;

	return (aftWdt < orgWdt);
}
```

```txt:結果
デバッグ出力: Maxsize:30 プロセス Project1.exe (752)
```

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/1fff985e-098c-1521-ad23-7841cce7a10b.png)
第5回つぶやき勉強会

```rb
class Hoge  
  def hoge
    1
  end

  @@piyo = Proc.new { hoge }

  def fuga
    @@piyo.call
  end
end

Hoge.new.fuga => # これはなんですか？
```



----

```rb
class Hoge
  def hoge
    Piyo.set
    @v
  end

  class Piyo
    def self.set
      @v = 2
    end
  end
end

Hoge.new.hoge => # これはなんですか？
```

----
macで消えちゃったテキストファイルを復旧する


重すぎてmacの調子が、と思ったら大事なファイルが消えてる、、、、
気分転換に散歩。ほぼ諦めモードからの復旧作業。


探す

```
sudo find . -type f -name "*.txt" | xargs grep "テキストに書いてあった文字"
```

見つかる

```
./.DocumentRevisions-V100/PerUID/501/1/com.apple.documentVersions/00145B6D-5A27-4CE5-A4AF-42428EBCA25F.txt:テキストに書いてあった文字
./.DocumentRevisions-V100/PerUID/501/1/com.apple.documentVersions/005C1B1B-78F5-4B89-A6C3-702BA2DF880C.txt:テキストに書いてあった文字
./.DocumentRevisions-V100/PerUID/501/1/com.apple.documentVersions/006CF4B6-2784-4D05-B2AF-7332AF1BE7C3.txt:テキストに書いてあった文字
./.DocumentRevisions-V100/PerUID/501/1/com.apple.documentVersions/00E2F615-39A2-41F2-8E92-ED38755C4ADD.txt:テキストに書いてあった文字
```

なんだこのフォルダは。。

```
cd /
```

見つかる

```
ls -la
.DocumentRevisions-V100
sudo cd /.DocumentRevisions-V100
```

おめあてのものをコピーする
一番上が最新。

```
sudo ls -lt PerUID/501/1/com.apple.documentVersions
sudo cp PerUID/501/1/com.apple.documentVersions/069E2AFB-BBEA-4369-9E09-AE572F0BC0BD.txt ~
```


残っててくれてありがとう！！！
C++ builder > TLabel >Caption文字列を指定の枠におさめるためにFontサイズを自動調整

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

http://qiita.com/7of9/items/490f6b00b197f4e7df6e
の続き。

TLabelのCaptionに任意の文字列を代入するとき、フォームデザインで設計したTLabel.widthプロパティにおさまるようにフォントサイズを変更したい。

```Unit1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
	String kDummyString = L"START_jfkldsajkfjdklsajfkldjsklfjaksdljfkldsjalkjfsdk_END";

	Label1->Caption = kDummyString;

	int fntsiz[] = { 16, 14, 12, 10, 8}; // 大きいサイズから
	int size = sizeof(fntsiz) / sizeof(fntsiz[0]);

	bool widthIsOk;

	for(int idx=0; idx<size; idx++) {
		Label1->Font->Size = fntsiz[idx];
		widthIsOk = checkWidthIsLargeEnough(Label1);
		if (widthIsOk) {
            break;
		}
	}

	int nop=1;
}
//---------------------------------------------------------------------------

bool __fastcall TForm1::checkWidthIsLargeEnough(TLabel *lblPtr)
{
	int orgWdt = lblPtr->Width;

	// to check
	lblPtr->AutoSize = true;
	int aftWdt = lblPtr->Width;

	// recover
	lblPtr->AutoSize = false;
	lblPtr->Width = orgWdt;

	return (aftWdt < orgWdt);
}
```

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/332ed776-577e-54aa-f88f-4f347ba27288.png)

ただし、こういう処理を多くのTLabelに対して行っていいかは要検討。
フォームに対して１つか２つ程度なら問題ないと考えている。
iPhoneのsafariでだけform要素のスタイルが特別すぎてつらい


`form`要素の`input`など、iPhoneだけで特別なスタイルが当たってしまうことがある。
全てのcssを上書きして打ち消すのはなかなか面倒だが、一括で消すプロパティがあった。

```css
-webkit-appearance: none;
```

これでwebkit系のボタンなどのUIを消してプレーンな状態にできる。
Power BI で地理的解析（応用編２）


# はじめに
[前回](http://qiita.com/Masutani/items/34cad3287fba9ba44ff4)は任意形状のエリア情報を与えて、コロプレス図を表示する方法を紹介しました。現在プレビュー機能ですが、他のビジュアルと比較しても特段不安定な点はありませんでしたので、すぐに実戦投入できそうです。

今回は、もう一つの地図系のプレビュー機能、ArcGISマップを紹介します。
ArcGIS は知る人ぞ知る、GIS業界の覇者ESRI社が提供するGISシステムの名称です。
本体価格は20万円を超える、プロフェッショナルツールですが、サーバーやクラウドサービス、様々なSDKなどを用意しており、この分野で全方位の展開を行っています。

Microsoftと戦略的な提携をしており、例えばSharePointなどに埋め込む製品など、地図が利用されるシーンでは、MicrosoftのBingマップではカバーできない分野で協調しているようです。PowerBIにArcGISビジュアルが提供された流れは自然であり、ArcGISのパワーを知っている人にとっては大いに期待したいところです。

# 4.ArcGISマップ

さて、既存のマップでも十分様々なタスクに対応可能ですが、ArcGISを使うことで、より適応範囲を広げられます。

例としてベタですが、Uberのデータを使ってみましょう。[Uberが提供しているサンフランシスコのGPSトラックデータ](https://github.com/dima42/uber-gps-analysis/blob/master/gpsdata/all.tsv)を使ってみます。TSV形式ですが、PowerBIで簡単に読み込めます。

このGPSトラックですが、2007年1月初旬の25000トリップについてのログになっており、レコード数は120万レコードになります。このレベルのデータでもPowerBIでは問題なく読み込むことができます。さすがに、120万ものデータポイントを表示させるのは無理なので、各トリップの中心点を求め、25000レコードにしてみました。表示させてみましょう。やり方は簡単です、緯度、経度バケットにそれぞれフィールドをドラッグアンドドロップするだけです。

![uberpowerbi1.PNG](https://qiita-image-store.s3.amazonaws.com/0/146939/3bb847c6-bc7d-02e2-eb68-fe64aebe5063.png)

あれ、おかしいですね。サンフランシスコの北部のエリアに点が表示されていません。これはマップビジュアルの限界であり、データ数約5000点が限界とのことです。

元データをQGISで表示させてみると、以下のようになりますが、サンフランシスコ半島北端部はもちろん、ゴールデンゲートブリッジの先、オークランド、バークリーのあたりまでUberのGPSログが広がっています。

![uberqgis.PNG](https://qiita-image-store.s3.amazonaws.com/0/146939/34bdcc01-f553-0512-6f98-3515edd310d6.png)

QGISでも100万点を超えるサイズのデータは描画に数十秒かかってしまいます。

それでは、PowerBI上でビジュアルをマップからArcGISマップに変更してみましょう。緯度、経度バケットを共有するのでビジュアルを変更するだけで大丈夫です。

![uberpowerbi2.PNG](https://qiita-image-store.s3.amazonaws.com/0/146939/5497c40d-9aaf-2ec0-383c-515d18293d42.png)

残念ながら、ArcGISマップでもデフォルトのマップと同じ表示限界が適用されるようで、全体を表示することができませんでした。
しかし、通常のマップとは異なり、データポイントのシンボルを細かく調整可能です。ここでは見やすいように、データポイントのサイズを小さくして、密度などがわかりやすいように透明化しました。

また次のように、ヒートマップや他のコロプレスマップとの重ね合わせなども可能になっています。

![uberpowerbi3.PNG](https://qiita-image-store.s3.amazonaws.com/0/146939/6426baf5-12b9-f3fb-9324-2937ffd43e33.png)

![uberpowerbi4.PNG](https://qiita-image-store.s3.amazonaws.com/0/146939/b8c110ff-915e-1a68-dc6f-53202b24aedd.png)

下の図は人口密度をオーバーレイしています。

このように、本格的なGIS製品に迫る表現力を手軽に利用できるので、益々PowerBIの利用用途が広がりそうですね。

[Power BI で地理的解析（基礎編）](https://qiita.com/Masutani/items/d91361db4d59d6721d09)
[Power BI で地理的解析（応用編１）](https://qiita.com/Masutani/items/34cad3287fba9ba44ff4)
[Power BI で地理的解析（応用編２）](https://qiita.com/Masutani/items/513ed61afbf0f316c936)
tensorflowメモ：tf.app.*

version: 0.11.0

# コマンドラインオプション
簡単なコマンドラインオプションを定義できます．

## 使い方
```python:app.py
import tensorflow as tf

tf.app.flags.DEFINE_boolean("bool", True, "bool value")
tf.app.flags.DEFINE_integer("int", 0, "int value")
tf.app.flags.DEFINE_string("str", "str", "string value")
tf.app.flags.DEFINE_string("test_str", "test", "test string value")

def main(argv):
  flags = tf.app.flags.FLAGS
  
  print(flags.bool, flags.int, flags.str, flags.test_str)


if __name__ == '__main__':
    tf.app.run()
```

```bash
% python test.py --help
usage: test.py [-h] [--bool [BOOL]] [--nobool] [--int INT] [--str STR]
               [--test_str TEST_STR]

optional arguments:
  -h, --help           show this help message and exit
  --bool [BOOL]        bool value
  --nobool
  --int INT            int value
  --str STR            string value
  --test_str TEST_STR  test string value

% python test.py --int 1000 --test_str "TEST"
(True, 1000, 'str', 'TEST')

```



## API
### 値の追加
#### tf.app.flags.DEFINE_boolean(flag_name, default_value, docstring)
#### tf.app.flags.DEFINE_integer(flag_name, default_value, docstring)
#### tf.app.flags.DEFINE_string(flag_name, default_value, docstring)

**Args**:

- flag_name: 変数名 & コマンドライン・オプション名
- default_value: デフォルト値
- docstring: コマンドライン ヘルプ

### 値の取得
#### tf.app.flags.Flag
```python
tf.app.flags.DEFINE_boolean(test_bool, True, "test bool value")
tf.app.flags.Flag.test_bool #-> True
```

### パース
#### tf.app.run(main=None)
**Args**:
- main: コマンドラインをエスケープした後に実行するargvを引数とする関数func(argv)
tensorflowがエスケープできなかった残りのコマンドライン引数が渡される．
Noneの場合 `__main__.main` が実行される
Workplace by FacebookにGraph APIで投稿する

とりあえずメモ書き。
まだ制限はありますが、Graph APIでWorkplaceに投稿できます。

参考) Graph API for Workplace
https://developers.facebook.com/docs/workplace/custom-integrations/overview

# アクセストークンとコミュニティIDの取得方法
1. Admin権限を持っているユーザーでログイン
2. 社内ダッシュボードから、設定メニュー(左メニューの一番下)を開く
3. 基本設定(翻訳がメニューと異なっている)から、外部アプリでメンバーを同期にチェックを入れる。その下のアクセストークンとコミュニティIDを使う。

# メンバーIDとメンバーアクセストークン(impersonate_token)の取得方法
{member-id}エンドポイントに対して、GETリクエストすることでメンバーアクセストークンが取得できる 。
まず、上記で取得したアクセストークンを使って、メンバIDを取得する。

```
curl -X GET "https://graph.facebook.com/<コミュニティID>/members?access_token=<アクセストークン>"
```

```
{
  "data": [
    {
      "name": "Masaki Kubomura",
      "id": "100000000000001",
      "administrator": true
    },
    {
      "name": "Taro Yamada",
      "id": "100000000000002",
      "administrator": true
    }
  ],
  "paging": {
    "cursors": {
      "before": "MTAwMDEzODUxNjc3Mzk2",
      "after": "MTAwMDEzODkyNTU5ODQ4"
    }
  }
}
```

次に、メンバIDに対して、GETリクエストして、メンバーアクセストークンを取得する。

```
curl -X GET "https://graph.facebook.com/<メンバーID>?fields=impersonate_token&access_token=<アクセストークン>"
```

```
{"impersonate_token":"<メンバーアクセストークン>","id":"100000000000001"}
```

# グループIDの取得方法
```
curl -X GET "https://graph.facebook.com/<コミュニティID>/groups?fields=id,name&access_token=<アクセストークン>"
```

```
{
  "data": [
    {
      "id": "200000000000001",
      "name": "Test Group"
    },
    {
      "id": "200000000000002",
      "name": "Random"
    }
  ],
  "paging": {
    "cursors": {
      "after": "MTU5MTA1OTU5Nzg2Njc5Ng==",
      "before": "MTgwMDk1Njc0Njg2MDQ3NQ=="
    },
    "next": "https://graph.facebook.com/v2.8/<コミュニティID>/groups?fields=id,name&icon_size=16&access_token=<アクセストークン>&limit=25&after=MTU5MTA1OTU5Nzg2Njc5Ng%3D%3D"
  }
}
```

# 投稿する

```
curl -X POST "https://graph.facebook.com/<メンバID or グループID/feed?message=<URLEncode(UTF-8)テキスト>&access_token=<アクセストークン or メンバーアクセストークン>
```

注意) グループに投稿する場合、そのグループに所属しているメンバーのメンバーアクセストークンで投稿する。
C++ builder XE4, 10.2 Tokyo > TLabel > Caption文字列が指定の枠を超えてしまうかのチェック

```txt:動作環境
C++ Builder XE4
RAD Studio 10.2 Tokyo Update 2 (追記: 2017/12/28)
```

TLabelのCaptionに任意の文字列を代入するとき、その文字列が指定の枠(TLabelのwidth)を超えてしまうかどうかの確認。

該当のTLabelはAutoSizeプロパティをfalseとしている、という前提。

```Unit1.h
//---------------------------------------------------------------------------

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <System.Classes.hpp>
#include <Vcl.Controls.hpp>
#include <Vcl.StdCtrls.hpp>
#include <Vcl.Forms.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:	// IDE で管理されるコンポーネント
	TLabel *Label1;
	TButton *Button1;
	TLabel *Label2;
	void __fastcall Button1Click(TObject *Sender);
private:	// ユーザー宣言
public:		// ユーザー宣言
	__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
```

```Unit1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
	//String kDummyString = L"START_jfkldsajkfjdklsajfkldjsklfjaksdljfkldsjalkjfsdk_END";
	String kDummyString = L"AAA";

	int orgWdt = Label1->Width;

	Label1->Caption = kDummyString;

	Label1->AutoSize = true;

	int aftWdt = Label1->Width;

	Label1->AutoSize = false;

	if (aftWdt > orgWdt) {
		OutputDebugString(L"too large font size");
	} else {
		OutputDebugString(L"font size is appropriate");
	}

	int nop=1; // for breakpoint
}
//---------------------------------------------------------------------------
```

メッセージ欄に以下が出ていれば、枠を超えてしまっている。

> デバッグ出力: too large font size プロセス Project1.exe (1156)
DjangoでPDFを出力する

#Djangoチュートリアルに則ってPDFを出力してみる

DjangoでPDF生成ができるということで、チュートリアルに則ってPDFを出力してみました。

#準備

```
(virtualenv) $ sudo pip install reportlab
(virtualenv) $ django-admin startproject pdf_creater
(virtualenv) $ cd pdf_creater
(virtualenv) $ python manage.py startapp myapp
```

```pdf_creater/urls.py
from django.conf.urls import include, url
from django.contrib import admin

urlpatterns = [
    url(r'^myapp/', include('myapp.urls')),
    url(r'^', include('myapp.urls',namespace='myapp')),
    url(r'^admin/', admin.site.urls),
]
```

```myapp/urls.py
from django.conf.urls import url
from . import views

urlpatterns = [
    url(r'^$', views.index, name='index'),
]
```

というわけでindexでいきなりPDFをダウンロード開始させるようにしてます。

#viewsの作成
チュートリアルのまんまです。

```myapp/views.py
import sys, codecs
sys.stdout = codecs.getwriter('utf-8')(sys.stdout)

from django.http.response import HttpResponse
from reportlab.pdfgen import canvas

def index(request):
    response = HttpResponse(content_type='application/pdf')
    response['Content-Disposition'] = 'attachment;filename="createdfile.pdf"'

    p = canvas.Canvas(response)
    p.drawString(100,100,'newPDF')

    create = p.showPage()
    p.save()

    return response
```

migrateして、runserver


createdfile.pdfという名前でPDFダウンロードが開始されます。
フォームからテキストファイル受け取ってPDFとかにも出来るような感じはしますね。

カスタマイズがうまく行けば領収書発行アプリ程度にはなりそう。
link > ロジット関数とロジスティック関数 @ mathwords

@ Python 機械学習プログラミング by Sebastian Raschkaら

- ロジット関数
- ロジスティック関数

二者が逆関数であるということを本を読み返しながら気になった。

逆関数かどうかは数式の変形で済む。

例としてこちら
http://mathwords.net/logitkansu

これまで意識してきたロジスティック関数は「あらゆる数値を0から1の範囲に落とし込む」効果がある。

一方で、その逆関数のロジット関数は「0から1の範囲の数値をあらゆる数値に変換する」効果があるのだろう。

ロジット関数をTensorFlowなどで使うことがあるかどうかは現段階では不明だ。
MNIST for Expertsの変数logitsはどちらなのか、未調査。
ChromeのUser Agent変更時に元のUser Agentを送信することがある

Google Chromeにはデベロッパーツール等で、User Agentを変更する機能があるのですが、そこでハマった問題点について。


#症状
ChromeのデベロッパーツールでUser Agentを変更した状態で各サイトにログイン後、
URL欄から直接URLを変更したりすると高頻度でセッションが切断されてしまう。

#原因
Chromeの先読みページ取得機能で、先読み取得の時だけUserAgentがデベロッパーツールの設定を無視して標準のUser Agentで見に行くため。
URL欄の下に以前にアクセスした候補が表示された段階で見に行くようです。

今回の場合、Fuel phpで構築されている開発中サイトで、User Agentが変わると
セッションハイジャック対策でセッションが破棄されてしまうので、
URL欄を弄ってる際に先読み取得が発動すると、セッション破棄されてしまいます。

#解決法(回避法)
設定→詳細設定→プライバシー→予測サービスを使用してページをより迅速に読み込む　をOFF

ちなみに、ONにしてても問題ない環境もあるようで、細かい条件は不明です。
Windows7 Enterprise SP1
Chromeバージョン  54.0.2840.99 m
Reduxのチュートリアルを試す環境を作るのにcreate-react-appを使う 



[Reduxのチュートリアル](http://redux.js.org/docs/basics/)はサンプルコードがES6で提供されています。チュートリアルを試すにはbabelなどのパッケージをインストールするなど環境を整える必要があります。

簡単に環境を作れるnpmパッケージ [create-react-app](https://github.com/facebookincubator/create-react-app)[^1] を使って、チュートリアルを進めるための環境を作る手順をまとめます。


#### 対象者

- Reduxがどんなものかチュートリアルを試してみたい
- ES6を利用した環境のセットアップ方法がよくわからない

### create-react-appとは

`create-react-app`はReactプロジェクトのスケルトンを作成してくれるコマンドラインツールです。`create-react-app`でプロジェクトを作成すると、`react`や`react-scripts`というパッケージを含めた形でプロジェクトを作成してくれます。この`react-scripts`は、babel、eslint、webpack、loaderなどの開発に必要なパッケージをまとめたパッケージです。
   

#### 手順

1. create-react-appをインストール
2. npmプロジェクトを作る
3. reduxをインストール
4. コードを書く


##### 1. create-react-appをインストール
npmパッケージの`create-react-app`をインストールします。

```bash
npm install -g create-react-app 
```

##### 2. npmプロジェクトを作る

create-react-appでプロジェクトを作成する

```bash
create-react-app redux-tutorial
cd redux-tutorial
npm start
```

npm startを実行すると以下のログがコンソールに出力されて、ブラウザが自動で開きURLにアクセスします。

```
Compiled successfully!

The app is running at:

  http://localhost:3000/

Note that the development build is not optimized.
To create a production build, use npm run build.
```



プロジェクトディレクトリの内容は次のようになります。パッケージのインストールだけではなくindex.jsやApp.jsファイルも作成されます。

```bash:プロジェクトディレクトリのtreeコマンド表示結果
.
└── redux-tutorial
    ├── README.md
    ├── node_modules
    │   ├── asap
    │   ├── core-js
    │   ├── encoding
    │   ├── fbjs
    │   ├── fsevents
    │   ├── iconv-lite
    │   ├── is-stream
    │   ├── isomorphic-fetch
    │   ├── js-tokens
    │   ├── loose-envify
    │   ├── nan
    │   ├── node-fetch
    │   ├── object-assign
    │   ├── promise
    │   ├── react
    │   ├── react-dom
    │   ├── react-scripts
    │   ├── ua-parser-js
    │   └── whatwg-fetch
    ├── package.json
    ├── public
    │   ├── favicon.ico
    │   └── index.html
    └── src
        ├── App.css
        ├── App.js
        ├── App.test.js
        ├── index.css
        ├── index.js
        └── logo.svg
```

```js:packege.json
{
  "name": "redux-tutorial",
  "version": "0.1.0",
  "private": true,
  "devDependencies": {
    "react-scripts": "0.7.0"
  },
  "dependencies": {
    "react": "^15.3.2",
    "react-dom": "^15.3.2"
  },
  "scripts": {
    "start": "react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test --env=jsdom",
    "eject": "react-scripts eject"
  }
}

```

##### 3. reduxをインストール
reduxをインストールします。チュートリアルで利用するreact-reduxもインストールします。

```bash
npm install --save redux react-redux
```


##### 4. コードを書く
以上で、チュートリアルを進めるための準備ができました。あとはチュートリアルを読みながらコードを写経していけばReduxを試すことができます。


[^1]: Reactの[公式ドキュメント](https://facebook.github.io/react/docs/installation.html)のセットアップにもcreate-react-appを使うようになっていました。また、サンプルコードがES6のものに更新されていますね(2016/11時点)。
簡単に AWS EC2 にPython3 + Tornado の動作環境を構築した。

# 概要
「[Pythonを始めよう！ 〜①環境構築編〜](http://qiita.com/gcfuji/items/199f6e8fe76a2f5547d9)」の記事を参考にローカルに開発環境が構築できたので、今度は運用開始に向けて、 EC2 に Python3 + Tornado の動作環境を最小手順で作成してみました。

作業時間目安：10分

本番運用ではフトンロエンドでReactを利用し、バックエンドでTornadoを利用予定です。

# 目標

ブラウザから EC2 にアクセスして 「Hello, world」が表示されることを目標とします。

# 構築内容

1. Amazon Linux
2. Python 3.5.2
3. Tornado 4.4

## Python3 インストール手順

###01 . 必要な依存関係をインストールします。

```
$ yum groupinstall "Development Tools"
$ yum install mlocate
$ yum install openssl-devel
$ yum install bzip2-devel
$ yum install zlib-devel bzip2 bzip2-devel readline-devel sqlite3 sqlite-devel openssl-devel
```

###02 . Pyenvをインストールします。

```
$ git clone https://github.com/yyuu/pyenv.git ~/.pyenv
```

###03 . Pyenv のパスを通します。

```
$ vim ~/.bashrc
-----
# Add Pyenv Path
export PYENV_ROOT="${HOME}/.pyenv"
if [ -d "${PYENV_ROOT}" ]; then
export PATH=${PYENV_ROOT}/bin:$PATH
eval "$(pyenv init -)"
fi
```

設定を即時反映する。

```
$ source ~/.bashrc #.bashrc
```

###04 . Python をインストールします。

Python のバージョンを確認する。

```
$ pyenv install --list
```

Python3 をインストールする。

```
$ pyenv install 3.5.2
```

Python のバージョン 2.7.12から 3.5.2に切り替える。

```
$ python -V
Python 2.7.12
$ pyenv global 3.5.2
$ python -V
Python 3.5.2

```

## Tornad インストール手順

###01 . pip を最新に更新します。

```
$ pip install --upgrade pip
```

###02 . Tornadoをインストールします。

```
$ pip install tornado
```

## Hello world プログラム準備

今回は /home/ec2-user/helloworld/ の直下にプログラムを配置します。


```python:helloword.py
import tornado.ioloop
import tornado.web

class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.write("Hello, world")

def make_app():
    return tornado.web.Application([
        (r"/", MainHandler),
    ])

if __name__ == "__main__":
    app = make_app()
    app.listen(8888)
    tornado.ioloop.IOLoop.current().start()
```

##動作確認

###01 . Hello world プログラムを実行する。

```
# python helloworld.py
```

###02 . Portを指定したURLでブラウザからアクセスする。
e.g.) ```http://ec2-xxx-xxx-xxx-xxx.ap-northeast-1.compute.amazonaws.com:8888```

![helloworld.png](https://qiita-image-store.s3.amazonaws.com/0/132495/a5a8a868-28cc-53ef-4296-1825285db4da.png)

※ もしもうまく表示されないときは AWSのSG設定で8888ポートが開いているか確認してみてください。

#終わりに

思った以上に簡単に環境構築ができたので、環境構築に敷居を感じる方はこの記事を参考に挑戦してみてください。
元々はPHPerだったのですが、Pythonに手を出し初めたので、調査した内容を記事にまとめていきたいと思います。
今後はTornadoを利用して、RESTfulなAPIサーバ構築していくために調査した内容で記事を作成予定です。
iOS9からiPadのキーボードの高さを計算する方法が微妙に変わってた


* Xcode8.0 + Swift3.0

## よくあるキーボードの高さ取得方法（不完全）

```swift:不完全な例
    @objc private func keyboardDidShow(_ sender: NSNotification) {
        if let dic: Dictionary = sender.userInfo {
            if let value = dic[UIKeyboardFrameEndUserInfoKey] as? NSValue {
                print("height=\(value.cgRectValue.height)")
            }
        }
    }
```

iOS8辺りまではこんな感じで`CGRect`の`height`値をそのまま信じてもオッケーでしたが、iOS9からは外部キーボードを使ったときに、ショートカットバー（？）が出るようになったせいか、上記のものだと誤った高さになってしまいます。

![Simulator Screen Shot 2016.11.16 17.24.10.png](https://qiita-image-store.s3.amazonaws.com/0/31347/ad3a6337-23d3-a8cc-d4aa-fd260ad4fe9d.png "Simulator Screen Shot 2016.11.16 17.24.10.png")

```text:キーボードの矩形とheight値
rect=(0.0, 713.0, 1024.0, 398.0)
height=398.0
```

どう見ても高さ398ポイントには見えません。
たぶん通常サイズのキーボードが画面外にはみ出しているんでしょうね。

なお外部キーボードはシミュレーターの場合、`Shift+⌘+K`で切り替えられます。

## 解決策

画面の高さからCGRect.minYを引いた値を使うのが良さそうです。

```swift:修正例
height = UIScreen.main.bounds.height - value.cgRectValue.minY
```

## 終わりに

ダメな場合があったら教えてください。
最近はiPad ProのSmart Keyboardの登場により、この辺のテストも必須になりますね。。。
モンティ・ホール問題をコード書いて勝率計算したらすごく納得した話

## モンティ・ホール問題とは

> 「プレーヤーの前に閉まった3つのドアがあって、1つのドアの後ろには景品の新車が、2つのドアの後ろには、はずれを意味するヤギがいる。プレーヤーは新車のドアを当てると新車がもらえる。プレーヤーが1つのドアを選択した後、司会のモンティが残りのドアのうちヤギがいるドアを開けてヤギを見せる。
ここでプレーヤーは、最初に選んだドアを、残っている開けられていないドアに変更してもよいと言われる。プレーヤーはドアを変更すべきだろうか？」
([wikipedia](https://ja.wikipedia.org/wiki/モンティ・ホール問題))

正解は「変更する」で、変更した場合の勝率は66.7%になる。

確率統計や機械学習を勉強し始めたらいつかはお世話になるベイズの定理に絡んで出てくる。

> モンティ・ホール問題（モンティ・ホールもんだい、英: Monty Hall problem）とは、確率論の問題で、ベイズの定理における事後確率、あるいは主観確率の例題のひとつとなっている。モンティ・ホール (Monty Hall、本名 Monte Halperin) が司会者を務めるアメリカのゲームショー番組、「Let's make a deal」の中で行われたゲームに関する論争に由来する。 一種の心理トリックになっており、確率論から導かれる結果を説明されても、なお納得しない者が少なくないことから、ジレンマあるいはパラドックスとも称される。「直感で正しいと思える解答と、論理的に正しい解答が異なる問題」の適例とされる。

## コードを書いて勝率を計算してみた

最初は問題文を素直にコードに落として実行したのだが、少し考えると以下の形になり、実行するまでもなく納得した。

```python:
from random import randint

itr = 10000
cnt = 0
for i in range(itr):
    t = randint(1, 3)
    c = randint(1, 3)
    if t != c:
        cnt += 1
print(cnt/itr)
```

最初に選んだところがハズレなら、乗り換えるとアタリになる。最初にハズレを選ぶ確率は66.7%なので、乗り換えると勝率は66.7%。
#5 【攻略】RubyWarrior Level5

RubyWarrior Level5の攻略
今回はヒントなしでチャレンジしました...

#概要
新しい要素で捕虜が登場。捕虜がいるかどうか、という条件も追加しなければならないので入れ子がさらに増える。でもLevel4と基礎は同じでした。

#スクリプト
先述の「捕虜がいるかどうか」というスクリプトをLevel4のやつに足した感じ。

```
class Player
  def play_turn(warrior)

    if @health.nil?
      @health = 20 
    end
  
    if warrior.feel.captive?
      warrior.rescue!
    else
      
      if @health > warrior.health
        
        if warrior.feel.empty?
          warrior.walk!
        else
          warrior.attack!
        end
        
      else
        
        if warrior.health < 15
          warrior.rest!
        else
          if warrior.feel.empty?
            warrior.walk!
          else
            warrior.attack!
          end
        end
      end

    end
    
      @health = warrior.health

  end
end
```

#解説
まず一番最初に条件付けることは「捕虜の確認」に関して。
捕虜がいるときは弓矢兵も攻撃してこないので、優先して助けてあげましょう。
ここスクリプト入れるだけなのでLevel4のこちらの記事を参考にしてみてください。

```
if warrior.feel.captive?
  warrior.rescue!
else
・
・
・
end
```

 #4 【攻略】RubyWarrior　Level4
(http://qiita.com/tkmkwgc/items/fd8f60510d6b594b588e)
webpack の EnvironmentPlugin で十分だった

これまで DefinePlugin でこう書いてました。

```js
new webpack.DefinePlugin({
  'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV)
})
```

でも実は、 EnvironmentPlugin 使えば、こう書けるんです。

```js
new webpack.EnvironmentPlugin([
  "NODE_ENV",
  "HOGE"
])
```

入力:

```js
if (process.env.NODE_ENV === 'local') {
  console.log('local!')
}

if (process.env.NODE_ENV === 'dev') {
  console.log('dev!')
}

console.log(process.env.HOGE)
```

`NODE_ENV=dev HOGE=fuga webpack` としたときの出力:

```js
if (false) {
  console.log('local!')
}

if (true) {
  console.log('dev!')
}

console.log(("fuga"))
```

デフォルト値を指定したければ webpack.config.js に `process.env.HOGE = process.env.HOGE || 'hoge'` こんな感じで書けば OK.

とにかく JSON.stringify がだるいし、自分の用途的には DefinePlugin 使う理由がなくなってしまいました。どうしても `__HOGE__` とか定義したい人向けってことかなぁ。

https://webpack.github.io/docs/list-of-plugins.html#environmentplugin
MySQLのVersionによってInsert errorになる問題（STRICT_TRANS_TABLES）

[この記事](http://qiita.com/noratmt/items/7d38029331ae55bb928a)の関連です。

#環境
動いていたVersion MySQL 5.6.30
動かなかったVersion MySQL 5.6.33
（ビルドVersionしか違わないのに。。。）

#経緯
検証環境で動いていたSQLが本番環境で動かないとの事で調査開始。
関連記事の件があったので今回もその手の問題だろうとMysqlのオプションから比較してみる。

それぞれの環境でMySQLにログインして
`SELECT @@global.sql_mode;`

#調査結果
検証環境
+------------------------+
| @@global.sql_mode      |
+------------------------+
| NO_ENGINE_SUBSTITUTION |
+------------------------+

本番環境
+--------------------------------------------+
| @@global.sql_mode                          |
+--------------------------------------------+
| STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION |
+--------------------------------------------+

`STRICT_TRANS_TABLES`ってなんぞや？

Google先生からデフォルトが指定されていないカラムに値を設定しないと
怒られる設定だと教えて頂く。
実行されているSQLとテーブル定義を見ると仰る通りの様子。

本来はSQL(というか設計)を見直すべきなのだろうがMySQLの設定を変更する。
`SET @@GLOBAL.sql_mode='NO_ENGINE_SUBSTITUTION';`

`NO_ENGINE_SUBSTITUTION`は

```デフォルトのストレージ エンジンの自動置換 (substitution) を防ぐ。これは、CREATE TABLE のようなステートメントが、無効化した、またはコンパイルしたストレージ エンジンを指定するときのこと。エラーで知らせる。```
らしいので残しておく。

この時点で正常にSQLを実行できるようになったのだが
MySQLのsql_modeは再起動すると設定ファイルの内容に戻ってしまうので設定ファイルも書き換えておく。

`sudo vi /etc/my.conf`

変更した部分（変更前の設定はコメント化して残しておいた）
```#sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES 
sql_mode=NO_ENGINE_SUBSTITUTION```

`sudo service mysqld restart`
しても`STRICT_TRANS_TABLES`が無効になっているのを確認して終了。
iPhoneのsafariでスクロールすると、リサイズイベントが発火する

#iPhoneのsafariでスクロールすると、リサイズイベントが発火する
iPhone6+のios10.0.2で確認

どうやら、アドレスバーの拡大縮小に反応している模様

横幅で処理を走らせるようにするとok
最初に横幅を取得しといて、リサイズしたらその横幅と現在の幅を比較する。
処理を走らせたら、最初の横幅を更新する。