OmniAICreator/Qiita-1.07M huggingface dataset:
DocFXをUnityで使う　メモ

管理者としてPowerShellを実行

chocolatelyをインストール

```@"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))" && SET "PATH=%PATH%;%ALLUSERSPROFILE%\chocolatey\bin"```

DocFXをインストール

```choco install docfx```

ドックを作りたい先のフォルダを用意

docfx作る

```docfx init -q -o <ディレクトリ名>```

プロジェクト・ファイル.csprojとAssets/からcsファイルまでのフォルダ構造を維持した状態でコピーして
Docfxのsrcにcsファイルを入れる

作った場所でPowerShellを実行
もしくは
```cd <initで作成したディレクトリ>```
csファイルを読み込む
```docfx metadata```
サイト作る
```docfx build```

サーバー立てる
```docfx --serve```

サイトが立ち上がる

http://localhost:8080



Doxgenの方が時間かかるだけあって見やすいし色々な形式で見れるからいいが、
DocFXは分かれば最速でドキュメントっぽいのができる。要は作るの楽
iOS13でSegmentedControlの背景を透明にする方法

iOS13でUISegmentedControlの背景を透明にするためには、透明画像を背景にセットする必要がある。

# 実装方法

```UIImage+.swift
import UIKit

extension UIImage {

    public convenience init?(color: UIColor, size: CGSize = CGSize(width: 1, height: 1)) {
        let rect = CGRect(origin: .zero, size: size)
        UIGraphicsBeginImageContextWithOptions(rect.size, false, 0.0)
        color.setFill()
        UIRectFill(rect)
        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()

        guard let cgImage = image?.cgImage else { return nil }
        self.init(cgImage: cgImage)
    }
}
```

```HogeViewController.swift
final class HogeViewController: UIViewController {
    @IBOutlet weak var segmentedControl: UISegmentedControl!

    override func viewDidLoad() {
        super.viewDidLoad()
        setupSegmentedControl()
    }

    private func setupSegmentedControl() {
        let clearColorImage = UIImage(color: .clear, size: CGSize(width: 1, height: 1))
        segmentedControl.setBackgroundImage(clearColorImage, for: .normal, barMetrics: .default)
        segmentedControl.setDividerImage(clearColorImage, forLeftSegmentState: .normal, rightSegmentState: .normal, barMetrics: .default)
    }
}
```
ApplicationLoaderを使用せず、ipaファイルをAppStoreConnectにあげる方法

#経緯
社内SEとして働いており、iOSアプリを外注しています。
iOSアプリがipaファイル形式で納品されており、普段はApplication Loaderを使用してアップロードしていました。
しかしx-code ver11でApplication Loaderが削除されてしまい、使用できなくなったため、ターミナルからアップロードする方法を記事にします。

誰でもできるよう心がけるため、専門用語や難しい言葉は避けて説明します。

##Appパスワードの発行

1. [Appleアカウントの管理](https://appleid.apple.com/account/home)にアクセスし、ログインする
2. 「セキュリティ」タブの「パスワードを生成」を押下
![000506.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311371/ad0b472a-a0f2-e83c-732a-6ece7082b6b6.jpeg)

3. 「パスワードラベル」を入力し、作成を押下
作成を押下すると16桁のパスワードが表示されるため、メモをとる
(パスワードのラベルはtestでなくても大丈夫です。)
![000507.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311371/900fa102-7bbe-7ac8-a043-4c6090d0d828.jpeg)

手順3でパスワードが発行できれば完了です。

##ipaアップロード
※macでの作業となります。

1. ターミナルを立ち上げる
2. 以下のコマンドを入力
```xcrun altool --upload-app -f 「ipaファイル」 -t ios -u 「ログインID」 -p 「App用パスワード」```
「」には各々の値を入力する。
ipaファイルやログインID、App用パスワードをダブルクォーテーションで囲む必要はない。<br>
例①
・ipaファイル名：app.ipa ※cdコマンド等でapp.ipaの階層に移動済み
・ログインID：test@test.com
・App用パスワード：tes1-tes2-tes3-tes4
```xcrun altool --upload-app -f app.ipa -t ios -u test@test.com -p tes1-tes2-tes3-tes4```<br>
例②
・ipaファイル名：application.ipa
・application.ipaが存在するフォルダ：app/ipafile ※現在の階層から見たapplication.ipaが存在するフォルダ
・ログインID：test@test.com
・App用パスワード：tes1-tes2-tes3-tes4
```xcrun altool --upload-app -f app/ipafile/app.ipa -t ios -u test@test.com -p tes1-tes2-tes3-tes4```

3. コマンドを打ってレスポンスが何もなければOK
2時間ほどでiTunse store connectにアップロードされる
コマンドが打てる状態になったらアップロード完了
その『内税価格』はありえない『本体価格』になるかもしれない

内税価格から本体価格を算出し、その本体価格から税込価格（＝内税価格）を再度算出すると、金額が1円ずれることがあります。

これは、そもそも内税価格をありえない金額で設定したことが原因になります。

# 前提
+ 内税価格というのは、一般的に「本体価格＋消費税」を端数処理した価格
+ 端数処理には、四捨五入・切り捨て・切り上げの3パターンが存在する
+ **内税価格から本体価格を逆算する際に、本体価格は1円単位の価格設定とする**
+ 内税価格は単価として扱う

## 計算式の概要
本体価格[1円単位] ＝ 端数処理（ 内税価格 ÷ （1 ＋ 消費税率））

## ありえない金額例
内税価格250円、消費税率8%、端数処理：四捨五入 の場合

1. 内税価格→本体価格: 250円 ÷ 1.08 = 231.48...円
2. 本体価格を1円単位に揃えるため四捨五入: 231.48...円 → 231円
3. 本体価格→税込価格: 231円 × 1.08 = 249.48円
4. 税込価格を1円単位に揃えるため四捨五入: 249.48円 → 249円
5. 上記 1. と 5. で 1円ずれている！

```math
\lfloor \lfloor 250 / 1.08 + 0.5 \rfloor * 1.08 + 0.5 \rfloor = 249
```


じゃあ上記 3. を 232円で計算すれば...
 232円 × 1.08 = 250.56円 → 251円（絶望）

# 結論

1. 税込価格の際は本体価格に小数が入ることを認める。
2. 商品ごとに端数処理の方法を変えてごまかす。
3. 上記のようなありえない内税価格を設定しない。

## ありえない内税価格の確認方法

とはいっても、いちいち上記の計算を内税価格に対し確認していたのでは大変です。
内税価格がありえない価格であるか、一覧を作るための数式は以下のとおりです。
消費税率および端数処理の方法により数式が変わるため注意してください。

なお、下記の式で「n」は自然数となります。1から順に当てはめてください。
Excelで作業すると楽です。

### 消費税率 8% (軽減税率) のケース

####【四捨五入】n × 27 - 20、 n × 27 - 7

（例）7円, 20円, 34円, 47円, 61円, 74円, 88円, 101円, 115円, 128円, 142円, 155円, 169円, 182円, 196円, 209円, 223円, 236円, 250円, 263円, 277円, 290円, 304円, 317円, 331円, 344円, 358円, 371円, 385円, 398円, 412円, 425円, 439円, 452円, 466円, 479円, 493円, 506円, 520円, 533円...

####【切り捨て】n × 27 - 14、 n × 27 - 1 
（例）13円, 26円, 40円, 53円, 67円, 80円, 94円, 107円, 121円, 134円, 148円, 161円, 175円, 188円, 202円, 215円, 229円, 242円, 256円, 269円, 283円, 296円, 310円, 323円, 337円, 350円, 364円, 377円, 391円, 404円, 418円, 431円, 445円, 458円, 472円, 485円, 499円, 512円, 526円, 539円...

####【切り上げ】n × 27 - 26、 n × 27 - 13 
（例）1円, 14円, 28円, 41円, 55円, 68円, 82円, 95円, 109円, 122円, 136円, 149円, 163円, 176円, 190円, 203円, 217円, 230円, 244円, 257円, 271円, 284円, 298円, 311円, 325円, 338円, 352円, 365円, 379円, 392円, 406円, 419円, 433円, 446円, 460円, 473円, 487円, 500円, 514円, 527円...

### 消費税率 10% (本則税率) のケース

####【四捨五入】n × 22 - 17、 n × 22 - 6

（例）5円, 16円, 27円, 38円, 49円, 60円, 71円, 82円, 93円, 104円, 115円, 126円, 137円, 148円, 159円, 170円, 181円, 192円, 203円, 214円, 225円, 236円, 247円, 258円, 269円, 280円, 291円, 302円, 313円, 324円, 335円, 346円, 357円, 368円, 379円, 390円, 401円, 412円, 423円, 434円...

####【切り捨て】n × 22 - 12、 n × 22 - 1
（例）10円, 21円, 32円, 43円, 54円, 65円, 76円, 87円, 98円, 109円, 120円, 131円, 142円, 153円, 164円, 175円, 186円, 197円, 208円, 219円, 230円, 241円, 252円, 263円, 274円, 285円, 296円, 307円, 318円, 329円, 340円, 351円, 362円, 373円, 384円, 395円, 406円, 417円, 428円, 439円...

####【切り上げ】n × 22 - 21、 n × 22 - 10
（例）1円, 12円, 23円, 34円, 45円, 56円, 67円, 78円, 89円, 100円, 111円, 122円, 133円, 144円, 155円, 166円, 177円, 188円, 199円, 210円, 221円, 232円, 243円, 254円, 265円, 276円, 287円, 298円, 309円, 320円, 331円, 342円, 353円, 364円, 375円, 386円, 397円, 408円, 419円, 430円...


# 備考

今回は軽減税率と本則税率の切替がある商品で、内税価格から一度本体価格を算出する際に問題になるケースを取り上げました。
細かく書く時間がないので、メモ程度の情報です。
Macで、vimのカーソルをサクサク動かす方法

**注意：これはvimの記事ではなくMacの設定の記事です。**

vimtutorを2週して、
仕事で使っているvscodeのキーバインドをvimにして、
少しづつvimの操作になれ始めているこの頃、

vimで画面を上下にスクロールしたいときに、
カーソルの動きがもっと早くならないかな〜っと思って調べたら、
いい感じに早くなったのでメモ。

## Macのキーボードの設定を開く

システム設定 > キーボード でキーボードの設定を開く

`キーのリピート`を速いのMAXにする。

`リピート入力認識までの時間`を短いのMAXにする

<img width="780" alt="スクリーンショット 2019-09-28 14.25.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272551/fb9d9fb6-4249-a499-7ed8-da1c52f9e810.png">

これでvimの`j`や`ｋ`を押しっぱにしてカーソルを動かしてみよう。
いい感じにカーソルがサクサク動いてくれるようになってるはず。

# おわり

これは文字入力とかのキーのリピートの設定を変えるものなので、
リピートの速度や、リピートの認識時間や速すぎるとおもったら調節してね。
vbsの作法 その34

# 概要

vbsの作法調べてみた。
htaでadodbを叩いてみた。

# サンプルコード


```
<html>
<head>
	<title>mdb5</title>
	<HTA:APPLICATION
		ID = "ohi"
		APPLICATIONNAME = "mdb5"
		BORDER = "thick"
		BORDERSTYLE = "normal"
		CAPTION = "yes"
		CONTEXTMENU = "yes"
		ICON = "./icon.ico"
		INNERBORDER = "yes"
		MAXIMIZEBUTTON = "yes"
		MINIMIZEBUTTON = "yes"
		NAVIGABLE = "no"
		SCROLL = "yes"
		SCROLLFLAT = "no"
		SELECTION = "yes"
		SHOWINTASKBAR = "yes"
		SINGLEINSTANCE = "no"
		SYSMENU = "yes"
		VERSION = "1.0"
		WINDOWSTATE = "normal"/>
</head>
<body>
	<h1>mdb5</h1><br>
	<input type="button" value="disp" onClick="run()"><br>
	<textarea id="out" rows="8" cols="60"></textarea><br>
	<input type="button" value="exit" onClick="exit0()"><br>
	title:<input type="text" id="title" size="20" value="title"><br>
	body:<input type="text" id="body" size="40" value="body"><br>
	<input type="button" value="insert" onClick="insert()"><br>
<script language="VBScript">
	myWidth = 600
	myHeight = 600
	window.resizeTo myWidth, myHeight
	window.moveTo (window.screen.width - myWidth ) / 2, (window.screen.height - myHeight) / 2
	sub run
		Dim cd
		Dim sh
		Dim db
		Dim sql
		Dim str
		Set sh = CreateObject("WScript.Shell")
		cd = sh.CurrentDirectory
		Set db = CreateObject("ADODB.Connection")
		str = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & cd & "\db1.mdb;"
		db.Open str
		sql = "SELECT * FROM test0;"
		Set rs = db.Execute(sql)
		out.value = ""
		Do Until rs.EOF
			out.value = out.value & vbcrlf & "id:" & rs(0) & " title:" & rs(1) & " body:" & rs(2) & " time:" & rs(3) 
			rs.MoveNext
		Loop
	end sub
	sub exit0
		window.close
	end sub
	sub insert
		Dim cd
		Dim sh
		Dim db
		Dim sql
		Set sh = CreateObject("WScript.Shell")
		cd = sh.CurrentDirectory
		Set db = CreateObject("ADODB.Connection")
		db.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & cd & "\db1.mdb;"
		sql = "INSERT INTO test0(title,body) VALUES('" & title.value & "','" & body.value & "');"
		Set rs = db.Execute(sql)
		msgbox "ok"
	end sub
</script>
</body>
</html>




```

以上。
ABC 112-B priority_queueの使いかた

#priority_queueとは？
**C++**で利用できるコンテナ・アダプタの1つで、**優先順位付きキュー**を実現しているもの。

```c++
#include <bits/stdc++.h>
#define rep(i,n) for (int i=0; i<n; i++)
using namespace std;

priority_queue<int, vector<int>, greater<int>> A;//箱Aのtopが小,bottomが大の並び方にした
 
int main(){
    int N,T; cin >> N >> T;
    int c,t;
    rep(i,N){
        cin >> c >> t;
        if (t<=T) A.push(c);
    }
    if (A.empty()) cout << "TLE" << endl;//箱Aの中身が空ならTLE
    else cout << A.top() << endl;//箱Aの中身がある場合、topの一番小さい値をとりだす！
}
```

#まとめ
箱Aの中身を自分で操作しなくても、**昇順**、**降順**に自動で分けられるので簡単！
JavaScriptのテストをCircleCIからGitHubActionsに移行する

GitHubActionsを試してみましたがめちゃ便利ですね。早速今までCircleCIで動かしてたJavaScriptのテストをGitHubActionsで書き直してみました。

GitHubActionsのほうが並列実行に優れていて、値段も安いっぽいです。

## CircleCI

```yaml:.circleci/config.yml

version: 2
jobs:
  jstest:
    docker:
      - image: circleci/node:10

    environment:
      - NODE_ENV: test

    steps:
      - checkout
      - restore_cache:
          keys:
            - dependency-cache-{{ checksum "package.json" }}
      - run:
          name: install-npm
          command: npm install
      - save_cache: # special step to save the dependency cache
          key: dependency-cache-{{ checksum "package.json" }}
          paths:
            - ./node_modules
      - run: # run tests
          name: test
          command: npm test

workflows:
  version: 2
  workflow:
    jobs:
      - jstest
```

## GitHub Actions

```yaml:test.yml
name: JavaScript Test

on: [push]

jobs:
  build:
    name: JavaScript Test
    runs-on: ubuntu-latest

    steps:
      # assetsのビルド
      - uses: actions/checkout@v1
      - name: Set up Node.js
        uses: actions/setup-node@v1
        with:
          node-version: 10.x
      - name: Build assets
        run: |
          npm install
          npm run prod

      # testの実行
      - name: Exec test
        run: npm run test
```

node_modulesキャッシュする部分だけ再現できていませんがほぼ同じ動きがすぐ再現出来たので楽ちんで良かったです。
OpenSCADで日本語を使う

## 動機
Googleで軽く検索してみたのですが、どこにもそれっぽいものが載っていませんでした。
そしてそもそも英語圏の人々はマルチバイト文字を使う動機が無いので、ここにまとめておきます。


## 日本語出力の仕方
以下のように、`text` を呼ぶときにフォントを指定します。
また、textを呼び出すだけだと3Dにはならないため `linear_extrude` を使って高さ（Z軸方向）を指定します。

```openscad:japanese.scad
txt = "日本語";

linear_extrude(height = 5) {
  text(txt, font = "Hiragino Mincho ProN");
}
```
<img width="1512" alt="スクリーンショット 2019-09-28 13.56.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16864/10bd9097-92ca-5f1f-609a-026149a7056e.png">


## フォントを設定する
### フォントの一覧を表示
メニューの`Help -> Font List`で、一覧を表示するウィンドウが見れます。
<img width="553" alt="スクリーンショット 2019-09-28 13.42.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16864/48e1e985-c6b1-3537-a12e-5ef765b84e54.png">

ヒラギノ系のフォントしか見当たりませんが、これを使うことで日本語を出力できます。
<img width="874" alt="スクリーンショット 2019-09-28 13.45.18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16864/b44af3ab-bdea-aa26-fa79-f0c3957c4c30.png">

### 全種類を表示
幅の指定もできますが、とりあえずそこは省いて出してみました。
<img width="2032" alt="スクリーンショット 2019-08-30 17.26.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16864/60f0a451-7b1a-a410-629d-1e245b240baa.png">

```openscad:main.scad
txt = "永";

japanese_fonts = [
  "Hiragino Kaku Gothic Pro",
  "Hiragino Kaku Gothic ProN",
  "Hiragino Kaku Gothic Std",
  "Hiragino Kaku Gothic StdN",
  "Hiragino Maru Gothic Pro",
  "Hiragino Maru Gothic ProN",
  "Hiragino Mincho Pro",
  "Hiragino Mincho ProN",
  "Hiragino Sans",
  "Hiragino Sans GB",
];

fonts_size = len(japanese_fonts);

for(index = [1 : len(japanese_fonts)]) {
  font_name = japanese_fonts[index - 1];
  translate([0, 0, index * 20])
    text(txt, font = font_name);

  translate([20, 0, index * 20])
    text(font_name, font = font_name);
}

$vpr = [-30, 30, 0];
$vpt = [100, 0, fonts_size * 10];
$vpd = 600;
```




## Fontについての細かい話

### Pro と Std の違い
Proのほうが、使える文字の種類が多いらしいです（しかし、決してプロ用というわけでもないとのこと）
とりあえず、両方あるならProを指定しておけば大丈夫そうです。

### 末尾にNが付くもの（ProN, StdN）と付かないもの違い（Pro, Std）
NがつけばJIS2004字形らしいです。
[wikipediaに一覧がありました](https://ja.wikipedia.org/wiki/JIS_X_0213#JIS_X_0213:2004%E3%81%AE%E6%94%B9%E6%AD%A3)
いくつかの漢字が旧字風デザインになります。

以下のように微妙に違いがあります。
<img width="1512" alt="スクリーンショット 2019-08-30 17.49.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16864/80552d8a-365d-5513-03b7-008ac5b47fc3.png">

↑の画像を出力したサンプルコードです。

```openscad:font_with_N.scad
txts = "葛芦辻鯖飴樽";

pro_font = "Hiragino Kaku Gothic Pro";
pro_n_font = "Hiragino Kaku Gothic ProN";

text(txts, font = pro_font);
translate([0, 0, 10])
text(pro_font, font = pro_font, size = 3);

translate([0, 0, 40])
text(txts, font = pro_n_font);
translate([0, 0, 50])
text(pro_n_font, font = pro_n_font, size = 3);

$vpr = [-30, 30, 0];
$vpt = [40, 0, 20];
$vpd = 180;
```



## サンプルコード
Githubにありますので、まるっと持っていきたい方はどうぞ。
https://github.com/iwtn/openscad_japanese_text

## 参考リンク
https://en.wikibooks.org/wiki/
https://fontnavi.jp/zakkuri/205-N_fonts.aspx
https://fontnavi.jp/zakkuri/204-pro_fonts.aspx
Nimでファイルの変更を検知してタスクを実行するタスクランナーmonitを書いた

# まえがき

[先日Nim 1.0.0がリリースされました](https://nim-lang.org/blog/2019/09/23/version-100-released.html)。
Nimにはずっと期待していて、自分も多少公式コンパイラにコミットしたりしていたので、今回の発表はとても嬉しいです。

それはさておいて、Nimでファイル変更監視をして、変更があると任意のタスクを実行するタスクランナーを作りました。
同様のソフトウェアとしてはNode.jsの[gulp](https://github.com/gulpjs/gulp)とかがそれになるでしょうか。

gulpを使ったことないのですが、Node.jsでスクリプトを書かないといけなさそうなのが面倒そうだったのと、さっと設定ファイル(yaml)でタスクを定義できてすぐに導入できる単純なツールがほしかったので、今回Nimで作成してみました。

複雑なタスクは定義できないですが、最低限必要な機能はこさえたつもりです。

# 成果物

* [jiro4989/monit - GitHub](https://github.com/jiro4989/monit)

（モニタリングなのでmonitにしましたが、モニタリングだとサーバのリソース監視のほうを想像するような気がした）

# 使い方

* `monit init` で設定ファイルの雛形を生成
* エディタで .monit.yml を編集
* `monit run` でファイル変更監視を開始

デフォルトで nimble buildとnimble testがセットされるようにしています。

## 設定できること

```yaml
%YAML 1.2
%TAG !n! tag:nimyaml.org,2016:
--- !n!custom:MonitorConfig 
sleep: 1
targets: 
  - 
    name: Task name
    paths: [src, tests]
    commands:
      - nimble build --hints:off
      - nimble test
    extensions: [.nim]
    files: []
    exclude_extensions: []
    exclude_files: []
    once: y
```

* ファイル変更監視の間隔を何秒にするか
* どのディレクトリ配下のファイルを監視するか
* どの拡張子のファイルを監視するか、あるいはしないか
* どのファイルを監視するか、あるいはしないか
* タスクランナー起動時に一度はタスクを実行する

くらいしか設定を用意していません。
僕がCLIツールをNimや他の言語で書く時に欲しいと思ったのがこれくらいでした。

## 停止方法

Ctrl-Cで停止するか、.monit.ymlと同じディレクトリに `.monit.stop` というファイルを配置します。

# 使用しているライブラリ

* [NimYAML](https://github.com/flyx/NimYAML)
    * yamlファイルを操作できる
* [cligen](https://github.com/c-blake/cligen)
    * CLIツールのインタフェースを簡単に実装できる
    * [NimのCLIツール作成用ライブラリcligenがとても便利](https://qiita.com/jiro4989/items/d5476b3dce3c4b3d6523)
    
# おわりに

ライブラリのおかげで思いの外簡単に実装できました。
自動テストもできるようになって、開発が少し楽になってハッピーです。
Nimの開発に役立てば幸いです。
任意の方向の NSLayoutConstraint を UIView から取得する

`UIView#constraints` を探索すればいいのかと思ったら、superview のそれも探索しないといけない。
さらにいうと、その superview のそれも、と言った具合に再帰的に探索する必要がある。
のだが、実際的には自分とその親の分だけ探索すれば良いように思う。
そんなレイアウトの時は @IBOutlet しましょう。

```Swift:UIView+Constraint.swift
import UIKit

public extension UIView {
    
    private var meAndSuperviewConstraints: [NSLayoutConstraint] {
        var meAndSuperviewConstraints = constraints
        guard let superview = superview else {
            return meAndSuperviewConstraints
        }
        allConstraints.append(contentsOf: superview.constraints)
        return meAndSuperviewConstraints
    }
    
    private func firstConstraint(attribute: NSLayoutConstraint.Attribute) -> NSLayoutConstraint? {
        return meAndSuperviewConstraints.first(where: {
            (($0.firstItem as? UIView == self) && $0.firstAttribute == attribute)
                || (($0.secondItem as? UIView == self) && $0.secondAttribute == attribute)
        })
    }
    
    var leftConstraint: NSLayoutConstraint? {
        return firstConstraint(attribute: .left)
    }
    
    var rightConstraint: NSLayoutConstraint? {
        return firstConstraint(attribute: .right)
    }
    
    var topConstraint: NSLayoutConstraint? {
        return firstConstraint(attribute: .top)
    }
    
    var bottomConstraint: NSLayoutConstraint? {
        return firstConstraint(attribute: .bottom)
    }
    
    var leadingConstraint: NSLayoutConstraint? {
        return firstConstraint(attribute: .leading)
    }
    
    var trailingConstraint: NSLayoutConstraint? {
        return firstConstraint(attribute: .trailing)
    }
    
    var widthConstraint: NSLayoutConstraint? {
        return firstConstraint(attribute: .width)
    }
    
    var heightConstraint: NSLayoutConstraint? {
        return firstConstraint(attribute: .height)
    }
    
    var centerXConstraint: NSLayoutConstraint? {
        return firstConstraint(attribute: .centerX)
    }
    
    var centerYConstraint: NSLayoutConstraint? {
        return firstConstraint(attribute: .centerY)
    }
    
    var lastBaselineConstraint: NSLayoutConstraint? {
        return firstConstraint(attribute: .lastBaseline)
    }
    
    var firstBaselineConstraint: NSLayoutConstraint? {
        return firstConstraint(attribute: .firstBaseline)
    }
```

本気でやるなら、次のようになるでしょう

```Swift
    private func firstConstraint(attribute: NSLayoutConstraint.Attribute) -> NSLayoutConstraint? {
        var constraints: [NSLayoutConstraint] = self.constraints
        var view = self
        while let superview = view.superview {
            constraints.append(contentsOf: superview.constraints)
            view = superview
        }
        return constraints.first(where: {
            (($0.firstItem as? UIView == self) && $0.firstAttribute == attribute)
                || (($0.secondItem as? UIView == self) && $0.secondAttribute == attribute)
        })
    }
```

まあけど、そもそも runtime で constraint 取りたい場合ってすごく単純な制約の場合がほとんどな気がするので、ちょっと手抜きしたいって時のためなら、最初の extension で事足りるように思う。
google maps APIを使ってみよう

### 前回まで
https://qiita.com/mokku/items/c59944dcc3945423db9f
rails newとherokuでのデプロイまではこちらで済ませております。

## 準備
### Gemをインストールする
```gemfile:Gemfileに追記
gem 'gmaps4rails'
```
```ターミナル:インストール
bundle install
```

### Google map API key　を取得する
公式の説明：
https://developers.google.com/maps/documentation/javascript/get-api-key

- google cloud platformで新しいプロジェクトを登録
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397779/fe35b365-6b86-e89d-3573-e4ba49d5b4e0.png)
- APIを有効にする（利用するAPIがわからない場合は一旦これ）
- 認証情報を作成する
- API keyが作成されるのでメモする（後で確認できます）
- キーを制限/アプリケーションの制限でhttpリファラーを選択
- ローカル（http://*.localhost/*）と本番のアドレスを追加

###  割り当ての確認
- APIサービス/ダッシュボード/Maps JavaScript API/割り当て

以下の「無制限」が「１」の場合、課金設定を行う必要があります。
クレジットカードなどを登録するだけです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397779/ef35de5f-7825-74e0-9786-ac7cb29b5be7.png)


## view
公式：
https://developers.google.com/maps/documentation/javascript/tutorial

最低限これだけでGoogle mapは表示されます！

```index.html.haml
<style>
#map {
  height: 400px;
  width: 600px;
}
</style>
  
<div id="map"></div>
<script>
  var map;
  function initMap() {
    map = new google.maps.Map(document.getElementById('map'), {
      center: {lat: -34.397, lng: 150.644},
      zoom: 8
    });
  }
</script> 

<script async defer src="https://maps.googleapis.com/maps/api/js?key=自分のAPIキー&callback=initMap"
type="text/javascript"></script>
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397779/2364808b-fe2a-63e1-2486-16abd2b77c60.png)


## 参考
公式　https://github.com/apneadiving/Google-Maps-for-Rails

google API　使い方について丁寧に書かれているサイト
http://www.webdesignleaves.com/pr/plugins/googlemap_01.html

https://note.mu/daddy0055/n/nddbe8da38bbc
https://qiita.com/enzen/items/9a919a75ebf0a34e7b91
CSSアニメーションやってみた(初心者学習メモ)


# CSSアニメーションやってみた

# mariweb さんのサイトのオープンニングアニメーションみたいなのにトライしてみよう、と思いました。

[mariweb | 大阪・枚方市のホームページ制作・動画制作](https://marie-web.design/)

# ドットインストールで勉強してみました

[詳解CSS アニメーション編 (全9回) - プログラミングならドットインストール]
(https://dotinstall.com/lessons/basic_css_animation)
このコースは有料でした。
がんばりました。

# mariweb さんのサイトを、Chrome のデベロッパー ツールで見てみました

- index.php
- main.js
- style-css

# mariwebさんより、sassのファイルを提供いただきました。

# 使われているプロパティ（一部）

- transform ・・・変形
    - translate ・・・動かす
    - scale ・・・拡大・縮小
    - rotateZ ・・・ 回転する
- z-index ・・・ 前面、背面（大きいほど前面）
- opacity ・・・ 透明度（0：透明、1：不透明）

# 作ってみたページ

https://haya4.jp/

# 課題

- Safariでうまく動かない → scale(0) を消したら改善しましたが、理由はよくわからないです・・
- SVGの勉強も必要（ https://dotinstall.com/lessons/basic_svg_v2 ）

# 感想
- 動くのは楽しい！

# 参考にさせていただいたページ（一部）

感謝いたします。

CSS3でサクッとできるオープニングアニメーションエフェクト3つ | webの覚え書き ==> https://webnooboegaki.com/htmlandcss/opening-animation

アニメーション終了後にサイトを表示させる方法 | DESIGN OFFICE TIGHT ==> http://smile-design.bz/news_blog/2016/03/05/anai024/

CSS3 アニメーション（使い方やサンプル）/Web Design Leaves ==> http://www.webdesignleaves.com/pr/css/css_basic_07.html

CSS3でアニメーション：初歩の初歩 ｜ Tips Note by TAM ==> https://www.tam-tam.co.jp/tipsnote/html_css/post7917.html

animation-fill-mode プロパティ(アニメーション再生開始まで及び再生終了後の扱い) - CSS リファレンス ==> https://www.marguerite.jp/Nihongo/WWW/RefCSS/animation-fill-mode.html
Habitat-Sim のメモ

https://aihabitat.org/

Habitat: A Platform for Embodied AI Research
https://arxiv.org/abs/1904.01201

住居(室内)の 3D モデルでいろいろシミュレーションできるシステムやデータセットっぽい.

センサーや SLAM の評価につかったり, ロボットの動きのシミュレーションに使えるなど.
CG でデータを作っているので, デプスの情報などがあっていろいろシミュレーションとかしやすい.

## 考察

ロボットの眼(たとえば depth センサー)のシミュレーションにとっては, CG データがフォトリアルである必要はないので, センサー向けに特化した表現(物体の反射特性とか)があるといいかもしれない.

Habitat-sim をベースに採光シミュレーションしたい(太陽の動きに応じてどう見えるとか, 火星に住居を作ったらどのような採光になるか, など)
PDF-1.7 文字の基本的な扱い

[目次](https://qiita.com/RT-EGG/items/70f9107c6300f24b23c4)
<b>ver.1.7仕様書 6th edition、3.1に相当します。</b>

#文字の基本的な扱い
PDFには大きく、regular、delimitter、white-spaceの三種の文字があります。それぞれ振る舞いが定義されますが、stringオブジェクト、streamおよびコメントの中ではこの限りではありません。

##white-space
white-spaceはNameオブジェクトや数値などの区切りとして用いられます。
すべてのwhite-space文字は同等に扱われますが、stringオブジェクト、streamおよびコメントの中では例外です。その他のコンテキストの中では、あらゆるwhite-space文字が連続していても、単一のwhite-space文字として扱います。

| decimal | hexadecimal | octal |        name         |
|:-------:|:-----------:|:-----:|:-------------------:|
|    0    |     00      |  000  |      Null(NULL)     |
|    9    |     09      |  011  |       Tab(HT)       |
|   10    |     0A      |  012  |    Line feed(LF)    |
|   12    |     0C      |  014  |    Form feed(FF)    |
|   13    |     0D      |  015  | Carriage return(CR) |
|   32    |     20      |  040  |      Space(SP)      |

CR、LF、およびCRLFはend-of-line(EOL)(改行)マーカーとして扱われます。
EOLはほとんどの場合はwhite-spaceとして扱われますが行頭にあることが求められる（推奨される）ことがあります。<b>(ここはよくわからない)</b>

##delimitter
delimitterは、string、array、nameオブジェクトおよびコメントを定義するための特殊文字です。
(,),<,>,[,]{,},/,%がdelimitter文字となります。

##regular
white-spaceでも、delimitterでもない文字はregularとなります。ASCII文字で定義されない8bitバイナリ値もこれに含まれます。
regular文字の連続が1つのトークンを構成します。
※ PDFでは大文字と小文字を区別します。

#コメント
%から行末までの文字はコメントとして扱い、単一のwhite-spaceがあるものとして虫します。なお、stringオブジェクト及びstreamに含まれる%は別です。

```
abc% comment {/%) blah blah blah
123
```
上の例では、「abc」と「123」がトークンとして認識されます。
コメントはPDFにおいて構文的な意味があるものではなく、PDFを編集するアプリケーションが出力する必要はありません。
PDF仕様書（Ver.1.7）を読む　目次

#はじめに
ふとPDFの入出力ライブラリを作りたいなーと思ってPDFの仕様書を最近読んでいるのですが、想像したよりずっと煩雑でした。実装しながら読んだりしてるのですが、確実に忘れる部分もあるので、備忘録(+α)として記載することにします。
現在(2019年9月）、PDFの仕様はVer.2.0[^1]が発表されています。ですが、有料です。
とりあえずは買うつもりもないですし、有料のものを概要とはいえ公開するわけにはいかないでしょうし、ver.1.7[^2]を対象とします。

基本的には意訳（自分なりの解釈）なので、訳として誤っている部分があるかもしれませんので、ご容赦ください。

・ 基本的なファイル構造(まだ)
・ [文字の基本的な扱い](https://qiita.com/RT-EGG/items/e6042d0b5cbb3f873192)
・ [オブジェクトの種類](https://qiita.com/RT-EGG/items/18705b590c75c1bf15ca)
・ [ページの領域定義](https://qiita.com/RT-EGG/items/7d032493360982cb91ce)
...

[^1]: [PDF Ver.2.0 仕様書](https://www.iso.org/obp/ui/#iso:std:iso:32000:-2:ed-1:v1:en)
[^2]: [PDF ver.1.7 仕様書](https://www.adobe.com/content/dam/acom/en/devnet/pdf/pdf_reference_archive/pdf_reference_1-7.pdf)
Docker 上で SQL Server を起動してみる。


1: pull（イメージダウンロードするので、時間かかります。）


```
$ sudo docker pull mcr.microsoft.com/mssql/server:2017-latest
```

2:Docker でコンテナー イメージを実行


```
$ sudo docker run -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=<YourStrong@Passw0rd>" -p 1433:1433 --name sql1 -d mcr.microsoft.com/mssql/server:2017-latest
```

マシン再起動後は、以下

```
$ docker start sql1
```



3:起動確認

```
$ sudo docker ps -a

CONTAINER ID        IMAGE                                        COMMAND                  CREATED             STATUS              PORTS                                      NAMES
1ca79902d098        mcr.microsoft.com/mssql/server:2017-latest   "/opt/mssql/bin/sqls…"   13 seconds ago      Up 12 seconds       0.0.0.0:1433->1433/tcp                     sql1

```


4:SQL Server への接続

既定では sqlcmd はパスにないため、完全なパスを指定する必要があります。

成功すると、sqlcmd コマンド プロンプト 1> が表示されます。

```
$ sudo docker exec -it sql1 "bash"

root@1ca79902d098:/# /opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P "<YourStrong@Passw0rd>"
1>
```

5:データベースの作成

```
1> CREATE DATABASE bb
2> go

```

6:データベース確認

```


1> SELECT Name from sys.Databases
2> go
Name
--------------------------------------------------------------------------------------------------------------------------------
master
tempdb
model
msdb
bb

(5 rows affected)
```

7:ツールでの接続確認

![スクリーンショット 2019-09-28 12.58.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33953/20beff20-7240-6dcd-0c2b-c92d8c2cd143.png)

![スクリーンショット 2019-09-28 12.59.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33953/58d1967f-f5da-361f-f33c-d62bd9b01760.png)
GUIライブラリ kivyに挑戦してみたけど力尽きました。

#モダンなGUIを求めて
##kivyかっこいいやん。やってみよ。
タイトル通りなんですけど、この２週間ずっとしらべてやってました。

が！ついに！
あきらめました。。。

天才たちに聞くしかないという結論になったので誰かご存じであれば助けていただきたいです。。。

##やりたいこと
STEP1．選択フォルダ内のPythonファイルをGUI上にボタンとして配置
STEP2．ボタンを押すとボタンの名前がprintされる

##つまづいた・わからなかったこと
ボタンラベル、ボタンをfor文で作成。
↓
ボタンを押す。
↓
押したボタンの名前が表示されない
↓
どのボタン押しても呼び出せる内容は同じ
（for文の一番最後の内容しか反映されない？）
↓


##コード
```py
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button
import tkinter as tk
import tkinter.filedialog
from tkinter import messagebox
import os
import sys

#Load_Dir
dock = os.getenv("HOMEDRIVE") + os.getenv("HOMEPATH") + "\\Desktop\\"
Selectname = [("選択フォルダ","*.Dir")]
root = tkinter.Tk()
root.withdraw()
tkinter.messagebox.showinfo('Folder to Select','対象のフォルダを選択してください！')

# Folder to Select
dock = tkinter.filedialog.askdirectory(initialdir = dock)
if dock == "":
    print("Close an application")

#Init
list1 = []

#PythonFileSearch
def change(full):
    for files in os.listdir(full):
        base, ext = os.path.splitext(files)
        if ext == '.py':
            list1.append(files)
            a = files#FullName
            b = full+files#fullPath
            c = base#Name
            d = ext#拡張子
            e = os.path.splitext(files)#タプル型でのFullName
            f = list1#FullName_list
            g = len(f)#list_size

    return a,b,c,d,e,f,g

aa,bb,cc,dd,ee,ff,gg = (change(dock))

#画面上の見た目や機能を構成するクラス
class MainScreen(BoxLayout):

    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        # MainScreenに追加する、BoxLayoutというWidgetを用意
        bl = BoxLayout()
        bl.orientation = "vertical"
        # 動的生成
        for i in ff:
            btn = Button(text=i)
            bl.add_widget(btn)
            btn.bind(on_press=lambda button: print(i))
        self.add_widget(bl)
        
#アプリを構成するクラス
class MainApp(App):
    def build(self):
        MS = MainScreen()
        
        return MS

if __name__=="__main__":
    MainApp().run()
```

どうかよろしくです…
PuppeteerをCentOSで動かす(sandbox)

## 概要
PuppeteerをCentOSで動かすための備忘録です。
Vagrantを使って構築します。

## 環境
MacOS Mojave
Vagrant 2.2.3
CentOS 7

## コマンド
- Chrome用の依存をインストール

```
$ yum -y install pango libXcomposite libXcursor libXdamage libXext libXi libXtst cups-libs libXScrnSaver libXrandr GConf2 alsa-lib atk gtk3 ipa-gothic-fonts xorg-x11-fonts-100dpi xorg-x11-fonts-75dpi xorg-x11-utils xorg-x11-fonts-cyrillic xorg-x11-fonts-Type1 xorg-x11-fonts-misc
```

- nssをアップデートする

```
$ yum -y update nss
```

- Node.js, YarnとPuppeteerのインストール

```
$ yum -y install https://rpm.nodesource.com/pub_12.x/el/7/x86_64/nodesource-release-el7-1.noarch.rpm
$ yum -y install nodejs
$ curl --silent --location https://dl.yarnpkg.com/rpm/yarn.repo | tee /etc/yum.repos.d/yarn.repo
$ rpm --import https://dl.yarnpkg.com/rpm/pubkey.gpg
$ yum install -y yarn

$ cd your project
$ yarn add puppeteer    // or install it from package.json
```

# No usable sandbox!対応

```
$ cd node_modules/puppeteer/.local-chromium/linux-686378/chrome-linux/
$ chown root:root chrome_sandbox
$ chmod 4755 chrome_sandbox

$ cp -p chrome_sandbox /usr/local/sbin/chrome-devel-sandbox
$ chown root:root /usr/local/sbin/chrome-devel-sandbox
$ chmod 4755 /usr/local/sbin/chrome-devel-sandbox

$ echo 'export CHROME_DEVEL_SANDBOX=/usr/local/sbin/chrome-devel-sandbox' >> /home/vagrant/.bashrc
```

これで--no-sandboxが要らないはず。

## 参考
https://github.com/GoogleChrome/puppeteer/blob/master/docs/troubleshooting.md#setting-up-chrome-linux-sandbox
ツリーをたどるSQL（隣接リストモデル）

隣接リストモデルのテーブルで、ツリーをたどるSQLを備忘録として残します。
PostgreSQLとOracleの場合を記載します。

#テーブル構成
##ツリー
![tree.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298692/ce103f80-2d6a-49dc-95c7-12e2aa08857c.png)

##テーブル（隣接リストモデル）

テーブル名：relationship

| id              | parentid    |
|:----------------|:------------|
|0001             |TOP             |
|0002             |0001             |
|0003             |0001             |
|0004             |0002             |
|0005             |0003             |
|0006             |0001             |


#SQL

##下向き
![top_tree.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298692/7ad10dbd-9ffb-c68f-7320-06e73d70811f.png)

###PostgreSQLの場合
with recursive tmp as (
    select id, parentid
    from relationship
    where id='0001'
    union all
    select relationship.id, relationship.parentid
    from tmp, relationship
    where tmp.id = relationship.parentid
)
select id
from tmp;

###Oracleの場合
select id
from relationship
start with id='0001'
connect by prior id = parentid;


##上向き
![bottom_tree.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298692/032e4a52-f9d6-844f-9147-f98d6c050b4f.png)

###PostgreSQLの場合
with recursive tmp as (
    select id, parentid
    from relationship
    where id='0005'
    union all
    select relationship.id, relationship.parentid
    from tmp, relationship
    where tmp.parentid = relationship.id
)
select id
from tmp;


###Oracleの場合
select id
from relationship
start with id='0005'
connect by prior parentid = id;
メモ：雑多内容

# 注記
1つの記事にするまでもないことや個人的にメモしたいことを1つの記事にごった煮にする。
随時更新したりする。

## 論文読み方

[研究室に配属された学生が最初に学ぶべき論文の読み方][1]：論文の読み方がまとまっている。<br>
読み方のステップ引用
>1.調べる
>2.メモする
>3.図解する
>4.読み方を変化させる

1,2は実践している。3は大学時代にはやっていたが、完全に忘れていたステップ。4の項目ごとに読み方（どこに目を通すかの判断）はなんとなくやっていたけど忘れていたステップ。院生の先輩方は身に着けていたようで、どこどこを読めばいいよとは言うが前節との接続や分野の知識がないとその判断ができないように思う。

>1.Abstractで全体像を掴む (分かった気になる）
>2.Introductionで背景と目的を整理する
>3.Figures（視覚的理解）とResults（テキスト理解）はセットで交互に見つつ、Methods は辞書的に読むことで内容を理解していく
>4.Discussionで自分の結果の解釈の答え合わせを行う気持ちで読む

注意：完全にすべてを追おうとしないこと。
経験談：B4の時、手法について調べるためにメインで読んでいた論文の参考文献を漁って、文献輪廻に飲み込まれたことがあった。
↓
main→ref_A→refB→ref_Cといった具合に。そしてref_Aとref_Cの共通で参考に上がっていたref_Dがクリティカルなアイデアだったことが何度かあり、更にそのref_Dがネットで見つからず、図書館深部の書架で見つかるといったことがあった。これで2ヶ月論文付けだった





## データ分析
ビジネス活用事例で学ぶデータサイエンス入門　メモ<br>

|データ分析|意思決定支援  |自動化・最適化  |
|---|---|---|
|目的  |人間の行動決定の支援  |コンピュータの行動効率化  |
|目標  |コミュニケーションコストの低減  |精度向上、計算量・計算時間削減  |
|よく使われる手法|単純集計、クロス集計|機械学習、アルゴリズム構築|
<br>

スマホゲームユーザー属性の把握（市場分析：セグメンテーション）->クラスタリング<br>
・クラスタの基準（ゲームランキング）を元に、ヘビー/ミドル/ライトユーザーに分割->ランキング特徴量の作成
・k-means法を使うにあたって相関の高い特徴量と0ばかりの特徴量は排除、また主成分分析により相関を排除。
・クラスタ数は解釈性とどんなユーザー層を想定しているかで決定（大体一桁）
・クラスタの特徴を可視化->レーダーチャート

・ビジネス上におけるデータ分析の流れ
1.課題設定（何が課題であるかを共有）
2.問題発見（現状の整理と理想の把握、二つのギャップを具体化・言語化）
3.仮説探索（ギャップの要因を考え、確度の高い仮説（検証すべき仮説）を決める）
4.データ収集（仮説を裏付けるデータがあるか,関係各所からヒアリング（事実とデータを集める））
5.データ分析（仮説を裏付けるデータが作れるか。データ分析と可視化）
6.報告と行動決定

# データサイエンティストのスキルセット
「一般社団法人データサイエンティスト協会　スキルセット改変」
https://www.slideshare.net/DataScientist_JP/2017-81179087

![データサイエンテイスト.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488577/2ec1c0c7-234f-8563-bc00-036808316492.png)


[1]:url(http://ocoshite.me/how-to-read-scientific-articles)
【salesforce】Apexを使ってメールを送信する機能を実装してみた

#まずはメールの送信の仕方

```ruby:sample
public void sendMessage(){
        //インスタンス化
        Messaging.SingleEmailMessage mail = new Messaging.SingleEmailMessage();
        //送信先のアドレス
        mail.setToAddresses(new List<String>{'test@abc.com'});
        //件名
        mail.setSubject('TestSubject');
        //本文
        mail.setPlainTextBody('Test');
        //返信した時の受信アドレス
        mail.setReplyTo('system@abc.com');
        //送信実行
        Messaging.sendEmail(new Messaging.Email[] { mail });  
    }
```

上記は１件づつ送る例です。

メール送信には１回のトランザクションで10通というガバナ制限があるので気をつけましょう。


[実行ガバナと制限](https://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/apex_gov_limits.htm)

#メール送信画面

今回は簡単ですが、画面にメールアドレス、件名、本文を入力し、ボタン押下でメール送信的な物を作ってみました。

<img width="968" alt="スクリーンショット 2019-09-28 12.10.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472705/2863fd76-6da4-21ed-146c-cd9be9903606.png">

こんな感じで送信ボタンを押すと

![IMG_3063.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472705/f7f20765-7a99-d95e-8c23-8bacc1056b37.png)

うまくできました。

宛先のところに参照でContactとか入れてそのメールアドレスをひっぱてくるなんて感じで使えばもっと便利に使えそうです。

他にも大量のメールを一斉に送ることもできるのでそれはまたの機会にやってみたいと思います。

#profile

生まれも育ちも大阪の浪速中の浪速っ子が30才未経験からITエンジニアとして生きるブログもやってます。
よかったらみてください:muscle_tone2:

<a href="https://blogmura.com/profiles/11016817?p_cid=11016817"><img src="https://blogparts.blogmura.com/parts_image/user/pv11016817.gif" alt="PVアクセスランキング にほんブログ村" /></a>
ActiveRecord の where でレコードを直接絞れないケースでも絞り込む方法を調べた

## はじめに

Rails でアプリ開発をする際、モデルのレコードを `where` で絞り込むケースはよくあると思いますが、`where` で直接絞れないケースで絞り込む必要があり、その方法について調べました。

## 課題

例として、`Post` モデルを考えます。`Post` モデルには、`title` と、API からのレスポンス json を保持しておく `raw_json` カラムがあります。作成するときはこんなイメージです。

```ruby
Post.create(
  title: 'テスト1',
  raw_json: '{"date": "2019-08-01"}'
)

Post.create(
  title: 'テスト2',
  raw_json: '{"date": "2019-08-02"}'
)
```

この `raw_json` カラムの `date` の日付でデータを絞り込む必要があったのですが、この方法について調べていました。

## tl;dr

こんなスコープを作りました。

```ruby
scope :filter_by_tartet_date, -> (target_date) {
  return if !target_date.present?
  ids = self.select do |s|
    if date = JSON.parse(s.raw_json)['date']
      Date.parse(date) == Date.parse(target_date)
    end
  end.map(&:id)
  where(id: ids)
}
```

使い方としては、`Post.filter_by_tartet_date('2019-08-01')` という感じで日付文字列を引数に指定すると、`raw_json` 内の `date` が `2019-08-01` のレコードに絞り込んでくれます。

## 解説

ざっくりしたイメージとしては以下のようになります。

* `select` メソッドで raw_json 内の値を使って比較
* `map` メソッドで対象レコードの id のみの配列を作成
* `where` メソッドで対象 id のレコードのみ絞り込んで `ActiveRecord::Relation` クラスの戻り値に

`select` メソッドを使うだけだと、戻り値が `Array` クラスになってしまい、ページネーションなどの使い勝手が悪かったため、最後に `where` メソッドで `ActiveRecord::Relation` クラスの戻り値に変換して使いやすくしています。

## おわりに

直接 `where` メソッドで絞れない場合でも、`Array` クラスのメソッドを挟んで絞る方法が使えました。直感的に書ける ruby はやっぱり便利だなと感じます。

他にもいい方法ありましたら教えていただけるとありがたいです。

## 参考

* [ActiveRecord’s Select & Pluck - Medium](https://medium.com/@amliving/activerecords-select-pluck-3d5c58872053)
Windows10ProのWindowsUpdate後にDocker for Windowsが起動しなくなりました(涙

2019.09.28 Windows10 ProのWindowsUpdateをしたら
Docker for Windowsが起動しなくなりました…"(-""-)"

```text
Unable to create - ユーザー設定変数 "ErrorActionPreference" または共通パラメーターが Stop に設定されているため、実行中のコマンドが停止しました。新しい仮想マシンを作成できませんでした。

'DockerDesktopVM' は認識できませんでした。(仮想マシン ID D77CF37C-7DAA-4190-B4D4-51DB01CFB0A9)

構成ストアにアクセスできませんでした: 指定されたパスが見つかりません。 (0x80070003)。

   場所 Docker.Core.Pipe.NamedPipeClient.<TrySendAsync>d__5.MoveNext()
--- 直前に例外がスローされた場所からのスタック トレースの終わり ---
   場所 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   場所 Docker.Core.Pipe.NamedPipeClient.Send(String action, Object[] parameters)
   場所 Docker.Actions.DoStart(SynchronizationContext syncCtx, Boolean showWelcomeWindow, Boolean executeAfterStartCleanup)
   場所 Docker.Actions.<>c__DisplayClass24_0.<Start>b__0()
   場所 Docker.ApiServices.TaskQueuing.TaskQueue.<>c__DisplayClass17_0.<.ctor>b__1()
```

![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324255/ef19b567-aae6-0c6b-d486-282649e0c081.png)

Hyper-Vマネージャーで仮想マシンの状況を確認したら…dockerの仮想マシンが居なくなってます

![無題2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324255/b22bd2b1-f856-977b-76d7-5a14b1bb4f6b.png)

一度Docker for Windowsをアンインストールして再インストールしてみましたが状況変わらず

困った困ったな現状です。
復帰したらまた記事更新したいと思います


[Docker for Windowsで起動エラーが起きた場合の対処](https://qiita.com/k_akimoto/items/182418e2d200616e7db6)

の対処を試してみましたが結果変わらず"(-""-)"


一度OSを再起動するとあら何という事でしょう。
Hyper-Vマネージャーに仮想マシンが作成されていました！

一件落着です！
CentOS 7にPHP 7.0をインストール（Remi's RPM repository）

# はじめに

Remi's RPM repositoryを利用してCentOS7にPHP7.0をインストール
親記事：[PHP, PHP-FPMの各種インストール方法とEOLまとめ](https://qiita.com/witchcraze/items/dfe3823554b7caba6f6a)
参考：[Remi's RPM repository](https://rpms.remirepo.net/wizard/)

## サポート

本手法で導入した場合、[PHP: Supported Versions] (https://www.php.net/supported-versions.php)/[PHP: Unsupported Branches](https://www.php.net/eol.php)より、2019-01-10がEOLになると思われる。
それ以降に報告された脆弱性や不具合への対応は実施されない可能性がある。
(メンテナーの御慈悲でその後もアップデートされているが、いつまで続くかはわからない)

## note

- インストール後の更新は `yum --enablerepo=remi-php70 update`

## LOG

### インストール

```shell-session
# cat /etc/redhat-release
CentOS Linux release 7.7.1908 (Core)

# yum install -y https://rpms.remirepo.net/enterprise/remi-release-7.rpm
... 略

# yum install -y --enablerepo=remi-php70 php which
... 略
```

### 各種確認

```shell-session
# which php
/usr/bin/php

# php -v
PHP 7.0.33 (cli) (built: Aug 28 2019 14:11:09) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2017 Zend Technologies

# php -i | grep php.ini
Configuration File (php.ini) Path => /etc
Loaded Configuration File => /etc/php.ini

# yum info php
Loaded plugins: fastestmirror, ovl
Loading mirror speeds from cached hostfile
 * base: ftp.iij.ad.jp
 * epel: ftp.riken.jp
 * extras: ftp.iij.ad.jp
 * remi-safe: ftp.riken.jp
 * updates: ftp.iij.ad.jp
Installed Packages
Name        : php
Arch        : x86_64
Version     : 7.0.33
Release     : 13.el7.remi
Size        : 8.2 M
Repo        : installed
From repo   : remi-php70
Summary     : PHP scripting language for creating dynamic web sites
URL         : http://www.php.net/
License     : PHP and Zend and BSD and MIT and ASL 1.0 and NCSA
Description : PHP is an HTML-embedded scripting language. PHP attempts to make it
            : easy for developers to write dynamically generated web pages. PHP also
            : offers built-in database integration for several commercial and
            : non-commercial database management systems, so writing a
            : database-enabled webpage with PHP is fairly simple. The most common
            : use of PHP coding is probably as a replacement for CGI scripts.
            :
            : The php package contains the module (often referred to as mod_php)
            : which adds support for the PHP language to Apache HTTP Server.
```

### パッケージ更新状況

```shell-session
# rpm -q -changelog php | head -n 20
* Wed Aug 28 2019 Remi Collet <remi@remirepo.net> - 7.0.33-13
- mbstring:
  Fix CVE-2019-13224 don't allow different encodings for onig_new_deluxe
- pcre:
  Fix #75457 heap use-after-free in pcrelib

* Tue Jul 30 2019 Remi Collet <remi@remirepo.net> - 7.0.33-12
- exif:
  Fix #78256 heap-buffer-overflow on exif_process_user_comment
  CVE-2019-11042
  Fix #78222 heap-buffer-overflow on exif_scan_thumbnail
  CVE-2019-11041
- phar:
  Fix #77919 Potential UAF in Phar RSHUTDOWN

* Tue Jul 02 2019 Remi Collet <remi@remirepo.net> - 7.0.33-11
- use oracle client library version 19.3
- disable opcache.huge_code_pages in default configuration

* Tue May 28 2019 Remi Collet <remi@remirepo.net> - 7.0.33-9
```
ABC139F Engines について

Atcoder Beginner Contest 139 の[問題F Engines](https://atcoder.jp/contests/abc139/tasks/abc139_f) について書きます．

## 問題概要

平面上のベクトル $v_i = (x_i, y_i)$ ($1 \leq i \leq N$) が与えられる．$A \subseteq \\{1,\ldots,N\\}$ に対して $w_A = \sum_{i \in A} v_i$ とするとき，$\max \\{|w_A| : {A \subseteq \\{1,\ldots,N\\}}\\}$ を求めよ．

制約: $N \leq 100$

## 考えたこと

コンテストの時には，次のように考えました．$v_i$ を偏角の順に並べておけば，最大値を与える$A$は，ある偏角からある偏角まで，となるだろう．そうすれば，$A$の候補は，$N^2$ くらいしかない．$w_A$ は累積和を使えば前計算$O(N)$で各$A$について$O(1)$で計算できるので，全体で$O(N^2)$なので，楽々間に合う．

ところが，証明ができません．単に区間になるというだけでなく，角度$\pi$以内に入っているベクトルの和だろう，とも思ったのですが，いずれにせよできません．時間が無いので，とりあえず成り立つと信じてコードを書いて提出しました．通ったので，結果オーライではありますけれど．

翌日検索してみた範囲では，納得できる説明が書いてある記事は見つからなかったのですが，だいぶたってから togetter を読んでみたら，beetさんが，証明が載っている[ページ](https://math.stackexchange.com/questions/2481720/given-a-set-of-n-2d-vectors-find-subset-of-vectors-with-sum-length-is-the-gre) を紹介していました．以下にその内容 (少し変えていますが) を書きます．

## 区間になることの証明

すべての$i$について $|v_i| > 0$ として良い．最大値を与える$A$をとる．$w = w_A$ と書く．ベクトル$p$, $q$の内積を$(p, q)$と書くことにする．次を言えば十分である．

1. $(v_i, w) > 0 \Rightarrow i \in A$
1. $(v_i, w) \leq 0 \Rightarrow i \not\in A$

上は，$(v_i, w) > 0$ かつ $i \not\in A$ とすると，$B = A \cup \\{i\\}$ としたときに，$|w_B|^2 = |w + v_i|^2 = |w|^2 + 2(w, v_i) + |v_i|^2 > |w|^2$ となって，$A$の最大性に反する．下も同様で，$(v_i, w) \leq 0$ かつ $i \in A$ とすると，$B = A \setminus \\{i\\}$ としたときに，$|w_B|^2 = |w - v_i|^2 = |w|^2 - 2(w, v_i) + |v_i|^2 > |w|$ となって，$A$の最大性に反する．(終)

## 反省

証明ができずに，適当な$A$に対して，$w_A$ と $v_i$ のなす角が $\pi/2$ より大きかったとしても，$|w_A + v_i|$の方が $|w_A|$ よりも大きくなることがあるよなあ．うーん．と，うなっていたのでした．$w_{A\cup\\{i\\}}$ と $v_i$ のなす角を考えなくちゃいけなかったんですね．
ONNXで extract_constant_to_initializer 最適化

ONNXがサポートしている最適化 extract_constant_to_initializer を調べてみました。

最適化をしているソースはここ。
https://github.com/onnx/onnx/blob/master/onnx/optimizer/passes/extract_constant_to_initializer.h

ConstantをInitializerに変える最適化ですが、いまいちメリットがわからない。

Addの片方をConstantにして試してみましょう。
![extract_constant_to_initializer.onnx.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327/ca01ffa1-9c24-f8a8-cc12-b5065b9cc395.png)



最適化前のグラフを見ても、ConstantがnetronによってInitializer扱いされていて最適化後も見た目上は変化なし。

しょうがないので、最適化前後のinitilaizerを表示してみました。

```python
# 最適化パスを指定
passes = ['extract_constant_to_initializer']

optimized_model = optimizer.optimize(model_def, passes)
onnx.save(optimized_model, 'onnx/extract_constant_to_initializer_optimized.onnx')

print("BEFOR:initilaizer", model_def.graph.initializer)
print("AFTER:initilaizer", optimized_model.graph.initializer)
```

実行すると最適化前はinitilaizerが[]でしたが、最適化後は、initilaizerが増えているのがわかります。やったね。

```python
BEFOR:initilaizer []
AFTER:initilaizer [dims: 1
dims: 2
data_type: 1
float_data: 1.0
float_data: 1.0
name: "const_values"
]
```

全ソース

```python
import numpy as np
import onnx
from onnx import helper
from onnx import TensorProto
from onnx import optimizer

X = helper.make_tensor_value_info('X', TensorProto.FLOAT, [1, 2])
Y = helper.make_tensor_value_info('Y', TensorProto.FLOAT, [1, 2])
values = np.ones((1, 2), dtype=np.float32)

const = onnx.helper.make_node(
    'Constant',
    inputs=[],
    outputs=['const_values'],
    value=onnx.helper.make_tensor(
        name='const_tensor',
        data_type=onnx.TensorProto.FLOAT,
        dims=values.shape,
        vals=values.flatten().astype(float),
    ),
)

add = helper.make_node(
    'Add',
    ['X', 'const_values'],
    ['Y'],
)

graph_def = helper.make_graph(
    [const, add],
    'test-model',
    [X],
    [Y]
)

model_def = helper.make_model(
    graph_def,
    producer_name='onnx_example'
)

onnx.save(model_def, 'onnx/extract_constant_to_initializer.onnx')

# 最適化パスを指定
passes = ['extract_constant_to_initializer']

optimized_model = optimizer.optimize(model_def, passes)
onnx.save(optimized_model, 'onnx/extract_constant_to_initializer_optimized.onnx')

print("BEFOR:initilaizer", model_def.graph.initializer)
print("AFTER:initilaizer", optimized_model.graph.initializer)
```
GolangでstructからJSONに変換して標準出力するサンプルコード

```go
package main

import (
	"encoding/json"
	"fmt"
)

type Task struct {
	Id   int32  `json:"id"`  // `(...)`内にkey名を指定する
	Name string `json:"name"`
}

func main() {
	task := &Task{100, "Task name"}
	bytes, _ := json.Marshal(task) // jsonのバイナリが出力される
	fmt.Println(string(bytes)) // stringにキャストして標準出力に表示
}

// => {"id":100,"name":"Task name"}
```
Catapultで扱うTimestampについて


## 要約

~~UNIX時間で`1459468800`からの経過ミリ秒を使います。~~

変わりました。CatapultとしてはEpocTimeが変更可能値になりました。この値は、同一ネットワーク内では共有されなくてはならない値なので、各ネットワークのプロトコルに従います。

## 本題

以下はbootstrapで生成したCatapultチェーンのブロック高さ2のデータです。そのうち、`timestamp`について。

```
{  
   "meta":{  
      "hash":"14E4FA32856BAB42621D9205BE1D49729CAFC56E2974F24658A3D4CD1C9977E5",
      "generationHash":"D7F205BAFA542F13500D8F9E4A352AE937BF2A5221E8BEF521746872C9BDF6E4",
      "totalFee":"0",
      "stateHashSubCacheMerkleRoots":[  
         "08154343274B614D0C063C9DB74084B3CAAC46020572C254E64709164A2D39CC",
         "D6CA5FF6ABB86F45E2CBE4AD3878FD980E34F0649761484A3E5BEB00EAD52185",
         "CA39C28897B6C5CD6C7C09DEBBDE3D4D87E7668A2154D5CBC2607CC6B81CF115",
         "0000000000000000000000000000000000000000000000000000000000000000",
         "0000000000000000000000000000000000000000000000000000000000000000",
         "0000000000000000000000000000000000000000000000000000000000000000",
         "0000000000000000000000000000000000000000000000000000000000000000",
         "0000000000000000000000000000000000000000000000000000000000000000",
         "0000000000000000000000000000000000000000000000000000000000000000"
      ],
      "numTransactions":0,
      "numStatements":1
   },
   "block":{  
      "signature":"01089B6816BF6E32000CBB6477CA099B213FC78F666CC6D09A7E114C1199F50C2907E3746DCCBD2E2A610EE1BF754C21FFCAF712BB6E85B2CA52F65E6226CA06",
      "signerPublicKey":"978C91A6F526ECD352A784DF6FE571D8E415151B0F786717EE12F8F79EAFA679",
      "version":36867,
      "type":33091,
      "height":"2",
      "timestamp":"110097498835",
      "difficulty":"100000000000000",
      "feeMultiplier":0,
      "previousBlockHash":"3B372855A6DD39AE6B09B1D4EA23FEA44FFA0782EEBEF981B4FA8C5A34CC1894",
      "transactionsHash":"0000000000000000000000000000000000000000000000000000000000000000",
      "receiptsHash":"8F235224AAD1B2D10C0E5F77D6656F6C4F9BD9D21885A07EE1E5B61BDACA2C54",
      "stateHash":"1BC421E8052D9843BDBF0ABD30D615B8A129870B44A8A7FFE05D712453DA92C2",
      "beneficiaryPublicKey":"978C91A6F526ECD352A784DF6FE571D8E415151B0F786717EE12F8F79EAFA679"
   }
}
```

`block`のデータ内に`timestamp : 110097498835`とありますね。これがこのブロックが生成された時間を記録したものになります。

これは、**ある基準時間からの経過ミリ秒**を表しています。その基準時間はソースコード内では`Epoch_Time`と表現されています。

https://github.com/nemtech/catapult-server/blob/dc1be9fbbca2b33ecc5f8d18dd631bac8a2bb623/src/catapult/utils/NetworkTime.h#L30


上記リンクでとんだ場所に書かれている通り、基準時間は`2016-04-01 00:00:00 UTC`です。ここからの経過**ミリ**秒です。

`2016-04-01 00:00:00 UTC`(日本時間では`2016-04-01 am 9:00`)は、UNIX時間で`1459468800`です。上記ソースコードに書かれているのはミリ秒なので、`1459468800 * 1000`となり、`1459468800000`と書かれているんですね。

で、ここからの経過ミリ秒なので、最初に示したブロックは、この基準時間から`110097498835 / 1000 => 110097499`(丸めた)秒経過した時間となり、UNIX時間では`1459468800 + 110097499 = 1569566299`。つまり、`Sep 2019-09-27 06:38:19`ごろに生成されたということになります(時差に注意)。
【powershell】MS Word を高速で横断検索する


[MS Word 内部テキストの高速抽出](https://qiita.com/AWtnb/items/b70610f78b20adc46765) と [正規表現によるマッチ箇所の強調表示](https://qiita.com/AWtnb/items/954e32ed86f3663e777b) を組み合わせて、`.docx` ファイルに対する grep 検索のようなものを作ってみました。

`Select-Object` や `Where-Object` による柔軟なフィルタリングと組み合わせることでいろいろな活用方法が考えられそうです。

# コード
事前準備として、上記記事で紹介した `Get-TextOfDocxDocument` と `hilight` を `$profile` に記入するかドットソースを使うなどして読み込んでおきます。

```powershell
function Invoke-GrepOnDocx {
    <#
        .SYNOPSIS
        docx に対するGrep
        ・パイプライン経由での入力にのみ対応
        ・docx 以外は自動で無視する
        .PARAMETER pattern
        検索パターン
        .PARAMETER case
        指定時は大文字小文字を区別
        .EXAMPLE
        ls | Invoke-GrepOnDocx "ほげ"
    #>
    param (
        [string]$pattern,
        [switch]$case
    )
    $input | Where-Object Extension -eq ".docx" | ForEach-Object {
        $fileName = $_.Name
        $docxContent = Get-TextOfDocxDocumant -path $_.Fullname
        if ($docxContent.Status -eq "FILEOPENED") {
            Write-Error ("'{0}' is used by other process!" -f $fileName)
            return
        }
        $grep = $docxContent.Lines | Select-String -Pattern $pattern -AllMatches -CaseSensitive:$case
        foreach ($g in $grep) {
            "`n{0}:" -f $fileName | Write-Host -ForegroundColor DarkGray
            $g.Line | hilight -Pattern $pattern -case:$case -backgroundcolor "Yellow"
        }
        $total = $grep.Matches.Count
        if ($total) {
            "========== {0} ==========" -f $total | Write-Host -ForegroundColor Cyan
        }
    }
}
```

# 実行イメージ

![20201117195535.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501098/b5052199-c36c-4c9e-4f4f-f873f33fab5c.png)