OmniAICreator/Qiita-1.07M huggingface dataset:
初心者向け：AWS CloudShellの便利な使い方とおすすめユースケース集

## はじめに
AWS CloudShellは、AWSユーザーがブラウザ上で簡単にコマンドライン作業を行えるサービスです。

:::note 
サーバーやEC2インスタンスの設定は不要で、AWS環境内で必要な操作がすぐに始められます。
:::

この記事ではCloudShellの概要、使用場面、さらに具体的なユースケースを紹介し、利用のメリットを解説します。

## CloudShellとは
AWS CloudShellは、AWSが提供するブラウザベースのシェル環境です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/ce88c49c-7686-ea91-cb66-dd521adbc117.png)


AWSのCLIや各種プログラミング言語のインタプリタがすぐに利用できるため、インスタンスの作成や管理なしでAWSのリソースを操作できます。

:::note warn
**最初から設定済みのCLIやツールチェーンがあり、追加のセットアップなしで操作が可能です。**
:::

詳細については、以下の公式サイトを参考にしてみてください。

https://aws.amazon.com/jp/cloudshell/

### 特徴

CloudShellの特徴についたは、ざっくりと以下になります。

:::note 
- **セキュリティと利便性：**
IAM権限に基づくアクセス制御が可能で、AWSリソースに直接アクセスできます。

- **一時的なストレージ提供：**
ユーザーの操作中は1GBの一時ストレージが提供され、ファイルの保存やスクリプトの管理が可能です。

- **AWS CLI、Python、Node.jsなどの利用：**
CLIを使ったリソース管理やスクリプトの実行が簡単です。
:::

### どんな場面で使うのか？
AWS CloudShellは、以下のような場面で利用が効果的です。

:::note warn
- **クイック操作が必要な時：**
IAM設定やS3バケットの管理など、少しだけ操作が必要な場合に便利です。

- **リモートワークや出先での作業：**
AWS管理画面さえアクセスできれば、インスタンス作成不要でシェル操作が可能です。

- **実験的な環境：**
設定やツールを破壊するリスクが低く、CLI操作を試したり学習用途としても使えます。

- **CI/CDパイプラインのデバッグ：**
CloudShellからコマンドやスクリプトの動作を確認し、不具合のあるパイプラインを迅速にデバッグできます。
:::

## 実際に使ってみた

### ユースケース⓵: S3バケットの作成
新しいS3バケットを作成する場合、以下のコマンドで実行できます。

```bash
aws s3 mb s3://my-bucket-20241106
```

コマンド実行後、S3のサービス画面からS3バケットが作成されていることが確認できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/1a12ac3c-599d-915e-7af1-38463d356f4a.png)

### ユースケース⓶: IAMユーザーの設定

IAMユーザーを作成する場合、以下のコマンドで実行できます。

```bash
aws iam create-user --user-name your-user-name
```

コマンド実行後にIAMのサービス画面から作成が確認できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/d547f70c-5d3e-d125-29e2-c75c04f13f2a.png)

### ユースケース⓷: RDSのデフォルトMySQLパラメータグループの値をCSV形式で取得

CloudShellから、RDS MySQLのデフォルトパラメータグループの設定値をCSV形式で取得することができます。

以下のコマンドを実行すると、``default.mysql8.0`` パラメータグループのパラメータがCSV形式で取得され、``rds_parameters.csv`` というファイルに保存されます。

```bash
aws rds describe-db-parameters --db-parameter-group-name default.mysql8.0 \
--query "Parameters[*].[ParameterName, ParameterValue, Description]" \
--output text | sed 's/\t/,/g' > rds_parameters.csv
```

CSV形式で取得された ``rds_parameters.csv`` というファイルは、アクションタブの「ファイルのダウンロード」から取得できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/b11c2997-8c72-575e-117a-2b5a8c66b9cb.png)

指定した保存先をダウンロード時に選択できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/7bc41426-0cde-a011-6f44-be54a6dc31ad.png)

少し手間がかかりますが、これを使いこなせると非常に便利です。

## まとめ
AWS CloudShellは、AWS環境での運用やトラブルシューティングに強力なツールです。

:::note warn
**ブラウザ上でCLI操作が可能で、開発や管理に必要なツールが揃っているため、AWSユーザーにとって非常に便利です。**
:::

出先でもリモート作業が可能で、様々なAWSリソースを手軽に管理できます。***AWS CloudShellを活用することで、AWS操作がさらにスムーズに進むと思います！***

## おまけ

ユースケース⓷で取得したCSVファイルには、RDS MySQLのデフォルト値が一覧で確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/19556d52-1666-e593-8cb8-f030b5ea297d.png)

複数のパラメーターグループを整理する際にとても便利です！

## 参考文献

https://qiita.com/miyuki_samitani/items/c7ad49d6264568b578c9
背景に波線を描くのに便利なCSSジェネレーター

# はじめに
学んだことを忘れないように備忘録として残しています

Webサイトでよく目にする、以下のようなセクションやコンテンツ区切りのウェーブをCSSジェネレーターを使って実装していきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3834252/862e57a2-b50d-34a8-fc17-05e881176643.png)



## 今回使用するCSSジェネレーター

この記事では**Get Waves**というジェネレーターを使用していきます。
シンプルな波線のジェネレーターで、デザインのカスタマイズも可能です。色や波の形状を調整でき、SVG形式でダウンロードできるので、そのまま背景に利用できます。
https://getwaves.io/


## 手順
### 1.Get Wavesで波線を作成
Get Wavesを開いてページ上のスライダーやカラーピッカーを使って、波線の形や色をカスタマイします。
デザインが決まったら、「Export SVG」ボタンをクリックして、SVGファイルをダウンロードします。

### 2. SVGを表示させる
SVGはCSSでbackground-imageとして読み込む方法や、直接SVGのコードをHTMLに貼り付ける方法などがありますが、初学者には**imgタグを使う**のがおすすめです。

方法は簡単で、上記1でダウンロードしたSVGファイルをimgフォルダへ移動して、imgタグで読み込むだけです。

```html 

<img src="path/to/your-wave.svg" alt="背景の波線">

```

## まとめ
今回は、Get Wavesを使って簡単にウェーブデザインを作成し、Webサイトに実装する方法を紹介しました。
シンプルな操作でデザインをカスタマイズし、SVG形式でダウンロードできるため、誰でも手軽にオリジナルの背景が作れます。初学者には<img>タグでの表示が推奨されますが、今後CSSのbackground-imageとしての利用やHTMLに直接貼り付ける方法も試してみると、より柔軟に使いこなせるようになります。
Reactについて学んだことをまとめる（その６）

以下のUdemyの講座を受講したので、学んだことをまとめていく。

https://www.udemy.com/course/react_stepup/

## カスタムフック
ロジック部分をカスタムフックとして切り出しておくと使いまわしやテストが楽になる。
カスタムフックは通常の関数とほぼ同じだが、以下の点が異なる。
- 関数名を`use`から始める
- 返り値はオブジェクトで必要な関数・Stateを全て包んで返すか、`useState`など他のフックの返り値の形式に合わせる

### カスタムフックの例
```ts: useAllUsers.ts
//全ユーザー一覧を取得するカスタムフック

import { useState } from 'react';
import { UserProfile } from '../types/UserProfile';
import axios from 'axios';
import { User } from '../types/api/User';

export const useAllUsers = () => {
  const [userProfiles, setUserProfiles] = useState<Array<UserProfile>>([]);
  const [loading, setLoading] = useState<boolean>(false);
  const [error, setError] = useState<boolean>(false);

  const getUsers = () => {
    setLoading(true);
    setError(false);
    axios
      .get<Array<User>>('https://jsonplaceholder.typicode.com/users')
      .then((res) => {
        const data = res.data.map((user) => ({
          id: user.id,
          name: `${user.name}(${user.username})`,
          email: user.email,
          address: `${user.address.city}${user.address.suite}${user.address.street}`,
        }));
        setUserProfiles(data);
      })
      .catch(() => {
        setError(true);
      })
      .finally(() => {
        setLoading(false);
      });
  };

  return { getUsers, userProfiles, loading, error };
};
```

```tsx:App.tsx
import { UserCard } from './components/UserCard';
import { useAllUsers } from './hooks/useAllUsers';

function App() {
  const { getUsers, userProfiles, loading, error } = useAllUsers();
  const onClickFetchUser = () => getUsers();
  return (
    <>
      <div>
        <button onClick={onClickFetchUser}>データ取得</button>
        <br />
        {error ? (
          <p style={{ color: 'red' }}>データの取得に失敗しました</p>
        ) : loading ? (
          <p>Loading...</p>
        ) : (
          <>
            {userProfiles.map((user) => (
              <UserCard key={user.id} user={user} />
            ))}
          </>
        )}
      </div>
    </>
  );
}

export default App;
```
[書籍レビュー]俺たちと探究するLLMアプリケーションのオブザーバビリティ

## はじめに
技術書典の[オンラインマーケット](https://techbookfest.org)でLLMオブザーバビリティに関する良書に出会えたので、紹介したくなり記事にまとめました。

https://techbookfest.org/product/mn0L7GEm3s8Vhmxq971HEi?productVariantID=9SAbZ6tkXwqDPVmk9WM1Cs

私ごとですが技術書が好きなので、いつかリアルでも参加してみたいです。

### 本書の概要
LLMアプリケーションを作っていると、AIの回答精度が気になったりすることありませんか？私は社内ナレッジを回答するRAGを内製していますが気になります。

プロンプトを改善すべきなのか？ドキュメントを最適化すべきなのか、モデルを変更すべきなのか。

そんな課題に対して、LLMアプリケーションを監視することでアプリケーションを最適化しユーザービリティを向上しましょう。その方法を伝授するよ。というのがこの書籍です。

具体的に[Langfuse](https://langfuse.com)によるLLMオブザーバビリティが学べ、ツールの使用方法や活用方法が紹介されています。

https://langfuse.com

なんと‼️ハンズオンまでついていて[Docker](https://www.docker.com/ja-jp/)で手軽に環境構築できるなど、いたせり尽せりです。

### 本書の構成
全5章の構成となっており、前半がLLMやツールの用語や概要を復習。後半がハンズオンになっています。

#### 第１章 本書を読むための基礎知識 
プロンプトエンジニアリングをはじめとした、LLMの用語説明などの記載があります。詳細を確認するためにリンクやドキュメント、論文の紹介など丁寧にまとめられており、わかりやすいです。

LLMだけでなくオブザーバビリティに関する用語の説明もきっちりまとめられています。（すばらしいな）

#### 第２章 LLMオブザーバビリティ
LLMオブザーバビリティの概要。重要性などを学べます。なぜLLMオブザーバビリティが必要なのかという背景やLLMオブザーバビリティをシステムやコストなど開発における様々な観点で記されており、丁寧で非常にわかりやすです。

#### 第３章 LangChainことはじめ
[LangChain](https://www.langchain.com)の概要やよく使う関数が紹介されていて、サンプルコードもあります。開発がメインの書籍ではないですが、十分すぎるほど丁寧にまとめられており、よく読むとマニアックなことも書かれています。
#### 第４章 LLMエンジニアリングプラットフォーム　- Langfuse
Langfuseを利用したLLMオブザーバビリティについて学べます。概要から細かい機能まで紹介されていて、もちろんサンプルコードベースです。

#### 第５章 LLMオブザーバビリティを体験しよう
ついにハンズオンです。いくつかのシナリオにそったLLMオブザーバービリティを体験できます。これはもう体験するしかないですね🚀

### まとめ
私自身、普通のアプリを開発している時以上に、LLMアプリを開発していると監視の重要性や必要性を感じます。

LLMオブザーバービリティはまだ確立された技術ではないと思いますが、実践で試したくなることが盛りだくさんの一冊だと思います。

これでこの価格‼️という値段でこの書籍は購入できます。

たまたま著者のお一人とお話しできる機会があったのですが。「LLMオブザーバビリティの領域は重要なのにまだ認知されていない。技術をもっと広めたい」とおっしゃっていたのが印象的でした。

私自身、この書籍に感銘を受けたので興味がある方はぜひ読んでほしい一冊でした🚀
月刊 技術士(33)  2012年 8月号PE(Professional Engineer) IPEJ Journal Reserchmap(44)

 月刊技術士 2012年 8月号PE(Professional Engineer) IPEJ Journal
 https://researchmap.jp/blogs/blog_entries/view/84202/4ee468235817ca364eb2fc9c1ea7dc88

 IPEJ Journal が届いたら，興味を持ったことを記録するようにします。今年の分は，毎日1月ごと遡って記載予定。（目標3−5項目）

ipejjournal

2012.8月号（写真は1月号）
先頭の数字はページ数（目次の形式）

p.8.環境・エネルギーシリーズ　風力発言設備の現状と展望について　長岡義嗣（電気）
<勉強になる点>
風況図をNEDOが出している。
中国で風力の導入が多い。

<個人的な記録>
騒音をはじめとする風力発電の技術的な課題を解決する鍵が何か。

p.12.　安全安心シリーズ　人・情報・技術のネットワークでつなぐ未来　川原伸朗（建設／総合）
　<勉強になる点＞
　復興技術士制度（宣言，紹介）
　防災支援活動の在り方（人と人のつながり，平常時の活動，技術で解決できないl課題，被災者に寄り添う専門家）

<個人的な記録>
　原理原則としてすばらしい内容。個別具体的な事項の積み重ねを実践したい。　

p.19　震災を考慮した多重な道路防災技術　山口茂（建設）
　<勉強になる点＞
　道路防災技術のあり方
　多重防御ライン
　冗長性の確保

<個人的な記録>
　「あらゆる分野の専門家集団として，道路防災技術のあり方についてさらに横断的に議論を進め，かけがえのない人や財産を守る社会システムづくりへ「技術者集団」として貢献できるものと確信している」に協力。

p.31. 会員の著作紹介　
技術士が調査した新聞の実態と改革への期待
三田 和朗(応理、総合) 高城書房出版 2011/05
http://www.amazon.co.jp/dp/488777141X
https://booklog.jp/item/1/488777141X
https://bookmeter.com/books/3309257
>技術士が書いているが技術書ではない。
p7.「組織には必ず「組織生存のためのシステム」があり、長期間にわたって安定を維持してきた組織には必ず「無責任の構造」が蔓延（はびこ）ります。」やや決めつけで、自然科学的な態度ではないかも。章立てとそこで参考、引用している文献を列記する。
まえがき
岡本幸一　無責任の構造
藤原正彦　国家の品格
石川旺　パロディングが招く危機
佐藤卓己　輿論と世論
１　新聞の現状
マスコミの誤報を正す会
梓澤和幸　報道被害
河野義行　報道は何を学んだのか
太平洋戦争と新聞
満州事変から日中戦争へ
新聞　資本と経営の昭和史
戦後５０年　メディアの検証
日米開戦への道
占領期の朝日新聞と戦争責任
朝日新聞の戦後責任
渡辺正　ダイオキシン　
アメリカの政治と科学　マイケル
２　新聞の権益と法律
日本の組織ジャーナリズム
新聞が面白くない理由
記者クラブ崩壊
崩壊する新聞
押し紙という新聞のタブー
新聞学　浜田純一
新聞販売の闇と戦う
３　メディアリテラシー
メディアコントロール
世界が愛した日本
放送分野における青少年とメディアリテラシーに関する調査研究会報告書
メディアリテラシー　菅谷明子
パロディングが招く危機
４　新聞の改革
火をつけた従軍慰安婦欺瞞報道の系譜
マスコミ崩壊　三橋
朝日新聞の戦後責任
新聞は新だ　片岡
新聞の時代錯誤　大塚
貧乏大国アメリカ　堤
アメリカから自由が消える
５　民主主義と新聞
民主主義という錯覚
秘密と嘘と民主主義
メディアとプロパガンダ
日本国の正体　長谷川
東大講義録　堺屋太一
押し紙という新聞のタブー
６　人類と情報
人類の足跡　１０万年全史
言論改革　韓国・新聞権力の世論支配に挑む
朝日新聞が報道した日韓併合の真実
ユダヤ・キリスト・イスラム集中講座
荒野の宗教　緑の宗教
技術に関する新聞の報道のあり方を解いた方が説得力があるかもしれない。

<勉強になる点>
新聞の現状
新聞の権益と法律
メディアリテラリー
新聞の改革
民主主義と新聞
人類と情報

<個人的な記録>
技術者が新聞を読んだら、まず最初に一次情報源で確認することが大切。
論文、特許、規格を見て、新聞がどこまで正確に情報を把握しているかを確認。
模擬試験、追試を行うのも基本。
当事者に記事の事実の割合を確かめる。
当事者からすると機密、未発表の事項を合わせると虚偽になるかもしれない。
商売に影響する場合にどのような反論方法があるか。
機密事項がある場合には顧客に個別に説明するしかないかも。
新聞、一般誌の記事で踊っているのは技術者ではない。

＜この稿は書きかけです。順次追記します。＞

技術士の専門分野は，2文字で略して（）書き。
総合：総合技術監理，応理：応用理学，電気：電気電子，水道：上下水道，原子：原子力・放射線，航空：航空・宇宙、船舶：船舶・海洋

twitter：@kaizen_nagoya
月刊 #技術士 2012年8月号 #PE #ProfessionalEngineer #IPEJJournal  http://bit.ly/12USp7c #長岡義嗣 #川原伸朗 #山口茂 #三田和朗 

ps.
日本技術士会は、技術士法第５４条に基づき、「全国の技術士の品位の保持、資質の向上及び業務の進歩改善に資するため、技術士の研修並びに社員の指導及び連絡に関する事務を全国的に行うことを目的とするもの」です。
会員誌として月刊「技術士　PE: IPEJ Journal」を発行しています。PEはProfessional Engineerです。ISSN:　03891488です。国立国会図書館をはじめ、主要な公共図書館で所蔵しています。

名古屋市内では　愛知県図書館２５９号（１９９０年４月号）から、名古屋市鶴舞中央図書館５０３号（２００９年１月号）から
公的試験研究機関の図書館（室）で所蔵していることがあります。名古屋市内では名古屋市工業研究所産業技術図書館。
大学図書館ではWEBでNIIで検索すると１０３館で所蔵しています。名古屋市内では
名工大 527-551<2011-2012>+　名大工 工中央雑誌 515-551<2010-2012>,  名大工 工土木 515-551<2010-2012>　金城院 526-533,535-543<2010-2012>　と出てきます。しかし、名城大学、名城大学都市情報 のように所蔵していても出てこない場合もあります。 大学図書館などで個別に検索してみてください。

検索方法としては２つの方法があります。
１「　標題：技術士　発行所：日本技術士会  」で検索する。
２「ISSN: 03891488 」で検索する。

ps2.
月刊「技術士」平成三陸津波後記載復興、支援記事みだし一覧
会員誌月刊「技術士」の一覧　PE(Professional Engineer) IPEJ Journal
技術士が書いた本のお勧め（単著まはた著者全員技術士）
2012年分 月刊技術士（IPEJ Journal）「著作紹介」の書籍
PHPのパターンマッチで遊んでみた

## はじめに

先日、Ruby の強力なパターンマッチを試して楽しみました。その直後にたまたま久し振りに PHP に触る機会があったので PHP でもパターンマッチができないか調査してみました。

https://qiita.com/mnishiguchi/items/53b55deae8e033562a55

2020 年の PHP 8.0 に[match 式](https://www.php.net/manual/ja/control-structures.match.php)が導入されていました。PHP でもパターンマッチができます！

https://php.watch/versions/8.0

https://php.watch/versions/8.0/match-expression

https://www.php.net/manual/ja/control-structures.match.php

試してみます。

## PHP の`match` 式とは

公式ドキュメントに以下の通り記されています。

> match 式は、値の一致をチェックした結果に基づいて評価結果を分岐します。

https://www.php.net/manual/ja/control-structures.match.php

同僚が Elixir や Rust のパターンマッチを利用してスマートに課題解決しているのをみたことがあります。

https://qiita.com/haw_ohnuma/items/dd329bc9c5da78967e7c#fizz-buzz

https://qiita.com/torifukukaiou/items/966b71497f04c7fb5882

https://qiita.com/torifukukaiou/items/a273565bd2643c4017c1#elixir

PHP でも同様の記述ができるのでしょうか？これは期待できます。

## PHP の`match` 式で素振り

せっかくなので自分で手を動かしてみようと思います。

Docker を利用すると氣軽に PHP の対話シェルが開けます。

```bash:terminal
docker run --rm -it php:8.3-cli-alpine
```

ためしに数字を漢字に変換して遊びます。

```php
function number_to_kanji($n) {
  return match ($n) {
    1 => "壱",
    2 => "弐",
    3 => "参",
    4 => "肆",
    5 => "伍",
    123 => "元氣",
    default => "何じゃこれ？"
  };
}

foreach (array(1, 2, 3, 4, 5, 123, 456) as $n) {
  echo number_to_kanji($n).PHP_EOL;
}
```

```bash:結果
壱
弐
参
肆
伍
元氣
なんじゃこれ？
```

うまくいきました！

ちなみに `match` 式は、全ての場合を網羅していないので、想定外のパターンをエラー（`UnhandledMatchError`）にしたくなければ`default`を定義する必要があるようです。

配列のマッチもできるようです。

```php
echo match ([1, 2, 3]) {
  [1] => "壱",
  [1, 2] => "壱弐",
  [1, 2, 3] => "壱弐参",
  default => "闘魂"
};
```

```bash:結果
壱弐参
```

どうも PHP の `match` 式ではパターンマッチ実行時の代入はできなさそうです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82804/ebee0656-cd79-0684-459e-cd8a2016266a.png)

また、部分的なパターンマッチや`_`で値を無視することもできなさそうです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82804/f6d54a2e-1d20-18c0-3e03-b1cbdb57eb1c.png)

Ruby ではこんな記述ができました。

```rb:irb
irb> config = {db: {user: "admin", password: "abc123"}}
irb> config => {db: {user: db_user}}
irb> db_user
=> "admin"
```

https://qiita.com/jnchito/items/9bb4aa1dcefa00257815

Elixir でもこんな記述ができました。

```elixir:iex
iex> config = %{db: %{user: "admin", password: "abc123"}}
iex> %{db: %{user: db_user}} = config
iex> db_user
=> "admin"
```

https://qiita.com/torifukukaiou/items/deadb6af7df6d15ad7a7

言語によりパターンマッチの仕様が異なるので注意が必要ですね。:bulb:

## PHP の `match` 式で Fizz Buzz

`match` 式では このように`0` に対して条件式の結果をマッチするというユニークな記述ができるそうです。

```php
function numberToFizzBuzz($n) {
  return match (0) {
    $n % 15 => "FizzBuzz" ,
    $n % 3  => "Fizz",
    $n % 5  => "Buzz",
    default => $n,
  };
}

function fizzBuzz($count) {
  foreach(range(1, $count) as $n) {
    echo numberToFizzBuzz($n).PHP_EOL;
  }
}

fizzBuzz(16);
```

```bash:結果
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
16
```

:tada:

## さいごに

文法になれてしまえば、PHP でも比較的簡単にパターンマッチができることがわかりました。

複雑なロジックを簡潔で明確なコードで表現できる可能性があると思いました。

今後、さらに実践的なプログラムでも試していこうと思います。
Reactで、モックサーバにMSWを使う

# はじめに
最近、プロジェクトでReactを使うということで、改めて整理を始めたところです。
一応、以前のプロジェクトで利用したことはあるものの、私自身はそれほど技術選定にも関わらず２機能くらい実装しただけで、すっかり忘れてしまっています。

また、モックサーバについては、MSWも選択肢としては上がったものの最終的にJSON Serverを利用したこともあり、MSWに関する知識は皆無です。

で、改めて調査を始めたところ、結構古い記事が多いのと、バージョン２で破壊的変更がされたようでそのままでは動かないものが多数あったので、改めて記事を書くことにしました。

# MSWって
MSW（Mock Service Worker）は、フロントエンドのテストに使用されるモックライブラリです。MSWは、Service Workerを利用してブラウザ上で動作し、実際のAPIエンドポイントにリクエストを送らずにレスポンスを返すことで、バックエンドが未完成の場合でもフロントエンドの開発を進められます。

## MSWの主な機能
- APIリクエストのモック：HTTPリクエストをキャッチして、指定したレスポンスを返却
- 開発とテストに適応：フロントエンドの開発中やテスト環境でのみモックを有効にすることができる
- レスポンスの遅延：APIのレスポンスに遅延を加えることで、ネットワークの遅延をシミュレーションし、UXのテストが可能
- 条件分岐のモック：リクエストのパラメータやパスに基づいて、異なるレスポンスを返すことができる

# 環境
React 18.3.1
axios 1.7.7
msw 2.6.0

# やってみる
## インストール
環境はできている前提で、以下のコマンドでインストールします。

```bash
npm install -D msw
```
## mockServiceWorker.jsを作る

まず、MSWを実行するためには、mockServiceWorker.jsが必要になるので、
このファイルを生成します。これで準備完了

```bash
npx msw init public/ --save
```

## handlers.ts
モック化したいAPIをこのHandlerに追加していきます。
詳細は割愛しますが、delayで遅延を入れることもできるので、UIの確認に有用だと思います。

```TypeScript:src/mocks/handlers.ts
import { http, delay, HttpResponse } from 'msw'

export const handlers = [
  http.get('/api/user', () => {
    return HttpResponse.json({
      id: '123',
      firstName: 'John',
      lastName: 'Doe',
    })
  }),  
  http.get('https://api.example.com/data', async() => {
    await delay(1000);
    // モックデータを定義
    const mockData = [
      { id: 1, name: 'Item 1', address: 'test1', tel: '999-9999-9999' },
      { id: 2, name: 'Item 2', address: 'test2', tel: '888-8888-8888' },
      { id: 3, name: 'Item 3', address: 'test3', tel: '777-7777-7777' },
    ];

    return HttpResponse.json(mockData);
  }),
    // 他のエンドポイントもここに追加できます
];
```

## browser.ts
モックサーバーをブラウザでセットアップするためのものです。

```TypeScript:src/mocks/browser.ts
import { setupWorker } from 'msw/browser'
import { handlers } from './handlers'
 
export const worker = setupWorker(...handlers);
```

## main.tsx
最後に、main.tsxで、開発モードの場合のみ、MSWを有効かするようにします。

```typescript:src/main.tsx
import { StrictMode } from "react";
import { createRoot } from "react-dom/client";
import { BrowserRouter as Router } from "react-router-dom";
import App from "./App.tsx";

async function enableMocking() {
  if (import.meta.env.MODE !== "development") {
    return;
  }

  const { worker } = await import("./mocks/browser");

  return worker.start({
    onUnhandledRequest: "bypass", // もしくは 'warn' または 'error'
  });
}

enableMocking().then(() => {
  createRoot(document.getElementById("root")!).render(
    <StrictMode>
      <Router>
        <App />
      </Router>
    </StrictMode>
  );
});
```

# 最後に

これで、無事APIのモック化ができて、ローカルでの開発がスムーズに進められそうです。
MSWの機能については、公式ドキュメントもあるので、そちらを見ながら、順次試していこうと思います。
Robocode Robot File Download

# Robocode Robotファイル ダウンロード

- 優秀なRobot
https://robowiki.net/wiki/Robocode/Downloading_Robots

- Robot
https://robowiki.net/wiki/Category:Bots

上記ページでRobotの特長を調べて、下記ページからダウンロードする
- ファイル ダウンロード リスト
http://robocode-archive.strangeautomata.com/robots/

# Robotファイル インポート
Robocodeの
[Robot] - [Import robot or team]で、ダウンロードした.jarファイルを指定する
Reactではじめてのアプリ作り

## 作ったもの
Reactを学んで一発目のアウトプットとして、簡易的な学習記録アプリを作成しました。
javascript + Reactを使用しています。スタイルは全く当てておりません...。

　　　　　![学習記録アプリ概要.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3921530/9ed6674e-2fcc-2922-064f-0d234103a388.gif)

## 機能
- 学習内容とその時間を記録する
- 確認用にフォームに入力中の内容を表示する
- 登録した内容をリストで表示する
- リスト内にある学習時間を合計して表示する
- 内容 or 時間がブランクの状態で「登録」が押下されるとエラーメッセージを表示する

## 作ってみての所感
- javascriptに慣れねば...
業務に必要な知識をつまみ食いでしか学習したことがなかったこともあり、構文の書き間違いなどで時間を食ってしまいました。配列、オブジェクトのデータの扱うことが山ほどでてくるはずですので、今のうちに復習しておかないとですね。変数、関数の命名も適当にやってしまっていたので、慣例的なものを調べて読みやすいコードにすることも心がけたいです。


- stateがむずい...
中身が実際に更新されるのはどのタイミングなのか、直感的に分かりづらかったです。再レンダリングについてまだ理解しきれていないため、これも要復習ですね。

- インプットはなかなか定着しないもの
Udemyの動画を見ている時は、ふんふんヨユーヨユーと思っていましたが、いざ実装するとなると思いの外手が動かないです。あーでもないこーでもない、どれだっけこれだっけ、と模索して脳みそを絞っている時間はしんどいですが、これだ！と解決策を見つけた時はかなりの達成感がありますね。そのドーパミンが出る瞬間が一番成長を実感できているかもしれません。
１日１ドーパミン目指したいです。
# JISOUのメンバー募集中！
プログラミングコーチングJISOUでは、新たなメンバーを募集しています。
日本一のアウトプットコミュニティでキャリアアップしませんか？
興味のある方は、ぜひホームページをのぞいてみてくださ！
▼▼▼

https://projisou.jp
PythonCall.jlを既存のcondaで環境管理する方法

Juliaの勉強中。これまで`PyCall.jl`+`matplotlib`で作図していたが、今回`PythonCall.jl`+`matplotlib`の利用を試み、その環境管理の方法をまとめる。

結論、既存condaで管理しているenvsをそのまま利用することは自分にはできなかったが、既存condaの`conda`コマンドを利用してパッケージ管理をする方法にたどり着いた。

公式フォーラムでは、新たに導入するのであれば[PythonCall.jlをお勧めする](https://discourse.julialang.org/t/how-to-choose-between-pycall-jl-and-pythoncall-jl/100214)、と言っている人がいる。


## 環境
- Intel iMac, macOS Sequoia 15.0.1
- conda 23.11.0
- julia 1.11.1

## 0. juliaのアンインストール
`juliaup`の利用を想定。
環境変数の情報が内部に残るみたいで、ゼロから構築する方が確実だった。`.julia`も確実に削除、パスは要確認。
```bash
juliaup self uninstall
rm ~/.julia
```

## 1. juliaのインストール
[公式](https://julialang.org/downloads/)を参照。
```bash
curl -fsSL https://install.julialang.org | sh
```
カスタマイズは多分で任意で大丈夫（今回はデフォルト）。

## 2. 環境変数の設定
多分ここが大事、最初に設定することが大事、多分。
```bash
export JULIA_CONDAPKG_EXE=path/to/ana(mini)conda/bin/conda
export JULIA_CONDAPKG_BACKEND=""
export JULIA_CONDAPKG_ENV=""
```
一つ目の`export`は使いたい`conda`コマンドへのパス[^1]。
[^1]:デフォルトだとmabma(minimamba)でパッケージ管理がなされるが、これは最新バージョンの追従が遅いので、例えば`cartopy`をインストールすると`pyhton3.9`、`matplotlib1.x`へダウングレードされてしまって涙。

二つ目と三つ目の`export`は<b><font color="red">絶対に設定してはいけない</font></b>という戒めから明示的に空[^2]。実行の必要はない、多分。
[^2]:ENVの方へ`CONDA_JL_HOME`よろしく既存conda環境のパスを指定し`conda add`したら、その環境を改変し始めた。。（途中エラーで改変されることはなかったが）

`PyCall.jl`は既存のconda環境をそのまま流用できたが、`PythonCall.jl`は既存のconda環境を使おうとするとshellにkillされてしまう（自分だけ？）。

試しに`JULIA_CONDAPKG_ENV`に既存conda環境のパス(envs以下)を指定し、`PythonCall.jl`が問題なく使えるなら解決、以下は不要。失敗したら`0.juliaのアンインストール`からやり直し。

## 3. CondaPkg.jlのインストール
julia REPLを起動、Pkgモード (])へ入り、まず`CondaPkg.jl`[^3]をインストールする。
[^3]:`PythonCall.jl`は`CondaPkg.jl`を利用し`PyCall.jl`は`Conda.jl`を利用するが`CondaPkg.jl`は`Conda.jl`と独立である一方`PythonCall.jl`は`PyCall.jl`のconda環境を利用することができる[らしい](https://discourse.julialang.org/t/how-to-use-pythoncall-with-a-previous-conda-environment/87419)（WT*?!💢）。類似名の乱立はGPTの混乱をもたらしそうでNG。
```bash
julia
```
```julia
pkg> add CondaPkg
```
ここで`JULIA_CONDAPKG_EXE`のコマンドが利用される。環境変数がリフレッシュされた場合はデフォのmambaが動き出す。それが嫌なので毎回`export`必須。初回で必要なパッケージを揃えてしまうのがよろしい。

`CondaPkg`を読み込む．
```julia
julia> using CondaPkg
```

pkgモードへ移行し，必要なパッケージをインストール。
```julia
pkg> conda add matplotlib cartopy
```

## 4. PythonCall.jlのインストール
```julia
pkg> add PythonCall
```
あとは`PyCall.jl`と同様に使える。
```julia
julia> using PythonCall
julia> plt=pyimport("matplotlib.pyplot")
julia> ccrs=pyimport("cartopy.crs")
```

一応バージョンを確認する。
```julia
julia> m=pyimport("matplotlib")
julia> m.__version__
```
Python: '3.9.2'

```julia
julia> c=pyimport("cartopy")
julia> c.__version__
```
Python: '0.24.0'

成功🎉
なお、自分は作図で満足につき、他パッケージは未検証。

## あとがき
新環境の構築が必要だが、buildが無い分`PyCall.py`よりある意味楽ちんかも。

## 参考
[PythonCall & JuliaCall - Guide](https://juliapy.github.io/PythonCall.jl/stable/pythoncall/)
Ping とAzure VMの関係まとめ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620054/5d10b58d-8e7a-c78c-179c-d325d4b868a4.png)
Ping コマンドとAzure VMの関係をまとめました。実機にも検証済み。忘れないように記録しておきます。
【TryHackMe】Passive Reconnaissance：Walkthrough

# 概要

TryHackMe「Passive Reconnaissance」のWalkthroughです。

https://tryhackme.com/r/room/passiverecon

# Task2

## **Q1**.*You visit the Facebook page of the target company, hoping to get some of their employee names. What kind of reconnaissance activity is this? (A for active, P for passive)*

**A**.**P**

## **Q2**.*You ping the IP address of the company webserver to check if ICMP traffic is blocked. What kind of reconnaissance activity is this? (A for active, P for passive)*

**A**.**A**

## **Q3**.*You happen to meet the IT administrator of the target company at a party. You try to use social engineering to get more information about their systems and network infrastructure. What kind of reconnaissance activity is this? (A for active, P for passive)*

**A**.**A**

# Task3

## **Q1**.*When was TryHackMe.com registered?*

**Hint**.*Use the format YYYYMMDD*

`whois`コマンドで情報を取得します。

```
$ whois tryhackme.com

(省略)

Creation Date: 2018-07-05T19:46:15Z
```

**A**.**20180705**

## **Q2**.*What is the registrar of TryHackMe.com?*

**Hint**.*Give its domain name*

```
Registrar WHOIS Server: whois.namecheap.com
Registrar URL: http://www.namecheap.com
```

**A**.**namecheap.com**

## **Q3**.*Which company is TryHackMe.com using for name servers?*

**Hint**.*Give its domain name*

```
Name Server: KIP.NS.CLOUDFLARE.COM
Name Server: UMA.NS.CLOUDFLARE.COM
```

**A**.**cloudflare.com**

# Task4

## **Q1**.*Check the TXT records of thmlabs.com. What is the flag there?*

`thmlabs.com`の`TXT`レコードを確認します。

```
$ dig thmlabs.com TXT

(省略)

;; ANSWER SECTION:
thmlabs.com.            300     IN      TXT     "THM{a5b83929888ed36acb0272971e438d78}"
```

**A**.**THM{a5b83929888ed36acb0272971e438d78}**

# Task5

## **Q1**.*Lookup tryhackme.com on DNSDumpster. What is one interesting subdomain that you would discover in addition to www and blog?*

`DNSDumpster`で`tryhackme.com`を検索します。

https://dnsdumpster.com/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/ad2c48f0-a024-8939-2212-0a83fdf0d8b0.png)

**A**.**remote**

# Task6

## **Q1**.*According to Shodan.io, what is the 2nd country in the world in terms of the number of publicly accessible Apache servers?*

**Hint**.*To find the answer, you can search for Apache on Shodan.io.*

`shodan`でapacheを検索します。

https://www.shodan.io/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/52a11f55-e9e0-991e-74ef-37b7ca936b4e.png)

**A**.**Germany**

## **Q2**.*Based on Shodan.io, what is the 3rd most common port used for Apache?*

**Hint**.*To find the answer, you can search for Apache on Shodan.io.*

`apache`で検索し、portのランキングを確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/0a99d848-280c-aed6-534d-b9757d616620.png)

**A**.**8080**

## **Q3**.*Based on Shodan.io, what is the 3rd most common port used for nginx?*

**Hint**.*To find the answer, you can search for nginx on Shodan.io.*

`nginx`を検索し、portのランキングを確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/9bd996bb-6da9-f19f-60a0-b0dff9e12448.png)

**A**.**5001**
Power AutomateでTeamsのチーム 所有者 / ゲスト ユーザーの一覧を取得する

# 所有者の一覧を取得する方法
［HTTP要求V2を送信する］アクションでURIを設定します。

```httml:URI
https://graph.microsoft.com/v1.0/groups/@{outputs('チームの取得')?['body/id']}/owners
```

<img width="700" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3640497/0ea3a378-7c05-ca24-b178-b2a77dd066a1.png">

# ゲストの一覧を取得する方法
1.［HTTP］アクションを利用して、Access Tokenを取得します。

<img width="1800" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3640497/475e1788-0f0b-e0f9-ef20-914100b431dd.png">

認証設定については、以下の過去記事をご確認ください。

https://qiita.com/wawawabox/items/ed951c03a50643594d05

2.［JSONの解析］アクションでHTTPの出力を解析します。

<img width="700" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3640497/6d3ac74e-c4fb-b867-5547-9d9b217bd541.png">

3.［作成］アクションでAccess Tokenを出力して、次のアクションに使用します。

<img width="700" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3640497/14bb2aeb-49fd-511e-bbb9-32350be0139a.png">

4.［チームの取得］アクションで該当のチーム名を選択します。

<img width="700" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3640497/2ec9a065-d3a2-0208-b5a6-28d6cca3cdf9.png">

5.［HTTP］アクションを再度使用して、チームメンバーの詳細を取得します。

<img width="700" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3640497/798f26ba-0010-2b01-f97d-b49f30f7ff0d.png">

6.［JSONの解析］アクションで「roles」を取得します。

<img width="700" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3640497/800c752b-554c-3e05-6f35-e7d09ba0b2de.png">
<img width="700" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3640497/e4593cb6-2f12-647f-c1f3-cb4c09f1e525.png">

7.［アレイのフィルターを処理］アクションで、「roles」にguestを含むユーザーをフィルターします。この方法でゲストユーザーの一覧を取得します。

<img width="700" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3640497/3a7a96a3-b863-798d-c925-dc193a012584.png">
<img width="700" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3640497/bd780d25-44fc-b12e-2510-75cc4504bd70.png">
<img width="700" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3640497/c341d02a-5a67-6856-20b3-add7def65684.png">
RailsアプリのDevContainer化 #2

## はじめに
今まではdevcontainerの環境を作ってから、そこにrails newしたりしていました。
今回は、すでにあるアプリをdevcontainer化する方法を紹介するのと、とても簡単な方法を見つけたので前回の記事の改良版です。

## 手順

- vscodeでwebアプリのファイルを開きます。
開けたら、画面左下の`><`(`cmd`+`shift`+`p`)を押してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802303/694960fb-ceef-d362-4594-34ff78221552.png)

- `コンテナーで再度開く`みたいな欄があると思うのでそこを押してください。

- 次のダイアログで `ワークスペースに構成を追加する` を選択することで、リポジトリに設定ファイルを追加して他の開発者と同じ環境を共有することができます。

ちなみに、`ユーザーデータフォルダーに構成を追加する`を選択すると設定ファイルはリポジトリに追加されず、ローカルでのみ Dev Containers を利用できるらしいです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802303/564e52f2-bc43-b4b9-92bb-cb3d933ef98e.png)

- 次にベースとなるテンプレートを選択します。
今回は、`Ruby on Rails & Postgres`を選びました。

各テンプレートでは開発環境や OS のバージョンなどを追加で指定できる場合もあります。

最後に追加でインストールするソフトウェアなどを選択します(Features と呼ばれます)。Features には Docker-in-Docker を実現するものや ruby などの開発環境をインストールするものなど様々なものがあるります。ちなみに、今回は入れませんでした。(使い方がよく分からず、消しました。)

- Features の選択後、しばらく待っていればコンテナが立ち上がり、開発を開始できます。Dev Containers 環境を正しく構築できた場合、以下のように左下の `><` に `開発コンテナー: * `という表示が追加されているはずです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802303/97403343-b998-4220-54a7-aa373501517a.png)

一旦ここまでで、devcontainer自体は完成しました。

## 詰まったこととか

### rubyのバージョンの話
前述した方法は、最新のバージョンに合わせて自動でファイルが作られます。
ですが、今回は気分的に **ruby 3.1.2**に合わせたかったので、いろいろ変更する必要がありました。
> https://mcr.microsoft.com/v2/devcontainers/ruby/tags/list
>恐らくここに載ってるタグは、簡単に設定できると思います。

- 解決策
      GemfileのほうのRubyバージョン指定を
    ruby '3.1.2' (3.1.2指定)
    から
    ruby '~> 3.1.0' (3.1.xならOK)
に変更しました。

### Railsが消えちゃった話
rails が突如として消えました。(何故か、よく消える...)

- 解決策
  bundler installしたら上手く行きました。

### DockerにNode.jsとか入れてあげた話
```console
Could not find a JavaScript runtime.
```
javascript runtimeってなんやろ。
[Rails 7.0正式リリース、Node.js不要のフロントエンド開発環境がデフォルトに](https://www.publickey1.jp/blog/21/rails_70nodejs.html)
Rails7.0以外には、node.js いるんか〜

[Railsサーバー起動時の『Could not find a JavaScript runtime』エラー対応方法](https://qiita.com/nishina555/items/2d00a27ce9e0d0aca9b6)
この辺りの記事を参考に
- 解決策
dockerfileに以下の文を追記
```
# JavaScriptの依存関係をインストール
RUN yarn install --check-files
```

なんか知らんけど、いけた！🙌
Amazon Linux 2023 に docker-compose plugin をインストールする方法

もう何番煎じかもわからないようなネタですが、検索すると `/usr/local/bin` に設置する方法が未だにヒットするので、少しでも検索結果が良くなるように（そして各種 AI が古い方法を答えなくなるように）書いておきます。


# 結論
2024-11-06 時点では RPM で提供されてないので、Github からダウンロードしてプラグイン用のディレクトリに設置してください。
アーキテクチャはご自身の環境に合わせてください。
最近 arm 使いがち。

```sh
$ sudo dnf install docker
$ curl -sSL -J -O 'https://github.com/docker/compose/releases/download/v2.30.2/docker-compose-linux-aarch64'
$ ll
total 60872
-rw-r--r--. 1 user_a user_a 62329859 2024-11-06 18:27 docker-compose-linux-aarch64

$ sudo mkdir -p /usr/local/libexec/docker/cli-plugins/
$ sudo cp docker-compose-linux-aarch64 /usr/local/libexec/docker/cli-plugins/docker-compose
$ sudo chmod +x /usr/local/libexec/docker/cli-plugins/docker-compose

$ docker compose version
Docker Compose version v2.30.2
```

# 詳細

そもそも上記の手順はちゃんと公式に書いてあります。

> You can download Docker Compose binaries from the release page on this repository.
> 
> Rename the relevant binary for your OS to docker-compose and copy it to $HOME/.docker/cli-plugins
> 
> Or copy it into one of these folders to install it system-wide:
> 
> /usr/local/lib/docker/cli-plugins OR /usr/local/libexec/docker/cli-plugins
/usr/lib/docker/cli-plugins OR /usr/libexec/docker/cli-plugins
(might require making the downloaded file executable with chmod +x)

https://github.com/docker/compose?tab=readme-ov-file#linux 


公式ドキュメントにパッケージ提供されてる手順しかないのがそもそもの原因という気がします。
`Other Linux` とかでこの手順を追加してくれれば助かる人は増えそうですよね。

https://docs.docker.com/desktop/install/linux/

更に言ってしまえば、 Amazon Linux 2023 のリポジトリに入れといてくれれば不要な苦労というだけなんですが刺されたくないのでここまでにしておきます。


# 邪道（自己責任）

実は RHEL-9 用のビルドが使えたりします。きっと CentOS-9 用のビルドも使えるでしょう。

```sh
$ sudo dnf install 'https://download.docker.com/linux/rhel/9/aarch64/stable/Packages/docker-compose-plugin-2.29.7-1.el9.aarch64.rpm'
```

ちゃんと dnf でリポジトリ管理してあげればこんなことも可能ですが、なんの保証もなく ~~可能性はほぼゼロだけど~~ 問題が発生したときに調査するのが面倒なだけなので、本番では使ってません。

```sh
$ sudo dnf config-manager --add-repo https://download.docker.com/linux/rhel/docker-ce.repo
$ sudo dnf install --repo docker-ce-stable --releasever 9 docker-compose-plugin
```
福岡出身システムエンジニア誕生記(フリーランスになるまで)

# はじめに

初めまして、自己紹介させていただきます。

1995年生まれ福岡出身フリーランスエンジニアです。
先日福岡に帰省して、いろいろ自分のこと振り返るの大切だなとおもい、
今回記事を書くことを決断しました。

普通の人間がフリーランスになって生活しているという一例をシェアできたらとおもいます。
誰かの参考になれば幸いです！

今回は社会人1年目後半について書いてみようと思います。

# 目次
少し細かく振り返りながら記載するので複数記事書く予定です！
##### ・学生~就活編⇒https://qiita.com/Yutajino/items/bf074102e254457af934
##### ・1年目前半編⇒https://qiita.com/Yutajino/items/37d0ab0cd64d063870b7
##### ・1年目後半編⇒本記事
##### ・2年目前半編⇒https://qiita.com/Yutajino/items/fccb4ce3c38186d0eb3b
##### ・3年目編⇒完成次第リンク貼ります
##### ・フリーランス~失敗編⇒完成次第リンク貼ります
##### ・失敗~現在編⇒完成次第リンク貼ります

# 良き先輩に出会う・学ぶ①

研修明け早々やらかしてしまった私ですが、
幸運なことに、一年目から
所属部署の20代の統括リーダーと案件に参画することが多かったです。

20代で、部署内の10人程度を取りまとめる統括リーダーの姿を間近で見ることができ
かっこいいなと純粋に思いました。

先輩からは、
自分がマネージャー志望(開発のスペシャリストではない)とキャリア希望を出していたので、
開発の知識を教えてもらいながらも、
プロジェクトにおいて何を抑えておくべきか、どのように進めていくべきかを、
伝えてもらいました。

先輩にたくさんのことを教えてもらってますが、
しっかりやって、よかったなと思うことは
##### 議事録作成、ドキュメンテーション能力
です。

開発をしているのに、議事録、ドキュメントなんて作ってられない！
手間がかかるからなんとなくでOKという方は、ぜひ一度しっかり
資料作成をしたほうがいいと思います！

自分の最初の頃、
「議事録ばかり取って会議面白くない」
「リラックスして参加したいな」
とか思ってました。

ただ、議事録を整理して取ることによって、
お互いの合意やTodoなどが証拠として残り、
その先のプロジェクトを丁寧に進めることができます。

また、議事録取りまとめることで、
自分の頭にお客様の情報や業種業態の知識が残っていきます。

資料に関しても、
フォントのサイズや、図形の配置、
色使いなど、見た目をしているのか
知識が全くない人、
システムに関して疎い人が見た時に理解できる内容なのか
を考えろとよく言われてました。

これは、「相手目線で仕事をする」ということの第一歩目だったと後から気づきました。

SEでありながら、全仕事に共通する「相手目線」をこの時から学び始めたと思います。

# 良き先輩に出会う・学ぶ②
一年目の12月ごろ、部署内でのチーム編成替えが行われ
別の統括リーダーのもとで案件参画することが多くなりました。

2人目の統括リーダーは、
会社全体から仕事ができる人間として部署を引っ張っているような人であり
めちゃくちゃ厳しいと噂が立っていました。

なんとかなるんじゃないかと思っていましたが、
実際に一緒に案件参画すると
「なんでそんなことも考えていないのか」
「考えたらわかるよね」
の指摘のオンパレードで、ボコボコにされてました笑

今になって思うのは、
基準を下げずに、自分に課題を突きつけてくださって、
成長を見守っていたのだろうと思います。

最近は叱ってくれたり、フィードバックを真正面にする人は少ないですが、
そういう人を見つけたら積極的に一緒に仕事すると、
周りと差がついて、すごい成長になると思います。
※もちろんむかついたり、腹が立ったりはしますが笑

その統括リーダーからも学んで、今も大事にしていることがあります。

##### 本質的に理解するために、前提を疑うこと
部署でも大事にしていたことですが、「お客様の期待を超える」です。
期待を超えるので、お客様よりもお客様の課題を理解して把握する必要があります。

なので、
お客様が当たり前に思っていることに関して本当にそうなのか疑問を持つべきだと
よく話をしてくれました。

実際に、システムの仕様を取り決める際に、
システム開発とは関係ないと思われてた業務について確認したところ
システム連携において重要部分に関して、フローが整っていない部分があり
炎上する前にお客様へ指摘して整理してもらったこともありました。

前提から考え直すので、課題解決のためにやるべきことを整理して
プロジェクトを進めやすくなりました。

※この本を5周くらい読んでました。もう一度読み返さなければ・・・
https://amzn.asia/d/4N38kaK
「改訂3版 グロービスMBAクリティカル・シンキング」

# 結果・・・
一年目の前半はPJで大コケしてしまいましたが、
後半からは若いリーダーと厳しいリーダーのもと
いろいろな体験をさせてもらって、
環境事業会社のBIツール導入のPL的なポジションで仕事を進めるようになりました。

どの会社でも、どの環境でも
素敵な先輩についていくって大事ですね。。。

# あとがき
・クリティカルシンキング読み直します
・先輩も大事ですが、一番はなんだかんだ喰らいついて頑張る気持ち
・厳しいリーダーとは仲良くなりました、変わった人でした笑
・相手目線って今でも大事
Docker + Python +Poetryの環境構築

# 目的
DockerでPython + Poetryの環境を構築しようとしたら、恐ろしく苦戦したためここに完成した環境のメモを残す。

# 構築環境
↓フォルダツリー
```
C:
│  .gitignore
│  docker-compose.yml
│  README.md
│
└─backend
      Dockerfile　# 最初はbackendフォルダにDockerFileのみ作成。
      poetry.lock
      pyproject.toml
```
↓docker-compose.yml
```docker-compose.yml
services:
  backend:
    build:
      context: ./backend
      dockerfile: Dockerfile
    volumes:
      - ./backend:/app
    working_dir: /app
    ports:
      - 8000:8000
    tty: true
```
↓Dockerfile
```Dockerfile
FROM python:3.13

# 作業ディレクトリを設定
WORKDIR /app
ENV PYTHONUNBUFFERED 1

# poetryインストール
RUN curl -sSL https://install.python-poetry.org | python3 - && \
    ln -s /root/.local/bin/poetry /usr/local/bin/poetry


# # コンテナ内で仮想環境の作成を無効
RUN poetry config virtualenvs.create false && \
    poetry config virtualenvs.in-project true

COPY . .

```

1.  docker-compose up --buildでコンテナ作成＆起動
2. コンテナの中に入ってpoetry -versionが動くことを確認
3. Poetryを使って好きなフレームワークとかを構築できる
GitHub Actions の strategy matrix でジョブのバリエーションを実行しよう！

GitHub Actions でテストやビルドを自動化する際、異なるOSやソフトウェアバージョンで実行したいケースがよくありますよね。そんな時に役立つのが `strategy: matrix:` です！ 
`matrix` を使うと、複数の組み合わせのジョブを簡単に定義し、実行することができます。初心者の方にも分かりやすく、`matrix` の使い方を説明していきます。

### `matrix` の基本

`matrix` は、ジョブ内で変数を定義し、その変数の組み合わせに基づいて複数のジョブを自動的に生成します。 例えば、異なる OS や Node.js のバージョンでテストを実行したい場合、次のように記述します。

```yaml
jobs:
  test:
    strategy:
      matrix:
        os: [ubuntu-latest, macos-latest, windows-latest]
        node-version: [14, 16]
    runs-on: ${{ matrix.os }}
    steps:
      - uses: actions/setup-node@v3
        with:
          node-version: ${{ matrix.node-version }}
      - run: npm test
```

このワークフローでは、3種類のOS (ubuntu-latest, macos-latest, windows-latest) と 2つのNode.jsバージョン (14, 16) の組み合わせ、つまり合計6つのジョブが実行されます。 `runs-on: ${{ matrix.os }}` のように、`matrix` で定義した変数を `${{ matrix.変数名 }}` で参照することで、各ジョブで異なる値が使用されます。


### さらに便利に使うためのテクニック

`matrix` をさらに活用するためのテクニックをいくつか紹介します。

#### 1. 組み合わせの追加 (include)

特定の組み合わせを追加したい場合は `include` を使用します。

```yaml
matrix:
  os: [ubuntu-latest, windows-latest]
  node: [14, 16]
  include:
    - os: ubuntu-latest
      node: 18
      npm: 6 
```

この例では、既存の組み合わせに加えて、Ubuntu 上で Node.js 18 と npm 6 を使用するジョブが追加されます。


#### 2. 組み合わせの除外 (exclude)

特定の組み合わせを除外したい場合は `exclude` を使用します。

```yaml
matrix:
  os: [ubuntu-latest, macos-latest, windows-latest]
  node-version: [14, 16]
  exclude:
    - os: windows-latest
      node-version: 14
```

この例では、Windows 上で Node.js 14 を使用するジョブは実行されません。

#### 3. 部分的な組み合わせでの除外

`exclude` は部分一致でも機能します。


```yaml
matrix:
  os: [macos-latest, windows-latest]
  version: [12, 14, 16]
  environment: [staging, production]
  exclude:
    - os: windows-latest
      version: 16
```

この例では、`windows-latest` と `version: 16` の組み合わせを持つジョブは、`environment` の値に関係なく、すべて除外されます。


#### 4. ジョブの失敗時の挙動 (fail-fast, continue-on-error)

デフォルトでは、1つのジョブが失敗しても、他のジョブは実行されます。 全てのジョブを即座に停止したい場合は、`fail-fast: true` を `strategy` 内に記述します。逆に、特定のジョブの失敗を許容したい場合は、そのジョブに `continue-on-error: true` を記述します。

#### 5. 同時実行数の制御 (max-parallel)

同時に実行するジョブの数を制限するには `max-parallel` を使用します。


```yaml
strategy:
  max-parallel: 2
  matrix:
    # ...
```

この例では、最大2つのジョブが同時に実行されます。


#### 6. 前のジョブの結果を利用した動的なマトリックス生成

前のジョブの出力結果を `fromJSON()` 関数で解析し、`matrix` の値として使用することで、動的なマトリックスを生成できます。

```yaml
jobs:
  generate-matrix:
    # ... (何らかの処理で matrix.json を生成)
    outputs:
      matrix_values: ${{ steps.generate.outputs.matrix }}

  use-matrix:
    needs: generate-matrix
    strategy:
      matrix:
        value: ${{ fromJSON(needs.generate-matrix.outputs.matrix_values) }}
```



### まとめ

`strategy: matrix:` を使うことで、GitHub Actions ワークフローをより簡潔に記述し、効率的に実行することができます。紹介したテクニックを使いこなせば、様々なテスト・ビルドシナリオに柔軟に対応できます。ぜひ活用してみてください！より詳しい情報や高度な使い方は、GitHub の公式ドキュメントを参照することをおすすめします。

### 参考文献
- https://docs.github.com/ja/actions/writing-workflows/choosing-what-your-workflow-does/running-variations-of-jobs-in-a-workflow
- https://docs.github.com/ja/actions/use-cases-and-examples/building-and-testing/building-and-testing-nodejs
サクッとスライドを作成！Marpの使い方と活用法

急なプレゼン資料作成に困ったことはありませんか？

「**Marp**」を使えば、Markdownで簡単にスライドを作成できます。
この記事では、Marpの魅力をサクッと紹介します。

# Marpの特徴

Marpの特徴は、以下の3つです。
1. Markdownでスライド作成
1. CSSでデザインを簡単カスタマイズ
1. スライドをコードベースで管理可能

それぞれの特徴について、詳しく説明したいと思います。

## 1. Markdownでスライド作成
Marpの最大の魅力は、Markdownを使ってスライドを作れること。
シンプルな記法で、ストレスなく資料を作成できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3078481/86f7a189-b67a-6b5d-e072-ce8da55c5a96.png)

## 2. CSSでデザインカスタマイズ

CSSを使ってスライドのデザインを自由に変更可能。
企業のブランディングに合わせたスタイルも簡単に実現できます。

https://techblog.istyle.co.jp/archives/6356

テーマ設定を変更するだけで、簡単にデザインを変更できます。

(CSS:default)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3078481/c38f1e7a-6ac8-9dec-b534-844ce9de9aae.png)

(CSS:gaia)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3078481/f0feeaff-81f6-3e8c-4226-3e8d6f4a55fe.png)

## 3. コードベースでの管理

スライドをコードで管理できるため、バージョン管理が楽々。
Gitを使って変更履歴を追跡できます。

# 実際の使用例

私がMarpで作成したスライドは、技術的な内容を中心に、簡潔な説明とビジュアルを組み合わせました。
CSSで背景色やフォントを変更し、視覚的にわかりやすい資料を作成しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3078481/7660fc90-ab7b-d3e0-0bc0-b14d33467cc8.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3078481/d81394c7-bc7d-f097-b284-44490ab3b2bd.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3078481/07694f47-1d27-88d3-f3a5-a3a8b63477da.png)

 上記のスライドを作成した時のソースコード。

 ```Markdown
---
marp: true
title: Marpのサンプル
theme: gaia
paginate: true
---

# Marpのサンプルスライド

---

## スライド1

- これはMarpのサンプルスライドです。
- Markdownを使って簡単にスライドを作成できます。

---

## スライド2

### コードブロックの例
\```
print("Hello, World!")
\```
 ```

# 他のツールとの比較

Marpは、PowerPointやGoogle Slidesと比べて、サクッと簡単にスライドを作成できるのが特徴。
Markdownの記法を使うだけで、直感的に操作できます。

| 特徴                     | Marp                                      | PowerPoint                               | Google Slides                           |
|--------------------------|-------------------------------------------|-----------------------------------------|----------------------------------------|
| **スライド作成の手軽さ** | Markdownを使用し、簡単にスライド作成可能 | リッチな機能が豊富だが、操作が複雑    | シンプルなインターフェースだが、Markdownのような軽快さはない |
| **デザインの自由度**     | CSSで自由にカスタマイズ可能              | テンプレートが豊富だが、カスタマイズに限界 | テンプレートは多いが、CSSの柔軟なカスタマイズは不可 |
| **コードベースでの管理** | Gitなどでバージョン管理が可能            | ファイルベースで管理、変更履歴が追いにくい | クラウドベースで共同編集可能だが、コード管理は不可 |
| **オフラインとオンラインの利用** | ローカルで作業可能、エクスポートも簡単 | オフライン利用が得意だが、クラウド連携が弱い | 完全オンラインだが、オフライン時の機能制限あり |
| **学習コスト**           | Markdownに慣れていれば低い               | 機能が多く、全てを使いこなすには時間がかかる | シンプルだが、高度な機能には物足りなさを感じることがある |


# まとめ
Marpは、Markdownを使った手軽なスライド作成、CSSによる自由なデザイン、コードベースでの管理が可能なため、特に技術者やデザイナーにとって非常に魅力的なツールです。
他のツールと比較しても、独自の利点が多く、プレゼンテーションのスタイルを変える可能性を秘めています。
次回のプレゼンテーションでぜひMarpを試してみてください！


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3078481/85d7232f-47a8-cc9d-ebdc-0827d6eec2db.png)
Langchain + GraphRAG(neo4j)のデモ

# はじめに

RAGの活用が進んでいる現在、従来のRAG手法に加えて、様々な検索手法が開発されています。中でもGraphRAGの活用を行うことで、2つのエンティティの関係性をつなぐ必要のある質問や、データ全体への総合的な理解を求める質問への回答において大幅に改善できるとされています。

包括性(Comprehensiveness：質問の暗黙の文脈の枠組みの中での完全性)
多様性(Diversity：提起された質問に対する異なる視点や角度の提供)
エンパワーメント(Empowerment：裏付けとなるソース資料やその他の文脈情報の提供)
の観点優れたパフォーマンスが示されることが、マイクロソフトなどの研究チームなどの論文を参考にするとわかってきています。

https://www.microsoft.com/en-us/research/blog/graphrag-unlocking-llm-discovery-on-narrative-private-data/?ref=blog.langchain.dev


# Neo4jで推理小説に登場する人物を登録する

かまいたちの夜に登場する人物を整理して、ベクトルデータベースに登録します。


```
MATCH (n) DETACH DELETE n;

CREATE 
  (ペンション:Organization {name: 'ペンション'}),
  (宿泊客:Organization {name: '宿泊客'}),
  (矢嶋透:Person {name: '矢嶋透', 職業: '大学生'}),
  (小林真里:Person {name: '小林真里',職業: '大学生'}),
  (小林二郎:Person {name: '小林二郎', 職業: 'ペンション経営'}),
  (矢嶋透)-[:恋人]->(小林真里),
  (小林二郎)-[:夫婦]->(小林今日子),
  (篠崎みどり)-[:夫婦]->(小林今日子),
  (小林真里)-[:親戚]->(小林二郎),
  (久保田俊夫)-[:夫婦]->(篠崎みどり),
  (矢嶋透)-[:WORKS_IN]->(宿泊客),
  (小林真里)-[:WORKS_IN]->(宿泊客),
  (小林二郎)-[:WORKS_IN]->(ペンション);
```

![IMG_0229.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43766/a7876fc4-b483-e571-76c4-a8224ae3d2d8.jpeg)
Pythonで時短開発！コーディングを加速するシンプルなテクニック

## はじめに
忙しいエンジニアにとって、開発効率を上げることは重要です。本記事では、Pythonでの開発を加速するための時短テクニックを紹介します。これらのテクニックは、日々の作業を少しずつ効率化してくれるので、ぜひ参考にしてみてください。

## 1. ワンライナーで処理を完結させる

Pythonはシンプルな構文を使って、1行で多くの処理を実行できます。以下は、特に便利なワンライナーの例です。

### 例1: リスト内包表記でリストを生成
```python
squares = [x**2 for x in range(10)]
# 出力: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
```

### 例2: if 文を含むワンライナー
```python
even_numbers = [x for x in range(20) if x % 2 == 0]
# 出力: [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
```

## 2. `enumerate`でループ時のインデックスも取得

ループ内でインデックスが必要な場合、`enumerate`を使うとコードがシンプルになります。

```python
fruits = ['apple', 'banana', 'cherry']
for index, fruit in enumerate(fruits):
    print(index, fruit)
# 出力:
# 0 apple
# 1 banana
# 2 cherry
```

## 3. `zip`で複数のリストを同時にループ

複数のリストを同時に扱いたい場合、`zip`が便利です。

```python
names = ['Alice', 'Bob', 'Charlie']
scores = [85, 92, 78]
for name, score in zip(names, scores):
    print(f'{name}: {score}')
# 出力:
# Alice: 85
# Bob: 92
# Charlie: 78
```

## 4. `collections`モジュールで便利なデータ構造を活用

標準ライブラリの`collections`モジュールには、時短に役立つデータ構造がいくつか含まれています。

### 例1: `defaultdict`
辞書に初期値を設定しなくてもキーエラーが発生しないため便利です。

```python
from collections import defaultdict

counts = defaultdict(int)
for word in ['apple', 'banana', 'apple', 'orange']:
    counts[word] += 1
# 出力: {'apple': 2, 'banana': 1, 'orange': 1}
```

### 例2: `Counter`
要素の数を自動的にカウントしてくれます。

```python
from collections import Counter

words = ['apple', 'banana', 'apple', 'orange', 'banana', 'apple']
counter = Counter(words)
# 出力: Counter({'apple': 3, 'banana': 2, 'orange': 1})
```

## 5. `itertools`で効率的な反復処理

反復処理を高速化するためのテクニックが詰まった`itertools`は、時短の強い味方です。

### 例: `combinations`で組み合わせを生成
```python
from itertools import combinations

items = ['a', 'b', 'c']
for combo in combinations(items, 2):
    print(combo)
# 出力:
# ('a', 'b')
# ('a', 'c')
# ('b', 'c')
```

## 6. `f-strings`でシンプルな文字列フォーマット

Python 3.6以降では、`f-strings`を使うと文字列フォーマットが簡単になります。変数を埋め込むのも簡単です。

```python
name = "Alice"
score = 92
print(f'{name} scored {score} points.')
# 出力: Alice scored 92 points.
```

## 7. デバッグを簡単にする `print`デバッグ

複雑な式やデータ構造をデバッグするとき、`f-strings`と`repr`を組み合わせると便利です。

```python
data = {'name': 'Alice', 'age': 25}
print(f'Debug: {data=}')
# 出力: Debug: data={'name': 'Alice', 'age': 25}
```

## 8. `map`と`filter`で簡潔なデータ処理

`map`や`filter`を使ってリスト操作をシンプルにしましょう。

### 例1: `map`でリストの要素を加工
```python
numbers = [1, 2, 3, 4]
squares = list(map(lambda x: x**2, numbers))
# 出力: [1, 4, 9, 16]
```

### 例2: `filter`で条件に合う要素を抽出
```python
numbers = [1, 2, 3, 4]
even_numbers = list(filter(lambda x: x % 2 == 0, numbers))
# 出力: [2, 4]
```

## 9. Pythonの組み込み関数でさらなる時短

Pythonには豊富な組み込み関数が用意されています。以下はその一部です。

- `sum`: リストの合計を簡単に取得  
   ```python
   total = sum([1, 2, 3, 4])  # 出力: 10
   ```
- `max`, `min`: 最大値や最小値を取得  
   ```python
   maximum = max([1, 2, 3, 4])  # 出力: 4
   ```
- `any`, `all`: 条件を確認  
   ```python
   is_any_true = any([False, True, False])  # 出力: True
   is_all_true = all([True, True, True])    # 出力: True
   ```

## まとめ
以上、Pythonでの開発を加速するためのシンプルなテクニックを紹介しました。すぐに使えるテクニックばかりなので、ぜひ日々のコーディングに取り入れて、時短を実現してください。
RAGとしてのCopilot Studioの利用

Copilot Stuidoを利用することでチャットボットのフロント画面を作らなくて済んだり、
TEAMSに素早く連携したりなどお手軽にチャットボットを作成できるようだが
RAGとして利用するにあたり調べてたのでメモ



- 以下の4つがデータソースとして利用できる
    - 公開 Web サイト
    - ファイル アップロード
    - SharePoint および OneDrive
    - Dataverse
    
参考：https://learn.microsoft.com/ja-jp/microsoft-copilot-studio/knowledge-add-existing-copilot?source=recommendations

-  公開 Web サイト
    -  追加できるFQDNのパスに制限があるので細かく指定したい要件がある場合は注意
    -  また認証が必要な際とも利用不可
    -  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269528/99619233-c6db-6589-9a12-e25e769730b7.png)　
 引用：https://learn.microsoft.com/ja-jp/microsoft-copilot-studio/knowledge-add-public-website#url-type-and-structure

- ファイルアップロード
    - 画像データ、ビデオ、実行ファイルは利用不可
    - 512MBを超える大きさのファイルは不可
    - 500ファイルまでの制限あり
    - https://learn.microsoft.com/ja-jp/microsoft-copilot-studio/knowledge-add-file-upload
- SharePoint
    - メモリの制限により３MB未満のSharePointファイルのみ使用可能
    - https://learn.microsoft.com/ja-jp/microsoft-copilot-studio/knowledge-add-sharepoint
- Dataverse
    - Dataverseテーブルを利用可能



## 所感
~~数多くのファイル、1つのファイルのサイズが大きいデータをソースとして利用するのには少なくとも今のところは利用は難しく、個人利用で小回りの利くチャットボットのような使い方が現在はいいのかも。~~


===追記
graphコネクタを利用した多くのデータソースからの取得もできるようになっているので、
データソースの幅は確実に広がってる。
将来的には現在PaaSのSynapseに代わりSaaSのFabricが幅広く採用されているように、PaaSのAI Studioを組み合わせたものではなくCopilot Studioにとって代わる日が近そう
https://learn.microsoft.com/ja-jp/microsoft-copilot-studio/knowledge-graph-connections
Oracle Analytics Cloud Classic： Answersで作成した分析をアーカイブ機能を利用してファイルに出力する。個別にバックアップする。

はじめに
---
Answersで分析を作成した後、別環境に移行したり、個別にバックアップを取得するときに、アーカイブ機能を利用します。アーカイブ機能を利用すると、分析やカタログのフォルダ毎に分析、ダッシュボードをアーカイブして、ファイルに出力します。アーカイブしたファイルを、OACにリストアするには、アンアーカイブ機能を利用します。アーカイブについて実施してみました。

![g4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/768a159c-18b0-eba1-beef-4d089491739a.jpeg)

記事記載時のOAC ver：Sep 2024 Update

前提
---
* OAC Enterprise Editionのサービスがあり、Answersで作成した分析がある


アーカイブする
---
OACにアクセスし、クラッシック・ホームに移動します
右上部のメニューアイコン"・・・(縦)"をクリックし、メニューから"クラシック・ホームを開く"をクリックします
![g1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/34497865-9349-a2c8-bb36-8e22916e9e95.jpeg)

上部のグローバル・ヘッダーのメニューから"カタログ"をクリックします
![g2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/340db067-c30c-81c4-62f3-bdd334efd90e.jpeg)

アーカイブする分析を表示します。
分析を保存しているフォルダを開き、対象の分析の下部にある"その他"をクリックします
![g3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/e6ba3aee-e9b3-7dab-f277-6de9fbea8197.jpeg)

その他メニューから、"アーカイブ"をクリックします
![g4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/9a54375b-7cc7-845e-d0ff-270930262235.jpeg)

"OK"をクリックします
![g5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/4969f1b7-aae0-bd4d-6245-9a2414dc55cd.jpeg)

ファイル名に"分析名".archiveと表示され、このファイル名でファイルが出力されます。保存をクリックします
![g6.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/b86b6301-c2b1-01b2-cc8e-a1283c308374.jpeg)

アーカイブしたファイルをリストア
---
アーカイブしたファイルをリストアするには、アンアーカイブ機能を利用します
グローバルヘッダーのカタログをクリックし、リストアするフォルダを開きます
左下部にあるタスクペインで、"アンアーカイブ"をクリックします
例では、共有フォルダのworkにアンアーカイブします
![g7.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/ddcda57c-3f55-2d75-4ec6-a5af50290d6b.jpeg)

"参照"をクリックし、リストアするアーカイブファイルを選択します。"OK"をクリックします
![g8.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/5bf32bbb-d92c-b8df-1b81-7102513ad7b8.jpeg)

分析がアンアーカイブされます。"OK"をクリックします
![g9.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/56867854-3f15-58b7-aeb2-2a88dcbd0119.jpeg)

まとめ
---
分析を個別にバックアップや、別のOACサービスに移動するにはアーカイブ、アンアーカイブ機能を利用します。アーカイブ、アンアーカイブ機能をためしてみました。

以上