OmniAICreator/Qiita-1.07M huggingface dataset:
Azureクラウドデータの魅力にハマろう！DP-900試験対策リソースまとめ

## はじめに
[DP-900: Microsoft Azure のデータの基礎試験](https://learn.microsoft.com/ja-jp/certifications/exams/dp-900/) (以下、DP-900 試験)は、データの中核概念と関連する Microsoft Azure データ サービスに関する知識を問う試験です。この試験の合格者は [Microsoft Certified: Azure Data Fundamentals](https://learn.microsoft.com/ja-jp/certifications/azure-data-fundamentals/) の資格認定を受けることができます。

この記事では、DP-900 試験の受験準備として、どのような情報を参照していくとよさそうかを纏めてみます。なお、試験の内容は定期的に見直しが行われていますので、記事を執筆している時点の情報として参照してください。

## 試験情報を確認
常に最初に確認する必要があるのは公式の [試験情報](https://learn.microsoft.com/ja-jp/certifications/exams/dp-900/) です。

### 試験情報の記載内容
試験情報のページには以下のような情報が記載されています。

- 試験の予約に関する情報
- 試験で評価される内容(= 出題範囲)
- 学習リソース
    - セルフ ペースの学習
    - インストラクター指導のクラス ルーム
- 関連する認定資格
- 試験関連のリソース

### 確認を強くお勧めするポイント
あくまでも個人の主観に基づくので、普遍的にお勧めポイントかどうかの保証はありません。
学習リソースで提供されている、4つのラーニング パスについては一通り確認いただくことをお勧めしています。どのようなスタイルで学習を進めるかは各人の自由なのですが、自習でも、クラスルームへの参加でも、どちらのパターンに対してもお勧めです。

## ラーニング パスを確認
試験準備のためのリソースとして 4 つのラーニング パスが紹介されています。これらは、Microsoft Learn 内のコンテンツとして提供されているものと同一です。
ラーニング パスには複数のコースモジュールが組み込まれています。それぞれのパスがどのような構成になっているかを確認しておきたいと思います。

### ラーニング パス: コア データの概念を調べる
https://learn.microsoft.com/ja-jp/training/paths/azure-data-fundamentals-explore-core-data-concepts/

このパスでは、Azure 上でのデータ保持に関連する一般的な概念を説明しています。データの構造や、それに適したデータの保持方法も解説されています。同時に、クラウド上に蓄積されたデータを利用するロールに関しての概要も開設されています。

### ラーニング パス: リレーショナル データを探索する

https://learn.microsoft.com/ja-jp/training/paths/azure-data-fundamentals-explore-relational-data/

このパスでは、リレーショナル データを保持するための Azure のサービスを解説しています。加えて、リレーショナル データの解説も行われています。リレーショナル データをあまり扱ったことがない場合はすべてのコースを、Azure のサービスを把握したい場合は、サービス解説側のコースを確認しておくとよいと思います。

### ラーニング パス: 非リレーショナル データを探索する

https://learn.microsoft.com/ja-jp/training/paths/azure-data-fundamentals-explore-non-relational-data/

このパスでは、非リレーショナル データを保持するための Azure のサービスを解説しています。コアデータの概念パスで解説されていた、半構造化、非構造化データを保持するための代表的なサービスの解説が含まれています。それぞれの代表的なパターンを押さえることができます。

### ラーニング パス: データ分析を探索する

https://learn.microsoft.com/ja-jp/training/paths/azure-data-fundamentals-explore-data-warehouse-analytics/

このパスでは、データ分析業務に向けた Azure サービスを解説しています。データウェアハウス、ストリーミング データの処理、データの可視化の3要素をカバーしています。

## まとめ
この記事では、DP-900: Microsoft Azure のデータの基礎試験の学習コンテンツの概要を確認しました。今から DP-900 試験に取り組んでみようという方は、まずはラーニング パスから取り組んでみるのはどうでしょうか。
EC2 Unixbench まとめ

# はじめに
- EC2 のベンチマークを取ってみたので、まとめていきます
- ベンチマークツールは [Unixbench](https://github.com/kdlucas/byte-unixbench) を使っています

# ツール実行条件
- Unixbench は`./Run`で実行しています(特に引数は与えていません)
- シングルコアとマルチコアでの`System Benchmarks Index Score`の結果をまとめています
- 本来は複数回実行しての平均値や、偏差もまとめていくと良いと思いますが、費用がかかるので、今回は1 回の実行となっています
- ツール実行中にクレジットがなくならないように、クレジットは無制限にしています
- 実行リージョン: オレゴン(us-west-2)
- OS: Amazon Linux 2

# スコアまとめ
|インスタンスタイプ|シングルコア|マルチコア|
|--|--:|--:|
|a1.large(2 vCPU, 4 GiB)|559.7|1089.5|
|m6a.large(2 vCPU, 8 GiB)|2154.6|3325.3|
|m6g.large(2 vCPU, 8 GiB)|1425.3|2497.4|
|m6gd.large(2 vCPU, 8 GiB)|1446.6|2595.9|
|m6i.large(2 vCPU, 8 GiB)|1958.1|2832.3|
|m7g.large(2 vCPU, 8 GiB)|1629.6|2938.1|
|t3.micro(2 vCPU, 1 GiB)|1088.5|1478.8|
|t3a.micro(2 vCPU, 1 GiB)|974.5|1685.4|
|t4g.micro(2 vCPU, 1 GiB)|1257.9|2449.6||

随時更新していきます
【メモ】カレントディレクトリをDocumentRootにしたNginxコンテナ実行

ただただブラウザで静的ファイルの動作確認をしたいとき用のメモです。

```
docker run --rm -v $(pwd):/usr/share/nginx/html -p 80:80 nginx:alpine
```

実行後、 http://localhost/ にアクセスします。
Dockerで起動したInfluxDBのOperator tokenを取得する

## バージョン

InfluxDB 2.6

## コンテナの立ち上げ

``docker　compose``でコンテナを立ち上げます。

```yaml:docker-compose.yaml
version: "3"
services:
  influxdb:
    image: influxdb:2.6
    ports:
      - 8086:8086
    volumes:
      - influxdb:/var/lib/influxdb2
      - $PWD/config:/etc/influxdb2

volumes:
  influxdb:
```

## InfluxDB を Setup する

Operator token を取得するために、InfluxDB のセットアップをします。セットアップの仕方は、 CLI から行う方法と環境変数で設定する方法の 2 つがあります。

### CLI から設定する

``influx`` CLI を使ってセットアップコマンドを実行します。

```bash
$ docker compose exec /bin/bash
root@xxxxxx:/ influx setup -u my-user -p my-password -o my-org -b my-bucket -f
User	Organization	Bucket
my-user	my-org		my-bucket
```

コマンドが完了したら、``auth`` コマンドから Operator token が確認できます。

```bash
root@xxxxxx:/ influx auth list --user my-user --json
[
	{
		"id": "0abd127cb217a000",
		"description": "my-user's Token",
		"token": "Your operator token",
		"status": "active",
		"userName": "my-user",
		"userID": "0abd127ca297a000",
		"permissions": [
            ~
        ]
]
```

### 環境変数で設定する

``DOCKER_INFLUXDB_INIT_MODE`` を ``setup`` と指定してコンテナを立ち上げます。コンテナが立ち上がったら、``influx`` CLI からの設定と同様に ``auth`` コマンドで Operator token を確認できます。

```yaml
  influxdb:
    image: influxdb:2.6
    ports:
      - 8086:8086
    environment:
      - DOCKER_INFLUXDB_INIT_MODE=setup
      - DOCKER_INFLUXDB_INIT_USERNAME=my-user
      - DOCKER_INFLUXDB_INIT_PASSWORD=my-password
      - DOCKER_INFLUXDB_INIT_ORG=my-org
      - DOCKER_INFLUXDB_INIT_BUCKET=my-bucket
```

## CLI の設定は ``/etc/influxdb2/influx-configs`` に書き出される

setup コマンドを実行したら、``/etc/influxdb2/influx-configs`` に内容が書き出されます。このファイルをホスト側と同期しておくことで、コンテナを ``down`` したあとに ``up`` し直しても ``401 Unauthorized: unauthorized access`` エラーが発生せずに済みます。

## 参考

- [Install InfluxDB](https://docs.influxdata.com/influxdb/v2.6/install/?t=Docker)
- [influxdb - Official Image | Docker Hub](https://hub.docker.com/_/influxdb)
Unity/C#のための「多分最速」のスクリプト言語作った。#1


Unityのためのアロケーションの少ない静的型付け言語が欲しかったので、作っています。
まだまだ未完成ですが、とりあえず公開しました。
https://github.com/Akeit0/YukataScript
--追記 タイトルに追加したんですけど多分(C#で動くもので、C#の関数を呼び出すのが)最速です。

--追記 続きものにしました。->#2　https://qiita.com/aakei/items/5145d6e9922cff6c99fc

--追記(2/19) WebGLDemo 作りました ->　https://akeit0.github.io/YukataScript/
--追記(2/20) 説明不足でしたが、C#上で動的IL生成などを使わず動くものなので、C#よりも遅いです。
--          [Zennでの解説記事](https://zenn.dev/aakei/articles/006ffaf494c3ae)
# 目次
<!-- タイトルとアンカー名を編集 -->
1. [使い方](#Chapter1)
2. [どれだけ速いか](#Chapter2) 
3. [いいところ](#Chapter3) 
4. [ダメなところ](#Chapter4) 

5. [まとめ](#Chapter5)
<a id="#Chapter1"></a>
# 使い方
C# 側ではこんなコード書いて
```C#
using YS;
using YS.Fields;
using YS.VM;

[TextAreaAttribute(3,20)]
public string code;
public TextAsset TextFile;
public bool DoPerformanceCheck = false;
VirtualMachine _engine=new (32,32,32);

Compiler _compiler = new Compiler();

public List<NameVariablePair> Fields;
       
public void Compile() {
      Wrapper.Init();
     _compiler.SourceCode = TextFile != null ? TextFile.text : code;
      foreach (var field in Fields) {
            if (field is {IsValid: true}) _engine.AddVariable(field.Name, field.Variable);
      }
      _compiler.Compile(_engine, DoPerformanceCheck);       
}
public void Run() {
      if (DoPerformanceCheck) {
           using (ElapsedTimeLogger.StartNew("run")) {
                 _engine.Process();
           }
      }else {
           _engine.Process();
       }
}
async void RunAsync() {
     try {
         await   _engine.RunAsync();
         }
     catch (Exception) {
         Debug.Log("catch");
         throw;
     }    
      Debug.Log("End");
}
```
Codeをこんな風に書いてみると
```C#
using UnityEngine
print("Start")
for i in ..100{
    await 30.ms()
    transform.position+=new Vector3(f,0,0)
}
```
![YSAsync.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2629974/a8fb38ba-2ccc-d6fb-a100-8fcf6eef3b39.gif)
こうなる。

<a id="#Chapter2"></a>
# どれだけ速いか
そもそもどれくらい速いですが、C#では
```C#
for (int i = 0; i < 100000; i++) {
    v3 += new Vector3(f,1,1);
}
```
これが4.4689 msで
YukataScriptでは
```C#
using UnityEngine
for i in ..100000{
    v3+=new Vector3(f,1,1)
}
```
これが28.7999 msです。だいぶC#に近づけたと思います。
まあint 型の足し算で比べたらだいぶ遅くなりますが、、、
--　追記22.1546msになりました。
-- 追記(2/20) 18ms程度になりました。
<a id="#Chapter3"></a>

# いいところ
- フィールドをなんでも選択できるのは便利
- PlayModeじゃなくても動く(上のgifもエディタモード)
- 事前コード生成でデリゲートでラッパーを作っているので、パフォーマンスも良いです。
- コンパイル後はC# と同じアロケーションしかしません。
- IL2CPP上でコンパイルして動きました。(速度変わらず)
- await が使いやすい(ついでにUniTaskもAwaiterと一緒にコード生成すれば使える)。
- オーバーロード解決できる
- 拡張メソッド使える。
<a id="#Chapter4"></a>
# ダメなところ
- Genericsほぼできない(解決したい)
- 関数もクラスも定義できない(解決したい)
- 上ができても再帰は絶対できない(解決しない)
- バグだらけ

<a id="#Chapter5"></a>
# まとめ
まだまだですが、多分可能性は無限大です。
https://github.com/Akeit0/YukataScript
続き　https://qiita.com/aakei/items/5145d6e9922cff6c99fc
【SwiftUI】TextEditorにプレイスホルダーを付けたい

# はじめに
複数行の文字入力をさせたい時に登場するのが`TextEditor`です。
(iOS16からはTextFieldでもできるようになった)
しかし、`TextEditor`にはプレイスホルダーがつけられません。
プレイスホルダーがないと何をする場所なのかユーザーはわかりにくいと思います。

`TextEditor`にプレイスホルダーを付けなければいけないことがあったので、その時の解決方法を記録しておきます。

# こんな感じ
![Simulator Screen Recording - iPhone 14 - 2023-02-12 at 20.20.20.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/a081cf87-a16b-7396-35e8-f22ac9cea648.gif)

# 実装
```swift:TextEditorView
import SwiftUI

struct TextEditorView: View {

    private let placeholder: String

    @Binding private var text: String

    init(_ placeholder: String, text: Binding<String>) {
        self.placeholder = placeholder
        self._text = text
    }

    var body: some View {
        ZStack(alignment: .topLeading) {
            TextEditor(text: $text)
            Text("ここにテキストを入力してください")
                .opacity(text.isEmpty ? 0.3 : 0.0)
                .padding(.init(top: 9, leading: 8, bottom: 0, trailing: 0))
                .allowsHitTesting(false)
        }
    }
}
```

# 使い方
```swift:ContentView
import SwiftUI

struct ContentView: View {
    @State var text: String = ""
    var body: some View {
        TextEditorView("ここに文字を入力してください", text: $text)
    }
}
```

# おわり
標準機能として提供してくれると嬉しいです。
【AWS】RDSがいつまでたってもSQL Serverに接続してくれないんだが

ご無沙汰しております。Sarasaです。

最近仕事の関係でSQLを勉強し始めたのですが、ただのExelかと思いきや、**「ほかのプログラミング言語と組み合わせることでコード画面を開かずにデータを編集できる」**　とんでもツールなのですね・・！
練習でC#と接続してみたのですが、これは便利過ぎる・・！

せっかくなので周辺知識も固めようと思い、**Amazon RDS**をDBエンジンに繋げるべくいろいろと勉強してみました。

# データベースを作成してみたものの。。
RDSでデータベースを作成する上でやったことは以下のとおりです。
* RDS上でデータベースを作成
* データベースエンジンはSQL Serverを選択。ポート番号は1433
* **パブリックアクセスを許可**
他は既定の値を用いて設定を行いました。

また、データベースエンジンの方もManegement Officeもインストール済みのため、
エンドポイント,ポート番号をサーバー名の欄に記載し、ログイン名やパスワードをRDSのデータベース画面に従って入力すれば接続できるはずなのですが、、
![スクリーンショット 2023-02-07 214940.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2863909/6d78a3b2-e04e-8598-5b95-d708af5c6a74.png)
インスタンスは起動してるし、パブリックアクセスも許可してるはずなんだけどなあ～～

# そもそも前提部分ができていないのか？？（DBエンジン編）
これまではデータベース側をいじっていることがほとんどだったのでSQL Server側も見直してみようかと。
* SQL Serverはリモート接続を許可しているか→YES
* SQL Server構成マネージャーはTCP/UDPを有効にしているか？→無効だったので有効に。SQL Serverも開始
* ファイヤーウォールの状態を確認→TCP/UDP共にポート1433を有効に

とりあえずこの辺りを見直してみましたが、残念ながらエラー258は継続。。。
（そしてこのエラー文も意味が理解できない～～

# そもそも前提部分ができていないのか？？（RDS編）
改めてRDSも確認してみます。
DBエンジン側のファイヤーウォールに問題がないとしたら、データベース側はどうでしょう？

AWSでは、「セキュリティグループ」というものがファイヤーウォールの役割を果たしており、「どことのアクセスを許可するか？？」を設定できます。

サービス＞EC2からセキュリティーグループを選択し、インバウンドルールを確認すると、
![スクリーンショット 2023-02-12 014927.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2863909/a597658d-792d-d72d-dedb-c5e96983d64e.png)
接続を許可するIPアドレスが設定されていなかったようです。。。
「インバウンドルールを編集」から**ソースを「Anywhere-IPv4」に設定し、すべてのIPv4からのMSSQLへの接続を許可する**と、
![スクリーンショット 2023-02-12 122936.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2863909/6a337737-1b24-6e2c-9917-84de8ab055aa.png)
IPバージョンが表示されるようになりました。

早速Manegement Officeからログインしてみると、
![スクリーンショット 2023-02-12 125530.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2863909/39fd843f-ab34-cde5-64e9-2f68e28e1fe2.png)
接続に成功しました！

# インバウンドルール・アウトバウンドルールとは？？
今回はセキュリティグループのインバウンドルールに問題があったのですが、そもそもこのインバウンドルールとはアウトバウンドルールと対になるものです。
公式ホームページによると、
インバウンドルールは**インスタンスへの受信トラフィック**を制御し、
アウトバウンドルールは**インスタンスからの受信トラフィック**を制御しているのだそう。

しかも、デフォルトのセキュリティグループでは**インバウンドルールが設定されていません**。そのため、接続の前提となる部分で「こことなら通信してもいいよ～」という許可をしてあげないと、データベースをDBエンジンと接続することができないのです。

# おまけ
ちなみに、繋げるだけならソース「マイIP」でも繋がりますが、**IPアドレスはちょくちょく変わる**ので、設定直後は繋がったのにしばらくしたら繋がらなくなった。。ということが起こります。
「マイIP」は自分のPCしかアクセスできない設定のため安全性は高そうですが、接続のたびにコンソールから設定をいじらないといけなくなるので、DBエンジンだけ指定して、他はフリーにしてあげた方が面倒をなくせそうです。
【Swift】associatetype


# 用途
protocolの中で使用される定義で、どんな型でもあてはまるよう汎用性を持たせるために使用する。

# 実行環境
| No |    項目     |   内容    |
|---:|-------------|------------|
| 1  |      OS       |   Mac     |
| 2  |       Swift     |   5.7.2  |
| 3  |       Xcode     |  14.2   |

# 実行例
```swift
protocol Collection {
    associatedtype Item
    var count: Int { get }
    subscript(index: Int) -> Item { get }
    mutating func append(_ item: Item)
}

struct UppercaseStringsCollection: Collection {
    
    var container: [String] = []
    
    var count: Int { container.count }
    
    mutating func append(_ item: String) {
        guard !container.contains(item) else { return }
        container.append(item.uppercased())
    }
    
    subscript(index: Int) -> String {
        return container[index]
        
    }
}
```
```swift
var upper = UppercaseStringsCollection() // append がmutatingのため、upperインスタンスを変更してしまうためvarで宣言
upper.append("string")
print(upper.container) // ["STRING"]
print(upper[0]) // "STRING"
```

上の実行例のように、subscriptを使用すると、インスタンス[]の形で添字をつければ、subscript内の戻り値が返される。

# 参考

https://www.avanderlee.com/swift/associated-types-protocols/
(リンクだけです) 「絶対値（ぜったいち、英: absolute value）または母数（ぼすう、英: modulus）」を調べました。

https://ja.m.wikipedia.org/wiki/%E7%B5%B6%E5%AF%BE%E5%80%A4

https://en.wikipedia.org/wiki/Absolute_value



https://www.google.co.jp/search?q=%E7%B5%B6%E5%AF%BE%E5%80%A4+%E4%BD%95%E5%B9%B4%E7%94%9F&sxsrf=AJOqlzX1rvLdFMsU922veaX1e4hJCGSQJg%3A1676197746244&source=hp&ei=cr_oY-vTC-T9hwO8uY_ABg&oq=%E7%B5%B6%E5%AF%BE%E5%80%A4+%E4%BD%95%E5%B9%B4%E7%94%9F&gs_lcp=ChFtb2JpbGUtZ3dzLXdpei1ocBADMgQIIxAnMgcIABAeEKIEMgcIABAeEKIEMgUIABCiBDoHCCMQ6gIQJ1D8GVj8GWCEJ2gBcAB4AIABwwOIAcMDkgEDNC0xmAEAoAECoAEBsAEP&sclient=mobile-gws-wiz-hp


学習指導要領と学習指導要領解説とは、同じ文科省の発行であるが、別物である。

https://blog.goo.ne.jp/mh0920-yh/e/6d29ca5788b91d5ed36221a263c39bcf
CEH合格体験記〜約1.5ヶ月で合格しました

## はじめに
ご覧いただきありがとうございます。
筆者のえきそんぱいと申します。

2022年12月にCEHに合格しました。
その体験を記載します。これから受験する方の参考になれば幸いです。


## 筆者の前提知識
現在、セキュリティベンダーにて働いています。
セキュリティインフラ構築運用、SOCサービス運用などITセキュリティ関連する経験が5年ほどあります。

受験にあたりGSXのトレーニングを受講し試験に受講しました。


## CEHとは
CEH（Certified Ethical Hacker：認定ホワイトハッカー）とは、EC-Council認定の国際的な情報セキュリティ資格とのことです。
引用：https://www.gsx.co.jp/services/securitylearning/eccouncil/ceh.html

EC-Council
さまざまなサイバーセキュリティ スキルに関するサイバーセキュリティ認定、教育、トレーニング、およびサービスを提供するアメリカの組織とのことです。
引用：https://en.wikipedia.org/wiki/EC-Council


## CEH試験概要
CEH試験に合格するためには、CEHトレーニングコースを受講することを推奨されていますが、必須ではありません。（証明書？を提出することでトレーニングなしで受験できるようです）

CEH試験は、125の質問からなる多項選択問題形式の試験で合格ラインは70％です


## 学習スケジュール
勉強期間：12/1～12/15
試験：12/17

平日は30分から1時間程度
休日は2～4時間程度

## 合格までにやったこと

### テキストを読む
公式トレーニングのテキストを一通り、確認しました。
英語を無理やり日本語にしているせいか、意味不明な個所が多いので、ものすごくざっとです....

### 過去問を解く

過去問はこちらのスマホアプリを利用しました。
「IT ＆ Cybersecurity Pcket Prep」
https://www.pocketprep.com/bundles/it-cybersecurity/

残念ながら、月額2100円の有料となっています。さらに残念なことに全て英語なので、わからないところはgoogle翻訳しながらとなります...

・過去問を解く
・間違えた問題、わからん用語をメモる
・調べてまとめる
・間違えた過去問を解く
...というのを繰り返しました。


過去問は1300問あり、私は一通り実施しました


## 結果
「スコア73%」
でギリギリ合格しました...


## 最後に

最後に勉強しての所感です。

この試験合格すれば、「ハッキングできる」「ペネトレションテストができる」という実践的なものではない。という印象です。（実践を求めるのならはOCSPですね、、）

ただ、攻撃者目線の考え方や知識を浅く広く学ぶ良い機会にはなった思います。


ここまで、ご覧いただきありがとうございました。これから受験される方の合格をお祈りしています🙏
flutter_inappwebviewでクリップボードを使う

flutter_inappwebviewで開いたページのコピペ処理が、何故かAndroid環境(実機・シミュレータどちらも)で機能しません。flutterだけで解決できなさそうなのでwebページから無理やりflutterのコードを呼んでコピペさせます。


# Webページ側
`navigator.clipboard`を以下の`flutterClipboard`に置き換えます。
```ts
interface Window {
  flutter_inappwebview: any;
}
declare var window: Window;

//ペースト
async function readText(): Promise<string | null> {
  let view = window.flutter_inappwebview;
  if (view) {
    let text = await view.callHandler("readClipboardText", {});
    return typeof text == "string" ? text : null;
  } else return navigator.clipboard?.readText();
}
//コピー
async function writeText(text: string) {
  let view = window.flutter_inappwebview;
  if (view) {
    return view.callHandler("writeClipboardText", { text });
  } else return navigator.clipboard?.writeText(text);
}
let flutterClipboard = {
  readText,
  writeText,
};
export default flutterClipboard;

```

```ts
import flutterClipboard from "...";

//コピー
flutterClipboard.writeText("コピーテキスト");

//貼り付け
flutterClipboard.readText().then((text) => {
    if (text) {
    
    }
});
```


# Flutter側
`InAppWebView`の`onWebViewCreated`にコピペハンドラを追加します。

```dart
//import 'package:collection/collection.dart'; <-これも必要
InAppWebView(
      initialUrlRequest: URLRequest(url: url),
      initialOptions: InAppWebViewGroupOptions(
          android: AndroidInAppWebViewOptions(
              mixedContentMode:
                  AndroidMixedContentMode.MIXED_CONTENT_ALWAYS_ALLOW)),
      onWebViewCreated: (controller) {
        controller.addJavaScriptHandler(
            handlerName: "readClipboardText",
            callback: (args) async {
              return (await Clipboard.getData(Clipboard.kTextPlain))?.text ??
                  "";
            });
        controller.addJavaScriptHandler(
            handlerName: "writeClipboardText",
            callback: (args) async {
              final res = args.firstOrNull;
              if (res != null && res["text"] != null) {
                await Clipboard.setData(
                    ClipboardData(text: res["text"] as String));
              }
            });
      },
    );
```

---

以上です。貼り付け処理がブロックされるのはわかりますがコピーもできない理由がわからないです...
Ubuntu22.04でgitlab-ceを移植して困ったときの話

CentOS7からUbuntu22.04へGitlabを移行したときにSSHでの接続の違いに関して詰まったのが以下の2つの部分でした。

## SSHで有効な鍵がRSAではなくなっている

公式的には `ED25519` などを使うことを推奨しているため、以下の方法で鍵を作成してそちらを投入する方法。

```shell-session
$ ssh-keygen -t ed25519
```

今まで設定してきているRSA鍵をどうしても使いたい場合はこちらの設定を `/etc/ssh/sshd_config` に追記してsshを再起動する方法を行う。

```file:/etc/ssh/sshd_config
PubkeyAcceptedAlgorithms=+ssh-rsa
```

今後のセキュリティ上の問題としてRSAを許可することはお勧めされないと思われる。


## GITユーザのログインが制限されている

`auth.log` にて以下のようなエラーが発生している場合には 

```file:auth.log
User git not allowed because account is locked
```

`git` ユーザのログインが制限されているため、以下のような作業を行う。

1. パスワードを設定する

```shell-session
# usermod -p '*' git
```

2. gitのSSHログインを制限するために `/etc/ssh/sshd_config` に以下の設定を追記する

```file:/etc/ssh/sshd_config
Match User git
  PasswordAuthentication no
```
wslでledger その9

# 概要
wsl(wsl2じゃない)でledgerやってみた。
練習問題、やってみた。

# 練習問題
elixirで貸借対照表をtable表示せよ。

# サンプルコード

```
defmodule Vs do
	use Agent
	def start_link() do
		Agent.start_link(fn -> 
			[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
		end, name: __MODULE__)
	end
	def get(p) do
		Agent.get(__MODULE__, fn v ->
			Enum.at(v, p)
		end)
	end
	def set(p, x) do
		Agent.update(__MODULE__, fn v ->
			List.update_at(v, p, fn _ -> 
	            x
            end)
		end)
	end
end
defmodule Main do
    def print(nil) do
        IO.puts "ok"
    end
    def print(l) do
		#IO.puts l
		l = String.trim l
		l = String.replace(l, "    ", "  ")
		s = String.split(l, "  ")
		#IO.puts Enum.at(s, 0)
        #IO.puts "#{Enum.at(s, 0)} !#{Enum.at(s, 1)} !#{Enum.at(s, 2)}<br>"
        cond do
		Enum.at(s, 1) == "パソコン" ->
			Vs.set(0, Enum.at(s, 0))
		Enum.at(s, 1) == "棚卸資産" ->
			Vs.set(1, Enum.at(s, 0))
		Enum.at(s, 1) == "現金" ->
			Vs.set(2, Enum.at(s, 0))
		Enum.at(s, 1) == "車" ->
			Vs.set(3, Enum.at(s, 0))
		Enum.at(s, 1) == "Liabilities:借入金" ->
			Vs.set(4, Enum.at(s, 0))
		Enum.at(s, 1) == "資本金" ->
			Vs.set(5, Enum.at(s, 0))
		Enum.at(s, 1) == "利益剰余金" ->
			Vs.set(6, Enum.at(s, 0))
		true ->
			Vs.set(9, Enum.at(s, 0))
		end
    end
    def main() do
        csv = """
               -1030  Assets
                -150    パソコン
                -150    棚卸資産
                -330    現金
                -400    車
                 300  Equity
                 100    利益剰余金
                 200    資本金
               -1270  Expenses
               -1000    売上原価
                 -20    支払利息
                -100    減価償却費
                -150    税金（費用）
                1600  Income:売上
                 400  Liabilities:借入金
--------------------
                   0
"""
        Enum.map(String.split(csv, "\n"), fn l ->
			print(l)
		end)

        IO.puts """
<!doctype html>
<html>
<head>
</head>
<body>
<table border="1">
<caption><h2>貸借対照表</h2></caption>
<tbody>
<tr>
    <th scope="col" colspan="2" ><strong>資産の部</strong></th>
    <th scope="col" colspan="2" ><strong>負債の部</strong></th>
</tr>
<tr>
    <th >パソコン</th>
    <td >#{Vs.get(0)}</td>
    <th >借入金</th>
    <td >#{Vs.get(4)}</td>
</tr>
<tr>
    <th >棚卸資産</th>
    <td >#{Vs.get(1)}</td>
    <th ></th>
    <td ></td>
</tr>
<tr>
    <th >現金</th>
    <td >#{Vs.get(2)}</td>
    <th ></th>
    <td ></td>
</tr>
<tr>
    <th >車</th>
    <td >#{Vs.get(3)}</td>
    <th ></th>
    <td ></td>
</tr>
<tr>
    <th ></th>
    <td ></td>
    <th scope="col" colspan="2"><strong>資本の部</strong></th>
</tr>
<tr>
    <th ></th>
    <td ></td>
    <th >資本金</th>
    <td >#{Vs.get(5)}</td>
</tr>
<tr>
    <th ></th>
    <td ></td>
    <th >利益剰余金</th>
    <td >#{Vs.get(6)}</td>
</tr>
</tbody>
</table>
</body>
</html>
"""
	end
end
Vs.start_link
Main.main




```

# 実行結果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/06002e17-e551-6d28-e2c9-6e8b9ecd3107.png)


# 成果物

https://paiza.io/projects/H-PMyJLhlMxNUV0N9bgF3Q


以上。
WindowsによるPython入門 #09: 関数

# はじめに

今回は関数を解説します。

# YouTube動画

[]()

# 関数の定義

関数は、複数のコードをひとまとめにする機能です。
以下で関数を定義出来ます。
また、関数呼び出しに指定する引数を「実引数」、関数定義側の引数を「仮引数」と言います。

- 関数名は変数名と同じ規則
- 引数は複数指定可能
- 戻り値もタプルなどを使用すると複数指定可能 (return 文を使用)

```
def 関数名(引数):
    ブロック
```

具体例を見てみます。

```py
>>> def get_value(num):  # 仮引数 num を受け取り、1 + num を返す
...     return 1 + num
...
>>> get_value(2) + 3  # 2 は実引数
6
```

## キーワード引数

実引数側で仮引数の変数名を指定すると、引数を指定する順序を変更可能です。

```py
>>> def print_values(a, b, c):
...     print(f"a={a}, b={b}, c={c}")
...
>>> print_values(1, 2, 3)  # 引数は、順番に指定する必要がある
a=1, b=2, c=3
>>> print_values(c=3, b=2, a=1)  # 引数の指定順を変更可能
a=1, b=2, c=3
```

## デフォルト引数

仮引数にデフォルト値を設定可能です。
設定すると、実引数側で省略が可能になります。
またデフォルト引数の値は、関数の呼び出し時ではなく、関数の定義時に変数に代入されます。

```py
>>> def print_values(a, b=2, c=3):
...     print(f"a={a}, b={b}, c={c}")
...
>>> print_values(1)
a=1, b=2, c=3
>>> def get_list(lst=[]):  # デフォルト引数の値は、関数定義時に代入される
...     lst.append(1)
...     return lst
...
>>> get_list()
[1]
>>> get_list()
[1, 1]
```

## 可変長引数

「*」を使用すると、指定した残りの引数がタプルとしてまとめられます。
また、「**」を使用すると、指定したキーワード引数が辞書としてまとまられます。

```py
>>> def print_values(a, b, *args):
...     print(f"a={a}, b={b}, c={args}")
...
>>> print_values(1, 2, 3, 4)
a=1, b=2, c=(3, 4)
>>> print_values(1, 2, 3)
a=1, b=2, c=(3,)
>>> def print_values(a, **kwargs):
...     print(f"a={a}, k={kwargs}")
...
>>> print_values(1, b=2, c=3, d=4)
a=1, k={'b': 2, 'c': 3, 'd': 4}
```

# 無名関数 (ラムダ式)

lambda を使用すると無名関数を定義出来ます。
以下の構文を使用します。
関数の中身は、式 1 つのみを書く事が出来ます。

```
lambda 引数: 式
```

具体例です。

```py
>>> def get_double(func, num):
...     return func(num) * 2
...
>>> get_double(lambda a: a + 1, 10)  # func に無名関数を渡しています
22
```

# 何も実行しない文

何も実行しない文を使いたい場合、「pass」を使用出来ます。
ブロックには、式や文を最低でも 1 つ以上指定しないといけませんので、何も指定するものがない場合に使用されます。
また関数は、戻り値を指定しない場合、None を返します。

```py
>>> def do_nothing():
...     pass
...
>>> do_nothing()
```

# おわりに

以上、関数に関して解説しました。
次回は、クラスに関して解説します。
オンラインRPG「REDSTONE」（赤石）をウェブ移植してみた

#### REDSTONE（レッドストーン）という懐かしのMMORPGをウェブでプレイできるようにしてみた話

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576748/b252e6f7-490d-6eb7-e66b-d046fdd84b8b.png)
（移植できたのはまだ一部です）

![rs-web-showcase.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576748/21a018fe-2b9b-8d7e-84ba-4fadcd6b8819.gif)

## ブラウザでプレイできるデモ公開

とりあえず、**触ってみてもらうのが一番**なのでデモを置いておきます！
（ブラウザで開くだけでDLとか不要です）

#### Demo：https://rs.sigr.io/

https://rs.sigr.io/

-----

プロジェクトのソースコードも全部公開してます
#### Github: https://github.com/LostMyCode/redstone-js

https://github.com/LostMyCode/redstone-js

## 2023年12月 追記: MOB狩りできるようになりました

スキルで敵を攻撃して狩れるとこまで一旦実装できたので動画にしました

[YouTube: REDSTONEブラウザ移植版で狩りをしているデモを公開](https://youtu.be/EDfWIh6I244)

<iframe width="560" height="315" src="https://www.youtube.com/embed/EDfWIh6I244" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>


## WEB移植版プレイ動画

[Porting "RedStone Online" to HTML5](https://youtu.be/SgPJ1gGHntc)

<iframe width="560" height="315" src="https://www.youtube.com/embed/SgPJ1gGHntc" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>


## 移植しようと思った経緯

#### 前提として筆者は「普通はPCに時間をかけてダウンロードしてプレイするゲームをウェブページ開くだけでプレイできたら夢のようじゃない？」という思いを持ってますｗ


前回はGunZ (GUNZWEI, GunZ The Duel)という3Dゲームのマップをウェブで動かせるようにしました。

https://qiita.com/LostMyCode/items/c358410576bb65ea9259


このときのモチベは、「ゲームのコードが全部リークしてるので、同じようにデータを読んで描画すればいけるよね？？」というものでした。

今回ターゲットにしたレッドストーンも、サーバー側のファイルが最近リークしており誰かがリバースエンジニアリングしてC#で書き直したコードも発見したので「RSもウェブ移植いけそう！」と思ってやってみました。


前回は3Dゲームだったのでマップを表示するだけでやっとでしたが、今回は2Dということもあってマップの表示だけでなくNPCやモンスターのアニメーションやプレイヤーの移動も実装することができました。

こちらのデモ（ https://rs.sigr.io/ ）を触ってみて興味持たれた開発者の方がいらっしゃったらぜひプロジェクト参加お待ちしてます（今はひとりでやってて限界。。。）


## 技術まわり

全部ほぼJavascript。
REDSTONEのゲームファイルをそのまま読み込んでゲームを描画してますが、バイナリの読み込み部分も描画部分も全部Javascript完結で可能でした（JSｽｷｽｷ）

当たり判定やモンスター狩りをサーバーサイドで実装するとしても、これもNode.jsで書けば全部jsで完結しそうです

https://github.com/LostMyCode/redstone-js

#### ゲームの描画

ゲームの描画はpixi.jsライブラリを使用。

AnimatedSpriteのようにアニメーションするオブジェクトの描画を簡単にできるのが用意されてたりするので、とてもスムーズに開発が進みました

#### ゲームの解析と移植作業

解析～移植作業はにらめっこの繰り返し

マップのオブジェクト情報（テクスチャや配置）などをゲームファイルから読み込んで適当に描画してみる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576748/82400aeb-156b-f979-923d-2546da6efeff.png)

オブジェクトの位置やIDをtextとrectで表示

実際のゲーム画面が正解なので、そっとと自分の作ってる画面をにらめっこしながら「なんで位置違うんだろ？」「こうしたらどうなる？」など仮説を立てつつ試行錯誤


ゲーム画面のにらめっこだけではどうにもならないときは、バイナリとにらめっこします

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576748/380ef1db-f5fb-38d5-7ce2-90dce28f3eab.png)


（上のはちょっと違う画像ですが）「この84bytesがゲームのマップ内の１つの建物のデータかな？」とか
「この4bytesがオブジェクトの数？」みたいに仮説を立てます

書き換えてみてゲームを再起動して仮説と一致するかどうかという地道な作業をやっていきます。

## さいごに

#### 不可能はない！

Twitter: [@LostMyCode](https://twitter.com/LostMyCode)
【SwiftUI】角丸ボタン枠線ボタンのサンプル

個人的に使いやすいシンプルなボタンのサンプルです。
未来の自分のために残しておこうと思います。

Xcode Version 14.2


```WhiteButton.swift
import SwiftUI

struct WhiteButton: View {
    
    private var text : String
    var onTapped: () -> Void

    init(text: String,onTapped: @escaping () -> Void) {
        self.text = text
        self.onTapped = onTapped
    }
    
    var body: some View {
        Button(action: {
            onTapped()
        }) {
            Text(text)
                .lineLimit(1)
                .font(.system(size: 15, weight: .regular, design: .default))
                .foregroundColor(Color.secondaryColorBlue)
                .frame(width: 100,height: 45)
                .background( Color.white)
                .foregroundColor(Color.white)
                .overlay(RoundedRectangle(cornerRadius: 5).stroke(Color.mainBlue, lineWidth: 1))
                .cornerRadius(5)
        }
    }
}
```

![スクリーンショット 2023-02-12 18.17.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274615/a63caec9-05ed-d7f2-6841-f20631e93055.png)


ボタンタップ後の処理も渡せるので使いやすいかと思います。
大きさや、カラーなどはお好みで変更すれば良いと思います！
以上です。
AWS Amplify StudioのDataStoreで条件を絞ってデータを取得する方法

## 概要
最近、`AWS Amplify Studioではじめるフロントエンド+バックエンド統合開発`の書籍を購入してAmpify Studioの勉強してたらDataStoreを使用した問い合わせ方法が書籍の書いてある方法だとうまくいきませんでした。
[Amplify デベロッパー センター](https://docs.amplify.aws/lib/datastore/data-access/q/platform/js/#create-and-update)のドキュメントを読んで解決したのですが、どこかに残しておきたいなぁと、、

せっかくなので、Qiitaを使う側になってみようと思ったので執筆しました。

## やりたいこと
以下のようなModelに対してname情報を指定してデータ取得をしたい。

Model名: Board

Field name | Type
------ | -----
id | ID! 
message | String!
name | String
image | String
PersonID | Relationship Source

※ 最終的に以下の様にinputのイベントから取得できる様にします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2850024/f84a38da-6971-6dcc-983b-6b28b07306d2.png)

## やりたいことを実現したコード

```
function App() {
  const [content1, setContent1] = useState("")
  const [input, setInput] = useState("")
  const [find, setFind] = useState(input)

  useEffect (() => {
    const doChange = (e) => {
      setInput(e.target.value)
    }
    const doFilter = (e) => {
      setFind(input)
    }

    DataStore.query(Board, c => c.name.contains(find)).then(values => {
      const data = []
      for (let item of values) {
        data.push(
          <BoardComponent board={item} key={item.id} />
        )
      }
      setContent1(
        <div>
          <div className='mx-0 my-3 row'>
            <input type='text' className='form-control col' onChange={doChange} />
            <button className='btn btn-primary col-2' onClick={doFilter}>Click</button>
          </div>
          {data}
        </div>
      )
    })
  }, [input, find])
  return (
    略
  )
}

export default withAuthenticator(App)
```

## 書籍との違いについて

書籍との違いは大きく2つあります。

* DataStore.queryの引数の取り方
    * 書籍の方だと`DataStore.query(Board, ob=>ob.name("contains", find)).then(values=>{...略...}と`記載されていましたが、これだとデータが取得できません。
    * 私は最近Amplifyを使い始めたのでひょっとしたらこの書籍が執筆された当初はこれで上手くいっていた？
* doChange関数とdoFilter関数を記述する位置
    * useEffectの外にこれらの関数を記述するとESLintが`[input, find]`の箇所でWarningをあげてきます。
    * 特に問題があるWarningではないので、`// eslint-disable-next-line no-unused-vars`などをWarningが出ている箇所の上の行に差し込んでもいいと思います。

## 参照
掌田津耶乃 . AWS Amplify Studioではじめるフロントエンド+バックエンド統合開発 . 2022年8月31日 , 初版 , p.211-215 .
[Amplifyデベロッパーセンター(データストア > データの操作)](https://docs.amplify.aws/lib/datastore/data-access/q/platform/js/#predicates), （参照 2023-02-12）.
【Python】複数宛先に対して同時にping送信してみた

### 　pingを並行処理しようと思った経緯

とある炎上プロジェクトで先輩が私に

「cmdを複数立ち上げてもいいから、全拠点同時にpingを打って疎通確認してほしい。モニターが足りなければ増やしてもいいから実施してね。」

話を聞いた当初は「Expingで良くね？」と思いましたが、Expingは並列でping送信できないんですよね。。。

結局、モニターを追加する余裕もなく宛先が120個ほどありましたので、以下の方法で実施しました。
・Expingの疎通間隔を短くして1拠点2秒~3秒間隔でpingできるように調節

けど正直複数宛先に同時pingは割りと簡単に実装できるのではないのか？と思い、pythonでコードを書いてみました。

### 　multi_subprocess.py

```python
import subprocess
from multiprocessing import Process, Manager
import time

def ping_host(ip, queue):
    result = subprocess.run(['ping', ip, '-n', '1', '-w', '1'], stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
    output = result.stdout.strip()
    if "TTL=" in output:
        queue.put((ip, "○"))
    else:
        queue.put((ip, "☓"))

def run_parallel_pings(ips):
    start_time = time.time()
    with Manager() as manager:
        queue = manager.Queue()
        processes = [Process(target=ping_host, args=(ip, queue)) for ip in ips]

        for process in processes:
            process.start()

        for process in processes:
            process.join()

        while not queue.empty():
            print(queue.get())
    end_time = time.time()
    
    print(f"Time taken: {end_time - start_time:.2f} seconds")



if __name__ == '__main__':
    with open('ips.txt') as f:
        ips = f.read().splitlines()
    
    run_parallel_pings(ips)
```

### 　ips.txt
```
192.168.11.1
192.168.11.5
8.8.8.8
1.1.1.1
2.2.2.2
3.3.3.3
4.4.4.4
5.5.5.5
6.6.6.6
7.7.7.7
8.8.8.8
9.9.9.9
0.0.0.0
```

### コード解説
```python
def ping_host(ip, queue):
```
pingを実施する関数です。


```python
result = subprocess.run(['ping', ip, '-n', '3', '-w', '1'], stdout=subprocess.DEVNULL)
```
subprocessはコマンドを実行するためのモジュールで、subprocessモジュールを使いpingを実行します。
オプションについて以下に説明を記載します。
    -n：パケット送信回数
    -w：タイムアウト時間

"stdout=subprocess.DEVNULL"は標準出力を無視することを意味します。なのでcmdにping実施中の表示がされません。



```python
if result.returncode == 0:
```
result.returncodeに終了結果が格納されており
成功：0
失敗：0以外
となります。

成功すればIPアドレスと”○”が変数queusに格納され、
失敗すればIPアドレスと”☓”が変数queusに格納されます。




```python
def run_parallel_pings(ips):
```
pingを並列処理する関数です。


```python
processes = [Process(target=ping_host, args=(ip, queue)) for ip in ips]
```
先程のpingを実行する関数をIPアドレス毎にサブプロセスを作成しています。



```python
for process in processes:
    process.start()
```
先程作成したサブプロセスを実行します。



```python
for process in processes:
    process.join()
```
実行処理が終了したサブプロセスをメインプロセスへ戻します。


```python
while not queue.empty():
    print(queue.get())
```
サブプロセスが全て終了していることを確認して、
終了している場合は、サブプロセス毎の結果を表示する。



```python
with open('ips.txt') as f:
    ips = f.read().splitlines()
```

ips.txtに記載しているIPアドレスをリスト化します。

### 表示結果
```
('192.168.11.1', '○')
('192.168.11.5', '○')
('8.8.8.8', '○')
('8.8.8.8', '○')
('0.0.0.0', '☓')
('1.1.1.1', '○')
('9.9.9.9', '○')
('3.3.3.3', '☓')
('2.2.2.2', '☓')
('7.7.7.7', '☓')
('4.4.4.4', '☓')
('6.6.6.6', '☓')
('5.5.5.5', '☓')
Time taken: 4.33 seconds
```
pingは1回1秒間隔で3回実施なので理論値3秒で表示されるはずですが、結果は4秒で表示されました。

### まとめ
並列処理はできましたがping処理が1回きりなのでこれでは先輩は満足しないでしょう。
なので次は以下を実装します。
・ExpingのようなGUIで表示
図解 RDS Proxy

# 背景

RDS Proxyの公式を読み、図に起こした。

https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/rds-proxy.html

---

![無題のプレゼンテーション-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79697/928e274c-b0c9-5ecc-e047-5f7a71f5ffca.png)

---

![無題のプレゼンテーション-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79697/620b743c-0992-b135-7b9b-de64115b250e.png)

---

![無題のプレゼンテーション-03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79697/3cbbc56a-20a0-7310-1deb-faf02c71914b.png)

---
![無題のプレゼンテーション-04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79697/0f846597-0e47-b268-825f-8b5dceae93c0.png)

---

![無題のプレゼンテーション-05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79697/40181bba-47f8-d5d5-b86e-ecf63b76e988.png)

---

![無題のプレゼンテーション-06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79697/bc15be03-d83c-2ae4-fc2f-7626cc93dff8.png)

---

![無題のプレゼンテーション-07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79697/e7af1cb9-df58-bee8-4249-bb407129f464.png)

---


![無題のプレゼンテーション-08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79697/0db67b7c-fcb9-339c-a2c5-6091e7091106.png)

---

![無題のプレゼンテーション-09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79697/7d650ff7-0293-c505-adc5-f2cd61a9a926.png)

---

![無題のプレゼンテーション-10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79697/c16dea70-35f0-4ebe-0d51-a522bcf15d6f.png)

---

![無題のプレゼンテーション-11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79697/854c7be3-af35-f8bb-9803-8eba16db20c1.png)

---

![無題のプレゼンテーション-12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79697/81e5da2c-2d79-41d4-5a95-6d92a0e4ccbb.png)

---

![無題のプレゼンテーション-13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79697/28fd1c1f-a7a5-302b-87e9-888ce282d846.png)

---

![無題のプレゼンテーション-14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79697/f9651c36-f9e7-93be-e116-351ef7866a3f.png)

---


![無題のプレゼンテーション-15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79697/4dcdc0f6-bac8-3f40-9b0a-b6082c2d3660.png)

---


![無題のプレゼンテーション-16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79697/7ab28161-8664-375f-2e4b-158ca57b5c1f.png)

---


![無題のプレゼンテーション-17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79697/1f78709d-75a8-a3f8-d552-22a6547982ce.png)
Miroでシステム化要件【動く画面遷移図】

## はじめに

オンラインホワイトボードツール「Miro」にはワイヤーフレームを作成する機能が備わっています。

以前このワイヤーフレーム作成機能を使って、システム化要件の際に必要となる[「画面イメージ／画面レイアウト」の作成](https://qiita.com/tamaday/items/b46413b5620849c89b08)についてご紹介しました。


今回は「画面遷移図」と「Miro」での描き方について、ご紹介します。

## 画面遷移図の役割

まずは、「画面遷移図」の役割をまとめます。

| ドキュメント | 役割                                                                                                                             |
| ------------ | -------------------------------------------------------------------------------------------------------------------------------- |
| 画面遷移図   | **開発する画面がどのように遷移するか示し、相互関係を理解する**<br> 画面内にある全てのリンクやボタンを対象とする <br>戻りの遷移も示す |

## Miro のオブジェクトリンク機能

まずは[前回](https://qiita.com/tamaday/items/b46413b5620849c89b08)と同様に「ワイヤーフレームライブラリ」ツール選択し、画面図を作成します。

次に、遷移先の図をクリック → 右上の「…」をクリック →「リンクをコピー」を選択します。
![miroSystemRequiretrans_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2962887/684c8a77-dd63-5552-f8ac-f5e941172623.png)

そして、遷移元の図クリック → 右上の「…」をクリック →「オブジェクトをリンク」を選択し、先ほどコピーした遷移先の図のリンクを貼り付けます。
![miroSystemRequiretrans_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2962887/e86d6e92-f0b8-d40b-8dfb-e20b87f7308c.png)

そうすると、遷移元の図に矢印ボタンが表示されます。
この矢印ボタンをクリックすると、遷移先の図に自動で画面が移動する、動的な画面遷移図を作成することが可能です。

実際にこのような動く画面遷移図を作成することができます。
（↓動画が再生されない場合は、クリックしてください。）
![miroSystemRequiretrans_01.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2962887/e84a1a3d-0d4d-4f80-ae9b-42782f54f220.gif)
画面遷移図全体
![miroSystemRequiretrans_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2962887/b10086b6-a72d-c13a-8652-624a052a4104.png)

## 公式サイト

Miro[（公式サイト）](https://miro.com/ja/)

ご参考になれば幸いです。最後までお読み頂きありがとうございます。

## 関連した投稿
[Miroでシステム化要件【画面イメージ／画面レイアウト】](https://qiita.com/tamaday/items/b46413b5620849c89b08)
[要件定義で使用するフロー図の違い](https://qiita.com/tamaday/items/d5bfd722e3390b5a669e)
[Miroでファイルをエクスポートする方法](https://qiita.com/tamaday/items/cd3bfd4cb1a15360fe63)
[Miroはまず何から始めたらいいのか？](https://qiita.com/tamaday/items/091116a575278bc1441e)
[Miroのボードは無料版だと全世界に公開される？](https://qiita.com/tamaday/items/82e7b9dfd70692488dd2)
Integrity Level 全部言えるかな？


# Integrity Levelとは
Integrity Level(長いので以下IL)は、Windowsにおいてセキュリティのために設けられている1つの仕組みです。  
レベルということで、高低があります。  
プロセス(より正確にはトークン)に設定され、ILが低いプロセスはレジストリ、ファイル、他プロセスへのアクセスなどの様々な面において制約を受けます。

## 必要性
冒頭にも書きましたが、セキュリティのために必要です。  
これがないとマルウェアが、簡単にやりたい放題できてしまいます。  
また、マルウェアに限らずユーザー自身がシステムのレジストリやファイルを誤って消してしまう、という事故も防ぐ事ができます

## 早見表
[こちら](https://learn.microsoft.com/en-us/windows/win32/secauthz/well-known-sids)から引っ張って来ました。初めて見るレベルもあったのは内緒です。  

**Untrusted < Low < Medium < Medium Plus < High < System < Protected Process**  

Well-Known Sidにはありませんが、**AppContainer**もよく使用されます。
また、**Installer**というものも存在します。

### ピックアップ
* Medium
  一般ユーザーおよび、昇格可能ユーザーが普通にプロセスを起動した場合のレベルです。これが基準になります。
* Untrusted
* AppContainer
  ブラウザや、ストアアプリ、Steamなどがサンドボックス環境を用意するためにあえて使用しています。

# 確認の仕方
手っ取り早く、[Process Explorer](https://learn.microsoft.com/en-us/sysinternals/downloads/process-explorer)を使用してみてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595099/3a70f2d3-1226-fb6d-a7f4-7d30964e9286.png)

# 上げ下げ
## 普通にやる
管理者ユーザーの場合、立ち上げたプロセスはそもそもHighになっています。
 一般ユーザーや昇格可能ユーザーの場合はプロセスを「管理者として実行」を行う事で昇格が可能です。  
また、exeファイルに管理者権限が必要なマニュフェストが設定されている場合は、自動的に昇格確認画面が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595099/96105044-ddd3-8b43-1df0-af0158d16dfb.png)

## コーディング
[SetTokenInformation](https://learn.microsoft.com/en-us/windows/win32/api/securitybaseapi/nf-securitybaseapi-settokeninformation?redirectedfrom=MSDN)というAPIでトークンにILのSIDを指定してセットしてください。  
そのトークンを使用して[CreateProcessAsUserW](https://learn.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-createprocessasuserw)を行えば、設定したILのプロセスが立ち上がります。
```cpp:title
#include <stdio.h>
#include <windows.h>
#include <sddl.h>

int main()
{
	HANDLE hToken = NULL;
	HANDLE hNewToken = NULL;

	if (!::OpenProcessToken(GetCurrentProcess(), MAXIMUM_ALLOWED, &hToken))
		return 0;

	if (DuplicateTokenEx(hToken, MAXIMUM_ALLOWED, NULL, SecurityImpersonation, TokenPrimary, &hNewToken))
	{
		WCHAR wszIntegritySid[20] = L"S-1-16-4096";//Low
		PSID pIntegritySid = NULL;
		TOKEN_MANDATORY_LABEL TIL = { 0 };
		PROCESS_INFORMATION ProcInfo = { 0 };
		STARTUPINFO StartupInfo = { 0 };
		if (::ConvertStringSidToSidW(wszIntegritySid, &pIntegritySid))
		{
			TIL.Label.Attributes = SE_GROUP_INTEGRITY;
			TIL.Label.Sid = pIntegritySid;
			if (::SetTokenInformation(hNewToken, TokenIntegrityLevel, &TIL, sizeof(TOKEN_MANDATORY_LABEL) + GetLengthSid(pIntegritySid)))
			{
				if (::CreateProcessAsUserW(hNewToken, L"C:\\Windows\\system32\\notepad.exe",
					NULL, NULL, NULL, FALSE, 0, NULL, NULL, &StartupInfo, &ProcInfo))
				{
					::CloseHandle(ProcInfo.hThread);
					::CloseHandle(ProcInfo.hProcess);
				}
			}
			::LocalFree(pIntegritySid);
		}
		::CloseHandle(hNewToken);
	}
	::CloseHandle(hToken);
	return 0;
}
```

# 最後に
Medium PlusとProtectedはこの記事を書くに当たって、初めて知りました。  
InstallerのILが載っていないことも考えると、まだ見ぬILがあるかも知れない。  
他のILを知っている方がいたら教えてください。  


関連記事  
[Hack Tricks Integrity Levels](https://book.hacktricks.xyz/windows-hardening/windows-local-privilege-escalation/integrity-levels)
【Java基礎】if構文-1

［問題］　　(参照：http://www.cc.kyoto-su.ac.jp/~mmina/bp1/hundredKnocksBasic.html)
整数値を入力させ、値が0ならzeroと表示するプログラムを作成しなさい。

# コード
```Java
import java.util.*;

public class Main {
    public static void main(String[] args) throws Exception {
        Scanner sc = new Scanner(System.in);
        int t = sc.nextInt();
        if(t == 0){
            System.out.println("zero");
        }
    }
}
```

↓「０」と入力

# 結果
```
zero
```


★注意！
1文字の時・・・「' '」
2文字以上・・・「" "」
Rails7のdeviseで、link_toでログアウトできない

# 現象

Rails7でdeviseによる認証を追加した際、ログアウトのリンク作成する場合、

```
= link_to 'ログアウト', destroy_user_session_path, method: :delete
```
ではうまく動きませんでした。

# エラー
``No route matches [GET] "/users/sign_out"``
![スクリーンショット 2023-02-12 17.47.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118481/4ef60eb3-de1e-2749-3a24-31a481a66723.png)

とのことなので、DELETEのつもりがGETになってしまっているようですね。

# 解決方法

button_toに変更すれば良いという記事もありましたが、link_toのままでやりたい場合は、
次のように指定してあげるとうまく動くようです。

```
= link_to 'ログアウト', destroy_user_session_path, data: { turbo_method: :delete }
```

ログアウトのリンクだけでなく、データの削除リンクも同じパターンで出来そうですね✨
OpenAIのGPT-3.5系APIを使って論文を自動で要約する

![Cursor_と_arxiv_summarizer_ipynb_-_Colaboratory.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2958603/d7eef3da-4f3a-b495-d4a1-1f68138fa7df.png)

こんにちは！逆瀬川 ( https://twitter.com/gyakuse ) です！
今日は論文をGPT-3.5系API用いて要約してみようと思います。
プロンプトエンジニアリングの参考にもなるかもしれません。

論文全体の自動翻訳はこちら:

https://qiita.com/sakasegawa/items/f50aae7f3acf475411aa

※OpenAI GPT-3.5シリーズには code-davinci-002, text-davinci-002, text-davinci-003 が含まれます (https://platform.openai.com/docs/model-index-for-researchers)

## 概要

主にArXivに投稿されている英語論文を **セクション単位** で要約するものです。
文章抽出には今回は[GROBID](https://github.com/kermitt2/grobid)を用い、要約にはGPT-3.5を使います。

## OpenAI APIについて

- サインアップ
    - https://platform.openai.com/
- キーの取得
    - https://platform.openai.com/account/api-keys
- 備考
    - API使用料金は、1k tokenで 0.02 ドルかかり、論文1本あたりおおよそ40円程度かかります。
    - https://openai.com/api/pricing/

なおOpenAIを使わずに安価にするためには、セクションごとに要約処理を別のモデルで行ったあと、翻訳するとよいです。ArXiv要約用事前学習モデルは以下などがあります。

- https://huggingface.co/kworts/BARTxiv
- https://huggingface.co/farleyknight/arxiv-summarization-t5-base-2022-09-21

なお、BARTxivを用いて要約処理する例を以下に書いた:
[BARTxiv (論文要約) x fugumt (翻訳) x GROBID (PDF論文抽出)で論文要約を自動化する
](https://zenn.dev/sakasegawa/articles/7539c2dea7349c)

## Colab

https://colab.research.google.com/drive/1VE7u_-WIkoqvepmXxKT3VnnJXbhFJj_2?usp=sharing

- openai_keyを入力後、ランタイム > すべてのセルを実行をクリック
- ファイル選択をクリックして、翻訳したいpdfを選択
- 処理が終わると一番下に要約テキストが表示されます🎉

## 処理の流れ

- GROBIDで論文から文章抽出 (XMLとして保存される)
- xmlをパースしてセクションを取り出す
- セクション単位で要約タスク用プロンプトを作り、OpenAIに渡す

## 実装

### プロンプトの構築

```py
def create_prompt(english_title, english_section_title, english_bodytext):
    return f"""英語の研究論文の一部を日本語で要約するタスクを行います。
これは「{english_title}」というタイトルの論文の「{english_section_title}」というセクションの文章です。
以下のルールに従ってください。

・リスト形式で出力する (先頭は - を使う)
・簡潔に表現する
・不明な単語や人名と思われるものは英語のまま表示する

それでは開始します。

英語の論文の一部:
{english_bodytext}

日本語で要約した文章:"""
```

GPT-3.5の場合はzero-shot性能が高いので、そのまま渡してあげます。
なお、リスト形式で出力させるときに、`(先頭は - を使う)`という文言が形式の安定化に寄与しました (これを抜くと、「・」や「-」や「1.」といった色んな種類のリスト形式になってしまいました)

### OpenAIに投げる

温度やfrequency_penaltyはいい感じに調整しましょう。

```py
def completion(text):
    openai.api_key = openai_key
    response = openai.Completion.create(
        engine="text-davinci-003",
        prompt=text,
        max_tokens=1200,
        temperature=0.7,
        frequency_penalty=1.0,
    )
    return response['choices'][0]['text']
```

## 後記

- 論文のサーベイ等の支援ツールは以下で紹介されています
    - https://twitter.com/naoya_0504/status/1623640221593251840
    - ```
        1.　Paperpile、Zotero：無料で論文管理
        2.　Connected Papers：関連論文が視覚的に
        3.　Elicit、Perplexity：AIが論文検索
        4.　SCISPACE：論文の要約など
        5.　Shaper & DeepL：翻訳コンビ
        6.　Grammarly、DeepL Write：英文のブラッシュアップ
       ```
- ArXivにおけるCS論文は月8,000本にも達し、今後さらにこうしたツールが必要になるかもしれません
- なお、新しいBing付属のChatGPTはこうした要約処理を対話的に行えるようになっていきそうです
    - https://twitter.com/_daichikonno/status/1624625728137629696
- 一方で、論文を静的にサーベイする場合、このような要約処理が事前に行われていると嬉しいので、CC-0, CC-BY, CC-BY-SA, CC-BY-SA-NC系ライセンスの論文を対象に(ArXivでは新規投稿論文の50%程度がそれらのライセンス下にあります)、何らかの形で無償サービスとして展開できればなぁと思います
【Java基礎】四則演算

［問題］　　(参照：http://www.cc.kyoto-su.ac.jp/~mmina/bp1/hundredKnocksBasic.html)
整数値を2つ入力させ、それらの値の和、差、積、商と余りを求めるプログラムを作成しなさい。
なお、差と商は1つ目の値から2つ目の値を引いた、あるいは割った結果とする。余りは無い場合も0と表示するのでよい。


# コード
```Java
import java.util.*;

public class Main {
    public static void main(String[] args) throws Exception {
        Scanner sc = new Scanner(System.in);
        int t = sc.nextInt();
        int u = sc.nextInt();
        System.out.println(t+u);
        System.out.println(t-u);
        System.out.println(t*u);
        System.out.println(t/u);
        System.out.println(t%u);
    }
}
```

↓
8
2　と入力

# 結果
```
10
6
16
4
0
```
Python学習、ボール取り出しゲームの作成

こんちわ、kmdです。

学習３週間目です。
今回はこのような問題を解いていきました。
↓ 参考サイト
https://joytas.net/programming/python/python%E6%BC%94%E7%BF%92%E5%95%8F%E9%A1%8C%E5%88%9D%E7%B4%9A

```
1~99の番号のついたボールが計99個入っている袋
その中から2人が交互にボールを取り出し大きい数を引いた方が勝ちとなる。
ゲームは５回戦で競う。
なお、取り出したボールは袋に戻さないものとする(同じボールを二度ひくことはない)
```

```ballgame.py
import random

def game():
    balls=list(range(1,100))
    random.shuffle(balls)
    playerwin = 0
    comwin = 0
    for i in range(5):
        player = 0
        com = 0
        player = balls[i]   #プレイヤーにリストのi番目
        com = balls[i + 5]  #コンピュータにリストのi ＋１番目
        print(i + 1, '回戦目(あなた、コンピュータ)：\n',  player, '    ', com)
        if player > com:
            playerwin = playerwin + 1
        elif player < com:
            comwin = comwin + 1
    if comwin < playerwin:
        print('勝利数が', playerwin, '回のため、あなたの勝ちです！！')
    else:
        print('敗北数が', comwin, '回のため、あなたの負けです…')
game()
```


コードの出力例はこちら
```
1 回戦目(あなた、コンピュータ)：
 58      48
2 回戦目(あなた、コンピュータ)：
 85      26
3 回戦目(あなた、コンピュータ)：
 60      41
4 回戦目(あなた、コンピュータ)：
 30      77
5 回戦目(あなた、コンピュータ)：
 62      83
勝利数が 3 回のため、あなたの勝ちです！！
```

今回はfor文を利用したものを作ってみました。
勝利数のカウントなどはもっと工夫できたかなと思います。
こういう問題って就活のSPI問題でよく見ましたよね。
マジで悪夢を思い出します…

プログラミングの基本をまだ理解できていないのですが次はDBを利用してみたいです。

-----2/12追記-----
コメントのほうでミスのほう教えてくれてありがとうございました！
もともとのコードは下記のようなものになっていました。
◇回戦目…ってのが０から始まってましたね…w
それと一番重要なボールの数字がi + 1でリストから出す方法のために、２回戦目３回戦目で再登場してしまうという凡ミス。




```間違ってるやつです.py
for i in range(5):
        player = 0
        com = 0
        player = balls[i]   #プレイヤーにリストのi番目
        com = balls[i + 1]  #コンピュータにリストのi ＋１番目
        print(i, '回戦目(あなた、コンピュータ)：\n',  player, '    ', com)
```
・修正としては試合回数は
「i + 1」にすることで１からカウントできるように対応

・同じ数字が出力されてしまうのには
comでリストから出力する番号を+5にすることで、playerと被らないように修正。
playerは0～4番を
comは5～9番を選択するようにしました。

以上、ありがとうございました。