OmniAICreator/Qiita-1.07M huggingface dataset:
Power BI DesktopのクエリーでPythonを使ってデータを加工する

#はじめに
- Power BIのPower Query Editor(M言語)でデータの前処理を行うことができますが、 Pythonスクリプトの方が、やりたいことを実装しやすい場合もあります。
- ここでは、Pythonスクリプトの使用例として、変換テーブルを参照して文字列を置換する処理を作成してみます。

#サンプルデータ

Power Query Editorのデータ入力より、AttendanceテーブルとName_Conversionテーブルを作成します。

**Attendance**

|参加日|名前|
|:----|-----:|
|2018.7.2 |渡邊|
|2018.7.2 |斎藤|
|2018.8.4 |斉藤|
|2018.8.4 |渡辺|
|2018.8.4 |高橋|

※注）渡邊と渡辺、斎藤と斉藤は、同一人物で異なる漢字表記が混在しています:confused:

**Name_Conversion**

|変換前|変換後|
|:----|:-----|
|渡辺|渡邊|
|斉藤|斎藤|

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329764/6489648b-b3ce-806e-3ee9-fdcd5656517a.png)

#Python処理の追加

Name_Conversionテーブルに従い、Attendanceテーブルの名前を置換する処理を追加します。

1) Power Query Editorより、クエリのAttendanceテーブルを選択し、クエリの設定でPythonスクリプトを実行するを追加します。

2) スクリプトの記述はそのままでOKを押します。（データ結合のプライバシー設定についてのメッセージが表示されることがあります。）

3) Power Query文を修正し、前ステップの結果とName_Conversionテーブルをスクリプトで使用できるように修正します。

|　　　　　　|　Power Query　|
|:---------:|:---------:|
|修正前|= Python.Execute("# 'dataset' はこのスクリプトの入力データを保持しています#(lf)",[dataset=変更された型])|
|修正後|= Python.Execute("# 'dataset' はこのスクリプトの入力データを保持しています#(lf)",[dataset=変更された型,dataset2=Name_Conversion])|

4) 名前を置換するPythonスクリプトを追加します。

```Python
# 'dataset' はこのスクリプトの入力データを保持しています
for i in range(len(dataset2)):
        dataset['名前']=dataset['名前'].replace(dataset2['変換前'][i],dataset2['変換後'][i])
```
5) スクリプトの出力テーブルで、datasetとdataset2から、datasetのValueにあるTableを選択します。

![PBI_Python.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329764/3407beec-d7a6-2843-c2db-66ea58168b3f.gif)

#Pythonによるデータ前処理後のデータ
**Attendance**

|参加日|名前|
|:----|-----:|
|2018.7.2 |渡邊|
|2018.7.2 |斎藤|
|2018.8.4 |斎藤|
|2018.8.4 |渡邊|
|2018.8.4 |高橋|

#参考
- Power BI ドキュメント　クエリ エディターでの Python の使用  
https://docs.microsoft.com/ja-jp/power-bi/desktop-python-in-query-editor
【Unity】Animator.GetCurrentAnimatorStateInfoでステート遷移を待機するときの注意

# バージョン
Unity 2019.1.9f1

# はじめに
コルーチンを使ってステート遷移待ちをするときやらかしがちなミス。
ステート「Idle」から抜けたら何か処理をしたいとします。

# NG例

```cs:NG
    // NG
    private IEnumerator WaitStateChange()
    {
        var currentAnimatorState = _animator.GetCurrentAnimatorStateInfo(0);
        yield return new WaitWhile(() => currentAnimatorState.IsName("Idle"));
        Debug.Log("Do Something.");
    }
```

上のコードは一見問題なさそうですが、実際に実行すると上手く動作しません。
「Idle」から抜けているはずなのに、いつまでたってもWaitWhileから抜けてくれないのです。

…それもそのはず。
Animator.GetCurrentAnimatorStateInfoの戻り値をキャッシュしたものでチェックしていますが、戻り値の[AnimatorStateInfo](https://docs.unity3d.com/ja/current/ScriptReference/AnimatorStateInfo.html)は構造体なので値型。
それをいくら監視していても書き換わらないですね。

# OK例
正しくは下記のように、毎回取る形にします。

```cs:OK
    // OK
    private IEnumerator WaitStateChange()
    {
        yield return new WaitWhile(() => _animator.GetCurrentAnimatorStateInfo(0).IsName("Idle"));
        Debug.Log("Do Something.");
    }
```

当たり前と言えば当たり前なんですが、私はこれで躓いてしばらく悩みました…。
JavaScriptってこんな感じなんだ！JavaScriptに触れてみた

未来電子テクノロジーでインターンをしている mrm1027 です。

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

<div class="heading">
  <h1>はじめに</h1>
</div>

プログラミングを始めて、実は2ヶ月が経ちました。
自由課題が予想以上に遅れをとっていて早く仕上げて、次のステップに進みたいと思っている今日この頃です…。


<div class="container">
  <h2> JavaScript</h2>
</div>

今自由課題をやっていて「画像切り替え機能」を実装するために、JavaScriptを少しずつかじり始めました。
ProgateのJavaScriptパートの最初の印象は。「うわ、数学やん…」でした。
私は数学がどちらかと言うと好きではあったのに、高校2年生のときに諦めてしまったことをきっかけにずっと苦手意識を持っています。

ここまでの範囲では、一応文系の私でもなんとかプログラミングはできてきましたが、ここから少しずつ苦労していきそうなフラグが立っています。。

しかし、まだ基本的な部分は理解ができるのでなんとか耐えてますね。。

そこで今回は、JavaScriptの基本の基本を復習がてら簡単にまとめたいと思います。

<div class="container">
  <h2> 変数・定数について　</h2>
</div>

▼変数　（let）

コードを書くときに、長い文字列や、同じ数値・計算式が何度も出てくるときがあります。
その都度同じコードをわざわざ書くのは相当面倒ですよね。
そんなときに活躍するのが「変数」の存在です。

変数とは、さまざまな文字列や数値を入れておく箱のイメージを持つとよいと説明されることが多いです。

▼定数　（const）

定数は変数と違って、値を更新して使いまわすことができません。
デメリットのように感じますが、実際のコードを書く上では役立ちよく使います。
例えば、長いコードを書くなかで同じ値を使いまわす場合、途中で値が書き換わってしまうことがあります。
長いコードとなるとどこにバグがあるか分からなくなり、更新できる変数を使うとバグを発見するのに時間がかかり面倒です。
そこで、役立つのが「定数」というわけです。



<div class="container">
  <h2>まとめ</h2>
</div>

変装・定数などが理解できるようになりました。
ひとつひとつ出力するのが楽しく感じます。
これからの知識の蓄積を忘れず、学習を進めていきます。
acts_as_listで並び替えたときに他のレコードのupdated_atを更新させない方法

[結論はコチラ](https://qiita.com/tkoyama1988/items/70893d29b6f150eaa7b0#%E7%B5%90%E8%AB%96)

## 課題

acts_as_listを適用しているModelに対して、新規作成(new -> save)や並び替え（insert_at）したときに他のレコードも `position` が変わるので、 `updated_at` が更新されてしまう。

https://github.com/swanandp/acts_as_list

## やりたいこと

新規作成や並び替えで他のレコードの `updated_at` が更新されないようにしたい。

## 前提

- acts_as_list gem を入れている
- Modelのカラムにpositionを追加している

## やってみたこと

### 1.record_timestamps を使ってみる（NG）

```
Article.record_timestamps = false
Article.new.save
Article.record_timestamps = true
```

ログのクエリを見ると `updated_at` が更新されてしまっている。

```
UPDATE `article` SET `position` = (`article`.`position` - 1), `updated_at` = '2019-08-11 16:53:19' WHERE (1 = 1)
```

### 2. gemを調査

acts_as_list-0.9.19/lib/acts_as_list/active_record/acts/position_column_method_definer.rb#L45あたり

```
      define_singleton_method :update_all_with_touch do |updates|
        updates += touch_record_sql if touch_on_update
        update_all(updates)
      end
```

なるほど、 `touch_on_update` が怪しい。

### 3. gemのGithubを見てみた。

README.md を読んでみたが、特に `touch_on_update` の記載はなかったが、テストコードに以下の記述があった。

https://github.com/swanandp/acts_as_list/blob/27f4050293d6c481750b6ce1812c8e80b3fad984/test/test_list.rb

```
class SequentialUpdatesAltIdTouchDisabled < SequentialUpdatesAltId
  acts_as_list column: "pos", touch_on_update: false
end
```

なるほど、 `touch_on_update: false` を付けてみよう。

## 結論

- `touch_on_update: false` を付けたら更新できた。

```
class Article < ActiveRecord::Base
  acts_as_list top_of_list: 0, add_new_at: :top, touch_on_update: false
end
```

ログのクエリを見ると `updated_at` が更新されていない。

```
UPDATE `article` SET `position` = (`article`.`position` - 1) WHERE (1 = 1)
```

- 新規作成時： 他のレコードはpositionが +1 されるが、 updated_at は更新されない
- 並び替え時： 動かしたレコードのみ updated_at が更新される。他もpositionは変わるが、updated_at は更新されない

### ついでに

- PR作成： https://github.com/swanandp/acts_as_list/pull/356
AWSのサービス一覧（ちょっとだけ）

初めて触ってみた。
どういう物があるのか覚えていかないとだめなので、ちょっとづつ書いていきたい。


#### EC2(いーしーつー)
仮想サーバを建てられる。
OpenStackやESXiと似たような感じ。
ただしOSはAmazonLinuxとかいうAmazonオリジナルっぽいやつ。

#### IAM（あいあむ）
AWSアカウントにアクセスできるユーザとか権限なんかを設定できる。
SSHの鍵を登録したりして、コマンドラインからコードをアップロードしたりするのが楽になったりする。
ロールとかポリシーっていうのがあって、各ユーザにどのAWSのサービスの権限を与えるか設定できる。
ここがガバガバだと乗っ取られたときに大変なことになる危険性がある。
キツキツだと新しいことをやるときはいちいちココで許可してやらないとだめ。
難しい。

#### S3(えすすりー)
FTPサーバでGETとPUTとLISTしか使えないような感じのサービス。
ストレージ。バケット（ばけつみたいなもの）を定義してあげる。
ファイルを置くことが出来る。
アップロードは基本無料とか書いてあった気がする。（ダウンロードで課金？）
安くて無制限に物が置ける。
壊れない。


#### CloudFront(くらうどふろんと)
超でっかいWEBサーバみたいなもの。
ドキュメントルートとかにS3に置いたHTMLファイルなんかを書いてやると
ブラウザで見ることが出来る。
ただし、動くのはHTMLとCSSとJSだけみたい。
PHPは動かないから、お問い合わせサイト（フォーム入力）とかはできないみたい。

Cloudfront＋S3でサイトを作るのは結構当たり前になってきてる。
壊れないからね。

#### CloudWatch（くらうどうぉっち）
AWS内で作ったものを監視してくれる。
ログとかCPUメモリ、ネットワークトラフィック、ディスクIOなどのパフォーマンスも見れるみたい。

#### code commit(こーどこみっと)
AWSにあるgit。
ソースコード管理するリポジトリが作れる。
ここにpushしたりするには、IAMでHTTPS,SSHでCodeCommitにアクセスするユーザを生成してあげないとだめ。
ログインアカウントとは別。

#### CodePipeline(こーどぱいぷらいん)
CodeCommit
CodeBuild
CodeDeploy
3つの親玉。

リポジトリにプッシュされたのを確認して、ファイルをS3バケットやEC2にデプロイ（適用？配布？）してくれる。
わざわざサーバにアクセスしなくて住む。
と併せるとテストして自動で最新化してくれる。
3つ全部使わなくても動く。
CodeCommitとCodePipelineだけでも動いてくれる。

#### CodeBuild(こーどびるど)
CodeCommitにあるリポジトリをテストランしてくれる。
nodeとかPHPで書かれたものとか。
動くときは裏でコンテナが立ち上がって、テストしてくれる。
テスト内容はbuildspecっていうymlファイルで書いてあげないとだめ。
AWS CLIって言われるオリジナルなコマンドラインを使うらしいので、勉強しないと…。
ブランチ単位で動作を変えたり出来るらしい。

#### CodeDeploy（こーどでぷろい）
CodeBuildが終わったあとに配布してくれる。
まだ触ったこと無い。


とりあえずこんな感じです。
アーティファクトとかロールとか聞き慣れない言葉が多くて辛い…。
Adobe ExtensionのFirst Step

## はじめに

AdobeアプリケーションのExtension（通称 CEP：Common Extensibility Platform）の画面開発を始めるために必要な情報をまとめる。


## 開発ツール

Visual Studio Code 1.37.1

## あると便利な Visual Studio Code 拡張

1. [ExtendScript](https://marketplace.visualstudio.com/items?itemName=hennamann.jsx)
2. [CC Extension Builder](https://marketplace.visualstudio.com/items?itemName=hennamann.jsx)
3. [Adobe Script Runner](https://marketplace.visualstudio.com/items?itemName=renderTom.adobe-script-runner)

## Getting Started

**上記の拡張がインストールしている前提で話を進める**

1. コマンドパレットを実行
2. 「Create a New CC Extension」コマンドを見つける
3. Extension IDを入力(デフォルトは「com.example.helloworld」)
4. Extensionの名称を入力
5. どのテンプレートを利用するか選択

    a. basic

        単純な「Hello World」のよくあるテンプレート
        中身のファイルには本当に基本的なものしか記述されていない

    b topcoat

        AdobeのオープンソースCSSライブラリの名称
        CSSを導入したもの

    c spectrum

        topcoatの代わりにspectrumというCSSライブラリを用いたもの

    d theme
        カスタム

※テンプレートの作成場所はmacOSXの場合は下記である。

```
~/Library/Application Support/Adobe/CEP/extensions/
```

ここに置いてあるExtensionは、manifestで指定したアプリケーションとバージョンすべてで利用可能。

## 例(InDesign)

InDesignで使えるように、manifestファイルを修正する。 CSXSフォルダにあるmanifest.xmlを開き以下のように書き換える。

``` xml
<Host Name="IDSN" Version="10.0" />
....
```

単一バージョン表記だと、そのバージョン以降実行可能となる（この例では10.0＝CC2014以降）。動作バージョンを範囲で指定する場合は[10.0, 13.1]のように記述する。

※manifest.xmlに関しては[こちら](https://forums.adobe.com/docs/DOC-8786)を参考にすること。

### DebugModeの設定

Debugする時は、以下のコマンドを実行する。
```
defaults write com.adobe.CSXS.7 PlayerDebugMode 1 //ほぼCC 2017用
defaults write com.adobe.CSXS.8 PlayerDebugMode 1 //ほぼCC 2018用
defaults write com.adobe.CSXS.9 PlayerDebugMode 1 //ほぼCC 2019用
```

## 実行

manifestでバージョン指定したInDesignを起動し、ウィンドウメニュー＞エクステンションと開くと、先程サンプルとして作成したCEPが選べることができ、実行することができる。

## 証明書の発行

[ここ](https://github.com/Adobe-CEP/CEP-Resources)より、 `ZXPSignCmd` をダウンロードする。以下のコマンドを実行する。

```
ZXPSignCmd -selfSignedCert 国名コード 地域 組織 名前 パスワード 出力ファイルパス.p12 for osx
ZXPSignCmd.exe -selfSignedCert 国名コード 地域 組織 名前 パスワード 出力ファイルパス.p12 for win
```

ツールのコマンドは[PACKAGING AND SIGNING ADOBE EXTENSIONS TECHNICAL NOTE](https://wwwimages2.adobe.com/content/dam/acom/en/devnet/creativesuite/pdfs/SigningTechNote_CC.pdf)を参考にすること。

## パッケージ化

以下のコマンドを実行する。

```
ZXPSignCmd -sign ソースフォルダのパス 出力ファイルパス.zxp 証明書.p12 設定した証明書のパスワード for osx
ZXPSignCmd.exe -sign ソースフォルダのパス 出力ファイルパス.zxp 証明書.p12 設定した証明書のパスワード for win
```

`.zxp` が生成される。

## ZXPをインストールする方法

ZXPをAdobe製品へインストールするには、ツールが必要となる。ExMan Command Line Toolなるものを使用する。

1. Adobe Extension Manager CCを[こちらから](https://www.adobe.com/jp/exchange/em_download/)ダウンロードする。
2. Adobe Extension Manager CCをインストールする。
3. ExManCmdが配置されていのフォルダへ移動する。
    * Windowsの場合:C:\Program Files\Adobe\Adobe Extension Manager CC\ 
    * MacOSXの場合:/Applications/Adobe Extension Manager CC/Adobe Extension Manager CC.app/Contents/MacOS/
4. コマンドラインツールを実行しインストールを開始する。

以上。
Djangoで開発するときによく使うコマンドまとめ

## プロジェクトの作成
`django-admin startproject プロジェクト名`

## アプリケーションの作成
`python3 manage.py startapp アプリケーション名`

## モデルをDBに反映させる
変更差分を検知するマイグレーションファイルを作成
`python3 manage.py makemigrations`

作成したマイグレーションファイルの変更内容をデータベースに反映
`python3 manage.py migrate`

## 開発用サーバを立ち上げる
`python3 manage.py runserver 0.0.0.0:8000`

## 静的ファイルを集める
`python3 manage.py collectstatic`

## なんかコマンドが通らなくなった時
`export PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin`
JavaScript | forEach, for of  (繰り返し - 配列)

forループ以外で配列の中身をそれぞれ取り出したい時  

```js
const bmth = ["bring", "me", "the", "horizon"];
```
期待する出力結果

```js
"0 - bring"
"1 - me"
"2 - the"
"3 - horizon"
```

## forEach()

```js

bmth.forEach((item, index)=>{
  console.log(`${index} - ${item}`)
})
```

## for of

```js

for( let [index, item] of bmth.entries()){
  console.log(`${index} - ${item}`)
}
```
＊ indexいらない、各要素だけ欲しい時  

```js

for (let item of bmth) {
  console.log(item)
}

// 期待する出力結果
// "bring"
// "me"
// "the"
// "horizon"
```

## for of (オブジェクトに対して)  
JavaScriptでいうオブジェクトってRubyでいうハッシュ的な
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Object  


```js
// オブジェクトを用意
const myProfile = {
  name: "Yo",
  age: 26,
  "my fav":[{
    album: "amo", 
    song: "sugar honey ice & tea"
  },{
    album: "suicide season", 
    song: "diamonds aren't forever"
  }]
};
```

```js
for (let prop of Object.keys(myProfile)) {
  console.log(`key: ${prop} - value: ${myProfile[prop]}`);
}
```

```js
// 期待する出力結果

"key: name - value: Yo"
"key: age - value: 26"
"key: my fav - value: [object Object],[object Object]"
```

### 一緒に参考にしたい記事
*    [JavaScript で forEach を使うのは最終手段](https://qiita.com/diescake/items/70d9b0cbd4e3d5cc6fce)
* [2019年版: JavaScriptのループの考察  ](https://qiita.com/shibukawa/items/4cae2a1410754d519232)
* [JavaScriptで配列やオブジェクトをループする良い方法を真剣に検討してみた
] (https://qiita.com/endam/items/808a084859e3a101ab8f)
RoboMasterS1を解析してROSで動かせるように頑張ってみる（CAN情報収集）

###秋月から届かない・・・
先日CAN解析をする手順やシステム構成について書きましたが、、、
https://qiita.com/tatsuyai713/items/3acb160ba96f1788ce97
次に書くと言っていたmROSでCANを動かすというのは、まだ出来ていません・・・

というのもmROS＆CAN-BUSx2chを動かすためには以下のものが必要です。
・GR-PEACH
・CAN トランシーバー(www.amazon.co.jp/dp/B072FGVLZQ)こんなやつ
・【P-06877】Ａｒｄｕｉｎｏ用ユニバーサル基板　ガラスコンポジット
・【P-05060】ＸＢｅｅ用２．５４ｍｍピッチ変換基板
・【C-08978】２ｍｍピッチピンヘッダ　１×１０
・【C-07142】ロープロファイルピンヘッダ　（低オス）

で、下の４つは秋月から買ったのですが、秋月も忙しいようでやっと今日（8/22）発送されました。

なので、mROSの話は次回においておいて、今回はRoboMaster S1のCAN解析について書きたいと思います。

###海外にRoboMater S1のCAN解析している人がいるらしいよ？
会社で個人でRoboMaster S1を持っている方から、「CAN解析してる人おるで」と言われて、リンクを送っていただきました。
https://forum.dji.com/forum.php?mod=viewthread&tid=195399
Development Boardがなんちゃらとか書かれていて、リンクもありますが、これはおそらく本物のRoboMaster向けの基板なのでここでは触れません。

で、この画像です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179542/8c200d70-fe40-dd7c-741b-f93b555ba419.png)

あとこんなのも貼ってありました。
| No,systime,time,CAN channel,receive/send,ID ,frame type,frame,length,data |
| 00000,="22:40:09.538",452.9922,ch1,接收,0x0201,数据帧,标准帧,0x06,x| A0 48 08 01 5C DB  |
| 00001,="22:40:09.538",512.3520,ch1,接收,0x0202,数据帧,标准帧,0x05,x| 00 00 00 D6 7C  |
| 00002,="22:40:09.538",512.3531,ch1,接收,0x0203,数据帧,标准帧,0x08,x| 55 16 04 FC 04 09 A2 9C  |
| 00003,="22:40:09.538",512.3532,ch1,接收,0x0203,数据帧,标准帧,0x08,x| 00 3F 76 35 FF 00 00 87  |
| 00004,="22:40:09.538",512.3533,ch1,接收,0x0203,数据帧,标准帧,0x06,x| 00 F2 FF 02 0B CE  |
| 00005,="22:40:09.538",512.3534,ch1,接收,0x0203,数据帧,标准帧,0x08,x| 55 11 04 92 04 03 D6 3A  |
| 00006,="22:40:09.538",512.3535,ch1,接收,0x0203,数据帧,标准帧,0x08,x| 00 3F 42 87 00 0D F8 74  |
| 00007,="22:40:09.538",512.3536,ch1,接收,0x0203,数据帧,标准帧,0x01,x| 2A  |
| 00008,="22:40:09.538",512.3537,ch1,接收,0x0203,数据帧,标准帧,0x08,x| 55 0F 04 A2 04 C3 D8 3A  |
| 00009,="22:40:09.538",512.3538,ch1,接收,0x0203,数据帧,标准帧,0x07,x| 00 3F 2E 80 00 18 BA  |
| 00010,="22:40:09.538",512.3539,ch1,接收,0x0203,数据帧,标准帧,0x08,x| 55 71 04 C8 04 1D 6D A8  |
| 00011,="22:40:09.538",512.3540,ch1,接收,0x0203,数据帧,标准帧,0x08,x| 00 00 F0 04 AF 8D CE C2  |
| 00012,="22:40:09.538",512.3542,ch1,接收,0x0203,数据帧,标准帧,0x08,x| 64 80 D4 F2 62 87 55 1D  |

ああああーーーーーー、これはああああああ・・・・
CAN IDはこれだけあったみたいですが、フォーラムの人は解析は困難だと言っています。
0x0201,0x0202,0x0203,0x0204,0x0211,0x0212,0x0213,0x0214,0x0215,0x0216

では、メッセージを見ていきましょう。
通常は前回書いたように、CANのIDごとに周期的に一定の間隔で同じバイト長でメッセージが送られてきます。
が、が、が、DJIはCANの使い方を知らないようで、なんと同じIDでいろいろ連続で送信しています。これは通常まずいですが、とりあえず解析を続けましょう。

よくみるとそうです。これはCAN IDを決めてただシリアル通信のように流しているだけのようです（CAN使う意味あるんかいな？？？）
さらによーく見るとわかりますがどうやら繰り返しパターンがあります。先頭の0x55がそれです。
気づかれた方も多いと思いますが、0x55は01010101です。詳しい人は知っておられると思いますが。0xAAや0x55はコマンドメッセージのヘッダによく使われます。なので、0x55がヘッダとみて間違いないでしょう。
続いて、次のバイトですが、0x11だったり、0x0Fだったりします。ここである規則性に気づきます。
そうです！小さいほうがメッセージ長が短く大きい方がメッセージ長が長いです！
つまり２バイト目はメッセージ長さを表しています。
そして３バイト目は必ず0x04になっているようです
なんか行けそうな気がしてきたでしょうか？

###まあでも実機ないし・・・
これ以上の解析は流石に実機がないと無理です・・・ということで今日（8/22）にポチりました。
ただヨドバシは取り寄せなので、しばらくかかるようです。さすがにその間にmROSはやっときたいですね。
あ、あと通信を乗っ取るために線をぶった切る必要があるのですが、補修用部品を手に入れる方法をご存じの方がいれば教えてください。
ではまた次回。
【Swift】PasoriのreadWithoutEncryptionByメソッドがreleaseビルドで動作しなかった話。

# 発生事象

以下のメソッドでICカードの諸々の情報を取得することができます。

```Objective-c:
(NSString *)readWithoutEncryptionBy:(felica_card_t)card
```


今回発生したのは、、


Debugビルドだと、値を取得することが出来るのに、、


releaseビルドだと、NULLが返却されて、読取り直後に落ちてしまうという事象です。


# 解決策

![Screen Shot 2019-08-22 at 11.09.54 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261934/f4025fc8-967a-7da0-ca7a-3ad2ba8c76a2.png)

こうしたら直った。
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

![Screen Shot 2019-08-22 at 11.10.04 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261934/6484ca67-20e0-1c0a-f5e8-8a657a81449b.png)


# 解説

`GCC_OPTIMIZATION_LEVEL`
という、コンパイル時の最適化レベルを最低レベルに設定することで、上記の事象は解決しました。
※ちなみに、その次の`Fast`というレベルでもNGでした。

# 参考文献

[iOSプロジェクトのBuildを高速化する](https://developers.cyberagent.co.jp/blog/archives/7815/)
[Apple 公式ドキュメント](https://swift.org/blog/whole-module-optimizations/)
shellscriptでハマった事

ファイル監視システムを作成しようと思い，シェルスクリプトで実装しました．しかし，基本的な箇所に苦戦したので，ハマった箇所を記述します．
環境:macOs High Sierra  バージョン 10.13.6
#shellscriptでハマった事
以下，列挙します．
# if文
if文の条件式を[]で記述するが[]内部にスペースを開ける．

**良い例**

```test.sh
#!/bin/bash
FILE="log.txt"

if [ -e $FILE ]; then
  echo "File exists."
else
  echo can\'t find log.txt
fi
```
```
$ ls
log.txt		test.sh		test.txt
$ ./test.sh 
File exists.
```

**悪い例**

```test.sh
#!/bin/bash
FILE="log.txt"

if [-e $FILE]; then
  echo "File exists."
else
  echo can\'t find log.txt
fi
```

実行結果

```
$ ./test.sh 
./test.sh: line 4: [-e: command not found
```


# 変数宣言
変数宣言するときの=はスペースを開けずに記述する．
**良い例**

```test.sh
#!/bin/bash
hoge=1
echo $hoge
```

実行結果．1が出力される．

```
$ ./test.sh 
1
```

**悪い例**

```
#!/bin/bash
hoge = 1
echo $hoge
```

実行結果．何も出力されない．

```
$ ./test.sh 

```

# 標準出力を変数に格納する
標準出力するコマンドをバッククォートで囲む．シングルクォーテーションで囲むと文字列として認識される．

**良い例**

```test.sh
#!/bin/bash
hoge=`find *.txt -type f`
echo $hoge
```

実行結果

```
$ls
log.txt		test.sh		test.txt
$ ./test.sh 
log.txt test.txt
```
**悪い例**

```test.sh
#!/bin/bash
hoge=`find *.txt -type f`
echo $hoge
```

実行結果

```
$ls
log.txt		test.sh		test.txt
$ ./test.sh 
find log.txt test.txt -type f
```


#終わりに
シェルスクリプトはスペースにシビアだと認識した．
次シェルスクリプトを書くときはスペースを意識する．
Leetcode #173: Binary Search Tree Iterator

```swift
class BSTIterator {
    private var ar = [Int]()
    private var index = 0
    
    init(_ root: TreeNode?) {
        ar = inorderTraversal(root)
    }
    
    /** @return the next smallest number */
    func next() -> Int {
        index += 1
        return ar[index - 1]
    }
    
    /** @return whether we have a next smallest number */
    func hasNext() -> Bool {
        return index < ar.count
    }
    
    private func inorderTraversal(_ node: TreeNode?) -> [Int] {
        if node == nil {
            return []
        }
        return inorderTraversal(node?.left) + [node!.val] + inorderTraversal(node?.right)
    }
}
```
django, firebaseで詰まったときの対処備忘録

どうも未来電子でインターンに参加しているものです。
プログラミング初心者のため間違っているかもしれませんが、お手柔らかにお願いします。
今回は私がdjango、firebaseで詰まったときの対処法を備忘録としてまとめたいと思います。

#django
私は最初https://docs.docker.com/compose/django/のサイトに従ってdocker-composeしようとしました。
しかしサイト通りに

```
$ sudo docker-compose run web django-admin startproject composeexample .
```
とコマンドを打ってもエラーが出るだけでした。
しかし

```
$ docker-compose run web django-admin.py startproject composeexample .
```
とコマンドを打つことでできました。




#firebaseコマンドが見つからないときの対処法
firebaseでデプロイしようと

```
firebase login
```
とコマンドを打ちましたが

```
command not found: firebase
```
と返されるだけで何もできませんでした。
しかし

```
$ export PATH=$PATH:`npm bin -g`
```
とコマンドを打つことで解決できました。

#参考にしたサイト
http://docs.docker.jp/v1.9/compose/django.html

https://qiita.com/ebichan_88/items/e3e30461ad4ddd9368f5
Markdown Preview EnhancedでPDF出力する。

VS CodeにインストールしたMarkdown Preview Enhancedで、PDF出力する方法のメモです。
Windows環境前提です。

## Chromeをインストールする、またはEdgeを指定する
### Google Chromeをインストールする場合

Markdown Preview Enhancedをインストールして、[Chrome (Puppeteer)] -> [PDF]を選択しただけだと、このようなエラーになります。

```
TypeError [ERR_INVALID_ARG_TYPE]: The "file" argument must be of type string. Received type object
```
エラーを見ても全然意味がわかりませんが、
[Documentation](https://shd101wyy.github.io/markdown-preview-enhanced/#/puppeteer)に
> You need to have the Chrome browser installed.

とあるので、Chromeをインストールします。

### Edgeを指定する場合

Google Chromeの代わりにChromium版Edgeを使用することができます。

setting.jsonに下記の様に設定します。

```
"markdown-preview-enhanced.chromePath": "C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\msedge.exe"
```

## font-family を変更する

Chromeをインストールすると、PDFを出力できるようになったはずですが、俗に「中華フォント」と呼ばれるフォントで日本語が表示させてしまいます。

CSSを編集し、フォントを指定します。
`~\.mume\style.less` にCSSファイルがあるので、印刷用の設定を追加します。

```css
@media print {
.markdown-preview.markdown-preview {
    font-family: "MS PMincho";
}
}
```

## PlantUML用のfont-family を変更する
前述のfont-familyの変更だけでは、Markdown内のPlantUML(svg)は変わりません。
`svg text`を追加します。

```css
@media print{
.markdown-preview.markdown-preview, svg text {
    font-family: "MS PMincho";
}
}
```
Zoho Sheet に Deluge と JSON で行を追加する方法

(初出: 2019-08-01 を一部改訂 "How to append JSON data as rows in a Zoho Sheet" を改題)

Zoho Mail では Deluge によるカスタム関数定義でフィルターを書けるわけだが、その仕様は判然としない。フィルターにカスタム関数を使うことを指定した段階で簡素なエディターが開き、そこでいくつかの機能はわかる。実際にははるかに多くの機能を利用できるようだ。特に Zoho プロダクトと連携する機能はおもしろい。

Deluge のエディターの中で `zoho.` と入力すると Zoho 各サービスの名前がずらりと出てくる。ここで `sheet.` と入力すれば、Zoho Sheet に対して何を行えるかがうかがえる。特に `createRecords` が興味深い。その名の通り既存のシート上へデータを追記するものだ。

残念ながら Deluge のドキュメントを漁ってみても zoho.sheet オブジェクトの `createRecords` メソッドの直接的な説明は発見できない。REST API の説明ならある。これを見ながらアタリを付ければ、なんとかなる人にはなんとかなるだろう。

下準備として、ワークシートに A1:”Name”, B1:”Region”, C1:”Units” と入力しておく。これがワークシート上のデータベースの各フィールドとなる。 なお実験ではフィールド名に少なくとも日本語の文字は使えなかった。データベースのフィールド名だと思えばさほど不満もないが、やはり Zoho には (というか Google などの巨大プレイヤー以外には) 小国 (日本も含む) の事情にまでは手が回らないのだろう。

[Zoho Sheet REST API v2: Append rows with JSON data](https://www.zoho.com/sheet/help/api/v2/#UPDATE-Append-rows-with-JSON-data) を参照して適当に読み替え、次の関数を作ってみる。

```c
string TEST() {
    resourceId = "RESOURCEID";  // 37-char string
    sheetName = "Sheet1";
    data = {{"Name":"Joe","Region":"South","Units":284},
            {"Name":"Beth","Region":"East","Units":290}};
    result = zoho.sheet.createRecords(resourceId, sheetName, data);
    return result;
}
```

RUN してみると、A2:C3 セルにデータが追加された。戻り値はいらないのだろうが、デバッグ中はあった方がエラーメッセージが取得できるのでよい。

上記は REST API の メソッド `worksheet.jsondata.append` を呼び出すようだ。同種のメソッドとしては `worksheet.csvdata.append` もある。こちらは `data` に CSV data を設定することになっている。Deluge でも `list` ではなく CSV な単一文字列を渡す必要がある。 `insertCSV` というメソッド名だが、実際の動作は append である。
Leetcode #900: RLE Iterator

```swift
class RLEIterator {
    private var ar = [Int]()
    private var num = [Int]()
    private var current = 0
    private var index = 0
    
    init(_ A: [Int]) {
        for i in stride(from: 0, to: A.count, by: 2) {
            if i == 0 {
                ar.append(A[i])
            } else {
                ar.append(A[i] + ar.last!)
            }
            num.append(A[i+1])
        }
    }
    
    func next(_ n: Int) -> Int {
        current += n
        for i in stride(from: index, to: ar.count, by: 1) {
            if ar[i] >= current {
                index = i
                return num[i]
            }
        }
        return -1
    }
}
```
Laravelでコマンド入れる時ってどこで動かすの？

Laravelでコマンドを使っていろいろなことをするときに、「コマンドラインで」って言われることが多いのだけれども、具体的にWindowsのコマンドプロンプトなの？sshでつないでlinux上で動かすの？ってちょっとわからない時が多すぎる気がする。
いつかまた泣きそうになる気がするので、泣く前に見られる情報を書いておく。
尚、環境は以下の通り。
・ホストOS：Windows10
・開発環境：Homestead→Vagrant上でLinuxが起動
　　　　　　　　　　　 DBはMySQL

関係ないけど、VSCodeが使いやすくてびっくりだよ。

#簡単に言っておくと
vagrantのコマンド→Windowsのコマンドプロンプトで実行
プロジェクトに対して実行するコマンド→linuxのコンソールで実行

#各論
##Vagrantの起動(Vagrant up）
さすがにこれはWindowsのコマンドプロンプトから起動ってわかるね。
Homesteadをインストールしたフォルダーに移動してからコマンド実行してください。

```
C:{Homesteadをインストールしたフォルダ}>vagrant up
```

##Vagrantの終了(Vagrant halt）
当然起動と同じ、Windowsのコマンドプロンプトです。Homesteadをインストールしたフォルダに移動してコマンド実行してください。

```
C:{Homesteadをインストールしたフォルダ}>vagrant halt
```

##Laravelプロジェクトの作成(composer)
これはVagrant上のlinuxから実行します。
Vagrant上のLinuxにアクセスするには、Vagrant sshでVagrant上のlinuxのコンソールを開きます。
Vagrant sshはWindows10のコマンドプロンプトから入れます。

```
C:{Homesteadをインストールしたフォルダ}>vagrant ssh
```

そうするとあら不思議、今までWindows10のコマンドプロンプトだった画面がlinuxのコンソール画面に早変わり！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137858/930560ab-a034-88b2-0a93-76521099a99d.png)

linux上でコマンドを入力する場合は、vagrant sshでlinuxに接続してからコマンド実行する。

尚、laravelプロジェクトを作成するときはlinux上でプロジェクトを作成するディレクトリに移動してからコマンドを実行する。
Homesteadのデフォルトの開発ディレクトリはcodeなので、通常はcodeディレクトリに移動してからプロジェクトを作成する。

※note
Homesteadでは、VagrantでホストOS（ここではWindows10）とゲストOS(ここではlinux Ubuntu)で共有する共有フォルダーが設定される。
[設定される共有フォルダー]
home_vagrabt_code C:&yen;{ユーザーフォルダ}&yen;code
vagrant C:&yen;{ユーザーフォルダ}&yen;Homestead
これらのフォルダーはホストOSからもゲストOSからも参照・更新することができる。

【コマンド例】

```
vagrant@homestead:~$ cd code
vagrant@homestead:~code$ composer create-project laraavel/laravel testProject
```
##npmインストール
npm installはWindowsから実行しないと上手く動かなかった。
どうやら権限的なものが関係しているらしい。
ちなみにインストールしてしまえば、npm run devなどはWindowsでもlinuxでも同様に実行できました。

##artisanコマンド
linuxのコンソール画面で実行するときと、Windowsからするときと両方ある。
どちらの場合もプロジェクトのフォルダに移動してから実行する。実行した結果は移動したプロジェクト内に反映される。
・linux（ゲストOS）で動かすものの例
php artisan migrate
→ホストOSからだとDBが見つからないようだ


make:～のコマンドはlinux,Windowsどちらでもいけた。
シンボリックリンクを張るstorage:linkはWindowsでいけた。linuxではエラーが出た。
migtrateはlinuxでいけた。Windowsではエラーになった。

##MySQLを立ち上げる
linuxコンソールで実行する。
MySQLコマンドはどのディレクトリにいても実行できます。

【コマンド例：homesteadのhomeディレクトリで実行】

```
vagrant@homestead:~$ mysql -u homestead -p
```

デフォルトの設定値では、ユーザーは「homestead」、パスワードは「secret」です。
変更する場合は、プロジェクト内の.envファイル内の「DB_USERNAME」、「DB_PASSWORD」の設定値を変更してみ。
MacでBash使うときの注意点

先頭行を

```sh
#!/bin/bash
```
とするとバージョンが古い場合がある。

```sh
~ ❯❯❯ /bin/bash --version
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin18)
Copyright (C) 2007 Free Software Foundation, Inc.
~ ❯❯❯ /usr/local/bin/bash --version
GNU bash, バージョン 5.0.7(1)-release (x86_64-apple-darwin18.5.0)
Copyright (C) 2019 Free Software Foundation, Inc.
ライセンス GPLv3+: GNU GPL バージョン 3 またはそれ以降 <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
```
PSoC 4200DSのウォッチドッグタイマでLチカ

前回の記事「[PSoC 4200DS でウォッチドッグタイマをウォッチドッグとして使う]」では、ウォッチドッグタイマをウォッチドッグリセットに使用しました。せっかくなんで周期タイマとしての使い方も紹介しておきます。

## 回路図

![GS004454.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224737/afe18d1f-a2a3-fff9-4f87-232f17e9ac51.png "回路図")
周期タイマは、周期的に割り込みを発生させる機能です。周期的な割り込みを使ってする事といったら、「Lチカ」に決まってますよね。
回路図は、左側のウォッチドッグ割り込みを受ける部分とLEDを駆動する出力端子で構成されています。

## クロック設定

![GS004455.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224737/2865582c-1c74-b203-8712-187f483a5c34.png "クロック設定")
"Low Frequency Clocks"タブでウォッチドッグタイマの設定を行っています。今回使用する"Mode"は"Free Running Timer"です。このモードに設定しただけでは、16ビットのカウンタが延々とカウントを続けるだけで割り込みは発生しません。ファームウェアで割り込みの設定を行うと割り込みが発生するようになります。LEDを約2Hzで点滅させたいので、割り込み周期"Period"は"409.6ms"に設定しています。

## ファームウェア

```C:main.c
#include "project.h"

void wdt_Callback(void) {
    Pin_LED_Write(!Pin_LED_Read());
}
```

ファームウェアの前半部分では、割り込みが発生した時に呼び出される関数`wdt_Callback()`を定義しています。ここで定義するのは、割り込みベクタで設定する"Interrupt Service Routine (ISR)"ではなく、ISRから呼び出される"Callback"と呼ばれる関数です。割り込みフラグの処理は、ISRで記述されているので、ここでは出力端子を反転させる処理だけが記述されています。

```C:main.c
int main(void)
{
    CyGlobalIntEnable; /* Enable global interrupts. */

    /* Place your initialization/startup code here (e.g. MyInst_Start()) */
    int_Wdt_StartEx(CySysWdtIsr);
    CySysWdtSetInterruptCallback(wdt_Callback);
    CySysWdtUnmaskInterrupt();

    for(;;)
    {
        /* Place your application code here. */
    }
}
```
後半部分は、メインループ直前の初期設定のみです。

ISRとして`CySysWdtIsr()`という関数が`CyLFClk.c`に用意されているのですが、これを割り込みベクタと関連付ける処理が抜けています。これを補うために、WDT出力を"Interrupt"コンポーネント(int_Wdt)に引き込む回路図を描き、`int_Wdt_StartEx()`関数で"int_Wdt"の初期設定を行うことで割り込みの設定を行っています。
次に`CySysWdtSetInterruptCallback()`関数で割り込みが発生した時に呼び出される関数を設定します。
最後に`CySysWdtUnmaskInterrupt()`でウォッチドッグ割り込みを許可しています。


## GitHub リポジトリ
[noritan/Design364][Repository]


## 関連記事
[PSoC 4200DS でウォッチドッグタイマをウォッチドッグとして使う][]
[新・ウォッチドッグタイマを使ってみる ~PSoC 40xx 編~][]
[新・ウォッチドッグタイマを使ってみる ~PSoC 42xx 編~][]
[PSoC 40xx でウォッチドッグ・タイマを使ってみる][]

[新・ウォッチドッグタイマを使ってみる ~PSoC 40xx 編~]:https://noritan-micon.blog.so-net.ne.jp/2016-03-26
[新・ウォッチドッグタイマを使ってみる ~PSoC 42xx 編~]:https://noritan-micon.blog.so-net.ne.jp/2016-03-21
[PSoC 40xx でウォッチドッグ・タイマを使ってみる]:https://noritan-micon.blog.so-net.ne.jp/2014-05-24
[PSoC 4200DS でウォッチドッグタイマをウォッチドッグとして使う]:https://qiita.com/noritan_org/items/ba2b247de68e4fa07bcd
[Repository]:https://github.com/noritan/Design364
デュアルブートで環境を吹っ飛ばしがちな人のためのメモ（Ubuntu編）

# はじめに
私はROS(Robot Operating System)ユーザであるためWindows/MacとUbuntuとのデュアルブートで使う機会が多い。もちろん、たまにブートローダやパーティション情報が吹っ飛び文鎮化します。私の経験の中で起きたトラブルを元にいくつか対象方法をメモしておきます。　　
この記事が、急に動かなくなったPCの前で途方に暮れている誰かの参考になればと思います。

## 対処法
症状：起動ディスクとして認識してくれない。
対処法：ブートローダを直す。（ここでは、UEFIブートについて記述します。）
### 1. LiveUSBでUbuntuを起動する。
日本ミラーから落とすと早いので、なるべく日本ミラーから落としましょう。[例）Ubuntu Releases（日本ミラー：富山大学）](http://ubuntutym2.u-toyama.ac.jp/ubuntu/)
### 2. ターミナルを開く
### 3. どのディスクを使っているか確認する。（ルートのディスクを確認する。この場合は/dev/sda1（BL）と/dev/sda4（Root））

```bash
$ df -h
/dev/sda4       118G   60G   52G  54% /
/dev/sda1       197M   33M  164M  17% /boot/efi
```

### 4. 次のコマンドを実行
- やっている事的には、内容的には生きているディスクをマウントして、chrootで動かしてブートローダを再インストールしている。
- この方法は当たり前ですが、ディスク自体が死んでいる場合は無効です。

#### SATA形式のディスク

```bash
$ sudo mount /dev/sda4 /mnt                  # root
$ sudo mount /dev/sda1 /mnt/boot/efi         # BL
$ sudo mount -B /dev /mnt/dev                # DIRs
$ sudo mount -B /dev/pts /mnt/dev/pts
$ sudo mount -B /proc /mnt/proc
$ sudo mount -B /sys /mnt/sys
$ sudo mount -B /run /mnt/run
$ sudo cp /etc/resolv.conf /mnt/etc/
$ sudo chroot /mnt
$ apt install --reinstall grub-efi-amd64 linux-generic linux-headers-generic
$ update-initramfs -c -k all
$ sudo update-grub
```

#### NVMe形式のディスク
ディスク番号で悩んで、途方に暮れてた経験があったのでNVMeもついでに記載。`df -h`で調べる大前提は変わりませんが、`nvme?n?p?`という基本フォーマットを事前に知っているだけでも大分安心感が違うはず。

```bash
$ sudo mount /dev/nvme0n1p2 /mnt             # root
$ sudo mount /dev/nvme0n1p1 /mnt/boot/efi    # BL
$ sudo mount -B /dev /mnt/dev                # DIRs
$ sudo mount -B /dev/pts /mnt/dev/pts
$ sudo mount -B /proc /mnt/proc
$ sudo mount -B /sys /mnt/sys
$ sudo mount -B /run /mnt/run
$ sudo cp /etc/resolv.conf /mnt/etc/
$ sudo chroot /mnt
$ apt install --reinstall grub-efi-amd64 linux-generic linux-headers-generic
$ update-initramfs -c -k all
$ sudo update-grub
```

# 終わりに
新しいピンチに出会ったらまた追記します。


# 参考文献
* [Repair the Bootloader \- System76 Support](https://support.system76.com/articles/bootloader/)
[Confluence] スクリプトをTypescriptで書く際にAJS.$が使えるようにする

Confluenceのプラグインや容易に作らせてもらえない状況下で、ユーザマクロやHTMLマクロの`<script>`タグでスクリプトを書いてちょっとした機能を実現したいという、非常にニッチな場面でTypescriptを使いたいときに役立つ。

## 型定義をインストールする
jQueryはJavascriptライブラリなので、`@types`の型情報をインストールする。型情報をTypescriptが参照できるよう、`tsconfig.json`の`typeRoots`も設定しておく。

```:jQueryインストール
npm install --save jquery
npm install --save-dev @types/jquery
```

```tsconfig.json
{
    "typeRoots": [
      "node_modules/@types"
    ]
}
```

## AJS.$を宣言する
「[External jQuery Library in typescript file](https://stackoverflow.com/questions/48619391/external-jquery-library-in-typescript-file)」をそのまま使わせていただく。

```typescript
export declare const AJS: {
    $: JQueryStatic
}
// Webpack後にConfluenceのAJS.$が使われるようになる。
```

# WebpackでバンドルからjQueryを除外する
ここは特別なことはないが、`ts-loader`でトランスパイルすること、`uglifyjs-webpack-plugin`で容量を減らすことに加え、`jQuery`がバンドルされないよう`externals`を追加する。

```javascript:webpack.config.js
const UglifyJsPlugin = require('uglifyjs-webpack-plugin');
module.exports = {
	mode: "production",
	entry: "./src/index.ts",
	output: {
		filename: "bundle.js"
	},
	resolve: {
    // Add `.ts` and `.tsx` as a resolvable extension.
		extensions: [".ts", ".tsx", ".js", "json" ]
	},
	module: {
		rules: [
			// all files with a `.ts` or `.tsx` extension will be handled by `ts-loader`
			{ test: /\.tsx?$/, loader: "ts-loader" }
		]
	},
	optimization: {
		minimizer: [ new UglifyJsPlugin() ],
	},
	externals: [
		{
			'jquery': true
		}
	]
};
```

## 例
例えば以下のような簡単な例の場合、以下のようになる。定義場所より下にあるHTLM要素に対してセレクタが機能することが確認できた。

```Typescript:sample.ts
export declare const AJS: {
    $: JQueryStatic
}

let sample = AJS.$( '#sample' );
sample.html( 'hello' );
```
がトランスパイルにより以下のようになって、jQuery本体はついていないことが分かる。

```
!function(n){var r={};function o(e){if(r[e])return r[e].exports;var t=r[e]={i:e,
l:!1,exports:{}};return n[e].call(t.exports,t,t.exports,o),t.l=!0,t.exports}o.m=
n,o.c=r,o.d=function(e,t,n){o.o(e,t)||Object.defineProperty(e,t,{configurable:!1,
enumerable:!0,get:n})},o.r=function(e){Object.defineProperty(e,"__esModule",{val
ue:!0})},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:func
tion(){return e};return o.d(t,"a",t),t},o.o=function(e,t){return Object.prototyp
e.hasOwnProperty.call(e,t)},o.p="",o(o.s=0)}([function(e,t){AJS.$("#sample").htm
l("hello")}]);
```
MacでOpenCVがインストールされているのにcmake出来ない問題

# はじめに
エラーへの対処なのですが，エラー文に出力されたコマンドを実行しただけなので，役に立たないかもしれませんが，書いておきます．

# cmakeのエラー内容
`cmake`実行時のエラー部抜粋が以下．

```sh:error
CMake Error at CMakeLists.txt:8 (find_package):
  By not providing "FindOpenCV.cmake" in CMAKE_MODULE_PATH this project has
  asked CMake to find a package configuration file provided by "OpenCV", but
  CMake did not find one.

  Could not find a package configuration file provided by "OpenCV" with any
  of the following names:

    OpenCVConfig.cmake
    opencv-config.cmake

  Add the installation prefix of "OpenCV" to CMAKE_PREFIX_PATH or set
  "OpenCV_DIR" to a directory containing one of the above files.  If "OpenCV"
  provides a separate development package or SDK, be sure it has been
  installed.
```

とりあえず`$ brew install opencv`とすると良いでしょう（OpenCVのバージョンを気にする方は気をつけてください）．

すでにインストールされている場合は，

```sh:error
pass/to/build $ brew install opencv

Warning: opencv 4.1.0_2 is already installed, it's just not linked
You can use `brew link opencv` to link this version.
```

と出力されます．言われた通りに`$ brew link opencv`と実行します．

```sh:error
pass/to/build $ brew link opencv

Linking /usr/local/Cellar/opencv/4.1.0_2...
Error: Could not symlink lib/python3.7/site-packages/cv2/__init__.py
Target /usr/local/lib/python3.7/site-packages/cv2/__init__.py
already exists. You may want to remove it:
  rm '/usr/local/lib/python3.7/site-packages/cv2/__init__.py'

To force the link and overwrite all conflicting files:
  brew link --overwrite opencv

To list all files that would be deleted:
  brew link --overwrite --dry-run opencv
```

失敗しました．言われるがままに，

```sh:succes
pass/to/build $ brew link --overwrite opencv

Linking /usr/local/Cellar/opencv/4.1.0_2... 227 symlinks created
```

以上で，`cmake`ができるようになりました．

# おわりに
エラーで言われた通りにしたので微妙な情報ですが，誰かの役に立てばと思います．
alpine linuxのapk updateが失敗して動かなくなったときの解決法

# apk updateできない．

突然，alpine linuxのapk updateが失敗しはじめました． (2019/08/22現在)

```shell-session
$ sudo docker run --rm -it alpine:3.10
[sudo] password for kotauchisunsun: 
Unable to find image 'alpine:3.10' locally
3.10: Pulling from library/alpine
Digest: sha256:72c42ed48c3a2db31b7dafe17d275b634664a708d901ec9fd57b1529280f01fb
Status: Downloaded newer image for alpine:3.10
/ # apk update
fetch http://dl-cdn.alpinelinux.org/alpine/v3.10/main/x86_64/APKINDEX.tar.gz
ERROR: http://dl-cdn.alpinelinux.org/alpine/v3.10/main: temporary error (try again later)
WARNING: Ignoring APKINDEX.00740ba1.tar.gz: No such file or directory
fetch http://dl-cdn.alpinelinux.org/alpine/v3.10/community/x86_64/APKINDEX.tar.gz
ERROR: http://dl-cdn.alpinelinux.org/alpine/v3.10/community: temporary error (try again later)
WARNING: Ignoring APKINDEX.d8b2a6f4.tar.gz: No such file or directory
2 errors; 14 distinct packages available
```

どうやら，

http://dl-cdn.alpinelinux.org/alpine/v3.10/main/x86_64/APKINDEX.tar.gz

あたりが死んでいるために，動かないようです．
が，ブラウザで開くと普通にダウンロードできます．

# 解決法

一応フォーラムにもIssueが上がっていますが，最新版でも動かなかったです．

[apk WARNING Ignoring APKINDEX No such file or directory #207](https://github.com/gliderlabs/docker-alpine/issues/207)

単純にalpine linuxをビルドしたいだけ．動かしたいだけなら以下のオプションで動きます．

```
$ sudo docker run --rm -it --network=host alpine
/ # apk update
fetch http://dl-cdn.alpinelinux.org/alpine/v3.10/main/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.10/community/x86_64/APKINDEX.tar.gz
v3.10.2-7-g312cad7bde [http://dl-cdn.alpinelinux.org/alpine/v3.10/main]
v3.10.2-7-g312cad7bde [http://dl-cdn.alpinelinux.org/alpine/v3.10/community]
OK: 10336 distinct packages available
```

肝は，`--network=host`の部分で，これで動くようになります．
どうやらalpine linuxのDNS周りの動きが死んでるっぽく，Issueにもdockerの設定を変更することで回避する方法が書かれていました．

困っている人がいればご参考にください．
しかし，意外に，みんなTwitterとかでつぶやかないのね・・・
Laravel 粘着質なcacheを削除しよう！

# 概要
PHPのフレームワークLaravelは、開発者が意識していなくても内部で複数キャッシュしてくれています。
その心遣いは素晴らしく！時に、鬱陶しいのです！（笑）
開発時に使えるスクリプトをご紹介します。

## 環境
- Laravel 8.x

### キャッシュクリアコマンド
以下の１コマンドで一気にクリアできます。スクリプト向けの書き方ですね。

```bash
php artisan optimize:clear
```

### Docker環境の場合
[docker×Laravel環境構築参考](https://qiita.com/A-Kira/items/1c55ef689c0f91420e81)

- Docker version 19.03.1, build 74b1e89
- docker-compose version 1.24.1, build 4667896b

#### キャッシュクリアをまとめたスクリプト
上記のdocker環境の場合以下のようなスクリプトを用意していると開発が楽です。

```bash:clear_cache.sh
#!/bin/sh
docker-compose exec php bash -c "php artisan optimize:clear"
```

- `上記はphpという名前のコンテナに対して実行することを想定しているスクリプトです。`
- `Docker環境では、docker-compose.ymlと同じ階層のディレクトリに配置することを想定しています。`

## 参考サイト
- [Artisanコマンド（キャッシュクリア系・最適化）まとめ](https://laraweb.net/environment/3224/)
FUZE BASICを触ってみる２（ゲームの入り口）

# 今日やること

FUZE公式で配布されている、Worksheets(https://www.fuze.co.uk/worksheets-tutorials.html)
の `Coding Projects Book 1 - The Basics` を斜め読みしてできるところまで進めてみます。

今回はProject: 5から。

# アンカー

前の記事）[FUZE BASICを触ってみる１（最初の一歩編）](https://qiita.com/suruseas/items/45bd87fdf8de9fdccd12)

# Project: 5 "Analog World"

IOボードとの接続が主かと思ったら、結構いろいろな情報が。
👇ひどいサンプルだｗ

![output.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144344/62c86ae1-b181-5723-936e-2ddb0b5398e4.gif)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144344/3030c8b8-bb3e-7975-ea38-880e370498b0.png)


- `CLS2` コマンドが使われている。以下が `CLS` との違い
    - `CLS`
        - スクリーンバッファのクリアと、画面への反映(`UPDATE`)を一度に行うコマンド。
    - `CLS2`
        - スクリーンバッファのクリアのみ。後述の `UPDATE` とセットで利用する。
    - `UPDATE`
        - `CLS2` とセットで利用する。スクリーンバッファの内容を画面へ反映する。
- `GWIDTH`、`GHEIGHT`というシステム変数がある。それぞれ画面のサイズ(ピクセル)が取得できる
- `MOUSEX`、`MOUSEY`も使える。
- `CIRCLE`命令の引数が調べたくてドキュメントを探した。
    - https://www.fuzebasic.com/bin/FUZE_BASIC_Reference_GuideV3.pdf

# Project: 5b "Bear With Me"

今度もIOボードの例だけど、昔のXWindowを思い出すアレに変えてみよう。
と思ったけどなんだこれｗｗｗうまく動かなくて恥ずかしいけどもう時間オーバー😇

なんかクリックし続けないと `MOUSEX`,`MOUSEY` が取れませんでした。

![output2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144344/dd87c602-8ba3-408b-b16a-1108bc451948.gif)

今回は長いのでコード貼り付けます。クソース(クソソース)をご堪能あれ。

```
CLS

center_x = GWIDTH / 2
center_y = GHEIGHT / 2
radius = GHEIGHT / 2 / 2

DIM ear_center(2, 2)
ear_center(0, 0) = center_x - radius
ear_center(0, 1) = center_y + radius
ear_center(1, 0) = center_x + radius
ear_center(1, 1) = center_y + radius

eye_radius = radius / 4

DIM eye_center(2, 2)
eye_center(0, 0) = center_x - eye_radius 
eye_center(0, 1) = center_y + eye_radius
eye_center(1, 0) = center_x + eye_radius
eye_center(1, 1) = center_y + eye_radius

LOOP
CLS2
	PROC DrawBar
	PROC DrawEyeBase
	PROC DrawEye
UPDATE
REPEAT

END

DEF FN GetRadian(x1, y1, x2, y2)
	radian = ATAN( ( y2 - y1 ) / ( x2 - x1 ) )
=radian

DEF PROC DrawBar
	COLOR = PINK
	CIRCLE ( center_x, center_y, radius, 1)
	CIRCLE ( ear_center(0, 0), ear_center(0, 1), radius / 2, 1)
	CIRCLE ( ear_center(1, 0), ear_center(1, 1), radius / 2, 1)
ENDPROC

DEF PROC DrawEyeBase
	COLOR = WHITE
	CIRCLE ( eye_center(0, 0), eye_center(0, 1) , eye_radius, 1)
	CIRCLE ( eye_center(1, 0), eye_center(1, 1),  eye_radius, 1)
ENDPROC

DEF PROC DrawEye
	radian1 = FN GetRadian(MOUSEX, MOUSEY, eye_center(0, 0), eye_center(0, 1))
	radian2 = FN GetRadian(MOUSEX, MOUSEY, eye_center(1, 0), eye_center(1, 1))

	COLOR = YELLOW
	CIRCLE ( eye_center(0, 0) + ( SIN(radian1) * eye_radius ) ,  eye_center(0, 1) + ( COS(radian1) * eye_radius ), radius / 10, 1)
	CIRCLE ( eye_center(1, 0) + ( SIN(radian2) * eye_radius ) ,  eye_center(1, 1) + ( COS(radian2) * eye_radius ), radius / 10, 1)
ENDPROC
```

- `FULLSCREEN` 命令が使えるけど、VirtualBOX環境では画面がおかしくなったりするのえ使わないほうがいいです。
- 暴走したらvagrantを起動した端末で `subo reboot` で逃げました。
- 座標は左下が `(0,0)`。普通と逆でちょっとびっくりした。
- `FUNCTION` の作り方、`PROCEDURE` の作り方がわかった
    - `FUNCTION`や`PROCEDURE`は実行できないので `END` 命令の後に書くのがポイント
- 配列の持ち方がわかった

# 所感

- 数学ヤバイ、全然忘れてる…
- 明日きちんと動くようにしよう
- グローバル変数使いまくりだなー
はじめてのC++　【52日目】

# はじめに
Robocupという大会があり、そのための開発で記事を投稿している暇がありませんでした。
一段落ついたので、また記事を投稿しようと思います。
あと、userID ＠supopic　→ @suponji になんとなく変更してみたら、リンクが飛べなくなってしまった可能性があります。申し訳ありません。
_______

そろそろ、オブジェクト指向に手を出してみようと思うので、過去の自分の記事に書いていただいたコメントやオブ指の本を見て学習していきます。
オブジェクト指向はクラスの概念が必要なのでクラスの基礎から復習していこうと思います。
## クラスの復習

### クラスとは？
プログラミングでいうクラスと、小学校や中学校のクラスはほとんど同じ意味です。個々のdata(人)をまとめるときにクラスを使います。

次のようなコードがあります。

```cpp:noclass.cpp
int main() {

  std::string pig_name = "豚肉コロッケ";
  int pig_price = 100;
  int pig_point = 10;
  std::string pig_review = "やわらかくておいしい"

  std::string cow_name = "牛肉コロッケ";
  int cow_price = 500;
  int cow_point = 3;
  std::string cow_review = "肉汁がたまらない"

}

```
豚肉コロッケと牛肉コロッケの名前、値段、点数と評価を定義し、それぞれ代入しています。
このコードでは、コロッケの種類が二種類しかないので、面倒臭さは伝わらないかもしれません。仮に、コロッケの種類が100個あると、コロッケの種類ごとにまとめることが大変です。

### クラスの使い方

上記問題を解決するのにクラスというものを使用します。
上のコードをクラスを使用して書いてみます。

```cpp:class.cpp
#include <iostream>
#include <string>

class Product {
public:
  std::string name;
  int price;
  int point;
  std::string review;

};
int main() {

  Product pig;
  Product cow;

  pig.name = "豚肉コロッケ";
  pig.price = 100;
  pig.point = 10;
  pig.review = "やわらかくておいしい"

  cow.name = "牛肉コロッケ";
  cow.price = 500;
  cow.point = 3;
  cow.review = "肉汁がたまらない"

}
```
このようにクラスを使用することで、豚肉と牛肉が分けやすくなりました。

### クラスの解説

**クラスの定義**

```cpp
class Product {
public:
  std::string name;
  int price;
  int point;
  std::string review;
};
```
これは、オブジェクトの型を定義しました。 型というのは、 ` int型 ` や ` double型 ` と同じような型と認識していただいて問題ありません。ただし、言語が提供する方を `組み込み型` と言い、 **Product** のように ユーザーが定義した型を `ユーザー定義型(user-defined type)` と言います。

**インスタンス生成**

```cpp
  Product pig;
  Product cow;
```
これは、 `Product型` から `pig` というオブジェクトを実体化（インスタンス）したということです。クラスはオブジェクトを実体化することで使用することができます。
抽象的に言うと、
<img width="803" alt="スクリーンショット 2019-08-22 22.09.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298612/12268534-5b0d-8ff0-29fd-0d4631d9997b.png">
こんな感じです笑。

# 終わりに
C++erレベルは初心者から入門者になった気持ちです。
クラスを自分の言葉で記事にすると、考えさせられるものがありやはりOutPutは大切だなと感じました。
明日は、クラスのアクセス制限やコンストラクタ、デストラクタを記事にします。
ありがとうございました。
Leetcode #250: Count Univalue Subtrees

```swift
func countUnivalSubtrees(_ root: TreeNode?) -> Int {
    if root == nil {
        return 0
    }
    if root?.left == nil && root?.right == nil {
        return 1
    }
    
    var count = countUnivalSubtrees(root?.left) + countUnivalSubtrees(root?.right)
    if isUnival(root?.left, root!.val) && isUnival(root?.right, root!.val) {
        count += 1
    }
    return count
}

private func isUnival(_ node: TreeNode?, _ val: Int) -> Bool {
    if node == nil {
        return true
    }
    if node!.val != val {
        return false
    }
    return isUnival(node?.left, val) && isUnival(node?.right, val)
}
```
WIndowsでcclsの64bit版を手に入れる方法

# 更新履歴
* 2020-02-18 ビルドコマンドをclangに必要な分だけの設定に変更<br>@trairia さんのご指摘も反映<br>llvm 9.0.1タグでビルド確認済み

# 概要

* cclsをWindowsで使用するための記事が少なかった
  * 自分が探した限り、Windowsでcclsを64bitビルドする日本語記事はなかった
* 備忘録として書き留めておきます
* 本当はVSCodeに連携していい感じに動くデモを見せたかったですが、まだ検証中なのでここまで
    * 可能であればVSCode+ccls+tabnineを連携させて使ってみた内容をまとめてみます

# そもそもcclsとは何なのか？

* C/C++/Objective-C用のLS（Language Server）
* 他にも `clangd` `cquery` もある
* `clangd` はどうやら不具合が多く快適じゃないらしい（詳しくは調べてません）
* `cquery` は結構有名でいい感じに動くそうですが、2018年8月を最後に更新が止まっています
* `ccls` はcqueryよりも最適化したLSらしいです [詳しくは作者が述べてます](https://github.com/MaskRay/emacs-ccls/issues/1#issuecomment-386179958)
    * `cquery` の快適さはそのままにコードを５０００行削った
    * `cquery` よりもメモリやCPUリソースの消費が少ない
        * 軽く触った感じだと設定が悪いのか結構メモリもCPUも持っていかれました
        * もう少し調査してから根拠を書きます
    * `cquery` はC++14でできているが、 `ccls` はC++17でできている
        * つまりモダンな実装している
    * etc...

# 用意するもの

* Visual Stusio 2019 Community
    * 使用バージョンはMicrosoft(R) C/C++ Optimizing Compiler Version 19.22.27905

* CMake
    * 使用バージョンは3.15
    * chocolateyでも、Visual Studio付属のものでも構わないです

* Ninja
    * 使用バージョン 1.9.0
    * chocolateyでインストール出来ます
    * Visual Studioだとx64版がリンカーが不安定ということで64bitのLLVM/Clangのビルドをさせてくれない

# 手順

## clang-clの64bit版と付随するcmake設定を手に入れる

WIndows版のLLVM/Clangはchocolateyでも取得できますが、LLVM/Clangのソースが付いていません
cclsのビルドにはLLVM/Clangのソースが必要なため取得します
ついでにclang-clの64bit版を作ります


* コマンドプロンプトを立ち上げて、64bit版のclコマンド（msvc++のコンパイラ）を実行できる状態にする<br>
デフォルトであれば以下のコマンドを実行すれば環境変数諸々通ります

```bat
call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvarsall.bat" x86_x64
```
* 任意の場所でLLVMのソースを取得する

```bat
git clone https://github.com/llvm/llvm-project.git
```

* ビルドする
    * CPUかメモリが貧弱だとコンパイラ内部のエラーが起こることがあるのでその場合は<br>
    ninjaビルド時に `-j1` オプションなどで抑えるほうがいいです

```bat
cd llvm-project
cmake -GNinja -BRelease llvm -DCMAKE_C_COMPILER=cl -DCMAKE_CXX_COMPILER=cl -DLLVM_ENABLE_PROJECTS="clang;polly" -DCMAKE_BUILD_TYPE=Release -DLLVM_TARGETS_TO_BUILD="Native"
ninja -C Release all
```

* ビルドが出来ているか確認
  * うまく行けば以下の表示が出るはず

```bat
dumpbin /headers Release\bin\clang-cl.exe | findstr machine
           8664 machine (x64)
```

## cclsの64bit版を手に入れる

* cclsのソースを手に入れ、ビルドする
    * 先程ビルドしたLLVM/Clangを `D:/tools/llvm-project` したときの例

```bat
git clone https://github.com/MaskRay/ccls.git
cd ccls
git submodule init
git submodule update
cmake -H. -BRelease -G Ninja -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_COMPILER="D:/tools/llvm-project/Release/bin/clang-cl.exe" -DCMAKE_PREFIX_PATH="D:/tools/llvm-project/Release;D:/tools/llvm-project/Release/tools/clang;D:/tools/llvm-project/Release/tools/clang;
ninja -C Release all
```

* ビルドが出来ているか確認
  * うまく行けば以下の表示が出るはず

```bat
dumpbin /headers Release\ccls.exe | findstr machine
            8664 machine (x64)
```

前準備が色々面倒くさいですが、Windowsで扱えるcclsを手に入れることができました<br>
実行バイナリを配布してくれていればこんなことしなくてよかったんですがね・・・(-_-;)

# 参考文献

https://github.com/MaskRay/ccls/wiki/Build#windows
MacデフォのApacheでpython CGIを呼ぶ

みなさん、こんにちは
Macにデフォルトで入っているApacheを使ってpython CGIを呼び出してみたいと思います

まずは、defaultのApacheの場所を確認します

```
$ which httpd
/usr/sbin/httpd

$ which apachectl
/usr/sbin/apachectl
```

Apacheを起動します(停止はstop、再起動restartもあるよ）

```
$ sudo /usr/sbin/apachectl start
```

Apacheの設定ファイルhttpd.confの場所は
/etc/apache2/httpd.conf　っすね

httpd.confに書いてある、コンテンツを格納するDocumentRootをみてみます

```
$ sudo vi /etc/apache2/httpd.conf
```

どうも/Library/WebServer/Documentsにコンテンツは格納するみたいですね

```httpd.conf
# DocumentRoot: The directory out of which you will serve your
# documents. By default, all requests are taken from this directory, but
# symbolic links and aliases may be used to point to other locations.
#
DocumentRoot "/Library/WebServer/Documents"
```
引き続き、httpd.confの中で、CGIの設定をしていきます

[From]

```httpd.conf
165 #LoadModule cgi_module libexec/apache2/mod_cgi.so↲
174 #LoadModule userdir_module libexec/apache2/mod_userdir.so↲
176 #LoadModule rewrite_module libexec/apache2/mod_rewrite.so↲
259     Options FollowSymLinks Multiviews↲
437     #AddHandler cgi-script .cgi↲
```
[To]

```httpd.conf
165 LoadModule cgi_module libexec/apache2/mod_cgi.so↲
174 LoadModule userdir_module libexec/apache2/mod_userdir.so
176 LoadModule rewrite_module libexec/apache2/mod_rewrite.so
259     Options FollowSymLinks Multiviews ExecCGI
437     AddHandler cgi-script .cgi .py↲
```
これで設定は完了

念の為、Apache再起動

```
$ sudo apachectl restart
```

あ、pyファイル作る忘れたネ、作るネ

```
$ sudo vi /Library/WebServer/Documents/hello.py
```

```python:hello.py
#!/usr/bin/python

print ("Content-type:text/html\r\n\r\n")
print ('<html>')
print ('<head>')
print ('<title>Hello Word - First CGI Program</title>')
print ('</head>')
print ('<body>')
print ('<h2>Good morning! This is my first python CGI</h2>')
print ('</body>')
print ('</html>')
```

よーし、ブラウザでlocalhost/hello.py呼びましょう
<img width="641" alt="Hello_Word_-_First_CGI_Program.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171851/a6af2fa5-f645-d112-c31a-e3063890f333.png">

きた！
お疲れ様でした
VSCode Remote Development でSSH鍵が正常に転送できなくなることがある話

# VSCode Remote Development とは
[こちら](https://qiita.com/HoriThe3rd/items/b2f6c440f096106cf89e)の記事などが参考になると思います(投げやり)

簡単に言うと，あたかもターミナルからリモートでvimやemacsを使ってリモートのファイルをいじるかのように，**VSCodeでもリモートの環境でリモートのファイルをそのまま編集できたりするとんでもない拡張機能**です．
もはやリモートとローカルの壁がよくわからないことになります．

`~/.ssh/config` を読み込んでリモートに接続することもできます．
例えばSSHの鍵の転送をする場合は以下のような感じで設定します．
するとリモート接続にパスワード不要な上に，リモートのVSCodeからgithub等にそのまま`push`/`pull`などが行なえます．

```
Host [NAME]
    HostName [HOST]
    User [USER]
    IdentityFile ~/.ssh/id_rsa
    ForwardAgent yes
```

# 問題点
以下の状況を想定します．

- ローカルマシンにSSHの鍵を持っている
- リモートマシンには同一の鍵を置きたくない
- github等にリモートマシンで作成した鍵を登録したくない
- 普段ターミナルでリモートに入る際 `ssh -A` のようにして入って鍵を転送させている

この状況で VSCode Remote Development を用いて開発を行っていると，**リモートに繋がっているVSCode上から github等に `push`/`pull`などができなくなる**ことがあります．

原因は**SSHの鍵を正常に転送できなくなる**ためです．
この現象が起きたときに`ssh-add -l`を実行すると鍵がないよって言われます．

どうやら一時的に接続が切れたりして再接続を行ったときに起こることがあるようです．

リモートマシンで`ps`コマンド等で確認すると，VSCode Remote Development用のサーバプロセスが乱立していたりします．

# 解決法
1. VSCode(ローカルリモートどちらでも可)でコマンドパレットを開きます
Mac: `⌘ + Shift + P` または `F1`
その他: `Ctrl + Shift + P` または `F1`

2. コマンドパレットから **`Remote-SSH: Kill VSCode Server on Host...`** を選択
3. 問題の起きているリモートサーバを選択してkillする
4. 再接続する

以上で問題なくリモートにつないでいるVSCode上から再びローカルの鍵を使って`push`/`pull`などができるようになっていると思います．

# 終わりに
VSCode Remote Development は非常に便利で強力な拡張機能ですが，今の時代にリモートリポジトリに簡単にアクセスできないのはなかなか致命的な問題です．
再接続周りのバグ？のような気がするのでいちいちkillすることなく，快適にコーディングができるように修正されることを待つばかりですね．