OmniAICreator/Qiita-1.07M huggingface dataset:
Gadflyでジバニャンの方程式をプロットする、あるいはz=0を満たす等高線をプロットするには

```jl
function jibanyan_equation(x, y)
    min(max(min(1-(x/108)^2-(y/94)^2,y),
    min(1-((abs(x)-119)/103)^2-((y-56)/86)^2,
    1-((abs(x)-15)/77)^2-((y-119)/100)^2),
    1-((abs(x)-42)/66)^2-(y/55)^2,
    min(55+y,51-abs(x),-y)),
    3*abs(y-100)-2*(x-75)) * min(min(max(min(1-(x/106)^2-(y/92)^2,y),
    min(1-((abs(x)-119)/101)^2-((y-56)/84)^2,
    ((abs(x)-99)/40)^2+((y-54)/86)^2-1,92-abs(x)),
    1-((abs(x)-42)/64)^2-(y/53)^2),
    min(((abs(x)-52)/26)^2+((y+28)/26)^2-1,
    ((abs(x)-51)/13)^2+(y/13)^2-1,
    max(abs(x)-51,y))),abs(x/51+10/51*sin(abs(y/61.2)^(1.2)*pi*(7/2)))^(2/3)+abs(y/61.2)^(2/3)-1) * min(1-(x/32)^2-((y+30)/32)^2,
    1-((abs(x)+5)/22)^2-((y-18)/22)^2) * min(1-((abs(x)-18)/20)^2-((y+10)/20)^2,
    ((abs(x)-20)/22)^2+((y+7)/20)^2-1) * (1-((abs(x)-51)/11)^2-(y/11)^2)
end

using Gadfly
plot(z=(x,y) -> jibanyan_equation(x, y),
     x=linspace(-150,150,1000), y=linspace(-150,150,1000), Geom.contour(levels=[0]))
```

![Gadfly_Jiba.jpg](https://qiita-image-store.s3.amazonaws.com/0/3458/debbf671-a61b-bc37-1f9c-b8893b3fb259.jpeg)


Geom.contourのオプションにlevels=[0]を指定しないと残念な結果になる。

![bad_jibanyan.jpg](https://qiita-image-store.s3.amazonaws.com/0/3458/9b366fa4-912d-1644-646d-177d493b8021.jpeg)

# 参考資料

- [ジバニャン方程式の作り方 #vgadvent2014 | Akiyahの珈琲日記](http://black.ap.teacup.com/akiyah/1823.html)

# 関連記事

- [JulialangにHTTP2サーバーをさせたら](http://abrakatabura.hatenablog.com/entry/2015/12/10/070837)
- [IJuliaをHerokuの無料枠で動かした](http://abrakatabura.hatenablog.com/entry/2016/03/07/205816)
- [mruby-juliaでPythonもmrubyから呼び出せるようになった](http://abrakatabura.hatenablog.com/entry/2016/07/02/183532)
- [aobenchをjuliaでやってみた](http://abrakatabura.hatenablog.com/entry/2016/07/15/074022)
- [1/7がつくる楕円をJulia言語でプロットする](http://abrakatabura.hatenablog.com/entry/2016/10/29/075535)
- [Julia言語で任意の点を散布図を描画するには](http://abrakatabura.hatenablog.com/entry/2016/11/12/081354)
- [Windows(MSVC)でmrubyからGPU対応のTensorflowを動かせた](http://abrakatabura.hatenablog.com/entry/2017/01/28/125353)
- [Juliaでaobenchを使って並列処理を試した　その1](http://abrakatabura.hatenablog.com/entry/2017/05/03/091752)
- [JuliaでYoutuberを目指す](http://abrakatabura.hatenablog.com/entry/2017/12/14/221520)
- [陰関数の仮想3D空間へのプロットあるいは、ラズパイ版マインクラフトにたけのこの里を出す](https://abrakatabura.hatenablog.com/entry/2018/04/21/080947)
enforceIDEチュートリアル（１）

# enforceIDEはじめてみませんか

CoffeeScriptでWebゲームを作成する「enforceIDE」の初め方を書いていきます。
まずは「アカウント作成〜新規プロジェクトを作ろう編」です。

# アカウント作成

アカウントの作成では、メールアドレスを使用して登録する方法と、Twitterアカウントで登録する方法があります。

[enforceIDE](https://www.prominence.tv/enforceide/)にアクセスすると下記画面になります。

<img width="1440" alt="スクリーンショット 2016-05-02 17.12.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/53543/a677bf74-e5be-f352-5247-068bb01e6022.png">

Twitterアカウントで登録するには、Twitterアイコンのボタンをクリックしてください。使用するアカウントで認証を行うことで、自動的にアカウントが作成されログイン状態になります。アカウント名はTwitterのスクリーンネームが使用されます。

メールアドレスで登録するには「新規登録」ボタンをクリックします。
すると下記画面になります。

![スクリーンショット 2016-02-28 18.04.19.png](https://qiita-image-store.s3.amazonaws.com/0/53543/9bfe6013-fc03-9b9b-233e-42c2fc4cd03c.png)

ここで、enforceIDEで使用するアカウント登録申請を行います。
アカウント名とメールが受信出来る有効なメールアドレスを入力し「OK」をクリックすると下記画面になります。

![スクリーンショット 2016-02-28 18.04.46.png](https://qiita-image-store.s3.amazonaws.com/0/53543/71f7f2a5-a3d6-e84a-7195-aa4152a18fed.png)

すると下記のようなメールが届きます。

<img width="974" alt="スクリーンショット 2016-02-28 18.04.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/53543/a6f1f9db-622e-8330-47d6-63fe127a1d3b.png">

このリンクはワンタイムトークンを含んでいるので、一回使用してしまうと使えなくなります。
このリンクをクリックすると下記画面になります。

![スクリーンショット 2016-02-28 18.05.06.png](https://qiita-image-store.s3.amazonaws.com/0/53543/9bfc9195-e6bc-db2e-1864-c75627b78703.png)

パスワードを入力し「登録」をするとアカウント登録は完了し下記画面になります。

![スクリーンショット 2016-02-28 18.05.20.png](https://qiita-image-store.s3.amazonaws.com/0/53543/19fbba7f-ad6e-0a3b-5863-d8cfe5b3c66d.png)

「ログイン画面へ行く」をクリックするとenforceIDEトップ画面に戻ります。

<img width="1494" alt="enforce_screen02.png" src="https://qiita-image-store.s3.amazonaws.com/0/53543/bedc2b9c-c03a-99bb-6436-21b5b0ab194d.png">

ここで登録に使用したメールアドレスとパスワードを入力し、「OK」をクリックしログインに成功すると下記画面になります。

<img width="1494" alt="enforce_screen03.png" src="https://qiita-image-store.s3.amazonaws.com/0/53543/6511980b-b0db-a9d9-7b38-dc9b377bd457.png">

殺風景な画面ですが、ここでプロジェクトを管理していきます。

# 新規プロジェクト作成

それではプロジェクトを作ってみます。
上の「enforceIDE」というロゴの右にアイコンが2つあると思います。
この2つのアイコンの右側をクリックしてください。
すると下記のような画面になると思います。

![スクリーンショット 2016-02-28 18.05.55.png](https://qiita-image-store.s3.amazonaws.com/0/53543/278e3a45-5ecd-6a45-901d-a69a18873427.png)

プロジェクト名「hoge」で作成してみます。
パスワードはログインパスワードと同じものを入力します。

![スクリーンショット 2016-02-28 18.06.05.png](https://qiita-image-store.s3.amazonaws.com/0/53543/cff6d124-19b5-8515-8667-b12975fc9f81.png)

プロジェクト名とパスワードを入力し「OK」をクリックするとプロジェクト作成が開始します。

<img width="1494" alt="enforce_screen04.png" src="https://qiita-image-store.s3.amazonaws.com/0/53543/62a35827-d9a8-bc72-de2f-d656a9158d3a.png">

しばらく待つとプロジェクトの作成が完了して下記画面になります。

![スクリーンショット 2016-02-28 18.07.17.png](https://qiita-image-store.s3.amazonaws.com/0/53543/a2a88bff-6a8f-941e-9182-45879f60e2e7.png)

「OK」をクリックすると下記画面になります。

<img width="1494" alt="enforce_screen05.png" src="https://qiita-image-store.s3.amazonaws.com/0/53543/27361581-0b79-87a4-741b-d22e7b19deda.png">

「hogeプロジェクト」が出来ています。
このプロジェクトを編集していくことでゲームを作成します。
MacのDocker上で動くMongoDBのデータを永続化するの大変そう

MacのDocker上で動かしたMongoDBのデータを保存しておきたいと思い、Data Volumeを使って永続化を試みましたが失敗しました。
具体的には以下の手順で/data/db以下をホストのMacのフォルダにし、データベースの中身をコンテナから切り離し、データの永続化をしようとしましたが、エラーが発生しました。

`docker run --name mongo-test -v  ~/workspace/mongo:/data/db -d mongo:tag
`

エラーメッセージ

```
2016-02-28T14:32:16.694+0000 I CONTROL  [initandlisten] MongoDB starting : pid=1 port=27017 dbpath=/data/db 64-bit host=123456789
2016-02-28T14:32:16.694+0000 I CONTROL  [initandlisten] db version v3.2.3
2016-02-28T14:32:16.694+0000 I CONTROL  [initandlisten] git version: 123456
2016-02-28T14:32:16.694+0000 I CONTROL  [initandlisten] OpenSSL version: OpenSSL 1.0.1e 11 Feb 2013
2016-02-28T14:32:16.694+0000 I CONTROL  [initandlisten] allocator: tcmalloc
2016-02-28T14:32:16.694+0000 I CONTROL  [initandlisten] modules: none
2016-02-28T14:32:16.694+0000 I CONTROL  [initandlisten] build environment:
2016-02-28T14:32:16.694+0000 I CONTROL  [initandlisten]     distmod: debian71
2016-02-28T14:32:16.694+0000 I CONTROL  [initandlisten]     distarch: x86_64
2016-02-28T14:32:16.694+0000 I CONTROL  [initandlisten]     target_arch: x86_64
2016-02-28T14:32:16.694+0000 I CONTROL  [initandlisten] options: {}
2016-02-28T14:32:16.699+0000 I STORAGE  [initandlisten] exception in initAndListen: 98 Unable to create/open lock file: /data/db/mongod.lock errno:13 Permission denied Is a mongod instance already running?, terminating
2016-02-28T14:32:16.699+0000 I CONTROL  [initandlisten] dbexit:  rc: 100
```

公式のイメージに手を加えていないですし、一個しか動いていないのにすでに使用中というメッセージが出ます。

調べたところ、MongoDBはVirtualBoxの共有フォルダはサポートしていないようです。MacのDockerはVirtualboxで動かしているため、この問題に引っかかっているらしく、解決はできなさそうです…
https://docs.mongodb.org/manual/administration/production-notes/#fsync-on-directories

そのため、MacのDocker上で動くMongoDBのデータを永続化するにはData Volumeは使えず、別の手段を取る必要があるようです。どうするのがいいのかは現在調査中です…
macOS の .DS_Store を一括削除する

macOS で開発している（ドットファイルを表示している）人であれば、誰しもが削除しては復活する `.DS_Store` をどうにかしたいと思ったことがあるはず。

Finder の設定などを格納する一時ファイルなので、作らない設定にすると Finder の振る舞いがおかしくなったりするなんていうウワサもある。しかし、間違って `git` 管理下に追加してしまったりなどオペレーション上のミスを招くこともゼロではない。

## ワンライナーで削除

そんな忌まわしき `.DS_Store` を一括で削除コマンドがこちら。またすぐ復活するけど。

```bash
$ find . -name '.DS_Store' -type f -ls -delete
```

`alias dsstore="find . -name '*.DS_Store' -type f -ls -delete"` のように、エイリアスを `.bashrc` なり `.zshrc` なりに書いておくと `dsstore` コマンドで使えるようになる。

## dsstore モジュール

なんとなく [Node.js のモジュール](https://www.npmjs.com/package/dsstore-cli)を作ってみた。 `npm install -g dsstore-cli` すれば同じく `dsstore` コマンドがパスに追加される。`find` コマンドによる削除より実行時の見た目が改善されているが、ただそれだけ。

```bash
$ npm install -g dsstore-cli
$ dsstore --help
```
Safe Navigation Operator で呼ばれるメソッドの引数はレシーバが nil なら評価されない

タイトルの通りです。

[Safe Navigation Operator に関するコミット](https://github.com/ruby/ruby/commit/a356fe1c3550892902103f66928426ac8279e072) を追いかけていると、ドキュメント中に[興味深い一文](https://github.com/ruby/ruby/blob/8f8f92b508e48fe16c584cea9a8b819d72118342/doc/syntax/calling_methods.rdoc#receiver)が見つかりました。

>You may use &. to designate a receiver, then my_method is not invoked and the result is nil when the receiver is nil. In that case, the arguments of my_method are not evaluated.

これは例えば `obj&.my_method(arg)` というメソッド呼び出しを行った時、 `obj` が `nil` だったら `my_method` への引数である `arg` は評価されない、ということです。

## 試してみる

早速試してみました。

### オブジェクトに対して正しくメソッドを呼び出せたとき

```rb:safe1.rb
class Foo
  def my_method(s)
    "Foo#my_method is called with \"#{s}\""
  end
end

def arg
  puts "arg is evaluated"
  "m"
end

obj = Foo.new
puts obj&.my_method(arg)
```

```
$ ruby safe1.rb
arg is evaluated
Foo#my_method is called with "m"
```

`obj.my_method` の結果が出力される前に、`arg` が評価されていることがわかります。
何の違和感もありません。

### レシーバのオブジェクトにメソッドが存在しなかったとき

```rb:safe2.rb
class Foo
end

def arg
  puts "arg is evaluated"
  "m"
end

obj = Foo.new
puts obj&.my_method(arg)
```

```
$ ruby safe2.rb
arg is evaluated
safe.rb:10:in `<main>': undefined method `my_method' for #<Foo:0x007fe859807020> (NoMethodError)
Did you mean?  method
```

`NoMethodError` が発生する前に `arg` が評価されていることがわかります。
これも特に違和感のない挙動です。

### レシーバが `nil` だったとき

そしていよいよドキュメントに記載されているケースです。

```rb:safe3.rb
def arg
  puts "arg is evaluated"
  "m"
end

obj = nil
puts obj&.my_method(arg)
```

```
$ ruby safe3.rb

```

`puts` に `nil` が渡されることで空行を出力しますが、`arg` は評価されていないことがわかります。

## どういうときにうれしいか

これはやはり引数の評価に時間がかかるような場合、不要な評価を行わない分だけ実行時間を節約できます。

```
foo&.bar(some_heavy_computation_result)
```

この `some_heavy_computation_result` は何か重い処理を行うメソッドだったとして、`foo` が `nil` なら不要であるところのその呼び出しを省略してくれます。
[`ActiveSupport` の `Object#try!` に比べて高速](http://qiita.com/yuya_takeyama/items/af76283ef625826eab96)、という記事も書きましたが、これは通常のライブラリでは実現できない最適化です。
逆に言うとレシーバが `nil` であろうと引数が評価されることを期待していると、そのようには動かないので注意が必要です。
5日目 => デザインパターン（リビーリングモジュールパターン）

# はじめに
デザインパターン３つ目。

# 説明
## リビーリングモジュールパターン
全ての関数と変数をプライベートスコープ内で定義。
パブリックメンバとして公開したいプライベートメンバのポインタを持つ無名オブジェクトを返却。

```js
var module1 = function(){
  var secretName = "HANAKO",
      name = "hanako";

  function displayName(){
    console.log("Name: " + secretName);
  }

  function publicSetName(newName){
    secretName = newName;
  }

  function publicGetName(){
    displayName();
  }

  return {
    setName: publicSetName,
    getName: publicGetName,  
  };
}();
```

どの関数や変数をパブリックにするか、指定しやすくなる。

# おわりに
短かった。

# 参考
* JavaScriptデザインパターン
BitFlyer Ligntning APIをPythonで使ってみる

#経緯
BitFlyer Lightningで取引を始めたので，ついでにAPIを触ろうと思った．

#APIドキュメント
APIの仕様は
[API Documentation](https://lightning.bitflyer.jp/docs)

テストは
[API Playground](https://lightning.bitflyer.jp/docs/playground)


#使ってみる

BitFlyer LightningのAPIメニューからkeyとsecretは入手できる．
requestsを使用して使ってみる．

```python
#!/usr/bin/env python
# -*- coding:utf-8 -*-

import json
import requests
import time
import hmac
import hashlib

api_key = 'key'
api_secret = 'secret'
api_endpoint = 'https://api.bitflyer.jp'


def get_api_call(path):
    method = 'GET'
    timestamp = str(time.time())
    text = timestamp + method + path
    sign = hmac.new(api_secret, text, hashlib.sha256).hexdigest()
    request_data=requests.get(
        api_endpoint+path
        ,headers = {
            'ACCESS-KEY': api_key,
            'ACCESS-TIMESTAMP': timestamp,
            'ACCESS-SIGN': sign,
            'Content-Type': 'application/json'
        })
    return request_data


def post_api_call(path,body):
    body = json.dumps(body)
    method = 'POST'
    timestamp = str(time.time())
    text = timestamp + method + path + body
    sign = hmac.new(api_secret, text, hashlib.sha256).hexdigest()
    request_data=requests.post(
        api_endpoint+path
        ,data= body
        ,headers = {
            'ACCESS-KEY': api_key,
            'ACCESS-TIMESTAMP': timestamp,
            'ACCESS-SIGN': sign,
            'Content-Type': 'application/json'
        })
    return request_data

path = '/v1/gethealth'
status = get_api_call(path).json()['status']

print status

```

GETのクエリなんかはpathに連結させるなり引数に加えるなりしてください．
POSTのbodyはディクショナリオブジェクトでどうぞ．
実行すると，BitFlyer Lightningの状態が取得できます．
だいたいNORMALが返ってくる．
APIのレスポンスはJSONで返ってきますが、ステータスのみ返ってくるAPIもあります．
PubNubを利用したStreamingもできるみたい．
UnityでiOS向けにビルドした時に自動でXcodeが起動しなくなった時の対処法

自分用メモ

まずはこれを試す
http://qiita.com/sea_mountain/items/6664725e59a88e4aa9c0
ダメならこれ
http://qiita.com/krimpedance/items/cd4a58b4fdebbdde1fb9
Android Studioで Gradle DSL method not found: 'compile()'が起きた

Android Studioでビルドしようとしたら、こんなエラーが

``` 
Error:(47, 0) Gradle DSL method not found: 'compile()'
Possible causes:<ul><li>The project 'XXXXXXX' may be using a version of Gradle that does not contain the method.
<a href="openGradleSettings">Gradle settings</a></li><li>The build file may be missing a Gradle plugin.
<a href="apply.gradle.plugin">Apply Gradle plugin</a></li>
```

``` build.gradle
dependencies {
...
    compile "com.android.support:support-v4:${SUPPORT_LIB_VER}"    compile "com.android.support:appcompat-v7:${SUPPORT_LIB_VER}"
    compile "com.android.support:support-annotations:${SUPPORT_LIB_VER}"
    compile "com.android.support:design:${SUPPORT_LIB_VER}"
...
}
```

改行がなくなってて、２行が一行になってた。
１０分くらい気づかなかった…
Visual Studio 2015でNode.js開発環境を作る

Visual Studio 2015でNode.jsアプリケーションの開発環境をさっと構築します。
[Node.js Tools for Visual Studio 2015](https://www.visualstudio.com/ja-jp/features/node-js-vs.aspx)を使います。

# 前提
1. Visual Studio 2015がインストールされている。
2. Node.jsがインストールされていてPATHが通っている。

# 「Node.js Tools for Visual Studio 2015」のインストール
[ツール]→[拡張機能と更新プログラム]から、「Node.js Tools」とオンライン検索して、ダウンロードします。投稿時点の最新版は1.1です。
![20160228-202242_0.JPG](https://qiita-image-store.s3.amazonaws.com/0/94706/e9ab7797-6773-7a83-849b-ad710bbe8a82.jpeg)
一旦Visual Studioを閉じてから、インストーラを実行します。

# Node.jsプロジェクトの作成
インストールが完了したら再度Visual Studioを立ち上げます。
[ファイル]→[新規作成]→[プロジェクト]にて、インストール済みテンプレート内に「Node.js」が追加されます。
Express用のテンプレートもありますが、ここではコンソールアプリケーションを作成してみます。
![20160228-202650_0.JPG](https://qiita-image-store.s3.amazonaws.com/0/94706/374b18b8-245c-5278-d232-53e27faf1d60.jpeg)
コンソールアプリケーションではこんなプロジェクト構成になります。
app.jsがデフォルトエントリになってます。設定はpackage.jsonで行います。
![20160228-203029_0.JPG](https://qiita-image-store.s3.amazonaws.com/0/94706/b7950115-867a-eeeb-f59d-7eaa1ad82843.jpeg)
フォルダ構成的はこんな感じです。
.njsprojがプロジェクトテンプレートの拡張子となります。
![20160228-211346_0.JPG](https://qiita-image-store.s3.amazonaws.com/0/94706/9f33531a-9f58-3240-3cc5-8835dc29ebd6.jpeg)

# 実行してみる
試しにF5キーを押して、実行してみましょう。Hello worldと表示されます。
![20160228-202811_0.JPG](https://qiita-image-store.s3.amazonaws.com/0/94706/224c6853-100e-b5c6-a0c0-0430a07b4f9a.jpeg)

```js:app.js
console.log('Hello world');
```

# コーディングしてみる
Node.jsのprocessグローバルオブジェクトで標準入力を受けて、値を表示させてみます。

```js:app.js
process.stdin.resume();
process.stdin.setEncoding('utf8');
process.stdin.on('data', function (chunk) {
	var a = chunk.trim();
	console.log(a + ' * ' + a + ' = ' + a*a);
});
```

インテリセンスもバッチリ効きます。
![20160228-214116_0.JPG](https://qiita-image-store.s3.amazonaws.com/0/94706/a79c8b02-99cd-e06b-5489-0d118076ef97.jpeg)

# デバッグしてみる
ブレークポイントの設定や変数の参照・更新もできます。
![20160228-223302_0.JPG](https://qiita-image-store.s3.amazonaws.com/0/94706/e34d68db-56a7-fb55-6f49-c9c7ca0ce41c.jpeg)
kubernetes: pod(コンテナ)のディスク(volume)とパス(path)の指定方法

コンテナを起動する際、dockerの場合はdocker runコマンドのオプションで色々指定できるが、kubernetesの場合は、pod（またはreplication controller）作成時に指定するyaml/jsonで規定する。

kubernetesでコンテナ（pod）を作成する際の、データの格納場所（volume）を指定する方法を記載する。
コンテナ(Pod)が死んでしまうと、データが消滅してしまうので、Volumeに格納しておく事で、状態を維持できる。
タイプは様々提供されている。

•emptyDir
•hostPath
•gcePersistentDisk
•awsElasticBlockStore
ほか

emptyDirは、Pod単位の仮想ボリュームで、Podがdeleteされると同時にデータも削除される。
hostPathは、ホストサーバ上のDiskにマウントする方式。ホストサーバ上のデータにアクセスしたい場合等に利用。
gcePersistentDiskは、Google Compute Engine (GCE) Persistent Disk をマウントする用。
awsElasticBlockStoreは、Amazon Web Services (AWS) EBS Volume をマウントする用。

Podに紐づけずデータを保持したい場合はhostPath等を指定する。


Pod yaml (EmptyDir) 例）

```
apiVersion: v1
kind: ReplicationController
metadata:
  name: redis
spec:
  template:
    metadata:
      labels:
        app: redis
        tier: backend
    spec:
      # Provision a fresh volume for the pod
      volumes:
        - name: data
          emptyDir: {}
      containers:
      - name: redis
        image: kubernetes/redis:v1
        ports:
        - containerPort: 6379
        # Mount the volume into the pod
        volumeMounts:
        - mountPath: /redis-master-data
          name: data   # must match the name of the volume, above
```

specの中にvolume:でタイプと名称を指定する。さらにcontainers:volumeMounts:で実際のPathを指定する。

参考
http://kubernetes.io/v1.1/docs/user-guide/volumes.html

http://kubernetes.io/v1.1/docs/user-guide/production-pods.html
業務で見たクソコード・クソ設計

業務で見た「クソコードor設計」をまとめます。
 
# Database関係のクソ設計/クソコード

### テーブルに主キー制約がない

たとえばこんなテーブル。

```sql
CREATE TABLE user (
  id bigint NOT NULL,
  subid bigint NOT NULL,
  name character varying(50)
);
```

`id`と`subid`の複合主キーのように見えますが、主キー制約(`PRIMARY KEY`)がないので、主キーは分かりません。
主キーを調べるには、テーブルの中身を確認する必要があります。


### 1つの列に複数の情報を格納している
たとえばこんなテーブル

```sql
CREATE TABLE CAR (
  id bigint NOT NULL,
  type character(6) NOT NULL, /* [分類Aのコード][分類Bのコード]*/
  CONSTRAINT car_pkey PRIMARY KEY (id)
);
/** 分類1コード: A00, 分類2コード: B00 */
```

「分類Aが`XXX` AND 分類Bが`YYY`」の条件で絞り込むには、下記のWHERE句を使います。
`WHERE type = `XXXYYY`

分類Aと分類Bをパラメータで受け取る場合は、下記のWHERE句を使います（#～#が変数）。
`WHERE type = #type1Code# || #type2Code#`


このテーブルでの問題点は、以下の通りです。

* 分類1コードのみでLIKE文を使いたいとき、文字列処理が必要。
* 「分類1コードは昇順、分類2コードは降順」でのソートがめんどくさい。


はい、不便ですね。
なんでこのDB設計にしたのだろう。。。


# Javaのクソ設計/クソコード(システムB)

### クラス名が`A001`など、分かりやすい名前でなくコード値

クラス名からは何の機能かさっぱり分かりません。
じゃあどやって探すのかというと、クラス名の一覧が書かれたExcelファイルがあるので、そこから探していきます。

### SQLで簡単に実現できることをJavaで書いている
SELECT文では単純に絞り込むだけで、Javaの方でループしていろいろ処理しています。
「ある分類ごとに合計値や比率を出す」みたいなちょっと複雑な処理になると、Javaで書いてしまっている。
partion by/OVER句やwindow関数を使えば、全部SQLで書けるのに...

# CSSのクソ設計/クソコード

### ヘッダなど共通コンポーネントなどのスタイルが、各画面専用のCSSに定義してある
こんな感じで、1つのHTMLに対して１つのCSSを作っています。

```html:register.html
<link rel="stylesheet" href="register.css">
```

で、register.cssにヘッダやフッター、ナビゲーションバーなどのスタイルが定義してある状態。
で、こんなCSSが200個ほどある状態。。。

ヘッダのスタイルを変えたいとき、100個のファイルを修正する必要がある。。。


### 例外の握り潰し

あえて言うまでもないでしょう。せめてログにエラーの内容を出力してくれればよかったのに。。。



# HTML関係

### 「〇」などの全角記号を画像で表示
英語化対応のためだそうですが。。。
HTMLの文字コードはShift_JIS。UTF-8にする、もしくはHTML参照文字を使えばよかったのでは。。。

# Servlet/JSP関係

### requestスコープを使わずに、sessionスコープにたくさんの情報を設定する
たぶんrequestスコープを知らなかったんでしょうね。
そして厄介なのは、設定する情報は別物なのに、同じキーを使っていること。
全然関係ない機能の副作用で、`(cast)getAttribute(key)`したときに、「キャストできない」というエラーが発生してしまいます。

せめてキーを変えるか、使い終わった後に`removeattribute`してくれればよかったんですが。

# まとめ

書いてみて思ったこと。
私の思うクソ設計/クソコードは、
「言語の基礎を理解していないような、設計/コード」
です。

「1つの列に複数の情報を格納する」の話も、データベースの基礎を知っていれば、上記のような設計/コードにはならないと思います。
というわけで、基礎を学びましょう。

# 参考図書
[SQLアンチパターン Bill Karwin著 オライリージャパン](http://www.amazon.co.jp/SQL%E3%82%A2%E3%83%B3%E3%83%81%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3-Bill-Karwin/dp/4873115892)
vimでよく使うショートカット一覧


- 先頭行の頭にジャンプ
  - gg
- 最終行の末尾にジャンプ
  - G
- 直前の操作を繰り返す
  - .
- 直前の操作を取り消す
  - u
- 取り消した操作を遡って再実行
  - R
- 挿入
  - i	指定文字の直前に挿入
  - a   指定文字の直後に挿入
  - I   指定文字のある行の先頭に挿入
  - A   指定文字のある行の最後に挿入
  - o  カーソルの後行から文字入力開始
  - O  カーソルの前行から文字入力開始
・dG
    カーソルから後(最終行まで)を削除
・dgg
    カーソルから前(最初行まで)を削除
- 削除
  - x   1文字を削除
  - dd 	指定行を削除
  - d5d	指定行から数えて5行を削除
  - dG  カーソル位置から最終行まで削除
  - dgg カーソル位置から最初行まで削除
  - :g/文字列/d 指定した文字列を含む行を削除
  - :g/^文字列/d 指定した文字列から始まる行を削除
  - :v/文字列/d 指定した文字列を含む行以外を削除
  - vi"  ダブルクォーテーション内の文字列を削除
  - vi'  シングルクォーテーション内の文字列を削除
Qiita初心者の投稿方法備忘録

#概要
Qiitaというサービスを意識し始めたのが(2016年2月現在で)ここ半年くらいと
なかなかの情弱っぷりを曝け出しているので
開き直ってQiitaの投稿方法を備忘録として書きながら
Qiitaの勉強を始めてしまおうという次第であります。

初投稿：2016/02/28
2016/02/29：「Emphasis - 強調」追記、参考資料のリンク先を別窓に変更。
2017/03/15：コードの挿入に「言語名：ファイル名」を追記

#参考資料
<a href="http://qiita.com/Qiita/items/c686397e4a0f4f11683d" target="_blank">Markdown記法 チートシート</a>

#記述方法
##Headers - 見出し
上記の「概要」とか「参考資料」とか「Headers - 見出し」とかの書き方。
「#」1個でH1タグ、6個でH6タグ。
######H6タグの例

```
######H6タグの例
```

##Links - リンク
http://cloversoft.jp/
[タイトル付きで](http://cloversoft.jp/)
<a href="http://cloversoft.jp/" target="_blank">別窓で</a>

```
http://cloversoft.jp/
[タイトル付きで](http://cloversoft.jp/)
<a href="http://cloversoft.jp/" target="_blank">別窓で</a>
```

##Code - コードの挿入

```Javascript:fileName.js
'↑「言語名：ファイル名」と書いとくと言語に合わせて色を変えてくれるみたい。'
'Bash, C#(cs), C++(cpp), CSS, Diff, HTML, XML, Ini, Java, Javascript, PHP, Perl, Python, Ruby, SQL, 1C, AVR Assembler(avrasm), Apache, Axapta, CMake, DOS .bat(dos), Delphi, Django, Erlang, Erlang, REPL, Go, Haskell, Lisp, Lua, MEL, Nginx, Objective C(objectivec), Parser3, Python, profile, Scala, Smalltalk, TeX, VBScript, VHDL, Vala'
'ここだけソースがコードになってないけどごめんね(;´･ω･)'
'バッククオート(`)はSHIFT押しながら「@」キーを押す。'
'※キーボードによって違うので参考まで'
```

>(空行)
>```` ```Javascript:fileName.js
>'↑「言語名：ファイル名」と書いとくと言語に合わせて色を変えてくれるみたい。'
>'Bash, C#(cs), C++(cpp), CSS, Diff, HTML, XML, Ini, Java, Javascript, PHP, Perl, Python, Ruby, SQL, 1C, AVR Assembler(avrasm), Apache, Axapta, CMake, DOS .bat(dos), Delphi, Django, Erlang, Erlang, REPL, Go, Haskell, Lisp, Lua, MEL, Nginx, Objective C(objectivec), Parser3, Python, profile, Scala, Smalltalk, TeX, VBScript, VHDL, Vala'
>'ここだけソースがコードになってないけどごめんね(;´･ω･)'
>'バッククオート(`)はSHIFT押しながら「@」キーを押す。'
>'※キーボードによって違うので参考まで'
>```` ```
>(空行)

##Blockquotes - 引用

>「Code - コードの挿入」で使ったからこれも書いとかなきゃ(;´･ω･)
>こっちはソースがコードになってる方ね(;´･ω･)

```
>「Code - コードの挿入」で使ったからこれも書いとかなきゃ(;´･ω･)
>こっちはソースがコードになってる方ね(;´･ω･)
```

##Emphasis - 強調
「＊」か「＿」1個で*イタリック(斜体)*。2個で__太字__。

```
「＊」か「＿」1個で*イタリック(斜体)*。2個で__太字__。
```

#あとがき
とりあえずこれだけあればそれなりの投稿ができそうなので
あとは必要に応じて追加していけばいいかな？なんて。

普通は「書き方→結果」というのが一般的なんだろうけど
ずらーっとコード見た後に望んでいた結果じゃなかった時の虚脱感を
味わわせるのもなんなので深く考えずに投稿しました。

見づらかったら変えるかもしれないけど、面倒だからそのままにしそうな気も(;´･ω･)
OkHttpを使った時のプロガード設定

# OkHttpを使ったときのプロガードの設定

## OkHttp-3.0.1
-dontwarn okio.**
-dontwarn com.squareup.okhttp.**

-keep class com.squareup.okhttp.** { *; }
-keep interface com.squareup.okhttp.** { *; }

-keepattributes Signature
-keepattributes *Annotation*

## メモ
使った時は -keepattributes *Annotation* を入れなくても問題なく動いた。
他は記載していないと動かなかった。
ただ検索したところこれを記述しているところが多かったので安全のために記述。

SignatureはGenericなどの情報を残すParameterrizedTypeなどを使ったコードが含まれる場合に必要とのこと。
エンジア向けの勉強会とかイベントを探す

世間では、毎日のようにエンジア向けの勉強会とか、カンファレンスとかイベントとか開催されている。
身近に関係者とか、頻繁に参加している知り合いとかいれば情報が入ってくるかと思うけれども、そういった知り合いがない場合は、ネットで探すしかない。
自分の場合の探し方を書いてみる。

## イベント情報サイトを探す。

* [Dots. イベントカレンダー](http://eventdots.jp/calendar)
* [AZusaar!!](http://azusaar.appspot.com/)
* [upmeetup.info](http://upmeetup.info/)

Dotsが一番探しやすくて見やすいかも。Dots自身が主催しているイベント出てくる。メールでお勧めイベントもあり。
AZusaar!!は、ちょっと量が多すぎて探すのが大変かも、隅々まで漏れなく探したい人向き。
upmeetup.infoは参加者数が多いとか勢いのあるイベントを見つけることができる。

参考：
http://qiita.com/kobaboy/items/6c80511a10122aa87d02

## イベント開催支援サイトを探す

直に、イベント開催支援サイトを探す。

* [connpass](http://connpass.com/)
* [connpassのIT勉強カレンダー](http://connpass.com/calendar/)
* [atnd](https://atnd.org/)
* [doorkeeper](https://manage.doorkeeper.jp/)
* [peatix](http://peatix.com/)


さすがに一軒一軒探すのは大変。
一度参加したイベントやグループに入っていたりすると、次回のイベント時に通知が来るのでこれが便利。
特にconnpassがTwitterをフォローした人が参加したイベントが通知されるので、これが便利。
これで気づいて参加するイベントが多いかも。
興味あるカテゴリのイベントを主宰する人、またそういったイベントによく参加する人をフォローしていると良いかも。

## イベントを開催している所の情報を見る

イベントを開催している箇所に掲載があるのでそこで探す。

* [Yahoo LODGEイベントカレンダー](https://lodge.yahoo.co.jp/event_pc.html)
* [21cafe 開催イベント一覧](https://geechs-magazine.com/21cafe/event)
* [ヒカラボ 開催予定イベント](https://career.levtech.jp/hikalab/)


## SNSとかブログサイトをひたすら見る。
　Twitterとかはてぶとかをひたすら見る。運が良ければ気になるイベントの通知やら情報が入るかも。これで気づく率は低いが、人気急上昇なイベントはこれで見つかる場合あり。


## コミュニティ経由で知る
Facebookグループに入る、Googleグループに入る。メーリングリストに参加する、Slackのグループに参加など。

## 企業や、メディアのメールで知る。
過去にイベントに参加した会社の通知、転職サービス、技術系メディアの告知で知る。

## イベントを登録する。
* イベントサイトに登録する。
* 大抵のイベントサイトにGoogleカレンダー追加機能やICSファイル機能があるので、一旦Googleカレンダーでまとめて管理する。
* 参加費の有無、参加時間帯、場所に問題ないかチェック。
* 参加人数の１５０％オーバーだったとしても、無料イベントだと当日キャンセルが結構出てくるので
諦めず登録する。
* 直前に繰り上がりで参加可になることが良くあるので、当日はこまめにチェック。
* 都合が合わなくなったら早めにキャンセル。
* 名刺必須となっていても、台帳に記入や連絡先が伝えればOKの場合が多い。
* アンケートとか書くことがあるのでペンは持っておく。
* イベントの内容や参加条件、他の参加者をチェックする。イベントの内容によってはものすごく自分が場違いな感を感じることがあるので、小心者な自分はチェック。connpassとかだとそんな心配は少ないけれど、他のサイトとかは企業主宰の特定の人向けのセミナーとかあったりと。

## 開催場所を調べる。
初めて行く場所などは、どこにあるか、どのくらい着くのにかかるか調べておく。
GoogleMapのURLや会場のサイトをメモっておく。

よくイベントを開催している場所、会社は次のようなものがある。

### イベント＆コミュニティスペース dots.
https://eventdots.jp/space
イベント情報検索サービスをやっているだけあって、ここでもよくイベントが開催されている。
渋谷駅から近くて比較的行きやすい。
会場の8Fまで直接行くことが出来る。比較的入退室しやすい会場だけど、途中退室等はイベント毎に確認すること。250名も入れるスペースで結構広い。

### 21cafe＜ニイイチカフェ＞
https://geechs-magazine.com/21cafe/access
エンジニア＆デザイナーのための無料イベントスペース。
50名前後ぐらいのイベントが時々開催されている。
道玄坂沿いに場所が移ってた。ここも渋谷駅から近い。

### 渋谷ヒカリエ
http://www.hikarie.jp/access/index.html
渋谷駅に直結しているので、行きやすい。
ここに入居している企業のイベントが結構ある。
特に、レバレジーズ主催の[ヒカラボ](https://career.levtech.jp/hikalab/about/)のイベントが多い。他にもDeNAやLineが開催している。
１１Fにオフィスエントランスがあって、そこでイベントの受付が行われている。受付しないとオフィス階には行けないので遅刻しないこと。退出の際は、守衛さんにどこ主催勉強会の帰りか伝えてゲートを開けてもらう。ヒカラボですとかで通じる。

### その他
六本木ヒルズとか東京ミッドタウンとか入退室管理が厳しいところも多いので、事前に調べて、遅刻しないようにする。


## その他
　その他やることは何だろうか。
　ブログに参加レポートを書くとか、懇親会で親睦を深めるとか、LTで発表するとか自分は全然出来ていない。。
Kotlin&jUnit4でユニットテストを動かす


### build.gradle
* Kotlinでも特別な設定はなし。


```
    defaultConfig {
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }


dependencies {
    testCompile 'junit:junit:4.12'
    androidTestCompile 'com.android.support.test:testing-support-lib:0.1'
}

```

### AndroidTest

```
@RunWith(AndroidJUnit4::class)
class MainActivityTest : AndroidTestCase() {

    override fun setUp() {
        super.setUp()
    }

    override fun tearDown() {
        super.tearDown()
    }

    @Test
    fun hoge() {
        Assert.assertEquals("hoge", "hoge")
    }
}
```

### JavaTest

```
class JavaTest {

    @Before
    fun setUp() {

    }

    @After
    fun tearDown() {

    }

    @Test
    fun hoge() {
        Assert.assertEquals("hoge", "hoge")
    }
}
```

* [サンプルプロジェクトはこちら](https://github.com/jnikd/KotlinUnitTest)
XcodeでC言語　ファイル読み込み編

C言語の解説本を見ると、ほとんどがWindowsのVisialStduioでの演習がほとんど。Macユーザーにとってみれば困りもの、gccを使えばいいのだが入力が少し大変、そこでXcodeでC言語をやってみた。

OS Xを選択してC Fileを選ぶ。
![スクリーンショット 2016-02-28 20.22.23.png](https://qiita-image-store.s3.amazonaws.com/0/112699/491c995a-b4c9-ce24-0217-97ff56e029e2.png)
プロジェクトを作成した後、あらかじめテキストファイル(datalist.txt)を作成しAdd to files to "プロジェクト名"を選択
![スクリーンショット 2016-02-28 20.29.41.png](https://qiita-image-store.s3.amazonaws.com/0/112699/31e67635-7dba-5528-54a7-e75e0fc4a707.png)
追加した後
![スクリーンショット 2016-02-28 20.24.55.png](https://qiita-image-store.s3.amazonaws.com/0/112699/26f7af41-3bee-b98c-613a-1862e9755e35.png)

```c:main.c
#include <stdio.h>
#include <stdlib.h>

int main(int argc, const char * argv[])
{
    FILE *fp;
    char s[256];
    
    if ((fp = fopen("/Users/ユーザー名/Desktop/プロジェクト名/datalist.txt", "r")) == NULL) {
        printf("file open error!!\n");
        exit(EXIT_FAILURE);
    }
    while (fgets(s, 256, fp) != NULL) {
        printf("%s", s);
    }
    fclose(fp);	
    return 0;
}
```
Ubuntu 14.04でbowerのインストールではまった

# Problem

Ubuntu 14.04にbowerをインストールしたが、コマンドを実行しても何もおこらなかった。

```
$ bower -version
# → 無反応
```

# Solution

以下のコマンドが必要だった

```
$ sudo apt-get install nodejs-legacy
```

```
$ bower -version
1.7.7
```

# 参考

- [Installing Bower on Ubuntu 14.04 LTS](http://www.codediesel.com/javascript/installing-bower-on-ubuntu-14-04-lts/)
Swift で インスタンス の クラス を知りたい時

# あるある

- これ何のクラスだっけ？って時は、結構何の言語触っててもあると思います。
- ~~タイトルについて、「インスタンスじゃなくてオブジェクトだろ！ハゲ！」って仰る方もいると思いますが、アイコンはハゲているので許してください、えっへへ〜~~

## Ruby だと

- [pry](https://github.com/pry/pry) とか使って自分は意識低くアレや、あのクラスやってやります
- 以下の場合は `tashiro` は `String` のインスタンスですね。
  - JavaScriptだと `typeOf`だったか、なんだかあった気がします（~~ブラウザのコンソールで一瞬試して上手く行かなくて調べるのやめた~~）

![tashiro-ruby.gif](https://qiita-image-store.s3.amazonaws.com/0/46303/2eea577e-39b1-e486-3ad8-2baf7fd7c8a7.gif)

# Swift だと

## 真面目にやる

- フツーに `print` デバッグですかね

```swift
var shimoyanagi = 42
print("下柳の背番号は \(shimoyanagi.dynamicType) 型")
// => "下柳の背番号は Int 型\n"
```

## ググるのがダルい

- [LLDB](http://lldb.llvm.org/lldb-gdb.html)で止めたら、見えたりします
- 下記の例だと `CGFloat` 型なんやな、ってことが分かりますね。

![swift-class-detect.gif](https://qiita-image-store.s3.amazonaws.com/0/46303/07d45fef-1527-8f06-ba25-246682c9ac7c.gif)


# もしかして: 

- PlayGround で `print` が一番速いんじゃないかな、と書きながら思いました、えっへへへへへ〜
  - ~~実際試したら「これが一番速いわ」って思いました~~

# See Also

[How do I print the type or class of a variable in Swift?](http://stackoverflow.com/questions/24006165/how-do-i-print-the-type-or-class-of-a-variable-in-swift)
sedだけでバックアップをとりつつ安全に上書き置換する

いまさらながらに知った驚愕の事実。知っている人にとっては当たり前なんだろう。

sedの-iオプションで置換結果をファイルに直接上書きできる。
たとえば、こう。

```
$ cat dummy.txt
1週間
１週間
一週間

$ sed -i -e 's/[1１一]週間/1週間/g' dummy.txt

$ cat dummy.txt
1週間
1週間
1週間
```

で、本チャンで上書きする前にはたいていバックアップとると思う。
実はこれ、cp打たなくともsedだけで簡潔しちゃいます。

```
$ sed -i.bak -e 's/[1１一]週間/1週間/g' dummy.txt

$ diff -u dummy.txt{.bak,}
--- dummy.txt.bak       2016-02-28 19:32:24.625114987 +0900
+++ dummy.txt   2016-02-28 19:34:32.087118497 +0900
@@ -1,3 +1,3 @@
 1週間
-１週間
-一週間
+1週間
+1週間
```

なんと、-iオプションに続いてバックアップファイルの接尾名を付けるだけ。
奥深し。
AD2 / ESP8266 > 3V3を測定してみた > 電圧ドロップ発見


```txt:動作確認
ESP-WROOM-02 (以下ESP8266)
Analog Discovery 2 (以下AD2)
```

AD2でESP-WROOM-02の3V3を測ってみた。
予定では3V近くの電圧が一定で出続けるのみのはずだったが。。。


## 接続

接続は以下の通り

- Scope ch1. Positive <-> ESP8266の3V3
- Scope ch1. Negative <-> ESP8266のGND

![DSC_0127.JPG](https://qiita-image-store.s3.amazonaws.com/0/32870/1c97138e-3e80-dfe5-c3a5-6a5df23418ff.jpeg)


## 結果

電圧のドロップが発生している。

今使用しているCR-123Aの電圧がだいたい2.8Vなのだが、時々2.6Vまで200mV近く落ちている。

処理としてはインターバル動作で何かをしているのではないので、普通の状態で落ちているようだ。
入れているソフトは Message Station.

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/4e5f2616-57b1-f0f8-ed03-a62de729cfd7.png)


使用電池は TrustFire という検索したらあまりよくなさそうな情報が出る電池ではあるが関係あるのかどうか。


## 三端子レギュレータでもドロップ

三端子レギュレータで単３乾電池3本(1.5V x 3)から3.3Vを出力した電源で確認してみた。
同様に電圧が落ちている (3.272V から 3.192V に時々落ちている)。

オシロを入手したことによりこういうことが分かるようになって良い。
しかし電圧が落ちるのは気になる。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/36eae510-e560-f2f8-1463-a5adb37433bb.png)

I2Cのキャラクタディスプレイを外しても同様にドロップが発生する。

- ドロップの時間: 1.08 msec
- Period: 102msec 程度

無負荷(ESP8266未接続）で三端子レギュレータの3.3Vを見ると電圧ドロップはない。

ESP8266が100msecごとに何かしていて、それにより電流が一気に流れて電圧が落ちているのだろうか？


## ガラスエポキシ基板でも同じ

ESP8266用に複数枚の実装をしたので、別の基板で試した。

上の結果は5代目（紙フェノール)。
http://qiita.com/7of9/items/b8426623d6349e119fea

2代目(ガラスエポキシ）でも試したが、同じように 100msec Periodの電圧ドロップが発生している。

AD2の使い方が間違っているのだろうか。


## なぜか発生しなくなった

触っているうちに現象が発生しなくなるという残念な結果となった。
DWRライブラリの気に入ってる点、不満な点


業務ではDWRというAjaxライブラリを使って、Java/JavaScript間の通信を行っています。
で、そのライブラリの気に入ってる点、不満な点をまとめました。

というかTeratailに質問した内容とほぼ同じです。
https://teratail.com/questions/27804
[DWR公式サイト](http://directwebremoting.org/dwr/index.html)


### DWRの気に入っている点
以下の点が便利なので、DWRを使っています。

* jQueryのようにGET/POST, timeout, URLなどを直接指定する必要がない。
[DWRのSample](http://directwebremoting.org/dwr/introduction/scripting-dwr.html)

```javascript
//DWR
function handleGetData(str) {
  alert(str);
}
Remote.getData(42, handleGetData);
```


* Java⇔JavaScriptの型変換を自動的に行ってくれる。
 - int
 - Collection
 - Mapなどなど
 
```java
//Personオブジェクトを引数に持つJavaメソッドに対して...
public class Remote {
  public void doSomethingWithPerson(Person p) {
    // Some Java code that does something with Person p.
  }
}
```

```java
public Person {
  private String name;
  private int age;
  private Date[] appointments;
  // getters and setters ...
}
```
```javascript
//以下のJavaScriptコードから自動的にPersonクラスのフィールドに設定してくれる
var myJSPerson = {
  name:"Fred Bloggs",
  age:42,
  appointments:[ new Date(), new Date("1 Jan 2008") ]
};
Remote.doSomethingWithPerson(myJSPerson);
```

* ファイルオブジェクトでアップロード/ダウンロードできる
[DWRのファイルアップロード方法](http://directwebremoting.org/dwr/documentation/server/configuration/dwrxml/converters/file.html)

### DWRの不満な点
* 開発が終了している。2009年以降アップデートされていない。
[DWRのリリースノート](https://directwebremoting.atlassian.net/secure/ReleaseNote.jspa?projectId=10000&version=10024)
* javascriptの記述方法が古く、今後新しいブラウザに対応しなさそう。現状IE6に対応している。
[DWRのサポートブラウザ](http://directwebremoting.org/dwr/documentation/browser/support.html)


# 探しているライブラリ
以下の条件を満たすライブラリを探しています。

* Java/Javascript間のAjaxライブラリ
* 私が「DWRで気に入っている点」を取り入れている
* 最新のブラウザに対応するようなjavascriptで書かれている
* 現在開発中

以下のサイトから、簡単にライブラリを探していましたが、
[https://en.wikipedia.org/wiki/List_of_Ajax_frameworks](https://en.wikipedia.org/wiki/List_of_Ajax_frameworks)

* JavaからJavaScriptは自動生成する
* タグライブラリからJavaScript/HTMLを自動生成する
ようなライブラリばかりで、Java/JavaScript間だけのライブラリは見つかりませんでした。

私は、メインとなる部分（Ajax通信以外)のJavaScriptは、自動生成するのでなく直接書きたいです。

以上、便利なライブラリがありましたら教えてください。
よろしくお願いします。


###補足情報(言語/FW/ツール等のバージョンなど)
* Java7
* Tomcat7 
* TERASOLUNA Server Framework for Java 2.0.5.3
* DWR 3.0.1 
* 対象ブラウザ: Firefox / IE11
GitHub for Windows を Windows7 にインストールする手順

# やりたいこと

* GitHub for Windows を Windows7 にインストールする。

# 前提環境

* OS: Microsoft Windows 7 Professional 6.1.7601 Service Pack 1 (SP1) ビルド 7601 x64

# インストールするソフトウェア

* GitHub for Windows

# 手順

## インストーラをダウンロード

[GitHub for Windows](https://desktop.github.com/) へアクセス。
**Download GitHub Desktop Windows 7 or later** を選択し、インストーラをダウンロードします。

![image](https://qiita-image-store.s3.amazonaws.com/0/112128/151f93f0-de18-3f6e-132c-538f3c50211d.png)

## インストール

**GitHubSetup.exe** を実行します。

## アプリケーションのインストール - セキュリティの警告

[インストール]ボタン を選択。

![image](https://qiita-image-store.s3.amazonaws.com/0/112128/d29d92c6-3f06-0fc4-58ad-56fbc6d6bc24.png)

しばし待つ :tea:  。（S3から配信してるんだぁ :octocat: ）

![image](https://qiita-image-store.s3.amazonaws.com/0/112128/fdbc6a20-b108-2fac-e9ca-3b552a79cfbf.png)

インストールが完了するとウィンドウが閉じます。


## Welcome

### Log in

GitHubのアカウント情報を入力。

| 項目 | 入力値 |
|:--|:--|
| Username or Email  | GitHub Mail Address |
| Password | GitHub Password |

[Log in] ボタンを選択。

![image](https://qiita-image-store.s3.amazonaws.com/0/112128/823aa536-dfae-35ba-3e38-994372f88399.png)

### Configure

[Continue] ボタンを選択。

![image](https://qiita-image-store.s3.amazonaws.com/0/112128/5b845264-c75d-cae0-512a-bc99880e22e0.png)

### Repositories

同期したいリポジトリが存在する場合は、[Find local repositories]でチェックをONにして、[Add Selected] ボタンを選択。
同期するリポジトリを選択しない場合は、[Skip] ボタンを選択。

![image](https://qiita-image-store.s3.amazonaws.com/0/112128/676da06e-531c-f884-0711-00672cb63813.png)

# 完了
PayPalのRestAPIではリファレンストランザクションは作れない

タイトルどおりです。
Billing Plan作成とBilling Agreementまではできますが、BAID（Billing Agreement ID）を使った支払いはできません。土日をこれに費やしてどうしてもできなかったです。

こんな書き込みを見つけました。
[No way to refund billing agreement transactions](https://github.com/paypal/PayPal-Python-SDK/issues/115)
リファレンストランザクションをやりたいって話ではないんですが、「BAIDを使ってもSaleのrefundできないよ」って書き込みです。どうやらPayPalのバグらしく、原因究明中だそうです。

よくよく調べてみるとリファレンストランザクションの審査は相当厳しいらしく、月間900万くらい売上がないと使えないみたいです。たしかに、お金に関する部分なので審査が厳しいのは納得ですが、ひとことそう書いておいてくれよ・・・。まじで時間を無駄にしました。

PayPalは本当にドキュメントが不親切です。先日書いた懸念はあながち間違いじゃないかも。
jupyter (ipython notebook) のipynbファイルをバージョン管理しやすくする

# 動機：ipynbファイルは差分が絶望的に見にくい
コードだけの差分が見たいのに、
以下で無数に差分がでるのが辛い。。。

1. 出力結果 out[1]: hogehoge
2. 実行順番 (In[17]などの 17の部分)
3. セルの区切り具合





## 方法1（人力：非推奨）: 毎回出力結果をクリアしてからコミットする
　kernel再起動の時にclear output を選択する。
　
何もしないよりは見やすくなるが以下の欠点がる。

-  上記の3に対しては無意味
-  めんどい
-  忘れてそのままコミットした時に死ぬ


## 方法2（こっちが本題）: 自動でpyファイルを生成し、それをバージョン管理する

+ ipynbをセーブした時に自動でpyファイルも更新される！
+ 基本的に不要な、出力結果や実行順番を消すこともできる！

やり方はここを参考にした。
> http://jupyter-notebook.readthedocs.org/en/latest/extending/savehooks.html



*各自の環境にある以下の設定ファイルをいじる。*
> .jupyter\jupyter_notebook_config.py

上記ファイルは最初は無いかもしれない。
その時は生成するコマンドがあるので、ググッてください。

***

### 方法2のための変更箇所1：保存前に、無駄な出力などを削除する

このコメントアウトされた部分を。。。

``` python:jupyter_notebook_config.py
#c.FileContentsManager.post_save_hook = None
```

↓　こうじゃ

``` python:jupyter_notebook_config.py

def scrub_output_pre_save(model, **kwargs):
    """scrub output before saving notebooks"""
    # only run on notebooks
    if model['type'] != 'notebook':
        return
    # only run on nbformat v4
    if model['content']['nbformat'] != 4:
        return

    for cell in model['content']['cells']:
        if cell['cell_type'] != 'code':
            continue
        cell['outputs'] = []
        cell['execution_count'] = None

c.FileContentsManager.pre_save_hook = scrub_output_pre_save

``` 
***

### 方法2のための変更箇所2：同名のpyファイルをipynbと同じタイミングで自動保存する

こいつを

``` python:jupyter_notebook_config.py
#c.FileContentsManager.post_save_hook = None
``` 

↓こうじゃ

``` python:jupyter_notebook_config.py
import io
import os
from notebook.utils import to_api_path

_script_exporter = None

def script_post_save(model, os_path, contents_manager, **kwargs):
    """convert notebooks to Python script after save with nbconvert

    replaces `ipython notebook --script`
    """
    from nbconvert.exporters.script import ScriptExporter

    if model['type'] != 'notebook':
        return

    global _script_exporter
    if _script_exporter is None:
        _script_exporter = ScriptExporter(parent=contents_manager)
    log = contents_manager.log

    base, ext = os.path.splitext(os_path)
    py_fname = base + '.py'
    script, resources = _script_exporter.from_filename(os_path)
    script_fname = base + resources.get('output_extension', '.txt')
    log.info("Saving script /%s", to_api_path(script_fname, contents_manager.root_dir))
    with io.open(script_fname, 'w', encoding='utf-8') as f:
        f.write(script)
c.FileContentsManager.post_save_hook = script_post_save

```
  　
***

以上でまともなバージョン管理ができるかと。
jupyter最高！
GoでGCEからGCSにファイルを書き込む/読み込む

GCE(Google Compute Engine)からGCS(Google Cloud Storage)へのアクセスとても簡単に出来たのでメモメモ。

現在GCEでLinuxサーバーとWindowsサーバーを運用しているのだけど、Goのクロスコンパイルでどちらでも問題なく動いた。便利＼(^o^)／

# 準備

## import

```go
import (
	"google.golang.org/cloud/storage"
	"golang.org/x/net/context"
)
```

## 認証

GCE上で動かすのであれば、そのプロジェクトからアクセス権限のあるbucketにはそのままアクセスできる。

ちなみにローカルで実行する場合でもgcloud auth loginでbucketにアクセス権限あるユーザーで認証しておけばそのまま実行できる。テストに便利。
CIとかから実行したい場合はサービスアカウント用意しておけばいいかな（多分）。

とにかくコード内に認証情報を用意しておく必要ないのは便利＼(^o^)／

# 書き込み

```go
func Put(bucket, path string, data []byte) error {
	ctx := context.Background()
	client, err := storage.NewClient(ctx)
	if err != nil {
		err
	}
	defer client.Close()

	w := client.Bucket(bucket).Object(path).NewWriter(ctx)
	defer w.Close()

	if n, err := w.Write(data); err != nil {
		return err
	} else if n != len(data) {
		return err
	}
	if err := w.Close(); err != nil {
		return err
	}

	return nil
}
```

# 読み込み

```go
func Get(bucket, path string) ([]byte, error) {
	ctx := context.Background()
	client, err := storage.NewClient(ctx)
	if err != nil {
		return nil, err
	}
	defer client.Close()

	r, err := client.Bucket(bucket).Object(path).NewReader(ctx)
	if err != nil {
		return nil, err
	}
	defer r.Close()

	var buf bytes.Buffer
	if _, err := buf.ReadFrom(r); err != nil {
		return nil, err
	}

	return buf.Bytes(), nil
}
```

# 参考
https://godoc.org/google.golang.org/cloud/storage
BashでDBログイン時にスキーマを選択できるようにする


担当するプロジェクトがたくさんあるとその分ローカル環境のDBには多くのスキーマが存在するようになったりします。
DBにログインしていちいち`use database`するのも面倒くさいし、しばらく触ってなかったものや最近できたばっかでスペルも覚えきれてない場合に`show databases`するのも面倒くさい。
なのでBashでログイン時にスキーマ選択してできるようにしたいなと思って作ってみました。

## Bash内容
```bash:db_login.sh
#!/bin/bash
MYSQL="mysql -u root -proot"
DATABASES=`$MYSQL -e 'show databases\G' | egrep ^Database | awk '{print $NF}' | egrep -v '(^information_schema$|^mysql$)'`

  select DATABASE in $DATABASES
  do
    $MYSQL $DATABASE
    break
  done
```

## 実行
```
$ . db_login.sh
1) aaa           7) ddd
2) aaa_test      8) ddd_test
3) bbb           9) test
4) bbb_test      
5) ccc           
6) ccc_test      
#?
```
実行すると上記のようにスキーマに番号が振られているので使いたいスキーマの番号を入力して`Enter`すればOK
Swift - 异常处理


```
/*
	1. 使用 ErrorType 的帮助建立你的异常类型。	
	2. 使用 throws 来声明异常，用 throw 来抛出异常。
	3. 使用 do-catch 机制来获取和处理异常。
*/
```


```Swift
//: Playground - noun: a place where people can play
import UIKit

// 定义一个错误枚举
enum myErrorType: ErrorType {
    case errorNotEqual
}

// 定义一个会抛出异常的测试函数。
func willThrowFunction(valueParameter: String) throws ->String {
    let value = "1"
    
    // guard 相当于if.
    //这里假定如果参数和value不一样就抛出异常。
    guard valueParameter == value else { throw myErrorType.errorNotEqual }
    
    return value
}

// 直接这样调用函数是不对的。会报错"Call can throw but is not marked with 'try'."
/*

let result = willThrowFunction()

*/


// 正确的调用方法--> 不抛异常
var result: String
do{
    result = try willThrowFunction("1")
}catch{
    // 处理错误Error块
    print(error)
}

// 正确的调用方法--> 抛出异常
do{
    result = try willThrowFunction("2") // 参数不对 要抛出异常
}catch{
    print(error)
    // 输出“errorNotEqual”
}


// 如果调用要抛出异常的函数，但是我们不想处理异常。这时候需要使用 try!

result = try! willThrowFunction("1")
print(result)


//这个时候会报错 内存错误
//result = try! willThrowFunction("2")
```

![pic url](https://github.com/Asahi-Kuang/picture/blob/master/8C686485-D7E2-44CF-942C-2CD370D58D88.png?raw=true)
すべての ETH を送金して残高を 0 に(Ethereum, イーサリウム, エサリウム)

以下を実行したらできました。

```
$ from=0x... # 送金元アドレス
$ to=0x...   # 送金先アドレス
$ gas=21000  # gasの量
$ gasprice=50000000000 # gasの値段, この変数の代わりに eth.gasprice としても良いようです
$ geth --exec "eth.sendTransaction({from:'$from',to:'$to',value:eth.getBalance('$from')-$gas*eth.gasprice,gas:$gas,gasPrice:$gasprice})" console
```

# この方法を用いた理由
あるアドレスにある ethereum をすべて別のアドレスに移したいことがありました。しかし、gas や tax の計算が面倒でした。コマンドラインから実行するだけにしました。

# 参考にしたページ
* [How do you compute the right amount of gas and tax to transfer certain amount of money?](http://ethereum.stackexchange.com/questions/996/how-do-you-compute-the-right-amount-of-gas-and-tax-to-transfer-certain-amount-of)
 * 丸め誤差のため 1 Wei を残すように勧めていますが、私の環境では不要でした。
* [技術者向け Ethereumの基礎知識 (イーサリアム、エセリウム)](http://qiita.com/hshimo/items/20abfc5942d4dd5d3e04)
Ubuntuでsshのrootログインを禁止する

Ubuntu 14.04で構築し、sshのrootログインを禁止する方法です。
※公開鍵でのログインはまた別途か追記します。とりあえずパスワードログインまで。

# ユーザ作成

ユーザを追加する。

```
$ adduser UserName
Adding user `UserName' ...
Adding new group `UserName' (1000) ...
Adding new user `UserName' (1000) with group `UserName' ...
Creating home directory `/home/UserName' ...
Copying files from `/etc/skel' ...
Enter new UNIX password: 
Retype new UNIX password: 
passwd: password updated successfully
Changing the user information for UserName
Enter the new value, or press ENTER for the default
        Full Name []: 
        Room Number []: 
        Work Phone []: 
        Home Phone []: 
        Other []: 
Is the information correct? [Y/n] y
```

wheelグループを作成する。

```
$ groupadd wheel
```

wheelグループをsudoできるようにする。

```
$ visudo

#以下の一行を追加。
%wheel  ALL=(ALL) ALL
```

sudoを実行した際に、「sudo: unable to resolve host xxx-xxx-xxx-xxx」というメッセージが出る場合はhostsを編集。

```
$ sudo vim /etc/hosts

#以下の一行を追加。
127.0.0.1    xxx-xxx-xxx-xxx
```

# rootログイン禁止の設定

rootログインを禁止する。

```
$ vim /etc/ssh/sshd_config

#yes→noに変更。
PermitRootLogin no
```

sshを再起動。

```
$ service ssh restart
```

rootでログインして入れないことを確認する。
BVE向けテクスチャ作成講座

# 準備
テクスチャにしたい画像とPhotoshopを用意してください（無料のGIMPでも同等の操作ができると聞いています）。Photoshopについては下記を参考にしてください。
>PhotoshopなどのCS2製品が無料？　アクティベーションサーバの停止でAdobeが公開 - ITmedia ニュース
http://www.itmedia.co.jp/news/articles/1301/08/news026.html

# Photoshopの操作
1.テクスチャになりそうな範囲を広めに選択します。
>![1.jpg](https://qiita-image-store.s3.amazonaws.com/0/115416/bc39c299-8ad7-96d8-2c22-0a98adaf27f3.jpeg)

2.`遠近法`を選び、選択範囲の角をドラッグして風景を平行四辺形にします。
>![2.jpg](https://qiita-image-store.s3.amazonaws.com/0/115416/5820eb30-e979-9706-aa16-2e19b3c25ce1.jpeg)

>![2b.jpg](https://qiita-image-store.s3.amazonaws.com/0/115416/5a9c96af-fb1f-8ccf-50a6-d35b40cabfaf.jpeg)

3.選択範囲の辺の真ん中をドラッグして風景を長方形にします。
>![3b.jpg](https://qiita-image-store.s3.amazonaws.com/0/115416/ed1dea5d-fd23-e1cd-a13c-dc87c41653a7.jpeg)

適宜 2. と 3. を繰り返して正確に縦横を揃えます。`ガイド`の使用もおすすめです。

4.テクスチャとして使う範囲を選択します。この例では連続使用する横方向はぴったり１スパン分だけ選択する必要があります。
>![4.jpg](https://qiita-image-store.s3.amazonaws.com/0/115416/6437219d-eba7-c313-7f69-58e076b8009c.jpeg)

5.`切り抜き`を選びます。
>![5.jpg](https://qiita-image-store.s3.amazonaws.com/0/115416/88713f63-c5c6-9e0f-5d86-1c4b9265ea4a.jpeg)

6.`レベル補正`で明るさを調整します。逆光を補正するには`シャドウ・ハイライト`が便利です。
>![6.jpg](https://qiita-image-store.s3.amazonaws.com/0/115416/450ad46c-68dc-b4cd-8297-253ff81e2da1.jpeg)

>![6b.jpg](https://qiita-image-store.s3.amazonaws.com/0/115416/e87e1c78-5ea2-f1d8-828f-4b0cd0d72574.jpeg)

7.`カラーバランス`で色味を調整します。この例では少し暖色よりだと感じたので`レッド`を下げて`ブルー`を上げています。寒色よりの場合はこの逆です。`マゼンタ`/`グリーン`は基本的に操作不要です。
>![7.jpg](https://qiita-image-store.s3.amazonaws.com/0/115416/e2842e53-deb7-0882-aceb-eb5b233af6dd.jpeg)

>![7b.jpg](https://qiita-image-store.s3.amazonaws.com/0/115416/c5760575-55cd-0c66-9b31-cc07877cad5d.jpeg)

8.`画像解像度`で幅と高さを2の累乗にします。BVEで最も大きく映るとき何ピクセル必要か考慮します。
>![8.jpg](https://qiita-image-store.s3.amazonaws.com/0/115416/62528694-db20-0d33-3003-0ab93d7265db.jpeg)

>![8b.jpg](https://qiita-image-store.s3.amazonaws.com/0/115416/f563505d-a89f-e517-c0b8-0a512007a7cb.jpeg)

完成です！ お疲れさまでした。
快適なC++生活のためにスクリプト言語を使おう3 ーグラフ作成はmatplotlibにまかせようー

C++でプログラムを開発し不満を感じる部分は、グラフ用のライブラリです。
まわりにはExcelでグラフを書いている人もいるのですが、
私は次の点でExcelをあまり使いません。

###**Excelが適さない領域**
・2万を超えるようなデータ数のとき(注１)
・ヒストグラムを書きたいとき(注２)
・データと処理と描画とを明確に区別したいとき
・Windows、Linuxでクロスプラットフォームで利用したいとき

###**現在の私の対処方法**
・[Matplotlib](http://matplotlib.org/)をpythonから使う。
理由１：Pythonからmatplotlibを日常的に使い慣れているから
理由２：データをファイルベースにして、pythonスクリプトを内部的に動作させれば、事足りる。
理由３：windows,Linuxで共通に動作する無料で商用開発にも利用可能なライブラリを知らないため。

###**記事[C++のコードから簡単にmatplotlibを使ってグラフを作成する方法](http://myenigma.hatenablog.com/entry/2016/01/16/093912)**

に紹介されている方法を使うと
matplotlib-cpp
を使って、C++からあたかもC++の自前のプロットライブラリのように
matplotlibを使えるようです。


####**付記：Gnuplotをラッパー越しに使う手もあるけど**
　[Gnuplot](http://www.gnuplot.info/)はとてもお世話になったプログラムです。Windows/Linux/Cygwinなどの環境で使ったことがあります。OS依存性が少なくグラフを書けるので、とても重宝しました。以下に示す特徴はとても役立ちました。Gnuplotは今でもいろんなプログラムの中でグラフ作成を担当する形で使われています。
　私自身はpython環境下でMatplotlibを使うようになってからは、gnuplotを使うことが少なくなりました。
Gnuplotの特徴
　ファイルベースのデータ入力に対してグラフを手短なスクリプトで書ける。
　awkなどのコマンドラインツール（パイプ）との相性がよい。
　ポストスクリプトファイルでグラフを出力できる。
　非線形の最小2乗法を使って関数のフィッティングができる。

Matplotlibの優位性
　MATLABのグラフィックに匹敵するレベルでのグラフの作成ができる。
　1枚のfigureの中で複数のsubplotができる。
　画像などの表示用の関数が用意されている。


注１：
Excel グラフの仕様と制限　[2-D グラフの 1 つのデータ系列に含めることのできるデータ要素 32,000](https://support.office.com/ja-jp/article/Excel-%E3%81%AE%E4%BB%95%E6%A7%98%E3%81%8A%E3%82%88%E3%81%B3%E5%88%B6%E9%99%90-16c69c74-3d6a-4aaf-ba35-e6eb276e8eaa)

注２：
[エクセルにおける度数分布表とヒストグラムの書き方](http://www.ipc.shimane-u.ac.jp/food/kobayasi/excel_histogram.htm)
[Excelでヒストグラム（度数分布図）](https://oku.edu.mie-u.ac.jp/~okumura/stat/excel-hist.html)


前にこんなのを書いていた。
[C++からmatplotlibを使いたい](http://qiita.com/nonbiri15/items/94107ec8dc527c41baca)


###**参考情報:日本語を使う際にどうしたらいいのか**
既に記事を書かれている方がいらっしゃるので、それを紹介する。
[matplotlibで日本語](http://qiita.com/canard0328/items/a859bffc9c9e11368f37)
[matplotlib と Seaborn の軸の日本語設定](http://qiita.com/kshigeru/items/0cfc0778bab197687967)
[matplotlibで、判例やグラフタイトルに日本語を使用する](http://symfoware.blog68.fc2.com/blog-entry-1417.html)
oF で半球を描く

https://www.opengl.org/discussion_boards/showthread.php/159402-half-sphere のコードを oF 用に書き直したものですが以下の課題があります。

- てっぺんが穴空きになる
- 頂点情報しか無い

もう少しベターな方法があればぜひ教えて下さい！

```cpp
ofVbo mHemisphere;

void ofApp::setup()
{
    const auto resolution_ = 256;
    const auto radius_ = 100.0;

    std::vector<ofVec3f> vertices_;

    for (auto i = 0; i < resolution_; ++i)
    {
        for (auto j = 0; j < resolution_; ++j)
        {
            vertices_.emplace_back(ofVec3f(
                radius_ * std::cos(j * 2 * M_PI / resolution_) * std::cos(i * M_PI / (2 * resolution_)),
                radius_ * std::sin(-i * M_PI / (2 * resolution_)),
                radius_ * std::sin(j * 2 * M_PI / resolution_) * std::cos(i * M_PI / (2 * resolution_))
            ));
        }
    }

    ofMesh mesh_;

    for (auto i = 0; i < resolution_ - 1; ++i)
    {
        for (auto j = 0; j < resolution_; ++j)
        {
            mesh_.addVertex(vertices_.at(i * resolution_ + j));            
            mesh_.addVertex(vertices_.at(i * resolution_ + (j + 1) % resolution_));            
            mesh_.addVertex(vertices_.at((i + 1) * resolution_ + (j + 1) % resolution_));            
            mesh_.addVertex(vertices_.at((i + 1) * resolution_ + j));
        }
    }

    mHemisphere.setMesh(std::move(mesh_), GL_STATIC_DRAW);
}

void ofApp::draw()
{
    ofTranslate(ofGetWidth() * 0.5, ofGetHeight() * 0.5);
    ofRotate(ofGetElapsedTimef() * 30.0, 1.0, 0.0, 1.0);
    mHemisphere.draw(GL_QUADS, 0, mVbo.getNumVertices());
}
```
OpenBlocks IoTシリーズのシリアル番号を取得する方法

tl;dr
-----

```console
# /usr/sbin/obs-util /dev/stdout
F2A00788
```

背景
---

OpenBlocks IoTのファームウェアが1.0.7になり、Wi-Fiセットアップ用APのSSIDが `iotfamily_{MACアドレス}` から `iotfamily_{シリアル番号}` になったようです

このシリアル番号が取得できると色々セットアップが捗ったりするので、取得の方法を調べてみました

OpenBlocks IoTシリーズのシリアル番号
--------------------------------

OpenBlocks IoTシリーズのウラ面に貼ってあるアスタリスク文字で挟まれてる文字列です
![IMG_3899.jpg](https://qiita-image-store.s3.amazonaws.com/0/22754/6d3724c0-567f-5c78-e436-6a529bb87d30.jpeg)

どうやらHEX(0~Fの文字のみ)で構成されているようです
ちなみに下のバーコードはシリアル番号をバーコード化(形式忘れた)したもので、適当なバーコードリーダで読み出すこともできます

注: ドキュメント化されていないようなので、仕様が変わったりするかもです

コマンド
-------

ファームウェア1.0.7で同梱される `/usr/sbin/obs-util` で読み出すことが出来ました

```console
# /usr/sbin/obs-util /dev/stdout
F2A00788
```

`obs-util` は引数をファイルパスとして認識し、そのパスに保存するようになっています
なので `/dev/stdout` を指定すれば標準出力に出すことができ、組み合わせしやすいです


あとがき
------

なんでこういうことがドキュメント化されないのか、謎すぎます
標準出力でなくファイルに保存するセンスも、謎すぎます

この辺、詳しく解説いただきたいものです
スマートに情報を整理するための、デジタル端末ツールまとめ

#はじめに
便利なツールが増えてエンジニアとしても目移りしやすい今日この頃。
ただ、ツールをころころ換えることは効率が良くないため、
ここらで一旦自分の使っているツールと役割を整理しておく。

#デジタル端末ツール
##Simplenote
- メモ
- サッと書いて、考えをまとめる
- 自己啓発に関するメモは、上部に固定して見えるようにしておく

##Wunderlist
- やることリスト
- やりたいことリスト
- フォルダは作り過ぎない
- 今日、今週、今月、いつかやる／多分やる、後で読む
- GTD(Getting Things Done)を続けていたが、自分にはこのくらいのフォルダが丁度よい

##iCloudカレンダー
- 1ヵ月単位での予定の俯瞰が主
- 共有機能もよく使う

##iCloudリマインダー
- 定期的に通知するもののみを登録(普段は意識しないでよい！)
- 定期券更新、勤務表提出など

##Evernote
- 資料の保管が主
- 勉強会の資料
- 自己啓発関連の資料
- 他

#まとめ
いずれもスマホ、PCなど端末を選ばず使えて、無料で使えるものを選んでいる。
iCloudを使う理由は、私がAppleユーザのため。Googleカレンダーでもよいと思う。