OmniAICreator/Qiita-1.07M huggingface dataset:
AppStore Connectの役割の権限について

昨日付け(2019/02/12)で Apple Developer WebサイトとApp Store Connectの間でチームとアカウント権限が統一されました。

公式ドキュメントは[こちら](https://developer.apple.com/jp/support/teams/)

変更点などは公式ドキュメントが一番わかりやすいです。

Apple Developer のAgent,Admin,Memberの権限は廃止され、Apple Developer WebサイトのAccount > People から、AppStore Connectのユーザーとアクセスへ飛ぶようになりました。

ではそれぞれの権限でできることについてまとめていきたいと思います。

#Account Holder
Apple との契約を締結する担当者です。1アカウントしか設定できません。
Admin権限も持ちます。
以前のLegal権限はAccount Holderに名前が変更されましたが、内容に変更はありません。

#Admin
Adminは全てのApp にアクセスできます。
以前のAppStore ConnectアカウントのAdminと変更点はありません。
![スクリーンショット 2019-02-13 16.54.29.png](https://qiita-image-store.s3.amazonaws.com/0/355868/6aaa9aa4-fe50-e8b5-137d-68287b657da1.png)

#App Manager
App Managerは自動的にDeveloper権限も付与されます。
Developer権限では不可能なAppStore情報の編集や審査の提出などが可能です。
Appに関することは全てできるようです。
Access to Reports権限を付与することもできます。
![スクリーンショット 2019-02-13 16.53.41.png](https://qiita-image-store.s3.amazonaws.com/0/355868/a07fd590-fe83-8722-6cb5-7737bb53ec9b.png)

#Developer
Appの開発用。
TestFlightにビルドをアップロードするところまでできます。
開発としての権限が最小限しかできないという印象です。
Access to Reports権限を付与することもできます。
今までApple Developerアカウントのみの登録だったメンバーは(Apple DeveloperでAdmin権限でも)自動的にDeveloperになっているようです…
![スクリーンショット 2019-02-13 16.54.51.png](https://qiita-image-store.s3.amazonaws.com/0/355868/28bfe150-34f6-29e4-43f9-68d90d9ee67d.png)

#Marketer
マーケティング資料とプロモーション用アートワークを管理できます。
Access to Reports権限を付与することもできます。
MarketerはDeveloperとほぼ変わらない権限ですが、TestFlightにビルドをアップロードすることは出来ません。
![スクリーンショット 2019-02-13 17.03.21.png](https://qiita-image-store.s3.amazonaws.com/0/355868/4d88274f-9373-6554-d708-a4f2c2220db9.png)

#Finance
支払と財務報告、売上とトレンド、App アナリティクスですべての App を表示できます。
![スクリーンショット 2019-02-13 16.53.55.png](https://qiita-image-store.s3.amazonaws.com/0/355868/d9fd2e7f-e0b3-28c5-f592-9a1970bccf72.png)

#Access to Reports
Sales権限も自動的に付与されます。
Reportへアクセスができます。
カタログレポートをダウンロードできます。
※Access to Reports権限を付与できるのはApp Manager,Developer,Marketer,Salesのみ
![スクリーンショット 2019-02-13 16.52.40.png](https://qiita-image-store.s3.amazonaws.com/0/355868/aa63d981-7ece-a9f8-4625-0da2cc25406f.png)

#Sales 
App の売上やダウンロード数などのデータを分析できます。
売上とトレンドの表示はできますが、ReportへアクセスするためにはAccess to Reports権限の付与が必要です。
![スクリーンショット 2019-02-13 16.52.57.png](https://qiita-image-store.s3.amazonaws.com/0/355868/8876e1fc-988d-9230-715d-44f237e5d11b.png)

#Customer Support
App Store のカスタマーレビューを分析できます。
Customer Support権限のみのユーザがマイAppでAppをクリックすると、評価とレビューへジャンプするようです。
![スクリーンショット 2019-02-13 16.53.21.png](https://qiita-image-store.s3.amazonaws.com/0/355868/f0864313-94b6-febf-cf97-0bb4f3f4abd4.png)

#追記(2019/03/12)
今日Appを手動リリースする手順を確認していたら、Appの手動リリースはAdminかAccountHolder権限のみしかできないことがわかりました。
https://help.apple.com/app-store-connect/#/devabbb787a6

しかしAppManager権限でもリリースのボタンが押せる気がします…(試してません)

- (2019/03/27)AppManager権限でもできることを確認いたしました。笑
PostgreSQLでデータベースに接続する

# 前提
既にPostgresQLに接続したことがある前提で、僕自身データベースへの入り方やコマンドをいつも忘れてしまうので、
備忘録として残しておきます。

# データベース
### データベース作成
```
$ createdb [データベース名]
```

### データベースに入る
```
$ psql [database名]
```

### データベース一覧表示
```
$ psql -l
```


### データベースから切断する
```
# \q
```

# テーブル
### テーブル一覧表示
```
# \d
```
2019年のIT関連カンファレンスとかイベントとか

## 概要

2019年に個人的に気になるカンファレンスとかイベントとかのまとめ
基本的に東京がメイン。
修正/追記などは編集リクエストをください。

## 2月

##### [DroidKaigi](https://droidkaigi.jp/2019/)
日時：2/7~8
場所：住友不動産新宿グランドタワー

##### [Developers Summit](https://event.shoeisha.jp/devsumi/20190214/)
日時：2/14~15
場所：ホテル雅叙園東京

##### [Laravel JP Conference](https://conference2019.laravel.jp/) 
日時：2/16
場所：田町グランパーク

##### [オープンソースカンファレンス](https://www.ospn.jp/osc2019-spring/)
日時：2/22~23
場所：明星大学

##### [JAWS DAYS](https://jawsdays2019.jaws-ug.jp/)
日時：2/23
場所：TOC五反田メッセ 

##### [Cookpad TechConf](https://techconf.cookpad.com/2019/)
日時：2/27
場所：恵比寿ガーデンプレイス ザ・ガーデンホール

##### [セキュリティマネジメントカンファレンス](https://www.sbbit.jp/eventinfo/48697/) 
日時：2/27
場所：東京コンファレンスセンター・品川

## 3月

##### [try! Swift Conference](https://www.tryswift.co/events/2019/tokyo/en/)
日時：3/21~22
場所：住友不動産渋谷ファーストタワー

##### [PHPerKaigi](https://phperkaigi.jp/2019/) 
日時：3/29~3/31
場所：練馬区立区民・産業プラザ Coconeriホール

## 4月

##### [Japan IT Week 春 前期](https://www.japan-it-spring.jp/ja-jp.html)
日時：4/10~12
場所：東京ビッグサイト

##### [技術書典](https://techbookfest.org/event/tbf06) 
日時：4/14
場所：池袋サンシャインシティ

## 5月

##### [Japan IT Week 春 後期](https://spring.japan-it.jp/ja-jp.html)
日時：5/8~10
場所：東京ビッグサイト

##### [JJUG](http://www.java-users.jp/)
日時：5/18
場所：ベルサール新宿グランド

##### [DjangoCongressJP](https://djangocongress.jp/)
日時：5/18~19
場所：東京日本橋タワー

## 6月

##### [AWS Summit](https://aws.amazon.com/jp/events/summits/?awsm.page=4)
日時：6/12~13
場所：東京

##### [ScalaMatsuri](https://2019.scalamatsuri.org/)
日時：6/27~29
場所：東京国際交流館 プラザ平成

## 7月

##### [Open Source Summit Japan](https://events.linuxfoundation.jp/events/open-source-summit-japan-2018/)
日時：7/17~19
場所：虎ノ門ヒルズフォーラム

##### [CloudNativeDays](https://twitter.com/search?f=tweets&q=CNDT2019&src=typd)
日時：7月/22~23
場所：虎ノ門ヒルズフォーラム

## 8月

##### [builderscon](http://2019.tokyo.builderscon.io/)
日時：8/29~31
場所：東京電機大学

## 9月

##### [PyCon JP](https://pyconjp.blogspot.com/search/label/pyconjp2019)
日時：9/16~17
場所：大田区産業プラザPiO

## 10月

##### [Vue Fes Japan 2019](https://vuefes.jp/2019/)
日時：10/12
場所：TOC五反田メッセ

##### [CEATEC JAPAN](https://www.ceatec.com/ja/application/)
日時：10/15~18
場所：幕張メッセ

##### [Japan IT Week 秋](https://www.japan-it-autumn.jp/ja-jp.html)
日時：10/23~25
場所：幕張メッセ

## 11月

##### [ad:tech tokyo](http://adtech-tokyo.com/ja/)
日時：11/27~28
場所：東京国際フォーラム

## 12月

##### [Japan PHP Conference](http://phpcon.php.gr.jp/2019/)
日時：12/1
場所：東京

## まとめ

東京って楽しそうだなと思う地方民でした。
[GO]GOを使ってCookieでFlashMessageを作る

##1. Cookieの作成
まずはじめにクッキーを作成します。

```go
func setMessage(w http.ResponseWriter, r *http.Request) {
    msg := []byte("Hello World")
   //ヘッダ内ではクッキーの値をURLエンコードする必要があるらしい
    c := http.Cookie{
      Name:   "Qiita",
      Value: base64.URLEncoding.EncodeToString(msg),
　　　 HttpOnly: true
    }
    http.SetCookie(w, &c)
}
```

##2. Cookieを元にフラッシュメッセージを作成

```go
func showMessage(w http.ResponseWriter, r *http.Request){
   //構造体Requestの中には名前付きクッキーを取り出せるCookieメソッドがある。
  //Name: "Qiita"のクッキーを探す、ない場合はerrにエラー文が入る。
    c, err := r.Cookie("Qiita")
	if err != nil {
		if err == http.ErrNoCookie{
			fmt.Fprintln(w, "メッセージがありません")
			//fmt.Fprintln(w, err)
          　 //エラー文が見たい人は上のコメントアウト外してみて
		}
	} else {
		rc := http.Cookie{
			Name: "Qiita",
			MaxAge: -1,
			Expires: time.Unix(1,0),
		}
		http.SetCookie(w, &rc)
		val, _ := base64.URLEncoding.DecodeString(c.Value)
		fmt.Fprintln(w, string(val))
	}
}
```

###3. 作ったハンドラ関数(showMessage, setMessage)をハンドラに変換、マルチプレクサにぶち込む

```go
func main() {

 	server := http.Server{
		Addr: "127.0.0.1:8080",
	}
	http.HandleFunc("/set_message", setMessage)
	http.HandleFunc("/show_message", showMessage)

	server.ListenAndServe()
}
```

#完成形

```go:main.go
package main

import (
"encoding/base64"
"fmt"
"net/http"
"time"
)

func setMessage(w http.ResponseWriter, r *http.Request){
	msg := []byte("Hello World")
	c := http.Cookie{
		Name: "Qiita",
		Value: base64.URLEncoding.EncodeToString(msg),
	}
	http.SetCookie(w, &c)
}


func showMessage(w http.ResponseWriter, r *http.Request){
	//名前付きクッキーを取り出すメソッドCookie、指定したクッキーがないときエラーを返す
	c, err := r.Cookie("Qiita")

	//Name: "cookie"のcookieの構造体が存在しないとエラー文"http: named cookie not present"が送られてくる。
	if err != nil {
		if err == http.ErrNoCookie{
			fmt.Fprintln(w, "メッセージがありません")
			fmt.Fprintln(w, err)
		}
	} else {
		rc := http.Cookie{
			Name: "Qiita",
			MaxAge: -1,
			Expires: time.Unix(1,0),
		}
		http.SetCookie(w, &rc)
		val, _ := base64.URLEncoding.DecodeString(c.Value)
		fmt.Fprintln(w, string(val))
	}
}

func main() {
	server := http.Server{
		Addr: "127.0.0.1:8080",
	}

	http.HandleFunc("/set_message", setMessage)
	http.HandleFunc("/show_message", showMessage)

	server.ListenAndServe()
}
```

#検証

まずビルドして

```terminal
$go build main.go
$./main
```

`http://127.0.0.1.8080/set_message`を開いてみてください
chromeの検証機能を使ってCookieが作られていることが確認できますね


<img width="1440" alt="スクリーンショット 2019-02-13 18.41.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/239663/a9d8873b-984c-4088-b334-292c69fb2f46.png">

次に、`http://127.0.0.1:8080/show_message`を開いてみてください。
###Hello Wold 
と出ましたでしょうか？

<img width="413" alt="スクリーンショット 2019-02-13 18.41.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/239663/55b3362f-9e63-6111-2c93-ef603958410d.png">

検証機能を使えばcookieが消えていることがわかります。

#最後にCookieの構造体(モデル)載せておきますね〜

```go:Cookie_struct.go
type Cookie struct{
 Name:           string
 Value:          string
 Path:           string
 Domain:         string
 Expires:        time.Time
 RawExpires:     string
 MaxAge:         int
 Secure:         bool
 HttpOnly:       bool
 Raw:            string
 Unparsed:       []string
}
```
h2oでタイマーでリダイレクト(メンテナンスページ表示)

タイマー指定でメンテナンスページ化したかった。Apacheのように。
Apacheのようなhtaccessはないが、`service h2o reload`が許されるなら下記対応でOK

```yaml
#h2o.cfg
     paths:
       "/":
         mruby.handler-file: /path/to/maintenance.rb
```

```ruby
#maintenance.rb
class Maintenance
  # config                                                                                                                                                                                                          
  # format = %Y/%m/%d %H:%M:%S"                                                                                                                                                                                     
  START_DATETIME = "2019/02/13 00:00:00"
  END_DATETIME = "2019/02/13 18:47:00"
  MAINTENANCE_PATH = "/maintenance.html"

  def call(env)
    return [399, {}, [ ] ] if env["PATH_INFO"] == MAINTENANCE_PATH
    n = Time.new
    now = n.year.to_s + "/" + format('%02d', n.month) + "/" + format('%02d', n.day.to_s) + " " + format('%02d', n.hour.to_s) + ":" + format('%02d', n.min.to_s) + ":" + format('%02d', n.sec.to_s)
    if now >= START_DATETIME and now < END_DATETIME
      return [301, { 'Location' => MAINTENANCE_PATH }, [] ]
    else
      return [399, {}, [ ] ]
    end
  end
end

Maintenance.new
```

以上です。
awaitを使う理由

`await`を使う理由は、別の処理に実行権を譲るためです。

JavaScriptはシングルスレッドであるため、実行権を持つ処理（以降「主処理」と呼びます）が自ら権利を手放さない限り、他の処理が実行されることはありません。主処理が10秒以上かかるような処理であっても同じです。ですので、その間は、主処理以外の処理によってコンテキスト（＝DOMの状態やグローバル変数の値など）が書き換えられることはありません。

以下のコードを実行すると、スリープ前とスリープ後の出力は必ず同じになります。

```javascript
const sleep = msec => {
  const start = new Date().getTime();
  while (new Date().getTime() - start < msec);
};

(() => {
  console.log(window.scrollY);  //=> 0
  sleep(10000);
  console.log(window.scrollY);  //=> 0
})();
```

どれだけマウスやキーボードで操作しようとしても、出力内容は同じになります。そもそもJavaScriptはシングルスレッドであり、主処理が実行権を手放さない限り他の処理は実行されないため、スリープ中にマウスやキーボードでコンテキストを書き換えることはできません。

## awaitを使う理由

重い処理をしている間もマウスやキーボードで操作できるようにしたい、複数の処理を並行して実行したいという場合、各処理が実行権を譲り合うよう実装されている必要があります。この「実行権を譲る実装」に使われるものが`await`です。

以下のコードを実行すると、スリープ中も画面をスクロールできます。

```javascript
const sleep = async msec => {
  return new Promise(resolve => {
    window.setTimeout(() => resolve(), msec);
  });
};

(async () => {
  console.log(window.scrollY);  //=> 0
  await sleep(10000);
  console.log(window.scrollY);  //=> 1051
})();
```

スクロールした結果、スリープ前とスリープ後の出力内容が変わっています。このように、`await`を使うことで主処理が実行権を手放すことができ、「画面をスクロールする」という処理に実行権を移すことができます。

## awaitの難しいところ

`await`により他の処理に実行権が移ると、その処理によってコンテキストが書き換えられる可能性があります。先程の例が該当するのですが、スクロールすることで`window.scrollY`の値が書き換わっています。このように、`await`の後でコンテキストが書き換わっていることがあるため、`await`行以降の処理を実装する際は、コンテキストの書き換わりを考慮する必要があります。

```javascript
console.log(window.scrollY);
await sleep(10000);
/*
 * コンテキストの書き換わりを考慮した実装
 */
console.log(window.scrollY);
```

コンテキストの書き換わりを考慮する必要があるため、`await`を使わない実装に比べてプログラムが複雑になります。

## まとめ

`await`を使う理由は「別の処理に実行権を譲るため」であり、`await`の難しいところは「コンテキストの書き換わりを考慮する必要があること」です。
ＫＮＮ

```{r}
library(dplyr)

#KNN

m=3

sita=rpois(m,lambda=5)

prob_pois=data.frame(values=c(0:100),prob=dpois(c(0:100),lambda=5))

sita_prob=prob_pois$prob[prob_pois$values %in% sita]

#p(x|sita)

x=seq(-10,20,1)

p_x=array(0,dim=c(length(x),m))

for(j in 1:m){

p_x[,j]=dnorm(x,sita[j],j)*sita_prob[j]

}


plot(x,apply(p_x,1,sum),type="o",col=3)



eta_data=data.frame(x=x,p_x)

eta=p_x;p_x=apply(p_x,1,sum)

min_eta=apply(eta,1,min)

plot(x,min_eta,type="p")

eta_dash=eta

for(j in 1:m){
  
eta_dash[,j]=eta_dash[,j]/p_x  
  
}


```

```{r}

plot(x,eta[,1],type="o",col=2,xlim=c(min(x),max(x)),ylim=c(min(eta[,1],eta[,2],eta[,3]),max(eta[,1],eta[,2],eta[,3])),xlab="x",ylab="eta")

par(new=T)

plot(x,eta[,2],type="o",col=3,xlim=c(min(x),max(x)),ylim=c(min(eta[,1],eta[,2],eta[,3]),max(eta[,1],eta[,2],eta[,3])),xlab="x",ylab="eta")

par(new=T)

plot(x,eta[,3],type="o",col=4,xlim=c(min(x),max(x)),ylim=c(min(eta[,1],eta[,2],eta[,3]),max(eta[,1],eta[,2],eta[,3])),xlab="x",ylab="eta")


plot(x,eta_dash[,1],type="o",col=2,xlim=c(min(x),max(x)),ylim=c(min(eta_dash[,1],eta_dash[,2],eta_dash[,3]),max(eta_dash[,1],eta_dash[,2],eta_dash[,3])),xlab="x",ylab="eta_dash")

par(new=T)

plot(x,eta_dash[,2],type="o",col=3,xlim=c(min(x),max(x)),ylim=c(min(eta_dash[,1],eta_dash[,2],eta_dash[,3]),max(eta_dash[,1],eta_dash[,2],eta_dash[,3])),xlab="x",ylab="eta_dash")

par(new=T)

plot(x,eta_dash[,3],type="o",col=4,xlim=c(min(x),max(x)),ylim=c(min(eta_dash[,1],eta_dash[,2],eta_dash[,3]),max(eta_dash[,1],eta_dash[,2],eta_dash[,3])),xlab="x",ylab="eta_dash")


```

```{r}

r12=eta_dash[,1]%*%t(eta_dash[,2])+(eta_dash[,2]%*%t(eta_dash[,1]))

r23=eta_dash[,2]%*%t(eta_dash[,3])+(eta_dash[,3]%*%t(eta_dash[,2]))

r31=eta_dash[,3]%*%t(eta_dash[,1])+(eta_dash[,1]%*%t(eta_dash[,3]))

r=r12+r23+r31

colnames(r)=x;rownames(r)=x

colnames(r12)=x;rownames(r12)=x

colnames(r23)=x;rownames(r23)=x

colnames(r31)=x;rownames(r31)=x

R_n=mean(r12+r23+r31)

#heatmap(r)

write.csv(r,"~/r.csv")

write.csv(r12,"~/r12.csv")

write.csv(r23,"~/r23.csv")

write.csv(r31,"~/r31.csv")

```
iframeのアスペクト比を保持するメモ


\<img>タグなどは元来の縦横比を保持するために

```css
img{
    width:100%;
    height:auto;
}
```

このように、heightにauto値を指定することによって、widthの値に対応し、縦横比を保持しながら、heightを自動調整するように設定できる。

しかし、\<iframe>タグはwidthとheightにauto値を指定することができない(指定したら既定値に設定される)。
そのため、widthとheightを対応させられず、簡単に縦横比を保持することができない。

<h2>解決策</h2>
heightの値が0の\<div>タグで\<iframe>タグを包含し、\<div>タグのpaddingに保持したい縦横比に対応した値を「%」で指定する。
paddingの値を%指定すると、paddingの値が親要素のwidthに対応して調整されるようになる。
例えば、\<iframe>のwidthとheightがそれぞれ100と20、つまり5:1の縦横比だった場合、

```css
.iframe-wrapper{
    height:0;
    padding-bottom:20%;
    position:relative;
    
}

iframe{
    position:absolute;
    width:100%;
    height:100%;
    left:0;
    top:0;
}
```

このように指定すれば、\<div>のpaddingは、その親要素のwidth*0.2の値を維持してくれる。
ただし、あくまでheight=0の「heightもどき」。包含している\<iframe>が表示されなくなる。
なので、上記のように\<iframe>を\<div>に対して絶対位置指定させる必要がある。
positionの説明はめんどくさいから書かない。

間違いなどあればご指摘ください。無知なのでお願いします。
【WP】カスタムフィールドの日付を元に記事をソートする方法

カスタムフィールドで日付を入力し、その値を元に記事をソートします。


```php
<?php
$term = get_term_by('name', single_cat_title('', false), 'forecast');
$paged = get_query_var('paged') ? get_query_var('paged') : 1 ;
$args = array(
	'post_type'      => '【投稿タイプ】',  // 該当する記事のpost_type
	'posts_per_page' => 10,           // 表示する件数
	'paged'          => $paged,
	'order'          => 'DESC',       // 並び順
	'orderby'        => 'meta_value',
	'meta_key'       => '【メタキー】',   // 日付のカスタムフィールドに対するmeta_keyを入力
	'meta_value'     => date("Ymd"), // 今日の日付を元に並び替え
	'meta_compare'   => '<=',        // 今日より前の記事を抽出
	'type'           => 'DATE',      // meta_typeの場合もあるとどこかの記事で読んだ
	/* // タームで記事を絞る場合
	'tax_query'      => array(
		array(
			'taxonomy' => '【タクソノミー】',
			'field'    => 'slug',
			'terms'    => $term->slug,
		),
	),
	*/
);

$the_query = new WP_Query($args);
```

#### 余談
`orderby(半角スペース)`になってて動かなくて詰まった。
Xcodeで実機デバッグを行う際に、0_abort_with_payloadで"Thread 1: signal SIGABRT"と出た時の対処方法

## エラー画面
実機デバッグする際に、以下のようにエラーが出てしまった時の対処方法について書いていきます。

<img width="1141" alt="スクリーンショット 2019-02-13 17.35.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/190875/75bd1e27-fc66-2c3d-bbe4-9692901eaa3a.png">

## エラーログの例

```
dyld: Library not loaded: @rpath/libswiftAVFoundation.dylib
  Referenced from: /var/containers/Bundle/Application/3FA16FDB-B5FE-40C9-8248-410B74E2860B/ShakingAlarmClock.app/ShakingAlarmClock
  Reason: no suitable image found.  Did find:
	/private/var/containers/Bundle/Application/3FA16FDB-B5FE-40C9-8248-410B74E2860B/ShakingAlarmClock.app/Frameworks/libswiftAVFoundation.dylib: code signature invalid for '/private/var/containers/Bundle/Application/3FA16FDB-B5FE-40C9-8248-410B74E2860B/ShakingAlarmClock.app/Frameworks/libswiftAVFoundation.dylib'

	/private/var/containers/Bundle/Application/3FA16FDB-B5FE-40C9-8248-410B74E2860B/ShakingAlarmClock.app/Frameworks/libswiftAVFoundation.dylib: code signature invalid for '/private/var/containers/Bundle/Application/3FA16FDB-B5FE-40C9-8248-410B74E2860B/ShakingAlarmClock.app/Frameworks/libswiftAVFoundation.dylib'

	/private/var/containers/Bundle/Application/3FA16FDB-B5FE-40C9-8248-410B74E2860B/ShakingAlarmClock.app/Frameworks/libswiftAVFoundation.dylib: stat() failed with errno=1
	/private/var/containers/Bundle/Application/3FA16FDB-B5FE-40C9-8248-410B74E2860B/ShakingAlarmClock.app/Frameworks/libswiftAVFoundation.dylib: code signature invalid for '/private/var/containers/Bundle/Application/3FA16FDB-B5FE-40C9-8248-410B74E2860B/ShakingAlarmClock.app/Frameworks/libswiftAVFoundation.dylib'

	/private/var/containers/Bundle/Application/3FA16FDB-B5FE-40C9-8248-410B74E2860B/ShakingAlarmClock.app/Frameworks/libswiftAVFoundation.dylib: stat() failed with errno=1
(lldb) 
```

## 解決方法

今回は、
`Shift`+`⌘(command)`+`k`
でクリーンをした後に、
`⌘(command)`+`b`
でビルドすると解決しました。

※　クリーンは、
Productタブ > Clean　Build　Folder でも可能です。
<img width="210" alt="スクリーンショット 2019-02-13 18.00.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/190875/0fecd875-601e-a063-8312-6d042228e894.png">


## 原因
ビルドした際に、
ライブラリがロードされていなかったり、
画像を読み込んでくれない場合に表示されることがあります。
deliver_laterのテスト時に同期実行

非同期実行するジョブをテストする際に、テスト結果を検証するために同期実行したい場合。
supportを作成して同期実行する設定を行う。



```ruby:spec/rails_helper.rb
RSpec.configure do |config|
  ...
  config.include ActiveJob::TestHelper
  ...

  # deliver_later の同期実行。
  # system/modelテストが対象。
  %i(system model).each do |type|
    config.when_first_matching_example_defined(type: type) do
      require 'support/perform_enqueued_jobs'
    end
  end
end
```

```ruby:spec/support/perform_enqueued_jobs.rb
RSpec.configure do |config|
  config.before(:each, :perform_enqueued_jobs) do |example|
    @old_perform_enqueued_jobs = queue_adapter.perform_enqueued_jobs
    @old_perform_enqueued_at_jobs = queue_adapter.perform_enqueued_at_jobs
    queue_adapter.perform_enqueued_jobs = true
    queue_adapter.perform_enqueued_at_jobs = true
  end
  config.after(:each, :perform_enqueued_jobs) do |example|
    queue_adapter.perform_enqueued_jobs = @old_perform_enqueued_jobs
    queue_adapter.perform_enqueued_at_jobs = @old_perform_enqueued_at_jobs
  end
end
```

使い方は以下。

```ruby:spec/models/my_model_spec.rb
RSpec.describe MyModel, type: :model do
...
  describe 'when hogehoge', :perform_enqueued_jobs do
  ...
  end
end
```

```ruby:spec/systems/system_spec.rb
RSpec.describe MyModel, type: :system do
...
  describe 'when hogehoge', :perform_enqueued_jobs do
  ...
  end
end
```

#### 参考
- [RSpec でキューイングした ActiveJob を同期実行する \- Qiita](https://qiita.com/upinetree/items/41a2a8fe9e1dd7c291ab)
- [RSpec 3\.5 がリリースされました！](http://rspec.info/ja/blog/2016/07/rspec-3-5-has-been-released/#core-configwhenfirstmatchingexampledefined)
- [Multiple types of specs in metadata · Issue \#2341 · rspec/rspec\-core](https://github.com/rspec/rspec-core/issues/2341)
UE4でゲームモジュールを移動させるときの注意点

# 注意点について
モジュールを分割したときの注意点をメモしてみました。

## 別のモジュールで呼び出すとき
XX_APIとクラスやメソッドの前につけてください。

```C++:Class.h
class XX_API Name
{
:
};
```

namespace内のメソッドなら

```C++:Foo.h
namespace Name
{
    XX_API void Function();
};
```
こうしないと**別のモジュール側で使用できません。**
（別のモジュールで使用しない場合は必要ありません）

## BPに公開済みのクラス
UPROPERTYで公開された値をBP側で変えているとき、
モジュールの移動によってその値が**リセットされます。**
**※回避方法については後述**

## BPに公開済みのメソッド
UFUNCTIONで公開されたBP側で使用しているメソッドが**呼べなくなります。**

## それぞれの解決方法
```Text:DefaultEngine.ini
[/Script/Engine.Engine]
+ActiveClassRedirects=(OldClassName="/Script/OldModuleName.ClassName", NewClassName="/Script/NewModuleName.ClassName")
```
上記を追加してください。
モジュール名とクラス名をそれぞれ書くことでリダイレクタされます。

# まとめ
新規作成ではなくクラスを移動させるときは、リダイレクタさせましょう。
**うっかり全て設定し直しにならないよう注意です。**
Vue.jsの基本　（JavaScriptでいいんじゃないの？に対する回答）

# Vueとは何か？

今月からVueの勉強を始めたばかりの私ですが、

>Vue.js はインタラクティブな Web インターフェイスを作るためのライブラリです。
https://012-jp.vuejs.org/guide/

インタラクティブな・・・と言われてもピンと来ませんが、「双方向データバインディング」というものを可能にします。

データに変更を加えると、見た目のUIも変更する。逆も然り。という事ですが、詳しく順序だって見ていきましょう。

## Vue.jsを設定する

HTML, CSS JSファイルを作り、HTML内のスクリプトタグは下記の順番で記述します。

1. Vueのスクリプト　https://vuejs.org/
2. JavaScriptのスクリプト


用意が出来たら、実際の定義の仕方を見ていきます。


* HTML
 * UIの領域を定義。
  
```HTML:HTML
<div id="app"></div>

```

* JS
 * UIに結びつくモデルを変数で定義。
  
```JS:JS
var vm = new Vue({
  el: '#app',
  data: {
    name: '〇〇'
  }
})

```

どの領域と結びつけるのか、エレメント（el）を指定して設定します。ちなみに、既存のDOM要素を新たに作ったVue.jsのDOM要素で置き換えする＝＝＝マウントする。といいます。

その後、データをオブジェクトで指定します。

* HTML
 * データをUIへ反映。{{ }}を使います。
  
```HTML:HTML
<div id="app">{{ name }}</div>

```

* HTML
 * UIの変更をデータへ。HTMLに対して追加する、独自の属性であるディレクティブを用います。今回は双方向データバインディングを実現する``v-model``を使用します。こうする事で、inputにタイプした文字そのままにUIの見た目の文字nameも変える事が出来ます。

  
```HTML:HTML
<input type="text" v-model="name">

```

## まとめ・参考文献

Vue.jsとは、JavaScriptで書くと長くなってしまうコードを、短く視覚的にすっきり書く事が出来るフレームワークです。独自ディレクティブなど最初はとっつきにくいですが、徐々にレパートリーを増やしていければより短いコードで表現出来るようになります。
この記事が、私のようなVue.jsの勉強を始めたばかりの方の助けとなれば幸いです。

参考文献：
[Vue.js入門　基礎から実践アプリケーション開発まで](https://gihyo.jp/book/2018/978-4-297-10091-9)
AngularをビルドしてCPI(レンタルサーバー)上にデプロイする

本記事ではビルドしたAngularアプリケーションをCPI(レンタルサーバー)にデプロイする手順を記載します。

# 環境
mac : Mojave(10.14.3)
Angular CLI : 7.3.0

# Angularをビルドする
```
// baseHrefには/html配下のindex.htmlが配置してあるフォルダを指定する
// ※CPIは '/html' がドキュメントルートとなるため、/htmlはpathに含めない
ng build --baseHref='your base href'
```

# CPIにデプロイする
ビルドしたAngularアプリケーションをCPIの `/html` 配下の任意のフォルダに配置します。
**※/htmlフォルダはデフォルトで用意されているものを使用してください。**
※この時点ではリダイレクト設定がされていないため、まだアプリケーションは動作しません。

# .htaccessを記述する
Angular公式の記述を参考に.htaccessを作成します。

```
// CPI上でリダイレクトさせるためには以下設定が必要となります。
Options +SymLinksIfOwnerMatch

// Angular公式のリダイレクト設定
RewriteEngine On
    # If an existing asset or directory is requested go to it as it is
    RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -f [OR]
    RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -d
    RewriteRule ^ - [L]
    # If the requested resource doesn't exist, use index.html
RewriteRule ^ /index.html
```

# .htaccessを配置する
対象フォルダにftpで.htaccessを配置してください。

CPIでftp経由でファイルを配置する方法:
https://www.cpi.ad.jp/support/faq/faq_func/faq_func_ftp/support-248.html


# なぜか繋がらない！って思った時の確認ポイント
- デプロイしたindex.htmlの `base href` は正しい参照先に向いてますか？
- .htaccessに `Options +SymLinksIfOwnerMatch` を追加しそこなってませんか？


参考
CPI:
https://www.cpi.ad.jp/

CPIの.htaccessについてのヘルプ:
http://acesr.document.secure.ne.jp/other/Tips-htaccess/

CPIのドキュメントルートについて:
https://www.cpi.ad.jp/support/faq/faq_func/faq_func_directory/support-602.html

Angular公式のデプロイ方法:
https://angular.io/guide/deployment
【Swift】日付の差分を計算する

## 概要 
この記事の手法は、@fromage-blanc さんの[「日付の計算【Swift 3.0】」](https://qiita.com/fromage-blanc/items/5629c9b52a959b957ff8?fbclid=IwAR1vuBRtrRLT9d1CHSV9Iexe90ok8TCeALqQZzD72uJSqgE_mhzQrtIBiRY#%EF%BC%92%E3%81%A4%E3%81%AE%E6%97%A5%E4%BB%98%E3%81%AE%E5%B7%AEn%E6%97%A5%E3%82%92%E6%B1%82%E3%82%81%E3%82%8B)という記事における日付の差分計算に少し改良を加えたものです。

上記の記事では日付の差分計算を、 `timeIntervalSince()` で時間の差分(秒数)を取得して日数へと変換することで行なっています。

```.swift
func calcDateRemainder(firstDate: Date, secondDate: Date? = nil) -> Int {

    var retInterval:Double!

    if secondDate == nil {
        retInterval = date?.timeIntervalSinceNow
    } else {
        retInterval = date?.timeIntervalSince(secondDate!)
    }

    let ret = retInterval/86400

    return Int(floor(ret))
}
```

しかし `1976-04-01 23:59:00 +0000` と `1976-04-02 00:00:00 +0000` のようなケースでも日付自体の差分を取得したい場合、秒数の差分から計算するだけではうまくいかないため少し改良が必要になります。

具体的には計算の前に少し前処理を入れてやる流れです。

## 前処理
前処理といっても難しい類のものではなく、単純に時間の情報をリセットするだけです。


```.swift
func resetTime(date: Date) -> Date {
    let calendar: Calendar = Calendar(identifier: .gregorian)
    var components = calendar.dateComponents([.year, .month, .day, .hour, .minute, .second], from: date)

    components.hour = 0
    components.minute = 0
    components.second = 0
        
    return calendar.date(from: components)!
}
```

## 改良後
```.swift
func calcDateRemainder(firstDate: Date, secondDate: Date? = nil) -> Int{

    var retInterval:Double!
    let firstDateReset = resetTime(date: firstDate)
        
    if secondDate == nil {
        let nowDate: Date = Date()
        let nowDateReset = resetTime(date: nowDate)
        retInterval = firstDateReset.timeIntervalSince(nowDateReset)
    } else {
        let secondDateReset: Date = resetTime(date: secondDate!)
        retInterval = firstDate.timeIntervalSince(secondDateReset)
    }
        
    let ret = retInterval/86400
        
    return Int(floor(ret))  // n日
}
```

`timeIntervalSince()` を使う前に前処理の `resetTime()` を挟んでやることで日付の情報のみから日数の差分が計算できるようになります。
RailsでMySQLを使っている際のエラー

## 対象

RailsでMySQLを用いて開発してて以下のようなエラーが出てきた方

```
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
```

```
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (38)
```

ここら辺の記事を一通り試してもダメだった方。

[mysqlのsocketエラーでrailsアプリが起動できない](https://qiita.com/fujitora/items/d341c52706d1954cae28)



## 解決法

brewを用いてmysqlを入れ直した後に

```rails
bundle install
```

またこのコマンドも忘れてませんか？(自分はエラーハンドリングに気を取られて忘れてました)

```rails
rails db:create
```
fishでrake taskの一覧をpecoに渡して実行する

`bin/rake -T`の結果をpecoに渡してタスクを選択できるようにしたいと思ったので関数を作りました。

railsプロジェクトでよく使うため、`bin/rake -T`を指定していますが、汎用的にしたかったら`bundle exec rake -T`に変更してください。

```shell
function peco_rake_task --description="Select rake task by peco"
  bin/rake -T | peco | read line
  if test -n "$line"
    set -l task_name (echo $line | awk '{print $2}')
    commandline "bin/rake $task_name"
  end
  set -e line
end
alias rt "peco_rake_task"
```

引数を渡すこともあるため、直接実行は行わず、`commandline`で反映するだけにしています。

また、エイリアスで`rt`を指定していますが、ここはご自由にどうぞ。
Elixir~表をデータ列から抽出、表示つづき~ 年齢別に並べ替え

#ここまでのあらまし

マズいです。
ブラウザを開いたら残っていたQiitaのエディタを使って前回記事のつづきの理解を書こうと思ったら、前回記事をそのものを編集して更新してしまいました。
そういうものだと思って読んでください...苦笑

マップリストを呼び出し、for文でWebに一覧表示させるコードです。

#データ列から抽出、表示

前回このコードを書き、PhoenixでWeb上に表示させるところまでは理解できました。
ググったら＜tr>や<td>はhtmlの見てくれ？に関するタグなんですね。
骨子はやはりElixirにあるとわかると、理解が容易でした。

```elixir

<%
data = [
  %{ "name" => "けんと", "age" => 20, "team" => "みずの音楽教室", "position" => "音楽家" }, 
  %{ "name" => "たくま", "age" => 32, "team" => "アルファノート", "position" => "音楽家、Webデザイナー" }, 
  %{ "name" => "かすみ", "age" => 32, "team" => "ベトナム日本語教師", "position" => "小説家" }, 
  %{ "name" => "たろう", "age" => 21, "team" => "謎のカナダ在住デザイナー", "position" => "映像制作、ゲーマー" }, 
  
]
%>
<table border="1">
<%= for record <- data do %>
<tr>
  <td><%= record[ "name" ] %></td>
  <td><%= record[ "age" ] %></td>
  <td><%= record[ "team" ] %></td>
  <td><%= record[ "position" ] %></td>
</tr>
<% end %>
</table>

```



このようなコードで

<img width="1552" alt="Screen Shot 2019-02-13 at 17.34.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/306722/ec6da0a4-7089-9d7d-20b6-a45b1f13c896.png">

簡単にデータ列からExcelシートのような表示ができました。

#加えた式

```elixir
...
]
|>Enum.sort( fn (record_current, record_next) -> record_current[ "age" ] < record_next[ "age" ] end)
%>
...
```

パイプライン演算子を用いた Enum.sortで年齢を若い順に並べ替えています。
基本的にはfn~endの型の式の応用なので、わたしでもなんとか理解できました！

<img width="1552" alt="Screen Shot 2019-02-14 at 15.58.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/306722/a4857dc1-deb7-0b5e-9bc7-4260558f18d5.png">




# おわりに

これでpiacereさんの[Excelから関数型言語マスター2回目：データ列の”抽出”、”Web表示”](https://qiita.com/piacere_ex/items/b7787580fce5f148242f)
の内容をカバーすることができました。

準じて次回の内容に取り組んでいきたいと思います。

うまず、たゆまず、頑張ります。
Kento Mizuno
githubのリモート設定を間違った時に変更する方法メモ

## 間違ってリモートブランチを設定してしまった際の対処法
`git remote -v` で現在のリモートブランチを確認できる

そのあとに下記のコマンド
`git remote set-url origin xxxx` (xxxxにgit@github.com:xxx.git)を入れる

これで再度`git remote -v`を行うと、再登録したものが表示される

## 問題が起きた背景
httpのタブの状態でそのまま登録してしまい、パスワードが求められて「え？なにこれ」みたいになって確認したら`ssh`にしていないことがわかり、そのときにどうやって変更するのかな？と調べてわかった


## まとめ
あまり使うことがないかもしれないが、もしもの際は`git remote set-url origin xxxx`とできるようにしておこーー。
githubをまだまだ使いこなせてないので勉強します。
DroidKaigi2019参加日記

現在私が所属する企業はDroidKaigiのスポンサーになっているのですが、スポンサーの参加枠が余っているので出てみない？と打診いただき、Androidエンジニアではないのですが、~~仕事もサボりたかったし~~未知の世界の技術を知ることも自身の成長に繋がるだろうといういうことで参加してきました。

これはその時の日記になります（レポートではありません）。

## １日目

### Optimize Builds with Android Plugin for Gradle 3.3.0+

ビルド周りの技術はAndroidに限らず使えるし、他の技術への応用度も高いだろうということでチョイスしました。

 * ちょっとした設定でビルドが早くなるよー
 * 最新版使うとさらに早くなるよー

みたいな話でした。

他のセッションでも上がることが多い`Dexs`や`R8`などにも言及されていたので、それらのセッションを聞かずに概要に触れられてお得感満載でしたね、きっと。

あと、Adarshの英語がものすごく聞き取りやすかったです。
いくつか英語のセッションも聞いたのですが、その中でもダントツでした。

### PWAでここまで出来る

PWAなら自分の守備範囲！ということで聞いてみることに。
~~（あと自分の会社の人の登壇なので）~~

PWAで作ったアプリケーションをストアで配布出来る技術があるとかで、WEBフロントエンドエンジニアに嬉しそうな話が聞けました。

### Chrome Custom Tabsの仕組みから学ぶプロセス間通信

Androidアプリって起動しているアプリ間で通信出来るんですね、という知見を得ると同時に、
それ以上のことは設計大変そうという感想でした。

書くことが少ないのは私にAndroid開発の知識が少なすぎるからです。


### Redux for Android

Reduxのフローを考えたときにAndroidのようにViewを仮想的に扱う仕組みが無い場合、Stateの更新毎に画面を描画し直すコストが膨らんで大変なのではないかという疑問がありました。

このあたりをどのようにして解決しているのか気になって聞いてみることに。

セッション中この話には特に言及されませんでしたが、利用しているアーキテクチャの図があり、この中で画面の更新にはRxを利用したMVVMの層を作って対応していたのでRxのフィルタみたいなやつで頑張っているんだなというのを知ることができました。

（尚、後ほどTwitterで教えて頂いたのですが、そのとおりの解決方法でした）

### Chrome + WebAuthn で実現できるパスワードレスなユーザー認証体験と開発者の課題

パスワードレス認証、認証するための物理キー（という呼び方でいいのかな？）紛失対応が大変そうだなーという感じでした。
FAIDという単語だけ覚えたので、パスワードレス認証がきになったらFAIDを調べようということを学びました。

## ２日目

### From TensorFlow to ML Kit: power your Android application with machine learning

昨年、TensorFlowLiteの発表がありモバイル分野でも機械学習熱の高まりを感じずにはいられない状況でしたので、Androidの現状はどんなかなと気になり聞いてみることに。
デモアプリを見ると、iOSと比べてまだエコシステムの充実度も速度もイマイチな印象を感じました。

### 実践 Lottie

Lottieの名前だけはよく聞きますがイマイチどんな技術なのか分かっていなかったので聞いてみることに。
~~（あと自分の会社の人の登壇なので）~~

Adobeのアニメーションを作るソフトで作ったアニメーションをJSONで出力してアプリで使うみたいな話でした。
エンジニアの人が頑張らなくてもデザイナーの人が考えた通りのアニメーションが再現出来るのはいいなーと思いながら聞いていました。

### Sharing Code between iOS & Android with Rust

KotlinとC++とRustでコードを書いた時の比べながらのお話でした。
Kotlinだとコンパイル・メモリ効率・実行速度に問題があり、
C++だとコードの可読性に問題があり、
これらを解決しているのがRustだよという話でした。

あと、Rustについてちょっと解説もしていました。

質疑応答の時間がたっぷりあり、何故Golangじゃないの？みたいな質問が出ていたのですが、この時点で相当疲労がたまっていたので上手く聞き取ることができず無念の思いです。。。

## その他

* お弁当が出たけどあれは成人男性には少なすぎる気がした、午後かなりお腹が空いてしまった。
* スケジュールを勘違いしていて、自分の会社の人登壇をコンプリートできなかった。
* １日目にセッションをたくさん聞きすぎたのか、２日目は頭が疲弊していて３つしたセッションが回れなかった。
  * 大きなイベントの開催前には運動と食事をしっかりとらないといけないと反省。
* ノベルティをもらうのが思いの外楽しかった。
  * もらったノベルティを家族に上げると想像以上に喜んでもらえた。
Microsoft Hyper-V Server 2016でエクスプローラー(explorer.exe)を無理やり使う方法

Hyper-V Server 2016でもexplorer.exeを使いたいこともあります。
でも、Hyper-V Serverにはありません。
どうしようかと思ったのですが、奇策を思いつきました。


```
C:\Users\Administrator> notepad
```
cmd.exeでnotepadを起動させてください。


![image.png](https://qiita-image-store.s3.amazonaws.com/0/245977/ceed118e-2ff8-4068-14b9-9193eae19ea1.png)

ファイル→名前を付けて保存
![image.png](https://qiita-image-store.s3.amazonaws.com/0/245977/250c1cf8-b178-6b1f-a441-7cb5156d82bf.png)

エクスプローラーが表示されています！！！
![image.png](https://qiita-image-store.s3.amazonaws.com/0/245977/e79386f9-52d3-1341-02d0-bec5acd072c6.png)

ファイル作成も可能。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/245977/bc4e6a66-8ddf-8a17-0b17-720a68f408c9.png)

ディスク詳細を閲覧可能
![image.png](https://qiita-image-store.s3.amazonaws.com/0/245977/5ed5eeaa-b03d-77a8-b8c4-027fa39036b8.png)

フォルダサイズも確認可能
![image.png](https://qiita-image-store.s3.amazonaws.com/0/245977/46c02680-93a5-773f-f04b-53b248c1f784.png)

印刷、送る、ショートカット作成はできない

こんな感じでなんとか使うことができました。
Windows Server Coreとは言えども流石にエクスプローラーがないのはつらいです。
C++ Builder XE4 > TColorBox > TColorの取得 > [Selected]プロパティを使う

```txt:動作環境
C++ Builder XE4
```

### 関連

- [c++ builder > TColorBox > TColorの取得 > int itemIndex = ColorBox1->ItemIndex; TColor col = ColorBox1->Colors[itemIndex];](https://qiita.com/7of9/items/f46b3eecbe3fb552b0d1)

1. インデックスを取得
2. インデックスに対応するColors[]の要素を取得

としているが、回りくどい。

### Selectedを使う

Selectedを使えばよい。

```cpp
	Panel1->Color = ColorBox1->Selected;
```

### 実装

```Unit1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
	Panel1->ParentBackground = false;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
	Panel1->Color = ColorBox1->Selected;
}
//---------------------------------------------------------------------------
```

### 実行例

起動直後
![2019-02-13_17h22_58.png](https://qiita-image-store.s3.amazonaws.com/0/32870/dbc7713a-3a44-976d-f347-23f353a381e8.png)

clOliveを選択しButton1を押下した後
![2019-02-13_17h23_18.png](https://qiita-image-store.s3.amazonaws.com/0/32870/b0b783a7-8419-a300-8ce5-5111fdfec00b.png)


### 関連

- [c++ builder XE4, 10.2 Tokyo > TeeChart > TColorBoxを使ったSeriesの色変更 > ItemIndexでなくSelectedを使う](https://qiita.com/7of9/items/77c256653c855169237c)
OnsenUIアプリでピンチアウト、ピンチインを有効にする

# はじめに

Onsen UIでは、ピンチアウト、ピンチインができないようにstyleで制御している。
アプリのコンテンツにもよるが、ピンチアウト、ピンチインが利用したい場合があるので、その方法を記す。

# 方法

CSSに以下の記述を追記する。

```css
body,ons-splitter,.tabbar__content {
  touch-action: auto !important;
}
```

bodyは必須。
ons-splitterや.tabbar__contentはコンポーネント利用していれば指定する。
VScodeのインデント幅を言語毎に指定する

#概要
使用言語ごとにtabでのインデントを指定したいことがあるので（例：rubyでは２行、pythonでは４行）、指定方法をメモする。
#実装
VSCodeを開いて、Ctrl+Shift+Pを押す。
入力画面にPreferences: Configure language specific settingsを入力。
言語を指定すると、settings.jsonが開くので、下記のように記入(例；Ruby)。

```settings.json
{
    "[ruby]": {
        "editor.tabSize": 2
    }
}
```
#参照元
[Visual Studio Codeで言語ごとにインデントの設定をしたい](https://ja.stackoverflow.com/questions/34014/visual-studio-code%E3%81%A7%E8%A8%80%E8%AA%9E%E3%81%94%E3%81%A8%E3%81%AB%E3%82%A4%E3%83%B3%E3%83%87%E3%83%B3%E3%83%88%E3%81%AE%E8%A8%AD%E5%AE%9A%E3%82%92%E3%81%97%E3%81%9F%E3%81%84)
[VSCodeドキュメント](https://code.visualstudio.com/docs/getstarted/settings#_language-specific-editor-settings)
Node-REDでできること part4 (自作ノード編)

# はじめに
## やりたいこと
* Node-REDでどんなことがどこまでできるのかを調べる
* part4(自作ノード編)では、ノードを自作する方法を検証しました
* 今回はchoiceというランダムにくじを引く機能ノードを作成します
    * ローカルインストールのみを行い、ライブラリへの公開は行いません

## Node-REDのまとめ記事
* [Node-RED系の記事のまとめ](https://qiita.com/kazutxt/items/8c72448eefcba56dabef)

## 参考にさせて頂いた記事
* [Node-REDのノードをつくる手順](https://qiita.com/zuhito/items/1c65fdbb3743d9f87edd)
* [Node-RED日本ユーザ会:はじめてのノード開発](https://nodered.jp/docs/creating-nodes/first-node#%E7%B0%A1%E5%8D%98%E3%81%AA%E3%83%8E%E3%83%BC%E3%83%89%E3%82%92%E9%96%8B%E7%99%BA)


## 動作環境
* OS : CentOS Linux release 7.5.1804 (Core)
* Node-RED : v0.19.5
* docker : 18.09.1
    * Node-REDイメージ : nodere/node-red-docker (IMAGE ID/d4f07b39b24d)
    * Dockerを使いますが、ホストに立てても大丈夫かと思います。

## 免責事項
* 検証をして確実と思われる情報を載せておりますが、誤っている可能性もゼロではないので、参考程度にご利用ください
* 本来はコードと実行結果のコンソールログも載せるべきなのですが、数と量が多いので、一旦は画面イメージまでとさせてください。

# 調査結果
## ローカルインストールの流れ

1. settings.jsに読み込むノード用フォルダを追記する
2. オリジナルノード用にhtmlとjsファイルを作成する
3. Node-REDを再起動する

## settings.jsの設定

* 以下の設定ファイルの個所にノード用フォルダを追加する

```
// settings.js
// XXXにノード用フォルダのパスを記載する

// Node-RED scans the `nodes` directory in the install directory to find nodes.
// The following property can be used to specify an additional directory to scan.
nodesDir: 'XXX',
```

## 新規ノードの作成
### htmlファイル

* 外見や入出力のポートの数、ヘルプのメッセージを決める

```
<script type="text/javascript">
    RED.nodes.registerType('Choice',{
        category: 'function', //functionノードとして登録
        color: '#a6bbcf', // 色
        defaults: {
            name: {value:""} // プロパティ
        },
        inputs:1, // 入力端子数
        outputs:1, // 出力端子数
        icon: "file.png", // アイコン
        label: function() {
            return this.name||"Choice"; // ラベル
        }
    });
</script>

<script type="text/x-red" data-template-name="Choice">
    <div class="form-row">
        <label for="node-input-name"><i class="icon-tag"></i> Name</label>
        <input type="text" id="node-input-name" placeholder="Name">
    </div>
</script>

<script type="text/x-red" data-help-name="Choice">
    <p>くじを引く</p> // ヘルプのメッセージ
</script>
```

### jsファイル

* 処理の実体を記述する

```
module.exports = function(RED) {
    function ChoiceNode(config) { //関数の定義
        RED.nodes.createNode(this,config);
        var node = this;
        this.on('input', function(msg) {　// インプットに対応するイベント
	// ここからくじ引きのロジックの本体
	var result = "???"
	var val = Math.floor( Math.random() * 4); 
	switch (val){
	case 0:
	     result = "はずれ";
	     break;
	case 1:
	     result = "10点が当たりました"
	     break;
	case 2:
	     result = "50点が当たりました"
             break;
	case 3:
	     result = "100点が当たりました"
	     break;
	default:
     	     result = "はずれ";
	     break;
	}
	    msg.payload = result;
            node.send(msg);
        });
    }
    RED.nodes.registerType("Choice",ChoiceNode); // イベントの登録
}
```

**画面イメージ**
![origin.jpg](https://qiita-image-store.s3.amazonaws.com/0/259228/236a2330-0626-3d00-3f73-53ef9a12c20e.jpeg)
青色申告会での確定申告の流れ備忘録

# 事前準備品

- 保険関係の支払証明書
 - 任意継続保険の支払い証明書
 - 国民年金の支払い証明書
 - 医療費控除用の明細書
     - 保険協会から送られてくる支払証書
     - 生命保険から送られてくる支払証書
     - 通知書に記載されていないものの明細書
         - https://www.nta.go.jp/taxes/shiraberu/shinkoku/yoshiki/02/01.htm の平成　　年分　医療費控除の明細書（平成29年分以降（平成30年1月1日以降に提出するもの））というexcelに医療機関から発行される領収書をベースに記入していく
- 家族分のマイナンバー
- 事業主のマイナンバー通知カードのコピー
- 運転免許証のコピー
- 印鑑（普通のやつ）
- 会計ソフト（MFクラウド）に入力を済ませておく

# フロー
1. 青色申告会に行く
2. 会計ソフト（自分はMFクラウド）の内容をチェックしてもらう。
MFクラウドは専門外だがだいたいな感じで操作しながら確認してくれる
3. 内容がOKであればMFクラウドの確定申告作成ページから平成XX年分所得税青色申告決算書を作成して印刷する。
これはおそらく場所によるが青色申告会でもネットワークプリントで印刷させてもらえると思う。
印刷できなければその場で手書きでもよいと思う。
内容にNGがあってもその場で修正可能な分量であれば修正できる。かなり修正が必要な場合、再訪問かも。
4. 平成XX年分所得税青色申告決算書ができたらそれをもとに確定申告書を青色申告会のひとがその場で一緒に作成してくれる。
おそらく入力用のPCがあったからそこでやるんだと思われる。
確定申告書ができたら、青色申告会が税務署に提出してくれる。
これは自分で提出してもよいが、やってくれるのでやってもらうとよいと思う。

# 指摘されたこと、学んだこと

- 未払金は翌年に繰り越せる（そりゃそうだ）
- 翌月に売掛金を回収する場合、12月の売掛金として残る（そりゃそうだ）
タスクシステム

# はじめに
[自作のゲームライブラリ（C++)](https://bitbucket.org/Serbonis/opal/src/master/)で使っているタスクシステムについての解説となります。

Webで見かける情報ではタスクシステムはもう旧式の仕組みで使われることが無いといったやややネガティブな感想のものが多いです。それはおそらくゲームロジックやオブジェクトの挙動を実装するエンドプログラマーの視点によるもので、ゲームプログラムのフレームワークの中核部分は呼称や実装が違うだけで、いわゆるタスクシステム（相当の何か）になっています。UnityもMonoBehavourというタスクシステムで動作しています。エンドユーザーがタスクシステムの存在を知らなくてもコードが組めるのはUnityの持つ強力なツール群によるものです。しかし、タスクシステムの動作を知っていると、Updateメソッドのコーディングの際により深い理解が得られると思います。

# 概要
ゲームのプログラムはざっくり言ってしまうと、ゲームのオブジェクトをいかに制御するか？ということに帰結します。ごく簡単に書くと以下のような構造です。

```C++
while ( 1 ) {
   for ( auto& task : tasklist ) {
       task.Update();
   }
}
```

while( 1 )はいわゆるゲームループと呼ばれるもので、ゲームが終わるまで処理を繰り返します。タスクシステムはタスクのリストからタスクを順番に取り出して、状態を更新してあげるのが役割です。タスクシステムに必須なのは更新の呼び出しを保証することだけで、これ以外の機能はそれぞれのタスクシステムの特色だったり個性だったりになります。

# 誰がタスクシステムを回すのか？
タスクシステムを回すのはゲームループを記述するメインプログラマーです。エンドプログラマーは基本的にタスクシステムを意識する必要はありません。エンドプログラマーは何をするのかというと、それは一定期間で繰り返し呼び出される前提でオブジェクトのロジックを実装することです。ここで2つ問題があります。1つ目は一定期間というのはあまり正確ではないということです。2つ目はエンドプログラマーが処理するオブジェクトをどうやって生成するかということです。この2つの問題はおよそ下記のようにして対応されることが多いです。

```C++
// 最初のオブジェクトを生成する
while ( 1 ) {
   for ( auto& task : tasklist ) {
       task.Update( deltatime ); // 経過時間を通知する
   }
}
```

Unityでは最初のオブジェクトはおそらくシーンという形で自動的に用意されます。また経過時間はプログラマーが自分自身で計算するものとして扱われているようです(個人的には経過時間はシステムが自動で計測してグローバル関数でいつでも取得できるようにしておけばよいんではないかと思っています)。

# タスクとリスト
タスクシステムの最低限必要な構成要素は処理を行うタスクとタスクを管理するリストです。それらの実装や要素の追加等は設計思想によるもので正解はありません。以降はあくまで私個人の自作のタスクシステムの仕様となります。

+ タスクは自身の前後のタスクへのポインタを保持している
+ タスクのリストは終端が無く環形になっている
+ リストは開始位置のタスクのポインタを保持している
+ リストを走査して最初のタスクに戻ったら終了
+ タスクはリストのポインタを保持できる
+ タスクにリストのポインタがある場合はその分岐したリストの走査を優先する

# タスクは仕事
UnityのタスクのMonoBehavourはtransformを持っています。transformは位置(と回転と拡縮）情報を表します。これらがあるということはゲーム世界にオブジェクトが存在するということになります。しかしタスクを仕事という観点で見た場合、例えば得点計算をする仕事にはこれらの情報は不要です。物(オブジェクト)の振る舞いでMonoBehaviourというのはダジャレですが、Unityのタスクは空間に存在する物が基本になってしまっています。これはUnityがGUIでオブジェクトを実際に空間に配置していく事でゲームを作りやすくした事に起因しているのではないかと思っています。しかしタスクは物ではなく仕事であり、一定期間で状態を更新するような仕事は、ファイルの入出力、メモリの監視、ネットワーク処理などいろいろあります。ゲームオブジェクトの管理はタスクの多種多様な仕事の一つであると考えています。

# リストの仕事
タスク自身の仕事はタスクが行うとして、タスクを取り扱うためにはタスクを管理する上位の存在が必要です。リストはタスクを取り扱いやすいようにする機能を提供するのが仕事になります。タスクそのものはあまり特別な機能は持っていませんが、リストの方は環形＋分岐の構造になっていることが特色です。環形にしているのはある種のリスト走査のコードを簡潔にかけるようにするためで、例えば最後からN番目のタスクを取得するなどです。分岐はタスクのグループ化を助けるためで、例えば敵やアイテムなどを分岐リストでまとめることで、グループに対して同じ処理をかけることがやりやすいようにしています。

# サンプル
基底のタスクから派生させて表示プリミティブのクラスを作成しますが使用方法は同じです。オブジェクトを生成して初期化する、必要が無くなったら後始末する、です。自作のライブラリの紹介も兼ねて使用方法のサンプルとなります。

```c++:main.cpp
#include <Opal.hpp>　　　　　　 // ライブラリヘッダ 
#include "Draw/prim/rect2.hpp" // 四角形オブジェクトクラス

static RECT2    rect2; // オブジェクトの生成

static void user_init( void ){ rect2.Open(); } // 初期化
static void user_free( void ){ rect2.Close();} // 後始末
static void user_main( void ){ rect2.AddTrans( +1, +1 ); } // 四角形が右下に移動

void main( void ){
    return Opal( user_init, user_main, user_free ); // ゲームループにユーザー関数をセット
}
```
M5StackでSerial.printができない問題 / もしくは115200bpsでのみ通信できる問題

###任意のボーレートでシリアル通信できないコード

```
#include <M5Stack.h>
void setup() {
  Serial.begin(9600); //M5.begin()より前にSerialの初期化をしている
  M5.begin();  
}
void loop(){
  Serial.println("hello world");
  delay(100);
}
```

###任意のボーレートでシリアル通信できるコード

```
#include <M5Stack.h>
void setup() {
  M5.begin(); 
  Serial.begin(9600); //M5.begin()の後にSerialの初期化をしている
}
void loop(){
  Serial.println("hello world");
  delay(100);
}
```

###理由
M5.begin();の中でSerial.begin(115200);で初期化されていることが原因。
https://github.com/m5stack/M5Stack/blob/master/src/M5Stack.cpp
Stream APIメモ

Java 8で追加されたAPIの一つで、ラムダ式などの関数型プログラミングを記述できるようになる。

Streamはコレクションやリストなどを一か所に集めて、ごにょごにょ処理ができるようになる。その際に、中間処理や終端処理を終えると処理された結果を返すことで、 より自分が使いやすいデータとして扱えるようになる。

## Streamの例
ElasticSearchのソースコードに

```java
this.registry = new NamedXContentRegistry(
    Stream.of(getDefaultNamedXContents().stream(), getProvidedNamedXContents().stream(), namedXContentEntries.stream())
        .flatMap(Function.identity()).collect(toList()));   
```

のコードを見てて、なんとなくこれは何かしらのリストのようなものを集めて最終的にリストで返しているんだなーってくらいに思って眺めてたけど、勉強のためにもう少し深く理解するために少し調べてみた。

### stream()
List型などにあるメソッド。Stream型で使えるようにStream型を生成するメソッド。

```java
Arrays.asList("one", "two", "three").stream();
Arrays.asList(new Moment(), new Moment(), new Moment(), new Moment()).stream();
```

### Stream.of()
Stream型にしたリストなどを一気にまとめられるメソッド。

```java
List<String> numbers = Arrays.asList("one", "two", "three");
Stream.of(numbers.stream(), numbers.stream(), numbers.stream());
```

### flatMap()
まとめたリストを一個のリストにまとめるメソッド。このメソッドの中でforEachなどを使って処理を記述できる。

```java
Stream.of(list1.stream(), list1.stream(), list1.stream())
    .flatMap(t -> t).forEach(t -> System.out.println(t));  // "one", "two", "three", "one", "two", "three", "one", "two", "three"

Stream.of(list1.stream(), list1.stream(), list1.stream())
    .forEach(t -> System.out.println(t));  // reference values
```

### Function.identity()
値をそのまま返すメソッド。最初は何でこんなものがあるかと思ったけど、`t -> t`のような書き方を メソッドや`Function::identity`みたいに記述できたほうが読みやすいっていう理由が多かった。

```java
Stream.of(numbers.stream(), numbers.stream(), numbers.stream())
    .flatMap(Funcion.indentity());
```

この[stackoverflow](https://stackoverflow.com/questions/28032827/java-8-lambdas-function-identity-or-t-t)がわかりやすかった。

### collect()
ストリームの終端処理でCollectors型で返してくれるメソッド。そのメソッド内でさらに返す型（リストなど）を決められる。

```java
Stream.of(numbers.stream(), numbers.stream(), numbers.stream())
    .flatMap(Funcion.indentity())
    .collect(~);
```

### Collectors.toList()
Collectors型をList型で返すメソッド。これをcollectメソッド内で使うことができる。

```java
Stream.of(numbers.stream(), numbers.stream(), numbers.stream())
    .flatMap(Funcion.indentity())
    .collect(toList());
```

## 最初のコードの説明
```java
this.registry = new NamedXContentRegistry(
    Stream.of(getDefaultNamedXContents().stream(), getProvidedNamedXContents().stream(), namedXContentEntries.stream())
        .flatMap(Function.identity()).collect(toList()));     
```

最初に戻って、上のコードが何をしているかというと、List型をStream型にしてから`Stream.of`でまとめて、`flatMap`を使用することでListの中身を一つにし、そのあとに`collect`でCollectors型にして、その中で`toList`で最終的にList型にして返してることになる（長い）。

リストって表現じゃなくてコレクションのほうが良かったかもしんない。
Contextシステムを使ってみたよ

#概要
今回はContextシステムを使ってみました。Reactはpropsを使って親から子へバケツリレーのように要素を渡していきますが、子要素が多くなってくると辛くなってきます。そこでContextシステムを使えば一気に渡したい子要素へ渡せるのでそれを紹介します。
#準備
まずはコンテキストを作ります。

```javascript:src/ButtonContext.js
import React from 'react';

export default React.createContext();
```
そのままです。
#実装
実装していきます。

```javascript:src/components/App.js
import React from 'react';
import Field from './Field';
import ButtonContext from '../ButtonContext';

class App extends React.Component {
  state = { text: '' };

  render() {
    return (
      <div>
        <button onClick={() => this.setState({text: 'button1'})}>button1</button>
        <button onClick={() => this.setState({text: 'button2'})}>button2</button>
        <button onClick={() => this.setState({text: 'button3'})}>button3</button>
        <ButtonContext.Provider value={this.state.text}>
          <Field />
        </ButtonContext.Provider>
      </div>
    );
  }
}

export default App;
```
ここではボタンを３つ用意してそれぞれクリックするとstateに文字を保存しています。
Fieldコンポーネントはダミーになっています。
目標としてはその下のコンポーネントにstate情報を渡したいです。
FieldコンポーネントをProviderでラップします。
valueキーワードに渡したい要素を入れてあげます。

```javascript:src/components/Field.js
import React from 'react';
import ButtonText from './ButtonText';

const Field = () => {
  return (
    <div>
      <ButtonText />
    </div>
  );
};

export default Field;
```
これはただ単にButtonTextコンポーネントをおいてるだけです。

```javascript:src/components/ButtonText.js
import React from 'react';
import ButtonContext from '../ButtonContext';

class ButtonText extends React.Component {
  onShowText(value) {
    return `This is a ${value}`;
  }

  render() {
    return (
      <div>
        <ButtonContext.Consumer>
          {(value) => this.onShowText(value)}
        </ButtonContext.Consumer>
      </div>
    );
  }
}

export default ButtonText;
```
ここでは親のstateを取得するためにConsumerでラップしています。
Consumerは関数を置かなければなりません。
その引数にProviderのvalueキーワードを取得することができます。
ここではヘルパーメソッドを定義して文字を書いています。
これでボタンをクリックするたびにそれぞれのテキストが出てくるはずです。
#まとめ
Contextシステムについてみました。
参考になれば幸いです。
デバッグ時PuppeteerでDOMツリーをダンプする

# 問題

PuppeteerでWebアプリのE2Eテストを書いたが、何故かテストがパスしない。
デバッグのため特定の時点でのDOMツリーをダンプ出力したい。

# 解決策

page.contentでDOMツリーを取得できます。

```js:
const res = await page.content();
console.log(`DOM: ${res}`);
```

特定のElementのみ出力したいなど細かい制御はpage.evaluateを使えば可能です。

```js:
const res = await page.evaluate(() => {
  return document.documentElement.outerHTML;
});
console.log(`DOM: ${res}`);
```

## 前提条件

page変数は以下のように定義しているという前提です。

``` js:
const puppeteer = require('puppeteer');
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto(SAMPLE_URL);
```
rails newしてからGitHubにリポジトリを作成するまでの流れ

#はじめに
ruby/railsの勉強を始めたら何かしらアプリを作成することになると思います。
railsチュートリアルを含め、`rails new`は何回か既にしていて、Bitbucketにレポジトリを作って・・・と作業をしてきましたが、作業をする都度手順を調べており効率が悪いため、自分で簡単に纏めようと思います。

#想定する状況
これからRailsアプリを作成します。
GitHubにはアカウント登録済みです。
SSH keyも設定済みです。
（SSH作成の参考サイト⬇️
[GitHubでssh接続する手順~公開鍵・秘密鍵の生成から~](https://qiita.com/shizuma/items/2b2f873a0034839e47ce)
[Bitbucket Set up an SSH key](https://confluence.atlassian.com/bitbucket/set-up-an-ssh-key-728138079.html)
[GitHub help](https://help.github.com/articles/connecting-to-github-with-ssh/)）

#手順
###rails newする
ローカルで新規のアプリを作成します。
データベースを指定する場合は`rails new -d データベース名`とします。
(その場合はデータベースを起動した状態で`bin/rails db:create`を実行。）
`rails s`で正常にブラウザ表示されるか確認。

###GitHubでリポジトリを作成
Ripository nameは必須なので入力します。
Descriptionは任意で入力ください。
PublicにするかPrivateにするか選びましょう。
そのほかは未チェック（無視）で大丈夫です。

###Gitコマンドを打つ
Railsアプリのルートディレクトリに移動してから以下コマンドを実行します。

```ruby
git init   # 初期化
git add -A   # ステージング
git commit -m "コミットメッセージ"   # リポジトリに反映
```

###GitHubにあるリモートリポジトリとローカルリポジトリを紐づける

```ruby
git remote add origin https://github.com/xxxxxxx/[Ripository name].git
# SSHを用いてgitと通信するためには以下
git remote set-url origin git@github.com:xxxxxxx/[Ripository name].git
# 紐づけているリモートリポジトリを確認できる
git remote -v    
```
なお、いきなり`git remote set-url origin　〜`をしてしまうと、`fatal: No such remote 'origin'`というエラーが出てしまいます。
先にremoteをaddする必要があり、set-urlはあくまでもremote先を変えるということになります。
SSHを始めから用いるのであれば、以下のコマンドとなります。

```
git remote add origin git@github.com:xxxxxxx/[Ripository name].git
```

###ローカルリポジトリをリモートリポジトリにプッシュする

```ruby
git push origin master
```
dd でSDカードをコピー

##dmesgでSDカードのマウント先を検索

なんかバーッーと出る。
```dmseg
*
*
*
[ 105.319267] mmc0: card 1234 removed
[ 109.679864] mmc0: new ultra high speed SDR50 SDHC card at address 1234
[ 149.680068] mmcblk0: mmc0:1234 SA32G 28.9 GiB (ro)
```

##SDのマウント先で、それっぽいの探す。

"mmcblk0" がSDっぽいので

### SDをDDイメージにして、ホームフォルダへ。"user"は各自の環境で。

$ sudo dd if=/dev/mmcblk0 of=/home/user/image.dd　| watch -n 10 pkill -USR1 dd

### DDしたイメージを、SDへ。

$ sudo dd if=/home/user/image.dd of=/dev/mmcblk0　| sudo watch -n 10 pkill -USR1 dd