OmniAICreator/Qiita-1.07M huggingface dataset:
GitHubでのプルリクエストの送り方


みなさんGitHub使ってますか？僕はよく使います。
世界で最高峰のプログラマーが書いたソースコードに無料で触れられるなんてすごいことですよね。

そんな中、自分なんかがバグ修正などのプルリクエストを送っていいかなと不安になっていましたが、意を決して送ってみると意外と簡単だったので、備忘録として書きます。

#対象のリポジトリをForkする
対象のリポジトリのページの右上にこういうボタンが並んでいると思うので、Forkボタンをクリックして、自分のアカウントにリポジトリをForkしましょう。
![スクリーンショット 2017-12-18 22.10.09.png](https://qiita-image-store.s3.amazonaws.com/0/152335/e9d26c6e-189a-f7f3-8b60-41b0d86ff011.png "スクリーンショット 2017-12-18 22.10.09.png")

#修正をしてプッシュする。
みなさんが得意なところですね。

#プルリクエストを作成する。
GitHubでフォークした自分のリポジトリを開き、New pull requestボタンをクリックします。
![スクリーンショット 2017-12-18 22.15.51.png](https://qiita-image-store.s3.amazonaws.com/0/152335/8f86ef00-62c8-f475-e9aa-e63a982169b1.png "スクリーンショット 2017-12-18 22.15.51.png")


プルリクエストを送る内容を確認できる画面になるので、確認をして、Create pull requestボタンをクリックします。
![スクリーンショット 2017-12-19 22.24.56.png](https://qiita-image-store.s3.amazonaws.com/0/152335/ea775853-2e92-bc41-2edd-dbb0f9e9fc97.png "スクリーンショット 2017-12-19 22.24.56.png")

#変更内容を書く
自分のような英語に自信がない人間にとってはここが鬼門ですが、Google翻訳を駆使して英語で変更内容を伝えましょう。
日本人の管理者相手なら日本語でいい気もします。
![スクリーンショット 2017-12-19 22.25.10.png](https://qiita-image-store.s3.amazonaws.com/0/152335/ad269787-4200-7536-db96-fc966c0ae424.png "スクリーンショット 2017-12-19 22.25.10.png")

コメント欄はmarkdown記法が使えるので画像やGif動画を乗せることもできるので、多少英語ができなくてもなんとかなったりします。

自分はそれで[なんとかしました](https://github.com/acerbetti/ACEDrawingView/pull/89)
ハートが大事だなって思いました。

#マージされるのを待つ
あとは管理者がマージしてくれるのを待ちます。
マージされればあなたもContributorsの一員です。

#気をつけること
##大量の変更を送りつけない
大量の変更を送られると相手も人間なので、見る気が失せます。
最小限の変更に留めましょう。
複数の修正や機能追加はいくつかのプルリクエストに分けて送りましょう。

##萎縮しない
バグ修正できても英語ができないからプルリクエストを送らないのはもったいないと思います。
Contributionのチャンスを逃さないようにしましょう。
[IFTTT] 任意のハッシュタグを含むツイートがされたら通知する


この記事は、 [OIT Advent Calendar 2017](https://adventar.org/calendars/2102)の19日目の記事です。

## 背景・目的

Twitter 標準アプリで、特定のハッシュタグを含むツイートを検索することはできますが、検索結果をリアルタイムに通知を受け取ることができません。

[IFTTT](https://ifttt.com) の iPhone/Android アプリを利用することで、約 10 分毎に通知してくれます。ただし、1 度に通知してくれるツイートは最大 15 件です。

これを利用することで、イベント中のできごとをリアルタイムにチェックするなどに役立ちます。

## やりかた

1. IFTTT のアプリをインストール・起動する
2. My Applets を作成する
3. this に Twitter の「New tweet from search」を選択する
4. 任意のハッシュタグを指定する ex)「#followfriday」
5. that に Notifications の「Send a notification from the IFTTT app」を選択する
6. Notification を編集する (任意)

これで任意のハッシュタグを含むツイートされれば、IFTTT アプリが通知してくれます。

## 余談

IFTTT ではアプリでの通知以外にも、他の Web サービスに転記したりすることができます。(というより、こちらが IFTTT 本来の用途)

私は、社内ハッカソンのハッシュタグを含むツイートを、ハッカソンメンバーが利用するチャットツール Slack へ転記することに利用しています。
たわみ量の計算

# 0. 中央への集中加重

![image.png](https://qiita-image-store.s3.amazonaws.com/0/95636/cdefa577-75e4-6c1c-6399-b1a4d3a37403.png)

δ = P・L / 48・E・I

Eはヤング率でN/mm^2の単位。

https://www.alumi-world.jp/files/pdf/chishiki_03seishitsu.pdf

なので、例えばアルミで考えると
ヤング率:69, 972N/mm^2
長さL: 300mm
掛っている加重: 1000kg * 9.8
断面(厚さ、奥行): 200mm

1000kg * 9.8 * 300^3 / 48 * 69972 * (200mm^4 / 12 )
= 0.06cmたわむ
Macユーザー向け作業効率アップのための純正機能の設定と使い方

# 作業効率アップを意識したことはありますか？
作業効率アップというとみなさんはどんなことを思い浮かべますか？？

- タッチタイピングを覚える
- 単純作業をマクロやプログラムを組んで効率よく処理をさせる
- ツールを導入する
- 以前の記事で紹介したようなショートカットキーを覚える

などなど作業効率アップのためにやれることはたくさんあると思います。

そんな中で今回、私が紹介するのは、MacOSの純正機能を効率アップを測れるようにするための設定と使い方です。
タイトルに書いた通りですね...
# なぜ純正機能なのか
純正機能って実はかなり使いやすいんです。
以上！！

# 動作環境
MacOS Sierra 10.12.6
![ 2017-12-19 21.00.53.png](https://qiita-image-store.s3.amazonaws.com/0/221884/733514df-8d27-cc58-a2fe-ebeaf065a4df.png)

他の環境では使えない機能もあるかもしれません。。



# 機能紹介
##　アプリケーションの割当について

![ 2017-12-19 21.22.21.png](https://qiita-image-store.s3.amazonaws.com/0/221884/522b3161-2d38-00db-5343-b32058af9165.png)
DOCKを右クリックした際に表示されるメニューの中のオプションに3つの割当先の設定があります。
割当先：
・このデスクトップ
・すべて
・なし
デフォルトは「なし」になっています。

仮想デスクトップが5つある場合を想定し説明していきます。
![ 2017-12-19 21.27.03.png](https://qiita-image-store.s3.amazonaws.com/0/221884/6b860d4f-feca-23fe-a175-ff3643e3dc7c.png)
上記画像では仮想デスクトップ5の画面にいます。
・割当先：なしの場合
新しくSafariを立ち上げたとき、Safariは仮想デスクトップ5にのみ存在します。
・割当先：このデスクトップの場合、
どの仮想デスクトップで起動したとしても、仮想デスクトップ5にて立ち上がります。
・割当先：すべての場合、
起動する仮想デスクトップは関係なく、すべての仮想デスクトップに存在します。
上記画像の場合では仮想デスクトップ1〜5すべてにSafariが存在します。

### 使い分け方
私の場合は、
割当先：このデスクトップ
メール、スカイプ、zoomなど、連絡関係のものは割当先を固定し、常に同じ仮想デスクトップに固定しておいています
割当先：すべて
finder、Terminalはどの仮想デスクトップにいても同じものを触りたいので、すべてにしています。

上記のように使い分けることで、あっちこっちいくことがなく、画面を整理して使うことができます。

## Mission control 
MacOS Sierraでは仮想デスクトップの順番が入れ替わるので、
下記system環境設定内のMission controlの中の
画像の一番上の最新の使用状況に基づいて〜〜のチェックを外します。

![ 2017-12-19 21.44.16.png](https://qiita-image-store.s3.amazonaws.com/0/221884/54f4b961-dbed-2241-fd13-5bc2e82a766d.png)

すると常に同じ順番に仮想デスクトップが並びます。
私の場合は、
デスクトップ1がバージョン管理ソフトや開発中の画面系を表示
デスクトップ2がエディタなどの開発ツール
デスクトップ3がChromeなど通常使うもの
デスクトップ4がメールなど

割当先の設定とあわせて設定することで仮想デスクトップを使っています。
こうすることで、デュアルディスプレイにしなくても作業しやすい環境作りをしています。

## 通知センターにgoogleカレンダーを同期する
まずは通知センターの出し方
一つ目（キーボードショートカット）
controlキー + N 
二つ目（ジェスチャー）
トラックパッド右側の外側から指2本を立てに並べてトラックパッド内に向かってスワイプします。
わからないときはgoogle先生に聞いてください。
すると出てきます。
![_2017-12-19-22.37.13.jpg](https://qiita-image-store.s3.amazonaws.com/0/221884/2bc2a0c6-53aa-2933-724e-dea8835cdc97.jpeg)


さらに環境設定内のインターネットアカウント内の設定をします。
今回はgoogleアカウントを追加します。そうすることで通知センターにgoogleカレンダーが表示されます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/221884/1b725d92-0c3e-c6bb-909b-2963a9281763.png)
ここからgoogleを選択し、googleアカウントの情報を入力することで、通知センターにgoogleカレンダーが同期されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/221884/0d5f855d-926f-b6a3-36a9-d5f8f029977a.png)

通知センターを開くだけで予定を確認することができるので、スケジュール管理能力が上がり結果作業効率アップにつながります。


# まとめ
純正機能なので、何かをダウンロードする必要もなく、使えます。ぜひ使ってみてください。
HSP3.5 HGIMG4 で剛体をキネティック(強制指定)モードにする

# HSP3.5 HGIMG4 で剛体をキネマティック(強制指定)モードにする

HGIMG4 では三次元の物理演算剛体が使えますが、gppbind で3Dオブジェクトを3D物理演算剛体として指定すると基本的には setpos などでは移動できなくなり、3D物理演算に従った移動回転が発生します。
しかし gppset で GPPSET_KINEMATIC で x成分 に 1.0 を指定することでその物理演算剛体を強制指定モードに変更することができます。
注意する必要があるのはこの方法で移動させる場合は質量を 0.0 にしてはならないということです。

このキネマティックモードを利用してコインプッシャーもどきを作ってみました。
以下サンプルコードです。

```hs
#include "hgimg4.as"

	randomize
	gpreset
	setcls CLSMODE_SOLID, 0x000000

	whole_size = 32
	whole_half = whole_size / 2

	height_size = 2
	height_half = height_size / 2

	div_num = 4

	box_size = whole_size / div_num
	box_half = box_size / 2

	setborder whole_size * 2.0, whole_size * 2.0, whole_size * 2.0
// 前後移動イベント
	dim evs, 2
	foreach evs
		frs = 157, 163
		vel = double(box_size) / double(frs.cnt)

		newevent ev
		event_addpos ev, 0,0, - vel
		event_wait ev, frs.cnt
		event_addpos ev, 0,0, vel
		event_wait ev, frs.cnt
		event_jump ev, 0
		evs.cnt = ev
	loop

// プッシャー
	repeat 2
		i = cnt
		cols = 0x00ccff, 0x006699
		col = cols.i

		repeat div_num
			j = cnt
				repeat 3
					k = cnt

					gpbox id, box_size, col
					x = (j * 2 - div_num / 2 - 1) * box_size / 2
					y = box_half * (1 - i)
					z = box_half * (-1 + i*2 - k*2)
					setpos id, x, y, z
					gppbind id, 1,2
					gppset id, GPPSET_KINEMATIC, 1
					setevent id, evs.i
				loop
		loop
	loop
// 黄色い箱
	repeat 200
		gpbox id, 2, 0xcccc00
		setpos id, rnd(7) - 3, whole_size / 2, rnd(7) - 3
		setobjmode id, OBJ_BORDER, 0
		gppbind id, 1, 2
		gppset id, GPPSET_DAMPING, 0,0
	loop
// 床壁
	gpfloor id, whole_size, whole_size, 0x006699
	gppbind id, 0
	repeat 3
		xs = -whole_half, 0, whole_half
		y = whole_half / 2
		zs = 0, -whole_half, 0
		ws = whole_size/2, whole_size, whole_size/2
		hs = whole_size, whole_size/2, whole_size
		rx = 0
		ry = 0
		rz = 0
		if cnt == 0 {
			rz = -64
		}
		if cnt == 1 {
			rx = 64
		}
		if cnt == 2 {
			rz = 64
		}
		gpfloor id, ws.cnt, hs.cnt, 0x339966
		setpos id, xs.cnt, y, zs.cnt
		setangr id, rx,ry,rz
		gppbind id, 0
	loop
// ライトとカメラ
	setangr GPOBJ_LIGHT, -16, -32,0
	setpos GPOBJ_CAMERA, 10, 20, 50
	gplookat GPOBJ_CAMERA, 0, 5, 0

	repeat
		getreq fps, SYSREQ_FPS

		stick key
		if key & 256 {
			gpbox id, 2, 0xcccc00
			setpos id, rnd(25)-12, whole_half, -whole_half
			setobjmode id, OBJ_BORDER, 0
			gppbind id, 1, 2
			gppset id, GPPSET_DAMPING, 0,0		
		}
		
		redraw 0		
		gpdraw
		pos 16,16
		color 224,224,224
		font "",48
		mes strf("%2d [fps]", fps)
		redraw 1
		await 1000/60
	loop
```

|実行結果1|
|:-:|
|![z04c1.png](https://qiita-image-store.s3.amazonaws.com/0/213145/1710d30c-62aa-82f1-3449-ae1d9b316360.png)|
|黄色い箱がコインがわりのコインプッシャーです|

|実行結果2|
|:-:|
|![z04c2.png](https://qiita-image-store.s3.amazonaws.com/0/213145/7a848579-71cd-1767-788f-55660bf34b61.png)|
|左クリックで黄色い箱を補充できます|

プッシャーをキネマティックモードにしてイベントで前後移動させ、コイン代わりの箱は通常の3D物理演算で動作が決まるようになっています。

現状では gpbox ですべての辺の長さが等しい立方体しか生成できないため、立方体を複数並べてそれぞれの段の滝を実現しています。直方体とその形状の剛体も作れるようになると、もっと便利かなぁと思います。次期バージョンアップ時の追加に期待したいと思います。

# 参考

HSP3.5 hgimg4 を基礎から理解したい方は以下の記事がとてもおすすめです。

* [Hot Soup Processor Advent Calendar 2017 の17日目: HSP3.5 で hgimg4 （再）入門](https://qiita.com/exrd/items/3fa31353df396ef53312)
Kanaryを使ってみた！

# Kanaryって？
[GithubのReadmeによる](https://github.com/SeunAdelekan/Kanary) 「A minimalist Kotlin web framework for building scalable and expressive RESTful APIs」で、簡単に言うと[Ktor](https://github.com/ktorio/ktor)みたいなweb frameworkです！

![Kanary Logo](https://github.com/SeunAdelekan/Kanary/blob/master/images/Kanary.JPG?raw=true "")

Ktorとかなり似てますので比べましょう！

## Install
まぁ、どっちもインストールしやすいですね！


```kotlin:Ktor.kt
embeddedServer(Netty, 8080)
    .start(wait = false)
```

```kotlin:Kanary.kt
val app = KanaryApp()
val server = Server()
server.handler = AppHandler(app)
server.listen(8081)
```

両方とも簡単にインストール出来ます。だが、これじゃ何も動かない。

## Handling requests
シンプルなケースを見ると

```kotlin:Ktor.kt
install(Routing) {
    route("hello") {
        get("/world") {
            call.respondText("Hello, World!", status = HttpStatusCode.OK)
        }
    }
}
```

```kotlin:Kanary.kt
val router = KanaryRouter("/hello")
router.get("/world",
    {_, _, response ->
        response withStatus 200 send "Hello, World!"
    }
)
app.mount(router)
```


Kanaryの方は英語っぽくかけるが、Ktorの方が全体的に読みやすいかな？
確かにKanaryの `infix notation` が読みやすく見えますね

```kotlin
response withStatus 200 send "Hello, World!"
```

## Overall
KanaryもKtorも使いやすいので、ご遠慮なく使ってみてください！
Kanaryのいい点
- インストールはまあまあ簡単
- `infix notation` は読みやすい
- ライフサイクルコールバックある (`beforeAction() afterAction()`)
Redmineのテキスト記法をTextileからMarkdownに変更する

GitHubやGitBucketを使って開発してるとRedmineのIssueやwikiなどもMarkdownで書きたい！！けど、Redmineのデフォルトはtextileという形式で困ったな〜と思っていたら・・・簡単にMarkdownにできたのでメモる！（メモる必要ないくらい簡単なのですがw）

# 検証バージョン

* Redmine 3.4.3

# Redmineの設定画面を開く

まず、Redmineの管理者ユーザ(admin)でログインし、トップメニューバーの「Administration」リンクを押下する。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/117313/a5df4406-f340-4c20-7261-459e3d2896a7.png)

「Administration」リンクを押下すると、以下のような画面が表示されるので、管理者メニューの「Settings」を押下する。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/117313/d3943787-ba9b-a1e4-7daa-42825bd6b832.png)

# Markdownに変更する

Generalタブの「Text formatting」を「Textile」から「Markdown」に変更して「Save」を押下する。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/117313/d29d0a85-29b6-cf73-2ded-76eb0b222370.png)


## MarkdownでWiki作成

すると・・・WikiページでMarkdownが使える！

![image.png](https://qiita-image-store.s3.amazonaws.com/0/117313/d613d8a0-78f2-08a1-8313-86e25f6ec25b.png)

## MarkdownでIssue作成

IssueでもMarkdownが使える！

![image.png](https://qiita-image-store.s3.amazonaws.com/0/117313/28a1622a-692e-f018-d03c-3b27979e8f92.png)

# まとめ

Markdownライフが長かったので、RedmineでもMarkdown使えてよかった〜
ここではWikiとIssueだけ紹介しましたが、Overview、News、DocumentsでもMarkdownが使えるようになります。
【mod_rewrite】「wwwあり」かつ「https」にリダイレクトさせる

#やりたいこと
**「wwwあり」かつ「https」にリダイレクトさせる**

■使用するドメイン（※存在しないものです。）
takahashi.local

■想定されるアクセスパターン
①http://takahashi.local にアクセス ⇨ https://www.takahashi.local へリダイレクト
②http://www.takahashi.local にアクセス ⇨ https://www.takahashi.local へリダイレクト
③https://takahashi.local にアクセス ⇨ https://www.takahashi.local へリダイレクト


#構成
- LBはなし（サーバーに直接アクセスが来る）
- SSL証明書はサーバー上に設定済み
- CentOS7
- Apache2.4
- mod_rewrite
- Vhostsの設定ファイル（/etc/httpd/conf./配下）で設定を記述する


#実際に行った設定

```
# cat /etc/httpd/conf.d/rewrite.conf

<VirtualHost *:80>
  DocumentRoot "/var/www/html"
  ServerName www.takahashi.local
  ServerAlias takahashi.local

  RewriteEngine On
  RewriteRule ^(.*)?$ https://www.takahashi.local$1 [R=301,L]

</VirtualHost>

<VirtualHost *:443>
  DocumentRoot "/var/www/html"
  ServerName www.takahashi.local
  ServerAlias takahashi.local

  SSLEngine on
  SSLCertificateKeyFile /etc/httpd/ssl/key/www.takahashi.local.key
  SSLCertificateFile /etc/httpd/ssl/certs/www.takahashi.local
  SSLCertificateChainFile /etc/httpd/ssl/certs/www.takahashi.local-chain.crt

  RewriteEngine On
  RewriteCond %{HTTPS} on
  RewriteCond %{HTTP_HOST} !^www\.
  RewriteRule ^(.*)?$ https://www.%{HTTP_HOST}/$1 [R=301,L]
</VirtualHost>
```


#解説
- ServerAlias: takahashi.localにアクセスが来ても、「ServerName www.takahashi.local」 が処理するようにする。
- RewriteCond %{HTTPS} on: httpsでアクセスされる。
- RewriteCond %{HTTP_HOST} !^www\.: ホスト部の先頭にwwwがない状態でアクセスされる。
- [R=301,L]: 恒久的なリダイレクト（R=301）。処理はここで終わり（L）。


###80番ポートでアクセスが来た際のリダイレクト設定
８０番ポート（http）でアクセスが来たら、有無を言わさず「https://www.takahashi.local」 へリダイレクトさせれば良いので、下記のようにRewritecondは書かなくてOKです。

```
<VirtualHost *:80>
  DocumentRoot "/var/www/html"
  ServerName www.takahashi.local
  ServerAlias takahashi.local

  RewriteEngine On
  RewriteRule ^(.*)?$ https://www.takahashi.local$1 [R=301,L]

</VirtualHost>
```

###443番ポートでアクセスが来た際のリダイレクト設定
ただし、４４３番ポート（https）でアクセスが来た時のリダイレクトされるパターンは、「wwwなし」かつ「https」なのでその条件式をRewritecondに書いてあげないといけません。

```
<VirtualHost *:443>
  DocumentRoot "/var/www/html"
  ServerName www.takahashi.local
  ServerAlias takahashi.local

  SSLEngine on
  SSLCertificateKeyFile /etc/httpd/ssl/key/www.takahashi.local.key
  SSLCertificateFile /etc/httpd/ssl/certs/www.takahashi.local
  SSLCertificateChainFile /etc/httpd/ssl/certs/www.takahashi.local-chain.crt

  RewriteEngine On
  RewriteCond %{HTTPS} on
  RewriteCond %{HTTP_HOST} !^www\.
  RewriteRule ^(.*)?$ https://www.%{HTTP_HOST}/$1 [R=301,L]
</VirtualHost>
```


#つまづきポイント
- Vhostsの設定ファイルにSSLの設定（SSLEngine等）を記載する場合、デフォルトのssl.conf内の証明書ファイルパスをコメントアウトするとApacheが起動しなくなる。
- Listen443の記載するファイルは１つのみ。複数の設定ファイルで記載すると競合してApacheが起動しません。
- RewriteEngine On を記載しないと、そもそもリダイレクト処理が動かない。
自作GUIクラスの仕様まとめ

これは[Siv3D AdventCalendar 2017](https://qiita.com/advent-calendar/2017/siv3d) 19日目の記事です。
#はじめに
Siv3DのGUIは、綺麗で細かい機能を持っており、サッと使う分にはスッと使えて具合がいいのですが、
ゴリゴリ使っていくとなると痒いところに手が届かない部分がけっこうあります。
（ScalableWindowに対応してないとか、キーボード・パッド入力できないとか）

そこで、自分用に汎用GUIクラスを作ったので、その仕様を紹介します。
#自作GUIクラス紹介
##Managerクラス
メニューの土台になるクラス。
以下のメンバ変数を持つ。
　Rect Base 
　　メニューの背景となるRect。
　Array\<Textクラス>
　　Textクラスの配列。他のBaseクラスからの派生クラスの配列も持つ。

以下のメンバ関数を持つ。
　void LoadCsv(CSVReader& csv)
　　CsvからGUI定義を読み込む
　void Update()
　　保持する全てのButton・ImageButtonの更新を行う。
　void DrawBase()
　　Baseを描画する。
　void Draw(String menuId)
　　引数で指定したMenuIdのメニューを描画する。
　void IsForcus(String menuId)
　　引数で指定したMenuIdのButton・ImageButtonが選択中かを返す。
　void OnClicked(String menuId)
　　引数で指定したMenuIdのButton・ImageButtonが決定されたかを返す。

##Baseクラス
メニューの各要素の基礎となるクラス。
以下のメンバ変数を持つ。
　String MenuId
　　各メニュー要素と一意に紐づくID。文字列でなくてもよい。
　Rect Rect
　　各メニュー要素の位置と大きさを保持する。位置はManagerクラスが持つBaseRectの左上頂点からの相対位置。

##Textクラス
Baseクラスを継承する。文字列の表示を行うメニュー要素。
以下のメンバ変数を持つ。
StringFontId　フォント名とフォントサイズをまとめたID。
String　Data　表示する文字列。Draw関数の引数に上書き文字列を追加できる。

##Imageクラス
Baseクラスを継承する。画像の表示を行うメニュー要素。
以下のメンバ変数を持つ。
Texture Texture 表示する画像。Draw関数の引数に上書き画像を指定できる。

##Buttonクラス
Baseクラスを継承する。ボタンの描画・管理を行うメニュー要素。
以下のメンバ変数を持つ。
String Data ボタンに表示する文字列。Draw関数の引数に上書き文字列を追加できる。
Array\<MenuId> JoinMenuId　隣接するメニュー要素のMenuId。上下左右キーの入力時に、どのメニュー要素に選択が移るかをIDで指定する。

ManagerクラスのUpdate関数内で、

##ImageButtonクラス
Baseクラスを継承する。Buttonクラスの画像版。
Texture Texture ボタンとして表示する画像。Draw関数の引数に上書き画像を指定できる。
それ以外はButtonクラスと同じ。

##使い方
以下のように使います。
以下のようなCSVを読み込む。


![image.png](https://qiita-image-store.s3.amazonaws.com/0/106059/b5e76029-3d68-2b26-fa01-9b86c11c768d.png)


```cpp:main.cpp
# include <Siv3D.hpp>


void Main()
{
	//CSVを読み込む。
	CSVReader csv(L"menu.csv");
	if (!csv) { std::wcout << L"CsvLoadError!" << std::endl; return; }
	
	MenuManager menu;
	menu.LoadCsv(csv);
	csv.close();
	
	const Texture texture(Image(L"Example/Windmill.png"));
	
	
	while (System::Update())
	{
		//更新
		menu.Update();
		
		//ボタンの入力を検出する
		if(menu.OnClicked(L"CloseButton")){
			return;
		}
		if(menu.OnClicked(L"ArrowButton")){
			std::wcout << L"Arrow!!" << std::endl;
		}
		
		//描画
		//各要素について描画を行う
		menu.Draw(L"ArrowImage");
		menu.Draw(L"TitleText");
		
		//描画時の引数で要素を上書きできる
		menu.Draw(L"DescriptionText",L"解説をここに書く");
		
		//ボタンも描画する
		menu.Draw(L"CloseButton");
		
		//ボタンも上書きできる
		menu.Draw(L"ArrowButton",texture);
	}
}

```
#まとめ
自作GUIクラスの仕様まとめでした。
このGUIクラスはいくつかの自作ゲームに採用しています。
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">C93：1日目東コ39b：てっかのおもちゃ箱収録　かべかけ工場<br>Factorioライクな工業ライン設計シムのα版を頒布予定です。α版なので要素は少ないけど普通に面白く仕上がったぞ。どうぞよろしくお願いします。 <a href="https://twitter.com/hashtag/Siv3D?src=hash&amp;ref_src=twsrc%5Etfw">#Siv3D</a> <a href="https://twitter.com/hashtag/gamedev?src=hash&amp;ref_src=twsrc%5Etfw">#gamedev</a> <a href="https://t.co/sHOEpfEr4C">pic.twitter.com/sHOEpfEr4C</a></p>&mdash; AiNI＠1日目コ－39b (@aini_bellwood) <a href="https://twitter.com/aini_bellwood/status/943099349105483777?ref_src=twsrc%5Etfw">2017年12月19日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
（ボタンっぽい部分やメニューっぽい部分は全部これ）
ソース綺麗にしたら公開するかも。
[Windows10]US配列の入力切替を Ctrl + Space に変更して楽になった

# 概要
Windows10 に AutoHotkey をインストールして，US配列の半角英数<->全角ひらがなの入力切替を **[Ctrl] + [Space]** でできるようにした．

# AutoHotkey
インストールと基本的な使い方はこちらの記事を参考にしてください：
[Windows10へAutoHotkeyの導入（キーマップの変更）](https://qiita.com/chr/items/47f50e36703d3bb20371)

# スクリプトの設定
US配列の半角英数<->全角ひらがなの入力切替は **[Alt] + [`]** で行われるので，**[Ctrl] + [Space]** と入力したときに同様の処理を行うスクリプトを作成した．


```settings.ahk
; 入力切替を [Ctrl] + [Space] へ変更
Ctrl & Space:: ; [Ctrl] + [Space] の設定
send,{Alt}{vkF3sc029} ; [Alt] + 半角/全角切替
return
```

ahkファイルをクリックすることによってスクリプトを実行できるが，既に AutoHotkey が起動済みの場合，タスクバーにある AutoHotkey を右クリックして「Reload this script」をクリックするとスクリプトを再び読み込んで実行することができる．

# まとめ
Windows10 において入力切替を [Ctrl] + [Space] でできるように変更した．

# 参考文献
- キーリスト, https://sites.google.com/site/autohotkeyjp/reference/KeyList#Key_ZenHan
- 「AutoHotKey」による作業効率化, http://ch.nicovideo.jp/Jinsichi/blomaga/ar455334
会社用PCと自宅PCが同じ日に壊れるの巻

# 不幸は重なる
会社PCは壊れるし、自転車盗まれるし、道端でこけて足痛いし、
最近ついてない。会社用PCは**Windowsのブートで失敗**。
自宅PCは**電源が入りすらしない**。

# 原因
会社用PCは常時ディスクIOが１００％に張り付いていて、放置してたらブートローダーがエラーを吐き出しました。自宅用PCは謎。急につかなくなりました。

# 学んだ単語をメモ
**どんな人も初めて聞いた単語が話の中で３つ以上でてくると思考停止すると思う**
理解しとけば良かったなー的な単語とその意味ををとりあえずメモ。

## 用語一覧

### UEFI
新型のBIOS的なイメージらしい。
セキュアブートとか新しい機能を享受できる。

### セキュアブート
OSはHDD、SSDからのみならずUSB、CD、フロッピーからでも起動可能です。セキュアブートを用いるとUEFIが起動プロセスに許可があるか確認してくれる。OKの時だけ起動してくれる。

### CSM（Compatibility Supported Module）
従来のBIOSをエミュレートして互換性を保つための仕組みらしい。
要はUEFIの古いヤーツ的な感じかな（レガシーBIOS）？
セキュアブートとのCSMを同時に有効化してはいけない。

|CSM|無効|
|:---:|:---:|
|Secure Boot|有効|

|CSM|有効|
|:---:|:---:|
|Secure Boot|無効|

### セーフモード
必要最小限のシステム環境でパソコンを起動する。
コマンドプロンプトぐらいなら開ける。
BIOSがかかってきている時にF8連打でおk。

### Windows PE
* 限られたサービスを提供する最小限のWin32オペレーティングシステム。
* セーフモード起動するために必要
* オペレーティングシステムが動作しないコンピュータの起動を助ける役目。
* なんかPC買って最初についてくるDVDについてるやーつ。

### Windows Boot Manager
参考のMSのドキュメント曰く、以下のようにPCは起動されるっぽい
①デバイスから電源ON
↓
②ファームウェアのブートローダーが呼ばれる
↓
③東芝とか富士通が作ったUEFIが呼ばれる
↓
④Windows Boot Managerが呼ばれる。

Windows Boot ManagerはMicrosoftが供給しているUEFIのことみたい

### BCD(Boot Configuration Data)
ブート構成データのこと。ファイルというよりもDBに近いみたい。
こいつがぶっ壊れたのが、会社PCが動かなくなった原因。
bcdeditでブート構成情報をバックアップ／リストア可能。

#　初投稿
疲れた。誰かのお役にたてればうれしいです。
社内にQiitaとか使ってもっとフィードバックしていきたい感はある。

#　参考
* https://docs.microsoft.com/en-us/windows-hardware/drivers/bringup/boot-and-uefi
Rails + Heroku 環境で、レコードのタイムゾーンがずれていることに気が付いた際に確認したいこと & リカバリ方法

Heroku としては DB のタイムゾーンは UTC としておくことを推奨しています。例えばユーザ環境が JST となる場合、保存時には -9時間 (UTC変換) し、表示時に +9時間 (JST変換) する形となります。

こちらは Heroku Postgres の例となりますが、 [How to change the Timezone setting for Heroku Postgres?](https://help.heroku.com/XKRPVR53/how-to-change-the-timezone-setting-for-heroku-postgres) でもデータベースのタイムゾーンは UTC に設定し、アプリケーションレベルでの変換を推奨しています。

以下、推奨される方法ではありませんが、元記事を残しておきます。

---

DB を直接参照した時に created_at が UTC になっていることに気がつくこと、よくありますよね。

## TL; DR

- heroku 使うときは `heroku config:add TZ=Asia/Tokyo` し忘れがちなので気をつけろ
- リカバる時は `heroku run bash` してから Rails Console 立ち上げろ

## まず確認するポイント

### time_zone, default_timezone

```ruby
# config/application.rb
config.time_zone = "Tokyo"
config.active_record.default_timezone = :local
```

こちらは問題なし。

### heroku config

```console
$ heroku config
=== app-name Config Vars
JAWSDB_URL: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
LANG: en_US.UTF-8
RACK_ENV: production
RAILS_ENV: production
RAILS_LOG_TO_STDOUT: enabled
RAILS_MASTER_KEY: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
RAILS_SERVE_STATIC_FILES: enabled
SECRET_KEY_BASE: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
```

TZ 設定忘れてますね...

## リカバリ作業

### 1. heroku のタイムゾーンを Tokyo にする

```console
$ heroku config:add TZ=Asia/Tokyo
```

### 2. ついでに LANG も変更する

```console
$ heroku config:add LANG=ja_JP.UTF-8
```

### 3. Heroku に SSH

```console
$ heroku run bash
Running bash on ⬢ app-name... up, run.6391 (Free)
```

### 4. Rails Console の立ち上げ

```console
$ rails c -e production
Loading production environment (Rails 5.1.4)
```

### 時間修正

```console
irb(main):001:0> tasks = Task.where("created_at < ?" , "2017-12-19 21:10:00") # ※1
=> #<ActiveRecord::Relation [#<Task id: 1, name: "洗濯", created_at: "2017-12-16 05:06:45", updated_at: "2017-12-16 05:06:45">, #<Task id: 2, name: "風呂掃除", created_at: "2017-12-16 05:06:58", updated_at: "2017-12-16 05:06:58">, #<Task id: 3, name: "トイレ掃除", created_at: "2017-12-16 05:07:04", updated_at: "2017-12-16 05:07:04">, #<Task id: 4, name: "電子レンジ掃除", created_at: "2017-12-16 05:07:16", updated_at: "2017-12-16 05:07:16">]>

irb(main):002:0> tasks.update_all("created_at = created_at + interval 9 hour")
=> 4

irb(main):003:0> tasks.update_all("updated_at = updated_at + interval 9 hour")
=> 4

irb(main):004:0> tasks.map{|t| Rails.logger.info "id: #{t.id}, created_at: #{t.created_at}, updated_at: #{t.updated_at}"}
I, [2017-12-19T21:17:52.254054 #8] INFO -- : id: 1, created_at: 2017-12-16 23:06:45 +0900, updated_at: 2017-12-16 3:06:45 +0900
I, [2017-12-19T21:17:52.254558 #8] INFO -- : id: 2, created_at: 2017-12-16 23:06:58 +0900, updated_at: 2017-12-16 3:06:58 +0900
I, [2017-12-19T21:17:52.254790 #8] INFO -- : id: 3, created_at: 2017-12-16 23:07:04 +0900, updated_at: 2017-12-16 3:07:04 +0900
I, [2017-12-19T21:17:52.254968 #8] INFO -- : id: 4, created_at: 2017-12-16 23:07:16 +0900, updated_at: 2017-12-16 3:07:16 +0900
=> [true, true, true, true]
```

※1 「1. heroku のタイムゾーンを Tokyo にする」 の実施時間より前の日時を `where` 句に指定すること

## 蛇足

`TZ` 設定し忘れがちなので、 Terraform 書いた
[tetsuya/kochiku-heroku](https://github.com/tetsuya/kochiku-heroku)
目指せ自動売買で800万円 : はじめに

# なぜ自動売買を始めるの?
現在26歳。
プログラマー歴、トレーダー歴共に6年目。

プログラマーとしては、どのレイヤーでもプログラムを書けるようになった。

一方トレーダとしてはまだまだ未熟。

為替/CFD/株式等様々な商品を々トレードしてきて、酸いも甘いも味わってきた。

トータルとしてはまだ数百万ほどプラスだが、取引に後悔することが多い。

トレンドフォローができない、売るタイミングを我慢できない。
我慢ができたら、今頃数千万円は余裕だっただろう。

そして今、税金の関係から2年以内に800万円をどうしても稼がないといけない。

トレーダーの世界ではすでに半分以上がAIによる自動売買。

であれば、勝負すべきはプログラマーとしてこれらのAIに勝てるかどうかだ。

長年自動売買について色々構想してきたが、社会人として落ち着いてきて今後どうなっていくかわかりかけてきた今こそ、自動売買を開始すべきタイミングだ。

# ゴールの設定
次の現金100万円の状態から、
自動売買で資産800万円を目指す。

# ゴールのために
### 自動売買ツールの選定

色々調べた結果、まずやるべきはMT4を使いこなすことであり、[楽天MT4](https://www.rakuten-sec.co.jp/web/fx/mt4/)を使いこなすことだ。

昔GMOの通信をハックしてAPIを作ったが、まずやるべきはMT4のAPIをマスターすること。

## 対象商品

発散するのはよくない。
まずはドル/円を極めよう。

## ToDo
**導入スプリント**
1. MT4のインストール
2. MQLのサンプルを作成の作成
3. MQLからデータ収集を行うプログラムを作成
4. MQLで2~3ロボットを作り、バックテストを実行
aタグから、アクセス権限外のファイルをダウンロードする [php, js]

# どんな状況のはなし？
例えば、サーバーが以下のような構成で、public_html配下が公開されているとする。

```
- server
    - public_html
        - html
            - document.html
        - js
            - document.js  
        - document.php
    - upload_data 
        - hoge.txt
```

ユーザーがブラウザからアクセスできるのは、public_html配下のみ。
すなわち、**JavaScriptではpublic_html配下しかアクセスできない**。

したがって、upload_data配下のhoge.txtにアクセスしたければ、**サーバー側のphpファイルを介す必要がある**。
本記事は、その方法をまとめよう！というもの

ちなみに、upload_dataディレクトリのように、非publicのディレクトリにファイルを置く手法は、ユーザーに直接アクセスさせたくない時に用いられる

# 具体的に何するの？

1. aタグで、phpファイル読込
2. phpで、サーバーからファイルをダウンロード
3. ブラウザがよしなにしてくれる

☆ユーザーの現在地： 「**/public_html/document.html** 」として話を進める

# 実装！
## 準備 〜ディレクトリ構成〜
先述のように、ブラウザのjsがアクセスできるのはpublic_html配下のみ。
なので、**ダウンロードを行うphpファイルをpublic_html配下に作成**しておく。

こんなかんじになる
*documentディレクトリ*を作成し、その下に*download.php*を作成した

```
- server
    - public_html
        - html
            - document.html  // ユーザーの現在地
        - js
            - document.js
        - document.php
        - document
            - download.php
    - upload_data 
        - hoge.txt
```

## html
``` document.html
<a href="../document/download.php"> hogeテキストファイルをダウンロード </a> 
```

## php

```download.php

<? php

//ダウンロードさせたいファイルのパス
$file_path = "/server/upload_data/hoge.txt";
 
//ダウンロード時のファイル名
$file_name = "hoge_test.txt";
 
//ファイルタイプの指定
header('Content-Type: application/force-download');
// ファイルサイズの取得
header('Content-Length: ' . filesize($file_path)); 
// ファイルのダウンロード及びリネームを指定
header('Content-disposition: attachment; filename="' . $file_name . '"');
 
//ファイルの読み込み（出力）
readfile($file_path);

?>
```

## 完成
aタグをクリックすると、ブラウザ上にダウンロードダイアログが出てくる！

# うっかりミスに注意
readfile()の前後に、`Logger::info()`や`echo()`があると、**それもファイルに書き込まれてしまう**
ちなみに、その文字はたいてい文字化けしてる

# 参考
[PHP 公式ドキュメント readfile](http://php.net/manual/ja/function.readfile.php)
[PHP 公式ドキュメント header](http://php.net/manual/ja/function.header.php)
[PHPでファイルをダウンロードする方法](http://www.flatflag.nir87.com/force-download-833#i-2)
Raspberry Pi で Node.js の aws-iot-device-sdk を使う

aws-iot-device-sdk は、ディフォールト の Node.js v0.10.29 では動きません。
私は、　v9.2.0 で動くことを確認しました。

環境は、次の通りです。

```text
$ which node
/usr/local/bin/node
$ node --version
v9.2.0
```

２秒毎に、数字をカウントアップして topic_1 に publish するプログラムです。
host 名は変更して下さい。
認証ファイルは、certs というフォルダーに入れました。

```js:iot_publish.js
#! /usr/local/bin/node
// -----------------------------------------------------------------
//	iot_publish.js
//
//						Dec/19/2017
// -----------------------------------------------------------------
// AWS IoT DeviceSDKの利用
var awsIot = require('aws-iot-device-sdk')
const deviceModule = awsIot.device


const device = deviceModule({
	region: 'ap-northeast-1',
	keyPath: 'certs/gw10005.private.key',
	certPath: 'certs/gw10005.cert.pem',
	caPath: 'certs/root-CA.crt',
	host: 'xxxxxxxxxx.iot.ap-northeast-1.amazonaws.com'
})

console.log("*** start ***")

var count = 0

// 通信確立した際に呼び出されるイベント
device.on('connect', function() {
	console.log('connect')
	setInterval( function()
		{
		count++
		const str_count = count.toString()
		console.log(str_count)
		device.publish('topic_1', str_count)
		}, 2000)
	})

// -----------------------------------------------------------------
```
GoogleAppScriptを使ってスプレッドシートをExcel形式で添付してメール送信する

この記事は [Wanoグループ Advent Calendar 2017](https://qiita.com/advent-calendar/2017/wano-group)の18日目の記事になります。

タイトルの通りです。

ビジネスの二大お荷物ツールであるところのメールとExcelを使った業務フローってまだまだありますよね。
そして、こういった業務フローを効率化したいという要望も同じくよくあります。

そんななか、Googleスプレッドシートには「メールに添付して送信」という機能があり、Excel形式（.xlsxファイル）を選択することもできます。
この機能をGoogleAppScriptから扱えれば！ということで調べた結果が当記事になります。

## xlsxファイルをエクスポートしてメールを送る関数

スプレッドシートオブジェクトとメールの送り先などなどを渡してやると、Excel形式で添付してメール送信をしてくれるという処理を関数にまとめました。

ところで、スプレッドシートオブジェクトには`getAs`というメソッドが用意されていて、PDF形式ならこれで取り出せるんですが、Excel形式は準備されていないんですね。
なので、前段で述べたような機能をそのまま実現できるAPIは用意されていないということになります。
その代わり、エクスポート用のURLが用意されているようなので、今回はこちらを使います。

```javascript
//
// スプレッドシートをExcel形式で添付してメール送信する関数
// 
// ssFile: スプレッドシートオブジェクト
// mailto: メールの送信先
// subject: メールのタイトル
// body: メールの本文
function sendEmailAsXlsx(ssFile, mailto, subject, body) {

  //スプレッドシートオブジェクトからIDを取り出す
  var fileId   = ssFile.getId();

  //Excelファイルの名前は適当に
  var xlsxName = ssFile.getName() + ".xlsx";

  //エクスポート用のURLはこちら
  var fetchUrl = "https://docs.google.com/feeds/download/spreadsheets/Export?key=" + fileId + "&amp;exportFormat=xlsx";

  //OAuth2対応が必要
  var fetchOpt = {
    "headers" : { Authorization: "Bearer " + ScriptApp.getOAuthToken() },
    "muteHttpExceptions" : true
  };

  //URLをダウンロード
  var xlsxFile = UrlFetchApp.fetch(fetchUrl, fetchOpt).getBlob().setName(xlsxName)

  //ダウンロードしたxlsxファイルを添付してメール送信
  MailApp.sendEmail(mailto, subject, body, {attachments:[xlsxFile]});
}
```

## 呼び出し例
```javascript
function createSpreadSheet() {

  //今回は新しくスプレッドシートを作成するところから
  var ssName     = "GASから作成";

  //ここで取得したスプレッドシートオブジェクトを先に作った関数の引数として使う
  var ssFile     = SpreadsheetApp.create(ssName); 

  //適当な値でセルを埋めてるだけ
  var sheet      = ssFile.getSheets()[0];
  var cell       = sheet.getRange('A1');
  cell.setValue(new Date());

  //setValueしただけだとスクリプトが終了するまで値が反映されない。なぜかこれを入れると反映されるというおまじない
  Logger.log(cell.getValue()); 
  
  //先の関数を呼び出して、メールを送信
  sendEmailAsXlsx(ssFile, "hoge@example.com", "メールのタイトルを入れて下さい", "メールの本文を入れて下さい");
}
```

後はテンプレートとなるスプレッドシートを用意しておいて、何かのアクションをトリガーにスプレッドシートをコピーしつつデータを入れ込みつつ、上記を呼び出せれば完成なんではないでしょうか。

以上です。
Vimのコマンドラインモードともう少し仲良くする

## はじめに

iRidge No1 Vimmerのlighttiger2505です
なおiRidgeでVimmerを名乗っているのは私だけなので、自動的に私が一位です。

Vimの操作に慣れてくると、まるで呪文だった`:w`やら`:q`やら`:e`といったVimのコマンドを覚える余裕ができてきます。
そうなってくると、これまでなんとなく`:`で遷移してきたコマンドラインモードもっともっと知りたくなってきます。
自然な流れですね。

なお今回の話はVim上で`:h usr_20`と入力すればより詳しい話があります。興味がある人は是非Vim上で打ち込んでください。

## コマンドを忘れがちなあなたに

人は物事を忘れるものです。これは仕方がないことです。
当然膨大な量を誇るVimのコマンド郡のことも忘れてしまいます。
忘れてしまったら、またGoogle先生にコマンドを調べる作業が発生します。大変な時間の損失です。

でも安心してください。コマンドラインモードにはそんなあなたを助ける機能があります。

### コマンドモードの履歴をたどる

履歴をたどることは重要です。なぜならよく使うコマンドの殆どは既に履歴にあるからです。
bashの`ctrl-r`は皆さん使っていますか？同じことがVimでもできます。

例えば`vimgrep`ですがこのコマンドはこういった規約になっています。
`:vim[grep][!] /{pattern}/[g][j] {file}`私はこの`{file}`の指定方法の
`**`とか`src/**`とか`src/views/*.py`とかものすごい忘れます。記憶力のなさには自身があります。

そんな時`:vim `と打ち込んだあとで矢印キーの上`<Up>`を押してください。
以前入力したコマンドの中から`:vim`を前方一致で絞った結果が出てきます。
`:vim src/views/*.py`とか復元されます。幸せ。

### コマンドモードの履歴を一覧で見る

でも`<Up>`で辿れないほどはるか昔に実行したコマンドも当然ありますよね。
そんなときは`:history`です。過去の履歴を一覧表示してくれます。

### コマンドラインウィンドウで履歴から即座に実行

さて上記を覚えれば履歴を快適に辿れます。ですがまだ不満がありませんか？
`<Up>`は一覧で見れないですし、`:history`は履歴を引用して実行できません。
そんなときは`q:`です。

`q:`を実行すればコマンドラインウィンドウが起動します。
コマンドラインウィンドウはこれまで実行したコマンドの履歴が表示されます。
その上ノーマルモードと同様のキーバインドで移動でき、
`i`でインサートモードに遷移もできます。
`/`で検索もできます。
要は通常のバッファーとほぼおなじ扱いになるのです。

使い方としては

1. コマンドラインウィンドウを開いたら目当てのコマンドを探します
1. 目当てのコマンドを実行する場合のそのまま`<Enter>`を押してください
1. ちょっと編集したいなら`i`でインサートモードに遷移して編集してください
  - 編集しても履歴が汚れることは無いのでご安心ください。
1. 編集できたらインサートモードのまま`<Enter>`を押してください。編集後のコマンドが実行されます

これまでの内容を覚えておけば必死にコマンドを覚えたり忘れるたびにGoogle先生に聞くこともなくなりますね。

## もっとコマンドラインモードを好きになりたいあなたに

さてデフォルトでも便利なコマンドラインですが、`.vimrc`をいじればもっと便利になるし、自分の手に馴染むようにカスタマイズもできます。

### 補完する

履歴と同様に重要なのが補完です。コマンドの一部さえ覚えていればコマンドを簡単に探すことができます。
コマンドを途中まで打ち込んでから`<ctrl-e>`を押してください。補完できます。

`<ctrl-e>`だと違和感がある`<tab>`が良いという方もいらっしゃることでしょう。
しかしコマンドラインモードで`<tab>`を押すと虚しく`^I`と入力されます。
そんなときは`:set nocompatible`です。これで`<tab>`補完が効きます

### 補完を見やすくする

さて上記をやってみた結果。貧弱な補完と思ったりしてませんか？
モダンなIDEであれば補完候補が一覧で見れてそこからチョイスできるのに...と

安心してください`wildmenu`があります。
`:set wildmenu`をしてみてください。補完候補がステータスメニュー上に一覧表示されます。素敵。

### コマンドラインモードのキーバインドをいじる

bashの操作に慣れているような人からするとコマンドラインモードのキーバインドは変に感じるかもしれません。
`<ctrl-h>`でバックスペースの代わりにならないし、`<ctrl-b>`や`<ctrl-f>`で前後の移動になりません。
Vimの標準に合わせろとスパルタンな方々はおっしゃると思うのですが、私は貧弱Vimmerなのでいじってしまいます。
`cmap`や`cnoremapbash`をいじることでbash同様の動きにしてしまします。

```vim
cnoremap <C-b> <Left>
cnoremap <C-f> <Right>
cnoremap <C-n> <Down>
cnoremap <C-p> <Up>
cnoremap <C-a> <Home>
cnoremap <C-e> <End>
cnoremap <C-d> <Del>
```

## 雑感

以前はコマンドやコマンドラインモードを全然覚える気がなくて、プラグインに頼りきりな私でしたが、
これらを覚えてコマンドラインモードが好きになってきました。
皆さんもいじってコマンドラインモードと仲良くなりましょう。
Windows向けテキストエディタの「かゆいところに手が届く」機能の実装状況

# この記事の説明
メジャーなテキストエディタであれば、頻繁に使用する機能はどのテキストエディタにも実装されています。
（例）：背景色や文字色を変更できたり、ある程度の正規表現を使えたり、改行コードや全角スペースを表示させたり……。

しかし、やや影が薄い、けれども便利な「かゆいところに手が届く」的な機能の実装状況はエディタによりまちまちです。
なので実装状況を比較してみることにしました。

※「かゆいところに手が届く」の定義は、とりあえず私がそう感じたものです。

# 実装状況の比較表

* o：対応
* x：非対応

||サクラエディタ 2.3.2.0|Mery 2.5.6|Notepad++ 7.5.3|Visual Studio Code 1.18.0|機能の説明|
|--------|--------|--------|--------|--------|--------|
|矩形選択|o|o|o|o|-|
|矩形選択してから入力したとき、各行に同じテキストが入力される|o|x|o|o|複数行の同じ位置に同じ文字列を挿入したいときにサクッと使えます|
|正規表現（後方参照）|o|o|o|o|正規表現を使った表現の一種です。<br>正規表現にマッチする文字列の一部分をあとから参照する表現です。<br>Visual Studio Codeは"\"ではなく"\$"を使う点がちょっと他と違います（Atomも"\$"のようです）。|
|正規表現（否定先読み）|o|o|o|o|正規表現を使った表現の一種です。<br>「ある文字列が含まれていない行」を検索するときなどに使用できる正規表現です。|
|スマートインデント時に「インデント」の一部とみなす文字を追加できる|o|x|x|x|普通のエディタだとタブ（\t）や半角スペース、せいぜい全角スペースくらいしか「インデント」の一部には含まれません。<br>しかしサクラエディタだと「インデント」の一部とみなす文字を自由に追加できます。<br>つまり、「*」や「-」や「+」を「インデント」の一部とみなすよう設定すれば、マークダウンのリストを書くときにこれらの行頭文字を自動的に入力してくれるので便利です。|
|独自のシンタックスハイライトを定義できる|o|o|o|o|独自のシンタックスを定義して独自のカラーリングを施す機能です。<br>オレオレシンタックスハイライトを作成したり、マークダウンをシンタックスハイライトしてくれないエディタで、してくれるように設定できたりします。<br>ほかの使い方としてはログファイルを読むときに「Error」や「Warn」といった文字列を含む行を目立たせるということもできます。<br>Meryは他と比較して自由度が低いようです。|
|トゥルーインライン入力|x|o|x|o|[Meryの作者のブログの説明](https://www.haijin-boys.com/software/mery/mery-2-4-0)の「トゥルーインライン入力に対応」を見ると分かりやすいと思います。|
|エアロスナップ後にタブを切り替えてもウィンドウサイズが変更されない|x|o|o|o|サクラエディタだと勝手に運動サイズが変更されるので不便です。|

気が向いたら調査対象のテキストエディタを増やしたり調査項目を追加したりします。
おわり。
wantedlyのコーポレートサイトをデザイン分析してみた

wantedlyのコーポレートサイト
https://wantedlyinc.com/ja

今回上記のサイトのデザインを分析してみました。
あくまで個人の意見なので、いろんな方の意見が聞けると嬉しいです。

## ターゲットのユーザー層
- おそらく20代後半から40代前半のエンジニア
- リクルート目的

## 配色
- 白、黒、グラデーション
- グラデーションに使っている配色を小見出しにも使うことで違和感を感じさせないような工夫があり、全体としての統一感も担保している
- ボタンが黒なので、白地の上だと目立つが、それに伴いIRニュースの小見出しに押せそう感が出てしまうので、良くない気もした

## 書体
- Poppins、Hiragino Sans
- 企業としてのきちんと感が出るようなフォント
- 堅実さを感じる

## レイアウト
- 会社として一番押すべきプロダクトの部分の見せ方に工夫がある
- 固めのサイトにグラデーションでより一層目立つようになっている
- 縦、左右対称混ざっているが、バランス取れているし、規則性がある
- 文字のジャンプ率はかなり高い→理念を一番目立たせるため
- 全体的に文字が全然ないし、余白はきっちり目に取られている
- ヘッダーの仕切りがないので、広々とした印象→会社としての余裕と勢いをアピールできる
- 斜めの線が重くなりがちなモノトーンを軽くしている
- 写真も縦にゆったりめ


## 感想
- 写真と文字がかぶるレイアウトかっこいい
Linux/bash：プロンプトの表示を変える方法備忘録

たまにいきなりプロンプトが変わって直そうとするけど絶妙な頻度なので忘れてる

# プロンプト

## 問題のプロンプトの表示
```
-bash-4.2$ 
```
.bash_profileが消えた・・？元々無かった・・？


## 期待するプロンプトの表示
```
[hoge@app1 ~]$
```
`[ユーザー名@ホスト名 カレントディレクトリ]$ `の書式



# .bash_profileに設定を書く
```vim:~/.bash_profile
PS1='[\u@\h \W]\$ '
```

|要素|説明|
|---|---|
|\u|ユーザー名を表示する|
|\h|ホスト名を表示する|
|\W|カレントディレクトリを表示する|
|$|admin権限のユーザーの場合は`#`、そうでない場合は`$`を表示する|

# 設定を反映させる
ログインしなおす

```
[hoge@app1 ~]$
```


期待通りの表示になった
Nim非同期I/Oを使う

初めまして。
今回初めてAdventCalenderを書くにあたって、この辺から適当にサンプル引っ張って来ます。

[Nim/tests/async](https://github.com/nim-lang/Nim/tree/devel/tests/async)


#### 動作環境
- Ubuntu 17.10
- Nim 0.17.2

[Module asyncfile](https://nim-lang.org/docs/asyncfile.html)

普通のファイル読み込みです。

```readfile.nim
import asyncfile, asyncdispatch, os

const log = "/var/log/mylog"

proc main() {.async.} =
  let file = openAsync(log, fmRead)
  let data = await file.readAll()
  echo data
  file.close()

waitFor main()
```
```
nim c --hints:off -r readfile.nim
```

FutureStreamを使う場合です。
ただし、ファイル終端に達した時点で終了する模様で、追加されたのを検知できなようです。
FutureStreamの定義がどこにあるのかわからず

```fsstream.nim
import asyncfile, asyncdispatch, os

const log = "/var/log/mylog"

proc main() {.async.} =
  var fs = newFutureStream[string]()
  let file = openAsync(log, fmRead)
  discard file.readToStream(fs)

  while not fs.finished:
    let (hasValue, value) = await fs.read()
    if hasValue:
      echo(value)

  file.close()
waitFor main()
```


AsyncSocketの使い方です。

[AsyncNet](https://nim-lang.org/docs/asyncnet.html)

```socket.nim
import asyncnet, asyncdispatch, streams, os, net

proc processClient(client: AsyncSocket) {.async.} =
  while true:
    let line = await client.recvLine()
    if line == "" or line == "\r\n":
      break

    echo line

proc serve() {.async.} =
  var server = newAsyncSocket()
  server.setSockOpt(OptReuseAddr, true)
  server.bindAddr(Port(8080))
  server.listen()
  
  while true:
    let client = await server.accept()
    asyncCheck processClient(client)

asyncCheck serve()
runForever()
```

以上です。
ちょっとずつ読むドメイン駆動設計 第四部 戦略的設計 第十四章 モデルの整合性を維持する4 コンテキストマップ

# これまでの十四章
- [第四部 戦略的設計 第一四章 モデルの整合性を維持する](https://qiita.com/YasuhiroKimesawa/items/6e8e5503a05ce9515a79)
- [境界づけられたコンテキスト](https://qiita.com/YasuhiroKimesawa/items/901ac764340275b93d61)
- [継続的な統合](https://qiita.com/YasuhiroKimesawa/items/6a58743c90c5b707c29d)

# コンテキストマップ

前回まで読んできた境界づけられたコンテキストを各々対応していても混乱しますよね。[虫の目だけでなく鳥の目](http://learningpatterns.sfc.keio.ac.jp/No19.html)の視点を得ることが必要。

そのためのコンテキストマップ。

例にあるように、手書きで書いてもいいし、Twitterでアドバイスいただいたのは、[RDRAのコンテキスト図](https://www.amazon.co.jp/dp/4798039446)です。

これを全員が把握すること。

# コンテキストマップで鳥の目を得る効果
## 境界がチーム編成に影響する

境界によるチーム分けはしやすく、結果、近くの人、会話をする人が自然と同じコンテキスト内にいることになるでしょう。

注意点としては、"誰々チーム"という呼び方はせず、**コンテキストに名前を付け**"○○コンテキスト"と呼ぶこと。**名前はユビキタス言語の一部にすること**です。

コンテキスト間の接続をする必要があることもあり、その議論のために業務に即したコンテキストの名前を使うことはとても有益です。

## 分派を発見したときの混乱を避ける

[分派](https://qiita.com/YasuhiroKimesawa/items/901ac764340275b93d61)が発見され、コンテキストを分けたり、サブシステムに切りわけることになってもコンテキストマップがあれば全体的な視点をもって取り組むことができます。

逆にコンテキストマップがない状態で、こういった問題に取り組むと、変更すべき全容が見えず危険です。

# コンテキスト間の接続
コンテキストの名前、コンテキスト間の関係が明らかになれば、あとはどのようにコンテキスト間でやり取りするかという問題になります。

書籍の例では、「経路選択サービス」と「ネットワーク走査サービス」間のモデルを変換する「予約ー運送ネットワークサービス」をコンテキスト間に作成しました。

このような例がこのあと何節かにわたってパターンとして登場しますので読んでいきます。

## コンテキスト境界でのテストは重要

別々のチームが接続するので、テストはとても重要。変換するための微妙な差異などの早期発見のためにも重点的にテストを書くのが原則です。
ただ、やることははっきりしているはずのなので、テストを書くこと自体は容易なはずですね。
Haskellや周辺ツールについてのリンク集

# なぜ書こうかと思ったのか
Haskellに関する情報（例えば関数型、モナド、圏論）はググればすぐ見つかります。ですがHaskellの周辺ツールに関する情報はなかなか見つかりません。なので今回はその周辺ツールの情報をまとめてみました。もし以下に挙げる周辺ツールのほかに周辺ツール、おすすめ参考資料があるなら教えてください。追記していきます。

# Hackage
- [Hackage](https://hackage.haskell.org/) : Haskellのパッケージ検索サイト
- [stackを使ってHackageにパッケージをアップロードする](https://www.ishiy.xyz/posts/2017-01-29-haskell-hackage.html) : Hackageへの簡単なアップロード方法

# Hoogle
- [Hoogle](https://www.haskell.org/hoogle/) : Haskell+Google
- [Hoogleの使い方（マニュアル翻訳）](https://qiita.com/mnozawa/items/15ac8494f3c5fa818de7) : Hoogleの簡単な使い方について
- [Hoogleをローカルで使う](http://yunomu.hatenablog.jp/entry/2012/03/02/231530) : Hoogleをローカルに使う方法。少し古いため```cabal install```を```stack install```に変えたり、```hoogle```コマンドの引数名が変わっていたりするので注意。
- [Hoogle検索をラクにするChrome拡張を作りました！](http://yu-i9.hatenablog.com/entry/hoogleswitcher) : 検索ソースとなるスナップショットを簡単に選択・追加・削除できるように設計されたChrome拡張によるHoogle検索窓

# Stack
- [The Haskell Tool Stack](https://docs.haskellstack.org/en/stable/README/) : 公式サイト
- [本気で Haskell したい人向けの Stack チュートリアル](https://qiita.com/waddlaw/items/49874f4cf9b680e4b015) : Stackの説明以外にもStackage(Stable Hackage)やHaddoc等についての解説もされている
- [Haskellのstackによるプロジェクトについて](https://qiita.com/ogata-k/items/2b21326b2b7351bfc28c) : この記事の著者が```stack new```してからの行動についていろいろ書いた記事
- [Haskellのビルドツール"stack"の紹介](https://qiita.com/tanakh/items/6866d0f570d0547df026) : Stackとは何か、について書いてある記事。```stack.yaml```についても書いてあります。
- [Stack: ビルドツール](http://qh73xebitbucketorg.readthedocs.io/ja/latest/1.Programmings/haskell/lib/stack/main/) : 少し古いですがstackの基本的な使い方を簡単に書いています
- [もうcabal hellは怖くない、Stackを使ってみるよ!](http://tune.hateblo.jp/entry/2015/07/13/034148) : ざっくりとしたStackの解説。
- [Haskellでポーカーを作ろう〜第七回 プロジェクトを整理するよっ〜](http://tune.hateblo.jp/entry/2015/08/03/023409) : それまでの回で作成したポーカーをプロジェクトに移植する回
- [これからのHaskellプロジェクトではcabalではなくpackage.yaml(hpack)を使いましょう](https://www.ncaq.net/2017/07/31/) : ```package.yaml```に関係するHpackの解説
- [Haskellプロジェクトを始めるにあたって](https://myuon.github.io/posts/haskell-project-setup/) : いろいろな種類のパッケージ追加についても書いてあるstackでプロジェクトを始めるための優良記事

# カスタムスナップショット
- [カスタムスナップショットの紹介](https://haskell.e-bigmoon.com/posts/2017-12-23-stack161.html) : stack 1.6.1の目玉昨日のカスタムスナップショットについて詳しく書いてあります。
- [Haskell Stack Tool の非公式日本語訳 カスタムスナップショット](https://lawtwai.gitlab.io/docs-haskellstack-jp/doc/custom_snapshots/) : この記事は題名通り和訳なので参考になります。

# リンク集へのリンク
[Haskell.org Documentation](https://www.haskell.org/documentation) : Haskellの公式が公開しているリンク集（英語）
[State of the Haskell ecosystem](https://github.com/Gabriel439/post-rfc/blob/master/sotu.md) : 各分野ごとのリンク集であって、その分野ごとにライブラリがリンクされている（英語）
[Haskell 俯瞰まとめ](https://github.com/lotz84/haskell/blob/master/docs/practical-haskell.md) : 様々な分野にわたるリンク集

# 終わりに
著者がブクマしているのを中心に挙げてみました。まだまだあるのでいいのが見つかり次第追記していくつもりです。
2017年度 Java 永続化フレームワークについての考察(まとめ)-1

#前ポスト
- [2017年度 Java 永続化フレームワークについての考察(1)](http://qiita.com/shiroma_yuki/items/8d434862bba072bff264)
- [2017年度 Java 永続化フレームワークについての考察(2) Doma2](http://qiita.com/shiroma_yuki/items/d0e3b319626f4278fc6f)
- [2017年度 Java 永続化フレームワークについての推測(3) Reladomo](https://qiita.com/shiroma_yuki/items/1e3d83202afa6cf5dbef)
- [2017年度 Java 永続化フレームワークについての考察(4) jOOQ](https://qiita.com/shiroma_yuki/items/1f64cac07afc745579a5)
- [2017年度 Java 永続化フレームワークについての考察(5) Iciql](https://qiita.com/shiroma_yuki/items/42e2cf97076c964e8629)
- [2017年度 Java 永続化フレームワークについての考察(6) Ebean](https://qiita.com/shiroma_yuki/items/283c89ad13f90e25c0d5)
- [2017年度 Java 永続化フレームワークについての考察(7) EclipseLink](https://qiita.com/shiroma_yuki/items/5eca0c61d4a7e7c54886)
- [2017年度 Java 永続化フレームワークについての考察(8) Hibernate5](https://qiita.com/shiroma_yuki/items/960905c5a8437bc1f09e)
- [2017年度 Java 永続化フレームワークについての考察(9) Speedment](https://qiita.com/shiroma_yuki/items/8aa74bcef92dd05e3b83)

#前置き
とりあえず中間結果となります。
まだ調査しきれていないので、後々追記します。

#対象
1. Doma2
1. jOOQ
1. Iciql
1. Ebean
1. EclipseLink
1. Hibernate5
1. Speedment

#環境
- PostgreSQL 9.6.3
- Java 64bit 8u144

#機能比較内容
1. スキーマ跨ぎ結合
1. DB跨ぎ結合
1. 複合主キー使用テーブルに対するテーブル検索
1. 複合主キー使用テーブルに対する結合
1. 取得カラム制限時処理
1. 件数制限付き取得
1. 生SQLの発行


#比較
|名称          | 1   | 2   | 3   | 4  | 5   | 6 | 7 |
|:-------------|:---:|:--:|:---:|:---:|:---:|:-:|:-:|
|Doma2         | ※1 | ※1 | ※1 | ※1 | ※1 | ○ | ○ |
|jOOQ          | ○   | ○  | ○   | ○   | ○   | ○ | ○ |
|Iciql         | ※1 | ※1 | ○   | ※1 | ？  |？ | ○ |
|Ebean         | ○   | ？ | ○   | ※2  | ？  |○  |○  |
|EclipseLink   | ○   | ？ | ○   | ※2  | ？  |○  |○  |
|Hibernate5    | ○   | ？ | ○   | ※3  | ？  |○  |○  |
|Speedment     | ○   | ○  | ○   | ○   | ○   |○  |×  |

○：可能
×：不可
？：確認しきれていません
※1: SQLを直接利用するためスキーマ、DB跨ぎでの問題は発生しないが専用Entityを作成する、あるいはSQL側の工夫が必要
※2: EmbeddedIdを使用した場合、カラム単位での結合方法が不明
※3: Hibernate5ではcomposite-idという名でEmbeddedIdを推奨しているが、※2同様にその際どのようにカラム単位で結合したら良いか不明
回転行列による演算をしてくれるレイヤーを作ってみる

そんなレイヤーがあったらいいなって、思ってね。

コードをgithubにあげました。
https://github.com/slowsingle/rotate_chainer

まずは以下の図をご覧ください。

<img src="https://qiita-image-store.s3.amazonaws.com/0/72509/9477a144-5008-ce0f-2a56-5cc8aea4ff6b.png" width=65%>

緑の点と赤い点が見えます。
この緑の点群に対してある回転行列を掛けて、ある並進ベクトルを足すと赤い点群と一致します。このときの$R$と$t$をDeep Learningのツールの1つであるChainerを使って解きたいと思います。

別にDeep Learningなど使わなくても解けたりしますが、まあ、たまにはレイヤーを使う立場から作る立場に立っても良いかな！　と思ったのでね。それに点群が増えたときは簡単にGPU化できることがメリットになりますし。

ちなみに、こういう点群同士のマッチングはSFMとかSLAMとかでよく使われます。

# 定式化

```math
Y = RX + t
```

上の図の緑の点群$X$(shape is (N, 2))、および赤い点群$Y$(shape is (N, 2))において、上の式を満たす$R$と$t$を求めれば良いのです。（Nは点群の数）

2次元の回転行列といえば角度$\theta$を用いて以下のように表されることはすでにご存知かと思います。

```math
R = 
\begin{pmatrix}
cos\theta & -sin\theta \\
sin\theta & cos\theta 
\end{pmatrix}
```

回転行列は2x2で、4要素ありますが、実質パラメータは1つです。つまり、回転行列には普通の2x2の行列（全結合層のパラメータ）ほどの自由度はないので、仮に全結合層をつなげて学習させた後の重み行列を引っ張ってきてもそれは回転行列から遠く離れた変換行列になっている可能性が高くなります。

では、次に勾配を求めたいと思います。chainerのbackward関数では以下の3つの行列およびベクトルを求めます。

```math
\frac{\partial{Y}}{\partial{X}} \hspace{20pt}
\frac{\partial{Y}}{\partial{\theta}} \hspace{20pt}
\frac{\partial{Y}}{\partial{t}} 
```

左からサイズは(2, 2), (N, 2), (1)です。
なお、計算すると以下のようになります。

```math
\frac{\partial{Y}}{\partial{X}} = R \\
\frac{\partial{Y}}{\partial{\theta}} = 
X{\frac{\partial{R}}{\partial{\theta}}}^T =
X{
\begin{pmatrix}
-sin\theta & -cos\theta \\
cos\theta & -sin\theta 
\end{pmatrix}}^T
\\
\frac{\partial{Y}}{\partial{t}} = 1
```

backward関数には引数として、

```math
\frac{\partial{L}}{\partial{Y}}
```

が与えられる（サイズは（N, 2））ので、

```math
\frac{\partial{L}}{\partial{X}} = \frac{\partial{L}}{\partial{Y}}R^T \\
\frac{\partial{L}}{\partial{\theta}} = 
sum(\frac{\partial{Y}}{\partial{\theta}} * \frac{\partial{L}}{\partial{Y}}) \\
\frac{\partial{L}}{\partial{t}} = sum(\frac{\partial{L}}{\partial{Y}}, axis=0)
```

が重みの更新として使われたり、入力層へ近いレイヤーへと伝搬していったりします。
$*$は要素積です。要素積を求めて、全部を足し合わせます。なので、サイズは(1)になります。

# 結果

あらかじめ回転角度および並進ベクトルを用意して、緑の点群に変換を行い、変換後の赤い点群を得ます。
次に、この2種類の点群から回転角度と並進ベクトルを推定し、緑の点群に変換を行い、青い点群を得ます。
赤い点群と青い点群が一致していれば推定成功というシナリオです。

<img src="https://qiita-image-store.s3.amazonaws.com/0/72509/defe58a8-05dd-4e99-b84c-b127679fe5ca.png" width=65%>

<img src="https://qiita-image-store.s3.amazonaws.com/0/72509/590f0bac-7459-6a69-d773-0905e29d88d6.png" width=65%>

良い感じに推定が上手くいきました！
ちなみに、青い点群と赤い点群を同時にプロットすると点同士が重なって片方の色が覆い尽くされて見えなくなります。
なんだよ、このバグは…とちょっと悩んだりもしたのですが、推定成功してたからなんですね。良かったよかった。

# 上手くいかない点群もある

角度は$0=2\pi$ですよね。それが悲劇を生むのでした。

点群（$X$や$Y$を指す）の座標値が大きいと、

```math
\frac{\partial{L}}{\partial{Y}}
```

の値が大きくなって、$\pi$を超える勾配が生まれることがあります。普通の重みであれば特に大きな問題にはならないのですが、たとえば勾配として$2\pi$という値が与えられ、学習率1.0で修正すると、角度空間上では何の更新もされていないことになります。$0=2\pi$ですからね。

場合によっては、修正したい方向と真逆の方向に角度の舵を取られてしまい、わけのわからない値に更新してしまうことがあります。

なので、基本的には$X$および$Y$は-1~1の範囲に収まるよう正規化するのがベストでしょう。
もちろん、レイヤーの中でそういう問題が起きないように正規化処理を加えるのも手です。これはFuture Workとしましょう。

# TODO

- 上記の正規化処理
- forward, backward関数のGPU化
- 3次元の回転にも対応させたい
- スケールも推定できるようにしたい（縦横比の違う点群同士のマッチングができる）
- 何か面白い使い道ないかなー
プログラミング初心者がBitcoinCore動かしてみる（インストール編）

#まえがき
この記事はプログラミング初心者でもBitcoinCoreを動かせるように書きました。私自身ブロックチェーンの勉強はしているのですが、プログラミング初心者なので初心者目線で書けることを書けたらと思っています。なおこの記事は『ブロックチェーン　仕組みと理論』（赤羽善治・愛敬真生、リッテレコム）の第１１章BitcoinCoreの通りに実行しながら、初心者にはわかりにくそうなところを書き加えています。Qiitaに投稿するのは初めてなので、本の内容をそのまま実行したヤツ載せて大丈夫か心配なのですが、ダメなら記事消すのでダメだろって言ってください。

環境：Windows10(ゲストOSとしてUbuntu 16.04.3)
#下準備
1.Ubuntuを導入。VirtualBoxをインストールし、仮想マシンを建ててUbuntuというOSを入れます。UbuntuはLinux系のOSです。導入で参考にさせてもらった記事
＝＞https://qiita.com/pyon_kiti_jp/items/0be8ac17439abf418e48

2.Gitをインストール。Gitは開発などで使う、ソースコードのバージョン管理システムです。これをインストールしないとGithubからソースを取り込むコマンドを打てないので。Ubuntuのデスクトップ画面の左側にアプリが並んでいるバーの一番上の渦巻きみたいなアイコンをクリックでアプリ検索出来るので、端末って検索して出てきたやつを起動。それはShell（シェル）といってコンピュータにキーボードで命令できるやつです。そこで今からコマンドを打ち込んでいきます。
（この後もいくつかインストールするものがあり、ルートユーザーのパスワードを聞かれることがありますが、Linux系のOSではパスワードを打っても黒点等表示されませんが、ちゃんと打ててるので、打つだけ打ってenter押して下さい。）

```shell
~$ sudo apt install git
```
---
#BitcoinCoreのインストール
コマンドの意味などはあまり考えずにこの通り書いていけば上手く行ってくれます。ちゃっちゃと済ませましょう！

1.ホームディレクトリに新規ディレクトリを作り、その中にGithubからbitcoinのソースコードを取得、格納します。(上から順にコマンド実行)
因みにsrcはソース(source)の略だそうで。

```shell
~$ mkdir src
~$ cd src
~/src$ git clone https://github.com/bitcoin/bitcoin.git
```
---
2.パッケージ・リストの更新

```shell
~/src$ sudo apt-get update
```
---
3.gccをインストール

```shell
~/src$ sudo apt-get install build-essential automake pkg-config libevent-dev bsdmainutils
```
---
4.OpenSSLをインストール

```shell
~/src$ sudo apt-get install libtool autotools-dev autoconf
~/src$ sudo apt-get install libssl-dev
```
---
5.Boostをインストール

```shell
~/src$ sudo apt-get install libboost-all-dev
```
---
6.libdb4.8をインストール

```shell
~/src$ sudo add-apt-repository ppa:bitcoin/bitcoin
~/src$ sudo apt-get update
~/src$ sudo apt-get install libdb4.8-dev
~/src$ sudo apt-get install libdb4.8++-dev
```
---
7.関連ライブラリをインストール

```shell
~/src$ sudo apt-get install libminiupnpc-dev
~/src$ sudo apt-get install libqrencode-dev
```
---
8.GUIライブラリをインストール

```shell
~/src$ sudo apt-get install libqt5gui5 libqt5core5a libqt5dbus5 qttools5-dev qttools5-dev-tools libprotobuf-dev protobuf-compiler
```
---
9.BitcoinCoreのビルド(結構時間掛かりました)

```shell
~/src$ cd bitcoin
~/src/bitcoin$ ./autogen.sh
~/src/bitcoin$ ./configure
~/src/bitcoin$ make
```
---
10.BitcoinCoreのインストール
これでBitcoinCoreのインストールが完了しました。

```shell
 ~/src/bitcoin$ sudo make install
```
---
ここからテストネットでBitcometCoreを起動しようと思ったのですが、VirtualBoxが起動できなくなり、いじくってたら仮想マシンが喪失してしまっていて導入しなおしか。。。という状況なのでここまでです。すいません。初心者の方のインストールの助けになればと思いますグヌヌ。
また実行編書きます。。。
Vagrant + Chefで構成するローカル開発環境のセットアップ作業メモ


## Vagrant環境作成

### Vagrantサーバ作成

* Vagrantサーバ用ディレクトリを作成

	```
	mkdir -p /your/vagrant/path/
	cd /your/vagrant/path/
	```

* Vagrantfile作成 & 設定

	```
	vagrant init
	vi Vagrantfile
	```

* サーバを起動してssh鍵を保存

	```
	vagrant up
	vagrant ssh-config --host HostName >> ~/.ssh/config
	```


## Rubyの設定

### rbenvセットアップ

* ローカルバージョンの指定

	```
	cd chef-repo
	rbenv local 2.4.3			#適当なVersion
	```

* bundlerインストール

	```
	rbenv exec gem install bundler
	rbenv rehash
	```

### Gemfile作成 & gemインストール

* [RubyGems](https://rubygems.org/)などから必要なgemを探す

	```
	rbenv exec bundle init
	vi Gemfile					#編集
	```

* gemインストール

	```
	rbenv exec bundle install --path vendor/bundle
	```

## Chefの設定

### セットアップ

* chefディレクトリをセットアップ

	```
	knife solo init chef-repo
	```

### Berksfile作成 & cookbook取得

* [Chef Supermarket](https://supermarket.chef.io/)などから必要なcoookbookを探す
	
	```
	vi Berksfile
	```

* cookbook取得
	
	```
	rbenv exec bundle exec berks vendor cookbooks
	```

## Git管理

* vendorディレクトリ以下は.gitignoreに記載しておくべし。

	```
	git init
	git add .
	git commit -m 'first commit '
	```
[jQuery]指定した要素に複数のクラスが存在するか調べる

jQueryで要素にクラスが存在するかどうかを知りたい場合、hasClass()を使います。
hasClass()は、指定したクラスに合致する要素があればtrueを、無ければfalseを返します。
しかし、複数のクラスを調べる場合には、注意が必要です。

例えば、「class1」と「class2」という2つのクラスを持つDIVタグがあった場合、

```html
<div class="class1 class2">
    //～～～
</div>
```

次のように、半角スペースで区切ってクラス名を列記することで判定することもできますが、

```javascript
if ($('div').hasClass('class1 class2')) {
    //～～～
}
```

指定するクラス名の順番が変わると、falseになってしまいます。

```javascript
if ($('div').hasClass('class2 class1')) {
    //～～～
}
```

というのも、指定する文字列が完全一致でなければならないためです。
厳密に調べるには、OR条件で指定することになりますが、クラスが3つも4つもあると、その分コードが冗長になってしまいます。

```javascript
if ($('div').hasClass('class1') && $('div').hasClass('class2') && $('div').hasClass('class3')) {
    //～～～
}
```

そこで、複数のクラスにも対応したhasClasses()を作成します。

```javascript:function.js
$.fn.extend({
    hasClasses: function(selector) {

        if (typeof selector == 'string') {
            selector = (selector.match(/^\./)) ? selector.replace(/^\./, '').split('.') : $.trim(selector).split(' ');
        }

        for (var i = 0, hit = 0, len = selector.length; i < len; i++) {
            if (this.hasClass(selector[i])) {
                hit++;
            }
        }

        return (hit === len);
    }
});
```

このhasClasses()を使うと、次のように複数のクラスを指定することができます。

```javascript
$('div').hasClasses('class1 class3 class2');

$('div').hasClasses(['class3', 'class2', 'class1']);
```

以上です。