OmniAICreator/Qiita-1.07M huggingface dataset:
【bash】`!-n$`ができるってそれもっと早く教えてよ！

`!-n`と`!$`は習ったしよく聞くけど、`!-n$`とかできないかなーできたらいいなーでも聞いたことないし、そんなニッチ(?)なのないかなーって思ってたけど、
*試しにやってみたらできたよ！！！*

# ちゃんとした説明
bashの組み込みコマンド`history`に付随する機能として、
以下は割と有名で説明されてる記事も多いかと思います。

1. `!-n`で「n回前の実行履歴」を参照できる(例：`!-2`で2回前)
2. `!$`で「直前の実行履歴の最後の引数」を参照できる
    * `$`の代わりに`^`で最初の引数を参照できる
    * `$`の代わりに`*`ですべての引数を参照できる

この2つを合わせた感じで、
`!-n$`で「n回前の実行履歴の最後の引数」を参照することもできるのです！！！

例：

```sh
$ echo hoge0
hoge0
$ echo hoge1
hoge1
$ !-2   # 2回前のコマンドを実行
echo hoge0
hoge0
$ echo hoge2
hoge2
$ echo !$   # 直前のコマンドの最後の引数を参照
echo hoge2
hoge2
$ echo hoge3
hoge3
$ echo !-2$ # 2回前のコマンドの最後の引数を参照
echo hoge2
hoge2
```

# これを機会に`man bash`を読んでみたよ
* `!-n:x`で「n回前の実行履歴のx番目の引数」を参照できる
* `!-n:x-y`で「n回前の実行履歴のx番目からy番目の引数」を参照できる
* `!-n:0`で「n回前の実行履歴のコマンド(引数なしのコマンド名単体、ということ)」を参照できる
* 【重要】 最後に`:p`をつけると展開結果が表示されて、かつ最新の履歴に追加されるので、 **確認してから** `!!`や上矢印で **実行することができる**

--------------------

構文としては、以下のようになっています。
`! {実行履歴(event)指定部} [ : {参照対象(word)指定部} ] [ : {修飾部} ]`

* 参照対象指定部が*記号系*だと区切り文字の`:`が省略できる
  * その結果、`!-n$`で「n回前の実行履歴の最後の引数」ということになる
* 実行履歴指定部を省略すると直前の実行履歴が対象となる
  * その結果、`!$`で「直前の実行履歴の最後の引数」ということになる

# おわりに
* 「こんなん常識じゃん┐(´ｰ｀)┌ 」と思っても、1年前まではwinサーバー向けに開発していた者ですのでお許しください:bow:
    * 記号系がぐぐらびりてぃが低いのが悪い()
* `man bash`を読むのは大変だけど、`history`以外の部分も勉強になりました:grinning::sparkles:

# 参考
* [シェルのコマンド履歴から再利用、のいろいろ - 元RX-7乗りの適当な日々](http://d.hatena.ne.jp/rx7/20090225/p1)
    * 古い記事ですが、各記法・各オプションの日本語版が掲載されています
    * 本記事で紹介したもの以外にもたくさん機能があるので1回くらいは目を通してみるといいかもしれません

--------------------

`!#`については別途記事にしました
→[【bash】ヒストリ機能での`!#`の使い途](https://qiita.com/kitoo/items/d99dcd63d679c5f8f17e)
DVBv5ツールを使用してチャンネルスキャン

# 概要
v4l-utilsのdvb関連のソースコードとDVBドライバのソースコードを読んでいたら、ARIB-STD-B24対応のgconvも入っているしDVBv5のツールはISDB-TとISDB-Sに対応しているみたいなので、実際にチャンネルスキャンを試してみました。
結論から言うと、v4l-utilsをちょっと改造しましたが成功しました。

# 動作環境
| 項目 | 詳細 |
|:-:|:-:|
| OS | Gentoo Linux  |
| Kernel  | 4.4.26-gentoo |
| DVBドライバ | Kernel標準/LinuxTV |
| チューナ | PT2/PT3 |

# 準備
標準のv4l-utilsとチャンネルスキャン用の改造版v4l-utilsをビルドし、標準版ではARIB-STD-B24対応のgconvがインストールされないので、改造版の方でインストールします。

```
# emerge =v4l-utils-1.10.1
# git clone https://github.com/KouCo/v4l-utils-jp
# cd v4l-utils-jp
# ./bootstrap.sh
# ./configure --disable-doxygen-doc --disable-doxygen-dot --disable-libv4l --disable-v4l2-compliance-libv4l --disable-v4l2-ctl-libv4l --disable-qv4l2 --enable-gconv --without-jpeg
# make
```
ARIB-STD-B24対応のgconvをインストール

```
# cd contrib/gconv/
# make install
# echo "GCONV_PATH=/usr/local/lib/gconv" > /etc/env.d/99gconv
# env-update
# source /etc/profile
# cd ../../../
```


# チャンネルスキャン
標準のv4l-utilsのdvbv5-scanでもチャンネルスキャンは可能でしたが、ISDB-S用のイニシャルファイルを書くのが大変だったので、改造した方のdvbv5-scanを使用します。

- イニシャルファイルのダウンロード

```
# git clone https://github.com/KouCo/dtv-jp-tools
```
- 地上波 チャンネルスキャン

```
# ./v4l-utils-jp/utils/dvb/dvbv5-scan -C JP -a 1 -o ./isdbt.conf ./dtv-jp-tools/dtv-scan-tables-jp/jp-ISDBT-ALL
```
- BS チャンネルスキャン

```
# ./v4l-utils-jp/utils/dvb/dvbv5-scan -C JP -a 0 -N -T 5 -o ./isdbs-bs.conf ./dtv-jp-tools/dtv-scan-tables-jp/jp-ISDBS-BS
```
- CS チャンネルスキャン

```
# ./v4l-utils-jp/utils/dvb/dvbv5-scan -C JP -a 0 -N -T 5 -o ./isdbs-cs.conf ./dtv-jp-tools/dtv-scan-tables-jp/jp-ISDBS-CS
```
YAML 基本記法まとめ

# 概要

最近YAMLファイルで書かれている設定ファイルを目にする機会が増えた為、
最低限の記法だけまとめてみた。

# YAMLの基本

## YAMLの概要
- 構造化されたデータの表現記法。
* フレームワーク・ツールの設定ファイルに利用されている。
* Ruby関連の設定ファイルでよく利用されている。
- 拡張子は.ymlが使われる事が多い。
* Ruby側では‘yaml’をrequireでYAML関連の命令が使える様になる。
* YAMLではデータ構造を自動で判別してくれる。
	* “”などをつけると強制的に型を変換できる。
* \#でコメント可能

## YAMLが扱えるデータ構造

### スカラー(値)
- 文字列
	* hello
	* fujimoto
* 数値
	* 2
	* 3
	* 32.5
* 真偽値
	* true/false
	* yes/no
	* on/off
* NULL
	* null
	* ~
* 日付
	* 2015-07-08

### シーケンス(配列)
- ハイフン(-)に引き続きスカラーを記載する。(ブロックスタイル)
	* -の後ろにはスペースが必要
* インラインで[ ]で記載も可能(フロースタイル)
* 入れ子で記載も可能
	* 字下げは1文字以上の空白(tabは不可)
	* シーケンスを利用する際は、空白のシーケンスを利用する。
### マッピング(ハッシュ・連想配列)
- コロン(:)でkey/value形式で利用する。(ブロックスタイル)
	* :の後ろにはスペースが必要
* インラインで{ }で記載も可能(フロースタイル)

## 改行を含むデータ
- |
* >
- 改行記号の後に、+や-で最後の改行のあるなしを設定したりできる。

## アンカーとエイリアス
- &
	* アンカー
	* 変数を定義するイメージ
* *
	* エイリアス
	* 変数を利用するイメージ

## ハッシュのマージ

- <<でマージできる

```yaml:data.yml
common: &common
  user: dbuser
  password: password

development:
  database: myapp_dev
  <<: *common
production:
  database: myapp_prod
  <<: *common
test:
  database: myapp_test
  <<: *common
```	

## 複数のデータを解釈する
- 1つのファイルで複数のデータを解釈させる。
	* データの初めを---
	* データの終わりを…
		* …は省略可能

```ruby:index.rb
require 'yaml'

# 1ファイル1データを読み込む
datas = YAML.load_file('data.yml')
p datas

# 1ファイルで複数のデータを読み込む
File.open('data.yml') do |io|
  YAML.load_documents(io) do |d|
    p d
  end
end
```

```yaml:data.yml
---

- a
- b
- c

---

- 1
- 2
- 3
```

## Rubyのto_yaml
- Rubyの変数をYAMLで変換する事が可能。
Serverless v1.2 の変更履歴


ドキュメントを見ながらまとめただけのものなので、動作確認等未検証。間違っている箇所等あれば私的もらえると助かります。

個別の機能等は別途利用しながら、色々知見がまとまったら個別に記事にします。

## Serverless v1.2

v1.2 のリリースノートはこちら

https://github.com/serverless/serverless/releases/tag/v1.2.0


## Lambda environment variables support

v1.2 から環境変数のサポートが追加されています。

````
# serverless.yml
service: service-name
provider: aws

functions:
  hello:
    handler: handler.hello
    environment:
      TABLE_NAME: tableName
````

environment セクションに記述すれば…とのことです。Version 管理可能な注入項目…とかで使うといい感じかもです。

https://github.com/serverless/serverless/blob/master/docs/providers/aws/guide/functions.md#environment-variables


## Load Serverless variables from javascript files 

Yaml ファイルの中からJSファイルを参照可能になりました。

```
// myCustomFile.js
module.exports.hello = () => {
   // Code that generates dynamic data
   return 'rate (10 minutes)';
}
```

```
# serverless.yml
service: new-service
provider: aws
functions:
  hello:
      handler: handler.hello
      events:
        - schedule: ${file(./myCustomFile.js):hello} # Reference a specific module
```


https://github.com/serverless/serverless/blob/master/docs/providers/aws/guide/variables.md#reference-variables-in-javascript-files

## Add support for setting custom IAM roles for functions

関数ごとにカスタマイズされたIAMロールを作成可能に？

サンプルは以下に掲載されていますが設定ファイルがすごいことになりそう…

https://github.com/serverless/serverless/blob/master/docs/providers/aws/guide/iam.md#custom-iam-roles


## Lambda environment variables support in Invoke Local 

`serverless.yml`にて定義された環境変数は invoke local でも反映されるみたいです。

## Tighter and secure permissions for event sources

詳細不明…
動くようにする、正しくする、速くする。

　今までに扱ったことの無い分野で新規開発をする場合、いろんな問題が出てくるだろう。そのようなときに、何をどうすればよいのか迷うことがあるだろう。そのようなときに、複数の課題があるときに、何をどの順序で解決していけばよいのか迷うこともあるだろう。

　私が心がけているのは、**「動くようにする、正しくする、速くする。」**の順序で物事の優先順位をもって考えてようにしていることです。この内容は何かの本で読んだことからきている。何かしら動かないうちは、正しくすることもできないし、正しくなっていないうちは、速くすることに意味がない。
　物事を解決する際に、全てのことが同時に解決することは少ない。
前に経験を積んだことのある分野の近くでは、動いて正解率もそれなりに高くて、メモリ消費や処理時間が少ないもの１回目の挑戦で作れることがあったりもするが、それは極めてまれなことだ。

1.　何かしら既存の技術をまねて、「動くようにする」のが最初だ。
2.　次に「正しくする」は、正解率を上げることかもしれないし、精度を向上させることの場合もあるだろう、ノイズや外乱の影響を受けにくく、ロバストにすることかもしれない。「正しくする」は、プログラムのバグをつぶすだけじゃない。そして、そのモジュールを使う中で適切であるのか、使われ方として正しくすることも必要だ。
3.　そして最後に、「速くする」が来る。
 「速くする」のは、いろんな方法がある。
　 - 高速なマシンを使う
　 - 予め計算済みの結果を持っておいて、それを利用する。
　 - 複数のコアを使って高速化する
　 - GPGPUを使う。
　 - 高速なマシンに処理を任せる。
　 - 画像の解像度を下げるなどしても性能の劣化がないことを確かめて使う。
　 - ボトルネックになっている部分のアルゴリズムを高速なアルゴリズムに置き換える。

　場合によっては、速くしないという選択もあるだろう。
たくさんの課題があって何から手をつけていいのか分からない人、とりわけPMには、「動くようにする、正しくする、速くする。」の言葉を贈りたい。


付記：
　「速くする」は、ソースコードを外部に開示できる場合には、外部の会社の力を借りて速くすることができる。「速くする」はソースコードが開示されていて、アルゴリズムがfixされていれば、それなりに速くする手はある。ソースコードをprofilleして、遅くなっているところを特定すれば、速くする方法はいくらでもある。for ループは OpenMPを使うことで速くすることができます。
　しかし、「動くようにする」と｢正しくする」は自分たちで何とかする必要がある。動いていないコードを、「動くようにしてくれ」と外部に発注することはできません。

付記：
　速くすることを優先して、正しくすることを後回しにしたときに生じることは、貴重な工数を無駄にしてしまうことになります。速くするために、縮小した画像を用いて処理時間を短縮することは容易に思いつくことです。しかし実装した後になって、精度的な理由で使い物にならないことが判明して使えなかったという経験をしたことがあります。
　正しくするために作成した自動化テストは、無駄になることは少ないように思います。

付記：
　ハードウェアで十分な計算資源を得て高速化するのが一番確実です。ハードウェアで高速化する場合には、アルゴリズムやソースコードが分かりにくくなることが防げます。また、アルゴリズムを簡潔なままにできるので、テストもしやすいものになります。
　ハードウェアを貧弱なままに高速化しようとするときには、アルゴリズム上の工夫が必要になります。そのことによって処理の見通しが悪くなって、ソースコードの可読性が低下しやすくなります。そのことで、テストもいっそうの注意が必要になります。



付記：
　どうやら、ケント・ベックの言葉のようです。

- [[プログラミング原則][Unix思想]最適化の原則](http://d.hatena.ne.jp/asakichy/20100601/1275356775)


次の記事でも、「動くようにする、正しくする、速くする。」の順序であることを述べています。
[GNUプロファイラーによるコード処理速度の向上]
(https://www.ibm.com/developerworks/jp/linux/library/l-gnuprof/)

# 追記(2025.4.23)
最近は、速くするためのコーディングが楽になった。
マルチコアのCPUでマルチスレッドで処理を高速化するのが特に楽になった。
コーディングを楽にするため、シングルスレッドのままのしてあるスクリプトが多数あった。
シングルスレッドで正しく機能しているものを、forループでの処理をマルチスレッドかするのが楽である。
複数のファイルに対する処理が、ファイルごとに処理をしても結果に影響がない場合、
マルチスレッド化するのが得策である。

for文で処理している範囲をChatGPTのたぐいに書き換えを依頼すれば、それっぽい書換ができる。
Serverless v1.1 の変更履歴


ドキュメントを見ながらまとめただけのものなので、動作確認等未検証。間違っている箇所等あれば私的もらえると助かります。

個別の機能等は別途利用しながら、色々知見がまとまったら個別に記事にします。

## Serverless v1.1

v1.1 のリリースノートはこちら

https://github.com/serverless/serverless/releases/tag/v1.1.0

## Rollback Support

任意のタイムスタンプでロールバックできる？

`serverless deploy list` でS3バゲットから一覧が表示できるらしい。

https://serverless.com/framework/docs/providers/aws/cli-reference/rollback/

## Log Groups in Cloudformation

以下を`serverless.yml`に追加するだけで CloudFormation がロググループを作成してくれるとのこと

現状のLogGroupを作成しない挙動は後々Deprecatedになるよ…とも書かれている。

````
provider:
  cfLogs: true
````

https://serverless.com/framework/docs/providers/aws/guide/functions/#log-group-resources

## Allow Services without functions

関数宣言のないシンプルな`serverless.yml`でもデプロイ可能にした？

## Clean up S3 Deployment bucket only after successful deployment

S3 バケットのクリーンアップが、デプロイ失敗時に動かなくなった？

## Allow Inclusion after Exclusion using ! Globs

`package.exclude` の指定に `!` が使えるようになったっぽい。

## Version Pinning for Serverless Services to only deploy with specified versions

serverless フレームワークのバージョンを固定できるようになった。

https://serverless.com/framework/docs/providers/aws/guide/services/#version-pinning

## Invoke local plugin

関数のローカル実行を可能に？

## Plugin template 

create コマンドで Plugin のテンプレートが作成可能に

https://serverless.com/framework/docs/providers/aws/cli-reference/create#creating-a-new-plugin

## Simple Plugins are now installable in subfolder of the service 

簡単なプラグインは`.serverless_plugins`ディレクトリを配置してそこに配置できるようになった。

https://serverless.com/framework/docs/providers/aws/guide/plugins#service-local-plugin
SketchUp Make v17 / Ruby > 直方体の大きさを指定のサイズ(mm)小さくする > v0.1-v0.2

```txt:動作環境
SketchUp Make v17.1.173
MacOS X El Capitan
```

直方体を小さくしたい。

「尺度ツール」では相対的な値で拡大縮小できるが、具体的なサイズ(mm)で拡大縮小したかった。
(ついでにRubyの勉強も)

## v0.1

```faceAnalysis161229.rb
require 'sketchup.rb'

def face_analyze()
	model = Sketchup.active_model
	my_selection = model.selection

	my_selection.each do |ent|
		if ent.is_a? Sketchup::Face
			print("face:",ent.normal,"\n")
		end
	end
end

def face_shrink(distance_mm)
	model = Sketchup.active_model
	my_selection = model.selection

	my_selection.each do |ent|
		if ent.is_a? Sketchup::Face
			xvec = ent.normal()[0]
			yvec = ent.normal()[1]
			zvec = ent.normal()[2]
			# 0.1: arbitrary (should be more than 0.0 and less than 1.0)
			if xvec > 0.1 or yvec > 0.1 or zvec > 0.1 then
				print("shrink\n")
				ent.pushpull(-distance_mm)
			end
		end		
	end
end
```

上記のスクリプトをRubyコンソールにて読込む。
(スクリプトの置き場所は[こちら](http://qiita.com/7of9/items/ff5921cf65b5f88d9311)参照)

```
> load "faceAnalysis161229.rb"
true
```

実行手順

1. 直方体を作る
   - 平面作成
   - プッシュプルツール
2. 直方体(グループ化してないもの)をトリプルクリックする
   - 6面が選択される
3. Rubyコンソールで「face_shrink(5)」を実行する。

以上で直方体の各方向で5mm小さくなる。


### サイズ変更前

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/9ae08bde-2d51-f17e-dd27-5a73bc7dca40.png)

### サイズ縮小後

下に置いている立方体をWidth, Depth, Heightに関して5mmずつ縮小してみた。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/ff2654af-3b3a-a12e-3a6e-18ab1b551308.png)


`face_shrink(-5)`だと5mmずつ拡大できる。

縮小サイズを失敗した時はCtrl+zを3回実行すれば元のサイズに戻る。

プッシュプルツール３回でも実行できるが、時間を短縮できる。

x,y,z各方向でサイズを指定できる方が使い勝手はいいかもしれない。

## v0.2

x,y,z各方向でサイズを指定できるようにした。

```faceShrink161229.rb
require 'sketchup.rb'

def face_shrink(dist_x_mm, dist_y_mm, dist_z_mm)
	model = Sketchup.active_model
	my_selection = model.selection

	my_selection.each do |ent|
		if ent.is_a? Sketchup::Face
			xvec = ent.normal()[0]
			yvec = ent.normal()[1]
			zvec = ent.normal()[2]
			# 0.1: arbitrary (should be more than 0.0 and less than 1.0)
			if xvec > 0.1 then
				ent.pushpull(-dist_x_mm)
			end
			if yvec > 0.1 then
				ent.pushpull(-dist_y_mm)
			end
			if zvec > 0.1 then
				ent.pushpull(-dist_z_mm)
			end			
		end		
	end
end
```
API ツールの2016年を振り返る（主に日本）

2016年のニュースからAPI ツールについて気になったものをピックアップしてみました。

１．APIgee をGoogle が買収
API 管理ツールの大手APIgee をGoogle が600億円超で買収。このニュースで「API 管理ツール」という言葉を初めて聞いた方も多かったのではないでしょうか。Google の開発力をもってしても、増え続けるSaas に対するAPI アクセスを提供する事業は、サードパーティで行うということが浮き彫りにに。大手によるAPI 管理、API 統一アクセスなどを提供するサードパーティの活用は一気に加速すると思われます。
http://jp.techcrunch.com/…/20160908google-will-acquire-api…/

２．IBM がAPI 管理の本格的マーケティングを展開
業界の巨人IBM が日本においてもAPI Connect 製品とBluemix によって、銀行から、製造・サービス業の幅広いAPI　エコノミーまで幅広くAPI ホスティング・活用にむけたマーケティングを展開。あらゆるメディアに「APIエコノミー」をキーワードに露出。多くの非ITの経営層の目にAPI が急速に浸透。市場の作り方はさすがです。

３．銀行APIが住信SBI 銀行を皮切りに本格化
https://www-01.ibm.com/common/ssi/cgi-bin/ssialias…
更新系を含めた本格的Open Banking API の時代を先取り。
API で外部サービスから振込などができるようになると、個人や企業の銀行の利用方法はどう変わるのか？3メガはこれからです。

４．PokemonGo の不正API が広く利用される
https://www.programmableweb.com/news/how-automated-attacks-pok%C3%A9mon-go-api-happened/elsewhere-web/2016/08/26
初めての実用ARアプリとして大人気となったPokemonGo　ですが、リリース当初は接続が悪かったですね。それもそのはず、実は不正に取得したAPI を使ったPokemon Locator のようなサービスがトラフィックの半数以上を占めていたとの報道も。
すぐにNiantic 側は不正API からのアクセスを禁止しました。
よくも悪くもAPI という言葉と利用方法がコンシューマーの目に入りました。

５．インフォテリアがCData と提携
http://www.cdata.com/jp/news/20160328-Infoteria.pdf
日本のETL/EAI ツールの最大手インフォテリア社とアメリカのCData Software がデータアダプターで提携。日本に共同出資会社を設立。（皆様のご支援ありがとうございます）

60以上のデータソースが新たにASTERIA の接続先として提供されます。これはWeb API へのアクセス機能をETL/EAI ツールが内包することを意味します。ユーザーの多くはサービス毎に異なるWeb API を自分で習得し利用することよりも、ETL/EAI、BI、帳票などのデータを扱うツールがネイティブに内包して提供してくれることを望んでいると言えるでしょう。今後のツール・サービスベンダーはいかに「API の難所を意識せずにAPI を利用してもらうか」を考えなければならないでしょう。

６．NRI がCA と提携
https://prtimes.jp/main/html/rd/p/000000021.000017027.html
これも海外のAPI ツール企業と日本の大手IT企業との提携ニュースです。

７．MS がMS flow でAPI連携サービス参入
https://flow.microsoft.com/ja-jp/
ハイレベルOffice ユーザーを意識したPoint-to-point 型のAPI 連携サービスにMS が参戦。Zapier, IFTTT など大変便利にAPI 連携ができるサービスの利用が盛り上がっておりますが、エンタープライズでも使えるサービスMS Flow が出てきました。YahooもMyThings で同様のサービスに参入。新しいパーソナライズされた連携サービスに期待です。

8．市場調査でAPI管理市場が80％の伸びと
https://www.itr.co.jp/company/press/161213PR.html
「API管理市場」が意識され始めました。市場はまだ小さいですが、年率80％と急成長中。
5年で5倍増するとの予測。
![APImanagement tool market.jpg](https://qiita-image-store.s3.amazonaws.com/0/116843/0ec544af-15d9-6146-6f19-dc2e603ad6e5.jpeg)


このように日本での2016年は、API関連ツールにとって大きなトレンド変化が起こった年だったと思います。これまでの各企業や各ツールベンダーがAPI 連携を手組で作り上げることを重視する文化から、サードパーティのツールを上手く利用してユーザーの期待に応える方向に変わってきたと言えます。

以上、徒然に印象に残ったニュースをまとめてみました。
SRM

|  | Easy | Med | Hard |
|:-:|:-:|:-:|:-:|
| [704](https://twitter.com/search?f=tweets&q=from%3Aogiekako%20since%3A2016-12-29%20until%3A2016-12-30&src=typd) | 構成ゲー、一番遠い頂点への長さがd[i]になる木 | x[0]*...*x[n-1] = v mod K になる x のパターン数 | 構成ゲー、ハミルトン路がｋ個になるグラフ |
|   |   |   |   |
|   |   |   |   |
Ubuntu16.04を、USBメモリからインストールする時にお困りの方々へ

## はじめに

※筆者はUbuntuはおろかLinuxに全く強くないです。
今回の対処法も「的外れ」「要領が悪い」といった部分が
多いかもしれません。ご指摘いただければ幸いです。

## 前提
インストールするOS：Ubuntu 16.04
ISOファイル：ubuntu-ja-16.04-desktop-amd64
ISOファイル入手先：https://www.ubuntulinux.jp/download/ja-remix
対象端末：VW770/W(NEC  たぶん2010年ぐらい製造？)

## 本文
「もう使わなくなったWindows端末にlinuxを入れてみるぞ！」と
息まいてるlinux初心者の方々。

WEB等でご参考にしているインストール手順は、下記のようなもの
ではないでしょうか？
1.linuxのイメージファイル(.iso拡張子)をダウンロード
↓
2.『UNetbootin』をにてUSBメモリにイメージファイルをインストール。
ブート用のUSBを作る。
(『ライブUSB』という単語があったが、専門用語かしら？)
↓
3.インストール対象の端末のBIOS設定のBootを開く。
  『USB Hard Disk』的なものを一番上にする。
↓
4.BIOS設定を保存して、インストール開始。

このような手順でしょうか？
上記の方法で、ちゃんとインストールできているなら、この記事は不要です。

。。。が、この方法でうまくいかない人。
もしかしたら、私と同じ部分で困っていませんか？

それは、『4』のインストール開始の部分です。
『UNetbootin』のメニュー画面のようなものが出て、
インストールを選択すると下記のような文字が出てくるかもしれません。

#### Not enough memory to load specified image

上記の文字列が出た後に「boot:」という文字列が出ます。
WEB上の先駆者は、ここで「boot:mem=2048M」と
メモリ確保をすることによって、解決していったようです。
皆様も上記対応で、解決されたなら、
これ以上読んでいただく必要はありません。

しかし、「mem=2048M」を入力して、Enterをたたいて下記のような
結果がかえってきた人も少ないながら、いらっしゃるのではないでしょうか？
#### Could not find kernel image: mem=2048M

なんかよくわかりませんが、「mem=2048M」という
カーネルイメージがないよ！！って言われているみたいですね。
ちなみに「mem = 2048M」などスペースをおいても
類似の文字列を出力して、結果変わらずでした。

## 対処法
いたって、シンプルです。下記のように変更しただけです。
『~~UNetbootin~~』⇒『Win32 Disk Imager』
入手先：http://sourceforge.net/projects/win32diskimager/

『Win32 Disk Imager』をインストールして、
『UNetbootin』と同じ要領でライブUSBを作成するだけです。
手順などは上記の1～4と変えておりません。
※『Win32 Disk Imager』で解凍・作成したISOファイルは
『UNetbootin』に比べてものすごい少ないですが、
それで問題ないようです。

## 結果
Ubuntu16.04が正常にインストールされました。

## 最後に
原因や、正当な対処法などがあれば
後学のために、ご教示いただければと思います。
pug+riot.jsでyieldを使う。

# まとめ


1. jadeじゃなくて、pugを使おう！
2. pugなら、「yield」は「yield.」・「yield(from="xxx")」・「yield(from="xxx")」で書ける！
3. pugはブラウザじゃなくてあらかじめwebpack等で変換！cdnはどこ？？？

# pugとriot.jsではyieldがキーワード。

ということで、うまく使えない。らしい。

```jade
my-tag
  #{'yield'}
```

とかエスケープすればいいらしい。意味なくない？riotするためのyieldしか使わないのに。
ならば、ということでいろいろやって解決したのですが、**実は、**それは、pugじゃなくて、jadeの時のお話だったもよう。
現在のpugであれば、

```jade
my-tag
  yield(from="header")
  yield.

my-tag2
  yield(to="header")
    span HEADER
  span CONTENT
```

という風に「yieldのみの行」でなければ、キーワードではなくタグと認識されます。
yield.であれば、script.のときと同じノリなので、十分許容範囲に思えます。

＃せっかく、pug-html-loaderを直して、pug-pluginも作ったのに。

## 愚痴：pugのcdnがない！

仕方がないので、npmしたpugをbrowserifyしてみたものの落ちる。
Consoleを見ると、以下のような情報が出ている。

```
Uncaught TypeError: Cannot read property 'split' of undefined
````

ソースは、こんな感じだから、nodeがないんだろうね.....

```js
var current = process.versions.node.split('.');
```

で、この処理は、requireで以下のような呼び出しで呼ばれている。

```
pug->pug-filters->./lib/run-filter->resolve->./lib/core
```

pug-filtersが呼ばれないようにすればいいのかな？と思って、package.jsonで、以下のように自分のファイルに差し替えようとしても、うまくいかない。
＃これは、変な気がするけど、いろいろやったものの、解決できず......

```json
  "browser": {
    "pug-filters": "./pug-filters.js"
  },
```

あきらめて、node_modules/pug/package.jsonの方で、上記の内容を持っていくとうまくいく。
で、これでできたpug.jsを使ってやると、「yield.」とかの記述でもうまく通った。
stack runghcでtestを実行する

:point_down: こういう実装と、

```haskell:src/FooImpl.hs
module FooImpl where

foo :: Foo -> Bar
foo = ...
```

:point_down: こういうテストがあったとする。

```haskell:test/FooImplSpec.hs
module FooImplSpec (main, spec) where

import           Test.Hspec

-- 個別のspecファイルを実行するためにはmainが必要。
main :: IO ()
main = hspec spec


spec :: Spec
spec = do
  describe "foo" $ do
    it "returns bar" $ do
      foo bar `shouldBe` foobar
```

これまでテストを実行するときは `stack test` などとしていたが、コンパイル遅いし（特にリンカーの実行が遅い）、TDDするには不都合で冗長だった。記憶が正しければ自動で`-O1`がかかるので、これも素早くテストの実行を繰り返したい場合は邪魔だろう [^fast]。

追記: どのみちリンカーは実行されているので、めちゃめちゃ速くなっているかと言えば微妙な気がしてきた。 :sweat:
まぁ、stackでテストを実行する方法の紹介にもなっているのでいいとするか。 :innocent:

[^fast]: 単に最適化をオフにしたい場合は `--fast` を渡せばいいらしい。

そこで確実にインタープリターで実行できるよう、`stack runghc`で個別のテストを実行する方法を調べてみた。

あらかじめ :point_down: で依存するパッケージをインストールした上で

```bash
$ stack test --only-dependencies
# コマンドの内容に反して、実際には依存関係のインストールしか行わない。
# 「依存パッケージのテスト全部実行されちゃったらどうしよう！？」みたいな心配は不要。
```

:point_down: のように実行すればよい。

```bash
$ stack runghc --package <作成中のパッケージ名> test/FooImplSpec.hs
```

自分自身のパッケージを指定しておくのがポイント。
しなければ「`FooImpl`なんてmoduleないぜ？」と怒られてしまう。

当然、`runghc`なんで、残りの引数を渡せば実行するexample(`it`)を絞ることもできる。

```bash
$ stack runghc --package <作成中のパッケージ名> -- test/FooImplSpec.hs --match "実行したいexample"
#                                            ^^^^^^
# 「--」を挟まなければ`test/FooImplSpec.hs`ではなく`stack`にオプションが解釈されてしまう恐れがあるので注意。
# この辺の仕様はほかのCLIツールを見習ってもうちょっと柔軟にしてほしい気もする。
```

なお、[hspecに渡せるその他のオプションについてはこちら](http://hspec.github.io/running-specs.html)を参照。

元の`stack test`で使えた`--file-watch`オプションと同等なことをしたい場合は[watchexec](https://github.com/mattgreen/watchexec)などのほかのツールを使おう。

なお、:point_up: みたいなテストが含まれるひな形は[stack-templates](https://github.com/commercialhaskell/stack-templates)の[hspec.hsfiles](https://github.com/commercialhaskell/stack-templates/blob/master/hspec.hsfiles)にあるので、すぐに試したい場合は

```bash
$ stack new <作りたいパッケージの名前> hspec
```

と実行すればよい。
クリスマスプレゼントに ErgoDox EZ Special Holiday Edition が届いた！

クリスマスプレゼントにErgoDox EZ Special Holiday Edition が届いたので、
自分好みにチューニングします。
10月に購入をしてから2か月、待望のErgoDox EZデビューです。

12月20日を超えても発送がされず、25日に間に合うのかとハラハラしていましたが、発送されたら3日ほどで届きました。
ちなみに関税には、1,100円かかりました。

[ErgoDox EZ White Bundle: Snow and Shine | ErgoDox EZ](https://ergodox-ez.com/products/snow-and-shine)

[はてなブックマーク - ErgoDox EZ White Bundle: Special Holiday Edition | ErgoDox EZ](http://b.hatena.ne.jp/entry/s/ergodox-ez.com/products/special-holiday-edition)

※ 購入後少ししてから、本家サイトから「Special Holiday Edition」の文字が消え、Snow と Shine の表記となっています。

七色の後光が無いSnowモデルを購入しました。

# デフォルトキーマップ

デフォルトのキーマップはこのようになってます。

![image](https://qiita-image-store.s3.amazonaws.com/0/112834/3e830016-f835-ba8a-96d0-c86191905633.png)

[Our Open-Source Firmware | ErgoDox EZ](https://ergodox-ez.com/pages/our-firmware)

デフォルトでは0~2の3レイヤーが設定されています。
Layre0: ベース
Layre1: 記号
Layre2: マウス・メディア

レイヤーの切り替え方については下記のサイトが丁寧で分かりやすいです。

[ErgoDox EZキーボードのレイヤーの切り替え方法について【初心者向け】 - 道玄坂学徒の議～公務員を辞めてニートへ～](http://www.dogenzakagakuto.com/entry/9316110)


#キーマップの変更

**Layout configurator** を使ってブラウザから簡単に変更することもできます。
[ErgoDox EZ Configurator](http://configure.ergodox-ez.com/keyboard_layouts/new)
`Clone and modify this layout` をクリックすると、編集できるようになります。
設定したキーマップはチートシートとして印刷もできます。

使い方はこちらのサイトの動画を参照してください。
[Our Graphical Keyboard Configurator | ErgoDox EZ](https://ergodox-ez.com/pages/graphical-configurator)

しかし、上記サイトで設定できるキーマップは英語配列のため、
日本語のOSでは日本語配列と認識されるため、キーマップ通りに入力できないようです。
　(例： Layre1の `@` は `"` と入力されます）

その場合は `Teensy` などを使って設定します。
[ErgoDox EZのキーマップを変更する - Qiita](http://qiita.com/ReSTARTR/items/f84f8f3c4c51c876cb2f)

# おわりに
キーマップの変更は冬休みの宿題としてやろうかなと思います。
むしろ、やらないと仕事で使えないので頑張ります。
Azure Linux Data Science Virtual Machineの環境構築①-VM/OS編

# Azure Linux Data Science Virtual Machineの環境構築①-VM/OS編
Azure環境でデータ分析的なことをやろうとしていたところ、最初から色々なツールが入っているAzure Linux Data Science Virtual MachineというVMを発見したのでこれを使ってみることにしました。その際に行った設定等を纏めておきます。VMの詳細については以下のページに書いてあります。
[Linux および Windows 用のクラウド ベースのデータ サイエンス仮想マシンの概要](https://docs.microsoft.com/ja-jp/azure/machine-learning/machine-learning-data-science-virtual-machine-overview)

## VM作成
Azureのポータルから行います。SSD/HDD、インスタンスタイプの選択は適当なものを選択します。OSはCentOS7です。本当はUbuntuが良かったんですが。
![image](https://qiita-image-store.s3.amazonaws.com/0/139616/e2d131e7-119d-f10b-84a4-96a0e2214573.png)
ディスク容量はあらかじめ決まっていて、この段階では変更できないようです。デフォルトではdev/sda1の容量は約52GBでした。

## 固定IPの設定
再起動の度にIPが変わるのは面倒なので、固定IPの設定も行っておきます。
作った仮想マシンの概要でパブリックIPの部分をクリックすると、以下のように設定できます。
![image](https://qiita-image-store.s3.amazonaws.com/0/139616/4619d3dc-1a99-d350-d604-59879f39156a.png)

## OSディスクの拡張
ディスクの拡張をする場合は、こちらの手順の通りに行うことができました。
 [Azure仮想マシンのOSディスク容量を拡張する(CentOS 7編)](http://qiita.com/yotan/items/30c973814537ea45f452)
ありがとうございます。

## リモートデスクトップの導入
こちらの「X2Go クライアントのインストールと構成」の通りに設定を行います。
[Linux データ サイエンス仮想マシンのプロビジョニング](https://docs.microsoft.com/ja-jp/azure/machine-learning/machine-learning-data-science-linux-dsvm-intro)

## 日本語化
1. 日本語関連のパッケージをインストールします。
```sudo yum -y install ibus-kkc vlgothic-*```

2. システムの文字セットを変更します。
```sudo localectl set-locale LANG=ja_JP.UTF-8```
```source /etc/locale.conf```

3. 入力ツールをインストールをします。
```sudo yum groupinstall -y "Input Methods"```

4. X2GOで日本語入力を行う場合は、ウィンドウ右上のキーボード設定で日本語-Kana Kanjiを選択します。
![image](https://qiita-image-store.s3.amazonaws.com/0/139616/6e5f3f4c-0865-dce2-62a1-c469eefb4087.png)

## まとめ
以上で、GUIを使って日本語環境で作業をすることができるようになりました。
次回はPythonの設定まわりについて書きます。

## 参考ページ
[Azure Virtual Machines 上にデプロイした OpenLogic CentOS 7.1 を日本語化、RDP 経由でアクセスする](http://kogelog.com/2016/03/01/20160301-01/)
[CentOS 7 : 日本語環境にする](https://www.server-world.info/query?os=CentOS_7&p=japanese)
[参考メモ/minimal installしたCentOS7にXfce4 + ibus-kkcで日本語入力可能にする](http://qiita.com/msakamoto_sf/items/bf2e37b22ae6694440c3)
SketchUp Make v17 / Ruby > 直方体のfacesのnormalを表示する

```txt:動作環境
SketchUp Make v17.1.173
MacOS X El Capitan
```

直方体のfacesのnormalを取りたい。
その情報を使って各面に対してプッシュプルをしたいが、今回はとりあえずnormalを取るまでとする。

参考 http://ruby.sketchup.com/Sketchup/Face.html

```faceAnalysis161229.rb
require 'sketchup.rb'

def face_analyze()
	model = Sketchup.active_model
	my_selection = model.selection

	my_selection.each do |ent|
		if ent.is_a? Sketchup::Face
			print("face:",ent.normal,"\n")
		end
	end
end
```

上記のスクリプトをRubyコンソールにて読込む。
(スクリプトの置き場所は[こちら](http://qiita.com/7of9/items/ff5921cf65b5f88d9311)参照)

```
> load "faceAnalysis161229.rb"
true
```

実行手順

1. 直方体を作る
   - 平面作成
   - プッシュプルツール
2. 直方体(グループ化してないもの)をトリプルクリックする
   - 6面が選択される
3. Rubyコンソールで「face_analyze()」を実行する。


下図の左側（矢印で示した直方体）を選択してみた。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/02844b59-1d61-815d-1d02-58aad44cc2d8.png)


```txt:結果
> face_analyze()
face:(0.0, -1.0, 0.0)
face:(-0.0, -0.0, 1.0)
face:(0.0, 0.0, -1.0)
face:(-1.0, 0.0, 0.0)
face:(1.0, -0.0, -0.0)
face:(-0.0, 1.0, -0.0)
#<Sketchup::Selection:0x007fe48d5b7ad8>
```

上、下、左、右、手前、奥、方向のnormalが取れていそう。
redashのAPIエンドポイント一覧とリクエストメソッド

## redashのAPIエンドポイント一覧
[redashのAPIエンドポイント一覧](https://github.com/getredash/redash/blob/8b73a2b135aed8fcbca139380a959b9222ae0080/redash/handlers/api.py#L40)

redashはAPIを提供してくれているのでGoogleAppsScriptなどからデータ取得するのに便利です。
ただ、実はドキュメントに書かれていないAPIエンドポイントがたくさんあります。

## クエリ結果を更新するAPI

```#redash/handlers/api.py
api.add_org_resource(QueryRefreshResource, '/api/queries/<query_id>/refresh', endpoint='query_refresh')
```

[キャッシュされているクエリ結果を更新するAPI](https://github.com/getredash/redash/blob/8b73a2b135aed8fcbca139380a959b9222ae0080/redash/handlers/api.py#L68)もあるので、データ取得まえにリフレッシュをかけて最新データを取ることができます。
いちいちリフレッシュスケジュールを設定しなくても良くなりますね。

## GETかPOSTか
refreshってPOSTだよね・・・？
エンドポイント一覧を見てもリクエストメソッドが書いていません。なのでAction定義元をみました。

```#redash/handlers/queries.py
class QueryRefreshResource(BaseResource):
    def post(self, query_id):
        query = get_object_or_404(models.Query.get_by_id_and_org, query_id, self.current_org)
        require_access(query.groups, self.current_user, not_view_only)

        parameter_values = collect_parameters_from_request(request.args)

        return run_query(query.data_source, parameter_values, query.query, query.id)

```

https://github.com/getredash/redash/blob/8b73a2b135aed8fcbca139380a959b9222ae0080/redash/handlers/queries.py#L121

POSTでした。
Cotoami開発日誌 ExpressでGraphQLのスキーマ定義

# やったこと

Express.jsで現状のREST APIのGraphQL版のスキーマを定義した。
とりあえず、cotosとsessionの2つのフィールドを定義した。

## PR

* [Express server minimum setup #1](https://github.com/cotoami/cotoami-graphql/pull/1)
* [Add access log. #2](https://github.com/cotoami/cotoami-graphql/pull/2)
* [import GraphQL library. #3](https://github.com/cotoami/cotoami-graphql/pull/3)
* [Define cotos and session types. #4](https://github.com/cotoami/cotoami-graphql/pull/4)

## 配信

* [Define the schema and dummy resolver!](https://www.twitch.tv/taijumuto/v/110625810)
 
# 次のステップ

ミューテーションの書き方がわからなかったので、調べてcotosのミューテーションを書く。それができたら、REST APIとの接続をやる。

あと、このプロジェクトにおけるGraphQLの意義みたいなところも文書化しておきたい。
LaTeXとOfficeの数式の書き方比較

# この記事について

* Power Pointで数式のあるスライドを作るとき，以前はTeX2imgで数式の画像を作って貼り付けていたが，ツールを行き来するのがしんどいのでPower Point側だけで数式をサクサク書きたかった．
* Power PointやWordにおいても $ \mathrm\LaTeX $ ライクなコマンドを用いて数式が書けるが， $ \mathrm\LaTeX $ とコマンドが微妙に違うので，その違いをまとめることにする．

# 参考文献

* Word 2010での行形式による数式の挿入
    * http://www.itc.u-toyama.ac.jp/el/word102/linear_format.htm

# 表記について

ppt用の表記においては行頭から終端の`$`の直前までの文字が意味を持っている（途中の半角スペースを飛ばさないように注意）．

# 上付き・下付き文字

```math
e^x
```

```latex:latex
e^x
```

```:ppt
e^x $
```

```math
e^{x+y}
```

```latex:latex
e^{x+y}
```

```:ppt
e^(x+y) $
```

```math
A = (a_{ij})
```

```latex:latex
A = (a_{ij})
```

```:ppt
A = (a_(ij) ) $
```

# 分数

```math
\frac{1}{2}
```

```latex:latex
\frac{1}{2}
```

```:ppt
1/2 $
```

```math
\frac{1}{x^2 + 5x + 6} = \frac{1}{(x+2)(x+3)}
```

```latex:latex
\frac{1}{x^2 + 5x + 6} = \frac{1}{(x+2)(x+3)}
```

```:ppt
1/x^2+5x+6 = 1/(x+2)(x+3)  $
```

# 関数

```math
f(x)
```

```latex:latex
f(x)
```

```:ppt
f(x) $
```


```math
\sin^2 x + \cos^2 x = 1
```

```latex:latex
\sin^2 x + \cos^2 x = 1
```

```:ppt
sin^2 x + cos^2 x = 1 $
```

# 総和


```math
\sum_{k=1}^N a_k
```

```latex:latex
\sum_{k=1}^N a_k
```

```:ppt
\sum_(k=1)^N a_k $
```

# 微分・積分

```math
\int_1^e \frac{1}{x} \;dx
```

```latex:latex
\int_1^e \frac{1}{x} \;dx
```

```:ppt
\int_1^e 1/x  dx $
```

```math
\frac{dx}{dt} = v(t)
```

```latex:latex
\frac{dx}{dt} = v(t)
```

```:ppt
dx/dt = v(t) $
```

# ベクトル・行列

```math
E = \begin{pmatrix}
1 & 0 & 0 \\
0 & 1 & 0 \\
0 & 0 & 1
\end{pmatrix}
```

```latex:latex
E = \begin{pmatrix}
1 & 0 & 0 \\
0 & 1 & 0 \\
0 & 0 & 1
\end{pmatrix}
```

```:ppt
E = (\matrix(1&0&0@0&1&0@0&0&1) ) $
```

# アルファベット

## ギリシャ文字
Power Point でも $ \mathrm\LaTeX $ でも共通．

## 筆記体

```math
\mathcal A\mathcal B\mathcal C\mathcal D\mathcal E\mathcal F\mathcal G\mathcal H\mathcal I\mathcal J\mathcal K\mathcal L\mathcal M\mathcal N\mathcal O\mathcal P\mathcal Q\mathcal R\mathcal S\mathcal T\mathcal U\mathcal V\mathcal W\mathcal X\mathcal Y\mathcal Z
```

```latex:latex（他の文字も同様）
\mathcal A
```

```:ppt（他の文字も同様）
\scriptA $
```

## ボールド体

```math
\mathbb A\mathbb B\mathbb C\mathbb D\mathbb E\mathbb F\mathbb G\mathbb H\mathbb I\mathbb J\mathbb K\mathbb L\mathbb M\mathbb N\mathbb O\mathbb P\mathbb Q\mathbb R\mathbb S\mathbb T\mathbb U\mathbb V\mathbb W\mathbb X\mathbb Y\mathbb Z
```

```latex:latex
\mathbb A
```

```:ppt
\doubleA $
```

## ドイツ文字

```math
\mathfrak A\mathfrak B\mathfrak C\mathfrak D\mathfrak E\mathfrak F\mathfrak G\mathfrak H\mathfrak I\mathfrak J\mathfrak K\mathfrak L\mathfrak M\mathfrak N\mathfrak O\mathfrak P\mathfrak Q\mathfrak R\mathfrak S\mathfrak T\mathfrak U\mathfrak V\mathfrak W\mathfrak X\mathfrak Y\mathfrak Z
```

```latex:latex
\mathfrak A
```

```:ppt
\frakturA $
```


## 花文字

```math
\mathscr A\mathscr B\mathscr C\mathscr D\mathscr E\mathscr F\mathscr G\mathscr H\mathscr I\mathscr J\mathscr K\mathscr L\mathscr M\mathscr N\mathscr O\mathscr P\mathscr Q\mathscr R\mathscr S\mathscr T\mathscr U\mathscr V\mathscr W\mathscr X\mathscr Y\mathscr Z
```

```latex:latex
\mathscr A
```
※ Power Pointには花文字は無さそう
RubyとRailsの導入【for Mac】

#はじめに
ターミナルを使って何かをインストールするときは必ずつまずいたりするから、忘れないためのメモ。

#これからインストールするもの
- rbenv:　rubyのバージョン管理のためのツール。パッケージマネージャー？
- ruby-build:　rbenvのプラグイン
- ruby

#手順
##①rbenvとruby-build
`$ brew install rbenv ruby-build`

rbenvの初期化スクリプトをbash_profileへ追加
`$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile` 

bash_profileの実行
`$ source ~/.bash_profile`

##②Rubyのインストール
`$ rbenv install 2.3.3`


インストールされているバージョン一覧
`$ rbenv versions`

環境全体のバージョン指定
`$ rbenv global 2.3.3`

Rubyのバージョン確認
`$ ruby -v`

`ruby 2.3.3p222`となって入ればOK

##③Railsのインストール
`gem install rails -v 4.2.6`


#トラブルシューティング
`$ rbenv versions`と`$ ruby -v`が合わなくて、かなりハマった。
どうやら、環境変数のPATHの設定が間違っていたとかなんとか。
初心者にはなかなか難しいところだけど、意外と多いハマりのようで結構情報あってなんとかうまくいった。
`.bash_profile`の問題。

…トラブルシューティングというより感想。
幸せについて

下請けCOBOLERとして生きていた頃のノウハウ Advent Calendar 2016の25日目ぐらいの記事です。

完全なポエムです。
思いつくことをそのまま書いてます。推敲しろって思いますが、思ったことを全部書いていこうと思います。

##現場の工夫の限界
2016年も終わりが近づいて来ました。
先日、この世界の片隅にという映画を見てきました。
戦前〜昭和21年期の広島を舞台に浦野(結婚後は北條)すずさんという庶民の目線で描いた、大変傑作なアニメです。こんな記事読むの止めて映画館に急いでください。

劇中では食料が少ない中で数多くの工夫が行われています。
摘んできた野草を使っておいしい料理を作ったり、楠公飯という煎ったお米を水に一晩つけて3倍以上に膨らませる料理に挑戦してみたり(これは美味しくないみたいです)
あらゆる智慧と工夫をして食糧難の時代を生き抜こうとしていました。

しかし、そんな工夫をしたところで、戦争状態にあるという根本的な原因を取り除くまではどうしようもない状態です。

自分がCOBOLの現場にいた頃、(戦時中を生きていた人には大変失礼ですが)自分達もまた、あらゆる工夫をしていたような気がします。
ウォーターフォール開発による出戻りの難しさ、政治的都合で間に会社が入ってきたり、大量に引きずらなければならない過去の負の遺産。
負の遺産が一番どうしようもないのですが、これはもう仕方のないことです。
それよりも、働きにくい環境を作っている要員はたくさんあると思ってます。
このアドベントカレンダーで書いていた、トイレにも行けない、飯も食えない、スーツ着用義務、インターネット接続不可等々です。
今のところなんとかなってますが、今後エンジニアの数が減ってきたときにどう対処するのか、働きやすさについて考えるときではないでしょうか。

##殺人が横行する社会
機密性の高い仕事しているとおどろくほどの人間不信を前提にして悪さが出来ないように作られています。

何年か前に、教育関係の出版社で大量の顧客情報の流出事件がありましたが、会社側としてはシステム開発に大量のお金を払っているつもりでも、実際に末端でデータを触る人間は手取り15万だったりします。
残念なことにシステムの開発費保守費のいくばくかはそれ以外の用途に消えています。
穴埋めは自分のサービス残業時間です。

人間を非効率な業務に従事させて、安い賃金で使った上で命を奪うという行為はその人の残り時間を全て奪ってしまうことです。
サビ残の強制やシステムの安定のために単価以上に働くという行為は、一方的に人の時間を奪う点で殺人行為だと思ってます。
(もちろん本人の能力に問題がありすぎて残業するケースも多くあると思いますがそれは自殺だと思ってください）
自分がサボることでどんな障害が起きても偉い人たちが取材の場で謝罪することになろうが俺の賃金15万って意識は忘れないで欲しいと思います。
(もちろんそこで頑張ることが賃金うｐに繋がりそうなら頑張る価値はあると思いますが下請けコボラーが頑張っても単価アップがせいぜいです。)

##現場では不幸という感覚はあまりない
安い賃金で長時間労働というと恐ろしい暗い時代に思われますが、実は結構そうでもありません。
現場ではプロパーさんを含めてみんな仲が良く、よく飲みに行ったりしてました。
きついならきついなりに楽しみを見つけて楽しく過ごそうとするものです。
自分も残業代が出てればあそこでも悪くないと思っていた可能性がありますし、みんなが同じ時間働いているのだから、みんなこんなもんだろうという錯覚も覚えます。

##職場の価値観に染まるな
職場の価値観を受け入れてしまうと、もうそういうもんだというあきらめで余生を送ることになります。
自分には幸いなことにオタクの知り合いやまたギークハウス界隈に出入りすることが出来たので、違う仕事というものをもう少し具体的にイメージ出来ました。
それまではwebエンジニアとかアプリエンジニアと訊いただけでもうひれ伏すしかなかったのですが、実は結構普通なんだなってことにも気づいてきました。

##下請け企業は営業力なんてない
会社は何もしてくれません。というか何かをするノウハウを持ち合わせていません。

昔は何もしなくても仕事が振ってきました。
弊社も地方にいながら地元のSiの御用聞きに専念して、人足を求められたら人員を調整して派遣するだけでお金が稼げた時代があったみたいです。
営業努力というのは愛想を良くしてお中元やお歳暮を持って行くことぐらいなんじゃないでしょうか。

しかし、人口減少時代に入って日本自体が縮小を始めています。
昔は3ヶ月おきにリリースされていた携帯開発も、ものすごいマンパワーで乗り切っていましたがそんなことをしてる間にandroidやiosの登場であっという間にシェアを失い、今やガラケーwと呼ばれ嘲笑の対象ですらあります。
大量にいたガラケーエンジニア、ガラケー部門はどこに行ってしまったのでしょうか？

優秀なエンジニアなら縮小しても使って貰えると思うでしょうが、間に違う会社が入ってきて取り分が減りつつ同じ仕事をすることになるのです。
営業力がないから優秀な人員がお金を稼げないだけなのに、会社はお前は単価が安く使えない人材とまで断罪するでしょう。

COBOLが出来ますとかpythonができますとか、実際に出来ることよりも、出来ることを対外的にアピールしていく能力がなければ生きていけないでしょう。
仕事は能力で振ってきません。営業力で振ってきます。(かつては何もしなくても振ってきましたが)



##幸せについて
色々書いてきましたがそろそろまとめようと思います。
エンジニアである自分にとって幸せとはなんでしょう？（主語がでかい
何かに邪魔されることなく新しい技術を追っかけて何かを作ることという人は結構いそうですね。
色々な勉強会に出て地方でも優秀なエンジニアがたくさんいることを知りました。
そういう人たちが能力をフルに発揮出来るような仕事をさせて貰えるかというとそうでもないような気がします。
色んなことに振り回されたりして、自分の仕事ができない、やりたいことができないという人が多いんじゃないでしょうか。
色々考えると、エンジニアにとっての幸せはコーディングに集中出来ることだと思います。

仕様のひっくり返りとか説明資料とかエビデンス収集とか、朝夕の通勤にも苦しめられず満足のいくものを創りあげる環境のことじゃないでしょうか。

もちろん、世の中はコーディングだけでは回りません。
お仕事を見つけてくる人、お客さんから要件を導き出す人、インフラを整備する人・・

そういう人たちがそれぞれの専門家として分業をきちんとこなし、お互い自由に仕事がしやすくなれば良いなぁと思います。

なんだかよくわからない内容ですが、2017年はエンジニアにとって仕事がしやすくなる年になれば良いなと思います。

それではみなさん良いお年を
Debianをネットブック（ASUS X205TA）へのインストール


ASUS のネットブックX205へLinuxをインストールしようとしてハマった。。
起動が特殊なためではないかと思う。
Debianをインストールしたくて調べたが、その通りに行うとX205では起動してくれない。
成功した方法を紹介します。

rufusを使ってインストール用USBを作る。
ASUS X205はUEFIを利用しないとブートしないので、設定が重要。
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/157360/1d2ad6a8-bb28-4987-381a-b67f09e4c75a.png)

パーティション構成とターゲットでの選択をUEFIにする。（MBRではNG）
Debianのisoファイルをダウンロードしてfufusで書き込む。
形式はDDで行う。（ISOを推奨しているが、それだとX205では起動しない。

X205にUSBを付けたらESCキーで起動デバイスを選択する。
net-snmpをインストール（ソースからコンパイル）for CentOS7.3

SNMPを利用する際に必要な、net-snmp。net-snmpをソースからコンパイルしインストールする方法を紹介します。
2016年12月現在の最新バージョンは、「5.7.3」ですが、Perl5.24に対応をしていないため、sourceforgeより直接新しいソースコードを取得します。

##事前準備
あらかじめ以下のツールのインストールが必要です。
[OpenSSL(1.0.x)をインストールする（ソースからコンパイル）for CentOS 7.2](http://qiita.com/shadowhat/items/68fd55b532c04b13acf5)
[Python2.xをインストール（ソースからコンパイル）for CentOS7.2](http://qiita.com/shadowhat/items/4bffc6852a1a1d3c5f61)
[Perl5.8をインストールする（ソースからコンパイル） for CentOS7.2](http://qiita.com/shadowhat/items/012238aae671924a1f15)

##インストール
SourceForgeのページから、最新のソースコードをダウンロードします。
尚、5.7.3を利用した場合、perl5.24の場合以下のようなエラーが出ます。

```bash:makeエラー内容
RGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -D_FORTIFY_SOURCE=2  -I/usr/local/lib/perl5/5.24.0/x86_64-linux/CORE   -c -o snmp_perl.lo snmp_perl.c
libtool: compile:  gcc -I../include -I. -I../agent -I../agent/mibgroup -I../snmplib -fno-strict-aliasing -g -O2 -Ulinux -Dlinux=linux -fwrapv -fno-strict-aliasing -pipe -fstack-protector-strong -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -D_FORTIFY_SOURCE=2 -I/usr/local/lib/perl5/5.24.0/x86_64-linux/CORE -c snmp_perl.c  -fPIC -DPIC -o .libs/snmp_perl.o
In file included from ../include/net-snmp/utilities.h:42:0,
                 from ../include/net-snmp/net-snmp-includes.h:71,
                 from snmp_perl.c:9:
../include/net-snmp/library/int64.h:8:30: error: conflicting types for 'U64'
     typedef struct counter64 U64;
                              ^
In file included from /usr/local/lib/perl5/5.24.0/x86_64-linux/CORE/perl.h:2684:0,
                 from snmp_perl.c:6:
/usr/local/lib/perl5/5.24.0/x86_64-linux/CORE/handy.h:179:17: note: previous declaration of 'U64' was here
 typedef U64TYPE U64;
                 ^
make[1]: *** [snmp_perl.lo] エラー 1
```

そのため、souceforgeより、最新のソースコードをダウンロードします。
https://sourceforge.net/p/net-snmp/code/ci/master/tree/

![image](https://qiita-image-store.s3.amazonaws.com/0/85495/c2ff9b28-fea3-c53a-163d-91bdac5bcc08.png)


```bash:
cd /usr/local/src
wget --trust-server-name https://sourceforge.net/code-snapshots/git/n/ne/net-snmp/code.git/net-snmp-code-af04cde5792d0daa265245d28349c32347d3430e.zip
unzip net-snmp-code-af04cde5792d0daa265245d28349c32347d3430e.zip
cd net-snmp-code-af04cde5792d0daa265245d28349c32347d3430e
./configure  \
#--with-perl-modules=/usr/local/ \
--with-openssl=/usr/local/ssl \
#--with-python-modules=/usr/local
make
make install
```

./configure \
--with-python-modules=/usr/local/src/Python-2.7.13

##ヒント１
make時に、
libperl.a: could not read symbols: Bad value 
と出る場合、perlの./configureにパラメーターがないのが原因かもしれないので、以下を一度確認します。
[Perl5.8をインストールする（ソースからコンパイル） for CentOS7.2](http://qiita.com/shadowhat/items/012238aae671924a1f15)


##ヒント２
make[1]: Leaving directory `/usr/local/src/net-snmp-code-af04cde5792d0daa265245d28349c32347d3430e/agent'
make: *** [subdirs] Error 1
と出る場合、SELinuxが有効になっている可能性がある。

##参考
http://d.hatena.ne.jp/tori243/20100710/1278736598
TunnelblickでOpenVPN

* hoge.ovpn とかになっているOpenVPN設定ファイルをFinderで右クリック→このアプリケーションで開く→Tunnelblick
* proxyある環境で動作確認された設定ファイルだとhttp-proxyの設定が含まれてる
* proxyを探して接続できないワナに注意
【俺専用】Macで最初にやる環境設定まとめ

# はじめに
Macセットアップ時の環境設定。俺用。
ほとんどコマンドだけでできると思うけど、
GUIで設定できるやつは、とりあえずGUIの設定箇所で記載。

# システム環境設定
##キーボード
### キーボード
- [x] [F1、F2などのキーを標準のファンクションキーとして使用] にチェック

### ショートカット
- [x] [スクリーンショット] の全項目にチェック
- [x] それ以外は全てチェックを外す

### 入力ソース
* [/キーで入力する文字] を「・」にする
* [¥キーで入力する文字] を「\」にする
* [入力モード]の全てのチェックをつける

## トラックパッド
### ポイントとクリック
- [x] [タップでクリック] にチェック

### スクロールとズーム
- [ ] [スクロールの方向: ナチュラル] のチェックを外す


# Finder
## 一般
- [ ] [デスクトップに表示する項目]全部チェックを外す
* [新規Finderウィンドウで次を表示]を好きなものに変更

## サイドバー
必要なもの以外削除

## 詳細
- [x] [すべてのファイル名拡張子を表示] にチェック

## 隠しファイル、隠しフォルダ、フォルダパスの表示

```bash
# 隠しファイル、フォルダを表示
defaults write com.apple.finder AppleShowAllFiles TRUE
killall Finder

# フォルダパスを表示
defaults write com.apple.finder _FXShowPosixPathInTitle -bool YES
killall Finder
```

# ターミナル
## プロファイル
* Proをデフォルトにする
* Proのフォントを「Osaka、等幅、14pt」に変更する

## ログインシェルをzshに変更、.zshrc作成

```
chsh -s /bin/zsh
vi ~/.zshrc
```
.zshrcは以下などを参考に記述：
　http://mollifier.hatenablog.com/entry/2013/02/22/025415

# 色々インストール

```bash
# Homebrewインストール
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

# Homebrew Caskインストール
brew tap caskroom/cask

# AppCleanerインストール
brew cask install appcleaner

# Google Chromeインストール
brew cask install google-chrome

# VSCodeインストール
brew cask install visual-studio-code

# Dockerインストール
brew cask install docker

# Virtualboxインストール
brew cask install virtualbox

# Vagrantインストール
brew cask install vagrant

# Atomインストール
brew cask install atom

# Atomプラグインインストール
# 事前に、Atomのメニューの[Atom]-[Install Shell Commands]を実行して
# パッケージのインストールをコマンドから実行できるようにしておく必要あり。
apm install atom-beautify
apm install auto-encoding
apm install terminal-plus
apm install sublime-style-column-selection

# Gitインストール
brew install git

# Slackインストール
brew cask install slack

# MySQL Workbenchインストール
brew cask install mysqlworkbench

# Intellij Idea CEインストール
brew cask install intellij-idea-ce

# STSインストール
brew cask install sts

# Cyberduckインストール
brew cask install cyberduck

# Javaインストール
brew tap caskroom/version
brew cask install java

# Mavenインストール
brew install maven

# Gradleインストール
brew install gradle
```

以上
vim: 今いる行のあの文字から始まるあの単語に会いたいときは`f`か`F`が便利かも

`f + [word to move your cursor to in current line]`で同じ行にある単語にすっ飛んでくれる。ちょっとした時に使えそうな小技。`F + [word (backwards)]`でカーソルより後ろの単語を探してくれる。

![vimmer8.gif](https://qiita-image-store.s3.amazonaws.com/0/87666/53597756-a939-9045-142c-eeefba6dc0d8.gif)
vbaでテーブルの最終行がうまく取得できない時の対処

#概要
データをテーブルに入力後、最終行を取得しようとするとなぜか以前入力して行を削除してた位置が取得されてしまう。この問題で２時間悩んだ。。

#最終行の取得
```vba
MaxRow = Cells(Rows.Count, 1).End(xlUp).Row
```

#行の取得がテーブルの場合やらなくてはいけないこと
テーブルツール > ツール > 範囲に変換

これをやらないと、一度入力して消した空白セルが取得されてしまう
Vimでシュッと実行する

　quickrun.vim というプラグインがあり、バッファ上にあるコードをシュッと実行することができます。

- [thinca/vim-quickrun: Run commands quickly. - GitHub](https://github.com/thinca/vim-quickrun)

　Rust も対応していますが、デフォルトで設定されている rustc よりも cargo を呼んでくれるほうが嬉しいと思うので、そのようにします。拡張子 `.crs` というのは、[先日に言及した cargo-script](http://qiita.com/woxtu/items/ab8be6a93237346e8aff) のファイルです。

```vim
autocmd BufNewFile,BufRead *.crs setf rust
autocmd BufNewFile,BufRead *.rs  let g:quickrun_config.rust = {'exec' : 'cargo run'}
autocmd BufNewFile,BufRead *.crs let g:quickrun_config.rust = {'exec' : 'cargo script %s -- %a'}
```

適当にコードを書き、ノーマルモードで `\r` か `:QuickRun` を叩きます。

![wrote](https://qiita-image-store.s3.amazonaws.com/0/4250/df4622df-3299-992b-44b7-a3b0a9593691.png)

やりました。

![run](https://qiita-image-store.s3.amazonaws.com/0/4250/9c230571-e720-a5d9-3714-973e117b4787.png)

引数を渡したいときは `:QuickRun -args "foo bar baz"` のように書きます。

![run with arguments](https://qiita-image-store.s3.amazonaws.com/0/4250/fe1e1c01-9b84-38c7-2868-8a5fe332e3ec.png)

シュッとやっていきましょう。
pythonで競技プログラミング　ローカル環境の設定

pythonの勉強として、paizaのスキルチェックを利用。その中で、標準入力をローカルで再現し、テストする構成を考えたのでメモ。タイポ、もっと効率の良いやり方等あったら指摘お願いします。

__2016年12月30日追記__
__特にこのような方法とる必要なく[clarinet758](http://qiita.com/clarinet758)さんにコメント頂きました以下の方法で万事OKでした。__

```
$ python ./answer.py < ./input.txt
```



#準備
python3のインストール。クリップボードのコピーに使うpyperclipの導入
参考: [pythonでclipboard操作](http://qiita.com/ksomemo/items/4f3d4d0bdfb1863904d1)

#ディレクトリ構成
```
.
├── answer.py #本番環境アップ用ファイル
├── conv.py #ローカル変換用ファイル
├── input.txt #入力例ファイル
└── proto.py #メインプログラム記載ファイル
```

#ファイル内容
answer.pyとinput.pyは最初空なので他の二つを。
##proto.py - メインプログラム記載用
```python:proto.py
#ローカル実行環境の作成
#ファイルのオープン

inp =  open("input.txt", mode="r")

#----ここからプログラム----



#----ここまでプログラム----

#ファイルのクローズ
inp.close()
```

##conv.py - ローカル固有記載変換用
```python3:conv.py
#正規表現のインポート
import re
# クリップボードにコピーのモジュールインポート
import pyperclip

#変換用にファイルの読み込み
with open("proto.py", mode="r") as prot, open("answer.py", mode="w") as answ:
    #ローカル環境の読み込み
    for line in prot:
        #ローカル開発環境専用のキーワードを標準入力のものに置き換え
        tmp = line.replace('inp =  open("input.txt", mode="r")','')\
                 .replace('inp.readline()','input()')\
                 .replace('inp.close()','')
        #コメントの削除
        tmp = re.sub(r'#.*','',tmp)
        #空白行以外書き出し
        if tmp != '\n':
            answ.write(tmp)

#回答をクリップボードコピー用に読み込み
with open("answer.py", mode="r") as answ:
    pyperclip.copy(answ.read())

```


#手順
##1. 入力例の追加、標準入力の取得
まず、標準入力の入力例についてはinput.txtにそのままコピペ。
あとは、proto.pyの--ここからプログラム--のコメント下からプログラミン。
標準入力については以下のコードで一行ずつ取得する。

```python:proto.py
#1行1データの場合
date = inp.readline().rstrip() #rstripは右端の空白、改行の削除

#1行複数データの場合
date = inp.readline().rstrip().split(' ') #splitにより空白区切でリスト化
```

##2. プログラミング、テスト
通常どおりプログラミング。都度ターミナルに下記コマンドを打ち結果を確認しつつ模索。

```linux:
$ python proto.py
```

##3. 本番環境用へ変換、コピペ
完成後に、conv.pyでローカル固有のプログラムの削除、標準入力への変換を行う。クリップボードへのコピーも。あとは、提出用のフォームにペーストするだけ。

```linux:
$ python conv.py
```
Unityのスクリプト・エディタにVisual Studio Codeを使う簡単設定2016年末

## 概要

- Macの場合です。
- Unityのスクリプト・エディタとしてVSCodeが起動するようにします。
- Break Pointで止めます。
- UnityとMicrosoftのプラグインのみ使用します。

ちょっと調べたところ、設定が面倒かもと思ったのですが、自己流でやろうとしたところ、2016年現在、UnityとMicrosoftのプラグインが充実してかなり設定が楽になっていたので記しておきます。

## 事前準備

[Visual Studio Code](https://code.visualstudio.com/) をダウンロードしておく。

monoをインストール

```bash
$ brew install mono
```

## Unity側の設定

File > Preferences からExternal EditorをBrowsして[Visual Studio Code](https://code.visualstudio.com/)を選択する。

![unity_preferences_and_unity_5_5_0f3_personal__64bit__-_gamescene_unity_-_the_box_-_android__personal___opengl_4_1__and__wip__create_escape_game_by_morizotter_ _pull_request__4_ _morizotter_unity-study](https://cloud.githubusercontent.com/assets/536954/21542455/28f36364-ce01-11e6-8586-033085ae8ec2.png)

## Visual Studio Code側の設定

Unityから既存のScriptを開くとVisual Studio Code が立ち上がる。この時、おすすめプラグインが出てくるのでそのおすすめにしたがって下記の二つのプラグインをインストールする。

![gamemanager_cs_-_the_box](https://cloud.githubusercontent.com/assets/536954/21542095/cf78f15c-cdfe-11e6-8e87-63ebcafa4d51.png)

インストール後リロードするとさらに、[.NET Core](https://www.microsoft.com/net/core#macos) がないのですがどうします？と聞かれるので、Getを選択する、すると、.NET Coreのページが開くので、指示に従ってインストールする。基本的にopensslをbrewで入れて、その後、インストーラーを起動してOk, Okのスタイル。

![dec-29-2016 19-53-08](https://cloud.githubusercontent.com/assets/536954/21542357/8070144e-ce00-11e6-80fb-c7fd2daf1b45.gif)

こんな感じで、補完などもスムーズな感じです。なにより、Mono-Developに比べると圧倒的に早くて気持ちいいです。C#初心者なのでまだこれが本当に良いのかわからないところではあるのですが、今のところとても快適に使えています！

これで、とりあえずVSCodeをエディタとして使えるようになりました。ただ、まだ、ブレークポイントが利用できません。

## ブレークポイントを利用する

VSCodeのプラグインを検索したところ、それっぽいものが見つかりました。

![GameManager_cs_-_The_Ball.png](https://qiita-image-store.s3.amazonaws.com/0/24041/15cdaff5-8b01-ef74-1266-c6b112dd120d.png "GameManager_cs_-_The_Ball.png")

[Debugger for Unity](https://github.com/Unity-Technologies/vscode-unity-debug) をインストールしてリロードします。Debugger for Unityの説明を見ると、ブレークポイントの使い方が記載されています。簡単に説明すると、

0. UnityのフォルダをVSCodeで開いて,
1. VSCodeのDebug画面でUnity Debuggerを選択して
2. VSCode側でデバッグ開始して
3. その状態で、Unity側でデバッグ開始する

![GameManager_cs_-_The_Ball_and_unity-study_—_-bash_—_134×54.png](https://qiita-image-store.s3.amazonaws.com/0/24041/4e9346c4-e097-edc0-9189-7bb34ead3b90.png "GameManager_cs_-_The_Ball_and_unity-study_—_-bash_—_134×54.png")

と、ブレークポイントで止まります（詳細は[本家](https://github.com/Unity-Technologies/vscode-unity-debug)）。VSCode側はずっとデバッグ実行させたまま、UnityやVSCodeの編集もできるので、そんなに手間ではないかなと思います。

![GameManager_cs_-_The_Ball.png](https://qiita-image-store.s3.amazonaws.com/0/24041/cf03c6f5-34e0-f3d1-b62d-eabd58c07776.png "GameManager_cs_-_The_Ball.png")

とりあえず、ここまでできたので良かったと思います！その他のプラグインなども触って行って慣れていきたいと思います！

## 後記

最初、Visual Studio for Mac(Preview)を連携させたのですが、おすすめなども出なく、うまく使えるかわからなかったので、Visual Studio Codeにしたところ、上記のようにサクサク進みました。

Visual Studio for Mac (Preview)の方が良いとか、おすすめのプラグインとかあれば教えていただければ！
railsでセキュリティ対策

- お問い合わせ攻撃対応
  - google http://tango-ruby.hatenablog.com/entry/2016/01/21/191706
  - 古いやつ https://github.com/plataformatec/mail_form
  - https://github.com/pludoni/simple-captcha
- dos対応
  - https://github.com/kickstarter/rack-attack
  - https://www.upguard.com/articles/top-7-ways-to-hack-rails-how-to-fix
  - http://guides.rubyonrails.org/security.html
  - https://github.com/rauchy/rack-attack-recaptcha


お問い合わせ対応としてリキャプチャ入れる
dos対応としてrack-attackの設定入れる
slick3.1 で日付型を joda.time.DateTime 型として取得する

# 概要

slick で日付型を取得すると、デフォルトでは java.sql.Timestamp 型になってしまいます。

ビジネスロジックでは sql.* とかっていう型は使いたくないですよね。
java.util.Date も扱いにくいので、 joda.time.DateTime にしたいですよね。

というわけで簡単なコードを載せます。

※play2.5 scala 環境を前提としています。

# 実装

テーブルは以下とします。

```schema.sql
CREATE TABLE IF NOT EXISTS SAMPLE (
    SAMPLE_DAY timestamp NOT NULL
);
```

テーブルに対応する case class を定義します。

```
case class Sample(sampleDay:DateTime)
```

Tables.scala にテーブルとモデルの対応関係を定義します。
java.sql.Timestamp ⇒ joda.time.DateTime の変換処理も定義します。※この記事のポイントはここだけです・・・

```Tables.scala
class Tables @Inject()(dbConfigProvider: DatabaseConfigProvider) {
  val dbConfig = dbConfigProvider.get[JdbcProfile]
  import dbConfig.driver.api._

  /**
    * java.sql.Timestamp ⇔ joda.time.DateTime
    */
  implicit val jodatimeColumnType = MappedColumnType.base[DateTime, Timestamp](
    { jodatime => new Timestamp(jodatime.getMillis()) },
    { sqltime => new DateTime(sqltime.getTime) }
  )

  class SampleTable(tag: Tag) extends Table[Sample] (tag, "SAMPLE") {
    def sampleDay = column[DateTime]("SAMPLE_DAY")

    def * = (sampleDay) <> (Sample.tupled, Sample.unapply)
  }
  val samples = TableQuery[SampleTable]
```

使う側です。

```
class DBDAO @Inject() (dbConfigProvider:DatabaseConfigProvider, tables:Tables) extends DAO {
  val dbConfig = dbConfigProvider.get[JdbcProfile]

  import dbConfig.driver.api._
  import scala.concurrent.ExecutionContext.Implicits.global

  override def getSampleDay:DateTime = {
    val f = dbConfig.db.run(tables.samples.result.head)
    Await.result(f, Duration(1, SECONDS)).sampleDay
  }
}
```

以上。

# おまけ

DB の Int 型を Scala の Boolean 型に変換したい場合は以下のようにします。

変換の定義。

```
  /**
    * DB Int ⇔ Scala Boolean
    */
  implicit val booleanColumnType = MappedColumnType.base[Boolean, Int](
    { b => if(b) 1 else 0 },    // map Boolean to Int
    { i => if(i == 0) false else true } // map Int to Boolean
  )
```

Table のカラム指定。（isDisp というカラムだとします。）

```
def isDisp         = column[Boolean]("ISDISP")
```