OmniAICreator/Qiita-1.07M huggingface dataset:
Workbot for Teamsコネクタにおけるメッセージ送信時における注意事項

# はじめに
Workatoでは、Workbotを利用してTeamsにメッセージを投稿することができます。初めてWorkbotを利用する際につまずきやすいポイントを紹介します。

### つまずきポイント
- Workbotの招待

# Workbotの招待
権限の設定は正しくできているのに、「403 Forbidden」というエラーに悩まされていませんか？
権限の設定以外でWorkbotからメッセージを投稿する際に、つまずくポイントがあります。原因の一つがWorkbotのチームへの招待できていないことです。チームへ招待していないとメッセージを投稿することができません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3455960/1c24de6d-e4bf-caeb-350b-0f25eb19c27d.png)

### チームへWorkbotの招待方法
作成したチームのメッセージ投稿画面でメンション(＠)を付けると、候補に「ボットを取得」という選択肢が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3455960/2403b30e-36a6-45d2-7460-925004af469d.png)

「ボットを取得」を選択し、Workbotを追加することで、下記のようなメッセージがWorkbotから投稿されるとWorkbotの追加が完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3455960/b2ea1ded-5b05-2c6e-b87d-27af0a14a12a.png)

再度、Workatoからメッセージを投稿すると、正常に動作することを確認できます。

# まとめ
まとめると以下のようになります。

* Workbot for TeamsでBotを用いる際にメッセージが投稿できない場合は、ボットをチャネルに招待しているか確認し、招待されていない場合は招待してください

# おわりに
いかがでしたでしょうか？Workbot for Teamsコネクタを利用した際につまずきやすいポイントを紹介しました。

Workatoの導入・導入後の活用などでお困りの場合、Workatoリセラーにご相談する方法もございます。お困りごとがございましたら、認定リセラーの[当社](https://www.hitachi-solutions.co.jp/rpa/sp/products/workato)へ是非ご相談ください。


# 参考リンク

* 株式会社 日立ソリューションズ
    * [Workato ご紹介サイト](https://www.hitachi-solutions.co.jp/rpa/sp/products/workato)
* Workato 公式サイト
    * [Workato の Workbot for Microsoft Teams 入門](https://docs.workato.com/ja/workbot-for-teams/getting-started.html#getting-started-with-workbot-for-ms-teams-by-workato)
WorkatoのBoxコネクションの有効期限切れの対策について

# はじめに

WorkatoでBoxとの接続はOAuth 2.0認証を利用しています。OAuth 2.0認証では、BoxがWorkatoに対してアクセストークンを発行します。Workatoは、そのアクセストークンを用いてBoxと接続します。
一度払い出されたBoxの[アクセストークンの有効期限は60日](https://ja.developer.box.com/guides/api-calls/permissions-and-errors/expiration/)のため、該当のコネクションを通じて60日間何もBoxアクションを利用しないと下記のようにコネクションがロストします。

![boxのトークン期限切れ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3455960/83604391-4faf-47a9-6355-08306308b19b.png)

Workatoのレシピを利用している業務によっては、60日以上利用されないことがあるかもしれません。
本記事では、そのようなケースで有効なBoxコネクションの有効期限切れの対策を紹介します。


# Boxコネクションの有効期限切れの対策
対策は単純でアクセストークンの有効期限が切れる前にAPIをコールすることです。
BoxはOAuth 2.0認証を利用しており、1度でもAPIをコールすれば、アクセストークンが更新されるため、Boxコネクションの有効期限が延長されます。

わざわざレシピを作成して手動でアクセストークンを更新するのは手間であるため、スケジュールトリガーを用いて定期的にAPIを呼び出して、アクセストークン切れを回避するレシピを紹介します。

# Boxコネクション有効期限切れ回避のレシピ
Boxには[接続しているユーザー情報を取得するAPI](https://ja.developer.box.com/reference/get-users-me/)が存在します。そのAPIを定期的に呼び出すようにすることで、Boxのデータに影響しないようにAPIを操作することができます。

レシピの構成としては、トリガーにスケジュールトリガーで毎月1日にレシピを実行するようにします。アクションは、Boxコネクションのカスタムアクションを用いて接続しているユーザー情報を取得するAPIを呼び出します。
![スクリーンショット 2024-06-21 113958.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3455960/b8f6530c-8af9-e6f8-c7d9-dfac6080f469.png)

サンプルレシピは[参考リンク](#参考リンク)に記載しています。

# まとめ
まとめると、以下のようになります。

* BoxのコネクションはOAuth 2.0認証を利用かつ、一定期間利用しないと接続がロストしてしまうため、アクセストークンの有効期限が切れる前にAPIをコールする必要があります。 

# おわりに
いかがでしょうか？ Boxのコネクションを定期的にコールするレシピを作成することでアクセストークンの有効期限を気にすることなくBoxコネクションを利用することができるようになります。

また、今回はBoxを対象としましたが、Boxに限らずOAuth 2.0認証を利用してコネクションを接続しているものには、この対策が有効的です。

Workatoの導入・導入後の活用などでお困りの場合、Workatoリセラーにご相談する方法もございます。お困りごとがございましたら、認定リセラーの[日立ソリューションズ](https://www.hitachi-solutions.co.jp/rpa/sp/products/workato/?utm_source=sns&utm_medium=qiita&utm_campaign=["記事ID"])へ是非ご相談ください。

# 参考リンク

* 株式会社 日立ソリューションズ
    * [Workato ご紹介サイト](https://www.hitachi-solutions.co.jp/rpa/sp/products/workato/?utm_source=sns&utm_medium=qiita&utm_campaign=["記事ID"])
* Workato 公式サイト
    * [Boxコネクション](https://docs.workato.com/ja/connectors/box.html#box)
* 本記事のサンプルレシピ
    * Boxコネクション有効期限切れ回避
        * JPデータセンター利用者向け 
            * [[Example]Connection Check](https://app.jp.workato.com/recipes/414101?st=843f63d2a8b824c5c14099c4c7ad9f75e13b2aeb9043ad2647dfb2d40ab7c384)
        * USデータセンター利用者向け
            * [[Example]Connection Check](https://app.workato.com/recipes/48883674?st=59a0579cdb0d6463232e6775e60cf1833552ff73093dc7767b512a7fa48eeafb)
初学者のためのRailsの豆知識

# Railsのあまり知られていない豆知識

Railsは初心者にも使いやすいフレームワークですが、少し掘り下げると便利な機能がたくさんあります。今回は、Railsのあまり知られていない豆知識をいくつか紹介します。これらの機能を使うことで、より効率的に開発が進むでしょう。

## 1. `find_by`メソッド

`find_by`メソッドを使うと、特定の条件に一致する最初のレコードを簡単に取得できます。

```ruby
# IDが1のユーザーを取得
user = User.find_by(id: 1)

# emailが特定の値のユーザーを取得
user = User.find_by(email: "example@example.com")
```

`find_by`メソッドは見つからない場合に`nil`を返すので、例外が発生することなく安全に使えます。

## 2. `update`メソッド

`update`メソッドを使うと、一度に複数の属性を更新できます。

```ruby
user = User.find_by(id: 1)
if user.update(name: "New Name", email: "newemail@example.com")
  puts "ユーザー情報が更新されました"
else
  puts "更新に失敗しました"
end
```

これにより、一度に複数のフィールドを簡単に更新でき、更新が成功したかどうかも確認できます。

## 3. `destroy_all`メソッド

`destroy_all`メソッドを使うと、特定の条件に一致する全てのレコードを一度に削除できます。

```ruby
# 全ての非アクティブユーザーを削除
User.where(active: false).destroy_all
```

`destroy_all`メソッドを使うことで、不要なデータを一括で削除できます。

## 4. `scope`メソッド

`scope`メソッドを使うと、モデルに簡単なクエリを定義できます。

```ruby
class User < ApplicationRecord
  scope :active, -> { where(active: true) }
end

# アクティブなユーザーを取得
active_users = User.active
```

`scope`を使うことで、繰り返し使うクエリを簡単に再利用できます。

## 5. `time_ago_in_words`メソッド

`time_ago_in_words`メソッドを使うと、ある日時から現在までの経過時間をわかりやすい言葉で表示できます。

```erb
<%= time_ago_in_words(@user.created_at) %> ago
```

このメソッドを使うことで、「3日前」や「2時間前」などの表現を簡単に表示できます。

## 6. `ActiveHash`の活用

`ActiveHash`を使うと、データベースを使用せずにモデルのような振る舞いをするクラスを定義できます。これは、マスターデータや変更頻度の低いデータを扱う場合に便利です。

### インストール

まず、`ActiveHash`をGemfileに追加し、インストールします。

```ruby
gem 'active_hash'
```

### 使用例

例えば、都道府県データを`ActiveHash`で管理する場合を考えます。

```ruby
# app/models/prefecture.rb
class Prefecture < ActiveHash::Base
  self.data = [
    { id: 1, name: '北海道' }, { id: 2, name: '青森県' }, 
    # 他の都道府県も同様に追加
  ]
end
```

### モデルでの利用

これを他のモデルで利用する方法です。

```ruby
# app/models/user.rb
class User < ApplicationRecord
  extend ActiveHash::Associations::ActiveRecordExtensions
  belongs_to_active_hash :prefecture
end
```

### フォームでの利用

フォームで都道府県を選択する場合の例です。

```erb
<%= form_with(model: @user) do |f| %>
  <%= f.label :prefecture_id, "都道府県" %>
  <%= f.collection_select :prefecture_id, Prefecture.all, :id, :name %>
  <%= f.submit "登録" %>
<% end %>
```

---

以上が、初学者向けのRails豆知識の紹介です。これらの機能を使って、より便利で効率的なRails開発を一緒に楽しみましょう！

---
Nymによるプライバシー保護の新しいアプローチ：基礎知識と技術概要

## はじめに

デジタルプライバシーの重要性が高まる中、Nymプロジェクトが提供するプライバシー保護技術が注目されています。この記事では、Nymの技術的な概要とその効果について詳しく説明し、どのようにプライバシーを守るために利用できるかを解説します。

## Nymプロジェクトとは

Nymは、デジタルプライバシーを保護するために設計された分散型ネットワークです。主な機能として、データの匿名化、トラッキング防止、プライバシーの保護が含まれています。Nymの技術は以下の要素から成り立っています：

- **ミキシングネットワーク**
- **ゼロ知識証明**
- **分散型アーキテクチャ**

## Nymの主要技術

### 1. ミキシングネットワーク

Nymのミキシングネットワークは、ユーザーの通信を匿名化し、データの追跡を防ぐ技術です。

- **仕組み**: データパケットが複数のミキシングノードを通過することで、元の送信者と受信者を特定できないようにします。
- **利点**: 通信の匿名性を確保し、ユーザーのプライバシーを守ります。

### 2. ゼロ知識証明

ゼロ知識証明は、データの内容を公開せずに、その正当性を証明する技術です。

- **仕組み**: 証明者が証明の実行を行い、受信者が証明の有効性を検証します。
- **利点**: データのプライバシーを維持しつつ、必要な検証を行うことが可能です。

### 3. 分散型アーキテクチャ

Nymは分散型のネットワークアーキテクチャを採用しています。

- **仕組み**: ネットワーク内の複数のノードが協力してデータを処理し、単一障害点を排除します。
- **利点**: 高い耐障害性とセキュリティを実現します。

## Nymの利用シーン

Nymの技術を活用することで、以下のようなシナリオでプライバシー保護が可能です：

- **匿名通信**: 個人情報を守りながら安全にコミュニケーションを行うことができます。
- **プライバシー保護**: データ取り扱いに関するプライバシーを強化することができます。

## まとめ

Nymプロジェクトは、プライバシー保護における革新的なアプローチを提供しています。ミキシングネットワーク、ゼロ知識証明、分散型アーキテクチャを活用することで、ユーザーのプライバシーを保護する強力なツールとなります。Nymの技術を理解し、実際に活用することで、デジタルプライバシーの強化に貢献できます。

# sponsor

HStorageは、高度なセキュリティ機能を提供しているオンラインストレージサービスです。

![Screenshot 2024-08-07 at 2.26.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3672851/82985efd-ae04-b64f-49eb-502d257897c3.png)
https://hstorage.io/

# 参考リンク

- [Nym公式サイト](https://nymtech.net/)
- [Nymのミキシングネットワーク - Wikipedia](https://ja.wikipedia.org/wiki/Nymミックスネット)
- [Nymホワイトペーパー](https://nymtech.net/nym-whitepaper.pdf)
- [分散型VPN と中央集権型VPN:違いの全て](https://note.com/koko_crypto/n/n71fe7e92b68a)
- [ミックスネットとは何か？ VPNによる比類なきオンラインプライバシー](https://note.com/koko_crypto/n/n302e7516f691?magazine_key=m0129d65e3526)
- [Sphinx暗号-Nymを支える匿名データフォーマット](https://qiita.com/pseudonym2/items/107cf005e9cab0b165b6)
- [ココナッツ認証（Coconut Credentials）とは？- プライバシーを保護するゼロ知識証明技術](https://qiita.com/pseudonym2/items/b2739ae32f4fb29de0b6)

# コミュニティ

- [Nym日本コミュニティ - Telegram](https://t.me/nymjapanese)
- [Nym日本コミュニティ - Discord](https://discord.com/invite/nym)
- [Nym日本コミュニティ - LINEオープンチャット](https://line.me/ti/g2/0YGYYq4EoQZ8fL5FYQmqU4O9SRuE_a6YX19GtA?utm_source=invitation&utm_medium=link_copy&utm_campaign=default)
- [Nym 公式LINE(現在非稼働)](https://line.me/R/ti/p/@986ytsdx?from=page&accountId=986ytsdx)
- [Nymプロジェクト日本語アカウント - X](https://x.com/nymproject_jp)
G検定の勉強方法まとめ

## はじめに
本日(2023/07/22)G検定に合格したメールが届きました！
学習に使用したものや、勉強方法をまとめてみました。
拙い文章ですが、参考になれば幸いです。
## G検定の受験理由
私は卒研で、画像認識を行っています。AIに関する知識を得たいということでG検定を知りました。（また、学生ということで学割が効くため今受験しようと決意）

## 学習に使用したもの
・ディープラーニングG検定問題集第２版
こちらのみ使用して合格できました。本当におすすめします。
参考書を調べてこの本を使用したという記事を拝見して購入しました。
模擬試験が特典にあります。

## 勉強方法
１、問題を解く
大学の授業で試験範囲内容はほんの少しだけ知っていたため、とりあえずどれくらい把握しているか問題を１周しました。
（採点した結果ボロボロでした）

２、解説を読む＋シート作り
解説が非常に分かりやすかったです。本当に問題集おすすめです。
それでも分からないところは調べます。
受験中調べることができますが、シート作りをしたという記事を多く拝見したので、私もシート作りをしました。
解説＋αで詳しく用語を調べたメモが受験中大活躍しました。

３、受験２日前　特典の模擬試験を受ける
特典の模擬試験を受けました。ここでどこが理解できてないか把握できました。

４、受験前日～受験直前
模擬試験を通して理解できていない所を見直して、調べまくりシートに追加していきました。

## 感想
試験はあっという間でした。難しかったです・・・時間が足りないと感じました。
メモとgoogle検索のため、パソコン２台机に並べて受験しました。（おすすめ）

合格は嬉しかったですが、画像認識の精度評価などG検定の勉強で得た知識が卒研に活きて、受験して良かったです。

１.人工知能とは　と　7.法律・倫理・社会問題の得点率が低かったので、もう一度問題集の解説を見たいと思います。

ITパスポート（取得済み）、G検定、データサイエンティスト検定の３つに合格するとバッチがもらえるみたいです。
G検定を通して知ったデータサイエンティスト検定リテラシーレベルを受験したいと思いました。
Codelabsで作成したAndroidアプリのビルドが失敗する

# Codelabsを見ながらコードを書いたのにビルドエラーになる

初めてAndroidアプリを作成しようとしたときにまずGoogle Developer Codelabsを利用する方も多いでしょう。

[Android Basics with Compose （英語版）](https://developer.android.com/courses/android-basics-compose/course)
[Compose を用いた Android アプリ開発の基礎（日本語版）](https://developer.android.com/courses/android-basics-compose/course?hl=ja)

上記リンクから各コースを開始してコーディングを進めたときにビルドが成功せず、先に進めなくなることがあります。

# 解決策

様々なエラーが発生しますが、Android Studioを最新化することで解決することが多いです。
各Codelabの最初のページに「必要なもの：Android Studio の最新バージョン」と書いてあったりなかったりします（微妙にそれぞれ記載が違うので漏れているだけな気がします）。
前回の学習から日数が空いてしまった場合は、Android Studioを再インストールしましょう。
【React】Reactのディレクトリ構造


# Reactのディレクトリ構造
```
my-react-app/
├── public/
│   ├── index.html
│   └── favicon.ico
├── src/
│   ├── assets/
│   │   ├── images/
│   │   └── styles/
│   ├── components/
│   │   ├── Header.js
│   │   ├── Footer.js
│   │   └── Button.js
│   ├── pages/
│   │   ├── HomePage.js
│   │   └── AboutPage.js
│   ├── services/
│   │   ├── apiService.js
│   │   └── authService.js
│   ├── utils/
│   │   └── helper.js
│   ├── App.js
│   ├── index.js
│   └── App.css
├── .gitignore
├── package.json
├── README.md
└── yarn.lock or package-lock.json
```

## public/ 
静的なファイル（HTML、アイコンなど）を格納します。

## src/
ソースコードを格納します。ここには主にReactコンポーネント、スタイル、画像などが含まれます。

## assets/
画像やスタイルシートなどの静的なアセットを保存します。

## components/
再利用可能なReactコンポーネントを格納します。

## pages/
ページコンポーネントを格納します。各ページのレイアウトやコンテンツがここに含まれます。

## services/
APIリクエストや認証などのサービスロジックを管理します。

## utils/ 
ヘルパー関数やユーティリティーを格納します。

## App.js
アプリケーションのルートコンポーネントです。

## index.js
アプリケーションのエントリーポイントで、ReactDOM.render() を使用して App コンポーネントを DOM にマウントします。
【python】メソッド（＆引数）とフィールド（＆値）一覧を取得するやつ

メソッドとフィールド値を表示するやつがあると便利だとたびたび思ってたからメモ

```
import inspect
for mem,v in inspect.getmembers(object):
    if inspect.isfunction(mem):
        v=inspect.signature(mem)
    print(mem,':',v)
```

2024/07/26追記
strする必要があったっぽい
```
import inspect
for mem,v in inspect.getmembers(object):
    if inspect.isfunction(mem):
        v=str(inspect.signature(mem))
    print(mem,':',v)
```
S3にMD5メタデータ付きjsonうｐ

```python
import boto3
import hashlib


def calculate_md5(file_path):
    """ファイルのMD5ハッシュを計算する"""
    hash_md5 = hashlib.md5()
    with open(file_path, "rb") as f:
        for chunk in iter(lambda: f.read(4096), b""):
            hash_md5.update(chunk)
    return hash_md5.hexdigest()


# AWSのクライアントを作成
s3 = boto3.client('s3')

# バケット名とファイルのパス
bucket_name = 'md5-test-bucket'
file_path = 'afterEscape.json'
file_key = 'md5Meta.json'

# MD5ハッシュ値を計算
md5_value = calculate_md5(file_path)

# ファイルをアップロードし、メタデータとしてMD5ハッシュ値を設定
s3.upload_file(
    Filename=file_path,
    Bucket=bucket_name,
    Key=file_key,
    ExtraArgs={
        "Metadata": {
            "md5": md5_value
        }
    }
)

print(f"File uploaded to S3 with MD5 hash {md5_value} as metadata.")

```
【TypeScript】特殊な型


# any
どんな型でも許容する型。TypeScriptの型チェックを無効にする。
```
let value: any = "string";
value = 42;
```

# unknown
anyに似ているが、安全性が高く、使用する前に型のチェックが必要。

```
let value: unknown = "string";
if (typeof value === "string") {
  console.log(value.toUpperCase());
}
```
# never
決して発生しない値の型。関数が常に例外を投げるか、終了しないときに使う。
```
function error(message: string): never {
  throw new Error(message);
}
```
# void
値を返さない関数の戻り値の型。
```
function logMessage(message: string): void {
  console.log(message);
}
```
Docker版　Sorry　Server　の構築

Dockerを利用した　Sorry　Serverを作成してみる


(1) ディレクトリ構成
```OS:List
.
├── compose.yml
├── nginx
│   ├── conf.d
│   │   └── default.conf
│   └── dockerfile
└── src
    ├── 40x.html
    ├── 50x.html
    ├── healthcheck.html
    └── index.html
```

(2)ソース

```yml:compose.yml

services:
  nginx:
    #image: nginx:1.21-alpine
    build: ./nginx
    container_name: nginx
    hostname: nginx
    ports:
      - 8000:80
    volumes:
      - ./nginx/log:/var/log/nginx
      - ./nginx/conf.d:/etc/nginx/conf.d
      - ./src:/usr/share/nginx/html
```

```config:default.conf
server {
    listen       80;
    server_name  localhost;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

    error_page   404  /40x.html;
    location = /40x.html {
        root   /usr/share/nginx/html;
    }
}
```

```dockerfile:dockerfile
FROM nginx:1.17.6
# TimeZoneをAsia/Tokyoに設定する
ENV TZ Asia/Tokyo
RUN echo "${TZ}" > /etc/timezone \
   && dpkg-reconfigure -f noninteractive tzdata
```

```html:40x.html 50x.html
<!DOCTYPE html>
<html>
  <head>
    <title>Error</title>
    <style>
      html {
        color-scheme: light dark;
      }
      body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
      }
    </style>
  </head>
  <body>
    <h1>An error occurred.</h1>
    <p>
      Sorry, the page you are looking for is currently unavailable.<br />
      Please try again later.
    </p>
    <p>
      If you are the system administrator of this resource then you should check
      the error log for details.
    </p>
  </body>
</html>
```

```html:healthcheck.html
OK
```

```html:index.html
<!DOCTYPE html>
<html>
  <head>
    <title>Sorry</title>
  </head>
  <body>
          <h1>this site closed, Sorry</h1>
  </body>
</html>
```
【TypeScript】プリミティブ型


プリミティブ型は、TypeScriptおよびJavaScriptにおける基本的なデータ型のこと。

# number: 数値（整数および浮動小数点数）
```
let num: number = 42;
```

# string: 文字列
```
let str: string = "Hello, world!";
```

# boolean: 真偽値（trueまたはfalse）
```
let isTrue: boolean = true;
```

# null: null値
```
let nullValue: null = null;
```

# undefined: 未定義の値
```
let undefinedValue: undefined = undefined;
```
【Python3】じゃんけんの手の出し方 (paizaランク A 相当)をやってみた

以下に、Pythonプログラムを解説します。

```python
# じゃんけんの手の出し方
n, m = map(int, input().split())  # じゃんけんの回数 n と出す指の本数の合計 m を入力
s = input()  # 相手のじゃんけんの手を表す文字列 s を入力

# じゃんけんの手のカウントを初期化
enemy_g, enemy_c, enemy_p = 0, 0, 0
for v in s:
    if v == "G":
        enemy_g += 1  # 相手がグーを出す回数をカウント
    elif v == "C":
        enemy_c += 1  # 相手がチョキを出す回数をカウント
    else:
        enemy_p += 1  # 相手がパーを出す回数をカウント

ans = 0  # 勝つ回数の最大値を格納する変数
# 0 ≦ p ≦ m//5 の範囲で p（パーの回数）を全探索
for p in range(m // 5 + 1):
    c = (m - p * 5) // 2  # 指の本数の合計から p 回のパーを引いた後、残りをチョキの回数 c として計算
    g = n - p - c  # 残りのじゃんけんの回数をグーの回数 g とする
    
    if g < 0:
        continue  # グーの回数が負の値になった場合は無視
    if p * 5 + c * 2 != m:
        continue  # 出した指の本数が m に満たない場合は無視
    
    # 勝てる回数を計算して最大値を更新
    ans = max(ans, min(p, enemy_g) + min(c, enemy_p) + min(g, enemy_c))

print(ans)  # 最大勝利回数を出力
```

### 解説

1. **入力値の取得**
    ```python
    n, m = map(int, input().split())
    s = input()
    ```
    - じゃんけんの回数 `n` と出す指の本数の合計 `m` を入力から取得します。
    - 相手のじゃんけんの手を表す文字列 `s` を入力から取得します。

2. **相手の手のカウント**
    ```python
    enemy_g, enemy_c, enemy_p = 0, 0, 0
    for v in s:
        if v == "G":
            enemy_g += 1
        elif v == "C":
            enemy_c += 1
        else:
            enemy_p += 1
    ```
    - 相手の手の出し方をカウントします。`enemy_g` はグーの回数、`enemy_c` はチョキの回数、`enemy_p` はパーの回数です。

3. **勝つ回数の最大値の計算**
    ```python
    ans = 0
    for p in range(m // 5 + 1):
        c = (m - p * 5) // 2
        g = n - p - c
        
        if g < 0:
            continue
        if p * 5 + c * 2 != m:
            continue
        
        ans = max(ans, min(p, enemy_g) + min(c, enemy_p) + min(g, enemy_c))
    ```
    - パーの回数 `p` を全探索し、各 `p` に対してチョキの回数 `c` とグーの回数 `g` を計算します。
    - グーの回数が負の値になる場合や、出した指の本数が `m` に満たない場合は無視します。
    - 勝てる回数を計算し、最大値を更新します。

4. **結果の出力**
    ```python
    print(ans)
    ```
    - 勝つ回数の最大値を出力します。

このプログラムは、相手の手に対して最適な手を選び、出す指の本数の合計が `m` になるようにじゃんけんを行うことで、最大勝利回数を求めます。
【TypeScript】publicとprotectedとprivate



public、protected、privateはアクセス修飾子と呼ばれ、指定した変数やクラスなどを、どの範囲から参照可能かのスコープを制御するのに用いられる。

## public
デフォルトの修飾子で、クラスの外部からもアクセス可能。
```
class MyClass {
  public myProperty: string;
}
```

## protected
クラス内およびそのサブクラスからアクセス可能。
```
class MyClass {
  protected myProperty: string;
}
```

## private
クラス内からのみアクセス可能。
```
class MyClass {
  private myProperty: string;
}
```
Astro環境をmacで構築する


# Node.jsのインストール
最新のLTSバージョンをインストール
```
brew install node
```

# Astroプロジェクトの作成
```
mkdir my-astro-project
cd my-astro-project
npm init astro@latest
```

# プロジェクトの依存関係をインストール
```
npm i
```

# 開発サーバーを起動
```
npm run dev
```
Astroを選ぶ理由


https://docs.astro.build/ja/concepts/why-astro/

Astroはコンテンツ駆動のウェブサイト向けに設計されたフレームワークで、高速かつシンプルな開発を実現できる。
JavaScriptのオーバーヘッドを減らし、サーバーファーストのレンダリングでパフォーマンスも向上。
React、Svelteなど様々なUIフレームワークをサポートし、コンテンツコレクションやカスタマイズも可能で、開発者に優しく、HTMLベースのテンプレート構文で学習コストを抑えている。
astroってなんだ

Astroは、静的サイトジェネレーターの一つで、特に高速なウェブサイトを構築するために設計されている。

https://astro.build/

## コンポーネントベース
Astroでは、React、Vue、Svelteなどのフレームワークのコンポーネントを混在させて使用できます。

## 部分的なハイドレーション
必要な部分だけをJavaScriptで動的にレンダリングすることで、ページの読み込み速度を向上させます。

## 静的生成
静的なHTMLファイルを生成するため、サーバーの負荷が軽減され、SEOにも有利です。
モジュール連携：Markdown、CSS、JavaScriptなどを簡単に統合できます。

## 開発体験
ホットリロードや直感的な開発フローなど、開発者体験の向上に力を入れています。
Astroは、コンテンツ重視のウェブサイトやブログ、ドキュメントサイトなど、パフォーマンスを重視するプロジェクトに適しています。
【Python3】山折り谷折り (paizaランク A 相当)をやってみた

https://paiza.jp/works/mondai/real_event/origami

```python
# 山折り谷折り A
# utf-8

'''
N 回折ったときの折り目は N-1 回折ったときの折り目から簡単に求めることができます。
1 回折ったときの折り目は "0"、2 回折ったときの折り目は "0" + "0" + "1" = "001"、3 回折ったときの折り目は "001" + "0" + "011" = "0010011" です。
N-1 回折ったときの折り目の文字列を S、S を逆順にし、0 と 1 を反転させた文字列を S' とすると、N 回折ったときの折り目の文字列は S + "0" + S' となります。

N 回折ったときの折り目の数 2N-1 個の要素を持つ配列を用意します。
方針の通りに 1 回折ったときの折り目から順に N 回折ったときの折り目までを順に求めます。
'''

# 入力値を取得
N = int(input())

# 折り目の数 2^N - 1 を計算して配列のサイズを決定
size = 2 ** N - 1

# 折り目を表す配列を初期化。初期値はすべて False (谷折り)
paper = [False] * size

# カウント変数の初期化
count = 0

# ループで折り目を生成
while True:
    # 現在の折り目の状態を逆順にして反転させた折り目を生成
    for i in range(count):
        paper[count * 2 - i] = not paper[i]

    # 真ん中の折り目は常に谷折り (False)
    paper[count] = False

    # カウントを更新。次の折り目の位置を決定
    count = count * 2 + 1

    # N をデクリメント。N が 0 になったら終了
    N -= 1
    if N == 0:
        break

# 最終的な折り目を出力。谷折りは 0、山折りは 1 として出力
for i in range(0, size):
    print(1 if paper[i] else 0, end="")

# 最後に改行を出力
print()
```

### 解説

1. **入力値の取得**
    ```python
    N = int(input())
    ```
    - 入力から紙を折る回数 `N` を取得します。

2. **配列のサイズを計算して初期化**
    ```python
    size = 2 ** N - 1
    paper = [False] * size
    ```
    - 折り目の数は `2^N - 1` です。
    - これを元に `paper` 配列を初期化し、すべての値を `False`（谷折り）に設定します。

3. **折り目の生成ループ**
    ```python
    count = 0
    while True:
        for i in range(count):
            paper[count * 2 - i] = not paper[i]
        paper[count] = False
        count = count * 2 + 1
        N -= 1
        if N == 0:
            break
    ```
    - `count` を初期化し、折り目を生成するループに入ります。
    - 現在の折り目の状態を逆順にして反転させた折り目を生成し、適切な位置に配置します。
    - 真ん中の折り目は常に谷折り（`False`）です。
    - `count` を更新して次の折り目の位置を決定します。
    - `N` をデクリメントし、`N` が 0 になったらループを終了します。

4. **最終結果の出力**
    ```python
    for i in range(0, size):
        print(1 if paper[i] else 0, end="")
    print()
    ```
    - `paper` 配列の内容を出力します。`False` は谷折り（`0`）、`True` は山折り（`1`）として出力します。
    - 最後に改行を追加します。

このプログラムは、指定された回数 `N` だけ紙を折り、その折り目の状態を正確に出力することができます。
Synology Active Backup for Business のリカバリーメディア作成に失敗する

Synology Active Backup for Business のリカバリーメディアを作る際に躓いたので、備忘録として書き残しておきます。
根本的な原因は不明ですが、同事象が発生した場合の参考になればと思います。

# 発生した問題
Synology Active Backup for Business リカバリメディアクリエイターでISOファイル形式のリカバリーメディアを作成した時、以下のエラーが発生した。

![error_202407181716.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3567552/3d141aa1-0d49-8181-5865-e685d333a15a.jpeg)

ログファイル `restore-media.log` を確認すると、以下のメッセージが出力され、Windows ADK の展開ツールで処理が止まっていると思われる。

```
Image path is [\??\C:\Program Files (x86)\Windows Kits\10\Assessment and Deployment Kit\Deployment Tools\AMD64\DISM\wofadk.sys]
Running on Windows 10 or later.
Returning status 0x0

展開イメージのサービスと管理ツール
バージョン: 10.0.25398.1


エラー: 0xc1510114

指定したイメージは再マウントする必要があります。
このイメージをサービスで利用可能にするためには、Wim を再マウントしてください。
```

# 解決方法
Windows ADK および Window PE を再インストールしたところ、無事にリカバリメディアを作成することができた。
AWSおよびネットワークの用語整理

こんにちは、jjj0331です。
今回はAWSでWordPressを構築しました。その過程で学んだAWSやネットワークについての知識をまとめたいと思います。

## AWSについて
### AWSとは
AWS（Amazon Web Services）はクラウドサービスの一つです。クラウドサービスとは、サーバーやネットワークなどのインフラ環境を提供するサービスのことを指します。

※クラウドサービスの対義語として、「オンプレミス」があります。これは物理的なサーバーやネットワークを自前で構築することを指します。

※AWS以外のクラウドサービスとして、「Microsoft Azure」や「Google Cloud」なども存在します。

## AWSのサービス
### VPC
VPC（Virtual Private Cloud）は、ネットワークを仮想的に構築できるサービスです。これを使用して、あとで記載するEC2やRDSを作成したネットワーク内に配置することができます。また、VPC内にサブネットを作成することができ、例えば一つのVPC内に2つのサブネットを作成し、インターネットアクセスが可能なものと不可能なものに分けることができます。よくある例として、RDSはインターネットアクセスを不可にするため、インターネット不可のサブネットに関連付けます。

VPCの中には「Elastic IP」というサービスもあり、IPアドレスを取得することで、EC2を再起動した際にIPアドレスが変化してもElastic IPが変わらないため、ドメイン設定などを変更する必要がありません。

### EC2
EC2（Elastic Compute Cloud）は、AWSで作成できる仮想的なサーバーのことを指します。サーバーのOSやスペックなどを決めることができるため、自分に合ったサーバーを作成することができ、料金も使用した分だけ支払う仕組みになっています。

EC2を起動すると自動的にIPアドレスが振られ、再起動すると別のIPアドレスが振り直されます。OSやスペックなどの初期設定後は、サーバーには何もソフトがインストールされていないため、サーバーにSSH接続で接続し、コマンドによるソフトウェアのインストール作業が必要となります。

EC2にはセキュリティグループという設定があり、どのサーバーや通信をサーバー内に許可するかなどの詳細を決定できます。通信する際にサーバー側へアクセスする（インバウンド）だけでなく、サーバーから通信する（アウトバウンド）際にどのポート番号を許可するかなどの設定も行うことができます。

### RDB
RDSは、AWSが提供するリレーショナルデータベースの管理サービスです。MySQL、PostgreSQL、MariaDB、Oracle、SQL Serverなどのデータベースエンジンを簡単に設定、運用、スケールできます。これにより、データベースのバックアップ、リカバリ、パッチ適用、スケーリングなどの管理作業を自動化できます。

### 各サービスのまとめ
AWSでRailsを用いたWebアプリを作成したと仮定して、
各AWSのサービスの関係性をまとめます。

#### 前提条件：
EC２を作成して、Elastic IPより固定のIPアドレスをEC２に紐づけることでサーバーが再起動されてもドメイン名などに影響を及ぼさない。
また、EC2にWebサーバー(Apache)、アプリケーションサーバー(Rails)をインストールしておく。

VPCはパブリックサブネット、プライベートサブネットを用意
パブリックサブネット: インターネットゲートウェイを通じてインターネットにアクセスできるサブネット。このサブネットにEC2インスタンスを配置します。
プライベートサブネット: インターネットから直接アクセスできないサブネット。このサブネットにRDSインスタンスを配置します。

この状態で、
ユーザーがブラウザにURLを打ち込みリクエストを投げると
パブリックサブネットに配置されたEC2インスタンス上のApacheがリスエストを受け取り
WebサーバーはリクエストをRailsアプリケーションに転送します。
Railsアプリケーションがリクエストを受け取り、必要なビジネスロジックを実行します。
データベースアクセスが必要な場合、Railsアプリケーションはプライベートサブネット内のRDSインスタンスに接続します。

この際のRialsとRDSの通信は
VPC内での通信のためセキュリティー面でも安全な通信となります。

RailsアプリケーションがRDSからのクエリの結果をもとにレスポンスをユーザーに返します。
addGraph の紹介

1. ツール名: addGraph
2. ウェブサイト リンク: https://addgraph.com/
3. ツール紹介: addGraph は、フローチャートやマインド マップなどの作成に使用できるグラフ描画ツールです。5 つの並べ替え方法と 2 つのノード接続編集方法をサポートしています。

**説明**

AddGraph は、ビジネス インテリジェンスおよび分析製品向けの非常にシンプルで強力なグラフ作図ツールです。他の作図ツールと比較して、AddGraph はノードと線の追加が高速です。ノードのサイズを変更したり、アイコンをカスタマイズしたり、アイコンの色、境界線の色、タイトルの色を変更したりできます。線は、直線、破線、破線に設定することもできます。もちろん、色や線の幅も変更できます。線のタイトルを設定することも、もちろん線の矢印を設定することもできます。

AddGraph は、データ視覚化ツールとしても使用できます。現在、3 つの異なるレイアウト方法を提供しています: 強制レイアウト、円形レイアウト、水平ツリー レイアウト、垂直ツリー レイアウト、および長方形レイアウト。レイアウト変換はアニメーション効果です。

主な機能:

1. ノードと接続を追加するのは非常に簡単です。マウスでドラッグして追加するか、テキスト エディターでグラフを編集できます。

2. 5 つのソート方法: 強制指向グラフ ソート、円形ソート、長方形ソート、水平ツリー ソート、および垂直ツリー ソート。

3. ノードのサイズ、色、アイコン、境界線、タイトル テキストなどのプロパティをリアルタイムで変更できます。

4. 接続の太さ、色、点線、実線、アニメーション フロー、先頭矢印と末尾矢印などのプロパティをリアルタイムで変更できます。

5. グラフ編集が完了したら、json データまたは SVG としてエクスポートできます。

6. グラフは、JSON インポートとバッチ画像インポートをサポートしています。 JSON は [rules](https://addgraph.com/docs/importData) に従って定義する必要があります。画像のインポートは、画像をグラフ内のノードとして表示することです。
7. ツール ページのスクリーンショット:
![neuralNetwork.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87566/76e79da1-340f-7783-19e6-fdddab5b951e.png)
![biglargemodelmath.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87566/22c6d183-a0b8-7c1b-d7c4-91394a619ed7.png)
![monitoringSteps.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87566/2447fa89-7f20-2ab7-155c-93afd3f50c3c.png)
【学習記録　2024-08-11】　　　JavaScript

## 教材を使用する
Udemy「超JavaScript完全ガイド 2024」

## 学習内容
### 学習時間：3h
- 配列のようなオブジェクトの操作
- 配列のようなオブジェクトを本物の配列にする方法
- spliceメソッドについて
- fillの使い方
- copyWithinの使い方
- reverseの使い方
- sortを使った配列の並び替え方法
- sliceで配列の一部を切り取る方法
- concatで配列同士を結合する方法
- joinで配列を一つの文字列に変換する方法
- indexOfとlastIndexOfとincludesで要素の検索をする方法
- mapを使用して要素を関数を使って変換する方法
- flatとflatmapでネストした配列をまとめる方法
- fillterで不要な要素を取り除く方法
- redeceとreduceRightを使用して端から計算する方法
- findとfindIndexで特定の要素を見つける方法
- everyとsomeを使った真偽の取得
- forEachで単純なループ処理をする方法
- 配列内のコールバック関数のthis
- atでインデックスにマイナスを指定する方法

#### 学習メモ
量が多すぎるので省略。

## 所感
　本日は、主に配列の操作方法を重点的に学習しました。正直量が多くて覚えきれていないですがどれも便利なものばかりなので確実に覚えたいと思います！！
【Git】コマンドのエイリアスを設定する方法

## グローバルなエイリアスを設定する

```terminal
git config --global alias.ci commit
```

どのリポジトリでも `git ci` で　`git commit` が実行できる。

## ローカルなエイリアスを設定する

```terminal
git config --local alias.ci commit
```

設定したリポジトリでのみ `git ci` で　`git commit` が実行できる。

## 外部コマンドにエイリアスを設定する

外部コマンドにエイリアスを設定する場合にはコマンドの最初に `!` を記述する必要がある。

```terminal
git config --global alias.sync "!git switch main && git pull --prune && git branch --format '%(refname:short) %(upstream:track)' | grep -oP '.*(?=\s\[gone\]$)' | xargs -r git branch -D"
```

どのリポジトリでも `git sync` で `git switch main && git pull --prune && git branch --format '%(refname:short) %(upstream:track)' | grep -oP '.*(?=\s\[gone\]$)' | xargs -r git branch -D` が実行できる。

## 参考

https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E5%9F%BA%E6%9C%AC-Git-%E3%82%A8%E3%82%A4%E3%83%AA%E3%82%A2%E3%82%B9
React Routerのv5とv6の違い

# React Routerとは？
Reactアプリケーションのルーティングを管理することができるライブラリ。
バージョン6でいくつか記法に変更があった。


## SwitchとRouters

### 書き方の違い
- v5
    - Switchでルーティングを囲う
    - componentプロパティにコンポーネントを渡す
- v6
    - Routesでルーティングを囲う
    - elementプロパティにJSXを直接渡す

```jsx:v5
import { Switch, Route } from 'react-router-dom';

function App() {
  return (
    <Switch>
      <Route path="/A" component={A} />
      <Route path="/B" component={B} />
      <Route path="/" component={C} />
    </Switch>
  );
}
```
```jsx:v6
import { Routes, Route } from 'react-router-dom';

function App() {
  return (
    <Routes>
      <Route path="/A" element={<A />} />
      <Route path="/B" element={<B />} />
      <Route path="/" element={<C />} />
    </Routes>
  );
}
```

### 機能の違い
- v5
    - Switchは上から下にルートをチェックし、最初に一致するルートを見つけたらそれ以降のルートを無視してそのルートのみをレンダリングする
    - v5ではルートが完全に一致するかどうかを指定するためにexactプロパティが必要
- v6
    - Routesも同様に最初に一致するルートを探すが、v6ではネストされたルートがより強力にサポートされている
    - v6ではデフォルトで完全一致をチェックする

### ネストされたルートの違い
- v5
    - ネストを表現する場合、親ルートのコンポーネント内で子ルートを定義する
- v6
    - 親Routeコンポーネント内に子Routeコンポーネントをネストする形で定義する
    - 親のコンポーネント内の子要素をレンダリングしたい場所にOutletコンポーネントを使用する

 ``` jsx:v5
 import { Switch, Route } from 'react-router-dom';

function App() {
  return (
    <Switch>
      <Route path="/A" component={A} />
      <Route path="/B" component={B} />
      <Route path="/" component={C} />
    </Switch>
  );
}

function B() {
  return (
    <div>
      <h2>Users</h2>
      <Switch>
        <Route path="/B/D" component={D} />
        <Route path="/B/:id" component={E} />
      </Switch>
    </div>
  );
}
 ```
 ```jsx:v6
import { Routes, Route } from 'react-router-dom';

function App() {
  return (
    <Routes>
      <Route path="/" element={<A />} />
        <Route path="B" element={<B />}>
        <Route path="C" element={<C />} />
          <Route path=":id" element={<D />} />
        </Route>
      <Route path="E" element={<E />} />
    </Routes>
  );
}

function A() {
  return (
    <div>
      <Outlet />
    </div>
  );
}
 ```

:::note warn
 親コンポーネント内でさらに子コンポーネントを出し分けたい際にネスト記法を使うこと。
 urlが階層構造になってるからといって何でもかんでもネスト記法でルートを記述すれば良いものではない
:::


 ## component/render/children
 v5で使われていたこれらのプロパティは廃止され、elementに統合された。

 ## ルーティングパラメータの取得
- v5
    - match/location/historyをpropsとして受け渡ししてパラメータを取得
- v6
    - フックを用いてpropsの受け渡しなしに実現(useParams/useLocation/useNavigate)
AWS Lake Formation




## AWS Lake Formationとは

**Lake Formation**は、S3をベースとしたデータレイクを「**よりセキュアかつ管理しやすく**」するためのマネージドサービスです。  
Glue、Athena、Redshift Spectrumなどの分析基盤と連携し、**一元的なセキュリティ制御**や**データ取り込みの自動化**を実現します。

### 主な機能

| 機能               | 説明 |
|--------------------|------|
| データカタログ     | Glueと共通のメタデータカタログを使用 |
| ブループリント     | RDBやCloudTrailなどからのデータ取り込みテンプレート |
| データアクセス制御 | リソースベースとLFタグによるきめ細かなアクセス制御 |
| セキュリティ監査   | データアクセスログの統合管理 |
| クロスアカウント共有 | 他AWSアカウントへの安全なデータ共有が可能 |





## 1. LFタグベースのアクセス管理
- 複雑なIAMポリシーを作らずに、タグでアクセス制御を一元管理
- データガバナンスにおいて、**動的かつスケーラブルな管理方式**として評価されます

## 2. クロスアカウントデータ共有
`Lake Formation + Resource Link` により、S3バケットを直接共有せずに**セキュアにテーブルレベル共有**が可能


## 3. GlueとLake Formationの違い
- GlueはETL/カタログ/クローラー中心
- Lake Formationはセキュリティ・ガバナンス特化

## 4. ブループリント

ブループリントは、データレイクにデータを簡単に取り込めるようにするデータ管理テンプレートです。 Lake Formation には、リレーショナルデータベースや AWS CloudTrail ログなど、事前定義されたソースタイプごとに複数のブループリントが用意されています。




## 5. GCPとの比較：BigLake vs Lake Formation

| 観点                      | AWS Lake Formation                  | GCP BigLake                          |
|---------------------------|-------------------------------------|--------------------------------------|
| データレイクベース        | S3                                  | GCS                                  |
| アクセス管理              | LFタグ、セルレベル制御               | IAM + Data Catalog（Tagで制御）     |
| 連携サービス              | Glue, Athena, Redshift, EMR         | BigQuery, Dataproc, Dataflow         |
| クロスプロダクト統合      | 他AWSサービスと密連携               | BigQuery統合が強力                   |
| アクセス監査              | CloudTrail + Lake Formation         | Cloud Audit Logs + Data Catalog      |
| テーブルフォーマット対応 | Iceberg, Apache Hudi (Athena連携)   | Apache Iceberg (BigLakeネイティブ)  |
英単語になるカラーコードを総当たりで探す

# やりたかったこと
カラーコードで使用するアルファベット6種類6文字で、英単語になるものがいくつあるのか知りたい。
検索したところ総当たりで調べた結果は見つけられなかった。
→ せっかくなのでプログラムを書いて調べてみることにしました。

※先行記事：

https://qiita.com/shigemaruu/items/e4492455c973719da181

# 追記
* 準備として記載していたnode.jsのアプリ作成部分を省略しました
* いただいたコメントをもとにコードを修正しました

# やったこと
### パブリックドメインの英和辞書を取得
こちらからJSON形式のものをお借りしました。

https://kujirahand.com/web-tools/EJDictFreeDL.php#google_vignette

### JS
<details>
<summary>最初のコード</summary>

```javascript
import { readFile } from 'fs/promises'

const json = JSON.parse(await readFile('./ejdict.json'))
const chars = ['a', 'b', 'c', 'd', 'e', 'f'];
const codes = [];

//文字列生成して存在チェック
for (let i=0; i<6; i++){
    for (let j=0; j<6; j++){
        for (let k=0; k<6; k++){
            for (let l=0; l<6; l++){
                for (let m=0; m<6; m++){
                    for (let n=0; n<6; n++){
                        let code = chars[i] + chars[j] + chars[k] + chars[l] + chars[m] + chars[n];
                        if (code in json){
                            codes.push(code);
                        }
                    }
                }
            }
        }
    }
}

for (let i=0; i<codes.length; i++){
    console.log('#' + codes[i] + ' : ' + json[codes[i]]);
}
```
</details>

修正版
```JavaScript
import { readFile } from 'fs/promises'

const json = JSON.parse(await readFile('./ejdict.json'))
const codes = [];

for (let i=0xaaaaaa; i<=0xffffff; i++){
    const hex = i.toString(16);
    if(/\d/.test(hex)) continue;
    const colorCode = `#${hex}`;
    if(hex in json){
        codes.push(`${colorCode} : ${json[hex]}`);
    }
}

for (let i=0; i<codes.length; i++){
    console.log(codes[i]);
}

```

# 結果
```
#accede : (要求・提案などに)同意する,承認する(agree)《+『to』+『名』》 / (王位・財産などを)継承する;(公職などに)就任する《+『to』+『名』》
#decade : 『10年間』
#deface : 表面を傷つける［摩滅する］; 読めなくする, わからなくする・〈外観〉'を'醜くする・…'を'摩損する,すり消す,読みにくくする
#efface : (…から)〈文字・記憶など〉‘を'消す,ぬぐい去る《+『名』+『from』+『名』》
#facade : (建物の)正面(front) / (物の)外観;見せかけ
```
5つだけヒットしました。
`#accede` (要求・提案などに)同意する,承認する
`#decade` 10年間
`#deface` 表面を傷つける
`#efface` (…から)〈文字・記憶など〉を消す
`#facade` (建物の)正面
スクレイピング　クローラー開発のヒント【ページネーションのスクレイピング】

ページネーション部分をスクレイピングするためのTipsをシェアします！
以下のプログラムを参考に、実装してみてくださいね

# ページ番号リンクをすべて見つける
page_links = soup.find_all('a', class_='Pager_link__rnYFP')

# ページ番号を抽出して整数に変換
page_numbers = [int(link.text) for link in page_links if link.text.isdigit()]

# 最大のページ番号を見つける
max_page_number = max(page_numbers)

print("最大のページ番号は:", max_page_number)

以上です。
何か少しでもあなたのお役に立てば幸いです。
[Unity]OnPreCullなどのレンダリングのイベント関数が実行されない時

# 概要

Unityのイベント関数には有名どころのAwake / Start / Update以外にもOnPreCullなどのレンダリングのイベント関数もあります。これを使おうとした時、実行されない事があったのでその解決方法を共有します。
# 本文
OnPreCull等のレンダリングのイベント関数はアタッチしたオブジェクトにCameraがついてないと実行されないようです。

# 補足
参考記事
[Unity公式 / イベント関数の実行順序](https://docs.unity3d.com/ja/2022.3/Manual/ExecutionOrder.html)

[【理解した！】スマホ向けUnity スクリプト実行順の謎](https://ameblo.jp/sugawara-monolizm/entry-11889665729.html)
掲示板アップロード機能を書いてもエラーが起きたときの対処法

## はじめに
自分のためのメモです。
docker環境で掲示板の画像アップロード機能を追加した際に
発生したエラーの解決法を記録します。
## 発生したエラー

掲示板作成作成画面に入ろうとした際、以下のエラー文が出ました。
```
NameError in BoardsController#index
uninitialized constant Board::BoardImageUploader
```
## 解決法
コンテナを一時停止して、もう一度立ち上げたら解決しました。

## 最後に
私自身まだ学び始めたばかりで、自分だけで悩んでいた時は
この方法をまったく思いつかなかったので、こんな簡単なことでも
同じ悩みを抱えた誰かの役に立てたら嬉しいです。
ファイル圧縮の基本と最適なツール選び：プラットフォーム別ガイド

## 目次

1. [代表的な圧縮形式](#代表的な圧縮形式)
   - [ZIP (.zip)](#zip-zip)
   - [RAR (.rar)](#rar-rar)
   - [TAR (.tar)](#tar-tar)
   - [GZIP (.gz)](#gzip-gz)
   - [BZIP2 (.bz2)](#bzip2-bz2)
   - [7Z (.7z)](#7z-7z)
   - [LZH (.lzh)](#lzh-lzh)

2. [代表的な圧縮・解凍ソフト](#代表的な圧縮解凍ソフト)
   - [7-Zip](#1-7-zip)
   - [WinRAR](#2-winrar)
   - [PeaZip](#3-peazip)
   - [Lhaplus](#4-lhaplus)
   - [Explzh for Windows](#5-explzh-for-windows)
   - [CubeICE](#6-cubeice)
   - [TC4Shell](#7-tc4shell)
   - [Windows 11 標準機能](#8-windows-11-標準機能)

3. [Windowsおすすめの圧縮形式](#windowsおすすめの圧縮形式)
   - [ZIP形式](#zip形式)
   - [7z形式](#7z形式)

4. [macOSおすすめの圧縮形式](#macos-おすすめの圧縮形式)
   - [ZIP形式](#zip形式-1)
   - [7z形式](#7z形式-1)

5. [Linuxおすすめの圧縮形式](#linux-おすすめの圧縮形式)
   - [tar.gz形式](#targz形式)
   - [tar.bz2形式](#tarbz2形式)
   - [ZIP形式](#zip形式-2)

---

## 代表的な圧縮形式

### ZIP (.zip)
- **特徴**: 最も一般的な圧縮形式で、多くのオペレーティングシステムで標準サポートされている。
- **用途**: 複数のファイルやフォルダを一つにまとめる際に便利。
- **圧縮率**: 中程度。
- **備考**: パスワード設定が可能で、WindowsやmacOSで特別なソフトがなくても使用可能。

### RAR (.rar)
- **特徴**: 高い圧縮率を提供しますが、専用の解凍ソフトが必要。
- **用途**: 大容量ファイルの圧縮に適している。
- **圧縮率**: 高い。
- **備考**: パスワード保護やエラリカバリ機能があり、ファイルサイズを小さくしたい場合に適している。

### TAR (.tar)
- **特徴**: 主にUNIX系システムで使用される形式で、圧縮自体は行わず、複数のファイルを一つにまとめるために使用される。
- **用途**: バックアップやアーカイブに使われる。
- **圧縮率**: 圧縮なし。
- **備考**: 圧縮を行う場合はGZIPやBZIP2と組み合わせる。

### GZIP (.gz)
- **特徴**: 高い圧縮率を提供し、主にTARと組み合わせて使用される。
- **用途**: UNIX系システムでのファイル圧縮。
- **圧縮率**: 高い。
- **備考**: TARファイルと組み合わせて使用し、ファイルの圧縮とアーカイブを同時に行いたい場合に適している。

### BZIP2 (.bz2)
- **特徴**: GZIPよりもさらに高い圧縮率を提供しますが、圧縮速度が遅い。
- **用途**: 高い圧縮率が求められる場合に使用される。
- **圧縮率**: 非常に高い。
- **備考**: 圧縮速度が遅いので、圧縮効率を重視する場合に適している。

### 7Z (.7z)
- **特徴**: 高い圧縮率を提供し、オープンソースの圧縮形式。
- **用途**: 高い圧縮率が必要な場合に使用される。
- **圧縮率**: 非常に高い。
- **備考**: 7-Zipというソフトウェアで使用され、パスワード保護や分割圧縮も可能。

### LZH (.lzh)
- **特徴**: 日本国内で普及しているファイル圧縮形式で、圧縮・解凍スピードが速い。
- **用途**: 日本国内でのファイル圧縮。
- **圧縮率**: 高い。
- **備考**: Windowsでは特別なソフトがなくても解凍可能だが、Macでは解凍ソフトが必要。

---

## 代表的な圧縮・解凍ソフト

### 1. 7-Zip
- **特徴**: 高圧縮率のファイルアーカイバで、7z形式をはじめ多くの形式に対応。
- **対応形式**: 7z、ZIP、RAR、GZIP、TARなど。
- **利点**: 無料でオープンソース。高圧縮率と多機能性が特徴。

### 2. WinRAR
- **特徴**: RAR形式の圧縮・解凍に特化したソフト。
- **対応形式**: RAR、ZIP、CAB、ARJ、LZH、TAR、GZ、ACE、UUE、BZ2、JAR、ISO、7Z、Z。
- **利点**: 強力な圧縮率と修復機能。商用利用は有料。

### 3. PeaZip
- **特徴**: 180以上のファイル形式をサポートするオープンソースの圧縮・解凍ソフト。
- **対応形式**: ZIP、7Z、RAR、TAR、GZ、BZ2など。
- **利点**: 多機能であり、ファイルの分割・結合も可能。

### 4. Lhaplus
- **特徴**: 日本製の圧縮・解凍ソフトで、シンプルな操作性が特徴。
- **対応形式**: ZIP、LZH、7Z、RARなど。
- **利点**: 外部DLL不要で、多くのアーカイブ形式に対応。

### 5. Explzh for Windows
- **特徴**: 多機能なアーカイブファイル操作ツール。
- **対応形式**: ZIP、RAR、7Z、CAB、LZHなど。
- **利点**: 書庫内のファイル操作が容易で、エクスプローラー風のインターフェース。

### 6. CubeICE
- **特徴**: 無料で高機能な国産圧縮・解凍ソフト。
- **対応形式**: ZIP、7Z、RARなど。
- **利点**: 高圧縮率の形式に対応しており、簡単に操作可能。

### 7. TC4Shell
- **特徴**: エクスプローラーで7z/RAR/ISOなどを扱えるツール。
- **対応形式**: 7Z、RAR、ISOなど。
- **利点**: エクスプローラーと統合されており、直感的に操作可能。

### 8. Windows 11 標準機能
- **特徴**: 最新のWindows 11では、ZIPファイルに加えて、tar、7-zip、rar、gz形式の圧縮ファイルの展開が可能。
- **対応形式**: ZIP、tar、7-zip、rar、gz。
- **利点**: フリーソフト不要で、システムに組み込まれているため手軽に利用可能。

---

## Windowsおすすめの圧縮形式

- **ZIP形式**
- **7z形式**

---

## macOS おすすめの圧縮形式

- **ZIP形式**
- **7z形式**

---

## Linux おすすめの圧縮形式

- **tar.gz形式**
- **tar.bz2形式**
- **ZIP形式**
C_TS4FI_2021 SAP Certified Associate - SAP S/4HANA 2021 for Financial Accounting対策（19/100）

【19日目】
トピック2：総勘定元帳（4/20）

≪問題19≫
部品表/配合表（BOM）内では、以下のどの標準明細カテゴリを選択できますか。
（２つ選択）
□ワークアイテム
□非在庫品目
□WBSアイテム
□可変サイズ品目

≪解答≫
□ワークアイテム
■非在庫品目
□WBSアイテム
■可変サイズ品目

≪解説≫
◆BOM明細には、明細カテゴリが必ず割り当てられている必要があります。明細カテゴリは、以下のような明細の機能を定義するために使用されます。
（1）品目の入力が必要かどうか。
（2）明細が数量基準の在庫管理をサポートするかどうか。
（3）プラス符号およびマイナス符号の両方がサポートされるかどうか。
（4）副明細がサポートされるかどうか。
（5）どの画面が選択されるか、および明細の詳細画面のレイアウトがどのようになっているか。
◆BOM明細の標準的な明細カテゴリとしては、以下のものがあります。
（1）在庫品目
（2）非在庫品目
（3）可変サイズ品目
（4）テキスト明細
（5）文書明細
（6）クラス明細
（7）PM構造要素
（8）中間品目
【Unity】Scriptable Objectで変更した値が参照先で変わらない問題の解決法【Scriptable Object】

【Unity】Scriptable Objectで変更した値が参照先で変わらない問題の解決法
===

## はじめに
お疲れ様です。柊　弥生です。
ゲーム制作をしていてScriptble Objectを使用する機会が多いのですが、動的に値を変更するときに使用した際、初期値からScriptable Objectの値を変更した後に値を適切に読み取ってくれないという問題があったので解決法をまとめます。  
初歩的な話かもしれませんが、数時間悩んでしまったので戒めのつもりで記事にします。
Scriptable Objectの仕様については、公式のリファレンスや他の解説記事を見て下さい。

## 結論
結果から言うと使い方が違いました。参照先のスクリプトでは、何かしらの変数に置き換えてから使えということです。

## だめな例
**Scriptable Objectの例**
```csharp
public class TestScriptableObject : ScriptableObject
{
    public int num;
}
```

**参照先のオブジェクト**
```csharp
public class TestMonoBehaviour : MonoBehaviour
{
    public TestScriptableObject _TestScriptableObject;

    private void Update()
    {
        Debug.Log(_TestScriptableObject.num);
    }
}
```
この方法では、参照先のオブジェクトでScriptable Objectのint型の値をインスタンス化せずにそのまま使用しています。この方法では、外部から値を変更しても変更後の値を読み取りません。


## 正しい例
```csharp
public class TestMonoBehaviour : MonoBehaviour
{
    public TestScriptableObject _TestScriptableObject;
    private int num;

    private void Update()
    {
        num = _TestScriptableObject.num; 
        Debug.Log(num);
    }
}
```
この方法では、実行途中でScriptable Objectの値が変更しても読み取ってくれます。
インスタンス化必須ですねw


## 実際の使用箇所
このScriptable Objectはコントローラーからの入力（InputSystem）を各スクリプトに中継するために使用しています。

### 1．従来の方法
```mermaid
graph LR
    A(InputSystem　ActionMap) --> B(InputSystemの関数をまとめたScript)
    B --> C(キャラ操作用Script)
    B --> D(UI操作用Script)
```

1の方法では、コントローラーからの入力をInputSystemの関数をまとめたScriptを経由して送信していました。このときコントローラー入力の値を使用する箇所を決めておき、InputSystemの関数をまとめたScript（以降は、IS Scriptとする）内で値を受け渡していました。IS Scirptは、コンポーネントとして配置することから、呼び出しタイミングの異なるコンポーネント間では、値の受け渡しができませんでした。

### 2．Scriptable Object使用後
```mermaid
graph LR
    A(InputSystem　ActionMap) --> B(InputSystemの関数をまとめたScript)
    B --> C(Scriptable Object)
    C --> D(キャラ操作用Script)
    C --> E(UI操作用Script)
```

2の方法にしたことにより事前にコントローラー入力の使用箇所を定めずに適宜Scriptable Objectを参照することでコントローラーの入力を受け取れるようにしました。Scriptable Objectは実行タイミングに依存せずに任意のタイミングで参照できるため、使用箇所を気にすることはありません。

**注意事項**
Scriptable Objectの仕様として、ビルド後は動的に値の変更をしたとしても途中で保存することはできません。したがって、コントローラーの入力結果を保存する場合には、Jsonなど任意のファイルに書き出すか、メモリ上に別途書き出す必要があります。
また、Scriptable Objectを経由してコントローラーの入力を受け取ることから、入力遅延が発生する可能性があります。私の環境では影響ありませんが、シュミュレーションゲームを作成される方でシビアな入力を必要とする場合には、注意して下さい。また、Scriptable ObjectのInspector上で入力結果を確認できるようにしていますが、実際に値が変化してから表示結果が変わるまで遅延します。（Inspectorの表示結果のすべては必ず遅延します）
RailsのTimeクラスを覚えたい

# 概要
- 何度書いても忘れるのでメモ的な記事
- RailsはRubyのTimeクラスを拡張しているとのこと


# ドキュメント

ここみればいいと思います。

https://api.rubyonrails.org/classes/Time.html

# 今を取る

```ruby
Time.current
=> Sat, 01 Jun 2024 10:24:15 JST +09:00
```

`Time.now` でも取れるが、`Time.current`の場合、`Time.zone`または`config.time_zone`が設定されていれば、`Time.zone.now`を返してくれるのでお得（？）

# 今より前の時間を取りたい

色々ある

```ruby
Time.current.ago(1.day)
=> Fri, 31 May 2024 10:25:03 JST +09:00
```

intから`day`や`hour`を生やすことができる。複数形でも良い

```ruby
[23] pry(main)> 3.day
=> 3 days
[24] pry(main)> 2.days
=> 2 days
[25] pry(main)> 1.days
=> 1 day
[26] pry(main)> 1.day
=> 1 day
```


```ruby
[27] pry(main)> 1.second
=> 1 second
[28] pry(main)> 1.minute
=> 1 minute
[29] pry(main)> 1.hour
=> 1 hour
[30] pry(main)> 1.month
=> 1 month
[31] pry(main)> 1.year
=> 1 year
```

`ago`を使ったaliasだと思うけど、前月などを取得するメソッドもある


```ruby
[32] pry(main)> Time.current.prev_day
=> Fri, 31 May 2024 10:27:35 JST +09:00
[33] pry(main)> Time.current.prev_month
=> Wed, 01 May 2024 10:27:37 JST +09:00
[34] pry(main)> Time.current.prev_year
=> Thu, 01 Jun 2023 10:27:38 JST +09:00
```

# timestamp to Time

```ruby
[38] pry(main)> Time.at(1717167600)
=> 2024-06-01 00:00:00 +0900
```

# 指定した年や月が何日あるか

```ruby
[52] pry(main)> (2015..2022).to_h { |year| [year, Time.days_in_year(year)] }
=> {2015=>365, 2016=>366, 2017=>365, 2018=>365, 2019=>365, 2020=>366, 2021=>365, 2022=>365}


[1] pry(main)> Time.days_in_month(2, 2022)
=> 28
[2] pry(main)> Time.days_in_month(2, 2021)
=> 28
[3] pry(main)> Time.days_in_month(2, 2020)
=> 29
[5] pry(main)> Time.days_in_month(2, 2019)
=> 28
```

2020年は閏年

一旦ここまで
C_TS4FI_2021 SAP Certified Associate - SAP S/4HANA 2021 for Financial Accounting対策（18/100）

【18日目】
トピック2：総勘定元帳（3/20）

≪問題18≫
在庫、入出庫予定、または購買伝票が存在する場合、以下のどの状況下で品目の品目タイプを変更できますか。
（２つ選択）
□同じロット管理レベルが使用されること。
□同じ基本数量単位が使用されること。
□数量と金額の更新が同じレベルであること。
□同じ勘定カテゴリが使用されること。

≪解答≫
□同じロット管理レベルが使用されること。
□同じ基本数量単位が使用されること。
■数量と金額の更新が同じレベルであること。
■同じ勘定カテゴリが使用されること。

≪解説≫
◆品目を登録した後で品目タイプの変更が必要になる場合がありますが、すでに取引が転記されていると、これにより問題が発生することがあります。
◆そのため、システムによって品目タイプの変更が可能かどうかがチェックされます。
（1）在庫、入出庫予定、購買伝票が存在しない場合は、制限なく品目タイプを変更することが可能です。
（2）在庫、入出庫予定、購買伝票が存在する場合は、以下の条件が満たされている場合に限り、品目タイプを変更することができます。
- 同じ勘定カテゴリが使用されていること。
- 数量および金額の更新が同じレベルであること。
データベース障害予防の基本対策

この記事では、日常で実践可能な DB 障害予防の基本対策を記述している

「後でいつでも概要を見返す」が主な目的

具体的なコマンドや設定値などは割愛している

# 対象読者

* Web 開発でフルスタックの領域に足を突っ込んでいる人
* 過去に DB 障害を起こし、今後の予防策について参考情報を得たい人
* まだ DB 障害は起きていないが、あらかじめ予防策を知りたい人


# 基本対策

* **[1. スロークエリのログ出力](https://qiita.com/ymatsukawa/items/1f75f2fffa6308a37d54#1-%E3%82%B9%E3%83%AD%E3%83%BC%E3%82%AF%E3%82%A8%E3%83%AA%E3%81%AE%E3%83%AD%E3%82%B0%E5%87%BA%E5%8A%9B)**
* **[2. インデックス対策](https://qiita.com/ymatsukawa/items/1f75f2fffa6308a37d54#2-%E3%82%A4%E3%83%B3%E3%83%87%E3%83%83%E3%82%AF%E3%82%B9%E5%AF%BE%E7%AD%96)**
* **[3. N+1 問題の対策](https://qiita.com/ymatsukawa/items/1f75f2fffa6308a37d54#3-n1-%E5%95%8F%E9%A1%8C%E3%81%AE%E5%AF%BE%E7%AD%96)**
* **[4. 負荷テスト実施](https://qiita.com/ymatsukawa/items/1f75f2fffa6308a37d54#4-%E8%B2%A0%E8%8D%B7%E3%83%86%E3%82%B9%E3%83%88%E5%AE%9F%E6%96%BD)**
* **[5. RDBMS の設定値チューニング](https://qiita.com/ymatsukawa/items/1f75f2fffa6308a37d54#5-rdbms-%E3%81%AE%E8%A8%AD%E5%AE%9A%E5%80%A4%E3%83%81%E3%83%A5%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0)**
* **[6. 負荷分散 - レプリケーション](https://qiita.com/ymatsukawa/items/1f75f2fffa6308a37d54#6-%E8%B2%A0%E8%8D%B7%E5%88%86%E6%95%A3---%E3%83%AC%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3)**
* **[ex. 定期バックアップ](https://qiita.com/ymatsukawa/items/1f75f2fffa6308a37d54#ex-%E5%AE%9A%E6%9C%9F%E3%83%90%E3%83%83%E3%82%AF%E3%82%A2%E3%83%83%E3%83%97)**

## 1. スロークエリのログ出力

**一定時間以上かかるクエリを記録する基本手法。これがないと始まらない**

* RDBMS の設定からスロークエリログ出力を有効化
  * 同時に閾値(秒数)を設定
* ログファイルの保存先とローテーションを設定し、定期的に分析
* ( 予算があれば商用監視ツールを導入し、スロークエリを自動検出してもよい )

## 2. インデックス対策

**検索の高速化、更新速度の低下防止をする**

スロークエリを分析して見つける

インデックスが有効なのかは、実行計画で確認する

* 検索の高速化
  * 使用頻度が高い検索条件に単一インデックス(もしくは複合インデックス)を追加
* 更新速度の低下防止
  * 不要なインデックスの削除( インデックスショットガン対策 )

## 3. N+1 問題の対策

**アプリケーション層の「発行クエリ数」を削減する**

ミドルウェア(アプリケーション)ログの分析が必要

同じようなログが何度も出ている箇所を探す

よくある対策例：

* ループ処理内で ORM 発行をやめる
* join 等を用いて一括データ取得
  * ただし、過剰 join は逆効果なのでやめる
* ORM のキャッシュ機能利用
  * いわゆる eager loading やオブジェクトキャッシュなど



## 4. 負荷テスト実施

**本番環境に近いテスト環境で DB に負荷をかける**

テスト結果から「現行 DB のパフォーマンス率・限界値など」を把握・分析し、改善する

* データは、実パターンを模したものにする
* ミドルウェアへのリクエストは、大量にかつシナリオベースで模擬化する
  * オープンソースは [Apache JMeter](https://jmeter.apache.org/) が有名


## 5. RDBMS の設定値チューニング

**デフォルト設定のまま運用せずに**、最大接続数・キャッシュサイズなどの設定を

システムの特性に合わせて最適化する

## 6. 負荷分散 - レプリケーション

**マスター・スレーブ構成**を導入し、読取負荷を分散させ安定性を向上させる

基本対策に書いたが、

* 管理量増大(単一DBではなくなる為)
* レプリケーション遅延問題(詳細は割愛)

など厄介な面がある。これ以外の対策が済んで、どうしても、という場合に考慮したい

## ex. 定期バックアップ

どれだけ予防をしても、障害は発生し得る

ストレージ・予算が許す範囲で定期的にバックアップを取る

単発バックアップではなく、ローテーション設定で逐次とれるようにする
【初学者向け】AWS認定 SAAの問題集Webサイト一覧

## 趣旨
AWS認定試験を頑張って全て取得しましたが、社内の後輩向けにAWSの学習方法をまとめてほしいと上長から言われて、まとめました。

## 初学者向け学習サイトの選択
初学者がAWS CLFやSAAを勉強する際、学習サイトを選定する段階で時間が結構かかります。多くのサイトでは無料部分があるので、悩む時間がもったいないので、実際に数問試してみましょう。また後輩からの意見も併せて簡単にポイントをまとめました。
※お薦めの書籍は別の記事でまとめます。

:::note info
AWS初学者は「設問の出題方法」、「選択肢の解説のわかりやすさ」、「学習範囲」を選ぶことをお薦めします。
:::

* 出題方法
出題範囲がランダムなサイトはどの分野から何を問われているか理解するの時間を要する為、初学者にはあまりお勧めできません。体系的に分野が分かれているサイトをお薦めします。

* 選択肢の解説
正解の解説しかないサイトだと間違った時になぜ間違ったかわからない為、不正解の解説も欲しいです。また自分の場合、解説が長すぎるサイトは、解説を読まなくなったので、適度な解説量がお薦めです。

* 学習範囲
今後のことも考えて全ての試験（12試験）を網羅しているサイトが良いかなと思ったが、短期間でAll Certを狙わない限りは、Udemyや全分野を網羅していないサイトでも良いかと思います。。


## AWS認定 問題集サイト一覧
今後、社内でAWS認定試験を受ける後輩の為に、問題集のWebサイトの所感をまとめてほしいと言われたので作成。受験時に活用したサイトと、受験後に学習サイトを見返し、作成しました。

|学習サイト|所感|金額|
|-----|-----|-----|
|[Cloud資格学習](https://cloud-certification.com/) |試験概要に沿って体系的に出題されているでわかりやすい。CLFとSAAのみだが、まずはAWS認定試験を受けてみようという方にはお薦め。1ヵ月コースがあるので、試しに受けてみてもよいかと思います。|990円/1ヵ月|
|[CloudLicense](https://cloud-license.com/) |問題数が非常に多いが体系的な出題ではなく、ランダムに出題される。初学者ではなく、ある程度AWSの試験問題が解ける人に良いかしれません。|4,980円/3ヵ月|
|[Udemy](https://www.udemy.com/courses/search/?src=ukw&q=AWS+SAA)|ハンズオンと問題集がセットになっているものが多く、じっくり学習したい方にはおすすめ|1,600円程度（セール時）|
|[Youtube（サーバーワークス 公式チャンネル）](https://www.youtube.com/c/serverworksjp)|サンプル問題の解説。設問によっては間違って回答することもあるのですが、その後なぜ間違ったのかの解説があるので、非常に勉強になりました。|無料|

## 試験勉強中に心が折れそうになる
AWSの構築経験がある人は問題ないかと思いますが、AWS未経験で勉強をすると最初はわからな過ぎて心が折れそうなった後輩もいました。そこで、後輩たちの意見も簡単にまとめました。

:::note info
問題集だけ解くと、暗記になってしまうので、ハンズオンや実際の画面を動画等でみることをお薦めします。
:::

* AWS環境でEC2を構築
AWSでVPCとサブネットを作成して、EC2を立ち上げて、SG、ACLの設定をした方が学習の飲みこみ度が全然違います

* AWSアカウントを作成できない方はAWS公式のSkill Builderの[Cloud Quest](https://aws.amazon.com/jp/training/digital/aws-cloud-quest/)を10時間程度やってみましょう
Skill Builderは無料で、AWS環境を試すことができるので非常に勉強になりました。S3にWebサイト構築や実際にEC2を立ち上げたりできて、試験で問われていることがわかるようになりました

* YouTube動画等の活用
Skill Builderも難しい人は、YouTube動画等のハンズオン動画を見てみるだけでも理解度が違います

## 最後に
AWSの経験が全くない段階で試験問題集と解くことが悪いとは思いませんが、知識と実際の操作が結びつかずに学習しても数ヵ月後には忘れてしまい、勉強が無駄になることもあります。

皆様が試験を通して一つでも多くの知識を得ることを祈っています。
git branch -vをしたらの'error: non-monotonic index .git/~~'というエラーが出た

### 解決方法：
non-monotonic indexで報告されるファイルを削除してから、`git gc`をしたところ治った

### 経緯：
Nvim起動時、cder.vimの読み込みでエラーがでるなーと思ったらHDDの障害でフォルダが読み込めなくなっていた
それ自体はドライブのエラーチェックをしたら治ったけど、今度はcder.vimフォルダに入ってgit branch -vをするとこんなエラーが出るようになった
```
[⌚22:30:51.668]❯ git branch -v
error: non-monotonic index .git/objects/pack/pack-f8b0eee9aaef4afd78b71d965c20d911ee08dc39.idx
error: non-monotonic index .git/objects/pack/pack-f8b0eee9aaef4afd78b71d965c20d911ee08dc39.idx 
error: non-monotonic index .git/objects/pack/pack-f8b0eee9aaef4afd78b71d965c20d911ee08dc39.idx 
* support_windows 63c2d77 Support windows draft 1
```

ぐぐるとstackoverflowに同じ症例と直し方を発見、試すことにした
参考サイト：[git extensions - Git error "non-monotonic index" - Stack Overflow](https://stackoverflow.com/questions/11597738/git-error-non-monotonic-index)

HDDが変なのか、コマンドラインから削除できない。エクスプローラーからはできた。その後も`git index-pack`もできない。けど`git gc`はでき、これで`git branch -v`もできるようになった。

```
[⌚22:31:00.545]❯ rm .git\objects\pack\pack-f8b0eee9aaef4afd78b71d965c20d911ee08dc39.idx       
Error: nu::shell::remove_not_possible

  × Remove not possible
   ╭─[entry #2:1:4]
 1 │ rm .git\objects\pack\pack-f8b0eee9aaef4afd78b71d965c20d911ee08dc39.idx
   ·    ─────────────────────────────────┬─────────────────────────────────
   ·                                     ╰── Could not delete D:\Users\masaaki\scoop\apps\nvim-data\lazy\cder.nvim\.git\objects\pack\pack-f8b0eee9aaef4afd78b71d965c20d911ee08dc39.idx: アクセスが拒否されました。 (os error 5)
   ╰────

（ここでエクスプローラーからファイルを削除した）

cder.nvim on  support_windows +0/-0 ✅ via 🌙 v5.4.2 
[⌚22:35:56.807]❯ git index-pack .git\objects\pack\pack-f8b0eee9aaef4afd78b71d965c20d911ee08dc39.pack
fatal: pack signature mismatch

cder.nvim on  support_windows +0/-0 ✅ via 🌙 v5.4.2 
[⌚22:38:35.027]❯ git gc
Enumerating objects: 87, done.
Counting objects: 100% (87/87), done.
Delta compression using up to 12 threads
Compressing objects: 100% (45/45), done.
Writing objects: 100% (87/87), done.
Total 87 (delta 0), reused 87 (delta 0), pack-reused 0 (from 0)
                                                                                                                               took 736ms 
cder.nvim on  support_windows +0/-0 ✅ via 🌙 v5.4.2 
[⌚22:40:57.111]❯ git branch -v
* support_windows 63c2d77 Support windows draft 1

```

解決してよかった！
android studioのstringResourceで頭に空白を入れる方法

# 初めに
今回はandroid実装でStringResourceを使う際、頭に空白を有効にする方法を紹介します
### 本文
定義したい文言の頭に下記を追加することで半角の空白を追加することができます
\u0020
### さいごに
今回は自分が実装していて少し手間取ったので備忘録として残しておきます