OmniAICreator/Qiita-1.07M huggingface dataset:
Go言語を真剣に勉強してみた〜WEBアプリケーション開発編②〜

#はじめに
こんにちは。某学校でプログラミング等の勉強中のサーバーサイドのプログラマーのワタタクです。:relaxed:
さて今回は「Go言語を真剣に勉強してみた〜WEBアプリケーション開発編〜」の2回目と言うことで、[「Go言語を真剣に勉強してみた〜WEBアプリケーション開発編〜」](https://qiita.com/watataku/items/23dafc566e7766599f77)で紹介しきれなかったことについて紹介していけたらと思います。
では、早速いってみましょう:point_up:
#パラメータ受け取り
```golang
変数 :=  *http.Request.FormValue("name属性")
```
基本的にはこれだけでPOST も GET も受け取れる

#リクエスト制限
##POST送信

```golang
if *http.Request.Method != http.MethodPost {
    //POSTだけー
}
```
##GET送信
```golang
if *http.Request.Method != http.MethodGet {
    //GETだけー
}
```
#リダイレクト

```golang
http.Redirect(http.ResponceWrite, *http.Request, "リダイレクト先URL", HTTPステータスコード)
```
＜＜RFC 2616で定義されているHTTPステータスコード＞＞

```
    StatusContinue           = 100
    StatusSwitchingProtocols = 101
    StatusOK                   = 200
    StatusCreated              = 201
    StatusAccepted             = 202
    StatusNonAuthoritativeInfo = 203
    StatusNoContent            = 204
    StatusResetContent         = 205
    StatusPartialContent       = 206
    StatusMultipleChoices   = 300
    StatusMovedPermanently  = 301
    StatusFound             = 302
    StatusSeeOther          = 303
    StatusNotModified       = 304
    StatusUseProxy          = 305
    StatusTemporaryRedirect = 307
    StatusBadRequest                   = 400
    StatusUnauthorized                 = 401
    StatusPaymentRequired              = 402
    StatusForbidden                    = 403
    StatusNotFound                     = 404
    StatusMethodNotAllowed             = 405
    StatusNotAcceptable                = 406
    StatusProxyAuthRequired            = 407
    StatusRequestTimeout               = 408
    StatusConflict                     = 409
    StatusGone                         = 410
    StatusLengthRequired               = 411
    StatusPreconditionFailed           = 412
    StatusRequestEntityTooLarge        = 413
    StatusRequestURITooLong            = 414
    StatusUnsupportedMediaType         = 415
    StatusRequestedRangeNotSatisfiable = 416
    StatusExpectationFailed            = 417
    StatusInternalServerError     = 500
    StatusNotImplemented          = 501
    StatusBadGateway              = 502
    StatusServiceUnavailable      = 503
    StatusGatewayTimeout          = 504
    StatusHTTPVersionNotSupported = 505
```
このページを見にくる人で**HTTPステータスコード**を知らないという人はいないと思いますが知らない人は[こちら](http://www5.plala.or.jp/vaio0630/mail/st_code.htm)を参照して下さい。

以上。
もし何か間違っている等のご指摘があればご連絡ください。
最後まで読んで頂きありがとうございました。

次回はGoでのクッキー、セッションをやった後にjsonをやってGoのフレームワークの「revel」を触っていこうかなと思います。
AndroidアプリのWebViewでCookieが取得できない問題の解決方法

AndroidアプリのWebViewでcookieを取得できない問題が発生した時の対応ログが残っていたのでここに上げておきます。
結論から言うと、Android 5.0からサードパーティのCookieが弾かれていたのが原因でした。


> 混合コンテンツとサードパーティの Cookie がデフォルトでブロックされます。混合コンテンツとサードパーティの Cookie を許可するには、それぞれ setMixedContentMode() メソッドと setAcceptThirdPartyCookies() メソッドを使用します。

https://developer.android.com/about/versions/android-5.0-changes.html#BehaviorWebView

具体的には`setAcceptThirdPartyCookies()`メソッドを使ってサードパーティのCookieを許可していないのが原因でした。

```java
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    cookieManager.setAcceptThirdPartyCookies(binding.webView, true);
}
```

Lollipop（Android 5.0）より下のバージョンをサポートしている場合は、上記のように分岐をしてあげないとクラッシュします。


## デバッグ方法

単純にログを吐くだけです。

```java
String[] cookies = cookieManager.getCookie(url).split(";");
for(String cookie : cookies) {
    Log.d("onPageStarted", cookie);
}
```


### Chromeを使ってWebViewをみる

以下の記事の方法でNetworkやConsoleを見れたことが解決に繋がりました。

WebView のリモート デバッグ
https://developers.google.com/web/tools/chrome-devtools/remote-debugging/webviews?hl=ja
vscode python


How to use
http://www.atmarkit.co.jp/ait/articles/1711/24/news034.html
https://kiwamiden.com/i-tried-using-vscode-for-python


Setting
https://necojackarc.hatenablog.com/entry/2017/03/16/090000

Intelisense
https://miraium.com/python-with-vscode/
https://vscode-doc-jp.github.io/docs/userguide/intellisense.html
https://teratail.com/questions/117685

lint
```pip install pylint-django[with_django]```

```https://qiita.com/RyoMa_0923/items/d0c2613f15dd98280121
    "python.pythonPath": "/home/ex/anaconda3/bin/python",
    "python.jediEnabled": false,
  // Automatically add brackets for functions.
    "python.autoComplete.addBrackets": true,
    "python.autoComplete.extraPaths": ["/home/ex/anaconda3/lib/python3.6/site-packages"],

    "python.linting.enabled": true,
    "python.linting.pylintEnabled": true,
    "python.linting.pylintArgs": [
        "--errors-only",
        "--load-plugins",
        "--load-plugins=pylint_django"]
```
https://qiita.com/fukuit/items/cd5a76b49af91de83499
http://yamap55.hatenablog.com/entry/2018/07/22/235746

docker remote debug
https://qiita.com/Ryuichirou/items/6327ab5012ca1729d72f#_reference-7d370773f649635aff79
WindowsのコマンドプロンプトからWeb上のファイルをダウンロードする

# はじめに

諸々の事情によりWindowsのコマンドプロンプトからファイルをDLする事になった。
Linuxならcurlで行けるけどWindowsではどうしたものか。

# やりかた

bitsadminというコマンドが標準で用意されていた。

```
bitsadmin /TRANSFER [ジョブ名] [URL] [保存先フルパス]
```

例:

```
bitsadmin /TRANSFER FILEGET http://hoge.com/fuga/file.xml c:\tmp\download.xml
```

ジョブ名は識別用なので任意の名称で大丈夫。
httpにしか対応していないようだが標準装備なので手軽に使える。
ただ、名前がなんとなく覚えにくい。
【TIC-80】2.25方向境界タイルの自動生成とremapでの表示

境界線にどうしてここまでこだわるのか‥‥。
空の境界線上のNEW HORIZON...

自分の[最初の記事](https://qiita.com/uokagi/items/4f3c003bcbcd1b2eeb3a)よりはだいぶ汎用的なものになった...はず(?)

![境界線タイル設定.gif](https://qiita-image-store.s3.amazonaws.com/0/284455/9fe2a672-ed1f-8fa5-fca8-9ac59fac59e8.gif)

こんな感じでスプライトエディタでタイルを作って‥
（FC仮面ライダー倶楽部のつるてかレンガリスペクト）

![境界マップ.gif](https://qiita-image-store.s3.amazonaws.com/0/284455/07ac4247-87a1-4a0f-c22e-65c534e92844.gif)

マップエディタでペタペタとならべて

![境界コード.gif](https://qiita-image-store.s3.amazonaws.com/0/284455/ccc487d1-0340-5fa5-a02b-50bafc3cbcaf.gif)

初期化時にでも今回作成の関数を呼んで、remap用関数にセットして、map命令にこの関数を指定して実行すると。

![境界実行.gif](https://qiita-image-store.s3.amazonaws.com/0/284455/48b22901-2aa3-f77b-9a99-b43012a3170c.gif)

じゃん！
同じタイルはつながって、それ以外の間には境界線が引かれます。
（境界付きのタイルが並べられます）
後ろにエラーが見えている？　HAHAHA

境界タイル生成とremap用関数を返す、両方を行う関数は以下のような仕様です。

`bordertilef(fidx,nums,leftup,bcolor,bwidth,tilesync)`

- fidx ： 生成対象の開始タイル番号
- nums ： タイル個数（開始タイルから右にこの個数分処理）
- leftup ： 左上を考慮するか否か（true or false）
- bcolor ： 境界線の色番号
- bwidth ： 境界線の幅（ドット）
- tilesync ： 境界タイルを tic ファイル（ゲームのROMに当たる）に反映するか否か

![別タイル.gif](https://qiita-image-store.s3.amazonaws.com/0/284455/808f8837-249e-aaca-f82d-40367f4df3c8.gif)

このような単色タイルをセットして、初期化部分とメインループ部分を以下のようにすると

```testinit.lua
testinit=function()
	rm=bordertilef(16,16,true,7,2)
	rmflag=true
end

testinit()

function TIC()
	map(0,17,30,17,0,0,-1,1,rmflag and rm)
	if btnp(0,1,30) then rmflag = not rmflag end
end

```

![kirikae.gif](https://qiita-image-store.s3.amazonaws.com/0/284455/2d0cffbc-d4d6-8e41-0e11-e33d859db10d.gif)

このように境界の幅や色を変えたり、左上の考慮を有効にすると角が欠けるのを防ぐことができます。
`mget(x,y)`で取得できるワールドマップのタイル番号はそのままなので、`remap`をセットするかしないかで境界の有無の切り替えが可能です。

全リストは以下の通りです。

```bordertile.lua
PTN={
	{true,false,true,false},
	{true,true,false,false},
	{true,true,true,false},
	{true,false,false,false}
}

-- common function from TIC-80 wiki
function sset(x,y,c)
	local addr=0x4000+(x//8+y//8*16)*32
	poke4(addr*2+x%8+y%8*8,c)end
function sget(x,y)
	local addr=0x4000+(x//8+y//8*16)*32
	return peek4(addr*2+x%8+y%8*8)end

-- my function
function bordertilef(fidx,nums,leftup,bcolor,bwidth,tilesync)
	local id,n,pn=fidx or 0,nums or 16,leftup and 4 or 3
	local bc,bw,bg=bcolor or 0,bwidth or 1,bgidx or 0
	for i=id,id+n-1 do
		local sx,sy=i%16*8,i//16*8
		local org={}
		for j=0,63 do
			org[j]=sget(sx+j%8,sy+j//8) end
		for nn=1,pn do
			for yy=0,7 do
				for xx=0,7 do
			 		local isb=PTN[nn][(xx<bw and 0 or 1)+(yy<bw and 0 or 2)+1]
			 		sset(sx+xx,nn*8+sy+yy,isb and bc or org[xx+yy*8])end end end end
	if tilesync then sync(1,0,true) end
	return function(tile,x,y)
		local dLeft=(tile==mget((x-1)%240,y%136))and 0 or 1
		local dUp=(tile==mget(x%240,(y-1)%136))and 0 or 2
		local dLU=(dLeft==0 and dUp==0 and leftup and tile~=mget((x-1)%240,(y-1)%136))and 4 or 0
		return tile+(dLeft+dUp+dLU)*16 end end

testinit=function()
	rm=bordertilef(16,16,true,7,2)
	rmflag=true
end

testinit()

function TIC()
	map(0,17,30,17,0,0,-1,1,rmflag and rm)
	if btnp(0,1,30) then rmflag=not rmflag end
end

```

う、う～ん... 微妙に分かりづらいなあ。1週間後はともかく1ヶ月後の自分がきちんと理解できるか自信がないので今のウチにどんな考えで組んだのかメモっておきたいけど‥‥
後で追記か別途続きを書くとします。（書きます、多分）
Wi-Fi環境でAndroid StudioのEmulatorがネットワークに繋がらないときの対応


dns-serverを指定してEmulatorを起動する。

```shell
$ ~/Library/Android/sdk/emulator/emulator -avd Nexus_5X_API_27 -dns-server 8.8.8.8
```

Emulatorの一覧は以下で確認可能。

```shell
$ ~/Library/Android/sdk/emulator/emulator Nexus_5X_API_27 -list-avds
```
Python + Selenium + Chrome で自動ログインいくつか

# はじめに

ログインまわりを調べてみました。新しい情報ではないですが備忘録として。

基本的操作: [Python + Selenium で Chrome の自動操作を一通り](https://qiita.com/memakura/items/20a02161fa7e18d8a693)

Selenium のインストールや `from selenium import webdriver` がされているとします。
詳しくは上記の記事をご覧ください。

## 注意事項

どこかのサービスにログインした場合、もろもろの利用規約などに同意していると思います。
ならば、そもそも自動操作で処理して良いかなど、よく確認が必要です。
禁止されている事項がいろいろありえます。

# スクリプトに書いておく

スクリプトに書いておく方法が最も単純です。
もちろん、プレーンテキストなので望ましくないことも多いです。

```python
user_email = '...'
user_pw = '...'
driver.find_element_by_id("email").send_keys(user_email)
driver.find_element_by_id("password").send_keys(user_pw)
driver.find_element_by_class_name("login-button").click()

```

# Chrome ユーザープロファイルを使う

新規に作成してそこにログイン情報を保存していく方法と、既存の（Selenium 経由ではなく通常起動の Chrome での）ユーザプロファイルを読み込む方法があります。
普段使いの Chrome のプロファイルと混ぜたくないならば前者、もろもろの既存の情報を引き継いで処理を進めたいなら後者でしょうか。

なお、ヘッドレスモードではうまくうごかせていません。

## 新規に作成する

1. `ChromeOptions` を利用します。適当な空のフォルダ作成しておき、`add_argument('--user-data-dir=...')` で指定します（絶対パス、相対パスどちらでも可）。
1. 非ヘッドレスモードで Chrome を起動し、ログイン情報を残したい適当なページに行き、ログイン、パスワード、二段階認証等が終われば閉じます。（スクリプトから立ち上げるときは `driver.quit()` まで呼ばないよう注意）
1. 次回、同じプロファイルフォルダを指定すれば、ログインした状態になります。

```python
import os
userdata_dir = 'UserData'  # カレントディレクトリの直下に作る場合
os.makedirs(userdata_dir, exist_ok=True)

options = webdriver.ChromeOptions()
options.add_argument('--user-data-dir=' + userdata_dir)

driver = webdriver.Chrome(options=options)
```

新規作成したユーザディレクトリを、さらにマルチユーザーで使用するなら `--profile-directory=` も指定が必要ですが、通常は不要です。


## 既存のユーザプロファイルを使う

1. 使用したい Chrome ユーザーで Selenium を使わずに Chrome を通常起動します。
1. URLの欄に `chrome://version/` と入力し、「プロフィール パス」を調べます。
    - Windows であれば `C:\Users\<ユーザ名>\AppData\Local\Google\Chrome\User Data\Profile 2` などになります。
    - `User Data` の部分までが**ユーザデータディレクトリのパス**、最後の `Profile 2` が**プロファイルディレクトリ名**です。
    - デフォルトユーザーだとプロファイルディレクトリが `Default` になっています。
1. スクリプト内で、`--user-data-dir` にユーザデータディレクトリのパス、`--profile-directory` にプロファイルディレクトリ名を指定し、Selenium から Chrome を起動すると、既存ユーザの設定が読み込まれます。
    - Default ユーザーのプロファイルを読み込む場合は、`--profile-directory` は不要です。

```python
options = webdriver.ChromeOptions()
options.add_argument('--user-data-dir=C:\\Users\\<ユーザ名>\\AppData\\Local\\Google\\Chrome\\User Data')
options.add_argument('--profile-directory=Profile 2')  # この行を省略するとDefaultフォルダが指定されます

driver = webdriver.Chrome(options=options)
```


参考: http://katsulog.tech/create-an-arbitrary-chrome-profile-with-selenium-webdriver-and-store-login-information-etc/

# その他のパスワード入力方法

`getpass` でその場で聞く、暗号化ライブラリを使う、`keyring` を使ってOSのパスワード保存機構に任せる、などがあるようです。

参考: https://www.tsuyukimakoto.com/blog/2013/12/02/hide_password/
SSE-KMSで暗号化したS3バケットからQSにデータ連携する方法

#はじめに
投稿内容は私個人の意見であり、所属企業・部門見解を代表するものではありません。
#暗号化キーの準備
マネージメントコンソールにログイン
IAMを選択し、暗号化キーをクリック
![1.png](https://qiita-image-store.s3.amazonaws.com/0/78184/9e9df276-15aa-cbc5-3f5d-0a72b4befafa.png)
S3バケットを作成するリージョンを選択してから、キー作成をクリック
エイリアス(暗号化キーの名称)を入力
タグを入力(Optional)
キー管理アクセス許可の定義で「aws-quicksight-service-role-v0」を選択する
キーの使用アクセス許可の定義「aws-quicksight-service-role-v0」を選択する
※「aws-quicksight-service-role-v0」はQSが自動作成したIAMロール
自動作成されたIAMポリシーを手動で編集してはいけない。QSから編集したIAMポリシーが変更できなくなる。
>This policy used by QuickSight for AWS resource access was modified outside of Quicksight, so you can no longer edit this policy to provide AWS resource permission to QuickSight. To edit this policy permissions, go to IAM console and delete this policy permission with policy arn - arn:aws:iam::793493288704:policy/service-role/AWSQuickSightS3Policy.

新規にIAMポリシーをAttachした場合、すべてのIAMポリシーがQSから操作不可になる。
>The role used by QuickSight for AWS resource access was modified to an un-recoverable state outside of QuickSight, so you can no longer edit AWS resource permissions in QuickSight.

#s3の設定
バケット作成
プロパティのデフォルト暗号化でAWS-KMSを選択し、先程作成した暗号化キーを指定
テスト用のデータをUpload

#QS設定
QSにログインし、右上のユーザアイコンをクリックしManage QuickSightを選択
Account settingsからManage QuickSight Permissionをクリック
対象のS3のチェックボックにチェックを入れアクセス許可を付与
前述した、aws-quicksight-service-role-v0のAWSQuickSightS3Policyに対象のs3が追加される

#QSにS3からデータを取り込む
データ元となるS3と対象ファイルを記述したマニュフェストファイルを準備

```
{
   "fileLocations": [
          {"URIPrefixes":
              [
              "https://s3.amazonaws.com/<バケット名>/ファイル名"
               ]
          }
     ],
     "globalUploadSettings": {
       "format": "CSV",
       "textqualifier": "\"",
       "delimiter": ","
   }
}
```

QSでNew analysis>New Datasetをクリック
データソースとしてs3を選択する
データソース名を入力
マニフェストファイルを指定する
データがロードされる
VirtualBoxのホストOS (Windows) とゲストOS (Linux) 間でファイルを共有する

# 概要
VirtualBoxで仮想環境を立てた時に、ホストOS(Windows)とゲストOS(Linux)間で共有フォルダを作成し、ファイルを共有する方法を述べます。 

# 方法
VirtualBoxマネージャーで仮想マシンを選択して設定を開きます。
次に共有フォルダのタブを開き、右上の新規共有フォルダ追加ボタンを押します。
そして以下の画像のように設定します。
フォルダのパスは Windows上で共有フォルダとして用いたいフォルダパスを設定してください。
※自動マウントにチェックを入れるとLinuxを立ち上げたときに自動で共有フォルダを「/media/ユーザ名/sf_共有フォルダ名」にマウントしてくれます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/207053/02cd20ca-7088-bd1c-9f47-b73bb2dcc530.png)
以上で共有フォルダが作成されました。
Reactの重要なキーワードまとめ

# 記事の概要

Reactを扱う上で重要なキーワードを簡潔にしました。

#登場するキーワード達
* state
* props
* classコンポーネント
* functionコンポーネント


# コンポーネントの種類
Reactの中にコンポーネントは２種類あります。

* classコンポーネント
* functionコンポーネント


#state
* コンポーネントに**何が入力されているのか**どのように画面が表示されるか、変化していくかを定義します。
* Reactコンポーネントを継承したclassコンポーネントでしか使うことができません。


#props
* 関数、文字列、配列、オブジェクトなど**任意の値を親コンポーネントから子コンポーネントに受け渡し**、利用することができます。



#classコンポーネント

* このコンポーネントでstateの初期値を定義します。
* stateの初期値を更新させるための関数を定義することができます。
* renderによって表示させる**画面**を絶えず更新していきます。（**描画する**とよく表現されます。）
* setStateという関数によって子コンポーネントで発火したイベントによって**state**を上書きすることができます。
* 主に親コンポーネントとして定義されます。


#functionコンポーネント
* このコンポーネントは**stateを持つことができません。**
* classコンポーネントで定義した値をpropsとして受け取ることでこのコンポーネントで受け取った値を使って処理をすることができます。
複数のテーブルを操作する

###複数のテーブルを操作する
**和集合**
テーブル同士を合体させるときに使用する(同種類に限る)
 

SELECT*FROMテーブル1
#####UNION オプション　SELECT*FROM テーブル2
#####UNION オプション　SELECT*FROM テーブル3

SELECT*FROM MATSUO
UNION ALL SELECT*FROM TAIGA;




**内部結合**
二つのテーブルに共通するレコードを取り出す

#####SELECT*FROMテーブル１　INNER JOIN テーブル２　ON テーブル１.列名=テーブル２.列名;

テーブルを3つ以上繋げる場合はさらにINNER JOINで繋げる
Qiitaに望む事

# Qiita運営に望む事

* ユーザーブロック機能の実装
* 記事に対する「いいね」だけでなく「低評価」も作成するべき
  * レーティングが低い記事はno followとするべき
* ユーザーごとにサブドメイン化
* 通報に敏感になるべき

玉石混在で記事の量が増えすぎてサイト内を探す場合、情報フィルターでも掛けないと不正確かつ、未検証で理解の浅い「クソ記事」を読まされ時間が無駄。また、浅い理解で低品質な記事を量産するユーザーは傾向が見受けられるため、ブロックする機能を要望する。低品質な記事にはNOを明示できるようにするべき。また大量に非ブロックを受けたものに対し、警告を行い行動を改めるように促すべきだ。

Qiitaはそろそろ、自身のサイトで量産される記事が検索結果を汚染してネット検索の効率性を下げている事実を認めるべき。理想とかけ離れた状態になっているので自浄作用を働かせる仕組みを導入するべき。

また運営は通報に対する対処が遅い・不透明・基準不明であり、技術情報のインフラを担うつもりならも少し対応をまともにした方が良いと思う。いつまでも自分たちがベンチャーだとか思ってるなら大きな間違いである。

SNS的用をを含むインフラとして機能するならTwitter・Facebook程度のフィルタリング機能はしかるべきなのに今の今まで何も対策されていないことに非常に疑問を感じると共に責任を果たしていないと思う。

# Qiitaユーザーに望む事

* 釣りタイトルをつけない
* 引用や参考資料は必ず明示する
* ちょっと理解した程度ですぐ記事を書かない
* 同じ内容で少し違うだけの記事は書かない
* 互助会でいいねしない
* ポエムが多すぎ、ブログでやりなさい

昨今、ゴミ記事エントリが人気だったり、侍エンジニア塾を叩いて喜んでるみたいだけど、Qiitaは全く人の事言えない立場にある事を理解するべき。一部に非常に質の高い記事がある事は認めるが、Qiitaは総じて低品質であり記事の質の低さは底が抜けてる。

また、完全に丸パクリの転載記事に引用元も明記しないで少し手直ししただけでアップしなおすとか本当に辞めて頂きたい。

あとQiitaは、「はてブ」では無いため互助会でいいね等の行為は一切控えてほしい。ノイズにしかならないしQiitaのブランド（？）を完全に既存してる。内容と技術でいいねを判断したほうがよい。
GaucheのファイルIOについての備忘録

#ファイルIOについて

　GaucheのファイルIOはかなり特殊であろう。少なくとも、Python, Ruby, JavaScriptを扱っている人たちにとっては、初手で度肝を抜かれることだろう。
　どう違うのかというと、Portを通じてファイルをロードして読み取るということをしている。

#Portとは？

 Portとは、
 >オープンしたファイルを抽象化したもの

となっています。これは、C言語の仕様にも関わってきます。
お気楽 Scheme プログラミング入門では
>Gauche の場合、入力ポートは #<iport ファイル名 16進整数> と表示され、出力ポートは #<oport ファイル名 16進整数> と表示されます。Gauche はＣ言語で作成されているので、標準入出力のファイル名はＣ言語で標準入出力を表す名前になっているようです。

と書かれています。


#では、どうやってjsonを読み取るのか

このiportのファイルを引数にして、このファイルをｓ式に変えて出力してくれる。

```gauche
(use rfc.json)
(define (read-line file)
 (let ((port (open-input-file)))
   (parse-json port)))
```

こんな風になる。とりあえず、備忘録として書いているので清書は溜まったらするつもり。

#参考文献
お気楽 Scheme プログラミング入門：
http://www.geocities.jp/m_hiroi/func/abcscm07.html
SaitoAtsushi:SaitoAtsushiさんのコメント
jupyterでコードのスピードを測定する

pythonで計算が帰ってこない問題が発生するので
まずはスピードを測定するところからはじめようと思い
簡単に使えそうなのをまとめてみました

##環境
・python 3系
・jupyter lab


##測定対象

サンプル下記の関数にかかる時間を測定します

```python
#1億個の数字を足す関数
def measurement_obj():
    result = 0
    for no in range(100000000):
        result += no
```

##time関数
現在時刻を表示するtime関数を使って
かかった時間を算出シンプルな手法

```python
import time#time関数を取得

start = time.time()#開始時刻
measurement_obj()#対象の関数
end = time.time()#終了時刻

print(end-start, '秒')#終了時刻-開始時刻でかかった時間
```

```
5.131968021392822 秒
```
なんだかんだつかいやすい

##%time (*IPythonのみ)
IPythonには時間計測用の機能があって便利

```python
#測定する関数と同じ行に「%time」を記入
%time measurement_obj()
```

```
CPU times: user 4.99 s, sys: 0 ns, total: 4.99 s
Wall time: 5 s
```

5秒

##%timeit(IPythonのみ)
処理を自動的に何度か実行して時間を計測してくれる
これも便利

```python
#これも測定する関数と同じ行に「%timeit」を記入
%timeit measurement_obj()
```

```
5.04 s ± 79.5 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
```

7回まわしてスピードを測定してくれました(5.04 s)
標準偏差(±79.5 ms)も出してくれて安心

##%%time(*IPythonのみ)
%を２つにするとセル全体を測定してくれる

```python
%%time　#セルの一番上に「%%time」を記入する

#measurement_objを2つ実行する
measurement_obj()
measurement_obj()
```

```
CPU times: user 10.4 s, sys: 0 ns, total: 10.4 s
Wall time: 10.4 s
```

セル全体で10.4秒

##%%timeit(*IPythonのみ)
timeitにの%%版もあります
先程と同様セル全体を測定し、さらに何回も試してくれる

```python
%%timeit
measurement_obj()
measurement_obj()
```

```
10.4 s ± 189 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
```
1回10秒×7回実行するので結構時間がかかる(約70秒)
1分超えてくると最終的なチェックに使うくらいがちょうどいいかもしれない

##line_profiler

行単位でかかった時間を計測できる便利な関数

※追加でインストールが必要(pipでOK)
下記のコードをコンソール上で実行

```
$ pip install line_profiler
```

実行

```python
import line_profiler
pr = line_profiler.LineProfiler()#LineProfilerクラスのインスタンス生成
pr.add_function(measurement_obj)#対象の関数をadd_functionで登録
pr.runcall(measurement_obj)#runcallで実行
pr.print_stats()#結果を表示
```

```
Timer unit: 1e-06 s
Total time: 825.232 s
File: <ipython-input-2-9c5cb106b08c>
Function: measurement_obj at line 1

Line #      Hits         Time  Per Hit   % Time  Line Contents
==============================================================
     1                                           def measurement_obj():
     2         1         24.0     24.0      0.0      result = 0
     3 100000001  410152920.0      4.1     49.7      for no in range(100000000):
     4 100000000  415079200.0      4.2     50.3          result += no
```

|項目|意味|
|:----:|:--|
|Line|ソースコードの行番号|
|Hits|その行が実行された回数|
|Time|その行の実行に費やした時間の合計、単位は先頭行の Timer unit で示されている|
|Per Hit|その行を 1 回実行するのに費やした時間|
|% Time|その行の実行に費やした時間の全体に対する割合|
|Line Contents|行番号に対応するソースコード|


830秒となかなか時間がかかりました
「やはりループしているところが時間がかかっている」
みたいな事がわかる
(今回のサンプルくらいシンプルなのだとわかりやすいですが)

他にもいろいろあるみたいですが
(cprofile, memory_profiler, heapy, pref・・・)
ひとまず以上です。
PlugCowboyを使ってみる

どうもこんにちは。新しくPlugCowboyが出ましたね。まだまだ開発中みたいですが、早速触ってみました。

## そもそもPlugCowboyとは

もともとPlugにはCowboyのAdapterが存在しており、それを経由してErlangで実装されているCowboyとやり取りをしていました。もともとAdapterはPlugプロジェクト内のモジュールとして存在してましたが、今回の変更でPlugCowboyとして別リポジトリとして切り出され、元あったやつは将来的に非推奨になります（現在のmasterではすでに非推奨になっています）。

## PlugCowboyを使う
### PlugCowboyを使うための事前準備

 まずはパッケージをインストールします。現在はhexにはプロジェクトは上がっておらず、gitから直接インストールする必要があります。

```elixir:mix.exs
  def deps do
    [
      {:plug_cowboy, github: "elixir-plug/plug_cowboy"},
    ]
  end
```

ちなみにPlugCowboyの依存しているパッケージは以下のものになります。

```elixir:mix.exs
  def deps do
    [ 
      {:plug, github: "elixir-plug/plug"},
      {:cowboy, "~> 2.5"},
      {:ex_doc, "~> 0.19.1", only: :docs},
      {:hackney, "~> 1.2.0", only: :test},
      {:kadabra, "0.3.4", only: :test}
    ]
  end
```

Plugはgithub上の最新のものみたいです。cowboyも2.5です。いいですねぇ。
あとはHTTP クライアントでhackney、HTTP/2クライアントでkadabraを使っています。

### HTTPリクエスト

では早速アプリケーションを動かしてみましょう。
まずは簡単なものから、一つのモジュールでリクエストとレスポンスを書いてみましょう。

```elixir:sample.ex
defmodule SandboxPlug.Sample do
  import Plug.Conn

  def init(options) do
    options
  end

  def call(conn, _opts) do
    conn
    |> put_resp_content_type("text/plain")
    |> send_resp(200, "Hello world")
  end
end
```

では起動させてリクエストを投げてみましょう

```elixir
> Plug.Cowboy.http SandboxPlug.Sample, []
```
```
$ curl http://127.0.0.1:4000
Hello world
```

無事に起動し、リクエストを投げるところまでできました。
ここで以前と変わったのはhttpの起動の仕方です。
以前は

```elixir
Plug.Adapters.Cowboy2.http SandboxPlug.Sample, []
```
でした。今回でAdapterが省略されたのとPlugCowboyを通してCowboyにリクエストを投げるようなりました。


### ルーティングの設定

次にルーティングの設定をしてみます。
まずはルーティングを行うモジュールを実装します

```elixir:router.ex
defmodule SandboxPlug.Router do
  use Plug.Router

  plug :match
  plug :dispatch

  get "/hello" do
    send_resp(conn, 200, "World")
  end

  match _ do
    send_resp(conn, 404, "oops")
  end

end
```
ここらへんは以前のPlugでの使い方と変わりはありません。
PlugCowboyを使いますが、URLでのルーティング自体はPlugを使います。

次にアプリケーションをみてみましょう。

```elixir:application.ex
defmodule SandboxPlug.Application do
  use Application

  def start(_type, _opts) do
    children = [
      Plug.Cowboy.child_spec(scheme: :http, plug: SandboxPlug.Router, options: [port: 4000])
    ]
    opts = [strategy: :one_for_one, name: SandboxPlug.Supervisor]
    Supervisor.start_link(children, opts)
  end
end
```
Supervisorの子プロセスとしてPlugCowboyをプロセスを起動させます。
その中に先ほど上記の方で実装したPlugのルーティングモジュールを指定します。
これで、起動させることでPlugCowboyのプロセスを起動させます。

ではこの状態でアプリケーションを起動させリクエストを投げてみましょう。

```
$ curl http://127.0.0.1:4410/hello
World
$ curl http://127.0.0.1:4410/fuga
oops
```

おぉ無事にリクエストを受け付けて、レスポンスを返してくれました。

## まとめ

簡単ではありますが、PlugCowboyの実装になります。
Phoenixを使ってると意識しないですが内部ではPlugを使っており、今回の変更は結構、大きい変更になると思います。
Plug自体の中をみるのもPhoenixの挙動を理解するのにかなりオススメです。
次はPlugCowboyの中身を読んでいきたいと思います。
Vue CLI v3でHotModuleReload(HMR)しないときの解決方法

# 解決方法
プロジェクトルート(package.jsonの隣）に以下　`vue.config.js` を追加する。

``` javascript:vue.config.js
module.exports = {
  devServer: {
    watchOptions: {
      poll: true
    }
  }
};
```

# 参考
https://github.com/vuejs/vue-cli/issues/2051#issuecomment-420320469
EmblukでS3に吐いた複数ファイルをGlueでカタログ化する際の注意

# 事象

EmbulkでS3に出力したファイルから、Glueでデータカタログを作成しようとしたところ、入力元データ1に対し、出力は複数だったため、カタログとしては1つでいいのだが、複数ファイル分カタログ（テーブル）ができてしまった。

# 対処案１：Embulkの出力を１つにする

Embulkは特に指定をしないと、実行したマシンのCPU数分タスクを動作させてファイルを出力するので、`min_output_tasks:１`とすれば、出力ファイルも１つになるので、カタログの問題は解消する。
だが、その場合Embulkの並列処理が活かせない。

# 対処案２：クロール対象を１つにする

Glueのクローラ設定で、『データストア』の項目にあるエクスクルードパターンを設定し、１ファイルのみが対象となるようにして対処することもできた。
Embulkの場合、XXXXXX.000.00.tsv.gzのようなファイルが（特にいじらなければ）吐かれるので、この000のファイルのみを対象とするのである。

| エクスクルードパターン | `**/**0[0-9][1-9]**` |
|:--|:--|

だがこの場合、テーブルのプロパティに表示される情報（例えばrecordCount）が、1ファイルのものとなっているため、複数ファイルも含めた全量はここから把握できない。

# 結論

Glueをデータの詳細を知るためのデータカタログとして使うのであれば、現状出力を1ファイルにまとめる必要がありそうだった。
Athenaで利用する定義として使うだけであれば、対処案２の方法でも良いと思う。


# 番外：よくわからない項目

『クローラに関する情報の追加』に『Grouping behavior for S3 data (optional)』という項目があり、感覚的にはこれのチェックをつけると、複数ファイルでもデータ構造が同じであれば1つとして認識してくれそうだったが、そんなことはなかった。

- Create a single schema for each S3 path
Visual Studio Code のスニペットでインクルードガードを作ってみる

C/C++ でヘッダファイルを作るときにインクルードガードを付ける必要がありますが、わざわざそのために VSCode の拡張機能をインストールしたくない、と思ったので VSCode のスニペット機能の紹介を兼ねて作ってみました。

スニペットの追加方法から説明すると、
1. メニューの ファイル(F)→基本設定(P)→ユーザースニペット(S) を開く
2. "cpp (C++)" を開く
3. 以下のように入力して保存する

```json
{
	// Place your snippets for cpp here. Each snippet is defined under a snippet name and has a prefix, body and 
	// description. The prefix is what is used to trigger the snippet and the body will be expanded and inserted. Possible variables are:
	// $1, $2 for tab stops, $0 for the final cursor position, and ${1:label}, ${2:another} for placeholders. Placeholders with the 
	// same ids are connected.
	// Example:
	// "Print to console": {
	// 	"prefix": "log",
	// 	"body": [
	// 		"console.log('$1');",
	// 		"$2"
	// 	],
	// 	"description": "Log output to console"
	// }
	↓この部分を追加する
	"Include Guard": {
		"prefix": "guard",
		"body": [
			"#ifndef $1",
			"#define $1",
			"#endif // $1"
		]
	}
}
```

これで追加できました。

使い方は、ヘッダファイルを新規作成して、**言語モードがC++**になっていることを確認し、```guard```と入力すると、（大抵は途中の ```gua``` くらいで）入力補完ウィンドウに```Include Guard （ユーザースニペット）``` と表示されます。補完キー (Ctrl+Space) を押しても良いです。
![2018-10-19.png](https://qiita-image-store.s3.amazonaws.com/0/235904/e0d6e673-24b3-39f5-2310-b045ecdf6cba.png)
それを選択 (Enter) すると、3行のプリプロセッサが挿入され、3箇所（スニペットの定義で```$1```と記述した部分）にカーソルが当たった状態になります。
![2018-10-19 (1).png](https://qiita-image-store.s3.amazonaws.com/0/235904/5e456070-0e39-ee9e-6405-d222260252c3.png)
あとは好きなマクロ名を入力すればOKです。
![2018-10-19 (2).png](https://qiita-image-store.s3.amazonaws.com/0/235904/15437bdc-553a-3c8b-b033-f731194b71ef.png)
ここで気づいたと思いますが、ファイル名からマクロ名を自動生成などはしませんので悪しからず。そこまで高機能なものが欲しければ拡張機能などを探してください！

ここまでで、C++だけに追加しましたが、必要であればCのスニペットファイルにも同様に追加してください。
「グローバルスニペットファイル」に追加しておけば言語を問わず使用できますが、他の言語のファイルを編集中に誤爆しても困りますので、私は言語ごとのスニペットファイルに追加しました。
install memo #1 conda

https://anaconda.org/

Deeplearning
```conda install caffe tensorflow chainer```
```conda install cudnn cupy```
```conda install pillow opencv```
```conda install pytorch torchvision```

conda環境切替
https://qiita.com/yampy/items/4e89cd97179bbd20f726
```conda env list```
```source activate base```
```source deactivate```
```conda create -n py27 python=2.7```

https://github.com/chainer/chainercv
```pip install -U numpy```
```pip install chainercv```
Excelの新機能「アイデア」の進化が止まらない！！

次の記事ではExcelのOfficeInsiderプログラムで使えるようになっているアイデア機能がすごいということを書きました。
<a href="https://qiita.com/yosatonet/items/c4dc3c6200ca8b535b79">Excelに実装されるアイデア機能のポテンシャル</a>
自動でピボットテーブルを作成してくれて、グラフ化までしてくれるという、Excelのハードルをグンと下げる機能だと期待しています。
本日、またこのアイデア機能を使ってみたら、更に進化していました。
# データの分析文書を日本語で作成してくれる
以下のようなデータを作って、ホームタブのアイデア機能で処理してみました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/247287/1e91cc12-f93f-9cd2-c5cf-7ed428eb1b76.png)
結果、このような分析結果が。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/247287/8bd3e271-b83b-74b1-ea8b-785a75bfdfe1.png)
ここですごいと思ったのは、同じ相関の表現でも、「強く依存」と「高い相関性」という２つの分析結果に分かれます。
# 実際の分析結果
実際の「強く分析」のほうのグラフの結果は次の通り（R² = 0.1702）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/247287/9a283495-7b23-13b6-6501-44b5f3ddd1fa.png)
「高い相関性」のほうのグラフの結果は次の通り（R² = 0.5459）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/247287/46c360bc-2954-f15f-9c76-1d2111ed1fd6.png)
もしかしたら相関係数によって表現を変えているのかもしれません。
逆相関（R= -1）では特にコメントなしのようです。
ここも逆相関というコメントが欲しいところではあります。
おでんの売上と気温の関係とか。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/247287/fc0b9730-b253-b3bc-65f8-846724a1e074.png)
# まとめ
Excel分析が苦手な人でもアイデア機能でレポート用の結果がコメントされる。
Excelなので機械的に結果を出したものなので、誰が分析しても同じ答えになるだろう。
なんとなくこうだろうがExcelによってお墨付きになる！
このあたりがメリットになりそうですね。
ビジネスでは分析すべき売上データなどが分析されずにそのままになっていることもありますが、宝の山を捨てているようなものなので、こういった機能を活用してほしいと思います。
【Embulk】OracleからTSV形式でデータを抜き出す

# Embulkを使ってOracleからデータをTSVでダンプする

[利用しているOracle(sqlplus)のバージョンによっては、抜き出す機能もありそうなのだが](https://www.oracle.com/technetwork/jp/database/articles/tsushima/tsushima-hakushi-62-3900161-ja.html)、自分の環境では利用できなかったので、Embulkを利用した。

## TSV出力

以下のようなファイルを作成し、環境変数で必要なデータを渡して`embulk run exporter.yml.liquid`すると、指定のディレクトリ配下（`/exporter/{{ env.EXPORT_DATE }}`）に出力される。


```yml:exporter.yml.liquid
in:
  type: oracle
  driver_path: {{ env.DB_DRIVER_PATH }}
  driver_class: oracle.jdbc.driver.OracleDriver
  url: jdbc:oracle:thin:@{{ env.DB_THIN }}
  user: {{ env.DB_USER }}
  password: {{ env.DB_PASSWORD }}
  query: |
      SELECT *
      FROM {{ env.SCHEMA }}.{{ env.TABLE }}

out:
  type: file
  path_prefix: /exporter/{{ env.EXPORT_DATE }}/{{ env.TABLE }}-
  file_ext: tsv
  formatter:
    type: csv
    delimiter: "\t"
    quote_policy: ALL
    newline: LF
```

### gzipで出力

gzipで出力する場合は、encodersの設定を入れつつ、拡張子を繋げる。

```yml

out:
  type: file
  path_prefix: /exporter/{{ env.EXPORT_DATE }}/{{ env.TABLE }}-
  file_ext: tsv.gz
  formatter:
    type: csv
    delimiter: "\t"
    quote_policy: ALL
    newline: LF
  encoders:
  - {type: gzip, level: 6}
```

### 出力先をS3に

出力をS3にする場合は、embulk-output-s3プラグインを利用して、以下のように記述する。

```yml
out:
  type: s3
  path_prefix: {{ env.DIR_PATH }}/{{ env.TABLE }}-
  file_ext: .tsv.gz
  sequence_format: "%03d.%02d"
  bucket: 出力先バケット名
  endpoint: s3-ap-northeast-1.amazonaws.com
  formatter:
    type: csv
    delimiter: "\t"
    quote_policy: ALL
    newline: LF
  encoders:
  - {type: gzip, level: 6}
```

S3プラグインはfile_extとsequence_formatに設定した値の解釈が、fileプラグインと挙動が違うため、合わせるにはこのようにする必要があった。


# 失敗談

最初は以下のようにurl側でスキーマを指定し、tableとselectを利用して指定していたが、うまくいかず上記の方法に変更している。


```yml
in:
  type: jdbc
  driver_path: {{ env.DB_DRIVER_PATH }}
  driver_class: oracle.jdbc.driver.OracleDriver
  url: jdbc:oracle:thin:@localhost:1521:{{ env.SCHEMA }}
  user: {{env.DB_USER}}
  password: {{env.DB_PASSWORD}}
  table: error_message
  select: "*"
```

今思い返すと、自分の環境ではthinをDESCRIPTIONを使って細かく指定しなければいけなかったので、
CONNECT_DATAのINSTANCE_NAMEにスキーマを渡すように書けば、うまくいっていたかもしれない。

そして悪戦苦闘の結果、`exporter.yml.liquid`ではinのtypeを`oracle`にしているが、使っているのは実質jdbcプラグインの項目なので、`jdbc`にしても大丈夫なはず。
swift4でカスタムオブジェクトをNSUserDefaultsに保存・読込する

## 環境

```
Xcode Version 10.0 (10A255)
Apple Swift version 4.2
```

## はじめに

こんなカスタムクラスがあったとして、これを`NSUserDefaults`に保存できるようにします。

```swift:Task.swift
import Foundation

class Task: NSObject {
    
    let text: String
    let deadline: Date
    
    init(text: String, deadline: Date) {
        self.text = text
        self.deadline = deadline
    }
    
    init(from dictionary: [String: Any]) {
        self.text = dictionary["text"] as! String
        self.deadline = dictionary["deadline"] as! Date
    }
}
```

## 実装

### カスタムクラスの修正

`NSCoding`プロトコルに準拠するようにメソッドを追加します。

```swift:Task.swift
import Foundation

class Task: NSObject, NSCoding {
    
    let text: String
    let deadline: Date
    
    init(text: String, deadline: Date) {
        self.text = text
        self.deadline = deadline
    }
    
    init(from dictionary: [String: Any]) {
        self.text = dictionary["text"] as! String
        self.deadline = dictionary["deadline"] as! Date
    }
    
    func encode(with aCoder: NSCoder) {
        aCoder.encode(text, forKey: "text")
        aCoder.encode(deadline, forKey: "deadline")
    }
    
    required init?(coder aDecoder: NSCoder) {
        text = aDecoder.decodeObject(forKey: "text") as! String
        deadline = aDecoder.decodeObject(forKey: "deadline") as! Date
    }
}
```

### `NSUserDefaults`から読み込む

```swift
var tasks: [Task]!
let userDefaults = UserDefaults.standard
let taskData = userDefaults.object(forKey: "tasks") as? Data
guard let t = taskData else { return }
let unArchiveData = try? NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(t)
tasks = unArchiveData as? [Task] ?? [Task]()
```

### `NSUserDefaults`に保存する

```swift
let encodedTask = try? NSKeyedArchiver.archivedData(withRootObject: tasks, requiringSecureCoding: false)
let userDefaults = UserDefaults.standard
userDefaults.set(encodedTask, forKey: "tasks")
userDefaults.synchronize()
```

以上です :hugging: 

次は`NSSecureCoding`のパターンを実装して、記事にまとめようと思います :kissing_smiling_eyes:
python 2to3

2to3
https://docs.python.jp/3.3/library/2to3.html
http://diveintopython3-ja.rdy.jp/porting-code-to-python-3-with-2to3.html

other
https://www.valinux.co.jp/technologylibrary/document/pl/python0003/

python version
https://note.nkmk.me/python-sys-platform-version-info/

map
https://www.sejuku.net/blog/24759
Railsバリデーションまとめ

#バリデーションを行なう理由
バリデーションは、正しいデータだけをデータベースに保存するために行われます。

#バリデーションヘルパー
##よく見るやつ
###format

```
validates :email, format: { with: /\A[a-zA-Z]+\z/}
```
formatはwithオプションを指定した正規表現と一致するかどうかを調べます。


###inclusion

```
 validates :number, inclusion: { in: (1..100)}
```
inclusionは与えられた集合に属性の値が含まれているかどうかを検証します。


###length

```
validates :name, length: { maximum: 20 }
```

length属性の値の長さを検証します。多くのオプションがあり、長さ制限をさまざまな方法で指定できます。

:minimum - 属性はこの値より小さな値を取れません。
:maximum - 属性はこの値より大きな値を取れません。
:in または :within - 属性の長さは、与えられた区間以内でなければなりません。このオプションの値は範囲でなければなりません。
:is - 属性の長さは与えられた値と等しくなければなりません。



###presence

```
validates :name, presence: true
```

presenceは指定された属性が空でないことを確認します。値がnilや空文字でない(つまり空欄でもなければホワイトスペースでもない)ことを確認するために、内部ではblank?メソッドを使用しています。




###uniqueness

```
validates :email, uniqueness: true
```
uniquenessはオブジェクトが保存される直前に、属性の値が一意であり重複していないことを検証します。

###その他にもある

#共通のバリデーションオプション
###:allow_nil

```
validates :name, length: { minimum: 5 }, allow_nil: true
```

:allow_nilオプションは、対象の値がnilの場合にバリデーションをスキップします。
###:allow_blank

```
validates :name, length: { minimum: 5 }, allow_blank: true
```


このオプションを指定すると、値が空の場合はバリデーションを実行しません。
属性の値がblank?に該当する場合にバリデーションがパスします。blank?に該当する値にはnilと空文字も含まれます。
###:message

```
validates :email, format: { with: /\A[a-zA-Z]+\z/,
    message: "英文字のみが使用できます" }
```

:messageオプションを使用することで、バリデーション失敗時にerrorsコレクションに追加されるカスタムエラーメッセージを指定できます。このオプションを使用しない場合、Active Recordはバリデーションヘルパーごとにデフォルトのエラーメッセージを使用します。

###:on

```
validates :email, presence: true, on: :create     　←create時にバリデーション
```

:onオプションは、バリデーション実行のタイミングを指定します。ビルトインのバリデーションヘルパーは、デフォルトでは保存時に実行されます。これはレコードの作成時および更新時のどちらの場合にも行われます。バリデーションのタイミングを変更したい場合、on: :createを指定すればレコード新規作成時にのみ検証が行われ、on: :updateを指定すればレコードの更新時にのみ検証が行われます。






参考：https://railsguides.jp/active_record_validations.html#%E5%85%B1%E9%80%9A%E3%81%AE%E3%83%90%E3%83%AA%E3%83%87%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%AA%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B3
管理設定


sudo不要
https://qiita.com/RyodoTanaka/items/e9b15d579d17651650b7

PATH
https://qiita.com/Naggi-Goishi/items/2c49ea50602ea80bf015

プロクシ
https://qiita.com/sachioksg/items/289e40d69382b1d09811

VNC
http://chie8842.hatenablog.com/entry/2017/03/26/152619
Ansibleでディレクトリ単位のバックアップを行う

## 結論
synchronize モジュール × delegate_toを使いましょう。
copyモジュールでは、対象サーバ内でのディレクトリ単位でのコピーが出来ないため。

### 参照
[Ansibleの操作対象ホスト上でファイルやディレクトリをコピーする：synchronizeモジュールの振る舞い - Qiita](https://qiita.com/yunano/items/5c6f07329d1de13cf63f)

## copy モジュールで利用できず詰まった
copyモジュール × remote_src で出来そうだな～と思って実行すると、以下のエラーが出ます。

```
Remote copy does not support recursive copy of directory
```

えぇ～。
また、copyモジュールでのエラーメッセージで検索しても日本語のページが出てこなかったので詰みます。

GitHub上には、ちょうどよいissueがあってみてたんですが、synchronizeについての記載は目に入らずスルーしてました。
[Allow copy module to work with recursive and remote_src · Issue #14131 · ansible/ansible](https://github.com/ansible/ansible/issues/14131)
ISOファイルのディスクラベルを編集する、Perlで

## 前提
Windowsのフリーソフト使えばできそうだが怪しいやつしかないしインストーラ使わなきゃいけないやつばかりで環境的に無理。
Linuxでちゃちゃっと出来たらいいな、と思って調べた。

## 結論
Perlスクリプトを書く

### 参照
- [linux - Is there a way to change a .iso files volume id from the command line? - Server Fault](https://serverfault.com/questions/361474/is-there-a-way-to-change-a-iso-files-volume-id-from-the-command-line/361479)

``` Perl
#!/usr/bin/perl
use strict;
use warnings;

die "Use: $0 <iso_file> <new volume id>\n" unless @ARGV == 2;
open my $file, "+<", $ARGV[0] or die "Cannot open: $!";
seek $file, 0x8028,0;
printf $file "%-32.32s", uc($ARGV[1]);
```

上記回答のスクリプトを保存して、実行権限つけて、isoファイルのパス, 新しいディスクラベル を指定して実行。
Windowsでも動くかは確認してないですごめんなさい。

## 余談
OSインストールのためにドライバが足りないサーバがあって、ドライバ用のisoをマウントしなきゃいけないかつ、ISOファイル内のラベルをOEMDRVに変更する必要があった。
[6.2. インストール中にドライバーを更新するための準備 - Red Hat Customer Portal](https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/installation_guide/sect-driver-updates-during-installation-preparing-x86)
あなたが表示してほしいと言って差し出したその手に握られていたのは 00P から始まる画像 ID だった

最近、コミュニティ用のコンポーネントで画像を扱う機会があり、そのあたりの試行錯誤についての備忘録です。
（件名は良いタイトルが思いついたら変更します!)


## オブジェクト別画像表示URL
よく忘れて何回も調べるので書きておきます。

```html:添付(Attachment)の場合
  <img src="/servlet/servlet.FileDownload?file=00PXXXXXXXXXXXXXXX" />
```

```html:ファイル(ContentVersion)の場合
  <img src="/sfc/servlet.shepherd/version/download/068XXXXXXXXXXXXXXX" />
```
添付の場合は、画像の親レコードへのアクセス権が必要ですが、比較的どこからでも簡単にアクセス出来るので便利な印象です。
一方、ファイルの方が制限が厳しいイメージです。ゲストユーザなどのアクセスも出来ないようなので、利用時には注意が必要ですね。

## いい感じに画像表示用のURLを作成してくれるメソッド
表示したい画像のIDを受け取り表示先やユーザに合わせてURLを作成してくれるメソッドを書いてみました。
ゲストユーザなどは、URLでのアクセスが出来ず、やむを得ずBase64で返すようにしました(なので４MBくらいまでの画像しか扱えないですね)
足りていないケースが有ったら随時追加していきたかったので、かなり冗長的なコードになっています。

####対応オブジェクト
- Attachment(00P)
- ContentVersion(068)
- ContentDocument(069)

```java:
public static Object getImageSource(String recordId) {

    // 表示サイトの識別 
    Boolean isLEX = String.isBlank(Site.getSiteId());
    Boolean isSite = String.isNotBlank(Site.getSiteId());
            
    // ユーザタイプの識別
    Boolean isInternalUser = Auth.CommunitiesUtil.isInternalUser();
    Boolean isGuestUser = Auth.CommunitiesUtil.isGuestUser();
               
    // オブジェクトタイプを識別
    Boolean isAttachment = recordId.startsWith('00P');
    Boolean isContentVersion = recordId.startsWith('068');
    Boolean isContentDocument = recordId.startsWith('069');

    String src = '';
    if (isLEX && isAttachment) {
        src = '/servlet/servlet.FileDownload?file=' + recordId;
    } else if (isLEX && isContentVersion) {
        src = '/sfc/servlet.shepherd/version/download/' + recordId;
    } else if (isLEX && isContentDocument) {
        ContentVersion content = [SELECT Id FROM ContentVersion WHERE ContentDocumentId =: recordId ORDER BY VersionNumber DESC][0];
        src = '/sfc/servlet.shepherd/version/download/' + content.Id;
    } else if (isSite && isAttachment) {
        src = Site.getBaseUrl() + '/servlet/servlet.FileDownload?file=' + recordId;
    } else if (isSite && isContentVersion && isInternalUser) {
        src = Site.getBaseUrl() + '/sfc/servlet.shepherd/version/download/' + recordId;
    } else if (isSite && isContentVersion && !isInternalUser) {
        ContentVersion content = [SELECT Id, FileType, VersionData FROM ContentVersion WHERE Id =: recordId][0];
        src = 'data:image/' + content.FileType + ';base64,' + EncodingUtil.base64Encode(content.VersionData);
    } else if (isSite && isContentDocument && isInternalUser) {
        ContentVersion content = [SELECT Id FROM ContentVersion WHERE ContentDocumentId =: recordId ORDER BY VersionNumber DESC][0];
        src = Site.getBaseUrl() + '/sfc/servlet.shepherd/version/download/' + content.Id;
    } else if (isSite && isContentDocument && !isInternalUser) {
        ContentVersion content = [SELECT Id, FileType, VersionData FROM ContentVersion WHERE ContentDocumentId =: recordId ORDER BY VersionNumber DESC][0];
        src = 'data:image/' + content.FileType + ';base64,' + EncodingUtil.base64Encode(content.VersionData);
    }

    return src;
}  
```
松尾研公開講座 Deep Learning 基礎講座 復習 #3 MLP

Deep Learning基礎講座 第３回講義の復習ノートです。
先日の復習ノート: https://qiita.com/shuent/items/aa2f89ae6fca08619215
講座: https://deeplearning.jp/lectures/dlb2018/

今回は、MLPの理解と実装を通して、ニューラルネットワーク(NN)の概念を学ぶ、という内容です。

\#2,#3を乗り越えればちゃんとついていけるということなので、頑張りましょう。前回と同じく、個人的なまとめなので、網羅した資料はスライドをご覧ください。

参考資料
https://www.deeplearningbook.org/ の5,6章。

## 講義まとめ
- おさらい+問題点
    - 学習とは: T:Task(目的)のためにE:Experienceから学び、どの程度達成されたかをP:MeasureしてまたEをもとに向上すること。
    - ロジスティック回帰は閉形式では解けないから、勾配法でパラメータを求める。
    - 線形回帰は、パラメータを正規方程式で解けるから閉形式。
    - この二手法の弱点は線形分離の仮定をすること。非線形データが分離不可。
    - 非線形な例はXORデータ。
- MLP: Multi Layer Perceptron 多層パーセプトロン
    - 非線形なデータを分離する基本的なアイディアは、データを高次元空間に写像φし、超平面で区切ること。
        - SVMでのイメージ: https://www.youtube.com/watch?v=3liCbRZPrZA
    - 方法1: 汎用関数を使う:カーネル関数、SVMなど
    - 方法2: 特殊な関数を設計する: 人間による特徴設計。例: ツイートから地震検知「揺れた」+短い文字数 にしたらうまくいった
    - 方法3: 大量のデータで関数φ自体を学習: MLPなどのNN手法
    - MLP
        - 回帰：１回の変換、MLP：複数の変換。隠れ層がある
        - アフィン変換だけだと線型結合なので非線形に対応しないから、どこかで非線形な関数を使う。
        - 非線形な関数の例：sigmoid, Tanh, ReLU
        - 順伝播、誤差逆伝播と連鎖律
- 次回
    - モデル容量増加による勾配爆発・消失問題、過剰適合への解決法
    - 正則化(DL7章)、最適化アルゴリズム(8章)

## 復習
閉形式：初等関数の合成により解を表せること

以下MLPについて。
### 隠れ層
<img width="755" alt="Screen Shot 2018-10-19 at 18.21.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/83242/355390e6-ea04-fd83-785e-12485df21ec0.png">
講義スライドより。

左は単一パーセプトロン、右が多層(これは2層)パーセプトロン。MLPの真ん中のユニット、`h = W_1x+b_1`が隠れ層。隠れ層を活性化関数に入れて、アウトプットを出す。

隠れ層が複数の時、隠れ層jを表すと

```math
h_j = f_j(u_j) = f_j(W_j^T h_{j-1} + b_j )
```
ただし、$f$は活性化関数、$W$は行列、それ以外の文字はベクトル。最終的なアウトプットはこれを再帰的に繰り返し得られる。（順伝播）

### 誤差逆伝播　バックプロパゲーション
どうやってパラメータ W,bを求めるか？出力形式によって決まる。基本ロジスティック回帰と同じように、勾配法で求めるが、計算量削減と局所解トラップ回避のために入力データを層ごとにランダムで使う：確率的勾配法。

誤差関数を次で定義する。（２乗誤差を最小化するのによく使われる形）$N'$はミニバッチを表す。tは正解データ

```math
E(\theta) = 1/N' \sum_{n \in D} E_n(\theta) \\
E_n = (y_n - t_n)^2
```
パラメータで偏微分する. ここで$W^{(L)}$は最終層の重み。

```math
\frac{\partial E}{\partial W^{(L)}} = \frac{\partial E}{\partial y} \frac{\partial y}{\partial W^{(L)}}
```
隠れ層の重みW(l)に関する偏微分は
<img width="979" alt="Screen Shot 2018-10-19 at 20.42.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/83242/ba6b6d4f-ea72-22ff-8a6d-732cbc225470.png">
(スライドより)

あとは誤差逆伝播に関して参考サイトが詳しかったので見て見てください。(手抜き)

手順

順伝播と誤差逆伝播、パラメータ更新を繰り返して、パラメータが収束するまで続けます。この図がすごくわかりやすいので引用します。

<img src="http://hokuts.com/wp-content/uploads/2016/05/forward_back.png">
http://hokuts.com/2016/05/29/bp1/ より

## 参考
http://hokuts.com/2016/05/29/bp1/
https://qiita.com/Ugo-Nama/items/04814a13c9ea84978a4c
https://alphaimpact.jp/2017/05/11/multilayer-perceptron/
FormDataを使いjQueryでAjax送信

# 前書き
初めてjQueryを用いてajax送信をしたので、忘れないようにメモ書き

# コード
```javascript
var hoge = "hoge";
fData = new FormData();
        fData.append('hoge', hoge);
        $.ajax({
            url: "hoge.php",
            type: 'POST',
            data: fData ,
            contentType: false,
            processData: false,
            success: function(data) {
              alert(data);
            },
            error: function(){
              alert("error");
            }
```

# あとがき
`contentType: false`と`processData: false`の指定を忘れないように注意  
***コードを書き終わってから気がついたが、書き方が古いようなので`$ajax`の使い方をもう少し勉強する必要がありそう***
4Kのフラクタル画像作ってみた


# 使ったツール
[CodePen](https://codepen.io) と p5.js (processing) を使いました。
ビジュアルプログラミング久々なので何を使うか迷いました。(node.js, OpenGL, svg など)



コードはこれです。
https://codepen.io/anozon/pen/GYdQMW
![fractal_prisum_-_p5_js.png](https://qiita-image-store.s3.amazonaws.com/0/283120/b59f3aa4-9928-f17d-728f-022e707fae7b.png)



# 再帰処理の最適化
再帰だけど processing の copy 使って超高速化出来ました。
[copy\(\) \\ Language \(API\) \\ Processing 3\+](https://processing.org/reference/copy_.html)
copy の計算オーダーはわかりませんが明らかに早くなったので使いました。

再帰関数の呼び出しが 3 ^ 11 回 から 11回 になりました。



# 画像出力の仕方
画像 export するスマートな方法が思いつきませんでしたが、
canvas 要素から img 変換する方法を使いました。

```
const canvas = document.getElementById("canvas-container");
const img = canvas.toDataURL("image/png");
document.write('<img src="'+img+'"/>');
```

CodePen にもスクリーンショット機能はついていたんですがサイズが HD でした。
[Screenshots \- CodePen Blog](https://blog.codepen.io/documentation/api/screenshots/)

# 完成品

<blockquote class="twitter-tweet" data-partner="tweetdeck"><p lang="ja" dir="ltr">フラクタル <a href="https://t.co/guvWtXV21H">pic.twitter.com/guvWtXV21H</a></p>&mdash; あのぞん😎 (@anozon) <a href="https://twitter.com/anozon/status/1053246863879499777?ref_src=twsrc%5Etfw">October 19, 2018</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

拡大すると荒い？ですね。
ちなみにフラクタル次元は(色は無視するとして)

は 1/4 に縮めると2つの自己相似構造が必要になるので、そのフラクタル次元はこのように求められる


## 他に思ったこと

* 次はもっと 4K の画素数に合わせたフラクタルを作りたい。
* CodePen に prettier 欲しい。
* 4K 壁紙ってどこにアップロードすべきなんだ？

ありがとうございました。
技術系の調査をするときのアプローチ方法とか

プログラマという職業をしているとMicrosoft系の情報はブラックボックスで、知りたい情報が見つからないというときのアプローチ方法。今はオープンになっている部分もあるので、使えるものは使いたいという人向け。


#はじめに
この記事には一部正統ではない手法とかも書いています。
試してみる場合は個人の責任とモラルをもってお願いします。


#20年くらい前は・・・
圧倒的に情報がありませんでした。興味のある分野はメーリングリストに参加したり、ユーザグループに参加して最新の情報を集めるのが中心でした。

上下巻で数万円する専門書を買ってAPIを調べたりAPI Viewerで調べたりしていました。C++の場合は、見れる範囲でヘッダやコード見て調べたり。ただし、セキュリティやカーネル周り情報が少なくDLLを直接開いて末尾の関数名から推測して呼び出していました。

レジストリの中からキーワードを探すのも有効でした。TCP/IPの仕様が内部的に変更されたときは見慣れないキーからMicrosoftのエンジニアさんのブログを見つけて、どのように変更したかを調べたりもしました。

今はツールも充実していて、DLLの依存関係やら[Dependency Walker](http://www.dependencywalker.com/)で大体の情報は得られることが多いですが、MFCのバージョンアップでソートのアルゴリズムが変わったときなどはSDK周りやMFCからソースを探したりして裏を取ったりしました。


##.NETになってからは
10年くらい前は、
・API周りは[pinvoke](https://pinvoke.net/)
・テクニック系のことは[codeproject](https://www.codeproject.com/)

で情報を漁っていました。日本では相変わらずカーネル周りやセキュリティ周りの情報は少なかったのですが、海外には色々なテクニックとかを披露されていた方も多かったのでかなり勉強になりました。


##.NETが出た当初は
Visual Studioが出た当初ユニバーサルエディションを50万で購入しましたがバグも多く、これも日本語の情報量がまったくと言っていいほど少なかったです。

System.Windows.Forms.Controlというクラスに継承に致命的なバグがあり、該当箇所のCLR見てMicrosoftに「ここの継承はこうあるべき」と修正箇所をメールに添付して直してもらったり、ADOとDataGridのバインディングにも不具合があったり結構調べて直してもらった記憶があります。

##.NET周りのソースが知りたい場合は、

[referencesource](https://referencesource.microsoft.com/)

今は上記から探すことが可能。LINQ周りの挙動であるとか、ソートアルゴリズムの調査などはここで調べたりすることができます。


###この記事を書こうと思ったきっかけ

[ゴミ記事問題への初心者のポエム](https://qiita.com/mosamosa/items/acf8966bf0269bead08d)

この「誰でも最初は初心者です」の一言から。


ゴミ記事問題について私が口を挟むことではないので言及しませんが、20年前と比べると確実に情報量が増えています。ひと昔前は、日本は情報公開とか情報共有という文化がまだ根付いていなかったので、このQiitaとか便利な世の中になったと感じています。

初心者であろうと、ベテランであろうと記事は書けばいいと思います。日本の記事が増えるということはイノベーションの促進にもつながるし、より良い未来を作るためには必要だと感じています。
FirebaseAnalyticsのBigQueryから日次で中央値を取得する


最近エンジニア業より、データ解析・マーケティングの仕事がふえてきました。

今回、アプリの初回設定値の中央値の推移を追いたくなったので、日毎に中央値を取得して見ました

下記は、firebase_tableのInitというイベントのinit_valパラメータの中央値を過去28日分、日次で集計しています

```
WITH TABLE AS
  (SELECT event_date AS DAY,
          /* 
            percentile_cont(値, 0.5)で、中央値を取得可能
            PARTITION BY event_dateとすることで、日次で中央値が取得できる
           */
          percentile_cont(value.int_value, 0.5) over(PARTITION BY event_date) AS medium
   FROM firebase_table,
        UNNEST (event_params) AS event_p
   WHERE _TABLE_SUFFIX BETWEEN FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE(), INTERVAL 28 DAY)) AND FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE(), INTERVAL 1 DAY))
     AND event_name = "Init"
     AND KEY = "init_val")
     
/* 
  上記のテーブルだと
  | day | value.int_value | medium |
  | 20181014 | 1 | 3 |
  | 20181014 | 5 | 3 |
  | 20181014 | 2 | 3 |
  | 20181014 | 3 | 3 |
  | 20181014 | 4 | 3 |
  | 20181014 | 5 | 3 |
  | 20181014 | 3 | 3 |
  | 20181014 | 1 | 3 |
  | 20181014 | 1 | 3 |

  みたいになるので、同じday, mediumのレコードが大量に表示されるのをgroup byでday毎にまとめている
  minをつかってるが、全部同じ値なので、minでもmaxでもavgでもなんでもいい
 */
SELECT min(DAY) AS d,
       min(medium) AS m
FROM TABLE
GROUP BY DAY,
         medium
```
MPEG-2 TSファイル処理 -PCRを使用したTSファイルの解析 ビットレートの算出-

#はじめに
[前回](https://qiita.com/sagesagesagesagesage/items/50bbc6dd38daebbd42b6)はTSファイルからPCRを取得して表示してみました。今回は、PATやPMTの解析をする予定でしたが、予定を変更してPCRを使用したTSファイルの解析を行いたいと思います。

とりあえずTSファイルの解析としてTSファイルのビットレートを算出してみます。TSファイルには複数のストリーム（サービス）が含まれている場合が有りますが、今回求めるのはそれを全て合算したものになります。

プログラムは以下を参照ください。
https://github.com/sagesagesagesagesage


# ビットレートの計算方法
ビットレートの計算は以下の様に行います。

- TSファイルの先頭のPCR(s)を取得
- **一定個数(N)**のPCRを読み込むまでTSファイルを末尾に向けてシーク
- N個目のPCR(e)を読み込むまでのTSパケットのSizeをPCR(e)-PCR(s)で除算
- さらに27MHzで除算しビットレートbps(bit per second)を算出

```math
ビットレート = Size ÷ ( PCR(e) - PCR(s) ) ÷ 27,000,000
```

イメージです。

![pcr.png](https://qiita-image-store.s3.amazonaws.com/0/286729/7123445a-d863-9934-3f75-d5da899b7036.png)

# プログラム
以下の様な関数を作成しました。N個は引数で与えるようにしています。また、PCRは最大値から最小値の0へ戻る場合が有る。その場合、簡易的にPCR(s)を再取得するようにした。

```
/**
* @brief		Calculate bit rate of TS file
* @param[in]	ts_file			TS file path
* @param[in]	use_pcr_count	Sampling PCR count
* @return		double			bitrate. if error return 0.0
*/
static	double		ts_calc_bitrate( const char* ts_file, const uint32_t use_pcr_count )
{
	FILE*		ifp = NULL;
	
	uint8_t		ts_packet[ TS_PACKET_SIZE ];
	
	uint64_t	total_packet = 0;
	
	uint64_t	start_pcr = PCR_NONE;
	uint64_t	end_pcr = PCR_NONE;
	int			pcr_count = 0;
	double		bitrate = 0.0;
	uint16_t	pcr_pid = PID_NULL;
	
	ifp = fopen( ts_file, "rb" );
	total_packet = 0;
	if( ifp ){
		while( TS_PACKET_SIZE == fread( ts_packet, 1, sizeof( ts_packet ), ifp ) ){
			if( TS_SYNC_BYTE != ts_packet[ 0 ] ){
				break;
			}
			
			if( 0 < pcr_count ){
				total_packet++;
			}else{
				total_packet = 0;
			}
			
			if( ts_packet[ 3 ] & TS_ADAPTATION_FIELD ){			// Is adaptaion_file ON ?
				if( ts_packet[ 5 ] & ADAPTATION_FIELD_PCR ){	// PCR Flag ?
					if( PID_NULL == pcr_pid ){
						pcr_pid = GET_PID( ts_packet[ 1 ], ts_packet[ 2 ] );
					}
					
					if( pcr_pid != GET_PID( ts_packet[ 1 ], ts_packet[ 2 ] ) ){
						continue;
					}
					
					if( 0 == pcr_count ){
						GET_PCR_EXT( &ts_packet[ 6 ], start_pcr );
						DEBUG_PRINT( "Start PCR = %lu\n", start_pcr );
						pcr_count++;
					}else if( 0 < pcr_count ){
						GET_PCR_EXT( &ts_packet[ 6 ], end_pcr );
						
						if( start_pcr > end_pcr ){
							DEBUG_PRINT( "PCR RESET %lu => %lu\n", start_pcr, end_pcr );
							pcr_count = 0;
							total_packet = 0;
							continue;
						}
						
						pcr_count++;
						
						if( use_pcr_count < pcr_count ){
							break;
						}
					}
				}
			}
		}
		fclose( ifp );
		
		if(    ( PCR_NONE != start_pcr )
			&& ( PCR_NONE != end_pcr ) ){
			DEBUG_PRINT("End   PCR = %lu / Total = %lu\n", end_pcr, total_packet );
			bitrate = ( total_packet * TS_PACKET_SIZE * 8 ) / ( ( end_pcr - start_pcr ) / ( double )PCR_CLOCK_EXT );
			DEBUG_PRINT( "TS Bitrate = %lf\n", bitrate );
		}
	}
	
	return bitrate;
}
```


# おわりに
今回は予定を変更してPCRを使用してTSファイルのビットレートを算出してみました。ビットレートが求まるとTSファイルのシークや一定レートでの送出に使用できます。

次回こそPATやPMTの解析をする予定です。
Macでコマンドから指定したURLをChromeで開く

## やりたいこと

Macでコマンドから、特定のURLをGoogle Chromeで開きたいです

## コマンド

以下のコマンドできます

```bash
open -a '/Applications/Google Chrome.app' <URL>
```

### 具体例

以下は<https://qiita.com>を開く例です。

```bash
open -a '/Applications/Google Chrome.app' https://qiita.com
```

## 参考

[macos - How can I open a URL in Google Chrome from the terminal in OS X? - Super User](https://superuser.com/a/521642/955497)