OmniAICreator/Qiita-1.07M huggingface dataset:
Linuxのデバイスドライバから、仮想メモリ上のユーザプロセスメモリを任意のタイミングで読み書きする

ユーザプロセスのメモリをデバイスドライバから任意のタイミングで読み書きする方法のまとめ

Sample code to read/write user process's memory on virtual address from Linux device driver at any given time
https://github.com/mnishz/read_write_user_memory_from_driver

# 簡単な経緯
仕事で、上に書いたようなことを実現する必要があった。
`read()`, `write()`, `ioctl()` 等でユーザプロセスの仮想アドレスを渡して、その関数内で`copy_to_user()`, `copy_from_user()` から読み書きすることはできたが、ドライバ側でその仮想アドレスを覚えておいて関数を抜けた後に同様に読み書きしようとするとうまくいかなかった。ユーザプロセスの仮想アドレスしか持ち合わせていない状態でどうやって読み書きしているのかまで追えていないが、コンテキストが絡んでいるのかなーと想像する。
以下、どうやればできるかなと試行錯誤した結果のまとめ。

# やり方
## ユーザプロセス側
1. ユーザプロセス側からヒープメモリを確保する (スタックでも問題ないかも)
1. スワップアウトされないように `mlock()` しておく (多分必要)
1. 仮想アドレスを物理アドレスに変換する
    * 参考にしたサイト: https://stackoverflow.com/a/28987409
1. `ioctl()` で物理アドレスを渡す

## デバイスドライバ側
1. 受け取った物理アドレスを `copy_from_user()` でカーネル側にコピーする
1. `ioremap()` で物理アドレスをカーネルの仮想アドレスにマッピングする
1. マッピングした仮想アドレスから任意のタイミングでユーザメモリを読み書きできる

## サンプルコードで何をやっているのか
user_proc_A ではメモリを確保して `ioctl()` で物理アドレスをドライバに渡したあと、値が変わるのをループで待っている。user_proc_B で別の `ioctl()` を投げるとドライバが user_proc_A のメモリを書き換えて、それにより user_proc_A がループを抜けて終了する。

# 参考リンク
https://qiita.com/take-iwiw/items/26d5f7f4894ccc4ce227
https://www.ibm.com/developerworks/jp/linux/library/l-kernel-memory-access/index.html
http://mmi.hatenablog.com/entry/2017/03/21/151320
Google UI AutomatorでNumberPickerを操作できる

# 簡単なNumberPickerの例
### ビュー
![スクリーンショット 2019-01-17 15.45.25.png](https://qiita-image-store.s3.amazonaws.com/0/13451/824ac1ca-d92b-583f-5a76-c20ea2ce3e84.png)

### コード

```
String[] data = {"2", "3", "4", "5", "20"};
NumberPicker picker = (NumberPicker)findViewById(R.id.SamplePicker);
picker.setDisplayedValues(data);
```

### UI Automator Viewで分析
* 以下の構造

```
⬇︎ NumberPicker
 ⬇︎ Button: 20
 ⬇︎ EditText: 2
 ⬇︎ Button: 3
``` 

* UI Automator Viewとは
 * [UiAutomator について \- Qiita](https://qiita.com/fujin/items/2c501ca9b6e5d33d714c)
 * 簡単にAndroid 画面Viewの構造を分析してresource-id、textなど情報を表示できる


# UiObject2#swipe()でNumberPickerを操作する
### swipe()メソッド
* [void swipe \(Direction direction, float percent, speed\)](https://developer.android.com/reference/android/support/test/uiautomator/UiObject2#swipe(android.support.test.uiautomator.Direction,%20float,%20int))
 * percent: NumberPickerの長さより、swipt動作の移動距離
### 試す
* percent引数の設定
 * 0.0f ~ 1.0fの値
 * 具体的に何行を移動したい場合は、percentの値を調整しないといけない
 * pixel2, xperiaXZ2, galaxyS9, nexus系で試して同じpercent値で期待の移動距離を実現できる
* swipe()を実行した後に、sleep(1s)を実行して確認などが安定になれる


### コード

```kotlin

	//ub2がNumberPickerのビューオブジェクト
	var text = ub2.children.get(1) //EditTextの値を取得
	var textBefor = text.text
	ub2.swipe(Direction.DOWN, 0.3f, 1000) //１行を移動
	sleep(1000)
	Assert.assertNotEquals(textBefor, text.text) //移動後にEditTextに表示される値が前と違うことを確認
```


# UiObject#swipeUp()でNumberPickerを操作する
### swipeUpメソッド
* [boolean swipeUp \(int steps\)](https://developer.android.com/reference/android/support/test/uiautomator/UiObject.html#swipeUp(int))

### 試す
* ２行以上を移動できるが、stepの数値が一番小さいを設定したが１行を移動できない

### コード

```kotlin

	var text = ub.getChild(UiSelector().index(1)) //EditTextの値を取得
	var textBefor = text.text
	ub.swipeUp(1500) //2行移動される
	sleep(1000)
	Assert.assertNotEquals(textBefor, text.text) //移動後にEditTextに表示される値が前と違うことを確認
```


# まとめ
* UiObject#swipeUpメソッドで１行を移動できないことが残念が、今後は１行から数十行まで一発で操作方法を知りたい
* UiObjectにその他のスクロール操作メソッドがあって今後は調査する
WSL から Docker for Windows（含むk8s）を利用するための設定

環境: Ubuntu 18.04LTS on WSL on Win10 Enterprise (Ver.1809, Build 17763.253）

Dockerの設定は以下の手順でOK
https://laboradian.com/use-docker-on-wsl/#5_WSL_Docker_for_Windows

Kubectlは以下でいけました（After the install completes, jump back over to WSL and install kubectl with this command:　以降の手順）
https://medium.com/@XanderGrzy/developing-for-docker-kubernetes-with-windows-wsl-9d6814759e9f

唯一手順が違ったのが~/.kube/config へのリンクの貼り方。自分の環境では以下でした

`$ mkdir ~/.kube
 $ ln -s /mnt/c/Users/<<user name>>/.kube/config ~/.kube/config`
sWebTool Manuals index

# はじめに


[BurpSuite](https://portswigger.net/burp) のような Webプロキシです。

プロキシサーバや、フォワーダーのように通信の間に入り(通信を中継し)、通信データを編集できるツールです。

特にHTTP専用というわけではなく、TCP レベルで中継と編集が可能です。
しかしながら、HTTP に特化している部分が多々あります。

元々、私自身がセキュリティ診断を始めた頃には、専用のツールというものがなく(かろうじて Java で書かれた WebProxy というツールはあったけど、今では検索でヒットすらしないし、[Paros](https://ja.osdn.net/projects/sfnet_paros/) さえまだなかった)、VB6 で作り始めたのがきっかけです。

[VB6 で作った sPortRedirector はこちら](http://rocketeer.dip.jp/sanaki/free/free68.htm)

VB6 でできない機能は、VC6++/ATL で COM にしたり(C で書かれた DLL を呼び出すCOMラッパが典型例)、まぁよい思い出です。

それを、再度、今度は、.NET Framework/C# で作り直したのが、[本作 - sWebTool](http://rocketeer.dip.jp/sanaki/free/free140.htm)です。

# 分野

セキュリティ・プロキシと呼ばれるのが一般的か!?

個人的には、プロキシ・エディターがしっくりいくけど。

# インストール

[本家](http://rocketeer.dip.jp/sanaki/free/free140.htm)をよりダウンロードし、インターネットゾーンを外して、lzh形式のファイルを解凍するだけ。

元々、利用にはある程度の技術力が必要ですので、ゾーン情報知らないとか、lzh の解凍ができない人は使わなくてよいです。

## インターネットゾーン

インターネットからダウンロードしたファイルには、「インターネットからダウンロードされた」という付加情報が付いていて、それを外して、解凍しないと、解凍された各ファイルにも付いてしまう場合がある。

そして、ゾーン情報のついたDLLファイル(プラグインなど)は、.NET Framework ではロードされないので、上記のように自ら安全を確認できた場合には、ゾーン情報を消して解凍することが必要。

## インストールには自己責任

ゾーン情報は、SmartScreenなどのセキュリティ機構に重要な役割を持っているので、それを外すのだから、利用は自己責任でお願いしますよ。

# 動作環境

- .NET Framework 4.0 以降

# 機能ごとの紹介

<dl>
<dt>Traper : sPortRedirecotr.exe
<dd>HTTP 通信を編集可能とするツール<br><br></dd>

<dt>Repeater : sWebMachineGun.exe</dt>
<dd>いろいろな Web リクエスト・メッセージを送信するツール<br><br></dd>

<dt>Editer : sEasyEditerNET.exe</dt>
<dd>Base64やURLエンコードなどを実施する簡易的なテキスト/バイナリ・エディタ<br><br></dd>

<dt>FakeProxy : sHTTPsProxy.exe</dt>
<dd>動的に証明書を生成する HTTPs プロキシ<br><br></dd>

<dt>SSLScan : sSSLScan.exe</dt>
<dd>SSLScan のようなコマンドラインツール<br><br></dd>

<dt>sQRCodeFugging : sQRCodeFugging.exe</dt>
<dd>ファジングする QR コードを一気に生成するツール<br><br></dd>

<dt>QRCode sAuthenticator : sAuthenticator.exe</dt>
<dd>QRコードのOTPのパスコードを生成するツール<br><br></dd>

</dl>

# sEasyEditerNET.exe

[sEasyEditerNET.exe Manual](https://qiita.com/tomoki0sanaki/items/c2f48713a886a8889b87)

# sWebMachineGun.exe

[sWebMachineGun.exe Manual](https://qiita.com/tomoki0sanaki/items/e2b7767551a576b1dbd3)

# sPortRedirecotr.exe

[sPortRedirecotr.exe Manual](https://qiita.com/tomoki0sanaki/items/134cea01d1274075b723)

# sSSLScan.exe

[sSSLScan.exe Manual](https://qiita.com/tomoki0sanaki/items/11bb1e23c2e3bef2c2f1)

# sHTTPsProxy.exe

sHTTPsProxy.exe

# sQRCodeFugging.exe

[QRコードからファジングする(sQRCodeFugging.exe{sWebTool})](https://qiita.com/tomoki0sanaki/items/e46e666625191aeb762b)

# sAuthenticator.exe

[QRコード認証のパスコードを計算する(sAuthenticator.exe{sWebTool})](https://qiita.com/tomoki0sanaki/items/dc0ed2f1d5bb838ff026)

# プラグインの形式

一部の機能は、プラグインによる拡張が可能です。
実装している DLL は IPlugin.dll

IPlugin.dll は、[二つのストリームで双方向で通信するツール「StreamRelay.NET.exe」と「StreamRelay.jar」](https://qiita.com/tomoki0sanaki/items/85f20cbe18378e33cd6f) の StremRelay.NET.exe と共有しています。

# 実践編

- [設定を永続的に保存する(インポート/エクスポート)](https://qiita.com/tomoki0sanaki/items/6ba6eeb75dcc086e950f)

# 利用に際して

当然ですが、本ツールは、デバグ用、開発用であり、悪用厳禁ですよ。

# 以上
labelにforを使わずに、cssだけでトグルボタンを作る




# トグルボタンの基本
**on**の時に押すと**off**に。**off**の時に押すと**on**になるボタンです。基本的な構造はチェックボックスと同じで、見た目が違うだけです。

# labelにforを使ったパターン

inputに**id**属性を設定し、labelの**for**属性で対応するチェックボックスを指定してやります。

```html:html-1
  <input id="toggle-1" type="checkbox" name="btn1">
  <label for="toggle-1">ボタン１</label>
```

これでlabelタグを押すことでチェックボタンを押したことと同じになるので、あとはinputは非表示にするなりlabelを装飾するなりして、体裁を整えてやればよいというすんぽう。

キモはonのときとoffのときの表示状態を変えてやることです。
onというのはinput:checkedの時です。
inputの隣にlabelを配置することでcssセレクターで指定することができますのでそのように指定します。

```css:css-1
/* チェックボックスは非表示 */
  input[type="checkbox"] {
    display: none;
  }
/* ボタンとして押すのはlabelなので枠線を作る。offのときの表示です。 */
  label {
    border: 3px outset #888;
    background-color: white;
    color: black;
  }

/* onのときの表示 */
  input:checked + label {
    border: 3px inset #888;
    background-color: black;
    color: white;
  }
```

# labelにforを使わないパターン

labelの子要素として、inputを配置してやることでlabelタグに**for**を使わない、すなわちinputに**id**が不要な書き方ができます。

```html:html-2
  <label>
    <input type="checkbox" name="btn2">
    <span>ボタン２</span>
  </label>
```

あとはonとoffの表示状態の切り替えです。

ポイントはlabelタグではなく**子要素のspan**です。
cssは子要素から親要素を指定するセレクターは無いので、inputをlabelの子に入れてしまうとcheckedを判定することができません。
そこで、inputの兄弟要素であるspanをボタンの表示として使おうということです。

```css:css-2
/* チェックボックスは非表示（※css-1と同じ） */
  input[type="checkbox"] {
    display: none;
  }

/* offの表示状態 */
  label > input + span {
    border: 3px outset #888;
    background-color: white;
    color: black;
 }
/* onの表示状態 */
  label > input:checked + span {
    border: 3px inset #888;
    background-color: black;
    color: white;
  }
/* labelのhover時もこのように書ける */
  label:hover > input + span {
    color: red;
  }
```

動的なUIを作る場合、トグルボタンごときにいちいちidを振りたくない。そんなの管理もしたくない。
そういう時にはこの書き方が使えると思います。
R.swiftアップデート後ビルドエラー


# 内容
R.swiftを5系にアップデート後ビルドしたところ、エラーがでました。

```
[R.swift] Build phase Intput Files does not contain '$TEMP_DIR/rswift-lastrun'
[R.swift] Output path must specify a file, it should not be a directory.
[R.swift] Build phase Output Files do not contain '$SRCROOT/Common/R.generated.swift'.
```

スクリプトの記法が違うみたいです。

エラーが教えてくれている通り、Build Phase の Input Files, Output path, Output Filesをそれぞれ修正で問題なくエラーが消えます
(自分の場合はR.generatedファイルをData層等他のターゲットでも生成していたので、そちらでもスクリプトの修正をしないといけないのに見落としてたから時間がかかりましたが)
![スクリーンショット 2019-01-17 15.40.28.png](https://qiita-image-store.s3.amazonaws.com/0/261386/16ffc77f-4ade-19f3-bbb8-b3f96a401b7d.png)

そもそもGitHubで[R.swift/Documentation/Migration.md ](https://github.com/mac-cain13/R.swift/blob/master/Documentation/Migration.md) みると[see an example screenshot](https://github.com/mac-cain13/R.swift/blob/master/Documentation/Images/BuildPhaseExample.png)に画像つきでありますね。やっぱり公式見るの大事。


# 補足
そもそもRun Scripitと、環境変数、その意味みたいなところがわからなかったので軽くメモ
Run Script: 実行したいファイルのパスを書くとビルド時に指定されたファイル内容が実行される
環境変数： 今回の記事でいうと、TEMP_DIRやSRCROOTがそれに当たる。ディレクトリを格納した変数。
*それぞれの環境変数が何を指すかはAdd Run Script Build PhaseでRun Scriptを追加して、Shell下の入力欄に
' env > ./env.txt' と入力後ビルドするとenv.txtファイルが生成されるのでその中に書かれている。
![スクリーンショット 2019-01-17 16.11.49.png](https://qiita-image-store.s3.amazonaws.com/0/261386/0c275531-ff20-a7eb-da2a-ec6c5201dff0.png)
Let's Encryptの自動更新と通常のアクセスに対するリダイレクトを両立する(nginx)

Debian9+nginx1.14.0

##問題
Let'sEncryptの自動更新をcertbotコマンドの`--webroot`で行っていたが
次のようなエラーが出ていることに気付いた。

>IMPORTANT NOTES: 
- The following errors were reported by the server:    
Domain: example.com    
......
To fix these errors, please make sure that your domain name was 
entered correctly and the DNS A/AAAA record(s) for that domain 
contain(s) the right IP address.

##解決
運用しているドメインは２つ。
certbotは複数ドメインがあっても自動で全部確認してくれるが、
そのうち片方の.confファイル(nginx)に認証用のコードが抜けていた

```example.conf
server {
    listen 80;
    server_name example.com;
    return 301 https://$host$request_uri;
    server_tokens off;
}
```

httpsにリダイレクトするようにしていた。
この機能は残したいので

```
server {
    listen 80;
    server_name example.com;
    location ^~ /.well-known/acme-challenge/ {
        default_type    "text/plain";
        root            /home/user/somedir;
    }
    location / {
        return 301 https://$host$request_uri;
    }
    server_tokens off;
}
```
`^~`は前方一致なので`/.well-known/acme-challenge/`から始まるパスで更新のアクセスがあればそれ用のrootへ誘導する。`.well-known/～`というのはcertbotのコマンドで指定により自動で作られるらしい。
それ以外はリダイレクト。

`sudo service nginx restart`して
certbotの動作確認

```
certbot renew --dry-run --webroot --webroot-path /home/user/somedir --post-hook "service nginx reload"
```

>* DRY RUN: simulating 'certbot renew' close to cert expiry 
* (The test certificates below have not been saved.) 
Congratulations, all renewals succeeded. The following certs have been renewed:    
/etc/letsencrypt/live/example.com/fullchain.pem (success)     
/etc/letsencrypt/live/some.example.com/fullchain.pem (success)

これで大丈夫だと思う。

###参考
[Let's encrypt のWeb認証に失敗する場合の許可の通し方](https://qiita.com/tigersun2000/items/1091299b675efeb2c6ee)
[話題の無料SSL証明書！Let’s Encryptで証明書の取得に失敗したときに確認すること](https://sole-color-blog.com/blog/1345/)
[nginx連載5回目: nginxの設定、その3 - locationディレクティブ](https://heartbeats.jp/hbblog/2012/04/nginx05.html)
No Estimateに至った幸せな世界

RSGT2019お疲れ様でした。
3日もスクラムと改善にまつわる話を聞いたり話したりしていて楽しかったです。
なかなか自分の中でしっくりまとめられないので、1番感激した「No Estimate」の話に絞ってまとめてみました。

それは2日目の基調講演で、Chris Lucian氏から発せられました。
「No Estimate」の概要は、計画を綿密に立てても途中で変更があると無駄になるので、見積もりを止めたらユーザーのニーズにより早く応えられるというものだと考えています。
彼のチームでは何年も見積もりをしていない状態で上手くいっていると聞いて、何よりチームの強さに驚いて感動していました。
他にも茹でガエルの話や作業環境を整える話などありましたが、本題では無いので割愛します。他の参加者の記事を参考にしていただきたいです。

# ユーザーから信頼される

「No Estimate」は、刺激的な言葉ではありますが、本質はユーザーから信頼されるための工夫の一つだと思いました。
そう聞くと、先にユーザーから信頼が無いと見積もりやスケジュールを決めないで作業を進めるのは無理だと思うかもしれません。
しかし実際には逆の心理が働いていると思うのです。

# ユーザーは早く欲しいものが欲しい

現代のユーザーは、自分でも何が欲しいのか明確に分かっていないけれど、今にも欲しいものを使いたいのです。
我侭なオーダーメイドみたいですね。
以下の絵はアジャイルとウォーターフォールの有名な比較ですが、ここでのスケートボードを早く手に入れたいと考えてください。
![agile_bicycle.png](https://qiita-image-store.s3.amazonaws.com/0/276959/5bf72a2b-ef5c-a493-68ac-4df7e4f23331.png)
> Illustration of MVP product development by Henrik Kniberg


そして、ニーズとのギャップや感想をフィードバックして、さらに次のニーズへ応えてくれることを期待しています。
ユーザーは車が欲しいかもしれませんが、それまで自転車やバイクを試してみたいし、本当に欲しいものは車ではないかもしれないのです。
それは試してみるまで分かりません。
アジャイルであるなら、見積もりを無くした分だけ早く届けることで期待に応えるサイクルを早められて、結果的にユーザーのニーズに応えやすくなります。

# チームは良い評価が欲しい

チームは自分たちの成果物について常に評価を気にしています。
人生の中で仕事は大きな部分を占めているからです。
仕事で失敗してしまうと人生に傷がつく事だってあります。
給与もさることながら、1人の人間として自尊心やチームで成し遂げた達成感が満たされて欲しいとさえ願っていて、それに気付いていないことが多いです。
だからユーザーを満足させることは、チームを満足させることにも繋がるのです。

# まずスクラムする条件をクリアする

しかしながらスクラムの話は大体が「とても素晴らしいが、自分たちのチームで採用できない」という問題に当たると思います。
何故かと言えば、そういうチームはメンバーが信頼し合えていないことが多いです。
エンジニアは技術こそパワーなので、技術力が無いと尊敬対象にならないこともありますが、必ずしもそれだけが原因ではありません。
お互いの期待に応えていない不満から尊敬できていないのでは無いかと思うのです。

自分自身への期待と相手からの期待が合っていれば、あとは仕事をこなしていけば信頼が貯まっていきます。
チームメンバーを最も身近なユーザーだと置き換えて、最後の自動車に辿り着いた時がチームで信頼し合っている状態になるのでしょう。
そうなればスクラムが始められます。見積もりも無くせるでしょう。
何より、幸せになっていると思います。

そこに至ったチームが既に存在しています。
それが何より勇気付けてくれますし、我々もそうなりたいと思います。
BigQuery Scheduled Queries まとめ

# 初めに
BigQueryのScheduled Queriesに関して、自分用にまとめる

# 目次
0. そもそもScheduled Queriesってなんぞ
1. Scheduled Queriesの初め方
2. 各設定項目
3. Schedule
4. 設定確認
5. Manual Runs
6. クエリパラメータ

# 0. そもそもScheduled Queriesってなんぞ

BigQuery上にて、クエリを定期的に実行して結果をテーブルに納めていくもの。
定期実行が失敗しても **Manual Runs** を使用して過去分を復旧することができる。

個人的にはデータポータルに表示するデータ類の中間テーブル作成用で使用中。


# 1. Scheduled Queriesの初め方
旧WEB-UIにて [New Query] テキスト ボックスが出ている状態で[Show Options]の一つ左にある
```Schedule Query```
ボタンを押すだけ。

新WEB-UIだとボタンが存在しなくて辛い。

# 2. 各設定項目
**●通常設定**

クエリ自体の編集は画面上部のテキストエディタ部分で行う。

|項目|解説|
|:---|:---|
|Display name|表示名<br>そのまま|
|Schedule|クエリを実行するスケジュール設定<br>詳細は次で|
|Destination dataset|結果の書き込みを行うデータセット|
|Destination table|結果の書き込みを行うテーブル<br>存在しない場合は作られる|
|Write preference|WRITE_TRUNCATE: <br>テーブルがすでに存在する場合、テーブルのデータを上書きする<br><br>WRITE_APPEND:<br> テーブルがすでに存在する場合、データをテーブルに追加する|
|Partitioning field|分割テーブル用<br><br>分割無しのテーブルと取り込み時間を使った分割テーブルの場合は空白でOK<br><br>分割テーブルを使用する場合は　TIMESTAMP または DATE　のPartitioning fieldを指定|

**●Advanced設定**

|項目|解説|
|:---|:---|
|Cloud Pub/Sub topic|クエリの実行が終わった後に通知するPub/Subの設定|
|Send email notifications|エラー時に管理者にメール通知するかどうかの設定|
|Disabled|チェック入れるとスケジュール実行されなくなる|

# 3. Schedule

基本的には **Repeats** で指定した周期で **At** の時間にクエリが実行される。
繰り返す期間は **Starting (UTC)** から **Ending (UTC)** までとなる。

**Repeats** を **Custom** にするとある程度自由に設定することができる。
設定例）
```1st,3rd monday of month 15:30
every wed,fri of jan,jun 13:15
first sunday of quarter 00:00
every 4 hours
```

# 4. 設定確認

saveしたScheduled Queriesは旧WEB-UI上の左上の項目
Scheduled Queries
をクリックすると確認できる。

Display nameをクリックして詳細画面に入れば、editなども可能なので必要であればここからいじりましょう。
直近の実行履歴なども確認できます。
**Manual Runs**もこのページから実行可能なので忘れないように。

# 5. Manual Runs
一番めんどくさいところ。

[Start Manual Runs]をクリックすると **Starting (UTC)** と **Ending (UTC)** の設定画面が出てくる。
ここで指定した範囲に対して **Scheduleで設定したRepeats周期でAtの時間が存在すれば** 実行してくれる。
毎日0時に実行という設定で **1/2 15:00:00 ～1/5 3:00:00** を指定すると、1/3の0時、1/4の0時、1/5の0時の3回実行されることになる。

注意として、 **Ending (UTC)** は必ず現在より過去を指定しないとエラーになるということ。
現在バグ（？）のせいで、[Start Manual Runs]をクリックするとEnding (UTC)に、使用しているPCの現在時刻がUTC扱いで入ってしまい、そのまま使用すると上記のエラーになってしまう。

ということで、過去の実行もできるようになったが、過去の実行を行って過去のデータを出すには、クエリにいつのデータを取るのかということを教えなければいけない。
そこで出てくるのがクエリパラメータ。

# 6. クエリパラメータ

|表記|型|
|:---|:---|
|@run_time|TIMESTAMP型|
|@run_date|DATE型|

という形で二種類のパラメータが用意されている。
それぞれクエリが実行される日、つまりManual Runsを使用すれば過去の日付がそれぞれの型で送られてくる。
使い方は下記の通り

```sql:
SELECT
    COUNT(*)
FROM
    hoge
WHERE
    datestamp = @run_date
```

@ではなく{}で囲ってあげるとテーブル名などにも使える

#最後に
以上駆け足ですがBigQueryのScheduled Queriesに関してまとめてみた。
ちょっとずつ弄ったり情報を追加する気持ちではいる。

早く新WEB-UIで使えるようにしてくれー！
Github PR / Issue の編集でテキストエリアが縦に狭い！短い！編集しづらい！広げたい！ まさかの Edit ボタンを押した位置で高さが変わるみたいだ。

Github PR / Issue form textarea height is too short? Resolve tips is "where the place open edit form"
Github PR / Issue の編集でテキストエリアが縦に狭い！短い！編集しづらい！広げたい！ まさかの Edit ボタンを押した位置で高さが変わるみたいだ。

# Short height

![image](https://user-images.githubusercontent.com/13635059/51300445-43a3a180-1a6f-11e9-88ec-4c57ae03ff98.png)
![image](https://user-images.githubusercontent.com/13635059/51300454-47cfbf00-1a6f-11e9-8451-113919f13cc5.png)

# Long height

![image](https://user-images.githubusercontent.com/13635059/51300463-51592700-1a6f-11e9-8b72-74ff81e54a6f.png)
![image](https://user-images.githubusercontent.com/13635059/51300469-55854480-1a6f-11e9-9d6b-23e18b1b9689.png)

# OH GOD

finally i got a useful textarea lol

---

https://twitter.com/YumaInaura

https://github.com/YumaInaura/YumaInaura/issues








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Inchwormのアルゴリズム

## Inchwormとは

[Trinity](https://qiita.com/github-nakasho/items/631449416f3226ade7f6)のなかで利用されている、readを大まかにアセンブリしてcontigを生成するアルゴリズムです。ここではその概要を記述しています。

リード、カバレッジについての説明は[こちらの資料](https://jp.illumina.com/content/dam/illumina-marketing/apac/japan/documents/pdf/2012_illumina_techsupport_session5.pdf)を参照してください。

## アルゴリズム

![inchworm_02.png](https://qiita-image-store.s3.amazonaws.com/0/335400/5fd1f117-dc83-4fd4-18b7-a8171c10867f.png)



ここでは7塩基に着目していきます(k-merのk=7とします)。上図の左側のように、<font color="red">GATTACA</font>という7塩基配列のカバレッジが10であるとします。一番右のAから1塩基分だけ枝を伸ばしていきます。すると<font color="red">ATTACAG</font>のカバレッジは4、ATTACAAは0、ATTACATは1、<font color="red">ATTACA<font color="blue">C</font></font>は4であることがわかりました。次は最もカバレッジの高い<font color="red">ATTACAG</font>と<font color="red">ATTACA<font color="blue">C</font></font>に着目します。

- <font color="red">ATTACAG</font>側
ここから1塩基を伸ばします。すると<font color="red">TTACAG<font color="green">A</font></font>が最もカバレッジの高い5であることがわかりました。
- <font color="red">ATTACA<font color="blue">C</font></font>側
こちら側も1塩基だけ伸ばします。するとこちらはTTACACG, TTACACA, TTACACT, TTACACCのカバレッジは1であることがわかりました。

両側の結果を比較すると<font color="red">TTACAG<font color="green">A</font></font></font>が最もカバレッジが高いということがわかりました。
ここから、<font color="red">GATTACAG<font color="green">A</font></font>という塩基配列が元のデータにもあるのではないか、とわかります。
同様に左側にも塩基の枝を広げていき、このcontigを作成していきます。
【メモ】VSCode（mac）でファイルの差分を確認・修正する

Githubなどで色々修正が入ってしまったファイルと手元の作業ブランチ等のファイルの差分を確認しマージする。

１、VSCodeで比較したいファイルを開く（新規ファイルを追加してGithubなどからコードを貼り付ける）
２、command+shift+Pでコマンド入力ウインドウを出し、compareと入力すると画像のようにコマンド候補が出ますので選ぶと比較したいファイルの候補が出てきますので選択。
![スクリーンショット 2019-01-17 15.23.52.png](https://qiita-image-store.s3.amazonaws.com/0/126335/327d8ee2-5830-00e3-db7e-1771de8dd813.png)

３、画像のように2分割で比較できます。
![スクリーンショット 2019-01-17 15.17.56.png](https://qiita-image-store.s3.amazonaws.com/0/126335/9d791151-5f09-a9ec-6148-c3e6773ab2b5.png)

「・・・」ボタンをクリックし、「並べて表示に切り替え」を選ぶと1枚のファイルに表示されますので、好きな方で編集してください。
![スクリーンショット 2019-01-17 15.19.04.png](https://qiita-image-store.s3.amazonaws.com/0/126335/3221ffc7-1bc0-bdfa-fa0d-e6560f37443a.png)
![スクリーンショット 2019-01-17 15.19.17.png](https://qiita-image-store.s3.amazonaws.com/0/126335/16c8ab28-5724-b025-3838-13b301bb064e.png)
NMeCabでmecab-ipadic-neologdを指定するとエラーになる

C#でMeCabを利用する方法としてNMeCabというライブラリを利用する方法がありますが、以下のようにして｢mecab-ipadic-neologd｣を辞書として指定するとMeCabTagger.Createでエラーになります。

            MeCabParam mecabProg = new MeCabParam();
            mecabProg.DicDir = @"C:\mecabdic\mecab-ipadic-neologd";
	    MeCabTagger t = MeCabTagger.Create(mecabProg);

｢mecab-ipadic-neologd｣が｢utf8｣として作成されているからのようです。

VS2017のNUGETではNMecabのVer0.06.4を最新版としてインストールしており、
以下のサイトからVer0.07をダウンロードして｢LibMeCab.dll｣を参照設定することで回避できました。

https://ja.osdn.net/projects/nmecab/releases/63529

ああ、Pythonを使うほうが楽だ！Python使いたい。
既存の複数ページの PDF ファイルに加筆する (python3)

例として、３ページのPDFファイルに加筆します。

```py:pdf_overwrite_plural.py
#! /usr/bin/python
#
#	pdf_overwrite_plural.py
#
#						Jan/17/2019
#
# ------------------------------------------------------------------
import sys
from pdfrw import PdfReader
from pdfrw.buildxobj import pagexobj
from pdfrw.toreportlab import makerl
from reportlab.pdfgen import canvas
from reportlab.pdfbase.cidfonts import UnicodeCIDFont
from reportlab.pdfbase import pdfmetrics
from reportlab.lib.pagesizes import A4
from reportlab.lib.pagesizes import portrait
# ------------------------------------------------------------------
def page_1_proc(cc,pp,fontname_g):
	cc.doForm(makerl(cc, pp))
	cc.setFont(fontname_g,24)
	cc.drawString(400,800,"おはよう")
	cc.drawString(400,700,"１ページ目")
	cc.drawString(400,600,"Good Morning")
	cc.showPage()
#
# ------------------------------------------------------------------
def page_2_proc(cc,pp,fontname_g):
	cc.doForm(makerl(cc, pp))
	cc.setFont(fontname_g,24)
	cc.drawString(400,800,"こんにちは")
	cc.drawString(400,700,"２ページ目")
	cc.drawString(400,600,"Hello")
	cc.showPage()
#
# ------------------------------------------------------------------
def page_3_proc(cc,pp,fontname_g):
	cc.doForm(makerl(cc, pp))
	cc.setFont(fontname_g,24)
	cc.drawString(400,800,"今晩は")
	cc.drawString(400,700,"３ページ目")
	cc.drawString(400,600,"Good Evening")
	cc.showPage()
#
# ------------------------------------------------------------------
sys.stderr.write ("*** 開始 ***\n")
file_in = sys.argv[1]
file_out = sys.argv[2]
sys.stderr.write(file_in + "\n")
sys.stderr.write(file_out + "\n")
#

cc = canvas.Canvas(file_out,pagesize=portrait(A4))
fontname_g = "HeiseiKakuGo-W5"
pdfmetrics.registerFont (UnicodeCIDFont (fontname_g))
#
page = PdfReader(file_in,decompress=False).pages
sys.stderr.write("len(page) = %d\n" % len(page))
#
pp = pagexobj(page[0])
page_1_proc(cc,pp,fontname_g)
#
pp = pagexobj(page[1])
page_2_proc(cc,pp,fontname_g)
#
pp = pagexobj(page[2])
page_3_proc(cc,pp,fontname_g)
#
cc.save()
#
sys.stderr.write ("*** 終了 ***\n")
# ------------------------------------------------------------------
```

実行方法

```bash
./pdf_overwrite_plural.py template_3.pdf out01.pdf
```
How to use SharedProject with UWP application in Visual Studio

## Introduction
In Visual Studio we can create <b>Shared Project</b> and use it later in any UWP project. This is one of a good way we can re-use some C# codes in multiple UWP project.
## What is Shared Project?
Shared Project is a great way of sharing common code across multiple applications. It will be added as part of the application and compiled along with it. So we can easily re-use the some identical C# code with multiple application. It can easily be done using the <b>Add Reference</b> feature in UWP application solution explorer.
### Create a Shared Project
From Visual Studio Click <b>File</b> -> <b>New Project</b> Navigate to <b>Template</b> -> <b>Visual C#</b>
From there we will find "<b>Shared Project</b>" C# template
![solution_explorer (3).png](https://qiita-image-store.s3.amazonaws.com/0/211892/89f4bb65-954f-84d6-559e-652d569ffe71.png)

Once we create a new project, It will create a Shared Project in the Solution Explorer like below
![image60.png](https://qiita-image-store.s3.amazonaws.com/0/211892/10d5e641-d629-6272-165d-4353716c3caa.png)
After that we will add some code to the Shared Project we just create
![image61.png](https://qiita-image-store.s3.amazonaws.com/0/211892/78310054-5a14-1446-3929-ccc1fdb4c847.png)
So we added class <b>Student</b> into it
### Use Shared Project in UWP application
From the existing UWP project right click on the Solution Explorer -> <b>Add</b> -> <b>Existing Project</b> and then browse for the Shared Project that we just created.
![solution_explorer.png](https://qiita-image-store.s3.amazonaws.com/0/211892/62caf51c-c149-a9cd-c07e-964437065391.png)
After that from the project reference tree right click on the Project Name -> <b>Add</b> -> <b>Reference</b>
![solution_explorer (1).png](https://qiita-image-store.s3.amazonaws.com/0/211892/4381bea3-31c5-ec3b-dc19-d2fb8779f719.png)
And from the Reference Manager Choose <b>Shared Project</b> and Check the Project we just created. If there is nothing there, we can go and browse for it.
![solution_explorer (2).png](https://qiita-image-store.s3.amazonaws.com/0/211892/38df4160-46a5-da10-b6cf-dac6837800b8.png)
Now that our Shared Project code is ready to used.
From our <b>MainPage.cs</b> we import the <b>Student</b> class from the Shared Project
P.S: <b>SharedProject</b> is my shared project namespace. It may be vary.

```c#
using SharedProject;

namespace DemoUWP {
   public sealed partial class MainPage: Page {
      public MainPage() {
         Student student = new Student();
      }
   }
}
```
The code above is the demonstration of how we can use the code. That's all for this article. Thank you!
Could not find!! railsコマンドを打ってrakeが見つからないとエラーが出た時の対処方法


# Could not findって言われた

scaffoldでモデルを作成しようと以下のコマンドを打ったら

```
$ rails generate scaffold model column:data-type
```

以下のようなエラーが吐かれて実行されなかった。

```
Could not find rake-12.3.2 in any of the sources (Bundler::GemNotFound)
```

## 環境
Rails5.2
Bundler version 1.17.1

# なぜこのようなことが起こるのか
それは、bundleのpathがおかしいから。いわゆる、configuration errorの一つってことですね。なぜpathがおかしくなるかはいじくりまわしすぎが主な原因だと思うので、これといって断定できないです。

# 解決策
bundleのパスを指定して、そこにGemfileで書いたgemが落ちてくるようにすれば良い。

```
$ bundle install --path vendor/cache
```

これでこのオプションで指定したディレクトリの直下にgemがインストールされるようになる。
設定がちゃんとされているかを下記のコマンドを使って確認してみると、以下のような標準出力がなされて、pathがvendor/pathに設定されているのがわかると思います。

多分、Could not found rakeが出ている時にbundle configってやったら変なとこにパスが作られているのではないかと思われる・・・

```
$ bundle config

Settings are listed in order of priority. The top value will be used.
path
Set for your local app (/bundle/config): "vendor/cache"
Set via BUNDLE_PATH: "/bundle"

silence_root_warning
Set via BUNDLE_SILENCE_ROOT_WARNING: true

app_config
Set via BUNDLE_APP_CONFIG: "/bundle"

bin
Set via BUNDLE_BIN: "/bundle/bin"

gemfile
Set via BUNDLE_GEMFILE: "/product_name/Gemfile"
```

この後に最初のコマンドを実行したら、実行されました。
scratchで落下と慣性の表現

#はじめに
地元でやっているのCoderDojoってやつに参加してきました。長男はscratch3.0の新機能であるmicro:bitとの連携という今っぽいことをしておりました。他の子どもたちはどんなの組んでいるかなぁと聞き耳立てていたら「ジャンプってどう実装するんだろう」という話が聞こえてきたんですよ。

物理好きなおじさんとしては「どれどれ・・・」と行きたかったのですが、初参加というのもあり遠慮しました。帰ってきたらいつの間にか作っていたので公開します。とはいえ、落下と慣性に関する実装です。

ジャンプに関しては、ボタンを押したら常に同じ高さまでジャンプする方式と、マリオのように押し続けた長さでジャンプの高さが変わる方式がありますが後者をどうやったらscratchで組めるかについては状態の管理がちょっと難しそうですが、思いついたらやってみるかもしれません。

#とりあえずリンク
**[ニュートンとリンゴ](https://scratch.mit.edu/projects/279586796/)**

遊んでもらうことは目的としていないのですが、ちょっと慣れたお子様ならゲームとして完成させてくれることは難しくないでしょう。
いつものscatchのねこにかつらをかぶせてニュートンと名乗らせています。演算の内容としてはガリレオ・ガリレイですが、ピサの斜塔でクレイジークライマーを作るのはちょっと大変そうだったので・・・

#りんごの落下について
重力というのがどのように働くかというのを実装しています。
重力の表現としてはだんだん早くなるという表現が必要になりますが、実際の物理では時間当たりの早くなる速度というのは一定です。つまり、時間ごとに速度を変化させれは重力の表現ができます。

落下の表現はこれになります。
![apple2.JPG](https://qiita-image-store.s3.amazonaws.com/0/310093/6c9aac80-99a6-1123-8002-c0dce0e85498.jpeg)
0.1秒を1コマとして、１秒に3(ピクセル？)の加速をする設定にしています。数学で表現するとなかなか大変ですが、プログラムで書くと意外と単純なところがうれしいですね。喜びのあまり小学六年生の息子に見せました。
ゲームによって設定は変えるといいです。実際、りんごが落ちる表現として、表示されてから0.5秒後に落下を始める設定にしてあります。

#ねこのニュートンの慣性付きの移動について
慣性に関しても落下と同じでこのような動作を組んであります。

- 0.1秒ごとに速度分だけ移動させる
- 矢印キーを押されている間は2ずつ速度を上げる
- 速度の最大値は16とする
- やじるしの入力がないと速度は1ずつ下がる

最大速度に関しては、この場合は最高速度に達するのに1秒かからないので急に加速が止まっています。レースゲームで車の加速を表現するなら空気抵抗として速度に比例した反作用を付けると自然な加速の表現ができると思います。

##0.1秒ごとに速度分だけ移動させる

難しいことは何もないです。
![newton2.JPG](https://qiita-image-store.s3.amazonaws.com/0/310093/94e238c8-54f4-d00a-eb29-9538e4fc8c38.jpeg)

マイナスの値をとると左向きのに移動します。

##やじるしの入力がないと速度は1ずつ下がる

今度はちょっとややこしいです。

![newton3.JPG](https://qiita-image-store.s3.amazonaws.com/0/310093/c1498bc3-5275-8815-2d9c-64cdbd224bad.jpeg)

速度はプラスとマイナス両方を取りますので、速度を減らす向きが違いますので、もし～でなければを使っています。また、速度が0の場合も考慮に入れてあります。（さらに速度が整数を取らない場合や減速の係数が1でない場合などはもっと複雑になります。）

##矢印キーを押されている間は2ずつ速度を上げる
右と左ではプラスマイナスが違うだけなので右のみで・・・

![newton4.JPG](https://qiita-image-store.s3.amazonaws.com/0/310093/5eb5e2f1-87d4-4326-464b-add3c327063c.jpeg)

##速度の最大値は16とする

一歩手前で調整しないと速度は１６を超えてしまいます。
![newton5.JPG](https://qiita-image-store.s3.amazonaws.com/0/310093/6c6e1d7f-6598-c3f7-b760-86b10f45ad83.jpeg)

#さいごに

数式より簡単にかけたのでちょっとうれしいです。実際のコードは[　リンク　](https://scratch.mit.edu/projects/279586796/)を見てください。
できるだけ若い方にも読んでもらえるように書いたつもりですが、わからない部分について質問をお待ちします。
最近の顔特徴点の抽出方法

###はじめに
最近の顔特徴点(Face landmark)の抽出について書きます。

###DAN(Deep Alignment Network: A convolutional neural network)とは
Deep Alignment Network: A convolutional neural network for robust face alignment：Marek Kowalski, Jacek Naruniec, Tomasz Trzcinski
https://arxiv.org/abs/1706.01789

Github https://github.com/MarekKowalski/DeepAlignmentNetwork

<img width="701" alt="スクリーンショット 2019-01-17 13.55.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/33329/c3b41f9b-3eec-e9bd-e278-df749dcc44c4.png">

DANについて説明します。DANはカスケード形状回帰（CSR）にインスパイアされました。
まずはCSRについて説明します。

###カスケード形状回帰 Cascade Shape Regression (CSR)とは
顔の形状はM個の点より構成されます。
ランドマークポイント(landmark point)を$ S =[x_1, y_1, ..., x_M, y_M]$とする。
各画像を$I_i$,本当の形を$\hat{S}_i$とします。$i=1,2,\cdots,N$
カスケード独立変数$R = \left( R ^ { 1 } , R ^ { 2 } , \ldots , R ^ { T } \right)$はT個の独立変数で構成されます。

画像$I$および最初の顔の形状$S_0$が与えられると、各回帰子は前の形状を更新するために形状増分ベクトル$\Delta Ｓ$を生成します。

$$S ^ { t } = S ^ { t - 1 } + R ^ { t } \left( I , S ^ { t - 1 } \right) , \text { with } \Delta S ^ { t } = R ^ { t } \left( I , S ^ { t - 1 } \right) , t = 1,2 , \ldots , T$$
損失関数は以下のようになる。これ最小化するように学習する。
$$R ^ { t } = \arg \min _ { R } \sum _ { i = 1 } ^ { N } \left\| \hat { S } _ { i } - \left( S _ { i } ^ { t - 1 } + R \left( I _ { i } , S _ { i } ^ { t - 1 } \right) \left\| _ { 2 }\right. \right. \right.$$

DANもCSRを使っています。
上の図を見てください。ニューラルネットワークの各段階は、初期推定値$S_0$から始めて、前の段階によって生成された顔特徴点の位置推定値を精緻化する。
接続層は、顔特徴点ヒートマップ$H_ｔ$、特徴画像$F_t$、および入力画像を標準的な姿勢にワープするために使用される変換$Ｔ_ｔ$を生成することによって、ネットワークの連続したステージ間のリンクを形成します。
顔特徴点のヒートマップと特徴画像を導入することによって、顔特徴点位置推定を含む重要な情報を伝達することができます。

<img width="650" alt="スクリーンショット 2019-01-17 15.37.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/33329/81fc516d-6944-45da-4fb9-a212d59dd14c.png">
左が初期状態$S_0$で右が最後の結果だと思われます。

https://drive.google.com/drive/folders/1QFZk_ED_FLW0xZC_gNuAKsYjLyKRMPPy より

以上が大まかなアイデアだと思われます。


詳細については論文をみてください。(めんどくさくなったので逃げる)


DANを漫画の顔の特徴点の抽出に使った例もあります。

Facial Landmark Detection for Manga Images：Marco Stricker, Olivier Augereau, Koichi Kise, Motoi Iwata
https://arxiv.org/abs/1811.03214

論文での結果

<img width="477" alt="スクリーンショット 2019-01-17 14.35.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/33329/6d31ddb1-6509-5c25-3b5d-930d0441e9e0.png">

###最後に
漫画の顔特徴点の抽出をするためには、上のGithubのDANを持ちて、漫画の顔のアノテーションを作って学習させる必要があるのだと思います。
実際にできたら記事を書きたいと思います。

# 参考文献
Cascaded Shape Regression for Automatic　Prostate Segmentation from Extracorporeal　Ultrasound Images
Jierong Cheng, Wei Xiong, Ying Gu, Shue Ching Chia, and Yue Wang
https://oar.a-star.edu.sg/jspui/bitstream/123456789/307/3/miar-csr.pdf
備忘録：GoogleAppsScriptでトリガーの実行時間を変更する（勤怠管理botみやもとさん）

#勤怠管理bot「みやもとさん」の出勤確認通知の時間を変更したい
勤怠管理としてSlackに導入中の勤怠管理bot「みやもとさん」。（https://github.com/masuidrive/miyamoto）
ReadMe通りに設定して使っていたが、毎日11時ころに届く出勤確認の通知部分を変更したい、となり試してみた。
![miyamotosan0.png](https://qiita-image-store.s3.amazonaws.com/0/158179/cf4fa8f9-0f54-bc12-53d4-130f0333eb09.png)
↑今まで

#いざ変更
##「Miyamoto-san」ファイルを開く
そもそも編集したことがなかったのでどこにこのファイルがあるか完全に忘れていましたが、GoogleDrive内を全検索したらあったのでひと安心。
編集した新しいバージョンでファイルを実行・公開するには下記を参照。
https://github.com/masuidrive/miyamoto/blob/master/UPDATE.md

##トリガーの実行時間を変更する
ファイルをたどっていき、出勤確認のトリガーを実行する時間を記述している箇所を発見。
![miyamotosan1.png](https://qiita-image-store.s3.amazonaws.com/0/158179/b177e733-d9a1-2b5e-4be7-f4f5e22df3a5.png)
11時→13時に変更したかったので、atHour()の部分を11→13に変更。
ファイルを保存して新しいバージョンで更新するように実行。
![miyamotosan2.png](https://qiita-image-store.s3.amazonaws.com/0/158179/8b79931a-b779-945e-9ca5-38015e8d9ced.png)

ところが・・

![miyamotosan3.png](https://qiita-image-store.s3.amazonaws.com/0/158179/749afab0-0367-3f78-b889-14b582442e16.png)

11時に来る・・

##メニューからトリガーを編集
スクリプトのエディタ画面のメニュー「編集」から「現在のプロジェクトのトリガー」を開く。
![miyamotosan4.png](https://qiita-image-store.s3.amazonaws.com/0/158179/7d0d3a47-ad0f-ffd2-ae43-d9e2f9ad6875.png)

変更したいトリガーの編集画面を開く
![miyamotosan5.png](https://qiita-image-store.s3.amazonaws.com/0/158179/ff36f743-c448-cab8-08d2-96470a1043dc.png)

変更したい時間を選択して保存する。
（※厳密な時間指定はできず、○時～○時の間に実行されるという形になる）
![miyamotosan6.png](https://qiita-image-store.s3.amazonaws.com/0/158179/7c21f9e4-16a0-d3b7-5a95-a8057258c718.png)

以上に設定したところ、無事13時に通知が来るようになりました。
![miyamotosan7.png](https://qiita-image-store.s3.amazonaws.com/0/158179/ce80b8de-2b47-48b4-60c9-4ae4a7e5d494.png)
（marikoさんがいつもいないみたいになっていますが、通常午後出勤でこの日はたまたま本当にお休みでした）


初歩的な内容かもしれませんが、全くさわったことがなかったので、備忘録としてまとめました。
下記のページ参考にさせていただきました。
https://tonari-it.com/gas-trigger-set/
reportlab で 複数ページの PDF を作成

例として、３ページのPDFファイルを作成する方法です。

```py:gen_plural.py
#! /usr/bin/python
#
#	gen_plural.py
#
#						Jan/17/2019
#
# ------------------------------------------------------------------
import	sys
#
from reportlab.pdfgen import canvas
from reportlab.pdfbase.pdfmetrics import registerFont
from reportlab.pdfbase.cidfonts import UnicodeCIDFont
# ------------------------------------------------------------------
sys.stderr.write ("*** 開始 ***\n")
#
font_mincho = "HeiseiMin-W3"
#
registerFont(UnicodeCIDFont(font_mincho))
#
pdf_canvas = canvas.Canvas("out01.pdf")
#
#
pdf_canvas.setFont(font_mincho, 30)
pdf_canvas.drawString(100, 700, "１ページ目です。")
str_out = "日本語でこんにちは！　明朝体"
pdf_canvas.drawString(100, 500, str_out)
#
str_out="２０１９年１月１７日"
pdf_canvas.drawString(400, 200, str_out)
#
pdf_canvas.showPage()
#
pdf_canvas.setFont(font_mincho, 30)
pdf_canvas.drawString(100, 700, "２ページ目です。")
str_out = "日本語でこんにちは！　明朝体"
pdf_canvas.drawString(100, 500, str_out)
pdf_canvas.showPage()
#
pdf_canvas.setFont(font_mincho, 30)
str_out = "日本語でこんにちは！　明朝体"
pdf_canvas.drawString(100, 700, "３ページ目です。")
pdf_canvas.drawString(100, 500, str_out)
pdf_canvas.showPage()
#
pdf_canvas.save()
#
sys.stderr.write ("*** 終了 ***\n")
# ------------------------------------------------------------------
```
swiftの配列からindexを循環して取得

なんてタイトルにしていいか分からなくて困った
pythonみたいに負の値でもうまくとりたいなって

# extension
```swift
extension Array{
  subscript (loop index: Int) -> Element {
    let lIndex = (self.count + (index % self.count)) % self.count
    return self[lIndex]
  }
}

```
# 使い方
```swift
  let a = [1,2,3,4,5]
  for index in -10 ... 10{
    print("\(index), \(a[loop:index])")
  }
/*
index = -10, value = 1
index = -9, value = 2
index = -8, value = 3
index = -7, value = 4
index = -6, value = 5
index = -5, value = 1
index = -4, value = 2
index = -3, value = 3
index = -2, value = 4
index = -1, value = 5
index = 0, value = 1
index = 1, value = 2
index = 2, value = 3
index = 3, value = 4
index = 4, value = 5
index = 5, value = 1
index = 6, value = 2
index = 7, value = 3
index = 8, value = 4
index = 9, value = 5
index = 10, value = 1
*/
```

#おわり
いまどきindexで配列にアクセスするな
PHP: 2つのDateTimeが何秒差かを求める

PHPで2つの`DateTime`や`DateTimeImmutable`オブジェクトの時刻の差が何秒か計算する方法を紹介する。

`DateTime::getTimestamp`はUnixタイムスタンプを返すが、タイムスタンプは1970/1/1からの経過秒なので、両者のタイムスタンプを計算してあげればいい。

```php
$startedOn = new DateTimeImmutable('2001-02-03 00:00:00.000000');
$finishedOn = new DateTimeImmutable('2001-02-03 01:01:01.123456');
$durationInSeconds = $finishedOn->getTimestamp() - $startedOn->getTimestamp();

// テスト
assert($durationInSeconds === 3661);
```

なお、`DateTime::diff`の戻り値の`DateInterval`から求めるのは意外と大変。

```php
$startedOn = new DateTimeImmutable('2001-02-03 00:00:00.000000');
$finishedOn = new DateTimeImmutable('2001-02-03 01:01:01.123456');
$diff = $finishedOn->diff($startedOn);
$durationInSeconds = ($diff->s)
			+ ($diff->i * 60)
			+ ($diff->h * 60 * 60)
			+ ($diff->d * 60 * 60 * 24)
			+ ($diff->m * 60 * 60 * 24 * 30) // 月は30でいいのか？
			+ ($diff->y * 60 * 60 * 24 * 365); // 年は365でいいのか？
assert($durationInSeconds === 3661);
```
[Rails5]rubocopってなんぞ？

Railsの勉強としてgem周りを触ってみる企画です。
今回は・・・

[rubocop](https://github.com/rubocop-hq/rubocop)

を試してみようかと思います。

## どういうgemなの？

Rubyコードを解析して、
コーディング規約に沿っているかチェックするgem。

![cap1.png](https://qiita-image-store.s3.amazonaws.com/0/335844/63be09cf-f85f-fdc8-3496-d1f9e3d943ba.png)

言わずもがなモデルはRoboCop。

>Role models are important.
>-- Officer Alex J. Murphy / RoboCop

## 検証環境

以下の環境で実施しました。

```
[client]
・MacOS Mojave(10.14.2)
・Vagrant 2.2.2
・VBoxManage 6.0.0

[virtual]
・CentOS 7.6
・Rails 5.2.2
・ruby 2.3.1
```

ご参考までに。

# rubocop導入

**1.gemのインストール**

事前にRails勉強用に作成したプロジェクトで進めます。
各MVCは適当に掲示板アプリを想定してPostsコントローラーなどを生成済みです。
(index,show,editの空ページが見れる程度)

```
$ rails g model post
$ rails g controller posts index show edit
```

その前提のもと、Gemfileに以下を追記。

```ruby:Gemfile
# rubocop
gem 'rubocop', require: false
```

追記したらインストール。

```
$ bundle install

-----------
Fetching rubocop 0.63.0
Installing rubocop 0.63.0
-----------
→無事に完了。
```

**2.rubocopを使う**

これで使用できるようになったので、早速使ってみましょう。
試しにposts_controller.rbを対象に。

```
$ bundle exec rubocop -R app/controllers/posts_controller.rb
```

で、実行したら

```
Inspecting 1 file
C

Offenses:

app/controllers/posts_controller.rb:1:1: C: Style/Documentation: Missing top-level class documentation comment.
class PostsController < ApplicationController
^^^^^
app/controllers/posts_controller.rb:1:1: C: Style/FrozenStringLiteralComment: Missing magic comment # frozen_string_literal: true.
class PostsController < ApplicationController
^
app/controllers/posts_controller.rb:14:9: C: Layout/AlignParameters: Align the parameters of a method call if they span more than one line.
        filename: "投稿情報.csv"
        ^^^^^^^^^^^^^^^^^^^^
(省略)

1 file inspected, 21 offenses detected
```

めっちゃ言われた。

コマンド叩いた直後の"C"は見つかった違反の中で一番深刻なものの頭文字らしいです。
(Convention, Warning, Error, Fatalの順に深刻)
つまり、結構多く指摘されたけど一番軽微な違反みたい。

また、コマンド時に`-R`オプションをつけていますが、
これをつけるとRailsに特化した実行がされるようです。

その辺りの参考は[official manual](https://docs.rubocop.org/en/latest/)で。

## 補足

ルート直下に`.rubocop.yml`を設置すると、独自に規約を設定出来るとのこと。
ただし、デフォルトの項目のオーバーライドとなるようなので注意。
※デフォルトのコーディング規約は[Ruby style guide](https://github.com/rubocop-hq/ruby-style-guide)。

また利用例では、各プロジェクトおよびチームごとに決めた規約での調整や、
`vendor/bundle`や`db/schema.rb`を対象外にする設定を施す、などがあるようです。

# 所感

コーディング量が多くなってくると、
ついチームで取り決めてたコーディング規約を忘れて、
手グセのような感じで自分の書き方をしちゃうことはあると思います。

かといってソースレビューで１行ずつ
「ここ、規約違反だよ！！」
なーんてことしてたら大変ですね。

その辺りは全部rubocopさんにおまかせしちゃえば、
時短にもなって楽出来そうです！

# おわりに

何かお気づきの点がありましたら、
ご指摘やアドバイス等頂けると大変助かります！
React Native の WebView でローカルファイルをロードしてJavascriptを実行する

ReactNativeで開発していてWebViewを使ってローカルファイルをロードしてJavascriptを実行する必要があって日本語の情報なくてちょっと困ったので備忘録として残しておく
だれかの参考になれば幸いです

※ iOSのみ

## 概要
- ロードしたいhtmlやそのhtmlが参照しているcssなどはios/external/ 以下に配置する
- XCodeにexternalを追加する(ドラッグ&ドロップ)
- WebViewからはsource={{uri: './index.html'}}でアクセスする

## 例
ロードするhtmlを index.html とする
index.htmlの中身

``` index.html
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <title>Page Title</title>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel="stylesheet" type="text/css" media="screen" href="main.css" />
    <script src="main.js"></script>
</head>
<body>
    <div>hoge</div>
    <div class="test"></div>
</body>
</html>
```

ファイル配置

```
ReactNativeRootフォルダ
└ios
  └external
    ├index.html
    ├main.css
    └main.js
```

```
render() {
    const jsCode = `var testElement = document.getElementByClassName('test')
var appendElement = document.createElement('div')
appendElement.textContent = 'hugu'
testElement.appendChild(appendElement)
`
    return <View>
        <WebView
            source={{uri: './index.html'}}
            injectedJavascript={jsCode}
        />
    </View>
}
```

## 参考
- https://medium.com/@snehabagri.90/reactnative-webview-with-local-content-c98a09340801
[作成中]JUnitの使い方メモ

##JUnitとは
「JUnit」とは、Javaのユニットテストのためのフレームワークです。
ユニットテストを書くことで正しく動いていることを検証できます。

##JUnitにおけるテストのルール
- テスト対象のクラス名が「Xxx」なら、テストクラス名は「XxxTest」となる
- テスト対象のメソッド名が「Yyy」なら、テストメソッド名は「testYyy」となる
- テストメソッドに対してアノテーション「@Test」をつける。「public void」にする
- テストメソッドは「assertThat(実際の値, is(期待値));」とする
- 「前提条件、実行、検証」がわかりやすいコードを記述する

##基本的な使い方
基本的な使い方以下の通りです。

```java:Sample.java
public class Sample {
  public static int toDouble(int num) {
    return num * 2;
  }
}
```

上のサンプルに対するJUnitのテストは次のようになります。

```java:SampleTest.java
import org.junit.Test;

import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.*;

public class SampleTest {
  @Test
  public void testToDouble() {
    int actual = Sample.toDouble(10);
    int expect = 20;
    assertThat(actual, is(expect));
  }
}
```

期待する値を返さない場合はつぎのようにテストが失敗します。

```java
java.lang.AssertionError:
Expected: is <21>
     but: was <20>
```

##一時的にテストを無視する：@ignore
@Ignoreを付与することで、一時的にテストを無視できます。

```java
@Ignore @Test
public void doSomething() { /* ... */ }
```
PumaのCodename

[Puma](https://rubygems.org/gems/puma)のコードネーム遍歴が気になったので抽出してみました。

```shell
git tag | while read tag
do
git checkout $tag &>/dev/null
printf "${tag}: "
grep 'CODE_NAME =' lib/puma/const.rb | grep -oE '".+?"'
done
```

```
v1.0.0: v1.1.0: v1.1.1: v1.2.0: v1.2.1: v1.2.2: v1.3.0: v1.3.1: v1.4.0: v1.5.0: v1.6.2: v2.0.0: v2.0.0.b2: v2.0.0.b3: v2.0.0.b4: v2.0.0.b5: v2.0.0.b6: v2.0.0.b7: v2.0.1: v2.1.0: v2.1.1: v2.10.0: "Robots on Comets"
v2.10.1: "Robots on Comets"
v2.10.2: "Robots on Comets"
v2.11.0: "Intrepid Squirrel"
v2.11.2: "Intrepid Squirrel"
v2.11.3: "Intrepid Squirrel"
v2.12.0: "Plutonian Photo Shoot"
v2.12.1: "Plutonian Photo Shoot"
v2.12.2: "Plutonian Photo Shoot"
v2.12.3: "Plutonian Photo Shoot"
v2.13.0: "A Midsummer Code's Dream"
v2.13.1: "A Midsummer Code's Dream"
v2.13.2: "A Midsummer Code's Dream"
v2.13.3: "A Midsummer Code's Dream"
v2.13.4: "A Midsummer Code's Dream"
v2.14.0: "Fuchsia Friday"
v2.15.0: "Autumn Arbor Airbrush"
v2.15.1: "Autumn Arbor Airbrush"
v2.15.2: "Autumn Arbor Airbrush"
v2.15.3: "Autumn Arbor Airbrush"
v2.16.0: "Midwinter Nights Trance"
v2.2.0: v2.2.1: v2.2.2: v2.3.0: "Delicious Thin Mints"
v2.3.1: "Delicious Thin Mints"
v2.3.2: "Delicious Thin Mints"
v2.4.0: "Crunchy Munchy Lunchy"
v2.4.1: "Crunchy Munchy Lunchy"
v2.5.0: "Astronaut Shoelaces"
v2.5.1: "Astronaut Shoelaces"
v2.6.0: "Pantsuit Party"
v2.7.0: "Earl of Sandwich Partition"
v2.7.1: "Earl of Sandwich Partition"
v2.8.0: "Sir Edmund Percival Hillary"
v2.8.1: "Sir Edmund Percival Hillary"
v2.8.2: "Sir Edmund Percival Hillary"
v2.9.0: "Team High Five"
v2.9.1: "Team High Five"
v2.9.2: "Team High Five"
v3.0.0: "Plethora of Penguin Pinatas"
v3.0.0.rc1: "Schneems Sleak Shoes"
v3.0.1: "Plethora of Penguin Pinatas"
v3.0.2: "Plethora of Penguin Pinatas"
v3.1.0: "El Niño Winter Wonderland"
v3.1.1: "El Niño Winter Wonderland"
v3.10.0: "Russell's Teapot"
v3.11.0: "Love Song"
v3.11.1: "Love Song"
v3.11.2: "Love Song"
v3.11.3: "Love Song"
v3.11.4: "Love Song"
v3.12.0: "Llamas in Pajamas"
v3.2.0: "Spring Is A Heliocentric Viewpoint"
v3.3.0: "Jovial Platypus"
v3.4.0: "Owl Bowl Brawl"
v3.5.0: "Amateur Raccoon Rocketry"
v3.5.1: "Amateur Raccoon Rocketry"
v3.5.2: "Amateur Raccoon Rocketry"
v3.6.0: "Sleepy Sunday Serenity"
v3.6.1: "Sleepy Sunday Serenity"
v3.6.2: "Sleepy Sunday Serenity"
v3.7.0: "Snowy Sagebrush"
v3.7.1: "Snowy Sagebrush"
v3.8.0: "Sassy Salamander"
v3.8.1: "Sassy Salamander"
v3.8.2: "Sassy Salamander"
v3.9.0: "Private Caller"
v3.9.1: "Private Caller"
```

`const.rb`からのgrepで抽出なので、（特にv2.1.1以前は）適切に抽出できていない気がする
appium + pythonでAndroidの複数アプリ切り替え

`start_activity()`でテスト中のアプリ以外を立ち上げられる
たとえば標準で入っているブラウザを立ち上げる場合

```python
    app_pack_name="com.android.browser"   
    app_activity_name="com.android.browser.BrowserActivity"
    self.driver.start_activity(app_pack_name,app_activity_name)
```

別のアプリを指定してもう一度`start_activity()`を呼べば切り替わる。



```python
self.driver.background_app(10) #10秒間バックグラウンドにする
```
で現在のアプリを指定時間バックグラウンドにする。

```python
self.driver.background_app(None)
```
で終了できるっぽい。

###参考
* [Open the native browser from an android app](https://stackoverflow.com/questions/10332868/open-the-native-browser-from-an-android-app)
* [Background App](https://appium.readthedocs.io/en/latest/en/commands/device/app/background-app/)
* [How to switch from one app to another app at run time](https://stackoverflow.com/questions/22710538/how-to-switch-from-one-app-to-another-app-at-run-time)
Swift で Java 12 の Switch Expressions っぽいものを書いてみる

きっかけは、チーム内のSlackで `325: Switch Expressions` の書き方を Swift でもできないかなーという話題が上がったので考えてみました。



# Java 12 の Switch Expressions ってなに？

Java 12 で追加予定のAPIです。

[JEP 325: Switch Expressions (Preview)](http://openjdk.java.net/jeps/325)

詳しくは上記リンクを参照してください。
簡単に言うを `switch` 構文をよくした感じのやーつです。
こんな感じで書けるそうです。

```java
String value = switch(hoge) {
  case ONE -> "わん";
  case MEW -> "にゃー";
  default -> "ほげ";
};
```



# Swift の enum だったらこう書ける

Swift の `enum` の定義でよく使われるのは、以下の書き方ではないでしょうか。

```swift
enum Hoge {
  case one, mew

  var value: String {
    switch self {
    case .one: return "わん"
    case .mew: return "にゃー"
    }
  }
}

let h: Hoge = .mew

print(h.value) // にゃー
```

この書き方は `enum` 定義の中にまとまっているので、見通しの良さや使い勝手的にもわかりやすいですよね。




# Swift で Switch Expressions っぽいものを書いてみる

では、本題です。
言語仕様自体を書き換えるのはできないので `Extension` や `Protocol` を使う方法で考えてみました。


## `RawRepresentable` の Extension で用意する

`RawRepresentable` については以下を参照してください。
https://developer.apple.com/documentation/swift/rawrepresentable

```swift
extension RawRepresentable {
  func using<U>(_ f:(Self) -> U) -> U {
    return f(self)
  }
}

enum Hoge: String {
  case one, mew
}

let h: Hoge = .mew

let value: String = h.using {
  switch $0
  case .one: return "🐕"
  case .mew: return "🐈"
  }
}

print(value)  // 🐈
```

## 専用の Protocol を用意する
```swift
protocol SwitchExpression {
  func using<U>(_ f:(Self) -> U) -> U
}

extension SwitchExpressions {
  func using<U>(f: (Self) -> U) -> U {
    return f(self)
  }
}

enum Hoge: SwitchExpressions {
  case one, mew
}

let h: Hoge = .mew

let value: String = h.using {
  switch $0
  case .one: return "🐕"
  case .mew: return "🐈"
  }
}

print(value)  // 🐈
```

## Global Function で定義してみる
```swift
func usingSwitch<T, U>(_ condition: T, f: (T) -> U) -> U {
  return f(condition)
}

enum Hoge: {
  case one, mew
}

let h: Hoge = .mew

let value: String = usingSwitch(h) {
  switch $0
  case .one: return "🐕"
  case .mew: return "🐈"
  }
}
print(value)  // 🐈
```

# まとめ

Java 12 の `Switch Expressions` ほどの良いものにはなりませんでしたね。

Swift の場合は必要に応じて `private extension Hoge {}` で書く方が **わかりやすさ・使いやすさ** の面でも良いかもしれません。


今回はあえて `switch` に絞って書いてみましたが、この関数なら `switch` 以外の書き方ができるので、これはこれで使い道のありそうな便利関数できたんじゃないかなと前向きに考えます。

とりあえず、 [dacchan/Swiftensions](https://github.com/dacchan/Swiftensions) に以下の2パターンを追加してみようと思います。

- [RawRepresentable の Extension で用意する](#rawrepresentable-の-extension-で用意する)
- [専用の Protocol を用意する](#専用の-protocol-を用意する)