OmniAICreator/Qiita-1.07M huggingface dataset:
VSCodeでPandasを使いやすくする

## 動機
VSCodeでPandasを書いてみたら出力結果が見にくいな...と感じたのでいろいろ設定をしました。
<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1359403/c6550924-80a8-e149-9a61-c11c32805c11.png">
そしてせっかくなのでアウトプット。


## 本編

- 設定編
- 書いて見てみよう編


## 設定編
**command + shift + P** または **F1キー**を押して下記の画像のようなコマンドパレットを開いて
> \> Select Interpreter to start Jupyter server

となるよう入力

<img width="700" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1359403/ff172171-c84e-cff5-ef13-672b4cf5f563.png">

すると下記の画像のように、Pythonのバージョンを選ぶ画面に移ると思いますのでご自身が普段使っているバージョンを選択してください（私の場合は Python 3.9.4 64-bit（'3.9.4'））

<img width="700" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1359403/3e9b9c27-ce33-4718-2eb6-01481820096e.png">

右下にポップアップが表示され、「jupyternotebookのインストールをしますか？」と確認されるのでInstallをクリック。
これで設定は終わりです。

## 書いて見てみよう編
コードの1行目に **#%%** と書いて2行目からコードを書き始めます。
GoogleColabのように出力の際にprintを書かなくてもよくなりました。

```python
#%%
import pandas as pd

data = pd.read_csv("XXXX.csv")
data
```

そうしましたら下記の画像のように、1行目の#%%の上に**Run Cell**と出ていると思いますのでこちらをクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1359403/787d1d72-e1b5-c152-3502-611b5854d7f2.png)

私は先程のコードの右側にこのように表示されました。見やすい！
(結局ドラッグ&ドロップで下に移動しました笑)


<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1359403/58e2d875-82ac-5c31-9841-273b141339dc.png">

## 最後に
個人的にGoogleColabがあまり好きではないのでとても嬉しい。






## 参考にさせていただいたサイト
https://houdoukyokucho.com/2020/08/11/post-1484/

https://www.atmarkit.co.jp/ait/articles/1806/12/news041_2.html#:~:text=%E5%85%88%E9%A0%AD%E8%A1%8C%E3%81%AE%E3%80%8C%23%25%25%E3%80%8D%E3%81%AF,%E3%81%8C%E8%A1%A8%E7%A4%BA%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%82%8B%E3%80%82
VSCodeでcodeコマンドのパスを毎回インストールするのを直す方法（Mac）

ブログで解説記事などを書いています⬇️

https://www.chickensblog.com/

<h1>内容
<p>VSCodeのパスがMacを再起動したりすると通ってなかったりすることがあるときの対処法です。
code .って打ってもこんな感じのやつが出てくる↓
zsh: command not found: code
<h1>対処法
<p>VSCode（appパッケージ）をアプリケーションフォルダに移動させる
その後にVSCode再起動してパスをインストールすれば次回からは再インストールしなくてすみます。
internメソッドの概要

# internメソッドの概要

先日Java Silverの学習を進めていた時にinternメソッドの問題で少し躓きました。<br>
解説書を読みある程度まで理解が進んだのでメソッドの機能をまとめておこうと思います。

## internメソッドとは
java.lang.Stringクラスに属するメソッドでコンスタントプールを含んだメモリ領域内の文字列を探し、同じ文字列が存在すれば同じ文字列を返すもの。<br>
仮に同じ文字れるが見つからなければ新たに文字列を生成します。

### 例
```java
String s1 = "Hello";
System.out.println(s1.intern());
```
### 出力結果
Hello

となります。

簡単に言うとString型で使いたい文字列が既に生成されているならそこの参照を使いまわす、といったイメージだと思います。

ここまでは同じ文字を返すだけだと思っていたのですが、このメソッドはあくまで「既に存在している文字列の参照」を返すものです。

例えばこのような問題

```java
String s1 = new String("Hello");
String s2 = "Hello";
String s3 = s1.intern();

System.out.println(s1 == s2);
System.out.println(s1 == s3);
System.out.println(s2 == s3);
```

### 出力結果
false<br>
false<br>
true

となります。

まず(s1 == s2)に関しては、<br>
s1はnewキーワードによるインスタンス化が行われているため（ヒープ領域というクラス外の領域に文字列が保存される）、直接変数に文字列を代入したs2とは参照が違うため結果が「false」となります。

次に(s1 == s3)ですが、<br>
s3は前述のとおり同じ文字列が既に使われているかを判断します。<br>
このクラスでは「Hello」という文字列はまだ使われていません。（s1はヒープ領域に保存されているため見つけることができない）<br>
そのため、s3には新しく生成された文字列「Hello」が代入されることになります。<br>
よって結果は「false」となります。

最後に(s2 == s3)、<br>
ここではinternメソッドを使用しています。<br>
この行の動きを説明すると「s1と同じ文字列をクラス内の領域で探し、同じものが既にあればその文字列の参照をs3に代入する」と言えます。<br>
s2にすでに「Hello」という文字列が代入されている（クラスのメモリ領域に保存されている）ためinternメソッドはメモリから「Hello」という文字列を見つけ出しそれをs3へと代入します。<br>
つまりこの結果は「true」となります。

# まとめ
internメソッドは同クラスのメモリ領域に同じ文字列が無いか探しに行くメソッド。<br>
同じものが存在していればその文字列の「参照」を返す点に注意。<br>
あくまで参照を返しているため同じ値ではないことも注意。
無料でかつ3分で作成できるGmailのSMTPメーリングサービス


#1. smtpサービスについて
ご存知とは思いますが念のため軽く説明します。SMTP(Simple Mail Transfer Protocol)とは、メールを送信する通信プロトコルの一つでよく使われるものです。通販サイトで自動メールされるものなどはほとんどがこの通信プロトコルを使われていると思います。
主要なSMTPサービスとしてはsendgridなどがあります。ただ、利用制約やすぐ簡単に設定して利用することはなかなかできず、簡単に利用できるSMTPサービスとして今回GmailのSMTPサービスを紹介させていただきます。

#2. GmailのSMTPサービス
実はGmailのアカウントをお持ちであれば、そのアカウントのメールアドレスが送信元としてSMTPサービスを利用できます。無料ですがメール送信上限は不明で検証用などで使用することを目的としていると思います。

#3. 作成方法
1. https://myaccount.google.com/ にアクセスしアカウントにログインする。
2. 左メニューの「セキュリティー」を開く
3. Googleへのログインの「アプリパスワード」を開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156570/88649d71-f064-23f6-7885-7e6b97091c87.png)

4. 「アプリを選択」のプルダウンから「その他(名前を入力)」をクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156570/43b226a4-b503-c990-cb46-b0713e84e134.png)

5. 「生成」をクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156570/30149759-6f36-670f-29ea-3f6c785220af.png)

6. 生成されたパスワードを控えておき、「完了」をクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156570/a85f75ea-da94-33f6-ef63-3f31f7d4f901.png)

完了！

#4. SMTP設定
上記で作成したSMTPサービスで以下のように設定できます。

| 項目|値|
|:---|:-:|
| アドレス |  smtp.gmail.com  |   
| ユーザーの認証  |  ご自身のメールアドレス  |  
| パスワードの認証      |  3のstep6で控えたパスワード        |           
| ポート番号        | 587(*)        |   

*暗号化方式としてTLS/STARTTLSが使えない場合は、ポート番号は465で設定します。ポート25は使えないようです。
[Rails]herokuで画像の保存場所にAmazonS3を使用してみる

#はじめに
本記事ではAWSの設定等は含まれておりません。あらかじめご了承ください

#AmazonS3とは
S3とは、AWSが提供するサービスの一つで、インターネット上にデータを保存する箱を借りられるサービスというものです。
S3を利用することで、画像を保存したり、保存してある画像を取得したりすることができます。

#実装方法

まずは画像投稿した際などに画像の保存先がS3となるように変更していきます。

はじめにS3が使用できるようにしましょう。

```Gemfile
#一番下に記述
gem "aws-sdk-s3", require: false
```
※bundle installを忘れずに！！

続いて、画像の保存先を指定します。

```config/environments/development.rb
# ~省略~

#config.active_storage.service = :local #コメントアウト！！！！！
config.active_storage.service = :amazon

# ~省略~
```

次に、S3で使用するバケット名とリージョン名を記述します。

```config.storage.yml
test:
 service: Disk
 root: <%= Rails.root.join("tmp/storage") %>

local:
 service: Disk
 root: <%= Rails.root.join("storage") %>

#以下を追記
amazon:
 service: S3
 region: ap-northeast-1
 bucket: ご自身の「バケット名」を入力
#ここまで

# ~省略~
```

次に、S3にアクセスするための認証情報を設定します。
これは機密情報なので環境変数にいれます。

```terminal	
% vim ~/.zshrc
```

以下を記述してください

```
export AWS_ACCESS_KEY_ID="CSVファイルのAccess key IDの値を貼り付け"
export AWS_SECRET_ACCESS_KEY="CSVファイルのSecret access keyの値を貼り付け"
```

なお、ここにいれるものは、AWSでIAMユーザを作った際にダウンロードする「new_user_credentials.csv」に記載してあります。

入力したら保存して（esc+:wq）してパスを通します

```
% source ~/.zshrc
```

ここまでで、環境変数を設定することができました。
実際にソースコード内で環境変数を使用して、S3への認証情報を記述しましょう。

```config/storage.yml
#省略
amazon:
 service: S3
 region: ap-northeast-1
 bucket:  （自身のバケット名が記載されている状態です）
 #追加
 access_key_id: <%= ENV['AWS_ACCESS_KEY_ID'] %>
 secret_access_key:  <%= ENV['AWS_SECRET_ACCESS_KEY'] %>

# ~省略~
```
ここまででローカル環境では保存先がS3になっているかと思います。何かを投稿した時、AWS側で確認することができるかと思います。


さあ！後少し！！
ローカル同様に、heroku上でも環境変数を設定します。Herokuで環境変数を扱うには、「heroku config:setコマンド」を打つ必要があります。

```terminal
% heroku config:set AWS_ACCESS_KEY_ID="CSVファイルのAccess key IDの値を貼り付け"
```

```terminal
% heroku config:set AWS_SECRET_ACCESS_KEY="CSVファイルのSecret access keyの値を貼り付け"
```

反映されたかどうかは、以下のコマンドで確認できます

```
% heroku config
```

あ！！！忘れてた、、、
本番環境でも保存先を変更しておきましょう

```config/environments/production.rb
# ~省略~

#config.active_storage.service = :local #コメントアウト
config.active_storage.service = :amazon

# ~省略~
```

あとは、これらの変更点をherokuに反映っと、、、

```terminal
% git push heroku master
```

完成！！！！

# 補足（エラー発生した人向け）

画像の保存先の設定を変更することにより、画像の参照先がアプリケーション内からS3へ置き換わります。
当然、S3導入前に投稿した画像が表示できなくなります。
それが嫌だ！！という方や何かしらのエラーが出た方は以下のコマンドを実行し、一度データベースをリセットしてください。
この際、データベースに保存されていたデータは全て消えるため注意しましょう。

```terminal
% heroku run DISABLE_DATABASE_ENVIRONMENT_CHECK=1 rails db:drop db:create db:migrate
```

#おわりに
前回の記事と合わせれば、ひとまずherokuでのデプロイは完璧にできるかと思います。
次はCircleCIやDocker、AWSの導入に挑戦していきます！！！

前回の記事（[Rails]ノーエラーでherokuへデプロイしていく）
https://qiita.com/tochisuke221/items/62d114989e872fa4e50a
ソースからビルドしたときの実行権限


#UE4をソースからビルドしたときのUE4Editor.exeの権限

環境
OS：Windows10
UE4：Oculus

UE4（Oculus）をソースからビルドして、UE4Editor.exeを実行してたら、
シェーダーコンパイル中に

```
LogDerivedDataCache: Display: HierarchicalDerivedDataBackend: Put failed, keeping in memory copy XXXX
LogDerivedDataCache: Display: Failed to write XXXX to HierarchicalDerivedDataBackend. Error: 0 (この操作を正しく終了しました。)
```

のようなエラー出ていたので、
管理者権限でUE4Editor.exeを実行したら消えました。
めでたしめでたし、ではないみたいです。

##他のUE4Editor.exeやLauncherは管理者権限ついてない。
他のバイナリUE4Editor.exeと同じような権限にしていなかった場合に、問題が発生しました。

###.uprojectをダブルクリックしてもエラーが出て開かない。

![err.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128851/fda20eb9-6a55-2a47-1919-f007fd885273.jpeg)

"Failed to launch editor"と表示されて開かない。

※ただし、このエラーに関してはUnrealVersionSelector-Win64-Shipping.exeの実行という前提もあったのかもしれません。

https://qiita.com/dgtanaka/items/67bc858f2e8fb24214d3

管理者権限のチェックをオフにして、プロパティ＞セキュリティタブから各権限を設定すると、
.uprojectをダブルクリックで開けて、Launcherのその他プロジェクトからも開けるようになりました。

##パーミッションは適切に設定しましょう。
UE4Editor.exe以外にも権限が異なる実行ファイルがあるかもしれません。Launcherで追加したEditorと同様の設定で揃えた方が良さそうです。

####一括変更
※パッケージングで権限不足のエラーになったので思い切って一括で変更しました。
PowerShellを使って一括で権限を与えてみるのも手です。結構時間はかかります。

```
icacls "C:\Program Files\Epic Games\MyUE_4.26.2\Engine" /grant '<user>:F' /t /c /q
```

エンジンのビルド時に権限の設定する方法があればいいのですが、未確認です。
クラス・オブジェクト指向について

##オブジェクト指向
オブジェクト指向を言葉で説明するのは非常に難しく、色々なサイトで様々な説明をされていますが、簡単に行ってしまえば、オブジェクトとはモノという意味で、何でも入れられる箱という考え方もされます。
オブジェクトというデータの入れ物があり、その中には様々なデータが入ります。
オブジェクトにはどんなデータも入れることができます。
数字やテキスト、配列はもちろん、メソッドなどの機能も入れることができます。

```javascript:オブジェクト
const userData = {
  name:'taro',
  age:30,
}
```

##クラスとは
クラスの概念は多くのオブジェクト指向のプログラム言語で共通で使える概念なので、覚えてしまえば多くの言語で応用が可能です。
クラスは、簡単に言えばモノの設計図です。
オブジェクトはモノと言いましたが、クラスはモノの設計図という考え方です。

オブジェクト = モノ
クラス = モノの設計図

```javascript:クラス
class Users {
    constructor(name, age) {
        this.name = name;
        this.age = age;
    }
    text(){
        return '私の名前は'+this.name+'です。今年で'+this.age+'歳になります。';
    }
}
```

##インスタンス
クラス（設計図）を元に実際にオブジェクト（モノ）を生み出すことをインスタンス化といいます。
newを使ってクラスを呼び出すことでインスタンス化を行います。
少しややこしいですが、一旦下のようなやり方で実際のものを作り、「user」という変数に格納すると思ってください。

```javascript:インスタンス化
const user = new Users('太郎', 22);
```

###クラスとインスタンスの違い
クラスとインスタンスの違いは、よく料理に例えられるのですが、クラスはレシピでインスタンスは料理そのものを指します。
チャーハンのレシピがクラスであれば、レシピを元につくられたチャーハンがインスタンスのことです。

##コンストラクタについて
コンストラクタとは、クラスのインスタンスを作るときに必ず実行される処理です。
よく使われるのは引数をクラスの中の変数やオブジェクトに代入したりするのに使います。
また、クラスの中で、メソッドを複数定義して、それを呼び出しても同じことができます。
インスタンス化するときに定義した引数はコンストラクタで受け取ることができます。

```javascript:一例
class Users {
    constructor(name, age) {
        this.name = name;
        this.age = age;
    }
    text(){
        return '私の名前は'+this.name+'です。今年で'+this.age+'歳になります。';
    }
}

var user = new Users('太郎', 22);

console.log( user.name );
console.log( user.age );
console.log( user.text());
//結果
//太郎
//22
//私の名前は太郎です。今年で22歳になります。
```

##クラスの中のthisとは
クラスの中で使われている「this」とは何か。
この場合のthisはクラスそのものを指します。
上記のコンストラクタで、「this.name」というクラスの変数の中にデータを入れて、クラス内で使うことができるようになります。

##クラスを使うメリット
クラスを使うメリットとしては、いつでも何回でも再利用が可能ということです。
また、クラスはコンストラクタ以外のメソッドは、メソッド自体を呼び出さないと起動しないため、使いたい動きと使いたくない動きを分けて使うことができます。

##クラスの作り方
javascriptを例にクラスの作り方を説明します。
基本的にはPHPや他の言語でもクラスの構成はあまり変わりません。

###クラスの宣言
クラスを使用するときに気をつけることは、必ずクラスを使用する前に、クラス宣言を行うことが必要となります。

```javascript:クラスの宣言
class Users {
  // クラスの内容
}
```

###コンストラクタの定義
コンストラクタは引数を取ることができます。
引数はインスタンス化するときに渡される引数が、そのまま引き渡されます。
それをクラス内のオブジェクトに格納することができます。
ここではnameとageという変数を用意してそれぞれ格納します。
その際にthisをつけるのを忘れないようにしましょう。
thisは「クラス自体」を参照します。
つまりこのクラスの中の変数nameとageを示し、このクラス内ではどこでも使うことができます。

```javascript:コンストラクタ
class Users {
    constructor(name, age) {
        this.name = name;
        this.age = age;
    }
}
```

###メソッドの定義
次にテキストを返すメソッドを定義します。
コンストラクタで定義した変数を使って自己紹介の文章を作成して、returnで返します。
これでインスタンス化したオブジェクトから、このtextというメソッドを呼び出して使うことができます。
使うときは「**インスタンスオブジェクト名.メソッド名()**」の形で使いましょう。

```javascript:メソッド
class Users {
    constructor(name, age) {
        this.name = name;
        this.age = age;
    }
    text(){
        return '私の名前は'+this.name+'です。今年で'+this.age+'歳になります。';
    }
}
```
Typescriptのジェネリックを理解する

#ジェネリック
```
//ジェネリックを使うと、外部からデータ型を指定できるので、クラスや関数をいくつも作る必要がなくなる。
class Store<T> {
  //T(Type),U,V,T1,T2,T3などジェネリックを指定するのが慣例となっている。
  data: T; //インスタンス化する際に、<string>が渡されているので、データ型がstringになる。
  getsStore(): T {
    return this.data;
  }
}

let stringData = new Store<string>(); //インスタンス化する際に、クラス名の後ろに<string>のように渡す。

let booleanData = new Store<boolean>();

//ジェネリックを複数
class　Component<T,U>{
  name: T;
  create: U;
}
let component = new Component<string,number>();
component.created = '2021/05/08'; 
```
Twilio FunctionsでNode v10終了だって！？

#Twilio Functionでデプロイエラーが…！

とあるプロジェクトで、今日(2021/05/06)デプロイしたらエラーが出ました:joy:
先月テスト環境でちゃんとリリース確認までしてたのに…！

##エラー内容

![error.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149339/205a6bd6-e067-c44a-eb27-f1e154c58e7e.jpeg)

> unsupported runtime node10

**なんじゃこりゃ～:persevere:**


リリース時に急に謎エラー出たら焦ります…

##Nodeのバージョンに問題が？

エラー内容を見ると、単純にNode v10はサポートしてないぜ。ってことなんでしょうけど
唐突にそんなこと言われても感が。

####Google先生お助け～####

***

###Twilio公式でこんな記事を見つけました###

https://support.twilio.com/hc/en-us/articles/1260803396609-Twilio-Functions%E3%81%AENode%E3%83%A9%E3%83%B3%E3%82%BF%E3%82%A4%E3%83%A0%E7%92%B0%E5%A2%83%E3%81%AE%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E6%9B%B4%E6%96%B0-v12-vs-v10-

> ご理解いただきたい内容
Functions機能に関連し、Twilioではそのランタイム環境を業界標準に照らし合わせて常に最新にするよう心がけています。OpenJS財団のサポートスケジュールによると、 **Node v10は2021年4月30日にサポート期限を迎えます。** (日時については、明記ない限り米国時間となります。)

> ご対処いただきたい項目
皆さまのFunctionsコードがNode v12との組み合わせで動作するよう、 **Node v12への移行(テストおよび再デプロイ)を2021年4月30日までに完了させてください。** 

####まじすか:scream:

めちゃめちゃドンピシャなタイミングでした。
というか全然知りませんでした。。ちゃんと公式の案内は見るようにしないとダメですね:innocent:

##Nodeのバージョンを上げます

https://nodejs.org/ja/

とりあえずローカルのバージョンも10なので、12に上げます。
今もう最新はv16なんですね。

v12の最新版をゲット＆インストール

https://nodejs.org/dist/latest-v12.x/


##Twilio Function側の設定

先ほどの記事に書いてある通りです。
私はクラシックではなくサーバーレスの方なのでそちらを参照しました。

+ バージョン指定を"10"から"12"に変更

```package.json
    "engines": {
        "node": "12"
    }
```

+ プラグインアップデート


```cmd
twilio plugins:update
```


+ 次に、前から警告出てたのに放置してました(笑)、twilio-cliのバージョンアップ
 
> »   Warning: twilio-cli update available from 2.18.0 to 2.23.0.

```cmd
npm install twilio-cli@latest -g
```

+ デプロイコマンドの変更

デプロイ時のコマンドを下記に変更（元は **twilio-run deploy** だった）

```
- twilio-run deploy
+ twilio serverless:deploy --runtime node12
```

```package.json
    "scripts": {
        "test": "echo \"Error: no test specified\" && exit 1",
        "start": "twilio-run",
        "deploy": "twilio serverless:deploy --runtime node12 & powershell -file ./after_deploy.ps1"
    },
```

##対応完了

上記を変更して再度デプロイすると、無事デプロイ出来ました:grinning:


##おまけ

node v12にしてから、Flex UIの方をデプロイするとエラーが出ました。
今インストールされているnode-sassのバージョンが、v12に対応してないようでした。

node-sassのバージョンもnode v12に対応したバージョンを入れないとダメなようです。

下記の記事を参考にnode-sassのバージョンもアップしました:smile:

https://qiita.com/Sotq_17/items/8647230c90d71b0e2061#%E3%82%A8%E3%83%A9%E3%83%BC%E5%AF%BE%E5%87%A6

**こっちはTwilioの問題じゃないので、おまけということで:yum:**
enebularを更新

#概要

enebularを更新してみた。

#herokuのアプリを削除。

+ ダッシュボードへアクセス
+ 削除したいアプリケーションを選択
+ 「Settings」へ移動
+ 「Delete App」にある「Delete App...」を選択
+ 削除したいアプリケーション名を入力して「Delete app」を選択

#Heroku API Token の取得

+ Herokuにログイン後ページ右上にある [Account Settings] を押します。
+ Manage Account ページで Account ページに移動します。
+ API Key 欄に移動し [Reveal] で API Key を表示します。
+ API Key をコピーします。

#Heroku に送りたいフローを作成して、デプロイして保存します。

#デプロイの設定

+ フローが作成できたら上部のメニューから Deploy ページに移動します。
+ 表示された画面の Add Connection をクリックします。 
+ Select Connection Type から Heroku を選択します。 
+ Connection Name はわかりやすい名前をつけます。
+ Heroku API Token に API Key をコピーして、[Save] を押します。
+ 新しくconnectionが追加されたので、クリックしてください。
+ 開いた画面の下部にある [Deploy to Heroku] からアプリを作成します。

#Heroku ボタンでアプリを作成

+ Heroku ボタンを押すとログインします。
+ Heroku のアプリ設定が表示されます。
+ App name をわかりやすい名前で設定します。
+ Node-REDにログインする際に利用するUSERNAME/PASSWORDを設定します。
+ AGENT_HEROKU_VERSIONの値は変更しないでください。
+ 入力が完了したら Deploy app ボタンを押下してデプロイを行ってください。
+ 保存されると Select Connection Type から Heroku を選択すると、Heroku アカウントが持つアプリ一覧が出てきます。
+ こちらから、さきほど作成した Heroku アプリをひとつチェックし [Deploy] を押します。
+ しばらく待っていると Deploy Added が表示されてデプロイが完了します。
+ Heroku アプリで確認すると無事フローがデプロイされています。
+ 反映されたフローを確認します。

以上。
DPDKアプリ用アフィニティ設定API


PMD処理を行わせるための各種APIがDPDKには用意されている。
アフィニティ設定処理を隠蔽するための、便利APIもたくさん用意されていて、格好良いのだが、
「実際、コアをどう割り当てているの？」という疑問が残る。極端な例を上げると、

* 1つのコアで2つのPMDを1:2の割合で動かしたい（普通やらないけど）

などの変態動作をサポートできてない。

ということで、アフィニティ設定は自力でやることにした。以下がそのコード。すっきりした！

```
#define _GNU_SOURCE
void *affinity_thread(void *core){
  //
  // スレッドのアフィニティを設定して
  cpu_set_t mask;  // 実行可能なCPUをビットマスクで指定する
  CPU_ZERO(&mask);  // まずマスクを全部オフにして
  CPU_SET(*(int*)core, &mask);  // 実行するコア番号を指定
  if(sched_setaffinity(0, sizeof(mask), &mask) == (-1)){  // アフィニティを設定
    perror("setaffinity:");
    exit(1);
  }
  // PMD処理を行う
  int64_t i;
  for(;;){
    for(i = 1; i < 0x100000000; i++) ;
    printf("zzz\n");
  }
}

// 呼び出し側。PMDに#4のコアを割り当てた例
  int core4 = 4;
  ret = pthread_create(&thread1, NULL, affinity_thread, &core4);

```
Typescriptのインターフェイスを理解する

#インターフェイス
```
//インターフェイス(定義だけで、実装がないクラスのようなもの)
//インターフェイスの目的 : クラス定義やデータ定義を統一するための仕組み

interface Animal{
   name: string;   //nameというプロパティをstringで保持する
   legs: number;   //legsというプロパティを数値で保持
   isCry: boolean;
   cry(): void;    //voidはメソッドの返り値
}

interface SuperAnimal extends Animal {   //extendsでAnimalを継承させる
  canRun: boolean;
}

class Dog implements SuperAnimal{    //implementsでインターフェイスを指定する。そして、上記のインターフェイスで指定したメソッドなどをかく。
  name: string = 'hogemaru';
  legs: number = 3;
  isCry: boolean = true;
  canRun: boolean = true;
  cry(): void {
    if (this.isCry){
      console.log('Bow, wow!');
    }
  }
 }

let hogemaru = new Dog();
hogemaru.cry();
```
Laravel入門

#環境
- MAMP
- Laravel 6
- PHP 7.4

#アプリの作成
```
$ composer create-project --prefer-dist laravel/laravel アプリ名 "6.*"
$ cd アプリ名
$ chmod -R 777 storage
$ chmod -R 777 bootstrap/cache
```

#マイグレーションのファイルの生成
```
$ php artisan make:migration create_テーブル名(複数形)_table
```

#マイグレーションのファイル変更
```php:
public function up()
    {
        if (!Schema::hasTable('blogs')) { //追記
            Schema::create('blogs', function (Blueprint $table) {
                $table->id();
                $table->string('title', 100); //追記
                $table->text('content'); //追記
                $table->timestamps();
            });
        }
    }
```
`if (!Schema::hasTable('blogs'))` => もし、`blogs`が無かったらテーブルを作る。
`$table->string('title', 100);` => string型でカラム名を`title`、文字数を100まででカラムを作ります。
#データベースに反映させる
```
$ php artisan migrate
```
データベースが作成されているのでphp MyAdminにて確認する。


#モデルを作成
```
$ php artisan make:model (単数形)
```

```php
class Blog extends Model
{
    use HasFactory;
    //テーブル名
    protected $table = 'blog'; //追記

    //可変項目
    protected $fillable = //追記
    [
        'title',
        'content'
    ];
}
```

#ルーティングの追加
```php:routes/web.php
Route::get('/', 'BlogController@show')->name
('blog');
```
`localhost:8888`にアクセスした際に`HTTP`は`get`でBlogController@show`->BlogControllerのshowメソッドが呼ばれる。

#コントローラの作成
```
$ php artisan make:controller BlogController
```

```php:Http/Controller/BlogControier.php

class BlogController extends Controller
{
    /**
     *
     * @return view
     */
    public function show()
    {
        return view('blog.list');
    }
}

```
`return view('blog.list');`->views/blog/list.blade.phpを表示させる。

#bladeの使い方

簡略的に言うと作成したviewファイルを他のファイルでも表示させる機能です。
書き方は`@include('header')`や`@yield('content')`と書きます。
`@include('表示したいファイル')`注意点は、`('相対パスで書く')`こと
`@yield('content')`は継承したファイルを表示させることができる。

```php:show.blade.php
@extends('layout') //継承する
@section('content')
//表示させたい範囲
@endsection
```


```php:layout.blade.php
<!DOCTYPE HTML>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>Laravel_practice</title>
    <link rel="stylesheet" href="/css/app.css">
    <script src="/js/app.js" defer></script>
</head>
<body>
    <header>
      @include('header') //同じ階層のheader.blade.php
    </header>

    <div>
      @yield('content') //継承している@section('content')〜@endsectionまで
    </div>

    <footer>
      @include('footer') //同じ階層のfooter.blade.php
    </footer>
</body>
</html>
```



#終わり
筆者は、`Rails`を学習してから`Laravel`を学んでいるのですが共通する部分が多く、比較的に学習しやすいです。`Larabel`学習したばかりですので間違っていたらすみません。`PHP`はフレームワークの種類が多く学ぶのが大変そうですが、引き続き`Laravel`頑張ります。
PsychoPy3を手に入れよう

# この記事では
　この記事では、パーソナルコンピュータを用いた心理学実験を行う人が、最新の ***[PsychoPy3](https://www.psychopy.org/index.html)*** を手に入れることを目的とします。

##PsychoPy3って？
　私たち文系が、PsychoPy3を利用するにあたって必要とする考えは、私が思うに、以下の3点です。

　　**1. PsychoPy3の利用は、刺激提示のための一つの手段である。**
　　　　別に、手で紙芝居をしたり、刺激を実験参加者に手渡ししたって良いんで
　　　す。
　　**2. 実験では、剰余変数をできるだけ統制したい。**
　　　　実験の操作による効果を示すために、提示順序の無作為化、繰り返し提示
　　　などの統制を行います。 
　　**3. PsychoPy3は、プログラミング言語「Python」を使用している。**
　　　　[Python](https://www.python.jp/index.html)は、「プログラムの『読みやすさ・わかりやすさ』をとても重視
　　　し」た言語となっています（私の書き方が分かりやすいかは、また別の話で
　　　す (;ω;)）。
　　　　また、非常に実用的であり、上記2の提示順序や繰り返しの問題などの解決
　　　は、お茶の子さいさいです。

## PsychoPy3を入手しよう
　ということで、早速[PsychoPy3をダウンロード](https://www.psychopy.org/download.html)しましょう！
　青いリボンをポチっとすれば、あとは誘導に従います。
　これで、このページの役目は終わったわけですね。


## 私のPsychoPy3って、古い！？
　スマホのアプリのように、もちろんPsychoPy3にだってバージョン更新があります。お使いのPsychoPy3は最新ですか？
### PsychoPy3から更新する
　もちろん、[PsychoPy3](https://www.psychopy.org/index.html)のホームページから最新バージョンをダウンロードしても良いです。その場合は、旧バージョンをアンインストールしてからの方が良いでしょう。
　お持ちのPsychoPy3からも更新は可能です。PsychoPy3を開き
　　　[ツール] -> [PsychoPyの更新]
　を選択します。
　最新バージョンへの更新はもちろん、バージョンが最新か否かの確認や、旧バージョンへのダウングレードも可能です。

---
##### おしまい
　この記事では、最新のPsychoPy3を入手する方法を紹介しました。
　いかがだったでしょうか？
　...その通り！知りたいことは、大元のページにだいたい書いてあります。
　次の記事からは、PsychoPy3を使った実験刺激の提示方法などを紹介していこうと思っています。これらの記事を参考にしつつ、より詳しいことを知りたいのであれば、大元のページなども適宜参照してくださいね。
【Vue × Firebase】現在ログイン中のuidを取得し、ページを戻るボタンを実装


#現在ログイン中のuidを取得し、ページを戻るボタンを実装

HTML部は、router-linkタグを使用して、:to="`/board/${this.uid}`で
[/board/uid]ページに戻るボタンを設置。

```html:chat.vue
<router-link :to="`/board/${this.uid}`" class="back-btn">
 <img src="../assets/戻る.jpg" alt="チャット終了" class="back-btn-icon" />
</router-link>
```
const currentUser = firebase.auth().currentUser;で
currentUserという変数にfirebase.auth().currentUser;を代入。

さらに、this.uid = currentUser.uid;でthis.uidという変数に
currentUser.uidを代入。

ドキュメント部で.doc(currentUser.uid)として現在ログイン中のユーザー（uid）を取得。

```javascript:chat.vue
    const currentUser = firebase.auth().currentUser;
    this.uid = currentUser.uid;
    firebase
      .firestore()
      .collection("users")
      .doc(currentUser.uid)
      .get()  
```

上記とすること現座ログイン中のユーザー(uid)を取得してページを戻ることができる。
Jetbot用Jetpack4.5が出ていました。

JetbtがJetpack4.5に対応していましたので、指示に従って作業しました。
https://jetbot.org/master/software_setup/sd_card.html

###２つのイメージファイルダウンロードする
オリジナルのjetpack4.5のイメージ（jetson-nano-jp451-sd-card-image.zip）とJetbotのイメージ（jetbot-043_nano-4gb-jp45.zip）をDL.

![DL.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617683/8c8a221d-7427-b905-840f-2c18bbdd86ec.png)
###オリジナルのイメージを使いinitial ("oem-config") setupを実施
64GBのSDカードをフォーマットし、オリジナルのjetpack4.5（jetson-nano-jp451-sd-card-image.zip）を書き込み（いつもと同じ手順です）。
カードをJetbotに挿して、モニター、キーボードを接続して電源ON。自動でinitial ("oem-config") setupが始まるので一通り実施後、shutdownさせる。
###USBケーブル経由でJetson Nanoに接続しwifi設定
次にJetbotのイメージファイル（jetbot-043_nano-4gb-jp45.zip）をSDカードに書き込みます。
アンテナの横にあるコネクタを抜き、バッテリーを切り離します。
USB-Cケーブルを使いPCとNanoをつないで、tera termでSSH接続。
![tera.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617683/e79bd2e8-dd6c-83b4-9318-4875325fe5bc.png)
usrname;jetbot, password;jetbotです。
Wifiの設定<SSID>、<PASSWORD>は各自ご用意ください。
tera termで下記コマンド入力。

```
sudo nmcli device wifi connect <SSID> password <PASSWORD>
```

wifi設定後、tera termで下記コマンド入力でシャットダウン。

```
sudo shutdown now
```
###wifi経由でJupyterLabで接続
Jetbotのアンテナ横の電源ケーブルを復旧後Jetbotの電源投入。
wifiが使えますので、piOLEDに表示されたアドレスを確認しchromeからwifi接続します。http://192.168.***.***:8888/lab?
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617683/3b92fa58-3eb6-16c3-2517-7b741feb1cdc.png)
おしまい。
Typescriptのクラスについて　その4

#Typescriptのクラス
```
//クラス
class クラス名{

   プロパティ = 'プロパティ１';
 
   constructor(){
     //初期化関数
     this.プロパティ = 'プロパティ';
   }

   メソッド１(){
     console.log('テスト');
     this.プロパティ = 'プロパティ3'
   }
}
const インスタンス = new クラス名(); 
インスタンス.プロパティ = 'プロパティ2'
インスタンス.メソッド1();

//インスタンスと呼ばれるオブジェクトに実体化される。
//つまりインスタンス化される

class Animal {

  age = 10;
  private: _legs = 1;

  cry() {
    if (this.isCry){
      alert(`age: ${this.age}`);
    }
  }

  //アクセサメソッド(getter,setter)
  get legs(){
    return 4;
  }

  set legs(value: number){
    if (value > 1){
      this._legs = value;
    }
  }

  get email(){
    return this.formGroup.get('email')
  }
  //dog.email
}

let dog = new Animal(true);
dog.legs = 4;
console.log(dog.legs);
```
#クラスの継承
```
あるクラスを元に別のクラスに派生させることをクラスの継承という。
例えば、animalクラスを継承させて、Cat、Dog、Birdというクラスを簡単に作ることができる。
また、animalクラスに変更があれば、派生させたクラスも変更される。

//クラス
class Animal {

  age = 10;

  constructor(public isCry: boolean){ 
    this.age = 2;
  }

  cry(): void {
    if (this.isCry){
      alert(`age: ${this.age}`);
    }
  }
}

class Dog extends Animal{

　constructor(public isCry: boolean){
    super(isCry);
  }

  cry(): void {
     if (this.isCry){
       alert('Bow, wow'!);
     }
     console.log('dog is cry!');
     super.cry();  //元のanimalクラスのcryメソッドを呼び出している
  }
}

let dog = new Dog(true);
dog.cry();
```
Goで勉強したいことまとめ

# 本格的Goの勉強を進めていくためにやることメモ(随時更新)


## BackEnd 候補
### Web framework
gin https://github.com/gin-gonic/gin
astaxie https://github.com/astaxie/beego
kataras https://github.com/kataras/iris

### rest framework
ant0ine https://github.com/ant0ine/go-json-rest

### マイクロサービス
go-kit https://github.com/go-kit/kit
micro https://github.com/asim/go-micro

### テストコード
https://budougumi0617.github.io/2018/08/19/go-testing2018/

### AWS, GCP, API

### Pythonでいうrequests的なのでリクエストを送る方法
【Automation Anywhere】画面のUIを日本語にする（言語切替）方法

#はじめに

Automation Anywhere を初めて使おうとしたとき、画面の表示が英語になっていて戸惑った人もいると思います。

この記事では、Automation Anywhere（[Automation360](https://qiita.com/IQ_Bocchi/items/e5c95bd74cae45d1c586)）の画面の言語を日本語に切り替える方法を説明します。

##最新バージョン（A360.20以降）の場合

### ログイン前に切り替える場合

ログイン画面の右上にある地球のマークから言語を切り替えます。
ここで「日本語」を選択することで、ログイン後の画面がすべて日本語表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/81eca875-591c-6d79-da8a-b820aac5698c.png)

### ログイン後に切り替える場合

ログイン後は、画面の右上に地球のマークがないのですが、プロフィールから切替ができます。

プロフィールは、最新版（2021.12.16時点）では画面の左下あたりにある、ユーザー名の頭のアルファベットからアクセスできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/eba312e0-267a-f345-0fb4-11b133346d57.png)

少し古いバージョンだと、プロフィールの入口が画面の右上になっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/4cd65485-edc0-d739-3a57-4311548e0a2d.png)

ログイン後に言語を切り替えた場合、反映までに少し時間がかかる場合があります。

##A360.19以前のバージョンの場合

A360.19以前のバージョンでは、ログイン前・ログイン後のどちらでも、画面の右上の地球のマークから言語を切り替えることができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/c9344c06-996b-126d-4a6c-3eb788fed3ac.png)

ログイン後に言語を切り替えた場合、反映までに少し時間がかかる場合があります。

##Tips

Bot開発中にアクションを検索する際の検索ワードは、画面のUIに依存します。

例えば「フォルダ」のアクションは英語では「Folder」ですが、UIを日本語にしているときに「Folder」と検索しても表示されませんのでご注意ください。

#最後に

この記事は、「はじめてのAA」シリーズからリンクされています。
Automation Anywhere を初めて使っている方は、ぜひ以下のリンクもチェックしてみてください。

https://qiita.com/IQ_Bocchi/items/8d28f12256037b5f9058
【rails6】結合テストエラーの解決　`it` is not available from within an example (e.g. an `it` block) or from constructs that run in the scope of an example (e.g. `before`, `let`, etc). It is only available on an example group (e.g. a `describe` or `context` block).

こんにちは！
今日も結合テストで犯した凡ミスについて共有していこうと思います

凡ミスばかりですみません…
でもこういった凡ミスで無駄な時間を過ごしてしまう方々が一人でも減ればなぁと信じて
是非読んでいってください！

では、まずは今日のエラーをご紹介

## 発生したエラー

```
 % bundle exec rspec spec/system/comments_spec.rb  # この結合テストを実行した際に

Failure/Error:
       it 'ログインしたユーザーはコメントできる（自分の投稿にコメントする場合）' do
         # 省略
     
       `it` is not available from within an example (e.g. an `it` block) or from constructs that run in the scope of an example (e.g. `before`, `let`, etc). It is only available on an example group (e.g. a `describe` or `context` block).
       # ↑このエラーが発生しました↑
```

さて、このエラー文

```
`it` is not available from within an example (e.g. an `it` block) or from constructs that run in the scope of an example (e.g. `before`, `let`, etc). It is only available on an example group (e.g. a `describe` or `context` block).
```
を日本語訳してみましょう

```
it` は、サンプル内（例：`it` ブロック）や、サンプルのスコープ内で実行されるコンストラクト（例：`before`、`let` など）からは利用できません。サンプルグループ（例：`describe`や`context`ブロック）でのみ利用可能です。
```


**みなさん英文を見た瞬間に「うわっ…」となるかもしれませんが、ここは慣れましょう**
便利な翻訳サイトのリンクは下に貼りますが、できる限りご自身で読み解くことをお勧めします
※今はQiita投稿の為翻訳してます


では、原因となるコードを見てみましょう

```comments_spec.rb
it '空欄のコメント送信はできない' do
  it 'ログインしたユーザーでも空欄コメントは送信できない' do
    # ログインし、root_pathにいることを確認する
    sign_in(@article1.user)
    expect(current_path).to eq root_path
    expect(page).to have_no_content('ログイン')
    # @article1の詳細ページに遷移する
    visit article_path(@article1)
    expect(page).to have_content(@article1.title)
    # コメント欄があることを確認、フォームに入力する
    expect(page).to have_selector(".send-comment-text")
    fill_in "コメントを入力", with: ''
    # コメントを送信しても、Commentモデルのカウントが上がらない事を確認する
    expect{find('input[name="commit"]').click}.to change { Comment.count }.by(0)
    # コメントがページこのページ内に存在していないか確認する
    expect(page).to have_no_content(@comment)
  end
end
```


何がいけないか、もうお分かりですよね？？
**itの中にitを書いてしまっている！！**
という事です

「別のテストコードをコピペ活用する中で、不要なit文を削除し忘れた」ということですね

では、解決していきましょう

```comments_spec.rb
it 'ログインしたユーザーでも空欄コメントは送信できない' do
  # ログインし、root_pathにいることを確認する
  sign_in(@article1.user)
  expect(current_path).to eq root_path
  expect(page).to have_no_content('ログイン')
  # @article1の詳細ページに遷移する
  visit article_path(@article1)
  expect(page).to have_content(@article1.title)
  # コメント欄があることを確認、フォームに入力する
  expect(page).to have_selector(".send-comment-text")
  fill_in "コメントを入力", with: ''
  # コメントを送信しても、Commentモデルのカウントが上がらない事を確認する
  expect{find('input[name="commit"]').click}.to change { Comment.count }.by(0)
  # コメントがページこのページ内に存在していないか確認する
  expect(page).to have_no_content(@comment)
end
```
これだけです。上記との違いは、重複されていたit文を片方削除しました。

ターミナルで実行します

```
% bundle exec rspec spec/system/comments_spec.rb

Comments
  コメントできるとき
    ログインしたユーザーはコメントできる（自分の投稿にコメントする場合）
    ログインしたユーザーはコメントできる（他人の投稿（@article2）にコメントする場合）
  コメントできないとき
    ログインしていないユーザーはコメントできない
    空欄のコメント送信はできない

Finished in 20.88 seconds (files took 1.77 seconds to load)
4 examples, 0 failures
```
うん、OKです！！


では、下記ご参考まで…
便利な翻訳サイト　DeepL様
https://www.deepl.com/translator
TikZ & PGFPlots でカラーマップを作図する．

## はじめに．
TikZ と PGFPlots を用いて，データファイルを取り込み，下図のようなカラーマップを作成します．![main.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453674/39c3a423-4d69-dc1d-d890-ca176bddbdc2.png)
使用するエンジンは Version 1.10.0 (TeX Live 2019) です．XeTeXなどでもできるかもしれません．しかしプロットするデータ数が大きい場合，XeTeXでは作図できない場合があります．

## 作図するデータの作成．
今回プロットするデータは，C言語を用いて，-1 以上かつ 0.5 以下の範囲の乱数を出力させることで用意しました．使用したコードは以下の通りです．

```C:main.c
#include<stdio.h>
#include<stdlib.h>
int main(){
 FILE *fp;
 srand(0);
 int i,j;
 fp=fopen("out.dat","w");
 for(i=0;i<5;i++){
  for(j=0;j<5;j++)fprintf(fp,"%d\t%d\t%4.3f\n",i,j,(double)rand()/RAND_MAX*2*3/4-1);
  fprintf(fp,"\n");
 }
 fclose(fp);
 return 0;
}
```

このプログラムによって得られるデータファイルは，次のようなフォーマットです．

```
0	0	-0.636
0	1	-0.980
0	2	-0.425
0	3	-0.378
0	4	-0.898

1	0	0.490
1	1	-0.274
(中略)
4	3	-0.603
4	4	-0.434
```

## TikZ & PGFPlots で作図．
次のコードファイルを用意します．

```LaTeX:main.tex
\documentclass[crop,border=2pt,tikz]{standalone}
\usepackage{pgfplots}
\usepgfplotslibrary{colorbrewer}
\usetikzlibrary{pgfplots.colormaps}
\pgfplotsset{compat=newest,compat/show suggested version=false}

\begin{document}
 \begin{tikzpicture}
 \begin{axis}[
  xmin=-0.5,xmax=4.5,ymin=-0.5,ymax=4.5,
  point meta min=-1, point meta max=1,
  enlargelimits=false,
  axis equal image=true,
  view={-90}{90}, %原点(0,0)を左下に設定したい．
  matrix plot,
  colormap/PiYG-11,
  colorbar,
  ]
 \addplot3[surf]table{out.dat};
 \end{axis}
 \end{tikzpicture}
\end{document}
```
このファイルをLuaTeXでコンパイルすると，本記事の最上部に挙げた図がPDFで出力されます．
## ワンポイントアドバイス．
データを作成する際に，乱数を範囲 -1 以上かつ 0.5 以下で生成しました．PGFPlots のマニュアル(32頁)に，
>PGFPLOTS computes the minimum and maximum value of all such numbers. Then, it maps every number into a colormap.

とある通り，PGFPlotsではデータの最大値と最小値を計算し，その間でカラーマップの色を割り当てます．したがってデフォルトの設定で -1 以上かつ0.5 以下のデータをプロットしようとすると，「+1を緑，-1を赤，0を白」に設定することができません．このプロットを可能にする設定が，[point meta min=-1, point meta max=1] なのです．

## gnuplot との違い
TikZ & PGFPlots でなくとも，たとえばgnuplotでも作図することができます．私が試したところ，データ数が少ない場合はgnuplotでプロットしても問題ありませんでした．しかし，データ数が多い場合(カラーマップの一辺が100セル以上だと)，gnuplotではひとつひとつのセルがくっきりと表せませんでした．解像度を上げる設定をしてプロットしてみても，やはり私の意図通りのプロットにはなりませんでした．ひとつひとつのセルが正方形ではなくぼやっとした円に見えます．
一方でgnuplotならではの良さもあります．データ数が多いカラーマップ(カラーマップの一辺が100セル程度)をプロットする場合は，TikZ & PGFPlots でプロットするために1,2分のコンパイル時間がかかります．gnuplot では3秒程度で作図できるのに．
【CSS】clip-pathをいろいろ試してみた(No.1)

# 初めに
cssのclip-pathを使うと画像を切り取ることが出来ますので、関連記事を参考に理解した内容を纏めてみました。

※内容に間違いなどがある場合はご指摘をよろしくお願いします。

# clip-pathとは
cssで要素にcliping領域を作って、表示したい部分（切り取りたいところ）を指定することが出来るプロパティ。
clipプロパティのupgradeバージョン。

# clipとの違い
clipは適用する要素の位置がposition:absoluteまたはposition:fixedでなければなりません。また、切り抜きができる形は四角のみになります。MDNの公式ドキュメントには可能であればclip-pathを使うようにとされています。

- clipの構文

>clip: rect(上から離れた距離, 右へ, 下へ, 左から離れた距離);

①html

```html
<section class="clip_section">
    <div class="clip_path_main">
       <img id="clip" style="width:100px;" src="image.jpg">
    </div>
  </section>
```

②css

```css
#clip {
  position: absolute;
  top: 100px;
  left: 200px;
  height: 100px;
  clip: rect(50px, 90px, 90px, 40px);
}
```

③結果
![スクリーンショット 2021-05-06 10.25.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/966135/31b67ef7-32fe-b163-ffd6-34bbcbe18c21.png)
青い四角の領域で上から50px,左から50px離れたところを起点にして、左から右へ向けて90pxまで、上から下に向けて90pxまで表示されています。ちょっと使いづらいイメージでした。

# clip-path
clipのupgradeバージョン。こちらはpositionの指定も必要なく、円形、楕円形、多角形まで様々な形をcliping出来ます。基本的によく使われるものをclip-pathを使って表示してみました。

### inset

四角い形で要素を切り抜くことが出来ます。構文はmarginやpaddingの指定の仕方と同じです。

>clip-path: inset(上下 左右);
clip-path: inset(上 下 左 右);

①html

```html
  <section class="clip_path_section">
    <div class="clip_path_main">
      <img id="clip_inset" style="width:100px;" src="image.jpg">
    </div>
  </section>
```

②css

```css
#clip_inset {
  clip-path: inset(10px 20px 5px 8px);
}
```

③結果
![スクリーンショット 2021-05-06 10.49.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/966135/392feffd-d418-b5d5-c7b0-60ce758e1497.png)

### circle
円形で要素を切り抜きます。やり方は半径を指定し、円の中心点を左からx,上からyで指定します。

>clip-path: circle(半径 at X座標 Y座標);

①html

```html
  <section class="clip_path_section">
    <div class="clip_path_main">
      <img id="clip_circle" style="width:100px;" src="image.jpg">
    </div>
  </section>
```

②css

```css

#clip_circle {
  clip-path: circle(30% at 50% 50%);
}
```

③結果
![スクリーンショット 2021-05-06 10.57.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/966135/5c7acb29-d295-dd1f-9425-e4cca780d7da.png)

### polygon
多角形で要素を切り抜きます。左からx座標と上からy座標を指定して多角形の角を決めます。例えば、３角形の場合それぞれのx,y座標の角を３セット用意します。

>clip-path: polygon(第一X 第一Y, 第二X 第二Y, ...)


①html

```html
  <section class="clip_path_section">
    <div class="clip_path_main">
      <img id="clip_polygon" style="width:100px;" src="image.jpg">
    </div>
  </section>
```

②css

```css
#clip_polygon {
  clip-path: polygon(50% 0%, 0% 100%, 100% 100%);
}
```

③結果
![スクリーンショット 2021-05-06 11.09.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/966135/022e04a6-d9d2-3f65-9eb9-4690ef998c99.png)

# clip-pathジェネレーター
clip-pathを生成するにはcssで実際にコードを書く方法以外に、作りたい形のclipを目で確かめながらコードを生成してくれるclip-pathジェネレーターがあります。作りたい形を選んでマウスでノードを動かすだけなのでとても簡単です。

https://bennettfeely.com/clippy/
https://www.uplabs.com/posts/clip-path-generator

#参考記事・サイト

https://developer.mozilla.org/ja/docs/Web/CSS/clip
https://coliss.com/articles/build-websites/operation/css/how-to-use-css-clip-path.html
https://developer.mozilla.org/ja/docs/Web/CSS/clip-path
https://www.webdesignleaves.com/pr/css/css_clip_path.html
fossil-scmの backoffice処理

[fossil]の [backoffice] 処理についての説明

fossilの Hook書いたけど実行されない！って場合はここら辺を確認すると良いかもしれません。

## 概要

fossilでは backofficeと呼ばれる処理があって、一般的には daemon等で処理される通知や、定期実行されるメンテナンス処理が該当すると思えば良い感じ。

## backoffice処理の内容

[backoffice]のドキュメントには以下の様に書いてあります。

1. Sending email alerts and notifications
2. Sending out daily digests of email notifications
3. Future - Other background email handling chores</strike>
4. Future - Automatic syncing of peer repositories</strike>
5. Future - Repository maintenance and optimization</strike>

ただ、2.15.1時点の処理は [backoffice.c](https://fossil-scm.org/home/info?name=4db70d65ea7b5851ee27ae2a62dcae293fcb7698bc23e41c9427cdfa65e3600d&ln=644-648)を確認すると、Hook実行が追加されています。

1. Alertの通知(上の1-2の処理)
2. Hookの実行

## backoffice処理の起動タイミング

backoffice処理が起動されるタイミングは、いくつかあります[^1]。

- WebUIのrendering完了時の自動実行
- コマンドラインからの手動実行(cron等と連携)
- pollingによる レポジトリ更新時及び定間隔実行

特に設定をしていない場合は WebUIページ完了時の自動実行のみです。

[^1]: Fossilは CLI/WebUI/Server/CGI と色々設置形態があるうえに分散環境だったりもするので、自動的に何かをする仕組みというのが少し複雑になってる印象。

## backoffice処理の自動実行

この処理は fossilが WebUIを renderingする時に[自動的](https://fossil-scm.org/home/file?ci=2f901f98b32718c4&name=src/cgi.c&ln=406)に行われているので、特別な daemonの起動等は 意識する必要が無い様になってます。

## 自動実行の処理時間と間隔

backofficeの処理時間は60秒以内と[定義](https://fossil-scm.org/home/file?ci=2f901f98b32718c4&name=src/backoffice.c&ln=98)されています。

とは言っても WebUIの表示毎にWebサーバを60秒止めるわけにはいかないので、通常この処理はサーバ上でバックグラウンドで起動されます。

このバックグラウンド処理が多重実行されないように 60秒のlease時間が設定されており、この間は同時に起動されない様になっています。

起動されないと書きましたが実際には 実行中のプロセスに加えて、更に 1プロセスまでは Queuingされて待ち状態になり、Lease時間経過後に 実行される事になります。

## 自動実行の停止

WebUIの rendering 時の自動実行は停止する事が可能です。

```bash
fossil settings backoffice-disable 1
```

1 じゃなくても true でも yes でも on でも 大丈夫です。

## backoffice処理の手動実行

コマンドラインから明示的に起動が可能です。

```bash
fossil backoffice -R /repo/repository.fossil
```

これを crontabに仕込む事で 定期的に通知や Hook等の処理を実行するようにします。

leaseが衝突した場合でも Queuingしないで良い場合は `--nodelay` オプションを追加します。

## fossil を pollerにする

cron等の外部スケジューラに頼らずに fossilを pollerにする事が可能です。

時間間隔等を設定しますが、backoffice処理の定期実行ではなく **変更検出のpolling** です。
変更が無ければ(= repositoryファイルのmtimeが更新されていなければ) backofficeの処理は走りません。

また、Pollerによる backoffice処理は `--nolease` オプションがついた状態で実行されます[^2]。

このため、「自動実行を停止した上でコマンドによる手動実行はしないようにする」か、「Hook側で多重実行を許す/防ぐ/短時間で完了するよう実装する」等が必要になるかと思います。

PollerになったFossilは以下の様に動作します。

- pollerは 指定されたポーリング間隔で Backofficeの実行が必要かどうかを確認する
- 「実行が必要」＝「Repositoryのファイルが変更された」または「前回の実行から--min時間が経過した」
- 必要な場合は バックグラウンドで leaseを取らずに backofficeを実行する

pollerとして起動するには `--poll ポーリング間隔秒数` を指定します。

```bash
fossil backoffice --poll 60 --min 3600 -R /repo/repository.fossil
```

[^2]: 実はこの記事をまとめているときに気がつきました。

## まとめ

- fossilの 通知・Hookの処理は Backofficeで処理されている
- Backoffice処理は Webページレンダリング時に自動実行がデフォルト
- Webページレンダリングが定期的に行われない様な環境では cronと連携するか pollerを置く
- pollerを置く場合は backoffice-disable を有効にする

[fossil]: https://fossil-scm.org/
[backoffice]: https://fossil-scm.org/home/doc/trunk/www/backoffice.md
【Python】スクレイピング 再利用しそうなコード

# BeautifulSoup
## インポート
~~~
import requests
from bs4 import BeautifulSoup
~~~

## Requestsを使って、webから取得
~~~
r = requests.get(url)
~~~

## 要素を抽出

~~~
soup = BeautifulSoup(r.text, 'lxml')
~~~

## 特定のタグを取得

~~~
# idで探して要素を取り出す
#  id名はページ内に1つしかない

要素 = soup.find(id="id名")

# classで探して要素を取り出す
#  class名はページ内に同じ名前で複数ある場合がある
#  ※「class」はPythonの予約語のため「class_」と書く

要素 = soup.find(class_="class名")

# リンクを取り出す
# findを使ってリンク要素を取得
link = soup.find('a')
# getでリンク要素のhref属性の値を取得して出力
print(link.get('href'))
~~~

~~~
aaa=soup.find("div",class_="post clearfix")

    aaa='\n'.join(aaa.split())  # ＆nbsp対策
~~~


## テキストを取得

~~~
aaa=aaa.get_text()
~~~


## 要素削除

~~~
# decompose
# <ul>タグを駆除
aaa.find('ul').decompose()  

# 複数decompose
# すべてのaタグを取得し、a_tagsという変数に格納（リスト型）
a_tags = soup("a") 
# すべてのaタグを削除
[aaa.decompose() for aaa in a_tags] 

# extractの使い方
# aaaからはbbbが取り除かれる
bbb=aaa.find("div",id="post_pagination").extract() 
~~~

## NavigableString
BeautifulSoup4はタグの間の文字列などをNavigableStringオブジェクトとして処理している
NavigableStringはBeautifulSoup4コマンドを使用できるが、通常の文字列として処理できない
txtに変換した後はBeautifulSoup4コマンドを使用できない

## 複数の要素

### select
~~~
# 3番目を選択→結果はリストの[0]に入る
（注）strではなく、リスト
nexturl=nexturl.select("a:nth-of-type(3)")  
# リストの[0]だけのurlを取り出す
nexturl[0]=nexturl[0].get("href")           
~~~

### find_all

~~~
bbb=soup.find_all("div",class_="p-content-cassette__info__main")
for sub in bbb:
   sub2=sub.get_text()
~~~

## UnicodeEncodeError対策

~~~
# 1文字
Story =Story.replace('\u6451', '')

# まとめて処理
Story = Story.encode('cp932', "ignore")
Story = Story.decode('cp932')
~~~

## 一定間隔で処理

~~~:1秒おき
import time
time.sleep(1)
~~~

# Table形式
Tableを抜き出すのには、pandasで可能

~~~
import pandas as pd

url = 'https://ja.wikipedia.org/wiki/%E3%83%87%E3%82%A3%E3%82%BA%E3%83%8B%E3%83%BC%E4%BD%9C%E5%93%81'

# このページには9つの表がありました。
dflist = pd.read_html(url)
print(len(dflist))

# 2番目の「ウォルトディズニーアニメーションスタジオ長編作品」の表を使います。
df = dflist[1]
print(df.head())

# ヘッダー行の指定 インデックス列の指定
dflist = pd.read_html(url, header=0, index_col=0)
df = dflist[1]
print(df.head())

# 「監督」カラムで複数行にまたがる値が、1行目以外がNaNになってしまっているので、
# fillna関数のmethod引数にffillを渡してNaNを直前の値で埋めます。
df.fillna(method='ffill', inplace=True)
print(df)
~~~
kubernetes環境で削除されないNamespaceを強制的に削除する

## 環境
- EKS 1.19
- kustomize利用

kustomizeを使っているとロック状態になってしまうことがあるみたい

## 現象
- `kubectl delete namespaces test  --force --grace-period=0`で強制削除を試みても、`Terminating`のままでNamespaceが消えない




## apiを実行できるように接続する

```
kubectl proxy & 
```

標準出力からポート番号を控えておく

- 8001

```
Starting to serve on 127.0.0.1:8001
```

## jsonファイルに状態を出力する

```
kubectl get namespace test -o json > ns.json
```

## finalalizer部分を編集

### 編集前

```json
 80     "spec": {
 81         "finalizers": [
 82             "kubernetes"
 83         ]
 84     },
```
### 編集後
- `kubernetes`部分を行削除

```json
 80     "spec": {
 81         "finalizers": [
 82         ]
 83     },
```

## 削除
```
curl -k -H "Content-Type: application/json" -X PUT --data-binary @ns.json http://127.0.0.1:8001/api/v1/namespaces/test/finalize
```

## 参考
https://dev.classmethod.jp/articles/k8s-namespace-force-delete/
【Python】イテレータとは

以下教材を勉強していく上での備忘録<br>
使用教材：-達人データサイエンティストによる理論と実装- 第3版Python機械学習プログラミング
第6章 6.2.2 k分割交差検証

#### イテレータとは
Pythonにおけるイテレータとは、リストなどの複数の要素をもったデータ型に対して、順番にデータを取り出す機能のことです。
Python以外の言語では違う使い方をされるようなので注意。

以下具体的なコードにて説明

```sample1.py
>>> a = [2, 100, 0.51, "abc", "DEF"] # リストaを定義
>>> i = iter(a) # iter() 関数でリストをイテレータに変換し、変数ｉにイテレータを代入

>>> next(i) # next()関数が実行される度にリスト内を順番に取り出し
2
>>> next(i)
100
>>> next(i)
0.51
>>> next(i)
'abc'
>>> next(i)
'DEF'
>>> next(i)
Traceback (most recent call last): # 6回目は要素が存在しないため、StopIteration
 File"<stdio>", line 1, in <module>
StopIteration
```
Gitアカウントを複数使い分ける

# 背景
個人開発ではgithub，インターンではgitlabなど複数のアカウントを使い分ける必要があるときの簡易的対処

# gitアカウントの設定は2種類ある．

### 1つ目グローバルを変更 （主アカウント）
~/.gitconfigへ書き込む

```
git config --global user.name "hoge"
git config --global user.email "hoge@fuga.com"
```
### 2つ目リポジトリごとにアカウントを設定（基本これで管理したがいい）

リポジトリの .git/configに書き込む

```
git config --local user.name "hoge_sub"
git config --loca user.email "hoge_sub@fuga.com"
```

## 変更が反映さ入れているか確認

```
git log

commit  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Author: hoge_sub <hoge_sub@fuga.com> # ここに変更内容が反映されているはず！
Date:   Thu XXX x xx:xx:xx xxxx +xxxx

    add file
```
VirtualBox上のDebianでネットワーク構成を変えるとinterfacesが変になる

#事象
VirtualBox 6.1.18で、
ネットワーク構成を「ブリッジアダプタ」だけにしたVMで、Debian 10.9.0を普通にインストールした後、
ブリッジアダプタ以外に(NATとか)ネットワーク構成を変えると、インターネットに出なかったりDHCPが取得できなくなる。
NATやホストオンリーアダプタのDHCPも取得できなくなったり不安定。
#原因
VBox側でネットワークの構成を変えたときに、
ゲスト側の /etc/network/interfaces の `auto eth0`とか`allow-hotplug eth0`の行が勝手に消されている
#対処法
`auto eth0`、`allow-hotplug eth0`、`iface eth0`とかを適切な感じに足す。

具体例:

```
auto eth0
allow-hotplug eth0
iface eth0 inet dhcp
```
STM32L010のソフトウェアシリアルでHello Worldと出力 9600bps TX PA2 STM32


目的
つくれそうだから作ってみた。
通信がづれる時はUART_DELAYの値を1足したり1引いたりして調整してね

x mbedのリビジョンは、125

参考
STM32F303K8 & mbedでSoftwareSerialを実装する 【TX編】
https://qiita.com/YuseiIto/items/ddc15a77fd7b57ffa757

忙しい人よう
https://os.mbed.com/users/caa45040/code/serial_test_010_2/

```c++

#include "mbed.h"

//Serial pc(USBTX, USBRX); // tx, rx
//Serial pc(SERIAL_TX, SERIAL_RX); //767
//Serial pc(PA_2, PA_3); //010
//Serial pc(PA_9, PA_10); //010

//アナログ入力の設定
//AnalogIn adc_vbat(A3); //PA_4

#define UART_DELAY 96 //  1/9600

//仮想シリアルの出力ポート
//DigitalOut TX(PA_9);
DigitalOut TX(PA_2);

//仮想シリアルへの一文字出力 9600bps
int pc_putc(char ch) {
        
    TX=1;
    TX=0;//START
    wait_us(UART_DELAY);

    for(int ii=0;ii<8;ii++){
        TX=(ch>>ii)&1;
        wait_us(UART_DELAY);
    }; //for

    TX=1;//Stop
    wait_us(UART_DELAY);
             
    return(0);
    
} //pc_putc


int main() {

    //ポートをhiにする 初期化
    TX=1;
    
    //adcの読み込み 0から4096
    //int s = (adc_vbat.read_u16()>>4);

    char *ss1; //文字のポインター
    int ii; //ループカウンター

    //無限ループ
    while(1) {
        
        ss1="Hello World !\r\n";
        ii=0; //ループカウンター
        while(ss1[ii]!=0){
            
            //一文字出力
            pc_putc(ss1[ii]);ii++;
                        
        } //while

        //1秒の待ち
        wait_ms(1000);
        
    } //while

} //main

//容量削減
void error(const char* format, ...){}



```

![serial_test_010_2_2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/79d3a792-8c25-9e25-cc8d-1c18b30e94d3.jpeg)

![serial_test_010_2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/b27471a0-3753-0fc9-4e4a-dcd7d0cde2aa.jpeg)

![serial_test_010_2_3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/ce901b59-1fc7-b7df-e9df-5750e35bf859.jpeg)

![serial_test_010_2_4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/4d65bc95-9e63-5eec-cc78-879aeb4b2a37.jpeg)

![serial_test_010_2_5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/54a16cde-26b1-f8ea-046f-050df41f8bba.jpeg)

![serial_test_p1_2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/b00c19a7-11f9-98b6-99b5-5a916ea10df1.jpeg)
Databricksシークレットの検閲

> [Databricksにおけるシークレットの管理](https://qiita.com/taka_yayoi/items/338ef0c5394fe4eb87c0)のコンテンツです。

[Secret redaction \| Databricks on AWS](https://docs.databricks.com/security/secrets/redaction.html) [2021/4/12時点]の翻訳です。

Databricksシークレットに認証情報を格納することで、ノートブックやジョブを実行する際に認証情報を容易に保護できます。しかし、変数を指定する際に誤って標準出力を画面に表示してしまうということは起こり得ることです。

これを避けるために、Databricksは`dbutils.secrets.get()`を使用して読み込まれた変数の値を検閲します。ノートブックセルの出力を表示する際、シークレットの値は`[REDACTED]`に置換されます。

> **警告!**
セルのアウトプットに対するシークレットの検閲は、リテラル値に対してのみ適用されます。このため、シークレットのリテラル値を変換した値に対しては検閲は動作しません。シークレットを適切に管理するためには、共有ノートブックへの許可しないアクセスを防ぐために[Workspace object access control](https://docs.databricks.com/security/access-control/workspace-acl.html)(コマンド実行権限を制限)を使用すべきです。

### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)
Databricksシークレットのワークフロー例

> [Databricksにおけるシークレットの管理](https://qiita.com/taka_yayoi/items/338ef0c5394fe4eb87c0)のコンテンツです。

[Secret workflow example \| Databricks on AWS](https://docs.databricks.com/security/secrets/example-secret-workflow.html) [2021/4/12時点]の翻訳です。

このワークフロー例においては、Azure Data Lake Storeに接続するために、JDBCの認証情報を格納するためのシークレットを設定します。

# シークレットスコープの作成

`jdbc`という名前でシークレットスコープを作成します。

```bash
databricks secrets create-scope --scope jdbc
```
> **注意**
[Premium plan](https://databricks.com/product/aws-pricing)を契約していない場合には、全てのユーザー("users")に対して、スコープに対する`MANAGE`権限を付与する必要がああります。例えば、以下のコマンドを実行します。

> ```bash
databricks secrets create-scope --scope jdbc --initial-manage-principal users
```

# シークレットの作成

シークレット`username`と`password`を追加します。以下のコマンドを実行し、開いたエディターにシークレットの値を入力します。

```bash
databricks secrets put --scope jdbc --key username
databricks secrets put --scope jdbc --key password
```

# ノートブックからシークレットを使用する

ノートブック上で`jdbc`スコープに格納されたシークレットを読み込み、JDBCコネクターを設定します。

**Scala**

```scala
val driverClass = "com.microsoft.sqlserver.jdbc.SQLServerDriver"
val connectionProperties = new java.util.Properties()
connectionProperties.setProperty("Driver", driverClass)

val jdbcUsername = dbutils.secrets.get(scope = "jdbc", key = "username")
val jdbcPassword = dbutils.secrets.get(scope = "jdbc", key = "password")
connectionProperties.put("user", s"${jdbcUsername}")
connectionProperties.put("password", s"${jdbcPassword}")
```

これで、JDBCコネクター経由で`ConnectionProperties`を使用して、データソースと接続することができます。スコープから取得したシークレットはノートブック上には表示されません。([シークレットの検閲](https://qiita.com/taka_yayoi/items/de0eabed2c4ee345de29)を参照ください)

# 他のグループにアクセス権を設定する

> **注意**
この操作を行うためには、[Premium plan](https://databricks.com/product/aws-pricing)が必要となります。

認証情報が適切に設定されたことを確認した後で、`datasicence`グループにこの認証情報を共有することにします。

`datasicence`グループに認証情報の読み取り権限を与えるには、以下を実行します。

```bash
databricks secrets put-acl --scope jdbc --principal datascience --permission READ
```

### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)