OmniAICreator/Qiita-1.07M huggingface dataset:
RubyでN次元の超直方体中の格子点に対してループを回す

## 問題設定

２次元の長方形（xの領域は [x0,x1] , yの領域は [y0,y1]）の中に含まれる格子点に対してループを回したい場合、Rubyでは以下のように書くことができる。
（ただし、x0,x1,y0,y1はIntegerとする）

```
(x0..x1).each do |x|
  (y0..y1).each do |y|
    puts “#{x}, #{y}"
  end
end
```

３次元の直方体の場合は、同様に３重ループを使って

```
(x0..x1).each do |x|
  (y0..y1).each do |y|
    (z0..z1).each do |z|
    puts “#{x}, #{y}, #{z}"
  end
end
```

これを一般のN次元の場合にRubyでどう書けばよいか？

## 実装方法１ Array#productを使う

Arrayには直積を計算する`product`というメソッドが存在する。これを用いると以下のように簡潔に書くことができる。

```product.rb:ruby
ranges = [ 1..3, 4..5, 6..9 ]  # 各次元の定義域をRangeで持つ配列

arrays = ranges.map {|range| range.to_a }
arrays[0].product( *arrays[1..-1] ) {|a| p a }   # => [1,4,6], [1,4,7], .... [3,5,9]
```

ただし、**productにblockを渡さない場合は格子点をすべて含んだ配列を作成してしまう**
Nが大きくなって格子点の数が指数関数的に増えてきた場合、メモリ消費量やオブジェクトの生成コストが膨れ上がってしまうので注意。
blockを渡していれば格子点に対してループを回しながらブロックを評価する。

## 実装方法２ 自前で再帰的に書く

再帰的にループにする。Enumeratorを使った。

```enumerator.rb:ruby
ranges = [ 1..3, 4..5, 6..9 ]

e = Enumerator.new do |y|
  point = Array.new( ranges.size, 0 )

  iterate_in = lambda do |d|
    ranges[d].each do |x|   # d次元目に対するループ
      point[d] = x
      if d + 1 < point.size
        iterate_in.call( d+1 )
      else
        y << point
      end
    end
  end

  iterate_in.call(0)
end

e.each {|(x,y,z)| p [x,y,z] }    # => [1,4,6], [1,4,7], ..... [3,5,9]
```

この方法の場合、`e`はEnumeratorのオブジェクトなので each_with_indexなどのメソッドも利用出来る。

```
e.each_with_index {|(x,y,z),idx| p [x,y,z],idx }
# =>
#   [1, 4, 6]
#   0
#   [1, 4, 7]
#   1
#   ...
```

## 二つの方法の比較

速度の差が無いか確認してみた。

- 実行環境
  - ruby 2.2.0p0
  - Mac Pro (Mid2012) (3.2GHz Quad-Core Intel Xeon)

実行時間の測定にはBenchmarkモジュール、メモリ使用量の測定には `ObjectSpace.memsize_of_all` を利用した。

```test_compare.rb
require 'objspace'
require 'benchmark'

def points(ranges)
  Enumerator.new do |y|
    point = Array.new( ranges.size, 0 )

    iterate_in = lambda do |d|
      ranges[d].each do |x|
        point[d] = x
        if d + 1 < point.size
          iterate_in.call( d+1 )
        else
          y << point
        end
      end
    end

    iterate_in.call(0)
  end
end

def points2(ranges)
  arrays = ranges.map {|range| range.to_a }
  arrays[0].product( *arrays[1..-1] ) {|a| yield a }
end

memusage = {before: ObjectSpace.memsize_of_all }
ranges = [1..10, 1..10, 1..10, 1..10, 1..10, 1..10, 1..10]  # 10^7点に対するiteration
Benchmark.bm 10 do |r|
  r.report "enumerator" do
    points(ranges).each {|(x,y,z)| x+y+z }
    memusage[:enumerator] = ObjectSpace.memsize_of_all
  end

  r.report "product" do
    points2(ranges) {|(x,y,z)| x+y+z }
    memusage[:product] = ObjectSpace.memsize_of_all
  end
end
memusage.each {|key,val| memusage[key] = "#{val/1048576}MB" }
p memusage
```

実行結果は

```result2.txt
                 user     system      total        real
enumerator   3.550000   0.010000   3.560000 (  3.559787)
product      4.780000   0.030000   4.810000 (  4.834131)
{:before=>"2MB", :enumerator=>"2MB", :product=>"2MB"}
```

- productはCで実装されているので速いかと思ったが、少しだけenumeratorを使った方が速かった。Enumeratorの実装では、ループ変数を使いまわしているのでオブジェクトの生成コストが抑えられているのかもしれない。
- メモリ消費についてはどちらの実装でも適切に抑えられている。試しにproductに対してblockを渡さずに実行したところ1GB近くのメモリを消費していた。
GitHubを使っているならハイライト機能を使わなきゃ損！

複数人で開発をしているときや技術記事を書いている時、「このソースコードのこの箇所を確認してもらいたい」ということがありませんか？ そんな時はGitHubのハイライト機能を使いましょう。

#基本編：単一行のハイライト
GitHubのソースコード上の行番号をクリックすると、その行がハイライトされます。
![](https://qiita-image-store.s3.amazonaws.com/0/67884/0b076943-f110-1497-f206-3880958d0c6c.png "ハイライトキャプチャー.png")

この時、ブラウザのアドレスバーのURL末尾に「#L(行数)」が付与されるので、このURLをシェアするとハイライトされた状態でソースコードをシェアすることができます。
例： https://github.com/tonkotsuboy/testCodes/blob/master/1217_github_tagtest/index.html#L10

#応用編：複数行のハイライト
[Shift]キーを押しながら二つの行番号をクリックすると、その行番号の間がハイライトされます。複数行を確認してもらいたいときに便利です。
![複数ハイライト2.gif](https://qiita-image-store.s3.amazonaws.com/0/67884/cb6c5266-0d41-eb8b-5185-5d6c8e0c1cf2.gif)


アドレスバーのURL末尾に「#L(開始行数)-L(終了行数)」が付与されるので、このURLをシェアするとハイライトされた状態でソースコードをシェアすることができます。

例：https://github.com/tonkotsuboy/testCodes/blob/master/1217_github_tagtest/index.html#L10-L16


#タグ機能と組み合わせるとより正確
さて、せっかく行番号をハイライトしても、新たなコミットにより行番号が変わってしまう場合があります。なので、このハイライト機能はタグ機能と組み合わせて使うのがお勧めです。タグのついたコミットに対してハイライトをすれば、その行番号は変わることはありません。

例： https://github.com/tonkotsuboy/testCodes/blob/6shops/1217_github_tagtest/index.html#L13
fastqファイルからランダムサンプリングする

[色々](https://sites.google.com/site/scriptofbioinformatics/ngs-guan-xi/daunsanpuringu-ngs)[方法](https://github.com/dritoshi/ngstips/blob/master/qc/randomsampling.md)はあると思いますがここでは[fastq-tools](https://github.com/dcjones/fastq-tools)を使用します。

###インストール

```sh
git clone https://github.com/dcjones/fastq-tools
cd fastq-tools
sudo sh autogen.sh && sudo ./configure && sudo make install
```

###実行

色々コマンドがありますが、ここでは`fastq-sample`を用います。
~~サンプル元ファイルはgzされていてもいなくてもかまいません~~
いったん解凍しなければならないようです。

~~```sh
fastq-sample -p 0.1 path/to/my.fastq.gz -o splitted
```~~

```sh
fastq-sample -p 0.1 path/to/my.fastq -o splitted
```
カレントディレクトリに`splitted.fastq`ができます。

ここでは`-p`でサンプルする割合を指定しましたが、`-n`で数を指定することも可能です。
- `-r` ... 復元抽出する。デフォルトは非復元抽出
np.arrayで各行それぞれの好きな列に代入する


こういう細かいやり方がいちいちわからん

```python
>>> import numpy as np
>>> A = np.zeros((4,2))
>>> A
array([[ 0.,  0.],
       [ 0.,  0.],
       [ 0.,  0.],
       [ 0.,  0.]])
>>> index = np.array([0,1,0,1])
>>> index
array([0, 1, 0, 1])
>>> values = np.array([10,20,10,10])
>>> values
array([10, 20, 10, 10])
>>> A[np.arange(4),index] = values
>>> A
array([[ 10.,   0.],
       [  0.,  20.],
       [ 10.,   0.],
       [  0.,  10.]])
```
MacBookにBootCampでUSB版Windows10をインストールする際にディスク容量不足で失敗した時の対処方法

一応防備録として。もしかして皆さんとっくにご存じなのかもしれませんが。。。

量販店で購入した Windows10 HOME通常版(メディアはUSB)を MacBook Pro(2015年購入)にBootcamp Assistant でインストールする際、購入したUSBメディアからディスクイメージ(.iso)を作ってはいけません。このディスクイメージを使って Bootcamp Assistant を実行すると、途中で「ディスク容量が足りません」というまったく意味不明のメッセージが出てインストールに失敗します。恥ずかしながら最初まったく原因がわからずに何回もパーティション切り直してしまいました。

正しくは「Microsoft の Windows10 のダウンロードページからダウンロードしたイメージ(.iso)を使う」です。

参考までに Apple のサポートページをあげておきます。

[Boot Camp を使って Mac で Windows 10 を使う](https://support.apple.com/ja-jp/HT204990)
[Boot Camp を使って Windows をインストールする方法](https://support.apple.com/ja-jp/HT201468)
[Windows インストールメディアから Boot Camp 用の ISO イメージを作成する](https://support.apple.com/ja-jp/HT203909)

しかし、最後の「Windows インストールメディアから Boot Camp 用の ISO イメージを作成する」は、USBメディアからする必要はありません。
iPhone  Safari iframeでyoutube動画を埋め込む際 srcの最後に「#」を付けると強制的にアンカーリンクになる

# 現象

iframeでyoutube動画を埋め込んでいるページを表示する際にiframeのsrcの最後に「#」がついていると動画のタイトル下まで強制的に移動する。
※iOS9.2 Safariで現象確認

```html:iframe
<iframe src="https://www.youtube.com/embed/{動画ID}#" frameborder="0" allowfullscreen="allowfullscreen">...</iframe>
```

# 解決策

「#」を削除すればアンカーリンクになりません。
rubyの正規表現で動画のIDを取得したい場合は

```rb:正規表現
"#{youtube動画url}".match(/\?v=([^&#]+)/)
```
Phoenix 1.0から1.1へのアップデートガイド

本日（12/17）、Phoenix 1.1が正式にリリースされましたので早速使ってみた。

1.1には[gettext](https://github.com/elixir-lang/gettext)を使った国際化対応のサポートや、channelのパフォーマンス改善、Instrumentation hooksの追加などがあるそうな。

# 前提

既に1.0で動いているPhoenixアプリケーションを1.1にアップデートすることが前提。

## 注意点

基本的に`mix.exs`への変更が中心だが、1.1での後方互換の無い変更として、以下がアナウンスされているため、そこだけコードをいじる。

- Backward incompatible changes
    - [View] The `@inner` assign has been removed in favor of explicit rendering with render/3and the new `@view_module` and view_template assigns, for example: `<%= @inner %>` is replaced by `<%= render @view_module, @view_template, assigns %>`

layoutなどで使っていた`<%= @inner %>`を`<%= render @view_module, @view_template, assigns %>`にしろ、とのこと。

# 手順

## Phoenix本体のアップデート

```bash
$ mix archive.install https://github.com/phoenixframework/phoenix/releases/download/v1.1.0/phoenix_new-1.1.0.ez
```

## 依存関係のアップデート

`mix.exs`を以下のように変更する。

```mix.exs
  # ...省略

  # Configuration for the OTP application.
  #
  # Type `mix help compile.app` for more information.
  def application do
    [mod: {Test, []},
     applications: [:phoenix, :phoenix_html, :cowboy, :logger, :gettext, # gettextを追加
                    :phoenix_ecto, :postgrex]]
  end

  # ...省略

  # Specifies your project dependencies.
  #
  # Type `mix help deps` for examples and options.
  defp deps do
    [{:phoenix, "~> 1.1.0"},                       # phoenixのバージョンを1.1に
     {:phoenix_ecto, "~> 2.0"},                    # phoenixのバージョンを2.0に
     {:postgrex, ">= 0.0.0"},
     {:phoenix_html, "~> 2.3"},                    # phoenixのバージョンを2.3に
     {:phoenix_live_reload, "~> 1.0", only: :dev},
     {:gettext, "~> 0.9"},                         # gettextを追加
     {:cowboy, "~> 1.0"}]
  end

  # ...省略

```

編集後、`mix deps.update --all`で依存関係を更新。


## 後方互換のない変更への対応

layoutなどで使っていた`<%= @inner %>`を`<%= render @view_module, @view_template, assigns %>`にしろ、とのことなので、まずはgrepするなりして`@innner`を使っているところを洗い出す。あとは単純に置き換えればOK。

## 動作確認

```bash
$ mix test
```

テストして`mix phoenix.server`して普通にアクセスできれば問題ないかと。
バッチファイルを非表示のまま起動するためのVBScript

筆者の備忘録として。
[バッチファイルを実行する時に黒いコマンドプロンプト画面を表示しない方法](http://amaotolog.com/pc-benri/33)を参考に、より汎用的に使用できるように改造してみた。

```txt:VBScript
Option Explicit

Const vbHide = 0 'ウィンドウを非表示

Function ArgsToString()
   Const DELIMITER = " "
   Dim ret
   Dim i
   Dim n

   ret = ""
   n = Wscript.Arguments.Count
   If n > 0 Then
     For i = 1 To n
       If i < n Then
         ret = ret & Wscript.Arguments(i - 1) & DELIMITER
       Else
         ret = ret & Wscript.Arguments(i - 1)
       End If
     Next
   End If
   ArgsToString = ret
End Function

Dim batPath
batPath = Replace(WScript.ScriptFullName,".vbs",".bat")

CreateObject("Wscript.Shell").run "cmd /c " & batPath & " " & ArgsToString(), vbHide
```

例えば、test.batを起動したい場合、test.batと同じフォルダに、上記内容をtest.vbsとして保存すれば、test.vbsを実行することで、test.batを非表示のまま起動することができる。
また、起動時に引数を渡すことも可能。
OSX に JDK 9 Early Access Releases をインストール

[cask](http://caskroom.io) と [jenv](https://github.com/gcuisinier/jenv) をお使いの方を前提としております。

```shell-session
$ brew tap caskroom/versions
$ brew cask install java9-beta
$ jenv add /Library/Java/JavaVirtualMachines/jdk-9.jdk/Contents/Home
$ jenv shell oracle64-9-ea
$ java -version
java version "9-ea"
Java(TM) SE Runtime Environment (build 9-ea+95-2015-12-02-041743.javare.3968.nc)
Java HotSpot(TM) 64-Bit Server VM (build 9-ea+95-2015-12-02-041743.javare.3968.nc, mixed mode)
$ jshell
|  Welcome to JShell -- Version 9-ea
|  Type /help for help

-> "Hello JDK 9!"
|  Expression value is: "Hello JDK 9!"
|    assigned to temporary variable $1 of type String
```
凄かったPhotoshop新画像書き出しが2015年冬に更に進化していた

2015/6/16にリリースされたAdobe Photoshop CC 2015では、従来のWeb用に保存に加えて、新しい画像書き出しの方法が実装されました。従来版との詳しい比較は下記サイトで紹介しています。
[Web用保存は古い!? JPEG画質が改善したPhotoshop CC 2015の新方式の画像保存機能まとめ - ICS MEDIA](https://ics.media/entry/7689) 

画像サイズが小さくなったり書き出しが楽になったりと、ただでさえ強力な新画像書き出し機能ですが、2015/12/1のアップデートにより更にパワーアップしました。

次に示すのがアップデートされたPhotoshop CC 2015の画像書き出し画面です。
![12/1にアップデートされたPhotoshop CC 2015](https://qiita-image-store.s3.amazonaws.com/0/67884/851c8ab5-dc22-3d0f-6ef6-5a1daf85488f.png "スクリーンショット 2015-12-17 11.39.35.png")

#パワーアップした点まとめ

## サイズ別の書き出しが可能に
これまでは画像のサイズは一種類しか書き出すことができませんでしたが、先日のアップデートより複数サイズの画像を同時に書き出すことが可能になりました。例えばレスポンシブサイトで複数解像度の画像を準備したいときに重宝します。これは従来の「Web用に保存」でもできない機能です。
![サイズ別の画像書き出し](https://qiita-image-store.s3.amazonaws.com/0/67884/8e4995d1-6a38-3440-eeae-5dcbc6d42a23.png "スクリーンショット 2015-12-17 12.37.37.png")

## PNG8の指定が可能になった
画像サイズがシビアに求められる状況では、PNG24より圧縮率の高いPNG8を使いたい場合があります。こちらも先日のアップデートで可能になりました。
![PNG8の指定](https://qiita-image-store.s3.amazonaws.com/0/67884/0d1d3383-32c2-ec58-d11e-83b1d30ed0d7.png "スクリーンショット 2015-12-17 12.37.58.png")

##PNGのアルファチャンネルを無効化できるようになった
画像サイズがシビアに求められる状況では、背景画像としてPNGを使う時時など、アルファチャンネルが不要な場合が場合があります。
![透明部分の指定](https://qiita-image-store.s3.amazonaws.com/0/67884/833d07a7-ca42-581a-31d1-165ea152da9c.png "スクリーンショット 2015-12-17 12.37.47.png")

##メタデータを埋め込めるようになった
![メタデータ埋め込み](https://qiita-image-store.s3.amazonaws.com/0/67884/09e0a03d-3d09-ef31-05f9-9ac43a24e2b3.png "スクリーンショット 2015-12-17 12.38.07.png")

##sRGBに変換できるようになった
![sRGBへの変換](https://qiita-image-store.s3.amazonaws.com/0/67884/899136cc-367f-ff07-966d-ce7305a1068c.png "スクリーンショット 2015-12-17 12.38.13.png")

#アドビは新画像書き出しに力を入れていることを感じた
[Adobe 公式のFAQ](http://blogs.adobe.com/crawlspace/2015/06/save-for-web-in-photoshop-cc-2015.html)によると「Web用に保存（従来）」は、将来的には無くなる技術とのことでしたが、6/16の実装時点ではいくつか痒いところに手が届かない印象がありました。今回のアップデートによりそれらが解消され、一層使いやすいものとなりました。アドビはこの新画像書き出し機能に力を入れて開発しているのだという姿勢を強く感じるアップデートでした。

なお、新デザイン環境「デザインスペース」についての記事をICS MEDIAにて執筆しましたので、よろしければこちもご覧ください。
[Web・アプリデザイナー必見！ Adobe Photoshop CCの「デザインスペース」を使った新しいワークフロー - ICS MEDIA](https://ics.media/entry/10447)
面倒くさがり屋だからnic.plいじる

# 面倒くさがり屋なんです。

```
$ nic.pl
NIC 2.0 - New Instance Creator
------------------------------
  [1.] iOS/Flipswitch Toggle
  [2.] iphone/activator_listener_infinite
  [3.] iphone/application
  [4.] iphone/library
  [5.] iphone/preference_bundle
  [6.] iphone/tool
  [7.] iphone/tweak
Choose a Template (required): 7
Project Name (required): foo
Package Name [com.yourcompany.foo]: com.chikuwa.foo ←めんどい
Author/Maintainer Name [MAIN-PC/Chikuwa]: Chikuwa ←めんどい
[iphone/tweak by Chikuwa] MobileSubstrate Bundle filter [com.apple.springboard]:
[iphone/tweak by Chikuwa] List of applications to terminate upon installation (space-separated, '-' for none) [SpringBoard]:
Instantiating iphone/tweak by Chikuwa in foo/...

```
## そう！いちいちPackage Nameとか手で入力するのめんどくさい

ということで`nic.pl`を書き換えちゃおうというわけです。

## いざ編集！
まず、46行あたりの
([https://github.com/DHowett/theos/blob/master/bin/nic.pl#L46](https://github.com/DHowett/theos/blob/master/bin/nic.pl#L46))を

元:`$package_prefix = "com.yourcompany" if !$package_prefix;`

後:`$package_prefix = "com.chikuwa" if !$package_prefix;`

次に、95行あたりの
([https://github.com/DHowett/theos/blob/master/bin/nic.pl#L95](https://github.com/DHowett/theos/blob/master/bin/nic.pl#L95))を

元:`promptIfMissing(\$username, getUserName(), "Author/Maintainer Name") unless $NIC->variableIgnored("USER");`

後:`promptIfMissing(\$username, "Chikuwa", "Author/Maintainer Name") unless $NIC->variableIgnored("USER");`

以上！

## 使ってみると。。

```
$ nic.pl
NIC 2.0 - New Instance Creator
------------------------------
  [1.] iOS/Flipswitch Toggle
  [2.] iphone/activator_listener_infinite
  [3.] iphone/application
  [4.] iphone/library
  [5.] iphone/preference_bundle
  [6.] iphone/tool
  [7.] iphone/tweak
  [8.] iphone/tweak by Chikuwa
Choose a Template (required): 8
Project Name (required): foo
Package Name [com.chikuwa.foo]:
Author/Maintainer Name [Chikuwa]:
[iphone/tweak by Chikuwa] MobileSubstrate Bundle filter [com.apple.springboard]:
[iphone/tweak by Chikuwa] List of applications to terminate upon installation (space-separated, '-' for none) [SpringBoard]:
Instantiating iphone/tweak by Chikuwa in foo/...
Adding 'foo' as an aggregate subproject in Theos makefile 'Makefile'.
Done.

```

これで作業効率もアップ！
Alamofireで自己証明書のサーバにリクエストする

# Solution

```swift
class APIManager {
  static let sharedInstance: Manager = {
    // Create the server trust policies
    let serverTrustPolicies: [String: ServerTrustPolicy] = [
      // 自己証明書のサーバ接続時に、エラーを避ける設定(ドメイン名は適宜変更してください)
      "staging.hoge.com": .DisableEvaluation 
    ]

    // Create custom manager
    let configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
    configuration.HTTPAdditionalHeaders = Manager.defaultHTTPHeaders
    configuration.timeoutIntervalForRequest = 10
    return Manager(
      configuration: configuration,
      serverTrustPolicyManager: ServerTrustPolicyManager(policies: serverTrustPolicies)
    )
  }()
}

let manager = APIManager.sharedInstance
manager.request(method, urlString, headers: headers, parameters: parameters, encoding: encoding)
```

# 参考

- [How to connect to self signed servers using Alamofire 1.3](http://stackoverflow.com/questions/31945078/how-to-connect-to-self-signed-servers-using-alamofire-1-3)
2015年にお世話になった gem たち

[クービック Advent Calendar 2015](http://qiita.com/advent-calendar/2015/coubic) の 17日目です。

今年を振り返ってお世話になった gem をまとめてみようと思います。

## activerecord-mysql-awesome
[activerecord-mysql-awesome](https://github.com/kamipo/activerecord-mysql-awesome)

マイグレーションする際に、必ずお世話になる gem です。

```rb
class AddMembershipNumberToCustomers < ActiveRecord::Migration
  def change
    add_column :customers, :membership_number, :string, charset: 'ascii', collation: 'ascii_bin', after: :xxxxx
  end
end
```

詳しくは作者の kamipo さんのエントリーをご覧ください。
http://qiita.com/kamipo/items/4763bcffce2140f030b3


## attr_encrypted

[attr_encrypted](https://github.com/attr-encrypted/attr_encrypted) は attributes の encrypt と decrypt を透過的に行ってくれる gem です。

attr_encrypted の Usage の一部抜粋ですが、暗号化したい attribute を指定するだけで ok です。

```rb
class User
  attr_encrypted :ssn, :key => 'a secret key'
end

@user = User.new
@user.ssn = '123-45-6789'
@user.encrypted_ssn # returns the encrypted version of :ssn
@user.save

@user = User.last
@user.ssn # decrypts :encrypted_ssn and returns '123-45-6789'
```

ssn はたぶん、Social Security Number の略と思われます。


## activerecord-import

[activerecord-import](https://github.com/zdennis/activerecord-import) は Bulk Insert を行うための gem です。

[Wiki](https://github.com/zdennis/activerecord-import/wiki/Examples) から Usage を一部抜粋しますが、

```rb
columns = [ :title, :author ]
values = [ ['Book1', 'FooManChu'], ['Book2', 'Bob Jones'] ]

Book.import columns, values, :validate => false
```

こんな感じで Bulk Insert が可能です。


## draper

[draper](https://github.com/drapergem/draper) は有名なので、説明不要な気もしますが、もはや日々の開発に必要不可欠な gem です。

[るびま0041号](http://magazine.rubyist.net/?0041-RailsTheBadParts)のRuby on Rails: The Bad Parts

> ロジックが散在したビューはとかく読み難く、メンテンスし難いものです。ではそのロジックをヘルパーに追い出しましょう……となるわけですが、ナイーブにやっているとヘルパーメソッドがどんどん増えていきます。その数 3 桁ともなると、似ているようで微妙に違うメソッドや、多分どこからも使われていないけれど怖くて消せないメソッドなどが現れてきて、新しくメソッドを足すにも「どこに書けばいいかよくわからないから一番下でいいや」という感じになってきます。ヘルパークラスを分割してみたり、メソッド名にプレフィックスを付けてみたりするも焼け石に水で、管理不能な状態に陥ります。

という、ヘルパー地獄から脱することができます。


## まとめ
activerecord-mysql-awesome, attr_encrypted, activerecord-import, draper と全てが ActiveRecord 関連な gem でした ^^
Java - Arrays.asList の注意点

# 1. はじめに
先日、toshi0383さんの [Java - Arrays.asList の罠](http://qiita.com/toshi0383/items/87abe2a8e08df1180a6e) という記事を拝見しました。

> Arrays.asList は、プリミティブ型の配列をリスト化してくれない。

という問題についてでして、非常に参考になりました。
今回はもう一つ罠について、投稿させて頂きます。

# 2. java.util.Arrays.asList(T ...a); とは？
配列からコレクションを生成する場合に使用するメソッドで、こんな風に使います。

```java
// 配列を作成
String[] array = {"foo","bar","baz"};

// Listに変換
List<String> list = Arrays.asList(array);
```

そのままStreamも生成できるので便利

```java
Arrays.asList(array).stream().forEach(s -> {
		// 処理
});;
```

# 3. 問題

Listを生成してくれるので、当然こんな書き方をすると思います。

```java
// List生成
List<String> list = Arrays.asList("a", "b", "c");

// 要素を追加
list.add("d");

// 要素を削除
list.remove(0);

```

## 3.1 java.lang.UnsupportedOperationException

しかし、実行すると下記例外が発生します。

```java
Exception in thread "main" java.lang.UnsupportedOperationException
	at java.util.AbstractList.add(AbstractList.java:148)
	at java.util.AbstractList.add(AbstractList.java:108)
	at qiita.Recursion.main(Test.java:11)
```

# 4. 原因

原因は、JavaのAPI仕様書に記載されていました。

| 修飾子と型  |                            メソッドと説明                            |
|-------------|:--------------------------------------------------------------------:|
| static,List | asList(T... a) <br> 指定された配列に連動する**固定サイズのリスト**を返します。 |

## 4.1 固定サイズのリストとは？

Arrays.asList() で作成されるListのオブジェクトは、
元配列からのコピーではなく。
**変換前の配列をあたかもListのように見せているだけ**、なので元配列の要素数を変換しようとすると、前述のUnsupportedOperationExceptiongaが発生します。

## 4.2 使えないメソッド

つまり、Arrays.asList() で生成したListオブジェクトは以下の操作を受け付けないという事になります。

| 修飾子と型 |                                                 メソッドと説明                                                |
|------------|:-------------------------------------------------------------------------------------------------------------:|
| void       | **add(int index, E element)** <br> このリスト内の指定された位置に、指定された要素を挿入します(オプションの操作)。 |
| E          | **remove(int index)** <br>  このリスト内の指定された位置にある要素を削除します(オプションの操作)。                |
| void       | **clear()** <br> すべての要素をこのリストから削除します(オプションの操作)。                                       |

# 5. まとめ

Arrays.asList() で生成したListのオブジェクトは、要素数の変更をするListのメソッドの操作を受け付けません。

toshi0383さん、勝手に記事リンク張らせて頂きました。すみません。

# 参考
http://qiita.com/toshi0383/items/87abe2a8e08df1180a6e
http://docs.oracle.com/javase/jp/8/api/
http://www.atmarkit.co.jp/ait/articles/0408/24/news095.html
http://namihira.hatenablog.com/entry/2015/03/31/231929
TryROMA(ROMAコマンドお試しコンソール)の紹介

# TryROMA
ROMAの基本的なコマンドをwebで確認できるお試しコンソールです
http://roma-kvs.org/tryroma
![try1.png](https://qiita-image-store.s3.amazonaws.com/0/103558/9bc9efe1-1217-2aa4-c366-5e264e90b168.png)

# モード
TryROMAには自由にコマンドを実行できる『Free mode』と基本的な使い方を対話的に学べる『Tutorial mode』があります

## Free mode
Free modeでは自由にROMAコマンドを実行できます
現在対応しているコマンドは以下です

### データ操作コマンド
- set
- get
- gets
- add
- delete
- replace
- append
- prepend
- cas
- incr
- decr
- set_expt

### ステータス確認コマンド
- stat
- stats
- whoami
- nodelist

### クラスター構成変更コマンド
- release
- recover
- set_auto_recover

### インスタンス/クラスター終了コマンド
- balse
- shutdown
- shutdown_self
- (rbalse)

### その他
- set_log_level
- !!(直前のコマンドの繰り返し)

## 例
### データ操作 & ステータス確認コマンド
![image](https://qiita-image-store.s3.amazonaws.com/0/103558/5b9f52eb-edc4-d7da-4d68-06aaed081c36.png)
データを`set`して`gets`して、`stats node`と`nodelist`でステータスの確認をしています

### インスタンス終了コマンド
<table>
  <td>
<img src="https://qiita-image-store.s3.amazonaws.com/0/103558/9559e71a-5a22-50b3-ced0-051dcbbb6217.png" width="400px">
  </td>
  <td>
<img src="https://qiita-image-store.s3.amazonaws.com/0/103558/42b7a8fd-3ca3-dcc1-148c-cc26ceab736e.png" width="400px">
  </td>
</table>
`shutdown_self`コマンドでlocalhost_10001インスタンスを終了しています
TryROMAでは自動的に次のnode(localhost_10002)へアクセスしたと仮定します

### クラスター構成変更コマンド
![image](https://qiita-image-store.s3.amazonaws.com/0/103558/b4a2cdbb-ab3b-a058-0ed2-468c1bc5749d.png)
冗長度が落ちたvnode(short_vndoes)を`recover`コマンドで復帰させています

## Tutorial mode
Tutorial modeでは、ROMAの基本的なコマンドを対話的に学んで実行できます

### チュートリアルコマンド
- Check Status
  - stat
  - nodelist
- Manage Data
  - set
  - get
  - add
  - delete
- Instance shutdown
  - release
  - shutdown_self
- Recover redundancy
  - recover
  - set_auto_recover
- STOP ROMA
  - balse

## 例
### setコマンド
![image](https://qiita-image-store.s3.amazonaws.com/0/103558/f53c7493-f306-adac-ecc7-a7e47e46967b.png)

### balseコマンド
![image](https://qiita-image-store.s3.amazonaws.com/0/103558/8b62afc8-95a4-0fb0-07e1-5056fdb5923b.png)
balseコマンドはクラスター終了コマンドです
(shutdownコマンドも同様です)

# TryROMA構成
各コマンドの結果を返すAPIをsinatraで作成し、表示部分をReactで実装しています
![vc_architecture.png](https://qiita-image-store.s3.amazonaws.com/0/103558/1a0cc16e-b7eb-64e4-c5a2-f9b38c574014.png)

# 参照URL
ROMA TryROMA: http://roma-kvs.org/tryroma
CloudFront経由でS3からコンテンツ配信をする

#S3バケットの作成
コンテンツ配信用にS3のバケットを作成します。

#CloudFrontの設定
AWSのコンソールから、CloudFrontを選択する。
「CreateDistribution」を押下し、「Web」のGet Startedを選択します。
HTTPやHTTPSで表示する通常のコンテンツ配信には、「Web」を選択します。

**Distributionの設定**
OriginSettingsでオリジンサーバの設定を行います。
①OriginSettingsのOriginDomainNameから、作成したコンテンツ配信用のS3のバケット名を選択します。
　→自動でoriginIDが挿入されます。

②RestrictBucketAccessの「Yes」を選択
　→S3バケットのコンテンツへのアクセスをCloudFrontからのみに制限する場合は「Yes」を選択します。

*オリジンアクセスアイデンティティを使用して Amazon S3 コンテンツへのアクセスを制限する場合*
①OriginAccessIdentityの「Create a New Identity」を選択します。 
　・使用するオリジンアクセスアイデンティティがすでにある場合
　　(1)「Use an Existing Identity」 を選択する。
　　(2)「Your Identities」 リストでアイデンティティを選択します。
　・オリジンアクセスアイデンティティがなく、作成する場合
　　(1)「Create a New Identity」を選択します。
　　(2)作成するアイデンティティの説明を 「Comment」 フィールドに入力します。

②「Origin Domain Name」に指定された S3バケット内のオブジェクトの読み取り許可を、CloudFront でオリジンアクセスアイデンティティに自動的に与える場合は、「Yes, Update Bucket Policy」 を選択する。
（オリジンアクセスアイデンティティに関しては、下記参考URLを参照ください。）

DefaultCacheBehavarSettingsdeで、キャッシュの設定を行います。
①どういったリクエストに対し、キャッシュを有効にするかの設定を行います。
→基本デフォルトのままでよいです。

DistributionSettingsで、Distributionの設定
①AlternateDomainNamesに設定するドメイン名を入力します。

*ログの設定が不要な場合は、②～⑤の手順は必要ありません。*
②Logging・・・ログを取得するかの選択をします。

③Backet for Logsからバケットを選択
→ログを配置するS3のバケットを選択します。

④Log Prefixからログを配置するファイルを選択します。

⑤Cookie Logging・・・ログにCookieも記録するか選択します。
 
設定後、「CreateDistribution」を押下します。
Distributionの作成が開始されます。
*作成したDistibutionsがdeployedになる処理が15分ほどかかります。*

#Route53の設定
*Route53　にCloudFrontのエンドポイントを設定することで、独自のドメインでCloudFrontを利用ができます。*
①Hosted zonesで対象のDomain nameを選択します。
②Create Record Setを選択します。
　Name・・・CloudFront構築時に指定したドメイン名を入力します。
　Type・・・CNAME-Canonical nameを選択します。
　Volume・・・作成したCloudFrontのGeneralタブのDomain Nameを記載します。

#配信URL#
http://{Route53で登録したドメイン名}/{S3のパス}
例
S3バケットに配信ファイル用のフォルダを作成し、ドロップ＆ドラックで配置します。
作成したフォルダからCloudFront経由でファイルを配信します。
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/84937/3070ac23-abac-1508-b979-7bc49ebd1000.png)



[参考URL](http://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/private-content-restricting-access-to-s3.html#private-content-granting-permissions-to-oai)
ZabbixとSlackでChatOpsのススメ

この記事は Zabbix Advent Calendar 2015 の17日目の記事です。
今回はZabbixとSlackを連携させてChatOpsっぽいことをやってみました。

# はじめに
みなさんはZabbixからのアラート通知はどのようにしていますか？
オペレータからの電話？　メール？　チャット？　手段は色々ありますが、個人的に感じるそれぞれの問題についてまとめてみました。

### 電話連絡の問題
* オペレータによる24時間365日体制の運用が必要　⇒高コスト、高負荷。
* 受け手が対応できない状況にある場合でも、通知する側は知るすべがない　⇒通知する側、受ける側に無駄な対応時間が発生
* 情報伝達量の限界　⇒アラートが複数同時発生した場合やログメッセージの場合、全部伝えるのは時間が掛かりすぎる
* 伝達内容の不正確性　⇒伝える側の伝え誤り and 受け手の聞き漏らし・聞き間違い
* 受け手が後から通知された内容を振り返れない

当初Twilloのようなクラウド電話APIによる自動化を検討しましたが、解決できない問題が多いため止めました。

### メール・チャットの問題
* 受信者が見たかどうかの受諾機能がないため、システム側は1回通知して終わり。受け手が気付かずに障害を長時間放置してしまう可能性。
* 同報で夜間連絡すると、対応しなかった人は起こされ損。

### Zabbixのアクションにおけるエスカレーション機能の問題
ちなみにZabbixにはアクションの設定で、エスカレーションを行うための機能が標準で付属しています。
しかし、アクションの実行条件に通常は「トリガーの値 = 障害」という設定を入れていると思いますが、トリガーの値が「正常」に戻ってしまうと、エスカレーションの動作もそこで終了してしまいます。特にログ監視においてトリガーキーに「nodata関数」を使って「正常」ステータスに自動で戻るようにしていたり、トリガー関数「diff」を使って一回だけステータスが「異常」→「正常」になるようなトリガーを設定していると、エスカレーションが行われません。

# ZabbixとSlackの連携
上記のアラート通知手段の問題を受けて、以下のような仕組みを作ってみました。

### この仕組みで出来ること
* システム側から障害内容をメールで自動通知する
* 担当者が通知を受け取ったことをZabbixの受諾機能を使って管理する
* 担当者が受諾を行うまで、定期的に通知を続ける。また応答が無い場合、連絡先を変えてエスカレーションを行う
* 通知を受けたが時間が経ってからそれに気づいた場合に、現在の対応状況を把握できるよう通知内容と対応状況をタイムラインで管理。
* どこにいても障害内容を受信・受諾可能
* 無料で出来る！←ここ重要

[GitHub：zabbix_remote_acknowledged](https://github.com/usiusi360/zabbix_remote_acknowledged)

![image](https://qiita-image-store.s3.amazonaws.com/0/54952/809688e1-ed2b-2e3f-46ea-dfd6ee8fe9ba.png)

# 動作概要
3種類のスクリプトを使います。
　1.Zabbixアクション=>Slack連携スクリプト(zabbix-slack-alertscript.sh)
　2.未受諾イベントチェックスクリプト(zabbix_event_check.pl)
　3.受諾メールチェックスクリプト(zabbix_event_accept.pl)

最初の通知はZabbixのアクションに設定した内容(アラート1次対応者のメールアドレスだけ登録）でメール通知が行われます。同じ条件でSlack連携用スクリプトもアクションに設定しておき、アラート内容と数値型データの場合のみシンプルグラフを取得した上でSlackへアップロードします。グラフはデフォルトで直近3時間程度のデータをSlack上で表示することで、アラート直前のリソース変化の傾向を把握することが可能です。

受諾機能はZabbixイベントの「障害対応コメント」の入力状態をチェックします。「障害」ステータスで、コメントが未入力、かつ発生から5分以上経過しているイベントを検索し、存在する場合は未受諾のイベントがあることをメールとSlackで通知します。またメール送信は送信先リストに従い、リストの順に通知をおこないます。

イベント受諾は受信可能なメールサーバ(Postfix)を用意しておきます。通知を受けたユーザは送信元に空メールを送り、受諾メールチェックスクリプトが新しいメールを見つけるとZabbixに対して「障害対応コメント」をAPIで登録していきます。また同時にSlackへ受諾した旨メッセージを送ります。

尚、通常はSlackのアラート用Channelはnotificationsを無効にしてあり、メールが来たときだけ見るようにしています。

# まとめ
電話やメールでは時間が経った後に着信に気づいた場合、誰が対応したか、どのように対応したか、そもそも対応されたのか分からないため、その都度あちこち情報収集する必要があります。しかし、このようにアラート通知と受諾のログ、また対応した内容をSlackのタイムラインで一元管理することで、夜間・休日でも担当者間で素早く情報を共有することが可能になりました。
CS-Cart: アドオンの画像を配置する場所と画像の表示方法

CS-Cartのアドオンで使う画像はどこに配置したらいいか？また、テンプレートでどうやって画像を表示するか？についての説明。

## アドオンの画像を配置する場所

管理画面用の画像:

```
design/backend/media/images/addons/[アドオンID]/example.png
```

## アドオンの画像をテンプレートで表示する方法

`{$images_dir}`を使う。この変数はエリアによってパスが変わる。例えば、backendなら`http://example.com/design/backend/media/images`のようになる。

```html
<img src="{$images_dir}/addons/[アドオンID]/example.png">
```
inline-blockの隙間をなくす

ちょっと小言っぽい感じで言うんですが、
`display: inline-block;`で出来る隙間に

`letter-spacing: -.4em;`

を書いてなくすという記事をちらほらみて、私もそれで解決していたのですが、

inline-blockをつかってのグリッドシステムを作った際に、アンドロイドだと落ちてしまいました。
どうやらinline-blockの隙間が違うのかな？

とりあえず私は

`letter-spacing: -1em; // 値を増やした`

にして対応しています。

今のところ崩れは確認出来ていません。
あまり大きいと幅が増えてしまうみたい？
まぁ幅90%で表示してる余白を使ってる感じなので、元が100%だと良くないかも。

ご参考までに。
また意見や提案があればコメントをお願いします。
俺でもできた！Amazon Linux 2015.09にplenvをインストールする

俺です。

普段は制約がない限りAmazon Linux latest versionを使っています。
Amazon Linux 2015.09ではPerl 5.16.3が利用できるのですが、
深遠な理由があってPerl 5.10系が必要になったので、plenvを導入しました。


# 準備

検証機なのでgroupinstall...

```
$ sudo yum groupinstall -y "Development Tools"
```

# plenv+perl-buildの準備


```
$ git clone git://github.com/tokuhirom/plenv.git ~/.plenv
$ git clone git://github.com/tokuhirom/Perl-Build.git ~/.plenv/plugins/perl-build
$ echo 'export PATH=~/.plenv/bin:~/.plenv/shims/:$PATH' >> ~/.bashrc
$ echo 'eval "$(plenv init -)"' >> ~/.bashrc
$ $SHELL -l
```

# perl 5.10.1のインストール


```
$ plenv install -l
awk: コマンドライン:1: 致命的: ファイル `/home/ec2-user/.plenv/version' を読み込むために
開けません (そのようなファイルやディレクトリはありません)。
Available versions:
..省略..
 5.10.0
 5.10.1
..省略..
$ plenv install 5.10.1
$ plenv local 5.10.1
$ perl -v
This is perl, v5.10.1 (*) built for x86_64-linux
(with 1 registered patch, see perl -V for more detail)

Copyright 1987-2009, Larry Wall

Perl may be copied only under the terms of either the Artistic License or the
GNU General Public License, which may be found in the Perl 5 source kit.

Complete documentation for Perl, including FAQ lists, should be found on
this system using "man perl" or "perldoc perl".  If you have access to the
Internet, point your browser at http://www.perl.org/, the Perl Home Page.
$ plenv version
5.10.1 (set by /home/ec2-user/.perl-version)
```

# 付録

- ansible

gitとpatch, readline-develは事前に入れておきましょう。

最高の[Gist発見](https://gist.github.com/jshirley/7710824)

やったね
CentOSにwhoisを入れる


環境：CentOS6.7

whoisパッケージ導入方法についての忘備録です。

#whois導入
whoisではなく、jwhoisを指定する

<pre><code># yum install jwhois
Loaded plugins: fastestmirror, security
Setting up Install Process
Loading mirror speeds from cached hostfile
 * base: ftp.tsukuba.wide.ad.jp
 * epel: ftp.kddilabs.jp
 * extras: ftp.tsukuba.wide.ad.jp
 * updates: ftp.tsukuba.wide.ad.jp
Resolving Dependencies
--> Running transaction check
---> Package jwhois.x86_64 0:4.0-19.el6 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

==================================================================================================================
 Package                   Arch                      Version                        Repository               Size
==================================================================================================================
Installing:
 jwhois                    x86_64                    4.0-19.el6                     base                    104 k

Transaction Summary
==================================================================================================================
Install       1 Package(s)

Total download size: 104 k
Installed size: 294 k
Is this ok [y/N]: y

～～～～～～～～～～～～
　省略
～～～～～～～～～～～～


Installed:
  jwhois.x86_64 0:4.0-19.el6

Complete!
</pre></code>


#whois実行確認

<pre><code># whois yahoo.co.jp
[Querying whois.jprs.jp]
[whois.jprs.jp]
[ JPRS database provides information on network administration. Its use is    ]
[ restricted to network administration purposes. For further information,     ]
[ use 'whois -h whois.jprs.jp help'. To suppress Japanese output, add'/e'     ]
[ at the end of command, e.g. 'whois -h whois.jprs.jp xxx/e'.                 ]

Domain Information:
a. [Domain Name]                YAHOO.CO.JP　　　　　　　　　←　ドメインネーム
g. [Organization]               Yahoo Japan Corporation　　　←　組織名
l. [Organization Type]          Corporation　　　　　　　　　← 組織種別（株式会社、有限会社、XX法人等)
m. [Administrative Contact]     HA14103JP　　　　　　　　　　←管理担当者
n. [Technical Contact]          KM34754JP　　　　　　　　　　←技術担当者　
p. [Name Server]                ns01.yahoo.co.jp　　　　　　←ゾーンを管理しているネームサーバ
p. [Name Server]                ns02.yahoo.co.jp
p. [Name Server]                ns11.yahoo.co.jp
p. [Name Server]                ns12.yahoo.co.jp
s. [Signing Key]　　　　　　　　　　　　　　　　　　　　　　←jpドメインの署名鍵
[State]                         Connected (2016/11/30)　　　←状態
[Registered Date]               2000/11/17　　　　　　　　　←登録年月日
[Connected Date]                2000/11/17　　　　　　　　　←接続年月日
[Last Update]                   2015/12/01 01:02:58 (JST)　←最終更新
</pre></code>


#jwhois

編集方法を追記予定
comming soon
RailsでajaxでPOSTしたときにセッションクッキーをセットしてもらう

Railsを使っていてAJAXでPOSTしてもそのままではset-cookieされません。そのために、AJAXの処理でセッション情報を書き換えたり削除できなくなります。

Railsのcsrf-tokenをAJAXでのリクエストに付加することで、この問題を回避できます。

まずは、csrf-tokenを取得する必要があります。csrf-tokenはmetaタグでnameがcsrf-tokenのエレメントにです。次のコードでcsrf-tokenを取得します。

```js
getCsrfToken() {
   for (const elem of document.getElementsByTagName('meta')) {
     if (elem.name === 'csrf-token') {
       return elem.content;
     }
   }
 }
```

あとは、AJAXのリクエストの時に取得したcsrf-tokenをヘッダーに付加します。superagentを使っている場合は、次のようなコードになります。

```js
request.post("/login")
  .set("X-CSRF-Token", getCsrfToken())
  .send({id: loginId, password: password})
```

リクエストヘッダーにX-CSRF-Tokenを付加することで、レスポンスにset-cookieでセッション情報がセットされます。
セッションの破棄や書き換えなどもできます。



でわでわ
[CakePHP3]ContainでSelectする場合の注意点

ドキュメントをきちんと読めばわかる話しだが、少し手間取ったので念の為にメモっとく。

関連するテーブルのデータを取得したい場合は、containを利用すると思う。
その時に関連テーブルのカラムにデータ容量の大きいカラムがあるので、そのカラムは避けて取得したい。
そんな時は以下のような方法でselectするカラムを絞り込める。

例）

```php
$this->テーブルモデル名->get($id, [
     ‘contain’ => [
          テーブルA => function($q) {
               return $q->select([‘name’])
          }
     ]
]);
```

ただし！上のやり方ではデータがあったとしても取得できない。

なぜか！？

それは外部キーの指定が必要だからだ。例えば外部キーがuser_idとしよう。
その場合、以下のようにuser_idを明示的に指定しなければならない。
例）

```php
$this->テーブルモデル名->get($id, [
     ‘contain’ => [
          テーブルA => function($q) {
               return $q->select([‘user_id’, ‘name’])
          }
     ]
]);
```

以上がちょっとした注意点となる。

きちんとドキュメントを読めばわかる話（以下がそれについての記述）

When you limit the fields that are fetched from an association, you must ensure that the foreign key columns are selected. Failing to select foreign key fields will cause associated data to not be present in the final result.
Safari のユーザーエージェントを任意の値に設定する


OS X で動作する Safari のユーザーエージェントは **開発** メニューから変更できますが、ウィンドウを閉じるとデフォルトの値に戻ってしまいます。

そこで *ターミナル* から以下のコマンドを実行するとユーザーエージェントを任意の値に変更できます。
この方法で変更すると Safari を終了しても設定したユーザーエージェントが維持されますので便利。

```ターミナル
$ defaults write com.apple.Safari CustomUserAgent "ユーザーエージェント"
```

例えば Internet Explorer 10.0 のユーザーエージェントを指定する場合は以下のコマンドです。

```ターミナル
$ defaults write com.apple.Safari CustomUserAgent '"Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Win64; x64; Trident/6.0)"'
```

Safari の **開発** メニューから選択できる一覧は以下のファイルに XML 型式で格納されています。

	/Applications/Safari.app/Contents/Resources/UserAgents.plist


**※ ターミナルの作業は危険をともないますのでコマンド操作に慣れていない人は特に注意して下さい。**
JavaからJavaScriptよびだし。



計算式をデータベースにマスタ登録するような場合に使うのね。
（いま、そういう必要性が出ただけ。。）

```
import javax.script.Compilable;
import javax.script.CompiledScript;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;

public class Test {
	public static void main(String[] args) throws Exception {
    	String script = "result=num*2";

    	ScriptEngineManager manager = new ScriptEngineManager();
        ScriptEngine engine = manager.getEngineByName("js");
    	Compilable ce = (Compilable) engine;
        CompiledScript cs = ce.compile(script);
        engine.put("num", 1);
        cs.eval();
        Object result = engine.get("result");
        if(result != null) {
        	System.out.println("result=" + result.toString());
        }
	}
}
```
Laravel-Elixirのbrowserifyを使った時のbabelのpluginsの編集方法

Reactを勉強しようと思って、
laravel-elixirを利用してjsの変換等をやっていたのですが、Babel6から`export default`の挙動が変わった関係で`babel`側の`plugin`を編集する必要が出てきました。

## 環境

* Laravel 5.1
* Laravel-Elixir ~4.0

## Babelがバージョンアップした関係で出てきた問題点

```
export default Class名;
```

でモジュールを登録すると、`require('Class名').default`と呼ばないとクラスが取得できない。

この辺りの話はjserの人が詳しいので、
http://qiita.com/59naga/items/10ec2b5ef0fd62a5b437
見ると良いと思います。

## Laravel-Elixirでの設定の編集方法

恐らくあまり知られてないのがLaravel-Elixirの設定はどう編集するのかという点。
実際のところ、`elixir.config`でconfigにアクセス出来ます。
Configファイルは、`node_modules/laravel-elixir/Config.js`にあります。

## browserifyのオプションでbabelのpluginを読ませる

browserifyの箇所を確認してみると、いい感じにコメントが書かれていますね。transformerと言う所で、babelifyとpartialifyが定義されてます。

あとはbabelifyの方のoptionにpluginを追加するだけです。

今回は問題点であった部分を解消するために`babel-plugin-add-module-exports`を利用します。

```
npm install babel-plugin-add-module-exports --save-dev
```

あとは、gulpfile.jsに以下のconfigを上書きする処理を書きましょう。

```js
elixir.config.js.browserify.transformers
  .find(transformer => transformer.name === 'babelify')
  .options.plugins = [
    'add-module-exports'
    ];
```

処理に関しては
https://github.com/laravel/elixir/issues/376
こちらのissueを参考にいたしました。

なお、次期バージョンではadd-module-exportsは必要なくなりそうです。
http://qiita.com/59naga/items/10ec2b5ef0fd62a5b437
【Javaプログラマな方に】使い捨てスクリプト、ちょっとした便利コード書くならGroovy!【オススメ！！！】

　Groovy！！！！！！！

　これは「[G*Advent Calendar(Groovy,Grails,Gradle,Spock...) Advent Calendar 2015](http://qiita.com/advent-calendar/2015/gastah)」の17日目の投稿です。

　本投稿は、おまけ・まとめ的な立ち位置でアドベントカレンダーのメインは、小技を紹介している4投稿です。

# はじめに
　本投稿では、Javaプログラマの方向けに、種々の便利ユーテリティのコードや、使い捨てのちょっとしたコードでプログラミング言語Groovyを使う良さを紹介します。

　本投稿とは別に4投稿ほど用意しました。一個ずつは短いですが、実際に利用できるも場面もあると思います。(これらがアドベントカレンダーのメインです)

* [【Groovy】iOS・Androidの各種サイズの一時的なアイコンを作る【小人さんスクリプト】](http://qiita.com/RyotaMurohoshi/items/94fbb52d0113a303612a)
* [【Groovy】各種サイズ・色を組み合わせてプレースホルダ画像を用意する【小人さんスクリプト】](http://qiita.com/RyotaMurohoshi/items/e6c8c2c65206281633c7)
* [【Groovy】ファイル名を規則に従って一括変換する【小人さんスクリプト】](http://qiita.com/RyotaMurohoshi/items/154fa6011e3b77797d5f)
* [【Groovy】特定ユーザーのQiitaの記事を全てダウンロードする【小人さんスクリプト】](http://qiita.com/RyotaMurohoshi/items/c64639ea11c1a57f02a4)

　また該当する文法や良さは昨年のアドベントカレンダー「[【初心者でも】やろうぜGroovy!〜ファイル読み書きしたり、Web APIたたいたり、レスポンスの中身確認したり〜編【今すぐ使える】](http://qiita.com/RyotaMurohoshi/items/3b9be276f40ea0577f60)」でも紹介していますので、こちらも合わせてごらんください。

　それからこちらの「[Java開発の強力な相棒として今すぐ使えるGroovy](http://www.slideshare.net/nobeans/javagroovy)」という[Yasuharu Nakano](http://www.slideshare.net/nobeans?utm_campaign=profiletracking&utm_medium=sssite&utm_source=ssslideview)さんのスライドが、コードも交えてGroovyの良さを紹介されているのでこちらを読むことをお勧めします！

　そして本当に勉強したくなったら、[プログラミングGROOVY](http://gihyo.jp/book/2011/978-4-7741-4727-7)を買うことをお勧めします！


# ほんの一例

　ちなみにGroovyを使うと画像のダウンロード、一行でかけます！すごくないですか？

```groovy:画像のダウンロード
new File(fileName) << new URL(imageUrl).openStream()
```

# ここが素敵だと思うぜGroovy！

　Groovyの特徴として次の2点が挙げられることが多いと思います。

* 構文も含め、きわめて高いJavaとの親和性を持つ
* 非常に直感的で簡潔な記述が可能

　これらがそのまま「Javaプログラマの方が、小人さんスクリプト・使い捨ての便利コードでGroovyを使うべき理由」にもなると思います。

　そしてもっと詳しく述べると、自分がJavaプログラマの方向けに、小人さんスクリプト・使い捨ての処理のコードにGroovyをお勧めするのは次のような理由です。

* スクリプトが書けるので、クラスやメソッドを書かなくても、いきなりやりたい処理のコードを書くことができる
* Java7までのコードはほぼGroovyのコードとして利用できるため、各種処理のコードスニペットがコピペでほぼ動く
* @Grabで使い慣れたJavaのライブラリがすぐに利用できる
* GStringが便利、読みやすい！(+文字列連結したり、StringBuilderでペチペチしなくていい)
* GroovyShellでインタラクティブにコードを試せる
* マップやリストの生成が専用リテラルにより非常に簡潔にできる
* 便利な演算子で記述が簡潔になる
* Javaの既存のクラスに便利なメソッドが追加されている
* JSONのパースが簡単・簡潔
* JSONを作るのも簡単・簡潔
* assertが強力、なにが違うかとっても見やすい
* トリプル「ダブルクォーテーション」で、改行込みの文字列記述も楽々
* 暗黙引数itで簡潔に書けるクロージャ(関数オブジェクト)
* @Cannonical等で、equals、hashCode、toStringが簡潔に実装でき、コード幅も取らない
* 正規表現のクラスを扱いやすくするための演算子がある
* チェック例外を非チェック例外扱いにできる
* defキーワードで型名を書かない
* get、setなどのメソッドがプロパティ形式でアクセスできる
* マップの要素やJSONの要素にもプロパティ形式でアクセスできる
* デフォルトでインポートされているパッケージがJavaより多く、import文も少なくて済む
* Stream APIより簡潔に記述できるコレクションのためのGDK メソッド群

　「チェック例外を非チェック例外にするのってどうなの？」とか「型名を書かないってどうなの？」って思った方もいらっしゃるとは思いますが、ちょっとした使い捨てのコードを書いている時には、「チェック例外を非チェック例外」にするのも「def」も非常に有用だと私は思います。



# さいごに

　「使い捨てスクリプト」「ちょっとした便利コード」に絞ったため、上記の理由をあげました。短い・読みやすいGroovy素敵ですね！

　あと「他の言語じゃだめなの」っていう方、別に他の言語にチャレンジするのも素敵だと思うしいいと思いますよ！
【Groovy】iOS・Androidの各種サイズの一時的なアイコンを作る【小人さんスクリプト】

Unityを始めとするマルチプラットフォームの開発環境で、本番のアイコンはまだできていないけれど仮の画像でやり過ごさないといけない時ってありますよね。(ありませんか？ないですかそうですか。)

とりあえず一枚だけ画像はもらったけれど、本番リリースまでは各種プラットフォーム・各種サイズはもらえなそうなそんな時、このGroovyスクリプトを使えば必要なサイズの画像を生成することができます！

```groovy:
import java.awt.Image
import java.awt.image.BufferedImage
import javax.imageio.ImageIO

def iconSizes = [
    // iOS
    57,
    72,
    76,
    114,
    120,
    144,
    152,
    180,

    // Android
    36,
    48,
    72,
    96,
    144,
    192,
]

if (args.size() != 1) {
    println("usage : groovy create_icons.groovy YOUR_ICON_IMAGE_NAME")
    return
}

def imagePath = args[0]
def inputImage = ImageIO.read(new File(imagePath))

iconSizes.each { iconSize ->
    def iconName = "icon${iconSize}x${iconSize}.png"
    createResizedIcon (inputImage, iconName, iconSize, iconSize)
}

def createResizedIcon (def inputImage, def outputFilename, def width, def height) {
    def outputFile = new File(outputFilename)
    def scaledImage = inputImage.getScaledInstance(width,height,Image.SCALE_SMOOTH)

    def bufferedImage = new BufferedImage((int)scaledImage.width,(int)scaledImage.height,BufferedImage.TYPE_4BYTE_ABGR)
    def graphics = bufferedImage.getGraphics();
    graphics.drawImage(scaledImage,0,0,null)
    graphics.dispose()

    ImageIO.write(bufferedImage,'PNG',outputFile)
}
```
【Groovy】各種サイズ・色を組み合わせてプレースホルダ画像を用意する【小人さんスクリプト】


　色×サイズの組み合わせで、プレスホルダーの画像を大量に用意するGroovyスクリプトです。

　「[Placehold.jp](http://placehold.jp/)」というサービスを利用させていただいています。


```groovy
def colorHexaStringList = ["ffffff", "ffff00" ,"ff00ff", "ff0000" ,"00ffff", "00ff00" ,"0000ff", "000000"]
def sizeStringList = ["150x100", "100x100", "320x240", "180x400"]

[colorHexaStringList, sizeStringList].combinations().each { colorHexaString, sizeString ->
    def url = "http://placehold.jp/${colorHexaString}/${colorHexaString}/${sizeString}.png"
    def fileName = "${colorHexaString}_${sizeString}.png"

    new File(fileName) << new URL(url).openStream()
}
```
【Groovy】ファイル名を規則に従って一括変換する【小人さんスクリプト】

デザイナさんからもらった画像群が命名規則に従っているんだけれど、その命名規則が違うみたいな時ってありませんか？

その際に使えるGroovyスクリプトです。


下記のような変換を、プロジェクトルートのimagesディレクトリ以下を対象に行います。

「img_orange_1.png」->「character_orange_000.png」
「img_yellow_12.png」->「character_yellow_011.png」


「img_{TYPE}_{INDEX}.png」

という名前を

「character_{TYPE}_{変換後のINDEX}.png」

にします。

変換後のINDEXとは、もとのINDEXを

* 3桁0で右うめ
* INDEXは1始まりでなく0始まり

というルールで変換したものです。


```groovy:
def regex = /img_(.+)_(\d+).png/

new File("images").eachFile { file ->
    if(file.name ==~ regex) {
        (file.name =~ regex).each { fileName, type, index ->
            def updatedIndex = index.toInteger() - 1
            def updatedIndexString = updatedIndex.toString().padLeft(3, '0')
            def updatedFileName = "images/character_${type}_${updatedIndexString}.png"

            file.renameTo(updatedFileName)
        }
    }
};
```
Qiitaで図形描画する方法

## 図形描画方法

```bash:
![](http://yuml.me/diagram/class/[a.出社]タイムカード -.->[b.打刻])
```

![](http://yuml.me/diagram/class/[a.出社]タイムカード -.->[b.打刻])

## 詳細

* [yUMLを使ったテキストベースのマルチプラットフォームUMLモデリングソフトウェア·JSchnizzle MOONGIFT](http://www.moongift.jp/2011/02/20110211-3/)
* [テキストからUML図を生成してくれる『yUML』が良く出来ている | IDEA*IDEA](http://www.ideaxidea.com/archives/2009/05/yuml.html)
* [書式](http://yuml.me/diagram/scruffy/class/samples)
* [試し書き](http://yuml.me/diagram/scruffy/class/draw)
明日使えるCの無駄知識

明日使えるCの無駄知識(順不同)
-----------------------------
**以下の文章が全て正しいとは限りません．本当かどうかは各自で調べてください．**
もし間違っていたらコメントで教えてください．

- compound literalを書くときに配列なら`(int[]){[10]=11,[100]=1}`,構造体なら`(struct a){.a=1}`なんてことができる．詳しくはググれ
- compound literalは実は左辺値
- `main`関数に限って`return`を書かなくても良い
- 規格上(処理系定義でない)`main`の定義方法は`int main(void)`か`int main(int,char**)`のみ
- forやwhileやifやswitchはぶら下がり防止のために暗黙のうちに{}が入る．
- \_Static\_assert ( constant-expression , string-literal ) ;というコンパイル時アサーション機能がある
- \_Alignofや\_Alignasなんかもある
- \_Bool型，\_Complex型，\_Atomicもある
- アンダーバーがうざいと思ったら対応しているヘッダ(stdbool.hとか)で消せる
- なんかいろいろ(使わなさそうな)予約語が増えた．
- 例えば，C99でrestrictやinline出たし，C11で\_Noreturnが出てきて，その結果quick\_exit関数やat\_quick\_exit関数なんかもできた
- さらに言えば，getsが廃止された代わりに，I/O系の関数の末尾に\_sがついた関数が大量に導入された．gets_sやprintf_sとか．多分殆どの関数は知られていないし，知っている人でも挙動を把握しているのはごく一部だと思う
- 地味にaligned_allocが追加された．使いどころがフリースタンディング環境くらいしか思いつかない．
- _Genericが追加されて黒魔術の闇が濃くなった
- sizeofや\_Alignofの中身は通常評価されない．選択されなかった\_Genericの中身もそう
- 無名unionや無名structが導入された．便利
- structやunionのタグ名とtypedefの型名は同じでも良い
- struct a {int a;}とstruct b {int b;} は違う型なのでこんなことができる．キモい

```c
#include <stdio.h>
typedef struct a {int a;} a;
typedef struct b {int b;} b;
#define A(aa) ((a){.a=aa})
#define B(bb) ((b){.b=bb})
#define AorB(ab) (_Generic(ab,a:"A",b:"B",default:"default"))
int main(void) {
printf("%d\n",(int[100]){[3]=10,[20]=1}[3]);
printf("%s",AorB(A(1)));
}
```

- printfのフォーマット文字を間違えると未定義
- フォーマット文字と引数の対応が取れてなくても未定義
- scanfも同じ
- printfにunix拡張で*や$が使える．詳しくはman 3 printf
- 忘れてたけど，標準でスレッドがサポートされる．atomicができたのはこのため
- しかしメジャーな実装系はライブラリやヘッダを用意していない．頑張ってくれ
- unicoideに対応した．`u8""`や`u16""`や`u32""`が使える
- 関数宣言に引数にint i[*]ってできる
- 可変長配列みたいなもん

**以上!!**他にもあるかも?
【Groovy】特定ユーザーのQiitaの記事を全てダウンロードする【小人さんスクリプト】


任意のユーザーのQiitaの全投稿をマークダウン(.md)形式で保存するスクリプトです。

2015年12月17日現在、QiitaのAPIは

> 利用制限
認証している状態ではユーザごとに1時間に1000回まで、認証していない状態ではIPアドレスごとに1時間に60回までリクエストを受け付けます。

という制限が有ります。

本投稿のコードは、IPアドレスごとに1時間60回という制限がありますので、その点に注意してください。

```groovy:
import groovy.json.*

def userId = "SOMEONE_ID" //　誰かのQiita IDを入れてください
def pagePerCount = 20

def userUrlString = "http://qiita.com/api/v2/users/${userId}"
def userResponseString = new URL(userUrlString).text
def userJson = new JsonSlurper().parseText (userResponseString)
def itemsCount = userJson.items_count
def pageCount = (int) Math.ceil(itemsCount / pagePerCount)

pageCount.times{ index ->
    def pageNumber = index + 1;

    def urlString = "http://qiita.com/api/v2/users/${userId}/items?page=${pageNumber}&per_page=${pagePerCount}"
    def responseString = new URL(urlString).text
    def response = new JsonSlurper().parseText (responseString)

    response.each { article ->
        def body = article.body
        def title = article.title
        new File("${title}.md").text = body
    }
}
```
Linuxのniceコマンド

LinuxでCPU負荷の高い処理を定期実行したいとき(cronとかJenkinsとか)がありました。
が、他のもっと重要な処理と時間がかぶってしまった場合にたまにこっちの方が落ちてしまったりして困ってました。
そんな時に使えたコマンドです。

$ nice -n (-20〜19の整数) コマンド

例えば
CPUをたくさん食うcpu_eater.rbを定期実行したい、けど優先度は下げるとき
```
$ nice -n 10 ruby cpu_eater.rb
```

そうすると
「ps -l」コマンドで確認すると
優先度が下がっている(NIが上がっている)のがわかります。
実際に他の高負荷のものも実行すると、
優先度の低い処理はCPUを使ってません。
(画面が用意できなかった・・・)

そして優先度の高い処理が終わってから、CPUを使い出します。

CPU負荷が高まり重要な処理が落ちてしまうことは軽減されました。
MongoDB　インストール　〜　

# MongoDBとは
ドキュメント型NoSQL
データ構造はJSON

**特徴**
- キーバリューよりも複雑なデータが簡単に扱える
- データ構造の変更が柔軟
- エンジニアでなくても全貌がわかる
- ウェブサービスやM2Mの標準的なデータ構造

http://japan.zdnet.com/article/35061825/


#インストール
[公式インストールマニュアル](https://docs.mongodb.org/manual/)

## 対応プラットフォーム
- Linux
    - Red Hat
    - SUSE
    - Amazon Linux
    - Ubuntu
        - 64-bit LTSのみ正式にサポートしている。（他のパッケージでも動くかもしれない）
    - Debian
- OS X
- Windows
    - version 2.2 から Windows XPは対応していない

## Packageの構成
- mongodb-org
    - mongodb-org-server: mongod デーモン、config, init スクリプト
    - mongodb-org-mongos: mongos デーモン説明は[こちら](https://docs.mongodb.org/v3.0/reference/program/mongos/#bin.mongos)
    - mongodb-org-shell: mongo shell
    - mongodb-org-tools: 各種ツール(mongoimport bsondump, mongodump, mongoexport...)
    

## ubuntu 14.04でのインストール

パッケージのインストールから起動まで。

```sh:インストール
sudo apt-get update
sudo apt-get install -y mongodb-org
sudo service mongod start
```

## ユーザ作成(一般ユーザ、管理ユーザ)

[MongoDBコマンド集（ユーザ操作）](http://qiita.com/y-hara/items/83a86655bba48dc8b140)


## confファイルの位置

/etc/mongod.conf
default port: 27017


## ターミナルコマンド command

```sh:MongoDBの操作
sudo service mongod start :起動
sudo service mongod stop :停止
sudo service mongod restart :再起動
sudo apt-get purge mondodb-org :packageの削除
sudo rm -r /var/log/mongodb :logの削除
sudo rm -r /var/lib/mongodb :DB fileの削除
```
MDwikiに感動した


## 設置方法

* mdwiki.html を index.htmlにリネーム
* 同じ場所に `index.md`を設置

```bash:webサーバ立ち上げ
python -m SimpleHTTPServer
```

* http://localhost:8000/ にアクセスし表示されることを確認。

## 参考

* [MDwiki：Markdownベースの超シンプルCMS - catch.jp-wiki](http://www.catch.jp/wiki/?MDwiki#r991278e)
* [MDwikiはじめました | 3D技術研究所Blog](http://3dtech.jp/blog/?p=101)
* `Flat-File CMS` というジャンルらしい。
    * https://www.cmscritic.com/awards/


## Gimmicksがすごい！

* [MDwiki - Markdown based wiki done 100% on the client via javascript](http://dynalon.github.io/mdwiki/#!gimmicks.md)

### 図形(yUML)

* [書式](http://yuml.me/diagram/scruffy/class/samples)
* [試し書き](http://yuml.me/diagram/scruffy/class/draw)

```bash:
[gimmick:yuml]( [HttpContext]接続 -.->[レスポンス] ) #点線
[gimmick:yuml]( [HttpContext]接続 --->[レスポンス] ) #直線
```

![](http://yuml.me/diagram/class/[HttpContext]接続 -.->[レスポンス])

日本語も通る

## 書式

* [MDwiki - Markdown based wiki done 100% on the client via javascript](http://dynalon.github.io/mdwiki/#!quickstart.md)

### 画像の横に文字を回りこませる

* [MDwiki](http://kreisel.fam.cx/webmaster/clog/file/mdwiki/mdwiki.html#!index.md)

```bash:
![猫画像](http://placekitten.com/g/800/800)
画像の右側にこの文字が来ます。
```


### 共通ヘッダ

* navigation.md

```bash:テーマの変更
[gimmick:theme](united)
```
IntellijIDEAで`EditorConfig is overriding code style settings for this file`と表示された時


毎回忘れるので、メモ。

`Dismiss` => .editorconfigが有効になる。
`Disable...` => .editorconfigが無効になり、IntellijIDEAのCodeStyleが適用される。

参考
* [EditorConfig is overriding code style settings for this file](https://devnet.jetbrains.com/message/5544316;jsessionid=8EC74E93E6816F9D1B0CF5AB300D1729)
* [Code Style - EditorConfig](https://www.jetbrains.com/idea/help/code-style.html#EditorConfig)