OmniAICreator/Qiita-1.07M huggingface dataset:
GPUの動作ログを確認する（取得編＠spyder）


#きっかけ
きっかけは二つありまして
１．KerasでImageDataGeneratorを使い大量の画像で学習したり
　　batchサイズを大きくすると、GPUのメモリが不足して（？）計算が止まる事がある
２．Tensor coreを使うためにFP16で計算させたいが
　　GPUにFP16でデータ渡ってるの？
　　そもそもTensor core動いてるの？

というわけでGPUのログを取れないかと調べておりまして

@kuroyagi様の記事を参考に動かしてみました
https://qiita.com/kuroyagi/items/e70c55cbc88fc0ed0220

@kuroyagi様の記事は**「Jupyter」**を使用していましたが
この記事では**「spyder」**を使用しています

結論としてはログは取れるようになりましたが
ログの中身の解説は全くありません()

#確認環境
OS:Windows10Home
cuda:9.0.176
CuDNN：v7.3
python：3.6.6
spyder:3.3.1
GPU:GTX1070

#操作手順
下記手順で作業します
**１．Anaconda　Promptを起動**
　　⇒省略

**２．仮想環境を切り替え**
　　⇒省略

**３．「nvprof」でログ取得開始**
　通常のspyderの起動と異なり「nvprof」からspyderを指示して起動します
　いろいろオプションをつけて最後にspyderを表記
　（正直詳細は理解できていません・・・）

```
nvprof -o profile%p.nvvp --profile-child-processes spyder
```

**４．pythonスクリプト実行**

上記を実行すると普通にspyderが起動するので、ログを取りたいスクリプトを開き実行します。

スクリプトが走り出すと、先ほどのAnaconda　Promptに下記の表示が出ます
![image.png](https://qiita-image-store.s3.amazonaws.com/0/286585/df8064fb-6a08-fe9b-aaf0-222aac57aa50.png)
~~なんかWanningが出ていますが気にしない（笑~~

解析が終わりましたらspyderを終了させます
　**⇒普通に右上の「ｘ」です**
終了させると、ログを書き込んだ表示が出ます（下記参照）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/286585/f4d0d5e1-cb68-bfbd-0304-aadfc1ec8a4d.png)
以上でログ取得は完了です


**５．「nvvp」で表示**
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.0\bin
に**「nvvp.bat」**というファイルがあるので起動します

先ほど作成された「.nvvp」ファイルを開くと下記のような表示が出ます
![image.png](https://qiita-image-store.s3.amazonaws.com/0/286585/90e9fe9e-8bce-9c54-006b-4e3a21e74835.png)
拡大
![image.png](https://qiita-image-store.s3.amazonaws.com/0/286585/1f4f753b-b9af-1c6d-8bf5-8b0a463841c2.png)

うーむ、まったくわからない・・・
とりあえず、中身の読み方は、他の方の記事を参考にしてください
わかり次第またアップいたします
CLionでC++の開発環境を整える。（ビルドにWSL Ubuntu16.04環境使用）

アップデート

```
sudo apt update
sudo apt upgrade
```

CMakeのインストール

```
sudo apt install cmake -y
```

OpenSSHをインストール

```
sudo apt install openssh-server
```

パスワードでログインできるように変更

```
sudo vi /etc/ssh/sshd_config
```

下のように変更

```
PasswordAuthentication yes
```

再起動

```
sudo service ssh restart
```

C++のコンパイラインストール

```
sudo apt install -y g++
```

デバッガインストール

```
sudo apt install gdb
```
fetchコマンドでファイルをアップロードしたい

# はじめに

タイトル通りです。
今更書くことかな？とも思うんですが、人に教えることもたまにあるので、このページ見てーで済ませるためにも一応。

# fetch

```upload.js
// 変数fileにinput type=fileの結果でもなんでも用意しておく

const formData = new FormData();
formData.append('file', file);

fetch('/upload_saki_no_url', {
  method: 'post',
  body: formData,
})
.then(res => res.text())
.then(text => console.log(text));
```

後はサーバ側の処理と異常系の処理を煮るなり焼くなり好きに書く感じで！
それにしてもfetchコマンドは便利だなぁ。
Rails serverが起動しない時にやったこと

#はじめに
Railsチュートリアル（第4版）を進めていく過程でrails serverコマンドが起動せず躓いたため、
備忘録もかねて記述します。

#環境
* AWS Cloud9
* ruby 2.4.1p111
* Rails 5.2.1

#現象
![スクリーンショット 2018-10-20 21.26.14.png](https://qiita-image-store.s3.amazonaws.com/0/304135/f840bb0a-5155-fc7f-552c-a84192b83c32.png)

#対処法
![スクリーンショット 2018-10-20 21.35.01.png](https://qiita-image-store.s3.amazonaws.com/0/304135/35d0e7ba-0665-fb11-9abd-1d0ec4db019f.png)
GnuplotをCLIで使いたい(In Mac)


GnuplotをCLIで使いたい際、`X11`などは正直いらないです。(GUI嫌なので。)
それにX11はmacには標準ではないのでなるべく入れたくない(しかも更新が結構前で止まっておる)...
しかし、調べると大抵、`X11`か`AquaTerm`を要求されます:

> 下のAquaTermがインストールされていないことが原因なので下の通りにインストールしましょう.
> http://mashiroyuya.hatenablog.com/entry/installgnuplot

> Aquatermのインストールを最初に行わなければならないため、以下のサイトでインストールしてください。
> http://infoaisaka.hatenablog.com/entry/gnuplotinstall

> gnuplotを正常にインストールするためには「AquaTerm」が必要になります。
> https://prog-masaki.com/install-gnuplot/


こいつら入れないとgnuplotは使えない...というわけじゃないです！！！
*X11とか入れなくてもgnuplotは使えます!!*

# 結論: `set terminal`を`dumb`に設定する

`set terminal`で、描画する端末を選べるようです。
macで`brew install gunplot`としてインストールした場合、
以下のようなエラーが出ることがあると思います。

```
$ gnuplot
gnuplot>
RNING: Plotting with an 'unknown' terminal.
No output will be generated. Please select a terminal with 'set terminal'.
```

CLIで表示したい場合、以下のようにすれば良いです。
```
$ gnuplot
gnuplot> set terminal dumb
```
js efo 


# efo

## 小文字を大文字に変換する
onchange
```
function myFunction() {
    var x = document.getElementById("fname");
    x.value = x.value.toUpperCase();
}


https://www.w3schools.com/js/tryit.asp?filename=tryjs_events_onblur
```

## 項目の色変わる

onfocus
```
<script>
function myFunction(x) {
    x.style.background = "yellow";
}

https://www.w3schools.com/js/tryit.asp?filename=tryjs_events_onfocus
```

## カーソル触れる

 onkeydown   onkeypress

```
<script>
function myFunction() {
    alert("You pressed a key inside the input field");
}
</script>
</head>
<body>

<p>A function is triggered when the user is pressing a key in the input field.</p>

<input type="text" onkeydown="myFunction()">


```

## 全角に　キーアップ
onkeyup

https://www.w3schools.com/js/tryit.asp?filename=tryjs_events_onkeyup

## 苗字とかなの連動

 onkeyup & valueの掛け合わせ

```
<form>
Enter your name:
<input type="text" name="myInput" onkeyup="writeMessage()" size="20">
<input type="text" name="mySecondInput" size="20">
</form>

function writeMessage() {
    document.forms[0].mySecondInput.value = document.forms[0].myInput.value;
}

https://www.w3schools.com/js/tryit.asp?filename=tryjs_events_onkeyup2
```

##  keydown & up

```
<input
type="text" 
onkeydown="color('yellow')"
onkeyup="color('white')"
name="myInput">
</form>

https://www.w3schools.com/js/tryit.asp?filename=tryjs_events_onkeydownup
```

## カーソルを当てると変化

onmouseover

```

<h1 onmouseover="style.color='red'" onmouseout="style.color='black'">Mouse over this text</h1>
```
```
onmousedown="myFunction(this,'red')" onmouseup
```
## ヒートマップに使えそう

座標1
https://www.w3schools.com/js/tryit.asp?filename=tryjs_dom_event_clientxy

2
https://www.w3schools.com/js/tryit.asp?filename=tryjs_dom_event_screenxy

## 遷移分析に使えそう

```
 history.length;

https://www.w3schools.com/js/tryit.asp?filename=tryjs_history_length
```

## ユーザーのブラウザー分析

navigator

```
navigator.userAgent

Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36

```
puppeteer触ってみた

# puppeteerとは
Googleが開発している、NodeJSからHeadless Chrome(GUIなし)を操作できるフレームワーク。
主にスクレイピングやSPAの自動テストに用いられることが多い。

# puppeteerのインストール
```
npm install puppeteer
```


# スクレイピングしてみる
[puppeteerでスクレイピング](https://qiita.com/tomi_shinwatec/items/a68cf7840c3da002c6e0)

実際にフォームにパスワードを入力して認証を通してみる例。
公式ではasync/awaitを使ったコードが例示されているので敢えてPromise使ってみます。

```javascript

const puppeteer = require('puppeteer');

puppeteer.launch({
    //# WindowsではHeadlessモードでTimeoutしてしまう問題があるのでfalse
    headless: false, 
})
.then((browser)=>{
    browser.newPage()
    .then((page)=>{
        //ページ遷移
        page.goto('https://www.freeml.com/kimetaro/******')
        .then(resp=>{
            //フォーム入力
            page.type(
                'input[name="view_password"]',
                'xxxx')
            .then(
                //ボタンクリック
                setTimeout(()=>{
                    page.click('.ok_btn')
                },1000)
                
            )
        })
        .catch(err=>console.log(err))
    })
})
```

要素を取得してみるコード
[puppeteerでの要素の取得方法](https://qiita.com/go_sagawa/items/85f97deab7ccfdce53ea)

```js
const puppeteer = require('puppeteer');

puppeteer.launch({
    headless: false
})
.then((browser)=>{
        browser.newPage()
        .then((page)=>{
            let i=471652
            let req4=i.toString().substring(0,4)
            let req2=i.toString().substring(4,6)
            console.log(req4+'-'+req2)
            page.goto('http://www.clubdam.com/app/damStation/clubdamRanking.do?requestNo='+req4+'-'+req2)
            .then(resp=>{
                              
                page.evaluate(()=>{
                    console.log(document)
                    var title=document.querySelector('div #Rankingbattle tbody tr td a').textContent
                    var artist= document.querySelectorAll('div #Rankingbattle table.list_rankingbattle_title tr td')
                    return {
                        title:title,
                        //ページコンテンツがない場合は落ちるので事前にnull確認が必要
                        artist:artist[3].textContent
                    }
                })
                .then((result)=>{
                    console.log(result)
                })
                
            })
            .catch(err=>console.log(err))
        })
})



```
[覚書] ansible-inventoryでGCEインスタンスの情報を取得する

最近 Ansible の勉強を始めて、その検証環境として GCE インスタンスを複数作って色々と試している。
そんな中、インスタンス起動のたびに変わる IP アドレスをインベントリファイルに反映するのが面倒になり、GCE Dynamic Inventory というものを使ってみようと思った。
その時に結構苦労したので、GCE Dynamic Inventory の利用手順を覚書として記事にしてみた。

## バージョン

* Ansible: 2.7.0
* Python: 2.7.15

## 必要なパッケージ

`requests` と `google-auth` が必要。
下記のコマンドでインストールする。

```bash
pip install requests google-auth
```

## インベントリファイルを作成する

下記のようなインベントリファイルを作成する。
ただし、ファイル名は ".gcp.yml"、".gcp.yaml"、".gcp_compute.yml"、".gcp_compute.yaml" で終わる必要がある。
"\<your-*>" は環境に合わせて設定する。

```yml:*.gcp.yml
plugin: gcp_compute
zones:
  - <your-zone>
projects:
  # プロジェクト ID を指定する
  - <your-project-ID>
scopes:
  - https://www.googleapis.com/auth/compute
service_account_file: <your-service-account-file-path>
auth_kind: serviceaccount
filters:
  - <your-filters>
hostnames:
  # [ name | public_ip | private_ip ] のどれかを指定できる
  - name
```

サービスアカウントファイルは json 形式でダウンロードしておくと良い。
必要であれば、その他パラメータを追加すれば良いと思うが、私はこれ以上は試していない。

## ansible.cfg を編集する

上記のインベントリファイルを作成し、実行しただけでは gcp_compute プラグインが呼び出されない。
ここに結構ハマった。。。

Ansible の初期設定では、gcp_compute プラグインは呼び出されない設定になっている。
そこで、/etc/ansible/ansible.cfg の 300 行目付近にプラグインの設定を記述する場所がある(はずな)ので、そこのコメントを外し、gcp_compute を追記する。

```config
[inventory]
# enable inventory plugins, default: 'host_list', 'script', 'yaml', 'ini'
enable_plugins = gcp_compute, host_list, virtualbox, yaml, constructed
```

## `ansible-inventory -i <your-file-name>.gcp.yml --list` を実行する

見出しの通り、`ansible-inventory -i <your-file-name>.gcp.yml --list` を実行すれば、起動している GCE インスタンスから情報を取得することができる。
ただし、すべての情報が取得されるので、必要な情報を見つけるのがこれまた面倒である。

`ansible-inventory -i <your-file-name>.gcp.yml --graph` のようにオプションを `--graph` にするとホスト名かIPアドレスのどちらかを取得できる。
なんか惜しいので、`jq` 使って `host-name, IP address` みたいな感じで IP アドレスだけ抜き出したい。

(追記：2018/10/20)
下記のコマンドで出力結果をインベントリファイルにコピペするだけで良くなったかな。
もっと良い方法があると思うけど。。。

```bash
ansible-inventory -i <file-name>.gcp.yml --list \
| jq -c '._meta.hostvars[] | { (.name): .networkInterfaces[0].accessConfigs[0].natIP }' \
| sed -r -e 's/\{(.+)\}/\1/g' -e 's/"//g' -e 's/(.+):(.+)/\1 ansible_host=\2/g'

# 出力例
host1 ansible_host=192.168.1.1
host2 ansible_host=192.168.1.2
```
日付や時間を一瞬で入力する2つの方法

ファイル名や記事に今のタイムスタンプを入力したいときに「2018/10/20」なんて手動で打つ必要はないです。

# Google IME を使う
「きょう」と「いま」の変換で4種類ほど変換できます。

![Fullscreen_2018_10_20_20_53.png](https://qiita-image-store.s3.amazonaws.com/0/283120/4e2f262d-baa3-ca83-4092-1a5ad7216564.png)


# moment-cli を使う
もう少しカスタマイズしたフォーマットを使いたい人はこちら。

[cpsubrian/node\-moment\-cli: CLI for printing dates via momentjs\.](https://github.com/cpsubrian/node-moment-cli)

```sh
npm install -g moment-cli
```

使い方

```sh
$ moment -f "YYYY-MM-DD"
2018-10-20

$ moment -f "YYYY-MM-DD HH:mm:ss"
2018-10-20 20:59:35

$ # クリップボードにコピー
$ moment -f "YYYY-MM-DD HH:mm:ss" |pbcopy
$ alias -g C='| pbcopy'
$ moment -f "H時" C
```
java1.8新機能

# Interface拡張

*インターフェース内部のstaticメソッド 


	interface DemoStatic {
		static void outputInfo () {
			System.out.println("this is demo 'static' ");
		}
	}

*インターフェース内部のdefauleメソッド 

	
	interface DemoDefault{
		default void fun() {
			System.out.println("this is demo 'default'");
		}
	}

*利用 
	
	class DemoClass implements DemoDefault {
	
	}
	
	public class DemoInterface {
	
		public static void main(String[] args) {
			//1 static
			DemoStatic.outputInfo();
			//2 default
			DemoDefault demoClass = new DemoClass();
			demoClass.fun();
	
		}
	
	}

実行結果

	this is demo 'static' 
	this is demo 'default'

# lambda 

*インターフェース

	interface IDemoLambda {
		void print();
	}

*コールバック関数

	private static void func1(IDemoLambda1 iDemoLambda) {
		iDemoLambda.print();
	}

*コールバック関数
	
	public class DemoLambda {
	
		public static void main(String[] args) {
			//inner class の実現
			func(new IDemoLambda() {
	
				@Override
				public void print() {
					System.out.println("before java 1.8 innerclass");
				}
			});
		//Lambda の実現
		func1(() -> {
			System.out.println("after java 1.8 lambda");
		});
		}
	}


*lambda (a,b)-> a+b //計算式

	interface IDemoLambda3 {
		int add (int a , int b);
	}

		func3((a,b)->a+b);

	private static void func3(IDemoLambda3 iDemoLambda3) {
		System.out.println(iDemoLambda3.add(20, 30));
	}

[ソースコード](https://github.com/YanHengGo/java/tree/master/06_DemoJava_1_8)
【iphoneX対応】Native画面からWebViewに戻ったときの挙動についての対策をまとめてみた。

## どうして書いたか
![autodraw 2018_10_19 14_31_38.png](https://qiita-image-store.s3.amazonaws.com/0/134845/ffe6bad9-a260-382a-cdec-97a48a17575e.png)

上の画像のようなほぼWebViewメインのアプリで途中で強制横表示のNative画面を開く必要があり、次に進んだ際にiphoneXだとレイアウトが崩れる現象が厄介すぎたので記録をと思い書いてみました。

## なぜ対策が必要なのか
https://qiita.com/keeey/items/c175bd8ef12ee65ac3fc
↑の記事にもありますが、iphoneX(iOS11〜)よりノッチ部分やHomeIndicator（黒いバーみたいなの）部分の幅を合わせるためにWebViewの場合、CSSに`padding-top:content(safe-area-inset-top)`のような指定をする必要があります。

もちろんその値は端末の向きにより決定されるので、端末が縦だったら`top`に値が入ってきますし、横画面だったら`top`は値が入らず`0`が設定されます。

では横の画面表示のまま縦表示が前提の上記の`padding-top:content(safe-area-inset-top)`を読み込んだらどうなるでしょう。

答えは`0`が入っているのでiphoneXのノッチにHTMLの上の部分がかぶる形になってしまい、見事にバグとなります^^

ちなみに遷移してWebView側で次の画面へと更新をしている場合についてはラッキーなことに対策は不要です。
（原因は不明ですが次の画面へと更新したタイミングで縦表示と端末側が判断しているのでしょうか）

端末の種類、方向によっての各値は以下の記事で説明がありますので参考にどうぞ。
> https://qiita.com/usagimaru/items/761e9a5f3d78b1939df8

## 前提
- Native -> WebViewのタイミングでWeb側のJSを実行している
- 遷移したタイミングでそのページ自体を更新できない制約がある

## 対策
というわけでこのバグに対して対策を考えて実行してみました。同じような事象が起きた方の参考になればと思います。

ポイントとしてはどちら（WebView、Native）にどのタイミング（更新前、更新後）で処理を任せるのかということです。

### 1. 戻る前にNativeで強制的に画面を回転させて戻させて値を更新
これは単純に戻す前に画面の向きを縦向きに変更してからWebView側に渡す方法です。

Native画面の向き変更ですが、iOS6からiOS8にかけて変更方法が少々難しくなったようです。
下記URLを参考に実装をしてみました。
> https://qiita.com/nomadmonad/items/e09639e0b31812e28d6d

### 結果
おそらく時間をかけたらできるのかもしれませんが、そこまでNativeの知識があるわけではないのですぐにはできず、再検討ということに。学習コストかかるし、何してるか理解してないと更にバグを生み出すことになるのでもう少し簡単な方法がないか再検討。

### 2. 戻ったタイミングでNativeでWebView画面を更新する
``` javascript
location.reload();
```

そもそもなぜ進んだタイミングで画面が縦向きで更新されないのか疑問で仕方なかったのですが、Native処理終了のタイミングでWebView側を更新してあげると、正常にCSSが読み込まれることを確認できました。

### 結果
今回のアプリの仕様的に画面の再読込が許されていない（システムエラーとなる）のでこの方法は断念。。。
> 仕様だから仕方ないね。。。


### 3. 戻ったタイミングでWebView側でCSSの更新をする
``` javascript
$('hoge').css('padding-top','44px');
```
> ※jQueryが使えるPJで良かった。。。

これもWebView側に任せる処理となります。Native側でWebViewのJSを実行し特定のCSSクラスに`padding`をつけてあげるという方法。これなら戻ったタイミングでCSSをつけて解決できそうです。

### 結果
ですが、iphoneX以外の端末でも同じように空間が空いてしまうので断念。もちろんNative側で端末を判定してT/F値をWebView側に一緒に送信してあげればできますが、元々のJS部分の構造を変更することになるので今回は断念。

### 4. 戻ったタイミングでWebView側で画面の更新を行う
``` objective-c
[webView reload];
```
参考サイト
> http://niwatako.info/20120913/article1119.html

### 結果
WebViewをreloadすることによって縦画面の値(safe-area-inset)を取得することができました。
多少もたつきはありますが、とりあえずはUIを崩さずに再表示可能になりました。

## まとめ
最終的に4のNative側のコードでWebView側を更新してあげるという結果になりました。プラン1のNative側の回転処理で解決できるのが一番良かったのかもしれませんが、解決できたとしても画面が予期せぬ動きになる可能性もあるので今回は無難な解決法を選択しました。Nativeに自身のある方はぜひとも1のプランで解決をしてほしい限りです。

## 参考情報
http://blog-e.uosoft.net/entry/20090515/1242315011
http://niwatako.info/20120913/article1119.html
https://qiita.com/nomadmonad/items/e09639e0b31812e28d6d
https://qiita.com/keeey/items/c175bd8ef12ee65ac3fc
Scratch2018Tokyoに行ってきました。

# Scratch2018Tokyo?
日本で初めて開催される[Scratch](https://scratch.mit.edu/)のカンファレンスです。

# ミッチさんの講演
最初はScratchの父である[ミッチェル・レズニック](https://twitter.com/mres)さん（以下ミッチさん）の講演でした。

生のミッチさんを見られてテンションめちゃくちゃ上がりました。

ミッチさんはLLKやScratch3.0のことについて講演されていました。

## LLK（Life Long Kindergarten）
<img width="256" alt="IMG_12C1917ADC9F-1.jpeg" src="https://qiita-image-store.s3.amazonaws.com/0/154299/bb0040e1-6d16-afef-a90a-a3e8ec3754fa.jpeg">

普段小学校や中学校では机に座り黒板（あるいはホワイトボード）を見て先生の指示に従い教科書を読んで...

このような学習方法より遊びながら学んだほうが良い。

幼稚園(Kindergarten)では園児たちがブロックなどで遊び、創造ながら様々なものを学習していきます。

LLKはLife Long Kindergarten。
つまり人生を幼稚園のように遊び、創造しながら学習していくという意味です。

## Scratch3.0
なんとこれはミッチさん自らScratch3.0のデモを見せてくれました。
<img width="256" alt="IMG_1262D689E0BA-1.jpeg" src="https://qiita-image-store.s3.amazonaws.com/0/154299/e9687aaa-7d94-5b6d-1607-38b4badb3db1.jpeg">

まずScratch3.0を開発している理由について、Scratchを最新の技術であらゆるデバイスに対応させるためらしいです。

他にはmicro:bitなどのエクステンションについての説明をされていました。

# 村井純先生の講演
生のミッチさんの次は生の村井純先生！

村井純先生はインターネットの父とも呼ばれています。

インターネットの歴史やインターネットとScratchなどを説明されていました。

# 鵜飼佑さん、ミッチさん、村井純先生のパネルディスカッション
鵜飼佑さん、ミッチさん、村井純先生によるパネルディスカッションです。

来場した人たちが質問をして鵜飼佑さん、ミッチさん、村井純先生がそれを回答したりしました。

# その他
3つの講演とディスカッションをあとはワークショップやデモ・ポスター、ショートプレゼンテーションなどが行われました。

# 最後に
今日は憧れの人たちの講演やディスカッション、プレゼンテーションを生で見られてすごく有意義な一日でした。

そして、なによりもapple502jさんというScratchのコミュニティーでよく話をしていた人とyuki384さんと話せたことが一番楽しかったです。

みなさんお疲れ様でした。
yieldのメリットを解説する

# はじめに
コードに使った`yield`について解説を求められたが、その場で上手く説明できなかったのでここでまとめる。
一応Pythonを念頭に置くが、C#だろうがRubyだろうが(構文は多少変わるが)本質の部分は同じである。

# yieldを使うと何が起こるのか？
例えばreturnで実装した場合

```python:
>>> def foo():
...   return ['foo', 'foo']
...
>>> foo()
['foo', 'foo']
```

foo()を呼び出すことで配列を得ることができた。この挙動は予想通りだろう。
これをyieldで実装しなおすと、こうなる。

```python:
>>> def bar():
...   yield 'bar'
...   yield 'bar'
...
>>> bar()
<generator object bar at 0x7f519e452840>
```

returnで実装されたfoo()と異なり、bar()を実行するとgeneratorという謎のオブジェクトが返ってきた。foo()と同じように配列を得るためには、list()という、引数に与えられたものを配列にするための組み込み関数を使用しなければならない。

```python:
>>> list(bar())
['bar', 'bar']
```

これだけだと同じ実行結果を得るための手間が増えただけのように見える。ではyieldで実装すると何が嬉しいか？それを理解するには「遅延評価」について知らなければならない。


# 先行評価 vs 遅延評価
「評価」とはコードを実行して結果を得ることである。
再度`return`と`yield`でコードを書き分けて、実行結果の違いを示す。

```python:
>>> def foo():
...   buffer = []
...   for i in range(2):
...     print('配列に要素を追加します')
...     buffer.append('foo')
...   return buffer
...
>>> def main():
...   for x in foo():
...     print('ループが回りました')
...
>>> main(foo)
配列に要素を追加します
配列に要素を追加します
ループが回りました
ループが回りました
```

`return`で実装すると「foo()全体を評価した後main()に処理が戻る」というおなじみの結果になった。このような評価の仕方を「先行評価」と呼ぶ。

```python
>>> def bar():
...   for i in range(2):
...     print('配列に要素を追加します')
...     yield 'bar'
...
>>> def main():
...   for x in bar():
...     print('ループが回りました')
...
>>> main(bar)
配列に要素を追加します
ループが回りました
配列に要素を追加します
ループが回りました
```

一方`yield`で実装すると「`yield`に到達したら実行を途中でやめてmain()に一度処理を戻す」という動きをする。言い換えれば「main()から要求されるまで続きを評価しない」という実装になっている。このような評価の仕方は「遅延評価」と呼ぶ。

# 遅延評価が活きるポイント
## 重い処理がある場合
処理の一部が極端に重いので実行回数をなるべく少なくしたいことがある。
実行回数が事前に分からない場合、遅延評価で実装することによって回数を少なくすることができる。

```python:
from time import sleep
from itertools import islice

def very_heavy(s):
  # 3の倍数の時だけすごい重くなる
  if s % 3 == 0:
    sleep(s)
  return s

# 先行評価だと、全部評価してしまい非効率
def get_result():
  buffer = []
  for i in range(10):
    buffer.append(very_heavy(i))
  return buffer

# 遅延評価なら必要なだけしか評価されない
def get_lazy_result():
  for i in range(10):
    yield very_heavy(i)

get_result()[:5] # 実行時間は常に18秒
list(islice(get_lazy_result(),5)) # 実行時間は3秒
```

## 無限リストの作成
例えば以下のコードは、無限に1を返し続ける。

```python:
def infinite_one():
  while True:
    yield 1
```

これを応用すると「何かの一覧(事前に件数は分からない)」を簡単に作成することができる。
例えばスクレイピングに応用すると、Googleのようにページングされたサイトであっても簡単に結果の一覧を取得することができる。もちろん遅延評価なので、「上位10件だけ取得したい」という時に無駄なページ遷移は発生しない。
![WS000000.JPG](https://qiita-image-store.s3.amazonaws.com/0/150087/2dbfcd71-2bd5-ffc4-d03b-6f2e64c4eea0.jpeg)

```python:
def get_search_results():
  while True:
    # GoogleのPC検索結果画面はタイトルをh2でマークアップしている
    for h2_tag in get_h2_tags():
      yield h2_tag
    # 次のページがなくなるまで検索結果を取得し続ける
    if not move_to_next_page():
      break
```

## 再帰的な呼び出し
`yield`を使用すると再帰呼び出しを簡潔に書くことができる場合がある。

```python:
import os
import os.path

def recursive_find_files(path):
  for x in os.listdir(path):
    join_path = os.path.join(path, x)
    if os.path.isdir(join_path):
      yield from recursive_find_files(join_path)
    else:
      yield join_path
```
Go言語をUbuntuに導入する

#GO言語をインストールするよ
###1.バイナリファイルをダウンロード・展開します。
[ここから](https://golang.org/dl/)ダウンロードします。
ダウンロードすると[ここに](https://golang.org/doc/install?download=go1.11.1.linux-amd64.tar.gz)ページが遷移するので、以下はこのページの指示通り行います。
ダウンロードした場所に移動して解凍しますよ。

```
$ sudo tar -C /usr/local -xzf go1.11.1.linux-amd64.tar.gz
```
今回は/usr/local以下に展開するのでsudoしないとだめです。
すると/usr/local/goというフォルダが作成されます。

###2.PATHを通す。
新しい言語をインストールしていたらそうなりますね。
マニュアル通りするならば、

```
export PATH=$PATH:/usr/local/go/bin
```
とするが、私は.profileに記述します。

```
export GO_HOME=/usr/local/go
export PATH=$PATH:$GO_HOME/bin
```
まあ個人の好みです。
以下のコマンドを入力してgoコマンドの使い方が端末に表示されたら成功です。

```
$ go
```

###3.試す
####ワークスペースを作る。
ワークスペース、作業する場所を作る。

```
$ cd ~/
$ mkdir go
$ cd go
$ mkdir src
$ cd src
$ mkdir hello
```
####hello worldする。
helloフォルダ内にhello.goファイルを作成する。
あ、vim使います。

```
$ cd hello
$ vim hello.go
```
こんな感じのコードを書けとgolang公式はおっしゃっております。

```
package main

import "fmt"

func main(){
        fmt.Printf("hello, world\n")
}
```
フォルダ名はhelloなのでpackageはmainでいいんですかね・・・？
プログラミングやったことがある人はわかると思います。

ビルドします。
```
$ go build 
```
すると、hello.goのほかにhelloができてますね。
このファイルを実行にはシェルスクリプトを実行するのと同じようにするんですね。

```
$ ./hello
hello, world
```
良かったです。

###感想
まだまだ最初ですからね。どんどん触ってきます。
IDEが必要ない手軽さを求めた言語ということで、ちょっとしたツール開発には使えそうですね。
vimで拡張子毎にコメントアウトをするショートカット

# 目的

[2019/12/24　インデントと共に設定できるように変更・見やすくした]
[2018/10/22　他のキーマップと被っていて不便だったので修正しました]
[2019/3/12　複数の言語に対応させました]

最近，vimを使ってC++のソースコードを編集する機会が多い．

試行錯誤する際に便利なのが"yy"で1行ヤンクして"p"でコピーして別パターンを試す流れである．

その時に1行まるごとコメントアウトをするのだが，この動作をすることが多いため，簡単にできないかと思い，無理やりショートカットを作成した．

    Ctrl+i : コメントアウト
    Ctrl+s : アンコメントアウト（実際には先頭文字を消去する動作）

## ショートカットの作成

~/.vimrc に以下を記述．

```.vimrc(追加分)
nnoremap <C-i> 0i//<Esc>
nnoremap <C-s> 0xx
```

## 使った感想

普段だったらインサートモードにして"//"を挿入してEscでノーマルモードにしていたのだが，そこがひとまとまりの動作になったのでとても便利であった．

しかし，この設定ではC++のみにしか対応できず，他の言語を用いる場合にはvimrcを書き換える必要があり，不便である．そこで，ファイルの拡張子によって分岐させる方法でキーマップを設定した．

## 複数言語に対して対応するように変更したもの
普段はC++とPythonとTexしか使っていないのだが，ついでに他の言語に対しても設定を作成した．

```.vimrc(追加分)
if has("autocmd")
	filetype plugin indent on
	autocmd FileType c           setlocal sw=2 sts=2 ts=2 noexpandtab
	autocmd FileType c           nnoremap <buffer> <C-i> <Home>i//<Esc>
	autocmd FileType c           nnoremap <buffer> <C-f> <Home>"_x"_x<Esc>
	autocmd FileType c           nnoremap <buffer> <C-b> :make
	autocmd FileType c           nnoremap <buffer> <C-e> :make run

	autocmd FileType cpp         setlocal sw=2 sts=2 ts=2 noexpandtab
	autocmd FileType cpp         nnoremap <buffer> <C-i> <Home>i//<Esc>
	autocmd FileType cpp         nnoremap <buffer> <C-f> <Home>"_x"_x<Esc>
	autocmd FileType cpp         nnoremap <buffer> <C-b> :make
	autocmd FileType cpp         nnoremap <buffer> <C-e> :make run

	autocmd FileType python      setlocal sw=2 sts=2 ts=2 noexpandtab
	autocmd FileType python      nnoremap <buffer> <C-i> <Home>i#<Esc>
	autocmd FileType python      nnoremap <buffer> <C-f> <Home>"_x<Esc>
	autocmd FileType python      nnoremap <buffer> <C-e> :terminal python3 %

	autocmd FileType html        setlocal sw=2 sts=2 ts=2 noexpandtab
	autocmd FileType html        nnoremap <buffer> <C-i> <End>a--><Esc><Home>i<!--<Esc>
	autocmd FileType html        nnoremap <buffer> <C-f> <End>xxx<Esc><Home>xxxx<Esc>

	autocmd FileType ruby        setlocal sw=2 sts=2 ts=2 noexpandtab
	autocmd FileType js          setlocal sw=2 sts=2 ts=2 noexpandtab
	autocmd FileType javasctipt  nnoremap <buffer> <C-i> <Home>i//<Esc>
	autocmd FileType javasctipt  nnoremap <buffer> <C-f> <Home>xx<Esc>
	autocmd FileType zsh         setlocal sw=2 sts=2 ts=2 noexpandtab

	autocmd FileType scala       setlocal sw=2 sts=2 ts=2 noexpandtab
	autocmd FileType json        setlocal sw=2 sts=2 ts=2 noexpandtab

	autocmd FileType css         setlocal sw=2 sts=2 ts=2 noexpandtab
	autocmd FileType css         nnoremap <buffer> <C-i> <End>a*/<Esc><Home>i/*<Esc>
	autocmd FileType css         nnoremap <buffer> <C-f> <End>xx<Esc><Home>xx<Esc>

	autocmd FileType scss        setlocal sw=2 sts=2 ts=2 noexpandtab
	autocmd FileType sass        setlocal sw=2 sts=2 ts=2 noexpandtab

	autocmd FileType sh          nnoremap <buffer> <C-i> <Home>i#<Esc>
	autocmd FileType sh          nnoremap <buffer> <C-f> <Home>x<Esc>
endif
```
【Ruby】基本：ファイルの実行、配列、ハッシュ

**********************************
【追記】
2018/10/22　配列の定義方法
**********************************

#■rubyファイルの実行
「test.rb」ファイルを実行する場合、下記コマンドで実行可能。

```
$ruby test.rb
```

#■配列の書き方

```
fruits = ['アップル', 'オレンジ', 'キウイ']

fruits.each do |fruit|
  puts fruit
end
```

※要素が全て文字列の場合は、**「%記法」**のほうが便利でメモリ消費も少ない
 (Drumatoさんのコメントより追記)

```
before = ["apple", "banana"] #ダブルクォートで括らないと行けない上にカンマも書かなければならない
after = %w(apple banana) #スペースで要素を区切れて見やすい
```

#■ハッシュ
```
1.
fruits = {
  'apple' => 'リンゴ',
  'banana' => 'バナナ',
  'orange' => 'オレンジ',
}
```

```
2.
fruits = {
  :apple => 'リンゴ',
  :banana => 'バナナ',
  :orange => 'オレンジ',
}
```

```
3.
fruits = {
  apple: 'リンゴ',
  banana: 'バナナ',
  orange: 'オレンジ',
}
```

#■コメントアウト
**「#」**をつける。

```
#この部分はメモ
puts "test"
```

#■インデント
半角スペース2つが基本

#■文字列リテラル
' (シングルクォーテーション) か " (ダブルクォーテーション)

" (ダブルクォーテーション)→バックスラッシュ記法と式展開が有効
###・バックスラッシュ記法
文字列中でバックスラッシュ(環境によっては￥記号で表示されます)の後に記述する文字によっては特別な意味を持たせる事ができます。

###・式展開
ダブルクォート(")で囲まれた文字列式、コマンド文 字列および正規表現の中では#{式}という形式で式 の内容(を文字列化したもの)を埋め込むことができます。

#■シンボル
: から始めるとシンボルになる。
見やすいpwd

pwdが見にくいのでaliasで使う用。zshとbashでは動くことは確認した。

```shell
echo && c=`pwd` && ds=() && d=" " && while [ "$c" != "/" ]; do ds=(`basename $c` ${ds[@]}) && c=`dirname $c`; done && if [ ${#ds[@]} -eq 0 ]; then echo ${d}"/"; else for dir in ${ds[@]}; do echo "${d}"/${dir} && d="${d} "; done; fi && echo
```

こうなる

```shell
% for i in {1..30}; do mkdir $i && cd $i; done # 30階層作って最下層に移動する
% pwd # 普通のpwd
/Users/ito_masakuni/Desktop/works/tmp/test/1/2/3/4/5/6/7/8/9/10/11/12/13/14/15/16/17/18/19/20/21/22/23/24/25/26/27/28/29/30
% alias p='echo && c=`pwd` && ds=() && d=" " && while [ "$c" != "/" ]; do ds=(`basename $c` ${ds[@]}) && c=`dirname $c`; done && if [ ${#ds[@]} -eq 0 ]; then echo ${d}"/"; else for dir in ${ds[@]}; do echo "${d}"/${dir} && d="${d} "; done; fi && echo'
% p

 /Users
  /ito_masakuni
   /Desktop
    /works
     /tmp
      /test
       /1
        /2
         /3
          /4
           /5
            /6
             /7
              /8
               /9
                /10
                 /11
                  /12
                   /13
                    /14
                     /15
                      /16
                       /17
                        /18
                         /19
                          /20
                           /21
                            /22
                             /23
                              /24
                               /25
                                /26
                                 /27
                                  /28
                                   /29
                                    /30
```
amdgpu-pro 18.30 ドライバで GPU の clock 設定や powerlimit する(VEGA56 で CryptonightV8 1500 H/s @ 120W)

漢なら VEGA をアンダーボルティングや powerlimit して低消費電力で安定運用したいですね!

やりましょう!

ROCm はまだっぽい? ですが, amdgpu-pro 18.30 から GPU clock や voltage の制御, nvidia-smi のようにワット指定で powerlimit ができるようになりました.

Cast-XMR の説明と, 付属の設定スクリプトが役に立ちます.

http://www.gandalph3000.com/cast_xmr/cast-xmr-cryptonight-miner-for-rx-vega-update150/

http://www.gandalph3000.com/cast_xmr/linux/linux_version_of_cast-xmr-cryptonight-monero-miner-for-rx-vega-gpus/

120W に powerlimit で VEGA56 で CryptonightV8 1500 H/s でました.

<blockquote class="twitter-tweet" data-lang="en"><p lang="ja" dir="ltr">amdgpu pro 18.30 + Ubuntu 16.04 + VEGA56 112W powerlimit で CryptonightV8 1600 H/s 出ました(gpufan 180 で GPU 温度 47 度台(室温 27 度)). memclock はあまり関係無い模様. ありがとうございます <a href="https://t.co/ZbgQrSdTUM">pic.twitter.com/ZbgQrSdTUM</a></p>&mdash; Syoyo Fujita ⚡️ No ray tracing No life (@syoyo) <a href="https://twitter.com/syoyo/status/1053326330509459457?ref_src=twsrc%5Etfw">October 19, 2018</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

また, RX580 でも powerlimit ができるのを確認しました.
PostgreSQLに接続しようとしたらエラーが出た

Railsの勉強するのにWEBアプリケーションを作成しようとした。最終的にHerokuへデプロイするのでDBをPostgreSQLに設定しようとしたときに躓いた話。

### 環境
OS:windows10
ただし開発はWindows Subsystem for Linux（Ubuntu 16.04.5）

## エラー
ローカル環境にPostgreSQL環境を構築しようとした際に出てきたエラー。Rails sすると出てくる。

```
could not connect to server: No such file or directory Is the server running locally and accepting connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?
```

google翻訳で和訳してみる
>サーバーに接続できませんでした：そのようなファイルまたはディレクトリはありませんサーバーはローカルで実行されており、Unixドメインソケット "/var/run/postgresql/.s.PGSQL.5432"で接続を受け入れていますか？

エラーコードでぐぐってみると、PATHが原因とか/var/run/postgresql/の設定が違うとかいろいろ出てきた。たぶん検索した内容の方が正解なのだろうけど、駆け出しエンジニアには厳しい内容だと感じた。ただでさえなれないCUI環境でファイルの編集とか厳しいっす。もっと簡単に解決できないか試行錯誤していたら解決策を発見した。

## 対策

database.ymlのdevelopmentを以下のように編集する。

```database.yml
(省略)

development:
  <<: *default
  database: データベース名
  host: localhost
  port: 5432

(省略)
```

たったこれだけ。hostをlocalhostに指定し、portを5432に指定しただけ。ね、簡単でしょ？

本来だとPostgreSQLの方で設定するべきなのだろうけど、勉強中のひとやPC慣れしていない人にとってはこれでいいのではないかと。
あとから勉強してこの記述が不要になるようにしたいところ。
【ExcelVBA】病院事務を改善したときのメモ

:::note info
おしらせ 2024/09/16
たまにいいねがついたりするので、Webアプリ化する予定です　→完成

- [昔つくった病院事務VBAのWeb版をつくろう！](https://qiita.com/YoshitakaOkada/items/6e33c54cb7def867482a)
:::

# はじめに
大阪のでかい病院に勤めていた女友達に業務改善を提案したことがある（いまはWebデザイナーらしいけど...:thinking:）。昔にやったことなので当時の資料をつかってサクッとまとめる。病院事務といいながらかなり汎用性のある業務内容だ。

```text:2015/04/09-16時14分
おつかれさまです。
先日お話ししていた件です。

添付の、”請求者名簿”に入力したデータを、
”事務処理簿”にも自動で反映させたいというものです。

また、備考欄に”退院”または”棄権”の文字列が入力された場合のみ、
その行の書式を、例えばフォントを赤色にしたり、とかをやりたいんです。
```

# 入院してても選挙やりたいニーズがある
いわゆる不在者投票ってやつね。病棟からわんさかやってくるらしい。僕は半月ぐらいの入院までしか経験ないけど、ずっと入院してるひととかはたしかに選挙が楽しみなのかもしれない。あー、入院中のごはんおいしかったな～。一人暮らしのごはんってパターン化したりして粗末になるからなぁ:joy:
![image.png](https://qiita-image-store.s3.amazonaws.com/0/94562/831f5fc2-fb72-52a9-fee8-146f99c8d974.png)
よくありそうよね。こういう名簿:point_down:
白紙版をプリントアウトして、選挙したい人を手書きで記入したものがFAXで戻ってくる、と。ほんとはこんなのハッシュタグでもつけてバーコードでピッピってやれればいいんだけどね。それにしても日本の商業界におけるFAXの存在感は異常。データにも残らんし...
![image.png](https://qiita-image-store.s3.amazonaws.com/0/94562/91a14d14-085d-9242-b9c1-e7f8d24559dc.png)


# 一度行政に届け出る
さてここで最初の鬼入力が待ってる。病棟別のリストを市区別のリストに並び替えするわけ。行政はそのエリア管轄に住居を構える人しか相手にしないからね。あるよな～。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/94562/7f939046-4a42-d678-bd55-cd7f1093be6d.png)

# 投票用紙を受取る
紙ですよねー...
![image.png](https://qiita-image-store.s3.amazonaws.com/0/94562/9392c9cd-3d95-629b-a83c-d31befbc4dc4.png)

# 投票用紙に記入してもらい、事務処理簿に取りまとめる
当然紙だよね...。これも居酒屋のタッチパネルでいいよね。
目が見えない人はどうするって？...うーん
目が見えない人はいままで選挙してきたのかなぁ
![image.png](https://qiita-image-store.s3.amazonaws.com/0/94562/a135ad36-0bc3-1ab9-c8c1-82ef2ecaa7cc.png)
このファイルは市区別や病棟別にシートが作られている
![image.png](https://qiita-image-store.s3.amazonaws.com/0/94562/2305a37e-cf21-e786-e2c6-79635218b9f0.png)

# 提案
集めたリストは病棟別だし、行政に提出するには市区別だし、事務処理簿にまとめないとあとで振り返られなくなるし、とそれらをすべてハンドコピー（コピペ）でやっていた。それでは業務量は3倍にも4倍にもなり、当然ヒューマンエラーも起きるわけだ。ならば、それらのファイルが持っている項目を集めた、ただひとつだけの入力用ファイルを作って、それぞれの提出書類には自動転記される仕組みがあれば、少なくとも転記におけるヒューマンエラーは起きない。人間が注力すべきはたったひとつだけのファイルだ。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/94562/6c3bce59-7604-457e-3cb5-2f7552dac861.png)

# 成果物
結局こういうのを作りました。たしか6時間ぐらいだったような気がする。病院でも話題になったみたい。こういう野生の案件で収益化できればいいんだけどなぁ
![image.png](https://qiita-image-store.s3.amazonaws.com/0/94562/071a36f3-bb66-eb0e-b7ae-1fe810bd8ce8.png)

# ソース
う～ん、ソースを乗っけようと思ったんだけど結構決め打ちがあったりでいまいち汎用性もないなぁ今見ると。どうしても特定のシートがあること、とかが前提になっちゃうし...ということで問い合わせがあったら相談には乗りますよってことにします

# 大事なこと
いいですか？この記事では、入口に資格やらなんやらの障壁があるだけで、一生懸命フラッグシップな業界・企業に入っても、結局ひとつひとつの仕事自体は実は誰でもできるってものが多いってのを読み取ることが重要なんですよ。そしてそうした仕事の多くはAIの大好物です。そうした仕事から解放されたとき、あなたに残る価値はなんですか？
GASまわりのお勉強3


他にやるべきことがある気がするけど調べてしまう。。

## モジュール機能

TypeScriptのコンパイルだけでBrowserifyを使わずにモジュールファイルを結合したIsomorphicなNPMのパッケージを作る - falsandtruのメモ帳
http://falsandtru.hatenablog.com/entry/transpile-into-isomorphic-typescript-bundle-module-file-without-browserify


    $ tsc -t es5 -m amd --moduleResolution node --outFile bundle.js mylib.ts src/a.ts src/b.ts

## Typescript

TypeScript プログラミング - モジュール - 外部モジュール
https://docs.solab.jp/typescript/module/external/

* モジュール解決
    * Node
    * Classic
* option
    * m
        * amd
            * ブラウザ
        * common
            * nodeコマンドなど

## npm

npm-scripts で Web フロントエンド開発を管理する – アカベコマイリ
http://akabeko.me/blog/2016/10/npm-scripts-web-front-end-development/

`npm-run-all`で組みあわせられる

## claspからのデプロイ

gmailアドオンのプロパティをmanifestから除去してビルドしたら通った
ブランチを分けようかな。。

jqコマンドでGeoJSONから特定のプロパティを削除する - Qiita
https://qiita.com/_shimizu/items/4b279eaa041387e2d9b7

`clasp run --dev test`を使うと、画面でAPI許可していなくても、
マニュフェストで許可したデプロイが最新なら実行できる？

## バージョン周り

Clasp deploy doesn't update the deployed version with Google Apps Script Web App · Issue #63 · https://github.com/google/clasp/issues/63

	claspでdeployしてもバージョンがあがらない問題

* versionをつかったら、取得ではなくてバージョンが作成されるのね
* versionsでバージョンの一覧を確認できる
* deploymentsとversionsは違う
* `clasp deployments`を使うとdeployした内容が確認できる、ここにデプロイメントidも含まれる
* エディタのウェブ公開のバージョンとは別にデプロイは管理されているみたい
* デプロイと同じものを示しているっぽいから”マニュフェストから配置”を見たほうがよさそう
* redeployとかversionとかの意義がよくわからん
* `clasp run`は実行APIのcurrentを実行するのだが、これはclaspでは変更できなさそう
* "マニュフェストから配置"のopeplatformが実行APIで、
	ウェブアプリとして公開がwebappとしてデプロイのバージョンになってる
* 画面からウェブアプリの公開を無効にしてもclaspで有効にしたデプロイは生きていて、公開もされたままになる
* アプリ側で最新の開発バージョンではなく、任意のデプロイバージョンを参照させたいので、APIにしてみたが微妙。。

awkコマンドの基本 - Qiita
https://qiita.com/yamazon/items/563af1b485ff413d381f

## GASのDB連携

Cloud SQLつかってみたいかな

Google Spreadsheet JDBCを活用したDBとの連携 [Google Apps Script] – Web Marketing and Programming
https://www.wmapst.net/google/gss/20170319-google-spreadsheet-jdbc-db-cooperation-google-apps-script/

JDBC  |  Apps Script  |  Google Developers
https://developers.google.com/apps-script/guides/jdbc

Cloud SQL - MySQL および PostgreSQL リレーショナル データベース サービス  |  Cloud SQL  |  Google Cloud
https://cloud.google.com/sql/
Torque ジョブマネージャを Ubuntu 16.04 にインストールする

ちょっとした HPC 系ミニクラスタでジョブを走らせたいですね!

HPC 系だと Docker を使ってコンテナベースでジョブスケジューリングさせるとかが難しいので, 伝統的なバッチキューシステムが基本になりますね.

昨今ですと, このあたりは Torque, Slurm, OpenPBS などがあります.
学生時代に共用ワークステーションで qsub とか psub とかでジョブを実行した経験があるひともいるでしょう.

Slurm は SQL サーバが必要になったりしてセットアップが面倒なので, まずはセットアップが簡単そうな Torque を使ってみます.

## インストール

https://qiita.com/hdoi/items/88d3cf93a32747acc7f3

あたりを参考に apt でインストールできます.

### 設定の注意点

`pbs_server` は常に動作するような実行モデルのようなので, `pbs_server -t create` で初期化したときは一度プロセスを終了させます.

```
$ sudo killall pbs_server
```

## queue の作成

https://web.chaperone.jp/w/index.php?TORQUE%2Fqueue

あたりを参考に queue を作ります. queue を作成したら `qmgr -c 'p s'` で設定を確認します.

```
#
# Create queues and set their attributes.
#
#
# Create and define queue batch
#
create queue batch
set queue batch queue_type = Execution
set queue batch enabled = True
set queue batch started = True
#
# Set server attributes.
#
set server scheduling = True
set server acl_hosts = francine
set server acl_hosts += torqueserver
set server default_queue = batch
set server log_events = 511
set server mail_from = adm
set server scheduler_iteration = 600
set server node_check_rate = 150
set server tcp_timeout = 6
set server next_job_number = 5
```


## トラブルシューティング

http://docs.adaptivecomputing.com/torque/3-0-5/11.1troubleshooting.php

https://www.nas.nasa.gov/hecc/support/kb/common-reasons-why-jobs-wont-start_198.html

あたりを参考にします.

### ジョブがサブミットできない.

`/etc/hosts` でサーバーのホストネームと IP アドレスを対応づけているか確認する(IP が `127.0.1.1` とかのローカルアドレスだと NG)

### ジョブが流れない.

以下のような感じで `Q` 状態のままでジョブが流れない.
 
```
Job id                    Name             User            Time Use S Queue
------------------------- ---------------- --------------- -------- - -----
4.francine                STDIN            syoyo                  0 Q batch 
```

`pbsnodes -a` で計算ノードが `free` になっているかどうか確認する.

```
$ pbsnodes -a
francine
     state = free
     np = 4
     ntype = cluster
     status = rectime=1526877914,varattr=,jobs=,state=free,netload=999047563,gres=francine:,loadave=0.03,ncpus=4,physmem=3998720kb,availmem=36164932kb,totmem=37445628kb,idletime=70399,nusers=5,nsessions=41,sessions=1100 1558 2036 2411 3027 20820 7261 8696 10881 12299 32315 17736 21403 23082 20733 20811 20832 20878 20879 20885 20883 20887 20910 20920 20963 20965 20970 20971 20986 21041 21042 21043 21045 21050 21051 21052 21053 21077 21143 21151 22731,uname=Linux francine 4.13.0-41-generic #46~16.04.1-Ubuntu SMP Thu May 3 10:06:43 UTC 2018 x86_64,opsys=linux
```

キューの設定で scheduling が有効になっているか確認する. 設定されていなければ,

```
$ sudo qmgr -c "set server scheduling = True"
```

として scheduling を有効にする.

## TODO

* NFS or Samba(CIFS)でファイル共有を行う.
* 計算ノードへは ssh 公開鍵ログインで行う.
* LDAP あたりでユーザ管理と認証を統一する.
* デフォルトだと `$HOME` に `STDIN`, `STDOUT` ファイルができるので別の場所に作るようにする.
* Slurm にチャレンジする.
* https://github.com/facebook/bistro あたりのナウでヤングそうなジョブマネージャを試す.
Mockitoチートシート

# Mockitoって？

Javaのテスト環境で、モジュールの振る舞いを「モック化」する事ができる。

基本的には以下の流れで使用できる。
1. 対象クラス、インターフェイスを指定しモックオブジェクトを取得。
2. モックオブジェクトの振る舞いを設定（オプション）
3. バリデーション

# モック化

`mock`メソッドを使用する場合

``` java
List mockedList = mock(List.class);
```

`@Mock`アノテーションを使用する場合

``` java
public class HogeTest {

  @Mock List list;

  @Before
  public void before() {
    MockitoAnnotations.initMocks(this);
  }

}
```

# 振る舞いを設定

戻り値を設定

``` java
when(mockedList.get(0)).thenReturn("zero");
```

例外のスローを設定

``` java
when(mockedList.get(1)).thenThrow(new IllegalArgumentException());
```
# バリデーション

メソッドの呼び出しを確認


``` java
verify(mockedList).get(0);
```

メソッドの呼び出しを確認（非同期）

``` java
verify(mockedList, timeout(1000)).get(0);
```
# 参考資料

- [公式サイト](https://site.mockito.org/)
決済機能 stripe

# 導入

```
gem 'stripe'
```

## コントロラー作成

```
$rails g controller charges
```

custromer、amount、chargeを作る

```

def new
end

def create
  # Amount in cents
  @amount = 500

  customer = Stripe::Customer.create(
    :email => params[:stripeEmail],
    :source  => params[:stripeToken]
  )

  charge = Stripe::Charge.create(
    :customer    => customer.id,
    :amount      => @amount,
    :description => 'Rails Stripe customer',
    :currency    => 'usd'
  )

rescue Stripe::CardError => e
  flash[:error] = e.message
  redirect_to new_charge_path
end

```
 
## ポイント
```
@amount　= 500 →
 @amount = order_params[:payment_price]
```

ルーティング設定

```
resources :charges
```

環境変数の設定

```
1）ファイルを作成

2）記述

Rails.configuration.stripe = {
  :publishable_key => ENV['PUBLISHABLE_KEY'],
  :secret_key      => ENV['SECRET_KEY']
}

Stripe.api_key = Rails.configuration.stripe[:secret_key]
```

## ポイント

```
この記述でsecretymlと連携している
 Rails.application.secrets.publishable_key,
```

secret.yml設定　

```
development:
  secret_key_base: 
  publishable_key: <%= ENV["publishable_key"] %>
  
  secret_key: <%= ENV["secret_key"] %>

test:
  secret_key_base: 

# Do not keep production secrets in the repository,
# instead read values from the environment.
production:
  secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>

```

ビュー作成

new.html.erb 

```
<%= form_tag charges_path do %>
  <article>
    <% if flash[:error].present? %>
      <div id="error_explanation">
        <p><%= flash[:error] %></p>
      </div>
    <% end %>
    <label class="amount">
      <span>Amount: $5.00</span>
    </label>
  </article>

  <script src="https://checkout.stripe.com/checkout.js" class="stripe-button"
          data-key="<%= Rails.configuration.stripe[:publishable_key] %>"
          data-description="A month's subscription"
          data-amount="500"
          data-locale="auto"></script>
<% end %>

```
ポイント

```

<span>Amount: <%= @amount %></span>

data-amount="500"　→  data-amount ="<%= @amount%>"


   = form_for [@user, @order] do |f| 
  　　　〜〜
    〜〜 
    = f.hidden_field :payment_price, value:
@course.price 

```
長門有希との通信プログラムを再現してみた

# 背景
それは何年も前の話。
いつだったか、会社の寮で休日に何もやることがなくて本当に暇だった。
外は雨が降っていた。
外出する気にもならなかった。

本当に暇だったのでアニメを見て時間を潰すことにした。
そのアニメを見ていたら、なんか、こう、「コレ作ってみたい」って思ったんだ。
そのまま勢いで作り上げてしまった。

# ダウンロード
GitHubからどうぞ

https://github.com/gitcho/YUKI.N

# 動作環境
たぶん、どの環境でも動くと思うけど、当時はUbuntu(14.04)で作ってたので動作保証はその環境。

仮想コンソール画面(`Ctrl`+`Alt`+`F3`など)で起動する場合は日本語が文字化けるため、jfbtermなどをインストール、起動する。

    apt-get install jfbterm
    jfbterm -q

# ビルド
`gcc`が必要。`make`が実行できるなら

    make

# 実行
ターミナルから実行する。
**poweroffコマンドを実行できる権限があるとOSごとシャットダウンするので注意**

    ./yuuutsu
terraformでSESを設定する

terraformでSESを設定するやり方があんまりなかったので、書き残しておきます。

### 追記
https://aws.amazon.com/jp/blogs/news/amazon-ses-tokyo/
東京リージョンでSESできたみたいです

## 前提

- EC2などアプリ自体は東京(ap-northeast-1)で動かす
- SESは東京にはないので、別リージョンで動かす
  - 今回はオレゴン(us-west-2)で動かした

環境は以下の通りです

```bash
$ terraform -v
Terraform v0.11.8
+ provider.aws v1.29.0
```



## terraformの変数設定

```variables.tf
variable "access_key" {}
variable "secret_key" {}
variable "region" {
  default = "ap-northeast-1"
}
variable "aws_web_domain" {}
variable "ssh_key_name" {}
variable "ssh_public_key_path" {}
variable "ssh_private_key_path" {}
```

```terraform.tfvars
access_key = "xxx"
secret_key = "xxx"
region = "ap-northeast-1"
aws_web_domain = "xxx"
ssh_key_name = "xxx"
ssh_public_key_path = "~/.ssh/xxx.pub"
ssh_private_key_path = "~/.ssh/xxx"

```

```main.tf
terraform {
  required_version = "= 0.11.8"
}

provider "aws" {
  access_key = "${var.access_key}"
  secret_key = "${var.secret_key}"
  region     = "${var.region}"
}

# sesはtokyoにはないので、別リージョンを用意
provider "aws" {
  alias  = "west"
  region = "us-west-2"
}

resource "aws_key_pair" "auth" {
  key_name   = "${var.ssh_key_name}"
  public_key = "${file(var.ssh_public_key_path)}"
}
```

```route53.tf
resource "aws_route53_zone" "primary" {
  name = "${var.aws_web_domain}"
}
```

```ses.tf
resource "aws_ses_domain_identity" "ses" {
  domain = "${var.aws_web_domain}"
  provider = "aws.west" # providerを指定して別リージョンにする
}

resource "aws_route53_record" "ses_record" {
  zone_id = "${aws_route53_zone.primary.zone_id}"
  name    = "_amazonses.${aws_route53_zone.primary.name}"
  type    = "TXT"
  ttl     = "600"
  records = ["${aws_ses_domain_identity.ses.verification_token}"]
}

resource "aws_ses_domain_dkim" "dkim" {
  domain = "${var.aws_web_domain}"
  provider = "aws.west"
}

resource "aws_route53_record" "dkim_record" {
  count   = 3
  zone_id = "${aws_route53_zone.primary.zone_id}"
  name    = "${element(aws_ses_domain_dkim.dkim.dkim_tokens, count.index)}._domainkey.${aws_route53_zone.primary.name}"
  type    = "CNAME"
  ttl     = "600"
  records = ["${element(aws_ses_domain_dkim.dkim.dkim_tokens, count.index)}.dkim.amazonses.com"]
}
```

以上。

あとは [Amazon SES サンドボックス外への移動 - Amazon Simple Email Service](https://docs.aws.amazon.com/ja_jp/ses/latest/DeveloperGuide/request-production-access.html) からサンドボックスを解除する

- https://www.terraform.io/docs/configuration/providers.html
Twitter API の開発者アカウントに登録申請してみた

#はじめに
Twitter API を使おうとしたら，なんと2018年7月から仕様が変更されているらしい。そこで，新しい仕様に沿って，Twitter API の開発者アカウントに登録した様子を記録した。

#Twitter Developer

Application Programming Interface (API) を使いたい Twitter のアカウントでログインした状態で，次の Twitter Developer にアクセスする。Twitter のアカウントにログインしていないと，ログイン画面が表示される。

https://developer.twitter.com/

![twitterAPI#01.png](https://qiita-image-store.s3.amazonaws.com/0/208216/c255ebb9-6d8b-c291-44a4-8ba8576a777e.png)

## 開発者アカウントを適用する

画面右上の [Apply] をクリックして，開発者アカウントの登録に進む。

![twitterAPI#03.png](https://qiita-image-store.s3.amazonaws.com/0/208216/be52eb3e-fdbb-9871-4b90-b9dcb38d0d30.png)

開発者アカウントを適用する Twitter のアカウントを確認し，問題なければ [Continue] のボタンをクリックして進む。ここで，エラーが表示された場合，いったんサインアウト（ログアウト）した上で，上記までの手順をたどれば，うまくいくかも！？

![twitterAPI#04.png](https://qiita-image-store.s3.amazonaws.com/0/208216/9a31b603-054b-c961-f6f7-2e17f1812098.png)

項目 "Account name" には，Twitter のユーザ名または任意のプロジェクト名を入力する。たぶん，どんな文字列でも良いはず。

![twitterAPI#05.png](https://qiita-image-store.s3.amazonaws.com/0/208216/af9eca59-116b-e091-3f11-6e2f24321fbf.png)

![twitterAPI#05a.png](https://qiita-image-store.s3.amazonaws.com/0/208216/e619fd6d-883e-9b13-ef46-5001aabc0b09.png)

プロジェクトの詳細について入力する。特に，説明文は最低300文字以上でないと，先に進むことができない。審査の過程で見られるので，ダミーの文字列を入れただけではダメである。

![twitterAPI#06.png](https://qiita-image-store.s3.amazonaws.com/0/208216/99807c79-fff7-61ec-1a3a-86863dad687e.png)

![twitterAPI#06a.png](https://qiita-image-store.s3.amazonaws.com/0/208216/68ce85e4-355c-0ca0-a5b9-162a49f4d5ed.png)

最後まで規約を読んで（！），その内容に同意したら，チェックした上で [Submit application] をクリックする。

![twitterAPI#07.png](https://qiita-image-store.s3.amazonaws.com/0/208216/67ccbf9e-3cdc-b0e3-d685-de2bc30a4365.png)
![twitterAPI#07a.png](https://qiita-image-store.s3.amazonaws.com/0/208216/56fa9c26-e34a-2d5f-3f6c-4739ae039625.png)

## メールによる確認

すると，登録されたメールアドレスに確認のメールが送られてくる。メール本文中の [Confirm your email] をクリックすると先に進むことができる。

![twitterAPI#08.png](https://qiita-image-store.s3.amazonaws.com/0/208216/56b780d7-5c14-d568-6e86-af08ffd12b9a.png)

![twitterAPI#09.png](https://qiita-image-store.s3.amazonaws.com/0/208216/0b9a4ef1-872f-45fd-eff5-94d99c1af565.png)

ここまで来たら，あとは審査の結果を待つだけ。いくつかの情報によると，数日のうちに審査結果が届くようだ。

【第1回】Twitter APIを使うためにdeveloper accountの申請をしよう！
https://masatoshihanai.com/php-twitter-bot-01/

Twitter API 登録 (アカウント申請方法) から承認されるまでの手順まとめ　※2018年9月時点の情報
https://qiita.com/kngsym2018/items/2524d21455aac111cdee

![twitterAPI#10.png](https://qiita-image-store.s3.amazonaws.com/0/208216/ea28a713-41ed-1695-4811-0fa1c8627885.png)

TwitterのAPIについて
https://help.twitter.com/ja/rules-and-policies/twitter-api
【備忘録】javascriptで空白区切りのデータから情報を取得する正規表現

また備忘録です。

##今回の目的
この記事では、例えば

```rb
"apple orange banana"
```

といった文字列から

```rb
["apple", "orange", "banana"]
```

のような配列を作るjavascriptのコードを備忘録として残しておく

##結論

```js:app.js
let str = "apple orange banana"
let re = /[^\s]+/g

let match = str.match(re)

console.log(match)
```

```terminal:terminal
node app.js
[ 'apple', 'orange', 'banana' ]
```

###解説
少し解説を加えておく。
今回のコードの要となるのは正規表現オブジェクト`re`である。

```js
re = /something/
```

は正規表現リテラルによって正規表現を生成する構文である。
そして

```
^\s
```
は空白を含まない文字(一文字)を表わす。

```
/something/g
```

は`something`とマッチする文字列をすべて検索し、配列にするという`g`オプションである
よって

```js
let re = /[^\s]+/g
```

は、「空白を含まない一文字以上の文字列をすべて検索し、配列として出力せよ」という正規表現になる。

##最後に
最後まで読んでいただき、ありがとうございます。
空白区切りの文字列は、検索ボックスの実装などで必要とされると思いますので、
参考になればうれしいです。正規表現は便利だなぁ
package.envを使ってGentooのパッケージにビルドオプションを増やす

# 発端
[この記事](https://qiita.com/slug/items/4f902f45c5796f69309c)の補足に追記した`/etc/adjtime`の位置に関する[FHS3.0](https://refspecs.linuxfoundation.org/FHS_3.0/fhs-3.0.html#varlibhwclockStateDirectoryForHwclo)における変更ですが、その理由は
> In FHS 2.1, this file was /etc/adjtime, but as hwclock updates it, that was obviously incorrect.

とあまりにも文句なく「そりゃそーだよな」だったので手元のGentooについては修正しちまうことにしました。

# どうやって変更する？
ググるとLFSではsed(1)でソースそのものを書き換えているみたいな情報が出てきますが、現在のutil-linuxでは`ADJTIME_PATH`がhwclock(8)の実行時だけではなく[configureスクリプトの実行時にも指定できる](https://github.com/karelzak/util-linux/blob/3f7e7e4d3ce97d2c056342674a2888a53e42786c/configure.ac)ようなので、こいつを使います。

# Gentooパッケージに新しいビルドオプションをつける方法

## ebuildに書いてあるケース
[USEフラグ](https://wiki.gentoo.org/wiki/Handbook:AMD64/Working/USE#Using_USE_flags)を使います。Gentoo使いにはお馴染みの方法ですし、ここでは扱いません。

## ebuild的に全く関知していないオプションを足したい
こういう時に便利なのが[package.env](https://wiki.gentoo.org/wiki//etc/portage/package.env)と[`EXTRA_ECONF`](http://gentoo.linuxhowtos.org/TipsTricks/configoptions.htm)です。
今回の場合は、以下2つのファイルを作ります。ディレクトリがなかったら適宜作りましょう。

```/etc/portage/env/adjtime-location.conf
EXTRA_ECONF="ADJTIME_PATH=/var/lib/hwclock/adjtime"
```

```/etc/portage/package.env
sys-apps/util-linux adjtime-location.conf
```

構造としては、

1. Portageの設定をひとまとめにしたテキストファイルを`/etc/portage/env`下に配置する
    - `EXTRA_ECONF`以外にもPortageの機能に関する変数、例えば`FEATURES`や`CXXFLAGS`などが指定可能。
2. `/etc/portage/package.env`というテキストファイルに適用したいパッケージ名と設定ファイル名をスペース区切りで指定する
    - パッケージごとに1行、設定ファイルはその行内においてスペース区切りで複数書いてOK

といった感じです。

# つけた後にやること
`# emerge -1 sys-apps/util-linux`でビルドをやり直し、configureスクリプト実行コマンドラインの出力の末尾に`EXTRA_ECONF`で指定した行が加わっていることを確認すればOKです。
もちろん、追加したオプションの内容によっては、それが原因でビルドに失敗する場合もあるので気をつけましょう。
最後に、今回は`adjtime`ファイルの参照先が変わったので

```console
# mkdir /var/lib/hwclock
# mv /etc/adjtime /var/lib/hwclock/adjtime
# ln -s /var/lib/hwclock/adjtime /etc/adjtime
```
とフォローを入れておきました。
こういうのはGentooの醍醐味ですね。お疲れ様でした。
heroku 　導入手順

# 登録

# herokuコマンド　ダウンロード

```
brew install heroku/brew/heroku

```

こんな説明書き

```
To use the Heroku CLI's autocomplete --
  Via homebrew's shell completion:
    1) Follow homebrew's install instructions https://docs.brew.sh/Shell-Completion
        NOTE: For zsh, as the instructions mention, be sure compinit is autoloaded
              and called, either explicitly or via a framework like oh-my-zsh.
    2) Then run
      $ heroku autocomplete --refresh-cache

  OR

  Use our standalone setup:
    1) Run and follow the install steps:
      $ heroku autocomplete

```

https://docs.brew.sh/Shell-Completion　これチェック

```
1）
if type brew &>/dev/null; then
  FPATH=$(brew --prefix)/share/zsh/site-functions:$FPATH
fi

2）
rm -f ~/.zcompdump; compinit


```

heroku autocomplete の後にパスを通す

```
$ printf "$(heroku autocomplete:script zsh)" >> ~/.zshrc; source ~/.zshrc

```


## 利用コマンド

```
prinf
```

https://www.softel.co.jp/blogs/tech/archives/5427