OmniAICreator/Qiita-1.07M huggingface dataset:
モダンなfishシェルをMacOSにインストールする


1. fishをインストール
2. oh-my-fishをインストール
3. デフォルトシェルにしましょう
4. themaをインストールします
5. 番外編(rbenv)


まずは、brewでfishをインストールします。

## 1. fishをインストール

```
$ brew install fish
$ fish -v
fish, version 2.6.0
```

## 2. oh-my-fishをインストール

omfコマンドが利用できることを確認する

```
$ curl -L https://get.oh-my.fish | fish
・・・（省略）
Installation successful!
Welcome to fish, the friendly interactive shell
$ omf -v
Oh My Fish version 5
```

:ballot_box_with_check: fishのコンフィグファイルは以下のパス
**~/.config/fish/config.fish**

## 3. デフォルトシェルにしましょう

```
$ which fish
$ chsh -s /usr/local/bin/fish
Changing shell for gulliver.
Password for gulliver:{#password}
```

もし、以下のようなメッセージが出た場合は

```
chsh: /usr/local/bin/fish: non-standard shell
```

**注意:** chshして`chsh: /usr/local/bin/fish: non-standard shell`と怒られる場合は
vimなどで/etc/shellsを開いてファイル末尾に/usr/local/bin/fishを追記するとよい
また、readonlyになっているので`sudo`を忘れずに

```
$ vi /etc/shells
```
```一番下に/usr/local/bin/fishを追加
# List of acceptable shells for chpass(1).
# Ftpd will not allow users to connect who are not using
# one of these shells.

/bin/bash
/bin/csh
/bin/ksh
/bin/sh
/bin/tcsh
/bin/zsh
/usr/local/bin/fish
```

## 4. themaをインストールします
好きなテーマをここから探します
https://github.com/oh-my-fish/oh-my-fish/blob/master/docs/Themes.md#available-themes

お気に入りはこれ

```
$ omf install cyan
```


## 番外編(rbenv)

fishでrbenvを利用する場合は以下を実行するとよい

```
$ omf install rbenv
```
Rasberry Piを定期的に再起動する方法

#概要
- 一般的なLinuxでも同様だが、潜在的なメモリリークなどに対処するために定期的に再起動する方法を掲載する
- OSはデフォルトのRaspbianを想定

#設定方法
- dateコマンドでタイムゾーンを確認しておく

```
pi@raspberrypi:~ $ date
2017年  7月 17日 月曜日 00:29:25 JST
```

- crontabに設定を入れる

```
sudo crontab -e
00 5 * * * /sbin/reboot
```

- crontabの中身を事後確認

```
sudo crontab -l
```
Node.jsからWebAPIを叩く

# 前提
GETあるいはPOSTでデータを渡しJSONでデータが帰ってくるものを想定したコードです。
また、叩く方法はたくさんありますが、比較的短く書ける `request` を使用します。

# ソース

## GET
```js
const request = require('request');

var URL = 'URL_IS_HERE';

request.get({
	uri: URL,
	headers: {'Content-type': 'application/json'},
	qs: {
		// GETのURLの後に付く
		// ?hoge=hugaの部分
	},
	json: true
}, function(err, req, data){
	console.log(data);
});

```

## POST
```js
const request = require('request');

var URL = 'URL_IS_HERE';

request.post({
	uri: URL,
	headers: { "Content-type": "application/json" },
	json: {
		// JSONをPOSTする場合書く
	}
}, (err, res, data) => {
	console.log(data);
});
```
MacでDockerを使ってsiege環境を構築＆実行

Macでbrewを使ってinstallしたsiegeを実行したかったのですが、"Lifting the server siege..."というところで止まり、テストが最後まで進まないことが多くありました。  
siege自体のバージョンが古かったのですが、Dockerで環境を作ると、とりあえずうまくいったのでメモしておきます。

---

1.Docker定義ファイルをクローン

```
git clone https://github.com/yokogawa-k/docker-siege.git
```

2.Docker Buildを実行

```
$ docker build -t yokogawa/siege .
```

3.DockerのUbuntuに入る

```
$ ./run bash
```

4.siege.configを実行

```
# siege.config 
```

5.apt-get updateしてvimを入れる

```
# apt-get update
# apt-get install vim
```

6.basic認証を設定

```
# vi /root/.siegerc 
```

7.作業内容をsaveしておく（別ウインドウで実行）

```
$ docker ps -a
$ docker commit <container_id> test:test
```

8.siegeを実行する

```
# siege -c50 -t60S -v https://www.testtest.jp
** SIEGE 3.0.8
** Preparing 10 concurrent users for battle.
The server is now under siege...
HTTP/1.1 401   0.30 secs:     188 bytes ==> GET  /
 :
（省略）
 :
Lifting the server siege...      done.

Transactions:		         376 hits
Availability:		      100.00 %
Elapsed time:		       59.59 secs
Data transferred:	        3.24 MB
Response time:		        0.21 secs
Transaction rate:	        6.31 trans/sec
Throughput:		        0.05 MB/sec
Concurrency:		        1.31
Successful transactions:         376
Failed transactions:	           0
Longest transaction:	        0.57
Shortest transaction:	        0.03
 
FILE: /var/log/siege.log
You can disable this annoying message by editing
the .siegerc file in your home directory; change
the directive 'show-logfile' to false.
```

9.またいつか実行したい時

```
$ docker run  -it test:test       
# siege -c50 -t60S -v  https://www.testeest.jp
```

```
$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                            PORTS               NAMES
e52708193580        test:test           "/bin/bash"         15 minutes ago      Exited (127) About a minute ago                       nervous_hermann
2bc32c231d7b        ubuntu              "/bin/bash"         About an hour ago   Exited (0) 17 minutes ago                             jolly_volhard
bbd1b38a6a0e        yokogawa/siege      "siege /bin/bash"   About an hour ago   Exited (0) About an hour ago                          sleepy_saha
$ docker start e52708193580
$ docker attach e52708193580
# siege -c50 -t60S -v  https://www.testeest.jp
```
入れ子を想定としてOL要素のリスト番号にローマ数字や括弧などを用いる

# リスト番号にローマ数字や括弧を

数学的な文書をHTMLやEPUB3に取り込む際に，順序リストのCSS設定をどうすべきかをいつも考えてしまいます．例えば，次のような順序リストの入れ子を考えます．

```html
<p>次はいずれも同値である．</p>

<ol class="propositions">
  <li>空でない集合で構成された任意の集合族に対して，そららの直積集合は空ではない．</li>
  <li>帰納的な順序集合には極大元が存在する．ここで，順序集合Aが帰納的とは，その任意の空でない全順序部分集合の上限がAに存在するときにいう．</li>
  <li>任意の集合は整列集合にできる．ここで，整列集合とは
    <ol class="axiom-well-ordered-set">
      <li>全順序集合である</li>
      <li>任意の空でない部分集合は最小元をもつ</li>
    </ol>
    を満たす順序集合のことである．
  </li>
</ol>
```

このHTMLで次のようなレンダリングを実現したいとします．

![スクリーンショット 2017-07-16 23.12.09.png](https://qiita-image-store.s3.amazonaws.com/0/191414/79e82727-9b72-2969-34d7-fe3f6e158373.png)

ポイントは

+ リスト番号にローマ数字（など）を用いたい
+ リスト番号に括弧などの装飾をしたい
+ その際，i)，ii)などを右に寄せたい
+ `li`要素の内容が改行されても，リスト番号の下に文章がこないようにする．
+ 順序リストの入れ子を想定

このために次のようなcssを組みました．

```css
/*ol要素の共通設定*/  
ol.propositions, ol.propositions ol{
  padding-left: 1em; /*入れ子が起こるたびにインデント．0でもよいと思う*/
}

ol.propositions li{
  list-style-type:none; /*標準の番号を消す*/
  margin-left: 3em;     /*下のmargin-leftの符号違いを設定*/
}

ol.propositions li:before{
  display: inline-block; 
  text-align: right; /*i), ii)などを右寄せさせるため*/
  width: 2em;        /*リスト番号の幅*/
  margin-right: 1em; /*リスト番号と文章の間隔*/
  margin-left: -3em; /*上の2つと足して0になるように設定*/
}

/*カウンターの設定（olの階層ごとに設定）*/
ol.propositions>li{
  counter-increment: level1; /*もう少しセマンティックなネーミングはないか……*/
}

ol.propositions>li:before{
  content: counter(level1, upper-roman)"."; /*大文字のローマ数字*/
  font-weight: bold;
}

ol.propositions>li>ol>li{
  counter-increment: level2; /*同上*/
}

ol.propositions>li>ol>li:before{
  content: counter(level2, lower-roman)")"; /*小文字のローマ数字*/
}
```

意外と知られていない（？）のが，`counter`関数の**第2引数**に，ローマ数字にするかなどの`list-style-type`が指定できるということです．ここを省略するとアラビア数字になります．`list-style-type`にどういうものがあるかは，[list-style-type -CSS | MDN](https://developer.mozilla.org/ja/docs/Web/CSS/list-style-type)などをご覧ください．

各要素がどのような配置になっているかは，次のスクリーンショットでなんとなくイメージしてください．

![スクリーンショット 2017-07-16 23.12.17.png](https://qiita-image-store.s3.amazonaws.com/0/191414/3a44528f-3467-b27a-6e98-2418675a331d.png)


ここで個別にリストの番号を変更したい場合は，`class`属性を付加して設定します．例えば，`ol.axiom-well-ordered-set`に次のような設定をします．

```css
/*特定のリスト番号を変えたい時*/
ol.axiom-well-ordered-set>li{
  margin-left:5em;   /*下のmargin-leftの符号違いを設定*/
}
ol.axiom-well-ordered-set>li:before{
  content: "WO"counter(level2)"."!important; /*ここだけ!importantが必要？*/
  font-weight: bold;
  width: 4em;         /*リスト番号の幅を変更する場合*/
  margin-right: 1em;  /*リスト番号と文章の間隔*/
  margin-left: -5em;  /*上の2つと足して0になるように設定*/
}
```

すると次のようなレンダリングになります．

![スクリーンショット 2017-07-16 22.59.08.png](https://qiita-image-store.s3.amazonaws.com/0/191414/63f00dde-ce49-8312-51fd-3c2f796961c1.png)
GoogleAppsScriptでカオナビのAPIを叩いてデータを取得する

今年はアウトプットを頑張る年にしたいと思ったのに結局バタバタで1記事しか書けていませんでした。が、ちょっとだけ落ち着いて、本業に役立つスクリプトを新たに書いたので半年ぶりに投稿します。

元々スプレッドシートで管理していたものが最近Saasのシステムへ移行され、上手い具合にAPIも新規公開されたため、更新通知用のスクリプトを作り直しました。今回、対象としているシステムは人材管理ツールの「[カオナビ](https://www.kaonavi.jp/)」です。サイバーエージェント社やメルカリ社などIT系企業の多くが導入している有名なツールですが、通知系の機能が標準搭載されているものにプラスαで欲しかったため作りました。
# カオナビAPI
管理画面から「公開API情報確認」というメニューがあり、そこで下記の情報が確認できます。これらのキーなどを参考/参照にGoogle Apps Scriptを書きます。

- Consumer key
- Consumer secret
- シート情報（JSON形式でどんなデータがどうやって取れるかの説明）

# アクセストークンの取得
処理を実行するにあたってアクセストークンを取得します。

```js:code.js
function getAccessToken() {
  var CONSUMER_KEY = '<Consumer key>';
  var CONSUMER_SECRET = '<Consumer secret>';
  // アクセストークンの取得
  var tokenUrl = "<公開されているカオナビのアクセストークン取得用のURL>";
  var parameters = {
    method : 'post',
    payload : 'consumer_key='+CONSUMER_KEY+'&consumer_secret='+CONSUMER_SECRET ,
    muteHttpExceptions : true
  };
  var response = UrlFetchApp.fetch(tokenUrl,parameters);   
  var tokenResponse = JSON.parse(response.getContentText());
  return tokenResponse['data']['access_token']
}
```
# APIを叩く
アクセストークンを用いて良しなに公開されているAPIを叩きます。もっと色々増えるといいなぁ。

```js:code.js
function get1on1List(token) {
  var apiUrl = "<公開されているカオナビのAPIのURL>";
  var apiOptions = {
    headers : {
      "X-KAONAVI-TOKEN" : token
    },
    method : 'post'
  };
  var responseApi = UrlFetchApp.fetch(apiUrl, apiOptions);
  var responseJson = JSON.parse(responseApi.getContentText());
  return responseJson
}
```
# あとは取れたJSONデータを色々と加工
今回は最新の一覧データとSlackの通知的なことがほしいなぁと思ったので、スプレッドシートへ吐き出すのと、直近のデータはSlackに飛ばすようにしてみました。

ここは特に変わったことしていないので割愛します。

# ついでに宣伝
弊社はアドテクノロジー・マーケティングテクノロジーの事業を生業とする企業です。この業界では国内随一の成長を見せていると思いますので、よかったら気軽に遊びにいらしてください。フロントエンドからサーバサイド、インフラ、ネットワークまで幅広く仲間を募集中です！

【株式会社ジーニー】
http://geniee.co.jp/recruit/index.html
https://www.wantedly.com/companies/geniee-co
マザーボードZ170 Extreme4のオンボードNICをUbuntu14.04で認識させる

マザーボードZ170 Extreme4（ASRock製）のオンボードNICがUbuntu14.04で認識しない問題に対応したときのメモです。NICやデバイスドライバに詳しいわけではないので、この通りにやって何か起きても責任はもちません。

1. NICを確認
-----
    $ lspci | grep Ethernet
    00:1f.6 Ethernet controller: Intel Corporation Ethernet Connection (2) I219-V (rev 31)
・"I219-V"がNICの名前  

2.  NICのドライバをダウンロード
-----
下記のリンク先からファイル"e1000e-3.3.4.tar.gz"をダウンロード。（一時的にUSBのNICでネットワークに接続）
[https://downloadcenter.intel.com/ja/download/15817/-PCI-E-Linux-](https://downloadcenter.intel.com/ja/download/15817/-PCI-E-Linux-)
    
3.  解凍
-----
    $ tar xzvf e1000e-3.3.4.tar.gz

4.  ビルドとインストール
-----
    $ cd e1000e-3.3.4/
    $ make
    $ sudo make install

    #現ドライバの削除(エラーが出たけどそのまま次へ...？)
    $ sudo rmmod e1000e
    #新しいドライバの適用
    $ sudo modprobe e1000e

    #一応ネットワーク再起動
    $ sudo /etc/init.d/networking restart

    #今のモジュールを次回起動時に使用するように
    $ sudo update-initramfs -u

5. 70-persistent-net.rulesの再設定
-----
#### その１：70-persistent-net.rulesnを編集

    $ sudo emacs /etc/udev/rules.d/70-persistent-net.rulesn
##### 以下のコメント行”以外”の部分を削除して保存
    # This file was automatically generated by the /lib/udev/write_net_rules
    # program, run by the persistent-net-generator.rules rules file.
    #
    # You can modify it, as long as you keep each rule on a single
    # line, and change only the value of the NAME= key.
#### その２：write_net_rulesを編集
    $ sudo emacs /lib/udev/write_net_rules
##### 以下のように編集
    編集前：RULES_FILE=’/etc/udev/rules.d/70-persistent-net.rules’
    編集後：RULES_FILE='/dev/null'

6. 再起動して確認
-----
#### 再起動（USB等、別付けのNICは外してください）
    $ reboot

#### 起動後接続確認
    $ ifconfig eth0
    eth0      Link encap:Ethernet  HWaddr 70:85:c2:09:04:bd  
          inet addr:192.168.X.XXX  Bcast:192.168.X.XXX  Mask:255.255.255.0
          ・・・
------
### 参考
http://rainbowdevil.jp/?p=1164
http://yoshidastyle.net/Blogs/2015/05/14/%E3%80%90%E8%A7%A3%E6%B1%BA%E3%80%91waiting-up-to-60more-seconds-for-network-configuration
Ruby で、 パスワード入力時に*を表示していい感じにパスワード入力を受け付ける

# あらまし

コマンドライン入力ツールを作る際にHTMLのパスワードフォームのようにパスワード入力時に、`*`を表示させたい。

何も表示しない方法は結構記事があるが、代替文字を表示させるケースはなかったので作ってみた。

# 実装

irb でさくっと実行可能。

```irb
irb(main):001:0> require 'io/console'
irb(main):002:0> STDIN.noecho{ |io| s = ""; loop do c = STDIN.raw(&:getc); break if c == "\r"; s += c; putc '*'; end; s}
********=> "abcdefgh"
```

# 解説

コード中にインラインで解説を記述した。

```ruby
STDIN.noecho{ |io| # エコーバックを無効化して、文字を表示されないようにする。
  s = ""
  loop do
    c = STDIN.raw(&:getc) # rawモードでgetcを呼ぶ
    break if c == "\r" # Enterで入力終了とする
    s += c
    putc '*' # 代替文字を表示する
  end
  s
}
```

raw モードを使用することで、入力のバッファリングを無効化できる。
使用しないと、Enterキーが押されるまで入力がバッファリングされるため、代替文字がすぐに出てこない。
一方で、rawモードではCtrl-CやCtrl-Dなどが無効化されるので、
きちんとEnterキーなどで終了できるようにしておかないと、別ターミナルからkillするはめになるので注意。

# 課題

バッファリングがないため、バックスペースもそのままASCII コードの`0x08`で入ってくる。
STDINのエンコーディングにもよるが、筆者の環境では`\u007F`として扱われてしまっていた。
このあたりはうまく積んである文字列を削るなどする必要がある。

# まとめ

パスワード入力時に代替文字を表示させる方法を記載した。

# 参考

http://qiita.com/ksss/items/9c8a237f452cd8aa7c11
http://qiita.com/mirakui/items/88194612bb0fa705e39d
http://qiita.com/kozy4324/items/6cf6deaa6440667733e3
[C++][小ネタ] クラスの構築

小ネタです。この間、非常にくだらないことでドハマリしてしまいました。

```cpp
class A
{
public:
	A() {}
	A(int) {}
};

void foo()
{
	A a1;			// パターン１
	A& r1 = a1;		// OK

	A a2 = A();		// パターン２
	A& r2 = a2;		// OK

	A a3(1);		// パターン３
	A& r3 = a3;		// OK

	A a4();			// パターン４
	A& r4 = a4;		// Error
}
```

みなさんは、ぱっと見でパターン４の何がエラーなのか、おわかりになりますか？

自分は最初 armcc でこの問題に遭遇したのですが、"Error" の行で型が違うとだけしか表示されず、さんざん悩んでしまいました。

パターン４の a4 は、実はこれ、関数宣言として解釈されているんですね。
つまり、最初の A が戻り値で、a4 が関数名と。

いくつかのコンパイラで試しましたが、

gcc、armcc ... a4 の型が違うというエラーのみ。
msvc ... 'A (__cdecl *)(void)' から変換できません、というエラー。
clang ... "パターン４"の行でこれ関数として解釈しますよという warning と、() を消せば変数として解釈しますよという note と、"Error" の行のエラーを表示。

となっていました。clang が丁寧ｗ

わかっている人には当たり前のことなのでしょうけど、自分は「パターン３」から「パターン２」を思い浮かべながら「パターン４」へ書き換えたため「？」となって数時間ハマってしまいました。

以上、小ネタでした。
Python クラスのリスト、クラス変数値で index

リストのメンバーがクラスの場合についてです。
下記の記述により、クラスの変数値でリストの index を得ることができました。

```py
list(map(lambda x:x.変数名, et_list)).index(変数値)
```
ウェブ検索でヒントになる記事はあったのですが、これと同一のサンプルは見つけられなかったのでメモを残します。Python は 3.5.2 と 3.6.0 を使いました。


サンプルです。

```py
import datetime
from dateutil.parser import parse

class EventTimeItem:
    def __init__(self, name, dt):
        self.name = name
        self.dt   = dt

et_list = [
    EventTimeItem('wake-up'  , parse("Jul 16, 2017 at 06:30:22 JST")),
    EventTimeItem('go-to-bed', parse("Jul 16, 2017 at 23:38:10 JST")),
    EventTimeItem('dinner'   , parse("Jul 16, 2017 at 19:12:22 JST")),
    EventTimeItem('lunch'    , parse("Jul 16, 2017 at 12:00:50 JST")),
    EventTimeItem('breakfast', parse("Jul 16, 2017 at 07:00:03 JST"))
]
```

例えば、name が 'wake-up' の index は以下のように得られました。

```pycon
>>> idx=list(map(lambda x:x.name, et_list)).index('wake-up')
>>> print(idx)
0
>>> et_list[idx].name
'wake-up'
```

上記と同様の確認をワンライナーでも書けます。'lunch'の場合です。

```pycon
>>> et_list[list(map(lambda x:x.name, et_list)).index('lunch')].name
'lunch'
```
これはあまり面白くありませんね。

実際にやりたかったことは、以下のようにリストの一部を取り出すことでした。

```pycon
>>> et_list=sorted(et_list, key=lambda x:x.dt, reverse=False)
>>> for e in et_list[list(map(lambda x:x.name, et_list)).index('lunch'):]:
...     print(e.name)
... 
lunch
dinner
go-to-bed
>>> 
```
半角英数字記号と全角英数字かなカナ記号の一覧まとめ

CLI の画面設計とか、ちょっとした文字判定とか、ソートしただけで意味のある並びになるようなデータフォーマットの検討など、何かと重宝したので作ってみました。

## 半角英数字記号

```
abcdefghijklmnopqrstuvwxyz
ABCDEFGHIJKLMNOPQRSTUVWXYZ
0123456789
 !"#$%&'()-^\@[;:],./\=~|`{+*}<>?_
```

## 半角英数字記号（昇順に並べた）

記号だけ

```
 !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
```

全部

```
 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
```

## 全角英数字
ＡＢＣＤＥＦＧＨＩＪＫＬＭＮＯＰＱＲＳＴＵＶＷＸＹＺ
ａｂｃｄｅｆｇｈｉｊｋｌｍｎｏｐｑｒｓｔｕｖｗｘｙｚ
０１２３４５６７８９

## 全角かなカナ
ぁあぃいぅうぇえぉおかがきぎくぐけげこごさざしじすずせぜそぞただちぢっつづてでとどなにぬねのはばぱひびぴふぶぷへべぺほぼぽまみむめもゃやゅゆょよらりるれろゎわゐゑをん
ァアィイゥウェエォオカガキギクグケゲコゴサザシジスズセゼソゾタダチヂッツヅテデトドナニヌネノハバパヒビピフブプヘベペホボポマミムメモャヤュユョヨラリルレロヮワヰヱヲンヴヵヶ

## 全角記号
、。，．・：；？！゛゜´｀¨＾￣＿ヽヾゝゞ〃仝々〆〇ー―‐／＼～∥｜…‥
‘’“”（）〔〕［］｛｝〈〉《》「」『』【】＋－±×÷＝≠＜＞≦≧∞∴
♂♀°′″℃￥＄￠￡％＃＆＊＠§☆★○●◎◇◆□■△▲▽▼※〒→←↑↓〓
∈∋⊆⊇⊂⊃∪∩∧∨￢⇒⇔∀∃∠⊥⌒∂∇≡≒≪≫√∽∝∵∫∬Å‰♯♭♪
ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩαβγδεζηθ
ικλμνξοπρστυφχψωАБВГДЕЁЖЗИЙКЛМНО
ПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзийклмн
опрстуфхцчшщъыьэюя
─│┌┐┘└├┬┤┴┼━┃┏┓┛┗┣┳┫┻╋┠┯┨┷┿┝┰┥┸╂
｡｢｣､･ｦｧｨｩｪｫｬｭｮｯｰｱｲｳｴｵｶｷｸｹｺｻｼｽｾｿﾀﾁﾂﾃﾄﾅﾆﾇﾈﾉﾊﾋﾌﾍﾎﾏﾐﾑﾒﾓﾔﾕﾖﾗﾘﾙﾚﾛﾜﾝﾞﾟ
①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩ㍉㌔
㌢㍍㌘㌧㌃㌶㍑㍗㌍㌦㌣㌫㍊㌻㎜㎝㎞㎎㎏㏄㎡　㍻〝〟№㏍℡㊤㊥㊦㊧
㊨㈱㈲㈹㍾㍽㍼≒≡∫∮∑√⊥∠∟⊿∵∩∪

全角スペース「　」
タブ「	」
イコール系「≒＝≠≦≧」

## 参考
- [特殊文字・記号や罫線文字の入力一覧表](https://support.microsoft.com/ja-jp/help/883172)
rbenvを利用してローカル環境にrubyをインストールする


1. rubyバージョンを管理するrbenvとruby-buildをインストールする
1. rbenvでインストールできるバージョンを確認する
1. バージョンを指定してRubyをインストール
1. ローカルマシンで利用するrubyのバージョンを指定する
1. rbenvの設定をローカルに反映させる

## 1. rubyバージョンを管理するrbenvとruby-buildをインストールする

brewを利用してインストールし、それぞれバージョンを確認しバージョンが表示されることを確認

```
$ brew install rbenv ruby-build
$ rbenv -v
rbenv 1.1.1
$ ruby-build --version
ruby-build 20170523
```

## 1.rbenvでインストールできるバージョンを確認する

まずは、どのバージョンがほしいか、バージョン一覧で確認する

```
$ rbenv install -l
Available versions:
  1.8.5-p52
  ... (省略)
  2.2.4
  2.2.5
  2.2.6
  2.2.7
  2.3.0-dev
  2.3.0-preview1
  2.3.0-preview2
  2.3.0
  2.3.1
  2.3.2
  2.3.3
  2.3.4
  2.4.0-dev
  2.4.0-preview1
  2.4.0-preview2
  2.4.0-preview3
  2.4.0-rc1
  2.4.0
  2.4.1
  2.5.0-dev
  ... (省略)
```

## 2. バージョンを指定してRubyをインストール

今回は バージョン 2.4.0 をインストールする

```
$ rbenv install 2.4.0
ruby-build: use openssl from homebrew
Downloading ruby-2.4.0.tar.bz2...
-> https://cache.ruby-lang.org/pub/ruby/2.4/ruby-2.4.0.tar.bz2
Installing ruby-2.4.0...
Installed ruby-2.4.0 to /Users/gulliver/.rbenv/versions/2.4.0
```

rbenvでインストールしたバージョンは`rbenv versions`で確認する

```
$ rbenv versions
  system
  2.2.0
```

## 3.ローカルマシンで利用するrubyのバージョンを指定する

```
$ rbenv global 2.4.0
$ rbenv versions
  system
  2.2.0
* 2.4.0 (set by /Users/gulliver/.rbenv/version)
```

rubyのバージョンが設定されたか確認します。


```
$ ruby -v
ruby 2.0.0p648 (2015-12-16 revision 53162) [universal.x86_64-darwin16]
```

まだ、rubyのバージョンがうまく設定されていません。

## 4.rbenvの設定をローカルに反映させる

`rbenv init` を実行します。
rbenvの設定を自動で追加するには`~/.bash_profile` に
`eval "$(rbenv init -)"`を追加する必要がある

```
$ rbenv init
# Load rbenv automatically by appending
# the following to ~/.bash_profile:

eval "$(rbenv init -)"
```

`.bash_profile`に追記(.bashrcでもいい)

```.bash_profile
eval "$(rbenv init -)"
```

設定を反映させて`ruby -v` を実行する。

```
$ source .bash_profile
$ ruby -v
ruby 2.4.0p0 (2016-12-24 revision 57164) [x86_64-darwin16]
```

rubyのバージョンが正しく設定されていることを確認
発掘 No2325.システムで予約されているエラー（－7711）のデッドリンク

#発掘内容
[ＡＳ/４００会議室 INDEXに戻る] [ヘルプ] 
http://www7.big.or.jp:80/~pinball/discus/as400/22914.html
[MS-ACCESS AS/400間のODBC接続について](http://www7.big.or.jp:80/~pinball/discus/as400/22914.html)
投稿者: mtts (221.246.185.229) 投稿日時: 2005/04/22 11:32:43
(Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; .NET CLR 1.1.4322))
(内容)

[OS/400のVER]:
現在iSeries Access ODBC Driverを使用してMS-ACCESSからAS/400のDBに更新をかけようとしています。
そこで過去ログを参考にしながら自分なりに設定してしたいことはできるようになりました。ですがやることすべてが初めてなことなのでこれで問題がないか教えていただけないでしょうか。
【うまくいかない手順】
１、MS-ACCESSからテーブルのリンクを指定。
２、ウィーザードに従いデーターソースをiSeries Access ODBC Driverを使用して作成。
３、iSeries Access for Windows ODBC データ・ソースの設定ウィンドウが出てきますが、特に変更しない。
４、接続するDBを指定し、主キーを設定。
５、テーブルを開く
６、再びiSeries Access for Windows ODBC データ・ソースの設定ウィンドウが出てくるが、そのままＯＫを押す。
７、”システムで予約されているエラー（-7778）”が発生。

手順６のウィンドウが出てくること自体問題のような気がしますが・・・。

【うまくいっている手順】
以下のようなデータソースを手動で作成しテーブルをリンクする。
[ODBC]
DRIVER=iSeries Access ODBC Driver
UID=QSECOFR
DBQ=XXLIB
SYSTEM=xxx.xxx.xxx.xxx

追加・更新・削除等、問題なく動作


DB2 CONNECTも設定してみましたがこちらはCHARのフィールドがブランクのレコードに対して更新等がかけれませんでした（カレントレコードがないといわれてしまいます。）

以上です。
よろしくお願いします。
#発掘した理由
下記BBSで取り上げられているため

[No2325.システムで予約されているエラー（－7711）](http://www.accessclub.jp/bbs6/0009/das2325.html)
###質問内容
OS:Win2000 SP4
Access Version:2002
iSeries Access ODBC Driver を経由して
i5のテーブルのリンクを作成しました。
テーブルの内容を表示することはできるのですが、
更新しようとすると
メッセージ「システムで予約されているエラー（－7711）」が
表示されます。

キーは設定しています。
重複するキーのデータは入れてないです。
右クリックしてテーブルの選択
↓
リンクを選ぶ小窓が表示されるので
ファイルの種類を「ＯＤＢＣデータベース（）」を選択します。
↓
データソースを選ぶ小窓が表示されるので
コンピュータデータベースの作成したＯＤＢＣを選択します。
↓
テーブルを選ぶ小窓が表示されるので
（ライブラリー名.テーブル名の一覧）
対象のテーブルを選択する。

という手順について上記リンクが示されている。しかし原因はオブジェクトをジャーナルに参加させていなかったことだった。

###AS400とは
[AS400とはなにか](http://sugi.minibird.jp/as400/as400/)[魚拓](http://megalodon.jp/2017-0716-2125-24/sugi.minibird.jp/as400/as400/)
いわゆるオフコンでDB処理をさせている。そのデータベースにAccesshaODBC接続できるがシステムで予約されたエラー（-7778）出るということになる。
エンジニア・プログラマ向け、情報共有・情報収集サイト

とある案件で調べてみたのでメモレベルで列挙（ほぼ備忘録）

# 情報共有全般
## Qiita

https://qiita.com/about
まさにこのサイト。
エンジニアやプログラマが各々のノウハウや情報を共有できる。
プログラム、ソースコードに限らず、OSSの構築ノウハウなども数々投稿されている。

# ソースコード共有
## github

https://github.com/
おそらく知らない人がいないぐらい有名。
gitのバージョン管理をオンライン上で扱えるサイト。


## codepen

http://codepen.io/
HTML、CSS、JSなどWEB系に特化したソースコード共有サイト。
WEB系開発初心者の強い味方。


# Q&A特化：
## stack overflow

https://ja.stackoverflow.com/
エンジニア向けのQAサイト。
元々英語しかなかったが、現在は日本語にも対応。

## teratail

https://teratail.com/
純日本製のエンジニア向けQAサイト。
回答率がリアルタイムで表示されている（90%超え！）

## QA＠IT

https://qa.atmarkit.co.jp/
it系メディア＠ITが手がけるQAサイト。


# プログラム学習系：
## schoo
https://schoo.jp/
動画教材でプログラムを学べるサイト。

## CodeIQ
https://codeiq.jp/
各種言語の問題を解いていくことで、自身のスキルを示せるサイト。
企業スカウトとも連携している。

## paiza
https://paiza.jp/
codeIQ同様、プログラムの問題に答えることでスキルチェックができるサイト。
転職や就活にも活用可能。
ゲーム要素の強いコンテンツもいくつか用意されている。
Hugoを触ってみたので、一通りの弄り方をまとめる

最近話題の静的サイトジェネレータの Hugo を触ってみました、何やら Go 言語製ということで他の静的サイトジェネレータよりも高速に動作するようです。

今回は Hugo を触ってみて、一通りの弄り方をまとめました。
(https://gohugo.io/overview/quickstart/ を参考にしました)

# 環境

* MacOS Sierra バージョン 10.12.5
* Homebrew インストール済み

# Hugo インストール

Go 言語製ですが、Go は必要ないようです。

```
brew install hugo
```

# Hugo を試す

## サイト作成

実験用のディレクトリを作って、hugo でサイトを生成します。

```
$ mkdir hugo-test
$ cd hugo-test
$ hugo new site hoge
```

## テーマ追加 (テンプレート)

テーマを入れないと何も表示されないので、テーマを持ってきます。
テーマ一覧は https://themes.gohugo.io/ から探し、気に入ったテーマの git リポジトリを clone します。

```
$ cd themes
$ git clone https://github.com/dim0627/hugo_theme_robust.git
$ cd ..
```

## 記事追加

記事を追加します、追加方法は下記の通りです。
追加すると追加されたファイルパスが表示されるので、パスにあるファイルを弄ります。

```
$ hugo new ディレクトリ名/記事名.md

/Users/ユーザ名/hugo-test/hoge/content/ディレクトリ名/記事名.md created
```

記事の追加時はディレクトリを指定しなくても可能です。

```
$ hugo new 記事名.md

/Users/ユーザ名/hugo-test/hoge/content/記事名.md created
```

追加される記事は下記のようになっていると思います。

```
---
title: "記事名"
date: 2017-07-16T19:40:59+09:00
draft: true
---
```

各項目の意味は下記の通り。

- title: 記事名で、ページタイトルになることが多い
- date: 生成された日時
- draft: ドラフト記事なら true

ドラフト記事はまだ公開しない記事で、公開したければ `draft: false` にします。
記事の書き方は、上記の項目の下にマークダウンを書いていくことで行います。

```サンプル.md
---
title: "サンプル"
date: 2017-07-16T19:40:59+09:00
draft: true
---

# ようこそ

ここはサンプルページです！

## サンプルタイトル

サンプル文章

```

## プレビュー

```
$ hugo server --theme=hugo_theme_robust --buildDrafts --watch
```

`--theme=` のところは自分が追加したテーマ名を設定します。
`--buildDrafts` はドラフト記事も表示するようにします。
`--watch` は変更をリアルタイムで反映するようにします。

上記コマンドでエラーがでなければ、http://localhost:1313/ でアクセス出来るようになります。
各記事へのURLは下記のようになります。

ディレクトリ有り: http://localhost:1313/ディレクトリ名/記事名
ディレクトリ無し: http://localhost:1313/記事名


# テーマを弄る

テーマをちょっといじったり、各記事へのリンクを貼りたい時は下記のディレクトリを弄ります。

```
hugo-test/hoge/themes/テーマ名/layouts/index.html # トップページ
hugo-test/hoge/themes/テーマ名/layouts/partials/header.html # ページヘッダ
hugo-test/hoge/themes/テーマ名/layouts/partials/footer.html # ページフッタ
hugo-test/hoge/themes/テーマ名/static/css/main.css # ページ全体のCSS
```

# サイトを公開出来る状態にする

`hugo-test/hoge/config.toml` の baseURL を弄ります。

```hugo-test/hoge/config.toml
baseURL = "公開ページURL"
languageCode = "js"
title = "hoge"
```

そして、下記コマンドを実行することで、`hugo-test/hoge/public` ディレクトリ内に指定したテーマで公開用ページに置くファイルが生成されます。

```
$ hugo --theme=テーマ名
```

# まとめ

静的サイトジェネレータを生まれて始めて触りましたが、CLI で操作する WordPress のような印象を受けました。
Hugo は他の静的サイトジェネレータよりもシンプルで高速らしいので、もう少し勉強してみようと思います。
Seleniumを使ってクッキークリッカーを自動化してみた

#はじめに
Seleniumの勉強がてら、一昔前に流行ったクッキーをひたすらクリックするゲームを自動化してみます。

#クッキークリッカーとは
一昔前に流行ったクッキーをクリックして増やす。それだけのゲームです。
昔は貴重な休みを潰してひたすらクリックしていました。中毒性すごい。

##環境
windows10(64bit)
ruby 2.4.1
selenium-webdriver 3.4.3

#やりたいこと

-クッキーを自動でクリックする
　1番やりたいこと。適当な回数を自動的にクリックできるようにする
-セーブデータの出力
　seleniumはあくまでテストツールなので、ブラウザを閉じてしまうと
　クッキーをクリックした実績がなくなってしまう。
　そこでクッキークリッカーにあるセーブ出力機能を使ってセーブ情報を保存しておく。
-前回データの読み込み
　前述で出力したデータをブラウザ起動時に読み込ませて前回の続きからクリックさせたい。


#コードを書いてみた
```autoClicker_test.rb
require "selenium-webdriver"

#Chrome用のドライバ
driver = Selenium::WebDriver.for :chrome

#CookieClickerにアクセスする
driver.get "http://orteil.dashnet.org/cookieclicker/"

#読み込み時間があるのでスリープ
sleep 3

#セーブデータのインポート
impFile = "C:\\test.txt"
driver.find_element(:id,"prefsButton").click
driver.find_element(:link,"Import save").click
saveCode = File.open(impFile).read
driver.find_element(:id,"textareaPrompt").send_keys(saveCode)


#クッキーの要素を取得
nmlCookie = driver.find_element(:id,'bigCookie')

#クッキーをクリックする回数を設定
clickCnt = 10

#clickCnt分クッキーをクリックする
i = 0
while i < clickCnt
  nmlCookie.click
  i += 1
end

#セーブデータを出力する。
driver.find_element(:link,"Save to file").click
#出力に時間がかかるのでsleep
sleep 3

#ブラウザを終了する
driver.quit

```

セーブデータの出力先を変更したかったのですが、デフォルトでダウンロードフォルダに出力されてしまうようでした。
ここは変え方がわからなかったので断念。
CentOS 7.3 : sudoコマンドのインストール

## 検証環境
```bash:docker
$ docker pull centos 
[root@75fcd02c921a /]# cat /etc/redhat-release
CentOS Linux release 7.3.1611 (Core)
```

## 解決方法について
```bash:centos
# インストールされているかの確認
root@75fcd02c921a /# yum list installed | grep sudo
root@75fcd02c921a /# yum install -y sudo
Loaded plugins: fastestmirror, ovl
base                                                                                                                                                       | 3.6 kB  00:00:00
extras
(省略)

# 再度インストールされているかの確認
root@75fcd02c921a /]# yum list installed | grep sudo
sudo.x86_64                              1.8.6p7-23.el7_3               @updates   # 入っています。
```
Linux ディストリビューション・バージョンの確認方法

サーバにインストールされているLinuxのディストリビューションを確認する方法とそのバージョンを確認する方法を記載します。

## 検証環境
```bash:docker
$ docker pull ubuntu // https://hub.docker.com/_/ubuntu/
$ docker pull centos // https://hub.docker.com/_/centos/
$ docker pull debian // https://hub.docker.com/_/debian/
```

## 解決方法について

```bash:Ubuntu
root@792772f62cdf:/# cat /etc/issue
Ubuntu 16.04.2 LTS
 
# or
 
root@9f3e980f7152:/# cat /etc/issue
Ubuntu 16.04.2 LTS \n \l

root@9f3e980f7152:/#
```

```bash:CentOS
root@9822a3c4d316 /# cat /etc/redhat-release
CentOS Linux release 7.3.1611 (Core)
```

```bash:Debian
root@1c89b8c23fcd:/# cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 9 (stretch)"
NAME="Debian GNU/Linux"
VERSION_ID="9"
VERSION="9 (stretch)"
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"

# or 

root@7ef76ea4f938:/# cat /etc/issue
Debian GNU/Linux 9 \n \l
```

方法としては2つあります。

```
/etc/ディストリビューション名-release
```

```
/etc/issue 
```
のどちらかを見ればディストリビューション + そのバージョンが確認できます。



ちなみにLinux OSのバージョン確認方法は下記になります。

```bash:Linux
root@1c89b8c23fcd:/# cat /proc/version
Linux version 4.9.31-moby (root@11fbdc1f630f) (gcc version 6.2.1 20160822 (Alpine 6.2.1) ) #1 SMP Sat Jun 24 06:29:23 UTC 2017
```
or 

```bash:Linux
root@7ef76ea4f938:/# uname -a
Linux 7ef76ea4f938 4.9.31-moby #1 SMP Sat Jun 24 06:29:23 UTC 2017 x86_64 GNU/Linux
```
Go で cronしたいなら go-scheduler  がいいかも

# あらまし

Go言語で一定時間ごとにタスクを実行するデーモンを作るときに
[go-scheduler](https://github.com/carlescere/scheduler) を使いました。

名前のせいか、検索してもほとんど出てこないのですが、使用感は悪くなかったので、紹介したいと思います。

# 使い方

[godoc](https://godoc.org/github.com/carlescere/scheduler) 見ればいいんですが、それだと記事の意味がほとんどないので紹介を。

```go
func main() {
  job := func() {
    fmt.Println("Time's up!")
  }
  scheduler.Every(5).Seconds().Run(job) // ５秒ごと
  scheduler.Every().Day().Run(job) // 毎日（のどこか）
  scheduler.Every().Sunday().At("08:30").Run(job) // 日曜朝８:３０に
}
```

競合（？）する[gocron](https://godoc.org/github.com/robfig/cron) と機能は大体同じかなと。
ただ、あっちは入力を文字列としてとるので、いちいち`Sprintf()`する必要があるのがネックで、
こちらは変数とか直に取れる。
最小単位も`gocron`と同じく秒です。

# まとめ

`go-scheduler`を紹介しました。

Go言語で定時処理をするなら、`gocron`よりこちらを使ってみるのもよいかもしれません。
PHPMailerで，ファイルを手元に保存せずに文字列だけからファイル添付する

# PHPMailer
[PHPMailer/PHPMailer: The classic email sending library for PHP](https://github.com/PHPMailer/PHPMailer)

基本的な使い方はこちらをどうぞ。

- [PHPMailerの使い方 - ITS](https://its-office.jp/blog/php/2017/05/28/phpmailer.html)  
  `mail.php` というサンプルが一目瞭然かと
- [PHPMailerの使い方！かんたんにPHPで添付ファイル付きのメールを送る！ | イリテク](https://iritec.jp/web_service/4271/)  
  既存ファイルのパスを指定して添付するのは `addAttachment($filepath)`

## 注意
**2016年12月に発覚したPHPMailerの脆弱性について↓**
最新版を使うなど対策はご自身でm(_ _)m

- [PHPMailerのリモートコード実行脆弱性(CVE-2016-10033)の影響範囲](http://qiita.com/ichikaway/items/d2d9205c57f35b618951)
- [PHPMailerの脆弱性CVE-2016-10033について解析した | 徳丸浩の日記](http://blog.tokumaru.org/2016/12/PHPMailer-Vulnerability-CVE-2016-10033.html)

# addStringAttachment
## できること・使い方
文字列を指定の形式のファイルとしてメールに添付する。

```php:mail.php
<?php
require("PHPMailer/class.phpmailer.php");

$mailer = new PHPMailer();

// 前処理いろいろ。c.f. 上記参考リンク

$str  = '日付,メニュー,内容' . "\n";
$str .= '170716,日替わり定食A,焼き鮭' . "\n";
$str .= '170716,日替わり定食B,肉野菜炒め' . "\n";

$filename = '170716食堂通信.csv';

$mailer->addStringAttachment($str, $filename);

$mailer->send();
```

これでこういう感じのCSVファイル（ `170716食堂通信.csv` ）が添付されます↓
サーバー側にファイルは残りません。

| 日付 | メニュー | 内容 |
| ---- | ------- | ---- |
|170716|日替わり定食A|焼き魚|
|170716|日替わり定食B|肉野菜炒め|

ファイルの形式は自分で別途指定もできますが，ファイル名の拡張子から勝手に判断してもらえるようです。
（ソースコード参照↓）

## ソースコード
一部抜粋で

[PHPMailer/class.phpmailer.php at master · PHPMailer/PHPMailer](https://github.com/PHPMailer/PHPMailer/blob/master/class.phpmailer.php#L2976)


```php:PHPMailer/class.phpmailer.php
    /**
     * Add a string or binary attachment (non-filesystem).
     * This method can be used to attach ascii or binary data,
     * such as a BLOB record from a database.
     * @param string $string String attachment data.
     * @param string $filename Name of the attachment.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File extension (MIME) type.
     * @param string $disposition Disposition to use
     * @return void
     */
    public function addStringAttachment(
        $string,
        $filename,
        $encoding = 'base64',
        $type = '',
        $disposition = 'attachment'
    ) {
        // If a MIME type is not specified, try to work it out from the file name
        if ($type == '') {
            $type = self::filenameToType($filename);
        }
        // Append to $attachment array
        $this->attachment[] = array(
            0 => $string,
            1 => $filename,
            2 => basename($filename),
            3 => $encoding,
            4 => $type,
            5 => true, // isStringAttachment
            6 => $disposition,
            7 => 0
        );
    }
```

# シチュエーション
私がこれを使ったのは

- DBから取得した情報をCSVファイルとして他部署の人にメールで送りたい
- **メール送信後，CSVファイルは別に使わない**

↑という状況でした。
最初はこういう流れを考えていましたが↓

1. DBから取得
2. CSVファイルに取得結果を書き込み
3. CSVファイル保存
4. `addAttachment($filepath)`で添付・送信
5. CSVファイル削除

わざわざこちらでCSVファイルを作ったり消したりしなくてもよかった，というお話でした。

「そもそもメールの添付ファイルってメーラーによって文字列に変換されて送信されるんだから，
ファイル作って添付ってステップ踏むと
`文字列 → ファイル → メーラーがファイルを文字列に → 受取側が文字列をファイルに`
ってしてるわけで最初のほう二度手間じゃん」と
先輩から指摘を受けてこちらを使ったという次第でした。たしかになー。
クラウドサーバでTensorFlow　その13

#概要
クラウドサーバでTensorFlowやってみた。
deep dreamやってみた。

#環境
クラウド idcf
linux debian-8.11
tensorflow 1.2
gpu 無し

#写真

![dddd.jpg](https://qiita-image-store.s3.amazonaws.com/0/18104/1b9d6bfd-0624-96cd-9cf3-57ad177370da.jpeg)

#サンプルコード

```
var uploadFile;
document.getElementById('imageFile').addEventListener("change", function() {
    var image = new Image();
    var reader = new FileReader();
    reader.onload = function(e) {
        canvas = document.getElementById('canv_original');
        canvas.width = 224;
        canvas.height = 224;
        ctx = canvas.getContext("2d");
        image.onload = function() {
            ctx.drawImage(image, 0, 0, 224, 224);
        }
        image.src = reader.result;
    };
    uploadFile = this.files[0];
    reader.readAsDataURL(uploadFile);
}, true);
document.getElementById('upload').addEventListener("click", function() {    
	var img = canvas.toDataURL('image/jpeg');
    $.ajax({
		url: 'http:///cgi-bin/test7.py',
		type: 'POST',
		data: {
            img: img
        },
		dataType: 'text',
		success: function(data) {
            var koko = document.getElementById('koko');
            koko.src = 'data:image/jpeg;base64,' + data;
        },
        error: function(res) {
            alert('err');
        }
	});
}, true);




```

#成果物

http://jsdo.it/ohisama1/wQQ9
Ubuntuにnode-sassを入れようとしたらつまづいた話

Rubyアレルギー(超偏見)なので、Ruby製のsassを使いたくなくてnode-sassを入れようとしたらつまづいたので備忘録

インストールコマンドは以下になるんですが。。。```
npm install -g node-sass```

実行すると、このようなエラーが。。。

```
gyp ERR! configure error 
gyp ERR! stack Error: EACCES: permission denied, mkdir '/usr/local/lib/node_modules/node-sass/build'
gyp ERR! System Linux 4.4.0-83-generic
gyp ERR! command "/usr/local/bin/node" "/usr/local/lib/node_modules/node-sass/node_modules/node-gyp/bin/node-gyp.js" "rebuild" "--verbose" "--libsass_ext=" "--libsass_cflags=" "--libsass_ldflags=" "--libsass_library="
gyp ERR! cwd /usr/local/lib/node_modules/node-sass
gyp ERR! node -v v8.1.4
gyp ERR! node-gyp -v v3.6.2
gyp ERR! not ok 
Build failed with error code: 1
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! node-sass@4.5.3 postinstall: `node scripts/build.js`
npm ERR! Exit status 1
npm ERR! 
npm ERR! Failed at the node-sass@4.5.3 postinstall script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

npm ERR! A complete log of this run can be found in:
npm ERR!     /home/(ユーザー名)/.npm/_logs/2017-07-16T08_46_15_890Z-debug.log
```

permission denied？

ということで、sudoを付けて再度実施してみましたが変わらず。。。

いろいろ調べながら、バージョンアップとかキャッシュクリーンしてみたけど変わらず。。。

最終的に以下2コマンドを実施して、再度インストールを試みたら入ったっぽい。。。
結局、原因は分からず。。。

```
npm config set user 0
npm config set unsafe-perm true
```

**実施した全コマンド**

```
npm cache clean -f
npm install -g npm
npm install -g n
n latest
npm install -g node-gyp
npm config set user 0
npm config set unsafe-perm true
```
MediaWikiで検索時にデータベースクエリのエラーが発生する

MediaWikiのバージョン: 1.24.1

検索すると下記のエラーメッセージが表示され検索できなくなってしまった。

```
データベース クエリのエラーが発生しました。 これはソフトウェアのバグである可能性があります。
```

調べた所、下記をLocalSettings.phpの末尾に追加すると、実際のクエリやエラーメッセージが表示されるよう。

```php
$wgShowSQLErrors = true;
```
参照: https://www.mediawiki.org/wiki/Manual:$wgShowSQLErrors/ja

これを使いして再度検索を実行すると、下記のエラーが表示される。

* クエリ:　
  SELECT page_id,page_namespace,page_title FROM `page`,`searchindex` WHERE (page_id=si_page) AND ( MATCH(si_title) AGAINST('+aaau800 ' IN BOOLEAN MODE) ) AND page_namespace = '0' LIMIT 20
* 関数: SearchMySQL::searchInternal
* エラー: 145 Table './[DB名]/searchindex' is marked as crashed and should be repaired

これで調べるとまとめてくださっている方がいた。

[Mediawiki/トラブルシューティング](http://s.maruko2.com/mw/Mediawiki/%E3%83%88%E3%83%A9%E3%83%96%E3%83%AB%E3%82%B7%E3%83%A5%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0#.E3.83.87.E3.83.BC.E3.82.BF.E3.83.99.E3.83.BC.E3.82.B9.E3.82.A8.E3.83.A9.E3.83.BC.E3.81.AE.E4.BF.AE.E5.BE.A9.E6.96.B9.E6.B3.95)

下記を実行し、mysqldを再起動することで修正できた。

```bash
$ cd /var/lib/mysql/[DB名]
$ myisamchk -r searchindex.MYI
```

上のLocalSettings.phpに仕込んだ行を削除しサービスを再起動して完了。
【JavaScript】配列のソートについてちょっとじっくり考えてみました

　予め断っておきますが、車輪の再発明というか、火おこしみたいな記事です。

```js

var numbers = [5, 8, 1, 4, 7, 10, 2, 6];

numbers.sort(function(first, second) {
  return first - second;
});

console.log(numbers);
//=> "[1, 2, 4, 5, 6, 7, 8, 10]"
```

　初めてこれを目にした時、これは一体どうなってんだ？ってなりました。よく書籍にも登場しますが詳しい解説がないような気がします。結論だけだったり解説が簡潔すぎたりで。そこで、自作する過程で何か得られるのではないかと思ってやってみます。

　①配列から最小のものを抽出する。
　②それを新配列に追加する。
　③配列からいま抽出したものを削除する。
　④これを繰り返す。
　⑤最後に新配列を出力。

　こんな感じでしょうか？

　まず最小のものを抽出する関数から作ってみます。Math.min()を使っているようでは火おこしとは言えないのでこれも自作してみます。関数名が重複するのもややこしいのでhiokoshiオブジェクトを作ってそのメソッドという位置づけでやっていきます。

```js
var hiokoshi = {};

var numbers = [5, 8, 1, 4, 7, 10, 2, 6];

hiokoshi.min = function(ary) {
  var num = ary[0];
  for (var i=1; i<ary.length; i++) {
    if (num <= ary[i]) {
      num = num;
    } else if (num > ary[i]) {
      num = ary[i];
    }
  }
  return num;
};

console.log(hiokoshi.min(numbers));
//=> 1
```
　n番目とn+1番目の数値を比較して小さい方を勝者とし、これを繰り返して最後に勝ち残ったものが答えということになります。つまり、5 vs 8 => 5, 5 vs 1 => 1, 1 vs 7 => 1,・・・という感じです。

　ソートに取り掛かります。最初に提示した考え方で昇順に並び替える関数sort_ascを作ってみます。

```js

hiokoshi.sort_asc = function(ary) {
  var new_ary = [];
  while (ary.length) {
    var num = hiokoshi.min(ary);
    new_ary.push(num);
    for (var i=0; i<ary.length; i++) {
      if (num === ary[i]) {
        ary.splice(i,1); // .spliceの火おこしは勘弁。
        break; // 重複値が不要であればここは外す。
      }
    }
  }
  return new_ary;
};

console.log(hiokoshi.sort_asc(numbers));
//=> "[1, 2, 4, 5, 6, 7, 8, 10]"
```

　最初に述べたように、配列の中から最小値を取得して新配列に追加するとともに配列から最小値を削除し、この動作を繰り返していけば昇順ソートされた配列が得られます。

　しかし、冒頭のコードが内部でどう動いているのかは謎のままで得られたものはないです（苦笑）。内部では新しい配列を用意するなんてことはしてなさそうだし。また随時編集していきたいと思います。
Linuxで容量を食うファイルを探す方法

まずはハードディスク単位で空き容量を確認
/dev/sda1がいつも使う場所なので、90%とか100%になってたら掃除を開始

```bash:
$ df
```

次にこのへんのコマンドで犯人を探す

```bash:
$ du -ma | sort -rn | head -10
```

```bash:
$ du -sh <directory>
```
初回アクセス時にjsessionidを付与しなくする

servlet 3.0環境の場合、web.xmlに以下を設定する。参考：[java - Is it possible to disable jsessionid in tomcat servlet? - Stack Overflow](https://stackoverflow.com/questions/962729/is-it-possible-to-disable-jsessionid-in-tomcat-servlet) それ以前のバージョンでのやり方の例は参考のリンク先に書いてある。

```xml
<session-config>
    <tracking-mode>COOKIE</tracking-mode>
</session-config>
```

springの場合は以下のようにする。参考：[java - Set tracking mode to cookie to remove appended session id, without using web.xml - Stack Overflow](https://stackoverflow.com/questions/16262285/set-tracking-mode-to-cookie-to-remove-appended-session-id-without-using-web-xml)

```java
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.SessionTrackingMode;

import org.springframework.web.WebApplicationInitializer;

public class WebMVCApplicationInitializer implements WebApplicationInitializer {

	@Override
	public void onStartup(ServletContext container) throws ServletException {
        Set<SessionTrackingMode> s = new HashSet<>();
        s.add(SessionTrackingMode.COOKIE);
        container.setSessionTrackingModes(s);
	}
}
```

spring-security-webを使っている場合はAbstractSecurityWebApplicationInitializerを使うこともできる。

```xml
<!-- https://mvnrepository.com/artifact/org.springframework.security/spring-security-web -->
<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-web</artifactId>
    <version>4.2.3.RELEASE</version>
</dependency>
```

```java
import java.util.EnumSet;
import java.util.Set;

import javax.servlet.SessionTrackingMode;

import org.springframework.security.web.context.AbstractSecurityWebApplicationInitializer;

public class WebSecutityInit extends AbstractSecurityWebApplicationInitializer {
	@Override
    protected Set<SessionTrackingMode> getSessionTrackingModes() {
        return EnumSet.of(SessionTrackingMode.SSL);
    }
}
```
講談社機械学習プロフェッショナルシリーズ『深層学習』の学習 第8章 ボルツマンマシン

注意：『<a  href="https://www.amazon.co.jp/gp/product/4061529021/ref=as_li_qf_sp_asin_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4061529021&linkCode=as2&tag=aokikenichi-22">深層学習 (機械学習プロフェッショナルシリーズ)</a><img src="http://ir-jp.amazon-adsystem.com/e/ir?t=aokikenichi-22&l=as2&o=9&a=4061529021" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />』
<a  href="https://www.amazon.co.jp/gp/product/4061529021/ref=as_li_qf_sp_asin_il?ie=UTF8&camp=247&creative=1211&creativeASIN=4061529021&linkCode=as2&tag=aokikenichi-22"><img border="0" src="http://ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=4061529021&Format=_SL110_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=aokikenichi-22" ></a><img src="http://ir-jp.amazon-adsystem.com/e/ir?t=aokikenichi-22&l=as2&o=9&a=4061529021" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />
を読むにあたって、自分が読みたいな、こんな記事があったら参考になるな、という基準で書いております。私は機械学習も数学も専門家ではないので誤っている箇所も多々あるかと思いますが参考となると幸いです。

本章は正直未消化ですみません。

# 第8章 ボルツマンマシン
## 8.1 データの生成モデル
とくになし

## 8.2 ボルツマンマシン
### 8.2.1 確率的構造
とくになし

### 8.2.2 学習
- p134

```math
\frac{\partial{L(\theta})}{\partial{\theta}}=0 の計算をする必要があるが、対数をとったものの微分 \\
\frac{\partial{log{L(\theta}})}{\partial{\theta}} = \frac{1}{L(\theta)}\frac{\partial{L(\theta})}{\partial{\theta}} = 0 を計算しても、極値の\theta を求める意味では同じ \\
そして、対数を取ると\Piが\Sigmaつまり掛け算を足し算で計算すればよくなり以降の計算が楽になる
```

(8.5a)の導出が分からない

```math
\begin{align}
\frac{\partial{logL(\mathbf{\theta})}}{\partial{b_i}}&=\frac{\partial{}}{\partial{b_i}}\Sigma_n{\{-\Phi-logZ\}} \\
&=\frac{\partial}{\partial{b_i}}\Sigma_n{\{\Sigma_i{b_ix_i+\Sigma_{i,j}{w_{ij}x_ix_j-log{\Sigma_x{\exp(-\Phi)}}}}\}} \\
&=\Sigma_n{x_{ni}}+N\Sigma_x{\frac{\partial{\Phi}}{\partial{b_i}}}
？？？\\
&=\Sigma_n{x_{ni}}+NE_\theta[x_ix_j] となるところが分からない……
\end{align}
```

## 8.3 ギブスサンプリング
(8.8)も分かりません

# 8.4 隠れ変数を持つボルツマンマシン
# 8.4.1 確率的構造
とくになし

# 8.4.2 学習
- p139 (8.10)

```math
\begin{align}
\log{L(\mathbf{\theta})}&=\log\Pi_n{\Sigma_h{p}} \\
&=\log{\Pi_n{\Sigma_h{\frac{1}{Z}\exp{(-\Phi)}}}} \\
&=\Sigma_n{\{\log{\Sigma_h{\exp{(-\Phi)}-\log{Z(\theta)}}}\}} \\
&\propto \frac{1}{N}\Sigma_n{[\log{\Sigma_h{\exp{(-\Phi)}-\log{Z(\theta)}}}]}
\end{align}
```
# 8.5 制約ボルツマンマシン（RBM）

# 8.6 RBMの学習

# 8.7 その他のユニット

# 8.8 ディープビリーフネットワーク

# 8.9 ディープボルツマンマシン

# 8.10 性能比較

# まとめ
- ボルツマンマシン
    - 無向エッジで結ばれた構造
    - ネットワークの挙動を確率的に記述出来、データの生成モデルとして利用される
- 制限ボルツマンマシン（RBM）
    - 隠れ変数を含むボルツマンマシンの一種
    - 可視変数のユニットと隠れ変数のユニット間のみ結合があり、可視変数のユニットどうし、あるいは隠れ変数どうしは結合を持たない
- ディープビリーフネットワーク（DBN）
    - ユニットを層上に並べ、最上位層のみ層間を無向エッジで結び、それ以外の層間は下向きの有向エッジで結んだ構造
- ディープボルツマンマシン
    - ディープビリーフネットワーク（DBN）の有向エッジをすべて無向エッジで置き換えた構造のボルツマンマシン=RBNを積み重ねたもの
Elastic Beanstalkの環境変数の一部をEncrypted secretに置き換える


# 概要
AWS Elastic Beanstlak （以下EBS）でRailsを起動する時の環境変数をRails 5.1で新たに導入されたEncrypted secretを使った仕組みに変更する

# 環境
* Rails 5.1.2
* AWS Elastic Beanstalkデプロイ済（参考拙記事「[（個人的まとめ）よく使うflexboxの設定](http://qiita.com/junara/items/dd9f34a4f2baccf58b89)」）

# 手順
## Raisl：encrypted secretのセットアップ
* [Rails 5.1のencrypted secretsの運用について考える](http://qiita.com/kikunantoka/items/dd22cf51071b93ba5b62)の通り

## Rails：環境変数を編集する
置き換える前にAWSで設定していた環境変数は以下の6つ
* SECRET_KEY_BASE
* RDS_DB_NAME
* RDS_USERNAME
* RDS_HOSTNAME
* RDS_PASSWORD
* RDS_PORT

### database.ymlを編集する

```config/database.yml
production:
  <<: *default
  adapter: postgresql
  database: <%= Rails.application.secrets.rds_db_name %>
  username: <%= Rails.application.secrets.rds_username %>
  password: <%= Rails.application.secrets.rds_password %>
  host: <%= Rails.application.secrets.rds_hostname %>
  port: <%= Rails.application.secrets.rds_port %>
```

### secrets.yml.encを編集
secrets.ymlは暗号化されて保存される必要があるため、直接ファイルを開いて編集する事が出来ないので、下記のようにrailsのコマンドを経由して編集する。（以下はatomで編集するときの例）

```console
EDITOR="atom --wait" bin/rails secrets:edit
```

atomで開いた後、下記の通り編集して保存する。


```config/secrets.yml.enc
# See `secrets.yml` for tips on generating suitable keys.
production:
  secret_key_base: 6fawijfoaijea96181ajwejfaokw111jfpwpw93232a004330ecd91fafiweof29321541e2bbf35ca5502dfd7675b28fwj93jfjw992joijaf9w1aa41d（Railsのシークレットキーのベース）
  rds_db_name: ebdb（RDSのデータベース名）
  rds_username: username（RDSのユーザー名）
  rds_hostname: a9fsfswowp12.ksj9js2s.ap-northeast-1.rds.amazonaws.com（RDSのホスト名）
  rds_password: diwdLsLdww926tdiw91ksq（RDSのパスワード）
  rds_port: 5432（RDSのポート番号）

```


### secrets.ymlを編集

secret_key_baseは `config/secrets.yml.enc` から読み取るので `config/secrets.yml` の該当箇所を削除

```config/secrets.yml
#production:
#  secret_key_base: <%= ENV["SECRET_KEY_BASE"] %> ここを削除する

```

## EBSの環境変数を編集する

### Rails：secrets.yml.keyの文字列をコピーする
secrets.yml.keyを開いて文字列をコピーする

```config/secrets.yml.key
11212kjiu9u9jafwajeifwjaefafaf
```

### AWS：Environment Properties
1. EBS→Configuration→Software Configuration→Environment Propertiesを開く。
2. `secrets.yml.enc` に移した環境変数を削除する。
3. Property Nameに `RAILS_MASTER_KEY` を追加する。この環境変数により、暗号化された `secrets.yml.enc` を解除することができる
4. Property Valueに secrets.yml.keyの文字列を追加する

* 設定例

[![https://gyazo.com/642bd2de9e1c9fee92d64f5f3f3807d6](https://i.gyazo.com/642bd2de9e1c9fee92d64f5f3f3807d6.png)](https://gyazo.com/642bd2de9e1c9fee92d64f5f3f3807d6)

ApplyしてEBSに設定を反映させる。

以上。
node-red でプログラムの　インポート、イクスポート

インポートするプログラムは、
.node-red/lib/flows に　置きます。

```json:.node-red/lib/flows/http01.json
[
  {
    "id": "e0046ab2.11aec",
    "type": "http in",
    "z": "d3c92838.0aca08",
    "name": "",
    "url": "/testa",
    "method": "get",
    "upload": false,
    "swaggerDoc": "",
    "x": 100,
    "y": 150,
    "wires": [
      [
        "15433e15.724bda"
      ]
    ]
  },
  {
    "id": "15433e15.724bda",
    "type": "template",
    "z": "d3c92838.0aca08",
    "name": "",
    "field": "payload",
    "fieldType": "msg",
    "format": "handlebars",
    "syntax": "mustache",
    "template": "Hello!<br />\n本日は晴天なり<br />\n<blockquote>\n    Jul/16/2017 PM 14:58<p />\n</blockquote>",
    "output": "str",
    "x": 250,
    "y": 150,
    "wires": [
      [
        "e70a7bef.77fcf"
      ]
    ]
  },
  {
    "id": "e70a7bef.77fcf",
    "type": "http response",
    "z": "d3c92838.0aca08",
    "name": "",
    "statusCode": "",
    "headers": {},
    "x": 400,
    "y": 150,
    "wires": []
  }
]
```

node-red で、
読み込み -> ライブラリ -> http01
で読み込むと、

![node-red_jul1601.png](https://qiita-image-store.s3.amazonaws.com/0/179446/21c20ab4-8c8b-7602-0e89-4e43285f2b29.png)

これを、実行して、ブラウザーで
http://127.0.0.1:1880/testa/　にアクセスします。

![node-red_jul1602.png](https://qiita-image-store.s3.amazonaws.com/0/179446/12944b2a-7647-6475-758f-a726b2d9d4ef.png)

プログラムを変更して、イクスポートするには、

編集をして、デプロイする前の状態で、書き出すノードを選び、
書き出し -> ライブラリ　とすすみます。

![node-red_jul1603.png](https://qiita-image-store.s3.amazonaws.com/0/179446/e15701b6-fbd2-fa02-767e-6d7d8d4d7c47.png)

.node-red/lib/flows に *.json という形で書き出されます。
React-NativeアプリをAppetizeで公開してみた

React-Nativeで作成したiOSアプリをAppetizeで公開するまでの、「私はこうやったらうまくいきました」を共有します。

# 進め方
[このブログ記事](https://medium.com/@callMeNorm/prototyping-react-native-with-appetize-io-752f6d303668)にしたがって進めましたが、jsbundleを作るコマンドだけちょっとやり方が違います。
（記事通りだとうまくいかなかったので...）


私自身も初心者なので、やり方に誤りがあったら教えてくださると幸いです。
* ちなみに[公開したもの](https://appetize.io/app/gmamdjy9k0vmmpc4468cg5q07r?device=iphone7&scale=75&orientation=portrait&osVersion=10.3)
* [↑のソース](https://github.com/hiroga-cc/cosodate)

# 実際の手順

1. Xcodeで[アプリ名].xcodeprojを開いてから、Build Schemeを"Release"に変更します。
「Product」>「Scheme」>「Edit Scheme」>「Run」で、
Build Configurationを"Release"に変更してください。


2. オフラインバンドルを作成します。
普段simulatorでデバッグしているときはPC上でJavaScriptを実行するサーバーを立ち上げていますが、
アプリをリリースする場合(今回のようにAppetizeにソースコードを送る場合も)、アプリ自体にjsのソースコードを含める必要があります。
以下のコマンドでjsbundleを作成します。

3. アプリが参照するJavaScriptのコードを、オフラインバンドルに変更します。
ios/[アプリ名]/AppDelegate.mをエディタで開き、以下の通りアンコメント/追記します。

```
// jsCodeLocation = [[RCTBundleURLProvider sharedSettings]jsBundleURLForBundleRoot:@"index.ios" fallbackResource:nil];
jsCodeLocation = [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"];
```

4. 再びXcodeに戻り、Product > Cleanしてから Product > Buildを実施します。

5. Buildした.appフォルダをzip化し、Appetizeにアップロードします。
[アプリ名].appは、
[ホーム]/Library/Xcode/DerivedData/[アプリ名(+アルファベットの文字列?)]/Build/Products/Release-iphonesimulator/[アプリ名].app
にあります。

![Screenshot 2017-07-16 15.54.49.png](https://qiita-image-store.s3.amazonaws.com/0/96286/e0893a6d-0975-6958-7033-bd10aabf29de.png)



# まとめ
以上、React-NativeアプリをAppetizeに公開するまでの手順でした。
ご指摘あればぜひお願いいたします。
[webpack]reactのプロジェクトにcss-modulesの導入

```
You may need an appropriate loader to handle this file type.
```

こんなエラーに出会ったので、対処方法を書き残します。


css-loaderををプロジェクトにインストールする。

```
npm install --save-dev css-loader
```

`webpack.config.js`に書き加える

```diff
var webpack = require('webpack');
module.exports = {
  entry: {
    client: "./example/client.js",
  },
  output: {
    filename: '[name].js',
    path: __dirname  + '/public',
  },
  module: {
    rules: [
      {
        test: /\.js$/,
        exclude: /(node_modules|bower_components)/,
        use: {
          loader: 'babel-loader',
          options: {
            presets: ["es2015", "stage-0"]
          }
        }
-      }
+      },
+      {
+        test: /\.css$/,
+        use: ['style-loader', 'css-loader?modules']
+      }
    ]
  },
  resolve: {
    extensions: ['*', '.js', '.jsx'],
    modules: [__dirname, 'node_modules']
  },
};

```



ちなみに、`['style-loader', 'css-loader']`の順番が大事みたいで、`['css-loader', 'style-loader']`の順で書くとビルドできない。

```
Module build failed: Unknown word (5:1)

  3 | // load the styles
  4 | var content = require("!!./child.css");
> 5 | if(typeof content === 'string') content = [[module.id, content, '']];
    | ^
  6 | // Prepare cssTransformation
  7 | var transform;
  8 |
```
Cakephp3 | formをajaxでpostして、別のformを新しくビューに返す方法

## 何がしたかったか
セレクトボックスで選択した値によって、ビューに出力されるフォームを変えたかった。

## 実装
まず、もとのフォームは以下のようにFormhelperを使って書く。このとき、ajaxでポストしたいデータはselectフォームの[name='test']のバリューのみ。Form->createでは'url'オプションをfalseにすることにより、デフォルトのコントローラー/アクション設定を無効化できる。ここで、あとでajaxでformを識別できるように、idを絶対につけとく。

```php:/view.ctp
<?php echo $this->Form->create(null, [
	'class' => 'form-inline',
	'id' => 'test-form',
	'url' => false
]); ?>

<?php echo $this->Form->select('test', $options, [
	'class'=> 'form-control'
]); ?>

<?php echo $this->Form->button('選択', [
	'class' => 'form-control',
]); ?>

<?php echo $this->Form->end(); ?>

// 新しく追加したいフォームをロードできるhtmlエレメント（divとかtbodyとか）を用意しとく。
<div id="new-form">
</div>
```

次に、このフォームからのデータをcontrollerへポストするjsコード。
jqueryに用意されてるloadコマンドでcontroller側でrenderされたビューを選択したdivに表示してくれる。

```js:ajax.js
$(function() {
    $('#test-form').on('submit', function(){
        // ここでポストされたtestのバリューを取得。
        var test = $('[name="test"]').val();

        // ここでajaxでcontroller/actionにtestをpost。
        // renderされたビューをnew-formにロードする。
        $('#new-form').load("/controller/test", {
          test : test
        });
    });
});
```

コントローラー/アクションは以下のような感じ。

```php:/controller
public function test() {
   if($this->request->is('post')) {
        // ここで、postされたselectフォームの「test」に対応する値を取得。
        $test = $this->request->getData('test');

        // $testを使って色々計算して、$varを導く。
        // この$varを次に出力するフォームに投げたい。
        $var = ...
        $this->set(compact('var'));
        $this->render('Element/test_element', 'ajax');
   }
}
```

出力されるフォームはelementに書いといて、必要な変数を設定したあと、それをrenderすればよい。
例えば、renderしたいelementは以下のようにフォームだけを書いとく。

```php:/Elements/test_element.ctp
<?php if ($var) {?>
  <div>
     // $varを使って新たなフォームのビューをつくる
  </div>
<?php } ?>
```


以上のような構成で、ある一つのフォームで選択した値によって、また新たなフォームを出力できるようになる。