OmniAICreator/Qiita-1.07M huggingface dataset:
Oracle Database Vaultの機能は？

Oracle Database Vaultは、データベースのセキュリティを強化するためのオプション機能で、データベースのアクセス制御や監査機能を提供し、内部および外部の脅威からデータを保護します。主な機能は以下の通りです。

**1. リアルタイムアクセス制御ポリシー**
Oracle Database Vaultは、データベース内での操作に対してリアルタイムのアクセス制御ポリシーを設定できます。これにより、特定のユーザーやロールに対する操作を厳しく制限することができます。例として、管理者でも特定のデータにアクセスできないようにすることが可能です。

**2. 多層防御（Separation of Duties）**
管理者権限を持つユーザー（例: DBA）が、データベースの操作やデータへのアクセスを不正に行わないように、役割の分離を徹底します。DBAがシステムを管理する一方で、データアクセスは他のユーザーに限定されるなど、役割ごとの明確な権限分離が可能です。

**3. 制限されたデータアクセス**
特定のアプリケーションやユーザーがアクセスできるデータベースオブジェクト（テーブル、ビュー、スキーマなど）を制限できます。ポリシーを作成して、データベース内の特定のデータに対するアクセスを制御し、不要なアクセスを防ぎます。

**4. コマンドルールの設定**
特定のSQLコマンドや操作に対して、実行条件を設定できます。たとえば、特定の時間帯やユーザーに限定してSQL文を実行できるようにするなど、細かい制御が可能です。

**5. 監査とレポート機能**
Database Vaultは、データベース内の操作やアクセスに関する詳細な監査を提供し、違反や異常な動作を検知・記録します。また、セキュリティポリシーに基づいた監査レポートを生成し、内部監査やコンプライアンスの要件を満たすための証拠を提供します。

**6. アプリケーションの透過性**
Oracle Database Vaultは既存のアプリケーションに影響を与えることなく導入できます。アプリケーション側に変更を加えることなく、データベースレベルでのセキュリティを強化することが可能です。

**7. ファクタ認証**
特定のファクタ（例: IPアドレス、デバイス、時間帯など）に基づいたポリシーを設定し、これに従ったアクセス制御を行います。たとえば、特定の場所からのみアクセスを許可する、特定の時間帯のみデータベースに接続可能にするなどが可能です。

**8. 安全なデータ分離**
同一のデータベース内においても、複数の部門やユーザーに対してデータアクセスを厳密に分離し、特定のデータにしかアクセスできないように制御します。

これらの機能により、Oracle Database Vaultはデータベースセキュリティの強化に重要な役割を果たし、特に規制コンプライアンスや内部不正防止に効果的です。
開発環境でのHTTPSリダイレクト問題のトラブルシューティングに関する備忘録

### 概要

開発環境でHTTPからHTTPSへのリダイレクトが自動的に行われる問題に直面した際のトラブルシューティングについてまとめます。この問題は、OSのアップデート後に発生し、ローカル環境での開発が一時的に中断されました。問題の原因と解決方法について、備忘録として記録します。

### 1. 問題の概要

ある日、開発環境で`http://`でアクセスしていたローカルサイトが、自動的に`https://`にリダイレクトされるようになりました。以前は問題なく`http://`でアクセスできていたため、突然の変化に驚きました。以下の状況が確認されました：

- ローカル環境でのみ発生している。
- 本番環境では正常に動作している。
- `ForceHttps`や`TrustProxies`といったミドルウェアは本番環境用に設定済みであるが、ローカル環境には影響を与えないはずだった。

### 2. 原因の特定

問題の原因を特定するために、以下の点を確認しました。

- **OSのアップデート**
    
    OSのアップデートが原因で、開発環境の設定が変更された可能性があることを疑いました。特に、OSのファイアウォールやネットワーク設定が影響している可能性があります。
    
- **キャッシュの影響**
    
    ブラウザやLaravelのキャッシュが影響している可能性も考慮しました。キャッシュが残っていると、リダイレクトが意図せずに発生することがあります。
    

### 3. 解決方法

問題を解決するために、以下の手順を実施しました。

### (1) Laravelのキャッシュクリア

まず、Laravelのキャッシュをクリアしました。これにより、古い設定やキャッシュされたデータが原因で発生しているリダイレクトを防ぎます。

```bash
php artisan config:clear
php artisan cache:clear
php artisan view:clear
php artisan route:clear

```

- **備忘ポイント**
キャッシュクリアのコマンドを実行することで、設定の変更が即座に反映されるようになります。特に、`config:clear`コマンドは、ローカルの環境で設定が誤ってリダイレクトを引き起こしている場合に有効です。

### (2) ブラウザのキャッシュをクリア

次に、ブラウザのキャッシュをクリアしました。ブラウザキャッシュが古いリダイレクト設定を保持していると、これが問題の原因になることがあります。

- **備忘ポイント**
ブラウザのキャッシュは、しばしば開発者が見落としがちな部分です。特にHTTPSへのリダイレクトに関する設定は、キャッシュが影響を及ぼすことが多いです。

### (3) `.env` ファイルの確認

`APP_ENV`や`APP_URL`の設定が正しいかどうかを確認しました。開発環境用の設定が誤っていると、意図しないリダイレクトが発生することがあります。

```
APP_ENV=local
APP_URL=http://localhost

```

- **備忘ポイント**`.env`ファイルの設定は、環境に応じて正確に行う必要があります。特に`APP_URL`は、ローカル開発環境では`http://`を使用するように設定します。

### 4. トラブルシューティングの結果

上記の手順をすべて実行した結果、ローカル環境でのHTTPSリダイレクト問題は解消されました。問題は、Laravelのキャッシュとブラウザのキャッシュが古い設定を保持していたことが原因であったと考えられます。

### 5. 今後の改善点

- **設定変更時のキャッシュクリアの徹底**
    
    開発環境での設定変更後には、キャッシュクリアを徹底することで、同様の問題を未然に防ぎます。
    
- **HTTPSリダイレクトの制御を明確にする**
    
    `ForceHttps`や`TrustProxies`などのミドルウェアの使用方法を明確にし、必要な環境でのみ有効になるように設定を見直すことを検討します。
    

### 結論

今回のトラブルシューティングを通じて、開発環境での設定変更が原因で予期しない動作が発生することがわかりました。キャッシュの影響を考慮し、設定変更時にはキャッシュのクリアを忘れずに行うことが重要です。今後も開発環境の安定性を確保するための手順を備忘録として残しておきます。
【AWS】SOA合格体験記

## はじめに

先日AWS-SOAの資格を取得しました。
https://aws.amazon.com/jp/certification/certified-sysops-admin-associate/

実際に私が勉強に使った教材やよく出てくると感じたサービスを備忘録としてまとめたいと思います。
これから試験を受験する方のご参考になれば嬉しいです。

## 受験前のステータス
・AWS-CLF、AWS-SOA取得済み(1年ほど前に取得)
・実際の構築・作業の経験はなし

## 学習方法
#### :books:利用した教材
[【SOA-C02対応】AWS認定 SysOpsアドミニストレーター アソシエイト 模擬問題集＋詳解 【2024年版】](https://www.udemy.com/course/soa-c02aws-sysops-2024/)

:::note warn
コースを検索してみたら以下の表記があったため、
現在はコース登録不可の可能性があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3741170/91614fc7-a2d1-0138-e6cd-320f71d8ec8a.png)
:::
内容は65問×5セットと90問×１セットの計415問です。
私は全てを4～5周解いていました。
1回目の正答率は50～60％ほどしか取れていませんでしたが、
5周もすると85～95％くらいの正答率になりました。
本番はこの問題集と同じような問いが体感で60％くらいあったように感じます。

#### :computer:[AWS Brackbelt](https://aws.amazon.com/jp/events/aws-event-resource/archive/?cards.sort-by=item.additionalFields.SortOrder&cards.sort-order=asc&awsf.tech-category=*all&cards.q=Storage&cards.q_operator=AND)
問題を解く中でいまいちイメージが掴みづらいものについてはここからAWS公式のサービス資料を見て概要を掴んでいました。
一部資料は古い情報も記載されているので注意です。
利用できるAWS環境があれば[ハンズオン](https://aws.amazon.com/jp/events/aws-event-resource/hands-on/)などで実際にサービスを触ってみてもいいかもしれません。

#### :pencil2:学習時間
平日1～2時間程度
通勤時間を使って勉強をしていました。
職場まで片道1時間以上かかるため、
通勤時に問題回答、帰宅時に正誤確認・間違えた部分の確認をしました。
ただ、家では思いっきりだらけたいため(笑)休日や帰宅後は勉強していません。

#### :calendar_spiral:学習期間
途中で1～2か月ほど勉強を放置してしまっていたのでトータル4か月、実質2か月ほど勉強しました。
SOAで問われるような運用管理に携わった経験のある方ならもっとスムーズに進められると思います！

## 試験結果と感想
結果は1000点満点中829点でした。
合格は720点以上のため、まずまずといったところでしょうか。
問題集と同じような問題が多かったこともあり、当日は落ち着いて受験ができました。
個人的に問題集含めよく問題で見かけたなと思うものは以下です。
* DNS関連
* Cloudformation
* CloudWatch
* SystemsManager(RunCommand)
* S3(オブジェクトロック等のデータ保護やストレージクラス)
* Organization(一元管理の手法)

もちろんその他のサービスも出ますし、ログやコマンドの問題も少し見かけた記憶があります。(記憶が曖昧で申し訳ありません:disappointed_relieved:)
個人的にはイメージが難しいサービはハンズオンをしてみたり、
公式のサービス別動画を見てみたりするのをお勧めします！
AWS Elastic BeanstalkでPythonアプリをデプロイしてみた

# この記事は何？
#### 初学者向けにElastic Beanstalkでデプロイする方法を共有します！
SEにカテゴリーされる仕事を雰囲気でこなしている私が興味でwebアプリ制作からデプロイまで実施し、一番苦労したデプロイ方法を共有します。
デプロイしたサイト：https://sushi1000yen.click/
# Elastic Beanstalk?
#### AWS提供の楽なデプロイ方法
とりあえずローカルで動くプログラムを作れたら、あとはAWSがなんとかしてwebに公開してくれます。
VMやストレージはもちろんIAMロールとかセキュリティ設定とかもやってくれます。（よくわからないけどすごい！）
# では、やっていきます！
### まずは作ったプログラムをzipファイルにします
ここで注意ですが親ディレクトリを含めてはだめです。ファイルのみをzip化しましょう。
こんな感じでzipファイルを開いたら各ファイルがある階層ならOKです！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/602332/0e700333-59ea-e740-0d1c-587c9685aead.png)
### awsでデプロイ権限を作ります
「aws-elasticbeanstalk-ec2-role」という名前で以下のポリシーを持つIAMロールを作りましょう。
・AWSElasticBeanstalkWebTier
・AWSElasticBeanstalkWorkerTier
・AWSElasticBeanstalkMulticontainerDocker
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/602332/c93c5b9d-aa5a-5d8a-cfa8-194dc8160ee2.png)
昔は自動で作られていたらしいですが今は手動らしいです。。（ここで数時間詰まった。。）
参考：https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/concepts-roles-instance.html
### ここまで来たらついにデプロイ！
Elastic Beanstalkの画面に移動して「環境を作成」に進みます。
基本的にはデフォルトの設定で入力項目は以下の通り！
・アプリケーション：好きなお名前
・環境名：好きなお名前
・プラットフォーム：使ったプログラム名とバージョンを選択。
・アプリケーションコード：画像参考にzipファイルを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/602332/481e99f6-b9f1-309b-1784-0300671c8823.png)
ここまで入力したら「次へ」に進みます。
ロールを選ぶ画面で作ったロールをしっかり選んであげましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/602332/d957dad4-25db-198a-ad33-11c1b13694fd.png)
あとは基本デフォルトで進めて作成に進みます！
### デプロイどうでしょうか？
何分か待つと完了するはずです。ヘルスの状態が「ok」になっており、ドメインにアクセスできれば成功です。おめでとうございます！！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/602332/9ebc7b05-d453-42ee-6573-29cc05ed8e35.png)
### エラーが出てしまった方へ
大丈夫です。AWSは解決策も提示してくれます。
まずはログ画面に進み、「リクエストログ」から「フル」を選択しエラーログを取得しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/602332/2ba10cc2-977a-767d-47e8-b6fefab4b782.png)
ダウンロードしましたら色々ファイルがあると思いますが、ver → log → eb-engineに進みエラー内容を見ます。詳しい方はたぶんこちらで解決できます。
私と同様に知識のない方は、ログ内容をすべてchatGPTに投げましょう。その際に作ったコード内容とディレクトリ構造なども同時に伝えてあげましょう。
何度かGPT → 修正 →　デプロイの流れを繰り返すと成功すると思います。（解決しない場合は他のエラーログも見てみましょう。）
# まとめ
デプロイ出来ましたでしょうか？
AWSでのデプロイを考えたときに色々調べましたがコマンドラインでの実装が多く、知識のない私には難しかったので同じような方の助けになればと思い始めて投稿しました。少しでも参考になればうれしいです。
### 以降、Elastic Beanstalk以外の私用のまとめになります
1. この取り組みについて
友達と何か作ってみたいとなり、1週間に1度15分ほどの成果報告会を開き数か月かけて完成させました。
2. 開発環境とツール
利用技術
フロントエンド: HTML, CSS, JavaScript
バックエンド: Python (Flask)
デプロイ: AWS Elastic Beanstal
ドメイン管理: AWS Route 53
その他: チャットGPTを活用しながら進行
3. デプロイ手順
ローカルでアプリの作成
→ほとんどGPTです。
Elastic Beanstalkでのデプロイ
4. HTTPS対応
Route 53でドメインを購入
SSL証明書の取得と適用
5. 振り返り
お互い非エンジニアながら時代の進化（GPTやAWS Elastic Beanstalk）に助けられ何とかデプロイまで達成出来ました。
今更ですが、1000円以内で寿司ネタを選んでくれるというサイトを作りました。
1年間はドメインを購入しておりwebに公開しているのでぜひ一度試してもらえたらうれしいです。（ネタが更新されないなど問題だらけですが、、（笑））

URL:https://sushi1000yen.click/

ここまで、読んでくださりありがとうございます！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/602332/b2389ea1-7c0f-6874-b12f-5597094b8291.png)
Laravelでの開発におけるLivewireの利点と、使用しない場合の比較に関する備忘録

### 概要

Laravelでの開発において、フロントエンドとバックエンドを統合し、効率的にリアルタイムなユーザーインターフェースを提供するためにLivewireを使用することが増えています。この記事では、Livewireを使用しない場合の一般的な手法との比較を通して、Livewireの利点と課題について備忘録としてまとめます。

### 1. Livewireを使わない場合の一般的な開発手法

Livewireを使用しない場合、通常、フロントエンドフレームワーク（例えば、Vue.jsやReactなど）を使って、非同期リクエスト（Ajax）を通じてバックエンドと通信する手法が用いられます。この方法は、高度にインタラクティブなWebアプリケーションの構築に適していますが、いくつかの課題があります。

### (1) 追加のフレームワークやライブラリの学習が必要

JavaScriptフレームワークを使うためには、それらの基本的な使い方や設定を学ぶ必要があります。例えば、Vue.jsやReactを導入すると、それぞれのフレームワーク固有のライフサイクル、状態管理、コンポーネントの使い方などを理解する必要があります。

- **利点**: フレームワークを習得すれば、高度にカスタマイズされたインターフェースやリアクティブな機能を実装できます。
- **課題**: 特にフルスタックの開発者でない場合、これらの追加学習は負担となり、開発速度が遅くなる可能性があります。また、JavaScriptの深い理解が必要です。

### (2) フロントエンドとバックエンドのコードが分離される

フロントエンド（JavaScript）とバックエンド（PHP/Laravel）のコードが別々の場所で管理されるため、開発者はそれぞれの部分で行う変更が、他方にどう影響するかを常に考慮しなければなりません。

- **利点**: フロントエンドとバックエンドの責任が明確に分離されるため、大規模なチームでの分業がしやすくなります。
- **課題**: フロントエンドとバックエンド間のデータ連携が複雑になり、APIの設計やエラーハンドリングのためのコードが増えることがあります。また、両者の間でインターフェースを維持するためのプロトコルを常に更新・管理する必要があります。

### (3) 非同期通信の管理が必要

非同期リクエスト（Ajax）を使ってバックエンドと通信する必要があるため、エラーハンドリングや状態管理など、フロントエンドでの追加の管理が必要です。

- **利点**: 非同期通信により、ユーザーインターフェースが滑らかでレスポンシブになります。
- **課題**: 非同期処理は管理が複雑になり、特にネットワーク遅延やサーバーエラーが発生した際に、フロントエンドでの対応が必要です。JavaScriptでの状態管理やエラーハンドリングが追加の労力となります。

### 2. Livewireを使用することで得られる利点

Livewireを使うことで、これらの課題を解消し、フロントエンドとバックエンドのコードを統合してシンプルに保つことができます。以下にLivewireの利点を挙げます。

### (1) 統合された開発環境

Livewireを使用すると、Bladeテンプレート内でPHPとJavaScriptの機能を組み合わせて使用できます。これにより、フロントエンドとバックエンドのロジックを統一されたコードベースで管理でき、開発効率が向上します。

- **例**: BladeテンプレートでのLivewireコンポーネントは、ページのリロードなしでリアルタイムにデータを反映し、PHPの変数やメソッドを直接使用してデータ操作が可能です。

### (2) シンプルなリアルタイムUIの実装

Livewireは、Bladeテンプレート内でのリアクティブなUIをサポートし、データ更新のためにページ全体をリロードする必要がありません。これにより、JavaScriptフレームワークを使わずにリアルタイムなユーザーインターフェースを構築できます。

- **利点**: 非同期通信やフロントエンドフレームワークの複雑さを回避し、Laravelの中でシンプルにリアルタイムUIを実装できます。

### (3) 開発者の学習負担を軽減

Livewireを使うことで、追加のJavaScriptフレームワークを学ぶ必要がなくなり、PHPとBladeテンプレートの知識だけで、フロントエンドとバックエンドの連携を実現できます。

- **利点**: フルスタック開発者やPHPに特化した開発者にとって、フロントエンドの学習コストを大幅に削減できます。

### 3. 結論: Livewireを選択するメリット

Livewireは、Laravelを使った開発において、フロントエンドとバックエンドをシームレスに統合し、リアルタイムなインターフェースをシンプルに実装するための強力なツールです。追加のJavaScriptフレームワークを学ぶ必要がないため、学習コストが低く、特に小規模なチームやPHPに特化した開発者にとって大きなメリットがあります。もちろん、より高度なインターフェースを実現するためにはJavaScriptフレームワークを選ぶことも一つの手ですが、Livewireの使用によって開発の効率化とシンプルさを維持できることは大きな利点です。
Comprehensive Guide to WPC Certification and Licensing


 Discover everything you need to know about WPC certification on our detailed guide. 
 Learn about the WPC license, WPC certificate for import, and WPC ETA certificate in India. 
 Explore the WPC certification process, requirements, and how to apply for WPC certification. Find out how to get a WPC certificate, understand the full form of WPC certificate, and get insights into WPC ETA approval.
 Whether you need a WPC license for import or are looking for an ETA certificate for wireless devices, our guide covers all aspects of WPC ETA certification and licensing. 
 https://absoluteveritas.com/WPC-Certification/
axumで単一パラメータのQueryパースに失敗する

axumをつかっていてクエリパラメータがなんか取れないな？ってことがあったので備忘録

# 現象

以下のような関数をapi呼び出しした際、Queryの取得に失敗してました
**Query\<Uuid\>** が受け取れずエラーになってました

```rust
asyn fn get_user(Query(user_id): Query<Uuid>) -> Result<User, String> {
    // ...
}
```

# 原因と対策

原因としてはQuery<Uuid>のような型宣言では単一パラメータのパースはできませんでした
以下のように構造体内にパラメータのフィールドを宣言する必要があるようです

```rust
#[derive(Serialize)]
pub struct GetUser {
    user_id: Uuid;
}
```

もしかすると`i32`などのプリミティブな型だとパースできるのかもしれませんが参考までに！
Laravelでのエラーハンドリングとメッセージ表示方法に関する備忘録

### 概要
Laravelを使用してアプリケーションを開発する際、エラーハンドリングとユーザー向けメッセージの表示は非常に重要です。ここでは、実際に私が写真アップロード機能を実装した際に試したエラーハンドリングとメッセージ表示の2つの方法について、備忘録としてまとめます。

### 1. バリデーションの実装
アップロードされたファイルやフォーム入力のバリデーションをLivewireコンポーネントで実装しました。

```php
public function save()
{
    $this->validate([
        'photo' => 'required|image|max:10240', // 最大10MBの画像
        'site_id' => 'required|exists:sites,id',
        'part' => 'required|in:選択1,選択2,選択3',
        'photo_date' => 'required|date',
    ]);

    // 省略: 画像のリサイズと保存処理
    session()->flash('message', '写真がアップロードされました。');
    $this->reset(['photo', 'site_id', 'part', 'photo_date']);
}
```

**ポイント:** `validate()` メソッドを使用して、ユーザーの入力が正しいかをチェックしています。バリデーションエラーが発生した場合、自動的にエラーメッセージが表示されます。

### 2. 成功メッセージの表示方法

**パターン1: 閉じるボタン付きのメッセージ**

保存処理が成功した場合、ユーザーに通知するためのメッセージを表示するようにしました。メッセージには閉じるボタンを追加しています。

```blade
@if (session()->has('message'))
    <div class="alert alert-success alert-dismissible fade show" role="alert">
        {{ session('message') }}
        <button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
    </div>
@endif
```

**備忘ポイント:** `session()->flash()` を使って、一時的なメッセージを設定し、Bladeテンプレート内で表示します。Bootstrapの `alert-dismissible` クラスを使うことで、メッセージに「閉じる」ボタンを追加し、ユーザーが自身のタイミングでメッセージを閉じることができます。

**パターン2: 入力フォームの下にエラーメッセージを表示**

エラーメッセージをユーザーが入力したフォームの下に直接表示することで、どのフィールドに問題があったかを明示します。

```blade
<input type="text" name="photo_date" class="form-control" />
@error('photo_date')
    <small class="text-danger">{{ $message }}</small>
@enderror
```

**備忘ポイント:** エラーメッセージを特定の入力フィールドの下に表示することで、ユーザーがエラーの原因をすぐに理解できるようにしています。`@error` ディレクティブを使用すると、特定のフィールドに関連するエラーメッセージを簡単に表示できます。

### 3. 実装時の工夫点

- **パターン1: ユーザーの操作性を考慮**
  - 閉じるボタンを設置することで、ユーザーがメッセージの表示を自身で制御できるようにしました。これにより、重要な情報を見逃さないようにできます。

- **パターン2: エラーメッセージの明確な表示**
  - エラーの発生箇所が具体的に分かるようにすることで、ユーザーが修正すべきフィールドを迅速に特定できるようにしています。

### 結論
エラーハンドリングとメッセージ表示の方法には様々なパターンがあります。今回は、ユーザーの利便性を考慮して、閉じるボタン付きメッセージと入力フォームの下にエラーメッセージを表示する2つのパターンを試してみました。いずれの方法も、それぞれのシチュエーションで効果的です。備忘録として記録しておき、今後の開発に役立てていきます。
Go | データ変換から見るsamber/loのチートシート 


この記事は 下記の観点による個人的な[samber/lo](https://github.com/samber/lo)のチートシートになります。

- `A → B` というデータ変換の観点で整理
- 個人的によく使うヘルパーだけに絞ってる
- 別パッケージで同一のものがあればまとめる


## 背景

Go Way では愚直に for文を回すことが美徳とされるが、モダン言語経験者からすると高階関数やヘルパーが欲しくなることが多いと思う（個人的感想）。

built-inでもヘルパーが増えてきているが機能的にまだまだ足りていないし、意図的に弾かれてしまってるものもある。

- [samber/lo](https://github.com/samber/lo)
- [x/exp/slices](https://pkg.go.dev/golang.org/x/exp/slices)
- [x/exp/maps](https://pkg.go.dev/maps)

それなら、じゃあ [samber/lo](https://github.com/samber/lo) を使おうと思うわけなのだが機能が微妙に多いわりに、整理の区分が個人的にわかりにくいと感じていた。そのため、自分用にチートシートをまとめた。

## `from slice`

- `slice` to `slice`
  - [lo:Filter](https://github.com/samber/lo#filter) / [lo:Reject](https://github.com/samber/lo?tab=readme-ov-file#reject) ( [slices:DeleteFunc](https://pkg.go.dev/slices#DeleteFunc))  / [lo:FilterReject](https://github.com/samber/lo?tab=readme-ov-file#filterreject)
  - [lo:Map](https://github.com/samber/lo#map)
  - [lo:UniqBy](https://github.com/samber/lo#uniqby)
  - [lo:Flatten](https://github.com/samber/lo#flatten) (`[][]T → []T`)
  - [lo:FilterMap](https://github.com/samber/lo?tab=readme-ov-file#filtermap)
  - [lo:FlatMap](https://github.com/samber/lo?tab=readme-ov-file#flatmap) (`[]T → [][]T → []T`)

- `slice` to `struct`
  - [lo:Find](https://github.com/samber/lo?tab=readme-ov-file#find)

- `slice` to `map`
  - [lo:KeyBy](https://github.com/samber/lo?tab=readme-ov-file#keyby)
  - [lo:GroupBy](https://github.com/samber/lo#groupby)
  - [lo:Associate / SliceToMap](https://github.com/samber/lo?tab=readme-ov-file#associate-alias-slicetomap)

- `slice` to `bool`
  - [lo:EveryBy](https://github.com/samber/lo?tab=readme-ov-file#everyby) ([slices:EqualFunc](https://pkg.go.dev/slices#EqualFunc))
  - [lo:SomeBy](https://github.com/samber/lo?tab=readme-ov-file#someby) ([slices:ContainsFunc](https://pkg.go.dev/slices#ContainsFunc))
- `slice` to `any`
  - [lo:Reduce](https://github.com/samber/lo?tab=readme-ov-file#reduce) （Go Way から離れすぎることが多いので使う時は注意）



## `from map`

- `map` to `map`
  - [lo:PickBy ](https://github.com/samber/lo?tab=readme-ov-file#pickby)/ [lo:OmitBy](https://github.com/samber/lo?tab=readme-ov-file#omitby) ([maps:DeleteFunc](https://pkg.go.dev/maps#DeleteFunc))
  - [lo:PickByKeys](https://github.com/samber/lo?tab=readme-ov-file#pickbykeys) / [lo:OmitByKeys](https://github.com/samber/lo?tab=readme-ov-file#omitbykeys)
- `map` to `slice`
  - [lo:Keys](https://github.com/samber/lo?tab=readme-ov-file#keys)
  - [lo:Values](https://github.com/samber/lo?tab=readme-ov-file#values)
  - [lo:MapToSlice](https://github.com/samber/lo?tab=readme-ov-file#maptoslice)



## `ptr` helper

  - [lo:ToPtr](https://github.com/samber/lo?tab=readme-ov-file#toptr)
  - [lo:ToSlicePtr](https://github.com/samber/lo?tab=readme-ov-file#tosliceptr)

  - [lo:FromPtr](https://github.com/samber/lo?tab=readme-ov-file#fromptr)

  - [lo:FromSlicePtr](https://github.com/samber/lo?tab=readme-ov-file#fromsliceptr)


## Appendix
- `slice + slice` to `slice + slice`

  - [lo:DifferenceBy](https://github.com/samber/lo/issues/411) / [lo:IntersectionBy](https://github.com/samber/lo/issues/411) （ロジックが複雑な時に欲しい時があるのだが、実装PRのマージ待ち）
数学２の領域における問題について

# はじめに
高校数学の数学2の領域の問題は、一般的に難しく奥が深い傾向がある。というのは、時には三角関数や相加・相乗平均、微積分といった総合力が試され、必要条件や十分条件といった論理の理解も必要だからである。そこで、今回の記事は、円の方程式を用いた不等式の問題を考え、Pythonを用いて感覚的に不等式の理解をすることを目的とする。

# 問題

$x,y$を実数とするとき、以下の命題を証明せよ。
（図を用いずに考えるとどうなるか？？）

```math
x^2+y^2<1 \Rightarrow x+y<\sqrt{2}
```
参照元は以下の通りである。

https://x.com/yoshihara_math/status/1827693850032488770

図を用いれば、線計画法や三角関数を用いた解法などが考えられると思うが今回は、不等式の式変形で証明していこうと思う。

まず、題意より
```math
0\le x^2+y^2=(x+y)^2-2xy<1
```
が成立する。$x,y$は実数なので$(x+y)^2>0$より、
```math
-\frac{1}{2}<xy<\frac{(x+y)^2}{2}
```

となる。これを満たす$x,y$は以下の3パターンしか存在しない。

(1)$x,y$のいずれかが正でいずれかが負である場合

ここでは、対称性より$x>0,y<0$の場合のみを考える。

```math
-\frac{1}{2}<xy<0
```

が成立するので、

```math
0\le x^2+y^2=(x+y)^2-2xy<1
```

から、

```math
(x+y)^2<1+2xy<1
```
したがって、

```math
-1<x+y<1
```
(2)x=0もしくはy=0のとき

x=0のときを考える。
```math
x^2+y^2<1
```
なので、$-1<y<1$が成立する。

したがって、

```math
-1<x+y<1
```

(3)$x,y>0$のとき

```math
0<y<\sqrt{1-x^2}(0<x<1)
```

は必然的に成立する。

したがって、$0<x<1$が成立しているという条件のもとで、

```math
0<x+y<x+\sqrt{1-x^2}(0<x<1)
```

が成立する。つまり、$k=x+\sqrt{1-x^2}$という正の実数$k$の最大値を求めれば$x+y$を上から不等式ではさみ込むことができる。

```math
k-x=\sqrt{1-x^2}
```

より、両辺を2乗して整理すると、

```math
f(x)=2x^2-2kx+(k^2-1)=0
```
となる。この$x$に対する二次方程式が$0<x<1$の範囲で解を持てば良い。

この場合、(a)(b)2つのパターンが考えられる。
(a)0<x<1の中に2つの解(重解を含む)が存在する
(b)0<x<1の中に1つの解が存在する


(a)についてまずは考える、

上式の二次方程式の判別式$D$は以下のように表すことができる。
```math
D/4=-k^2+2 \ge 0
```

ゆえに、


```math
-\sqrt{2}\le k\le \sqrt{2}
```

また、$f(0)=k^2-1,f(1)=(k-1)^2\ge 0$であるので、

中間値の定理より$f(0)=k^2-1\ge 0$と二次関数の軸の条件$0<\frac{k}{2}<1$を満たす必要性がある。

したがって、$1<k<\sqrt{2}$が条件を満たす領域である。

(2)について$f(0)\le 0$と$k>0より$0<k<1$となる。

したがって(1)(2)をまとめると、$0<k<\sqrt{2}$となる。


ゆえに、$x+y<\sqrt{2}$であることが分かる。


# プログラム
そこで、このことを確かめるために、以下のようなプログラムを作成した。

``` python region_circle.py
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
import japanize_matplotlib
import math

r=np.linspace(0,1,100)
theta=np.linspace(0,2*np.pi,100)

r,theta=np.meshgrid(r,theta)

x=r*np.cos(theta)
y=r*np.sin(theta)

# plt.contourf(x,y,r,cmap='jet')
# plt.colorbar()
# plt.show()
z=x+y
plt.xlabel("x")
plt.ylabel("y")
plt.contourf(x,y,z,cmap='jet')
plt.colorbar(label="z=x+y")
plt.title("領域の不等式")
plt.savefig("領域の不等式.png")
plt.show()
```

これを実行すると以下のようなグラフが出力される。

![領域の不等式.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1686019/0a87126b-66b0-704d-1b19-8272fb60bb0a.png)

# まとめ
今回は、数学2の領域と不等式の問題を解いた。この分野は論理性や微積分など自分の持っている知識をフルに活かせば様々な別解が無数に存在する面白い分野である。
またハッカソンに参加してきた

# ハッカソンに参加してきました！

## 目次

1. [ハッカソンの概要](#ハッカソンの概要)
2. [制作物](#制作物)
3. [ハッカソンを通して学んだこと](#ハッカソンを通して学んだこと)
4. [これからの課題](#これからの課題)

## ハッカソンの概要

今回、GMOインターネットグループ様のハッカソンに参加してきました。  
テーマはGMO様のConoHaのコントロールパネルの提案・改善です。  
期間は5日間で、即席チームを組んでのハッカソンでした。

## 制作物

私たちが着目したのは、ゲームサーバーをもっと手軽に立てられないかという点です。  
Googleトレンドを見ると、長期休暇中に「マルチサーバー」の検索数が上昇しており、サーバーを立てる年齢層は10代・20代が過半数を占めています。  
つまり、まだ知識の浅い学生層がゲームサーバーを立てたいと考えているのでは？と推測しました。

そこで、対話形式でサーバーを立てられるように改善しました。

**発表資料はこちら↓**  
[Googleスライドのリンク](https://docs.google.com/presentation/d/1M5BGxmbCI2KWB_qjKqDXRdW9Qugf1lDchXDHJLsKuiU/edit?usp=sharing)

## ハッカソンを通して学んだこと

今回は既存のアプリを改善するという、めったにできない貴重な経験をさせていただきました。GMO様、ありがとうございます！  
この5日間でチームメンバーとも仲良くなり、最終日には徹夜で集まって改善点を議論し合いました。  
また、他のチームとも交流し、エンジニアとしてのつながりを持つことができました。特にチーム開発の良さを実感しました。

## これからの課題

これから長期のインターンに参加するので、この経験を活かして頑張ろうと思います。  
これからも挑戦し続けます！

---

ご覧いただきありがとうございました！
history コマンドに履歴が残っていなかった


ターミナルを × ボタンで閉じた際に Linux の history コマンドに履歴が残っていなかったため、履歴が残るタイミングが知りたかった。

- historyコマンドで表示される値は `~/.bash_history` に記録される
    - `echo $HISTFILE` でファイルの場所が確認できる
- ただし、コマンドの実行直後に `~/.bash_history` に記録されるわけではなく、一時的にキャッシュに保存され、セッション終了のタイミングで書き出される
    - キャッシュからファイルに書き出されるタイミングは設定によって変更可能
    - 別タブを開いている場合は、キャッシュの履歴が共有されないためファイルに書き出すタイミングを変更することで共有することも可能
        - https://qiita.com/piroor/items/7c9380e408d07fd83bfc

各種、history に関連する設定

https://engrowth.me/tech/history/#:~:text=history%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%A7%E8%A1%A8%E7%A4%BA%E3%81%95%E3%82%8C,bash_history%20%E3%81%AB%E8%BF%BD%E8%A8%98%E3%81%95%E3%82%8C%E3%82%8B%E3%80%82
Go言語(Golang)ポインタを使うべき時と、使うべきでない時

### ポインタを使うべき時

1. **データの変更が必要な場合**:
   - 関数やメソッド内で引数のデータを変更したいとき

2. **大きなデータ構造**:
   - 大きなデータを関数に渡すときに、コピーを避けてメモリを節約したいとき

3. **共有する必要がある場合**:
   - 複数の関数やメソッドで同じデータを扱いたいとき

4. **nil チェックの必要がある場合**:
   - 値が存在しないことを示すために `nil` を使いたいとき

#### 例：データを変更する関数

```main.go
package main

import "fmt"

type User struct {
    Name string
}

func UpdateName(user *User, newName string) {
    user.Name = newName
}

func main() {
    user := User{Name: "Alice"}
    fmt.Println("Before:", user.Name)
    
    UpdateName(&user, "Bob")
    fmt.Println("After:", user.Name)
}
```

- **ポイント**: `UpdateName` 関数で `User` の `Name` を変更しています。ポインタを使うことで、元のデータを直接変更できます。

### ポインタを使うべきでない時

1. **データの変更が不要な場合**:
   - 関数やメソッドがデータを変更しないことが明確なとき

2. **安全性を重視する場合**:
   - データが誤って変更されるのを防ぎたいとき

3. **小さなデータ構造**:
   - 基本的な型や小さな構造体はコピーしてもパフォーマンスに影響が少ないため、ポインタを使わなくても良い

#### 例：データを変更しない関数

```go
package main

import "fmt"

type User struct {
    Name string
}

func PrintName(user User) {
    fmt.Println("User Name:", user.Name)
}

func main() {
    user := User{Name: "Alice"}
    PrintName(user)
}
```

- **ポイント**: `PrintName` 関数ではデータを変更しないため、ポインタを使わずに値を渡しています。データのコピーが作られますが、変更の必要がないので問題ありません

### ポインタを使うか使わないかの決定の基準

- **目的**: データを変更する必要があるか
- **サイズ**: データが大きいか小さいか
- **安全性**: データの不変性を保ちたいか
- **パフォーマンス**: メモリと速度を最適化する必要があるか
wikidata からmermaid記法で家系図を作成（ブラウザ版）

# 概要
- wikidata の Q番号（P5(ヒト)だったら）から、子孫、先祖をたどって、jsonで抽出
- ネットワークの幅優先探索(BFS)と深さ優先探索(DFS) を使って範囲を絞る
- markdownのmermaid記法を使って、家系図のようなものを表示する
- ブラウザのみで動きます

# デモページ
次のページで試してみてください。
https://wonox.github.io/pedigree/bfs_test.html

# python版
以前書いた、
[wikidataからnetoworkxをかましてmermaid記法で紫式部の系図を作成](https://qiita.com/wonox/items/f310839480e8eb7a9e01)
をjavascriptで書き直しました。
基本的なロジックは、このputhon版と同じです。

# bfsとdfs
以下をほぼそのまま使わせていただきました。ありがとうございます。
[グラフとBFS(幅優先探索)・DFS(深さ優先探索)をJSで実装してみる](https://qiita.com/oimo23/items/b5650d5a9a2d88365850)

# サンプル
いくつかサンプルを貼り付けておきます

## 紫式部
距離2、bfs
```mermaid
---
title: family tree
config:
theme: base
themeCSS:
  .node circle {fill: #FAFAFA;}
  .label text {fill: #FAFBF9 !important;} .output {font-size:60px;}
---
graph TD
  classDef class1 fill:#fff,fill-opacity:0

spouse藤原為時藤原為信の娘//藤原為時の妻/ --> 紫式部
spouse藤原雅正藤原定方の娘//藤原雅正正室/ --> 藤原為時
藤原為時 --> spouse藤原為時藤原為信の娘//藤原為時の妻/( ):::class1
藤原為信//藤原文範の子/ --> 藤原為信の娘//藤原為時の妻/
藤原雅正 --> spouse藤原雅正藤原定方の娘//藤原雅正正室/( ):::class1
藤原為信の娘//藤原為時の妻/ --> spouse藤原為時藤原為信の娘//藤原為時の妻/( ):::class1
藤原定方の娘//藤原雅正正室/ --> spouse藤原雅正藤原定方の娘//藤原雅正正室/( ):::class1
```
## 紫式部
距離2、dfs
```mermaid
---
title: family tree
config:
theme: base
themeCSS:
  .node circle {fill: #FAFAFA;}
  .label text {fill: #FAFBF9 !important;} .output {font-size:60px;}
---
graph TD
  classDef class1 fill:#fff,fill-opacity:0

spouse藤原為時藤原為信の娘//藤原為時の妻/ --> 紫式部
spouse藤原宣孝紫式部 --> 大弐三位
藤原為時 --> spouse藤原為時藤原為信の娘//藤原為時の妻/( ):::class1
藤原宣孝 --> spouse藤原宣孝紫式部( ):::class1
藤原為信の娘//藤原為時の妻/ --> spouse藤原為時藤原為信の娘//藤原為時の妻/( ):::class1
紫式部 --> spouse藤原宣孝紫式部( ):::class1
```

## エリザベス2世
距離13、bfs
```mermaid
---
title: family tree
config:
theme: base
themeCSS:
  .node circle {fill: #FAFAFA;}
  .label text {fill: #FAFBF9 !important;} .output {font-size:60px;}
---
graph TD
  classDef class1 fill:#fff,fill-opacity:0

spouseフィリップエリザベス2世 --> チャールズ3世
spouseマーク/フィリップスプリンセス/ロイヤル/アン --> ザラ/フィリップス
spouseフィリップエリザベス2世 --> アンドルー
spouseフィリップエリザベス2世 --> プリンセス/ロイヤル/アン
spouseジョージ5世メアリー/オブ/テック --> ジョージ6世
spouseクロード/ボーズ/ライアンセシリア/ボーズ/ライアン --> エリザベス/ボーズ/ライアン
spouseチャールズ3世ダイアナ --> ウェールズ公ウィリアム
spouseチャールズ3世ダイアナ --> ヘンリー
spouseアンドルーヨーク公爵夫人セーラ --> ベアトリス/オブ/ヨーク
spouseアンドルーヨーク公爵夫人セーラ --> ユージェニー/オブ/ヨーク
spouseジョージ6世エリザベス/ボーズ/ライアン --> エリザベス2世
spouseフィリップエリザベス2世 --> エドワード
フィリップ --> spouseフィリップエリザベス2世( ):::class1
マーク/フィリップス --> spouseマーク/フィリップスプリンセス/ロイヤル/アン( ):::class1
ジョージ5世 --> spouseジョージ5世メアリー/オブ/テック( ):::class1
クロード/ボーズ/ライアン --> spouseクロード/ボーズ/ライアンセシリア/ボーズ/ライアン( ):::class1
チャールズ3世 --> spouseチャールズ3世ダイアナ( ):::class1
アンドルー --> spouseアンドルーヨーク公爵夫人セーラ( ):::class1
ジョージ6世 --> spouseジョージ6世エリザベス/ボーズ/ライアン( ):::class1
エリザベス2世 --> spouseフィリップエリザベス2世( ):::class1
プリンセス/ロイヤル/アン --> spouseマーク/フィリップスプリンセス/ロイヤル/アン( ):::class1
メアリー/オブ/テック --> spouseジョージ5世メアリー/オブ/テック( ):::class1
セシリア/ボーズ/ライアン --> spouseクロード/ボーズ/ライアンセシリア/ボーズ/ライアン( ):::class1
ダイアナ --> spouseチャールズ3世ダイアナ( ):::class1
ヨーク公爵夫人セーラ --> spouseアンドルーヨーク公爵夫人セーラ( ):::class1
エリザベス/ボーズ/ライアン --> spouseジョージ6世エリザベス/ボーズ/ライアン( ):::class1
```
【解説】 unispectの使い方/dumpの方法

# 前提
この記事は違法なチート行為を推奨するものではなく、あくまで技術的な知識を提供するものです。
実際に行った場合、ゲーム会社から訴訟される場合がありますので絶対に行わないようにしてください。
# Unispectとは
Unityで作られたゲームのオフセットや構造をdumpして、ユーザーに見える形で解析することのできるツールです。
Razchekによってgithubでソースが公開されています。
https://github.com/Razchek/Unispect
![UnispectLogo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3880837/775c0a55-4ce6-11b8-8d7c-1a1701c6da67.png)
画像出典：https://github.com/Razchek/Unispect

# なんの為？
ずばり言うとチートアプリケーションの作成のために使われます。
Unispectを使用することでオフセットなどを取得することができるため、それを使用してメモリを読んだり書いたりができます。
内部の場合、(名前空間).(クラス名)のような形でUnispectがdumpしてくれるので、事前にオフセットを用意せずともクラス名を直接弄ったりすることにも応用できます。

# 使い方　その1
githubからリリースをダウンロードします。
https://github.com/Razchek/Unispect/releases
ソースからコンパイルもできます。
https://github.com/Razchek/Unispect
.NETなので、Visual studioでC#開発環境をセットアップしてコンパイルできます。

# 使い方　その2
コンパイルしたら実行します。
すると、以下のようなウィンドウが出てきます。
![2024-09-16 16_01_17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3880837/eefa1248-8b0f-c220-4f6f-213254742d1e.png)
これさえ説明すればわかるかもしれません。
Output fileは出力先のテキストファイル
Process Handleはゲームの名前(ウィンドウ名)
です。
Targetは変えないでも使えます。

# 使い方　その3
Outputを設定
Process Handleにウィンドウ名を入力してください。(ABCDならABCD)
GOの下のSave to Fileにチェックを入れてGOを押してください(チェックは任意)
そしたら画像のようになります。(画像ではoutputをカラにしている)
![2024-09-16 16_06_57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3880837/441d38fb-4a90-ae4c-2249-50d8deeda765.png)
私のテストしたゲーム(自作)はMONOで保護されていましたがdumpが成功しました。
SAVE TO FILEを押してセーブしましょう。

# 使い方　その4
ここからが大変です。
自分のお目当ての関数を見つけましょう。
私の場合、探していた関数はこのような形式でした。
![2024-09-16 16_10_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3880837/c72f4930-193e-9279-7106-52bc7def817c.png)
[E8]と書いてあります。これがオフセットです。
実際に使うときは、0xE8として使うことができます。
おめでとうございます。これであなたは不正行為をしました。
# あとがき
今回はunispectの簡単な使い方を解説しました。
不正行為は絶対してはいけないので、良い子ならばやらないでおきましょう。
[Reliability] フォールトトレランス、フォールトアポインダンス

# 高度化手法
|考え方||
|:--|:--|
|フォールトトレランス|故障が発生してむシステム全体として必要な機能を維持する|
|フォールトアポインダンス|故障の発生を防ぐことでシステム全体の信頼性を向上する|

# フォールトトレランス
|実現方法||
|:--|:--|
|フェールソフト|性能の低下を許容しても、システム全体を停止させずにシステムの機能を維持する|
|フェールセーフ|誤動作、障害が発生しても、常に安全側にシステムを制御する|
|フェールオーバ|障害が発生しても、他のシステムに処理やデータを自動的に引き継ぐ|
|フォールトマスキング|障害が発生しても、その影響が外部に出ないようにする|
|フールプルーフ|誤った操作や意図しない使われ方をしても、システムに異常が起こらないように設計する|

# 参考リンク
- [令和元秋16](https://www.ap-siken.com/kakomon/22_aki/q16.html)
【サーバー構築】ApachでWebサーバーを起動させる

# 目的
　ApachでWebサーバーを構築します。ローカルネットワーク内で閲覧可能なWebサイトを作ることができます。

# 実施した環境
* Ubuntu 24.04.1 LTS
* Apach/2.4.62
# 目次
1. Ubuntuのインストール
1. Apachのインストール
1. Webサーバーの立ち上げ
1. 自分のファイルを公開する
1. Apachのディレクトリ構成
1. 総括
1. 参考

# 1. Ubuntuのインストール
　筆者はUSBからPCに直接インストールしました。USBブートの場合、GUIツールを使ってISOイメージをUSBメモリに書き込むこともできますし、ddコマンドを使って書き込むこともできます。
　以下はddコマンドを使って書き込んだ後、BIOSでUSBからの起動に切り替えて、Ubuntuをインストールする際に、参考にした情報です。
なお、USB内のデータは全て消去するため、気をつけてください。
* MacでISOを焼いてブート可能なUSBを作る(https://qiita.com/kapibarasensei/items/9fb81f0102f9ccc31559)
* 中古で買ったレッツノートに Ubuntu をインストールした方法(https://www.gadgets-today.net/?p=6497)

# 2.Apacheのインストール
　Ubuntuをインストールできたら、ターミナルに次を打ち込んで、Apache2をインストールします
```
$ sudo apt-get install apache2 
```

# 3.Webサーバーの立ち上げ
　先ほどインストールした、Apacheを、起動/終了する際はstart/stopを使います。
```
$ sudo systemctl start apache2
$ sudo systemctl stop apache2
```
　起動させた状態で、ブラウザにPCのIPアドレスを打ち込んで下の画面が表示されれば、Apacheは動いています。
```
# IPアドレスの確認方法
$ hostname -I
```
![スクリーンショット 2024-09-12 17.04.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3884269/a0f98c02-02fe-3205-3062-be17695e0b1b.png)

# 4.自分のファイルを公開する
　先ほどのApachの画面の4行目に*replace this faile*という太文字が確認できます。その文字に続く後ろの（）の中身が、現在公開されているファイルのパスです。次のコマンドで確認してみます。
```
$ cd /var/www/html/
$ less index.html
  # index.htmlに書かれている内容が確認できる
  # 戻るときは、q を1回押す
```
　このディレクトリではファイル名が指定されていないときに、index.htmlが表示されるようになっています。そのため、ブラウザにIPアドレスと共にファイル名を打ち込めば、自分で作ったファイルを見ることができます。
　先ほどのディレクトリにいる状態で、ファイルを作成します。
```
$ sudo vi test.txt
  # 適当に入力する。viの操作方法は省略する
```
　入力し終えたらブラウザに、IPアドレス/test.txt と入力します。先ほど入力した内容が表示されていれば、自分のファイルが公開されています。
 
# 5.Apacheのディレクトリ構成
　もう一度、Apacheの起動画面を見ると、下にパスの図が書いてあるところがあります。ここがApachの設定フォルダです。
```
 $ cd /etc/apache2
 $ ls
   # これらのディレクトリによって、Apachが設定されている。
```
　ディレクトリの中身を確認すると、-enabledディレクトリの中のファイルは、-availableディレクトリの中にあるファイルのシンボリックファイルであることが確認できます。
　よって、-enabledディレクトリの中でシンボリックファイルを作ることで、設定を変えるのだと思います。（←まだ試していないため予測ですが）

# 6.総括
　今回は、Ubuntuをインストールして、ApachでWebサーバーを起動させました。同じローカルネットワークに接続している端末ならば、IPアドレスを指定することで誰でも、閲覧可能です。
　次回は、Apachの設定ファイルを変更してセキュリティを高めようと思います。他人からはアクセスできないようにする事も可能です。

　筆者もまだまだ勉強中の身なので、誤りがあればご指摘いただけると幸いです。
 
# 7.参考
　この記事は以下の情報を参考にして書きました。
* MacでISOを焼いてブート可能なUSBを作る(https://qiita.com/kapibarasensei/items/9fb81f0102f9ccc31559)
* 中古で買ったレッツノートに Ubuntu をインストールした方法(https://www.gadgets-today.net/?p=6497)
* apache2で静的ページを動かす最短メモ(https://qiita.com/miyamotok0105/items/7975b2df20237df29198)
ComfyUIでLayerDiffuseを使えるようにする

# はじめに
皆さん、ComfyUI使ってますか？私は趣味でゲーム制作をしているのですが、その素材をAIで作成できないかと格闘したときにハマってしまったので共有します。

# LayerDiffuseとは

https://gigazine.net/news/20240306-layer-diffusion-generate-transparent-image/

このGigazineさんの記事がわかりやすいのでURLを貼り付けておきます。
簡単に言えば透過画像を生成できるようにする拡張機能です。
ちなみにLayerDiffuseはStableDiffusionWebUIForge用であるLayerDiffusionをComfyUIで使えるように改良したものになります。

# 普通に導入しても動作しない問題
ComfyUIで拡張機能を導入するときは、基本的にはComfyUI-Managerを利用します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1751564/d629bd84-ff32-7e6a-2bd5-fe15d539fc72.png)

ところが、この手順で導入したものは、拡張機能の読み込みに失敗するようです。

```powershell:エラー
Traceback (most recent call last):
  File "ComfyUI_windows_portable\ComfyUI\nodes.py", line 1993, in load_custom_node
    module_spec.loader.exec_module(module)
  File "<frozen importlib._bootstrap_external>", line 940, in exec_module
  File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed
  File "ComfyUI_windows_portable\ComfyUI\comfy_extras\nodes_upscale_model.py", line 3, in <module>
    from spandrel import ModelLoader, ImageModelDescriptor
ModuleNotFoundError: No module named 'spandrel'

Cannot import ComfyUI_windows_portable\ComfyUI\comfy_extras\nodes_upscale_model.py module for custom nodes: No module named 'spandrel'
Traceback (most recent call last):
  File "ComfyUI_windows_portable\ComfyUI\nodes.py", line 1993, in load_custom_node
    module_spec.loader.exec_module(module)
  File "<frozen importlib._bootstrap_external>", line 940, in exec_module
  File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed
  File "ComfyUI_windows_portable\ComfyUI\custom_nodes\ComfyUI-layerdiffuse\__init__.py", line 1, in <module>
    from .layered_diffusion import NODE_CLASS_MAPPINGS, NODE_DISPLAY_NAME_MAPPINGS
  File "ComfyUI_windows_portable\ComfyUI\custom_nodes\ComfyUI-layerdiffuse\layered_diffusion.py", line 18, in <module>
    from .lib_layerdiffusion.utils import (
  File "ComfyUI_windows_portable\ComfyUI\custom_nodes\ComfyUI-layerdiffuse\lib_layerdiffusion\utils.py", line 3, in <module>
    import cv2
ModuleNotFoundError: No module named 'cv2'
```

エラー文を何となく読んでる感じ、モジュールが不足しているみたい。

# 解決法

Layerdiffuseの[requiments.txt](https://github.com/huchenlei/ComfyUI-layerdiffuse/blob/main/requirements.txt)を見ると、diffusersとopencv-pythonが必要と書いてますが、どうやらComfyUIに内蔵しているPythonにはそれが導入されていないようです。
以下のコマンドを**ComfyUI_windows_portable直下で**実行してください。(Portable版じゃない方は各々読み替えてください。)

```powershell:実行するコマンド
.\python_embeded\python.exe -m pip install diffusers opencv-python
```

これで正常に読み込めます。
【AWS IAM】IAMについてまとめてみた

# はじめに
IAMってナントカポリシーとか色々あってわかりにくい！と思ったので自分なりにまとめてみました。
AWS初心者向けの記事となります。

## そもそもIAMって？
AWS IAM（Identity and Access Management）とは、AWSにおける認証や認可を行うサービスです。
マネージメントコンソールへのログインや、AWS CLIを使ったリソース操作、AWSのサービス同時の連携などに利用されるサービスとなっています。

IAMには以下表のとおり、複数のコンポーネントがあります。
| コンポーネント | 説明 |
| ---- | ---- |
| IAMユーザー | AWSアカウントへのアクセスの認証単位 |
| IAMポリシー | 操作権限の認可を行う仕組み |
| IAMグループ | IAMユーザーをグループ単位で管理する機能 |
| IAMロール | AWSリソースへの操作権限の認可を行う機能 |


それぞれのコンポーネントについて解説していきます。

## IAMユーザー
IAMユーザーとは、AWSアカウント上に作成するユーザーです。
IAMユーザーには、権限を割り当てることで、必要な操作を行うことができます。
権限を割り当てる際には、AWS Well-Architected Frameworkの設計原則の一つである「最小権限の原則」に従い、必要最低限の操作が行える権限を付与しましょう。

作成したIAMユーザーは、AWSマネージメントコンソールへのログインや、AWS CLI、AWS SDKなどのツールから操作を行う場合に利用します。
AWSマネージメントコンソールへのアクセスには、ユーザー名とパスワードによる認証、ツールからのアクセスには、アクセスキーとシークレットアクセスキーを使用した認証という違いがあるのも覚えておきましょう。

## IAMポリシー
IAMポリシーとは、操作権限の認可を行うための仕組みです。
IAMユーザーの説明に書いた、「権限」と表記したものの実態がIAMポリシーです。
IAMポリシーは単体で利用するのではく、何かのIAMエンティティにアタッチして利用します。

IAMポリシーには、以下のようなポリシーの種別があります。
| ポリシー分類 | 概要 |
| ---- | ---- |
| AWS管理ポリシー | AWSが提供しているポリシー群で、複数のIAMエンティティで使いまわしができる。<br>IAMユーザーによる編集はできない。 |
| カスタマー管理ポリシー | ユーザー自身が作成するポリシー群で、複数のIAMエンティティで使いまわしができる。<br>IAMユーザによる編集が可能なため、必要に応じてポリシーの追加/削除/修正が可能。 |
| インラインポリシー | IAMエンティティ固有のポリシー群で複数のIAMエンティティで使いまわしができない。<br>ユーザーによる編集が可能なため、必要に応じてポリシーの追加/削除/修正が可能。 |

### (補足)カスタマー管理ポリシーとインラインポリシーの利用用途
上の表では、いまいちカスタマー管理ポリシーとインラインポリシーの差がわかりにくかったと思います。

カスタマー管理ポリシーは、複数のIAMエンティティで使いまわしができるため、例えば、IAMユーザAとIAMユーザBに対し、一つのIAMポリシーをそれぞれアタッチすることで同じ権限を持たせるといった運用ができます。
インラインポリシーでは、上記のような使い方ができないため、IAMユーザAに対するインラインポリシーと、IAMユーザBに対するインラインポリシーをそれぞれ作成する必要があります。

つまり、汎用的に使いたいポリシーは、カスタマー管理ポリシーで管理し、
特権操作など、特定のIAMエンティティに対し、固有の権限を付与したい場合は、インラインポリシーで管理するといった運用がおすすめです。

## IAMグループ
IAMグループとは、IAMユーザをグループで管理するための仕組みです。
IAMグループに対してIAMポリシーを設定して、IAMユーザを作成したIAMグループに振り分けることで、それぞれのIAMユーザにポリシーを設定しなくても権限管理ができます。

## IAMロール
IAMロールとは、AWSリソースに対して、他のAWSリソースの操作権限を認可するための仕組みです。EC2インスタンスから、S3バケットへの操作を行う場合など、AWSリソースからAWSリソースへの操作(アクセス等)を行う場合に利用します。
IAMロールは、IAMユーザーやIAMグループ同様、IAMポリシーを設定して権限の認可を行います。作成したIAMロールをAWSリソースにアタッチすることで利用が可能となります。

ここで出てくるのが、「信頼ポリシー」です。
信頼ポリシーとは、IAMロールがどのAWSリソースへアタッチできるかを設定するポリシーです。信頼ポリシーは、JSONと呼ばれる記法で定義します。
信頼ポリシーには、Principalという要素にアタッチ先のAWSリソース(サービス名)を記載し、Actionという要素に権限の委任を行うというアクションを記載することで、IAMロールをアタッチしたAWSリソースに対し、権限制御が可能になります。

https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/reference_policies_elements_principal.html

https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_roles.html#id_roles_terms-and-concepts

# おわりに
IAMについて概要を解説しました。
この記事が誰かの学習の助けになれば幸いです。
異なる AWS アカウント間での Amazon S3 のデータ同期を実施する #1 (AWS CLI 手動実行) 

# 1. はじめに

ある AWS アカウントの Amazon S3 バケットに保管されたデータを別の AWS アカウントの Amazon S3 バケットにコピーする AWS CLI の実行手順です。

今回は次のような特定の条件に向けて、AWS CLI を活用して S3 間でデータを同期する手法をご紹介します。

後続の記事では S3 間のデータ同期を定期自動実行する手法についてまとめています。

https://qiita.com/sanjushi003/items/98a1f3b478f26a391e38

## 前提条件 (S3 バケット A へのアクセス制限)

- AWS アカウント A の Amazon S3 および他の AWS リソースに関する操作、変更は一切実施できない
- AWS アカウント A の S3 バケット A には、AWS アカウント B のユーザーだけがデータ取得 (List/Get) できる


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864151/9c09d2d4-e5f9-6189-d936-d6e2f7c34a10.png)


異なる AWS アカウント (クロスアカウント) 環境において S3 バケットのデータを自動取得する手法は数多く存在しますが、今回は上記の条件によって実現する手法はいくつか限られます。

今回は AWS CLI を手動実行する方法でデータ同期を実現します。

</details>

<details><summary>パッと思いつくけど実装できない NG 例</summary>

::: note warn
- Amazon S3 の機能である S3 Replicaiton は送信元 (AWS アカウント A) 側での作業が必要
- AWS Data Sync によるデータ同期は送信元 (AWS アカウント A) 側での作業が必要
- etc..
:::

</details>

</details>

<details><summary> AWS アカウント A の S3 バケット A のバケットポリシー (実際の例) </summary>


```json: S3 バケットポリシー (AWS アカウント A)
{
"Effect": "Allow", "Principal": {
"AWS": "arn:aws:iam::<AWS アカウント B>:root" },
"Action": [ "s3:List*","s3:Get*" ],
"Resource": ["arn:aws:s3:::<バケット A>","arn:aws:s3:::<バケット A>/*"]
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864151/3a8b8f5b-cd31-d3e0-83e8-17e2dc0a5c9a.png)

補記しておくと「root」と指定されていますが、実際には AWS アカウント全体 (ここでは 123456789) を意味しています。

```json: 指定する AWS アカウント全体が対象
{
"Principal": { "AWS": "arn:aws:iam::123456789012:root" }
```

[(参考) AWS JSON ポリシーの要素: Principal](
https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/reference_policies_elements_principal.html#principal-accounts)

つまり AWS アカウント「ルートユーザー」である必要はなく、指定されている「AWS アカウント全て」を対象にしています。もちろん今回の場合は S3 関連の操作をする権限 (S3 Get / List) は最低限必要となります。


</details>

# 2. 実装手順

手順は非常にシンプルです。

(1) データ送信先の AWS アカウントで S3 バケットを作成し、
(2) AWS CloudShell から AWS CLI を呼び出して S3 同期のコマンドを実行します。

## 2-2. データ送信先の S3 バケット作成

データ送信先の S3 バケットは、データ送信元の S3 バケットと同じリージョンで作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864151/6ac3c0fa-c594-040e-82fb-45137851e564.png)

## 2-3. AWS CloudShell から s3 sync を実行

AWS マネジメントコンソール左下の「CloudShell」から、次の AWS CLI コマンドを実行します。

```bash: s3 sync
$ aws s3 sync <source> <target>

# <source> は 送信元 S3 バケットの ARN
# <target> は 送信先 S3 バケットの ARN
```

オプション指定なしで実行しているので同期元の S3 バケットで差分が発生した場合には同期先に差分が上書きされますが、同期元からファイルやフォルダが削除されても同期先からは削除されません。

実際の実行イメージは下図のとおりです。バケット内のファイルがフォルダごとすべて同期されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864151/9d663409-118a-75cf-7a00-1ad84fd398c9.png)


# 3. まとめ

ある特定のアクセス環境下において、異なる AWS アカウント同士での Amazon S3 のデータ同期を AWS CLI で手動で実行する手法についてご紹介しました。

# 4. 関連ブログ

応用編として、Amazon S3 のデータ同期をメール通知させる手法について紹介しています。

https://qiita.com/sanjushi003/items/5f875edc95f24c600fd1

後続の記事では、Amazon S3 間のデータ同期を定期自動実行する手法についてまとめています。

https://qiita.com/sanjushi003/items/98a1f3b478f26a391e38
【競プロ】競技プログラミング標準入力用チートシート

# まえがき
ただの自分用のメモなので適当に見てください。

# 本題
通常文字: `aiueo`
```py:main.py
A = input()
```

通常数字: `3`
```py:main.py
A = int(input())
```

複数の独立数字: `A=2, B=4, C=3`
```py:main.py
A, B, C = map(int, input().split())
```

複数の群数字: `2 4 6 3 6 8 5 7`
```py:main.py
A = list(map, input().split())
```

複数行の単一数字(N行): 
```
3
4
1
3
6
...
```
```py:main.py
A = [int(input()) for _ in range(N)]
```

複数行の複数文字(N行 M文字) -> M個のリストへと分割:
```
3 1
4 5
6 4
1 6
...
```
```py:main.py
AB = [map(int, input().split()) for _ in range(N)]
A, B = map(list, zip(*AB))
```
教育的なdp問題【競技プログラミング】

# はじめに
- 典型的なdp問題を解いて、dpの感覚を掴もうと思う。

# 問題
- [典型９０問の008](https://atcoder.jp/contests/typical90/tasks/typical90_h)からです。
- ある文字列Sから、順番を保ったまま7文字を抜き出して、T = "atcoder"を作る方法は何通りあるか？
    - 例は以下のとおり。
    - S = "atcoder" からは、１とおり。
    - S = "atcodre" からは、０とおり。
    - S = "atcoderatcoder" からは、8とおり。
    - S = "aattccooddeerr" からは、128とおり。$(=2^7)$

# dpの方針
- 基本形は、dp[i][??] (??は何かの状態を表す指標)になる。
- 今回においては、iは当然、文字列Sの何文字目まで進んだかを意味して、dp[N][??]が最終的な答えになるようなイメージかな。
- 具体的に考えれば、dp[i][j](i in 0..<N , j in 0..<7)として、これを、Sの「i-1」文字目まで取捨選択終わった時点で、Tの「j-1」文字目までを選択し終えているときの、場合の数とする。
- つまり、dp[i][j]の数値が算出済みである状態で、S[i]、T[j]の文字に着目している場面、と言うこと。
- この方針に沿ってコードを書くと以下のとおり。
```swift
extension Array {
    init(_ cnt: Int, _ v: Element) {
        self = [Element](repeating: v, count: cnt)
    }
    init<T>(_ cnt2:Int, _ cnt1:Int, _ v:T) where Element == [T] {
        self = [[T]](cnt2,[T](cnt1,v))
    }
}

// dp準備
var dp = [[Int]](N+1,T.count+1,0) // 省略記法でのイニシャライザ。要素数 N+1 がキモだね。

// 初期化
dp[0][0] = 1

// 遷移
for i in 0..<N {
    for j in 0...T.count{

        // Sの文字列を進むとき、Tの文字列T[j]をS[i]から選ばない決定をした場合の遷移
        dp[i+1][j] += dp[i][j] // iのみ遷移

        // Sの文字列を進むとき、Tの文字列を選ぶときの遷移
        if j<T.count && S[i] == T[j] {
            dp[i+1][j+1] += dp[i][j] // iもjも遷移
        }
    }
}
```
- 上記dpを使った本問の答えは、当然dp[N][7]となる。
- 本問の制約は、$N≦10^5$だから、上記の計算量O(7･N)だと余裕です。30ms未満でACでした。

# おわりに
- まだ、この手の問題で､解法がパッと思いつかない。dpについては、数をこなすしかないのかな。
NASをUbuntuにmountしようとしてPermission Errorが消えない場合はdomainに注意

# 問題
## やりたいこと
- 研究室の共有フォルダ (Synology NASK) をUbuntu 20.04でマウントしたい
## 伏線
- 研究室はドメイン管理？されていて、【ドメイン名】\【ユーザ名】が名前として割り当てられている
## やったこと
- mountする際、ぐぐると出てくるこのコマンドを実行していた
```terminal
sudo mount -t cifs /path/to/nask /path/to/local -o username="username",password="password"
```
**参考**:https://xn--v6q832hwdkvom.com/post/ubuntu%E3%81%A7nas%E5%86%85%E3%81%AE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AB%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%81%99%E3%82%8B/
## エラー
```terminal
mount error(13): Permission denied
Refer to the mount.cifs(8) manual page (e.g. man mount.cifs) and kernel log messages (dmesg)
```
- `vers=3.0`や`sec=nltm`を追記してもだめ
    - 大抵はこれで解決するらしいです
    - **参考**：https://kstoneriver.com/tech/archives/104

## 解決方法
- ドメインをusernameに含めるのではなく、別途記載するとマウントに成功
```
sudo mount -t cifs /path/to/nask /path/to/local -o username="username",password="password",domain="domain"
```

# おまけ
読み書き権限を与える場合、以下を-oとして追記しておく
```
,file_mode=0777,dir_mode=0777
```
日経コンピュータ　2024.01

**日経コンピュータ-は2週間に一度（年間26冊）発行されます**
**月に一度、ざっくりどういう記事が載っていてどう感じたかをお伝えします**
# 2024.01.11号
## 特集【新春IT大予測2024　ポスト生成AI時代を見通す】(P.10)
全部で10＋コラムニスト5の15あります。4つ紹介します。
**02:利用者の戸惑いは続く（生成AI活用）**
→言語モデルの特許数、MSとGoogleがリード。OpenAIがゼロ
※人類が危険になる可能性があるので出願も公開もしない？
**06:生成AIの悪用に警戒（社会リスクとIT戦略）**
→中国の「超限戦」では武力攻撃の前に情報操作の「認知戦」
　従来は言葉の壁があったがAI翻訳で広がる危険性がある
**07:DX機能は事業部門へ（IT・DX部門の役割）**
→IT・DX部門の役割は①システムアーキテクチャ②コスト削減③体制。①EA(エンタープライズアーキテクチャ）が見直される可能性③DX部門を解体し事業部門に組み込む会社も増える
**中田敦：小規模言語モデルに注目（GAFA）**
→LLMだけでなくSLM(小規模言語モデル)が広がる。MSが発表した「Orca2」で使われた言葉です。グーグルが生成AIを有償モデルとするか無償とするか歴史的転換点

初夢というタイプのものがないのが寂しいです。
# 2024.01.25号
## 特集【デジタル人材育成2.0　トップから現場まで学びの歯車回す】(P.10)
DXを牽引する人材を育てる動きはコロナ前から始まっていました。デジタル（D)に軸足を置く人材育成が1.0、変革（X）に焦点を合わせる人材育成を2.0と考え2.0の勘所を探る特集です。
**１．育成は次ステージへ**
＜住友生命保険＞エンジニア向けのDX塾を全社向けに拡大
＜三菱ケミカルG＞シティズンデータサイエンスを推進
＜中外製薬＞DXの「全社ごと化」
**２．現場発で全社動かす　「非IT」「市民」が推進**
＜クレディセゾン＞伴走型内製開発で要件定義不要とした
→IT知識を持たず勝手な妄想で行う要件定義をやめた
　「要件定義をやめよう」を語ろう　[動画公開](www.youtube.com/watch?v=SeGgVyXCwsE&t=2534s)しました
 ## 【NTTが挑む広域データセンター接続構想　IOWN活用、都市部集中の解消へ】(P.70)
次世代ネットワーク構想「**IOWN(Innovatibe Optical and Wireless Network)**」で培った技術を適用し、多数対多数のデータセンターが接続出来る形式「データセンターエクスチェンジ（DCX）」の開発を進めています。

通常の光回線は、途中は電気に変換して長距離の増幅を行っています。IOWNはNTTが2019年に世界で初めて成功した＜光電融合技術＞を用いて光だけで増幅通信する技術です。2030年に実用を目指しています。その技術を使い100kmの遅延を1ms以下に押さえる事で分散データセンターを一体運用できるようになります。2024年に実証実験（POC）、2027年前後での顧客提供を目指しています。
以上
Evaluate Report Data with Formulas


https://trailhead.salesforce.com/content/learn/projects/rd-summary-formulas


# Summarize Report Data

何もしないで、検証ボタンをクリックしてみる

:::note alert
We can't find a report with the name 'Opportunities by Stage'. Make sure the report was created, it's active, and that there is only one report with this name.
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/2c4b3b80-6a29-1520-0d4a-94d1cb84333e.png)

# Apply a Discount with a Custom Summary Formula


:::note alert
Either the 'Amount' field isn't correctly summarized or there is no custom summary formula.
:::


この設定を忘れていた...

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/f75e5e2e-0a33-eb9b-a7f2-1bd94ae5eacf.png)



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/a733bc04-4f4a-06d2-4905-6e6ae1538e67.png)

# Evaluate Each Record in Reports with Row-Level Formulas

# Compare Groups with PREVGROUPVAL() and PARENTGROUPVAL()

何もしないで、検証ボタンをクリックしてみる

:::note alert
We can't find a report with the unique name 'Case Percentages by Type'. Make sure the report was created, it's active, and that there is only one report with this name.
:::

**PREVGROUPVAL() を使用して時間の経過に伴う値を測定する**

PREVGROUPVAL() を使用すると、レポート ビルダーで指定したグループ化を以前のグループ化と比較できるため、時間の経過に伴う値の変化を計算する強力なツールになります。PREVGROUPVAL() は、完了月や作成日などの日付項目でグループ化したレポート データを評価する場合に最も役立ちます。

レポートに前のグループがない場合、PREVGROUPVAL() は null を返します (つまり、何も返しません。値はありません)。たとえば、レポートに 1 月から 12 月までの 12 のグループがあるとします。2 月の場合、PREVGROUPVAL() は 1 月を返します。1 月の場合、1 月が最初のグループなので、その前にグループはないため、PREVGROUPVAL() は null を返します。

**PARENTGROUPVAL() で割合を求める**

PARENTGROUPVAL() は、指定された親グループの値を返します。親グループは、数式が評価されるレベルより上の任意のレベルです。レポートにグループが 1 つしかない場合 (Lance の商談レポートが Close Month でグループ化されている場合など)、レポートの総計値は 1 つのグループの「上」になります。レポートの総計は常に最上位のグループになります。
個人的な中古パソコン購入チェックリスト


# 20240916_個人的な中古パソコン購入チェックリスト

## 先に結論
- 取り敢えず有名な中古屋で、中古1万とか2万とかで壊れても良いやというノートパソコン買ってみると良いと思います。2024年時点ではイオシスとコンフルがおすすめです。
- 「第8世代core i5」「メモリ8GB」「SSD」「フルHD」「2万円前半まで」という条件が最近のメインと思っています。
- スマホも大体同じ感じで良いけど、電池消耗だけは仕方ないので、自分で電池交換してみるとか、考慮は必要です。
- 買った後の設定は、chocolateyというパッケージ管理の仕組みを使って手軽に行いましょう。

https://qiita.com/kubo4ka/items/96484112f1ed745bf141

## 目的
- 標題通り。
- 知り合いにさっと連携できるドキュメントを用意しておきたい。

## 状況
- 文系学部卒、特別なプログラミング経験やソフト、ハードなどの知識、経験なし。
- 社会人で、基本情報FE取得済、セスペSC、ネスペNWを取得済。デスペ1敗して保留中。LPIC1、CCNA取得済。
- 中古でパソコンを20程度は買っていて、知り合いの購入もサポートしてきた。
↓買ったものリスト

https://qiita.com/kubo4ka/items/c0020c5915ba11bccdea#20230926_%E8%B3%87%E7%94%A3%E7%AE%A1%E7%90%86

## そもそも何かあって買い物検討なのかチェックリスト
- 今のパソコンが遅いとか？
- ネットが遅いとか？ルータ買い換えたら速度問題解決とかもある。
- 容量がいっぱいとか？nas買ったら容量問題解決とかもある。
- あるゲームをやりたいとか？
- 今のパソコンが故障したとか？
- 勉強用に普段使いとは違う端末が欲しいとか？
- 予算は？いつまでにほしい？

## そもそも中古で大丈夫かチェックリスト
- 心理的に中古で良いか？
- 要件的に中古で良いか？新品に求めるのはサポートが主となる。
- 型落ち機種で良いか？最新機種の中古も出回るが、最新機種なら新品の方が良いと思う。
- 数年で買替えるくらいの感覚で良いか？＃そもそも最近のパソコン、スマホは5年持てば良い方かも。

## 中古で何買うかチェックリスト
- Windowsが良いか？Macが良いか？何でも良いか？
  - 要件的にゲームしたければWindowsかも。絵を描いたり音楽やったりするならMacかも。Macは対応CPU要注意かも。
  - ゲームとか使いたいソフトがあればそれの推奨スペックを確認。
- ノートパソコンが良いか？デスクトップでも良いか？超小型デスクトップもあるよ。ノートパソコンの方がスペックに対して割高。
  - ノートパソコンなら、モバイルするか？1.2KGが鞄に入れて持ち運びたいと思える境界値という学説もあります。
- 机の広さとか、視力とか、映画見たいとか、用途的に画面サイズはどのくらいが良い？
- 実はその用途ならタブレットでも良いとかない？

## どこで買うかチェックリスト
- 通販か、店舗に行くか。
  - 店舗ならワンストップ的に秋葉原をおすすめ。取り敢えずは実機触った方が良いと思う。
  - 通販ならイオシス、コンフルをおすすめ。
- ジャンクも別に悪くない。ダメだったら諦めて買い直す、で良い。
  - 自分のスキル的な成長に繋がる。症状やエラーメッセージをググって対処する練習になる。

## 少し補足
- 心理的に中古で良いか？
 → 他人の使ったものとか無理！(>_<)という感じなら、中古はやめときましょう。

- 要件的に中古で良いか？新品に求めるのはサポートが主となる。
 → 自宅での仕事に使うとか、クリエイターとかで問題発生時即座ににサポートほしいとか、パソコンとか詳しくないからとにかくいつでも電話したいとか、

- コンフル運営のTCEも同じく個人的に良いと思っています。
- タブレットやスマホもイオシスでは多数取り扱いあり、型落ちで問題なければ、気軽に買って試してみると良いと思います。電池消耗状態だけはしょうがないので、電池交換は検討してみましょう。「機種名　電池交換」とかで調べれば、動画の解説を色々な方が行ってくれています。最近はAmazonや楽天で、工具付きで電池が売っているので、かなり敷居は低いと思います。半田付けとか不要で、ドライバとドライヤでどうにかなります。
- 新品で買うべきものは、ディスプレイ（フルHDで1万円程度）、ルータ（1万円程度）かなと思います。
  - ディスプレイは用途や机の広さによりますが、モバイルディスプレイは個人的に便利だと思っています。

https://www.itmedia.co.jp/pcuser/series/21824/

以上
chocolateyでWindowsにアプリを手軽にインストールしてみよう


# chocolateyでWindowsにアプリを手軽にインストールしてみよう

Windowsにアプリをインストールする、というと、公式サイトに行って、exeをダウンロードしてきて、ダブルクリックして、ウィザードに従って操作する、、、という、GUIのイメージが一般的かと思いますが、コマンド一発で終わるように自動化のツールがOSSで提供されているので活用しましょう。
「パッケージマネージャ」という用語となるもので、Windowsに関しては選択肢はいくつかあるのですが、今回は「chocolatey」というものを使って行きましょう。

## chocolatey自体をインストール
公式サイトに従いchocolatey自体をインストールしましょう。
オプションのユーザ登録は不要です。
管理者権限PowerShellでワンライナー実行のはず。

https://chocolatey.org/install

2024年時点のイメージは以下の感じです。

![image](https://hackmd.io/_uploads/HJQYjES6A.png)

Windowsキー＋Rで「ファイル名を指定して実行」を起動し、powershellと入力し、Ctrl＋Shiftを押しながらエンターを押して、管理者権限でPowerShellを起動します。
クリップボードにインストールコマンドがコピーされているはずなので、貼り付けてみると以下のようになるはずです。実行してみましょう。

![image](https://hackmd.io/_uploads/S1G92VH6C.png)

```
choco -v
```
と実行して、バージョンが表示されれば、chocolatey自体のインストールは完了です。

## choco installで好きなアプリをインストール
chocolatey自体のインストールが終わったら、以下のコマンドで幾つかアプリをインストールしてみましょう。
個人的に普段使いの端末にほしいものを、コマンド一発でインストールしています。

```
choco install -y googlechrome firefox gimp libreoffice-fresh sakuraeditor vscode
```

Chocolatey installed xx/xx packages.

といった感じのメッセージが出て、問題なければ上記アプリが利用可能になっているはずです。

## アプリを探す
他にも自分の利用したいアプリはあるかと思います。

https://community.chocolatey.org/packages/

上記サイトでほしいアプリが提供されているか確認してみましょう。残念ながら見つからない場合は、公式サイトからGUIでインストールとなります。

以上
Windows -> Ubuntu pingは飛ぶのにsshできないとき

# 問題
- Windows 11から、Ubuntu 20.04 (or 22.04)にSSH接続しようとしている
- ping 【IPアドレス】なら返答が返ってくる
- ssh 【username】@【IPアドレス】だと、以下のような状態で止まる
```terminal
(base) PS C:\Users\kazunosuke> ssh -vvv kazunosuke@192.168.X.XX
OpenSSH_for_Windows_8.6p1, LibreSSL 3.4.3
debug1: Reading configuration data C:\\Users\\kazunosuke/.ssh/config
debug3: Failed to open file:C:/ProgramData/ssh/ssh_config error:2
debug2: resolve_canonicalize: hostname 192.168.X.XX is address
debug3: expanded UserKnownHostsFile '~/.ssh/known_hosts' -> 'C:\\Users\\kazunosuke/.ssh/known_hosts'
debug3: expanded UserKnownHostsFile '~/.ssh/known_hosts2' -> 'C:\\Users\\kazunosuke/.ssh/known_hosts2'
debug1: Authenticator provider $SSH_SK_PROVIDER did not resolve; disabling
debug3: ssh_connect_direct: entering
debug1: Connecting to 192.168.X.XX [192.168.X.XX] port 22.
```

# sshの接続に関する参考
- https://scrawledtechblog.com/windows-ubuntu-ssh/
 
# 原因と対処法
## 原因
Ubuntu 側でファイアウォールがポート 22 をブロックしていた（らしい。）
## 対処法
```terminal
sudo ufw allow 22
```
で、とりあえず繋がったのでﾖｼｯ