OmniAICreator/Qiita-1.07M huggingface dataset:
Automation Anywhereの魅力とは？ サービス・特徴をわかりやすく解説！！

こんにちは！
Peaceful morning社でインターンをしている高橋です！

今回とりあげるのはAutomation Anywhereです！
Automation Anywhereは米国のAutomation Anywhere社が提供しているRPAのプラットフォームです。

Automation Anywhereは
**・米国のRPA市場でシェアが1位**
**・ソフトバンクグループから多額の出資を受けている**
**・2019年10月に最新バージョンの登場とUIの日本語への対応**
**・学生や開発者向けに無料で使用できるサービスがある(COMMUNITY EDITION A2019)**

などなど、これから日本でも十分にシェアを伸ばす要素を持ち合わせています。
またAutomation Anywhereには複数の種類のサービスが提供されています。
そこで今回は一体どのようなサービス・製品がAutomation Anywhereにあるのかご紹介します。

##Automation Anywhere Enterprise

![Automation anywhere.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670049/a242acf9-55ea-4954-1540-ff252673a132.png)

(参考：https://www.automationanywhere.com/jp/company/blog/automation-anywhere-news/creating-a-consumer-like-experience-for-automation )

###Automation Anywhere Enterprise V11
大企業向けに作られた、RPA プラットフォームです。

利用可能なサービス
Enterprise(RPA)、IQ Bot 、Bot Insight 、Bot Store 、モバイル アプリ

###Automation Anywhere　Enterprise A 2019
Enterprise A 2019はソフトをダウンロードすることなくWebブラウザ上で自動化を開始することが出来るRPAプラットフォームです。気軽にBot開発を行うことが出来ます。中規模～大企業向けです。

利用可能なサービス
Enterprise(RPA)、IQ Bot 、Bot Insight 、Bot Store 、モバイル アプリ

###Automation Anywhere Community Edition
Community Editionは学生や開発者向けに無料でRPAを体験することができるサービスです。提供されているものはRPA・IQBot・Botのパフォーマンスの運用、ビジネス分析となっています。Enterprise A2019 プラットフォームの利点を無料でお試しいただけます。


利用可能なサービス
Enterprise(RPA)、IQ Bot 、Bot Insight 、Bot Store 

使用してみたい方はこちらから↓
https://www.automationanywhere.com/jp/products/enterprise/community-edition


##Automation Anywhere Enterpriseで利用可能なサービス
ここでは、Automation Anywhere Enterpriseのプラットフォームの中で使える主なサービスを簡単に説明していきます！

###IQ Bot
IQ BotはAIを活用した文書処理です。異なった形式同士でもデータを引っ張ってくることが出来ます。IQ Botには専門的知識が組み込まれていて、高度に特殊化されたプロセスに必要な独自のプロセス固有のデータを瞬時に検出することに特化されています。自然言語処理や機械学習といったAIテクノロジーとRPAの能力を組み合わせることでドキュメントの情報を抽出・分析して文書処理を行います。

###Bot Insight
Bot InsightはRPAアナリティクスプラットフォームです。主にBot、ビジネスレベル、プロセスでのリアルタイム分析を行うことが出来ます。Botから有用なビジネスの情報得ることが出来ます。

###Bot Store
Bot Storeは世界初のロボットのマーケットプレイスです。目的に合わせてすぐに導入することが可能で、Botの他にデジタルワーカーも提供されています。Automation Anywhere以外にもquickbooksやServiceNowなど複数のアプリケーションにも対応して販売されています。

###モバイル アプリ
Bot管理とRPA解析を行える無料のモバイルアプリケーションです。どこからでもBotを管理したり、RPAのパフォーマンスを監視できます。
(※community editionではこの機能は使用できません。）




##さらにAutomation Anywhereを詳しく知りたい方へ
RPA HACKでもAutomation Anywhereの特集を組んでおります！
Automation Anywhere Enterprise A 2019についてもっと知りたい！という方はこちら↓
**Automation Anywhereとは？機能〜勉強方法まで解説！**
https://rpahack.com/automationanywhere




##RPA HACKについて
RPA HACKではRPA・AI・Power Automateに関する記事が100本以上掲載されています！すべて無料でご覧いただけます！

RPAのツールを触ってみたい！という方におすすめ↓
**・UiPath StudioXの基本をマスター！～画面構成/カード/アクション**
https://rpahack.com/uipath_studiox_1


RPAエンジニアとして働いてみたいという方におすすめ↓
**・事務職から転職したRPAエンジニアが語る仕事の2つの魅力**
https://rpahack.com/attraction-of-rpa

Power Automateの使い方を学んで見たい方におすすめ↓
**・Power Automateの便利な使い方をカテゴリーごとに紹介**
https://rpahack.com/powerautomate-2


RPA HACKのtwitterのフォローもよろしくお願いします！
(URL：https://twitter.com/home)
covid-19　片対数グラフ

#概要

plunkerでcovid-19の片対数グラフ、書いてみた。


#写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/684d8400-addf-0ca9-2017-98517b4204ef.png)

#成果物

https://embed.plnkr.co/plunk/AABmvP2uynfUsJuW

以上。
データを使用した顧客の全体像の把握

１．アドバイザーの時間を最も有効に使用できるのはどれですか?
２．ファイナンシャルデータを集約するメリットは何ですか?
３．アドバイザーはどのようにすれば、包括的なフレームワークでクライアントをとらえることができますか?
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634241/2a3a1eaa-95f5-9b14-9d02-b93bb7ba6674.png)
Date.distantPastとDate.distantFutureを使って期間判定関数を書く

# はじめに
Date型にはdistantPast[^1]とdistantFuture[^2]というプロパティがあります。
遠い過去、遠い未来です。
名前にロマンを感じたので、これらのプロパティを使って期間判定を書いてみました。

# 仕様
今日が期間内かどうかを判定する関数を作ります。

1. 開始日と終了日が指定される場合は、今日が期間内であればtrue、期間外であればfalseを返す[^3]。
2. 開始日のみ指定される場合は、今日が開始日以後であればtrue、開始日よりも前であればfalseを返す。
3. 終了日のみ指定される場合は、今日が終了日以前であればtrue、終了日よりも後であればfalseを返す。
4. 開始日も終了日も指定されない場合は、常にtrueを返す[^4]。

# distantPast/distantFutureを使わない場合
```swift
func isWithin(_ startDate: Date?,_ endDate: Date?) -> Bool {
    let now = Date()

    switch (startDate, endDate) {
    case (.some(let startDate), .some(let endDate)):
        return startDate...endDate ~= now
    case (.some(let startDate), .none):
        return startDate <= now
    case (.none, .some(let endDate)):
        return now <= endDate
    case (.none, .none):
        return true
    }
}
```

# distantPast/distantFutureを使う場合
```swift
func isWithin(_ startDate: Date?,_ endDate: Date?) -> Bool {
    let now = Date()
    let startDate = startDate ?? Date.distantPast
    let endDate = endDate ?? Date.distantFuture

    return startDate...endDate ~= now
}
```

[^1]: [distantPast | Apple Developer Documentation](https://developer.apple.com/documentation/foundation/date/1779829-distantpast)
[^2]: [distantFuture | Apple Developer Documentation](https://developer.apple.com/documentation/foundation/date/1779684-distantfuture)
[^3]: 簡便のため「開始日より終了日が前」かどうかの判定は省きました。
[^4]: 簡便のため「開始日も終了日も指定されない場合」には常にtrueを返す仕様にしました。
SCPコマンドでファイル転送する方法

# 経緯
学校などでラズパイでSSHを使いコードを書いた時に、ファイルを提出するときにscpコマンドを使うがどうしても覚えられないので覚え書き。
# コマンド
## パソコン(ローカル)からラズパイ(リモート)へ
```
scp [ローカルのファイルのパス] [user]@[host]:[リモートの転送先のパス]
```
## ラズパイ(リモート)からパソコン(ローカル)へ
```
scp [user]@[host]:[リモートのファイルのパス] [ローカルの転送先のパス]  
```
# 終わりに
**From ローカル**なら、ローカルのパスの記述が先
**From リモート**なら、リモート接続の記述(:の後にパスを書く)が先
AWS CLIで全リージョンの全EC2インスタンスを削除する

## はじめに
最近勉強会やハンズオンをよくやっているおかげで、AWSリソースの消し忘れが怖くなることが多くなりました。
特に残したいリソースも運用しているリソースもないのでいっそ自動で全リージョンのEC2インスタンスを全て削除するスクリプトを作っちゃおうと思います。

## 本題
### 実装
```sh
ec2-delete-instances() {
    # EC2削除
    INSTANCE_IDS=$(
        aws ec2 describe-instances \
            --region $1 \
            --filters "Name=instance-state-name,Values=pending,running,stopped,stopping" \
            --query "Reservations[].Instances[].[InstanceId]" \
            --output text |
            sed -e "s/[\r\n]\+//g"
    )
    if [ -n "${INSTANCE_IDS[0]}" ]; then
        aws ec2 terminate-instances \
            --instance-ids $INSTANCE_IDS \
            --region $1
    fi
    aws ec2 describe-instances --query 'Reservations[*].Instances[*].[Placement.AvailabilityZone, State.Name, InstanceId]' --output text --region $1 |
        sed -e "s/[\r\n]\+//g"

}

echo "Start:delete-reaources-ec2 "

regions=($(aws ec2 describe-regions --query Regions[*].RegionName --output text --region ap-northeast-1))
# リージョン単位で並列処理
for region in ${regions[@]}; do
    ec2-delete-instances $region &
done
wait

echo "finish."
:
```

## 解説
```sh
regions=($(aws ec2 describe-regions --query Regions[*].RegionName --output text --region ap-northeast-1))
```

使用可能なリージョンを全て取得します。

```sh
# リージョン単位で並列処理
for region in ${regions[@]}; do
    ec2-delete-instances $region &
done
wait
```
リージョンでループを回し、削除処理につなげます。
関数名の後ろに`&`をつけることでリージョン単位で並列処理化しています。

```sh
    INSTANCE_IDS=$(
        aws ec2 describe-instances \
            --region $1 \
            --filters "Name=instance-state-name,Values=pending,running,stopped,stopping" \
            --query "Reservations[].Instances[].[InstanceId]" \
            --output text |
            sed -e "s/[\r\n]\+//g"
    )
```

インスタンス情報を取得しています。
queryオプションを付与することでインスタンスIDのみを取得しています。

```sh
    if [ -n "${INSTANCE_IDS[0]}" ]; then
        aws ec2 terminate-instances \
            --instance-ids $INSTANCE_IDS \
            --region $1
    fi
```

インスタンスIDが取得できた場合は削除します。

```sh
    aws ec2 describe-instances --query 'Reservations[*].Instances[*].[Placement.AvailabilityZone, State.Name, InstanceId]' --output text --region $1 |
        sed -e "s/[\r\n]\+//g"

```

最後にインスタンスの状態を確認して終了です。

## 終わりに
ひとまずEC2インスタンスの削除はできるようになりました。
このまま別のリソース削除をガンガン作っていきたいです；)
Laravelのテストでrollbackされない問題

LaravelのPHPUnitの拡張機能に`Illuminate\Foundation\Testing\DatabaseTransactions`トレイトというものがあります。
これはsetUpで`beginTransaction`し、tearDownで`rollback`することでテスト毎にデータを捨ててクリーンにデータベースを保ちながらテストコードを書くことができる機能です。（大げさ）

この機能を利用しているのでsetUpでSeederを利用してテストデータを挿入していたので後続のテストには影響がない前提でテストを書いていたにもかかわらずrollbackされなくて後続のテストに影響が出てしまったケースがありました。
そのコードが以下

```php
use DatabaseTransactions;

protected function setUp(): void
{
    parent::setUp();
    \DB::table('クリアにしたいテーブル')->truncate();
    $this-seed('テストケースデータ');
}
```

setUp内で特定のテーブルに対してtruncateを実行しています。
これには以下の背景がありました。

- MySQLではrollbackしてもautoincrementのカウンタは戻らない
- 特定のautoincrementの値であることを検証したい（そんなテストもどうかと思うというツッコミは控えてほしい）

なので、truncateでもともと入ってるデータはきれいにしてしまえ、という思案です。
ですが先述の通りこのコードには問題があります。

それは、**[MySQLはtransaction中にtruncateを実行すると暗黙的にcommitする](https://qiita.com/ritakura/items/bd2ae6cad7a593c291a0)**ということです。
ということでtruncateコード後のseedは無事コミットされているという具合ですね。

こういうケースでは`Illuminate\Foundation\Testing\RefreshDatabase`トレイトを利用することでDBを空っぽにしてくれます。

## まとめ

- MySQLはtransaction中にtruncateを実行すると暗黙的にcommitする
- `Illuminate\Foundation\Testing\RefreshDatabase`を使おう
Virtual Chara開発 - その6

店舗接客などに使える仮想のキャラクターが扱えるアプリ開発をしました。そちらの説明はこちらになります。
https://qiita.com/NestVisual/items/fe4dd168178e27156682

環境：
Windows 10
Unity 2018.4.1
RealSense D435i


###フェイストラッキングで顔を操る:

フェイシャルトラッキングをキャラに反映するときには、顔のデバッグデータの表示と同じ方法で行いました。Nuitrackの「FaceInfo」クラスは顔の表情データも含まれています。最初にテストしてみましたが、ニュートラル、怒り、驚き、幸せの表情に限定されています。さらに、自分の顔から「ニュートラル」と「怒り」以外の表情データの取得精度が低いと思いました。

Nuitrackの表情の代わりに顔の目印データから自分の顔の表情を計算してみました。例えば、目が閉じているかどうかを確認するために、目の上と下のような特定の点間の距離を測定しました。距離が一定の閾値以下であれば目は閉じているとみなされ、そうでなければ開いているとみなされます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626158/61d7cc1b-9bd2-5920-e659-122866efcd56.png)

キャラモデルには「Face」というチャイルドオブジェクトがあり、「Skinned Mesh Renderer」コンポーネントが接続されています。このコンポーネントには、ブレンドシェイプの配列が含まれています。それぞれが個別の表情を操作します。顔の表情は、インスペクタのスライダーを使ってスムーズにブレンドできます。表情の優劣に応じて、0～100の値を設定できます。また、コードを使ってこれらの値を操作することもできます。このようにして、利用者の表情を動的にキャラに反映させています。VRoidモデルを使うと、モデルに付随するブレンドシェープしか使いません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626158/277c355f-7224-1ff3-f116-fe063f1867c6.png)
UiPath：複数の条件に使うAnd演算子とOr演算子とその他の演算子

## 皆もすなるQiitaといふものを、儂もしてみむとてするなり。

と言う訳で、こん＊＊は！はなっち！です。

###複数の条件評価
先日、「[UiPath：比較（.CompareTo()メソッド）の話](https://qiita.com/HANACCHI/items/fefaeeceb9b876e1249e)」を上梓した訳ですか、要件に因っては複数の条件で評価する仕様が出てきますね。例えば、「本日が、１Ｑだったら...」「本日が、下半期だったら...｣と言う具合。

その手順としては、１）１Ｑの自至を求め、２）**本日がその間にあるかを評価する**　と言う具合ですね。

**１Ｑの自　<=　本日 <=　１Ｑの至**

これを、UiPathの「条件分岐」アクティビティで実現するには、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669015/94635938-7bdb-6026-b8a2-885b71ad8d7c.png)
こんな感じ。実際には１Ｑの自とか、至は変数にしているでしょうけど。。。

「条件分岐」アクティビティの**Condition**の記載は、以下の通り。
**Not 本日.CompareTo(New DateTime(2020,4,1)).Equals(-1) And**
**Not 本日.CompareTo(New DateTime(2020,6,30)).Equals(1)**


さて、先の「**本日がその間にあるかを評価する**」条件式は、
１Ｑの自　<=　本日 <=　１Ｑの至

だったのですが、UiPathの「条件分岐」アクティビティでは、
１Ｑの自　<=　本日　**And**　本日　<=　１Ｑの至

のように、「１Ｑの自　<=　本日」と「本日　<=　１Ｑの至」を**And演算子**で結んでいます。

ご存知のように、
**And演算子**は、「And」で結んだ左側の条件と右側の条件が双方Trueなら、評価結果はTrueとなり、
**Or演算子**は、「Or」で結んだ左側の条件と右側の条件がどちらかがTrueなら、評価結果はTrueとなります。

###評価のタイミング
**And演算子**で話を進めます。

例えば、以下のようなロジックがあった場合、どんな動きになるでしょうか？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669015/79eb60cc-cb5c-bd14-ba1f-b41aaa4eda6c.png)

変数：文字列型に"KOZAKI"が設定されているので、**False**となって、Else側ロジックを処理すると思われるでしょうが、実際には異常終了します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669015/88cd16a5-291c-c6b4-cc5c-dc088ca07f28.png)

これは、「And」で結んだ右側の条件で参照している**変数：DataTable型がNull**であった為ですね。
こんな場合でも、「And」で結んだ左側の条件の評価が**False**なので、Else側ロジックを処理してもいいではないか！と思うのが**人の常**と言うものです。

実は、UiPathと言うか、.Netにはそんな**人の常**を知ってか知らずか、**AndAlso演算子**と言うのがあります。（参照：[AndAlso 演算子 (Visual Basic)](https://docs.microsoft.com/ja-jp/dotnet/visual-basic/language-reference/operators/andalso-operator)）

やってみましょう！
先ほどのロジックと同様に、変数：文字列型に"KOZAKI"が設定だけ行い、「条件分岐」アクティビティの**Condition**中の「**And**」を「**AndAlso**」に書き換えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669015/4ab4b822-b49b-c9b8-96b3-37bf13ac7b99.png)
このロジックで実行すると、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669015/02550799-7a06-a3ed-01ff-b531f2f8c818.png)
となり、「And」で結んだ左側の条件の評価が**False**なのでそのままElse側ロジックを処理していきました。ちょっとElse側ロジックで表示するメッセージが変な気もしますが、気にしない気にしない！

##AndAlso演算子があるのなら...
AndAlso演算子があるのなら、Or演算子にも似たものがあるのでは？と思われた方！ご安心ください！あります！**OeElse演算子**と言うのがちゃんとあります。（参照：[OrElse 演算子 (Visual Basic)](https://docs.microsoft.com/ja-jp/dotnet/visual-basic/language-reference/operators/orelse-operator)）

詳しくは、[[UiPath][.NET]And/OrとAndAlso/OrElseの違い](https://qiita.com/cheez_RPA/items/ebd4972afdd6d1276d6c)
（@cheez_RPAさん著）をご覧ください！

って、既にQiitaされていたんかぁ～～い！


##おわりに
いかがでした？
**And演算子**は双方同じタイミングで評価し、**AndAlso**演算子は左から順に評価していく事がお分かりいただけたでしょうか？
実際のUiPathでのワークフロー作成では、DataTable型がNullである状態を見越して使うなんて事はありません。各条件で、Falseとなる確率が高い順に左から**AndAlso演算子**で記述していきますね。そうすると評価に掛かるコストが若干減るわけですが、まぁ、そこまで厳密に考慮する位だったら、他の要因の安定稼動要素をチェック検証していった方がいいですね。とは言え、こういう演算子があるという事を覚えていても損は無いはず！
是非UiPathでのロボ開発の一助になればと思っています。

ありがとうございました！
Alexaスキルを作ってみたい

# はじめに
「Alexaスキルを作ってみたいなぁ。」と思いながらも、「環境構築とか大変なんでしょ。」と思っている人に読んでもらいたい記事です。

ノンコーディングでAlexaスキルを作成できる「[Alexa Skill Blueprints](https://blueprints.amazon.co.jp/home)」という開発環境もあります。
こちらは、買い物で使用しているAmazonアカウントでサインインでき、やりたいことのテンプレートを選んで、ポチポチと項目を設定していくだけで簡単にスキルが作れてしまいます。（簡単すぎて驚きました。）

この記事では、「Alexa Skill Blueprints」の次のステップとして、Alexa開発者コンソール（Alexa Skills Kit）での開発について書きたいと思います。
<br/>

# 必要なもの
* Webブラウザ
* メールアドレス
* Amazon開発者アカウント（AWSアカウントとは別です。）

**※Amazon EchoなどのAlexa対応デバイスを持っていなくても開発できます。**
<br/>

# Amazon開発者アカウントの取得時の注意点
1. 「[Amazon開発者ポータル](https://developer.amazon.com/ja)」にアクセスし、［ログイン］をクリック。

1. ［Amazon Developerアカウントを作成］<font color="Red">***を押さずに***</font>、Amazonアカウント（買い物につかうやつ）でログインしてください。

**※［Amazon Developerアカウントを作成］でアカウントを作成してしまうと、US版アカウントが作成されて、日本語での開発ができないそうです。（ [Alexa 開発者アカウント作成時のハマりどころ](https://developer.amazon.com/ja/blogs/alexa/post/9f852a38-3a44-48bd-b78f-22050269d7c7/hamaridokoro)）**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657226/70c12839-5c92-ada0-22f5-5067405a95f8.png)

※以降の手順は、[［公式ブログ］Alexaスキル開発トレーニングシリーズ第1回：初めてのスキル開発](https://developer.amazon.com/ja/blogs/alexa/post/31c9fd71-f34f-49fc-901f-d74f4f20e28d/alexatraining-firstskill)の「準備. Amazon 開発者アカウントの作成」を参考にしてください。
<br/>

# 学習＆スキル作成
実際のAlexaスキルの作成方法に関しては、公式ブログと公式動画が本当にわかりやすいので、そちらを参考にしていただければと思います。

私は、最初に動画を見てからブログを見て勉強しました。
最初にブログを見るよりわかりやすく感じました。

# 最後に
いろいろと手順を書いていこうと思ったのですが、公式のブログや動画が充実していて、あまり書くことがありませんでした。

（環境構築不要）
（公式の学習資料も充実）

ということで、興味のある方はチャレンジしてみてください。
Alexaが思ったとおりにしゃべってくれると、本当に楽しいです。

# 参考文献
* [［公式ブログ］Alexa 開発者アカウント作成時のハマりどころ](https://developer.amazon.com/ja/blogs/alexa/post/9f852a38-3a44-48bd-b78f-22050269d7c7/hamaridokoro)
* [［公式ブログ］Alexaスキル開発トレーニングシリーズ第1回：初めてのスキル開発](https://developer.amazon.com/ja/blogs/alexa/post/31c9fd71-f34f-49fc-901f-d74f4f20e28d/alexatraining-firstskill)
* [［Alexa公式 動画シリーズ］：Alexa道場](https://developer.amazon.com/ja-JP/alexa/alexa-skills-kit/webinars)
powershellで配列を拡張していくときの注意点

powershellで配列に要素を追加していくとき、以下のような書き方があります。

```powershell
$array += $newitem
```

これは実際のところ、値渡しではなく参照渡しで要素を追加しているようです。そのため、以下のようなループで要素を追加すると想定しない結果が得られます。

```powershell:ng.ps1
$data=@("hoge","fuga")
$body=@()
$item = @{}
foreach($d in $data){
    $item["data"] = $d
    $body += $item
}

$body
```

```bash
PS > ./ng.ps1

Name                           Value
----                           -----
data                           fuga
data                           fuga

PS >
```
配列body内のdataが全てfugaになっています。一つ目のdataはhogeが代入されたはずでしたが、最終的には全てfugaになりました。おそらく、キーdataにfugaが代入されたitemを二つとも参照しているものと思われます。
これを防ぐには、foreach内で都度itemを初期化する必要があります。

```powershell:ok.ps1
$data=@("hoge","fuga")
$body=@()

foreach($d in $data){
    $item = @{}
    $item["data"] = $d
    $body += $item
}

$body
```

```
> ./ok.ps1

Name                           Value
----                           -----
data                           hoge
data                           fuga

PS />
```
復号化のpad block corruptedエラー対応策

エラー現象：FATAL_ERROR|System.SecurityException: pad block corrupted
暗号化クラス：
Blob cryptoKey = Crypto.generateAesKey(256);
Blob dataenc = blob.valueOf('Hello');
Blob encryptedData = Crypto.encryptWithManagedIV('AES256', cryptoKey , dataenc );
String b64Data = EncodingUtil.base64Encode(encryptedData);
System.debug('Encrypted' + b64Data);            
 
復号化クラス：
Blob cryptoKey1 = Crypto.generateAesKey(256);
Blob data = EncodingUtil.base64Decode(b64Data);
Blob decryptedData = Crypto.decryptWithManagedIV('AES256', cryptoKey1 , data);
System.debug('Decrypted'+ decryptedData.toString());

暗号化クラス：
Blob cryptoKey = Crypto.generateAesKey(256);
Blob dataenc = blob.valueOf('Hello');
Blob encryptedData = Crypto.encryptWithManagedIV('AES256', cryptoKey , dataenc );
String b64Data = EncodingUtil.base64Encode(encryptedData);
System.debug('Encrypted' + b64Data); 
           
復号化クラス：
Blob data = EncodingUtil.base64Decode(b64Data);
Blob decryptedData = Crypto.decryptWithManagedIV('AES256', 暗号化クラスのcryptoKey , data);
System.debug('Decrypted'+ decryptedData.toString());
gitで匙を投げた時の必殺技

# 概要
gitでresetとかやった結果もう無理かもってなった場合はリモートの状態に戻します。
リモートの状態がキレイじゃない人は匙を投げずに頑張ってください。

1. 削除してスッキリ
2. cloneでリモートを取得
3. 作業したいブランチにセット

# 削除
gitのblobの削除確認が出るのでforceコマンドで強制します。

```shell
$ rm -rf project
```

# クローン

```shell
$ git clone https://github.com/user_name/project_name
```

# 作業してたブランチに戻る
ローカルにマスターブランチしかない思います。

```shell
$ git branch
 * master
$ git branch -a
 * master
   remotes/origin/master
   remotes/origin/develop
```

作業していたブランチに戻ります。

```shell
$ git checkout origin/develop
$ git branch develop # HEADにローカルのブランチ作成
$ git pull origin develop
$ git branch -u origin/develop # originとの紐付け
$ git branch -vv
 * develop     5bf1fdf [origin/develop] comment
   master      c11071d [origin/master]  comment
```
Cisco ios-xrでXMLで出力結果を得る方法

# 自己紹介
勝男です。
ネットワークの自動化やってます
何かあればhttps://twitter.com/katu7414
まで

#本題
はるか昔ios時代は

```show run | format```
でXMLで出力出来ていました。

ios-xrは(一部省略)

```
RP/0/0/CPU0:XRV_02#show run  formal

hostname XRV_02
telnet vrf default ipv4 server max-servers 10
interface Loopback0
router ospf xrv2 area 0
router ospf xrv2 area 0 interface Loopback0
router ospf xrv2 area 0 interface GigabitEthernet0/0/0/0
router ospf xrv2 area 0 interface GigabitEthernet0/0/0/2
router ospf xrv2
ssh server v2
end
```

なぜかformatからformalに変わっていました。

忘れないようにここに記述します


以上です
初めてのGitでurlの文字化け

Gitでプッシュ先のリモートを指定したとき文字化けしてしまいました。
その時の解決策を書きます。


**Gitの登録**
Qiitaに登録するときにアカウントを作成していたが、
まったく使わずにいた。
今回自分のgitのページ下にpracticeというディレクトリを追加した。

<BR>
**Gitの環境構築**
windows10の環境で下の通りにやった。
https://prog-8.com/docs/git-env-win

Gitをインストール
起動
以下のコマンドを打ち込んでいく
基本は打ち込みではなくprogateのコマンドをコピペしていた。


```
$ git config --global user.name "ユーザー名"
$ git config --global user.email "メールアドレス"
$ mkdir practice
$ cd practice
```

ローカル側の「practice」フォルダーにあらかじめ作っておいた「Hello.py」を保存

```
$ git init
$ git remote add origin <URL>         #この時におそらく全角文字が混じった
$ git commit -m "Create index.html"
$ git push origin master
```
<BR>

**不具合発生**

```
$ git push origin master
fatal: protocol 'ﾂ防ttps' is not supported
```

文字化け？？？
とりあえずリモートを上書きしよう

```
$ git remote add origin <URL>         #今度は半角で
$ git commit -m "Create index.html"
$ git push origin master
```

同じエラーばかり出る。
「Git 文字化け」でググるが、ファイル自体の日本語だとか
中身をUTF-8で保存しろだとか、そういうのばかり。

<BR>
**解決策**

設定ファイルを直性いじることにしました。
まずローカルのディレクトリを「ll -a」コマンドで見てみます。

```
mamechan@**** ~/practice (master)
$ ll -a
total 8
drwxr-xr-x 1 mamechan 197121   0  7月 17 13:17 ./
drwxr-xr-x 1 mamechan 197121   0  7月 17 13:51 ../
drwxr-xr-x 1 mamechan 197121   0  7月 17 13:56 .git/
-rw-r--r-- 1 mamechan 197121 346  7月 17 12:56 Hello.py
-rw-r--r-- 1 mamechan 197121   0  7月 17 13:17 test.txt

```

「.git/」を調べてみます。

```
mamechan@**** ~/practice (master)
$ ll -a .git/
total 17
drwxr-xr-x 1 mamechan 197121   0  7月 17 13:56 ./
drwxr-xr-x 1 mamechan 197121   0  7月 17 13:17 ../
-rw-r--r-- 1 mamechan 197121  11  7月 17 13:18 COMMIT_EDITMSG
-rw-r--r-- 1 mamechan 197121 243  7月 17 13:54 config
-rw-r--r-- 1 mamechan 197121  73  7月 17 12:48 description
-rw-r--r-- 1 mamechan 197121  23  7月 17 12:48 HEAD
drwxr-xr-x 1 mamechan 197121   0  7月 17 12:48 hooks/
-rw-r--r-- 1 mamechan 197121 209  7月 17 13:18 index
drwxr-xr-x 1 mamechan 197121   0  7月 17 12:48 info/
drwxr-xr-x 1 mamechan 197121   0  7月 17 13:06 logs/
drwxr-xr-x 1 mamechan 197121   0  7月 17 13:18 objects/
drwxr-xr-x 1 mamechan 197121   0  7月 17 13:49 refs/
```

多分このconfigだ。

```
vi ./git/config
```

```:config
[core]
        repositoryformatversion = 0
        filemode = false
        bare = false
        logallrefupdates = true
        symlinks = false
        ignorecase = true
[remote "origin"]
        url = <96>https://github.com/mamechan08/practice.git
        fetch = +refs/heads/*:refs/remotes/origin/*
```

ちょっとうろ覚えなんですが、uelの前にコードが入っていて、文字化けの原因になっていました。
この<96>部分を消して上書きしたのち

```
$ git commit -m "Create index.html"
$ git push origin master
```

をしたところ、無事にプッシュできました。

<BR>

**Gitこわくない**

プッシュとかリモートとかコミットとか、とにかく横文字だらけで小難しいイメージでしたが、
壁にぶち当たったことで仕組みが分かりました。
おそらくリモート先の指定もオプションかなんかで上書きできる設定があるんじゃないでしょうか？

最初に間違って違うフォルダをgit initしてしまったのですが、
つまりgit initをすることで、そのフォルダ上に「.git/」という設定ファイルを作るんですね。
間違って作ったフォルダ上で「rm -rf .git」をすることでmasterから外すこともできました。

結果的にgitの仕組みが少しわかったのでよかったです。


---
参考サイト
https://www.codeadvisor.jp/entry/2018/02/18/124557
Financial Services Cloud の使用開始

１．Financial Services Cloud はどのようなアプリケーションですか?
２．Financial Services Cloud は、どのような形でファイナンシャルサービス業界に特化されていますか?
３．Financial Services Cloud を拡張する場合はどこにアクセスしますか?
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634241/00cb49a4-92d0-ed48-2c2e-6901fa5372fa.png)
ghコマンド用の認証トークン設定

久しぶりに`gh`コマンドを叩いたら動かなくなっていたので認証トークンを更新した。
たぶん誤ってトークンを消してしまったのだと思うが、ググると`hub`コマンドのトークンの更新方法ばかりが引っかかってトークンの更新方法の記事が見つからなくて少し手間取ったので備忘のためメモ。

### こういう状態

```bash
$ gh pr status 
HTTP 401: Bad credentials (https://api.github.com/graphql)
```


### ghコマンド用の認証トークンの設定場所

```bash
$ vim ~/.config/gh/hosts.yml

github.com:
    user: xxxx
    oauth_token: xxxxxxxxxxxxxxx
```

トークンの生成は以下を参照
https://docs.github.com/ja/github/authenticating-to-github/creating-a-personal-access-token
必要なスコープはこの3つ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77606/8ff4f28c-dee0-4c73-a100-96d6137c9623.png)


### 備考
ググると`hub`コマンドのトークンの更新記事が引っかかるので間違えないように注意。
なお、`hub`コマンド用のトークンの設定場所は以下。

```bash
$ vim ~/.config/hub

github.com:
- user: yokohama4580
  oauth_token: d291399733f3d518c48877e84540c9aa4d94fcbc
  protocol: https
```
Uncaught ReferenceError: Cannot access '***' before initialization at

javascriptのエラーメモ。

`Uncaught ReferenceError: Cannot access '***' before initialization at main.js:12`

## 原因

実行コードより後に定義した引数を使用した場合や、スコープの外から呼び出した時に表示されるエラーです。

```javascript:main.js
console.log(c);
let c = 0;
```

`let`で宣言した値は、Javascriptエンジンによる`undefined`の初期化が行われません。
(※`var`の場合は`undefined`となる）

## 解決

変数の定義後に呼び出せばOK。

ポイントは、Javascriptでは初期化は巻き上げられないということです。

```javascript:main.js
let c = 0;
console.log(c);
```

関数宣言であれば、定義前に実行しても巻き上げられて、正常に動作します。

```javascript:sample.js
greeting("Tom"); // "hello Tom" 

function greeting(name) {
   console.log("hello " + name);
}
```

下記のように、無名関数を変数に格納して、関数の定義より上で実行すると…

```javascript:sample.js
greeting("Tom"); // "Uncaught ReferenceError" 

const greeting = function(name) {
  console.log("hello " + name);
}
```

`Uncaught ReferenceError`になります。

関数式と関数宣言の挙動の違いにも注意しましょう。

## 参考
変数の巻き上げ
[MDN/Hoisting](https://developer.mozilla.org/ja/docs/Glossary/Hoisting)
node.jsをdocker-composeで動かしたら、Error: Cannot find module '/bash'になる

プログラミングを覚えて丁度1年くらいの未熟エンジニアがdeockerでnode.jsの環境構築をしてつまづいた話です。

* Dockerfile  

```Dockerfile
FROM node:14.5.0-alpine3.12

WORKDIR /app
COPY . /app
RUN npm install
```

* docker-compose.yml

```yml
version: '3'

services:
  app:
    build: .
    ports:
      - 3000:3000
    tty: true
    volumes:
      - .:/app
    command: bash -c "node index.js"
    depends_on:
      - db

  db:
    image: postgres:12.2
    ports:
      - "5432:5432"
    environment:
      - "POSTGRES_USER=hogehoge"
      - "POSTGRES_PASSWORD=hogehoge"
      - "POSTGRES_DB=hogehoge"
```

これを実行すると

```bash
Error: Cannot find module '/app/bash'
```
って言われます。

## 結論
alpineにbashは無いそうです。。
alpineは軽量で良いと言われ、使っていました。
ちゃんと調べないとダメですね。。

```yml
command: ash -c "node index.js"
```
docker-compose.ymlのcommandのところをbash => ashに変えたらOKでした
route53 （AWSのDNSサービス）

## route53
 - 特徴 
  - ネームサーバの役割を果たす。
  - 高可用性。SLA驚きの100%。つまりほぼ落ちない。
  - 名前の由来はDNSサービスはTCP/UDPの53番ポートを利用するところから


## 重要概念
 - ホストゾーン
  - DNSのリソースレコード（ドメイン名とIPアドレスを紐づけた一つ一つの情報）の集合。
 - レコードセット。
  - ホストゾーンのレコード一つ一つのこと。つまりソースレコード
 - ルーティングポリシー
  - route53がレコードセットにどのようなルーティングを行うかを決める
 
## route53を使ったアクセスの一連の流れ
**例`http://www.example.com`にブラウザでアクセスする場合**

webブラウザで「`http://www.example.com`」というサイトにアクセス
↓
フルルゾルバにアクセス
↓
フルリゾルバがwww.example.com/についてルートネームサーバに問い合わせて、ルートネームサーバが「comのネームサーバに問い合わせて」と返す
↓
その情報をもとにフルリゾルバがwww.example.com/についてcomネームサーバに問い合わせて、comのネームサーバが**「route53に問い合わせて」**と返す
↓
**その情報をもとにフルリゾルバがwww.example.com/についてroute53に問い合わせると、example.comのネームサーバが「IPアドレスは93.184.216.34だよ」と返す。**
↓
フルリゾルバがブラウザに「IPアドレスは93.184.216.34だよ」と返す。
↓
webブラウザがIPアドレス93.184.216.34のwebサーバにアクセスできる
「7 Design Patterns to Refactor MVC Components in Rails」を読んでみた(執筆中)

# この記事について

[7 Design Patterns to Refactor MVC Components in Rails](https://www.sitepoint.com/7-design-patterns-to-refactor-mvc-components-in-rails/)を読んでまとめてみた。個人的見解や感想も含めます。普通に元の記事読むんでいいかも。。。

# 1. Serviecオブジェクト(とInteractorオブジェクト)
# 2. Valueオブジェクト
# 3. Formオブジェクト
# 4. Queryオブジェクト
# 5. Viewオブジェクト(Serializer/Presenter)
# 6. Policyオブジェクト
# 7. Decoratorオブジェクト


# その他(記事書きながらのメモ)
- PORO = Plain Old Ruby Object
ドメインの購入について

 - **ドメインの管理と販売システム**
  - ICANN - ドメイン全体を管理している組織
  - レジストリ - トップレベルドメインを管理している組織。レジストラにドメインを卸している。
  - レジストラ -  一般消費者またはリセラにドメインを販売している。(お名前.com等)
  - リセラ　- 一般消費者にドメインを販売している。（ムームードメイン、yahoo!ドメイン等）

一般的に購入先はレジストラやリセラとなる。

迷ったらお名前.comなどの大手リセラで買うとベター。１年毎の料金で販売されていることが多く、1年目と２年目以降で値段が変わるので注意。
Web上でIzhikevichニューロンモデルをシミュレーションしてみよう！

# はじめに
私は神経科学が専門ではありませんが，スパイキングニューラルネットワークを扱った研究をしている以上，神経科学(ニューロサイエンス)は切っても切れない分野です．

巷で有名なディープニューラルネットワークも，結局は**形式ニューロンモデル**という神経細胞の数理モデルの集まりです．
形式ニューロンは，時系列データを持っておらず，神経細胞モデルとしては**1943年に提案されたかなり古いモデル**なのですが，今の深層学習には相性が良いので未だに使われています．

しかし，もちろん神経科学分野においては，より生物学的に精緻な神経細胞数理モデルが多く誕生しています．
これらは通常，「膜電位」や「スパイク」といった概念を持ち，そういったモデルを**スパイキングニューロンモデル (SNM)**と言います．
さらに，それをネットワーク上にすれば**スパイキングニューラルネットワーク (SNN)**と呼ばれます．
SNNについては，私が昔書いた[Spiking Neural Networkとは何なのか](https://qiita.com/arakiii/items/b076a5c9e57c08c49a9a)を読んでください．

# Izhikevich Neuron Model (2003)
さて，スパイキングニューロンモデルの中でも有名な**Izhikevich Neuron Model**というモデルが今回のテーマです．
エンジニアリングな研究ではLIFモデルがよく使われますが，医学寄りな研究ではこのIzhikevichモデルがよく使われ(ているように思い)ます．

なぜかというとIzhikevichモデルは様々なニューロンの活動を，パラメータを変えるだけで模倣できるからです．
さらにHodgkin-Huxleyモデルのような複雑さは無く，効率的に神経細胞の細かな挙動をシミュレーションできる，という大きなメリットがあります．
(ref. [Hodgkin-Huxleyニューロンモデルを実装してみる](https://qiita.com/arakiii/items/357833cf85a7ffbe7bae))

Izhikevichモデルは以下のような2つの微分方程式から成り立ちます．
$$\frac{dv}{dt}=0.04v^{2} + 5v + 140 -u + I$$
$$\frac{du}{dt}=a(bv-u)$$
$${\rm if}\ \  v\geq30,\ \ {\rm then}\ \ v\leftarrow c,\  u\leftarrow u+d$$

このとき，$v$は膜電位[mV]，$t$は時間[ms]， $u$はrecovery variable(回復変数)と呼ばれる変数，$I$は外界からの入力電流を指します．
また$(a, b, c, d)$はハイパーパラメータです．
$a$は，$u$をどれだけ時間的減衰させるかを司る定数(時定数)，$b$は$v$に対する$u$の感受性，$c$は静止膜電位，$d$は$v$が発火した後に膜電位が回復するまでにかかる時間に影響する定数です．

まあ，**こんなことをつらつら書かれても分からないと思うので，実際に動かしてみましょう**．

# Izhikevich Neuron Simulator
Web上で動くシミュレータを作りました．

[Izhikevich Neuron Simulator -Web上で動作するニューロンシミュレータ-](https://neuron.hirlab.net/)

バックエンドはPython(Flask/NumPy)で，グラフ描画はJavascriptです．

同じようなモデルの説明や，パラメータ設定例も書いてありますので，適当に遊んでください．
スマホでも使えますが，描画が潰れてしまうので，**PCやタブレット推奨**です．
どうしてもスマホ，って場合は横持ちの方がまだマシかも．

例えば初期設定のまま，$I_{DC}$にチェックをいれてシミュレーションしてみると，
<img width="1307" alt="izh_simu.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520839/cd9c4b1b-1d53-70e4-e20c-dc10dce506a4.png">
 $$⬇️$$
<img width="1260" alt="rs.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520839/048169f3-e4d8-980e-1c07-dcfbb9c208f6.png">

このように，決めた入力電流にしたがって計算された，膜電位$v$と回復変数$u$が描画されます．

また，時間分解能は計算時は$dt=2^{-5}$と細かく設定しているのでカオスも一応確認できます．
<img width="1260" alt="chaos.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520839/587660c7-e764-b0a3-f40e-970c7d54a256.png">
(これはカオスと言ってもよいのかな?? 詳しい人いたら教えてください．)

# おわりに
この記事は，Webアプリの紹介記事でした．
(個人的には，ニューロサイエンス初学者や，ちょっとした指導とかにつかってくれたら嬉しいなと思ったり...)

お遊び程度でも良いので使ってみて，少しでも神経科学に興味を持つ人が増えてくれたら幸いです！
もし，不具合等あればこの記事にコメントつけていただければと思います．

# 参考
1. [神経活動を微分方程式で表してみよう, 池谷 裕二](http://gaya.jp/spiking_neuron/izhikevich.htm)
2. [Simple Model of Spiking Neurons, M. Izhikevich, 2003](https://www.izhikevich.org/publications/spikes.pdf)
【RDB】GCP × Windows 仮想環境の初期設定

「[GCPで仮想Windows 環境を構築&リモートデスクトップで接続する方法](https://qiita.com/gc_garden/items/76208ee60e934c1aa439)」で構築したWindows 仮想環境を使いやすくするための初期設定を行います。

## 前提条件
Windows 仮想環境を構築したばかりで何も設定を行っていない状態から操作しやすくするために次の設定を行います。

1: **Windows 言語を日本語 変更**
英語になっているので日本語に変更します。

2: **Internet Explorer (IE)の設定変更**
セキュリティ設定を変更し、ダウンロードを行えるようにします。

## Windows 言語を日本語化
Windows の言語は「English (United States)」になっており、英語が面倒なので言語を「日本語」に変更します。
日本語 にするには日本語 言語パッケージをダウンロードします。

タスクバーの 「Windows」から「setting」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/664451/2c681633-e943-89e5-a1af-8697c67d72e0.png)

続けて「Time & Language > Language > +Add a Language」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/664451/b9d8c8ef-e6f0-f135-7ca7-2b46a7083c49.png)

インストールする言語を「Japanese」を選び、Windows 言語をインストールします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/664451/ec56b98b-0507-8a47-0848-18920d0caacd.png)

ダウンロードが完了したら言語を「日本語」に適用するためには再起動を行います。
再起動後はWindows 言語が日本語になります。

## IE のセキュリティ構成を変更
デフォルト設定では「Internet Explorer セキュリティ強化の構成が有効」になっているため、このままではIEブラウザからChorm ブラウザなどがダウンロードができません。
ダウンロードを行えるようにIE のセキュリティ強化を「無効」に変更する必要があります。

※ セキュリティの詳細は、公式「[Internet Explorer セキュリティ強化の構成による Internet Explorer のユーザー操作の変更](https://support.microsoft.com/ja-jp/help/815141/ie-enhanced-security-configuration-changes-browsing-experience)」をご覧ください。

タスクバーの「サーバーマネージャー」をクリックし、起動させます。
左サイドバーの「Local Server」を選択し、IE Enhanced Security Configuration の「On」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/664451/376b1df9-3be4-b0d7-49d5-14de681a1836.png)

Administer を「Off」に変更します。
Offに変更すると画面がフリーズする場合もありますがフリーズが解除されるまで待ち、変更されるのを確認し「OK」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/664451/59262c2a-bf9c-2f04-bb68-63e2a4350bcc.png)

これでIEブラウザ からダウンロードが行えるようになります。

----
以上でWindows 仮想環境の初期設定が完了です。
GCEは作ってないのにGCEの料金が発生し続ける

GCEのインスタンスはすべて削除しているのにGCEの料金が発生していることに気づいて、なんだこれ〜ってなりました。

原因は、
　__サーバーレス VPC アクセスを作成していたから__
でした。
(´・ω・｀)

GCEの料金になるんですね...
Tkinter 相互関連があるCallbackをテストする

###Hex SpinBoxとBin Editorを相互に操作させる

###やりたい事
![hextobin.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506495/0f97ec14-23b4-08ac-5dce-5daeab2f3d99.png)
あっちを変えれば、こっちも変わる　こっちを変えれば　あっちも変わる
GUIを相互で操作させるのはちょっと面倒？

###やった事
互いのハンドラにコールバック関数を登録させることで
お互いの変更を連絡できるようにしてみました。
もっと素直な実装方法があるかもしれませんが、先ずは相互動作ができました。

![hextobin2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506495/96b2dd7b-03d6-8201-47f8-1ab706861b10.png)


>    def callback(i):  #コールバック関数の生成　それぞれのボックスに値を設定
>        hx.set(i)
>        be.set(i)
>
>    hx.setCallback(callback)  #HexSpinboxにハンドラ登録  変更があった段階で callbackを呼出し
>    be.setCallback(callback)  #BinEditorにハンドラ登録  変更があった段階で callbackを呼出し

```Pyhotn:MultiBinEditor.py
import tkinter as tk

class HexSpinbox(tk.Spinbox):
    def __init__(self, *args, **kwargs):
        self.var = tk.StringVar()
        self.bytenum = kwargs.pop('bytenum', 1)
        self.add_callback = None
        max_val = 0x1<<(self.bytenum*8)
        super().__init__(*args, **kwargs, textvariable=self.var, from_=0,to=max_val,
                         increment=1, command=self.callback )

    def set(self, val):
        s = "0x{:0%dx}" % (self.bytenum*2)
        self.var.set(s.format(int(val)))
        
    def get(self):
        hstr = super().get()
        return int(hstr, 16)

    def callback(self):
        val = super().get()
        self.set(val)
        self.add_callback(val) if self.add_callback != None else None

    def setCallback(self, func):
        self.add_callback = func

class BinEditFrame(tk.Frame):
    def __init__(self, master):
        super().__init__(master)
        self.val = 0x00
        self.bits = []
        self.add_callback = None
        for i in range(8):
            btn = tk.Button(self,text=str(i), relief='raised', command=self.callback(i))
            btn.pack(sid='right')
            self.bits.append(btn)

    def callback(self, i):
        def push():
            self.val ^= (1<<i)
            self.redraw()
            self.add_callback(self.val) if self.add_callback != None else None
        return push

    def redraw(self):
        #All Button Delete
        for bit in self.bits:
            bit.destroy()
        self.bits.clear()
            
        #All Button ReCreate
        for i in range(8):
            if (self.val & (1<<i) > 0):
                btn = tk.Button(self,text=str(i), relief='sunken',
                                command=self.callback(i) )
            else:
                btn = tk.Button(self,text=str(i), relief='raised',
                                command=self.callback(i) )
            btn.pack(sid='right')
            self.bits.append(btn)
        
        
    def setCallback(self, func):
        self.add_callback = func

    def set(self, val):
        self.val = int(val)
        self.redraw()

if __name__ == "__main__":
    print("BinHexEditor")
    win = tk.Tk()
    hx = HexSpinbox(win)
    hx.pack(side=tk.LEFT)
    be = BinEditFrame(win)
    be.pack(side=tk.LEFT)

    def callback(i):
        hx.set(i)
        be.set(i)

    hx.setCallback(callback)
    be.setCallback(callback)
        
    win.mainloop()
```
【CakePHP2.x】簡易ブログ投稿機能

今回は前回のログイン機能の実装

https://qiita.com/miyakei1225/items/1651efd1acc3afab5168

に引き続き、簡易ブログのログイン機能の実装を解説していきます。

尚、今回もCakePHP Cook bookのブログ作成チュートリアルに沿って作成を進めました。

https://book.cakephp.org/2/ja/tutorials-and-examples/blog/part-two.html

こちらも是非一読お願いします。

<h1>投稿機能(一覧、追加、編集、削除)</h1>
サブタイトルにもある通り、上の4つの機能はコントローラー部分にまとめます。
今回はSubmitsController.phpとしますが、Cookbookで記述されているように
PostsController.phpが好ましいです。(テーブルの名前にもよります)

次はコントローラーの解説をしていきたいと思います。

```PHP:SubmitsController.php
<?php
class SubmitsController extends AppController {
    //どのヘルパとコンポーネントを使用するか
	public $helpers = array('Html', 'Form', 'Flash');
	public $components = array('Flash');

	public function index() {
        //投稿一覧表示
		$this->set('submits', $this->Submit->find('all'));
	}

	public function view($id) {
        //idからユーザー、投稿を見つける　見つからなければエラー表示
		if (!$id) {
			throw new NotFoundException(__('エラーです'));
		}

		$submit = $this->Submit->findById($id);
		if (!$submit) {
			throw new NotFoundException(__('エラーです'));
		}
		$this->set('submit', $submit);
	}

	public function add() {
        //投稿機能　createでテーブル指定、saveメソッドでデータベースに保存
		if ($this->request->is('post')) {
			$this->Submit->create();
			if ($this->Submit->save($this->request->data)) {
				$this->Flash->success(__('投稿が完了しました'));
				return $this->redirect(array('action' => 'index'));
			}
			$this->Flash->error(__('投稿に失敗しました'));
		}
	}
	public function edit($id = null) {
        //編集機能　viewと同じようにidから探し、見つからなければエラー表示
		if (!$id) {
			throw new NotFoundException(__('エラーです'));
		}

		$submit = $this->Submit->findById($id);
		if (!$submit) {
			throw new NotFoundException(__('エラーです'));
		}

        //編集機能requestで送られてきたidと編集内容をsaveで保存
        //成功した場合一覧にリダイレクト、メッセージ表示
		if ($this->request->is(array('submit', 'put'))) {
			$this->Submit->id = $id;
			if ($this->Submit->save($this->request->data)) {
				$this->Flash->success(__('投稿編集が完了しました'));
				return $this->redirect(array('action' => 'index'));
			}
			$this->Flash->error(__('投稿編集に失敗しました'));
		}

		if (!$this->request->data) {
			$this->request->data = $submit;
		}
	}

	public function delete($id) {
        //削除機能get送信の場合エラーを投げかける(post送信時のみ削除可能)
		if ($this->request->is('get')) {
			throw new MethodNotAllowedException();
        }
        //post送信で送られてきたidから投稿を見つけ、削除処理
		if ($this->Submit->delete($id)) {
			$this->Flash->success(__('The submit with id: %s 削除が完了しました', h($id)));
		} else {
			$this->Flash->error(__('The submit with id: %s 削除に失敗しました', h($id)));
        }
        //削除に成功、失敗どちらの場合でも投稿一覧に移動し、メッセージ表示
		return $this->redirect(array('action' => 'index'));
	}
}
?>
```

コメントアウトした部分に処理の流れを記述しました。
以上がCakephpで作成した簡易ブログの投稿機能のコントローラー部分の解説になります！
是非参考になればと思います、お疲れ様でした。
メモ　テーブルでジャンプを設定する

ジャンプの設定
テーブルを使ったジャンプ
あらかじめジャンプ量をテーブルで設定しておく
unityで使う際はlerpを使ってなめやらかにするのがよいと思う。
float x,y;//座標
int phase;//テーブル選択管理
int
Jump_table[]={15,13,10,10,8,7,6,6,4,2,1,1,1,1,0,0,0,0,0,-1,-1,-1,-1,-2,-4,-6,-6,-16,-20,-28,-10000};

//ジャンプ
float jumpY = 0;
if (mode == 0)
{//ジャンプしていない
 if (SPACE)//スペース押した
 {
 phase = 0;//フェーズ初期化
 mode = 1;
 }
}
else
{
 jumpY = Jump_table[phase];//ジャンプ移動量
 y -= jumpY;//ジャンプ
 phase++;//フェーズを次へ
 if (Jump_table[phase] < -1000) //ありえないほどマイナスになったら終了
 {
 phase = 0;
 mode = 0;
 }
つくって終わりじゃない！継続的に開発できるポートフォリオサイトをつくる！

# これはなに

社内LTで使った発表資料です

---

# 自己紹介
![profile-image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352836/98a51c06-2ad1-113c-8319-4efb8310e2c1.png)


**ohakutsu（おはくつ）**

- 20卒の新卒エンジニア
- 青森県出身
- なまりまくり
- 最近、家系ラーメン食べてる🍜
- サウナ初心者
- 将棋

---
# できること

- Rails
- JavaScript
- TypeScript
- React

が少し出来る程度

---

# SNS

- Twitter
- Facebook
- Qiita
- サウナイキタイ

やってます

`ohakutsu`でGoogle検索すると大体出てきます
フォローしてくれると嬉しいです

---

# Yaminabe-13

---

# 本題に入ります

---

# 以前まで公開していたポートフォリオサイト

以前までのファイルをS3にあげています
http://s3-old.ohakutsu.com.s3-website-ap-northeast-1.amazonaws.com/

---

- 運用費　月100円くらい
    - いい感じ！

---

# だけど、問題点が...

---

# インフラどうやって構築したか覚えてねーよ

---

- 少し盛りましたw
- 多少は覚えてます

---

# 以前のポートフォリオサイトのインフラ図

![b6ccc7cf-1517-4d0a-1c4b-e690b57d08af.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352836/d6be8dcd-11c6-77f9-e762-7ddb8aaab1e9.png)

---

# 覚えてるのはこれだけ

---

なぜこれだと問題なのか？

↓

将来的にインフラをいじりたいってときに、詰む

↓

ゼロからつくるしかない

---

# どうすれば詰まないか？

---

![f645786e-e222-1af4-dca4-9d711c5c7f1c.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352836/6e3b1147-e2c0-9647-fcf9-eecb7dde9ccd.png)

---

インフラをコードで管理できる！

↓

あとからでも見直せる！

---

# メリットはそれだけ？

---

# んなこたぁない

---

- コピペすれば再利用ができる！
- インフラのバージョン管理ができる！

---

# 新しいポートフォリオサイト

https://ohakutsu.com/

---

# 新しいポートフォリオサイトのインフラ図

![87250217-5d744800-c49e-11ea-9bcd-93d3600c0c85.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352836/73dbd1af-2d2e-3789-47cd-96731032f00b.png)

---

# さっきお見せした以前までのポートフォリオ

---

# 実はこれもTerraformを使ってます！

---

# インフラ図

![94fedb94-d843-3f8e-88a3-e7653bdd2ba7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352836/4eb29abb-3aa4-4ca2-9d01-c9cea7935af8.png)

---

# シンプルだけど、スッとできないかも

---

### Terraformならこれだけ！

https://gist.github.com/ohakutsu/2845f2b6f60bb58f27b2df0c3f0180c3

```terraform
variable "bucket_name" {
  default = "s3-old.ohakutsu.com"
}

provider "aws" {
  region = "ap-northeast-1"
}

data "aws_iam_policy_document" "s3_policy" {
  statement {
    actions = ["s3:GetObject"]
    effect  = "Allow"
    principals {
      type        = "AWS"
      identifiers = ["*"]
    }
    resources = ["arn:aws:s3:::${var.bucket_name}/*"]
    sid       = "PublicReadGetObject"
  }
}

resource "aws_s3_bucket" "b" {
  bucket = var.bucket_name
  acl    = "private"
  policy = data.aws_iam_policy_document.s3_policy.json
  website {
    index_document = "index.html"
    error_document = "error.html"
  }
}

output "url" {
  value = aws_s3_bucket.b.website_endpoint
}
```

---

# たったこれだけです

---

# もうおわりなの？

---

# 終わりですw　なぜなら...

---

# Yaminabe-13

---

# まとめ

Terraformを使ってインフラをコードで管理
↓
一回きりのインフラをやめよう！

---

# ありがとうございました！
メモ サービスロケーターとDependency Injection

サービスロケーター　パターン
依存関係を　解決しに行く　手法
public class ServiceLocator
{
	private Dictionary<Type,object> container = new Directionary<Type,object>(1);//GCAllocがおこらないようにある程度のキャパシティをはじめから確保しておく
	public T Resolve<T>()
	{
		return (T)container[typeOf(t)];
	}
	
	public void Register<T>(T instance)
	{
		container.Add(typeOf(T),instance);
	}
}
依存性の注入
Dependency Injection
依存するオブジェクトを注入するパターン
DIContinerというものがあり、依存関係を設定しておくと、それに応じて自動的にインスタンスを設定して回ってくれるオブジェクトです。
zenjectでのインスタンスプレハブをDIcontinerを使う方法
Factoryを経由してインスタンスを生成する
例
class MoveFactory:PlaceholderFactory<Mover>//継承してクリエイトできるようにする
{
	//経由するためのものなのでからでもよい
	//マーカー的な感じ
}
public class UnityTestInstaller:MonoInstaller<UnityTestInstaller>
{
	GameObject prefab;
	
	public override void InstallBinding()
	{
		Continer
			.BindFactory<Mover,MoverFactory>()
			.FromCompenentInNewPrefab(prefab);
	}
}

使う際は
public class MoveGene:MonoBehaviour
{
	[inject] private MoveFactory factory;
	
	void Start()
	{
		factory.Create();//生成
	}
}

DIcontinerを直接使って生成する場合

public class MoverGenerator: MonoBehaviour
{
    private GameObject MoverPrefab;

    [Inject] private DiContainer container;//コンテナを取得

    void Start()
    {
        // Containerから直接生成する
        container.InstantiatePrefab(MoverPrefab);



	
	var go = Instantiate(MovePrefab);
	//AddComponentみたいな使い方もできる
	container.InstantiateComponent<Mover>(go);
    }
}
Nutanix Moveのバージョンアップ　その②

#はじめに

以前、Nutanix Moveのバージョンアップについての[記事](https://qiita.com/matotoon/items/a290a1a10bae868e86d8)を書いたのですが、その際はOfflineイメージを使用してバージョンアップする手順を紹介しました。
Moveの新しいバージョンがリリースされたこともあり、久々にバージョンアップをしようと画面を起動したところ、Onlineで自動取得したアップデートファイルを使ってバージョンアップができることに気づき、すぐに試してみました。
その時の内容をログとして記録しておこうと思います。

#環境
元々使用していたNutanix Moveのバージョン
3.5.1

更新後のバージョン
3.6.0

#バージョンアップ作業
①Nutanix Moveにログインして、管理画面を開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111342/9c95fa4d-2c88-e088-812a-2a902ee45cc1.png)

②画面左上のNow Update Availableを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111342/a0ac5d4c-7a80-2115-cbbd-6343f3d06d71.png)

③[Upgrade]ボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111342/54775885-8aa6-fba2-311e-630e5b5359e5.png)

④Upgradeタスクが進みます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111342/f29d7751-883b-a84e-ab3d-9248e4415c75.png)

⑤完了するとMoveの管理画面にログインしなおすように要求されるので、ログインしなおします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111342/bc0634bb-80aa-68ec-13d6-ebc98d975d76.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111342/7ced6134-3e83-974b-f127-032513800f76.png)

⑥License Agreementに同意をして、[Continue]を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111342/c17357b1-2679-4dd8-f4f1-f4ac3579a461.png)

⑦再び管理画面が表示されますが、バージョンアップされたかバージョンを確認してみましょう。画面右上のNutanixの文字を押し、メニューからAbout Moveを押してバージョンを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111342/e496dc8d-815d-3762-f3be-93c244255091.png)

バージョンが最新バージョン(2020年7月17日時点)に更新されていることが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111342/08eaf2b5-53ba-7ac9-f051-6b277b23b7eb.png)

すぐに気づくと思いますが、管理画面の左上に表示されていたNow Update Availableという項目も消え、Updateできるバージョンがないことが分かります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111342/67da9105-d710-785d-c837-ff8a60d7d514.png)

#おわりに
今私が使っている環境はNutanix Moveがインターネットに出れる環境にありますが、Updateファイルを自動で取得してこれだけ簡単にバージョンアップできてしまうというのは、実にありがたい話と言えると思います。
新しいバージョンがリリースされたことを知って、15分後くらいにはバージョンアップを終えていましたから、どれだけ簡単にバージョンアップができるかはお分かりいただけるんじゃないでしょうか。
VHDL備忘録

#はじめに
いつの間にか知っていたけれど、
あまり説明されない記述をまとめています。

# ビット列に区切り文字

VHDLでは進数を明示すれば区切り文字として`_`が使えます。

```vhdl
constant a : std_logic_vector(9 downto 0) := "11_0010_0001"; -- illegal
constant b : std_logic_vector(9 downto 0) := B"11_0010_0001";
```

# aggregate

全てのビットの値を指定する時に`others`をよく使いますが、
一部のビットだけを別の値に指定することができます。

```vhdl
constant data_bits : natural := 8;
constant unsigned_max : unsigned(data_bits - 1 downto 0) := (others => '1');
constant signed_max   : signed(data_bits - 1 downto 0) := (data_bits - 1 => '0', others => '1');
```

# オーバーロード
VHDLのsubprogramではオーバーロードを使うことができます

例えば、自作の`record_type`型の値をチェックする
Vunitの`check_equal`にオーバーロードした`procedure`を作ることで
テストコードの見通しがよくなります。

```vhdl
library vunit_lib;
context vunit_lib.vunit_context;
library ieee;
use ieee.std_logic_1164.all;

entity tb_sample is
    generic (
        runner_cfg : string := runner_cfg_default
    );
end tb_sample;

architecture behavior of tb_sample is

    type record_type is record
        address : std_logic_vector(7 downto 0);
        data : std_logic_vector(15 downto 0);
    end record;

    constant A : record_type := {
        address => (others => '0'),
        data => (others => '0')
    };

    constant B : record_type := {
        address => (others => '0'),
        data => (others => '1')
    };

    -- overload
    procedure check_equal(
        constant got      : in record_type;
        constant expected : in record_type;
        constant msg      : in string
    ) is
    begin
        check_equal(got.address, expected.address, "address : " & msg);
        check_equal(got.data, expected.data, "data : " & msg);
    end;

begin

    test_bench : process
    begin
        test_runner_setup(runner, runner_cfg);
        while test_suite loop
            if run("test") then
                    check_equal('1', '0', "std_logic error");
                    check_equal(A, B, "record_type error"); -- overload
            end if;
        end loop;
        test_runner_cleanup(runner);
    end process;

end;
```

# wait until

`wait until`はイベント発生時(値が変化した時)にチェックされるので、
以下のように最初から条件を満たしている場合は待ち続けることになります。

```vhdl
a <= '0';
wait until a ='0';
b <= '0';
```

対策としては以下の2パターンがあります。

1. 逆条件をチェックしてから待つ
2. 適当なクロックと合わせて待つ

```vhdl:1
if a /= '0' then
    wait until a ='0';
end if;
```

```vhdl:2
    wait until rising_edge(clk) and a ='0';
```
Google Chrome DevTools の JavaScriptエラーデバッグ

JavaScriptの処理が思うようにいかない時、エラーに対して一つ一つを`console.log`で調べていたらあっと言う間に時間を溶かしてしまいます。

今回は自身の学習として、GoogleのToolsドキュメントを参考にデバッグをやってみました。

## バグの再現

参考動画と同じ環境を用意します。
`command(⌘) + option(⌥) + i` でDevToolを開いてソースコードを確認します。

![Screen Shot 0032-07-17 at 5.32.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482880/2ba2cbfd-9399-f087-b397-6496ea5bf181.png)

`Sources`の中から、JavaScriptファイルを確認。
現時点では、1 + 1 = 11　でバグってます。

今回は、クリックを起点に発火するイベントなので、`Event Listener Breakpoints`の`click`を選択した状態で`command(⌘) + R`でページを更新します。

![Screen Shot 0032-07-17 at 5.46.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482880/fa8085dc-0cac-c194-5388-ac4691017e45.png)

するとクリックで起動するfunctionがハイライトされ、一行ずつ実行しながら確かめることができるようになります。
`Step over next function call`を押すと、一行ずつ順番にコードを実行できます。

### ブレークポイントの活用
フレーム内の行数をクリックすると、ブレークポイントが設定できます。ブレークポイントを設定した状態で実行すると、代入された変数の値や、演算処理の結果を`console.log`を使わずに見ることができます。
 
![Screen Shot 0032-07-17 at 5.59.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482880/766c417e-f76b-8dc7-b8a9-2a4544298cf9.png)
上記の例の場合、この結果から`append1`と`append2`に代入された値が文字列型になっていることがバグの原因とわかります。

### Scope
スコープ内の状態は`Scope`を確認します。`Scope`には、実行コンテキストの情報がある場合のみ表示されます。

![Screen Shot 0032-07-17 at 13.12.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482880/801a124f-08b0-293e-f88c-30c35ff1f754.png)

### Watch Expressions

`Watch Expressions`は、`+`をクリックしてjavascriptを入力することで任意の情報を取得できます。
![Screen Shot 0032-07-17 at 13.15.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482880/c470243b-b53e-8217-c66f-fb94800390f6.png)

int型であるべき値が、String型になっていることが確認できます。

### 修正
Dev Tools上でバグを確認したら、そのまま修正・実行を行うことができます。

1. `Resume script execution` をクリックします。

2. `Code Editor`上で該当箇所を修正します。

3. command(⌘) + s で保存します。

4. `Deactivate breakpoints`をクリックします。

## 参考
[Chrome DevTools](https://developers.google.com/web/tools/chrome-devtools/javascript/)
[Youtube](https://www.youtube.com/watch?v=H0XScE08hy8)
GPL2+とかGPL3+ってなに？

# はじめに

リッチテキストエディタの[CKEditor](https://ckeditor.com/)を使う場合のライセンスについて調べてみた。

CKEditor4は、GPL、LGPL、MPLのトリプルライセンスになっていて、CKEditorを組み込んだ人が自由に選択できるようになっている。
https://ckeditor.com/docs/ckeditor4/latest/guide/dev_license.html

まぁ、GPLやLGPL、MPLは調べればズバリのサイトが見つかるのでわかる。

問題は、CKEditor5のライセンスがGPL2+となっている。
https://ckeditor.com/wysiwyg-editor-open-source/

GPL2+というのが俗語なのか、GPLのサイトにも書かれていないし、検索しても中々、スバリという説明がなかった。

調べてみたので、そのためのメモ書きです。

# TL;DR

GPL2+というのは、<code>GPLv2または、それ以降のライセンスから選んでね</code>ってことらしいです。
つまり、GPL2+の場合は、GPLv2、またはGPLv3から選べるってことみたいです。

GPL3+の場合は、GPLv3または、それ以降のライセンスと言う意味らしいです。


# 判断の根拠と参考文献

## [GPL2+ or GPLv2 license?](https://answers.launchpad.net/rohc/+question/213695)

こちらの説明でGPL2+はGPLv2以降のことだよって記載されています。

## [GPLv2+ vs. GPLv3+ licensing for FGAddon.](https://forum.flightgear.org/viewtopic.php?t=33605)

FlightGearというオープンソースのゲームのアドオンのライセンスについて話し合いです。

## [Is it legal to fork “gpl 2 or later” software and make “gpl 2 only” changes](https://opensource.stackexchange.com/questions/7993/is-it-legal-to-fork-gpl-2-or-later-software-and-make-gpl-2-only-changes)

GPLv2以降というライセンスをGPL2のみに変更するという話。
GPLv2 or LaterをGPL2+という風に表現されている。