OmniAICreator/Qiita-1.07M huggingface dataset:
Atomを利用したターミナル in エディタによるQoL向上計画

長らくエディタはSublime Text一筋でしたが、今年の春ごろよりAtomに乗り換えました。
まだ0.x系の頃にAtomを利用した時は、Sublime Textと比較して非常に動作が重く、まだ実用に耐えないということで採用を見送りました。
しかし、最近になって動作が大分軽快になってきたこと、そして、「**エディタ内でイイカンジにターミナルが使えること**」が判明したのが決め手となり、完全移行しました。
個人的にはIDEは自身のユースケースには大仰すぎると思っていることと、基本的に特盛りエディタ派だったのですが、IDEのターミナル利用の便利さには惹かれていたのでベストマッチでした。

# Sublime TextとAtomでのエディタ in ターミナルの違い

<img width="993" alt="スクリーンショット 2016-08-17 13.37.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/75633/09c15965-feba-ea55-f3d8-02fa47eb0915.png">

今までのSublime Textでも`glue`というプラグインを利用することでターミナルの利用が可能でしたが、glueでは一つのタブとしてターミナルが展開されてしまう上、Sublime Text特有の日本語入力の問題もあって、あまり快適とは言えない環境となっていました。

![スクリーンショット 2016-08-17 13.40.11.png](https://qiita-image-store.s3.amazonaws.com/0/75633/e7463f08-2e44-cedf-f772-6adbbd7accfa.png)

ですが、Atomの場合は、`Terminal-Plus`というプラグインを利用することで、
エディタ領域を更に分割し、エディタの下にうまい具合に配置してくれて、日本語のストレスもなく、非常に快適なターミナル環境が得られました。
また、複数のターミナルをシームレスに切り替えられるのも高評価です。

# Terminal-Plusの導入

導入については、他のパッケージと同じ方法で簡単に導入可能です。

```bash:terminal
$ apm install terminal-plus
```

もしくは、
Atomを起動後、`Cmd + ,`で設定画面を出した後、Install > Install Packagesにて`terminal-plus`を指定後インストールで完了です。

## 使い方

導入後、`Cmd + Shift + T`でターミナルがAtomの起動ユーザーと同じユーザーで立ち上がります。
起動後は、普段のターミナルと同じ感覚で利用できます。

# 所感

やはりエディタとターミナルが直結しているのは魅力的で、非常に生産性が向上したように感じられます。
コード書きながらサーバーを起動したり、sshを接続したりも、「とりあえずターミナル窓を生やして」と言った感覚で、Atom内で完結することによって、無駄なアプリケーション間のトラフィックが激減しました。

Atomの利用者なら是非おすすめですし、他のエディタの利用者でも、乗り換えも選択肢に入るくらいかと思いますので、エディタのターミナル周りに不満を抱いている人は、一度導入してみると良いかもしれません。
vagrant 1.8.5 で、linuxのboxをvagrant upすると、sshのエラーが出続ける

バージョンあげたらハマったのでメモ

# 症状
2016年8月17日時点の最新版(1.8.5)をインストールしてLinuxのboxをvagrant upすると出続ける

```
default: Warning: Authentication failure. Retrying...
default: Warning: Authentication failure. Retrying...
default: Warning: Authentication failure. Retrying...
```

# 原因

こちらのサイトで取り上げられていました。ありがたい。

[Vagrant 1.8.5でLinux boxをvagrant upするとエラーが出る件について - 素敵なおひげですね](http://stknohg.hatenablog.jp/entry/2016/07/26/190330)

# 今回の対策

とりあえず過去のバージョン一覧から1.8.4を落としてきてインストールし直す。
https://releases.hashicorp.com/vagrant/

# 普段のssh周りでエラーが出た時にみる記事
http://qiita.com/shyse/items/9ec50b868b90f847c75f
Tera Term  で バイナリデータのやりとり をシミュレートする

# 目的

組み込みで汎用的な IF として、UART が採用されるケースは多いです。
これを実装するにあたり、動作を PC でさくっとシミュレーションできたら素敵ですね。

# テスト環境

Windows 7 + TeraTerm v4.89 + AE-UM232R

# やってみる

## 最初の準備

TeraTerm  の 設定ファイル (teraterm.ini) を変更してデバッグモードを ON にします。
参考：http://shuzo-kino.hateblo.jp/entry/20111027/1319682490

teraterm.ini は他にもでいろいろできるので触ってみるとイイ

## バイナリデータ受信のダンプ

さきほどのリンク先で説明されていたように、

画面上で「Shift+Esc」を押すごとに、通常表示 ->　デバッグモード ->　16進デバッグモード ->　非表示- >　通常表示 とサイクリックに切り替わります。
16進デバッグモード　を使いましょう。

##### 通常表示
![スクリーンショット 2016-08-17 13.11.46.png](https://qiita-image-store.s3.amazonaws.com/0/54261/a59b5f41-5dc0-df88-0614-0c880d7ee85e.png)

##### 16進
![スクリーンショット 2016-08-17 13.10.27.png](https://qiita-image-store.s3.amazonaws.com/0/54261/3e95b226-d82f-17e0-3bd0-ffd02448fdd3.png)

## バイナリデータ送信

上記とは反対に、 TeraTerm 側から、ターゲットにデータを送信するには TeraTerm マクロを使用します。
下記のようなマクロを用意します。

``` send.ttl
send $54$45$53%54
```

send $XX で hex 形式でデータを送信できます。複数送る場合はつなげます。

## バイナリデータ受信まち

UART でデータのやり取りは双方向の場合が多いです。なので、当然、データ受信待ちも欲しいですね。これもTeraTerm マクロでできます。すごい。
参考：http://ttssh2.osdn.jp/manual/ja/macro/command/wait.html

``` wait.ttl
; 制御コードを待つ
setdebug 2
wait '11 0D 11 0D'
setdebug 0
```

ポイントは setdebug 2 です。これでバイナリデータを解釈できるようになります。

## たとえば

組み合わせるとこんな感じ

- 永遠にデータ送受信を繰り返すマクロ

``` sample.ttl
while 1
    ; 制御コードを待つ
  setdebug 2
  wait '11 0D 11 0D'
  setdebug 0
   ; 1ms delay
  mpause 1
   : データ送信
  send $54$45$53%54
endwhile
```

参考になりましたでしょうか。 TeraTermマクロはいろいろできるのでシミュレーションにはとても良いです。テストも捗りますね。
/var/cache 下のファイルは消して良いのか

# 結論

実践的には「ダメ絶対」

# 詳細

個人的にはむしろ「rsyncレベルのバックアップ対象に/var/cacheを含めるべきか」という話で少し興味があった。関連して、ディスク圧迫時に /var/cache/ 下のファイルで大きい物を消してよいか、というのも興味がある人もいるのかもしんない。

まず[Filesystem Hierarchy Standard](https://ja.wikipedia.org/wiki/Filesystem_Hierarchy_Standard)による、「良い」ことになっている。最新の[3.0](http://refspecs.linuxfoundation.org/FHS_3.0/fhs-3.0.pdf)より引用する

> /var/cache is intended for cached data from applications. Such data is locally generated as a result of
time-consuming I/O or calculation. The application must be able to regenerate or restore the data. Unlike
/var/spool, the cached files can be deleted without data loss. The data must remain valid between
invocations of the application and rebooting the system.
> Files located under /var/cache may be expired in an application specific manner, by the system
administrator, or both. The application must always be able to recover from manual deletion of these files
(generally because of a disk space shortage). No other requirements are made on the data format of the
cache directories.

おそらくだが、特定の時間がかかる作業の成果に例えばIDを振るなどして/var/cache/your_app/(id) とかで書き込んでおき、次回以降はソフトがそのキャッシュを実際にreadしてみて、存在したら結果をそのまま使い、そうでなければ計算し直す、みたいな用途で使えるディレクトリと考えられる。 /tmp と違ってリブート耐性が期待出来るのもポイントが高いのかもしれない。その用途なら/var/tmpがあるけど。

とはいえ現実にはここに大事なデータを突っ込んじゃうソフトが有るようだ

[Can I safely remove /var/cache?](http://unix.stackexchange.com/questions/23156/can-i-safely-remove-var-cache)

大事なデータを突っ込んでしまうアプリケーションとしてまずDNS等で使われるbindが挙げられている。

また、一部のパッケージマネージャ(例えば Debian/Ubuntu系のapt、 RHEL/CentOSのyum, Arch Linuxのpacman等)がこのディレクトリを使うらしく、パッケージマネージャ側の流儀 (`apt-get clean`, `yum clean`, `pacman -Sc`) に従わずに/var/cache 配下の関連ディレクトリに手を入れる (ファイルが大きいからという理由で消したりする) と、ソフトウェア側でまずい挙動を示す可能性があるようだ。FHSの説明に反してはいるが、(文句を垂れるとか必要なら公式にIssue登録した上で)運用者は実際のソフトの挙動に合わせるしかない。

異なる視点で見てみると、/var/cacheのLinuxでのパーミッションはroot/rootに対してdrwxr-xr-x、non-rootアプリに自由に使わせるつもりはないようだ。まぁこれは当たり前といえばそうかもしれないが、FHSの説明通りにキャッシュを保存したいnon-rootアプリはやっぱり/var/tmpに目を向けるしかない気がする。

rsyncの対象に含めるべきか？ 原則含める方向で調整し、消して問題がなく、容量が大きいとか、素性が良くないアプリ(サブディレクトリ)を--excludeで外していくのが良さそうだ。
N + 1 問題


SQLクエリが 「データ量N + 1回 」走ってしまい、取得するデータが多くなるにつれて（Nの回数が増えるにつれて）パフォーマンスを低下させてしまう問題。


例えば、アソシエーションの 1 : n の関係の際にこの問題が生じる



参考
http://zephiransas.github.io/blog/2015/07/08/eager-load-with-paranoia/
http://ruby-rails.hatenadiary.com/entry/20141108/1415418367
http://www.techscore.com/blog/2012/12/25/rails%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E7%B4%B9%E4%BB%8B-n1%E5%95%8F%E9%A1%8C%E3%82%92%E6%A4%9C%E5%87%BA%E3%81%99%E3%82%8B%E3%80%8Cbullet%E3%80%8D/
Dockerのインスタンスを再起動したら動かなくなってた件


Docker Swarm検証の最中にマネージャノードの再起動したらなんか知らんがDockerが起動しなくなってたのでその時の対応をメモっときます。

## What (何が起きた？)

Dockerサーバーのデーモンプロセスが動いてませんでした。
かなC。

```
$ sudo systemctl status docker
* docker.service
   Loaded: loaded (/etc/systemd/system/docker.service; enabled; vendor preset: enabled)
   Active: failed (Result: exit-code) since Wed 2016-08-17 03:03:45 UTC; 10s ago
  Process: 21036 ExecStart=/usr/bin/docker daemon -H tcp://0.0.0.0:2376 -H unix:///var/run/docker.sock --storage-driver aufs --tlsverify --tlscacert /etc/
 Main PID: 21036 (code=exited, status=1/FAILURE)
Aug 17 03:03:45 my-swarm-manager systemd[1]: Started docker.service.
Aug 17 03:03:45 my-swarm-manager docker[21036]: time="2016-08-17T03:03:45.552908091Z" level=info msg="libcontainerd: new containerd process, pid: 21043"
Aug 17 03:03:45 my-swarm-manager docker[21036]: time="2016-08-17T03:03:45.608177408Z" level=fatal msg="Error starting daemon: error initializing graphdriv
Aug 17 03:03:45 my-swarm-manager systemd[1]: docker.service: Main process exited, code=exited, status=1/FAILURE
Aug 17 03:03:45 my-swarm-manager systemd[1]: docker.service: Unit entered failed state.
Aug 17 03:03:45 my-swarm-manager systemd[1]: docker.service: Failed with result 'exit-code'.
```

これじゃよくわからん。
ジャーナルログ見よう。

```
$ sudo journalctl -xe -u docker -o json-pretty
```

JSONでログ見たけど、こんな感じのメッセージが出てました。
出力取り忘れてたのでここには貼れなかった…。

`"Error starting daemon: error initializing graphdriver: driver not supported\"`

## Why (なぜ起きた？)

なんでそんなことになったのか？
正直よくわかってません。
何もしてないのに！（よくあるやつ）
ちゃんと調べろ。

## How (何をする？)

ググったら色々出てきます。
今回はこれでいけました。

Stackdriver [prior storage driver “aufs” failed: driver not supported Error starting daemon: error initializing graphdriver: driver not supported](http://stackoverflow.com/questions/33357824/prior-storage-driver-aufs-failed-driver-not-supported-error-starting-daemon)

```
$ sudo apt-get install linux-image-extra-$(uname -r) aufs-tools && sudo modprobe aufs
```

あとDocker起動しましょう。

```
$ sudo systemctl start docker
```
Javaだけで、webのフロントとサーバが作れるGWTを始めませんか？　その３

GWTの普及に少しでも役に立てば？と思い・・
次のサイトを立ち上げました。

http://gwt-japan.dix.asia/GWT_JAPAN/

gwt自体、日本語の情報が限られているので、お世話になっている恩返しもかねて・・
未経験でIT企業に入社して感じた事

皆さんこんにちは、yaseino a です。
今回初投稿です。よろしくお願いします。
1年半前にIT企業に未経験で入社して感じたことを思い出しながら書いてみようと思います。

##**感じた事その１．みんな声が小さい**
IT企業に入社してまず初めに躓いた点がこちらです。笑
自身の前職が販売職で、毎日、「明るく元気にいらっしゃいませぇぇ！！！」みたいな職場だった為、IT業界（特有？！）の皆さんの声の小ささに、初めの頃は何をおっしゃっているのか聞き取れず、かなり苦労しました。
なぜなんでしょうね？販売業なんかは、キャピキャピオラオラな人が多かったのですが、ITは真面目でおとなしい方の割合が多いからでしょうか。
逆に今になって職場の皆さんに言われた事は、「kirin さん声でかかった。笑」でした。
恥ずかしい～！

##**感じた事その２.何を言っているのか意味不明**
入社したばかりの頃、会社の皆さんには色々と説明していただき、とてもありがたかったです。
でもごめんなさい。本当に何を言っているのかさっぱり理解できなかったんです。
専門用語が多すぎて分からなかったんです。
分からなければ聞けばよいと思うのですが、一つの文章の中に4つも5つも分からない用語がでてくるんです。いちいち質問していては会話になりませんから、できるだけメモしておいてあとでググるを繰り返していました。
いやぁgoogle先生には非常にお世話になりました！！


##**感じた事その３.意外と残業がない**
入社して1年半、現場は3回変わりましたが、どの現場も意外と残業がなかったです！
もちろん、環境構築など何かしら納品物と期限がある案件の場合は、状況によっては残業が発生しましたが、「慢性的に残業がある」というような状況はなかったです。
逆にどの現場に行っても残業している人は結構いつも同じ人だなと思います。
どの業界においても同じだなと思ったことは、残業の発生有無についておおかたは「現場によって決まる」のではなく「人(仕事のやり方など)によって決まる」のだなということです。
<br>
<br>



以上が未経験でIT企業に入社して感じた主な事柄です。
その上で私が大切にしてきた、また、今でも大切にしている事を書いていきたいと思います。

#**<Font color="blue">エンジニアとして大切にしていること</font>**#
**【自転車に乗れるようになった過程を思い出す】**
上に書いたとおり、初めは誰と話しても何を言っているのか理解できない、技術書を開いてみても何を書いているか分からない状況でした。
未経験で入社した方の中でもかなりの人数が、業界の内容が難しすぎて自分にはついていけないからと、早期に辞めていきました。
私は自分に自信がなくなった時は以下のように自分に言い聞かせることにしています。

**"自転車に乗れなかった頃は、乗れるようになった自分が全くイメージできなかったが、最終的には乗れるようになるのだ。"**

ようは初めはできなくとも当たり前。チャレンジし、壁にぶつかり、その結果**<Font color="red">現時点ではできないという情報を得ただけでも進歩</font>**なのです。
また、途中段階で自身の成長が感じられない期間というものがきっと発生します。
投げ出したい気持ちになりますが、**<Font color="red">成長が見えない期間でも、実はしっかりと努力したことが積み上げられている</font>**のです。
それがある時点で急にできるようになったりするものなのです。
努力を続けられる人はそういったことを知っているのです。

（もしかすると、そもそも自転車に乗れるようになるまでそんなに苦労していない方もいらっしゃるかもしれませんが。）

このことは、どんなことにも当てはめて考えることができますね？
特に未経験で業界に入った方など、少しでもこの記事が諦めずに努力を続ける為の材料になればと思います。

最後までお読みいただき、ありがとうございました。
Docker Remote APIでSwarmのServiceを検索する


Dockerを操作できるDocker Remote APIをいろいろ触ってみたので覚書。

# SwarmのService一覧を取得する

```
$ curl http://DOCKER.ENDPOINT/services/
```

```
[{
  "ID": "SERVICE_ID",
  "Version": {
    "Index": 481
  },
  "CreatedAt": "2016-08-16T06:57:27.740891834Z",
  "UpdatedAt": "2016-08-16T06:57:27.740891834Z",
  "Spec": {
    "Name": "EXAMPLE",
    "TaskTemplate": {
      "ContainerSpec": {
        "Image": "XXXXXXXXXXX.dkr.ecr.us-west-2.amazonaws.com/docker-example001:latest",
        "Args": [
          "-p",
          "10001:8080"
        ]
      },
      "Resources": {
        "Limits": {},
        "Reservations": {}
      },
      "RestartPolicy": {
        "Condition": "any",
        "MaxAttempts": 0
      },
      "Placement": {}
    },
    "Mode": {
      "Replicated": {
        "Replicas": 1
      }
    },
    "UpdateConfig": {
      "Parallelism": 1,
      "FailureAction": "pause"
    },
    "EndpointSpec": {
      "Mode": "vip"
    }
  },
  "Endpoint": {
    "Spec": {}
  },
  "UpdateStatus": {
    "StartedAt": "0001-01-01T00:00:00Z",
    "CompletedAt": "0001-01-01T00:00:00Z"
  }
}]
```

### SwarmのServiceを検索する

filtersクエリを使うことでnode idかnode nameを使った検索ができます。

#### node idで検索
`filters={ "id": [ 'NODE_ID' ] }`をURLエンコードして検索します。

```
$ curl "http://DOCKER.ENDPOINT/services?filters=\{%22id%22:\[%22NODE_ID%22\]\}"
```


#### node nameで検索
`filters={ "name": [ 'NODE_ID' ] }`をURLエンコードして検索します。

```
$ curl "http://DOCKER.ENDPOINT/services?filters=\{%22name%22:\[%22NODE_NAME%22\]\}"
```


## SwarmのServiceをnode ID指定で取得する

```
$ curl http://DOCKER.ENDPOINT/services/SERVICE_ID
```

###戻り値
```
{
  "ID": "SERVICE_ID",
  "Version": {
    "Index": 481
  },
  "CreatedAt": "2016-08-16T06:57:27.740891834Z",
  "UpdatedAt": "2016-08-16T06:57:27.740891834Z",
  "Spec": {
    "Name": "EXAMPLE",
    "TaskTemplate": {
      "ContainerSpec": {
        "Image": "XXXXXXXXXXX.dkr.ecr.us-west-2.amazonaws.com/docker-example001:latest",
        "Args": [
          "-p",
          "10001:8080"
        ]
      },
      "Resources": {
        "Limits": {},
        "Reservations": {}
      },
      "RestartPolicy": {
        "Condition": "any",
        "MaxAttempts": 0
      },
      "Placement": {}
    },
    "Mode": {
      "Replicated": {
        "Replicas": 1
      }
    },
    "UpdateConfig": {
      "Parallelism": 1,
      "FailureAction": "pause"
    },
    "EndpointSpec": {
      "Mode": "vip"
    }
  },
  "Endpoint": {
    "Spec": {}
  },
  "UpdateStatus": {
    "StartedAt": "0001-01-01T00:00:00Z",
    "CompletedAt": "0001-01-01T00:00:00Z"
  }
}
```

取れるデータは一覧とID指定どちらも同じ内容っぽい。
なのでlistでとってIDから詳細取りに行くより、listの方使った方が手っ取り早い気がする。serviceの数が多くなるとしんどくなりそうですが。
文字がランダムで、切り替わるサンプル

文字がランダムな配列から正しい文字列に並び変わるのを前に自分で作った


[AADA](http://dorodoro.info/aada/)

のマウスオーバーみたいのです



何度も作るの面倒なので、メモがてら書きます。

まず

h2タグを対象として、マウスオーバーの時に連続したりすると、文字列がランダムのままになってしまったりするので、まずは正しい内容を属性タグなどに移動をします（今回はrelに）

```javascript:***.js
$('h2').attr("rel",$('h2').text());
```

次に、ランダムな文字列を用意します。

```javascript:***.js
var _arr = ["q","w","e","r","t","y","u","i","o","p","a","s","d","f","g","h","j","k","l","z","x","c","v","b","n","m"]

```
これは単純に英語の小文字のランダムなのですが"1","2"とかにすると数字の値のランダムが作れたり、


```javascript:***.js
var _arr = ["ご","み"]
```
ってすると「ごみみごごごごみみみ」みたいになったりします。

使う関数は

```javascript:***.js
function randam(word,target){
  target.text(randget(word.length));
  var _num = 0;
  var _si = setInterval(function(){
    _num++;
    var _str = word.substr(0, _num);
    _str += randget(word.length-_num);
    target.text(_str);
    if(_num == word.length){
      clearInterval(_si);
    }
  },50);
}

function randget(_num){
  var _str = "";
  for(var i = 0 ; i < _num ; i++){
    _str += _arr[Math.floor(_arr.length*Math.random())];
  }
  return _str;
}
```

これを使う時は

```javascript:***.js
randam($('h2').attr("rel"),$('h2'));
```



だけです。

##まとめ

クラスにするほど複雑じゃないけど、
ゼロから書くほど単純でもないので、コピペで使えると楽でよいなって思います。

ご利用は自己責任で！
Macで特殊文字を入力するショートカットを設定する


→や⇒というような特殊文字を入力する方法を紹介します．

# できること

Macで文字を入力する際，`「Option」＋「E」`で\（バックスラッシュ）が入力できます．この手のショートカットキーはデフォルトで他にも設定されています．

デフォルトを確認するには[このページ](http://inforati.jp/apple/mac-tips-techniques/system-hints/how-to-use-special-characters-and-symbols-keyboard-shortcut-with-macos.html)を見るか，「キーボードビューア」機能を使います．

でも，自分がよく使う記号にショートカットキーが割り当てられているとは限らないので，カスタマイズしたいです．
`DefaultKeyBinding.dict`というファイルを作成することで，カスタマイズができました．

ただし，このカスタマイズは全てのアプリで有効にはならなかったです．`Atom`と`CoqIDE`では，有効になりました．


# 設定方法

`~/Library/KeyBindings`というディレクトリを作る

上記ディレクトリに`DefaultKeyBinding.dict`というファイルを次の内容で作成

```DefaultKeyBinding.dict
{
  "~c" = ( "insertText:", "→" );
  "~C" = ( "insertText:", "⇒" );
  "~g" = ( "insertText:", "γ" );
  "~G" = ( "insertText:", "Γ" );
  "~o" = ( "insertText:", "⊥" );
  "~O" = ( "insertText:", "⊤" );
  "~d" = ( "insertText:", "⊃" );
  "~s" = ( "insertText:", "⊂" );
  "~S" = ( "insertText:", "∈" );
  "~h" = ( "insertText:", "∨" );
  "~H" = ( "insertText:", "∧" );
}
```

![Kobito.S5yJki.png](https://qiita-image-store.s3.amazonaws.com/0/128380/8dbdd4bf-99c6-df30-a8fe-b06824819b20.png "Kobito.S5yJki.png")


「システム環境設定」の「キーボード」あたりから英語の入力ソースを追加（もしなければ）

![Kobito.9NgYN4.png](https://qiita-image-store.s3.amazonaws.com/0/128380/c070bc78-2d42-b343-6704-859f2d380360.png "Kobito.9NgYN4.png")

CoqIDEを起動中なら，再起動します．

入力ソースを英語のものにします．

これで，次のようなキー割り当てが有効になったと思います．

|キー|文字|
|---|---|
|⌥C|→|
|⌥⇧C|⇒|

残念ながら，現在この文書を書くのに使っているKobitoでは，できませんでした．

`DefaultKeyBinding.dict`等のキーワードで検索すると上記手順に関連する情報が出てきます．

# Unicode Hex Inputの使い方

調べていたら「Unicode Hex Input」という入力ソースがあった．

これの使い方は⌥を押しながら文字コード4桁入力するとその該当する文字が入力されるというもの．
Slackで大きな絵文字を使う（ImageMagickで画像を正方形にpaddingして4分割する）

# Slackで大きな絵文字を使う
Slackでは、このような感じにemojiを2x2の4つに並べると、大きなemojiを作ることができます。

<img width="244" alt="巨大な :sob:" src="https://qiita-image-store.s3.amazonaws.com/0/17718/b2e67753-0918-ea54-320f-953e0d7d104b.png">

```
:sob-1::sob-2:
:sob-3::sob-4:
```

# ImageMagickで画像を正方形にpaddingして4分割する
画像を加工するのが面倒だったので、コマンド一発で実現する方法を考えました。

```bash
# 237x210の画像に透過色の余白をつけて256x256にする
convert original.png -thumbnail 237x210 -background transparent -extent 256x256 265x256.png

# 画像を4枚に分割する
# これによって、sob-0.png, sob-1.png, sob-2.png, sob-3.png が出力される
convert -crop 50% 265x256.png sob.png

# 16分割するときは、-crop 25% とします
convert -crop 25% 265x256.png sob.png
```

なお、emojiは128pxが上限であるため、上では256pxにリサイズしました。
Mac + Go + Revelフレームワーク ゼロから３分で開発環境構築

Mac + Go + revelフレームワークの開発環境/アプリケーションをゼロから構築する手順を
コマンドベースでまとめました。実務で使うことを考慮してgoのバージョン管理をできるようにしています。

### 前提条件
Homebrewがインストールされていること

### brew アップデート
```
brew update
```

### gvm (goのバージョン管理ツール)のインストール
```
bash << (curl -s -S -L https://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer)
source ~/.gvm/scripts/gvm
```

### 起動時 の設定追加 (bash)
```
echo 'if [[ -s "$HOME/.gvm/scripts/gvm" ]];' >> ~/.bash_profile
echo '    then source $HOME/.gvm/scripts/gvm' >> ~/.bash_profile
echo 'fi' >> ~/.bash_profile
```

### インストール可能なGo言語バージョンの確認
```
gvm listall
```

### Go言語のインストール 今回は1.7を入れる。gvm使う場合 先にgo1.4がないと怒られてしまう。 --default をつけるとセッションが切れた時も指定される
```
gvm install go1.4.3
gvm use 1.4.3
gvm install go1.7
gvm use 1.7 --default
```

### Goのバージョン確認
```
go version
```

### GOPATHにGoアプリケーションのコードを置く場所を追加 ここでは ~/gocode とする
```
echo 'export GOPATH="$GOPATH:$HOME/gocode"' >> ~/.bash_profile
echo 'export PATH="$PATH:$GOPATH/bin"' >> ~/.bash_profile
```

### revelをインストールする。
```
go get github.com/revel/revel
go get github.com/revel/cmd/revel
```

### revel アプリケーションを作成
```
cd ~/gocode
revel new my_revel_app
```

### revel アプリケーションを起動
```
releve run my_revel_app
```

### アクセス
```
localhost:9000
```
### IDE(統合開発環境)　について
Eclipse の場合は http://goclipse.github.io/releases/ を
Help > Install new Softwareからaddして、goclipseをインストール

#### 注意
GOPATHで設定したパス以外の場所で revel new ~ はできない。
GitHub Desktopのメモ


# 起動画面

開くとこんな画面が表示される

![Kobito.Rmm1yF.png](https://qiita-image-store.s3.amazonaws.com/0/128380/c78e294a-74ca-bf03-a8f4-b99af75814f5.png "Kobito.Rmm1yF.png")

# 使い方

ファイルを編集する

画面上部の`Uncommitted Change`をクリック

`Summary`を入力

`Commit to master`をクリック

`Sync`（黒いボタン）をクリック

# 上記の取り消し方

`Open in Terminal`でターミナルを開く

次のコマンドを入力

`git reset --soft HEAD^`
`git push -f`
RepoForge(RPMForge)の本家が停止しているようで困った話のメモ書き

例によってメモ書きです。


# RepoForge(RPMForge)が止まっている？

Twitter界隈では、本家のリポジトリは終了したといううわさも…。

RepoForgeのトップページは動いていますが…

http://repoforge.org/

いざリポジトリを追加しようと、RPMファイルを落とそうとしても…

http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm

**おちてこねえええええ！**

本家のトップページには、

> RepoForge might be outdated. We have no updates since very long time.

なんて書いてあるワケです。

これは困った…

# すでにリポジトリを追加してあるサーバでは使えた？

本家のリポジトリは停止してしまっているようですが、ミラーサイトはまだ生きています。

例えば国内だと

http://mirror.fairway.ne.jp/dag/redhat/el6/en/x86_64/rpmforge/
(2016.8.17現在)

# 手動で設定するか、ミラーからRPMを落とせば大丈夫

今のところ、これでいけます。

`rpm -ivh http://mirror.fairway.ne.jp/dag/redhat/el6/en/x86_64/rpmforge/RPMS/rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm`

ただ、本家が停止しているので、ミラーもいつ停止するかわからないという不安…
ほかのリポジトリで代用できるのであれば、そっちに移ったほうが賢明かもしません。
Mac OS X + Zsh でプロセス置換

メモ。
Mac OS X + Zsh でプロセス置換しようとしたらこんなエラー。

```
diff -u <(command1) <(command2)
error: /dev/fd/11: unsupported file type
fatal: cannot hash /dev/fd/11
```

```<()``` を ```=()``` に置き換えれば良いのかしら。

```
diff -u =(command1) =(command2)
```

うまくいった。
捗れ。


参照
https://www.reddit.com/r/commandline/comments/2xig13/handy_bash_feature_process_substitution_xpost/
WP-CLIでDBを出力する際のファイル名を「年月日_時分秒_DB名.sql」にするコマンド

開発時にロールバックしたいときなどに備えて。``wp eval``なんて初めて使ったよ。

```wp db export `env TZ=Asia/Tokyo date "+%Y%m%d_%H%M%S"`_`wp eval 'echo DB_NAME;'`.sql```
システム アプリケーションとして Xamarin.Android をインストール

■ 手順

0\. Root化した端末を用意

1\. "/bin/Release/*.apk" を解凍

2\. 解凍先の "/lib/armeabi-v7a/*.so" にあるファイルを端末の "/system/lib/" にコピー

3\. "/bin/Release/*.apk" を端末の "/system/priv-app/" にコピー

4\. 端末の再起動

5\. アプリを実行


■ 実験に使用したコード

▼ 追加権限

\<uses-permission android:name="android.permission.MANAGE_USB" />

▼ ソースコード

    var usbManager = (Android.Hardware.Usb.UsbManager)GetSystemService("usb");

    var methods = usbManager.Class.GetDeclaredMethods();

    for (int i = 0; i < methods.Length; i++)
    {                
        if (methods[i].Name.Equals("setCurrentFunction"))
        {
            methods[i].Accessible = true;

            try
            {
                // USB でパソコンに接続するときの設定を MTP に変更
                methods[i].Invoke(usbManager, new Java.Lang.String("mtp"), true);

                Toast.MakeText(this, methods[i].Name, ToastLength.Long).Show();
            }
            catch(Java.Lang.Reflect.InvocationTargetException e)
            {
                Toast.MakeText(this, e.Cause.Message, ToastLength.Long).Show();
            }
        }
    }


参考:
Installing Xamarin.Android as a System App
https://developer.xamarin.com/guides/android/advanced_topics/install-system-app/
Chromeデベロッパーツールでスマホのジャイロセンサーをエミュレートする


# スマホはセンサーの塊！
以前、ICS MEDIAの記事「[スマートフォンはセンサーの塊！ 
たった数行のHTML5とJSで扱えるセンサーまとめ(デモ・動画あり)](https://ics.media/entry/4095)」で、Webの技術でスマホのセンサーへアクセスする方法を紹介しました。その中でも使用頻度が高め？ な**ジャイロセンサー**のエミュレートをChromeのデベロッパーツールでやっちゃおう！ というお話です :iphone: 

# ジャイロセンサーのエミュレートはデベロッパーツールのSensorsでできる

ジャイロセンサーのエミュレートはデベロッパーツールの`Sensors`からできます。

まずは、作成したアニメーションをChromeで表示し、デベロッパーツールを開きます。

![](https://qiita-image-store.s3.amazonaws.com/0/55103/039706c7-7464-6481-2d13-c0af4ba1c43c.png)

デベロッパーツールが開いたら、ウィンドウの右上にある「・・・」の中にある「Show console」をクリックしてconsoleを開きます。

![](https://qiita-image-store.s3.amazonaws.com/0/55103/52f593c2-813f-faba-2737-43dd60b528bf.png)

consoleが開いたら、consoleの左上にある「・・・」の中に「Sensors」があるのでクリックして開きます。

![cap1.png](https://qiita-image-store.s3.amazonaws.com/0/55103/c5a722e3-155e-ee75-0768-09150ac848e6.png)

これが「Sensors」で、この中の「Orientation」がジャイロセンサーです。

![cap2.png](https://qiita-image-store.s3.amazonaws.com/0/55103/9bb7e7d2-53b8-4e40-5da2-096a85bd0247.png)

「Orientation」は標準で「Off」になっているので、セレクトボックスから「Custom orientation」を選択します。

![cap3.png](https://qiita-image-store.s3.amazonaws.com/0/55103/13bce163-3f85-d19b-3790-b9feb7a3dae1.png)

alpha、beta、gammaの値を直接入力したり、右側のスマホ部分をドラッグでぐるぐると操作できます。

![anime.gif](https://qiita-image-store.s3.amazonaws.com/0/55103/82a8fd4f-f245-54a8-d980-68307a63c25b.gif)

# 実機確認の回数が激減

ジャイロセンサーの搭載されていない環境(パソコンなど)で開発していると、実機での確認が増えます。このSensorを使えば、**動作しているのかどうか**を確認できるので便利です。ですが、ジャイロセンサーの感度やユーザーの体感は実機でしか試せないので、最後はちゃんと実機で確認しましょう :smile:
WSUS Offline Update を使ってみた

■ 環境

Windows 7 SP1 x86 (ISO)


■ インストール済みファイル

A. IE11-Windows6.1-x86-ja-jp.exe

B. Windows6.1-KB3020369-x86.msu

C. Update for Windows 7 (KB3125574)


■ 手順

1\. /wsusoffline/UpdateGenerator.exe を起動

![image](https://qiita-image-store.s3.amazonaws.com/0/137021/b7583e2e-476a-eeb1-e94f-d4ca1c134064.png)

2\. [Start] ボタンを押すとコマンドプロンプトが起動して、指定したファイル類をダウンロード開始

3\. ダウンロードが終了したら、/wsusoffline/client/UpdateInstaller.exe を起動

![image](https://qiita-image-store.s3.amazonaws.com/0/137021/a83cd8fa-73a4-7210-3053-19776002f0d5.png)

4\. [Automatic reboot and recall] のために UAC を「通知しない」にする

5\. [Start] ボタンを押すとコマンドプロンプトが起動して、指定したファイル類をインストール開始

6\. 何度か再起動を繰り返しながらインストールされて行き、数時間かけてインストールが完了する
Raspberry Pi 不要パッケージの削除

Raspberry Piからファイルサイズの大きな不要なパッケージを削除をまとめました。
## Wolframとmathematica 640MB程度
 $ sudo apt-get purge wolfram-engine
Sonic Pi
 $ sudo apt-get purge sonic-pi
## Scratch　30MB程度
 $ sudo apt-get purge scratch
## libreoffice 250MB程度
 $ sudo apt-get remove --purge libreoffice*
 $ sudo apt-get clean
 $ sudo apt-get autoremove

ここまでの作業でディスク容量が約2.1GBになりました。
Unity Pro packagesの背景除去サンプル"GreenScreen"をUnity5以降で実行したい

初めまして。初投稿なので勝手が分からないのですがお手柔らかにお願いします。

MS公式の、Kinect v2をUnityで動かすパッケージ、Unity Pro packagesの
背景除去サンプルが動かない！って詰んだので記録。

Kinect v2をUnity5でとりあえず動かす(カラー画像、骨格画像を描画する)までは、
こちらの中村薫さんの記事を参考にしました。
http://www.buildinsider.net/small/bookkinectv2/0601
http://www.buildinsider.net/small/bookkinectv2/0603
http://www.buildinsider.net/small/bookkinectv2/0635

Unity Pro packagesをダウンロードしてZipを解凍。
Unityパッケージ"Kinect.2.0.1410.19000.unitypackage"をインポート。続いて、
GreenScreenフォルダをUnityのProjectビューにコピーします。
API変更の自動更新をするダイアログが表示されたら、「I Made a Backup. Go Ahead!」をクリックします。
Kinect v2が接続されていることを確認したら、GreenScreenフォルダにある「MainScene」を開いて実行。
すると、人物を切り抜いて画面に表示してくれるはず…なのですが……

何も起こらない！
エラーはなく一応実行はできるのですが、マゼンダ色の画面しか表示されず……

よく見るとシェーダーでエラーが発生しています。
GreenScreen > Materials > GreenScreenShader
![image](https://qiita-image-store.s3.amazonaws.com/0/137340/3b145fcc-1eae-73ff-6da5-b3c4c79ca227.png)
> Fragment program 'frag': sampler 'SampleType' has no matching texture and will be undefined.

テクスチャが一致しない？持っていない？(読めない)

色々調べてみたら
どうやら仕様が変更されたというか、記述の仕方が変わったようです…
「GreenScreenShader.shader」を修正しましょう。

13行目の　`Texture2D _MainTex;`　を
`UNITY_DECLARE_TEX2D(_MainTex);`　に変更。
57～58行目あたりの　
`o = _MainTex.Sample(SampleType, i.tex);`　を
`o = UNITY_SAMPLE_TEX2D(_MainTex, i.tex);`　に変更。

そうしてUnityに戻るとマゼンダだった板が黄緑になります。
![image](https://qiita-image-store.s3.amazonaws.com/0/137340/83505296-8636-1187-787e-f23cd9129aa1.png)
エラーも消えてくれましたね！
これで実行すれば正しく動くはずです。
素敵なKinect v2ライフを～♪

……MSさん、修正して配布してください…！
WP CLIを利用して、コア、プラグイン、テーマ、翻訳ファイルをアップデートする

WP CLIのアップデートをまず行う。（古いバージョンだとコアを最新版にアップデートした後、正しくWP CLIが動かない可能性があるため）


## WP CLIバージョンの確認

```
$ wp cli version
WP-CLI 0.24.1
```

## WP CLIアップデート

```
wp cli update
```

wp cliのアップデートが終わったら、今度はそれぞれのWordPressのサイトにおいて、アップデートを行う。アップデート前にサイトのバックアップをしておく


## WordPressが利用しているDBのエクスポート（バックアップ用）

```
$ wp db export hogehoge.sql
```


## コア、プラグイン全て、テーマ全て、翻訳ファイル をアップデートするワンライナー（一行のコメント）

```
wp core update && wp plugin update --all && wp theme update --all && wp core language update
```

# おまけ よく使うWP CLIのコマンド

## DB内のドメインを置換した状態でエクスポート（元のDBはそのまま残る。本番などドメインの異なる環境への移行用）

```
$ wp search-replace '元のドメイン' '置換後のドメイン' --export=hogehoge.sql
```

※ ドメインはhttpから記載、最後のスラッシュは無し

## コアファイルの改竄チェック

```
$ wp core verify-checksums
```

以下の内容が表示されれば問題なし

```
Success: WordPress install verifies against checksums.
```



## Git管理している場合のpushまで

```
git reset --hard HEAD && wp core update && wp plugin update --all && wp theme update --all && wp core language update && git add -A && git commit -m "update all" && git push origin master
```
apexでLambdaを管理している際に指定のVPCで動かすための設定


## apexとは

http://apex.run

AWSのLambdaを管理するモノ

### VPCの設定

source: https://github.com/apex/apex/blob/master/vpc/vpc.go
document: http://apex.run (vpc)


## setting

```
.
├── functions
│   └── foo
│       ├── function.json
│       ├── main.go
└── project.json
```


```function.json
{
  "vpc": {
    "securityGroups": ["sg-XXXXXXXX"],
    "subnets": ["subnet-XXXXXXXX", "subnet-XXXXXXXX"]
  }
}
```

このように`function.json`を記述することで可能になる。
特定ブランチのgit push origin masterを禁止する


# Gitで`git push origin master`を禁止するやり方

## 背景

個人開発では自由ですが、チーム開発でmasterにpushすると信用を失いかねません。masterにpushしないようにしようと心がけることは大事ですが、人間はミスをする生き物なので、機械に未然に防いでもらいたいものです。今回はそのやり方を共有します。

## gitのhooksを使うやり方

1  `.git/hooks/pre-push`を作成
2  `.git/hooks/pre-push`を編集

```
#!/bin/bash

while read local_ref local_sha1 remote_ref remote_sha1
do
  if [[ "${remote_ref##refs/heads/}" = "master" ]]; then
    echo "Do not push to master branch!!!"
    exit 1
  fi
done
```

3  作ったファイルに実行権限を付与
`$ chmod a+x .git/hooks/pre-push`

これでターミナルを再起動すれば、該当レポジトリで`git push origin master`をした時にターミナルに
`Do not push to master branch!!!`
と表示されます。


## `.zshrc`に追記する方法もある
http://qiita.com/akymrk/items/b46b03b313850e3ae418
しかし、私の場合、他人に迷惑のかからない個人プロジェクトではmasterに直接pushしたいのでこちらの採用は見送った。
MacでのSubversionアプリ

色々と比較した結果SnailSVNにたどり着きました。
SnailSVNはApple Storeよりダウンロードして使用可能に。

メニューなどの表記は英語のみですが、

SVN Checkout

Create SVN Repository

SVN Log

など、いつも見ている英単語しか出てこないので、マニュアルを見なくてもそこそこ設定、編集は可能でした。

また、無料版と有料版の2種類用意されており、無料版だと1つしかワーキングコピーの管理ができなかったです。

仕事で使用する場合は有料版一択ですね...

私が有料版をダウンロードした時(2016/7/27)は¥1080でした。
配布元が日本国外なので、その時の状況により価格の変更がされているかもしれません...

[SnailSVN:無料版](https://itunes.apple.com/jp/app/snailsvn-free-svn-client-finder/id1063090543?mt=12)

[SnailSVN:有料版](https://itunes.apple.com/us/app/snailsvn/id847259925?ls=1&mt=12)
PowerShellでプリンタートレイの数値Valueを見つける

 
Accessのプリンタートレイ指定が、

- acPRBNUpper
- acPRBNMiddle
- acPRBNLower
- acPRBNAuto

では指定できないプリンターが発見。

この場合、プリンター固有のトレイの数値Valueを渡してやる必要がある。
本来はVisual Studioを引っ張り出してWindowsのAPIを見ながらテストコードを書いて調べる必要がある。
でもそんな面倒なことはしたくない。
PowerShellでサッと何とかならないものだろうか？


##Get-PrintConfigurationを使って調べる

```ps1:Get-PrintConfiguration
PS1 > $conf=Get-PrintConfiguration -PrinterName "SHARP MX-4140FN SPDL2-c(Color)"
PS1 > $conf.PrintCapabilitiesXML > print.xml
```

このXMLにトレイの番号が入っている。

PrintCapablititesから出力したprint.xmlをInternetExplorer11かEdgeで開く。
プリンタートレイの部分だけ抜粋すると下記のようになる。

```xml:JobInputBinを抜粋
<?xml version="1.0"?>
-<psf:PrintCapabilities xmlns:psk="http://schemas.microsoft.com/windows/2003/08/printing/printschemakeywords" xmlns:ns0000="http://schemas.microsoft.com/windows/printing/oemdriverpt/SHARP_MX_4140FN_SPDL2_c_5_2_3790_2_" version="1" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:psf="http://schemas.microsoft.com/windows/2003/08/printing/printschemaframework">
-<psf:Feature name="psk:JobInputBin">
-<psf:Property name="psf:SelectionType">
<psf:Value xsi:type="xsd:QName">psk:PickOne</psf:Value>
</psf:Property>
-<psf:Property name="psk:DisplayName">
<psf:Value xsi:type="xsd:string">給紙方法(S)</psf:Value>
</psf:Property>
-<psf:Option name="ns0000:Auto">
-<psf:Property name="psk:DisplayName">
<psf:Value xsi:type="xsd:string">自動給紙</psf:Value>
</psf:Property>
</psf:Option>
-<psf:Option name="ns0000:User0000000261">
-<psf:Property name="psk:DisplayName">
<psf:Value xsi:type="xsd:string">手差し</psf:Value>
</psf:Property>
</psf:Option>
-<psf:Option name="ns0000:User0000000257">
-<psf:Property name="psk:DisplayName">
<psf:Value xsi:type="xsd:string">トレイ 1</psf:Value>
</psf:Property>
</psf:Option>
-<psf:Option name="ns0000:User0000000258">
-<psf:Property name="psk:DisplayName">
<psf:Value xsi:type="xsd:string">トレイ 2</psf:Value>
</psf:Property>
</psf:Option>
</psf:Feature>
</psf:PrintCapabilities>
```

上記のXMLの分析を行うと、
トレイのValueは次のようになる。

- トレイ1 257
- トレイ2 258
- 手差し 261

これをトレイの命令にセットすることにより、
トレイ指定ができるようになる。﻿

##参考文献
[Get-PrintConfiguration](https://technet.microsoft.com/ja-jp/library/hh918352(v=wps.630).aspx)
[PaperBin - Access](https://support.office.com/ja-jp/article/PaperBin-%E3%83%97%E3%83%AD%E3%83%91%E3%83%86%E3%82%A3-c5d63fcc-d8ee-485e-b843-4a13de0453b9)
加速度センサーの値を強度と角度に変換

加速度センサーの値が静止していると1Gを示します。
その時の加速度センサーの値を(x,y,z)として、重力のみを検出しているときに、センサーがどの角度に傾いているのか計算してみたいと思います。その前提として、加速度センサーの絶対値 aが、1のときであることを前提としています。
すなわち a = √(x^2+y^2+z^2) = 1G＝9.8m/sのことです。

+ a = √(x^2+y^2+z^2)
+ Θx = atan(x /√(y^2+z^2)) * 180 / 3.14
+ Θy = atan(y /√(x^2+z^2)) * 180 / 3.14
+ Θz = atan(z /√(x^2+y^2)) * 180 / 3.14

この計算では、空間を次の方法で表現しています。

+ aは、加速度の絶対値
+ ΘxはYZ平面に対する角度
+ Θyの角度はZX平面に対する角度
+ Θx軸の角度はXY平面に対する角度

![acc_graph1.png](https://qiita-image-store.s3.amazonaws.com/0/136933/34e2bc6c-fabb-41e7-9c95-932edafeccbe.png)
![acc_graph2.png](https://qiita-image-store.s3.amazonaws.com/0/136933/afa7cc1d-b9a6-88ab-ee9f-a64de8db349a.png)
![acc_graph3.png](https://qiita-image-store.s3.amazonaws.com/0/136933/366bc622-0c89-ebf3-57ac-8be640befebf.png)

この計算式を使って基板の角度を計算すると、重力が向いている方向を知ることが出来ます。

![detail.png](https://qiita-image-store.s3.amazonaws.com/0/136933/012b1e76-4495-a2d7-cf87-b2a47c87b172.png)
北海道各种振兴局

	
	
```ruby

胆振综合振兴局

	
	市部：室兰市、苫小牧市、登别市、伊达市
	虻田郡：丰浦町、洞爷湖町
	有珠郡：壮瞥町
	白老郡：白老町
	勇拂郡：安平町、厚真町、鹉川町（原名：むかわ町）

日高振兴局

	
	沙流郡：日高町、平取町
	新冠郡：新冠町
	日高郡：新日高町（原名：新ひだか町）
	浦河郡：浦河町
	样似郡：样似町
	幌泉郡：襟裳町（原名：えりも町）
	
	
样似町	襟裳町大树町、广尾町浦幌町	


	
十胜综合振兴局
	
	市部：带广市
	河东郡：音更町、士幌町、上士幌町、鹿追町
	上川郡：新得町、清水町
	河西郡：芽室町、中札内村、更别村
	广尾郡：大树町、广尾町
	中川郡：幕别町、池田町、丰顷町、本别町
	足寄郡：足寄町、陆别町
	十胜郡：浦幌町	


	
钏路综合振兴局

	市部：钏路市
	钏路郡：钏路町
	厚岸郡：厚岸町、滨中町
	川上郡：标茶町、弟子屈町
	阿寒郡：鹤居村
	白糠郡：白糠町
	
	
根室振兴局
	
	市部：根室市
	野付郡：别海町
	标津郡：中标津町、标津町
	目梨郡：罗臼町
	以下为日本北方四岛（南千岛群岛）原有的町村，现在为俄罗斯管辖。
	色丹郡：色丹村
	国后郡：泊村、留夜别村
	择捉郡：留别村
	纱那郡：纱那村
	蘂取郡：蘂取村
	
	
	
鄂霍次克综合振兴局
	
	市部：北见市、网走市、纹别市
	网走郡：大空町、美幌町、津别町
	斜里郡：斜里町、清里町、小清水町
	常吕郡：训子府町、置户町、佐吕间町
	纹别郡：远轻町、涌别町、泷上町、兴部町、西兴部村、雄武町
	

上川综合振兴局
	
	市部：旭川市、士别市、名寄市、富良野市
	上川郡（石狩国）：鹰栖町、东神乐町、当麻町、比布町、爱别町、上川町、东川町、美瑛町
	上川郡（天盐国）：和寒町、剑渊町、下川町
	空知郡：上富良野町、中富良野町、南富良野町
	勇拂郡：占冠村
	中川郡：美深町、音威子府村、中川町
	雨龙郡：幌加内町

```
GlassFish4.0でJava8のStreamAPIを使うとサーバー起動時にエラーが発生する

glassfish4.0でStreamAPIを使うとサーバー起動時にエラーがでます

#サーバー起動時にエラーが発生するソースと実行結果
##ソース
``` Sample.java
package simple;

import java.util.List;

import javax.jws.WebMethod;
import javax.jws.WebService;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;

import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.ArrayListHandler;
@WebService
public class SimpleWeb {
	   
	  @WebMethod
	  public String sayHello(String name) throws Exception{
          return _sayHello(name);
	  }
	  
	  private String _sayHello(String name)throws Exception{
		  try{
			  Context ctx = new InitialContext();
	          DataSource ds = (DataSource)ctx.lookup("jdbc/oraclecon");
	          .query(ds.getConnection(), //コネクションの取得
	          		"select EMP_ID,EMP_NAME from EMP",  
	          		new ArrayListHandler())
	          .stream()
	          .filter(array->array[0].equals("001"))
	          .map(array -> String.format("従業員ID:%s:従業員名：%s",array[0],array[1]))
	          .collect(StringBuilder::new, StringBuilder::append, StringBuilder::append)
	          .toString());
		  }catch(Exception e){
			  e.printStackTrace();
			  return name;
		  }
		  
	  }
}
```
##実行結果

```
java.lang.ArrayIndexOutOfBoundsException: 26415
	at org.objectweb.asm.ClassReader.readClass(ClassReader.java:2015)
	at org.objectweb.asm.ClassReader.accept(ClassReader.java:469)
	at org.objectweb.asm.ClassReader.accept(ClassReader.java:425)
	at org.glassfish.hk2.classmodel.reflect.Parser$5.on(Parser.java:362)
	at com.sun.enterprise.v3.server.ReadableArchiveScannerAdapter.handleEntry(ReadableArchiveScannerAdapter.java:165)
	at com.sun.enterprise.v3.server.ReadableArchiveScannerAdapter.onSelectedEntries(ReadableArchiveScannerAdapter.java:127)
	at org.glassfish.hk2.classmodel.reflect.Parser.doJob(Parser.java:347)
	at org.glassfish.hk2.classmodel.reflect.Parser.access$300(Parser.java:67)
	at org.glassfish.hk2.classmodel.reflect.Parser$3.call(Parser.java:306)
	at org.glassfish.hk2.classmodel.reflect.Parser$3.call(Parser.java:295)
	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
	at java.lang.Thread.run(Thread.java:745)

```

GlassFish 4.0ってJava8をサポートしているのではなかったのでしょうか？
Install Ubuntu on DELL Precision 5510

### BIOS Settings

- Boot - F2 - BIOS menu
    - Disable Secure Boot
        - BIOS - Secure Boot - Secure Boot Enable - Disable
    - SATA AHCI
        - BIOS>System Configuration>SATA Operation> switch RAID to AHCI

### Install

- Press `e` on `Install Ubuntu` in GRUB
- add `nouveau.modeset=0` between `splash` and `quiet`
- Install as usual
- Do not enable `download and update from Internet`
- reboot

### Post Install

- Permanent GRUB Settings

    ```bash
# /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash nouveau.modeset=0"
```
    - `sudo update-grub`

- Enable touchpad

    ```bash
echo "blacklist i2c_hid" | sudo tee -a /etc/modprobe.d/blacklist.conf
sudo depmod -a
sudo update-initramfs -u
sudo reboot
```

- Enable Graphics Card

    ```bash
sudo apt-get purge nvidia-*
sudo add-apt-repository ppa:graphics-drivers/ppa
sudo apt-get update
sudo apt-get install nvidia-355 nvidia-prime
sudo reboot
```

    **NOTE** If `xserver-xorg-*-lts-xenial` is already installed on your PC, you must remove and replace it with `xserver-xorg-*-lts-wily` at first. But it will be tricky.

    ```bash
sudo apt-get install aptitude
sudo aptitude install xserver-xorg-video-all-lts-wily
# if you have conflict with dependencies, input:
Accept this solution? [Y/n/q/?] = ubuntu-desktop
# then choose the solution with minimum effect by pressing `.`, then `Y`
```

- Install Graphics Switch Tool

    ```bash
sudo add-apt-repository ppa:nilarimogard/webupd8
sudo apt-get update
sudo apt-get install prime-indicator
```
ESP8266 > GPIO > VOH: 0.8VIO / VOL: 0.1VIO

ESP8266のGPIOを使って1.5V 1Aのモーターを駆動しようとしている中、MOSFETの使用を検討中。

MOSFETのゲート電圧を調べる中、ESP8266のH/LレベルのGPIO電圧が実際にどの程度出力されるのか気になった。

以下のキーワードでデータシートを見るようだ。

- VOL: Lレベルの出力
- VOH: Hレベルの出力

http://download.arduino.org/products/UNOWIFI/0A-ESP8266-Datasheet-EN-v4.3.pdf
のpage 13に「Table 3 ESP8266EX Electrical Characteristics」がある。

その中で以下の記載がある。

> I/O > VOL/VOH > Min:N/0.8VIO / Max:0.1VIO/N

VIOはTable6にVDDIOとあり、Min:1.8VからMax:3.3V。こちらでの動作は通常3V(CR123A)程度。

上記のVOL/VOHの定義にて「N」の意味は分からない。

VIOを3Vとした場合

- VOH: 0.8VIOの場合、2.40V
- VOL: 0.1VIOの場合、0.3V
距離計 > Link > HC-SR04 > echo when the obstacle has soft surfaces - only some echoes are valid / random echoes are returned when there is no obstacle in front / MAX232の特殊な使用例

関連 http://qiita.com/7of9/items/dacd1a1dfa8574979ee8

HC-SR04に関して、false echoを計測している例を見つけた。
http://uglyduck.ath.cx/ep/archive/2014/01/Making_a_better_HC_SR04_Echo_Locator.html

### false echoes / random echoes

波形画像の上から5つ目のキャプションに以下の記載がある。

> echo when the obstacle has soft surfaces - only some echoes are valid

波形画像の上から6つ目のキャプションに以下の記載がある。

> random echoes are returned when there is no obstacle in front

http://qiita.com/7of9/items/0ecbe9a9b34c5ff2f9df
において距離が1cm以上ある条件で測定しながらもエコー波形のwidthが一定しなかった。この時の測定対象物の壁は一般的な賃貸の部屋の壁素材でsoft surfacesの結果に該当するかもしれない。
soft surfacesの場合にどういう仕組みでfalse echoが発生するのかはリンク先の文章を読みきれていない。

### MAX232での20V生成

http://uglyduck.ath.cx/ep/archive/2014/01/Making_a_better_HC_SR04_Echo_Locator.html
においてHC-SR04の回路が紹介されている。

その中でMAX232(回路図のU3)の変わった使い方も紹介されている。

> A MAX232 (U3) is cleverly used to produce +/-10V (which are the normal USART voltages) from 5V. The transducer is connected between two outputs so it is in fact powered at 20V. 

MAX232に5V電源を入れて、適切な入力信号を作り、±10VをT1OUT, T2OUTに出力。その2つを使うことで20Vの電位差を生成している、とのこと。

MAX232(RS-232ドライバレシーバ)をこういう使い方する例は初めてみた。
https://datasheets.maximintegrated.com/jp/ds/MAX220-MAX249_jp.pdf

### ゆがんだ波形

http://uglyduck.ath.cx/ep/archive/2014/01/Making_a_better_HC_SR04_Echo_Locator.html

ページ上の方に以下の2つの画像がある。

> Bandpass filter centered at 18KHz
> Bandpass filter centered at 40KHz

本来は40kHzを使う回路だが、実際に測定したところ18kHzになっているようだ。
抵抗を変更することで改善された、とある。

> By changing just two resistors (R13 to 2K2 and R11 to 18K) the filter response is shifted to the pulse frequency and this greatly improves the detection sensitivity.

その他、改良基板のPCBなど色々詳しい。
直線位置調整 > インバータ: not 負電圧生成IC / 電圧コンバーターLTC1144CN8: 負電圧生成IC / 非安定化反転コンバータ

### インバータIC

aitendoで見つけたインバータIC。
http://www.aitendo.com/product/10370
電圧を正電圧から負電圧に変換するものと思っていたが、HレベルをLレベルに変換するものだった。
意図しているものとは違った。

### 電圧コンバータ LTC1144CN8

別途、電圧コンバータ LTC1144CN8という負電圧生成ICを見つけた。
http://akizukidenshi.com/catalog/g/gI-01628/
> Conversion of 15V to ±15V Supplies

Linear Technologyの「非安定化反転コンバータ」という項目が負電圧生成ICなのだろうか。
http://www.linear-tech.co.jp/parametric/Unregulated_Doubling%7CInverting_Charge_Pumps
Voutputに`-Vin`という記載がある。
PHP7+Nginx+MariaDBでPDO接続したとき"could not find driver"が出た際にやったこと

検索から一発で正解に辿りつけなかったので備忘録もかねて書き残す。

## 環境
CentOS release 6.8 (Final)
PHP7.0.9
Nginx1.0.15
10.1.16-MariaDB

## 現状
phpinfo(); を表示して現状を見てみる。
![2016-08-17_03h51_26.png](https://qiita-image-store.s3.amazonaws.com/0/137381/b336c9f6-0c93-d491-8a2b-4334c5a9c9c5.png)

本来はPDO driversのとこにmysqlが入っているはず。



## php-mysqlndを入れる
どこかでphp-mysqlnd入れた方がいいよと書いてあったので入れてみる。

``` bash
sudo yum install --enablerepo=remi-php70 php-mysqlnd
~ ~ ~
sudo yum list installed | grep php-mysqlnd                                                     
php-mysqlnd.x86_64               7.0.9-1.el6.remi                    @remi-php70
```


## php-fpmを再起動
``` bash
sudo service php-fpm restart
```

ここがちょっとハマった。
Apacheの感覚でNginxを再起動していたので、変化なくて「あれ～？」ってなった。

## 反映を確認
PDO driversのところにmysqlが追加されていることが確認できる。
あとpdo_mysqlという項目も増えている。
![2016-08-17_03h56_02.png](https://qiita-image-store.s3.amazonaws.com/0/137381/716e9b6f-1802-4ed5-f405-e5e6acd98705.png)

PDO接続も試して私の環境では無事接続できることを確認した。
リファクタしてたらSQLをSwiftコードで構築するクラスできたので紹介


ちょっとした理由で、過去に書いたコードのDB周りを片付けていた時にメソッドやクラスからSQL文作れないかなーと、
試しにコード書いてみたら全部ではなけれど、かけた。

今後時間があれば拡張してもいいなー程度。なので見る人もまるまる使うというよりかは、参考程度にとどめておいたほうが無難です。

https://github.com/mothule/SwiftSQLExpressionBuilder
markdownをHTMLにして他人に渡すベストシナリオを求めて

# markdownで作ったドキュメントを他人に渡したい

エンジニア同士ならまだしも、非エンジニアにmarkdownを渡すときって、いろいろ大変

- プレーンテキストがUTF8なのかSJISなのかの相場が今は収束してない
- .mdという拡張子にオーソライズされた認識がない
- シンタックスハイライトとかtableとかは、プレビュー環境によってばらつく （特にtable）

# じゃぁHTMLにしたものを渡せばいいじゃない

- ところが、プレーンなHTMLに変換してくれるいいツールがない
- githubみたいなところで、.mdを見てもらうという方法もあるが、みんながgithubのアカウントをもってるわけではない
- HTMLに変換するツールは結局CSSへの外部リンクがあって、社内ドキュメントから外部への通信をさせたくない
- 複数ファイルをzip圧縮すると、Windowsのzipフォルダは、直接CSSを参照できない

# MarkDownを一枚のHTMLに変換したいのだ

ということで、これが手元のベストシナリオ。

### 自分にとって理想の、MarkDownのプレビュー環境（ブラウザ）でプレビュー
ここでは、Qiitaでプレビューしている。そして範囲選択してコピー
![スクリーンショット 2016-08-17 2.30.27.png](https://qiita-image-store.s3.amazonaws.com/0/53489/cfb96d2e-8915-a9f3-d4f4-5c19c75b8d6e.png)

### 編集可能なタブを開く

以下をブラウザのアドレスバーに入れる。

```html
data:text/html, <html contenteditable>
```

すると、編集可能なまっさらなドキュメントができる。

### ペースト！

すると、さっきの見たままが、ペーストされる。
![スクリーンショット 2016-08-17 2.30.55.png](https://qiita-image-store.s3.amazonaws.com/0/53489/e2df91ae-694d-4460-bbcd-082f353ec6ef.png)

### そのドキュメントを、⌘Sで保存！

ローカルファイルに変換される。保存されたファイルは、CSSなどの外部ファイルは存在せず、一枚もののHTMLになってる。

![スクリーンショット 2016-08-17 2.31.28.png](https://qiita-image-store.s3.amazonaws.com/0/53489/7b8ab3f9-7a27-e9ec-ee37-25590d7ef788.png)

### ソースをみても、全てインラインのCSS

![スクリーンショット 2016-08-17 2.31.39.png](https://qiita-image-store.s3.amazonaws.com/0/53489/bf061af2-5d6e-b0c7-5ece-5ab18af85729.png)

### あとはメールに添付して送っても体裁は再現れる！

contenteditableの属性は残ってるので、編集可能な状態ではあるが、メール添付して送信先で再保存されても体裁は崩れない。

この記事では、MarkDownの見た目を、MarkDownレンダリングシステムと切り離すシナリオで、contenteditableを使ったが、本件にかぎらず、「ブラウザでの見た目を誰かに見せたい、ただしアカウントベースでの共有は難しい」というケースには使えそう。
OAuth2認証（OpenID Connect）を試した備忘メモ

OAuth2認証（OpenID Connect）をライブラリ使わず実装することがなかったので、簡単にnode + expressで試してみたメモ。認証して、Gmailの一覧を取得して返すまで。ゴリゴリと書いてしまって汚いですがとりあえず自分の備忘として・・・。

# 事前作業

[Google Developer Console](https://console.developers.google.com/apis/dashboard)でアプリケーションの作成と、認証情報を登録しておく。redirect_urlには`http://localhost:3000/oauth2callback`を登録する。また、「ライブラリ」から、GmailAPIを有効化しておく。

# サンプルソース

``` app.js
var express = require('express');
var request = require('request');
var app = express();

var clientId = '{client_id}';
var clientSecret = '{client_secret}';
var responseType = 'code';
var scope = 'openid%20profile%20email%20https://www.googleapis.com/auth/gmail.readonly';
var redirectUri = 'http://localhost:3000/oauth2callback';
var authUrl = 'https://accounts.google.com/o/oauth2/v2/auth'; 
var tokenUrl = 'https://www.googleapis.com/oauth2/v4/token';
var mailUrl = 'https://www.googleapis.com/gmail/v1/users/me/messages';

var server = app.listen(3000, function() {
  console.log('Server is started');
});

// 擬似ログインページ
app.get('/login', function(req, res, next) {
  // Redirect to Google authentication endo point
  var url = authUrl
    + '?client_id=' + clientId
    + '&response_type=' + responseType
    + '&scope=' + scope
    + '&access_type=offline'
    + '&redirect_uri=' + redirectUri;
  console.log(url);
  res.redirect(302, url);
});

// Redirect url先
app.get('/oauth2callback', function(req, res, next) {
  var code = req.query.code;
  console.log(code);
  // 認可コードを使って、access_tokenを得る
  request({
    url: tokenUrl,
    method: 'POST',
    headers: {
      'Content-Type': 'application/x-www-form-urlencoded'
    },
    form: {
      code: code,
      client_id: clientId,
      client_secret: clientSecret,
      redirect_uri: redirectUri,
      grant_type: 'authorization_code'
    }
  }, function(error, response, body) {
    var obj = JSON.parse(body);
    var accessToken = obj['access_token'];
    var idToken = obj['id_token'];
    var refreshToken = obj['refresh_token'];
    // access_tokenを使って、Gmailのメール一覧を取得する
    request({
      url: mailUrl,
      method: 'GET',
      headers: {
        'Authorization': 'Bearer ' + accessToken
      }
    }, function(error, response, body) {
      res.json({ 
        'access_token': accessToken,
        'refresh_token': refreshToken,
        'id_token': idToken,
        'mail': body
      });
    });
  });
});
```

# 実行

```
$ npm install express request
$ node app.js
```

http://localhost:3000/login にアクセスすると、Google認証画面が出てきます

# 参考

- [OpenID Connect 入門 〜コンシューマーにおけるID連携のトレンド〜](https://getpocket.com/a/read/1024552339)
- [OpenID Connect 入門](http://www.slideshare.net/kura_lab/openid-connect-id)
- [Google Identity Platform](https://developers.google.com/identity/protocols/OpenIDConnect#response-type)
- [Users.messages: list](https://developers.google.com/gmail/api/v1/reference/users/messages/list)
- [Choose Auth Scopes](https://developers.google.com/gmail/api/auth/scopes?hl=ja)
- [Google Gmail APIでメールを取得する](http://qiita.com/ryurock/items/4b063372ede81780c3c8)
Swift:NSDateの年号を西暦表示

OSX El Capitan(10.11.6)
Xcode 7.3.1
Swift version 2.2
を使用しております。

iPhoneの設定で書式の暦法を和暦に設定していると
（[設定]→[一般]→[言語と地域]→書式）
下記のようなプログラムを書いた場合

```
let date:NSDate = NSDate()
let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "yyyy/MM/dd HH:mm:ss" // 日付フォーマットの設定
        
print(dateFormatter.stringFromDate(date))

--結果--
0028/08/14 23:54:16
```

年号のところが0028と和暦で取得され表示されます。
システムで設定したものが使われるようです。

西暦で取得したい場合、カレンダー設定することにより暦法を変更することができます。

```
let date:NSDate = NSDate()
let dateFormatter = NSDateFormatter()
//カレンダー設定
let calendar = NSCalendar(identifier: NSCalendarIdentifierGregorian)

dateFormatter.dateFormat = "yyyy/MM/dd HH:mm:ss" // 日付フォーマットの設定
dateFormatter.calendar = calendar //フォーマットにカレンダー設定
                
print(dateFormatter.stringFromDate(date))

--結果--
2016/08/14 23:55:36
```

きちんと設定するとシステムに影響されることなく取得できます。
IntelliJでJavaコード内のSQL文字列の表示をいい感じにする

俗に言うLanguage Injectionを使う。
例えば、以下のようなMySQLのクエリを文字列として定義したとする。

```java
String sql = "INSERT INTO entry (id, title) VALUES (1, 'title1') ON DUPLICATE KEY UPDATE title=VALUES(title)";
```

文字列にカーソルを合わせてShow Intention Action(Alt+Enter)を実行して、以下の順に選択する。

1. Inject language or reference
2. MySQL

この時点で文字列がSyntax Highlightされるが、これだけだと下記のような警告が発生する。

```
No data sources configure to run this SQL and provide advance code assistance.
```

ローカルにMySQLは立っている前提として、データソースを設定すれば良い。
View > Tool Windows > Database を開き、+（追加）を押して、以下の順に選択する。

1. Data Source
2. MySQL

すると、MySQLのData Source追加画面が開かれるので、MySQLのユーザ名やパスワード、URLを入力して、Driverをダウンロードしたりすると設定が完了する。試しにTest Connectionをクリックすると、ちゃんとMySQLに接続できてるか確認できる。

Data Sourceの設定はできたけど、エディタ上ではまだ警告が出ている。

```
Unable to resolve table 'entry' 
```

SQL文字列内のテーブルやカラムが見つからないとのことなんだけど、MySQL側にテーブルが定義されててもこの警告は出続ける。この原因は、Data Sourceの設定が足りてないから。どのデータベース（MySQL内部のCreate Databaseで作られるデータベースのこと）を見れば良いか指定してやる必要がある。

先ほど作成したData SourceのPropertiesを開いて、以下の順に実施する。

1. Schemasタブを選択
2. 該当のデータベースをチェックする
3. OKボタンを押す

エディタ上のSQL文字列を見ると、警告は表示されなくなった。めでたしめでたし。