OmniAICreator/Qiita-1.07M huggingface dataset:
幫助大家撰寫一份出色的 "statement of purpose"

"[美國工作](https://www.apexcharity.org/news/3/85)是許多台灣年輕人夢寐以求的機會之一。海外工作和海外實習可以為個人的專業發展和國際化視野提供寶貴的機會。在這篇文章中，我們將探討海外工作和海外實習的重要性，並提供一些建議和寫作技巧，幫助大家撰寫一份出色的 "[statement of purpose](https://www.apexcharity.org/news/3/90)"。

[海外工作](https://www.apexcharity.org/news/3/86)和[海外實習](https://www.apexcharity.org/news/3/87)對個人的成長和職業發展有著重要的影響。在美國工作，你將能夠接觸到不同的文化、工作方式和專業知識，這對於擴展自己的視野和提升專業能力都非常有益。此外，海外工作也能夠提供更多的就業機會和競爭優勢，讓你在回國後在職場上更具競爭力。

當你計劃申請海外工作或海外實習時，一份出色的 ""statement of purpose"" 是非常重要的。這份文件是你向潛在雇主展示自己的機會，讓對方了解你的動機和目標。以下是一些撰寫 ""statement of purpose"" 的寫作技巧：

1. 清晰明確的目標：在 ""statement of purpose"" 中，你需要清楚地表達你申請海外工作的原因和目標。你可以提到你想要學習的專業知識、培養的技能，以及你希望在這份工作中實現的目標。

2. 個人價值觀：在 ""statement of purpose"" 中，你需要展示你的個人價值觀和專業態度。這包括你的工作倫理、團隊合作能力和解決問題的能力。這些都是雇主在甄選過程中所關注的重要因素。

3. 專業背景：在 ""statement of purpose"" 中，你需要詳細介紹你的專業背景和相關經驗。這可以包括你的學術成績、實習經驗和專案作品。藉由提供這些資訊，你能夠展示你的專業能力和對於該工作的熟悉度。

4. 獨特之處：在 ""statement of purpose"" 中，你需要強調你的獨特之處。你可以提到你的特殊技能、語言能力或者特殊的經驗，這些能夠讓你在其他申請者中脫穎而出。

最後，請記得在撰寫 ""statement of purpose"" 時保持真實和誠實。避免使用模板化的語言，而是用自己的話來表達思想和感受。同時，確保文法和拼字無誤，這表示你的專業態度和細心程度。

總結來說，海外工作和海外實習是一個寶貴的機會，可以幫助你在職業生涯中取得成功。撰寫一份出色的 ""statement of purpose"" 是獲得這些機會的關鍵。請記得運用以上的寫作技巧，讓你的 ""statement of purpose"" 優秀且具有吸引力。祝你申請成功，實現夢想！"
【Power Automate】Outlookの予定表から今日の予定を取得→Teamsに投稿

# はじめに
私は、7月に初めてPowerAutomateの存在を知り、会社の業務の一環として取り扱っています。
始めたばかりでまだ自分でトリガーやアクションを考えることが難しいため、
既存記事を参考に様々なフローを作成しています。
既存の記事をもとにフローの作成を進めていく上で、
個人的に躓いた箇所・わかりにくかった箇所を解説とともに発信しようと思います。

# 取り扱うフロー
「予定表から今日の予定を取得して、Teamsに投稿 OR Teamsのチャットにて通知する」というフローを作成しました。これは、その日の打ち合わせ等の予定が毎朝表としてに変換して送られてくるものです。
1日の予定を一目見て再確認することができます。

# フローの全体像
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3561523/50b69784-aa00-5812-60bd-1dbf30b4e0fd.png)

# 躓いた点
1. 変数の初期化（1つ目）
1. 変換後の時間
1. 一番最後のTeams通知のアクション
   - テーブルの前に付けるメッセージ本文中の値（substring(…))

## 1.変数の初期化1（Initialize variable）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3561523/22da372f-79a0-14c8-bba3-72a7284130c6.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3561523/d45620ff-4095-4b8c-164c-f25ca73f1df9.png)

このアクションは、タイトル通り「変数の初期化」を行うもので、ここでいう「変数」とは「年月日」のことを指しています。
変数addDays()の中身は、「body('Convert_time_zone'),-1,'yyyy-MM-dd')」となります。
真ん中に記載されている「-1」という数字は、一日前を指すためであり、このように初期化することにより、示したい予定の日付を正確に表示することができます。

## 2.変換後の時間
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3561523/e68a5b5c-1dc5-5837-4b56-e168d4108da2.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3561523/6d3ae356-0b69-d6b7-ac42-bd21024e3587.png)

このように変換後の時間（Convert time zone）がこのフローに3個含まれており、それと連動するように「変換後の時間」も3か所存在します。
その際当てはめるConvert time zoneを間違えないように気を付けなければなりません。
当てはめ方は決して難しいものではなく、出てきた順番にConvert time zoneを入れれば問題ありません。
もしこれを間違った箇所に入力してしまうと、予定表のテーブルの時刻が正しく反映されなくなります。
特に注意が必要なのは、Apply to each に含まれているAppend to string variable 2の「変換後の時間」の値です。それぞれ予定の開始時刻と終了時刻となります。

## 3.Teams通知アクション
![PLキャプチャ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3561523/647485ff-e9ee-0d63-374a-f3fb74ccb5ef.png)

このアクションは、今までのアクションで受け取ったOutlookのスケジュールをテーブル化し、自分で指定したメッセージとともにTeams上で通知するものであり、そのメッセージを予定当日の年月日とします。
この年月日の表示方法として変数"substring"を使用し、値にConvert time zoneを入力することで日付を表示させています。

実際の入力値：菅川の
　　　　　　　substring(body('Convert_time_zone'),0,4)年　　　　　　　　　　　　　　
　　　　　　　substring(body('Convert_time_zone'),5,2)月　
　　　　　　　substring(body('Convert_time_zone'),8,2)日
　　　　　　　の予定

ここで私が躓いたのが、（）内の二つの数字です。
入力されている2個の数字は、西暦の年月日の一番初めを0とおいたとき、何番目の数字までを含んで表示させたいかという意味を持っています。
例）2023/09/26のうち、2023のみを表示させたい場合、
　　先頭の数字は0番目・最後尾の数字は3番目となる。
　　しかし、（）内の2つ目の数字を3にすると、202までしか表示されない。
　　これは、指定した項番の値は含まれないためである。
　　つまり、2つ目の数字を4（番目）とすることで2023を全て表示できる。

# おわりに
今回は、既存記事を参考にフローを作成した際、自分が特に目立って躓いた点・時間を費やした点を挙げて解説を書いてみました。
ほぼプログラミング経験がないことから、初心者の方にもわかりやすい解説となっているのではないかと思います。
ぜひ参考にしてみてください。
CWLのinフィールドの文字列操作


# 目的
  - inputsフィールドで受け取った値をinフィールドで、文字列加工したい。値に接頭辞や接尾辞をつけたい。
# ポイント
  - inフィールドで文字列操作したい
  - sourceフィールドでselfの対象を指定し、valueFromフィールドで文字列操作
  - 変数selfの前後に接頭辞と接尾辞をつける操作
  - オプションでStepInputExpressionRequirementを指定することで動いた
      - requirementsフィールド
        ```
        StepInputExpressionRequirement: {}
        ```
      - inフィールド
        ```
        in:
          tool_input:
            source: original_input
            valueFrom: prefix_$(self)_suffix
        ```

# 参考資料
- [CWL の requirements 一巡り: StepInputExpressionRequirement](https://zenn.dev/tom_tan/articles/1a5130ce2fc6c6)
    - "ワークフローのステップの実行前に各パラメータの加工が可能になります。"
- [CWL の requirements 一巡り: InlineJavascriptRequirement](https://zenn.dev/tom_tan/articles/8e3c269b82f342)
    - 文字列操作にJavascriptの記法を使う場合
- [CWLのinフィールドの文字列操作_Scrapbox版](https://scrapbox.io/Open-BioInfo-yamaken/CWLのinフィールドの文字列操作)
    - 元の記事。もう少し詳細に説明。

# 方法
- 検証に使ったテストコード
- echoするだけのワークフロー。yamlで渡した変数に対して、文字列操作してecho。結果をoutput.txtに出力。
    - Workflow：example_workflow.cwl
        ```yaml
        cwlVersion: v1.2
        class: Workflow

        requirements:
          StepInputExpressionRequirement: {}
        inputs:
          original_input: string
        
        steps:
          example_step:
            run: example_tool.cwl
            in:
              tool_input:
                source: original_input
                valueFrom: prefix_$(self)_suffix
            out:
              - output_text
        
        outputs:
          final_output:
            type: File
            outputSource: example_step/output_text
        ```

  - CommandLineTool：example_tool.cwl
    ```yaml
    cwlVersion: v1.2
    class: CommandLineTool
    
    baseCommand: ["echo"]
    
    inputs:
      tool_input:
        type: string
        inputBinding:
          position: 1
    
    outputs:
      output_text:
        type: File
        outputBinding:
          glob: "output.txt"
    
    stdout: "output.txt"
    ```

  - yaml： input.yaml
    ```yaml
    original_input: "sample_text"
    ```
  - ツールのバージョン
    ```bash
    $ node --version
    v14.17.6
    $ singularity --version
    singularity version 3.8.7
    $ cwltool --version
    cwltool 3.1.20210816212154
    ```
- 実行コマンド
    ```bash
    $ cwltool example_workflow.cwl input.yaml
    ```
- 実行結果（output.txt）
    ```
    prefix_sample_text_suffix
    ```
- 「sample_text」という文字列の前後に、接頭辞と接尾辞をつけることができた。
[Python]そのStatus、int型じゃなくてEnumにしよう！

## 1はNORMAL, 2はWARNING、3は…

生データを読み込んだ時、状態を表す数字が入った列があったらどうしますか？
intとしてそのまま扱われた場合、こんなコードもあっさり通ってしまってバグの温床になっちゃいます。

```python
df = pd.DataFrame()
df["status"] = [0, 1, 2]
df["value"] = [0, 1, 2]
df["status"] + df["some_value"]

# 0    0
# 1    2
# 2    4
# dtype: int64
```

対応する値と状態がわかってるなら、Enumにしちゃいましょう！

## 置き換えよう！

Enumを継承した自作クラスを用意し、クラスのコンストラクタに値を渡してやるとこの通り！

```python
from enum import Enum

class Status(Enum):
    NORMAL = 0
    WARNING = 1
    ERROR = 2

raw_status = [0, 1, 2]
status = [Status(v) for v in raw_status]

print(status)
# [<Status.NORMAL: 0>, <Status.WARNING: 1>, <Status.ERROR: 2>]
```

対応する値が文字列の場合もよしなにやってくれます。

```python
from enum import Enum

class Status(Enum):
    NORMAL = "NORMAL"
    WARNING = "WARNING"
    ERROR = "ERROR"

raw_status = ["NORMAL", "WARNING", "ERROR"]
status = [Status(v) for v in raw_status]

print(status)
# [<Status.NORMAL: 'NORMAL'>, <Status.WARNING: 'WARNING'>, <Status.ERROR: 'ERROR'>]
```

改めて冒頭のコードにチャレンジ。
Statusクラスとintはプラス演算子が使えませんよ！って怒ってくれてますね。

```python
from enum import Enum

class Status(Enum):
    NORMAL = 0
    WARNING = 1
    ERROR = 2

df = pd.DataFrame()
df["status"] = [0, 1, 2]
df["value"] = [0, 1, 2]

df["status"] = [Status(v) for v in df["status"]]

df["status"] + df["some_value"]
# TypeError: unsupported operand type(s) for +: 'Status' and 'int'
```

## なんでこんな記事書いたの？

実は、最初はこんなコードを書いてました。

```python
from enum import Enum

class Status(Enum):
    NORMAL = 0
    WARNING = 1
    ERROR = 2

    @classmethod
    def from_int(cls, value):
        for status in cls:
            if day.value == value:
                return status
        raise ValueError("Invalid value")

status = Days.from_int(0)
print(status)  
# Status.NORMAL
```

このfrom_intを定義した共通クラスを設けて、それを継承して…？
PythonのEnum使いにくくない！？とか思ってたんですが、以下のStackOverFlowの記事を見つけました。

https://stackoverflow.com/questions/23951641/how-to-convert-int-to-enum-in-python

コンストラクタにvalue渡したら変換してくれんのかーい！めちゃくちゃ便利やんけ！

https://docs.python.org/3/howto/enum.html#programmatic-access-to-enumeration-members-and-their-attributes

公式ドキュメントのHOWTOにも書いてました。公式ドキュメントにちゃんと1回は目を通そうね！はい…

以上！
jose を使って cognito のアクセストークンを検証

## やること

python-joseではjwtを扱うことができます。
これを利用してcognitoのアクセストークンが正しいものかを検証します。
これでユーザーがログインしているかをAPI側で判別することができます。

## 流れのイメージ

1. 指定したcognitoのユーザープールの鍵をもらう。
1. 検証したいアクセストークンのヘッダーを見て使用する鍵を選ぶ（一致するかを確認する）。
1. 鍵を使ってアクセストークンをデコードする。

3.でエラーが起きなければ成功

## コード

### 前提
アクセストークンの発行（ログイン処理）と、アクセストークン（リクエスト）の受け取りは実装されている

### 検証部分

```python
# cognitoからJWKsを取得
jwks_url = f"https://cognito-idp.ap-northeast-1.amazonaws.com/{RESIDENT_POOL_ID}/.well-known/jwks.json"
jwks = requests.get(jwks_url).json()

# アクセストークンのヘッダーからキーID (kid) を取得
headers = jwt.get_unverified_headers(access_token)
kid = headers["kid"]

# JWKsから対応するキーを見つける
key = {}
for jwk_data in jwks["keys"]:
    if jwk_data["kid"] == kid:
        key = jwk_data
        break

# アクセストークンの署名を検証
rsa_key = jwk.construct(key)
decoded_access_token = jwt.decode(
    access_token,
    rsa_key,
    algorithms=["RS256"],
    audience=RESIDENT_POOL_CLIENT_ID,
)
```

例外処理とか入れたらいい感じ。

```python

# （…省略）

try:
    decoded_access_token = jwt.decode(
        access_token,
        rsa_key,
        algorithms=["RS256"],
        audience=RESIDENT_POOL_CLIENT_ID,
    )
except Exception as e: # 適切なエラーを指定した方がいいかも
    # fastapiを使っている場合
    raise HTTPException(
        status_code=401,
        detail=f"The token is invalid.({e})",
    )
```
Recovering Your Deleted Instagram Account: A Step-by-Step Guide

Losing access to your Instagram account can be a distressing experience, but the good news is that it's possible to recover a deleted Instagram account if you act promptly and follow the right steps. In this guide, we'll walk you through the process of <a href="https://www.ezrankings.com/blog/how-to-recover-a-deleted-instagram-account/">how to get deleted Instagram back</a> and restoring your digital presence.

<b>Confirm Your Account is Actually Deleted:<b>

Before taking any action, ensure that your account is genuinely deleted. Try logging in using your username and password to verify its status.

<b>Review Instagram's Policy:<b>

Familiarize yourself with Instagram's terms of service and community guidelines. Make sure your account complies with their policies.

<b>Contact Instagram Support:<b>

If your account has been wrongly deleted or disabled, the first step is to reach out to Instagram support. Open the Instagram app and go to the login page. Tap "Need more help?" and follow the prompts to submit a request.

<b>Provide Necessary Information:<b>

When contacting support, be prepared to provide information like your username, email address associated with the account, and a brief explanation of why you believe your account was disabled in error.

<b>Be Patient and Persistent:<b>

Instagram support may take some time to respond, so it's essential to be patient. If you don't receive a response within a reasonable period, consider resubmitting your request.

<b>Follow Up on Instagram's Response:<b>

Once you receive a response from Instagram support, follow their instructions closely. They may request additional information or actions on your part.

<b>Secure Your Account:<b>

To prevent future issues, ensure your account complies with Instagram's policies and security guidelines. Use a strong, unique password and enable two-factor authentication.

<b>Reach Out on Social Media:<b>

If you're not getting a response through the official support channels, consider reaching out to Instagram on their social media platforms like Twitter or Facebook. Sometimes, public messages can expedite the process.

<b>Consider Legal Action:<b>

If you believe your account was unfairly deleted and you've exhausted all other options, consult with legal counsel to explore potential legal remedies.

<b>Conclusion:<b>

Recovering a deleted Instagram account can be challenging, but it's not impossible. The key is to act promptly, provide the necessary information to Instagram support, and be patient during the process. Remember to review Instagram's policies and ensure your account complies with their guidelines to prevent future issues. With persistence and the right approach, you can regain access to your Instagram account and continue sharing your moments with friends and followers.
Conoha オブジェクトストレージ: データのダウンロード

参考ページ
[オブジェクトダウンロード - ObjectStorage API v1](https://www.conoha.jp/docs/swift-object_download.php)

## curl

```bash:curl_download.sh
URL="https://object-storage.tyo2.conoha.io/v1/nc_487727e3921d44e3bfe7ebb337bf085e"
#
TOKEN="sample00d88246078f2bexample788f7"
#
curl -X GET \
	-H "Accept: application/json" \
	-H "X-Auth-Token: "$TOKEN \
	$URL"/uchida_test/pic_1.jpg" -O
```

## Httpie

```bash:http_download.sh
URL="https://object-storage.tyo2.conoha.io/v1/nc_487727e3921d44e3bfe7ebb337bf085e"
#
TOKEN="sample00d88246078f2bexample788f7"
#
http --download "$URL/uchida_test/pic_1.jpg" "X-Auth-Token: $TOKEN"
```
What's New from CircleCI - 2023/09/26


CircleCIに関する最近1週間(2023/09/19~26)くらいの情報をまとめてみました。

気のつく限りの情報は拾ってみたつもりですが、見落としなどありましたら、Twitterで [@CircleCIJapan](https://twitter.com/CircleCIJapan) をメンションしてタレ込んでいただけると幸いです。
少しでもお役に立てていましたら、いいね(❤️)クリックいただけると嬉しいです！

[＜ What's New from CircleCI - 2023/09/19](https://qiita.com/CircleCIJapan/items/b87bb294f9b0b0ff3768) | 今週 | [What's New from CircleCI - 2023/10/03＞](https://qiita.com/CircleCIJapan/items/998d85730293d07669d7)

# CircleCI Discuss (CircleCIからのお知らせ＆コミュニティ掲示板)
- **日本語アナウンス**: https://discuss.circleci.com/tag/ja-%E6%97%A5%E6%9C%AC%E8%AA%9E

# ユーザーブログ・スライド
- [CircleCIでcheckoutしてきたリポジトリ以外のprivateリポジトリを操作する方法](https://harinezumi-study.hatenablog.com/entry/2020/11/27/111058) by harinezumistudy さん
- [Terraformを使って学ぶーAWSにインフラを構築するIaCの基本と、SREが実務で役立つ機能とエコシステムを徹底解説](https://eh-career.com/engineerhub/entry/2023/09/22/093000) by アソビュー 頭島さん、[@takesuzu90](https://twitter.com/takesuzu90)さん、[@suzukiy0](https://twitter.com/suzukiy0)さん、三森さん、村松さん、山野さん
- [OIDCを用いたCircleCIのAWS認証](https://techblog.locoguide.co.jp/entry/2023/09/19/154307) by ロコガイド 丹羽さん
- [Unityを使ったモバイルゲームCI/CDパイプラインをクラウドネイティブ化しよう](https://www.docswell.com/s/tadashi0713/K6Y9N7-unity-mobile-cicd) by 根本さん

# Changelog (更新履歴)
- https://circleci.com/ja/changelog/

# CircleCI 公式ブログ
- [AWS SageMaker で機械学習開発に CI/CD を組み込む](https://circleci.com/ja/blog/machine-learning-ci-cd-with-aws-sagemaker/)
- [AI adoption for software: a guide to learning, tool selection, and delivery](https://circleci.com/blog/ai-adoption-guide/)
ソフトウェアへのAI取り込み: 学習、ツール選択、デリバリのガイド
- [Sharing data across hybrid cloud and local CI/CD environments](https://circleci.com/blog/sharing-data-local-cloud-cicd/)
ハイブリッドクラウドとローカルCI/CD環境をまたがるデータ共有

# YouTube (動画コンテンツ)
- [動画コンテンツの一覧](https://www.youtube.com/@CircleCI-Videos/videos)

# CircleCI Knowledge Base
- [Does CircleCI Support Changing My Atlassian URL?](https://support.circleci.com/hc/en-us/articles/19071951004315-Does-CircleCI-Support-Changing-My-Atlassian-URL-)
CircleCIのMy Atlassian URLの変更サポート状況
- [How do I manage my People Settings for my GitHub organization?](https://support.circleci.com/hc/en-us/articles/19019502351899-How-do-I-manage-my-People-Settings-for-my-GitHub-organization-)
GitHub OrganizationのPeople Setttingの管理方法(OAuth/GitHub App)
- [Can I make a Private Orb public?](https://support.circleci.com/hc/en-us/articles/19015984839323-Can-I-make-a-Private-Orb-public-)
Private OrbをPublicに変更できますか

# CircleCI 参加/出展 イベント、セミナーなど
- 10/03(火) [【オンラインセミナー】Jenkins / オンプレミスユーザーのためのクラウドCI/CD入門](https://circleci.connpass.com/event/293597/)
- 10/19(木) [【オンラインセミナー】はじめてのCircleCI](https://circleci.connpass.com/event/293598/)
- 10/27(金)~28(土) [PyCon APAC 2023](https://2023-apac.pycon.jp) at TOC有明Convention Hall (CircleCIはゴールドスポンサー出展です)
---
それでは今週も Happy Building⌨!
Conoha オブジェクトストレージ: データのアップロード

参考ページ
[オブジェクトアップロード - ObjectStorage API v1](https://www.conoha.jp/docs/swift-object_upload.php)

pic_1.jpg というファイルをアップロード

```bash:curl_upload.sh
URL="https://object-storage.tyo2.conoha.io/v1/nc_487727e3921d44e3bfe7ebb337bf085e"
#
TOKEN="sample00d88246078f2bexample788f7"
#
curl -X PUT \
	-H "Accept: application/json" \
	-H "X-Auth-Token: "$TOKEN \
	$URL"/uchida_test/" \
	-T pic_1.jpg
```
Conoha オブジェクトストレージ: コンテナーの作成

参考ページ
[コンテナ作成 - ObjectStorage API v1](https://www.conoha.jp/docs/swift-create_container.php)

uchida_test というコンテナーを作成するスクリプト

```bash:container_create.sh
URL="https://object-storage.tyo2.conoha.io/v1/nc_487727e3921d44e3bfe7ebb337bf085e"
#
TOKEN="sample00d88246078f2bexample788f7"
#
http PUT $URL"/uchida_test" "X-Auth-Token: "$TOKEN
```
Github Pagesで公開したViteのサイトが404になる時

[Viteの公式サイト](https://ja.vitejs.dev/guide/static-deploy.html#github-pages)にはvite.config.jsの`base`の項目を正しく（基本的にはリポジトリ名と同じに？）設定するように書いてある。

例：
```vite.config.js
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'

export default defineConfig({
	base: '/リポジトリ名/',
	plugins: [vue()]
})
```
が、どうやら単に`./`と設定しても問題なく動きそう。
```vite.config.js
// 前略
export default defineConfig({
	base: './',
	plugins: [vue()]
})
```
リポジトリ名を変えたりVercelに移行したりしてもいちいちいじらなくて済むのでお得。
何もしていないのにDockerが壊れた件〜docker compose upで「load metadata for docker.io/library/node」〜

# はじめに

Dockerを起動しただけなのに「load metadata for docker.io/library/node」とエラーが発生し、コンテナが立ち上がらなくなりました。
本記事ではその解決方法を記載します。

# 結論

Docker にログインしているアカウントが原因で Image が取得できないことが原因でした。
DockerDesktop の設定からログアウトすると解決します。

# その他

調査中に見つけたけど解決しなかった方法は以下です。
参考まで。

https://shiimanblog.com/engineering/error-internal-load-metadata/

https://stackoverflow.com/questions/73812700/docker-error-internal-load-metadata-for-docker-io
【タスク管理アプリを作る】⑥MVCを意識してリファクタ。

MVCについてまだまだ理解が浅いですが、意識して修正してみました。

修正前ですが。
大きく分けて、Formクラス、Dataクラス、Helperクラス（Data操作）があり、
UI操作→Form→Dataでタスク登録情報をセットしていました。

修正後ですが。
UI操作→Form→Control→Dataとなるようにしました。
Form→Dataは参照できないようにしました。

https://github.com/kunisan222/TaskManage1

次はUnitTestを作ろうと思っています。
というのは、修正後に確認していたら、今まで動いていた部分が動かなくなっていました。
どこが問題になっているか調べるのに時間が掛かるので、
そういう時にUnitTestがあれば今まで動いていた部分と、
動かなくなった部分が分かるので良いかなと考えています。
Ubuntuにwkhtmltopdfをインストールする方法

バージョンは0.12.3のものを利用
https://github.com/wkhtmltopdf/wkhtmltopdf/releases/0.12.3/

以下のコマンドでインストールすることができる。

```bash
$echo $PATH #環境変数に/usr/local/binが含まれているかどうかを確認
$cd /usr/local/bin
$wget https://github.com/wkhtmltopdf/wkhtmltopdf/releases/download/0.12.3/wkhtmltox-0.12.3_linux-generic-amd64.tar.xz 
$xz -dv wkhtmltox-0.12.3_linux-generic-amd64.tar.xz
$tar -xf wkhtmltox-0.12.3_linux-generic-amd64.tar
$ln -s wkhtmltox/bin/wkhtmltopdf wkhtmltopdf
```
ただし、permission deniedが出てくる場合は、初めに'sudo'をつけてもう一度実行

```bash
$sudo wget https://github.com/wkhtmltopdf/wkhtmltopdf/releases/download/0.12.3/wkhtmltox-0.12.3_linux-generic-amd64.tar.xz 
$sudo xz -dv wkhtmltox-0.12.3_linux-generic-amd64.tar.xz
$sudo tar -xf wkhtmltox-0.12.3_linux-generic-amd64.tar
$sudo ln -s wkhtmltox/bin/wkhtmltopdf wkhtmltopdf
```

最後にバージョンを出力して、成功すればインストール完了
```bash
$wkhtmltopdf --version
wkhtmltopdf 0.12.3 (with patched qt)
```

参考文献
https://document.intra-mart.jp/library/forma/public/forma_setup_guide/texts/install/linux/pdf.html

Windowsでのwkhtmltopdfのインストール方法はこの方の記事が詳しいです。
https://qiita.com/danishi/items/e9e0d5c1a8dae1f99b40
Cloudflare Zero Trust で DNS ポリシーのスケジュール設定を試す

# 目的
こちらの内容を実際に確認します。

- [Scheduled DNS policies · Cloudflare Zero Trust docs](https://developers.cloudflare.com/cloudflare-one/policies/gateway/dns-policies/scheduled-dns-policies/#scheduled-dns-policies)


# DNS ポリシーのスケジュール API
以下の API から `schedule` パラメータを設定可能です。

> - [Create a Zero Trust Gateway rule - Cloudflare API Documentation](https://developers.cloudflare.com/api/operations/zero-trust-gateway-rules-create-zero-trust-gateway-rule)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/092fbfe5-27df-8e20-aa4b-cf00a39b50d0.png)

`time_zone` の扱いは以下のようになっていますが、正しく指定するのがよさそうです。

>ルールが評価されるタイムゾーン。有効なタイムゾーン都市名が指定された場合、Gatewayは常にそのタイムゾーンの現在時刻を使用します。このパラメータが省略された場合、GatewayはユーザーのソースIPから推測されるタイムゾーンを使用してルールを評価します。GatewayがIPからタイムゾーンを判断できない場合、ユーザーが接続しているデータセンターのタイムゾーンにフォールバックします。

# DNS ポリシーの作成
以下のコマンドでスケジュールされた DNS ポリシーを作成します。

- [DNS policies - Domain Selector · Cloudflare Zero Trust docs](https://developers.cloudflare.com/cloudflare-one/policies/gateway/dns-policies/#domain)

```shell:
export EMAIL='YOUR_EMAIL'
export APIKEY='YOUR_APIKEY'
export ACCOUNT_ID='YOUR_ACCOUNT_ID'

curl -X POST "https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/gateway/rules" \
     -H "X-Auth-Email: $EMAIL" \
     -H "X-Auth-Key: $APIKEY" \
     -H "Content-Type: application/json" \
     --data '{
        "name": "office-no-youtube-policy",
        "action": "block",
        "traffic": "any(dns.domains[*] in {\"youtube.com\"})",
        "enabled": true,
        "schedule": {
                "time_zone": "Asia/Tokyo",
                "mon":  "08:00-12:30,13:30-17:00",
                "tue":  "08:00-12:30,14:30-17:00",
                "wed":  "08:00-12:30,13:30-17:00",
                "thu":  "08:00-12:30,13:30-17:00",
                "fri":  "08:00-12:30,13:30-17:00"
        }
    }'
```

スケジュールは、ポリシーの行を展開すると、Zero Trust の Gateway > Firewall Policies > DNS の下に表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/e5382644-0c72-8424-b194-941f0d28d7ab.png)

# 動作確認
設定したスケジュールの時間内だと、DNS ポリシーが有効なことを確認できます。

- [Cloudflare Gateway の DNS ポリシーを確認する - Qiita](https://qiita.com/khayama/items/3c3f7f6bcadb2d224a38)

```shell:not_in_schedule_time
% date
Tue Sep 26 14:33:10 JST 2023
% dig -4 @172.64.36.1 www.youtube.com A +short
youtube-ui.l.google.com.
142.250.198.14
142.250.199.110
172.217.31.174
142.250.207.46
172.217.175.238
172.217.175.46
172.217.161.46
172.217.175.78
142.250.196.110
142.250.196.142
142.250.207.14
216.58.220.110
142.251.222.14
142.251.42.142
142.251.42.174
142.251.42.206
```

```shell:in_schedule_time
% date
Tue Sep 26 14:40:02 JST 2023

% dig -4 @172.64.36.1 www.youtube.com A +short
0.0.0.0
```

# まとめ

昼休みを除く平日のワーキングタイムのみ、DNS ポリシーを適用する等の運用が考えられます。
Cloudflare Zero Trust では、より詳細なポリシー設定が可能であると理解できました。
SpringBootでMaven installした時のエラー文の読む場所

# はじめに
1回のmaven installでこんなに活字たくさん出されたら拒否反応が出ちゃう＞＜
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613109/1abb19a0-dfab-8d93-fa0c-53159667556b.png)

# 結論
ここ見ろワンワン
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613109/8690c677-b5a0-12ef-9368-f01daae6af81.png)
Arduino Unoのファームウェア修復

# はじめに

二度と使うことがなかろうと思い，
Arduinoのファームウェアを上書きして，Nintendo Switchにつなげて遊んでおりました．
急にArduinoとして使用する機会ができ，急いで調べたためまとめることにしました．
(またやることがありそうなので私用メモを兼ねます)

## 環境

|環境||
|---|---|
|OS|windows(wsl使用)|
|マイコン|Maruduino UNO R3[^1]|
|firmware|atmega16u2|
|wsl|Ubuntu 22.04.2LTS|

[^1]: Arduino UNOの互換製品です https://www.marutsu.co.jp/pc/i/605620/

<sup>※wslにはすでにgitのダウンロードと設定がされています</sup>

## 方法

1. wslでusbデバイスを使用する環境をインストール
     [ここ](https://github.com/dorssel/usbipd-win/releases)の一番上のmsiをクリックしてインストール
1. wslにも環境をインストール

    ```bash
    sudo apt install linux-tools-generic hwdata
    sudo update-alternatives --install /usr/local/bin/usbip usbip /usr/lib/linux-tools/*-generic/usbip 20
    ```

1. 管理者でpowershellを開く
1. powershellでデバイスの`bus id`を調べる
    
    ```powershell
    usbipd wsl list
    ```

1. **wslを立ち上げた後**，powershellでデバイスを指定する

    ```powershell
    usbipd wsl attach --busid <busid>
    ```

1. wslから接続されたデバイスを確認

    ```bash
    lsusb
    ```

1. `dfu-programmer`のダウンロード

    ```bash
    sudo apt-get install dfu-programmer
    ```

1. githubリポジトリからファームウェアを取得
    
    ```bash
    git clone https://github.com/arduino/ArduinoCore-avr.git
    ```

1. ファームウェアを指定して書き込む

    ```bash
    cd ArduinoCore-avr/firmwares/atmegaxxu2/
    sudo dfu-programmer atmega16u2 erase
    sudo dfu-programmer atmega16u2 flash Arduino-COMBINED-dfu-usbserial-atmega16u2-Uno-Rev3.hex # ファイル名は変更されていることがあります
    sudo dfu-programmer atmega16u2 reset # 勝手にデバイスが切断される
    ```

1. デバイスがwslから切断されていない場合は以下のコマンドを入力

    ```powershell
    usbipd wsl detach --busid <busid>
    ```

参考にしたサイト

https://learn.microsoft.com/ja-jp/windows/wsl/connect-usb

https://docs.arduino.cc/hacking/software/DFUProgramming8U2
Ubuntu上にAnacondaをインストールする方法

WindowsのPCを新調した際に、これを機にAnacondaをWindowsではなくUbuntuにインストールしてみようと思い立ったのでメモ。

# 1　Linux版Anacondaのインストールパッケージをダウンロードする

Anacondaのダウンロードページを開く
https://www.anaconda.com/download

Linuxの64-Bit(x86)Installerのところまで行き、右クリックで「リンクのアドレスをコピー」

Ubuntuを開き、wgetでそのURLを張り付けてインストールする
```bash
$wget https://repo.anaconda.com/archive/Anaconda3-2023.07-2-Linux-x86_64.sh
```

# 2 Anacondaをインストールする
```bash
$chmod +x Anaconda3-2023.07-2-Linux-x86_64.sh
$./Anaconda3-2023.07-2-Linux-x86_64.sh
```
すると、以下のようにライセンスが表示される
```
Welcome to Anaconda3 2023.07-2

In order to continue the installation process, please review the license
agreement.
Please, press ENTER to continue
>>>
(以下略)
```
Enterキーを押し続けて、以下のような表示が見えたら'yes'を入力する
※Enterを長押ししすぎるとスキップされてしまうので注意！もっと楽にここまでたどり着ける方法があれば知りたい・・・

```bash
Do you accept the license terms? [yes|no]
[no] >>> yes
```

するとインストールが始まり、終わると以下のような表示が出てくる

```bash
done
installation finished.
Do you wish the installer to initialize Anaconda3
by running conda init? [yes|no]
[no] >>> yes
```

これで'yes'を入力すると、以下のような表示が出てインストールが終了する。

```bash
==> For changes to take effect, close and re-open your current shell. <==

If you'd prefer that conda's base environment not be activated on startup,
   set the auto_activate_base parameter to false:

conda config --set auto_activate_base false

Thank you for installing Anaconda3!
```

以上の文言は恐らくLinux環境に入った際に自動でcondaのbase環境に入るか否かを設定するときにこうしてね、というもの。

もし自動でbase環境に入ってほしくなかったら、wslを再起動してから以下のコマンドを入力してもう一度wslを再起動すればできます。

```bash
$conda config --set auto_activate_base false
```

(最終更新日　2023/09/26)
Azure Data Factory にて Delta コネクターを利用した際の Single-user check failed への対応方法

## 対応方法

Azure Data Factory にて Delta コネクターを利用する際に発生する Single-user check failed への対応方法を共有します。

```text
Failed to send request to Azure Databricks Cluster. Operation:  ExecuteCommand. Error: DatabricksServiceException: PERMISSION_DENIED:  Single-user check failed: user '2ce00497-3405-41de-8154-f9eaddddd'  attempted to run a command on single-user cluster 0508-bbbbb-ddddd, but  the single user of this cluster is 'aaa@xxx'.  Processed HTTP request failed. アクティビティ ID:  f7235ed8-9478-4863-aaa-ddddd
```

## エラー

### エラーメッセージ

データベース（スキーマ）の情報を取得しようとすると次のようなエラーが発生しました。

| #    | 項目           | 値                                                           |
| ---- | -------------- | ------------------------------------------------------------ |
| 1    | エラー  コード | 26751                                                        |
| 2    | 詳細           | Failed to send request to Azure Databricks Cluster. Operation:  ExecuteCommand. Error: DatabricksServiceException: PERMISSION_DENIED:  Single-user check failed: user '2ce00497-3405-41de-8154-f9eaddddd'  attempted to run a command on single-user cluster 0508-bbbbb-ddddd, but  the single user of this cluster is 'aaa@xxx'.  Processed HTTP request failed. アクティビティ ID:  f7235ed8-9478-4863-aaa-ddddd |

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/58936f31-a914-8c21-771f-8f1acf2929a8.png)


## 対応方法

### 対応方法概要

Azure Data Factory から Databricks への認証時に、認証時に利用しているユーザーと異なるユーザーに許可されているシングルユーザーアクセスモードで Databrick クラスターが作成されていることが原因です。対応方法としては、次の方法があります。

1. 共有クラスターへの変更
2. Azure Data factory における Databricks への認証方法をアクセストークンに変更

### 1. 共有クラスターへの変更


#### 1-1. 共有アクセスモードのクラスターを作成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/453e8223-6ce8-3f31-8277-6b1cbe66e40f.png)

#### 1-2. リンクドサービスにて利用するクラスターを変更

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/12eba283-1a89-b660-68b9-fbddef2e278d.png)

#### 1-3. データベース一覧を取得できることを確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/984d0ea2-cc18-cb41-e588-589526ce398a.png)

### 2. Azure Data factory における Databricks への認証方法をアクセストークンに変更

#### 2-1. シングルユーザーアクセスモードにて許可されているユーザーを確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/e13a76af-a32c-a6e3-83b3-deebc974ad23.png)

#### 2-2. アクセスが許可されているユーザーが Databricks 上にてアクセストークンを作成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/bddaba16-8f89-538d-b0ca-9a6c1ff91c77.png)

#### 2-3. 認証方法を`アクセス トークン`に設定して、取得したアクセストークンを設定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/605a94a1-3375-6744-e9e7-a4e7fd7d8c8f.png)

#### 2-4. データベース一覧を取得できることを確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/e07a972a-7bf5-668f-6275-c6ecaf3e6fbd.png)
推奨アラート設定を活用して簡単アラートセットアップ！

エージェントを入れてデータは集まってきたものの、アラートって何を設定したらいいのか迷う事ありませんか？
せっかく監視システムをモダン化したのに検知方法がレガシーではもったいないですよね。
でもNRQLもよくわからないし、New Relicのアラート設定ハードル高い！と思っているそこのあなた！！
実はどういったアラート設定を行えばいいかをGolden Signalsを元に簡単に設定することが可能になりました！
アラート設定に迷った時に是非ご活用ください！

:::note info
このアップデートの詳細はこちら。
[New Relic アップデート(2023年４月)](https://newrelic.com/jp/blog/nerdlog/new-relic-update-202304)
[New Relic アップデート](https://newrelic.com/jp/blog/nerdlog/new-relic-update "New Relic アップデート")
:::

## Golden Signalsとは
前置きとして「Golden Signals」とは何かを簡単に説明します。
「Golden Signals」とはGoogleがsite reliability engineeringの中で提唱している[The Four Golden Signals](https://sre.google/sre-book/monitoring-distributed-systems/)を指しています。これはシステムにおいて 4つの指標しか測定できない場合に焦点を当てるべき指標で、「Latency」、「Traffic」、「Errors」、「Saturation」がそれに当たります。


## 設定手順
設定は簡単です。

(１)Alert & AI -> Alert Conditions & Policies -> + New alert condition をクリック
![スクリーンショット 2023-09-26 12.28.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/313446/544a813e-ff13-6356-c0b2-cabfd0d8ca83.png)

(２)Golden signal or metrics をクリックすると設定可能な様々な項目が表示されます
設定したいシステムに合わせて選択します
※今回は例として「Service - APM」を選択します
![スクリーンショット 2023-09-26 12.30.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/313446/45cd9d38-ec5d-8fd8-a428-06a002cfab40.png)

（３）対象とするEntityを選択
![スクリーンショット 2023-09-26 12.39.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/313446/30d80506-46d2-ab5a-9698-bd7e69303797.png)

（４）選んだサービス、Entityを元に推奨設定項目が表示されます
例として「Response time(ms)」をクリックすると自動的にグラフが表示されます
「Next」をクリック
![スクリーンショット 2023-09-26 12.41.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/313446/36cf2baf-162c-403b-6e0f-6f53308d9213.png)

（５）ここでは評価期間や評価方法を設定
この記事では設定の詳細に関する説明は割愛しますが、Window durationや　Streaming Methodについて知りたい方は[こちらのブログ](https://newrelic.com/jp/blog/how-to-relic/alert-configuration-guidance)を是非ご確認ください
設定したら「Next」をクリック
![スクリーンショット 2023-09-26 12.51.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/313446/3be42a6c-6bef-1c40-b6aa-59469ba2e1da.png)

（６）thresholdsを設定
この記事では設定の詳細に関する説明は割愛します（([こちらのブログ](https://newrelic.com/jp/blog/how-to-relic/alert-configuration-guidance)をご参照ください）
設定したら「Next」をクリック
![スクリーンショット 2023-09-26 12.53.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/313446/3e6361a4-fc0c-f093-0d5d-71943a7ec2a5.png)

(7)Condition名やPolicy名を設定したら「Save condition」をクリック
![スクリーンショット 2023-09-26 12.56.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/313446/892e0f6c-e7b8-c617-c0e2-33f50d17b296.png)

(8)設定したNRQLQueryを見ることができるので、今後の参考にしてください
![スクリーンショット 2023-09-26 13.03.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/313446/c0a66e3f-3f4f-f028-a91b-9aa2f6b5a7f8.png)


## まとめ
初めてのアラート設定でも必要な項目を選択していくだけで、簡単に設定することができます
収集したデータを適切な項目で検知することで、早期検知と対応にお役立てください！

:::note info
このアップデートの詳細はこちら。[New Relic アップデート(2023年４月)](https://newrelic.com/jp/blog/nerdlog/new-relic-update-202304)
:::
:::note info
無料のアカウントで試してみよう！
[New Relic フリープランで始めるオブザーバビリティ！](https://qiita.com/ktst79/items/5ee74b34e6adb8a7a6fa)
:::
:::note info
[New Relic株式会社のQiita OrganizationOrganization](https://qiita.com/organizations/newrelic)では、
新機能を含む活用方法を公開していますので、ぜひフォローをお願いします。
:::
ガイド付きワークフローを使ってAPMログ転送を簡単実装！

## 概要
New RelicでAPMのアプリケーションのレスポンスタイムの他にログも一緒にみたいと思ったことはありませんか？
でもAPM入れた時にログ転送設定しなかった、フレームワークが対応してなくて転送設定していない、設定したいけど設定方法調べるのめんどくさい・・・
そんな時に簡単にログの自動転送設定の追加方法が簡単にわかったら嬉しいですよね？
実はそんな機能が新しく追加されました！！

:::note info
このアップデートの詳細はこちら。
[New Relic アップデート(2023年8月)](https://newrelic.com/jp/blog/nerdlog/new-relic-update-202308)
[New Relic アップデート](https://newrelic.com/jp/blog/nerdlog/new-relic-update "New Relic アップデート")
:::

## 手順
早速試してみましょう！ 設定手順はとても簡単です

(1)「+Add Data」をクリック
![スクリーンショット 2023-09-26 10.19.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/313446/f18ec06c-b31f-4e2a-8b2d-8df018b0f37b.png)
(2)「APM log fowarding」をクリック
![スクリーンショット 2023-09-26 10.22.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/313446/0d0ed785-21ff-802b-9102-cfe90007b4c5.png)
(3)対象とするEntityを選択
![スクリーンショット 2023-09-26 10.23.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/313446/bde264d1-afdf-49fd-8bf7-7654fc7edde0.png)
(4)エージェントで対応しているログフレームワークと設定方法が確認できます
※スクリーンショットの例はJavaの場合です
![スクリーンショット 2023-09-26 10.48.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/313446/10504ee8-a67d-d016-fd15-cb1dd29b6d23.png)
対応するフレームワークでログ転送を行うのか、別の方法でログ転送を行うのか選択して、「Continue」をクリック
![スクリーンショット 2023-09-26 10.58.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/313446/0e6d98ee-4453-0412-cefe-b809e564fcc3.png)
(５)ログの転送や装飾をConfigfileや環境変数に設定する方法が案内されているので、実行環境に合わせて設定を追加
※スクリーンショットの例はJavaの場合です
設定完了したら画面下にスクロールし「Continue」をクリック
![スクリーンショット 2023-09-26 11.00.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/313446/6ff4ab50-61f5-1dde-cc74-eae47845d100.png)
(６)「Test settings」をクリックしログが転送されるか確認(チェックに少し時間がかかります)
![スクリーンショット 2023-09-26 13.59.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/313446/14bfa7e8-8c35-7079-ae45-d059d77f7c8a.png)


## まとめ
アプリケーションのログ転送を行いたいときに、ドキュメントを探して設定を行う手間がかなり軽減されます。
是非お試しください！


:::note info
このアップデートの詳細はこちら。[New Relic アップデート(2023年8月)](https://newrelic.com/jp/blog/nerdlog/new-relic-update-202308)
:::
:::note info
無料のアカウントで試してみよう！
[New Relic フリープランで始めるオブザーバビリティ！](https://qiita.com/ktst79/items/5ee74b34e6adb8a7a6fa)
:::
:::note info
[New Relic株式会社のQiita OrganizationOrganization](https://qiita.com/organizations/newrelic)では、
新機能を含む活用方法を公開していますので、ぜひフォローをお願いします。
:::
LGPLが含まれる場合Asset Storeに公開してはいけない / 他のライセンスはどうなのか？

※追記：

先日、プロバイダ契約を再度確認したところ、問題となっていた5.10.4項が削除されました。

https://unity.com/legal/provider

Unity公式に連絡しても「最終的な公開の可否はアセットチームに委ねられるため回答できない」とのことだったので、アセットそのものを提出しない限りは不明ですが、これによって条件が変更された可能性があります。

また、変更前でも「LGPLライセンスに依存するモジュールをストアに公開せず、後からアセットのメニューを操作する形で、外部からインストールする形にすれば問題なく公開できる」ということもあったそうなので、この方法でアセットを公開されている場合もあります。

そのため、以下は現状と即していない可能性があるので、ご理解ください。

---

先日色々あったので、自らの反省を込めて共有いたします。  
（なお、この記事の内容は、あくまで私の解釈ですので、正確な情報はUnity公式に問い合わせてください）

# 目次

[1. 自分のアセットが配信停止になった](#1-自分のアセットが配信停止になった)  
[2. 他のライセンスはどうなのか](#2-他のライセンスはどうなのか)   
[3. おわりに](#3-おわりに)

# 1. 自分のアセットが配信停止になった

私は「FFmpeg for Unity」というアセットを[Unity Asset Store](https://assetstore.unity.com/ja)に公開していました。  
Unity上でFFmpegを使用できるようにしたアセットです。

しかし、つい先日、突如配信停止がなされました。

原因が分からないので、Unity公式に問い合わせたところ、以下がその理由だということです。

---
このパッケージには LGPL ライセンスの依存関係があり、プロバイダ契約 5.10.4 項に違反しているとの報告を受けました。調査の結果、このパッケージはアセットストアに
戻ることはできません。
 
[https://unity.com/legal/provider](https://unity.com/legal/provider)

---

FFmpeg本体などがLGPLライセンスで公開されているので、これに違反していたようです。

他のLGPLライブラリはともかく、FFmpeg本体がダメということなので、[今後はGitHubで配布するようにしました](https://github.com/MUMEI-NON906/FfmpegUnityDocs/blob/main/README_JP.md)。  
無償で公開してもいいですが、すでに購入した人が損をするので、[こちら](https://github.com/sponsors/NON906)で寄付した人に限定することにし、すでに購入した人はメールで連絡すれば寄付なしで使えるようにしました。

# 2. 他のライセンスはどうなのか

まず、GPLはLGPLより制約が強いのでまず無理でしょう。

また、Creative Commonsも駄目です。  
過去に公開しようとしましたが、以下のようにリジェクトされました。

---
You have assets in your package which require attribution or cannot be resold. Please remove such assets from the package before submitting it to the Asset Store. Any licenses that require a product to maintain open-sourced or limit usability in commercial products such as GNU/GPL Mozilla Public License, or any Creative Commons that requires attribution will not be allowed. Please reach out to Support@unity3d.com if you would like clarification about any specific license before submitting. ( https://unity3d.com/asset-store/sell-assets/submission-guidelines , Section 1.1.1.b)

---

MITやBSD、Apache2.0については、該当のアセット（[こちら](http://u3d.as/27Nj)と[こちら](http://u3d.as/2GD7)）が先ほどのような公開停止にならなかったので、大丈夫そうです。  
ただしストア本文に、以下のように、注釈とライセンスの種類、Copyrightを記載しないとリジェクトされます。  

```
This assets is governed by the Asset Store EULA; however, the following components are governed by the licenses indicated below:
A. XXX MIT License
Copyright (c) XXX
B. XXX Apache2.0
Copyright (c) XXX
...
```

# 3. おわりに

自分のケースでは、先ほどのように、LGPLを使っている旨を堂々と書いていたのですが、なぜかリジェクトされませんでした。  
Unity公式が見落としていたのか、規約などが変更されたのかは謎です。

いずれにせよ、違反しているアセットを公開してしまい、関係者の方々には申し訳ありませんでした。  
皆さんも同じようにならないように気を付けましょう。
【ネタ】エンジニアの開発・PM能力が上がる？ゲームを本気で選んでみる

こんにちは！
株式会社ワクトの@wakuto-KKです。

普段は、ワクトで執行役員をしております。
主に、社内経営や、実際に現場に出てwebフロント・バックエンド、iOS/androidアプリ開発をしています。

最近、メンバーがqiitaの記事を書きはじめたので、私も書いてやる！　という気持ちで初投稿です。
ただ、真面目な記事はメンバーが書いてくれるので、トリッキーな記事を書こうと思います。

# エンジニアの開発・PM能力が上がるゲームの判断基準
ここ数年で私が遊んだPS4,５、switchのゲーム４００本くらいの中から選定しています。
- 基本、独断と偏見
- のほほんとプレイできず、脳みそを使っている感が強いもの
- ゲームとしても名作だと思ったもの

## 開発能力が上がるゲーム
### [キャサリン・フルボディ](https://fullbody.jp/)
<img src="https://m.media-amazon.com/images/I/71NyDGJgIsL._AC_SX569_.jpg" width=30%>

パズルゲーに、修羅場ストーリーを足したゲーム。
常に焦らせるような状況下で、ごりごりのロジック理解と瞬時の判断力が求められます。
２周目をやると、自己成長実感をすごい感じれます。

#### 鍛えられる能力
　- 論理的思考能力
　- すばやい判断力
　- トラブルが起きても焦らない精神
　- 仕様・影響範囲理解の重要さ：なんとなくでやると、失敗して結局は多くの時間がかかっている

---

### [DARK SOULS](https://www.darksouls.jp/remastered/)
<img src="https://m.media-amazon.com/images/I/91ues7vkFhL.__AC_SX300_SY300_QL70_ML2_.jpg" width=30%>

高難易度のアクションゲームで、いわゆる○にゲーというやつです。
※他のソウルシリーズでも良いですが、一番ハマったのでこちらを選定。

#### 鍛えられる能力
　- トライ&エラーの心構え：物事は１回目ではうまくいかないと、すぐ悟れます。
　- 原因不明不具合の調査能力：やっかいな不具合の調査で規則性を探す能力は、ボスの予備動作観察に近い気がします。（そんなことないかも）


## マネジメント能力が上がるゲーム
### [トトリのアトリエ 〜アーランドの錬金術士2〜](https://www.gamecity.ne.jp/atelier/arlanddx/)
<img src="https://m.media-amazon.com/images/I/61CwwWbAG6L.__AC_SX300_SY300_QL70_ML2_.jpg" width=30%>

主人公が、母親を探すというゴールに対して、ガチマネジメントをするゲーム（だと思ってます）。
このゲームは、納期ががっつりあり、移動、採取(アイテム集め)、調合(開発)、戦闘をするたびに時間が経過していきます。
また、クエストには、調合したものに対して特性や品質条件があり、要件を満たしている必要があります。
さらに、メンバーとの好感度管理が必要で、正直普通のプロジェクトマネジメントです。
攻略をいっさい見ないで母親に会えた人は、マネジメントの才能ありです。笑

#### 鍛えられる能力
　- プロジェクトマネジメント能力全般：PMBOKの知識エリアの９つくらいは鍛えられる気がする。

---

### [ソウルキャリバー６](https://sc6.soularchive.jp/)
<img src="https://m.media-amazon.com/images/I/712tzVpRppL.__AC_SX300_SY300_QL70_ML2_.jpg" width=30%>

３Dの対戦格闘ゲーム。
息抜きにキャラクリもでき、いろいろと遊べます。

#### 鍛えられる能力
　- リスクとリターンの駆け引きからの判断力
　- 人の行動の予測力
　- 他メンバーに負けないぞという向上心
※他の格ゲーでも良いですが、自分のアクションに対してのリスクとリターンが一番わかりやすい、簡単操作で人読みに専念しやすいと思い、こちらを選定。
※２位を選ぶとしたら、[グランブルーファンタジー ヴァーサス](https://versus.granbluefantasy.jp/?lang=ja)


## 締めのあいさつ
以上、いかがだったでしょうか？？
もし、他にもおすすめがありましたら、コメントで教えていただければと思います。
そして、社内に布教していきたいと思います。
応用情報に3連敗した奴が意識して受かった1つのポイント

# 私のスペック
* 高卒
* 21歳
* 応用情報に3連敗してる

# 試験落ちすぎ問題な理由
お恥ずかしながら高3の秋位から受けたり受けなかったりで、
なんだかんだで3連敗してます。
特に午後で連敗しまくり。

じゃあ何故これだけ失敗したのか？というと以下が理由です。

__暗記で突破しようとしてたから__

応用情報が暗記で突破できないことは皆さん承知のはずです。
しかし、振り返ってみると意外と暗記で済ましてる人多いんじゃないでしょうか。

# 無意識的な暗記
皆さん、午後試験勉強してて時終わった後、復習しますよね。
普段なら納得するまで本読み漁ったりしていますが、
学習に疲れてくると「納得するボーダー」のラインが段々緩くなっていくのです。

普段なら「何故？これがxxだとするとooはどうなるの？」と深く追求する場面が疲れてると以下の様になります。
* 「これがxxだとするとooって...うーんまぁとりあえずそこまで探らなくていいか」
* 「とりあえず"そういうこと"だと覚えておくか」

これが積み重なって肝心な仕組み部分を抑え忘れたりすることがあるんですよね。
だから試験解いてると「これに似た解説前に見たな、、、しっかり読んどけばよかった、、、」となるんです。
特に、NWなんてDNSサーバの仕組みはもちろん、ゾーンファイルの中身についても触れられるし、午前とは段違いに掘り下げられます。

# じゃあどうすればいいか
簡単です、休憩するだけでいいんです。
疲れてるのに無理にやるのは非効率ではないでしょうか。
もちろん、休憩すると再開時は前回の学習ポイントまで記憶を掘り起こす作業が起こるため、
初めは効率は悪いでしょうが2-3時間の勉強時間で見たら効率下がってるのなんて初めの30分とかじゃないですか？
それに休憩する時にメモで「xxまでは分かった。けどこれがooな理由が分からない」みたいにメモ書きしておけば最初の効率低下の時間もある程度軽減出来ます。

# まとめ
振り返ってみると意外とそういった経験があるのではないでしょうか。
暗記ではダメ、と分かっていても無意識に疲れから妥協してしまってダメなことをしてしまってることが実はあるんですね。
他にも勉強する上で、「出来てるつもり」のようなものが無いか探してみるといいかもしれませんね。
来月、受験される方頑張ってください！！
【HTML】Tableタグ：CSS編：デフォルトのスタイルを確認しよう！

🌻Table【 デフォルトのスタイル 】
を確認しよう！

・th：太字、左右中央、上下中央
・td：太さ普通、左寄せ、上下中央

・背景色、余白：なし
・罫線：二重線

💡何も設定しなくても上下中央寄せになるのが嬉しいですね！

<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="gOZeZRO" data-user="tomok7" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/tomok7/pen/gOZeZRO">
  Table</a> by tomok7 (<a href="https://codepen.io/tomok7">@tomok7</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2525847/89265b53-138f-49d7-d272-9426ed2f7e95.png)
JOINしてから条件絞り　条件絞りしてからJOIN

# はじめに
今回扱っていく内容はデータ分析をする上で大事な**前処理**の結合の部分について軽く触れていきたいと思います。またここでは私が学んだこと実践したことを書いていく記事なので間違いなどがある場合はご指摘の方よろしくお願い致します。

# 目次
[1.はじめに](#はじめに)
[2.動作環境](#2-動作環境)
[3.”JOINしてから条件絞り”と”条件絞りしてからJOIN” 処理の順番でどう違う？](#3-”JOINしてから条件絞り”と”条件絞りしてからJOIN”　処理の順番でどう違う？)
[4.まとめ](#4-まとめ)
[5.参考文献](#参考文献)

# 2. 動作環境
・ Mac OS 13.5
・ Jupyter lab(100本ノック)

# 3. ”JOINしてから条件絞り”と”条件絞りしてからJOIN”　処理の順番でどう違う？
私が前処理の勉強にお世話になっている「前処理大全」では”結合処理の前にデータを絞る方が良い”と記されています。では実際に処理時間などどう違っていくのか実践してみたいと思います。
```python: 結合してから条件を絞る
# 結合処理の後に絞るのは良くない
import time
start = time.time()
i=0
time_list =[]
for j in range(10):
    while i < 30:    
        merge_df = pd.merge(df_customer[['customer_id','gender_cd']],df_receipt[['customer_id','amount']],on='customer_id',how='outer')\
        .query('gender_cd == "1" & not customer_id.str.startswith("Z")').fillna(0)
        merge_df.groupby('customer_id').agg({'amount':'sum'}).reset_index().head(10)
        i += 1
    end = time.time()
    times = end - start
    time_list.append(times)
[t for t in time_list]  
```
上のコードは100本ノックのp-038から解いたコードになっています。
timeモジュールを使用して３０回同じ処理をした時間を計算し、それを１０回繰り返した処理です。
以下が出力結果で、およそ4.38秒だということがわかります。

```python: 出力結果
[4.38420844078064,
 4.384221792221069,
 4.384230613708496,
 4.384239196777344,
 4.3842480182647705,
 4.384257078170776,
 4.384265422821045,
 4.384274244308472,
 4.384310007095337,
 4.384319305419922]
```
```python: 条件を絞ってから結合する
import time
start = time.time()
i=0
time_list =[]
for j in range(10):
    while i < 30:
        df_amount_sum = df_receipt.groupby('customer_id').amount.sum().reset_index()

        df_tmp = df_customer. \
                    query('gender_cd == "1" and not customer_id.str.startswith("Z")', 
                          engine='python')

        pd.merge(df_tmp['customer_id'], df_amount_sum, 
                 how='left', on='customer_id').fillna(0).head(10)
        i += 1
    end = time.time()
    times = end - start
    time_list.append(times)
[t for t in time_list]   
```
次に上のコードでは条件を絞ってから結合している記述となっています。
条件は同じで、timeモジュールを使用して３０回同じ処理をした時間を計算し、それを１０回繰り返した処理です。
以下が出力結果で、およそ1.47秒だということがわかります。
```python: 出力結果
[1.4742095470428467,
 1.4742226600646973,
 1.4742317199707031,
 1.4742403030395508,
 1.4742488861083984,
 1.4742577075958252,
 1.474266767501831,
 1.4742751121520996,
 1.4742841720581055,
 1.4742929935455322]
```
# 4. まとめ
以上、実践結果より断然、条件を絞ってから結合する方が処理速度が速いことがわかりました。結合する場合はテーブルをなるべく小さくして、利用するメモリ量を少なくすることがポイントだと言えます。
もしデータ量が何万、何億となるビッグデータを扱っていく場合はすごく重要なことになっていくと思われます。

## 参考文献

- 『前処理大全』
  - 著者: （本橋智光）
  - 出版年: （2019年5月２９日）
  - 出版社: （株式会社技術評論社）
  - URL: [前処理大全](（https://www.amazon.co.jp/%E5%89%8D%E5%87%A6%E7%90%86%E5%A4%A7%E5%85%A8-%E3%83%87%E3%83%BC%E3%82%BF%E5%88%86%E6%9E%90%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AESQL-Python%E5%AE%9F%E8%B7%B5%E3%83%86%E3%82%AF%E3%83%8B%E3%83%83%E3%82%AF-%E6%9C%AC%E6%A9%8B-%E6%99%BA%E5%85%89/dp/4774196479）)
  - 概要: 本書は、データの前処理に関する包括的なガイドです。実用的なテクニックとベストプラクティスに焦点を当てています。前処理の重要性とその実践的な方法について深く探求しています。
【Rails】rubocop導入手順の備忘録

# はじめに
お疲れさまです。
おおくまです。

現在、色々なことを試して遊んでいるミニアプリに~~重い腰を上げて~~rubocopを導入しました。
その際の備忘録です。

# 環境
Ruby 3.2.2
Rails 7.0.8

# 注意点
:::note warn
私はプログラミング学習中で、初学者です。
内容に誤りがある場合があります。
コメント等で教えていただけると幸甚です。
:::

# 実装
[rubocop](https://github.com/rubocop/rubocop)をインストールする。
```ruby:Gemfile
+ gem 'rubocop', require: false
```
``bundle install``を実行。

``bundle exec rubocop``でrubocopを通してみる。

```ruby:ターミナル
52 files inspected, 688 offenses detected, 669 offenses autocorrectable

The following RuboCop extension libraries are installed but not loaded in config:
  * rubocop-capybara
  * rubocop-rails
```
**恐ろしい数の指摘と、2つのライブラリをインストールするように提案が返ってきました。**

[rubocop-capybara](https://github.com/rubocop/rubocop-capybara)と[rubocop-rails](https://github.com/rubocop/rubocop-rails)をインストールする。
```ruby:Gemfile
+ gem 'rubocop-capybara', require: false
+ gem 'rubocop-rails', require: false
```
``bundle install``を実行。

``rubocop --auto-gen-config``を実行。
``.rubocop.yml``ファイルが作られる。
```ruby:ターミナル
Please also note that you can opt-in to new cops by default by adding this to your config:
  AllCops:
    NewCops: enable
```
また、こういった提案があったので、``.rubocop.yml``ファイルに書き込む。

```ruby:.rubocop.yml
AllCops:
  NewCops: enable
  Exclude:
    - 'bin/**/*'
    - 'db/migrate/**/*'
    - 'db/schema.rb'
    - 'vendor/**/*'

require:
  - rubocop-rails
  - rubocop-capybara
```
``Exclude``下にはチェック不要のファイルを記入する。

再度、``bundle exec rubocop``を実行してみる。
```ruby:ターミナル
47 files inspected, 651 offenses detected, 632 offenses autocorrectable
```
651個の指摘のうち、632個は自動修正可能であるとのことなので、
``bundle exec rubocop -a``を実行し、残りは手作業で直します。

再度、``bundle exec rubocop``を実行してみる。
```ruby:ターミナル
Inspecting 37 files
.....................................

37 files inspected, no offenses detected
```
全てチェックが通りました。
最後まで読んでいただきありがとうございました。
AMIから起動したEC2のデフォルトユーザーでパスワード認証によるssh接続をする

# やりたいこと
パスワード認証を有効化し、デフォルトユーザー(RHEL8で実施するためec2-user)を使用して
パスワードによるssh接続をしたい。

EC2はAutoScalingで制御するため、AMIから起動する。

# デフォルト設定だとどうなるか
パスワード認証を有効化し、デフォルトユーザーのパスワードを変更した後にAMIを取得しても、
AMIから起動したEC2はパスワード認証が無効化され、デフォルトユーザーのパスワードはリセットされる。

# 対応策
**1. /etc/ssh/sshd_configでパスワード認証をno → yesにする。**
~~~
PasswordAuthentication yes
~~~
上記がパスワード認証を有効化する設定

**2. /etc/cloud/cloud.cfgでssh_pwauth:0(no) → 1(yes)にする。**
~~~
ssh_pwauth: 1
~~~
上記がEC2起動時にパスワード認証を自動的に有効化or無効化にする設定

**3. /etc/cloud/cloud.cfgでlock__passwd: true → lock__passwd: falseにする。**
~~~
lock__passwd: false
~~~
上記がEC2起動時にデフォルトユーザーのパスワードを自動的にリセットする設定

**4. デフォルトユーザーのパスワードを設定する。**
~~~
sudo passwd ec2-user
~~~

**5. AMIを取得する。**

これでAMIから起動したEC2でも、パスワード認証が有効になり、デフォルトユーザーのパスワードもリセットされず、設定したパスワードでssh接続をすることができる。

# 参考サイト
https://qiita.com/uzresk/items/6d3f60fc9b2d0be66b0d

https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/8/html-single/configuring_and_managing_cloud-init_for_rhel_8/index
画像形状を 16:9 に変換

フォルダー内にある *.jpg を一括で、16:9 に変換する方法です。

```bash:go_henkan.sh
#!/bin/bash
#
nn=0
for img in *.jpg
do
	echo $nn
	echo $img
	convert $img  -background black -gravity center -extent 16:9  pic_$nn".jpg"
	nn=`expr $nn + 1`
done
#
```

変換前の画像
![5000-21.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/58933158-6bff-4282-3c81-97a4bf34b2e8.jpeg)

変換後の画像
![pic_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/cd61c12c-a0c6-0061-0eab-963f0a0a0b52.jpeg)