OmniAICreator/Qiita-1.07M huggingface dataset:
Raspberry Piの開発メモまとめ

### 初期設定
1. [ssh設定](http://qiita.com/msrks/items/d9b48996e65d7fbdf0e7)
2. [vnc設定](http://qiita.com/msrks/items/9c3dd6aa340db8539bc3)
3. [python開発環境](http://qiita.com/msrks/items/f4489c553fb2492f6616)

### ネットワーク開発

1. [DHCPサーバー構築](http://qiita.com/msrks/items/21b48bc0fbb01de614b7)
2. [DNSサーバー構築](http://qiita.com/msrks/items/20207ea1bab05e6ffb93)
3. [NTPサーバー構築](http://qiita.com/msrks/items/8a816b32e513c43d248b)
4. [NTPクライアント設定](http://qiita.com/msrks/items/d6f7fa721399db4fe8d9)
5. [socket通信アプリ](http://qiita.com/msrks/items/0550603efc59f6e8ba09)

### サーバー開発 
1. [簡易デーモン作成](http://qiita.com/msrks/items/4816784e2d19fc90c872)
2. [定期実行サービス開発](http://qiita.com/msrks/items/6a180e03d7af622f2101)
3. [自動起動サービス開発](http://qiita.com/msrks/items/5201ae15d0e1f8de5946)

### その他アプリケーション（電子工作、AI、画像処理）

1. [電子工作](http://qiita.com/msrks/items/7de29c4294ce677e05a0)
2. 音声発話(執筆中)
3. [画像処理：リアルタイムエッジ検出](http://qiita.com/msrks/items/80bbfdcfa5f6a03c3b14)

### そのたTips

ホスト名の設定

```bash
$ sudo nano /etc/hostname #ここに設定したいhost名を書く
$ sudo nano /etc/hosts #raspberryをhost名に変える
```

画面がスリープしないようにする：`lightdm.conf`を編集

```bash
$ sudo nano /etc/lightdm/lightdm.conf
```

```bash:lightdm.conf
# don't sleep the screen
xserver-command=X -s 0 -dpms
```
Raspberry Pi 3でしておくと便利なネットワークの初期設定

無線でssh接続できる環境を作っておくと、省スペースで開発できて快適（モニター・マウス・キーボード不要）

## (追記) 0. 無線を有効にする

SSIDとPASSPHRASEを変えて、以下のコマンドを叩く。

```bash
$ sudo sh -c 'wpa_passphrase SSID PASSPHRASE >> /etc/wpa_supplicant/wpa_supplicant.conf'
```

## 1. sshを有効にする

ラズパイを起動して
・「スタートメニュー」->「Preferences」->「Raspberry Pi Configuration」
からsshを有効にする。

<img width="300" alt="スクリーンショット 2017-07-15 17.41.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/158680/802f4746-f16c-2c8e-5ac0-91bc85ad42d4.png">

## 2. 無線接続用に固定IPアドレスを設定する

```
$ sudo nano /etc/dhcpcd.conf
```

ipアドレスは適宜、修正して`dhcpcd.conf`の末尾に追加。

```dhcpcd.conf
interface wlan0
static ip_address=192.168.11.101/24
static routers=192.168.11.1
static domain_name_servers=192.168.11.1
```

必要に応じて有線のインタフェースも固定IPにする（デフォルトはDHCPで取得する）

```dhcpcd.conf
interface eth0
static ip_address=10.0.0.2/24
static routers=10.0.0.1
static domain_name_servers=10.0.0.1
```

### 3. 電源を切る

```bash
#$ sudo reboot
$ sudo shutdown now
```

**以降、モニター・マウス・キーボード全て不要で開発作業できる**
Common LispでSingletonなクラスを作る（CLOS）

# Common LispでSingletonなクラスをCLOSで書くとどうなるのか？

考えてみた結果以下のような感じになった。

```cl:singleton.lisp
(defpackage foo
  (:use cl cl-user)
  (:export foo
           get-instance))
(in-package :foo)

;; fooクラスを定義する。
(defclass foo () ())

;; +instance+にインスタンスを格納。（この時点ではコンストラクタは呼び出し可能）
(defvar +instance+ (make-instance 'foo))

;; 新しいインスタンスを作れなくするためにコンストラクタを呼び出せないようにする
(defmethod initialize-instance :around ((this foo) &key) 
  (error "can't create instance."))

;; インスタンスを取得するための関数を作る。（defunで定義された関数をstaticなメソッドのように使う）
(defun get-instance ()
  +instance+)

(in-package :cl-user)
```

なんだかすっきりしない形になった。
もっといい方法があれば教えてください。

# 追記（2017/8/19）

以下コメントで紹介していただいたものたち。
便利なものがありますね。

## Common Lisp

[cl-singleton-mixin](https://github.com/hipeta/cl-singleton-mixin/blob/master/cl-singleton-mixin.lisp)
[singleton-classes](http://lisp-search.acceleration.net/html/org.tfeb.hax.singleton-classes.html)

どちらもQuickLispから利用できる。

## Gauche

[singleton.scm](https://github.com/shirok/Gauche/blob/master/lib/gauche/mop/singleton.scm)

Gaucheは使ったことないのでよくわからないけどスレッドセーフなSingletonが作れそう。
自分用メモ

PHPとかデータベースとかあんまりわかってないし、Moodleもそんなに触りたくはないんだけど、自分が使う可能性のある部分だけメモ程度に。随時更新予定。

# テスト環境
- VMware Workstation 12 Player
- CentOS Linux release 7.3.1611 (Core)
- Moodle 3.3.1+ (Build: 20170804)
- XAMPP 7.1.7

# データベース

~~~
$DB->get_records('接頭辞を除いたテーブル名', array('フィールド名' => value);
~~~

# version.php
~~~
$pluguin->component = 'プラグインの種類_ぷらぐいん'
~~~
※languageのファイル名を"プラグインの種類_ぷらぐいん.php"にする。

# あ

~~~
$PAGE->set_title('ページ名');
$PAGE->navbar->add('ページ名', new moodle_url('index.php'));

echo $OUTPUT->header();

// いろいろ

echo $OUTPUT->footer();
~~~

~~~
$data = $DB->get_records(table_name, array(field_name => value);
foreach ($data as $key => $value) {
    print $value->表示したいフィールド名;
}
~~~
現場で個人的によく使うGitコマンドまとめ

# 概要

現場でGitコマンドごりごり触れていた時に、よく使っていたコマンドをまとめておきます。
備忘録用。

# リモートブランチにPUSHする前（コミット後）の最終確認

リモートブランチ含めて、自分が現在いるブランチを確認

```
git branch -a
```

コミット履歴を出力し、コミットメッセージを確認

```
git log --d
```

コミット内容の確認

```
git show
```

# 修正内容のバックアップ（stashで残す方法）

stashで残す

```
git stash
```

stashした内容を戻す

```
git stash pop
```

# 修正内容のバックアップ（パッチファイルで残す方法）

パッチファイルを作って残す

```
git diff > diff.patch
```

パッチファイルを適用する

```
git apply diff.patch
```

適用したパッチファイルを外す

```
git apply -R diff.patch
```

# mergeやrebaseを使わずにコンフリクト解消

これにより、マージコミットも作られず、コミット履歴がバラバラになるのを避けることができる。
ただし、コミットが1つの場合にのみ限る。

コミット履歴を出力し、該当のコミットIDを確認

```
git log --d
```

リモートの全ブランチを更新

```
git fetch --all
```

対象のリモートブランチを確認

```
git branch -r
```

リモートブランチをチェックアウト

```
git checkout [リモートリポジトリ名]
```

ローカルブランチとして一時的なブランチを作成

```
git checkout -b tmp
```

該当のコミットをIDを指定し、チェリーピック

```
git cherry-pick [コミットID]
```

元いたローカルブランチを作り直す

```
git branch -D [元いたローカルブランチ名]
git branch -m [元いたローカルブランチ名]
```
PythonでSocket通信

## socket通信

#### 1. socketを作る

- IP: socket.AF_INET
- TCP: socket.AF_INET, socket.SOCK_STREAM
- UDP: socket.AF_INET, socket.SOCK_DGRAM

#### 2. connectionを作る(TCPのみ）

- TCP server: bind, listen, accept
- TCP client: connect

#### 3. 送受信する

- TCP: send, recv
- UDP: sendto, recvfrom


## 例：TCP通信

googleのページをhttp getで取得

```python:tcp.py
import socket

client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(("www.google.co.jp",80))
client.send(b"GET / HTTP/1.1\r\nHost: google.com\r\n\r\n")
response = client.recv(4096)
print(response)
```

## 例：UDP通信

localserverに"12345"を送信。

```python:udp-client.py
import socket

client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
client.sendto(b"12345",("127.0.0.1",80))

data, addr = client.recvfrom(4096)
print(data)
```

## 例：TCPサーバー

ポート5000で待ち受けて、現在時刻を返す

```python:tcp-server.py
import socket
from datetime import datetime
from time import sleep

s = socket.socket()

port = 5000
s.bind(('', port))

while True:
    print('listening')
    s.listen(5)
    c, addr = s.accept()
    print('receiving')
    print(c.recv(4096))
    while True:
        print('sending')
        now = datetime.now().strftime("%Y/%m/%d %H:%M:%S")
        try:
            c.send(now)
        except:
            break
        sleep(1)
    c.close()
s.close()
```

```python:tcp-client.py
import socket
from contextlib import closing
import sys

s = socket.socket()

host = sys.argv[1]
port = 5000

#with closing(s):
s.connect((host, port))
s.send("hi")
while True:
    print host, s.recv(4096)
```
使っていきたいWebサービスのキーボードショートカット(Gmail、Trello、Github、Slack)

# 概要
普段から触る機会の多いWebサービスにキーボードショートカットが存在しているのですが、なかなか使いこなせていないので
自分への戒めも込めて、使っていきたいコマンドを各サービスから抜粋してまとめてみました。

# 便利なキーボードショートカット
## 各サービス共通
### ショットカットヘルプ表示
``` Shift+/ ``` or ``` command+/ ```

## Gmail
注: 下記のキーボード ショートカットを使用するには、キーボード ショートカットを有効にする必要があります。

### メール選択
```
x
```

### メール削除
```
#
```

### 既読にする
```
Shift+i
```

### 未読にする
```
Shift+u
```

## Trello
### ボードリストを開く
```
B
```

### 検索ボックスにフォーカスを移動
```
/
```

### カードをアーカイブ
```
C
```

### カードの絞り込みメニューを開く
```
F
```

### 自身をカードの担当に追加・削除
```
Space
```

### 自身が担当カードだけに絞り込み
```
Q
```

## Github
### PRに移動
```
g の後に p
```

### issueに移動
```
g の後に i
```

### Wikiに移動
```
g の後に w
```

## Slack
### チャンネル検索ボックス表示
```
command+k
```

### ダイレクトメッセージ表示
```
command+Shift+k
```

### 絵文字挿入
```
: の後に Tab
```

### お知らせ追加挿入
```
a-Z の後に Tab
```

### チャンネルリンク挿入
```
# の後に Tab
```

### 最後のメッセージを編集
```
↑
```

### 右メニューを閉じる
```
command + .
```

# あとがき
Webサービスには便利なショートカットが用意されていることが多いので、ここでまとめた以外のコマンド、サービスで キーボドショートカットヘルプから使えるコマンドを増やして作業効率アップを目指したい！！
IPv4アドレス切替用バッチファイル

GUIでIPアドレスを切り替える作業はもう嫌だぉ…

```bat
@echo off
set IFNAME="ローカル エリア接続"
set IPADDR=192.168.1.123
set MASK=255.255.255.0
set GW=192.168.1.1
set DNS1=192.168.1.1
set DNS2=

net session >nul 2>&1
if %errorLevel% equ 0 (
  netsh interface ipv4 set address name=%IFNAME% static %IPADDR% %MASK% %GW% 1
  netsh interface ipv4 set dnsservers name=%IFNAME% static %DNS1% primary validate=no
  if not "%DNS2%" == "" ( netsh interface ipv4 add dnsservers name=%IFNAME% %DNS2% index=2 validate=no )
  netsh interface ipv4 show addresses name=%IFNAME%
) else (
  echo IPアドレス変更を行うには「管理者として実行」してください
)
pause
```
作業手順メモ1

##NVIDIA Device Driverを再インストール
1コントロール＋ALT＋F1キーを押して、コマンドラインログインモードにする
user名とパスワードを入力
2 ```$sudo su ```
パスワードを入力
3 ``` $service lightdm stop ```
4 ```$/usr/local/Downloads/cuda_8.0.61_375.26_linux.run```
5 End User License Agreemetn が表示される
 Enterで一番下まで行って　`accept`
6 Do you wish to continue? → `yes`
7 Install NVIDIA Accelerated Graphics Dricer for Linux-... ?  →　`yes`
8 Do you want to install the OpenGL librairies? →　`yes`
9 Do you want to run nvidia-xconfig? →　`yes`
10 Install the CUDA 8.0 Toolkit?→　`no`
11 Install the CUDA 8.0 Samples?→　`no`
12 ```$ reboot```
プログラマーのための３ステップ起業ガイドライン

# はじめに
- 企業にプログラマーとして雇われている
- フリーランスとしてプログラマーをやっている
- 学生でアルバイトでプログラマーをやっている

そんなあなたに僕が経験した中で一番確実な起業の方法をお伝えしたいと思います。

時給労働から抜け出す、鉄板の起業法でもあります。

軌道にのれば週15時間労働以下も可能です。

# 自己紹介
まずは自己紹介ですが、大学の学部時代（物理学科）にプログラミングと出会ってから、かれこれプログラマー歴17年になります。

大学の卒研で人工衛星の電波解析ソフトを開発したり、大学院（修士）では人工生命のプログラムを書いていました。その後、就職してSEとして働いていたのですが、入社６年目にして結婚＆子育てと長時間労働の両立が難しくなり、退社して、独立・起業して今に至ります。


# 【鉄板】３つの起業ステップ

## その１) ビジネスパートナーを探す

まずはじめに、中小企業や個人事業主の社長さんの知り合いを増やしていきます。

この場合は知り合いに紹介してもらう流れが一番よいです。そのような人脈がなければ異業種交流会など積極的に参加すればOKです。

ここでのポイントは、既存の事業でしっかりと儲かっている社長さんや個人事業主さんと知り合いになることです。

当然ですが、儲かっていない人と組むとその後の事業の成功確率がぐっと下がりますので要注意。

## その２) 人力業務をシステムで置き換える

社長さんと知り合いになったら、その会社の中で人力でやっている業務を聞き出します。

例えば、
- 同じような内容のメールを手入力で繰り返したくさん送っている
- 単純なPC入力作業を繰り返したくさんやっている
などなど

このような業務はその業界共通だったりするので、とりあえずその社長の会社にシステムを導入してうまく回れば、同じ業界にシステムが売れる可能性が高くなります。

システムが自分一人で開発できる規模なら、さくっと開発してあげましょう。

ここでのポイントは、システムの開発費用はもらわないことです。
あくまで自分の持ち出しで開発しましょう。これがビジネスの主導権を握る秘訣です。

ここで開発費を貰ってしまうとただの受託開発で終わってしまうので要注意です。


## その３) レベニューシェアで事業開始

さぁ、システムが完成したらとりあえずその社長さんに使ってもらいましょう。

問題なく稼働するようなら、そのシステムの販売開始です！

ここでのポイントは、システム販売の営業をプログラマー本人がやるのではなく、
ビジネスパートナーである社長さんや、代理店の人に売ってきてもらうことです。
アフィリエイターに売ってもらう手もありです。

プログラマーのあなたはシステムの開発・保守に専念しましょう。

もう一つのポイントは、システム販売の売上を折半でレベニューシェアにすることです。

50%はパートナーへ渡して、残りを自分が貰うようにすれば、売れば売るほど儲かる仕組みができます。


# 奴隷プログラマーから脱出しよう

システム開発の世界ではプログラマーやSEが人月単価で奴隷のごとく扱われ、ビジネスの主導権を握ることはまずないと言ってよいでしょう。

しかし、上記３つのステップを踏めば、人月単価の呪縛から逃れ、自分が開発したシステム販売の売上に比例した利益を手にすることができます。

プログラミングという素晴らしいスキルを持つ皆さんに、ビジネスの主導権を握ってもらい、より豊かなプログラマー人生を送って欲しいと願う今日このごろです。
rvenvでrubyのバージョンが変わらない時に試したこと

##なぜか変わらないバージョン
①インストールしているrubyのバージョンを確認

```
$rbenv versions 
* system (set by /Users/ユーザー名/アプリのあるディレクトリ)
  2.4.1
```

②バージョンを指定

```
$rbenv global バージョン名
```

③もう一度インストールしているrubyのバージョンを確認

```
$rbenv  versions 
 * system (set by /Users/ユーザー名/アプリのあるディレクトリ)
  バージョン名
```

なんでsystemのままなんだ。。。

**パスがおかしい系**の同様の記事も調べていたんですが、ちゃんと通っていたのでどうすればいいか悩んでいました。

※**↑まだpathを見ていない方は確認してみてください。**

参考：[最速！MacでRuby on Rails環境構築](http://qiita.com/narikei/items/cd029911597cdc71c516#bash_profile%E3%81%AB%E8%BF%BD%E8%A8%98)

##解決策

下のコマンドを入力したところ、自分のいたディレクトリではインストールした記憶のない(元々入っている)rubyを参照している。

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

推測ですが、systemのrubyを参照しているようだったので、下記を試してみました

####①$"rbenv local バージョン名"を指定

```
$rbenv local バージョン名
```

②もう一度切り替わっているか調べる

```
$rbenv  versions 
  system (set by /Users/ユーザー名/アプリのあるディレクトリ)
* バージョン名
```

③rubyのバージョンも確認

```
$ruby -v
バージョン名(同じバージョンが指定されていればOK)
```

いくらglobalでバージョンを指定しても、localで指定したほうが優先されるんだと思います。

そうじゃないと、バージョン管理出来ないですもんね。。。。

この解決策は他の記事で見つけられなかったので、書かせていただきました。

ひとまず、解決です。
sqlserverでテーブルを全部削除するスクリプト

制約を削除してから、テーブル削除する

```
-- 制約を全て削除する
DECLARE @sql NVARCHAR(MAX) = N''

SELECT @sql = @sql + N'
  ALTER TABLE ' + QUOTENAME(s.name) + N'.'
  + QUOTENAME(t.name) + N' DROP CONSTRAINT '
  + QUOTENAME(c.name) + ';'
FROM sys.objects AS c
INNER JOIN sys.tables AS t
ON c.parent_object_id = t.[object_id]
INNER JOIN sys.schemas AS s
ON t.[schema_id] = s.[schema_id]
WHERE c.[type] IN ('D','C','F','PK','UQ')
ORDER BY c.[type]

-- PRINT @sql
EXEC @sql

-- 全テーブルを削除する
EXEC sp_MSforeachtable @command1 = "DROP TABLE dbo.?";

COMMIT;
```
CSSでボタンを作成する

# 目的
以下のボタンを作成する

![button.png](https://qiita-image-store.s3.amazonaws.com/0/174554/24e0ea91-a198-ed17-a0fc-7801829b0de5.png)
# コード
```indexl.html
<!DOCTYPE html>
<html lang="ja">
<head>
	<meta charset="UTF-8">
	<style type="text/css">
		body {
		    margin: 0;
		    background: #e0e0e0;
		    text-align: center;
		    font-family: Verdana, sans-serif;
		}
		#btn {
			width: 170px;
			height: 30px;
			margin: 0 auto;
			padding: 7px;
			font-size: 20px;
			border-radius: 5px;
			cursor: pointer;
		    background: #00aaff;
			box-shadow: 4px 4px 0 #0088cc;
			}
		#btn:hover {
			opacity: 0.8;
		}
	</style>
</head>
<body>
	<div id="card">
		<div id="card-front"></div>
		<div id="card-back"></div>
	</div>
		<div id="btn">BUTTON</div>
	</body>
</html>
```
###  margin: 0 auto;
「margin: 0 auto;」を記述する事で、ボタンを中央揃いにする事ができます。
第1引数の0は上下、第2引数のautoは左右の幅を指定します。
第2引数をautoで指定した場合、左右等分のmarginが算出され、ボックスは中央に配置されます。



# 参考
http://kojika17.com/2012/08/margin-of-css.html
https://techacademy.jp/magazine/9355
Go言語でパス情報から拡張子なしのファイル名を取り出したい

パス情報から拡張子を除去したファイル名を取り出したい！
具体的に言うと以下のようなケースです。

> /path/to/file.name.hoge.name から **file.name.hoge** だけ抜き出したい

こういう場面に遭遇したのですが、ピタリとはまる例を見つけられなかったので書いてみました٩( 'ω' )و

※ mattnさんにコメントでいただいた処理で修正しました！

```GetFileNameWithoutExt.go
package main

import (
	"fmt"
	"path/filepath"
)

func main() {
	paths := []string{
		filepath.Join("path", "to", "file.name.hoge.name"),
		filepath.Join("path", "to", "file.name"),
		filepath.Join("path", "to", "file"),
	}

	for _, path := range paths {
		filename := getFileNameWithoutExt(path)
		fmt.Printf("%s -> %s\n", path, filename)
	}
}

func getFileNameWithoutExt(path string) string {
	// Fixed with a nice method given by mattn-san
	return filepath.Base(path[:len(path)-len(filepath.Ext(path))])
}
```

実行結果は以下のようになります。

```bash
$ go run GetFileNameWithoutExt.go
path\to\file.name.hoge.name -> file.name.hoge
path\to\file.name -> file
path\to\file -> file
```

やっぱりGo言語って面白いですね。

簡単に始められてパワフル、そして奥が深い。。
学び始めてそろそろ1年が経ちそうですが、初心に返ってバイブル片手に修行し直しています。
もっと頑張るぉ～٩( 'ω' )و

> [プログラミング言語Go (ADDISON-WESLEY PROFESSIONAL COMPUTING SERIES)](https://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E8%A8%80%E8%AA%9EGo-ADDISON-WESLEY-PROFESSIONAL-COMPUTING-Donovan/dp/4621300253)
JAVAを最新版に1.8.0_144にアップデートする（ウェブからダウンロードして更新する場合）

# 全オペレーティング・システム用のJavaのダウンロードからダウンロード

https://www.java.com/ja/download/manual.jsp

OSを選択して、インストーラーをDL。手順に従えば最新版に更新できる。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/192219/44a63256-8a19-fc80-ab3f-cfa663e1213d.png)

インストーラを起動する。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/192219/c0c685de-1474-bcd2-8686-9891da087240.png)


画面の手順に従いインストールする。


Windows Power Shell （または コマンドプロンプト）を起動し、『java -version』と入力する。

下記の様に出力される。目的のjava versionになっていれば成功。

--
java version "1.8.0_144"
Java(TM) SE Runtime Environment (build 1.8.0_144-b01)
Java HotSpot(TM) Client VM (build 25.144-b01, mixed mode)

--

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/192219/5c5b3695-66ee-b944-6ff8-c13be0e37602.png)


Java SE Development Kit 8 Downloads

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/192219/7e41b855-0c46-6e52-1328-4c90bb4bc1df.png)

Java SE Development Kit 8u144　も併せてDLしてインストール。
jdk-8u144-windows-x64.exe (環境に合わせてダウンロードするファイルは異なります。)

インストールの状況は下記のようになっていればOK。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/192219/d87aee5e-1379-ebde-7c56-30f2b590c0cb.png)


以上
Spring Web MVC @RequestBody で空のリクエストを受けるには

`@RequestBody` には required 属性があって、そのデフォルト値は true です。

例えば以下のような API が定義されていて(リクエストをそのまま返す API です)、これに対して「空」のリクエストを送った場合、デフォルト値のままだと、`org.springframework.http.converter.HttpMessageNotReadableException` が発生します。

```java
@PostMapping(path = "/hogehoge",
  consumes = "text/plain; charset=UTF-8",
  produces = "text/plain; charset=UTF-8")
@ResponseBody
public String execute(@RequestBody String body) {
  return body;
}
```

`@RequestBody(required=false)` とすることで、空のリクエストも処理できるようになります。ちなみに空のリクエストの場合、body には null が入ります。

- Java 8
- Spring Web MVC 4.3.6
rails s -p $PORT -b $IPするとPG::ConnectionBadが出たとき

# 状況
PG::ConnectionBad
could not connect to server: Connection refused Is the server running locally and accepting connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?
![Screenshot_1.png](https://qiita-image-store.s3.amazonaws.com/0/171266/17c0c15e-b548-ce6b-adc2-ca970bfd2c84.png)

# 原因
- [x] postgresqlが動いていなかった

![Screenshot_2.png](https://qiita-image-store.s3.amazonaws.com/0/171266/c509cbbc-b94e-89b4-e884-e68338d25e96.png)

上のように `$ psql` を打ったときに「psql: could not connect to server: Connection refused」と出たのでpostgresqlが動いていないことがわかる。



# 対処
1. `$ sudo service postgresql start` を実行する
2. `$ rails s -p $PORT -b $IP` を実行する

![Screenshot_3.png](https://qiita-image-store.s3.amazonaws.com/0/171266/3ab006c9-5eee-2449-043c-62c401c7640c.png)
Microsoft Edgeが起動しない

結構苦労したので記載。

Windows10にてMicrosoft Edgeがいつの頃からか起動しなくなった。
Chrome, Firefoxは問題ないが Edgeを起動すると即座に終了してしまう。

レジストリの修正やキャッシュのクリア、 Power Shellからの sfc/scannow等も行ったが復旧せず。

結論としては 銀行系が配布している、無料ウィルス対策ソフト「Rapport（ラポート）」をアンインストールしたところ、復旧しました。

http://direct.bk.mufg.jp/secure/rapport.html

昔入れたときは問題なかったのだが、いつの間にかの WindowsUpdateから動かくなった模様。

別途トレンドマイクロを入れていたのでウィルスソフトが重なったのが原因かは不明。
【Intellij IDE】GUI で git rebase する方法

## 経緯

git rebase したいと思ったときに、
IntellijIDE 上でGUIで簡単にできるんだけど、どうやってやるんだっけなーと、
いつも思い出すのに時間がかかるのでメモする。

たいてい、コミットの移植元＆移植先を間違えて無駄に時間を費やす。。

## やりたいこと

あるブランチ（リモート・ローカルどっちでも）の先行コミットを、
自分が作業中のブランチにリベースしたい。

仮に

あるブランチ（リモートブランチ） → origin/dev
自分の作業中のローカルブランチ → local/dev

とする。

origin/dev ブランチからローカルブランチ local/dev を作成して作業を進めており、
origin/dev ブランチに他の人がコミットを push したから、
そのコミットを local/dev ブランチに持ってきたい。リベースで。
というシナリオ。

以下、時系列のコミットの流れ
※（）内はコミット

origin/dev (A)→(B)→(D)
                ↓ 作成
local/dev  (A)→(B)→→→→(C)

上記の要な場合に、(D)コミットをリベースして

local/dev  (A)→(B)→(D)→(C) にして、origin/dev に push したい。

## 手順

（１）コミットを持っていきたいブランチ（リベース先）に移動する

　　　画面右下のブランチ選択から local/dev を選んで ▶ Checkout

（２）コミット元のブランチ（リベース元）からリベースを実行

　　　画面右下のブランチ選択から origin/dev を選んで ▶ Rebase onto

これで、終わり。
とても簡単。

確か、インタラクティブモードになってて `Rebase onto` 選んだ後に、
リベースするコミット選ぶ画面とか出てきたような。
またリベースする機会があれば、追記する。

コンフリクトするようなときにあまりリベースしないので、
コンフリクトしたパターンの操作手順は今回は触れません。

以上
Pythonにおけるisと==の使い分け

Python歴もやっと1年くらいになったのですが、今更ながら、比較演算子の `is` と、 `==` を明確に区別できてなかったことに気づきました。自分への戒めのために記載。

## 1. 整理
`is` は、Object Identity
`==` は、Object Equality

である。
Object Identity はその名の通り、同一のオブジェクトかどうかの判定を行う。

一方、`==` については、 `__eq__` メソッドと同一の実装であり、
例えば、異なるオブジェクト間でも、文字列が一致するかどうか、などの判定を行う。
https://docs.python.org/3/reference/datamodel.html#object.__eq__

```.py
a = 'hoge'

print(a.__eq__('hoge'))  # True
```




## 2. Usage

```.py
a = None

if a == None:
    print('Not good')
```

に対して、PEP8に準拠すると、下記がアラートされる。
 `E711 comparison to None should be 'if cond is Nond:' `


これは、Noneのようなsingletonに対しては、Object Identityでの同一性を比較すべきと言っている。
なので、下記のように書くのが望ましい。


```.py
a = None

if a is None:
    print('Good')
```

けれど、Noneであることを特に明示する必要が無い場合は↓のほうがPythonic。
（3. 余談にも書いてます）


```.py
a = None

if not a:
    print('Good')
```



また、例えば、下記のように文字列比較に `is` を使ってしまうと適切に評価できていないので、
文字列が一致する、といったような比較を行いたい場合には、 `==` を使う必要がある。
（あと、文字列比較の場合には unicode か str かについても、気をつけた方が良い）

```.py
a = 'hoghoge'

if a is 'hogehoge':
    print('This is not called!')
else:
    print('This is called!')
```

## 3. 余談
`if a:` 

というif節もPythonではよく使われる。

これは、 

`if a is not None:` 

とは異なり、aが、

- `False`
-  `[]`
-   `None`
-   `''`
-   `0`

のいずれとも異なる、という意味になる。

明示的にこれらとの比較をした方が良い場合には、

`if a is not <比較対象>:`

そうでない場合には、

`if a:`

でOK。

## 4. まとめ
用法をよく理解して、正しく、Pythonicなコードを書きましょう。
証明書に関する各種操作

## opensslのインストール
証明書に関する操作は主にopensslコマンドを利用するので、無ければインストールしておくこと。

```bash:コマンド
yum install openssl
```


## 秘密鍵にパスフレーズが設定されているか確認する
パスフレーズが設定されている秘密鍵は、例えばhttpdサービスとかだと起動時にパスフレーズを聞かれる。
その場合、いろいろと対処の必要が出てくるので事前に確認しておく。

```bash:コマンド
openssl rsa -in {秘密鍵ファイル}
```

パスフレーズが設定されていなければ実行結果は次のようになる。

```shell-session:実行例
# openssl rsa -in sample.key
writing RSA key
-----BEGIN RSA PRIVATE KEY-----
英数記号の羅列...
-----END RSA PRIVATE KEY-----
```



## 秘密鍵と証明書に不整合がないか確認する
大量の証明書と秘密鍵を扱うような業務をしていると、ファイルを取り違ってしまう危険性がある。
万が一そんなことがあるとマズいのでペアが取れているか確認する。

```bash:コマンド
test `openssl rsa -in {秘密鍵ファイル} -modulus -noout | openssl md5 | cut -c 9-` = \
`openssl x509 -in {証明書ファイル} -modulus -noout | openssl md5 | cut -c 9-`; echo $?
```
上記コマンドで`0`が出力されれば整合、`1`が出力されれば不整合となる。

```shell-session:実行例
# test `openssl rsa -in sample.key -modulus -noout | openssl md5 | cut -c 9-` = \
`openssl x509 -in sample.crt -modulus -noout | openssl md5 | cut -c 9-`; echo $?
0
```


## サーバー証明書なのか中間CA証明書なのかを判別する
サーバー証明書と中間CA証明書を両方渡されて、渡した側もどっちがどっちなのか分かっていない場合がある。
仕方がないので中身を見て判断する。もっと確実な方法があれば知りたい。

まずは証明書の中身を出力する。

```bash:コマンド
openssl x509 -text -noout -in {証明書ファイル}
```

サーバー証明書の場合、中身にそのサーバーのドメインが書かれている。

```shell-session:実行例(サーバー証明書)
# openssl x509 -text -noout -in sample.crt
X509v3 extensions:
  X509v3 Subject Alternative Name: 
    DNS:sample.com, DNS:sample.com　←このへんとか
  X509v3 Basic Constraints: 
    CA:FALSE
  X509v3 CRL Distribution Points: 
    ...
```

中間証明書の場合、中身に認証局の情報が書かれている。

```shell-session:実行例(中間CA証明書)
# openssl x509 -text -noout -in sample.crt
Signature Algorithm: sha256WithRSAEncryption
  Issuer: C=US, O=GeoTrust Inc., CN=GeoTrust Global CA  ←このへんとか
  Validity
    Not Before: Jun 11 22:02:59 2014 GMT
    Not After : May 20 22:02:59 2022 GMT
  Subject: C=US, O=GeoTrust Inc., OU=Domain Validated SSL, CN=GeoTrust DV SSL CA - G3
  Subject Public Key Info:
  ...
```


## PFXファイルから証明書ファイル類を取り出す
証明書が欲しいといったらPFXで渡された場合の変換方法。

```shell-session:
# openssl pkcs12 -in {PFXファイル} -clcerts -nokeys -out {証明書ファイル名}
# openssl pkcs12 -in {PFXファイル} -nocerts -nodes -out {秘密鍵ファイル名}
# openssl pkcs12 -in {PFXファイル} -cacerts -nokeys -out {中間証明書ファイル名}
```




---
## 調べたいことメモ

* 自己署名証明書の作成方法 
* 秘密鍵のパスフレーズ解除方法
MySQL　DATETIMEにミリ秒、マイクロ秒設定

# 豆メモ

MySQLのDATETIMEに小数秒設定したい

ついでいうと、デフォルトの値もちゃんと設定したい


- [MySQL :: MySQL 5\.6 リファレンスマニュアル :: 11\.1\.2 日付と時間型の概要](https://dev.mysql.com/doc/refman/5.6/ja/date-and-time-type-overview.html)


６桁マイクロ秒

```bash
 dt DATETIME(6) not null  default current_timestamp(6) on update current_timestamp(6)

```

バージョンはMySQL5.7

```bash

mysql> CREATE TABLE t1 (id bigint unsigned NOT NULL, dt DATETIME(6) not null  default current_timestamp(6) on update current_timestamp(6));
Query OK, 0 rows affected (0.02 sec)

mysql> insert into t1(id) values (1);
Query OK, 1 row affected (0.00 sec)

mysql> insert into t1(id) values (2);
Query OK, 1 row affected (0.00 sec)

mysql> select * from t1;
+----+----------------------------+
| id | dt                         |
+----+----------------------------+
|  1 | 2017-08-15 11:15:05.337048 |
|  2 | 2017-08-15 11:15:07.473981 |
+----+----------------------------+
2 rows in set (0.00 sec)
```

ちなみに、上記ミリ秒をJavaScriptに持ってくると

```js

var d = new Date('2017-08-15 11:15:05.337048');

d
Tue Aug 15 2017 11:15:05 GMT+0900 (JST)
```
railsでbcryptを使ってpasswordをsecureに扱う

# bcryptのインストール

## gemfileに記述

```ruby:gemfile
gem 'bcrypt'
```

## インストール

$ bundle installでインストール

# has_secure_passwordメソッド

bcryptをインストールすると、has_secure_passwordを設定できるようになる。これを通すとDBに暗号化された状態で保存される。このメソッドの中にpasswordのバリデーションが入っているためpasswordのバリデーションは記述しなくていい。

# カラムの変更

has_secure_passwordメソッドはpasswordカラムではなく、password_digestカラムに暗号化したpassを入れる。そのためpasswordカラムを作ってたらそれを削除し、password_digestカラムを追加しないといけない。

```ruby:change
def change
 add_column :users, :password_digest, :string
 remove_column :users, :password, :string
end
```

add_column :データベース名,:カラム名,:型

この後、rails db:migrateで反映。

# カラム変更による命名の変更はコードの方はしなくてよし

カラム名を変更したがコードの方でpasswordをpassword_digestに変更する必要はない。bcryptはpasswordをpassword_digestに変更する機能もあるのでそのままで良し。

# 認証にはauthenticateメソッドを

authenticateメソッドは暗号化されたpassと入力されたpassが一致しているのかをみてくれるbcryptに入っているメソッドです。

@user.authenticate("password")

で@userから取得したpassと引数のpassの照合をします。
Illustrator③画像と操作の注意点

業務を効率化するためのポイントやデザインのルールなどをまとめます。

#操作
##移動は移動ツールで行う（0.000px端数を出さない）
マウスでやりがちですが、要素を移動させるときは移動ツールで移動させましょう。
マウスでやると、要素の位置が0.0?pxでずれてしまうことがあります。
その要素をスライスするとピクセルブレが起きてしまうので、移動ツールで行いましょう。
※数値で指定して行くことに慣れるようにします
##左のツールパネルはショートカットキーで覚える
ほとんどがショートカットでできます。
全て覚えるのは難しいかもしれませんが、よく使う移動ツールや長方形ツールなどはショートカットキーで覚えておいたほうが効率的です。

#画像
##リサイズや切り取りについて
・スクショした画像は端に余白があった場合ちゃんと切り取ること
・画像名も整理してつける
・画像はちゃんと切り取る
・クリッピングマスクを使って画像のリサイズを行う
結構、当たり前のことなのですが、同じサイズで画像をリサイズしなくてはいけないのに
1pxとかずれちゃったりしがちなので、正確にリサイズできるよう心がけます

##スライスの手順
たくさんの画像を効率的にスライスする方法です。
【操作方法】
1,スライスというレイヤーを作る
2,正方形・長方形で画像を囲う
3,スライスレイヤーの名前とオプションキーを押して全選択→オブジェクト→レイヤー→作成
4,正方形・長方形は非表示にして書き出していく
これで、一度に画像をスライスできます。
※このスライスの注意点
Q：Retina対応にすべくアードボードのサイズを1000pxに変更して保存する→できない
原因：アードボードの領域が外枠を超えてしまうため、超えない数値までしかサイズを変更できない
解決策：アードボードを一時的に縮める
Q：全部同じサイズでスライスしたのに数枚だけ1pxずれる
原因：様々。例えばバージョンが違うイラレからデータを持ってきたり、アードーボードが整数じゃなかったり
解決策：フォトショップで直す（急ぎの場合や仕事での制作物じゃないときは無視する）、イラレ・スライスを調整する

###イラスト系
1,イラストはマスクをかけている可能性が高いのでまずダイレクト選択ツールで画像を広げてみる。
イラストが他にもある場合、サイズが異なっている可能性があるのでそれぞれのサイズでスライスしようと考えられる。
2,縦横の幅について
→widthはテキスト幅（コンテンツ幅）と同じサイズにする（サイトを作るときのことを考えたとき・余白をとるときのことを考える）
→heigthはバラバラだったとしても、上下の余白を統一してスライスする。
ワードプレスの場合imgにもpタグが入る。そのpには余白が付いているのでそれも計算に入れる。
3,できれば4の倍数に最終調整してスライスする
・本来はイラストに近い位置で切り出すがワードプレスなので設計のことをよく考えてスライスする
github,gitlab,bitbucketでの差分確認URLまとめ


人にコードの差分を共有する際に、よく利用するのでメモ。
2017/8/15時点での仕様なので、変更される可能性がある。

追記) 2019/5/15 githubのURLが変更されていたので修正。
コミットハッシュは2dots, branch比較は3dotsという仕様になっている。

| service | url |
|--------|--------|
| github | `https://github.com/<user>/<repo>/compare/<from>..<to>.`       |
|gitlab |`https://gitlab.com/<user>/<repo>/compare/<from>...<to>`       |
|bitbucket |`https://bitbucket.org/<user>/<repo>/compare/<to>..<from>#diff`       |

`<from>``<to>`の部分には、branch,tag,commitのハッシュのどれでも対応できる。レポジトリ比較の場合は、`<user>:<branch>`などで比較。
gitlabの場合は、ファイルの差分が上に出てくるのでスクロールしないとコードの差分が見れない。

詳細は、[GitHub Help](https://help.github.com/articles/comparing-commits-across-time/)のページ。


比較演算子が2dots/3dotsだったり、`#diff`が必要だったりと微妙な違いがあるので注意。
【GitHub】備忘録

GitHub超初心者の自分のための備忘録





#基本的なコマンド
###ローカルリポジトリの作成方法
とりあえずローカルリポジトリを作ってファイルを入れるところまでやってみる。

```
git init //初期化,初回だけ

git add file_name        //インデックスにファイルを追加　file_name の代わりに.でディレクトリ内の全ファイルをaddできる
git commit -m "comment"  //コメントをつけてローカルリポジトリにコミット

//ほかのコマンド
git reset HEAD
git reset HEAD file_name //間違えてaddしたものを取り消す
git commit -a            //変更のあったファイルすべてをコミット
git commit --amend       //直前のコミットを取り消す
git commit -v            //変更点を表示してコミット
```
もし -m "comment"を入れ忘れるとvimが起動するのでその時は

```
:q!
:wq
```
のどちらかをすぐに打ち込めば閉じる。gitの状態を確認するときは

```
git status
```
を利用すると現在の状態が確認できる。
###リモートリポジトリへの反映
まずはリモートリポジトリの情報を追加(これは1度やってあればその後は不要)

```
git remote add origin url //リモートリポジトリのurlを追加
```

ローカルリポジトリの内容をリモートリポジトリに反映させるには、

```
git push origin master
```
これでリモートリポジトリに反映完了。
ディレクトリをリモートリポジトリに入れるときも同様にやれば大丈夫。

もしpushがうまくいかなかったときは

```
git pull
```
```
git fetch
git merge origin/master --allow-unrelated-histories
```

```
git fetch
git rebase origin/master
```
のどれかで元に戻る。(はず)(ダメだったらその都度調べたほうがいいかも)

###いらないファイルの削除方法
もし間違えてファイルをpushしてしまった時(.gitignoreに書き忘れてた時)の対処法。

```
git rm file_name                //ファイル削除(ワーキングエリアからも削除される)
(git rm --cached file_name)     //ワーキングエリアからは削除せずにgit管理の対象外にする
git add .
git commit -m "comment"
git push origin master

```
次からのために.gitignoreにも追記しておく。


###終わりに
一応これだけできれば一人での作業では問題ないかなと思います
もし間違い等ありましたら、コメント等もらえると助かります！
typescript + d3.js v4でd3.select().transitionを機能させる

d3.js　ｖ４で詰まったのでメモ。

d3.js v4で機能がモジュール毎に分割されたが、DOMセレクト機能モジュールである `d3-select` をインポートしてDOMを選択した際、アニメーションを実行するtransitionメソッドを実行しようとすると

```
Uncaught TypeError: n.selector.transition is not a function
```
というようなエラーが出て実行出来ない。

v4からは `d3-transition`は分割されており別途importする必要がある。

```
import 'd3-transition';
```

としてimportしてやるとtranstionは機能する。

参照: https://github.com/tomwanzek/d3-v4-definitelytyped/issues/117
railsでgemをインストールする方法

# gemとは

gemとはrailsでよく使われる機能をパッケージ化したもの。

# gemfileとは

app/gemfileにgemの操作をするファイルgemfileがあります。ここにgemとバージョン名が記入されています。

# gemのインストール方法

## gemfileに名前とバージョンを記入

```ruby:gemfile
gem 'bcrypt'
```

## ターミナルでインストール

```ruby:rei
$ bundle install
```
railsでユーザーと投稿を紐付ける

前にポストしたユーザー機能と投稿機能の続き。今度はユーザーと投稿を紐付ける。大枠としてはポストのDBにユーザーのidカラムを準備し、誰が投稿したかを分かるようにする。

# postsテーブルにuser_idカラムを追加

* rails g migrationでファイルを追加
* マイグレーションファイルのchangeメソッドにカラムを追加する旨記載
* rails db:migrateでマイグレーションファイルを反映

# 投稿時にuser_idをDBに保存する

userの値が現在ログインしているユーザーのものになるようにする。

```ruby:test
def create
  @post = Post.new(
    content: params[:content],
    user_id: @current_user.id
  )
end
```

@current_user.idは下記で引っ張ってくる。これはapplication_controller.rbに記載し、どこでも使えるようにする。

```ruby:test
before_action :set_current_user

def set_current_user
  @current_user = User.find_by(id: session[:user_id])
end
```

# 投稿にユーザー名を表示したい時

```ruby:test
  def show
    @post = Post.find_by(id: params[:id])
    # 変数@userを定義してください
    @user = User.find_by(id: @post.user_id)
  end
```
@postにユーザー情報を入れ、そのユーザー情報のidを@userに入れる。今回は投稿に紐付いているユーザー名を表示なので投稿の情報からuser_idをひっぱり、それからuser情報をひっぱる。

# 投稿者だけが編集・削除ができるようにする

投稿者だけが編集できるようにensure_correct_userという現在のuser_idと投稿者のidが一致していないとはじくメソッドを作る。posts_controllerに作成する。どのcontrollerかはどのviewで制御するのかによる。controllerをまたぐ場合はapplicationで設定したほうが良さそう。

```ruby:post_controller
  def ensure_correct_user
    @post = Post.find_by(id:params[:id])
    if @post.user_id != @current_user.id
      flash[:notice] = "権限がありません"
      redirect_to("/posts/index")
  end
```
postクラスからuser_idをUserクラスから作ったcurrent_userからはidを取得しそれが一致していない場合、indexに飛ばすように設定。
ちょっとずつ読むドメイン駆動設計 まえがき2

# 対象的な3つのプロジェクト
1つ目は、ドメインを構築しなかったプロジェクト
2つ目は、鋭いドメインモデルを構築し、リリース後も維持され進化させていったプロジェクト
3つ目はドメインモデルは構築したが・・・

1つ目は典型的な失敗プロジェクト、2つ目はうまく行ったプロジェクト、3つ目はドメインを構築したものの失敗したプロジェクトの話です。

3つ目のプロジェクトで気になったのは以下の箇所。

> 開発者の役割を誤って分割したために、モデリングが実装から切り離されてしまい、進行中の深い分析が設計に反映されなかった。（まえがきより）

設計と実装で役割を分けてしまったためにモデルが実装に反映されなかったということ。
モデルと実装は切り離さず、役に立つモデルでないと意味がないことは序文でも触れられていたことでした。

これは自分の実体験ですが、とある金融系のプロジェクトに参加したときのことです。
完全に設計と実装を別のエンジニアが行うことになっていて、設計にはなんと、実装未経験のメンバーまで含まれていました。
また、ベテランそうな人たちの会話で「このプロジェクトはドメイン駆動設計は合わないよね」なんて話をしていましたが、金融系なんてドメイン駆動設計が合うど真ん中のプロジェクトじゃないかと思ったものです。

このプロジェクトはもう３年以上前に参加したプロジェクトでしたが、結果どうなったかは、、、ご想像にお任せします。（僕自身は3ヶ月限定のスポットで参加したのですぐに抜けました。。。)

『役割』もモデルと実装を分けない。
Python の venv を自動で有効(無効)化させたい

どうやって自動化するのが一般的なんだろうか？

仮想環境の名前は常に `.venv` であるという仮定。

```
$ python3.6 -m venv .venv
```

例えば `cd` にフックして自動化するとして、zsh のフックを使う場合は以下の様な感じで良いのだろうか？

```zsh
function chpwd_pyvenv() {
    cwd=$(pwd)

    while :
    do
        if [ -d "${cwd}/.venv" ]; then
            echo "Python venv found: ${cwd}/.venv"
            if [ "${VIRTUAL_ENV}" != "${cwd}/.venv" ]; then
                echo "Python venv activated: ${cwd}/.venv"
                source ${cwd}/.venv/bin/activate
            else
                echo "Python venv already activated: ${cwd}/.venv"
            fi
            break
        fi

        if [ "${cwd}" = "/" ]; then
            echo "Python venv not found: ${cwd}.venv"
            if [ -n "${VIRTUAL_ENV}" ]; then
                echo "Python activated venv deactivate: ${VIRTUAL_ENV}"
                deactivate
            fi
            break
        fi

        cwd=$(dirname $cwd)
    done
}

add-zsh-hook chpwd chpwd_pyvenv
```

[direnv](https://direnv.net/) や [zsh-autoenv](https://github.com/Tarrasch/zsh-autoenv) などのツールを使う方が賢いだろうか？もしくは [pyenv](https://github.com/pyenv/pyenv) と [pyenv-virtualenv](https://github.com/pyenv/pyenv-virtualenv) の様なツールを使うのだろうか？

Python 界のデファクトでスマートな解決策が知りたい。


2017/08/19 追記
----

fish shell の場合はイベントハンドラでやるのかな？

```fish:~/.config/fish/functions/auto_virtualenv.fish
function auto_virtualenv --on-variable PWD
    set cwd $PWD

    while true
        if [ -d "$cwd/.venv" ]
            echo "Python venv found: $cwd/.venv"
            if [ "$VIRTUAL_ENV" != "$cwd/.venv" ]
                echo "Python venv activated: $cwd/.venv"
                source $cwd/.venv/bin/activate.fish
            else
                echo "Python venv already activated: $cwd/.venv"
            end
            break
        end

        if [ "$cwd" = "/" ]
            echo "Python venv not found."
            if [ -n "$VIRTUAL_ENV" ]
                echo "Python activated venv deactivate: $VIRTUAL_ENV"
                deactivate
            end
            break
        end

        set cwd (dirname $cwd)
    end

end
```


参考
----

- [zsh-autoenvを使って、virtualenvの自動activate/deactivateを実現する - $shibayu36->blog;](http://blog.shibayu36.org/entry/2017/04/01/213621)
- [virtualenv-auto-activate-auto-deactivate](https://gist.github.com/Willyfrog/3226639)
- [virtualenv-auto-activate](https://gist.github.com/codysoyland/2198913)
- [pyenv/pyenv-virtualenv: a pyenv plugin to manage virtualenv (a.k.a. python-virtualenv)](https://github.com/pyenv/pyenv-virtualenv)
Macでbrowserifyで結合しているとcase-insensitiveなファイル名指定をしても、Macでコケなくて、Linuxに持って行った時にコケる現象が、たまに起きる。これをカジュアルにチェックしたい


# 状況説明
実行するbrowserifyコマンドです。

```
browserify src/js/client.js -o public/js/client.js
```

ソースファイルは`src/js/client.js`です。出力先は`public/js/`配下です。

例えば

```js
const viewModel = require('./view-model')
```

と書くべきところを

```js
const viewModel = require('./view-Model')
```

とtypoしてしまった時に、`browserify`を実行してもエラーは起きません。
macOSのファイルシステムでは`view-model.js`と`view-Model.js`は同一のファイルです。

Linuxでは違うファイルとして扱われます。
Linux上で`browserify`を実行すると`./view-Model`モジュールは見つかりません。失敗します。

# 実行環境

- Node.js v8.3.0
- browserify 14.4.0
- eslint 4.3.0
- eslint-plugin-import 2.7.0
- Docker version 17.06.0-ce, build 02c1d87
- node/alpine 8.3.0

# 作戦1 ESLint

ESLintでチェックできれば、Linuxに持っていく前に見つからないモジュールを検出できます。
[eslint-plugin-import/no-unresolved.md at master · benmosher/eslint-plugin-import](https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/no-unresolved.md)というESLintプラグインを使います。

`eslint-plugin-import`には`no-unresolved`というルールがあります。
このプラグインはimport構文用のプラグインですが、オプションで`require`関数にも対応します。

`npm i -D eslint-plugin-import`を実行してプラグインをインストールし、`.eslintrc`に

```
"import/no-unresolved": [
  2,
  { commonjs: true }
]
```

な、ルール定義と

```
"plugins": ["import"]
```

な、plugin定義を足してください。

`npx eslint src/js` を実行すれば、解決不能なモジュール名が含まれていないかチェックできます。

エディタがESLintに対応していれば、編集時点でエラーを検出できます。
Atomの場合は、[AtomLinter/linter-eslint: ESLint plugin for Atom Linter](https://github.com/AtomLinter/linter-eslint)を使います。

## 注意点: 定数以外のrequire関数の引数

次のように書いた場合は、エラーは検出されません。

```js
const path = './view-Model'
const viewModel = require(path)
```

`require`関数の引数に式や変数を入れるのはやめましょう。

ESLintで、`require`関数の引数が定数でないことを検出するには、[import/no-dynamic-require](https://github.com/benmosher/eslint-plugin-import/blob/HEAD/docs/rules/no-dynamic-require.md)を使います。

```
"import/no-dynamic-require": [2]
```

の、ルール定義を追加してください。

# 作戦2 Docker

ESLintの実行環境がない場合でも、Dockerを使えば、開発OS上にcase-sensitiveな環境を構築できます。

この例では、`package.json`の以下の設定がしてあります。

- `devDependencies`ブロックで`browserify`が指定
- `scprits`ブロックで`browserify src/js/client.js -o public/js/client.js`が指定


```Dockerfile
FROM node:alpine

RUN mkdir -p /app

COPY ./package.json /app/
WORKDIR /app
RUN npm install

COPY src /app/src
RUN mkdir -p ./public/js
RUN npm start
```

時間のかかる、依存npmパッケージのインストールと、`npm start`を分離するためにCOPYを２つに分けています。
実行頻度が低い時は、１つにした方がイメージサイズが小さくなると思います。


```
docker build .
```

で実行します。
成功すれば、正しくモジュール解決できています。

## ハマりやすい罠：Volume mountsではcase-sensitiveな環境は作れない

Volume mountsが使えれば、次のコマンドでビルドするより早く実行できるはすです。

```
docker run -it -v (PWD):/app node:alpine -c `cd app && npm start`
```

残念ながらVolume mountsを使うと、ファイルシステムはホストOSのままなのでcase-insensitiveになってしまいます。

[Volume mounts case insensitive - Docker for Mac - Docker Forums](https://forums.docker.com/t/volume-mounts-case-insensitive/18867)

「ハマりやすい罠」というか、一番最初に試してハマりました。
Xamarin.Mac （か Xamarin.iOS ）から netstandard2 を使用する方法

2017.8.15、 .NET Core 2.0 のリリースが正式にアナウンスされました。

<img width="885" alt="スクリーンショット 2017-08-15 7.12.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/46547/ef43e52e-da41-eb97-7705-f502ce11995f.png">
（[Announcing .NET Core 2.0](https://blogs.msdn.microsoft.com/dotnet/2017/08/14/announcing-net-core-2-0/)）

これに関して Xamarin.Mac のリード [Chris Hamons](https://medium.com/@donblas) 氏が自身のブログでこの記事を紹介してます。

[Xamarin.Mac and netstandard2](https://medium.com/@donblas/xamarin-mac-and-netstandard2-708a06890302)

まとめますが、オリジナル以上の情報はない（以下ぼほ元記事の翻訳です）ので、英語抵抗なければ元記事読んでください。

## 要約
* Xamarin.Mac （か iOS ）から netstandard2 ライブラリを使う場合、正式対応は d15–4 のメジャーリリースのため、いくつか問題があるかもしれない
* ただ、適切なパッケージをインストールして csproj を少しいじれば回避できる


## 具体的な回避策
1. d15–3（ Visual Studio の version 15.3） をインストールする
2. .NET Coreの[このページ](https://www.microsoft.com/net/download/core)から .NET Core 2 のパッケージをダウンロード/インストールする
3. 現状バグがあるので、 Xamarin.Mac (か iOS) の csproj を修正する

`<Reference Include="Xamarin.Mac" />`
の下に
`<Reference Include="netstandard" />`
を追加します。

iOSなら

`<Reference Include=”Xamarin.iOS” />`
 
です。

**同一 `ItemGroup` であることを注意してください。**

Xamarin.Mac .NET 4.5 Framework を選択している（ Xamarin.Mac Mobile Frameworkを選択してない）なら、

`<TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>` を一番上の `PropertyGroup` に追加してください。

（これは `UseXamMacFullFramework` の例です）

あくまでも正式リリースは次のメジャーリリースで、上記問題回避策も「とりあえずは動く状態にする」ものなので問題があれば[ここ](https://bugzilla.xamarin.com/index.cgi)に報告して欲しいとのことです。

そして上記のような回避策する必要がある原因はこれだそうです。

[Unable to build iOS project that references a NET Standard 2.0 library](https://bugzilla.xamarin.com/show_bug.cgi?id=58504)
色々アプリのアイディア公開

僕自身、アプリのアイディアは色々考えているが、それを公開しようと思う。
はっきり言って、アイディアを秘密にしておくみたいなケチなことしても意味ない。
別にアイディア盗んでもいいし、一緒にやりたいなら、一緒にやってもいい。
僕の価値のないアイディアを公開しようと思う。
では、一つ目から

●VRによる歯科恐怖症治療アプリ
これは、僕が一番作って欲しいアプリだ。米国の統計によれば、人口の７５パーセントが歯科恐怖症を経験したことがあり、９パーセントから１５パーセントが重度の歯科恐怖症だ。
歯科恐怖症、歯科治療を恐怖するあまり、歯科治療を忌避してしまい、口腔状態の悪化、緊急状態での歯科治療、場合によっては死亡することもある。
現在、恐怖症は除去できるといわれている。具体的には、曝露療法、恐怖の対象に自分自身を晒していくことによって、治療することができる。
VRによって、歯科治療をシミュレーションできれば、歯科恐怖症を除去できるのではと言うことだ。
例えば、他には、日本独自の文化、萌の文化を利用して、可愛い女の子に歯科治療してもらっている風景を観察できるアプリもいい。
結構、アニメ業界やゲーム業界は、自分のところに注目を集めるのに苦労すると思う。多分、「歯科恐怖が治る萌えゲーム」を作れば、世界的にも注目は集まると思う。認知行動療法の他の原理を利用しても、注目を集められるゲームは作れるかもしれない。
誰かやってみないだろうか

●ソースコードに注釈をつけるアプリ
これは、gitLabなどを改造すれば作れるかもしれない。例えば、ソースコードは、理解するのが大変だ。そして、理解した解釈を他の人に伝達するのも大変だ。
そこで、ソースコードに、コメントとは違う「注釈」をつけるアプリや拡張機能はどうだろうか？これは、コメントとは明確に違う、一番大きな違いは、コミットの必要がないことだ。システム自体を破壊する可能性のあるコミットは、あんまりやりたくない。
「注釈」をつけることは、簡単にできる。コミットの必要はない。
例えば、ソースコードの該当部分についての説明を、「注釈」として、ポストイットみたいに貼り付けるのである。それは、ソースコードを書いた人が貼り付けてもいいし、そのソースコードを読んだ人が、解読した内容を説明するために注釈にしてもいい。
図とかも加えられるといいかもしれない。
こういうのは、エンタープライズ用途が可能なので、意外と金稼げるかもしれない。

●クイズをツイートできるSNS
最後は、クイズをツイートできるツイッターみたいなアプリである。例えば、ある問題を出して、選択肢の形式で、正しいと思うものを選ぶ。正解しても不正解でも、「回答済み」と言う形で、ログに残る。
これは、例えば、センター入試の問題を練習するフレームワークとして使えるし、IT教育にも使えるかもしれない。
提示された正解が間違っているように感じたら、コメント欄に書いてもいいし、本人にダイレクトメッセージを送ってもいい。

と言うことで、アイディアが尽きてしまったので、こんなもんで終わります。
夏休みFortran祭り 日本！

#東洋平和

```
00000000000000000000000000000000
00000000000000000000000000000000
00000001111111111111111000000000
00000001000000000000001000000000
00000001000000000000001000000000
00000001000000000000001000000000
00000001000000000000001000000000
00000001111111111111111000000000
00000001000000000000001000000000
00000001000000000000001000000000
00000001000000000000001000000000
00000001000000000000001000000000
00000001111111111111111000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000110000000000000000
00000000000000110000000000000000
00001111111111111111111111110000
00000000000001111000000000000000
00000000000010110100000000000000
00000000000100110010000000000000
00000000001000110001000000000000
00000000010000110000100000000000
00000000100000110000010000000000
00000001001111111111001000000000
00000110000000110000000110000000
00011000000000110000000001100000
00000000000000000000000000000000
00000000000000000000000000000000
続行するには何かキーを押してください . . .
```
##ソース・プログラム

```fortran
    program Nippon_main
      implicit none
      integer, parameter :: nippon(*) = &
      [0, 0, 33553920, 16777728, 16777728, 16777728, 16777728, & 
       33553920, 16777728, 16777728, 16777728, 16777728, 33553920, &
       0, 0, 196608, 196608, 268435440, 491520, &
       737280, 1253376, 2297856, 4392960, 8586240, 20967936, &
       100860288, 402849888, 0, 0]
      print '(b32.32)', nippon
    end program Nippon_main
```
![tumblr_ly37366k5R1qapz6so1_1280.jpg](https://qiita-image-store.s3.amazonaws.com/0/44522/5d381639-2899-1ac2-aad7-3a8a2bf00396.jpeg)
仮想通貨のEthereumをマイニングしてみる

最近、仮想通貨が云々な記事を見かけて、ちょっと興味を持ったのがきっかけでマイニングをやってみた。
色々と調べてみたけど、投資額に見合う金額が回収できない！という記事ばかりだったので、
実は儲かるのを隠してんじゃないの？と気になったので試してみた。

# 環境

新規に購入する余裕は無かったので、デスクトップPCを使った

* Win 10 Pro
* i5-6500
* RAM 16 GB
* Geforce GTX 970

# マイニングツール

Claymore's Dual Ethereum+Decred AMD+NVIDIA GPU Miner (通称？ Claymore Dual Miner) 9.7

公式はこちら
https://github.com/nanopool/Claymore-Dual-Miner

この記事書きながら見たら 9.8 が出てた...

# ウォレット

マイニングしたものを入れる先が必要らしいので、 coincheck でアカウント作成。

Web からサクッと登録できるけど、本人確認のため簡易書留が送られてくるので、使えるようになるまで数日。
出金手数料とか、用途が各取引所で異なるようなので、本格的に使う方はご自身にあったものを。

# その他必要な登録

今回は Ethereum をマイニングするってことで Claymore Dual Minor の説明を見ると、Ethereum pool と Decred/Siacoin/Lbry pool というのが必要らしい。
そこで下の2つを使ってみた。

* Ethereum pool
  * ethermine.org https://ethermine.org/
* Decred/Siacoin/Lbry pool
  * supernova.cc https://dcr.suprnova.cc/index.php

いずれも手数料、送金限度額など制限があったりするので、こちらも本格的にやる方は色々と調べたほうが良い。
今回はお試しなので、軽く調べて良さそうな所にした。

# 設定

リリースバイナリを落としてきて解凍すると、複数の bat ファイルが用意されている。
今回は Ethereum のみマイニングするので ```start_only_eth.bat``` という bat ファイルがあるのでおもむろに編集。

先頭から
```
setx GPU_FORCE_64BIT_PTR 0
setx GPU_MAX_HEAP_SIZE 100
setx GPU_USE_SYNC_OBJECTS 1
setx GPU_MAX_ALLOC_PERCENT 100
setx GPU_SINGLE_ALLOC_PERCENT 100
```
と環境変数が並んでおり、なにやら全力で走りそうなのがわかるがそのまま。

最後に ```EthDcrMiner64.exe``` 実行行があるので、ここを編集
```
EthDcrMiner64.exe -epool <Ethereum pool のアドレス> -ewal <ウォレットのアドレス>.<任意の文字列> -epsw x -mode 1 -dpool <Decred/Siacoin/Lbry プールのアドレス> -dwal <worker 名> -dpsw <worker パスワード>
```

* Ethereum pool のアドレス
  * asia1.ethermine.org:4444 のように Ethereum pool のアドレス
  * ethermine.org だけでも結構な数がある
* ウォレットのアドレス
  * 0x で始まるアドレス
  * 40桁の16進数 (0x を含めるので 42 文字)
* 任意の文字列
  * 英数字なら何でも良さそうだけど Rig で始めるのが格好いいらしい
* Decred/Siacoin/Lbry プールのアドレス
  * worker を登録した supernova.cc だと stratum+tcp://dcr.suprnova.cc:3252
* worker 名
  * supernova.cc だと My Workers で追加すると右に出てくる Worker Login に書かれた文字列（グレーになってる部分も含む）
* worker パスワード
  * 上で追加した Worker Password の部分
  * supernova.cc では平文で見えてるんだけど、なりすまされてもお得だから平文で良いよねってことなんだろか...

ということで下のような行になる (ウォレットのアドレスや worker 名、パスワードは適当に伏せた)
```
EthDcrMiner64.exe -epool asia1.ethermine.org:4444 -ewal 0x0f66.Rig1 -epsw x -mode 1 -dpool stratum+tcp://dcr.suprnova.cc:3252 -dwal aaa.worker1 -dpsw password
```

# 実行

マウス操作ですらカックカクになるので心の準備をしてから、 ```start_only_eth.bat``` を実行。

カックカクでスクショ撮るのが厳しかったが、雰囲気が掴める程度には撮れたのでスクショ。
（黒で潰してる部分があるので、違和感があるかもしれないが...）

起動直後
![cmd1.jpg](https://qiita-image-store.s3.amazonaws.com/0/34850/33a7b3a5-fac5-9c26-38dd-5fad6888f245.jpeg)

設定が正しければ下のような感じになり、日時表示以降が延々と繰り返される感じになる
![cmd2.jpg](https://qiita-image-store.s3.amazonaws.com/0/34850/44a98c3a-e426-f9cb-a252-8f45d38047e9.jpeg)

# マイニング結果

ethermine.org は、 ```https://ethermine.org/miners/``` の後ろに 0x を除いた ウォレットのアドレスを入れると結果が確認できる。
反映されるまで15分ぐらい待った気がするが、1時間程度動かしてみて以下のような感じになった。

![result.jpg](https://qiita-image-store.s3.amazonaws.com/0/34850/99423e5c-3867-8e1b-4dc5-051bbbb14afd.jpeg)

0.00004 ETH って、単位間違ってんじゃないの？という結果に。
ethermine.org って 1 ETH から送金可能みたいなんだけど、この環境だと 25,000 時間ぐらいかかるってことかな...

これがどの程度の価値か気になる方は https://coinmarketcap.com/ とかで相場を見ると、ショボさがわかる。

# まとめ

少なくとも普段使いのPCで Ethereum のマイニングをやっても、投資額に見合う金額が回収できない。が正しいと思われる。

専用マシンを組むなり買うなり初期投資ガッツリできる人じゃないと厳しい世界なのかもしれない...

# 更新履歴
2017.08.15 新規作成
BeagleBone の Node.js （node-red）で BME280 を使うモジュール を公開しました

# BeagleBoneとBME280の接続
![IMG_1346.JPG](https://qiita-image-store.s3.amazonaws.com/0/124209/bf81b3c9-463c-7dc0-306a-0257cdacac6d.jpeg)
写真は別のセンサへの配線もあるために線の本数が多くなっています。
ブレッドボードの奥にある緑の基板がBME280が載っているものです。
BME280への電源供給はP9-3のVDD_3V3（右赤）とP9-45のDGND（黒）です。
P9-19をSCL（白）、P9-20をSDA（青）として使います。
SCLとSDAの信号線は10kΩの抵抗を使ってVDD_3V3へプルアップします。
BME280の近くでVDD_3V3とDGNDの間に1μFのバイパスコンデンサを入れます。
BME280のi2cアドレスは0x76となるようにします。

# rootでインストール
後ほどnode-redでも使うためにグローバルにインストールすると良いでしょう。

```
$ sudo su -
# npm -g install lsd-bme280
```

# テストプログラム
1秒毎に気温・気圧・湿度を表示します。

```test.js
var sleep = require('sleep');
var async = require('async');
var BME280 = require('lsd-bme280');
 
var bme280 = new BME280(0x76, '/dev/i2c-2');
 
async.forever(
    (callback) => {
        bme280.async_get_data((err, res) => {
            console.log(res);
            sleep.msleep(1000);
            callback(null);
        });
    }
);
```

# 実行（中断はCtrl-c）
```
# node test.js
```

# 結果
<img width="242" alt="スクリーンショット 2017-08-15 2.12.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/124209/e70a3f78-e99b-6c6c-5901-ea0026622da9.png">

# node-redで使えるようにする準備
/root/.node-red/settings.js を編集します。
functionGlobalContextの中に以下のように
bme280:require('lsd-bme280')を追加します。

```
    functionGlobalContext: {
        bme280:require('lsd-bme280')
        // os:require('os'),
        // octalbonescript:require('octalbonescript'),
        // jfive:require("johnny-five"),
        // j5board:require("johnny-five").Board({repl:false})
    },
```

そしてリブートすればnode-redのfunctionでbme280が利用できるようになります。

```
# reboot
```

# node-redで使う
次のようにノードを配置します。
<img width="547" alt="スクリーンショット 2017-08-15 20.22.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/124209/30d9d7a9-147a-46b5-5f4e-88013ca6f8d4.png">
functionの名前はbme280とし中身は以下のように記述します。

```
var bme280 = context.get('bme280');
if (!bme280) {
    var BME280 = global.get('bme280');
    context.set(
        'bme280',
        new BME280(0x76, '/dev/i2c-2')
    );
    bme280 = context.get('bme280')
}
bme280.async_get_data((err, res) => {
    var msg = {}
    msg.payload = res;
    node.send(msg);
})
return null;
```

この状態でデプロイしてtimestampの左側をクリックすると、その時の気温・湿度・気圧が次のようにデバッグ出力されます。

<img width="283" alt="スクリーンショット 2017-08-15 20.27.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/124209/0b90bc81-3bb8-dbed-a27a-51365699030f.png">

このようにjsonで出力されるので各値へは
気温：msg.payload.temp
湿度：msg.payload.humi
気圧：msg.payload.pres
で参照できます。

ダッシュボードを使って他のセンサやマイコンからの情報を表示してみたイメージ。
左縦の青色がBeagleBoneBlackでのBME280からの情報です。
<img width="1128" alt="スクリーンショット 2017-08-15 20.42.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/124209/35c379b8-b5c9-f43f-2f28-96ec63ce19bf.png">


# 参考
npm：https://www.npmjs.com/package/lsd-bme280
github：https://github.com/koki-ogura/lsd-bme280
LaravelMix + browserSyncでファイル編集時に自動リロードを行うための設定

Laravelのドキュメントを見ながら設定を行ったが、
全然設定内容が足りなかったので、実際に動作した設定内容を記載します。

(参考)
https://readouble.com/laravel/5.4/ja/mix.html
###■ドキュメントの内容
Laravelのドキュメントを見ると、以下の設定をするだけで自動リロードが出来るかのように記載されている。

```javascript
// webpack.mix.js
mix.browserSync('my-domain.dev');

// もしくは

// https://browsersync.io/docs/options
mix.browserSync({
    proxy: 'my-domain.dev'
});
```
しかし、これだけ記載した上で```npm run watch```もしくは```npm run watch-poll```してもそもそもファイルの編集自体読み取れていないようだった。

###■設定内容
browserSyncのドキュメントを見ながら必要そうな設定内容足しました。
(参考)
https://www.browsersync.io/docs/options

```javascript
mix.browserSync({
	host: 'homestead.app',
	proxy: {
	    target: "http://homestead.app",
	    ws: true
	},
    browser: "google chrome",
    files: [
       './**/*.css',
       './app/**/*',
       './config/**/*',
       './resources/views/**/*.blade.php',
       './resources/views/*.blade.php',
       './routes/**/*'
    ],
    watchOptions: {
      usePolling: true,
      interval: 100
    },
    open: "external",
    reloadOnRestart: true
});
```
この設定で```npm run watch-poll```を実行すると、
こんな感じのメッセージが出てくる。

```
[BS] Proxying: http://homestead.app
[BS] Access URLs:
---------------------------------------
       Local: http://localhost:3000
    External: http://homestead.app/:3000
 ---------------------------------------
          UI: http://localhost:3001
 UI External: http://homestead.app:3001
 ---------------------------------------
[BS] Watching files...
[BS] Couldn't open browser (if you are using BrowserSync in a headless environment, you might want to set the open option to false)
```

最後の行でブラウザをひらけなかった、と言われているが、自動リロードはちゃんと動作しました。
最初にブラウザでページを開く作業だけ必要。
ページを開くときは```http://homestead.app:3000```でアクセスする必要があります。
ここを```http://homestead.app```でアクセスすると自動リロード出来なかった。

本当はポート番号なしでアクセスしても自動リロード出来て欲しいのですが、、、、
やり方が分かったら追記します。

以上。