OmniAICreator/Qiita-1.07M huggingface dataset:
reset.cssによる違いを実際に比べてみた

## はじめに
開発を進めていく中でブラウザによるデザインの違いが発生した事があり
その時にreset.cssを知ったのでどんなreset.cssがあってどんな違いがあるのかを
次回のプロジェクトを立ち上げた時の役に立つと思って比べてみました。

## 対象者
この記事は下記のような人を対象にしています。

- 駆け出しエンジニア
- プログラミング初学者
- 今からプロジェクトを立ち上げようとしている方

## reset.cssとは
Webページはブラウザによってそれぞれデフォルトでスタイルを持っているため
その要素に当たっているデフォルトのスタイルをキャンセルする(resetする)
スタイルを当てるcssファイルの事です。

スタイルをリセットしておかないと開発時に確認しているブラウザでは
想定通りのスタイルが当たっているが、それ以外のブラウザでは
上手くデザインが表現できていないという事が発生してしまいます。

デメリットとしては当然デフォルトで当たっているスタイルを
リセットしてしまうのでスタイリングする手間が増える場合があります。

## デフォルトでのブラウザ間での見え方の違い
```typescript
<div>
  <div style={{background:"blue", width:'100%',height:'50px'}}>divタグ</div>
  <h1 style={{background:"red", width:'100%'}}>h1タグ</h1>
  <h2 style={{background:"green", width:'100%'}}>h2タグ</h2>
  <p style={{background:"orange", width:'100%'}}>pタグ</p>
  <button style={{background:"pink", width:'100%'}}>buttonタグ</button>
</div>
```
![image1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3329093/15540c9f-0c1e-c391-4390-809a86bc53a2.png)
左からedge、Safari、Chrome

代表的なタグを見てみると
- 文字のスタイル
- padding
- buttonのデザイン
などの違いが発生している事がわかると思います。

## 様々なreset.cssを適応してみる
### A (more) Modern CSS Reset
https://piccalil.li/blog/a-more-modern-css-reset/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3329093/a40e06aa-44ee-9b3d-9730-44d912faac4a.png)
<br>
<br>
### mayank99/reset.css
https://github.com/mayank99/reset.css/blob/main/package/index.css

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3329093/e722b66b-f0f3-8ef5-e04f-5232a4e6c58d.png)
<br>
<br>
### A Modern CSS Reset
https://www.joshwcomeau.com/css/custom-css-reset/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3329093/8586771b-afc6-9ad8-5b2b-8abda1b6294d.png)

<br>
<br>
### elad2412 the-new-css-reset

https://github.com/elad2412/the-new-css-reset/blob/main/css/reset.css

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3329093/1143eb98-e73f-ea7a-c16e-8798cf557c4e.png)
<br>
<br>
### necolas normalize.css
https://github.com/necolas/normalize.css/blob/master/normalize.css

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3329093/a95fddaf-9614-2cf1-778c-cc9bcd99d0d6.png)



## 結論
ただcssをリセットするだけではありますが、いろいろな種類があり
それぞれが特徴を持っている事がわかった


## おわりに
使ってみた感想ですが、どれもそれぞれメリットデメリットがあるので
一番プロダクトに合っている、自分に合っているものを
使用して使いづらい部分をオリジナルにする方法がベストなのではないかと
感じました。

最後まで読んで頂きありがとうございました。
少しでも参考になったと思ったらいいね！お願いします


## 参考記事
https://coliss.com/articles/build-websites/operation/css/css-reset-for-modern-browser.html
アプリの収益がすぐわかる！Flutter × RevenueCat × Slackで課金イベントをリアルタイム通知

## 1. はじめに

モバイルアプリでの課金機能は、収益を得るために欠かせない重要な要素です。しかし、その裏側には、課金の管理やサブスクリプションの維持など、多くの手間がかかります。ここで登場するのが[**RevenueCat**](https://www.revenuecat.com/)です。RevenueCatは、複雑な課金管理をシンプルにし、サブスクリプションやアプリ内購入を簡単に扱うことができる強力なツールです。

今回は、そんなRevenueCatを使って課金が発生した際に**Slack**でリアルタイム通知を受け取るシステムを構築します。例えば、アプリ内でユーザーが新たにサブスクリプションを開始した際に、即座にSlackでその情報をキャッチできれば、プロダクトの動向をリアルタイムで把握し、チーム全体が同じ情報を共有することができます。これにより、マーケティング戦略の調整やカスタマーサポートの迅速化にもつながります。

RevenueCatには、標準で[Webhook機能](https://www.revenuecat.com/docs/integrations/webhooks)が用意されていますが、無料プランでは利用できません。しかし心配は不要です。今回は、Slackが提供する**Webhook**を利用して、課金イベントをトリガーにして通知を受け取る仕組みを自前で構築していきます。

この記事では、すでにFlutterアプリにRevenueCatを統合し、課金処理が実装されていることを前提に、Slackへの通知部分にフォーカスして解説します。それでは、さっそく始めましょう！

## 2. Slack Webhookの発行

まずは、SlackでIncoming Webhookを作成し、通知を送信するURLを取得します。

### 手順：
1. [Slack APIのWebhooksページ](https://api.slack.com/messaging/webhooks)を参考にWebhookを送るためのSlack Appを作成。
2. Incoming Webhookを有効にします。
3. 発行されたWebhook URLをコピーします。このURLを使って通知を送信します。

## 3. 課金イベントのキャッチ

RevenueCatの`addCustomerInfoUpdateListener`メソッドを使って、購読イベントが発生した時に通知をキャッチします。

例：購読が成功したときにイベントをキャッチするコード
```dart
import 'package:purchases_flutter/purchases_flutter.dart';

void setupRevenueCat() async {
  // RevenueCatの初期化
  await Purchases.configure(PurchasesConfiguration("YOUR_REVENUECAT_API_KEY"));

  Purchases.addCustomerInfoUpdateListener((customerInfo) {
    // 課金（サブスクリプション）がアクティブかどうかを確認
    if (customerInfo.entitlements.all["your_entitlement_id"]?.isActive == true) {
      // 購読がアクティブの場合にSlackに通知を送信する
      sendSlackNotification();
    }
  });
}
```

このコードでは、`Purchases.addCustomerInfoUpdateListener`を使用して課金イベントをキャッチしています。ユーザーが購読しているかどうかを確認し、購読がアクティブであれば、次のステップでSlack通知を送信します。

## 4. Slack通知の実装
httpパッケージを使用して、Slack Webhookにリクエストを送信します。Flutterのhttpパッケージは依存関係に追加する必要があります。

### 依存関係の追加
```shell
flutter pub add http
```

### Slackに通知を送信するコード
次に、Slackに通知を送るための関数を実装します。

```dart
import 'dart:convert';
import 'package:http/http.dart' as http;

Future<void> sendSlackNotification() async {
  const url = 'YOUR_SLACK_WEBHOOK_URL'; // 取得したSlack WebhookのURLを入力

  final message = {
    'text': '新しい課金イベントが発生しました！'
  };

  final response = await http.post(
    Uri.parse(url),
    headers: {'Content-Type': 'application/json'},
    body: jsonEncode(message),
  );

  if (response.statusCode == 200) {
    print('Slackに通知を送信しました');
  } else {
    print('Slackへの通知に失敗しました: ${response.statusCode}');
  }
}
```

この関数では、SlackのWebhook URLにPOSTリクエストを送信し、通知メッセージを送ります。課金イベントが発生した際に`sendSlackNotification`関数が呼ばれるように設定しておけば、リアルタイムでSlackに通知が届くようになります。


## 5. まとめ

簡単にRevenueCatとSlackを連携させ、課金イベントをリアルタイムでSlackに通知できました。他にも、メールやGoogle Sheets、または他のAPIと連携させることも可能です。さらに、通知内容を詳細化したり、Slackのチャンネルごとに異なるイベント通知を実装することもできます。

良いサブスクリプションライフを！！！

## 999. 参考

https://www.revenuecat.com/docs/getting-started/quickstart#reacting-to-subscription-status-changes

https://api.slack.com/messaging/webhooks
Azure Functionsのキュートリガーでキュートリガーが動くが関数が呼び出されないことを調べたメモ

# 概要
下記のように、関数が何も実行されずポイズンキューに移動したことのみが表示される。

```

        storageQueueTrigger1: queueTrigger

For detailed output, run func with --verbose flag.
[2024-09-18T23:34:50.594Z] Message has reached MaxDequeueCount of 2. Moving message to queue 'character-queue-poison'.
```

# 原因

トリガー側ではなく、キューに入れる側の問題。base64で入れなくてはならない。
分かりにくすぎる、、！

# 修正

## base64エンコードする方法

[ソースコード](https://github.com/hibohiboo/async-ttrpg/blob/e22e49b70482ded820e6d9698269bbeab82515f5/apps/api/src/lib/sendQueueAndBlobContainer.ts)

```diff
/* eslint-disable @typescript-eslint/no-explicit-any */
import { ContainerClient } from '@azure/storage-blob';
import { QueueClient } from '@azure/storage-queue';

type SendQueueAndBlobArgs = {
  containerClient: ContainerClient;
  queueClient: QueueClient;
  blobPath: string;
  blobData: string;
  messageTimeToLive: number;
  logger: {
    log: (...args: any[]) => void;
    info: (...args: any[]) => void;
    error: (...args: any[]) => void;
  };
};

export const sendQueueAndBlobContainer = async (
  args: SendQueueAndBlobArgs,
): Promise<void> => {
  const {
    containerClient,
    queueClient,
    blobPath,
    blobData,
    messageTimeToLive,
    logger,
  } = args;

  const blobClient = containerClient.getBlockBlobClient(blobPath);
  const blobResponse = await blobClient.upload(blobData, blobData.length);

  logger.info(
    `Uploaded blob "${blobPath}". Request Id: ${blobResponse.requestId}. Client Request Id: ${blobResponse.clientRequestId}. Container: ${containerClient.containerName}`,
  );

  const queueMessage = {
    containerName: containerClient.containerName,
    blobPath,
  };

  const queueResponse = await queueClient.sendMessage(
-    JSON.stringify(queueMessage),
+    jsonToBase64(queueMessage),
    {
      messageTimeToLive,
    },
  );

  logger.info(
    `Sent message to queue "${queueClient.name}". Message Id: ${queueResponse.messageId}. Request Id: ${queueResponse.requestId}. Client Request Id: ${queueResponse.clientRequestId}`,
  );
};
+ function jsonToBase64(jsonObj: unknown): string {
+   const jsonString = JSON.stringify(jsonObj);
+   return Buffer.from(jsonString).toString('base64');
+ }
```


**参考**

[Azure Function Queue Trigger V2 がメッセージを読み取らない](https://learn.microsoft.com/en-us/answers/questions/1376071/azure-function-queue-trigger-v2-not-reading-the-me)

## 別解: host.jsonを編集する方法

```diff:host.json
{
  "version": "2.0",
  "logging": {
    "applicationInsights": {
      "samplingSettings": {
        "isEnabled": true,
        "excludedTypes": "Request"
      }
    }
  },
  "extensions": {
    "http": {
      "routePrefix": ""
    },
    "queues": {
      "maxDequeueCount": 3,
+      "messageEncoding": "none"
    }
  },
  "extensionBundle": {
    "id": "Microsoft.Azure.Functions.ExtensionBundle",
    "version": "[4.*, 5.0.0)"
  }
}

```

参考

[host.json設定](https://learn.microsoft.com/ja-jp/azure/azure-functions/functions-bindings-storage-queue?tabs=isolated-process%2Cextensionv5%2Cextensionv3&pivots=programming-language-typescript#host-json)
Elixirにおけるエラーハンドリング

この記事ではElixirにおけるエラーハンドリングについて解説していきます
公式サイトElixir Schoolの内容を踏襲しつつ補足事項を入れる形となります

エラーハンドリング
最もシンプルな形でエラーを発生させるなら```raise/1```を使います
```elixir
iex> raise "Oh no!"
** (RuntimeError) Oh no!
```

エラーの種類やメッセージを明記したい場合は```raise/2```を使います
```elixir
iex> raise ArgumentError, message: "the argument value is invalid"
** (ArgumentError) the argument value is invalid
```

またエラーを自分で設定する際は宣言を行い、利用する形になります
```elixir
defmodule MyError do
  defexception message: "This is my error"
end
```

```elixir
raise MyError
** (MyError) This is my error
```

参考サイト

https://elixirschool.com/ja/lessons/intermediate/error_handling

https://dev.to/gumi/elixir-19-trycatchrescue-50i8
UITableViewの行の高さを一部だけ自動にする

これまで UITableView の行の高さを固定にしていましたが、一部、行の内容によって可変にしたいところがありました。最初は、行の ContentView を NSLayoutConstraint でどうにか高さを調整できないかと頑張っていましたが、そんなに難しいことは考えなくてよかったので、残しておきます。

tableView(_:heightForRowAt:) で、高さを自動にしたい行に対してのみ UITableView.automaticDimension を設定すればいいよという結論です。

## ソースコード
```swift
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
  switch indexPath.section {
    case 0,1,2: return 36.0
    default: return UITableView.automaticDimension
  }
}
```
このコードは、`UITableView` の行の高さを設定するためのデリゲートメソッド `tableView(_:heightForRowAt:)` を実装しています。このメソッドは、各行の高さを動的に決定するために使用でき、指定された `indexPath`（セクションと行番号）に応じて、その行の高さを設定できます。

### 具体的な処理内容  
- `indexPath.section` の値に応じて高さを決定
- セクション `0`、`1`、`2` に対しては `36.0` ポイント固定に設定
- それ以外のセクションに対しては、`UITableView.automaticDimension` を使用して自動で高さを計算

### `UITableView.automaticDimension` について
`UITableView.automaticDimension` は、セル内のコンテンツや `Auto Layout` に基づいて行の高さを **自動的に計算** してくれます。この設定により、行の高さをコンテンツのサイズに合わせて動的に調整することができます。

automaticDimension | Apple Developer Documentation
https://developer.apple.com/documentation/uikit/uitableview/1614961-automaticdimension

## 使用例
メモのセクションが、入力した文字の行数に合わせて、広がっています。

![example.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3853334/8e98553c-c0ad-f65f-308f-c87e5e5d8f60.png)

## さいごに
`UITableView.automaticDimension` が、CGFloat なんだと気づいてやってみたらできたってかんじです。

スクリーンショットのアプリは ↓ なので、興味があれば使ってみてください。
給与管理アプリ：
https://apps.apple.com/jp/app/%E7%B5%A6%E4%B8%8E%E7%AE%A1%E7%90%86%E3%82%A2%E3%83%97%E3%83%AA/id1443054271
State backed values should use the lambda overload of Modifier.offset

## 先に結論

```kotlin
// Before
val someOffset by /* State<Float> */
Modifier.offset(x = someOffset)
```

```kotlin
// After
val someOffset by /* State<Float> */
Modifier.offset { IntOffset(x = someOffset.dp.toPx().toInt(), y = 0) }
```

## 詳細
androidx.compose.foundationを1.7.0アップデートしたところ、次のwarningが出るようになりました。

> Modifier.offset{ } is preferred over Modifier.offset() for `State` backed arguments.: State backed values should use the lambda overload of Modifier.offset

> Modifier.offset() is recommended to be used with static arguments only to avoid unnecessary recompositions. Modifier.offset{ } is preferred in the cases where the arguments are backed by a State.

`Modifier.offset()`をStateによって管理されている値（典型的にはアニメーション等）に使用すると、不必要に再コンポーズが発生するようです。
修正は`Modifier.offset{ }`に置き換えるだけですが、dpを使用する場合、`IntOffset`を返すよう適宜変換する必要があります。

`fun Modifier.offset(offset: Density.() -> IntOffset)`
DevOps Center のインストールエラー


+ [【既知の問題 W-11764313】DevOps センター パッケージのインストールの例外](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000KhD9M)
+ [ trial Professional orgにはインストールできない](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V0000798D3k)

+ [7.5 Package fails to install](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007ifoBr)

:::note alert
Install fails with the following message:
Error Number: 1928049343-991021 (1983975115)
Problem:

1. Layout(Project__c-Project Layout) The ActionId specified was invalid for ActionType QuickAction.
Project__c-Project Layout: The ActionId specified was invalid for ActionType QuickAction.

2. Layout(Vcs__c-Vcs Layout) The ActionId specified was invalid for ActionType QuickAction.
Vcs__c-Vcs Layout: The ActionId specified was invalid for ActionType QuickAction.

3. Layout(Work_Item__c-Work Item Layout) The ActionId specified was invalid for ActionType QuickAction.
Work_Item__c-Work Item Layout: The ActionId specified was invalid for ActionType QuickAction.
:::

:::note
DevOps Center パッケージに同梱されているレイアウトの一部の標準アクションでは、Chatter 機能を有効にする必要があります。
:::
FastAPIでのキャッシュ実装の試み：`lru_cache`の活用

## はじめに
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/4e36b32c-cf4e-5551-2bfd-0ba62fa79bfd.png)
APIのパフォーマンスは、ユーザーエクスペリエンスに直結します。この記事では、Python標準ライブラリの`functools.lru_cache`を活用して、FastAPIアプリケーションにシンプルかつ効果的なキャッシュ機能を追加する方法を紹介します。

## FastAPIでのキャッシュに関する注意事項

- 本記事では、Python標準ライブラリの `functools.lru_cache` を使用したシンプルなキャッシュ方法を紹介しています。
- FastAPI自体には、より高度なキャッシュ機能を提供するサードパーティ製ライブラリが存在します（例: fastapi-cache2）。この記事を作成するまえにわかっていませんでした。
- 今後の記事で、fastapi-cache2の詳細な解説を行う予定です。

## lru_cacheとは？

`lru_cache`は、関数の実行結果をキャッシュするためのデコレータです。「Least Recently Used（最も最近使われていない）」アルゴリズムに基づき、古いキャッシュデータを自動的に削除します。`maxsize`パラメータでキャッシュの容量を制限できます。

## lru_cacheが効果的なシナリオ

1. 繰り返し呼び出される関数
2. 計算コストが高い処理
3. 結果の再利用が頻繁

## 基本的な使用例

```python
from functools import lru_cache

@lru_cache(maxsize=100)
def expensive_computation(n: int):
    return sum(i * i for i in range(n))
```

## 実際のユースケース

1. 重い計算処理
2. 予測モデルの結果の再利用

## FastAPIとキャッシュを使ったAPIの実装

### シーケンス図

```mermaid
sequenceDiagram
    participant クライアント
    participant FastAPI
    participant キャッシュ
    participant 高コスト計算

    クライアント->>FastAPI: GET /compute/{n} リクエスト
    FastAPI->>キャッシュ: {n}の結果がキャッシュにあるか確認
    alt キャッシュヒット
        キャッシュ->>FastAPI: キャッシュされた結果を返す
        FastAPI->>クライアント: キャッシュされた結果を返す
    else キャッシュミス
        FastAPI->>高コスト計算: {n}の計算を実行
        高コスト計算-->>FastAPI: 計算結果を返す
        FastAPI->>キャッシュ: 結果をキャッシュに保存
        FastAPI->>クライアント: 計算結果を返す
    end
```

### コード例

```python
import time
from fastapi import FastAPI, HTTPException
from functools import lru_cache

app = FastAPI()

@lru_cache(maxsize=100)
def expensive_computation(n: int):
    return sum(i * i for i in range(n))

@app.get("/compute/{n}")
async def compute(n: int):
    if n < 0:
        raise HTTPException(status_code=400, detail="Input must be a non-negative integer。")
    
    if n > 1000000:
        raise HTTPException(status_code=400, detail="Input is too large for processing。")
    
    start_time = time.time()
    result = expensive_computation(n)
    end_time = time.time()

    execution_time_ms = (end_time - start_time) * 1000

    return {
        "result": result,
        "execution_time_milliseconds": execution_time_ms
    }
```

## 実装のポイント

- キャッシュの設定: `@lru_cache(maxsize=100)`
- エラーハンドリング: 不適切な入力に対するエラー処理
- 処理時間の計測: キャッシュの効果を数値で確認

## キャッシュの効果のテスト

```bash
# n=100000での初回リクエスト（キャッシュなし）
$ curl http://127.0.0.1:8000/compute/100000
# レスポンス: {"result": 333328333350000, "execution_time_milliseconds": 1234.56}

# 同じリクエストの2回目（キャッシュあり）
$ curl http://127.0.0.1:8000/compute/100000
# レスポンス: {"result": 333328333350000, "execution_time_milliseconds": 0.12}
```

## まとめ
![napkin-selection (13).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/30280d4c-1692-76a3-a718-2891530d38a4.png)

キャッシュの導入により、APIのパフォーマンスを劇的に向上させることができます。計算負荷の高いシステムやリアルタイム性が求められるアプリケーションでは特に有効です。

## 参考リンク

- [FastAPI公式ドキュメント](https://fastapi.tiangolo.com/)
- [functools.lru_cacheドキュメント](https://docs.python.org/3/library/functools.html#functools.lru_cache)

## 次回予告

次回の記事では、FastAPI向けのサードパーティ製キャッシュライブラリ「fastapi-cache2」の導入方法と高度な機能について解説します。(仮)
ビジュアルプログラミングで高位合成 その3

# 概要
ビジュアルプログラミングで組み合わせ回路を組み立てて、シュミレーションして、verilogを生成します。
高位合成です。
検証編

# テストベンチを作成する。

```

module x(input In0, input In1, output Out0);
	assign Out0 = (In1  ^ In0);
endmodule

module test;
	reg In0;
	reg In1;
	x u(.In0(In0), .In1(In1), .Out0(Out0));
	initial
	begin
		$display(" In0 In1 Out0");
		$monitor(" %b  %b  %b", In0, In1, Out0);
		In0 = 0;
		In1 = 0;
	#10;
		In0 = 0;
		In1 = 1;
	#10;
		In0 = 1;
		In1 = 0;
	#10;
		In0 = 1;
		In1 = 1;
	#10;
		$finish;
	end
endmodule

```

# iverilogでシュミレーションする。

```
>iverilog xor3.v

>vvp a.out
 In0 In1 Out0
 0  0  0
 0  1  1
 1  0  1
 1  1  0
xor3.v:27: $finish called at 40 (1s)

```

以上。
ユーザーとのコミュニケーションで気をつけていること

## はじめに
こんにちは、小林と申します。
運用保守の業務を務めて3年目になります。
運用保守という業務を行う中で最も大変だと思う事はユーザー(お客様)とのコミュニケーションです。
ユーザー様からお問合せがあった際にどの作業をしたいのか、どういった情報を入力したのか、どうなれば正しいのか、など知る必要があります。
コミュニケーションをしっかりとらないと誤った情報で調べてしまったりする事に繋がり結果ユーザー様が求めている案内が出来ず、クレームに繋がる可能性があります。

## コミュニケーションで気をつけている3つの事
### ①相手が何を伝えようとしているかを正確に聞き取る
- 単に相手の会話を「聞く」だけでは不十分で、相手の意図を正しく把握することができなければ、意思疎通が難しくなり立ち行かなくなります。
### ②会話の中での不明点や疑問点について深掘りする。
- どういった作業が出来ていないのか、どうなれば良いのかなど相手の状況を正確に把握し、適切な判断や提案を行っていくことが重要です。
### ③自分が伝えたい内容を明確にし、話の筋道を作ってロジカルに伝える
- 自分の意見や考えを相手に伝える力です。伝達スキルが未熟だと意思疎通がうまくいきません。

## コミュニケーションを向上させる3つの事
ここでは自分自身がユーザーとのコミュニケーションにおいて向上させるために意識して取組んだ事を記載します。
### ①PREP法を意識する
P⇀Point　要点・結論を最初に伝える
R⇀Reason　要点・結論に至った理由
E⇀Example　具体例・事例
P⇀Point　再度要点・結論を伝える
上記の事を意識する事で相手に分かりやすく伝える事が出来て、話の内容にも説得力が付きます。

1つ例文を用いてPREP法を説明していきたいと思います。
・例文
【結論】：御社で採用していただいたあかつきには、顧客満足アップにチャレンジし、御社へ貢献していきたいと考えています。
【理由】：前職でも接客業をしていたため、ホスピタリティ精神は自分の強みだと考えているからです。
【具体例】：自分の強みは、顧客満足度の経験と実績となります。前職では、3年連続で顧客満足度がトップでした。
【結論】：前職で培った経験や実績を存分に生かし、御社でも活躍していきたいと思います。
上記例文のようにPREP法を使用して文章を作成しみると明確な理由に裏付けられたシンプルかつ論理的な主張が可能になります。

### ②相手の話をしっかり聞き共感する
「共感」とは相手の考え・立場に寄り添いながら、自分の考えを伝えることです。他人に共感し、相手の意図を理解するというのは、業務内だけでなく日常においても重要な事だと思います。相手の伝えたい内容をしっかり理解しようとする姿勢をみせることで、相手との信頼関係を築くことに繋がります。　
### ③上手い人を真似て覚える
すでにできている人の真似をすることで、コミュニケーションを向上させることができます。自分で考え行動し、結論にいきつくことも勿論重要ですが、自分がもっている疑問に対しての答えを持っている人が目の前にいるなら徹底的に完コピすることで、今までの自分と違った考え・やり方を身につけることができます。

## 終わりに
お客様とのコミュニケーションは、相手との共通認識を作り、関係を構築する事がとても大切です。
友人や家族のように自分と親しい間柄といった個人間でのコミュニケーションとは違い、自分と異なる立場にいる相手に対して意思疎通を図り、信頼を得ながら業務を進めていきます。
単に自分が伝えたいことを伝えるための伝達力だけではなく、「相手が聞きたいことが伝わったか」「相手の立場をいかに想像できるか」を意識することが重要です。
以上、小林でした。
「SQLアンチパターン」の気づき（DB論理設計1）

## はじめに
こんにちは。小川です。
以前から気になっていた「SQLアンチパターン」という本を読みました。
とても良い本で今まで気づかずにやっていたことがSQLアンチパターンなんだと知ることができました。
勉強になったので、学んだことを言語化して量が多いのでいくつかの記事に分けて紹介していこうと思います。
今回は第Ⅰ部のDB論理設計のアンチパターンについて記載します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780649/5379460a-559d-ad9e-a086-78c6e3aec17f.png)

## 1章.ジェイウォーク（信号無視）

### アンチパターン
１つの列にカンマ(,)やスラッシュ(/)を使用して、複数の値を格納すること。
(例)
User
| user_id | name | role_id |
| ---- | ---- | ---- |
| 1 | TARO | 1,3,4 |
| 2 | JIRO | 2,3 |

Role
| role_id | role |
| ---- | ---- |
| 1 | AAA |
| 2 | BBB |
| 3 | CCC |
| 4 | DDD |

### デメリット
①検索や集約処理を行うのに手間がかかる
②カンマ(,)やスラッシュ(/)を使用することによって数値型ではなく文字列型で定義する必要があるため、不正なデータを許容してしまう
③リストの長さの上限しかデータを登録できない

### 解決策：交差テーブルを作成する
UserとRoleの２つのテーブルをつなぐ、交差テーブルを作成する。

(例)
User
| user_id | name |
| ---- | ---- |
| 1 | TARO |
| 2 | JIRO |

UserRole
| user_id | role_id |
| ---- | ---- |
| 1 | 1 |
| 1 | 3 |
| 1 | 4 |
| 2 | 2 |
| 2 | 3 |

Role
| role_id | role |
| ---- | ---- |
| 1 | AAA |
| 2 | BBB |
| 3 | CCC |
| 4 | DDD |

## 2章.ナイーブツリー（素朴な木）
### アンチパターン
例のようにparent_idを持たせて、直近の親のみを参照するようにするツリー構造で設計する。
常に親のみに依存するこの関係を「隣接リスト」と呼ばれています。

（例）組織の関係を表すテーブル
Organization
| id | parent_id | name |
| ---- | ---- | --- |
| 1 | null | 会社 |
| 2 | 1 | 東日本 |
| 3 | 1 | 西日本 |
| 4 | 2 | 東京本社 |
| 5 | 3 | 大阪支社 |
| 6 | 4 | A事業部 |
| 7 | 4 | B事業部 |

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780649/04d578df-bba0-bce2-f5dd-c0d36d441d68.png)

### デメリット
・ツリーの全体やサブツリーの取得が難しい
・非葉ノードを削除する際に子ノードから削除・編集する必要がある

### 解決策：代替ツリーモデルを使用する
いくつか代替ツリーモデルはありますが、一番のおすすめは「閉包テーブルモデル」です。
「閉包テーブルモデル」とは別テーブル（Relationテーブル）でノード同士の関係性を管理するようにする。

（例）
Organization
| id | name |
| ---- | ---- |
| 1 | 会社 |
| 2 | 東日本 |
| 3 | 西日本 |
| 4 | 東京本社 |
| 5 | 大阪支社 |
| 6 | A事業部 |
| 7 | B事業部 |

Relation
| parent_id | child_id |
| ---- | ---- |
| 1 | 1 |
| 1 | 2 |
| 1 | 3 |
| 1 | 4 |
| 1 | 5 |
| 1 | 6 |
| 1 | 7 |
| 2 | 2 |
| 2 | 4 |
| 2 | 6 |
| 2 | 7 |
| 3 | 3 |
| 3 | 5 |
| 4 | 4 |
| 4 | 6 |
| 4 | 7 |
| 6 | 6 |
| 7 | 7 |

## 3章.IDリクワイアド（とりあえずID）
主キー名を何も考えず id にしていないでしょうか？
なんでもかんでも無邪気に主キーとしてidを定義してしまうアンチパターン

(例)
ArticleTag
| id | article_id | tag_id |
| ---- | ---- | --- |
| 1 | 1 | 1 |
| 2 | 1 | 2 |
| 3 | 2 | 3 |

Article
| id | name |
| ---- | ---- |
| 1 | name1 |
| 2 | name2 |
| 3 | name3 |

### デメリット
・キーの意味が分かりにくくなる
・重複行を許可してしまう(主キーの意味をなさない)
例のArticleTagにarticle_id=2,tag_id=3の値を誤ったクエリを実行してしまっても、登録できてしまう

### 解決策：状況に応じて適切に調整する
・良い設計のためには、規約に縛られて柔軟性を欠いてしまわないことが大切
・わかりやすい列名にする
主キーの名前は、主キーが識別する対象のエンティティを表すものにすべき

## 4章.キーレスエントリ（外部キー嫌い）
名前の通り外部キーを張らないアンチパターン

### デメリット
・完璧なコードを前提にしている
外部キー制約を設定しなかった場合、アプリケーションプログラム側で参照整合性を保証するためのコードを書く必要がある
・ミスを調べなければならない
ミスを発見するために、定期的にデータのチェックを行うクエリを実行する必要がある

### 解決策：外部キー制約を宣言する
・テーブルを作成する際に外部キーを正しく設定する
・カスケード更新を行う

## まとめ
今回は第Ⅰ部のDB論理設計のアンチパターンについて一部まとめてみました。
この記事はこの本を読んで、私がこういう理解をしましたということを言語化してみました。
とても勉強になる本なので皆様もぜひ読んでみてください。

以上、小川でした。
ビジュアルプログラミングで高位合成 その2

# 概要
ビジュアルプログラミングで組み合わせ回路を組み立てて、シュミレーションして、verilogを生成します。
高位合成です。
実装編

# ビジュアルプログラミングした組み合わせ回路

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/8facc7a2-655f-5723-581b-2faede658c97.png)



# 生成されたverilog

```
module x(input In0, input In1, output Out0);
	assign Out0 = (In1  ^ In0);
endmodule


```

# 成果物

Toggle Buttonをクリックして、シュミレーションできます。

verilogを生成します。


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


# サンプルコード

```

function make(s) {
	var i;
	var j;
	var res = "";
	var ins = [];
	var outs = [];
	var divs = [];
	var ass = [];
	var json = JSON.parse(s);
 	var koko = document.getElementById("koko");
	for (i = 0; i < json.devices.length; i++) 
	{
    if (json.devices[i].type == "In")
    {
			ins.push({
				id: json.devices[i].id,
				label: json.devices[i].label
			});
    }
	}
	for (i = 0; i < json.devices.length; i++) 
	{
    if (json.devices[i].type == "Out")
    {
			outs.push({
				id: json.devices[i].id,
				label: json.devices[i].label
			});
    }
	}
	for (i = 0; i < json.devices.length; i++) 
	{
    if (json.devices[i].type == "XOR" || json.devices[i].type == "NAND")
    {
			divs.push({
				id: json.devices[i].id,
				type: json.devices[i].type
			});
    }
	}
	res += "module x(";
	if (ins.length == 2)
	{
		res += "input " + ins[0].label + ", ";
		res += "input " + ins[1].label + ", ";
	}
	if (outs.length == 1)
	{
		res += "output " + outs[0].label + ");\n";
	}
	if (divs.length == 1) 
	{
		res += "\tassign ";
		for (i = 0; i < json.connectors.length; i++) 
		{
  	  if (json.connectors[i].to == divs[0].id + ".out0")
  	  {
				for (j = 0; j < json.devices.length; j++) 
				{
		    	if (json.devices[j].id + ".in0" == json.connectors[i].from)
					{
						res += json.devices[j].label + " = (";
					}
  	  	}
			}
		}
		for (i = 0; i < json.connectors.length; i++) 
		{
    	if (json.connectors[i].from == divs[0].id + ".in0")
  	  {
				for (j = 0; j < json.devices.length; j++) 
				{
		    	if (json.devices[j].id + ".out0" == json.connectors[i].to)
					{
						res += json.devices[j].label + " ";
					}
  	  	}
   	 	}
		}
		if (divs[0].type == "XOR")
		{
			res += " ^ ";
		}
		if (divs[0].type == "AND")
		{
			res += " & ";
		}
		if (divs[0].type == "OR")
		{
			res += " | ";
		}
		if (divs[0].type == "NAND")
		{
			res += " ~& ";
		}
		if (divs[0].type == "NOR")
		{
			res += " ~| ";
		}
		if (divs[0].type == "NOT")
		{
			res += " ~ ";
		}
		if (divs[0].type == "XNOR")
		{
			res += " ~^ ";
		}

		for (i = 0; i < json.connectors.length; i++) 
		{
    	if (json.connectors[i].from == divs[0].id + ".in1")
  	  {
				for (j = 0; j < json.devices.length; j++) 
				{
		    	if (json.devices[j].id + ".out0" == json.connectors[i].to)
					{
						res += json.devices[j].label + ");\n";
					}
  	  	}
   	 	}
		}
	}
	res += "endmodule";
	koko.value = res;
}


```

以上。
文字コード

# はじめに
文字コードに関する知識が浅いため纏める。

# データが送られる仕組み
データを送信し受信する例を例に説明する。
①「すき」という文字を受信側に送信したいとする。その時、「すき」を文字コードに従ってバイナリデータに符号化(エンコード)する。
「す」→100000101010111
「き」→100000101010110

②エンコードされたバイナリデータを受信側に送信する。
③送信されたバイナリデータを受信する。受信したデータを受信側の文字コードに従って復号化(デコード)する。
この時、送信側で設定された文字コードと受信側で設定された文字コードが食い違っていると、受信側で復号化に失敗して文字化けが起きてしまう。

# WIndowsOSの文字コードについて
Windows OS内部で使用する文字コードはUnicodeであり、符号化方式(エンコーディング)はUTF-16である。

>これだけ書くと、とても単純な話なのですが、ネット上で、
「日本語化したWindowsの文字コードはShift_JISである」
と堂々と記載されていることがあり、非常に迷いました。
また、某AIに以下のように質問すると
質問
日本語化したWindowsOSの文字コードはなんですか？
回答
日本語化したWindowsOSでは、一般的にはShift JIS (Shift Japanese Industrial Standards) が使用されています。Shift JISは、日本語の文字セットを表現するために広く使われる文字コードの一つです。
と回答が返ってきます。
上記は質問の仕方があまり良くなく、回答にしても間違いではないのかもしれません。Shift JISも扱えます。
しかし、Windowsの、システムとしての文字コードは Unicode であり、符号化方式 (エンコーディング) は UTF-16（2回目）
というのが正確な情報です。

Unicodeをサポートしないアプリケーションではシステムロケールで設定された文字コードおよび符号化方式への変換処理が行われる。
>なお、
Unicode をサポートしないアプリケーションやライブラリを動作させる際に限り、UTF-16からシステム ロケールで設定された文字コードおよび符号化方式への変換処理
が行われるようです。これは、「コマンドプロンプト」などがよい例だと思います。
日本語化したWindows（システムロケールが日本）のコマンドプロンプトはデフォルトではShift-JISでの入出力対応になっています。


https://cloudsteady.jp/2024/04/15/79421/

# Unicode対応でないプログラムについて(システムロケールについて)
システムロケールはUnicodeではないプログラム(ANSI)で使用する既定の言語を指定する。日本語化したWindows（システムロケールが日本）のコマンドプロンプトはデフォルトではShift-JISでの入出力対応になっている。

>SystemLocale は、Unicode 対応でないプログラムで使用する既定の言語を指定します。
この設定は、Windows セットアップと Windows 展開サービスの両方で使用されます。
システム ロケールは、既定でシステムが使用するビットマップ フォントとコード ページ (ANSI または DOS) を指定します。 システム ロケール設定は、ANSI (Unicode 対応でない) アプリケーションのみに影響します。 Unicode 対応でないプログラムの言語は、システムごとの設定です。
ユーザーは、コントロール パネルの地域と言語の項目で [管理] タブを使用して、システム ロケールを変更できます。

https://learn.microsoft.com/ja-jp/windows-hardware/customize/desktop/unattend/microsoft-windows-international-core-systemlocale


# ANSIとShift_JISの違い
日本語WindowsではShift_JISのことをANSIと呼ぶ。
ANSIは"American National Standards Institute"の略称である。
メモ帳における”ANSI”は、その言語・地域における標準規格のことであり、日本語Windowsの場合はShiftJIS(CP932)のこと、ほかの言語のWindowsでは別の文字コードを指す。

>つまり、文字コードを直接指している訳ではない。日本で言うJIS（日本工業規格）を制定している日本産業標準調査会に相当する組織の事である。
実質的に国際標準となっている規格の多くを制定している組織である。
古くから用いられている規格としてASCIIがあるが、これもANSIが制定したものである。
ではWindowsにおける「メモ帳」の"ANSI"はASCIIなのか？と言うと、日本語を扱えている時点でそうではない。
**メモ帳における"ANSI"は、その言語・地域における標準規格の事を指しているようである。**
日本であれば、Shift_JIS (CP932)の事を指すのだが、他の言語のWindowsでは別の文字コードを指している。

https://life-is-miracle-wind.blog.jp/archives/30002259.html
Quick Start: Explore the Coral Cloud Sample App



+ [Are errors expected when deploying the coral cloud resort app?](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007ifq5j)

```
| Type  Name                   Problem                                                                                        
| ───── ────────────────────── ────────────────────────────────────────────────────────────────────────────────────────────── 
| Error Experience_Record_Page Generate_Experience_Description isn’t a valid value for Generative Prompt Template.            
| Error PersonalizedSchedule   Invoke_Prompt (Action) - We can't find an action with the name and action type that you speci… 
```

:::note
You need to update your Salesforce CLI version, otherwise the gen AI components don't get deployed on lower versions of CLI. Total components you should be expecting is 166 not 155. I just got pass the challenge on this project.

Salesforce CLI のバージョンを更新する必要があります。そうしないと、gen AI コンポーネントが CLI の下位バージョンにデプロイされません。想定されるコンポーネントの合計数は 155 ではなく 166 です。私はこのプロジェクトのチャレンジに合格しました。
:::
Arduino UNO 3、ボタン入力 Grove- Button で遊ぶ


参考

![o_coq434.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/93c60234-6d72-5d34-afa1-690c2c05566d.jpeg)

https://wiki.seeedstudio.com/Grove_Starter_Kit_for_BeagleBone_Green/

結果

![o_coq432.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/aa787000-d6b9-fb6b-d991-b59ace3102b3.jpeg)

![o_coq433.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/f3a26883-4631-c6f8-e725-284259fed6cb.jpeg)


プログラム



```c++



//Grove_Button_UNO_1

// the setup function runs once when you press reset or power the board
void setup() {
  // initialize digital pin as an output.
  pinMode(13, OUTPUT);
  // initialize digital pin as an input.
  pinMode(14, OUTPUT); //14 = A0
}

// the loop function runs over and over again forever
void loop() {
  int a = digitalRead(14);
  digitalWrite(13, a);   // turn the on (HIGH is the voltage level)
  delay(200);                       // wait for a second
}


```
Kotlin 〜垂直方向と水平方向の配置〜

Jetpack Composeを使用してボタンを水平方向や垂直方向に配置する際、少し複雑だったためこちらの記事でまとめています。

# どのように配置を制御するのか？
Jetpack Composeを使用してボタンを水平方向や垂直方向に配置するには、`Row`と`Column`コンポーザブルを使用する。これらは子要素を指定した方向に並べることができる

例えば、このようなコードを実装することで下記のようなボタン配置となる。
```kotlin

@Composable
fun CombinedButtonLayout() {
    Column(
        modifier = Modifier.fillMaxSize(),
        verticalArrangement = Arrangement.SpaceEvenly
    ) {
        // 水平方向のボタン配置
        Row(
            modifier = Modifier.fillMaxWidth(),
            horizontalArrangement = Arrangement.SpaceEvenly
        ) {
            Button(onClick = { /* アクション */ }) { Text("左") }
            Button(onClick = { /* アクション */ }) { Text("中央") }
            Button(onClick = { /* アクション */ }) { Text("右") }
        }
        
        // 垂直方向のボタン配置
        Column(
            modifier = Modifier.align(Alignment.CenterHorizontally),
            verticalArrangement = Arrangement.spacedBy(16.dp)
        ) {
            Button(onClick = { /* アクション */ }) { Text("上") }
            Button(onClick = { /* アクション */ }) { Text("中") }
            Button(onClick = { /* アクション */ }) { Text("下") }
        }
    }
}
```

![スクリーンショット 2024-09-19 5.38.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2987584/5642396b-f301-66ec-ab7f-fea973ac512c.png)

# 基本要素を知る
RowやColumn、Arrangement、Alignmentの使い方がピンとこなく、使用するのに苦戦したため1つ1つ分解して整理をします。

### RowとColumn
- `Row`を使用することで子要素を「横」に並べる
- `Column`を使用することで子要素を「縦」に並べる

Excelなどでは、縦がRow、横がColumnで指定するため注意です

### 主軸と交差軸

:::note info
主軸とは
要素が並ぶ方向のこと
:::

Rowの場合：横方向
Columnの場合：縦方向

:::note info
交差軸とは
主軸に対して垂直な方向のこと
:::

Rowの場合：縦方向
Columnの場合：横方向

### Arrangement（配置）
主軸に沿って、複数の要素をどのように配置するかを決める

| 要素 | 説明 |
|:-|:-|
| Start  | 始点に寄せる  |
| Center  | 中央に配置  |
| End  | 終点に寄せる  |
| SpaceBetween  | 両端に配置し、残りの空間を均等に配置  |
| SpaceAround  | 各要素の両側に均等なスペースを配置  |
| SpaceEvenly  | すべての要素とエッジの間に均等なスペースを配置  |

### Alignment（整列）
交差軸に沿って、個々の要素をどのように整列させるかを決める
RowとColumnの場合で指定する要素が異なるため注意する

（Columnの場合 / Rowの場合）
| 要素 | 説明 |
|:-|:-|
| Start / Top  | 要素を始点（左 / 上）に整列  |
| CenterHorizontally / CenterVertically  | 要素を水平/垂直方向の中央に整列  |
| End / Bottom  | 要素を終了位置（右/下）に整列  |
GO言語でpingを実行するプログラムの作り方

# はじめに

GO言語で開発するプログラムの中でpingを実行して疎通確認をしたい場合があると思います。そのためのパッケージの紹介です。

https://github.com/prometheus-community/pro-bing

を使います。go-pingというパッケージがありますが、今はメンテナンスされていません。検索して見つかっても使わないほうがよいです。

# PINGを実行するプログラム

"www.google.com"へpingするプログラムは

```go
package main

import (
	"log"

	probing "github.com/prometheus-community/pro-bing"
)

func main() {
	pinger, err := probing.NewPinger("www.google.com")
	if err != nil {
		log.Fatalln(err)
	}
	pinger.Count = 3 
    // pinger.SetPrivileged(true) // for Windows
	err = pinger.Run()
	if err != nil {
		log.Fatalln(err)
	}
	stats := pinger.Statistics()
	log.Printf("stats=%+v", stats)
}

```

だけです。実行結果は、

```
$go run main.go
2024/09/19 05:29:58 stats=&{PacketsRecv:3 PacketsSent:3 PacketsRecvDuplicates:0 PacketLoss:0 IPAddr:142.250.198.4 Addr:www.google.com Rtts:[5.092ms 4.692ms 4.678ms] MinRtt:4.678ms MaxRtt:5.092ms AvgRtt:4.820667ms StdDevRtt:191.946µs}
```

# 注意事項

## Windowsの場合

```go
	pinger.SetPrivileged(true)

```
をRunの前に追加してください。

## Linuxで管理者権限なしの場合

```sh
$sudo sysctl -w net.ipv4.ping_group_range="0 2147483647"
```
を実行してください。

その他のOS毎の注意事項は、

https://github.com/prometheus-community/pro-bing?tab=readme-ov-file#supported-operating-systems

を見てください。

# 余談

ネットワーク管理ソフトTWSNMPシリーズ

https://note.com/twsnmp/n/na5c62f59833d

を開発するときにgo-snmpを使おうとしたのですが、あまりうまくいかなかったので自分でpingのパッケージを作りました。

https://github.com/twsnmp/twsnmpfc/tree/main/ping

TWSNMPシリーズ以外から利用することは試していないので、今回紹介したパッケージを使った方がよいと思います。
VBAで"Python in Excel"を試してみた

Python in Excelが一般公開されたのでお試ししてみた

## 今回の目的

Python in ExcelをVBAで扱えるのか？

## 結論

~~若干苦戦しましたが~~
簡単に扱えました

## 内容

サンプルセットが用意されているので今回はその中の"pandasで説明する"をお借りして検証

* データフレーム作成
* 統計情報 (Describe)

の二つが実装されているので、同様のことをVBAで実装してみる

## 検証コード

```vb
Sub test()
    
    Dim dRng        As Range
    Dim str_CodePy  As String
    
    Set dRng = Range("G2")
    '式： =PY("sample_df = xl(""IrisDataSet1[#すべて]"", headers=True)",1)
    str_CodePy = "=PY(""sample_df = xl(""""IrisDataSet1[#すべて]"""", headers=True)"",1)"
    dRng.Formula2Local = str_CodePy
    
    Set dRng = Range("G4")
    '式： =PY("sample_df.describe()",0)
    str_CodePy = "=PY(""sample_df.describe()"",0)"
    dRng.Formula2 = str_CodePy
    
    
End Sub
```

## 解説

選択セルにPythonコード "sample_df.describe()"を埋め込む

何か所か詰まったのでメモ

* RangeオブジェクトにはFormula2プロパティを使用する
Formulaプロパティではエラーになります
Formula2プロパティは通常のFormulaと違い、スピルなどの動的配列に対応
.describe()の結果も動的に変化するためこちらを使用する

また、テーブルを指定する際、
　・ "[#すべて]"と記載するならFormula2Local
　・ "[#All]"と記載するならFormula2 でも可
というところが地味に詰まりました

https://learn.microsoft.com/ja-jp/office/vba/api/excel.range.formula2


* PY関数 コードの後に ",0"をつける
単純にPY関数の仕様 (ちゃんと把握してませんでした 汗）
第１引数：Pythonコード
第２引数：戻り値の型 (0:Excelの値, 1:Pythonオブジェクト)

データフレームはPythonオブジェクトなので 1 を指定
describe()はセルに書き出すので 0 を指定

https://support.microsoft.com/ja-jp/office/py-%E9%96%A2%E6%95%B0-31d1c523-fb13-46ab-96a4-d1a90a9e512f

* その他
ダブルクォーテーションの数に注意
エスケープも必要なため、イミディエイトウィンドウに書き出すなどして確認が必要

## まとめ
VBAでPython in Excelを扱うには、通常の計算式と同じように扱える
Python in Excelの使い方自体がこれから模索する必要はあるが、VBAと併用できるならば幅が広がるなぁって思いました


## 課題

VBA実行中はPythonの結果が表示されない (#Busy!表示)
下記はいずれも意味がなかった

    DoEvents
    Application.Wait [Now() + "0:00:01"]
    Application.Calculate

何かしら方法がないか探してみたい
netaAIによるギャグ漫画の自動生成例

https://rookie.shonenjump.com/series/zGZPbQ8SNXk/zGZPbQ8SNXs
https://rookie.shonenjump.com/series/zGZPbQ8QooA/zGZPbQ8QooI
https://rookie.shonenjump.com/series/zGZPbQ8RHRo/zGZPbQ8RHRw

https://tarotoyota.pythonanywhere.com/agnent_top

"お笑いAI"と聞くと、ガチャで引いた言葉がたまに面白い配列になった事を鬼の首を取ったかのように騒ぎ立てるだけのものを想像するでしょうが、私のアプローチは全く異なります。

![2024y09m19d_034201690.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3683844/b3c44b62-997a-9767-ccc8-693c2477ef01.png)

<table>
<tr><th>ネタ名</th><td>Hypernym</td><td>.hyponym_superior</td><td>.hyponym_inferior</td></tr>
<tr><th>依存症(さらば青春の光)</th><td>ギャンブル</td><td>パチンコ</td><td>TOTO</td></tr>
<tr><th>男優(さらば青春の光)</th><td>役者</td><td>役者</td><td>AV男優</td></tr>
<tr><th>手タレ(Aマッソ)</th><td>タレント</td><td>タレント</td><td>手タレ</td></tr>
<tr><th>ベース(ニューヨーク)</th><td>演奏家</td><td>ギタリスト</td><td>ベース</td></tr>
</table>

私はこのタイプのシステムのネタを勝手にhsi型と呼んでいます。Hypernym, hyponym Superior, hyponym Inferiorの頭文字をとってhsiです。
私はシステムを軸にして"お笑いの自動生成"をしています。
この「システム」は「コード進行」のようなもので、それがかなり独創的でない限りは好き放題パクってもいいという暗黙の了解があります。
私は「システムパクリ」について糾弾されても、人間がいかにシステムパクリをしているかの巨大な事例集をもって完全に反論できます。

<table>
<tr><th>ネタ名</th><td>.pressure</td></tr>
<tr><th>依存症(さらば青春の光)</th><td>ギャンブル依存症による家族との衝突</tr>
<tr><th>男優(さらば青春の光)</th><td>監督との脚本・演出・演技における衝突</td></tr>
<tr><th>手タレ(Aマッソ)</th><td>仕事における態度に関しての衝突</td></tr>
<tr><th>ベース(ニューヨーク)</th><td>キャリア・財政に関しての近親者との衝突</td></tr>
</table>

hsi型コントに必要とされる"属性Aを持つ登場人物Bが属性Aを持っていてはいけない圧力"もきちんと生成・運用しています。*1

netaAIが具体的に何をしているか：

1.お笑いにおいて頻繁に用いられる表現のパターンを収集・分類する。
2.それらをfstring(のようなもの)に変換した上でAIが増殖させる。
3.それらのfstring(のようなもの)に入るべき言葉をAIが増殖させる。

これだけです。
netaAIは新しいシステムを作ることはできませんが、既存のシステムに則ったネタを量産できます。
新しい麻薬を作れないが、既存の麻薬の分子構造をマイナーチェンジしたデザイナーズドラッグを量産する化学者のようなものです。


もうほとんどの人間よりnetaAIは面白いです。GPUを使えば使えるだけ面白くなるフェーズに入っています。よければ実際にnetaAIが生成したものを読んで"いいね!"を押してください。






*1「僕らの最初の設定では、登場人物は同級生で。単純に結婚相手の話をしていて、干支から推測する年齢が上がっていくだけだったんです。小峠にそれを見せたら10分くらい黙ってて、『マー坊が親父になったほうが面白くなるんじゃない？』って言ったんですよ。確かにそうやなと」（マー坊）(https://cocotame.jp/series/029646/)
XServer VPSにPingが通らない (パケットフィルター設定)

## 概要
XServer VPSを契約して、試しにPingを飛ばしてみましたが、なぜか応答しませんでした。2時間くらい調べましたが結局設定1つで解決しました。

## 原因
パケットフィルター設定をONにしていたのが原因でした。Pingの個別設定はできなかったので、制限されていないと思っていましたが、この設定をONにするとPingに応答しなくなるようです。
![スクリーンショット 2024-09-19 012753.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3889380/b57dc274-c876-7dcd-4f28-cafc5a73aaa3.png)

## 結果
パケットフィルター設定をOFFにすることで解決しました。接続許可ポートについては、UFWなどを使うと良いと思います。
逆スラッシュ入力方法

## 初めに
改行の際に逆スラッシュを打つ必要がある時ありますよね。逆スラッシュを入力しようとするとき、僕はいつも調べてしまうので、まとめてみようと思います。

## 逆スラッシュ入力方法
### macの場合
optionキー+¥キーを押す

### windowsの場合
僕はwindoowsを持っていないので試すことができないのですが、
ろキー　もしくは　¥キーを押すことで表示できるらしいです。
フォントの設定によっても、表示できるかできないが変わってくるため注意が必要です。

## 最後に
optionキーを使うところが覚えにくいですね。キーボードに逆スラッシュは書かれていないので、積極的に使っていくことで覚えていくしかないですね。
Haskellの実装パターン（メモ）

# 目的

Haskellの実装のパターンと応用例の収集。（個人的なメモ）


# パターン

|実装パターン|説明|実装例|
|----------|---|------|
|Monoid|単位元(空白文字とか)と結合があるもの|文字列の結合|
|Semigroup|結合があるもの||
|Monad|ユーザーによる拡張可能な状態・変数を持った手続型のプログラミングを可能にするもの|do記法、Maybeモナド、Stateモナドなど。|
|Monad Transformer|モナドの上に異なるモナドを乗せるもの|IOモナドにStateモナドを被せるとか。|
|Reader Monad|||
|Writer Monad|||
|State Monad|||
|Continuation Monad|||
|Free Monad|||
|Indexed Monad|||
|Graded Monad|||
|Comonad|Monadの双対|Zipper、[他の例(Lensなど)](https://www.reddit.com/r/haskell/comments/9nche5/why_monad_is_so_much_more_used_useful_than_comonad/)|
|Applicative|||
|Arrow|Monadが出力の型を持っているのに対して、入力の型も持っているもの|Functional Reactive Programming,デジタル回路|
|Functor|何らかの入れ物に入ったデータ型を変換するもの|MapReduceのMap|
|BiFunctor|||
|[Profunctor](https://hackage.haskell.org/package/profunctors-5.6.2/docs/Data-Profunctor.html)||[Box]()|
|Foldable|Reduceの一般化|配列の合計、最大、最小などの集計|
|Traversable|||
|Lens/Optics|||
|[Contravariant](https://hackage.haskell.org/package/base-4.20.0.1/docs/Data-Functor-Contravariant.html)|Functorの逆|[ログの出力のフォーマット変換](https://kowainik.github.io/posts/2018-09-25-co-log)|
|[Yoneda](https://hackage.haskell.org/package/kan-extensions-5.2.6/docs/Data-Functor-Yoneda.html)||[Fusion](https://functional.works-hub.com/learn/yo-yoneda-a2965)|
|CoYoneda|||
|[Representable](https://hackage.haskell.org/package/representable-functors-3.2.0.2/docs/Data-Functor-Representable.html)||[テンソルのブロードキャスト](https://qiita.com/lotz/items/5a1a05c0dae1133a5f44)|
|[GHC.Generics](https://hackage.haskell.org/package/base-4.20.0.1/docs/GHC-Generics.html)|||

# ToDo

* Stackageからの応用例の収集

# 参考文献

* https://github.com/ekmett/semigroupoids
* https://qiita.com/inamiy/items/9af1da1faec22cd968f0
* https://www.reddit.com/r/haskell/comments/qqs2ur/the_romance_of_haskell_and_category_theory/
毎回ignoreするのが面倒くさいと思うファイルはグローバルignoreしよう![Git]

みなさん、下のようなことを思ったことがありませんか?

「IDEの設定ファイルをignoreに追加するのめんどくさいな」

私は、Jetbrains系のIDEを使用するため、プロジェクトを触った際に.ideaファイルが生成されてしまうので、共同開発の際に.ideaファイルを一々.gitignoreしていました。

ですが、流石にめんどくさくなってきましたし、個人依存な部分が大きいと思うので、プロジェクトの.gitignoreファイルに追加しなくてもいいように、自分の環境下では自動的にignoreしてくれるグローバルなgitignoreの設定の仕方を調べてみました。

# 設定の仕方

`$HOME/.config/git`に`ignore`というファイルを生成するだけで、自分の環境下では設定したファイルがgitignoreされるようになります。

例えば、Macユーザでは`~/.config`が存在していると思われるので、以下のコマンドでgitの設定ファイルに移動します。

```
cd ~/.config/git
```

:::note
もし存在しない場合は、`mkdir`コマンドで作成してください
:::

そこでignoreファイルを作成します。

```
touch ignore
```

そのignoreファイルに、ignoreしたいファイルを記述します。

例えば.ideaをignoreしたい場合は

```
.idea/
```

:::note
この設定をする際は、nanoやvimを使ってささっとcliで書いてしまう方が楽だと思います。
:::

念の為、設定できるか確認するには下のコマンドを打って設定できているか確認します。
```
cat ~/.config/git/ignore
```

設定できていたら下のように表示されるはずです。
```
cat ~/.config/git/ignore
.idea/
```

# 注意点
わかっている方が多いと思いますが、pycacheキャッシュファイル等のファイルは共同開発の際に他の方がコミットしてしまう可能性があるので、しっかりプロジェクトの.gitignoreに記述しましょう。
【Go言語】　型アサーション

# 前回までのあらすじ
第2回目は「クロージャー」について学びました。もしよかったらご覧ください。

https://qiita.com/koutorino/items/42fbec48b8f39ecee017


今回も引き続きUdemyの『【Go入門】Golang基礎入門 + 各種ライブラリ + 簡単なTodoWebアプリケーション開発(Go言語)』の内容をもとに学習を進めていきます。

https://www.udemy.com/course/golang-webgosql/?couponCode=ST11MT91624B

# 型アサーションとは
インターフェース型の変数が具体的な型に保持している値を取得するための機能のことです。
インターフェース型は異なる型の値を扱うことができるため、なんの型が入っているかがわかりにくくなります。そこで、型アサーションを使うとインターフェースの内部にある具体的な値の型を確認・取得できます。
```golang
value := x.(T)

x: インターフェース型の変数
T: 具体的な型（例えば、intやstringなど）
```

上記が型アサーションの基本的な形になります。`(T)`に入っている型と同じであれば出力し、違った場合はエラーを発生します。ただ、このエラーはGoの実行時エラー(panic)になり、あまり良いエラーではありません。なので一手間加えることで、エラーを防ぐことができます。

```golang
value, ok := x.(T)
```
型が違う場合`ok`にfalseが、同じ場合はtureが代入されて、パニックを起こしません。

## 実際に使ってみる
実際に型アサーションを使って、出力してみました。しっかりと判別できていることがわかりますね。
```golang
var x interface{} = 10
num, ok := x.(int)
str, ok := x.(string)

fmt.Println(num, ok)
// 10 ture
fmt.Println(str, ok)
//  false (空文字が入っている)
```

また、さらに実用的に判別するには条件分岐が使えます。こちらはif文を用いて、判別しています。if文だと少し長ったらしく読みにくさが目立ちますね。
```golang
var x interface{} = 10

if x == nil {
    fmt.Println("x is nil")
} else if i, ok := x.(int); ok {
    fmt.Println("x is int", i)
} else if s, ok := x.(string); ok {
    fmt.Println("x is string", s)
} else {
    fmt.Println("x is not int or string")
}
// x is int 10
```

これをswitch文で書くと大幅に整形することができます。少しだけ書き方に癖があるのでこちらは覚えておかないといけませんが綺麗になります。
```golang
var x interface{} = 10

switch x.(type) {
case nil:
    fmt.Println("x is nil")
case int:
    fmt.Println("x is int")
case string:
    fmt.Println("x is string")
default:
    fmt.Println("x is not int or string")
}
```

switch文を使うこと推奨されているそうです。なので、型アサーションを使用するときはよほどの理由がない限りはswitch文を使うようにしたいですね。

## 使い方
**インターフェース型から具体的な型を取り出す**
インターフェースを使って異なる型の値を扱い、それを元の具体的な型に戻したい場合に使います。

**型を安全に変換する**
インターフェース型の変数が特定の型を持っているかどうかを確認しながら、エラーを防ぐために利用されます。


## まとめ
### 正体を暴く機能（型アサーション） = 名探偵コナン
「Vite + Remix」を使用したReact環境構築


### 自己紹介とか
どうも、こんちには。
新人エンジニアの弁慶と申します

(いつまで新人って名乗れるのでしょうね。
経過年数的には、もう新人ではなく中堅な気もするけど、、、)

まぁここで名乗る分にはいいかな。

最近、業務でReactを触る機会があり、休日にでも遊んでみようかなと、自宅のPCで環境構築をしてみました。少し苦戦したため、今回はその備忘録である。


## 結論
「Vite + Remix」でReact環境構築を実施する場合は、
RemixプロジェクトにViteをインストールすると楽だよって話。

## 余談というか、React環境構築の完成までの過程

■なぜやろうと思ったか。
①Viteというツールを使用することで、フロントエンドの環境構築が簡単にできると知る。
②Viteを使って環境構築してみよう！
③remixをインストールすると便利らしい
④remixも同時に使えるようにしよう←いまここ


### Viteプロジェクトを作成し、remixをインストールしよう！！

#### 手順①～⑥
**①Node.jsのインストール**
https://nodejs.org/en/download/prebuilt-installer

**②viteのインストール**
https://ja.vitejs.dev/guide/

**③viteの確認**
	・cd vite-project
	・npm install
	・npm run dev
	※URLが表示されるため、ブラウザで入力する
	　Reactのテストページが表示されれば成功！！

**④remixのインストール**
	npm install remix react-router-dom
	npm install @remix-run/react @remix-run/node @remix-run/serve

**⑤remixのルーティング先を指定**
	appフォルダを作成←remixのルーティング先
	app\routes\index.tsxを作成←初期表示される
	remix.config.jsを作成←appDirectory: "app"を指定する
	tsconfig.jsonを修正←"include":["app", "remix.config.js"]を指定する
	tsconfig.node.jsonを修正←"include": ["vite.config.ts"]を指定する
	
**⑥viteのルーティング先を修正**
	vite.config.tsを修正←root:'app'を指定
	index.tsxを削除（src\main.tsx?）を参照していたため


#### viteプロジェクトの実行！！！
いざ、再実行！！！
(以下、PCとの対話である。)

```
主		　　 :「http://*localhost:5173*/home」

ブラウザ様	：「「「この localhost ページが見つかりません」」」

主		    ：「。。。（Ctrl+F5、ポチっ）」

ブラウザ様	：「。。。」

主		    ：「。。。」

ブラウザ様	：「「「この localhost ページが見つかりません」」」

```

ぬぉぉぉーーー、失敗したぁぁぁぁ。。。。
その後、いろいろ調整してみるが上手く動作しない。

　
調査中にReact環境構築の方法に関して、気づきがえられた。
それが、「Vite + Remix」を使用した環境構築には2つのアプローチがあることである。

**①Viteプロジェクトにて、Remixをインストールする方法**
→remixの設定を手動で実施する必要がある

**②Remixプロジェクトにて、Viteをインストールする方法**
→viteの設定を自動で実施してくれる！！

いままでは、①の対応をしてきたが、②のほうが手動で設定する手間が省けるはず。。。
というわけで、先ほど作成したviteプロジェクトは削除し、remixプロジェクトを作成してみる。



### Remixプロジェクトを作成し、Viteをインストールしよう！！
#### 手順①～③
**①remixプロジェクトを作成（この時点でviteがインストールされている）**
	・npx create-remix@latest

※以下のエラーが発生する場合は、npmを最新化する必要があった。
ENOENT: no such file or directory, lstat 'C:\Users\user\AppData\Roaming\npm'

**②viteの確認**
	・cd my-project
	・npm install
	・npm run dev

**③remixのルーティング先を作成**
	app\routes\home.tsxファイルを作成

```
export default function Home() {
    return (
      <div>
        <h1>Home Test</h1>
        <p>!!!!!!!!!!!!!!!</p>
      </div>
    );
}
```

#### remixプロジェクトの実行！！！
いざ、再再実行！！！
(以下、PCとの対話である。)

```
主  　　　　　:「http://localhost:5173/home」

ブラウザ様	：「。。。」

主　		：「。。。」

ブラウザ様	：「「「Home \n !!!!!!!!!!!!!!!!!!!」」」
```

うぉぉぉぉ！！！！！成功だぁぁぁぁl！！！！！！
てか、めちゃくちゃ簡単だな。

## まとめ

てな訳で、URLのルーティングに成功したのだった。
。。。。いや、プロジェクト作成しただけで、設定も何もないじゃねーか！！！

 　
まぁ、次からはスムーズに対応できるってことでね。




## 参考URL
-- Vite公式のインストール手順
https://ja.vitejs.dev/guide/

-- Remix公式のインストール手順
https://remix.run/docs/en/main/guides/vite
DNS権威ゾーンのserialをリセットする

DNS 権威サーバが持つゾーンには serial と呼ばれるバージョンの値があります。この値が大きくなったときにゾーンが更新されたとみなされて，複製先にアップデートされるわけですが，この serial の値は常に増加しなければいけないので，減らしてしまうと更新が適切に行なわれなくなってしまいます。

```:serial の例 (この場合は 1)

; <<>> DiG 9.10.6 <<>> @1.1.1.1 mdns.jp. SOA
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 24378
;; flags: qr rd ra ad; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;mdns.jp.			IN	SOA

;; ANSWER SECTION:
mdns.jp.		3600	IN	SOA	ns-a1.mdns.jp. hostmaster.mdns.jp. 1 10800 3600 604800 3600

;; Query time: 22 msec
;; SERVER: 1.1.1.1#53(1.1.1.1)
;; WHEN: Thu Sep 19 00:18:22 JST 2024
;; MSG SIZE  rcvd: 89

```

しかし，現実の運用ではしばしば (ときにはミスによって) この serial を減らさなければならない状況になることがあります。

1. 誤った値に増加させてしまった場合： YYYYMMDDNN 形式で serial を運用していて， 2024年なのに 2025010101 みたいな値にしてしまったり
1. 形式を変えたい場合： YYYYMMDDNN 形式で運用していたが，単純なカウンタにしたい/あるいは time_t の値にしたい，など

## DNS ゾーン serial の演算

DNS ゾーンの serial は，32-bit 符号なし整数ですが，これは剰余環の演算が定義されていて，`4294967295` (`2^32 - 1`) に1を足すと 0 になります。そして，この「輪っか」の数のなかで，近いほうの隣り同士に注目して，その並びのなかでプラス側に位置する数を大きいとするのです。(RFC1982)

したがって， serial を増やすときに 2147483648 以上の幅で (**2147483648 を含みます**) serial を増加させると，減ったものとみなされて正常に動作しないことがあるのでしてはいけません。

従って， serial を減少/リセットさせたいときは， 2147483648 未満の幅で， 0 に戻るまで増やしていけば良いのです。(本当に0にするとバグるリゾルバ等があると言われているので0ではなく1に戻すことを推奨します)

例： 2024010101 → 3024010101 → 1

また，変更を行うときだけは TTL を小さな値に変更するとラクです。**前のバージョンの TTL がフルで経過するまでは次の変更を行ってはいけません。**

## 参考

https://datatracker.ietf.org/doc/html/rfc1982
[応用情報技術者試験]セキュリティ攻撃の種類

## はじめに
はじめまして、エンジニアのkeigoです！

本記事では、「応用情報技術者試験」合格のための学習のアウトプットを兼ねて、
分かりやすく整理して書いていこうと思います。

今回のテーマは「セキュリティ攻撃の種類について」です！

攻撃手法は数多くありますので、試験に出そうなところを説明していこうと思います！

では、一緒に頑張りまっしょい！

## セキュリティ攻撃
### バッファオーバーフロー
許容範囲を超えたデータを送り付けてオーバーフローさせて悪意の行動をとる手法。

### スマーフ攻撃
偽装した送信元IPアドレスを使用し、送信元を攻撃対象にして複数のホストが大量のICMPエコー応答パケットを送り付ける手法。

### ICMP Flood攻撃
ボットなどを使用して大量のICMPエコー要求パケットを送り付ける手法。

### SQLインジェクション
入力フォームなどにSQLの一部を入力し送信することで、サーバでSQLが組み合わさることでDBの内容を不正に操作する手法。対策としてはエスケープ処理を行うサニタイジング（禁則文字の置き換え）やプレースホルダを使用したプリペアドステートメントを準備して実行するときに入力値を埋め込んでSQLを完成させる方法がある。

### クロスサイトスクリプティング
攻撃者が用意したスクリプトを閲覧者のブラウザを介してwebサイトに追い送り閲覧者のブラウザ上で実行する手法。主にサイトの入力フォームに仕掛けられ、送信した際に悪意のスクリプトが実行されるもの。

### クロスサイトリクエストフォージェリ
通常のアプリケーションにわなサイトのリンクを張るなどし、罠サイトに遷移させる。そのサイトでクリックなどのアクションをしたときに通常のサイトの設定を変更されたりなりすまし投稿をされたりする。

### クリックジャッキング
iframeなどを使用して、サイトのボタンやリンクの上に透明な偽のページを重ねておき、場単やリンクをクリックしたときに重ねられた偽のボタンやリンクをクリックさせる手法。偽の悪意のあるサイトに遷移させる。

### クリプトジャッキング
マルウェアに感染させて、PCのCPU資源を不正利用する。

### 標的型攻撃
特定の組織や個人に対して行われる攻撃。中でも、密かにかつ執拗に行われる継続的な攻撃を**APT（Advanced Persistent Threat）**という。

### 水飲み場攻撃
標的が頻繁に利用しているサイトに対して罠を仕掛けて、アクセスしたときだけ攻撃コードを実行する。

### 中間者攻撃
通信者同士の間に気づかれないように割り込み、通信内容を盗み見たり、改ざんしたりしたのちに正規の相手に転送する手口。

### IPスプーフィング
IPアドレスを偽造して正規ユーザーのふりをする攻撃。

### リフレクション攻撃
リフレクタという反射的に応答するサーバーを踏み台にした分散反射型Dos攻撃。代表的なものにDNSリフレクション攻撃がある。

### Dos攻撃
サーバーやWebサーバーに対して大量のアクセスやデータを送り付けることで負荷をかける攻撃。

### DNSキャッシュポイズニング
DNSキャッシュ機能を利用して偽のドメインを記憶させる。利用者は偽のドメインを使用して偽のサイトに誘導される。対策としてはDNSSEC（DNS問い合わせにデジタル署名を付加して正当性を確認）がある。

### SEOポイズニング
検索結果の上位に悪意のあるサイトを意図的に表示させ誘導する。

### スミッシング
SMSを使用してフィッシングサイトに誘導。これはよく来ますね！アマゾン風や郵便風などありますね。

### フィッシング
実際ある企業の名前を偽ったりして偽サイトに誘導し、個人情報を盗み取る。

### ディレクトリトラバーサル
相対パスなどでディレクトリを横断し非公開のディレクトリにアクセスする。

### リプレイ攻撃
通信データを盗聴して取得した認証情報をそのまま再利用して不正にログインする。
対策としては、チャレンジレスポンス認証がある。

### チャレンジレスポンス認証
サーバーでチャレンジといわれるキーワードを作成し送り、そのチャレンジとパスワードを合体して　返すことで認証する。

### ドライブバイダウンロード
Webサイトを閲覧したときに利用者が気付かないうちに不正プログラムを転送させる攻撃。

### ソーシャルエンジニアリング
盗み見、盗み聞き、ゴミ箱を漁るなどして機密情報を盗む方法。

### サイドチャネル攻撃
半導体機器から得られる物理情報（処理時間、消費電力、電磁波など）から暗号鍵を推測し機密情報を取得する。


## おわりに
今回は、セキュリティ攻撃の種類について確認していきました。
簡潔に攻撃手法について説明してきましたが、実際はもっとたくさんの攻撃手法があり、簡単に防げるものではありません。
応用情報を受ける皆さんは、ITサービスに関わる人が多いと思いますので、セキュリティに関する知識は必須の内容となりますので、その入り口として覚えていただけたらと思います！

明らかな誤りがありましたら、ご連絡いただけたらありがたいです。

では、応用情報技術者試験の学習、引き続き頑張りましょう！
[どうでもいい] 10進数でも2進数でも回文になる年齢って珍しい？を調査した

## まえがき

33歳になりました。:tada:
ふと、33はbit表現で`100001`だよなと思い、10進数でも2進数でも回文であることに気づきました。

どれくらい珍しいか調べてみました。

## 結果

|10進数|2進数|
|--|--|
|1| `1`|
|3| `11`|
|5| `101`|
|7| `111`|
|9| `1001`|
|33| `100001`|
|99| `1100011`|
|313| `100111001`|
|585| `1001001001`|
|717| `1011001101`|
|7447| `1110100010111`|
|9009| `10001100110001`|
|15351| `11101111110111`|
|32223| `111110111011111`|
|39993| `1001110000111001`|
|53235| `1100111111110011`|
|53835| `1101001001001011`|
|73737| `10010000000001001`|

## 結論

結構珍しそう

## ソースコード(Rust)

```Rust
use itertools::Itertools;

fn main() {
    for i in 1..100000 {
        if !is_kaibun_int(i) {
            continue;
        }
        let mut tmp = i;
        let mut v = vec![];
        while 0 < tmp {
            if tmp & 1 == 1 {
                v.push('1');
            } else {
                v.push('0');
            }
            tmp >>= 1;
        }
        if is_kaibun(&v) {
            println!("{} {}", i, v.iter().join(""));
        }
    }
}

fn is_kaibun_int(n: usize) -> bool {
    let s = n.to_string().chars().collect::<Vec<_>>();
    let l = s.len();
    (0..l).all(|i| s[i] == s[l - 1 - i])
}

fn is_kaibun(s: &Vec<char>) -> bool {
    let l = s.len();
    (0..l).all(|i| s[i] == s[l - 1 - i])
}

```