OmniAICreator/Qiita-1.07M huggingface dataset:
DD-WRT設定 基本タブ

はじめに
========================================

DD-WRTの設定をまとめています。連載です。

- [DD-WRT設定を公開します](http://qiita.com/ryskiwt/items/6cc329a15f10df53a961#_reference-aabc0af3c3726d9baec5)
- **DD-WRT設定 基本タブ** <- いまココ
- [DD-WRT設定 無線LANタブ](http://qiita.com/ryskiwt/items/06573ac175a53da3e348)
- [DD-WRT設定 ネットワークタブ](http://qiita.com/ryskiwt/items/9eaafe30a56e5ca0ecb5)
- [DD-WRT設定 セキュリティタブ](http://qiita.com/ryskiwt/items/97f5436f4e3b908311cd)
- [DD-WRT設定 管理タブ](http://qiita.com/ryskiwt/items/5f5e8b4056022df810d8)


[ieserver.net]:http://www.ieserver.net/

1. 基本 > 基本
========================================

WAN Setup
----------------------------------------
### WAN Connection Type
| 項目 | 設定値 | 備考 |
|:-:|:-:|:-:|
| Connection Type | Automatic Configuration - DHCP |  |

### Optional Settings
| 項目 | 設定値 | 備考 |
|:-:|:-:|:-:|
| 機器名 | WZR-HP-AG300H | （デフォルト） |
| ホスト名 | wzr-hp-ag300h | （デフォルト） |
| ドメイン名 | domain.myhome.cx | [ieServer.net]のDDNSドメイン名 |
| MTU | Auto 1500 | （デフォルト） |
| STP | [ ] 有効 [x] 無効 | （デフォルト） |

Network Setup
----------------------------------------
### Router IP
| 項目 | 設定値 | 備考 |
|:-:|:-:|:-:|
| Local IP Address | 192.168.1.254 | 自分に設定するアドレス（任意） |
| サブネットマスク | 255.255.255.0 | （任意） |
| ゲートウェイ | 192.168.1.254 | 自アドレス |
| LAN側DNS | 192.168.1.254 | 自アドレス |

### Network Address Server Setting (DHCP)
| 項目 | 設定値 | 備考 |
|:-:|:-:|:-:|
| DHCP Type | DHCP Server |  |
| DHCP Server | [x] 有効 [ ] 無効 |  |
| Start IP Address | 192.168.1.100 | DHCPで割り当てるIPアドレスの起点 |
| Maximum DHCP Users | 20 | 起点から何ユーザーDHCPで割り当てるか |
| Client Lease Time | 1440分 | DHCPのリース時間 |
| Static DNS 1 | 8.8.8.8 | Google DNS |
| Static DNS 2 | 0.0.0.0 |  |
| Static DNS 3 | 0.0.0.0 |  |
| WINS | 0.0.0.0 |  |
| Use DNSMasq for DHCP | [x] |  |
| Use DNSMasq for DNS | [x] |  |
| Use Authorative | [x] |  |

### Time Setting
| 項目 | 設定値 | 備考 |
|:-:|:-:|:-:|
| NTP Client | [x] 有効 [ ] 無効 |  |
| Time Zone | Japan |  |
| サーバーIP | ntp.nict.jp | NICTのNTPサーバー |


2. 基本 > DDNS
========================================

DDNS設定
----------------------------------------

### DDNS
| 項目 | 設定値 | 備考 |
|:-:|:-:|:-:|
| DDNSサービス名 | 手動設定 |  |
| DDNSサーバー | myhome.cx | [ieServer.net]で登録したドメイン名 |
| ユーザー名 | user | ダミー（任意） |
| パスワード | pass | ダミー（任意） |
| URL | https://ieserver.net/cgi-bin/dip.cgi?username=ユーザー名&domain=myhome.cx&password=パスワード&updatehost=1 | [ieServer.net]で登録したユーザー名、ドメイン名、パスワード |
| IPが更新されても更新しない | [ ] はい [x] いいえ |  |

### オプション
| 項目 | 設定値 | 備考 |
|:-:|:-:|:-:|
| 自動更新間隔 | 7 | 単位：日 |
excel VBAで使えるテストフレームワークを作ってみた。

# はじめに
仕事でexcelのVBAを使うことがよくあるけど、テストフレームワークがテスト用のファイルをたくさん読みこまないといけないのが嫌で、自分で作ってみました。
ケントベックのテスト駆動開発入門は、テストフレームワークを作る章があるため、まねしてやってみました。
[github](https://github.com/takus69/VBAUnittest)に公開しています。

# 基本方針
ファイルをたくさん読みこむのが嫌だったので、基本方針としてテストフレームワーク用に読み込むファイルは１ファイルになるようにしました。

# 簡単な使い方
- [github](https://github.com/takus69/VBAUnittest)のVBAUnittest.basをVBAのエディタにインポート
- 「開発」タブの「マクロのセキュリティ」から「VBAプロジェクトオブジェクトモデルへのアクセスを信頼する」にチェックを付ける(下記画像参照)

![setting.png](https://qiita-image-store.s3.amazonaws.com/0/109193/ed082534-b143-a728-aba8-ea62691013fb.png)

- テストケースを以下のような形で作成(テストモジュール名は、Testから開始。テストプロシージャ名は、testから開始)

``` TestModule.bas
Sub testMethod()
  assert(1+2, 3)
  assertTrue(isTrue)
End Sub
```

- allTestRunを実行

詳細な使い方は、[github](https://github.com/takus69/VBAUnittest)のREADMEを読んでください。

# さいごに
まだフレームワークを作っただけなので、バグがあれば教えて下さい。
今度excelのVBAで何か作る時は使う予定です。
ケントベックのテスト駆動開発入門にあるように、テストファーストテストファースト。テストフレームワークを作る時にこのフレームワークを使ってテストしていたので、それなりには動くと思います。

感想を書いているブログ記事もよろしくお願いします。
[Qiitaで記事を投稿しました。excel VBAで使えるテストフレームワークを作ってみた。](http://takus4649.hatenablog.com/entry/2016/11/16/012346)

実際に使ってみてテストフレームワークを改善して、[github](https://github.com/takus69/VBAUnittest)にv1.0.2をリリースしました。
実際に使ってみての感想は以下のブログ記事です。
[Excel VBAで使える自作のテストフレームワークを使って、実際に開発してみた。]
(http://takus4649.hatenablog.com/entry/2017/07/08/224827)

# 更新履歴
2017/07/08 v1.0.2のリリースの話を追記
2016/11/16 セキュリティの設定を追記
2016/11/16 新規投稿
WordPressで任意のサムネイル画像サイズを追加・サムネイルを再生成する方法

WordPressでサイトを作っていると、記事の一覧を表示するときにアイキャッチ画像を表示することが多いと思います。

その際、任意のサイズのサムネイル画像を表示したくなるのが人情です。 

この記事では、「任意のサイズのサムネイル画像を生成する方法」とWordPressでサイトを構築して運用し始めた後、新しくサムネイル画像のサイズを追加して再生成する方法をご紹介します。
 

# 任意のサイズのサムネイル画像を生成する方法

WordPressで画像をアップロードすると、

- サムネイル「150 x 150px」
- 中サイズ「300 x 225px」
- フルサイズ「600 x 450px」

上記の3パターンで自動的に画像が生成されます。

 

これはデフォルト設定の場合で、これ以外のサイズで画像をリサイズ・切り出して欲しい場合は少し手を加える必要があります！

 

といっても簡単で、テーマにある functions.php というファイルに一行加えるだけ。

 

```php
<?php add_image_size( $name, $width, $height, $crop ); ?>

```

引数の$nameは、新しい画像サイズの名前を指定します。
$widthは、切り出したいサムネイル画像の幅をピクセル単位で指定します。
$heightは、切り出したいサムネイル画像の高さをピクセル単位で指定します。
$cropは、画像を切り出すかどうか。デフォルトはfalseで、指定の幅または高さに合わせてリサイズ、trueの場合は、指定のサイズで切り抜きます。

参考サイト:

[関数リファレンス/add image size](http://wpdocs.osdn.jp/関数リファレンス/add_image_size)


[メディアのサイズを追加する](http://kotori-blog.com/wordpress/mediasize/)



例えば、functions.phpに以下のように画像サイズを指定したとします。

```php
<?php add_image_size('post_100x100_thumbnail', 100, 100, true); ?>
```
 
指定した後、画像をアップロードすると、100x100pxで画像が切り出されます。

100x100pxで切り出された画像を利用する場合は、こんな感じで指定します。
※ループでpostを回している場合

```php
<?php the_post_thumbnail('post_100x100_thumbnail'); ?>
```
 
めっちゃ簡単です！

## サムネイル画像を再生成する方法

WordPressでサイトを運用し始めたあと、サイトの改修などでサムネイル画像のサイズを新しく追加してそちらを使いたい場合があります。

そのときに問題になるのが、過去にアップした画像の新しいサムネイル画像をどう生成するのかという問題。

いまからアップロードする画像は指定したサムネイルの画像サイズで生成されるのですが、過去の画像については改めて画像をアップロードするなどしないといけません。

とてもめんどくさい......

でも、WordPressはプラグインが豊富！解決してくれるプラグインがありました！

[Regenerate Thumbnails](https://ja.wordpress.org/plugins/regenerate-thumbnails/)

使い方もめちゃ簡単！

まず、プラグインの新規追加から`regenerate-thumbnails`で検索してインストールして有効化します。

すると、サイドバーのツールに`Regen. Thumbnails`と表示されるようになるのでクリックします。


regenerate-thumbnailsの管理画面に遷移すると、`Regenerate All Thumbnails`表示されたボタンがあるのでクリックするとサムネイル画像の再生成が始まります。


これで、functions.phpに追加した新しいサイズのサムネイル画像が再生成されるはずです。

※自分の[ブログ内容](http://blog.ryskit.com/entry/2016/11/13/021404)から転載しています。
HugoでのTwitterカード設定サンプル

自分用の備忘録。アイキャッチ画像を自前で用意して、Twitter投稿時にTwitterカードを表示させるための設定サンプル。

## front-matter(toml形式)

```yaml
+++
date = "2016-11-13T00:01:08+09:00"
draft = false
slug = ""
tags = ["tips", "shape"]
title = "005-Shapeを透明化する"
eyecatch = "/images/phina-invisible-shape.png"
+++
```

## header.htmlのmeta属性部分

```html

<!-- Twitter Card Metas -->
  <meta name="twitter:card" content="summary" />
  <meta name="og:title" content="{{ .Title }}" />
  <meta name="og:description" content="{{ if .IsPage }}{{ .Summary }}{{ else }}{{ .Site.Params.description }}{{ end }}" />
  <meta name="og:image" content="{{ .Site.BaseURL }}{{ .Params.eyecatch }}" />
  <meta name="twitter:url" content="{{ .Permalink }}" />
  <meta name="twitter:site" content="@alkn203" />
  <meta name="twitter:creator" content="@alkn203" /> 
```
iBeaconを使ってみる

数年前にiPhoneで対応して急にブームになったiBeaconをふと思いだして調査してみました。

# iBeaconの検出

Bluetoothのデバイスへの接続等も必要であれば[noble]というモジュールを利用するようですが、iBeaconの単純な受信だけであればラッパーである[Bleacon]が良さそうです。

インストールはnpmで一発です。
> npm install belacon

※Warninigが出た場合でも動作しているようです...。（動いたからきちんとチェックしていない）

```app.js
Bleacon = require('bleacon');

Bleacon.startScanning();

Bleacon.on('discover', function(bleacon){
	console.log(bleacon);
})
```

以下のようなオブジェクトが返ってくる

> { uuid: '8492e75f4fd6469db132043fe949XXXXX',
>  major: 5453,
>  minor: 12650,
>  measuredPower: -59,
>  rssi: -44,
>  accuracy: 0.3876571779678571,
>  proximity: 'immediate' }

仕組みとしてUUIDは製品（サービス）毎に同一のものにし、majorとminorを個別に設定してビーコンの識別をする想定のようです。

startScanningのパラメータにUUIDを渡せば、同一UUIDのデバイスのみ検出するようです。

#iBeaconモジュール

こちらが問題。いろいろと調べてみましたが、2014年ごろにニュースリリースが出ているところも製品として販売していなさそう。電波法の関係で認証無しの直輸入もできません。

## アプリックス
https://mybeacon-store.stores.jp

どうも販売終了とSOLD OUTが多いのが気になるし、肝心の普通のビーコンが売り切れ...。

## Gimbal

下の記事でGimbalというメーカー？を発見。日本の認証も通っているモジュールを販売しているようで、しかも小型のビーコンは＄５！

[ビーコンを買ってみた:Qiita](http://qiita.com/mugicha/items/b8bb263921add591adb9)

ということで、送料は高いのですが単価が圧倒的に安いためこちらから輸入する事にしました。電池の持ちは不安要素ですが...。

#ごにょごにょ

nodejsで簡単に書けそうだったので、これはいけるな...と思っていたらデバイスが見つからず悩みました。1000円前後の小さなものを探していたので、BTLEモジュールに電池つけて自作しようかとまで思いました。これから売れるんと思うんだけどなぁ...。

[Bleacon]:https://github.com/sandeepmistry/node-bleacon
[noble]:https://github.com/sandeepmistry/noble
GAEのOutbound IP address確認方法

# 概要
GoogleAppEngine(GAE)上に構築したアプリケーションからのアクセスをwhitelist形式で許可したい場合など、接続元IPでアクセス制限を行う際のIPアドレス(の範囲)を調べる方法

ちなみに、公式ドキュメントにも明記されていますが、今のところGAEからの外部へのアクセス時のIPアドレス(Outboud IP addres)を固定化は出来ない(らしい）ため、GAE全体のIPアドレスのレンジとしてしか調べられません。
※ 第三者の悪質なGAEアプリケーションも同じIPアドレス範囲を共有するため、根本的にはIPアドレス以外の方法でアクセス制限が推奨されています。


https://cloud.google.com/appengine/kb/#static-ip



# 確認方法

公式ドキュメントの内容を雑にスクリトに落としただけですが、
以下のスクリプトを実行してもらえればIP Addressのレンジを取得できます。

```bash
#!/bin/bash

includes=`nslookup -q=TXT _cloud-netblocks.googleusercontent.com 8.8.8.8 | tr ' ' '\n' | grep include | sed "s/include:\(.*\)/\1/g"`
for include in $includes; do
  nslookup -q=TXT $include 8.8.8.8 | tr ' ' '\n' | grep ip | sed "s/ip[4,6]:\(.*\)/\1/g"
done
```
auto-installの設定でエラー

自分のosX設定うろ覚え．
emacs初心者がauto-installの設定で手こずった話です．

# error

`error in process filter: Could not create connection to www.emacswiki.org:443
`

下記サイトに依ると，homebrewでインストールしたopenssl(/usr/local/Cellar/openssl/1.0.2j/bin)ではなく既存(/usr/bin)のopensslを読みにいっているのが原因(間違ってたらゴメンナサイ)？

[Emacsのauto-installで接続エラー443発生](http://gabekore.org/emacs-auto-install-err-443)

.bashrcに以下の記述を追加し，homebrewによるopensslを優先的に読みにいかせる．

`export PATH="/usr/local/Cellar/openssl/1.0.2j/bin:$PATH"` 

設定を反映させてemacsを再起動するとエラーは無事に消えました．

本当は/usr/local/Cellar/opnessl/1.0.2j/binにシンボリックリンクを貼る等の対処をするべきなのかもしれませんが，あまり複雑な設定をしたくなかったのでとりあえず．
半角 border パッチがあたった tmux 2.3 を MacPorts で入れて wcwidth-cjk と一緒に使う

# インストール

MacPortsでtmux 2.3をインストール．
borderをasciiにするpatchだけあてます．

```shell-session
sudo port uninstall tmux-pasteboard
sudo port uninstall tmux
sudo port clean tmux
sudo port -s patch tmux
cd /opt/local/var/macports/build/_opt_local_var_macports_sources_rsync.macports.org_release_tarballs_ports_sysutils_tmux/tmux/work/tmux-2.3
curl -kL "https://raw.githubusercontent.com/silenvx/PKGBUILD/master/tmux/borders.patch" | sudo patch -p1
cd -
sudo port -s install tmux
sudo port install tmux-pasteboard
```

tmuxは2.2以降，wcwidthで文字幅を見るようになっているので，ambiguous widthの扱いが可能な，[wcwidth-cjk](https://github.com/fumiyas/wcwidth-cjk)を使うことに．
ただ，以下のような改変をしたバージョンを使います．

- 最新のwcwidth-cjkは，autotoolsを使うようになっているのですが，osx環境でbuildすると，dylibファイルが作られないので，autotools導入前のMakefileをベースにしたMakefile.osxを作りました．
- wcwidth.cにおいて，\_\_APPLE\_\_環境では濁点と半濁点を含めないようにしました．

では，インストールします．

```shell-session
git clone https://github.com/river24/wcwidth-cjk.git
cd wcwidth-cjk
git checkout osx
make -f Makefile.osx
sudo make -f Makefile.osx install
```

では，wcwidth-cjkを使ってtmuxを起動します．

```shell-session
/usr/local/bin/wcwidth-cjk /opt/local/bin/tmux
```

無事，tmux 2.3に移行できました．

***

__追記：濁点・半濁点の件について__

濁点と半濁点の対応をしないと，以下のようになります．

```shell-session
$ /opt/local/bin/tmux -V
tmux 2.3
$ /usr/local/bin/wcwidth-cjk /opt/local/bin/tmux
$ mkdir は
$ mkdir ば
$ mkdir ぱ
$ ls -al
total 0
drwxr-xr-x   5 river24  staff  170 Nov 16 19:33 .
drwxr-xr-x@ 22 river24  staff  748 Nov 14 12:49 ..
drwxr-xr-x   2 river24  staff   68 Nov 16 19:30 は
drwxr-xr-x   2 river24  staff   68 Nov 16 19:30 は
drwxr-xr-x   2 river24  staff   68 Nov 16 19:30 は
```

濁点と半濁点の対応をすると，以下のようになります．

```shell-session
$ /opt/local/bin/tmux -V
tmux 2.3
$ /usr/local/bin/wcwidth-cjk /opt/local/bin/tmux
$ mkdir は
$ mkdir ば
$ mkdir ぱ
$ ls -al
total 0
drwxr-xr-x   5 river24  staff  170 Nov 16 19:35 .
drwxr-xr-x@ 22 river24  staff  748 Nov 14 12:49 ..
drwxr-xr-x   2 river24  staff   68 Nov 16 19:35 は
drwxr-xr-x   2 river24  staff   68 Nov 16 19:35 ば
drwxr-xr-x   2 river24  staff   68 Nov 16 19:35 ぱ
```

以前はtmuxそのものに，濁点・半濁点の対応をするpatchをあてていましたが，tmux 2.2以降ではwcwidthで文字幅を見るようになったので，濁点・半濁点の対応もwcwidth側でするのが適切ではないかと思ったので，wcwidth-cjk側で対応するようにしました．
うまくいきそうにない技術

###**うまくいきそうにない技術**
(例示は後知恵になっていることをお許しください)
ソフトウェア技術に限らず、周辺の技術を含めた考察になっています。
ハードウェアについて記載している内容でも、読み手の側で、ソフトウェア開発に当てはまる部分がないか、読み替えてください。


- **原理的な部分に課題を山ほど抱えている技術**
    - しかも、その課題について、改善のアイディアがない。
- **「実用的か、将来性があるか（＝将来性があると信じられるか）」よりも独自性を重視している技術**
    - 技術開発において、独自性というのは結果だと思う。独自性を目的として技術開発をすることはない。
    - 「ファンタジーとしての技術」：こういうのができたらいいなという理想・コンセプトだけを提示しているだけで、裏づけになる技術的な要素が存在していない（もしくは少なすぎる）。
    - 組織内の政治的な理由により開発されている技術
- **「パラメータが変われば手法も変わらざるをえない」ことを無視した技術開発**
    - [VHD（Video High Density Disc、ブイエイチディー](https://ja.wikipedia.org/wiki/VHD) などは、その例かもしれない。音響信号の情報量にくらべ画像信号になった時点で、レコード技術の延長上に解決策を求めたのは間違いかもしれないと、後知恵の私は思う。[ビデオディスクの解説](https://kotobank.jp/word/%E3%83%93%E3%83%87%E3%82%AA%E3%83%87%E3%82%A3%E3%82%B9%E3%82%AF-7862)

- **不安定性を抱え込んだ技術**
    - 克服できない不安定性を抱えつづけた技術は、たとえライバルの技術が成功しなくても、成功することはないのではなかろうか。
   
- **既存技術のよさを取り込むことのできない技術。**
- **関連分野での技術の進展を取り入れることができない技術**
    - アナログのハイビジョンはそのような技術にある時点でなってしまったのではなかろうか。
- **チップや部品の進歩を反映できない技術**
    - 画像計測・画像認識技術では、CPUのクロック速度の高速化はもはや期待できない。それ以外のマルチコアの利用や、SIMD命令の利用や、GPGPUの利用、FPGAの利用などがある。それらのうち、何を選択すべきかは、重要な判断となる。 
- **保守性の悪い技術**
    - 保守性の低下している技術は、改良をすることもできない。改良しえたとしても改良の開発速度は著しく低下してしている。 
    - 従来は入手可能であった部品が入手できなくなれば、従来は保守性の良かった技術が保守性の悪い技術になってしまうことがある。
    - 早い段階で機械語を用いた最適化をすることは、保守性の悪い技術に突入することになる。ARM用の機械語を含むコードに最適化されてしまったアルゴリズムを理解し、GPGPUを使う実装に置き換えることは、極めて困難（＝ほとんど不可能）である。
- **「既存技術の改良の積み重ねがいかに大きいのか」を理解しない技術開発**
    - 既存技術が世の中の役にたっていて利益をうみだしていて、その利益が新たな開発・改良を継続できる状況のすごさを知ろう。今の時点で、GaAs/AlGaAsや超伝導を使って今のSi以上のCPUを作れると考えますか。
- **要因の切り分けができない技術**
    - 行き詰まったときに、要因の切り分けができない技術は、要因ごとに別々に原因の解析や対策を施すことができなくなる。
    - 分業によって開発速度を加速することができない。


あなたの関わっていく技術が、うまくいく技術でありますように。


追記：

- **改良を加えるだけのフィードバックループを回すための周期がとても長すぎる技術分野**
    - 核融合、高速増殖炉、火星有人探査
- **技術者の個人的な損得を考えたときに割りの合わない技術分野**
    -  使用済み核燃料の技術
    - うまくいっても「あたりまえ」、何かあるとペナルティとみなされている技術分野
        - 割があわないので、技術者がよりつかなくなります。セキュリティの分野はこういった扱いを受けやすいようです。
- **あまりにも多くの人がそれぞれの目論見で一貫性なく構築してしまう技術開発**
    - 矛盾する要因を内部に抱え込んでしまうので、破綻を引き起こしてしまう。
   

- **原理的に１００％がありえない技術分野で、１００％に限りなく近い精度でだけうまくいく前提での設計を持ち込んでしまった技術。**
    - それを避けるため：車載用の人検出技術では、それぞれの方式によって限界はある。誤検出での緊急ブレーキと、わずかばかりの未検出とのトレードオフとがある。その限界を問題としなくて済むような製品設計にしているようだ。

- **必要な条件が多すぎる技術（2018年7月追記）**
    - 例：以下の順序で制御方法は簡単なものから難しいものになってしまいます。
        - 符号の±だけで判定して良い方式
        - 値の単調増加を仮定して判定すればよい方式
        - 値が１次式で表されることを仮定して判定する方式
        - 値が比例であること（＝１次式の切片が０）であることを仮定して判定する方式
        - 値が比例であって、しかもその係数が一定していることを仮定して判定する方式
        - 値が比例であって、しかもその精度が広い領域にわたって確保されることを仮定して判定する方式

　　　ですから、必要な前提の少ないやりかたで、間違った答を返すことのない方式を選ぶことです。
    
## 付記(2022.06）
- その技術によって利益を得る人が、その技術の開発者だけであるような技術
 技術は、それを用いることで社会にとって得があるようなものでなければ技術とは呼べない。
　技術を創り出して売り出しているときに、それを利用する側になんらかの利益がなければ、使う理由がない。
　例：プラズマディスプレイの方式が事実上1社だけになってしまった時点で、その技術に関わることで利益を得る関係者はなくなってしまった。ある技術方式を開発するとき、さまざまなビジネスパートナーがあって技術が成立している。部品の技術・加工技術・素材の技術、そういったものに関わってくださるパートナーの利益があって方式 の開発ができる。液晶ディスプレイ用の開発に社の資源を投入するか、プラズマディスプレイの開発に社の資源を投入するかとい状況になったときに、よほどの理由がなければ、多数の会社が開発している方式に専念するのは当然にことだろう。
Cesiumから地球を非表示にする

#はじめに
 [Cesium](https://cesiumjs.org/)はWebGLを利用し、3D表現が可能なライブラリです。

#Cesiumから地球を非表示にする
Cesiumはデフォルトの状態で地球儀上にBing Mapsが表示されています。
![地理院地図.png](https://qiita-image-store.s3.amazonaws.com/0/149403/76b4810f-ba15-d476-0d55-7ba4af8ee3e4.png)
※ Bing Mapsを表示するとライセンス違反になる恐れがある為、地理院地図を表示しています。

この地球儀を非表示にします。
<div class="code-frame" data-lang="text"><div class="highlight"><pre>
var viewer = new Cesium.Viewer('cesiumContainer');
var scene = viewer.scene;
scene.globe.show = false;
</pre></div></div>

実行すると地球儀が非表示になります。
![地球儀非表示.png](https://qiita-image-store.s3.amazonaws.com/0/149403/c7f316f9-4b6a-c724-a312-26091c1a84dc.png)

Boxs形状を配置してみます。
<div class="code-frame" data-lang="text"><div class="highlight"><pre>
var blueBox = viewer.entities.add({
    name : 'Blue box',
    position: Cesium.Cartesian3.fromDegrees(142.358360,43.7623010, 0),
    box : {
        dimensions : new Cesium.Cartesian3(10.0, 10.0, 10.0),
	material : Cesium.Color.BLUE
    }
});
viewer.zoomTo(blueBox);
</pre></div></div>

実行するとBoxs形状が表示されます。
![Boxs.png](https://qiita-image-store.s3.amazonaws.com/0/149403/e23b33fe-810d-c48a-686f-741be317e5db.png)
SQLのWITH句で任意の範囲の日付を取得する

トランザクションデータを、ある区間の日付ごとに集計したいということがまれに良くあります。
「2016年の一ヶ月ごとの売上平均を出したい」「週ごとのアクセス合計を出したい」などです。

SQLのWITH句を使ってやると上記のような集計を簡単にできます。

以下、PostgreSQLで利用する場合（MySQLでは使えませんが、MySQL8.0からWITH句がサポートされるという話です）

# WITH句を使った期間一時テーブル

WITH句による再帰SQLを使うことで、任意の期間を任意の幅で簡単に得ることができます

```sql
WITH RECURSIVE date_range(i, start_date, end_date) AS (
  SELECT 1, date '2016-01-01', date '2016-01-31'
  UNION ALL 
  SELECT i + 1
    , date (start_date + interval '1 month')
    , date (start_date + interval '2 month' - interval '1 day')
  FROM date_range_
  WHERE start_date < '2017-01-01'
)
SELECT date_range.*
FROM date_range
```

```text:出力
 i  | start_date |  end_date  
----+------------+------------
  1 | 2016-01-01 | 2016-01-31
  2 | 2016-02-01 | 2016-02-29
  3 | 2016-03-01 | 2016-03-31
  4 | 2016-04-01 | 2016-04-30
  5 | 2016-05-01 | 2016-05-31
  6 | 2016-06-01 | 2016-06-30
  7 | 2016-07-01 | 2016-07-31
  8 | 2016-08-01 | 2016-08-31
  9 | 2016-09-01 | 2016-09-30
 10 | 2016-10-01 | 2016-10-31
 11 | 2016-11-01 | 2016-11-30
 12 | 2016-12-01 | 2016-12-31
 13 | 2017-01-01 | 2017-01-31
```

これを使って、例えば「一ヶ月ごとの`user_access_logs`を集計する」ならば

```sql
WITH RECURSIVE date_range(i, start_date, end_date) AS (
  SELECT 1, date '2016-01-01', date '2016-01-31'
  UNION ALL 
  SELECT i + 1
    , date (start_date + interval '1 month')
    , date (start_date + interval '2 month' - interval '1 day')
  FROM date_range
  WHERE start_date < '2017-01-01'
)
SELECT to_char(start_date, 'yyyy年mm月') date_range
  , count(user_access_logs.*) as access
FROM date_range
LEFT JOIN user_access_logs
  ON user_access_logs.access_date
     BETWEEN date_range.start_date AND date_range.end_date
WHERE date_range.start_date IS NOT NULL
GROUP BY date_range.start_date
ORDER BY date_range.start_date
```
```text:出力
 date_range | access
------------+--------
 2016年01月 |    20
 2016年02月 |   110
 2016年03月 |   204
 2016年04月 |   123
 2016年05月 |   312
 2016年06月 |   400
 2016年07月 |    12
 2016年08月 |    32
 2016年09月 |    10
 2016年10月 |    11
 2016年11月 |     2
 2016年12月 |     0
 2017年01月 |     0
```

一週間ごとの集計にしたい場合は

```diff
WITH RECURSIVE date_range(i, start_date, end_date) AS (
  SELECT 1, date '2016-01-01', date '2016-01-31'
  UNION ALL 
  SELECT i + 1
-    , date (start_date + interval '1 month')
-    , date (start_date + interval '2 month' - interval '1 day')
+    , date (start_date + interval '1 week')
+    , date (start_date + interval '2 week' - interval '1 day')
  FROM date_range
  WHERE start_date < '2017-01-01'
)
```

などとしてよしなにすれば良い感じ
jQueryでCSSのbackground-imageを変更する

自分用メモです。


**設定されたbackground-imageのurlを無効にする場合**

```css
$('#hoge').css('background-image', 'none');
```


**background-imageのurlを変更する場合**

```css
$('#hoge').css('background-image', 'url(test.png)');
```


``background-image``のところを別のプロパティにすれば何にでも使える！！
Markdown をプレビューしてくれるツール grip を使って Prmd から出力したドキュメントを表示する

GitHub markdown API で Markdown をプレビューしてくれる grip を使って
prmd から出力したドキュメントを表示します

## <i class='fa fa-question-circle'></i> Prmd とは？
Prmd は JSON Schema の scaffold, 正当性チェック, ドキュメント生成を行うツールです。
詳しくは下記の記事を参照してください

[Rubyの prmd gem でYAMLのスキーマバリデーションをする](http://qiita.com/tbpgr/items/67b1ea1a605434afb743)

## <i class='fa fa-question-circle'></i> grip とは？
ローカル環境でGitHubのREADMEを表示するためのコマンドラインツールです。
README以外も表示可能です。

## <i class='fa fa-download'></i> インストール
### :snake: Python

```sh
$ pip install grip
```

### :beer: Brew

```sh
$ brew install grip
```

## <i class='fa fa-flask'></i> サンプル
以下の記事で作成した Markdown を表示してみます

[Rubyの prmd gem でYAMLのスキーマバリデーションをする](http://qiita.com/tbpgr/items/67b1ea1a605434afb743)
Prmd は JSON Schema の scaffold, 正当性チェック, ドキュメント生成を行うツールです。
### <i class='fa fa-code'></i> コード
* schema.md

```markdown
## <a name="resource-person">Person</a>

Stability: `prototype`

人

### Attributes

| Name | Type | Description | Example |
| ------- | ------- | ------- | ------- |
| **age** | *string* | age of person<br/> **pattern:** `^[0-9]{1,3}$` | `"example"` |
| **name** | *string* | name of person | `"example"` |
```

### <i class='fa fa-play-circle'></i> 実行
```sh
$  grip schema.md
 * Running on http://localhost:6419/ (Press CTRL+C to quit)

$ open http://localhost:6419/schema.md
```

![schema.png](https://qiita-image-store.s3.amazonaws.com/0/43480/d9e20005-ccc0-431d-a42a-1d26aee2d7a0.png)

## <i class="fa fa-book" style="font-size:1em;"></i> 外部資料
* [joeyespo/grip](https://github.com/joeyespo/grip)
cssで上下中央に特定の要素を配置する（レスポンシブ対応、というか最近は幅を300pxとか固定で書かなくなってきた。）

あーどうすればいいんだったっけ。
の参考になれば。
使いやすそうなものを選定し、随時書き足していく予定。

#　背景画像を100％表示、そのコンテンツの上下中央にタイトル文字を表示したい
ブログなどで割と使われていそうなレイアウト。
画像がばーんと横に100%、その画像要素の中央にテキスト文字を中央寄せで上下にborderつけてみたり。

![sample.jpg](https://qiita-image-store.s3.amazonaws.com/0/91442/04817f21-f439-090f-45f5-54d2412e03b2.jpeg)

#### オススメ度：★★★★★（５段階中）
なぜなら、flex, table-cell, position とかはいっさい使わなくて良い。親の要素を100%で画像を表示させ、テキスト要素のmarginとpaddingを調整するだけだから。

```HTML:html
<div class="area">
 <h2 class="title">
  <span class="span">ブログ記事のタイトルです。</span>
 </h2>
</div>
```

```CSS:css
.area {
 width: 100%;
 padding: 80px 0;
 background: url('https://www.pakutaso.com/shared/img/thumb/DSCF3255_TP_V.jpg');
 background-size:100% auto;
 background-position : 50% 50%;
}
.title {
 text-align: center;
}
.span {
 display: inline-block;
 font-size: 1.6rem;
 padding: 20px;
 border-top: 2px solid #fff;
 border-bottom: 2px solid #fff;
 background-color: rgba(255, 255, 255, 0.5);
}

※サンプル画像は「ぱくたそ」より。
https://www.pakutaso.com/20161002302post-9386.html
```

demo（codopenに）
http://codepen.io/snjssk/pen/woWNOr
Firebase Realtime Database で特定の値を増加させる

#### 概要
Firebase/RealtimeDatabaseでインクリメンタルな値を扱う簡単な仕組みがない。
そのためのコードを記載する。
何らかのイベント回数などを初期化して累積増加させたい時に使用できる。


```swift:increment

FIRDatabase.database().reference().child("test1").observeSingleEvent(of: .value, with: { (snapshot) in

            var count:Int = 1
            if !(snapshot.value is NSNull){
                count = (snapshot.value as! Int) + 1
            }
            FIRDatabase.database().reference()
                                    .child("test1")
                                    .setValue(count)

        }) { (error) in
            print(error.localizedDescription)
        }
```

#### 参考
http://stackoverflow.com/questions/25575030/how-to-convert-nsnull-to-nil-in-swift
WindowsでもUNIXでも動くMakefileのポイント

タスクランナーというと `gulp` とかなんかそこらへんを使う人が増えているが、やっぱり古きよき `make` コマンドが手軽だ。しかし、`make` にも問題がある。

1. ひとつの `Makefile` を異なるOS上でもきちんと動作させるのがめんどくさい
2. ただのタスクランナーにしては文法がめんどくさい

2.はどうにもならないので（どうにもならないんかい！）、前者の1.で「WindowsでもUNIX系OSでも安心して動く `Makefile` の書き方」をメモしておく。といっても「すげーでっけープロジェクト用の `make`」の話ではないのですごく浅いです。

`make` は、

```prompt
$ make -v
GNU Make 4.1
Built for x86_64-unknown-cygwin
```

を例にしているが、GNU Make ならだいたいOKというゆるふわな感じで。

## とりあえず例

```Makefile
# UTF-8, LF

FILES_TO_CLEAN = key.cgi

CPANM = cpanm
RM = rm -f

ifeq ($(OS),Windows_NT)
	CPANM = cpanm.bat
	RM = cmd.exe /C del
endif

.PHONY:
	all installdeps clean

all: installdeps clean

installdeps:
	$(CPANM) --installdeps .

clean:
	-$(RM) $(FILES_TO_CLEAN)
```

* Perlスクリプトの配布用
* `installdeps` ターゲットで必要な `CPAN` モジュールをインストールできる
* `clean` ターゲットで、動作後に同じディレクトリに作成されるゴミを削除できる

## 注目ポイント

あ、ちなみにインデントがハードTABだというのは当然です…。

### 1. 文字コードはUTF-8、改行はLF

文字コードはもちろんだが、改行は「とりあえずWindowsではCR+LFでもオッケーでしょ？」とか思ってるとなぜかハマる。

### 2. 使用コマンドはラッパ変数に定義しておく

`rm` とか `cpanm` とか、そういうコマンドはめんどうでも基本的に `RM` などの変数にラッパ的に定義しておき `$(RM)` で呼び出す。デフォルトでは UNIX 系OS側のコマンドを入れておくといい。だって、だいたいの人は Cygwin か MingW 入れてるじゃろ？

### 3. OSの判定

`ifeq ($(OS),Windows_NT)` ～ `endif` で「Windowsかどうか」の判定をおこない、条件節内の命令を実行できる。ここで `RM` や `CPANM` などのラッパ変数をOSに適したコマンドに再定義しておく。

### 4. Windows では `.bat` や `.exe` まで指定するとラクになる

この `Makefile` では `cpanm` を Windows では `cpanm.bat` に再定義している。なぜか。

* Cygwin の `make` で実行しつつ Perl は `ActivePerl` を使っている場合、
    * `make` -> `/cygdrive/c/perl/site_perl/bin/cpanm` を呼び出す
        * Cygwin側の Perl が cpanm スクリプトを実行するとおかしなことになる
        * ActivePerl側の Perl が上記パスのスクリプトを読み込もうとしたときも「`/cygdrive`ってなんだよ」とおかしなことになる

から。説明めんどくさいね。どっちにしても Windows では Windows の本来の実行ファイルを呼び出そうとしているのか、それとも Cygwin などの実行ファイルを呼び出そうとしているのかを配慮し、前者なら `.bat` や `.exe` をつけたほうが困らないということですな。

### 5. Windows コマンドプロンプトのコマンドは `cmd.exe` 経由で実行

`RM = cmd.exe /C del` のような部分。

Windows 標準では当然 `rm` コマンドなどないので「`RM = del`としておけばいいだろ」と思うのだが、それでは動かない。なぜならば！　`del` コマンドはコマンドプロント（`cmd.exe`）の内部実装コマンドだからです。

あれね。UNIX系OSで言うところの、`echo` がシェルの内部コマンドだったり外部プログラムだったりするやつね。

ということで、コマンドプロントの内部実装コマンドは、`cmd.exe /C ...` のように動かします。

以上。たいしたことない( ..)φメモメモでした。
NodeMCU ファームのアップグレード

NodeMCU のファームウェアを 0.9.6-dev から 1.5.4.1 に更新する際にちょっと手間取ったのでメモ。ホストには Ubuntu(Lubuntu) 16.04LTS を使ってます。ファームウェアのビルドは SDK とソースを取得して make するだけなので省略。

* SDK - https://github.com/pfalcon/esp-open-sdk
* firmware - https://github.com/nodemcu/nodemcu-firmware

以前の 0.9.4 では make flash で OK だったのですが、新しいバージョンで make flash4m とかで書き込みしてもシリアルコンソールには意味不明な文字列が流れるばかりで、まともに動きませんでした。https://nodemcu.readthedocs.io/en/master/en/flash/#upgrading-firmware に書かれているように SDK が変更されたのに合わせて init データブロックの内容も書き換える必要があります。以下は大雑把な説明なので、できるだけオリジナルのドキュメントを参照してください。

1. SDK patch 1.5.4.1 ( http://bbs.espressif.com/download/file.php?id=1572 )をダウンロード、アーカイブを展開して esp_init_data_default.bin を取り出しておく。
1. フラッシュを消去する。上記の説明によればフラッシュの内容をすべて消去すれば SDK が次回起動時に init ブロックをインストールするとある。<br>*esptool.py --port <serial-port-of-ESP8266> erase_flash*
1. ファームウェアと esp_init_data_default.bin を書き込む。<br>*esptool.py --port &lt;serial-port-of-ESP8266&gt; write_flash &lt;flash options&gt; 0x00000 &lt;nodemcu-firmware&gt;.bin &lt;init-data-address&gt; esp_init_data_default.bin*<br>init-data-address は ESP8266 なら 0x3fc000. make flash4m とかで実行されるコマンドに esp_init_data.default.bin の書込み指定を追加する。

こんな感じです。逆に 0.9.x にダウングレードする際にも同じように不具合が起きるということなので注意しましょう。他にもなんだかんだとフラッシュ更新での不具合は多いようです。配線なども十分に確かめます。
さくらのIoT Platform βをArduinoと繋げてWebSocketサービスに連携するまで

# 0.はじめに

2016年11月11日から発送開始した、さくらのIoT Platform βをArduinoと接続しサンプルプログラムを動かすまでの手順をまとめました。
公開されているドキュメント（一部間違い発見）でなんとかなりますが、自分はあまりドキュメントを読まずに感覚でやる人（知らねー）なので、少しハマったので記事に残します。


# 1.さくらの通信モジュールを組み立てる

以下のようにアンテナを接続します。
![IMG_1728.JPG](https://qiita-image-store.s3.amazonaws.com/0/128324/63da88aa-2f41-3bdc-5483-e09ed25c5039.jpeg)

# 2.Arduinoシールドを組み立てる

I2Cを使うので、矢印のジャンパーピンを接続（SDA,SCLの２ヶ所）します。
![Arduino.png](https://qiita-image-store.s3.amazonaws.com/0/128324/fc133843-3def-80c8-c27d-9fefc0e96399.png)

# 3.さくらの通信モジュールとArduinoシールドを接続します。
![IMG_1730.JPG](https://qiita-image-store.s3.amazonaws.com/0/128324/7554a826-70d0-6c0b-cf76-7f74acb4127d.jpeg)

# 4.さくらの IoT プラットフォームを設定する

マニュアルの通りにコントロールパネルにてモジュールを登録し、WebSocketサービスを追加します。
![さくらのiotplatform.png](https://qiita-image-store.s3.amazonaws.com/0/128324/bb161fd6-2251-3efe-415e-3db43425b092.png)

# 5.Arduinoにサンプルプログラムを書き込む

https://github.com/sakura-internet/SakuraIOArduino
上記 URL で開く Git を 「~/Documents/Arduino/libraries/」へ clone もしくはzipダウンロードし、Arduino IDE で SakuraIOArduino-master/examples/Standard/Standard.ino を 開きます。このプログラムをコンパイルして Arduino に書き込むと、さくらの 通信モジュールを利用するためのサンプルプログラムが起動します。

サンプルプログラムではインクリメントするカウンター値が送信されるので以下のようになります。

![iotresult.png](https://qiita-image-store.s3.amazonaws.com/0/128324/81e27aa4-21ec-c9b7-e813-518eb0670096.png)
Ansibleでのaptキャッシュの更新


Ansibleを利用して、Ubuntu上へパッケージのインストールを行う際、ローカルキャッシュのバージョンが更新されていなかった場合にインストールできないことがある

解決法は以下で示されている通り

[Ansibleでapt-getのパッケージリストを更新してからインストールする](http://qiita.com/taisho6339/items/b6e19b8906b8d2a092e7)

```
- name: install apt packeges
  apt: pkg={{ item }} update_cache=yes cache_valid_time=3600
  become: True
  with_item:
  	- git
  	- memcached
  	- nginx
  	- postgresql
```

**update_cache** パラメータに `yes` を指定してあげることで、インストール前に `apt-get update` を実行してくれる

しかしながら、`apt-get update` にはそれなりに時間が掛かる

デバッグのために何度も実行する必要がある場合など、毎回 update されたら時間が掛かりすぎるときには `cache_valid_time` を指定してあげればよい

上記のように `cache_valid_time=3600` とした場合には、3600秒(=1時間)以上古くなっているときにのみ、キャッシュの更新が実行されるようになる

[apt - Manages apt-packages Options](http://docs.ansible.com/ansible/apt_module.html#options)
nodeでタイムトラベルしてログを再生する

## シーン

イベント系とかユーザー操作系とかで過去のログを時系列にそって再現（再生）したいとき。

* トリガー起こしたり操作したりがめんどいのをなくしたい
* イベント本番に近いデータでデバッグしたい

という気持ちのとき。

## やり方

* [timekeeper](https://github.com/vesln/timekeeper) - タイムトラベルするnpmモジュール
* [node-schedule](https://github.com/node-schedule/node-schedule) - スケジューリングするnpmモジュール

を使う。
↓のような感じ。

```js
const schedule = require('node-schedule');
const tk = require('timekeeper');

//json読み込み
const actions = JSON.parse(fs.readFileSync('actions_log.json').toString());
const base_at = new Date('2016-08-12T15:33:11.000Z')

//タイムトラベル
tk.travel(base_at)

//アクション予約
actions.forEach( (action) => {
  schedule.scheduleJob(new Date(action.started_at), () => {
    console.log(`Do ${action.name}`);
  });
});
```

```json:actions_log.json
[
  {
    "name": "Kick",
    "started_at": "2016-08-12T15:33:11.000Z"
  },
  {
    "name": "Punch",
    "started_at": "2016-08-12T15:34:13.000Z"
  },
]
```
Fakerで文章つくったらハマったよ

#はじめに
laravelを使っています。
テストのファクトリーを作成する際、Fakerつかいます。
そこでハマったので覚書

#ハマった点

```php
$factory->define(Post::class, function(Faker\Generator $faker) {
    return [
        'user_id' => factory(User::class)->create()->id,
        'comment' => $faker->sentences(),
    ];
});
```

こんな感じでファクトリーの定義をするとします。
このファクトリーをテストで使用したところ

```
ErrorException: preg_replace(): Parameter mismatch, pattern is a string while replacement is an array
```

というエラーが出てテストが通りません。

なぜ！なぜ！なぜ！！！！

と調べまくったところ、

`$faker->sentences()`はデフォルトでは配列を返してくるそうです。:point_down_tone2:
(これはparagraphsだけど。)
https://laracasts.com/discuss/channels/laravel/error-in-project-flyer-episode-7-preg-replace-parameter-mismatch
Fakerの[READ ME](https://github.com/fzaninotto/Faker/blob/master/readme.md)にも書いてあったけどよく見てませんでした・・

#解決

```php
'comment' => $faker->sentences(),
```

としていたところを

```php
'comment' => $faker->sentences(3, true),
```

としたらすぐ解決しました。

#教訓
いつものことながら
**ドキュメントはよく読みましょう**:angel:
PhpStorm, Vim, iTerm2 のカラースキームに Atom One Dark を適用する

Atom の One Dark というカラースキームが好きなのです。
PhpStorm、Vim、iTerm2 に（非公式の）One Dark のカラースキームがあるので、それぞれ適用しています。

1. PhpStorm  
[https://github.com/jesusOmar/one-dark-phpstorm](https://github.com/jesusOmar/one-dark-phpstorm)
1. Vim  
[https://github.com/joshdick/onedark.vim/blob/master/colors/onedark.vim](https://github.com/joshdick/onedark.vim/blob/master/colors/onedark.vim)
1. iTerm2  
[https://github.com/joshdick/onedark.vim/blob/master/One%20Dark.itermcolors](https://github.com/joshdick/onedark.vim/blob/master/One%20Dark.itermcolors)
Laravel5.3 でDIコンテナ（サービスコンテナ）を使ってインスタンス生成処理を簡略化する

#環境
- CentOS 7
- PHP 7
- Laravel 5.3

#はじめに
Laravel では`DIコンテナ`のことを`サービスコンテナ`と呼ぶらしい。
そして、以前までは`IoCコンテナ`と呼ばれていたらしい。
なので、
>DIコンテナ = サービスコンテナ（現名称） = IoCコンテナ（旧名称）

という認識で大丈夫だと思う。

※以降、サービスコンテナと記述

#やりたいこと
以下のようなクラスがあるとする。

```app/Http/Controllers/SampleController.php
class SampleController extends Controller
{
	public function hoge()
	{
		$client = new \GuzzleHttp\Client();
		if (env('APP_ENV') === 'local') {
		    $client = new \GuzzleHttp\Client(
		        [\GuzzleHttp\RequestOptions::VERIFY => false]
		    );
		}
		...
	}
	
	public function foo()
	{
		$client = new \GuzzleHttp\Client();
		if (env('APP_ENV') === 'local') {
		    $client = new \GuzzleHttp\Client(
		        [\GuzzleHttp\RequestOptions::VERIFY => false]
		    );
		}
		...
	}
	...
}
```

各メソッドごとに毎回同じ条件でインスタンスを生成しているので、この処理をまとめたい。
そして他のクラスでも同じように使いたい。

#目指すゴール
```app/Http/Controllers/SampleController.php
class SampleController extends Controller
{
	public function hoge()
	{
		$client = app()->make('HttpClient');
		...
	}
	
	public function foo()
	{
		$client = app()->make('HttpClient');
		...
	}
	...
}
```

#方法
サービスコンテナを使う。
サービスコンテナ使わなくてもできる気がするけど、簡単にできそうなので今回は使う。

#サービスコンテナの使い方

##サービスプロバイダーを作成する

サービスプロバイダーを使ってサービスコンテナに登録したいので、まずは以下のコマンドでサービスプロバイダーを作成する。
>php artisan make:provider SampleServiceProvider

作られた`SampleServiceProvider`を以下のように編集する。

```/app/Providers/SampleServiceProvider.php
<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class SamplServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap the application services.
     *
     * @return void
     */
    public function boot()
    {
        //
    }

    /**
     * Register the application services.
     *
     * @return void
     */
    public function register()
    {
		$this->app->singleton('HttpClient', function () {
		    $client = new \GuzzleHttp\Client();
		    if (env('APP_ENV') === 'local') {
		        $client = new \GuzzleHttp\Client(
		            [\GuzzleHttp\RequestOptions::VERIFY => false]
		        );
		    }
		    return $client;
		});
    }
}

```

###解説
- `register`という文字の通り、ここでサービスコンテナに登録する
- 今回はインスタンスを共有していいので`singleton`にしている
 - 毎回生成したい場合は`bind`を使う

##`config/app.php`に作成したサービスプロバイダーを追記する

```config/app.php
'providers' => [
	...
	App\Providers\SamplServiceProvider::class,
];

...
```

##使用する（ゴール）
```app/Http/Controllers/SampleController.php
class SampleController extends Controller
{
	public function hoge()
	{
		$client = app()->make('HttpClient');
		...
	}
	
	public function foo()
	{
		$client = app()->make('HttpClient');
		...
	}
	...
}
```
これで毎回同じ条件を書かなくて済むので、かなりスッキリした。
Cocos2d-x3.4 windows eclipse環境 android開発で sdkboxを使う

「まだ3.4なのか」と言われそうですが、
eclipse環境だとなにもいじらないでビルドできるのがこのバージョンまでなので、
まだ粘ってこの環境でいくつかゲームを出したいと思っている私です。

というのもandroid studio は「結局コンソールでビルドだよ」みたいな記事が山ほどあり、
IDEだけでできない時点で環境が途上なのかという感じがしてるからです。

はやく全部android studioでできるようにしてほしい（切なる願い）。

#windows eclipse開発環境でのsdkbox

というレアな（？）状況でsdkboxの利用にちょっと詰まったので、
情報提供という意味でログにしておきます。

sdkboxですが、わかりやすい手順的な記事がないようなので、ちょっと書いておきます。

まず、「sdkbox本体ってどこにあるの？」的なところから迷ったわけですが、
構成として、

-インストーラー
-各プラグイン

に分かれており、以下のページから入って、それぞれのプラグインをインストールする、
というやり方になっています。
http://www.cocos2d-x.org/sdkbox

sdkboxのインストーラーは、ダウンロードするかコマンドでPCにインストールしますが、
僕はダウンロードして使いました。
で、パスを通せばいいのですが横着して、パス指定をしてsdkbox.batを叩いて使っています。

要するに各プラグインをインストールするとき、プロジェクトの直下、例えばあなたが
hogeというゲームを作っているなら、cocos2dxのproject/hogeフォルダに行き、

C直下にインストーラーのフォルダを置いたとしたら、

C:\sdkbox_installer\sdkbox import share

などとしてsdkbox.batを実行するわけです。

上の場合だと、ソーシャルシェアプラグインがプロジェクトにインストールされます。

で、eclipse環境の場合、これだけだとビルドは通るんですが、実行すると落ちます。
プラグインのバイナリが見つからない、と、javaレベルで怒られます。

で、eclipseのhogeプロジェクトフォルダのプロバティ＞androidでライブラリを見てみると、
インストールしたプラグインが見当たりません。

つまり、プロジェクトにsdkboxのプラグインをimportする必要があるわけです。

なので、package explore（左にあるフォルダ構成を表示しているペイン）にて左クリック＞importで、
今回の場合だとshareプラグインの場所を指定して、インストールします。

場所は

（あなたのcocos2d-xフォルダ）/projects/hoge/cocos2d/cocos/platform/android/java/libs

に、インストールしたプラグインが入っているので、そこを指定します。

shareプラグインの場合、複数のimportが必要で、終わったときに以下のようになります。

![20161115_210420.png](https://qiita-image-store.s3.amazonaws.com/0/79490/4b77feee-cbc6-1daf-e165-dfbc9f8e4b29.png)

で、無事インポートできれば、ビルドが成功、アプリにプラグインが仕込めるようになります。

sdkboxは今のところshareとiap（In app purchase）だけ入れてますが、
iapはimportがいらない（？）ようです。

iapは初期化処理を入れたシーンにiapのcallback関数がないと「見つかりません」的なことを言われますが、
動作はしています。

shareは、ツイッターの場合、twitter appのデベロッパーに登録し、ツイッターアプリを１つ作って、
keyとsecretが必要になります。

あとちょっと引っかかったのが、resourcesに置くsdkbox_config.jasonに余計な記述があったり、
カンマが足りなかったりすると、実行してもうんともすんとも言いません。
（logcatに赤い字で、「sdkbox share failed」みたいなエラーが出る）

facebookプラグインも同様です。

facebookプラグインは、ツイッターと同様、facebook appを設定する必要があります。
大した手間ではありませんが、これも設定が１つでも間違っているとまたうんともすんとも言いませんので、
ちゃんと以下のページを見て、設定する必要があります。
http://blog.cocos2d-x.org/2016/02/setting-up-facebook-app-for-sdkbox-services/

あとはツイッター、facebookシェアとも、ちゃんとコードを記述すれば、ダイアログが出て
シェア処理をしてくれます。
画像も添付できるのがいいですね（url指定もできるので外部サーバーに置いておくといいかも）

一応動くコードを書いておきます。

twitterShare

```
	sdkbox::SocialShareInfo info;
	info.text = "#sdkbox(www.sdkbox.com) - the cure for sdk fatigue ";
	info.title = "sdkbox";
	//info.image = "path/to/image"
	info.link = "http://www.sdkbox.com";
	info.showDialog = true;
	info.platform = sdkbox::SocialPlatform::Platform_Twitter;

	sdkbox::PluginShare::share(info);
```

facebookShare

```
	sdkbox::FBShareInfo info;
	info.type  = sdkbox::FB_LINK;
	info.text = "#sdkbox(www.sdkbox.com) - the cure for sdk fatigue ";
	info.title = "sdkbox";
	//info.image = "path/to/image"
	info.link = "http://www.sdkbox.com";

	sdkbox::PluginFacebook::dialog(info); // dialogのところをshareにすると自動投稿になる
```
ムシャクシャしたので国民機に癒してもらおうと思ってやった。後悔はしていない。

# 疲れた
つかれたんだよ…

# どうする
癒やしが必要。癒やしとはきっと故郷だ…それ以外にはない。俺たち故郷とはどこか。PC98シリーズにきまってる。ファミコンクラシックもバカ売れだし。(66とか88の人にはひっぱたかれそう感じあるけど。AppleIIの人はVirtual IIでDiskIIのシーク音をどうぞ)

# 遠き故郷はダムのそこに…

PC98の実機なんてもう手元にねーよ・・・。でも実機がなくてもピポさえあれば生きてける。ピポは所詮Beep音なので生成すれば故郷に思いを馳せられる…


# 故郷をつくる

pygameで音を生成して鳴らせるらしいので適当にググったら近いことを[やってる人がいた](https://gist.github.com/ohsqueezy/6540433)。Thx!故郷は近い・・・

# 故郷を調べる

故郷の音は2000KHzを100ms、ちょっとWaitして1000KHzを100msらしい。というか、これは君の故郷によって違う（たしかクロックによって違う）。そう、[マシンの数だけ故郷があるのだ](http://davy.nyacom.net/98tunes/
)・・・

# 故郷をつくる

言葉はいらない。コードがあればいい・・ああ、故郷が近い

```py:pc98.py
from array import array
from time import sleep

import pygame
from pygame.mixer import Sound, get_init, pre_init

class Note(Sound):
    def __init__(self, frequency, volume=.1):
        self.frequency = frequency
        Sound.__init__(self, self.build_samples())
        self.set_volume(volume)

    def build_samples(self):
        period = int(round(get_init()[0] / self.frequency))
        samples = array("h", [0] * period)
        amplitude = 2 ** (abs(get_init()[1]) - 1) - 1
        for time in range(period):
            if time < period / 2:
                samples[time] = amplitude
            else:
                samples[time] = -amplitude
        return samples


if __name__ == "__main__":
    pre_init(44100, -16, 1, 1024)
    pygame.init()

    Note(2000).play(100)
    sleep(0.1)

    Note(1000).play(80)
    sleep(1)
```

# 故郷に帰る
pygameをインストールしてくれ。 
もし自分の故郷と違うのなら.playのあとのDurationやsleepの時間を自分で変更してくれ・・・・・俺はつかれた。
```
$ pip install pygame
$ python pc98.py
```

ただいま・・・！


# 故郷行きの列車の車掌と乗務員たちに感謝
- https://gist.github.com/ohsqueezy/6540433
- http://davy.nyacom.net/98tunes/

# 次回
故郷に帰り少したち、夕暮れの中を散歩していると、ふと憧れのあの子のことを思い出した。昔の話だ。よく彼女と遊びに海や宇宙にいったもんだ・・・懐かしいな。そんなことを思って歩いていた。

「あの、◯◯君？」
突然声をかけれらた俺は、あの懐かしい震えた声とともにドラム缶をくらい、爆発した。

次回、初恋は[BIO_100%](https://www.youtube.com/watch?v=JhzTUO6GKEY)の味。お楽しみに
BigQuery Standard SQLで文字列を逆順にする方法


BigQueryでは文字列を逆順にする関数がないので、UDF機能を利用して作ってみました。

```sql
#standardSQL
CREATE  TEMPORARY FUNCTION STRING_REVERSE(str STRING)
RETURNS STRING AS ((
  SELECT ARRAY_TO_STRING(
    ARRAY(SELECT SUBSTR(str, -seq, 1) FROM UNNEST(T.seqs) AS seq), ''
  ) FROM (
    SELECT str, GENERATE_ARRAY(1, LENGTH(str)) AS seqs
  ) AS T
));

SELECT STRING_REVERSE('stressed')
```

GENERATE_ARRAYで1〜文字列の長さの配列を作り、SUBSTRで後ろから1文字ずつ部分文字列を切り出しています。
最後にそれらをARRAY_TO_STRINGで結合することによって、1つの文字列にしています。
Implement FTP on VBA with WinInet

VBA に FTP 機能を実装したい。

外部ライブラリをインストールできる環境なら下記を参考に BASP21 を導入してシンプルな実装が可能。
http://officetanaka.net/excel/vba/tips/tips47.htm

それができない環境では Windows 標準の WinInet を利用して実装しようというお話。
実装したい機能の Windows API に対する逆引きを示す。

## Windows Internet
https://msdn.microsoft.com/en-us/library/windows/desktop/aa385331(v=vs.85).aspx

### インターネットサービスのハンドルを取得
WinInet を初期化して使用開始する。これ自体は FTP に特化したものでなく、 HTTP も利用可能。

InternetOpen
https://msdn.microsoft.com/en-us/library/windows/desktop/aa385096(v=vs.85).aspx

### FTP サーバへ接続
同じく、HTTP も利用可能。

InternetConnect
https://msdn.microsoft.com/en-us/library/windows/desktop/aa384363(v=vs.85).aspx

### FTP サーバからファイルをダウンロード
FtpGetFile
https://msdn.microsoft.com/en-us/library/windows/desktop/aa384157(v=vs.85).aspx

### FTP サーバへファイルをアップロード
FtpPutFile
https://msdn.microsoft.com/en-us/library/windows/desktop/aa384170(v=vs.85).aspx

### インターネットサービスを閉じる
WinInet の使用を終了する。

InternetCloseHandle
https://msdn.microsoft.com/en-us/library/windows/desktop/aa384350(v=vs.85).aspx

### その他インターネットに関する API の一覧
https://msdn.microsoft.com/en-us/library/windows/desktop/aa385473(v=vs.85).aspx

### Constant
定数を VBA で再定義するというのが冗長でやりたくないが、仕方ないのだろうか。

#### WinInet Constant
https://msdn.microsoft.com/en-us/library/windows/desktop/aa385448(v=vs.85).aspx

#### File Attribute Constant
https://msdn.microsoft.com/en-us/library/windows/desktop/gg258117(v=vs.85).aspx

## Sample Code
これら踏まえた上で、サンプルコードとしては下記がわかりやすい。
http://cya.sakura.ne.jp/vb/WinInet.htm

サンプルコード中の FTP 関連の定数がドキュメントでヒットしない。
INTERNET で再定義されていると思われる。
[MYSQL] MACでMYSQLをインストールやってみた。

皆様こんにちは。
**Dreamwalker**です。久しぶりにPostやることになりました。今回はDatabaseでよく使っているmysqlをmacに**install**方法を紹介したいと思います。


#brewを使います。

mysqlのサイトでDMGをダウンロードしてインストールしてもいいんですが、今回はTerminalでbrewを使います。

- まずbrewをupdateやります。

```text:
 $ brew update
```
もし、こんなerrorがあると次のようにやってみましょう！

```text:
 Error: /usr/local is not writable. You should change the ownership
and permissions of /usr/local back to your user account:
  sudo chown -R $(whoami) /usr/local
```

```text:
 $ sudo chown -R $(whoami) /usr/local
 $ brew update 
```

上のERRORは
**Homebrew no longer needs to have ownership of /usr/local. If you wish you can
return /usr/local to its default ownership with:
  sudo chown root:wheel /usr/local**ためです。

updateが終わったら、

```text:
 $ brew doctor 
```
でupdate確認します。

#MYSQLをインストール.

さあ..おめでとうございます。ここまで問題なかったら準備完了です。

```text:
 $ brew install mysql  
```

これで簡単にインストールができます。


```text:
 We've installed your MySQL database without a root password. To secure it run:
    mysql_secure_installation

To connect run:
    mysql -uroot

To have launchd start mysql now and restart at login:
  brew services start mysql
Or, if you don't want/need a background service you can just run:
  mysql.server start
 
```

インストール成功だったらこのメッセージが！

passwordやstartするためには

```text:
 $ mysql_secure_installation  
```


```text:
 $ mysql -uroot
```

```text:
 $ brew services start mysql
```


```text:
 $  mysql.server start
```

#終わりに

ここまでがbrewを使ってインストールをする方法でした。
mysqlサイトでもdmgでインストールできますので、ぜひやってみてください。

[mysql dmg download...](http://dev.mysql.com/downloads/mysql/)


読みいただきありがとうございました。
次のPostで会いましょう！

**Dreamwalker。**
Elixir のマクロとプロセスの関係

速習プログラミングElixir勉強会 #4
http://connpass.com/event/43633/

の発表資料。

---

## 自己紹介

名前: 正徳 巧
会社: 株式会社grooves
言語: Ruby
github: [sinsoku](https://github.com/sinsoku)
twitter: [@sinsoku_listy](https://twitter.com/sinsoku_listy)

---

https://jobs.forkwell.com/

![jobs.png](https://qiita-image-store.s3.amazonaws.com/0/30459/256462b2-6e92-721d-5dcb-f6deca2499cc.png)

---

## 読了した感想

---

## 良かった

- 3週で無事に読了できた
- 言い回しが面白い
  - 「邪悪な双子 unless」
- Ruby と違う考え方を学べた
  - クラスがない、再起、パターンマッチ
- 並行プロセスの実行が容易
- 13章のissuesが実践的

---

## よく分からない

- OTP, Agent 周りの理解が浅い
- 業務で具体的に使うイメージが沸かない
  - まだ理解が浅い
- 並行実行を考慮した設計

---

## マクロとプロセスの関係

---

## 前回の勉強会で出た話題

「メソッドを動的に定義した場合、それは他プロセスに影響するのか？」という話題が出たので、試してみた。

---

### メソッドの動的定義

```elixir
defmodule LazyDef do
  def define do
    defmodule Greet do
      def say do
        IO.puts "hello"
      end
    end
  end
end

try do
  LazyDef.Greet.say
rescue
  UndefinedFunctionError -> IO.puts "UndefinedFunctionError"
end
#=> UndefinedFunctionError

LazyDef.define
LazyDef.Greet.say
#=> hello
```

---

### プロセス実行後に動的定義

```elixir
defmodule Main do
  def run(n) do
    :timer.sleep n * 100
    LazyDef.Greet.say
  end
end

spawn(Main, :run, [0])
#=> UndefinedFunctionError

spawn(Main, :run, [1])
LazyDef.define
#=> hello

receive do
  {:ok, result} -> IO.puts result
  after 500 -> IO.puts "TimeOut"
end
```

---

### たまに落ちるコード

```elixir
defmodule Def do
  defmacro m(name) do
    quote bind_quoted: [name: name] do
      def unquote(:"m_#{name}")(), do: unquote(name)
    end
  end
end

defmodule A do
  def run do
    defmodule B do
      require Def
      Enum.shuffle(1..5)
      |> Enum.take(2)
      |> Enum.each(&Def.m(&1))
    end
  end
end

A.run
IO.inspect A.B.m_1
```

---

# ご清聴ありがとうございます
Xperia X Performance用ADBドライバをインストールする

以前のXperiaには"PC Companion"という管理ツールがあって、ついでにADBドライバもインストールされていたようなんですが、2016年6月くらいから"Xperia Companion"に強制的に移行となり、どうやらこのツールではADBドライバがインストールされないようです。

ということで、以下のデベロッパサイトからドライバーをダウンロード。
http://developer.sonymobile.com/downloads/drivers/

似たような名前のものがたくさんありますが、Xperia X Performanceに必要なのは、これです。SO-04H、SOV33、502SO共通。たぶん(当方au)。
![xperia.png](https://qiita-image-store.s3.amazonaws.com/0/141731/5e784d9b-ff95-a224-fb19-42c89503895d.png)

ダウンロードしたzipファイル(xperia-x-performance-driver.zip)を展開して、デバイスマネージャーから"そのほかのデバイス"->"Android ADB Interface"を選択(黄色い注意アイコンが付いているはずです)、"ドライバソフトウェアの更新"で展開したフォルダを指定すると、インストールされます。

で、デバイスマネージャーがこんな感じになれば成功です。
![sa0114.png](https://qiita-image-store.s3.amazonaws.com/0/141731/b80f18ff-c730-db5d-f9ec-89995160b096.png)
※"Sony sa0114 ADB Interface Driver"というのは機種によって名称が異なるかも。

なお、あらかじめ実機側で「開発者向けオプション」を有効にしておくのと、初回の接続時に「USBデバッグの許可」を行う必要があります。これをやらないといくら待っても使えないのでご注意くださいませ。
MediaWikiで数式を表示させるプラグインを導入する

MediaWikiで数式を表示させるためにMathプラグインを導入する方法についてのメモです。
わりと大変でした。

# Mathプラグインのインストール
https://www.mediawiki.org/wiki/Extension:Math の指示にあるようにtarボールをダウンロードしてwikiのフォルダにあるextensionsのなかに解凍します。
これは簡単です。

# Mathoidのインストール
Mathプラグインだけでは数式を描画できるわけではないようで、別途数式を描画するためのソフトが必要になります。

代表的なものはTeXでしょうが、どうも今はMathoidというものが推奨されているようなので、これをインストールします。

Mathoidはサーバーとして動作し、MediaWikiのほうからはcurlでアクセスして情報を取得するようです。

Mathoidはnode.jsで動くものなので、node.jsがない場合はインストールしておきます。

Mathoidのインストール作業は次の通り：

```bash
$ mkdir methoid-server
$ cd methoid-server
$ npm install methoid
$ cd node_modules/mathoid
$ cp config.dev.yaml config.yaml
$ vim config.yaml #設定を編集。
```

設定の編集に関してはコメントによればよいでしょうが、一箇所
`module: ./app.js`
という行に関してはどうもこれでは一階層上を参照してしまうらしく、
`module: ./mathoid/app.js`
と修正する必要があります。

あとは
`$ ./server.js`
でmathoidのサーバーが起動します。

`$ curl -d 'q=E=mc^2' http://localhost:10044`
でそれらしい結果が返ってきていれば成功です。

永続的に起動しておくために公式サイトではscreenを使った方法が紹介されていますが、折角node.jsを使っているので、foreverを使えばよいのではないでしょうか：

```bash
$ npm install -g forever
$ forever start ./server.js
```

# LocalSettings.phpの編集
MediaWikiのLocalSettings.phpの末尾に次のように追記します：

```php:LocalSettings.php
wfLoadExtension( 'Math' );
$wgMathValidModes[] = 'mathml';
$wgDefaultUserOptions['math'] = 'mathml';
$wgMathFullRestbaseURL = 'https://api.formulasearchengine.com/';
$wgMathMathMLUrl = 'http://localhost:10044/'; # IP of Mathoid server
```

# その他
基本的には以上なのですが、私の環境では500エラーが出て動きませんでした。エラーの原因はphp5からcurlを使うための拡張がインストールされていなかったことで、
`$ sudo apt-get install php5-curl`
で入れるとエラーが出ずに動くようになりました（環境はdebianです）。
Cognos Analyticsへの移行関連情報

World of Watson 2016の Cognos Analyticsへの移行関連のセッションの中から得た情報をまとめました。


■ インストール関連
・Cognos Analyticsのモジュールは、FixPackのようなイメージで前バージョンに上書き導入できます。
　例えば、11.0.3の導入されているノードのフォルダ上に、11.0.4を上書きで導入します。
　この時、Configurationなどの情報は保持されるそうです。

・2016年11月現在、11.0.4までリリースされていますが、約3ヶ月おきに今後もリリースされ、11.0.6までのリリースは決まっているようです。

・GatewayコンポーネントはSSOなどを行う時のオプションで、基本はWEBサーバー層の実装は不要で、Application Server層のみで動作します。

・Application Serverは、11.0.4時点では組み込みのWebSphere Liberty Profileのみで動作し、WebSphere Application Server NDやBaseを始め、他ベンダーのApplication Serverはサポートされていません。

■ 各Studioの扱い
・NewメニューのOtherからCognos 10のStudioは起動できます。
![image](https://qiita-image-store.s3.amazonaws.com/0/147246/44a422b4-9977-e19a-e5a2-eae6292734c0.png)

・各Studioの扱いは以下となります。
![image](https://qiita-image-store.s3.amazonaws.com/0/147246/b0aee3f3-def9-9a22-5c6f-554ab1e2fff6.png)

・My Inbox や My Watch Itemsは使用できますが、My Data Setsは廃止になりました。
![image](https://qiita-image-store.s3.amazonaws.com/0/147246/86a97fbc-756f-338b-e5ef-ad3f21031beb.png)

■ レポート関連
・レポートを移行すると、「完全な双方向性で実行」が「いいえ」で移行されます。
![image](https://qiita-image-store.s3.amazonaws.com/0/147246/cecd6345-2294-a3ba-fca4-ac33d7afd4f3.png)

いいえの場合のレポート実行イメージ
![image](https://qiita-image-store.s3.amazonaws.com/0/147246/e02522fd-be2d-6ebb-c955-4bd6a0fc60bc.png)


はいの場合のレポート実行イメージ
![image](https://qiita-image-store.s3.amazonaws.com/0/147246/6f104a47-240f-1936-21df-dbd1c59b47de.png)


・JavaScriptの使用について
HTMLItemでJavaScriptを使用している環境は多いと思いますが、上記設定が「はい」のレポートではHTMLItemは使用できません。「いいえ」のまま使用下さい。

「はい」でJavaScriptを使用したい場合、ファイルにソースを保存して、レポート中でCustom Controlオブジェクトのプロパティか、Pageのプロパティの中から、JSファイルを呼び出す実装になります。
こちらのリンクもご参照ください。
https://www.ibm.com/communities/analytics/cognos-analytics-blog/javascript-support-in-interactive-viewer/


■ Cognos Workspaceに関して
前述の通りOtherから使えますが、"Do More"の機能と、"New Report widget"は使用できません。


■ Portletsに関して
以下のように別タブで、Cognos 10のViewerのイメージで実行されます。
新規にPortletsを作成する事や、タブに配置する事はできません。
![014.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/d2d7db49-7f12-b20f-1285-e91c66535b61.png)

■ その他、各種機能の変更状況です
![image](https://qiita-image-store.s3.amazonaws.com/0/147246/fa6a9862-bc58-81b1-e4da-79ee9c8bc34e.png)
![image](https://qiita-image-store.s3.amazonaws.com/0/147246/ed627c91-7f4b-a89b-8b85-2604cfdd8e02.png)