OmniAICreator/Qiita-1.07M huggingface dataset:
R 3.3.1/Debian (Jessie)でのEBImageインストール

Rで画像処理を行うパッケージ[EBImage](http://www.bioconductor.org/packages/devel/bioc/html/EBImage.html)。外部のライブラリとかいろいろ使っててインストール時のコンパイルでエラーになってハマることがあるらしく、案の定ハマったのでメモ。

よく言及されてるImageMagickとかgtkとかは既に入ってたのでよしとして。

インストールは`sudo R`と管理者で起動して、

```
source("http://bioconductor.org/biocLite.R")
biocLite("EBImage")
```

だが、やってみたらエラーになってインストールできない。

### お題 : BioC 3.1ではlibfftw3-devが必要です

原因はというと、

```
install.packages(pkgs = doing, lib = lib, ...) で: 
installation of package ‘fftwtools’ had non-zero exit status
```

というわけで、fftwtools依存パッケージがインストールできないためらしい。
ググるとfftwなる外部ライブラリが必要のようで、debian系apt-getというわけで、

```
sudo apt-get install fftw-dev
```

してみるとインストールされたがやっぱりダメ。さらに調べるとfftwにバージョンがあるらしい。

* [参考:Question: Problems updating Bioconductor with R 3.2.0](https://support.bioconductor.org/p/66799/)

>EBImage has changed in BioC 3.1: now it depends on CRAN package fftwtools which requires libfftw3-dev to compile.

だそうで。インストールの出力をよ〜く見ると確かに、

```
gcc -std=gnu99 -I/usr/share/R/include -DNDEBUG      -fpic  -g -O2 -fstack-protector-strong -Wformat -Werror=format-security -D_FORTIFY_SOURCE=2 -g  -c fftwtools.c -o fftwtools.o
fftwtools.c:28:18: fatal error: fftw3.h: そのようなファイルやディレクトリはありません
 #include<fftw3.h>
                  ^
compilation terminated.
/usr/lib/R/etc/Makeconf:132: recipe for target 'fftwtools.o' failed
```

としっかりオコられておりました…。

```
sudo apt-get install fftw3-dev
```

でインストールしなおして無事EBImageできるようになりましたとさ。
Groovyコーディング規約(Java使い向け)

# 背景

夏期インターン受け入れをやっていて、インターン生にGroovyで書いてもらっていたのですが、
なんとなく書き方がバラバラになったので、規約を作ってみました。

* [Groovyコーディング規約](https://github.com/sambatriste/groovy-code-conventions)

バリバリGroovyを書けるチーム向けというよりは、普段Java使いのチームにとって、

* そんなに負担なく覚えられて
* そこそこわかりやすい

書き方をしてもらうことを目標としています。

自分一人で書く場合は、もう少し違う書き方をしますが、
あまり細則を定めてもコスパが悪いので「そこそこ」にしています。


以下にREADMEより少し抜粋します。

## 目的

Groovyの文法はJavaとの互換性が非常に高いため、ほぼJavaと同じ書き方ができます。
これは **Java使いのGroovy初心者** にとって非常に大きいメリットといえます。

一方、Javaの文法だけを使用していると、Groovyの良さを活かしきれません。
Groovyの文法を活用すると、Javaで書くには非常にかったるい処理を
簡潔に記載することができます。

このようにGroovyは、Groovyぽく書くことも、Javaぽく書くこともできますが、
この記述の幅の大きさのため、人によってコーディングスタイルがバラバラになる可能性があります。

そこで、

* 普段はJava使いのGroovy初心者にやさしく
* Groovyらしさをそれなりに発揮できる

[Groovyコーディング規約](https://github.com/sambatriste/groovy-code-conventions)を考えてみました。

# 参考URL

以下のコーディング規約を参考にしました。

- http://groovy-lang.org/style-guide.html
- https://dzone.com/articles/groovy-coding-style
- http://aetas.pl/?p=247
RockyLinux 8以降/RHEL7以降での小技（CentOS/RHEL5～6ユーザー向け）

##概要 
CentOS7.x/RHEL7.xは、initアーキテクチャーからSystemdに置き換り、今までのUnixな感をあまり生かすことができなくなった、新たなアーキテクチャーが採用されました。
この記事は、CentOS7.x/RHEL7.xでよく利用する設定事項を、Systemd版で行うメモ情報となります。

### 自動起動するサービスの一覧を表示
```bash:
systemctl list-unit-files -t service
```
### サービスの自動起動をやめる
```bash:
systemctl disable svcname
```

### サービスの自動起動を設定する
```bash:
systemctl enable svcname
```

### サービスを起動する
```bash:
systemctl start svcname
```

### サービスを停止する
```bash:
systemctl stop svcname
```

### GUIモードで起動する（RunLevel5）
```bash:GUIモードで起動
systemctl set-default graphical.target
```

### CUIモードで起動する（RunLevel3）
```bash:CUIモードで起動
systemctl set-default multi-user.target
```


#### 参考
- http://ameblo.jp/yukisku/entry-11964626547.html
ShellからTwitter操作

#小鳥男氏のREADMEどおりで簡単にできた
https://github.com/ShellShoccar-jpn/kotoriotoko

#clone してくる

#twitterのDeveloper画面のAPIKey等4つをCONFIGファイルに書き込み

#sh tweet.sh --helpで丁寧なヘルプがでる
github > SVGファイルが見れる

https://github.com/blog/1902-svg-viewing-diffing

githubだとSVGファイルのプレビューが見えるようだ。
また、差分を取れるとのこと。

SVGプレビューをQiitaで表示する仕組みがあればいいのだが。
関連するのはこのあたりか ([stackoverflow](http://stackoverflow.com/questions/13808020/include-an-svg-hosted-on-github-in-markdown))。

github.ioに置くか、rawgithub.comのような外部サイトを使うか。githubのsvgがそのまま見れればいいのだが。
自動起動を切っておくサービス（サーバー編）for CentOS7.2

##概要
CentOS7.2をサーバーとして起動する上で、必要があまりないサービスはあらかじめ切っておいたほうが起動も早くかつ他のプロセスが邪魔をすることもなくなるので、パフォーマンスやサービス重複のトラブルも減ることが想定されます。
尚、RHEL7.2でも適用可能です。

##停止スクリプト
```bash:自動起動停止スクリプト
systemctl disable abrt-ccpp
systemctl disable abrt-oops
systemctl disable abrt-vmcore
systemctl disable hypervkvpd
systemctl disable hypervvssd
systemctl disable hypervfcopyd
systemctl disable firewalld
systemctl disable iscsi
systemctl disable ModemManager
systemctl disable qemu-guest-agent
systemctl disable bluetooth
systemctl disable mdmonitor
systemctl disable libvirtd
systemctl disable libstoragemgmt
systemctl disable rhsmcertd
systemctl disable spice-vdagentd
systemctl disable rtkit-daemon
systemctl disable dmraid-activation
systemctl disable ksm
systemctl disable ksmtuned
systemctl disable rngd
systemctl disable multipathd
```

##実行後
OS再起動で反映されます。
尚、Firewalldのサービス停止に関しては、利用用途に応じて変更してください。
$_SERVER['SCRIPT_NAME'];

mod_rewriteを利用する場合は$_SERVER['SCRIPT_NAME'];はフロントコントローラを指す！？

mod_rewriteを利用しない場合はそれぞれのファイルを指す。

※※※※※※※※※※※※※※※※※※※※※※※※※※※※
余裕がなくておおざっぱに書いて申し訳ございません_ _!!!
※※※※※※※※※※※※※※※※※※※※※※※※※※※※
R > 異なる実装環境で計算した結果を比較 > plot() / cor() / lsfit() + residuals

```txt:動作環境
RStudio 0.99.903 on Windows 7 pro
R version 3.3.1
```

異なる実装環境で計算したbook1.csvとtest1.csvの比較。
それぞれ2行目から600行目のデータを使う。

### 準備:データ読込み

```R
> setwd("d:/TestData/160911_R/")
> x<-read.table("Book1.csv")
> y<-read.table("test1.csv")
> xwrk<-as.numeric(as.matrix(x$V1[2:600]))
> ywrk<-as.numeric(as.matrix(y$V1[2:600]))
```

```R
> head(xwrk)
[1] 0.000215375 0.001302264 0.000659470 0.000127537
[5] 0.000659040 0.000118265
> head(ywrk)
[1] 0.0002154 0.0013023 0.0006595 0.0001275 0.0006590
[6] 0.0001183
```

### plot()

```R
> plot(xwrk, ywrk)
```

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/0be09305-0269-8ba3-8188-7d9a65a2ad1a.png)

### cor()

```R
> cor(xwrk,ywrk)
[1] 1
```

### lsfit() + residulas

参考 http://cse.naro.affrc.go.jp/takezawa/r-tips/r/70.html

```R
> z<-lsfit(xwrk,ywrk)
> plot(z$residuals)
```

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/59983531-1560-3545-2867-2c8f5921fc63.png)

大きな誤差はなさそう。
使用 octopress 发布网页时的一些技巧


####通过 rsync 发布到自己的远程服务器的方法####


修改 octopress 根目录下的 Rakefile 文件：

```config
ssh_user       = "user1@[服务器IP]"
ssh_port       = "9981" # 服务器端口
document_root  = "/data/wwwroot/"
rsync_delete   = true # 同步删除
rsync_args     = " --omit-dir-times --no-perms "  # 需要指定的 rsync 的参数
```

####rsync 命令出错及解决方法：####

_如上部分代码所示，这两个错误已经解决_

| 错误描述|在命令中加入参数|
|-------------|------------|
|rsync: failed to set permissions on …|--no-perms|
|rsync error: failed to set times on “.” Operation not permitted|--omit-dir-times|


####SSH 免登录的方式####

_这里方法其实网上有很多，anyway 若水三千，只取一瓢，这里纪录是我自己使用的方式，也比较通用_

**客户机操作步骤：**

```Bash
 ssh-keygen -t rsa # 本地生成公私钥
 ssh user1@[服务器IP] "mkdir .ssh" # 使用将来要登录到服务器的用户在其 home 目录创建 .ssh 目录，用于存放认证文件
 scp ~/.ssh/id_rsa.pub user1@[服务器IP]:.ssh/id_rsa.pub # 将本地公钥文件通过 scp 传输到服务器用户的 .ssh 目录下
```

**服务器操作步骤**

```Bash
 touch ~/.ssh/authorized_keys # 生成 authorized_keys (如果不存在的话)
 cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys # 将公钥（id_rsa.pub）的内容复制到 authorized_keys 文件

```

之后就可以在客户机上使用 `ssh user1@[服务器IP]` 的方式登陆服务器而无需再输入密码
Homebrewで旧バージョンに戻す方法

# HomebrewでEmacsを25.1から24.5.1に戻す

Homebrewで普通に`brew upgrade`してEmacs25.1をインストールしました。
IME（Google日本語）をオンにして入力すると、なんだかチラツキが発生しました。
`brew cask install emacs`も試してみましたが、チラツキは解消されませんでした。

他にも同じ事象になっている方がおられるようでした。

* [マスタカの ChangeLog メモ - Emacs-25.1 にアップデートした](https://masutaka.net/chalow/2016-09-18-1.html)
* https://twitter.com/takaxp/status/777492112258445313?ref_src=twsrc%5Etfw

そこで、24.5.1に戻したいと思い、25.1だけをアンインストールしたかったのですが、
[FAQ](https://github.com/Homebrew/brew/blob/master/share/doc/homebrew/FAQ.md) を見ても
`homebrew uninstall specific version`とかでググっても
それらしい情報が見つかりませんでした。
(そのバージョンを`rm -rf`しろ、とも書いてあったが本当？？)

# brew switch

で、結局`brew switch`で、使用したいバージョンのバイナリにシンボリックリンクの張替えができるとのことでした。

```shell-session
$ brew switch emacs 24.5
Cleaning /usr/local/Cellar/emacs/24.5
Cleaning /usr/local/Cellar/emacs/25.1
22 links created for /usr/local/Cellar/emacs/24.5
```

記述誤りやもっと良いやり方があれば御教示頂けると幸いです。
pack(),hex2bin()でデコード、unpack(),bin2hex()でエンコード

UTF-8の文字コードを並べたものから文字列を作るのにはpack() または hex2bin() を使う。
※hex2bin() はPHP 5.4以降
また、その逆に文字列を文字コードの並びの文字列に変換するのは unpack() または bin2hex()  を使う。
bin2hex() と unpack() は戻り値の型が違うので注意（前者は文字列、後者は配列）。

```php:decode_encode_test.php
mb_internal_encoding('UTF-8');

//header('Content-Type: text/plain;charset=utf-8');

$char = 'あ';
$hex_str = bin2hex($char);
echo $char . ':' . var_export($hex_str, true) . PHP_EOL;

$char_decoded = hex2bin($hex_str);
echo $char_decoded . PHP_EOL;

$char = 'い';
$hex_str = unpack('H*', $char);
echo $char . ':' . var_export($hex_str, true) . PHP_EOL;

$char_decoded = pack('H*', $hex_str[1]);
echo $char_decoded . PHP_EOL;

// "ア亜"
echo pack('H*', 'E382A2E4BA9C') . PHP_EOL;

// Windowsで入力するとハイフンマイナス（全角） UTF-8:EFBC8D Unicode:FF0D
echo pack('H*', 'EFBC8D') . PHP_EOL;

// Macで入力するとマイナス  UTF-8:E28892 Unicode:2212
echo pack('H*', 'E28892') . PHP_EOL;
```

実行結果は下記のようになる。

```
$ php decode_encode_test.php
あ:'e38182'
あ
い:array (
  1 => 'e38184',
)
い
ア亜
－
−
$ 
```

# 参考サイト
[PHPのunpack関数を活用する｜katyos開発室](http://ameblo.jp/katyos/entry-10242018757.html)
[【PHP】 16進エンコードされたバイナリ文字列をデコードする « PHP « 技術ブログ « 株式会社プロネット](http://www.p-nt.com/s/technicblog/archives/128)
[PHPでバイナリプログラミングその2 テキストとは何か : アシアルブログ](http://blog.asial.co.jp/754)
[Unicode対応 文字コード表](http://ash.jp/code/unitbl21.htm)
R > 2行目から600行目までを浮動小数点数として読込む > xwrk<-as.numeric(as.matrix(x$V1)[2:600])

```txt:動作環境
RStudio 0.99.903 on Windows 7 pro
R version 3.3.1
```

### データ

```value.csv
someValue1
0.0002154
0.0013023
0.0006595
0.0001275
0.0006590
0.0001183
0.0008723
0.0001750
0.0003121
0.0001123
0.0018614
0.0004775
0.0007699
0.0005948
...
```

### 読込み

1行目の項目名(`someValue1`)を除いた2行目から600行目までをプロットしたい。

```R
> setwd("D:/TestData/160911_R")
> x<-read.table("value.csv")
> plot(x$V1[2:600])
```

上記を実行したところ、以下となり、希望のグラフではなかった。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/3988d691-43b3-9980-395e-69c6e89a9e38.png)


```R
> head(x$V1)
[1] someValue1 0.0002154 0.0013023 0.0006595 0.0001275
[6] 0.0006590
628 Levels: 0.0000182 0.0000283 0.0000410 ... someValue1
```

[stackoverflow](http://stackoverflow.com/questions/24187629/how-to-convert-factor-to-float-without-losing-precision-in-r)にてas.numeric()を使った例があった。

ただし、as.numeric()だけではよく分からない数値が得られることがあるので、as.matrix()も併用するようだ。

```R
> setwd("D:/TestData/160911_R")
> x<-read.table("value.csv")
> xwrk<-as.numeric(as.matrix(x$V1)[2:600])
> plot(xwrk)
```

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/141f64c6-01b9-955c-ec3b-c8337150223f.png)

as.matrixあたりの書き方は以下でもよい。

```R
xwrk<-as.numeric(as.matrix(x$V1[2:600]))
```
mysql5.7が急に起動しなくなった


## 症状1

* 次のようなエラーが出て、mysqldが起動出来ない
	* `[ERROR] /usr/sbin/mysqld: Can't create/write to file '/var/run/mysqld/mysqld.pid' (Errcode: 2 - No such file or directory)`
	* `[ERROR] Can't start server: can't create PID file: No such file or directory`
* → `/var/run` 配下に`mysqld`というディレクトリがなかった。

## 対応

```bash
# mkdir /var/run/mysqld
# chown mysql:mysql /var/run/mysqld
# service mysqld start
```

これでOKです。

## 症状2

プラグインが読み込めないとかでログイン出来ない

```
2016-09-19T01:57:08.882670Z 0 [Warning] Failed to open optimizer cost constant tables

2016-09-19T01:57:08.891601Z 0 [Warning] The plugin '*151C1A8D637C2F25287AA421FF8D6AFEFBDDE9B1' used to authenticate user '{ユーザ名}'@'localhost' is not loaded. Nobody can currently login using this account.
```

## 対応

とりあえずrootでログインします。

```
$ mysql -u root -p
mysql> use mysql;
mysql> select * from user where User = "{ユーザ名}";

*************************** 1. row ***************************
                  Host: localhost
                  User: {ユーザ名}
                  ...
                  plugin: 151C1A8D637C2F25287AA421FF8D6AFEFBDDE9B1
                  ...
                  
                  
-- このpluginというカラムが、`mysql_native_password`になってないのが原因です。
-- まずはpluginの部分を直しましょう。

mysql> update user set plugin = 'mysql_native_password' where User = "{ユーザ名}";
-- この状態でパスワードの変更をしようとしてもまた、プラグインがおかしいと怒られるので、一度Flushします。
mysql> FLUSH PRIVILEGES;
mysql> set password for 'username'@'192.168.128.1' = password('pass');
mysql> exit;

$ mysql -u {ユーザ名} -p
mysql>
```

これではいれました。
String#slice!(nth)はIntegerではなく、Stringを返す。


__注意: この記事は2016/09/19現在のものです。またRubyのversionは2.3.0です。__

`String#slice!`は文字列を破壊的に変更するメソッドで、[Rubyの日本語マニュアルである
「るりま」](https://docs.ruby-lang.org/ja/2.3.0/method/String/i/slice=21.html)には次のように記述されています。

```
slice!(nth) -> Integer
slice!(pos, len) -> String
slice!(substr) -> String
slice!(regexp, nth = 0) -> String
slice!(first..last) -> String
slice!(first...last) -> String
slice!(regexp, nth = 0) -> String
```

要するに`String#slice`の引数にひとつの整数を与えたときは、メソッドの戻り値は整数になると「るりま」には記述されているわけですが……

```irb
irb(main):001:0> string = "ABCDEF"
=> "ABCDEF"
irb(main):002:0> string.slice!(0)
=> "A"
irb(main):003:0> string
=> "BCDEF"
```

文字列が戻り値になっているような気がします。確かにオーバーロード(?)されたメソッドで、戻り値が違うというのは少し違和感がありますね。

ちなみに[英語のRubyドキュメント](https://docs.ruby-lang.org/en/2.3.0/String.html#method-i-slice-21)をみたところ`String#slice!(nth)`でも文字列が返されるというような記述になっています。

```
slice!(fixnum) → new_str or nil 
slice!(fixnum, fixnum) → new_str or nil 
slice!(range) → new_str or nil 
slice!(regexp) → new_str or nil 
slice!(other_str) → new_str or nil 
```
Windows10のMicrosoft Edgeで急に「+」や「*」がうまく入力できなくなったので直した

今朝、いつも通り自宅のWindows10でMicrosoft Edgeを起動しネットサーフィンをしていると違和感が。

「あれ？「+」（Shift + ;）を押したらなぜか「:」が入力される。なぜ？」

他にも、「(」が「*」、「)」が「(」になったり、とにかく半角英数の入力が滅茶苦茶です。

何が要因でこうなったのかは定かではありませんが、とりあえず決めつけで「MSさん、Windows Updateで何やってくれているんですか」と静かな怒りを覚えつつ、解決策が分かったのでメモがてら記載します。


## 原因
キーボードレイアウトが日本語キーボードになっていないため

## 解決策
キーボードレイアウトを日本語キーボードに設定する
※参考：[Windows 10で日本語キーボードが101英語キーボードと認識されてしまう問題](http://freesoft.tvbok.com/win10/tips/keyboard.html)

１．「設定」→「時刻と言語」→「地域と言語」→「言語」の「日本語」をクリックし「オプション」を選択
![step1.png](https://qiita-image-store.s3.amazonaws.com/0/49502/bc9db335-9e61-12e1-2e59-36b6d3c3e630.png)


２．「ハードウェア キーボード レイアウト」の「レイアウトを変更する」をクリックする
![step2.png](https://qiita-image-store.s3.amazonaws.com/0/49502/41d0805c-02d9-a819-bdb2-dd025984ec2f.png)

３．「ハードウェア キーボード レイアウトの変更」画面が表示されるので、「日本語キーボード（106/109 キー）」を選択し、「サインアウト」をクリック
![step3.png](https://qiita-image-store.s3.amazonaws.com/0/49502/7917d832-0824-9938-f9cf-945966096aa5.png)

４．サインアウトするので、再度サインインする

## まとめ
今回は自宅PCでかつ調べる余裕があったので事なきを得ましたが、もしお客様の端末でセットアップを行っている中でいきなりこのような状態になったら・・・と思うとゾッとします。
OSXでDocker Toolbox(1.11)からDocker for Mac(1.12)に移行する方法

今までOSXで使っていたDocker 1.11 (Doker Toolbox)を、
Docker 1.12 (Docker for Mac)に切り替えたので方法を残しておこうと思います。

## 実施手順

私が行ったことは以下の通りです。

  1. Docker公式からDocker for Macのインストール用dmgをDLしてDocker.appをインストール
  2. Docker.appを起動すると、Toolboxの既存のDocker Hostからコンテナやイメージを移行するかを聞かれるので、移行する方を選択する
  3. 以下のスクリプトでToolboxを削除  
     https://github.com/docker/toolbox/blob/master/osx/uninstall.sh  
     **注意** Docker Machineを使っていて残したいものがある場合は "No"を選択すること
  4. `/usr/local/bin/` 内の docker関連コマンドが消えてしまったので、
    Docker.appを再起動したら復活
  5. Toolboxでのdocker関連コマンドが `/usr/local/bin/docker.backup` という感じにリネームされて残っていたので削除
  6. `~/.docker` を削除


Docker for Macは、既存のDocker ToolboxのDockerイメージなどを移行してくれるので、気兼ねなくインストールすることができます。
上記の手順で、Step.2 の時点でDocker for MacとToolboxを共存させた状態になり、併用したいのであればこのまま利用してよいようです。
これ以降でのdockerの利用は、今までやっていた `eval $(docker-machine env)` が不要になり、Dockerコンテナへのアクセスが`localhost`に変わります。

残りの Step.3 以降は Docker Toolbox を削除するための手順です。
uninstall.shは、Docker公式のスクリプトのようです。
このファイルを手元にDLして実行すると関連ファイルが削除されます。
中身は簡単なので実行前に見ておくといいと思います。

ただ、このスクリプトで削除される `/usr/local/bin/docker` コマンドなどは Docker for Mac と同じ場所だったようで、dockerコマンドなどが使えなくなってしまいました。
どうしようかと思ったものの、Docker.appを一度停止して再度起動したらコマンドが復活しました。
実際には、 `/usr/local/bin/docker` はシンボリックリンクになっていて、起動時に存在しなかったら再作成してくれるようです。

最後に、Docker.app はどうやら既存のdockerコマンドなどを、docker.backup という名前でリネームして残しておくようになっていたようなので、手動でこれらのファイルを削除しました。
また、`~/.docker`フォルダも残っていたので、これを消して完全に綺麗になったと思います。


## まとめ

この手順は、あくまで私が試行錯誤をやってみた手順なので、ちゃんと整理すれば簡単になると思います。


実際には試していませんが、おそらく以下が一番シンプルな流れだろうと思います。

  1. uninstall.sh を実行  
     このとき、最初に "Remove all Docker Machine VMs?" と言われるので、"No"を選択  
     **注意** ここで、Docker Machineを削除すると、あとで移行ができなくなると思います
  2. Docker for Macをインストールし、既存イメージなどを移行
  3. `docker-machine rm -f default` でDocker Machineの環境を削除
  4. `default`環境だけを使っていたのであれば `~/.docker` を削除  
     もし、他にも環境を使っている場合は残しておく必要があると思います
Wireshark の ciscodump ってどうなってるの？

# Wireshark で ciscodump を使うと何が起こるのかを見てみる。

[Wireshark 2.2.0](https://www.wireshark.org/docs/relnotes/wireshark-2.2.0.html)にて
`The Windows and OS X installers now come with the "sshdump" and "ciscodump" extcap interfaces. `
sshdumpとciscodumpというextcap interfaceが追加されました。

端的に言うと、リモートホストでpcap形式なキャプチャを取って、sshでリアルタイムに手元のWiresharkで表示させるという機能です。

せっかくなので使ってみたいですよね。
ということで設定するとどうなるのかを確認してみます。

### 準備 Cisco 機器 にてユーザを作成する。

```
RT(config)# username admin privilege 15 password 0 admin
RT(config)# line vty 0 4
RT(config-line)# login local
```

ciscodump では、enableパスワードとか今は無いので、privilege 15 なユーザが必要です。

### Wiresharkでsshdumpを使う

キャプチャ選択画面で初めてciscodumpを選ぶと設定項目が出るので
<pre>
Remote SSH server address &lt;Cisco機器のIPアドレスもしくはホスト名&gt;
Remote interface &lt;GigabitEthernet1/0/1 みたいなキャプチャしたい機器のインターフェース名&gt;
Packets to capture &lt;キャプチャしたいパケット数&gt;
Remote SSH server port &lt;Cisco機器のSSH待ち受けポート(普通は22)&gt;
Remote SSH server username &lt;上記準備で設定したユーザ名(ここではadmin)&gt;
Remote SSH server password &lt;上記準備で設定したパスワード(ここではadmin)&gt;
Path to SSH private key &lt;SSHユーザに鍵を設定した場合、秘密鍵ファイルを選択する(実際に使う場合はパスワードよりはこちらを推奨)&gt;
Remote capture filter &lt;キャプチャするデータにフィルタかけたい場合はここに記載&gt;
</pre>
こんな感じで記載事項に記載します。
Remote capture filter は Cisco のACLに記載する内容を,で区切って記載します。
例えば
deny tcp any eq 22 any , deny tcp any any eq 22 , permit ip any any
でSSHを除外したり。
適切にフィルタ設定してあげないとそれなりに負荷がかかりそうなので、そこそこ慎重になったほうがいいかもしれません。(必要なものをpermitベースで考えるとか)

### Cisco機器の設定を覗いてみる。
<pre>
RT# show monitor capture point all
Status Information for Capture Point WIRESHARK_CAPTURE_POINT
IPv4 CEF
Switch Path: IPv4 CEF            , Capture Buffer: WIRESHARK_CAPTURE_BU
Status : Active

Configuration:
monitor capture point ip cef WIRESHARK_CAPTURE_POINT &lt;interface&gt; both
</pre>

<pre>
RT# show monitor capture buffer all parameters
Capture buffer WIRESHARK_CAPTURE_BUFFER (linear buffer)
Buffer Size : 1048576 bytes, Max Element Size : 9500 bytes, Packets : 0
Allow-nth-pak : 0, Duration : 0 (seconds), Max packets : &lt;count&gt;, pps : 0
Associated Capture Points:
Name : WIRESHARK_CAPTURE_POINT, Status : Active
Configuration:
monitor capture buffer WIRESHARK_CAPTURE_BUFFER max-size 9500
monitor capture buffer WIRESHARK_CAPTURE_BUFFER limit packet-count &lt;count&gt;
monitor capture point associate WIRESHARK_CAPTURE_POINT WIRESHARK_CAPTURE_BUFFER
monitor capture buffer WIRESHARK_CAPTURE_BUFFER filter access-list WIRESHARK_CAPTURE_ACCESSLIST
</pre>

<pre>
RT#show running-config | section ip access-list
ip access-list extended WIRESHARK_CAPTURE_ACCESSLIST
 deny   tcp any any eq 22
 deny   tcp any eq 22 any
 permit ip any any
</pre>

### Wireshark 側でキャプチャを終了する。
Wiresharkのストップボタンを押すだけです。

### Cisco機器の設定を覗いてみる。
何やら設定が残っています……

### 終わりに
Wireshark 2.2.0 の機能である ciscodumpを使うと何が起こるのかを見てみました。

これをうまく使えば、Cisco機器で monitor capture して機器のFlashにいったん保存して、scp とかftpとかで手元の端末にキャプチャデータを転送するという手間が省けるのでは、という可能性を見ました。

ただ、終了の仕方によっては機器側に設定が残りっぱなしになってしまいます。
(Packets to captureで設定した分終わるまで待つ必要がある)
これは何とかならないとつらそうです。
virtualbox

```bash
[bomb@bombnet develop]$ vboxmanage list systemproperties     
API version:                     5_1
Minimum guest RAM size:          4 Megabytes
Maximum guest RAM size:          2097152 Megabytes
Minimum video RAM size:          0 Megabytes
Maximum video RAM size:          256 Megabytes
Maximum guest monitor count:     64
Minimum guest CPU count:         1
Maximum guest CPU count:         32
Virtual disk limit (info):       2199022206976 Bytes
Maximum Serial Port count:       4
Maximum Parallel Port count:     2
Maximum Boot Position:           4
Maximum PIIX3 Network Adapter count:   8
Maximum ICH9 Network Adapter count:   36
Maximum PIIX3 IDE Controllers:   1
Maximum ICH9 IDE Controllers:    1
Maximum IDE Port count:          2
Maximum Devices per IDE Port:    2
Maximum PIIX3 SATA Controllers:  1
Maximum ICH9 SATA Controllers:   8
Maximum SATA Port count:         30
Maximum Devices per SATA Port:   1
Maximum PIIX3 SCSI Controllers:  1
Maximum ICH9 SCSI Controllers:   8
Maximum SCSI Port count:         16
Maximum Devices per SCSI Port:   1
Maximum SAS PIIX3 Controllers:   1
Maximum SAS ICH9 Controllers:    8
Maximum SAS Port count:          255
Maximum Devices per SAS Port:    1
Maximum PIIX3 Floppy Controllers:1
Maximum ICH9 Floppy Controllers: 1
Maximum Floppy Port count:       1
Maximum Devices per Floppy Port: 2
Default machine folder:          /home/bomb/VirtualBox VMs
Raw-mode Supported:              yes
Exclusive HW virtualization use: on
Default hard disk format:        VDI
VRDE auth library:               VBoxAuth
Webservice auth. library:        VBoxAuth
Remote desktop ExtPack:          
Log history count:               3
Default frontend:                
Default audio driver:            Pulse
Autostart database path:         
Default Guest Additions ISO:     /usr/lib/virtualbox/additions/VBoxGuestAdditions.iso
Logging Level:                   all
```
Rubyで適切に文字列のArrayを型変換する方法

#やりたいこと

各要素がStringで与えられたArrayを適切な型に変換したい

```
['1', '2', '3'] -> [1, 2 ,3] # 整数
['1', '2', '3'] -> [1.0, 2.0 ,3.0] # 実数
...
```


# 解決策
## step 1

`['1', '2', '3'].map(&:to_i)`などが思いつく。

では、これを'float', 'integer'などの引数でコントロールできないかと考えた。

```rb
def convert(data_type)
  case data_type
  when 'integer'
    :to_i
  when 'float'
    :to_f
  else
    :itself
  end
end
```

このように定義しておけば、

```rb
['1', '2', '3'].map(&convert('integer'))
>> [1, 2, 3]
['1', '2', '3'].map(&convert('float'))
>> [1.0, 2.0, 3.0]
```
できた！


## step 2 

しかし、上の処理の場合、nilの入ったArrayだと以下のように`nil`が0に変換されてしまう。

```rb
['1', '2', nil].map(&convert('integer'))
>> [1, 2, 0]
['1', '2', nil].map(&convert('float'))
>> [1.0, 2.0, 0]

```

次の目的：nil以外のときに、変換をしたい！！


そこで軽くProcについて調べると、`:to_i`は`to_proc`で`Proc`に変換することができるので、上の関数に以下を加えることで、nilのときは、何もせず、nil以外のときに、`proc.call(x)`を呼ぶ＝変換する関数になる

```rb
proc = convert('integer').to_proc
-> (x) { proc.call(x) unless x.nil? }
```


全て

```rb
  def convert(data_type)
    symbol = case data_type
             when 'integer'
               :to_i
             when 'float'
               :to_f
             when 'date'
               :to_date
             when 'datetime'
               :to_datetime
             else
               :itself
             end
    proc = symbol.to_proc
    -> (x) { proc.call(x) unless x.nil? }
  end
```

これで、`['1', '2' , nil].map(&convert('float'))`が`[1.0, 2.0, nil]`を返すようになった！
RecyclerView の中に RecyclerView があると画面に表示される時に勝手にスクロールしてしまう場合の対処法

## 現象
RecyclerView（VERTICAL） で作っている画面の中に、RecyclerView（HORIZONTAL） を入れてみたら、画面表示時にスクロール位置がずれてしまう問題が発生

## 原因
RecyclerView（HORIZONTAL） に focus があたってしまい、そこまでスクロールしてしまっていた

## 対策
RecyclerView.Adapter を継承したクラスで ViewHolder 内の RecyclerView に setAdapter() したあとに setFocusable(false) を行うことで解消

```java
public class RecyclerViewAdapter extends RecyclerView.Adapter {

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        ViewHolder vh = new ViewHolder();
        RecyclerViewAdapter adapter = ...;
        vh.recyclerView.setAdapter(adapter);
        vh.recyclerView.setFocusable(false);
        return vh;
    }
} 
```

## その他
DrawerLayout 内でこれをやると、Drawer の開閉のたびにスクロール位置が変わってしまって気持ちわるかった
VirtualBoxのCentOS7にCakePHPを導入する

# 概要
VirtualBoxのCentOS7にCakePHPを導入する

# 環境
+ Windows 10(64Bit)
+ VirtualBox 5.1.6
+ Tera Term 4.92

# 導入環境
+ CentOS 7
+ CakePHP 3.0
+ MySQL 5.7.15
+ PHP 7.0.11
+ git
+ httpd
+ unzip

# 対象
+ VagrantやDockerを使わず環境構築したい人
+ VirtualBoxにOS導入出来る
+ Linuxのcmdを理解出来る
+ viの操作が出来る

# 記事を読んで出来る事
+ CakePHPの導入
+ ホストOSからゲストOSに導入されたCakePHPをブラウザから閲覧

# 手順
## VirtualBox仮想マシン作成
https://www.virtualbox.org/

|設定内容|値|
|:-----------|:------------|
|メモリ|2048MB|
|HDD|30G|

ネットワークのポートフォワーディング

|名前|プロトコル|ホストIP|ホストポート|ゲストIP|ゲストポート|
|:-----------|:------------|:------------|:------------|:------------|:------------|
|http|TCP||8888||80|
|ssh|TCP||2222||22|

## CentOS 導入
https://www.centos.org/download/

### 起動時の通信設定変更

```
vi /etc/sysconfig/network-scripts/ifcfg-eth3
```

|設定内容|値|
|:-----------|:------------|
|ONBOOT|yes|

## Tera Term 導入
https://osdn.jp/projects/ttssh2/releases/
この時点でssh接続出来る

## 必要なアプリインストール

```
yum -y install git unzip httpd
```

### MySQL
http://dev.mysql.com/downloads/repo/yum/
から、対象のOSのrpmを取得する

```
yum -y install http://dev.mysql.com/get/mysql57-community-release-el7-9.noarch.rpm
yum -y install mysql-community-server
```

### PHP7系

```
yum -y install epel-release
rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
yum -y install --enablerepo=remi,remi-php70 php php-devel php-mbstring php-intl php-mysql
```

### Composer
https://getcomposer.org/

```
curl -sS https://getcomposer.org/installer | php
mv composer.phar /usr/local/bin/composer
```

## ポート解放(80番)
http://www.unix-power.net/centos7/firewalld.html

```
firewall-cmd --zone=public --add-service=http --permanent
firewall-cmd --reload
firewall-cmd --add-port=80/tcp --zone=public --permanent
firewall-cmd --reload
```

## MySQL アカウント設定
+ MySQL起動
+ 初期パスワード閲覧
+ ログイン
+ パスワード設定

```
systemctl start mysqld
cat /var/log/mysqld.log | grep 'password is generated'
```

にて初期パスワードが閲覧出来るので

```
mysql -u root -p
*パスワード入力*
```

し、mysqlを立ち上げる

```
set password for root@localhost=password('任意');
```

任意の部分について
『validate_password』がデフォルト導入されていてかつ
『validate_password_policy』が『MEDIUM』なので複雑なパスワードにする必要がある。

```
uninstall plugin validate_password;
```

でアンインストールしてしまうのも手

## PHP 設定

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

|設定内容|値|
|:-----------|:------------|
|date.timezone|"Asia/Tokyo"|
|mbsting.language|Japanese|
|mbstring.internal_encoding|UTF-8|
|mbstring.http_input|UTF-8|
|mbstring.http_output|pass|
|mbstring.encoding_translation|On|
|mbstring.detect_order|auto|
|mbstring.substitute_charset|none|

## CakePHP 導入
~/に導入してもいいのですが、httpdと合わせて使いたかったので/var/www下に配置する事にしました。
/usr/local/bin/にパスを通してある場合冗長なコマンドになっています。

```
cd /var/www
php /usr/local/bin/composer create-project --prefer-dist cakephp/app "好きなプロダクト名"
```

## ApacheのDocumentRootに設定

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

|設定内容|値|
|:-----------|:------------|
|DocumentRoot|プロダクトの場所/webroot/|

## SELinuxを無効化
本設定まで実施し、ホストPCから『localhost:8888』へアクセスしてもエラーが出た。

```
setenforce 0
```

# 備考
+ 適時systemctl (start|restart|status)にて状況確認しながら作業すると吉
+ 適時rpm -qa | grep にてインストール済みか確認し、導入済みなら一度破棄するか読み飛ばすと吉
+ もっとスマートな実現方法ありましたら教えて下さい
cloud9でPHP7を使う

ここしばらく、常駐先で[Slim](http://www.slimframework.com)(PHPの)を使っていたのですが、いつものようにcloud9で試してみようとしたらそのままだとPHPのバージョンが低くて使えなかった。。。

[Cloud9でLEMP7-fpm環境](http://qiita.com/kohki-shikata/items/20d3301e1bfae2ef175f)
このような記事がありましたが、今回はPHP7だけ使いたいので、
[How to upgrade to PHP7](https://community.c9.io/t/how-to-upgrade-to-php7/1379)
こちらを試した時のメモ

## phpbrewをインストールする

後は、書いてある通りに実行すればphp7をコンパイル→インストールしてくれるみたいです

```shell-session
$ sudo apt-get update
# aptのレポジトリ情報更新

$ sudo apt-get install libmcrypt-dev
# libmcrypt-devのインストール

$ curl -L -O https://github.com/phpbrew/phpbrew/raw/master/phpbrew
$ chmod +x phpbrew
$ sudo mv phpbrew /usr/local/bin/
# phpbrewをダウンロードして、実行出来るように権限、パスの変更をする

$ phpbrew init
$ [[ -e ~/.phpbrew/bashrc ]] && source ~/.phpbrew/bashrc
# phpbrewの初期化とbashでの環境変数設定など

$ phpbrew lookup-prefix ubuntu
# ubuntu用に参照先を変更しているっぽい？

$ phpbrew install 7.0 +default
# php7のビルド/インストール

$ phpbrew switch php-7.0.1
$ phpbrew use php-7.0.1
# 上のビルド/インストールが終わったらインストールされたバージョンが出るのでその通りに

$ php -v
PHP 7.0.1 (cli) (built: Dec 29 2015 22:04:43) ( NTS )
Copyright (c) 1997-2015 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2015 Zend Technologies
```
技術英語 > but it's traveling with [a head-on collision] of 20,000 miles an hour, / rear end collision


@ LOE > August 8, 2003
http://www.loe.org/shows/shows.html?programID=03-P13-00032
> but it's traveling with <font color=red>a head-on collision</font> of 20,000 miles an hour,

https://en.wikipedia.org/wiki/Head-on_collision

<hr>
関連して気になるのは

http://ejje.weblio.jp/content/%E5%BE%8C%E9%9D%A2%E8%A1%9D%E7%AA%81

> <font color=red>rear end collision</font>

<hr>
Unityで終端速度を計算する式展開が興味深かった。

http://qiita.com/yuji_yasuhara/items/1f438f0f27f5ef854a73

<hr>
Unityは粒子の衝突時に変な位置ずれが発生しているようにも見受けられた（詳しくはみていない）が、以下のようなシミュレーションに使うことはできるのかどうか。

http://www.usm.uni-muenchen.de/~preibisch/planets2012/talks/uploads/15.pdf

過去の例からは粒子数2048でもしんどいだろうか。
http://qiita.com/7of9/items/642475a0fa9e052e05d2

Unityでリアルタイムレンダリングする意味はあるかどうかというのもある。
Debianでsystemctl使ったら表示が化けるんだけど？

# 結論: lv がpagerになってるから

日本語環境でインストールするとlvがインストールされて、これがデフォルトのpagerになるが、systemctlの出力が崩れる。回避策としては以下でpagerをlessなどにしてやる

```
$ sudo update-alternatives --config pager
```

## 面倒なんだけど？

まぁ、気づかない人が多いよな、と思ったので[BTSしておきました](https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=837218)。ノウハウでworkaroundするのは一つの手だけど、毎度バッドノウハウばっかり集めても、ねぇ？

## 他の回避策？

alis lv="lv -c" する。で、これを/etc/profile.d に放り込むというのがあり。ただ、lv -cしたくない人はどうすんの？はあるか
本当に最低限のGitコマンド集

本当に最低限に覚えるべきGitのコマンド集です。
実際のところ、もっと色々なコマンドやオプションを使いますが、
まず、これらが無ければ何も始まりません。

#リモートリポジトリからクローンする

```
git clone git@example\.git
```

```
git clone https\://example.git
```

#リモートリポジトリ(origin)からブランチ(master)へプルする

```
git pull origin master
```

#ローカルでの変更を次のコミットの対象に追加する

```
git add パス
```

#コミットする

```
git commit -m "example"
```

#リモートリポジトリ(origin)にブランチ(master)をプッシュする

```
git push origin master
```

ひとまず、ここまででなんとかなりますが、
出来ればあと一息、ついでに以下も覚えてしまいましょう。

#変更状態を表示する

```
git status
```

#コミット履歴を表示する

```
git log
```

// グラフ形式で表示する

```
git log --graph
```

#直前のコミットで行われた差分を表示する

```
git diff HEAD^
```

当記事が、どなたかの一助となれば幸いです。
[備忘録]AndroidでFragmentActivityのrequestCodeの範囲　(In-app Billingなどで使う、start～ForResult()などに影響。)

#FragmentActivityのstart～ForResult()などは、requestCodeの範囲に制限がある。

**リファレンスに書いてない**ので、(support.v4を使う場合は)要注意。

##requestCodeの範囲
[support.v4.app.FragmentActivity]
startActivityFromFragment()に関連するもの：16bit(0～65535？)

onActivityResult()に関連するもの：16bit(0～65535？)

requestPermissionsFromFragment()、
onRequestPermissionsResult()などに関連するもの：16bit(0～65535？)
※旧ソースでは8bit(0～255)

※詳細は・・FragmentActivityなどの、ソースコードを参照。
該当箇所は、あちこちに散らばっている。
(FragmentActivity以外では、BaseFragmentActivityGingerbreadなど。)

検索キーワード：
```checkForValidRequestCode```
```requestCode```
```ffff```
```>> 16```
```-1```
など。

##処理待ちのフラグメント数の上限
support.v4.app.FragmentActivityの処理待ちのフラグメント数は、
allocateRequestIndex()で制限されている。
(管理用のインデックスの上限は65534。requestCodeの上位16bitに、このインデックスを格納している。)

#補足1　エラーの例
この制限にかかると、startIntentSenderForResult()などを呼んだ時に、
java.lang.IllegalArgumentException: Can only use lower 16 bits for requestCode
などが表示されます。

#補足2　範囲制限の原因
FragmentActivityで、requestCodeの一部を、フラグメントの管理(上側16bit)などに使っているから。
※旧ソースでは、24(16+8)bit

#補足3　FragmentのstartActivityForResult()なども、requestCodeに制限がある
android.app.Fragment、android.support.v4.app.Fragmentともに、
startActivityForResult()、startIntentSenderForResult()、startIntentSenderForResult()などの引数のrequestCodeは、-1のみに制限されている。

Fragment.startActivityForResult()
 -> FragmentHostCallback.onStartActivityFromFragment()
が呼ばれて、ここで制限される。
詳細は、ソース参照で。

#参考
[Stackoverflow - Android: what to choose for requestcode values?]
http://stackoverflow.com/questions/33331073/android-what-to-choose-for-requestcode-values
~~※一部、旧ソースが含まれるので注意~~

変更があったのは、このあたり。
[Git repositories on android]
変更ログ - 86f3b80 Dispatch onRequestPermissionsResult to child fragments
https://android.googlesource.com/platform/frameworks/support/+/86f3b80ddf7f9aa5c5b7afe77217cb75632d62a2

[FragmentActivity.javaの変更ログ]
https://android.googlesource.com/platform/frameworks/support/+log/refs/heads/master/v4/java/android/support/v4/app/FragmentActivity.java
Tumblr APIで1日100円くらい稼いだ3ヵ月間の話

#はじめに
2014年あたりからTumblrを細々と始め、
どうせなら広告をはろうと思い、
とりあえず広告を貼り付け、
流れてきて記事に対して広告を貼り付けてリブログしたら
拡散されて広告収入が見込めるのでは？
と初めた、「Tumblr APIを使った自動リブログシステム」について。

#環境
- さくらレンタルサーバ
- 忍者AdMax
- Tumblr API

#作ったもの
- Tumblrで事前にリブログした情報をランダムに取得する
- 広告スクリプトを挿入する
- リブログする

#成果
##2016/04/25
Tumblr API使ったスクリプトをサーバーに置いて、URLを叩いてキックしてテストを実施。
青い線がインプレッション、緑の線が予想収益。

![1.png](https://qiita-image-store.s3.amazonaws.com/0/65994/a8c2ae0e-e03e-f95c-b179-955a2037afd9.png)

##2016/05/01〜
CRONで3回/毎時でキックされるように設定。
以降、３ヵ月に渡りスクリプトを走らせた。

![2.png](https://qiita-image-store.s3.amazonaws.com/0/65994/a1eaa070-0625-b1e7-40d5-d6fd499db25a.png)

##2016/09/01
...!? なにをマズったのかTumblrに問い合わせた。
![3.png](https://qiita-image-store.s3.amazonaws.com/0/65994/8c8a0f88-12a4-31f7-dca1-7c0c40160e90.png)

##2016/09/02
Σヽ(｀д´；)ﾉ うおおおおぉぉぉぉぉぉ！
![4.png](https://qiita-image-store.s3.amazonaws.com/0/65994/d76f7308-9613-0a4e-f81f-68ad4399ee29.png)

#まとめ
- ちょっとしたアイディアでマネタイズできます。
- ポリシーはちゃんと読みましょう。

# 2019/06/12 追記
ポリシーを守っていなかった件について振り返ると、
Jupyter Notebookでプログレスバーを表示して進捗を確認する方法

# はじめに

プログラミングをしていて、数の大きなデータを扱ったり、繰り返し処理を行っている時に「今、どのくらい終わっているのかな」と気になることがあると思いますが、Jupyter notebookでPrint文を多用すると少しわかりにくくなりますね。
そこで、アプリケーションをインストールする際に利用される進捗状況のプログレスバーをJupyter Notebookで使用する方法を紹介します。

# サンプルコード

## Python 2系

```.py:
from IPython.html.widgets import FloatProgress
from IPython.display import display
from time import sleep

fp = FloatProgress(min=0, max=100)
display(fp)

for i in xrange(100):
    sleep(0.1)
    fp.value = i
```

## Python 3系

```.py:
from IPython.html.widgets import FloatProgress
from IPython.display import display
from time import sleep

fp = FloatProgress(min=0, max=100)
display(fp)

for i in range(100):
    sleep(0.1)
    fp.value = i
```

追記。

```
ShimWarning: The `IPython.html` package has been deprecated. You should import from `notebook` instead. `IPython.html.widgets` has moved to `ipywidgets`.
  "`IPython.html.widgets` has moved to `ipywidgets`.", ShimWarning)
```

...という警告が表示される場合は、以下のとおり修正。

```py:
from ipywidgets import FloatProgress
from IPython.display import display
from time import sleep

fp = FloatProgress(min=0, max=100)
display(fp)

for i in range(100):
    sleep(0.1)
    fp.value = i
```

# 実行画面

![スクリーンショット 2016-09-19 4.03.26.png](https://qiita-image-store.s3.amazonaws.com/0/114240/640f768c-0821-7435-f8d4-09329bbe4912.png)

以上です。
ISUCON6に参加した話

#isuconとは
お題として与えられたwebアプリケーションをいい感じにチューニングする大会のこと。
１チーム2人から3人で出場できる。

#勉強したこと
自分はプログラミングメインで担当だったので、
・実装する言語(ruby)の勉強
・gemやsinatraについて調べる
などをしてました。
あと、大会当日の使用するAzuruでの練習もしておいた。

#予選当日
一番の難関の大会までに起きることには成功した。
さぁ、大会本場です。
##予選
###10:00
インスタンスを起動させてとりあえず待機。
朝食とか食べながら概要や大会のルール等の確認をしてた。
###10:45
とりあえず初期実装でベンチを回す。
スコアは結構いい感じ。

![スクリーンショット 2016-09-18 10.56.11（2）.png](https://qiita-image-store.s3.amazonaws.com/0/113331/c3572e0e-40dd-cd52-3744-4fb3851d2ab9.png)


(もしかしたらもしかして本戦いけるんじゃね？)
とか甘いことを思い始める。

###11:30
実装言語の変更の仕方がわからず発狂。
他のチームメンバが調整したのに合わせてベンチを回す。

###12:00
実装の変更がようやくできて喜びながらベンチを回すが、
スコアが0点に焦る。
そんでもって、結局初期実装に戻す。

###1:30
落ち着いてうどんを食べに行く。
###2:00
とりあえずrubyのソースを見る。
しかし読めない。
###5:00
相変わらず読めない。
神に祈りを捧げたりしながらベンチをひたすら回す。
これが大会終了まで続く。

#大会終了
最終スコアは4100点くらいになりました。

#反省
自分の反省点としては
・rubyを読書き馴れていなかった
・mysqlが全くと言ってわからない
・**圧倒的勉強・知識不足**
でした。
あと、今回の大会ではベンチの仕様の関係で以前までと比べて、rubyで実装は難しかったみたいです。

#まとめ
初参戦でしたがなかなか面白い大会だなぁ、と思いました。
ただ、自分の実力がまだまだだったので、もっとできるようになって楽しみたいと思いました。
当分の目標は改めてチームメンバーでrubyとmysqlの勉強、今回はほとんど任せっきりだったサーバー側の知識をつけたいと思います。
Unity5.3でuFrame使ってみた

Unity5.3でuFrame使います。
自分用メモです。

##流れ
- チュートリアルの動画を見て同じことをやってみる




##チュートリアルの動画を見て同じことをやってみる
チュートリアル動画ではuFrameの全体的な説明から始まって簡単なプロジェクトの作り方の紹介があった。

- uFrameではuFrameのProjectを作成する
- 1つのUnityプロジェクトの中に複数のuFrame Projectを作成することができる

***
uFrame1.6系をインポートするとエラーが出た

```lang:エラー
Assets/uFrame/MVVM/Framework/Editor/Templates/uFrameTemplates.cs(144,48): error CS0246: The type or namespace name `UGUIExtensions' could not be found. Are you missing a using directive or an assembly reference?
```

```lang:解決方法
uFrame/MVVM/Framework/MVVM/Views/Bindings/UGUIBindings.cs
の一行目を
#if UNITY_4_6 || UNITY_5_0 || UNITY_5_1 || UNITY_5_2 || UNITY_5_3
に修正
```

***
ノードを作ってみるもノードのTextureの色が白、テキストは灰色のためとても見にくい。
メニューのuFrame/Settingsを開くと背景色とかがいじれるようになっているんだけど、Nodeに関する色の変更ができなかった。

```lang:解決方法
Editorファイルの中にあるHeader3.pngを直接茶色とかにする
```

***
上でHeader3.png画像を編集したので大丈夫かと思いきや、エラーが発生

```lang:エラー
UnityException: Texture 'Header3' is not readable, the texture memory can not be accessed from scripts. You can make the texture readable in the Texture Import Settings.
UnityEngine.Texture2D.GetPixels32 ()
```

```lang:解決方法
1: Header3のインスペクターを見る
2: Texture Typeを Advanced に変更
3: Read/Write Enabled プロパティにチェックを入れる
```
<img width="510" alt="スクリーンショット 2016-02-12 0.24.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/67575/5fb0a62b-7858-9b5b-3c96-b367a6878514.png">

***
さあ、SimpleClassのNodeを作成したところでバグ

```lang:バグ
PropertiesやCollectionsの「+」ボタンを押してそのSimpleClassにプロパティ等を追加させようとしたら、
プロパティ名が1文字しか入力できない
```

```lang:解決方法
uFrameウィンドウを最大化する。
なぜか最大化すると2文字以上の入力を受け付けるようになる。一旦最大化しちゃえばサイズを元に戻してもバグは解消される。
```

<img width="179" alt="スクリーンショット 2016-02-12 0.30.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/67575/f386e020-33bf-6d08-c8c1-108fa3500b3c.png">
**Shift + Space でウィンドウが最大化できるから便利だよ**
***
Type Reference の Nodeを作成するとオリジナルの型が定義できるらしい。らくちん
Type Referenceで List<strings>みたいな型を作るとList<strings>型が作成される。
ちなみに、SimpleClassのCollectionsでも似たような変数の定義はできるけど、Collectionsでやると絶対List<T>になるらしい。

![スクリーンショット 2016-02-12 0.39.14.png](https://qiita-image-store.s3.amazonaws.com/0/67575/d8ee5a52-0d70-87f4-51ba-2e358e5fd8a8.png)

***
Subsystemを作ってみる。
Subsystemの作り方は二つある。

1: Graph上で右クリックして Add Sub System を選択する方法
<img width="179" alt="スクリーンショット 2016-02-12 0.47.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/67575/6e61bed0-ae5f-e0aa-426a-9f624c048914.png">

2: もう一個がuFrameのウィンドウのプルダウンメニューからCreate SubsystemGraph を選択する方法
<img width="326" alt="スクリーンショット 2016-02-12 0.48.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/67575/9fb30565-c76a-5f19-4661-cb047c390b1c.png">
Subsystem用のグラフが作成される
![スクリーンショット 2016-02-12 0.47.11.png](https://qiita-image-store.s3.amazonaws.com/0/67575/ac78edcd-35a7-3e38-385f-be98d2abc1be.png)

1と2の方法どちらがいいか。
チュートリアルでは2の方がいいかもって言ってた。
「複数人数でやると1の方法だとコンフリクトが起きやすいよ。2だとSubsystemが別ファイルになるから便利よ」的なことを言ってたと思う。違ってたらすまん。
もっかい見たら「2でやればエクスポートができるから別のプロジェクトで使いまわせるよ」的なことを言ってる気がする。
ゲーム数学入門 ラジアン

##ラジアン
ラジアンは、一周を360度とする度数法よりもわかりやすい角度定義である。

```
180度をπ,360度を2πとする。
円周上に沿って1だけ動いた時の角度θを1ラジアン(通常は単位を省略するので1)とする。
```

単位円の時、円周の長さは (円周の長さの公式は2πrなので) 2πである。
なので、ラジアンで角度を表す時、360度は2πラジアンになる。

定数πを使う限り、度で表現するよりラジアンで表現する方がシンプルになる。
だって、一周=2πなんだもの。
360度というキリの悪い数字より遥かに良い。

##加法定理
θ分ずれたって、cosθとsinθで円周上のどこに移動するかがわかる
![kahouteiri-3.gif](https://qiita-image-store.s3.amazonaws.com/0/67575/3d54ab40-47d8-a3ef-1f15-63e65f2b2b9d.gif)

ようは、cosθがx座標,sinθがy座標になるだけ

ちょっと参考画像と違うけど
内角aの位置にある点P:(cosα,sinα)をbだけ回転移動した点の座標がP'(cos(a+b),sin(a+b))になる

語呂合わせで覚える
<img width="492" alt="スクリーンショット 2016-06-29 0.05.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/67575/da992aca-1c2e-1cb4-3b34-0a87b9b36bcd.png">
よく使うpipコマンド

よく使うpipコマンドのメモ。

### バージョンを確認する
```console
$ pip --version
pip 10.0.1 from ~/.pyenv/versions/3.5.3/lib/python3.5/site-packages/pip (python 3.5)
```

### 普通にパッケージをインストールする (例えばFlask)
```sh
pip install Flask
```

### requirements.txtに定義されたパッケージをインストールする
```sh
pip install -r requirements.txt
```

### インストール済みのパッケージを表示する
```sh
pip list
```

### インストール済みのパッケージをrequires.txt形式で表示する
```sh
pip freeze
```

### インストール済みのパッケージのうち、最新でないものを表示する
```sh
pip list --outdated
```

### インストール済みのパッケージのうち、最新でないものをアップデートする
```sh
pip list --outdated | awk 'NR>2 {print $1}' | xargs pip install -U
```

### インストール済みのパッケージを全て削除する
```sh
pip freeze | xargs pip uninstall -y
```
crystalをやってみる

３連休ということで？、erlang, elixir, scala, rustとやった。で、頭がフラフラしてきたので、ほぼrubyだというcrystalを使ってみる。

まず、インストール

```bash:terminal
brew install crystal-lang
```

以下、使用感をいつくか。

# シェルも正規表現もOK
最近シェルスクリプトの代わりにrubyを使ったので\`\`（シェルプログラム呼び出し）が動くか見てみる。以下のようにmyがつくファイルを列挙し、正規表現でキャッシュしてみる。

```ruby:test1.cr
text = `find ~/proj/ -name *my*`
text.split("\n").each do |row|
    if row =~ /(my.*)/
        puts $1
    end
end
```

上記は、Ruby(`ruby test1.cr`)でもCrystal(`crystal test1.cr`)でも**全く同じに動く**。合格


# Rubyとは違うところ(空配列)
> https://praveenatc42.wordpress.com/2016/01/09/crystal-for-rubyists/

を見るにRubyとCrystalは色々と違うらしい。例えば以下のように、型推定ができないので空配列は無理がある。

```ruby:
Compilation:- compiler error introduction
   array = []

   array << "hello" #=>  CRASH in crystal
   array << "hello" #=>  WORKS FINE in Ruby

   Solution : Specify types of value array can have upfront.

   array = [] of String # In crystal
```

しかし`[] of String`と型を追加してみれば、acc_text配列に集めていくようなコードも問題なく動く。

```ruby:test2.cr
text = `find ~/proj/ -name *my*`
#acc_text = [] # for Ruby
acc_text = [] of String
text.split("\n").each do |row|
    if row =~ /(my.*)/
        acc_text << $1
    end
end
puts "#{acc_text}"
```

また、ダミーでもなんでも、最初に要素を入れておけば（例`text = ["dummy"]`）型の指定は不要である。

```ruby:test3.cr
text = `find ~/proj/ -name *my*`
acc_text = ["dummy"]
text.split("\n").each do |row|
    if row =~ /(my.*)/
        acc_text << $1
    end
end
acc_text.delete_at(0)   # remove "dummy" from array
puts "#{acc_text}"
```

# 並行プログラム = Beyond Ruby (spawn, concurrency, channel)
これがないと最近の言語を名乗れないらしい、「spawn, concurrency, channel」に**crystalは対応している**。

> http://nithinbekal.com/notes/crystal/

Rubyにはない(Rubyで試すと`spawn.cr:1:in `<main>': undefined method `Channel' for main:Object (NoMethodError)`)ともちろんコンパイルエラーになる。


せっかくなので試してみる。

```ruby:spawn.cr
ch = Channel(String).new
spawn do
  puts ch.receive
  puts ch.receive
  puts ch.receive
end

spawn do
  ch.send("apple")
  ch.send("orange")
end
ch.send("grape")
```

```bash:terminal
$ crystal spawn.cr
grape
apple
orange
```

＃よく理解していないが動いているようだ。


が、次のようにすると

```ruby:spawn2.cr
ch1 = Channel(String).new
ch2 = Channel(String).new
spawn do
  puts ch1.receive
  puts ch2.receive
  puts ch1.receive
end

spawn do
  ch1.send("apple2")
  ch2.send("orange2")
end
ch1.send("grape2")
```

以下のように、grape2しか出てこない。。なぜ？？

```bash:terminal
$ crystal spawn2.cr
grape2
```

わかったような。

- puts ch1.receiveのブロックに、ch1.send("grape2")は問題なし。
- puts ch2.receiveのブロックに、ch1.send("apple2")は・・・、
 - 受信側は、ch2で待っているのに来たのはch1へのsend。といういうことでまだ待つ。
 - 送信側は、ch1.send("apple2")の後、ch2.send("orange2")をするかと思うと、ch1を受信してくれないので、次のch2.send("orange2")には行けず。

なるほど、送信側でもブロックするのか。。

# 最後に

erlang, elixir, scala, rustよりは簡単だろう。ということでちょっとcrystalを使ってみたが、思ったよりいい。

- 単に高速なrubyではなく、新しい要素もあるようで思ったより良いかもしれない。asm文の挿入などもできるみたいだし。
- 確かにrubyでかけるのは嬉しい！。少なくともrustのようにうるさくないし（が正規表現でキャッチせずに$1を表示したら実行時にfaultしたのでcrystalはrustのようにはメモリ安全ではない）。mix deps.getとかiex -S mix とかやるelixirより手続きが楽。
[google-oauth] ユーザー情報取得

# APIでユーザー情報取得するまでの流れをやってみた

```python
from oauth2client.client import flow_from_clientsecrets
from apiclient.discovery import build
import webbrowser
import httplib2
flow = flow_from_clientsecrets('./oauth2.json',
                                scope='openid',
                                redirect_uri='http://localhost:8080')
url_l = flow.step1_get_authorize_url()
webbrowser.open(url_l)

## ブラウザに表示されているURLのcode=###をコピー

code = '######'
cre = flow.step2_exchange(code)
http = cre.authorize(httplib2.Http())
service = build('oauth2','v2',http=http)
a = service.userinfo().get().execute()
```

aがユーザー情報を持っているのを確認したので一段落。
buildで作ったResourceオブジェクトのインスタンスは、executeしないと動かないのね。
内部で何やってるのか知らないけど、静的に関数保有してないみたいで
iPython使ってたのに候補が出てこなかった。
次はユーザー管理方法とログアウト制御方法だなー。

ローカルでデータ処理するだけのプログラムに比べると
なんでこう、Webアプリってのは面倒なんだ。
neo4jでデータをexportする (neo4j-shell-tools)

neo4jを利用してデータをexportするまでの流れを見ます。
neo4j自体の利用についてはいろいろな人が書いているので…。

# 下準備

今回はDockerでneo4jを利用します。公式のリポジトリを利用するのですが、neo4j-shell-toolsは入っていないため、若干拡張します。

* [公式Docker image](https://hub.docker.com/_/neo4j/)
* [neo4j-shell-tools](https://github.com/jexp/neo4j-shell-tools)

上記に対応したDockerfileは以下に置きました。

https://github.com/tkit/neo4j-dockerfile

`README`に従ってDockerを起動してください。  
一度コンテナを停止すると、 `${HOME}/neo4j`配下にデータファイルが置かれます。

# データを投入する

どんなデータを使ってもいいのですが、公式にデータが置かれているので、それを使います。

https://neo4j.com/developer/example-data/

下の方にある「cineasts_12k_movies_50k_actors.zip (14MB)」をダウンロード、展開してください。  
`graph.db` というディレクトリが作成されます。このファイルをデータファイルとして上書きします。

```bash
$ rm -rf ${HOME}/neo4j/data/databases/graph.db
$ cp -pr graph.db ${HOME}/neo4j/data/databases/graph.db
```

終わったらもう一度dockerを起動します。

```bash
$ docker start neo4j_custom
```

http://localhost:7474/browser/ にアクセスして適当なクエリを実行すると、データが反映されていることが分かります。

![データ投入後](https://qiita-image-store.s3.amazonaws.com/0/16458/993093c0-c5b8-6b8d-2fbb-3437c8578bca.png)

# データをエクスポートする

コンテナの外から`neo4j-shell`コマンドによって様々な操作を行うことができます。

```bash
$ docker exec neo4j_custom bin/neo4j-shell -c "help"
```

> Available commands: alias begin call cd commit create cypher dbinfo drop dump env explain export foreach gsh help index jsh load ls man match merge mknode mkrel mv optional paths planner profile pwd return rm rmnode rmrel rollback runtime schema set start trav unwind using with
Use man <command> for info about each command.

上記が公式コンテナの利用できるコマンドで、以下が`neo4j-shell-tools`を追加した後に利用できるコマンドです。若干増えています。
(ちなみに`export-binary`コマンドなども使えるはずなのですが使えないのはなんでだろう)

> Available commands: alias auto-index begin call cd commit create cypher dbinfo drop dump env eval explain export export-cypher export-graphml foreach gsh help import-cypher import-geoff import-graphml index jsh load ls man match merge mknode mkrel mv optional paths planner profile pwd return rm rmnode rmrel rollback runtime schema set start trav unwind using with
Use man <command> for info about each command.

この中から、今回は`export-cypher`コマンドを利用します。

```bash
$ docker exec neo4j_custom bin/neo4j-shell -c "help export-cypher"


  -b	 Batch Size default 1000.
  -o	 Output Cypher file.
  -r	 Add all nodes of selected relationships.
```

```bash
$ docker exec neo4j_custom bin/neo4j-shell -c "export-cypher -o /tmp/backup.log"
Wrote Nodes 0. 100%: nodes = 63042 rels = 466766 properties = 0 time 2057 ms total 2057 ms
Wrote Relationships 1. 100%: nodes = 63042 rels = 573417 properties = 94754 time 1598 ms total 3655 ms
Wrote to Cypher-file /tmp/backup.log 2. 100%: nodes = 63042 rels = 573417 properties = 94754 time 3 ms total 3658 ms
```

これでバックアップが完了します。`/tmp/backup.log`にcypher形式でデータが保管されているので、緊急時はこれからデータを戻せば良さそうです。

# その他

community editionだとHA系の機能が軒並み使えないので、community editionでバックアップをオンライン中に取る場合はどうしたらいいのだろうと考えた結果、この方式なのかなと思っています。

この`export-cypher`コマンド実行中にCRUDのうちCとRは行ってみましたが、普通に結果が返ってきていましたので、ロックがかかっているわけではないのかな？と思います。(それはそれで疑問なのですが、そこまで調べていません)
iPhoneでinput type=textがスクロールできない現象の対策

# textareaを使う（スマホのみのサイトの場合）
スマホ限定で対策する場合は、`textarea`を使うと割と簡単に対策できます。

## サンプル

http://runstant.com/simiraaaa/projects/iPhone_input_textarea

## HTML 

`class="inputtext"` に対して、iPhone用にスクロールできる `input type=text` と同じような動きをするようにします。
`wrap="off"` で、勝手に改行されないようになります。いちいちつけるのが面倒な場合は、JS側でつけちゃってもいいと思います。

```html

<textarea wrap="off" class="inputtext"></textarea>

```

## CSS

`overflow-y: hidden;`で縦スクロールできないようにしています。
`overflow-x: scroll;`で横スクロールできるようにしていますが、 `auto` でも良いです。
`height:1.8em;`は、`input`タグがだいたいそのぐらいだったので、適当につけてます。この辺りは調整してください。

```css

textarea.inputtext {
  overflow-y: hidden;
  overflow-x: scroll;
  resize: none;
  height:1.8em;
}

```

## JavaScript

bodyのロードが完了した後に、 `class="inputtext"` を取得して、改行できないようにしています。

```js

var inputs = document.getElementsByClassName('inputtext');
if(inputs){
  var onkeydown = function(e){
    // エンターキーが押されたとき
    if(e.keyCode === 13){
      // デフォルトの動作を停止
      e.preventDefault();
    }
  };
  
  var oninput = function(e){
    var text = this.value;
    // コピペ等で改行が入った場合の対策
    // 改行コードが含まれるとき
    if(/\r?\n/.test(text)){
      this.value = text.replace(/\r?\n/g, '');
    }
  };
  // イベントリスナを登録していく。
  [].forEach.call(inputs, function(input){
    input.addEventListener('keydown', onkeydown);
    input.addEventListener('input', oninput);
  });
}

```

# PCも考慮した対策

PCだとスクロールバーが邪魔で入力内容が見えなくなってしまいます。
これを考慮した対策として、iPhoneかiPadじゃないとき、`overflow-x: hidden;` のクラスを追加しています。
確認していませんが、多分こんな感じで、できる気がします。

## CSS

```css

textarea.isnotios { overflow-x: hidden !important;}

```

## JavaScript

```js

var isNotIOS = !/iphone|ipad/i.test(navigator.userAgent);
if(isNotIOS) { input.classList.add('isnotios');}

```