OmniAICreator/Qiita-1.07M huggingface dataset:
Jenkinsプラグインを実装してリリースするまで

## 概要
[Dead Man's Snitch](https://deadmanssnitch.com/) というシンプルな死活監視サービスをJenkins Jobの監視に使っていて、今まではJobが成功したらcurlで通知するという処理を `./job.sh && curl https://nosnch.in/abcde12345` みたいに書いてたんですが、監視はJobと独立させたかったので、pluginとしてビルドが成功した時にDead Man's Snitchに通知する[plugin](https://wiki.jenkins-ci.org/display/JENKINS/Dead+Man%27s+Snitch+Plugin)を作りました。そのプラグインの実装から jenkins-ci.org でホスティングしてもらうまでの道のりです。

結論から言うとけっこう大変でした...w

## 実装
基本はJava + Mavenです。 JVM系の他の言語やGradleでも出来るっぽいです、たぶん。

### [Plugin tutorial](https://wiki.jenkins-ci.org/display/JENKINS/Plugin+tutorial)
まずはこちらを参考にJava, Mavenの環境設定をして雛形のプロジェクトを作ります。HelloPlugin的なプラグインができているはずです。この状態で `mvn hip:run` を打てばすぐにローカルでJenkinsが動きます、思ったよりかなりお手軽でした。

### [ExtentionPoint](https://wiki.jenkins-ci.org/display/JENKINS/Extension+points)
Jenkins上の何かしらの処理を拡張するために`hudson.ExtentionPoint`というマーカーインタフェースを実装します。一覧ページを見て分かるように先人たちが色んな処理に対してExtensionPointを実装した抽象クラスを作ってくれているので、何となく自分がやりたいことと同じような処理をやっているPluginのソースコードを読んで真似ることをおすすめします。多すぎて適切な抽象クラスを自分で見つけ出すのは大変なので...

自分の場合はビルド後の通知処理なので`hudson.tasks.Notifier`というクラスを継承して[作りました](https://github.com/jenkinsci/deadmanssnitch-plugin/blob/master/src/main/java/org/jenkinsci/plugins/deadmanssnitch/DeadMansSnitchNotifier.java)。


### [Jelly](https://wiki.jenkins-ci.org/display/JENKINS/Basic+guide+to+Jelly+usage+in+Jenkins)
設定のUIは`.jelly`という拡張子のテンプレートエンジンを使います。
基本は上記で作ったExtentionPointのインスタンスが一つのビルドに対しての設定になるっぽいので、インスタンス変数として設定したいフィールドを定義します。で、そのクラスと同じパッケージ構造ディレクトリを`src/main/resources`に作ってそこに[config.jelly](https://github.com/jenkinsci/deadmanssnitch-plugin/blob/master/src/main/resources/org/jenkinsci/plugins/deadmanssnitch/DeadMansSnitchNotifier/config.jelly)という名前のファイルを作ると、それがそのプラグインの設定用のUIだと判定されるようです。(もっと詳しいことを知りたい場合は公式で、、Global settingとかHelpの出し方とかi18nについてとか)

## リリース
### [Hosting Request](https://wiki.jenkins-ci.org/display/JENKINS/Hosting+Plugins#HostingPlugins-Requesthosting)
で、一通り実装が終わったら[JenkinsのJIRA](https://issues.jenkins-ci.org)のアカウントを作ってHosting Requestというissueを出します。ここでコードレビューとか既存の~~プラグインでも出来るんじゃない的なレビューとかをしてもらいます。自分はRequestを出してから最初の返信が来るまで10日かかったので急いでる人は注意してください。

このリクエストが通ったら[こんな感じで](https://github.com/jenkinsci/deadmanssnitch-plugin)PluginのGitHubのレポジトリがForkされて自分のGitHubアカウントがorg: `jenkinsci`のメンバーに招待されます。(GitHub以外にレポジトリを置いてた場合どうなるかはよく分かりません)

### [Wikiを書く](https://wiki.jenkins-ci.org/display/JENKINS/Hosting+Plugins#HostingPlugins-CreatingaWikipage)
wikiの[Plugins](https://wiki.jenkins-ci.org/display/JENKINS/Plugins)のページに自分のpluginのページを作成します。最低限`plugin-information`と`excerpt`と、どのカテゴリに属するかのTag付けが必要です。

### [Release](https://wiki.jenkins-ci.org/display/JENKINS/Hosting+Plugins#HostingPlugins-Releasingtojenkinsci.org)
この状態で、forkされた方のリポジトリをreleaseします。cloneしてローカルで`mvn release:prepare release:perform`すればOK。認証情報はJenkins JIRAのものと同じです。

成功したらリリース完了です。[ここ](https://repo.jenkins-ci.org/releases/org/jenkins-ci/plugins/)に自分のプラグインのディレクトリが出来ているはずです。
また、4時間周期でPlugin一覧リストはリフレッシュされるようなので、4時間後にJenkinsのPlugin一覧ページに出ててたらようやく実際Jenkinsにインストールが可能になります。

<img width="914" alt="スクリーンショット 2016-06-12 2.39.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/30838/24062ca7-3858-3feb-d01a-93c856b1691e.png">


お疲れ様でした。。！
VMware vSphere ESXiでigbがdev_watchdogで死なないようにする

# 現象
さて、[Open-AVB](https://github.com/AVnu/Open-AVB)用に買った[I210-T1](http://ark.intel.com/ja/products/68668/Intel-Ethernet-Server-Adapter-I210-T1)で、[linuxptp](http://linuxptp.sourceforge.net)をハードタイムスタンプでやるかな。
というわけで、インターフェースをUPすると、こんな感じでドライバのigbが死ぬ。

```
igb: Intel(R) Gigabit Ethernet Network Driver - version 5.3.0-k
igb 0000:0b:00.0: Using MSI-X interrupts. 2 rx queue(s), 2 tx queue(s)
:
igb 0000:0b:00.0 ens192: igb: ens192 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: RX/TX
------------[ cut here ]------------
WARNING: CPU: 0 PID: 0 at net/sched/sch_generic.c:303 dev_watchdog+0x235/0x240()
NETDEV WATCHDOG: ens192 (igb): transmit queue 0 timed out
```

ググると、結構前から起こり得る現象のようだ。

# 環境
- CPU: Core i7 Ivy Bridge(非Kモデル)
- マザー: VT-d対応
- ホスト: VMware vSphere ESXi 6.0
- ゲスト: Arch Linux 4.5.4-1-ARCH
- NIC: Intel Ethernet Server Adapter I210-T1 (PCIパススルー接続)
- OSのigb: 5.3.0-k
- 最新のigb: 5.3.5.3

# 原因と対策
ググると、なんとなくMSI-Xが関係していそうだ。
igbには、IntModeというオプションがあり、割り込みモードを指定できる。
manによると、

```
       IntMode

              Valid Range: 0-2 (0 = Legacy Int, 1 = MSI and 2 = MSI-X)

              IntMode controls allow load time control over the type of inter‐
              rupt registered for by the driver. MSI-X is required for  multi‐
              ple  queue  support, and some kernels and combinations of kernel
              .config options will force a lower level of interrupt support.
```

とのことで、これをdefaultっぽいMSI-XからMSIにしたらどうだろう。

# 検証
```shell-session
# rmmod igb
# modprobe igb IntMode=1
# ip link set ens192 up
```

ところが、dmesgには

```
igb 0000:0b:00.0 ens192: Reset adapter
```
なるエラーが繰り返される。
最新版のigbにしたら?

# 最新ドライバ
ありがたいことに、[I210](http://www.intel.co.jp/content/www/jp/ja/embedded/products/networking/ethernet-controller-i210-i211-family.html)には、本家に[Linux用ドライバのソース](https://downloadcenter.intel.com/download/13663)がある。
これをbuildするには、kernelのヘッダ - Arch Linuxの場合は[linux-headers](https://www.archlinux.org/packages/core/x86_64/linux-headers/) - が必要。
buildは簡単、makeするだけ。

# 検証再び
```shell-session
# rmmod igb
# insmod ./igb.ko IntMode=1
# ip link set ens192 up
# ethtool -i ens192
driver: igb
version: 5.3.5.3
```

最新版になっている。さてさて、dmesgは?

```
Intel(R) Gigabit Ethernet Network Driver - version 5.3.5.3
Using MSI interrupts. 1 rx queue(s), 1 tx queue(s)
:
igb 0000:0b:00.0 ens192: igb: ens192 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: RX/TX
```

とりあえず、死ななくなった!

# でも
queueが1本になっちゃうの?
AVBのigb_avbにマージしても、AVBはできないか。
ESXiの`pciPassthru0.msiEnabled`あたりを[調べる](http://www.vmware.com/files/pdf/techpaper/vsp_4_vmdirectpath_host.pdf)必要があるのかな…。
【CentOS7＆AWS】EBSを新規に追加し、/var配下を新規EBSへマウントし直す手順

◆EBSを新規に追加し、/var配下を
　新規EBSへマウントし直す手順

＜前提＞
・OSはCentOS7.xでファイルシステムは
　xfsであること
・任意のEBSボリュームを作成し、
　該当インスタンスへアタッチが
　完了していること
・root権限で実行すること
・# yum -y install gdiskでgdiskコマンドが
　インストールされていること

＜手順＞
①追加のEBSボリュームが
　　当該インスタンスに
　　アタッチされていること
　→今回は/dev/xvdfボリュームで作成

②gdisk コマンドで /dev/xvdf1という
パーティションを切る
 # gdisk /dev/xvdf

※注意1：gdisk コマンドに渡す引数は、
「/dev/xvdf」となる。そのコマンドの
実行の結果として「/dev/xvdf1」という
パーティションが切られるので1はつけないこと。

※注意2：EBSのボリュームの
　「アタッチ済み情報」を確認して
　任意のボリュームに読み替えること
※注意3：多少なりとも危険を
　伴う作業のため、バックアップを
　取得後、実施するか検証環境で
　手順を確認しておくこと。

p 押下で現在のパーティションを表示
n 押下で新規でパーティションを作成
Enter 押下(デフォルトのまま) ※ Partition number
Enter 押下(デフォルトのまま) ※ First sector
Enter 押下(デフォルトのまま) ※ Last sector
Enter 押下(デフォルトのまま) ※ Hex code or GUID
w 押下で書き込みに進む
Y 押下で、実際に書き込み

※以降の手順は、"gdisk" コマンドにより
　/dev/xvdf1 パーティションが
　作成されたことを前提としているので、
　再度"lsblk"或いは"fdisk -l"を実行し、
　実際の環境で作成された
　パーティションに適宜置き換えること

③パーティションの変更を OS に通知 
　# partprobe /dev/xvdf1

④xfs ファイルシステムを作成 
　# mkfs.xfs /dev/xvdf1

⑤/mnt にマウントして、既存のログをコピー
　# mount /dev/xvdf1 /mnt 
　# rsync -a /var/ /mnt/
　# umount /dev/xvdf1

⑥UUID を確認し、fstab を修正
　# xfs_admin -u /dev/xvdf1
 
　以下のようなエントリーを /etc/fstab に追加
 UUID=5dbc3450-ad21-405a-ac1d-66d41901e919 /var        xfs     defaults        0 2
　→イコール（=）の前後にスペースを
　入れないこと

⑦マウントできることを確認
　# mount /var

※"# mouont /var" の
　実行後は、"df -h" により対象の
　パーティションが"/var" に
　マウントされていることを
　確認し継続して"/mnt" に
　マウントされてしまっている場合は、
　"umount /mnt" を実行し、
　再度"df -h" でマウントの状況を確認する。

⑧SELinux のコンテキストを正しく設定 
　# restorecon -Rv /var

⑨OSを再起動 
　# reboot

⑩起動後ログが正しく書き込めているか確認
　# logger "TEST" # tail /var/log/messages

（参考）
　/var/log/messagesファイルの
　最後から100行を表示
　# tail -n 100 /var/log/messages

また、上記の手順だと既存の/var以下の
ログが残るが、これらを削除したい場合には、
当該インスタンスを停止し、
当該ボリュームをデタッチし別の
インスタンスにアタッチ＆マウントして、
/var/ 以下のファイルを
削除するといった方法で削除が可能。
[C++] RVO(Return Value Optimisation)

Recently I read a book talking about the c++11, which described a very interesting thing. The RVO/NRVO of compiler.

## What is RVO

The [Wikipedia](https://en.wikipedia.org/wiki/Return_value_optimization) has a very clearly explanation.

> In the context of the C++ programming language, the return value optimization (RVO) is a compiler optimization that involves eliminating the temporary object created to hold a function's return value.

## Write some code

```cpp
class A {
public:
    A() {
        cout << "Default constructor!" << endl;
    }
    A(const A& other) {
        cout << "Copy contructor!" << endl;
    }
};

A getA() {
    return A();
}

int main() {
    A b = getA();
    return 0;
}
```

At last we found that the copy constructor was not called. Only the default constructor was called. That is to say, the compiler just initialized one instance of A in this program. The return value from the function getA() will have same memory address with the variable b.

```
Default constructor!
```

One more interesting thing is that we can let the compiler not to do this optimization. When we compile the code with gcc/g++, we can append this flag `-fno-elide-constructors` to gcc/g++ to turn off RVO.

Then we try to run the code described before with this flag. The copy constructor is called twice.

```
Default constructor!
Copy contructor!
Copy contructor!
```

If we turn off this optimization, there is a hidden temporary object, the compiler will first copy the return value to a temporary variable, then copy the temporary variable to the variable which will be assigned from the method return value.

```cpp
tmp = a; // one copy
b = tmp; // another copy
```

## About NRVO

As @tamy0612 described bellow, my old version code is a NRVO. If we return a named object inside the function. This may be optimized by the NRVO if the compiler supports NRVO. Also we can turn off the NRVO by using the flag `-fno-elide-constructors`.

```cpp
A getA() {
    A a;
    printf("Address of a: %p\n", &a);
    return a;
}

int main() {
    A b = getA();
    printf("Address of b: %p\n", &b);
    return 0;
}
```

With NRVO

```
Default constructor!
Address of a: 0x7fff583c35a8
Address of b: 0x7fff583c35a8
```

Turn off NRVO with `-fno-elide-constructors`

```
Default constructor!
Address of a: 0x7fff52ebb578
Copy contructor!
Copy contructor!
Address of b: 0x7fff52ebb5a8
```
Ruby | rand がちゃんとランダムか軽く試してみた。

# 結果

わりとランダムっぽい。
(厳密な検証ではまったくない)

# スクリプト

```rb
try_variation = 100

report = Hash.new(0)

99_999_999.times do
  report[rand(try_variation)] += 1
end

puts report.values
```


# 結果

```rb
1000499
998787
1001212
1001369
1000595
999758
1000738
999726
1000782
1000248
1000654
998118
999629
999974
999327
999465
1000540
1001130
998813
1000294
998590
998866
999706
998919
1001086
999100
1000468
1000322
1000407
1001278
1002011
999800
999869
999976
999031
1000482
999405
1000158
998681
999122
999414
999829
1000373
999778
1001001
999050
1001954
1001608
1000235
1000660
1000765
1000165
999472
1000051
997579
1001452
997871
1001341
1001640
999115
999156
1001085
1000422
1000348
999302
1001182
1000577
999865
1000025
1000485
999727
999076
1000029
999470
1000730
999873
1000109
999533
998950
998583
1000731
999659
1000319
999592
999484
1001105
1001239
999775
1000441
1000500
1000231
997771
999635
1000237
999948
999800
999806
1000757
998519
999635
```

# 環境

- ruby 2.0.0p648 (2015-12-16 revision 53162) [universal.x86_64-darwin15]
- OS X El Capitan 10.11.5









<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
slick3.1系 slick-codegenのカスタマイズあれこれ

いつになってもDBモデルを手で作成するのは単調で面倒くさい作業です
特にテーブルが100も200もあるシステムなんかのローカル環境なんかはmwbで変更しまくってレビューして一気に作る場面も多いハズ...たぶん

こんな時の強い味方 [slick-codegen](http://slick.lightbend.com/doc/3.1.1/code-generation.html)なんですが
デフォだと微妙に使いづらい場面もチラホラ

その１
日付型がデフォでjava.sql.Timestampなのでorg.joda.time.DateTimeにしたい
-> これはtototoshiさんの[slick-joda-mapper](https://github.com/tototoshi/slick-joda-mapper#code-generation)が解決してくれます

その２
mysqlにある便利な機能の一つで
更新する度に日時を更新してくれたり、作成した時に日時を自動登録してくれたりするカラムオプションがあるんですが
ジェネって作ったmodelだとこいつらにnullぶち込んじゃって機能しないので
毎回こんな感じのことをする必要があるのでなんとかしたい。もう、いるだけでダメな感じ

こんなテーブルの場合

```sql
CREATE TABLE people (
id bigint(20) NOT NULL AUTO_INCREMENT,
name　VARCHAR(255) NOT NULL,
age　　INT NOT NULL,
addressId 　　INT NOT NULL,
create_at datetime DEFAULT CURRENT_TIMESTAMP, /*←これとか*/
update_at datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,　/*←これとか*/
PRIMARY KEY (id)
)
```
毎回mapで項目を絞る必要が....

```scala
people.map(p => (p.name, p.age, p.addressId)) += ("M Odersky",12345,1)
```


その２に対してmodelからそもそもそのカラムを消しちゃう感じで対応してみました

```scala
import slick.driver.JdbcProfile
import scala.concurrent.ExecutionContext.Implicits.global
import slick.driver.MySQLDriver.api._
import slick.driver.MySQLDriver
import slick.driver.JdbcProfile
import slick.{model => m}
import slick.codegen.SourceCodeGenerator
import slick.model.Model
import scala.concurrent.duration.Duration
import scala.concurrent.{Await, ExecutionContext}

class CustomGenerator(model: m.Model) extends SourceCodeGenerator(model) {

  // add some custom imports
  override def code = "import com.github.tototoshi.slick.MySQLJodaSupport._\n" + "import org.joda.time.DateTime\n" + super.code
  override def Table = new Table(_) {
    override def autoIncLastAsOption = true
    override def Column = new Column(_) {
      override def rawType = model.tpe match {
        case "java.sql.Timestamp" => "DateTime" // kill j.s.Timestamp
        case "java.sql.Date" => "DateTime" // kill j.s.Timestamp
        case _ => {
          super.rawType
        }
      }
    }
  }
}

object CodeGenWithJodaTime extends App {
  val slickDriver = "slick.driver.MySQLDriver"
  val jdbcDriver = "com.mysql.jdbc.Driver"
  val url = "jdbc:mysql://localhost/myschema"
  val outputFolder = "src/main/scala"
  val schemas = "myschema"
  val pkg = "mypkg"
  val user = "username"
  val password = "userpassword"
  val driver: JdbcProfile = slick.driver.MySQLDriver // TODO: replace this with your Slick driver
  val db = { Database.forURL(url, driver = jdbcDriver, user = user, password = password) }

  // 非同期をぶった斬って処理する
  val model = Await.result(db.run(driver.createModel(None, false)(ExecutionContext.global).withPinnedSession), Duration.Inf)

  // 登録日(create_at)と更新日(update_at)はMySql側の設定で対応するのでTablesからは除外する
  val ts = (for {
    t <- model.tables
    c = t.columns.filter(_.name != "create_at").filter(_.name != "update_at")
  } yield(slick.model.Table(t.name, c, t.primaryKey, t.foreignKeys, t.indices, t.options)))
  val fModel = Model(tables = ts)

  val codeGenFuture = new CustomGenerator(fModel).writeToFile(slickDriver, outputFolder , pkg, "Tables", "Tables.scala")
}
```

以上です、もっと良いやり方あれば教えていただけると嬉しいです。
golangでcookieを使う


サーバから送られてきたcookieを表示し、送られたcookieでサーバにアクセスするhttp clientのサンプルコード。

```golang:client.go
package main

import (
  "net/http"
  "fmt"
  "net/http/cookiejar"
  "net/url"
  "log"
)

func main(){
  jar, err := cookiejar.New(nil)
  if err != nil {
    log.Fatal(err)
  }
  client := &http.Client{ Jar: jar }
  res, err := client.Get("http://localhost/set_cookie")
  if err != nil {
    log.Fatal(err)
  }
  defer res.Body.Close()
  if res.StatusCode != 200 {
    fmt.Printf("StatusCode=%d\n", res.StatusCode)
    return
  }

  // Print cookie sent by server
  set_cookie_url, err := url.Parse("http://localhost/set_cookie")
  if err != nil {
    log.Fatal(err)
  }
  cookies := jar.Cookies(set_cookie_url)
  fmt.Printf("%v\n", cookies)

  // Access different url to check if cookie is sent 
  res, err = client.Get("http://localhost/dump_cookie")
  if err != nil {
    log.Fatal(err)
  }
  if res.StatusCode != 200 {
    fmt.Printf("StatusCode=%d\n", res.StatusCode)
    return
  }
}

```

上記のサンプルコードからのリクエストに対して、set-cookieヘッダー付きのレスポンスを送るサーバ側のサンプルコード。

```golang:server.go
package main

import (
  "fmt"
  "net/http"
  "log"
)

func setCookieHandler(w http.ResponseWriter, r *http.Request){
  http.SetCookie(w, &http.Cookie{
    Name: "cookie_field",
    Value: "cookie_value",
    Path: "/",
  })
  http.SetCookie(w, &http.Cookie{
    Name: "cookie_field2",
    Value: "cookie_value2",
    Path: "/",
  })
  w.WriteHeader(http.StatusOK)
}

func dumpCookieHandler(w http.ResponseWriter, r *http.Request){
  for k, v := range r.Header {
    fmt.Printf("%s:%s\n", k, v)
  }
  w.WriteHeader(http.StatusOK)
}

func main(){
  http.HandleFunc("/set_cookie", setCookieHandler)
  http.HandleFunc("/dump_cookie", dumpCookieHandler)
  log.Fatal(http.ListenAndServe(":80", nil))
}

```
mac workbench が「Table 'performance_schema.session_variables' doesn't exist」


2016年6月、workbenchからmysql突然つながらなくなる
再起動してもダメ、コンソールからはつながる状態、WBさんボケたか

```
Your connection attempt failed for user 'root' from your host to server at 127.0.0.1:3306:
  Table 'performance_schema.session_variables' doesn't exist

Please:
1 Check that mysql is running on server 127.0.0.1
2 Check that mysql is running on port 3306 (note: 3306 is the default, but this can be changed)
3 Check the root has rights to connect to 127.0.0.1 from your address (mysql rights define what clients can connect to the server and from which machines) 
4 Make sure you are both providing a password if needed and using the correct password for 127.0.0.1 connecting from the host address you're connecting from
```

5.7.9の[Bugs Fixed](http://dev.mysql.com/doc/relnotes/mysql/5.7/en/news-5-7-9.html#mysqld-5-7-9-bug)において
performance_schema.session_variablesからgtid_executedが廃止した影響くさい...たぶん


ググってみると[stackoverflowにありました](http://stackoverflow.com/questions/31967527/table-performance-schema-session-variables-doesnt-exist)

```
# mysql_upgrade -u root -p --force
# mysql.server restart
```

これで解決したくさい...たぶん

2015-10-21のリリースなんだが
なんなんだこの時間差攻撃は
エラーCannot convert value of type 'Int32' to specified type 'Int'の修正

objective-cを変換した時にintのエラーが出たのでその対処法メモ
##エラーメッセージ

```
Cannot convert value of type 'Int32' to specified type 'Int'
```
Int32をIntに変換できないよ

##int32とintの何が違うのか
Intは32bit環境だとint32になって64bit環境だとint64になる
つまりint32もint64と同じIntということ。

しかし、swiftではIntとして使うにはキャストしないといけない

objcで大丈夫だった配列にintを入れるところもswiftだと以下のようなエラーになる
["A","B","C"][Int32の番号]

```
 Cannot subscript a value of type '[String]' with an index of type 'Int32'
```
この場合は以下のようにすればおｋ

```
["A","B","C"][Int(int32の番号)]
```
sql serverでカーソルを使う


同じようなテーブルにデータを移行するときに
移行しようとしているテーブルにデータがある場合には更新したいので、
単純にinsert into マージするテーブル　select マージしたいテーブル;みたいなのはできない。
なので、一行ずつ存在確認しながらやるしかない。そんなわけでカーソルを使ってみた。 

```sql:テーブル定義
-- マージしたいテーブル
CREATE TABLE [dbo].[CardInfo](
	[CardID] [nchar](6) NULL,
	[CustomerID] [nchar](5) NULL
) ON [PRIMARY]

-- マージするテーブル
CREATE TABLE [dbo].[CardInfo2](
	[CardID] [nchar](6) NULL,
	[CustomerID] [nchar](5) NULL
) ON [PRIMARY]
```

```sql:merge.sql
-- 変数・カーソル定義
 
DECLARE cursorCardId  cursor FOR SELECT CardID, CustomerID FROM CardInfo;
DECLARE @cursorId nchar(6);
DECLARE @customerID nchar(5);


-- カーソルオープン
OPEN cursorCardId

-- データを格納
FETCH NEXT FROM cursorCardId
INTO @cursorId,@customerID


-- カーソルのデータが終わるまで繰り返す
 WHILE @@FETCH_STATUS = 0
 BEGIN

　-- 繰り返し処理
  IF EXISTS ( SELECT * FROM CardInfo2 WHERE [CardId]=@cursorId )
  BEGIN
    UPDATE CardInfo2
	SET    CustomerID=@customerID 
	WHERE  [CardId]=@cursorId;
  END
  ELSE
  BEGIN
     
	INSERT INTO CardInfo2
	([CardId] ,[CustomerID]) VALUES
	(@cursorId, @customerID);
  END

  -- データを格納
  FETCH NEXT FROM cursorCardId
  INTO @cursorId,@customerID
END

-- カーソル終了処理
CLOSE cursorCardId
DEALLOCATE cursorCardId

```
無料ダイナミックDNS(DDNS)サービスでcron更新メモ

みなさんこんにちは
今日も元気にプログラミングしてますか
自宅サーバーしてますか？
自宅Internet of thingsしてますか？

yesと答えたそんなあなたは
無料ダイナミックDNS(DDNS)サービスを使ってますか？
僕は今日も元気に自宅のラズパイで遊んでいるので
無料DDNS使って室内カメラのストリーミングとか公開した所です。

時間的に変更される自宅のIPアドレスをドメイン名とひも付けておけるのがDDNSの便利サービスですが
今回使ったのはmydns

http://www.mydns.jp


DDNSのお約束としてIPアドレスの更新に毎回ログインしてアクセスする必要があり、これが面倒なので
定番としてcronでスケジュールしたスクリプトで
自動更新させる事になります。
こちらが今回スケジュールしたスクリプト

```
#!/bin/sh
#
# update ddns
#

# MyDNS
wget -O - --http-user="mydnsID" --http-password="mydns password"a http://www.mydns.jp/login.html
```

アカウント名パスワードの必要事項を記入してraspberry pi上の下記ファイルとして上記の
スクリプトを保存しcronでスケジューリングします。

/root/mydns_update.sh

```
#cron編集画面を開く
crontab -e
```

```
#この一行を追加
5,35 * * * * /root/mydns_update.sh >/dev/null 2>&1
```

30分毎に更新スクリプトを実行し
ドメイン名と自宅の外部IPアドレスのひも付けを行ってくれます。
これで自宅のネットワークの外から登録したドメイン名を使ってアクセス出来る様になります。
30分に１回くらいなら多分アクセス制限もかけられずに
更新させてもらえる・・と思います。
参考サイトでは１時間に１回実行は大丈夫だったそうなので怖い人はcrontabの最初の値を5か35どちらかにしておきましょう。


対した話ではないんですが
そう思ってると記憶から抜け落ちるので
メモしておくと宜しいかと思います。

ではでは

参考：
[DDNS(MyDNS)を定期的に更新](http://qiita.com/mizuki_takahashi/items/89699f87fb10d812748a)

[DDNS（ダイナミックDNSサービス）とは？無料DDNSサービスの「mydns」で、自宅PCを設定したみた](http://viral-community.com/other-it/ddns-mydns-2060/)
WebStormでES6のJavaScriptコードを扱う

いつもはTypeScriptでコードを書いているのだけれども、Node.js用のコードやElectronとかならES6で書けるし変換の手間少ないからES6でも良いかーと思って、WebStormでアロー関数やら使ったら、コードフォーマット時にひどいことになって頭を抱えた。

![ES5.1](https://i.gyazo.com/e11119ac9b593ecfa498f3dea2368b56.gif)
▲ フォーマッターをかけると大変なことになる。

これは辛いと思ってTypeScriptでずっと書いてたのだけども、設定の場所を教えてもらった。

[WebStorm]⇢[Preference]⇢[Language & Frameworks]⇢[JavaScript]⇢[JavaScript Language version]から[ECMAScript 6]を選択する
![preference](https://i.gyazo.com/9eaa5988a4fc92b0eb69292d879a950a.png)

![ES6](https://i.gyazo.com/fc22b7f4181fc2a19d37417a025de14c.gif)
▲ コードフォーマッターをかけても壊れずにすんだ。
Hugoで画像や動画を投稿する時はShortcodeを使おう

## 概要

[Hugo](https://gohugo.io/)でブログを投稿する上で画像やYouTubeの動画を埋め込む際、いつも同じHTMLタグの塊をmarkdownファイルに書いていませんか？
[Shortcode](https://gohugo.io/extras/shortcodes/)を使うとそんな処理が共通化できてすっきりします。

## Partial TemplateではなくShortcode

Theme内でHTMLを細かく切り出して再利用できるようにしている[Partial Template](https://gohugo.io/templates/partials/)がありますが、こちらは**markdownファイルの中では使えません**。代わりにShortcodeを使います。

## サンプル

### 定義済みのShortcode

Hugo内には以下のfigure様なShortcodeがいくつか定義されています。`{{< shortcode名 引数 >}}}`で使えます。

``` html:markdownファイル内の記述
{{< figure src="/media/spf13.jpg" title="Steve Francia" >}}
```

``` html:出力されるhtmlファイル
<figure>
    <img src="/media/spf13.jpg"  />
    <figcaption>
        <h4>Steve Francia</h4>
    </figcaption>
</figure>
```

### Shortcodeの自作

`/layouts/shortcodes/shortcode名.html`でファイルを置くことでmarkdownの中から利用できます。shortcodeファイル内ではGoコードで様々なHugoやその他のリソースにアクセスが可能です。

例えば、YouTubeの動画埋め込み記述を共通化したい場合は以下のよう`youtube`のshortcodeを用意します。

``` html:markdownファイル内の記述
{{< youtube 09jf3ow9jfw >}}
```

``` html:/layouts/shortcodes/youtube.html
<div class="embed video-player">
  <iframe class="youtube-player" type="text/html" width="640" height="385" src="http://www.youtube.com/embed/{{ index .Params 0 }}" allowfullscreen frameborder="0"></iframe>
</div>
```

``` html:出力されるhtmlファイル
<div class="embed video-player">
<iframe class="youtube-player" type="text/html"
    width="640" height="385"
    src="http://www.youtube.com/embed/09jf3ow9jfw"
    allowfullscreen frameborder="0">
</iframe>
</div>

```

タイトル付きで画像を埋め込みたい場合は以下の様な`img`タグを用意すると良いでしょう。

``` html:markdownファイル内の記述
{{< img src="/media/spf13.jpg" title="Steve Francia" >}}
```

``` html:/layouts/shortcodes/img.html
<!-- image -->
<figure {{ with .Get "class" }}class="{{.}}"{{ end }}>
    {{ with .Get "link"}}<a href="{{.}}">{{ end }}
        <img src="{{ .Get "src" }}" {{ if or (.Get "alt") (.Get "caption") }}alt="{{ with .Get "alt"}}{{.}}{{else}}{{ .Get "caption" }}{{ end }}"{{ end }} />
    {{ if .Get "link"}}</a>{{ end }}
    {{ if or (or (.Get "title") (.Get "caption")) (.Get "attr")}}
    <figcaption>{{ if isset .Params "title" }}
        <h4>{{ .Get "title" }}</h4>{{ end }}
        {{ if or (.Get "caption") (.Get "attr")}}<p>
        {{ .Get "caption" }}
        {{ with .Get "attrlink"}}<a href="{{.}}"> {{ end }}
            {{ .Get "attr" }}
        {{ if .Get "attrlink"}}</a> {{ end }}
        </p> {{ end }}
    </figcaption>
    {{ end }}
</figure>
<!-- image -->
```

## 参考

公式ドキュメントを見ると、ここに掲載したもの以外のサンプルも掲載されているので参考になります。

- Shortcodesの公式ドキュメント: https://gohugo.io/extras/shortcodes/
Android、画像ファイルからBitmapを生成する方法 + おまけ

カメラで撮影した写真をグリッドビューで表示するための下調べメモです。




## 画像ファイルをBitmapへ

```java
Bitmap bm = BitmapFactory.decodeFile(pathName);
```
pathName:Bitmapにしたい画像ファイルのパス

##あるディレクトリ内のファイルパス一覧の取得方法

```java
File[] files = new File(directoryPath).listFiles();
List<String> pathList = new ArrayList<String>();
for(File file : files){
	pathList.add( file.getPath() );
}

```
directoryPath:ディレクトリのパス
File.listFiles(): ディレクトリ内のファイル一覧をFileクラスのオブジェクト配列として返す
File.getPath(): ファイルのパス（相対パス）を取得する
Windows(Cygwin)でATK2+Skyeyeを動かす

TOPPERS ATK2をSkyeyeで動かすまでの手順。

# 環境
Windows 10 Pro (64bit)

# ソフトウェア要件
## ATK2
https://www.toppers.jp/download.cgi/atk2-sc1_at91skyeye_gcc-20150406.tar.gz

Skyeyeシミュレータに対応しているバージョンをダウンロードする。

### Configurator
https://www.toppers.jp/download.cgi/cfg-mingw-static-1_9_5.zip

ATK2のコンフィグで利用する。

## Skyeye
https://www.toppers.jp/download.cgi/skyeye_devm_package-1.0.5.zip

上記ATKのバージョンに対応したものの最新版。

## Cygwin (x86)
https://www.cygwin.com/setup-x86.exe

SkyeyeのバイナリがCygwinでビルドされているため、x86版をダウンロードする。

## arm-none-eabi-gcc
CodeSourcery版

# インストール
## Cygwin (x86)
デフォルトで選択されているパッケージにperl, make, unzipを追加する。

## ATK2
$ tar xzvf .../atk2-sc1_at91skyeye_gcc-20150406.tar.gz
$ cd atk2-sc1
$ mkdir -p cfg/cfg
$ cp .../cfg.exe cfg/cfg/

# ビルド
## ATK2
$ pwd
atk2-sc1
$ mkdir obj
$ cd obj
$ perl ../configure -T at91skyeye_gcc
$ make

# 実行
$ pwd
.../atk2-sc1/obj
$ cp ../target/at91skyeye_gcc/skyeye.conf .
$ skyeye -e atk2-sc1.exe -c skyeye.conf

# デバッグ
## skyeye起動
$ pwd
.../atk2-sc1/obj
$ skyeye -c skyeye.conf -e atk2-sc1.exe -d

## gdb起動
別のターミナルで以下を実行
$ pwd
../atk2-sc1/obj
$ arm-none-eabi-gdb.exe atk2-sc1.exe -command ../target/at91skyeye_gcc/gdb.ini
javascript eval and tostring

估计最强大的JavaScript的黑魔法，就是把一个函数先toString然后修改其字符串最后eval成一个新函数了，这方法无敌通用，性能还高，除了startup会稍慢外基本没有缺点。这样做，相当于可以在JavaScript里构造任意的语法糖了

```js
function x() { alert('asdf'); }
eval(x.toString().replace('asdf','hello'));
x();
```

http://stackoverflow.com/questions/1356283/what-are-some-real-world-uses-for-function-tostring-in-javascript
Swift2.2で西暦から和暦に変換するファンクション

Swiftの勉強中になんとなくやってみたくなったので、西暦から和暦に変換するファンクションを作成してみました。 

```swift
func adFromEra(year: Int, month: Int, day: Int) -> String{
    // 和暦を配列に入れる
    let eraJpArray: Array<String> = ["明治", "大正", "昭和", "平成"]
    
    // 引数 year, month, day をデートフォーマット用にString(YYYY/MM/DD)にする
    let strConverDay: String = String(year) + "/" + String(month) + "/" + String(day)
    
    // デートフォーマットを yyyy/MM/dd の形式にセットする
    // (リアルタイムな日付じゃないので、JPフォーマットにする必要はなし)
    let dateFormatter = NSDateFormatter()
    dateFormatter.dateFormat = "yyyy/MM/dd"
    
    // 引数から来た、年月日を2001年１月１日 0:0 00 から何秒かに変換
    let convertDay = dateFormatter.dateFromString(strConverDay)!.timeIntervalSinceReferenceDate
    
    // 各年号（明治、大正、昭和、平成）の開始日の年月日を2001年１月１日 0:0 00 から何秒かに変換
    let maiji  = dateFormatter.dateFromString("1868/10/23")!.timeIntervalSinceReferenceDate
    let taisyo = dateFormatter.dateFromString("1912/7/30")!.timeIntervalSinceReferenceDate
    let syowa  = dateFormatter.dateFromString("1926/12/26")!.timeIntervalSinceReferenceDate
    let heisei = dateFormatter.dateFromString("1989/1/7")!.timeIntervalSinceReferenceDate
    
    /*
     *  引数から来た、年月日が年号の間にあるか比較
     *
     *  return 元号と和暦
     */
    switch(convertDay) {
    case maiji..<taisyo:
        return  eraJpArray[0] + String(year - 1867)
    case taisyo..<syowa:
        return eraJpArray[1] + String(year - 1911)
    case syowa..<heisei:
        return eraJpArray[2] + String(year - 1925)
    default:
        return eraJpArray[3] + String(year - 1988)
    }
}
```
正規表現のメモ【超基本】

以下を[Rubular](http://rubular.com/)で試してみてください。
RubularはRubyにおける正規表現のテストツールです。

```
^は入力文字の先頭を示す
 
$は入力文字の末尾を示す

*は直前の式を0回以上繰り返す = {0, }

+直前の式と1回以上一致したものを示す = {1, }
 
?は直前の式を0 or 1回示す = {0 ,1}

{n}は正確にn回一致する o{2}の場合、robは不一致、foodは一致する

{n , } = {n , *}

.は任意の1文字に一致する

hoge(?=n)はnの前にあるhogeを示す
 
hoge(?!n)はnの前にないhogeを示す
  
[xyz]の[ ]は文字セット指定する。各カッコの中にある文字列を示す
  
[^xyz]はxyz以外を示す
  
[a-z]はaからz
  
\d = [0-9]
  
\D = [^0-9]
  
\n = 改行

\s = スペース

\S = スペース以外の文字
 
\w = 単語 [A-Za-z0-9_]

\W = 単語以外  [^A-Za-z0-9_]
windows10にあげたらcmderのgit等の表示がされなくなった件

メモ的な感じ。誰かも困ってたら。

Windows10に上げた所、cmderの表示が少しおかしくなった。
{lamb}とか表示が出てしまったり、gitのブランチの表示がされなくなったので一時的にnyagosを使って.nyagosで設定を書いて表示していた。

ただちゃんと調べてみたらclinkのバージョンが古いかららしい。
詳しい話は以下

https://github.com/cmderdev/cmder/issues/223


http://mridgers.github.io/clink/
ここから最新のclinkをダウンロードします。zip版ね。

それをcmderのフォルダのvendor/clinkに上書きすることで以前までの表示が戻ってきますー。

よかった。
Django のコマンドは USE_I18N を無視するという話

## 概要

- Django で [I18N](https://ja.wikipedia.org/wiki/%E5%9B%BD%E9%9A%9B%E5%8C%96%E3%81%A8%E5%9C%B0%E5%9F%9F%E5%8C%96#i18n) 対応 されたメッセージを取得しようとした時うまく取得できなかったという話

## 環境

確認した環境

- Mac OS X 10.11.5
- Python3.5
- Django1.9

## 前提

- Django で settingsの内容を下記のように設定する

```python
LANGUAGE_CODE = 'ja'
USE_I18N = True
```

- 上記の様に設定すれば、I18N対応した日本語メッセージがあれば下記のようにして日本語のメッセージが取得できる。

```python
from django.utils.translation import ugettext_lazy as _
_('Hello') # => こんにちわ
```

## DjangoのCommandだと取得できない

- django-localflaover というパッケージがあって、[ISO 3166-2:JP](https://ja.wikipedia.org/wiki/ISO_3166-2:JP) で定義された、日本の都道府県情報を取得できる。
- 都道府県名はI18N対応されていて、日本語名で都道県名が取得できる。

```python
from localflavor.jp.jp_prefectures import JP_PREFECTURE_CODES

dict(JP_PREFECTURE_CODES)['13'] # => 東京都
```

- 上記をrunserverしたDjangoアプリから読んだりすると「東京都」という値が取得できる
- だが下記のようにDjangoのCommand内で呼ぶと、「Tokyo」が返ってくる

```python
from django.core.management.base import BaseCommand
from localflavor.jp.jp_prefectures import JP_PREFECTURE_CODES

class Command(BaseCommand):

    def handle(self, *args, **options):
        print(dict(JP_PREFECTURE_CODES)['13']) # => Tokyo
```

- **なんだよ！国際オリンピック委員会第8代会長 ジャック・ロゲ氏かよ！？** と突っ込みたくなる一品。

![ジャック・ロゲ](https://dl.dropboxusercontent.com/spa/ghyn87yb4ejn5yy/w2hl04y-.png)

## なんで？

>By default, the BaseCommand.execute() method deactivates translations
>because some commands shipped with Django perform several tasks
>(for example, user-facing content rendering and database population)
>that require a project-neutral string language.

>refs https://docs.djangoproject.com/ja/1.9/howto/custom-management-commands/#management-commands-and-locales

- ｱｯ!ﾊｲ!
- つまりDjangoのデフォルトのコマンド類が、translateされてると都合が悪いのでI18Nはオフになってるとのこと
- これは「manage.py shell」などのコマンドも同様です。

## 対応方法

- Commandのクラス変数に「leave_locale_alone=True」を付ければ良い。

```python
from django.core.management.base import BaseCommand
from localflavor.jp.jp_prefectures import JP_PREFECTURE_CODES

class Command(BaseCommand):

    leave_locale_alone = True

    def handle(self, *args, **options):
        print(dict(JP_PREFECTURE_CODES)['13']) # => 東京
```

## 参考

- [Writing custom django-admin commands > Management commands and locales](https://docs.djangoproject.com/ja/1.9/howto/custom-management-commands/#management-commands-and-locales)
- [Writing custom django-admin commands > BaseCommand.leave_locale_alone](https://docs.djangoproject.com/ja/1.9/howto/custom-management-commands/#django.core.management.BaseCommand.leave_locale_alone)
一部の都道府県だけ色が塗られた地図画像の生成

## 概要

Googleの「Map Charts」を使うと地図の一部だけをハイライトした画像を生成できるようなので試してみたメモ。
([Map Charts](https://developers.google.com/chart/image/docs/gallery/new_map_charts?hl=ja#by-pixel)のAPIは現在"deprecated"扱いなので近いうちに使えなくなる可能性があります。新しいAPIでは[GeoCharts](https://developers.google.com/chart/interactive/docs/gallery/geochart#displaying-proportional-markers)が地図上での色付けに対応しています。)

## 東京・神奈川・千葉・埼玉だけに色をつけるサンプル

<img src="https://chart.googleapis.com/chart?cht=map&chs=600x500&chld=JP|JP-11|JP-12|JP-13|JP-14&chco=000000|D0D0D0|FF4444|FF4444|FF4444|FF4444" alt="東京・神奈川・千葉・埼玉を赤くしてみた画像">
https://chart.googleapis.com/chart?cht=map&chs=600x500&chld=JP|JP-11|JP-12|JP-13|JP-14&chco=000000|D0D0D0|FF4444|FF4444|FF4444|FF4444

- chs: 画像サイズの指定。300,000ピクセルが上限。
- chid: 表示する地域コードの指定。chcoでの色付けにも紐付く。
- chco: 塗りつぶしに使う色の指定。1つ目にchldで未選択の地域の色を指定。2つ目以降にchidで選択した地域コードの並び順に合わせて指定する。

## 参考

- 旧APIのドキュメント(日本語): https://developers.google.com/chart/image/docs/gallery/new_map_charts?hl=ja#by-pixel
- 新APIのドキュメント: https://developers.google.com/chart/interactive/docs/gallery/geochart#displaying-proportional-markers
Apache PDFBoxでPDFを印刷する

[Apache PDFBoxが日本語出力できるようになった](http://qiita.com/ota-meshi/items/55a6c379544b33728b58)のもあり、今まで全然使ったことなかったけどPDFBoxどんなことできるの？っていうのを少しずつ調べています。

今回はPDFの印刷の方法です。

下記の公式Documentを参考にしました。（というか下記を見たらこのページ見る意味ないですけど）
https://pdfbox.apache.org/2.0/migration.html#pdf-printing

# PDFファイルの印刷

```java
	public static void main(String[] args) throws IOException, PrinterException {
		try (InputStream in = new FileInputStream("pdf.pdf")) {
			print(in);
		}
	}

	public static void print(InputStream in) throws IOException, PrinterException {
		try (PDDocument doc = PDDocument.load(in)) {

			PrinterJob job = PrinterJob.getPrinterJob();
			job.setPageable(new PDFPageable(doc));
			//プリンターのダイアログを開く
			if (job.printDialog()) {
				job.print();//印刷
			}
		}
	}
```

## 実行結果

ダイアログが開いて。OK押したら。
![image](https://qiita-image-store.s3.amazonaws.com/0/84259/3d54f3a1-ccd4-9ee6-0bdf-a6f490c40670.png)

印刷できた様子。（今回はxpsで作成）
![image](https://qiita-image-store.s3.amazonaws.com/0/84259/0b1792b1-7bd2-023c-440b-e72b7808f544.png)


# PDFBoxで自作してPDFファイルを作らずに印刷

書き方見れば当然できると思うんですけど、一応確認してみました。

```java
	public static void print2() throws IOException, PrinterException {
		try (PDDocument doc = new PDDocument()) {
			float fontSize = 20;
			PDRectangle rectangle = PDRectangle.A6;

			PDFont font = loadFont(doc);
			float fontHeight = getFontHeight(font, fontSize);

			PDPage page = new PDPage(rectangle);
			doc.addPage(page);

			try (PDPageContentStream contents = new PDPageContentStream(doc, page)) {
				contents.setLineWidth(1F);
				contents.beginText();

				contents.setNonStrokingColor(Color.RED);
				contents.setStrokingColor(Color.BLUE);

				contents.setFont(font, fontSize);
				contents.setLeading(fontHeight);

				contents.setTextMatrix(Matrix.getTranslateInstance(10, rectangle.getHeight() - fontHeight - 10));
				contents.appendRawCommands(RenderingMode.FILL.intValue() + " Tr ");
				contents.showText("テキスト FILL");
				contents.newLine();
				contents.appendRawCommands(RenderingMode.STROKE.intValue() + " Tr ");
				contents.showText("テキスト STROKE");
				contents.newLine();
				contents.appendRawCommands(RenderingMode.FILL_STROKE.intValue() + " Tr ");
				contents.showText("テキスト FILL_STROKE");
				contents.endText();
			}

			PrinterJob job = PrinterJob.getPrinterJob();
			job.setPageable(new PDFPageable(doc));
			//プリンターのダイアログを開く
			if (job.printDialog()) {
				job.print();//印刷
			}
		}
	}
```

## 実行結果


印刷できた。

![image](https://qiita-image-store.s3.amazonaws.com/0/84259/39bdb2bc-f78a-9f12-8e9c-b1dc99b15844.png)

# あとがき

PrinterJobって明るくないのですが、ダイアログ出さずに印刷もできますよね？
なのでちゃんと扱えば、サーバーサイドでサイレントに印刷したりも出来ると思ってます。


ところでiTextにも印刷機能ってありましたっけ？
（俺得）Railsにおいて 設定っぽいものをDBに入れるか、yamlに書くか考えた （加筆修正の可能性大）

# 動機

Railsアプリケーション作ってて、検索、表示などに使うけれども、
滅多に変更しないデータをモデル作ってDBに保存するか、どうしようかと考えた。

## こんなデータについて考えた。

- 自治体一覧　都道府県、市区町村など。名称とコードを保存。日本全国で１８００件くらい。
- 公開判定　有効無効などの設定を行う。
- メタ要素　レコード対象に付与する情報

これらについて、
自治体一覧は、名称と自治体コードといった複数のカラムが必要になるほか、名称やコードによる検索を行うことが多いのでDB。

レコードステータスは、「現在有効なレコードのみ取得対象とする」などの使い方が中心なので、
プログラム上の判定処理は数値で行い、ビューで表示する際には人にとって分かりやすい文字で表せば良い。

こんなハッシュで書きあらわすことができる。

`{ 0 => "無効", 1 => "有効" , -1 => "異常" }`

そして、このくらいの単純な構造のハッシュなら、yamlファイルに記載することも容易。

```yaml:ステータス記述の例
release:
  0: 無効
  1: 有効
 -1: 異常
```

こんな感じで、読み込んであげればOK

メタ情報の扱いはまちまちですが、上記のステータスみたいに書けるのであれば
yamlにしたほうがよさそう。


# ハッシュ形式で持っているデータを、プルダウンメニューなどで使用する。

上記のような項目を持つものを、フォーム内のプルダウンメニューで使いたい場合
`STATUS["release"]`の中に「ステータス記述の例」のような`数値:文言`のような形式のデータが保存されていると仮定した場合、POSTするときの値に数値を、ラベルに文言を使いたい場合は、下記のように記載。


```erb:記載例```
    <%= f.select :status, STATUS["release"].invert %>
```

参考　Hash::invert

http://docs.ruby-lang.org/ja/search/class:Hash/query:Hash%23invert/
IntelliJの覚え書き

# はじめに

IntelliJを自宅で使用する際に、効率よく使用する為の覚書です。 
環境はMacOSになります。

# キーボード表記

>「^」= control
>「⇧」= shift
>「⇪」= caps lock
>「⌥」= Option = Alt
>「⌘」= Command
>「fn」= 地球儀キー

地球儀キーはM1チップ内蔵PC以降にfnキーに刻印されるようになった


# コマンド一覧

アクション       |                 コマンド
:---------- | -------------------:
メソッド一覧      |         fn + ⌘ + F12
コード補完       |      control + Space
インポートの編成    | control + Option + O
コードフォーマット   |       Option + ⌘ + L
メソッドに切り出す   |       Option + ⌘ + M
コメントアウト     |                ⌘ + /
行を削除する      |                ⌘ + Y
行を移動する      |                ⌘ + L
定義元にjump    |                ⌘ + B
ファイル内検索     |                ⌘ + F
ファイル内置換     |                ⌘ + R
コミット| ⌘ + K
小文字大文字の切り替え |        ⌘ + Shift + U
テストクラス作成    |        ⌘ + Shift + T
プロジェクトペイン　| ⌘ + 1
新規ファイル | ⌘ + N
設定画面　| ⌘ + ,
Switcher | control(長押し) + Tab 
エディタ最大化　| ⌘ + ⇧ + fn + F12
どこでも検索| ⇧ ⇧
Spring 4.3 GAがリリースされた！！

Spring 4.3が昨日(2016/6/10)にリリースされました :tada: :tada: :tada: 
このリリースはSpring 4系の最後のマイナーバージョンアップで、Spring 4.2系は基本的には今年中にメンテナンスが終了します。残すところ半年なので、Spring 4.3へのバージョンアップを計画することを強くオススメします。なお、Spring 4.3は、2019年までメンテナンスが続けられる予定のようです。

# 公式ブログのアナウンス

ブログに今回のリリース概要が紹介されています。（もちろん英語・・・ :sweat_smile: ）
https://spring.io/blog/2016/06/10/spring-framework-4-3-goes-ga

# 公式リファレンス

もちろんこちらも英語・・・ :sweat_smile:
http://docs.spring.io/spring/docs/4.3.0.RELEASE/spring-framework-reference/htmlsingle/

# Download

Mavenリポジトリから必要なアーティファクトをダウンロードしてください。

```xml:Maven
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>4.3.0.RELEASE</version>
</dependency>
```

```groovy:Gradle
dependencies {
    compile 'org.springframework:spring-context:4.3.0.RELEASE'
}
```

# Download (Spring Boot)

Spring Bootユーザーは、Starterを指定して必要なアーティファクトをダウンロードしてください。
Spring BootのSpring 4.3対応は、Spring Boot 1.4(投稿時点では未リリース)からになります。
ごちゃごちゃ説明するのは面倒なので・・・[SPRING INITIALIZR](https://start.spring.io/)からプロジェクトつくりましょう！！


# Spring 4.3の変更点

#### Spring JIRA

* [Issue一覧](https://jira.spring.io/issues/?jql=project%20%3D%20SPR%20AND%20fixVersion%20in%20%28%224.3%20GA%22%2C%20%224.3%20RC1%22%2C%20%224.3%20RC2%22%29)

#### Spring 4.3 主な変更点紹介シリーズ on Qiita

* 第１回：[Spring 4.3 DIコンテナ関連の主な変更点](http://qiita.com/kazuki43zoo/items/172d132ff8f4ba098888)
* 第２回：[Spring 4.3 データアクセス関連の主な変更点](http://qiita.com/kazuki43zoo/items/bc036b433444f5c33dc4)
* 第３回：[Spring 4.3 キャッシュ関連の主な変更点](http://qiita.com/kazuki43zoo/items/43cea4b36822b58c0562)
* 第４回：[Spring 4.3 JMS関連の主な変更点](http://qiita.com/kazuki43zoo/items/f0142ebe76dbe873bd5d)
* 第５回：[Spring 4.3 Web関連の主な変更点](http://qiita.com/kazuki43zoo/items/53d2ca25c174ff618331)
* 第６回：[Spring 4.3 WebSocket関連の主な変更点](http://qiita.com/kazuki43zoo/items/f2eac11f94e2afc7c964)
* 第７回：[Spring 4.3 テスト関連の主な変更点](http://qiita.com/kazuki43zoo/items/6b6ecafd8e69a54e4803)

# Spring 4系の書籍

Spring 4系の日本語書籍も出版されています。

* [Spring徹底入門 Spring FrameworkによるJavaアプリケーション開発](http://www.shoeisha.co.jp/book/detail/9784798142470) : 2016/7/20出版
* [[改訂新版]Spring入門 ――Javaフレームワーク・より良い設計とアーキテクチャ](http://gihyo.jp/book/2016/978-4-7741-8217-9) : 2016/6/14出版
* [Spring Framework 4 プログラミング入門](http://www.shuwasystem.co.jp/products/7980html/4156.html) : 2014/7/31出版
* etc ?



# その他関連サイト

TERASOLUNA Server Framework 5.xのガイドラインは必見です。この内容が無料でみれるなんてありえない！？なにより日本語なのがうれしいですね。残念ながら「Java Config」と「Spring Boot」には対応してませんが、エンタープライズWebアプリケーション開発におけるSpringの使い方などのノウハウがつまっています。

* http://terasolunaorg.github.io/guideline

Spring 4.3やSpring Boot 1.4の変更点をコンパクトに紹介してくれている @making@github のスライドもオススメです。

* http://www.slideshare.net/makingx/jjugccc-cccgh5-whats-new-in-spring-framework-43-boot-14-pivotals-cloud-native-approach


# まとめ

シンプルに・・・Let's try Spring 4.3 :blush:
QRコードを使ってスキャン画像の位置・傾き・縮尺の補正

QRコード読み取りライブラリーjsqrcodeを使い座標を3個取得して
位置・傾き・縮尺を補正しマークシートから情報が読み取るツールを作りました。

QRコードを利用したマークシート（作成用）http://pie.karou.jp/za.html
![a.jpg](https://qiita-image-store.s3.amazonaws.com/0/54926/352c298b-6347-538a-b5f8-10bde47535d5.jpeg)

QRコードを利用したマークシート（読み取り用）http://pie.karou.jp/zb.html
![b.jpg](https://qiita-image-store.s3.amazonaws.com/0/54926/ac44308d-4b3c-8f50-f65d-55b88ef3dbdc.jpeg)
Eclipseの覚え書き


# はじめに

現場の業務で使用するための覚え書きです。 
Windows用を記載します。
IntelliJ IDEAの棚卸用でもあります。

# 記事の更新について

2018年より著者はIntelliJ IDEAに移行しており、Eclipseは触っていない。

# Eclipseについて

4.8のPhoton以降の4.9よりコードネームを廃止し、3ヶ月周期でマイナーバージョン表記を更新している。

# プラグイン

pleiades.jar
lombok.jar

# コマンド一覧

アクション          |             コマンド
:------------- | ---------------:
上書き保存          |         Ctrl + S
一括削除           |         Ctrl + D
元に戻す           |         Ctrl + Z
やり直し           |         Ctrl + Y
検索             |         Ctrl + F
クローズ           |         Ctrl + W
指定行へジャンプ       |         Ctrl + L
コメントアウト        |         Ctrl + /
入力アシスト         |     Ctrl + space
フォーマット         | Ctrl + Shift + F
リソースを開く        | Ctrl + Shift + R
Javadocコメントの追加 |  Alt + Shift + J
DB2のSQL・DDLファイルをバッチファイルで実行する方法


例えばWindowsローカル環境のテストで、DB2のテーブルを毎回Drop＆Createするような場合、DDLファイルを用意しておき、db2コマンドを立ち上げて「db2 -tvf DDLファイル名」と打ち込めばよい。

しかし毎回打ち込むのも面倒なので、db2コマンド起動＆ファイル読み込みバッチファイルを用意しておき、ダブルクリックだけで実行する方法。

---

例えば、以下のようなテーブルDrop＆Create用のDDLファイルがあったとする。

```SQL:DDLファイル名.ddl
connect to データソース名 user ユーザー名 using パスワード;

drop table テーブル名;
create table テーブル名(
	keycol char(10) not null
	valcol char(10)
);
alter table テーブル名 add constraint pk名 primary key (keycol);

quit;

```

上記DDLファイルと同じ場所に、以下のバッチファイルを配置し、拡張子を除くファイル名を同一にする（例えば「aaa.ddl」の場合、「aaa.bat」とする）。

**DDL実行バッチ**


```.bat(dos):DDLファイル名.bat
db2cmd /c db2 -tvf %~n0.ddl;
```

上記バッチファイルを実行すると、db2コマンドが立ち上がり、DDLが実行される。

このバッチファイルのいいところは、コピーしてファイル名をSQL・DDLファイルと同一にし、同じ場所に配置するだけで、バッチファイルの内容は書き変えることなく、SQLまたはDDLを実行できること。

---

なお、拡張子が.sqlのファイルを実行する場合は以下のようになる（拡張子がsqlになっただけ）。

**SQL実行バッチ**

```.bat(dos):SQLファイル名.bat
db2cmd /c db2 -tvf %~n0.sql;
```

---

SQL・DDL実行後にコマンドウィンドウを消さずに目チェックしたい場合は、db2cmd のあとの /c を消せばよい。

**SQL実行バッチ(実行後にウィンドウを閉じない)**

```.bat(dos):SQLファイル名.bat
db2cmd db2 -tvf %~n0.sql;
```

**DDL実行バッチ(実行後にウィンドウを閉じない)**

```.bat(dos):DDLファイル名.bat
db2cmd db2 -tvf %~n0.ddl;
```


以上
jenkins 1から2へのアップグレード

# 概要
CentOS7にインストールしたJenkinsをコマンドラインからjenkins2へアップデートする手順

# 動作環境
CentOS 7.1
Jenkins 1.xxx　あげる前に確認するの忘れました

# 手順
基本、/usr/lib/jenkins/jenkins.warに最新版のwarファイルを配置して再起動するだ

```
# cd /usr/lib/jenkins/
# systemctl stop jenkins
# mv jenkins.war jenkins.war.20160611
# wget http://mirrors.jenkins-ci.org/war/latest/jenkins.war
# systemctl start jenkins
```

# /var/log/jenkins/jenkins.log　にエラーでた

サービス自体は起動するものの、ブラウザアクセス不可

```
重大: Container startup failed
java.io.IOException: Failed to start a listener: winstone.Ajp13ConnectorFactory
        at winstone.Launcher.spawnListener(Launcher.java:207)
        at winstone.Launcher.<init>(Launcher.java:148)
        at winstone.Launcher.main(Launcher.java:352)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:606)
        at Main._main(Main.java:246)
        at Main.main(Main.java:91)
Caused by: java.lang.UnsupportedOperationException: AJP support is removed in Winstone 3.0 due to Jetty 9 not supporting AJP. For reverse proxying, please use HTTP instead of AJP.
        at winstone.Ajp13ConnectorFactory.start(Ajp13ConnectorFactory.java:31)
        at winstone.Launcher.spawnListener(Launcher.java:205)
        ... 8 more
```

# 復旧手順

/etc/sysconfig/jenkinsに、JENKINS_AJP_PORT="-1" を追記

```
# cd /etc/sysconfig/
# cp jenkins jenkins.20160611

# vi jenkins

# diff -c jenkins jenkins.20160611
*** jenkins	2016-06-11 21:39:47.321932449 +0900
--- jenkins.20160611	2016-06-11 21:13:03.909234217 +0900
***************
*** 164,168 ****
  # Full option list: java -jar jenkins.war --help
  #
  JENKINS_ARGS=""
-
- JENKINS_AJP_PORT="-1"
--- 164,166 ----
```

そしてjenkins再起動

```
# systemctl restart jenkins
```

無事にブラウザで表示できました

# 参考記事
https://issues.jenkins-ci.org/browse/JENKINS-33776
javascript object watch

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/watch


http://stackoverflow.com/questions/1269633/watch-for-object-properties-changes-in-javascript


http://www.cnblogs.com/McJeremy/archive/2010/06/18/1760385.html


http://stackoverflow.com/questions/1029241/object-watch-for-all-browsers
【Ruby】SSH接続してコマンド実行＆SCPでファイル転送

#なにこれ
最近、Python→Rubyに移行していこうと思っていて、その中で学んだ事です。
Rubyで指定した鍵（と鍵のパスワード）を使って、サーバーにSSH接続しコマンド実行、コマンド実行後にファイル転送をするという内容です。

インフラやってる人に特に役に立つかも。

#準備

```bash
gem install net-ssh
gem install net-scp
```

#想定環境
* 接続先: 172.17.0.2
* 鍵Path: /home/user/.ssh/this_is_private_key.key
* 鍵Password: tomori_nao

# Code

```rb
  opt = {
    :keys => '/home/user/.ssh/this_is_private_key.key',
    :passphrase => 'tomori_nao',
    :port => 22
  }
  Net::SSH.start('172.17.0.2', '<USERNAME>', opt) do |ssh|
    cmd1 = 'echo tomori > nao.txt'
    ssh.exec!(cmd1)
    # File Transfer over SSH
    src_path = '/home/<USERNAME>/nao.txt'
    dst_path = './nao.txt'
    ssh.scp.download! src_path, dst_path
  end
```

# まとめ

はい、できました。めでたしめでたし♥
bash on windowsを導入してみる

# はじめに

Webエンジニアが使うマシンといえば専らMacというこのご時世、
何を血迷ったかWindowsマシンを買ってしまいました。

~~しょうがないから~~せっかくだから発表されたばかりの
"Bash on Ubuntu on Windows"(以下Bash on Windows)を使ってみよう、という試みです。


# 公式情報

以下のページがBash on Windowsに関する、Microsoft公式のドキュメントだと思います。

https://msdn.microsoft.com/en-us/commandline/wsl/about

インストール方法なんかもちゃんと載ってます。


# インストール手順

1. Windows Insider Programに参加し、Insider Preview版のWindowsを入手できるようにする
    2. "“Release Preview”,"slow","fast"、3つの選択肢があるが、まだ"fast"じゃないとbashは試せない？
2. "Windows 10 Anniversary Edition - Build 14316"以降のWindows 10を入手、インストールする
3. セキュリティ設定を「開発者モード」に切り替える
4. コントロールパネルの「プログラムと機能」から「Windowsの機能の有効化または無効化」を開く
5. "Windows Subsystem for Linux"を有効にして再起動
6. コマンドラインで`bash`と入力してインストール

## 余談

インストール時にウィンドウを切り替えたからかどうかわかりませんが、表示がおかしくなりました。

![windowsonbash_bug.png](https://qiita-image-store.s3.amazonaws.com/0/70758/fc04e284-7919-47bb-9f6e-2ab86f0a7c1d.png)

[ムーンサイドかな？](http://dic.pixiv.net/a/%E3%83%A0%E3%83%BC%E3%83%B3%E3%82%B5%E3%82%A4%E3%83%89)


# インストールされていたパッケージ

量が多いのでgistに上げました。

https://gist.github.com/hanocha/3d46678b3c26f284dd89f3963972e23b


# 次回予告

Insider Previewさえ導入できてしまえば、インストールは非常に簡単に行えました。
次回はこれに開発環境を構築したいと思います。
Androidアプリのデコンバイルまとめ

#背景
ついつい時間ができたらやってしまうAndroidのゲームを、
単に遊ぶだけではなく構造を理解して技術トレンドを追いつつ、
ゲームそのものに熱中しないように自動化してつまらなくしてやめるのが、
自身の習慣となっていますが、マシンを変えるたびに環境を揃えるのが面倒なので、
ここにまとめます。

#使うもの
- apktool (http://ibotpeaches.github.io/Apktool/)
- dex2jar (https://github.com/pxb1988/dex2jar)
- jad (http://varaneckas.com/jad/)
- オンラインデコンパイラー (https://retdec.com/decompilation/)

#やりかた
## 1.apkファイルをPCにコピーする
```adb shell pm list packages -f | grep パッケージ名```
package:アプリ保存先=パッケージ名

```adb pull アプリ保存先 PC保存先```

## 2.apktoolでapkを展開する(主にマニフェストとか、アセットとか、リソースファイルの確認)
```apktool d アプリ```
アプリのパッケージ名のフォルダに展開される

パッケージ名
|-AndroidManifest.xml
|-apktool.yml
|-assets
|-lib
|-original
|-res
`-smali

## 3.unzipでapkを展開する(ソースコード読みたい時の下準備)
```unzip アプリ -d apk```

./apk
|-AndroidManifest.xml
|-META-INF
|-assets
|-classes.dex
|-lib
|-res
`-resources.arsc

## 4.dex2jarでdexファイルをjarファイルに変換
```dex2jar classes.dex```
classes-dex2jar.jarが生成される

## 5.unzipでjarを展開する
```unzip classes-dex2jar.jar -d output```

## 6.jadでclassファイルをjavaに変換する
```cd output; find . -name "*class" | xargs -IXXX jad -s java -r XXX```
output以下にフォルダ構成を維持されたjavaファイルが出来上がる

## 7.必要に応じて.soファイルの内容を確認
対象のアプリのロジックが.soに入っている場合は、別途デコンパイラーが必要になるため、
環境構築が面倒な方はオンラインコンパイラーを使うのが無難
※主にUnityのコードとか見るのに使っている

#主に見ているもの
javaコードとか、layoutファイルとか見つつ、
libの中身見てどういうライブラリー使っているのか見つつ、
uiautomatorviewer使いながらアプリ動かしつつ、
Charles使って通信内容見つつ、
AppiumとかCalabashとかmonkeyrunner(未だに)とか使って自動化したり、
ゲームの裏ワザが本当なのか確認したりしてます。

# 最後に
内容的にここ５年ぐらい特に変わってないやり方のまとめになってしまっていますので、
是非より良い方法とか、他にもこういうの見たりしてまっせという情報があればコメント頂けると助かります。
CakePHP公式の日本語話者向けSlackチャンネル開設のご案内

CakePHP公式の日本語話者向けのSlackチャンネル（チャットルーム）が開設されました。

http://cakesf.herokuapp.com/

まだ開設したばかりで明確な用途が定まっているわけではないのですが、初心者のサポートや開発者同士の意見交換、不具合報告、コアに取り込みたい機能の提案などにお使いいただければと思っています。

チャットに参加するには、まず上記のURLからユーザー登録画面を行います。

![slack-getinvite.png](https://qiita-image-store.s3.amazonaws.com/0/107118/b0f96c44-0d5d-fc25-7d76-a07c4206915f.png)

メールアドレスを入力して GET MY INVITE を押下すると、入力したメールアドレス宛に招待メールが届くと思います。招待メール中のリンクを踏んでユーザー登録を行ってください。

登録が完了すると Welcome 的な画面が開かれて、画面左にメニューが現れると思います。

![slack-menu.png](https://qiita-image-store.s3.amazonaws.com/0/107118/06198146-3cfd-71bb-0be2-43d32481ae94.png)

メニューの CHANNELS を押下するとチャンネル一覧が表示されますので、そちらから #japanese を選択してください。

![slack-channel.png](https://qiita-image-store.s3.amazonaws.com/0/107118/2b38dfdc-a799-2297-5df8-3a48b45cebb0.png)

するとチャットログが現れると思います。最下部の Join Channel を押下するとチャットに参加できます。

![slack-join.png](https://qiita-image-store.s3.amazonaws.com/0/107118/50ce0319-7fe1-6d3b-85b1-71371cf8e839.png)


皆さまのご参加を心よりお待ちしております。