OmniAICreator/Qiita-1.07M huggingface dataset:
Sublime TEXT2

#Sublime TEXT2(Windows) インストールメモ

以下からダウンロード＆インストール
http://www.sublimetext.com/2

#Package Control(プラグイン)のインストール
以下のページの[Sublime TEXT2]タブの内容をコピー
https://packagecontrol.io/installation#st2

###Sublime TEXT2
```
import urllib2,os,hashlib; h = '2915d1851351e5ee549c20394736b442' + '8bc59f460fa1548d1514676163dafc88'; pf = 'Package Control.sublime-package'; ipp = sublime.installed_packages_path(); os.makedirs( ipp ) if not os.path.exists(ipp) else None; urllib2.install_opener( urllib2.build_opener( urllib2.ProxyHandler()) ); by = urllib2.urlopen( 'http://packagecontrol.io/' + pf.replace(' ', '%20')).read(); dh = hashlib.sha256(by).hexdigest(); open( os.path.join( ipp, pf), 'wb' ).write(by) if dh == h else None; print('Error validating download (got %s instead of %s), please try manual install' % (dh, h) if dh != h else 'Please restart Sublime Text to finish installation')
```

Sublimeに戻り[View]→[Show Console]
でコンソールを開き、コピーしたものを貼り付ける。
再起動して完了。

#日本語化
[Prefarences]→[Package Control]を選択
「Install Package」と入力。
途中まで入力すると下に補完されたものが出てくるので、マウスで選択してクリックしてもよい。
「Japanize」と入力。

[基本設定]→[Browse Packages]→[Japanize]フォルダを開く。
以下の4つのjpファイルを選択し(Ctrlを押しながら）コピーする。
・Context.sublime-menu.jp
・Indentation.sublime-menu.jp
・Main.sublime-menu.jp
・Tab Context.sublime-menu.jp

一つ上のフォルダに戻り、[Default]フォルダの中に先ほどコピーしたファイルを置く。
[C:\Users\ユーザー名\AppData\Roaming\Sublime Text 2\Packages\Default]

元あったファイル名に「.org」をつけて、コピーしたファイル名の「.jp」をとる。（差し替える）

[Japanize]フォルダに戻り、以下のファイルをコピー
・Main.sublime-menu（.jpが付かない方）

一つ上のフォルダに戻り、[User]フォルダの中に先ほどコピーしたファイルを置く。
[C:\Users\ユーザー名\AppData\Roaming\Sublime Text 2\Packages\User]

Sublime Textを再起動して終了

#各種パッケージのインストール
以下
[基本設定]→[Package Control]→[Install Package]
より各種インストールを行う。

・IMESupport
インライン入力
・All Autocomplete
コード補完
・ConvertToUTF8
日本語文字コード変換
・BracketHighlighter
タグや括弧の対応を表示
・AutoFileName
ファイル名の自動補完
・SublimeLineter
構文チェック
・color hightlighter
色のコードをその色でハイライト表示
・Emmet
HTMLのマークアップをショートハンドの入力で行える
http://docs.emmet.io/cheat-sheet/
・SublimeCodeIntel
各種言語のシンタックスハイライト、自動補完
・git
GitをSublimeのみで扱うことができる
githubに登録した公開鍵をとってくる

githubに登録した公開鍵を取得する方法．

```
wget https://github.com/iory.keys 
```
で取得できる．
これでどこかのサーバにsshを登録するときに，1台1台コピーせずにすむ！

```
wget -q -O- https://github.com/iory.keys >> ~/.ssh/authorized_keys
```

ちなみにwgetの-qオプションはwgetが出力する文字を表示しない．
-Oは取得したファイルの名前を変更して保存するオプションだけど，-を指定すると出力先を標準出力に変更できる．
他の人のアカウントの公開鍵も当然とってこれるから，いちいちメールとかUSBで送ってもらう必要がなくて便利．
CocoaPods 0.39.0 is not stable?

# ハマったのでメモ
2016/04/08 現在

* 実機Deploy時に、
```
The application does not have a valid signature.
```
と言われる。

* もしくは、ipaのExportに失敗する

## CocoaPodsをversion downした
`0.39.0` -> `0.39.0.beta.5`

😇
VS CodeでChrome Appを開発する

まず適当なフォルダを作成して、[チュートリアル](https://developer.chrome.com/apps/first_app)を参考に必要なファイルをフォルダ内に配置します。必要なのは以下のファイルです。

* manifest.json
* background.js
* calculator-128.png
* calculator-16.png
* window.html

manifest.json以外の名前は任意ですが、チュートリアルの通りにmanifest.jsonを記述する場合は上記ファイル名になります。

## ファイル一覧

```json:manifest.json
{
  "name": "Hello World!",
  "description": "My first Chrome App.",
  "version": "0.1",
  "manifest_version": 2,
  "app": {
    "background": {
      "scripts": ["background.js"]
    }
  },
  "icons": { "16": "calculator-16.png", "128": "calculator-128.png" }
}
```

```js:background.js
chrome.app.runtime.onLaunched.addListener(function() {
  chrome.app.window.create('window.html', {
    'outerBounds': {
      'width': 400,
      'height': 500
    }
  });
});
```

```html:window.html
<!DOCTYPE html>
<html>
  <head>
  </head>
  <body>
    <div>Hello, world!</div>
  </body>
</html>
```

![calculator-16.png](https://developer.chrome.com/static/images/calculator-16.png)[calculator-16.png](https://developer.chrome.com/static/images/calculator-16.png)

![calculator-128.png](https://developer.chrome.com/static/images/calculator-128.png)[calculator-128.png](https://developer.chrome.com/static/images/calculator-128.png)

## ビルド設定

ここからがVS Codeの本領発揮です。このフォルダをVS Codeで開きます。開いたら`Ctrl+Shift+B`を押します。
すると、No task runner configured.(タスクランナーが設定されていません)というメッセージが出ます。
![No task runner configured.](https://qiita-image-store.s3.amazonaws.com/0/56668/9554474a-3340-e39a-3648-dca18ade4516.png)
このメッセージが出たら、Configure Task Runner(タスクランナーを設定する)をクリックしてください。

すると.vscode/tasks.jsonというファイルが作成されて、tasks.jsonを開いた状態になります。
tasks.jsonにはテンプレートとしてTypeScript用の設定が記述されています。今回はTypeScriptではないのでいったん全て削除して、下記内容で書きまえます。

```js:tasks.json
{
  "version": "0.1.0",
  "command": "C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe",
  "isShellCommand": true,
  "showOutput": "silent",
  "args": [
    "--load-and-launch-app=${workspaceRoot}"
  ]
}
```

`"command"`に指定するのはChromeのインストールされているフルパスです。Windowsだったら上記パスだと思いますが、違う場合は各自の環境に合わせて設定してください。
調べ方はデスクトップのショートカットアイコンを右クリック→プロパティ→リンク先を見るのが簡単です。

![Chromeのインストール先の調べ方](https://qiita-image-store.s3.amazonaws.com/0/56668/88baaf8d-0fcf-d69e-feb0-616935c55334.png)


ここまで設定したら、VS Codeでもう一度`Ctrl+Shift+B`を押します。今度はビルド設定がされているので、Chromeアプリが起動するはずです。

![起動した様子](https://qiita-image-store.s3.amazonaws.com/0/56668/09c996f2-6a5b-fc45-8cfa-927e34107895.png)

[Chrome Dev Editor](https://github.com/GoogleChrome/chromedeveditor)が終了してしまって手軽にChrome App開発をするのが難しくなったかと思ったけど、これならいけそうです。
選択リスト(複数)で使えるINCLUDES句

# 選択リスト(複数)とは
Salesforceのオブジェクト項目に選択リスト(複数)というデータ型があります。
タグのように複数の属性をセットする場面で利用できる便利なデータ型です。
標準SQLや通常のDBMSの実装には無さそうな INCLUDES句が便利だったのでメモします。

# 利用ケース
たとえば下記のような利用ケースが考えられます。

>取引先責任者の項目として 「関心のある業種」を設定
>選択肢として、｛メーカー, 商社, 金融, 小売, サービス｝を設定

データとしては下記のようになります。

|Name|Tag__c|
|---|---|
| 鈴木太郎 |メーカー;商社     |
| 田中二郎 |商社;小売         |
| 高橋花子 |金融;小売;サービス|
| 木村愛子 |金融;商社         |

# 利用ケースとINCLUDES句使用例
この情報を利用するケースとしては、「"小売"に関心のある人全員を抽出する」等が考えられます。
SOQLでは INCLUDES句を利用し、下記のように記述することで実現できます。

**"小売"タグが設定されているデータを抽出**

```
SELECT Name, Tag__c FROM Contact
 WHERE Tag__c INCLUDES ('小売')
```
**結果**

|Name|Tag__c|
|---|---|
| 田中二郎 |商社;小売         |
| 高橋花子 |金融;小売;サービス|

## 複数条件(or)
IN句のように複数条件を記述できます。

**"小売"または"メーカー"いずれかのタグが設定されているデータを抽出**

```
SELECT Name, Tag__c FROM Contact
 WHERE Tag__c INCLUDES ('小売', 'メーカー')
```
**結果**

|Name|Tag__c|
|---|---|
| 鈴木太郎 |メーカー;商社     |
| 田中二郎 |商社;小売         |
| 高橋花子 |金融;小売;サービス|

## 複数属性を持つデータを抽出
複数の属性を持つデータを抽出する場合、セミコロンで指定します。

**"商社"と"金融"両方のタグが設定されているデータを抽出**

```
 SELECT Name, Tag__c FROM Contact
 WHERE Tag__c INCLUDES ('商社;金融')
```
**結果**

|Name|Tag__c|
|---|---|
| 木村愛子 |金融;商社         |
Node-REDでLINE-Botへのメッセージを受ける

Node-REDでBot作成しようと思い、とりあえずLINEメッセージをNode-REDで受けてみます。

先着１万名様でトライアルが使えるそうです。
http://linecorp.com/ja/pr/news/ja/2016/1320

早速登録し、LINE developersの管理画面でNode-REDで作ったHTTPのエンドポイントを設定します。Callback URLのとこです。Port番号も書かないといけないみたいで、TLSは自己証明書だとダメみたいです。

<img width="661" alt="スクリーンショット 2016-04-09 9.13.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/20848/47d747f6-05c5-f4f6-5368-2a84185c1334.png">


Flowは結構適当です。

<img width="559" alt="スクリーンショット 2016-04-08 12.14.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/20848/72e8f860-29cf-63c8-f83b-289c4859a718.png">

getTextsの中身は以下のような感じです。

```
var contents = msg.payload.result.map(function(r) {
    return r.content.text;
})
msg.payload = contents;
return msg;
```

実際にQRコードでBotを友達に追加してメッセージを送ると。

![IMG_0490.PNG](https://qiita-image-store.s3.amazonaws.com/0/20848/0bfb9cdf-7c9f-6294-4f82-3b288395f04d.png)


Node-REDのdebugタブにメッセージが表示されます。

<img width="1012" alt="スクリーンショット 2016-04-08 11.59.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/20848/abb8900a-9b34-a5ab-500f-0cca4b9ae679.png">

後はいろいろ自由に処理できるでしょう！
メッセージ返すまでやりたかったんですが、早く書いて公開したかったので、以上です。
Flow全体のJSONはこちらです。

```
[{"id":"981112f2.67eef","type":"http in","z":"6fbc00ac.9044","name":"Callback","url":"/callback","method":"post","swaggerDoc":"","x":97,"y":122,"wires":[["f4a813e5.0b57f"]]},{"id":"23f3787e.dc0c88","type":"debug","z":"6fbc00ac.9044","name":"","active":true,"console":"false","complete":"false","x":471,"y":86,"wires":[]},{"id":"457247ec.ba8db8","type":"http response","z":"6fbc00ac.9044","name":"","x":346,"y":242,"wires":[]},{"id":"95adc45b.6a5238","type":"function","z":"6fbc00ac.9044","name":"","func":"msg.payload = {};\nreturn msg;","outputs":1,"noerr":0,"x":218,"y":219,"wires":[["457247ec.ba8db8"]]},{"id":"f4a813e5.0b57f","type":"function","z":"6fbc00ac.9044","name":"getTexts","func":"var contents = msg.payload.result.map(function(r) {\n    return r.content.text;\n})\nmsg.payload = contents;\nreturn msg;","outputs":1,"noerr":0,"x":255,"y":131,"wires":[["95adc45b.6a5238","23f3787e.dc0c88"]]}]
```
Cache-control

cache-controlの設定でブラウザにどのように情報がキャッシュされるのかが曖昧だったのでまとめます。

Webアプリケーションにおいて、ブラウザ上に重要な情報をキャッシュされることは情報漏洩の問題につながります。
例えば、ログイン後のパスワード変更画面で新しいパスワードを入力し確認画面へ遷移するようなリクエストを送信すると、Webサーバからのレスポンスがきます。確認画面に新しいパスワードが表示されている場合、Webサーバからのレスポンスにはもちろん確認画面に表示されているパスワードが記載されているわけです。
レスポンスヘッダに正しくキャッシュを制限する記述が無ければブラウザのキャッシュに新しいパスワードの情報が残ってしまいます。キャッシュは誰でも確認できるためだいぶ危ないですね。

# cache-control

「cache-control」を正しく設定するとレスポンスに含まれる情報をブラウザにキャッシュを禁ずることもできます。
基本的に以下の設定をしていればセキュリティ的には問題ありません。

<pre>
cache-control:no-store
Pragma:no-cache
</pre>

この設定ができているサイトはかなり少なめですね。サーバの設定をするだけなので簡単なのに！

>cache-control:no-store

この設定は「キャッシュするな！」ってことで、レスポンス情報は一切ブラウザにキャッシュされません。

今回は「Pragma:no-cache」は深く触れませんが、簡単に言うと「cache-control」の補助的役割。

このほかにも「cache-control」には以下の設定があります。

<pre>
1.Cache-Control: private
2.Cache-Control: no-cache
3.Cache-Control: must-revalidate
4.Cache-Control: max-age
</pre>

実際に自分で実験する必要はありそうです。
実験した際に結果を追記します。

つづく
必要に迫られてバッチファイルを組むことになった人向けのTips


　バッチファイルが何かも知らないのに、職場や自宅などで組まざるを得なくなった人向けの手引き書です

#1.バッチファイルとは？
　バッチファイルとは、windows環境下で動作するバッチ処理（複数の処理をまとめて順次実行する処理のこと）を記述するファイルのこと。
　分かりやすく言うと、**たくさんの処理を自動で実行してくれるファイル**。
　MS-DOSがどうたらとかいうのは、知る必要は別にないので割愛します。

#2.何ができるの
　バッチファイルでは、**マウスを使わない処理なら大体なんでもできます。**
　ただし、cmd.exe（コマンドプロンプト）で動作するので、画像ファイルをぬるぬる動かしたりとかはできません、あくまでプロンプト上で完結するものに限ります。

#3.どうやって書くの
　プログラミング言語は大まかに２種類に分けられます。
・コンパイル言語…人間語で書いたものを機械語に訳すやつ。Cとか
・スクリプト言語…書いた処理を１行ずつ読んでいくやつ。RubyとかPythonとか
　バッチファイルは後者、**スクリプト言語**に属します。もっとも、言語というよりも
ただの処理の羅列なのですが。分類するならこちらということで。

　何が言いたいのかというと、バッチファイルには、**自分のしたい処理を上から１行ずつ書いていけばいい**、と。そういうことです。

#4.何に書けばいいの
　先述したスクリプト言語のいいところは、コンパイル言語に必要な翻訳の過程がいらないことです。
　つまり、適当なものにパッと書いてパッと実行できるんですね。（多少の語弊はあります）
　バッチファイルを実行するのはcmd.exeだといいました。実行させるバッチファイルの拡張子は**.bat**。必要な**エディタはなんとメモ帳です。**

#5.書くぞー。
　メモ帳を開きましょう。メモ帳の場所がわからない方は、「アクセサリ→メモ帳」か、「PC内のアプリを検索→notepad」のどちらかで大体いけるはずです。windowsなら、入っていないということは無いです。

　さて、ひとまず次の文章を入力してみましょう。

```bat
notepad
```
　文章ですらない単語ですが。入力したら、「保存→（好きな名前.bat）に名前を変更」と行ってください。保存する場所は何処でもいいです。
　保存場所、ここでは仮にデスクトップ上としましょうか、に**歯車が書かれたアイコンがあれば、成功**です。普通のメモ帳方は、恐らく「名前.bat.txt」になってるので、「名前を付けて保存→ファイルの種類をすべてのファイルにする」とやって保存しなおしてください。

#6.開いてみる
　では、歯車のアイコンをダブルクリックしてみましょう。すると、なんと**新規のメモ帳が起動したではありませんか。**

　といった感じで、バッチファイルをワンタッチでメモ帳が開けられました。これだけだと普通にメモ帳のアイコンをクリックするのと変わりませんが、バッチファイルではほかにもいろんなことができます。

#7.使いそうな処理のコピペ用置き場
　ここを見ている方は基本的にコピペでも組めれば問題ないという方が多いと思いますので、使いそうな処理をコピペできるようにしておきます。
　もし**自分で細かく組みたいな、と思った方**は、[筆者のマイページ](http://qiita.com/sawa_tsuka)右側にある「人気の投稿」を上から見ていくことをお勧めします。もっと詳しく、頻出コマンドをどう扱うのかが書いてあります。


```bat:処理を途中でポーズする（画面に出た文字を読ませたい場合など）
pause
もしくは
pause >nul

上のほうでは、「続行するには何かキーを押してください」と表示されます
下のほうでは何も表示されません
```

```bat:現在の日付を８桁（yyyymmdd）で表示
for /f "tokens=1-3 delims=/" %%a in ("%date%") do echo %%a%%b%%c
```

```bat:現在の日付（yyyymmdd）の名前のフォルダを作成
for /f "tokens=1-3 delims=/" %%a in ("%date%") do mkdir %userprofile%\desktop\%%a%%b%%c

デスクトップ上に作成する例です。
別のところに作る場合は、「%userprofile%\desktop\」の部分を好きなパスに変えてください。
```

```bat:現在の日付（yyyymmdd_hhmmssss）の名前のフォルダを作成
for /f "tokens=1-7 delims=/:." %%a in ("%date%:%time%") do set /a m=%%a%%b%%c,n=%%d+100,o=1%%e%%f%%g
mkdir %userprofile%\desktop\%m%_%n:~-2%%o:~-6%

上と同じく、デスクトップに作成する例です。
```

```bat:現在の日付（yyyymmdd）の名前のtxtファイルを作成
for /f "tokens=1-3 delims=/" %%a in ("%date%") do echo あああああ>%userprofile%\desktop\%%a%%b%%c.txt

上と同じく、デスクトップに作成する例です。
テキストファイルの中身には、「あああああ」と入力されるようになっています。
```

```bat:現在の日付（yyyymmdd_hhmmssss）の名前のtxtファイルを作成
for /f "tokens=1-7 delims=/:." %%a in ("%date%:%time%") do set /a m=%%a%%b%%c,n=%%d+100,o=1%%e%%f%%g
echo あああああ>%userprofile%\desktop\%m%_%n:~-2%%o:~-6%.txt

上と同じく、デスクトップに作成する例です。
テキストファイルの中身には、「あああああ」と入力されるようになっています。
```

```bat:txtファイルに複数行の文字列を記入する場合
echo %date%>hogehoge.txt
echo %time%>>hogehoge.txt

>ひとつだと上書き、ふたつだと追記になります。
ちなみに%date%は現在の日付、%time%は現在の時間を表します。
```
　貧弱な想像力ではほかに思いつかなかったので、先述の通り[筆者のマイページ](http://qiita.com/sawa_tsuka)をご覧になるか、「こういうの組んで」という**ご希望がありましたらコメントいただければわかる範囲で書きます。**ネットワーク系は環境が異なるため厳しいですが。

　では。誤字脱字や不足などありました場合も、お気軽にコメントいただければ幸いです。
phpMyAdminで急に500エラーが発生した時の対策例

# 発生した問題

　phpMyAdminを使用していたら、突然**500エラーが発生**した。Apacheのエラーログを確認すると、

```
PHP Fatal error:  Cannot redeclare __() (previously declared in /var/www/phpMyAdmin/libraries/sql-parser/src/common.php:17) in /var/www/phpMyAdmin/libraries/php-gettext/gettext.inc on line 288
```

　というエラーが発生していた。

# 実行した解決法

　発生した原因は不明ながら、**使用していたブラウザのCookieを削除すると解決**した。
(NoMachine派生)ssh経由でGUIログインするX2Goを使ってみた

## 参考

* [リモートデスクトップソフトのX2Goを使ってみた - kaiware-daikonの日記](http://kaiware-daikon.hatenablog.com/entry/2015/01/24/214015)
* あわしろいくやさんの[第330回　X2Goでリモートデスクトップ：Ubuntu Weekly Recipe｜gihyo.jp … 技術評論社](http://gihyo.jp/admin/serial/01/ubuntu-recipe/0330)

## 利点

* ウィンドウサイズ変更による解像度変更に対応
* ポートはsshさえ空いていれば良い

## まだできていないこと

* 日本語入力 (他の人は大丈夫な様子。dockerコンテナ上だからか？)
* キーボード `\`や`|`が入力されない


## インストール

```bash:Dockerfile
RUN apt-key adv --recv-keys --keyserver keys.gnupg.net E1F958385BFE2B6E \
    && sed -i -e "$ a deb http://packages.x2go.org/debian stretch main" /etc/apt/sources.list \
    && apt-get update -qq \
    && apt-get install -y x2goserver x2goserver-xsession

RUN apt-get install -y ssh \
    && mkdir /root/.ssh
COPY files/authorized_keys /root/.ssh/authorized_keys
```

## 接続

* x2goclinet コマンドにて接続
arduino leonardo ピン配置

##atmega32u4
![32U4PinMapping.png](https://qiita-image-store.s3.amazonaws.com/0/18104/3a6f26e6-aa12-2ed8-aa04-daf1c64cb51e.png)

##ピン
```
PB0     RXLED
PB1     SCK
PB2     MOSI
PB3     MISO
PB4     D8
PB5     D9 (OC1A)
PB6     D10 (OC1B)
PB7     D11 (OC0A)
PC6     D5 (OC3A)
PC7     D13 (OC4A)
PD0     D3 (SCL)(OC0B)
PD1     D2 (SDA)
PD2     D0 (RX)
PD3     D1 (tx)
PD4     D4
PD5     TXLED
PD6     D12 (OC4D)
PD7     D6
PE6     D7
PF0     A5
PF1     A4
PF4     A3
PF5     A2
PF6     A1
PF7     A0

```
IPアドレスを用いてアクセス制限をする(Centos7, firewalld)

参考：http://nullpopopo.blogcube.info/2015/01/firewalld-deny-tips.html
参考：http://www.unix-power.net/centos7/firewalld.html

firewalldでは事前にゾーンを定義し、ゾーンごとに許可するサービスを定義する。
ゾーンの確認。
>firewall-cmd --get-zones

デフォルトでは下記のようなゾーンがある。


block(変更不可)：全てのパケットを破棄しますが内部から外部への戻りパケットは許可されます。
dmz：デフォルトで「ssh」のみ許可されています。
drop（変更不可）：全てのパケットを破棄します。現実的に使用されることはありません。
external：デフォルトで「ssh」のみ許可されています。IPマスカレードが有効になっています。
home：デフォルトで「dhcpv6-client」,「ipp-client」,「mdns」,「samba-client」,「ssh」が許可されています。
internal：デフォルトで「dhcpv6-client」,「ipp-client」,「mdns」,「samba-client」,「ssh」が許可されています。
public：デフォルトゾーンです。デフォルトで「shh」と「dhcpv6-client」のみ許可されています。
trusted（変更不可）：全てのパケットが許可されます。
work：デフォルトで「dhcpv6-client」,「ipp-client」,「 ssh」が許可されています。


特定のIPアドレスをdropゾーンに入れる。
>firewall-cmd --zone=drop --permanent --add-source=[IPアドレス]

dropゾーンに入れた設定が反映されているか確認。
>firewall-cmd --get-active-zones

dropゾーンに入れた設定を解除。
>firewall-cmd --zone=drop --permanent --remove-source=[IPアドレス]
Raspi + EXPLORE-NFCをNode.js制御してWebへつなげる


[EXPLORE-NFC](http://www.nxp.com/ja/products/identification-and-security/nfc-and-reader-ics/nfc-frontend-solutions/explore-nfc-exclusive-from-element14:PNEV512R)というRasPiで使えるNFCリーダーです。 

![](https://i.gyazo.com/62531bde4f0bad2ddb77ada3ce6c80d9.png)

Node.js経由で制御する[こちらのライブラリ](https://github.com/JohnMcLear/NXP-Explore-NFC-nodejs-wrapper)が上手く動かなかったので、中身をいじってみました。

このへんです。

https://github.com/JohnMcLear/NXP-Explore-NFC-nodejs-wrapper/blob/master/index.js#L15

```node_modules/explorenfc/index.js
//省略
  read: function(cb){
    // exec: spawns a shell.
    child_process.exec(binary, function(error, stdout, stderr){
      // TODO, parse the output from the board
      // If it looks like this could be what we want
      var result = processLines(stdout);
      if(result){
        cb(result);
      }else{
        cb(stdout);
      }
    });
  },

//省略
```

stdoutの中身をそのまま出力してます。

サンプルコードを編集して以下のサンプルを作りました。

```nfc.js
'use strict'

const nfc = require("explorenfc");

nfc.init("/usr/bin/explorenfc-basic");
nfc.read((nfcEvent) => {
  if(nfcEvent){
    let tmp = nfcEvent.split('\r\n');
    let nfcdata = {};
    nfcdata.Manufacturer = tmp[2].split(':')[1];
    nfcdata.CID = tmp[3].split(':')[1];
    nfcdata.IC = tmp[4].split(':')[1];
    console.log(nfcdata);
  }else{
    console.log("no NFC Event");
  }
});

```

実行

```bash
$ node nfc.js
{ Manufacturer: ' \t0114',
  CID: ' \t01149615C010',
  IC: ' \t0401' }
```

こんな感じでnfcの情報が`nfcdata`に入ってます。


![](https://i.gyazo.com/2576fe0c82ad3d81f967fa818b79e77d.gif)

## おまけ、MilkcocoaでWebとつなげる

Milkcocoaについては使い方は調べてみてください。

```nfc.js
'use strict'

const nfc = require("explorenfc");
const MilkCocoa = require('milkcocoa');
const milkcocoa = new MilkCocoa('<id>.mlkcca.com');
const ds = milkcocoa.dataStore('mydatastore');

nfc.init("/usr/bin/explorenfc-basic");
nfc.read((nfcEvent) => {
  if(nfcEvent){
    let tmp = nfcEvent.split('\r\n');
    let nfcdata = {};
    
    nfcdata.Manufacturer = tmp[2].split(':')[1];
    nfcdata.CID = tmp[3].split(':')[1];
    nfcdata.IC = tmp[4].split(':')[1];
    console.log(nfcdata);
    ds.push(nfcdata); //Milkcocoaに情報を保存
    ds.send({flag:1}); //Milkcocoaに情報を送信
  }else{
    console.log("no NFC Event");
  }
});
```
MonacaでOnsenUI 2 Beta.9を使うとステータスバーの余白がえらいことになる

昨日リリースされたBeta.9に手を出したはいいものの問題が見つかった。
※ OnsenUI 2 rc.1で修正済み

# 問題
本来確保されるべき余白の他にもう一段余白が付いてしまう。

<img width="250" alt="IMG_0075.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/106886/f588856e-5997-17e6-7555-405d682d3f3b.png">

「保存→ライブリロード」とすると余白が正常に戻る時がある。
ons-spllitterを使ったのが悪かったのかもしれない。現在調査中。

```html:ソース
<ons-page>
    <ons-splitter>
        <ons-splitter-side animation="default" var="side" side="left" collapse="portrait" swipeable swipe-target-width="50px" width="220px">
            <ons-page>
                <ons-list>
                    <ons-list-header>メニュー</ons-list-header>
                    <ons-list-item tappable>ログアウト</ons-list-item>
                </ons-list>
            </ons-page>
        </ons-splitter-side>
        <ons-splitter-content var="content">
            <ons-page>
                <ons-toolbar>
                    <div class="left"><ons-back-button>Back</ons-back-button></div>
                    <div class="center">Page 1</div>
                </ons-toolbar>
            </ons-page>
        </ons-splitter-content>
    </ons-splitter>
</ons-page>
```

# 解決法
とりあえずステータスバーの表示自動調整を無効化して、

```js
// Appモジュール定義
var app = ons.bootstrap('app', ['onsen']);
ons.disableAutoStatusBarFill();
```

index.htmlのヘッダに古き良きパッチを入れる。

```js
<script>
    function onDeviceReady() {
        if ( window.device.platform === 'iOS' && parseFloat(window.device.version) >= 7.0 ) {
            document.body.style.marginTop = "20px";
        }
    }
    document.addEventListener('deviceready', onDeviceReady, false);
</script>
```
ひとまずこれでOK。
Windows 10のBashでError: 0x80070057が出た時の対処法

Windows 10 Insider Preview Build 14316でBashが使えるようになったが、
 `Error: 0x80070057 `
と出て使えない場合の対処方法。
(インストール方法は他の方の記事を参考にしてください。)

コマンドプロンプトのプロパティの、「従来のコンソールを使う」にチェックが入っている場合はチェックを外す。

![bash004.jpg](https://qiita-image-store.s3.amazonaws.com/0/67623/f270c689-9480-787d-b9d1-6c2c5ccb1e57.jpeg)
sedで最終行に挿入

Dockerfile内で最終行に文字を挿入したくなった。

## 参考

* [Sed Command in Linux - Append and Insert Lines to a File ~ Your Own Linux..!](http://www.yourownlinux.com/2015/04/sed-command-in-linux-append-and-insert-lines-to-file.html)

## 最終行に挿入

```bash:
$ sed -e '$ a hoge' sources.list.bak 
deb http://httpredir.debian.org/debian stretch main
deb http://httpredir.debian.org/debian stretch-updates main
deb http://security.debian.org stretch/updates main
hoge
```

## 最終行の一行前に挿入

```bash:
$ sed -e '$ i hoge' sources.list.bak 
deb http://httpredir.debian.org/debian stretch main
deb http://httpredir.debian.org/debian stretch-updates main
hoge
deb http://security.debian.org stretch/updates main
```

## 任意の行に挿入

```bash:
$ sed -e '2i hoge' sources.list.bak 
deb http://httpredir.debian.org/debian stretch main
hoge
deb http://httpredir.debian.org/debian stretch-updates main
deb http://security.debian.org stretch/updates main
```
Pythonで絶対URLを相対URLに変換

開発環境から本番サーバーへアップする場合など、リンク等が相対パスで書かれていた方がいい時も。

起点となるファイルorディレクトリから、相対パスを求める関数はこんな感じでしょうか。

```
import sys, os
from urlparse import urlparse, urlunparse

def relurl(absolute, origin):
    a = urlparse(absolute)
    o = urlparse(origin)

    # ドメインが違う時、相対パスは考えにくいのでそのまま返却
    if a.netloc != o.netloc:
        return absolute

    relative = os.path.relpath(a.path, os.path.dirname(o.path))
    return urlunparse(('','',relative) + a[3:])

def main():
    params = sys.argv
    print relurl(params[1], params[2])

if __name__ == '__main__':
    main()
```
Spring Boot解説第4回(開発環境編：warファイル作成)

こんにちは！
情創 技術開発局の@TEBASAKIです。
桜は散りましたが、私の手羽は満開です。

今回もSpring Boot解説のほうを進めていきたいと思います。
第4回は「開発環境編：warファイル作成」です。

## warファイル作成の理由
Spring Bootはビルドで作成したjarの中にTomcatが組み込まれており、
jar単独でもWebアプリケーションが動作します。
そして、サーバー環境でjarをサービスに登録し、
apacheと連携させる流れとなります。(他にも方法ありますが、割愛)

一つのTomcatで複数アプリケーションを管理したい場合、
Spring Bootでwarファイルを作成することができます。
今回はwarファイルの作成方法を解説します。

なお、今回使用するプログラムは[第2回](http://qiita.com/TEBASAKI/items/a30a7daf11cdb51272fb)で使用したHelloWorldです。

## 1.プログラムの修正
エントリポイントのApplication.javaが、
SpringBootServletInitializerを継承するように修正します。
そして、設定クラスを認識させるために、
SpringApplicationBuilderメソッドを追加します。

```java:Application.java

/* 省略 */

@SpringBootApplication
public class Application extends SpringBootServletInitializer {

/* 省略 */

	/**
	 * Servletコンテナ起動時の設定クラス認識。
	 *
	 * <PRE>
	 * Servletコンテナで起動したときにどのクラスが設定クラスなのか認識させます。
	 * </PRE>
	 *
	 * @param  SpringApplicationBuilder
	 * @return SpringApplicationBuilder
	 */
	@Override
	protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
		return application.sources(Application.class);
	}
}
```

## 2.build.gradleの修正
apply plugin: 'war'を追加します。
また、dependenciesに以下の記述を追加することで、
組み込みのTomcatをwarファイルに含めないようにします。

```groovy:builde.gradle

// 省略

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'spring-boot'
apply plugin: 'war'

// 省略

dependencies {

// 省略

    providedRuntime("org.springframework.boot:spring-boot-starter-tomcat")

}
```

## 3.warファイルの作成
いよいよwarファイルの作成に移りますが、その前にコンテキストパスの設定をします。
src/mainの下にresourcesフォルダを作成し、
その下にapplication.propertiesファイルを作成、以下のように記述します。

```properties:application.properties
//例
server.context-path=/demo
```

以上を保存したら、右クリック→Gradle→すべてリフレッシュを選択して、
Gradleプロジェクトのリフレッシュを行います。
続いてプロジェクトを右クリック→Gradle→タスク・クイック・ランチャーを選択し、
「war」と記述してからEnterで実行します。
![image](https://qiita-image-store.s3.amazonaws.com/0/116031/0db21e5c-7844-6fee-1a5d-b19bb42d4947.png)

または、Gradleタスクタブでプロジェクトを選択し、warをダブルクリックして実行します。
このとき濃緑色のGradleタスクを使うことに注意しましょう。
![image](https://qiita-image-store.s3.amazonaws.com/0/116031/2ec5ccb2-3a2b-430c-9ef8-23b210e8ec18.png)


(プロジェクトフォルダ)→build→libsにwarファイルが作成されていれば完了です。

## 4.Tomcatへのwarファイル配備
第1回で解説した通り、Tomcat8を使用します。
Tomcatのインストールについては[こちら](http://www.javaroad.jp/opensource/js_tomcat1.htm)を参照してください。
Configure TomcatからStartを押してTomcatを起動します。
※Startup typeがAutomaticになっているとTomcatが自動で起動してしまい、
　Spring Bootの組み込みTomcatが起動できなくなってしまうので、
　Manualにしておくことをおすすめします。
![image](https://qiita-image-store.s3.amazonaws.com/0/116031/6201203e-283d-ac68-2090-c9f068fc1758.png)

次にTomcat Managerを起動します。
ここでwarファイルを配備します。
![image](https://qiita-image-store.s3.amazonaws.com/0/116031/dffc23c7-49c9-0bb9-bab1-8ea4da73af97.png)

配備方法は2通りありますが、今回は上の方法で配備します。
先ほどapplication.propertiesにコンテキストパスを設定しましたが、
Tomcatに配備する際はこちらで設定しなければなりません。
コンテキストパスに/demoを指定して、warファイルのパスを指定したら配備を押します。
下記のようにアプリケーション一覧に表示されたら配備完了です。
![image](https://qiita-image-store.s3.amazonaws.com/0/116031/d730f6bd-eb9f-c790-dc39-3a89529ed0a2.png)

最後に http://localhost:8080/demo/ にアクセスして確認してみましょう。
下記のように表示されたらOKです。
![image](https://qiita-image-store.s3.amazonaws.com/0/116031/7e3af5dc-9859-59f0-ffd1-b21d15ed1c42.png)


今回はここまでです。
それではまたお会いしましょう！
Wordpressの検索フォームを使った検索結果から特定のカテゴリを除外する

# はじめに

Wordpressで特定のカテゴリを検索結果から除外する方法を「こうする」という説明を見つけることができなかったので、いろいろ調べてみた結果の共有です。

# 事前準備

除外したいカテゴリのIDを管理機能で調べておく必要があります。
その操作は割愛します（＾＾）

# コードの編集

除外したいカテゴリのIDが2と8だとすると、検索フォームの中に以下のようなinputタグを追記することでそのカテゴリを除外することができます。

```html
<!-- 例えばこんな検索フォーム -->
<form method="get" class="searchform" action="...." role="search">
  <input type="text" name="s" value="...." class="s" .... />
  <!-- ↓ このinputタグ ↓ -->
  <input type="hidden" name="cat" id="cat" value="-2,-8" />
  <button type="submit" name="submit" class="searchsubmit">...</button>
</form>
```

# 参考資料

* [WP_Query関数のリファレンス](https://wpdocs.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/WP_Query)
vimはなぜjで下に移動するのか？ 〜vim初心者によるvim初心者のためのvim入門〜

本稿は「vim触ってみたけど、全くわからなくて挫折した……」という方向けの、もう一度vimつかってみようよ！という応援記事です。
今回は、カーソルの動かし方がわからなくて挫折しました。という方に向けた「hjklの覚え方」についてまとめてみました。

※この記事は[MacVim-KaoriYa](https://github.com/splhack/macvim-kaoriya)についてのものです。他のvimと多少違いがある場合があります。


# vimはなぜjでカーソルが下に動くの？↓でいいじゃん、わかりやすいし

これ、私も当初ものすごく困惑しました。
ここで投げ出した方も多いんじゃないでしょうか？

なぜjで下に移動するのか？これがわかればvimの操作をマスターしたも同然です。

皆さんはキーボードを打つときにホームポジションを守っていますか？
私は形から入るタイプなのでこの業界に入るときに必死に覚えました。

もちろん守ってるという人も、守ってない人も、初心に戻ってホームポジションで構えてみてください。

するとどうでしょう。右手の人差指が「j」の位置にありませんか？

「カーソルを下に動かす」という動作はプログラミングをするうえでとても重要な動作です。
上や左右よりも下に動かす機会の方が圧倒的に多いでしょう。
**ホームポジションで構えたとき、一番押しやすいキーが一番重要なキー**なのです。

「jで下に移動」ではなく「右手の人差指にあるキーを押すと下に移動する」とおぼえてしまえば、頭で（jは下…）と呪文を唱えなくても良くなるのです！

そこからはもう簡単ですね。
キーボードは

h j k l

と並んでいます。
左に行きたいなら「重要なキーより左」右に行きたいなら「最も右」そして「余りが上」に移動するキーなのです。


# 矢印キー無効でvimレッスン

とはいえ、実際にvimを使い始めてもいつの間にか矢印キーに手が伸びてしまうものです。
頭で理解しても、体が覚えてしまっているのです。
無意識にホームポジションから手を離し矢印キーを使いそしてまたホームポジションに戻る……
ホームポジションから手を動かさずなんでもできるのが魅力のvimです。マウスや矢印キーに手を伸ばした時点でvimの半分以下の性能しか発揮できていないのです。

しかしどうしても矢印キーを押してしまう。しかも矢印キーで動かせちゃうからなかなか癖が抜けない。
そんなあなたはvimの設定ファイルに次の記述をしてみましょう。
vimの設定ファイルはホームディレクトリにある`.vimrc`です。ファイルが存在しない場合は新しく作ってしまって構いません。

```lang:~/.vimrc
" 矢印キーを無効にする
noremap <Up> <Nop>
noremap <Down> <Nop>
noremap <Left> <Nop>
noremap <Right> <Nop>
inoremap <Up> <Nop>
inoremap <Down> <Nop>
inoremap <Left> <Nop>
inoremap <Right> <Nop>
```
設定ファイルを保存したらvimを再起動しましょう。
これでもう矢印キーは使えなくなりました。


# 困ったら「ESC」

カーソルを移動させたいのに文字が入力される、でも元の状態に戻れない！わけがわからないよ！
そんな状態に陥ってしまったら、とりあえずESCキーを押しましょう。
カーソルの形状が「|」から「■」になっていればもう安心。hjklでカーソルが移動できるようになりました！


# 誰かのパクリからはじめよう

vimは設定次第で様々な機能を追加できる反面、全くカスタマイズしてない状態では使い物になりません。
全くの初心者の状態で一から設定するなんて至難の業です。まずは誰かの設定ファイルを使ってみましょう。

初心者向けに何も考えずに使える設定を書いてみました。まずはシンプルな設定ファイルでvimに慣れましょう。

[何も考えず~/.vimrcにこれを書くんだ！](http://qiita.com/mfujimori/items/9fd41bcd8d1ce9170301)
何も考えず~/.vimrcにこれを書くんだ！ 〜vim初心者によるvim初心者のためのvim入門〜

vim、使ってますか？
デキる人のためのイケてるエディタという印象のあるvimですが、できない人がvim使ったっていいじゃない。**だって格好いいんだもん！**

憧れのあの人が使ってるイケてるエディタを使ってみたい……そう思って導入したものの、あの人が使ってるかっこいい画面じゃない。なぜ？？

本稿は「vim触ってみたけど、全くわからなくて挫折した……」という方向けの、もう一度vimつかってみようよ！という応援記事です。

※この記事は[MacVim-KaoriYa](https://github.com/splhack/macvim-kaoriya)についてのものです。他のvimと多少違いがある場合があります。


# 誰かのパクリからはじめよう

vimは設定次第で様々な機能を追加できる反面、全くカスタマイズしてない状態では使い物になりません。
まずはvimの先駆者たちから設定を拝借しましょう。
最初は意味がわからなくても大丈夫です。そのうち自己流にカスタマイズしたくなってくる時がきます。

ここではプラグインなどの小難しいことは抜きにして、vimに元からある機能だけでそれっぽく使えるように設定ファイルを書いてみました。

```vim:~/.vimrc
" setting
"文字コードをUFT-8に設定
set fenc=utf-8
" バックアップファイルを作らない
set nobackup
" スワップファイルを作らない
set noswapfile
" 編集中のファイルが変更されたら自動で読み直す
set autoread
" バッファが編集中でもその他のファイルを開けるように
set hidden
" 入力中のコマンドをステータスに表示する
set showcmd


" 見た目系
" 行番号を表示
set number
" 現在の行を強調表示
set cursorline
" 現在の行を強調表示（縦）
set cursorcolumn
" 行末の1文字先までカーソルを移動できるように
set virtualedit=onemore
" インデントはスマートインデント
set smartindent
" ビープ音を可視化
set visualbell
" 括弧入力時の対応する括弧を表示
set showmatch
" ステータスラインを常に表示
set laststatus=2
" コマンドラインの補完
set wildmode=list:longest
" 折り返し時に表示行単位での移動できるようにする
nnoremap j gj
nnoremap k gk
" シンタックスハイライトの有効化
syntax enable


" Tab系
" 不可視文字を可視化(タブが「▸-」と表示される)
set list listchars=tab:\▸\-
" Tab文字を半角スペースにする
set expandtab
" 行頭以外のTab文字の表示幅（スペースいくつ分）
set tabstop=2
" 行頭でのTab文字の表示幅
set shiftwidth=2


" 検索系
" 検索文字列が小文字の場合は大文字小文字を区別なく検索する
set ignorecase
" 検索文字列に大文字が含まれている場合は区別して検索する
set smartcase
" 検索文字列入力時に順次対象文字列にヒットさせる
set incsearch
" 検索時に最後まで行ったら最初に戻る
set wrapscan
" 検索語をハイライト表示
set hlsearch
" ESC連打でハイライト解除
nmap <Esc><Esc> :nohlsearch<CR><Esc>
```

vimには`.vimrc`と`.gvimrc`という2つの設定ファイルがあります。（正確には`.gvimrc`はGUI vim固有の設定を書くためのファイルです。）
イケてる見た目にするために`.gvimrc`という設定ファイルも作りましょう。

```vim:~/.gvimrc
" ウィンドウの縦幅
set lines=55
" ウィンドウの横幅
set columns=180
" カラースキーム
colorscheme koehler
" ダーク系のカラースキームを使う
set background=dark
```

`.gvimrc`、`.vimrc`それぞれホームディレクトリに制作しましょう。ファイルが存在しない場合は新しく作ってしまって構いません。

設定ファイルができたらvimを再起動してみましょう。
うまく設定が読み込めていればデフォルトとは見違えるほどイカしたエディタになっているはずです。


# 操作方法を覚えよう

vimの操作は他のどのエディタとも違いかなり独特です。
最初はその操作性に戸惑うかもしれませんが、コツをつかめば簡単に操作できるようになります。

vimを操作するコツもまとめてあるので、まずはとにかくvimを触りまくってみましょう。
[vimはなぜjで下に移動するのか？](http://qiita.com/mfujimori/items/34bb2466f98ab58f2e77)
Raspbianの設定

- [RaspbianのユーザIDとパスワード](https://www.raspberrypi.org/documentation/linux/usage/users.md)

- [Raspbianの日本語化](http://www.rs-online.com/designspark/electronics/knowledge-item/JPN-raspberry-pi-Japanese-version)

- [RaspbianのBluetooth有効化](http://qiita.com/da1fujimoto/items/c0d652049e8455894fd9)
Solr 6.0.0をインストールしてみた

### ネタ元

http://yonik.com/solr-6/

### ミラーサイトとか

http://ftp.tsukuba.wide.ad.jp/software/apache/lucene/solr/

### 実際にインストールしてみる

+ 環境
    + centos 6.7 (vagrant box = bento/centos-6.7)

+ スクリプト

```text:provision.sh
solr() {
  
  : "get and install apache solr" && {
  TMP_DIR='/var/tmp'
  VERSION='6.0.0'
  
  cd ${TMP_DIR}
  wget http://ftp.tsukuba.wide.ad.jp/software/apache/lucene/solr/${VERSION}/solr-${VERSION}.tgz
  tar zxvf ${TMP_DIR}/solr-${VERSION}.tgz
  sh ${TMP_DIR}/solr-${VERSION}/bin/install_solr_service.sh solr-${VERSION}.tgz
  ln -s ${V_DIR}/template/solr/etc/solr.conf  /etc/solr.conf
  service solr restart
  }
}
```

### snapshot

+ webは5.5から変更はしてない模様
+ 機能はこれから使ってみます！

![apsolr.png](https://qiita-image-store.s3.amazonaws.com/0/25582/8853ed22-f10b-99f5-11b4-bf87ad28bc4d.png)
[minecraft] [Forge] intelliJでのminecraftのmodding環境の構築 [modding]

# はじめに


Forgeを使ったminecraft-moddingについての記事をたてたけど、自分の環境の説明もないとわかりにくいかなと自分メモも兼ねて環境構築方法の記事を書こうと思いたった。

# 事前準備

## 1.1. 動作環境

- OS X 10.11.3

## 1.2. 事前準備

以下が必要（ダウンロードしてある人は [1.6.](http://qiita.com/ryosebach/items/9483c6797e1c1e841494#16-forgeのセットアップ) まで飛ばしてください。)

- Forge
- intelliJ
- JDK

## 1.3. JDKのダウンロード

以下のリンクより自分の環境に沿ったものをDLする。
[JDK](http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html)

![スクリーンショット 2016-04-07 23.58.56.jpg](https://qiita-image-store.s3.amazonaws.com/0/114344/2877ef79-1b52-6391-8718-14cbc4fb2128.jpeg)

DLしたものをインストールしておく。

## 1.4. intelliJのダウンロード

以下のリンクよりCommunityエディションをダウンロード
[intelliJ](https://www.jetbrains.com/idea/download/#section=mac)

![スクリーンショット 2016-04-08 8.56.47.jpg](https://qiita-image-store.s3.amazonaws.com/0/114344/ac7aba5b-f343-a3ed-b6ef-43e42126bd48.jpeg)


## 1.5. Forgeのダウンロード

以下のリンクをクリック
[Forge](http://files.minecraftforge.net/maven/net/minecraftforge/forge/index_1.7.10.html)

![スクリーンショット 2016-04-08 8.58.19.jpg](https://qiita-image-store.s3.amazonaws.com/0/114344/bfc2340f-a47f-3145-8902-084de7371d8f.jpeg)

## 1.6. Forgeのセットアップ

- terminalを起動する。
- cdしてフォルダに移動or **cdf** コマンドを使う（何それって方は[ここ](http://qiita.com/ryosebach/items/e78fdae7464198be18e6)を！！！）

![スクリーンショット 2016-04-08 9.07.28.jpg](https://qiita-image-store.s3.amazonaws.com/0/114344/46cb89f8-145f-03cb-b37f-cc7fae9e3480.jpeg)

- 次のコマンドを打ち込む

> echo sourceSets { main { output.resourcesDir = output.classesDir } } >> build.gradle

※vimでbuild.gradleを開いて、一番下に **sourceSets { main { output.resourcesDir = output.classesDir } }** と書き加えるのでも大丈夫

- 次のコマンドを打ち込む

> ./gradlew setupDecompWorkspace

![スクリーンショット 2016-04-08 9.20.07.png](https://qiita-image-store.s3.amazonaws.com/0/114344/79a98ccc-1216-fae2-64cb-ed1fd8bcc6d4.png)

このようにBuild SuccesfulとなればOk

- 最後に次のコマンドを打ち込む

> ./gradlew idea

同じようにBuild SuccessfulとなればOK

# intelliJでの読み込み

- intelliJを起動する。
- import projectを押す。

![スクリーンショット 2016-04-08 9.24.43.jpg](https://qiita-image-store.s3.amazonaws.com/0/114344/1c8e1ed8-81d9-b98e-9d2b-87ea27e5b9d6.jpeg)

- forgeのフォルダないのbuild.gradleを選択してOKを押す。

![スクリーンショット 2016-04-08 9.26.13.jpg](https://qiita-image-store.s3.amazonaws.com/0/114344/6204292c-4e30-36d4-d613-6965d85a66f9.jpeg)

- 以下のように設定がなっていることを確認してOKを押す。

![スクリーンショット 2016-04-08 9.27.00.jpg](https://qiita-image-store.s3.amazonaws.com/0/114344/305161f0-6f1f-2b24-776e-c907bff2d619.jpeg)

- しばらく待って読み込みが終わった後に以下のように▽を押してMinecraft Clientを選択

![スクリーンショット 2016-04-08 9.37.02.jpg](https://qiita-image-store.s3.amazonaws.com/0/114344/148ebadc-8f75-0fcd-95f1-1e4dab9eab09.jpeg)

これでセットアップは完了です。

# おわりに

windowsは放置してるのですが、だいたいやり方は同じ。質問等あればコメントくださいー

ではでは👋
SpringBoot + AngularJS + elasticsearchで社内FAQを作ってみた(デモ版)

社内PJでFAQシステムを導入する必要があり、それほど難しくない要件だったので作ってみました。
っていうだけの記事です、すいません笑

β版ですが、デモ環境はこちら
[デモ環境](http://hhfactory-demo.azurewebsites.net/newton/index#/)

*インフラはAzure Webappsの無料版なのでご自由にお使いいただけます。
*デモ環境では検索機能、画像/ファイルアップロードができません。

### 機能一覧
***
1. FAQをmarkdownで作成可能
2. テンプレートのエクセルから一括FAQ登録も可能
2. PDFなどのファイル類をカテゴリ分類
3. ユーザへのお知らせ掲示板機能
4. 用語集機能
5. Elasticsearchを使ったFAQの全文検索

### 動作環境
***
Chrome,safari,firefox
(markdownプレビューが現在IEだと動かなかったのでIEは動作対象外)

### 使用フレームワークなど
***
サーバー側：
spring-bootを使用、ライブラリ管理はGradle
DBはMysql(v5.6)
全文検索用にElasticsearch(v1.7.2)
（MysqlからESへのデータインポートはJDBC importerで1分間隔でバッチ連携）
ウェブサーバー自体はtomcat。

クライアント側：
AngularJS
markdownパーサーはmarked.js
テンプレートエクセル読み込み部分はjs-xlsx
その他のライブラリ等もwebjars経由で取得

### 今後
***
ログイン機能などの機能追加はどんどんやるとして、もし使ってみたいというレアな方がいらっしゃったらなんとか提供できる形を考えたいと思います。
体育会系 Docker Compose ハンズオン資料（3）〜 修正編 〜


[体育会系 Docker Compose ハンズオン資料（1）](http://qiita.com/inokappa/private/14f731d383d266255961) と [体育会系 Docker Compose ハンズオン資料（2）](http://qiita.com/inokappa/items/e5388726ee80ce24f633) で不備があった部分の修正です。

***

## 修正

### MySQL コンテナが exit 1 で落ちてしまい WordPress が起動しない

- 現象

以下のように MySQL が起動しない場合、仮想マシンのメモリ不足が想定されます。特に VirtualBox を利用している場合に発生する可能性があります。

~~~sh:output
db_1  | MySQL init process in progress...
db_1  | MySQL init process in progress...
db_1  | MySQL init process in progress...
db_1  | MySQL init process failed.
handsondockercomposewordpress_db_1 exited with code 1
~~~

- 対処

以下のように仮想マシンに swap 領域を追加して頂くか、一度、仮想マシンを削除した上でメモリを追加して仮想マシンを起動して頂くことで問題が解消します。

~~~ruby:Vagrantfile
#
# swap ファイルを追加
#
Vagrant.configure(2) do |config|
  config.vm.box = "ubuntu/trusty64"
  config.vm.network :private_network, ip: "192.168.33.10"
  config.vm.network :forwarded_port, host: 10080, guest: 80
  config.vm.boot_timeout = 360
  # add swap
  config.vm.provision :shell, inline: "fallocate -l 4G /swapfile && chmod 0600 /swapfile && mkswap /swapfile && swapon /swapfile && echo '/swapfile none swap sw 0 0' >> /etc/fstab"
  config.vm.provision :shell, inline: "echo vm.swappiness = 10 >> /etc/sysctl.conf && echo vm.vfs_cache_pressure = 50 >> /etc/sysctl.conf && sysctl -p"
end
~~~

ご指摘くださった [hitokuno](http://qiita.com/hitokuno) さん、有難うございます！

~~~ruby:Vagranfile
#
# メモリを約 1GB に設定
#
Vagrant.configure(2) do |config|
  config.vm.box = "ubuntu/trusty64"  config.vm.network :private_network, ip: "192.168.33.10"
  config.vm.network :forwarded_port, host: 10080, guest: 80
  config.vm.provider "virtualbox" do |vm|
    vm.memory = 1024
  end
end
~~~

尚、[1.3.3](http://qiita.com/inokappa/items/14f731d383d266255961#133-vagrant-%E3%81%AB%E4%BB%AE%E6%83%B3%E3%83%9E%E3%82%B7%E3%83%B3%E3%82%92%E7%94%A8%E6%84%8F%E3%81%97%E3%81%9F%E5%A0%B4%E5%90%88) は上記のように修正させて頂きました。

***

## 最後に

ご不便をおかけしてしまい申し訳ございませんでした！m(__)m
改行コード > LF CRの例

@ Adam Taylor MicroZed Chronicles - Using the Zynq 101 [Kindle Edition]
No.638/2129

```
printf("Adam Edition MicroZed Using Vivado How To Printf \n\r");
```

CR,LFの書き方が上記では LF, CR になっている。他の箇所でもこうなっている。

また、米国のいくつかの装置でもそういう事例に遭遇してきた経験がある。

何かそういう文化的なものがあるのだろうか。(未調査)

以下のようなコードの書き方をする人なので、案外適当なのかもしれないが

```
if(XST_SUCCESS != Status_ADC) {
...
if(Status_ADC != XST_SUCCESS) {
...
```

関連 http://qiita.com/7of9/items/04e0a5e9c6180ebc0b9c
> 改行コード > LF: Unix系OS / CR+LF: Windows / CR: MacOS(バージョン9まで)
DBaaSサービス「Compose」の金額感

free trialはもちろんタダですが一生使えるわけではないので、ちょっと参考までに調べたので備忘録。
IBM Managedとか普通のやつとかいっぱいあったー。けど、全体的に価格体系がシンプルな印象。

## 基本的にはDB本体の容量を気にすればOK
ネットワーク通信の課金もなさそうだし、バックアップ用の領域に別途お金を払うことはなさそう。
いくつか料金体系があるけど、基本的には**ディスク容量だけをを気にして**、場合によってはCPUとかメモリ(RAM）も気にすればOKに見える。

## Compose Enterprise
https://enterprise.compose.io/
企業で使う系はこれか。赤枠で囲ったところば、スライドバーみたいになってて、ディスク容量に応じた料金がすぐわかるようになってる。おもしろい。
![price.png](https://qiita-image-store.s3.amazonaws.com/0/119378/96d35e37-7656-db4c-0e95-24448b26588d.png)


## IBM Managed Compose Enterprise
たぶん企業とかで使う、かつ、IBMに全部お願い！ってときはこれかな。きっと。。。具体的な料金は書いてないけど・・・。
https://enterprise.compose.io/ibm-managed/


## 普通の？Compose
https://www.compose.io/pricing/
一般ピープルはきっとこれ。同じようにスライドバーみたいになっててディスク容量に応じた料金がすぐわかる。
ReactとJWTに関する資料

[Introduction to JSON Web Tokens](https://jwt.io/introduction/)
[JSON Web Token(JWt)](http://self-issued.info/docs/draft-ietf-oauth-json-web-token.html)
[Critical vulnerabilities in JSON Web Token libraries](https://auth0.com/blog/2015/03/31/critical-vulnerabilities-in-json-web-token-libraries/)
[JSON Web Token の効用](http://qiita.com/kaiinui/items/21ec7cc8a1130a1a103a)
[Secure Your React and Redux App with JWT Authentication](https://auth0.com/blog/2016/01/04/secure-your-react-and-redux-app-with-jwt-authentication/)
[Adding authentication to your React Flux app](https://auth0.com/blog/2015/04/09/adding-authentication-to-your-react-flux-app/)
技術英語 > "XADCInstPtr" (very original)

@ Adam Taylor MicroZed Chronicles - Using the Zynq 101 [Kindle Edition]
No. 488/2129

> "XADCInstPtr" (very original)

https://uk.answers.yahoo.com/question/index?qid=20130929131400AAQcBco

> It means that you're not copying other people and are expressing your own views in everything. 

very original というフレーズに最初は違和感があったが、very付きでも使う例があるようだ。

以下のカレンダーの紹介でも very original が使われている。

http://www.topdesignmag.com/20-very-original-examples-of-calendar-designs/
AloneのサンプルをApacheで動かしてみる

# Aloneとは?

"Aloneは、組込システムのために設計したアプリケーションフレームワークです。" ... [公式サイト](http://www.ruby-alone.org)より

# ダウンロード

[ダウンロードページ](http://www.ruby-alone.org/download/)から現行バージョン「Alone 3.2 (2014-11-19)」をダウンロードする。

# 使ってみる

サイトに[使ってみる CGI編](http://www.ruby-alone.org/wiki/doku.php?id=handbook3:使ってみる_cgi編)というページがあり、サンプルのCGIを動作させる方法が書いてあったので、その通りに実行してみる。

```
$ ruby lib/al_server.rb
```

WEBrickが動作するので、以下のURLにアクセスして動作確認。

http://localhost:10080

# Apacheの環境設定

解凍したAloneのファイルを以下のフォルダにコピーする。

/var/www/html/alone-3.2-release

```
# vi /etc/httpd/conf/httpd.conf
```

以下の記述を修正する。

```sh:.httpd.conf抜粋
DocumentRoot "/var/www/html"
↓
DocumentRoot "/var/www/html/alone-3.2-release/controllers"

<Directory />
    Options FollowSymLinks
    AllowOverride None
    ↓
    AllowOverride All
</Directory>
```

/var/www/html/alone-3.2-release/controllersの中に「.htaccess」ファイルを作成し、以下の内容とする。

```sh:.htaccess
Options +ExecCGI
AddHandler cgi-script .rb .cgi
DirectoryIndex index.html index.rb
```

他にもごにょごにょあるので、後で追記します。

設定変更後、Apacheを再起動する。

```
# service httpd restart
```

# ブラウザでアクセス

自分のPCで環境を設定してあれば、以下のURLにアクセスして動作を確認する。

http://localhost

# SQLiteを使ってDBを更新してみる

SQLiteを使うTODOリストを参考に操作します。
ここでは、Apacheの動作ユーザーが「apache」となっていると仮定する。

```
$ cd /var/www/html/alone-3.2-release/controllers
$ chown -R apache todo_sqlite/data
```

上記コマンドを実行後、以下のURLにアクセスする。

http://localhost/?ctrl=todo_sqlite

# 今後

Apacheで普通に使えることがわかったので、もう少し触ってみて独自Webアプリケーションが作れるか試してみる。
LINE BOT APIを利用した地獄のミサワBOTの作り方

# はじめに
LINEがBOT APIのトライアルアカウントを無償提供したので試してみましたのでやり方をご紹介します。

![0407final.png](https://qiita-image-store.s3.amazonaws.com/0/1901/fe1cdeea-4948-83a0-6b24-36ecea50a0a3.png)

> 【LINE】メッセージングAPIのオープン化に先駆け、先着1万名限定でBOTアカウントを自由に開発できる「BOT API Trial Account」の無償提供を開始
> http://linecorp.com/ja/pr/news/ja/2016/1320

# 作ってみたもの

![写真.png](https://qiita-image-store.s3.amazonaws.com/0/1901/6b64b9a2-c85b-1af5-3133-1d98620affda.png)

みさわに話しかけると、ネタ画像を１枚送ってくれます。ただそれだけです。画像はS3に置きました。

QRコードでさくっと追加出来るみたいですが、友達上限が50名のため限りがあります。

![jgp2389e.png](https://qiita-image-store.s3.amazonaws.com/0/1901/9916137c-9b7d-58f7-2005-b245d5ea9f5f.png)


# 必要なもの

* LINEビジネスアカウント　
    * https://business.line.me/ja/
* SSL通信可能なサーバー
* ネタ

# 作り方

## 1.ビジネスアカウントの作成
![スクリーンショット 2016-04-08 3.38.02.png](https://qiita-image-store.s3.amazonaws.com/0/1901/03e35e20-3461-3a55-34e9-004ad96a26a4.png)
![スクリーンショット 2016-04-08 3.38.35.png](https://qiita-image-store.s3.amazonaws.com/0/1901/5a8ebff2-8802-d1d5-19c4-39d152509517.png)

## 2.アカウント情報を確認してコールバックURLを設定

チャンネルIDやシークレットなどが発行されます。

![screencapture-developers-line-me-channels-1461989310-1460054506047.png](https://qiita-image-store.s3.amazonaws.com/0/1901/bd513a85-4f04-0cc9-bee7-f4d7ea6f0217.png)

メッセージが送信された時に通知する先を登録するのですが、```https```でかつ、```:443```　を含めないと、```Not secure URL or port number not sepcified.```でエラーになりますので注意しましょう。

```コールバックURL例
https://サーバー:443/linebot/callback
```

## 3. Server IP Whitelistの登録

コールバックで指定したURLから、BOT APIを利用する場合、そのIPアドレスを事前に登録しないと拒否されてしまうので登録します。

![スクリーンショット_2016-04-08_3_45_42.png](https://qiita-image-store.s3.amazonaws.com/0/1901/f38b8a06-19d6-3437-bd80-6608c7944779.png)

## 4.登録出来たら、APIリファレンスを見ながらBOT APIの処理を実装

試すだけなので素のPHPで画像を返す処理を実装しました。

```php:callback.php
<?php
$json_string = file_get_contents('php://input');
$jsonObj = json_decode($json_string);
$to = $jsonObj->{"result"}[0]->{"content"}->{"from"};

// テキストで返事をする場合
$response_format_text = ['contentType'=>1,"toType"=>1,"text"=>"hello"];
// 画像で返事をする場合
$response_format_image = ['contentType'=>2,"toType"=>1,'originalContentUrl'=>"画像URL","previewImageUrl"=>"サムネイル画像URL"];
// 他にも色々ある
// ....

// toChannelとeventTypeは固定値なので、変更不要。
$post_data = ["to"=>[$to],"toChannel"=>"1383378250","eventType"=>"138311608800106203","content"=>$response_format_image];

$ch = curl_init("https://trialbot-api.line.me/v1/events");
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($post_data));
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    'Content-Type: application/json; charser=UTF-8',
    'X-Line-ChannelID: 発行されたチャンネルID',
    'X-Line-ChannelSecret: 発行されたチャンネルシークレット',
    'X-Line-Trusted-User-With-ACL: 発行されたMID'
    ));
$result = curl_exec($ch);
curl_close($ch);

```

## 5.以上の手順でBOTが完成です

LINEアプリで友だち追加して、BOTにメッセージを送ってみましょう。
もしうまくいかない場合、BOT APIのレスポンスをチェックしてみましょう。

# 最後に

今回試したものは対話型では無いので面白味が全くありませんでした。
[docomoが公開している言語解析やシナリオ対話](https://dev.smt.docomo.ne.jp/)、[世の中に公開されている無料のAPI](http://tamezatu.com/apis-2015-all/)などを活用することで簡単に面白いBOTが作れると思います。

メッセージ・画像・動画・音声・スタンプ・位置情報などを元にした対話型サービスを作れるので活用方法は様々で、本当にいろんなWebサービスがBOT化していきそうですね。
本当に2016年1番人気はTypeScriptなのか？

> JavaScriptのプログラミング技術で2016年1番人気なのはMicrosoft社製のTypeScript。類似の技術であるBabel、Haxe、CoffeeScriptと比べても人気のある技術です。Babelも伸びてはいますが、TypeScriptの方が抜きん出ている状況です。
[これを選んでおけば間違いない2016年流行りのCSS・JavaScript・タスクランナー - Qiita](http://qiita.com/tonkotsuboy_com/items/26ad863bddf98ff01af5)

GoogleトレンドによるとTypeScript一強時代に入ったようです。

が、個人的にはGoogleトレンド？それで何がわかるの？と思っているので、npmのダウンロード数を比較してみます。~~Babelの構文調べるならBabelなんて書かずにES6ってみんな調べるんじゃないかなぁ~~

<img width="971" alt="typescript_vs_babel-core_vs_coffee-script_-_npm_trends_-_Vimperator.png" src="https://qiita-image-store.s3.amazonaws.com/0/15319/75ea059b-ca46-1db4-0b59-fe8329ad3723.png">

[typescript vs babel-core vs-coffee-script - npm trends](http://www.npmtrends.com/typescript-vs-babel-core-vs-coffee-script)

だいたいBabelがTypeScriptのおよそ3倍程度のダウンロード数ですね。
グラフを見る限り、この一年でBabelが急成長しているようです。
てゆうか、未だにCoffeeScriptがこんなにダウンロードされているとは驚きです。
数が多ければ多いほど最強の理論でいくと、CoffeeScriptが2016年ナンバーワンですね！！！！


## おまけ
<img width="958" alt="gulp_vs_grunt_vs_webpack_-_npm_trends.png" src="https://qiita-image-store.s3.amazonaws.com/0/15319/07b4be52-1b67-e2fe-0110-cec348393a6f.png">

[gulp vs grunt vs webpack - npm trends](http://www.npmtrends.com/gulp-vs-grunt-vs-webpack)

## まとめ
ところで、気づいてしまったのですが、年末(Dec 20 ~ Jan 3あたり)になるとBabelもCoffeeScriptもダウンロード数が一気に下がるのにTypeScriptは下がる気配がありません！！！
まあ、型に守られた屈強なTypeScriptユーザーには休暇など必要もないので当然ですね。

## 参考
- [これを選んでおけば間違いない2016年流行りのCSS・JavaScript・タスクランナー - Qiita](http://qiita.com/tonkotsuboy_com/items/26ad863bddf98ff01af5)
LINE BOT をとりあえずタダで Heroku で動かす

とにかく今すぐ Heroku にデプロイしたい方はこちら。 (要 [LINE BOT API のトライアルアカウント](https://business.line.me/services/products/4/introduction))
[![Deploy](https://www.herokucdn.com/deploy/button.png)](https://dashboard.heroku.com/new?button-url=https%3A%2F%2Fgithub.com%2Fyuya-takeyama%2Fline-echo&template=https%3A%2F%2Fgithub.com%2Fyuya-takeyama%2Fline-echo)

---

LINE BOT API の呼び出しには Server IP Whitelist に接続元 IP の指定が必要とのことで、Heroku だと難しいかなー、と思いましたがアドオンで解決できました。

[Fixie](https://elements.heroku.com/addons/fixie)

これを使うと HTTP プロキシの URL が発行され、それを通してリクエストすればアウトバウンド IP を固定できるというものです。
無料プランもあるのでそれを使えばとりあえずタダで試せます。
(最初に [Proximo](https://devcenter.heroku.com/articles/proximo) という類似アドオンを試そうとしたけどそっちは無料プランなかったので無駄に $5 取られるっぽい。つらい)

```
$ heroku addons:create fixie:tricycle
```

これを実行するとアウトバウンド IP が出力されるので、それを LINE BOT API の Server IP Whitelist に登録します。

後から確認する場合は Heroku 上で作ったアプリの設定画面から Fixie の画面を開くと Account の画面で確認できます。

![Fixie 2016-04-09 11-38-30.png](https://qiita-image-store.s3.amazonaws.com/0/208/d725b717-43e3-12ea-6af7-5d83aaa19c48.png)

とりあえず試すコードとしては、@masuidrive さんの[とりあえずLINE BOT APIでオウムを作ってみた](http://qiita.com/masuidrive/items/1042d93740a7a72242a3)をほぼ丸パクリして以下のようになりました。 (すいません)

```rb:config.ru
# Mostly taken from http://qiita.com/masuidrive/items/1042d93740a7a72242a3

require 'bundler/setup'
require 'sinatra/base'
require 'json'
require 'rest-client'

class App < Sinatra::Base
  post '/linebot/callback' do
    params = JSON.parse(request.body.read)

    params['result'].each do |msg|
      request_content = {
        to: [msg['content']['from']],
        toChannel: 1383378250, # Fixed  value
        eventType: "138311608800106203", # Fixed value
        content: msg['content']
      }

      endpoint_uri = 'https://trialbot-api.line.me/v1/events'
      content_json = request_content.to_json

      RestClient.proxy = ENV["FIXIE_URL"]
      RestClient.post(endpoint_uri, content_json, {
        'Content-Type' => 'application/json; charset=UTF-8',
        'X-Line-ChannelID' => ENV["LINE_CHANNEL_ID"],
        'X-Line-ChannelSecret' => ENV["LINE_CHANNEL_SECRET"],
        'X-Line-Trusted-User-With-ACL' => ENV["LINE_CHANNEL_MID"],
      })
    end

    "OK"
  end
end

run App
```

ソースはここに置いてます。 (masuidrive さんに怒られたら消す)
https://github.com/yuya-takeyama/line-echo
LINE_CHANNEL_ID の環境変数とかは適当に設定してください。
LINE developers のページで登録したら発行されるので。
そしてそのときに QR とかも出てくるのでそれを友達として登録して話しかけたら返ってきます (おしまい)
ownCloudでリダイレクトループに陥るとき

cat /etc/php-fpm.d/www.conf|grep session

> php_value[session.save_path] = /var/lib/php/5.6/session

chmod 777 /var/lib/php/5.6/session

上記で解決。
つまりセッションの持ち回りが上手にできないことから発生している模様。
php_value[session.save_handler] = files
となっているものをredisやらにすればいいんだろうが、そんな贅沢は...
Golangを使って可能な限りUniqueなIDを生成する


## 背景

最近複数台の環境間でログに出力するUniqueIDだったり、色々コードを考えることがあったので、メモがてら書き出しました。  
弊社のセキュリティのスペシャリストだったり、色々な人に知恵を頂いた結果でもありますが！

## 参考にする知識

[誕生日のパラドクス](https://ja.wikipedia.org/wiki/%E8%AA%95%E7%94%9F%E6%97%A5%E3%81%AE%E3%83%91%E3%83%A9%E3%83%89%E3%83%83%E3%82%AF%E3%82%B9)
[誕生日攻撃](https://ja.wikipedia.org/wiki/%E8%AA%95%E7%94%9F%E6%97%A5%E6%94%BB%E6%92%83)

色々あとで書く

考え方
同一マイクロ秒時に15000件作成した際の衝突確率を0.00098以下にする。

## 必要バイト数算出方法

### 回数

2^n n=14
16384

計算式の関係上わかりやすく、n=14として想定数より多めに計算

### 衝突確率

1/(2^m) m=10
0.00098

### 同タイミングに上記回数で上記衝突確率に抑えることができるbit数

2*(n+m)
48bit = 6byte
更に、1.5倍ほどしておく
※時間が見つけて理由を追記します。

その結果、10バイトの文字列が必要になります。

### 結果みせなさいよ

16進数 version
http://play.golang.org/p/M63fCAbbgG

全体で60文字になります。ちょっとおおいなー。

base64 version
http://play.golang.org/p/N6FhPJTBUq

全体で40文字になります。まあいい感じ

### ちなみに

githubのcommit idは
`fc23e32a331a684831d08df7677c2deb438084cc`
と、４０文字でした。
16進数で40文字程度ですので、この記事の計算はやり過ぎ感ありますね笑

## 総括

コード設計は奥が深いです。  
今回bitだったり、文字コードだったり、数学的知識だったり  
色々不勉強だなーと実感した次第です。