OmniAICreator/Qiita-1.07M huggingface dataset:
SnykでOSSプロジェクトの脆弱性をチェックしてOSS貢献？！

# Snykとは？

> Snyk helps software-driven businesses develop fast and stay secure. Continuously find and fix vulnerabilities for npm, Maven, NuGet, RubyGems, PyPI and more.

翻訳

> Snyk は、ソフトウェア駆動型ビジネスの迅速な開発と安全性の維持を支援します。npm、Maven、NuGet、RubyGems、PyPIなどの脆弱性を継続的に発見し、修正します。

# 使ってみた。🐶🐶🐶

初めて使ってみましたが、 **超簡単** です。

ログイン後の画面🐶🐶🐶

![app.snyk.io_org_moritalous_add(1280x720).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/25c2e6b9-65f1-46bd-0708-75869e2542da.png)


`GitHub`を選択します。🐶🐶🐶

![app.snyk.io_auth_github-upgrade_redirectUri=L29yZy9tb3JpdGFsb3VzL3NvdXJjZXMvOWEzZTVkOTAtYjc4Mi00NjhhLWEwNDItOWEyMDczNzM2ZjBi(1280x720).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/eb655d2e-a323-495c-169a-707fa0ac9155.png)

パブリックリポジトリが指定できるので、wordpressのリポジトリを指定してみました。🐶🐶🐶

![app.snyk.io_org_moritalous_add_github-readonly(1280x720).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/1c21ab55-2275-75a4-75cc-1a88311d701c.png)

こちらが結果です。WordPressには脆弱性は見つからないようです。さすがです

![app.snyk.io_org_moritalous_projects(1280x720).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/2eec4d65-293f-ec6a-8784-1f41d7615408.png)


# CloudFormationテンプレートもチェックできる

IaCもチェックできるぞ　ということなので、CloudFormationのテンプレートをチェックしてみました。題材はこちら。

https://github.com/awslabs/aws-cloudformation-templates

こちらは **脆弱性が見つかりました** 。

![app.snyk.io_org_moritalous_projects(1280x720) (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/1e7a7906-c4c6-7357-116d-113ea8d83925.png)

どんな指摘を受けているかというと

![app.snyk.io_org_moritalous_project_36565b16-0de5-44f1-98c2-9152e9f71988(1280x720).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/1ba0b5b3-f787-5564-f2f6-41664e104f0a.png)

暗号化しましょう。対処方法も提示してくれるのでとても便利です。

![app.snyk.io_org_moritalous_project_36565b16-0de5-44f1-98c2-9152e9f71988(1280x720) (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/c63eb9c7-b231-9a40-f6e0-d36260d29fa4.png)

こちらはS3への指摘。

![app.snyk.io_org_moritalous_project_cb0ec7f3-dbb9-4fb9-8a57-fcb627e7b605(1280x720).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/52487baf-55d1-d305-9f97-61efeeebe52f.png)

S3のパブリックアクセスを禁止しましょう。


# OSS貢献への道

自分のリポジトリだけでなく、パブリックなリポジトリに対してもチェックができるので、Snykの指摘を対処するというOSS貢献ができるのではないでしょうか？？先程のCloudFormationテンプレートはサンプルなので、あまり意味はないかもしれませんが、対応してプルリクすると、OSSに貢献できる気がします。今度やってみます。🐶🐶🐶

# まとめ

指摘されたら対応できるんですが、対応できているかは自分でチェックするのはなかなか難しいです。その点で、**Snykはとても有用なツール** だと思います。🐶🐶🐶
Linuxのパッケージ管理まとめ(ざっくり)

# RPM

- RPM Package Managerの略(元々はRed Hat Package Managerの略だった)
- 主にRed Hat系のディストリビューションでソフトウェアのパッケージを管理するためのシステム
- `.rpm`形式のパッケージとその依存関係を管理している
- 依存関係を自動的に解決したい場合は、YumやDNFを使用する
    - YumやDNFも内部的にはRPMを使用している
- 公式サイト: https://rpm.org/index.html

# Yum

- Yellowdog Updater Modifiedの略
- RPMのパッケージを管理するメタパッケージ管理システム
- Yellow Dog Linuxで利用されていたパッケージ管理システムであるYUPを全面的に書き換える形で誕生した
    - Yellow Dog LinuxはPlayStation 3にも対応しているディストリビューションだった
- 以下のような理由からDNFへの置き換えが行われている
    - メモリリークをはじめとしたバグにより、OSのパフォーマンスを低下させてしまう恐れがある
    - ドキュメントが存在しない
    - 依存関係アルゴリズムが壊れている
    - Python2系にしか対応していない
- 複数のパッケージをひとまとまりにしたリポジトリという単位で管理しているため、インストールの際に手元にパッケージファイルを用意する必要がなく、パッケージ名さえ分かっていれば良い
- 有名なリポジトリだと
    - EPOL
        - Extra Package for Enterprise Linux
        - RHEL向けの高品質なアドオンパッケージが揃っている
    - Remi
        - 最新のPHPを使用する際等に使用するリポジトリ
- 公式サイト: http://yum.baseurl.org/

# DNF

- Dandified Yumの略
- Yumのフォーク
- Python3系に対応した他、Yumに存在した様々な問題を解消している
- コマンド体系はopenSUSEのパッケージ管理システムであるZypperを参考にしている
- 公式サイト: https://rpm-software-management.github.io/

# dpkg

- Debian Packageの略
- 主にDebian系のディストリビューションでソフトウェアのパッケージを管理するためのシステム
- `.deb`形式のパッケージとその依存関係を管理している
- 依存関係を自動的に解決したい場合は、apt-getやaptを使用する
    - apt-getやaptも内部的にはdpkgを使用している

# apt-get

- Advanced Packaging Tool
- dpkgのパッケージを管理するメタパッケージ管理システム
- 複数のパッケージをひとまとまりにしたリポジトリという単位で管理しているため、インストールの際に手元にパッケージファイルを用意する必要がなく、パッケージ名さえ分かっていれば良い
- 公式サイト: https://tracker.debian.org/pkg/apt

# apt

- apt-getの拡張
- apt-getが抱えていた設計上のミスを克服している

# Aptitude

- APTから派生して開発された
- よりインタラクティブで高度なことができる

# Snappy

- カノニカル(Ubuntuを支援している企業)が開発しているパッケージ管理システム
- パッケージ毎の独立性が高く、多数のディストリビューションをまたいで利用できる作りになっている
- 公式サイト: https://snapcraft.io/

# Homebrew

- Macでおなじみのパッケージ管理システム
- HomebrewからフォークしてLinuxbrewが開発されていたが、Homebrewにマージされた
- 公式サイト: https://brew.sh/index_ja
スーパーコンピュータでビジネスはどう変わる？

# はじめに
IT×ビジネスという視点で週1本記事を投稿しています。
もし興味のある方は下のリンクから他の記事も見ていただければ幸いです。
 [@7_inai_](https://qiita.com/7_inai_)

# スーパーコンピュータとは
スーパーコンピュータとは普通のコンピュータと比較して __はるかに速い処理速度を要する__ コンピュータのことで、__スパコン__ と略されることもあります。

# スーパーコンピュータでビジネスがどう変わる？
日本を代表するスーパーコンピュータとしては、__「京」__ と __「富岳」__ の2つが挙げられます。特に京の後継機として開発された富岳は、世界で最も高速なコンピュータを決めるランキングで、2020年6月、2020年11月、2021年6月、2021年11月と4期連続で首位を飾りました。（現在は米国のFrontierが首位です）
また、富岳は使いやすさにこだわって作られましたが、スパコンで実際に広く使われているアプリを走らせた __実行性能が京の約100倍__ あります。
スーパーコンピュータは、その処理速度を生かしたシミュレーションやビッグデータ解析を得意としています。その実例としては以下のようなものがあります。

- Society5.0の実現
Society5.0とはサイバー空間とフィジカル(現実)空間を融合させたシステムにより、経済発展と社会的課題の解決を両立する人間中心の社会にことです。このSociety5.0を実現させるためには、富岳のような莫大な計算量とソフト/ハードの両面での汎用性を併せ持つスーパーコンピュータの力が不可欠です。
- 産業の国際競争力強化
シミュレーションにより得られる経済活動に関する情報の、ビッグデータ解析や経済シミュレーションにより、様々な社会現象を推定することができます。また、様々な製造条件下でのシミュレーションにより製造現場における最適化をすることができます。
- 防災/災害対策
人工衛星・ドローンなど各地のセンサーから送られてくる情報と災害シミュレーションや過去の履歴情報に対してビッグデータ解析やシミュレーションを行うことで、災害を予測するだけでなく、災害発生時には避難が困難な道路の特定や避難者毎の最適避難指示を行うことができます。

# 終わりに
スーパーコンピュータは言うなれば、研究開発を行うための環境の一部のようなものです。世界各国がスーパーコンピュータの開発に切磋琢磨していますが、その背景にはすぐれた開発環境を作るという目的があります。


最後までお付き合いくださりありがとうございました。
PythonでIPアドレスを取得する方法

## 1つのIPアドレスのみ活性化している場合

```python
import socket
hostname = socket.gethostname()
ip_address = socket.gethostbyname(hostname)
```

結果

```
10.56.126.27
```

文字列とて返されます。

## 複数のIPアドレスが活性化している場合

```python
import socket
hostname = socket.gethostname()
hostname, alias_list, ipaddr_list = socket.gethostbyname_ex(hostname)
print(ipaddr_list)
```

結果

```
['10.56.126.27', '10.202.6.27', '10.156.6.27']
```

List型で返されます。
Salesforceの「取引先責任者の役割」に紐づく取引先責任者を制限する方法

「取引先責任者の役割」について

Salesforceの商談オブジェクトに紐づく「取引先責任者の役割」を使用すれば、どの商談でどの担当者がどのような役割であったかを記録することが可能です。

![取引先責任者の役割.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/2e60654f-6ef2-dd62-a03d-ba9d91b095be.png)

この「取引先責任者の役割」ですが通常の運用であれば「商談に紐づく取引先」の取引先責任者が紐づくかと思います

（つまり株式会社Aの商談なら株式会社Aの取引先責任者が紐づく）

しかし、標準機能ではすべての取引先の取引先責任者が紐づいてしまいます

（つまり株式会社Aの商談でも株式会社Bや株式会社Cの取引先責任者が紐づくことも可能です）

この設定について標準で何とかすることはできないのでしょうか

（つまり、株式会社Aの商談なら株式会社Aの取引先責任者が確実に紐づくことはできないか？）

結論からいえば、
下記のような入力規則を
商談 取引先責任者の役割　オブジェクト（OpportunityContactRole）に作成すれば対応可能です。

Opportunity.AccountId   <>  Contact.AccountId

![紐づけ禁止.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/277924c5-bf4c-66bd-803a-ba0f10ee8c7c.png)

このような入力規則を作成すれば、添付画像のように保存時に赤い三角が出て入力規則のエラーメッセージが表示されるので、株式会社Aの商談でも株式会社Bや株式会社Cの取引先責任者が紐づく。という動きが封じることが可能です

![入力規則結果.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/4c9ab8c1-efe4-4c3a-4e3b-0bb3c6e0dfb8.png)
ペーパーレスファックスの構築 (3) - ファックス受信文書のクリーンアップ

ファックスの受信文書は、スパムファックスもあったりで、基本的にはずっと保存しておくものではないと思ってます。
必要なものであれば、どこか別の場所に保存するなりなんなりすべきと思うので、前回のフローで作成したPlannerのタスクが完了したら、削除したほうがよいと思います。
SharePointの容量だって無制限ではないですし。

ということで、ファックスの受信文書をクリーンアップするフローを紹介していきます。
# フロー
## 全体
前回のPlannerのタスクを作成するフローより、少し複雑になっています。
![2022-07-04_21h22_26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244231/9d5cb4ab-0a99-810c-f4bf-0fce6539580a.png)
タスクが完了してすぐ削除することにすると、間違って完了にチェックを入れたときに復活させるのに手間なので、保管期限を決めて完了後何日後に削除する、という手順を踏んでいます。
タスクの完了をトリガーにするという方法もないわけではないですが、その場合トリガーした後、保管期限到達までウェイトをかけて、その間ずっと実行中のままになるのが嫌だったので、毎日決まった時刻にクリーンアップするバッチ処理方式にしています。
## トリガー
![2022-07-04_21h38_54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244231/7c50a2fb-d0c0-3388-1ee7-df4db658c7dc.png)
繰り返しトリガーです。毎日21時に実行します。
あと、保管期限も変数に設定しておきます。使うのは一か所だけですが、変数に入れておくことで後々保管期限を見直す際に変更しやすくなると思います。

## PlannerとSharePointの情報取得
![2022-07-04_21h41_17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244231/108a6195-6499-4355-4bba-48631e09efca.png)
まず、SharePointに保管されたファックス受信文書をまとめて取得します。
このとき、フィルタークエリをかけて、RelatedItemId（PlannerのタスクIDを格納するドキュメントライブラリの列）が空のものを除外しています。たぶん、空でもエラーにはならないとは思いますが、念のため。
なお、フィルタークエリで絞り込めるものは、「アレイのフィルター処理」に頼るよりもなるべくフィルタークエリ（ODataクエリ）を使うようにしましょう。
Plannerのタスクはフィルタークエリが使えないので、がっくるめて全部取得しています。

## SharePointのファイルでループ
![2022-07-04_22h02_00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244231/45fac8eb-6a30-2ba5-ec40-461262062f8e.png)
SharePointのファイルのプロパティを取得してますが、「ファイルの取得(プロパティのみ)」から必要なデータは取れるので、正直これは必要なかった...
次のステップはアレイのフィルター処理です。Plannerのタスク一覧を関連アイテムID（RelatedItemId）でフィルターし、タスクを探します。
条件ステップの左辺に入っているのは以下の式です。
~~~
length(body('関連アイテムIDでフィルター'))
~~~
フィルターして、length関数で１以上なら見つかった、０なら見つからなかった、というよくやる条件分岐ですね。
lengthとfirstは、ほんとよく使います。

## 条件式がTrueのとき（タスクが見つかったとき）
![2022-07-04_22h07_49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244231/8735202d-de0a-6bb2-308b-e488c7fd027b.png)
流れとしては、関連アイテムIDのタスクを取得し、完了日時から保管期限を経過しているかを判定して、期限切れであればSharePointのファイルとPlannerのタスクを削除する（期限切れ前であれば何もしない）、という処理になります。
「タスクを取得する」アクションのタスクIDには、SharePointから取得した関連アイテムIDが入っています。（「タスクの削除」アクションのタスクIDも同様です）
次の条件ブロックには、左辺に以下の式が入っています。
~~~
addDays(body('タスクを取得する')?['completedDateTime'],variables('保管期限'))
~~~
completedDateTimeは、タスクの完了日時です。
これにaddDays関数で、「保管期限」変数の日数を加算して保管期限到来日時を求め、現在時刻（utcNow()関数）より前であれば、「はいの場合」に進みます。
「ファイルの削除」と「タスクの削除」は説明不要かと思います。
「いい絵の場合」は、保管期限到来前なので、何もしません。
## 条件式がFalseのとき（タスクが見つからなかったとき）
![2022-07-04_22h20_05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244231/f7bf3eb9-e977-5ba2-9f8b-80523265ed63.png)
このパターンは、メモにも書いているとおり、タスクを完了ではなく、手動で削除した場合に起こりえます。
スパムファックスとかだと、問答無用でタスクを削除してしまうと、保管期限を待たずにファイルを削除してしまうこともできるようにしています。
なので、ここでは無条件に「ファイルの削除」アクションを実行しています。

# まとめ
今回のフローは、社内ルールをどう決めるかによってフローの組み方も変わると思うので、皆さんの会社にあったやり方でいろいろと工夫されてみてはいかがでしょうか。

次回は、タスクを完了した際に別のWebサービスに転送するフローを照会する予定です。
【Terraform】ECSの環境変数をSSMを利用して設定する

# 初めに

現在作成中のポートフォリオは、`Terraform`を利用して`AWS`にデプロイをしています。

`ECS`のコンテナに対して、`enviroment`から環境変数を渡していましたが変数の追加などがあった際、タスク定義を書き換える必要がありめんどくさいです。

`SSM`を通して環境変数を渡すことでタスク定義を書き換えずに更新できます。

## 環境

- terraform v1.0.2
- provider AWS v3.38.0

# 環境変数を SSM に登録する

`task definition`の`secretsのvalueFrom`に`SSMのarn`を追加する必要があります。

まずは`ssm_parameter`を作成します。

変数自体は`terraform.tfvars`に書きます。

```terraform:ssm.tf
resource "aws_ssm_parameter" "secret" {
  name = "ENV_FILE"
  type = "SecureString"
  value = var.env_file
}
```

# 利用するタスク定義を書き換える

`ecs_task definition`を書き換えます。

`template_file`を利用しているので、`vars`の`ssm_parameter_arn`に`aws_ssm_parameter`の`arn`を書きます。

```terraform:ecs.tf
resource "aws_ecs_task_definition" "ecs-task" { #タスク定義
  family                   = "ecs-task"
  cpu                      = "512"
  memory                   = "1024"
  network_mode             = "awsvpc"
  requires_compatibilities = ["FARGATE"]
  container_definitions    = data.template_file.rails_task.rendered
}

data "template_file" "rails_task" {
  template = file("${path.module}/task/rails_container_definitions.json")

  vars = {
    ssm_parameter_arn = aws_ssm_parameter.secret.arn,
    rails_image = var.rails_image,
  }
}
```

```json:task_definitions.json
[
  {
    "name": "rails",
    "image": "${rails_image}",
    "environment": [
      {
        "name": "RAILS_ENV",
        "value": "production"
      }
    ],
    "secrets": [
      {
        "name": "ENV_FILE",
        "valueFrom": "${ssm_parameter_arn}"
      }
    ],
    // 以下省略
  }
]
```

これにより、`ssm_paramter`で設定した`ENV_FILE`を`rails`のコンテナに渡すことができます。

環境変数を変更したい場合は、`terraform.tfvars`を書き換え`terraform apply`をすることで更新するできます。

# 参考

- [ssm_parameter - Terraform Documentation](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/ssm_parameter)
- [aws_ecs_task_definition - Terraform Documentation](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/ecs_task_definition)
- [タスク定義パラメータ - AWS ドキュメント](https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/task_definition_parameters.html)
Cloud Functionsでデプロイできない「i  functions: cleaning up build files...」と言う謎のエラー。。。

# なぜかデプロイできない

```console
i  deploying functions
Running command: npm --prefix "$RESOURCE_DIR" run build

> build
> tsc

✔  functions: Finished running predeploy script.
i  functions: ensuring required API cloudfunctions.googleapis.com is enabled...
i  functions: ensuring required API cloudbuild.googleapis.com is enabled...
✔  functions: required API cloudbuild.googleapis.com is enabled
✔  artifactregistry: required API artifactregistry.googleapis.com is enabled
✔  functions: required API cloudfunctions.googleapis.com is enabled
i  functions: preparing codebase default for deployment
⚠  functions: package.json indicates an outdated version of firebase-functions. Please upgrade using npm install --save firebase-functions@latest in your functions directory.
⚠  functions: You are using an old version of firebase-functions SDK (3.15.4). Please update firebase-functions SDK to >=3.20.0
i  functions: preparing functions directory for uploading...
i  functions: packaged /Users/gen/Desktop/basic/hCalendar/functions (71.91 KB) for uploading
i  functions: ensuring required API cloudscheduler.googleapis.com is enabled...
✔  functions: required API cloudscheduler.googleapis.com is enabled
✔  functions: functions folder uploaded successfully
i  functions: creating Node.js 10 function scheduledFirestoreExport(asia-northeast2)...
⚠  functions: failed to create function projects/hcalendar-7c1f4/locations/asia-northeast2/functions/scheduledFirestoreExport
Failed to create function projects/hcalendar-7c1f4/locations/asia-northeast2/functions/scheduledFirestoreExport

Functions deploy had errors with the following functions:
	scheduledFirestoreExport(asia-northeast2)
i  functions: cleaning up build files...

Error: There was an error deploying functions
```

`i  functions: cleaning up build files...`は一体何ですか？？？:frowning2:

https://github.com/firebase/firebase-tools/issues/3694

```console
# Get the latest version of the firebase command
npm install -g firebase-tools

# Unlock the deletegcfartifacts command
firebase --open-sesame deletegcfartifacts

# Run a full purge of your GCF artifacts directories
firebase functions:deletegcfartifacts
```

こちらを試してみるも変換なし・・・。

# よくみるとfirebase-functions SDKのバージョンアップを求められていた！

```console
⚠  functions: package.json indicates an outdated version of firebase-functions. Please upgrade using npm install --save firebase-functions@latest in your functions directory.
⚠  functions: You are using an old version of firebase-functions SDK (3.15.4). Please update firebase-functions SDK to >=3.20.0
```

![Screen Shot 2022-07-04 at 22.21.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/fe02c403-bef5-cb3a-6512-96fdc010c44f.png)

**これだ！！！**

`/path_to_your_project/functions`のように、ターミナルの現在地をfunctionsの階層へ移動して

```console
sudo npm install --save firebase-functions@latest
```

これを実行すればfunctionsのデプロイに成功しました！！！:relaxed:
Material-UI のtheme と emotion の theme を同じにする

# やる理由
タイトル通りなのだが、環境構築しtheme をemotionで使おうとしたところ、使えず型が異なっていた。
そのため、`does not exist` などのエラーとなった。
↑ 以前。
現在は、Theme の型にないと怒られます。。
`theme.spacing(2)` などとしたときに`spacing` にエラーが出てきます。
これは私の設定のせいかもしれないです on VScode

# 環境
- Next.js
- Typescript

# 方法
- emotion/ mui の設定をする
- emotion のtheme の型をmui の型に変更する

# インストール・設定
公式より
https://mui.com/material-ui/getting-started/installation/

MUI/ Material-ui の追加

```terminal
// npm の場合
# npm install @mui/material @emotion/react @emotion/styled

// yarn の場合
# yarn add @mui/material @emotion/react @emotion/styled
```

インストール後、初期表示画面にて
`next.js: _app.js`
`react.js: index.js`

★`Theme.ts` でcreateTheme をている前提としてるので、自分で作成してね！

キャッシュしてくださるそうで、少し早くなるそうです。
なので、一応作っておく。
公式のサンプルgithubが[こちらのリポジトリ](https://github.com/mui/material-ui/tree/master/examples/material-next-ts) をご確認ください

```code:createEmotionCache.ts
import createCache from '@emotion/cache'

const isBrowser = typeof document !== 'undefined'

export const createEmotionCache = () => {
  let insertionPoint

  if (isBrowser) {
    const emotionInsertionPoint = document.querySelector<HTMLMetaElement>(
      'meta[name="emotion-insertion-point"]',
    )
    insertionPoint = emotionInsertionPoint ?? undefined
  }

  return createCache({ key: 'mui-style', insertionPoint })
}
```

```code:_app.tsx
import type { AppProps } from 'next/app'
import { ThemeProvider } from '@mui/material/styles'
import { ThemeProvider as EmotionThemeProvider } from '@emotion/react'
import { theme } from '../config/Theme'
import { CacheProvider } from '@emotion/react'
import Head from 'next/head'
import { CssBaseline } from '@mui/material'
import { createEmotionCache } from '../CreateEmotionCache'

const cache = createEmotionCache()

function MyApp({ Component, pageProps }: AppProps) {
  return (
    <>
      <CacheProvider value={cache}>
        <ThemeProvider theme={theme}>
          <EmotionThemeProvider theme={theme}>
            <CssBaseline />
            <Component {...pageProps} />
          </EmotionThemeProvider>
        </ThemeProvider>
      </CacheProvider>
    </>
  )
}

export default MyApp

```

# mui と emotion のtheme の型を設定

```code: myapp/src/types/emotion.d.ts
import { Theme as MUTheme } from "@mui/material/styles";
declare module "@emotion/react" {
  export interface Theme extends MUTheme {}
}
```

# 最後に
Theme の設定などあるけど、作りながら設定していけば良きかな。
Typescript のコードなんだろうけど、`*.d.ts` というファイルを今後理解しないといけない！
M1macローカルでdockerを使用してwordpress環境構築

# この記事について
* M1macにてdockerを使いwordpress環境を友人のPC上に構築をしてみたところ苦労したので書こうと思いました。


* dockerデスクトップはすでにインストール済みとします。

## docker-compose.ymlファイルを作成
```
version: '3'
services:
   db:
     image: mysql:5.7
     platform: linux/amd64
     volumes:
       - db_data:/var/lib/mysql
      #  - ./db/mysql:/var/lib/mysql
     restart: always
     environment:
       MYSQL_ROOT_PASSWORD: root
       MYSQL_DATABASE: wordpress
       MYSQL_PASSWORD: root
   wordpress:
     depends_on:
       - db
     image: wordpress:latest
     ports:
       - "8088:80"
     restart: always
     environment:
       WORDPRESS_DB_HOST: db
       WORDPRESS_DB_USER: root
       WORDPRESS_DB_PASSWORD: root
       WORDPRESS_DB_NAME: wordpress
     volumes:
       - .:/var/www/html
volumes:
    db_data:

```
環境構築自体は上記ファイルを作成して頂きコマンドを叩いてもらうと実行出来ます。

## 次にターミナルを開いてください。
* ご自身のターミナル内で先程作成して頂いたdocker-compose.ymlが入っているフォルダに移動します。

```
docker compose up -d
```
上記を実行してください。
これだけで完了です。

# 最後に
今回はplatformの記入が重要でした。
共同開発をしようとインテルmacで構築していた際にM1macだと上手く起動できなくて苦労したのでこの記事が参考になればと思います。
RaspberryPiでLチカ（Dockerコンテナから/dev/gpiomem経由）

# やりたいこと

Dockerコンテナから/dev/gpiomemを操作してLEDをチカチカさせる。


# 手順

### 1.RaspberryPiOSのDockerイメージを作る

https://qiita.com/ryot0/items/3b40a0e5f227d97b7d3b


### 2.Dockerコンテナを作る

```shell
docker create -it --name gpiomemcont01 --device /dev/gpiomem -v /data/homepi:/home/pi raspios:0.0.1 /bin/bash
docker start gpiomemcont01
docker attach gpiomemcont01
```

--deviceオプションでホストのデバイスファイルをコンテナに紐づけることができる。


### 3.attachしたコンテナ内から/dev/gpiomemを操作してLEDをチカチカさせる

https://qiita.com/ryot0/items/7ba2dce7c916fae39c09
AWS SAP勉強中に学んだこと

# はじめに
今はAWSソリューションアーキテクトプロフェッショナル試験（以下、SAP）の勉強しています。
勉強中に学んだことを記事にしていこうと思います。

# セキュリティグループとネットワークACL
セキュリティグループは、EC2、ELB、RDSなどの<font color="Red">**インスタンス**</font>に適用するファイアウォール機能です。
ネットワークACLは、<font color="Red">**サブネット**</font>に適用するファイアウォール機能です。

|  | セキュリティグループ | ネットワークACL |
|:-:|:-:|:-:|
| 適用先  | <font color="Red">**インスタンス**</font>  | <font color="Red">**サブネット**</font>  |
| 制御項目  | プロトコル（TCPやUDPなど）、ポート範囲、CIDR、<font color="Red">**セキュリティグループ**</font>  |  プロトコル、ポート範囲、CIDR |
| デフォルトの状態  | 全てのアクセスを拒否|  全てのアクセスを許可 |
| 状態（ステート）の保持  | ステートフル<br>（応答トラフィックはルールに関係なく許可）  | ステートレス<br>（応答トラフィックはルールを明示して許可  |
|  その他 | インスタンスには少なくとも1つのセキュリテイグループをアタッチする必要がある| －－－  |

# AWS Storage Gateway

| ゲートウェイタイプ| S3での保存単位 | プライマリデータの保存場所 |
|:-:|:-:|:-:|
| ファイル  | ファイル  |  S3 |||
| ボリューム<br>（キャッシュ型）  | ボリューム  | S3  |||
| ボリューム<br>（保管型）  |  ボリューム | ローカルディスク  |||
|  テープ | 仮想テープ  | ローカルディスク  |||

# 分析系？のAWSサービス

分析系？のAWSサービスの違いがよくわかっていないので、まとめてみる。

### Amazon Redshift
Redshiftは、データを<font color="Red">**標準SQL**</font>で分析可能な<font color="Red">**データウェアハウス**</font>向けのデータベースサービスです。データベースは、データの保存や編集など様々な機能を持ちますが、<font color="Red">**データウェアハウス**</font>はデータの分析に特化しています。

- S3に保存された大容量のデータをRedshiftを使用して分析できる

### Amazon EMR (Elastic MapReduce)
EMRは、<font color="Red">**分散処理フレームワーク**</font>です。

- Hadoop、Spark、Prestoなどの分散処理フレームワークをサポートする
- EMRは、マスターノード、コアノード、タスクノードの3種類のノードで構成される。コスト削減する場合、マスターノードとコアノードはオンデマンドインスタンス、タスクノードはスポットインスタンスを使用する
- EMRは、1秒ごとの請求

### Amazon Athena
Athenaは、S3内のデータに対し、標準SQLを実行して分析するクエリサービスです。

- RedshiftやEMRとの違いとして、AthenaはノードやEC2を<font color="Red">**持たない**</font>。S3内のデータを<font color="Red">**クイック**</font>に分析したいユースケースに向いている。Athenaは内部的にはPrestoを使用しているので、EMRでPrestoを使用した場合と同じような処理が可能です。

### Amazon QuickSight

QuickSightは、<font color="Red">**データ可視化サービス（BIサービス）**</font>です。

- データソースはS3、RDB、Redshift、Athenaなど

# 参考文献
- [AWS認定資格試験テキスト　AWS認定ソリューションアーキテクト - アソシエイト　改訂第2版](https://www.amazon.co.jp/dp/B08MVXRFFN/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1) 
- [改訂新版 徹底攻略 AWS認定 ソリューションアーキテクト − アソシエイト教科書［SAA-C02］対応 徹底攻略シリーズ](https://www.amazon.co.jp/dp/B08SGSD479/ref=sspa_dk_detail_1?psc=1p13NParams&spLa=ZW5jcnlwdGVkUXVhbGlmaWVyPUEzQkkyWUpZMUo2Qzg0JmVuY3J5cHRlZElkPUEwNjY4MTIzMzFSU0VDSko0MTIzJmVuY3J5cHRlZEFkSWQ9QUgwS0hIUjhTOVJZSyZ3aWRnZXROYW1lPXNwX2RldGFpbCZhY3Rpb249Y2xpY2tSZWRpcmVjdCZkb05vdExvZ0NsaWNrPXRydWU=)
- [AWS認定ソリューションアーキテクト－プロフェッショナル～試験特性から導き出した演習問題と詳細解説](https://www.amazon.co.jp/dp/B08F9CQ6LT/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)
【Spring Boot+JPA】レコードの作成・更新日時を扱う

Spring Bootを使ってTODOアプリを作成している際に日付の登録や表示で少し詰まったので記録。

# 環境
* Java 11
* Spring Boot 2.7.0
* Maven 4.0.0
* MySQL 8.0.23


# やりたいこと
Spring Data JPAを用いてEntityの保存時に自動で作成、更新日時が入るようにしたい

# MySQLの設定確認
* todos table
```
mysql> desc todos;
+--------------+--------------+------+-----+---------+----------------+
| Field        | Type         | Null | Key | Default | Extra          |
+--------------+--------------+------+-----+---------+----------------+
| id           | int          | NO   | PRI | NULL    | auto_increment |
| title        | varchar(100) | NO   |     | NULL    |                |
| content      | text         | NO   |     | NULL    |                |
| created_date | datetime     | NO   |     | NULL    |                |
| updated_date | datetime     | NO   |     | NULL    |                |
+--------------+--------------+------+-----+---------+----------------+
```
* time_zone
```
mysql> show variables like '%time_zone%';

+------------------+------------+
| Variable_name    | Value      |
+------------------+------------+
| system_time_zone | JST        |
| time_zone        | SYSTEM     |
+------------------+------------+
```

# Entityクラスの設定

```Todo.java
@Entity
@EntityListeners(AuditingEntityListener.class)
@Getter
@Setter
@Table(name="todos")
public class Todo {

    //一部省略
    
    @Column(name = "created_date",updatable = false)
    @CreatedDate
    private Date createdDate;

    @Column(name = "updated_date")
    @LastModifiedDate
    private Date updatedDate;
}
```
* `@EntityListeners(AuditingEntityListener.class)`：レコードの作成・更新時の情報設定を有効にする
* `@CreatedDate`：レコードの作成日時がフィールドに自動的に設定される
* `updatable = false`：こちら指定することで更新時にnullが入ってしまうのを防ぐ
* `@LastModifiedDate`：レコードの更新日時がフィールドに自動的に設定される

# Spring Bootの設定

  ```TodoApplication.java
  @SpringBootApplication
  @EnableJpaAuditing
  public class TodoApplication {

	public static void main(String[] args) {
		SpringApplication.run(TodoApplication.class, args);
	}

	@PostConstruct
	public void init(){
		TimeZone.setDefault(TimeZone.getTimeZone("JST"));
	}
  }
  ```
  * `@EnableJpaAuditing`：レコードの作成、更新時の情報設定を有効にする
  * `@PostConstruct`：Bean生成後の初期化
  * `TimeZone.setDefault(TimeZone.getTimeZone("JST"));`spring bootのタイムゾーンをJSTに設定（デフォルトはUCT）
  * アプリケーション全体としてのタイムゾーンを指定しているため、タイムゾーンの異なる複数のデータベースを扱う場合などは注意が必要

# application.yml
```application.yml
spring:
  datasource:
    url: jdbc:mysql://[ホスト名]:[ポート]/[データベース名]?connectionTimeZone=SERVER
    username:
    password: 
    driverClassName: com.mysql.cj.jdbc.Driver
```
  * `connectionTimeZone=SERVER`：日付登録時に、mysql側で設定されたタイムゾーンを指定
  * MySQL Connector/Jのバージョンに注意
  * 8.0.22以前だと`serverTimeZone=JST`で指定可能（[参考](https://dev.mysql.com/doc/relnotes/connector-j/8.0/en/news-8-0-23.html)）

# 画面側で表示
* thymeleaf
  * そのまま表示
    * `th:text="todo.createdDate"`
    * ex) 2022-07-04 19:33:12
  * フォーマット指定して表示
    * `th:text="${#dates.format(todo.updatedDate,'yyyy/MM/dd HH:mm')}"`
    * ex) 2022/07/04 19:33
NEXT.jsのチュートリアルをやってみた〜環境構築編〜

# はじめに
会社のTeckポータル開発で```NEXT.js```に触れる機会があったのですが、
0から開発したことなかったので、Next.jsのチュートリアルをやってみることにしました。
チュートリアルの学習備忘録です。


https://qiita.com/yoshii0110/items/88b50a72155988fea05e

# どのチュートリアル？
今回行うチュートリアルは、公式のNEXT.jsが公開しているチュートリアルです。

https://nextjs.org/

# Next.jsとは？

Next.jsとは、公式に下記のように記載があります。
> Next.js is a flexible React framework that gives you building blocks to create fast web applications.

Next.jsは、高速なWebアプリケーションを作成するためのビルディングブロックを提供する柔軟なReactフレームワークです。

# Next.jsの利点

利点について、公式に下記のように記載があります。
> - Code has to be bundled using a bundler like webpack and transformed using a compiler like Babel.
> - You need to do production optimizations such as code splitting.
> - You might want to statically pre-render some pages for performance and SEO. You might also want to use 
> server-side rendering or client-side rendering.
> - You might have to write some server-side code to connect your React app to your data store.
> A framework can solve these problems.

Next.jsを使うと、下記のようなメリットがあるみたいです。SEOに強いっていいですねー
- BabelやWebpackの環境設定を行う必要がない
- Code splittingのような最適化の必要がない
- パフォーマンス、SEOのためのサーバーサイドレンダリング、クライアントサイドレンダリングの問題を解決できる
- Reactアプリをデータストアに接続するための、サーバー側のコードを簡単に実装できる

https://nextjs.org/learn/basics/create-nextjs-app

# 環境構築してみよう
## Setup

NEXT.jsは、nodeのバージョンが10.13以上である必要があるため、versionを確認してみます。
> If you don’t have Node.js installed, install it from here. You’ll need Node.js version 10.13 or later.

```sh
$ node -v
v14.17.6
```

nodeのバージョンが10.13以上あったので次に進みます。

## Create a Next.js app

サンプルプロジェクトを下記のコマンドで作成します。

```sh
$ npx create-next-app nextjs-blog --use-npm --example "https://github.com/vercel/next-learn/tree/master/basics/learn-starter"
```

作成したプロジェクトに入り、実行してみます。

```sh
$ cd nextjs-blog
$ npm run dev
```

実行すると[http://localhost:3000/](http://localhost:3000/)でローカルでサーバー立ち上がります。
起動まで簡単ですね。



![FireShot Capture 109 - Create Next App - localhost.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95954/ed926955-3d76-ea10-7e3e-7705e7584131.png)


## Edit
試しに、```pages/index.js```を開いて、「Welcome to」を「Learn」に変更してみます。
```$ npm run dev```を実行した状態で保存すれば、自動的にコンパイルして画面変更してくれます。⇦地味に便利ですね。

> The Next.js development server has Fast Refresh enabled. When you make changes to files, Next.js automatically applies the changes in the browser almost instantly. No refresh needed! This will help you iterate on your app quickly.

![FireShot Capture 110 - Create Next App - localhost.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95954/909dec71-aba9-9dbc-79df-8e9e854f23ea.png)


# 終わりに
最初のレッスンはここまでです。次はナビゲーションやページ間の移動なので、学習したらまとめていこうと思います。



# 参考
https://nextjs.org/learn/foundations/about-nextjs?utm_source=next-site&utm_medium=homepage-cta&utm_campaign=next-website
RaspberryPiでLチカ（Dockerからsysfs経由） 

# やりたいこと

Dockerコンテナからsysfsを操作してLチカしたい。


# 手順


### 1.RaspberryPiOsのDockerイメージを作る

https://qiita.com/ryot0/items/3b40a0e5f227d97b7d3b


### 2.Dockerコンテナを特権モードで作る

```shell
docker create -it --name gpiosysfscont01 --privileged raspios:0.0.1 /bin/bash
docker start gpiosysfscont01
docker attach gpiosysfscont01
```

--privilegedオプションを付けると、特権コンテナになる。
つけないとsysfsがroでマウントされた状態になるので、コンテナ内からsysfsを操作できない。
本当は、--cap-addオプションでちゃんと権限を考慮する必要があるのだろうけど、sysfsをrwでマウントしてくれる特定の権限オプションは見つからなかった。


### 3.attachしたDockerコンテナからsysfsを操作する

https://qiita.com/ryot0/items/74a7d145e68ebf27669d
Nokogiriを使って絵文字unicodeとキーワードのJSONを作る

# はじめに
ふと、絵文字のunicodeと絵文字のキーワード（検索とか予測変換に使う単語）が組み合わさったJSONが欲しくなりました。
こんな感じのJSON
```JSON
[
  {
    "hex": "1F347",
    "annotations": [
      "ぶどう",
      "グレープ",
      "果物"
    ]
  },
  {
    "hex": "1F348",
    "annotations": [
      "メロン",
      "果物",
      "野菜"
    ]
  },
  {
    "hex": "1F349",
    "annotations": [
      "スイカ",
      "果物",
      "野菜"
    ]
  }
]
```

なのでNokogiriを使ってスクレイピングしてJSONを作りたいと思います。

# やること
スクレイピングする対象のサイトはUnicodeコンソーシアムの[CJK Annotations](https://unicode-org.github.io/cldr-staging/charts/latest/annotations/cjk.html)というHTMLページです。
このページはUnicodeコンソーシアムがこの絵文字を検索するときや予測変換で出すときはこの単語を使いましょう！という感じで定義してくれているものです。
絵文字、Unicode、そして絵文字を表す単語が英語、中国語、日本語、韓国語と表形式になっているのでUnicodeの列と日本語の列を取ってきてJSONにします。


# コード

```ruby
require 'nokogiri'
require 'open-uri'
require 'json'

def main
  doc = Nokogiri::HTML(URI.open('https://unicode-org.github.io/cldr-staging/charts/latest/annotations/cjk.html'))

  data_json = []
  trs = doc.css('.body tr')

  # テーブルの行でループ
  trs.each do |tr|
    hash = Hash.new([])
    td_element_ary = tr.children()

    # 行のカラムでループを回す
    td_element_ary.each do |td|
      # sourceをクラスで持っているカラムがHEXを持っているので値を取り出す。
      if td.classes.include?("source")
        hash[:hex] = td.children.pop.content
      end
    end

    # tdのclass名が同じなので日本語のカラムをインデックスで指定する
    # 中国語の翻訳がない行ではカラムが2少ない
    if td_element_ary.length == 7
      next if td_element_ary[5].children[1].nil?

      # [*, 太字アノテーション, <br>, 細字アノテーション]のようになっている
      # 後ろの細字のアノテーションをpopで取り出す
      str = td_element_ary[5].children.pop.content
      annotation_ary = mold(str)

      hash[:annotations] = [td_element_ary[5].children[1].content] + annotation_ary #太字 + 後ろのやつ
    elsif td_element_ary.length == 9
      next if td_element_ary[7].children[1].nil?

      # 後ろの細字のアノテーション
      str = td_element_ary[7].children.pop.content
      annotation_ary = mold(str)

      hash[:annotations] = [td_element_ary[7].children[1].content] + annotation_ary #太字 + 後ろのやつ
    else
      hash[:annotations] = ['hogehoge']
    end
    data_json.push(hash)
  end

  File.open("emoji-data.json", "w") do |file|
    JSON.dump(data_json, file)
  end
end

def mold(str)
  return [] if str.nil?

  #  "| ミクロ | 単位" こんな感じなので余分なところを取り除く
  str.split('| ').map(&:strip).reject(&:empty?)
end

main
```


## 終わりに
このスクリプトでほしい形でJSONを作ることができました。
完成した後に見つけたのですが,すでにいい感じのJSONがGithubに挙がっていました。
よく探したつもりだったのですが。。。
スクレイピングの経験になったのでよし。

- [いい感じのJSONのGithub](https://github.com/yagays/emoji-ja)
Ubuntu 20.04 に asdf をインストールする【asdf・zsh】

Ubuntu 20.04 にバージョン管理ツール [asdf](https://asdf-vm.com/) をインストールし、補完を有効にする方法を書いてみました。

# 概要
asdf はバージョン管理ツールです。Python や nodejs など複数の言語のバージョンを同一コマンドで管理できることが特徴です。
Mac では Homebrew でインストールでき（一応、Ubuntu でも Homebrew 使えるらしいですが…）、補完スクリプトも自動で追加してくれます。しかし、Ubuntu では apt にまだ対応しておらず、補完スクリプトも自分で追加しなければいけません。
本稿では、自分用の備忘録も兼ねて、asdf のインストール方法と補完スクリプトの追加方法を説明します。

# 環境
- Ubuntu 20.04
- zsh 5.8 (x86_64-ubuntu-linux-gnu)

# インストール
apt にはまだ対応していないようなので、[git](https://github.com/asdf-vm/asdf) から clone します。

```shell
# git から clone する（バージョンは 2022/07/4 現在）
$ git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.10.0

# .zshrc に以下を記述する
$ source $HOME/.asdf/asdf.sh
```

# 補完を有効にする
.zshrc に以下を記入する

```shell
# 補完を有効にする
autoload -Uz compinit
compinit

# asdf の zsh 用補完スクリプトを site-functions に追加する。
$ sudo ln -s $HOME/.asdf/completions/_asdf /usr/local/share/zsh/site-functions/_asdf
```
補完スクリプトを site-functions に追加する方法は、GitHub CLI などの補完にも使えます。
一方、公式サイトでは、~/.asdf/completions を fpath （zsh の補完スクリプトのパス）に追加する方法が示されていました。sudo 権限が必要ないという意味では、公式の方法がいいのかもしれません。
また、補完スクリプト専用のディレクトリを作成し fpath に追加する方法も有効だと考えられます。

<!--
-->
# 参考文献

[asdf](https://asdf-vm.com/) 
[まだ anyenv (**env) 使ってるの？ asdf を使おう！ - Zenn](https://zenn.dev/noraworld/articles/replace-anyenv-with-asdf)
【UIKit】画面遷移の方法

# StoryBoardで遷移
Controlを押しながらButtonをViewControllerにドラッグします。
![スクリーンショット 2022-07-04 19.47.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/565859a0-9ec4-33d8-c1ac-f57d0a542b7d.png)
Action Segueの中から遷移方法を選択します
![スクリーンショット 2022-07-04 19.47.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/e586f636-b928-0c18-fdff-08adb73bb5dd.png)

# コードで遷移
「Cocoa Touch Class」を選択して「Next」を押します。
![スクリーンショット 2022-07-04 20.19.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/eab670fd-4df4-192a-e696-d410f244ea5c.png)
Class名を決めます。
今回は「TestViewController」としました。
入力が完了したら「Next」を押します。
![スクリーンショット 2022-07-04 20.20.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/41cd84ca-e4bd-49ec-f263-0e26d5e8977e.png)
追加したViewControollerを「TestViewController」に紐付けます。
![スクリーンショット 2022-07-04 20.23.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/a90e50ab-ce39-e232-b6b1-53b23ddd88bc.png)
「TestViewController」を紐付けたViewControllerに「Stroyboard ID」を設定します。
今回は「TestView」としました。
![スクリーンショット 2022-07-04 20.25.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/6260f26f-beba-0eea-8dd9-7398819848ae.png)

Optionを押しながら「ViewController」を選択すると画像のように2画面表示になります。
Controlを押しながらButtonをViewControllerにドラッグします。
![スクリーンショット 2022-07-04 20.30.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/e32a4fcb-9407-6aab-f3d0-e2cf2f78261e.png)
以下の画像のように設定を行います。
Nameは「tapAction」としました
![スクリーンショット 2022-07-04 20.31.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/c3b2e92d-ef8b-50be-783d-e5ff0b4977e1.png)
tapActionを以下のように変更します。
```swift
@IBAction func tapAction(_ sender: Any) {
    let testViewController = self.storyboard?.instantiateViewController(withIdentifier: "TestView") as! TestViewController
    self.present(testViewController, animated: true, completion: nil)
}
```

![スクリーンショット 2022-07-04 21.57.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/913db611-2743-5b67-4faa-46d4e6146a16.png)

# おわり
UIKitは慣れていないので何か間違っているところがあるかも知れません笑
間違っている箇所があれば編集リクエストかコメントで教えてください。
maya read csv

```
import csv
import sys
import maya.cmds


path = "D:\\workspace\\td\\cpp_csv\\data\\in.csv"
file = open(path)
reader = csv.reader(file)

header = next(reader) #The first line
data = [row for row in reader]


# def rename_morph_targets( node_name, attr_dict, quiet = False ):
# 	# list to catch our failures	
# 	fail_list = [ ]

# 	# How many targets there are in the alias list
# 	number_of_targets = maya.cmds.getAttr( '{0}.weight'.format( node_name ), size = True )

# 	# Iterate through the weight list
# 	for index in range( 0, number_of_targets ):
# 		# Query the name of the current blendshape weight
# 		old_name = maya.cmds.aliasAttr( '{0}.weight[{1}]'.format( node_name, index ), query = True )

# 		# If the old name isn't in the attr_dict, we're going to pass on it.
# 		if old_name in attr_dict.keys( ):
# 			# We're going to rename
# 			new_name = attr_dict[ old_name ]
# 			print 'Found old name: ', index, new_name, old_name
			
# 			absolute_name = '{0}.weight[{1}]'.format( node_name, index )

# 			maya.cmds.aliasAttr( new_name, absolute_name ) # Re-aliasing / Renaming occurs here.
# 			if not quiet:
# 				print 'Changed {0} -> {1}'.format( old_name, new_name )
				
# 		# Add the failure to the fail list		
# 		else:
# 			fail_list.append( old_name )

# 	if fail_list:
# 		maya.cmds.warning( '{0} names were not changed. Check console for details'.format( len( fail_list ) ) )
# 		for name in fail_list:
# 			print name

# # example test
# # renaming function goes here to rename the one column to the other column



# print(header)
# print(data[0])

import maya.cmds as cmds

def setKeyframes():
    global data
    obj = cmds.ls(selection=True)[0]
    
    for d in data:
        if len(d) < 3: continue
        print(d[2])
        EyeBlinkLeft = float(d[2]*2-1)
        cmds.setKeyframe(obj + '.translateY', value=EyeBlinkLeft, time=d[0])

setKeyframes()
```
暗い画像をくっきり強化、しかも高画質対応、しかもかんたん、最新低照度強化モデルSCIをつかう

# 元の画像サイズのまま低照度画像を明るく強化したい
高速に高解像度の画像を明るくできるモデルがあればいいなあ、と。

<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/5427083d-fb39-35ca-338b-c92bd0685e28.jpeg width=400> <img src=https://user-images.githubusercontent.com/23278992/177157017-0280aaf3-d9a3-41fb-9fc5-ee4e5e0cdb25.png width=400>
# SCIが使える
Pythonでかんたんに使える画像強化モデルです。

# 使い方

リポジトリをクローンして、
画像フォルダのパスとトレーニング済みの重みパスを指定して、テストスクリプトを実行するだけです。

```shell
git clone https://github.com/vis-opt-group/SCI.git
cd SCI
python test.py --data_path data/mydata --model './weights/easy.pt'
```

重みは、リポジトリで
easy
medium
difficult
の３種類が提供されています。

結果はresultsフォルダに保存されます。

easy
<img src=https://user-images.githubusercontent.com/23278992/177157031-5f980aed-2da2-45df-9586-4472c3534c98.png width=400>

medium
<img src=https://user-images.githubusercontent.com/23278992/177157043-7cfda9c6-181b-47fd-a591-1a294c46b4b8.png width=400>

difficult
<img src=https://user-images.githubusercontent.com/23278992/177157017-0280aaf3-d9a3-41fb-9fc5-ee4e5e0cdb25.png width=400>

🐣
****
フリーランスエンジニアです。
お仕事のご相談こちらまで
rockyshikoku@gmail.com

Core MLやARKitを使ったアプリを作っています。
機械学習／AR関連の情報を発信しています。

[Twitter](https://twitter.com/JackdeS11)
[Medium](https://medium.com/@rockyshikoku)
[GitHub](https://github.com/john-rocky)
RaspberryPiでLチカ（/dev/gpiomem経由）

# やりたいこと

/dev/gpiomemを操作してLEDをチカチカさせます。
以下のページを参考にさせていただきました。
https://www.ei.tohoku.ac.jp/xkozima/lab/raspTutorial3.html

なるべくナイーブに実装して、GPIO4にLEDを繋いでチカチカさせます。


# ソースとか

### ソース
```C:main.c
//for printf
#include <stdio.h>
//for O_RDWR, O_SYNC
#include <fcntl.h>
//for mmap
#include <sys/mman.h>
//for sleep, open, close
#include <unistd.h>
//for uint32_t
#include <stdint.h>

#define PERI_BASE    0x20200000
#define BLOCK_SIZE   4096

int main() {

    printf("start\n");

    // ①/dev/gpiomemを開く
    int fd = open("/dev/gpiomem", O_RDWR | O_SYNC);
    if( fd == -1 ) {
        printf("cannot open device file\n");
        return 1; 
    }

    // ②物理アドレス 0x20200000 を仮想アドレスにマッピング
    void *gpiomem = mmap(NULL, BLOCK_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, PERI_BASE);
    if( (long)gpiomem == -1 ) {
        printf("cannot mmap gpio mem\n");
        return 1;
    } 
    close(fd);
    volatile uint32_t *gpio = (uint32_t*)gpiomem; 

    // ③GPIO4に対応するGPFSELのビット列（3bit）を出力（0b001）に設定
    gpio[0]  = 0b00000000000000000001000000000000;
    for(int i = 0; i < 10; ++i) {
        // ④GPIO4に対応するGPSETを1にする（Highを出力）
        gpio[7]  = 0b00000000000000000000000000010000;
        sleep(1);
        // ⑤GPIO4に対応するGPCLRを1にする（Lowを出力）
        gpio[10] = 0b00000000000000000000000000010000;
        sleep(1);
    }

    printf("end\n");

    return 0;
}
```

### コンパイル

```shell
gcc main.c
```

### 実行

```shell
./a.out
```


# 解説

### ①/dev/gpiomemを開く

物理メモリの特定のアドレスに特定の値を書き込むとそれがGPIOへの命令と解釈されて、GPIOを操作することができます。
Linuxのプロセスからメモリは通常、仮想メモリとしてしか見えません。物理メモリの特定のアドレスにアクセスするためにLinuxは物理メモリへのアクセス経路としてデバイスファイルの/dev/memを用意してくれています。このファイルの先頭が0x00000000の物理アドレスに対応していて、このファイルの特定のアドレスにwirteしてあげると、物理メモリの対応するアドレスに書き込まれます。
通常、この/dev/memはroot所有になっているので通常ユーザからはアクセスできません。RaspberryPiOSでは通常ユーザから物理メモリへアクセスできるようにするため、同じ意味合いの/dev/gpiomemを用意してくれています。
おそらく、/dev/memと/dev/gpiomemは同じもので権限が異なるだけだと思われます。

### ②物理アドレス 0x20200000 を仮想アドレスにマッピング

Linuxにはファイルのread/writeをメモリへのread/writeに対応させるmmapというシステムコールが用意されてます。
これを/dev/gpiomemに対して呼び出して、仮想メモリ上に/dev/gpiomemの内容を展開するイメージです。
GPIOへの命令は0x20200000以降のアドレスに書き込むので、0x20200000からmmapします。

### ③GPIO4に対応するGPFSELのビット列（3bit）を出力（0b001）に設定

gpip[0]〜gpio[3]の各ビットがGPIOピンごとの3bitのGPFSELという命令に対応しています。
"出力"とか"入力"などのどういうふうにGPIOを使うかの設定を行うことができます。
今回は、GPIO4を出力ピンとして使用したいので、対応するビットに0b001を書き込みます。

### ④GPIO4に対応するGPSETを1にする（Highを出力）

gpio[7]の各ビットがGPIOピンごとのHigh出力命令に対応しています。
ここでは、GPIO4にHighを出力するので、対応するビットに0b1を書き込みます。

### ⑤GPIO4に対応するGPCLRを1にする（Lowを出力）

gpio[10]の各ビットがGPIOピンごとのLow出力命令に対応しています。
ここでは、GPIO4にLowを出力するので、対応するビットに0b1を書き込みます。
チームでの新規サービス開発で大事なこと

うっす、豚野郎です。

今回はチーム開発で大事だったこと・新規サービス開発で大事だと感じたことを、
社会人5年目の目線で書いていきます。

※ 以下の内容は状況にもよることを理解して頂きたいです。


# 1. ある程度は指示されなくても動く
仕事において「指示されたことをできるようにする」という期間は、
社会人3年目までは許されます。（どこかの本に書いてありました）

例えば、誰かと連携しなければならない機能があったら指示されなくてもやるなど、
「指示された先をやる」ということが大事だと思います。

その「ある程度」は難しいラインだと個人的に思っているので、
それはコミニュケーション(3)で上長の性格を理解して柔軟に動きましょう。


# 2. リリースのスピード重視
豚野郎のいた現場ではスピード重視で、
サービスを短い期間で開発してリリースすることになっていました。
その結果、全員のコードの書き方がバラバラになってしまいました。
PMは「リリースした後にリファクタリングする」と言っていました。

なぜ急ぐのか？と最初は思いましたが、
時代に置いていかれる前にサービスはなるべく早くリリースされた方がいいと思いました。
そう考えると多少残業しても動く物を早く作って、早くリリースした方がいいと感じました。

リファクタリングや管理画面の開発は後でもできます。


# 3. コミニュケーション
ここでいうコミニュケーションは「酒の場のパリピ能力」の話ではありません。

現場のPMに恵まれたため、よくお昼ご飯に誘ってくださってました。
内容は下らないことでもいいので(「趣味は？」など)、そういうところで話しをすると
仕事の中でも自然とコミニュケーションが取りやすくなります。

コロナウイルスが流行ってから、それは難しいですが、
上に立つ場合が来たら心がける必要があると思いました。
Laravel8 .envの値を使う注意点

おっす、豚野郎です。

.envで設定した値をconfigを経由しないで取得する方法と、
configを経由して使う方法で取得する内容をサンプルコードと一緒に書いていきます。


# 1. configを経由しないパターン
以下のパターンで、envファイルに書かれた値は取得が可能です。
```.env
TEST_ENV=TEST
```

```routes/web.php
<?php

use Illuminate\Support\Facades\Route;
use App\Http\Controllers\ConfigController;

/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/

Route::get('/', [ConfigController::class, 'index']);
```

```app/Http/Controllers/ConfigController.php
<?php

namespace App\Http\Controllers;

class ConfigController extends Controller
{
    // フォーム
    public function index() {
        $env = env('TEST_ENV');
        dd($env);
    }
}
```

結果
```
"TEST"
```


# 2. configを経由する方法
```config/envConfig.php
<?php
return [
    'test_env' => env('TEST_ENV'),
];
```

```app/Http/Controllers/ConfigController.php
<?php

namespace App\Http\Controllers;

class ConfigController extends Controller
{
    // フォーム
    public function index() {
        $env = config('envConfig.test_env');
        dd($env);
    }
}

```

※ 他は同じです。

結果
```
"TEST"
```


# 3. なぜconfigを経由するのか？
以下のサイト参照
https://hiroto-k.hatenablog.com/entry/2018/03/28/213000
「本番環境でconfig:cacheコマンドを実行した際、.envファイルを読み込まないから。」

これはどういうことなのか書いていきます。
```
php artisan config:cache
```
こちらのコマンドは、configの読み込みを早くするキャッシュを作成するコマンドです。

そして、.envが読み込まなくなります。
以下参考
https://qiita.com/tatsuya_1995/items/c53f2fcb468b9cd27eb9

このコマンドを実行した後の1の結果は以下です。

結果
```
null
```

安易にconfig:cacheは使わない方がいいという記事も見ましたが、その通りかもしれません。

個人的な安全策は2のconfigを通して取得するのがいいかなと思います。
RaspberryPiでLチカ（shellからsysfs経由）

# やりたいこと

Shell ScriptからSysfsを叩いてLチカします。
今回はGPIO4を操作します。

# 手順

### 1.GPIO4を有効にします

```shell
cd /sys/class/gpio
echo 4 > export
```


### 2.上のコマンドの結果、gpio4というディレクトリができる

```shell
cd /sys/class/gpio/gpio4
```


### 3.directionを出力に設定します

```shell
echo out > direction
```


### 4.Highを出力します

```shell
echo 1 > value
```

これでLEDが点灯します。


### 5.Lowを出力します。

```shell
echo 0 > value
```

これでLEDが消灯します。


### 6.あとしまつ

```shell
cd /sys/class/gpio/
echo 4 > unexport
```

これでgpio4ディレクトリがなくなります。
[Rails]Gem: redis-mutex

# 前提
- 排他制御: 同時処理を防ぐ仕組み(参考: https://wa3.i-3-i.info/word11316.html)で、セマフォで実現。
- セマフォ: 同時処理可能なプログラム数を管理する仕組み(参考: https://wa3.i-3-i.info/word13357.html)
- ミューテックス: 0~1しかないセマフォで、デッドロックを防止する仕組みが組みこまれているもの(参考: https://wa3.i-3-i.info/word13360.html)。排他制御で使われる。
- ブロッキング・ノンブロッキング: ざっくりとは同期処理・非同期処理のこと。

# 概要 [gem「redis-mutex」](https://github.com/kenn/redis-mutex)
Redisを使ったRubyでのミューテックス。
同期処理・非同期処理ともにサポート。
例えば以下のように使う。
```
  # [引数]
  #  - lock_name: ロック名
  def sample_process(lock_name)
    # ロック名「lock_name」のロック状態を獲得しようとし、獲得できたらブロック内の処理を実行。設定時間内に獲得できなかったら例外を返す
    RedisMutex.with_lock(lock_name) do 
      # <ロック状態を獲得できたときにさせたい処理>
    end
  rescue RedisMutex::LockError
    # <ロック状態を獲得できなかったときにさせたい処理>
  end
```
ロック状態の獲得試行に際し、デフォルトでは以下の設定になっている。
- ロック状態が解放されるまで待てる最大の時間は1秒で、0.1秒ごとにロック状態が解放されたかを確認
- 1処理のロック状態は最大10秒で期限切れ(例外発生しちゃったりとかで元々ロックを保持していた処理がロックを解放しなかったときへの対応。このとき、元々ロックを保持していた処理がっもし続いているならばそのまま進むっぽいぞ・・・ソース見た感じ)


通常10秒以内にロック対象の処理は終わって、ロック解放されるっしょ！解放されてないってことは、例外発生して元々ロックを保持してた処理が死んでるってことっしょ！という前提で実装されてる気がする。

処理が死んでなくて10秒以上経過するようなケースがありうるならば、別途対応しないといけなさそう。
新卒エンジニアが『エンジニアの知的生産術』を読んで

# はじめに
そろそろ研修が終わる金融系の新卒SEです。
本業ではJavaの開発研修中ですが、
最近は個人開発のためにGraphqlやHasuraを勉強しております。

さて、
「文系の自分がエンジニアになる＝たくさんの勉強が必要になる」
これは頭ではわかっているけど、いざ生活に大量の学習を落とし込むのは非常に難しいなと、
最近実感しております。

そんな中でエンジニアは、どのように学習していけばいいのかを指南してくれる本を探しており、
そしてこの本を買いました。

[エンジニアの知的生産術――効率的に学び，整理し，アウトプットする](https://gihyo.jp/book/2018/978-4-7741-9876-7)

# 読んでみての感想
大学時代からビジネス書やライフハック、勉強法などを調べてきました。
それこそ、ジャンルを横断して年100冊を超える読書をしてきました。

しかしこの本を読んだ後は、
<b>「学習関係の本ってこの1冊だけ読めばよくね？？」</b>ということをまずはじめに思いました。
それぐらいよくまとまっておりました。

この本の対象者：
エンジニアをはじめとする全ての学習愛好家

# 新しいことを学ぶ
新しいことを学ぶためには土台が必要。
この当たり前な考え、実は忘れ去られているように思えます。

例えば、何かプログラミング言語を学ぶにもQiitaやzennの記事に頼ったりしていませんか？
それが悪いことだとはもちろん思いません。しかしそれらの記事の土台になりそうな情報（公式ドキュメントなど）へのアクセスが、
ないがしろになってしまうことは避けていきたいですね。

また、ゴールは具体的かつ明確、定量的に設定することが大事ですね。
組織のフレームワークである「SMART」が役に立ちます
>Specific…具体的に（より詳細な目標）
Measurable…測定可能に（定量的、数字を盛り込む）
Assignable…誰が実行するかが明確
Realistic…現実的に達成可能か（例えば空を飛ぶとか右腕から火を出すとかは無理ですもんね、、、）
Time-related…いつ達成するかが明確である

そして学ぶ目的も明確にしましょう。
例えば、Pythonという言語を学んだ先には様々なライブラリやフレームワークを扱うことを求められます。
（Django,Selenium,Pandas,etc...）

全て一気に学ぶのは難しいため、「なぜ自分はこれを学びたいのか、学ぶ必要があるのか」を明確にしていきましょう。
仮に「web applicationを作りたい」という理由だけだったら、そもそもPythonじゃなくてもできますしね。

# 少なく切り分ける
「因数は分割せよ」
かの著名哲学者デカルト氏の有名な考え方です。

考えなしにプログラミング言語を身につけるという大きすぎる目標を果たそうとするのは、
非常に骨の折れる作業になります。
ですので、マイルストーンを置いて着実に一つずつこなしていく事が大事になります（本書では休憩所と表していました）。

また、目標だけではなく作業やタスクも切り分けましょう。
有名な研究でも、短時間作業×短時間休憩で作業をすることで、効率を落とさず作業をすることができるとあります。
ですので、「ポモドーロテクニック」や「小学校の授業リズム」などを取り入れていきましょう。

# 読書は手段である
ついつい見落としてしまうのは、「読書は手段である」ということです。

僕も、ボーナスで技術書を積読していい気になっていましたが、ハッとさせられました。
読むことで知識を身に着けて活用することが本質的な目的です。
ですので、それを活用する機会を自分で作り出すのが大事だと思いました。

もちろんQiitaに書くことや、Notionにまとめたり、手元のメモにアクションプランを書くなど、
より「アウトプット」をすぐにやることが大事だと感じました。

# 終わりに
技術用語が少なかったり、かなり著名な方法論がまとめてあったりと、
文系卒IT業界ビギナーの自分でも読みやすかったです。

つよつよエンジニアの方は一度、学習効率の見直しとして、
そうでない人も学ぶことについて考える機会にいかがでしょうか？
STS環境構築

## 環境
|項目|バージョン|
|----|----|
|OS|Windows10|
|STS|4.15.1|

## STSをダウンロード～起動
1. 下記から使用しているOSの「Spring Tools 4 for Eclipse」を押下する。
https://spring.io/tools

1. ダウンロードしたjarファイルをダブルクリック、あるいはコマンドプロンプトで下記を実行し、STSを展開する。
    1. ```sh:commond
        java -jar {ダウンロードしたjarファイル}
        # ex) java -jar ./spring-tool-suite-4-4.15.1.RELEASE-e4.24.0-win32.win32.x86_64.self-extracting.jar

1. 展開したフォルダは適当なフォルダに格納する。
1. 「SpringToolSuite4.exe」を実行する。

## STSを日本語化
2. 下記の「Pleiades プラグイン・ダウンロード」から使用しているOSを押下する。
https://mergedoc.osdn.jp/
2. zipファイルを展開する。
2. 「setup.exe」を実行する。
2. 「日本語化するアプリケーション」でSTSの「SpringToolSuite4.exe」を選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2637688/bd41d6e2-195b-a2e5-789b-d8a9badc5b7d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2637688/05592d4d-fe28-0fa2-896b-f5bc5b61919c.png)
2. 「日本語化する」を押下する。
2. STSを起動する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2637688/b030ef44-aa32-5cc6-f5a2-79356544ad87.png)

## STSの設定
(作成中)
Windowsイベントログをファイルに出力する手順

ここではWindows11のイベントビューアーから「システム」ログを取得する手順を紹介します。

## 手順
### イベントビューアを開く
スタートボタンを右クリックしてイベントビューアーをクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35364/3d786b35-4d4d-70be-5d97-ce293eea0833.png)

### イベントビューアーが開いたら…
左ペインから「システム」を選択して、右ペインの「すべてのイベントを名前をつけて保存」をクリックします

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35364/5b3b7bb9-9b8b-c9d5-f952-7f19fd8cd755.png)

「名前をつけて保存」ダイアログで、ファイル名を入力して保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35364/98cc3248-1eea-d39b-0eb9-4c57dc4e51d1.png)

表示情報は「表示情報なし」を選択して、OKをクリックします

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35364/70f9c4b4-d769-d5ac-c442-ccc1fe414d73.png)


以上でイベントログをファイルに出力することができました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35364/4309d639-1328-5a0a-faa2-9e251b2a6ba3.png)