OmniAICreator/Qiita-1.07M huggingface dataset:
ESXiホストでiperfを使う方法

#参考記事
- [Quick Tip – iPerf now available on ESXi | virtuallyGhetto](http://www.virtuallyghetto.com/2016/03/quick-tip-iperf-now-available-on-esxi.html)
- [CUIでESXiのファイヤウォール設定 | ねころくぶろぐ](https://www.neko6.info/archives/1338)

#0.iperfファイルの存在を確認

```
[root@esx01:~] ls /usr/lib/vmware/vsan/bin/iperf
/usr/lib/vmware/vsan/bin/iperf
```

#1.iperfファイルのコピー
iperfコマンドを打つと以下のエラーとなる
「bind failed: Operation not permitted」

```
[root@esx01:~] /usr/lib/vmware/vsan/bin/iperf -s
bind failed: Operation not permitted
------------------------------------------------------------
Server listening on TCP port 5001
TCP window size: 64.0 KByte (default)
------------------------------------------------------------
```

のでコピーを行います

```
cp /usr/lib/vmware/vsan/bin/iperf /usr/lib/vmware/vsan/bin/iperf.copy
```

#2.アドレスへのバインドを行う
複数アドレスを持っている場合でも、バインドするアドレスを指定できます。
今度はエラーが出なくなります。

```
[root@esx01:~] /usr/lib/vmware/vsan/bin/iperf.copy -s -B 10.xx.xx.xx
------------------------------------------------------------
Server listening on TCP port 5001
Binding to local address 10.133.157.199
TCP window size: 64.0 KByte (default)
------------------------------------------------------------
```

#3.ファイアウォールの無効化
iperfではデフォルトでTCP、UDPの5001ポートを使用しますが、
ESXiホストではiperfについては細かいファイアウォール設定が存在しないため、
iperfをホストに向けて実施する際は、ファイアウォールを無効にします。

```
esxcli network firewall set --enabled false
```

#4.iperfの実行
上記で設定したESXiホストに向けて、他のESXiホストからiperfを試しました。
意外と普通に使えるものですね。

```
[root@ESX001:~] /usr/lib/vmware/vsan/bin/iperf.copy -c 10.xx.xx.xx -i 10 -t 60 -m
------------------------------------------------------------
Client connecting to 10.xx.xx.xx, TCP port 5001
TCP window size: 32.5 KByte (default)
------------------------------------------------------------
[  3] local 192.xx.xx.xx port 58904 connected with 10.xx.xx.xx port 5001
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0-10.0 sec  1.07 GBytes   919 Mbits/sec
[  3] 10.0-20.0 sec  1.08 GBytes   931 Mbits/sec
[  3] 20.0-30.0 sec  1.08 GBytes   927 Mbits/sec
[  3] 30.0-40.0 sec  1.09 GBytes   940 Mbits/sec
[  3] 40.0-50.0 sec  1.08 GBytes   925 Mbits/sec
[  3] 50.0-60.0 sec  1.08 GBytes   928 Mbits/sec
[  3]  0.0-60.0 sec  6.48 GBytes   928 Mbits/sec
[  3] MSS size 1448 bytes (MTU 1500 bytes, ethernet)
```
【Twitter4J】リトライ処理の設定方法

久々のプログラミング文法についての記事です＾＾
今回は<strong>Twitter4Jでのリトライ処理の設定方法についてです。</strong>

てぃーはツイッター分析では検索機能を使ってツイートを収集しています。
このときレートリミットを超えたというエラー以外に<strong>次のエラーが返ってくることがあります。</strong>

<a href="http://blog-imgs-60.fc2.com/t/e/a/teapipin/twitter_http_error.png"><img src="http://blog-imgs-60.fc2.com/t/e/a/teapipin/twitter_http_errors.png" alt="twitter_http_error.png" border="0" height="147" width="600"></a>

> <span style="color:#FF0000">Connection reset
> Relevant discussions can be found on the Internet at:
> http://www.google.co.jp/search?q=d35baff5 or
> http://www.google.co.jp/search?q=12c94143</span>

グーグルで調べるように書かれているのですが、調べてもよく分からずこのエラーの時はしばらくして手動でリトライしてしました。

それでうまく入っていたのですが手動ゆえにいつも見ていなければならず、原因も分からないので釈然としませんでした。


# リトライ処理
今回その対処方法が分かったので紹介します。
<strong>このエラーはコネクションの問題が原因です。</strong>
これには<strong>リトライ処理を行うことで対処できます。</strong>

<strong>twitter4j.properties</strong>に次の２つを追記します。
例えば10秒ごとに3回リトライしたい場合は次のように書きます。
（参考：<a href="http://twitter4j.org/ja/configuration.html#HTTP%20connection">Twitter4J - 設定</a>）

> http.retryCount=3 （デフォルト値：0）
> http.retryIntervalSecs=10 （デフォルト値：5）

※http.retryCountはデフォルトでは0回なので注意が必要です。

　
これらを設定した結果、エラーが起こったときは自動でリトライしてくれるようになりました。

他にも様々なプロパティが設定できるので必要な点を確認して設定を追加していきましょう！！
Xcodeで出たWarningと対処方法

#はじめに#
XcodeでWarningを消したときの対処方法についてメモします。

#'applicationFrame' is deprecated#
'applicationFrame' is deprecated: first deprecated in iOS 9.0 - Use -[UIScreen bounds]

`[[UIScreen mainScreen] applicationFrame]`あるいは`UIScreen.mainScreen().applicationFrame`がiOS9で廃止予定になったからです。

`[[UIScreen mainScreen] bounds]`あるいは`UIScreen.mainScreen().bounds`に書き直します。

#Null passed to a callee that requires a non-null argument#

Null passed to a callee that requires a non-null argument

ヌルでない引数を必要とする呼出し先にヌルを渡しているからです。(カリーとは、呼出し先のこと。)
ヌルを渡さないように書き換えます。

例えば、**UIWebView**の`- (void)loadData:(NSData *)data MIMEType:(NSString *)MIMEType textEncodingName:(NSString *)textEncodingName baseURL:(NSURL *)baseURL;`の**baseURL**がnilになっている場合は、これに`[NSURL URLWithString:@""]`を渡すように書き換えます。

関連記事
* [Xcode7 で UIWebView の loadData に Passing a null to a callee that requires a non_null argument が出た時の解消法](http://qiita.com/masashi-sutou/items/190539f961b54618c3ce)
* [Null passed to a callee that requires a non-null argumentエラーとは](http://qiita.com/akatsuki174/items/ff7fd7719de5ea7c4849)

#Assigning to 'A' from incompatible type 'B'#
Assigning to 'ClassA ＜ProtocolA＞  *' from incompatible type 'ClassA *'

型の違いを指摘されています。

型を合わせるか、代入時にキャストして解決します。

なお、Swiftで定義したプロトコルをObjcの**.hファイル**にimportできない点に注意します。#import “ProductModuleName-Swift.h”(ファイル名は任意)は.mファイルでしか行えないためです。公式ページでもこのインポートを.mファイルの中で行うように説明されています。

例えば、.hファイル上で定義されるインスタンス変数delegateについて、Swiftで記述したProtocolAを採用したい場合に、問題が起きます。.hファイル上で型情報を一致させるために、プロトコルを採用しようと思っても、できないからです。

そこで、.hファイル上はid型としておいて、.mファイルのなかで代入時に(ClassA＜ProtocolA＞)をつけてキャストします。これで警告を消すことができました。

関連記事
* [Swift and Objective-C in the Same Project](https://developer.apple.com/library/content/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html)
Base64でエンコードされている文字列を画像ファイルに変換する

諸事情でbase64でエンコードさえている画像が沢山保存されているブラウザのキャッシュから実画像ファイルを抽出する必要があった。base64の文字列をインスペクターで抽出して、以下のスクリプトにコピペして実行すると画像を抽出できる。

単に画像の形式の宣言部分を端折ってbase64の文字列部分だけをライブラリでデコードすれば良い。
拡張子は合わせる必要がある。

```rb
require 'base64'
str='data:image/jpeg;base64,...' # コピペする
File.open("%04d.jpg" % i, 'wb') do|f|
    f.write(Base64.decode64(str['data:image/jpeg;base64,'.length .. -1]))
end
```

一つのファイルに何行もある場合は以下のようにした。

```rb
require 'base64'
i = 0
File.foreach('photos.base64') do |str|
  puts str.size
  i+=1
  File.open("%04d.jpg" % i, 'wb') do|f|
    f.write(Base64.decode64(str['data:image/jpeg;base64,'.length .. -1]))
  end
end
```

サクッと変換できた。
SSHでログインしたときにGmailでメール通知

#SSHでログインしたときにGmailでメール通知
1. メール通知用のGoogle(Gmail)アカウント取得取得
2. PHPのライブラリ(PHPMailer)を使用して，Gmailからメール送信
3. SSH時にプログラムを走らせる
4. 完成
5. 参考にしたサイト

##メール通知用のGoogle(Gmail)アカウント取得
ソースコードにメールアドレスとパスワードを直書きするため，メール通知専用のアカウントを用意した方が良い．
既存のアカウントがある場合は，それでも良い．アカウントの取得方法は割愛する．
安全性の低いアプリのアクセスがオフだと上手くメールが送信できない？ので，
[https://www.google.com/settings/security/lesssecureapps](https://www.google.com/settings/security/lesssecureapps)
から，安全性の低いアプリのアクセスを**オン**にする．

##PHPのライブラリ(PHPMailer)を使用して，Gmailからメール送信
調べた所，PHPのPHPMailerというライブラリを使用すると簡単にメール送れるらしい．
[PHPMailer/PHPMailer: The classic email sending library for PHP](https://github.com/PHPMailer/PHPMailer)

このライブラリをダウンロード後，以下の3つを同一ディレクトリに入れる．

- class.phpmailer.php
- class.smtp.php
- PHPMailerAutoload.php

3つのファイルがあるディレクトリに以下のPHPファイル(gmail.php)を作る．
###PHPのソースコード
```php:gmail.php
<?php
require_once ( 'PHPMailerAutoload.php' );
date_default_timezone_set('Asia/Tokyo');

$subject = "タイトル";
$body = "メール本文";
$to = "送信先アドレス";

// SSHしたユーザー，IPアドレス等を取得
function echo_ssh() {
  $cmd = sprintf('echo "\"$USER\" has logged in from $SSH_CLIENT at `date +"%%Y/%%m/%%d %%H:%%M:%%S"` "');
  $r = exec($cmd, $res, $rval);
  return $res;
}

// Gmailを利用してメール送信
function gmail($subject, $body, $to) {
    $smtp_user = "gmailアカウント@gmail.com";
    $smtp_password = "gmailのパスワード";
    $mail = new PHPMailer();
    $mail->SMTPDebug = 1; // debugging: 1 = errors and messages, 2 = messages only
    $mail->isSMTP();
    $mail->CharSet = 'utf-8';
    $mail->Host = 'smtp.gmail.com';
    $mail->Port = 587;
    $mail->SMTPSecure = 'tls';
    $mail->SMTPAuth = true;
    $mail->Username = $smtp_user;
    $mail->Password = $smtp_password;
    $mail->setFrom($smtp_user);
    $mail->addAddress($to);
    $mail->Subject = $subject;
    $mail->Body = $body;
    $mail->IsHTML(false);
    return $mail->send();
}

$ret = echo_ssh();
$body = $ret[0];
if( !gmail($subject, $body, $to) ){
    $message  = "Message was not sent\n";
    $message .= "Mailer Error: " . $mailer->ErrorInfo . "\n";
    echo $message;
}

?>
```

##SSH時にプログラムを走らせる
ssh や scp などすると，$HOME/.ssh/rc が実行されるようになっているらしい．
そこで，以下のシェルスクリプトを書いてあげれば良い．
###シェルスクリプト
PHPのプログラムを呼び出しているだけ

```bash:rc
#!/bin/bash

php /path/gamil.php
```

##完成
これで，SSHでログインしたときにGmailからメール通知を飛ばせるはず．
ネットの情報をかき集めて作ったので，重大な間違いやセキュリティ上の問題があるかもしれません．
参考にする場合は，自己責任でお願いします．


##参考にしたサイト
> [PHPMailerを使ってGmailのSMTP経由でメールを送信する際にSMTP connect() failed.と出て困った - Qiita](http://qiita.com/takuya-andou/items/98be291a6a8b6b5515b1)
> [PHPMailer で GMail 送信 – Airwhite Memo](http://airwhite.net/?p=764)
> [SSH で遠隔ログインした時にメールで通知する - いますぐ実践! Linuxシステム管理 / Vol.010](http://www.usupi.org/sysad/010.html)
C#:婚約数(準友愛数)を求める


## 婚約数(Betrothed Numbers)とは

婚約数(Betrothed Numbers)とは、２つの異なる自然数の組(ペア)になっていて、１と自分自身を除いた約数の和が、もう片方の数と等しくなるような数を言います。
「準友愛数」とも呼ばれているようです。[友愛数](http://qiita.com/gushwell/items/547ab7fe19bed5b87365)の定義ととても良く似ていますからね。

例えば、一番小さな友愛数の組は(48,75)で、
48 → 2 + 3 + 4 + 6 + 8 + 12 + 16 + 24 = 75
75 → 3 + 5 + 15 + 25 = 48
となります。


## C#のコード

以下、作成したC#のプログラムです。最初の30個のペアを求めています。


```csharp:BetrothedNumber.cs
using System;
using System.Collections.Generic;
using System.Linq;

namespace Gushwell.Etude {
    class Program {
        static void Main(string[] args) {
            var numbers = BetrothedNumbers.GetNumbers().Take(20);
            foreach (var p in numbers)
                Console.WriteLine(p);
        }
    }

    public class Pair {
        public long Value1 { get; set; }
        public long Value2 { get; set; }
        public override string ToString() {
            return string.Format("({0}, {1})", Value1, Value2);
        }
    }
    public class BetrothedNumbers {
        public static IEnumerable<Pair> GetNumbers() {
            for (long i = 1; i < long.MaxValue; i++) {
                long x = Divisors(i).Sum();
                if (i >= x)
                    continue;
                long y = Divisors(x).Sum();
                if (i == y)
                    yield return new Pair { Value1 = i, Value2 = x };
            }
        }

        public static IEnumerable<long> Divisors(long n) {
            long m = (long)Math.Sqrt(n);
            if (m * m == n) {
                yield return m;
                m--;
            }
            for (long i = 2; i <= m; i++) {
                if (n % i == 0) {
                    yield return i;
                    yield return n / i;
                }
            }
        }
    }

}
```


プログラムコードは、友愛数を求めるプログラムとほとんど同じです。

このプログラムでは30個のペアを求めていますが、 40個のペアを求めようとすると、結構時間がかかります。
速くするにはさらなる工夫が必要ですが、思いつきません...

ソースコードは、[GitHub](https://github.com/gushwell/CSharpAlgorithmCollection)で公開しています。

## 実行結果

<pre>
(48, 75)
(140, 195)
(1050, 1925)
(1575, 1648)
(2024, 2295)
(5775, 6128)
(8892, 16587)
(9504, 20735)
(62744, 75495)
(186615, 206504)
(196664, 219975)
(199760, 309135)
(266000, 507759)
(312620, 549219)
(526575, 544784)
(573560, 817479)
(587460, 1057595)
(1000824, 1902215)
(1081184, 1331967)
(1139144, 1159095)
</pre>

-------------------
この記事は、Gushwell's C# Programming Pageで公開したものを加筆・修正したものです。
vimプラグイン「neocomplete」を使う


# neocomplete

[こちら](https://github.com/Shougo/neocomplete.vim)にソースがあります。
いろいろ補完してくれて便利なのでとりあえず入れておきたいプラグイン。

ただ、READMEに以下の記述があります。
> Note: neocomplete requires Vim 7.3.885+ with Lua enabled. 

このプラグインはlua というプログラミング言語が使えるversion 7.3.885 以上のvim でないとダメなようです。
設定が少し面倒だったのでメモとして残しておきます。
以下Mac のvim (MacVim じゃなくてターミナルの方) とCentOS のvim で設定した時のメモです。


## lua の確認

lua が使えるかどうかは以下のように確認できます。

```
% vim --version
  略
  -lua
  略
```

lua の前が- なら入れる必要あり、+ ならそのままでokです。

自分の場合、 OS X EL Capitan にデフォルトで入ってるもの、CentOS 7.2 にyum で入れたものどちらも`-lua` でした。


## vim with lua のインストール

### 【Mac】

```
% brew install vim --with-lua
```

これでok ですが、そのままだと元のvim が参照されていたので、新しくインストールした方のvim を見るようパスを設定しました。

```
% which vim
/usr/local/bin/vim

% export PATH="/usr/local/bin:$PATH" 

% vim --version
  略
  +lua
  略
```

### 【CentOS 7】
こちらはソースからインストールする必要があるみたいでした。

まずはlua の環境をインストール

```
% sudo yum install -y lua-devel 
```

vim は[Mercurial のレポジトリ](https://bitbucket.org/vim-mirror/vim)から`/usr/local/src` にダウンロードしました。


```
% cd /usr/local/src/
% sudo hg clone https://bitbucket.org/vim-mirror/vim vim
% cd vim
% sudo hg pull
```

いろいろ設定。

```
% sudo ./configure --enable-multibyte --with-features=huge --enable-luainterp=yes --with-lua-prefix=/usr --enable-perlinterp --enable-pythoninterp --with-python-config-dir=/usr/lib64/python2.7/config  --enable-rubyinterp
```

`./configure --help` で利用可能な設定が確認できるようです。

lua 関連を抜粋したのが以下。

```
% ./configure --help | grep lua
  --enable-luainterp=OPTS     Include Lua interpreter.  default=no OPTS=no/yes/dynamic
  --with-lua-prefix=PFX   Prefix where Lua is installed.
  --with-luajit           Link with LuaJIT instead of Lua.
```

インストール。

```
% make
% make install
```

これでlua が有効になっていると思います。




## neocomplete のインストール

[NeoBundle](https://github.com/Shougo/neobundle.vim) を使ってます。

`.vimrc` の`call neobundle#begin(expand('~/.vim/bundle/'))` と`call neobundle#end()` の間に以下を書くだけ。

```~/.vimrc 
NeoBundle 'Shougo/neocomplete.vim'
```

## 設定
[こちら](https://github.com/Shougo/neocomplete.vim) にあるConfiguration Examples　をだいたいそのまま使っています。
ただ、インサートモードの`Ctrl-h` と`Ctrl-l` は別のコマンドを割り当てているので、以下の二つはコメントアウトしたり別のキーを割り当てたりしていますが、特に操作感に問題はないです。

```~/.vimrc
" inoremap <expr><C-h> neocomplete#smart_close_popup()."\<C-h>"
" inoremap <expr><C-l>     neocomplete#complete_common_string()
inoremap <expr><C-i>     neocomplete#complete_common_string()
```


## 参考
[vimにNeoBundleとNeoCompleteを入れる](http://kayakuguri.github.io/blog/2015/12/24/neobundle-neocomplete/)
[lua有効版vimをOSXターミナルで使いたい。](http://blog.rinka-blossom.com/osxdevim/)
[CentOSにVim7.4をluaオプション付きでインストールする](http://blog.nambo.jp/2015/09/28/centos-vim-install-lua/)
[enable-luaなvim7.4をインストール](http://qiita.com/kbt48/items/a4ff903dd7a7b16e86af)
比較演算子(PHP)

phpを勉強していて「比較演算子」の項目に入ったのですが、覚える演算子が多いので忘れない様にここにまとめておこうと思います。

##比較演算子とは
比較演算子とは「大小」を比べるときに使う演算子です。この演算子を使った結果は`true`、`false`という理論値で結果が返ってきます。`true/false`は`真/偽`という意味を示しています。つまり比較演算子の結果は必ず`true`or`false`のどちらかの値になるということです。

##比較演算子の一覧

| 演算子      |演算式| 説明 |
|:-----------:|:------------:|:------------:|
|    >       |    a > b    |   aがbより大きい値の時true    |
| 	 <       |     a < b    |   aがbより小さい値の時true    |
| >=         |     a >= b  |    aがb以上の値の時true     |
| <=         |     a <= b  |    aがb以下の値の時true      |
| ==         |     a == b  |    aとbの値が等しいときtrue    |
| !=         |     a != b  |   aとbの値が等しくないときtrue    |
| ===         |     a === b  |   aとbの値も型も等しいときtrue    |
| !==         |     a !== b  |   aとbの値も型も等しくないときtrue    |


##「>=」を使って構文を試しに書いてみる。
試しに、以下の様な構文を書いてみました。

```php:php
<?php
$point = 11.6;
if ($point >= 10) {
	echo "合格";
} else {
	echo "失格";
}
?> 
```
```php:出力
合格
```
`point`という変数が10以上なら合格、で10以下なら失格が`echo`によって出力される意味です。
実際`$point`という変数には`11.6`を代入してますので、この場合10以上ということで「合格」が出力されています。 

##「==」と「===」の違いって？
下の	構文を見てください↓

```php:php
<?php
$hantei1 = (99 == 99);
$hantei2 = ("99" == 99);

var_dump($hantei1);
var_dump($hantei2);

?>
```

```php:出力
bool(true)
bool(true)
```

出力結果に出てくる
`bool(true)`の`bool`は「boolean(論理型)」の略のことで「型」とは扱う値の形式(性質)を表す概念です。
`bool`は真偽の値を表す型です。この型の値はtrueまたはfalseのいずれかになります。trueが「真」、falseが「偽」という意味になります。

###`「"99" == 99」`が「true」になってしまう！
上記の表によると「==」は「aとbの値が等しいときtrue」となっている。しかし`"99"`は「99」という文字(文字列)であり、一方`99`は純粋な「99」という数値である。両者正確には一致していない。なぜだろう？
###`「"99" == 99」`が「true」になってしまう理由。
`"99"`が「文字列型」、で`99`が「整数型」になります。
両者「型」が違っているわけで本来なら別物と判断されるべきなのですが、PHPは特に型の扱いが曖昧な一面を持っています。そのため「直感と違う振る舞いをすること」が時々見られます。
今回の場合、`"型"`は`文字列`でも`数字しか含まれてないんだから、ほんとは数値として等しいかと聞いてるんだろう`と、親切心で解釈しちゃったんですね。
この現象を **型変換(キャスト)** といいます。

##厳密に比べる時は`===`を使う
そこで「値だけでなく型も厳密に比較する」比較演算子として`===`や`!==`があります。
これを使うと型まで比較の対象になるので以下の様な結果になります。

```php:php
<?php 

$hantei3 = (99 === 99);
$hantei4 = ("99" === 99);

var_dump($hantei3);
var_dump($hantei4);

?>
```

```php:出力
bool(true)
bool(false)
```
出力を見ると`$hantei4 = ("99" === 99);`の比較に対して`var_dump($hantei4);`(真偽の結果)は「false(偽)」と出ています。

つまり`===`を使って比較した場合、「値だけでなく、型も同じかどうかも含めて比較してる」事になります。


##まとめ
今回は「比較演算子」について、「型」という概念にも少し触れながらまとめてみました。
ちなみに、私自身、PHPの勉強中なので今回の文章の内容で間違った部分等ありましたらご指摘いただけると幸いです。

以上になります。
CentOS > Link > VMwareゲストOS(Linux)からのssh接続が遅い場合の対策

```txt:動作環境
PC A
  Windows 10 pro
  VMware workstation
  CentOS 6.8 on VMWare
  Windows 8.1 pro on VMWare
PC B
  CentOS 6.8 (Xeon E5-2620v4)
```

関連 http://qiita.com/7of9/items/173aec43d7c6749fe151
関連 http://qiita.com/7of9/items/d50c2e181f28b2f11ded

VMware上のCentOSからの外部CentOS PCへのssh接続が遅い件に関して。

以下を見つけた。
https://www.eisbahn.jp/yoichiro/2012/04/vmware-workstation-network-too-late.html

> そこで調べてみると、TCP Segmentation Offload(TSO)をOFFにすればいい、ということが書かれているブログがいくつか見つかりました。

Windows10のレジストリをいじるのは躊躇している。


別途、CentOS側の設定変更を見つけた。
http://qwik.jp/takotlog/NetworkIsTooSlowOnESXi.html

試してみたが、体感的に速くはならなかった。別の問題かもしれない。

### sshd_config変更

@a_sugano さんの[コメント](http://qiita.com/7of9/items/8e1a6cbec1105d157e32#comment-5a3a3eb5e216e8dc7c64)を参考にPC Bの`/etc/ssh/sshd_config`の設定を変更してみました。

- UseDNS no 
   - ssh -v でチェックした時に`Cannot determine realm for numeric host address`が出たまま
- `GSSAPIAuthentication yes`の行をコメントアウト
   - ssh -vでチェックした時、Cannot***のエラーが出なくなった

しかしながらまだsublime textないのスクロールや描画が遅い感じです。
Sublime Text(Atom)で快適なgolangの開発環境 

# 追記
Atomに移行したら `go-plus`というプラグインで全て達成されました
本当にありがとうございました

---

静的型付け系は環境整備を丁寧にやるとのちのち幸せになれるそうなので備忘録として書きます。
特にデファクトスタンダードなIDEもないっぽいので自分の好きなSublime textで。

# インストール
## Mac
MacならHomebrewでいける
`brew install golang`

## Linux
自分でインストールディレクトリを決めれるのとバージョンを最新に保てるので、
Ubuntuにはなんとなくバイナリを突っ込んでみた

[公式](https://golang.org/dl/)からバイナリ取得したあと、
`sudo tar -C /path/to -xzf go1.x.x.linux-amd64.tar.gz`

## Windows
適当にやる

# 環境変数
## $GOROOT(パッケージ管理ソフトを使った人は飛ばしてください)
\$GOROOTはgolangの本体のあるディレクトリを指す
上記のUbuntuの時みたいにカスタムインストールした時はその場所を指定しなきゃいけない
~/.profile とか ~/.bash_profileに追記

``` ~/.bash_profile
...
export GOROOT=/path/to
```

## $GOPATH
golangはすべての開発において開発用の一つのディレクトリ使用することを強く推奨している(らしい)
そのための基盤となるディレクトリを\$GOPATHに指定する
自分は~/Workってディレクトリで作業しているので、

``` ~/.bash_profile
...
export GOPATH=$HOME/Work/go
```

としています

ちなみに\$GOPATH以下は、
bin (buildされた後の実行ファイルが生成される)
pkg (パッケージが生成される)
src (全てのソースコードが管理される)
の3つのディレクトリに分かれる(go getとかしてると勝手に作られてる)

## $PATH
~/.profile とか ~/.bash_profileに追記
\$GOROOTを設定したときは、\$GOROOT/binも追加しとく

```~/.bash_profile
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
```


# Packages
事前に依存パッケージたちを入れる

- **golang.org/x/tools/cmd/goimports** (import周りを整理してくれる)
- **github.com/golang/lint/golint** (goのlinter)

```
go get golang.org/x/tools/cmd/goimports
go get github.com/golang/lint/golint
```

# Sublime Text
## やりたいこと
- シンタックスチェック
- オートコンプリート
- 保存時に
    1. フォーマットの訂正
    2. ビルド
    3. テスト
    4. 静的解析

## GoSublime
基本的にこいつ頼み
Package Installからいれる

Package Settings -> GoSublime -> Segttings-Userを開き設定

```json:GoSublime.sublime-settings
{
  "fmt_cmd": ["goimports"],
  "comp_lint_enabled": false,
  "on_save": [
    {
      "cmd": "gs9o_open",
      "args": {
        "run": ["sh", "go build . errors && go test -i & go test && go vet && golint"],
        "focus_view": false
      }
    }]
}
```

これで、保存する(Command+s, Ctrl+s)ごとに、フォーマットが修正されたあと、
ビルド~テスト~解析が走りウィンドウ下のプロンプトでそれぞれ文句を言われるようになる
Windows10 をアップデートしたら VirtualBox が起動しなくなった


## 経緯
9月21日の夜になんとなくアップデートのところを見たら、何かあったので「まぁそろそろ退社するし、帰宅準備してる間にやっとくか」と、飛び石連休前の軽いノリでアップデートを行ったのが間違いの始まりだった。
愚かにも内容を見ず、「アニバーサリーアップデート」という文字列に気づかなかったのだ。

## どうなった？
死んだ。
Windows 自体は起動するものの VirtualBox が起動しない。
VirtualBox 上のゲスト OS が起動しないのではなく、 VirtualBox 自体のウィンドウが開かない。

## とりあえずググってみた
コマンドラインをたたいてどうのこうのとか、いろいろ出てきたけど、自分がやったのはアップデート。
今まで使ってたのが 4.2 だったので、いい加減サポート切れだった。
それが影響したのかはよくわからないけど。
現在は 5.1 がリリースされているが、 Vagrant の関係もあるので、一つ古い 5.0 系をインストールした。

## 治ったよー
インストール中に「ネットワークが初期化されたりするぜ？」みたいな警告が出たけど、とりあえず「はいはい」って感じで進めていった。
で、起動してみたら起動した。
念のため VirtualBox マネージャで「ファイル＞環境設定＞ネットワーク」で設定を確認したところ、特に変更はされていなかった。

## ゲスト OS 起動したよー
ターミナルソフトから SSH もできたし、 PING を外部に投げても応答が返ってきたし、一切問題なく起動した。
ネットワークが云々っていう警告が出てたので心配していたけど、特に設定が変更されていることはなかった。

## 教訓
* OS アップデートの内容は確認しよう
* ソフトウェアも定期的にアップデートしよう
docker for windowsではまったこと

会社の方が開催してくれたハンズオンに参加したんですけども、docker for windowsでいろいろたどり着けなかった個人的備忘録を。
（開催された方のPCはMacとUbuntuだったもよう）

ハンズオンはこちらから：http://qiita.com/furu8ma/items/e8249ddd48fab42eb7a3
あとECSとからめたデモを見学しました：http://qiita.com/furu8ma/items/6a7bd4d85617ef55f2c6

まず公式からダウンロードしてインストールすること。
https://www.docker.com/products/docker#/windows
（最初PowerShellで入れるやつを参考にしてやったらlinux向けのコンテナがpullの時点でエラーでて動かなかった）

Vagrant+VirtualBoxでCentOSとか入れなくてもそのままDockerが動くように2016年4月からなったようです。

で、
”Hardware assisted virtualization and data execution protection must be enabled in the BIOS”

というエラーメッセージが出現しました。windows10proです（homeだと物理的にDocker無理みたいな話をききました）

で、Windows10でBiOSにたどり着く方法は機種依存らしく手持ちの貸与PC(VAIO)だと、電源を切り、電源ボタンを押さずにassistボタンを押すとBIOSに辿りつけました。
で、virtualizationをenableにしました。

もう一つ、以下リンクに従ってdata execution protectionを無効にする設定にあたるものと思われる「署名なしドライバ をインストールする方法」を実施。
http://pasofami.game.coocan.jp/Win10_DrvIns.htm

あと同じく参加者のさらに進んだお方からの情報↓。

docker for windows で docker runするときにディレクトリマウントできないよ問題ですが、docker自体のsetting→Shared DrivesでCドライブとかにチェック入れてやらないとできないようでした。デフォルトでチェックついてないのでご注意ください。

Dockerまだ全然触ってないのでよくわかってないですが、今のところkernelのないFablicみたいな印象かもしれない。
あとwindows10細かいことしようとするとだいぶめんどくさいなと思いました。

どうしてもだめだったらVagrant+VirtualBoxで頑張るしかなかったかもしれないので一応貼っておきます。（でもVMなくていい軽いのがウリなので意味がわからないかんじになるかもしれません）
http://qiita.com/kobaboy/items/5469523a2b0bf8b61e8e

ところでHiper-VとVagrantは足すと落ちる相性の悪さということだったので追記しておきます。
http://blog.h2o-space.com/2016/08/1063/

あと、VagrantはVirtualBoxとの相性も最新どうしだとうまく動かなくてVirtualBoxのバージョンをVagrantのリリース日より前にでてるやつに下げないと動かないと聞きました。
CloudFormationで大量のKinesis作ったら失敗した

# はじめに
今回は、`CloudFormation`で`Kinesis Stream`作ろうとしたら失敗したので
対策したお話です。
作ろうとしたのは`１個`ではなく、`7個`です。

ここが重要。`7個....`
<img width="1280" alt="error-kinesis.png" src="https://qiita-image-store.s3.amazonaws.com/0/88884/c94cf8d0-a35b-dd7d-8f95-042c100522a2.png">

どうやら、非同期的に作成できる`Kinesis Stream`は`5個`までのようです。

aws公式の資料は[ここです](http://docs.aws.amazon.com/ja_jp/streams/latest/dev/service-sizes-and-limits.html)
> CreateStream、DeleteStream、ListStreams は、1 秒間に最大 5 件のトランザクションを提供できます。

らしいです。

# 対策案1
1. `CloudFormation`のスタックを分割する。
2. `kinesis1.template`, `kinesis2.template`のような感じに。

# 対策案2
1. `CloudFormation`のスタックを分割する。`
2. `kinesis1.template`, `kinesis2.template`のような感じに。
3. 上記の`1`, `2`を`チェーン実行`する。

```sh:チェーン実行.template
{
  "AWSTemplateFormatVersion" : "2010-09-09",

  "Description" : "exec-chain",

  "Resources" : {
    "Bucket" : {
      "Type" : "AWS::S3::Bucket"
    },
    "BucketPolicy" : {
      "Type" : "AWS::CloudFormation::Stack",
      "Properties" : {
        "TemplateURL" : "https://s3-us-east-1.amazonaws.com/hoge/kinesis1.template",
        "Parameters" : {
          "BucketName" : { "Ref" : "Bucket" }
        }
      }
    }
  },
  "Outputs" : {
    "kinesis1" : {
      "Value" : { "Fn::GetAtt" : ["BucketPolicy", "Outputs.kinesis1"]}
    }
  }
}
```
チェーン実行はこんな感じにしたらできます。
あとは、`Create Stack`する間隔をあけれてあげれば良いです。
[公式はこちら](http://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/using-cfn-waitcondition.html)良い感じに待機してくれそうです。

# おわりに
現状、対策1しかできていないですが、
今後、対策2も完成させて公開できればと思っております。
みなさま、運用していく中で、もっと良い方法あるよ！等ありましたら、ご教授ください。
CentOS > Link > ssh接続の速度を見る > time sshとexitの組合せ

```txt:動作確認
CentOS 6.8 (64bit)
```

CentOS6.8 on VMWareから別PCのCentOS6.8にsshした時の速度が遅い。

その速度を測る方法を以下で見つけた。
http://stackoverflow.com/questions/23431453/ssh-slow-log-in-on-centos-6

> asked May 2 '14 at 15:14
user3595535

```
$ time ssh cn10prowidx01 "exit;"
real    0m1.112s
user    0m0.008s
sys     0m0.004s
```

実際に自分の環境で試したところ、上記の処理に2秒かかっている。
[Xcode8] Hide 'nw_connection_endpoint_report' log 

When update the new xcode8 there are a lot of communication logs.

Such like this:

```
2016-09-26 18:22:20.458509 [13786:389216] [] nw_socket_handle_socket_event Socket received CONNECTED event
2016-09-26 18:22:20.458918[13786:389216] [] nw_socket_setup_notsent_lowat Set TCP_NOTSENT_LOWAT(16384)
```

At last I found out one solution:

Go to **Product** -> **Schema** -> **Edit Schema** -> **Run**

Add an environment variable 
**OS_ACTIVITY_MODE** with value **disable**
ubuntuにpsycopg2をインストール

ubuntuにpython psycopg2をインストールする。

忘備録も兼ねて。


# 前提
pythonとpipがインストールされている。

## apt-get

`$ sudo apt-get install python-dev libpq-dev`

`$ sudo apt-get install python-psycopg2`

これでpsycopg2がインストールされるが、最新ではない。


## pip

`$ pip install -U psycopg2`

場合によってはsudoをつけないとpermission deniedされるかも。

`$ sudo pip install -U psycopg2`

2016/09/26時点では2.6.2が最新。
【Unity】Project内の全シーンに処理を実行する

#すべてのSceneに対して操作を行う

Editorから何らかの処理を実行します。
Componentを置換したりRenameしたり...etc.

磯野ー！何かしようぜー！

```csharp
using UnityEditor;
using UnityEditor.SceneManagement;
using UnityEngine.SceneManagement;
using System;
using System.IO;
using System.Linq;
 
/// <summary>
/// シーン操作クラス
/// </summary>
public class SceneOperation
{
    /// <summary>
    /// Project内の全てのシーンに対して処理を実行します
    /// </summary>
    public static void OperationAllScene(Action<Scene> action)
    {
        var cnt = 0;
        var scenePathList = AssetDatabase.GetAllAssetPaths().Where(_ => Path.GetExtension(_) == ".unity").ToList();
        foreach (var path in scenePathList)
        {
            var scene = EditorSceneManager.OpenScene(path);
            EditorUtility.DisplayProgressBar("全Scene操作", scene.name + "シーンの操作をしています", (float) cnt / scenePathList.Count);
            // TODO ここに処理を追加.
            if (action != null) action(scene);
            EditorSceneManager.SaveScene(scene);
            EditorSceneManager.CloseScene(scene, true);
            cnt++;
        }
        EditorUtility.ClearProgressBar();
    }
}

```
No space left on device: AH00023: Couldn't create the rewrite-map mutex

apache 再起動しまくってると

```
No space left on device: AH00023: Couldn't create the rewrite-map mutex
```

といわれる。

```bash
# ipcs -s

------ Semaphore Arrays --------
key        semid      owner      perms      nsems
0x00000000 0          root       600        1
0x00000000 32769      root       600        1
0x00000000 131074     www        600        1
0x00000000 163843     www        600        1
0x00000000 196612     www        600        1
0x00000000 229381     www        600        1
0x00000000 262150     www        600        1
0x00000000 360455     www        600        1
```

とかでるので、www ユーザーのものを全部削除するために下記コマンド実行

```bash
# for i in `ipcs -s | awk '/www/ {print $2}'`; do (ipcrm -s $i); done
#
```

再度見てみる

```bash
#ipcs -s

------ Semaphore Arrays --------
key        semid      owner      perms      nsems
0x00000000 0          root       600        1
0x00000000 32769      root       600        1
```

全部消えた。
kubernetesを使うための設定など

今回、インフラ作業に携わる一環でkubernetesを使うための設定を実施しましたので、その方法を残しておきます。

###### 作業環境
Mac OS
 

###### 前提条件
Google Cloud Platform(GCP)でクラスタを作成してある状態から始めています。GCPについては[Google Cloud Platformをはじめようチュートリアル #gcpja]( https://heartbeats.jp/hbblog/2014/06/google-cloud-platform.html#more)が参考になりそうので、設定が必要な方はそちらを参照してみてください。

***
### google cloud sdkの初期設定を行う
(公式のドキュメントはこちら[Google Cloud SDK Documentation](https://cloud.google.com/sdk/docs/))

######1.Python2.7がインストール済であることを確認します。
`python -V`

###### 2.SDKファイルをダウンロードする。
今回は現時点の最新バージョンである127.0.0を入れてきました。
[Mac OS X (x86_64)](https://dl.google.com/dl/cloudsdk/channels/rapid/downloads/google-cloud-sdk-127.0.0-darwin-x86_64.tar.gz)または[Mac OS X (x86)](https://dl.google.com/dl/cloudsdk/channels/rapid/downloads/google-cloud-sdk-127.0.0-darwin-x86.tar.gz)

###### 3.ダウンロードしてきたファイルを展開する。　　　
任意の場所でかまいません。

###### 4.(オプション作業なので実施しませんでした。)
SDK toolのパスを通す作業のようです。
`install.sh`

######5.SDKの初期化コマンドを叩きます。
`gcloud init`

####kubernetesを入手します。
ソースコードをダウンロードしてビルドする方法と、ビルド済のものをダウンロードする方法があるようです。
ここではビルド済みのものをダウンロードしてきました。
このコマンドを叩くだけでOKです。
`brew install kubernetes-cli`
***
これで、google cloud sdkとkubernetesの準備は完了しました。
実際にkubernetesを使うには、kubectlの設定が必要なようです。
その設定方法については開発者ブログに綴っていますので、ぜひご覧ください！
[東音開発者ブログ]( http://blog.lesson-time.com/)
【PHP】Input variables exceeded 1000. の対処法

## 問題
PHPで無邪気に大量のPOSTを行っていると下記のような`Warning`が表示されることがあります。

```
PHP Warning:  Unknown: Input variables exceeded 1000. To increase the limit change max_input_vars in php.ini. in Unknown on line 0
```

PHP 5.3.9 以降でフォームから1000件以上のデータをリクエストする(GET/POST/COOKIE)と、勝手にデータを1000件に制限されるのです。
これはDoS攻撃に対する予防線の模様。
参照 [PHP/max_input_vars](http://jp2.php.net/manual/ja/info.configuration.php#ini.max-input-vars)

## 傾向と対策
php.iniを編集します。

```
$ vi /etc/php.ini
```

``` /etc/php.ini
; 402行目辺りに下記パラメータがあるのでこれをコメントインして任意の値に変更します
;行番号が出てなければ :set number してください
;もしくは /max_input_vars で検索検索ゥ！

; How many GET/POST/COOKIE input variables may be accepted
max_input_vars = 2000
```

下記コマンドで` php-fpm`を再起動！

```
$ sudo service php-fpm restart
```

光あれ。
Windows 10 Anniversary Update後のネットワークトラブル

```txt:動作環境
PC A
  Windows 10 pro
  VMware workstation
  CentOS 6.8 on VMWare
  Windows 8.1 pro on VMWare
PC B
  CentOS 6.8 (Xeon E5-2620v4)
```

PC AにおいてWindows 10 Anniversary Updateを適用後、どうもVMwareのゲストOS上のネットワーク接続が遅くなった気がする (接続も切れやすい)。

Windows 8.1 pro on VMWareではブラウザで接続していると「接続できませんでした」と本日だけで30回近くなった。

CentOS on VMWareからはPC Bに`ssh -X`接続した時、sublime textのウィンドウサイズ変更などであきらかに描画更新が遅い。

一方で、VMwareのゲストOSを使わず、PC BにてXRDPを有効にしてPC Aからリモートデスクトップ接続をした場合はsublime textのウィンドウサイズ変更などでも許容内の速度だった。

PC AのホストOSでブラウザ閲覧時に「接続できませんでした」とはなっていない。

Windows 10 Anniversary UpdateによりVMwareのゲストOS動作になんらかの支障がでているように思われる。有効な対策は未消化。

XRDPで接続した時、NCLの描画に失敗する (一部の線しか描画されない)。一方でCentOS on VMwareから`ssh -X`接続した時はNCLの描画は成功する(全部の線が描画される)。上記と反対のパフォーマンスになっている。
自作opkgパッケージを作るときにdescriptionに改行を入れるとPackagesファイルが壊れる

opkgのバイナリパッケージリポジトリでは全パッケージを同一ディレクトリに配置し、それらの情報を含んだファイル（`Packages`または`Packages.gz`）を作成します。このファイルのデリミタは改行2連続になっています。

そのため、特定パッケージの詳細説明（description）に空行を入れると`Packages`ファイルが不正になってしまいます。

```
define Package/php7/description
  $(call Package/php7/Default/description)
  This package contains only the PHP config file. You must actually choose
  your PHP flavour (cli, cgi or fastcgi).

  Please note, that installing php5 and php7 in parallel on the same target
  is not supported in OpenWrt/LEDE.
endef
```

たとえば上の状態でパッケージビルドを行うと`Packages`ファイルが壊れてこのパッケージがインストールできなくなります。

もしかすると、`Packages`ファイルを作るツールによってはこの事故が回避できるのかもしれません。筆者の場合は[Bintray](https://bintray.com/)が自動生成する`Packages`ファイルで問題になりました。
ImGui でタグクラウド風のボタンクラウドを実装する例

# 概要

ImGui を採用する際にタグクラウド的なウィジェットパーツを実装したい場合の実装例を紹介する。

- https://youtu.be/CtPyvXL9qWE

![image](https://qiita-image-store.s3.amazonaws.com/0/33891/c099d438-f73f-53e4-d006-4491c8e279dc.png)

# 実装例

## ソースコード

- 執筆時点の実装: [usagi::imgui::small_button_cloud - 13961fdb0daa6c132c283204445e4aab6fc76a8d](https://github.com/usagi/usagi/blob/13961fdb0daa6c132c283204445e4aab6fc76a8d/include/usagi/imgui/small_button_cloud.hxx)

```c++
namespace usagi
{
  namespace imgui
  {
    class small_button_cloud
      : public std::multimap
        < std::string
        , std::function< auto () -> void >
        >
    {
      float _width = 0.0f;
    public:
      auto width() { return _width; }
      auto width( const decltype( _width ) in ) { return _width = in; }
      auto get_width_pointer() { return &_width; }
      auto operator()()
      {
        ImGui::BeginGroup();
        
        const auto s = ImGui::GetStyle();
        const auto iis2 = s.ItemInnerSpacing.x * 2;
        const auto is   = s.ItemSpacing.x;
        
        auto current_line_width = 0.0f;
        
        for ( const auto& p : *this )
        {
          const auto entity_width = ImGui::CalcTextSize( p.first.c_str() ).x;
          const auto tmp_line_width = current_line_width + is + iis2 + entity_width;
          
          if ( current_line_width > 0.0f and tmp_line_width < _width )
          {
            ImGui::SameLine();
            current_line_width = tmp_line_width;
          }
          else
            current_line_width = iis2 + entity_width;
          
          if ( ImGui::SmallButton( p.first.c_str() ) )
            p.second();
        }
        
        ImGui::EndGroup();
      }
    };
  }
}
```

## 使用する ImGui API 群

1. `ImGui::SmallButton`
2. `ImGui::BeginGroup`
3. `ImGui::EndGroup`
4. `ImGui::CalcTextSize`
5. `ImGui::GetStyle` 
6. `ImGui::SameLine`

## 実装の tips

1. 任意の width の領域に、ラベルとクリック時のファンクターのマルチマップから `SmallButton` でタグクラウド風のスモールボタンクラウドを実装する。
2. `SmallButton` の横幅は `CalcTextSize()` + `GetStyle().ItemInnerSpacing` * 2 で `SmallButton` 定義前に計算できる。
3. `SmallButton` を横に複数 `SameLine` する場合のアイテム間の間隔は `GetStyle().ItemSpacing` で取得できる。

### 各種サイズの図解

![image](https://qiita-image-store.s3.amazonaws.com/0/33891/d13b8ba4-9ba2-8acf-58ee-77bfb17f1f5c.png)

## 動作テスト

```c++
  using usagi::imgui::small_button_cloud;
  
  static small_button_cloud c;
  
  ImGui::SliderFloat( "width", c.get_width_pointer(), 0.0f, 1024.0f );
  
  if ( c.empty() )
    for ( auto n = 0; n < 32; ++n )
      c.emplace( "hoge-" + std::to_string( n ), [=]{ std::cerr << "hoge-" << n << '\n'; } );
  
  c();
```

- https://youtu.be/CtPyvXL9qWE

![image](https://qiita-image-store.s3.amazonaws.com/0/33891/b9e9af16-1f46-c016-77c0-5a2fb0eb26c0.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/33891/37acafbe-3555-2834-ef7f-80736e15a5d5.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/33891/c099d438-f73f-53e4-d006-4491c8e279dc.png)
The react/require-extension rule is deprecated. Please use the import/extensions rule from eslint-plugin-import instead.



ESLint を使っていて、掲題のような警告が表示されたときの対処法です。

下記のように、.eslintrc の rule に react/require-extension を off にする設定を追加すれば警告が表示されなくなります。

```javascript:.eslintrc
{
  "extends": "airbnb",
  "rules": {
    "react/require-extension": "off"
  }
}
```
芸が細かいTwitterのフロント。〜影編〜

# Twitterの影に関するギミックが凄かったのでメモします。
## 何の話なのか
Twitterのcssすげえ
## で、どうするのか
俺も使おう。
<br>
というわけで備忘録。

<hr>

休憩がてらTwitterを見ていたときのこと。
<img width="1633" alt="スクリーンショット 2016-09-26 午後5.24.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/107419/bcd407bf-6b4f-12e1-401f-7d68d8770b76.png">
お！？
おおおおおお！？！？！？
<img width="1316" alt="スクリーンショット 2016-09-26 午後5.23.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/107419/7682ef13-6b35-2fd2-2660-d760e0befb40.png">

headerの影が激シブですね。
影が２本見えますね。
- 上の影が濃めの黒。（ちゃんと透けてる）
- 下の線が薄めの黒。（ちゃんと透けてる）
つまり、影が立体的で、ちゃんと透けてる。
<br>
というわけで要素を検証してみた。

たぶんこんな感じ。

```
.topbar js-topbar {
     border-bottom: 1px solid rgba(0,0,0,0.05);
     .global-nav {
          border-bottom: 1px solid rgba(0,0,0,0.15);
     }
}
```

フラットなにの立体的。
スクロールでheaderを固定するからこそ、活きてくるデザインですな。
俺も使おう。
<br>
おわり
POV-RAYのレンダリング結果を画像で保存する

#目標
タイトル通りです。

##環境
- macOS Sierra
- POV-Ray Unofficial

自分の環境は公式のものではないので、WindowsやUNIX環境では多少差があるかもしれません。

##やり方
<img width="688" alt="スクリーンショット 2016-09-26 17.24.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/26440/f82bae85-20df-78ac-3181-2ffe2b113090.png">

Set Upアイコンをクリックすると、以下の画面が出てきます。

<img width="432" alt="スクリーンショット 2016-09-26 17.25.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/26440/f9c2c553-8181-00bd-4709-993b9ce58b46.png">

Output OptionsのImage TypeがデフォルトではDon't Save Imageになっているので、
ここからPNGなどの好きなフォーマットに変えてください。

保存場所は、ソースコードと同じディレクトリです。
PHPの文字エンコーディング検出はアテにならない

一身上の都合で文字エンコーディングと戦った時のメモ

PHPにおける文字列のエンコーディングは`php-mbstringモジュール`で提供されている。
`mb_detect_encoding`はデフォルトではASCIIとUTF-8しかチェックしてくれない。
`mb_detect_order`でチェックするエンコーディング形式を指定することができる。
だがしかし、対して検出精度はよくない。
不適切なエンコーディングで変換された場合、脆弱性になり得る。

## テスト環境
- OS : CentOS7
- PHP : 7.0.11

## エンコードテスト

UTF-8の文字列を`mb_convert_encoding`で各文字エンコーディングで変換し、`mb_detect_encoding`と`mb_check_encoding`で検出させる。

```php
    $str = 'てすと';

    $enc = [
      'UTF-8',
      'UTF-7',
      'ASCII',
      'EUC-JP',
      'SJIS',
      'eucJP-win',
      'SJIS-win',
      'JIS',
      'ISO-2022-JP',
      'Unicode',
    ];
    mb_detect_order($enc);

    foreach ($enc as $e) {
      $encoded = mb_convert_encoding($str, $e, 'UTF-8');
      var_dump(
            $e,
            $encoded,
            mb_detect_encoding($encoded),
            mb_check_encoding($encoded)
      );
    }
```

## 結果

|エンコード     |var_dump  |mb_detect_encoding|mb_check_encoding|
|-----------|----------|-------|---|
|UTF-8      |てすと      |UTF-8  |true|
|UTF-7      |+MGYwWTBo-|UTF-8  |true|
|ASCII      |???       |UTF-8  |true|
|EUC-JP     |""        |EUC-JP |true|
|eucJP-win  |""        |EUC-JP |true|
|SJIS       |""        |SJIS   |true|
|SJIS-win   |""        |SJIS   |true|
|JIS        |\$B\$F\$9\$H(B|UTF-8  |true|
|ISO-2022-JP|\$B\$F\$9\$H(B|UTF-8  |true|
|Unicode    |0f0Y0h    |UTF-8  |true|

SJISとかは一部表示されていない（バイナリとして解釈されている？）けどエンコーディングは取得できていた。
`mb_check_encoding`はすべての場合で検出できていた。
しかし適切に検出できているのか、とにかくtrueを返す残念な子なのか調べてみる。

## エンコード検出テスト

```php
    $str = 'てすと';

    $enc = [
      'UTF-8',
      'UTF-7',
      'ASCII',
      'EUC-JP',
      'eucJP-win',
      'SJIS',
      'SJIS-win',
      'JIS',
      'ISO-2022-JP',
      'Unicode',
    ];
    mb_detect_order($enc);

    foreach ($enc as $e) {
      $s = mb_convert_encoding($str, $e, 'UTF-8');
      $arr = [];
      foreach ($enc as $e2) {
        $arr[$e2] = mb_check_encoding($s, $e2);
      }
      var_dump($e, $arr);
    }
```

## 結果
|チェック＼エンコ|UTF-8|UTF-7|ASCII|EUC-JP|eucJP-win|SJIS|SJIS-win|JIS|ISO-2022-JP|Unicode|
|-----------|-----|-----|-----|------|---------|----|--------|---|-----------|-------|
|UTF-8      |    o|    o|    o|      |         |    |        |  o|          o|      o|
|UTF-7      |     |    o|    o|      |         |    |        |   |           |      o|
|ASCII      |     |    o|    o|      |         |    |        |  o|          o|      o|
|EUC-JP     |     |    o|    o|     o|        o|    |        |  o|          o|      o|
|eucJP-win  |     |    o|    o|     o|        o|    |        |  o|          o|      o|
|SJIS       |    o|    o|    o|     o|        o|   o|       o|  o|          o|      o|
|SJIS-win   |    o|    o|    o|     o|        o|   o|       o|  o|          o|      o|
|JIS        |     |    o|    o|      |         |    |        |  o|          o|      o|
|ISO-2022-JP|     |    o|    o|      |         |    |        |  o|          o|      o|
|Unicode    |     |    o|     |     o|        o|   o|       o|  o|          o|      o|

o…trueが返ってきたところ
縦がチェックしたエンコード、横が検出対象のエンコード。
予想以上にアテにならないようです。
動画から音声を削除する（Adobe Premire Pro / iMovie）

## 前提
* 前に雑音の消去をやったけれど忘れた。忘備録として記事にする
* 今回は音声自体の消去

## 環境
* Macbook Air 13-inch（OS X EL Capitan 10.11.16）
* Adobe Premire Pro CC 2015（v10.3 Blue Fox）
* iMovie（v10.1.2）

## 音声削除〜保存までの流れ（Adobe Premire Pro）
### 動画をロックして音声のみを選択し、deleteキーで削除
![16.51.50.png](https://qiita-image-store.s3.amazonaws.com/0/54129/4dcdb4bb-9cdd-7355-51a2-951ca2a8bfba.png "16.51.50.png")

### 音声のみが消えていればOK
![16.52.06.png](https://qiita-image-store.s3.amazonaws.com/0/54129/50f5a9de-0ba5-6613-9c5d-c8c275720810.png "16.52.06.png")

### 保存するときは「形式 H.264」
![16.56.14.png](https://qiita-image-store.s3.amazonaws.com/0/54129/ff918189-ea9a-9fb1-a4c6-d1d172a81285.png "16.56.14.png")

プルダウンでYouTubeの動画形式を選べる。
今回は元の画質が荒かったため適当に「720p HD」にしたが、より大きなサイズもある。

## 音声削除〜保存までの流れ（iMovie）

### 動画をアップして青いバー（音声）を0%にする
![6430afe85b08b757275fd4f2ae78ae42.gif](https://qiita-image-store.s3.amazonaws.com/0/54129/fc389736-cb99-14f7-1a7c-a3332aeba906.gif)

### ファイル > 共有 > YouTube
![12.30.04.png](https://qiita-image-store.s3.amazonaws.com/0/54129/6a4788c8-7ad8-929c-1d4f-04c52da0b16d.png)

### これで投稿できる
![12.29.43.png](https://qiita-image-store.s3.amazonaws.com/0/54129/3cf3b7ba-d186-513c-d081-e34bdfd3326d.png)

## まとめ
音声だけを消すのであればこれで十分。今手元にあるPremire Proで試したが、本当はもっと簡単なやり方やソフトがあると思うので見つけたら追記する。
pytest_report_header の使い方

[pytest](http://docs.pytest.org/en/latest/index.html)を使い始めました。初心者すぎて、まだ分からないことだらけです。

# テスト結果にヘッダーを出したい

[Adding info to test report header](http://doc.pytest.org/en/latest/example/simple.html?highlight=pytest_report_header#adding-info-to-test-report-header)に従って書いたつもりですが、テスト結果には何も表示されませんでした。

```tests.py
def pytest_report_header(config):
    return "sample: functional tests"
```

ヘッダーが表示されない原因は、上記のコードをテストコードがあるファイルに書いていたからでした。ドキュメントをちゃんと読めば、`# content of conftest.py`とあるように、conftest.pyというファイルに書かないとダメなのでした。

```conftest.py
def pytest_report_header(config):
    return "sample: functional tests"
```

```bash
# py.test -v tests.py
====================================================== test session starts ======================================================
platform linux -- Python 3.5.1, pytest-3.0.2, py-1.4.31, pluggy-0.3.1 -- /home/app/.pyenv/versions/3.5.1/bin/python3.5
cachedir: .cache
sample: functional tests
rootdir: /home/app, inifile: 
plugins: cov-2.3.1
collected 2 items 

tests.py::FunctionalTests::test_not_found PASSED
tests.py::FunctionalTests::test_resize_to_half PASSED

=================================================== 2 passed in 9.56 seconds ====================================================
```
macOS Sierra Docker Toolbox のインストーラがエラるので Brew cask でインストールした

# Docker Toolbox がインストールできない

環境: macOS Sierra, Docker toolbox 1.12.0

[Docker Toolbox はここからダウンロード](https://www.docker.com/products/docker-toolbox)

インストーラを起動して、「続ける」をクリックしたときに「内部エラー」「例外名: NSRangeException」が出る場合

----
### 以下、やってみたけど意味無かった
App Store の「アップデート」から、macOS と Xcode のアップデートをインストール
Xcode を1回起動しておく。
ターミナルから `$ xcode-select install`
インストーラを再実行。結果、変わらず

----

# Homebrew cask で入れるといい

brew を更新

```bash
$ brew update
...
Error: /usr/local must be writable!
...
```

というエラーが出た。El Capitan 未満の brew をずっと更新してなかったからかな

### パーミッションを変更

```bash:
$ sudo chown $(whoami):admin /usr/local && sudo chown -R $(whoami):admin /usr/local

$ brew update
```

アップデートできた。

```
==> Migrated HOMEBREW_REPOSITORY to /usr/local/Homebrew!
Homebrew no longer needs to have ownership of /usr/local. If you wish you can
return /usr/local to its default ownership with:
  sudo chown root:wheel /usr/local
```

と表示されたので、案内どおり

```bash:
$ sudo chown root:wheel /usr/local
```

としておく。

```bash:
$ brew uninstall --force brew-cask; brew untap phinze/cask; brew untap caskroom/cask; brew update; brew cleanup; brew cask cleanup
Error: No available tap phinze/cask.
Untapping caskroom/cask... (3,459 files, 3.6M)
Untapped 0 formulae
Already up-to-date.
```

```bash:
$ brew cask install docker-toolbox
==> Downloading https://github.com/docker/toolbox/releases/download/v1.12.1/DockerToolbox-1.12.1.pkg
######################################################################## 100.0%
==> Verifying checksum for Cask docker-toolbox
==> Running installer for docker-toolbox; your password may be necessary.
==> Package installers may write to any location; options such as --appdir are ignored.
==> installer: Package name is Docker Toolbox
==> installer: Installing at base path /
==> installer: The install was successful.
🍺  docker-toolbox was successfully installed!
```

docker-toolbox がインストールできた! 現時点でインストーラ版(1.12.0)よりバージョンが新しい。

```bash:
$ docker-machine ls
NAME   ACTIVE   DRIVER   STATE   URL   SWARM   DOCKER   ERRORS
```

docker-machine は無いので作る

```bash:
$ docker-machine create --driver "virtualbox"

$ eval $(docker-machine env default)

$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
c04b14da8d14: Pull complete
Digest: sha256:0256e8a36e2070f7bf2d0b0763dbabdd67798512411de4cdcf9431a1feb60fd9
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.
```

動いた!
warning: instance variable @parameterized_pending_cases not initialize


[rspec-parameterized](https://github.com/tomykaira/rspec-parameterized) specがわかりやすく書けて、とっても大好きです。

が、、、前々からちょっと気になっていたんだけど目をつぶっていた点が1つ。。。

```
warning: instance variable @parameterized_pending_cases not initialize
```

が頻発する!!!

というか Rails のプロジェクトでは出ないんだけど、最近書いているRailsじゃないspecでは頻発する。。。何が違うんだろう。。。

重い腰を上げてみたところ

https://github.com/rspec/rspec-core/commit/c51d38ccdd39adcc8f5554c9324421e7be89d9b7

これか～!!!!
最近 warngin を出すかどうかの設定が `.rspec` から `spec/spec_helper.rb` に移ったのかぁ。
そうかそうか、Railsの `spec/spec_helper.rb` はずっと前に生成したやつで、最近書いてるのは最近生成したから出るようになっちゃったのかぁ

と、思ったんですが。。。

`committed on 3 Jun 2014` 。。。 はい???

いやいや、Warningが出ないRailsのspec_helper.rbもそこまで古くはないっすよ。。。
と、思って双方のspec_helper.rbを見くらべてみると

Railsの方には `config.warnings = true` の記述はないが、Railsじゃない方は確かに `config.warnings = true` と書いてある。。。

へ? 何で??? と思って git の履歴を辿ってみたが、その部分は誰も手を加えていない。。。
怪奇現象!!!

と、いう事で双方のdiffをとってみると。。。

```diff
-# This file was generated by the `rails generate rspec:install` command. Conventionally, all
+# This file was generated by the `rspec --init` command. Conventionally, all
```

まじか!!! `rails generate rspec:install` と `rspec --init` だと違うもんが出てくるんかい。

Railsさんは気を効かせて

```ruby
 # This setting enables warnings. It's recommended, but in some cases may
 # be too noisy due to issues in dependencies.
 config.warnings = true
```

を削ってくれていたのね。ありがとうRails。ありがとう。。。。
ありがとう。。。
あり。。｡･ﾟ･(ﾉД`)･ﾟ･｡

### 後日談

Ruby 3.0 では https://github.com/ruby/ruby/blob/v3_0_0/NEWS.md の一番下に

> Accessing an uninitialized instance variable no longer emits a warning in verbose mode. [[Feature #17055]](https://bugs.ruby-lang.org/issues/17055)

と書いてある通り Ruby として Wraning が出ないようになりました。めでたしめでたし。
競技プログラミングで使うGo言語基礎


これだけ知ってればとりあえず問題は解けるよってやつ。
間違いの指摘等、コメントお待ちしてます。


#入力
一行読み込む

```go
var sc = bufio.NewScanner(os.Stdin)

func nextLine() string {
    sc.Scan()
    return sc.Text()
}

func main() {
    line := nextLine()
    // 処理
}
```
参考：[Go 言語で標準入力から読み込む競技プログラミングのアレ --- 改訂第二版](http://qiita.com/tnoda_/items/b503a72eac82862d30c6)


文字列を空白区切りでばらす

```go
s := "1 2 3 4"
cols := strings.Split(s, " ")
// cols[index]でアクセス
```

文字列をint変換する。

```go
s := "1234"
n, _ := strconv.Atoi(s)
```

文字列をfloat64に変換する

```go
s := "12.34"
f, _ := strconv.ParseFloat(s, 64) 
```

文字列に1文字ずつアクセス

```go
s := "abcd"
cols := strings.Split(s, "")
for _, c := range cols {
	// 処理
}
```

部分文字列を取り出す

```go
s1 := "0123456"
// 2番目から4番目（の手前）までを取り出す
s2 := s1[2:4]
// s2 : 23
```

#出力

fmt.Printもしくは、fmt.Println

- 引数はinterface{}型なので、int型等でもそのまま引数に渡せる
- 引数は可変長


```go
// 最後に改行あり、複数引数は間に半角スペース
fmt.Println(hoge, fuga)

// 改行なし、間に半角スペースなし
fmt.Print(hoge, fuga)
```
パフォーマンスを気にするときはこちらを参考
[Go 言語で標準出力に書き出す競技プログラミングのアレ](http://qiita.com/tnoda_/items/9febaa8a2d0335179a92)

#2次元配列

配列より可変であるSliceを使うことのほうが多い。一発でmakeできないので、以下のようにfor文で初期化する。


```go
// x*yのbool型のスライス
field := make([][]bool, x)
for i := 0; i < x; i++ {
    field[i] = make([]bool, y)
}
```
FuelPHPでmany_manyなリレーションを築く

FuelPHPでmany_manyなリレーションを築く
has_oneとかとちょっと順準備が必要なのでめも。

公式
http://fuelphp.jp/docs/1.8/packages/orm/relations/many_many.html


バージョン情報
- FuelPHP 1.8
- PHP7.0.6

# 準備
「Model_Project」と「Model_User」を関連付ける
A user **has many** projects.
A project **has many** users.
なリレーションにするので多対多です。


## Model_Project
リレーション情報をモデルクラスに追記。
関連付けるカラム名がFuelPHPの規則に従っていればカラム名の指定だけでできる。

```php
protected static $_many_many = ['users'];
```

## Model_User
同様

```php
protected static $_many_many = ['projects'];
```

## 中間テーブルの作成
この作業だけsql文を手打ちしないといけない。びみょい

```mysql
mysql -u my_name -my_password

use your_db_name;
CREATE TABLE IF NOT EXISTS `projects_users` (
	`project_id` int(11) NOT NULL,
	`user_id` int(11) NOT NULL,
	PRIMARY KEY (`project_id`,`user_id`)
);
```

## リレーションを築く
普通に追加する。既に構築済みのリレーションがあっても重複登録されないので便利。

```php
	$project = Model_Project::find(1);
	$project->users[] = Model_User::find(1);
	$project->save();
```

## リレーションを破壊する
縁を切るときはnullを代入して保存。

```php
	$user = Model_User::find(1);
	$user->project[0] = null;
	// $user->project = null;	# 全消し
	$user->save();
```
PHPデフォルト値設定の手法

# 普通に設定
複数行必要、長い

```php
$default_value = true;
$value         = false;

$prop = $default_value;
if (isset($value)) {
	$prop = $value;
}
var_dump($prop); // false
```

# 3項演算子を使う
1行で書けるものの、`$value`を2回記述するのでびみょい。

```php
$default_value = true;
$value         = false;

//	3項演算子
$prop = isset($value) ? $value : $default_value;
var_dump($prop); // false
```

# Null合体演算子（強そう）を使う
PHP5.3以上ならNull合体演算子もどきこと、`?:`演算子が使えます。
真のNull合体演算子`??`はPHP7までお預け。

```php
$default_value = true;
$value         = false;

//	Null合体演算子
#	true/falseで判定。PHP5.3以上で動作
$prop = $value ?: $default_value;
var_dump($prop); // true

#	null/それ以外で判定。PHP 7.0以上で動作
$prop = $value ?? $default_value;
var_dump($prop); // false
```

## 両者の違い

|演算子|比較条件|未定義変数|
|:-:|---|---|
|?:|真 / 偽|エラー|
|??|not null / null|可|

?:は真偽を含む変数では注意が必要であったり、
未定義変数が扱えないのでisset()?...の代用としては使えません。

# 無いなら作ればいいじゃない

```php
//	自作関数で何とかする
function exists(&$value, $default_value = '') {
	return isset($value) ? $value : $default_value;
}

$default_value = true;
$value         = false;

$props = exists($value, $default_value);
var_dump($props); // false
```


PHP7がメジャーになってきたら`??`使えるので楽になりそうです。
WRF > 並列化 > smpar / dmpar > SMPar is for multi-core/multi CPUs, and DMPar is for clusters.

```txt:動作環境
Xeon E5-2620 v4 (8コア) x 2
32GB RAM
CentOS 6.8 (64bit)
```

WRF(Weather Research and Forecasting Model)関連。

並列化時のオプションとしてsmparとdmparというのがあるようだ。
https://wolfscie.wordpress.com/2015/04/23/installing-wrf-on-centos-7/
> `3. Build WRF
> 
> If we use smpar option, then there is no need to call mpich to run WRF in parallel. Instead, we just need (for real case):
> `wrf.exe >& log.wrf.txt &`

>...
> Things are a little different with dmpar. With this option, we can run wrf.exe by using:
> `mpirun -np 8 wrf.exe >& log.wrf.txt &`


dmparとsmparの違いについては以下のQ7にも記載がある。
http://www2.mmm.ucar.edu/wrf/users/FAQ_files/FAQ_wrf_installation.html
> SMPar is for multi-core/multi CPUs,
> ...
> DMPar means "Distributed-memory Parallelism," which means MPI will be used in the build.

OpenMPについて記載されているが、MPICHだとどうなのかは今後調べる。