OmniAICreator/Qiita-1.07M huggingface dataset:
GitでVisual Source Safeの使い勝手を再現する！ロック機能

Git LFSが2.0になり、ロック機能とやらが実装されました。github.comではすでに使えるようになっています。GitHub Enterpriseでも、最新の2.10にはいつの間にか来ています。忍び寄るロック機能！ [GitLab](https://gitlab.com/gitlab-org/gitlab-ee/issues/1830)と[BitBucket](https://jira.atlassian.com/browse/BSERV-9623)はまだのようです。

Git！

なのに！

ロック！

まさにあれの再来ですよね。実際にこのロック機能を激しく使ってみたわけではないのですが、ソースコードを読んだりしてなんとなく概要を把握したのでざっと書いてみます。

一次情報は次のWikiですね。

* https://github.com/git-lfs/git-lfs/wiki/File-Locking

ロック機能を有効にする
==========================

Git LFSの機能の一部ですので、Git LFSを有効化しますが、その時にオプションを付与します。

```shell-session
$ git lfs track "*.png" --lockable
```

この ``--lockable`` がポイントです。
ちなみにこれを付けると、リポジトリ内のすべての該当ファイルがフルオートで **読み込み専用（444）になります** 。ワクワクしてきますね！

なお、この情報は ``.gitattributes`` ファイルに書き込まれます。テキストファイルなので自分でて修正もできますが、読み込み専用にするのがポイントっぽいです。

なお、Git LFSのファイルポインタ方式のバイナリデータ管理は使いたくないんだけど、ロックだけは可能にしたい場合は ``.gitattributes`` ファイルを手修正して設定を追加すればいいらしいです。（上記のコマンドだとファイル変換のフィルタまで設定されてしまう）

```ini
*.yml lockable
```

ロック機能を使う
==================

次のようにコマンドを実行します。
読み込み専用状態が「ロック状態」なのではなく、読み込み専用なのがデフォルト状態で「ロック状態」は自分だけにファイルの書き込み権限があるというステータスです。最初わかりませんでした。次のように実行すると、644となります。ロックというとあれですが、VSSのチェックアウトと考えれば、おっさんたちはピンと来ると思います。僕もピンと来ました。

```shell-session
$ git lfs lock sample.png
```

この状態で編集してコミットすればOKです。で、使い終わったら次のコマンドを実行します。

```shell-session
$ git lfs unlock sample.png
```

これでロック解除ができます。

ロックした人がそのまま風邪引いて会社来なくなったら？
==================================================

FAQですね。次のように ``--force`` で強制解除できるので、いざとなったら解除できちゃいます。あの「帰る前にきちんと忘れずにチェックインしないと！！！」というハラハラ・ドキドキは味わえません。残念。

```shell-session
$ git lfs unlock sample.png --force
```

複数人を調停する仕組み
=======================

積極的に「いまこのファイルがロックされているからお前に編集するなよ」みたいなのを通知するような機能はありません。
現在ロックされているファイル一覧は次のコマンドで取得できますが、すぱっと高速には帰ってこなくて、数秒かかっています。常駐して頻繁に呼び出してNotificationを出す、という感じではなさそうです。

```shell-session
$ git lfs locks
filesystem/filesystem.png	shibukawa	ID:1535
filesystem2/watcher.png  	shibukawa	ID:1536
index.rst                	shibukawa	ID:1534
```

ロックすると ``.git/lfs/lockcache.db`` というファイルができます。git-lfsって[独自のキーバーリューストアの実装](https://github.com/git-lfs/git-lfs/tree/master/tools/kv)を持っているんですね。そのファイル形式です。ですが、このファイルを何らかの形で同期をとったりとかはしてなくて、これはあくまでもローカルのキャッシュです。

実際には単純で、lockサブコマンドを実行したタイミングでサーバーの ``/locks`` エンドポイントにファイルパスを送りつけて、ロックを作成します。同名ファイルを実行するとエラーになるので、早く実行したもの勝ちというただそれだけです。

実際には、Slack botかなにかで、ロック情報のイベントをgithubから取得して流してあげるだけでも体感上は必要十分な感じになるのかなって思います。

まとめ
========

ドキドキ・ワクワクはありませんが、バイナリファイルの編集のコンフリクトを避けるロック機能の紹介でした。
Google Cloud Container Builderで他ProjectのGCRからPull/Pushする

# やりたいこと
GCP上でGCRは環境毎にProjectを分けている(project-stgとproject-pro)とする。
生成するDockerImageはSTG/PRO共通のためどちらのGCRにもPUSHしたい。またはproject-proのImageを作成するときにproject-stgのImageをPullしてきたいとする。
要は、Container Builder上でProject跨ぎでGCRからpull / pushしたい時にどうすれば解決できるか。ということ。
また、Projectは同一組織配下にあるとする。

# 対応策
## 1.IAMの確認
Container Builderの設定をしているProject（今回はproject-proとする)で、Cloud Container BuilderのCloud COntainer Builder権限(ビルドを実行できる権限)のIAMがあることを確認する。

Cloud Builder を使用していれば。RoleがCloud Container Builderのサービスアカウントがあるはず。
[ID]@cloudbuild.gserviceaccount.comというIAMがあるはずなのでコピーしておく。

なければ Cloud Container Builderの権限を持っているサービスアカウントを使えばOKなはず（未検証)

## 2. project-stgでIAM追加
1で確認したIAMをproject-stgのIAMに追加する。
GCRの権限は以下を参考にする。
https://cloud.google.com/container-registry/docs/access-control?hl=ja

pushが必要であれば storage.adminが必要なのでストレージ管理者をIAMに割り振っておく。
pullだけで良ければオブジェクト閲覧者をつけておけば良さそう。

上記でContainre Builder上から別ProjectのImageをPull/Push出来るようになる。
各環境で共通のイメージの場合は1回で出来るようになるので便利
transformをつかって中央寄せしたときに画像がボケるときの対処

画像のサイズが奇数だとダメっぽい？
偶数値で書き出し直したらボケなくなった。

ちなみに、ボケたのはChromeやSafariでfirefoxは大丈夫だったぽい。
Windowsのブラウザは未検証じゃい
忙しい人のためのSlack絵文字作成

 * ImageMagickをインストール
 * よさげなフォントをダウンロード (例: http://fontna.com/freefont/?p=40)
    * (注意)ライセンスが適合しているかどうかはご自身の判断でご確認ください
 * ~~以下を実行 (もうちょっと頑張れば1コマンドにできるはずだがとりあえずこれで)~~
 * <ins><a href="#comment-c30e396ea5928a3ad98f">コメント</a>で1行版を教えていただけました。ありがとうございます</ins>

```
convert -gravity center -thumbnail 128x64 -extent 128x64 -font font.otf -pointsize 20 label:'そう' temp.png
convert -gravity center -thumbnail 128x64 -extent 128x64 -font font.otf -pointsize 20 label:'だね' temp2.png
convert -append temp.png temp2.png out.png
```

こんな感じになります

<img src="https://qiita-image-store.s3.amazonaws.com/0/19201/09e5e6b6-f64a-f1d4-f8cf-63b4c6e8f4fd.png" width="32">
SQLServerを完全にアンインストールする為のPowerShell

SQLServerを完全にアンインストールするのはコントロールパネルの「プログラムと機能」からだけではできない。完全にアンインストールする方法、具体的にはここに書いてあるんだけど
https://blogs.msdn.microsoft.com/jpsql/2013/05/30/sql-server-4/
度重なるインストールアンインストールの繰り返しでうんざりしてきたのでレジストリを検索してUninstallStringを一発で表示させるようなPowerShellを書いてみた。一発できれいさっぱりアンインストールするPS1でなくてすいません。:sweat:

---
- **最初に"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\"の下のサブキーの一覧を取得してこのキーと連結したレジストリキーを作成する。**

```PS1
$keys = (Get-Item -Path "Registry::HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*") | Select-String "Uninstall"
```
---
- **$keysの中身はこんな感じになる。**

```
PS C:\Users\Administrator> $keys
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{0C795124-D561-46FC-B4ED-B4F052A8D9E6}
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{0D3E9E15-DE7A-300B-96F1-B4AF12B96488}
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{1D8E6291-B0D5-35EC-8441-6616F567A0F7}
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{2FFF0757-4360-42F5-8814-16BB5CF0145F}
```

---
- **このキー以下のValueの中身を検索し、DisplayNameに"SQL"が含まれるものについてのUninstallStringを抜き出せば良い**

```PS1
$keys|ForEach-Object{
    $dispname = (Get-Item -Path "Registry::$_").GetValue("DisplayName");
    if($dispname -ne $null -and $dispname.IndexOf("SQL") -gt -1){
        "[" + $dispname + "]`t" + (Get-Item -Path "Registry::$_").GetValue("UninstallString");
    }
}
```
---
- **実行するとMsiExecの行が表示される。**

```
[SQL Server 2016 Shared Management Objects]	MsiExec.exe /I{8AC195EB-E1EB-45D8-AEF2-6959C0212BB0}
[SQL Server 2016 XEvent]	MsiExec.exe /I{8CF2CA8E-3984-46B9-B493-F844F3774FA1}
[SQL Server 2016 Client Tools Extensions]	MsiExec.exe /I{AB765DC7-7642-4D1C-BEDC-035516CCD224}
[Microsoft SQL Server 2008 セットアップ サポート ファイル]	MsiExec.exe /X{B326848D-CBFA-4959-A9E6-68AABC11C8E2}
[SQL Server 2016 Shared Management Objects Extensions]	MsiExec.exe /I{B6E1A5EB-1C58-4A04-B76B-E5FE1BE22CA1}
　　・
　　・
　　・
```

**あとはMsiExecのところを抜き出して、"/I"のところは"/X"に置き換えて実行します。GUID以外のMsiExecは実行しない様にしましょう。**
字詰め（カーニング）簡易js （imgのalt属性対応）

字詰めにはいくつかライブラリがありますが、簡易版をスニペットとして。

ざっくりとブロック全体に字詰めjsを適用した時、画像が含まれていると
imgのalt属性内までspanタグが入ってしまいソースが崩れてしまうので
少々トリッキーですがURIEncodeで回避しています。

字詰めの具合はCSSに書いてよしなにしてくださいまし〜。



```js
/**
 * 字詰め（カーニング）js
 * 
 * ex.) _kerning($("#contents"));
 * css) .kerning-before { display: inline-block; margin-left: -0.4em; }
 *      .kerning-after { letter-spacing: -0.2em; }
 */
function _kerning($obj){
	
	// save for alt
	$("img", $obj).each(function(){
		$(this).attr({ alt: encodeURIComponent($(this).attr("alt")) });
	});
	
	// 字詰め
	var html = $obj.html();
	html = html.replace(/([「『（［｛〈《【〔])/g, '<span class="kerning-before">$1</span>');
	html = html.replace(/([」』）］｝〉》】〕、，。．])/g, '<span class="kerning-after">$1</span>');
	$obj.html(html);
	
	// restore for alt
	$("img", $obj).each(function(){
		$(this).attr({ alt: decodeURIComponent($(this).attr("alt")) });
	});
	
}
```
Rubyのメソッド名の付け方、構文を英語とみなしてみる方法。

# 基本
http://www.find-job.net/startup/english-for-engineers-naming-conventions
http://futurismo.biz/archives/2326

#冠詞

newをaに、既に生成されたオブジェクト、定数へのアクセスをtheとする

```Ruby
# an apple
Apple.new

# the warter
Water
```


```ruby
# Alice has the pen.
alice.have(pen)
```

#不定詞
形容詞を取る時はto be

```ruby
# This expect to be blank.
expect(array, &:blank?)
```
動詞を取る時はtoは&

```ruby
# Alice bring something cold to drink.
something = [Milk.new, Beer.new, Liquor.new]

alice.bring(something, :cold, &:drink)
```

#前置詞
キーワード引数にせよ

```ruby
# Alice has a gift for Bob.
alice.have(Gift.new, for: bob)
```

メンバー変数は、変数の中身が前置詞の後に来るイメージ

```ruby
#Alice was registerd at 1988-10-19.
alice.registered_at #=> 1988-10-19

```

#助動詞
アンダーバーでメソッド名のプレフィックスにせよ
iOSっぽくwill didでコールバック登録を表現せよ

```ruby
view.will_appear do
# ...
end
```


#接続詞
文を接続詞とみなし、if文のブロックの中は全て暗黙で後置に文が続いているとみなす。

```ruby
# Alice will help bob if Bob is busy.
alice.help(bob) if bob.busy?

# Mallory will obstruct bob if Bob is busy.
mallory.obstruct(bob) if bob.busy?

if bob.busy?
  alice.help(bob)
  mallory.obstruct(bob)
end
```


#肯定文にハテナマークをつけて疑問文と解釈する

```ruby
# Array is blank?
array.blank?
```

#デフォルト引数でオブジェクトをnewして目的語を省略する

```ruby
class Alice
  def read(book = Book.new)
    # ...
  end
end

# Alice read (a book).
alice.read
```

#グローバル変数でコンテキストを表現して目的語を省略する
ActiveRecordのscopingにならって、スレッドセーフなグローバル変数にする
https://apidock.com/rails/ActiveRecord/Relation/scoping

```ruby
class Alice
  def read(book = current_object)
    # ...
  end
end

def current_object
  Thread.current[:current_object]
end

def current_object=(obj)
  Thread.current[:current_object] = obj
end

def context(obj)
  previous, current_object = current_object, obj
  yield
ensure
  current_object = previous
end

context(Letter.new) do
  # Alice read (the letter).
  alice.read
end
```

#これに影響を受けました
http://qiita.com/gazayas/items/3d352d1b6ec9a225c6f6
Rails + postgresql + Partitionに対応する設定

# 前提

Rails + postgresql でPartitionを切った所ハマったので備忘を残します。
※根本的にはrailsに限った話ではないと思います

# ハマリポイント

端的に↓です。
登録IDつかってゴニョゴニョしたい場合、詰みます。

```ruby
model.save!
model.id # saveしてもidがnilのまま　&　DBにはRecordが出来ている
```

# 回避方法

databse.ymlにinsert_returning=falseの設定を入れる。

```yaml:config/database.yml
development:
  adapter: postgresql
  encoding: utf8
  host: <%= ENV['HOST'] %>
  database: <%= ENV['DATABASE'] %>
  port: 5432
  reconnect: false
  username: <%= ENV['USERNAME'] %>
  password: <%= ENV['PASSWORD'] %>
  pool: 10
  insert_returning: false # ←これを入れる
```


# 何故idがnilになるのか？

insert時にRETURNING区でidを返却させているのですが、これが返って来ない為、idが設定されていません。

```ruby:/lib/active_record/connection_adapters/postgresql/database_statements.rb
        def sql_for_insert(sql, pk, _id_value, _sequence_name, binds)
          unless pk
            # Extract the table from the insert sql. Yuck.
            table_ref = extract_table_ref_from_insert_sql(sql)
            pk = primary_key(table_ref) if table_ref
          end

          if pk && use_insert_returning?
            sql = "#{sql} RETURNING #{quote_column_name(pk)}"
          end

          [sql, binds]
        end
```

なぜRETURNINGが効かないのか？
※DBの設定でRETURNINGは有効です。

ということで、原因は以下参照
https://wiki.postgresql.org/wiki/INSERT_RETURNING_vs_Partitioning

# insert_returning=falseでどうなるのか？

RETURNINGが実行されず、「last_insert_id_result(sequence_name)」が実行される。
ここで、同一トランザクションかつinsert直後に最新Sequenceを取る。
ということで、これで取れるようになります。

```ruby:/lib/active_record/connection_adapters/postgresql/database_statements.rb
        def exec_insert(sql, name, binds, pk = nil, sequence_name = nil)
          val = exec_query(sql, name, binds)
          if !use_insert_returning? && pk # ←ここに入る様になる
            unless sequence_name
              table_ref = extract_table_ref_from_insert_sql(sql)
              sequence_name = default_sequence_name(table_ref, pk)
              return val unless sequence_name
            end
            last_insert_id_result(sequence_name)
          else
            val
          end
        end
```



```ruby:/lib/active_record/connection_adapters/postgresql_adapter.rb
      def last_insert_id_result(sequence_name) #:nodoc:
        ret = exec_query("SELECT currval('#{sequence_name}')", 'SQL')
        ret
      end
```
UIViewをTextViewのkeyboardにinputView 


![on.gif](https://qiita-image-store.s3.amazonaws.com/0/135794/b05107e8-bed8-f498-a4cc-ee6515df5b3c.gif)

iOS版のevernoteではこのような実装がありますよね。どうやってるんだと調べながら実装してみました。実装自体はツールバーをinputaccessoryするのと同じノリで結構安易に動きます。備忘録の為に書き残しておきます。

# リファレンス

```reference.swift

// Presented when object becomes first responder.  If set to nil, reverts to following responder chain.  If
    // set while first responder, will not take effect until reloadInputViews is called.
    open var inputView: UIView?

    open var inputAccessoryView: UIView?


```

# 実装

```ViewController.swift


import UIKit
let TestView = UIView.init(frame: CGRect.init(x: 0, y: 0, width: 250, height: 250))


class ViewController: UIViewController, UITextViewDelegate {
    
    @IBOutlet weak var textView: UITextView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        textView.delegate = self
        let bgColor = UIColor.blue
        TestView.backgroundColor = bgColor
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
    
    func keyboardToolbar(textView: UITextView) {
        
        let toolbar: UIToolbar = UIToolbar(frame: CGRect(x: 0, y: 0, width: 1, height: 1))
        toolbar.barStyle = UIBarStyle.default
        toolbar.bounds.size.height = 28
        
        let flexSpace = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.flexibleSpace, target: nil, action: nil)
        
        
        let done: UIBarButtonItem = UIBarButtonItem(title: "keyboard", style: UIBarButtonItemStyle.done, target: self, action: #selector(self.doneButtonActionn))
        done.tintColor = UIColor.red
        
        let clear: UIBarButtonItem = UIBarButtonItem(title: "UIView", style: UIBarButtonItemStyle.plain, target: self, action: #selector(self.doneButtonAction))
        clear.tintColor = UIColor.black
        
        
        var items = [UIBarButtonItem]()
        
        items.append(clear)
        items.append(flexSpace)
        items.append(done)
        toolbar.items = items
        toolbar.sizeToFit()
        textView.inputAccessoryView = toolbar
    }
    
    func doneButtonAction() {
        textView.inputView = TestView
        textView.resignFirstResponder()
        textView.becomeFirstResponder()
    }
    
    func doneButtonActionn() {
        textView.inputView = nil
        textView.reloadInputViews()
    }
    
    func textViewShouldBeginEditing(_ textView: UITextView) -> Bool {
        self.keyboardToolbar(textView: textView)
        return true
    }
}

```

# 参考

[switching inputview for uitextfield](https://stackoverflow.com/questions/12919234/switching-inputview-for-uitextfield)
[How to refresh keyboard/returnKey while editing textField in Swift?](https://stackoverflow.com/questions/38662541/how-to-refresh-keyboard-returnkey-while-editing-textfield-in-swift)
macOSのバージョン番号を取得する方法一覧



```Swift
//OSX 10.10以降
print(ProcessInfo.processInfo.operatingSystemVersion)
//OperatingSystemVersion(majorVersion: 10, minorVersion: 12, patchVersion: 5)
print(ProcessInfo.processInfo.operatingSystemVersion.majorVersion)
//10
print(ProcessInfo.processInfo.operatingSystemVersion.minorVersion)
//12
print(ProcessInfo.processInfo.operatingSystemVersion.patchVersion)
//5


print(ProcessInfo.processInfo.operatingSystemVersionString)
//Version 10.12.5 (Build 16F73)

if let dict: NSDictionary = NSDictionary(contentsOfFile: "/System/Library/CoreServices/SystemVersion.plist") {
    if let version = dict.object(forKey: "ProductVersion") as? String {
        print(version)
    }
}
//10.12.5

```




[NSProcessInfo](http://cocoaapi.hatenablog.com/entry/10010625/NSProcessInfo)

```ProcessInfo
    /* Human readable, localized; appropriate for displaying to user or using in bug emails and such; NOT appropriate for parsing */
    open var operatingSystemVersionString: String { get }

    
    @available(OSX 10.10, *)
    open var operatingSystemVersion: OperatingSystemVersion { get }
```
(初心者向け)Swift3.0で初アプリ - センサー値を表示してみる(工事中)

Swift3.0を使って簡単なiPhoneアプリを作ってみます
[初心者向け）Swift3.0で簡単なiPhoneアプリを作ってみる](http://qiita.com/egplnt/items/e8da2b9af1037e179a57)で作ったシンプルなSwift3.0アプリでセンサー値を表示してみます

#1. 新しいアプリを用意します
- Xcodeの「File」→「New」→「Project」から新しいiOSアプリを作成します
- Single View Applicationを選択し、「sensorapp」など適当なアプリ名を指定します。以前開いていたfirstswiftappなどは「Close Project」で閉じてしまって構いません

#2. センサーを使用可能にします
- ViewController.swiftへ下記をコピペします

#（工事中）
Rundeckにてグローバル変数を定義する

## 概要

Rundeckにてグローバルな変数の設定方法をまとめておきます。
Rundeckではプロジェクト横断的に利用できるグローバル変数とプロジェクト内部で横断的に利用できるグローバル変数の2種類が定義可能です。
公式ドキュメントは下記となります。

* http://rundeck.org/docs/administration/configuration-file-reference.html#global-execution-variables
* http://rundeck.org/docs/administration/configuration-file-reference.html#project-global-execution-variables

## 環境情報

* Rundeck: v2.8.2
* OS: Amazon Linux 2017.03

## プロジェクト横断的に利用できるグローバル変数

Grobal execution varibleと言われています。
`framework.properties`にて`framework.globals.KEY=VALUE`の形式で定義します。

```properties:/etc/rundeck/framework.properties
framework.globals.env=production
```

各JOBからは`${globals.KEY}`の形式で参照可能です。

```
echo ${globals.env} // production
```

## プロジェクト内部で横断的に利用できるグローバル変数

Project Global execution variablesと言われています。
各`project.properties`にて`project.globals.KEY=VALUE`の形式で定義します。

```properties:$RDECK_BASE/projects/[PROJECT-NAME]/etc/project.properties
project.globals.env=production
```

各JOBからは`${globals.KEY}`の形式で参照可能です。

```
echo ${globals.env} // production
```

なお`framework.properties`で定義した変数と`project.properties`で定義した変数が重複する場合は、`project.properties`で定義した値が優先されます。
[Objective-C]3D Touch対応端末でshouldInteractWithURLが複数コールされる場合の対処

3D Touch対応端末だとリンクを強く長押しした際にshouldInteractWithURLが２度呼ばれるためハマッた。対処法が若干黒魔法的な手法にはなってしまうが。。

##用途
UITextViewのDataDetectorsで指定したリンカブルな文字列を長押しした場合にSafariに飛ばさず自前で実装する場合

##対応方法
UITextViewに含まれるgestureRecognizersからUIGestureRecognizerを取り出し、特定のゼスチャーを無効にする。アプリ全体で使用するならカテゴリ化すると良い。

3D Touch対応端末かどうかの判定を処理実行前に分岐させるのが望ましい。

```UITextView+Extension.m
for (UIGestureRecognizer *gesture in self.gestureRecognizers) {
   NSString *gestureClassName = NSStringFromClass([gesture class]);
   if ([gestureClassName isEqualToString:@"_UIRevealGestureRecognizer"]) {
         gesture.enabled = NO;
   }
}
```


##備考
リンクを長押しした時のハイライト表示の挙動をいじりたい場合は同じくgestureRecognizersに含まれるゼスチャーを取り出してenabledの値を指定すると解決する模様。
Oracle Data Pumpを使用したダンプ・ファイル分割エクスポート・インポートの注意点

#目次
1.本記事の概要
2.ダンプ・ファイル分割エクスポートのコマンド例
3.分割エクスポートの使用場面例
4.分割エクスポートの注意点

#1.本記事の概要
本記事では、Oracle Data Pump（※1）のエクスポートコマンドに用意されているFILESIZEパラメータを使用し、指定したファイルサイズでダンプファイルを分割エクスポートする際の注意点について記載する。
※1：Oracle Data Pumpとはデータおよびメタデータをデータベース間で高速に移動するための、Oracle標準ユーティリティである。Data Pumpに関する詳しい仕様は下記をご参照。
　　 ・[Oracle公式ドキュメント(Oracle 12c)](https://docs.oracle.com/cd/E49329_01/server.121/b71303/dp_overview.htm)

#2.ダンプ・ファイル分割エクスポートのコマンド例
エクスポート操作では、ファイル名に置換変数(%U)を使用してDUMPFILEパラメータで複数のダンプ・ファイルをエクスポートすることが可能。ダンプ・ファイルは、%Uに対応して01から02、03と連番で作成されていく。

サンプルコマンドは下記の通り。

```EXPORT.BAT
EXPDP scott/tiger@TESTDB DIRECTORY=DATA_PUMP_DIR
DUMPFILE=EXP_%U.DMP LOGFILE=EXP.LOG
FILESIZE=20GB SCHEMAS=hr
```

例えば、上記コマンドで100GBのスキーマをエクスポートした場合、下記（1）→（2）→（3）→（4）→（5）の順で20GB毎の5つのダンプ・ファイルが作成される。
（1）EXP_01.DMP
（2）EXP_02.DMP
（3）EXP_03.DMP
（4）EXP_04.DMP
（5）EXP_05.DMP

#3.分割エクスポートの使用場面例
ダンプ・ファイルの分割エクスポートを使用するシチュエーションとして、ダンプ・ファイル出力後に他サーバや外部記憶媒体等にコピーする場面が考えられる。
その場合、例えば100GBのエクスポートに100分要するならば、コピーを開始できるのは最短で100分後からである。
しかし、100GBをいくつかのダンプ・ファイルに分割してエクスポートすれば、出力が完了したダンプ・ファイルから順次コピー処理を開始でき、作業時間の短縮を図ることができる。

#4.分割エクスポートの注意点
「3.分割エクスポートの使用場面例」において、エクスポートしたダンプ・ファイルを順次コピーする例を挙げたが、このコピーするタイミングに関して注意しなければならないことがある。
ダンプ・ファイルを分割してエクスポートする際、エクスポートされる最初のファイルと最後のファイルはエクスポート処理全体に関する管理情報を保持している。よって、全ダンプ・ファイルのエクスポートが完了するまで最初に作成されたダンプ・ファイルをコピーしてはならない。
つまり、上記100GBエクスポートの例の場合、ダンプ・ファイル（2）→（3）→（4）はファイルが作成された時点からコピー可能であるが、（1）は全てのエクスポート処理が完了した後初めてコピーが可能となる。（1）が出力された時点でコピーしてしまうとエクスポート処理に関する管理情報が不足し、壊れたダンプ・ファイルとなってしまう。その結果、取得したダンプ・ファイルのインポート処理が正常に行えなくなってしまう。


※ここに示された意見は私個人の見解であり、所属する組織の公式見解を代表するものではありません。
　また、記載した技術的内容・見解については、ご自身の責任でご判断下さい。
mysqldumpでバイナリデータを扱う場合のオプション

#やったこと
BLOB型やGEOMETRY型も含めたデータを移行する必要があったのでその時に使ったオプションです。
次やる時には絶対忘れそうなところなので、残しておこうかと。

| オプション名 | 説明 |
|:---:|:---:|
| --hex-blob | バイナリカラムを 16 進変換表記法を使用してダンプ |

#実際のコマンド
###バックアップ作成
```mysql

mysqldump -h ホスト名 -u ユーザ名 -p データベース名 --hex-blob > dump_data.sql

```


###データ登録
```sql

mysql -h ホスト名 -u ユーザ名 -p データベース名 < dump_data.sql

```


#参考：
mysqldumpでバックアップをする時につけるオプション
http://oinume.hatenablog.com/entry/wp/292
Windows認証させる StreamRelay.NET.exe

接続時に、認証をしてくれるストリーム[System.Net.Security.NegotiateStream](https://msdn.microsoft.com/ja-jp/library/system.net.security.negotiatestream(v=vs.110).aspx)クラスがあるので、これを使うことで、Workstation上では同一ユーザ/パスワードのプロセス、またはNTドメイン(ActiveDirectory)上の場合は同一ドメインユーザでないと認証されないと思う。

---
### Windows認証させる StreamRelay.NET.exe

サーバ側(192.0.2.1)

`StreamRelay.NET.exe -LocalPort 91 -RemotePort 80 -RemoteHost 192.0.2.2 -LocalProxy netstream:///?NTLM`
とすると、91/tcpに接続するには、NTLM認証(Windows統合認証)が必要となる

クライアント側

`StreamRelay.NET.exe -LocalPort 90 -RemotePort 91 -RemoteHost 192.0.2.1 -RemoteProxy netstream:///?NTLM`
とすると、互いに認証されて接続される

---
### Windows認証させるリモート・シェル

`nc -nvv -l -p 90 -e cmd.exe`
⇔
`StreamRelay.NET.exe -LocalPort 90 -RemotePort -1 -RemoteProgram cmd.exe`

では、認証のないリモート・シェル・サービスだけど、

`StreamRelay.NET.exe -LocalPort 90 -RemotePort -1 -RemoteProgram cmd.exe -LocalProxy netstream:///?NTLM`

としてあげると、認証機能付(Windows統合認証)リモート・シェル・サービスになるよ。

---
### 目次へ戻る

[目次というか最初の一歩](http://qiita.com/tomoki0sanaki/items/85f20cbe18378e33cd6f)
ゲートウェイとしての StreamRelay.jar

`java.exe -Djava.security.policy=StreamRelay.policy -jar StreamRelay.jar`
⇔
`StreamRelay.bat`

ストリームの実体として、TCPやUDPだけではなく、RMI や Corba などが指定できるので、プロトコル変換器としても利用できる

---
### RMIへ変換

サーバ側ではRMIレジストリサービスを起動する

`START /min rmiregistry.exe`
という感じ。その際に、StreamRelay.jar はクラスパスで検索できるようにしておかないとダメだ。

なので、
`SET CLASSPATH=%CLASSPATH%;.`
`START /min rmiregistry.exe`

という感じか・・・

サーバ側
`java.exe -Djava.security.policy=StreamRelay.policy -jar StreamRelay.jar -LocalPort 1099 -LocalRMI -RemotePort 0`

クライアント側
`java.exe -Djava.security.policy=StreamRelay.policy -jar StreamRelay.jar -LocalPort 0 -RemotePort 1099 -RemoteRMI -RemoteHost 192.0.2.1`

で、RMI で通信する

パケットキャプチャで、どんなだろ・・・という時に使えるかもしれない。

---
### Corbaへ変換

サーバ側ではCORBAオブジェクトブローカーサービスを起動する

`START /min orbd.exe -ORBInitialPort 1050`

という感じか・・・

サーバ側
`java.exe -Djava.security.policy=StreamRelay.policy -jar StreamRelay.jar -LocalPort 1050 -LocalCORBA -RemotePort 0`

クライアント側
`java.exe -Djava.security.policy=StreamRelay.policy -jar StreamRelay.jar -LocalPort 0 -RemotePort 1050 -RemoteCORBA -RemoteHost 192.0.2.1`

で、CORBA で通信する

パケットキャプチャで、どんなだろ・・・という時に使えるかもしれない。

---
### オプション

`-LocalObjectName "リモート名"`
`-RemoteObjectName "リモート名"`

既定はRMI/CORBA共に「StreamRelay」だけど、変更したい時に指定すればよい

`-LocalHeartbeat`
`-RemoteHeartbeat`

ハートビート、つまり相手が待機中かどうかハートビートメッセージを定期的に送りあうかどうかの設定。

---
### マルチキャストUDPへ変換

マルチキャストアドレス(224.0.0.4)とUDPポート(33333/udp)という相手と、コンソール間でのデータ交換の場合

ローカルと呼称する側にマルチキャストを対応させる場合はこんな感じ
`java.exe -Djava.security.policy=StreamRelay.policy -jar StreamRelay.jar -LocalHost 224.0.0.4 -LocalPort 33333 -LocalUDP -RemotePort 0`

リモートと呼称する側にマルチキャストを対応させる場合はこんな感じ
`java.exe -Djava.security.policy=StreamRelay.policy -jar StreamRelay.jar -LocalPort 0 -RemoteHost 224.0.0.4 -RemotePort 33333 -RemoteUDP`

パケットキャプチャで、どんなだろ・・・という時に使えるかもしれない。

マルチキャストUDPは、コンソールなどと同じ扱い(一つの共通のスレッド)にしている
つまり
`java.exe -Djava.security.policy=StreamRelay.policy -jar StreamRelay.jar -LocalPort 90 -RemoteHost 224.0.0.4 -RemotePort 33333 -RemoteUDP`
の場合、ローカルと呼称する側に接続がある度に、リモート側のオブジェクトを生成するのではなく、一つのオブジェクトが複数のローカル側のオブジェクトと対話するようになっている(ブロードキャストモード/ブローカーモード)

---
### 目次へ戻る

[目次というか最初の一歩](http://qiita.com/tomoki0sanaki/items/85f20cbe18378e33cd6f)
カスタムメトリクスのインスタンスIDがちがうときは

# cloudwatchでカスタムメトリクスを取りたいとき
* ここに丁寧にかかれてますね
 * http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/mon-scripts.html

# pushはできてるようだが、cloudwatchの画面では・・・
* いつまでもインスタンス名がでない、というかインスタンスIDが違う
* インスタンスIDをコマンドラインで指定するのか、否そんなパラメータはない

# なんと
* これで解決します
* AMIとったときのキャッシュが残っていてそれをずっと参照するから

```bash:qiita.sh
rm -rf /var/tmp/aws-mon/*
```

# 実は公式ページの一番下に書いてあるんだなぁ
* はい、みなさんドキュメントはちゃんと読みましょう・・・
 * もうしわけございまんでしたm(_ _)m
* 誰か同じようにハマらないことを切に願う
【消えゆく灯】ADPのソースをテキストとして抽出【さよならADP】

もうすぐサポートも切れて使えなくなる ADP
まだまだ現役で使われている ADP

ADP なんて存在知らなかったけど、ADPをコンパイル？して ADEにするとまぁ良い感じに使えるアプリ？VBA？ではあるんですね

なぜか ADP を利用しているシステムに関わることになったので、
原本管理？的な意味合いでプログラムソースをテキストファイルとして
抽出できるようにしてみました

やっつけ仕事ですが、まぁ修正箇所なんかがよくわかるようになったのでそこそこ使えるかな

使い方は新しいモジュールでも追加して、以下ソースを張り付けて、SaveProject() を実行するだけ


```vbnet
Option Compare Database
Option Explicit


'// プロジェクトのフォームやらコードやらをごっそり保存する
Sub SaveProject()
    With Application.CurrentProject
    Call SaveAsText(.AllForms, "form")            '// フォーム
    Call SaveAsText(.AllMacros, "macro")          '// マクロ
    Call SaveAsText(.AllModules, "module")        '// モジュール
    Call SaveAsText(.AllReports, "report")        '// レポート
    End With
End Sub


'// オブジェクトをテキストファイルとして保存
Private Sub SaveAsText(obj As Object, ext As String)
    Dim i
    For Each i In obj
        DoEvents
        Debug.Print UCase(ext) & "," & i.name
        Application.SaveAsText _
            i.Type, _
            i.name, _
            Application.CurrentProject.Path & "\" & _
                VaridateFileName(i.name & "." & LCase(ext))
    Next
End Sub


'// ファイル名に利用できない文字を削除 \ / : * ? " < > |
Private Function VaridateFileName(ByVal name As String) As String
    Dim key
    For Each key In Array( _
          "\\", _
          "/", _
          ":", _
          "*", _
          "?", _
          """", _
          "<", _
          ">", _
          "|" _
    )
        name = Replace(name, key, "")
    Next
    VaridateFileName = name
End Function
```
Coursera Machine Learning の受講記録（シラバス）

[Machine Learning by Stanford University](https://www.coursera.org/learn/machine-learning/home/welcome)受講記録
# Week1
- シラバス
	- Introduction
	- Linear Regression with One Variable　線形回帰
	- Linear Algebra Review　線形代数の基礎
- [Week1の受講メモ](http://qiita.com/agotoh/private/d1fb18af64b6f083a9ef)

# Week2
- シラバス
	- Linear Regression with Multiple Variables　多変量線形回帰
	- Octave/Matlab Tutorial　
- [Week2の受講メモ](http://qiita.com/agotoh/private/964062c4813d3b41801a)

# Week3
- シラバス
	- Logistic Regression　ロジスティック回帰
	- Regularization　正規化
- [Week3の受講メモ](http://qiita.com/agotoh/private/651ff624d34c1fcaecfe)

#Week4
- シラバス
	- Neural Networks: Representation
- [Week4の受講メモ](http://qiita.com/agotoh/private/31facaabe8f28a661a1d)

#Week5
- シラバス
	- Neural Networks: Learning
- [Week5の受講メモ](http://qiita.com/agotoh/private/7493cbde972294f0e33b)

#Week6
- シラバス
	- Advice for Applying Machine Learning　モデルの適用法など機械学習の実務適用へのアドバイス
	- Machine Learning System Design
	
- [Week6の受講メモ](http://qiita.com/agotoh/private/a1c0c02956bf61f7776a)

#Week7
- シラバス
	- Support Vector Machines サポートベクターマシン(SVM)
- [Week7の受講メモ](http://qiita.com/agotoh/private/1c16651bb8397be86cfb)

#Week8
- シラバス
	- Unsupervised Learning　教師なし学習
	- Dimensionality Reduction　次元削減　主成分解析(PCA)等
- [Week8の受講メモ](http://qiita.com/agotoh/private/1d6cf8bd845604d882f7)

#Week9
- シラバス
	- Anomaly Detection アノマリー検出
	- Recommender Systems
- [Week9の受講メモ](http://qiita.com/agotoh/private/a275aa0e327a0d84fbfa)

#Week10
- シラバス
	- Large Scale Machine Learning
Qtアプリでステータスバーに長いテキストを設定するとメインウィンドウの幅が広がる問題(PySide版)

#はじめに
このtipsは以下と同じ問題をPySideで解決する場合のやり方だよ！
http://qiita.com/soramimi_jp/items/3d4e800e3d86ed216deb

#たいさく
PySideで強制的に広がらないクラスを作りましょう。


```py3:StatusLabel.py

# -*- coding: utf-8 -*-
from PySide import QtGui
class StatusLabel(QtGui.QLabel):

    def __init__(self,parent=None):
        super(StatusLabel,self).__init__(parent)

    def minimumSizeHint(self):
        sz = QtGui.QLabel.minimumSizeHint(self)
        sz.setWidth(0)
        return sz

```
mainwindowでいい感じに使いましょう。

```py3:mainwindow.py
# -*- coding: utf-8 -*-
from StatusLabel import StatusLabel
class MainWindow(QtGui.QMainWindow,Ui_MainWindow):

    def __init__(self, parent=None):

        super(MainWindow, self).__init__(parent)
        self.setupUi(self)
        self.statuslabel = StatusLabel("a long text......")
        self.statusBar.addWidget(self.statuslabel)

```

おしまい。

どうでもいいけどC(++)とPython行ったり来たりするの辛いヨ。。
ゲートウェイとしての StreamRelay.NET.exe

ストリームの実体として、TCPやUDPだけではなく、[名前付きパイプ](https://msdn.microsoft.com/ja-jp/library/system.io.pipes(v=vs.110).aspx)などが指定できるので、プロトコル変換器としても利用できる

名前付きパイプのストリームは[System.IO.Pipes.NamedPipeClientStream](https://msdn.microsoft.com/ja-jp/library/system.io.pipes.namedpipeclientstream(v=vs.110).aspx)とか[System.IO.Pipes.NamedPipeServerStream](https://msdn.microsoft.com/ja-jp/library/system.io.pipes.namedpipeserverstream(v=vs.110).aspx)
とかなんだけど、双方向を示す[System.IO.Pipes.PipeDirection](https://msdn.microsoft.com/ja-jp/library/bb344934(v=vs.110).aspx)があるけど、
read始めたら(別スレッドから)writeできないなど、実質双方向ではないようだ。

---
### 名前付きパイプへ変換

名前付きパイプは、ポート番号「-2」

上記の仕様なので、ポート番号「-2」では、名前付きパイプを2本(リクエストの方向とレスポンスの方向)使う。

なので、

サーバ側
`StreamRelay.NET.exe -VerboseMode -LocalPort -2 -RemotePort 0 -LocalName StreamRelay`

クライアント側
`StreamRelay.NET.exe -VerboseMode -LocalPort 0 -RemotePort -2 -RemoteName StreamRelay -RemoteHost 192.0.2.1`

で、名前付きパイプの名前「StreamRelay」で通信する

パケットキャプチャで、どんなだろ・・・という時に使えるかもしれない。

---
### 標準入出力のリダイレクト先としての名前付きパイプ

標準入出力(ポート番号=0)のリダイレクトとしてファイルとかが使えるのだが、以下のオプションで名前付きパイプもリダイレクト先として指定できる。

-LocalInputNamePipe "名前"
-LocalOutputNamePipe "名前"
-RemoteInputNamePipe "名前"
-RemoteOutputNamePipe "名前"

これは、上記の仕様(双方ではない)から、一本ずつ(リクエストのみとかレスポンスのみ)とか指定できるようにしてみた。

---
### マルチキャストUDPへ変換

マルチキャストアドレス(224.0.0.4)とUDPポート(33333/udp)という相手と、コンソール間でのデータ交換の場合

ローカルと呼称する側にマルチキャストを対応させる場合はこんな感じ
`StreamRelay.NET.exe -LocalHost 224.0.0.4 -LocalPort 33333 -LocalUDP -RemotePort 0`

リモートと呼称する側にマルチキャストを対応させる場合はこんな感じ
`StreamRelay.NET.exe -LocalPort 0 -RemoteHost 224.0.0.4 -RemotePort 33333 -RemoteUDP`

パケットキャプチャで、どんなだろ・・・という時に使えるかもしれない。

マルチキャストUDPは、コンソールなどと同じ扱い(一つの共通のスレッド)にしている
つまり
`StreamRelay.NET.exe -LocalPort 90 -RemoteHost 224.0.0.4 -RemotePort 33333 -RemoteUDP`
の場合、ローカルと呼称する側に接続がある度に、リモート側のオブジェクトを生成するのではなく、一つのオブジェクトが複数のローカル側のオブジェクトと対話するようになっている(ブロードキャストモード/ブローカーモード)

---
### .NET Remoting(WCF)へ変換

ver3.2.0.0 で実装した。

ポート番号は、「0以上」

必須オプションは、

- LocalRemotingType [tcp/icp/http]

または

- RemoteRemotingType [tcp/icp/http]

[Local|Remote]RemotingType のオプションは
- **tcp** .NET Remoting を tcp 経由で行う
- **http**  .NET Remoting を http 経由で行う
- **icp*** .NET Remoting を icp(LPC) 経由で行う。これはRemote側の場合は「-RemoteHost」のオプションは必要ない

既定の接続ポイント名は「remoteObj」

変更する場合は、

- LocalRemotingType "name"

または

- RemoteRemotingType "name"

を指定すればよい。

相手側の死活監視をしたい場合は

- LocalRemotingHeartbeat

または

- RemoteRemotingHeartbeat

を指定する。
「--ThreadInterval」(既定は500ms)*3(既定は500*3=1500ms) の間、データ受信がないと、死活監視のリモートメソッドを発行する。

他には

- LocalRemotingSecure

または

- RemoteRemotingSecure

オプションもある

---
### 目次へ戻る

[目次というか最初の一歩](http://qiita.com/tomoki0sanaki/items/85f20cbe18378e33cd6f)
IntelliJ IDEA(PhpStorm)からDocker上のphpでphpunitを実行する

ほとんど本家の記事の意訳に近いですが、Intellijからdocker上のphpでphpunitを動かす設定をしてみました。
本家の記事: https://blog.jetbrains.com/phpstorm/2016/11/docker-remote-interpreters/

# 環境
- IntelliJ IDEA 2017.1.4
    - PHP Docker pluginをインストール

手元で確認はしていないですが、元訳がPhpStormなので、PhpStormでも同じかと思います。

# Remote Interpreterの設定
- Preferences -> Languages & Frameworks -> PHPを開きます
- CLI Interpreterの[…] ボタンをクリックします
- CLI Interpretersの画面が開くので左上の[+]をクリックし[From Docker, Vagrant, VM, Remote...]を選択します
- Remote PHP Interpreterの設定画面でDockerを選択します
    - Serverの[New]ボタンをクリックします
        - サーバーの設定画面が開くので、[OK]をクリックします  
※必要な場合は設定を変更してください
    - Image nameで適当なコンテナを選択します


<img width="588" alt="スクリーンショット 2017-06-21 15.07.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/12513/34ed2d9e-8060-c146-8069-b7128a41b627.png">

# CLI Interpreterの設定
Remote Interpreterの設定が成功していると[PHP executable]にPHPのバージョンなどの情報が表示されます
<img width="645" alt="スクリーンショット 2017-06-21 15.35.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/12513/0547c385-46af-e987-3d9e-3ef202156252.png">

# PHPUnitの設定
- Preferences -> Languages & Frameworks -> PHP -> PHPUnitを開きます
- 左上の[+]をクリックし[By Remote Interpreter]を選択します
- PHPUnitの設定が開くので、Containerの設定やPHP Libraryの設定、PHPUnitの設定ファイルの設定をします
    - 設定がうまく行けばPHPUnitのバージョンが表示されます

<img width="800" alt="スクリーンショット 2017-06-21 15.40.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/12513/2abb75e9-667a-1a89-5da9-5364722371a9.png">

# 実行
これでPHPUnitを実行する準備は整ったので、PHPUnitを実行してみます。
設定がうまくいけばRunのwindowにPHPUnitの実行結果が表示されます。
slick.js のフリックが iOS10 で動かないとき

## iOS 10 になってからフリックが効かない時の対処法

通常slick指定の後に以下の記述を追記

```JavaScript
$('.carousel').bind('touchstart', function(){
  return true;
});
```

これできっと動くはず。動かない場合はその外側の要素を指定するといいかもしれない。

### 参考
- [swipe not working on iPhone running iOS 10 · Issue #2677 · kenwheeler/slick · GitHub](https://github.com/kenwheeler/slick/issues/2677)
Unity覚書(unit test harness)

#Unity覚書(Unit Test Harness)
組み込みでテスト駆動開発がしたくなったので勉強を始めました。
[参考書](https://pragprog.com/book/jgade/test-driven-development-for-embedded-c)
覚書を作成しています。

#Unity
UnityはC専用のテストハーネスです。
ゲーム開発エンジンを期待された方は申し訳ありませんが、
本稿では取り扱いませんのでよろしくお願いします。

##環境
私の作業場所で扱う計算機が下記の様に異なりますが、
特に区別せずに作業しています、ご了承ください。

+ Debian8 bash gcc-4.9.2
+ macOS-X bash Apple LLVM version 8.1.0 (clang-802.0.42)

利用するUnityはテキストで扱われている
James Grenning氏によって機能追加がされている物を使います。
C開発環境はテキストでいうところの"gcc users"です。

##準備
上記参考書のWEBサイトから手に入るソース内にある、
README.txtに書かれていた手順で準備を行いました。
README.txtに書かれていなかった事や備考を列挙します。

+ cpputestのバージョンは3.8をDLしました。
+ configure.shが見当たらなかったので代わりにconfigureを直接実行しました。
+ テストの結果として幾つかfailuresが出ましたがテキスト内で修正する項が出るのを期待し無視しました。※1
+ CppUTestを試した際にCppUTest内(メモリリーク検出マクロ(?))でlonglong型に対するエラー(C90ではサポートされていない)が出たためCppUTestのMakefileWorker内でCCに-std=c99を追加しました。

※1 試しにt0のテストで出たfailuresはtests/HomeAutomation/RandomMinuteTest.cppの
CHECK(hit[i] > 0) failedの条件を=>にしたところfailuresがなくなったので
このまま様子を見ることにします。

##Unityの概要
###実行
Unityの実体はunity.frameworkに入っており、
提供されるmakefileを自分のmakefile(必要な変数を定義)にincludeすることで
コンパイル、必要なオブジェクトとのリンク、実行を行ってくれます。

###記述
テストは下記の構造で記述します。

+ Test Case:事前条件の用意→対象コードの実行→事後条件の確認を行う
+ Test Fixture:Test Case用の共通部分や環境
+ Test Runner:Test Caseの呼び出し

![unity概要.png](https://qiita-image-store.s3.amazonaws.com/0/96333/b4e5877f-5160-7138-faa3-d412c7256d7e.png)

###マクロ
代表的なマクロは以下の通りです。

####Test Case

|macro|memo|
|---|---|
|TEST(TestGroupName, TestName)|TestRunnerが呼び出すテストの内容を記入|
|TEST_ASSERT_TRUE(condition)|ブール条件が真か確認する|
|TEST_ASSERT_FALSE(condition)|ブール条件が偽か確認する|
|TEST_ASSERT_EQUAL(num1, num2)|数値を比較して同じか確認する|
|TEST_ASSERT_EQUAL_INT(num1, num2)|整数を比較して同じか確認する|
|TEST_ASSERT_EQUAL_STRING(str1, str2)|文字列を比較して同じか確認する|
|TEST_ASSERT_BYTES_EQUAL(b1, b2)|1byte分比較してが同じか確認する|
|TEST_ASSERT_POINTES_EQUAL(p1, p2)|ポインタを比較してが同じか確認する|
|TEST_ASSERT_FLOAT_WITHIN(f1, f2, tolerance)|floatを指定した許容範囲内で同じか確認する|
|TEST_ASSERT_MESSAGE(text)|テストを失敗させた後、メッセージ出力する|
|TEST_ASSERT_EQUAL_HEX16(b1, b2)|16bit分比較してが同じか確認する|

####Test Fixture

|macro|memo|
|---|---|
|TEST_GROUP(TestGroupName)|TestGroupを用意|
|TEST_SETUP(TestGroupName)|TestGroupに対するテスト開始時の処理|
|TEST_TEAR_DOWN(TestGroupName)|TestGroupに対するテスト終了時の処理|

####Test Runner

|macro|memo|
|---|---|
|TEST_GROUP_RUNNER(TestGroupName)|TestRunnerを用意(TestCaseを登録してTEST_SETUP(TestGroupName)とTEST_TEAR_DOWN(TestGroupName)が呼び出されるようにする)|
|RUN_TEST_CASE(TestGroupName, TestName)|TestCaseを呼び出す|
|RUN_TEST_GROUP(TestGroupName)|指定したTestGROUPを実行する|

※RUN_TEST_GROUPを実行する関数をUnityMainの第3引数に渡して実行します。

```C
#include "unity_fixture.h"

static void
RunAllTests(void)
{
	RUN_TEST_GROUP(sprintf);
}

int
main(int argc, char * argv[])
{
	return UnityMain(argc, argv, RunAllTests);
}
```

###出力
テストに失敗するとFailuresに計上されます。
すべてのテストが成功するとOKと出力されます。

```bash
Running BookCode_Unity_tests
Unity test run 1 of 1
..
-----------------------
2 Tests 0 Failures 0 Ignored
OK
```
スクリプト実行サーバ(NodeJSの代替)として StreamRelay.jar

`java.exe -Djava.security.policy=StreamRelay.policy -jar StreamRelay.jar`
⇔
`StreamRelay.bat`

Sample\SampleScript\ の下に、スクリプトのサンプルがある

---
### スクリプト実行サーバとしてのStreamRelay.jar

受信したデータを指定したスクリプトで加工して、差し戻したり、転送してりすることができる。

例えば、こんな感じ

`java.exe -Djava.security.policy=StreamRelay.policy -jar StreamRelay.jar -localport 90 -remoteport 0 -ScriptFile Sample\SampleScript\echo.js`

90/tcpでECHOサーバとして動作する

---
### オプション

<dl>
 <dt>-ScriptFile "FileName"
  <dd>スクリプトファイルを指定
 <dt>-ScriptCharset "CharName"
  <dd>スクリプトファイルの文字コードを指定
 <dt>-ScriptLanguage "name"
  <dd>スクリプト言語の指定
 <dt>-ListScriptLanguage
  <dd>現状のクラスパス指定の中でのスクリプト言語の一覧
<dl>


---
### スクリプト言語

JSR223に対応したエンジンをクラスパスに読み込ませれば任意の言語をスクリプトとして実行できる

動作確認したのは

- Jython
- Jruby
- Groovy
- LuaJ
- JudoScript
- Pnuts
- BeanShell
- OGNL
- PHP
- Clojure
- Jacl (TclJava)
- Scheme(SISC{Second Interpreter of Scheme Code})
- (Scala)

---
### サンプルスクリプト

\Sample\SampleScript\ 以下にある。

---
### 本家ページの説明部分

[JSR223 対応のスクリプトについて](http://rocketeer.dip.jp/sanaki/free/jfree11.htm#JSR223ScriptDetail)

---
### 目次へ戻る

[目次というか最初の一歩](http://qiita.com/tomoki0sanaki/items/85f20cbe18378e33cd6f)
スクリプト実行サーバ(NodeJSの代替)として StreamRelay.NET.exe

Sample\ScriptFile\ の下に、スクリプトのサンプルがある

---
### スクリプト実行サーバとしてのStreamRelay.NET.exe

受信したデータを指定したスクリプトで加工して、差し戻したり、転送してりすることができる。

例えば、こんな感じ

`StreamRelay.NET.exe -LocalPort 91 -RemotePort 0 -JScriptFile Sample\ScriptFile\echo.js`

91/tcpでECHOサーバとして動作する

---
### スクリプト言語

<dl>
 <dt>-JScriptFile "FilePath"
  <dd>JSCript.NET (JScript.NET.dll)
 <dt>-LuaFile "FilePath"
  <dd>Lua5.2 (Plugin.Lua.dll)
 <dt>-BooFile "FilePath"
  <dd>Boo0.9.7 (Plugin.Boo.dll)
 <dt>-iPythonFile "FilePath"
  <dd>IronPython2.7 (Plugin.IronPython.dll) 別途 IronPython のインストールが必要
 <dt>-iRubyFile "FilePath"
  <dd>IronRuby1.1 (Plugin.IronRuby.dll) 別途 IronRuby のインストールが必要
 <dt>-VBScriptFile "FilePath"
  <dd>ActiveScript。StreamRelay.NET.x86.exeのみ対応(つまりWin32のみ対応)。既定はVBScript (Win32\VBScript.dll)
</dl>

---
### サンプルスクリプト

\Sample\ScriptFile\ 以下にある。

---
### 本家の該当箇所

[本家の該当箇所](http://rocketeer.dip.jp/sanaki/free/free119.htm#ScriptDetail)

---
### 目次へ戻る

[目次というか最初の一歩](http://qiita.com/tomoki0sanaki/items/85f20cbe18378e33cd6f)
python2.7→python3.6切り替え(centos7)

Centos7でのpython入れ替えメモ

```
# cat /etc/redhat-release
CentOS Linux release 7.3.1611 (Core)

# yum install -y https://centos7.iuscommunity.org/ius-release.rpm
# yum search python36
# yum install -y python36u python36u-libs python36u-devel python36u-pip

シンボリックリンク張り替え
# ls -l /bin/py*
# ln -s /bin/python3.6 /bin/python3
# unlink /bin/python
# ln -s /bin/python3.6 /bin/python
# vim $(which pip)
1行目  #!/usr/bin/python2   →　#!/usr/bin/python
# pip --version
pip 9.0.1 from /usr/lib/python3.6/site-packages (python 3.6)
```

awscli使っている場合

```
# vim $(which aws)
1行目  #!/usr/bin/python2   →　#!/usr/bin/python
```

以下のようなエラーが出たら

```
# aws s3 ls
Traceback (most recent call last):
  File "/bin/aws", line 19, in <module>
    import awscli.clidriver
ModuleNotFoundError: No module named 'awscli'
```

installします

```
# sudo pip install awscli
```

追記
---

yumも動かなくなる。

```
# yum
  File "/bin/yum", line 30
    except KeyboardInterrupt, e:
                            ^
SyntaxError: invalid syntax
```

python3になるとprint命令文からprint()に変わっていたり、
例外のキャッチ構文が,(カンマ)からasに変わっていたりするため。
リンクを貼り直せば普通に使えるようになるけれど。。
うーん？どうしよう
adminerでSQL Databaseには接続できない？

いろいろなDBに対してphpMyAdimin寄りのUIを提供しているAdminer。

SQL Databaseに接続出来たらうれしいなぁと思い、やってみたのですが、うまくいきませんでした・・・

まずはAdminerを取得、Webサーバが参照できる位置に移動
`wget https://github.com/vrana/adminer/releases/download/v4.3.1/adminer-4.3.1.php`

その後、動かすためにパッケージのインストール
`yum install php php-pdo
yum install --enablerepo=remi php-mssql`

後は、Webサーバ起動してAdminerをブラウザで確認
※SELinuxは気を付けましょう・・・　setsebool -P httpd_can_network_connect 1とか・・・

サーバ名に入力する時、FQDNをちょろっと変更しないとだめでした。

`server.database.windows.net
↓
server.database.secure.windows.net`

ID、PW、DB情報を入れてログインしようとしても

「不正なデータベースです。」

とのことで中身が見れず・・・

DB名を「master」にすればちょろっと見れました。

自分がSQL Serverをよく理解していないため、何とも言えませんが。

とりあえず今日はここまで。
Debian StretchでDovecotへのpop3sアクセスが出来なくなる問題

2017年6月17日（世界標準時）⁠、Debianの２年ぶりのメジャーアップデートが発表された。これに伴い、メールサーバをJessie（Debian 8）からStretch（Debian 9）にアップグレードしたのだが、クライアントからのpop3sアクセスができなくなった。この原因と対処を記述する。

クライアントからのpop3sアクセスが失敗した時、dovecotのログには

<pre>pop3-login: Fatal: Invalid ssl_protocols setting: Unknown protocol 'SSLv2'</pre>

と記録されていた。

これは、/etc/dovecot/conf.d/10-ssl.confに

<pre>ssl_protocols = !SSLv2 !SSLv3</pre>

の記述があることが原因である。これを以下のように変更すれば、問題は解決する。

<pre>ssl_protocols = !SSLv3</pre>

SSL3.0は脆弱性の問題で禁止する必要があるのだが、SSL2.0はOpenSSL1.1で既に廃止されているため、敢えて禁止する必要がない。逆に「!SSLv2」の記述があると、何故か、SSL2.0様式の「ClientHello」を受け入れなくなる。この様式の「ClientHello」は多くのメールクライアントで使用されているので（SSL2.0自体を使用しているわけではない）、「!SSLv2」が残っていると接続ができなくなったわけだ。

しかし、本来必要でないはずの「!SSLv2」が、いまだに残っているのはどういうわけなのだろうか？

### 参照
* [Dovecot: Invalid ssl_protocols setting: Unknown protocol / Networking, Server, and Protection / Arch Linux Forums](
https://bbs.archlinux.org/viewtopic.php)
* [SSL/TLS（SSL3.0～TLS1.2）のハンドシェイクを復習する](http://qiita.com/n-i-e/items/41673fd16d7bd1189a29)
NewrelicでSpring AOP計測を行うには

軽くはまったので、次困らないようにメモを残します。

# なんでAOP計測できないか
newrelic.ymlの設定がデフォルトでdisableになっているってだけです。

# デフォルトの設定ファイル
``` newrelic.yml
    com.newrelic.instrumentation.spring-aop-2:
      enabled: false
```

# 書き換え後の設定ファイル
``` newrelic.yml
    com.newrelic.instrumentation.spring-aop-2:
      enabled: true
```

# デフォルトがdisableになった時のリリースノート
  https://discuss.newrelic.com/t/java-agent-3-17-0-release-notes/26043

# おわりに
この設定を入れることでTransactionsで処理時間を見ることが出来るようになります。
これが見たかったんだ。
(初心者向け)Swift3.0で初アプリ - アイコンを登録してみる

Swift3.0を使って簡単なiPhoneアプリを作ってみます
[初心者向け）Swift3.0で簡単なiPhoneアプリを作ってみる](http://qiita.com/egplnt/items/e8da2b9af1037e179a57)で作ったシンプルなSwift3.0アプリのアイコンを登録してみます

#1. アイコン用のPNG画像を用意します
- [(初心者向け)Macbookで写真のサイズを変える](http://qiita.com/egplnt/items/54f19d3ff385c6e10b01)などを参照し、縦横１２０ピクセルの正方形のPNG画像ファイルと縦横１８０ピクセルの正方形のPNG画像ファイルを用意します

#2. アイコンを登録します
- Xcodeでアプリを開きます
- 画面左側にナビゲーターを表示させます。表示されていない場合には画面右上隅のアイコンから選択します

![スクリーンショット 2017-06-21 15.00.57.png](https://qiita-image-store.s3.amazonaws.com/0/125842/f68e4094-8b96-623c-04fe-e642d8dcdc32.png)

- ナビゲーターから「Assets.xcassets」を選択し、「AppIcon」を選択します

![スクリーンショット 2017-06-21 15.02.15.png](https://qiita-image-store.s3.amazonaws.com/0/125842/c72f5df9-83cd-7313-79f9-c0b67856bce9.png)

- 前項で用意した１２０ピクセルのPNG画像を「iPhone App iOS7-10 60pｔ」セクションの「２ｘ」の欄へドラッグ＆ドロップします

![スクリーンショット 2017-06-21 15.04.55.png](https://qiita-image-store.s3.amazonaws.com/0/125842/0d16fb1e-7adf-fabc-7ab3-3ce138d11d61.png)

- 同様に、180ピクセルのPNG画像を同じセクションの「3x」の欄へドラッグ＆ドロップします

#3. シミュレーターおよびiPhone実機で確認します
- シミュレーターでアプリを稼働します。アプリ画面（「こんにちは」）が表示されたら、画面上部のシミュレーターのメニューから「Hardware」→「Home」ボタンを押し、アイコンが設定されていることを確認します

![スクリーンショット 2017-06-21 15.07.24.png](https://qiita-image-store.s3.amazonaws.com/0/125842/051f2343-136d-0c8a-c73e-4d88c8d07f78.png)

- iPhoneでも同様に確認します（略）

#次のステップへ

#関連ページ
画像の書き出しサイズの余白について考える

「イラストの周りの余白」をどのくらい取って書き出すべきかについてです。

# 通常の画像切り出しサイズ
通常はimgにclassを書いて、そこで調整するので、できるだけイラストに近い位置で切り出して残りをCSSで調整する方法が良いです。

```html
<img src="sample.img" class="img">
```

# WordPressの場合
WordPressの場合、投稿ページや固定ページでimgがpにデフォルトで囲われます。
構造を考えると当たり前なんだけれど、pの余白などのスタイルがimgについてくることになります。

```html
<p><img src="sample.img"></p>
```

pやclassに対して個別のclassは設定をするとクライアントが変更できなくなるのでつけません。
ですのでpの余白を考えて、イラストの余白を取った上で書き出すと割と幸せな状況になります。
BIについて勉強したいときに見るWebサイトや書籍の紹介

#BI関連のWeb資料

関連用語がわかりやすく表現されています
[システム企画担当者のためのBIシステム導入の勘所](https://thinkit.co.jp/free/tech/1/1/1.html)


#書籍
個人的には、全体を俯瞰するような入門資料は書籍で勉強するのが好みです。
とても参考になった書籍を紹介します。

[データ分析できない社員はいらない](http://www.amazon.co.jp/gp/product/4844371320/ref=as_li_tf_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4844371320&linkCode=as2&tag=haq01-22)
売上を増やす、コストを減らす、在庫を適正化する、など実際の活用シチュエーションごとに、
分析手法とグラフ化の事例を紹介していて、Practicalかつ非常にわかりやすい。

タイトルは一時期の流行に乗っかってしまってますが、内容は分析手法を網羅した普遍的な内容で、
文章も読みやすく、入門資料としてぴったりです。


[BIシステム構築入門](http://www.amazon.co.jp/gp/product/4798109312/ref=as_li_qf_sp_asin_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4798109312&linkCode=as2&tag=cda07-22)
翔泳社DB MAGAZINE SELECTIONシリーズです。
BIシステムの基本概念やアーキテクチャ、代表的なシステム構築プロセスの説明など、
まさにBIシステム構築の教科書。

ちなみにこの２冊は上のWeb資料の著者の本です。

#やっぱり基幹系のデータモデルも・・
以下はBIシステムの参考書ではないですが、BIシステムのデータは基幹系システムから持ってくるので、
やっぱり基幹システムの基本も知っているといいよね、ということで、同じDB MAGAZINE SELECTIONから３冊

[グラス片手にデータベース設計~販売管理システム編 (DBMagazine SELECTION)](http://www.amazon.co.jp/gp/product/479810566X/ref=as_li_qf_sp_asin_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=479810566X&linkCode=as2&tag=haq01-22)
[グラス片手にデータベース設計 生産管理システム編 (DB Magazine SELECTION)](http://www.amazon.co.jp/gp/product/4798119083/ref=as_li_qf_sp_asin_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4798119083&linkCode=as2&tag=haq01-22)
[グラス片手にデータベース設計 会計システム編 (DBMagazine SELECTION)](http://www.amazon.co.jp/gp/product/4798109274/ref=as_li_qf_sp_asin_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4798109274&linkCode=as2&tag=haq01-22)

生産管理システム編は生産計画ってなんぞや、というところから、関連するマスタデータについて、
MRP, 購買管理、工程管理、在庫管理と関連するシステムについて説明があり、
生産管理領域のシステムをざっと理解するのにとても役立ちます。
そしてついでに、カクテルのレシピもついてます。

データベース設計ついでに、この１冊
[実践的データモデリング入門 (DB magazine selection)](http://www.amazon.co.jp/gp/product/4798103853/ref=as_li_qf_sp_asin_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4798103853&linkCode=as2&tag=haq01-22)
実践的、というのがポイントで、エンティティをどうやって洗い出していくのか、実例を示しながら説明されます。
上記３つのデータベース設計シリーズのさらに基礎的な知識として、おすすめです。
Cognos TM1で動的サブセットをカスタム集約として使用する方法

# 動的サブセットでも集約にできる
サブセットエディタの、「編集」-「サブセットの挿入」を使用すると、ディメンションの階層構造とは別に、ユーザー定義の集約を作成することができます。

ドキュメントには明確に書かれていませんが、このとき動的サブセットを集約するようなカスタム集約要素を作成することが可能です。
[TM1 Knowledge Center](http://pic.dhe.ibm.com/infocenter/ctm1/v9r5m0/topic/com.ibm.swg.im.cognos.tm1_ug.9.5.2.doc/tm1_ug_id2722AddingaUser-DefinedConsolidationtoaSubset_.html?resultof=%22%E3%82%B5%E3%83%96%E3%82%BB%E3%83%83%E3%83%88%E3%81%AE%E6%8C%BF%E5%85%A5%22)

#【Question】

「製品」ディメンションの要素に製品A～Dが登録されています。
そして、生産中かどうか、「製品」ディメンションの属性「機種ステータス」に定義されているとします。

こんな感じで。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/184931/99817b83-3777-dabb-a6e8-45984971ed37.png)

それでもって、各製品の受注実績データを受注実績キューブに集計しているとします

入力データはこんな感じです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/184931/fceef25f-7ab7-0be3-aed2-09792f8fc10c.png)

さて、このとき現在「生産中」の製品の受注数だけ合計したいときにどうすればよいでしょうか？

#【Answer】
「製品」ディメンションに、「生産中製品」というサブセットを作ります。
「式の記録」ですべて→属性フィルタ で「機種ステータス = "生産中"」とすると、以下のMDX文が記録されます。

{FILTER( {TM1SUBSETALL( [製品]}. [製品].[機種ステータス] = "生産中")}

これを、「生産中製品」という名前で保管します。

それから、「製品」ディメンションをもう一度サブセットエディタで開き、「サブセットの挿入」で、「生産中製品」を選択。

これで、「生産中製品」というカスタム集約が作成されます。
このカスタム集約、「生産中」のステータスを変更するとちゃんと追従してくれます。とっても便利です。
続ガウス過程実装：コレスキー分解を使った表記

承前
・[ガウス過程の考え方](http://qiita.com/kilometer/items/6ab1d7f2cffc0c6e4a95)
・[{rstan}Rstanでガウス過程の実装](http://qiita.com/kilometer/items/8b81560c0efef5e0cee2)

参考
・[ガウス過程シリーズ2 高速化&フルベイズ](http://statmodeling.hatenablog.com/entry/gaussian-process-2)
・[コレスキー分解:wikipedia](https://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%AC%E3%82%B9%E3%82%AD%E3%83%BC%E5%88%86%E8%A7%A3)
・[多変量正規分布:統数研](http://random.ism.ac.jp/info01/distribution_random_number_generation/node2.html)

# コレスキー分解の活用

[{rstan}Rstanでガウス過程の実装](http://qiita.com/kilometer/items/8b81560c0efef5e0cee2)の、1-6節にあたる部分です。

入力`x`に対する出力`y`を条件として、入力`x2`に対する未知の出力`y2`を、条件付き多変量正規分布として求めたい。yが正規化されているとして、

```math
y \sim N_{n_1}(0, cov) \\
```

```math
\begin{bmatrix}y \\ y_2\end{bmatrix} \sim 
N_{n_1+n_2} \Bigg(0,\begin{bmatrix}cov & K \\ K^t &\Sigma\end{bmatrix} \Bigg)
```

を条件とした多変量正規分布を考え、

```math
\begin{eqnarray}
y_2 &\sim& N_{n_2}(\mu_2, cov_2)\\
\mu_2&=&K^tcov^{-1}y\\
cov_2&=&\Sigma-K^tcov^{-1}
\end{eqnarray}
```

これを元に、stanで`multi_normal_rng`で乱数生成する事で、`y2`の範囲を推定する事も可能なのですが、多変量正規乱数の生成がヘビィなので、`normal_rng`で済ませたい。

$cov_2$は、実対称行列なので、下三角行列$L$を用いて、

```math
cov_2 = LL^t\tag{2-1}
```

と分解できる。(これがコレスキー分解)

分解できると何が良いかというと、$y_2 \sim N_{n_2}(\mu_2, cov_2)$は、互いに独立な**標準正規乱数**の集合$z \sim N(0,1)$を用いて、

```math
y_2\sim \mu_2+Lz\tag{2-2}
```

と書ける。
これを使ってstan codeを全部まとめると、


```stan
data{
  int<lower = 1> N;
  vector[N] x;
  vector[N] y;
  
  int<lower = 1> N2;
  vector[N2] x2;
}

transformed data{
  vector[N] mu;
  for(i in 1:N)
    mu[i] = 0;
}

parameters {
  real<lower = 0> eta_sq;
  real<lower = 0> rho_sq;
  real<lower = 0> sigma_sq;
}

transformed parameters{
  matrix[N, N] Cov;
  
  for(i in 1:(N-1)){
    for(j in (i+1):N){
      Cov[i, j] = eta_sq * exp(-rho_sq * pow(x[i] - x[j], 2));
      Cov[j, i] = Cov[i,j];
    }
  }
  
  for(k in 1:N)
    Cov[k, k] = sigma_sq;
}

model{
  y ~ multi_normal(mu, Cov);
  
  eta_sq ~ cauchy(0, 5);
  rho_sq ~ cauchy(0, 5);
  sigma_sq ~ cauchy(0, 5);
}


generated quantities{
  vector[N2] y2;
  vector[N2] mu2;
  matrix[N2, N2] Cov2;
  matrix[N, N2] K;
  matrix[N2, N2] Sigma;
  matrix[N2, N] K_t_Cov;

  vector[N2] z;
  matrix[N2, N2] L;
  
  for (i in 1:N)
    for (j in 1:N2)
      K[i, j] = eta_sq * exp(-rho_sq * pow(x[i] - x2[j],2));

  for(i in 1:(N2-1)){
    for(j in (i+1):N2){
      Sigma[i, j] = eta_sq * exp(-rho_sq * pow(x2[i] - x2[j], 2));
      Sigma[j, i] = Sigma[i, j];
    }
  }

  for(k in 1:N2)
    Sigma[k, k] = sigma_sq;

  K_t_Cov = K' / Cov;  
  mu2 = K_t_Cov * y;
  Cov2 = Sigma - K_t_Cov * K;

// 式(2-1)  
  L = cholesky_decompose(Cov2);

  for(i in 1:N2)
    z[i] = normal_rng(0, 1);

// 式(2-2)
  y2 = mu2 + L * z;
}
```

っと、速さはあまり変わらないですね。
これは、コレスキー分解&標準正規乱数を生成を繰り返し行う vs. 多変量正規乱数を生成するというお話だからですかね。

しかし、カーネル関数のハイパーパラメータ達が既知であれば、これは爆速になるそうな…。
と言ってもstanではGPは遅いと巷で噂だそうです。

<img width = 400, src = https://qiita-image-store.s3.amazonaws.com/0/92401/371e7e45-0bbd-4907-66f1-0fbc83b157b2.png>