OmniAICreator/Qiita-1.07M huggingface dataset:
SplunkをInstallしてみる

#splunkとは
splunkは様々なマシンデータを

- 集める
- 検索する
- 分析する
- ビジュアライズする

といった機能を提供するアプリケーションです。基本有料ですが、1日500MBまで、60日間、無料で使うことができます。
ユーザ登録をすれば、下記からダウンロード可能です。
https://www.splunk.com/ja_jp/download.html

#installしてみる
Mac用のinstall用のパッケージをダウンロードして、インストールしてみます。
パッケージは、linux,windows,macなど各OSごとに用意されています。

`tar zxvf splunk-6.6.2-4b804538c686-darwin-64.tgz -C /Applications/splunk_install/662/.`

これでインストールは完了です。

##起動
起動は下記のコマンドで実行します。
初回起動時だけ、licenseの承諾画面がでるので、--accept-licenses --answer-yesをつけています。

`/Applications/splunk_install/662/splunk/bin/splunk start --accept-license --answer-yes`


##ログインしてみる
splunkはwebinterfaceを8000ポートで起動させるので、ブラウザでlocalhost:8000にアクセスしてみます。

![Screen Shot 2017-07-13 at 1.33.36 PM.jpg](https://qiita-image-store.s3.amazonaws.com/0/190656/27525d8e-8ac9-b6c8-823a-8424552515c2.jpeg)

##データを入れてみる

1.せっかくなので、データをuploadして、検索してみます。
splunk社が提供しているサンプルデータがあるので、それをつかってみます。

http://docs.splunk.com/images/Tutorial/tutorialdata.zip

2.サンプルデータをダウンロード後、ホーム画面のAdd Dataをクリックします。

![Screen Shot 2017-07-13 at 1.36.14 PM.jpg](https://qiita-image-store.s3.amazonaws.com/0/190656/5ca3688c-e623-8943-b2f4-1708a553f52c.jpeg)

3.uploadを選択して、select fileからダウンロードしたzipファイルを選択します。

4.Input Settingsを選択します。
いくつか項目を入力する必要があるので、選択していきます。

![Screen Shot 2017-07-13 at 1.55.41 PM.jpg](https://qiita-image-store.s3.amazonaws.com/0/190656/dcc4c53e-8fdd-cc79-6d2a-6793cfdc290e.jpeg)


- sourcetype : 読み込みたいファイルの形式を選択します。Automaticを選ぶとsplunk側で自動で判断してくれます。csvならcsv、jsonならjsonといった形です。自分で選択したい場合は、selectを選択、特殊なformatの場合は、Newを選択して自分で作成します。(結構な数のsourcetypeがdefaultで用意されています)

今回はautomaticを選択します

![Screen Shot 2017-07-13 at 1.44.16 PM.jpg](https://qiita-image-store.s3.amazonaws.com/0/190656/1076d5ef-f76f-f399-2a7b-354b692f509b.jpeg)

- Host : どのhostからのデータかを定義する項目です。いくつか種類がありますが、今回はsegment in pathを選択します。segment in pathはフォルダの何階層目にhost名が入るかという情報なので、今回は1を設定します。

サンプルデータのフォルダ階層は/tutorialdata/www1(ホスト名）といった形になっていました。

- index : 取り込んだログなどのデータをindexという箱に格納するための設定項目です。今回はただのサンプルなので、とりあえずdefaultを選択します。`create new index`の箇所で新規にindexも作成できます。運用や、取り込むsourcetype、アクセスさせる人によってindexはわけたほうが良さそうです。

5.できたら、Nextボタンを押し進みます。取り込みが完了するとstart searchingの画面がでてくるのでstart searchingをクリックして早速検索してみます。

![Screen Shot 2017-07-13 at 1.53.44 PM.jpg](https://qiita-image-store.s3.amazonaws.com/0/190656/1143fc6a-88d8-11b7-7625-cfe779da05fe.jpeg)


![Screen Shot 2017-07-13 at 2.00.09 PM.jpg](https://qiita-image-store.s3.amazonaws.com/0/190656/fe38d31e-03cc-29c7-859c-9cffe4af6ad9.jpeg)

とりあえずこれで検索できるようになったので、いろんなデータをつかってみようと思います。
avfoundationを使って音声ファイルのトリミング 

# 説明

swift3を使って音声ファイルをトリミングしてみます。およそ４分程度の音声ファイルのうち５秒〜１５秒の間だけ切り取るところまでをやっていきます。AVFoundationは覚えることが多く、使い方も面倒臭く、リファレンスを読むだけでは掴みづらい感じがあります。なので良いソースコードを見つけていじるのが良いですね。下記に参照元を貼っておきます。

![10715a2dc086df6d3fa8aa37a4d5417d.png](https://qiita-image-store.s3.amazonaws.com/0/135794/d44fa722-3a48-6460-92a7-eb6563528eab.png)

# 実装

```swift

import UIKit
import AVFoundation


class ViewController: UIViewController {
    
    var asset: AVAsset?

    func createAudioFileFromAsset(_ asset: AVAsset){
        let documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0] as URL
        let filePath = documentsDirectory.appendingPathComponent("rendered-audio.m4a")
     if let exportSession = AVAssetExportSession(asset: asset, presetName: AVAssetExportPresetAppleM4A){
            exportSession.canPerformMultiplePassesOverSourceMediaData = true
            exportSession.outputURL = filePath
            exportSession.outputFileType = AVFileTypeAppleM4A
            exportSession.exportAsynchronously {
                _ in
                print("finished: \(filePath) :  \(exportSession.status.rawValue) ")
            }
        }
    }

    
    @IBAction func exportBtnDidTap(_ sender: Any) {
        guard let asset = asset else {
            return
        }
        createAudioFileFromAsset(asset)
    }

    
    override func viewDidLoad() {
        super.viewDidLoad()

        let audioAsset = AVURLAsset(url: Bundle.main.url(forResource: "LoveYourself", withExtension: "mp3")!)
        let comp = AVMutableComposition()
        let audioAssetSourceTrack = audioAsset.tracks(withMediaType: AVMediaTypeAudio).first! as AVAssetTrack
        let audioCompositionTrack = comp.addMutableTrack(withMediaType: AVMediaTypeAudio, preferredTrackID: kCMPersistentTrackID_Invalid)
        
        do {
            try audioCompositionTrack.insertTimeRange(
                CMTimeRangeMake(CMTimeMakeWithSeconds(5, 100000), CMTimeMakeWithSeconds(15, 100000)),
                of: audioAssetSourceTrack,
                at: kCMTimeZero)
        }
        catch { print(error) }
        asset = comp

    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
}

```


# 参考
[justinlevi/AVAssetExportSession_AVMutableComposition](https://github.com/justinlevi/AVAssetExportSession_AVMutableComposition)

[github](https://github.com/Ryosuke-Hujisawa/Trimming-audio-with-avfoundation)

[avfoundationを使って音声ファイルのトリミング](http://off.tokyo/blog/2017/07/13/avfoundation%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E9%9F%B3%E5%A3%B0%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E3%83%88%E3%83%AA%E3%83%9F%E3%83%B3%E3%82%B0/)
【FileMaker】違うテーブルのデータのみを切り替えて表示したい

「レイアウトの同じ場所に、区分が違うごとに表示を切り替えたい」
ということで、実装しました。

今回活躍する機能は、「条件によってオブジェクトを隠す」という動作の設定です。
早速、動きを見ていきましょう。

# 動き
複数の企業が同居しているマンションで、部屋ごとに契約している電力会社が違うケースです。
管理人さん、管理が大変ですね。

電力会社Aと契約している場合は、電力会社Aの明細書が表示されます。
<img width="468" alt="表示切り替え1.png" src="https://qiita-image-store.s3.amazonaws.com/0/60538/b69e640e-41e5-3e17-ca0a-4f1ee01e9c9a.png">

電力会社Bと契約している場合は、電力会社Bの明細書が表示されます。
<img width="814" alt="表示切り替え２.png" src="https://qiita-image-store.s3.amazonaws.com/0/60538/90139a21-65b5-b865-e1f3-71d4db0881cd.png">

# 実装
単純に電力会社のテーブルを一つにして、電力会社ごとに違うフィールドにデータを入力してお客様番号でリレーションした内容を表示する、というのもありなのですが、電力会社などは最近csvでデータを提供していることが多いので、インポートするときには、どのフィールドに当てればいいかが迷ったりします。

ので、今回は、インポートするのがメインということで、電力会社ごとにテーブルを作成しました。
<img width="542" alt="表示切り替え３.png" src="https://qiita-image-store.s3.amazonaws.com/0/60538/a04778b3-81f9-68cb-808b-1d3d925d1a04.png">

それぞれデータをインポートします。
電力会社Aの場合。
<img width="438" alt="表示切り替え４.png" src="https://qiita-image-store.s3.amazonaws.com/0/60538/e35447a0-844b-c7c9-a9cf-020d16638e4b.png">

電力会社Bの場合。
<img width="987" alt="表示切り替え５.png" src="https://qiita-image-store.s3.amazonaws.com/0/60538/f7a09cec-48b4-d3b3-c937-a29fd9f018e5.png">

電力会社ごとに、フォーマットが違いますが、お客様番号が共通しています。
マンションデータとは、お客様番号でデータを引っ張ってくることにしました。

レイアウトモードで見てみると、「電力会社A」「電力会社B」のタイトル部分の表示がちょっと変です。
<img width="838" alt="表示切り替え６.png" src="https://qiita-image-store.s3.amazonaws.com/0/60538/0dbb969c-c4d9-a868-c36e-6258568f2d09.png">

「お目目」マークが怪しいです。

マウスでちょっと移動させてみるとわかります。
<img width="855" alt="表示切り替え７.png" src="https://qiita-image-store.s3.amazonaws.com/0/60538/aabcf623-b12f-b200-885f-459a6d9b2d94.png">

なんと、タイトルとポータルツールは、重なっていたのです。（どーん）


タイトルとポータルツールの右下に表示されている「お目目マーク」、これは、何かしらの条件で隠されていますよ、というマークです。

例えば、「電力会社A」のタイトルとポータルツールは、電力会社区分が「電力会社B」のときに隠すようになっています。
<img width="751" alt="表示切り替え８.png" src="https://qiita-image-store.s3.amazonaws.com/0/60538/2adb29a9-5eaf-f20a-b5da-c689ba5193ff.png">

もう一つの「電力会社B」のタイトルとポータルツールは、電力会社区分が「電力会社A」のときに隠すようになっています。
<img width="811" alt="表示切り替え９.png" src="https://qiita-image-store.s3.amazonaws.com/0/60538/3452af92-6886-a16b-165d-7a55d4a84ac1.png">

一瞬、表を可変で実装しているのかと思いきや、表が重なっているだけです。
見た目のメリットはありますが、デメリットとして、編集する際に下になっているレイアウトがわかりづらいので、メンテナンス時には重なりをなくすということが最初のやることになる感じです。

実装には小細工が必要ですが、見た目的にスッキリしますので、やってみてくださいね。

では、FileMakerライフをお楽しみください。
アスペクト指向を簡単に調査。また、jsのメソッドへの処理の注入

アスペクト指向とは何か。Wikipediaを抜粋すると以下だ。

> アスペクト指向プログラミング（アスペクトしこうプログラミング、Aspect Oriented Programming、AOP）は、オブジェクト指向ではうまく分離できない特徴（クラス間を横断 (cross-cutting) するような機能）を「アスペクト」とみなし、アスペクト記述言語をもちいて分離して記述することでプログラムに柔軟性をもたせようとする試み。

個人な感想を言えば、処理が追えなくなるんじゃないの？という感想。

以下の記事も読んだ。
アスペクト指向プログラミング入門 http://postd.cc/intro-to-aop/

prototypeを使う頻度はめっきり減ったのは別として、はじめのPhoneクラスからあまりにひどいコードがでてきてちょっとビビる。
dialにlogなんて入れた瞬間に単体テストしづらくなるだけだろうに。この例だと依存がひどいだけで、単に処理を分散させて見づらくしただけに見える。

まあ、本筋ではないのでまとめると、どうやらAOPはある処理に対して前処理や後処理を後から機能を追加できるものと捉えれば良さそうだ。(ひどくいびつな捉え方であると言えるが、やっていることは似たようなものだ)

以下の記事も読んだ。
それにしても古い記事か飛ばし記事しかでないので、流行らなかったんだなという印象を受ける。

アスペクト指向プログラミングに関する十の神話
http://prg.is.titech.ac.jp/members/masuhara/papers/aop-myth.pdf

ここにある名前ベースの技術という指摘は尤もだと思う。

"ログを取るための技術だ"。たしかに、いくつか例も出てるが確かにログ以外に実際の利用は難しく思える。

以下の記事は、アスペクトまわりの用語がよくまとまっていてよかった。

[時代が来るかも？アスペクト指向プログラミング, AspectJ言語とは何か - Qiita](http://qiita.com/Kurowasi/items/70d8cb038ea59aa0faa1)

やはり、例がログだった。

ここまで見てきて思ったのが、基本的に静的型付けのための技術であるように思える。
動的言語なら、特定のメソッドの前後に処理を追加なんて数行でできるからだ。

JSで前処理と後処理を追加する例を書いてみる。

はじめに単純にhelloを出力するメソッドhelloを用意する。
もうprototypeなんて書く機会があまりないけど、上記のコードに倣ってちょっとes5で書いてみる。

```js
var A = function() {}
A.prototype.hello = function() {
  console.log('A: hello')
}

var a = new A()

a.hello()
// => A: hello
```

さて、この`A: hello`前後に処理を追加したい。
例なので`bofore`と`after`を出力する。

以下の関数を用意する。
jsは第1級関数がサポートされてるので、単に関数をコピーして、前後に処理を挟んでやればいい。

```js
function injectBeforeAfter(name, func) {
  if (func.prototype[name]) {
    var fn = func.prototype[name]
    func.prototype[name] = function() {
      console.log('before')
      fn.apply(func, arguments)
      console.log('after\n')
    }
  }
}
```

あとは、クラス`A`を渡せば`hello`の呼び出しの前後に処理を注入できる。

```js
var injectHello = injectBeforeAfter.bind(null, 'hello')

injectHello(A)

var a = new A()
a.hello()
//=> before
//=> A: hello
//=> after
```

引数も渡せる。

```js
var B = function() {}
B.prototype.hello = function(user) {
  console.log('B: hello', user)
}

injectHello(B)
b.hello('山田')
//=> before
//=> B: hello 山田
//=> after
```

結局のところ、名前ベースであるところが一番ネックだなと思った。
この記事含めて2時間ぐらいしか調査してないので、何か間違いがあったらコメントまでお願いします。
rackとpuma

# rackとpumaに関して
Rack仕様で実装したアプリはRack対応のサーバで運用することができる。

# 使い方

```
$ bundle install --path=./vendor/bundler
$ bundle exec ruby 01_rack_app.rb
$ bundle exec rackup 02_config.ru
$ bundle exec rackup 02_config.ru -s WEBrick -o 0.0.0.0 -p 8000
$ bundle exec rackup 02_config.ru -s puma -o 0.0.0.0 -p 8000
$ bundle exec pumactl -F 03_config.rb start                                                   
Puma starting in single mode...
* Version 3.9.1 (ruby 2.2.4-p230), codename: Private Caller
* Min threads: 0, max threads: 16
* Environment: development
* Daemonizing...
$ ls /tmp/ | grep puma
puma-status-1499925598625-15294
puma_sample.pid
puma_sample.state
$ bundle exec pumactl -F 03_config.rb status                                                  
Puma is started
$ bundle exec pumactl -F 03_config.rb stop                                                    
Command stop sent success
$ ls /tmp/ | grep puma
puma_sample.state
```

# Gemfile

```
source 'https://rubygems.org'

gem 'puma'
gem 'rack'
```

# 01_rack_app.rb

```ruby
require 'rack'
require 'rack/handler/puma'
app = Proc.new do |env|
  ['200', {'Content-Type' => 'text/html'}, ['hello rack']]
end
#Rack::Handler::WEBrick.run app, Port:8000
Rack::Handler::Puma.run app, Port:8000
```

# 02_config.ru

```ruby
app = Proc.new do |env|
  ['200', {'Content-Type' => 'text/html'}, ['hello rackup']]
end

run app
```

# 03_config.rb

```ruby
require "puma"

app do |env|
  [200, { 'Content-Type' => 'text/plain' }, ["hello pumactl"]]
end

daemonize true
port 8000
pidfile "/tmp/puma_sample.pid"
state_path "/tmp/puma_sample.state"

activate_control_app('auto', auth_token: "12345")
```
ExoPlayer2とりあえず動画を再生させる


## ExoPlayer2とりあえず動画を再生させる

```kotlin

private fun startVideo(playerView: TextureView) {
  val defaultBandwidthMeter: DefaultBandwidthMeter = DefaultBandwidthMeter()
  val videoTrackSelectionFactory: TrackSelection.Factory = AdaptiveVideoTrackSelection.Factory(defaultBandwidthMeter)
  val trackSelector: TrackSelector = DefaultTrackSelector(videoTrackSelectionFactory)
  val loadControl: LoadControl = DefaultLoadControl()
  val player = ExoPlayerFactory.newSimpleInstance(context, trackSelector, loadControl)
  val dataSourceFactory: DataSource.Factory = DefaultDataSourceFactory(context, defaultBandwidthMeter, DefaultHttpDataSourceFactory(System.getProperty("http.agent"), defaultBandwidthMeter))
  val extractorsFactory: ExtractorsFactory = DefaultExtractorsFactory()
  val videoSource: MediaSource = ExtractorMediaSource(Uri.parse("http://www.ajisaba.net/motion/dnld.php?fpath=penguin.mp4"), dataSourceFactory, extractorsFactory, null, null)
  player.prepare(videoSource)
  player.setVideoTextureView(playerView)
  player.playWhenReady = true
}

```
こんなカンファレンスカメラマンは嫌だ！

### この内容は、特定の個人を攻撃しているわけではありません

----

### せっかくカンファレンスでカメラマンをやるのだから、必要とされるカメラマンを目指しましょう

----

### というわけで

----

# こんなカンファレンスカメラマンは嫌だ！

----

### に共通するいくつかの例を紹介します

----

# 1つめ

----

# 1. 撮るときにシャッター音がうるさいカメラマンは嫌だ

----

# 1. 撮るときにシャッター音がうるさいカメラマンは嫌だ
### ■ どうして？

数秒おきにカシャカシャ耳元でされると、話や内容に集中できないんですよね...

----

# 2つめ

----

# 2. 撮るときに持ち込みフラッシュが眩しすぎるカメラマンは嫌だ

----

# 2. 撮るときに持ち込みフラッシュが眩しすぎるカメラマンは嫌だ
### ■ どうして？

数秒おきに暗い部屋に眩しすぎる光が点滅しつづけるのってどうなの？目が痛いんですけど...

----

# 3つめ

----

# 3. 撮るときに立ち位置を気にしないカメラマンは嫌だ

----

# 3. 撮るときに立ち位置を気にしないカメラマンは嫌だ
### ■ どうして？

お金払って来ている参加者が、スライド見えないんですけど...

----

# 4つめ

----

# 4. 撮った写真が登壇者にピントがあたってないカメラマンは嫌だ

----

# 4. 撮った写真が登壇者にピントがあたってないカメラマンは嫌だ
### ■ どうして？

記事にも使えない、そんな写真どこで使うのさ...

----

# 5つめ

----

# 5. 撮った写真の水平線が揃ってないカメラマンは嫌だ

----

# 5. 撮った写真の水平線が揃ってないカメラマンは嫌だ
### ■ どうして？

中途半端に斜めの角度で撮られた写真は、後で水平線揃えるために回転させるのが面倒なんですよね...

----

# 6つめ

----

# 6. 撮った写真に写っている人の頭が見切れているカメラマンは嫌だ

----

# 6. 撮った写真に写っている人の頭が見切れているカメラマンは嫌だ
### ■ どうして？

後でトリミングすればいいので、せめて頭のてっぺんが切れてたり、体の端っこが切れてるのはやめてほしい...

----

# 7つめ

----

# 7. 主催者や開催者、登壇者や登壇者の所属組織が欲しい写真を把握しないで、テキトーに写真撮ればいいぐらいにしか考えてないカメラマンは嫌だ

----

# 7. 主催者や開催者、登壇者や登壇者の所属組織が欲しい写真を把握しないで、テキトーに写真撮ればいいぐらいにしか考えてないカメラマンは嫌だ
### ■ どうして？

顧客のニーズを把握、という工程をちゃんと踏んで欲しい。そもそもなぜカメラマンをわざわざ用意するのか。それは、どういう写真をどういうところで使いたいとか、いろいろと動機はあります...

----

# こんなカンファレンスカメラマンは嫌だ！

----

### せっかくカンファレンスでカメラマンをやるのだから、必要とされるカメラマンを目指しましょう

----

### ご清聴ありがとうございました！

----

### [PR]

----

### ほかにも、こんなカンファレンスカメラマンは嫌だ！というのがありましたら

----

### ぜひ、Qiita記事の編集リクエスト機能でフィードバックをください！

----

### 皆さまからのご意見・フィードバックをお待ちしております！
初心者だけどwebアプリを作りたい！

# javascriptをちょっとかじっただけのにわかでもwebアプリは作れるのか？:thinking:
ということでやってみようと思います。
作るのは某ゲームのガチャを無限に引いて遊ぶゲーム。
もちろんゲームデータへの干渉はしませんというかできません。
単純にボタンを押したらランダムにキャラの名前と自作イラスト（）が表示されるだけのものです。
技術的にもjavascriptだけで実装できますね。
続々と増えていくキャラの追加についてはおいおい考えていきましょう。

##　UI的なこと
1.スタート画面
↓
2.ガチャの種類を選ぶ
↓
3.ガチャを引く
↓
4.結果を表示
↓
5.3または2に戻る

という感じにしたいです。

で、スタート画面からの画面遷移はできました（ここまでもけっこうかかった）（初心者並の感想）
ここから先で問題発生。
ゲーム内で使うフォントは「ようじょフォント」にしたいと考えていました。
あの狂気じみた感じがいいんです。
ようじょフォント自体はwebフォントとしての利用は許可されているのでそちらは問題ありません。

問題はそのフォントをどこに上げるかです。
というのもここまで私はこのアプリをgasで書いていました（手を抜きたかった）（でも正直よけい手間がかかったと思っている）
ためしにGoogleDriveに上げてみましたがクロスドメインうんちゃらで怒られました。
こりゃだめだ。というかクロスドメイン問題がある以上他の直リンク可能なストレージに上げてもだめだ。

あとは無料のレンタルサーバーを借りるかですが（手慰みにお金かけたくない病気）
なんか…一昔前は乱立していた（気がする）無料レンタルサーバーも淘汰が進んでますね…

いろいろ見て回ってNetlifyを使うことにしました。
GitHubにpushすればそのままデプロイしてくれるのでアホでも使えそうです（この表現が正しいのかもわからないアホ）

しかしフォントデータをGitHubに上げるわけにはいかないので（無料アカウントだからね）ひとまずフォント以外のファイルでデプロイしたところで時間切れ。
続きは家に帰ってからです（出先でこれを書いています）

果たしてにわかは無事フォントデータをアップロードしてwebフォント導入ができるのか！！！

次回「GitHubもGUIから使ってますが何か」

[その２](http://qiita.com/violet2525/items/d3ce9aec89a765686018)
Lie-Trotter公式の打切り誤差を調べる

# はじめに

非可換な演算子$X, Y$について、以下のLie-Trotter公式が成り立つ[^name]。



```math
\exp(h(X+Y)) = \left( \exp(hX/n)\exp(hY/n) \right)^n + O\left(\frac{h^2}{n}\right)
```

ここで$h$はc数で、数値計算では時間刻みとして用いられることが多いので、以下は時間刻みと呼ぶ。$n$が分解数である。この打切り誤差をちゃんと確認してみよう、というのが本稿の趣旨。

ソースは
https://github.com/kaityo256/lie-trotter-sample
においてある。

2017年7月14日追記：
二次の対称分解も試せるようにするため、ソースを少し改変しています。詳細は次の記事[Lie-Trotter公式における二次の対称分解](http://qiita.com/kaityo256/items/1af80746913f1f17006d)を参照してください。

# スクリプトがやってることの解説

適当な$d$次元の正方行列$X$, $Y$を考える。固有値が実となるように対称行列にしておこう。$\exp(h(X+Y))$や$\exp(hX)$、$\exp(hY)$などを厳密に計算し、Lie-Trotter公式を使って誤差を計算する。誤差はフロベニウスノルムを使うことにする。

## 実対称行列を作る

まず、適当な$d$次元の対称行列をランダムに作る。

```py
import numpy as np
import math
from scipy import linalg

d = 2
np.random.seed(1)
x1 = np.random.rand(d,d)
x2 = np.random.rand(d,d)
X = x1.dot(x1.T)
Y = x2.dot(x2.T)
Z = X + Y
```

適当にランダムな行列作って、その転置をとったものとの積を$X$や$Y$にする。こうすれば対称行列になるために固有値が実となる。$X$と$Y$の和を$Z$としておこう。

## 行列指数関数の計算

行列を指定の時間刻み$h$で指数の肩に載せる関数を作る。そのためには、まず対角化する。

```math
X = U_x \Lambda_x U_x^{-1}
```

対角行列を指数関数の肩に載せるのは簡単なので

```math
\exp(h X) = U_x \exp(h \Lambda_x) U_x^{-1}
```

と計算することができる。これをPythonで書くとこんな感じ。

```py
def calc_exp(X, h):
    rx, Ux = linalg.eigh(X)
    Ux_inv = linalg.inv(Ux)
    tx = np.diag(np.array([math.exp(h * i) for i in rx]))
    eX = Ux.dot(tx.dot(Ux_inv))
    return eX
```

やってることを説明すると

*  対称行列を食わせるので`linalg.eigh`を呼ぶ
*  リストの内包表記で固有値のベクトルを指数関数の肩に載せる
*  それを`numpy.diag`で行列にする
* $U_x$や$U_x^{-1}$で元に戻す

という感じ。

## 指定の分解数トロッター分解

指定の時間刻みで行列指数関数の計算ができるようになれば後は簡単。例えば時間刻み$h$、分解数$n$の場合、まず$\exp( h X /n)$と$\exp( h Y /n)$を作る。あとはそれを単位行列に$n$回かけてやれば良い。

```py
    eX = calc_exp(X,h/n)
    eY = calc_exp(Y,h/n)
    S = np.diag(np.ones(d))
    eXeY = eX.dot(eY)
    for i in range(n):
        S = S.dot(eXeY)
```

こうしてできた近似行列$S$と、厳密な評価$\exp(h Z)$を比較する。ここではフロベニウスノルムで比較しよう。以上を全部まとめるとこんな感じの関数となる。

```py
def trotter(X,Y,Z,h,n):
    eZ = calc_exp(Z,h)
    eX = calc_exp(X,h/n)
    eY = calc_exp(Y,h/n)
    S = np.diag(np.ones(d))
    eXeY = eX.dot(eY)
    for i in range(n):
        S = S.dot(eXeY)
    return linalg.norm(eZ - S)/linalg.norm(eZ)
```

# 結果

二次元の場合で、$h$や$n$をいろいろ変えて打切り誤差がどうなるかを調べてみよう。

まず、打切り誤差の$h$依存性。$n$を1,2,4とし、それぞれについていろんな$h$の値で打切り誤差を評価する。

![h.png](https://qiita-image-store.s3.amazonaws.com/0/79744/5f2cb274-d198-03ca-639d-4ebb601a037c.png)


$n$の値に依らず誤差の$h$依存性が$(h^2)$であることがわかる。$n$が大きくなると誤差が減るが、これは$1/n$に比例する。$h=1.0$に固定し、様々な$n$について打切り誤差を評価してみる。

![n.png](https://qiita-image-store.s3.amazonaws.com/0/79744/706138fb-3750-35d4-e52a-3ab538981cbe.png)

確かに誤差が$O(1/n)$となっていることがわかる。

# まとめ

トロッター分解の打切り誤差を評価してみた。これまで$n=1$のケース$\exp(h (A+B)) \sim \exp(hA)\exp(hB)$を「一次の分解」と呼んでいたので、なんとなく誤差も$O(h)$だと思いこんでいたが、$n$の値によらず$O(h^2)$だったことをいまさら知った。

[^name]: この公式の名前について適当なことを言うと怖いおじさん達が来るかもしれない。とりあえず演算子が有界の場合はLie公式、有界でない場合はTrotter公式、これを使って経路積分をするアルゴリズムを鈴木・トロッター分解と言うらしい。筆者は単にトロッター分解と呼んでしまうことが多いが・・・
UbuntuのPycharmでChainer(GPU)を使う

UbuntuでPycharmを使ってChainerを動かす場合、
GPUを利用すると↓のようなエラーが出ます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/22648/091be333-3ddd-b527-f062-f9c5e9a3a20e.png)

環境変数のPATHが反映されてないことが原因なので
コードに追加してあげます。

```py
os.environ["PATH"] = "/usr/local/cuda-8.0/bin:/usr/bin:"
```
※自分の場合は、/usr/binも追加してあげると直りました。

その他のやり方として、
Run > Edit Configurations > Environment variables
にてGUIから環境変数を追加できますが、若干面倒です。
Java8 StreamAPI reduce() で入力要素とは異なる型にして返したい


## Javaだとうまくいかない？

例えば、文字列の長さの合計を計算したい場合、Pythonだとこうします。

```pycon
>>> fruits = [ 'apple', 'orange', 'kiwi' ]
>>> reduce(lambda sum, elm: sum + len(elm), fruits, 0)
15
```

> map で要素のサイズに変換して reduce だろという意見はおいておいて下さい (笑

Javaだとこう...かと思いきや、エラーになります。 \(´・ω・｀\)

```java
List<String> fruits = Arrays.asList("apple", "orange", "kiwi");
fruits.stream()
        .reduce(0, (sum, elm) -> sum + elm.length()); // Integer: 15 ?
```

```
-------------------------------------------------------------
COMPILATION ERROR : 
-------------------------------------------------------------
Javatest.java:[33,8] error: no suitable method found for reduce(int,(sum,elm)-[...]gth())
1 error
-------------------------------------------------------------
```

## 引数２個の reduce() は、要素の型と同じ型の戻り値をかえす

普段使っている？ ``list.stream().reduce(...)`` は引数２個 (初期値 と lambda) のやつです。

```java:java/util/stream/Stream.java
T reduce(T identity,
         BinaryOperator<T> accumulator);
```

要素の型と戻り値の型が同じ ``T`` なので、型を合わせないとコンパイルが通りません。

```java
List<String> fruits = Arrays.asList("apple", "orange", "kiwi");
String result = fruits.stream()
        .reduce("I like ", (sum, elm) -> sum + ", " + elm)); // String: "I like apple, orange, kiwi, "
```

## 引数３個の reduce() は、要素の型と異なる型の戻り値をかえせる

実は引数３個の ``list.stream().reduce(...)`` があります。これを使うと要素の型 ``T`` と異なる型 ``U`` の値を返す事ができます。

```java:java/util/stream/Stream.java
<U> U reduce(U identity,
             BiFunction<U, ? super T, U> accumulator,
             BinaryOperator<U> combiner);
```

例えば以下の様に書けます。``sum``=int, ``elm``=String, ``sum1``=int, ``sum2``=int です。

```java
List<String> fruits = Arrays.asList("apple", "orange", "kiwi");
int result = fruits.stream().reduce(
        0,                                 // 初期値
        (sum, elm) -> sum + elm.length(),  // accumulator. 中間生成物を作る.
        (sum1, sum2) -> sum1 + sum2);      // combiner. 中間生成物どうしをマージする.
```

accumulator (第２引数) と combiner (第３引数) を指定しています。何故２つもLambdaが必要かと言うと、並列実行 ``.parallel()`` される場合に必要になります。

例えば、accumulator ``(sum, elm) -> sum + elm.length()`` が並列で実行されると中間生成物 (int型) が複数できる事になります。
このint型の中間生成物同士をマージする為に combiner ``(sum1, sum2) -> sum1 + sum2`` が必要になります。

## 例

例えば、2-threadで並列実行された場合、以下の様になるだろうと考えられます。

> 実際の処理の流れとは少々異なりますが、簡単化して書いています

まず、全ての要素 ``"apple", "orange", "kiwi"`` を accumulator (第２引数) で処理し、中間生成物を作ります。

1. 初期値 + 要素1 ==> 中間生成物1
    * ``(0, "apple")  -> 5``
2. 初期値 + 要素2 ==> 中間生成物2
    * ``(0, "orange") -> 6``
3. 中間生成物1 + 要素3 ==> 中間生成物3
    * ``(5, "kiwi")   -> 9``

生成された中間生成物を全て combiner (第３引数) でマージし、一つの値に集約します。

1. 中間生成物2 + 中間生成物3 ==> 中間生成物4
    * ``(6, 9) -> 15``

最後に残った 中間生成物4=``15`` が最終的な戻り値となります。

## 参考

* https://stackoverflow.com/questions/24308146/why-is-a-combiner-needed-for-reduce-method-that-converts-type-in-java-8
* http://qiita.com/megmogmog1965/items/0b57223f223417aad637
Rails4.2 -> Rails5.1.2 にアップグレードした際のメモ

アップグレードガイドにあるものは割愛してます。

###依存している gemの更新

```
bundle update rails
```

だとら埒があかないため、全部update

`quiet_assets` は取り込まれたので削除
http://docs.komagata.org/5348

###migrationのバージョニング

migrationを作成したバージョンを付与すると最適に振る舞ってくれる

```ruby:
class CreateUsers < ActiveRecord::Migration[4.2]
end
```

面倒だったけど `[4.2]` を全部つけた。

###attribute_wasがdeprecated

https://github.com/rails/rails/pull/25337#issuecomment-225166796
before と after それぞれのcallbackで値の意味が変わる(_save,_createなど)
attribute_in_database は before だと変更前、 after_* だと変更後になる
わかりやすくなったが、メソッドの数が増えて複雑化している。

###コントローラのテスト

getなどの引数
https://stackoverflow.com/questions/43797133/controller-spec-unknown-keyword-id
paramsが必須

```ruby:
post :create, params: { name: "hoge" }
```

一番面倒だった

###ActiveSupport::MessageEncryptor

http://nisshiee.hatenablog.jp/entry/2017/04/17/192703
何も考えずにsecretに32バイト以上の文字列を入れていたら、 key must be 32 bytes と怒られた

APIドキュメントのようにKeyGeneratorを使う

###ActiveRecord の uniqがdeprecated
http://qiita.com/zenpou/items/950432bae246063786e8#activerecord%E3%81%AEuniq-%E3%81%AF-distinct%E3%81%AB
uniqを呼び出すとArrayが返る。distinctを使う。
とっても怖い仕様変更。

###Turbolinks5
#### ロード時の処理
turbolinks.load を使う
turbolinks-jquery は不要だったので外した

```js:application.rb
$(document).on("turbolinks.load", function() {
});
```
#### data-turbolinks-track 属性

trueから"reload"にかえないとダメらしい。

```erb:application.html.erb
<%= javascript_include_tag "application", "data-turbolinks-track" => "reload" %>
```

#### プログレスバー
https://github.com/turbolinks/turbolinks#displaying-progress

色変えただけ

```css
.turbolinks-progress-bar {
  background-color: #f90;
}
```

#### AdminLTE

http://www.takuyai.com/articles/28

```js
  $.AdminLTE.layout.fix();
```

### migration
http://y-yagi.tumblr.com/post/142064773890/rails-5%E3%81%AB%E5%85%A5%E3%81%A3%E3%81%9Fdb%E7%A0%B4%E5%A3%8A%E7%B3%BBtask%E3%81%AE%E9%98%B2%E6%AD%A2%E5%87%A6%E7%90%86%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6

破壊防止措置らしい

```
bin/rails db:environment:set RAILS_ENV=development
bin/rails db:migrate:reset
```
コネクション確立に時間を要した話

Docker に MySQL をデプロイしたところ Spring Data JPA から MySQL へのコネクションの確立に30secほどかかったので備忘録を残します。
結論としては、接続先の IP を 0.0.0.0:3306 にしてしまい、接続先の解決まで時間がかかってしまっていたようでした。。。

- 遅い
spring.datasource.url=jdbc:log4jdbc:mysql://0.0.0.0:3306/mydb

- 早い
spring.datasource.url=jdbc:log4jdbc:mysql://127.0.0.1:3306/mydb

何も考えずにネットからコピペした設定。
トラブルシュートに時間がかかり反省です。
Windowsで作ったシェルスクリプトをLinuxでちゃんと使えるようにするメモ(改行コードの修正)

# きっかけ
Vagrantでローカル環境を作るにあたり、諸々のコマンドをシェルスクリプトにしておけば、そういう知識に疎い、例えばフロントエンドの方でもシェル渡すだけで環境構築出来るようにしよう思っていました。

※Ansibleとか使え、というのは触れないでください。。

で、何の気無しにWindowsのSublimeTextでザクザクとシェルスクリプトを書いて、Linux上で実行したら、やたら「Command Not Found」が。。
さて、なんだこれは、と調べていたらさくっと解決出来たので、その備忘録として。

# 環境
* Windows10
* SublimeText
* Vagrant+CentOS7.3
* GitBash

# 何が起きた
とりあえず、適当なシェルスクリプトをSublimeTextで書いて、拡張子`sh`で普通に保存してみます。

```bash:test.sh
#!/bin/bash

echo 'Panzer...'

echo 'Vor!'
```

あえて改行多め。
これをそのままCentOS上に持っていって、実行してみると、こうなる。

```shell-session
[vagrant@localhost ~]$ sh test.sh
test.sh: line 2: $'\r': command not found
Panzer...
test.sh: line 4: $'\r': command not found
Vor!
```

# 検証
ただの改行である2行目が、`\r`として認識されている以上、どう頑張っても改行コードが原因っぽい。
一応、Linux上のviで全く同じ中身で`test2.sh`を作って、実行してみます。

```shell-session
[vagrant@localhost ~]$ sh test2.sh
Panzer...
Vor!
```

やっぱり改行コードっぽいですね。

```shell-session
$ file test.sh  test2.sh
test.sh:  Bourne-Again shell script, ASCII text executable, with CRLF line terminators
test2.sh: Bourne-Again shell script, ASCII text executable
```

**がっつりwith CRLF line terminatorsって書いてありますね。**

* Windows: CR(`\r`)+LF(`\n`)
* Linux(UNIX): LF(`\n`)

そりゃそうなりますよねー。。というわけで直しに行きましょう。

# 直しにかかる
こちらが参考になりました。
[色々な改行コード変換の方法 - Qiita](http://qiita.com/dharry/items/b4eead2868dddf1499f0)

いちいちLinux上に持っていってそこで修正、というのはダルいので、Windowsローカルで、普段使いのGitBashから修正したい場合どれが動くんだろう、と上記で紹介されていたコマンド一通り試してみました。

## nkf
実は`nkf`ってちゃんと使ったことない。

> dos -> unix は -Lu(unix) です。

> 引用元: [色々な改行コード変換の方法 - Qiita](http://qiita.com/dharry/items/b4eead2868dddf1499f0)

ということでオプションは、`-Lu`。

```shell-session
$ nkf -Lu test.sh > test_unix.sh
bash: nkf: command not found
```

GitBashでは使えない模様。

## dos2unix

```shell-session
$ cat test.sh | dos2unix > test_unix.sh
$ file test.sh test_unix.sh
test.sh:      Bourne-Again shell script, ASCII text executable, with CRLF line terminators
test_unix.sh: Bourne-Again shell script, ASCII text executable
```

おっ、動くやん。いい感じ。
つかこんなコマンドあったんですね。

## Perl
Perl入れた記憶が無いので動くのか怪しいのですが。

```shell-session
$ perl -pe 's/\r//' test.sh > test_unix_perl.sh
$ file test.sh test_unix_perl.sh
test.sh:           Bourne-Again shell script, ASCII text executable, with CRLF line terminators
test_unix_perl.sh: Bourne-Again shell script, ASCII text executable
```

**動くんかい！** しかもちゃんと変換出来てるし。
どうやら、GitBashインストールすると、Perlも一緒に使えるようになるようで。
副産物ですが良いこと知った。

## Ruby
Rubyこそ入れた記憶が無いので、動くはずない。

```shell-session
$ ruby -pe 'sub("\r", "")' test.sh > test_unix_ruby.sh
bash: ruby: command not found
```

うん、知ってた。

## sed
sedは動くでしょう。

```shell-session
$ sed "s/\r//g" test.sh > test_unix_sed.sh
$ file test.sh test_unix_sed.sh
test.sh:          Bourne-Again shell script, ASCII text executable, with CRLF line terminators
test_unix_sed.sh: Bourne-Again shell script, ASCII text executable
```

# 結論
nkfはともかくとして、GitBash使っている限りは、WindowsローカルでもLinux上でやるのと同じ要領で全く問題無さそうですね。
Perlが全く問題無く動いちゃったのは想定外でしたが。
とりあえず、OS間での改行コードの違いは改めて意識しないとハマりそうです。。すごい初歩的ですが。

# オチ
そもそもSublimeTextだったら改行コード設定`「View」→「Line Endings」`を、`Windows`から`Unix`にすれば終了だったオチ。
後から気付きました。

```shell-session
[vagrant@localhost ~]$ sh test2.sh
Panzer...
Vor!
```
印刷プレビュー時のレイアウト崩れ、背景画像表示の問題（IE・Edge）

サイトの印刷プレビュー時の表示調整でハマったので今後のために記載します。
## IE11で閲覧した時のバグ
### 改ページで要素が消える
[Grd](https://1000ch.github.io/grd/)というflexboxのフレームワークを使って、カード型レイアウトを実現していたが、印刷プレビューの2ページ目からその要素が表示されないという現象が起こった。これは、行ごとにGridクラスを振ってやることで解消。
### svgのアイコンが表示されない
chrome、firefoxだと問題なかったが、IE（Edge含む）で閲覧すると見出しの頭に:beforeで追加していたsvgアイコンが表示されなかった。高さを指定していなかったことが原因のようで、ブラウザによって差異が出るらしい。
### 2カラム要素のカラム落ち
これもIE11での現象（IE10以前は未確認）になるが、flexboxを使った2カラム要素でカラム落ちが発生（印刷プレビューのみ）。該当箇所で使われていたGrdのsassを確認したところ、`width: calc(100% * 6 / 12);`になっており、calc()を使わずそのまま`100% * 6 / 12`に修正してやることで、無事カラム落ちも解消されました。計算結果は同じ50%のはずなのですが、どうもIEでは解釈が異なるっぽい。
## Edge
背景画像が表示されない。調べたところ、そもそも背景画像を表示させるように設定する項目がEdgeには無いようなので断念。
C++ Builder XE4, 10.2 Tokyo > NameThreadForDebugging() > AnsiStringTとUnicodeStringの区別が曖昧 > Lプリフィックスはだめ

```txt:動作環境
C++ Builder XE4
RAD Studio 10.2 Tokyo Update 2 (追記: 2017/12/28)
```

古いプロジェクトファイルをXE4で開いて、エラーをつぶしていっている。

次のターゲットは以下。

```
NameThreadForDebugging("Capture");
```

`
[bcc32 エラー] Capture.cpp(64): E2015 '_fastcall System::Classes::TThread::NameThreadForDebugging(System::AnsiStringT<0>,unsigned int) at c:\program files\embarcadero\rad studio\11.0\include\windows\rtl\System.Classes.hpp:2391' と '_fastcall System::Classes::TThread::NameThreadForDebugging(System::UnicodeString,unsigned int) at c:\program files\embarcadero\rad studio\11.0\include\windows\rtl\System.Classes.hpp:2392' の区別が曖昧
`

Lプリフィックスを試してみた。

```
NameThreadForDebugging(L"Capture");
```

エラーは解消されない。

String()でキャスト?したらエラーは解消された。

```
NameThreadForDebugging(String("Capture"));
```

Lプリフィックスがきちんと機能していないのだろうか。
新規プロジェクトで試してもLプリフィックスはエラーとなった。
マニュアルインストールのGitlabをOmnibus(CE)に移行する

この記事は
===

* 昔々、Omnibus GitlabなんてものがなかったころマニュアルインストールしたGitlabのOmnibusへの移行メモです
* バージョン1つずつ上げながらrake db:migrateしたり、手作業でworkhorseコンパイルしたりする地獄運用をやめたい。

前提
===

* Ubuntu14
* 現行のGitlabバージョン：8.11.3（古）

Omnibus Gitlabのインストール
===

* 別のマシンに普通にOmmnibus Gitlabをインストールする
* まずは準備

```
$ apt-get install curl openssh-server ca-certificates postfix
$ curl -sS https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh > /tmp/script.deb.sh
$ chmod 777 /tmp/script.deb.sh
```

* 移行元と完全に同じバージョンを入れる必要があるのでバージョンを確認してバージョン指定でインストールします

```
$ apt-cache policy gitlab-ce

(snip)
     8.11.3-ce.1 0
        500 https://packages.gitlab.com/gitlab/gitlab-ce/ubuntu/ trusty/main amd64 Packages
(snip)

$ apt-get install gitlab-ce=8.11.3-ce.1
$ gitlab-ctl reconfigure
```

* 普通にアクセスできるかブラウザから確認します

マニュアルgitlabのバックアップ実行
===

* マニュアルgitlab側で下記コマンドでバックアップを作成します

```
$ cd /home/git/gitlab
$ /usr/local/rvm/gems/ruby-2.1.8/bin/bundle exec rake gitlab:backup:create RAILS_ENV=production
```

* ちなみにバックアップの設定は下記のような感じです（元々S3に飛ばしてたのでその設定が入っていますが必須ではありません）

```:/home/git/gitlab/config/gitlab.yml
  backup:
    path: "tmp/backups"   # Relative paths are relative to Rails.root (default: tmp/backups/)
    keep_time: 1   # default: 0 (forever) (in seconds)
    upload:
      connection:
        provider: AWS
        region: ap-northeast-1
        aws_access_key_id: XXXXX
        aws_secret_access_key: 'XXXXX'
      remote_directory: 'xxx-gitlab-backups'
```

Omnibus Gitlabへバックアップを取り込み
===

secret情報の復旧
---

* 上記で取得したバックアップファイルはDB関連の情報が暗号化されているようで、復号化キーを元の環境から持ってくる必要があります
* キーのありかはバージョンによって微妙に異なるみたいです

### マニュアルインストール側

```:/home/git/gitlab/config/secrets.yml
production:
  db_key_base: xxxxxxx
  secret_key_base: xxxxxxx
  otp_key_base: xxxxxxx
```


### omnibus側

```:/etc/gitlab/gitlab-secrets.json
  "gitlab_rails": {
    "secret_key_base": "xxxxxxx",
    "db_key_base": "xxxxxxx",
    "otp_key_base": "xxxxxxx"
  },
```

* マニュアル側のファイルからomnibus側のファイルへ3つのキーをコピペで張りつけておきます

バックアップ取り込みの実行
---

* バックアップファイルを所定のディレクトリに配置します
  * tarが1つだけの場合は何も指定しなくてもそれを取り込むみたいです

```
mv /tmp/1499828797_gitlab_backup.tar /var/opt/gitlab/backups
```

* 取り込みを実施します

```
/opt/gitlab/bin/gitlab-rake gitlab:backup:restore RAILS_ENV=production
```

無事
===

* 取り込みに成功して普通にアクセスできるようになりました

ついでに
---

* せっかくomnibusにしたので、最新のGitlabにupdateしました

```
apt-get install gitlab-ce
```

* 最新の9.3.6に簡単に上がりました

終わりに
===

* omnibusだとアップデート楽だなぁ（マニュアルは地獄）
Rack-traffic-signalというgemを公開しました

# どんなgem?

Ruby製Webアプリケーションにメンテナンスモードを導入するためのRackミドルウェアです。

↓みたいなやつです。
![](https://kaminarimagazine.com/wp-content/uploads/2017/03/wpm5-715x515.png)

# 特長

すでにメンテナンスモードを導入するためのgemには[rack-maintenance](https://github.com/tilsammans/rack-maintenance)などがありますが、このrack-traffic-signalには次のような特長があります。

### メンテナンスグループごとのメンテナンスモード制御
パス、HTTPメソッドの組み合わせを「メンテナンスグループ」というくくりで扱います。

特定のメンテナンスグループだけをメンテナンスモードに入れる/外すことができます。新規ユーザー登録機能(get: /users/new, post: /users)のみメンテナンスモードに入れるといったことができます。
メンテナンスグループはリソースとアクションの組み合わせで設定できます。たとえばさきほど例に上げた新規ユーザー登録機能はリソース: user, アクション: registerと設定できます。

### メンテナンスグループごとのレスポンス設定
メンテナンスグループごとに、メンテナンスモード時のHTTPステータスコード、レスポンス本文を設定することが可能です。 

APIに対してはJSON形式で、それ以外はメンテナンス告知HTMLを返す、まだ一般公開したくない機能に関しては社内IPからのアクセスのみ通しそれ以外は404を返すなど柔軟な設定が可能です。

# 使用法

インストール方法などはREADMEを参照してください。ここでは、一応READMEにのっているものの分かりづらいだろうなぁという設定ファイルの書き方について解説します。

## 設定の書き方

```ruby
Rack::TrafficSignal.setup do |config|
  # internal_ips に含めたIPアドレスは、社内IPアドレスとして扱えます。
  # 社内IPアドレスからのアクセスかどうかを判別するメソッドが存在しており、
  # その場合はメンテナンスモードをスキップする、といった制御が可能です。
  # その例は config.skip_by を参照してください。
  config.internal_ips = ['192.168.1.1/25']

  # メンテナンスモードをスキップするパスを指定。
  # こちらも `internal_ips` と同様 `skip_by` ブロックの中で利用することを想定しています。
  config.skip_paths = [/^\/users\/12345/]

  # メンテナンスグループに固有のレスポンス設定を書かなかった場合に使われる設定
  config.default_status = 503
  config.default_content_type = 'application/json'
  config.default_body = { error: 'error' }.to_json

  # メンテナンスグループの設定を行います。
  # パスの設定は文字列・正規表現どちらでも行なえますが、基本的には正規表現を用います。
  # 文字列で設定した場合は、厳密に一致した場合しか適用されません。
  config.maintenance_group =   {
    # <resource>: {
    #   <action>: [
    #     { methods: [:get, :post], path: <path_to_maintenance>}
    #   ]
    # }
    users: {
      register: [
        { methods: [:get], path: "/users/new"},
        { methods: [:post], path: "/users" }
      ],
      # また、メンテナンスグループごとにHTTPレスポンスステータスコードやレスポンスボディを
      # 設定することも可能です。
      update: [
        { methods: [:put], path: %r{/users/\d+}, status: 404, body: { meta: '404'}.to_json }
      ]
    }
  }

  # 現在のアプリケーションのメンテナンスモードを返すブロックを渡します。
  # 結果として、シンボルの配列を返すものである必要があります。
  # 基本的には `:<resource>_<action>` という形式ですが、特例があります。
  # :<resource>_all => そのリソースすべてのアクションをメンテナンスモードに入れる
  # :all => すべてのメンテナンスグループをメンテナンスモードに入れる
  config.maintenance_status_by do
    ENV['MAINTENANCE_STATUS'] # [:users_register, :users_update]
  end

  # このブロックがtrueを返した場合、メンテナンスモードかどうかの判定を行いません。
  # 次の例では、アクセス先が `skip_paths` に含まれている or 社内IPからのアクセスの場合
  # メンテナンスモードをスキップしています。
  config.skip_by do |env|
    Rack::TrafficSignal.skip_path?(env) || Rack::TrafficSignal.internal_access?
  end

  # こちらもメンテナンスモードをスキップする設定ですが、ただスキップするだけでなく
  # HTTPヘッダに 'X-RACK-TRAFFIC-SIGNAL-MAINTENANCE' が付与されます。
  # ちゃんとメンテナンスモードに入っているかどうか確認できるようになります。
  #
  # ヘッダをいちいち確認するのは面倒なので、付与されてたらみためでわかるようになる
  # ブラウザ拡張とかあったらよいですね！
  config.skip_with_warning_by do |env|
    Rack::TrafficSignal.skip_path?(env) || Rack::TrafficSignal.internal_access?
  end
end
```

# さいごに
一週間ほどの突貫でつくったgemであり、危ないところも多々あります。
issuetたててもらったり、Pull Request送っていただけたりするととても喜びます。

https://github.com/k5trismegistus/rack-traffic-signal
C++ Builder XE4, 10.2 Tokyo > 非推奨 t_str()の置き換え

```txt:動作環境
C++ Builder XE4
RAD Studio 10.2 Tokyo Update 2 (追記: 2017/12/28)
```

```cpp
void __fastcall TForm1::Button1Click(TObject *Sender)
{
	String fromFile = "a.jpg";
	String toFile = "b.jpg";

	CopyFile(fromFile.t_str(), toFile.t_str(), 0);
}
```

```
[bcc32 警告] Unit1.cpp(22): W8111 非推奨のエンティティ '_fastcall UnicodeString::t_str() const'  にアクセスしている
[bcc32 警告] Unit1.cpp(22): W8111 非推奨のエンティティ '_fastcall UnicodeString::t_str() const'  にアクセスしている
```

XE4ではt_str()は非推奨とのこと。

参考:http://www.logical-arts.jp/?p=268
を参考にしました。

CopyFile()の場合は下記でよさそうです。

```cpp
void __fastcall TForm1::Button1Click(TObject *Sender)
{
	String fromFile = "a.jpg";
	String toFile = "b.jpg";

	CopyFile(fromFile.c_str(), toFile.c_str(), 0);
}
```

**ただし、上記の場合、プロジェクトオプションにおいて「_TCHARのマップ先」を「wchar_t」にしておく必要があるようです**。XE4で新規プロジェクト作成時はデフォルトがwchar_tになっているようです。

### 関連

c++ builder / fileIO > TFile::Copy() > 大きいファイルのコピー時 > 「5秒以上の応答なし」の確認http://qiita.com/7of9/items/1729b395cc2ec92719f8
[メモ・作成中] 『Hands-On Machine Learning with Scikit-Learn & TensorFlow』 英単語和訳

この本でググッても日本語の記事がほとんどヒットしない :sob:
つまりこれで記事書けば私もSEO強者 :innocent:（違う）

とりあえず英語弱者なので、下記に教科書読む際に出てきた（そして僕が躓いた）
単語の訳を載せる。

内容についてはそのうち触れていきたい。
下記のリストは随時更新予定。

（もし違ってたりしたら教えてください :sob: )

# 英単語和訳表
※ 基本的に[Weblio辞書](http://ejje.weblio.jp/)で調べました。

|英単語（熟語）|和訳|
|:-------------------------|:--------------------------|
|implements|道具、用具、器具、実行する、実施する|
|hastily|急いで、慌てて|
|prerequisites|必須の、必要な、必要条件|
|convention|慣習、しきたり、条件|
|supervision|監督、管理|
|criteria|標準、基準|
|apriori|先天的に、演繹的に|
|capita|人物、頭、人、個体|
|Cyprus|キプロス 《地中海東部の島で英連邦内の共和国; 女神 Venus の生地という伝説がある; 首都 Nicosia》.|
|irrelevant|不適切な|
|artificial|人工的な|
|census|人口調査、国勢調査|
|metrics|測定基準|
|revenue|収益|
|grasp|理解する、把握する|
|RMSE|Root Mean Square Error 平均二乗誤差の平方根|
|deviation|偏向、偏差、傾向？|
|MAE|Mean Absolute Error 絶対値誤差の平均|
|voluntarily|自主的に、自発的に|
|glance|一見、一目|
|prone|傾向がある|
|stumble|つまずく、よろめく|
|stratum|地層|




# 書籍内でのリンク等
[書籍中のサンプルコード等？](https://github.com/ageron/handson-ml)
[Better Life Index Data](https://goo.gl/0Eht9W)
[stats about GDP per capita](https://goolgl/j1MSKe)

## データセット
* Popular open data repositories
  *  http://archive.ics.uci.edu/ml/
  *  https://www.kaggle.com/datasets
  *  http://aws.amazon.com/fr/datasets/
* Meta portals (they list open data repositories)
  *  http://dataportals.org/
  *  http://opendatamonitor.eu/
  *  http://quandl.com/
* Other pages listing many popular open data repositories
  *  [Wikipedia's list of Machine Learning datasets](https://goo.gl/SJHN2k)
  *  [Quora.com question](http://goo.gl/zDR78y) 
  *  [Datasets subreddit](https://www.reddit.com/r/datasets)

（注釈：2017/7/13 Chapter 1 終わりました）
Omnibus Gitlab(CE)をMySQLで動かす

この記事は
===

* Omnibus Gitlab(CE)はOSのパッケージでインストールできるのでとても楽ですが、組み込みのDBはPostgres固定です
  * [MySQLを使うにはEEを使う必要がある](https://docs.gitlab.com/omnibus/settings/database.html#omnibus-mysql-special-notes)とのこと
* ただしMySQLサーバを自分で立てれば、使うことはできるようなのでやってみました

前提
===

* Ubuntu14で試しました
* MySQL及び諸々ビルド関連のパッケージはインストール済みとします
  * ```mysql -u root```で入れる状態とします（気になる人はちゃんとユーザ作ってください）
  * my.cnfにutf8関連の設定を入れておきます

手順詳細
===

Omnibus Gitlab(CE)のインストール
---

* [普通にインストール](https://about.gitlab.com/installation/#ubuntu)なので割愛
* 基本的にはapt-getでインストールするだけです

gitlab.rbの編集
---

* DBクライアントをmysqlにするためにgitlab.rbを下記のように編集します

```:/etc/gitlab/gitlab.rb
gitlab_rails['db_adapter'] = "mysql2"
gitlab_rails['db_encoding'] = "utf8"
gitlab_rails['db_database'] = "gitlabhq_production"
gitlab_rails['db_username'] = "root"
gitlab_rails['db_password'] = nil
gitlab_rails['db_host'] = "127.0.0.1"
gitlab_rails['db_port'] = 3306
postgresql['enable'] = false
```

databaseの作成
---

* databaseを作っておきます

```
mysql -u root -e "create database gitlabhq_production default character set utf8"
```

mysql2のビルド
---

* 下記の手順で先にmysql2 gemをビルドしておきます

```
cd /opt/gitlab/embedded/bin/ # use the gem binary package builded
./gem install mysql2 -- --with-mysql-lib=/usr/lib64/mysql
```

bundler設定ファイルの変更
---

* bundle installの時のwithoutオプションを変更しpostgresを指定(mysqlを消去）します

```:/opt/gitlab/embedded/service/gitlab-rails/.bundle/config
---
BUNDLE_RETRY: "5"
BUNDLE_PATH: "/opt/gitlab/embedded/service/gem"
BUNDLE_JOBS: "9"
BUNDLE_WITHOUT: "development:test:postgres"
BUNDLE_DISABLE_SHARED_GEMS: "true"
```

* bundle installの実行をします

```
cd /opt/gitlab/embedded/service/gitlab-rails
/opt/gitlab/embedded/bin/bundle install
```

* ただこの修正はgitlabのパッケージをアップデートするたびにリバートしてしまうので毎回実施する必要があるとか
  * 微妙だなぁ。。

Gitlabのリビルド
---

* Chefを動かしてリビルドします

```
gitlab-ctl reconfigure
gitlab-ctl restart
gitlab-rake gitlab:setup
```

完了！
===

* 普通に http://localhost/ でアクセスすれば動いてます

終わりに
===

* bundlerのwithout設定はアップデートの都度に入れ直さなくてはならないところが相当微妙だなぁと思いました
* Gemfileの中でわざわざgroup作ってmysql2 gemをよけてるんだけど別によけないで入れておけばいいのにとか思いました

参照
===

* https://lessmind.github.io/2016/11/18/gitlab-ce-omnibus-package-with-mysql/
2017-07-13 C++ Builder XE4, 10.2 Tokyo > Indy > TIdUDPServerのUDPRead()関数の引数がIndyバージョンにより異なる

```txt:動作環境
C++ Builder XE4
   Internet Direct (Indy) 10.6.0.4975

RAD Studio 10.2 Tokyo Update 2 (追記: 2017/12/28)
   Internet Direct (Indy) 10.6.2.5366
```

TIdUDPServerのUDPRead()関数の引数。

```
void __fastcall TForm1::IdUDPServer1UDPRead(TIdUDPListenerThread *AThread, const TIdBytes AData,
		  TIdSocketHandle *ABinding)
```

Indyの古いバージョンで、ADataの定義が(constなしの)TBytesになっている場合があるようだ。

### 関連

c++ builder XE4 > Indyのソースコードへのアクセス
http://qiita.com/7of9/items/0aebd1727b0ee1c65e6b
Unityのバージョンを複数持つ方法

#Unity 2017リリース開始されましたねー
最新バージョンも気になるけど、ちゃんと動作するかも気になる
いちいち入れ替えるのはさすがに大変ですよね。
ちゃんとバージョン共存の方法ありますよー

#Unityのバージョンを複数持つ方法
①フォルダ名を変える
/アプリケーション/Unity

<img width="453" alt="スクリーンショット 2017-07-13 10.26.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/47901/b9603c31-5a39-8bb7-399b-8f6dfdc6639a.png">

【Unity】→【Unity（バージョン名）】のように変更
※Unityだと上書きされてしまう。
<img width="330" alt="スクリーンショット 2017-07-13 10.28.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/47901/72ade327-ea4a-9397-62db-8f37673c762d.png">




②インストールしたいバージョンを公式サイトから選択し
インストール

<img width="445" alt="スクリーンショット 2017-07-13 10.35.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/47901/e9052653-91d5-6dc3-3a3e-14f4fab8f398.png">

共存できましたー。
Laravel Collective の annotations を導入しよう

Laravel Collective を導入して，アノテーションでルーティングを実現し，動作確認まで行います。
使用した Laravel のバージョンは 5.4 です。

# プロジェクトを作成

ここでは仮に mycollectiveproject という名前のプロジェクトを作成します。

```bash
$ composer create-project laravel/laravel mycollectiveproject
```

# Laravel Collective をインストール

```bash
$ cd mycollectiveproject
$ composer require laravelcollective/annotations
```

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

内容は， Laravel Collective の[公式サイト](https://laravelcollective.com/)からコピーしたものに手を加えたものです。

```php:app/Providers/AnnotationsServiceProvider.php
<?php

namespace App\Providers;

use Collective\Annotations\AnnotationsServiceProvider as ServiceProvider;

class AnnotationsServiceProvider extends ServiceProvider {

    /**
     * The classes to scan for event annotations.
     *
     * @var array
     */
    protected $scanEvents = [];

    /**
     * The classes to scan for route annotations.
     *
     * @var array
     */
    protected $scanRoutes = [];

    /**
     * The classes to scan for model annotations.
     *
     * @var array
     */
    protected $scanModels = [];

    /**
     * Determines if we will auto-scan in the local environment.
     *
     * @var bool
     */
    protected $scanWhenLocal = true;

    /**
     * Determines whether or not to automatically scan the controllers
     * directory (App\Http\Controllers) for routes
     *
     * @var bool
     */
    protected $scanControllers = true;

    /**
     * Determines whether or not to automatically scan all namespaced
     * classes for event, route, and model annotations.
     *
     * @var bool
     */
    protected $scanEverything = true;
}
```

# サービスプロバイダーを登録

config/app.php にサービスプロバイダーを登録します。

```php:config/app.php
  // （長いので省略）
  'providers' => [
    // （長いので省略）
    App\Providers\AnnotationsServiceProvider::class
    // （長いので省略）
  ];
  // （長いので省略）
```

# コントローラーを作成

```bash
$ php artisan make:controller HomeController
```

```php:app/Http/Controllers/HomeController.php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class HomeController extends Controller {
  /**
   * @Get("/home", as="index")
   */
  public function index()
  {
    return view('welcome');
  }
}
```

# 内蔵サーバーを起動して確認

```bash
$ php artisan serve
```

# ブラウザーを起動して表示

[http://localhost:8000/](http://localhost:8000/)　で表示された画面と，[http://localhost:8000/home](http://localhost:8000/home) で表示された画面が同じであれば成功です。

# これが何の役にたつのか

ルーティングの設定を，一つのファイルで管理するのではなく，各コントローラーに設定することで，コンフリクトを回避することができます。

ルーティングの設定は routes/web.php 等 (以前はroutes.php) に行いますが，ファイルが一つのため，複数人で開発を行っていると，svn や git の管理上コンフリクトが発生しやすいという問題が発生します。

コントローラーは担当者一人が編集することが多いと思うので，ルーティングの設定を各コントローラーに書くことで，コンフリクトを発生しにくくして，この問題を解決できます。

Java + Spring MVC なんかではおなじみのソリューションですね＾＾

# 参考

- [Laravel Collective](https://laravelcollective.com/)
scpでローカルからサーバへ送る

SCPでローカルからサーバへ送る手順を記載しておきます。想定ではローカルからアパッチにファイルを転送することをゴールとしています。

# scpとは

`scp`は`ssh`を使ってファイルを転送するコマンドなので`ssh`に関して理解があることが前提になってくると思います。`ssh config`とかにエイリアスを書いてしまっている場合はもう７０パーセントは`scp`を使う準備は完了しています。というか、そうでなければ、`ssh config`にエイリアスを書けば良いと思います。

# 実行

例えば`.ssh`にいる状態で`vi config `をして下記のようにすでに`ssh`の設定がしてあり`ssh server`でサーバーに一発で入れる状態が出来上がっているのであれば

```
Host server
 User root
 Port 22
 HostName 160.16.***.***
 IdentityFile ~/.ssh/id_rsa
 TCPKeepAlive yes
 IdentitiesOnly yes

```

下記のように記述すればローカルからリモートでファイル転送できます


```

scp ローカルのファイルのフルパス server:リモートのフルパス

```

# 参考

[scpでローカルからサーバへ送る](http://off.tokyo/blog/2017/07/13/scp%E3%81%A7%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E3%81%8B%E3%82%89%E3%82%B5%E3%83%BC%E3%83%90%E3%81%B8%E9%80%81%E3%82%8B/)
キリ番踏んだら報告してね

次のキリ番は

```js
new Date('2017-07-14T11:40:00.000+09:00').getTime()
```

です。

<table>
  <tr>
    <th colspan="10">キリ番</td>
    <th>踏んだ人</td>
  </tr>
  <tr>
    <td><strong>1</strong></td>
    <td><strong>5</strong></td>
    <td><strong>0</strong></td>
    <td><strong>0</strong></td>
    <td><strong>0</strong></td>
    <td><strong>0</strong></td>
    <td><strong>0</strong></td>
    <td><strong>0</strong></td>
    <td><strong>0</strong></td>
    <td><strong>0</strong></td>
    <td></td>
</table>
borderやpaddingを指定するとはみ出す時の対処法

要素のwidthは要素内のコンテンツまでを指定する。
コンテンツの外のpadding、border、marginはwidthには含まれないため、
width=100%に全て収めようとして次のようにコーディングするとはみ出すことになる。

```
.sample-box {
    width: 100%;
    border: 4px solid #000;
    padding: 4px;
}
```

簡単な解決法の一つとして、box-sizingをborder-boxに指定する。
そうするとborderまでをwidthに含めることができる。

```
.sample-box {
    width: 100%;
    border: 4px solid #000;
    padding: 4px;
    box-sizing: border-box;
}
```
iOSの開発環境セットアップ

# 概要

開発のメンバーが増えてきて、セットアップ手順を何回も教えるのがメンドくさくなったのでまとめておきます。
以前書いた[Macでgitを利用した開発する際にやっておきたい準備](http://qiita.com/NorsteinBekkler/items/a0622ee6a39d08d61b72)と少し被っています。

# 目次

- AppleIDの作成
- Xcodeのインストール
- Homebrewのセットアップ
- `git config --global`の実施
- rbenvの設定

## AppleIDの作成

**Xcodeの作成や開発者登録で利用するAppleIDですが、普通に作ってしまうとクレッジットカードの入力を求められるので会社で利用するにはちょっと面倒です。**

[お支払い方法を指定せずに Apple ID を作成または使用する](https://support.apple.com/ja-jp/HT204034)にあるように無料のアプリのインストールからAppleIDを作ることでクレジットカードの入力をスキップできます。

**逆に有料アプリやAppStoreのアカウントからAppleIDを作るとクレジットカードの入力を求められてしまいます**

## Xcodeのインストール

AppleIDの作成が完了していればApple Storeからインストールできるので実施。

## Homebrewのセットアップ

Homebrewのインストール自体は[公式サイト](https://brew.sh/index_ja.html)参照

そのあとiOSの開発で必要なパッケージをインストールします。
(プロジェクトや会社によって違うと思うので自分の環境に置き換えてください。)

我々のプロジェクトではHomebrewのセットアップは[homebrew-bundle](https://github.com/Homebrew/homebrew-bundle)を用いて設定ファイルからインストールします。

### 1.homebrew-bundleの有効化 

```bash
brew tap Homebrew/bundle
```

### 2.Brewfileの作成

以下は自分たちのプロジェクトで使っているhomebrewの最低限のパッケージを記載したBrewfileです。

```bash:Brewfile
tap 'caskroom/cask'
tap 'homebrew/bundle'
tap 'homebrew/core'
brew 'bash-completion'
brew 'git'
brew 'carthage'
brew 'rbenv'
cask 'licecap'
```

[licecap](https://www.cockos.com/licecap/)は動作確認したものをgifアニメーションで取ることが多いので入れています。(Pull Requestとかに貼ってあるとレビューしやすいので)

### 3.必要なパッケージのインストール

以下を実施するとBrewfileに記載されているパッケージがインストールされます

```bash
# Brewfileが置いてある直下で
brew bundle
```

### 4.設定

.bash_profileに以下を追記

```bash:.bash_profile
# bash_completion
# 補完が効くようになります
if [ -f $(brew --prefix)/etc/bash_completion ]; then
  source $(brew --prefix)/etc/bash_completion
fi
# rbenv
export PATH="$HOME/.rbenv/bin:$PATH"
eval "$(rbenv init -)"
# PS1の設定
source /usr/local/etc/bash_completion.d/git-prompt.sh
source /usr/local/etc/bash_completion.d/git-completion.bash
GIT_PS1_SHOWDIRTYSTATE=true
export PS1='\[\033[37m\][\[\033[36m\]\u\[\033[37m\]@\h \[\033[32m\]\W\[\033[37m\]]\[\033[31m\]$(__git_ps1)\[\033[00m\]\$ '
```

PS1の設定をしておくとこんな感じでgitの情報が表示されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/56178/985e1b36-0d9d-148a-ac23-21e30f974dd4.png)

## `git config --global`の実施

gitを利用する上での **名前** と **email** を設定します。
この値はコミット時の情報に使われます。

```bash:設定
# 名前の設定
git config --global user.name 名前
# emailの設定
# ここはGithub等のサービスを利用している場合は
# そのアカウントのメールアドレスを設定することをお勧めします
# (Github側でemailを用いてマッピングするため)
git config --global user.email メールアドレス
```

# rbenvの設定

[rbenv を利用した Ruby 環境の構築](http://dev.classmethod.jp/server-side/language/build-ruby-environment-by-rbenv/)を参考にセットアップ

```bash
# 2.4.1をインストール
# バージョンはプロジェクトで決まっているものを適宜インストール
rbenv install 2.4.1
# 2.4.1に設定
rbenv global 2.4.1
```

bundlerのインストール
```bash
gem install bundler
```

必要なGemをインストール

```ruby:Gemfileの例
# frozen_string_literal: true
source "https://rubygems.org"

gem "fastlane", "2.45.0"
gem "cocoapods", "1.2.1"
```

fastlaneとcocoapodsを利用しているので上記のようにしています。
また我々の開発ではGemfileはプロジェクトに含めてpushしてあります。

```bash
# Gemのインストール
gem install
```

# まとめ

[AppleIDの作成](AppleIDの作成)でクレジットカード聞かれたー、どうしようってなっているパターンが多かったので会社でアカウント取る時は注意しないといけないと思った(クレジットカード情報入れればいいだけだけど)
bundle install で `RuntimeError: Digest::Base cannot be directly inherited in Ruby` となる件

100%ではなく、希に発生するエラー。

どうやら、Ruby の `Digest::*` (`Digest::SHA256` とか) を `require 'digest'` だけしてマルスレッド環境下で使った時に起こり得る問題だとか。
[Ruby のバグレポート](https://bugs.ruby-lang.org/issues/9494)にある[テストコード](https://gist.github.com/ConradIrwin/8830465)を何度か実行すると再現できる。

```ruby
# https://bugs.ruby-lang.org/issues/9494
# https://gist.github.com/ConradIrwin/8830465
require 'digest'

class << Digest::Base
  def inherited(*)
    sleep 0.01
  end
end

t = Thread.start do
  Digest::SHA256.new
end
Digest::SHA256.new
t.join

__END__
$ ruby test.rb
test.rb:10:in `new': Digest::Base cannot be directly inherited in Ruby (RuntimeError)
        from test.rb:10:in `block in <main>'
```

ひとまず、bundle install の際は `--jobs` を 1 にしておけば遭遇しない、と考えてよいのだろうか？

※ ググっても困っている人がいないので何かを見落としている気がします…。