OmniAICreator/Qiita-1.07M huggingface dataset:
Rootのvector<TVector3>の扱い

Rootファイルのツリー(vector)ブランチ(TVecotr3)の中にあるX,Y,Zの値をとりたい

```cpp

vecotor<double> A なら A->at(i)
```
ででてくる、

```cpp
veotor<TVector3> B　は B->at(i).X()　
```
ででてくる。
MyClass関数は便利

```cpp
TH2F *hist1 = new TH2F("hist1","posXYth2; Xa; Ya",1000, -18000., 18000., 1000, -18000., 18000.);
   TCanvas*c1=new TCanvas("c1");
   gStyle ->SetOptStat(1001110);

   Long64_t nentries = fChain->GetEntries();
   Long64_t nbytes = 0, nb = 0, an=0;
   for (Long64_t jentry=0; jentry<nentries;jentry++) {
      Long64_t ientry = LoadTree(jentry);
      if (ientry < 0) break;        
      nb = fChain->GetEntry(jentry);   nbytes += nb;
         std::size_t size  = WaveL->size(); //TVecotor3そのものの数
	     std::cout<<"size = "<<size<<std::endl;
      
         for(int a=0; a<size; a++){
            double Xa = 0;
            double Ya = 0;

            Xa = pos->at(a).X() ;// 
            Ya = pos->at(a).Y() ;//
            hist1 -> Fill(Xa,Ya);  
         }
         
   }      
   cout << "owari" <<endl;
   hist1->Draw("lego2z");
   
```
JavaScript～ファイルの分割

#JavaScript～ファイルの分割
##ファイルの分割
###ファイル構成
```
root/
　├ animal.js
　├ dog.js
　└ script.js
```
###ファイルの中身
```javascript:animal.js
class Animal {
}
// Animalクラスをエクスポート
export default Animal;
```

```javascript:dog.js
// Animalクラスをインポート
import Animal from "./animal";

class Dog extends Animal {
}
// Dogクラスをエクスポート
export default Dog;
```

```javascript:script.js
// Dogクラスをインポート
import Dog from "./dog";

//スクリプト処理を記載
```

##名前つきエクスポート
###ファイル構成
```
root/
　├ animal.js
　├ dog.js
　├ dogData.js
　└ script.js
```
###ファイルの中身
```javascript:animal.js
class Animal {
}
// Animalクラスをエクスポート
export default Animal;
```

```javascript:dog.js
// Animalクラスをインポート
import Animal from "./animal";

class Dog extends Animal {
}
// Dogクラスをエクスポート
export default Dog;
```

```javascript:dogData.js
//Dogクラスをインポート
import Dog from "./dog";

//定数dog1, dog2を設定
const dog1 = new Dog("A");
const dog2 = new Dog("B");

//定数dog1, dog2をエクスポート
export {dog1, dog2};
```

```javascript:script.js
//定数dog1、dog2をインポート
import {dog1, dog2} from "./dogData";

//スクリプト処理を記載
dog1.something();
dog2.something();
```
M5Stackで格安SIM通信のテスト

#はじめに#
2019年7月2日に行われたSORACOM Discovery 2019へ出席する機会があり、そこで購入した[M5Stack用 3G 拡張ボード](https://soracom.jp/products/kit/3g_module_m5stack/)を購入してみました。

#購入内容#
SORACOM Discovery 2019にて、スイッチサイエンス様のブースにてM5Stackとのセットで購入。購入したのはM5Stackのベースモデルと[M5Stack用 3G 拡張ボード](https://soracom.jp/products/kit/3g_module_m5stack/)。

![m5stack.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387653/dc6033d3-e845-6fd8-6102-1adfd683c903.jpeg)


購入したのはいいが、ソラコムのSIMを持っていなかった。
手元にあったのはIIJmioのSIM。
SIM通信の基本がわかっていないがとりあえず進めてみる方向で。

#サンプルコードを確認#
[ステップ 2: M5Stack で開発してみる (HTTP アクセス)](https://dev.soracom.io/jp/start/m5stack/#step2)に詳細のテストコードが記載されている。
やはりIIJmioではつながらない。画面表示で"soracom.io"へ接続しに行っているようだ。

その中で、下記ソース部分を注目。

```
  M5.Lcd.print(F("gprsConnect(soracom.io)"));
  modem.gprsConnect("soracom.io", "sora", "sora");

```
ここの情報が問題のようだ。

関数を確認すると

```
bool gprsConnect(const char* apn, const char* user = NULL, const char* pwd = NULL)
```

APNってなんだっけ？ということでIIJmioのサイトを確認。

[設定と利用/mioモバイル/mioモバイルプラス](https://www.iijmio.jp/service/manual/hdd/)
>■APNの設定情報

>掲載されていない端末の場合も、以下のAPN設定を行うことで通信が可能です。端末の設定方法の詳細については、端末付属の取扱説明書をご参照いただくか、端末提供元へご確認ください。
>APN	iijmio.jp
>ユーザ名	mio@iij
>パスワード	iij
>認証タイプ	PAPまたはCHAP

下記の通り修正。問題なく接続できた。

```
  M5.Lcd.print(F("gprsConnect(iijmio)"));
  modem.gprsConnect("iijmio.jp", "mio@iij", "iij");
```
![m5stack2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387653/2c7eef74-6e7e-89d0-32fb-7b08ae045ee3.jpeg)

ソラコムのSIMで使用できるサービスも興味があるので、試してみたい。
【忘備録】NeovimでRustの最小限の環境設定

環境設定に戸惑ったので自分用に忘備録。`LSP(Language Server Protocol)` に `ale` を用いて `RLS(Rust Language Server)` を呼び出す。
`rust-lang/rust.vim` や `racer-rust/vim-racer` のプラグインは使わない。

# init.vim
```vim
" プラグイン管理: vim-plugの場合
call plug#begin('~/.config/nvim/plugged')
Plug 'w0rp/ale'
call plug#end()

" 環境変数
let g:ale_fixers = {                     " rustfmtで整形
    \ 'rust': ['rustfmt']
    \ }
let g:ale_linters = {                   " リンタにRLSを使用
    \ 'rust': ['rls']
    \ }
let g:ale_rust_rls_toolchain = 'stable' " toolchainの指定
let g:ale_completion_enabled = 1        " 自動補完を有効
let g:ale_fix_on_save = 1               " 保存時に自動整形
```

## 追記(2019/7/31)
deopleteがaleと衝突して不具合を起こしていたようなのでaleのみの使用にしました
HSP3で簡単なアクション作ってみた

本当に簡易的で説明も下手なので参考にもならないと思います。
#コード
```HSP:main.hsp
screen 0,320,240 //画面初期化
x=0 //変数初期化ここから
y=0
dim hit,60,17
atr=0
stg=0
sizx=60
sizy=17 //変数初期化ここまで
//マップデータ
map(0) ="000000000000000000000000000000000000000000000000000000000000"
map(0)+="000000000000000000000000000000000000000000000000000000000000"
map(0)+="000000000000000000000000000000000000000000000000000000000000"
map(0)+="000000000000000000000000000000000000000000000000000000000000"
map(0)+="000000000000000000000000000000000000000000000000000000000000"
map(0)+="000000000000000000000000000000000000000000000000000000000000"
map(0)+="000000000000000000000000000000000000000000000000000000000000"
map(0)+="000000000000000000000000000000000000000000000000000000000000"
map(0)+="000000000000000000000000000000000000000000000000000000000000"
map(0)+="000000000000000000000000000000000000000000000000000000000000"
map(0)+="000001111111000000000000000000000000000000000000000000000000"
map(0)+="000000000000000000000000000000000000000000000000000000000000"
map(0)+="000000000000000000000000000000000000000000000000000000000000"
map(0)+="000000000000000000000000000000000000000000000000000000000000"
map(0)+="111111111111111000111111111110111111111111111111111111111111"
map(0)+="111111111111111000111111111110111111111111111111111111111111"
map(0)+="111111111111111000111111111110111111111111111111111111111111"
//地面描画処理ここから
buffer 3
repeat sizy//Yサイズの数だけ繰り返す
bgy=cnt//bgy変数にY方向の繰り返し回数を代入
repeat sizx//Xサイズの数だけ繰り返す
bgx=cnt//bgx変数にX方向の繰り返し回数を代入
drw=strmid(map(0),bgy*sizx+bgx,1)//drw変数に現在位置の文字列をmap変数から読み出し
//atr変数は当たり判定です
//str_map変数は描画する文字です
if drw="0" {str_map=" ":atr=0}
if drw="1" {str_map="B":atr=1}
hit(bgx,bgy)=atr//当たり判定を設定
//描画ここから
pos bgx*8,bgy*16
color 255,0,255
mes str_map
//描画ここまで
loop
loop
gsel 0
//地面描画処理ここまで

repeat //永遠に繰り返す
redraw 0
stick stk,15//stk命令にキー入力を代入
color 0,0,0//背景色
boxf//背景
color 255,255,255//透過色
gmode 4,0,0,255//透過モード
pos 0,0//左端に設定
gcopy 3,bx,0,320,240//地面コピー
pos x,y//場所指定
mes "A"//A(プレイヤー)を描画
y=y+1//重力
vx=0//Xの進む量
if (y/16+1)>16 :break//落ちたら終了
if hit((x+bx)/8,y/16+1)=1 :y=y-1//地面があったら重力に抵抗する
if stk&16  {
	if j=0 :j=64//ジャンプしていなければジャンプ
}
if j!0 :j=j-1:y=y-2//ジャンプ中なら浮かせる
if stk&1 :vx=-1//左に入力中なら移動量を-1にする
if stk&4 :vx=1//右に入力中なら移動量を1にする
if x>160 :bx=bx+1:x=x-1//Xが160以上になったらスクロール
x=x+vx//移動量を追加
if x<0 :x=0//画面外に出たら戻す
redraw 1
await 10
loop
end
```
#実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458397/eb4fb24d-fb20-4150-462a-b4c8f0760742.png)

初投稿なのでこれだけで許してください...
【初学】JavaScriptのクラスって？メソッドって？


最近JavaScriptを触り初めてまず驚いたのが、
CやC#とクラスやらコンストラクタやらがなんか違う！という部分でした。
実際何がどう違うのか、今日少し勉強したのでまとめてみます。
※間違ってる部分あるかもしれません。ビシバシ指摘いただけるとありがたいです。

#まずクラスを作ってみる。

```C#
//C#
class test(){
}
```

```javascript
//JavaScript
var Test = function(){};
```

私にとって馴染みのあるのは上の方なんですが、なんとJavaScriptでは
関数に**クラスの役割を与えている**らしいです。
だからこのTestクラスはちゃんとインスタンス化が可能です。

```javascript
//JavaScript
var test = new Test();
```

#メソッドはどうなってるの？

```C#
//C#
class test(){
   public void cat(){
      Console.Write("にゃーん");
   }
}
```

```javascript
//JavaScript
var test(){
   this.getName = function(){
      return "ミャオ";
   }
}
```

メソッドっていうか、値が関数なだけでやん！プロパティですやん！って思いましたが、
JavaScriptではこれがメソッドを担っているらしいです。

コンストラクターでの定義以外に、あとからメソッドを追加することもできます。

```javascript
//JavaScript
var Test = function(name){
this.name = name;
}
var test = new Test('irico');
test.intro = function(){
   return this.name + 'です。';
}

console.log(test.intro());  //「iricoです。」と表示される
```

なので、同じクラスから作られたインスタンスでも、持っているメンバーが違う、ということがありえます。

他にもメンバーを削除(`delete`)したり、削除や追加を行わないようにする (`seal`)ことも可能です。

```javascript
var Test = function(name){
   this.name = name;
   type = "fish";
}
var test = new Test('irico');
    
console.log(test.intro());  //iricoです。
delete test.intro;         //削除
console.log(test.type);   //こっちは残ったまま
```

```javascript
Object.seal(this);     //コンストラクターの末尾に追加すると保護される
```

##コンストラクターを関数として呼べちゃう
関数をコンストラクターとして使っている以上。そのまま関数として使ってしまうことができます。

```JavaScript
var Test = function(name){
   this.name = name;
};

var test = Test('irico');     //直接呼び出し
console.log(test);   //undefined
console.log(name);   //irico
console.log(test.name);  //エラー
```

use strictにしていると動かないので注意です。
これだとオブジェクトが生成されず、一行目は未定義になっていますね。
二行目はthisの為にグローバルオブジェクトから参照されています。

##対策
関数として呼び出された場合は、thisがグローバルオブジェクトを示すので、それを逆手にとって、
thisがグローバルの時、コンストラクターを呼び出す、という解決方です。なるほど。

```javascript
var Test = function(name){
   if(!(this instanceof Test)){
      return new Test(name);
   }
   this.name = name;
}
``` 

※「［改定新版］モダンスタイルによる基盤から現場での応用まで　JavaScript本格入門」（著：山田祥寛）を参考に学習しました。
BigQueryでファイルに書かれたクエリを実行したい

表題の通りなんですが、 `bq query` でファイルに書かれたクエリを実行したいときに悩んだのでまとめておきます。

## 正解：標準入力経由

```
$ bq query --use_legacy_sql=false < foobar.sql
```

上のように標準入力経由で動くことは動くんですが、公式のオンラインドキュメントにそのような記述を見つけられず結構悩みました。

下記の通り `bq query --help` にstdinから読むよと書いてあったので安心して使っていいと思います。

```
$ bq query --help
Python script for interacting with BigQuery.


USAGE: bq [--global_flags] <command> [--command_flags] [args]


query      Execute a query.

           Query should be specifed on command line, or passed on stdin.
```

## ググると謎のテクニックが見つかるけどオススメしない

下記のように`--flagfile`オプションを使えばSQL実行できるという書き込みをStack Overflowで見つけましたが、オススメしません。これは別の用途のオプションを指定してファイルを読んだときに正しく解釈できなかった残りがクエリとして解釈されるらしいです。バグみたいなものだと思うので、使わない方がいいでしょう。

```
$ bq --flagfile=foobar.sql query --use_legacy_sql=false
```
## クエリをコマンドラインに展開する方法も見つかるけどオススメしない

下記のようにファイルの内容をコマンドライン引数として使う方法も紹介されてるんですが、これもオススメしません。

```
$ bq query --use_legacy_sql=false "$(cat foobar.sql)"
```

上のように書けばそこそこ動くんですが、下記のようにSQLにコメントを書くと死にます。

```with-comment.sql
-- なんか表示したい
SELECT 'Hello, World!';
```

```
$ bq query --use_legacy_sql=false "$(cat with-comment.sql)"
FATAL Flags parsing error: Unknown command line flag ' なんか表示したい
SELECT 'Hello, World!';'
Run 'bq help' to get help
```

このやり方だとSQLコメントも改行なしでコマンドラインに展開されてしまうので、コマンドラインオプションとして扱われてしまって期待通りに動かないのです。

私はSQLにコメント書きたい派なのでこれも不便だと思います。
JavaScript～クラスの基本（インスタンス、コンストラクタ、メソッド、継承）


#JavaScript～クラスの基本
コピペして使ってください。
ES6を対象としています。

###クラスの定義
```javascript:sample.js
//クラスの定義
class Animal { 
}
//インスタンスの生成
const animal = new Animal();
```

###コンストラクタの定義
```javascript:sample.js
//クラス内にコンストラクタを定義
class Animal {
  constructor(name, age) {
    this.name = name;
    this.age = age;
  }
}

//引数を渡して、インスタンスを生成
const animal = new Animal("ポチ", 8);

console.log(`名前: ${animal.name}`);
console.log(`年齢: ${animal.age}`);
```

###メソッドの定義
```javascript:sample.js
class Animal {
  constructor(name, age) {
    this.name = name;
    this.age = age;
  }  
  greet() {
    console.log("こんにちは");
  }
  info(){
    console.log(`名前：${this.name}`);
    console.log(`年齢：${this.age}`);
  }  
}

const animal = new Animal("ポチ", 8);
animal.greet();
animal.info();
```
###クラスの継承
```javascript:sample.js
class Animal {
  constructor(name, age) {
    this.name = name;
    this.age = age;
  }  
  greet() {
    console.log("こんにちは");
  }
  info(){
    this.greet();
    console.log(`名前：${this.name}`);
    console.log(`年齢：${this.age}`);
  }    }
}

// Animalクラスを継承してDogクラスを定義
class Dog extends Animal {
  //独自のメソッドを追加できる
    getHumanAge() {
    return this.age*7;
  }
}

//継承元のメソッドを使用できる
const dog = new Animal("ポチ", 3);
dog.info();
//独自のメソッドを使用できる
const humanAge = dog.getHumanAge();
console.log(`人間年齢：${humanAge}`);

```

###オーバーライド
```javascript:sample.js
class Animal {
  constructor(name, age) {
    this.name = name;
    this.age = age;
  }
  greet() {
    console.log("こんにちは");
  }
  info() {
    this.greet();
    console.log(`名前は${this.name}です`);
    console.log(`${this.age}歳です`);
  }
}

class Dog extends Animal {
  //constructorを追加
  constructor(name, age, breed) {
    super(name, age);
    this.breed = breed;
  } 
  info() {
    this.greet();
    console.log(`名前：${this.name}`);  
    console.log(`犬種：${this.breed}`);  
    console.log(`年齢：${this.age}`);
    const humanAge = this.getHumanAge();
    console.log(`人間年齢：${humanAge}`);
  } 
  getHumanAge() {
    return this.age * 7;
  }
}

const dog = new Dog("ポチ", 8, "チワワ");
dog.info();

```
麻雀の手牌をオートエンコーダで次元圧縮

# ※この記事は2020年に作成しました
#麻雀オートエンコーダ
手牌を再現するオートエンコーダ。
隠れ層の次元数やバッチサイズをいくつにするかわかっていない。
損失関数にクロスエントロピーを使ったらテストデータに対する再現精度は71％が限界だったが、msle(平均二乗対数誤差)にすれば学習回数を増すごとに精度が上がったり下がったりした。
34次元の手牌を30次元に次元圧縮している。

```python:
# coding: UTF-8
import csv
import numpy as np
from keras.utils import to_categorical
from keras.models import Sequential,Model
from keras.layers import Dense,Conv2D,MaxPooling2D,Dropout,Flatten,Activation,BatchNormalization,Input,UpSampling2D
from keras.optimizers import Adam
from keras.losses import mean_squared_logarithmic_error
num = 220629 #データ数

#前処理　ここから
x_train = np.loadtxt("C:/Users/p-user/Desktop/csvdata/tehai_xtrain.csv",delimiter=",")
#x_test = np.loadtxt("C:/Users/p-user/Desktop/csvdata/tehai_xtest.csv",delimiter=",")

x_train = x_train/4.
#x_test = x_test/4.
#前処理ここまで
# encoderの次元
hidden_dim = 30

# 入力用の変数
input_data = Input(shape=(34,))
encoded = Dense(hidden_dim, activation='relu')(input_data)
decoded = Dense(34, activation='relu')(encoded)
autoencoder = Model(input=input_data, output=decoded)

encoder = Model(input = input_data,output = encoded)
encoded_input = Input(shape=(hidden_dim,))
# retrieve the last layer of the autoencoder model
decoder_layer = autoencoder.layers[-1]
# create the decoder model
decoder = Model(input=encoded_input, output=decoder_layer(encoded_input))
# adamで最適化, loss関数はmean_squared_logarithmic_error(平均二乗対数誤差)
autoencoder.compile(optimizer='adam', loss='mean_squared_logarithmic_error',metrics=['accuracy'])

autoencoder.fit(x_train, x_train,
                epochs=50,
                batch_size=34,
                shuffle=True,
                verbose=1,
                validation_split=0.2,
                )
```
PostgresのDBバックアップ・リストア簡易検証手順


`docker-compose.yml`を使ってPostgresインスタンス起動。

- mydb1: バックアップ対象のインスタンス
- mydb2: リストア先のインスタンス

```docker-compose.yml
version: '3.1'

services:
  mydb1:
    image: postgres:9.6
    restart: always
    environment:
      POSTGRES_DB: example1
      POSTGRES_USER: example
      POSTGRES_PASSWORD: example
    ports:
      - '15432:5432'
  mydb2:
    image: postgres:9.6
    environment:
      POSTGRES_DB: example2
      POSTGRES_USER: example
      POSTGRES_PASSWORD: example
    ports:
      - '25432:5432'
```

Postgresインスタンスの起動

```
docker-compose up
```

テスト用にデータを投入する。

```
psql -U example -h localhost -p 15432 -d example1

> create table users(id serial primary key, name varchar);
> insert into users (name) values ('hanako'), ('taro');
```

mydb1をバックアップする

```
pg_dump -U example -h localhost -p 15432 -d example1 > exmple1.dump
```

mydb2にリストアする

```
psql -U example -h localhost -p 25432 -d example2 -f exmple1.dump
```

リストア後の確認

```
psql -U example -h localhost -p 25432 -d example2

> select * from users;
|id|name  |
|--|------|
| 1|hanako|
| 2|taro  |
```
超初心者が受けるJS社内勉強会：第3回

今回はconsoleでいろいろやってみよう！という会でした。
![aaa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269200/da2f859f-86dc-698c-93ba-3bbf78e29191.png)

足したり引いたり、計算結果の確認が即座に出てきます。便利！

## 演算子について

### <font color="Crimson">四則演算</font>

- 足し算　`+`
- 引き算　`-`
- 掛け算　`*`(アスタリスク)
- 割り算　`/`（スラッシュ） 0で割ることができない。０を使うことが内容にする。
- 剰余　　`%`（割り算のあまり）例：`7%3;`　→ `1` ・・・７を３で割ったら１余る、という結果。

###計算の優先順位が決まっている
**掛け算割り算が優先される**
- `2+3*4`　=14
- `(2+3)+4`  =9
- `((2+3)*4)` =20
- `(3+5)*20%(8-2)` =4

### <font color="Crimson">文字列演算</font>
- ` 'abc' + 'def';`
    - 文字列の結合<br>例：` '123' + '456'`  //123456　**※123+456=579ではない**
- ` parseInt('123') + parseInt('456') `   //579 
    - **parseInt** とは、文字列を整数に変換するJavaScriptのグローバル関数の事。
- ` '123'*1 + '456' *1 `  //579
    - 文字列の数字に１をかけると数値になる。JSが勝手に解釈するらしい。

### 多様な文字列の結合
- ` 123 + '' + 456`  //123456
- ` '123' + 456`  //123456
- ` 123 + '456'`　//123456!

    - `+`で文字列を結合している

### <font color="Crimson">比較演算</font>
**`if` , `for` 必ず2つの値を比較。3つ以上は、分けてやる。**

- `123 > 456`　**false**
- `123 < 456`　**true**
- `123 > 123`　**false**
- `a >= b;`　 aがbと同じ、またはaがbよりも大きい場合に**true**
- `a == b;`　 同じかどうか。等しければ**true**、等しくなければ**false**
- `'123' == '123'`　**true**
- `'123' == 123;`　**true** どちらかが数値ならば文字列も数値としてみられるため。
- `'123' === 123;`　**false**  `=`を３つめにすると型の比較まで行う。
- `a !== b;`　aとbが等しくなければ**true**。`!=` は型まで比較しない


いよいよ実践めいた事に入ってきました。
そろそろ脳が拒否反応を表しだしております。 :head_bandage:

[超初心者が受けるJS社内勉強会：第4回](https://qiita.com/m_hamada/items/10315c88da9ba436744b) →
Rails6(6.0.0-rc1)でActionView::Base#renderを直接呼ぶ方法

## 環境
Ruby 2.6.3
Rails 6.0.0-rc1

## ActionView::Base#render
例えばサービスクラスからAPIへ投稿する文章を組み立てたい
例えばActiveJobの中で文章を組み立てたい

そんなActionControllerやActionMailer以外で
ActionView::Base#renderを使いたいという時があります

Rails5迄の挙動とRails6での挙動が少し変わっていたのでメモしてみました

## ファイル構成
```
.
└── apps
    └── views
        └── test
            ├── _partial.html.erb
            └── app.html.erb
```

## Rails5までの場合

```
view = ActionView::Base.new
view.view_paths = Rails.root.join('app', 'views')
output_buffer = view.render(template: 'test/app')
```

## Rails6.0.0-rc1

```
context = ActionView::LookupContext.new(Rails.root.join('app', 'views'))
view = ActionView::Base.new(context)
view.view_paths
output_buffer = view.render(template: 'test/app')
```
直接view_pathsをアサインしようとすると例外が発生します。
ActionView::Baseのコンストラクタに渡すLookupContextにpathを設定することでview_pathsが設定できました。
ABC 133: D - Rain Flows into Dams

### 問題
[D - Rain Flows into Dams](https://atcoder.jp/contests/abc133/tasks/abc133_d)

### 解法
山 $i$ に降った雨の量を $2x_i$ とおくと、ダム $i$ に流れ込む雨の量は $x_i + x_{i+1}$ です（ただし、$x_{N+1} = x_1$）。
したがって、問いは次の連立方程式を条件 $x_1 \geq 0, x_2 \geq 0, \cdots, x_N \geq 0
$ のもとで解くことに置き換えられます。

```math
\begin{align}
x_1 + x_2 &= A_1, \\
x_2 + x_3 &= A_2, \\
\vdots \\
x_N + x_1 &= A_N. \\
\end{align}
```

まず、

```math
A_1 + A_2 + \cdots + A_N = 2(x_1 + x_2 + \cdots + x_N)
```

ですから、雨量の総和は簡単に求められます。次に、**$N$ は奇数である** という重要な制約により、

```math
\begin{align}
  & x_1 + x_2 + x_3 + x_4 + \cdots + x_{N-2} + x_{N-1} + x_N \\
= & (x_1 + x_2) + (x_3 + x_4) + \cdots + (x_{N-2} + x_{N-1}) + x_N \\
= & A_1 + A_3 + \cdots + A_{N-2} + x_N
\end{align}
```

となるので、先ほど求めた雨量の総和から $x_N$ を求めることができます。
$x_N$ がわかったので、連立方程式の第 $N$ 式から $x_1$ も求められます。以下、芋づる式に第 $i$ 式から $x_{i+1}$ を求めることができて、問題が解けました。

答えを出力する際は、山 $i$ の雨量が $2x_i$ であることに注意してください。

### 感想
これをひらめいたときに「$N$ は奇数である」っていう制約を文中に見つけてガッツポーズしました。
DjangoMigration - テーブル削除

# Djangoマイグレーション操作
Djangonoのマイグレーションを利用した、テーブル削除。
[**こちら**](https://qiita.com/yohei-29/items/93bcdd3e3bcc0f795d53)の適用がされている前提。

## 事前チェック
行わなくても良い。
削除作業を行う前の事前チェック。

マイグレーションに変更はないか

```
python manage.py makemigrations
```

マイグレーションの履歴を確認。

```
python manage.py showmigrations
```

## テーブルの削除
以下のモデルが存在し、対応したテーブルがあるとして。

```py:models.py
from django.db import models

class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')

class Choice(models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    choice_text = models.CharField(max_length=200)
    votes = models.IntegerField(default=0)
```

### １．モデル修正
削除したいテーブルが記述されている箇所を削除。
削除の結果は以下。

```py:models.py
from django.db import models

class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')
```

### ２．マイグレート
マイグレートファイルを生成して、マイグレートを行うとテーブルが削除されている。

```shell
python manage.py makemigrations web
python manage.py migrate
```

### 注意点
Choiceテーブルのみ削除しようとすると、外部キーの関係上エラーが発生する。
JavaScriptの関数定義と呼び出し


#JavaScriptの基本
コピペして使ってください。
ES6を対象としています。

###関数
```javascript:sample.js
//関数定義
const hello = function(){
  console.log("こんにちは！");
}
//関数の呼び出し
hello();

//アロー関数
const greet = ()=>{
  console.log("こんばんは！");
}
greet();
```
###引数、戻り値
```javascript:sample.js
//引数の指定
const add = (number1, number2) => {
  console.log(number1+number2);  
};
add(5,7);

//戻り値の指定
const half = (number) => {
  return number/2;
};
const result = half (130);
console.log(`130の半分は${result}です`);
```

###オブジェクトと関数
```javascript:sample.js
//関数を含むオブジェクトの作成
const animal = {
  name: "ポチ",
  greet: ()=>{
    console.log("こんにちは");
  }
}

//プロパティの値、関数の呼び出し
console.log(animal.name);
animal.greet();
```
rbenvで環境切り替えたとき用にRubyのrequire一覧を出すTool

# TL;DR (長い三行で)
・`rbenv`でRubyのVersionを入れ替えたときに，`Gem`が入ってなくて`require xxx`でエラーが出る
・エラー出るたびに`gem install xxx`するのしんどい
・いまある`require xxx`を全部リストアップするToolつくるで

# できたもの

```ruby:gen_require_lines.rb
#! /usr/bin/env ruby
#! ruby
# ENCODING: UTF-8

#### SEARCH ALL .RB FILES UNDER PWD
def get_rb_files(root_dir)
  rb_files = []

  Dir.entries(root_dir).each { |entry|
    next if entry.start_with?('.')

    entry_full_path = "#{root_dir}/#{entry}"

    case File.ftype(entry_full_path)
      when 'directory'
        sub_results = get_rb_files(entry_full_path)
        rb_files += sub_results

      when 'file'
        if entry.end_with?('.rb')
          rb_files << entry_full_path
        end

      else
        # NOP.
    end
  }

  return rb_files
end

total_rb_files = get_rb_files(Dir.pwd)
total_rb_files.sort!

#### PARSE EACH .RB
require_lines = []
total_rb_files.each { |rb|
  File.open(rb) { |file|
    file.each_line { |line|
      line.force_encoding('UTF-8')
      line.chomp!
      line.scrub!
      line.strip!

      if !line.match(/^require\s/).nil?
        require_lines << line
      end
    }
  }
}
require_lines.uniq!
require_lines.sort!

#### OUTPUT
require_lines.each { |line|
  puts line
}
```

# まとめると

**こんなTool作るハメになる前に，外部依存関係はちゃんと管理しましょう．**

---///
macOS 10.14でiTunes 12.6.5を使う

macOS 10.14 Mojaveでは、Appの閲覧ができるiTunes12.6系の使用ができなくなりました。

- [macOS MojaveはiTunes 12.6.3/12.6.4/12.6.5をサポートしない？その対策は](https://www.imobie.jp/support/macos-mojave-doesnt-support-itunes-12-6.htm)
- [Apple、iTunes 12.6.5 for Macのダウンロードリンクを復活させるもmacOS Mojaveとの互換性はないと明記 | ソフトアンテナブログ](https://www.softantenna.com/wp/software/itunes-12-6-5-mojave-compatibility/)

これはWWDC2019でもあったような、iTunesアプリ解体のための方針のためですが、macOSでもAppStoreが閲覧したかったり、端末のアプリ管理がしたいケースはある気がします。
というか自分がしたい派なので入れてみました。

## SIPを無効化
まずSIPを無効化します。

[Mac OS X El CapiptanでSIPを無効化する - Qiita](https://qiita.com/zaburo/items/c650cda45c858fe856a9)

1. Macを再起動
2. リンゴマーク前に`command+R`を押しっぱなし
3. リカバリモードで`ユーティリティ→ターミナル`でターミナル起動
4. ターミナルに`csrutil disable`を入力
5. `reboot`入力などで再起動. 

これでSIPはオフになりました。
作業後に必要に応じて`csrutil enable`します。

## iTunes12.6.5をダウンロード
まだ、公式サイトにダウンロードリンクが存在するため、こちらからダウンロードしましょう。

[企業環境で iTunes を使って App を配布する - Apple サポート](https://support.apple.com/ja-jp/HT208079)

## 中身を出してinstall script書き換えてインストール
ここら辺はPacifist([CharlesSoft](https://www.charlessoft.com/))を使う方法と普通にターミナルで書き換える方法があります。

### Pacifist
こちらがpacifist使用例。
- [macOS MojaveでApp Storeが使えるiTunes 12.6.5.3にダウングレードして使用する方法 | Will feel Tips](https://ichitaso.com/mac/itunes-12-6-5-on-mojave/)
バージョンチェックが追加されたのか、pacifistだとうまくいかなかったのでもう一つの方法をやりました。

### スクリプト
こちらで変更方法が共有されていました。
[Apple's Special Version of iTunes That Still Has an App Store Currently Incompatible With macOS Mojave | Page 8 | MacRumors Forums](https://forums.macrumors.com/threads/apples-special-version-of-itunes-that-still-has-an-app-store-currently-incompatible-with-macos-mojave.2143244/page-8#post-27234821)
この回答内容だと、AppleScriptを作成して、それを実行することで書き換えられますが、sedで書き換えてるだけなので、普通にterminalで実行もできます。

```shell
# 元のiTunes削除
$ sudo rm -rf /Applications/iTunes.app

# ダウンロードしたdmgをマウントしてpkg展開
$ hdiutil mount ~/Downloads/iTunes12.6.5.dmg
$ pkgutil --expand /Volumes/iTunes/Install\ iTunes.pkg ~/tmp

# インストールスクリプトを書き換え
$ sed -i '' 's/18A1/14F2511/g' ~/tmp/Distribution
$ sed -i '' 's/gt/lt/g' ~/tmp/Distribution

# リパッケージしてアンマウント、tmp削除
$ pkgutil --flatten ~/tmp ~/Desktop/iTunes.pkg
$ hdiutil unmount /Volumes/iTunes/
$ rm -rf ~/tmp

# リパッケージしたpkgファイルを実行
$ open ~/Desktop/iTunes.pkg

# インストール後にiTunes.app/Contents/Info.plistのバージョンをごまかします。
$ sudo sed -i '' 's/12.6.5/12.9.4/g' /Applications/iTunes.app/Contents/Info.plist

# 必要に応じてローカルライブラリを削除します。
$ rm ~/Music/iTunes/iTunes\ Library.itl
```

これで普通にiTunes12.6.5がインストールできました。
Mac AppStoreでもアップデートのお知らせ等は出ないはずです。

## 必要に応じて：SIPを有効化
SIPはセキュリティ面で有効なので、逆の手順で有効化しておきます。
リカバリモードで、`csrutil enable`を実行します。

# まとめ

最近では、iTunesでiOSのアプリとかを同期管理することも少なくなりました。
なのでこの記事は最後の悪あがきですね。

macOS 10.15ではFinderで管理できるらしいですが、アプリの同期はできないような気もします。。

- [Sidecarや新ミュージックアプリなどmacOS 10.15 Catalinaの注目点 | TechCrunch Japan](https://jp.techcrunch.com/2019/06/27/2019-06-24-macos-10-15-catalina-preview/)

上の記事のスクリーンショットとかでもアプリは表示されてないですし。。
iOS 13では古いiTunesでの同期も禁止されそうですね。
elm-ui で column 内の table にスクロールバーを出す

## スクロールバー出ない

```elm
import Element exposing (..)

column [ width fill, height fill, explain Debug.todo ]
    [ el [ width fill, height <| px 30 ] <| text "container on table"
    , table [ width fill, height fill, spacing 1, scrollbarY, explain Debug.todo ]
    <| { data = List.repeat 50 "table data"
        , columns =
            [ { header = text "table header"
            , width = fill
            , view = el [ padding 3 ] << text
            }
            ]
    }
    ]
```

`column` の子要素に直接 `table` を配置してその属性に `scrollbarY` を指定しても、スクロールバーが表示されず `column` の範囲をはみ出して描画されてしまいます。

- [スクロールバー出ない版コード ＠ Ellie](https://ellie-app.com/63Lz8vshHgNa1)
  - 左側がスクロールバーの出ない `table` です。
  - 右側は `table` の親要素が `column` ではありません。こちらはスクロールバーが出ています。

この動きがバグなのか仕様なのかはちょっと分からないです。
似たような事象は 2018年の 9月に issue が挙がってますが、その後音沙汰がないです。

- [Using centerX in a column with scrollbars causes the column to overflow its container](https://github.com/mdgriffith/elm-ui/issues/34)


## スクロールバー出る

```elm
import Element exposing (..)

column [ width fill, height fill, explain Debug.todo  ]
    [ el [ width fill, height <| px 30 ] <| text "container on table"
    , el [ width fill, height fill, scrollbarY ]  -- この el がポイント
    <| table [ width fill, height fill, spacing 1, explain Debug.todo ]
    <| { data = List.repeat 50 "table data"
        , columns =
            [ { header = text "table header"
            , width = fill
            , view = el [ padding 3 ] << text
            }
            ]
    }
    ]
```

`column` に直接 `table` を配置するのではなく、間に `el` を挟んでこの `el` の属性に `scrollbarY` を指定します。
こうすると期待した形でスクロールバーが表示されます。

- [スクロールバー出る版コード ＠ Ellie](https://ellie-app.com/63MgXNKzgL3a1)


**おしまり**
JavaScriptの配列とオブジェクト（基礎）


#JavaScriptの基本
コピペして使ってください。
ES6を対象としています。

###配列

```javascript:sample.js
//配列の宣言
const animals = ["dog", "cat", "pig"];
//配列の要素を取得
console.log(animals[0]);

//配列の繰り返し
for (let i = 0; i < animals.length; i++) {
  console.log(animals[i]);
}
```

###オブジェクト

```javascript:sample.js
//オブジェクトの宣言
const character = {name: "John", age: 22};
//オブジェクトの要素を取得
console.log(character.name);
```

###オブジェクトの要素をもつ配列

```javascript:sample.js
//オブジェクトの要素をもつ配列の宣言
const characters = [
  {name: "John", age: 22},
  {name: "Kevin", age: 23}
];
//要素を取得
console.log(characters[0]);
console.log(characters[1].name);

//繰り返し処理
for (let i=0; i<characters.length; i++) {
  const character = characters[i];
  console.log(`名前：${character.name}`);
  console.log(`年齢：${character.age}`);    
}
```
VSCodeの拡張をはじめて作ってみて、ハマったこと

# 作ったもの
* [Just Do It Extension (VisualStudio MarketPlace)](https://marketplace.visualstudio.com/items?itemName=dyuji.justdoitextension)

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">メンターを出現させることができるVSCodeの拡張をつくりました<a href="https://t.co/FsjF6bApUD">https://t.co/FsjF6bApUD</a> <a href="https://t.co/GHrSP9E54E">pic.twitter.com/GHrSP9E54E</a></p>&mdash; dyuji (@dyuji1) <a href="https://twitter.com/dyuji1/status/1146066471526658049?ref_src=twsrc%5Etfw">2019年7月2日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# 前書き
基本的なことは多くの方の記事や、公式のチュートリアルを参考にしました。
この記事では、自分がその中でハマったことなどを覚え書き程度に記しておきます。

参考にしたサイト・記事等は最後にリンクを貼っておきます。[参考](#参考)

# ハマったこと
## 1. Webview APIでは動画の再生、iframeによる動画の埋め込みができなかった
当初の予定では、動画ファイルとjavascriptのクロマキー合成を使って埋め込むことで、召喚しようと計画していました。
しかし動画ファイル(videoタグ)を入れてもwebviewでは再生できませんでした

また、youtubeやviemoをiframeを使って埋めこもうともしましたが、外部サイトへのアクセスやスクリプトの読み込みに制限がかかるらしく、うまくいきませんでした。

結果として動画編集ソフトで背景を透明にしたGIFアニメーションを自作し、それをimgタグで読み込むことで表示しました。
また、webviewを利用しているので、cssで画像をウィンドウサイズに合わせて変形させるようにできました。

## 2. コンテンツセキュリティポリシー(CSP)
webviewのAPIドキュメントに、webview(htmlファイル等)にはコンテンツセキュリティポリシー(CSP)を入れることがベストプラクティスとして記載されています。ｰ>[リンク](https://code.visualstudio.com/api/extension-guides/webview#security)

無学なことで、このCSPについて知りませんでした。

CSPとはXSS攻撃に代表されるブラウザで用いられるコンテンツを使った攻撃を防ぐべく、サーバサイドからブラウザに対してコンテンツの使用ポリシーを伝えて各種攻撃を回避するものだそうです。

## 3. アクセストークンの発行の時の権限の設定
できた拡張を登録しようとした際、ステータス403でPublishができないエラーが発生しました。
これはアクセストークンのOrganizationをAll accessible organazationに設定することで解消されました。
[Publishing Extension](https://code.visualstudio.com/api/working-with-extensions/publishing-extension#publishing-extensions)


結果として、Organazationを提供する組織名の設定と勘違いしていたのが原因でした。ドキュメントをちゃんと読みましょう(自戒)。


## 4. 画像やリソースをsrc内にいれない
拡張機能を作成後、手元で動作確認をした上でMarketPlaceにデプロイしました。
しかし、マーケットからインストールしてみたところ、画像が表示されず、リソースのエラーが発生しました。

これは、開発段階ではsrc以下に画像等のリソースを入れていたのですが、そこに配置しておくとデプロイした際リソースはパッケージ内に入りませんでした。
プロジェクトのルートフォルダに配置して相対パスで指定することでエラーが解消されました


# まとめ・感想
短時間であるものの、作ったものに反響ももらい、いい経験になりました。
VsCodeの拡張は開発しやすいと感じたので、是非作ってみてください



# 参考
### 公式
* [Visual Studio Code API](https://code.visualstudio.com/api)

### Qiita,Blog
* [VSCode拡張機能開発の始め方](https://qiita.com/tiibun/items/31d613af4352e1a9c8af) (2018/12/07)
* [Contents Security Policy（CSP）のお勉強](https://qiita.com/o_Ozzzzk/items/c505b7dd20707eb4ee08) (2018/4/25)
* [Visual Studio Code 拡張の開発～公開までの流れをザックリ説明してみる](https://yoshinorin.net/2018/05/23/vscode-extension-develop/) (2018/05/23)
* [VSCode拡張機能開発で次の一歩 -- ファイル操作 & クリップボード操作 & 外部アプリ操作 & 自作拡張機能紹介 merge-n-paste](https://qiita.com/RAWSEQ/items/7c53596754d2a102499f) (2017/12/22)
* [Visual Studio Code はじめての拡張機能開発](https://qiita.com/rma/items/8c53077d1355ab8fa4c6) (2016/08/15)
【CSS】max-height・min-height・max-width・min-width

#はじめに
CSSの必須プロパティである`height`と`width`。
便利ですが、幅と高さを固定したくない場合(幅と高さを内部の要素の内容によって柔軟に変えたい場合)には不便です。
かといって幅と高さを全く指定していないと、思っていたよりもサイズが小さくなってしまったり、大きくなってしまったりといった不具合が生じる場合があります。

そんな時に便利なのが、
**max-height,min-height,max-width,min-width**　です！
見ての通り`height`と`width`の前方に`max-`や`min-`をつけてあげるだけなので、とても覚えやすいですね。

`max-` あるいは `min-`を前方につけることで
**セレクタのサイズは固定しないけれども、サイズの最大値あるいは最小値は設定することができます。**

#使い方
単位はpxでも%でもremでも設定できます。
これは通常のheightやwidthと同じですね！
そして設定の仕方は以下の通りです。
test1クラス〜test4クラスごとにmax-height,min-height,max-width,min-widthをそれぞれ設定しました。

```test.html
<div class = "container">
  <div class = "test1">
    高さの最大値を指定。高さの最大値を指定。高さの最大値を指定。高さの最大値を指定。高さの最大値を指定。高さの最大値を指定。高さの最大値を指定。高さの最大値を指定。高さの最大値を指定。高さの最大値を指定。
  </div>
  <div class = "test2">
    高さの最低値を指定。
  </div>
  <div class = "test3">
    幅の最大値を指定。幅の最大値を指定。幅の最大値を指定。幅の最大値を指定。幅の最大値を指定。幅の最大値を指定。幅の最大値を指定。幅の最大値を指定。幅の最大値を指定。幅の最大値を指定。幅の最大値を指定。幅の最大値を指定。幅の最大値を指定。幅の最大値を指定。幅の最大値を指定。幅の最大値を指定。幅の最大値を指定。
  </div>
  <div class = "test4">
    幅の最低値を指定。
  </div>
</div>

```

```test.css
.container {
  display: flex;
}
.test1 {
  width: 100px;
  max-height: 300px;
  background-color: yellow;
  margin-right: 20px;
 }
 .test2 {
  width: 100px;
  min-height: 300px;
  background-color: skyblue;
  margin-right: 20px;
 }
 .test3 {
  height: 100px;
  max-width: 300px;
  background-color: salmon;
  margin-right: 20px;
 }
 .test4 {
  height: 100px;
  min-width: 200px;
  background-color: lightgreen;
  margin-right: 20px;
 }
```

そしてそれぞれの結果がこちらです！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419062/72351d01-7a67-fcae-91e7-6ac959411a4a.png)


`max-`をつけると、クラス内の要素に関係なく、**div要素自体の幅あるいは高さは設定した最大値で表示されています。**
`min-`をつけると、クラス内の要素が少なくても、**div要素自体の幅あるいは高さは設定した最小値で表示されています。**

#さいごに
うまく活用すればとても便利な機能ですね！
最後までご覧いただきありがとうございました！:relaxed:
初学者がHTMLの初級で気になった点

#はじめに
[未来電子](https://www.miraidenshi-tech.jp/intern-content/program/)でインターンをしている大嵜です。
昔プログラミングの学習をやりかけていたのですが、挫折してしまい、久しぶりにプログラミングの学習を再開しました。
まずはProgateのHTML&CSSの初級編を学習して感じたことをまとめておきます。

プログラミング初心者であるため、内容に誤りがあるかもしれません。
もし、誤りがあれば修正するのでどんどん指摘してください。

#Progateの感想
初心者にはとてもおすすめの学習サイトです。
開発環境を自分で用意する必要がないので、そこで諦めてしまうことがありません。
また、スライドで重要な点が分かりやすく説明されており、サクサク進めることができます。

#はじめに引っかかった場所
学習していて最初に引っかかったのは `float` の考え方です。
`float` は要素を横並びにしたいときに使います。
例えば、

```
img{
  float: left;
}
```

とすると、画像が左に寄せられます。

`float`のイメージはふわふわと浮いている状態です。
そのため、`float`をつけた要素の次の要素がある場合、`float`をつけた要素の下に潜り込んでしまいます。
これを解消するためには、次の要素に`clear`プロパティをつければよいです。

#まとめ
今回は、最初の学習で気になった点についてまとめてみました。
今後どんどん気になる点は出てくると思うので、自分の備忘録としてもまとめていこうと思います。
JavaScriptの基礎～変数宣言、if、switch、while、forなど


#JavaScriptの基本
コピペして使ってください。
ES6を対象としています。

###変数・定数とテンプレートリテラル

```javascript:sample.js
//コメント

//コンソール出力
console.log("Hello World");

//変数の宣言（再宣言、再代入可）
let name = "John";
//定数の宣言（再宣言、再代不可）
const name = "John";

//テンプレートリテラル（文字列と変数の連結）
const name = "John";
console.log(`こんにちは、${name}さん`);
```

###if文
```javascript:sample.js
//if文
const age = 12;
if (age >= 20) {
  console.log("私は20歳以上です");
}  else {
  console.log("私は20歳未満です");
}
//aとbが等しい
console.log(age===12);
//aとbが異なる
console.log(age!==12);

```

###switch文
```javascript
:sample.js
const rank = 5;

switch (rank) {
  case 1:
    console.log("金メダルです！");
    break;
  case 2:
    console.log("銀メダルです！");
    break;
  case 3:
    console.log("銅メダルです！");
    break;
  default:
    console.log("メダルはありません");
    break;    
  
}
```

###while文
```javascript:sample.js
let number = 1;

while (number<=100){
  console.log(number);
  number += 1;
}
```

###for文
```javascript:sample.js
for (let number = 1; number <= 100; number ++){
  console.log(number);
}
```
【Rails】sendを使ってメタプロっぽい書き方をしたので記しておく


タイトル通り、**send**メソッドを使ってメタプロっぽい書き方をやってみたので書き残しておく。


# 説明
deviseで `client`と`creator`という2つのモデルを用意している。
それぞれ、nameが登録されているか/されていないかによって、ログイン後の繊維ページが異なるが、
clientとcreator間での法則性は同一である。
↓こんな感じ

|      | name登録済み | name未登録 |
|:--:|:--:|:--:|
| **client**  | client_mypage_path | edit_client_path(current_client) |
| **creator** | creator_mypage_path | edit_creator_path(current_creator)|


# send使ってafter_sign_in_path_for
```application_controller.rb
class ApplicationController < ActionController::Base
  helper_method :current_resource, :current_resource_model, :other_side_model, :registered_name?

  def current_resource
    if client_signed_in?
      current_client
    elsif creator_signed_in?
      current_creator
    end
  end

  def current_resource_model
    return unless current_resource
    current_resource.class.to_s.downcase
  end

  # ログイン後に遷移するpathを設定
  def after_sign_in_path_for(resource)
    return unless current_resource
    resource_mypage_path = send(current_resource_model + "_mypage_path")
    edit_resource_path = send("edit_" + current_resource_model + "_path", current_resource)
    
    registered_name? ? resource_mypage_path : edit_resource_path
  end

  def registered_name?
    current_resource&.name.present?
  end
```


このように、複数のdeviseモデルでの法則的なコードを1つにまとめて記述する時に役に立ちそう。
agoutiで撮ったスクリーンショットをzipする【Go】

## 概要

agouti + phantomjsでスクリーンショットを撮ったのち、ローカルに保存、zipにまとめる
zipは`archive/zip`パッケージを使う

## やり方

```go
filename := "/path/to/file/screenshot.jpg"
page.Screenshot(filename)

dest, err := os.Create("screenshot.zip") //zip完成
if err != nil {
    log.Fatal(err)
}

zipWriter := zip.NewWriter(dest)
defer zipWriter.Close()

file, err := os.Open(filename)
if err != nil {
    log.Fatal(err)
}
defer file.Close()

w, err := zipWriter.Create(filename)//zip内にできるファイルのwriterを返す
if err != nil {
    log.Fatal(err)
}

_, err = io.Copy(w, file)//fileの内容をfilenameに書き込む
if err != nil {
    log.Fatal(err)
}


```

何か間違いがあればご指摘ください
redis-cliの中身確認でよく使うコマンド使い方メモ

# redis-cliの中身確認でよく使うコマンド使い方メモ

## keys
~~~ 
keys * 
~~~
で保存されているキーの一覧を確認できる

## type
~~~ 
type {key}
~~~ 
keyの型の種類を確認できる

## data type別の中身確認
### get {key}
stringの文字列を確認

### zrange {key} {start} {stop} {WITHSCORES}
zsetのソート済みセット型の中身を確認
startとstopは確認するレンジ（範囲）のオプション

### lrange {key} {start} {stop}
listの配列の中身を確認

### その他
メインどころはこれくらいで。
型はその他にも多々あるが、とりあえずtypeで種類みて上記以外の型は下記参照
http://redis.shibu.jp/commandreference/#id4

## monitor
ログファイルでいう``` tail -f ```のイメージ

## 有効期限（ttl）
setexコマンドはキーに有効期限を秒単位で設定する。
ttlコマンドは(文字型に限らず)キーに設定された有効期限を確認できます。

※TTL (Time To Live)とは、あるデータが破棄されるまで時間や、処理の繰り返し回数の上限を意味します。

## flushall値削除

~~~ 
flushall 
~~~

キーを削除する

※全部消すので注意
[linux]オーディオファイルのデータ形式を一括表示させる方法

個別のファイルはこれで
```sox --i filename```
ワイルドカードが使えるので
```sox --i dir/*wav```
で一括で調べられるし
```sox --i dir/*wav|grep Encod```
とかやればエンコーディングだけを抽出したり。

あとはにるなりやくなり
php-master-changes 2019-07-09

今日は VM のコード修正、ドキュメントの更新、SQLite の 3.28.0 への更新、Symfony で影響が出ていた修正のリバート、メモリリークの修正があった！
PHP 7.4.0alpha3 がそろそろ出そう、次は beta1。

# 2019-07-09
## dstogov: Fixed dispatch from inlined hybrid opcode to another opcode
- https://github.com/php/php-src/commit/1804fd634e9b7d25cc885f22dd822c51f26e8d0d
- [7.4~]
- ZEND_VM_KIND_HYBRID のディスパッチコードを修正

## petk: Update NEWS [ci skip]
- https://github.com/php/php-src/commit/f81be1aff63f0077a49311f2ccb8f79b2d055e50
- [7.2~]
- NEWS の更新

## petk: Add zend.exception_ignore_args [ci skip]
- https://github.com/php/php-src/commit/5017676438439f1f26a9ef8401bacec903a38ec5
- [7.4~]
- UPGRADING へ[先日追加された](https://qiita.com/sj-i/items/f6029131edb214445660#krakjoe-simple-ignore-arguments-in-exceptions-implementation) zend.exception_ignore_args について追記

## petk: Catch up with current procedures
- https://github.com/php/php-src/commit/d094ca83df2d57dd782884c23cabdc9a5d282ce8
- [7.4~]
- docs/release-process.md の内容を現状にあわせ更新

## derickr: Update NEWS for PHP 7.4.0alpha3
- https://github.com/php/php-src/commit/3fd7c478a5c83f6c596c70d001cd0c68d7fbe779
- PHP 7.4.0alpha3 のリリース用に NEWS の更新

## derickr: Update NEWS for 7.4.0beta1
- https://github.com/php/php-src/commit/086b476c27790889e25d872eec21090185ce4e6f
- 7.4 系の開発バージョンを PHP 7.4.0beta1 へ引き上げ

## dstogov: Remove duplicated code for (PRE|POST)_DEC_(OBJ|STATIC_PROP) opcodes
- https://github.com/php/php-src/commit/e1f418dd18479748739b93aa9f84b9a2e907cfbd
- [7.4~]
- VM の (PRE|POST)_DEC_(OBJ|STATIC_PROP) の重複コードを削除

## cmb69: Upgrade to SQLite 3.28.0
- https://github.com/php/php-src/commit/e944ae6b2a0533cb6098af8c2beb8d0f2c84ec6d
- [7.1~]
- ext/sqlite3 で、SQLite のバージョンを 3.28.0 に引き上げ

## nikic: Revert "Fixed bug [#76980](https://bugs.php.net/bug.php?id=76980)"
- https://github.com/php/php-src/commit/22ed362810c1b3a5ecb54ebd1d50d804c7fc3159
- [7.2~]
- [先日のなんじゃこりゃあの修正](https://qiita.com/sj-i/items/eb4236270b8e1d74a681#nikic-fixed-bug-76980)をリバート
- [Symfony で問題が出た](https://github.com/symfony/symfony/issues/32395)ため、7.2 系、7.3 系のみでリバートした形

## dstogov: Avoid unintended inlining
- https://github.com/php/php-src/commit/8f0c87e1b63807a1afb755a038ad57f2951a4505
- [7.4~]
- VM のコードで意図せぬインライン化を避けるよう修正

## devnexen: CGI: Fix memory leak on error paths
- https://github.com/php/php-src/commit/aa0e29a66838bd89547a5a8ec4ae25945556ad54
- [7.4~]
- sapi/cgi で、エラー時のメモリリークの修正
ポートフォリオの収益率の分散の求め方 数式


[株式の計量分析入門 ](https://www.amazon.co.jp/%E6%A0%AA%E5%BC%8F%E3%81%AE%E8%A8%88%E9%87%8F%E5%88%86%E6%9E%90%E5%85%A5%E9%96%80-%E2%80%95%E3%83%90%E3%83%AA%E3%83%A5%E3%82%A8%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%A8%E3%83%95%E3%82%A1%E3%82%AF%E3%82%BF%E3%83%BC%E3%83%A2%E3%83%87%E3%83%AB%E2%80%95-FinTech-%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%83%BC-%E6%B4%A5%E7%94%B0/dp/4254275811/ref=asc_df_4254275811/?tag=jpgo-22&linkCode=df0&hvadid=295699891199&hvpos=1o1&hvnetw=g&hvrand=2838921510017836799&hvpone=&hvptwo=&hvqmt=&hvdev=c&hvdvcmdl=&hvlocint=&hvlocphy=1009516&hvtargid=pla-526577119138&psc=1&th=1&psc=1)p.101 「ポートフォリオの収益率の分散」の理解した部分を共有したいと思います．

具体的には，以下の1つ目の式から2つ目の式への変形がわかりませんでした．

```math
\begin{align}
\sigma^{2}_p &= E(R_p-E(R_p))^{2}\\
&=w^{2}_A\sigma^{2}_A+w^{2}_B\sigma^{2}_B+2w_Aw_B\sigma_{AB}
\end{align}
```
この変形について考えたいと思います．
ここで与えられている情報を整理します．

<ポートフォリオの期待収益率>

```math
E(R_p) = w_AE(R_A)+w_BE(R_B)\\
w_A+w_B = 1
```

```math
w_A,w_B：銘柄AとBの投資配分\\
R_A,R_B：銘柄AとBの収益率
```
<ポートフォリオの収益率の分散>

(証明)

```math
\because
E(R_p) = w_AE(R_A)+w_BE(R_B)\\
\because
E(R_p^{2}) = w_A^{2}E(R_A^{2})+2w_Aw_BE(R_AR_B)+w_B^{2}E(R_B^{2})\\

```

```math
\begin{align}
\sigma^{2}_p &= E(R_p-E(R_p))^{2}\\
&=E(R^{2}_p-2R_pE(R_p)+E(R_p)^2)\\
&=E(R^{2}_p)-2E(R_p)E(R_p)+E(Rp)^{2}\\
&=E(R_p^{2})-E(R_p)^{2}\\
&=w_A^{2}E(R_A^{2})+2w_Aw_BE(R_AR_B)+w_B^{2}E(R_B^{2})-(w_AE(R_A)+w_BE(R_B))^{2}\\
&=w_A^{2}E(R_A^{2})+2w_Aw_BE(R_AR_B)+w_B^{2}E(R_B^{2})-w_A^{2}(E(R_A))^{2}-2w_Aw_BE(R_A)E(R_B)-w_B^{2}(E(R_B))^{2}\\
&=w_A^{2}(E(R_A^{2})-(E(R_A))^{2})+2w_Aw_B(E(R_ARB)-E(R_A)E(R_B))+w_B^{2}(E(R_B^{2})-(E(R_B))^{2})\\
&=w_A^{2}\sigma_A^{2}+2w_Aw_B\sigma_{AB}+w_B^{2}\sigma_B^{2}

\end{align}
```
証明終わり
M5StickCに書き込みができないときの確認事項

http://forum.m5stack.com/topic/814/error-on-downloading-to-m5stickc

Arduinoではこの現象は発生しません。

# IDFで書き込みできない

```
esptool.py v2.5.1
Serial port COM12
Connecting....
Chip is ESP32-PICO-D4 (revision 1)
Features: WiFi, BT, Dual Core, 240MHz, Embedded Flash, VRef calibration in efuse
MAC: d8:a0:1d
Uploading stub...
Running stub...
Stub running...
Changing baud rate to 921600
Changed.
Configuring flash size...
A fatal error occurred: Timed out waiting for packet header
```

# 原因

M5StickCがサポートするボーレートがあっていないのが原因です。

1200〜115200、250K、500K、750K、1500K

上記だと921600になっています。

# 対応

書き込み時の通信速度を合ったもの変更することで動作するようになります。
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97208/9e2003da-9739-9018-8b01-f64129c8b61f.png)
LINE Bot「コンパスパンダ(ver0)」

# はじめに
数ヶ月前から黙々と開発していたLINE Bot「コンパスパンダ」が完成したのでまとめます。ソースコードや概要は[こちら](https://github.com/ufoo68/compassPanda)で公開しています。
概要や使い方に関する説明はリンク先のドキュメントにて記述しています。この記事では技術的なお話のみに絞ります。後、LTとかに使いたいのでスライド形式です。

---

## システム図
![tweet.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209689/5a319643-ebcc-941c-0105-7d51b65e2a45.jpeg)


---

## システムの流れ

1. 基本的にユーザーは赤矢印のようにLINE Botとのインタラクションのみでこのアプリを操作
2. 位置情報の取得には[URLスキーム](https://developers.line.biz/ja/docs/messaging-api/using-line-url-scheme/)機能を用いて位置情報取得
3. 呟きのテキストは専用フォームを[LIFF](https://developers.line.biz/ja/docs/liff/overview/)で表示してそこから取得
4. 取得した情報をLINE Botのサーバーを介してデータベースに保存
5. 地図表示もLIFF上にてディスプレイ 

---

## 利用技術(LINE Bot)

- [Messaging API](https://developers.line.biz/ja/services/messaging-api/)
- [Cloud Functions](https://firebase.google.com/docs/functions/?hl=ja)
- [Node.js](https://nodejs.org/ja/)
    - [line-bot-sdk-nodejs](https://github.com/line/line-bot-sdk-nodejs)
    - [express](https://expressjs.com/ja/)
    - [firebase-functions](https://www.npmjs.com/package/firebase-functions)

---

## 利用技術（Form）

- [Bootstrap](https://getbootstrap.com/)
- [LIFF](https://developers.line.biz/ja/reference/liff/)

---

## 利用技術（データベース）

- [Cloud Firestore](https://firebase.google.com/docs/firestore/?hl=ja)

---

## 利用技術（Map）

- [React](https://ja.reactjs.org/)
- [Leaflet](https://leafletjs.com/)
- [gh-pages](https://github.com/tschaub/gh-pages)

---

# 苦労したこと

---

## 位置情報と呟きの結びつけ

- Messaging APIにはステート管理の機能がない
- 無理やりステート管理をするには
    1. データベースから一々データを引っ張る
    2. Push通知を使う（[BotBuilder](https://qiita.com/kenakamu/items/6dc043cfc1f199032883)が良さげ？）
    3. 何かしらの管理番号をトーク画面上に発行
-  今回は取っ付きやすい「3」の方法を選択 

---

## タイムスタンプを発行(一意となる管理番号がわりに)

![tweet.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209689/f529ff06-2287-9d0b-9b50-696b7deafa0d.jpeg)

---

## FirestoreのDocumentを１つにまとめた

- Firestoreには呼び出し数に制限あり
 - CollectionsではなくDocumentの数をカウント
- ネストを１つ深く
 - 取り出す時が少し面倒

```js
{
  timestamp: {
    tweet : text,
    latitude: latitude,
    longitude:  longitude
  }
}
```

---

# 最後に

---

## 課題

- UIが使いにくすぎる
    - 一度に位置と呟きを取得したい
- 会話の応答と呟きのDBへの保存の処理を同じLINE Botのサーバで処理している
    - LIFFに任せるなど役割分担を整理したい
    - DB用のサーバを立ててAPI化させたい
- 地図にテキストしか残せない
    - 写真とかにも対応させたい

---

## さらにやりたいこと

- 呟き内容のテキストを感情分析してポインターのアイコンに反映させる
- LINE Thingsと連携したサービス

とり会えず今ところ作れたのは最低限動くもの。ここから面白いサービスを作って行きたい。
ハッシュの２つの記述法

今回は、2つのハッシュの記述法を紹介する。


#1.ハッシュロケットおよびシンボルの記述法

```ruby
hash2 = { :key => "value"}
```
#2.シンボルのみの記述法

```ruby
hash3 = { key: "value"}
```
※keyと:(コロン)の間にスペースがあると、構文エラーになる。

最近では、ハッシュロケットを用いた記述法がなされることは少なく、シンボルのみの記述法が主流になっているみたいである(あくまで、自分の感想の範囲内)。


ちなみに、**ハッシュとしては別物ではあるが**、以下のようにハッシュと似たような書き方がある。

文字列としての書述法

```ruby
hash1 = { "key" => "value"}
```
＜参考記事＞
・http://mikanmarusan.hatenablog.com/entry/2017/12/29/005632
・https://qiita.com/yukimura1227/items/8c972efb27667dfac5cd
・https://qiita.com/YusukeHigaki/items/18db85aa9cba3cb42569

＜公式リファレンス＞
https://docs.ruby-lang.org/ja/latest/doc/index.html
わたしがRailsチュートリアルで学んだこと【4章】

* 注意：プログラミング歴29日の初心者が書いています

* 注意：間違っていたら優しく教えてください（喜びます）

「Ruby on Rails チュートリアル実例を使ってRailsを学ぼう」
 https://railstutorial.jp/

素晴らしいチュートリアルに感謝します。

#4.1.1 組み込みヘルパー

##組み込み関数ってなんですか
組み込み関数とは、プログラミング言語がもともと用意してくれている関数のことです。
ビルトイン関数とも言います。

##ヘルパーってなんですか
viewで使える関数のことをrailsではヘルパーと呼んでいます。

つまり、
「組み込みヘルパー」とは

* 「railsがもともと用意してくれている」

* 「viewで使える関数」

のことです。

#4.1.2 カスタムヘルパー

##カスタムヘルパーってなんですか

* 「自分でカスタムした（自分で作る）」

* 「viewで使える関数」

ということになります。

##リスト 4.2: full_titleヘルパーを定義する

「Home」ページにアクセスした際に、`Home | Ruby on Rails Tutorial Sample App` ではなく、`  Ruby on Rails Tutorial Sample App`のみを表示させたい。
しかし、現状のコードのまま実装を進めると、`|（縦棒）`が残ってしまいます。

「full_title」関数（ヘルパー）を作って、`|（縦棒）`が残らないようにしましょう。

##viewで使いたい関数はhelperディレクトリ内のファイルに記述する
これです。ここで言いたいのは多分これです。
「viewで使いたい関数はhelperディレクトリ内のファイルに記述すること」

##ヘルパーの中身

```rb
module ApplicationHelper
    # ページごとの完全なタイトルを返します。
  def full_title(page_title = '')　#1
    base_title = "Ruby on Rails Tutorial Sample App" #2
    if page_title.empty? #3
      base_title #4
    else
      page_title + " | " + base_title #5
    end
  end
end
```

＃1:　full_title関数の定義・引数`page_title = ''`は、『引数として`page_title`をとる。引数の指定がない場合は`' '`を引数とする』という意味です。

＃2：　変数`base_title`に`"Ruby on Rails Tutorial Sample App"`を代入。

＃3：　`page_title`に対して`.empty?`メソッドを用いて、変数内に値が存在するかどうかで条件分岐させます。

＃4：　`.empty?`メソッドは、変数が空なら`True`を返します。　`page_title`が空のとき、`base_titile`のみを返します。
（ちなみに、Rubyではメソッドがtrueまたはfalseを返す場合、メソッド名に？がついています。）

＃5：　変数内に値が存在する場合、`page_title`と`|（縦棒）`と`base_title`を返します。

---

`application_helper.rb`に書き込まれた上記の内容は、railsの力によって、自動的に`application.html.erb`で使用可能になります。

##apprication.html.erbの中身

```rb
<title><%= full_title(yield(:title)) %></title>
```
タイトルタグのコードです。
ヘルパーで定義した、「full_title」関数を呼び出しています。

引数には、yieldメソッドでページごとにprovideで設定してあるタイトルを呼び出しています。


##Homeページから「Home | 」を取り除く
まずはテストから作り初めて、それからテストを通す実装をします。

```rb
  test "should get home" do
    get static_pages_home_url
    assert_response :success
    assert_select "title", "Ruby on Rails Tutorial Sample App"#←ココ
  end
```

home_urlのgetリクエストに対して、
titleは`"Ruby on Rails Tutorial Sample App"`を表示
というテストです。

`rails test`すると当然失敗します。
なぜなら、`home.html.erb`で`provide`メソッドがタイトルとして"Home"を指定しているからです。

テストを通すためには、
`home.html.erb`から、`provide`メソッドの行を取り除きます。



#4.3.2 ブロック

ブロックは、メソッドの引数として渡すことのできる処理のかたまりです。
`{}波括弧`や`do ... end`の部分がブロックです。

```rb
test "should get home" do
  get static_pages_home_url
  assert_response :success
  assert_select "title", "Ruby on Rails Tutorial Sample App"
end
```
テスト文も、じつは`test`メソッドが、引数としてブロックをとっています。
`do ... end`で挟まれた処理が`test`メソッドの引数になっています。

#4.4.5 ユーザークラス

```rb
class User
  attr_accessor :name, :email #アクセサメソッド

  def initialize(attributes = {}) #initializeメソッド
    @name  = attributes[:name]
    @email = attributes[:email]
  end

  def formatted_email #インスタンスメソッドの定義
    "#{@name} <#{@email}>"
  end
end
```

＃アクセサメソッド
インスタンス変数に、クラス外からアクセスできるようになります。

＃initializeメソッド
User.newを実行すると自動的に呼び出されるメソッドです。
.newと同時に実行されます。

＃インスタンスメソッドの定義
メソッドを呼び出すことで、
"ユーザー名 <メールアドレス>"という文字列を返すメソッドです。
特に意味はないです。

```rb
 user = User.new(name: "Michael Hartl", email: "mhartl@example.com")
```
上記のように使えます。