OmniAICreator/Qiita-1.07M huggingface dataset:
Vim環境整備

#NeoBundle
NeoBundleをインストールする。

```shell-session
 curl https://raw.githubusercontent.com/Shougo/neobundle.vim/master/bin/install.sh | sh
```

```vim
"NeoBundle setting area -----------------
"NeoBundle Scripts-----------------------------
if &compatible
  set nocompatible               " Be iMproved
endif

" Required:
set runtimepath+=/home/yu/.vim/bundle/neobundle.vim/

" Required:
call neobundle#begin(expand('/home/yu/.vim/bundle'))

" Let NeoBundle manage NeoBundle
" Required:
NeoBundleFetch 'Shougo/neobundle.vim'

" Add or remove your Bundles here:
NeoBundle 'Shougo/neosnippet.vim'
NeoBundle 'Shougo/neosnippet-snippets'
NeoBundle 'tpope/vim-fugitive'
NeoBundle 'ctrlpvim/ctrlp.vim'
NeoBundle 'flazz/vim-colorschemes'
NeoBundle 'scrooloose/nerdtree'
NeoBundle 'fholgado/minibufexpl.vim'

" You can specify revision/branch/tag.
NeoBundle 'Shougo/vimshell', { 'rev' : '3787e5' }

" Required:
call neobundle#end()

" Required:
filetype plugin indent on

" If there are uninstalled bundles found on startup,
" this will conveniently prompt you to install them.
NeoBundleCheck

"End NeoBundle Scripts-------------------------
" Jedi for python
NeoBundleLazy "davidhalter/jedi-vim", {
    \ "autoload": { "filetypes": [ "python", "python3", "djangohtml"] }}

if ! empty(neobundle#get("jedi-vim"))
  let g:jedi#auto_initialization = 1
  let g:jedi#auto_vim_configuration = 1

  nnoremap [jedi] <Nop>
  xnoremap [jedi] <Nop>
  nmap <Leader>j [jedi]
  xmap <Leader>j [jedi]

  let g:jedi#completions_command = "<C-a>" 
  let g:jedi#goto_assignments_command = "<C-g>" 
  let g:jedi#goto_definitions_command = "<C-d>" 
  let g:jedi#documentation_command = "<C-k>"  
  let g:jedi#rename_command = "[jedi]r"
  let g:jedi#usages_command = "[jedi]n"
  let g:jedi#popup_select_first = 0
  let g:jedi#popup_on_dot = 0

  autocmd FileType python setlocal completeopt-=preview

  " for w/ neocomplete
    if ! empty(neobundle#get("neocomplete.vim"))
        autocmd FileType python setlocal omnifunc=jedi#completions
        let g:jedi#completions_enabled = 0
        let g:jedi#auto_vim_configuration = 0
        let g:neocomplete#force_omni_input_patterns.python =
                        \ '\%([^. \t]\.\|^\s*@\|^\s*from\s.\+import \|^\s*from \|^\s*import \)\w*'
    endif
endif
```

# NeaDTreeなどのプラグインのインストール
上記の

```vim
" Add or remove your Bundles here:
NeoBundle 'Shougo/neosnippet.vim'
NeoBundle 'Shougo/neosnippet-snippets'
NeoBundle 'tpope/vim-fugitive'
NeoBundle 'ctrlpvim/ctrlp.vim'
NeoBundle 'flazz/vim-colorschemes'
NeoBundle 'scrooloose/nerdtree'
NeoBundle 'fholgado/minibufexpl.vim'
```

の箇所で使用したいプラグインを指定します。
private docker registry のはまりどころ(S3連携、SSL)

AWSでprivate docker registryをコンテナで立てた際のハマったポイントをメモ。



## ケース
・AWS EC2(Amazon Linux)上にコンテナで実現
・コンテナイメージはdocker registry 2.1
・ボリュームはS3に設定
・SSLはオレオレ証明書で対応
・外部インターネットとの接続は原則ない（クローズド環境）


## ハマった点

###① docker push/pullで以下のようなエラーとなる
`x509: certificate signed by unknown authority`

opensslでオレオレ証明書(crtファイル)を作成し、pull/pushするクライアント側に格納するが、/etc/docker/certs.d/配下に格納してしまうと、dockerがOSのroot証明書を参照しなくなり、S3など他のSSL接続ができなくなる。
今回のようにボリュームをS3に指定する場合は特に注意が必要。
crtファイルは[registryのドメイン名].crtとして、/etc/pki/ca-trust/source/anchors配下に格納する。

その後、設定を反映し、dockerを再起動する。

```
sudo update-ca-trust
sudo systemctl restart docker
```

※Cent6系の場合は

```
update-ca-trust enable
2.update-ca-trust extract
```

これでエラーは解決した。


###② docker push/pullでio.timeoutとなる
SSLの設定が解決したところで、クライアントからpush/pullをすると、以下のようなエラーとなる。

`tcp XX.XX.XX.XX:443: i/o timeout.`

IPアドレスを逆引きしてみると、s3-ap-northeast-1.amazonaws.comと判明。

どうやらクライアントは、push/pushの際、docker registryサーバだけでなく、S3に直接イメージpull/pushのための接続を行っている模様。
つまり、docker registryでボリュームをS3に指定した場合、当然registryを立てたEC2から、ボリュームとして指定したS3バケットへのアクセス権（ポリシーやROLEなど）は必須だが、同時にクライアント側も対象S3バケットへアクセスできる必要がある。
オンプレミスとのハイブリッド環境など、クローズドな環境の場合は特に注意が必要。

![スクリーンショット 2017-01-18 20.54.28.png](https://qiita-image-store.s3.amazonaws.com/0/112537/cdb507ed-4092-5447-a31d-04b725d125cb.png)


## 参考

https://ishiis.net/2017/01/12/docker-distribution-install/

http://dev.classmethod.jp/cloud/docker-registry-recipes/

https://docs.docker.com/registry/deploying/#configure-tls-on-a-registry-server

http://qiita.com/suzukihi724/items/c8135fcfbf74fcbc80d0
Bcrypt のバージョンまとめ

# はじめに

Rails アプリを作っていると、BCrypt という単語をよく目にします。

しかし、BCrypt について書かれた日本語の記事は非常に少なく、`$2a$` や `$2x$` などいくつか存在するバージョンの違いがよくわかりませんでした。

それらについて、英語の文献を参照したため、日本語でまとめておこうと思います。

# Bcrypt の バージョン

BCrypt を表すバージョンは、`$2$` `$2a$` `$2b$` `$2x$` `$2y$` が存在するようです[^1][^2]。

- `$2$` (Provos・Mazières, 1999)[^3] による最初の BCrypt [^1]。
- `$2a$``$2b$` のいくつかの実装に存在するセキュリティ上の問題を修正したバージョン[^1]。
- `$2x$` crypt_blowfish の `$2a$` に存在していた問題を修正する前と同一のバージョン[^2]。
- `$2y$` crypt_blowfish の `$2a$` に存在していた問題を修正した後と同一のバージョン[^2]。
- `$2b$` 公式の BCrypt の最も新しいバージョン[^1]。

## crypt_blowfish における `$2a$` の問題

crypt_blowfish の `$2a$` には問題が存在していたことがあり、修正前後で動作が異なります。そのため、crypt_blowfish で作成された `$2a$` の値については、それが修正前後のどちらで作成されたのかわかりません。

何が crypt_blowfish なのかはよくわかりませんでしたが、調べた範囲では PHP の crypt で使われるものが該当するようです。

## どのバージョンを使うべきか

通常は `$2a$` を使えば問題ないようです[^4]。

ただし、crypt_blowfish の修正前の `$2a$` が混在している可能性が存在する場合は、`$2y$` を使用するのが望ましいと思われます。


# まとめ

- BCrypt にはいくつかのバージョンが存在する
- Rails では `$2a$` を使えば(デフォルトのまま使えば)問題ない。

[^1]: https://pythonhosted.org/passlib/lib/passlib.hash.bcrypt.html#passlib.hash.bcrypt

[^2]: http://www.php.net/security/crypt_blowfish.php

[^3]: https://www.usenix.org/legacy/event/usenix99/provos/provos.pdf
[ MySQL ] データをCSVでエクスポートしようとして、secure-file-privに引っかかった件

まぁ、お恥ずかしいお話ですが、また自分が困りそうなので残しておきます。

# ◆ 今日やること

Macでローカルに持っているMySQLサーバのデータをエクスポートしようかと。


# ◆ バージョン

```
mysql  Ver 14.14 Distrib 5.7.17, for osx10.11 (x86_64) using  EditLine wrapper
```

# ◆ データをエクスポートするまでの話

## --secure-file-priv問題

今まで、インポート、エクスポートでそんなエラー出たことなかった・・・ということに遭遇。

** ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement **

```
mysql> SELECT 1 INTO OUTFILE '/home/mysql/test.txt';
ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement
```

- この「secure-file-priv」の詳細については、以下の公式マニュアルで書かれています。
    - [MySQL :: MySQL 5\.7 Reference Manual :: 6\.1\.4 Server Command Options](https://dev.mysql.com/doc/refman/5.7/en/server-options.html)
    - [MySQL :: MySQL 5\.7 Reference Manual :: 6\.1\.5 Server System Variables](https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_secure_file_priv)


簡単に抜粋すると、LOAD DATA and SELECT ... INTO OUTFILE statements and the LOAD_FILE() などを使う、データのインポートとエクスポートの利用を制限します。

これらの操作はFILE権限を持つユーザーから許可されるものです。

### secure_file_priv とは

空であれば、何も影響しませんが、セキュアな設定ではありません。
MySQL5.7.6前まではデフォルトで空でしたが、5.7.6以降は、プラットフォームに依存した値で、INSTALL_LAYOUT CMake optionの値によります。

### 今回は

LocalのMacなので、とりあえず空にすることにしました。

- 現在の値

```
mysql> SELECT @@global.secure_file_priv;
+---------------------------+
| @@global.secure_file_priv |
+---------------------------+
| NULL                      |
+---------------------------+
1 row in set (0.00 sec)
```


- /etc/my.cnfを作り、空の設定に

```
sudo cp /usr/local/opt/mysql/support-files/my-default.cnf /etc/my.cnf
```
```
sudo vim /etc/my.cnf
[mysqld]
secure-file-priv = ""
```

```
mysql.server restart
```

- 空になりました

```
mysql> SELECT @@global.secure_file_priv;
+---------------------------+
| @@global.secure_file_priv |
+---------------------------+
|                           |
+---------------------------+
1 row in set (0.00 sec)

```




### 先頭カラムつきでエクスポート

エクスポートする時に、先頭にカラム名をつけたい場合ってあるんですよ。
その場合のやり方。もっとすんなりな方法はないのだろうか。

- [mysql \- Include headers when using SELECT INTO OUTFILE? \- Stack Overflow](http://stackoverflow.com/questions/5941809/include-headers-when-using-select-into-outfile)


```
SELECT 'ColName1', 'ColName2', 'ColName3'
UNION ALL
SELECT ColName1, ColName2, ColName3
    FROM YourTable
    INTO OUTFILE '/path/outfile'

```

以下でエクスポート完了しました。

```
select 'id','name','kana','en_name','history'
union all
select od,name,kana,en_name,history
from composers into  outfile "/tmp/composers.csv" fields terminated by ',' optionally enclosed by '"';
```


ʅ( ´・◡・｀)ʃ
python3 urllibプロキシ設定

# 概要

オライリーから出てる「[ゼロから作るDeep Learning](https://www.oreilly.co.jp/books/9784873117584/)」[^1]．途中，MNISTの手書き文字ファイルをpythonを使ってダウンロードするのだが，うまく動いてくれない．次のようなエラーが出る[^2]．

> TimeoutError: [WinError 10060] 接続済みの呼び出し先が一定の時間を過ぎても正しく
> 応答しなかったため、接続できませんでした。または接続済みのホストが応答しなかった
> ため、確立された接続は失敗しました。

多分，プロキシのせい．

mnist.py[^3]の中身を見るとurllibを使ってるので，多分，これにちゃんとプロキシを設定してやれば，解決できるはず．

ということで，urllibにどうやってプロキシを設定するのか調べた[^4]．

なお，ディープラーニングの本を読んでて本質的でないとこで引っかかっただけで，この記事ではディープラーニングに関する情報は一切書いていない．

# やり方

まぁ，こういうのは大体，誰かが既にやっているもので，Stack Overflowでみつけることができた．
[urllib.request.urlretrieve with proxy?](http://stackoverflow.com/questions/22967084/urllib-request-urlretrieve-with-proxy)

```py3
proxy = urllib.request.ProxyHandler({'http': '127.0.0.1'})
opener = urllib.request.build_opener(proxy)
urllib.request.install_opener(opener)
urllib.request.urlretrieve('http://www.google.com')
```

当然ながら，ProxyHandlerのアドレスは，使うプロキシに合わせて変更する必要がある．
ユーザ認証が必要な方は別にやり方があるっぽいけど，今回はいらないやつだったのでコレ．

# 具体例

この本の場合，プロキシサーバが`http://proxy.sample.com:8080`なら，mnist.pyの`save_file`の定義の直後に以下のようなスクリプトを追加．正常にダウンロードできた．

```py3
proxy = urllib.request.ProxyHandler({'http': 'http://proxy.sample.com:8080'})
opener = urllib.request.build_opener(proxy)
urllib.request.install_opener(opener)
```

---
[^1]: python3系のAnacondaディストリビューションを使っている．
[^2]: Windows環境．
[^3]: 使うファイルはすべて，GitHubで公開されている．
[^4]: pythonはこないだから使い始めたばかりなので，まだまだ初心者．注釈の入れ方もさっき覚えたので無駄に使ってみたくなる．
閲覧ページからワンクリックでGoogle Search ConsoleのFetch as Googleのリクエスト画面に飛ばすブックマークレット

ブラウザで開いているページからワンクリックでSearch consoleのFetch as Googleに入力するブックマークレット

``` js
javascript: (function() {
    window.open(location.href.replace("YOUR_DOMAIN", "https://www.google.com/webmasters/tools/googlebot-fetch?&siteUrl=YOUR_DOMAIN/&path="))
})();
```
Cygwin環境作成、その４（apt-cyg、gcc／g++インストール）

# apt-cygのインストール
apt-cygがあれば使いにくいSetup.exeともおさらば、素敵です。さて、参考先のまるまるコピーですが、こんな手順で進めていきます。
１．apt-cygをgitで取得
２．install
３．Cygwinリポジトリの登録
ではやってみます。

```bash
# 自分の作業用ディレクトリに移動
~ $ cd my_work/

# gitリポジトリのクローン
~/my_work $ git clone https://github.com/transcode-open/apt-cyg.git
Cloning into 'apt-cyg'...
（略）

# ディレクトリに移動
~/my_work $ cd apt-cyg

# apt-cygをPATH上にインストール
~/my_work/apt-cyg $ install apt-cyg /usr/local/bin

# Cygwinリポジトリの登録
~/my_work/apt-cyg $ apt-cyg -m ftp://ftp.jaist.ac.jp/pub/cygwin/ update
（略）

# 動作検証
~/my_work/apt-cyg $ apt-cyg searchall gcc
（以下略）
```

# gccのインストール
apt-cygでインストール、簡単です。気をつけねばならないのはパッケージ名が「gcc」ではなく「gcc-core」であることです。
１．gcc-coreをインストール
２．動作検証
ではやってみます。

```bash
# apt-cygでgcc-core
~/my_work $ apt-cyg install gcc-core
Installing gcc-core
(略）
Package gcc-core installed

# Cのファイルを作成
~/my_work $ mkdir hoge; cd hoge
~/my_work/hoge $ cat << EOL > hello.c
> #include <stdio.h>
>
> int main()
> {
>     printf("Hello Cygwin world!\n");
>     return 0;
> }
> EOL

~/my_work/hoge $ gcc -o hello hello.c

~/my_work/hoge $ ./hello
Hello Cygwin world!

~/my_work/hoge $
```

C++ではgcc-g++が必要です。入って無いと「gcc: error: spawn: No such file or directory」というよくわからないエラーが出ます。

```bash
# apt-cygでgcc-g++をインストール
~/my_work/hoge $ apt-cyg install gcc-g++
Installing gcc-g++
(略）
Package gcc-g++ installed

# C++のファイルを作成
~/my_work/hoge $ cat << EOL > hellopp.cpp
> #include <iostream>
> using namespace std;
>
> int main() {
>     cout << "Hello Cygwin C++ world!\n";
>     return 0;
> }
> EOL

~/my_work/hoge $ g++ -o hellopp hellopp.cpp

~/my_work/hoge $ ./hellopp
Hello Cygwin C++ world!

~/my_work/hoge $
```

注意点１：いつの間にかC++の仕様が変わっていたようです。
１．```#include <iostream.h>``` → ```#include <iostream>``` 
２．```using namespace std;```がmainの前に必要
注意点２：gccでC++のファイルをコンパイルすると当然ながらエラーになります。

最近はC++なんてあまり使ってないんでしょうね。僕はこちらのオンラインコースで必要なんで使う感じです。
[Cloud Computing Consepts, Part 1](https://www.coursera.org/learn/cloud-computing)

# 今後のやりたいこと
のんびりと以下手を付けていくつもり。
tmux、Vim設定　
JDKポータブルインストール （次を参考とする→ [Portable Java 8 JDK on Windows | Daniel Ferbers Technical Tavern](https://techtavern.wordpress.com/2014/03/25/portable-java-8-sdk-on-windows/)）
scala/sbt設定

# 参考先
[apt-cyg をインストールする(2016年版) - Qiita](http://qiita.com/hkuno/items/df06db4bb406a17d2494)
[c++ - Why can't g++ find iostream.h? - Stack Overflow](
http://stackoverflow.com/questions/13103108/why-cant-g-find-iostream-h)
[c++ - 'cout' was not declared in this scope - Stack Overflow](http://stackoverflow.com/questions/15185801/cout-was-not-declared-in-this-scope)
古いMacにCentをいれる



まずデバイス名を調べる
```
$ diskutil list
```
で　/dev/disk2　が出てきたとする。
んで、CentOS-6.5-x86_64-minimal.iso があるところで下記。

```
$ diskutil eraseDisk MS-DOS UNTITLED /dev/disk2
$ diskutil unmountDisk /dev/disk2
$ sudo dd if=./CentOS-6.5-x86_64-minimal.iso of=/dev/disk2 bs=4028
```

終わるとアラートが出てくるので、取り出しを選べばOK
R.NETをExcelから動作させる 2017年版


R.NETをExcelから呼び出す手法は

* http://d.hatena.ne.jp/teramonagi/20120310/1331352798
* http://needtec.exblog.jp/21561307/

などで紹介されていますが、最近の環境だと動かなくなっているので、試行錯誤してみた結果を共有します。

ちなみにExcelは事情により2010を使っているので、最新版とかでどうなるかは未検証です。

# 準備

* .NET Framework 4.0

* R (https://www.r-project.org/)
試したのは3.3.2です。

* R.NET (http://rdotnet.codeplex.com/)
NuGetパッケージ(ZIP圧縮)からdllを抽出し、下記DNAファイルと同じ場所に置いておく。

* DynamicInterop
NuGetパッケージからDynamicInterop.dllを抽出して、下記DNAファイルと同じ場所に置いておく。

* Excel-DNA (http://excel-dna.net/)
NuGetパッケージからxllとdllとを抽出し、ExcelDna.xllをUsingRdotNet.xllにリネーム。
ExcelDna.Integration.dllを一緒に、下記DNAファイルと同じ場所に置いておく。

* DNAファイル
下記をテキストファイル(UTF-8推奨)で作成。


```csharp:UsingRdotNet.dna
<DnaLibrary RuntimeVersion="v4.0" Name="R.NET" Description="R.NETをExcelから動作させる" Language="CS">
<Reference Path="ExcelDna.Integration.dll"  />
<Reference Path="RDotNet.NativeLibrary.dll"  />
<Reference Path="RDotNet.dll"  />
<Reference Path="DynamicInterop.dll"  />

<![CDATA[
using System;
using System.IO;
using System.Linq;
using ExcelDna.Integration;
using ExcelDna.Logging;
using RDotNet;

namespace UsingRDotNet
{
    public static class MyFunctions
    {
        static REngine _engine;
        static MyFunctions() // 静的コンストラクタ
        {
            try
            {
                REngine.SetEnvironmentVariables();
                _engine = REngine.GetInstance();
                _engine.Initialize();
            }
            catch (Exception ex)
            {
                LogDisplay.WriteLine("Error initializing RDotNet: " + ex.Message);
            }
        }

	// Ctrl+Shift+Enter
        public static double[] MyRnorm(int number)
        {
            return (_engine.Evaluate("rnorm(" + number + ")").AsNumeric().ToArray<double>());
        }

        public static object TestRDotNet()
        {
            // .NET Framework array to R vector.
            NumericVector group1 = _engine.CreateNumericVector(new double[] { 30.02, 29.99, 30.11, 29.97, 30.01, 29.99 });
            _engine.SetSymbol("group1", group1);
            // Direct parsing from R script.
            NumericVector group2 = _engine.Evaluate("group2 <- c(29.89, 29.93, 29.72, 29.98, 30.02, 29.98)").AsNumeric();

            // Test difference of mean and get the P-value.
            GenericVector testResult = _engine.Evaluate("t.test(group1, group2)").AsList();
            double p = testResult["p.value"].AsNumeric().First();

            return string.Format("Group1: [{0}], Group2: [{1}], P-value = {2:0.000}",  string.Join(", ", group1), string.Join(", ", group2), p);
        }
    }
}
]]>
</DnaLibrary>
```


https://gist.github.com/acknpop/926743838fde1c51f393a9cd0cfa246e

# 試し方

1. 新規Excelブックを開く
2. 上記ブックにUsingRdotNet.xllをドラッグ＆ドロップし、「このアドインをこのセッションに限り有効にする」を選択
3. セルに下記数式を入力
```vbnet
=TestRDotNet()
```
4. セルの中身が#VALUE!にならなければ成功
5. 別のセルを水平に５つ選択した後、
```vbnet
=MyRnorm(5)
```
と数式入力し、Ctrl + Shift + Enterを同時押しして「配列数式」にする
6. セルの中身が#NUM!にならずランダムな数値が５つ埋まっていれば成功

# 補記

環境によっては、使用するRのパスをREngine.GetInstance()で明示的に指定してやる必要があるようです。

DNAスクリプト（という言い方でいいのだろうか？）の問題点の切り分けにはLogDisplay.WriteLine()が非常に役に立ちました。
GAE/Javaでデータストアの使用しなくなったインデックスを削除

Google App EngineをJavaで使っている場合のindexの削除方法

Deleting unused indexes参照
https://cloud.google.com/appengine/docs/java/config/indexconfig

Macのターミナルからappcfg.shを実行
`./appengine-java-sdk/bin/appcfg.sh vacuum_indexes myapp/war`

datastore-indexes.xmlまたはdatastore-indexes-auto.xmlに記載のないものを削除するかどうかひとつずつ聞かれるので返答していく。実行終了後は何もしなくてもデータストアのインデックス管理画面で削除中の表示になり、さらに待つと5分後くらいに消えた。

appcfg.shの場所
`/eclipse/plugins/com.google.appengine.eclipse.sdkbundle/appengine-java-sdk/bin`

フルパスまたはディレクトリを移動して`./appcfg.sh vacuum_indexes myapp/war`

`myapp/war`の方はプロジェクトのwarフォルダでＯＫ

`Permission denied`がでたら`chmod +x appcfh.sh`で権限を付与

`bin/run_java.sh: Permission denied`がでたら再度`chmod +x run_java.sh`

実行できると、ブラウザが起動しデータアクセスを許可する画面とコードが出でくるのでコピペで入力

```
********************************************************
Please enter code:
```

しばらくすると、どんどん聞かれる

```
This index is no longer in your datastore-indexes.xml file:

<datastore-index kind="RepObject" ancestor="false">
    <property name="ctgId" direction="asc"/>
    <property name="divider" direction="asc"/>
    <property name="obIndex" direction="desc"/>
</datastore-index>

Are you sure you want to delete this index? (N/y/a): y
```

すべて答えれば終了

```
vacuum_indexes completed successfully.
Success.
Cleaning up temporary files for module default...
```
公開済みカスタムポストの総ポスト件数を一行で取得する方法

##公開済みカスタムポストの総ポスト件数を取得

```php
$post_count = wp_count_posts($type='post')->publish;
echo $post_count;
```
[wp_count_posts：wordpress.org](https://developer.wordpress.org/reference/functions/wp_count_posts/)
※下書きの件数を取得したい場合はpublishをdraftに変更

##WP_QUERY時に件数を取得

```php
$wp_query=new new WP_Query($args);
echo "全".$query->found_posts."件中/".$query->post_count."件表示";
```
[AWS]KMSで暗号化・復号化するサンプル(node.js版)

# この記事の内容
AWS KMSを試してみたかった
Lambdaから文字列をKMSに投げて暗号化し、暗号化文字列をもう１度投げて復号化できるかをやってみた

# 前提条件
- ManagementコンソールのIAM内、鍵管理からKMSに鍵が登録されていること
- KSM登録時にKMSを使用できるロールにLambdaを実行するロールを指定していること

つまり、KMSに鍵が登録されていて、その鍵を操作する権限を持ったロールをLambdaにアタッチ出来ていること。
マネジメントコンソールに従ってやっていればできます。

# 実行環境
- AWS Lambda
- Node.js 4.3

# 実装

コンソール直書きで大丈夫です


```javascript:index.js

'use strict'
const AWS = require('aws-sdk');
const kms = new AWS.KMS({apiVersion: '2014-11-01'});
const id = <登録した鍵のKyeID>;

exports.handler = (event, context, callback) => {
    let base64txt = new Buffer('hogehogeTxt').toString();
    let params = {
        KeyId: id, 
        Plaintext: base64txt
    };
    kms.encrypt(params, (err, data) => {
        if(err) console.log(err);
        console.log(data);
        
        let encript = data.CiphertextBlob;
        
        let param = {
            CiphertextBlob: encript
        };
        kms.decrypt(param, (err, data) => {
           if(err) console.log(err);
           let txt = data.Plaintext;
           console.log(txt.toString('utf-8', 0, txt.length))
           callback(null, 'success');
        });
    });
};

```

実行すると暗号化後復号化されたhogehogeTxtが返ってきます。


# 結果

以下のデータサンプルはドキュメントから引用
http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/KMS.html#encrypt-property

### 暗号化データサンプル

```
{
    CiphertextBlob: <Binary String>, 
    KeyId: "arn:aws:kms:us-west-2:111122223333:key1234abcd-12ab-34cd-56ef-1234567890ab"
}
```  

### 復号化データサンプル

```  
{
    KeyId: "arn:aws:kms:us-west-2:111122223333:key1234abcd-12ab-34cd-56ef-1234567890ab",     
    Plaintext: <Binary String>
}	
```

# まとめ
KMSはじめて触ってみたけどいいね
Symfonyの単一アドレス戦略

メモ


#単一アドレス戦略

delivery_strategyをsigle_addressにすると、単一アドレス戦略になる。
delivery_addressで設定したメールアドレスに送信する。

```
prod:
  mailer:
    param:
      delivery_strategy: single_address
      delivery_address: root@localhost
```

`root@localhost`にするとrootにメールを送信できる。
あとはmailコマンドを使うとメールを見ることができる。
CSPを導入してレポートをSlackに飛ばす

## CSPとは
Content Security Policy

ブラウザ側で実装されたセキュリティ機構

詳しい話とかはこちらを参照
https://developer.mozilla.org/ja/docs/Web/Security/CSP

## どんな効果があるか
- クロスサイトスクリプティングの軽減
- パケット盗聴攻撃の軽減

## 具体的に何がされるか
### インラインCSSやインラインJavascriptを書いた時にサイト自体見れないようにブロックする
XSSの典型的な攻撃方法として以下のような攻撃をされても弾ける

```
<form>
  <input type="hidden" name="message" value="#{params['message']}"/>
</form>

このmessageにこんな内容を仕込まれたとする
"><script>alert('hogehoge');</script><input type="hidden" name="hoge" value="

展開する
<form>
  <input type="hidden" name="message" value=""><script>alert('hogehoge');</script><input type="hidden" name="hoge" value=""/>
</form>

見やすくする
<form>
  <input type="hidden" name="message" value="">
  <script>alert('hogehoge');</script>
  <input type="hidden" name="hoge" value=""/>
</form>
```

これは典型的なXSSの攻撃だがCSPを実装していると、コード内にインラインJavascriptがあるので弾いてくれる
もちろん各Webserverフレームワークである程度防御機構はあるがブラウザレベルで検知して表示をブロックしてくれるので、言語問わず使える上にフレームワーク側の脆弱性があったとしても防げる

### 指定URL以外へのアクセスを防ぐことができる
自分の想定していないURLへのアクセスがあった場合ページをブロックする
例えばexample.comとcdn.example.com以外のURLにアクセスしていたらブロックすることができる
これは不正なコンテンツへのアクセスを防ぐことができるので、結果安全となる

## 現実的な対応
インラインCSSとJSは多くのサイトではあると思います。
また広告とかを貼っている場合、広告のSDKがさらに別ドメインのURL呼び出したりしているのでURL規制も難しいと思う。
そういった時に対応工数とか考えるとSSLを必須にする程度が着地点かと思われる。
SEOやユーザーからの信頼を考えるとページのSSL化は必須です。

こんな話も出てます。
Google Chrome、2017 年から HTTP ページで警告表示
https://www.digicert.ne.jp/blog/chrome56-direction.html

## ブロックとレポート
しかしブロックしてしまうとページが見えなくなるのでそれは困ります。
ブラウザの機能としてCSP Reportという機能があり、コンテンツがCSPに違反している場合指定のURLにPOSTでアクセスしてCSPの違反の内容を送信してページは表示してくれます。
以下の二種類です。

```
add_header Content-Security-Policy "default-src https://* ; report-uri https://example.com/" ;
add_header Content-Security-Policy-Report-Only "default-src https://* ; report-uri https://example.com/" ;
```

## 設定例
Nginxだとこんなところになる。

```
server {
  listen 80;
  server_name localhost;

  location / {
    add_header Content-Security-Policy-Report-Only "default-src https://* ; report-uri https://example.com/" ;
    root /var/www/html;
  }
}
```

## 体験して欲しいこと
今回作ったコードはDockerとSlackがあればCSPをすぐにでも体験して通知できます。
通知がなくていいのであれば、Dockerだけで体験できます。
SSL証明書はオレオレ証明書なので警告出ますので無視していただく必要があります。
またドメイン別に通知する仕組みも一応作ってあります。

https://github.com/a4t/report-uri

構築した後にこのページにアクセスして、ソースコードを見てもらえるとわかります。
CSSで赤文字を指定しているのに無効化されています。
https://localhost:8080/css.html?csp=block

## さいごに
CSPはまだまだ認知度が低いので今後広めていきたいです。
NAO の Boot Process を調べた

2年くらい前に NAO を購入した当日、NAO が起動しなくなる という事態に遭遇したときに調べた手書きのメモが出てきたので忘れないようにするための私の備忘録として記録。

# なにが起きたのか？

NAOのファームウェア（OS）を最新Verにアップデート（System Update）したら、アップデート途中に生じるNAOの再起動で、NAOが起動しなくなった。アップデートに時間がかかっているだけかも と思い、1時間半くらい待ってみたが、次の状態からいっこうに状況は変わらず。

- そんきょ の姿勢で胸のランプが赤く点滅したまま

何が起きているのか？ NAO が今どのような状態なのか？サッパリ分からず、強制的に電源をOFFにして壊れたらどうしよう...と悩んだ結果、まずはドキュメントから必死に復旧方法を調べたところ、NAOのブートプロセスの記述を発見。

# NAO のブートプロセス

次のページに Switching on （通常の電源ON）のときと、Upgrading（ファームウェアアップデート）のときの両方の起動プロセスが説明されています。

[NAO - User Guide - Understanding the boot process](http://doc.aldebaran.com/2-1/nao/boot_process_nao.html?highlight=reset)

そして、今まで、”なかなか起動しないなぁ...” ”あとどのくらいで動くんだ？” と、起動待ちで若干イライラしたけど、NAO の耳の LED がプログレスバーだった事もこのドキュメントでわかりました。

+ A progress bar is displayed on the Ear LEDs:

| Progression bar  |Means ...                                                | 
|-----------------:|:-------------------------------------------------------:|
| 0 %              |NAO is in the early boot step, initializing the hardware.| 
|25 %              |Hardware is initialized.                                 |
|50 %              |Filesystems are ready to use.                            |
|75 %              |Network and ssh are started.                             |
|100 %             |NAOqi is started.                                        |

加えて、胸のランプ（LED）の意味もちゃんとキュメントに書いてありました。

[NAO - User Guide - Event and state notifications](http://www.google.com/url?q=http%3A%2F%2Fdoc.aldebaran.com%2F2-1%2Fnao%2Fvoice_notifications.html%23notifications-nao&sa=D&sntz=1&usg=AFQjCNF81tdS6RzslPEfzUxmxEem-819Qw)

# 教訓

NAO を手に入れて嬉しさのあまり、すぐに動かしたい衝動に駆られるけど、慌てて闇雲に設定やアップデートをするのではなく、事前にちゃんとドキュメントを読んでから手を動かしましょう と（その当時の私は）反省しました。

# おまけ

System Update の途中で胸のLEDが赤く点滅したまま動かなくなってしまった NAO ですが、ドキュメントの Boot Process を読んでも、結局、復旧方法は分からず、とりあえず System Update 途中で異常が生じている という事は分かったので、覚悟を決めて NAO の電源を OFF にした後、もう一度 電源を ON にしたら、今度は NAO が “OGNAK GNOUK” と言って立ち上がり、正常に起動できました！
ふたマスの領域の数


今回楽すぎませんか？
添字ミスさえなければ10分切れた。

```rb
#!/usr/bin/env ruby
#18:15-18:28
#http://nabetani.sakura.ne.jp/hena/ordf01_twicel/
#http://qiita.com/Nabetani/items/8e02ede04315b4eadd6d

H=W=8
def dfs(a,x,y,c)
	a[y][x]=-1
	r=1
	[[-1,0],[0,-1],[1,0],[0,1]].each{|dx,dy|
		if 0<=x+dx&&x+dx<W && 0<=y+dy&&y+dy<H && a[y+dy][x+dx]==c
			r+=dfs(a,x+dx,y+dy,c)
		end
	}
	r
end
while gets
	a=$_.chomp.split('/').map{|e|('%08b'%e.hex).chars.map(&:to_i)}
	r=[0,0]
	8.times{|i|8.times{|j|
		c=a[j][i]
		r[c]+=1 if c>=0&&dfs(a,i,j,c)==2
	}}
	puts r*','
	STDOUT.flush
end
```
iMessageが送れない！送受信の不具合の対策

また来～た！
 
最近、何か不具合がありますか？
 
私のiPhoneは、最近、iMessageが送信できなくなります。
 
文字を入力して送信しよととすると、赤のビックリマークが付き、未配信になります。
 
みんなは同じような問題がありますか？
 
色々実験してから、ようやく、解決策を見つけました～
 
今日は、この対策をご紹介します。原因別で紹介しますよ。気合いピスケ
 
１、相手が機種変更する時
相手が機種変更する時、特にiPhoneからAndroidに変える時、iMessageが送れなくなることがあります。なぜなのでしょうか？これはiPhoneから機種変更した場合、iMessageの登録も解除せねばならず、この解除を忘れている人が多いからです。iMessageを解除しないままで、機種変更しました。結局、相手のiPhoneにiMessageを送れても、「未配信」が表示され、送れなくなります。その時、相手に機種変更するかどうかを確認してください。
 
２、メッセージアプリ自体が不安定でiMessageが送れない
メッセージアプリ自体が不安定になって、iMessageが送れなくなるケースもあります。メッセージが送れない相手は一人の場合、相手に問題がある可能性が高いですが、全ての人に送れない場合は、自分の端末が原因かもしれません。その場合、一度電源を切って、デバイスを強制終了させてください。
詳細な手順：Appleマークが出るまでホームボタンと電源ボタンを長押す > 強制終了させます。
 
3、自分の端末に問題が発生してiMessageが送れない
自分のiOSデバイスに問題が発生した時、iMessageが送れなくなることもあります。その場合、ネットワーク設定をリセットしてください。
詳細な手順：設定 > 「メッセージ」のiMessageをオフにする > 再び設定に戻す > 「一般」をタップ > 一番下の「リセット」を押す > 「ネットワーク設定をリセット」をタップします。それから再びiMessageをオンにします。
 
元記事：
https://www.imobie.jp/support/can-not-send-imessage.htm
io.Readerから[]byteへの変換のベンチマーク

# TL;DR
`io.Reader`から`[]byte`に変換する際は`io.Copy`を使おう．

```go
buf := new(bytes.Buffer)
io.Copy(buf, reader)
ret := buf.Bytes()
```

　`io.Reader`は値を一度読むと二回目以降はデータが無くなるようで，ベンチマークのコードが正しくなかったので修正しました．

# 背景
httpの通信結果を取得した際など，`res.Body`から値を読み取ると思う．
`res.Body`は`io.ReadCloser`インターフェースを実装しているので，`io.Reader`から何らかの方法で取得する．

その時に幾つか方法がありそうだったので，どれがパフォーマンスが良いのか調べてみた．

# 方法
調べた範囲で見つけられたのは，`ioutil.ReadAll`，`bytes.Buffer`の`ReadFrom`メソッド，`io.Copy`メソッドの３つだった．

それぞれのベンチマークを示す．

```go
const N int = 1000

func BenchmarkReadAll(b *testing.B) {
	data := make([]byte, N)

	b.ResetTimer()
	for i := 0; i < b.N; i++ {
		reader := bytes.NewBuffer(data)
		ioutil.ReadAll(reader)
	}
}

func BenchmarkReadFrom(b *testing.B) {
	data := make([]byte, N)

	b.ResetTimer()
	for i := 0; i < b.N; i++ {
		reader := bytes.NewBuffer(data)
		buf := new(bytes.Buffer)
		buf.ReadFrom(reader)
		buf.Bytes()
	}
}

func BenchmarkReadCopy(b *testing.B) {
	data := make([]byte, N)

	b.ResetTimer()
	for i := 0; i < b.N; i++ {
		reader := bytes.NewBuffer(data)
		buf := new(bytes.Buffer)
		io.Copy(buf, reader)
		buf.Bytes()
	}
}

```

ベンチマークの実行コマンドを以下に示す．

```shell-session
go test -benchmem -bench .
```

# 結果
ベンチマーク結果を示す.

```shell-session
BenchmarkReadAll-4    	 2000000	       944 ns/op	    2160 B/op	       3 allocs/op
BenchmarkReadFrom-4   	 1000000	      1049 ns/op	    2160 B/op	       3 allocs/op
BenchmarkReadCopy-4   	 2000000	       598 ns/op	    1248 B/op	       3 allocs/op
PASS
ok  	_/Users/taisuke/manga	5.770s

```
`ReadAll`と`ReadFrom`がほぼ同じ性能で，`io.Copy`が倍以上の性能となっていることがわかる．

# まとめ
`ReadAll`と`ReadFrom`がほぼ同じ性能だったので，ソースを見てみると，`ReadAll`の内部で`ReadFrom`が呼ばれていた．
`bytes.Buffer`から`[]byte`も`string`も取得できるので，ささっと書きたい時以外`ioutil.ReadAll`は使わなくてもいいかもしれない．

初心者なので，これじゃ正しく動かなかったり，他にもっとこんな方法があるよとか，ベンチマークの方法がおかしいとかあったら，指摘してください．泣いて喜びます．
mecab-python3でUnicodeDecodeErrorがでる


Unicodeの問題から逃げたくて、Python3にしたのに、mecab-python3の調子がおかしいのかUnicodeDecodeErrorがでる

しかも、テストを走らせるとランダムに出る


## 事例

```python
import MeCab
mecab = MeCab.Tagger()
node = mecab.parseToNode("すもももももももものうち")
while node:
    print(node.surface)
    node = node.next
```

とすると、

```
UnicodeDecodeError                        Traceback (most recent call last)
<ipython-input-11-1f88b1ec9c08> in <module>()
      1 while node:
----> 2     print(node.surface)
      3     node = node.next

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb5 in position 0: invalid start byte
```

というエラーが・・・

## 治し方

治し方もなかなかなぞで、先に`mecab.parse("")`をやっておくという

```python
import MeCab
mecab = MeCab.Tagger()
mecab.parse("")  # 追加
node = mecab.parseToNode("すもももももももものうち")
while node:
    print(node.surface)
    node = node.next
```

すると

```
すもも
も
もも
も
もも
の
うち
```

できた。よくわからないけど、動くようになった。
Moodleのmodプラグインで活動完了を実装するには

Moodleの活動モジュールを開発する場合に、活動完了を実装する場合のノウハウです。

# 閲覧すれば活動完了のチェックを自動的につけるようにする

## まずは「条件を満たした場合に、活動完了を表示する」を選択できるようにする

Moodleの活動(リソース)モジュールを開発する際に、完了トラッキングの設定で「条件を満たした場合に、活動完了を表示する」を選択できるようにするには、以下のように設定します。

![20170118_175142#00.png](https://qiita-image-store.s3.amazonaws.com/0/116241/e4720e75-1061-0685-9308-c6b189953c97.png)


0. lib.phpを開く。
0. modname_supports($feature)でFEATURE_COMPLETION_TRACKS_VIEWSでtrueを返すように変更します。

```php:lib.php
function modname_supports($feature)
{

    switch ($feature) {
        case FEATURE_MOD_ARCHETYPE:           return MOD_ARCHETYPE_RESOURCE;
        case FEATURE_GROUPS:                  return false;
        case FEATURE_GROUPINGS:               return false;
        case FEATURE_MOD_INTRO:               return true;
        case FEATURE_COMPLETION_TRACKS_VIEWS: return true; // falseからtrueにする
        case FEATURE_GRADE_HAS_GRADE:         return false;
        case FEATURE_GRADE_OUTCOMES:          return false;
        case FEATURE_BACKUP_MOODLE2:          return true;
        case FEATURE_SHOW_DESCRIPTION:        return true;

        default:
            return null;
    }
}
```

## 自動的にチェックするための実装

また、「完了するには学生はこの活動を閲覧する必要があります」をチェックした時に、Modを表示すれば自動的にチェックされるようにするには、以下も実装します。

![20170118_175228#00.png](https://qiita-image-store.s3.amazonaws.com/0/116241/6e0d9472-1b12-e8c8-ff19-931cb16f0cb5.png)


0. lib.phpにmodname_view()関数を実装します。
0. その中でcompletion_infoクラスのインスタンスを作成して、set_module_viewed()メソッドを呼びます

```php:lib.php
function modname_view($instance, $course, $cm, $context) {
    // Completion.
    $completion = new \completion_info($course);
    $completion->set_module_viewed($cm);
}
```

3.view.phpからmodname_view()を呼びます。

これにより、活動(リソース)モジュールの画面を表示すると、自動的にチェックマークがつくようになります。

![20170118_180252#00.png](https://qiita-image-store.s3.amazonaws.com/0/116241/1812962a-e791-2bdc-e86f-263bbe629b55.png)


## 注意

この機能はMoodle3.0以降で利用できます。
translate: transform() と calc() の演算結果の問題と、IEへの対応

## TL;DR

**結論：**`translate() x calc()` するときは`translateX()`や`translateY()`をがんばって書くか、書き方を変えよう。

## CSSの transform() と calc() を合わせた演算結果がブラウザによって異なる問題

まずはデバッグしてみよう。テストのために、以下のようなHTMLとスタイルシートを用意した。

```HTML:HTML
<div class="transform-tester">
  <p>This paragraph should be transformed to center-center.</p>
</div>
```

```CSS:CSS
  .transform-tester {
    position: relative;
    width: 200px;
    height: 200px;
    background-color: red;
  }

  .transform-tester > p {
    position: absolute;
    top: 50%;
    left: 50%;
    margin: 0;
    font-size: 30px;
    white-space: nowrap;
  }
```

この時点では、子要素を親要素の中央にabsolute配置したのみである。**中央寄せではなく、要素の座標(0,0)を移動しただけであることに注意**。IEも含めて、以下のようにちゃんと想定通りの配置となる。

<img width="625" alt="Screen Shot 2017-01-18 at 5.58.20 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/105252/46d52f37-42ce-e05c-d301-c7bf7dda7a4b.png">
## translate() + calc() してみよう

さて、ここで以下のようなスタイルを `<p>` に付与するとどうなるだろうか。例えば、**自身の要素の半分だけ縦位置を上げてから、1em分さらに上げてみる**ということをしてみよう。[^1]

[^1]: あくまでも例である。実際に`translate() x calc()`しなければならないケースの場合は、より複雑な計算が必要になるだろう。

```CSS:CSS
  .transform-tester > p {
    transform: translate(0, calc(-50% - 1em));
  }
```

<img width="597" alt="Screen Shot 2017-01-18 at 6.04.29 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/105252/b09aa0b5-79be-1962-a2ca-a0f6c507930e.png">
だいたい思ったとおりの位置になった。これは、**Chrome / Safari / Firefoxで同等の結果**[^2]だ。

[^2]: バージョンは割愛。2017年時点であれば特に考慮の必要はないと思われる。

## IE (IE11, IE10, IE9)

<img width="625" alt="Screen Shot 2017-01-18 at 5.58.20 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/105252/46d52f37-42ce-e05c-d301-c7bf7dda7a4b.png">
変わってない。念のため`-ms-`プレフィックスを付与してみたが変わらない。調べてみたら[stack overflow](http://stackoverflow.com/questions/21142923/ie-10-11-css-transitions-with-calc-do-not-work)に答えがあった。**IEでは、transform()とcalc()の合成演算を無視する**。

## 答え１

```CSS:分けて書けば、どのブラウザでも想定通りに描画される。
  .transform-tester > p {
    transform: translateY(-50%) translateY(1em);
  }
```

わかりやすい。わかりやすいが、２回同じことを書くのは気持ち悪いという場合は、以下の答えもある。

## 答え２

```CSS:
  /* 最初に書いたCSS */
  .transform-tester > p {
    position: absolute;
    /* この時点で -1em しちゃえばいいじゃない */
    top: calc(50% - 1em);
    left: 50%;
    margin: 0;
    font-size: 30px;
    white-space: nowrap;
  }

  /* あとから付け加えたCSS */
  .transform-tester > p {
    transform: translate(0, -50%);
  }
```

ただし、calc()演算は（sassの演算もそうだが）ビジネスロジックとの関係性が重要だ。**最終的にどう表示されるかではなく、ロジックに基づく計算式をコードとして残しておき、かつそれをそのままレンダリングに使うこと**のほうが保守観点から有効な場合があることには注意されたい。
オフラインリアルタイムどう書くF01 の問題


オフラインでリアルタイムに「どう書く」をやるイベント( https://yhpg.doorkeeper.jp/events/55292 )を行っています。

問題は「ふたマスの領域の数」という名前で、詳細は
http://nabetani.sakura.ne.jp/hena/ordf01_twicel/
です。

出題者の気分としては、問題を読み始めてから解けるまで1時間あればなんとかなると思ってますが、ひとそれぞれで。

実装ができた方はこちらのコメント欄からリンクを張っていただくと見つけやすくて助かります。

似たような問題をもっと解きたいという方は、
https://nabetani.hatenadiary.com/entry/yhpg_list
に過去問リンク集がありますので、そちらをご覧になると良いと思います。
Xcodeがおかしいときの対処法

デバッグの時に、変数がおかしくなったので、こちらを参照して、
DerivedDataの中身を削除したら、治った。

http://seeku.hateblo.jp/entry/2016/02/07/124822

$cd ~/Library/Developer/Xcode/DerivedData
$xattr -rc .
C++でのプロファイリングの仕方


以下の方法はXcode 8以下でしか使えません。
Xcode 9以降では `iprofiler -timeprofiler <executable> <args>`
は`instruments -l 10000 -t "Time Profiler" <executable> <args>`で置き換えることができるという話もあるのですが、自分の場合はうまくデバック情報が付与されずに使い物になりませんでした。

代替案として、以下のようにします。

https://developer.apple.com/download/more/ より Xcode8.3.3 をダウンロード (`~/Xcode8`というディレクトリ以下にxipファイルを解凍下とする)

以下の`iprofiler`を全て`~/Xcode8/Xcode.app/Contents/Developer/usr/bin/iprofiler`に置き換えて実行する。

dtpsファイルの出力を見る際は`open ~/Xcode8/Xcode.app/Contents/Applications/Instruments.app/`でXcode8のInsrumentsを開いた上でそこにドラッグ&ドロップして結果を見る


----

Macの場合はXCodeについてくる`iprofiler`と言うものを使うだけでしっかりプロファイリングができる。

![Kobito.o894Ls.png](https://qiita-image-store.s3.amazonaws.com/0/6664/ce4e88a1-169b-6779-5f73-87444cc5b8e3.png "Kobito.o894Ls.png")

プロファイリングの仕組みとしては定期的にポーリングし、そのなときにどこの部分を処理していたかを取得する方法で、実行時間が長くかかっているところなどを見つけることができる模様。

## iprofilerの使い方

### C++のexecutableを作る

まず、デバッグ情報付与つき(`-g`)でコンパイルする。最適化オプション(`-O2`)はつけないと実行時間が大きく変わってしまうのでつけたほうが良い。

```bash
$ c++ -g -O2 -o main main.cpp
```

### iprofilerを使う

iprofilerは以下のように使用する

```
iprofiler -timeprofiler <executable> <args>
```

この時、デフォルトの10秒間プロファイリングが走る。
例えば1分間上の`main`というプログラムを`-n 10`というオプション付きで走らせたいときはこうなる

```bash
$ iprofiler -timeprofiler -T 60 ./main -n 10
```
【読書】 ＡＩ時代の人生戦略　成毛眞

STEM
「Science, Technology, Engineering and Mathematics」
 　http://business.nikkeibp.co.jp/atcl/report/15/270859/122200015/?rt=nocnt

テクノロジーアートの例
OK GO "I Won't Let You Down"
　http://viibar.com/viimaga/purpose/branding/ok-go.html

　OK GO "Upside Down & Inside Out"
　http://gigazine.net/news/20160214-ok-go-s7-airlines/

今は存在しない職業
http://www.boredpanda.com/extinct-jobs/

プリファードネットワークス(AIベンチャー)
　人工知能のその先へ　「グーグルの先を行く」プリファードネットワークスが描く未来
 　http://www.todaishimbun.org/pfn-nishikawa20160724/

人工知能弁護士「Ross」
http://www.gizmodo.jp/2016/05/ross_ai_lawyer.html
https://matome.naver.jp/odai/2147473033185182401

日本語を覚えた「IBM Watson」が正式展開、MUFGはLINEで活用
http://news.mynavi.jp/news/2016/02/19/257/

アルファ碁は宇宙を開拓するパートナー？
 松原教授は「人間の棋士が打ってきた範囲を太陽系に例えると、
 宇宙には別の恒星系や筋の良い星があるはず。
アルファ碁の創造した新手は、太陽系を飛び出して新しい星を見つけたようなもの。
 太陽系とその近傍は制したが、宇宙のすべてを把握したわけではない」と説明する。
 今後、アルファ碁の打ち筋を基に新しい定石が開拓されるだろう。
アルファ碁は宇宙を開拓するパートナーになるかもしれない。
http://newswitch.jp/p/3971-2

おすすめ番組 

　コズミックフロントネクスト
　http://www.nhk.or.jp/cosmic/

　サイエンスゼロ
　http://www.nhk.or.jp/zero/

　モーガン・フリーマン　時空を超えて
　http://www4.nhk.or.jp/P3452/
異なる親を持つオブジェクトのヒエラルキー上での順序を比較する

同じ親ならGetSiblingIndex()で比較すれば良いのですが、そうでないときのパターンが見つからなかったので書きます。

GetComponentsInParentでTransformを取得すると、[0]に自身のTransformが入り、[1]に1つ上の親Transformが入ります。
2つ上以降も順に格納されるので、2つのオブジェクトのTransformを配列末尾から見ていけば、分岐する親オブジェクトが判明します。
そこでGetSiblingIndex()を使い、受け取ったインデックスを比較することで、どちらが下位にあるかが分かります。

<font color="#FF0000">ただし同じシーンに存在するオブジェクト同士であること</color>

```
int CompareHierarchy(Transform l, Transform r)
{
    if (l == r)
    {
        return 0;
    }

    var lTransforms = l.GetComponentsInParent<Transform>();
    var rTransforms = r.GetComponentsInParent<Transform>();

    var loop = UnityEngine.Mathf.Min(lTransforms.Length, rTransforms.Length);

    for (var i = 0; i < loop; ++i)
    {
        var lTransform = lTransforms[lTransforms.Length - i - 1];
        var rTransform = rTransforms[rTransforms.Length - i - 1];
        if (lTransform != rTransform)
        {
            return rTransform.GetSiblingIndex() - lTransform.GetSiblingIndex();
        }
    }

    return 0;
}
```

uGUIであればヒエラルキーの並びがそのまま表示順になりますが、カメラやキャンバスを複数使っている場合は、先にそれらの要素でソートする必要があることに注意して下さい。
*上記ができれば、同じシーンでないオブジェクト同士でなければならない問題もほぼ解決でしょう*
VBA sample Code

VBAコード書きました。
※後ほど詳細共有予定です。

Sub ボタン1_Click()

 '1.
B11 = Sheet1.Cells(11, 3).Value '日付
B12 = Sheet1.Cells(12, 3).Value '場所
B13 = Sheet1.Cells(13, 3).Value '田んぼ
B14 = Sheet1.Cells(14, 3).Value '水量
MaxCol = Sheet2.Range("C8").End(xlToRight).Column
MaxRow = Sheet2.Range("B8").End(xlDown).Row
firsttime = True '先頭行にB12,B13の同一データがない。/入力済に戻った時


'初期化時の行指定のため
If MaxRow = 1048576 Then
MaxRow = 8
End If
'http://excelvba.pc-users.net/fol7/7_1.html
lngYLine = Worksheets("Sheet1").Cells.Find(B13, LookAt:=xlWhole).Row
intXLine = Worksheets("Sheet1").Cells.Find(B13, LookAt:=xlWhole).Column
''        MsgBox B13 + "は" + CStr(lngYLine) + "行目の" _
''                + CStr(intXLine) + "列目にあります"
''        MsgBox (intXLine)
''        MsgBox (lngYLine)
        
        wtr = Cells(lngYLine, intXLine + 1).Value
        'MsgBox (wtr)



For i = 4 To MaxCol

' date
If Sheet2.Cells(8, i) = B11 Then
'MsgBox ("OK")

For l = 9 To MaxRow + 1

'
If Sheet2.Cells(l, 2).Value = B12 And Sheet2.Cells(l, 3).Value = B13 Then
   Sheet2.Cells(l, i) = wtr / B14
      firsttime = False 'B12,B13との同一データを見つけて入力済
End If

 last_Data = l 'L
 If Sheet2.Cells(l, 2).Value <> B12 Or Sheet2.Cells(l, 3).Value <> B13 Then '片方どちらかが違うととお
 
 If MaxRow = last_Data Then
 
If firsttime <> False Then
 
 
   ' MsgBox ("!!")
    Sheet2.Cells(MaxRow + 1, 2) = B12
    Sheet2.Cells(MaxRow + 1, 3) = B13
    Sheet2.Cells(MaxRow + 1, i) = wtr / B14
    firsttime = False
 End If
 End If
 End If
 

Next l
    
End If

Next i

firsttime = True

  Dim varCheck As Variant
    
    varDeleteCheck = Sheet1.CheckBox1.Value
    varMoveCheck = Sheet1.CheckBox2.Value

'3 データ削除
If varDeleteCheck = True Then
Sheet1.Range("C11:C14").ClearContents
End If

'4 作業完了
If varMoveCheck = True Then
Sheet2.Activate
End If

End Sub
Pythonとhtmlで写真を表示

## 概要
私は Macbook pro 13inch retina を使っており， iPad やデジカメで撮った写真の管理は，Mac付属の「写真アプリ」で行っている．
でも，ガールフレンドの写真など，あるグループの写真のみを別のフォルダに集めて管理したり眺めたりしたいというニーズから，あるフォルダにコピーした JPG イメージを，html でサムネイルのように表示させるプログラムを作ってみた．実際にサムネイルは作成しておらず，html 上で，小さく表示させているだけである．

元の画像はそのままで，観賞用に明るさの補正を行ったものを別に保存・管理する場合などにも使える．ちなみに，以下はImageMagickのコマンドで，暗い写真を明るく画像補正するコマンド．数値が大きい方が，明るくなる．

```
convert IMG_0461.JPG  -sigmoidal-contrast 10,0%  IMG_0461.jpg
convert IMG_0494.JPG  -sigmoidal-contrast  7,0%  IMG_0494.jpg
convert IMG_0333.JPG  -sigmoidal-contrast  4,0%  IMG_0333.jpg
```

## プログラミングの考え方
+ Pythonプログラムは表示したい写真と同じフォルダに入っている
+ html の table タグで写真を並べて表示する
+ 写真は，横５列，縦は必要な段数としている
+ JPG拡張子のみのファイルを選び出し，ファイル名を取得し，img srcでイメージを表示する
+ 原写真には縦長，横長双方が含まれるが，幅を200pxに統一して表示させる
+ 写真の下にファイル名を表示し，これをクリックすると原写真が見られる

## ソースコード
```python:py_pic.py
import os
from PIL import Image
 
filenames = os.listdir('./')
imgl=[]
ww=[]
hh=[]
for fname in sorted(filenames):
    path, ext = os.path.splitext( os.path.basename(fname) )
    if ext=='.JPG' and path[0:2]!='._':
        pic=path+ext
        im=Image.open(pic)
        w=im.size[0]
        h=im.size[1]
        print(pic, w, h)
        imgl=imgl+[pic]
        ww=ww+[w]
        hh=hh+[h]

f=open('maggie.html','w')
print('<html>',file=f)
print('<body>',file=f)
print('<table>',file=f)
n=len(imgl)
m=int(n/5)+1
k=-1
for i in range(0,m):
    print('<tr>',file=f)
    for j in range(0,5):
        k=k+1
        if k<=n-1:
            pic=imgl[k]
            w1=200
            h1=int(hh[k]/ww[k]*200)
            print('<td align="center"><img src="'+pic+'" alt="pic" width="'+str(w1)+'", height="'+str(h1)+'"><br><a href="'+pic+'">I'+pic+'<a></td>',file=f)
        else:
            print('<td></td>',file=f)
    print('</tr>',file=f)
print('</table>',file=f)
print('</body>',file=f)
print('</html>',file=f)
f.close()
```

以　上
Google Apps Scriptを使用してみた

なぜか先輩に頼まれて、google apps scriptを書くことに。
概要としては、シート１のC列に入れたデータをシート２の該当dateをシート１のdateと照合し、
該当箇所にデータを入力するもの。
例:シート１のdateが1/9/2017ならその日の列にデータが入る。
さらに、
1.ちがう名前のときは新規で最下行にデータが、
同じ名前のもので違う日付の場合は、該当列にデータを入力します。


以下コードを全コピーして動きます。
添付写真の通りに、シート１のC列にデータをシート２のA列に日付を入れ実行ボタンをクリックすれば動きます。
※事前にボタンの作成方法は調べる必要あり。![Sheet1.PNG](https://qiita-image-store.s3.amazonaws.com/0/160387/d4b9529a-7667-da24-ce1d-9973fed0c47d.png)
![Sheet2.PNG](https://qiita-image-store.s3.amazonaws.com/0/160387/a65666e8-3c04-5620-4686-b9f25d0abe57.png)

＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝
ここからコード↓

function myFunction() {
  
var Spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
var Sheet1 = Spreadsheet.getSheetByName("Sheet1");
var Sheet2 = Spreadsheet.getSheetByName("Sheet2");
var frsttime = 1;//true
  //Browser.msgBox(frsttime);
  var C11 = Sheet1.getRange("C11").getValue(); //date
  var C12 = Sheet1.getRange("C12").getValue(); // place
  var C13 = Sheet1.getRange("C13").getValue(); //tanbo
  var C14 = Sheet1.getRange("C14").getValue(); // amount
//Browser.msgBox(C11);
//Browser.msgBox(C12);
//Browser.msgBox(C13);
//Browser.msgBox(C14);

　var last_row    = Sheet2.getLastRow();
  var last_column = Sheet2.getLastColumn();
  
  var C15 = Sheet2.getRange(1,1).getValue();
　　　//Browser.msgBox(C15);
/*
document.write("③");
複数行ある場合は
このようにします。
*/
  //最終行取得
　for(var i = last_row; i >= 1; i--){

   if(Sheet2.getRange(i, 1).getValue() != ''){
　　　last_row = i;
    //  Browser.msgBox(last_row);
　　　break;
　　}
　}
  //最終列取得  
　for(var l = last_column; l >= 1; l--){

   if(Sheet2.getRange(1, l).getValue() != ''){
     last_column = l;
　　　//Browser.msgBox(last_column);
　　　break;
　　}
　}

//ここから作成していく======================================
//日付確認
  for(var i = 3; i < last_column + 1; i++) { // http://www.ituore.com/entry/javascript-for
      date = Sheet2.getRange(1,i).getValue();
     //Browser.msgBox(date);
    if( C11 == date ) {
      // Browser.msgBox("passed");
    
      for(var l = 2; l < last_row + 1; l++) { // http://www.ituore.com/entry/javascript-for
            plc = Sheet2.getRange(l,1).getValue(); 
        sub_plc = Sheet2.getRange(l,2).getValue(); 
                
        if( plc == C12 && sub_plc == C13) { //既存データの場合の日付入力
           Sheet2.getRange(l,i).setValue(C14);
           frsttime = false;
           //Browser.msgBox("passedNo2");
         }

        　last_Date = l;
        if (last_row == last_Date){
           //Browser.msgBox("passedNo4");
          if(frsttime != false){
            //Browser.msgBox("passedNo5");
            
            if( plc != C12 || sub_plc != C13){ 
            //Browser.msgBox("No6");
           Sheet2.getRange(last_row +1,1).setValue(C12);
           Sheet2.getRange(last_row +1,2).setValue(C13);
           Sheet2.getRange(last_row +1,i).setValue(C14);
           frsttime = false;
            }
        }
        }
        }
      }
        
      }
  //データ消去
  Sheet1.getRange('C11:C14').clear();  
  Browser.msgBox("完了");   
}
CloudFormationにおけるElasticBeanstalkの環境変数の設定

備忘録として。
***

CloudFormationにおけるElasticBeanstalkのリソースタイプは、```AWS::ElasticBeanstalk::Environment``` である。
公式ドキュメントは[こちら](http://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-properties-beanstalk-environment.html)。

基本的には公式ドキュメントを読めばわかるが、ElasticBeanstalk環境の環境プロパティ(要は環境変数)の設定方法が少しわかりづらかったのでメモ。

結論から言うと、OptionSettingsで下記のように設定してやればいいようだ。

```yaml
OptionSettings:
  - Namespace: aws:elasticbeanstalk:application:environment
    OptionName: NODE_ENVNAME
    Value: dev
```

こうすることで、例えばNode.jsのアプリケーション/ワーカーなら
```process.env.NODE_ENVNAME```で値が取得できるようになる。

OptionSettingsでは、その他の項目も設定できる。使用できる名前空間については[こちら](http://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/command-options.html)を参照のこと。
しかし、ここには、```aws:elasticbeanstalk:application:environment ```を使った環境プロパティの設定に関する記載がなかったので、本記事で設定方法を紹介した。
[TravisCI] Node.jsプロジェクト以外でNode.jsを使う方法

## [nvm](https://github.com/creationix/nvm) をインストールする

*Travisにはデフォルトで `nvm@0.32.0` がインストールされている（2017-05-31）*

```yaml:.travis.yml
language: ruby # not "node_js"

cache:
  bundler: true
  directories:
    - node_modules

before_install:
  # if package.json exists
  - nvm install $(jq -r '.engines.node' package.json)

  # Or if .nvmrc exists
  - nvm install 
```

```json:package.json
{
  "engines": {
    "node": "6"
  }
}
```

```text:.nvmrc
6
```

See <https://github.com/creationix/nvm#nvmrc>.

### 最新の `nvm` を使いたい場合

```yaml:.travis.yml
before_install:
  # Install nvm and Node.js (https://github.com/creationix/nvm#install-script)
  - export NVM_VERSION=v0.33.0
  - export NVM_DIR="$HOME/.nvm"
  - rm -rf "$NVM_DIR"
  - curl -o- https://raw.githubusercontent.com/creationix/nvm/${NVM_VERSION}/install.sh | bash
  - . "$NVM_DIR/nvm.sh" || true # if .nvmrc exists then returns 3 exit status
  - nvm install
```

See <https://github.com/creationix/nvm#install-script>.

## [Yarn](https://yarnpkg.com/) を使う場合

```yaml:.travis.yml
# https://docs.travis-ci.com/user/caching/
cache:
  bundler: true
  yarn: true

before_install:
  # After nvm installation

  # Install Yarn (https://yarnpkg.com/en/docs/install-ci#travis-tab)
  - curl -o- -L https://yarnpkg.com/install.sh | bash
  - export PATH="$HOME/.yarn/bin:$PATH"
  - yarn install
```

See <https://yarnpkg.com/en/docs/install-ci#travis-tab>.
Cognosのレポートで検索文字をハイライト（強調）表示する

Cognos BIでプロンプトでレポートを実行し、ある文言で検索を行い、検索ワードをハイライト（強調表示）するレポートのサンプルです。

##レポートイメージ
実行イメージはこんな感じで、「Product description」の製品説明の文章の中から、「50」という文字が含まれる製品を検索し、その出力結果で「50」という文字を、赤太字でハイライト表示するものです。
![004.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/5117f75d-94a4-cd44-29d9-e54ddcc547a5.png)


##実装方法
リストにProductとProduct descriptionを配置し、テキストボックスのプロンプトとHTML Itemを配置します。
テキストボックスのプロンプトは、名前を「SearchWord」としています。
![001.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/940da85e-cf5e-17bf-dbb1-d214a47f6412.png)

リストのクエリーに、赤枠のようなフィルターを配置しています。
![002.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/edad8a82-9ce4-02fa-0b26-27a53a6cf041.png)


■ HTML Itemの記述
\<script type="text/javascript">

window.onload=putColor;

function putColor(){
    var table = document.getElementsByClassName("ls");
    var tdList = {};
    for (var i=1; i < table[0].rows.length; i++){
        //テーブルの内容を配列に格納
        tdList[i] = table[0].rows[i].getElementsByTagName("td")[1].getElementsByTagName("span")[0].innerHTML;
        //プロンプトの値を取得
        var fW = (typeof getFormWarpRequest == "function" ? getFormWarpRequest() :
        document.forms["formWarpRequest"]);  
        var searchWord = fW._textEditBoxSearchWord.value;
        //テーブルのコメント内の検索値を強調表示(赤太文字)
        if(typeof searchWord !== "undefined"){
            table[0].rows[i].getElementsByTagName("td")[1].getElementsByTagName("span")[0].innerHTML = tdList[i].split(searchWord).join("<span style='color:red; font-weight:bold;'>" + searchWord + "</span>");
        }
    }
}

putColor();

\</script>

あいまい検索的な使い方で、かつハイライト表示は要件として求められる事が時々ありますので、参考までに使ってみてください。