OmniAICreator/Qiita-1.07M huggingface dataset:
pg_dumpの結果をrspecで読み込むスキーマとする

## 課題

* 既存のPostgreSQLのDBがある
* `db/schema.rb`がないとrspecを動かす時にテーブルが作られない
* `rake db:schema:dump`ではコメントやview定義などがdumpされない

## 対応

### スキーマフォーマットの変更

通常はrubyのdslで書かれたschema.rbを読み込むが、下記のような設定をすることで`pg_dump`で出力したsqlをスキーマとして利用でる

```ruby:config/appliction.rb
  config.active_record.schema_format = :sql
```

### pg_dumpでの出力

`rake db:structure:dump`で吐かれるのと同じファイル名でpg_dumpの結果を置く。

```
$ pg_dump --schema-only database_name > db/structure.sql
```

### マスターデータも追加しておく(optional)

もし利用したいマスターデータがある場合は db/structure.sql に追記しておく

```
$ pg_dump -a -t some_master_table -t other_master_table >> db/structure.sql 
```

## 完了！

こうすることで`rspec`が既存のDB構造をもとに実行できるようになる
Babelインストール

CoffeeScriptが大変元気が無いということでBabelでもイジってみるか・・・。
というノリでインストールから始めたものの、少しつまずいたのでメモ。

こちらを参考にしました。
http://codezine.jp/article/detail/8717?p=4

が、最初のnpmコマンドから先に進めず右往左往。
さらには誤植を信じ、npm install bableする始末・・・。

公式読んだら15秒くらいで解決しました。

npm install --global babel-cli

うん、やっぱ公式読もう。
Dockerのイメージファイルの格納場所

Dockerからhello-worldとdocker/whalesayをpullして、ダウンロードしてきたのですが
一体どこにダウンロードされているんだろうという謎が出てきました。

* 今あるイメージ

```
$ docker images 
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
hello-world         latest              0a6ba66e537a        2 weeks ago         960 B
docker/whalesay     latest              ded5e192a685        5 months ago        247 MB
```

* 調べてみると、/var/lib/docker 辺りにあるらしい
 http://blog.thoward37.me/articles/where-are-docker-images-stored/
<pre>
$ sudo cat /var/lib/docker/repositories-aufs | python -mjson.tool
{
    "Repositories": {
        "docker/whalesay": {
            "latest": "ded5e192a685b2c5f048ea98ca24f4c8c4dccc012185448a0247b49b24645007"
        },
        "hello-world": {
            "latest": "0a6ba66e537a53a5ea94f7c6a99c534c6adb12e3ed09326d4bf3b38f7c3ba4e7"
        }
    }
}
</pre>

* サイズも見てみる。それっぽい！
<pre>
$ sudo du -s /var/lib/docker
279924	/var/lib/docker
$ sudo du -sBM /var/lib/docker
274M	/var/lib/docker
</pre>
WordPressのマルチサイトスイッチにはちゃんとswitch_to_blogを使おう

WordPressをマルチサイトで扱っていて、他のネットワークのサイトの投稿を使いたい時ってあると思います。例えば親サイトに子サイトの投稿を全部表示させたいときとか。

そんなとき

```php
# blog_idが2のサイトの投稿を取得する例

$blog_id = 2
switch_to_blog($blog_id);
# ここで投稿を取得したりする処理を書く
get_post($post_id);
restore_current_blog();
```

とすると思います。これが正しいんですが、興味で

```php
$GLOBALS['blog_id'] = $new_blog_id;
```

じゃだめなのかなって思ってやってみたらnullを返してきました。
なんでだろうと思って ```switch_to_blog``` のメソッド追ってみたら wpdbクラスの ```set_blog_id```を呼んでた。あー。。。マルチサイトそれぞれ違うprefixを変更してるのか。

wpdbの持つメンバ変数```$table```のprefixも変更してるみたいだから、wpdbを使う限りアクセスできなくなっちゃうってことか。ってことでちゃんと ```switch_to_blog```を使いましょう。
[SoftLayer] イメージ・インポート機能によるサーバー移行（デプロイ編）

このブログは、既存のIAサーバーをSoftLayerへ移行する方法の一つとして皆様の参考になればと思い寄稿しました。クラウドへの移行はハードルが高いと思われがちですが、SoftLayer標準のサービスにより簡単にサーバーの移行が行えます。
本内容は、**ESXi 5.1 で稼働しているWindowsServer2008R2**をSoftLayerの仮想サーバーへ移行しました。
（MSのライセンスはボリューム・ライセンス）

**[前回](http://qiita.com/sasazawa/items/c62a8a039e4dad850a75)**では、イメージインポートが完了しておりますので、この章ではイメージからデプロイの操作を説明していきます。
読むタイミングによってはバージョンやポータルGUIが異なる場合があります。適宜読み替えが必要です。障害や対応方法については、必要に応じてSoftlayerのサポートチケットやチャットで対応する必要があります。この情報は個人的な見解であり所属する組織には一切関係ありません。


**[【準備編】](http://qiita.com/sasazawa/items/c62a8a039e4dad850a75)**
　1．SoftLayerイメージ・インポートの仕様
　2．インポートするVHDを作成
　3．VHDをObject Storageへアップロード
　4．イメージのインポート

**【デプロイ編】**
　5. デプロイ
　6. ドライバーの更新

# 5．デプロイ
　1.[Mange]－[Image]を開きます。
　2.VHDよりインポートしたイメージファイルを選び、ボタン[Action]からイメージを作成する。
　※時間、月の従量課金を選択してサーバーをオーダーします。
![8.png](https://qiita-image-store.s3.amazonaws.com/0/59647/885cbf6e-398b-fa5a-347e-853a4ca6d311.png)

　
　3.オーダー画面より、必要なスペックに合わせます。
　　ディスクサイズはインポートするサーバーディスクサイズより25GB、100GBが構成されます。
　![1.png](https://qiita-image-store.s3.amazonaws.com/0/59647/2b29fb7f-bf8d-f957-fd4c-05c2f7a8643f.png)

　4.移行元のホスト名に合わせてオーダーします。
　![12.png](https://qiita-image-store.s3.amazonaws.com/0/59647/8a511fdd-4c8c-8659-48ab-f2328a7237b0.png)


# 6．ドライバーの変更（XenTools)
　・最新のXenToolsをダウンロードする。
　　http://downloads.service.softlayer.com/citrix/xen
　　※プラグアンドプレイで認識しているNICで通信ができるため、事前にXentoolsを対象サーバへコピーしておきます。
　・SoftLayerのポータル・コンソールを利用できるようにしておく（XentoolsインストールによりNICのドライバが更新されRDP接続ができなくなる）
　・ネットワークの構成情報をメモしておく（C:\ipconfig/all >ip.txt)

　1.ポータル・コンソールよりダウンロードしたプログラムを実行します。
　![15.png](https://qiita-image-store.s3.amazonaws.com/0/59647/0591d2d8-ea49-c114-0acc-b196c2bb9626.png)
　
　2.ドライバが更新されたことを確認する。
　![16.png](https://qiita-image-store.s3.amazonaws.com/0/59647/0571f05a-8b69-1c8e-4d68-ef0f68b2885f.png)


　3.　ネットワーク設定を更新する
　　控えておいたPublic、PrivateのIPアドレス、ゲートウェイ、DNSを設定します。
　　※プラグアンドプレイで認識したNICにバインドされたIPアドレストと重複するため警告が表示される。
　　　古いNICの静的IPアドレスを削除します。

　![17.png](https://qiita-image-store.s3.amazonaws.com/0/59647/5e4c5534-1b15-ed95-6cef-c103b0d3a74c.png)

　4.最終の確認
　　ネットワーク設定が完了したらIP疎通確認とRDPからの接続を確認します。
　　アプリケーションなど稼働テストを適宜実施する。
　　イメージ・サイズ25GBの制限から、他ドライブを含めて一括で移行できない場合がある。
　　この場合は、データのコピーやバックアップツールを組み合わせるなど工夫が必要となります。
　　Windowsライセンスは持ち込みとなるため、Windowsライセンス費用やサポート範囲などチケットで確認することを推奨します。


# 参考文献とツールの紹介
　・SoftLayer（XenTools）
　　http://downloads.service.softlayer.com/citrix/xen
　　
　・KnowledgeLayer（コンソール）
　　http://knowledgelayer.softlayer.com/faq/why-cant-i-connect-kvm-console
MacでInternetを共有したときのクライアントアドレスを調べる方法

MacでWifiに接続して、Ethernetポートに他の機器を繋いだ時、その他の機器のIPアドレスを調べる方法。

ifconfigコマンドを実行するとネットワーク・インタフェースの一覧が表示される。
その中にbridge*** というのがあるので、それを探す。

```bash
$> ifconfig
	...
bridge100: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
	options=23<RXCSUM,TXCSUM,TSO4>
	ether 02:23:32:eb:4b:64 
	inet 192.168.2.1 netmask 0xffffff00 broadcast 192.168.2.255
	....
```

その後は、arpコマンドでクライアントを探す

```bash
$> arp -i bridge100 -a
? (192.168.2.1) at 2:23:32:eb:4b:64 on bridge100 ifscope permanent [bridge]
? (192.168.2.2) at 7a:71:a0:52:51:39 on bridge100 ifscope [bridge]
```

上記の場合、192.168.2.1 がMacで、192.168.2.2が他の機器。

---

DHCPの範囲を変えたいときは、ここに書いてある通りにすればいいらしい。

http://k0aun9.blogspot.com/2013/03/changing-dhcp-ip-range-for-os-x.html
rubocopしたらparserの設定でwarningでた。

`bundle update`して`rubocop`かけたところ謎の`warning`が・・・

# 現象

```bash
$ rubocop
warning: parser/current is loading parser/ruby22, which recognizes
warning: 2.2.3-compliant syntax, but you are running 2.2.2.
warning: please see https://github.com/whitequark/parser#compatibility-with-ruby-mri.
Inspecting 113 files
.................................................................................................................

113 files inspected, no offenses detected
```
成功はしたけど。。なんかでてる。。

# 調べた
とりあえず↑にでてた
https://github.com/whitequark/parser#compatibility-with-ruby-mri
を見てみるも何したらいいかよくわからない。。

issueがあった。
https://github.com/whitequark/parser/issues/189

`parser`のバージョンが合ってないことを雰囲気で感じ取ったので、バージョンを指定すれば良さそう。

`Gemfile.lock`を確認すると

```Gemfile.lock
    parser (2.2.3.0)
      ast (>= 1.1, < 3.0)
```

2.2.2系に戻そう。

# Gemfile設定
```Gemfile
  gem 'parser', '~> 2.2.2.6'
```

# parser更新（バージョン戻す）

```bash
$ bundle update parser
...
Using parser 2.2.2.6 (was 2.2.3.0)
...
```

# 確認

```bash
$ rubocop
Inspecting 113 files
.................................................................................................................

113 files inspected, no offenses detected
```

キレイになりました！
Chatworkになんか色々追加するChrome Extension書いた

### 書いた
でもなんかそのうち全刷新するとか言ってたしすぐ使えなくなりそう！！！
https://github.com/wamei/chatwork-plugin
<img width="797" alt="スクリーンショット 2015-10-30 18.07.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/90613/b82fe5ee-2d93-e8c7-f1ac-1082dc119271.png">
WP:子テーマ作成の際に@importしない

functions.phpにて

```
add_action( 'wp_enqueue_scripts', 'theme_enqueue_styles' );
function theme_enqueue_styles() {
    wp_enqueue_style( 'parent-style', get_template_directory_uri() . '/style.css' );
    wp_enqueue_style( 'child-style',
        get_stylesheet_directory_uri() . '/style.css',
        array('parent-style')
    );
}
```

子テーマのstyle.cssにて

```
/*
Theme Name:   My Theme Child（子テーマ名）
Template:     twentyfifteen（継承元親テーマのフォルダ名）
*/
```

と、それぞれ記述する。

---

- function.phpではなくてfunctions.php
- style.cssはthemeフォルダの直下。themefolder/css/ではない！
Confluenceで子ページの中身を全て展開したページを作る

Confluenceのマクロには子ページの一覧を出すマクロはある

> こいつ↓
<img width="306" alt="スクリーンショット 2015-10-30 17.21.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/90613/7cbfc02f-91ba-2d94-6c9e-a8850f82dd39.png">
表示結果↓
<img width="129" alt="スクリーンショット 2015-10-30 17.21.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/90613/cd4873bf-6db6-0aa4-d3d4-882baee1ae7d.png">

ただページの中身までは表示してくれない、展開したページを作りたい、作ろう！

要件としては
 - 自分の子ページならコピペするだけで動く
 - 任意のページも展開できる
 - 複数置いても大丈夫

### 1. HTMLマクロを挿入する
その他のマクロの挿入から
<img width="305" alt="スクリーンショット 2015-10-30 17.26.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/90613/7a5b430e-61da-dc87-ca3f-2f969fea108f.png">
こんなやつを選んで挿入する
<img width="802" alt="スクリーンショット 2015-10-30 17.26.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/90613/8eca01a1-6576-4168-b258-d1db1487c251.png">

### 2. コードをぶちこむ！
https://github.com/wamei/confluence-expand-child-pages

```html
<div class="w-child-pages" data-url="this"></div>
<script src="https://rawgit.com/wamei/confluence-expand-child-pages/master/main.js"></script>
```
※ 任意のページを埋め込むときは最初のdivの``data-url``の部分にURLを指定する
※ 子ページでコードブロックが使われている場合、埋め込むページにも最低１つはコードブロックが必要

### 3. 表示できてる！！
<img width="466" alt="スクリーンショット 2015-10-30 17.17.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/90613/c2f43ec1-3b82-850f-81d6-df575497bbf1.png">

やったね☆
Spark on EMRでディスク容量不足になった時の対処法

Spark on EMRでS3のデータを集計する際、ディスク容量不足になったのでその対策

# ディスク容量の確認

```shell-session
df -h
```

ファイルシステム | サイズ | 使用 | 残り | 使用% | マウント位置
:----:|:----:|:----:|:----:|:----:|:----:
/dev/xvda | 9.8G | 6.6G | 2.7G | 72% | /
devtmpfs | 7.4G | 20K | 7.4G | 1% | /dev
tmpfs | 7.4G | 0 | 7.4G | 0% | /dev/shm
/dev/xvdb | 38G | 37M | 38G | 1% | /mnt
/dev/xvdc | 38G | 35M | 38G | 1% | /mnt1

Sparkがデフォルト使う、/dev/xvdaは10GBしか確保されておらず
かつ最初から7GB弱埋まっていて、残り3GBしか空きがない。
なので、3GB以上のファイルをディスクにのせてしまうとエラーになる。

⇡はm3.xlargeのもので、m3.2xlargeを試しても/dev/xvdaが10GBなのは
変わらなかった。

# ディスク不足になる要因
ファイルはS3にあるのに、何のファイルが3GB分も容量を使っているのか調べてみると
スクリプト実行時に、ブロックマネージャーが生成しているファイルが
数GB単位にまで膨らんで、ディスク容量オーバーになっていた。
/tmp/blockmgr-XXXXXXXXXXX-XXXX-XXXXX
⇡これ

このファイルはスクリプト終了時に勝手に消える。

# 解決策
blockmgr-XXXXXXXXXXX-XXXX-XXXXXの吐き出し先を、/mnt下に移せばいい。
-> Sparkのローカルディレクトリを/mntへ移す。

```shell-session
export SPARK_LOCAL_DIRS='/mnt/s3'
```

もしくはソース内で、設定する。

```py
# Python
conf = SparkConf()\
        .setMaster("local")\
        .set("spark.local.dir","/mnt/s3")

sc = SparkContext(conf=conf)
```

/mnt下のs3を指定している理由は特に無し。(必要に応じて変えてください)
Security Policyを追加する


## はじめに
- 新しいアドレスに対してFWポリシーを設定する方法 by junos
- チームの検証環境のFWをいじってて、やっぱりいつもどおりやり方忘れたのでメモ
- SRX100の場合

## バージョン

user@router1 > show version
Hostname: router1
Model: srx100b
JUNOS Software Release [11.4R6.6]

## 設定

- TRUSTからUNTRSUTへの疎通を空ける例
- すでに、zoneとして、TRUST / UNTRUSTが設定済み
- policy ALL_DENYもすでに設定済み

```
set security address-book global address UNTRUST_ADD-0001 XXX.XXX.XXX.XXX/XX
set security address-book global address-set UNTRUST_ADD_SET-0001 address UNTRUST_ADD-0001
set security policies from-zone TRUST to-zone UNTRUST policy TRUST_UNTRUST_POLICY-0001 match source-address any
set security policies from-zone TRUST to-zone UNTRUST policy TRUST_UNTRUST_POLICY-0001 match destination-address UNTRUST_ADD_SET-0001
set security policies from-zone TRUST to-zone UNTRUST policy TRUST_UNTRUST_POLICY-0001 match application any
set security policies from-zone TRUST to-zone UNTRUST policy TRUST_UNTRUST_POLICY-0001 then permit
insert security policies from-zone TRUST to-zone UNTRUST policy TRUST_UNTRUST_POLICY-0001 before policy ALL_DENY
```

以下で確認＆コミット。

```
show | compre
commit check
commit
```


## 解説
- 無邪気に ```set ~~``` で追加したあと、ミソは ```insert ~~ before```でALL_DENYの前に入れることだった。忘れそう。

## おわりに
- 英語の記事のほうがわかりやすいけど、日本語の記事があってもいいよね
[Unity & iOS]LobiSDK設定方法の覚書


自分用メモ。

# ビルドの準備（Unityでの作業）

## Unityでコンパイルオプションを設定する

Plugins/iOSフォルダ中の`.m`ファイルすべてのCompile Flagsを`-fno-objc-arc`に設定する。

![スクリーンショット 2015-10-30 16.42.02.png](https://qiita-image-store.s3.amazonaws.com/0/20722/fb882577-a9fa-2d65-f3f4-a8aedce27f68.png "スクリーンショット 2015-10-30 16.42.02.png")


## Edit>Project Settings>Audio

Sample Rateを44100に設定する。

## Edit>Lobi SettingsでLobiSDKの設定をする

![スクリーンショット 2015-10-30 16.43.53.png](https://qiita-image-store.s3.amazonaws.com/0/20722/9df84d5c-e3a9-06ee-b289-179cb22d9a5a.png "スクリーンショット 2015-10-30 16.43.53.png")

Client IDとBase Nameを設定する。Base Nameはデフォルトのユーザー名（？）になるので、適当にPlayerなりUserなり入れておく。

![スクリーンショット 2015-10-30 16.44.15.png](https://qiita-image-store.s3.amazonaws.com/0/20722/1dd3d41e-8cc1-6da2-4df5-72d603e9bcee.png "スクリーンショット 2015-10-30 16.44.15.png")


## LobiSDKの必要なframeworkを追加する

必要なFrameworkをPlugins/Lobi/iOSに追加しておく。

![スクリーンショット 2015-10-30 17.06.08.png](https://qiita-image-store.s3.amazonaws.com/0/20722/cad81f1f-3d3d-57e8-c2c5-377e2dcab9c4.png "スクリーンショット 2015-10-30 17.06.08.png")


この際、使わない機能に関するファイルは削除する。
今回の例では、ランキング機能を使わないので、**Rankingなどのファイル＆フォルダを削除した。

## LobiRecプレハブの設置

LobiSDK/Scripts/LobiRec.prefabをゲームの一番始めのシーンに配置する。

![スクリーンショット 2015-10-30 16.49.09.png](https://qiita-image-store.s3.amazonaws.com/0/20722/951c0321-7544-68f4-497c-058e8e1f86dc.png "スクリーンショット 2015-10-30 16.49.09.png")

## カメラにスクリプトを追加

LobiSDK/Scenes/LobiRecScene/LobiRecScene.csをメインカメラに追加する。



![スクリーンショット 2015-10-30 16.54.39.png](https://qiita-image-store.s3.amazonaws.com/0/20722/908a7051-3f1c-6fb0-f743-e6b4496c61fb.png "スクリーンショット 2015-10-30 16.54.39.png")


## 録画スタートなどのスクリプト

[https://github.com/kayac/Lobi/wiki/iOS-Implement-LobiRecSDK-Unity](https://github.com/kayac/Lobi/wiki/iOS-Implement-LobiRecSDK-Unity)を参考にする。

# ビルド(Xcodeでの作業)

## LOBI_CHATマクロを無効にする

![スクリーンショット 2015-10-30 16.57.19.png](https://qiita-image-store.s3.amazonaws.com/0/20722/32f37075-9137-94cc-b1ae-11f262ba7443.png "スクリーンショット 2015-10-30 16.57.19.png")

'LobiChat/LobiChat.h' file not foundというエラーが出るので、数行前のLOBI_CHATマクロをコメントアウトしておく。

![スクリーンショット 2015-10-30 16.57.47.png](https://qiita-image-store.s3.amazonaws.com/0/20722/ba891be2-0432-55a8-8e7c-e5a924177996.png "スクリーンショット 2015-10-30 16.57.47.png")

## iOS9対応

ATS の条件を下げる設定をInfo.plistに以下の設定を追加する。

```
<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>cloudfront.net</key>
        <dict>
            <key>NSExceptionRequiresForwardSecrecy</key>
            <false/>
            <key>NSIncludesSubdomains</key>
            <true/>
        </dict>
    </dict>
</dict>
```

![スクリーンショット 2015-11-04 22.06.09.png](https://qiita-image-store.s3.amazonaws.com/0/20722/110dffc3-3493-71ed-276c-594f7e268233.png "スクリーンショット 2015-11-04 22.06.09.png")



## リンカエラーが出る場合

もしも、リンカエラーがでるときには、Frameworkが足りなかったりするのでBuild Phasesで追加する。

![スクリーンショット 2015-10-30 15.14.35.png](https://qiita-image-store.s3.amazonaws.com/0/20722/4a9c8dcb-5bae-922c-18e6-00770bc6446a.png "スクリーンショット 2015-10-30 15.14.35.png")
AndroidStudioプラグイン開発で追加した独自メニューの表示/非表示を切り替える

`strings.xml`にフォーカスした状態で右クリックした時のみメニューを表示したいような場合の対応方法です。

![strings_xml_-_KotohaAndroid_-____work_private_kotoha-android_.png](https://qiita-image-store.s3.amazonaws.com/0/15267/60bfb754-b025-2bcc-3453-03675a111de7.png "strings_xml_-_KotohaAndroid_-____work_private_kotoha-android_.png")


# 結論

わかってしまえば簡単なんですが、実装したActionクラスの `update()` のパラメタの `AnActionEvent` を使ってvisibleをセットするだけです。

```java
event.getPresentation().setVisible(visible);
```

# 例

例えば `strings.xml` にフォーカスした状態で右クリックした時のみメニューを表示したいような場合はこんな感じです。

```java
package com.konifar.alice;

import com.intellij.codeInsight.actions.SimpleCodeInsightAction;
import com.intellij.notification.Notification;
import com.intellij.notification.NotificationType;
import com.intellij.notification.Notifications;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.actionSystem.CommonDataKeys;
import com.intellij.openapi.actionSystem.PlatformDataKeys;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiFile;
import com.intellij.psi.util.PsiUtilBase;
import org.jetbrains.annotations.Nullable;

public class SampleAction extends AnAction {

    // 略

    @Override
    public void update(AnActionEvent event) {
        final VirtualFile file = CommonDataKeys.VIRTUAL_FILE.getData(event.getDataContext());
        event.getPresentation().setVisible(isStringXml(file));
    }

    private static boolean isStringXml(@Nullable VirtualFile file) {
        return file != null && "strings.xml".equals(file.getName());
    }

}
```

これで実行すると、クラスの中で右クリックしてもコンテキストメニューに表示されなくなります。

![MainActivity_java_-_KotohaAndroid_-____work_private_kotoha-android_.png](https://qiita-image-store.s3.amazonaws.com/0/15267/14d47ae2-071e-f770-7845-bca68fe4f2f1.png "MainActivity_java_-_KotohaAndroid_-____work_private_kotoha-android_.png")
PHP配列(key関連)まとめ

やっぱりマニュアルは優秀です。
[PHPマニュアル> 言語リファレンス>型>配列](http://php.net/manual/ja/language.types.array.php)
余りにもボリュームが多いので今回はkey関連を重点的に。
## 構文

### 配列の定義
- `array()`で指定。
- PHP5.4以降なら[]でもOK
- 最後のカンマ(,)はあってもなくてもOK
    * 1行で指定する場合は最後の要素にカンマ(,)はつけないのがおすすめ
    * 複数行なら次の要素の追加が楽になるしミスも防げるのでカンマを付けるのが一般的

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

// 複数行
$array = array(
    "foo" => "bar",
    "bar" => "foo",
);

// PHP 5.4 以降なら以下でもOK
// 1行
$array = [1,2,3];

// 複数行
$array = [
    "foo" => "bar",
    "bar" => "foo",
];
```
### key
- keyは整数または文字列
- 添字配列と連想配列に違いはなく、keyの型は混在できる
- keyはオプション。省略した場合はこれまでに使われた整数のキーの中で最大のものに 1 を加えた値を使用(まだ数字添字が存在しない場合や最大が負の値の場合は0)


#### keyのキャスト

|元の型|キャストされる型|例|
|:-:|:-:|:-:|
|string|string|"key" → "key"|
|integerとして妥当な文字列[^int]|integer|"8" → 8|
|float|integer|8.7 → 8|
|bool|integer|true → 1<br>false → 0|
|NULL|空文字|null → ""|
|array<br>object|使用不可|ー|

[^int]: "08"、"8.7"などはそのまま文字列としてキャストされる

```php
$array = array(
    1      => "a",
    "1"    => "b", # $array[1]の値は上書きされて"b"
    1.5    => "c", # $array[1]の値は上書きされて"c"
    "1.5"  => "d",
    true   => "e", # $array[1]の値は上書きされて"e"
    "foo"  => "f",
    "true" => "g", 
    -100   => 100,
    "-100" => -100, # $array[-100]の値は上書きされて-100
    "key省略",      # ここまでの数字添字の最大が1なので$array[2]として追加
);
var_dump($array);
/*
array(4) {
  [1]=>
  string(1) "e"
  ["1.5"]=>
  string(1) "d"
  ["foo"]=>
  string(1) "f"
  ["true"]=>
  string(1) "g"
[-100]=>
  int(-100)
[2]=>
  string(9) "key省略"
}
*/
```

## $foo[bar]は誤り
- 連想配列の添え字は引用符でくくる
　→ くくっていない場合は定数として解釈する
- 変数や定数はくくると解釈できない
- 文字列の中では定数は解釈されない
- 文字列の中でも配列を`波括弧{}`でくくると定数を解釈

```php
$foo = ['bar'=>'TRUE','baz'=>'FALSE'];
print $foo[bar]; //PHP Notice:  Use of undefined constant bar

//定数barを定義
define('bar','baz');

print $foo['bar'];  //TRUE
print $foo[bar];    //FALSE

print "$foo[bar]";    //TRUE #文字列の中なので定数が解釈されない
print "$foo['bar']";　//PHP Parse error
print "{$foo[bar]}";  //FALSE #波括弧でくくったので定数を解釈
print "{$foo['bar']}";//TRUE  #波括弧の中でも文字列として解釈させるにはクウォートする
```
定数を定義していない状態で`$foo[bar]`とした場合PHP側で
「あー、`""`か`''`つけるの忘れたんだなー。」っていう賢い解釈をしてくれるので表示はする。
が、将来予約語にならない保証はないので危険。
.NETのスレッド実行

# 方法1 (同期)

Threadクラスで実行する。

````
static void Main(string[] args)
{
    Thread worker = new Thread(Work);
    worker.Start();
}

static void Work()
{
    Console.WriteLine("Do work");
}
````

# 方法2 (同期)

Task.Run()で実行する。

````
Task.Run(() =>
{
    Console.WriteLine("Do work");                
});
````

# 方法3 (非同期)

async、awaitを利用してTask.Run()を非同期で実行する。

````
async void ServerProcess()
{
    await Task.Run(() => ServerProcessAction());
}
````

asyncを書いたメソッド自体が非同期になるのと、その中のawaitの対象も非同期なので注意。awaitはTask型とTaskとvoidを返す。また、.NETのI/O系のメソッドはasyncの属性を持っていてawaitで呼び出せるものがあるので、上記の方法が使える。Task型は簡易なスレッドを表し、内部でシステムのスレッドプールに登録されて動作する。Task型のメソッドで待機させることも可能だし、TaskのリストからWaitAll()をすることもできる。Taskは戻り値の型を指定したTask。


# 方法4 (非同期)

Action型に代入してTask.Runで実行する。

````
static void Main(string[] args)
{
    Action async;
    async = Work;

    Task t = Task.Run(async);
    t.Wait();
}

static void Work()
{
    Console.WriteLine("Do work");
}
````

# 方法5 (非同期)

デリゲート型を宣言して代入して実行する。

````
delegate void dlgt();

static void Main(string[] args)
{

       dlgt d = Work;
       d();  // 普通に呼び出す.


        // 非同期に呼び出す.
        IAsyncResult ar = d.BeginInvoke(new AsyncCallback(cl), null);

        Console.WriteLine("WriteStringメソッドの終了を待機中...");

        //非同期処理の終了を待ち、結果を取得
        d.EndInvoke(ar);
}

static void Work()
{
        Console.WriteLine("Do work");
}

static void cl(IAsyncResult result)
{
      Console.WriteLine("End.");
}
````

# 方法6 (非同期)

Action型にメソッドを代入して実行する。

````
delegate void dlgt();

static void Main(string[] args)
{
    Action async = Work;
    async.BeginInvoke(cl, null);
}

static void Work()
{
    Console.WriteLine("Do work");
}

static void cl(IAsyncResult result)
{
    Console.WriteLine("End.");
}
````

# .NETのメソッドとスレッド

すべてのメソッドはスレッド実行できる。
すべてのメソッドは非同期で実行でき、コールバックが指定でき、待機も可能であり、イベントとしても使える。
Objective-Cライクにnilを扱う

RubyのnilをObjective-Cライクにnilを扱う。
厳密には違うけども。

[Objective-Cでnilにメッセージを送るとは ｜ Developers.IO](http://dev.classmethod.jp/smartphone/objective-c%E3%81%A7nil%E3%81%AB%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%82%92%E9%80%81%E3%82%8B%E3%81%A8%E3%81%AF/)

引用：

```
Foo *foo = nil;
[foo method];
```

そうですねえ。何も起こりません。素晴らしい！
他の言語だとnilがどうたらー　という感じで大概エラーですね。


## Rubyでそれぽく

**tryを使う**
[activesupport - Object#tryの意外な挙動 - Qiita](http://qiita.com/jkr_2255/items/fb9b66a61c18cd51fbdc)

```
class NilClass
  # Calling +try+ on +nil+ always returns +nil+.
  # It becomes especially helpful when navigating through associations that may return +nil+.
  #
  #   nil.try(:name) # => nil
  #
  # Without +try+
  #   @person && @person.children.any? && @person.children.first.name
  #
  # With +try+
  #   @person.try(:children).try(:first).try(:name)
  def try(*args)
    nil
  end

  def try!(*args)
    nil
  end
end
```

NilClassにtryが実装されており、**nil**が`try`を呼べばnilが返ってきます。Objective-Cだと何も起こらなかっただけでnilは返してきたっけ（どうだったかな？）


んじゃあ、nilじゃないやつのtryの実装は？
Objectクラスの中。

```
class Object
  # 略
  def try(*a, &b)
    try!(*a, &b) if a.empty? || respond_to?(a.first)
  end

  # Same as #try, but will raise a NoMethodError exception if the receiver is not +nil+ and
  # does not implement the tried method.
  
  def try!(*a, &b)
    if a.empty? && block_given?
      if b.arity.zero?
        instance_eval(&b)
      else
        yield self
      end
    else
      public_send(*a, &b)
    end
  end
end
```

こんな感じ見たい。


## まとめ
tryはnilが呼んだら、nilが返ってきて、
それが以外が呼んだら、tryなしで書いたときみたいに動く。
Object#tryが呼ばれるのか、NilClass#tryが呼ばれるのかは、
ダックタイピング的に切り替わるので自然と動く感じかな。


てか、tryに与える引数はシンボルになるわけでして、
RoRは大概のことをシンボルで解決しすぎやろ。

Swiftはいまnilについてどんな感じになってるんだろうか？
Ruby NetAddr Package

Rubyには標準で[IPAddr](http://ruby-doc.org/stdlib-2.2.3/libdoc/ipaddr/rdoc/index.html)というクラスがあるが、これでIPアドレスを柔軟に扱うことはなかなか難しい。

そんな中色々探していたら、NetAddrというパッケージがあって、これが便利そうなので紹介しておく。
https://rubygems.org/gems/netaddr/versions/1.5.0
http://www.rubydoc.info/gems/netaddr/1.5.0/NetAddr

ただ、Webにはそれほどサンプルがない。。個人的には超ステキなパッケージだと思うが、NWエンジニアがRubyを触ることは世界的にもまだ少ないからなのか・・・？

`gem install netaddr`で普通にインストール


CIDRからGatewayアドレス（末尾アドレス）を算出するサンプルプログラム

```rb
require 'netaddr'

netaddr1 = NetAddr::CIDR.create('192.168.1.0/24')

# broadcastアドレスを算出
bc_address = netaddr1.last

# 数値化して1引く
gateway_int = NetAddr::CIDR.create(bc_address).to_i - 1
# その数値をアドレス表記に戻す
gateway = NetAddr.i_to_ip(gateway_int)

# /24部分だけを抽出
netmask = netaddr1.netmask

p bc_address
# => "192.168.1.255"

p gateway
# "192.168.1.254"

puts gateway + netmask
# => 192.168.1.254/24
```

この他にもARPA形式出力やrange指定、IPv6対応など、色々便利なメソッドがある。
使えそうなメソッドのメモ書きをしておく。

```rb
require 'netaddr'

netaddr1 = NetAddr::CIDR.create('192.168.1.0/24')
netaddr2 = NetAddr::CIDR.create('192.168.1.1 255.255.0.0')
netaddr3 = NetAddr::CIDR.create('192.168.1.1 255.255.255.0')
netaddr4 = NetAddr::CIDR.create('224.0.0.1')

p netaddr1.bits
# => 24

p netaddr2.broadcast
# => "192.168.255.255"

p netaddr3.netmask
# => "/24"

p netaddr3.network
# => "192.168.1.0"

p netaddr3.subnet
# => ["192.168.1.0/25", "192.168.1.128/25"]

p netaddr1.arpa
# => "1.168.192.in-addr.arpa."

p netaddr1.cmp('192.168.0.0/16')
# => -1

p netaddr2.desc
# => "192.168.0.0/16"


#p netaddr1.enumerate
# => ["192.168.1.0", ..... , "192.168.1.255"]とダーッと出る

p netaddr2.ip
# => "192.168.1.1"

p netaddr2.last
# => "192.168.255.255"

p netaddr4.multicast_mac
# => "01-00-5e-00-00-01"

p netaddr1.next_ip
# => "192.168.2.0"

p netaddr1.next_subnet
# => "192.168.2.0/24"

p netaddr3.to_i
# => 3232235776

p NetAddr.i_to_ip(3232235776)
# => "192.168.1.0"

p netaddr1.to_s
# => "192.168.1.0/24"

p netaddr1.wildcard_mask
# => "255.255.255.0"

p netaddr1.hostmask_ext
# => "0.0.0.255"

p netaddr1.netmask_ext
# => "255.255.255.0"
```
CanvasのgetImageDataでクロスドメインの画像は読み込めない


canvasに画像を読み込みたいときに使うgetImageData

```js
var canvas = document.createElement("canvas");
var ctx = canvas.getContext("2d");
var img = ctx.getImageData("http://example.com/hogehoge.png");
```

セキリュティの関係上、
読み込む画像のURLのドメインがスクリプトを実行しているドメインと異なると以下のエラーになるので注意

![スクリーンショット 2015-10-30 16.25.35.png](https://qiita-image-store.s3.amazonaws.com/0/52847/852791e4-4266-d7ec-da19-14c7fbc04ae7.png)


参考:
http://d.hatena.ne.jp/chiheisen/20100815/1281885412
未来に登録したActiveJob実行をCancelする方法

RailsのActiveJobで未来に登録したJob実行をキャンセルしたい。
ActiveJobの標準的な機能としてサポートされているかと思ったのですが、そんなことなかった。

今回はジョブ実行にSidekiqを使っているとし、キャンセルにはSidekiqのAPIを使います。

``` ruby
job = MyJob.set(wait_until: Date.tomorrow.noon).perform_later(record)
job.job_id # これがjobを特定するid

require 'sidekiq/api' # 実際はinitializers/sidekiq.rbに入れるかも

ss = Sidekiq::ScheduledSet.new # スケジュールされたジョブの一覧を取得
ss.find { |job| job.args[0]['job_id'] == job.job_id}.delete
```

### 参考
Sidekiq Wiki API https://github.com/mperham/sidekiq/wiki/API
メモリ破壊、メモリリーク

## 開発言語がCのプロジェクトに多く携わっているのですが、毎度毎度メモリ破壊のバグに悩まされます。ここ数年は、他力本願で世間に出回っているツールの活用を行っているわけですが、いろいろと触ってみた感想を...

・Electric Fence
    結構有名だと思いますが。
    libefence.a をリンクするだけでお手軽に使えます。
    [libefence](http://linux.die.net/man/3/libefence)

・valgrind
    これまた、有名ですが。
    何回かこれはというバグを解決してもらいました。
    重いのがちょっとネックですが、開発プロセスに組み込むことで工数削減につながると思います。
    [valgrind](http://valgrind.org/)

・gcc -fmudflap
    検索してもあまりHITしない、マイナー？な機能ですが、最近いろいろ試みてますが、まだこれといったバグを検出してくれた経験はありませんが、活用していきたいと思います。
    [Mudflap](https://gcc.gnu.org/wiki/Mudflap_Pointer_Debugging)

・coverityの静的解析ツール
    有償ですが、さすが！といった代物です。プロジェクトによっては思い切って導入するのはありかと思います。
    [coverity](http://www.coverity.com/html_ja/)

ただ、いずれにせよ絶対というツールはありません。
これらのツールやソースレビューを厳しい線表の中で
如何に上手に開発プロセスに組み込んでプロジェクトを進められるかがポイントかも知れませんね。
ユーザをdockerグループに入れる

毎回sudoしてdockerコマンドを打つのも面倒なので、ユーザをdockerグループに所属させる。
環境はUbuntu。
細かいことは下記参照。
https://docs.docker.com/installation/ubuntulinux/#create-a-docker-group

* 現状のグループの設定の確認
今回はインストール時にdockerグループが作成されていた。
グループがない場合は自分で作成するらしい。
<pre>
$ cat /etc/group | grep docker
docker:x:999:
</pre>

* ユーザ(tiffany)の追加
<pre>
$ sudo gpasswd -a tiffany docker
ユーザ tiffany をグループ docker に追加
</pre>

* docker groupの確認
<pre>
$ cat /etc/group | grep docker
docker:x:999:tiffany
</pre>

* docker再起動

* 一旦ログアウトして再ログイン
 ターミナルをクローズしただけでは反映されなかった。

* sudoなしで、dockerコマンドが使えるか確認
<pre>
$ docker run hello-world
</pre>
MySQL CASE の Tips?

フィールド「M」 が1の時は昇順、1以外の時は降順にフィールドSSの内容で並べるという簡単な？
抽出クエリで、かなり苦労してしまった。 :weary: 

select * from tbl1 ・ ORDER BY CASE WHEN M = 0 THEN SS ELSE SS DESC END,JJ --> NG!!

何で？？　ELSE から　END　間の記載が問題らしい。

結果は、シングルクオートで括ればＯＫだったんだ・・知らなかったぁ。 :open_mouth: 

select * from tbl1 ・ ORDER BY CASE WHEN M = 1 THEN SS ELSE 'SS DESC' END,JJ -->OK!!
[Rails]Where句にNOT NULLを指定する

Googleで検索すると

``` ruby
User.where('name IS NOT NULL')
=> SELECT `users`.* FROM `users` WHERE (name IS NOT NULL)
```

みたいな書き方が出てくるけど、

``` ruby
User.where.not(name: nil)
=> SELECT `users`.* FROM `users` WHERE (`users`.`name` IS NOT NULL)
```

の方が美しいし安全です。
c++ builder > Copy() > MaxInt > To guarantee copying to the end of the string or array, use the MaxInt constant as the Count value.

http://www.delphibasics.co.uk/RTL.asp?Name=Copy

```
function Copy ( Source : string; StartChar, Count : Integer ) : string;
```

> To guarantee copying to the end of the string or array, use the MaxInt constant as the Count value.

endまでのコピーとして `MaxInt`を使うというのが目を引いた。
このルールはソースを読んだ時に明快だろうか?

```
const static int kToTheEnd = MaxInt;
```
なり定義して

```
Copy(srcStr, 5, kToTheEnd);
```
のように書いたら明示的だが、これがいいかはわからない。

<hr>
[公式](http://docwiki.embarcadero.com/RADStudio/XE8/ja/%E3%83%A6%E3%83%BC%E3%83%86%E3%82%A3%E3%83%AA%E3%83%86%E3%82%A3_%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B%EF%BC%88dbExpress_%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB%EF%BC%89)にもMaxIntを使った例がSubString()に対してある。
nilにメソッド呼んでもらおうとするとすぐundefined method ~ for nil:NilClass とかいうとけどRoRはどうしてるの？

## RoRのblank?メソッドってどうやって作ったの？

オープンクラスでObjectにメソッドをはやしました。
該当ソース部分引用：

```
unless Object.method_defined? :blank?
  class Object
    def blank?
      if respond_to?(:empty?)
        empty?
      else
        !self
      end
    end
  end
end
```

Rubyは

```
nil.class.superclass #=> Ojbect
nil.class < Object #=> true
```
なので。Objectに生やせば問題なし。
Windows8.1でAngular-fullstackがちゃんとgrunt serveできるように

いっつもハマるのでメモ
# そもそも必要なもの
* cl.exe(C++コンパイラ）
* Phthon2.7
* ruby
    * sass
* npm
    * yo
    * grunt-cli
    * bower
    * generator-angular-fullstack



## visual studio community 2015
* インストール
* 使用言語 -> C++ に必ずチェック

## Python2.7
* インストール
* PATHに登録

## ruby
* インストール（PATHも通す）
* `gem sass`

## npm i -g（cmdは管理者モードで起動する）
* `bower` 
* `grunt-cli` 
* `yo` 
* `generator-angular-fullstack`


## yo angular-fullstack
### C++のコンパイルでエラーが出たら
package.jsonから`grunt-node-inspector`の行を削除して`npm install`

# で、やっとgrunt serve
GitHubのremote URLにはどのプロトコルを使えばよいのか？

Gitでリモートレポジトリとやり取りする際のプロトコルにはhttp(s), git, sshの3(4)種類があって、特にGitHubとのやり取りにおいては各プロトコルによって出来ること／出来ないことの差がある。

## http(s)

* GitHubの推奨はhttps。
* httpに関しては記載がないが、一応使える（が、あえて使う意味もないと思う）。
* 認証はGitHubのユーザー名、パスワードによる。
* GitHubで2段階認証を設定している場合は、 **パスワードの代わりに[アクセストークン](https://help.github.com/articles/creating-an-access-token-for-command-line-use/)が必要になる。**

## git

* 高速らしい。
* GitHubでは昔は言及があったと思うが、現状は言及がない。が、使える。
* 認証機構を持たないため、gitプロトコルで`git clone`した場合はread-onlyになる。

## ssh

* セキュア。GitHubの場合は鍵認証を行いたいときに使う。
* というかだいたいのユーザーは鍵認証していると思うので、`git push`するときはこれ。

非常に大雑把ではあるが以上のような機能上の制約があり、時にリモートレポジトリのプロコトル指定の差異によってトラブルに見舞われる。


トラブル例
==================================================

## `git push`できない

上述の通りgitプロトコルはread-onlyとなるため、gitプロトコルとなってしまっている可能性が高い。

## 公開鍵を登録しているのに`git push`すると`Username for`が出てくる

http(s)では鍵認証を行えないため、http(s)プロトコルとなってしまっている可能性が高い。

## 2段階認証設定してから`git push`できなくなった

http(s)プロトコルを使用していて、パスワードを訊かれた際にアクセストークンを入力していない。もしくは鍵認証でsshを使うことにより回避可能。


結論
==================================================

sshを使っておくのが開発上は無難。とりあえず`git push`でトラブったらリモートレポジトリの設定を確認して、URLを適切なプロトコルで書き換えておけばいい。`git clone`したときのプロトコルがそのまま使われるようなので、httpsでクローンしてそのままになっていることはわりと多い。

確認

```bash
$ git remote -v
origin https://github.com/chroju/example (fetch)
origin https://github.com/chroju/example (push)
```

設定

```bash
$ git remote set-url origin git@github.com:chroju/example.git
```

ちなみにこれらを調べるきっかけになったのは、GitHubの2段階認証を設定したら`git push`できなくなったことだった。それまでしばらく`git push`したらユーザー名を訊かれるので変だとは思っていたのだが、ちゃんと直してなかった。

Octopressの場合（2015-12-15 追記）
----------

Octopressではrakeコマンドでリモートレポジトリの設定を行っており、 `git remote set-url` で上書きをしても有効にならない。

```bash
$ rake setup_github_pages
Repository url: git@github.com:chroju/chroju.github.io
```

これによりリモートレポジトリとの整合性に不具合が生じ、 `rake deploy` がrejectedされることがあるが、直接Rakefileを書き換えて `git push origin +#{deploy_branch}` としてforced updateしてしまえばよい（危険な操作なので一応注意の上で）。

参考：[Octopressでrake deployした際にrejectedされた場合の対処 - Qiita](http://qiita.com/takuma7/items/2d6f6e786eb6c0afbefb)


余談 - hubを使うと全部解決する
==================================================

なお、GitHub謹製の[hub](https://github.com/github/hub)を使えばこんなことには悩まなくなる。`hub`はGitHub用に最適化された`git`コマンドのエイリアスであり、完全に置き換えて使うことを意図されている。以下、READMEより抜粋。

```bash
$ git clone schacon/ticgit
> git clone git://github.com/schacon/ticgit.git

$ git clone -p schacon/ticgit
> git clone git@github.com:schacon/ticgit.git

$ git clone resque
> git clone git@github.com/YOUR_USER/resque.git
```

他にも`hub browse`でカレントレポジトリのGitHubページをブラウザで開いてくれたり、コマンドでプルリクできるようになったりだいぶ便利。


参考
==================================================
* [Which remote URL should I use? - User Documentation](https://help.github.com/articles/which-remote-url-should-i-use/)
* [Git - プロトコル](https://git-scm.com/book/ja/v1/Git-%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC-%E3%83%97%E3%83%AD%E3%83%88%E3%82%B3%E3%83%AB)
さくらのレンタルサーバーでsendmailの挙動を動的制御する

さくらのレンタルサーバーを使うことが多いです。
メール配信テストのために、sendmailを経由する全てのメール機能を制御するこんな方法があります。

コンパネからphp.iniを編集

```ini:php.ini
sendmail_path = "$SENDMAIL_PATH && /usr/sbin/sendmail -i -t"
```

これで以下のように、コード内からメール配信を制御できます。

```php:sample.php
//普通にfugaに届きます
mb_send_mail('fuga@fuga.com', 'title', 'body', 'From:hoge@hoge.com');

putenv('SENDMAIL_PATH=/usr/sbin/sendmail -i test@test.com');

//fugaには届かず testに届きます
mb_send_mail('fuga@fuga.com', 'title', 'body', 'From:hoge@hoge.com');

putenv('SENDMAIL_PATH=');

//今度はfugaに届きます
mb_send_mail('fuga@fuga.com', 'title', 'body', 'From:hoge@hoge.com');


```
c++ builder XE4, 10.2 Tokyo > float > floatの小数桁を調整してString型に変換 > str = FloatToStrF(314.15926535, ffFixed, 7,4); > 314.1593

```txt:動作確認
C++ Builder XE4
Rad Studio 10.2 Tokyo Update 2 (追記: 2017/12/27)
```

3.141592などのfloatを小数桁数を指定してString型に変換したい。

参考
http://www.delphibasics.co.uk/RTL.asp?Name=FloatToStrF

```cpp
void __fastcall TForm1::Button1Click(TObject *Sender)
{
	float pi100 = 314.15926535;

	String str;


	str = FloatToStrF(pi100, ffFixed, 7,4); // 1. 数値7桁, 小数4桁
	OutputDebugString(str.c_str());

	str = FloatToStrF(pi100, ffFixed, 5,4); // 2. 数値5桁, 小数4桁
	OutputDebugString(str.c_str());

	str = FloatToStrF(pi100, ffFixed, 7,3); // 3. 数値7桁, 小数3桁
	OutputDebugString(str.c_str());
}
```

```txt:結果
スレッドの開始 : スレッド ID: 3112. プロセス Project1.exe (2356)
スレッドの開始 : スレッド ID: 2996. プロセス Project1.exe (2356)
デバッグ出力: 314.1593 プロセス Project1.exe (2356)
デバッグ出力: 314.1600 プロセス Project1.exe (2356)
デバッグ出力: 314.159 プロセス Project1.exe (2356)
```

FloatToStr()の3番目の引数(7など)は数値をいくつまで保持するかということのようだ。
7の場合は、314(3つ) + 1593(4つ)まで保持するということ。

4番目の引数は小数の桁数 (1593)。
3桁とした場合、4桁目が四捨五入されるようだ (詳細は未確認)。

小数桁を4としていても、全体の桁数が5などになり314.16までしか保持されない場合、残りの小数桁は0になる。
GlobalZOrder を使用する環境下での RenderTexture の扱い

古い端末では DrawCall 数の重要さをひしひしと感じる今日このごろ。お元気でしょうか。
この記事では、そんなときに遭遇した不思議な RenderTexture にまつわる不思議な現象とその対策についてメモしたものです。

#GlobalZOrder を弄ると RenderTexture に描画されない…?
GlobalZOrder は親子関係を無視して描画順を入れ替えることができるので、プレイヤーノードの中の HP バーだけ前面に表示したい場合や、必ず裏側に回る背景、ポップアップウインドウを実装するために、GlobalZOrder を使うと思います。
(親要素だけにGlobalZOrder を指定するだけじゃ子要素以降には適用されないので、親子関係を考慮して微妙に値を足しつつ再帰的に GlobalZOrder を設定する必要がある面倒臭さがあるのですが。)
自分の場合、裏側に回ったポップアップウインドウを RenderTexture に焼き付けてまとめる処理を書いていました。
これらをスクリーン上に描画する際は問題無いと思います。
ですが、これを RenderTexture に描画しようとすると、おかしな現象が発生します。

例えば、次のようなコードがあったとします。

```cpp
// RenderTexture の準備
auto *renderTexture = cocos2d::RenderTexture::create(200, 300);
addChild(renderTexture);

// RenderTexture の内容を確認するため中央に寄せておく
auto &screenSize = cocos2d::Director::getInstance()->getOpenGLView()->getDesignResolutionSize();
renderTexture->setPosition(cocos2d::Vec2(screenSize.width * 0.5f, screenSize.height * 0.5f));

// RenderTexture に描画したい Sprite の準備
auto *sprite = cocos2d::Sprite::create("hoge.png");
sprite->setPosition(cocos2d::Vec2(100.0f, 150.0f));
sprite->setGlobalZOrder(100.0f);

// レンダリング対象は visit を呼び出す直前に isVisible == true であれば
// 適当な場所に addChild されていても問題ない。
container->addChild(sprite);

// RenderTexture に描画
renderTexture->begin();
sprite->visit();
renderTexture->end();

// RenderTexture には焼きこんだので、結果がわかりやすいように非表示にしておく。
sprite->setVisible(false);
```

このコードを実行すると、hoge.png が一瞬画面にちらつくように表示された後、RenderTexture には何も描画されずに画面上に何も表示されなくなると思います。

#原因
この現象は cocos2d-x 3.x から描画処理を非同期に行うようになったことに関係してます。
まず、RenderTexture の GlobalZOrder はデフォルトの 0.0f なので、begin 命令及び end 命令の優先度はデフォルトのままです。
ところが、sprite の GlobalZOrder は 100.0f に設定されているため、通常より前面に描画するように、つまり GlobalZOrder が 100.0f 未満のものが処理された後に sprite の `visit()` 内部で発行された描画命令が走ります。
すると実行順は

1. RenderTexture への描画開始
1. RenderTexture への描画終了
1. spriteの描画

となってしまいます。
このため、spriteの描画の時点では画面が描画対象となっている状態なので sprite が描画されてしまいました。

#対処方法
RenderTexture への描画開始/終了命令が先に来ているのが原因なので、spriteの描画の前に RenderTexture への描画開始命令を、spriteの描画の後に RenderTexture への描画終了命令が来るようにすることで解決できます。
そのために、RenderTexture への描画処理を以下のように書き換えることでうまくいきます。

```cpp
// RenderTexture に描画
renderTexture->setGlobalZOrder(-65536.0f);
renderTexture->begin();
sprite->visit();
renderTexture->setGlobalZOrder(65536.0f);
renderTexture->end();
```

このようにすると、RenderTexture への描画命令の順番が強制的に変更され無事に

1. RenderTexture への描画開始
1. spriteの描画
1. RenderTexture への描画終了

の順で実行されるようになります。
今回は 65535/-65536 という値を使いましたが、もしかしたら std::numeric_limits<double>::max や infinity も使えるかもしれません。

それでは良い RenderTexture ライフを。
CentOS6.4にJava 8のjdkをインストールする方法

# 要約

update-alternativesを使ってjava8をCentOS6.4にインストールします。
update-alternativesとは複数のバージョンのコマンドのうち、システム標準として使うコマンドを選択出来るものです。

現状のバージョンを確認します。

```
# java -version
java version "1.7.0_45"
OpenJDK Runtime Environment (rhel-2.4.3.2.el6_4-x86_64 u45-b15)
OpenJDK 64-Bit Server VM (build 24.45-b08, mixed mode)
```

yumを使ってjdk1.8をインストールします。

```
# yum install jdk1.8.0_25
```

このままではシステム標準のjavaのバージョンは1.7のままなので、
update-alternativesで1.8に切り替えます。

```
# /usr/sbin/update-alternatives --install /usr/bin/java java /usr/java/jdk1.8.0_25/bin/java 1000
# /usr/sbin/update-alternatives --set java /usr/java/jdk1.8.0_25/bin/java
```

切り替わりました。

```
# java -version
java version "1.8.0_25"
Java(TM) SE Runtime Environment (build 1.8.0_25-b17)
Java HotSpot(TM) 64-Bit Server VM (build 25.25-b02, mixed mode)
```

# 最後に
java8がyumのレポジトリに存在しない場合は以下のページを参考に入れてみてください。
http://zero-config.com/centos/install-java8.html

Oracleのサイトよりjdkをダウンロードするにはcookieが必要だったりするので、
以下のエントリーの要領でダウンロードすると良さそうです。

http://qiita.com/hajimeni/items/67d9e9b0d169bf68d1c9
swift array?.append(XXX) のようなオブジェクトを破壊するメソッドはoptionalに注意せねば


```swift
var item = [String]?()
item?.append("aaa")
print(item)
// -> nil
```

- optionalで宣言しているだけなのでnilのチェーンになり、当然 item はnilのまま。

```swift
var item = [String]?()
item = []
item?.append("bbb")
print(item)
// -> ["bbb"]
```
- append()を有効にするには一旦、空の配列でもいいので入れてやらないといけない
- itemがnilではなくなった時点でappend()が有効になり、配列の中身がかわる


- どちらも正しいコードなのでXcodeもコンパイラもエラーを返さない
- optionalをforced unwrappingでもしてないかぎり１つ目の例でも、実行時クラッシュしない


- オブジェクトに破壊的変更をもたらすメソッドは全部こういうこのが起こりうるので注意しないと、と僕は思った
Macでiotopと打つとiotaとなって困るときの対処法

# 概要

***iotop*** で何かをしたことを、メールとかで報告しようとしたときに、
勝手に***iota***と変換されて困った。

El Capitan の Live Conversion をオフにしているのに、、、、

何が効いているのかわからなかったので、調べた。

# 解決策

* [OS X Mavericks: 書類内でスペルと文法をチェックする](https://support.apple.com/kb/PH13919?locale=en_US&viewlocale=ja_JP)
* [OS X Yosemite: スペルと文法をチェックする](https://support.apple.com/kb/PH18451?locale=en_US&viewlocale=ja_JP)

ここを参考にしたら***iotop***と打っても***iota***とならなくなったとのこと。

```
「オートコレクトを切にする」
```
を参考にするとよかったようだ。
RubyでAmazon S3のファイルに対して期限付きURLを発行する


参考にしようとしたサイトが大概aws-sdkのバージョンが古いようで動かないので、自分で書くことにする。なお、Amazon S3にファイルはアップロード済みとする。

## インストール

まずはaws-sdkのバージョン2をインストール。

```ruby:Gemfile
gem 'aws-sdk', '~> 2'
```

## 試す

`rails console`で試してみた。

```bash
bin/rails c
```

ここからrails console。
アクセスキー等は適宜発行して置き換えてください。
リージョンは東京(ap-northeast-1)を指定。
バケットとファイル名を指定して、有効期限(expires_in)に60秒を設定しています。expires_inを省略した場合、デフォルトは15分の模様。

```ruby:rails_console
Aws.config = { access_key_id: 'ACCESS_KEY_ID', secret_access_key: 'SECRET_ACCESS_KEY' }
s3 = Aws::S3::Client.new(region: 'ap-northeast-1')
signer = Aws::S3::Presigner.new(client: s3)
puts signer.presigned_url(:get_object, bucket: 'bucket_name', key: 'filename.png', expires_in: 60)
```

これで出力されたURLが、期限付きURLになります。

ブラウザでコピペして表示されたらOK。
1分後のアクセスして表示されなかったらOK。

## 参考URL

* https://aws.amazon.com/jp/sdk-for-ruby/
c++ builder XE4, 10.2 Tokyo > Components[] > FindComponent()したものからindexを取得 > return ptr->ComponentIndex;

```txt:動作確認
C++ Builder XE4
Rad Studio 10.2 Tokyo Update 2 (追記: 2017/12/27)
```

FindComponent([名前])で取得したポインタから、Components[]どのインデックスに対応するか調べたい。

プロパティ一覧を見ていて`ComponentIndex`を見つけた。

```cpp
	TComponent *ptr = FindComponent(itemName);
	if (ptr != NULL) {
		return ptr->ComponentIndex;
	}
	return -1;
```
grafana 2.5をさわってみた


grafana 2.0のユーザーが、grafana 2.5を使ってみたときのメモ書きです。
なおgrafana 2.5.0の前のバージョンは[CHANGELOG](https://github.com/grafana/grafana/blob/master/CHANGELOG.md)上で確認した限りgrafana 2.1.3です。

# おきまり

grafanaは各バージョンについてデモダッシュボードを公開しています。
2.0, 2.1それ以前の過去のバージョンについて知りたい方は下記の中から適切なダッシュボードを選択してください

http://play.grafana.org/

2.5用のダッシュボードは10/29時点ではないようでした。

# リリースノート関連

公式の情報は下記より確認してください

v2.5の新機能
http://docs.grafana.org/guides/whats-new-in-v2-5/

github変更ログ
https://github.com/grafana/grafana/blob/master/CHANGELOG.md


# 何がかわったか

基本的には上記の新機能のリンクをご参照いただきたいと思います。
個人的に良いと思ったところを紹介します

左が2.5(New)、右が2.1(Old)です。

![スクリーンショット 2015-10-30 12.27.42.png](https://qiita-image-store.s3.amazonaws.com/0/7625/83634f1d-86ea-c351-6712-39a137e3a971.png "スクリーンショット 2015-10-30 12.27.42.png")

Metrics画面が改善され、ダッシュボードを作成する際に内部構造を知らなくてもだいぶ作りやすくなっています。
また、入力したクエリが分かりやすく表示されているのも同じくUI上の大きな効用でしょう。

オリジナルのクエリを直接編集することは以前より可能でしたが、math_exprとインターフェースも付与されています。

下記のような算術演算をかけるようでした。

```
+ 3
* 3
/ max(value)
```

一般的な用途としては、ElasticSearchのクエリエディタが進化した、同じグラフに違うデータソースのデータを表示できるようになった、対応するデータソースが増え、CloudWatchなどが利用できるようになった、などがポイントでしょう。

## 確認方法

Telegraf - InfluxDB - Grafanaのデモスクリプトで、
Grafanaのみのバージョンを変更して動作を確認しました。

https://github.com/takaidohigasi/telegraf-sample

```
diff --git a/roles/grafana/defaults/main.yml b/roles/grafana/defaults/main.yml
index 8504465..0c5f7b9 100644
--- a/roles/grafana/defaults/main.yml
+++ b/roles/grafana/defaults/main.yml
@@ -1,5 +1,5 @@
 ---
-grafana_version: 2.0.2-1
+grafana_version: 2.5.0-1
 grafana_download_path: https://grafanarel.s3.amazonaws.com/builds/grafana-{{ grafana_version }}.x86_64.rpm
```

リリース上のバージョンの付与ですが、[CHANGELOG](https://github.com/grafana/grafana/blob/master/CHANGELOG.md)上で確認した限り、2.1.3から2.5にバージョンアップしているようです。

# v2.5の注意

## 不具合

CHANGELOGはリアルタイムに近い形で更新されています。
v2.5.1のCHANGELOG及び、Issueで不具合を確認すると良いでしょう。

https://github.com/grafana/grafana/blob/master/CHANGELOG.md

## 後方互換

こちらもCHANGELOG.mdに記載があります。
[Changelog](https://github.com/grafana/grafana/blob/master/CHANGELOG.md)のBreaking Changesを確認してください。
ssh 経由でMacのターゲットディスプレイモードのOn/Offを切り替える


# 経緯

普段、MacBookProをメインマシンとして使用し、iMacはサブマシンとしてターゲットディスプレイモードで使用している。

iMacで使用していたキーボード&マウスはMacBookProとペアリングして使っており、iMacには普段キーボードもマウスも接続されていない状態でディスプレイとssh経由でCPUを使用している。

iMacがスリープしたり再起動したらターゲットディスプレイモードが解除されるので、ターゲットディスプレイモードに切り替えるためにキーボードのペアリング先の切り替えがいろいろ面倒臭い。

# 解決方法

以下のコマンドをメインマシン(MacBookPro)のターミナルで実行すれば、サブマシン(iMac)のターゲットディスプレイモードのOn/Offを切り替えることができる。

```
$ ssh {サブマシンのipやconfig名} osascript -e "'"'tell application "System Events" to key code 144 using command down'"'"
```


# 参考

[Target Display Mode via SSH | aaronrutley.com](http://aaronrutley.com/target-display-mode-via-ssh/)
TabLayoutをViewPagerでsetupした時はOnTabSelectedListenerを使わない

はい、タイトルでほぼ結論です。

説明するとAndroidのDesignSupportLibraryのTabLayoutでは[setupWithViewPager](http://developer.android.com/intl/ja/reference/android/support/design/widget/TabLayout.html#setupWithViewPager%28android.support.v4.view.ViewPager%29)というmethodがあって、これで生成するとViewPagerと関連づけてくれます。

その説明に
> The one-stop shop for setting up this TabLayout with a ViewPager.
> 
> This method will:
> 
>     * Add a ViewPager.OnPageChangeListener that will forward events to this TabLayout.
>     * Populate the TabLayout's tabs from the ViewPager's PagerAdapter.
>     * Set our TabLayout.OnTabSelectedListener which will forward selected events to the ViewPager

と、「libraryのOnTabSelectedListenerを設定して使ってね」とちゃんと書いてあるのですが、気づかなかったのでメモします。

使ったversionは23.1.0です。


### 動かない

TabLayoutにはViewPagerと関連づいたOnTabSelectedListenerがすでに追加されています。
なので[setOnTabSelectedListener](http://developer.android.com/reference/android/support/design/widget/TabLayout.html#setOnTabSelectedListener(android.support.design.widget.TabLayout.OnTabSelectedListener))とかで自分のListenerをセットしてしまうとタブとviewPagerの連動が切れてしまいます。

```java
mMyPagerAdapter = new MyPagerAdapter(getSupportFragmentManager());
mViewPager.setAdapter(mMyPagerAdapter);

// AdapterをセットしたViewPagerからTabLayoutを設定する
mTabLayout.setupWithViewPager(mViewPager);
// これをすると上書きしてしまって連動機能が動かなくなる
mTabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
    @Override
    public void onTabSelected(TabLayout.Tab tab) {
        // 何かしたい
    }

    @Override
    public void onTabUnselected(TabLayout.Tab tab) {

    }

    @Override
    public void onTabReselected(TabLayout.Tab tab) {

    }
});
```


### 動く

タブ切り替えはViewPagerに完全連動しているのでViewPagerの方にListenerを追加します。
method名からもViewPagerは複数Listener登録にも対応しているので競合しないだけかもしれませんね。

```java
mMyPagerAdapter = new MyPagerAdapter(getSupportFragmentManager());
mViewPager.setAdapter(mMyPagerAdapter);
// ViewPagerの方にListenerを設定すれば問題なさそう
mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
    @Override
    public void onPageScrolled(int position, float positionOffset,
            int positionOffsetPixels) {

    }

    @Override
    public void onPageSelected(int position) {
        // 何かしたい
    }

    @Override
    public void onPageScrollStateChanged(int state) {

    }
});
mTabLayout.setupWithViewPager(mViewPager);
```

今回はselectedイベントだけトリガーにしたかったので特に問題なかったですが、
UnselectedとかReselectedとかをトリガーにする場合はどうすればいいのか。。
Xcodeで新規ファイルをフォルダに整理する方法

# Xcodeで新規ファイルをフォルダに整理する方法

## 経緯

iOSアプリを開発するときにディレクトリを分けてファイルを管理していきたいときが結構あると思います。

ただ、何も考えずに、Xcode上でGroup内にファイルを作成すると、プロジェクトルートにファイルが配置されて、ファイルが散らばって、整理して、また散らばって、整理して(以下無限ループ)になることが多々あります。

まー、ファイル作るときに気をつけろ、って話ではあるんですが、そこでアタマを使ってしまうのは、開発の妨げ以外の何物でもありません。

というわけで、何も考えなくても、Xcode上でのグループをディレクトリに紐付ける方法

## 前提

### ディレクトリの構造
![SampleApp.png](https://qiita-image-store.s3.amazonaws.com/0/28990/c4cf698c-0f85-a052-65a0-ce1cdbfa0398.png)

### Xcode内の階層
![SampleApp_xcodeproj.png](https://qiita-image-store.s3.amazonaws.com/0/28990/ce41f402-07c9-54a9-df56-eb1d123955f9.png)


## やり方

![AppDelegate_swift.png](https://qiita-image-store.s3.amazonaws.com/0/28990/84fc1420-35bc-1880-df97-caa7bcb79281.png)

## 注意

途中でこれをやろうとすると、Group内の参照が切れてしまうことがあります。
そのときは、面倒ですが、Finderからドラッグアンドドロップして、参照しなおしてやってください。

## まとめ

こんなことやらなくても、[Synx](http://qiita.com/Yuta/items/fdce62fcb871912629ce)使えば一発っていう話もありますが、自分のようにツールを信用できないような人は是非やってみてください！
EC-CUBE3開発にお役立ちな感じのものたち【背徳のテスト編】

## まずはなんといっても**テストデータの投入**...

しかもデータ投入を管理画面から、「わーこんなんしてるオレってITの人みたい」などと入力に対する喜びなど皆無なので、ここはプログラマの「美学」として、もっと「怠惰」にデータは投入できんといかんだろうと、メンバー様のお知恵を拝借いたしましたところ、「以下で投入できちゃうぜ!!」ってことなので、

これは秘密主義者としては黙ってたい。。。
というのをグッとこらえて公開しちゃいます。

## ここから秘密を教えちゃいます
### まずは魔法のソースをDL
[~~御三家~~ ご本家サイト1](https://github.com/EC-CUBE/ec-cube/blob/master/tests/Eccube/Tests/EccubeTestCase.php)
[ご本家サイト2](https://github.com/EC-CUBE/ec-cube/blob/master/tests/Eccube/Tests/Repository/CategoryRepositoryTest.php)

### 以下が該当ソースとメソッドなのでインスタンスしてグリグリする
#### ご本家サイトのソース1
  * createCustomer : 会員登録
  * createProduct : 商品登録
  * createOrder: 受注登録

### ご本家サイトのソース2
  * createCategories : カテゴリ

### 最後に補足
* createCategoriesさんでは、引数で「メールアドレス」を渡してやると幸せなようです。
     ※後述の「Faker」さんがやり手らしいので、メールアドレスがなしでも、よしなに行っていただけます。

* createProductさんでは「名前」と「規格数」を引数で渡せます。
    ※こちらもFaker先生がいらっしゃるので、よしなに行われます。
    ※「**規格なし**」商品しかつくりたくねーんだよって方は、ソース確認していけるかどうか見てやってくださいm(_ _)m
    **そして**もしむりなら**直して**ください。
* createOrderさんは引数に「会員オブジェクト」を渡せる気配ですが...「Faker」先生にまかせましょう。


****
 
### 参考だよ
「Faker」さんについては以下ご覧ください
[Faker@PHPでダミーデータを作る](http://qiita.com/zaburo/items/4487b23543ce88ce7f0c)

今後どんどん追記の予定。。。

## 突然ですが。。GETで登録できる様にControllerを起こしました!!
えーーまあ本当に唐突なんですが、データ大量投入したい事がありまして、
GETで以下投入できます。

* カスタマーデーター
* 商品データー
* 受注データー

## 使用方法
### ファイルの配備
以下からClone
[EC3_Vendor_For_Make_Dummies](https://github.com/geany-y/EC3_Vendor_For_Make_Dummies)

~~差分ファイルと「vendor」フォルダをおいとります。~~
差分ファイルをおいています。

・ src フォルダ: EC-CUBE本体との差分ファイルです
→それぞれのファイルを配置・上書きしてください
・testsフォルダ
→Concreateといながら、Abstractを消しただけのテストデーター作成クラスです。。汗
こちらもコピーください
~~・vendorフォルダ~~
~~こちらは、現在のvendorフォルダとマルっと入れ替えてください~~
~~バックアップをすると幸せです~~
上記必要ありません

## 使い方
配備が終わったら、以下にアクセス
```
http(s)://{ドメイン}/{ルートディレクトリ:環境にあわせてね}/makedummy?type={作成したいオブジェクトキー}&unit={作成数:現在の設定で最大100}
```
・作成オブジェクトには以下が指定できます
c : カスタマー
p : 商品
o : 受注

で。。。finishedが表示されると勝ちです！！


## 備考
・また修正するか**誰かが修正してくれる**と思いますがOrderは、数の指定が現状では出来ません!!
※cusomer の数だけ作成されます
・作成数の上限を100にしていますが、ソース内定数にきってますので、マシンスペックと相談しながら、設定してください
注.) 那由多、恒河沙などには対応していません

以上れす