OmniAICreator/Qiita-1.07M huggingface dataset:
PackerでCentOS7のDockerイメージをつくってみた

templateなどの備忘録を。
vagrantではご不満な方がいるようだったが素のイメージだとなんも入ってない、
しかしDockerファイルちまちまいじってビルドするのがめんどくさすぎるから、
Packerで自分にとっては楽なAnsibleかまして作ろうかな～と作ったのだけども、
若干オプション弄り回さないとD-Busがどうのこうのとエラーが出たので書いときます。
以下のとおり、buildersのセクションにprivilegedとrun_commandを追加したのがD-Busのエラーの対処です。

```
{
  "variables": {
    "docker_hub_login_username": "",
    "docker_hub_login_email": "",
    "docker_hub_login_password": "",
    "docker_hub_repository": ""
  },
  "builders": [
    {
      "type": "docker",
      "image": "centos:centos7",
      "export_path": "packer-centos7-docker.tar",
      "privileged": "true",
      "run_command": ["-d", "-i", "-t", "{{.Image}}", "/sbin/init"]
    }
  ],
  "provisioners": [
    {
      "type": "shell",
      "execute_command": "sh -x {{ .Path }}",
      "scripts": [
        "scripts/centos/centos-first.sh",
        "scripts/centos/ansible-install.sh"
      ]
    },
    {
      "type": "ansible-local",
      "playbook_file": "provision/ansible/baseimage.yml",
      "inventory_file": "provision/ansible/hosts",
      "role_paths": [
        "provision/ansible/roles/baseimage",
        "provision/ansible/roles/zabbix22-agent"
      ]
    },
    {
      "type": "file",
      "source": "tests/centos7",
      "destination": "/tmp"
    },
    {
      "type": "shell",
      "execute_command": "sh -x {{ .Path }}",
      "scripts": [
        "scripts/centos/serverspec_cent7.sh",
        "scripts/centos/initialization.sh"
      ]
    }
  ],
  "post-processors": [
    [
      {
        "type": "docker-import",
        "repository": "{{user `docker_hub_repository`}}",
        "tag": "timestamp"
      }
    ]
  ]
}
```

とりあえずpost-precesorsのdocker-pushにはしっぱいしたのでdocker login＋docker pushを手動でやってました。

でてたエラー
（冒頭にかいたとおりprivilegedで特権指定とrun_commandでシェルをinitに渡すと出なくなったがマルチテナントでこれやるのはダメらしい。ホストOSへのwrite権限を渡すことになるためである模様。）

```
Failed to get D-Bus connection: Operation not permitted
```

参考
http://qiita.com/yunano/items/9637ee21a71eba197345
https://www.packer.io/docs/builders/docker.html#privileged

packerビルドするのはjenkinsかなにかのCIツールでやるとログの出力確認などがだいぶべんりです。
（GitのプラグインでcloneしてきてMaskPasswordプラグインで設定しといた変数を使ってます）

```
rm -f packer.zip
rm -rf .packer
curl -L -o packer.zip https://releases.hashicorp.com/packer/1.0.3/packer_1.0.3_linux_amd64.zip
mkdir -p .packer
(cd .packer && unzip ../packer.zip)

sudo $JENKINS_HOME/workspace/packer-build/$JOB_BASE_NAME/.packer/packer build \
  -color=false \
  -var "docker_hub_login_username=${DOCKER_HUB_LOGIN_USERNAME}" \
  -var "docker_hub_login_email=${DOCKER_HUB_LOGIN_EMAIL}" \
  -var "docker_hub_login_password=${DOCKER_HUB_LOGIN_PASSWORD}" \
  -var "docker_hub_repository=${DOCKER_HUB_REPOSITORY}" \
  $JENKINS_HOME/workspace/packer-build/$JOB_BASE_NAME/builders/docker-centos7-ansible-zabbix22.json
```

とりあえずpacker活用してみたかっただけで作ったイメージをどうやってつかうかはまだ何も考えていないというか巨大なのでたぶんテスト用かなーというところです。コンテナだと普通のOSイメージと違って1プロセス1コンテナみたいな流儀がちょっとよくわかっていないかも。
CentOSにansibleかましてzabbix2.2いれて全体で13分くらいでしたが、 更新すると毎回似たような時間かかるのでDockerfileでキャッシュさす最終行更新なら一瞬とかにはかなわないのかなあという印象でした。
Carshlyticsで missing dSYMsというエラーメッセージが表示される

swift3で作成したiOSアプリにCrashlyticsを導入してリリースした後、管理画面からクラッシュレポートを確認しようとしたら `It looks like we are missing dSYMs to process crashes for the versions below.` というエラーが表示されてクラッシュレポートが見れない状態になっていた。

<img width="669" alt="Crashlytics-management-screen.png" src="https://qiita-image-store.s3.amazonaws.com/0/143619/1ae6be73-9139-6183-8f4b-d286e9106dca.png">

ちょっと手間取ってしまいましたが、[stack overflowの回答](https://stackoverflow.com/a/37088169)を参考にして解決できたので、記録のために解決方法を書いていきたいと思います。

# dSYMsファイルのアップロード
クラッシュレポートが閲覧できない直接的な原因はdSYMsファイルをCrashlytics上にアップロードしていない事が原因でした。

### 1. iTunesConnectからdSYMをDL

[iTunesConnect]へ自分のアカウントでログインして、マイAppからアプリを選択 > アクティビティへと移動し、最新版のアプリのビルド番号をクリックします。

<img width="1279" alt="Screen_Shot_2017-09-15_at_9_56_52.png" src="https://qiita-image-store.s3.amazonaws.com/0/143619/18a06f05-3b7c-f8fe-9c4a-606fa8435f56.png">

ここで選択したビルド番号の詳細ページの中にある`dSYMをダウンロード`をクリックして`appDsyms.zip`というzipファイルをDLします。

<img width="1278" alt="Screen_Shot_2017-09-15_at_10_01_27.png" src="https://qiita-image-store.s3.amazonaws.com/0/143619/00e93af3-8983-89b7-eb98-de761cf3d1dc.png">


### 2. CrashlyticsへｄSYMファイルのzipファイルをアップロード

後は先ほどのCrashlyticsの管理画面へzipファイルをアップロードすればOKです。これでクラッシュレポートが確認できるようになりました。

<img width="704" alt="Screen_Shot_2017-09-15_at_10_08_26.png" src="https://qiita-image-store.s3.amazonaws.com/0/143619/1c56eb28-da96-92df-60b9-4dce1fb7741b.png">

# dSYMとは

dSYMについてちゃんと理解できていなかったので改めて調べる。

Appleのドキュメントにある[クラッシュレポートの分析](https://developer.apple.com/jp/documentation/IDEs/Conceptual/AppDistributionGuide/AnalyzingCrashReports/AnalyzingCrashReports.html)ではdSYMについて以下の様に触れられている箇所があります。

> 該当するビルドおよび.dSYMファイルを収容したアーカイブがあれば、Xcodeは自動的にクラッシュレポートをシンボル変換します。これは、メモリアドレスを、人が読んで理解しやすいシンボルに置換する処理です。

他にも色々調べて見ると、どうやらdSYMファイルを使うことで、アプリがクラッシュした際のスタックトレースが格納されたclashファイルをシンボル変換してくれるようです。(そういうもんだ。ってくらいにしか理解できていない。)
webpack入門2 ~Asset Management~

## はじめに
webpack入門その2です。今回は`Asset Management`ということでCSSのbundleをやっていきます。
前回のプログラムに変更を加える形で進めていきます。

## Setup
ページタイトルを今回の内容に合わせるマイナーチェンジを行います。
(やらなくても全然OKです)

```dist/index.html
<html>
  <head>
    <title>Asset Management</title>
  </head>
  <body>
    <script src="./bundle.js"></script>
  </body>
</html>
```

### Loading CSS
js以外をbundleするにはloaderと呼ばれるものが必要となりますので以下をyarnで追加します。

```bash
$ yarn add --dev style-loader css-loader
```

style-loaderとcss-loaderの役割はざっくり以下になります。

style-loader：cssをhtml上で読み込めるようにします。
css-loader：cssをjs上で読み込めるようにします。

```webpack.config.js
const path = require('path');

module.exports = {
  entry: './src/index.js',
  output: {
    filename: 'bundle.js',
    path: path.resolve(__dirname, 'dist')
  },
  module: {
    rules: [
      {
        test: /\.css$/,
        use: [
          'style-loader',
          'css-loader'
        ]
      }
    ]
  }
};
```

次にcssを追加します。

```src/style.css
.hello {
  color: red;
}
```

 次にindex.jsをcssインポートしてそのcssのクラスを使用するよう変更します。

```src/index.js
import _ from 'lodash';
import './style.css';

function component() {
  var element = document.createElement('div');

  element.innerHTML = _.join(['Hello', 'webpack'], ' ');
  element.classList.add('hello');

  return element;
}

document.body.appendChild(component());
```

これで準備完了です。ビルドしてみましょう。

```bash
$ yarn run build
yarn run v1.0.1
$ webpack
Hash: 16af218796ef6b52ac0c
Version: webpack 3.5.6
Time: 931ms
    Asset    Size  Chunks                    Chunk Names
bundle.js  560 kB       0  [emitted]  [big]  main
   [0] ./src/index.js 272 bytes {0} [built]
   [2] (webpack)/buildin/global.js 509 bytes {0} [built]
   [3] (webpack)/buildin/module.js 517 bytes {0} [built]
   [4] ./src/style.css 1 kB {0} [built]
   [5] ./node_modules/css-loader!./src/style.css 191 bytes {0} [built]
    + 4 hidden modules
✨  Done in 1.83s.
```

無事ビルドされました。
ブラウザで確認すると文字が赤くなっていたのでちゃんとスタイルが当たっているようです。
bundleされたソースを見てみるとcss部分は以下のようになっていました。

```dist/bundle.js
// module
exports.push([module.i, ".hello {\n  color: red;\n}\n", ""]);
```

以上でおしまいです。


## おわりに
今回のcssのbundleについてはこれで終了です。使うloaderとwebpack.config.jsに記述するところが重要だと思います。
画像も同じくbundleしてjs上で使えるようにできるみたいなので機会があったらやってみようと思います。
次は`Output Management`を進めます。
RaspBerryPi3で入力検知 (Pi4j)

#**１、入力検知**
　LEDへ出力ができたので入力も試しました。

　注意
　・私は電子機器については電圧=抵抗×電流がわかる程度の全くの素人です。

#**2、本題**
##　(1)接続
　プッシュボタン、220Ωの抵抗器、LEDを接続しています。
　①全体画像
　![image.png](https://qiita-image-store.s3.amazonaws.com/0/164812/185a2cf6-06b9-7754-f68b-14e843ed6a2c.png)

　②詳細
　![image.png](https://qiita-image-store.s3.amazonaws.com/0/164812/1101a773-b4be-a58f-3ae0-5d6abe256ba7.png)

##　(2)Raspberry piの設定
　シリアルを有効にすることで、ピンを制御できるようになります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/164812/6b8e44a3-9e95-87c5-cc8b-d4d1fab423d2.png)
##　(3)実行プログラム
　プッシュボタンを押すことで電圧が変わり検知されます。
　つまり押したとき、話したときに検知されます。

```java:Listener.java
import com.pi4j.io.gpio.GpioController;
import com.pi4j.io.gpio.GpioFactory;
import com.pi4j.io.gpio.GpioPinDigitalInput;
import com.pi4j.io.gpio.PinPullResistance;
import com.pi4j.io.gpio.RaspiPin;
import com.pi4j.io.gpio.event.GpioPinDigitalStateChangeEvent;
import com.pi4j.io.gpio.event.GpioPinListenerDigital;
public class Listener {
	/**
	 * @param args
	 * @throws InterruptedException 
	 */
	public static void main(String[] args) throws InterruptedException {
		int count = 0;
		final GpioController gpio = GpioFactory.getInstance();
		final GpioPinDigitalInput pin02 = gpio.provisionDigitalInputPin(RaspiPin.GPIO_00, PinPullResistance.PULL_DOWN);
		pin02.addListener(new GpioPinListenerDigital(){

			@Override
			public void handleGpioPinDigitalStateChangeEvent(
					GpioPinDigitalStateChangeEvent arg0) {
				// TODO 自動生成されたメソッド・スタブ
				System.out.println("検知");
			}
			
		});
		// TODO 自動生成されたメソッド・スタブ
		while(true){
			System.out.println("処理中:"+count);
			Thread.sleep(1000);
			count++;
			
		}
	}

}
```
##　(4)実行結果
　検知しました。

　①実行結果
>　処理中:0
 　処理中:1
 　処理中:2
 　処理中:3
 　検知　　　　　　←ここでプッシュボタン押下
 　検知　　　　　　←ここでプッシュボタン離す
 　処理中:4
 　処理中:5

 ②押下時の画像
![image.png](https://qiita-image-store.s3.amazonaws.com/0/164812/27faeb78-1e94-a27a-0f94-acabda53c6bb.png)


#**3、おわりに**
##　無事検知しました。入力ができればセンサなどの応用が利きそうなので楽しみです。

参考
[Pi4JでRaspberry pi3でのプッシュボタン認識サンプル](http://www.mmpp.org/archives/1437)
　参考にしてプログラム作成しました。
UIViewのalphaと当たり判定について

UIView(UIButtonを含む)自体のalpha値を0.01以下にすると、当たり判定で無視されます。したがって、その後のイベント処理がUIResponder系/UIGestureRecognizer系のいずれであっても、呼ばれません。

この[ドキュメント](https://developer.apple.com/documentation/uikit/uiview/1622469-hittest
)には、0.01"未満"のalphaを持つviewが無視されると書かれています。しかし、実際に挙動を確認すると、0.01"以下"の場合に無視される結果になります。ドキュメント上の“This method ignores view objects that are hidden, that have disabled user interactions, or have an alpha level less than 0.01. “の部分は、“less than or equal to 0.01”と修正されるべきです。あるいは、SDK実装が修正されるべきだと思います。

ちなみに、透明なUIViewについてhitを取得したい場合、背景色のalphaを0にする(あるいは、UIColor.clearにする)手法が使えます。
メモ: VSCodeでgolang編集環境

## 良いと思った点

* VSCodeのほうが良いと思った点
    * Microsoft製ということで、利用の許可を取りやすい
    * アイコン多め
    * 日本語対応
    * ソースコードのミニマップがある
    * ターミナルがある
    * 保存した時自動でimportが追加、`go fmt`してくれる
    * 定義ジャンプ(control押しながら左クリック)

![1.png](https://qiita-image-store.s3.amazonaws.com/0/25728/a044215f-4b4f-3bdd-9e27-a46ed8ca945c.png)

* Atomのほうが良いと思った点
    * Syntaxエラーが見やすい

![スクリーンショット_2017-09-16_06-08-09.png](https://qiita-image-store.s3.amazonaws.com/0/25728/8a412386-aa8d-911e-ad4c-7b4d1d623561.png)

* 両方で良いと思った点
    * 他のエディタでファイル内容を変更すると自動で再読み込み

## VSCodeのインストール

* https://code.visualstudio.com/Download
* ドキュメント : https://code.visualstudio.com/docs/languages/go

`ctrl-shift-X`を押して拡張機能のインストール

![スクリーンショット_2017-09-15_09-27-39.png](https://qiita-image-store.s3.amazonaws.com/0/25728/25fcf567-f9b3-8cb0-7633-314fd7efdf26.png)

```sh:~/.bashrc
export GOPATH=$HOME/go/
```

* VSCodeのデバッグにdelveが使われる

```bash:delveのインストール
go get -u -v github.com/derekparker/delve/cmd/dlv
```

* [Go tools that the Go extension depends on · Microsoft/vscode-go Wiki](https://github.com/Microsoft/vscode-go/wiki/Go-tools-that-the-Go-extension-depends-on)

```sh:その他インストール
# Go for Visual Studio Codeに必要なパッケージをインストール
go get -u -v github.com/nsf/gocode
go get -u -v github.com/rogpeppe/godef
go get -u -v github.com/zmb3/gogetdoc
go get -u -v github.com/golang/lint/golint
go get -u -v github.com/ramya-rao-a/go-outline
go get -u -v sourcegraph.com/sqs/goreturns
go get -u -v golang.org/x/tools/cmd/gorename
go get -u -v github.com/tpng/gopkgs
go get -u -v github.com/acroca/go-symbols
go get -u -v golang.org/x/tools/cmd/guru
go get -u -v github.com/cweill/gotests/...
go get -u -v golang.org/x/tools/cmd/godoc
go get -u -v github.com/fatih/gomodifytags
go get -u -v github.com/josharian/impl
```

## 使い方

* `ctrl-shift-I` にて `go fmt`
* `Alt-d` `w` にて `go run`
RaspBerryPi3でLEDを光らせる (Pi4j)

#**１、まずはLEDを光らせる！**
　やはり、まずはLEDチカチカ。

　注意
　・私は電子機器については電圧=抵抗×電流がわかる程度の全くの素人です。

#**2、本題**
##　(1)接続
　220Ωの抵抗器とLEDを接続しています。
　①全体画像
　![image.png](https://qiita-image-store.s3.amazonaws.com/0/164812/325ef51c-668f-a609-15ef-641bb35c7761.png)
　②詳細
　![image.png](https://qiita-image-store.s3.amazonaws.com/0/164812/536731f4-2407-df0c-d1f3-179e84daae69.png)
##　(2)Raspberry piの設定
　シリアルを有効にすることで、ピンを制御できるようになります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/164812/6b8e44a3-9e95-87c5-cc8b-d4d1fab423d2.png)
##　(3)実行プログラム
```java:TestLed.java
import com.pi4j.io.gpio.GpioController;
import com.pi4j.io.gpio.GpioFactory;
import com.pi4j.io.gpio.GpioPinDigitalOutput;
import com.pi4j.io.gpio.PinState;
import com.pi4j.io.gpio.RaspiPin;

public class TestLed {

	/**
	 * @param args
	 */
	public static void main(String[] args) {

		try {

			System.out.println("処理開始");
			
			final GpioController gpio = GpioFactory.getInstance();
			final GpioPinDigitalOutput pin = gpio.provisionDigitalOutputPin(RaspiPin.GPIO_00, "MyLED", PinState.HIGH);
			
			pin.setShutdownOptions(true, PinState.LOW);
			Thread.sleep(1000);
			
			//消えた状態から始める
			pin.low();
			Thread.sleep(1000);
			
			//点灯
			pin.high();
			Thread.sleep(1000);
			
			//状態を変更（消灯)
			pin.toggle();
			Thread.sleep(1000);
			
			//状態を変更（点灯)
			pin.toggle();
			Thread.sleep(1000);
			
			//状態を変更（消灯)
			pin.toggle();
			Thread.sleep(1000);
			
			System.out.println("処理開始");
			
		} catch (InterruptedException e) {
			// TODO 自動生成された catch ブロック
			e.printStackTrace();
		}
		
	}

}
```
##　(4)実行結果
　無事チカチカしました。
　![1505434402h2VE54NhM4VR4Ib1505433518.gif](https://qiita-image-store.s3.amazonaws.com/0/164812/f4b3ec29-a2e8-a425-20f9-7ca85d283a5b.gif)

#**3、おわりに**
##　無事光ました。自分の思った通りに物理的動作をすると、とてもうれしいです。

参考
[Simple GPIO Control using Pi4J.](http://pi4j.com/example/control.html)
　参考にしてプログラム作成しました。
会社全体のエンジニアのアウトプットが向上してしまう方法


# 会社全体のエンジニアのアウトプットが向上してしまう方法



こんにちは、入社して10月で1年になる　**おかむー**　と申します。

## AppleがiPhoneXを発表し、apple watch3も発表しました。



![image.png](https://qiita-image-store.s3.amazonaws.com/0/62822/41678f80-1799-e34c-b1c5-fade55a19b6a.png)


私は、年がら年中Apple好きで学生の頃、福岡でAppleの福袋をGETするために
**2週間、真冬の外で先頭で並ぶ** という快挙を成し遂げたのがつい３年前です。
無駄に通い詰めて名刺を集めたりもしていました。
**appleTV macMini iphone ipad appleWatch macPro** あらゆるアップル製品をどうにか集めていました。


私はiPhoneXのために、またこの時期がやって来たと思いいつから並ぶか計画を立てていました。

---

## しかしながら、私は入社時にある宣言をしたのです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/62822/bd45300a-ab25-9a56-553a-875974a47cb0.png)


**「エンジニアは、アウトプッッットがたいせつなんやぁ！！**
**おれは、Qiita1000いいね達成させます！！」** と。

実は恥ずかしいことに、実はそれが未だ達成出来ておらず、ついに

### 人事の方と先輩でとある企画を立てました。


- **Qiitaで1000いいね達成するまでiPhoneX買えないチャレンジ**
- **アプリ個人で3本出すまでAppleWatch3買えないチャレンジ**


私にとって最悪です。


私の脳内では、
「iPhoneX」＋「AppleWatch3」＋「AirPod」
をAirPowerに並べるハーレム計画を立てていたのですから。


買えないチャレンジでは、効果がないのではとも言われ売却チャレンジか！？となりそうでしたがそこは振り逃げました。


さて本題に戻りますが、

## エンジニアのアウトプットを向上させる方法（おかむーの場合）

### 1. 目標を立てる
   - Qiitaで1000いいね達成するまでiPhone買えないチャレンジ
   - アプリ個人で3本出すまでapple watch買えないチャレンジ

### 2. slackで#ganbare-okamuチャンネルを作成
![image.png](https://qiita-image-store.s3.amazonaws.com/0/62822/1d325da8-4345-1f3c-c908-9dd60162c6b0.png)



### 3. 多くの人に目標達成まで見守ってもらう
- もう戻れなくなります

### 4. 巻き込む
![image.png](https://qiita-image-store.s3.amazonaws.com/0/62822/943023f4-57b1-184c-db4e-ccc83ea87228.png)

### 5. 会社全体が面白くなる
- へんなことしてんなぁと興味本位で人が近づいてきます。

### 6. エンジニアの全員のアウトプットが向上してしまう
<img width="536" alt="スクリーンショット 2017-09-14 14.30.13のコピー.png" src="https://qiita-image-store.s3.amazonaws.com/0/62822/46305f73-b3c2-9a33-634b-b4b9bb6f8376.png">

**なんということでしょう。**

## まとめ
- 「なんだ超単純じゃん」と思った方もいるかもしれませんが、こういうことが重要なのではないでしょうか。
- やりたいことは、周囲にアピールする
- 半強制的にイベントを作ってもらう
- ganbareチャンネルで周知するのがおすすめ！！
- 会社全体のエンジニアのアウトプットが向上してしまうかもしれません！！？？

以上。どんどん書きます。
insertAdjacentなんとかを簡単に使えるモジュールを作りました

[innerHTML より insertAdjacentHTML を使う](http://qiita.com/amamamaou/items/624c22adec32515e863b)という記事が上がっていたのをみて、そんなものあったな、と。
第一引数が覚えられなかったので、勉強がてら思い切ってモジュールを作ってnpmで公開してしまえ！と思って作ってみました。

# 注意点
モジュールを作る・公開するのは初めてなので、拙い点も多々あると思います。また、突貫で作ったため、かなり粗があると思われます。ご了承ください。

そういった箇所は、コメントや編集リクエスト等で教えていただけると幸いです。

# ソースコード
https://github.com/tee-talog/insert-adjacent-simple
（実はGithubをまともに使うのも初めてです。）

`src/ts/index.ts`がモジュール本体のソースです。

# 使い方
```sh:console
$ npm i --save insert-adjacent-simple
```
```js:index.js
const { insertHTMLBeforeBegin } = require("insert-adjacent-simple");

const elm = document.getElementById("id");
insertHTMLBeforeBegin(elm, "insert text");
```

`insertAdjacentElement`も`insertElementHogeHoge`で使用できます！

#### 追記(2017/09/28)
`insertAdjacentText`にも対応しました。

# Githubの運用方法
基本的に自分しか使わないので、これまでは雑にGitを使っていましたが、今回は公開するために、自分の中でルールを設けました。

## 4ブランチ（A successful Git branching model）で運用
[サルでもわかるGit入門](https://www.backlog.jp/git-guide/stepup/stepup1_5.html)の記事を参考に、4ブランチ作成しました。
実際にGithubにpushするのは、masterとdevelopだけです。
Releaseとfeatureはローカルのみにあります。

工夫したところは、Releaseブランチの作り方です。
今回`package.json`には、基本的に`private: true`を設定していたため、それを`false`に設定してから`npm publish`しなければいけませんでした。

そこで、`private: true`の状態でmasterにコミット・タグ付けし、そこからReleaseブランチに`checkout`後、`private: false`にしてから`npm publish`を行いました。

こうすることでGithub上には`private: ture`のソースしか残らないため、間違って`npm publish`してしまうことを防げます。

## 必ず`--no-ff`
自分は履歴がすべてわからないとモヤモヤしてしまうタイプなので、`--no-ff`を付けて`merge`しました。

# やってみて
* npm、意外と簡単だった
* Githubも、意外と簡単だった
    * 今回は自分でcloneしてpushしただけだったから？
    * 大体のコマンドがやり直せるから？（reflogは酷い有様になりましたが）
* TypeScriptでnpmモジュールを作成するのは、考えることが多くなってしまったので、今回のような突貫の場合は、普通にjsで書いたほうが早かったと思われる
    * **このせいで（いや自分が悪いのですが……）公開当初は動いていませんでした**
* コマンドプロンプトからではエラー`errno -4068`（illegal operation on a directory,～）が発生して`npm publish`が出来なかった
    * Cygwinからコマンドを実行することで成功
    * Nodistを使用しており、npmのインストール位置が通常と違ったため？
* TypeScriptで作っておきながら、型定義ファイルがない
    * `declarationDir`オプションを指定すると、なぜかエラーが発生する
    * `declarationDir`オプションを指定しないと、型定義ファイルが出力されない
    * 今後、アップデートで対応したい→**対応しました**
        * Browserifyを使っていたのが原因っぽいです


### お詫び
（2017/09/15 21:15 追記）
公開直後はちゃんとモジュールが作成できていなかったため、使用できませんでした。
現在は修正して、使用できる状態になっています。
申し訳ございませんでした。

（2017/10/24 07:40 追記）
ブログに使用できなかったことについて書きました。
http://blog.tee-talog.com/entry/2017/10/23/210501

# ぜひ！（あとがき）
npmに公開するのは意外と簡単でした。ですが、一回やってみるとかなり勉強になりました。あとは自分の足りない部分が分かるので、今後の勉強にも役立ちそうです。

公開後、`npm install`して自分が作成したモジュールが配置されるのを見ると、達成感がありますね！（最初は動きませんでしたが……）
動かなくても、仕事じゃないので誰に怒られるわけでもなく、むしろ直さなくてもいいレベルなので、とても気楽にチャレンジできます。

ということで、やったことがない方はぜひ作って公開してみてください！


# 参考
* http://qiita.com/amamamaou/items/624c22adec32515e863b
* http://qiita.com/fnobi/items/f6b1574fb9f4518ed520
* https://liginc.co.jp/353537
* https://techacademy.jp/magazine/6235
* https://www.backlog.jp/git-guide/stepup/stepup1_5.html
TensorFlowでkeras その7

#概要
TensorFlowでkerasやってみた。
load_weights して、load_img、predict で推論してみた。

#環境
windows 7 sp1 64bit
anaconda3
tensorflow 1.2

#サンプルコード

```
import os
from tensorflow.contrib.keras.python.keras.preprocessing.image import ImageDataGenerator
from tensorflow.contrib.keras.python.keras.models import Sequential, Model
from tensorflow.contrib.keras.python.keras.layers.convolutional import Convolution2D
from tensorflow.contrib.keras.python.keras.layers import Dense, Dropout, Activation, MaxPooling2D, Flatten, Conv2D
from tensorflow.contrib.keras.python.keras.optimizers import Adam
from tensorflow.contrib.keras.python.keras.preprocessing import image
import numpy as np

pwd = os.getcwd()
img_width, img_height = 128, 128
result_dir = pwd
classes = ['cats', 'dogs']

if __name__ == '__main__':
	model = Sequential()
	model.add(Convolution2D(32, 3, 3, input_shape = (img_width, img_height, 3)))
	model.add(Activation('relu'))
	model.add(MaxPooling2D(pool_size = (2, 2)))
	model.add(Convolution2D(64, 3, 3))
	model.add(Activation('relu'))
	model.add(MaxPooling2D(pool_size = (2, 2)))
	model.add(Flatten())
	model.add(Dense(64))
	model.add(Activation('relu'))
	model.add(Dropout(0.5))
	model.add(Dense(2))
	model.add(Activation('softmax'))
	model.load_weights(os.path.join(result_dir, 'cnn4.h5'))
	model.compile(loss = 'categorical_crossentropy', optimizer = 'adam', metrics = ['accuracy'])
	img_path = '1.png'
	img = image.load_img(img_path, target_size = (128, 128))
	x = image.img_to_array(img)
	x = np.expand_dims(x, axis = 0)
	x = x / 255.0
	pred = model.predict(x)
	print (pred)
	print (classes[np.argmax(pred)])



```
stack install curlができないときの解決法(Ubuntu)

`libcurl4-gnutls-dev`をインストール

# 環境
Ubuntu 16.04 LTS

# このようなエラーがでる

```bash
 setup: Missing dependency on a foreign library:
    * Missing C library: curl
    This problem can usually be solved by installing the system package that
    provides this library (you may need the "-dev" version). If the library is
    already installed but in a non-standard location then you can use the flags
    --extra-include-dirs= and --extra-lib-dirs= to specify where it is.
```

# 解決法

`libcurl4-gnutls-dev`というパッケージをインストールすれば解決します。

```bash
sudo apt install libcurl4-gnutls-dev
```

# 参考
http://momocus.hatenablog.com/entry/2014/04/18/122347
GPSカー　シュミレータ その3

#概要
GPSで自動走行する、コンテストがある。
実機を借りて、アプリから操作する部門がある。
実機は無いので、シュミレータを作ってみた。
リリースする。配布します。

#実行環境

windows .netframework4.0

#配布物

[ダウンロード](http://jsrun.it/assets/C/F/Q/9/CFQ9C)

#使い方

ZIPです。解凍願います。
bluetoothトングルを挿す。
スタートボタンを押すとCOM14をオープンします。
androidアプリは、ご準備下さい。
eコマンドで、デスクトップに軌跡をlog.jpgで保存します。

以上
仕事の基本ツールにMarkdownを浸透させる

Markdownは軽量なマークアップ言語です。基本はテキストファイルを1つ用意すれば、ツールを整えることで、とても軽量な仕事環境を用意することができます。このQiitaでは、ノート（OneNote、Evernoteのイメージ）の用途、プレゼンテーションツール（PowerPoint、Keynote）の用途の2つのポイントで、Markdownを活用できるように整理してみます。

# 1. Makrdownの文法について
Markdownの文法はシンプルです。シンプルで表現力が抑えられているため、書く内容に集中できるというメリットがあります。文法については、Qiitaでもその他ネット上でも、説明がたくさんありますので、それらを参考にしてください。例えば、これ→[Markdown記法 サンプル集](http://qiita.com/tbpgr/items/989c6badefff69377da7)などです。

しかしながら、Markdownには **フレイバーという方言** がたくさんあります。中級者になったらプラットフォームごとにフレイバーごとにどういった記法の違いがあるかを調べると良いと思います。

# 2. ノートとして活用する
ノートとして活用する場合、一番の候補としては、[Visual Studio Code](https://azure.microsoft.com/ja-jp/products/visual-studio-code/)だと思います。
Microsoftが提供する無償の高機能エディターです。

Visual Studio Codeの標準機能や、拡張機能を利用することにより、Markdownを利用して下記の機能を備えた環境を用意することができます。

- ビューワー機能
- エクスプローラー機能（OneNoteでいう、ノートブックと、ページに相当するもの）
- エクスポート機能（HTMLやPDFに出力する）

上記のビューワー機能と、エクスプローラー機能は、Visual Studio Codeの標準機能によってまかなえます。

エクスプローラー機能がしっかりしているので、フォルダ分けをすればノートブック、ページの概念は作れます。また端末をまたいだファイル共有は、Markdownが単純なテキストファイルであるため、OneDriveでもDropBoxでもGithubでもなんでもOK。ビューワーは、最初から簡易的なビューワーがついています。ビューワーの見た目をカスタマイズする方法も用意されており、CSSを変更することで対応可能です。

私が書いた解説記事も含めて下記のポストがお勧めです。

https://code.visualstudio.com/docs/languages/markdown

https://qiita.com/84zume/items/1e6c720caba9898f5af2


# 3. プレゼンテーションツールとして活用する
[Marp](https://yhatt.github.io/marp/)というツールが便利です。
日本人の方が開発しているようで、クロスプラットフォームに対応しています。社内向け資料などの凝ったデザインが必要でない場合は、かなり有効な手段です。PowerPointなどで図形の配置や、フォントの選択・サイズ調整を行うのは本質的でないときもありますからね。

記法として普通のMarkdownと異なるのは、ページごとに区切り線を入れることくらいです。下記のサンプルのように記述するとあっという間に、3ページがそれなりのデザインで完成します。

```
# タイトル
---

# スライド1
ほげほげ

---
# スライド2
ふがふが

```

Marpを使用したイメージはこのような感じです。左側がMarkdownエディタで、右側がプレビュー画面です。作成したスライドはPDFにエクスポートも可能です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/34410/64d2a0f0-24a1-cc10-4b30-821480088255.png)

# 4. おわりに
Markdownを使って、ノートとプレゼンテーションツールをカバーする方法を案内しました。MS Officeに不慣れな人も多いので、こういった手段を確保しておくことは仕事のストレスが減る手段の一つかもしれません。エンジニア的には上で説明した機能以外にも、UMLや数式などもテキストでカバーできると嬉しいですね。そのあたりのMakrdownへの組み込み手段は引き続きまとめてみたいと思います。
ActionCableのKotlinクライアントを実装してみた

# About

[1年以上前にJavaのクライアントを実装していた](http://qiita.com/hosopy/items/cc91f8353a277f59be5e)のですが、Kotlinの勉強ついでに、Kotlin版のクライアントも実装してみました。

https://github.com/hosopy/actioncable-client-kotlin

# 紹介

GitHubのリポジトリはこちらになります。

https://github.com/hosopy/actioncable-client-kotlin

READMEの焼き直しですが、使い方を簡単に紹介します。

なお、Kotlin 1.1現在ではexperimentalな機能であるコルーチン([kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines))を使っています。

## Gradleによる導入

[JitPack](https://jitpack.io/)経由で、Gradleによる導入が可能です。

```groovy
repositories {
    jcenter()
    maven { url "https://jitpack.io" }
}

dependencies {
    compile 'com.github.hosopy:actioncable-client-kotlin:0.0.1'
}
```

## 基本的なインターフェース

`ActionCable`,`Channel`,`Subscription`など、基本的にはJavaScriptのインターフェースと世界観を合わせています。
`onReceived`で受信するJSON(`JsonObject, JsonArray`)のインタフェースは、[Klaxon](https://github.com/cbeust/klaxon)に依存することにしました。


```kotlin
// 1. Setup
val uri = URI("ws://cable.example.com")
val consumer = ActionCable.createConsumer(uri)

// 2. Create subscription
val appearanceChannel = Channel("AppearanceChannel")
val subscription = consumer.subscriptions.create(appearanceChannel)

subscription.onConnected = {
    // Called when the subscription has been successfully completed
}

subscription.onRejected = {
    // Called when the subscription is rejected by the server
}

subscription.onReceived = { data: Any? ->
    // Called when the subscription receives data from the server
    // Possible types...
    when (data) {
        is Int -> { }
        is Long -> { }
        is BigInteger -> { }
        is String -> { }
        is Double -> { }
        is Boolean -> { }
        is JsonObject -> { }
        is JsonArray<*> -> { }
    }
}

subscription.onDisconnected = {
    // Called when the subscription has been closed
}

subscription.onFailed = { error ->
    // Called when the subscription encounters any error
}

// 3. Establish connection
consumer.connect()

// 4. Perform any action
subscription.perform("away")

// 5. Perform any action with params
subscription.perform("hello", mapOf("name" to "world"))
```

## パラメータ指定

先ほどの例では`Channel`にパラメータを指定していませんでしたが、パラメータを指定することもできます。

```kotlin
val chatChannel = Channel("ChatChannel", mapOf("room_id" to 1))
```

`Subscription#perform`についても同様です。

```kotlin
subscription.perform("send", mapOf(
    "comment" to mapOf(
        "text" to "This is string.",
        "private" to true,
        "images" to [
            "http://example.com/image1.jpg",
            "http://example.com/image2.jpg"
        ]
    )
))
```

パラメータコンテナの型は`Map<String, Any?>`としていますが、内部ではKlaxonの`JsonObject`に変換されるため、値に指定可能な型については[Klaxon](https://github.com/cbeust/klaxon)の仕様を意識する必要があります。

## Option

その他、いくつかOptionがあるのですが、長くなりそうなので詳しくは[README#Options](https://github.com/hosopy/actioncable-client-kotlin/blob/master/README.md#options)を参照して下さい。

# Kotlinで実装してみた所感

* スコープ関数?が便利
* コルーチンが便利
* Javaのライブラリを参照しても意外と苦じゃない
* Kotlinかわいい
type can be used by only '.ts' files

VSCodeでFlowを使うと`type can be used by only '.ts' files`とエラーでる。

https://github.com/Microsoft/vscode/issues/5214#issuecomment-304566827

これは上記issueにあるように、以下の設定を追加することで回避できる。

```json
    "flow.useNPMPackagedFlow": true,
    "javascript.validate.enable": false,
```
Google AnalyticsのAPIで コンバージョンの件数と収益を取得し、Slackにレポートする

Google Analyticsでサイトのコンバージョンを測定しています。

<img width="278" alt="スクリーンショット 2017-09-15 1.58.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/53385/a79419e2-9e35-6fbf-db5f-444f755b6c37.png">

### APIでコンバージョン数値取得

コンバージョン件数や収益の値を自動で取得するために、`Google Analytics API`を使いました。

```python:python
  response = analytics.reports().batchGet(
      body={
        'reportRequests': [
        { 'viewId':     view_id,
          'dateRanges': [{'startDate': start_date, 'endDate': end_date}],
          'metrics': [{'expression': 'ga:transactions'}, {'expression': 'ga:transactionRevenue'}]
        }]
      }
  ).execute()
  values = response.get['reports'][0]['data']['totals'][0]['values']
  transactions       = values[0]
  transactionRevenue = values[1]
```

レファレンスマニュアルでmetricsを探しました。

### slackに通知

`slackweb`を使いました。

```
  slack = slackweb.Slack(url=slack_webhook_url))
  slack.notify(text=text)
```

お手軽です。

### 手間がかかるところ

初めてだと、コード以外の部分、Googleのサービスアカウントキーの作成に関わる知識や、Google Analyticsの構成とユーザー管理の知識や、キーの種類P12かJSONかとか、Slackのwebhook設定とか、いろいろ盛りだくさんなので時間の余裕があるといいと思います。
それに比べると、コードの難易度は低いです。

### 参考

*Dimensions & Metrics Explorer | Analytics Reporting API v4 | Google Developers*
https://developers.google.com/analytics/devguides/reporting/core/dimsmets

*Google AnalyticsのデータをPython経由で収集する ｜ Developers.IO*
http://dev.classmethod.jp/business/business-analytics/getting-google-analytics-data-via-python/

*Slackにincoming webhook経由でpythonからメッセージをPOSTする*
http://qiita.com/satoshi03/items/14495bf431b1932cb90b
「インストーラペイロードの署名を確認できませんでした」と言われてmacOS Sierraのインストールが完了しない場合

アップデートの場合は[再起動か日付と時刻の設定し直し](http://mistdewing.com/tips/installer-payload-failed/)で解決する場合があるらしいが、クリーンインストールの場合はそもそも環境設定画面が開けないので、リカバリモードのメニューからターミナルから時刻設定をする必要がある。

wi-fiにつながっていれば
$ ntpdate time.apple.com

オフラインであれば
$ date *UNIXTIME*
MigMix フォントをPowerlineで使えるようにする

# PowerlineでもMigMixフォントを使いたい

個人的に大好きなフォント
[MigMixフォント（M+とIPAの合成フォント）](http://mix-mplus-ipa.osdn.jp/migmix/)
をPowerlineでも使いたくなったので色々しました。
<font color="red">この方法を利用したいかなる損害も投稿者は責任を負いませんのでその点をご理解の上お読みください。</font>

# フォントをダウンロード

[MigMixフォント : M+とIPAの合成フォント](http://mix-mplus-ipa.osdn.jp/migmix/)
上記のリンクから
いつも使っているMigMix 1Mをダウンロードしました。
適当な場所に保存してください

# パッチをあてる

便利なパッチがあったので使わせていただきました。
[Vim Powerline用のFont Patchをあてる - Qiita](http://qiita.com/osamunmun/items/6fcabd8dff0d5fded559)
上記を参考にしまして

``` bash
$ sudo apt-get install fontforge
$ git clone https://github.com/Lokaltog/powerline-fontpatcher
$ mv ~/downloads/migmix-1m-20150712/migmix-1m-*.ttf powerline-fontpatcher
$ cd powerline-fontpatcher
$ fontforge -lang=py -script ./scripts/powerline-fontpatcher migmix-1m-regular.ttf
$ fontforge -lang=py -script ./scripts/powerline-fontpatcher migmix-1m-bold.ttf

```

# 普段使いのターミナルに適用する

最近、私はxfce4-terminalを使っているので
編集＞設定＞外観＞フォント
をMigMix 1Mに変更したところ
すんなりと反映しました。
実に快適です。

# おわりに

Powerline はまだzshしか使ってないので、
正直、環境構築めんどくせえ・・・
って思いながらもうまくいくと
とてもスタイリッシュで見やすいプロンプトになりました。
tmuxも設定したりして
作業環境を快適にしていきたいと思ってます。
それでは。
お手軽にMendeley APIを叩く方法（R言語以外でも）

前回の投稿([RでMendeleyからOAuth認証後、自分のライブラリ情報を抜き出す](http://qiita.com/kyusque/items/167483815168576fddea))では最初からがっつりOAuth認証を行って自分のライブラリにアクセスしました。
だた、http://dev.mendeley.com/getting_started/hello_mendeley.html を見ると、自分のライブラリならすぐにアクセストークンを得ることが出来たようです。
もちろん、自分のライブラリだけですが、ちょっと自分で触ってみたいという場合は便利だと思います。

# 自分のライブラリへのアクセストークンを手に入れる
https://mendeley-show-me-access-tokens.herokuapp.com/ のLog in with Mendeleyをクリックする。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/158368/87ee6800-58de-a36c-6118-8d87b1012202.png)

ユーザー認証を行う

![image.png](https://qiita-image-store.s3.amazonaws.com/0/158368/a8a74896-e17b-778e-31d7-c2e1d41f5796.png)

下のような形でアクセストークンが生成するのでそれをコピーする

![image.png](https://qiita-image-store.s3.amazonaws.com/0/158368/ab35b424-93f5-1202-f9ab-c43a55f774c3.png)

# アクセストークンを使ってAPIを叩く（R）

```r
require(httr)
require(rjson)
require(dplyr)

access_token <- "アクセストークン"

api <- "https://api.mendeley.com/documents?limit=100"

doc_rsp <- GET(api,
               add_headers(
                 'Authorization' = paste("Bearer", access_token),
                 'Content-Type' = 'application/vnd.mendeley-document.1+json'
               )
)

docs <- doc_rsp %>% content %>% rawToChar %>% fromJSON
docs %>% lapply(function(x) x$title)
```
PowerShellでサクッとパスワード生成

ググれば先人の書いたコードがいくらでも見つかるわけですが、自分用のメモとして。

## 英数字と記号入り
```PowerShell
$N = 8 #桁数
$Chars = '0123456789' + 'abcdefghijklmnopqrstuvwxyz' + 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' + '!@#$%^&*()_-+=[{]};:<>|./?'
-join ((1..$N) | % {Get-Random -input $Chars.ToCharArray()})
# bBUy#D{Q
```

2行目の `$Chars = '0123456789' + ...` の箇所でパスワードに含まれる文字を列挙しています。
用途によっては記号は入れたくないとか、特定の文字を除外したいといった場合もあるかと思いますので、適宜調整してください。

## 英数字だけ
```PowerShell
$N = 8 #桁数
$Chars = '0123456789' + 'abcdefghijklmnopqrstuvwxyz' + 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
-join ((1..$N) | % {Get-Random -input $Chars.ToCharArray()})
# Ai7WraCz
```

## 紛らわしい文字と記号を除外
```PowerShell
# 紛らわしい文字: 0, 1, l, o, I, O
$N = 8 #桁数
$Chars = '23456789' + 'abcdefghijkmnpqrstuvwxyz' + 'ABCDEFGHJKLMNPQRSTUVWXYZ'
-join ((1..$N) | % {Get-Random -input $Chars.ToCharArray()})
# GyA85znW
```

以上です。

----
2021/04/09
PowerShell 7の環境でも動作するコードに変更
紛らわしい文字を除外するコード例を追加
jstatを使おうとするときにpidが見つからない時にはRMで救う

何ヶ月前に他の人はJVMを変更した。最近jstatを使いたかったが、ずっとpidが見つからない（XXX=pid not found）というばかり。
知識として、jvmはユーザごと`/tmp/hsperfdata_{USER}`というフォルダーに、プロセスのpidを名前とするファイルを作りし、jstatなどはこれを読み書きながら稼働する。
何度試したが最後に解決した。

```bash
rm -rf /tmp/hsperfdata_*
chmod 777 /tmp
```

プログラムを再起動、それで正常に動けるようになる。
フォームが多くなってVuexがだるくなる問題 その2

前回書いた[フォームが多くなってVuexがだるくなる問題] (http://qiita.com/renowan/items/ca9d351a94ced9895f0a)の続編。前回より、もうちょっとコード量を減らして構造を汎用性が高いものにしてみる。

## 前回ゴール
- mutationsを減らす
- get, setを減らす
- Vuex wayを守る
- vue-devtoolsを手放さない

## 今回の追加ゴール
- もっとコード量を減らす
- 入力データはネストされたObjectに保存

[GitHub: renowan/vuex-form-approach](https://github.com/renowan/vuex-form-approach)
[Demo](https://renowan.github.io/vuex-form-approach/#/form2)

## 対象となるstore
``` js
{
  "profile": {         // データグループ: profile
    "name": "",            // 入力field: name
    "age": 1               // 入力field: age
  },
  "info": {           // データグループ:info
    "graduated": "",      // 入力field: graduated
    "phoneNum": ""        // 入力field: phoneNum
  },
  "disabled": false   // 保存ボタン活性状態
}
```

## ポイント1 storeへのパスをfromの更新イベントに書く
``` js
<input
type="text"
class="form-control input-sm"
placeholder=""
:value="myStore.profile.name"  
@input="inputUpdate($event.target.value, 'profile.name')">
```
フォーム更新イベント `inputUpdate` にアクセスしたい階層へのパスを書く `profile.name`  

## ポイント2 from valueとstoreへのパスをcommitする
``` js
// vue component methods
inputUpdate (value, path) {
  this.$store.commit('form2/INPUT_UPDATE', {value, path})
}
```

## ポイント3 パスを使ってネストされた階層へアクセス
``` js
// mutations
[INPUT_UPDATE] (state, payload) {
  // パスをオブジェクトにアクセスするキーへ変換する
  const segments = payload.path.split('.')
  state[segments[0]][segments[1]] = payload.value
}
```
これでフォームが増えても `mutations` 一つで済む

今回データは2階層目に限定する書き方してるが、再帰処理で `foo.bar.hoge` のように書き込む階層が可変にもできるが今回はそこを割愛する。

## おまけ - バリデーションの実装へ応用
説明は省略するのでこの辺を参照してください。
https://github.com/renowan/vuex-form-approach/tree/master/src/pages/form3
https://github.com/renowan/vuex-form-approach/blob/master/src/store/modules/form3.js
bashの変数内文字列置換まとめ


|パターン|動作|典型的な使用例|
|---|---|---|
|${変数#パターン} |文字列**先頭**の**最短**マッチ部分を削除|単に先頭の固定文字列を削除するとき使う|
|${変数##パターン} |文字列**先頭**の**最長**マッチ部分を削除|`${HOGE##*/}`でbasename|
|${変数%パターン} | 文字列**末尾**の**最短**マッチ部分を削除|`${HOGE%/*}`でdirname。単に末尾の固定文字列を削除するときにも使う|
|${変数%%パターン} | 文字列**末尾**の**最長**マッチ部分を削除|あまり使わない|
|${変数/検索文字列/置換文字列} |最初にマッチしたもののみ文字列を置換||
|${変数//検索文字列/置換文字列} |全ての文字列を置換|`${HOGE//foo/bar}`|

`#`と`%`が覚えづらい。
`#`はmarkdownで行頭に書くと見出しになるから「先頭の」
`%`は`100%`のように末尾に書くから「末尾の」
と覚えるといいかも。
キーボードで`#`は`%`より左にあるから`#`が先頭と覚えてもいいかも。

`%` `%%` `#` `##` はPOSIXで決まっているのでbash以外のshでも使えるらしい。2.6.2 Parameter Expansionに書いてある。
http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html

# 具体例

## dirname

```
HOGE="/var/log/httpd/access.log"
echo ${HOGE%/*}    #=> /var/log/httpd
```

ただし$HOGEが１個も`/`を含まない場合はうまくいかないので注意：

```
HOGE="moge.txt"
echo ${HOGE%/*}    #=> moge.txt（本来は「.」になってほしい）
```

`/`を含むかどうか判定するにはこのようにすればよい：

```
mydirname() {
    if [[ $1 == */* ]]; then
        echo ${1##*/}
    else
        echo "."
    fi
}
```

## basename

```
HOGE="/var/log/httpd/access.log"
echo ${HOGE##*/}    #=> access.log
```

```
HOGE="moge.txt"
echo ${HOGE##*/}    #=> moge.txt
```

## 拡張子を取得
```
HOGE="/var/log/httpd/access.log"
echo ${HOGE##*.}    #=> log
```

```
HOGE="moge.txt"
echo ${HOGE##*.}    #=> txt
```

ただし`HOGE`がピリオドを1個も含まない場合は元の文字列全体になってしまうので注意：

```
HOGE="/var/log/httpd/access"
echo ${HOGE##*.}    #=> /var/log/httpd/access
```

## 拡張子を削除

```
HOGE="/var/log/httpd/access.log"
echo ${HOGE%.*}    #=> /var/log/httpd/access
```

```
HOGE="moge.txt"
echo ${HOGE%.*}    #=> moge
```
優秀なデバッガー（node-inspector）を使いたい人はnode.js v6を使い続けたほうが良いかも

# node-inspectorとは？
GitHub ⇨　https://github.com/node-inspector/node-inspector
> Node Inspector is a debugger interface for Node.js applications that uses the Blink Developer Tools (formerly WebKit Web Inspector).

JSのデバックをChromeを用いてGUI上でできるモジュール。（嬉しい。泣）
Node.jsとnpmが必要。

# ぶち当たった壁
最近Node.jsをいじり始めて、「デバッガーがほしい...console.log()はもう嫌だ...」となっていました。
そこで出会ったのがnode-inspector。CUIじゃなくてGUIでできる部分もフレンドリーで良い。（甘え）


早速インストールしてみる

```zsh:terminal
$ sudo npm i -g node-inspector
```

使ってみる...あれ。

```zsh:terminal
$ $ node-inspector
module.js:491
    throw err;
    ^

Error: Cannot find module '_debugger'
    at Function.Module._resolveFilename (module.js:489:15)
    at Function.Module._load (module.js:439:25)
    at Module.require (module.js:517:17)
    at require (internal/module.js:11:18)
    at Object.<anonymous> (/Users/userName/.nodebrew/node/v8.4.0/lib/node_modules/node-inspector/lib/debugger.js:2:16)
    at Module._compile (module.js:573:30)
    at Object.Module._extensions..js (module.js:584:10)
    at Module.load (module.js:507:32)
    at tryModuleLoad (module.js:470:12)
    at Function.Module._load (module.js:462:3)
```

なぜだ...出落ちした...

色々調べてみた結果、見つけたのがこちらのページ　⇨ https://github.com/angular/protractor/issues/4307
> _debugger and the legacy CLI debugger were removed in Node 8: nodejs/node@90476ac

Oh...どうやらNode.jsのv8では_debuggerとlegacy CLI debuggerが削除されているみたい。
これが問題のよう。

>With Node v8 set to enter LTS in October, maybe we could get an update?
https://github.com/nodejs/LTS#lts-schedule1


１０月にv8がLTSとなるから、そのタイミングでnode-inspectorもアップデートする感じかい？みたいなことを言っている。
ここを読んでいて、そもそもLTSとはなんぞや？となってしまったので調べた。


# node.jsのバージョン管理の話
まず最初にLTSについて。Long-term Supportの略だそう。長期に渡って運用保守が保証されているバージョンのこと。業務などで用いる場合はこちらが無難ですね。
もう一つのバージョンの種類に、"Current"というのがある。こちらは長期に渡る運用保守が保証されておらず、その代わりバンバン機能を追加していくよ〜という立ち位置。

現在のバージョン管理の予定としては、以下のようになっている。
（出典：https://github.com/nodejs/LTS#lts-schedule1）
![schedule.png](https://qiita-image-store.s3.amazonaws.com/0/172187/bac73617-b058-144f-d910-c6a863e110bc.png)

こんなにきれいにバージョン管理をしているのは素晴らしい...頭が上がりませんね。

# 結論
結論、node-inspectorを使いたいのであれば、Node.js v6を使うのがよい。
nodebrewを使えば、簡単にNode.jsの複数バージョン管理・切り替えができる。

早速v6をインストールしてみる。
このページを参考に、LTSとしてサポートされているバージョンを確認。⇨ https://nodejs.org/en/
(2017/9/05現在、LTSはv6.11.3で、Currentはv8.5.0)

```zsh:terminal
//v6.11.3をインストール
$ nodebrew install-binary v6.11.3
Fetching: https://nodejs.org/dist/v6.11.3/node-v6.11.3-darwin-x64.tar.gz
######################################################################## 100.0%
Installed successfully

//しっかりインストールされているか確認
$ nodebrew ls
v6.11.3
v8.4.0

//使用するバージョンを切り替える
$ nodebrew use v6.11.3
use v6.11.3

//切り替わっているか確認
$ nodebrew ls
v6.11.3
v8.4.0

current: v6.11.3

//一度node-inspectorをアンインストール
$ sudo npm uninstall -g node-inspector

//再度インストール
$ sudo npm install -g node-inspector

//node-inspectorが使えるか確認
$ node-inspector                      
Node Inspector v1.1.1
Visit http://127.0.0.1:8080/?port=5858 to start debugging.

//できた！！！！                                                 
```
今後はしっかりとnode-inspectorの恩恵に預かりつつ、Node.jsを学んでいきたい。
bootstrap4 alpha6 で pull-right / float-right する（カラムの右寄せ）

みんな大好き bootstrap4 の alpha6 がリリースされましたね！
しかし4のリリースから随分経つのにまだ alpha ってどういうこと？ GitHUB人気No.1クラスなのにそんなにのんびりな開発で良い訳？…と思っていましたが、alpha6 は今までとの互換性をバッサリ切り捨てた仕様変更が結構多くてビビります。その中でもトップクラスの変更が「Gridにflexを使うようになった」ということ。

# flex-last を使う

というわけで、flexなので当然 pull-right も float-right も使えません。代わりに用意されているのが、flex-first / flex-last というクラスです。下記のようにします。

```html
<div class="container">
  <div class="row">
    <main class="col-12 col-lg-9 flex-lg-last">
      <!-- LG以上の画面幅で右側になるメインカラム -->
    </main>
    <aside class="col-12 col-3">
      <!-- LG以上の画面幅で左側になるサイドバーカラム -->
    </aside>
  </div>
</div>
```

正確に言うと、floatのように右に寄せるものではなく、flexの順序 order を変更するものです。last を複数に付けたら、きっと意図しない結果になります。

```css:bootstrap.css
@media (min-width: 1199px) {
  .flex-lg-first {
    order: -1;
  }
  .flex-lg-last {
    order: 1;
  }
  .flex-lg-unordered {
    order: 0;
  }
  /* .... */
```


# order-last ？　order-1 ？

すみません。あらためてGitHUBのソースコードを見に行ってみたら、flex-last が見つからなくて、代わりに、order-lg-last とか、 order-lg-1, order-lg-2... といったクラスを見つけました。こういう書き方に変わったのかもしれません。

# 以上！

できたてほやほやのflex。やっぱりこのあたりの仕様はそれだけ軟らかいのでしょうか。近いうちにもう少し調査・検証して書き足します。ひとまず備忘録として。
Ruby等でのうるう秒とtimezone環境変数TZとの関係

### Rubyで うるう秒 の表現

[Google Apps Scriptでうるう秒は問題になるか](http://qiita.com/iizuka/items/368b646dfeb396e2ed91) を考えた時に、Rubyでは うるう秒(閏秒)をどう扱うのか気になりました。

2012年6月31日(GMT)にうるう秒がありました(ちょっと古い話ですいません)。手元の環境で、特に何も指定せずにうるう秒の時刻を指定すると

```
% ruby -e 't=Time.utc(2012, 6, 30, 23, 59, 59); (0..2).each{|n| puts [t+n, (t+n).to_i].join("  # ") }'
2012-06-30 23:59:59 UTC  # 1341100799
2012-07-01 00:00:00 UTC  # 1341100800
2012-07-01 00:00:01 UTC  # 1341100801
```

となり、うるう秒は無かったように扱われます。

しかし、ここで環境変数 `TZ` を使うと

```
% TZ=right/Japan ruby -e 't=Time.utc(2012, 6, 30, 23, 59, 59); (0..2).each{|n| puts [t+n, (t+n).to_i].join("  # ") }'
2012-06-30 23:59:59 UTC  # 1341100823
2012-06-30 23:59:60 UTC  # 1341100824
2012-07-01 00:00:00 UTC  # 1341100825
```

と見事にうるう秒が表現されました。

このうるう秒は25回目のうるう秒なので `#to_i()`で取得できる起算時からの経過秒数も25秒ずれています。

この日は一日の秒数も 86400秒ではなく

```
% TZ=right/Japan ruby -e 't1=Time.utc(2012, 6, 30); t2=Time.utc(2012, 7, 1); p t2-t1'
86401.0
```

86401秒になってますね。次の日を計算するために86400を足すコードはトラブルを生みそうです。

### 開発者の注意

`Time`がうるう秒をどう扱うかは実行時の環境変数に依存するので、コードを書く人はそこのところを忘れないようにしないといけません。気まぐれな?システム管理者がrightにしてるかも。

### DateTimeクラスの憂鬱

`date`ライブラリの`DateTime`クラスではうるう秒は扱えません。

```
% TZ=right/Japan ruby -r date -e 't=Time.utc(2012, 6, 30, 23, 59, 59); (0..2).each{|n| puts [t+n, DateTime.parse((t+n).to_s)].join("  # ") }'
2012-06-30 23:59:59 UTC  # 2012-06-30T23:59:59+00:00
2012-06-30 23:59:60 UTC  # 2012-06-30T23:59:59+00:00
2012-07-01 00:00:00 UTC  # 2012-07-01T00:00:00+00:00
```

### Ruby以外

環境変数TZを使う言語や環境は、もちろんRubyに限りません。`date`コマンドもそうですね。下の参考記事を参照してください。

Pythonでは
https://docs.python.jp/3/library/datetime.html
> time モジュールと違い、 datetime モジュールはうるう秒をサポートしていません。

のようで、Rubyと似ていますね。(Rubyが似てるのか)

JavaScriptではうるう秒は扱わないようです。

http://www.ecma-international.org/ecma-262/5.1/#sec-15.9.1.1
> In time values leap seconds are ignored. It is assumed that there are exactly 86,400,000 milliseconds per day.

### 関連記事

[Google Apps Scriptでうるう秒は問題になるか](http://qiita.com/iizuka/items/368b646dfeb396e2ed91)

### 参考

*Ruby 2.4.0 リファレンスマニュアル Timeクラス*
https://docs.ruby-lang.org/ja/latest/class/Time.html

*Linux Programmer's Manual (3) Man page of TZSET*
https://linuxjm.osdn.jp/html/LDP_man-pages/man3/tzset.3.html

*RubyとRailsにおけるTime, Date, DateTime, TimeWithZoneの違い*
http://qiita.com/jnchito/items/cae89ee43c30f5d6fa2c

*Ruby, MySQL のうるう秒の扱い - @tmtms のメモ*
http://tmtms.hatenablog.com/entry/2015/01/10/leap-second

*Linux 2015/7/1 うるう秒調査 - dropooiの日記*
http://dropooi.hatenablog.com/entry/20150131/1422713365
今アツい!Dockerの次世代オーケストレーションツール Openshift origin

今はあまり意味がないかもしれませんが、今後もしつかうことがあるかもしれない(ないかもしれない) Dockerデプロイについて、少し書きます。

# Docker オーケストレーションツールって?

Dockerは、そもそもLinuxのcgroupやchroot相当の方法で、システムコールをフックして、プロセスをあたかも仮想マシンレベルに隔離できるようにしたものです。
でもそれだけじゃプロセスごとに扱いめんどくさいよね、って話です。
数百台ののコンテナを、ネットワークや冗長、スケールアウトも考えて、実際の業務に簡単に使えるようにしたのがオーケストレーションツールです。コンテナを指揮するオーケストラ的な意味合いです。
OpenstackやCloudstackのDockerコンテナ版、なんて言ったらわかりやすいかもしれません。

たとえば、docker-composeやkubernetesなどがこれにあたります。

# openshift と openshift origin について

Openshiftは、ことしか去年にRedhatが公開したSaaS型のオーケストレーションツールです。
SaaSなので、AWSのようにRedhatにお金を払ってクラウド上のコンテナに対してマウスでぽちぽちサーバー立てたりデプロイしたりします。
そして、Redhatがこれをコミュニティ向けに公開したものがOpenshift originです。
自分たちのサーバで動かすことができるOSSで、一度構築してしまえばOpenstackと同じ感覚で操作ができます。

# 技術的な構成

Openshift(以下、長いのでos)は、内部的にはkubernetes(以下、k8s)とプロジェクト アトミックを使用しています。k8sはgoogleが開発したDockerのオーケストレーションツールです。
でもただGoogleをパクっただけではなく、法人が本番サーバスに使えるように機能がたくさん追加されています。
Atomicは、軽量なOSの名前で、とても軽量です。コンテナのOSとして使われます。

# 構成

![origin-overview.png](https://qiita-image-store.s3.amazonaws.com/0/154157/c2457403-26ab-5f74-93d8-8d95459cc9ed.png)

(画像を http://nekop.github.io/slides/OpenShiftJJUG.html#/3 からお借りしました)
構築したos全体を「クラスタ」と呼びます。
物理的なサーバー、もちろん仮想マシンでもいいですが話がごちゃごちゃになるのでここでは物理サーバーとします。
osのソフトが動作してる一台一台のマシンを「ノード」と呼びます。

コンテナはそのまま「コンテナ」と呼ばれます。
コンテナはだいたい1プロセスが動作しています。そして、コンテナの空間を接続したもの、つまりストレージとネットワークをほぼ共有したものを、ポッドと呼びます。これが従来のVMみたいなものです。

このVMは、基本的に永続ストレージをのぞいて内部のコンテナとともに作成、破棄を繰り返されます。
これが、今までと違うライフサイクルです。いつでもデプロイ用のマシンは破棄されてもいいように、また起動されてもいいようにという概念です。
そして、複数ポッドを作ることができます。作られたポッドはノードに分散され、一つ物理マシンが壊れても他のノードで自動的にポッドが複製されます。
複数作るポッドの数は設定でき、簡単に言えば全く同じマシンの冗長構成ができます。

そして最後に、複数のポッドが冗長されている時に、まとめてフローティングなグローバルipを割り振ったりtcpでロードバランシングするものが、「サービス」です。

以上のコンポーネントが組み合わさりosは動作します。

# 何が嬉しいか

- インフラas a Codeです。ポッドの状態やコンテナの状態をすべてJSONファイルで設定できます。
- コンテナは起動も終了もとても早いです。内部的にはプロセスkillとかわりません。
- 素早くスケールアウトでき、またノードが壊れた時の復旧も早いです。


# まとめ

こんな感じにさらっと書いて見ました。詳しいことは英語の公式ドキュメントが一番いいと思います。
今までDockerは本番には使えないと言われてきましたが、実際こんなものが開発されているのを知ってみるとこれからデプロイの幅が広がると思います。
フリーランスのITエンジニアとして生き抜く方法

フリーランスのITエンジニアになってから5年ほど経ちました。

今からフリーになる（なりたい）エンジニアの方々に参考になればと思い、どの現場でも通用するためのエッセンスを自分なりにまとめてみました。

#プロフィール

- フリーランスのJavaエンジニアです（エージェントから案件を紹介してもらい客先に常駐）
- フリーになってから今年で4年目
- 業務系Webアプリケーションの開発が得意です
- 最近はECサイトの開発も多いです

以下、業務系アプリの開発に携わる人向けに書いています。ご了承ください。


##休みすぎない
フリーのエンジニアに多いのが欠勤。午前半休です。
聞くところによると本当に多いらしく、普通に休まず出勤し続けるだけで評価されるそうです。


##現場の文化になじむこと
どこでも通用する知識（プログラミングスキルなど）を持つことは確かに大切ですが、その現場の文化を知ることも大切です。

- どんな顧客？（SIer？エンド直？）
- 自社の位置づけは？（自社は○次受け？　他社と分業で開発を進めている場合、自社はどの部分の開発を担当しているのか？）　
- どんなプロジェクト管理をしているのか（JIRA? Backlog? Redmine? Trac?）
- どうやってソース管理しているのか（SVN? Git?）
- 各開発メンバーの役割分担
- メンバー内のコミュニケーションの取り方は？（Slack? IPMessenger? チャットと対面どっちが多い？）
- コーディングルールは？

現場の文化に馴染むことができなければ、どんなに汎用的な知識を持っていても、聞く耳を持ってもらえません。
文化にうまく馴染めずプロジェクトを去るのは、人それぞれ向き不向きや好き嫌いがあるので仕方ないことですが、**馴染もうとしない**エンジニアはこの先ツラいと思います。


##いろいろ質問できる人を確保しておく
参画して最初の頃は、マンツーマンで教えてくれる人を１人確保していくと良いと思います。参画前の面談で、現場への要望として挙げておくのもアリでしょう。
できれば、その人の隣の席で作業できるとさらに良いです。

余談ですが、席の場所って意外と重要です。場所が悪いせいでコミュニケーションに支障をきたしているエンジニアも多いです。

そして、一度聞いたことは付箋アプリなどで、いつでも目につくところに細かくメモしておきましょう。
とにかく何でもメモること。そして一度聞いたことはあまり何度も質問しないこと。

メモったことは他のエンジニアのナレッジにもなるように、Backlogのwikiなどにまとめておくと良いです。


##環境構築は迅速に
初日でアプリを起動、各画面の遷移、動作確認くらいまで終わるくらいのスピード感を目安にしておくと良いと思います。
環境構築が早く終わると、周りの人からの期待値が上がり、エンジニアとしてのスキルを信頼されます。


##システムの全体像を早くつかむ
とにかくいろんな画面、機能を触って遊んでみて、システムの全体像を掴みましょう。
全体像をつかむとはどういうことかというと、

- システムが導入された目的を理解している（何のために必要なシステムなのか）
- システムフローをある程度把握している
- 業務フローとシステムの機能の対応関係を理解している

全体像を掴んでおくと、

- 機能追加、バグ改修の時にその目的がすぐに分かるようになる。
- 「こうしたらもっと良くなる、使いやすくなる」といった提案がしやすくなる
- 「ここを修正するなら、この部分にも影響がある」といったリスクをすぐに洗い出せる

結果的に余計なバグ・手戻りが発生しにくくなります。

また、遊びまくってシステムが動かなくなると困るので、いつでも元に戻せる手順は知っておくこと。（DBのダンプ＆リストア、必要なマスタデータなどをメモしておく）

##他のソースをうまく流用する
いろんな意見はあると思いますが、まずはその現場の文化（=コーディングルール、アーキテクチャ）に溶け込むのが良いかと思います。
他の画面、機能のソースを流用した方が早く実装でき、品質も十分なものができるのであればなるべく流用します。
変に独自のソースを書こうとせず、可読性を重視すること（他の人が読みやすいコードを書くこと）。


##DBの知識は必須
基本的なSQL（SELECT, UPDATE, INSERT, DELETE, JOINなど）が書ければ十分です。
要は、自分が探したいテーブルのデータを難なく引き出せるかどうかです。

いろんな現場を経験していると、テーブルのカラムをざっと眺めて、「このカラムはこういうことに使われそうだな。。。」という予想ができるようになり、仕様の理解をサポートしてくれたりします。

また、個人的にはER図（これが用意されている or メンテされている現場はあまりないかも…）と画面遷移図を照らし合わせながら、システム全体の仕様が読み解けるようになるとさらに良いです。


##ユーザーの気持ちになって実装する
ユーザーが使いやすいように機能を実装すること。
ラクな実装ができるかを一番に考えるエンジニアは多いですが、結局ユーザー側の仕様変更によって覆ることが多いです。そして面倒な実装をせざるを得なくなってしまうことも多いです。
そこで、面倒になりそうだけど何とかしてラクに実装できないかを考えます。ここがエンジニアの腕の見せ所な気がします。
独りよがりにならないように、他のエンジニアにも相談してみましょう。


##汎用的なテスト観点はストックしておく
業務系のWebアプリであれば、どの現場でもテスト観点は似たようなもの。
汎用的なテストケースは自分の中でストックしておき、どの現場でも使えるようにしておけば、それほど時間をかけずに単体テストケースを作ることができます。

できれば結合レベルでテストケースが作れると良いです。
システムフローの前後の機能との連携を意識してテストしておくと、結合テストでの手戻りが発生するリスクが減ります。

##自動化、効率化するツールを作ってシェアする
個人的には、マスタだけダンプ＆リストアするツールとか重宝してます。
自分が役に立つと思ったツールは積極的にシェアしましょう。
環境構築・テストの自動化もガンガンやっていくと良いと思います。
ドラクエ11のカジノをMacとPS4リモートプレイを使って攻略(ハック)する方法


# はじめに
ドラクエ11のカジノスロットは設定が易しく、ひたすらボタンを押し続ければ、根気だけでコインがいくらでも増えていくことが知られています
そこで
ボタンを押し続ける作業はしたくないから、楽したい！
連射機はないけどMacはある！
コードは書ける！
そんなQiita民の、ハックによる、ドラクエ11プレイヤーのための方法を紹介します

# 必要なもの
必要なのは、この記事を見るドラクエプレイヤーならきっと持っているものだけです

- Mac(リモートプレイが使えればなんでも可)
- [ひたすら◯ボタンを連打するスクリプト](https://github.com/yuishihara/DQ11AutoCasinoPlayer)
- [PS4リモートプレイ](https://remoteplay.dl.playstation.net/remoteplay/lang/jp/)

# ハックの仕方
リモートプレイをするとわかるのですが、PS4コントローラの◯キーがEnterに対応しています
ドラクエ11のカジノスロットは◯を押し続けるだけで勝手にスロットは回り続けます
そこで、リモートプレイアプリに対してひたすらEnterキーを送り続けるスクリプトを書くことで、連射機と同様のことをするというのが今回のハックです

# スクリプトの中身
たったこれだけ、キーコード36がEnterに相当します
delayは小さいほど連打が早くなりますが、早すぎると他の入力を受け付けなくなってスクリプトが止まらくなります
大体0.4くらいがちょうどいい感じでした

```applescript
activate application "RemotePlay"
repeat while true
	tell application "System Events"
		key code 36
		delay 0.4
	end tell
end repeat
```

# スクリプトの使い方
## PS4リモートプレイを起動しカジノに行きます
![Go to casino](https://raw.githubusercontent.com/yuishihara/DQ11AutoCasinoPlayer/master/Screenshot_casino.png)

## Applescriptを起動します(▶ボタンを押して開始、■を押したらとまります)
注：スロットで掛け金を決めた後で押すこと！
![Play slot and run script](https://raw.githubusercontent.com/yuishihara/DQ11AutoCasinoPlayer/master/Screenshot_slot.png)
単語を忘れた時の思い出し方

あれなんだっけ？
"あ"から始まって、"ぐま"で終わる動物。

そんな時に、頭の中で、
ああぐま、あいぐま、あうぐま、、と50音を辿るのは、もうやめにしましょう。

Terminalを開き、`python`と叩きましょう。
そして、以下を入力するのです。
`>>> ['あ'+chr(i)+'ぐま' for i in range(ord('ぁ'), ord('ん')+1)]`
そして、きっと、あなたは思い出すことでしょう。
**あなぐま**と遊んだ幼い頃の思い出を。

※Googleでワイルドカード検索をしたら、と思うあなた。
`"あ*ぐま"`と検索してみてください。

###楽しそうな事
Google検索件数APIと繋げて、ある文字列に対して検索件数の多い順にソートして出力したら、その単語と似た単語を取得できる。
ex)`タイピン`を思い出す時に、`たい○ん`を検索。検索件数の多い順に、`たいわん`、`たいまん`、`たいだん`、`たいぴん`といったように出力。
【java】Mapのkeyの型に気をつけよう

・整数リテラルはint型
・Mapは、keyの型が違うと、（一見キャストなりして推測できそうな値があったとしても、）存在しない扱いになる

```java
import java.util.*;

public class MapTest {
    public static void main(String[] argv) {
        Map<Short, Object> a = new HashMap<>();
        a.put(new Short("1"), new Object());
        System.out.println(a);  // {1=java.lang.Object@7852e922}
        System.out.println(a.get(1));   // null !!
        System.out.println(a.get(new Short("1")));  // java.lang.Object@7852e922
    }
}
```
shutilでファイル数が少ないフォルダを一括削除する

クロール先のデータがまとまった量で欲しい場合は、中途半端に取得されたフォルダは逆に邪魔になるので一括で削除したい。使いやすいように関数にしてまとめました。

#使用環境
windows10
Anaconda 3.6.1

#shutil
shutilはpython標準ライブラリの一つ。高度なディレクトリ操作が可能。
[公式レファレンス]https://docs.python.jp/3/library/shutil.html

#コード
```delete_folder.py
import os
import shutil

#デフォルトでは実行フォルダ内の要素３つ以下のフォルダを削除
def delete_folder( directory_dir= os.getwsd() ,size=3):
    
    folder_list = os.listdir(directory_dir)
    folder_dir = [os.path.join(directory_dir,i) for i in folder_list if len(os.listdir(os.path.join(directory_dir,i))) <= size ]
    for folder in folder_dir:
        print(folder+'を削除します')
        shutil.rmtree(folder)

    print('完了')
```