OmniAICreator/Qiita-1.07M huggingface dataset:
[Arduino] Arduino IDE 2.0 Beta 5 

Arduino IDE 2.0は今ベター５になりました。

## 2.0.0-beta.5

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137182/06af190d-c0ce-25b8-4637-05657758e542.png)



## Updated to 2.0.0-beta.5. [2a55ddd]

- [dev]: Fixed the launch config. [3240bf7]
- Workarond for arduino/arduino-cli#1262. [0d0ad9e]
- ATL-786: Progress indication for install. [9aff90b]
- Updated to the 0.18.1 CLI. [8071298]
- ATL-1206: Reuse selected board for new sketches. [c86d82d]
- ATL-1207: Open editor if file was added to sketch. [fa9334e]
- GH-297: Fixed the open from Sketchbook handler. [c50d45c]
- Notify user if platform/lib install was successful [c20f832]
- ATL-1195: Show all libraries if no board selected. [cb2ef78]
- ATL-1195: Show examples if no board is selected. [68af4c3]
- ATL-1145: Suppress error if Git is not on $PATH. [a8df244]
- ATL-1151: settings panel to reflect actual state [d45dd6b]
- ATL-970: notifications should last longer [1ab5634]
- ATL-988: Aligned the hover size to the expression. [80bddc2]
- ATL-1068: Escape ampersand in the menu label. [8a692d0]
- Can edit user-storage files. E.g.: keymaps.json. [9867122]
- Fixed bug when no 3rd party URLs are defined. [f106c97]
- Update index after modifying the 3rd party URLs. [369a8f4]
- Removed the min window height and width. [4e7f829]
- ATL-1137: Show error when could not connect to CLI [26a1db3]
- ATL-1128: make the new tab button easier to click [a3f7b79]
- chore: update CLI version, gRPC and bit of documentation [b422fc5]
- GH-259: Use Ubuntu 18.04 for the build job. [ab320eb]
- ATL-1136: Add .adoc and .md file support [b17b7a6]
- Add keymaps customization support [562b77a]
- ATL-1150: Bumped the cortex-debug to 0.3.10. [cdd5cfd]
- ATL-1106: Made all non-workspace editors read-only. [f712ec9]
- Update development documentation to reflect change in workflow artifacts -[c75b954]
- Delete job transfer workflow artifact [3fb087f]
- Create separate tester artifacts for each build [2729277]
- Don't use magic string for job transfer artifact name [da424f3]
Typescriptの関数について　その3

#Typescriptの関数
```
//　関数
function greet(name: string = 'hogesaki'): void{
  console.log(`Hello world! ${name}`);
}

//可変長引数
function sum(...values: number[]): number{
   return values.reduce(function(prev,current){
      return prev + current;
   });
}

//アロー関数
//記述の仕方 () => { }
//シンプルに定義できる

let add = (x1: number, x2: number): number => {
  return x1 + x2;
};
console.log(add(1,3));

let hello = (name: string) => {
  return `Hello, ${name}!`;
};
//以下のように省略できる
let hello = name => `Hello, ${name}!`;
console.log(hello('hogesaki'));

//アロー関数最大の特徴は内部で参照できるthisの扱い
//function と () =>でthisの扱いが違う

//functionの場合
document.getElementById('button1').addEventListener('click', function(){
  console.log(this);  //<button></button>が参照できる
})

//() => の場合
document.getElementById('button1').addEventListener('click', () => {
  console.log(this);  //Window
})
```
【備忘録】①アイテム、アイテムボックスの実装【3D脱出ゲーム制作】

【内容】
・オブジェクトのクリック判定実装
・アイテムの実装
・アイテムボックスの実装


【オブジェクトのクリック判定実装】
今回、クリックしたらアイテムボックスへ取得されるアイテムの実装を行う。
上記アイテムを実装するには、以下のものが必要

①Event Trigger
 ・ヒエラルキーに追加したアイテム内にコンポーネントとして追加するもの
 ・追加したアイテムに対して、どのような動作をするか設定できる

②Physics Raycaster
 ・メインカメラにコンポーネントとして追加
 ・アイテムに対してレーザー的なものを当てて、判定するもの

③Event System
 ・ヒエラルキーにUIから追加するもの
 ・とりあえず必要なものと認識 要調査

④クリック判定のスクリプト(ヒエラルキーのアイテムにそれぞれD&Dで追加)
 ・今回は、クリックをしたらアイテムボックスへ格納されるというスクリプトを作成(以下)
 ・下記スクリプトにより、クリックしたら後述する「Item.cs」と「ItemBox.cs」を動作させる形で記載

```PickUpObj.cs
public class PickUpObj : MonoBehaviour
{
    [SerializeField] Item.Type item;
    //クリックしたら消す
    public void OnClickObj() 
    {
        /*クリックされたらItemBox.csが動作、
　　　　　 アイテムが消え、ItemBoxへ格納される動きになる*/
        ItemBox.instance.SetItem(item);
        gameObject.SetActive(false);
    }
}
```


【アイテムの実装】
①アイテムの列挙スクリプト
 ・アイテム自体は、あくまでプレイヤーが手に入れた「情報」として保持すればよいので、
　 MonoBehaviourは不要

```Item.cs
public class Item
{
    //列挙型：種類を列挙
    public enum Type 
    {
        Cube,
        Ball,
    }

}
```

【アイテムボックスの実装】
①パネル
 ・ヒエラルキーにUIから追加
 ・コンポーネントHorizontal Layout Groupを追加(のちに追加する枠の位置関係をこれで調整)

②アイテムが表示される枠
 ・ヒエラルキーにUIからイメージを追加

③ItemBoxのスクリプト

```ItemBox.cs
public class ItemBox : MonoBehaviour
{
    //ItemBoxをOnClickObjで実行するためにstaticなインスタンス
    public static ItemBox instance;
    private void Awake()
    {
        if (instance == null) 
        {
            instance = this;
        }
    }

    /*PickUpObjがクリックされたら、スロットにアイテムを入れる
　　public static ItemBox instanceでどこからでも引っ張れる
    PickUpObj.csへ持っていける*/
    public void SetItem(Item.Type type) 
    {
        Debug.Log(type);
    }
}
```
computedプロパティ


```vuejs
<body>
  <script src="https://cdn.jsdelivr.net/npm/vue@2.6.12/dist/vue.js"></script>
  <div id="app">
    <p>{{ counter }}</p>
    <button @click="counter += 1">+1</button>
    <p>{{ counter > 3 ? '3以上' : '3以下'}}</p>
</div>
<script>
  new Vue({
    el: '#app',
    data: {
     counter: 0
    }
  })
</script>
</body>
```

三項演算子・・・ifを用いない条件分岐の書き方
if文でブロックを分けたくない場合に、コンパクトに条件分岐を書くことができるとても便利な構文です。

```
条件式 ? 条件がtrueの場合の処理 : 条件がfalseの場合の処理
```

#####（重要）
####Vueインスタンス内のデータには初期値となるデータしかかけない。動的なデータは扱えません。

そこで

computedプロパティ
-

```vuejs
<body>
  <script src="https://cdn.jsdelivr.net/npm/vue@2.6.12/dist/vue.js"></script>
  <div id="app">
    <p>{{ counter }}</p>
    <button @click="counter += 1">+1</button>
    <p>{{ lessThanThree }}</p>
</div>
<script>
  new Vue({
    el: '#app',
    data: {
     counter: 0
    },
    computed: {
      lessThanThree: function() {
        return this.counter > 3 ? '3以上' : '3以下'
      }
    }
  })
</script>
</body>
```

同じように表現できました。

![20210505-190058.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960935/5d572d66-9820-4e68-380c-c830f6c8d393.png)
おもしろデータセットメモ

いつか使うかも?しれないデータセットのメモです。
商用不可が多いですが、自己学習でタイタニックや Iris に飽きた方へ。 
随時更新します。

#### 主な更新
2021-12-19 駅データ.jp, Open-Meteo を追加
2022-06-13 人間の 3D モーションデータを追加

#### データセットへのリンク

* トマトのデータセット
成熟度別のトマト画像。セグメンテーションでの利用を想定。
https://laboro.ai/activity/column/engineer/laboro-tomato/

* スピードデートの実験
４分間デートの結果、また会いたいかどうか、属性ごとのデートの評価。
https://www.kaggle.com/annavictoria/speed-dating-experiment/home

* 駄洒落データベース
67,000件の駄洒落文を収録。
http://arakilab.media.eng.hokudai.ac.jp/~araki/dajare.htm

* Manga109
漫画の画像とフキダシやキャラクターなどのアノテーションデータ。
http://www.manga109.org/ja/index.html

* プロ野球球団 楽天イーグルスのデータ。
https://subscription.eagles.rakuten.co.jp/service/download/mania/

* 駅データ.jp　路線と駅のデータ。無料だが会員登録が必要。
https://ekidata.jp/

* Open-Meteo　天気予報API。Hourly 7-day forecast worldwide とのこと。
https://open-meteo.com/en

* 株式会社バンダイナムコ研究所 人間の 3D モーションデータ。
https://github.com/BandaiNamcoResearchInc/Bandai-Namco-Research-Motiondataset/blob/master/README_Japanese.md


#### 情報源

* 楽しみながら学ぶサンプルデータセット
https://knowledge-ja.domo.com/Training/Self-Service_Training/Onboarding_Resources/Fun_Sample_Datasets

* 顔画像データセット
https://deepblue-ts.co.jp/%E7%94%BB%E5%83%8F%E5%87%A6%E7%90%86/%E9%A1%94%E7%94%BB%E5%83%8F%E3%83%87%E3%83%BC%E3%82%BF%E3%82%BB%E3%83%83%E3%83%88/

* APIキーもログインも不要！完全無料で使える天気予報API「Open-Meteo」を使ってみた！
https://paiza.hatenablog.com/entry/2021/11/04/130000

* バンナム、約42万フレーム分のモーションデータ無償公開　歩行、格闘、ダンスなど　研究用に
https://www.itmedia.co.jp/news/articles/2204/28/news118.html?utm_source=pocket_mylist
RDSについてのまとめ

##RDSとは
AWSで使える高機能なリレーショナルデータベースです。
EC2にデータベースの高度な機能がついたもので、基本的にリレーショナルデータベースはRDSがおすすめです。
EC2自体にデータベースを構築することも可能ですが、RDSを使うことで、より簡単に高機能なデータベースを使うことができます。

##RDSで使えるデータベース
|データベース一覧|
|-|
|MySQL|
|Oracle DB|
|SQL Server|
|PostgreSQL|
|MariaDB|
|Amazon Aurora|

##RDSの機能
###リードレプリカ
リードレプリカとはレプリケーション（同じデータを複数作成）された読み込み専用のデータベースのことです。
同じデータが複数存在するためデータの安全性が高まるほか、データベースひとつにかかる負荷を分散させることができます。

###自動スナップショット
スナップショットとは差分式のバックアップのことで、RDSではスナップショットでバックアップを自動で取得してくれます。

###自動パッチ
パッチとはプログラムの機能追加などのバージョンアップのことです。
RDSは、データベースを強化するソフトウェアのパッチ適用などの作業が自動化されます。
これによりバージョンアップを手動で行わなくても自動でやってくれます。

###暗号化
暗号化をすることが可能です。
暗号化することによりRDSのデータを安全に保管することができます。
CloudWatch Logs のメトリクスフィルターで複雑な条件の設定方法

## AWS CloudWatch Logsのメトリクスフィルターの基本操作
1. ANDパターンマッチング
スペース区切りでキーワードを入力する。
ちなみに、大文字小文字の区別があるので両方フィルタリングしたい場合は、大文字小文字表記を両方のせる。
ex)
フィルター： `ERROR request`
フィルタリング結果：
`[ERROR] Unable to continue: Failed to process the request`

2. ORパターンマッチング
スペース区切りでキーワードの頭に`?`を入力する。
ex)
フィルター： `?ERROR ?WARN ?message`
フィルタリング結果：
`[ERROR] Unable to continue: Failed to process the request`
`[WARN] Failed to process the request`

3. NOTパターンマッチング
スペース区切りでキーワードの頭に`-`を入力する。
ex)
フィルター： `ERROR -WARN`
フィルタリング結果：
`[ERROR] Unable to continue: Failed to process the request`

⇒しかし、JSON形式のlogなどでの複雑なパターンはこの組み合わせでは表現できない。
## 複雑な条件の設定方法
```
[( a="*error*" || a="*fail*" ) && ( a!="*hoge*" && a!="*fuga*" )]
```
のような形で複雑なフィルタパターンを表現できる。
JSON形式の場合は、`$.{変数名} = "Content"`
のような形にすることで、要素ごとのフィルタリングも可能。
atom+latexでpdfが見れないときの対処法

私は普段atomでlatex環境を構築し, それを愛用しています.
ややこしいコンパイルも`Ctrl + Alt + B`で簡単に実行できるので非常に便利です.
また, `pdf-view`を使えばエディタ内でコンパイルされたpdfファイルを見ることもできるのでとても重宝しています.

ある日, 私はいつも通り`Ctrl + Alt + B`でコンパイルをしました.
すると`pdf-view`が起動はするのだがpdfファイルは表示されず, 見れなかったのです.
どうしたものか.

原因を探っていると, twitter上に, 最新版のatomでは同じような状況になるというtweetがいくらかあったため, 即刻atomの自動更新機能を切って[こちら](https://atom.io/releases)からバージョンダウンを試みました.
すると見事に解決しました.

普段texを使う必要がある方で, 同じような状況になった方は一度試していただきたいと思い, この記事を書きました.
【AWS】VPC外部接続と設計のポイント

#プログラミング勉強日記
2021年5月5日

#VPC外部接続
　VPCの外側にあるEC2などの各種サービスとの通信には、パブリックのAWSネットワークとエンドポイントを利用する2つの方法がある。

　インターネットの経路を設定する方法としては、ルートテーブルとCIDRアドレスでルーティングを設定する。ルートテーブルでパケットの行き先を設定し、VPC内はCIDRアドレスでルーティングする。(VPC作成時にはデフォルトで1つルートテーブルが作成される)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642821/71310a76-cb35-f19c-2148-3d2173874239.png)

#VPCの設計ポイント

- 設計時には今後の拡張も考えたアドレッシングや他のネットワークの接続性を考える
- CIDR(IPアドレス)は既存のVPCなどと被らないアドレスを考慮し、システム構成の将来像も考えながら計画する
- VPC構成は業務に合わせたVPC単体ではなくVPC全体の関係性も考える
- 複数のAZを利用して可用性の高いシステムを構築する
- サブネットは大きいサブネットを使って、パブリック・プライベートサブネットへのリソースの配置をインターネット悪エス可否から検討する
- セキュリティグループを使ってリソース間のトラフィックを制御する
- 実装や運用を補助するツールも利用する(VPC Flow Logsなど)
C#でURLを既定のブラウザで開く

#ネットで検索すると出てくる動かない例

```C#:MainForm.cs
/// <summary>
/// 「Googleを開く」ボタン「Click」イベント
/// </summary>
/// <param name="sender">sender</param>
/// <param name="e">EventArgs</param>
private void btnOpenGoogle_Click(object sender, EventArgs e)
{
    string url = "https://www.google.co.jp";
    OpenUrl(url);
}

/// <summary>
/// URLを既定のブラウザで開く
/// </summary>
/// <param name="url">URL</param>
/// <returns>Process</returns>
private Process OpenUrl(string url)
{
    return Process.Start(url);
}
```

##下記のエラーが発生します。
「System.ComponentModel.Win32Exception: '指定されたファイルが見つかりません。'」
![キャプチャ.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229681/1acb52e6-da7c-6939-4764-98dc829aa68c.jpeg)

#正しく動く例
```C#:MainForm.cs
/// <summary>
/// URLを既定のブラウザで開く
/// </summary>
/// <param name="url">URL</param>
/// <returns>Process</returns>
private Process OpenUrl(string url)
{
    ProcessStartInfo pi = new ProcessStartInfo()
    {
        FileName = url,
        UseShellExecute = true,
    };

    return Process.Start(pi);
}
```

#ポイント
Process.Startメソッドの引数にURLを直接渡すのではなく、ProcessStartInfoのインスタンスを渡す。
その際、ProcessStartInfoのUseShellExecuteプロパティにtrueを設定する。

#感想
ツールを作成していた際などに毎回はまるので記事にしました。

#宣伝
メイドカフェマップ for Android
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229681/0d7b86ef-9142-6ae7-6543-fe4349706bf9.png" alt="アイコン" title="アイコン" width="250">
元メイドさんと一緒に作った～[メイドカフェマップ for Android](https://play.google.com/store/apps/details?id=com.tsukasa_labz.android.maidcafemap&hl=ja)を公開しています。
インストールして頂いて評価やコメントを頂けると喜びます:relaxed:
メイドカフェマップ アプリ内からツイートできる機能がありますので、そちらをして頂くとさらに喜びます:heart_eyes:

その他にも[Wikipediaの寄付依頼をブロックするアドオン](https://qiita.com/tsukasa_labz/items/a3166d481426e2297848)を公開しています。
<br>
v-model

１）Vueインスタンス内にあるデータを読み込んでいる。
２）フォーム内に打ち込んだ文字も受け取ってくれる
＊データ内のmessage内容は変更されない「こんにちは」のまま。



![20210505-183342.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960935/2674d870-d54b-e917-6bc4-0fd9cd610a54.png)

```vuejs
<body>
  <script src="https://cdn.jsdelivr.net/npm/vue@2.6.12/dist/vue.js"></script>
  <div id="app">
     <input type="text" v-model="message">
</div>
<script>
  new Vue({
    el: '#app',
    data: {
     message: 'こんにちは'
    }
  })
</script>
</body>
```


さらにmessageを表示する行を追加してみてみると

```vuejs
<body>
  <script src="https://cdn.jsdelivr.net/npm/vue@2.6.12/dist/vue.js"></script>
  <div id="app">
     <input type="text" v-model="message">
     <h1>{{ message }}</h1>
</div>
<script>
  new Vue({
    el: '#app',
    data: {
     message: 'こんにちは'
    }
  })
</script>
</body>
```
インプットフォーマットに一込んだ先から次々とメッセージの中身が変わるこことになります。
＊データ内のmessage内容は変更されない「こんにちは」のまま。
作成したEC2インスタンスにアクセスするコマンドを読み解き、エラー対応をする

## 前提知識
#### EC2とは？
AWSが提供している仮想サーバーを作成できるサービス。
Amazon Elastic Compute Cloudの略でAmazon EC2やEC2と呼ばれる。
このサービスで作成された各サーバーの事を**インスタンス**と呼ぶ
#### SSHとは？
Secure Shellの略で、安全にリモートコンピューターと通信するためのプロトコルをいいます。
通信全てが暗号化されています。

## 読み解くコマンド
```
$ ssh -i XXX.pem ec2-user@XXX.XXX.XXX.XXX
```

## 発生したエラー
```
Warning: Identity file XXX.pem not accessible: No such file or directory.
ec2-user@XXX.XXX.XXX.XXX: Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
```

## 解読
まず何をしようといているかですが、「AWSサービスの一つEC2で作成したインスタンスにアクセスする」という行為を行おうとしています。
そのためにSSHというプロトコルを使ってインスタンスにアクセスしようとしたがエラーを吐いているという状態です。
まず実行コマンドですが、**-i XXX.pem**は事前にインスタンス作成時に設定しダウンロードしたキーペアファイルを参照しています。
そして**ec2-user@XXX.XXX.XXX.XXX**はアクセスするユーザー名とアクセス先のIPアドレスです。
つまりコマンドとエラーを解読すると
**「SSHという機能を使って、作成したEC2インスタンス（IPアドレス XXX.XXX.XXX.XXX）にpemの中にあるXXXという鍵を使ってアクセスします」**としたが**「現在のディレクトリにそんな名前のファイルはありません、だからec-2user〜のアクセスは拒否されました」**といった感じになります。

## 解決
上記の通り、認証するための鍵がディレクトリにないのだから鍵を絶対パスで指定すれば通ります。

```
$ ssh -i ~/鍵ファイルのあるディレクトリ/XXX.pem ec-2uer@XXX.XXX.XXX.XXX
```
Typescriptについて　その2

#Typescriptの変数

```
//let
let foo = 'foo';
let date = new Date();

varとletの違い
①ブロックスコープの影響範囲に違いがある
if (true){
  var foo = 'foo';  //ブロックの外でも有効。console.logで表示できる
  let foo = 'foo';  //ブロックの中でしか有効にならない
}
console.log(foo);

②varは変数が巻き上げられるが、letは変数が巻き上げが起こらない
```
#Typescriptの定数
```
//定数(一度入れたら変更できないデータの箱のこと) 
年数、消費税率、決まり切ったデータなどきちんと名前をつけて保存するとわかりやすいものとなる。
const currentYear: number = 2020;

const PI = Math.PI; (ショートハンドで書くことができる)
```
#Typescriptのテンプレート文字列

```
//テンプレート文字列
①改行しても、改行したまま出力される
let template１ = 
`
  This 
  is 
  Template strings.
`;
②${}で変数を埋め込める
let name = 'hogeta hogekiyo' 
${name}.   //出力結果　hogeta hogekiyo
```
##Typescriptのスプレッド演算子
```
let categories = ['post','news', 'info'] 
...categoriesと記述する

//複製
let copyCat = [...categories];　// 'post','news', 'info'が展開されているイメージ

//連結
let pushCat = ['other', ...categories];

//二つの連結をマージ
let mergeCat = [...categories, ...copyCat];

//オブジェクト
let post = {id: 1, content: 'dummy', created: '2020-04-01'};

let copyObj = { ...post };

```
#Typescriptの分割代入
//分割代入(データの中の任意の値を取り出して、新しい変数にセットできる仕組み)

```
let categories = ['post','news', 'info', 'other']

let [a,b] = categories;  //aにはpost,bにはnewsが割り当てられる
let [a,b, ,d] = categories;  //空欄にするとinfoはスキップされる
let [a,b, ...rest] = categories; //infoとotherはrestにまとめられる
```
コマンドラインから Chrome のクッキーを読み取って表示

コマンドラインから Chrome のクッキーを読み取って表示します。

さくっと試して見たい方はこちら（ sqlite3 のインストールのためパスワードを聞かれる場合があります）。

````bash
wget https://raw.githubusercontent.com/mugimugi555/ubuntu/main/mix_print_coockie.sh && bash mix_print_coockie.sh ;
````

シェルファイルの後ろにドメインを付けると絞り込みができます。サブドメインを含めたい場合は %google.com にします。

````bash
bash mix_print_coockie.sh google.com ;
bash mix_print_coockie.sh %google.com ;
````

####中身の紹介

sqlite3 を使用しますので、事前にインストールを行っておきます。

````bash
sudo apt install -y sqlite3 ;
````

実行

````bash
bash print_coockie.sh ;
bash print_coockie.sh google.com ;
````

シェルの内容

````bash:print_coockie.sh
#!/bin/bash

# bash print_coockie.sh
# bash print_coockie.sh google.com

# coockie path
CHROME="${HOME}/.config/google-chrome/Default"
COOKIES="$CHROME/Cookies"

# query
# QUERY='select * from cookies'
QUERY='select host_key, path, expires_utc, name, encrypted_value from cookies'

# coloums
# creation_utc INTEGER NOT NULL
# host_key TEXT NOT NULL
# name TEXT NOT NULL
# value TEXT NOT NULL
# path TEXT NOT NULL
# expires_utc INTEGER NOT NULL
# is_secure INTEGER NOT NULL
# is_httponly INTEGER NOT NULL
# last_access_utc INTEGER NOT NULL
# has_expires INTEGER NOT NULL DEFAULT 1
# is_persistent INTEGER NOT NULL DEFAULT 1
# priority INTEGER NOT NULL DEFAULT 1
# encrypted_value BLOB DEFAULT ''
# samesite INTEGER NOT NULL DEFAULT -1

# query where
if [[ $# == 1 ]]; then
    domain=$1
    QUERY="$QUERY where host_key like '$domain'"
fi

# print result
sqlite3 -separator '	' "${COOKIES:-Cookies}" "$QUERY"
````

ただし、クッキーの値が encrypted_value とあるように暗号化されています。
これを解除する必要があります。

詳細は参考リンクを見てください。気が向いたらそのうち実装してみたいと思います。
####参考リンク
- [export\-chrome\-cookie\.sh](https://gist.github.com/hupili/9825148)
- [Google ChromeのCookieをSQLite3で見てみた \- rohaniのブログ](https://rohani.hatenablog.com/entry/2019/09/19/130515)
- [Cookieについて調べてみた \| エクスチュア総合研究所](http://exture-ri.com/2016/02/29/cookie%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6%E8%AA%BF%E3%81%B9%E3%81%A6%E3%81%BF%E3%81%9F/)
V-onディレクティブを動的に表現


```vuejs
<body>
  <script src="https://cdn.jsdelivr.net/npm/vue@2.6.12/dist/vue.js"></script>
  <div id="app">
     <p>現在{{ number }}回クリックされています</p>
     <button v-on:[event]=countUp>カウントアップ</button>>
</div>
<script>
  new Vue({
    el: '#app',
    data: {
      number: 0,
      event: 'click'
    },
    methods: {
      countUp: function() {
        this.number += 1;
      }
    }
  })
</script>
</body>
```

![20210505-130744.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960935/2333d30e-fd80-6565-4588-f4dde077cd5b.png)

```vuejs:省略記法１
<button @[event]=countUp>カウントアップ</button>>
```

```vuejs:省略記法２
<button @click=countUp>カウントアップ</button>>
```

```
    data: {
      number: 0,
      event: 'click'
    },
```
データ内のevent: 'click'は消してください。
swift いろんなプロパティについて整理する

# 0.はじめに
swiftにはプロパティといってもたくさんのプロパティがあるため、整理してみようと思います。
# 1.プロパティの分類
プロパティの分類には2通りの分け方があります。
### プロパティが紐づく対象による分類
・インスタンスプロパティ
・スタティックプロパティ
・クラスプロパティ
### 値を保持するかどうかによる分類
・ストアドプロパティ
・コンピューテッドプロパティ

このようにプロパティの分類には2通りの分け方があり、それぞれ３個、２個の分類があります。
# 2. プロパティが紐づく対象による分類

### インスタンスプロパティ

```swift
struct Animal {
    var name:String = "ライオン"
}

var lion = Animal()

print(lion.name) // ライオン
print(Animal.name) //　エラー
```
その名の通り、インスタンスに紐づくプロパティです。
インスタンスからはアクセスできますが、クラスからはアクセス出来ません。

### スタティックプロパティ
```swift
struct Animal {
    static var needOxygen: Bool = true
}

var lion = Animal()

print(lion.needOxygen) // エラー
print(Animal.needOxygen) //　true
```
クラスに紐づくプロパティです。
クラスからはアクセスできますが、インスタンスからはアクセスすることが出来ません。

### クラスプロパティ

```swift:
class Animal {
    class var needOxygen: Bool {
        get { return true }
    }
}

var lion = Animal()

print(lion.needOxygen) // エラー
print(Animal.needOxygen) //　true

```
スタティックプロパティと同様クラスに紐づくメソッドでアクセスの制限も同じですが、次のような違いがあります。

||オーバーライド  |ストアドプロパティの定義  |コンピューテッドプロパティの定義|
|---|---|---|---|
|スタティックプロパティ  |できない  |できる  |できる|
|クラスプロパティ  |できる  |できない  |できる|

どちらかを利用するか迷ったときは、オーバーライドしたいときはクラスプロパティ、したくないときはスタティックプロパティという感じでいいと思います。
また構造体ではクラスプロパティが利用できないので注意が必要です。構造体そのものに紐付けたいときはstaticをつけましょう。


# 3. 値を保持するかどうかによる分類
### ストアドプロパティ
```swift:
struct Human {
    var name = "hoge" 
}

var human = Human()

human.name = "taro"
print(human.name)

```
その名の通り、値が保持される(stored)プロパティです。
またストアドプロパティには、値の変更を管理する**プロパティオブザーバ**という機能があります。

```swift:
struct Human {

    var name = "hoge" {
        willSet {
            print("\(self.name)が\(newValue)に変更されます。")
            self.name = newValue
        }
        didSet {
            print("Human.nameに\(self.name)がセットされました。")
        }
    }
}

var human = Human()

human.name = "taro"
// hogeがtaroに変更されます。
// Human.nameにtaroがセットされました。
print(human.name) // taro

```
```"hoge"```に続く```willSet``` と```didSet```がプロパティオブザーバの機能です。
```willSet```は値が代入される直前に呼ばれ、```didSet```は値が代入された直後に呼ばれます。
```newValue```には代入される値が格納されます。


### コンピューテッドプロパティ

```swift:
struct Customer {

    var age: Int!

    var drink:String {
        get {
            if self.age >= 20 {
                return "お酒がおすすめです"
            } else {
                return "ソフトドリンクがおすすめです"
            }
        }
    }

    init?(age: Int) {
        guard age >= 0 && age < 120 else { return nil }
        self.age = age
    }

}

var customer = Customer(age: 20)!

print(customer.drink) // お酒がおすすめです

customer.age = 18
print(customer.drink) // ソフトドリンクがおすすめです

```

その名の通り、値が計算されて(computed)出力されるプロパティです。
あくまで計算して値を返しているだけで、**値を保持しているわけではない**ということを意識してください。
init?(失敗のあるイニシャライザ)とコンピューテッドプロパティに関しては下記のリンクで詳しく解説しているので、よければ御覧ください。

・[失敗のあるイニシャライザって？](https://qiita.com/miyakooti/items/a8ac0896eb912c60bd1f)
・[get setってなんのこと？](https://qiita.com/miyakooti/items/89bb6797371441db274c)


本記事では２つの分類方法と、５つのプロパティの分類について整理してきました。整理できると楽しいですね！



# 参考文献
https://swift.codelly.dev/guide/%E5%9E%8B%E3%81%AE%E6%A7%8B%E6%88%90/%E3%83%97%E3%83%AD%E3%83%91%E3%83%86%E3%82%A3.html#%E5%80%A4%E3%81%AE%E4%BF%9D%E6%8C%81%E3%81%AB%E3%82%88%E3%82%8B%E5%88%86%E9%A1%9E
SQL の再帰WITH句で nPr(n = r)の1桁数値順列を生成してみる。(Oracle Database)

# 1. やりたい事

表題の通り、再帰WITH句で下記のような数値の順列(重複無し)を生成してみます。

```shell
1       ... 1
1, 2    ... 12, 21
1, 2, 3 ... 123, 132, 213, 231, 312, 321
：
```
nPr の公式で n = r の順列となります。使用するのは Oracle Database で
ちょっとした検証だったので Live SQL のサイトでガチャガチャと検証彡(ﾟ)(ﾟ)

> Oracle Live SQL
> https://livesql.oracle.com/

# 2. 順列を生成するSQL 

以下のような SQL で対象の順列を生成できました。数値1桁まで対応します。

```sql
WITH nums AS (
  SELECT LEVEL AS C0
    FROM DUAL
 CONNECT BY LEVEL <= 3
),
cte(c1, c2) AS (
  SELECT nums.c0, TO_CHAR(nums.c0)
    FROM nums
   UNION ALL
  SELECT c1
       , c2 || nums.c0
    FROM nums, cte
   WHERE LENGTH(c2) < 3
     AND cte.c2 NOT LIKE '%' || TO_CHAR(nums.c0) || '%'
)
SELECT *
  FROM cte
 WHERE LENGTH(c2) = 3
 ORDER BY c2;
```

結果は以下の通り。n = r の順列の場合は n!(階乗) で要素数を表現できます。3 の場合は 3*2*1 で 6個

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110066/222f1cfa-7a77-1edf-945e-e815c687f495.png)

1,2,3,4,5 の順列では下記のようになります。要素数は 5!=5*4*3*2*1 で 120個ですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110066/5655d724-69c6-1cf3-d52d-d7f4d6c30b3e.png)

# 3. SQLの解説

以下のような考え方で SQL を組んでいます。

> ・初めのWITH句(nums仮表)で順列の生成に必要な数値(1, 2, 3, ...)を生成しています。
> ・再帰WITH句の開始条件(開始レコード)はnums仮表の各要素
> ・再帰WITH句の継続条件は 長さが求める順列の長さより小さい場合 かつ nums仮表の要素を順列(c2列)に含まない場合
> ・そのままだと短い順列も取得されてしまうので、順列の文字列長で絞り込んでいます。

上記の通り再帰WITH句の継続条件の判定がショボいので、1桁の数値までしか対応しません。

# 4. 参考サイト

下記のサイトを参考にさせて頂きました。ありがとうございます！彡(^)(^)

> SQL だけで再帰的に順列/組み合わせを列挙する
> https://zenn.dev/indigo13love/articles/b04f8f2973fee3

上記サイトのように配列型を定義してゴニョゴニョすれば、1桁制限も突破できるとは思われる。
彡(ﾟ)(ﾟ)
Laravelで同一ページで複数のページネーション

Laravelで同一ページ内で複数のページネーションを実装するときのメモ

#前提
* バージョン：Laravel 6

#実装方法
##①第3引数に値を渡す
デフォルトでは第3引数が`'page'`となっているため同じページ中に複数のページネーションがあっても全て連動して動いてしまう。
これを避けるために、それぞれ別の値を渡す。

```php
$hoge = Hoge::Paginate(5, ['*'], 'hogePage');
$funya = Funya::Paginate(5, ['*'], 'funyaPage');
```

##②リクエストへの処理追記
①でページネーションを独立させることができるが、このままではページ遷移時に他のページネーションがリセットされてしまう。
appendsメソッドを使用して他のページネーションにも値を渡すことでこれを回避できる。

```php
$hoge = Hoge::Paginate(5, ['*'], 'hogePage')
    ->appends(['funyaPage' => \Request::get('funyaPage')]);
$funya = Funya::Paginate(5, ['*'], 'funyaPage')
    ->appends(['hogePage' => \Request::get('hogePage')]);
```

##結果
以下のように独立したページネーションを同一ページ内で実装できた。
![paginate.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1401303/f0f9c4b5-6f04-8717-d638-6cf03b610bf3.gif)

#サンプルコード全文
```php:DemoContoroller.php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Hoge;
use App\Funya;

class DemoController extends Controller
{
    public function paginateDemo() {
        $hoges = Hoge::Paginate(5, ['*'], 'hogePage')
            ->appends(['funyaPage' => \Request::get('funyaPage')]);
        $funyas = Funya::Paginate(5, ['*'], 'funyaPage')
            ->appends(['hogePage' => \Request::get('hogePage')]);

        return view('paginateDemo',[
            'hoges' => $hoges,
            'funyas' => $funyas,
        ]);
    }
}

```
```html:paginateDemo.blade.php
<!doctype html>
<html lang="ja">

<head>
    <!-- Required meta tags -->
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <!-- Bootstrap CSS -->
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-giJF6kkoqNQ00vy+HMDP7azOuL0xtbfIcaT9wjKHr8RbDVddVHyTfAAsrekwKmP1" crossorigin="anonymous">
    <title>paginateDemo</title>
</head>

<body>
    <ul class="list-group">
        @foreach($hoges as $hoge)
            <li class='list-group-item'>{{ $hoge->name }}</li>
        @endforeach
    </ul>
    {{ $hoges->links() }}

    <ul class="list-group">
        @foreach($funyas as $funya)
            <li class='list-group-item'>{{ $funya->name }}</li>
        @endforeach
    </ul>
    {{ $funyas->links() }}
</body>

</html>
```
```php:web.php
<?php
Route::get('/paginateDemo', 'DemoController@paginateDemo')->name('paginateDemo');
```
キー修飾子

インプットボックスを作ってそこに文字を打ち込んだ（keyupにしているのでkeyが打ち終わってupしたらイベント）発動するようになっています。
今回はアラートを表示します。

```vuejs
<body>
  <script src="https://cdn.jsdelivr.net/npm/vue@2.6.12/dist/vue.js"></script>
  <div id="app">
     <input type="text" v-on:keyup="myAlert">
</div>
<script>
  new Vue({
    el: '#app',
    methods: {
      myAlert() {
       alert('アラート');
      }
    }
  })
</script>
</body>
```
入力ごとにアラートが出ます。
![20210505-180333.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960935/11a54af6-5289-4fdb-d1d2-d1c487214a80.png)

次にエンターを押した時だけにする「キー修飾子」を設定します。

```vuejs
<body>
  <script src="https://cdn.jsdelivr.net/npm/vue@2.6.12/dist/vue.js"></script>
  <div id="app">
     <input type="text" v-on:keyup.enter="myAlert">
</div>
<script>
  new Vue({
    el: '#app',
    methods: {
      myAlert() {
       alert('アラート');
      }
    }
  })
</script>
</body>
```

次にスペースをキー修飾子に設定

```vuejs
<body>
  <script src="https://cdn.jsdelivr.net/npm/vue@2.6.12/dist/vue.js"></script>
  <div id="app">
     <input type="text" v-on:keyup.space="myAlert">
</div>
<script>
  new Vue({
    el: '#app',
    methods: {
      myAlert() {
       alert('アラート');
      }
    }
  })
</script>
```

</body>
Zappaでdeploy時に yielded a 502 response code. が出たときの解決策一例

# 概要
Zappaについては色々と記事がありますが、自分が遭遇したエラーを書いてみます。


# バージョン
`zappa==0.52.0`

# エラー内容
以下のエラーを頂きました。

```
Error: Warning! Status check on the deployed lambda failed. A GET request to '/' yielded a 502 response code.
```

このとき、zappa tail というコマンドを使うとCloudWatchLogsから詳細なログの確認ができます。
今回は以下のようなログがありました。

```
[ERROR] ModuleNotFoundError: No module named 'werkzeug.wrappers.json'; 'werkzeug.wrappers' is not a package
```

適当に試しすぎたこともありちゃんと追えてないのですが、何かの折に zappa 0.52.0の依存関係としてある `Werkzeug [required: <1.0, installed: 0.16.1]` を超えてしまったようです。


Werkzeug の<1.0の最新版が 0.16.1っぽかったので

```
pip uninstall Werkzeug
pip install Werkzeug==0.16.1
```

として、再度deploy(update)をしたら動きました。


あんまり本記事の内容自体と同じ現象になる方はいない気もしますが、最初の構築がAPIGatewayまで行ったのにうまくいかないときは zappa tail で追っていける、という点が個人的知見でした。
Node.js+FirebaseのM1Mac開発環境用の dockerイメージを作ってみた

M1MacでNode.js14＋Firebase環境を構築する時にそのまま使えそうなdockerイメージが無かったので、dockerイメージを作成して公開用リポジトリにプッシュしてみた。

## dockerイメージ取得方法

dockerをインストール後に以下のコマンドを実行する。

```
docker pull kazuki0819kazuki/node14-firebase-git
```
2直線の交点と連立方程式の解

2直線の交点と連立方程式の解をPythonとJupyter Notebookを使って解きました
ソースはこちらです。

```Python
x = sp.Symbol('x')
y = sp.Symbol('y')

expr1 = sp.Eq(y,70*x)
expr2 = sp.Eq(y,100*x-600)

#交点の座標を求める場合
ans = sp.solve([expr1,expr2])
ans

#グラフを描く場合
sp.plot(70*x,100*x-600,(x,0,30))
```

Pythonを使った数学とデータ分析は便利ですね。
ちょっとしたFortranのひな型

#
ちょっとしたコードを書いて動作確認をしたいとき用のひな型コード．

```:sample.f90
module subprogs
implicit none
contains
    subroutine hoge()
    endsubroutine hoge

    function hage(a)
        integer hage
        integer ::a
        return
    endfunction hage
endmodule subprogs
program main
    use subprogs
    implicit none
    integer :: i,j,k,l
    integer :: imax,jmax,kamx,lmax
    integer :: Nx,Ny,Nz
    real    :: Lx,Ly,Lz
    real,allocatable :: A(:)

read(*,*) Nx, Lx
read(*,*) K
allocate (A(Nx))
read(*,*) A

write(*,*) "input"
write(*,*) Nx, Lx
write(*,*) K
write(*,*) A(:)
```


end program
Rails6で開発中にスマホからアクセスする方法

## はじめに
Railsでアプリケーション開発していると、スマートフォンから動作を確認したいことがあるかと思いますので、方法を簡単にご紹介します。

## 環境
MacOS : Big Sur
Ruby  : 3.0.1
Rails : 6.1.3.1

## ① IPアドレスの確認
まずMacbookの `システム環境設定 > ネットワーク` からIPアドレスを確認します。
![20210505_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613022/030ae101-88f5-57fe-5983-8ec865112b9c.png)

## ② rails s の実行
普段であれば、 コマンドで `rails s` を実行しますが、このコマンドではスマートフォンからアクセスできません。

`rails s -b 'IPアドレス'` コマンドを使用します。
IPアドレスが、 `192.168.68.106` であれば、 `rails s -b 192.168.68.106` を実行します。

```
rails s -b 192.168.68.106
```

成功すると、ネットワーク受信接続の確認が表示されるので、`許可`をクリックします。
![20210505_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613022/0812de25-5c02-ca34-0e4f-0236399a31f5.png)

## ③ スマホからアクセス
スマホのブラウザから、`IPアドレス:3000 又は http://IPアドレス:3000` とURLを入力し表示させます。
![IMG_1892.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613022/33baf13b-1b7f-1091-220f-cfa2bd7c71c0.png)


## 最後に
スマートフォンの表示や、動作を気軽に確認できますので、ぜひ参考にしてみてください。
以上、Rails6で開発中にスマホからアクセスする方法のご紹介でした。
apt のプロキシ対応

# apt でのプロキシ対応


## 準備

テストに使用できるプロキシを用意します。

やり方は以下で説明しています。
https://qiita.com/m-tmatma/items/7b5ce812c85f30546209

## 前提条件

この記事ではプロキシの IP アドレスを `192.168.11.9`、プロキシのポートを `3128` として説明します。
実際のプロキシの情報に置き換えて設定すること。

## apt のプロキシの指定方法

1. `/etc/apt/apt.conf` で指定する方法
2. `/etc/apt/apt.conf.d` 以下に設定ファイルを配置して指定する方法
3. `apt` の引数の `-o` で指定する方法
4. 環境変数 `http_proxy` および `https_proxy` で指定する方法 (`root` ユーザーで実行する場合)
5. 環境変数 `http_proxy` および `https_proxy` で指定する方法 (`sudo` で実行する場合)

## 方法1: `/etc/apt/apt.conf` で指定する方法

以下の内容で `/etc/apt/apt.conf` を作る

```
Acquire::http::Proxy "http://192.168.11.9:3128";
Acquire::https::Proxy "http://192.168.11.9:3128";
```

## 方法2: `/etc/apt/apt.conf.d` 以下設定ファイルを配置して指定する方法

以下の内容で `/etc/apt/apt.conf.d/proxy.conf` を作る

```
Acquire::http::Proxy "http://192.168.11.9:3128";
Acquire::https::Proxy "http://192.168.11.9:3128";
```


## 方法3: `apt` の引数の `-o` で指定する方法

```
export http_proxy=http://192.168.11.9:3128
export https_proxy=http://192.168.11.9:3128
sudo apt update  -y -o Acquire::http::Proxy=$http_proxy -o Acquire::https::Proxy=$https_proxy
sudo apt upgrade -y -o Acquire::http::Proxy=$http_proxy -o Acquire::https::Proxy=$https_proxy
```

## 方法4: 環境変数 `http_proxy` および `https_proxy` で指定する方法 (`root` ユーザーで実行する場合)

root になる

```
sudo -i
```

```
export http_proxy=http://192.168.11.9:3128
export https_proxy=http://192.168.11.9:3128
apt update  -y
apt upgrade -y
```

## 方法5: 環境変数 `http_proxy` および `https_proxy` で指定する方法 (`sudo` で実行する場合)

### 方法5-1: `/etc/sudoers` に追加

Note:  ubuntu 22.04 (ubuntu 21.04も同様) などでは `方法5-2` のほうがよい。

以下の内容を `/etc/sudoers` に追加する。

```
Defaults env_keep = "http_proxy https_proxy"
```

以下のように実行する

```
export http_proxy=http://192.168.11.9:3128
export https_proxy=http://192.168.11.9:3128
sudo apt update  -y
sudo apt upgrade -y
```

### 方法5-2: `/etc/sudoers.d` 以下にファイルを作成 (ubuntu 22.04/21.04 等)

`/etc/sudoers.d/proxy` (ファイル名は任意) を以下の内容で作る

```
Defaults env_keep = "http_proxy https_proxy"
```

以下のように実行する

```
export http_proxy=http://192.168.11.9:3128
export https_proxy=http://192.168.11.9:3128
sudo apt update  -y
sudo apt upgrade -y
```

Note: ubuntu 22.04 (ubuntu 21.04も同様) では `/etc/sudoers` が readonly に設定されている。
`/etc/sudoers` の最後に以下が指定されている。

```
@includedir /etc/sudoers.d
```

```
$ ls -l /etc/sudoers
-r--r----- 1 root root 1671  2月  8  2022 /etc/sudoers
```

```
$ sudo tail /etc/sudoers

# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL

# Allow members of group sudo to execute any command
%sudo   ALL=(ALL:ALL) ALL

# See sudoers(5) for more information on "@include" directives:

@includedir /etc/sudoers.d
```
current_page?(controller: 'library', action: 'checkout')がワークしなくて困った件（Rails）

# やりたいこと
ページによって、検索フォームをビューで、表示する／しないを切り替えたいです。

そこで、`current_page?()`なるメソッドがあることを知りまして、カッコ内の引数には、Railsドキュメントによると、URLだけでなく、コントローラとアクションを指定することも可能とのこと。(2021/5/5執筆時時点)

https://railsdoc.com/page/current_page_q

### 開発環境
MacBook Pro 13 2020
macOS Catalina 10.15.7
ruby 3.0.0
Rails 6.0.3

# 問題

こちらのRailsドキュメントのお手本コードを真似して...

```
current_page?(controller: 'library', action: 'checkout')
```

こう書いてみます。

```
<%= render 'search_form' if current_page?(controller: 'expressions', action: 'index'} %>
```

しかしながら、`wrong number of arguments (given 0, expected 1)`などとエラーが出てしまいます。given 0？いや、引数渡してるやん。なんなら、２つない？

余談ですが、URLの指定（例えば`current_page?('/')`）はうまくいきました。
でも今やりたいことはそれではない！

ググっても解決法が出てこなくて、みんなこの上のコードでできる！と断言しておられます。

いや、できねーし！(泣)

シングルクオーテーション、ダブルクオテーションを試すという愚かな実験をするくらい、手当たり次第自分で色々試してみたところ、一つだけ見つけました。
それが下記です。

# 解決

```
<%= render 'search_form' if current_page?({controller: 'expressions', action: 'index'}) %>
```
丸括弧内で、ハッシュで一塊りにして渡してあげれば、引数argumentが１つあるとみなしてもらえるみたいです。

これで指定したコントローラとアクション以外で生成されたページでは、検索フォームが出なくなりました。

めでたし、めでたし...？

# 最後に
と終わりたかったところなのですが、エラーこそ出なくなったのですが、検索後の画面では、'search_form'が消えてしまいます涙。同じexpressionsコントローラのindexメソッドのはずなのに...。

何かご指摘やアドバイスなどあれば、ぜひよろしくお願いします。
Dockerで躓いたときに読む記事


## Docker-Hubにアップしたイメージがpullできない
自身でUPしたイメージをpullしようとしたらlatestが見つからない旨のエラーが発生しました。

```
docker pull イメージ名
Using default tag: latest
Error response from daemon: manifest for イメージ名:latest not found: manifest unknown: manifest unknown
```

### 解決方法
commit時にlatest以外のタグを指定していたことが原因でした。
タグ指定無しだと自動的にタグ名が`latest`になり、以下のどちらかの方法で、latestのタグを付けなければタグ指定無しでpullできない様です。

* 敢えて`latest`のタグ指定する
* タグ指定無しでプッシュ
AWS上で自作のテトリス風ゲームを動かした際の備忘録

AWS上で自作のテトリス風ゲームを動かした際の備忘録です。
[https://github.com/seigot/tetris_game](https://github.com/seigot/tetris_game)

# 前提条件

- [https://github.com/seigot/tetris_game](https://github.com/seigot/tetris_game)にアクセスできること
- AWSアカウントを登録していること
- EC2を起動していることこと
　（今回は無料枠、ubuntu18.04 server, CPU 1G, メモリ1GB, ストレージ20GBの環境を利用）
- 起動したEC2にアクセスするための鍵ペアを作成して、秘密鍵をローカルに保存する。（パスは一旦、~/.ssh/aws_privatekey としている）

以降は起動済のEC2がある状態の手順を残す。

### 起動後にSSH経由でログイン

手元のPCから以下を実行してログインする。

```
ssh -i ~/.ssh/aws_privatekey ubuntu@xxx.xxx.xxx.xxx   #xxx.xxx.xxx.xxxはパブリックipv4アドレス
```

パブリックipv4アドレスはAWSのサイトから以下の通り確認できる。

`EC2ダッシュボード -> インスタンス -> 起動しているインスタンス選択し、パブリックipv4アドレス`を確認

### VNC経由でログイン

Desktop環境をインストールする

```
sudo apt install -y ubuntu-desktop xterm x11vnc
```

ifupdownをPurgeする

```
sudo apt purge ifupdown
```

Display manager を lightdm に変更

```
sudo apt install lightdm
```

念のためpasswordを設定しておく

```
sudo passwd ubuntu
```

以下を参考にVNCクライアントからx11vncを接続する
> [https://mixture.dcmnjp.net/linux/ubuntu/x11vnc.html](https://mixture.dcmnjp.net/linux/ubuntu/x11vnc.html)

# VNC経由でアプリをお試し実行

自作のテトリスをお試し実行する

> [https://github.com/seigot/tetris_game](https://github.com/seigot/tetris_game)

必要なものをインストール

> 実行環境(Ubuntuの場合)
> 
> Need python3, PyQt5 and NumPy to be installed.
> 
> # install pyqt5 and NumPy
> sudo apt-get install -y python3-pip
> sudo apt-get install -y python3-pyqt5
> pip3 install --upgrade pip
> pip3 install numpy
> その他、パッケージのインストール
> 
> sudo apt-get install -y git

実行

```
cd ~
git clone https://github.com/seigot/tetris_game
cd tetris_game
bash start.sh
```

動いた。でも無料枠(CPU 1G, メモリ1GB, ストレージ20GB)での利用のためか、かなりもっさりします。


# MacからEC2にvncが繋がらない

以下の方法だと繋がった。VNC Viewer使っています。

[https://biomodeling.co.jp/2020/04/30/ubuntu18にリモートデスクトップ接続する手順/](https://biomodeling.co.jp/2020/04/30/ubuntu18にリモートデスクトップ接続する手順/)

ただし毎回以下の設定が要る。

```
# 5901ポートフォワード
ssh -i ~/.ssh/aws_privatekey ubuntu@xxx.xxx.xxx.xxx -L 5901:localhost:5901
# vnc serverの設定
vncserver :1
```

`5900`をポートフォワードする場合は以下

```
# 5900ポートフォワード
ssh -i ~/.ssh/aws_privatekey ubuntu@xxx.xxx.xxx.xxx -L 5900:localhost:5900
```

# kswapdが重い

swap領域を追加して一旦落ち着いた
[kswapが頻発してシステムが重い](https://qiita.com/seigot/items/2f8ae9b505c0f23139ab)

# 参考
[https://github.com/seigot/tetris_game](https://github.com/seigot/tetris_game)
[https://biomodeling.co.jp/2020/04/30/ubuntu18にリモートデスクトップ接続する手順/](https://biomodeling.co.jp/2020/04/30/ubuntu18にリモートデスクトップ接続する手順)
[kswapが頻発してシステムが重い](https://qiita.com/seigot/items/2f8ae9b505c0f23139ab)
[https://mixture.dcmnjp.net/linux/ubuntu/x11vnc.html](https://mixture.dcmnjp.net/linux/ubuntu/x11vnc.html)
MVCについてまとめてみた

#概要
MVCの理解がぼんやりと出来てきたような気がするので、
イメージしやすいようにまとめてみました。

#MVCって何？
IBOutletでボタンなどのUIパーツを接続したり、ボタンをタップした際の処理、
API通信などの様々な処理を全てViewControllerに書いてしまうと、ViewControllerに膨大な行数のコードが書かれることになってしまい、コードを追ったり修正したりすることなどが難しくなってしまいます。俗に言うFat ViewControllerです。
このような問題を解決するために、**責務の切り分け**という作業を行う必要があります。様々なアーキテクチャが存在します。今回はそんなアーキテクチャの中でMVCに焦点を当てて解説してみます。
現在よく使われているMVCパターンは**cocoa MVC**と呼ばれるものです。
MVCとは、
ModelのM, ViewのV, ControllerのCを合わせてMVCと言っています。

#Modelの役割
Modelの役割としては、
・データ構造の表現
・WebAPIとのやり取り
・ローカルデータベースなどのデータの永続化
・データの振る舞いに関するロジック
が挙げられます。

#Viewの役割
Viewの役割は、
・UIの表示
・Controllerからデータを受け取り、UIに反映させる
・ユーザーの操作を(IBAction,IBOutletなどによって)認知し、
です。つまり、アプリ上でボタンを押す、textFieldをタップして文字を入力するなどの操作を行うと、
Viewに通知されます。
実際にアプリ開発を行う際にはカスタムViewを作成し、Viewとする場合が多いです。

#Controllerの役割
Controllerの役割は、
・Modelからデータを受け取り、Viewに渡してデータを更新
・ユーザーインタラクションをViewから受け取り、適切なアクションを行う
・ライフサイクル処理や画面遷移などの処理を行う
です。cocoa MVCでは Viewcontroller が Controller となります。

#参考になった説明
・ModelとViewは、お互いのことを知らない
・Modelの役割は、viewとControllerがやらないこと全部と考えても良い
・カスタムViewを含むViewは、ユーザー操作をControllerに伝達し、Controllerの要求に応じて
 情報を表示するのみの"アホな"存在であるべき

#まとめ
以上の説明を図にすると、以下のようになります。
[![Image from Gyazo](https://i.gyazo.com/06906d5d66a3db470ae9fe12ea0bbe60.png)](https://gyazo.com/06906d5d66a3db470ae9fe12ea0bbe60)
**①ユーザーがView上のUIパーツを操作
②その通知を元にControllerがModelを更新
③ModelがControllerに通知
④Modelから通知をControllerが受け取ったことで、ViewのUIを更新**
といった流れです。
自分も学習したばかりなので、不明点や間違っている点があれば教えていただきたいです。
サンプルコード等は後日更新予定です。
最後まで読んでいただき、ありがとうございました！
#参考記事
https://developer.apple.com/library/archive/documentation/General/Conceptual/DevPedia-CocoaCore/MVC.html

https://qiita.com/koitaro/items/b3a924245fd72f22871a

https://qiita.com/k_awoki/items/556f9f63d5149f8f0cc7
Cascadeurで作成したモーションをUnityちゃんで動かしてみた

Cascadeurで作成したアニメーションをUnityChanで動かしてみたので共有です。
結論から言えば、頭と腕の動きが作成したものと違う状態になりましたが、大まかな動きはよさそうです。

Cascadeurとは物理ベースのキャラクターアニメーション用の3Dアニメーションソフトウェアで、
複雑な人の動きを破綻せずに作りやすくしてくれるツールです
https://cascadeur.com/

基本的な使い方はチュートリアルがあるので実例を踏まえながら学ぶことが出来ます。
https://cascadeur.com/learn/how_to_begin
今回は指のモーションも動かしたかったので5本の指がリギングされているUE4MANNEQUINを使用しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262130/a337b79d-f67d-98e5-044f-f7e0eb1a7477.png)
今回はこちらの作成したアニメーションをUnityに持っていきます
![ezgif.com-gif-maker.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262130/222eba57-2273-813e-4b7d-c29fe06bb89a.gif)

公式が薦めている方法を参考にします。
https://cascadeur.com/help/export_to_unity
まずシーンごとエクスポートします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262130/6229e36e-ec72-708e-cab7-9bb6febe105d.png)
出力されたfbxからアニメーションを取り出します。
アニメーションファイルを選択しEditを押します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262130/b9fe7015-dfab-0516-e61a-6f049a4a628f.png)
ModelタブのPreserve Hierarchyを有効に
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262130/668877ef-e9a7-6aa5-cec0-30c94460151e.png)
RigタブからAnimationTypeをHumanoid型に変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262130/4ff16342-9b77-b27d-3b92-fe5d2dc73f9d.png)
そしてApplyを押します。
先ほど変更をしたアニメーションファイルを複製します(モーションを編集できるようになります)
Windowsだとctrl+Dで複製できます
複製したアニメーションファイルを開き、各項目のBake Into Poseを有効に、加えて各Base UponをOriginalに変更します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262130/082ce371-9676-7204-e3a7-ee8332db67db.png)

ここから、モーションを使用するための各設定をします。
Animator Controllerを作成し、モーションを挿入します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262130/bdd031da-ef4a-17ff-e4eb-2a4b94679ac5.png)
このままアニメーションを再生すると足が地面についていなかったり、滑るようになってしまうので設定をします。
Animator Controllerに挿入したアニメーションを選択し、InspectorからFoot IKを有効にします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262130/549867a3-1b84-76e8-86f8-d1a020223bf8.png)
動かしたいモデルを選択し、InspectorのAnimatorからAppy Root Motionを有効にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262130/c5d5a391-6d1b-3166-b4f4-f8d5236bfec7.png)
Unityを実行します。
![ezgif.com-gif-maker (1).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262130/922e571b-d589-21cc-8e24-36f37a671a48.gif)
実際に動かすと、Unityちゃんの手の向き(縦拳が横拳になってしまっている)と、首の向きが作成したアニメーションと違いますが、それ以外の動きはよさそうです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262130/a3a279d8-fccc-bb84-7dd6-76d88a32093b.png)


作成したモーション通りに反映ができた方は教えていただけると幸いです。



アニメーションの設定関係で参考にさせてもらった動画
https://youtu.be/rkCYVfA4yaU?t=197
モデルのモーションと位置について参考にさせてもらった動画
https://youtu.be/SGO9MMFHI54?t=319
Draw.ioでsvg形式のiconセットをTemplateとして使えるようにする

[ShowNet2021アイコン](https://www.interop.jp/shownet/point/)が配布されていたのでDraw.ioでTemplateとして使えるようにしました。
[Draw.io](https://app.diagrams.net/)でsvg形式のiconを読み込み、以下のように使用することができるようになります。
![スクリーンショット 2021-05-05 14.10.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1445585/48890608-9d80-be34-d3a3-cffe3cf40f39.png)

## iconセットをxml形式に変換する
Draw.ioでiconセットをTemplateとして読み込ませるためxml形式に変換します。

1. [Draw.io](https://app.diagrams.net/)にアクセスし、"Create New Diagram" で適当なファイルを作成
1. "File" -> "New Library" -> "Device"で画面を開き、用意したsvg形式のiconセットをdrag&dropもしくは"Add images"から追加
1. 追加し終わったら、"Export"からxmlファイルの保存先を選択する

## Githubリポジトリに追加する
変換したxmlファイルをURLとしてDraw.ioで参照できるようにすると、Templateとして読み込むことができます。ここではGithubリポジトリにxmlファイルを追加してURLで参照できるようにします。

1. 用意したGithubリポジトリにxmlファイルを追加
1. ブラウザからリポジトリ内のxmlファイルへと辿り、"Raw"をクリックして表示されるページのURLを控えておく（ex. https://raw.githubusercontent.com/younishi/drawio-icon/main/shownet-icon.drawio)

## URL参照設定
### ブラウザ版[Draw.io](https://app.diagrams.net/)
下記の手順を実施して生成されたURLにアクセスすることで今後Templateとしてiconセットを使えるようになります。

1. [https://jgraph.github.io/drawio-tools/tools/convert.html](https://jgraph.github.io/drawio-tools/tools/convert.html)にアクセスし、先ほど控えたURLを入力して "URL Encode" でエンコードしたURLを控えておく(ex. [https%3A%2F%2Fraw.githubusercontent.com%2Fyounishi%2Fdrawio-icon%2Fmain%2Fshownet-icon.drawio](https%3A%2F%2Fraw.githubusercontent.com%2Fyounishi%2Fdrawio-icon%2Fmain%2Fshownet-icon.drawio))
1. https://app.diagrams.net/?splash=0&clibs=U の直後に上で控えたURLを結合してできたURLにアクセスする(ex. [https://app.diagrams.net/?splash=0&clibs=Uhttps%3A%2F%2Fraw.githubusercontent.com%2Fyounishi%2Fdrawio-icon%2Fmain%2Fshownet-icon.drawio](https://app.diagrams.net/?splash=0&clibs=Uhttps%3A%2F%2Fraw.githubusercontent.com%2Fyounishi%2Fdrawio-icon%2Fmain%2Fshownet-icon.drawio)

### VSCode [Draw.io](https://marketplace.visualstudio.com/items?itemName=hediet.vscode-drawio)
settings.jsonを開き、下記のように追記すると読み込まれます。

```json
    "hediet.vscode-drawio.customLibraries": [
        {
            "entryId": "ShowNet2021_icons",
            "libName": "ShowNet2021 icons",
            "url": "https://raw.githubusercontent.com/younishi/drawio-icon/main/shownet-icon.drawio"
        }
    ],
```

## 参考サイト

- [https://github.com/jgraph/drawio-libs](https://github.com/jgraph/drawio-libs)
- [https://qiita.com/yaegashi/items/c0882e76baab72b13e39](https://qiita.com/yaegashi/items/c0882e76baab72b13e39)
【Rust】クレートsha3によりSHAKE256のハッシュ関数を使用する

# はじめに
Rustでは、クレート`sha3`[参考(1)]を利用することによってSHA-3ハッシュ関数を使用することができます。

なのですが、筆者がSHAKE256の関数を利用したかった際に、あまり（読める）文献が見つからず苦労しました。
このページでは、動くようになったコードなどを備忘録として置いておきます。

※この記事は、2020/12/08に確認した事項をまとめております。最新の情報と異なる可能性がありますのでご了承ください。

# 動作環境
CentOS Linux release 7.9.2009
`rustc` (Stable) 1.49.0
`cargo` (Stable) 1.49.0
`sha3` 0.9.1

# 導入
`sha3`の導入には、`Cargo.toml`の依存関係の欄に以下を追記すればOKです。

```
sha3 = "0.9.1"
```

`0.9.1`の部分は、利用したい`sha3`のバージョンを指定してください。

# SHAKE256の使用例
`sha3`を用いてSHAKE256のハッシュ関数を使用する例を以下のコードに示します。

```rust
use sha3::Shake256;
use sha3::digest::*;

fn main() {
    // create a SHAKE256 object
    let mut hasher = Shake256::default();

    // write input message
    // updateの引数は[u8]
    hasher.update(b"hello world");

    // read hash digest
    let size: usize = 200;
    // 引数はusize
    // 返り値はBox<[u8]>
    let result = hasher.finalize_boxed(size);
    
    for i in 0..size {
        print!("{} ", result[i]);
        if i % 10 == 9 { 
            println!("");
        }
    }
    println!("");
}
```

この例では、"hello world"をSHAKE256によって200バイトのハッシュ値に変換し、その結果を標準出力しています。
ローカル定数`size`の値が、ハッシュ値のバイト数です。
なお、このハッシュ値は`Box<[u8]>`型で得られます。そのため、ハッシュ値の確認には、コードのようにループ文を用いるなどする必要があります。

# 参考
(1) [sha3 - crates.io: Rust Package Registry](https://crates.io/crates/sha3)
[Rails]ノーエラーでherokuへデプロイしていく

#はじめに
本記事ではローカル環境で開発したrailsアプリケーションをherokuへデプロイしていく方法いついてまとめてあります。

#前提条件
・Rails 6.0.0
・herokuアカウントを所持している
・MySQLを使用

#デプロイ方法

まずは、HerokuCLIをインストールしていきます。
なお、ここから以下のコマンドは自身のアプリケーションフォルダー内で行うことを推奨します。

```terminal
% brew tap heroku/brew && brew install heroku
```
インストール完了後に確認しましょう

```terminal
% heroku --version
```

ここからherokuにログインします。

```terminal
# Herokuへログインするためのコマンド
% heroku login --interactive
  => Enter your Heroku credentials.
# メールアドレスを入力し、エンターキーを押す
  => Email:
# パスワードを入力して、エンターキーを押す
  => Password:
```

さて、下準備はOKです。
ここから、実際にデプロイ手順を見ていきます。
まずは,heroku上でのアプリケーション名を作成します。ここでは、soccer_appにします。

```terminal
% heroku create soccer_app
```
さて、一応確認のため、以下のコマンドを打ちましょう

```terminal
% git config --list | grep heroku
```
fatal: not in a git directoryが出ていなければOK！！

さて、ここからデータベースの設定です。
今回は開発環境と同様にMySQLを使用するための設定を行います。ClearDBアドオンを追加することによって設定できます。

```terminal
% heroku addons:add cleardb
```

###ClearDBアドオン（参考）
ClearDBというデータベースサービスが提供しているアドオンで、これを追加することにより、HerokuでMySQLを使用できるようになります。

<br>

これでOK!!!と見せかけて、まだ設定は完璧ではありません。Ruby on Railsを使う場合は、MySQLに対応するGemについて考慮する必要があります。以下のコマンドでClearDBデータベースのURLを変数heroku_cleardbに格納します。

```terminal
 % heroku_cleardb=`heroku config:get CLEARDB_DATABASE_URL`
```

上記を踏まえ、今一度データベースのURLを再設定します。

```terminal
% heroku config:set DATABASE_URL=mysql2${heroku_cleardb:5}
```

ゴールまで後少しです。

以下のコマンドで、credentials.yml.encをmaster.keyによって復号し、中身を確認します。

```terminal
EDITOR="vi" bin/rails credentials:edit
```

###master.keyファイル
credentials.yml.encの暗号文を復号する、鍵の役割を持ったファイルです。特定のcredentials.yml.encと対になっている。

###credentials.yml.encファイル
Railsにて、外部に漏らしたくない情報を扱う際に用いるファイル

次に、heroku上に環境変数としてmaster.keyの値を設置します。
（今は先ほど確認したようにローカルにある）

```terminal
% heroku config:set RAILS_MASTER_KEY=`cat config/master.key`
```
確認したい場合は以下のコマンドで確認

```terminal
% heroku config
```
次にStackの準備です
Stackとは、Herokuにおけるアプリケーションの動作環境のことです。Stackはデプロイされたアプリケーションを読み取り正常に稼働させるために用意されています。

```terminal
heroku stack:set heroku-18 -a soccer_app
```

いよいよラストスパート
Herokuへアプリケーションの情報を追加しましょう。

```terminal	
% git push heroku master
```
また、DBにもマイグレーションの情報を反映します
　

```terminal
% heroku run rails db:migrate
```

これで完了です！！！！！！
あとは、URLを打ち込んで見てみましょう、、、
ってわからねえ！！
そんなときは、以下のコマンドで確認してみましょう！！

```terminal
% heroku apps:info
```

#おわりに

いかがでしたか
ノーエラーでというのはなかなか大変かもしれませんが、頑張ってみてください！！！
カウントアップアプリを作って、props、stateの理解を深めた件

#はじめに
react入門いたしました。
reactの基礎である、props、stateについて
カウントアップアプリを通じて学びました。

#Props
- 親コンポーネントから子コンポーネントに値を渡す方法
- データの属性によって記述の仕方が違います、文字列は""で囲む、数字は{}で囲む
- 子コンポーネントは引数として受け取る。受けつる際に{}で囲む

##親コンポーネント
```javascript
const App = () => {
  return (
    <>
      <section style={{ paddingTop: "50px" }}>
        <h1 className="ui container">カウントアプリ</h1>
        <div className="ui container" style={{ display: "flex" }}>
          <CountButton text="+1" num={1} />
          <CountButton text="+2" num={2} />
          <CountButton text="+3" num={3} />
          <CountButton text="+4" num={4} />
          <CountButton text="+5" num={5} />
        </div>
      </section>
    </>
  );
};
```

text、numという変数で値を子コンポーネントに渡しております。

##子コンポーネント
```javascript
const CountButton = (props) => {
  const [num, setNum] = useState(0);
  const onCountUp = () => {
    setNum(num + props.num);
  };
  return (
    <>
      <div className="count_box" style={{ marginRight: "20px" }}>
        <p style={{ fontSize: "20px" }}>
          Count<span style={{ fontSize: "24px" }}>{num}</span>
        </p>
        <button
          className="ui button blue"
          style={{ width: "100%" }}
          onClick={onCountUp}
        >
          {props.text}
        </button>
      </div>
    </>
  );
};
```
子コンポーネントでは引数で(props)の値を受け取る
{}で囲んでprops.<strong>変数名</strong>で値を表示する

#State
- 各コンポーネントが持つ状態
- Stateが変更されると再レンダリングされる。
- 条件によって状態が変わる部分をStateで管理する

```javascript
import React, { useState } from "react";

const CountButton = (props) => {
  const [num, setNum] = useState(0);
  const onCountUp = () => {
    setNum(num + props.num);
  };
  return (
    <>
      <div className="count_box" style={{ marginRight: "20px" }}>
        <p style={{ fontSize: "20px" }}>
          Count<span style={{ fontSize: "24px" }}>{num}</span>
        </p>
        <button
          className="ui button blue"
          style={{ width: "100%" }}
          onClick={onCountUp}
        >
          {props.text}
        </button>
      </div>
    </>
  );
};
```
まずはuseStateをimportする
`const [num, setNum] = useState(0);`
一つ目いにStateとして使う変数名(num)、二つ目にそのStateを変更するための関数名(setNum)
useState(初期値)今回は0です。
`setNum(num + props.num);`
Stateを更新する、numにprposの値分プラスする

#デモ
https://onishishotaro.github.io/count-app/