OmniAICreator/Qiita-1.07M huggingface dataset:
IT用語：パンくずリストの闇を感じた

## ★はじめに★
最高のエンジニアになる！わーちゃんと申します。
継続して記事を書き続けています。このイベントが終わった後も続けたいところです。

https://qiita.com/official-campaigns/engineer-festa/2024#posting-marathon

本日は学習の中で「パンくず」について知ったことをアウトプットしていきたいと思います。


## パンくずリスト、大丈夫？
>Webページの階層を表したもので、いま自分がサイトのどの部分にいるのかを分かりやすく表示してくれます。
名前の由来は、ヘンゼルとグレーテルが森で迷わないようにパンの欠片を落としていった部分が元になっているそうです。

ふむふむ。
ここまではよかったのですが、私としてはこの後がプチ衝撃的で。

Gemfileにgemを記入しインストールする段階で
```
gem 'gretel'
```

「ヘ・・ヘンゼルが消された！！！」:scream:

ついでに、お忘れの方のために
- 兄ヘンゼル：男の子:boy:
- 妹グレーテル：女の子:girl:

これは、**masterブランチがmainブランチに変わった**時のように人権的に大丈夫なのか？

と心配になると同時にもう一つ問題があるとしたら…。

**パンくず落としたのってヘンゼルじゃないのか?**

改めて調べてみると
>ヘンゼルは小石の代わりに、まま母から渡されたパンのくずを落としていきました

これは、グレーテルがヘンゼルの手柄を横取r
妹強いな

と勝手に学習中に色々想像していました:computer:


## さいごに
ただの用語解説ではなく、自分がそこから考えたことを紹介しました。少しでも学習意欲がわき、実践的なことももっと知りたい！と思えるように私自身頑張りたいと思います。
【Terraform】Terraform Cloud Route53の設定をimportする方法

## はじめに
Terraformを業務上使用するなかで詰まったことがあったので忘備録として記事にします。
具体的には、Terraform CloudとローカルのTerraform環境を統合します。

## セットアップ
1 - tfenvを使用してTerraform Cloudのバージョンに合わせてインストール

https://qiita.com/kamatama_41/items/ba59a070d8389aab7694


2 - Terraformのログイン 
`terraform login`

3 -  Enter a value: で'yes'と入力


4 -  Terraform Cloud上でTokenを生成

![スクリーンショット 2024-05-22 11.36.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1201315/321c5d42-777e-cc83-902f-78222aa9b0b5.png)


5 -  生成したTokenを入力すると下記画面が表示される

![スクリーンショット 2024-05-22 11.19.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1201315/381ac0b3-7bc3-2bdd-fb73-0910c8201a0e.png)

6 -  Terraform initを実行　`terraform init`
Terraform構成ファイルを初期化し、必要なプロバイダーやモジュールをダウンロードする

## 作業
1 - 該当のリポジトリで`terraform state list`を実行
```
aws_route53_record.xxx
aws_route53_record.xxx
...
```

2 - `terraform state show` でレコード詳細を確認
```
terraform state show aws_route53_record.xxx
```


3 - 事前にroute53_record.tfに任意のresource名でresourceを作成します

```
resource "aws_route53_zone" "任意のresource名" {
}

```

4 - 下記コマンドを実行
```
terraform import aws_route53_record.<任意のリソース名> <ゾーンid>*<レコード名>*<レコードタイプ
```

5 - `terraform state list`を実行して任意のresource名でレコードが追加されていれば成功

https://qiita.com/sin9270/items/22b9aa8e7b8aeb631fc3


## まとめ
Terraform Cloudとインフラ構成の差分を埋めるための作業ですが、いまいちイメージできずに作業していて最初は苦労しました。既存のインフラの構成をTerraformによって管理できるようにするための処理だと忘れないようにしておきたいです。

## 最後に
私の働いている会社で経験の有無を問わず採用を行っています。
興味のある方は是非カジュアル面談から応募してみてください！

https://jambo-support.com/recruit_engineer/
【Dashboard】Menu-switchable content

# Introduction #
I am creating a dashboard with SAP Business One.
This time, the tiles right-hand side will be refreshed when one of company in the list is chosen.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/f3b3762c-fab6-98af-b135-314b9fb7fcd8.png)
When OEC Computers Australia is chosen, the tiles show OEC Computers Australia's figures.

# The structure of the page #
The structure of the page is like this.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/ccb00f35-827a-5592-ec88-2e66352bc6e1.png)
It consists of six published reports and one dashboard page.

Published Report (Horizontal) creates a menu bar at the top, and it also has Published Report (Menu Panel) in it.

Published Report (Menu Panel) creates the selection list of companies on the left-hand side, and it has a dashboard page on the right-hand side.

A dashboard page holds 4 tiles, and each tile has a published report in it.

# The link between the menu and published reports in the dashboard page #
The links between the menu and published reports in the dashboard page have to be created for making such Menu-switchable contents.

The dashboard page passes the value received to its contents, i.e. published reports defined.
Therefore, the Menu Panel has an expression to call the dashboard page with a parameter when a company is selected.
I can see the expression is defined to call the dashboard page **SAPB1_DEMO.Status2** with a parameter, **&fltCompany=** 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/20866ad3-938e-cfe9-3433-cb5191c8166f.png)
The query result is like this.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/fe9925c4-11b2-c068-1c48-63e8330506ae.png)

The dashboard page is just a container of those 4 reports so the passed value as **Company** will be passed to its contents, i.e. those 4 reports.

Then those 4 reports has a filter named as **Company** so they can receive the value.
For example, the query for Sales by Quarter is like this.
The name of Company filter says **Company**.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/bd0a35fd-3de0-c79d-769c-672c6fc89d9a.png)

They are linked like this.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/79335e8a-47d7-f464-ff3e-9118e2879c4d.png)


# Conclusion #
In this article, it was the company name, but you can also update all tables and charts on the dashboard page simultaneously using date, month, or other key values. Use this feature to enjoy designing your KPI-style dashboard.
表で見るJavaScriptの4つの関数定義

## はじめに

JavaScriptにいくつかある関数の定義方法を機能の有無を基準に表でまとめてみました。

## 表

### 機能

|                    | 式リテラル | 文宣言  | 関数呼び出し | new呼び出し | generator 宣言 | async 宣言 | argumentsの使用 | thisの束縛 |
| ------------------ | ---------- | ------- | ------------ | ----------- | -------------- | ---------- | --------------- | ---------- |
| function name() {} | yes        | yes[^1] | yes          | yes         | yes            | yes        | yes             | yes        |
| class Name() {}    | yes        | yes[^1] | no           | yes         | no             | no         | yes             | no[^2]     |
| method() {}        | no         | yes     | yes          | no          | yes            | yes        | yes             | yes        |
| () => {}           | yes        | no      | yes          | no          | no             | yes        | no              | no         |
### 宣言

|                    | 再宣言  | 宣言への再代入 | 宣言の巻き上げ | 宣言のスコープ |
| ------------------ | ------- | -------------- | -------------- | -------------- |
| function name() {} | yes     | yes            | yes            | 関数           |
| class Name() {}    | no      | yes            | no             | ブロック       |
| method() {}        | yes[^3] | /              | /              | /              |
| () => {}           | /       | /              | /              | /              |

### 補足

- 引数の宣言部分の構文は投稿者が知る限りではどれも同じ
- Functionなど関数コンストラクタによる定義はコンストラクタを使わずに書いた場合と変わらないはずなので未記載
- 対応する表現がない場合は `/`
- 宣言への再代入というのは、見かけることはないですがこういうやつ
  というかあっては駄目ですこんなコード

  ```js
    class SomethingClass {}
    
    SomethingClass = 0;
    
    console.log(SomethingClass); // 0
    
    function somethingFunction() {}
    
    somethingFunction = 1;
    
    console.log(somethingFunction); // 1
    ```

## 感想

こうして見るとfunctionの何でも感はすごいですね。一方でアロー関数はかなり純粋な関数定義のようです。あと個人的にargumentsはfunctionだけのものかと思っていたのでアロー関数以外の全てで使えるのは意外でした。また、仕様を読んだわけではないですが、functionはvar、classはlet相当で宣言されていそうです。

[^1]: 文による宣言は名前が必須です。ただし例外として `export default function () {}` や `export default class {}` のような無名宣言もあるようです。これらは式ではなく文として解釈されます
[^2]: bind/call/applyなどでthisの束縛はできませんが、thisを参照すると自分自身のインスタンスになっています
[^3]: class宣言内での再宣言です
[解決済み？]スタイルが適用されない

```:環境
Laravel 11
```

# 問題
ホームページではヘッダーの色が赤く読み込めているのに、プロフィールページだと透明？白？でヘッダーがの色が消えてしまう。
ホームページで読み込めているということは、`layout.blade.php`内でCSSを正常に読み込めている。
その`layout.blade.php`を`profile.blade.php`内で読み込んでいるので正常に表示されてもいいはずなんですが…。
# 試行
- ブラウザのキャッシュ削除
- Laravelのキャッシュ削除
- Laravel再起動
- 個々のプロフィールページでスタイル設定（ちゃんとスタイルが適応された。）
# 多分…
俺のちょっとしたミスで読み込めていないだけなんだろうけど、なかなかわからん。
# 解決済み(2024/07/03)
原因を特定しようと切り分けで検証してみたりしたけど、結局よく分からず最終手段「**教材のファイルと比較**」

`<link rel="stylesheet" href="/main.css" />`
と書くところを
`<link rel="stylesheet" href="main.css" />`
とスラッシュがなかったことで正しく適用されていなかった。

ただここでまたちょっとした疑問が沸いたのだが、`main.css`が適用されていなかったはずなのにどうしてホームページでは`main.css`が使えていたのか。
というのも`main.css`のヘッダーカラーを変えるとホームページのヘッダーの色がしっかり変わる。
ってことは`main.css`適用されてない？？？
SECCON Beginners CTF 2024 write up

# はじめに
SECCON Beginners CTF 2024に参加したため、write upを書きます。
ご覧の通り、大した順位では無いので復習の意味が大きいです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3328036/e9bfcbdf-4200-30c0-b6a0-5224928d9391.png)
自分の知識の整理のために、順を追って書いていきます。

## 解けたもの
### misc getRank
- リンクがあるので飛んでみる
    - 0～9の中にランダムで正解が設定されている
    - 正解を踏んだ回数で順位がつく
- フロント(html, js)のコードを見る
        - 正解するとscore++
        - Get Rankを押すとAPIに今のスコアをAPIで投げて、順位を得ている
- バックエンド(ts)のコードを見る
    - 入ってきた値が次の配列のどの値より大きいかを判別
        - [10 ** 255, 1000, 100, 10, 1, 0]
    - →デバッグツールでscoreにクソデカ値を入れてやればいいのでは？
- デバッグツールで色々入れてみる
    - 10**300 → 6位 (score=1e300)
    - 100.....00(0を256ぐらい) → 6位 (score=1e256)
- おかしいのでもっとちゃんとバックエンドを読む
    - 長さ300以上だと-1位
    - 10**255以上だと/10される # なーにが「ハンデがいりますね」じゃ！！！
    - にしても1e256で6位はおかしい
    - parseIntが1e256をパースできていないっぽい
    - perseIntって文字列をintに変換するものだった気がする。文字列で投げたら100.....00(0を256)を投げたら2位になる
- APIを直接叩いたらなにか変わるか？
    - curlで叩いたが、結局バックエンドでparseの処理が入っているので関係無いっぽい
- parseIntを掻い潜らなきゃいけなさそう
    - parseIntは"0x"から始めると16進数でパースされるらしい
    - じゃあ16進数で1e256にしたら？→hex(10**256)→あっ通りそう。通った

### pwnable simpleoverflow
- nc が見えたのでとりあえずLinuxから叩いてみる
    - ユーザ名を入力するエリアだけある
- コードを読む
    - adminになるとフラッグが取れる
    - "Cでは、0がFalse、それ以外がTrueとして扱われます。"とあるので、is_adminに0を入れてみる
    - 1つではだめ。とりあえず桁数増やしてみる→通った。なぜ？
- 流石に偶然過ぎたので調べてみる
    - スタックバッファオーバーフローとかいうらしい
    - メモリ空間がスタックで確保されているので、バッファを超えた入力(今だと11byte以上)をいれると、bufの次の変数(is_admin)に値が入る
    - is_admin = "0"(0x30)となって、0でなくなるのでFlagが表示される


## 解こうとしたもの
### crypto Safe Prime
- まずそもそもRSAの処理がわかっていない
    - 変数
        - m: 原文 
        - p: 素数 (秘密鍵, 今ソフィー・ジェルマン素数)
        - q: 素数 (秘密鍵, 今q=2*p+1 安全素数)
        - n: p*q (公開鍵, 今ある)
        - φ(n)(l): (p-1)*(q-1)
        - e: p, qと互いに素な素数。65537が一般的そう
        - d: e^-1 mod φ(n) (pow(e, -1, φ(n)) (秘密鍵)
    - 暗号化
        - c: 暗号文(今ある)。m^e mod n (pow(m, e, n))
    - 復号化
        - m=c^d mod n (pow(c, d, n))
- RSAのよろしくない設定を元にcを解読しよう？
- よくあるパターンを調べる
    - [RSA暗号運用でやってはいけない n のこと #ssmjp | PPT](https://www.slideshare.net/slideshow/rsa-n-ssmjp/72368516) 参照
    - どれも当てはまらなそう
- dほしい → φ(n)ほしい → p, qほしい
    - n = p(2p+1)なのでpわかる？ → 有効数字が厳しくて出ない……
    - と思ったらこれが正解っぽい
    - 解く方法何がある？
        - にぶたん
        - 普通に解く
            - **0.5じゃなくてmath.isqrtを使うべきだった→解けた……
            -   ```python
                p = (-1 + (math.isqrt(8*n+1)))//4
                q = 2 * p + 1
                
                d = pow(e, -1, (p-1)*(q-1))
                ans = pow(c, d, n)
                ans2 = ans.to_bytes(1024, "big")
                print(ans2.decode())
                ```
        - SymPy

### web wooorker
- ログインページとReportページがある
    - 何かしらでログインするとトークンが発行
    - このトークンに、脆弱性報告ページのクローラでadmin権限を付与するんだろうなぁ……
    - 認証何もわからん

### reversing assemble / cha-ll-enge
- アセンブラなんもわからん

## おわりに
write up書くのしんどい……
なぜかgetRankだけ異様に文章量多い……
私の書いた文章読みにくすぎ……
safe Prime解けなかったのあまりに数弱なのでupsolveしてきます……

# 参照
- [RSA暗号運用でやってはいけない n のこと #ssmjp | PPT](https://www.slideshare.net/slideshow/rsa-n-ssmjp/72368516) 
- [CTFでRSAの問題が解けないので勉強してみた #RSA - Qiita](https://qiita.com/uneyamauneko/items/b88f26a9c8150705aec5)
- [CTFで学ぶ脆弱性（スタックバッファオーバーフロー編・その1） | NTTデータ先端技術株式会社](https://www.intellilink.co.jp/column/security/2017/060800.aspx)
SPMで一生パッケージ入らなかったらキャッシュが悪かった

## 開発環境

macOS: Sonoma 14.5
Xcode: 15.4


## 解決方法


`~/Library/Caches/` の中の`com.apple.dt.Xcode` と `org.swift.swiftpm` を削除した。


## 経緯

社内ハッカソンで開発をしている時に、一人の環境だけSPMでバージョンの更新ができない状態だった。
`DerivedData`を消したり、`File` -> `Packages` -> `Reset Package Caches`をしたが、一向に解決せずSPMで取ってくるライブラリのバージョンを変えるとうまくいったため、SPMがわるいんじゃないかと思い、手当たり次第にキャッシュを消したら解決した。

よくわからず苦労したため、誰かの助けになれば幸いです。

## 参考
https://stackoverflow.com/questions/72315977/package-resolution-failed-xcode
https://qiita.com/Se1getsu/items/49730b8864e5077a845c
C#でXMLをWordやPDFに変換する

XML（Extensible Markup Language）は、データ交換や保存のための一般的なフォーマットです。しかし、XMLファイルを読めるアプリケーションにアクセスできない個人と情報を共有する場合、XMLをMS Word（Doc/ Docx）やPDFなどの一般的な形式に変換する必要が出てきます。

この記事では、無料の.NETライブラリを使用して、**C#でXMLをWordに、またはXMLをPDFに変換する**方法を説明します。
* [C#でXMLをWord（DocまたはDocx）に変換する](#cでxmlをworddocまたはdocxに変換する)
* [C#でXMLをPDFに変換する](#cでxmlをpdfに変換する)

## 無料の.NET Wordライブラリのご紹介
C#でプログラム的にXMLをWordやPDFに変換するには、[**Free Spire.Doc for .NET**](https://www.e-iceblue.com/Introduce/free-doc-component.html)ライブラリが必要です。以下のリンクからライブラリをダウンロードして手動でプロジェクトにリファレンスを追加するか、[NuGet](http://www.nuget.org/packages/FreeSpire.Doc/)経由で直接インストールすることができます。

https://www.e-iceblue.com/Download/download-word-for-net-free.html

## XMLをWordやPDFに変換する手順
1. 必要な名前空間をインポートします；
2. **`Document`** クラスのインスタンスを作成する；
3. **`LoadFromFile`** メソッドでXMLファイルをロードする；
4. **`SaveToFile`** メソッドを使用して、XMLファイルをDoc/ DocxまたはPDFファイルに保存します。


## C#でXMLをWord（DocまたはDocx）に変換する
```python
using Spire.Doc;

namespace XMLtoWord
{
    internal class Program
    {
        static void Main(string[] args)
        {
            //Word文書を読み込む
            Document document = new Document();
            document.LoadFromFile("input.xml", FileFormat.Xml);

            //XMLファイルを.docファイルに変換する
            document.SaveToFile("XmlToWord.doc", FileFormat.Doc);

            //XMLファイルを.docxファイルに変換する
            document.SaveToFile("XmlToWord.docx", FileFormat.Docx2016);
        }
    }
}
```
**出力：**
![XmlToWord.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2811193/20550307-3de6-0686-bc75-c3fda53cc63c.png)



## C#でXMLをPDFに変換する
```python
using Spire.Doc;

namespace XMLtoWord
{
    internal class Program
    {
        static void Main(string[] args)
        {
            //Word文書を読み込む
            Document document = new Document();
            document.LoadFromFile("input.xml", FileFormat.Xml);

            //XMLファイルをPDFファイルに変換する
            document.SaveToFile("XMLToPDF.pdf", FileFormat.PDF);
        }
    }
}
```

**出力：**
![XmlToPDF.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2811193/28410f49-c94d-fe61-c7d8-ae12afb900e8.png)

* * *
> .NETアプリケーションにWord文書処理、変換、印刷機能をもっと実装したいとお考えですか？ここをチェック

https://www.e-iceblue.com/Tutorials/Spire.Doc/Spire.Doc-Program-Guide/Spire.Doc-Program-Guide-Content.html
ベイズ統計を用いたデータ分析の入門

## はじめに

**ベイズ統計とは、一言で言うと「新しい情報をもとに確率を更新する方法」です。**

この記事では、Pythonを使ってベイズ統計の基本を紹介し、風邪の診断を例にその実用性を説明します。

## ベイズの定理とは？

ベイズの定理は、新しい情報が得られたときに、それに基づいて確率を更新する方法です。具体的には以下の式で表されます：

$$
P(A|B) = \frac{P(B|A) \cdot P(A)}{P(B)}
$$

ここで、  
- $\( P(A|B) \)$ は新しい情報Bを得た後のAの確率。
- $\( P(B|A) \)$ はAが真であるときにBが観測される確率。
- $\( P(A) \)$ は新しい情報Bを得る前のAの確率。
- $\( P(B) \)$ はBが起こる全体の確率。

## Pythonでのベイズ推定の実装

次に、Pythonを使ってベイズ推定の簡単な例を見てみましょう。ここでは、ある人が風邪を引いているかどうかを診断する例を取り上げます。

### ライブラリのインストール

まず、必要なライブラリをインストールします。ここでは、`numpy` と `matplotlib` を使用します。

```bash
!pip install japanize-matplotlib
```

### データの準備

次に、風邪の症状（例えば、咳）が出た場合に風邪を引いている確率を計算します。ここでは、次の仮定をおきます：
- 全人口のうち、風邪を引いている人の割合は5%（事前確率）。
- 風邪を引いている人が咳をしている確率は80%（条件付き確率）。
- 咳をしている人全体の割合は10%（証拠）。

```python
# ベイズの定理のパラメータ
prior = 0.05  # 事前確率：風邪を引いている人の割合
likelihood = 0.80  # 条件付き確率：風邪を引いている人が咳をしている確率
evidence = 0.10  # 証拠：全体で咳をしている人の割合

# 事後確率の計算
posterior = (likelihood * prior) / evidence
print(f'事後確率：{posterior:.2f}')
```

このコードでは、事前確率、条件付き確率、証拠を用いて事後確率を計算しています。計算結果は、新しいデータ（咳の症状）が得られた後の風邪を引いている確率を示します。

### 結果の解釈

計算結果から、新しいデータ（咳）が得られた後の風邪を引いている確率が分かります。例えば、計算結果が0.4（40%）であれば、咳をしている場合、風邪を引いている確率は40%であることを意味します。

![スクリーンショット 2024-07-01 16.47.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3364428/08108b9a-a56e-66fc-3c63-16fa5c585ac6.png)


### 視覚化

次に、事前確率と事後確率を比較して視覚化します。これにより、確率がどのように更新されたかを直感的に理解しやすくなります。

```python
import matplotlib.pyplot as plt
import japanize_matplotlib

labels = ['事前確率', '事後確率']
probabilities = [prior, posterior]

plt.bar(labels, probabilities, color=['blue', 'orange'])
plt.ylim(0, 1)
plt.ylabel('確率')
plt.title('風邪を引いている確率の更新')
plt.show()
```

![スクリーンショット 2024-07-01 16.47.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3364428/e84be984-7150-b552-9306-02e15b7de22c.png)

### 結果の解釈

上記のプロットでは、事前確率と事後確率が比較されています。事後確率が高くなっていることが分かります。これは、新しいデータ（咳の症状）によって風邪を引いている確率が更新されたことを示しています。

## まとめ

この記事では、ベイズの定理とベイズ推定の基本概念を紹介し、Pythonを使って風邪の診断を例に簡単なデータ分析を行いました。

最初に、風邪を引いている確率は5%（事前確率）でした。しかし、咳という新しい情報が得られたことで、この確率は40%（事後確率）に上がりました。つまり、咳をしている場合、風邪を引いている可能性が大幅に高くなることがわかります。

ベイズ統計は、このように新しい情報をもとに確率を更新する強力なツールです。日常生活のさまざまな場面で役立つため、さらに詳細な例を通してベイズ統計の応用を探求していきましょう。
Synology上でgiteaを立ち上げる

私は家でSynologyを飼っているんですけど、プライベートのgitリポジトリも管理したいと思いました。CI/CD機能も欲しいので、Synologyで実行できるgitクライアントを探してみました。

最初は会社でも使っているGitLabを立ち上げようと思ったのですが、どうやっても[`gitlab.socket`の問題](https://qiita.com/rsasns/items/92a14879e4f59fb9499c)が解決できないし、CPU/メモリの使用量が多すぎてSynology管理画面がめちゃくちゃ不安定になりました。

GitLabは難しそうなので、ChatGPTに代替を聞いたら「giteaがいいよ」と返ってきました。giteaはgo製のアプリらしいです。初手の`docker-compose.yml`も難しそうな記述がなさそうで、さっそくトライしてみました。

https://about.gitea.com/

# Container Managerをつかったgiteaの立ち上げ

まずはSynologyのパッケージセンターでContainer Managerをインストールしておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59468/d6ad2a6b-1ece-9699-8454-e60be4c4fd1e.png)

Container Managerをインストールすると`docker`共有フォルダが作成されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59468/80527e39-f1e9-ca6b-a8c6-239cf9fa151e.png)

`project/gitea`フォルダを作成し、`docker-compose.yml`を作成します。管理者なら`docker`共有フォルダをマウントできるので、そちらで作業するとよいです。

```docker-compose.yml
services:
  server:
    image: gitea/gitea:latest
    container_name: gitea
    environment:
      - USER_UID=1000
      - USER_GID=1000
    volumes:
      - ./data:/data
    ports:
      - "8888:3000" # 外側からは http://<NASのIPアドレス>:8888 で接続する
      - "2222:22"   # 外側からは ssh://git@<NASのIPアドレス>:2222/group/repo で接続する
```

https://docs.gitea.com/installation/install-with-docker

- うまくやれば`rootless`でできるんだろうけど(`rootless`のほうが安全)、`rootless`だとフォルダの書き込み権限を取れずに起動に失敗する。
- `volumes`が指すフォルダ(`data`)は先に作っておく。
- ホストとtimezoneを同期するのは難しいらしいので、無理に設定しなくてもよい。
  - https://www.reddit.com/r/synology/comments/pd4qy3/how_to_map_synology_host_timezone_etctz_to_docker/?rdt=33420
  - https://community.synology.com/enu/forum/17/post/110130
- HTTPに関するポート(3000)を変更する場合、外側だけ修正する（起動時に自動設定される）。
- SSHに関するポート(22)を変更する場合、giteaを起動したらそのポートを設定する（起動時に自動設定されない）

Container Managerの`プロジェクト`から`作成`ボタンを押下し、作成した`docker-compose.yml`を設定する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59468/4053f10d-4a1a-b1bf-2e46-9e0a6426a18d.png)


`構築`を押すとコンテナが作成され、起動する。もし起動しない場合は`開始`を押下する。

その後 `http://<NASのIPアドレス>:3000` にアクセスすると、giteaの初回画面が表示される。日本語にローカライズされているので、それもうれしい。

起動し続けていても、CPU/メモリ使用率はこんなもんなので、ホストにも優しい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59468/67cdfdd3-1f54-01fa-acc6-89c22c0de01c.png)

# おわりに

とりあえず構築メモです。CI/CDがGitHub互換という話も聞いており、GitHubのプロジェクトを管理するのも便利そうです。
最新AI検索エンジン、次世代検索方法

インターネットが普及した現代において、情報収集は私たちの生活に欠かせないものとなりました。しかし、膨大な情報の中から必要なものを見つけ出すのは、容易なことではありません。そこで近年注目を集めているのが、AI技術を搭載した次世代検索エンジンです。

Felo Searchは、従来の検索エンジンとは一線を画す、革新的なAI技術を搭載した次世代検索エンジンです。GoogleやYahooなどの主要検索エンジンから情報を収集し、独自のAIアルゴリズムで分析・処理することで、より正確かつ高度な回答を提供します。

# Felo Searchの特徴
圧倒的な精度: 従来の検索エンジンよりも、より正確かつ詳細な情報を提供します。

自然言語処理: ユーザーの意図を理解した上で、最適な解決策を提示します。

多言語対応: 現在は日本語、英語、中国語に対応しており、今後も対応言語を拡充していく予定です。

洗練されたデザイン: 直感的な操作性で、ストレスなく情報収集をサポートします。

# Felo Searchの活用例
専門性の高い質問: 医学や法律などの専門性の高い質問にも、正確かつ詳細な回答を提供します。

比較検討: 複数の商品やサービスを比較検討したい場合にも、Felo Searchが最適な情報を提示します。

創造的なアイデア探し: 文章生成や翻訳機能などを活用して、創造的なアイデア探しにも役立ちます。

Felo Searchは、AI技術によって検索体験を大きく革新する可能性を秘めた次世代検索エンジンです。 まだ開発段階ですが、すでに多くのユーザーから高い評価を得ています。

Felo Searchで、今まで以上に効率的かつ効果的な情報収集を実現しましょう！

Felo Search公式サイト: https://felo.ai/search
![Xnip2024-07-01_16-32-59.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3678884/ebc1b0bc-52b9-3e4c-528e-062d72cf8eac.jpeg)
# Felo Search：次世代検索エンジンの可能性
Felo Searchは、単なる検索エンジンではありません。それは、ユーザーのニーズを深く理解し、最適な情報を提供してくれる、頼れる情報収集パートナーです。

AI技術の進化と共に、Felo Searchは今後も機能を拡充していくことでしょう。近い将来、Felo Searchは私たちの生活に欠かせないツールとなる可能性を秘めています。

Felo Searchの今後の進化に期待しましょう！

Felo Search以外にも、様々なAI技術を搭載した次世代検索エンジンが開発されています。今後、AI技術の進化と共に、検索エンジンの機能はさらに高度化していくことでしょう。

私たちは、常に最新の情報をチェックし、自分に最適な検索エンジンを選ぶことが重要です。

# 関連記事
【2024年版】検索エンジン10選！徹底紹介！（AI検索エンジンも含め） - Felo News: https://news.felo.me/2024/05/2024年版検索エンジン10選徹底紹介ai検索エ/

AI Search Engine 多言語評価レポート: https://news.felo.me/2024/02/machine-translation-is-more-conservative-than-human-translation-google-research-paper-published-in-2024/
インフラをコードで管理するTerraformとは何か？

## はじめに
Terraform（テラフォーム）は、オープンソースであり、HashiCorp社がGo言語で開発したIaC（インフラをコードで管理）を実現するツールです
今やIaCを代表するツールの1つとして広く利用されるようになりました
私も最近このツールを知り、調べてみましたので、この記事でその概要を紹介します

## Terraformの背景
現在、インフラ環境はクラウド化されておりAWSが主流となっています
数回のクリックで瞬時にサーバーを構築、変更を可能にしますが、クリックだけではサーバーを完全にコントロールするには不十分です

例えば下記のケースにおいてコントロールが難しくなります
 - 同じ環境を再現する
     - 手動操作では同じ環境を作ろうとすると微妙な差異が生まれてしまう恐れがあります
 - 復元や再現性
     - 手動操作だと、どの操作を行ったかの記録をする必要があり、ミスをしやすいです
     - また、再現する際に資料などを通して確認しなければなりません

このような課題を解決するために、コードを使ってインフラ環境を構築・管理する手法（IaC）が登場しました。その代表例がTerraformです。

## TerraFormの基本概念
Terraformは、インフラの設定をコードで記述し、そのコードを基にインフラを自動的に構築、変更、管理します
以下は、Terraformの基本概念です

- HCL(HashiCorp Configuration Language)
    - Terraformの設定ファイルは、HCLという独自の言語で記述されます
- プロバイダー
    - Terraformは「プロバイダー」を利用して、様々なクラウドサービス（AWS、Azure、GoogleCloudなど）やオンプレミスのリソースと連携します
- リソース
    - リソースは、Terraformで管理するインフラの基本単位です
    - サーバー、DB、ロードバランサーが含まれます
- モジュール
    - 設定を再利用可能な形にまとめたものです
    - 非常に単純なTerraformファイルを記述するだけでも、モジュールが作成されます


## Terraformの特徴
- コードによるインフラ管理
    - インフラをコード化することによって異なる担当者が作業を行う場合でも、一定の品質を担保できます
- オープンソースでの提供
    - 無償のオープンソースで提供されているため、お金をかけずに利用イメージをつかむことができます

## まとめ
Terraformは、インフラをコードとして管理し、自動化するためのツールです
HCLを使った分かりやすい設定や構成管理、ソースコードによる状態管理など、多くの利点があります
初心者から上級者まで、インフラの管理を効率化したい場合は強力な味方になることでしょう
自分も個人開発や業務でインフラ管理する際は導入してみたいと思います


## 参考リンク

https://www.ibm.com/jp-ja/topics/terraform

https://www.lac.co.jp/lacwatch/service/20200903_002270.html

https://ignition.centsys.jp/terraform/

https://github.com/hashicorp/hcl
ブログ等に簡単にコメント機能がつけれる「giscus」をNext.jsで使ってみた

## giscusとは
https://giscus.app/ja

GithubのDiscussion機能を用いたコメントシステムです。Githubのアカウントがあれば簡単に使えてコメントも出来るようになります。

## Next.jsで使ってみる
Next.jsで作成したサイトやブログに導入することがあると思います。
実際にNext.jsで使ってみたので、その手順を紹介します。

Demo

https://giscus-test-liard.vercel.app/

### 1. giscusの設定
1. リポジトリを作成します。
2. 作成したリポジトリにgiscusをインストールします。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403148/73c2f199-914b-1574-c828-2bb9c9620b66.png" width="300px"/>

3. リポジトリのSettingsからDiscussionsを有効にします。

![スクリーンショット](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403148/52cd0034-17b2-a34e-1d8b-c77161683a0a.png)

https://giscus.app/jaにアクセスしてステップバイステップで設定できます。


### 2. Next.jsで使う
App Routerで構築されたNext.jsのページにgiscusを埋め込みます。
全体のコードはこのリポジトリにあります。

https://github.com/EveSquare/giscus-test


```jsx:app/giscus.tsx
export const Giscus = () => {
  return (
    <>
      <div className="giscus"></div>
      <script
        src="https://giscus.app/client.js"
        data-repo="EveSquare/giscus-test"
        // ...(1.)で作成したscriptタグを貼り付けます。
      ></script>
    </>
  );
};
```

### 3. 動作確認
そのままコンポーネントを表示すると`Hydration Error`が発生するので、Dynamic Importを使ってコンポーネントを読み込むようにします。

```jsx:pages.tsx
import dynamic from "next/dynamic";

const Giscus = dynamic(() => import("@/app/giscus").then((m) => m.Giscus), {
  ssr: false,
});

export default function Home() {
  return (
    <main>
      <Giscus />
    </main>
  );
}

```

ローカルでコメントをしたら....

![スクリーンショット](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403148/86ae389e-5c45-ecd9-5ba5-6849e3eff026.png)

Github Discussionsの方でも反映されています✨

![スクリーンショット](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403148/18faac83-3ee1-2064-5db8-d68e1d5db48e.png)

## まとめ
Next.jsでgiscusを使う手順を紹介しました。
簡単にコメント機能を追加できるので、ぜひ使ってみてください。
Juliaの環境構築 with VScode

# Juliaとは？
<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2702347/7746fc21-2bfb-8e7b-c854-8d1e33004170.png">
 
マサチューセッツ工科大学のグループにより2009年に開発された比較的新しいプログラミング言語です。 読み方は「ジュリア」(アクセントは `ジュ`らしい)です。
Juliaの特徴を一言で表すなら「多くのプログラミング言語の良いとこ取り」でしょう。JuliaはPythonやC言語、MATLABなどの多くの言語に影響を受けて開発されており、
* (動的型付け言語なのに、)C言語に匹敵する実行速度の速さ
* Pythonのような汎用性の高さ

などなど、様々な特徴を持っています。(詳しくは開発者の[リリース記事](https://marui.hatenablog.com/entry/20120221/1329823079)をご覧ください。)
特に「統計処理」「機械学習」といった分野に強みをもち、当該分野での人気が高まっているそうです。
(筆者も研究室の先輩から勧められました。)
[Julia公式サイト](https://julialang.org/)


# 注意事項
実を言うと、JuliaをVScode上で使えるようにする方法については[英語でまとめられている記事](https://www.julia-vscode.org/docs/dev/gettingstarted/)が存在しています。最新情報はこちらを確認すると良いでしょう。
あくまで本記事では、2024/07/01時点で私が環境構築した方法について記すこととします。

# 使用したもの
OS: Windows11 Home 23H2
VScodeのバージョン：1.88.1

# 手順概要
1. Juliaをダウンロードする
2. Juliaの拡張パッケージをVScodeにインストールする
3. 新しいフォルダを作成して、Juliaを動かせるかどうかを確かめる


### 1. Juliaをダウンロードする
[公式サイト](https://julialang.org/downloads/)にアクセスし、Juliaをダウンロードします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2702347/9e8d8d01-bf99-31dd-3baf-fb11a0838314.png)
「コマンドプロンプト上で上記コマンドを入力すると、ダウンロードできるよ」と書いてあったので実際にやってみると、無事に最新版のJuliaをダウンロードすることができました。(特に設定等はせずとも、気が付いたらインストール完了していました。)

### 2. Juliaの拡張パッケージをVScodeにインストールする
VScodeを起動し、画面上部のメニューバーの「表示>拡張機能」(英語版の方はView > Extensions)をクリックし、検索バーからJuliaを検索すると、Juliaをインストールします。似たやつがいくつかありますが、検索で一番上に出てきたやつを選べば問題ないかと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2702347/c455fc01-6070-119f-888a-2c14bcf72f3c.png)

### 3. 新しいフォルダを作成して、Juliaを動かせるかどうかを確かめる
` C:\ユーザー\(ユーザー名)`のフォルダに適当なフォルダを作成して、Juliaファイルを実行できるかどうかを確かめます。
私は` C:\ユーザー\(ユーザー名)\hellojulia`というフォルダを作成し、その中で `hello.jl`を作成しました。
ファイルを作成したら、実行してみて`Hello World`を表示できるかを確かめます。
```julia:hello.jl
msg = "Hello World"
println(msg)
```
```bash
# 出力結果
Hello World
```
:::note warn
人によっては、環境変数の設定の関係で実行できない場合があるようです。その場合は[先程の記事](https://www.julia-vscode.org/docs/dev/gettingstarted/#Installing-the-Julia-extension)を確認してみてください。
:::
エラーについては、判明次第、本記事に反映できたらと思っています。もし遭遇した方がいらっしゃっいましたら、コメント等でお知らせ頂けますと幸いです。

### 余談
筆者は普段、エディタにJetBrainsの[PyCharm](https://www.jetbrains.com/ja-jp/pycharm/)を使用しているのですが、PyCharmでのJulia用拡張機能のアップデート履歴が古すぎたので、PyCharmでは挑戦しませんでした...([実際に困っている人](https://ja.stackoverflow.com/questions/85506/jetbrain%E3%81%AEpycharm%E3%81%AE%E6%8B%A1%E5%BC%B5%E6%A9%9F%E8%83%BD%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6julia%E3%82%92%E5%8B%95%E3%81%8B%E3%81%99%E3%81%A8%E3%82%A8%E3%83%A9%E3%83%BC%E3%81%8C%E3%81%A7%E3%82%8B)もいるみたい。)
気が向いたらPyCharmでもできるかどうか試してみようと思います。 
~~すなわち、挑戦しない可能性大~~
XCodeでvalidate app時に"予期しない理由で終了しました"

# 問題
XCodeでvalidate app時に"予期しない理由で終了しました"と表示されXCodeがクラッシュする

## 原因
Apple Developer Programの新しい利用許諾契約に同意していなかった。

## 解決方法
https://developer.apple.com/account

に移動し、同意する。

### 最後に
クラッシュすると原因がわからないので修正されてほしい
NAIST(大学院)の受験直前に病みかけた話

## 一番の悩み
現在私は，大学院への進学を考えており今日は大学院入試の2日前です．
いろいろな事に手を出しすぎて苦しくなってきました．
息抜きとして書いています．いいねをしていただけると励みになります．


## 志望する大学院：奈良先端科学技術大学院大学（NAIST)
教授の一人当たりの研究費が国内トップだそうです．（何年度かは忘れましたが最近です）．研究に力を入れている大学院大学で，情報，生物，物性の分野を選べます．山中伸弥教授は，京都大学の前にNAISTで研究をされていたそうです．
留学生の割合が2~3割ほどで，授業は英語で行われます．
就職は強いです．情報系の学生の就職人数150人ほどの中で，Sonyや富士通，アクセンチュア，LINEヤフー，楽天，時どきGoogleもいます（https://isw3.naist.jp/InfoSci/outline6-ja.html）．
受験科目は数学と，研究計画書（提出+面談），TOEIC，学内成績です．


## 自分の情報，スペック
・某高専専攻科2年，情報系
・GPA:3.0
・TOEIC:700点
・過去3度の情報系のコンテスト出場経験あり（1回はまぐれで全国2位）
・興味のある分野：ソフトウェア開発
・現在，4度目のコンテスト（開発系）に出場中．


## 最近の悩み
・NAISTの倍率高すぎ
NASITは旧帝の院の滑り止めによく使われます．筑波の滑り止めも多いです．毎年情報系の倍率は3倍近くになります．大学院入試の倍率としては高いです．

・進学後，自分に研究ができるのかという不安
同級生や先輩で自分より情報系ができる人を知っているので，自分で太刀打ちできるのかという不安があります．自分は，コンテストで賞を取ったという肩書はゲットできましたが，実力に自信はないので研究面での不安は残ります．

## 受験が終わった後の予定
・高専プロコン（出場中）
・フランス留学（2か月間）
・高専の専攻科での研究
・U-22（開発系のコンテスト）への出場

↑　最後の予定は達成できないかもしれませんが，NAISTへの合格が決まればある程度時間が出来るので，挑戦してみようと思います．

逆にNAISTに落ちた場合は話が変わってくるので，全力で挑みたいです．

ちなみに滑りどめは考えていないです．

合格したらまた追記をしに来ます．追記がなかった場合は察してください．




<追記：合格していました．やったぁ．>
体験記も書きました．

https://note.com/000_kane/n/nbcbcfc7b2529
AWS CodePipeline作成時の自分用メモ

CodePipeline作成時、操作するユーザに必要な権限。
※CodePipeline用のロールは、過去にCodePipeline作成した際にできている想定。
　→権限よくわからんから、一旦rootでCodePipeline作ってみた。その時に自動生成したやつ。
　→この時、自分で名前入れたやつの他、cwe-role-(region)-で始まるロールと、start-pipeline-execution-(region)-で始まるポリシーが作られる。ほかにも作られるかは存ぜぬ。

ちと範囲が広いのと、該当のやつで「code-pipeline」って名前に入っている前提。


        {
            "Sid": "Statement4",
            "Effect": "Allow",
            "Action": [
                "iam:CreateRole",
                "iam:AttachRolePolicy",
                "iam:PassRole"
            ],
            "Resource": "arn:aws:iam::*:role/*code-pipeline*"
        },
        {
            "Sid": "Statement5",
            "Effect": "Allow",
            "Action": [
                "iam:CreatePolicy",
                "iam:CreatePolicyVersion",
                "iam:DeletePolicyVersion"
            ],
            "Resource": "arn:aws:iam::*:policy/*code-pipeline*"
        }
UE5.4 ローカルで再生中のオーディオ取得および再生①　-対象オーディオデバイス固定-

# 概要
VRキャラクタにてSNS配信を行うにあたりローカルで再生中の音楽をゲーム上に取り込みたいがPlaginなどを見つけることができなかった。
そのため自身でBluePrintにて構築した。
UE5.4に関する記事/リファレンスは現状非常に少ない為、実装の入り口として自身の備忘録として本記事を活用いただけると幸いです。

# 目的
ローカルの特定のオーディオデバイスで再生中の音源をゲームにて再生させる。

# 環境
## バージョン等
|種別|概要|バージョン|
|:--:|:--:|:--:|
|OS|Mac|M1 2020/Sonoma 14.4.1|
|Engine|UnrealEngine|UE5.4.2|
|テンプレート|Blank| -|
|Plugin| - | -|

# 完成図
## ファイル一覧
```
./Content
    └BP_Actor_Speakers ※アクターベースのブループリント。再生させるための処理を記載
    ├MP_localget ※画面ソース無しのMedia Player。オーディオデバイスを指定し音源をストリーミングで取得する 
    └ES_Localget ※Endpoint Submix。取得した音源をループを用いて再生
    
```
## パラメータ　※デフォルトより変更箇所のみ記載

### BP_Actor_Speakers
#### コンポーネント構成
```
./
　└DefoultSceneRoot　※デフォルトにて作成済み
    　├Sphere ※レベル上で配置するためのアセット 
    　└MediaSound ※再生機能をふよするためのコンポーネント
    
```
#### 変更パラメータ　※MediaSoundのみ修正
[MediaSound]-[Details]-[Media]-[Media Player]:MP_localget
[MediaSound]-[Details]-[Effects]-[Base Submix]:ES_localget
## Event Graph
![スクリーンショット 2024-06-30 16.24.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3711564/c34cad03-6dc7-1b0e-3e01-f4ec6fbc0691.png)

### MP_localget
BluePrintにてsource変更するため静的な設定はなし
    
### ES_Localget
変更パラメータ無し
VanillaJSでFabric.jsが急に動かなくなった話


# はじめに

下記DemoでFabric.jsをVanillaJSで使用していたが、急に動かなくなった。


https://qiita.com/shisojuice/items/2413580f72244a4823c7


https://github.com/fabricjs/fabric.js


# 原因

ReadMe(20240701現時点)のQuick StartのPlainHTMLどおりに参照していたため、

cdn.jsdelivr.net/npm/fabricのバージョンの指定を失念していた。(バージョンがv6にアップグレードしたため。)

![VanillaJSでFabric.jsが急に動かなくなった話_001.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3777149/6d23ce33-0eff-c003-f770-1123987c23e7.jpeg)

https://github.com/fabricjs/fabric.js?tab=readme-ov-file#quick-start


# 解決方法

バージョンを指定してimportする

```javascript:script.js
import { fabric } from 'https://cdn.jsdelivr.net/npm/fabric@5.3.0/+esm'   
```

# まとめ

最近はnpmなどでライブラリのバージョン管理していたので、VanillaJSでのライブラリのバージョン管理をすっかり忘れていた。😥

自己学習用のDemoサイトであったため、特に影響はなかったが、もしこれが、業務だと考えるだけで寒気がする。🥶

今後はこのようなことが無いようにVanillaJSの時もしっかりとライブラリのバージョンを確認して事故を減らしていきたい。📚
javascriptの開発時にVS CodeのIntelisenceが遅かった時の解決方法

## 現象
Javascript(Typescript)での開発時、Intelisenceが異常に重い時があった。具体的には、変数の変更時などにtypeのチェックに数十秒の時間がかかっていた。

何かおかしいなと思っていた最中、[Visual Studio Code is unable to watch for file changes in this large workspace](https://code.visualstudio.com/docs/setup/linux#_visual-studio-code-is-unable-to-watch-for-file-changes-in-this-large-workspace-error-enospc)というエラーが出た。

## 解決方法

[Visual Studio Code is unable to watch for file changes in this large workspace](https://code.visualstudio.com/docs/setup/linux#_visual-studio-code-is-unable-to-watch-for-file-changes-in-this-large-workspace-error-enospc)に書かれている通り、以下のようにsettings.jsonを変更した。

```json
{
    "files.watcherExclude": {
        "**/.git/objects/**": true,
        "**/.git/subtree-cache/**": true,
        "**/node_modules/*/**": true
      }
}
```

すると、Intelisenceが不満ないスピードで動くようになった。

## 考察

開発途中で様々なdependenciesを追加したことにより、`node_modules`に大量のファイルが追加され、それをVS Codeが読みにいったせいで重くなったのだと思われる。
Pythonで並行リクエストを処理する（aiohttp）

# 1. はじめに
並行リクエストは、複数のHTTPリクエストを同時に処理するために使用されます。
これにより、複数のAPIエンドポイントからのデータ取得や、複数のサーバーへの同時アクセスが効率化されます。

# 2. 必要なライブラリのインストール
まず、aiohttpをインストールします。以下のコマンドをターミナルで実行してください。

```bash
pip install aiohttp
```

# 3. 並行リクエストのサンプルコード
以下のコードは、複数のURLに対して並行してGETリクエストを送信し、そのレスポンスを取得する例です。

```python
import aiohttp
import asyncio

async def fetch(session, url):
    async with session.get(url) as response:
        return await response.text()

async def main(urls):
    async with aiohttp.ClientSession() as session:
        tasks = [fetch(session, url) for url in urls]
        responses = await asyncio.gather(*tasks)
        return responses

# リクエストするURLのリスト
urls = [
    "https://jsonplaceholder.typicode.com/posts/1",
    "https://jsonplaceholder.typicode.com/posts/2",
    "https://jsonplaceholder.typicode.com/posts/3"
]

# メイン関数を実行
responses = asyncio.run(main(urls))

# 結果を出力
for i, response in enumerate(responses):
    print(f"Response from {urls[i]}:")
    print(response[:200])  # 最初の200文字のみ表示
    print("\n")
```

# 4. コードの解説
* fetch関数: sessionオブジェクトを使って指定されたURLにGETリクエストを送り、そのレスポンスを返す非同期関数です。
* main関数: 複数のURLに対してfetch関数を並行して実行するためのタスクを作成し、それらをasyncio.gatherを使って実行します。すべてのリクエストが完了するまで待ち、レスポンスを返します。
* urlsリスト: リクエストを送信するURLのリストです。
* asyncio.run: main関数を実行して、レスポンスを取得します。
* 結果の出力: 各レスポンスの最初の200文字を出力します。

# 5. まとめ
aiohttpとasyncioを組み合わせることで、効率的に並行リクエストを処理することができます。これにより、複数のAPIエンドポイントからのデータ取得や、複数のサーバーへの同時アクセスが容易になります。

質問やフィードバックがあれば、コメントでお知らせください。ありがとうございました。
GitHubでコードレビューを自動化するCodeRabbitの導入メモ

## CodeRabbitとは
GitHubのプルリクエストに対してAIコードレビューをしてくれるサービス（多分）

https://coderabbit.ai/ja/


## 導入の動機
レビューで行っていた作業の一部を任せることで
工数を減らす、コードの品質を上げることが目的
・文法チェック→CodeRabbitに任せる
・動作確認に伴う指摘→レビュワーが行う


## 導入の流れ
・CodeRabbitに登録　自分はGitHubアカウントで登録しました
　　
　　
・管理画面→Repositories→AddRepositoriesからリポジトリを選択
　GitHubのOwner権限が必要なので先に付与してもらう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760274/0612ebb0-eb0c-dc66-6986-0aa401d0e5e2.png)
　　
　　
・レビュー言語を日本語化　※下記はcoderabbit管理画面から設定できるのでおそらく不要でした
　Organization SettingsのReview Languageを日本語にしても
　レビューが英語のままだったので調べたところ
　.coderabbit.yamlをソースディレクトリ直下に作成するとのことでした
　設定方法は下記を参照
　https://docs.coderabbit.ai/guides/configure-coderabbit/

``` .coderabbit.yaml
language: "ja-JP"
early_access: false
reviews:
  profile: "chill"
  request_changes_workflow: false
  high_level_summary: true
  poem: false
  review_status: true
  collapse_walkthrough: false
  auto_review:
    enabled: true
    drafts: false
chat:
  auto_reply: true
```
　　
　　
日本語になりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760274/b6868faa-2cff-21b2-61d5-73b2f96ff96e.png)


  
設定ファイルにはコードレビューの観点なども設定できるようなので
今度、更に活用したいと考えています！
Goの脆弱性診断を定期実行したい（govulncheck-action）

# はじめに
Goプロジェクトのセキュリティを確保するために、定期的な脆弱性診断は必須ですよね。

Goの脆弱性診断を定期実行する仕組みを構築すれば、開発スピードを落とすことなくセキュリティ対策を強化できます。

今回は、[govulncheck-action](https://github.com/marketplace/actions/golang-govulncheck-action)を使って、Goの脆弱性診断を継続的に実行する方法について紹介します。

# GitHub Actionsのワークフロー作成
以下のyamlを.github/workflows配下に追加します。
```.github/workflows/go_vluncheck_sample.yaml
name: Go Vulnerability Check
on:
# ここで定期実行のための設定をしています
  schedule:
    - cron: '0 23 * * *' # UTC表記。毎日8時(JST)に実行
jobs:
  go_vulncheck:
    runs-on: ubuntu-20.04
    timeout-minutes: 10
    steps:
      # リポジトリのコードを取得し、アクションが実行される環境にコピーする
      - uses: actions/checkout@v4
      # Goの脆弱性診断を実行
      - uses: golang/govulncheck-action@v1
        go-version-input:　◯◯◯
        work-dir: ◯◯◯
        go-package: ./...

```
たったこれだけで、Goの脆弱性診断を定期実行するための仕組みは整いました。
お手軽ですね。

# おまけ
## govulncheck-actionの導入を一度挫折した話
実は、一度govulncheck-actionの導入を挫折してました。
[govulncheck-action v1.0.0](https://github.com/marketplace/actions/golang-govulncheck-action?version=v1.0.0)のリリース時は、working directoryの設定オプションがありませんでした。
これはmonorepo環境だとちょっとつらくて、working directoryの設定がうまくいかなかったため、一度govulncheck-actionの導入は見送ってました。

## 試行錯誤したこと
### working-directoryをdefaultsで設定する(ボツ)
```yaml
defaults:
  run:
    working-directory: ◯◯◯
```
を設定しても、
```yaml
- uses: golang/govulncheck-action@v1
```
のstepでは無視されてしまい、GOPATHの環境変数が変更されないためgo.modファイルが見つけれないというエラーが出てました。
同様のエラーでハマって、issueを起票していた方がいたので、詳しくはそちらを参照ください。

https://github.com/golang/go/issues/61354


### v1.0.1でworking-directoryが設定できるようになってました🎉
v1.0.1でこの問題が解決されました。（最近知りました😇）

v1.0.1ではいった、working-directoryが設定できる差分
![スクリーンショット 2024-06-29 16.14.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1958304/8da4b934-cf9b-e7a8-b2f5-05b96dd463e3.png)
引用： https://go-review.googlesource.com/c/govulncheck-action/+/520175

これによって、working-directoryの問題が解決され、めでたくgovulncheck-actionを導入できました🎉
pythonでcurl

# pythonでcurl
Pythonでcurlコマンドを実行するには、subprocessモジュールを使用するのが一般的です。
また、同様の機能を提供するライブラリとして、requestsモジュールを使用することもあります。それぞれの方法についてサンプルスクリプトを示します。

# subprocessでcurl
```python
import subprocess

# curlコマンドを定義
curl_command = [
    "curl",
    "-X", "GET",  # HTTPメソッド
    "https://jsonplaceholder.typicode.com/posts/1",  # リクエストURL
]

# subprocessでcurlコマンドを実行
result = subprocess.run(curl_command, capture_output=True, text=True)

# 結果を出力
print("Response code:", result.returncode)
print("Response body:", result.stdout)
```

# requestsライブラリでcurl
まず、requestsライブラリがインストールされていない場合は、以下のコマンドでインストールしてください。

```bash
pip install requests
```
その後、以下のようにrequestsライブラリを使用してHTTPリクエストを送信できます。

```python
import requests

# リクエストを送信
response = requests.get("https://jsonplaceholder.typicode.com/posts/1")

# 結果を出力
print("Response code:", response.status_code)
print("Response body:", response.text)
```

# 何が違うの？
* subprocessモジュールを使用する方法は、既にcurlコマンドに慣れていて、Pythonコード内で直接curlコマンドを実行したい場合に有用です。
* requestsライブラリを使用する方法は、Pythonコード内でHTTPリクエストを簡潔に実行し、レスポンスを処理したい場合に便利です。こちらの方法の方が一般的であり、推奨されます。

ご希望に合わせて、どちらかの方法を選んで実装してください
apacheのリバースプロキシ

# リバースプロキシとは
アクセスする側から見て目的のサーバーの手前に設置して、アクセスする際には必ず経由するようにしたプロキシサーバーのことです。

# Apacheのリバースプロキシを設定する
``` httpd.conf
<IfModule mod_proxy.c>
ProxyPass /app http://192.168.1.102/app
ProxyPassReverse /app http://192.168.1.102/app
</IfModule>
```
### ProxyPass
自分のパスを他のサーバーに結びつける

### ProxyPassReverseとは
このディレクティブは Apache に HTTP リダイレクト応答の Location, Content-Location, URI ヘッダの調整をさせます。これは、Apache がリバースプロキシとして使われている ときに、リバースプロキシを通さないでアクセスすることを防ぐために 重要です。これによりバックエンドサーバの HTTP リダイレクトが リバースプロキシとバックエンドの間で扱われるようになります。
#### 出典
https://httpd.apache.org/docs/2.4/ja/mod/mod_proxy.html#proxypassreverse:~:text=%E3%81%93%E3%81%AE%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%86%E3%82%A3%E3%83%96%E3%81%AF%20Apache%20%E3%81%AB%20HTTP%20%E3%83%AA%E3%83%80%E3%82%A4%E3%83%AC%E3%82%AF%E3%83%88%E5%BF%9C%E7%AD%94%E3%81%AE%20Location%2C%20Content%2DLocation%2C%20URI%20%E3%83%98%E3%83%83%E3%83%80%E3%81%AE%E8%AA%BF%E6%95%B4%E3%82%92%E3%81%95%E3%81%9B%E3%81%BE%E3%81%99%E3%80%82%E3%81%93%E3%82%8C%E3%81%AF%E3%80%81Apache%20%E3%81%8C%E3%83%AA%E3%83%90%E3%83%BC%E3%82%B9%E3%83%97%E3%83%AD%E3%82%AD%E3%82%B7%E3%81%A8%E3%81%97%E3%81%A6%E4%BD%BF%E3%82%8F%E3%82%8C%E3%81%A6%E3%81%84%E3%82%8B%20%E3%81%A8%E3%81%8D%E3%81%AB%E3%80%81%E3%83%AA%E3%83%90%E3%83%BC%E3%82%B9%E3%83%97%E3%83%AD%E3%82%AD%E3%82%B7%E3%82%92%E9%80%9A%E3%81%95%E3%81%AA%E3%81%84%E3%81%A7%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%81%99%E3%82%8B%E3%81%93%E3%81%A8%E3%82%92%E9%98%B2%E3%81%90%E3%81%9F%E3%82%81%E3%81%AB%20%E9%87%8D%E8%A6%81%E3%81%A7%E3%81%99%E3%80%82%E3%81%93%E3%82%8C%E3%81%AB%E3%82%88%E3%82%8A%E3%83%90%E3%83%83%E3%82%AF%E3%82%A8%E3%83%B3%E3%83%89%E3%82%B5%E3%83%BC%E3%83%90%E3%81%AE%20HTTP%20%E3%83%AA%E3%83%80%E3%82%A4%E3%83%AC%E3%82%AF%E3%83%88%E3%81%8C%20%E3%83%AA%E3%83%90%E3%83%BC%E3%82%B9%E3%83%97%E3%83%AD%E3%82%AD%E3%82%B7%E3%81%A8%E3%83%90%E3%83%83%E3%82%AF%E3%82%A8%E3%83%B3%E3%83%89%E3%81%AE%E9%96%93%E3%81%A7%E6%89%B1%E3%82%8F%E3%82%8C%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%AA%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82

### 気づき
/appの時だけhttpで192.168.1.102宛てにhttpプロトコルで要求されるのか。
またリダイレクトのことがわかっていないことがわかった。

# 出典
https://book.impress.co.jp/books/3339
markdown AIを使って簡単に自己紹介サイトを作ってみる

# markdown AIとは
> Mark Downを使って簡単にウェブサイトを作成しましょう！
>作成から公開までを1画面で完結でき、公開前に簡単にプレビューを表示できます。
>エンジニアが簡単に情報を交換できるだけでなく、子どもたちが簡単にウェブサイトを作成し、世界中の人々と交流できるようにするのがコンセプトです。

https://mdown.ai/content?id=335b81b2-bcb0-4dbb-83d0-531aa132181f

# markdown AIを使って自己紹介サイトを作ってみる
子どもたちが簡単にウェブサイトを作成し、世界中の人々と交流できるようにするのがコンセプトのようなので小学生同士が自分で自己紹介サイトを作って共有できるようにするような世界をイメージして自己紹介サイトを作ってみたいと思います。

# コード

```md
# 自己紹介

## ようこそ！

こんにちは、山田 太郎 です。私の自己紹介サイトへようこそ！

---

## プロフィール

- **名前**: 山田 太郎
- **年齢**: 10 歳
- **学年**: 5 年生
- **学校**: 太陽小学校

---

## 好きなもの

- **食べ物**: カレーライス
- **動物**: 犬
- **教科**: 理科
- **ゲーム**: マインクラフト

---

## 趣味

- **趣味1**: サッカーをする
- **趣味2**: 絵を描く
- **趣味3**: 読書

---

## 夢

将来の夢は、宇宙飛行士になることです。

---

## 友達に一言

みんなと仲良くしたいです！よろしくお願いします。

---

これで私の自己紹介は終わりです。これからもよろしくお願いします！
```

# 完成

## URL
[自己紹介サイト](https://storage.googleapis.com/topdowncom/content/qKtz2qIQ8tZ51Nbate7S7C22Yeb2/ddacfa08-c327-42e2-8389-8738bfa12b94/index.html)

## スクリーンショット

![スクリーンショット 2024-07-01 14.16.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217487/d27b9cf0-1a39-e851-b588-f293a9faec85.png)


# さいごに
markdown AIを使って小学生でも簡単に作成できる自己紹介サイトを作ってみました。実際に作ってみると、シンプルで使いやすく、プログラミングの知識がなくてもすぐにサイトを公開することができました。
ぜひ、皆さんも試してみてください！
【Drupal】Drush で README 作れるんですね

「Drush」使っていますか？

Drupal開発をするにあたって、使わない人はいないCLIツールですよね。

今回は、READMEを1発で作ってくれるスクリプトを発見したので共有します。

### 検証環境

Drush 12系 で試しました。

### コマンド実行

```bash
drush generate readme
```

実行後、2つほど質問があるので答えてください。
モジュールのマシンネームと、モジュール名ですね。

```bash
$ drush generate readme

 Welcome to readme generator!
––––––––––––––––––––––––––––––
 Module machine name:
 ➤ my_module
 Module name [My Module]:
 ➤
```

### 確認

カスタムモジュールディレクトリに、`{module}.info.yml`と`README.md` が作成されているはずです。

```markdown:{module}/README.md
# My module module

@todo Add an introduction that summarizes the purpose and function of the project.

## Table of contents

- Requirements
- Recommended modules
- Installation
- Configuration
- Maintainers

## Requirements

@todo Describe module requirements here.

## Recommended modules

@todo Add recommended modules here if needed.

## Installation

Install as you would normally install a contributed Drupal module. For further information, see [Installing Drupal Modules](https://www.drupal.org/docs/extending-drupal/installing-drupal-modules).

## Configuration

@todo Describe module configuration here.

## Maintainers

- [YOUR_NAME] - [YOUR_NICKNAME](https://www.drupal.org/u/YOUR_NICKNAME)

```

コントリビュートモジュールを作成する時とかに便利そう。

## まとめ

なにかとフォーマットがあると便利ですよね。

## 参考
https://www.drush.org/13.x/generators/readme/
AWS IAM ポリシーの arn と Azure RBACのスコープの比較

AWS の場合、IAM ポリシーで様々な認可制御を行います。

Azure をお使いの人だと、似たような概念は Azure Role-Based Access Control (Azure RBAC)だったりします。

https://learn.microsoft.com/ja-jp/azure/role-based-access-control/overview

Azure RBAC の場合も AWS IAM ポリシーの場合も、許可の対象を指定する必要がありますが、その指定するための文字列に「頭の切り替え」が必要だなと感じた話です。

## Azure RBAC の対象（スコープ）指定

Azure RBAC の場合、Azure ポータルの `アクセス制御 (IAM)` という部分から、対象のリソースに対する認可が設定されたユーザー等が確認できます。

Azure の場合、下記のような階層構造があるので、上位の階層に設定された権限が下位の階層に継承されます。

- (管理グループ)
  - サブスクリプション
    - リソースグループ
      - (リソース種別)
        - リソース

どの範囲に権限を設定するかの指定は「スコープ」と呼ばれ、こちらが AWS の arn に似た概念のように思います。

下記にスコープを文字列表現した形のよく分かる説明があります。

https://learn.microsoft.com/ja-jp/azure/role-based-access-control/role-assignments-cli

例えばリソースに対して権限を設定するなら、

```
/subscriptions/{subscriptionId}/resourcegroups/{resourceGroupName}/providers/{providerName}/{resourceType}/{resourceSubType}/{resourceName}
```

という指定になるので、サブスクリプション > リソースグループ > リソース という階層構造を強く意識した構成をしています。

また、各階層に `subscriptions` や `resourcegroups` のような要素の説明が挟まるので、どの文字列が何を意味しているかが分かりやすいです。

## AWS IAM ポリシーの対象(arn)指定

AWS IAM ポリシーで認可の対象を指定する場合は arn を記載します。

https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/reference-arns.html

```
arn:partition:service:region:account-id:resource-id
```

`partition` の部分はほとんどのケースで `aws` なので、そこより右を Azure と比較してみると、特徴的なのは「サービス」が最初に登場することと、リージョンが登場することです。

強引に Azure の名称っぽく階層を書くと、

- リソース種別（= AWS サービス）
  - リージョン
    - サブスクリプション ID（= AWS アカウント ID）
      - リソース ID

という形になりまして、Azure に慣れている私は頭が混乱してしまいます…

気を取り直して、AWS の arn の特徴としてワイルドカードを使えることが挙げられます。

例えば `arn:aws:s3:::` のように書くと、すべての S3 バケットへのアクセスを指定できます。

また別の良いところとして、例えば S3 の一部のフォルダだけに許可を与える arn も定義できます。

```
arn:aws:s3:::example-bucket/specific-folder/*
```

複雑になっていきますが、IAM ポリシーだけで様々な認可コントロールできるのが特徴的だと感じました。

具体的な IAM ポリシーの例を見てみましょう：

```json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": ["s3:GetObject", "s3:PutObject"],
      "Resource": "arn:aws:s3:::example-bucket/specific-folder/*"
    },
    {
      "Effect": "Allow",
      "Action": "s3:ListBucket",
      "Resource": "arn:aws:s3:::example-bucket",
      "Condition": {
        "StringLike": {
          "s3:prefix": ["specific-folder/*"]
        }
      }
    }
  ]
}
```

このポリシーは、`example-bucket` の `specific-folder` とその中身に対してのみ、オブジェクトの取得と追加を許可し、さらにそのフォルダ内のオブジェクトリストの取得も許可しています。

似たようなことを Azure Blob ストレージで実現する場合は、`ストレージ BLOB データ共同作成者` 等の BLOB に対する認可の権限をコンテナーまで絞ることができて、

```
/subscriptions/{subscriptionId}/resourcegroups/{resourceGroupName}/providers/{providerName}/{resourceType}/{resourceSubType}/{resourceName}/blobServices/default/containers/{containerName}
```

のような形で指定することになります。
ただ、フォルダまでは指定できません。
~~（そもそも Azure の通常の Blob ストレージの場合、画面上は「フォルダー」と出ますが実態は Blob のプレフィックスでしかない）~~
2024/07/07追記: AWSの場合もフォルダはプレフィックスでしたので、上記は不要な記述でした。
https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/using-folders.html
Proxy下でDefault Embeddingsによるchroma run実行

# 問題概要
Proxy内でus-api.i.posthog.comにアクセスできない環境である。chromadbをclient/serverモードで使用したくserverを
```bash
$ chroma run --path ./tmp/chroma
```
などして起動したところ、　　
```
Backing off send_request(...) for 0.2s (requests.exceptions.ProxyError:
HTTPSConnectionPool(host='us-api.i.posthog.com', port=443): Max retries exceeded
with url: /batch/ (Caused by ProxyError('Unable to connect to proxy',
OSError('Tunnel connection failed: 403 Forbidden'))))
```
のようにエラーが出て、起動に失敗する。
これは、Chromadbがユーザー使用状況を測定するために、telemetryによる情報収集を実施しておりus-api.i.posthog.comにアクセスしに行くため。

# 背景情報
## ネットワーク環境
* proxy環境下でコンテンツフィルターがあり、us-api.i.posthog.comにアクセス禁止されている。
## 実行環境
* Ubuntu
* Python 3.12.3
* chromadb.__version__ 0.5.3
* systemdで起動

# 解決策の概要
chromaをサーバーモードで実行する場合、telemetryをdisableにするオプションを指定できない。一部のサイトに記載されていた
```Python
import os
os.environ["POSTHOG_DISABLED"] = "1"
```
を参考に、
```bash
$ export POSTHOG_DISABLED=1
```
などとしてみたが、効果がなかった。
Chroma Docsに環境変数で
```
ANONYMIZED_TELEMETRY=False
```
とするように記載を発見。こっちは効果があることが分かった。
https://docs.trychroma.com/telemetry

そこで、systemdで起動するためのserviceファイルに環境変数を設定した。

# 手順
+ chromadb.serviceを修正
```
[Unit]
Description=Chromadb
After=syslog.target network.target

[Service]
User=root
WorkingDirectory=/opt/chromadb
Environment="PATH=/opt/chromadb/venv/bin:/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin"
Environment="ANONYMIZED_TELEMETRY=False"
ExecStart=/opt/chromadb/venv/bin/chroma run --host xxx.xxx.xxx.xxx --port xxx --path /opt/chromadb/models
Restart=always

[Install]
WantedBy=multi-user.target
```
+ chromadbサービスを停止
```
$ sudo systemctl stop chromadb
```
+ chromadb.serviceを更新し、chromadbをリスタート
```
$ sudo cp chromadb.service /etc/systemd/system/chromadb.service
$ sudo systemctl daemon-reload
$ sudo systemctl enable chromadb
$ sudo systemctl start chromadb
```

# 結果
telemetryが無効となり、us-api.i.posthog.comへのアクセスがなくなり、chromaが正常に起動した。

# 注意事項
* chromadbのクライアントもProxy下ではうまく動作しないため、手当てが必要。こっちも解決済みなので別途説明予定。
* サーバー側でEmbeddingsを計算すると思っていたら、クライアント側で実施し、サーバーはSQLite3でEmbeddingsとその他属性を蓄積するのが役割のようです。
C#で変数を文字列の中に実装してみた

# はじめに
C#で変数を文字列の中に展開するテストを実施したので、忘備録として記事を投稿します。

## やりたいこと
文字列の中に定数変数を展開する。

## 実装したソースコード
```C#
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace Sample305
{
    class Program
    {
        static void Main(string[] args)
        {
            const int NUMBER = 100;
            const string NAME = "大園玲";
            Console.WriteLine(NUMBER);
            Console.WriteLine(NAME);
            Console.WriteLine("{0}のテスト結果は{1}点です",NAME,NUMBER);
        }
    }
}
```

## 実行結果
![test1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1055346/c761320a-db37-370b-10ae-24ff0e81b064.jpeg)

# 最後に
これからC#の記事もUPしてみたいと思います。
BPRの意味とは？メリット・デメリットやDXとの違いなどわかりやすく解説–情報システム部門を刺激するメディア「情シスのじかん」より

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

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

### BPRの意味とは？メリット・デメリットやDXとの違いなどわかりやすく解説
![328e607bc2499f6c647eda477c7eb86b.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3816554/4f748b22-c991-87b7-7b82-52dbd2b88304.jpeg)

本記事では、BPR（Business Process Reengineering）の概要や背景、メリット・デメリットをわかりやすく解説しています。BPRの意味やDXとの違いも解説しており、BPRの導入で企業が抱える悩みを解決する手助けになります。BPRに興味がある経営者やビジネスパーソンに向けた記事です。

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

### 情報システム部門を刺激するメディア「情シスのじかん」とは？
![情シスのじかん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/about