OmniAICreator/Qiita-1.07M huggingface dataset:
Net::HTTPがタイムアウトされない件


[RestClient](https://github.com/rest-client/rest-client)のような内部で`Net::HTTP`を使っているような場合も起こります。

## タイムアウトされないコード

```rb
pry(main)> require "benchmark"
=> true
pry(main)> uri = URI.parse(NOT_TIMEOUT_URL)
=> #<URI::HTTP http://023sos.com>
pry(main)> time = Benchmark.measure do
pry(main)*   Net::HTTP.start(uri.host, uri.port) do |http|
pry(main)*     http.open_timeout = 1
pry(main)*     http.read_timeout = 1
pry(main)*     http.get(uri.request_uri)
pry(main)*   end
pry(main)* end
=> #<Benchmark::Tms:0x00000002655958 @cstime=0.0, @cutime=0.0, @label="", @real=5.746352325000316, @stime=0.0, @total=0.0, @utime=0.0>
[20] pry(main)> p time.real
5.746352325000316
=> 5.746352325000316
```

`5.746352325000316`...タイムアウトを1秒にしているはずですが、6秒弱掛かっているではありませんか。タイムアウトがうまく機能していないようです。

色々と調べた結果、名前解決に時間がかかっている場合は、タイムアウトされないことが発覚。

>timeout による割り込みは Thread によって実現されています。 C 言語レベルで実装され、 Ruby のスレッドが割り込めない処理に対して timeout は無力です。 そのようなものは実用レベルでは少ないのですが、 Socket などは DNSの名前解決に時間がかかった場合割り込めません (resolv-replace を使用する必要があります)。 その処理を Ruby で実装しなおすか C 側で Ruby のスレッドを意識してあげる必要があります。

## resolv-replaceを使ってみる
```rb
pry(main)> require "benchmark"
=> true
pry(main)> require "resolv-replace"
=> true
pry(main)> uri = URI.parse(NOT_TIMEOUT_URL))
=> #<URI::HTTP http://023sos.com>
pry(main)> time = Benchmark.measure do
pry(main)*   timeout(1) do
pry(main)*     Net::HTTP.start(uri.host, uri.port) do |http|
pry(main)*       http.open_timeout = 1
pry(main)*       http.read_timeout = 1
pry(main)*       http.get(uri.request_uri)
pry(main)*     end
pry(main)*   end
pry(main)* end
=> => #<Benchmark::Tms:0x00000002416160 @cstime=0.0, @cutime=0.0, @label="", @real=0.8125761109995437, @stime=0.0, @total=0.0, @utime=0.0>
[20] pry(main)> p time.real
0.8125761109995437
=> 0.8125761109995437
```

なぜか早くなった影響でタイムアウトされず、、、
再度、同じように実行する。

```rb
Timeout::Error: execution expired
```

無事タイムアウトされました！！

## resolv-replaceとは
resolv-replaceを使うと、libcのresolverをRubyで実装しているResolveクラスに置き換えることができます。

### resolverとは
>リゾルバとは、IPアドレスとドメイン名を結びつけるDNSにおいて、ネームサーバにホスト名を通知してIPアドレスの検索を依頼したり、その逆を依頼したりするクライアント側のプログラム。
アプリケーションソフトがIPアドレスやホスト名を必要とする場合には、通常リゾルバを介して名前解決が行われる。
リゾルバは一つ以上のネームサーバのアドレスを知っており、そのネームサーバに問い合わせを行い、返ってきた答えをアプリケーションに渡す。

## なぜ早くなったのか
詳しく調べたわけではないので、憶測です。
Resolve::DNSは初期設定のままでは、`/etc/resolv.conf`もしくはプラットフォーム固有のDNS設定を利用します。
私のlocal環境ではGoogleのDNS(8.8.8.8, 8.8.4.4)を使うようになっており、このDNSを利用したため早くなったと思われます。
そこで、stagingやproductionの環境とlocalの環境とで利用するDNSが変わってしまう可能性があり、注意が必要です。

## 考察
- Crawlerを作るときは、DNSを変更したり、タイムアウトができたりするので、resolv-replaceを使うと幸せになれる。
- 環境の差異によって、DNSが変わってしまう恐れがあるので、resolv-replaceを使うときは、初期設定のまま使うことは避けた方が良いと思われる。

## 参考
[Ruby の Net::HTTP のタイムアウトにハマって、結局 Timeout について調べることになった件](http://qiita.com/yutackall/items/5c502a0afc4c27e6d90d)
[Ruby 2.1.0 リファレンスマニュアル　Timeoutモジュール](http://docs.ruby-lang.org/ja/2.1.0/class/Timeout.html)
[Ruby 2.1.0 リファレンスマニュアル Resolv::DNSクラス](http://docs.ruby-lang.org/ja/2.1.0/class/Resolv=3a=3aDNS.html)
[http://morizyun.github.io/blog/open-uri-timeout-ruby/](http://morizyun.github.io/blog/open-uri-timeout-ruby/)
[[Ruby] 例えば、DNS Resolver をすげかえる](http://blog.livedoor.jp/sonots/archives/38822072.html)
[リゾルバ](http://e-words.jp/w/%E3%83%AA%E3%82%BE%E3%83%AB%E3%83%90.html)
Ruby Dropbox SDK 1.6.1のchunked uploadを使いやすくした

# 記事の要約
* `DropboxClient::ChunkedUploader#upload`はエラーが発生するまでアップロードし続ける仕様
* でもそれだとアップロード時の進捗把握が困難
* uploadを呼ぶ度にチャンクサイズ分だけアップロードしてすぐreturnしたい
* そんなパッチを作った

# DropboxClient::ChunkedUploader#uploadの仕様
きっかけはRuby Dropbox SDK 1.6.1の`DropboxClient::ChunkedUploader#upload`メソッドの挙動を誤解していたことです。
私は勝手にチャンクサイズ分だけアップロードしてreturnするメソッドだと思い込んでいたのですが、[RDoc Documentation](https://www.dropboxstatic.com/static/developers/dropbox-ruby-sdk-1.6.1-docs/DropboxClient/ChunkedUploader.html)を読みなおしたところ、
> **upload(chunk_size=4*1024*1024)**
> Uploads data from this ChunkedUploader’s file_obj in chunks, until an error occurs.

と書いてありました。
つまり、チャンクサイズ分だけアップロードしてreturnする**のではなく**、
**エラーが発生するまで**何度もチャンクサイズ分のアップロードを**繰り返します**。
でもこれだとアップロードの進捗を把握できないじゃないですか！なんて不便な！

私のやりたいことを実現できるメソッドがないかなーと思いつつDocumentationを眺めていたところ、
[#partial_chunked_upload — DropboxClient](https://www.dropboxstatic.com/static/developers/dropbox-ruby-sdk-1.6.1-docs/DropboxClient.html#method-i-partial_chunked_upload)なるものを発見しました。
これを使えばぼくのかんがえたさいきょうの`upload`メソッドを実装できそう！
そんなわけで作っちゃいました。

# パッチ
今回書いたコードがこちらです。
実装にあたっては、https://github.com/ntamvl/rbackup/blob/66982530dbedf1c9d26713274910fa67c4d4b96f/lib/backup/storage/dropbox.rb を参考にさせていただきました。

```rb
# dropbox sdk 1.6.1 のチャンクアップロードを
# 1回アップロードするごとにreturnさせるパッチ
class DropboxClient
  class ChunkedUploader
    def upload(chunk_size = 1024**2 * 4)
      @file_obj.seek(@offset) unless @file_obj.pos == @offset
      data = @file_obj.read chunk_size

      begin
        response = @client.partial_chunked_upload data, @upload_id, @offset
      rescue => e
        response = JSON.parse(e.http_response) rescue {}
        raise e unless response.body['offset']
      end

      metadata = JSON.parse response.body
      @upload_id = metadata['upload_id']
      @offset = metadata['offset'].to_i
    end
  end
end
```

# 使い方
こんな感じでアップロードの進捗を把握できます。

```rb
dropbox = DropboxClient.new DROPBOX_ACCESS_TOKEN
chunked_uploader = dropbox.get_chunked_uploader file_obj, file_obj.size

while chunked_uploader.offset < file_obj.size do
  chunked_uploader.upload  # 既定のチャンクサイズ(4MB)分だけアップロード
  progress = 100 * chunked_uploader.offset / file_obj.size  # 進捗(%)
end

chunked_uploader.finish to_path
```

# まとめ
Ruby Dropbox SDK 1.6.1のチャンクアップローダを改良し、ファイルアップロード時の進捗把握を容易にしました。

# 参考
RDoc Documentation - https://www.dropboxstatic.com/static/developers/dropbox-ruby-sdk-1.6.1-docs/index.html
rbackup/dropbox.rb at 66982530dbedf1c9d26713274910fa67c4d4b96f · ntamvl/rbackup - https://github.com/ntamvl/rbackup/blob/66982530dbedf1c9d26713274910fa67c4d4b96f/lib/backup/storage/dropbox.rb
bitcoindをAWSのAmazon Linuxにインストール


Githubの[公式ドキュメント](https://github.com/bitcoin/bitcoin/blob/master/doc/build-unix.md)を読みながらAmazon Linuxへのインストール・起動までをメモ。

## 環境

* Amazon Linux AMI 2015.09.2 (HVM), SSD Volume Type
* bitcoin v0.12.0

## 事前準備

SSD100GB, t2.mediumでEC2インスタンスを起動しておく。

## 手順

依存ライブラリをインストール。

```
$ sudo yum install -y gcc-c++ autoconf automake libtool boost-devel openssl-devel libevent-devel
```

bitcoinをダウンロード。

```
$ curl -L https://github.com/bitcoin/bitcoin/archive/v0.12.0.tar.gz -o bitcoin-0.12.0.tar.gz
$ tar zxvf bitcoin-0.12.0.tar.gz
$ cd bitcoin-0.12.0
```

Berkeley DBをインストール。

```
$ BITCOIN_ROOT=$(pwd)

$ BDB_PREFIX="${BITCOIN_ROOT}/db4"
$ mkdir -p $BDB_PREFIX

$ wget 'http://download.oracle.com/berkeley-db/db-4.8.30.NC.tar.gz'
$ echo '12edc0df75bf9abd7f82f821795bcee50f42cb2e5f76a6a281b85732798364ef  db-4.8.30.NC.tar.gz' | sha256sum -c
$ tar -xzvf db-4.8.30.NC.tar.gz

$ cd db-4.8.30.NC/build_unix/
$ ../dist/configure --enable-cxx --disable-shared --with-pic --prefix=$BDB_PREFIX
$ make install
```

bitcoinをインストール。

```
$ cd $BITCOIN_ROOT
$ ./autogen.sh
$ ./configure LDFLAGS="-L${BDB_PREFIX}/lib/" CPPFLAGS="-I${BDB_PREFIX}/include/"

$ make && sudo make install && echo DONE
...
DONE
```

起動スクリプトをinit.dに配置してサービスに登録。

```
$ sudo cp ./contrib/init/bitcoind.init /etc/init.d/bitcoind
$ sudo chmod 755 /etc/init.d/bitcoind
$ sudo chkconfig --add bitcoind
$ sudo chkconfig bitcoind on
```

起動スクリプトのオプションを定義。
  
```
$ sudo mkdir /etc/bitcoin
$ sudo vi /etc/sysconfig/bitcoind
# 以下の内容を設定。
BITCOIND_BIN="/usr/local/bin/bitcoind"
BITCOIND_OPTS="-daemon -disablewallet -datadir=/var/lib/bitcoin -conf=/etc/bitcoin/bitcoin.conf"
```

設定ファイルを配置。

```
$ sudo cp ./contrib/debian/examples/bitcoin.conf /etc/bitcoin/
$ sudo vi /etc/bitcoin/bitcoin.conf
# 以下の内容を設定。
rpcbind=0.0.0.0
rpcuser=xxxuser
rpcpassword=xxxpass
rpcport=8332
```

データディレクトリを作成。

```
$ sudo mkdir /var/lib/bitcoin
```

## 起動

```
$ sudo service bitoind start
```

~~ブロックのダウンロードが完了するまで、デーモン起動OKのメッセージは表示されない。
以下のコマンドのblocksと[blockchain.info](https://blockchain.info/)の最新ブロックの差分からおおよその進捗が確認できる。~~

追記: デーモン起動が完了しないのは、単に起動オプションから `-daemon` が抜けていただけだった。

```
$ sudo /usr/local/bin/bitcoin-cli -conf=/etc/bitcoin/bitcoin.conf getinfo
{
  "version": 120000,
  "protocolversion": 70012,
  "blocks": 261496,
  "timeoffset": -1,
  "connections": 8,
  "proxy": "",
  "difficulty": 148819199.8050926,
  "testnet": false,
  "paytxfee": 0.00000000,
  "relayfee": 0.00001000,
  "errors": ""
}
```

## 稼働確認

稼働確認のためbitcoinをインストールしたAmazon LinuxにSSHポートフォワーディング。

```
$ ssh -L '8832:127.0.0.1:8832' bitcoin-node
```

別ターミナルのPythonからブロック数を確認。

```
$ sudo pip install python-bitcoinlib
$ python
>>> import bitcoin.rpc
>>> proxy = bitcoin.rpc.Proxy(service_url='http://xxxuser:xxxpass@127.0.0.1:8332')
>>> proxy.getblockcount()
311367
```

## 参考

* [bitcoin/build-unix.md at master · bitcoin/bitcoin](https://github.com/bitcoin/bitcoin/blob/master/doc/build-unix.md)
* [bitcoin/init.md at master · bitcoin/bitcoin](https://github.com/bitcoin/bitcoin/blob/master/doc/init.md)
Ubuntu 14.04 で Git の最新を使う

# git の バージョン
```
$ sudo apt-get install git
$ git version
git version 1.9.1
```
Ubuntu 14.04 の公式パッケージは、1.9.1 が入ります。

# PPAを追加して git を更新する

stable 版の ppa をリポジトリに追加します。

```
$ sudo add-apt-repository ppa:git-core/ppa
$ sudo apt-get update
$ sudo apt-get upgrade
```

# 現時点の最新

```
$ git version
git version 2.7.4
```
git 2.7.4 が無事入りました。

# 参考
* https://launchpad.net/~git-core/+archive/ubuntu/ppa
Macのターミナルとクリップボード間でコピー＆ペースト

# pbcopy及びpbpasteコマンド
を利用することで、
ターミナルの標準出力をクリップボードに格納したり、
逆にクリップボードの内容を取り出してコンソールで利用することができる

```
pbcopy ：ペーストボードに値を格納
pbpaste：ペーストボードから値を取り出せる
# pb = 「ペーストボード」らしい
```
当然パイプを利用して他のコマンドと組み合わせが可能

- 使用例

```
pwd | pbcopy    # カレントディレクトリのパスがクリップボードにコピーされる
sh hello.sh | pbcopy  # shellscriptの標準出力内容をクリップボードにコピー
```

ということはつまり、集計用のスクリプトの抽出結果を自動的にクリップボードへ格納、
そのままスプレッドシートなどのレポートへの貼り付けなどもできる！！

今までいちいち集計結果はtxtファイルに出力して、
テキストエディタで開いてコピペとかしてたのはなんだったのか・・・（非エンジニアの悲しさ）

# 参考
[ターミナルの標準出力をクリップボードに保存](http://rakkyoo.net/?p=338)
[Mac のターミナル上でクリップボードを利用する](https://macperson.net/mac-clipboard-pasteboard/)

以上
Toppers/ASPのRenesas RXアーキテクチャ GCC版にtinetを追加

#Toppers/ASPのRenasas RXアーキテクチャ GCC版にtinetライブラリをマージ
色々あって昨年公開して放置していたToppers/ASPのRenasas RXアーキテクチャ GCC版にtinetライブラリを追加しました。

https://github.com/farmer-bism/bismath_evalkit_target

それに合わせてターゲット依存部のみ登録していたgitレポジトリにカーネル本体も追加しました。
実機評価はGR-SAKURA、コンパイルはLinuxで行っています。
~~なお、手持ちのKPITとe2studioの環境ではリンクに失敗する現象が発生しています。私の環境が壊れているだけかもしれませんが、原因を調査中です~~ 
セクションを二重定義している個所がありました。KPITとe2studioで動作確認済みです。

使い方はasp/tinet/docのドキュメントを参照してください。
現状はサンプルアプリケーションのecho4が動作しています。

#登録したソースの内訳
##tinet 
   公開されているソースコードのASP用 TINET 1.5.4を持ってきました。Perlバージョンが新しいとconfigureでエラーになるため一部修正を行っています。
修正内容はメーリングリストの次のスレッド( https://www.toppers.jp/TOPPERS-USERS/2011-October/003390.html )を参照してください。

##tinet/netdev/if_rx62n 
 Toppersで公開されているTOPPERS/ECNL ECHONET Lite 通信ミドルウェアに含まれているGR-SAKURA向けのethernetドライバを持ってきました。
 GCCでは送受信ディスクリプタ、送受信バッファが要求するアドレスのアライメント調整を行ってくれないため、調整用のコードを追加しています。また、ドライバを使用するためにはユーザがMACアドレスを定義する必要があります。
アプリケーションのどこかで以下のような感じでMACアドレスを定義してください。

```
uint8_t mac_addr[6] = {0x10, 0x2, 0x3, 0x4, 0x5, 0x6};
```

ドライバではEthernet PHY(LAN8720)のレジスタアクセスを行っています。 異なるPHYを使用する場合はether_phy.cの修正が必要になります。
Pythonのサブジェネレータへの委譲構文を使ったズンドコキヨシ

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">Javaの講義、試験が「自作関数を作り記述しなさい」って問題だったから<br>「ズン」「ドコ」のいずれかをランダムで出力し続けて「ズン」「ズン」「ズン」「ズン」「ドコ」の配列が出たら「キ・ヨ・シ！」って出力した後終了って関数作ったら満点で単位貰ってた</p>&mdash; てくも (@kumiromilk) <a href="https://twitter.com/kumiromilk/status/707437861881180160">2016年3月9日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

ふと、あまり使い道の分からなかったサブジェネレータへの委譲構文が使えるのではないか、と思った。
サブジェネレータへの委譲構文ってなに？って方は、[公式ドキュメント](http://docs.python.jp/3.5/whatsnew/3.3.html#pep-380)か、手前味噌ですが[この記事](http://qiita.com/gyu-don/items/0f38dfb48fc7dabbb2ae)をご覧ください。

(2016/3/22 ちょっと間違ってたので修正)

```py3
import random

def zundoko(n=0):
    if n == 5:
        yield 'キ・ヨ・シ！'
        raise StopIteration

    x = random.random() < 0.5
    if x:
        if n < 4:
            yield 'ズン'
        else:
            yield 'ドコ' 
        yield from zundoko(n+1)
    else:
        if n < 4:
            yield 'ドコ'
            yield from zundoko()
        else:
            yield 'ズン'
            yield from zundoko(4)

print(''.join(zundoko()))
```
Dockerコンテナ作成メモ

【自分用メモ】
php + apache + pgsql　用コンテナを作ってみたい。 oci8あると便利そうなので、それも。
色々突っ込んで、完全武装のphpコンテナを作る？

phpにociをインストールする方法
http://blog.livedoor.jp/loopus/archives/50213411.html

yumで入れたPHPにoci8とpdo_ociを入れる
http://qiita.com/asano_yuki/items/24fd22412057338093ae

んー、よくわかってないが、ociを入れるにはオラクルのアカウントを使ってrpm or zipを落としてきてインストールしないとだめってことか。

■phpインストール
http://dage.jp/post/apache2-2php5-2-%E5%AE%8C%E5%85%A8%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB-part2-php%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB/

<pre>
</pre>

■PECLインストールで参考？
http://yassu.jp/pukiwiki/index.php?PHP%B3%C8%C4%A5%A5%E2%A5%B8%A5%E5%A1%BC%A5%EB(PECL%B4%DE%A4%E0)%A4%CE%C4%C9%B2%C3
http://php.net/manual/ja/intl.installation.php

■ビルド時のエラーで参考にしたサイト
http://blog.77jp.net/php-528-%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB-linux
http://askubuntu.com/questions/508934/how-to-install-libpng-and-zlib
http://www.monodonproject.info/?p=167
http://qiita.com/ms2sato/items/fd76d67fd5d63c3cb4a5
web3.eth.contractでcontract.abi.filterエラーの対処方法

以下に移行しました<br><a href="http://block-chain.jp/tech/web3-eth-contract-contract-abi-filter-error/" title="web3.eth.contractでcontract.abi.filterエラーの対処方法">web3.eth.contractでcontract.abi.filterエラーの対処方法</a>
コマンドでjenkinsジョブの無効/有効を切り替え～jenkins cliコマンド一覧もあるよ！～

# コマンドでjenkinsジョブの無効/有効を切り替え
コマンドライン上からjenkinsジョブの無効/有効を切り替えたかったためメモ。

jenkinsにはjenkins cliなるスクリプトから呼び出すためのcliクライアントが用意されているとのこと。

参考URL①（日本語版）：https://wiki.jenkins-ci.org/display/JA/Jenkins+CLI
参考URL②（英語版）　：https://wiki.jenkins-ci.org/display/JENKINS/Jenkins+CLI

## cliの取得
まずはcliの取得から。
私はtrac lightningに付属されているjenkinsを使用しています。デフォルトの設定だとjenkinsのURLは「http://localhost/jenkins」です。
①を参考に「http://localhost/jenkins/cli」からjenkins.cli.jarを取得します。

## jenkins cliのコマンド一覧
②を参考にコマンド一覧を取得。
私の環境だと下記のようになります。 

```
java.exe -jar jenkins-cli.jar -s http://localhost/jenkins help
```
実行するとコマンドとその使い方の一覧を取得できます。
下記はコマンドjenkins-cliのコマンド一覧。

|コマンド|内容|
|:-------|:---|
|build|ジョブをビルドします。オプションで完了するまで待ちます。|
|cancel-quiet-down|"quite-down"コマンドの処理をキャンセルします。|
|clear-queue|ビルドキューをクリアします。|
|connect-node|ノードと再接続します。|
|console|Retrievesconsoleoutputofabuild|copy-job|ジョブをコピーします。|
|create-job|標準入力をConfigXMLとして読み込み、ジョブを新規に作成します。|
|delete-builds|ビルドを削除します。|
|delete-job|ジョブを削除します。|
|delete-node|ノードを削除します。|
|disable-job|ジョブを無効化します。|
|disconnect-node|ノードとの接続を切断します。|
|enable-job|ジョブを有効化します。|
|get-job|ジョブ定義XMLを標準出力に出力します。|
|groovy|指定したGroovyスクリプトを実行します。|
|groovysh|対話式のGroovyシェルを起動します。|
|help|利用可能なコマンドの一覧を表示します。|
|install-plugin|ファイル、URLおよびアップデートセンターからプラグインをインストールします。|
|install-tool|ツールの自動インストールを実行し、インストール先を表示します。|
|keep-build|ビルドを保存するようにマークします。|
|list-changes|指定したビルドの変更履歴を表示します。|
|list-jobs|指定したビューかItemGroupのすべてのジョブを一覧表示します。|
|list-plugins|インストール済みのプラグインを一覧表示します。|
|login|認証情報を保存して、認証情報なしにコマンドを実行できるようにします。|
|logout|loginコマンドで保存した認証情報を削除します。|
|mail|標準入力の内容をメールとして送信します。|
|offline-node|"online-node"コマンドが実行されるまで、ビルドを実行するノードの使用を一時的に停止します。|
|online-node|直前に実行した"online-node"コマンドを取り消し、ビルドを実行するノードの使用を再開します。|
|quiet-down|Jenkinsは再起動に向けて終了処理を実施中です。ビルドを開始しないでください。|
|reload-configuration|メモリにあるすべてのデータを破棄して、ファイルから再ロードします。設定ファイルを直接修正した場合に役に立ちます。|
|restart|Jenkinsを再起動します。|
|safe-restart|Jenkinsを安全に再起動します。|
|safe-shutdown|Jenkinsを終了モードに変更しビルドが完了後に、シャットダウンします。|
|session-id|OutputsthesessionID,whichchangeseverytimeJenkinsrestarts|set-build-description|ビルドの説明を設定します。|
|set-build-display-name|ビルドの名称を設定します。|
|set-build-result|現在のビルドの結果を設定します。ビルド中に呼び出された場合のみ動作します。|
|shutdown|Jenkinsサーバーを直ちにシャットダウンします。|
|update-job|標準入力からの情報でジョブ定義XMLを更新します。get-jobコマンドの正反対のことを行います。|
|version|バージョンを表示します。|
|wait-node-offline|ノードがオフラインになるのを待ちます。|
|wait-node-online|ノードがオンラインになるのを待ちます。|
|who-am-i|認証情報を表示します。|

## コマンドでjenkinsジョブの無効/有効を切り替え
プロジェクトのメンバが多い環境でjenkinsを業務に取り入れている場合、jenkinsジョブが実行しているスクリプトの更新作業は慎重に行う必要があるかと思います。さながらそれはリリース作業と同様といえるでしょう。

更新作業の流れはざっくりとしてますが下記のような流れになるかと思います。

1.スクリプト更新対象のjenkinsジョブを無効化
2.スクリプトを更新（svnからのエクスポート、gitからpullなど）
3.スクリプト更新対象のjenkinsジョブを無効化

コマンドは下記のとおりです。

ジョブの無効化

```
java.exe -jar jenkins-cli.jar -s http://localhost/jenkins disable-job "ジョブ名"
```
ジョブの有効化

```
java.exe -jar jenkins-cli.jar -s http://localhost/jenkins enable-job "ジョブ名"
```
Registry key 'Software\JavaSoft\Java Runtime Environment\CurrentVersion' とかいうエラーが出たとき

<h2>こんな感じのエラーができたとき</h2>

Registry key 'Software\JavaSoft\Java Runtime Environment\CurrentVersion'
has value '1.8', but '1.7' is required.
Error: could not find java.dll
Error: could not find Java 2 Runtime Environment.

<h2>原因</h2>
windows\system32のパスがJDKよりも先に通っているのが良くないらしい。複数のJREが競合して発生しているらしい。
<a href="http://sakupo.seesaa.net/article/13252560.html" target="blank">（こちらを参考にさせていただきました）</a>

確かにパスを確認したら、windows\system32のパスが先にあった。

<h2>対応</h2>
JDKのパスを先に通す。

<h2>結果</h2>
Javaが動くようになった！
sqlで最新の日付のレコードとその前のレコードとの差分を取りたい

# やりたいこと
株価の日足データのように、1日1アイテムあたり1レコード存在するようなデータで、前日比を出したい。
※動作確認はPostgreSQL 8.4.20でのみ実施

# 対象テーブル
```sql
daily_stocks
(
  code character varying(10),
  date date,
  name character varying(255),
  end_value real,
  volume bigint,
  CONSTRAINT daily_stocks_code_key UNIQUE (code, date)
)
```
こんな感じで銘柄ごとの終値が入ってる
# 方法
## とりあえず1日前との差分をとればいい？
前日との比較なので、self joinで、一日前のレコードを持って来ればいい

```sql
select *,a.end_value-b.end_value as diff_end_value,a.volume-b.volume as diff_volume from daily_stocks as a join daily_stocks as b on a.code=b.code and a.date=b.date+1;
```

火曜～金曜までならこれで良いが、月曜の前日は日曜なのでレコードがない。

## ちゃんと考える

最新と2番目のレコードをとってくればいいので、まずは各銘柄について最新の日付を持つレコードを抽出する。
最新の日付を持つ銘柄のレコードは、そのレコードよりも古いレコードを *含まない* レコードなので、
テーブルaのレコードに対して

```sql
select * from daily_stocks as b where a.code=b.code and a.date<b.date;
```

を含まないようにすればいい。つまり

```sql
select * from daily_stocks as a where ( select * from daily_stocks as b where a.code=b.code and a.date<b.date );
```

となる。

これで最新の日付を持つテーブルが取得できたので、これをもとのテーブルとjoinして差分をとればいい。

```sql
select *,cd.end_value-pd.end_value as diff_end_value from daily_stocks as pd join (select * from daily_stocks as a where not exists( select * from daily_stocks as b where a.code=b.code and a.date<b.date)) as cd on pd.code=cd.code and pd.date<>cd.date;
```
(長い…)

これで、最新以外の日付と最新の日付の終値の差分が取れた。

もともとは各日付のレコードに対して前日比のデータをくっつけたかったので、本来ほしいデータではないような気がしてきた。

ということで続く

## それWindow関数でできるよ！

lag関数を使うことで、特定のグルーピング条件による一つ前のレコードを取得できるので、それを使ってやると

```sql
select *,end_value,end_value - lag(end_value) over (partition by code order by date) as lag_end_value from daily_stocks;
```
となって、非常にすっきり書けた。ありがとうWindow関数！

目的のBIツールでの表示もいい感じにできたので満足
![BI_001.PNG](https://qiita-image-store.s3.amazonaws.com/0/86918/285ebe0b-04e9-df66-58e9-7f2fcafd81de.png)
Terraformで独自ドメインでファイル配信


## やりたいこと

`www.共円.net`で、あるhtmlが返却されるように設定する。

## 事前準備

お名前.comでドメインを取得。

## Terraformの設定

```main.tf
provider "aws" {
  region = "ap-northeast-1"
}

resource "aws_route53_zone" "kyouen-net" {
  name = "xn--b6qvb.net"
}

resource "aws_s3_bucket" "main" {
    bucket = "www.xn--b6qvb.net"
    acl = "public-read"
    policy = <<EOF
{"Statement":[{"Action":"s3:GetObject","Effect":"Allow","Principal":"*","Resource":"arn:aws:s3:::www.xn--b6qvb.net/*","Sid":"PublicReadForGetBucketObjects"}],"Version":"2012-10-17"}
EOF

    website {
        index_document = "index.html"
        error_document = "error.html"
    }
}

resource "aws_route53_record" "www" {
  zone_id = "${aws_route53_zone.kyouen-net.zone_id}"
  name = "www.xn--b6qvb.net"
  type = "A"

  alias {
    name = "${aws_s3_bucket.main.website_domain}"
    zone_id = "${aws_s3_bucket.main.hosted_zone_id}"
    evaluate_target_health = true
  }
}

output "name_servers.0" {
  value = "${aws_route53_zone.kyouen-net.name_servers.0}"
}
output "name_servers.1" {
  value = "${aws_route53_zone.kyouen-net.name_servers.1}"
}
output "name_servers.2" {
  value = "${aws_route53_zone.kyouen-net.name_servers.2}"
}
output "name_servers.3" {
  value = "${aws_route53_zone.kyouen-net.name_servers.3}"
}
```

### [aws_route53_zone](https://www.terraform.io/docs/providers/aws/r/route53_zone.html)

zoneの設定を行います。

Punycode表記のドメイン名を、name属性として与えます。

### [aws_s3_bucket](https://www.terraform.io/docs/providers/aws/r/s3_bucket.html)

Static Website Hostingが出来るように設定します。
policy部分は、1度実行した後の`terraform.tfstate`から持ってきました。
（JSONのキー・値が一致してても、文字列として違ってたら変更ありとされるっぽい）

### [aws_route53_record](https://www.terraform.io/docs/providers/aws/r/route53_record.html)

作成したzoneや、S3 bucketの情報を元に、
`www.共円.net`というドメインで、同名のS3 bucketにアクセスできるようになります。

## Terraformの実行

計画の確認をします。

```
terraform plan
```

実行します。

```
terraform apply
```

数分待っていると、下記のようにname serverが出力されます。

```
Outputs:

  name_servers.0 = ns-NNNN.awsdns-NN.org
  name_servers.1 = ns-NNNN.awsdns-NN.co.uk
  name_servers.2 = ns-NNNN.awsdns-NN.com
  name_servers.3 = ns-NNNN.awsdns-NN.net
```

## name serverの設定

お名前.comのネームサーバー変更画面にて、Terraformで出力されたネームサーバのドメイン名を設定する。

## S3にファイルを配置、確認する。

Management Consoleとかでさくっとテキトーな`index.html`を配置する。

http://www.共円.net/ でアクセスできればOK。

## 感想

取得した独自ドメインで、静的ファイルを簡単にホスティング出来ました。

S3なので、下手なVPSとかIaaS使うよりは安く・高い信頼性で配信できます。

また、Terraformで構築しているので、再現性が高く、破棄も一瞬で出来ます。
AWS ELB -> Varnish -> nginx の構成の場合に、nginxでアクセス元のIPアドレスを取得する

## はじめに

以下の構成の場合に、nginxでアクセス元(client)のIPアドレスがうまく取れなくて困った。

```
client -> ELB -> Varnish 4.1 -> nginx

※ Varnishとnginxは同一サーバ
```

## nginxの設定

ELBを経由した場合は、「X-Forwarded-For」にクライアントIPが設定されるので、以下のように設定した。

```nginx.conf
set_real_ip_from   127.0.0.1/32; # VarnishサーバのIP
real_ip_header     X-Forwarded-For;
```
ただ、この設定だけだと、アクセス元IP「1.2.3.4」ではなく、ELBのIP「10.0.9.200」が出力されてしまった。

```
10.0.9.200 - - [17/Mar/2016:14:04:26 +0900] "GET / HTTP/1.0" 200 0 "http://xxxx/xxxx/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.87 Safari/537.36" "1.2.3.4, 10.0.9.200"
```

## Varnishの設定

Varnish 4から、VarnishがX-Forwarded-ForにELBのIPを追加するらしい。
なので、Varnish側でX-Forwarded-Forからアクセス元IP(先頭のIP)を抜き出す必要がある。

```default.vcl
sub vcl_recv {
  set req.http.X-Forwarded-For = regsub(req.http.X-Forwarded-For, "^([^,]+),?.*$", "\1");
}
```

こうすると、ELBのIPは排除されて、nginx側でクライアントIPが無事出力される。

```
1.2.3.4- - [17/Mar/2016:14:04:26 +0900] "GET / HTTP/1.0" 200 0 "http://xxxx/xxxx/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.87 Safari/537.36" "1.2.3.4"
```

## Varnish参考記事

- http://techblog.lclco.com/entry/2016/03/01/083235
- http://qiita.com/koudaiii/items/6a0efa024842cd48e2fb
- http://qiita.com/TsuyoshiUshio@github/items/e3902d33e3867368e695
スルーホール用テストワイヤー


マイコンやモジュールの穴(スルーホール)にハンダでピンヘッダなどを実装したくは無いけど、挙動確認のために通電したいということありますよね。

今まではワニクリップでどうにかやりくりしていたんですが、それ用のテストワイヤーあるよ、と教えて貰ったので購入。

これは便利だ〜。

![20160321-DSC04911.jpg](https://qiita-image-store.s3.amazonaws.com/0/5330/45e57067-bcd5-7aed-7514-5850ee64d3ad.jpeg "20160321-DSC04911.jpg")

![20160321-DSC04914.jpg](https://qiita-image-store.s3.amazonaws.com/0/5330/ed64b1d8-5488-9f3a-1a2e-0482cfa67330.jpeg "20160321-DSC04914.jpg")


- [スルホール用テストワイヤ　ＴＰ－２００](http://akizukidenshi.com/catalog/g/gC-09830/)



「テスト スルーホール」でググるとこれ以外にもそれっぽい商品がいくつも出てきます。そもそもの知識が足りないと検索キーワードすら思いつかない罠…。(今回はスルーホールという言葉が浮かんでこなかった)
Apex でズンドコキヨシDFA作った

Qiiteを眺めていたら、Apexで[ズンドコキヨシまとめ](http://qiita.com/shunsugai@github/items/971a15461de29563bf90)に参加されている方がいらっしゃったので便乗します！

[ズンドコ with Apex](http://qiita.com/sho7650/items/fb4d131748c6caa3d07e) by [@sho7650](http://qiita.com/sho7650)


#言語解析的にDFAで

コンパイラを作っていた時の知識が役にたちました。
`ズン`と`ドコ`のトークンによって状態遷移していくDFAを作成する事で、現在の状態の把握と次の状態の取得を簡略化しています。

ちなみに再帰関数バージョンは Tail Recursion になっているので、ループでの実行にした方が良いと思われ。キヨシより先にスタックオーバーフローが来るかも！


```java:ZunDokoKiyoshi.apxc
public class ZunDokoKiyoshi {
    public Enum ZDState {Z, ZZ, ZZZ, ZZZZ, ZZZZD}
    public static Map<Set<Object>, ZDState> dfa = new Map<Set<Object>, ZDState>{ 
        new Set<Object>{null,         'ズン'} => ZDState.Z,
        new Set<Object>{ZDState.Z,    'ズン'} => ZDState.ZZ, 
        new Set<Object>{ZDState.ZZ,   'ズン'} => ZDState.ZZZ,
        new Set<Object>{ZDState.ZZZ,  'ズン'} => ZDState.ZZZZ, 
        new Set<Object>{ZDState.ZZZZ, 'ドコ'} => ZDState.ZZZZD
    };

    // 再帰関数バージョン         
    public static void zundokoRecursion(ZDState state){
        if(state == ZDState.ZZZZD){
            System.debug('キ・ヨ・シ！');
        } else {
            String token = Math.random() > 0.5 ? 'ズン' : 'ドコ';
            System.debug(token);
            zundokoRecursion(dfa.get(new Set<Object>{state, token}));
        }
    }             
    
    // ループバージョン
    public static void zundokoLoop(){
        for(ZDState state = null; state != ZDState.ZZZZD;){
            String token = Math.random() > 0.5 ? 'ズン' : 'ドコ';
            System.debug(token);
            state = dfa.get(new Set<Object>{state, token});
        }
        System.debug('キ・ヨ・シ！');
    } 

}
```

#実行結果

###再帰関数バージョン
<img width="867" alt="スクリーンショット 2016-03-21 20.48.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/26378/9b728aee-519a-d6c6-fe83-c5abda8da4d0.png">



###ループバージョン
<img width="852" alt="スクリーンショット 2016-03-21 20.47.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/26378/5e22d695-758c-3453-05e0-ed20f149b89e.png">
任意のフォントを使ってDocker上でサイトのスクリーンショットを取りたい

### 目的　Docker上で任意のフォントを使ってサイトのスクリーンショットを取りたい　プラス　テストしたい
スクリーンショットをとるまでの記事はあるが、任意のフォントを設定するまでやっている記事は日本語では見当たらなかったので書いてみました。

すべてのソースはこちらにあります https://github.com/frkwy/xvfb_screenshot_on_docker

今回使用するフォントと文章は
[女子高生風？の可愛い極細フォント「JKゴシックL」のダウンロード ｜ ふぉんときゅーとがーる](http://font.cutegirl.jp/jk-font-light.html)
[青空文庫 夏目漱石 吾輩は猫である] (http://www.aozora.gr.jp/cards/000148/card789.html)
を使用させていただきました。

### フォントの確認と優先順位の確認
使用したいフォントの優先順位をあげれば解決します。
`fc-list`: フォント一覧　ここにない場合はフォントがインストールされてません
今回はFirefoxなので
`fc-match -s sarif` とか実行したときに使用したいフォントが一番上にきていればOKなので、
そのためにfont.confを作成していきます。



###Dockerfile

```
FROM alpine:latest

COPY fonts.conf /root/.config/fontconfig/
# Please override your favorite font file path
COPY JKG-L_3.ttf /root/.local/share/fonts/

RUN apk update && apk add python3 xvfb firefox dbus && rm -rf /var/cache/apk/*
RUN python3 -m ensurepip
RUN pip3 install --upgrade pip selenium xvfbwrapper

RUN fc-cache -fv

CMD ["python3", "/host/example.py"]
```


###font.conf
上のDockerfileですでにフォントはインストールしてある想定で、
使用したいフォントの優先順位を `binding="strong"`で一番上に持ってきます。

```
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
   <match target="pattern">
        <edit name="family" mode="assign" binding="strong">
           <string>JKゴシックL</string>
        </edit>
    </match>
</fontconfig>
```



実際に撮影したスクリーンショットです。
![Screenshot_from_2016-03-21 20:30:14.png](https://qiita-image-store.s3.amazonaws.com/0/95474/ff21fb68-6433-e0cb-fc03-9197fdb83891.png)
[GitHub] ディスカッションのコメントをすべて開く

# TL;DR
以下のブックマークレットを作っておけば、ポチるだけでGitHubのディスカッションがすべて開く。

```js
javascript:Array.prototype.forEach.call(document.querySelectorAll('.discussion-item-body'), function(node) { node.style.display = 'block' });
```

追記：
Chromeのエクステンション、いつのバージョンからか署名が必要になっていたり面倒になったので、ブックマークレットという素敵な解決手段を思いつきました。（なぜ最初からこれにしなかった）

# 概要
普段、GitHubを使用して開発・コードレビューをしているのですが、
困ったことにコメントしたディスカッションが勝手に閉じてしまったりします。

![Kobito.fz0a5N.png](https://qiita-image-store.s3.amazonaws.com/0/29653/e92eb96c-7ed0-407f-a72d-4f3bfb464d3a.png "Kobito.fz0a5N.png")

こんな風に。
![Kobito.uTDPdz.png](https://qiita-image-store.s3.amazonaws.com/0/29653/4afc05a6-3a71-0e85-2952-ee86a9dc91de.png "Kobito.uTDPdz.png")

クリックすれば開けるのですが、 **数が多くなってくると全部クリックして開くのはさすがに面倒** です。

GitHubの仕様なのでしょうけれど、これによって **せっかく指摘としてコメントしたのに見逃されて修正されない** という事が起こりました。 **それも何度も。**

そして他のチームにも話を聞いてみると、どうやら面倒だと思っているのは **私達のチームだけではない** ことが分かりました。

# 全部パカッと開く
ということでパカっと開くJavaScriptを書きました。

```js
$('.discussion-item-body').show();
```

ブラウザのデバッグコンソールから実行することで全部パカっと開いてくれます。

MacのChromeだと`Command + Option + I`で開発者ツールを開いて、以下の様な感じです。
![Kobito.Jx0pBI.png](https://qiita-image-store.s3.amazonaws.com/0/29653/1d49781e-20bf-5e4e-8b5d-2f0c2fc31c85.png "Kobito.Jx0pBI.png")

# UserScriptで専用ボタンを配置する
毎回コンソールから叩いても良いのですが、面倒なのでボタンを配置してみます。

以下のソースを`GitHubHelper.user.js`みたいな名前で保存して、Extensionに追加します。
（Firefoxであれば、`greasemonkey`でしょうか）

```js
// ==UserScript==
// @name        GitHub Helper
// @namespace   Yusuke.Hosonuma
// @description GitHubのコメントを全て開くボタンを追加
// @match       https://github.com/*
// ==/UserScript==
(function(){
  var target = document.getElementsByClassName('gh-header-actions');
  var button = document.createElement('button');
  button.innerHTML = 'Expand';
  button.className = 'btn btn-sm';
  button.addEventListener('click', function(event){
    var items = document.getElementsByClassName('discussion-item-body');
    for (var i=0; i< items.length; i++){
      items[i].style.display = 'block';
    }
  });
  target[0].appendChild(button);
})();

```

そうすると、以下のように「Expand」ボタンが追加されるのでクリックするだけで開けるようになります。
![expand.png](https://qiita-image-store.s3.amazonaws.com/0/29653/f4b403f5-98a5-8fc9-57c5-3353ce40cdda.png "expand.png")

# 最後に
まぁ、これだけなのですが。

しかし、日々の開発でちょっとした手間を省くことで、生産性や品質が上がったりするのだと思います。
（これにモチベーションを加えても良いでしょう）

ちなみにGitHubのDOM構造に依存しているので、
ページのUIが変更された場合などは動作しなくなると思うので悪しからず。
GKEでkubectlでサーバとの通信エラーになる時の対処方法


備忘録。

下記で、kubectlを使えるようにしました。
https://cloud.google.com/container-engine/docs/before-you-begin?hl=ja


しかし、下記のようなエラーが出ます。

```
$ kubectl version
Client Version: version.Info{Major:"1", Minor:"1", GitVersion:"v1.1.7", GitCommit:"e4e6878293a339e4087dae684647c9e53f1cf9f0", GitTreeState:"clean"}
error: couldn't read version from server: the server does not allow access to the requested resource

```

```
$ cloud container clusters get-credentials cluster-1
ERROR: (gcloud.container.clusters.get-credentials) invalid_grant
```

調べたところ結局、google cloudへの認証を未実施な事が原因でした。。。
下記を実施しました。

```
$ gcloud auth login
```

その後、下記のように通信できるようになりました。

```
$ kubectl version
Client Version: version.Info{Major:"1", Minor:"1", GitVersion:"v1.1.7", GitCommit:"e4e6878293a339e4087dae684647c9e53f1cf9f0", GitTreeState:"clean"}
Server Version: version.Info{Major:"1", Minor:"2", GitVersion:"v1.2.0", GitCommit:"5cb86ee022267586db386f62781338b0483733b3", GitTreeState:"clean"}
```

```
$ cloud container clusters get-credentials cluster-1
Fetching cluster endpoint and auth data.
kubeconfig entry generated for cluster-1.
```

以上

# 参考
https://cloud.google.com/container-engine/docs/troubleshooting
rails-apiを試してみた


rails5の --api とは少し違うみたいだけど
gemのrails-apiを試してみました。

先ずは
```gem install rails-api```
します。

次に適当に
```$ rails-api new sample_api```
します。
```
create
  create  README.rdoc
  create  Rakefile
  create  config.ru
  create  .gitignore
  create  Gemfile
  create  app
  create  app/controllers/application_controller.rb
  create  app/assets/images/.keep
  create  app/mailers/.keep
  create  app/models/.keep
  create  app/controllers/concerns/.keep
  create  app/models/concerns/.keep
  create  bin
  create  bin/bundle
  create  bin/rails
  create  bin/rake
  create  bin/setup
  create  config
  create  config/routes.rb
  create  config/application.rb
  create  config/environment.rb
  create  config/secrets.yml
  create  config/environments
  create  config/environments/development.rb
  create  config/environments/production.rb
  create  config/environments/test.rb
  create  config/initializers
  create  config/initializers/filter_parameter_logging.rb
  create  config/initializers/secret_token.rb
  create  config/initializers/wrap_parameters.rb
  create  config/locales
  create  config/locales/en.yml
  create  config/boot.rb
  create  config/database.yml
  create  db
  create  db/seeds.rb
  create  lib
  create  lib/tasks
  create  lib/tasks/.keep
  create  lib/assets
  create  lib/assets/.keep
  create  log
  create  log/.keep
  create  public
  create  public/404.html
  create  public/422.html
  create  public/500.html
  create  public/favicon.ico
  create  public/robots.txt
  create  test/fixtures
  create  test/fixtures/.keep
  create  test/controllers
  create  test/controllers/.keep
  create  test/mailers
  create  test/mailers/.keep
  create  test/models
  create  test/models/.keep
  create  test/helpers
  create  test/helpers/.keep
  create  test/integration
  create  test/integration/.keep
  create  test/test_helper.rb
     run  bundle install
	...
```
おお、
stylesheetsとかviewが生成されていない。

適当にmodel作ります。

```
$ cd sample_api
$ bin/rails g model User name:string
$ rake db:migrate
```

次、controller。
バージョンで管理できるようにディレクトリ作ります。
```$ bin/rails g controller api/v1/users ```

```app>controllers>api>v1>users_controller.rb
class Api::V1::UsersController < ApplicationController
  def index
    @users = User.all
    render json: @users
  end
end
```

次、

```app>config>routse.rb
Rails.application.routes.draw do
  namespace :api, {format: 'json'} do
    namespace :v1 do
      resources :users
    end
  end
end
``` 

確認用にseedでサンプルデータ作ります。

```db>seeds.rb
User.create([
  {name: "mammosu まんもす"},
  {name: "Mam Mosu"},
  {name: "ま んもす"}
  ])
```
```
$ rake db:seed
```

```
$ rails server
```
ブラウザでhttp://localhost:3000/api/v1/users
もしくはターミナルで
```
curl "http://localhost:3000/api/v1/users" -X GET
```
で出来ました。

余計な物が出来無いんですっきりですね。

rails5楽しみです。


### 参考

- [Rails5で取り込まれる予定のrails-apiを使ってWeb APIをつくる](http://octworks.orz.hm/wordpress/rails-api_sample/)
HTMLのテンプレート（作業用）

週1度くらいの頻度で、JavaScriptやCSSを一部分だけ切り取り、
簡単なHTML画面を作って動かそうとする機会があります。
（ほぼ、うまく動かなくて原因潰している時ですが。。）

毎回定型文を、とほほや、リファレンスに駆け込んで
コピペしていました。以下に記載しておきたいと存じます。

**HTMLテンプレート**

```HTML
<!DOCTYPE html>
<html lang=“ja”>
 <head>
  <meta http-equiv="content-language" content="ja">
  <meta name="robots" content="noindex,nofollow">
  <meta charset="UTF-8">
  <title>HTML5サンプル</title>
  <style type="text/css">
   font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Hiragino Kaku Gothic ProN', 'メイリオ', meiryo, sans-serif;
  </style>
 </head>
 <body>
 </body>
</html>
```
もはやセンター試験で採用されてもおかしくないくらいの問題をTexShopで作ってみた

![math1.jpg](https://qiita-image-store.s3.amazonaws.com/0/96536/06eb087b-5753-2718-38f7-16cd74f46bd7.jpeg)
![math2.jpg](https://qiita-image-store.s3.amazonaws.com/0/96536/4e38bdd3-5fa3-12bf-e3d4-3780c35b9668.jpeg)
![math3.jpg](https://qiita-image-store.s3.amazonaws.com/0/96536/5f41413e-b988-ea9a-45f2-8bd8dbd93208.jpeg)
タイトルでは大きく出ましたが大したことはありません。2010年追試を元にして少し前に作ったものがあったので単なるメモです。マーク式の試験を作るっていうのをやってみました。これを見かけた高校生は解いてみるのだ！

※「¥」はエディタの置換機能なんかで「\」に直して使ってください

```Tex:math.tex
¥documentclass[a4paper, 12pt]{jsarticle}
¥usepackage{comment}
¥pagestyle{empty}
 
¥begin{document}

$x ¥geq 0$の範囲における関数$y=-x^2$のグラフを$C_{1}$、$x ¥leq 0$の範囲における関数$y= ¥displaystyle ¥frac{1}{2}x^2$のグラフを$C_{2}$とする。
実数$a$は$0<a ¥leq 1$の範囲にあるとし、$C_{1}$上の点Pの$x$座標は$a$であるとする。¥¥¥¥
点Pで$C_{1}$に接する直線$l_{1}$の方程式は
¥[ y= ¥fbox{アイウ}x+¥fbox{エ}^{¥ ¥scriptsize ¥fbox{オ}} ¥]
であり、$l_{1}$と$C_{2}$との交点をQ(X$_{1}$, Y$_{1}$)とすると、
¥[ {¥rm X_{1}} = - ¥left( ¥fbox{カ} + ¥sqrt{¥fbox{キ}} ¥right)a ¥]
¥[ {¥rm Y_{1}} =  ¥left( ¥fbox{ク} + ¥fbox{ケ} ¥sqrt{¥fbox{コ}} ¥right) a^2 ¥]
である。¥¥
$C_{2}$の接線のうち、$l_{1}$と平行であるものを$l_{2}$とすると、$l_{2}$と$C_{2}$との接点Rの座標は
¥[ {¥rm R} ¥left(¥fbox{サシス}, ¥fbox{セ}¥fbox{ソ}^{¥ ¥scriptsize ¥fbox{タ}} ¥right) ¥]
であり、$l_{2}$の方程式は
¥[  y= {¥setlength{¥fboxrule}{0.2pt} ¥fbox{アイウ}}x-¥fbox{チ}¥fbox{ツ}^{¥ ¥scriptsize ¥fbox{テ}} ¥]
である。
¥newpage
¥noindent $l_{2}$と$C_{1}$との交点をS(X$_{2}$, Y$_{2}$)とすると、
¥[ {¥rm X_{2}} = ¥left( ¥fbox{ト} + ¥sqrt{¥fbox{ナ}} ¥right)a ¥]
¥[ {¥rm Y_{2}} = - ¥left( ¥fbox{ニ} + ¥fbox{ヌ} ¥sqrt{¥fbox{ネ}} ¥right) a^2 ¥]
である。よって四角形PQRSの面積は
¥[ ¥displaystyle ¥frac{¥fbox{ノ} ¥sqrt{¥fbox{ハ}}}{¥fbox{ヒ}}  ¥left( ¥fbox{フ} + ¥sqrt{¥fbox{へ}} + ¥fbox{ホ} ¥sqrt{¥fbox{マ}}  ¥right) a^3 ¥]
となる。

¥newpage
¥noindent $l_{1}$と$C_{1}$、$C_{2}$で囲まれた部分の面積をA、$l_{2}$と$C_{1}$、$C_{2}$で囲まれた部分をBとするとき、
¥[ {¥rm A} = ¥left( ¥fbox{ミ} + ¥fbox{ム} ¥sqrt{¥fbox{メ}} ¥right) a^3 ¥]
¥[ {¥rm B} = ¥left( ¥fbox{モ} + ¥fbox{ヤ} ¥sqrt{¥fbox{ユ}} ¥right) a^3 ¥]
であるから、A$¥fbox{ヨ}$Bである。¥fbox{ヨ}については、当てはまるものを次の¥textcircled{¥scriptsize 0}〜¥textcircled{¥scriptsize 2}のうちから1つ選べ。
¥begin{displaymath}
¥textcircled{¥scriptsize 0} ¥ < ¥hspace{10mm}
¥textcircled{¥scriptsize 1} ¥ = ¥hspace{10mm}
¥textcircled{¥scriptsize 2} ¥ > ¥hspace{10mm}
¥end{displaymath}

¥end{document}
```
Gradleをもっと使いたい（ビルドをGradleに移行）

前記事で、LinuxにGradleを導入してJavaプロジェクトをビルドしました。今回は、既存のTomcat(JavaEE）のプロジェクトにGradleを適用したいと存じます。

#既存ビルドがやっていること
・コンパイル→Warファイルを作成して終了（環境へのデプロイは手動）
・環境ごとに設定ファイルに差異があるため、Mavenビルド時に差し替える

いずれは、リリースまで全て自動化したいとは思いますが
まずは現状のビルドをGradleに変えるところまで実施します。

#プロジェクト構成
現状の構成は以下のような形です
**ファイル階層**

```
gradle_war
｜ーenv
｜｜ーtest
｜｜｜ーapp.properties
｜｜ーproduction
｜｜｜-app.properties
｜ーsrc
```

WEB-INF/app.propertiesに設定内容を記載していて、環境ごとに差異があり、それぞれの環境向け設定ファイルは「env」以下の環境名ディレクトリに入っています。今回は、このプロジェクトにGradleを導入して、環境依存をファイル置き換えで解決するような、ビルドスクリプトを作成します。

#Gradleの導入
インストール手順は、[以前に書いたもの](http://qiita.com/kaikusakari/items/a3e5599b71bc9b3b8ba9)を参照してください。
プロジェクト直下に、build.gradle（ビルドスクリプト）を作成する。

**ファイル階層（ビルドスクリプト追加）**

```
gradle_war
｜ーbuild.gradle←追加
｜ーenv
｜｜ーtest
｜｜｜ーapp.properties
｜｜ーproduction
｜｜｜-app.properties
｜ーsrc
```

スクリプト内容は以下のようにしました
**ビルドスクリプト**

```groovy:test_gradle/buld.gradle
buildscript {
 //ビルドスクリプト中に必要なモジュールを、参照する先を指定する
 repositories {
  jcenter()
 }

　　//ビルド時に必要なもの（依存関係）
 dependencies {
  classpath 'com.bmuschko:gradle-tomcat-plugin:2.0'
 }
}

apply plugin: 'war'
apply plugin: 'com.bmuschko.tomcat'
repositories {
 mavenCentral()
}

//APサーバは、Tomcatで動かすため、コンパイルでも同環境を指定する
dependencies {
 providedCompile 'javax:javaee-web-api:6.0'
 compile 'org.slf4j:slf4j-api:1.7.18'
 testCompile 'junit:junit:4.11'

 def tomcatVersion = '8.0.32'
 tomcat "org.apache.tomcat.embed:tomcat-embed-core:${tomcatVersion}",
         "org.apache.tomcat.embed:tomcat-embed-logging-juli:${tomcatVersion}"
 tomcat("org.apache.tomcat.embed:tomcat-embed-jasper:${tomcatVersion}") {
 　exclude group: 'org.eclipse.jdt.core.compiler',module: 'ecj'
 }
}

//warファイル作成時のみ、環境依存ファイルを差し替える処理
war {
 webInf{
  from("env/${env}/app.properties")
 }
}
```

**ビルドコマンド**

```sh
#プロジェクト直下に移動して
$ gradle -Penv=test(-Penv=production) build
```

ビルドコマンド時に、envという変数にtest/productionという文字列を渡しておき、warファイル作成時に、環境名のディレクトリから環境依存ファイルを取得して、WEB-INFディレクトリ以下にコピーするという動きとなります。Mavenで実施していることをそのまま書き写しただけですが、当初の目的である、MavenのビルドをGradleに置き換えました。
電子工作 > Link > OPアンプ > JRCの型名 > NJM / NJU / ...

秋月電子などでOPアンプを検索するとNJM, NJUなどのICがある。

３つめのMやUが気になるこの頃。

以下に説明があった。
http://www.njr.co.jp/products/semicon/related/ordering.html

> NJM ---- バイポーラIC
> NJW ---- Bi-CMOS IC
> NJU ---- C-MOS IC
> NJG ---- GaAs IC
> NJL ---- 光半導体素子
Goでnet/context.WithValueのKeyを他のパッケージと競合させない方法

goにはnet/contextという便利なパッケージがあり
これはgoroutineのキャンセル処理などを実装するのに便利な構造をしています。

トークンなどの値を持たせることもできてその値を設定する方法はKey/Valueでやるのですが

```go
ctx := context.WithValue("ip", "127.0.0.1")
```
という風にkeyを設定してしまうともしほかパッケージでも`ip`というKeyがあれば競合を起こしてしまいます。

で、どうやって競合を起こさせないようにするかというと
keyになる変数のアドレスをkeyにします。

```go
package ip

var ipKey string

func WithIP(ctx context.Context, ip string) context.Context {
  return context.WithValue(ctx, &ipKey, ip)
}

func FromContext(ctx context.Context) string {
  if v, ok := ctx.Value(&ipKey).(string); ok {
    return v
  }
  return ""
}
```
[ServersMan@VPS]CentOS7でPHP-FPMが使えない


ServersMan@VPSのCentOS7で、「Nginx + PHP-FPM」の構成で、サイトを公開しようとしたところ、「PHP-FPM」がインストール出来なかったというお話です。

## 環境
ServersMan@VPS Entryプラン
CentOS 7
PHP 5.6.19 (remi-php56レポジトリよりインストール済み)

## 原因
「PHP-FPM」がインストール出来ないのは、依存関係にある「initscripts」がアップデートできないため。

なお、「initscripts」をアップデートしてしまうと、サーバにアクセス出来なくなってしまう。(ServersMan@VPSの問題)
参照：[CentOS7 yum update 後、VPSサーバーにアクセスができなくなった- 　FAQ | 会員サポート：ユビキタスプロバイダ　DTI](http://www-wp.dream.jp/search.php/?p=23141)

## やったこと

```bash:bash
[root@dti-vps ~]# yum install --enablerepo=remi-php56 php-fpm
読み込んだプラグイン:fastestmirror
Loading mirror speeds from cached hostfile
 * base: ftp.iij.ad.jp
 * extras: ftp.iij.ad.jp
 * remi-php56: remi.kazukioishi.net
 * updates: ftp.iij.ad.jp
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> パッケージ php-fpm.x86_64 0:5.6.19-1.el7.remi を インストール
--> 依存性の処理をしています: libsystemd.so.0(LIBSYSTEMD_209)(64bit) のパッケージ: php-fpm-5.6.19-1.el7.remi.x86_64
--> 依存性の処理をしています: libsystemd.so.0()(64bit) のパッケージ: php-fpm-5.6.19-1.el7.remi.x86_64
--> トランザクションの確認を実行しています。
---> パッケージ systemd-libs.x86_64 0:208-11.el7_0.2 を 更新
--> 依存性の処理をしています: systemd-libs = 208-11.el7_0.2 のパッケージ: systemd-208-11.el7_0.2.x86_64
---> パッケージ systemd-libs.x86_64 0:219-19.el7_2.4 を アップデート
--> トランザクションの確認を実行しています。
---> パッケージ systemd.x86_64 0:208-11.el7_0.2 を 更新
--> 依存性の処理をしています: systemd = 208-11.el7_0.2 のパッケージ: systemd-sysv-208-11.el7_0.2.x86_64
---> パッケージ systemd.x86_64 0:219-19.el7_2.4 を アップデート
--> 依存性の処理をしています: kmod >= 18-4 のパッケージ: systemd-219-19.el7_2.4.x86_64
--> トランザクションの確認を実行しています。
---> パッケージ kmod.x86_64 0:14-9.el7 を 更新
---> パッケージ kmod.x86_64 0:20-5.el7 を アップデート
--> 依存性の処理をしています: dracut のパッケージ: kmod-20-5.el7.x86_64
---> パッケージ systemd-sysv.x86_64 0:208-11.el7_0.2 を 更新
---> パッケージ systemd-sysv.x86_64 0:219-19.el7_2.4 を アップデート
--> トランザクションの確認を実行しています。
---> パッケージ dracut.x86_64 0:033-360.el7_2 を インストール
--> 依存性の処理をしています: kpartx のパッケージ: dracut-033-360.el7_2.x86_64
--> 依存性の処理をしています: hardlink のパッケージ: dracut-033-360.el7_2.x86_64
--> トランザクションの確認を実行しています。
---> パッケージ hardlink.x86_64 1:1.0-19.el7 を インストール
---> パッケージ kpartx.x86_64 0:0.4.9-85.el7 を インストール
--> 衝突を処理しています: systemd-219-19.el7_2.4.x86_64 は initscripts < 9.49.28-1 と衝突しています
--> 依存性解決を終了しました。
エラー: systemd conflicts with initscripts-9.49.17-1.el7_0.1.x86_64
 問題を回避するために --skip-broken を用いることができます。
 これらを試行できます: rpm -Va --nofiles --nodigest
```

どうやら「initscripts」のバージョンが古いようです。

ということ、アップデートしてみます。

```bash:bash
[root@dti-vps ~]# yum update initscripts
読み込んだプラグイン:fastestmirror
Loading mirror speeds from cached hostfile
 * base: ftp.iij.ad.jp
 * extras: ftp.iij.ad.jp
 * updates: ftp.iij.ad.jp
No packages marked for update
```

アップデートが見つかりませんでした。

Googleで検索してみると、上で記載した記事を発見しました。
[CentOS7 yum update 後、VPSサーバーにアクセスができなくなった- 　FAQ | 会員サポート：ユビキタスプロバイダ　DTI](http://www-wp.dream.jp/search.php/?p=23141)

また、いろいろ探してみると、どうやら1年ほど前から発生している事象らしく、今なお対応されていないようです。（2016/03/21現在）
[Topic: CentOS7 での yum update | ServersMan@VPS コミュニティ | VPSの使い方 | 疑問・質問・解決方法 |](https://serversman-vps.com/?topic=centos7-での-yum-update)

現在、「initscripts」のバージョンは、"9.49.30"に更新されていますが、サーバにアクセスできなくなると非常に困るので、試していません。

そもそも、`yum update`が出来ないので、「ServersMan@VPS」で「CentOS7」を使用するのは、セキュリティ上、危険かも知れません。

せっかく安くて使えるサーバですので、早くご対応頂きたいものです。
rex0220 テーブルレイアウト設定プラグイン(販売停止)

開発時に使えるプラグイン第二弾です。
フィールドコード設定プラグインを開発時に、API の説明ページを調べていたら、フォーム設定 API で、「テーブルに設定するフィールドと、それらの順番」の変更が出来ることを見つけました。

標準のフォーム編集画面では、既存のテーブルにある項目の位置を変更できません。
後から位置を変えたくても、項目の作り直しをするしかなく、入力済みのデータが消えてしまいます。

早速、このAPI を使って、プラグインを作ってみました。
これで、簡単にサブテーブルの項目位置設定ができます。
デザイン画面では、変更できない既存のサブテーブルを変更出来ます。

![layout01.png](https://qiita-image-store.s3.amazonaws.com/0/100572/0a67251c-7352-157d-7f95-9f6b37094427.png)

#変更手順

- 対象サブテーブルを選択
- 変更したい項目の番号欄をドラッグして、位置を変更
- ※「並びを戻す」ボタンで、表示中のサブテーブルの全項目が戻る
- 「保存する」ボタンをクリック

![layout02.png](https://qiita-image-store.s3.amazonaws.com/0/100572/0d21ea9c-dd15-99ea-f810-ac6bed1dac5c.png)

#フォームの編集画面で確認

項目の位置が変更されました

![layout03.png](https://qiita-image-store.s3.amazonaws.com/0/100572/a21fa903-5ce9-51ff-68bc-00c8ac52d379.png)

#詳細画面で確認

項目の位置が変更され、データはそのままです。

![layout04.png](https://qiita-image-store.s3.amazonaws.com/0/100572/131176e1-4dda-446b-25c6-3fc81e06407d.png)

#テーブルレイアウト設定プラグインの追加

![layout05.png](https://qiita-image-store.s3.amazonaws.com/0/100572/8be4a997-78a1-cf50-5749-b524c4a0a919.png)

#注意事項

- 念のため事前に、データのバックアップを取ってから、テーブルレイアウト変更を行ってください。
- テーブルレイアウト変更後は、「テーブルレイアウト設定プラグイン」をアプリ設定から削除してもかまいません。
fish shellの起動が遅くなった時の解決方法


# TL;DR
- fish shellの起動に3〜4秒ぐらいかかるようになった。
- `config.fish`の`$fish_user_paths`の設定方法に問題があった。
- この問題の原因と解決方法をまとめた。

# 何が起きたか
- fish shellを起動してコマンドが入力できるようになるまで、3〜4秒かかっていた。
- iTermでタブを開いたり、tmuxでタブを開いても同様の時間がかかっていた。
- 作業効率がめちゃくちゃ落ちていた。

## 環境
- OS X (El Capitan) 10.11.3
- fish, version 2.2.0

# 原因
fish shellのGitHubに同じ問題についてissueが上がっていた。
https://github.com/fish-shell/fish-shell/issues/2688

> In general there should be no set -U lines in config.fish. [#2005](https://github.com/fish-shell/fish-shell/issues/2005) tracks warning for this case.
>
The reason is that set -U calls create variables that persistently remember their values, so running set -U fish_user_paths $fish_user_paths /opt/bin on each launch just make $fish_user_paths longer and longer.

#### 意訳
> 一般的にconfig.fish内では`set -U`を使うべきではない。[#2005](https://github.com/fish-shell/fish-shell/issues/2005) ではこのケースのワーニングについて動きを追っている。
`set -U`すると永続的に保存される変数が作られる。毎回起動時に`$fish_user_paths`はどんどん長ってしまう。

肥大化した `$fish_user_paths` を引き継いだまま新しい `$fish_user_paths` を作ろうとするため、起動に時間がかかってしまう。

# 解決方法
`config.fish` に書かれている一番最初の `set -U` 第3引数を消す。

```
# before
set -U fish_user_paths /usr/local/bin $fish_user_paths
set -U fish_user_paths ~/.rbenv/shims $fish_user_paths

# after
set -U fish_user_paths /usr/local/bin
set -U fish_user_paths ~/.rbenv/shims $fish_user_paths
```

### 意味

```
set -U fish_user_paths /usr/local/bin $fish_user_paths
```

これは`$fish_user_paths` の頭に `/user/local/bin` を追加して `fish_user_paths` という変数を作るという意味。
`$fish_user_paths`の前回のデータの頭に新しいデータが追加されるため、起動の度に`$fish_user_paths`はどんどん大きくなってしまう。

```
set -U fish_user_paths /usr/local/bin
```

第3引数を消せば、`fish_user_paths` は `/user/local/bin` で毎回初期化されるため、`$fish_user_paths` は肥大化しない。


# ちなみに
今回の問題はEl Capitanで発生したが、Yosemiteでは同じ原因でfishが起動できないという問題があった。
https://github.com/fish-shell/fish-shell/issues/2005

このissueで下記のようなコメントがあるため、El Capitanでの問題もfishのv2.3では改善されるかもしれない。
https://github.com/fish-shell/fish-shell/issues/2005#issuecomment-192891400
> This probably won't happen for 2.3.
Eclipse Mars.2で既存プロジェクトをDynamic Web Projectに変更する方法

#1. はじめに
Eclipse Mars.2にて，既存プロジェクトをDynamic Web Projectに変更する方法のメモ．
たぶん別のバージョンでも同じようにできる．

#2. 環境
Windows 8
Eclipse Mars.2 (4.5.2)

#3. 変更方法
##3.1　Project Facetsを設定
プロジェクトを右クリックし，`Properties`を選択．
ポップアップウインドウから，`Project Facets`を選択し，`Convert to faceted from...`をクリック．
[もしProject Facetsがなかったら](#32-%E3%82%82%E3%81%97project-facets%E3%81%8C%E3%81%AA%E3%81%8B%E3%81%A3%E3%81%9F%E3%82%89)

![image](https://qiita-image-store.s3.amazonaws.com/0/71593/780b46e0-b0ca-4dbf-e998-924882d6ea69.png)

`Dynamic Web Module` にチェックを入れ，OKをクリックし，完了．

![image](https://qiita-image-store.s3.amazonaws.com/0/71593/fc5774eb-52a0-94bb-e345-4686cea42eb6.png)

##3.2 もしProject Facetsがなかったら
ウィンドウの中に`Project Facets`という項目がない場合，プラグインをインストールする必要がある．

1. `[Help] -> [Install New Software]`を選択
2. `Woek with:` 欄の右側にある`[Add]`ボタンをクリック
3. `Add Repository`ウインドウの`Location:`に` http://download.eclipse.org/webtools/repository/mars`と入力（Eclipse Marsの場合）．`Name:`は適当な名前でOK．
4. 以下のような項目が出るので，`Web Tools Platform (WTP)`と`Web Tools Platform SDK (WTP SDK)`にチェックを入れて`[Next>]`をクリックし，流れに従ってインスコ(※)．バージョンはなんでもいいと思うが，今回は最新の3.7.2を選択した．

![image](https://qiita-image-store.s3.amazonaws.com/0/71593/1c9029f2-cb31-1fec-d899-d14e718593b5.png)


※実際は
・ Eclipse Java EE Developer Tools
・ Eclipse Java Web Developer Tools
・ Eclipse Web Developer Tools
・ Eclipse XML Editors and Tools
だけでOKっぽいが，面倒だったので全部インスコした．必要最小限だけインスコしたい方は`type filter text`で上記を検索してください．