OmniAICreator/Qiita-1.07M huggingface dataset:
【実際に動かしてみた】RubyのFile.openのブロックによるリソース管理について

# はじめに

Ruby初学者のため、`File.open()`の挙動が知りたくなるシチュエーションに遭遇。

調べたら2009年の記事を発見。こちらの記事でFileOpenの動作確認をしていたので、コードを自分でも実際に動かしてみた。パターン網羅的で参考にしやすい。

[RubyのFile.openのブロックによるリソース管理について - OSのようなもの](http://d.hatena.ne.jp/wocota/20090426/1240750685) -
 http://d.hatena.ne.jp/wocota/20090426/1240750685

使わせてもらうコードはこちら

> 
```ruby
f1 = f2 = f3 = f4 = f5 = ''
#open 1
File.open('test.txt'){|f1|
  puts f1.read
  #open 2
  f2 = File.open('test2.txt')
  puts f2.read
  #open 3
  f3 = File.open('test3.txt').each do |l|
    puts l
  end
  #open 4
  (f4 = File.open('test4.txt').each do |l|
    puts l
   end).close
  #open 5
  File.open('test5.txt'){|f5|
    f5.read
  }.each{|l|
    puts l
  }
}
p f1 #=> #<File:test.txt (closed)>
p f2 #=> #<File:test2.txt>
p f3 #=> #<File:test3.txt>
p f4 #=> #<File:test4.txt (closed)>
p f5 #=> #<File:test5.txt (closed)>
```


## 実行失敗

メソッドチェーンしてる5番目のファイルで実行エラー。

```
$ ruby file_open.rb
test1です
test2です
test3です
test4です
f.rb:17:in `block in <main>': undefined method `each' for "test5です\n":String (NoMethodError)
	from f.rb:3:in `open'
	from f.rb:3:in `<main>'
```

## 修正と再実行

> Ruby 1.9 Ruby 1.9では、each_lineメソッドの別名eachが廃止されました。

Stringオブジェクトに対する`each`メソッドは廃止されているため、`each_line`あたりで代替して動かす。

* 修正後ソース(抜粋)

```ruby
  File.open('test5.txt'){|f5|
    f5.read
  }.each_line{|l|
    puts l
  }
```

* 再実行結果(抜粋)

```sh
""
#<File:test2.txt>
#<File:test3.txt>
#<File:test4.txt (closed)>
""
```

Rubyのバージョン違いのせいか、`f1`と`f5`の結果が　[参照元](http://d.hatena.ne.jp/wocota/20090426/1240750685)　と一致しない。

仮に参照元と同じ動作をするならば、期待としてはファイルオブジェクトが返ってきてほしい。

ブロック内の`f1`と`f5`は変数のスコープ的にグローバル変数とは別物として扱われ、ファイルオブジェクト(File)は返ってこない。そのため表示されている`f1`と`f5`は初期化時の空文字(String)が表示される。

## 結果

参照元のコードだとブロックを使ったときのファイルクローズが目視できなかった。
ただ、`.read`を使っていることから`File.open('test.txt'){ |f5| f5.read }`の戻り値は`String`であり、ブロック処理終了後にファイル操作が完結していることが伺える。



## Rubyバージョン

`2.3.1`と`2.4.1`で実行

```
$ ruby -v
ruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-darwin16]

$ ruby -v
ruby 2.4.1p111 (2017-03-22 revision 58053) [x86_64-darwin16]
```

# 参考文献

* [RubyのFile.openのブロックによるリソース管理について - OSのようなもの](http://d.hatena.ne.jp/wocota/20090426/1240750685)
* [each_line (String) - Rubyリファレンス](https://ref.xaio.jp/ruby/classes/string/each_line)
* [class String (Ruby 2.5.0)](https://docs.ruby-lang.org/ja/latest/class/String.html)
* [String - Rubyリファレンス](https://ref.xaio.jp/ruby/classes/string)
* [instance method IO#read (Ruby 2.5.0)](https://docs.ruby-lang.org/ja/latest/method/IO/i/read.html)
Pythonで順位をつける


```test.py
import numpy as np
import pandas as pd
from scipy import stats
test= np.array([2,4,3,5,8,8,16])
df=pd.DataFrame(test, columns=(['data']))
df = df.assign(ranking=len(df.data)-stats.mstats.rankdata(df.data)+1)#順位を作成してdfに追加　rankだとデフォルトのメソッドがあるのでrankingにしといた。
df[['ranking', 'data']].sort_values('data',ascending=False)#順位は左端につけたいのでSELECTしてdataで並び替え
```

実行結果

|index|ranking|test|
|---|---|---|	
|6	|1	|16	|
|4	|2.5	|8	|
|5	|2.5	|8	|
|3	|4	|5	|
|1	|5	|4	|
|2	|6	|3	|
|0	|7	|2	|


参考URL
http://johshisha.hatenablog.com/entry/2017/04/05/200454
a == 1 && a == 2 && a == 3にするRubyスクリプト

```ruby
a=?a;def a.==(o);!!1;end
p a == 1 && a == 2 && a == 3 # => true
```

※解説はしません

## 参考情報
* https://qiita.com/niku/items/4ec2400abe2a5f9a4bc6
* https://qiita.com/HKDnet/items/01a55a7a33a7df02cdb9
Uri → String、String → Uri の型変換

メモとして残しておきます。


## Uri → String

これは普通に `toString()` メソッドを使えばいいです。

```java

Uri uri;
String stringUri;
stringUri = uri.toString();

```


## String → Uri

この場合は `Uri.parse()` メソッドを使えば実現できます。

```java

Uri uri;
String stringUri;
uri = Uri.parse(stringUri);

```


誰かの力になれば。
bash > コメント(#)の使いみち > 手順テキストからのペースト、変更、実行

```txt:動作環境
Xeon E5-2620 v4 (8コア) x 2
32GB RAM
CentOS 6.8 (64bit)
openmpi-1.8.x86_64 とその-devel
mpich.x86_64 3.1-5.el6とその-devel
gcc version 4.4.7 (とgfortran)
NCAR Command Language Version 6.3.0
WRF v3.9を使用。
Python 2.6.6 (r266:84292, Aug 18 2016, 15:13:37) 
Python 3.6.0 on virtualenv
GNU bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu)
date (GNU coreutils) 8.4 
tmux 1.6-3.el6
```

## 関連

- [bashのコマンドラインでコメント(#)の使いみち](https://qiita.com/masami256/items/a56f7e1e693a80ecb7fe)

## 思いつき

### 前置き

- 週に数回のデータ処理を行う
- データ処理時にパラメータを変更して実行する
- コマンド入力が面倒
- 完全自動化にはしていない
    - 完全自動化にはPython2, Python3, NCL, bash, その他の言語のスクリプトを30くらい追加しないとだめ
    - 仕様がどんどん変わるので、コードメンテの時間確保も必要
        - 明日、仕様が変わりそう
    - 完全自動化すると詳細を忘れる
        - ドキュメントを作る時間確保もかかる
    - その他いろいろ言い訳

### 実行コマンド例

```
$mpirun -np 12 ./wrf.exe && echo "fin" | mail -s "WRF 11:05" 7of9@deltaQuadrant.com
```

### コメント(#)の使い道

1. 手順テキスト(またはマインドマップ)に以下を張っておく
    - `#mpirun -np 12 ./wrf.exe && echo "fin" | mail -s "WRF 11:05" 7of9@deltaQuadrant.com`
2. データ処理の準備が完了時に上記のテキストをターミナルにペーストし実行
    - >> 実行はされない
3. ターミナルで前のコマンドに戻り、一部を変更
4. コメント(#)を取り、実行する

```
$#mpirun -np 12 ./wrf.exe && echo "fin" | mail -s "WRF 11:05" 7of9@deltaQuadrant.com
$mpirun -np 12 ./wrf.exe && echo "fin" | mail -s "WRF 12:45" 7of9@deltaQuadrant.com
```

### コメント(#)なしとの比較

手順テキストにコメント(#)なしのコマンドを用意していた場合、ペースト時に不注意で実行されるかもしれない。
コメント(#)があることで、不注意での実行を防止する、という意図です。
sitas - １つのターミナルで複数のサーバーを同時に操作する

[https://github.com/jiangwenyuan/sitas](https://github.com/jiangwenyuan/sitas)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/211132/7d8037c5-ac29-6964-8531-32a8f5f6fbc3.png)

結構前（１０年前？）作ったもので、２、３年前古いパソコンを整理した時Githubに置いたきり、すっかり忘れました。今の時代はあまりいらないな気がしますけどね。

いいところはtmuxのように１つのターミナルで実行して、Single/Multipleモード間切り替えられ、そしてX環境もいらない、VIMのようなアプリもサポートします。後は交互的です。

コマンドは１つのターミナルで実行しているように見えますが、実際は複数のサーバーで同時に実行している。

とりあえずシェアします。
GitLabのバックアップから特定のリポジトリを復旧する

退職に伴うアレでGitLabのユーザーを削除したらリポジトリがなくなったと言われたので、 `gitlab-rake gitlab:backup:create` でつくられた15GBぐらいのtarから復旧した。

## バンドルファイルの取り出し

```console
# tar tf xxx_gitlab_backup.tar | grep [探したいリポジトリ名]
repositories/kimari/
repositories/kimari/nankyoku.bundle
repositories/shirase/
repositories/shirase/nankyoku-challenge.bundle
...

# tar xf xxx_gitlab_backup.tar repositories/kimari/nankyoku.bundle
```

## バンドルファイルからclone

```console
mv repositories/kimari/nankyoku.bundle nankyoku.bundle
git clone nankyoku.bundle
cd nankyoku
git log
```

## 参考

- [tarファイルを解凍せずに中身をみる＠Linux](http://www.mazn.net/blog/2009/02/03/183.html)
- [7.12 Git のさまざまなツール - バンドルファイルの作成](https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E3%81%95%E3%81%BE%E3%81%96%E3%81%BE%E3%81%AA%E3%83%84%E3%83%BC%E3%83%AB-%E3%83%90%E3%83%B3%E3%83%89%E3%83%AB%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E4%BD%9C%E6%88%90)
- https://gitlab.com/gitlab-org/gitlab-ce/blob/v10.4.2/lib/backup/repository.rb#L53
Entrykit(render)でまれにエラーが発生する

## 内容
Entrykitの`render`処理で以下のエラーが発生する。

```
runtime: failed to create new OS thread (have 5 already; errno=11)
fatal error: newosproc
```

## 環境や実行方法
- Platform: Kubernetes: v1.8.6 on GKE
- Docker:  v17.3
- OS: alpine: v3.6.2
- Entrykit: v0.4.0
- 発生タイミング: コンテナ起動時(Pod)
- 起動方法: dumb-initを経由して実行
	- `dumb-init render xxxx.yaml -- {daemon-app}`

## Workaround
ググってみると[このIssue](https://github.com/golang/go/issues/19163)が関係ありそうです。
Linuxについては修正されている確証はありませんが、試してみる価値はありそうです。

今まではGitHub上のバイナリを使用していましたが、golang`v1.9.3`でビルドしたバイナリに差し替えてみます。

## 検証
差し替えたバイナリで起動テストを実施しました。
今のところエラーは発生していないので`production`環境にデプロイして様子を見ています。

再発するようであれば追記します！
MS Officeの数式エディタが使えないなら、代替でMathType Liteを使えばいいじゃない

# あらまし

やんごとなき事情により、Microsoft Office（2016も、そして2007も）から数式エディタが消えた。

[Office数式エディタのRCE脆弱性を悪用したマルウェアが登場、IPAが注意喚起 internet watch](https://internet.watch.impress.co.jp/docs/news/1094268.html)

オブジェクト形式の為、Office以外でも、一太郎・花子などでも利用できたが、この度利用できなくなった。我々はもう、ラテックスと呼ばれる未知のソフトに頼るしかないのか（釣り針）。そして、過去に蓄えた資産を編集するすべは、ないのか。

否、ある。
それは元の数式エディタ（MathType3.0相当）の最新版、MathType6 lite/評価版の導入で、可能になる。

# MathType6系統 評価版 のダウンロード
以降の項目からは、2018-01-31現在の話になる。
大体は、英語版の方がバージョンが新しいようだ。

## 英語版 6.9c
[Welcome Microsoft Equation Editor 3.0 users](http://www.wiris.com/en/equation_editor/microsoft)
このページはマイクロソフトサポートからも掲載されている：
https://support.microsoft.com/ja-jp/help/4057882/error-when-editing-an-equation-in-office

## 日本語版 6.9a
[評価版のダウンロード](http://www.senko-corp.co.jp/software/mathtype/download.htm)
ここから評価版をダウンロードする。

# MathType6系統 評価版 のインストール
インストール中、初回30日間はフルで試用できる旨が表示される。評価版を試用するかたちで進めること。
他、インストーラ自体には特記事項はない。

# 使い方
Excelなら、挿入リボン→オブジェクト→「MathType 6.0 Equation」で作成可能。編集時はオブジェクトを右クリックで「Equationオブジェクト」を選ぶこと。

## MathType 評価版とLite
30日間経過すると機能削減版になる。今まで作成した数式はそのまま編集可能だ。Liteを使い続けても問題ないケースは多いだろう。

余談ではあるが、当方ではwindows timeを変更して期限切れ状態を確認した。その状態でも当方の環境では不満なく使えたことを記す。

以降は日本語版ヘルプドキュメントからの転記だ：

>数式ファイルの保存と印刷ができません。
ツールバーのシンボルとテンプレートパレットのみが使用できます。
パレットに追加されたMathTypeのシンボルやテンプレートを使えません。
WordのMathTypeマクロは使えません。
シンボル挿入ダイアログは見えません。
カラーメニューは見えません。 (存在する色は使えます)
認識できる関数リストのカスタマイズができません。
各種設定ファイルは、読み込むことも保存することもできません。
キーボードショートカットを定義することはできません。
ルーラーとタブストップが使えません。
数式をTeXまたはMathMLに変換できません。
TexとMathMLをMathTypeに貼り付けることができません。多くのWebサイトではTeXやMathMLを使えますが、MathTypeで作業するWebサイト、フォーラム、ブログでは大きな制限となるでしょう。
以下のコマンドが使えません。
３D表示
括弧書式の設定
サイズ>大きく、サイズ>小さく
ユーザー１、ユーザー２のスタイルとサイズ
Web/GIFの設定
作業環境の設定(ツールバーボタンサイズ、空白スロットの太さと色など)


## MathTypeの買い方
だが、上記の機能が欲しいヘビーユーザーも多いことだろう。
幸いにして、MathTypeは数学を扱うソフトの中では安い部類かと考える。なお私の環境では購入を見送った為、ここから先はリンクしか紹介できない。後はがんばれ。

### 英語版
http://store.dessci.com/?

### 日本語版
http://www.senko-corp.co.jp/softland/shopping.php?id=soft-17

#### 余談
- Matlabと比較して安いと思ったが……って、Matlab個人パッケージ安いな！？
- 転記にあった全角英語を半角英語に直すのに、Pythonのmojimojiパッケージを利用した。便利だった（女子小学生並感）
- とはいえ、Officeで使う事が前提で、過去のファイルに対して編集できるなら、この機会にMSが作ったOffice標準の機能「数式ツール」に置き換える方が良いとは思う。LaTeX書式いけるし。
UIImageを合成する（重ねる）Extension

UIImageViewを重ねれば済むんだけど、大人の都合で重ねられない時用のメモ

```swift
extension UIImage {

    func composite(image: UIImage) -> UIImage? {

        UIGraphicsBeginImageContextWithOptions(self.size, false, 0)
        self.draw(in: CGRect(x: 0, y: 0, width: self.size.width, height: self.size.height))
        
        // 画像を真ん中に重ねる
        let rect = CGRect(x: (self.size.width - image.size.width)/2,
                          y: (self.size.height - image.size.height)/2,
                          width: image.size.width,
                          height: image.size.height)
        image.draw(in: rect)
        
        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        
        return image
    }
}

```

引数を配列とかに変えれば何枚でも重ねられるし、`rect`をいじれば重ねる画像のリサイズもできる。
TCPの疎通をnetcatで簡単に確認する方法

ncコマンドに`-v`と`-z`を付ける。
`-v`は詳細、`-z`はデータを対象ポートに送信しない。というオプション。

```
nc -vz Address Port
```

## 例

```
nc -vz 127.0.0.1 80
```

### 正常に接続ができたときの出力

```
Connection to 127.0.0.1 80 port [tcp/*] succeeded!
```

### 接続に失敗したときの出力

```
nc: connect to 127.0.0.1 port 80 (tcp) failed: Connection timed out
```
[PHP7]array_mapとforeachの速度検証

# 結果

PHP7でもforeachが早い！

# 検証

```php
<?php
// 100万件の検証用配列
$l = [];
for($i = 0; $i < 1000000; ++$i){
        $l[] = $i;
}
// 性能計測処理
function profile($text, $f){
        $start = microtime(true);
        $f();
        $end = microtime(true);
        echo "[$text]\n" . ($end - $start) . "\n";
}

// 1 : 普通に書きたくなるクロージャを使ったarray_map
profile("array_map + closure", function() use($l){
        $ll = array_map(function($t){
                return $t + 1;
        }, $l);
        return $ll;
});

// 2 : 性能が良くなればいいなと思って関数をローカルに定義したバージョン
profile("array_map + function inner", function() use($l){
        function plus_inner($num){
                return $num + 1;
        }
        $ll = array_map('plus_inner', $l);
        return $ll;
});

// 3 : 性能が良くなればいいなと思って関数を外部に定義したバージョン
function plus_outer($num){
        return $num + 1;
}
profile("array_map + function outer", function() use($l){
        $ll = array_map('plus_outer', $l);
        return $ll;
});

// 4 : 従来通りのforeach
profile("foreach", function() use($l){
        $ll = [];
        foreach($l as $t){
                $ll[] = $t + 1;
        }
        return $ll;
});
```

||処理|時間(秒)|
|:--|:--|--:|
|1|[array_map + closure]|0.542418003082280|
|2|[array_map + function inner]|0.384681224823000|
|3|[array_map + function outer]|0.368507146835330|
|4|[foreach]|0.067167043685913|

# それでも

でも関数型的書き方のほうが、変数宣言と初期化が一緒にできるから好き。
100万件でこれぐらいの誤差なんだから普通に使おう。

# 追記

アホな検証をしてました。
@ArimaRyunosukeさんのコメントにあるバージョンで検証方法・結果を書き換えました。
クロージャーより宣言したfunctionを使ったほうが早かったです。
ありがとうございますー。
SQLServerのサーバー側接続設定に関するTIPS

#免責事項
この記事は個人メモとして書き留めておいたものを、分かりやすく纏めてみたものです。記事内容に間違い・補足事項等の指摘があれば適宜修正したいと思いますが、記事の内容を100%保証するものではありません。予めご了承ください。

#はじめに
SQLServerのセットアップ時、SQL Server Browser はデフォルトで無効の状態となるようになりました。（だいぶ昔からかもしれませんが。）
「社内などでも他部署のSQLServerが自動検出されてしまう」ため、セキュリティの観点から推奨されないようになったのかと思います。
ただし、これにより異なる端末やツールなどからうまく繋がらなかったりするケースが出てしまいました。（2017年当時）ネットで調べても詳細な情報をうまく見つけられなかったため、一時期、やむを得ずSQL Server Browserを有効にして運用していたこともありました。


#■「SQLServerBrowser」を起動せず、外部から接続する方法
①構成ツール（バージョンによって呼び方が違う場合があります）にてTCP/IPを有効にする

![aaa.png](https://qiita-image-store.s3.amazonaws.com/0/234814/86a593dc-8af6-6079-5e16-32958dea8a61.png)

②TCP/IPプロパティの、IPALLにて、
　●TCPポートを指定（製品版のデフォルトは1433、Expressはたぶん空白）
 ※任意の番号でよいが、８０番などはIISが使用したりするため、他とバッティングしないもの
　●TCP動的ポートを空白にする（使用しない設定）を設定する
![aaa2.png](https://qiita-image-store.s3.amazonaws.com/0/234814/61532ecb-4671-51a8-07e2-f6fe68867bde.png)

③接続するときには、
　・IPなどの後に「,(ポート番号)」を指定して接続する（1433のみ省略可能な場合がある）
　・インスタンス名は指定してもしなくても良い
 
　　×　TEST\SQLEXPRESS
　　×　192.168.1.1\SQLEXPRESS
　　○　TEST,1234
　　○　192.168.1.1,1234
　　○　TEST\SQLEXPRESS,1234
　　○　192.168.1.1\SQLEXPRESS,1234

　　OKな例
　　![aaa3.png](https://qiita-image-store.s3.amazonaws.com/0/234814/1607dc85-0249-4dae-c518-f1b28a799731.png)
　cf.　[MSサイトの接続文字列説明](https://msdn.microsoft.com/ja-jp/library/system.data.sqlclient.sqlconnection.connectionstring%28v=vs.90%29.aspx)

#■罠に陥りやすいケースについて
 
・SQLEXPRESS版をインストールして、インスタンス名称がSQLEXPRESS
・サーバー名はAAA（host記載かDNS解決）
・ポートは静的指定で、1433
 
この場合、接続可否は下記になります
○　AAA
×　AAA\SQLEXPRESS
○　AAA,1433
○　AAA\SQLEXPRESS,1433
 
インスタンス名が指定されているのに、ポート番号の指定がない場合は、
SQL Server Browserに確認しにいきます。
結果、サービスが起動していない場合は、接続に失敗します。
→サーバー側でポート1433に設定してあっても、
　省略可能なポートという判定にはならないため、
　そもそものポート1433での接続を試行せず、結果、失敗する。
 
 
#■解説とまとめ
####:warning:テスト検証での挙動からの推測を多分に含みます
・インスタンス名が指定された場合、デフォルトポートではないと判断するため、SQL Server Browserにどのポート番号でサービスが提供されているか確認しにいきます。

・ただしポート番号が指定された場合は、SQL Server Browserに照会しにいきません。（する必要がなくなる。）

・静的ポートではなく動的ポートの場合は、サービス再起動のたびにポート番号が変動するため、SQL Server Browserサービスの起動は必須となります。
　→　インスタンス名から、今回はどのポートで起動したのかを確認する
 
 
すごく乱暴な言い方をすれば、SQLServerのインスタンス名は、
接続するポート番号を調べるための役割くらいしか、意味がないかもしれません。

DNSの枠組みで例えれば、

ホスト名　　　→　SQLServerインスタンス名
DNSサーバー　→　SQL Server Browserサービス
IPアドレス　　→　ポート番号

といった感じです。

>もしIPアドレスを知っていれば、○○さんのPC名は知らなくても、共有フォルダにアクセスできますよね。（DNSの場合）
ポート番号さえ知っていれば、特定のSQLServerインスタンスに、そのインスタンス名を知らなくても！、アクセスできます。（SQLServerの場合）
 
まあ、でも「番号」での管理（番号を覚えるの）はナンセンスなので、「名前」が用意されたんですね。
もしたくさんのサーバーに名前がなくて、IP設定だけだったら・・・ということですね。
AWS認定試験の問題集

さあ、いよいよ具体的な学習をスタートさせましょう。
AWS公式サイトの各サービスの概要・製品の詳細を読み込んでいく方法が主流の勉強法だと思いますが、試験対策本での学習をお勧めします。

AWSの試験はアップデートが早いため対策本は難しいのですが、２０１６年の夏に発売された「合格対策 AWS認定ソリューションアーキテクト - アソシエイト」がオススメです。

一通り学習後は試験対策が必要です。数少ないですが問題集を解くことをお勧めします。
下記の無料問題集サイトをお勧めます。

■無料AWS問題集
http://www.aws-club.com
TypeScript で range() 関数の実装

1から10までの配列を作りたいみたいなときに使える関数の紹介です。

```range.ts
export const range =
  (start: number, end: number) => Array.from({length: (end - start + 1)}, (v, k) => k + start);
```


```使い方.ts
range(3, 6) // [3, 4, 5, 6]

range(0, 9).map((_) => {return "hoge"}) // 10個の "hoge" が入った配列を返す
```

すごく便利。
型情報を取ったらJavaScriptでも動きます。
ご参考まで。
【Unity拡張】Gameウィンドウの画面サイズを表示するEditorWindowを作ってみた

# はじめに
UIを調整している時、Gameウィンドウのサイズを確認したくなったので作ってみました。

# 作ったものについて
Gameウィンドウの**画面サイズとアスペクト比**を表示します。

![1.gif](https://qiita-image-store.s3.amazonaws.com/0/44288/f5d24a0d-21f0-9bcc-6ac4-30ccafeae332.gif)

# 環境
Windows 10
Unity2017.2.0f3

# ソースコード
UnityプロジェクトにEditorフォルダを作り、以下のスクリプトをフォルダの中へ入れてください

```AspectRatioViewer.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;

public class AspectRatioViewer : EditorWindow
{
    [MenuItem("Tools/AspectRatio Viewer")]
    static void Open()
    {
        GetWindow<AspectRatioViewer>(); // ウィンドウを開く
    }

    void OnGUI()
    {
        EditorGUILayout.LabelField("画面解像度を表示します");

        var sizes = UnityStats.screenRes.Split('x');
        var w = float.Parse(sizes[0]); // 横のサイズをもとめる
        var h = float.Parse(sizes[1]); // 縦のサイズをもとめる

        this.ShowValue("Width", w.ToString());
        this.ShowValue("Height", h.ToString());
        this.ShowValue("Aspect Ratio", string.Format("{0} : {1}", 1f, h / w));
    }

    void Update()
    {
        this.Repaint(); // ウィンドウにフォーカスが乗っていないときでも画面描画を更新
    }

    void ShowValue(string label, string value)
    {
        EditorGUILayout.BeginVertical("Box");
        EditorGUILayout.LabelField(label);
        EditorGUI.indentLevel++;
        EditorGUILayout.LabelField(value.ToString());
        EditorGUI.indentLevel--;
        EditorGUILayout.EndVertical();
    }
}
```

# 使う
メニューの **Tools/AspectRatio Viewer** を選択するとウィンドウが開きます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/44288/6d3c006a-a3ad-a8f5-0d2b-4faf04024a76.png)
ActiveRecord の where と where! (where bang) の違い

## 概要

おそらく Ruby on Rails4 以降に導入されている `ActiveRecord::QueryMethods#where!` `includes!` .. などについて。


## 違いとは

### where

where は呼び出し時に新しくオブジェクトがクローンされる。

```
> users = User.all
> users.where(id: 1).object_id
=> 70140175157520
> users.where(id: 1).object_id
=> 70140175100600
> users.where(id: 1).object_id
=> 70140175049660
```

### where!

where! はクローンされない。

```
> users.object_id
=> 70140126836880
> users.where!(id: 1).object_id
=> 70140126836880
> users.where!(id: 1).object_id
=> 70140126836880
> users.where!(id: 1).object_id
=> 70140126836880
```

whereでメソッドチェーンを繰り返す使い方を考えると、こちらは元のオブジェクトのクエリをどんどん書き換えていくイメージですね。

なので、破壊的メソッドを示す `!` というネーミングなのだと思います。

## 参考

https://stackoverflow.com/questions/23950627/undocumented-activerecord-bang-methods

該当のプルリクエスト。`where`は内部で`where!`を利用している。
`where` バージョンではオブジェクトをクローンしている。

https://github.com/rails/rails/commit/8c2c60511beaad05a218e73c4918ab89fb1804f0
カーネルドライバポーティングするときにあると良かった設定、パッケージ


ドライバをポーティングするときにあると良かったカーネル設定とかYoctoのパッケージ

# カーネル設定

## `CONFIG_DYNAMIC_DEBUG=y`

ファイル、行単位でカーネルのデバッグメッセージ出力を制御出来る。必須レベル。

https://qiita.com/maueki/items/53e116090f82db4aadea

## `CONFIG_PROC_DEVICETREE=y`

/proc/device-tree以下に現在のデバイスツリーが展開される。
今回はLinux3.14.52だったので対応していないがもう少し後のバージョンだとデバイスツリーの動的書き換えも可能となっているらしい。

# パッケージ

## パッケージマネジメントを有効に

```:build/local.conf
IMAGE_FEATURE += "package-management"
```

## opkg

あとからパッケージをインストールできるようにopkgをインストールしておく。
以下の設定も忘れずに。

```:build/local.conf
PACKAGE_CLASSES ?= "package_ipk"
```

## i2c-tools

I2Cドライバを触るなら必須。

https://qiita.com/maueki/private/53e116090f82db4aadea#i2c%E3%83%87%E3%83%90%E3%82%A4%E3%82%B9%E3%81%AE%E7%A2%BA%E8%AA%8D

## v4l-utils

VIDIOC系のioctlを割と自由に発行できる。ビデオ系触るなら必須。

## dropbear

sshは必須。
Visual Studio for Macに新しいThemeをインポートする


Visual Studio for Macには以下のようにデフォルトのThemeが少しだけ用意されていますが
(好みによるけど)どれも一長一短
![スクリーンショット 2018-01-31 9.53.59.png](https://qiita-image-store.s3.amazonaws.com/0/72559/a2988d5d-e648-d61a-3c5e-8a8e8e5fee46.png "スクリーンショット 2018-01-31 9.53.59.png")

個人的に好きな`Solarized Dark`も選択範囲色が残念 (一応"StringFormatConverter"の部分を範囲選択してる)
![スクリーンショット 2018-01-31 9.55.57.png](https://qiita-image-store.s3.amazonaws.com/0/72559/e3f8bcd6-9dee-b783-e072-49edad2f5d4e.png "スクリーンショット 2018-01-31 9.55.57.png")

しかし、Visual Studioは個別に色を指定するのが面倒らしいので、とりあえず新しいThemeを入手し、インポートすることにしました

#Themeを入手
 まずThemeについて調べました。以下Microsoftのページ
[エディターのテーマ](https://docs.microsoft.com/ja-jp/visualstudio/mac/editor-themes)

サポートされている書式は以下のようです

>サポートされる書式のいずれかであれば、新しい配色テーマを追加できます。 これらの数値は、次のとおりです。
Visual Studio (.vssettings)
Xamarin Studio (.json)
TextMate (.tmTheme)


Themeに関しては
>オンラインに掲載されている多数のリソースを利用して、独自のテーマを作成し、サポートされる書式でファイルを生成することができます。 また、オンラインには、Visual Studio と TextMate のテーマに無料でアクセスできる多数のギャラリーがあります。
新しいテーマを見つけるか作成し、ローカル コンピューターにダウンロード

とのことです。
DL先的なのは記載されていなかったので検索

[Create and share Visual Studio color schemes](https://studiostyl.es/)
上記のサイトから`.vssettings`のファイルを入手できるっぽいです

とりあえず、`All-time favourites`から`rated`が高いもので良さそうなThemeをDL
![スクリーンショット 2018-01-31 9.46.24.png](https://qiita-image-store.s3.amazonaws.com/0/72559/b1443212-52ec-d87e-2694-1619c49dcc29.png "スクリーンショット 2018-01-31 9.46.24.png")

DLする際は`Download this scheme`横のボックスからは`Visual Studio 2015`を選べば良さそうです(他は試してない)
![スクリーンショット_2018-01-31_9_44_03.png](https://qiita-image-store.s3.amazonaws.com/0/72559/58f58ca4-1216-2405-0168-5369c801b959.png "スクリーンショット_2018-01-31_9_44_03.png")

#インポート
`Visual Studio Community(自分の場合は)`->`Preferences...`->`Text Editor`->`Color Theme`で`Add`をクリック
![スクリーンショット_2018-01-31_9_44_12.png](https://qiita-image-store.s3.amazonaws.com/0/72559/17519985-1c9a-6207-1a17-d5aa4e02e73f.png "スクリーンショット_2018-01-31_9_44_12.png")

DLした`.vssettings`のファイルを選択し、`開く`
![スクリーンショット_2018-01-31_9_45_07.png](https://qiita-image-store.s3.amazonaws.com/0/72559/07f5b0f0-f28b-46c2-8364-48b8c2509d99.png "スクリーンショット_2018-01-31_9_45_07.png")

するとColor Theme一覧にThemeが追加されるので適用すればOK


といっても、なかなか自分好みに完全にマッチしたものを見つけるのは大変なので次は自作したい
組み込みLinuxデバッグメモ


「組み込みLinux」の定義はしない。空気読んで。

# フレームバッファ周り

サポートしているモード一覧

```bash
$ cat /sys/class/graphics/fb0/modes
U:1920x1080p-0
```

https://stackoverflow.com/questions/31851651/linux-framebuffer-modes

モード設定

```bash
$ echo 'U:1920x1080p-0' > /sys/class/graphics/fb0/mode
```

# udev

```bash
$ udevadm -n -a /dev/video0
```

# カーネルコンフィグの確認

CONFIG_IKCONFIG, CONFIG_IKCONfiG_PROCが有効の場合は/proc/config.gzでも現在稼働しているカーネルのカーネルコンフィグが確認できる。

```bash
$ zcat /proc/config.gz
```

# ブートパラメタの確認

```bash
$ cat /proc/cmdline
```

# I2Cデバイスの確認

i2c-toolsにある`i2cdetect`を使用する

I2C 1番ポートの接続状況を確認。(`-y`は質問に常にyで応えるオプション。無くても良い)
UUはドライバにより使用中。

```bash
$ i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- UU -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- UU -- -- -- UU -- -- -- -- -- -- -- -- --
30: -- UU UU -- UU -- UU -- 38 39 -- -- 3c -- 3e 3f
40: -- UU -- -- -- -- -- -- -- -- UU -- -- -- 4e --
50: UU -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- UU -- -- -- -- -- -- --
70: UU -- -- -- -- -- -- --
```

# カーネルデバッグログの出力

http://d.hatena.ne.jp/cupnes/20150906/1441494239

状態確認

```bash
$ cat /sys/kernel/debug/dynamic_debug/control
```

ファイルhoge.cのデバッグ出力を有効にする

```bash
$ echo -n 'file hoge.c +p' > /sys/kernel/debug/dynamic_debug/control
```

# コンソールがblankになるのを止める

i.MX6だとブートパラメタに`consoleblank=0`を追加するのが有効だった

```bash
$ cat /sys/module/kernelparameters/consoleblank
0
```

0になっていれば止まっている

# 割込み関連

```bash
$ cat /proc/interrupts
```

# デバッグ関連

## コアを吐かせる

デフォルトではコアの最大量が0になっているので`ulimit`で設定する。

```bash
$ ulimit -c unlimited
```

init.dスクリプトで起動している場合はスクリプト内でアプリ起動前に記載する。

## コアのファイル名変更

例

```bash
$ echo "/core.%e.%p" > /proc/sys/kernel/core_pattern
```

%eはプロセス名、%pはPID
PostgreSQLのJSONB型のときにJSON内部の値でソートする方法

## 条件

`products`テーブルの、`product_types`カラムがJSONBであるとき、`product_types`内にあるJSONが、

```json

[{"name": "awesome", "line_number": 1}]
```

という形式のとき、この `line_number` でソートする。`product_types`内のJSONが配列以外の場合も考慮する。

## SQL

```sql
SELECT id, product_types
FROM products
ORDER BY
	CASE
		WHEN jsonb_typeof(product_types) = 'array'
		THEN jsonb_array_elements(product_types)->>'line_number'
		ELSE NULL
	END ASC;
```
Base64文字列からImageを生成したい

メモでした。

```swift
let url = URL(string: String(format:"data:application/octet-stream;base64,%@",base64String))
do {
    let data =  try Data(contentsOf: url!)
    let image = UIImage(data: data)         // NSImageもいけるはず
} catch {
    //error
}
```

# 参考
* [Convert UIImage to base64 string in swift - stackoverflow](https://stackoverflow.com/questions/40396110/convert-uiimage-to-base64-string-in-swift)
katana-swift + redux-dev toolsを試して見た


## はじめに
- swiftでReduxがライクなライブラリを調べているときに試して見たのでまとめて見ました

## katana-swiftとは
[BendingSpoons/katana-swift](https://github.com/BendingSpoons/katana-swift)
>Swift Apps in a Swoosh! A modern framework for creating iOS and macOS apps, inspired by React and Redux.

- ReactとReduxと似たような仕組みを提供するライブラリである

## 準備
#### 1. Xcodeのプロジェクトに`katana-swift`を追加
#### 2. `katanaMonitor-lib-swift`を追加
[bolismauro/katanaMonitor-lib-swift](https://github.com/bolismauro/katanaMonitor-lib-swift)
redux-devtools用のmiddleware

#### 3. remotedev-serverを追加
```shell
npm install -g remotedev-server
```

#### 4. localHostの設定
`http://remotedev.io/local/`を開き、`Settings`から　localHostの設定を行います

## 実行
#### 1. remotedevを起動する
```shell
remotedev
```
#### 2. アプリの起動
- アプリのアクションがredux-devtoolsで表示されます

## DEMO
![demo.gif](https://qiita-image-store.s3.amazonaws.com/0/63985/a6ea3132-7b0d-89a8-cd2b-f643ed1e6bb6.gif)



##参考リンク　
[BendingSpoons/katana-swift](https://github.com/BendingSpoons/katana-swift)
[bolismauro/katanaMonitor-lib-swift](https://github.com/bolismauro/katanaMonitor-lib-swift)
[gaearon/redux-devtools](https://github.com/gaearon/redux-devtools)
【TSLint】【WebStom】Code Style For TypeScript

# 【TSLint】【WebStom】Code Style For TypeScript

## 概要

WebStorm、PhpStormで、TypeScript用のCode Styleを探したが、
TSLintに合致するCode Styleが見つからなかったので、公開してみることにしました。


In WebStorm, PhpStorm I looked for Code Style for TypeScript,
I could not find a code style that matched TSLint, so I decided to publish it.

## 参考

jscs
https://www.npmjs.com/package/jscs

JSCS is a code style linter and formatter for your style guide.
JSCSは、スタイルガイドのコードスタイルのリンターとフォーマッターのこと。

## Code Style For TypeScript

下記、XMLをコピペして、インポートしてください。

Please copy and paste the XML below, please import.

`Editor > Code Style > TypeScript > Import Scheme > Intellij IDEA code Styl XML`

```xml:JSCS.xml
<code_scheme name="JSCS" version="173">
  <JSCodeStyleSettings>
    <option name="SPACE_BEFORE_FUNCTION_LEFT_PARENTH" value="false" />
    <option name="USE_DOUBLE_QUOTES" value="false" />
  </JSCodeStyleSettings>
  <TypeScriptCodeStyleSettings>
    <option name="USE_DOUBLE_QUOTES" value="false" />
    <option name="FORCE_QUOTE_STYlE" value="true" />
    <option name="SPACES_WITHIN_IMPORTS" value="true" />
    <option name="SPACES_WITHIN_UNION_TYPES" value="false" />
    <option name="SPACES_WITHIN_OBJECT_TYPE_BRACES" value="false" />
  </TypeScriptCodeStyleSettings>
  <codeStyleSettings language="JavaScript">
    <option name="RIGHT_MARGIN" value="100" />
    <option name="DOWHILE_BRACE_FORCE" value="3" />
    <indentOptions>
      <option name="INDENT_SIZE" value="2" />
    </indentOptions>
  </codeStyleSettings>
  <codeStyleSettings language="TypeScript">
    <option name="SPACE_WITHIN_PARENTHESES" value="true" />
    <indentOptions>
      <option name="INDENT_SIZE" value="2" />
      <option name="CONTINUATION_INDENT_SIZE" value="2" />
      <option name="TAB_SIZE" value="2" />
    </indentOptions>
  </codeStyleSettings>
</code_scheme>
```
<img width="869" alt="スクリーンショット 2018-01-31 9.41.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/112294/fefa0cb1-866d-67b4-fdaa-c5f2a75886e6.png">

## Formatの仕方 / How to code format.

Macの場合であれば、以下コマンドを実行してください。 / In case of Mac, execute the following command.
`option + command + L`
clamavのサービス名が変わってた件

今朝 cron の yum update で EPEL repository から導入している clamav が
sysvinit 版から systemd 版に勝手に差し替えられてましたのでメモ

From yum.log 
>Jan 31 06:31:28 Erased: clamav-scanner-sysvinit-0.99.2-13.el7.noarch
Jan 31 06:31:28 Erased: clamav-server-sysvinit-0.99.2-13.el7.noarch
Jan 31 08:38:09 Installed: clamav-server-systemd-0.99.3-1.el7.noarch
Jan 31 08:38:09 Installed: clamav-scanner-systemd-0.99.3-1.el7.noarch
Jan 31 08:38:09 Installed: clamav-scanner-0.99.3-1.el7.noarch

で、サービス名もclamd.scan.service -> clamd@scan.service に変更になってます
かといって新サービス名で起動してくれる訳でもなく
systemctl で見ると古いclamd.scan.serviceも残ってたりと結構雑に処理されてて泣ける

> 
 #systemctl -a  |grep clam
● clamd.scan.service             not-found failed   failed    clamd.scan.service
  clamd@scan.service              loaded    active   running   Generic clamav scanner daemon

/usr/lib/systemd/system や /etc/systemd/system/multi-user.target.wants 以下に
ファイルもなくdisableもできんので

>
 # systemctl disable clamd.scan.service
Failed to execute operation: No such file or directory

systemdのキャッシュ？再起動待ちかこれ..
Vue.js で、HTMLタグ文字列を展開して表示する(テンプレート構文)

# 概要
`"<h1>hoge</h1>"` のような文字列をを HTML タグと認識させて表示させたくなった。
その方法をまとめた。

# 実現イメージ
![スクリーンショット 2018-01-31 9.05.05.png](https://qiita-image-store.s3.amazonaws.com/0/183649/1fa996dd-be64-9d3a-93a7-ddccdd0ea539.png)
↑`"<h1>hoge</h1>"` が展開されている。
(vue.js っぽく、textbox に入力された文字列をそのままバインディングして表示している。)

# ソースコード

```html
<template>
  <div>
    <input type="text" v-model="msg" >
    <p v-if="msg.length > 0">
      {{msg}}
      <br/>
      <span v-html="msg"></span>
    </p>
  </div>
</template>

<script>
export default {
  data() {
    return {
      msg: '<h1> hoge </h1>',
    };
  },
};
</script>
```

# 解説
`v-html=""` というもので表示させたいHTMLタグ文字列を指定すると、展開して表示される。

# 参考
https://jp.vuejs.org/v2/guide/syntax.html
公式。
[読書メモ]Pattern-Oriented Software Architecture Volume 4 - Domain Object(Pg. 208)

# What is "Domain Object"?
アプリケーションの中で、単独の機能として独立した部品のことをDomain Objectという。
ここでいうDomain Objectはとても広い意味で使われている。
例えばこのDomain Objectは以下のような様々な粒度の抽象度を持っている。
1. ビジネスレベル（Application Service）
    - 銀行システム、航空券予約システム
2. 機能レベル（Component）
    - 為替計算機能、消費税計算機能
3. さらに細かいレベル（Value Object, Copied Value, Immutable Value）
    - 型ではなく、状態に注目されるものたち
    - 日付、消費税率
# 実装の注意点
1. 各オブジェクト感はインターフェースを介して実装する。
    - オブジェクトのクライアントが実装の内容ではなく、Contractにのみ関心を持つことで、別々に開発することが可能になる。
2. 個々のオブジェクトを独立させる程度は、以下の２点によって決まる。
    - そのオブジェクトの抽象度
    - そのオブジェクトの変更頻度

# ジモティーで考えると？
開発のセオリー？は異なるオブジェクト間のコミュニケーションには間にinterfaceを挟むことのような気がして来ました。
（なんども `develop and evolve independently`という記述が出て来ます。）

ただinterfaceを挟むことはファイル数が多くなったりして、いいことばかりじゃないです。
この章でも言われているように、interfaceを挟むポイントは、オブジェクトの抽象度が高い場合、またはオブジェクトの実装に変更が加えられる頻度が高い場合です。
例えば、ジモティーのAndroidはActivity（View）とPresenter（画面の表示のための処理を一括管理している。データの取得、ロジック、データの整形など）の間にinterfaceを挟んでいます。

しかし、Presenterとinteractor（ロジック）の間にはinterfaceがありません。
ここにもinterfaceがあってもいいのかもしれないと思いました。理由は以下の２点です。
1. PresenterはView層で、interfaceはDomain層だから。二つの間に層を区切るinterfaceが必要。二つの層の間を意識せずに直接実装を参照できるのはアーキテクチャとしてはだめなきがする。（実際、repositoryは異なる層の間を埋めあわせるinterfaceとして定義されている）
2. interactorはまだ育てている途中で、かなり変化が激しい。だからPresenterはinteractorの実装に依存させないで、コントラクトに依存させるようにした方が安定しそう。開発者としても影響範囲の切り分けに自信を持てる気がする。

以上のような理由もあって、UseCaseはその役目を担うことになるのかなと思っています。
重複した値を持つ配列の結合



重複した値を持つ配列を結合する場合に、重複した値を削除して新しい配列を作りたかった。
（+演算子と```array_merge```ではうまくいかないことは後述）

## これでできる


```
$array1 = [
    'b',
    'a',
    'c',
];
$array2 = [
    'a',
    'd',
];

$results = array_unique(array_merge($array1, $array2));

var_dump($results);

/* 結果 */
array(4) {
  [0]=>
  string(1) "b"
  [1]=>
  string(1) "a"
  [2]=>
  string(1) "c"
  [4]=>
  string(1) "d"
}
```



## 補足：+演算子とarray_mergeではどうなるか

```
$array1 = [
    'b',
    'a',
    'c',
];
$array2 = [
    'a',
    'd',
];

$results1 = $array1 + $array2;
$results2 = array_merge($array1, $array2);

var_dump($results1);
var_dump($results2);
```

### 結果
+演算子はキーの被った値が残る。
```array_merge```は和集合的に結合してキーが振りなおされる。

```
array(3) {
  [0]=>
  string(1) "b"
  [1]=>
  string(1) "a"
  [2]=>
  string(1) "c"
}
array(5) {
  [0]=>
  string(1) "b"
  [1]=>
  string(1) "a"
  [2]=>
  string(1) "c"
  [3]=>
  string(1) "a"
  [4]=>
  string(1) "d"
}

```
vuefireでFirestoreとbindするときにハマったこと

今回は[vuefire](https://github.com/vuejs/vuefire)でFirestoreをbindするときにすこし手間取ったので、それを共有したいと思います。

まず最初に結論から言うと、いままで存在していた`$bindAsArray`、`$bindAsObject`関数は無くなり、`$bind`に統合されました。

自分の場合は下記のエラーで異変に気づき、どうしても解決できず、[issue](Error($bindAsObject is not a function) occurred · Issue #156 · vuejs/vuefire : https://github.com/vuejs/vuefire/issues/156)立てたら教えてくれました。

```
TypeError: _this.$bindAsObject is not a function
```

> You don't need to specify anymore if it's a collection or a document 🙂 , so it's just $bind: https://github.com/vuejs/vuefire/blob/firestore/examples/index.html#L113

[examples](https://github.com/vuejs/vuefire/blob/firestore/examples/index.html)をみてれば一発だったようです（READMEに書いて・・）。

さて、ここからは簡単なfirestore x vuefire導入編です。

## 使い方
**vuefire@nextをインストールします**
    
```shell
$ npm install vuefire@next --save
```
**$bind関数でFirestoreのデータと紐付けます**

```javascript
this.$bind('loginUser', firestore.collection('users').doc(userId))
```
そもそもですが、上記の例の`userId`のように変数を使わないのであれば、シンプルに下記のように記述するのが良いと思います。

```javascript
new Vue({
  data: {
    todos: [],
    currentTodo: null
  },
  firestore: {
    todos: db.collection('todos'),
    currentTodo: db.collection('todos').doc('1')
  }
})
```

## 参考リンク
* [Firestore Roadmap · Issue #145 · vuejs/vuefire](https://github.com/vuejs/vuefire/issues/145)
* [vuejs/vuefire at firestore](https://github.com/vuejs/vuefire/tree/firestore)
* [Error($bindAsObject is not a function) occurred · Issue #156 · vuejs/vuefire](https://github.com/vuejs/vuefire/issues/156)
[Salesforce] パッケージが提供するカスタムリンク、カスタムボタンの「リンクのエンコード」に UTF-8 以外が使われていないか調べる

パッケージのメタデータを Salesforce DX で取得して、grep するのが簡単です。
メタデータの取得は [[Salesforce DX] 組織のインストール済パッケージのメタデータをぱぱっと取得する](https://qiita.com/frx_shinchi/items/dd8bdb78f58126fb2888) を参照してください。

メタデータを取得したら、 キーワード encodingKey で grep します。

``` encodingKey-grep.sh
$ grep -r 'encodingKey' /path/to/metadata/*
/path/to/metadata/objects/Campaign.object:        <encodingKey>UTF-8</encodingKey>
/path/to/metadata/objects/Opportunity.object:        <encodingKey>UTF-8</encodingKey>
/path/to/metadata/objects/Opportunity.object:        <encodingKey>UTF-8</encodingKey>
/path/to/metadata/objects/Opportunity.object:        <encodingKey>UTF-8</encodingKey>
/path/to/metadata/objects/Opportunity.object:        <encodingKey>UTF-8</encodingKey>
/path/to/metadata/objects/Opportunity.object:        <encodingKey>UTF-8</encodingKey>
/path/to/metadata/objects/Opportunity.object:        <encodingKey>UTF-8</encodingKey>
```
&lt;encodingKey&gt; に UTF-8 以外が使われていなければ、「リンクのエンコード」に UTF-8 以外のエンコーディングは使われていないと判断できます。

Salesforce からのアナウンス [重要: Salesforce へのリクエストは適切な UTF-8 のみ有効です](https://help.salesforce.com/articleView?id=encode&type=1&language=ja) の対応項目の一つで、自組織で使っているパッケージに [カスタムボタンの「リンクのエンコード」が Unicode(UTF-8) 以外かつ差し込み項目の値がマルチバイトの場合](https://help.salesforce.com/articleView?id=Illegal-Request-Samples04&language=ja&type=1) がないかを確認する必要があったのですが、上記の方法を使うことで簡単に調査できました。
GitHub > ページへのアクセス制限 > REST API v3は60/hour | https://github.comアクセスは40/hour

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 16.04 LTS desktop amd64
TensorFlow v1.2.1
cuDNN v5.1 for Linux
CUDA v8.0
Python 3.5.2
IPython 6.0.0 -- An enhanced Interactive Python.
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
scipy v0.19.1
geopandas v0.3.0
MATLAB R2017b (Home Edition)
ADDA v.1.3b6
```

GitHubのページアクセス制限を調べた。

2018-01-31現在の情報。

- GitHub REST API: 60 per hour
    - `https://api.github.com`でのアクセス
    - [こちらのコードv0.2](https://qiita.com/7of9/items/8b76464c087620ee5ee0#_reference-867b861be8ccd906c4db)を使用
    - 公式ドキュメントについては[こちらにリンクを記載](https://qiita.com/7of9/items/8b76464c087620ee5ee0#_reference-867b861be8ccd906c4db)
        - https://developer.github.com/v3/#rate-limiting
        - > For unauthenticated requests, the rate limit allows for up to 60 requests per hour. Unauthenticated requests are associated with the originating IP address, and not the user making requests.
- `https://github.com/`でのアクセス: 40 per hour
    - [こちらのコード](https://qiita.com/7of9/items/a02ed74c95a136423143#comment-1b4652ae2a6578990351)を使用


### 関連

- [MemoryEnhancer > MEDC > test_get_list_180130.py > GitHub上のMarkdownファイル名(*.html.md)リストを取得する | GitHub REST API v3 | JSONモジュール | BeautifulSoup](https://qiita.com/7of9/items/a02ed74c95a136423143)
- [onlineTool > カウンターツールはGカウンター！
onlineTool](https://qiita.com/7of9/items/a0c1a9c8282ab273eedf)
[Salesforce DX] 組織のインストール済パッケージのメタデータをぱぱっと取得する

Salesforce DX を使って手早く既存組織のインストール済パッケージのメタデータを取得する方法です。

``` sfdx-get-org-metadata.sh

# エイリアス MyOrg に既存組織を紐付ける（コマンド実行後にブラウザが立ち上がるので紐付ける組織にログインする
$ sfdx force:auth:web:login -a MyOrg

# Salesforce Dx のプロジェクトをプロジェクト名 MyProject で作成
$ sfdx force:project:create --projectname MyProject

$ cd MyProject

# メタデータを出力するディレクトリを作る
$ mkdir mdapipkg

# パッケージ MyPackageName のメタデータを取得
$ sfdx force:mdapi:retrieve -s -r ./mdapipkg -u MyOrg -p MyPackageName
Retrieving source...

=== Status
Status:  InProgress
jobid:  09S10000001YS9oEAG


=== Result
Status:  Succeeded
jobid:  09S10000001YS9oEAG

Wrote retrieve zip to /path/to/MyProject/mdapipkg/unpackaged.zip.
```
mdapipkg ディレクトリに作成される unpackaged.zip にメタデータが入っています。
量子コンピュータで足し算ができる電卓を作った

# はじめに

（注）
私は量子情報の専門家でも、情報の専門家でもありません。ただいま勉強中です。誤りがありましたらご指摘いただけると幸いです。

世の中[すごい人](https://qiita.com/converghub)がいるもので、上のような文言で始まる方が猛烈な勢いで量子コンピュータの記事を書かれているので触発されて私も量子コンピュータを使ったプログラム作ってみました。上記のとおり私も専門家ではありません。

作ったものは**電卓**です。

# 量子コンピュータで電卓を作る
今回の元になった記事は@converghubさんの記事です。

 * [量子コンピュータ（シミュレータ）でモジュール化可能な加算器を作る](https://qiita.com/converghub/items/c61b2b91b311cf730e18)

記事の中では。3 Qubits同士の足し算回路の説明がされています。入力状態はXゲート（制御NOTゲート）を最初に挿入することで変えられるようです。
ということはこれをプログラムからいじれば、任意の数字を足すことができる電卓が可能ということになります。任意と言っても、**3 Qubitsなので表現できるのは0から7の8種類の自然数**となります。電卓としては、**かなりの低性能**ですが、何はともあれとりあえず作って見ました。

[量子電卓(Quantum Calculator)](https://github.com/hotstaff/qc)

# 環境
QISKitを使うには、Pythonが3.5以上でないといけないので、これをインストール。その試練を乗り越えれば

```
import qiskit
```

としてqiskitがインポートできます。

そして、GUIにはwxPythonを使っているので

```
import wx
```

が可能となれば、電卓が起動可能です。

といっても、これが厄介で、python3.5のパッケージはpip経由では入りませんでした。
そういうわけで、数日前からwxPythonと格闘していました。その結果たどり着いた結論が次のとおりです。
[ubuntu16.04のpython3にwxpythonをインストールする](https://qiita.com/hotstaff/items/b3f8bb4c3c098d95925c)

ビルドするとややこしい問題がいろいろ出てくるので、ビルド済みをインストールして解決するのが早いと思います。

ちなみに、私の非力なノートパソコン(Panasonic CF-R5)では**ビルドするのに約半日かかりました。**

# 使い方
環境が揃っていれば起動するはずです。

```
python3 qc.py
```

![screenshot](https://raw.github.com/wiki/hotstaff/qc/images/screen_shot_v0.0.1.png "screen shot")

ご覧の通り、８と９のボタンは使わないので最初から**無効化**されています。さらに引き算の演算もまだ作ってないため**無効化**されています。
出来ることは3 Qubitsで表すことが出来る、0から7の数字を入力して足すことのみとなっています。ちなみに、結果も3 Qubitsで表される必要があるので、オーバーレンジとなった場合は**OR**表示になります。


# 実際に計算してみる

1 + 1 = 2
当たり前です。

1 + 7 = OR
仕方ありません。（3 Qubitsでは7より大きい数を表せない。）

1 + H = 4,3,6,OR,1,5,7,2
これがこの電卓の**唯一の意義**です。

Hはアダマールゲートを3 Qubits分作用させたものになっています。
その時入力ゲートは0と1の混ざった状態になっていますから、並列に計算ができるというわけです。
数字の順序は観測された状態のカウント順です。

# 現状
実際に計算してみると、相当時間がかかります。約30秒〜、デフォルトでは**local_qasm_simulator**を使うようになっていますが、これはIBM Q experienceのAPItokenをQconfig.pyに設定すればIBM Qの**ibmq_qasm_simulator**上でも実行できます。（約10秒程度）


# まとめ
量子アルゴリズムを使った簡単な電卓を作ってみました。自由にゲートが配置できればいいのですが、実際の量子チップはまだ10 Qubits以上で自由にゲートを配置できるものがないので、シミュレータ上の動作になります。これは現状ではデバイスに合わせて量子回路を組まなければならないということなのでしょうか。この辺がもっと簡単になればいいなと思います。

# 追記
そうこうしてるうちに@converghubさんの新しい記事が！
 * [量子コンピュータ（シミュレータ）でモジュール化可能な加算器を作る【QISKit編】](https://qiita.com/converghub/items/fc0df6a05e26302ac5fc)

# 追記２ 2018/03/03
・３ Qubits以上にも対応したため、8キーと9キーを有効化しました。
・任意のビット長（n Qubits）の足し算と引き算にも対応しました。
・任意の長さの計算(1+1+1等)の場合にも量子回路をつなげて足すことで計算できるようになりました。
Docker debian系のlocaleを日本語化する

ruby用のDocker Imageを利用すると、debian系だったためメモ

```dockerfile
ENV DEBIAN_FRONTEND noninteractive

RUN apt-get update
RUN apt-get install -y locales

RUN echo "ja_JP.UTF-8 UTF-8" > /etc/locale.gen && \
    locale-gen ja_JP.UTF-8 && \
    dpkg-reconfigure locales && \
    /usr/sbin/update-locale LANG=ja_JP.UTF-8

ENV LC_ALL ja_JP.UTF-8
```
影と角丸とHardware accelerationの罠

ICS以上端末サポートでの影（elevation）と角丸(ClipPath)を同時に使ったときにハマったので
ハードウェアアクセラレーション(HD)と影(elevation)と角丸(clippath)とAPI Levelの関係を備忘録がてら表にしておきます。

HDはAPI11以上はデフォルトON(*4)

|  　　       |elevation（API21以上）|　　ClipPath　|
|:--------:|:------------------:|:------:|
|HDオン|有効　|API18以上(*4)|
|HDオフ|無効|有効|


結果、自分はAPI21未満はelevationはあきらめて、API18未満はHDをオフ、API18以上はHDをオンでとりあえず対応しました




参考
*1)Elevation
https://developer.android.com/reference/android/view/View.html#setElevation(float)

*2)AndroidでViewを角丸にする
https://qiita.com/ushi3_jp/items/c568e7be76efafbe7de9

*3)Toolbarに影をつける方法まとめてみたhttps://qiita.com/tomoima525/items/d361d05adf6807e85ccd

*4)Hardware Acceleration
https://developer.android.com/guide/topics/graphics/hardware-accel.html
![スクリーンショット 2018-01-31 2.52.32.png](https://qiita-image-store.s3.amazonaws.com/0/231675/372293ca-f66a-b9b6-4a09-46d2ec9ea7ef.png)
Python2.6でTimedRotatingFileHandlerのログローテートが効かない問題への対処

## TimedRotatingFileHandlerのログローテーション

RHEL6やCentOS6で標準のPythonのバージョンは2.6なのでPython2.6を使うことがあるのですが、2.7以降では見られない挙動がありました。

```python:hoge.py
from logging import getLogger
from logging.handlers import TimedRotatingFileHandler

logger = getLogger(__name__)

handler = TimedRotatingFileHandler("hoge.log",'S')

logger.addHandler(handler)
logger.error("test")
```

上記のようなファイルを作って実行すると、Python2.7以降(3系含む)ならログローテートされて`hoge.log.2018-01-31_02-04-27`といったファイルが作られるかと思います。
しかし、Python2.6だとログローテートされずに`hoge.log`に追記され続けてしまいます。

## ログローテートされない原因

原因を探ろうと[公式サイト](https://www.python.org/)からソースコードを取ってみたら、`TimedRotatingFileHandler`クラスのコンストラクタで設定される`rolloverAt`の値に違いが有りました。

```python:Python-2.6.9/Lib/logging/handlers.py
class TimedRotatingFileHandler(BaseRotatingHandler):
    def __init__(self, filename, when='h', interval=1, backupCount=0, encoding=None, delay=0, utc=0):
# 略
        self.rolloverAt = self.computeRollover(int(time.time()))
```

```python:Python-2.7/Lib/logging/handlers.py
class TimedRotatingFileHandler(BaseRotatingHandler):
    def __init__(self, filename, when='h', interval=1, backupCount=0, encoding=None, delay=0, utc=0):
# 略
        if os.path.exists(filename):
            t = os.stat(filename)[ST_MTIME]
        else:
            t = int(time.time())
        self.rolloverAt = self.computeRollover(t)
```

`computeRollover`は次にログローテートが必要な時刻を計算するメソッドです。
計算は引数の時刻にもとづいて行われます。
`when="S",interval=5"`なら`t`の5秒後、`when="D",interval=5"`なら`t`の5日後、`when="MIDNIGHT"`なら`t`の次の00:00、というように動作します。

2.6では`t`の値がスクリプトを実行された時刻となるため、ログローテートする時間に達することがなかったということになります。
つまり、下記のようにsleepを入れるとログローテートしてくれそうです。

```python:hoge_sleep.py
from logging import getLogger
from logging.handlers import TimedRotatingFileHandler
from time import sleep

logger = getLogger(__name__)

handler = TimedRotatingFileHandler("hoge.log",'S')

logger.addHandler(handler)
sleep(2)
logger.error("test")
```

## 解決策

1日毎にログローテートするために24時間sleepを入れるのは現実的ではないので、Python2.7のコードを移植したいと思います。
クラスを作らなくても直接書いても良い気もします。


```python:hoge26.py
from logging import getLogger
from logging.handlers import TimedRotatingFileHandler
from time import sleep
from stat import ST_MTIME
import os

class TimedRotatingFileHandler26(TimedRotatingFileHandler):
    def __init__(self, filename, when='h', interval=1, backupCount=0, encoding=None, delay=0, utc=0):
        super().__init__(filename, when, interval, backupCount, encoding, delay, utc)
        if os.path.exists(filename):
            t = os.stat(filename)[ST_MTIME]
            self.rolloverAt = self.computeRollover(t)

logger = getLogger(__name__)

handler = TimedRotatingFileHandler26("hoge.log",'S')

logger.addHandler(handler)
logger.error("test")
```

これでPython2.6でもログローテートするようになるかと思います。
AppleScriptでiTunesのトラックをファイルごと削除する

```applescript
tell application "iTunes"
  repeat with theTrack in selection
    set dbid to theTrack's database ID
    set filePath to theTrack's location as Unicode text

    --ライブラリから削除
    delete (some track of library playlist 1 whose database ID is dbid)

    --ファイルをゴミ箱へ移動
    tell application "Finder"
      delete file filePath
    end tell
  end repeat
end tell
```

ライブラリは音楽/動画関係なく`library playlist`なので、そこから`database ID`を条件にトラックを削除する。ライブラリから削除しただけではファイルが削除されないので、別途削除する。
[Android Studio][gradle]gradleとAndroid plugin for gradleのバージョンを合わせる

gradleプロジェクトを開いてAPKファイルを作成しようとすると、
以下のエラーが発生。

>Error:The versions of the Android Gradle plugin and Gradle are not compatible. Please do one of the following:<ul><li>Update your plugin to version 2.4. This will require changes to build.gradle due to API changes. <a href='https://goo.gl/sEn5eA'>Open migration guide</a></li><li>Downgrade Gradle to version 3.5. <a href="fixGradleVersionInWrapper">Fix Gradle wrapper and re-import project</a></li></ul>

gradleとgradle Plugin(Android plugin for gradle)のバージョンに互換性がないと発生するエラーっぽい。

File -> Project Structure -> Projectでgradleのバージョンを確認すると、
![image.png](https://qiita-image-store.s3.amazonaws.com/0/147857/f267417b-295f-6757-076d-2365a687a626.png)

gradleが4.1なのに対して

build.gradleファイルでは次のとおりPluginのバージョンが2.1となっていた。
>dependencies {
		classpath 'com.android.tools.build:gradle:2.1.0'
	}

gradle 4.1はgradle plugin 3.0.0以上が必要らしい。

build.gradleでプラグインのバージョンを書き直して「try again」をクリックすると
対象バージョンのプラグインを勝手にインストールしてビルドしてくれた。

こちらの記事を参考にさせていただきました。ありがとうございました。
https://qiita.com/izuki_y/items/3c20cd1c655fc4fc6127
bashのif文判定サンプル

#基本構文

```
if 条件式1 ; then
  処理1
elif 条件式2 ; then
  処理2
else
  処理3
fi
```
#testコマンド
|オプション| 使用例 | 説明 | 数式サンプル |
|:--------|:--|:--|:--|
| -eq | test num1 -eq num2 | num1 と num2 が等しければ真 | num1=num2 |
| -ne | test num1 -ne num2 | num1 と num2 が等しくなければ真 | num1≠num2 |
| -lt | test num1 -lt num2 | num1 が num2 より小ならば真 | num1<num2 |
| -le | test num1 -le num2 | num1 が num2 以下ならば真 | num1≦num2 |
| -gt | test num1 -gt num2 | num1 が num2 より大ならば真 | num1>num2 |
| -ge | test num1 -ge num2 | num1 が num2 以上ならば真 | num1≧num2 |

testコマンドは[]で代用可能
[　]と[[　]]はワード分割とパス名展開がされないという違いあり

```
val='hoge hoge'
[ $val == hogehoge ]; echo $?
bash: [: 引数が多すぎます
2

val='hoge hoge'
[ '$val' == hogehoge ]; echo $?
1
```

[[　]]は変数展開をクォートする必要がない

```
val='hoge hoge'
[[ $val == hogehoge ]]; echo $?
1
```

```
ディレクトリがない場合
if [ ! -d log ]
then
    echo log dir nothing!!
fi
```

http://shellscript.sunone.me/if_and_test.html
https://fumiyas.github.io/2013/12/15/test.sh-advent-calendar.html


```
変数が空でない場合のみ
if [ -n "$STRING" ]; then
  #処理
fi
```

参考演算子的な、
\# $foo が $bar より大きければ 0 、そうでなければ 1 を $baz に代入する。

```
[ $foo -ge $bar ] && baz=0 || baz=1

[[ CONDITION ]] && { CMD1; CMDn; } || { CMDe1; CMDen; exit; }

```

以降作成中。。。
Cisco VIRL(Virtual Internet Routing Lab)を導入する

#Cisco VIRL(Virtual Internet Routing Lab)とは

Ciscoが提供する公式エミュレータのこと。
フリーのDynamips（今はGNS3）と大きく違うのはIOSが公式に提供されるかどうか。
探す手間が省けるというのがメリットが大きいと思います。
（私は探すのが面倒だったので頑張れませんでした。）

#Cisco VIRL Personal Editionを購入
https://learningnetworkstore.cisco.com/virtual-internet-routing-lab-virl/cisco-personal-edition-pe-20-nodes-virl-20

- $199は20ノードまでの制限付き。
- 利用期限は365日。

#Cisco VIRLイメージの入手
<img width="853" alt="スクリーンショット 2018-01-30 23.45.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/179275/1ac265ff-7fe2-6889-68ad-f7444151d758.png">

「VMware Fusion Pro」か、「EXSi」等が選べるので準備できる環境のイメージを入手する。
私はMacbook環境だったので、1NICかつVMware Fusion Proのovaを選択しました。


#VMware Fusion Proの入手
https://www.vmware.com/products/fusion/fusion-evaluation.html

一旦トライアル版（30日）をインストール。
動作確認をして購入をすることした。結構高いんだもん。



#いきなり問題にぶち当たる
「Unsupported value 'vhv.enable' for attribute 'key' on element 'ExtraConfig'」というエラーが出てインポートができない。

調べてみると、Cisco VIRLとVMware Fusionの更新は同期していないので多々バージョン不整合が発生しているらしい。

##解決方法
https://learningnetwork.cisco.com/thread/120789

###1. virl.1i.1.3.296.pc.ova を7zipで解凍（Unzip）する
→7zipにてUnzipする。自分は以下にて対応。
>$ brew install p7zip
>$ 7z x virl.1i.1.3.296.pc.ova

###2. 解凍により以下3つのファイルが生成されるのでそれぞれ対応する

(1) virl.1i.1.3.296.pc.ovf
→テキストエディタで開き、「\<vmw:ExtraConfig vmw:key="vhv.enable" vmw:value="TRUE"/>」の行を削除して上書き保存。

(2) virl.1i.1.3.296.pc.mf
→テキストエディアで開き、以下方法で得た「virl.1i.1.3.296.pc.ovf」のSHA1ハッシュを更新する
>$ openssl sha1 virl.1i.1.3.296.pc.ovf
>SHA1(irl.1i.1.3.296.pc.ovf)= 58952d37f9eac99e90f59c0925f39a4067878e80

(3) virl.1i.1.3.296.pc.ova
→何もしない。

###3. virl.1i.1.3.296.pc.ovfをインポート（virl.1i.1.3.296.pc.ovaではない）


#とりあえず、ようやく起動。
<img width="802" alt="スクリーンショット 2018-01-31 1.31.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/179275/e5a8b5ab-3d1b-4f4b-a2bc-28b8d1d67f5b.png">
virl login:virl
Password:VIRL

続きはまた。