OmniAICreator/Qiita-1.07M huggingface dataset:
Rails で複数DBにつなぐ際のモデルの共通化

## やりたかったこと
* Rails で複数 DB につなぐ
* モデル内の`establish_connection`をするときに共通化

## 環境
* OSX(Yosemite 10.10.5）
* ruby 2.3.0
* Rails 4.2.5

## DBの設定

```config/database.yml
app/config/database.yml
default: &default
  adapter: postgresql
  pool: 5
  database: <%= ENV['RAILS_DATABASE_DATABASE'] %>
  username: <%= ENV['RAILS_DATABASE_USER'] %>
  password: <%= ENV['RAILS_DATABASE_PASSWORD'] %>

development:
  <<: *default
test:
  <<: *default

production:
  <<: *default

anotherdb:
  <<: *default
  database: <%= ENV['RAILS_ANOTHER_DATABASE_DATABASE'] %>
  username: <%= ENV['RAILS_ANOTHER_DATABASE_USER'] %>
  password: <%= ENV['RAILS_ANOTHER_DATABASE_PASSWORD'] %>
```

## 初期状態
最初はここのモデルについて、`establish_connection`をしていたが、

```app/models/hoge/user1.rb
class Hoge::User1 < ActiveRecorde::Base
  establish_connection(:anotherdb)
end
```

```app/models/hoge/user2.rb
class Hoge::User2 < ActiveRecorde::Base
  establish_connection(:anotherdb)
end
```


# 共通化後（失敗）

残念なかんじなので、共通化したモデルをつくり、継承することに

```app/models/hoge/base.rb
# 共通化したモデル
class Hoge::Base< ActiveRecorde::Base
  establish_connection(:anotherdb)
end
```

```app/models/hoge/user1.rb
class Hoge::User1 < Hoge::Base
end
```

```app/models/hoge/user2.rb
class Hoge::User2 < Hoge::Base
end
```

これでいけるかと思いきや、

```
ActiveRecord::StatementInvalid (PG::UndefinedColumn: ERROR:  column user1.id does not exist
```

というエラーが出てしまった。

各モデルで別々に`establish_connection`をしたときはできたので、今回`establish_connection`をした先の DB に id カラムがなかったのは直接の原因じゃなさそう。
どうやらSTI(単一継承テーブル)をActiveRecordがやろうとしているが、今回は親クラスと子クラスでテーブルが違うので、変なことになってそうな感じが

ググってたらRails でモデルを継承しているスライドが

参考
[複数DBとRails](http://sssslide.com/speakerdeck.com/eagletmt/fu-shu-dbtorails)


# 共通化後（成功）
親子のテーブルが違う場合は抽象クラスを定義しなければならないらしい。
そのため、`self.abstract_class = true`を入れれば良さそう

```app/models/hoge/base.rb
class Hoge::Base < ActiveRecorde::Base
  self.abstract_class = true
  establish_connection(:anotherdb)
end
```

これでモデルの共通化ができた
特定のカラム名を持つテーブルを洗い出す。

複数のデータベースに対して
特定のカラム名を持つテーブルを洗い出す場合のSQL実行分

```
SELECT table_schema,table_name, column_name FROM information_schema.columns 
WHERE 
column_name = 'カラム名'
 
 AND (table_schema = 'データベース名' OR table_schema = 'データベース名' OR....
);
```
Generator メモ。

Generator メモ。

Generator は iterator?

PHP:

```php
function generator () {
  yield 0;
  yield 1;
  yield 2;
}
foreach (generator() as $n) {
  echo $n."\n";
}
# 0
# 1
# 2
```

Python:

```py
def generator():
  yield 0
  yield 1
  yield 2

for n in generator():
  print(n)

# 0
# 1
# 2
```

JavaScript:

```js
function* generator () {
  yield 0
  yield 1
  yield 2
}
generator().forEach(function (n) {
  console.log(n)
})
// TypeError: generator(...).forEach is not a function
// あれ...?
```

JavaScript の generator はコルーチンの事で、iterator ではない? でも一般論として iterator からの理解から始めると generator を理解しやすい。でも JavaScript の iterator メソッドで generator をさわる事はできない。
ドメインを初めて取得してみる

## 前提
ブログを始めるために、生まれて初めてドメインを取得する。

## どんなドメインがあるのか
###### 1. gTLD （Generic Top Level Domain）

>
世界中どこからでもアクセスできるドメイン。14種類。
ex) 商業用「.com」 / ネットワーク用「.net」 / 非営利団体「.org」

###### 2. ccTLD （country code Top Level Domain）

>
国内向けのドメイン。200種類以上。
ex) 日本に住所がないと取得できない「.jp」

###### 3. sTLD （sponsored Top Level Domain）
>
スポンサーが付いているドメイン。
ex) モバイル向け「.mobi」 / 航空業界向け「.aero」

## ドメインによってなにが変わってくるのか

###### SEO、品質
>
基本的には差はない。

###### UX
>
「.xyz」なんてドメインだと不安になりませんか？
「.com」 「.jp」であれば見慣れていて安心。
見る人が見れば、サイトの信頼度に関わってくる。

###### 料金
>
・ドメインごとの違い
「.jp」は「.com」「.net」の3倍
・ドメイン業者ごとの違い
どこでも年間1000円前後。違いは数百円。


## で、結局どうするの？
>
ドメインとレンタルサーバは一緒にしたほうがオトクな場合があるので、
レンタルサーバ借りるときにそこで取る。
サイト名が使えるgTLD優先。


## ドメインを変更する場合
初めてやることはだいたい失敗する。ドメインを変える場合の注意点とは？
>
今までのSEOの評価を失う
引き継ぐ方法もあるが、慎重に。
illustratorスクリプト作成用備忘録

Adobe illustratorのスクリプト作成する際に役立つ資料などをまとめた備忘録。

## サンプルスクリプト
IllustratorがインストールされたMacの場合、以下のディレクトリにサンプルコードがある。
JavaScript版とAppleScript版でサンプルが用意されている。

`/Applications/Adobe Illustrator CC 2015/Scripting.localized/Sample Scripts.localized/`

***
## リファレンス

### Adobe illustratorCC Scripting Guide
http://www.adobe.com/content/dam/Adobe/en/devnet/pdf/illustrator/scripting/CC/Illustrator%20Scripting%20Guide.pdf
### Adobe illustratorCC Scripting Reference Javascript
http://wwwimages.adobe.com/content/dam/Adobe/en/devnet/pdf/illustrator/scripting/CC/Illustrator%20Scripting%20Reference%20-%20JavaScript.pdf

***
## 座標
原点はドキュメント左上。
CS4までは左下だったらしいので、昔利用していたスクリプトを再利用する際に注意。（
アートボードにオブジェクトなどを配置する際に予想外な感じになる）

座標の基準値をアクティブアートボード単位に変更することもできる(CS5以降)

ドキュメント単位（デフォルト）
`CoordinateSystem.DOCUMENTCOORDINATESYSTEM;`
↓
アートボード単位
`CoordinateSystem.ARTBOARDCOORDINATESYSTEM;`

https://helpx.adobe.com/jp/illustrator/using/rulers-grids-guides-crop-marks.html
PIXPRO SP360で ライブストリーミングみたいなことをする

[PIXPRO SP360](http://www.maspro.co.jp/products/pixpro/sp360/)を会社で買ってあったのですが、いまいち使い道がなく持て余していました。スマホで画像が見れたりするのはいいのですが、アプリインストール必要だし、peer-to-peerで接続しなくてはダメなので、遠隔地にストリーミングとか無理だよなと思ってました。

ところが、[このページ](http://richard.milewski.us/blog/?page_id=47)にある方法を試したら、ブラウザでアクセスすればアプリ無しでもSP360の画像がストリーミングっぽく見れることが分かりました。この場合、PCとSP360はWiFiで直接繋がっている必要があります。

私がやりたかったのは、遠隔地にいるチームとの朝会で「えーと、今日はみなさん揃ってますか？」という場面での利用でした。HTTPで画像を取得できるのなら、あとはそれをリレーしてやればいいだけですね。というわけで、SP360とWiFiで通信しつつ、reverse proxyで画像を中継するようにRaspberry Piを設定しました。

# Raspberry Pi と SP360 との接続

Raspberry PiにWiFiのドングルをつないで、SP360と接続する設定をします。難しいことは何もありません。

```
$ cat /etc/wpa_supplicant/wpa_supplicant.conf 
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1

network={
    ssid="PIXPRO-SP360_XXXX"
    psk="12345678"
    proto=RSN
    key_mgmt=WPA-PSK
    pairwise=CCMP
    auth_alg=OPEN
}
```

# reverse proxy の設定

nginx使いました。あとは[このページ](https://www.raspberrypi.org/forums/viewtopic.php?t=15878&p=226812)の通りにやっただけです。

```
$ cat /etc/nginx/sites-enabled/raspberry.pi.conf
server {
  listen   8080 default;
  server_name  raspberry.pi;

  access_log  /var/log/nginx/raspberry.pi.access.log;

  location / {
    proxy_pass http://172.16.0.254:9176/;
    proxy_redirect default;
  }
}
```

# SP360の画像を見る

これで、Raspberry Piのアドレスを指定して、`http://<Raspberry Piのアドレス>:8080/` とすれば、SP360の画像が見られるはずです。なお写真の通り、Raspberry Piにイーサネットもつないでいて、上記の「Raspberry Piのアドレス」は、eth0に割り当てられているアドレスのことです。

![IMG_0661.JPG](https://qiita-image-store.s3.amazonaws.com/0/42252/36c65d7b-ce7e-3182-8659-fbb30496869d.jpeg)
JavaFXのMediaPlayerでイコライザ

JavaFXを使ってミュージックプレイヤーを作った際にイコライザを試したのでメモ

## 開発環境

- Java (1.8.0_40)
- JavaFX

## 音楽ファイルの読み込み

まずは音楽ファイルを読み込む。
サポートされているのは`WAV`, `MP3`, `MP4`。

```
File file = new File("FilePath");
Media media = new Media(file.toURI().toString());
MediaPlayer mediaPlayer = new MediaPlayer(media);
```

## イコライザの設定

JavaFXのMediaPlayerではデフォルトでイコライザが実装されている。
`MediaPlayer#getAudioEqualizer`でMediaPlayerに関連付けられている`AudioEqualizer`を取得できる。
`AudioEqualizer#getBands`で設定されているイコライザのリストを取得できる。

```
AudioEqualizer aq = mediaPlayer.getAudioEqualizer();
ObservableList<EqualizerBand> bands = aq.getBands();
```

この`ObervableList`にはデフォルトで10のバンドセットが用意されている。
[公式のAPIドキュメント](https://docs.oracle.com/javase/jp/8/javafx/api/javafx/scene/media/AudioEqualizer.html)より以下がデフォルトの設定。
それぞれのバンドセットに対するゲインはデフォルトで0dB。

| バンド・インデックス | 中心周波数(Hz) | 帯域幅(Hz) |
|:------------------:|:-------------:|:----------:|
| 0                  | 32            | 19         |
| 1                  | 64            | 39         |
| 2                  | 125           | 78         |
| 3                  | 250           | 156        |
| 4                  | 500           | 312        |
| 5                  | 1000          | 625        |
| 6                  | 2000          | 1250       |
| 7                  | 4000          | 2500       |
| 8                  | 8000          | 5000       |
| 9                  | 16000         | 10000      |

例えば500Hz帯のゲインを10dBに設定したい場合は

```
bands.get(4).setGain(10);
```

このバンドセットはデフォルトなので、これに従う必要はない。
独自のバンドセットを定義することも可能。
例えば、3kHzを中心に1kHzの帯域幅で10dBのゲインを持つバンドセットのみを設定する場合

```
bands.removeAll(bands);
bands.add(new EqualizerBand(3000, 1000, 10));
```

一度`ObservableList`の中身を削除した後、新しい`EqualizerBand`を追加することで可能。

## GUIとの連携

変更した値はリアルタイムに適応されるので、
FXMLでスライダーを設置して曲を再生しながらスライダーによる変更などもできる。

```main.fxml
<Slider fx:id="slider32" max="12.0" min="-24.0" orientation="VERTICAL" />
```

設定できるゲインの値が`-24dB`から`12dB`までなので、上記のようにスライダーを設置して

```Main.java
@FXML
private Slider slider32;

@Override
public void initialize(URL location, ResourceBundle resources) {
  slider32.addEventFilter(MouseEvent.ANY, new EventHandler<MouseEvent>() {
    @Override
    public void handle(MouseEvent event) {
      if (event.getEventType() == MouseEvent.MOUSE_RELEASED || event.getEventType() == MouseEvent.MOUSE_DRAGGED) {
        AudioEqualizer aq = mediaPlayer.getAudioEqualizer();
        ObservableList<EqualizerBand> bands = aq.getBands();
        bands.get(0).setGain(slider32.getValue());
      }
    }
  });
}
```

スライダーでマウスイベントが発生したらスライダーの値をゲインに設定することで、
音楽プレイヤーのようにイコライザーの設定ができるようになる。
td-logger-rubyを利用してTreasureDataにログをアップロードする

## 概要
[td-logger-ruby](https://github.com/treasure-data/td-logger-ruby)からforwardしたJSONレコードを[td-agent](http://docs.fluentd.org/articles/install-by-rpm)で受け付け、TreasureDataへアップロードする。
方法については[treasuredataのドキュメント](https://docs.treasuredata.com/articles/ruby)を参考にした。

## 環境構築
CentOS 6.6に以下をインストール

- ruby
- gem
- td-agent

インストール方法は下記の通り

```shell-session
## rubyインストール(今回は現在の最新バージョンを利用)
$ wget https://cache.ruby-lang.org/pub/ruby/2.3/ruby-2.3.0.tar.gz
$ tar xvzf ruby-2.3.0.tar.gz
$ cd ruby-2.3.0
$ ./configure
$ make
$ make install

## gemインストール(今回は現在の最新バージョンを利用)
$ wget https://rubygems.org/rubygems/rubygems-2.5.1.tgz
$ tar xvzf rubygems-2.5.1.tgz
$ cd rubygems-2.5.1
$ ruby setup.rb
$ gem install td

## td-agentインストール
$ curl -L http://toolbelt.treasuredata.com/sh/install-redhat-td-agent2.sh | sh
```

## td-agent.confの編集
/etc/td-agent/td-agent.confを編集する。
DBやテーブルの指定はforwardするクライアント側(td-logger)で設定する。
td-agentはforwardされたログを受け取りtreasuredataにアップロードするだけなので、td-agent使わなくてもアップロードは可能。ただし、td-agentではbufferの管理やリトライ処理等が実装されているため、td-agentを利用した方法が推奨されている。

```conf:td-agent.conf
# Input from Logging Libraries
<source>
  type forward
  port 24224
</source>

# Treasure Data Output
<match td.*.*>
  type tdlog
  endpoint api.treasuredata.com
  apikey YOUR_API_KEY
  auto_create_table
  buffer_type file
  buffer_path /var/log/td-agent/buffer/td
  buffer_chunk_limit 16m
  buffer_queue_limit 1000
  use_ssl true
</match>
```

## 動作確認
以下のスクリプトを作成する。
(DB名、テーブル名は書き換える)

```rb:test.rb
# Initialize
require 'td'
TreasureData::Logger.open_agent('td.<DB名>', :host=>'localhost', :port=>24224)

# Example1: login event
TD.event.post('<table名>', {:uid=>123})

# Example2: follow event
TD.event.post('<table名>', {:uid=>123, :from=>'TD', :to=>'Heroku'})

# Example3: pay event
TD.event.post('<table名>',
              {:uid=>123, :item_name=>'Stone of Jordan',
               :category=>'ring', :price=>100, :count=>1})
```

test.rbを実行する。td-agentの待ち受けポートにJSON形式のログがforwardされる。

```
$ ruby test.rb
```


この時点でbufferファイルが出来上がるが、アップロード開始されるまで時間がかかるので
以下コマンドでbufferをflushする。

```
kill -USR1 `cat /var/run/td-agent/td-agent.pid`
```

以上で、指定したtreasuredataのテーブルにレコードがインポートされる。
SVG から Webfont を生成する

## はじめに
Web 上でアイコンの色を動的に変えたかったので、Webfont を使うことにした。

最初は SVG 画像を使っていたが、色の変更やサイズの変更、ロード時の画像サイズなど色々と面倒が多かったので Webfont 化することに。

(もしかしたら object タグで使っていたから不都合があっただけなのかも…)

[HTTPリクエストを減らすために【WebFont編】ドラッグ＆ドロップしてコマンド叩いてウェーイ](http://t32k.me/mol/log/reduce-http-requests-webfont/)

上記URLを参考に、[grunt-webfont](https://github.com/sapegin/grunt-webfont) でやることに。

## 準備
まずは必要なものをインストール
※ node はすでにインストールされているものとする

```
$ brew instal ttfautohint fontforge --with-python
```

適当に変換用のディレクトリを作成

```
$ mkdir ~/Desktop/SvgToWebfont
$ cd ~/Desktop/SvgToWebfont
```

次に package.json を用意する

```json:package.json
{
  "name": "SvgToWebfont",
  "version": "0.0.1",
  "description": "Convert SVG file to Webfont",
  "main": "Gruntfile.js",
  "devDependencies": {
    "grunt": "^0.4.5",
    "grunt-webfont": "^0.4.8"
  }
}
```

パッケージをインストール

```
$ npm install
```

そして Gruntfile.js を作成。

```js:Gruntfile.js
module.exports = function(grunt) {
  grunt.loadNpmTasks('grunt-webfont');

  grunt.initConfig ({
    pkg: grunt.file.readJSON('package.json'),
    webfont: {
      icons: {
        src: 'icons/*.svg',
        dest: 'build/fonts'
      }
    }
  });

  grunt.registerTask('default', ['webfont']);
}
```

## 変換

ディレクトリ構造はこんな感じ

```
SvgToWebfont
├── build
│   └── fonts
├── icons
└── node_modules
```

grunt を実行する

```
$ grunt
```

と、build/fonts 配下にファイルが出力される。

```
build/fonts
├── icons.css
├── icons.eot
├── icons.html
├── icons.svg
├── icons.ttf
└── icons.woff
```

## 使う

build/fonts をまるごとコピって使うだけ。
使うときは build/fonts ディレクトリをまるごとコピーして、icons.css だけ読みこめば OK。

```html
<link rel="stylesheet" href="{{your path}}/icons.css"></link>
```

ちなみに、icons.html ファイルを開くと、アイコンの一覧とか Webfont を使うためのクラス名が書いてあるページができる。

<img width="281" alt="icons.png" src="https://qiita-image-store.s3.amazonaws.com/0/36620/3663d9c3-58a4-6194-071e-0a49bba4d08d.png">

これを参考に

```html
<body>
  <i class="icon icon_hoge"></i>
</body>
```

と書けばアイコンを使える。

## 所管
* Webfont なので複数の色を持ったものや複雑なものには向かないが、サイズや色を変更できるので好き
* nodejs で動いているので、watch させておいてサーバにアップロードしたら自動で更新とかすれば便利かも
    * わざわざエンジニアがコマンド打たなくてもデザイナーに直接実行してもらえて便利
* ```icon icon_hoge``` の ```icon``` 部分は好きに変更できるが、それはまた別の機会に
{EBImage} と {biOps}

# イントロ

先に紹介した**{biOps}**はエッジ検出周りの関数が非常に充実しています。
[rimagebook - FunctionList.wiki](https://code.google.com/archive/p/rimagebook/wikis/FunctionList.wiki)
ところが、**{biOps}**で画像を取り扱う**imagedata**クラスでは、勝手に[0, 255]に変換されてしまいます。なので、微分画像などを作っても負の値を取らなかったりして、計算過程を組む際の自由度が、低いんです。

**{EBImage}**では、**image**クラスで画像を取り扱います。これは数値を数値のまま取り扱えるので、例えば何らかの測定値を画像表現して概要を掴みながら、そのまま数値計算に落とせます。その代わり、自分で道具を用意しないといけない事が多い。

なので、出来合いの道具でよければ{biOps}、**変な事**をしたければ{EBImage}ですね。

あ、この2つのクラスを変換できる関数が、{RImageBook}に用意されているようですが、手元の環境ではインストールできず(バージョンの問題かも)。

というワケで、まずは{EBImage}での画像の生成関係。

# インストール
[EBImageを使った画像処理](http://d.hatena.ne.jp/Rion778/20091210/1260414280)
[EBImageのインストール方法](https://code.google.com/archive/p/rimagebook/wikis/EBImageInstallation.wiki)
の辺りを参照。

手元の環境では、R上で、

```r
source("http://bioconductor.org/biocLite.R")
biocLite("EBImage")
```
だけでインストールされました。
**何かの拍子**にImageMagicとgtkを入れていれば問題ないと思います。

# imageクラスの生成

数値matrixであれば何でもOKです。
ただし、`display(image)`で表示されるのは、[0,1]が最大256段階のグラデーション、1以上は255になります。えーとつまり、

```r
library("EBImage")
dat <- as.Image(matrix(seq(0, 2, length=100), 10, 10))
display(dat)
```
<img width="300" alt="スクリーンショット 2016-01-28 17.22.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/92401/a1a57381-6b94-9a57-ad1d-2dde1ff00c0c.png">
こんな感じですね。後半は1より大なので、真っ白。
同様に、負の値は真っ黒になります。
これは画像表示がこうなるって話で、数値は元のまま保持されdatに入っています。
あ、`display`は、ブラウザ上で画像が表示されます。

~~{biOps}にはimagedataクラスをmatrixから作る方法は(恐らく)無いので、
やるなら、matrixを`image`で書くのを`tiff`かなんかで一旦保存しておいて、`readTiff`で呼び出す。面倒ですね。~~

`(2016.01.29)`
ありました。記事を修正します。
`imagedata`ですが、これはmatrixの数値を[0, 255]で値を指定する必要があります。
なので、seq[0, 2]のままだと真っ黒になります。

```r
library("biOps")
dat <- matrix(seq(0, 2, length=100), 10, 10)

dat.img <- imagedata(dat*255/max(dat))
plot(dat.img)
```
<img width="300" alt="スクリーンショット 2016-01-29 10.19.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/92401/d639664e-ccb9-3d29-83c9-eca448e8f046.png">
向きが違うのはご愛嬌。
このplotは、RGUI上に出ます。


# サンプルデータの生成
えーと、無理にアレする必要はないんですが、まぁ、[これまで](http://qiita.com/kilometer/items/4f48bd50dd47cf6724c7)と合わせますか。

```r
# 乱数のシード
set.seed(11)
# 円のxy座標を整数値で吐き出す。
x <- round(20*cos(seq(0, 2*pi, by=0.05)) + 31)
y <- round(20*sin(seq(0, 2*pi, by=0.05)) + 31)
xy <- cbind(x,y)
# 乱数に縦線と横線。
a <- matrix(runif(61*61, 0, 100/255), 61)
a[31,] <- 150/255; a[,29:31] <- 100/255
# ゴリ押しで円の部分を白抜き
for(i in 1:nrow(xy))  a[xy[i,1], xy[i,2]] <- 1

# imageに変換
dat <- as.Image(a)
```
<img width="300" alt="スクリーンショット 2016-01-28 17.55.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/92401/8407ef46-7b13-a821-4763-4fda295b51d6.png">

# interporation
解説は、[ここ](http://qiita.com/kilometer/items/4f48bd50dd47cf6724c7)に書いてあります。

{biOps}の**imgScale( )**は、biliner, cubic, splineの3種類が用意されていましたが、
{EBImage}の**resize( )**ではfilter="none" or "bilinear"しか無いっすね。

```r
dat1 <- resize(dat, nrow(dat)*3, ncol(dat)*3, filter="bilinear")
```

<img width="300" src="https://qiita-image-store.s3.amazonaws.com/0/92401/c7bcf0d5-d0fd-1126-0a9b-4cd823bdf075.png">

"none"だと、そのまま当方拡大(補間しない)。
まぁ、今回は"bilinear"を使います。


次は、Cannyフィルタを{EBImage}で打ってみようか。
RailsのRender関数をオーバライドして端末に応じてレイアウトを変える

結局、別のアプローチで対応したのですが端末の種類に応じてrenderするlayoutを変えてみました。

オーバライドを使ったアプローチです。
不採用だったのですが、別でつかえそうなので備忘のため書いておきます。

## コード

```rb
  def render *args
    if request.device_type == :smartphone
      logger.debug :layout
      args.push(:layout=>"sp_layout")
      super *args
    else
      super *args      
    end
  end

```

## 解説
スマートフォンだった場合、レイアウトをsp_layoutを指定してレンダーしたい、
といった内容です。

### super

呼び出すと継承前のrender関数の実行されます。

### *arg
引数を展開した状態で受け取っています。rubyはアスタリスクをつけると変数展開します。

子側でrender 1,2,3,4の実行された場合、オーバライド側ではその引数を親に渡す必要があります。
配列のポインタをうけとり、内容を展開してsuperの引数にしています。

追記

引数を変更したりする必要がない場合はsuperと書くと引数を渡さなくても
暗黙的に渡してくれているそうです。
コメントありがとうございました。
setterでStack Overflowしないために

Kotlinではプロパティに対して自動的にgetter/setterを生成してくれる。
とっても有り難いのです

そしてそれを下のように書いてしまうと・・・？

```kotlin
class Hoge {
  var foo : String
    set(value){
      foo = value
    }
}
```

正しくは以下の通りにfieldと書きましょう

```kotlin
class Hoge {
  var foo : String
    set(value){
      field = value
    }
}
```
jQueryで読み込んだhtmlでangularモジュールを有効にする


```js
$hoge_html = "<div ng-app='myApp'>....</div>";

$('#hoge').html($hoge_html)
```

とかやりたい時がありますよね。ありますよね。私はあります。
しかしこれだけでは```myApp```は有効になりません。

どうせいちゅーねんということで、ggったところ安定のStackOverFlowがヒット。

How to add ng-app to html element without access to html
http://stackoverflow.com/questions/21192332/how-to-add-ng-app-to-html-element-without-access-to-html


結論からいえば、これに記載されているスコア0の方法でうまくいきました。


```js
$hoge_html = "<div id='hoge' ng-app='myApp'>....</div>";

$('#hoge').html($hoge_html)
var hoge = $('#hoge'); // jqLiteではselectorをlookupでないので前もって取得
angular.element(hoge).ready(function() { angular.bootstrap(hoge, ['myApp']); });
```

いろんなやり方があるもんですね。
ご参考まで。
PythonでNewRelic APIを叩いてサーバーの状態を取得する

# 背景
NewRelicは
・Webアプリケーションのパフォーマンス監視
・Webインフラのパフォーマンス監視
・死活監視／アラート
などができる**便利なサーバー監視ツール**であり、それらの統計情報をNewRelicのサイトでみることができる。
http://qiita.com/y_uuki/items/dd4fce78b1bc32b64600
だが、リアルタイムのサーバーの状態を把握するには常にサイトを見ていなければならないので、NewRelicのAPIを使ってサーバーの状態を取得しようと思った。
NewRelicのAPIはPython, Ruby, NodeJSなどの言語でそれぞれ用意されているみたいなので、とりあえず今回はPythonのnewrelic-apiを使ってみた。

# newrelic-apiのインストール
pipまたはeasy_installでインストールできる。
```pip install newrelic-api
easy_install newrelic-api
```

# API Keyの取得
AdminユーザでAPI Keyを取得した。
・参考記事
http://qiita.com/CkReal/items/23a08cd8088876761911

# newrelic-apiでの各サーバーの状態取得
NewRelic APIの公式ドキュメントを参考にサーバーの状態を取得した。
http://new-relic-api.readthedocs.org/en/develop/ref/servers.html

APIを叩くと、各サーバーのid, 名前, 状態などが配列で取得できるので、今回はその中の**色によってサーバーの状態を表す**"health_status"の値を取得した。

<dl>
<dt>health_status</dt>
<dd>green: 正常</dd>
<dd>yellow: 警告</dd>
<dd>red: 危険</dd>
<dd>gray: レポートなし</dd>
</dl>


## 取得配列
```
{u'links': {u'server.alert_policy': u'/v2/alert_policies/{alert_policy_id}'},
 u'servers': [{u'account_id': #{newrelic_account_id},
   u'health_status': u'green',
   u'host': #{newrelic_host},
   u'id': #{server_id},
   u'last_reported_at': u'2016-01-28T07:22:06+00:00',
   u'links': {u'alert_policy': 205236},
   u'name': #{server_name},
   u'reporting': True,
   u'summary': {u'cpu': 0.06,
    u'cpu_stolen': 0.0,
    u'disk_io': 0.0,
    u'fullest_disk': 63.2,
    u'fullest_disk_free': 7547000000,
    u'memory': 63.7,
    u'memory_total': 1043333120,
    u'memory_used': 664797184}},
...
}]}
```

## サンプルコード
```lang:Python
#!/usr/bin/env python
# -*- coding:utf-8 -*-

from newrelic_api import servers

health_statuses = []
states = servers.Servers(#{API-key}).list()["servers"]
    for state in states:
        if state.has_key("health_status"):
            health_statuses.append(state["health_status"])

    print health_statues

```

## 出力結果
9台それぞれのサーバーの状態が取得できた
```
[u'green', u'green', u'green', u'green', u'green', u'green', u'green', u'green', u'orange']
```
![newrelic.png](https://qiita-image-store.s3.amazonaws.com/0/103180/77dc819b-5c11-e93d-8299-1b8c917bbc07.png)


# まとめ
NewRelicのAPIを叩いでサーバーの状態を取得することができた
これを基に、一定時間ごとのサーバーの状態取得や、危険状態になった時にローカル上でアラートを出すなどの応用をしていこうと思う。
CoreDataで生成されたSQLite3をターミナルで直接操作する（XCode7.2 / SWift2.1.1）

CoreDataを仕様したプロジェクトで実際のデータの値を見たかったので、メモしておきます。
実機ではなく、シミュレータでデバッグします。

① AppDelegate.swift編集
自動生成されたAppDelegate.swiftの77行目に、print(url)追加
```let url = self.applicationDocumentsDirectory.URLByAppendingPathComponent("SingleViewCoreData.sqlite")
print(url)
```

② ViewControllerとかのviewDidLoad()等にコード追加
```let coodinator = (UIApplication.sharedApplication().delegate as! AppDelegate).persistentStoreCoordinator
print(coodinator)
```

③ シミュレータでデバッグ開始
Macにsqliteファイルが生成される

④ 出力された文字列コピー
file://**/Users/◯◯◯◯◯/Library/Developer/CoreSimulator/Devices/DF335499-64AE-47AE-8E99-F5333C17CA8E/data/Containers/Data/Application/1E63EEF3-E65A-492D-9F03-87657A543D45/Documents/SingleViewCoreData.sqlite**
<NSPersistentStoreCoordinator: 0x7ca2bc50>

⑤ ターミナルに貼り付けて実行
sqlite3 /Users/◯◯◯◯◯/Library/Developer/CoreSimulator/Devices/DF335499-64AE-47AE-8E99-F5333C17CA8E/data/Containers/Data/Application/1E63EEF3-E65A-492D-9F03-87657A543D45/Documents/SingleViewCoreData.sqlite
AWS Security Token Service（Sts）のサンプル


Aws Security Token Serviceを使ってみる。サイトにのってるのそのままだけど・・・


```
use Aws\Common\Aws;

		$aws = Aws::factory(array(
				'key'		=> 'KEY'
			,	'secret'	=> 'SECRET'
			)
		);
		
		$client = $aws->get('Sts');
		$result = $client->getSessionToken();
		print_r($result);
```

結果は以下の通り。Credentialsあたりの情報でアクセスすればいいのだろう。
このあたりはAPI等（JavascriptでS3にアクセス）で使えるだろう。

しかし、簡単に取得できたけど有効期限変えることできるのかな・・？
まぁ実行した時の時間から考えると長めだったので変更できなくてもいいかなとは思ったけど。。。

```
   [structure:protected] => 
    [data:protected] => Array
        (
            [Credentials] => Array
                (
                    [SecretAccessKey] => XXXXXXXXXX
                    [AccessKeyId] => XXXXXXXXXXXXXXX
                    [SessionToken] => XXXXXXXXXXXXXXXXX
                    [Expiration] => 2016-01-28T19:53:25Z
                )

            [ResponseMetadata] => Array
                (
                    [RequestId] => XXXXXXXXXXXXXXXXXXXXXX
                )

        )
```
python3 + mecabでnode.surfaceが取得できないバグへの対応

日本語形態素解析ができる「mecab」。
ツールとしても優秀だし、各プログラミング言語に組み込まれていろいろなところで使われている。

ところが、Python3上で実装すると「**本来文字が取得できるはずのnode.surfaceで文字が取得できずエラーになる**」ということがある。
そんな時の対応メモ。

実行環境

* MacOS X Yosemite
* Python 3.4.4 :: Anaconda 2.4.1
* mecab-python3 0.7

以下のようにするとバグが発生する。

```py3
tagger = MeCab.Tagger('-Ochasen')
node = tagger.parseToNode(sentence)
while node:
	print(node.surface) # <= 文字が取得できずエンコードエラーが発生
	node = node.next
```

これへの対応は「空文字列をparseした後に目的の対象の文字列をparseする」とうまくいく。（参考: [Ubuntu14.04とPython3でMeCabを使う方法](http://www.trifields.jp/how-to-use-mecab-in-ubuntu-14-04-and-python-3-1196)）

```py3
tagger = MeCab.Tagger('-Ochasen')
tagger.parse('') # <= 空文字列をparseする
node = tagger.parseToNode(sentence)
while node:
	print(node.surface) # <= 文字が取得できる！
	node = node.next
```

なぜかはよくわからないが、これは既知のバグっぽい。
トラップすぎるから早く対応しておいてもらいたい...
JAVA JSP

▪️JSPファイルは必ずWebContentにある

**<FONT color="#ff0000">スクリプトレット</font>**を使うと、
JSPファイルにJavaのコードを埋め込むことができる

▪️スクリプトレットの構文
**<% 
Javaのコード 
%>**

▪️JSPコメント
<%--JSPコメント --%>

▪️スクリプト式の構文
<%= Javaのコード %>

<FONT color="#ff0000">スクリプト式</font>を使うと、
変数やメソッドの戻り値などを出力することができる
お馴染みのSystem.out.println()メソッドと同様、
様々なものを出力することができる。
<%= 変数名 %> → 変数に代入されている値
<%= 演算式 %> → 演算結果

##▪️JSPを作ったら必ず変更する
<FONT color="#ff0000">DOCTYPE宣言</font>
変更前

```java
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
```

変更後

```java
<!DOCTYPE html>
```

<FONT color="#ff0000">DOCTYPE宣言</font>
変更前

```jsp
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
```

変更後

```jsp
<meta charset="UTF-8">
```

※JSPにおける<font color="#ff0000">"pageEncoding"</font>はJSP→servletのJavaコードを生成する場合に 
JSPソースファイルそのものの文字コードを指定するディレクティブですので、 
実行コンテナ側のサーバーに転送される際の文字コードに併せるのが 
妥当。

▪️JSPファイルを直接リクエストできないようにする方法
JSPファイルを「WEB-INF」ディレクトリ以下に配置する
ブラウザはこのディレクトリ以下に配置されたファイルを直接リクエストできない

▪️WEB-INF
ユーザから直接参照されたくない（する必要がない）ファイル」に関しては
全て WEB-INF 以下に配置する
fishシェル使用時にgitにコミットできない場合

fishシェルを入れた環境で、下記のようなエラーが出てGitにコミットできない場合があります。

```
Vim does not support "/usr/local/bin/fish". You must use Vim 7.4.276 or later.
Press ENTER or type command to continue
error: There was a problem with the editor 'vi'.
Please supply the message using either -m or -F option.
```

# 原因
Vimの7.4.276以前のバージョンはfishシェルに対応していませんでした。
これは[対応するパッチ](http://ftp.vim.org/vim/patches/7.4/7.4.276)により解消したのですが、OS X標準のviは対応するバージョンではありません。

# 対処法
1. Homebrew等でバージョン7.4.276以降のvimを入れる
2. コミットログ編集用のエディタを明示的にvimにする（標準では「vi」ですがこちらはHomebrewでvimの新しいバージョンを入れてもOS X標準のままです）

```sh
git config --global core.editor 'vim -c "set fenc=utf-8"'
```

# 参考文献
- [gitのコミットログ編集用エディタをvimにする](http://hikm.hatenablog.com/entry/20110323/1300887533)
- [Vim Magazine 2014年5月号](http://vim-jp.org/vimmagazine/2014/05/31/vimmagazine.html)
クラス名と同じ名前のメソッド

初投稿。
メモ的な意味で残しておきます。

```
class ABC{
    function ABC(){
        echo "hoge";
    }
}
$a = new ABC();
$a->ABC();
```

上記のような記述で結果は

```
hogehoge
```

と出ます。

```
$a = new ABC();
```
とした時点でクラスABCのメソッドABCが呼ばれてることになる。
勉強になったようなそうでないような。
FormHelper 日付のセレクトボックスの日本語化 (CakePHP3)


CakePHP3 では  `$this->Form->input('mob',['type'=>'date'])` や `$this->Form->month('mob')` で日付選択のフォームが生成できて便利なのですが、 


* コード

```php
 $this->Form->month('mob');
```


* 出力

```html
<select name="mob[month]">
<option value=""></option>
<option value="01">January</option>
<option value="02">February</option>
<option value="03">March</option>
<option value="04">April</option>
<option value="05">May</option>
<option value="06">June</option>
<option value="07">July</option>
<option value="08">August</option>
<option value="09">September</option>
<option value="10">October</option>
<option value="11">November</option>
<option value="12">December</option>
</select>
```

と月が英語で出力されます。FormHelperのテンプレートをいじってもなんとかなりますが、
テンプレートをいじらずに、月の部分のみを日本語で出力する方法を調べました。


# 日本語化方法

CakeBookの [Internationalization & Localization](http://book.cakephp.org/3.0/en/core-libraries/internationalization-and-localization.html) を参考にしました。 
多言語アプリケーションを作成する時と同じ方法で日本語化出来るようです。


## 翻訳ファイルの作成

英語に対応する日本語訳ファイル `src/Locale/ja_JP/default.po` を作成します。初期状態ではディレクトリ自体存在していないので、ディレクトリも作成します。内容は以下のように、msgidに対応する日本語をmsgstrに記載する形で羅列します。

```src/Locale/ja_JP/default.po
msgid "January"
msgstr "1月"

msgid "February"
msgstr "2月"

msgid "March"
msgstr "3月"

msgid "April"
msgstr "4月"

msgid "May"
msgstr "5月"

msgid "June"
msgstr "6月"

msgid "July"
msgstr "7月"

msgid "August"
msgstr "8月"

msgid "September"
msgstr "9月"

msgid "October"
msgstr "10月"

msgid "November"
msgstr "11月"

msgid "December"
msgstr "12月"
```

## アプリケーションのデフォルト言語をja_JPに変更
デフォルト英語なので、bootstrap.php のintl.default_localeをja_JPに設定します。

```config/bootstrap.php
...

/**
 * Set the default locale. This controls how dates, number and currency is
 * formatted and sets the default language to use for translations.
 */
ini_set('intl.default_locale', 'ja_JP');

...
```

以上でdefault.po に設定した文字列で生成されます。

FormHelperに限らず、自動生成されるキーワードはこの方法で日本語化できるようです。
ZabbixのDBから履歴を抜き出す時のメモ

<code>select ここはご自由に from items i join hosts h on h.hostid = i.hostid join history his on his.itemid = i.itemid where h.host like '%hogehoge%' and i.name like '%fugafuga%'</code>

ホスト名hogehogeのitem名fugafugaのレコードが引っこ抜ける。zabbixのバージョンで微妙に違う
Rubyのスクリプトでファイル名一括置換

2016.1.29
scivolaさまにご指摘を受け、一部コードを修正しました。ありがとうございます。

# はじめに
初心者向けです。

Rubyに少しは触ってみたい…と漠然と思っていたのですが、
ファイル名を一括でいじりたいなーという機会があり、勉強がてらスクリプトを書いてみました。
（普通にシェルでやれとかリネームツール使えとかいう話ですが…）

# 指定拡張子のファイルを連番にしたい
同じ種類のファイルを連番にしたいなーというとき用。

```lang:rename_target_extension.rb
# 指定拡張子のファイル名を連番にしたい

require 'fileutils'

target = ARGV[0]
prefix = ARGV[1]

if target.nil?
   print "対象とする拡張子を入力してください\n"
   exit
end

Dir.glob("*.#{target}").each_with_index do |filename, index|
  newname = filename.gsub(/.+(?=\.[^.]+$)/) { sprintf("%s%03d", prefix, index) }
  print "#{filename} -> #{newname}\n"
  FileUtils.mv(filename, newname)
end
```

### 実行してみる
リネームしたいフォルダで実行するとこんな感じになります。

```
$ ruby rename_target_extension.rb png hoge
aaa.png -> hoge000.png
bbb.png -> hoge001.png
```

# ファイル名内の指定文字列を置換したい
上で連番にしたようなファイル郡があるときに、一括でファイル名を変更する用。

```lang:rename_target_string.rb
# ファイル名の一部をまとめて置換したい

require 'fileutils'

target = ARGV[0]
conv = ARGV[1]

if target.nil?
  print "対象文字列が空です\n"
  exit
end

Dir.glob("*") do |filename|
  newname = filename.gsub(/#{target}/, "#{conv}")
  if newname != filename
     print "#{filename} -> #{newname}\n"
     FileUtils.mv(filename, newname)
  end
end
```

### 実行してみる
リネームしたいフォルダで実行するとこんな感じになります。

```
$ ruby ../../rb_script/rename_target.rb ho sa
hoge000.png -> sage000.png
hoge001.png -> sage001.png
```

できました＼('ω')／

# 詳解メモ
ここからは自分用のメモみたいなものです。

## ライブラリのロード
```
require 'fileutils'
```

fileutilsをロードすることで、ファイル操作を行えるようになります。

## コマンドライン引数の取得
```
target = ARGV[0]
prefix = ARGV[1]
```

コマンド実行時の引数はARGV[]で取得します。
さらに複数ある場合はARGV[2], ARGV[3]..と入ってきます。
因みに、ruby実行時のファイル名自体を取得したい場合、**$0**で取得できます。
（上記実行例であれば$0で "rename_target_extension.rb" が取得できる）

## 変数の展開
文字列中に式の結果や変数の中身を使いたい場合は、#{}でくくります。

```
Dir.glob("*.#{target}")
```

## フォルダ内のファイル取得
```
Dir.glob("*.#{target}") do |filename|
```
Dir.glob()の引数にマッチするファイルを、カレントディレクトリから取得します。
例えばDir.glob("*")などとすれば全てのファイルが対象になります。

Dir.globだけですと配列を返しますが、
例のように **Dir.glob(..) do |filename| .. end** としたり、
**Dir.glob { |filename| .. }** とすることで、取得した各ファイル名に対する処理を行うことができます。

## 文字列の置換
```
filename.gsub(/#{target}/, "#{conv}")
filename.gsub(/.+(?=\.[^.]+$)/) { sprintf("%s%03d", ARGV[1], index) }
```

文字列に対し、**gsub**を使えば置換が行えます。
正規表現で置換対象を抜き出すこともできます。
複雑な式などはブロック形式（filename.gsub(..){ .. }）の方が見やすくて良さそうですね。

## 拡張子以外の文字列の抽出
```
(/.+(?=\.[^.]+$)/)
```

拡張子を除く部分を抽出する正規表現です。
ざっくり説明すると、**.+**で文字列全体を指定し、
そこから**(?=\\.[^.]+$)**で拡張子部分を排除しています。

**\\.[^.]+$**がカンマから始まってカンマ以外の文字が続いたのち文字列の最後尾に達する部分を示し、
**?=**がその否定を表しています。

(´-`)oO(正規表現ちゃんと勉強しないとなあ…)
Q：さくらインターネットのDNSで独自ドメインのTTL設定を3600より小さい値に設定することは可能か？

A：可能。（例えば60とかに設定することができます）

＜手順＞
http://tanaka.sakura.ad.jp/2011/03/sakura-domain-nameserver-dns-ttl.html
Wordpress.orgのお気に入り機能で、プラグイン検索する手間を省く

WordPress管理画面でプラグインをインストールするとき、毎度毎度いちいち検索するのは面倒なので、お気に入りに入れておく。

##WordPress.orgのアカウントが必要

アカウント作成は[ここ](https://wordpress.org/support/register.php)
そして、アカウントにログインする。

##プラグインページでお気に入りに入れる
■このプラグインのURL→https://wordpress.org/plugins/wp-posted-display/


![お気に入りボタン](https://i.gyazo.com/e063c7ae2374165e11752c78a885aec6.png)



##「WordPress管理画面＞プラグイン＞新規追加」で”お気に入り”タブをクリックする

WordPress管理画面で、「プラグインを新規追加」画面にいくと、
「注目・人気・おすすめ・お気に入り」
...とメニューがあるので、お気に入りをクリックします。

![お気に入りタブをクリック](https://i.gyazo.com/36d92eee525c26aa618a3d15262c9e18.png)



##ユーザー名を入力する
WordPress.orgユーザー名入力欄がでてくるので、
ユーザー名（アカウント作成で作ったもの）を入れます。

![WordPress.orgユーザー名入力欄](https://i.gyazo.com/cb3c4aab80f9174d6bd47e2bce263722.png)




##お気に入り登録したプラグインが出てきます！

あとは、「今すぐインストール」を押すだけ！！

![WordPress.orgユーザー名入力欄](https://i.gyazo.com/4eb73af618c31c4d03a96ea8cc347131.png)
bundleファイルからviewコントローラーを取得しようとしたら、Unknown class [ViewController] in Interface Builder file.って言われた時

#発生した現象
ワークスペースで生成した別プロジェクトのbundleファイルを使おうとしていました。
hogeResources.bundleをアプリのプロジェクトで読み込みます。
こんな感じ。

```objc
NSBundle *bundle = [NSBundle bundleWithURL:[[NSBundle mainBundle]  URLForResource:@"hogeResources" withExtension:@"bundle"]];
```

そして、ストーリーボードを経由して、viewコントローラーを取得します。
こんな感じ。

```objc
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"hoge" bundle: bundle];
HogeController *controller = [storyboard instantiateInitialViewController];
```

ここで問題発生。
Unknown class HogeController in Interface Builder file.
というメッセージがデバッグウィンドウに表示される。

もちろん、ちゃんと動くわけありません。

#どうやって解決したか
アプリ側のプロジェクトのTARGETSから該当するターゲットを指定して、Build Settingsを表示します。

その中にある、Linkingの分類にある、Other Link Flagsをチェックしましょう。
-ObjCが設定されていなければしましょう。

#何が問題なのか？
誰か教えて下さい。

なんか、CocoaPodsの時もこの項目いじった気がしますね。
xcodeの設定は難しいですね。
TypeScriptのtsdが非推奨になったので、typingsへ移行

TypeScriptの[tsdが非推奨](https://github.com/DefinitelyTyped/tsd/issues/269)となりました。代わりに[typings](https://github.com/typings/typings)が推奨されれています。なので自分も早速移行しました。typingsにはtsdからアップグレードする方法も提供されているので、移行も簡単です。

プロジェクトのディレクトリにインストールする人
--------------------------------

```sh
npm uninstall tsd -D
rm -rf typings
npm install typings -D
./node_modules/.bin/typings init --upgrade
rm tsd.json
./node_modules/.bin/typings install
``` 

グローバル環境にインストールする人
------------------------------

```sh
npm uninstall tsd
rm -rf typings
npm install typings
typings init --upgrade
rm tsd.json
typings install
```

型定義ファイルのインストール
----------------------------

tsdとtypingsの型定義ファイルは互換性は無いようです。しかしtsdのDefinitelyTypedはtypingsからも使うことができます。

typingsの型定義を検索とインストールは

```sh
# Search for definitions
typings search <typings_name>

# Install typings
typings install <typings_name>
```

DefinitelyTypedの型定義を扱うには`--ambient` アプションを付けます。

```sh
# Search for definitions
typings search <typings_name> --ambient

# Install typings
typings install <typings_name> --ambient
```

移行後の注意
---

`typings/tsd.d.ts` から `typings/main.d.ts` へと変更となるので、TypeScriptコンパイル時に `typings/main.d.ts` を参照するよう変更する必要があります。

```ts:before
/// <reference path="../typings/tsd.d.ts" />
```
```ts:after
/// <reference path="../typings/main.d.ts" />
```

`tsconfig.json` に設定を書いてる人も、`main.d.ts` へと書き換える必要があります。
material-design-liteのmasterにdialogが追加されていたのでコンパイルして使ってみる

material-design-liteを使いたいけど、モーダルとか自前か〜めんどいな〜と思っていたらmasterブランチにdialogなるディレクトリが追加されていたので、落としてコンパイルして使ってみました。

### masterブランチからcloneして試しているので、ご注意を！

## 試した環境

以下の環境で試してます

・ubuntu16.04

## 落としてきてコンパイル〜導入

公式のgithubに書いてある手順で落としてコンパイルします。

【公式github】
https://github.com/google/material-design-lite

```bash
$ # clone
$ git clone https://github.com/google/material-design-lite.git

$ cd material-design-lite

$ # 必要なライブラリを取り込む
$ npm install

$ # minify
$ gulp
```

これでdistディレクトリが生成されるので、dist配下のmaterial.*ファイルを、自分のプロジェクトの適当なディレクトリに移動する。


## 使ってみる

とりあえずログインダイアログ的なものを出してみました。

```html
<button id="openModal">ログイン</button>
<dialog class="mdl-dialog" id="modal">
  <p class="mdl-dialog__title">ログイン</p>
  <div class="mdl-dialog__content">
    <div className="mdl-textfield mdl-js-textfield mdl-textfield-floating-label is-upgraded">
      <input className="mdl-textfield__input mdl-model" type="text" id="account" name="account" autofocus />
      <label className="mdl-textfield__label" htmlFor="account">アカウント</label>
    </div>
    <div className="mdl-textfield mdl-js-textfield mdl-textfield-floating-label is-upgraded">
      <input className="mdl-textfield__input mdl-model" type="password" id="password" name="password" autofocus />
      <label className="mdl-textfield__label" htmlFor="password">パスワード</label>
    </div>
    <div className="mdl-dialog__actions">
      <button className="mdl-button mdl-js-button close">キャンセル</button>
      <button className="mdl-button mdl-js-button mdl-button--colored">ログイン</button>
    </div>
  </div>
</dialog>

<!-- 以下モーダル表示用js(jQuery) -->
<script>
$(function() {
  $('#openModal').click(function() {
    document.querySelector('dialog').showModal();
  });
});
</script>
```

こんな感じに表示されました！

![スクリーンショット 2016-01-28 15.39.05.png](https://qiita-image-store.s3.amazonaws.com/0/105934/d1cd14e7-4118-74ca-1063-63025fb40ab5.png)
FuelPHP テストモジュールにてSQLでSyntax error

FuelPHP1.7でModelで更新する際にテストコードだったので同じテストデータを更新してテストしてたらSQLエラーになった。

```
Fuel\Core\Database_Exception: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE `カラム` = 1' at line 1 with query: "UPDATE `テーブル` SET  WHERE `カラム` = 1"
```

ふぁっ・・・なんでシンタクスエラーなんだ・・・・
SETの後にWHEREがきているので、更新対象のフィールド判定にミスがあると判断。
とりあえずUpdate文を作るロジックをおってたところ、結果ORMのキャッシュが原因のようでした。
自分の作ったモジュールがFindを使用してたので。。。キャッシュ無効にしてなかった。
もう更新・削除系の処理はFind使わね。query使ってキャッシュ使わないようにしよう。
開発環境

開発を複数受け持っている場合に言語のバージョンが違う
webサーバーもnginxとapacheの組み合わせが多くなってきた
DBもRDBMSとnoSQLと選択多くなってきた
MYSQLの複数インスタンス欲しい
kvsとかもたまに使うよね？(memcacheもね)
継続的インテグレーションをやるためにはjenkinsも入れなきゃいけない
上記を踏まえた上での開発環境構築手順を紹介させて頂きます。
環境

macosx10.8(ホストOS)
centos6.3（ゲストOS）
尚、構築手順はMACOSXでの構築手順になります。
※windowsも適時コマンドを読み替えれば特に問題ないと思います。
入れるもの

VirtualBox

CentOSを動かすための仮想開発環境
開発言語

PHP

PHPerなんで
phpenv
PHPのバージョン変更がコマンド一発でできるもの
php-fpm
nginxでPHPを使うために必要なプロセスマネージャー
memcache
mongo etc… (適当に必要そうなもの全部)
ruby

ビルドツールとかshell以外で構築するにあたって便利なものが色々あります。(Capistranoとか)言語切替とかのスクリプトは大体rubyで書かれていることが多いです。
rbenv
rubyのバージョン変更がコマンド一発でできるもの
chef
環境構築を自動化できるツール。当初はこれでやろうと思ったが理解力が乏しく断念しました。
fluentd
ログを何でもかんでもjsonにできるツール。jsonって便利ですよね
node.js

scoket.ioとか聞いてるとワクワクしますよね！！
nodebrew
node.jsのバージョン変更がコマンド一発でできるもの
node.jsは頻繁にアップデートするのでバージョン切り替えがないと死ねるかもしれません。
JAVA

自分はJAVA知らないがjenkinsは使いたかったので
jenkins
自動ビルドとかに使うツール
WEBサーバー

apache

いつもどおり
nginx

最近はこれ多い
DB

MYSQL

いつもどおり
phpMyAdmin
最近は使いやすくなりました
mongodb

最近話題のnoSQL
rockmongo
mongodb版phpmyadminのようなもの
Sketchでプラグインが使えなくなった際の対応

# ダメになった時の状況
Sketchでプラグインを使っても何も起こらない、もしくはアプリが落ちるようになった。
[Zeplin](https://zeplin.io/)や[Prott](https://prottapp.com/ja/)などプラグインで連携させて使っているので、非常に困った。

# 原因
- 不明
- [Beta版](http://www.sketchapp.com/beta/)を主に使っていたから？

# 対策
- アプリを関連ファイル含めてキレイにアンインストール
    - [AppCleaner](http://freemacsoft.net/appcleaner/)
- アプリを入れなおした。
- プラグインも入れなおした。
    - もしかしたらプラグインフォルダ毎どこかに避難させておいてもよかったのかも…

ちゃんと使えるようになった、コレで大丈夫、以上。
GoogleCalendarに予定を毎朝教えてもらう Google App Script

朝起きた時に今日の予定とか知りたい事ありるじゃないですか
寝坊したやべー、、今日何かあったっけ・・・　とかとか

朝起きて携帯でメールみたらすぐわかると何かと助かりますよね

# 飛んでくるメール

```text:mail
2016/01/28の予定
--------
13時00分 〜 15時00分
○○○○○○MTG

16時30分 〜 17時00分
○○○○○○○○MTG

18時30 〜 23時00分
定時で帰る日
```


# スクリプト

以下のスクリプトを自分のドライブに保存してやると
そのアカウントのカレンダー情報を取得してメール送信できます
※ 初回実行時に認証入ると思うのでテスト実行しておくと良いです

```js:reminder.gs
function dailySchedule() {
  var cal = CalendarApp.getDefaultCalendar();
  var events = cal.getEventsForDay(new Date());
  var body = "";
  var date = new Date();
  var subject = Utilities.formatDate(date,"GMT+09:00","yyyy/MM/dd")+ "の予定";
  var mailto = ""; // 携帯のメアドとか入れてください

  if (date.getDay() === 0 || date.getDay() === 6) { // Sun,Sat
    return;
  }

  if(events.length > 0){
    body = subject + "\n";
    body += "--------\n";
    var time = "";
    for(var i=0; i < events.length; i++){
      if (events[i].getMyStatus() != "NO") {
        body += Utilities.formatDate(events[i].getStartTime(),"GMT+0900","HH時mm分") + " ～ ";  
        body += Utilities.formatDate(events[i].getEndTime(),"GMT+0900","HH時mm分") + "\n";  
        body += events[i].getTitle() + "\n\n";
      }
    }
  } else {
      body = "＼(^o^)／今日は予定ないよ＼(^o^)／";
      exit;
  }

  MailApp.sendEmail(mailto, subject, body);
}
```

# 設定
![スクリーンショット_012816_031114_PM.jpg](https://qiita-image-store.s3.amazonaws.com/0/15626/adce491f-0ae0-c57f-5d6c-5bf819337ab0.jpeg)

以上
JavaScript 手軽にモジュール化する方法メモ


jsで手軽にモジュール化する方法のメモです。

名前空間を作ったり、
ちゃんとしたモジュールパターンの記事などはこちら
http://qiita.com/Im0_3/items/3d46f900aa4d4c5c3cde
http://qiita.com/KENJU/items/a8a1009f5872a8b12568


kissメソッド、
hugメソッドなどを持っている、
Loveというモジュールの例です。微妙ですが。

即時関数でくくって作ります。

```js:module.js
var Love = (function(w, d){
	return{
		kiss:function(){
			console.log("キッスします");
		},
		hug:function(){
			console.log("ハグします");
		},
		// pタグの中身を「愛」に変更するメソッド
		changeTextLove:function(){
			var list = d.querySelectorAll('p');
			for(var i = 0; i<list.length; i++){
				list[i].innerHTML = "愛";
			}
		}
	};
})(window, window.document);
```

使い方は普通にモジュール化したjsを読み込んで、
Love.kiss();
Love.hug();
のように使います。


```html:index.html
<!DOCTYPE html>
<html lang="ja">
<head>
	<meta charset="UTF-8">
	<title>モジュールの作り方コードメモ</title>
</head>
<body>
	<p>恋</p>
	<p>初恋</p>
	<p>淡い恋</p>

	<!-- モジュール読み込み -->
	<script src="module.js"></script>

	<script type="text/javascript">
	document.addEventListener('DOMContentLoaded', function() {
		Love.kiss(); // キッスします
		Love.hug(); // ハグします
		Love.changeTextLove();
	});
	</script>
	
</body>
</html>
```

以上。
Fluentdのout_fileプラグインで出力したファイルからElasticsearchにbulkインポートしたくなることってよくありますよね？

※当記事は[個人ブログ](https://tech.tsukapah.com/bulk-import-with-bash/)に移行しました

bashのワンライナーで強引にbulkインポート用のフォーマットに書き換えちゃいます。
以下のコマンド結果をファイルにリダイレクトするとか、curlの引数にコマンド置換で渡すでもいいです。コマンドが長いのでたいていファイルに書きだしちゃいますが。
全部同じインデックス、ドキュメントタイプにすることを前提にしてます。
あと、時刻のフォーマットを書き換えてる正規表現については必要があれば変えてください。(3つ目の`-e`のとこです)


```bash
$ awk -F '\t' '{print $1","$3}' <対象ファイル> | \
	sed -e 's/{//g' \
		-e 's/^/{"@timestamp":/g' \
		-e 's/\([0-9]\{4\}\)\/\([0-9]\{2\}\)\/\([0-9]\{2\}\) \([0-9]\{2\}:[0-9]\{2\}:[0-9]\{2\}\) \(+[0-9]\{4\}\)/"\1-\2-\3T\4\5"/g' \
		-e 'i\{"index":{}}\'
```

まぁ、他にいくらでも方法あると思いますが...

fluent-plugin-elasticsearchとかで最初から入れろよって話もありますが、それはそれ。
WordPressの固定ページで、WP_Queryで記事を取得するもページネーション（the_posts_pagination）がうまく動作しない場合の解決方法。

*※この記事は、[個人ブログ](http://blog.motoo.net/2016/01/28/095507)からのマルチポストです。*

ちょいと調べてみたけど、結構その対応手段がネットに公開されていなかったので、ソース調べてみた。

`get_the_posts_pagination()` 内で、`$GLOBALS['wp_query']->max_num_pages` が1以上じゃないと処理をしないのに、固定ページ内で `WP_Query` を回しても `$GLOBALS['wp_query']->max_num_pages` には値が入っていないのが原因。

なので、自分でぶっ込んでやれば良いみたい。

```lang:PHP
<?php
//pagedに値をセットするのを忘れずに！
$the_query = new WP_Query( array(
  'paged'       => get_query_var( 'paged' ) ? intval( get_query_var( 'paged' ) ) : 1,
  'post_type'   => 'post'
) ); ?>

<?php	if ( $the_query->have_posts() ) while ( $the_query->have_posts() ) : $the_query->the_post(); ?>

<!--ここで記事を表示-->

<?php	endwhile; ?>

<?php
//ページネーション表示前に$GLOBALS['wp_query']->max_num_pagesに値をセット
$GLOBALS['wp_query']->max_num_pages = $the_query->max_num_pages;
the_posts_pagination();
wp_reset_postdata();
?>
```

こんな感じ。（2016年1月28日現在。WordPressのバージョンは4.4.1）
coreos-vagrant を clone してきて、VMのメモリを増やす

# 概要

[coreos/coreos-vagrant: Minimal Vagrantfile for CoreOS](https://github.com/coreos/coreos-vagrant)

を、使うときにメモリの割り当てを増やしたい。

githubよりcoreos-vagrant を clone してきて、何も変更しないと
メモリは 1G 割り当てられている。
このメモリの割り当てを増やしたい。

# 結論

設定用のファイルのサンプルがあるので、それをconfig.rbとしてコピーするか、config.rbを作り、その中の ***$vm_memory*** を書き換える。

## 補足

一度仮想マシン(coreos)を作った後に、(少なくとも) Virtualbox では、GUIの管理画面上メモリを変更しても、再び ***vagrant up*** すると、メモリ割り当ては元に戻ってしまった。

もしかしたら、VirtualboxのGUI上で、マシンを起動すると割り当ては自分の望むものになるかもしれないが、、、今回はそれを望んでいないので、チェックしない。


## coreos-vagrant の .gitignoreを覗いてみる

2016-01-28現在だと .gitignore 以下のようになっていた

```
.vagrant/
log/
user-data
config.rb
```

これより、 ***config.rb*** は、gitの管理外であることがわかった。

# 実際の作業

```
git clone https://github.com/coreos/coreos-vagrant/
cd coreos-vagrant
cp config.rb.sample config.rb
```

VMの割り当てを増やすには、config.rbの中のvm_memoryを変更する

サンプルでは以下のようになっているので

```
# Customize VMs
#$vm_gui = false
#$vm_memory = 1024
#$vm_cpus = 1
```

4096 に変更するには以下のようにする

```
# Customize VMs
#$vm_gui = false
$vm_memory = 4096
#$vm_cpus = 1
```

立ち上げる

```
vagrant up
```

結果の確認

```
$ cat /proc/meminfo
MemTotal:        4051752 kB
```

### その他

その他にも色々設定は書き換えられそう。
ドキュメントを読んでみると良い。

[coreos/coreos-vagrant: Minimal Vagrantfile for CoreOS](https://github.com/coreos/coreos-vagrant)
opensslコマンドでランダム文字列を生成

たまに必要になるけど、その時にはいつも忘れているシリーズ。

初期パスワードや何かTokenを生成する時などに。

```
openssl rand -hex 8
```

8は長さ。`-hex`の代わりに`-base64`も可能で、こっちにすると記号も入ってくる。
c++ builder XE4, 10.2 Tokyo > TForm > Minimumの解除 > Form1->WindowState = wsNormal;

```txt:動作確認
C++ Builder XE4
Rad Studio 10.2 Tokyo Update 2 (追記: 2017/12/27)
```

最小化処理されたフォームを通常の大きさに戻す方法

参考: http://stackoverflow.com/questions/6368276/delphi-maximize-a-form-to-a-particular-screen

```		
Form1->WindowState = wsNormal; // Minimumの解除
```
Nginxリバースプロキシのタイムアウト対策

ネットワークアプライアンス的なもんのGUIにnginxでたてたリバースプロキシを経由してアクセスしてたところ、更新後に接続がぶった切られる現象で作業がはかどらないとの報告があり、以下の感じにtimeout関連のパラメータをざっくり変えて様子をみることに。

```
$ sudo vi nginx.conf
$ sudo service nginx configtest
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
$ diff nginx.conf{,.`date +%Y%m%d`}
25,31c25
<     keepalive_timeout  130;
<     send_timeout 130;
<     client_body_timeout 130;
<     client_header_timeout 130;
<     proxy_send_timeout 130;
<     proxy_read_timeout 130;
< 
---
>     keepalive_timeout  65;
$ sudo service nginx restart
```

参考書籍によるとデフォルト値はだいたい60秒でした。
ほかにも`fastcgi_{read,send,connect}_timeout`とかあったけどローカルにコンテンツはなく`fastcgi`使ってないし、
`proxy_connect_timeout`はコネクション確立で切られることはないから不要そう、
短に`timeout`は終了待ちっぽいので終わってからそんなに待ってもしょうがないのでとりあえずいいやと。
`ssl_session_timeout`とかはセッションキャッシュ設定いれてないと意味なさそげだしセッション確立のCPU処理コストがちょっと減るかもくらいの問題で待ちとは関係ないのかなと思ってスルーしました。

ちなみにログ的にはこんなかんじでした。これ自体はinfoだしクライアント側から接続切ってるだけとかかもしれず。

```
2016/01/25 03:25:06 [info] 7049#0: *26464 client 10.127.xxx.xxx closed keepalive connection (104: Connection reset by peer)
2016/01/25 06:08:30 [info] 7049#0: *26475 client closed connection while waiting for request, client: 10.127.xxx.xxx, server: 0.0.0.0:443
```

パラメータ変更後、更新メンテを経てerror.logをみたところなんだかwarnがでていたので追記です。

```
2016/02/02 00:21:06 [warn] 13855#0: *3429 a client request body is buffered to a temporary file /var/cache/nginx/client_temp/0000000002, client: 10.127.xxx.xxx, server: fuga01.hoge.net, request: "POST /cgi-mod/index.cgi HTTP/1.1", host: "fuga01.hoge.net", referrer: "https://fuga01.hoge.net/cgi-mod/index.cgi?xxxxx=xxxx&xxxx=xxxxx..." 
```

メモリからあふれてtempファイルに書いてるからI/Oがかかってるっぽいです。
[nginxのリクエストボディのバッファリングに関する問題とその改善策 - Qiita](http://qiita.com/cubicdaiya/items/0678396f11982e537e2d)
[nginx で a client request body is buffered to a temporary file の警告に対応してみる | レンタルサーバー・自宅サーバー設定・構築のヒント](http://server-setting.info/centos/client-request-body-to-temporary-file.html)
[nginxをリバースプロキシにした時にPOSTがこける - tumblr](http://shim0mura.hatenadiary.jp/entry/20120701/1341162337)
この↑へんをみると、client_body_buffer_sizeを増やすといいのかなーと思いました。
まあPOSTにちょっと時間かかっただけで失敗した話は聞いてないんで緊急度は低めのようですね。
（大量のユーザがアクセスするコンテンツとかではなくメンテする人がさわるだけの環境なため）

参考：
「[マスタリングNginx](http://amzn.to/1NzClLW)」のディレクティブ一覧を念入りに眺めてみました。超いい本です。
[Nginx をリバースプロキシ(キャッシュ) として使ってみた | レンタルサーバー・自宅サーバー設定・構築のヒント](http://server-setting.info/centos/apache-nginx-10-proxy.html)
[Module ngx_http_proxy_module](http://nginx.org/en/docs/http/ngx_http_proxy_module.html)
[【nginx】レスポンスタイムアウトの設定メモ｜ばちブロ](http://vatchcjplog.blog.shinobi.jp/nginx/%E3%80%90nginx%E3%80%91%E3%83%AC%E3%82%B9%E3%83%9D%E3%83%B3%E3%82%B9%E3%82%BF%E3%82%A4%E3%83%A0%E3%82%A2%E3%82%A6%E3%83%88%E3%81%AE%E8%A8%AD%E5%AE%9A%E3%83%A1%E3%83%A2)
[フロント/バックのreverse proxy構成で、指定秒数以内に必ずレスポンスを返す方法 - (ひ)メモ](http://d.hatena.ne.jp/hirose31/20100623/1277258671)
[Nginx設定のまとめ - Qiita](http://qiita.com/syou007/items/3e2d410bbe65a364b603)
javaからMySQLにアクセス

#概要
JavaからMySQLを操作したい時のメモ。
JavaからMySQLへの接続をシンプルなサンプルでメモする。

* Tomcat 7
* Java 7
* MySQL 5.6

## server.xml
Tomcat7の設定ファイルにContextを追加する。
DBConnect：プロジェクト名
username：MySQLへのログインユーザーID
password：MySQLへのログインユーザーパスワード
url：ローカルホストにインストールしたMySQL

      <Context docBase="DBconnect"
               path="/DBconnect"
               reloadable="true"
               source="org.eclipse.jst.jee.server:DBconnect">
        <Resource
                 auth="Container"
                 driverClassName="com.mysql.jdbc.Driver"
                 name="jdbc/selfjsp"
                 username="root"
                 password="root"
                 type="javax.sql.DataSource"
                 url="jdbc:mysql://localhost/selfjsp" />
      </Context>

## web.xml
「res-ref-name」はserver.xmlのnameと合わせるよう注意。

	<?xml version="1.0" encoding="UTF-8"?>
	<web-app
	        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	        xmlns="http://java.sun.com/xml/ns/javaee"
	        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
	                    http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
	        id="WebApp_ID" version="3.0">
	
	  <display-name>DBconnect</display-name>
	  <welcome-file-list>
	    <welcome-file>index.html</welcome-file>
	    <welcome-file>index.htm</welcome-file>
	    <welcome-file>index.jsp</welcome-file>
	    <welcome-file>default.html</welcome-file>
	    <welcome-file>default.htm</welcome-file>
	    <welcome-file>default.jsp</welcome-file>
	  </welcome-file-list>
	
	
	  <resource-ref>
	    <res-ref-name>jdbc/selfjsp</res-ref-name>
	    <res-type>javax.sql.DataSource</res-type>
	    <res-auth>Container</res-auth>
	  </resource-ref>
	</web-app>

## JSP

	<%@ page contentType="text/html;charset=UTF-8" import="java.sql.*, javax	.naming.*, javax.sql.*" %>
	<!DOCTYPE html>
	<html>
	<head>
	<meta charset="UTF-8" />
	<title>データベースへの接続</title>
	</head>
	<body>
	<%
	Context context = new InitialContext();
	DataSource ds = (DataSource)context.lookup("java:comp/env/jdbc/selfjsp")	;
	Connection db = ds.getConnection();
	db.close();
	%>
	
	データベースへの接続に成功しました。
	</body>
	</html>
wgetでページとそれに付随するCSS・JSなどを保存する

wgetでひとつのページとそのページが使っている画像・CSS・JSなどのアセットも同時に保存する方法です。

```
wget --page-requisites \
     --convert-links \
     --quiet --show-progress \
     --no-host-directories  http://example.com/
```

## パラメータの説明

* `--page-requisites`: ページが使っている画像・CSS・JSをダウンロードします。
* `--convert-links`: CSS・JSへの参照がURLになっている部分を相対パスに変換します。
* `--quiet --show-progress`: 1ダウンロード1行で表示する設定です。
* `--no-host-directories`: ホスト名でディレクトリを作らない設定です。


## ダウンロードしたファイルの確認方法

ダウンロードしたファイルを確認するには、index.htmlを開く方法もありますが、google fontsなどCDNに依存しているHTMLだとエラーになるので、ダウンロードしたindex.htmlがある場所でPythonのSimpleHTTPServerを立てて、`http://localhost:4000`などにアクセスし確認するとよいです。

```
python -m SimpleHTTPServer 4000
```