OmniAICreator/Qiita-1.07M huggingface dataset:
FlutterでAPI GatewayにJWT認証をしてAPI実行

## はじめに
FlutterアプリケーションからクラウドベースのAPIにアクセスする際、セキュリティと認証はとても重要な要素です！
この記事では、API Gatewayを使用してAPIを保護し、Flutterアプリケーションから適切に認証されたリクエストを送信する方法について説明します。

## 目次
1. 概要
2. 手順
    1. API Gatewayの認証設定を更新
    2. ユーザー認証用のJWTトークンを発行
    3. リクエストにJWTトークンを含めてAPI Gatewayにアクセス
3. まとめ

## 概要
API Gatewayは、クラウドベースのAPIのエンドポイントを簡単に作成、公開、管理できるサービスです。JWT（JSON Web Token）は、ウェブトークンの形式を使用して安全な情報を伝達するための標準化された方法です。この記事では、FlutterアプリケーションがAPI Gatewayを介して保護されたAPIにアクセスする方法に焦点を当てます。

## 手順
API GatewayにJWT認証を設定するには、次の手順を実行します。
1. API Gatewayの認証設定を更新する
2. ユーザー認証用のJWTトークンを発行する
3. リクエストにJWTトークンを含めてAPI Gatewayにアクセスする

## 詳細

### 1. API Gatewayの認証設定を更新する
今回は以下の記事を参考にGoogle CloudでAPI Gateway設定をしました。

https://dev.classmethod.jp/articles/google-cloud-api-gateway-handson/

使用するSwaggerファイルは以下です
```yaml
swagger: '2.0'
info:
  title: sample-api
  description: Sample API on API Gateway with a Google Cloud Functions backend
  version: 1.0.0
securityDefinitions:
  auth0_jwk:
    authorizationUrl: ""
    flow: "implicit"
    type: "oauth2"
    x-google-issuer: "xxx@iam.gserviceacouunt.com"
    x-google-jwks_uri: "https://www.googleapi.com/.../xxx@iam.gserviceacouunt.com"
    x-google-audiences: "https://xxx.an.gateway.dev/"
security:
  - auth0_jwk: []
schemes:
  - https
produces:
  - application/json
paths:
  /hello:
    get:
      summary: Greet a user
      operationId: hello
      x-google-backend:
        address: https://xxx.cloudfunctions.net/helloGET
      responses:
        '200':
          description: A successful response
          schema:
            type: string
```

### 2. 認証用のJWTトークンを発行する
以下のライブラリを使用してJWTトークンを取得します
(flutter_session_jwtといういかにも使えそうなライブラリもあったのですがバージョンがかなり不安だったのでこれを採用することに。。。)

https://pub.dev/packages/dart_jsonwebtoken

JWTトークン発行にはSwagger上で定義している`issuer`と`audience`, あとはサービスアカウントのアクセスキーを必要とします

上記を踏まえて、Swaggerファイルを使用して作成したAPI Gatewayに対してFlutterアプリ側からJWTトークンを取得するコードは以下の通り

```dart
import 'package:dart_jsonwebtoken/dart_jsonwebtoken.dart';

...

final jwt = JWT({
    'aud': Audience.one('https://xxx.an.gateway.dev'),
    'sub': 'xxx@iam.gserviceacouunt.com',
    'iss': 'xxx@iam.gserviceacouunt.com',
});

final jwtToken = jwt.sign(RSA(privateKey),
    algorithm: JWTAlgorithm.RS256, expiresIn: const Duration(minutes: 10));
```

### 3. リクエストにJWTトークンを含めてAPI Gatewayにアクセスする
あとはJWTトークンをheaderに含めてアクセスするだけです！

```dart
final Map<String, String> header = {
    HttpHeaders.authorizationHeader = 'Bearer $jwtToken',
    HttpHeaders.contentTypeHeader: 'application/json'
}

final url = Uri.parse('https://xxx.an.gateway.dev/hello');
await http.get(url, header: header);
```

## まとめ
FlutterアプリがAPI GatewayにJWT認証を使用してAPIにアクセスする方法について詳しく説明しました！
API Gatewayを使用することで、アプリケーションのセキュリティを強化し、安全にAPIにアクセスすることができます。ぜひお試しあれ！
【docker】yamlファイル生成ツール composerizeを使ってみる

#### composerize
docker作業で必須のyamlファイル。vimやviが無い環境であったり、yamlファイルの記述が苦手な人のためにyamlファイルをコマンドから生成できるツール

#### 環境
```
CentOS 7.9.2009
docker 24.0.7
node 16.15.0
npm 8.5.5
```

npmでインストール
```
 npm install composerize -g
 ```

 インストール確認
 ```
 which composerize
 ↑これでインストール先が表示されればOK
 ```
 ちなみに
 composerize  --version
 composerize  -v

 とかはない。

 #### 使ってみる
 
```
composerize docker run -p  8080:80  -v /data/html:/tmp/docker.sock:ro --restart always --log-opt max-size=1g httpd:latest > httpd.yaml
```
でyamlファイルが生成される
```
vim httpd.yaml
```
```
name: <your project name>
services:
  httpd:
    ports:
      - 8080:80
    volumes:
      - /data/html:/tmp/docker.sock:ro
    restart: always
    logging:
      options:
        max-size: 1g
    image: httpd:latest
```
残念ながらバージョンは入らなかったが、そこだけ手動で修正し
    ```
    docker compose -f ./httpd.yaml up -d
    ```
    で起動できた。
Oracle実験室 / Oracle Database 19c (19.3) / トレースファイルの定期的な削除

Oracleデータベースを連続稼働しているとトレースファイル等が溜まってきますので定期的に削除するためのスクリプトです.
必要に応じて, 削除前にzipアーカイブするなどします.
運用する環境に応じて,変数`COMMANDS`に対象ファイルの検索条件を追記してください.

- シェルスクリプトファイルを作成・配置します.
```bash:~/bin/remove_old_files.sh
#!/bin/bash
##
## @file remove_old_files.sh 
##
## @brief Oracleの古いトレースファイル等の削除
##
## @details Oracleデータベース起動中はトレースファイル等のファイルが自動生成されます.<br/>
##          データベースを連続稼働する場合は, これらのファイルは適切なタイミングで削除する必要があります.<br/>
##          このスクリプトは, これら自動生成されるファイルのうち"一部の"ファイルを削除します.<br/>
##
## @param [in] $1 保存期間(日数)
## @param [in] $2 ORACLE SID
##
## @note 監視対象のファイルを追加する場合はCOMMANDS変数のfindコマンドで指定してください.<br/>
##
## @return none.
##
# ユーザー環境変数読み込み
. ~/.bash_profile

# ログファイル定義
LOGFILE=/var/tmp/remove_old_files_`date "+%Y%m%d_%H%M%S"`.log

# 変数定義
KEEP_DAYS=$1
ORACLE_SID=$2
ORACLE_BASE=`orabase`      # oracle db verion 12c or later.
ORACLE_HOME=`orabasehome`  # oracle db verion 12c or later.
echo "[INFO] KEEP_DAYS="${KEEP_DAYS}     >> ${LOGFILE}
echo "[INFO] ORACLE_SID="${ORACLE_SID}   >> ${LOGFILE}
echo "[INFO] ORACLE_BASE="${ORACLE_BASE} >> ${LOGFILE}
echo "[INFO] ORACLE_HOME="${ORACLE_HOME} >> ${LOGFILE}

# ファイル検索コマンド定義
COMMANDS=(
  "find ${ORACLE_BASE}/admin/${ORACLE_SID}/adump -name "*.aud" -type f -mtime +${KEEP_DAYS}"
  "find ${ORACLE_BASE}/diag/rdbms/${ORACLE_SID,,}/${ORACLE_SID}/trace \( -name "*.trc" -o -name "*.trm" \) -type f -mtime +${KEEP_DAYS}"
  "find ${ORACLE_HOME}/rdbms/log \( -name "*.trc" -o -name "*.trm" \) -type f -mtime +${KEEP_DAYS}"
)

# ファイル検索コマンド実行
for cmd in "${COMMANDS[@]}"; do
  echo "[INFO] cmd="$cmd >> ${LOGFILE}
  eval $cmd | grep -q .
  if [ $? -eq 0 ]; then
    eval $cmd | xargs ls -l >> ${LOGFILE}
#    eval $cmd | xargs rm -f    # uncomment after testing
  else
    echo "[INFO] file not found." >> ${LOGFILE}
  fi
done

echo "[INFO] done." `date "+%Y-%m-%d %H:%M:%S"` >> ${LOGFILE}
```
- crontabに登録します.
適切なタイミングでスクリプトが実行されるように設定します.
```bash
# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name command to be executed
5 5 * * * sh /home/oracle/bin/remove_old_files.sh 7 ORCLCDB > /dev/null 2>&1
```
go.modが作成されない🔰


```

go mod init 

go mod tidy

```

上記コマンド実行後の結果です



```
MacBook-puro todo_app % go mod init

go: cannot determine module path for source directory /Users/氏名/Desktop/未定義/todo_app (outside GOPATH, module path must be specified)

Example usage:

'go mod init example.com/m' to initialize a v0 or v1 module

'go mod init example.com/m/v2' to initialize a v2 module



Run 'go help mod init' for more information.

MacBook-puro todo_app % go mod tidy

```


・解決
```
go mod init 任意のモジュール名（部品名）

go mod tidy
```

・モジュール名を指定してない又は、モジュール名は任意だと認識して新しい名を記入していた点
＞　ディレクトリ内のファイル名todo_appにすれば解決できました。


![スクリーンショット 2024-03-09 16.09.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3170680/ce9e9224-59b0-f35f-aae3-80b65909c2ea.png)

・Goモジュールについてお調べ

Go言語では、コードの整理とバージョン管理を簡単にするために、モジュールという考え方が取り入れられています。関連するコードをひとまとめにしたもので、特定のフォルダに配置されます。各モジュールは個別の名前を持ち、他のモジュールからそれを呼び出すことができます。

・go mod initってなんだっけ　？

go mod init コマンドは、Go言語で作ったプログラムを、便利に管理するための手段です。例えば、他の人が作ったプログラムを自分のプログラムで使いたい場合、そのプログラムをダウンロードする必要があります。go mod init を使うと、ダウンロードしたプログラムを管理しやすくなります。

go mod init を実行すると、自分のプログラムがどのような依存関係を持っているかを記録するファイルが作られます。これによって、他のプログラムを使う際にどのバージョンを使うかを決めたり、プログラムの再現性を確保したりできます。これにより、プログラムの作成や管理が簡単になります。
Unity Physicsの導入と設定について

## はじめに
この記事では、`Unity Physics`を使い始めるためのステップバイステップのガイドを提供します。`Unity Physics`は、ゲーム開発やシミュレーションのための強力な物理エンジンです。これを利用することで、リアルな物理挙動をゲーム内で再現することができます。

## Unity HubとUnity Editorのインストール

### Unity Hubのインストール
1. [Unityの公式ウェブサイト](https://unity.com/ja/products)にアクセスして`Unity Hub`をダウンロードします。個人利用であれば`Unity Personal`で十分です。

2. ダウンロードしたインストーラーを実行し、画面の指示に従ってインストールします。

### Unity IDの作成
1. `Unity Hub`インストール後、アプリを立ち上げるとサインインを求められます。アカウントを作成していない場合はアカウントの作成を行ってください。

2. 必要な情報を入力し、メールアドレスでの認証を行います。

### Unity Hubでのサインイン
1. アカウント作成後、`Unity Hub`を開きます。
2. 画面右上の`Sign in`をクリックして、作成した`Unity ID`でサインインします。

### Unity Editorのインストール
1. `Unity Hub`の`Installs`タブを開き、`ADD`をクリックします。
2. 必要な`Unity`のバージョンを選択し、`Next`をクリックします。
3. 追加コンポーネントの選択画面で`Microsoft Visual Studio Community`を選び、インストールを開始します。
4. インストールが完了するまで待ちます。数分程度かかると思います。

※もしくは、以下のような画面が表示されるので`Install Unity Editor`をクリックしてインストールを開始してください。
    
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3116202/f5780e41-9d84-24f9-4ed4-c261475af414.png)

## 新しいプロジェクトの作成

1. `Unity Hub`の`Projects`タブから`New project`をクリックします。
2. 好みのプロジェクトのテンプレートを選択します。
3. プロジェクトに名前を付け、場所を指定し、`Create project`をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3116202/2212386c-5ef1-0444-4cf6-8a174c90c30a.png)

### エラーハンドリング
プロジェクト作成時に以下のエラーが発生することがあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3116202/9173cace-fd19-3019-185b-40b9e59b0a1c.png)

このとき、試しにプロジェクトをデスクトップに作成してください。
作成できる場合は、プロジェクトの保存先(ディレクトリ)の所有者がユーザと異なっている（rootなど)ことが原因の可能性が高いです。保存先の所有者を確認の上、変更してみてください。


## Unity Physicsのセットアップ

1. 新しいプロジェクトが開かれたら、`Window`→`Package Manager`を開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3116202/7c3775a1-a7d6-2e23-6097-6fb96d4c15f2.png)
2. `Packages: In Project`をクリックした後、`Unity Registry`をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3116202/ac2335e0-35a8-efb4-37ef-22b9b33f19a0.png)
3. `Physics`関連のパッケージを探し、`Install`をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3116202/9bb6a6d7-3bb9-c7b1-f833-dc57221c9059.png)




## 基本的な物理シミュレーションの作成

1. `ゲームオブジェクト`タブをクリックし、`3Dオブジェクト`→`キューブ`を選択してキューブを作成します。
2. `平面`オブジェクトを追加して地面を作ります。
3. 他にもいろんなことができるので試行錯誤してみてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3116202/2561e1a5-400f-8eba-e636-6e62a466ddf1.png)


## まとめ
上記の手順で`Unity Physics`を使って基本的な物理シミュレーションを作成することができます。

## 参考資料
- [Unity - Manual: Unity Hub](https://docs.unity3d.com/Manual/GettingStartedUnityHub.html)
- [Unity - Manual: Installing Unity](https://docs.unity3d.com/Manual/InstallingUnity.html)

- 日本語表示の方法

https://qiita.com/KM9973/items/109f4caaa8561c8ef35c
Next.jsのRoute handlersでapollo-serverを起動


```typescript
import { gql } from "apollo/client";
import { ApolloServer } from "@apollo/server";
import { startServerAndCreateNextHandler } from "@as-integrations/next";
import { NextRequest } from "next/server";

export const runtime = "nodejs";

const typeDefs = gql`
  type Mutation {
    hello(name: String): String
  }

  type Query {
    getName: String
  }
`;

const resolvers = {
  Mutation: {
    hello: (name: string) => `Hello, ${name}`,
  },
  Query: {
    getName: () => "seiya",
  },
};

const handler = startServerAndCreateNextHandler<NextRequest>(
  new ApolloServer({
    typeDefs,
    resolvers,
  }),
  {
    context: (req) => Promise.resolve({ req }),
  },
);

export { handler as GET, handler as POST };
```

runtimeの指定はデフォルトの `nodejs` であればそのままでいいが、どこかでデフォルトを `edge` にしていると `Can't resolve 'crypto'` というエラーが出てしまうので、明示的に `nodejs` として指定したほうがいい。

元ネタ: https://medium.com/@jareerzeenam/implementing-graphql-and-apollo-server-with-next-js-13-4-a-simple-guide-app-directory-77e38eb697e3
【UML】UMTP認定試験 L1 受験レポート

## この記事について

筆者が先日受験したUMTP認定試験 L1について、受験した経緯や受験に向けての学習、受験当日の様子などをまとめています。
UMLに興味がある人、UMTP認定試験 L1の受験を考えている人の参考になれば幸いです。

## UMTP認定試験とは

UMTP認定試験とは、UMLモデリング推進協議会（UMTP）によって運営されるUMLモデリングスキルの認定試験です。現在はL1からL4までの4レベルに分類されており、今回私が受験したのはUMLの基礎知識が問われるL1[^1]です。

[^1]:https://umtp-japan.org/about_exam/exam_gaiyo/l1

https://umtp-japan.org/about_exam

## 受験した経緯

ソフトウェア設計やドメインモデリングに関心があり、設計活動やコミュニケーション活用するためUMLについて学習しています。そんな中で先日、試験対策セミナー[^2]の案内を受け取り、そのセミナーの参加を機に認定試験をモチベーションにUMLの学習と理解度の確認をしようと考えました。

[^2]:https://umtp-japan.org/event-seminar/13304


## 受験に向けた学習

試験対策セミナーで紹介された『【改訂版】UMLモデリング技能認定試験 ＜入門レベル（L1）＞問題集』で学習しました。
第２版が2007年発売と少し古く、試験に関する情報は古いものがありましたが、試験範囲を網羅的に学習することができました。

https://gihyo.jp/book/2007/978-4-7741-3245-7

## 受験の申し込み

L1試験は２つの試験配信会社で実施されますが、私はピアソンＶＵＥより行いました。こちらは今回受験したL1だけでなく次のL2も実施しているので、先を見据えてこちらを選択しました。

まず、UMTPサイト内のリンクからピアソンＶＵＥのサイトへ行き、そこでアカウントを作成します。注意が必要なのは、まず英語で氏名や住所の入力が求められる点です。その後に日本語での入力もすることになりますが、実際の試験などで英語の方が使用されています。
また「L1 Exam ID」を入力するフォームが登場します。この項目には心当たりがなく、スキップしてアカウント作成を完了することはできましたが、気になったのでUMTPに問い合わせました。UMTPの回答は「受験時等に必要となるものではありません。」とのことで、実際に受験が終了するまで特に問題になることはなかったのですが、結局項目の詳細は不明なままなので入力が必要なケースはあるのかもしれません。

アカウントを作成したら次はL1試験の受験申込をします。作成したアカウントでピアソンＶＵＥにサインインし、試験の予約を開始します。試験会場や日時の選択、支払い情報（クレジットカード）を入力し予約を完了します。試験は会場が開いている時間であればいつでも受験できるようです。

申込が完了したら、あとは予約した日時に会場へ行って受験します。

## 受験当日

受験前に手続きがあるので時間に余裕を持って会場に向かいましょう。書類への記入や本人確認、所持品の預け入れ、所持品チェックなどがあります。

受験前の手続きが終わったら試験室に入って受験します。メモ用のホワイトノート（A4くらいのホワイトボード？）とペンを受け取り、案内に従って指定の席にあるパソコンで受験します。

今回受験したL1は30問選択式で80分です。私は60分くらいで一通り回答し、20分ほど見直し、残り10分ほどで受験を終えて試験室を退出しました。退出後すぐに合否が書かれたレポートを受け取ります。全体と各分野毎の正答率が分かりますが、残念ながら問題についての解答・解説は無いようです。

## 受験した感想など

受験した結果は得点93%で合格でした。

図の表記など覚えることは多いですが、私はオブジェクト指向言語でのプログラミング経験やシステム開発の経験があるので、それに結びつけることで短時間の学習で済みました。もしこれらの経験がなかったり、より万全を期すのであれば、別の参考書や問題集と合わせて学習するのが良いと思います。

今回は無事合格しましたが、試験問題の中には迷うところがあったり誤答もあったので、引き続き学習を進めつつ次はL2に挑戦したいと思います。

## まとめ

今回UML学習の一環としてUMTP認定試験のL1を受験したので、その体験を記事として公開することにしました。L1受験を考えている人の参考になれば幸いです。
[mac] 音声出力先を変更するホットキーを作成する方法

# なぜホットキーを作成するのか
OBS Studio と Black Hole を使って、画面の収録をできるようにしたのだが、
音声出力先を毎回切り替えるのが面倒になり、ホットキーで切り替えたいと考えたからです。

<details><summary>通常の音声出力先切替え: クリック数多くてだるい。。。</summary>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463767/cf16d725-3982-2aac-be98-565269682120.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463767/6a159d90-57fb-b181-cc5e-f05762b022ae.png)

</details>


# ホットキーの作成のやり方


[Keyboard Maestro](https://www.keyboardmaestro.com/main/) のマクロで実現しています。

また、音声出力切替は[switchaudio-osx](https://github.com/deweller/switchaudio-osx)を使用しておりますので、あらかじめターミナル上で、
```
brew install switchaudio-osx
```
を実行しインストールしておきます。
ターミナルで、
```
SwitchAudioSource -a -t output
```
と実行すると、音声出力先の一覧が得られます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463767/bd0ea465-8bab-bd29-ed3d-e9fb91fd8008.png)

次にKeyboard Maestro で次のようにマクロを組めばOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463767/7426d2c4-472a-4b96-cf24-c1a0d394ce65.png)

↓最後の`Execute text script`のところ、コピペ用
```
if [[ "$KMVAR_deviceName" == *"MacBook Air"* ]]; then
  deviceName=$(/opt/homebrew/bin/switchAudioSource -a | grep "MacBook Airのスピーカー")
else
  deviceName="$KMVAR_deviceName"
fi
/opt/homebrew/bin/switchAudioSource -s "$deviceName"
```

# ハマったポイント
普通は、最後の`Execute text script`のところは、
```
/opt/homebrew/bin/switchAudioSource -s "$KMVAR_deviceName"
```
だけで良いと思うのですが、これだと"MacBook Airのスピーカー"に切り替えられなくなる現象が発生します。

再現するには、`Execute text script`のところ、
```
/opt/homebrew/bin/switchAudioSource -s "$KMVAR_deviceName"
/opt/homebrew/bin/switchAudioSource -a -t output
```
として、Runを実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463767/85f7d0f5-0337-bd8e-3e01-717407520676.png)
すると、なぜか"MacBookAirのスピーカー"を選択したときだけ、「見つからないよ」と怒られる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463767/69556c2b-d30a-35dc-1af7-2051797f7dc5.png)

なので、一度音声出力一覧を吐かせて、そこからデバイスネームを取得するようにしました。

（おわり）
VBでシリアルポート通信した時にフリーズしてしまう対処方法


VBでシリアルポート通信した時にフリーズしてしまう場合の対処方法の1つを紹介します。

:::note warn

※ これは2016-10-29に[個人ブログ](https://bicstone.me)で公開した記事を移植し、[CC0-1.0](https://creativecommons.org/publicdomain/zero/1.0/deed.ja)で提供しています。情報は古い可能性があります。

:::

## 現象

VB(.net)で作ったプログラムにおいてシリアル通信しようとしたのですが、不定期なタイミングでフリーズ、しかもデバッグツールまでフリーズするという現象が起こりました。

## 対処方法

バッファオーバーフローが原因なので、シリアル通信のプロパティより、バッファを大きくします。「ReadBufferSize」、「WriteBufferSize」です。10MBに設定しました。

![sSerialPort の ReadBufferSize と WriteBufferSize の値を大きくする( `10000000` など)](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684999/e7561cf8-ad1d-8e8f-9665-fe008d1ea982.png)
「発行先の共有が必要です。」エラーの対処方法


ネットワークの場所の追加をする際に「発行先の共有が必要です。別の場所を試してください。」というエラーが発生した時の対処方法です。

:::note warn

※ これは2016-10-25に[個人ブログ](https://bicstone.me)で公開した記事を移植し、[CC0-1.0](https://creativecommons.org/publicdomain/zero/1.0/deed.ja)で提供しています。情報は古い可能性があります。

:::

## 現象

「ネットワークの場所の追加」にて「発行先の共有が必要です。別の場所を試してください。」というエラーが発生してしまう。

![「発行元の共有が必要です。別の場所を試してください。」　というエラーが表示されます](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684999/0efad4d0-6e29-4934-de19-b760f3dfd0a8.png)

## 原因

翻訳がとてもわかりにくいのですが、接続先から認証を求められたので「発行先の共有が必要です」なのです。認証を求められたとしたら「ネットワークの場所の追加」では接続できません。

## 対処方法

「ネットワークドライブの割り当て」を使用します。「別の資格情報を使用して接続する」を選択してください。

1. エクスプローラーの「PC」→「コンピューター」→「ネットワークドライブの割り当て」を選択
   ![エクスプローラーの「PC」→「コンピューター」→「ネットワークドライブの割り当て」を選択](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684999/b1c55a52-464c-afe8-5f57-5274d6f8c1e4.png)
1. 「割り当てるネットワークフォルダーを選択してください」で「別の資格情報を使用して接続する」をオンにした状態で「完了」を選択
   ![「割り当てるネットワークフォルダーを選択してください」で「別の資格情報を使用して接続する」をオンにした状態で「完了」を選択](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684999/8f378dba-aac2-ea27-8552-e32f83e18d47.png)
1. Windowsセキュリティ」の「ネットワーク資格情報の入力」でIDとパスワードを登録する
   ![「Windowsセキュリティ」の「ネットワーク資格情報の入力」でIDとパスワードを登録する](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684999/f2087236-4857-ef4f-4dff-5747609a9a1a.png)
1. エクスプローラーPCの「ネットワークの場所」にドライブが追加される
   ![エクスプローラーPCの「ネットワークの場所」にドライブが追加されます。](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684999/f30e3228-b069-7cd1-0b4d-c737c3bdc05c.png)
IISサーバへのFTPアクセスで「550 parameter is incorrect ftp」


IISサーバへのFTPアクセスで `550 parameter is incorrect ftp` が発生した場合の対処方法の1つを紹介します。

:::note warn

※ これは2016-10-29に[個人ブログ](https://bicstone.me)で公開した記事を移植し、[CC0-1.0](https://creativecommons.org/publicdomain/zero/1.0/deed.ja)で提供しています。情報は古い可能性があります。

:::

## 現象

IISで動かしているFTPサーバへとあるFTPソフトで接続し、削除をしたところ、 `550 parameter is incorrect ftp` エラーが発生して削除コマンドが無視されてしまいました。

## 対処方法

IISマネージャー →「サイト」→FTP→「FTPディレクトリの参照」→「ディレクトリの表示スタイル」を `MS-DOS` にし、「ディレクトリの表示オプション」の「西暦を4桁で表示」をオフにする。

![IISマネージャー→「サイト」→FTP→「FTPディレクトリの参照」→「ディレクトリの表示スタイル」を「MS-DOS」にし、「ディレクトリの表示オプション」の「西暦を4桁で表示」をオフにする](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684999/c3a89d18-87e7-dfc0-c5ef-1f1bd6ddb278.png)

これでも対処しない場合、他のFTPソフトを用いるか、他の対処方法を検索してみてください。
「notification.dllが登録されていません」エラーの対処法


Windows Vistaや7などで見られる、「Notification.dll登録されていません。プログラムは正常に動作しません」の対処方法の1つを紹介します。

:::note warn

※ これは2016-10-22に[個人ブログ](https://bicstone.me)で公開した記事を移植し、[CC0-1.0](https://creativecommons.org/publicdomain/zero/1.0/deed.ja)で提供しています。情報は古い可能性があります。

:::

## 原因

「server」サービスが起動できないために発生します。

## 対処方法

1. Windows+Rキーで「ファイル名を指定して実行」を起動します。
2. 「services.msc」を入力して開きます。
   ![ファイル名を指定して実行で、 `serivces.msc` を起動する](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684999/d8f3a3ad-d112-6ea0-d496-b77a5e990307.png)
3. 「Server」を見つけ、プロパティを開きます。
   ![Serverサービスを選択し、プロパティを開きます](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684999/979e7d2e-b05f-7a6a-57f7-cf003f870508.png)
4. 「スタートアップの種類」を「自動」にしたあと、「開始」をクリックします。
   ![「スタートアップの種類」を「自動」にしたあと、「開始」をクリックします。](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684999/b897115e-1470-9212-f03b-61137e8e2f77.png)
5. PCを再起動します。

これ以外にもネットワーク関係のドライバが影響している可能性もあります。ネットワーク関係のドライバー再インストールもお試しください。
simplexml_load_fileで要素名にハイフンがついていると読み込めない


simplexml_load_fileで要素名にハイフンがついていると読み込めず、「`Parse error: syntax error, unexpected ‘[‘`」エラーが発生する場合の対処方法です。

:::note warn

※ これは2016-10-25に[個人ブログ](https://bicstone.me)で公開した記事を移植し、[CC0-1.0](https://creativecommons.org/publicdomain/zero/1.0/deed.ja)で提供しています。情報は古い可能性があります。

:::

## 現象

simplexml_load_fileで取得できなかったUser-Agents.orgのxmlは次のとおりになっていました(抜粋)。

```xml
<user-agents>
  <user-agent>
    <String></String>
  </user-agent>
</user-agents>
```

次のPHPコードを実行するとエラーが発生しました。

```php
<?php
$xml=simplexml_load_file("http://www.user-agents.org/allagents.xml");
print($xml->user-agent[0]->String);
?>
```

```plain
Parse error: syntax error, unexpected ‘[‘ in test.php on line 3
```

## 原因

メンバ変数名に特殊文字が入っているため発生します。

https://xtech.nikkei.com/it/article/COLUMN/20080619/308711/

## 対処方法

次のように変更しました。

```php
$xml->user-agent[0]->String;
```

↓

```php
$xml->{'user-agent'}[0]->String;
```
SiteGuardを導入するとHTTP_ACCEPT_ENCODINGなどのHTTPヘッダが削除されてしまう件


「SiteGuard」を導入にすると一部のHTTPヘッダーがとれなくなります。意外と気付かず条件設定などにおいてハマってしまうことがあります。

:::note warn

※ これは2016-09-28に[個人ブログ](https://bicstone.me)で公開した記事を移植し、[CC0-1.0](https://creativecommons.org/publicdomain/zero/1.0/deed.ja)で提供しています。情報は古い可能性があります。

:::

## 概要

さくらのレンタルサーバを使用しているサイトにおいてgzip圧縮データを返すようなPHPを作って動作確認していたのですが、いかなる環境で接続しても圧縮されたデータが返されませんでした。「`$_SERVER['HTTP_ACCEPT_ENCODING'];`」の値が常に空だったのです。

他のサーバーにあげたら利用できたのでさくらのレンタルサーバの環境が原因なのかと思っていました。他のサイトにあった記事ではさくらのレンタルサーバ固有の問題であるという書き方がなされていました。しかし、さくらのレンタルサーバで作っているテスト用ドメインでは動作したのです。

…あれ？

「`phpinfo();`」を眺めていて気が付きました。両方のサーバーでHTTPヘッダーに違いがあったのです。

## HTTPヘッダーの違い

「SiteGuard」を有効にしているサイトでは次のHTTPヘッダーが削除されていました。

```plan
HTTP_CONNECTION
HTTP_ACCEPT_ENCODING
```

一方で次のHTTPヘッダーが追加されていました。

```plain
HTTP_VIA = 1.0 ss212.guard.sakura.ne.jp:80 (JP-Secure/siteguard_http_01/520/ss212.guard.sakura.ne.jp)
```

## まとめ

「SiteGuard」によって一部のHTTPヘッダーが削除されていることがわかりました。
さくらのレンタルサーバにてGZIP圧縮が出来ないときの対処法


さくらのレンタルサーバにてmod_deflateを用いたGZIP圧縮が出来ないときの対処法です。

:::note warn

※ これは2016-09-28に[個人ブログ](https://bicstone.me)で公開した記事を移植し、[CC0-1.0](https://creativecommons.org/publicdomain/zero/1.0/deed.ja)で提供しています。情報は古い可能性があります。

:::

## 対処方法

.htaccessで「`SetOutputFilter DEFLATE`」を記載してもgzip圧縮は出来ない場合があります。原因は「Webアプリケーションファイアウォールの設定」です。

さくらのレンタルサーバのコントロールパネルから「Webアプリケーションファイアウォールの設定」を開いてみてください([直リンク](https://secure.sakura.ad.jp/rscontrol/rs/waf))。対象のドメインにおいて「利用する」となっている場合は無効に設定してください。

強制的にGZIPを使用するようにする「`SetEnv force-gzip`」を指定するのは避けましょう。

## 原因

Webアプリケーションファイアウォールはアクセス時に一部の情報を切り取ってしまいます。その情報の中には、ブラウザがGZIP圧縮に対応しているという情報(`HTTP_ACCEPT_ENCODING`)が含まれています。詳細はこちらの記事に掲載しています。

https://bicstone.me/siteguard-environment-variable/
なでしこで「～」が文字化けする際の対処方法


なでしこで「～」が「?」へ文字化けすることがあります。その対処方法です。

:::note warn

※ これは2016-10-22に[個人ブログ](https://bicstone.me)で公開した記事を移植し、[CC0-1.0](https://creativecommons.org/publicdomain/zero/1.0/deed.ja)で提供しています。情報は古い可能性があります。

:::

## 波ダッシュ問題

いわゆる波ダッシュ問題によるものです。詳細はWikipediaを見てください。

https://ja.wikipedia.org/wiki/%E6%B3%A2%E3%83%80%E3%83%83%E3%82%B7%E3%83%A5#Unicode.E3.81.AB.E9.96.A2.E9.80.A3.E3.81.99.E3.82.8B.E5.95.8F.E9.A1.8C

## 対処方法

なでしこにおける「SJIS変換」や「UTF8N変換」などを用いず、「NKF変換」を用いるようにしましょう。「SJIS変換」や「UTF8N変換」などはWindows環境以外のShift-JISと判断して変換します。「MKF変換」は状況に応じて適切に変換します。

http://nadesi.com/man/index.php?NKF%E5%A4%89%E6%8F%9B

「NKF」とはLinux標準の命令です。

https://xtech.nikkei.com/it/article/COLUMN/20060227/230849/?rt=nocnt

Shift-JISに変換する場合は、`「s」でNKF変換`

UTF-8に変換する場合は、`「w」でNKF変換`

とします。
Ubuntu Server 22.04LTSでIPアドレスを固定する方法

備忘録的記事なのとQiita記事投稿が初めてなので、雑多な内容になるかと思いますが、後から見返して自分が分かればいいなレベルで書いてますので許してください。

UbuntuServer 22.04からIPアドレスを変える方法が変わったらしく、古い方式でIPアドレスを固定化できず困ったので簡単にまとめます。

###### まずは、今使ってるipアドレスを確認します。
以下のコマンドを打って、動的に割り当てられているIPアドレス、使用しているインターフェースを確認します。
```
ip addr
```

###### ipアドレス設定記述ファイル格納ディレクトリへ移動します。
```
cd /etc/netplan
```

###### ipアドレス設定記述ファイルをViなどのエディタで開きます。
```
sudo vi 99_config.yaml
```

###### 開いたファイルの下記のように編集します。
``` 99_config.yaml
network:
  version: 2
  renderer: networkd
  ethernets:
    eth0:　　　　　　　　　　　　　　　　　　　//使用するインターフェースを指定する
      dhcp4: false
      dhcp6: false
      addresses: [192.168.0.200/24]　　　　　//ipアドレスを指定する
      routes:                            
        - to: default
          via: 192.168.0.1　　　　　　　　　　//デフォルトゲートウェイを指定する
      nameservers:
        addresses: [8.8.8.8 , 8.8.4.4]　　//使用するDNSサーバーを指定する
```

###### 編集が終わったら保存して反映します。
```
netplan apply
```

SSH等で接続してる場合は接続が切断されますので、再接続してください。

-以上-
Minecraft Skript - 3. コマンドを作ろう

# おい！サボってんじゃねぇ！
前回の投稿日時:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3529047/d1f55991-64de-7116-a98b-94e2a6c187ba.png)
ずーっと更新してませんでした。ごめんなさい。

さて、今日はコマンドを作りましょう。
非常に多くのパターンがありますが、主に使うものだけまとめました。

# 基本的な形
```yaml
command /hello:
    trigger:
        send "Hello Skript!" to player
```
超シンプルですね。
`command /<コマンド名> <arg>`の形となっています。
`<arg>`には`text`や`number`、`player`などが入ります。

# 特定の権限を持つユーザーのみに使用させたい場合
```yaml
command /forcetp [<player>]:
    permission: meow.admin #ここで指定
    permission message: 権限がないのに実行しようとするなんて...あんた馬鹿ぁ？ #権限不足時のメッセージ
    trigger:
        teleport arg-1 to {lobby}
        send "&aSuccess!"
```
これも簡単。`meow.admin`という権限を持つユーザーのみ実行可能になりました。
`permission message`はお好みでどうぞ。

:::note info
OP権限を持つユーザーにのみ実行させたい場合は
`op`または`admin`とすることで可能です。
:::

# 実行可能な対象を指定したい場合
```
command /togglesecurity:
    executable by: console
    trigger:
        #コード
```
シンプル。素晴らしい！

:::note info
`executable by`には`console`,または`players`を指定できます。
:::

# コマンドのエイリアスを作成する場合
```
command /longlongcommand:
    aliases: /shortcmd, /scmd
    trigger:
        #コード
```
人によってはよく使いそうですね。

:::note warn
複数個のエイリアスが必要な場合は`,`で区切るようにしてください。
:::

# おわり！
「こういうの紹介してよ」みたいなのがあれば是非コメントしてください。
またどこかでお会いしましょう :wave:
javascriptにおける計算式（文字列）の計算

## はじめに

会社のシステム開発において文字列で入力した計算式を計算するというものを作成しているのですが、少し思い通りいかなかった部分を備忘録がてら記載しております。

## 内容

例えば、以下の文字列で構成された計算式を計算しようと思うとエラーが発生してしまいます。
```javascript
var string = "1--1-+1+-1"
var result = Function('return ('+string+');')();
console.log(result);
```
これは、途中で ```--``` を含んでいるため、これを置換すれば計算は通ります。
```javascript
var string = "1--1-+1+-1".replace("--","+");
var result = Function('return ('+string+');')();
console.log(string);
console.log(result);
```
```
1+1-+1+-1
0
```
また、()の隣に演算子がない場合にもエラーになります。
```javascript
var string = "1+2(1+2)(3+4)2+1";
var result = Function('return ('+string+');')();
console.log(result);
```
こちらも、掛け算をするよう文字を置換する必要があります（。
```javascript
// 数字( → 数字*(、)数字 → )*数字、)( → )*(）と変換
var string = "1+2(1+2)(3+4)2+1".replace(/(\d+)(\()/g,"$1*$2").replace(/(\))(\(|\d+)/g,"$1*$2");
var result = Function('return ('+string+');')();
console.log(string);
console.log(result);
```
```
1+2*(1+2)*(3+4)*2+1
86
```
TypeScriptの基本文法

### はじめに
最近TypeScriptを学んだので基本文法をまとめた。
今回まとめたのは一部分であり、やり方は他にもあるためこれから学んでいきたい。
TypeScriptとは、JavaScriptを拡張して開発された言語であり、大きな違いは静的型付け言語である。

## 変数宣言
```ts
let testNum: number = 1;
let testStr: string = 'aaa';
// 型推論も利用できる
let b = 'bbb';
```
## 配列
```ts
let numbers: number[] = [1, 2, 3, 4, 5];
console.log(numbers) // [ 1, 2, 3, 4, 5]

// pop()：末尾の要素を削除し、それを返却する
let lastNum: number = numbers.pop(); 
console.log(lastNum) // 5
console.log(numbers) // [ 1, 2, 3, 4 ]

// push()：末尾に要素を追加する
numbers.push(6);
console.log(numbers) // [ 1, 2, 3, 4, 6]
```
## 条件分岐
```ts
let age = 10;
if (age >= 18) {
    console.log("You are adult.");
} else if (age >= 6) {
    console.log("You are youth.");
} else {
    console.log("You are child.");
}
// You are youth.
```
## 繰り返し（for）
```ts
let numbers = [1, 2, 3, 4, 5];
for (let num of numbers) {
   console.log(num);
}
// 1
// 2
// 3
// 4
// 5
```
## 繰り返し（while）
```ts
let numbers = [1, 2, 3, 4, 5];
let i = 0;
while (i < numbers.length) {
   console.log(numbers[i]);
   i++;
}
// 1
// 2
// 3
// 4
// 5
```
## 関数
```ts
let sum1 = function(x: number, y: number): number {
    return x + y;
};
let result1 = sum1(1, 2);
console.log(result1); // 3

// sum1を短縮した形
let sum2 = (x: number, y: number): number => {
    return x + y;
};
let result2 = sum2(3, 4);
console.log(result2); // 7
```
30秒で分かるURLとURIの違い

URIは「Uniform Resource Identifier」でWeb上にあるあらゆるファイルを認識するための識別子の総称。
URN（Uniform Resource Name）は、Web上での「名前」を指す
URLは「Uniform Resource Locator」はWeb上での「住所」を指す

URI = URL + URNと言われるが、
URI ≒ URLでもあるし、
URI ≒ URNでもある

例：URI=たちばな歯科医院の場所だとすると、
URL = 東京都渋谷区渋谷〇〇ビル
URN = たちばな歯科医院

つまり、歯科医院の場所は東京都渋谷区渋谷〇〇ビルでもあるし、たちばな歯科医院でもあるよねって話。
Macportsでコンパイルエラーが出た時のその場しのぎ

# 動機

`macOS Sonoma`をアップデート(14.4)し、`Xcode`をアップデート(15.3)にアップデートしたら、`macports`をコンパイルし直さないといけなくなってしまった。`clang`の関数ポインタの型チェックが厳しくなったらしく、多くのportsが依存している`libiconv`のコンパイルエラーで止まってしまった。

[バグレポート](https://trac.macports.org/ticket/69462)は出ているけど、Fixされるのに時間がかかるかもしれないので、ほとんどの`ports`が`libiconv`に依存しているので、クイックに対処したい。

# Macportsでのビルドの段階でのファイル修正

1. `port install xxxxxx`で止まったところで、ファイルを修正したあと`port -f install xxxxxx`と叩いて続きを行う。buildの過程で修正したファイルが別途上書きされてしまう可能性があるので、問題解決できない場合がある。
1. `port patch xxxxxx`で、ソースファイルが用意されたところでファイルを修正し、`port -f install xxxxxx`と叩いて続きを行う。この場合、毎回ファイル修正が必要
1. もし、`Macports`で配布されているpatchファイルなどの修正が必要な場合には、portコマンドを叩く前にパッチファイルを修正する。

# `libiconv @1.17`の問題

今回遭遇した(`lib/encodings.def` with an "incompatible function pointer types initializing" error)の問題は、３つ目の方法で解決できた。

```bash:例
% port -v -f clean --all libiconv
% sed -E -i.bak -e '/utf8mac_(mbtowc|wctomb)/ s/, int n)/, size_t n)/' \
                   `port -v -f dir libiconv`/files/patch-utf8mac.diff
% port -v -f install libiconv
```

# `gmp @6.3.0`の問題

なんか、次々にハマっているが、[`gmp`でも問題](https://trac.macports.org/ticket/69464)がある。`configure`の際に、`GNU m4`を見つけることができず、`Xcode Commandline Tools`をインストールしているのにも関わらず、`m4`を見つけてくれなくなった。`Xcode`,`Xcode Commandline Tools`を入れ直したり、`xcode-select -s ....` を変えてみたりしてもダメだったので、Portsfileに明示的は環境設定を追記することで回避してみた。

```bash:例
% port -v -f clean --all gmp
% cat >> `port -v -f dir gmp`/Portfile <<EOF
if {${os.platform} eq "darwin" && ${os.major} > 13 && [string match *clang* ${configure.compiler}]} {
    configure.env-append    M4=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/gm4
}
EOF
% port -v -f install gmp
```
PremiereProでテロップを燃え上がらせる手順

こんにちは。
株式会社クラスアクト インフラストラクチャ事業部の大塚です。

今回はタイトルの通り、動画内のテロップを燃え上がらせてｱﾁﾁｯ･･･!なテロップを
作る手順をメモしておきたいと思います。
※別に難しいことをしているわけではないのですが、メモっておかないとすぐ忘れてしまい
　毎回毎回調べなおすのがだるいのです。

# 作成したもの
この記事で作成したものはYouTubeにアップしてます。

https://youtu.be/luC4sYbI2Vg

# 用意するもの
以下の動画をテロップに使います。
ローカルにダウンロードします。

https://f-stock.net/fire_loop_04/

# 手順
まず白背景を準備したいと思います。
ダウンロードした炎の動画をPremiereProに読み込ませて、その後ファイル>カラーマットを選択します。
![2024030901.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/ac81ce55-f479-99ce-399b-fe14d53971e3.png)

これは一旦デフォルトのままでOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/acca37e0-6b4b-28e0-ae3d-430f17405b2f.png)

カラーピッカーが表示されるので"FFFFFF"を指定してOKを押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/02a7b909-47f4-67a2-2b38-93720506e4b4.png)

カラーマット名を聞かれるので任意の名前を入力します。
今回は"カラーマット"としました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/26893f77-56a8-dd38-d711-58873f629b59.png)

画面左上にカラーマットが作成されますので、これを画面下にD＆Dします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/2e4e5e6d-b1e9-afa1-d547-0fe0659cb3e5.png)

燃え上がらせる文字を用意します。
今回は"アーチーチーアーチー 燃えてるんだろうか（文字が）"とします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/dabd28cb-5ae2-94d0-dd4a-76f1533ccd81.png)

炎の動画をエッセンシャルグラフィックスに持っていきます。
![2024030903.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/ff84c456-db3b-2e9c-e5a2-c4ad6bb9c15d.png)

文章を選択した状態で"テキストでマスク"にチェックを入れてあげるとテロップが
燃え上がります。
![2024030904.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/0ac2ecde-daf3-60b8-0e4c-a13a528a7a58.png)

こういうのは文字が太いフォントや境界線を使ったり、BGM的な観点でいうと燃える音を追加したりするとより良いんだろうなぁと思いました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/5a2c0e49-7fc5-f232-5aa0-f7896ee33a16.png)
【BigQuery】ViewテーブルにもカラムのDescriptionが設定できるようになっていた話

# はじめに
2023年10月9日、BigQueryを扱う全ての運用担当者にとって待望の機能が一般提供されました（個人の感想です）
[リリースノート](https://cloud.google.com/bigquery/docs/release-notes#October_09_2023)
ViewテーブルのカラムにDescriptionを付けられるようになったのです！

恥ずかしながらリリースから4ヶ月遅れでこの事実を知ったのですが、私と同じくこの機能に気づいていない人に知って欲しくてこの記事を書きました

# 今まではカラムの説明がつけられなかった
CREATE文の実行時、通常のテーブルならばこのようにカラムに説明をつけられます

```sql
CREATE TABLE `test.purchase_logs` (
  item_id STRING OPTIONS (description = "商品ID"),
  user_id STRING OPTIONS (description = "購入者ID"),
  price INT64 OPTIONS (description = "商品価格(税込)"),
  datetime DATETIME OPTIONS (description = "購入日時(JST)")
) OPTIONS (
    description = "購入された商品情報"
);
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1217064/560a0919-f61b-bcd4-603b-e149a17f00ca.png)

しかし、なぜかこれまではViewテーブルにはカラムに説明がつけられなかったのです......
するとどうでしょう？カラム名だけでは仕様を把握しきれなくなってしまうのです
そうなればクエリから参照元のテーブルを確認しなければなりません

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1217064/5e931461-ede7-acd9-194a-c88b8c28bc6b.png)

# Viewのカラムに説明を付ける方法

それがBigQueryのアップデートによって今はこのように説明をつけられるようになりました
`CREATE TABLE`の時とほとんど変わりません

```sql
CREATE VIEW `test.purchase_logs_view` (
  item_id OPTIONS (description = "商品ID"),
  user_id OPTIONS (description = "購入者ID"),
  price OPTIONS (description = "商品価格(税込)"),
  datetime OPTIONS (description = "購入日時(JST)")
) OPTIONS (
    description = "購入された商品情報"
) AS
SELECT
  item_id,
  user_id,
  price,
  datetime
FROM
  `test.purchase_logs`
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1217064/70bf5668-e15f-063f-7237-df13e7f5cf69.png)

# データ型は設定できない
上のクエリを見るとわかるとおり、`CREATE VIEW`ではカラムのデータ型を書いてはいけません（書くとエラーになります）
その代わりSELECTした値に応じてデータ型が自動で設定されます
便利でいいのですが、稀にこの機能が邪魔になります
例えば、何らかの理由で`datetime`がNULLになる状態でViewを作成した時

```sql
CREATE VIEW `test.purchase_logs_view` (
  item_id OPTIONS (description = "商品ID"),
  user_id OPTIONS (description = "購入者ID"),
  price OPTIONS (description = "商品価格(税込)"),
  datetime OPTIONS (description = "購入日時(JST)")
) OPTIONS (
    description = "購入された商品情報"
) AS
SELECT
  item_id,
  user_id,
  price,
  NULL AS datetime
FROM
  `test.purchase_logs`
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1217064/2e901aef-f371-c9b2-1b51-cbf622ccbd0e.png)

このように意図しないデータ型になってしまうことがあります。
仮に`datetime`のNULLは障害で、のちに復旧した場合、復旧前に作ったViewは型違いでエラーになってしまいます

カラム名や説明と同様に任意のデータ型を指定できればいいのですが、残念ながら対応していないようです
メンバーシップ推定攻撃対策（MemGuard・概要編）

# はじめに
メンバーシップ推定攻撃の対策手法であるMemGuardの概要を紹介します。  

# MemGuard

### 基本的な考え方
モデルの出力にノイズを加えることで、メンバーシップ推定攻撃をしにくくする防御手法です。  
ノイズは、メンバーシップ推定攻撃の成功確率を最小化するように生成しますが、下記条件を満たす必要があります。  
1. ノイズによって予測ラベルが変更されない
2. ノイズの大きさの期待値が事前に決められた閾値以下
3. ノイズを加えた後の出力が、確率の条件を満たす（各要素が正かつ総和が1）

### 実装上の工夫
上記の条件を満たすノイズを効率的に作成するために、2段階の手法として、MemGuardは実装されています。  
一段階目のPhase Iでは、ノイズの大きさに関する条件（条件2）を考慮せずにノイズを作成し、Phase IIで条件を満たすようにノイズを加えるかの判断を行います。

### Phase I
元の最適化問題との違いは下記の点になります。  

- softmax後の出力ではなく、その前のlogitにノイズを加える。  
そうすることで、出力が確率の条件を満たすか（条件3）を考慮しなくて済みます。  
- ノイズの大きさを最小化する問題に置き換える。  
その代わりに、防御の強さに関する条件として、ノイズ付加後のメンバーシップ推定攻撃のinとoutの予測確率を等しくなるようにする。  

整理すると、下記3つの損失の重みづけ和を最小化します。  
L1：メンバーシップ推定攻撃の攻撃モデルのlogitのL1ノルム（防御の強さの条件）  
L2：元の予測クラスのlogitをその他のクラスのlogitが超える場合は、それらの差（条件1）  
L3：ノイズの大きさ  

全体の損失を、L=L1+c2×L2+c3×L3 として、最小となるノイズを求めます。  
ここで、c2、c3は事前に設定したパラメータです。  
また、条件を満たすノイズが見つからない場合は、ノイズは 0 とします。

### Phase II
Phase Iで求めたノイズは、大きさの条件を考慮していないため、ノイズの大きさの期待値が閾値以下になるように調整します。  

まず、ノイズを加えた時に、メンバーシップ推定攻撃の成功率を下げられない場合は、ノイズを付加しません。  
それ以外の場合は、閾値をε、ノイズの大きさをdとすると、確率 min(ε/d,1) でノイズを付加します。  
この結果、付加するノイズの大きさの期待値をε以下にすることができます。  

### パラメータc3の探索
Phase Iのパラメータc3は、ノイズの大きさと防御の強さを調整するパラメータです。  
大きすぎると十分な防御にならず、小さすぎるとノイズが大きくなりすぎます。  
効果的に防御するためには、適切にc3を決定する必要があります。

そこで、サンプルごとにc3を最適化します。  
まず、小さい値を用いてノイズを作成し、2つの条件を満たすか確認します。  
- ノイズによって予測ラベルが変更されない
- 十分強い防御になっている（ノイズの有無でメンバーシップ推定攻撃の予測が変わる）  

条件を満たす場合は、c3を10倍して、再度ノイズの最適化を行います。  
これを繰り返すことで、条件を満たすノイズのうち、c3が最大（つまり、ノイズが最も小さい）ものを採用します。  


### 参考資料
- R. Shokri et al., Membership Inference Attacks Against Machine Learning Models, IEEE S&P, 2017
画像が真っ黒かどうか判定する【道具としての OpenCV 画像認識】

# 本記事でできること
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37698/b35c5715-6cd8-f0e1-e1b5-36573e705f42.png)


# 想定シーン
## ロボットをビジュアルフィードバック制御する
カメラを使ったロボットアームの制御方法を、ビジュアルフィードバック制御といいます。ここでは、ビジュアルフィードバック制御を使った自動化システムを開発する際に必要となる画像認識プログラムをまとめています。

## 画像が真っ黒かどうか判定する
OpenCVの関数のいくつかには、画像が真っ黒な場合にはプログラムが意図通り動作しないものがあります。たとえば、画像内の物体をラベリングする関数や、物体の数を数える関数などです。本記事では、画像が真っ黒（白い領域がひとつもない）かどうかを判定するプログラムを掲載します。ロボットのビジュアルフィードバック制御アプリケーションを作成する際のヘルパー関数として使用すると便利だと思います。

# 実行環境
- OS：Ubuntu 22.04 LTS
- 言語：C++
- クルーボ：v5.1.0

## クルーボについて
ロボットアプリケーション開発には、株式会社チトセロボティクスのロボット制御ソフトウェア「クルーボ」を使用します。本記事のプログラムは、クルーボがインストールされた制御コンピュータ上で動作します。

- クルーボの製品サイト：https://chitose-robotics.com/

## プログラム抜粋
```c++
bool is_black_image(const cv::Mat& image) {
    cv::Mat image_gray = convert_grayscale(image);
    int count_non_zero_pizels = cv::countNonZero(image_gray);
    if (count_non_zero_pizels == 0) {
        return true;
    } else {
        return false;
    }
}
```

## 全体プログラム
```c++
#include <iostream>
#include <opencv2/opencv.hpp>

cv::Mat convert_grayscale(const cv::Mat& image) {
    const int grayscale_channel_num = 1;
    if (image.channels() == grayscale_channel_num) {
        return image.clone();
    }
    cv::Mat gray_image;
    cvtColor(image, gray_image, cv::COLOR_BGR2GRAY);
    return gray_image;
}

bool is_black_image(const cv::Mat& image) {
    cv::Mat image_gray = convert_grayscale(image);
    int count_non_zero_pizels = cv::countNonZero(image_gray);
    if (count_non_zero_pizels == 0) {
        return true;
    } else {
        return false;
    }
}

cv::Mat invert_image(const cv::Mat& image) {
    cv::Mat gray_image = convert_grayscale(image);
    cv::Mat inverted_image;
    cv::bitwise_not(gray_image, inverted_image);
    return inverted_image;
}

int main(void) {
    const cv::Size image_size(1280, 960);
    const cv::Mat black_image = cv::Mat::zeros(image_size.height, image_size.width, CV_8UC3);
    const cv::Mat white_image = invert_image(black_image);

    std::cout << "black_image is black image？ : " << std::boolalpha << is_black_image(black_image) << std::endl;
    std::cout << "white_image is black image？ : " << std::boolalpha << is_black_image(white_image) << std::endl;

    return 0;
}
```

### 実行結果
```terminal
black_image is black image？ : true
white_image is black image？ : false
```

## おわりに
人手作業をロボットアームで自動化するために、カメラを使ったロボット制御＝ビジュアルフィードバック制御が大切です。
ロボット制御用の画像認識でも中身のひとつひとつはシンプルなので、要素に分解して解説していきたいと思います。
指定した点が画像の中にあるか判定する【道具としての OpenCV 画像認識】

# 本記事でできること
![Screenshot from 2024-03-09 14-42-25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37698/7da1a4e5-7485-fe0a-79fe-dd74fd8ed516.png)



# 想定シーン
## ロボットをビジュアルフィードバック制御する
カメラを使ったロボットアームの制御方法を、ビジュアルフィードバック制御といいます。ここでは、ビジュアルフィードバック制御を使った自動化システムを開発する際に必要となる画像認識プログラムをまとめています。

## 指定した点が画像の中にあるか判定する
画像認識作業を進めていると、ある点（たとえば、前フレームで対象ワークを認識できた位置だったり、ユーザーが指定した位置だったり、画像内座標で表される点）が、画像の中にあるかどうかをチェックしたいという場合があります。また、OpenCVには特定の点が画像外にあった場合にはクラッシュしてしまうような関数もありますので、事前チェックしたいというケースもあります。本記事では、指定した点が画像の中にあるか判定するプログラムを掲載します。ヘルパー関数として使うとビジュアルフィードバック制御の際にもプログラムの安定性向上に役立つと思います。

# 実行環境
- OS：Ubuntu 22.04 LTS
- 言語：C++
- クルーボ：v5.1.0

## クルーボについて
ロボットアプリケーション開発には、株式会社チトセロボティクスのロボット制御ソフトウェア「クルーボ」を使用します。本記事のプログラムは、クルーボがインストールされた制御コンピュータ上で動作します。

- クルーボの製品サイト：https://chitose-robotics.com/

## プログラム抜粋
```c++
bool is_point_inside_image(const cv::Mat& image, const cv::Point point) {
    bool is_point_x_inside_image = (0 < point.x && point.x < image.cols);
    bool is_point_y_inside_image = (0 < point.y && point.y < image.rows);
    if (is_point_x_inside_image && is_point_y_inside_image) {
        return true;
    }
    return false;
}
```

## 全体プログラム
```c++
#include <iostream>
#include <opencv2/opencv.hpp>

bool is_point_inside_image(const cv::Mat& image, const cv::Point point) {
    bool is_point_x_inside_image = (0 < point.x && point.x < image.cols);
    bool is_point_y_inside_image = (0 < point.y && point.y < image.rows);
    if (is_point_x_inside_image && is_point_y_inside_image) {
        return true;
    }
    return false;
}

int main(void) {
    const cv::Size image_size(1280, 960);
    const cv::Mat black_image = cv::Mat::zeros(image_size.height, image_size.width, CV_8UC3);

    const cv::Point inside_point(640, 480);
    const cv::Point boundary_point(1279, 959);
    const cv::Point outer_point(1300, 700);

    std::cout << "Is "
              << "inside_point"
              << " inside image? : " << std::boolalpha << is_point_inside_image(black_image, inside_point) << std::endl;
    std::cout << "Is "
              << "boundary_point"
              << " inside image? : " << std::boolalpha << is_point_inside_image(black_image, boundary_point)
              << std::endl;
    std::cout << "Is "
              << "outer_point"
              << " inside image? : " << std::boolalpha << is_point_inside_image(black_image, outer_point) << std::endl;

    return 0;
}
```

### 実行結果
```terminal
Is inside_point inside image? : true
Is boundary_point inside image? : true
Is outer_point inside image? : false
```

## おわりに
人手作業をロボットアームで自動化するために、カメラを使ったロボット制御＝ビジュアルフィードバック制御が大切です。
ロボット制御用の画像認識でも中身のひとつひとつはシンプルなので、要素に分解して解説していきたいと思います。
[SwiftUI] TabView によるページャでインジケータの色を変える

[SwiftUI Introspect](https://github.com/siteline/swiftui-introspect) を使うのが簡単かと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29653/5caf326a-8ff9-68eb-a9a2-68136952da07.png)

```swift
import SwiftUI
import SwiftUIIntrospect

struct ContentView: View {
    var body: some View {
        TabView {
            Color.blue.opacity(0.2)
            Color.yellow.opacity(0.2)
            Color.green.opacity(0.2)
        }
        // ページャスタイルで利用
        .tabViewStyle(.page(indexDisplayMode: .always))
        // UIPageControl にアクセス
        .introspect(.pageControl, on: .iOS(.v14, .v15, .v16, .v17)) { pageControl in
            pageControl.currentPageIndicatorTintColor = .red // 現在ページの色
            pageControl.pageIndicatorTintColor = .gray       // それ以外の色
        }
    }
}
```

SwiftUI 標準の API として整備される日も来るんでしょうか？（すでにあったらコメント欄にお願いします🙏


## 関連
* [siteline/swiftui-introspect](https://github.com/siteline/swiftui-introspect)
* [PageControlType](https://swiftpackageindex.com/siteline/swiftui-introspect/main/documentation/swiftuiintrospect/pagecontroltype)
BusyBoxを使ってみる

万能コマンドと名高いBusyBox。
導入方法と最低限の使い方を確認しておく。

https://busybox.net/FAQ.html#getting_started

公式サイトのFAQを参考に、まずはダウンロード。
```
$ wget https://busybox.net/downloads/binaries/1.35.0-x86_64-linux-musl/busybox
--2024-03-06 22:36:36--  https://busybox.net/downloads/binaries/1.35.0-x86_64-linux-musl/busybox
Resolving busybox.net (busybox.net)... 140.211.167.122
Connecting to busybox.net (busybox.net)|140.211.167.122|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 1131168 (1.1M)
Saving to: ‘busybox’

busybox                                     100%[===========================================================================================>]   1.08M   552KB/s    in 2.0s    

2024-03-06 22:36:49 (552 KB/s) - ‘busybox’ saved [1131168/1131168]

$ 
```

実行権限を付与。
```
$ chmod 755 busybox
```

lsコマンド。
```
$ ./busybox ls /var
account   cache     empty     games     lib       lock      mail      opt       run       tmp
adm       db        ftp       kerberos  local     log       nis       preserve  spool     yp
$ 
```

catとhead。
もちろんパイプでコマンドを繋ぐことも可能
```
$ ./busybox cat /etc/logrotate.conf | ./busybox head
# see "man logrotate" for details

# global options do not affect preceding include directives

# rotate log files weekly
weekly

# keep 4 weeks worth of backlogs
rotate 4

$ 
```

概ね`<PATH>/busybox <COMMAND>`の要領で使えば良いと理解した。
挫折しつつも何とかE資格を取得したという話【受験記録】

# はじめに
[JDLA Deep Learning for ENGINEER][link-1] 2024#1に合格することができたので振り返りたいと思います。正直、途中で結構挫折してしまったりしたので、いろんな後悔があります。。。

# そもそもE資格とは何なのか？
E資格は、日本ディープラーニング協会(JDLA)が主催している**AIの資格**です。
AIの資格だと「G検定」「E資格」の2つが有名なんですが、この２つのうちの難しいほうがE資格です。ちなみに、**トヨタ・Gooleなどの名だたる企業が監修・協賛してるらしいです！**

試験範囲はどんな感じかというと、応用数学・機械学習・深層学習・開発環境の４分野から出題されます。とにかくディープラーニングの理論的なところを問うてくる感じなので、暗記は少なかった印象。

**この資格の勉強をすれば、AIの知識が体系的に身に着けられるので、個人的にはかなりおすすめの資格だと思ってます！！**


# 認定プログラムについて
このE資格なんですが、**1つだけ「ここはイケてないな・・・」と思う部分がありまして、それが受験資格になります。**

JDLAが指定した認定プログラムを受講しないと、受験ができません。で、、、認定プログラムはいろいろ種類があるんですが、どれも結構高いです・・・・。
20万とか50万とかするのもあります。

**ただ、よく探してみると格安の認定プログラムもあるんですよ！！**

**それが[ラビットチャレンジ][link-2] です。** 

入会金を2万円くらい払えば、あとは月額3300円くらいで受講できます。

しかし、これが**地獄の始まり**でした。。。。

# 地獄のラビットチャレンジ
結論から言います。ラビットチャレンジは認定プログラムの中では**激ムズ**です。**これ作った奴は鬼**です。大学とかで、**なかなか単位くれない鬼みたいな教授**っていますよね？そういう人が運営してるんだと思います。なかなか受験資格くれないです。。。
（一応言っておくと、**自分はラビットチャレンジを批判してるわけではありません。** これに頑張って取り組めばE資格に受かる実力はつくと思います。）

ラビットチャレンジは以下のような流れで進んでいきます。
以下の図からもわかる通り、各ステージでテストがあるんですが、これが鬼みたいに難しいんですよ。まずスタートテストから難しいです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3700895/4cd485c5-fd6d-db3e-ca01-046b8783ec59.png)
https://ai999.careers/rabbit/

ちなみに自分は、なんとかStage3までたどり着いたんですが、**どうしてもStage3の認定テストがクリアできず挫折してしまい、そのままAIの勉強を1年くらいストップしました・・・** 


# 結局、ラビットチャレンジをあきらめる・・・
1年くらいAIから逃げた後、「やっぱりE資格ほしいなぁ・・・」と思い、ふたたびE資格の勉強を開始しました（2023年10月）。ラビットチャレンジだと受験資格を得られる気がしなかったので、今度は**別の認定プログラム（[AI研のE資格講座][link-3]）で受験資格を得ることにしました。** 費用は7、8万円くらいかかった気がします。

AI研のE資格講座だと、**動画を見るだけで簡単に受験資格を得ることができました。**

正直、拍子抜けしました笑

「格安プログラムのラビットチャレンジだとあんなにGETするのが難しかったE資格の受験資格が、こんなに簡単にもらえるとは・・・。世の中やっぱ金なのか・・・」と思いましたね。

# E資格の本試験に向けた勉強
自分はAI研のE資格講座を終えた時点では全く合格レベルに達してなかったので、「黒本」とか「ゼロつく」をやりましたね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3700895/9946a866-5ef9-3e79-4281-cfb56878242a.png)


# 受験した感想・受験結果
自分は2024/2/18に受験しました。「7割くらいはできたかな・・・」という感触でした。

JDLAから送られてきた合否結果連絡のメールに分野別の得点率が書いてあったのですが、以下のような感じでした。感触通りですね。

応用数学：57 ％
機械学習：67 ％
深層学習：57 ％
開発環境：86 ％


# これから受験する人に伝えたいこと
### ・認定プログラムは慎重に選んだほうがいいです！
これの選び方によって、「挫折率」が大幅に変わってきます。

### ・いきなりE資格を受けるのはやめておいたほうがいいかも！
上に書き忘れたのですが、自分はE資格を受験する前に以下の資格を取得してます。挫折しないために、「細かく目標を設定して、達成感を感じやすくする」のが大事だと思いました。

・G検定
・AI実装検定 A級
・Python 3 エンジニア認定基礎試験
・Python 3 エンジニア認定データ分析試験

### ・E資格に合格したら、Fujitsu Certified Master AIも貰っておこう
E資格を取得した後に富士通のサイトで認定申請をすると、[Fujitsu Certified Master AI][link-4] という富士通の資格も貰えるらしいです。E資格よりも名前がカッコいいので、もらえるものは貰っておこう。


<!--- --->
[link-1]:https://www.jdla.org/certificate/engineer/
[link-2]:https://ai999.careers/rabbit/
[link-3]:https://ai-kenkyujo.com/ai-e-shikaku/
[link-4]:https://www.fujitsu.com/jp/products/software/resources/swmaster/exam/qualification/fq0-n17/
[2024年版] Macにmemcachedをインストールする

MacOS X Montereyにmemcachedをイントールする際、記事を検索したら古い情報が多くでてきたので、2024年現在のインストール方法をメモしておきます。

``` console.sh
brew install memcached
brew services start memcached
```

サービスが起動しているか、確認するには下記コマンドでプロセスを確認してください。

``` console.sh
ps aux | grep memcached
```

grep以外に「/opt/homebrew/opt/memcached/bin/memcached」のプロセスがあれば、動作しています。
自作PC(デスクトップ)のWiFiアンテナはBluetoothと共用

# Bluetoothペアリング不可
自作PC(Windows10)を作った時に有線LANで使用していたので、マザーボードに付属されているWiFiアンテナは接続していませんでした。
（必要ないものをつないでも意味ないし、邪魔だと思っていたので）

その自作PCにBluetoothヘッドホンをペアリングしようとデバイスの追加を試したのですが何もデバイスが表示されませんでした。

※下記はWindows11で試した時の画像
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3297641/185598ba-ce37-9000-7a61-f60914d6f5c7.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3297641/fc226111-7c08-9eb7-728c-c08f06c3ae46.png)

最新のドライバを入れても変化がないので、故障かと思い仕方なくマザーボードのBluetoothは無効化しUSBのBluetoothドングルを使用していました。

![DSC_0095.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3297641/29657dad-9005-d802-9158-0791e1523504.jpeg)


# 自作PC新調
最近、自作PC(Windows11)を新たに作ったので、Bluetoothヘッドホンをペアリングしようとデバイスの追加を試しました。しかし、また何もデバイスが表示されません。
（今回も有線LANを使用のため、マザーボードに付属されているWiFiアンテナは接続せず）

2回続くとさすがに故障ではなく、何かがおかしいと思いました。

# WiFiアンテナ
![DSC_0094.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3297641/23bd0cec-5c92-699a-7576-a0fcfe536da8.jpeg)

そこでGoogle検索して見ると下記の書き込みに行きつきました。
**「一般的にマザーボードのWiFiアンテナはBluetoothのアンテナと共用です。」**


参考

https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q11289494556

**WiFiアンテナはBluetoothのアンテナと共用**
知らなかったです。。。
マザーボードにWiFiアンテナを接続したところ、無事ペアリングできるようになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3297641/d214fe7d-539e-5dec-e593-4b10b1d141f5.png)
mini Security-JAWS 参加してみての感想

初めまして、目黒です。

4月からAWSの仕事に携わるために、AWSの資格を取得するため日々勉強をしています。
現在は3月末の SOAの試験に向けて勉強中です。

本日 (2024/03/09) に、mini Security-JAWS のウェブセミナーに参加したので、感想を書きます。

## mini Security-JAWS に参加しようとした経緯
参加しようとした理由は２点ありました。

#### １点目 セキュリティの憧れ
アニメやらドラマやらでホワイトハッカーという言葉に憧れが昔からあります。
現状、一旦は開発やインフラ周りの業務をしてから、いつかわセキュリティの仕事もやってみたいなと思っていました。

#### ２点目 JAWS-UG の色々な支部に興味を持っているから
池袋で行われた「JAWS-UG 2024」に参加をして、
ものすごく JAWS-UG の色々な支部に興味を持ちました。

色々な特性を持った支部がたくさんあるので、
都合の良いときは積極的に参加しようと心がけています。

LTをしたりして、ゆくゆくは運営に入りたいなと思っています。

## mini Security-JAWS 参加してみての感想
ものすごく勉強になります。の一言に尽きます。

現在は資格取得に向けて AWSの勉強をしていて、
勉強してある程度知識として身についたサービスを中心にお話していただき、
とても初心者の僕からしてわかりやすかったです。

すごく「基本の "き"」が、ものすごくたくさん出てきて途中で頭がフリーズしてはいました。

本日使用していた資料を再読して、知識を自分のものにしていきます。

https://dev.classmethod.jp/articles/aws-security-all-in-one-2021/

今後も、mini Security-JAWSには参加させていただきます。
よろしくお願いします。

# 自己紹介
初めまして、目黒です。(@megggguguuuuuuu)

高専を卒業後、新卒で今の会社に入社をしました。
今年の4月で、3年目突入になります。

現在は、SESにてとあるサービスの運用・保守をしています。
4月以降はAWS関連のメインの業務に参画する予定なため、AWSの勉強を行っております。

AWS資格を現在 CLF,SAA を取得しており、現在 SOA の資格取得に向けて勉強中。
DVA は6月までに取得するつもります。

AWS資格 12冠することが目標です。
同じくAWS 資格を目指す方は、お互いに刺激しあいながら資格取得に向けて頑張りましょう！

# 宣伝
毎週の土日に、僕が入社している会社のオフィス(池袋)にて「もくもく会」をしています。
ぜひご興味がある方がいましたらご参加ください！！！

https://mokumoku-teikoku.connpass.com/
BitbucketからLinuxサーバにgitをclone

手順は以下
1. bitbucket用のssh鍵作成
2. bitbucketにssh公開鍵を登録
3. linuxの.ssh/configにssh接続用情報を登録
4. gitをinit
5. gitをclone  

#### 1. bitbucket用のssh鍵作成
```
[prompt] # cd ~/.ssh
[prompt] # mkdir bitbucket
[prompt] # cd ~/.ssh/bitbucket
[prompt] # ssh-keygen -t rsa -C メールアドレス
[prompt] # cmhod 600 id_rsa
```
#### 2. bitbucketにssh公開鍵を登録

出来上がった公開鍵「~/.ssh/bitbucket/id_rsa.pub」をbitbucketに登録する

#### 3. linuxの.ssh/configにssh接続用情報を登録
```
[prompt] vim ~/.ssh/config
--
Host bitbucket.org
    User git
    Port 22
    HostName bitbucket.org
    identityFile ~/.ssh/bitbucket/id_rsa
    TCPKeepAlive yes
    IdentitiesOnly yes
```

#### 4. gitをinit
```
[prompt] # cd
[prompt] # mkdir git
[prompt] # cd git
[prompt] # git init
```

#### 5. gitをclone 
```
[prompt] # git clone git@bitbucket.org:******/*****.git
```