OmniAICreator/Qiita-1.07M huggingface dataset:
AWS ユーザー・アカウント管理サービス

## 前提知識
AWSにおいてユーザーとアカウントは異なります。一つのアカウント内に一つまたは複数のユーザーが存在します。つまり、一つのアカウントに利用者は複数いる場合があります。本記事でのポイントは複数アカウントはOrganization、ユーザーはIAMで管理することです。
## IAM
AWS IAM(Identity and Access Management)はAWSのユーザーとグループを作成および管理して、アクセス権限を付与して AWSリソースへのアクセスを許可および拒否できます。
### IAMポリシー
AWSのサービスとリソースへのアクセス許可を付与または拒否するドキュメントアクセス許可のルールを定義(リソースへのアクセス許可を管理)どのアクションをどのリソースで実行できるかを指定するルールセットです。
### IAMユーザー
許可されたサービスだけにアクセスでき、アクセスキーIDとシークレットアクセスキーを関連付けます。
### IAMグループ
IAMユーザーの集合を管理でき、アクセス権限を複数のユーザーに一括で付与します。
### IAMロール
有効期限のある一時的な認証情報アイデンティティです。AWS リソースに他のリソースへのアクセス権限を付与することができます。
### IAMのベストプラクティス
1. 最小権限の原則 (Principle of Least Privilege)
ユーザー、グループ、およびロールには、その業務を遂行するために必要な最低限の権限のみを付与します。
2. IAM ロールの使用
アプリケーションやサービスが AWS リソースにアクセスする必要がある場合は、IAM ユーザーよりも IAM ロールを使用します。
3. 多要素認証 (MFA) の有効化
特に高権限のユーザーや重要なアカウントには MFA を有効にし、セキュリティを強化します。
4. IAM ポリシーの定期的なレビューと更新
IAM ポリシーとアクセス権限を定期的に見直し、不要な権限を削除し、必要に応じて更新します。
5. アカウントの分離
環境や目的ごとに AWS アカウントを分離し、異なるアカウントで異なる役割やリソースを管理します。
6. 定義されたパスワードポリシーの使用
IAM ユーザーのパスワードに対して強力なパスワードポリシーを設定し、セキュリティを強化します。パスワードの最低文字数、パスワードの有効期限、複雑性要件（大文字、小文字、数字、特殊文字の組み合わせ）を設定します。
7. アクセスキーの管理
アクセスキーは必要な場合にのみ作成し、定期的にローテーションします。使用されていないアクセスキーは無効にします。
8. ルートユーザーの使用を最小限に抑える
ルートユーザーは AWS アカウントの作成時にのみ使用し、日常の管理作業には専用の IAM ユーザーを使用します。ルートユーザーの認証情報は安全な場所に保管し、必要なとき以外は使用しません。
9. 権限境界 (Permissions Boundary) の使用
IAM エンティティ（ユーザーやロール）が持つ最大の権限を制御するために、権限境界を設定します。
10. AWS CloudTrailの有効化
概要: AWS CloudTrailを有効にして、AWS アカウント内でのすべての API コールを記録し、監査やコンプライアンスのためにログを保存します。CloudTrail ログを定期的に確認し、不正なアクティビティがないかを監視します。
11. タグの使用
ユーザーやロールにタグを追加して管理しやすくします。これにより、リソースの管理や監査が容易になります。
## AWS Organization
複数のAWSアカウントを一元的に統合および管理、複数のアカウントについての請求を1つにまとめます。
## AWS Control Tower
事前設定された安全なAWS環境であるランディングゾーンを設定するサービスです。多数のアカウントを保有しているマルチアカウントのAWS環境において、各アカウントのセキュリティ設定の統制を可能にします。
## 参考文献
https://aws.amazon.com/jp/iam/
https://aws.amazon.com/jp/organizations/
https://aws.amazon.com/jp/controltower/
JavaScriptのスコープを理解する: よくある面接質問を解決する

## はじめに

JavaScriptでは、`var`を使った`for`ループと非同期関数`setTimeout`を組み合わせると予期しない動作を引き起こすことがあります。次のコードを見てください：

```jsx
for (var i = 0; i < 5; i++) {
    setTimeout(() => console.log(i), 1000);
}
```

:::note info
**期待される動作**
このコードは1秒の遅延で0から4の数字をログに出力するはずです。
:::

:::note alert
**実際の動作**
5が5回ログに出力されます。
:::

バグを見つけられますか？どうすれば解決できますか？


## バグの理解

このバグは、`var`が関数スコープを持っているため、すべての反復で同じ`i`変数が共有されることに起因します。ループが終了するまでに`setTimeout`コールバックが実行され、`i`は5になっています。

## 解決策: `let`を使用する

ECMAScript 2015（ES6）で導入された`let`はブロックスコープを持ち、各反復ごとに新しいバインディングを作成します：

```jsx
for (let i = 0; i < 5; i++) {
    setTimeout(() => console.log(i), 1000);
}
```

**`let`がバグを解決する方法**：

- **ブロックスコープ**：各ループ反復は自身の`i`を取得し、各`setTimeout`コールバックに正しい値を保持します。

### 歴史的背景

- **`var`**：JavaScriptの初期から利用可能な関数スコープ。
- **`let`**：ES6（2015）で導入されたブロックスコープ。
- **`const`**：再代入されない変数に使用され、`let`と同様にブロックスコープを持つ。

**違い**：

- `var`宣言はホイスティングされ、`undefined`で初期化されます。
- `let`と`const`宣言はブロックスコープであり、ステートメントが評価されるまで初期化されません。

詳細については、MDNの[`var`](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/var)、[`let`](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/let)、および[`const`](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/const)のドキュメントを参照してください。

## 解決策: IIFEとクロージャーを使用する

即時関数呼び出し式（IIFE）は新しい関数スコープを作成し、各反復の現在の`i`値を保持します。このアプローチはクロージャーを利用して正しい変数値をキャプチャします：

```jsx
for (var i = 0; i < 5; i++) {
    (function(i) {
        setTimeout(() => console.log(i), 1000);
    })(i);
}
```

**IIFEとクロージャーがバグを解決する方法**：

- **関数スコープ**：各IIFE呼び出しは新しい関数スコープを作成し、現在の`i`をキャプチャします。

### 歴史的背景

IIFEは早期のJavaScriptバージョンからスコープを作成し、変数のライフタイムを管理するために使用されてきました。クロージャーはJavaScriptの基本的な概念であり、関数が囲むスコープから変数をキャプチャして保持することができます。これらのパターンは、`let`や`const`が利用できないES5やそれ以前のバージョンで特に有用です。

詳細については、MDNの[IIFE](https://developer.mozilla.org/ja/docs/Glossary/IIFE)および[クロージャー](https://developer.mozilla.org/ja/docs/Web/JavaScript/Closures)のドキュメントを参照してください。

## 解決策: `console.log.bind`を使用する

もう一つの解決策は、現在の`i`値をキャプチャするバウンド関数を作成するために`console.log.bind`を使用する方法です：

```jsx
for (var i = 0; i < 5; i++) {
    setTimeout(console.log.bind(console, i), 1000);
}
```

**`console.log.bind`がバグを解決する方法**：

- **バウンド関数**：`bind`は`this`を`console`に設定し、最初の引数を現在の`i`値に固定した新しい関数を作成します。これにより、各`setTimeout`コールバックが正しい`i`値を出力します。

### 歴史的背景

`Function.prototype.bind`メソッドはECMAScript 5（ES5）で導入されました。初期引数が固定された関数を簡単に作成できるため、スコープを管理し、非同期コールバック内で変数値を保持するための強力なツールです。

詳細については、MDNの[`bind`](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Function/bind)のドキュメントを参照してください。

## 結論

変数スコープを理解することは、JavaScriptを習得する上で重要です。`setTimeout`を含むよくある面接質問を解決する3つの方法を探りました：

1. ブロックスコープを提供する`let`を使用する
2. 正しい変数値をキャプチャするためにIIFEとクロージャーを使用する
3. バウンド関数を作成するために`console.log.bind`を使用する

これらの解決策を試して、コメントで代替方法を共有してください！
3Dスキャナーとは何ですか? 【第一章】

基本的に、3D スキャナーは、物理的なオブジェクトや環境の形状や、場合によっては外観 (色など) に関する 3 次元データを収集することで、そのオブジェクトや環境の正確なデジタル レプリカを慎重に作成できる強力なツールです。モデルはソフトウェアを使用して操作または編集したり、3D プリントによって命を吹き込むこともできます。3D スキャナーの魅力的な世界を見て、なぜこれほど広く使用されているのかを見てみましょう。

                               人々は 3D スキャナーを何に使用しますか?
3D スキャナーの多用途性は本当に驚くべきもので、その用途はリバース エンジニアリングや製品設計から 3D プリンティング、AR/VR、電子商取引、品質管理、工業用プロトタイピング、ヘルスケア ソリューション、カスタム自動車の改造にまで及びます。など、さらに多くの可能性があります。
![涡轮3 (1).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3823693/c3f8589a-4a3c-383b-7eea-9ae37afdd812.jpeg)


                              なぜ人々はそれらを使用するのでしょうか?
3D スキャナーを使用する主な理由は、時間と費用を大幅に節約できること、正しい寸法のモデルを作成するための最速かつ最も正確な方法を提供し、手動測定の必要性や潜在的なエラーを排除できることです。これにより、3D スキャナーは業界全体に変革をもたらすものになります。

もちろん、定規、ノギス、分度器を使用して手動でオブジェクトを測定し、CAD ソフトウェアで作成することもできますが、オブジェクトのサイズや複雑さによっては、数時間、場合によっては数日かかる場合があり、多くの場合、不正確な測定が行われます。 3D スキャナーのユーザーは、多くの時間を無駄にすることなく、最終目標を簡単に達成できます。
![RevopointPOP3-339.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3823693/e138269c-73ea-4f23-4716-681dd410ee00.jpeg)


3Dスキャナーにはどのような種類がありますか?
利用可能な 3D スキャン ソリューションには主に 5 つのタイプがあります。

                                           構造化光 
構造化光を使用する 3D スキャナーには、通常、赤外線または青色光のプロジェクターと両側に 2 台の赤外線カメラが装備されており、スキャン対象の物体から反射する幾何学的な光のパターンの偏差を検出します。
高精度と解像度 直射日光下では動作しません
巨大なオブジェクトをスキャンすることはできませんが、良好なスキャン結果を得るのは比較的簡単です。
赤外線は人体のスキャンに適しています。スキャナーは高価ですが、近年ではより手頃な価格になりました。


                                        レーザー三角測量 
この方法を使用する 3D スキャナーは、物体にレーザーを照射し、角度を付けたカメラを使用して光が戻るまでにかかる時間を検出します。このタイプのスキャンは優れた精度と解像度を提供しますが、完了までに時間がかかる場合があります。完全にキャプチャするには、表面を複数回スキャンする必要があるためです。

高精度、高解像度のスキャナは高価です。
暗い表面や反射する表面をキャプチャする際の課題を軽減します スキャン速度が遅い


                                          写真測量 
カメラを使用してオブジェクトの複数の写真をさまざまな角度から撮影し、それらの写真をソフトウェアにインポートして画像を 3D モデルに結合します。スマートフォンのカメラを使用してこれを行うことができるようになりましたが、カメラの品質は制限されます。精度を高め、そこから適切な 3D モデルを取得するには、かなり複雑な作業プロセスが必要になる場合があります。

ドローンを使用すると、建物などの大きなオブジェクトをスキャンできますが、正確にスキャンするのは困難です。
安価ですが、正確なスキャンにはハイエンドのカメラ、強力なコンピューター、特殊なソフトウェアが必要です。
プレミアムな質感

                                           接触 
物体に直接接触し、その表面に沿って移動する物理プローブを使用してスキャンする接触スキャナは精度が高く、誤差範囲が非常に小さいため、産業用アプリケーションでよく使用されます。

非常に正確 かなり遅い
透明または反射面をスキャンできます。セットアップが複雑になる場合があります。

                                Light Detection and Ranging (LiDAR) 
この方法は、iPhone 12 以降の Pro モデルで行われているように、物体とスキャナ センサーの間の光の速度を測定して、物体の表面形状を測定します。アプリと一緒に使用すると、基本的な 3D スキャンを実行できる LiDAR スキャナーが含まれています。
メリット デメリット
巨大なオブジェクトをスキャンできる スキャンが遅い
使いやすい あまり正確ではない

LiDAR は一部の iPhone で利用できますが、より一般的には、住宅、建設現場、大型車両、さらにはサブミリの精度を必要としない地理的特徴など、より特殊な大規模オブジェクトのスキャンに使用されます。

https://www.revopoint3d.jp/
X API（Twitter API）の無料でできること、有料じゃないとできないことが分かりにくかったので簡単にまとめた

# X API プランと料金比較

| プラン         | 料金          | ツイート投稿            | ツイート取得            | アプリID数 | 使えるAPI |
|----------------|--------------|------------------------|------------------------|------------|----------------------|
| **Free**       | 無料         | 月間1,500件            | 不可                   | 1          | 主にポストとその削除                 |
| **Basic**      | $100/月      | 月間3,000件            | 月間10,000件           | 2          | X API v2全て             |
| **Pro**        | $5,000/月    | 月間300,000件          | 月間1,000,000件        | 3          | X API v2全て                 |
| **Enterprise** | $42,000/月から | カスタム               | カスタム               | カスタム   | X API v2全て                 |
「Face to Face」も意外と大事

本記事に訪問してくださった方、Welcome:smiley:
エンジニアに絶対なる‼わーちゃんと申します。現在学習中であります。

## はじめに
どの業種でも共通して言える事ですが、コミュニケーションというものは近年複雑化しているように感じられます。
対面だけから始まり、手紙、電話、メール、LINEなどのツール。
ツールなんてものは特に企業ごとによって全く異なり、軽いノリ？なモノからきっちり系のものまで…若干おなか一杯感があります。
ですが、これらのツールを使う前にそもそも基本的な**Face to Face**できていますか？


## 前提
- エンジニアの世界はまだ未経験なので現在の職場において行っていることを上げます
- 「それくらい知ってるよ」と思うこともあると思いますが、知ってることと実際に行動するのとでは全く別物です
- 私自身が改めて**Face to Face**の重要性を感じた場面を紹介していきます 


## 場面設定
### 1：初めて協力会社の人に会う
上司からの引継ぎという形でもらった業務。ちょうどコロナ禍という事もありメールや電話での応対が続いていました。
相手の顔が見えないという事もあり電話をすると手汗が止まらない私はより不安。
現場で作業をするときに初めてお会いしたときは「この人なら大丈夫」という確信をしっかり持てるとともに、メールや電話ではできない雑談もでき信頼関係が築けました。

### 2：ツールとの併用
私自身仕事の中で会社から支給されたスマホ利用＆LINEみたいなツールも利用しています。スタンプなんかも利用でき、きちっと、堅苦しい雰囲気にならないでコミュニケーションをとることができるし、頭の中の言葉を言語化する時間をとることができ、いい反面もありますが。中には相手の表情が見えないから「怒っている」と感じてしまう文章を送られた日には胃に穴が開きそうになります。
チーム内では一日1回は30分くらい集まり、**Face to Face**で互いの進捗状況等を報告することをしていました。
このような場が設けられていることでツールだけでは伝えきれなかったことや業務以外の話も出てきて安心して仕事をすることができました。


## 参考
私の経験談だけでは「うーん」という方。次の記事は参考になるかと思いますので、ぜひ。
[リモートワークの弱点を克服するface to faceでコミュニケーションを活性化！](https://saponet.mynavi.jp/column/detail/tn_romu_t00_remote-work-communication_210507.html)


## まとめ
コロナ禍でとひろがったリモートワーク。からのLINE等を利用したコミュニケーションツールの普及。
仕事に支障がないからいいや…と思いますが一度は(特に何かを始める時)実際に会ってみて**Face to Face**でコミュニケーションをとってみるきっかけになったのなら幸いです
極端にこちらだけ！ではなく、うまいこと掛け合わせることが大切なのかもしれませんね:star2:
PythonをEXE化した→他のWindowsで動かなかったのを解消

# PythonをEXE化した→他のWindowsで動かなかった
pythonプログラムをpyinstallerでEXE化したプログラムあり、他のPCへもっていくと動かないことがあるという苦情があった。
なんかどこかで聞いたような話だなと流して聞いていて数か月、原因がわかりましたので記述しておきます。

# そういえば
Pythonの埋め込みパッケージの作り方を以前書いたような気がしてみたら、自分で答えを書いていた。

https://qiita.com/kazzzu/items/cfca364f04422ae11be7
```
注釈 埋め込み用配布には Microsoft C Runtime は含まれません。これを提供するのはアプリケーションのインストーラの責務です。そのランタイムは既に以前にユーザのシステムにインストール済みかもしれませんし、Windows Update により自動で更新されているかもしれません。このことはシステムディレクトリに ucrtbase.dll があるか探せばわかります。
```
# 結論
ここら辺をダウンロードしてインストールすればよいようで。

https://learn.microsoft.com/ja-jp/cpp/windows/latest-supported-vc-redist?view=msvc-170#latest-microsoft-visual-c-redistributable-version
git pushで remote: Repository not found.は、VSCode（の組み込みGit）が原因だった

## 事象と解決策
VSCodeのターミナルから `git push` しようとしました。
```
$ git push

remote: Repository not found.
fatal: repository 'https://github.com/username/ripository.git/' not found
```
...???

結論からになりますが、`unset GIT_ASKPASS` と打ったら解消しました。
こちらのサイトのおかげです。感謝。

https://tech-mmmm.blogspot.com/2023/07/vs-codegit-pushmissing-or-invalid.html


## 本件に取り組んだきっかけ
「突然壊れた」なんて言いたくありませんが、正直その感覚でした。
何なら昨日まではできていたのに…

昨日 `git push` した時から、今日のこの時までの間に何をしてしまったのか、原因が分からなかったので調べてみようと思いました。

## 事象の切り分け
まずはログを見てみようと考えました。
VSCodeのターミナルには、`OUTPUT` というタブがあります。
そこにGitがログを吐いていました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3821993/5f56e571-bd58-506d-e024-d58bfa8a6480.png)

`git fetch` をしようとして `Missing or invalid credentials.` と出ています。
日本語すら怪しい私は、すぐ翻訳サイトに頼りました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3821993/7dcfc5e8-9d9e-84f2-22e5-643373ad5aca.png)

そういえば昨日は、**ユーザ名やトークンを入れて認証した**覚えがありました。
それが今日は求められていないぞ…？
何となくだけど、VSCodeが怪しい気がしてきました。

## 調査開始
同事象で検索してみると、解決のためのページがいくつかヒットします。
* リモートリポジトリのURLを `HTTPS` から `SSH` に変えれば解決
* URLを登録する際に、ユーザ名と認証トークンを記載すれば解決

私はいま、httpsで接続しようとしてなぜか認証に失敗しています。

上記の通りに `SSH` で接続すれば、公開鍵認証方式に切り替わるため、解決しそうです。
また、ユーザ名と認証トークンを予め記載して接続すれば、`https` でも認証を通過しそうです。

でも、なんだか負けた気がします…
本質は、**ユーザ名やトークンを入れて認証を求められない**というところにあるのであって、正しい認証情報をそこに入れれば通るはずです。

## 調査結果
VSCodeはリモートリポジトリへの認証をどのようにして求めているのか について調べたところ、以下を見つけました。

> 組み込みの Git 拡張機能はGIT_ASKPASS環境変数を挿入して、VS Code が Git リモートへの認証を処理できるようにします。

https://code.visualstudio.com/docs/terminal/advanced#_extension-environment-contributions

`GIT_ASKPASS` ってなんだ？？

https://git-scm.com/book/ja/v2/Git%E3%81%AE%E5%86%85%E5%81%B4-%E7%92%B0%E5%A2%83%E5%A4%89%E6%95%B0

> GIT_ASKPASS は設定ファイルの core.askpass の値をオーバーライドします。 これはユーザによる認証情報の入力が必要なときに呼び出されるプログラムで、コマンドライン引数としてプロンプトのテキストを受け取り、応答を標準出力へ返すようになっている必要があります。 

まさに、認証情報を求め、受け取り、結果を返すという流れを担っているようです。

つまりそれが表示されなかったということは、`GIT_ASKPASS` 自体か、呼び出されるはずのプログラムに何らかの不具合が生じ、認証情報の入力を促すことができなかった、
結果、認証情報が未入力のまま `git push` しようとしたため怒られた。ということなのではないでしょうか。

## あらためて、対応
正直、ログからは何が原因で認証を求めなかったのか、掴むことはできませんでした。

ただ、`GIT_ASKPASS` は `core.askpass` をオーバーライドしているとのことなので、`GIT_ASKPASS` を初期化すれば `core.askpass` が使われそうです。

そして、自分は `core.askpass` という設定をしていません。
となると、恐らくターミナルからの標準入力を使いそうです。

と、いうことで最終的に `unset GIT_ASKPASS` として、環境変数を初期化することで、`git push` できるようになりました。

### 気がかり
今後、`GIT_ASKPASS` に依存している何らかの環境を使用してリモートリポジトリへ接続する場合、認証エラーになりそうだなと思います。
まぁ、その時は`SSH`を使えば良いかと考えています。

ただ、それを考えると最初から `SSH` に切り替えてしまうという対策が一番良かったのかもしれません。
CircleCIでElasticBeanstalkデプロイしようとしたら、タイムアウトエラーになった

## エラー内容
`$ aws elasticbeanstalk update-environment --region ap-northeast-1 .....`
コマンドを実行したところ、デプロイはできているっぽいなんですが、以下のエラーが発生しました。
```text
WARNING: terminal is not fully functional
Press RETURN to continue
....

....
Too long with no output (exceeded 10m0s): context deadline exceeded
```

## 解決方法
CircleCIの設定ファイルに、`AWS_PAGER`を空文字に設定することで解決しました。
```diff_text
deploy:
    environment:
      AWS_DEFAULT_REGION: ap-northeast-1
      AWS_PAGER: "" # aws-cli v2で有効になったページングプログラムを無効にする
    docker:
      - image: fooo:latest
    steps:
      - checkout
      ....
```

(aws-cliv2から有効になった機能によってこのような問題が引き起こされていたみたいです。)
詳しい情報は[こちら](https://qiita.com/frozenbonito/items/ba6fa54f0e3d879d4225)

## 終わりに
`AWS_PAGER`を設定したら、1分も掛からずに終わった😂

## 参考
https://qiita.com/frozenbonito/items/ba6fa54f0e3d879d4225

https://discuss.circleci.com/t/warning-terminal-is-not-fully-functional-cimg-python-3-8-node/36028
様々な Web サービス上で作成文書の更新を調査する

「Discord ボットを作ってみる」
https://qiita.com/nanbuwks/items/0206991f7c464209087b

を拡張して、「進捗どうですかボット」を作っています。

https://github.com/nanbuwks/discord_progress_check_bot


これは、特定の URL をクローしてハッシュを比較し、前回チェック時のハッシュ値と異なれば「捗ってますね」、変更なければ「進捗ないです」と表示するものです。


チェックするURLは、メンバーの手掛けている Google Drive 、 Qiita、GitHub、Wiki、Evernote など様々です。
しかしながら例えば Qiita の記事をクローしても、広告などが差し挟まれるためにコンテンツが更新されているかどうかそのままではわかりません。

そこでコンテンツを取得するために、サービスに合わせて調整することになります。
サービスごとにTipsをまとめました。
# 条件

- 作成文書を取得できる URL を調べる
- URL のアクセスは Get パラメータのみ
- URL のアクセスは Python の reqyests ライブラリで行う

# Qiita 

ページのURLの後に `.md` を加えると、本文の MarkDown ファイルが取得できます。
書きかけの記事の場合は、一旦限定共有公開にしておいてそれのページURLを用います。

# Google document


共有リンクが以下のようになっている場合、
`https://docs.google.com/document/d/1U3L5jIB5k7wjRRLh0pGhW-PWgspVDHhQKzuM0xNee6w/edit?usp=sharing`

`?`  から後ろを `?format=txt` に変更するとテキストファイルで取得できます。
   
`https://docs.google.com/document/d/1U3L5jIB5k7wjRRLh0pGhW-PWgspVDHhQKzuM0xNee6w/export?format=txt`

# GitHub


レポジトリURLが以下のようになっている場合、

`https://github.com/nanbuwks/discord_progress_check_bot`

以下のようにしてレポジトリの zip を取得して更新をチェックします。もう少し簡単な方法がないかな?

`https://github.com/nanbuwks/discord_progress_check_bot/archive/refs/heads/main.zip`


# PukiWiki

以下の記事
`http://openforce.project2108.com/index.php?%E8%83%BD%E7%99%BB%E5%8D%8A%E5%B3%B6%E6%94%AF%E6%8F%B42024Summer`
の本体はサーバに格納されている txt ファイルです。 記事名を UTF または EUC でエンコードして txt ファイル直リンクを作ります。

`http://openforce.project2108.com/wiki/E883BDE799BBE58D8AE5B3B6E694AFE68FB43230323453756D6D6572.txt`

# evernote 
共有リンクのURL

`https://www.evernote.com/shard/s738/sh/a026e155-b0b7-c840-799a-f9ad0993e1d6/uJ1ZvZT8afR4nFugZ8VPo3UKuUyleeji_VaKH1S956YTZF03GEGrnVrIzA`

に手を加えて以下のようにする。

`https://www.evernote.com/shard/s738/sh/a026e155-b0b7-c840-799a-f9ad0993e1d6/uJ1ZvZT8afR4nFugZ8VPo3UKuUyleeji_VaKH1S956YTZF03GEGrnVrIzA?json=1&rdata=0`



cf.,「Evernote の共有リンクから note の内容を取得」
https://qiita.com/nanbuwks/items/233a86031bad88005e59
},
SAP（FI領域）で使用される主な日付について

明確にSAP公式サイトには記載されていないこともあるため、備忘のため記載する


|    日付　     　   　    |    内容          |  
|:------------------------|:------------------|
| 仕訳日付                |システム上は影響しない日付。伝票の入力日付を使用するなど、各会社でルールを決めて任意に運用する。 |   
| 転記日付                | 仕訳が転記される日付。クローズしている会計期間を指定することはできない。|   
| 起算日                  |現預金勘定が反映される日付。転記日≠入金日の場合等に使用される。指定しない場合、入力時点の日付が適用される。 |   
| 換算日付                |為替換算レートの基準となる日付。|   
| 支払基準日              |支払の基準となる日付。（20日締め、翌月末払いの支払条件の場合、支払い基準日は20日の日付となる。|   
| 支払期日               | 支払の期日となる日付。支払基準日と支払条件を基に算出される。 |   
| 消込日付               |債権や債務などの未消込明細の消込を行た日付。消込を行った会計伝票の転記日が記録される。|   
| 消込入力日             |消込を行った会計伝票を登録した日付。|   
| 登録日付               |ユーザは使用しないが、システムで記録される伝票が登録された日付。|
【Tips】fileのURIフォーマットについて

# File URI schemeとは

> ファイル URI (Uniform Resource Identifier) スキームは、ホスト コンピューター上のファイルを具体的に識別するために使用される、特定の形式の URI です。
>> [wikipedia File URI scheme](https://en.wikipedia.org/wiki/File_URI_scheme)より

# URIフォーマット

- **fileスキームの基本構文**

```
file://host/path
```

- **ローカルファイルを指定する場合**

```
file://localhost/path
```

また`host`は省略して指定することも可能

```
file:///path/to/file
```

```
file:/path
```

この場合は暗黙的にローカルファイルの指定になる。

# 参考サイト

https://tex2e.github.io/rfc-translater/html/rfc8089.html

https://datatracker.ietf.org/doc/html/rfc8089

https://en.wikipedia.org/wiki/File_URI_scheme
AIに「QAの価値」のKPIツリー作らせてみた

大きくなったのでいくつかのツリーに分解しています

■メインツリー
```mermaid
graph TD;
    A[QA価値] -->|影響| B[コスト削減]
    A -->|影響| C[顧客満足度向上]
    A -->|影響| D[ブランド価値向上]
    A -->|影響| E[法的リスク回避]

    %% フィードバックループとメカニズム
    A -->|フィードバックとKPI更新| A

    %% 時系列データ
    A -->|時系列データ分析| T1[時系列データ]

    %% データソース
    A -->|データソース| DS[データソース]

    %% ユーザ例
    A -->|ユーザ例: 製品XのQA| U1[ケーススタディ：製品XのQA改善]

    %% リアルタイムデータ連携
    B & C & D & E -->|ダッシュボード連携| RT[リアルタイムデータ]
```
■コスト削減ツリー
```mermaid
graph TD;
    B[コスト削減] --> F[バグ修正コスト削減]
    B --> G[再作業コスト削減]
    B --> H[サポートコスト削減]

    F --> I[修正バグ数]
    F --> L[バグ1件当たりの修正コスト]
    
    I --> J[過去データ予測バグ数]
    I --> K[現在の修正バグ数]

    L --> M[修正に要する時間]
    L --> N[時間単価]

    G --> O[再作業時間]
    G --> R[再作業の時間単価]

    O --> P[防止された再作業時間]
    O --> Q[現在の再作業時間]

    H --> S[サポート件数削減]
    H --> V[サポート1件当たりのコスト]
    
    S --> T[過去データ予測サポート件数]
    S --> U[現在のサポート件数]
```
■顧客満足度向上ツリー
```mermaid
graph TD;
    C[顧客満足度向上] --> W[顧客満足度スコア向上]
    C --> X[顧客維持率向上]

    W --> Y[顧客アンケート（例：CSAT、NPS）]
    W --> Z[SNS評価]

    X --> AA[継続購入顧客数]
    X --> DD[顧客生涯価値（LTV）]

    AA --> BB[過去の継続購入データ]
    AA --> CC[現在の継続購入数]
```
■ブランド価値向上ツリー
```mermaid
graph TD;
    D[ブランド価値向上] --> EE[ブランド認知度向上]
    D --> FF[市場占有率向上]

    EE --> GG[ブランド調査スコア]
    EE --> HH[ソーシャルメディア言及数]

    FF --> II[売上比率増加]
    II --> JJ[他社とのベンチマーク比較]
```
■法的リスク回避ツリー
```mermaid
graph TD;
    E[法的リスク回避] --> KK[コンプライアンス遵守]
    E --> LL[罰金回避額]

    KK --> MM[定期監査合格率]
    KK --> NN[コンプライアンス違反回避数]

    LL --> OO[法的罰金過去データからの予測]
```
```mermaid
graph TD;
    DS --> D1[バグトラッキングシステム]
    DS --> D2[時間管理システム]
    DS --> D3[サポートデータベース]
    DS --> D4[顧客調査システム]
    DS --> D5[ブランド調査データ]
```

■感想
こういうのが秒でできるのはすごい
ubuntu24.04LTS, ROS2 Jazzy環境でLIVOXを使う

# はじめに

ubuntu24.04LTS, ROS2 Jazzy環境でもLiVOX-SDK2とlivox_ros_driver2使うことができたが、SDK2に一部変更が必要だったので、LiVOX-SDK2とlivox_ros_driver2インストールからrviz2で点群を確認するまでのメモです。


# Livox-SDK2のインストール

```bash
git clone https://github.com/Livox-SDK/Livox-SDK2.git
cd Livox-SDK2/
mkdir build
cd build
cmake .. && make -j
sudo make install
```

git clone したらコードの編集
sdk_core/comm/define.hとsdk_core/logger_handler/file_manager.h に以下を追加します。

```cpp
#include <cstdint>
```




# livox_ros_driver2のインストール



```bash
mkdir  -p  livox_ws/src
cd livox_ws/src/
git clone https://github.com/Livox-SDK/livox_ros_driver2.git
cd livox_ros_driver2
./build.sh humble
```

PCLがないというエラーがでる。



```bash
~/livox_ws/src/livox_ros_driver2$ ./build.sh humble
Working Path: /home/mori/livox_ws/src/livox_ros_driver2
ROS version is: ROS2
Starting >>> livox_ros_driver2
--- stderr: livox_ros_driver2                         
CMake Error at /opt/ros/jazzy/share/pcl_conversions/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package):
  By not providing "FindPCL.cmake" in CMAKE_MODULE_PATH this project has
  asked CMake to find a package configuration file provided by "PCL", but
  CMake did not find one.

  Could not find a package configuration file provided by "PCL" with any of
  the following names:

    PCLConfig.cmake
    pcl-config.cmake

  Add the installation prefix of "PCL" to CMAKE_PREFIX_PATH or set "PCL_DIR"
  to a directory containing one of the above files.  If "PCL" provides a
  separate development package or SDK, be sure it has been installed.
Call Stack (most recent call first):
  /opt/ros/jazzy/share/pcl_conversions/cmake/pcl_conversionsConfig.cmake:41 (include)
  /opt/ros/jazzy/share/ament_cmake_auto/cmake/ament_auto_find_build_dependencies.cmake:67 (find_package)
  CMakeLists.txt:225 (ament_auto_find_build_dependencies)
```

PCLインストールして再度 ./build実行

```bash
sudo apt install libpcl-dev ros-jazzy-pcl-ros
./build.sh humble
```

# 参考記事


https://proc-cpuinfo.fixstars.com/2023/01/livox-mid360-ros1-ros2/


https://qiita.com/porizou1/items/827d596acae993a61290

https://zenn.dev/ryuzot/articles/ee24b2755024a6
【備忘録】jdbcドライバとマッピング定義

最近、コードもDBの設定も同じなのにエラーになるプロジェクトとならないプロジェクトがありました。

なにが原因か調べたところ、JDBCドライバのマッピング定義が関係しているようで、それをまとめていこうと思います。

<h2>エラー内容</h2>
まずどんなエラーが出ていたかというと、SELECT文でDBから値を取ってきたところで型の不整合でClassCastExceptionになるという内容でした。

具体的には、current_timestamp()で取り出した値の型が以下の様になってました。

上手くいっている方：LocalDateTime
上手くいってない方：Timestamp

<h2>原因究明</h2>
色々調べていく中で、マッピング定義というものを見つけました。
マッピング定義とは、DB上のデータの型をJava上で扱うときにJavaに合わせた型に変換する決まりのことです。

例えば↓の様なのがあります。

| DB | Java |
|:-:|:-:|
|  CHAR | String  |
|  bigint |  long |

みたいな感じです。

じゃあ、何故取り出し方がそれぞれのプロジェクトで違ってしまっていたのでしょうか。

<h2>JDBCドライブ設定</h2>
調べていくと、どうやらJDBCドライバによって若干マッピング定義が違うことがあるそうです。

2つのプロジェクトを見比べると、確かにDB設定のファイルで記述されているJDBCドライバが違いました。

上手くいっている方：MySQL
上手くいってない方：mariaDB

実際にJDBCドライバを上手くいっている方に合わせてみると、ちゃんとLocalDateTimeで値を取ってくることが出来ました。

こんな所で結構変わるんですねぇ。。

<h2>まとめ</h2>
SQLで取ってくる値が想定と違う場合、JDBCドライバを見直してみるのも重要かもしれませんね。

特別な制約が無ければ、取ってきた値をJava上で変換してあげた方が楽なんでしょうが。

また、今回のプロジェクトではmariaDBを使ってたんですが、ドライバはmySQLの物を使用しました。問題なく動作しています。

mariaDBとmySQLは互換性があるそうなので大丈夫らしいんですが、ドライバをいじるときはちゃんと動作するかは要確認ですね。
【Ruby】between?でtime.zoneを範囲指定として渡す際の注意点

Rubyの`between?()`の返り値が想定と違かった原因をメモ。

```Ruby:
now = Time.zone.now
start_time = Time.zone.parse("2024/07/01 12:00")
end_time = Time.zone.parse("2024/07/31 23:59")

if now.between?(start_time, end_time)
  ~...
end
```
データとしてはこんな感じ。
`now`が`2024/07/31 23:59`になったと仮定して動作を確認していたら
条件がfalseになってif文に入らなかった。
## 原因
`end_time`をparseしたときに秒数を指定していないので、
`now`が`23:59:00`以降になると分岐条件がfalseになってif文に入らない。
## 解決策
終了時刻は秒数を指定する。
```Ruby:
end_time = Time.zone.parse("2024/07/31 23:59")
↓
end_time = Time.zone.parse("2024/07/31 23:59:59")
```

文章にするとそうだよねってなるのに、
いざ直面すると焦って思い出せなかった・・・orz

## 加筆
コメントでご教示いただいたもの。ありがとうございました。
### 指定の年月の月の全範囲を取得する
**■ all_month**
```ruby:all_month
start_time = Time.zone.parse("2024/07/01")
month = start_time.all_month # → 2024/07/01 00:00 ~ 2024/07/31 23:59
month.cover?(Time.current) # → true
```

`all_month`メソッドは`start_time`に時間を指定したtime型の値が入っていても月の最初の日付の`00:00`になることに注意。

### 指定の年月の最終日時を取得する
**■ end_of_month**
```ruby:end_of_month
start_time = Time.zone.parse("2024/07/01")
end_time = start_time.end_of_month # → 2024/07/31 23:59
Time.current.between?(start_time, end_time) # → true
```

今回の事象の場合は`end_of_month`を使用すると私みたいな人は書き忘れが防げそう。
適合確認システム: モックアップの作成 (その4)

こちらのシステムのユーザーインターフェースを改善して、複数の CSV ファイルをアップロードできるようにしました。
[適合確認システム: モックアップの作成 (その3)](https://qiita.com/ekzemplaro/items/ac6de291aae1bfde64ef)

## ChatGPT への依頼

```text
複数のCSV ファイルをアップロードして、結果を一括で表示して下さい。
```

## ChatGPT の回答

フォルダー構造

```text
$ tree
.
├── app.py
└── templates
    └── index.html
```

```py:app.py
from flask import Flask, request, render_template, session
import csv
from io import TextIOWrapper

app = Flask(__name__)
app.secret_key = 'your_secret_key_here'  # セッションを使用するための秘密鍵

# ホームページの表示
@app.route('/')
def index():
    results = session.pop('results', []) if 'results' in session else []
    return render_template('index.html', results=results)

# ファイルのアップロードと処理
@app.route('/upload', methods=['POST'])
def upload():
    if 'csvfiles' not in request.files:
        return "ファイルがありません"

    csvfiles = request.files.getlist('csvfiles')

    uploaded_files = []
    
    for csvfile in csvfiles:
        if csvfile.filename == '':
            continue
        
        try:
            csv_reader = csv.reader(TextIOWrapper(csvfile, 'utf-8'))
            header = next(csv_reader)  # ヘッダーを読み飛ばす
            num_columns = len(header)
            num_rows = sum(1 for row in csv_reader)

            result = {
                'filename': csvfile.filename,
                'num_columns': num_columns,
                'num_rows': num_rows
            }
            uploaded_files.append(result)

        except Exception as e:
            return f"エラーが発生しました: {str(e)}"

    session['results'] = uploaded_files  # 結果をセッションに保存

    return render_template('index.html', results=uploaded_files)

if __name__ == '__main__':
    app.run(debug=True)
```

```html:templates/index.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>複数のCSVファイルをアップロード</title>
</head>
<body>
    <h2>複数のCSVファイルをアップロードしてください</h2>
    <form action="/upload" method="post" enctype="multipart/form-data">
        <input type="file" name="csvfiles" accept=".csv" multiple>
        <button type="submit">ファイルをアップロード</button>
    </form>

    <!-- 結果一覧を表示する領域 -->
    {% if results %}
    <div style="margin-top: 20px;">
        <h3>アップロードされたCSVファイルの情報一覧:</h3>
        <ul>
            {% for result in results %}
            <li>
                <p>ファイル名: {{ result['filename'] }}</p>
                <p>列数: {{ result['num_columns'] }}, 行数: {{ result['num_rows'] }}</p>
            </li>
            {% endfor %}
        </ul>
    </div>
    {% endif %}
</body>
</html>
```

## サーバーの実行

```bash
python app.py
```

## クライアント

[http://127.0.0.1:5000/](http://127.0.0.1:5000/) にアクセス

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/9acee1a1-d51d-628d-9c55-0107249e0579.png)

CSV をアップロードした後の画面

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/5b22afff-92b0-7587-8631-760734acc886.png)
【Linux入門】/proc/self/environで環境変数を取得する

# `/proc`ディレクトリー

> /procディレクトリは、普通のファイルシステムと違い、ハードディスクやSSDなどのストレージ上ではなく、メモリの中に作られるファイルシステムです。
>> [Linuc /procディレクトリのファイル](https://linuc.org/study/knowledge/526/)より

# `/proc/self`ディレクトリー

>  /proc/self/ ディレクトリーは、現在実行中のプロセスへのリンクです。これにより、プロセス ID を把握せずにプロセスが自身を確認できます。
シェル環境内では、/proc/self/ ディレクトリーの一覧が、そのプロセスのプロセスディレクトリーの一覧表示と同じ内容を生成します。 
>> [Red Hat Documentation E.3. /proc/ 内のディレクトリー](https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/6/html/deployment_guide/s1-proc-directories)より

```
# ls -l /proc/self
lrwxrwxrwx. 1 root root 0 Jun 17 22:51 /proc/self -> 9352
```

# `/proc/self/environ`ファイル

`/proc/self/environ`で起動時の環境変数一覧を取得できます。

> environ - プロセスの環境変数一覧。環境変数は大文字で指定され、値は小文字です。 
>> [Red Hat Documentation E.3. /proc/ 内のディレクトリー](https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/6/html/deployment_guide/s1-proc-directories)より

```
# cat /proc/self/environ | tr '\0' '\n'
LANG=en_US.UTF-8
GDM_LANG=en_US.UTF-8
HISTCONTROL=ignoredups
DISPLAY=:0
HOSTNAME=localhost.localdomain
COLORTERM=truecolor
USERNAME=root
XDG_VTNR=2
SSH_AUTH_SOCK=/run/user/0/keyring/ssh
which_declare=declare -f
XDG_SESSION_ID=2
USER=root
DESKTOP_SESSION=gnome
WAYLAND_DISPLAY=wayland-0
GNOME_TERMINAL_SCREEN=/org/gnome/Terminal/screen/853b9b4e_bc70_4045_add9_5e25e773af48
PWD=/root
(省略)
```

# 参考サイト

https://linuc.org/study/knowledge/526/

https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/6/html/deployment_guide/s1-proc-directories
Windows PC で vCard を CSV 形式に変換/移動する簡単な方法

<p>この記事の主な焦点は、「vCard を CSV に変換する」方法です。vCard (仮想連絡先ファイル) ファイルを CSV (カンマ区切り値) ファイルに変換するために、安全なスタンドアロン プログラムを作成しました。連絡先データは、CSV 形式のファイルと vCard 形式の両方で保存されます。</p>
<p>では、CSV ファイルと vCard についてさらに詳しく説明しましょう。</p>
<h2><strong>VCF ファイルとは何ですか? また、ユーザーが VCF を CSV に保存したいのはなぜですか?</strong></h2>
<p>名前、電話番号、住所、電子メール アドレスなどの情報は、vCard ファイルまたは VCF ファイルに保存されます。Windows コンピューター上のどの連絡先プログラムでも、vCard ファイルを開くことができます。vCard ファイルにはいくつかのバージョンがあります。たとえば、vCard 2.1 はモバイル デバイス用に設計されており、vCard 3.0 は Web メールとクラウド サーバー用です。</p>
<p>対照的に、CSV ファイルは、連絡先または情報データを区切るためにコンマが使用されているプレーン テキスト ファイルです。CSV ファイルは、連絡先を保存したり、電子メール システム間で連絡先を転送したりするために最も広く使用されているファイル拡張子です。Excel シートで表示できます。</p>
<h2><strong>信頼できるツールでvCardをCSVに変換する</strong></h2>
<p>複数の連絡先リストを持つ <a target="_blank" rel="noopener noreferrer" href="https://www.datavare.com/jp/address.html"><strong>Windows PC で vCard を CSV 形式に変換/移動する</strong></a><strong> </strong>ための 1 つのソリューションは、<strong>DataVare アドレス帳マネージャー</strong>です。このプログラムを使用して、データの整合性を維持しながら vCard ファイルを Excel CSV 形式にエクスポートしています。このプログラムはあらゆる種類の VCF ファイルに対応しており、データの整合性を維持しながら効率的に CSV 形式に変換します。アドレス帳マネージャー ソフトウェアは、多くの機能に加えて、高度なアルゴリズムを使用してファイル拡張子を変更します。100% 安全で信頼性の高い CSV 形式の結果を提供します。</p>
<h3><strong>連絡先を VCF から CSV に変換するテクニック</strong></h3>
<p>DataVare ツールボックスのルールに従って、VCF ファイルを CSV ファイルに変換します。</p>
<ul>
    <li>まず、「ファイルの追加」または「フォルダの追加」を使用して vCard ファイルを追加します。次へボタンを押します。</li>
    <li>vCard 連絡先ファイルを調べるには、スキャンしたファイルから必要なファイルを選択し、「vCard 連絡先の詳細」をクリックします。</li>
    <li>次に、「変換」メニューから「他の形式に変換」を選択します。CSV ファイル形式を選択します。</li>
    <li>最後に、「OK」をクリックして変換プロセスを開始します。</li>
    <li>*.csv ファイルのフォルダが直接開きます。</li>
</ul>
<p>アプリケーションは変換メソッドを有効にし、代替ファイル形式で実際の結果を提供します。手順からわかるように、コンピューターの専門知識がなくても、vCard を CSV に変換できます。</p>
<h3><strong>トライアル版とプロ版</strong></h3>
<p>プログラムには、試用版とプロ版の 2 つのバージョンがあります。ツールの試用版はテスト専用で、ツールの動作を包括的に把握できます。機能を最大限に活用し、いくつかの VCF ファイルを無制限に CSV 形式に変換してください。前述の URL を使用してプロ版をアクティブ化することもできます。更新されたコンバーター ツールをオンにして、無制限の数の vCard 連絡先を CSV にエクスポートします。</p>
<h3><strong>最終的な考え</strong></h3>
<p>このページには、vCard を CSV に変換するソフトウェアに関するすべての詳細が記載されています。自動化ツールの機能により、vCard を CSV に変換するのは簡単で、難しいプロセスは必要ありません。どのバージョンでも、手順に従って VCF ファイルを編集してください。ユーティリティのフル エディションを購入するか、購入する前に試してみてください。この方法を使用して、多数の *.vcf 拡張子を *.csv 形式に変換します。このリストのタスクを問題なく実行できます。</p>
github actionsからAzure appserviceへのデプロイが失敗する（"Bad Request"とか出てる）

## タイトルの通りでいつも失敗していた
* いい加減不便すぎるので調査した
* githubやazureの不具合、というよりもactionsの仕様？的なものだった

### 失敗原因
* commitメッセージがマルチバイト文字を含んでいて、長い文章になっていると失敗する。
#### 対策
* マージ時などのコミットメッセージは短くしておく

## 調査内容
* 通常時のエラーメッセージ

``` 
Error: Failed to deploy web package to App Service.
Error: Deployment Failed, Error: Failed to deploy web package to App Service.
Bad Request (CODE: 400)
```

こんな内容なので正直よくわからん。
なのでDebug有効にして再度Job実行
すると↓(一部省略済み)

```
##[debug][POST] https://hogehoge.scm.azurewebsites.net/api/zipdeploy?isAsync=true&deployer=GITHUB_ZIP_DEPLOY&message=(ここがめちゃ長い)
##[debug]Could not parse response body.
##[debug]{}
##[debug]ZIP Deploy response: {"statusCode":400,"statusMessage":"Bad Request","headers":{"content-length":"3944","content-type":"text/html; charset=utf-8","date":"Tue, 25 Jun 2024 05:29:41 GMT","server":"Microsoft-IIS/10.0","cache-control":"private","x-aspnet-version":"4.0.30319","x-powered-by":"ASP.NET"},"body":"<!DOCTYPE html>\r\n<html>\r\n    <head>\r\n        <title>The length of the query string for this request exceeds the configured maxQueryStringLength value.</title>\r\n        <meta name=\"viewport\" content=\"width=device-width\" />\r\n        <style>\r\n         body {font-family:\"Verdana\";font-weight:normal;fonts.-->"}
Error: Failed to deploy web package to App Service.
Error: Deployment Failed, Error: Failed to deploy web package to App Service.
Bad Request (CODE: 400)
```

どうやらzipdeploy叩いてるときにめちゃ長いURLになっている様子。
めちゃ長くなっている部分をURLデコードしてみるとコミットメッセージとかが入ってる。
これが原因で失敗しているみたいだ。

### azure/webapps-deploy@v2 task
https://learn.microsoft.com/ja-jp/azure/devops/pipelines/tasks/reference/azure-rm-web-app-deployment-v2?view=azure-pipelines
ここから見るに、デプロイ時にmessageをカスタマイズする方法はなかった。

### action src
https://github.com/Azure/webapps-deploy/blob/master/src/actionparameters.ts
ここにある。
中をさらに見てみると、commitMessageの指定部分
https://github.com/Azure/webapps-deploy/blob/5c1d76ea769631d040d04d0883468281f78a2375/src/actionparameters.ts#L57
で１０００文字までに制限していた。
ただマルチバイトを想定してない？のかこれだと多分不十分なんだろう。

原因がわかったのでコミットメッセージを短くして再度Action動かすと問題なくデプロイできた。
今更感すごいけどDiscordBotの作り方をおさらい(暇人向け)

## なぜ作ろうと思ったのか
・discord botの作り方を調べたときにintentsが含まれていない旧式のコードが見受けられるため
・単純に暇であるため

## 実行環境
Windows 11 Pro x64
Python 3.12.3 (新しくて感動)

## 準備
Pythonのインストール
 discord.pyのインストール
discord botのtokenを取得
(これらは他の記事等に大量に記載されてるので割愛)

## 実装
windowsを想定して作成しているのでエクスプローラーを開いて空白部分を右クリックから新規作成でテキストファイル等を作成、名前を変更から拡張子を.pyにする。

## ちょっとめんどくさくなってきたので
次のコードをコピー&ペーストしてみましょう
初心に戻って基礎的なコードを書いてみました
```py
# 確実に必要なコードたち
import discord
token = '準備で記載したbotのtokenをここに入力'
# 人によってtokenを環境変数に入れろとか言ってくるのですが
# めんどくさいし初心者には難しい、あと自分はこうするのでこっちにします

intents = discord.Intents.all()
client = discord.Client(intents=intents)

@client.event
async def on_ready(): # 接続した際に呼び出される
    print(f'ログインしました {client.user}')

@client.event
async def on_message(message): # 参加しているサーバーなどでメッセージが送られた際に呼び出される
    if message.author == client.user: # 送信者がbot自身かどうかを調べる
        return # キャンセル

    if message.content.startswith('!hello'): # 文字が"!hello"から始まる場合
        await message.channel.send("こんにちは！") # "こんにちは！"と送信元のチャンネルに送信

client.run(token) # botを起動するコマンド(これも絶対にいる)
```

## 実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3793169/e81dcd7b-a142-2c29-1644-614afaa6eadc.png)
実行して何かエラーが出た人はおそらくintentエラーです
discord developer potalでbotタブのintentから設定できます

## まとめ
簡単なメッセージを返すコードが完成しました
たまにはこういう簡単なコードを書くのも悪くないですね
説明が滞りない部分があるのはもう優しさでスルーしてください;

## 宣伝
実行の際のBOT名に含まれてますが、DNXS.xyzというサービスを作りました!
自宅サーバーやVPSのIPなどを無料でドメイン化できます
こういうことに興味のある人達があつまるのでサービス利用目的でなくても
コミュニティ参加という意味で参加してくれると嬉しいです!
https://discord.gg/M2bQGhpUnV

やばい充電9% w
Gmailからさくらメール経由で送信したメールのDKIM設定がエラー

## 背景

「DKIM認証エラーになってるんですが・・・」と問い合わせがあった

## 調査結果

- AWS SESから送信しているものはOK
- メールクライアント（Gmail）からさくらメールサーバを経由して送信しているもので当該事象が発生
    - さくらメール(コントロールパネル）のDKIMは設定済

[![Image from Gyazo](https://i.gyazo.com/67bb342b12dd295ad8d439b37d21b8ef.png)](https://gyazo.com/67bb342b12dd295ad8d439b37d21b8ef)

[![Image from Gyazo](https://i.gyazo.com/d386c1db17974f4d8ddd6f6cb5960bcf.png)](https://gyazo.com/d386c1db17974f4d8ddd6f6cb5960bcf)

## 原因

ネームサーバーにさくら用のDKIMの公開鍵が未設定だった

## 対処

ネームサーバーのDNSレコードに公開鍵を追加

|#|値|
|:-|:-|
|タイプ|TXT|
|名前|`さくらメールDKIM設定のセレクタ`._domainkey.`ドメイン名`<br>今回の場合は`rs20240201`._domainkey.`ドメイン名`|
|値|v=DKIM1; k=rsa; p=公開鍵の改行除いたもの|

`p=`に設定する値は、公開鍵が以下であれば、、、

```
-----BEGIN PUBLIC KEY-----
aaaaaaa.........
bbbbbbb.....
ccccccc.......ddddd
-----END PUBLIC KEY-----
```

こう

```
aaaaaaa.........bbbbbbb.....ccccccc.......ddddd
```
入茶までの道のり【AtCoder】

# はじめに
AtCoderでレーティングが茶色になるまでにしたことなどを中心に書きます。

# 目次
[0. 自己紹介](#0-自己紹介)
[1. AtCoderを始める前と現時点での成績](#1-atcoderを始める前と現時点での成績)
[2. 初めてのコンテストまでにしたこと](#2-初めてのコンテストまでにしたこと)
[3. 入茶までにしたこと](#3-入茶までにしたこと)
[4. しなかったこと](#4-しなかったこと)


# 0. 自己紹介
- 現在(6. 2024)大学3年生
- 国立大学の情報系＆電気電子系の学科所属
- 数学はあまり得意でない

# 1. AtCoderを始める前と現時点での成績
## 始める前
私がAtCoderを始めたのが大学2年生の春休み(3. 2024)で、その時点でのプログラミング能力については次のような状態でした。

- C, Python, Javaを大学の講義で学習
- Unityに触れた際C#を少し学んだ
- BFSやDFS、ソートアルゴリズムは実装経験あり
- その他の一部のアルゴリズムは知識として知っているだけ

情報系の学生としては最低限のことしかやっていないぐらいだと思います。

## 現在のAtCoderの成績
2024年3月からAtCoderを始め、2024年5月に入茶しました。現在までの成績は次の通りです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3800844/4c1386bd-19de-1781-6ae3-22d43ac1d9f1.png)
入茶から2か月弱経ってしまいましたが、思い出しながら書いていきます。


# 2. 初めてのコンテストまでにしたこと
まずは使用する言語を選びました。私は実行速度の速いC++でやることに決めました。C++に決めたのにはPythonの文法が個人的に好みではないという理由もありました。C++の基本を学ぶために、APG4bを1週間かけて最初から最後まで学習しました。プログラミングが初めてな方は、3章以降を後回しにしてコンテストに参加してみるというのもありだと思います。あとは手元のPCで自分の選んだ言語の環境を構築しておくとよいです。バグなどにぶつかった際に、デバッグを手元のPCで行えると実装スピード的に有利なためです。C++であったら、WSLとVSCodeを使っておけば問題ないと思います。


# 3. 入茶までにしたこと
私個人の感覚ですが、入茶するためにはA, B問題は確実に、C問題は6割程の正答率で解く必要があります。このような状態になるまでに次のようなことをしました。

## 解きなおしをする
当たり前のことですが解けなかった問題を解きなおしました。復習をすることで新たなテクニックやアルゴリズム、データ構造（しゃくとり法、Union-Findなど）を知ることができました。この段階ではD問題以上の復習をする必要はないと思います。D問題以上を解けることよりも、C問題までを確実に解くことが大切なため、C問題までを解答できるようになることを優先しました。解きなおしをするときに、AtCoder Problemsで問題の難易度から問題を選ぶこともありました。

## ABCの過去問を解く
ABCの過去問を解きました、ただ解くのではなく、バーチャル参加を使い、時間を計って解きました。コンテストでは解くのが速いほどパフォーマンスも大きく上昇するため、時間を意識して問題を解かざるを得ません。過去問演習でも時間を計りながら解くことで本番のコンテストの練習にもなります。

## 全探索をできるようになる
C問題には全てではありませんが、全探索をすることで解ける問題が多くあります。全探索は正しく実装できさえすれば確実に点をとることができるため、全探索ができることのメリットは非常に大きいです。問題を解く際、まずは全探索で解けるか考えてみることをお勧めします。

## 計算量を意識する
C問題には時々全探索を用いると実行時間制限超過(TLE)になってしまう問題があります。アルゴリズムを実装する前に、そのアルゴリズムの最悪計算量を計算するようにしました。実行時間制限が2.0secの場合、計算量の限界はおおよそ$10^8$から$10^9$までであると思います。


# 4. しなかったこと
逆にしなかったことについても簡単に書きます。

- 蟻本を買う 
灰色の段階では必要なかったです。
- D問題以上の復習
解説を見ても分からなかったことが多かったので、後回しにしました。比較的簡単なD問題なら解いてもいいと思います。
- 動的計画法(DP)の問題を解く
茶色になるのにDPが解ける必要はないです。緑を目指すなら必要かもしれません。


# おわりに
人によっては茶色になるのには時間がかかるかもしれませんが、初めてレーティングに色がつくだけでも自信がつきますし、大きな喜びを得られるので頑張ってください。私も頑張ります。
acsessでエクセルをマージする方法

```vb
Sub MergeExcelFilesAndExport()
    Dim fso As Object
    Dim folder As Object
    Dim file As Object
    Dim xlApp As Object
    Dim xlWb As Object
    Dim xlWs As Object
    Dim newWb As Object
    Dim newWs As Object
    Dim db As DAO.Database
    Dim rs As DAO.Recordset
    Dim firstFile As Boolean
    Dim headerCount As Integer
    Dim newRow As Long

    ' フォルダパスを指定
    Const folderPath As String = "C:\Your\Folder\Path"
    ' エクスポート先のファイルパスを指定
    Const exportFilePath As String = "C:\Your\Export\Path\MergedData.xlsx"

    ' FileSystemObject のインスタンスを作成
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set folder = fso.GetFolder(folderPath)

    ' Excel のインスタンスを作成
    Set xlApp = CreateObject("Excel.Application")
    xlApp.Visible = False

    ' 新しいエクセルファイルを作成
    Set newWb = xlApp.Workbooks.Add
    Set newWs = newWb.Sheets(1)

    ' Access データベースを開く
    Set db = CurrentDb

    ' 一時テーブルを作成 (既に存在する場合は削除してから作成)
    On Error Resume Next
    db.Execute "DROP TABLE TempMergedData"
    On Error GoTo 0
    db.Execute "CREATE TABLE TempMergedData (Field1 Text, Field2 Text, Field3 Text)" ' フィールド名とデータ型を適宜設定

    ' ファイルごとにデータを読み込む
    firstFile = True
    For Each file In folder.Files
        If LCase(fso.GetExtensionName(file.Name)) = "xlsx" Then
            Set xlWb = xlApp.Workbooks.Open(file.Path)
            Set xlWs = xlWb.Sheets(1)

            ' 最初のファイルのヘッダー行数を取得
            If firstFile Then
                headerCount = xlWs.UsedRange.Rows(1).Cells.Count
                firstFile = False

                ' 新しいワークシートにヘッダーを追加
                Dim col As Integer
                For col = 1 To headerCount
                    newWs.Cells(1, col).Value = xlWs.Cells(1, col).Value
                Next col
                newRow = 2
            End If

            ' データをレコードセットに追加
            Set rs = db.OpenRecordset("TempMergedData", dbOpenDynaset, dbAppendOnly)
            Dim row As Integer
            Dim data As Variant
            For row = 2 To xlWs.UsedRange.Rows.Count ' 2行目から読み込み (ヘッダー行を除く)
                rs.AddNew
                For col = 1 To headerCount
                    data = xlWs.Cells(row, col).Value
                    rs.Fields(col - 1).Value = data
                    ' 新しいワークシートにデータを追加
                    newWs.Cells(newRow, col).Value = data
                Next col
                rs.Update
                newRow = newRow + 1
            Next row
            rs.Close
            xlWb.Close False
        End If
    Next file

    ' 新しいエクセルファイルを保存
    newWb.SaveAs exportFilePath
    newWb.Close False

    ' Excel を終了
    xlApp.Quit

    ' クリーンアップ
    Set newWs = Nothing
    Set newWb = Nothing
    Set xlWs = Nothing
    Set xlWb = Nothing
    Set xlApp = Nothing
    Set rs = Nothing
    Set db = Nothing
    Set folder = Nothing
    Set fso = Nothing

    MsgBox "Excel ファイルのマージとエクスポートが完了しました。", vbInformation
End Sub
```
インスタンス化に関して等、備忘録

`MyClass* obj;` と `MyClass obj;`

目を細めてみたら同じに見えるこの二つは大きく異なるようです。
前者はオブジェクトがインスタンス化されておらず、後者はインスタンス化されています。
## 前者(ポインタのほう)
**`MyClass* obj;`**
これはobjという、MyClass型のポインタ変数を作っただけです。**`obj = new MyClass();`といった処理で初めてメモリが確保され、オブジェクトがインスタンス化されます。**

他の例では、例えば`int* x`では「int型のポインタ変数x」を宣言します。****この時点ではメモリは確保されません。****`x = new int;`とかを書いて初めてメモリが確保されます。
## 後者(ポインタじゃない変数の方)
**`MyClass obj;`**
これはオブジェクトがインスタンス化され、メモリも同時に確保されます。

:::note info
以降は追記した細かい内容になります
:::

## new 演算子を使用した場合、その結果は自動的にポインタになる。
地味に知らなかった...いつも「なんで"&"がないんだ...?」ってなってたのでスッキリしました。ポインタにそのまま`pointa = new ...`として代入できるんですね。

## まとめ
順次わかりづらい部分を発見したら追記しようと思います。初学者の方々の助けになれば幸いです(僕も初学者ですが...)。
適合確認システム: モックアップの作成 (その3)

こちらのシステムのユーザーインターフェースを改善して、アップロードした CSV ファイルの名前を表示するようにしました。
[適合確認システム: モックアップの作成 (その2)](https://qiita.com/ekzemplaro/items/9ce08e1496d617683603)

## ChatGPT への依頼

```text
最後にアップロードされたCSVファイルの名前も表示して下さい。
```

## ChatGPT の回答

フォルダー構造

```text
$ tree
.
├── app.py
└── templates
    └── index.html
```

```py:app.py
from flask import Flask, request, render_template, session
import csv
from io import TextIOWrapper

app = Flask(__name__)
app.secret_key = 'your_secret_key_here'  # セッションを使用するための秘密鍵

# ホームページの表示
@app.route('/')
def index():
    result = session.pop('result', None) if 'result' in session else None
    filename = session.pop('filename', None) if 'filename' in session else None
    return render_template('index.html', result=result, filename=filename)

# ファイルのアップロードと処理
@app.route('/upload', methods=['POST'])
def upload():
    if 'csvfile' not in request.files:
        return "ファイルがありません"

    csvfile = request.files['csvfile']
    if csvfile.filename == '':
        return "ファイルがありません"

    # CSVファイルを読み込み、列数と行数を取得
    try:
        csv_reader = csv.reader(TextIOWrapper(csvfile, 'utf-8'))
        header = next(csv_reader)  # ヘッダーを読み飛ばす
        num_columns = len(header)
        num_rows = sum(1 for row in csv_reader)
        
        result = f"列数: {num_columns}, 行数: {num_rows}"
        filename = csvfile.filename
        session['result'] = result  # 結果をセッションに保存
        session['filename'] = filename  # ファイル名もセッションに保存

        return render_template('index.html', result=result, filename=filename)
    
    except Exception as e:
        return f"エラーが発生しました: {str(e)}"

if __name__ == '__main__':
    app.run(debug=True)
```

```html:templates/index.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>CSVファイルアップロード</title>
</head>
<body>
    <h2>CSVファイルをアップロードしてください</h2>
    <form action="/upload" method="post" enctype="multipart/form-data">
        <input type="file" name="csvfile" accept=".csv">
        <button type="submit">ファイルをアップロード</button>
    </form>

    <!-- 結果を表示する領域 -->
    {% if result %}
    <div style="margin-top: 20px;">
        <h3>最後にアップロードされたCSVファイルの情報:</h3>
        <p>ファイル名: {{ filename }}</p>
        <p>{{ result }}</p>
    </div>
    {% endif %}
</body>
</html>
```

## サーバーの実行

```bash
python app.py
```

## クライアント

[http://127.0.0.1:5000/](http://127.0.0.1:5000/) にアクセス

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/91f722c2-92a3-5836-2088-a6fb6c70cdc8.png)

CSV をアップロードした後の画面

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/de373f47-6b9d-f020-55cf-f5257f665f6f.png)
【超初心者向け】SQLに関連する用語集

# 概要
SQLに初めて触る際に、分からなかった用語を自分なりに纏めています。
※勉強次第随時更新予定。

# 目次
- [DDL](#DDL)
- [DML](#DML)
- [DCL](#DCL)
- [TCL](#TCL)
- [サブクエリ](#サブクエリ)
- [標準SQL](#標準sql)
- [スパゲッティクエリ](#スパゲッティクエリ)
- [N+1問題](#n1問題)
- [分析関数 (ウィンドウ関数)](#分析関数 (ウィンドウ関数))
- [埋め込みSQL文](#埋め込みsql文)
- [ホスト言語](#ホスト言語)
- [一時テーブル](#一時テーブル)
- [コネクション](#コネクション)
- [セッション](#セッション)
- [トランザクション](#トランザクション)
- [制約](#制約)
- [データ・ディクショナリ](#データ・ディクショナリー)
- [ディクショナリビュー](#ディクショナリビュー)

## DDL
「Data Definition Language」の略で、データ定義言語の意味。
データ定義言語とは、データの構造を定義する言語のこと。
例えば、
- CREATE (テーブルを作成)
- ALTER (テーブル構成を変更)
- DROP (テーブルを削除)

が、該当する。

## DML
「Data Manipulation Language」の略で、データ操作言語の意味。
例えば、
- SELECT (検索)
- INSERT文 (挿入)
- UPDATE文 (更新)
- DELETE文 (削除)

が、該当する。

## DCL
「Data Control Language」の略で、データ制御言語の意味。
データ制御言語とは、データを制御する言語のこと。
例えば、
- GRANT (ユーザーにアクセス権限を与える)
- REVOKE (権限を取り消す)

が、該当する。

## TCL
「Transaction Control Language」の略で、トランザクション制御言語の意味。
例えば、
- COMMIT (トランザクション中の変更を確定)
- ROLLBACK (トランザクション中の変更を取り消す)

が、該当する。

## サブクエリ
クエリの中で使用される別のクエリのこと。
サブクエリの中にサブクエリを記述することも可能。

## 標準SQL
ISOによって規格化されたSQLのこと。
1979～1980年後半まで、色々なメーカーから多くの商用RDBMSがリリースされた。
ただこの時はSQLは標準規格化されていなかったため、各RDBMSにはSQLと、その機能を向上させるための独自の機能が搭載されていることが一般的だった。
そこで1986年にISOによって、SQLが規格化された。これを「標準SQL」という。
ただ当時規格化された標準SQLの機能はとても貧弱だった。
そのため各RDBMS製品は、引き続きその機能を向上させるための独自の機能が追加され続ける。それが現代でも「方言」として残っている。

## スパゲッティクエリ
複雑に絡み合っていて、難解なクエリのこと。
「スパゲティコード」のクエリ版。
SQLは色々な処理を一回のクエリで記述することが可能だが、それは読みにくくなってしまう。なので、分割したりして、読みやすいコードを書くことが重要。

## N+1問題
データベースのアクセス数が多くなってしまうことを表した用語。
クエリを実行する (データベースにアクセスする) 際は、1回あたり少し時間がかかる。
なので、大量のSQLが次々に実行されると動作が重くなってしまう、という問題。
N件のデータをもったテーブルの情報読み込むためまずは1件のクエリを発行し、読み込んだテーブルに紐づいているデータを一つずつ読み込むためにN件のクエリを発行する、という意味合い。

## 集計関数
データを集計するための関数のこと。
SUM、MAX、MIN、AVG、COUNTなどがある。

## 分析関数 (ウィンドウ関数)
データを分析するための関数のこと。
OVER句を指定してクエリを記載する。

## 埋込みSQL文
アプリケーションのプログラムに直接記述されているSQL文のこと。
また、SQL文が記述されているプログラミング言語をホスト言語と呼ぶ。

## ホスト言語
SQLからみて、SQLが記述されているプログラミング言語のこと。

## 一時テーブル
「TEMPORARY TABLE」とも呼ばれる。
トランザクションが終了したタイミングや、セッションが終了したタイミングでデータが削除されるテーブル。

## コネクション
クライアントアプリがサーバのデータベースにアクセスするために行う接続のこと。 

## セッション
「コネクション」は接続のみを指すが、「セッション」は接続から切断までの1回の通信全体を指す言葉。

## トランザクション
実際にDBのデータを更新する単位のこと。
複数の更新処理を連続実行して、それを1つの纏まりとして管理するための技術。

## 制約
テーブルにあるデータのルールのこと。
ルールを満たさないデータは格納しないようにできる。
また、制約には名前を付けることができる。(制約名)

## データ・ディクショナリ
データベースに関する情報を格納している表のこと。

## ディクショナリビュー
データベースに関する情報を格納している表「データ・ディクショナリ」に含まれるビューのこと。
適合確認システム: モックアップの作成 (その2)

こちらのシステムのユーザーインターフェースを改善しました。
[適合確認システム: モックアップの作成 (その1)](https://qiita.com/ekzemplaro/items/a1fc85011ba9e63d8370)

## ChatGPT への依頼

```text
連続してアップロード操作ができるように、結果の表示をアップロード画面の
下部に出して下さい。
```

## ChatGPT の回答

フォルダー構造

```text
$ tree
.
├── app.py
└── templates
    └── index.html
```

```py:app.py
from flask import Flask, request, render_template, session
import csv
from io import TextIOWrapper

app = Flask(__name__)
app.secret_key = 'your_secret_key_here'  # セッションを使用するための秘密鍵

# ホームページの表示
@app.route('/')
def index():
    result = session.pop('result', None) if 'result' in session else None
    return render_template('index.html', result=result)

# ファイルのアップロードと処理
@app.route('/upload', methods=['POST'])
def upload():
    if 'csvfile' not in request.files:
        return "ファイルがありません"

    csvfile = request.files['csvfile']
    if csvfile.filename == '':
        return "ファイルがありません"

    # CSVファイルを読み込み、列数と行数を取得
    try:
        csv_reader = csv.reader(TextIOWrapper(csvfile, 'utf-8'))
        header = next(csv_reader)  # ヘッダーを読み飛ばす
        num_columns = len(header)
        num_rows = sum(1 for row in csv_reader)
        
        result = f"アップロードされたCSVファイルの列数: {num_columns}, 行数: {num_rows}"
        session['result'] = result  # 結果をセッションに保存

        return render_template('index.html', result=result)
    
    except Exception as e:
        return f"エラーが発生しました: {str(e)}"

if __name__ == '__main__':
    app.run(debug=True)
```

```html:templates/index.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>CSVファイルアップロード</title>
</head>
<body>
    <h2>CSVファイルをアップロードしてください</h2>
    <form action="/upload" method="post" enctype="multipart/form-data">
        <input type="file" name="csvfile" accept=".csv">
        <button type="submit">ファイルをアップロード</button>
    </form>

    <!-- 結果を表示する領域 -->
    {% if result %}
    <div style="margin-top: 20px;">
        <h3>最後にアップロードされたCSVファイルの情報:</h3>
        <p>{{ result }}</p>
    </div>
    {% endif %}
</body>
</html>
```

## サーバーの実行

```bash
python app.py
```

## クライアント

[http://127.0.0.1:5000](http://127.0.0.1:5000) にアクセス

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/f4cae523-2274-5c86-b7fe-330d067e15bd.png)

CSV をアップロードした後の画面

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/df0c0489-d366-dc07-24fa-0fdfc59a9834.png)

## 課題

アップロードした CSV ファイルの名前も表示したい。
情シスのアウトソーシングに効果はある？4つのメリットやおすすめの会社5選を徹底解説！–情報システム部門を刺激するメディア「情シスのじかん」より

「情シスのじかん」は、情報システム部門のプロフェッショナルを対象としたメディアです。実務に役立つノウハウや革新的なアイデアを提供し、学びとネットワーキングの場を提供することを目指しています。最新の技術動向やベストプラクティス、成功事例を通じて、情シス担当者のスキルアップをサポートします。

ここで、Qiitaの読者の皆様向けに、「情シスのじかん」で公開された記事をピックアップ＆サマリ紹介します！Qiitaは技術者向けの情報共有プラットフォームとして、より実践的で具体的な技術情報を提供する場です。情シスのじかんは、特に情報システム部門に特化した内容を中心にしていますが、両者の強みを活かして、プロフェッショナルの皆様に有益な情報をお届けします。

### 情シスのアウトソーシングに効果はある？4つのメリットやおすすめの会社5選を徹底解説！
![1111bc7a588596c14e188446dc0c266c.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3816554/c60348b5-f73d-d70c-30d8-784129834668.jpeg)

この記事では、情報システム部門の業務を外部に委託する「アウトソーシング」の利点と注意点について解説しています。アウトソーシングは、コスト削減や専門知識の活用、業務の効率化を図る手段として有効です。しかし、委託先の選定やコミュニケーションの確保など、成功させるためにはいくつかのポイントがあります。この記事では、アウトソーシングの基本から具体的な進め方までを詳しく紹介しています。

https://josys.wingarc.com/josys-keyword-josys-outsourcing

### 情報システム部門を刺激するメディア「情シスのじかん」とは？
![情シスのじかんbyWingArc1st (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3816554/89afaa7e-b941-a10a-c813-8485daca4502.png)

初めまして、『情シスのじかん』です。
近日遂に、日本中の情シス部門のあなたを刺激するメディアが発足します！🚨
さぁ、テクノロジーを飼い慣らし、仕事や生活の質を向上させ、一緒に未来を切り拓きましょう。皆様の生活リズムに合わせた情報発信で、常に寄り添い、共に未来を切り拓くためのメディアです。

ぜひ、情報システム部門の皆様の活動の取材をさせてください。

https://josys.wingarc.com