OmniAICreator/Qiita-1.07M huggingface dataset:
async/awaitの不便なところ

```js
function sleep(ms) {
  return new Promise((resolve)=> {
    setTimeout(()=> {
      resolve();
    }, ms)  
  })
}

class Human {
  async sayHello() {
    await sleep(1000);
    console.log('hello')
    return this;
  }
  async sayBye() {
    await sleep(1000);
    console.log('bye');
    return this;
  }
}


(async ()=> {
  await new Human().sayHello().sayBye();
})();
// => helloしか出力されない
```

asyncのメソッドをメソッドチェーンで書くのは不可能な模様?
babelの仕様なのかasync/awaitの仕様なのかは謎
`return await this;`のようにしてもダメでした

[playground](https://babeljs.io/repl/#?evaluate=true&lineWrap=false&presets=es2015%2Cstage-0&experimental=false&loose=false&spec=false&code=function%20sleep(ms)%20%7B%0A%20%20return%20new%20Promise((resolve)%3D%3E%20%7B%0A%20%20%20%20setTimeout(()%3D%3E%20%7B%0A%20%20%20%20%20%20resolve()%3B%0A%20%20%20%20%7D%2C%20ms)%20%20%0A%20%20%7D)%0A%7D%0A%0Aclass%20Human%20%7B%0A%20%20async%20sayHello()%20%7B%0A%20%20%20%20await%20sleep(1000)%3B%0A%20%20%20%20console.log('hello')%0A%20%20%20%20return%20this%3B%0A%20%20%7D%0A%20%20async%20sayBye()%20%7B%0A%20%20%20%20await%20sleep(1000)%3B%0A%20%20%20%20console.log('bye')%3B%0A%20%20%20%20return%20this%3B%0A%20%20%7D%0A%7D%0A%0A%0A(async%20()%3D%3E%20%7B%0A%20%20await%20new%20Human().sayHello().sayBye()%3B%0A%7D)()%3B%0A)
Railsのymlファイル


ymlよくわかってない…。
てか基本もよくわかってない。


# ymlでメソッド呼び出し？？
```yaml:csv.yml
csv:
 テスト項目1: "test#method1"
 テスト項目2: "test#method2"
 テスト項目3: "test#method3"
```

```rb:test.rb

def method1
 // method1呼び出す処理
end

def method2
 // method2呼び出す処理
end

def method3
 // method3呼び出す処理
end
```

呼び出す場合に便利になるっぽい。
ymlもうよくわかんない。後で調べる……(´；ω；｀)ｼｸｼｸ
Apple Developerの3rd Party証明書で署名したElectronアプリがspctlコマンドで正しくないとされてしまう件

ElectronアプリをMac App Storeに出した時のつまずきです。

アプリへの署名を行った後は、署名が正しくされているかチェックする必要があるという情報を得たので、実際に試してみた。```spctl ```コマンドを使うと署名状況を確認できるらしい。（参考「[[2016年3月時点]Mac用Electronバイナリに署名してApp Storeにアップするためのメモ](http://qiita.com/hachi8833/items/e87c00f381c29b7f0120#_reference-82416ed1413dc3f52e9b)」）

- ターミナル上で以下を実行

```
spctl --assess --verbose --type execute --raw -v '日本語アプリ名-x64-mas/日本語アプリ名.app'
```

- 結果

```
日本語アプリ名-mas-x64/日本語アプリ名.app: rejected
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>assessment:authority</key>
	<dict/>
	<key>assessment:originator</key>
	<string>3rd Party Mac Developer Application: 会社名 (チームID)</string>
	<key>assessment:remote</key>
	<true/>
	<key>assessment:verdict</key>
	<false/>
</dict>
</plist>
origin=3rd Party Mac Developer Application: 会社名 (チームID)
```

rejectされた、rejectされただと・・・！！！！けれども・・・・。

MASからインストールされるのならば、開発元解決されるのでは・・・？？？という淡い期待を持ち、**iTunes Connectでは提出できたので、ダメ元で審査に出したらうまく行った。**

![image](https://qiita-image-store.s3.amazonaws.com/0/1423/c1b466ec-94fa-ab97-ff93-0bc0e1b5e303.png)
ちなみに審査に出したあとに、中身を覗いてみたんだけど、見覚えのないファイル(_MASReceipt)が追加されていたので、これが審査後に追加されたんだと思う。私は深夜4時になんか作業してないし・・・。
# おわりに

ElectronアプリをMac App Storeに出したときの手順をまとめました。ぜひ、ご覧ください「[Electron製アプリ「アニメ画像に変換する君」をMac App Storeにリリース、アプリリリース時の手順まとめ - Qiita](http://qiita.com/nyamogera/private/fd42dfa8151371d526bd)」

また、今回リリースしたElectronアプリのインストール・使い方は記事「[LINEアニメスタンプにも利用できる！ APNGやWebPへ変換可能なアプリ「アニメ画像に変換する君」をリリース](https://itunes.apple.com/jp/app/anime-hua-xiangni-bian-huansuru/id1127676902?mt=12)」を参照ください。
0.5秒で検索！Chromeアドレスバー120%活用術

あなたはChromeのアドレスバーで何ができるか全部知っていますか？

おそらく90%の人が知らないChromeの活用方法を紹介します。

アドレスバーを用いた検索爆速化を行います。

## やり方(基本編)

* Chromeの設定を開きます

* 検索 > 検索エンジンの管理... をクリックします

* 以下のように入力します

|検索エンジンを追加|キーワード|URL|
|:--|:--|:--|
|Amazon|am|https://www.amazon.co.jp/s/ref=nb_sb_noss_1?field-keywords=%s|

* 検索します
  * アドレス入力欄を選択し、「am 」と入力します（amの後に半角スペース）
  * 「Amazonを検索」と表示されるので好きな検索ワードを入力し、Enterキーを押します

## やり方(応用編)

検索ページ以外にも使えます
「検索エンジンの管理...」で以下のように入力します

* 以下のように入力します

|検索エンジンを追加|キーワード|URL|
|:--|:--|:--|
|Chromeブログ|ch|https://chrome.googleblog.com/|

これを応用すると以下のようなことができます。
* kyou で、今日が期限のチケット一覧画面に飛ぶ
* tanto で、現在担当しているチケットの一覧画面に飛ぶ
* news で、よく見るニュースサイトに飛ぶ
* などなど...

## 合わせて覚えたいショートカットキー

|Mac|Windows|動作|
|:--|:--|:--|
|Command + T|Ctrl + T|新しいタブを開く|
|Command + L|Ctrl + L|アドレスバーにフォーカスを当てる|
|Command + W|Ctrl + W|タブを閉じる|
|Command + Option + 左右|Ctrl + Tab, Ctrl + Shift + Tab|左右のタブに切り替え|
|Command + Shift + T|Ctrl + Shift + T|直前に閉じたタブを開く|

直前に閉じたタブを開く動作は、
誤ってタブを消してしまった場合に役に立ちそうです。

また、業務中に趣味のサイトを見ているときに・・・という場合にも良さそうです。

他にも良いChromeの活用方法があったら教えてください！
FormCloseQuery で 保存確認ダイアログ を表示させる

##目的
　タイトルどおり。ウィンドウの×ボタンとか、キャンセルボタンをクリックしたときに
　「保存してないけど大丈夫か？」みたいなメッセージを出します

## ポイント
　MessageBox() の 返り値でキャンセルボタンを認識。
　OnCloseQuery()で終了時処理を認識します。
　場合によってやっぱ終了するんやーめた を CanCloseで操作できます。
　というわけで、下記のコード。

```cpp:file01.cpp
void __fastcall TEditorTool::FormCloseQuery(TObject *Sender, bool &CanClose)
{
	if (isCancel()) {
		// [キャンセル]時は終了しない
		CanClose = false;
    }
}

bool isCancel()
{
	bool ret = 0;
	int message_ret = MessageBox(Handle, _T("現在の設定は保存されていません、保存しますか？"), _T("確認"), MB_YESNOCANCEL);
	if (message_ret == IDCANCEL) {
			ret = 1;
        }
	return ret;
}
```
MFCのリストコントロールでカラム幅を自動調整する時

VC++で

```
m_list.SetColumnWidth(0,-1);
m_list.SetColumnWidth(1,-1);
m_list.SetColumnWidth(2,-1);
m_list.SetColumnWidth(3,-1);
```

こんな感じで幅をマイナス値にすると勝手に調整してくれる。

ヘッダの文字幅ではなくリスト内の文字列幅を基準に調整されるので注意
Arduino > F() macro > Serial.println(F("Initializing I2C devices...")); > RAMの消費を減らす

MPU-9250を使用するためのスケッチ MPU6050_DMP6の中に以下のようなコードがある。

```
    Serial.println(F("Initializing I2C devices..."));
```

このF()マクロは何かというと以下を見つけた。

https://www.baldengineer.com/arduino-f-macro.html
> What the F() macro Does
> The F() macro tells the compiler to leave this particular array in PROGMEM. Then when it is time to access it, one byte of the data is copied to RAM at a time. 

以下は僕なりの理解 (間違っているかもしれない)。

```
Serial.println("Initializing I2C devices...");
```
とした場合は、コンパイル時点で文字列がRAMに格納される。RAMが浪費される。

```
Serial.println(F("Initializing I2C devices..."));
```
とした場合は、コンパイル時点で文字列はRAMには格納されずPROGMEMにある。実際に文字列を使う時点でRAMにコピーされて使われる。

結果として、リソース制限のあるRAMを無駄に使用しなくなるということのようだ。

F()マクロは文字列(文字列リテラルというのであっている？）にのみ使えるようだ。
アプリへの署名が失敗した時、秘密鍵持ってなかった。

ElectronアプリをMac App Storeに出した時のつまずきです。

署名を行おうとして、署名用のコマンド([osx-sign-electron](https://www.npmjs.com/package/electron-osx-sign))を実行したら、次のようなエラーが発生した。

```
Sign failed:
No identity found for signing.
```

原因としては、作成開始時には特にAppleのDeveloperとしてメンバー登録していなかったので、証明書ファイル(.cer)を別の開発者に作成して貰っていた。それで、証明書って同PCじゃないと単体では動かないそうで・・・。
証明書を作成してくれた開発者に秘密鍵ファイル(.p12)を貰ってキーチェーンに追加したら無事に署名できた。

[Apple Developer Center - サポート - 証明書](https://developer.apple.com/support/certificates/jp/)
> このエラーメッセージは、アプリケーションの署名に使用している証明書の公開鍵または秘密鍵が、お使いの Mac のキーチェーン内で見つからないことを示しています。

> 多くの場合これは、コード署名証明書を要求するために使用したものとは異なる Mac を使用して、アプリケーションに署名してビルドしようとしていることが原因です。また、証明書の有効期限が切れた場合や無効化された場合も発生することがあります。このような場合は、アプリケーションのプロビジョニングプロファイルに有効なコード署名証明書が含まれていることを確認すると同時に、お使いの Mac のキーチェーンに、その証明書、その証明書の生成に使用された秘密鍵、WWDR 中間証明書が含まれていることを確認してください。

▲ ちゃんとサポートに書いてあった。

p12書きだし方法の参考「[Exporting and Importing Certificates and Provisioning Profiles (証明書とプロビジョニングプロファイルの読み込みと書き出し)](https://developer.apple.com/library/ios/documentation/IDEs/Conceptual/AppDistributionGuide/MaintainingCertificates/MaintainingCertificates.html#//apple_ref/doc/uid/TP40012582-CH31-SW15)」
# おわりに

ElectronアプリをMac App Storeに出したときの手順をまとめました。ぜひ、ご覧ください「[Electron製アプリ「アニメ画像に変換する君」をMac App Storeにリリース、アプリリリース時の手順まとめ - Qiita](http://qiita.com/nyamogera/private/fd42dfa8151371d526bd)」

また、今回リリースしたElectronアプリのインストール・使い方は記事「[LINEアニメスタンプにも利用できる！ APNGやWebPへ変換可能なアプリ「アニメ画像に変換する君」をリリース](https://itunes.apple.com/jp/app/anime-hua-xiangni-bian-huansuru/id1127676902?mt=12)」を参照ください。
pkgファイルが日本語だと、Application Loaderのアップロード時に怒られる

ElectronアプリをMac App Storeに出した時のつまずきです。

Electronで作成したアプリのインストーラーの作成には「`electron-osx-flat`」を使用しました。これは、「electron-osx-sign」をインストールすると一緒にインストールされるやつです。

Application Loaderでアプリをアップロードしたところ、pkgファイルが日本語だと怒られます。メモしてなかったのでエラーメッセージは省略。ひとまず、appファイルは日本語のまま、pkgファイルを英語にしたら通りました。

☓怒られるやつ

```
electron-osx-flat '日本語アプリ名-x64-mas/日本語アプリ名.app' --verbose --pkg 日本語アプリ名.pkg
```

◯怒られない奴

```
electron-osx-flat '日本語アプリ名-x64-mas/日本語アプリ名.app' --verbose --pkg AppName.pkg
```
# おわりに

ElectronアプリをMac App Storeに出したときの手順をまとめました。ぜひ、ご覧ください「[Electron製アプリ「アニメ画像に変換する君」をMac App Storeにリリース、アプリリリース時の手順まとめ - Qiita](http://qiita.com/nyamogera/private/fd42dfa8151371d526bd)」

また、今回リリースしたElectronアプリのインストール・使い方は記事「[LINEアニメスタンプにも利用できる！ APNGやWebPへ変換可能なアプリ「アニメ画像に変換する君」をリリース](https://itunes.apple.com/jp/app/anime-hua-xiangni-bian-huansuru/id1127676902?mt=12)」を参照ください。
Apple Developer Program登録だけでは、iTunes Connectにログインできない

ElectronアプリをMac App Storeに出した時のつまずきです。

アプリの作成ができて、App Storeに登録しようとしたのだけれど、Xcodeから起動して、Application Loaderからログインしようとしたらできなかった :cold_sweat:  Developerとして登録済みで__管理者権限__だから行けるだろうと思ったら、iTunes Connectはまた別に__チームエージェント__にチームメンバーに登録して貰う必要があった。

[Apple Developer Center - サポート - iTunes Connect](https://developer.apple.com/support/itunes-connect/jp/)

>iTunes Connect へのアクセス
Apple Developer Program への登録が完了すると、登録に使用した Apple ID で iTunes Connect にサインインできるようになります。

>組織として登録しており、お客様ご自身がチームエージェント (最初の登録者) である場合は、iTunes Connect で追加したいチームメンバーのアカウントを作成してアクセス権を付与することができます。開発チームの一員として招待を受けた場合は、デフォルトの状態では iTunes Connect にアクセスできないため、お客様の iTunes Connect ユーザアカウントの作成をチームエージェントに依頼する必要があります。

▲ 普通に書いてある！！
# おわりに

ElectronアプリをMac App Storeに出したときの手順をまとめました。ぜひ、ご覧ください「[Electron製アプリ「アニメ画像に変換する君」をMac App Storeにリリース、アプリリリース時の手順まとめ - Qiita](http://qiita.com/nyamogera/private/fd42dfa8151371d526bd)」

また、今回リリースしたElectronアプリのインストール・使い方は記事「[LINEアニメスタンプにも利用できる！ APNGやWebPへ変換可能なアプリ「アニメ画像に変換する君」をリリース](https://itunes.apple.com/jp/app/anime-hua-xiangni-bian-huansuru/id1127676902?mt=12)」を参照ください。
Raspberry Pi 3 Raspbian でUSB NFCリーダーライターを使ってみる


# はじめに
RaspbianではじめてUSB NFCカードリーダーを使ったときの記録です。ほぼ[nfcpyのサイト](http://nfcpy.readthedocs.io/en/latest/topics/get-started.html)にある手順です。ちなみに楽天Edyのためにもともと持っていたRC-S360はこの手順では動きませんでした。

# ハードウェア
- Raspberry Pi 3 
- RC-S380/P

# ソフトウェア
- Raspbian
- libusb1
- pyserial
- Python 2.7.11
  - NFCPY
  
# 作業
Raspberry にログインしてください。

## Pythonパッケージの追加

```shell-session
$ pip install libusb1 pyserial
```

## nfcpyを取得

```shell-session
$ sudo apt-get install bzr
$ bzr branch lp:nfcpy trunk
```

bzrはnfcpyのリポジトリからファイル一式を取得するツール
trunkフォルダにnfcpy一式が保存されます。

## exampleの実行

NFCタグをかざして実行してみた

```shell-session
$ cd trunk
$ sudo python examples/tagtool.py show
[nfc.clf] searching for reader on path usb
[nfc.clf] using SONY RC-S380/P NFC Port-100 v1.11 at usb:001:004
** waiting for a tag **
Type2Tag 'NXP NTAG203' ID=04E4ED72773480
NDEF Capabilities:
  readable  = yes
  writeable = yes
  capacity  = 137 byte
  message   = 0 byte
```

## sudo なしで実行させる設定

sudoなしで実行させてみるとエラーになります。

```shell-session
$ cd trunk
$ examples/tagtool.py show
[nfc.clf] searching for reader on path usb
[nfc.clf] no reader available on path usb
[main] no contactless reader found on usb
[main] no contactless reader available
```

lsusbでusbのDevice情報を見る。「ID 054c:06c3 Sony Corp」がRC-380/Pのようだ

```shell-session
$ lsusb
Bus 001 Device 004: ID 054c:06c3 Sony Corp.
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. SMSC9512/9514 Fast Ethernet Adapter
Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp.
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
```

--deviceオプションで情報を見ると 最後から２行目に実行するコマンドが表示されている。nfcdev.rulesファイルに情報を付加すればよいらしい。コピペして実行してみる。

```shell-session
$ examples/tagtool.py --device usb:054c:06c3
[nfc.clf] searching for reader on path usb:054c:06c3
[main] access denied for device with path usb:054c:06c3
[main] first match for path usb:054c:06c3 is usb:001:004
[main] usb:001:004 is owned by root but you are pi
[main] members of the root group may use usb:001:004
[main] you may want to add a udev rule to access this device
[main] sudo sh -c 'echo SUBSYSTEM==\"usb\", ACTION==\"add\", ATTRS{idVendor}==\"054c\", ATTRS{idProduct}==\"06c3\", GROUP=\"plugdev\" >> /etc/udev/rules.d/nfcdev.rules'
[main] no contactless reader available
```

コピペして実行してみる。

```shell-session
$ sudo sh -c 'echo SUBSYSTEM==\"usb\", ACTION==\"add\", ATTRS{idVendor}==\"054c\", ATTRS{idProduct}==\"06c3\", GROUP=\"plugdev\" >> /etc/udev/rules.d/nfcdev.rules'
```

そして実行、あれ、変わらない。

```shell-session
$ examples/tagtool.py show
[nfc.clf] searching for reader on path usb
[nfc.clf] no reader available on path usb
[main] no contactless reader found on usb
[main] no contactless reader available
```

rebootしてからもう一度.. 成功しました。

```shell-session
$ examples/tagtool.py show
[nfc.clf] searching for reader on path usb
[nfc.clf] using SONY RC-S380/P NFC Port-100 v1.11 at usb:001:004
** waiting for a tag **
Type2Tag 'NXP NTAG203' ID=04E4ED72773480
NDEF Capabilities:
  readable  = yes
  writeable = yes
  capacity  = 137 byte
  message   = 0 byte
```
BigQuery-PythonでReason:responseTooLargeエラーが出た場合

## エラー内容
```
JobExecutingException: Reason:responseTooLarge. Message:Response too large to return. 
Consider setting allowLargeResults to true in your job configuration. For more details, 
see https://cloud.google.com/bigquery/querying-data#largequeryresults
```

## 対処例1
write_to_tableに
`allow_large_results=True`
を追加する
https://github.com/tylertreat/BigQuery-Python/blob/master/bigquery/client.py#L1032

### source例
```py:***.py
    client = get_client(PROJECT_ID,
                        service_account= SERVICE_ACCOUNT,
                        private_key_file=key,
                        readonly=False)
...
    job = client.write_to_table(query, allow_large_results=True)
...
    try:
        job_resource = client.wait_for_job(job, timeout=360)
        print job_resource
    except BigQueryTimeoutException:
        print "Timeout"
```
【Objective-C】UIViewControllerを任意に更新したい

### UIViewControllerの更新に見事にハマったので備忘録として残しておく

# 前提
クラスがUIViewControllerであること

# 手順
UINavigationControllerがラップしているViewControllersを

+ 取得する
+ 差し替える
+ 再セットする

# サンプルコード

```sample.m
    NSMutableArray *controllers = [self.navigationController viewControllers].mutableCopy;
    
    [controllers replaceObjectAtIndex:1 withObject:ViewController];
    
    [self.navigationController setViewControllers:controllers];
```

# 備考
※ご指摘ありがとうございます。
処理に無駄があった為、修正しました。
d3sparql.js を使ってみた

# d3sparql.js とは

SPARQLのクエリを書くだけで、指定したSPARQLエンドポイントのデータを[D3.js](https://d3js.org)で可視化することができるライブラリです。

- [デモサイト](http://biohackathon.org/d3sparql/)
- [ソースコード](https://github.com/ktym/d3sparql)

## インストール

いまのところnpmがないようなので、githubから直接持ってきます。

```bash:ダウンロード
$ git clone https://github.com/ktym/d3sparql
```


依存しているライブラリはD3.js の第3版です。最近D3.jsの第4版がリリースされましたがここでは第3版で試します。ライブラリの読み込みは以下だけです。

```html:JavaScriptライブラリ
<script src="https://d3js.org/d3.v3.min.js"></script>
<script src="d3sparql.js"></script>
```

ソースコードの中に入っている.htmlファイル群がサンプルです。それぞれフォーム入力の内容になっていたので、d3sparql-barchart.htmlをJSだけで書きなおしてみました。

以下は[DBpedia](http://dbpedia.org/)から都道府県の面積を棒グラフで表示する例です。

```js:クエリ例
  var endpoint = "http://dbpedia.org/sparql";
  var sparql = "PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> " +
    "PREFIX yago: <http://dbpedia.org/class/yago/> " +
    "PREFIX dbpedia-owl: <http://dbpedia.org/ontology/> " +
    "SELECT ?pref ?area " +
    "WHERE {" +
    "  ?s a yago:PrefecturesOfJapan ; " +
    "  rdfs:label ?pref ; " +
    "  dbpedia-owl:areaTotal ?area_total . " +
    "  FILTER (lang(?pref) = 'en') " +
    "  BIND ((?area_total / 1000 / 1000) AS ?area) " +
    "} " +
    "ORDER BY DESC(?area)";

  d3sparql.query(endpoint, sparql, function(json) {
    var config = {
      "label_x": "Prefecture",
      "label_y": "Area",
      "var_x": "pref",
      "var_y": "area",
      "width":  700,
      "height": 300,
      "margin":  80,
      "selector": "#result"
    }
    d3sparql.barchart(json, config);
   });
```

d3sparql.query()が実際にクエリ投げるところです。必要なパラメーターはSPARQLエンドポイントとSPARQLクエリと、クエリ結果を処理するコールバック関数です。"var_x"と"var_y"の値に、SPARQLのSELECTで指定した変数名を割り当てています。

<img width="714" alt="d3sparql-barchart_html.png" src="https://qiita-image-store.s3.amazonaws.com/0/1943/7527e81c-6dd3-52e1-e691-609002d87e56.png">


SPARQLのクエリを書くだけで可視化できるのでかなりお手軽に使えます。他にどういうことができるかは [デモ](http://biohackathon.org/d3sparql/) を見ると良いとおもいます。

なお、同様のライブラリとしては[sgvizler](http://mgskjaeveland.github.io/sgvizler/) があります。こちらは主にGoogle Chartを利用しています。
sidekiq,test,Rspec memo

## Gemfileに下記を追記
```
group :test do
  gem 'rspec-sidekiq'
end
```


## specファイルを作ろう
spec/workers/xxx_spec.rb
に
`require 'rails_helper'`

```
describe Xxx do
 before do
   subject.perform
 end

 it "Process in" do
   expect be_processed_in(:yy)
 end

end
```

## 手動デバッグ
```
bundle exec sidekiq -q [:queue] RAILS_ENV=development
```
PHPでフルスタックフレームーワークを使わないという提案

# 僕の作業時間
プログラミングだけに限定して、総量を10とすると、
* 5 : Laravel
* 2 : PHP
* 3 : 業務ロジック

となります。
本質的に作りたいのは、業務ロジックなので、
7 : 業務ロジックくらいにしたいです。。。

# フレームワークの示す道
フルスタックフレームワークは、ちょっとでも道を外れると、
フレームワークのマジカルファンシーなソースコードを追いかけて、
そこに対応するマジカルコードを書かなければならず、
そこで膨大な時間を消費します。。。

# Webアプリケーションで必要なものはそれほど多くない気がする
* シンプルなORM（発行されるSQLがコード読むとわかるくらいの）
* httpのルーティング部分（Controller層担当）
* View層のFW
* ログのFW
* テストFW
* 便利メソッドの集合体（必要なければ要らない）

ぱっと思い浮かぶ感じ、こんなところでしょうか？
各々、個別にOSSがあると思います。
それぞれ必要な分だけ使うのではダメでしょうか？

# まとめ
ざっと見ていると、フルスタックフレームワークのほうが楽に見えるからか？
必要な箇所だけ、シンプルなモジュールを使うということを、
あまりやらないような気がします。

業務要件は、フルスタックにキレイに収まるほど、生易しく無いと思います。

また、独立したモジュールは、１つの大きなモジュールより、扱いやすいですし、
万が一OSSが使えなくなっても、取り替えることが出来ると思います。
巨大なフルスタックFWの代替とか、作り変えるしか無い気がします。。。

みなさんは、どうしてますでしょうか？

※2017-06-01追記　JavaScriptフレームワークの記事ですが、似たような話が書いてあります。
[JavaScriptフレームワークのコストを考える](http://postd.cc/the-cost-of-frameworks/)
playframeworkのroutingでListを受ける

# playframeworkのrouteで受けれるのは以下の型
>Play 2.x supports the following query string parameter types:
String
Char
Int
Integer (Java)
Long (Scala and Java)
Double (Scala and Java)
Float (Scala and Java)
Boolean (Scala and Java)
java.util.UUID
Option
Optional (Java)
Seq
List (Scala and Java)
Array
See Binders.scala for all supported types.

>>http://stackoverflow.com/questions/31684919/how-to-route-map-like-parameters-in-get-request-with-play

# routes定義

```scala:routes
GET    /hoge/list    @controllers.HogeController.list(query: List[String])
```

# Controller定義
```scala:HogeController.scala
def list(query: List[String])
```

# クエリ
```
/hoge/fuga?query=AAAA&query=BBBB
```

# 参考
- http://stackoverflow.com/questions/31684919/how-to-route-map-like-parameters-in-get-request-with-play
- https://github.com/playframework/playframework/blob/8b6c8242a8e923d25bba40b902a84398ab1cc178/framework/src/play/src/main/scala/play/api/mvc/Binders.scala
Fusekiをダウンロードして立ち上げるまで。Mac OS X編

手軽にRDFデータを用意してSPARQLでの検索を試せるツールとして[Fuseki](https://jena.apache.org/documentation/fuseki2/index.html)があります。
今回はMac OS Xで立ち上げるまでのメモを記述します。
バージョンは2.4.0および3.8.0での動作を確認をしています。

##Javaの準備##
Fusekiを動作させるためにはJavaのバージョン8以降が必要になりますので、適宜[こちら](http://java.com/ja/)から取得しておいてください。Javaのバージョンは``java -version``で確認できます。OS X 10.9など、Javaのバージョン8がターミナルから実行されない環境では、以下のような表示がされると思います。

```shell-session
$ java -version
java version "1.7.0_75"
Java(TM) SE Runtime Environment (build 1.7.0_75-b13)
Java HotSpot(TM) 64-Bit Server VM (build 24.75-b04, mixed mode)
```
それでもプラグイン用のJREが更新されている場合が多く、その時は以下のパスに納められています。
``/Library/Internet\ Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/``
従って以下の通りにバージョンを確認できます。

```shell-session
$ /Library/Internet\ Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/bin/java -version
java version "1.8.0_111"
Java(TM) SE Runtime Environment (build 1.8.0_111-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.111-b14, mixed mode)
```
ですので、例えば、

```shell-session
$ ln -s /Library/Internet\ Plug-Ins/JavaAppletPlugin.plugin/Contents/Home Home
$ export JAVA_HOME=./Home
```
とすることでfusekiを実行できるようになります。

##Fusekiのインストール##
1. 最初に[ここ](https://jena.apache.org/download/index.cgi?Preferred=http%3A%2F%2Fftp.tsukuba.wide.ad.jp%2Fsoftware%2Fapache%2F)からapache-jena-fuseki-X.Y.Z.zipを取得します（X.Y.Zはアクセス時点での最新バージョンに読み替えてください。たとえば2.6.0、つまり、apache-jena-fuseki-2.6.0.zipなど）。
2. 「ターミナル」コマンドを立ち上げます。
![スクリーンショット 2016-07-01 14.03.46-2.png](https://qiita-image-store.s3.amazonaws.com/0/119205/458061cb-41b2-8c29-b953-01f30049b27d.png)

3. Downloadsフォルダに移動します。
![スクリーンショット 2016-07-01 14.21.49.png](https://qiita-image-store.s3.amazonaws.com/0/119205/fab3353e-0b96-19a4-2225-e5b6c9e96d82.png)

4. 取得したzipファイルを展開します。
![スクリーンショット 2016-07-01 14.24.21.png](https://qiita-image-store.s3.amazonaws.com/0/119205/974130c8-5636-96cb-9519-5137a3235490.png)

5. 新たに作られたフォルダ「apache-jena-fuseki-X.Y.Z」に移動します。
6. 「./fuseki-server」を実行して起動します。
![スクリーンショット 2016-07-01 14.28.30.png](https://qiita-image-store.s3.amazonaws.com/0/119205/a9cb0115-c6f6-1222-329f-711e8640df5b.png)

7. 「Started 2016/07/01 10:32:17 JST on port 3030」という内容の表示で止まっていれば問題なく起動していますので、ターミナルを実行しているPCのブラウザから、http://localhost:3030/ にアクセスします。
![スクリーンショット 2016-07-01 14.31.51.png](https://qiita-image-store.s3.amazonaws.com/0/119205/68605995-cd2a-e7dd-77a4-a47f1519a4b0.png)

8. 「Apache Jena Fuseki」と書かれているページが表示されると思いますので、ページの右上にある「Server status:」の右隣に表示されている丸いアイコンの色が緑であることを確認します。
Raspbian OSの設定　備忘録

#はじめに
Raspberry Piをはじめて使うことになり、設定作業を記録します。

#ハードウェア、OSなど
* Raspberry Pi 3 Model B
* MicroSDカード 32GB
* Raspbian OS
* Windows7
* Win32DiskImager
* Tera Term

#作業の大まかな流れ
1. Windows7にて
  1. Rasbian OSをダウンロード
  1. Win32DiskImagerをダウンロード
  1. MicroSDカードにRasbian OSを書き込む
  1. Tera Termをダウンロード
1. Rasberry piの起動
1. Windows7からTera TermでRasberry piに接続
1. Rasbianの設定

#作業

## Windows7にて

### Rasbian OSをダウンロード

Raspberry Piに対応するOSのダウンロードページを開く
https://www.raspberrypi.org/downloads/

今回はRASPBIANを選択する。
https://www.raspberrypi.org/downloads/raspbian/

ダウンロードの選択肢は２つある。
* RASPBIAN JESSIE
* RASPBIAN JESSIE LITE

LITEでないほうのDownloadZipをクリックしダウンロードする
2016-05-27-raspbian-jessie.zip

> NOOBSはRaspberry Piにディスプレイをつなげて、Rasbianをインストールするものらしい。

### Win32DiskImagerをダウンロード

Win32DiskImagerのダウンロードページを開く
https://osdn.jp/projects/sfnet_win32diskimager/releases/

今回はインストールせずに使えるバイナリー版をクリックしダウンロードする
Win32DiskImager-0.9.5-binary.zip

### MicroSDカードにRasbian OSを書き込む

２つのZipファイルを解凍する。
* 2016-05-27-raspbian-jessie.zip
* Win32DiskImager-0.9.5-binary.zip

1. MicroSDカードをWindows７PCに挿入。
1. Win32DiskImager.exeを起動
  1. Image FileでRasbianのイメージファイル「2016-05-27-raspbian-jessie.img」を選択
  2. DeviceでMicroSDカードを挿したドライブを指定。間違えると別のドライブをつぶしてしまう大変なことになるので慎重に。
  3. WriteボタンをクリックしてSDカードに書き込む。しばらく時間がかかる。
  4. 書き込みが終了したら、Exitボタンを押して終了
1. MicoroSDカードを抜く

### Tera Termをダウンロード

Tera Termのダウンロードページを開く
https://osdn.jp/projects/ttssh2/releases/

teraterm-4.91.exeをクリックしダウンロードする。
ダウンロード後に実行しインストールする。


## Rasberry piの起動

1. MicroSDカードをRaspberry piに挿入
2. Raspberry Piにネットワークケーブルを挿す
2. Raspberry Piに電源ケーブルを挿して電源ON


## Windows7からTera TermでRasberry piに接続

3. DHCPサーバーで、IPアドレスを確認
4. Windows7でTeraTermを起動
  1.ホストに上記IPアドレスを入力しOKボタンをクリック
  1. セキュリティの警告で続行
  2. ログインする 
     * ユーザー名：pi
     * パスワード：raspberry

## Rasbianの設定

設定画面を表示するために次のコマンドを実行
```shell-session
$ sudo raspi-config
```

| 項目名 | 説明 | 設定内容 |
|:-------|:---------|:-------|
|Expand Filesystem | SDカードの利用できるサイズを拡張 | 選択する |
|Internationalisation Options | 日本語環境| サブメニューの内容 |
| **Internationalisation Options** <br/> Change Locale | Loale |  ja_JP.UTF-8 |
| **Internationalisation Options** <br/> Change Timezone <br/> | timezone |  Asia <br/> Tokyo |
| **Internationalisation Options** <br/>Change Keyboard Layout | keyboard | 対応するキーボード |
傾斜計 > #include <ESP8266WiFi.h>によるエラー: 'min' was not found > includeの場所を下の方にする

## 問題

http://qiita.com/7of9/items/b8a31f470555fb845cb5
にて試しているMPU-9250用のサンプルコード (MPU6050_DMP6)。

これに`#include <ESP8266WiFi.h>`を追加して、WiFi通信をしようとしている。

スケッチの1行目に`#include <ESP8266WiFi.h>`を追加すると以下のようなエラーが出る。

```
error: 'min' was not declared in this scope

             getFIFOBytes(fifoBuffer, min(fifoCount, 128)); // safeguard only 128 bytes

...

                                                        ^
...\include\c++\4.8.2\bits\stl_algobase.h:239:5: note:   'std::min'

     min(const _Tp& __a, const _Tp& __b, _Compare __comp)

     ^

exit status 1
コンパイル時にエラーが発生しました。

  This report would have more information with
  "コンパイル中の詳細な出力を表示する"
  enabled in File > Preferences.
```

## 対処

`#include <ESP8266WiFi.h>`する場所を下の方(Wire.hのincludeの下)にするとエラーが出なくなった。

```c
...
#if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE
    #include "Wire.h"
#endif

#include <ESP8266WiFi.h>
...
```

includeの順番によってエラーが出るというのがどうもよくない。
Twin pattern

GoFにはないようだ。

擬似コード

```java

abstract class A
{
   newItemB() {
      B b = new B();
      C c = new C();
      b.twin = c;
      c.twin = b;
      return b;
   }
}

class B extends A
{
  C twin;
}

class C extends D
{
  B twin;
}

```

これでAとDの多重継承を模倣している。
これをtwin objectと呼ぶ。


以下を参照した。

Twin pattern (Mössenböck)
https://en.wikipedia.org/wiki/Twin_pattern
http://ssw.jku.at/Research/Papers/Moe99/Paper.pdf
Cisco Catalyst [運用]

基本的なコマンドやトラブルシューティング時に使用する手順等

## 運用

#### ページ送りを無しにする

(Configの反映無し)

```cmd
terminal length 0
```

#### telnetでもリアルタイムでログを表示

(Configの反映無し)

```cmd
terminal monitor
```

#### who

(他のログイン中のユーザー確認)

```cmd
show users
```

#### grep

```cmd
| include AAA|BBB
| inc AAA|BBB
```

#### grep -v

```cmd
| exclude *****
```

#### Configアップロード

```cmd
copy startup-config tftp://192.168.40.7/Catalyst/TEST_config.text
```

#### Configダウンロード

```cmd
copy tftp://192.168.40.7/Catalyst/TEST_config.text flash:config.text
```

#### タグVLANを追加

```cmd
switchport trunk allowed vlan add 103
```

#### タグVLANを除去

```cmd
switchport trunk allowed vlan remove 103
```

## ミラーポートの設定

```cmd
ソース設定
monitor session 1 source interface Fa0/1
ミラーリング先の設定
monitor session 1 destination interface Fa0/2
```

```cmd
ソース設定 rx 受信パケット のみ [スイッチ] ← [PC]
monitor session 1 source interface Fa0/2 rx
ソース設定 tx 送信パケット のみ [スイッチ] → [PC]
monitor session 1 source interface Fa0/2 tx
```

## インターフェース関連

#### ポートの負荷や信頼性の確認

```cmd
show interfaces | inc reliability
```

|内容|意味|
|:---|:---|
|reliability 255/255|5分間監視の中での信頼性|
|txload 1/255|5分間監視の中での送信負荷|
|rxload 1/255|5分間監視の中での受信負荷|

* ポート100Mbpsで例えば「127/255」となっている場合、
5分間平均で帯域半分の約50Mbpsで使用している状態を差す。

#### ポートが最後に使用された時間を確認する

```cmd
show interfaces | inc Last input
```

#### ポートステータス(VLAN,速度情報等確認)

```cmd
show interfaces status
```

#### 設定されているIPアドレスやその他の情報の要約表示

```cmd
 show ip interface brief
```

#### コメントの確認

```cmd
 show interfaces description
```

#### リンクアグリゲーションの状態確認

```cmd
 show etherchannel summary
```

#### LEDランプの確認

```cmd
 show hardware led
```

#### パケットのクリア

```cmd
 en
 clear counters
```

#### パケットの監視

```cmd
 show interfaces counters
 show interfaces counters errors
```

#### パケットの監視 (絞り込む)

```cmd
 show interfaces counters | include Port|Gi1/0/1|Gi1/0/2
 show interfaces counters errors | include Port|Gi1/0/1|Gi1/0/2
```

#### パケット数確認

```cmd
 show interfaces stats
```

#### 接続されてるCisco製品を調べる

```cmd
 show cdp neighbors
 show cdp neighbors detail
 ⇒「no cdp enable」している製品は検出しない
```

#### 接続されてるMACアドレスを調べる (FDBの確認)

```cmd
 show mac-address-table
 show mac address-table
```

#### CPU情報

```cmd
 show controllers cpu-interface
```

#### 温度のチェック ※物による

```cmd
 show env temperature status
```

#### 時刻の確認

```cmd
 show clock detail
```

**その他 [#i1435328]
#### Config確認

```cmd
 show run
```

#### 設定中にふとConfigを確認したくなったら

```cmd
 do show run
 ⇒do を先頭を付ける事によってConfigモードでも通常モードのコマンドが入力できる
 　tab、"?"は使えない
```

#### バージョン確認

```cmd
 show ver
 show version
```

#### 本体とSFPのシリアルNo.を調べる

```cmd
 show inventory
```

#### シリアルNo.を回収

```cmd
 show module
 show idprom chassis
 show idprom power-supply 1
 show idprom power-supply 2
```

#### telnet

```cmd
 telnet IP
```

#### telnet途中で中断

```cmd
 [Ctrl] + [Shift] + [6] の後に [x]
 戻るときは [Enter] もしくは resume と入力
```

#### 他ユーザーを落とす

```cmd
 show user のセッション番号を確認
 clear line XX
```
Cisco Catalyst L2SW [構築]


その辺に転がっている少し古めのCatalystを再生することが多いので覚書  
尚、わざとデフォルトゲートウェイを設定しない(セキュリティ向上のため機器管理用のVLANを展開して、足を出しているLinuxでしかtelnetが出来ないようにしている)等しています。  
(Catalyst 2940,2950,3550,3560,3750等のIOS12.x系)

## 初期化

```cmd
write erase
delete vlan.dat
reload
```

## 構築1
- 一時的な時刻の設定

```cmd
en
clock set 10:00:00 10 Feb 2015
```

- 時刻関連

```cmd
conf t
clock timezone JST 9
service timestamps debug datetime localtime
service timestamps log datetime localtime
```

- ホストネーム

```cmd
hostname TEST
```

- Webログインを停止

```cmd
no ip http server
no ip http secure-server
```

- ミスしたコマンドをドメイン扱いして検索しにいかないようにする

```cmd
no ip domain-lookup
```

- パスワードの設定 (enable)

```cmd
service password-encryption
enable secret ******
```

- パスワードの設定 コンソール・telnet

```cmd
line con 0
 logging synchronous
 width 512
line vty 0 15
 password ******
 login
 logging synchronous
end
```

- 一度保存

```cmd
wr mem
```

休憩

## 構築2

- VTPの設定

```
VTPモードは使用しない  
さらにVLAN情報がvlan.datだけでなくConfigに載るようにする
```

```cmd
conf t
vtp mode transparent
```

- VLANの設定

```cmd
vlan 40
 name NET40
vlan 101
 name VLAN101
vlan 102
 name VLAN102
```

- IPの設定

```cmd
int Vlan 40
 ip address 192.168.40.11 255.255.255.0
 ip route-cache
 no ip proxy-arp
 ```

- syslogの設定

```cmd
logging facility local1
logging 192.168.40.6
logging 192.168.40.7
```

- snmpの設定

```cmd
snmp-server view iso iso included
snmp-server community hoge-r view iso RO
```

- NTPの設定

```cmd
ntp server 192.168.40.6
ntp server 192.168.40.7
```

- 終了

```cmd
end
wr mem
```

休憩

## 構築3

- 下流ポートのリンクアップを早くする

```
switchport mode access を設定したポートに対して、デフォルトでprotfastを設定
(30秒ぐらい→5秒ぐらいに短縮)
```

```cmd
conf t
spanning-tree portfast default
```

- ループ対策

```cmd
spanning-tree portfast bpduguard default
```

- VLANのアサイン

```cmd
int Gi0/1
 switchport trunk encapsulation dot1q #物による#
 switchport trunk allowed vlan 40,101,102
 switchport mode trunk
 switchport nonegotiate
int range Fa0/1 - 4
 switchport mode access
 switchport access vlan 101
int range Fa0/5 - 8
 switchport mode access
 switchport access vlan 102
end
wr mem
```

終了。  
とりあえず、ここまですればエッジスイッチとしての役目は果たしてくれる。
Rubyでミリ秒、マイクロ秒単位のTimeを扱う

## ミリ秒を含む文字列に変換

* Time#iso8601
* TIme#xmlschema

```ruby
require 'time'

time = Time.now
=> 2016-07-01 13:03:00 +0900

# マイクロ秒部分を整数で取得
time.usec
=> 193967

# iso8601フォーマットでマイクロ秒含めて表示
time.iso8601(6)
=> "2016-07-01T13:03:00.193967+09:00"

# 引数に小数点以下の桁数を入れるのでミリ秒なら3を指定する
irb(main):009:0> time.iso8601(3)
=> "2016-07-01T13:03:00.193+09:00"

# xmlschemaメソッドも同義
irb(main):010:0> time.xmlschema(3)
=> "2016-07-01T13:03:00.193+09:00"
```

## 文字列からTimeを生成 

ISO8601フォーマットの文字列から生成する
* Time.iso8601
* Time.xmlschema

より多様なフォーマットに対応できる
* Time.parse

```ruby
time = Time.iso8601("2016-07-01T13:03:00.193967+09:00")
#=> 2016-07-01 13:03:00 +0900
time.usec
#=> 193967

time = Time.xmlschema("2016-07-01T13:08:56.629+09:00")
#=> 2016-07-01 13:08:56 +0900
time.usec
#=> 629000

time = Time.parse("2016-07-01T13:12:59.035692+09:00")
#=> 2016-07-01 13:12:59 +0900
time.usec
#=> 35692
```
Mac | コンソール | $ pbcopy をエイリアス登録してクリップボードへのコピーを簡単に

お気に入りエイリアス。

```bash
$ alias p='pbcopy'
```

pbcopy はコンソールの標準出力を mac のクリップボードに記憶してくれる。
だが、やや長いので 1文字だけで打てるようにする。

# 例

## コンソール

```bash
$ echo 'M.C.A.T funky! M.C.A.T is too funky!' | p
```

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/f8f07a55-9e45-30fa-29af-efb0db3b6b79.png)

## 他のテキストエディタ

`Command+V` でペースト。

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/a98bc6bf-a15c-5363-b698-bdd88764e6c1.png)

# 環境

- Mac OSX El Capitan 10.11.5








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
vmware > VMware Tools64.msi not found

```txt:動作環境
OS X El Capitan
```

[Mountain LionからEl CapitainへのOS変更](http://qiita.com/7of9/items/8a46cf01f36d1380fe68)にともない、VMware Fusionのバージョンを6から8に変更した。


Windows 8.1proのゲストOSにてVMWare Toolsの再インストールをしようとすると以下のエラーとなった。

> VMware Tools64.msi not found

以下の情報を見つけた。
https://kb.vmware.com/selfservice/microsites/search.do?language=en_US&cmd=displayKC&externalId=1012693

上記を参照し、以下のように対応した。OSはWindows 8.1 pro(64bit)。

1. VMWare Toolsの再インストールを実行
  - Dドライブを開く旨が表示されクリックしてDドライブのマウントをする
2. コマンドプロンプトを開き以下を実行し、古い情報を消す
  - D:
  - setup64 /c
3. VMWare Toolsの再インストールを実行し、標準のインストールをする


Windows7 pro(32bit)のゲストOSでは上記の問題は発生しなかった。
Delphi使いがプログラミング言語３種類をテキトーに解説

現在プログラミング言語は３種類存在すると言われています（Delphi界）
（実際に利用されているプログラミング言語の数はその3分の1くらいです）

1.Pascal
教育目的で作られた構造化された言語。
代入が := で = を代入記号にした C より好き。むしろ大好き。
Turbo Pascal でおなじみ。

2.Object Pascal
Pascal にオブジェクト指向を導入した言語。
class が使えて大好き。

3.Delphi Language
Delphi 使いが使う魔言語。
大好き

4.Object Pascal
名前が元に戻った。大好き。
Excelファイル内に勝手に増殖したセルの書式をまとめて削除する方法

##「セルの書式が多すぎるため、書式を追加できません」

Excelの異なるバージョン間で交互に編集したり、Excelファイル間でセルのコピーを繰り返していると、「セルの書式が多すぎるため、書式を追加できません」とメッセージボックスが出て編集できなくなります。**ツールバーのホーム：スタイル欄** で一覧を確認すると、下図のように大量のユーザ設定が登録されています。
![excel-cellstyle-big-junk.png](https://qiita-image-store.s3.amazonaws.com/0/130677/3b9b346a-f0c8-8b14-9aaf-2b36f5204be8.png)

## 身に覚えのない「スタイルのユーザ設定」
なるほど、確かに多すぎる。でも、こんなユーザ設定を登録した覚えはありません！
よく見ると `"20% Accent1 1", "20% Accent1 2", "20% Accent1 3" ...` といった具合に、元のスタイル名の末尾に数字が付いた別名が延々と並んでいます。これは、Excelファイル間でセルをコピーする際に、コピー元ファイルが持つスタイル設定を自動的にインポートしているためと推測できます。同じスタイル名かつ同じ設定内容ならばマージしているようですが、なにかの加減でマージに失敗すると別名で登録されるため、ユーザ設定がどんどん増殖してゆきます。

この問題を解決するには、スタイルの登録を減らすしかありません。
しかしならがら、まとめて削除する手段がなく、ちまちまと一個づつ削除する不毛な作業を強いられます。
![excel-cellstyle-each-delete.png](https://qiita-image-store.s3.amazonaws.com/0/130677/86949d0f-4fe8-a22b-000f-682252ac901c.png)

https://support.microsoft.com/ja-jp/kb/213904 によれば、「セルの書式が多すぎる」エラーが出るのは、Excel2003なら登録数が4000個、Excel2007以後なら登録数が64000個を超えた場合のようです。となると完全に綺麗にするには何千何万回も削除操作しなければなりません。そんな膨大な手作業は無理！

## デフォルトのスタイル以外を全部削ってしまうマクロ
そこでマクロを使って、デフォルト(ビルトイン)のスタイルのみ残し、他を全部削ってしまうことにします。
自分で作成して登録したスタイル（とそのスタイルを設定したセルの書式）もばっさり削除されますが、後から再設定すれば良いと割り切りました。

先人を求めてネット検索すると、マクロが見つかりました。
https://gist.github.com/YoshihitoAso/311b0a1d40174e1bfdae

## 複数のExcelファイルを一括処理するvbs
見つけたマクロのgistを[fork](https://gist.github.com/hkuno9000/3f0cd3a0437d149276ca)して、複数のExcelファイルを一括処理できるように改造してみました。

- 下記コードを拡張子vbsをつけてファイル保存し、そこへExcelファイルをドラッグドロップすれば、Excelが起動して削除を始めます。
- 登録スタイル数によりますが、1ファイルにつき10分以上かかるので時間に余裕があるときに実行しましょう。事前のバックアップも忘れずに。
- 実行前にExcelを起動してウィンドウサイズを小さくし、ツールバーを畳んでおくと多少早くなる気がします。
- コード中の`N.Delete`のコメントアウトを外せば名前定義も同時に削除できます。
- Windows7/8/10 + Excel2010 にて動作確認しました。

```vbnet:excel-clear-junk-style.vbs
Set objExcel = CreateObject("Excel.Application")
objExcel.Visible = True

For Each strFname In WScript.Arguments
	Set objDoc = objExcel.Workbooks.Open(strFname)
	' clear all names (comment out)
	For Each N In objDoc.Names
''		N.Delete
	Next
	' clear all user style
	For Each S In objDoc.Styles
		If Not S.BuiltIn Then
			S.Delete
		End If
	Next
	objDoc.Save
	objDoc.Close
	Set objDoc = Nothing
Next

objExcel.Quit
```

削除が終わり、デフォルト設定のみスタイル欄となりました。スッキリして気持ち良いです。
![excel-cellstyle-clean.png](https://qiita-image-store.s3.amazonaws.com/0/130677/8f6a3a48-a539-72c4-0779-9e9bdb01e6bb.png)
OS X > Mountain LionからEl Capitanへ (クリーンインストール)

```txt:動作環境
MacBook Air 2013mid (MD760J/A)
MacOS X Mountain Lion
```

http://qiita.com/7of9/items/83aa51489bb5dfafe4f3
にて気になっていたMountain Lionのサポート切れ。
macOS Sierraが発売されるとその安定版が出るまでに月日がかかりそうなので、このタイミングでEl Capitanにした。

## 手順

1. vmイメージだけ外付けHDDにコピー
2. vmイメージ以外をTime Machineでバックアップ
3. USBメモリに用意したインストーラでEl Capitanをクリーンインストール
  - クリーンインストール中にTime Machineから関連データをコピー (指示に従い)
4. KeyRemap4Macbookをアンインストールし、Karabinerをインストール
  - KeyRemap4Macbookの設定が残っていて再設定不要だった
5. VMWare Fusion6をアンインストールし、VMWare Fusion8(購入した）をインストール
6. vmイメージを外付けHDDからコピー
  - 各ゲストOSに対してVMWare Toolsを再インストール
7. Unity 5.3.5f1をインストール
  - Unity 5.1.3-f1からの更新

## Unity + Android Studio

- Unity: 5.1.3-f1から5.3.5-f1へ変更
- Android Studio: 1.3.1のまま

上記の環境でスマホ304SH上へソフトのダウンロード、実行で問題がないか確認した。

UDP通信でエコーバックする[udpEcho @ gibhut](https://github.com/yasokada/unity-150829-udpEcho)
で試した。

問題なく動作した。

## その他

- SourceTree
  - Moutain Lionで使っていたバージョンのまま (v2.0.5.5)。
  - Time Machineにより設定変更などなくそのまま動作している。
- ideone
  - syntax highlight関連のバグは見られない
- Sublime Text 2
  - 今のところ問題なし
- Evernote
  - 今のところ問題なし
- LTSpice
  - 今のところ問題なし
- Fritzing
  - 今のところ問題なし
- Microsoft Remote Desktop
  - 起動しか確認してない
- Skitch
  - 今のところ問題なし
- Caffeine
  - 今のところ問題なし
- coconutBattery
  - 今のところ問題なし
- Cyberduck
  - 未調査
macアドレスとslackを活用した在室確認システム作ってみた

システムというほどのものでもないですけど、誰でも出来ると思うのでぜひ。

# macアドレスの取得
活動場所にあるネットワーク(Wi-Fi)を利用する端末のMACアドレスを取得するために`nmap`と`arp`を利用しました。
`nmap -sP 192.168.1.0/24`でローカルで利用されている最新のIPアドレスを取得し
直後に`arp -a`を実行する事で接続している端末の最新のmacアドレスを持ってくる事が出来ます。
更に正規表現を利用する事で`arp`の実行結果からmacアドレスだけ抜き出しました。

```ruby:slack.rb
def network 
    %x[nmap -sP 192.168.1.0/24] 
    %x[arp -a].gsub(/\n/,'').scan(/[0-f]+:[0-f]+:[0-f]+:[0-f]+:[0-f]+:[0-f]+/)
end
```

#取得したmacアドレスとユーザーの比較
予め、活動場所に在籍する人の名前とmacアドレスを紐付けたDBを作成しておいて（自分は`sqlite3`を使った）、ActiveRecordを利用して取得してきたmacアドレスと比較します。

```rb:slack.rb
class Mac < ActiveRecord::Base
end
users = Mac.where(address: network)
```

※このとき使うmacアドレスはスマートフォンなど、携帯するものが良いかと。活動場所にあるデスクトップPCのmacアドレスでは在室確認の意味を成さないです。
※自分はこの`slack.rb`を5分毎に実行させる様にしています。実行頻度については`nmap`や`arp`コマンドを使うので鯖管と相談する必要があるかと。

#取ってきた名前をスプレッドシートに記録
活動場所は外部に出ているサーバーが無いので、`google-drive`というgemを利用して比較した名前をGoogleスプレッドシート上に記録させる様にしました。サーバーがあればそこにデータを表示させるページでも作って公開すれば良いと思います。

```ruby:slack.rb
session = GoogleDrive.saved_session("config.json")
ws = session.spreadsheet_by_key("GASのtoken").worksheets[0]
if users.count == 0 then
  ws[1,1] = ""
  ws.save
else
  users.each_with_index do |addr,idx|
    ws[idx+1,1] = addr.name
    if idx == users.count - 1
      ws[idx+2,1] = ""
    end
  end
  ws.save
end
```

#Slackのチャットに合わせてスプレッドシート上の内容を投稿させる
GoogleAppScriptにそれ用の関数を書きました。（Qiitaに投稿されてたSlack用ライブラリを使いました）
この際、Slack側でtokenを取得しておく必要があり、その際にどのチャットでPostさせるか決める必要があります。
（自分はコマンドっぽく`stay?`にしてみました。）

```js
function doPost(e) {
  var slackApp = SlackApp.create("token");
  var data = gss();
  var message = "活動場所に居るメンバー\n";
  data.some(function(val,index,ar){
    if (val == "") {
      message +="\n";
      return true;
    }
    message += val+"\n";
  });
  if(message.length <= 13){
    message = "活動場所には誰も居ません";
  }
  slackApp.chatPostMessage("流すチャンネル名",message, {
    username : "BOTのユーザー名",
    icon_emoji : ":house:"
  });
}
function gss(){
  var url = "スプレッドシートのURL(#gid=0まで)";
  var spreadsheet = SpreadsheetApp.openByUrl(url);
  var sheets = spreadsheet.getSheets();
  var sheet = sheets[0];
  var startrow = 1;
  var startcol = 1;
  var lastrow = sheet.getLastRow();
  var lastcol = sheet.getLastColumn();
  var sheetdata = sheet.getSheetValues(startrow, startcol, lastrow, lastcol);
  return sheetdata;  
}
```

#稼働状況
機密文書みたいな形になってしまいましたが勘弁してください。
![screenshot4.png](https://qiita-image-store.s3.amazonaws.com/0/51275/bc7844ca-5542-089c-24b1-6aacf1538c29.png)


# 背景と課題
自分が組織に所属しはじめた時にはRaspiを利用した光センサーによる在室確認システムが動いていて、Web上で在室状況をチェックでき、グラフで判断出来て便利でした。一方で、電気をつけっぱなしにして消える人や、センサーの感度が悪くなる経年劣化から、誰も管理しなくなったので、タイトルのとおり作ってみたのですが、毎日コマンドが叩かれていて作ってよかったかな、と。問題は外部からアクセス出来るサーバーを用意出来ないのとmacアドレスを差し出してくれない先輩が居るという2点でしたが、前者はGASやGSSを利用する事で解決出来ました。後者に関してはSlackのrtm apiを利用する事で解決出来そうです…。
UnityでUnrealEngine4風の絵作りを目指す

###はじめに
端的に言うと、Unityでデスクトップのコンテンツを制作するときは、ライティングパイプラインを**リニア**にしたほうがいい感じになるってことです。

バージョン
UnrealEngine4.12.4
Unity 5.4.0b17


## 初期状態での比較
※完全な比較ではないことに注意

|          |**UnrealEngine**          |
|----------|--------------------------|
|Skyboxなし  　|<img src=https://qiita-image-store.s3.amazonaws.com/0/64805/f7781969-2064-7718-eac7-b67a32106b82.png width=700px>     | |
|Skyboxあり　　|<img src=https://qiita-image-store.s3.amazonaws.com/0/64805/349f2ed5-5cb6-6ce3-4b72-fcba6e5f92b0.png width=700px>|


|**Unity** | ガンマパイプライン |　リニアパイプライン |
|---|--------------------------|---|
|デフォルトcubemap|<img src=https://qiita-image-store.s3.amazonaws.com/0/64805/25cd42d4-0fef-30e2-c3af-2014a5afc549.png width=700px>       | <img src=https://qiita-image-store.s3.amazonaws.com/0/64805/21a3daf5-1369-10d8-53d9-323e1d394d01.png width=700px>  |   |
|カスタムcubemap  | <img src=https://qiita-image-store.s3.amazonaws.com/0/64805/97f3d2d9-cf00-af54-082d-a417c1dd943b.png width=700px>| <img src=https://qiita-image-store.s3.amazonaws.com/0/64805/66d0412f-7d35-3d57-0b9a-d32bbc3dc8f5.png width=700px>  |   |

Unityの初期状態ではガンマパイプラインになっており、白飛びが目立つ、更にアンチエイリアスなどがかかっていないため画面がUnrealEngineより劣って見えてしまう

パイプラインの設定を変えるだけで光を抑えることができ、Unityでよりリアルな画面ができる

最終的に、UnityでアンチエイリアスやSSAOなどを入れていけばUnrealEngine4風の画面に近づけることができる
<img src=https://qiita-image-store.s3.amazonaws.com/0/64805/b3c20d1f-07a1-521e-825e-4e91409797e3.png width=400px>
## 変更方法
PlayerSettingのColorSpaceをいじる
![スクリーンショット 2016-07-01 12.10.48.png](https://qiita-image-store.s3.amazonaws.com/0/64805/907c2430-918d-2d67-7b7d-fde64b07e5c1.png)

### 注意
モバイルではリニアパイプラインはサポートされていないので注意！

## 参考
[Unityリニアレンダリング　リファレンス](http://docs.unity3d.com/ja/current/Manual/LinearLighting.html)
gitlabからリポジトリをクローンする際にタイムアウトする

gitlabからリポジトリをtortoiseGitでクローンする際エラーが発生する事象に対処した。
gitlabはAWSのEC2にインストールしてある。
***

1. エラー内容
`it.exe clone --progress -v "http://mgr.example.com/jp/test_api.git" "C:\Users\user\Desktop\git2\test_api"
Cloning into 'C:\Users\user\Desktop\git2\test_api'...
POST git-upload-pack (200 bytes)
remote: Counting objects: 10310, done.
remote: Compressing objects: 100% (8240/8240), done.
fatal: early EOF
fatal: The remote end hung up unexpectedly
fatal: index-pack failed`

2. 原因は恐らくリポジトリサイズが大きいためタイムアウトしている。

3. gitlab側でタイムアウト時間を長くする
`# vi /etc/gitlab/gitlab.rb`
`unicorn['worker_timeout'] = 60 → 3000`
`# gitlab-ctl reconfigure`
`# gitlab-ctl restart`

終わり
SQLAlchemyでセッションとリフレクションの利用

すでに生成済みのテーブルに対して処理がしたくてSQLAlchemyでリフレクションしたテーブルをセッション管理しようとした時に変にはまったので、まとめ。
結論的にはautomap_base()を使えばいいだけ。

尚、sclalchemyを全然理解できていないので、指摘歓迎。

## 前提条件

- mac(OS X El Capitan バージョン 10.11.5）
- python 2.7.9
- MAMP
- mysqlでデータベース、テーブル生成済み

## ソースコード例

```python:session.py
# -*- coding: utf-8 -*-
import sys
import sqlalchemy
from sqlalchemy.ext.automap import automap_base
from sqlalchemy.orm import sessionmaker

def main(sys_argv):
    # MAMP + Mysql-Python環境でのエンジン生成方法
    engine = sqlalchemy.create_engine(
        "mysql://user_name:password@localhost/db_name"
        + "?unix_socket=/Applications/MAMP/tmp/mysql/mysql.sock",
        echo=False)

    # セッション開始
    session = sessionmaker(bind=engine)()

    # mappedなinstanceをリフレクションを使った上で生成
    base = automap_base()
    base.prepare(engine, reflect=True)

    # 適当にやりたいことを
    # your_tableテーブルからdelete_flagが0なidを表示するなら
    your_table = base.classes.your_table
    result = session.query(your_table).filter(delete_flag == 0)
    for row in result:
        print row.id   

    # セッション終了
    session.close()

if __name__ == '__main__':
    main(sys.argv)

```
gitstatsでリポジトリの統計を可視化してみよう

gitリポジトリの情報をグラフにしてくれる[gitstats](http://gitstats.sourceforge.net/) を導入してみました。

tagごとのコミット数とか、１日のうちのどの時間にコミット数が多いかとか、色々わかって便利です。
開発の速度や、コミットの粒度、システムの規模感なども見えてくるし、結構簡単にいれられるのでおすすめです。

## インストール手順

若干、強引ですが... 
EPEL使えるなら、yum install できるのでそっちの方が手っ取り早いでしょう。

```
cd /usr/local/src
sudo git clone  git://github.com/hoxu/gitstats.git
cd /usr/local/bin
sudo ln -s /usr/local/src/gitstats/gitstats gitstats
cd /usr/local/share
sudo ln -s /usr/local/src/gitstats gitstats
```

`gitstats [リポジトリ] [出力先]` で、出力先にhtmlファイルなどが作成されます。

自分のローカルマシンなら、ブラウザで見れますし、apacheなどがあるサーバなら `Alias /gitstats /var/html/hogehoge` などとして公開できます。



## どんな感じのができるの？

古いときのものですが、本家にも参考例サイト(http://gitstats.sourceforge.net/examples/) があがっています。

ぐぐると、意外とこれをつかっているプロジェクトが見つかったりします。

* https://curl.haxx.se/gitstats/index.html
* https://osm.etsi.org/gitstats/stats/openmano.git/
* https://magit.vc/stats/index.html
* https://www.consultron.com/gitstats


## 参考サイト

http://portaltan.hatenablog.com/entry/2015/07/16/120220

http://www.moongift.jp/2012/02/20120209-2/
textarea 自動リサイズ

## textarea 自動リサイズ
```hoge.js
$(document).ready(function(){
  //textareaフォーカス時に文字数の高さ見てリサイズ
  $('textarea').focus(function(e) {
    //文字数から高さ取得
    var height=this.scrollHeight + 'px';
    $(this).css("height", height);
    })
    .blur(function(e) {
    $(this).css("height", "auto");
  });
});
```
Laravelでバリデーションルールを配列で指定する方法

Laravelのバリデーションって書きやすくて良いいですよね。
かゆいところに手が届く感じ。

どんな使い方が出来るかはドキュメントに詳しく記載されているのですが、
**バリデーションルールの指定方法には大きく２タイプ**あるものの片方しか紹介されていなくて、いつも調べる事になるのでメモメモ。

## 複数条件をパイプで繋ぐタイプ
これはドキュメントにも例が載っているタイプ。

```php
$rules = [
    'name'         => 'required|max:40',
    'gender'       => 'required|in:male,female',
    'age'          => 'digits_between:0,150',
    'use_discount' => 'boolean',
    'coupon'       => 'required_if:use_discount,1|regex:/^[0-9a-zA-Z]{20}$/',
];
```
各情報に対して、複数のルールを「|」(パイプ)でつなげます。
とてもシンプルで良いですね。

## パイプの代わりに配列で指定するタイプ

正規表現でパイプとか使う場合にはこちらのタイプを使います。ドキュメントにも書いてある
http://readouble.com/laravel/5/1/ja/validation.html#rule-regex

でも「配列で指定する必要がある」って言われても例が無いととっつきにくいのよね

```php
$rules = [
    'name'         => ['required', 'max:40'],
    'gender'       => ['required', 'in:male,female'],
    'age'          => ['digits_between:0,150'],
    'use_discount' => ['boolean'],
    'coupon'       => ['required_if:use_discount,1', 'regex:/^[0-9a-zA-Z]{20}$/'],
];
```

動的に条件を追加したい時とかはこちらのタイプのほうが使いやすいので、そういった視点でどちらのタイプを使うか選んでもいいと思う。
IBM Watsonの使用事例（Webサイト・アプリ）

IBM Watsonの事例のメモになります。興味ある方の参考になれば幸いです。

#事例一覧
・[Find the Perfect Jacket Using Watson Personal](https://www.thenorthface.com/xps)
気候や条件に合わせたジャケットを提案してくれる

・[空色](http://solairo.co.jp/)
もともとチャットで営業。チャットパターンをそれをカテゴリ分類し、
購買に繋がりやすいパターンを見つけて対話を実現とのこと。CV率も結構高いとか。

・[FLUID](https://www.fluid.com/)
オンラインショッピング関連

・[EDGE UP SPORTS](http://edgeupsports.com/#/home)
スポーツ選手の分析

・[GO MOMENT](http://www.gomoment.com/)
ホテルのカスターマーサービス、チャットアプリ。
Wi-Fiのパスワードとか対応が決まっているやり取りをbot化

・[WayBlazer](http://wayblazer.com/)
旅行関連

・[Welltok](http://welltok.com/)
ヘルス関連

・[ファッション人工知能アプリ｜SENSY](http://sensy.jp/)

・[FINC](https://finc.com/)
個人の管理だけでなく、栄養士の教育などにも使用
（ベテランの栄養士の知識を覚えさせ、新米への指導などにも使用しているらしい）

・[変なホテル](http://www.h-n-h.jp/)

・[メディアマート](https://mediamart.jp/)
画像認識による心臓MRIの診断を提案


***

やっぱりデータとかパターンを持っているところが多いですね。
WKWebviewを使って、ネイティブ部分とHTMLを同居させて、画像をバインバインさせてみる。

こんな感じにバインバインさせてみたかった。よく見ますよね、こういうアプリ。

![7月-01-2016-11-38-53-compressor.gif](https://qiita-image-store.s3.amazonaws.com/0/24308/5cd5a75a-efe9-74a9-d8b2-9271a5864e2c.gif)


WKWebViewベースで、画像はネイティブ部分に置いて、UIScrollViewDelegateの変化度で反応させます。

コードはこんな感じです。
ポイントは、

- webView.scrollView.backgroundColorを透明にすること
- webView.scrollView.contentInsetでcontent部分をズラすこと

かな。

```swift
import UIKit
import WebKit

class ViewController: UIViewController, UIScrollViewDelegate {

    var webView = WKWebView()
    let topMargin : CGFloat = 300
    let sampleImg = UIImageView(image: UIImage(named: "sample"))
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        webView.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)
        webView.scrollView.backgroundColor = UIColor.clearColor()
        webView.scrollView.contentInset.top = topMargin
        webView.scrollView.delegate = self
        
        self.view.addSubview(sampleImg)
        self.view.addSubview(webView)
        
        let fileName: String = "template"
        let filePath: String = NSBundle.mainBundle().pathForResource(fileName, ofType: "html")!
        let text = try! String(contentsOfFile: filePath)
        webView.loadHTMLString(text, baseURL: nil)
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
    func scrollViewDidScroll(scrollView: UIScrollView) {
        let movingDiff = (scrollView.bounds.origin.y + topMargin) * -1
        print(movingDiff)
        if movingDiff > 0 {
            let retio = 1 + (movingDiff / 100);
            sampleImg.transform  = CGAffineTransformMakeScale(retio, retio);
        }
    }

}
```
MySQLの設定の区切り文字はアンダースコアとハイフンどちらを使うべきか


MySQLの設定を検索していたら、設定項目の区切り文字がアンダースコアのものとハイフンのものがあった。
そもそもデフォルトの設定ファイルの時点で混在している（`innodb_buffer_pool_size`はアンダースコアだが`log-error`はハイフンだった）。なんだこれは。

マニュアルを見ると、
[MySQL :: MySQL 5.6 リファレンスマニュアル :: 4.2.8 プログラム変数の設定へのオプションの使用](http://dev.mysql.com/doc/refman/5.6/ja/program-variables.html)

> お好みで、変数名内の下線をダッシュとして指定できます。次のオプショングループは同等です。どちらもサーバーのキーバッファーを 512M バイトに設定します。

```
[mysqld]
key_buffer_size=512M

[mysqld]
key-buffer-size=512M
```

とあり、ハイフンでもアンダースコアでも同等のようだ。

ではなぜこんなことになっているのか。

[mysqlのconfについて - MySQL | 【OKWAVE】](http://okwave.jp/qa/q7387058.html)によると、
「アンダースコアとハイフンはオプションファイル内では等価、ただし起動オプション指定ではハイフンを、mysqlクライアントからshowやsetでシステム変数を参照するときはアンダースコアでないと認識できない」とのこと。
このようにアンダースコアとハイフンを使い分けなければならなかった事情があり、そのためオプションファイル内でも混在可能になっていると思われる。


ただ5.6現在（上記のマニュアル）では、

```
shell> mysql --max_allowed_packet=16M
```

とコマンドラインオプション指定でもアンダースコアを使っており、アンダースコアでも使えるようになった（もしくは上の回答が間違っている）ようだ。

まとめると、設定ファイルではハイフンでもOKだが、mysqlクライアントから参照するときはハイフンは使えない（アンダースコアのみ）。
というわけでアンダースコアに統一でよさそう。
（一般的な挙動ではアンダースコアの方がダブルクリックしたときに一気に選択されてくれて便利だしね）
さくらのクラウドにRe:dashをインストールしてみた

Rebulid.fmでも話題に上がっていたデータ可視化のOSSのRe:dashを使ってみようと思ったのですが、意外とインストールが難しかったのでメモ書きを残しておきます。

[Re:dash](http://redash.io)

今回はさくらのクラウドで提供されているUbuntu 16.04にインストールしてみました。

```
sudo apt -y update
sudo apt -y upgrade

sudo apt -y install libffi-dev

sudo apt -y install python-pip
sudo pip install --upgrade pip
sudo pip install flask-admin
sudo pip install peewee
sudo pip install wtf-peewee

git clone https://github.com/EverythingMe/redash.git
sudo bash redash/setup/ubuntu/bootstrap.sh
```

ちょっと時間がかかりますがインストールが完了後、IPアドレスに対してブラウザでアクセスするとRe:dashのログイン画面ができてます。
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/100935/d5383df5-0fee-e691-4b89-51a251a2274e.png)

環境が出来たのでこれを使って可視化にチャレンジしたいと思います