OmniAICreator/Qiita-1.07M huggingface dataset:
for i in range(len(hoge)): って書かないで

# 初めてのfor文

多くのPython教材のfor文の章は、

```python
n = 10
for i in range(n):
    print(i)
```

と書くと「0〜9が出力できる！」というところからはじまる。

次に、「`"Hello, World!"`を1文字ずつ出力するにはどうすればいいか？」という問題に直面すると、

```python
hoge = "Hello, World!"
for i in range(len(hoge)):
    print(hoge[i])
```

と書く人が多い気がする。
もし以前に「文字列は`hoge[i]`と指定することで`i`番目を取り出せる」ことを知っていると、「0〜9が出力できる！」の2つの知識が合わさって上のコードが完成する。

しかし、私は

```python
hoge = "Hello, World!"
for c in hoge:
    print(c)
```

の書き方を強く推したい！

# なぜ？

正直、「**見た目がすっきりするから**」（逆にいうと、`range(len(hoge))`は見た目がごちゃごちゃするから）でしかない。しかし、感じ方は人それぞれなのでもう少し説得力のある理由を無理やりひねり出してみた。

- **速い**
- **変数名に意味が生じる**
- **変数を分けられる**
- **コードに一貫性が生じる**

## 速い

`hoge = "Hello, World!"`としてjupyterで速度を測定すると、

```python
# In[1]:
%%timeit
for i in range(len(hoge)):
    hoge[i]  # 出力はしない
# Out[1]:
# 976 ns ± 34.6 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

# In[2]:
%%timeit
for c in hoge:
    c
# Out[2]:
# 294 ns ± 3.83 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
```

となり、3倍ほど速い。しかし、単位がnsなので実感は特にない。
おそらく、リストの要素の参照に時間がかかっていると思われる。

## 変数名に意味が生じる

`for i in range(len(hoge)):`の場合、`i`は`hoge`がどんなものであろうとただのインデックスでしかない。しかし、`for c in hoge:`と書くと、`c`は`hoge`の各要素が入ることになる。
例えば、`hoge = schools`という2次元配列があり、その要素を全て出力するコードを以下の2通りで書いてみる。

```python
# サンプル1
for i in range(len(schools)):
    for j in range(len(schools[i])):
        print(schools[i][j])

# サンプル2
for students in schools:
    for student in students:
        print(student)
```
サンプル1では、`schools[i][j]`と言われても何が出てくるのか分からず、`schools`の定義までさかのぼらなければならない。サンプル2では、`schools`は`students`という生徒名簿が入っていて、各学校の生徒`student`が1人ずつ出力されるということをなんとなく予測できる。


## 変数を分けられる

`hoge = [("H", "h"), ("E", "e"), ("L", "l"), ("L", "l"), ("O", "o")]`として、for文内で大文字と小文字を別々に使いたい場合、

```python
for upper, lower in hoge:
    print(upper)
    print(lower)
```

のように、分けることができる。上の章と同じ理由で、`hoge[i][0], hoge[i][1]`とするよりも可読性が上がる。

## コードに一貫性が生じる

`hoge`がもしイテレータだったとしたら`TypeError: object of type 'generator' has no len()`のようなエラーが生じるため、lenは使えない。よって、`for i in hoge:`と書かなければならない。ここで、イテレータではないlistやstrなどの場合も`for i in hoge:`と書くとコードに一貫性が生じる。
そもそも、Pythonのfor文はイテレータであってもイテレータでなくても、内部的には`iter(hoge)`でinの後ろに置いたイテラブルオブジェクトはイテレータ化され、`next(hoge)`を繰り返すという動作は全く同じである。そのため、listやstrなどの場合もあたかもイテレータであるかのように実装する方が自然に感じる。
エクスプローラで表示中の場所でWindows Terminalを起動するTips

# 概要
エクスプローラのアドレスバーに`cmd`や`powershell`と入力すると、エクスプローラで表示中の場所をカレントディレクトリとしてシェルが起動します。

Windows Terminalでも`wt`と入力することで起動できますが、カレントディレクトリを`C:\\Users\Username`として起動してしまいます（2020年8月現在）。

エクスプローラで表示中の場所をカレントディレクトリとして起動するには、設定を変更する必要があります。

# 方法
1. 設定をクリックします
![Windows PowerShell 2020_08_05 16_12_42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192467/666b0f0d-32d4-b2e4-ee6d-ed41372d0ef2.png)

2. エディタが起動するので、`profiles > defaults`以下に`"startingDirectory": "."`と追記します。

```json
（前略）
"profiles":
{
  "defaults": {
    // Put settings here that you want to apply to all profiles.
    "startingDirectory":  "."
  },
（後略）
```

3. 一旦Windows Terminalを閉じて、エクスプローラのアドレスバーに`wt`と入力し、表示中のディレクトリをカレントディレクトリとしてWindows Terminalが表示されることを確認します。

# 参考リンク
[Windows Terminal: Open terminal in current folder via single command · Issue #620 · microsoft/terminal](https://github.com/microsoft/terminal/issues/620)
EC2にデプロイしたアプリケーションからシークレットキーを生成できない

#エラー

EC2にgithubからアプリをデプロイ完了した状態で

```
rake secret
```

を実行したところ下記のようなエラーが

```
You must use Bundler 2 or greater with this lockfile.
```

Bundlerのバージョンがおかしいのか？？


#解決
EC2のでデプロイしたアプリのディレクトリで下記の３つを実行すると
無事シークレットキーを生成できた

```
rm Gemfile.lock
gem install bundler
bundle
```
sorceryを使用して、ユーザー機能を作成する

自分用です！！

sorceryを使ってログイン機能を作成していきます。

## sorceryをインストール

```ruby:Gemfile
gem sorcery
```

bundele installします。

ここで、生成されるpasswordとpassword_confirmationはcrypted_passwordカラムに対する仮想属性となっています。



user.rbにif: -> { new_record? || changes[:crypted_password] }が記載されています。
これにより、登録したユーザーがパスワード以外のプロフィール項目を更新したい場合に、パスワードの入力を省略させることができます。

ajax通信にしない場合、
form_withでは、local: trueが指定されていること。

ログインしているか、の判定では、<% if current_user %>ではなく、sorceryで使える、
<% if logged_in %>を使っていく。

新規登録ページのルーティングにはresourcesを使う。

```ruby:routes.rb
resources :users, only: %i[new create]
```

user_sessions controllerでは、newアクションと、createアクションを作成
ここでは、loginというsorceryで使えるメソッドを使いログインします。

```ruby:user_sessions_controller.rb
 def create 

     @user = login(params[:email], params[:password]) 
     if @user 
       redirect_back_or_to root_path 
     else 
       render :new 
     end 
   end 
```
connexionとmarshmallow-sqlalchemyでDB定義上not nullかつdefaultありなフィールドで「Field may not be null.」が出るのを抑制した

とりあえず動いたからよし！したけどもっと筋の良い方法もありそう。

## 環境

```requirement.txt
# 抜粋
connexion==2.7.0
marshmallow-sqlalchemy==0.23.1
marshmallow==3.7.1
sqlalchemy==1.3.18
flask-marshmallow==0.13.0
flask-migrate==2.5.3
flask-sqlalchemy==2.4.4
flask==1.1.2
```

## 問題のColumn

```model.py
hoge_date = db.Column(db.Date(), nullable=False, default=date.fromisoformat('2099-12-31'))
```

### エラー内容

```console.log
marshmallow.exceptions.ValidationError: {'hoge_date': ['Field may not be null.']}
```

## 対処

```schema.py
class HogeSchema(ma.SQLAlchemyAutoSchema):
    class Meta:
        model = Hoge

    # これを追加
    @pre_load
    def remove_has_defalt_key_if_none(self, in_data: dict, **kwargs):
        if in_data.get('hoge_date') is None:
            in_data.pop('hoge_date', None)
        return in_data
```
Ionic Frameworkで印刷に対応する方法

Ionic Frameworkでは、WebサイトでモバイルUIを実現するために、縦横100%を指定した表示をしています。ブラウザで閲覧する分には問題ないのですが、 `overflow: hidden;` されているので、印刷した時には表示領域外は途切れてしまうことに注意が必要です。

https://note.com/rdlabo/n/n370a432b84d0

で書いたのですが、Ionicでつくったアプリで印刷対応したので、それでつかったCSSを紹介します。

```css
@media print {
  body {
    overflow: auto !important;
    height: auto !important;
    max-height: none !important;
    position: inherit !important;
  }
  .ion-page, ion-router-outlet {
    overflow: visible !important;
    position: inherit !important;
    contain: none;
  }
  ion-toolbar {
    border: none !important;
    --border-style: none !important;
  }
  ion-header, ion-content {
    display: none;
  }
}
```

`ion-content` を印刷するのは悪手なので（ ここに表示されているコンテンツは overflow: scroll; されており、スクロール量をJSで制御することがあるため ）、印刷する時はプレビュー画面を `ion-footer` に表示して、それを印刷するようにするのがおすすめです。

https://foodlabel.rdlabo.jp/

を試してもらえれば何となくわかるはず。それでは、また。
Distance Joint 2Dの解説

今回はphysics2Dの中にあるDistance Joint 2Dについて解説していこうと思います。

#Distance Joint 2Dとは
Distance Joint 2Dは、２つのオブジェクト間の距離を保たせるための機能です。
近づきもせず、離れもせず。そんな感じの機能です。
jointというのは「関節」や「付け根」などの意味を持っているそうです。

#Distance Joint 2Dの各パラメータ
![distanceJoint2d_param.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/685029/5514a2cc-51d1-db3a-0947-4e8571574d58.png)
所々パラメータの名前が見切れていてすみません。
パラメータが多いですが頑張って１つずつ見ていきましょう。

###・Enable Collision
このパラメータは、アタッチしたオブジェクトと当たり判定をするかどうかというのを決める為のものです。
これのチェックボックスに`チェックをすると衝突する`ようになります。
チェックを外すと、衝突判定をせずにアタッチしたオブジェクトをすり抜けられるようになります。
下のConnected Rigid Bodyが**None**の状態でここのチェックを外すと、Rigid Body2Dがないオブジェクトとの衝突判定をしなくなります。

###・Connected Rigid Body
ここにオブジェクトをアタッチすると、そのオブジェクトとつながった状態になります。
ここにオブジェクトをアタッチしない場合、ワールド空間とつながった状態になります。

###・Auto Configure Connected Anchor
２つ下の「Connected Anchor」を自動的に決めるためのものです。
あまりこれを使うのはオススメしません。これを使うとオブジェクトが変な挙動をする可能性があるからです。

###・Anchor
このオブジェクト側の基準点を決めるところです。
ワールド座標ではなく、このオブジェクトのローカル座標になっているので注意してください。
私はX、Yともに０にすることをオススメします。

###・Connected Anchor
アタッチしたオブジェクト側の基準点を決めるところです。
ここで使われている座標はアタッチしたオブジェクトのローカル座標です。
こちらもX、Yともに０にすることをオススメします。

###・Auto Configure Distance
ここのチェックボックスにチェックを入れると二つのアンカーの距離が下のDistanceに入力されます。
注意点として、このチェックボックスにチェックを入れたままプロジェクトを実行して、どちらかのオブジェクトの座標を直接いじると、Distanceの値が変わってしまいます。もしかしたら他にもDistanceの値が変わってしまうやり方があるかもしれないので、`チェックは１回付けたら外しておきましょう`。

###・Distance
ここでは、２つのアンカーの距離を決めます。
２つのオブジェクトの距離がここで決められた距離よりも離れていた場合、両方のオブジェクトが決められた距離まで近づいていきます。

###・Max Distance Only
ここのチェックボックスにチェックを入れると、２つのオブジェクトはDistanceで決められた距離よりも近づくことができるようになります。
ロープで繋がっているようなイメージです。

###・Break Force
二つのオブジェクトのつながりを断ち切り、`Distance Joint 2Dを削除する`ために必要な力を決めます。
infinityだと絶対に切れることはありません。
また、infinityに戻したいときは「**inf**」と入力してください。

#スクリプトの一例
>private void OnCollisionEnter2D(Collision2D collision)
    {
        this.GetComponent<DistanceJoint2D>().enableCollision = true;
        this.GetComponent<DistanceJoint2D>().connectedBody = collision.rigidbody;
        this.GetComponent<DistanceJoint2D>().anchor = new Vector2(0, 0);
        this.GetComponent<DistanceJoint2D>().connectedAnchor = new Vector2(0, 0);
        this.GetComponent<DistanceJoint2D>().distance = 2;
        this.GetComponent<DistanceJoint2D>().maxDistanceOnly = true;
        this.GetComponent<DistanceJoint2D>().breakForce = Mathf.Infinity;
    }

これはぶつかってきたオブジェクトを捕まえる的なプログラムです。
あらかじめこのオブジェクトのBody Type（Rigid Body2dのパラメータ）をkinematicにして床とかに触れないようにするか、if文を使って捕まえられるオブジェクトを限定する必要があります。

#おわりに
今回は前回よりもパラメータが多いうえにややこしいのも結構あって大変でした。
Joint系は恐らく全部こんな感じだと思いますが、あと８個あるのでそれは全部記事にしていこうと思います。
私もまだまだ理解できていないところが多いので、記事も書きながら勉強していく所存です。なので、この記事を読んでくださった皆様のなかで間違いなどを見つけたら、ご指摘いただけるとこちらとしても嬉しいです。
TypeScript の "?." と "!." ってなんだっけ

紛らわしい表記シリーズです。
TypeScript書いていると出てくるやつら。

`?.`: optional chaining
`!.`: Non-Null Assertion Operator

について。


# `?.` optional chaining
TypeScript ではなく JavaScript の機能です。
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Optional_chaining

> 接続されたオブジェクトチェーンの深くに位置するプロパティの値を、チェーン内の各参照が正しいかどうかを明示的に確認せずに読み込むことを可能にします。

nullだったらさらに先を評価しないで終わりにするためのもの。

> `let nestedProp = obj.first && obj.first.second;`

上記の短縮表記

> `let nestedProp = obj.first?.second;`

覚え方: nullかも?



# `!.` Non-Null Assertion Operator

TypeScriptの機能。

https://typescript-jp.gitbook.io/deep-dive/intro/strictnullchecks

> 型チェッカーが結論付けられないコンテキストにおいて、そのオペランドが非nullでかつ非undefinedであることをアサートすることができます。

型チェッカーに nullable だった変数を null じゃないよって教えるためのもの。 

> ポストフィックス式演算子

なので、正確には`!`単体が Non-Null Assertion Operatorで、`.` のほうにかかっているわけではなくて、`hoge!.fuga`だったら `hoge` の方にかかっているようです。

> これは単なるアサーションであり、型アサーションと同じように、あなたは値がnullでないことを確認する責任があることに注意してください。

単なるアサーションなので`?.`とは本質的に動きが違います。


覚え方: nullじゃない!
Electronをバージョンアップしたらwindowsで4G以上のファイルが読み込めなくなった話


electron6系から8系へバージョンアップした際に、4G以上の大きいサイズのファイルにおいて、ビルド後ローカルファイルが読み込めなくなりました(windowsのみ。ローカル起動では可能)
Mac OSでは読み込みが可能でした
どこにも情報が無く数週間悩んだのでまとめてみました

# 環境
* electron バージョン: electron 8.3.1
* OS: windows10 64bit
* ビルド: electron-builder 22.1.0

# XMLHttpRequest (XHR) 通信でローカルファイル読み込み

### 期待する値
* readyState=4(DONE)になる
* onloadイベントが発火

### 実際の値
* readyState=3(LOADING)のまま
* onprogress でずっと読み込み中 (totalの値まで到達してもonloadが呼ばれない) 
* ontimeoutも発火せず...

# 対応
* 32bit アプリを 64bit に変更(electron-builderにて、ビルドの引数を変更した)
  * 「electron-builder build --win --ia32」 -> 「npm run obfuscation && electron-builder build --win --x64」

# 補足(XMLHttpRequestで通信エラーになっているときの判定)

* totalフィールド: 全転送バイト数
* loadedフィールド: これまで転送されたバイト数
* 通信エラーになっている時以下になっている(全体の長さが不明の状態)
  * total = 0
  * lengthComputable = false 

``` xhr.js 
// データ受信中のイベント
var xhr = new XMLHttpRequest();
xhr.onprogress = function (oEvent) {
    if (oEvent.lengthComputable || xhr.total !== 0) {
        var percentComplete = oEvent.loaded / oEvent.total * 100;
        // ...
    } else {
        // 全体の長さが不明なため、進捗情報を計算できない
    }
```

# 参考
* https://qiita.com/ShinyaKato/items/64b6726c361f5377b0f3
* https://developer.mozilla.org/ja/docs/Web/API/XMLHttpRequest/Using_XMLHttpRequest
WSL1からWSL2への移行

#モチベーション
WSL1を用いてUbuntu18.04を利用中なので、それをWSL2を用いてで動かしたい。

#手順
まず、スタートメニューの検索窓にwinverと打って、windows10のバージョンを確認。
![2020-08-05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294969/10f884b0-b4ce-1b21-9967-34c2f75ed0bf.png)
このバージョンが2004かつOSビルドが1904であることを確認（そうでなければアップデートできない）。
そして、確認後、スタートメニューの検索窓にpowershellと入力し、powershellを管理者モードで実行し、wslのdefault設定をver 2に変更。

```
PS C:\WINDOWS\system32> wsl --set-default-version 2
Error: 0x1bc
```

しかし、上記のエラーが発生。StackOverFlowに類似の質問があり、その答えとしてWSL Linuxカーネルを更新せよと指示されていたので、その通りにする。
https://docs.microsoft.com/ja-jp/windows/wsl/wsl2-kernel にアクセスしLinuxカーネル更新プログラムをダウンロードし実行。
実行後、再度、管理者権限にてPowerShellを開き、以下のコマンドを実行

```
PS C:\WINDOWS\system32> wsl --set-default-version 2
WSL 2 との主な違いについては、https://aka.ms/wsl2 を参照してください
```
どうやら、default-versionは更新できたようなので、すでに動作しているUbuntu-18.04をWSL2に変更


```
PS C:\WINDOWS\system32> wsl --set-version Ubuntu-18.04 2
変換中です。この処理には数分かかることがあります...
WSL 2 との主な違いについては、https://aka.ms/wsl2 を参照してください
変換が完了しました。
```
最後に確認

```
PS C:\WINDOWS\system32> wsl --list --verbose
  NAME            STATE           VERSION
* Ubuntu-18.04    Stopped         2
```
無事完了。
Mavenでjettyを使って、動作確認をする。

# はじめに
eclipseを使って動的ファイルの動作確認をしていると、その端末でしか動かなったりする。なので、jettyを使って、動作確認をする。
あと個人的にeclipseでmavenプロジェクトはディレクトリ構成ちがったりめんどくさいので。

# 手順

## pom.xml編集

以下のプラグインを追加する。

```       
        <plugin>
          <groupId>org.mortbay.jetty</groupId>
          <artifactId>maven-jetty-plugin</artifactId>
          <version>6.1.10</version>
          <configuration>
            <scanIntervalSecounds>10</scanIntervalSecounds>
            <connectors>
              <connector implementation="org.mortbay.jetty.nio.SelectChannelConnector">
              <port>8080</port>
              <maxIdleTime>60000</maxIdleTime>
              </connector>
            </connectors>
          </configuration>
        </plugin>
```

## jettyを実行する。
コマンドライで以下を実行する。

```
mvn jetty:run
```

## ローカルホストに接続する。
`http://localhost:8080`にアクセスする。

# 最後に
jettyがうまく動かない場合あった。pom.xmlが悪いのか端末のが悪いのか、はたまたプラグインが悪いのか切り分けに時間がかかった。結果的にビルド用にコンテナ立てて都度確認した方が確実だし、依存性の問題がないので良いと思う。
GoでHello vinaka!(World!)を出す


Goに触れてみたかったので、学習をはじめてみました。

#ソフトウェアのインストール

[Go公式](https://golang.org/#)でダウンロード

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614274/b9ab0306-098d-6e7c-15d2-7771052f61bf.png)

##環境に合わせて、ダウンロード
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614274/9dc0ca68-ca4d-87a2-3edf-0bcf771804fa.png)

##手順に沿ってインストール
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614274/f2121129-e044-029f-6420-0eda5f935e53.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614274/615c8256-902f-58f6-b2e9-57bb90ec2632.png)
インストールをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614274/fd4b53bb-7677-2f3c-a60d-17ed5e24c04d.png)

少し時間かかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614274/ce95bfc7-601d-e521-0fe6-80525ff8fd84.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614274/e2848024-335a-b05e-498f-d56cfeee9d8e.png)

ゴミ箱に入れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614274/24db193f-681e-dd40-695a-f16bb4cdc153.png)

#Hello vinaka!(World!)の出力（失敗）

```main.go
package main

import (
	"fmt"
)

func main() {
	fmt.Println("Hello vinaka!")
}
```

```ターミナル
% go build main.go
zsh: command not found: go
```
"Hello vinaka!"が表示されない。

#GoをHomebrew のコマンドでインストール

```
% brew install go

%go version
go version go1.14.6 darwin/amd64

```
#Hello vinaka!(World!)の出力（成功）
```
% go run main.go
Hello vinaka!
```

#参考
[Golang Macへのインストール〜Homebrewを使って〜](https://qiita.com/megu_ma/items/7208be8de52b712955a0)
ZigBee(ジグビー)の説明、Bluetooth、IrDA、UWB、DSRC

平成31年春期 午前問題11

ZigBeeの説明として，適切なものはどれか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/00235e6c-ccc6-bc48-c66a-3f6893d976c5.png)

１、**ZigBee**
ZigBee(ジグビー)は、同じ無線通信規格のBluetoothよりも低速(20Kbps-250kbps)で伝送距離も短い(30cm程度)ながら、乾電池程度の電力で数年連続で稼働できる省電力性と低コストの利点を有する無線通信規格です。

規格のベース部分にはWPAN(Wireless Personal Area Network)の規格であるIEEE 802.15.4が使用され、主にIoTなどによるセンサネットワークの構築を目的として策定されました。また最大接続台数もBluetoothと比較して非常に多く、理論上は最大65,536台の端末を無線通信で接続可能です。

ZigBeeの名称はミツバチ(Bee)が花の周りをジグザグに飛び回る行動にちなんで名付けられました。

２、Bluetooth
携帯電話などのモバイル端末とヘッドセットなどの周辺機器とを接続するための近距離の無線通信として使われる。

３、IrDA(Infrared Data Association)
赤外線を利用して実現される無線通信であり、テレビ、エアコンなどのリモコン、携帯電話間のデータ通信などに使われる。
IrDA（アイアールディーエイ、Infrared Data Association）は赤外線による光無線データ通信を規格化している団体であり、またその規格そのものの名称である。
※ZigBeeは電波を使用します。

４、UWB(Ultra Wide Band，超広帯域無線)
広い周波数帯にデータを拡散することで高速な伝送を行う無線通信方式であり，近距離での映像や音楽配信などへの応用が検討されている。

５、DSRC(Dedicated Short- Range Communication：専用狭域通信)
5.8GHz帯を使用する近距離の無線技術であり，有料道路の料金所のETCなどで利用されている。
連絡用、業務用などに利用される小型の携帯型トランシーバに使われる。

※トランシーバー、トランシーバ (transceiver) とは、送信機 (transmitter) と受信機 (receiver) からなる造語で、電気通信やデータ伝送分野において電気信号の送受信を行う機器あるいは電子回路を指す。 


参考：
https://www.ap-siken.com/kakomon/31_haru/q11.html

https://www.nw-siken.com/kakomon/22_aki/am2_1.html

トランシーバー
https://ja.wikipedia.org/wiki/%E3%83%88%E3%83%A9%E3%83%B3%E3%82%B7%E3%83%BC%E3%83%90%E3%83%BC
JSのfilterの使い方

[参考](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/filter)

```JS
const words = ["Aビル","Bビル","Aさんの家","スーパー","A店"];

//const result = words.filter(word => word.length > 6);
const result = words.filter(word => word.match(/ビル/));

console.log(result);
```
Eclipsesショートカット　

#ショートカット

1. command + m　　　　　　　　　最大・最小化

2. command + + or -　　　　　　　文字の大きさ変更
3. Alt + command + x + j  　　　　　　　   実行
4. Alt + 矢印キー　　　　　　　　　行移動
5. command + d 　　　　　　　　  行削除
6. command + / 　　　　　　　　  コメントアウト
7. Shift + command + f 　　　　　フォーマット整形
8. **command + space 　　　　　　入力補助**
9. Shift + command + o 　　　　　インポート文整理
10. Alt + command + r 　　　　　　リファクタリング
11. command + . 　　　　　　　　　エラー・警告に移動
12. command + 1 　　　　　　　　　クイックフィックス（11と組み合わせると良い）
13. command + n 　　　　　　　　　新規作成（クラス作成に良い）
14. command + Alt + s 　　　　　　セッター・ゲッター（応用）
15. command + Alt + s 　　　　　　コンストラクタ（応用）
16. Alt + command + 矢印キー　　　行コピー
EC2でrbenvをインストール中のエラー

#エラー内容

このコマンドを入力しても・・・

```
git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
```

こんな感じで読み込めませんよーと言われてしまう

```
Cloning into '/home/mohupor03/.rbenv'...
fatal: unable to access 'https://github.com/sstephenson/rbenv.git/': Failed to connect to github.com port 443: Connection timed out
```

#解決
どうやらAWSのセキュリティグループのアウトバウンドルールが弾いているらしい

1.awsから使用中のセキュリティグループを選択
2.アウトバウンドルールの設定を編集
3.タイプを「全てのトラフィック」に変更

これで先ほどのコマンドを入力するとコマンドは通るのだが
無事インストールができたらHTTPに戻すのが適策だと思う
ローカルWebサーバーからSesameをそこそこ早く施錠・解錠する。

スマートロック「Sesame」を使っている人なら感じたことがあるでしょう。
クラウドにアクセスするのが遅すぎる…と。
かといってBluetoothに接続するも遅い…と。
これだったらリアル鍵を取り出した方が早いんじゃね…と。

SesameはWebAPIを公開してくれています。
なのでそれをPHPからcURLで叩いてそこそこ早く施錠・解錠したいと思います！

#準備
・SesameとWifiアクセスポイント
今このページを見ている人なら既に持ってると思いますが一応

・無線LANルーター
スマホでローカルWebサーバーにアクセスするのに要ります。

・PHPでcURLが動かせるローカルWebサーバー
構築方法はググって下さい。
IPアドレスはスマホからアクセスできるように固定しといて下さい。
自分はRaspberryPiにNginxを入れてます。WebサーバーにできるNASとかもありますし何でもいいと思います。

・SesameIDとAPIキー
下記URLを参照しSesameIDとAPIキーを取得して下さい。
[APIキー取得方法とセサミIDの確認方法](https://jp.candyhouse.co/blogs/how-to/api%E3%82%AD%E3%83%BC%E5%8F%96%E5%BE%97%E6%96%B9%E6%B3%95%E3%81%A8%E3%82%BB%E3%82%B5%E3%83%9Fid%E3%81%AE%E7%A2%BA%E8%AA%8D%E6%96%B9%E6%B3%95)


#PHPファイルをローカルWebサーバーに配置
SesameIDとAPIキーは書き換えて下さい。


・施錠用PHP

```php:lock.php

<?php
$url = 'https://api.candyhouse.co/public/sesame/<SesameID>';
$apikey = '<APIキー>';

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);

$data = array('command'=>'lock');
$data_json = json_encode($data);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Authorization: ' . $apikey, 'Content-Type: application/json'));
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_POSTFIELDS, $data_json);

curl_exec($ch);
curl_close($ch);
?>

```


・解錠用PHP

```php:unlock.php

<?php
$url = 'https://api.candyhouse.co/public/sesame/<SesameID>';
$apikey = '<APIキー>';

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);

$data = array('command'=>'unlock');
$data_json = json_encode($data);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Authorization: ' . $apikey, 'Content-Type: application/json'));
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_POSTFIELDS, $data_json);

curl_exec($ch);
curl_close($ch);
?>

```

上記PHPファイルを作成したらドキュメントルートに配置します。
`/var/www/html/lock.php`
`/var/www/html/unlock.php`

#施錠・解錠方法
スマホのWifiで無線LANルーターに接続し、ブラウザから
`http://<ローカルWebサーバーのIPアドレス>/lock.php`
にアクセスします。すると体感3秒位で施錠してくれます。

解錠も同様の手順でunlock.phpにアクセスします。

（ショートカットを作っておくと便利！）

#参考文献
[Sesame API](https://docs.candyhouse.co/#sesame-api)
client_loop: send disconnect: Broken pipeと出てsshに失敗する 

下記のようなエラーがでて、会社で立ててるリモート用のEC2にsshできなくてずっと悩んでた。

```bash
% ssh remote-proxy
client_loop: send disconnect: Broken pipe
```


タイムアウトの時間を伸ばせとか、そういうノイズばっかで探せなかったけど、下記を試したらうまくいきました。

```~/.ssh/config
Host *
  IPQoS lowdelay throughput
```
メモリのデータ転送速度

平成31年春期 午前問題10

バス幅が16ビット，メモリサイクルタイムが80ナノ秒で連続して動作できるメモリがある。このメモリのデータ転送速度は何Mバイト／秒か。ここで，Mは10^6を表す。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/c4ed1432-c2ca-0bdd-7d15-a036d7bffb99.png)

まずは、16bit/80ナノ秒は間違いますね。。。

下記のような計算しましょう：
メモリサイクル80ナノ秒より、1秒間のデータ転送回数は以下のように計算できます。

　1秒÷80ナノ秒＝1,000,000,000÷80(回)

バス幅は16ビット=2バイトなので1秒間に伝送されるデータ量は、

　2B/回　×　(1,000,000,000÷80)回＝25 MB／秒
Could not find generator 'uploader'. を解決する(Railsチュートリアル13章)

自分がrailsチュートリアルを進めていく上で、発生したエラーを記録していきます。
ハードはMacBook Air, 開発環境はVScodeを用いています。

#発生しているエラー

Railsチュートリアル13章 13.4.1

```
$ rails generate uploader Picture
Could not find generator 'uploader'. Maybe you meant 'helper', 'jbuilder' or 'model'
Run `rails generate --help` for more options.
```

#解決方法

以下を実行。

```
$ bin/spring stop
```

>参考：https://stackoverflow.com/questions/41000064/rails-5-carrierwave-could-not-find-generator-uploader

---

役に立ったら是非LGTMボタンをポチッと押していただけると嬉しいです。
一緒に Rails学習 頑張りましょう！:raised_hand_tone1:
React 関数コンポーネントでスクロールイベントを実装するには？


Reactのfunctionコードでスクロールイベント等を実装すると、
イベント関数を`useCallback`でくくってメモ化しておかないと`removeEventListener`が働かないとか、
スクロールで使用するフラグは`useRef`で再レンダリングされないようにする...など、
意外と気に掛ける点が多かったので、備忘録も込めてコードを載せておきます。

```react
import React, {
  useState, useEffect, useRef, useCallback,
} from 'react'

const TestDom = () => {
  const [isDisplay, setIsDisplay] = useState(false)

  const isRunning = useRef(false) // スクロール多発防止用フラグ

  // リスナに登録する関数
  const isScrollToggle = useCallback(() => {
    if (isRunning.current) return
    isRunning.current = true
    const scrollTop = window.pageYOffset || document.documentElement.scrollTop
    requestAnimationFrame(() => {
      if (scrollTop > 100) {
        setIsDisplay(true)
      } else {
        setIsDisplay(false)
      }
      isRunning.current = false
    })
  }, [])

  // 登録と後始末
  useEffect(() => {
    document.addEventListener('scroll', isScrollToggle, { passive: true })
    return () => {
      document.removeEventListener('scroll', isScrollToggle, { passive: true })
    }
  }, [])

 // バツボタンでリスナ削除~ などはこのように
  const onClickClose = () => {
    document.removeEventListener('scroll', isScrollToggle, { passive: true })
    setIsDisplay(false)
  }
```
PostgreSQLに関するあれこれまとめ

postgreSQLわかんないので奮闘記
随時更新するかも

・\zとか\duとかには;いらないけどCREATE ROLEとかの普通の構文にはいる
・ロールだけ見たいなら\zより\duかな
・ユーザーってロールのことなのか？そうっぽい
・MySQLではGRANTでユーザー作成できるけど、psqlではCREATE ROLE→GRANTじゃないとダメっぽ
・テーブルとかスキーマに関しては以下のサイトがわかりやすかった↓
https://www.dbonline.jp/postgresql/schema/index1.html
・スキーマは入れ子にできないディレクトリみたいなもん

・GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA schema_name TO 'role';
を実行したとき、
WARNING:  no privileges were granted for "table_name"
がいっぱい出るぞ
解決法は模索中
PHPで、ネストの深さがわからない配列中に特定のキーが含まれているかを調べる

意外とドンピシャのコードが見つからなかったので、備忘録として書いておきます。

```php
function hasKey($array, $key)
{
    $hasKey = false;
    array_walk_recursive($array, function ($eachItem, $eachKey) use(&$hasKey, $key) {
        $hasKey |= $eachKey === $key;
    });
    return (bool)$hasKey;
}
```

`array_reduce（）` が使えるのかと思ったんですが、ネストの下層まで潜ってreduceしてくれるわけではないようでした。
FITSファイルのプロット

# FITSとは
FITSはFlexible Image Transport Systemの略で，天文データを扱う際に良く用いられるかなり自由度の高いファイル形式である(拡張子は```.fits```)．

# FITSのプロットについて
FITSを開いてみる主な方法としては，

1. NRAOが提供するCASA( https://casa.nrao.edu )や，Harvard大学のSAOImage DS9( https://sites.google.com/cfa.harvard.edu/saoimageds9 )などのソフトを用いる方法
2. FITSを開くためのPythonのモジュールを用いる方法

の2種類がある．このうち2の方が見た目を整える方法が豊富で自由度が高いので，この方法を取り上げる．

以下にソースコードを示す．

```python
import matplotlib.pyplot as plt
import astropy.io.fits as ap
import aplpy

#=====================FITSファイルの読み込み=========================
fits = ap.open('/PATH/to/FITS/file')

#=====================書き出す図のフォントサイズの指定=================
plt.rcParams['font.size'] = 20

#=====================APLpyによる読み込み===========================
fig = aplpy.FITSFigure(fits)

#=====================値ごとに画像を色付け==============================
fig.show_colorscale(vmin=0, vmax=500, cmap='jet')

#=====================beam sizeを図示==============================
fig.add_beam()
fig.beam.set_color('black')
fig.beam.set_hatch('+')

#=====================Gridの表示==================================
fig.add_grid()
fig.grid.set_color('grey')

#=====================Color barの追加==================================
fig.add_colorbar()
fig.colorbar.set_axis_label_text('colorbar label')

#=====================画像の保存===================================
fig.save('fig/example.png')

#=====================plot=====================================
plt.show()
```

ここで取り上げた以外にも，多くのオプションが存在する．
certbotの削除

Let’s encrypt の証明書を失効させ、ドメインの設定を削除する
https://curecode.jp/tech/lets-encrypt-revoke-certificates-and-remove-domain/

httpでアクセスしたいのにhttpsへリダイレクトされる
https://qiita.com/tmasu/items/14632bf45cf05b90d0c9
chrome://net-internals/#hsts

キャッシュのクリアでいいのかも
https://gotohayato.com/content/100/
activerecord-importでUpdateする方法

微妙に書いてなかったので自分用にメモ

```Ruby
update_users = []
users.each do |user|
  user.name = "John"
  user.email = "test@mail.com"
  update_users << user
end

# ここのon_duplicate_key_updateに更新したい列名を渡す
User.import update_users, on_duplicate_key_update: [:name, :email]
```

GemのデフォルトはINSERTをする用途で`on_duplicate_key_update`オプションで列名を指定してあげることでキーが被ったときに指定した列が更新される(Upsertされる)という理解をした。

なので元々あるユーザーだけを更新して渡せばUpdateだけされるという感じ。

ちなみにDBによってこのオプションの指定の仕方は違うらしい
https://github.com/zdennis/activerecord-import/#duplicate-key-update

```Ruby
# MySQL version
Book.import [book], on_duplicate_key_update: [:title]

# PostgreSQL version
Book.import [book], on_duplicate_key_update: {conflict_target: [:id], columns: [:title]}
```
rspec spec時のNameError:   undefined local variable or method `config' for main:Objectの対処法

#### [rails5中級チュートリアル](https://techracho.bpsinc.jp/hachi8833/2018_02_21/51678)中のテスト実行時に起こったエラー


####エラー文

```ruby:ターミナル

#rsepc spec　実行時
NameError:
  undefined local variable or method `config' for main:Object
```

####原因と解決
rails_helper.rbへgemメソッドを使えるようにする記述の記述場所が誤っていた。

```ruby:rails_helper.rb
下記の記述をRSpec.configure do |config|の中に記述していなかったのが原因

  config.include Devise::Test::IntegrationHelpers, type: :feature
  config.include FactoryBot::Syntax::Methods
  Capybara.javascript_driver = :poltergeist
  Capybara.server = :puma
```

これでもう一度テストを実行すると...


```ruby:ターミナル
Finished in 0.17382 seconds (files took 5.23 seconds to load)
2 examples, 0 failures
```

無事成功😆



####反省
今回のエラーで１時間ほど時間を食ってしまった。中級チュートリアルの記事をよく見返すと今回の原因が書いてあったので、以後チュートリアルを進める際は、細部まで目を通すことを心がける。
EC2インスタンスにrubyの実行環境導入中のエラー

#エラー文

下記のサイトを参考にruby環境を構築していたところ・・・
https://qiita.com/naoki_mochizuki/items/814e0979217b1a25aa3e

```
[naoki] sudo yum install \ #yumのインストール
git make gcc-c++ patch \ #cとc++のコンパイラ、gitの差分をpatchファイルに変更
openssl-devel \ 
libyaml-devel libffi-devel libicu-devel \
libxml2 libxslt libxml2-devel libxslt-devel \
zlib-devel readline-devel \
mysql mysql-server mysql-devel \
ImageMagick ImageMagick-devel \
epel-release
```

色々とエラーが発生

```
-bash: openssl-deve: コマンドが見つかりません
-bash: libxml2: コマンドが見つかりません
※エラー文は消えてしまいましたがgitでも同じエラーが
```

#解決方法
完全に読み間違えていました。
指定のコマンドを実行する際は下記のように頭にsudo yum installを付けないといけないです。
これで全部コマンド通りました。気づくまで時間かかった・・・

```
【sudo yum install】　＋　【git make gcc-c++ patch】
```
【Laravel】ルート定義で使う「get」「post」「put」「putch」「delete」を使い分けるためにすること

## まずは、ルート定義の「HTTP 動詞」についておさらい。

Laravel では、複数の HTTP 動詞に対応したルートを登録することができます。例えば `routes/web.php` に

```php:routes/web.php
Route::get('/', [SampleController::class, 'index']);
Route::post('/', [SampleController::class, 'post']);
Route::put('/', [SampleController::class, 'put']);
Route::patch('/', [SampleController::class, 'putch']);
Route::delete('/', [SampleController::class, 'delete']);
```

と、このような感じで、同じ URI でも `get` , `post` , `put` , `patch` , `delete` の複数の HTTP 動詞に振り分けてルートを定義することが可能になります。

上記の例では、いずれのルートも `/` がマッチする URI となっていますが、`Route::` の次にくる HTTP 動詞によって、適応されるルートが異なってきます。

## GET 動詞が付くルートにアクセスするには

GET 動詞が付くルートにアクセスするには、普通にブラウザから URL を入力すると、GET リクエストでのアクセスとなりますので、GET 動詞の付くルートが適応されます。フォームを使用しなければ、だいたい GET リクエストのアクセスなので想像しやすいと思います。普通に a タグのリンクで遷移するのも GET リクエストです。

## POST 動詞が付くルートにアクセスするには

POST 動詞が付くルートにアクセスするには、HTML フォームの `method` 属性に `POST` を指定して送信してください。

```php
<form action="/foo/bar" method="POST">
    <input type="text" name="hitokoto">
    <input type="hidden" name="_token" value="{{ csrf_token() }}">
</form>
```
上記のようにフォームタグの `method` 属性の値が `POST` になっています。これによってPOST動詞が定義されているルートが適応されます。

## GET ＆ POST 動詞以外の HTTP 動詞が付くルートにアクセスするには？

HTML フォームの `method` 属性は `put`、`patch`、`delete` をサポートしていません。つまり、フォームタグの `method` 属性の値として `put` , `patch` , `delete` を指定することができません。なので Laravel は、フォームに `_method` 隠しフィールドを追加して、疑似的に `put`、`patch`、`delete` のリクエストを表現します。

```php:疑似的に「PUT」のリクエストを表現した例
<form action="/foo/bar" method="POST">
    <input type="text" name="hitokoto">
    <input type="hidden" name="_method" value="PUT">
    <input type="hidden" name="_token" value="{{ csrf_token() }}">
</form>
```

ちなみに上記コードは Blade ディレクティブを活用することで、さらにシンプルに記述することもできます。`_method` フィールドを、`@method` Blade ディレクティブに置き換えてください。

```php:@method ディレクティブを使用した例
<form action="/foo/bar" method="POST">
    <input type="text" name="hitokoto">
    @method('PUT')
    @csrf
</form>
```

少しすっきりしたコードになりました(=ﾟωﾟ)ﾉ
python3 学習メモ

# はじめに
python練習用にプログラミングの練習問題を解くときに使用した文法のメモです。
後で自分で見返せるように、自己学習のアウトプットをまとめてます。
使用したものは今後も追記予定。

# 標準入力・出力
```python
# 基本
input_line = input()

# スペースで区切られて入力が与えられた場合
input_line = input().rstrip().split(" ")

# リストで格納されているため、下記のようにインデックスを指定して値を取り出せる
a = input_line[0]
b = input_line[1]

# 出力の基本
print('abc')

# 改行させたくない場合
print('abc', end = "")
```
# for文
```python
# range関数で範囲指定
for i in range(1, 10): # 1～9まで

range(10) # 0～9まで。0から開始の場合はこれでもいい


# リストから値を取り出す
word = ['a', 'b', 'c']
for i in word:
    print(i)

#enumerateでリストのインデックスと要素を取り出す
word = ['a', 'b', 'c']
for i, j in enumerate(word):
    print(i, j) # iにインデックス、jに要素
```

# while文
```python
# 条件がtrueの間繰り返す
k = 0
while k <= 10:
    print(k)
    k += 1
```

# if文
```python
# 基本 elseは省略可
if a == 0:
    # 実行したい処理
else:
    # 実行したい処理

# and条件
if a and b:
    # 実行したい処理

# or条件
if a or b:
    # 実行したい処理

# 複数の分岐
if a == 0:
    # 実行したい処理
elif a < 0:
    # 実行したい処理
elif a > 0:
    # 実行したい処理
else:
    # 実行したい処理

```

# リスト
```python
a = [1, 2, 3] # リストの宣言

a.append(4) # 末尾に値を追加
a.pop(0) # インデックスで指定した要素の取り出し。指定がない場合は末尾の要素を取り出す

# リスト内で反復したいとき
for i in range(len(a)): # len()で配列の長さを取得してrangeの範囲に指定する

```

# 辞書
```python
# キー：値で登録する
dict = {"A":1, "B":2, "C":3, "D":4, "E":5, "F":6, "G":7}

# 辞書に含まれるすべてのキーを取り出す
mylist = list(dict.keys())
print(mylist)

# 辞書の中に指定したキーが含まれているかを調べる
if ('B' in dict.keys()) == True:
    print("keyは辞書に存在する")
else:
    print("keyは辞書に存在しない")
```

# 関数
```python
# 定義
def func():
    print('test')

def add(a, b):
    total = a + b
    return total

# 関数の呼び出し
func()
print(add(1, 1))
```
Intel REALSENSE D435 viewerを起動

Mac環境でREALSENSEのviewerを起動した時のメモを残しておく.

##コマンド
コマンドラインにてlibrealsenseのbuildディレクトリに移動して以下を実行

```
cmake .. -DBUILD_EXAMPLES=true -DBUILD_WITH_OPENMP=false -DHWM_OVER_XU=false -DBUILD_WITH_TM2=false -G Xcode
open librealsense2.xcodeproj
```
※「No "common/fw/target.h" file」というerrorが出たので下記のissueを参考にしてオプションを追加した.
https://github.com/IntelRealSense/librealsense/issues/6377

##Xcodeにてビルド
コマンドを実行すると自動的にXCodeが起動される.
<img width="1440" alt="スクリーンショット 2020-08-05 13.50.30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315030/ee589ccc-4ee2-9029-9b4b-3c187826bdaa.png">
ビルド先をrealsense-viewerに指定してビルド

viewerが起動されるので、デバイスを接続する.

##参考
Realsense D435をMacで動かす
https://qiita.com/OTL/items/ce49410580730d6dd499
odooモジュールの継承について

# 初めに
本記事はすでにodooのインストール方法など、環境構築ができている前提で話を進めるとします。

# odoo moduleの継承について
odooの一つの強力な機能はその他のモジュールを継承して実現するプロセスが可能だということです。既存のモジュールに則って修正をかけて、異なるレイヤーにて修正をかけられます。ビュー、業務ロジック、モデルなどのレイヤーにてできます。

# `__manifest__.py`のdependsについて
`__manifest__.py`ファイルにあるdependsは依頼関係を示したものです。dependsに入れたモジュールの意味合いは大体以下の2パターンがあります。

- 既存モジュールの元で新たな外観および機能を拡張したい。
- 既存モジュールの外観および機能を変更したい。

> ワンポイント：
- 例１：odooモジュールがあるとします。何か修正・拡張をしたいときに、todoモジュールでファイルを修正するのではなく、新たなモジュールを作成して、odooが提供しているモジュールに対して二次開発をするということになります。（ソースコードに修正をかけるのは避けたい）
- 例２：自作モジュールに対して修正をかけたい場合はモジュールにてそのまま修正する方法と、新たなモジュールを作成して継承するという方法もあります。

# モジュールにおけるモデル継承
モデルの継承については、通常は新たなフィールドを追加する、新たなフィールドの属性の追加、新たなモデルの追加といった方法があります。　　
モデル継承時、使わなければならないのは`_inherit`というコードです。（_inherit/_name/_inheritsなどの違いはあります）

``` python 
from odoo import api, fields, models, _
 
 
class ZeroneShelf(models.Model):
    _inherit = "zerone.shelf"
 
    description = fields.Text(string="シェルフ情報")
```

上記の方法は、`descroption`というフィールドを追加。

以下の方法はsay_hello()というメソッドを追加。

```python
#　メソッドを追加
class ZeroneShelf(models.Model):
    _inherit = "zerone.shelf"
 
    description = fields.Text(string="シェルフ情報")
 
    name = fields.Char(string="名称", size=32)
 
    def say_hello(self):
        print("hello")

# メソッドを書き換える
#2パターンがあります。
#第１：そのままコピーして持ってきて書き換える
#第２：superを入れて書き換える→以下はこれを試す
class ZeroneShelf(models.Model):
    _inherit = "zerone.shelf"
 
    description = fields.Text(string="シェルフ情報")
 
    name = fields.Char(string="名称", size=32)
 
    def say_hello(self):
        print("hello")
    #書き換えるメソッドだよ
    def write(self, vals):
        res = super(ZeroneShelf, self).write(vals)　#これはそのまま前のメソッドを持ってきた
        print("これはメソッドの書き換え", vals)　　#ここは追加した書き換えるための内容。ここはsuperの後に書いたが、前に書いてもOKなのです。順番はニーズに合わせてOK
        return res


```
Google Calendar APIでイベント登録時に参加者を設定した時だけエラーになる

#環境
- PHP：7.4.7
- google/apiclient：2.7.0

#前提
- サービスアカウントのキーファイル取得済み
- G Suiteドメイン全体の委任を有効化済
- `https://www.googleapis.com/auth/calendar`スコープのアクセス許可済み
- イベント参加者は自ドメイン内の人

#症状
参加者のいるイベント登録しようとすると以下のエラーメッセージが表示される。参加者がいないと問題なく登録される。
>Service accounts cannot invite attendees without Domain-Wide Delegation of Authority.

#原因
サービスアカウントそのままでは登録できない仕様らしい。
impersonate（日本語だとユーザーアカウントの成り代わり？）が必要だった。

#サンプルコード
```php:sample.php
/**
* @param string $calendarID イベント登録するカレンダーのID
* @param Google_Service_Calendar_Event $event イベント情報
*/
public function insertEvent($calendarID, $event) {
  $client = new Google_Client();
  $client->setApplicationName('Sample Calendar');
  $client->setScopes(array(Google_Service_Calendar::CALENDAR));
  $client->setAuthConfig('キーファイルのパス'));
  $client->setSubject('hoge@example.com');     // ←これが必要だった。
  $service = new Google_Service_Calendar($client);
  $service->events->insert($calendarId, $event);
}
```
#参考
https://issuetracker.google.com/issues/141704931
ssh接続で`load pubkey "~/.ssh/KEYNAME": invalid format`というエラーが出る

MacOSでgithubへ接続する際、毎回パスワードを聞かれるので

https://qiita.com/rorensu2236/items/df7d4c2cf621eeddd468

を参考にssh接続するようにしたが、接続するたびに

```
$ git fetch
load pubkey "/Users/canadie/.ssh/KEYNAME": invalid format
```

というWarningが表示されるようになってしまった(認証自体は成功しているし、`git`コマンドも使用できている)。

https://bbs.archlinux.org/viewtopic.php?pid=1909206#p1909206

を参考に、`~/.ssh/KEYNAME`に対応する公開鍵を、

`~/.ssh/KEYNAME.pub`

という名前で保存することでWarningを消すことができた。
ウェブサイト作成用備忘録・４号：chrome デベロッパーツールでは分からない background-image の落とし穴

日々の学習のアウトプットの為、自主学習の際に工夫した内容を記録していきます。

今回は background-image についての思い出話

自分が初めて自作のウェブページを作成し、レンタルサーバーを借りてアップロード、実機確認をした時の話…

#####「chromeデベロッパーツールで一通りのバグは確認した！ついに実機テストだ！」

色々調べて、やっとの思いでサイトのアップロードを完了させ、実機のPCでサイトのチェックを無事に済ませ、次に実機のスマホでサイトにアクセスしてみると…

#####「背景がなんかコレジャナイ…」

デベロッパーツールでは問題がなかったのに、実際のスマートフォンで確認すると、背景画像が正常に表示されない…

原因を調べた結果、以下の事が判明しました。

####原因

#####background-size: cover; と background-repeat: no-repeat; を設定した状態で、PC用の画像サイズの大きなファイルを background-image に設定すると、デベロッパーツール上のスマートフォン表示では背景が正常に表示されるが、実機のスマートフォンでは元画像の左上部分が拡大表示されていた。
↓
#####デベロッパーツール上ではPCのモニタサイズを基準にしてスマートフォンのモニタサイズを計算し、PCのモニタ上でスマホの画面表示を再現している。
↓
#####しかし、デベロッパーツールと実機のスマートフォンは基準にしているモニタサイズがそもそも違う為、実際のスマートフォンよりも大幅に大きな画像や、アスペクト比の異なる画像を設定すると、スマートフォンの実機表示の際に background-size: cover; が正しく適応されなくなる為だと思われる。（※別の原因があったら逆に教えて欲しいです）

その後、PCのモニタサイズに合わせた画像で、PCとスマートフォンの両方で background-size: cover; が正しく機能する方法を探したのですが、最終的に見つけることは出来ませんでした。しかし、以下の方法で対策が可能だと判明しました。

####対処法

#####１・メディアクエリを設定し、PC用の背景画像とスマートフォン用背景画像を複数用意する。

#####２・スマートフォンのモニタサイズに合わせた、画像端の繋ぎ目がループするシームレス加工された画像を使用＋background-repeat: repeat; の設定

当時の自分は画像の加工があまり得意ではなかった為、対処法・２で対策しました。

#####※ちなみに、当たり前といえば当たり前なのですが…背景画像をスマートフォンのモニタサイズ基準にリサイズした場合、スマートフォン表示では正常に表示されますが、今度はPC表示にした際に元サイズの小さな画像が background-size: cover; でPCのモニタサイズまで引き延ばされるため、元々の画質を維持することが出来ません。

今回はこれで以上になります。

あくまで自分用の備忘録ですが、他の方の参考になれば幸いです。
scrcpy で Android を PC から操作

## 概要

PC から Android 端末を操作するのに scrcpy がいいと教えてもらったので、ざっくり触った感じとその備忘録。

## 前提条件

- macOS
- Homebrew 導入済み
- adb 導入済み
- Android OS 5.0 以上

## scrcpy とは

> This application provides display and control of Android devices connected on USB (or over TCP/IP). It does not require any root access. It works on GNU/Linux, Windows and macOS.

このアプリは USB（または TCP/IP）で接続された Android 端末の表示と制御を提供する。Root 化不要。GNU/Linux、Windows、macOS で動作する。

## 導入

```bash
brew install scrcpy
```

Homebrew と adb が導入済みであればこれだけ。インストールが完了するまで少し時間がかかる。

## 起動

端末を PC に USB で接続し `scrcpy` コマンドで起動。端末側では予め開発者モードを有効にし、USB デバッグを許可しておくこと。

## ショートカット

| アクション       | ショートカット |
| ---------------- | -------------- |
| 全画面に切り替え | ⌘ + f          |
| 画面を左に回転   | ⌘ + ←          |
| 画面を右に回転   | ⌘ + →          |
| ホームボタン     | ⌃ + h          |
| 戻るボタン       | ⌘ + b          |
| アプリ切り替え   | ⌘ + s          |
| メニュー表示     | ⌃ + m          |
| 実機の画面 OFF   | ⌘ + o          |

取り敢えずよく使いそうなものだけ抜粋。

## その他機能

- 画面のキャプチャ(静止画/動画)
- ワイヤレス接続
- apk インストール
- ファイル共有

他にもまだいっぱいある。

## 所感

- 導入/設定が楽
- 機能が豊富
- 動作が軽い
- ラグが少ない
- 画質がいい

## 参考

- [Genymobile/scrcpy](https://github.com/Genymobile/scrcpy)
ターミナルでインスタンスへログインできなかった

AWSにアプリケーションをデプロイしようと思い
インスタンスへ下記のようにログインしたらエラーになる

```
.ssh % ssh -i sample01.pem ec2-user@54.196.78.41 
```

と入力すると

```
.ssh/config: line 5: Bad configuration option: idenityfile
.ssh/config: terminating, 1 bad configuration options
```
このようなエラーが・・・
sshの５行目の設定がおかしいと言われているので設定ファイルを開く

```
.ssh % vi /.ssh/config
```

下記のような設定ファイルが開く

```
Host sample01_key_rsa
  HostName パブリックIP
  Port 22
  User ユーザ名
  IdenityFile ~/.ssh/sample01_key_rsa
```

自分の場合は５行目に正しくは
IdentityFile と記載するところを
IdenityFile  とスペルが間違っていた

これを正しく書き換えるとログインできた

※ちなみにこの設定ファイルはiで編集モードに入れて終わったら
Esc → Shift+zzで保存できる
VueCLI3導入方法

自身のメモ用に記録しておきます。

#VueCLIのインストール

```vue

//オプショングローバルをつける
npm install -g @vue/cli

vue -v
@vue/cli 4.4.6

```

#プロジェクトの作成

```ターミナル
vue create traning-vue.js
?  Your connection to the default yarn registry seems to be slow.
   Use https://registry.npm.taobao.org for faster installation? No
```

```
//今回はdefaultを選択
?  Your connection to the default yarn registry seems to be slow.
   Use https://registry.npm.taobao.org for faster installation? No
```

```
Vue CLI v4.4.6
✨  Creating project in /Users/XXXX/training-vue.js
⚙️  Installing CLI plugins. This might take a while...
```

#アプリケーションの起動

```
//開発環境のサーバーを立ち上げる
cd training-vue.js
npm run serve
```
```packeage.json
{
  "name": "training-vue.js",
  "version": "0.1.0",
  "private": true,
  "scripts": {
    //ここ
    "serve": "vue-cli-service serve",
    "build": "vue-cli-service build",
    "lint": "vue-cli-service lint"
  },
```

##ビルド
```
npm run build
```

本番環境用に最適化された、``dist``ディレクトリが作成される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614274/459cbaba-7611-427c-99f8-27d97c42746b.png)
標準入力値のスペース区切りの方法

##文字列の場合

```
string[] array = Console.ReadLine().Split(' ');
string m = array[0];
string n = array[1];
```

##数字の場合
```
string[] array = Console.ReadLine().Split(' ');
int m = int.Parse(array[0]);
int n = int.Parse(array[1]);
```
rbenvでRuby自体のVersion管理をする

# これは何？
Rubyのインストール時にVersion管理ツール経由でインストールするときのメモです。Ubuntuでのインストールで説明しています。

# 手順
## rbenvをインストールする
```bash
$ sudo apt-get update
$ cd
$ git clone https://github.com/rbenv/rbenv.git ~/.rbenv
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
$ git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build
$ echo 'export PATH="$HOME/.rbenv/plugins/ruby-build/bin:$PATH"' >> ~/.bashrc
$ source ~/.bashrc
```

## Rubyをインストール
好みのVersionを指定してインストールして、そのVersionを使うように指定する。

```bash
$ rbenv install -l
$ rbenv install 2.7.1
$ rbenv global 2.3.1
```

## bundlerをインストールする

```bash
$ gem install bundler
$ rbenv rehash
```

## bundleのパッケージをインストールする

```bash
$ bundle install
```
MobileNetでチー牛診断

<p class="codepen" data-height="640" data-theme-id="dark" data-default-tab="result" data-user="04" data-slug-hash="LYGwrNa" style="height: 640px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="チー牛">
  <span>See the Pen <a href="https://codepen.io/04/pen/LYGwrNa">
  チー牛</a> by John Doe (<a href="https://codepen.io/04">@04</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

スマホの方は [こちら](https://codepen.io/04/full/LYGwrNa)

MobileNetで顔写真からチー牛顔かどうか判定するアプリ作りました。

# チー牛とは
チーズ牛丼好きそうな顔のことです。

人工知能なら特徴量を獲得できるとのことなので、
チーズ牛丼好きそうな顔の特徴量も獲得できると考えました。

![teachablemachine.withgoogle.com_train_image (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/69767/0398f04a-c9ea-3258-bc00-48fe27094325.png)

TensorFlowで学習しており、精度も大変高いです。

ご自分の顔がチーズ牛丼好きそうな顔かどうか高い精度で判断できます。

ぜひ試して見えてください
デジタル音声における波形の歪み

サンプリングレート 44.1KHz で正弦波の音声データを計算で作ると、以下の様な波形になります。（サンプルする位相をずらすと違った波形になります）
![sr441wave.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226677/20db3a54-8115-38e7-4f60-958632730cea.gif)
GIF 動画は、正弦波の周波数が 5KHz から 22KHz までで、200Hz 単位の増加です。青の折れ線がサンプリング後の波形で、画像の下側は時間方向を高密度化したものです。正弦波なので、常に四角い帯状になるはずですが、怪しげな波形が沢山現れます。サンプリングレートに近い周波数ほど、波形の変形が酷くなります。

一波長の中で、何カ所をサンプリング出来て、どの位相になるかが音質を決めます。極端な例 22.05KHz では 2 箇所になるので、$(+1,-1,+1,-1,...)$ や位相±90度で $(0,0,0,0,...)$ といった音量の並びになることがあります。前者は 22.05KHz の音ですが、後者は無音です。

CD とレコード盤の違いは約 20KHz 以上の音（超音波）の有無で、その違いを認識できるということは、レコード盤を使って再生される「超音波が聞こえている」という話になることがあります。このとき「20KHz 以下の可聴域の音は同じモノ」という暗黙の前提が潜んでいます。この前提が誤りなのは、GIF動画の通りです。超音波が聞こえなくても、可聴域の音が違うので、聞き比べたら違いは分かるというワケです。

サンプリングレートは、出したい音の周波数の２倍では不十分なのは、極端な例の通りです。２倍では、角度にすると、差が $0度,180度$ の並びで、サンプル誤差は最大 $90度$ です。４倍では $0度,90度,180度,270度$ で、誤差は最大 $45度$ です。まだ心許ない感じです。８倍で妥協すると、誤差は最大 $22.5度$ に抑えられます。23KHz くらいまで聞こえる人がいるらしいので、24KHz を上限として8倍すると、192KHz のサンプリングレートになります。この場合、サンプリングレートが 44.1KHz だと約 5.5KHz を上限として考えるとよさそうです。
Web会議におけるファシリテーション

# Web会議におけるファシリテーション


## 背景・目的
 コロナの影響を受け急速にテレワークが広がる中、Web会議の開催が増えている。また、対面のコードレビューもWeb経由に置き換わりつつある。
実際に集まって行う会議とWeb会議には違いがあり、ファシリテーションのやり方も変わってくることから、情報をまとめた。



## 読み手

- Web会議のファシリテータ（特にWeb会議になれていないファシリテータ向け）
- 実際に集まって行う会議のファシリテーションについて、基礎的な知識をお持ちの方
- 企業等のIT担当者でWeb会議を推進する立場の方



## 「Web会議におけるファシリテーション」基本的な考え方
　実際に集まって行う会議におけるファシリテーションの手法・考え方は、そのままWeb会議で利用できるものがほとんど。それに加え、「実際に集まって行う会議」と「Web会議」の違いを知り、Web会議独特の手法を加えることで、効果的なWeb会議のファシリテーションが可能になることが期待できる。



## 「実際に集まって行う会議」と「Web会議」の違い

　以下表の通り、Web会議は実際に集まって行う会議よりも時間・場所・コストの優位性がある。一方で「実際に集まる事によるメリット」もあるため、両者を使い分けることが望ましい。
（◎：メリット　△：デメリット）

||直接会う会議|web会議|備考|
|:----|:----|:----|:----|
|相手の表情・雰囲気|◎読み取りやすい|△読み取りにくい|表情・雰囲気等、無意識下に収集している情報が「相手が何を考えているか」を推し量るために有用と言われている。|
|場所|参加者全員が1箇所に集まる必要がある|◎どこからでも参加可能|参加者が1箇所に集まることはweb会議と比較すると手間だが、一方で顔を突き合わせて話すことで信頼感が増しやすいなどの効果が期待できる|
|時間|△場所の制約を受ける（会議室の空き時間・参加者が会議室に集まれる時間の調整が必要）|◎場所の制約を受けず調整可能| |
|会議開催時にかかる主な費用|△参加者の工数・会議室の場所代（レンタル費用・空調費用）・移動費|◎参加者の工数のみ| |
|必要なもの|会議室の確保・機材の用意|インターネット回線・各種デバイス・web会議用ツール| |
|IT環境上の制約|特になし|△回線・デバイス・ツール、どれか1つでも不調の場合、音声が伝わらない、会議が出来ない恐れがある||
|会議前後の時間の使い方|◎全員が集まっているため、会議が始まる前・終了後など、個別に他の参加者と追加の調整がやりやすい。|△会議開始前はロビーなどで待つことになるため、他の参加者とは連絡が取れないケースがある。会議終了時に他の参加者との通話がそこで終了する。|
|同時に話す|参加者が同時に話してもある程度聞取が可能|△参加者が同時に話すと聞き取りづらい|どちらの会議でも誰かが話しているときは話さないことが望ましい|


## 「実際に集まって行う会議」のメリットを「Web会議」で補うアイディア
　「実際に集まって行う会議」の主なメリットを「Web会議」で補うアイディアを記載。


### 表情・雰囲気の読み取り

#### 主催者が工夫できるポイント

- 高解像度のビデオ会議などを利用することで、相手の表情・雰囲気をつかめるようにする
- 参加者全員に気を配り
- 読取が難しいため、表情・雰囲気に頼らない会議を心がける
    - 参加者に積極的に働きかけ、発言を積極的に引き出すことを心がける
    - クローズドクエスチョンを活用し、相手の考えを明示的に述べてもらうことが「実際に集まって行う会議」よりも重要
        - 「〇〇さんはこの意見に賛成ですか？反対ですか？」

#### 参加者が工夫できるポイント

- 相槌を増やす
    - 主催者は参加者の考えを表情・雰囲気で掴みにくいことを理解し、相槌などの動きを増やすことで意思を伝えるようにするとよい


### 会議前後の時間の活用
- 会議主催が少し早めに参加することで、早く参加できる他の参加者同士で時間前に雑談をするタイミングが生まれる
- 会議終了後の個別調整は1対1通話を活用して行う



## 「Web会議」を効果的に行うための機能
　Web会議を効果的に行うための機能の概要・使い所について以下の通りまとめた。

### チャット
　テキストベースのコミュニケーション。
　マイクやスピーカの不調、回線負荷などでこちらの声が相手に伝わらないケースがある。そういった場合にも相手との意思疎通がやりやすい。
　また質問は「随時チャットで受け付ける」形式にすることで、参加者は気づいたタイミングで質問を投げ、主催は最後にそれを確認・回答することで一連の説明を中断されることなく行うことも可能。
　話しにくそうな参加者がいる場合、会議のグループチャットとは別に「主催と特定の参加者のみのチャット」を活用することで話しにくい話を引き出すことも可能。

### 挙手
　クリックひとつで「自分が発言したい」意思表示が出来る機能。チャットでも意思表示は可能だが、チャットと使い分けることでチャット側には議論の内容だけを集約させることが可能。後から「濃度の高い」チャット履歴を確認することが可能。

### ホワイトボード
　参加者全員で1つのホワイトボードを共有し、書き込み・図形の貼り付けなどが可能

### 議事メモ
　参加者全員が書き込める議事メモを用意することで、会議中に決まったことをリアルタイムで書き込み、会議終了と同時に議事メモを用意できる。
　参加者全員で書き上げることで、議事メモのレビューの時間も減らすことも可能。

### ファイルの共有・同時編集
　参加者全員で1つのファイルを共有し、話し合いながら編集・調整をすることで、会議終了と同時ににファイルを仕上げることが可能。資料のレビュー会などで非常に有効。

### 会議の録画
　事情があって参加出来なかった方が、会議の録画を見ることでどのような話し合いがあったのかを後から確認することが可能。
Azure CLI で Azure Synapse Analytics リソースを操作する

# はじめに

Azure Synapse Analytics は他の Azure サービスと同様に Azure CLI に対応しており、 **az synapse**  コマンドでリソースを操作することができます。よって、例えば Azure Portal の Azure Cloud Shell から CLI でリソースを管理することも可能です。

ただし、本稿執筆の2020年8月時点では az synapse コマンドは CLI の拡張機能として提供されているため、利用前に拡張機能をインストールする必要があります。

# 拡張機能のインストール

拡張機能のインストールは az extension コマンドにより実施します。--name 引数には **「synapse」** を指定します。

```
az extension add --name synapse
```

# CLI の実行

az synapse コマンドの機能一覧は[こちら](https://docs.microsoft.com/ja-jp/cli/azure/ext/synapse/synapse?view=azure-cli-latest)をご参照ください。以下はサブスクリプション配下の Synapse Workspace の一覧を出力するコマンドの例です。

```
az synapse workspace list
```

Azure Cloud Shell での実行後に結果が取得できていることがわかります。

![20200804_cli_synapse_01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/685288/b66f6ad2-3d7e-22f7-c49f-be922cb4da06.jpeg)

# まとめ

CLI があるとちょっとした管理作業であれば Synapse Studio を立ち上げなくても済ませられるので、便利ですね。

現在の az synapse コマンドで提供されている機能は Synapse Workspace/SQL pool/Spark pool の管理が主ですが、今後 Orchestrate や Monitor 関連の機能が拡充されると、より応用の幅が広がるかなと思いました。

# 参考 URL

[Azure CLI で拡張機能を使用する](https://docs.microsoft.com/ja-jp/cli/azure/azure-cli-extensions-overview?view=azure-cli-latest)
[az synapse](https://docs.microsoft.com/ja-jp/cli/azure/ext/synapse/synapse?view=azure-cli-latest)
スーパスカラ、マルチコアプロセッシング、マルチタスク

平成31年春期 午前問題8

スーパスカラの説明として，適切なものはどれか。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/b5e97237-a0d4-36b1-c02c-2e8d6a8a9b50.png)

スーパースカラ  【 superscalar 】  スーパースケーラ
スーパースカラとは、マイクロプロセッサ（MPU/CPU）の高速化手法の一つで、命令を解釈・実行する回路を複数備え、依存関係にない複数の命令を同時に実行できるようにしたもの。

スーパースカラは、CPU内部に複数のパイプラインを用意して、パイプラインの各ステージを並列に実行することで処理を高速化する方式です。パイプラインを複数用意したものをスーパスカラと呼んでいますが、各処理機構がパイプライン化されていなくても、複数の命令を一度に読み込み同時に並列実行するものであればスーパスカラと呼ばれます。スーパスカラの仕組みを最大限に活かすには、並列実行を乱す要因をできる限り解消しておく必要があります。


１、マルチコアプロセッシング
一つのチップ内に複数のプロセッサコアを実装し，複数のスレッドを並列に実行する。

２、マルチタスク
一つのプロセッサコアで複数のスレッドを切り替えて並列に実行する。

３、SIMD(Single Instruction, Multiple Data)
一つの命令で，複数の異なるデータに対する演算を，複数の演算器を用いて並列に実行する。

４、スーパスカラ
並列実行可能な複数の命令を，複数の演算器に振り分けることによって並列に実行する。
並列可能な複数の命令に分けるという記述がパイプラインを示しており、それを複数の演算器に振り分けて並列に実行するのでスーパスカラの説明です。


ーーーーーーーーーーーーーーーーーーーーーーーーーーーー
スーパスカラの説明として，適切なものはどれか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/06edf5bd-3de9-4df3-01ee-146a08bdf204.png)

＜スーパスカラ、スーパパイプライン＞
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/3b9b5155-67cb-2066-e311-c015809b8854.png)



参考：
https://www.ap-siken.com/kakomon/31_haru/q8.html

https://www.pm-siken.com/kakomon/31_haru/am1_4.html
12rep - EmbulkでファイルをGCSへアップロード

# GCSへファイルをアップロード
- gsutilコマンド叩いてアップしてもいいのですがEmbulk使ってアップしてみる
- [元記事: embulk-parser-none および embulk-filter-stdout プラグインのご紹介
](https://qiita.com/sonots/items/6cf9f1e6ce74778be71f)


# 使うEmbulkプラグイン
- [URL:embulk-parser-none](https://github.com/sonots/embulk-parser-none)
- 何も parse せず、payload カラム(デフォルト)として保存するだけの便利プラグイン

# ローカルファイルからGCSサンプル

``` yaml
in:
  type: file
  path_prefix: ./{ファイル名}.tar.gz
  parser:
    type: none
    column_name: payload
out:
  type: gcs
  bucket: {GCSバケット名}
  path_prefix: ./{ファイル名}.tar.gzip
  file_ext: .gzip
  sequence_format: ""
  auth_method: json_key
  json_keyfile: {サービスアカウントで発行したJson Key}.json
  formatter:
    type: csv
    delimiter: 0
    quote_policy: NONE
    header_line: false
  encoders:
    - {type: gzip}
```
Xcode11.6でflutter upgradeが出来ない対処法

Xcodeのバージョンが
**11.6**
flutterアプリのバージョンが
**1.12.13+hotfix.7 • channel stable**
だった事により実機デバッグエラーとなる状態に陥りました。

理由は下記の記事です。
[Xcode 11.4でFlutterの実機デバッグでエラーになった際の対応方法](https://qiita.com/zizi4n5/items/e94738e1cc326833c141)

対処方法としてflutterを1.15.3以上にしなければいけないのですがflutter upgradeしても
下記エラーが出てアップグレードできませんでした:frowning2:

```
Your flutter checkout has local changes that would be erased by upgrading. If you want to keep these changes, it is recommended that you stash them via "git
stash" or else commit the changes to a local branch. If it is okay to remove local changes, then re-run this command with --force.
```

下記コマンドで解決出来ました。:point_up_tone1:
強制アップグレードコマンドですね。

```
flutter upgrade --force
```

---

たまにFlutter（Dart）関係のことつぶやいていたりするので、[@amitatantan](https://twitter.com/amitatantan)をフォローしてくれると嬉しいです。