OmniAICreator/Qiita-1.07M huggingface dataset:
【AWS】EC2インスタンスの一覧をCSVで取得する方法


# 手順
実行するIAMユーザーのポリシーに`AWS CloudShell`の実行権限がついていることを確認
（権限さえあれば良いので、IAMロールにポリシーをアタッチしてもOK。）



今回取得するCSVの内容は、以下の通り。
`ec2-info.csv`というファイル名でダウンロードされます。

aws cliのコマンド内容を変えるだけで他の項目も取得できるので、各々の目的に合わせてご自由にカスタマイズをどうぞ。

| Name | インスタンスid | インスタンスタイプ | 起動状態 | 起動日時 |
|:-:|:-:|:-:|:-:|:-:|
|   |   |   |   |   |


以下`aws cli コマンド`の内容をcloud shellにペースト

```shell:cloud shell
aws ec2 describe-instances \
    --query "Reservations[].Instances[].{InstanceId:InstanceId, InstanceType:InstanceType, State:State.Name, Name: Tags[?Key==\`Name\`].Value, LaunchTime:LaunchTime}" \
    --output json | 
    jq -r ".[] | [.Name[0], .InstanceId, .InstanceType, .State, .LaunchTime] | @csv" > ec2-info.csv

```
ペーストすると、こんな感じの画面になる
![スクリーンショット 2022-08-01 15.31.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669969/87b0c839-4989-3971-8b78-545d07c54968.png)

実行し、`Download file`を選択

![スクリーンショット 2022-08-01 15.37.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669969/db1b74b9-ac99-bbd6-ff37-d20e991ef673.png)

ファイル名を指定して、ダウンロード完了

![スクリーンショット 2022-08-01 15.38.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669969/50d77901-f3ae-ab3f-e75b-e427b2f71086.png)


# おまけ
## AMIの一覧を取得

```sh:cloud shell
# ①Tags：Name以外の項目を取得
aws ec2 describe-images --owners 202839892755 --query 'reverse(sort_by(Images, &CreationDate))[].[Name,ImageId, CreationDate]' --output table

# ②Tags：Nameの項目を取得
aws ec2 describe-images --owners 202839892755 --query 'reverse(sort_by(Images, &CreationDate))[].Tags[?Key==`Name`].Value' --output text

# スプレッドシートで①②を結合

```

## EBS一覧を取得
```sh:cloud shell
aws ec2 describe-volumes \
--query "Volumes[].{Name: Tags[?Key==\`Name\`].Value,VolumeId:VolumeId,Size:Size,State:State,VolumeType:VolumeType,CreateTime:CreateTime}" \
--output json　|
jq -r ".[]| [.Name[0],.VolumeId,.VolumeType,.Size,.State,.CreateTime]|@csv" > test.csv

```






# 参考

https://graff-it-i.com/2021/12/26/info-to-spreadsheet/

https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-images.html

https://aoilo.blue/old-ami-find/

https://blog.serverworks.co.jp/aws-cli-query#--query%E3%81%AE%E8%A7%A3%E8%AA%AC

https://www.cloudnotes.tech/entry/awscli-csv#EBS
【Tips】Auth0でSMS認証を利用する際のおすすめDatadog設定

# 想定読者
本記事の想定読者は、Auth0とDatadogを利用されている方向けの
記事になります。

# 背景
[こちら](https://qiita.com/elephantt/items/2e0e47875e59ccde1fab)の記事でも少し触れた通り、Auth0は簡単に2要素認証が利用出来ます。

実際にSMSを用いた2要素認証を運用に回してみると、ユーザ側の環境や設定、
通信会社の障害などによりログインが出来ず、かつ通常のログ監視では
検知出来ないことがありました。

Auth0側のエラーログだけでは認識しづらい内容も、
DatadogのDashbordやMonitorsの機能を使うことで素早く検知し、
個別利用者に連絡することで出来たので、紹介させて頂きます。

# 概要
①実際の運用で起きた、Auth0のログで検知しづらい問題とは？
②Datadogを用いたオススメ設定！

# 実際の運用で起きた、Auth0のログで確認しづらい問題とは？
Auth0では、Twilioなどを利用したSMS認証が利用可能です。
非常に便利ですが、SMSは受信側や、途中の通信業者側の状況により上手く送信出来ないケースがありました。
さらに、Auth0側の処理は問題なく完了しているため、単純にエラーログだけを監視していても検知出来ず、
しばしばユーザから問い合わせがきておりました。

SMSが届かない原因
　①「国外からのSMSの受信拒否設定」をオンにしている
　②送信側や受信側のキャリアで通信障害が発生している
　③送信先の電話番号が間違えている

①や③については、SMS送信をしているtwilioの方や一部Auth0にはエラーが出力されますが、
②についてtwilio側でもエラーにはなりません。

そこで、**送信失敗のログではなく、Datadogを用いて同じユーザがSMSを複数回送信されていることを
確認することで、送信失敗を検知する仕組みを作りました。**

# Datadogを用いたオススメ設定！
同じユーザがSMSを複数回送信されていることを確認する設定です。
```@data.type:gd_send_sms```をuser_id ごとに集計し、
出力しています。
### Dashbord
![スクリーンショット 2022-08-01 20.00.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626560/2d8e46ed-e28b-8ef4-c732-12ab01818ade.png)
### Monitor
![スクリーンショット 2022-08-01 20.05.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626560/ecffe65f-3022-a6d4-6938-b0626ba59add.png)
# 最後に
今回のようなピンポイントなTipsについても今後も発信していきたいと思います。
listの展開(アンパック)

pythonを学ぶと、*を使った文法が出てきた。
アスタリスクで調べると、ワイルドカード扱いになるため少し時間を要した。

```python
list = [1,2,3,4,5]

print(*list)
# ->1 2 3 4 5
```

リストに*を与えると、展開する(アンパック)する見たいです。

辞書も展開することができるみたいです。

```python
dict = {'arg1': 'one', 'arg2': 'two', 'arg3': 'three'}
print(*dict)
# ->arg1 arg2 arg3

※print関数では、`TypeError: 'arg1' is an invalid keyword argument for print()`が出てくるので
関数の引数に与えてあげるといけるぽい

from rich.console import Console
def func_default(arg1=1,arg2=2,arg3=3):
    print('arg1=',arg1)
    print('arg2=',arg2)
    print('arg3=',arg3)
    
  console = Console()
  dict = {'arg1': 'one', 'arg2': 'two', 'arg3': 'three'}
  func_default(**dict)
  #->arg1= one
  #  arg2= two
  #  arg3= three

```

dictはあんまり使いどころないんじゃないのかな？

参考：
https://note.nkmk.me/python-argument-expand/

https://tksmml.hatenablog.com/entry/2019/05/02/000000
jQuery AJAXでJSON取得

jQueryを使ったAJAX通信でのJSON取得

## コード例
```javascript
// JSONで通信する場合、WebAPI側は クロスサイトスクリプティングへの事前対応が必要
$.ajax({
    type: "GET",
    url: 'https://WebAPIサーバ名もしくはIPアドレス:ポート/ディレクトリ',
    dataType: "json"
})
.done(function(json){
    console.log(json);
})
.fail(function(){
    console.log("ajax fail");
});
```

## 元データ
|id|name|
|--|----|
|1|taro|
|2|john|
|3|patrick|
|4|pierre|
|5|abele|
|6|wei|

## 実行結果
```json
[{id: 1, name: "taro"}, {id: 2, name: "john"}, {id: 3, name: "patrick"}, {id: 4, name: "pierre"}, {id: 5, name: "abele"}, {id: 6, name: "wei"}] (6) (localhost, line 90)
```

## 関連ページ
[ASP.NET Core Minimal API で EntityFramework を使った PostgreSQL Restful API](https://qiita.com/n4a/items/460580b9fc384715d26f)
jQuery JSON取り回し

フロントエンド側でのJSON取り回しサンプル

```javascript
// JSONデータを定義
const jsonSample = [
    { "name": "john", "age": "28", "country": "united states" },
    { "name": "pierre", "age": "25", "country": "france" },
    { "name": "wang", "age": "37", "country": "china" }
];
console.log("original object: ", jsonSample);

// JSON要素を追加
jsonSample.push({"name": "patrick", "age": "33", "country": "united kingdom"})
console.log("pushed: ", jsonSample);

// JSON要素を削除
// 先頭から削除
jsonSample.shift();
// 末尾から削除
jsonSample.pop();
console.log("popped: ", jsonSample);

// JSONデータのフィルタリング
var jsonFiltered = jsonSample.filter(function (j){
    return j.country != "china";
});
console.log("filtered by country is not 'china': ", jsonFiltered);

// JSONプロパティの削除
var jsonSlimed = jsonFiltered;
for(let i = 0; i < jsonSlimed.length; i++){ delete jsonSlimed[i].age; }
console.log("property age deleted: ", jsonSlimed);
```
DB設計を改修する~Model編~

# はじめに
Q&Aアプリを作成しています。DB設計で改修が必要になったので記事にしました。
今回はモデルの関連付けを解消します。

## 改修前のDB設計
![Qiita構想前.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2485354/c54664f0-4379-4035-d530-95e76f5f6b9a.png)
![msg.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2485354/4527a299-5f52-72de-6827-095fe090a7fe.jpeg)

【解答】
質問(Question)に対して、最初に投稿(アソシエーション)されたCommentのオブジェクト
【コメント】
解答に対して、投稿(アソシエーション)されたCommentのオブジェクト

**ややこしい!**

## 改修後のDB設計(予定)
![Qiita構想後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2485354/39cf8e50-cd62-270d-3c7a-6e68c77d3ffe.png)
解答をAnswerテーブル、コメントをCommentテーブルに分けます。
こちらの方が管理しやすいコードだと思います。特定の質問の解答やコメントを取得するのも簡単です。
Answerテーブルで解答機能を実装できるまで、UserテーブルとQuestionテーブルはCommentテーブルの関連付けを解消します。

# 関連付けを解消する前に
<br>

開発環境のDBにCommentのオブジェクトがあるのでリセットします。
```bash
rails db:migrate:reset
```
<br>
<br>

Commentのサンプルデータは不要なので削除します。(この記事ではコメントアウト)
```rb:db/seeds.rb
# other = User.last
# questions = User.first.questions.order(:created_at).take(6)
# 5.times do
#   user_id = other.id
#   content = Faker::Lorem.sentence(word_count: 3)
#   questions.each { |question| question.comments.create!(user_id: other.id,
#                                                         content: content) }
# end
```
<br>
<br>

データを投入します。Commentのデータが生成されていないことを確認できました。
```bash
rails db:seed
```
<br>

# 関連付けの解消
### has_many
あるUserとCommentはhas_many(1対多)の関係性
あるQuestionとCommentはhas_many(1対多)の関係性　　
has_manyをコメントアウトにします。
```rb:app/models/user.rb
class User < ApplicationRecord
    has_many :questions, dependent: :destroy
  # has_many :comments,  dependent: :destroy
end
```
```rb:app/models/question.rb
class Question < ApplicationRecord
  # has_many   :comments, dependent: :destroy
end
```


### belongs_to
あるCommentはUserとbelongs_to（1対1）の関係性
あるCommentはQuestionとbelongs_to（1対1）の関係性
belongs_toをコメントアウトにします。関連付けのバリデーションも不要です。
```rb:app/models/comment.rb
class Comment < ApplicationRecord
#   belongs_to :user
#   belongs_to :question

#   validates(
#           :user_id,
#           presence: true
#   )

#   validates(
#           :question_id,
#           presence: true
#   )
end
```
<br>

### テスト
これで関連付けは解消されました。(既存の)テストで確認してみます。
```rb:
require 'rails_helper'

RSpec.describe Comment, type: :model do
  let(:other)    { FactoryBot.create(:user) }
  let(:question) { FactoryBot.create(:question) }
  let(:comment)  { question.comments.build(user_id: other.id,
                                           content: "Example content")}
  it "有効であること" do
    expect(comment).to be_valid
  end
end
```
 <br>

テストを実行。ちゃんと失敗しました。関連メソッドが使えないようになりました。
無事、関連付けが解消できました!!!
```bash
NoMethodError:
       undefined method `comments' for #<Question id: 3131, ~~~~
```

# あとがき
DB設計は本当に大切だと認識させられました！アプリ開発がまだ序盤の方で助かりました
あと、テストはできる限り先に書きましょう！テストが無いと、他のDBデータや機能に影響が出てしまっていないか確認するのが困難になります。(先に書いてて良かった.....)　　
これからルーティング、コントローラ、ビューを改修していきます。これらについても記事にしていく予定です。
備忘録 blender単語編

# 備忘録 blender単語編
意味がいまいち分からなかった単語集です。
随時更新
***

|英語(単数)|英語(複数)|意味|
|:---:|:---:|:---:|
|Vertex|Verteces|頂点|
|Edge|Edges|辺|
|Face|Faces|面|

***
## メッシュとオブジェクト
- オブジェクトは3Dモデルの位置・回転・大きさを定義するもの
オブジェクトに対してできる操作は位置を移動したり回転させたりなどだけで常に`相似の関係`が成り立つ
- メッシュは3Dモデルの頂点・辺・面を定義するもの
メッシュに対して行える操作はモデルの形状が変わる
***
### モディファイア
オブジェクトのメッシュ構造に手を入れずに、様々な装飾を施すための機能
モディファイアを解除するだけで戻せる非破壊的操作のこと

***
参考にさせていただいたサイト
https://czpanel.com/lecture/blender/basic/modeling/
https://sciencecontents.hatenablog.com/entry/438392786.html
Spring BootでNo qualifying bean of typeが発生した場合

# 事象
普段、kotlinでSpring Bootを使って開発しています。
そこで、新しいクラスを作成してJUnitでテストをすると以下のエラーが発生しました。（エラー内容をメモしてなかったのでごく一部になります）
```
No qualifying bean of type ...
```
どうやら、「BeanFactory(というSpringのDIコンテナとして中心的な役割を果たすクラス)が、定義が見つからないインスタンスの要求を受けた時にこの例外が投げられるらしいです。
参考：https://qiita.com/NagaokaKenichi/items/058a7243bd2948de7553

# 原因
## その1：アノテーションがついてない
対象クラス（今回は新しく作成したクラス）にアノテーションがついてないため、エラーとなりました。

以下のようなアノテーションを状況に応じて追加するとよさそうです。

`@Component`
`@Controller`
`@Service`
`@Repository`

## その2：パッケージ構成
起点となるパッケージの管理下に対象クラスが存在しないため、エラーとなりました。
```
@ComponentScan(
    basePackages = [
        ...
    ],
    excludeFilters = [
        ComponentScan.Filter(
            ComponentScan.Filter(
            type = FilterType.ASSIGNABLE_TYPE,
            classes = [
                ...
            
            classes = [
                ...
            ]
        )
    ]
)
```
起点となるパッケージのクラスに上記の、`basePackages`に対象にしたいパッケージを追加するとよさそうです。
しかし、追加したパッケージのクラスの一部に管理外のクラスがあるとDIできないため、そういう場合は`excludeFilters`に対象外にしたいクラスを記述するとよさそうです。記入例：`SampleClass::class`

# まとめ
他にも原因があると思いますが、とりあえず自分の環境で発生したパターンは以上になります。
Homebrewとは

# 何となく使っていたHomebrewを完全に理解する
Homebrew・・・ソフトウェアパッケージ管理システム
パッケージのインストール（アンインストール）作業を一元管理。Homebrewを使うとパッケージやライブラリの依存関係を解決できる。

このサイトに記述されているコマンドを叩くとインストールできる
https://brew.sh/index_ja

インストールできたかどうかは以下のコマンドで確認できる。
```
 brew -v 
///(出力例)Homebrew 3.5.6
```

# 代表的なコマンド一覧
インストールの確認ができたら、brewコマンドが使える
## パッケージのインストール
```
brew install <パッケージ名>
```
## パッケージのアンインストール
```
brew remove <パッケージ名>
```
## インストールされているパッケージ一覧
```
brew list
```
## パッケージのバージョンをアップグレード
```
brew upgrade
#全てのパッケージのアップグレード

brew upgrade <パッケージ名>
#個別のパッケージをアップグレード
```

### これらのコマンドを使用して、fish,ffmpeg,nodebrewなどのパッケージを管理できる

# Homebrewでインストールされたパッケージはどこに保存されるのか
コマンド自体は、 /usr/local/Cellar
コマンドのエイリアス（本体ファイルと同じ役割を果たすショートカットのようなもの）は、/usr/local/bin

# PATHを通すとは
PATHとは環境変数の一つ。
PATHを通すと、実行ファイル名を指定するだけで実行できるようになる。
イメージしやすいサイトはこちら
https://wa3.i-3-i.info/word18471.html

PATHを通すとは、実行ファイル名を叩くだけで実行できるように、PATHという環境変数に新しいパスを追加するということ。
あたらしいPATHを追加したいときは~/.zshrcなどの設定ファイルに追記する
```
export PATH=$PATH：<追加したいPATH>
```

# 余談
## homebrew-caskとは
brewコマンドでインストールできるのは、CLIのパッケージのみでしたが、homebrew-caskを使うとGUIのパッケージ（GoogleChromeなど）をインストールできる
```
brew cask install <パッケージ名>
```
## brewとnpmの違いは？
brew ・・・ソフトウェアのインストール、つまりwgetなどのアプリケーションに使用する機能
npm・・・パッケージ（ライブラリ）のインストール。つまり独自のアプリケーションの構築を支援する機能
Apigee X と Apigee Edgeの違い

## Apigee X と Apigee Edgeの違い
- 2012年にローンチされたときの名前が Apigee Edge
- 2020年11月に刷新されて新しくついた名前が Apigee X
- 基本的な違いは、Apigee Edge はもう新規契約はできないが、Apigee X は今も契約ができる


## 参考
以下を参考にしました。
https://nissangroup.sharepoint.com/teams/JAO_NML_06_004036_DATUMSTUDIO_NISSAN/Shared%20Documents/Forms/AllItems.aspx?RootFolder=%2Fteams%2FJAO%5FNML%5F06%5F004036%5FDATUMSTUDIO%5FNISSAN%2FShared%20Documents%2F%E4%BB%95%E6%A7%98%E7%9B%B8%E8%AB%87%E3%83%BB%E7%A2%BA%E8%AA%8D%2F%E3%83%A2%E3%83%87%E3%83%AB%E3%82%BB%E3%82%B0%E3%83%A1%E3%83%B3%E3%83%88%E7%B4%90%E4%BB%98%E3%81%91%E3%83%9E%E3%82%B9%E3%82%BF%E3%83%BC%2FPRC
【Next.js】Error: Cannot find module './undefined' とでてしまうときの処方箋

Next.jsの開発をしてて、
* npm run dev では問題ない
* よし、 npm run build だ。通ったぞ
* npm run start だ。通ったぞ
* ページにアクセス！ InternalServer Error！
* ターミナルには、 `Error: Cannot find module './undefined'` とかでてて意味わからん

となってる人向けです。

## 原因：PATHが通ってないため

```
export NODE_PATH=`npm root -g`
```

これを叩いてから、もう一度、 
`npm run build` -> `npm run start` をすればいけるようになりました。(buildからやりなおすこと)

参考文献：
https://qiita.com/DNA1980/items/11fdb7233fc288ac3502
Windows11のnpmをnpm-windows-upgrade(Powershell)でバージョンアップする

# はじめに
2022年8月某日、npxコマンドでReactアプリを作成しようとしたところWarningが表示されたので調べたところ、npm.cmdなどを書き換えれば解消できるとかnpmをバージョンアップすれば解消するとわかったので、自分で編集はできるだけしたくないのでnpmをバージョンアップすることにした。

環境はWindows11でコマンド操作は基本Powershellを使う。
node.jsはv16.15.1をインストール済みである。

npm/npx実行時のWarning
~~~console:
npm WARN config global `--global`, `--local` are deprecated. Use `--location=global` instead.
~~~

参照した情報
https://stackoverflow.com/questions/72401421/message-npm-warn-config-global-global-local-are-deprecated-use-loc


# 更新前のバージョン
バージョンアップする前の表示はこんな感じ。バージョン表示でもWarningが出ている。
~~~console:
PS C:\Program Files\nodejs> npm -v
npm WARN config global `--global`, `--local` are deprecated. Use `--location=global` instead.
8.11.0
PS C:\Program Files\nodejs> npx -v
npm WARN config global `--global`, `--local` are deprecated. Use `--location=global` instead.
8.11.0
~~~

# npm-windows-upgradeを実行
Windowsのnpmバージョンアップはnpm-windows-upgradeコマンドで行う。
npm-windows-upgradeの実態はPowershellスクリプト(.ps1)のようで、ExecutionPolicyを指定しないと実行できない。また、Powershell自体を管理者権限で起動しないとコマンドがエラーになる。

Powershellを管理者権限で起動する。
インストール可能なバージョンがリスト表示されるので、所望のバージョンを選択しEnterを押下する。
~~~console:
PS C:\Program Files\nodejs> PowerShell -ExecutionPolicy RemoteSigned npm-windows-upgrade
npm-windows-upgrade v6.0.1
? Which version do you want to install? (Use arrow keys)
> 8.15.1
  8.15.0
  8.14.0
  8.13.2
  8.13.1
  8.13.0
  8.12.2
(Move up and down to reveal more choices)
~~~

インストール中の表示はこんな感じ。
最後にインストールされたバージョンが表示され、"よい一日を!"と見送られる。
~~~
PS C:\Windows\system32> PowerShell -ExecutionPolicy RemoteSigned npm-windows-upgrade
npm-windows-upgrade v6.0.1
? Which version do you want to install? 8.15.1
Checked system for npm installation:
According to PowerShell: C:\Program Files\nodejs
According to npm:        C:\Users\kohei\AppData\Roaming\npm
Decided that npm is installed in C:\Program Files\nodejs
Upgrading npm... |

Upgrade finished. Your new npm version is 8.15.1. Have a nice day!
~~~

# 更新後のバージョン
バージョンアップ後の表示はこんな感じ。Warningはでなくなった。
~~~console:
PS C:\Windows\system32> npm -v
8.15.1
PS C:\Windows\system32> npx -v
8.15.1
~~~

# 最後に
Windows11環境でnpm-windows-upgradeを使ってnpmバージョンアップすることができた。
よい一日を送れそうである。
SonarQubeの権限設定


SonarQubeのPermissionについて調べた時のメモ。

情報が古い可能性があるため、最新の情報を参照する場合は[オフィシャルサイト](https://docs.sonarqube.org/latest/instance-administration/security/)を確認すること。


## SonarQubeのPermission種別
Project単位でのPermissionの設定と、全体レベル(Global)でのPermissionの設定が出来る。

- Project単位のPermission\
Project選択後、Project Settings -> Permissionsから設定

- Global Permission\
Administration -> Security -> Global Permissionsから設定

Project単位でのPermissionとGlobal Permissionでは設定できる項目が微妙に異なる。

設定可能なPermissionは以下の項目になる。
- Project単位のPermission
  - Browse　※Privateのみ
  - See Source Code　※Privateのみ
  - Administer Issues
  - Administer Security Hotspots
  - Administer
  - Execute Analysis
- Global Permission
  - Administer System
  - Administer
  - Execute Analysis
  - Create
  
それぞれのPermissionの意味は以下になる。

|Permission|設定箇所|意味|
|---|---|---|
|Browse|Project|プロジェクトへのアクセス、Measures、Issues、Security Hotspotsの閲覧、Issueの編集（確認/解決/再開、割り当て、コメント）の実行、Security Hotspotsに割り当てられたユーザーへのコメントや変更などが可能。|
|See Source Code|Project|プロジェクトのソースコードを閲覧できる|
|Administer Issues|Project|問題の種類と重大度を変更し、問題を「修正しない(won't fix)」または「誤検出(false positive)」として解決する（ユーザーは"Browse"権限も必要）。|
|Administer Security Hotspots|Project|Security Hotspotのstatusを変更する|
|Administer|Project|"Project Settings"にアクセスし、Adminのタスクを実行する（ユーザーは "Browse"権限も必要）。デフォルトでは、このAdministerパーミッションを持つユーザーは、現在のプロジェクトの設定とパーミッションの両方を管理できる。プロジェクト管理者のみにプロジェクト設定の更新を許可するには、Administration > Configuration > General Settings > Securityに移動して、Enable permission management for project administratorsを無効にする必要がある。| 
|Execute Analysis|Project/Global|解析に必要なすべての設定にアクセスでき、解析結果をSonarQubeにPushできる。PrivateのProject Settingsも対象だが、パスワードのようなセキュリティで保護された設定は含まれない。|
|Administer System|Global|全てのAdmin権限が利用可|
|Administer - Quality Gates|Global|Quality Gatesに関する全ての権限が利用可|
|Administer - Quality Profiles|Global|Quality Profilesに関する全ての権限が利用可|
|Create - Projects|Global|Projectの作成権限|

なお、システム設定を変更していない場合、デフォルトで作成したユーザはProjectを作成できてしまう。
これはAnyoneというGroupに全てのユーザが暗黙的に所属しており、このAnyoneのデフォルトがExecute AnalysisとCreate Projectsに許可が与えられているためである。

![1659344162584.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/8a8bd772-2581-e6e1-aeda-171e05ff33ea.png)
許可されたユーザにのみProject作成を許可させる場合はGlobal PermissionsでAnyoneの設定を変更し、チェックを外す必要がある。

## Permission Templates
Project作成後、そのProjectに特定のユーザに特定のPermissionをまとめて付与することが出来る。
例えば、今alice, bob, mikeというユーザが存在し、新規Projectに対して毎回以下のような権限与えたいとする。
- alice(ゲスト)：結果の参照のみ許可（コードは参照不可）
- bob(開発者)：結果の参照、コード参照、Issueの編集許可、解析許可
- mike(管理者)：全権限あり

その場合、テンプレートを作成してProjectに適用することで、Permission付与の手間を減らすことが出来る。\
Administration -> Permission TemplatesからCreateを選択し、以下のようなテンプレートを作成する。
![1659345659018.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/4b39ad7c-869e-7e76-65b7-a77607b67b31.png)

その後、Projectを作成してProject Settings -> Permissionsから右上のApply Permission Templateをクリックしてテンプレートを適用すると、まとめて権限を付与する事ができる。
なお、注意点としてAdminの権限を設定していないテンプレートを適用した場合、AdminもProjectに対する権限がなくなる点に気をつけること。
AWS資格自宅受験がなかなか落とし穴が多かったので発信したいです。

# はじめに
7月中旬、初めてAWS資格（CLF：クラウドプラクティショナー）に挑戦し、危うかったものの合格することができました。
勉強法について発信されている方はたくさんいらっしゃいますが、当日のことを知れる場が少なくとっても困ったので、備忘録兼私の失敗をする人が減ることを祈願し、今回記事を書きます。

## 概要
今回、私が受けた試験や試験システムについて箇条書きですが先に紹介いたします。

* AWS資格の受験は初めて
* PearsonVUEシステム選択
* 自宅受験
* 引っ越し直後でネット回線を引く前でモバイルWi-Fiをレンタル（ネット回線に不安がある方用に後ほど説明を付け加えます）
* 身分証明書は一般自動車免許（初心者期間仕様）
* 受験は日本時刻11:15～　チェックインは10:45～

## 当日の流れ
当日の流れを時系列ごとに書いてみます。

10:00　部屋の準備
部屋はリビングで、背面に照明や窓があると試験監督者の監視の妨げになることで控える必要があったため、いつもとは違う場所に椅子や机をセッティング

10:40　<font color="red">チェックイン</font>がどこでできるのかわからず焦る

10:45　わからず焦っていたらたまたまPCで試験申し込み画面にアクセスしていて無事チェックイン

11:00　チェックインの作業が**ごたつき**ながらも予定開始時刻よりも<font color="red">早く</font>試験開始

11:10　監視している試験監督から<font color="red">注意のチャット</font>が入る

12:00　その後は問題なく試験終了。問題が終了後、アンケート回答をして合否がその場でわかる

予想終了時刻より50分ほど早く終わったので他の方の体験記を見ていると、比較的スムーズに終わったと思います。
しかし、実際は小さなハプニングがいくつかあったので注意点を書かせていただきます。

## ハプニング０　机周辺の環境に迷う
机上はクリーンデスクはわかるのですが、周辺の環境がどこまで隠さなければいけないのか調査できていませんでした。

私はリビングで受験をして前後左右に文字情報（本棚やインテリアのポスター）が多く、目の入る位置にはテレビもありました。

試験直前に調べると、あまり、ものがあるのはよろしくないようなので
* ポスターは裏向けにして見えないように
* テレビの液晶画面と本棚をバスタオルで覆いました

私はキッチンを背に受験しましたが文字情報はなかったので指摘を受けず試験を受けることができました。

## ハプニング１　身分証明書が使えない
私は今回、一般自動車免許で登録を試みました。
しかし、なぜか、承諾してもらえず急遽パスポートに変更しました。
今、考えられる身分証明書が使えない理由を考えてみます。
1. 初心者期間の免許であった
1. 引っ越し直後で裏面に記載があった

以上が考えられます。なので、試験当日は必ず予備の身分証明書をご準備ください。

また、PearsonVUEで受験の場合は身分証明書は1点ですがPSI試験では身分証明書は<font color="red">2点</font>必要です。
受験システムによって必要な身分証明書が異なりますので、身分証明書に合わせて受験申込をするのもいいかもしれませんね。

## ハプニング２　チェックイン場所がわからない
チェックイン（受付前）にどこにアクセスするのかがわかりませんでした。
オンサイトでは経験できないハプニングだと思います。

チェックインは**試験登録**を閲覧できる場所に表示されます。受付開始時刻まで表示されないので受付時刻に再読み込みを行ってください。

## ハプニング３　チェックイン終了直後テスト開始
チェックインが終わったら開始時刻まで待機するかと思いきや、チェックインが終わった直後すぐに開始しました。心の準備ができておらず少し驚きましたよ。

自然と受験終了の時間も変わりますし、PearsonVUEでは「時刻」は表示されず、「残り時間」のみの表示になります。

## ハプニング４　試験監督からのテスト中のチャット
問題を解いていると前のめりになりすぎて、画面から顔が少し見切れていたようで注意のチャットが飛んできました。

この時間は試験のタイマーは進んでいますし、チャットで返信が返ってくるまで問題は解きにくいので、画面内には顔と肩が入るようにしておいてください。

不正行為の予防だと思うので、素直に受け入れてください。笑

## ネット回線に不安がある方に向けて
私は引っ越し直後でネット回線が弱いレンタルWi-Fiを使用しており、当日に回線が遅延することを恐れ、試験当日のみモバイルWi-Fiを別で用意しました。

このことを踏まえ、AWS試験を受けるとき専用のネット回線の勧めを記載しておきます。

### ネット回線は試験当日だけでも補強するべき
AWS試験は登録後に試験用のアプリをダウンロードします。
正直この試験システム容量がそれなりにあります。
（音声、カメラ、チャット機能とかいろいろついているので・・・）
なので、ダウンロードや設定をするのにかなりネットワークを使いました。
しかし、試験システムのセットアップは時間はかかりますが、申し込み後～試験直前までできるので、申し込み後すぐにすれば時間のことはあまり気にしなくてよいでしょう。

もっとも、気にすべきはやはり**当日**なので、試験当日に合わせてネット回線を強めておくことをお勧めします。
特にネット回線を気にしておいてほしい方は以下のタイプです。
* 平日夕方や土日などの休日にネット回線が弱くなる
* 平日昼間でもいきなりネット接続が弱くなり使いにくい
* 重い動作をしたときに動きが鈍くなる

PCが試験当日に動きが鈍くなるだけでもパニックになると思うので、保険としてできることがないか考えてみてください。

### 実際に私がしたこと
私は試験前日に試験システムをインストールしました。
試験前日は弱いネット環境でセットアップを行いましたよ。
1時間かかったのでネット環境があまりよろしくない方は早めに対応しておくのが良いです。

試験当日はモバイルWi-Fiをレンタルしておき、これを利用しました。
いろんなレンタル会社があるので迷うと思うのですが、AWS試験を受ける際におすすめのレンタルWi-Fiの選び方を記載しておきます。
* 一日の容量の利用制限がない（１日5GBまで、などと制限がある場合は途中で遅延することが予想されます）
* 最大で使える容量は20GBあれば当日のみの利用なら十分
（私はほんとうにわからず100GBまで使えるものをレンタルしましたが、結果使ったのは5GBほどでした）

特に<font color="red">一日の容量の利用制限</font>については制限を設けているレンタル会社と、利用制限がない会社がありますので、よく調べてからレンタルしてください。

## さいごに
今回はAWS試験当日のみにスポットを当てて記載しました。
この記事を読む方は「明日受験する！」方や「このあとすぐに受験するから焦っている！！」方が多いのではないでしょうか。

そんな方々の役に立つことを願っています．．．

最後まで読んでいただきありがとうございました！
Salesforceでレポートを作成しユーザライセンスを一覧にしよう

Salesforceのユーザにはユーザごとに
・Salesfroce
・Salesforce　Platform
のライセンスがございます

ユーザごとに誰がどのライセンスなのかはレポートを作成すれば一覧で表示可能です

しかし、標準レポート「ユーザ」では表示できないので注意が必要です


![ユーザライセンス１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/6dd951e3-d31b-911d-c256-c5444ff6a150.png)


まずカスタムレポートタイプを作成。主オブジェクトが「ユーザ」のレポートを作成します
![主オブジェクト.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/22c01009-47b4-eb07-6975-a017a2b496f0.png)


そしてレポートタイプ作成後、下記画像のように
・参照先の項目を追加＞
・ユーザ
・プロファイル
まで推移し、「ユーザライセンス」をチェックし保存します
![ライセンス.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/9e43d2d4-33a1-0266-fcab-72863d3a0e65.png)


こうすれば、このカスタムレポートタイプは「ライセンス」項目をレポートで表示することが可能です
![ユーザライセンス.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/0eedfee8-4b95-f9d1-b826-b63fc11f4799.png)


このカスタムレポートタイプでは他にもレポートタイプ「ユーザ」では出せないロールIDなども表示可能です。
ぜひ色々試してください
![　ロールD.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/c2291e44-ffe2-905f-f2a5-c23b9f32eb4b.png)
オシロスコープで目ロジアナ

# 目ロジアナ 

CTF では、バイナリ解析でファイル種別を特定する必要がある。
そのときに達人が行うワザとして、ダンプリストを目で追ってファイル種別の特徴をつかむ「目grep」という手法がある。

さて、電子工作でデバイス間の通信などを調べるときにロジアナ(ロジックアナライザー)があれば便利。
しかしオシロスコープしか持っていない場合は目grep のように、目ロジアナを行ってみよう。

今回は、いくつかのセンサの I2C 通信を目ロジアナで調べてみた。

# 環境

- オシロスコープ RIGOL DS1054Z
- CO2センサ CCS811 (StrawberryLinux モジュール)
  -  I2C アドレス 0x5B に設定
  -  デバイスID 0x81
- I2Cバスに温度湿度気圧センサ BME280 モジュールが相乗り 
  - I2Cアドレス 0x76 に設定 
- ホストマイコン LRA1 
- I2Cバスは BME280 モジュール上の 10kΩ 抵抗でプルアップ

# RIGOL 1054Z

- 4ch
- 周波数帯域 50MHz
- 取り込み可能ポイント 24Mpts
- I2C デコードオプションは購入していないので人肉デコードでがんばる。


# I2C の通信について

I2Cとは、4本の線で通信を行う。そのうち2本は電源なので、正味の通信はSCLとSDAの2本で行う。SCLはクロックでタイミング信号、SDAはHighとLoの電圧でデータを送受信する。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/cadca27d-f3f5-7648-a317-992f758c9fe2.png)

これは I2C の A/D コンバータである MCP3425 のデータシートに載っているタイミング図です。どの I2C の通信でも、このような波形で通信をしています。今回調べるのは CO2センサ である CCS811 と、温度湿度気圧センサである BME280 です。それらの SCL と SDA の信号をオシロスコープで見てみましょう。

# 波形取得

![DS1Z_QuickPrint3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/05384cce-a187-303c-4547-34dca163bcc4.png)


一連の動作を 1.2 秒の範囲で取得しました。 黄色が SCL 、水色が SDA です。

# BME280

最初の通信の波形を拡大する。
DS1054Z の取得ポイント容量が 24Mpts で 2ch 取得しているのでサンプリング間隔は 100nS になるのかな。以下に出ている SCL のクロックレートは100kHz (10μS/サイクル) なのでこれでもまあまあ読めますね。

![DS1Z_QuickPrint4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/84b35a10-2083-0cfb-03ab-756a572a25a9.png)

## 読み解いてみる


### START condition

赤で囲ったところはStart Condition。I2C の通信は基本的に SCL が Low のときに SDA を変化させます。
何も通信していない時はバスのプルアップでSDA、SCL両方ともHighとなっていますが、もし、SCLがHighのときに SDAがLowになった場合は
通信がはじまる合図とみなします。それが Start condition です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/b730901d-5f9d-4067-0cb5-2bb2fd0516ac.png)

### DATA,ACK,Clock Stretch
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/485a80e4-e1fc-638d-742c-75a197834e5c.png)


# CCS811

BME280 と同様に、CCS811も読解できます。

## スタート

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/bcc92132-8efe-f4a4-6e1c-e2747f942828.png)

## HWID

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/6ff26afa-b4c2-aaaa-2232-c9dca061aac3.png)

ふむふむ。正常ですね。

# トラブルシューティング!!

CCS811のアドレス0x01に、データ 0x10 を書き込みます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/2e5389f9-b868-c223-f60c-b2c2e8780cab.png)

さて、そのうえで CCS811 のアドレス 0x01 を読み込みすると、書き込んだ 0x10 が見えるはずです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/85e898de-2983-7646-e5c6-0151d12e9bbe.png)


おや、0x10になっていないといけないはずが、0x11になってますね。ということは CCS811 への書き込みがうまくいっていないということになります。

ここでエラーが出るので、波形を睨んでましたが特に問題となるような波形ではありません。

## 原因

うーん、と悩んでましたが、結局このエラーはここより前に CCS811 に送った処理が原因でした。 
最初に 0xF4 を書き込んで APP_START コマンドを送るのですが、その送り方に問題があって正常に START 状態になっていなかったということでした。やれやれ。

# 目ロジアナ

こんな感じで波形を目でデコードすることはできます。しかしながら 1バイトや2バイトぐらいならいいのですがそれを超える長さだったり、回数が多くなると大変です。激安のロジアナを買っておいたほうがいいかもです。

なお、今回使用したオシロスコープ RIGOL 1054Z ですが、最近は購入すると I2C デコードオプションがついて来るらしく、それがあればこういう苦労もしなくて良さそうです。
【Django】ページをPDF出力する(基本)【Python】

# 初めに
Djangoで構築したWebアプリケーションのページをpdf出力したい時ってありますよね。
Webページのpdf出力は簡単そうなイメージでしたが、Djangoで作成されたものページは意外と奥が深かったので手法をまとめます。
ライブラリはpdfkitを使用し、Windows環境でページのpdf出力を行います。
ここでは一番簡単な方法でpdf出力をする方法をまとめ、細かい検証は別の記事にまとめます。

# 環境
|名称  |バージョン  |
|---|---|
|Python  |3.10.4  |
|Django  |4.0.6 |
|pdfkit  |1.0.0 |

# pdf出力するページ
今回は以下のページをpdf出力させてみます。
pdf出力関数呼び出し用のボタンを用意してあります。
![キャプチャ.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1225075/030601d4-be82-8bbe-8c53-2d9dff56c068.jpeg)


body部は以下のようになっています。
今回は値を直書きしたものをpdf出力させます。
```php:index.html
<body>
    <table class="table">
        <thead>
          <tr>
            <th scope="col">#</th>
            <th scope="col">First</th>
            <th scope="col">Last</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <th scope="row">1</th>
            <td>Kogoro</td>
            <td>Akechi</td>
          </tr>
          <tr>
            <th scope="row">2</th>
            <td>Kosuke</td>
            <td>Kindaichi</td>
          </tr>
          <tr>
            <th scope="row">3</th>
            <td>Mitsuhiko</td>
            <td>Asami</td>
          </tr>
        </tbody>
      </table>
      <form action="to_pdf/" method="post">
        {% csrf_token %}
        <button type="submit" class="btn btn-danger">pdf出力</button>
      </form>
</body>
```

# 環境構築
pdf出力に必要なものをインストールします。
まずはpdfkitをpipでインストールします。
```
>>> pip install pdfkit
```
次にwkhtmltopdfをインストールします。
pdfkitはサーバにインストールされたwkhtmltopdfを利用してページをpdf出力させています。
ダウンロードを以下のサイトから。

[https://wkhtmltopdf.org/](https://wkhtmltopdf.org/)
![キャプチャ1.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1225075/d511a518-7cbb-89ad-dd1e-5bd7c0cc2d4b.jpeg)

赤枠内「Downloads」を押下してダウンロードページに遷移します。
![キャプチャ2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1225075/9cd20ad4-08de-16a9-6ca4-8aa77d7c9d96.jpeg)

自分の環境に合わせてインストーラーをダウンロードします。
インストール手順は簡単なので割愛します。

wkhtmltopdfをインストールしたらパスを通しておきましょう。
「wkhtmltopdf.exe」があるディレクトリを指定します。
特に指定しなかった場合「C:\Program Files\wkhtmltopdf\bin」にインストールされていました。

# pdf出力
準備が整ったのでページをpdf出力します。
pdf出力ボタンで呼び出す関数は以下のようになっています。
```php:views.py
import pdfkit

def to_pdf(request):
    url = 'http://127.0.0.1:8000/test_app/'
    pdfkit.from_url(url, 'sample.pdf')
    return redirect('test_app:index')
```

一番簡単な方法だと、「pdfkit.from_url」の第一引数にpdf化したいページのurlを、第二引数に出力先のパスを渡すだけです。
第三引数にサイズ指定等の細かいオプションを渡すことができますが、その辺りは別の機会に。

# 出力確認
特にパスを指定しない場合はDjangoのプロジェクト直下に出力されます。
![キャプチャ4.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1225075/41fe62ef-0ac8-e43c-d0c7-96baa6b9847f.jpeg)

しっかり指定したファイル名で出力できています。
開いて中身も確認します。
![キャプチャ5.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1225075/8c7ccaae-e9ed-0a75-3230-4cb8381c2147.jpeg)

内容は出力されていますが、CSSが適用されていません。
これは新たな発見でしたが、CDNは効かないのかもしれません。
以前、cssファイルをstatic内に配置していた時はちゃんと効いていた記憶が。。。

# まとめ
今回はDjangoのページのpdf出力を一番簡単な方法でまとめました。
この記事は導入で、今後pdfkitの細かい使い方とDjangoの仕様に触れていければと思います。
Spring boot 2.7 (Spring Security 5.7)のAuthenticationManagerの設定

# spring boot 2.7  記述方法
spring boot 2.6までは、WebSecurityConfigurerAdapterを使用していました。しかし、spring boot 2.7 (Spring Security 5.7)になってからは、WebSecurityConfigurerAdapterを使用していましたを使用が推奨されません。

書き換え方法は、

https://spring.io/blog/2022/02/21/spring-security-without-the-websecurityconfigureradapter

に記述されています。

しかし、AuthenticationManagerの記述方法は、ドキュメントに記述されているが、ドキュメント通りに記述し直してもうまくいきませんでした。
いろいろしらべ、以下の記述方法で、うまく動いています。


```
@Configuration
public class SecurityConfiguration {

    @Bean
    public AuthenticationManager authenticationManager(
        final AuthenticationConfiguration authenticationConfiguration) throws Exception {
      return authenticationConfiguration.getAuthenticationManager();
    }

    @Bean
    PasswordEncoder passwordEncoder() {
      return new BCryptPasswordEncoder();
    }

}
```

## AuthenticationManagerの設定方法

パラメータに AuthenticationConfigurationを設定して、AuthenticationManager を生成すると、うまく動きます。
stackoverflowを参考にしました。

https://stackoverflow.com/questions/72381114/spring-security-upgrading-the-deprecated-websecurityconfigureradapter-in-spring
備忘録 マークダウン記法編

# マークダウン記法
これから、個人用備忘録としてqiitaを利用するために、使えそうなマークダウン記法をまとめました。
※qiita様が[チートシート](https://qiita.com/Qiita/items/c686397e4a0f4f11683d)を出していらっしゃるので詳しくはそちらをご覧ください
***
### タイトル
文字の前に`# `を挟むことで文字が大きくなる

    #タイトル
    ...
    ###### タイトル
***
## 引用
> 行の先頭に`> `を付ける事で引用
```
> 行の先頭に`> `を付ける事で引用
```
***
## 強調
`バッククォートで文字を囲むことで協調`
```
`バッククォートで文字を囲むことで協調`
```
***
## 水平線
*を3個置くと水平線
```
***
```
***
## リンク
[文字列にリンクを埋め込める](https://qiita.com/)
```
[文字列にリンクを埋め込める](https://qiita.com/)
```
Open MMLabの画像解析の記事及びサンプルコードのまとめ

# はじめに
これまでOpen MMLabで公開している各種画像解析タスクの利用方法や学習方法及び学習のサンプルコードなどを公開してきました。

まだ、ご紹介出来ていないものもありますが、かなりたまって来ましたので紹介記事やサンプルコードについてまとめていこうと思います。

# MMDetection（物体検知）

- オリジナルデータセット（COCOデータセット）の作成方法

https://qiita.com/ryosao/items/908b05f4da6648931134

- セマンティックセグメンテーションのデータ作成方法

https://qiita.com/ryosao/items/f613d58ffe35c97f9968

- 各種モデルのサンプルコード集

https://qiita.com/ryosao/items/cbf5f56130a63a27d229

- 上記git hubのページ

https://qiita.com/ryosao/items/cbf5f56130a63a27d229


# MMSegmentation

MMSegmentation (画像のピクセル単位での物体の予測）については、当時ほとんど日本語の情報が掲載されていなかったので、使い方から記事にしています。

- Google colabolatoryでMMSegmentationを使ってみる。

https://qiita.com/ryosao/items/2e25eb93abb9b29ae3fa

- MMSegmentationを使ったトレーニング方法

https://qiita.com/ryosao/items/0ada096efddaac0ee803

- MMSegmentationでのオリジナルデータでのトレーニング方法

https://qiita.com/ryosao/items/d753a7d2c01f4c3f520f

-　サンプルコード

https://github.com/saotomryo/Use_MMSegmentation/blob/main/Use_MMSegmentation_deeplabv3.ipynb

# MMOCR
OCRの学習モデルを集めたものです。


- MMOCRを使ってOCRを作成する(文字認識編）

https://qiita.com/ryosao/items/c0a0cc274508759bbdc7

- MMOCRを使ってOCRを作成する(文字認識編 - 日本語）

https://qiita.com/ryosao/items/28bb50ceb74b10c8cf32

- MMOCRを使ってOCRを作成する(文字抽出）

https://qiita.com/ryosao/items/14fc0cef4fe43afe158f

- サンプルコード

https://github.com/saotomryo/Use_MMOCR

# MMGeneration 
画像生成モデルを扱います。
これも日本語情報はほとんどありませんでしたので、利用方法から記事を作成しました。

- MMGenerationを利用した画像生成

https://qiita.com/ryosao/items/d7ed14aa17db7716bf6b

- MMgenerationを利用したGANの学習

https://qiita.com/ryosao/items/ece4b9357d8147c78e37

- サンプルコード

https://github.com/saotomryo/Use_MMGeneration

# MMClassification
画像認識モデル集です。
MMClassificationの記事は少ないのですが、画像認識については非常に多くの記事があります。
試しに一回利用してみたので、サンプルコードだけ作成してみました。

- サンプルコード
https://github.com/saotomryo/Use_MMClassification


Open MMLab関連の記事を追加した時はこのページも追加しようと思います。
Heroku Postgresとアプリの接続設定

# 目次
[1. herokuにデプロイした際の接続情報を設定](#1-herokuにデプロイした際の接続情報を設定)
[2. ローカルテスト時の接続情報を設定](#2-ローカルテスト時の接続情報を設定)
[3. DB接続のマネージャークラスを作成する](#3-db接続のマネージャークラスを作成する)
[4. node.jsでの記述](#4-nodejsでの記述)
# 1. herokuにデプロイした際の接続情報を設定
環境変数を管理する.envファイル追加する(アプリ作成フォルダに.envファイルを作成)
※ホスト名等はHerokuにログインしてアプリページからpostgresDBのページを開き、Database Credentialsのviewボタンをクリックして確認する
``` :.env
ENV_HOST = [ホスト名]
ENV_DB = [DB名]
ENV_USER = [ユーザー名]
ENV_PASS = [パスワード]
```

dotenvモジュールをインストールする
```
$ npm install dotenv
```

アプリフォルダに新たにdbフォルダを作成し、db.jsファイルを配置する
``` javascript:/db/db.js
const pg = require('pg');
require('pg').defaults.ssl = true;
require('dotenv').config();

exports.pool = new pg.Pool ({
  host: process.env.ENV_HOST,
  database: process.env.ENV_DB,
  user: process.env.ENV_USER,
  port: 5432,
  password: process.env.ENV_PASS,
  ssl: { rejectUnauthorized: false }
});

```

node.jsでpostgresqlを使うためにpg(node-postgres)をインストール
```
$ npm install pg
```

# 2. ローカルテスト時の接続情報を設定
git bushを起動、アプリ作成フォルダにて下記コマンドを実行して接続情報をセットする
```
$ heroku config:set ENV_HOST=[ホスト名] --app [アプリ名]
$ heroku config:set ENV_DB=[DB名] --app [アプリ名]」
$ heroku config:set ENV_USER=[ユーザー名] --app [アプリ名]」
$ heroku config:set ENV_PASS=[パスワード] --app [アプリ名]」
```

# 3. DB接続のマネージャークラスを作成する
dbフォルダの下にpostgresManager.jsを配置する
``` javascript:/db/postgresManager.js
const db = require('../db/db');

/* Postgresクラス */
class PostgresManager {

    /**
     * Poolからclientを取得
     * @return {Promise<void>}
     */
    async init() {
        this.client = await db.pool.connect();
    }

    /**
     * SQLを実行
     * @param query
     * @param params
     * @return {Promise<*>}
     */
    async execute(query, params = []) {
        return (await this.client.query(query, params));
    }

    /**
     * 取得したクライアントを解放してPoolに戻す
     * @return {Promise<void>}
     */
    async release() {
        await this.client.release(true);
    }

    /**
     * Transaction Begin
     * @return {Promise<void>}
     */
    async begin() {
        await this.client.query('BEGIN');
    }

    /**
     * Transaction Commit
     * @return {Promise<void>}
     */
    async commit() {
        await this.client.query('COMMIT');
    }

    /**
     * Transaction Rollback
     * @return {Promise<void>}
     */
    async rollback() {
        await this.client.query('ROLLBACK');
    }
}

/**
 * Postgresのインスタンスを返却
 * @return {Promise<Postgres>}
 */
const getClient = async () => {
    const postgres = new PostgresManager();
    await postgres.init();
    return postgres;
};

module.exports.getPostgresClient = getClient;
```
# 4. node.jsでの記述
記述サンプル
``` javascript
const { getPostgresClient } = require('../db/postgresManager');

/* 検索処理 */
async function select_list(params) {

  var result;
  const dbm = await getPostgresClient();
  const sql = 'SELECT * FROM TEST';
  try {
    result = await dbm.execute(sql, params);
  } catch (e) {
    console.log('err:'+e.stack);
  } finally {
    console.log('success');
  }
}
```
[Watson Discovery] 同義語を使って検索する

Watson Discovery の Document Retrieval プロジェクトで検索を行うときの同義語の設定方法を紹介します

# 環境
Watson Discovery on Cloud (V2) の Document Retrieval Project

# はじめに
Watson Discovery の Document Retrieval Projectで文書を検索するとき、**言い回しや表記ゆれを吸収した検索をしたい場合**、例えば「関西国際空港」というクエリで「関西国際空港」を含んだ文書だけでなく「関空」と記載されている文書も検索したい場合、には、Watson Discovery の **Synonyms** （同義語）という機能を使います。この機能は、Query Expansion と呼ばれる場合もあります。

似たような機能に Dictionary（辞書）がありますが、Dictionaryは文書自体にタグ付けしたり、そのタグを利用して絞り込み検索をする際に使用されます。



# 設定手順

マニュアル [IBM Cloud Docs>Discovery v2>Expanding the meaning of queries](https://cloud.ibm.com/docs/discovery-data?topic=discovery-data-search-settings) に従って設定していきます。

:::note warn
ここで行うSynonymsの設定はDocument Retrieval Projectに適用され、Content Mining Projectではない点にご注意ください
:::

### 1. Document Retrieval Projectに文書が投入されていることを確認する
今回は以下のような文書を入れています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248948/a26bb0c8-423a-cece-4d47-590fdd5b0861.png)

### 2. 同義語設定前に検索する
「関西国際空港」で検索してみると、1文書のみヒットしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248948/62b1673f-e6f1-8667-bd9f-6778e1bacb69.png)

「関空」で検索してみても、1文書のみヒットします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248948/142a67ef-77be-1d4d-f64f-d0f3c7ae0f02.png)

### 3. 同義語のJSONファイルを作成する

Bidirectionalの同義語辞書を作成します。

```:synonyms.json
{
  "expansions": [
    {
      "expanded_terms": [
        "関西国際空港",
        "関空",
        "KIX"
      ]
    }
  ]
}
```
### 4. 同義語のJSONファイルをWatson Discoveryにアップロードする

同義語辞書をアップロードします。
画面右側の[Improvement tools]から[Improve relevance]メニューを開き、[Synonyms]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248948/e2dc831c-9f8c-136d-bd8f-82380ab3e7a9.png)

[Upload synonyms]から同義語辞書のJSONファイルをアップロードします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248948/dfeb59ca-2535-c06c-c9a0-948567be3f83.png)

アップロードされました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248948/18b9c4a8-fa6a-99a1-9ee2-ba6a8969441a.png)

### 5. 検索して確認する

「関西国際空港」で検索してみると、3文書ヒットしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248948/01cb0e44-d8c2-23cf-a8dc-28aad4dde6e1.png)

:::note
Watson Discovery V1ではさらにtokenization dictionaryの設定も必要でしたが、V2では不要のようでtokenization dictionary機能そのものが無くなったようです
:::

設定手順は以上です。


# 参考
画面左側にあるのがDictionaryを使用した絞り込み項目で、同義語を考慮した絞り込み検索ができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248948/7da6f86e-e538-01f2-5474-ce055164237e.png)

この場合のDictionaryは以下のような設定をしています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248948/48075aa1-4a93-1e1e-efa6-4dcb7cce9569.png)
バリデーションエラーが日本語で表示されない。

# はじめに
本記事はプログラミング初心者が、「現場で使える RubyonRails5 速習実践ガイド」(通称)「現場Rails」で学習を進めていくにあたって、つまずいた点、バージョンの違いによるエラーが出た点などを解決した方法を備忘録も兼ねてまとめているものです。
そのため、記事の内容には誤りがある可能性があることをご理解ください。
誤りがあればお手数ですが、ご指摘いただければと思います。よろしくお願いします。


# 環境
Ruby 3.1.2
Rails 7.0.3.1

# エラーが表示されない
![スクリーンショット 2022-08-01 17.29.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737125/f4d06848-5596-44d2-2f70-448f534d8b53.png)

・名称を入力せずに登録しようとした時、赤枠のところに日本語でエラーメッセージが出てくるはずなのですが、出てきませんでした。(レイアウトが整っていないのは、ご了承ください💦)
まず、そもそもエラーとして認知されているのかを確認します。


**コンソールで確認**
```:コンソール
task2leaf % rails c  #コンソールを起動

Loading development environment (Rails 7.0.3.1)
irb(main):001:0> task = Task.new　#インスタンスを作成
=> #<Task:0x000000010c7bf298 id: nil, name: nil, description: nil, created_at: nil, updated_at: nil> #名称がnil(空)であることを確認
irb(main):002:0> task.save #保存処理してみる
=> false #保存できていない。
```
バリデーションは機能しているみたいです。
以下のサイトを見ていると、バージョンの違いであることが判明。

https://qiita.com/P-man_Brown/items/862503a638801fea01e7



Rails7からデフォルトでturboが導入されたことにより、以下の記述を追加する必要があるようです。
status: :unprocessable_entity

```:task_controller.rb
  def create
    @task = Task.new(task_params)

    if @task.save
      redirect_to @task, notice: "タスク「#{@task.name}」を登録しました"
    else
      render :new
    end
  end
```

のrender :newの後に

```:task_controller.rb
  def create
    @task = Task.new(task_params)

    if @task.save
      redirect_to @task, notice: "タスク「#{@task.name}」を登録しました"
    else
      render :new, status: :unprocessable_entity
    end
  end
```

こうすることで、エラーメッセージが表示されました。
![スクリーンショット 2022-08-01 17.47.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737125/31ed9fef-f67a-8b23-8265-6d657114a069.png)



# 日本語にならない
しかしながら、どんなエラーが発生しているのかは、ユーザーからは理解できません。日本語にするために、以下のサイトを参考にしました。
rails-i18nというgemが必要なようです。

https://qiita.com/Ushinji/items/242bfba84df7a5a67d5b

ひとまず、以下のようにライブラリを追加して、bundleでインストールしましょう。
```
gem 'rails-i18n'
```
次に、config/application.rbに以下の一文を追記します。
```
config.i18n.default_locale = :ja
```
![スクリーンショット 2022-08-01 17.55.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737125/f474e718-977b-f395-fea8-f1ea6b2a1ed3.png)


これでなんとか、バリデーションエラーを日本語で表示することができました。



記事を書いてみて思ったのですが、想像以上に体力を奪われますね...
素敵で、内容の濃い記事を書いてくださる皆様には感謝しかないです。自分にも相手にもみやすい記事を少しずつ心がけながらやっていこうと思います。
【AWS】AWS Certificate Manager (ACM)

# SSLとTLS
基本的な概念は同じ。SSLの進化系がTLS。

https://www.idcf.jp/rentalserver/aossl/basic/ssl-tls/


# 証明書
上記はサーバーの信頼性を確認するためのサーバ証明書が利用されている。
Let's Encryptとかがよく知られているが、もちろんAmazonさんが認証してくれるものがある。
それがACM。

# ACMが連携可能なサービス
 EC2に直接証明書をインポートすることはできないことに注意。

・ELB
・CloudFront
・Elastic Beanstalk
・API Gateway
・Nitro Enclaves
Octave で棒グラフを描く

# Octave で棒グラフを描く

    bar(y)
    bar(x, y)
    bar(..., w)
    bar(..., style)
    bar(..., prop, val), ...)
    bar(hax, ...)
    h = bar(..., prop, val), ...)
    
    水平棒グラフは barh()。引数は bar() と同じ。

    w: 棒の幅（デフォルトは 0.8）
    y が行列の場合は列ごとの棒グラフを描く。
    style: "grouped"（デフォルト） 隣り合わせに配置
    　　　　　　　　　　　　　　"stacked" 積み上げ棒グラフ
           "hist" 棒の間に隙間を置かない。中央揃え
           "histc" 左揃え
    prop, value の対
      "facecolor", "edgecolor"
      "r", "g", "b", "k", "none", [r g b] など
    h: 戻り値は，作られた棒グラフのハンドルベクトル（使用例参照）    


```matlab
pkg load statistics

clf;
y = binopdf(0:10, 10, 0.35);
bar(0:10, y, "facecolor", [0.9297 0.9648 1])
box off  % default is on     図の外枠を描かない
set(gca, "tickdir", "out") % ティックマークを外側に描く
xlim([-1, 11])
ylim([0, 0.3])
title("binomial distribution\nn = 10, p = 0.35")
xlabel("x")
ylabel("p")
set(gca, "fontsize", 18) %   一括して変更するとき

```


![output_1_0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2611739/87c62d56-62dd-bfdc-3202-c9ae48eaa487.png)




```matlab
pkg load statistics

y = [binopdf(0:10, 10, 0.15)', binopdf(0:10, 10, 0.35)', binopdf(0:10, 10, 0.5)'];

clf;
h = bar(0:10, y, "hist");
set(h(1), "facecolor", [0.9297 0.9648 1]);
set(h(2), "facecolor", [0.8 0.9 0.5]);
set(h(3), "facecolor", [0.9 0.7 0.6]);
box off  % default is on     図の外枠を描かない
set(gca, "tickdir", "out") % ティックマークを外側に描く
xlim([-1, 11])
ylim([0, 0.35])
title("binomial distribution\nn = 10, p = [0.15, 0.35, 0.50]")
xlabel("x")
ylabel("p")
set(gca, "fontsize", 18) %   一括して変更するとき

```


    
![output_2_0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2611739/3e178c5d-6ffb-00ed-6453-eaf7e82c7868.png)

    



```matlab
pkg load statistics

y = [binopdf(0:10, 10, 0.15)', binopdf(0:10, 10, 0.35)', binopdf(0:10, 10, 0.5)'];

clf;
h = barh(0:10, y, "histc");

set(h(1), "facecolor", [0.9297 0.9648 1]);
set(h(2), "facecolor", [0.8 0.9 0.5]);
set(h(3), "facecolor", [0.9 0.7 0.6]);

box off  % default is on     図の外枠を描かない
set(gca, "tickdir", "out") % ティックマークを外側に描く
ylim([-1, 11])
xlim([0, 0.35])
title("binomial distribution\nn = 10, p = [0.15, 0.35, 0.50]")
ylabel("x")
xlabel("p")
set(gca, "fontsize", 18) %   一括して変更するとき
```


    
![output_3_0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2611739/bc69c19c-14b2-aa6e-b627-65e4d97a5d5c.png)

    



```matlab
pkg load statistics

y = [binopdf(0:10, 10, 0.15)', binopdf(0:10, 10, 0.35)', binopdf(0:10, 10, 0.5)'];

clf;
h = barh(0:10, y, "stacked");

set(h(1), "facecolor", [0.9297 0.9648 1]);
set(h(2), "facecolor", [0.8 0.9 0.5]);
set(h(3), "facecolor", [0.9 0.7 0.6]);

box off  % default is on     図の外枠を描かない
set(gca, "tickdir", "out") % ティックマークを外側に描く
ylim([-1, 11])
xlim([0, 0.55])
title("binomial distribution\nn = 10, p = [0.15, 0.35, 0.50]")
ylabel("x")
xlabel("p")
set(gca, "fontsize", 18) %   一括して変更するとき
```


    
![output_4_0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2611739/6c390d39-8670-5ae4-86a2-615584f0b6e1.png)
AWS ECS Execに必要なTask IDをコマンドラインから取得

# はじめに

最近AWSのインフラ構築にTerraformを使いはじめて少しずつではあるが使えるようになってきた。
当面はコンテナ環境を構築したいのでFargateを使うのだけどもやはりコンテナ内へのシェルログイン機能がほしい。

## 当方の環境

Linux環境で実施しているが同様の環境が作れるならOSは問わないと思う。

* aws-cli/2.4.24 Python/3.8.8 Linux/4.15.0-189-generic
* session-manager-plugin
* GNU Make 4.1
* GNU Awk 4.1.4
* jq-1.6

aws-cliとsession-manager-pluginは絶対必要だけどもそれ以外は無くてもコマンドライン操作のコピペでなんとかなる。

# 実装

## ECS Exec

そこでECS Execの出番となり、以下のサイトなどを参考にやってみた。

https://zoo200.net/ecs-fargate-execute-command/

設定方法は上記を参考にしていただくとしてExecの実行は 

```shell
aws ecs execute-command --cluster クラスター名 \
--task タスクID \
--container コンテナ名 \
--interactive --command OSコマンド
```

となり、必要な情報を与えればよいのだが、タスクID以外は事前に自分の設定値なので把握できる。
そしてそのタスクIDだがTerraformのoutputで取得できないかと調べたができなさそうだった。

## Task IDの取得

[同じようなことを苦労されている](https://qiita.com/willco21/items/7ace03b5b2032070d1ff)ようだったので参考にしたかったが、もう少しすっきりやりたかった。

## その結果

まあこれでいいんじゃないかなレベル。
細かくは検証していない。

```shell
# クラスタ名がmy-clusterの場合
aws ecs list-tasks --cluster my-cluster | jq -r '.taskArns[]' | awk -F'/' '{print $3}'
```

結果

```shell
x0123456789012345678901234567890123456789
```

出力した値を`--task`に渡してやれば良い。

## 完成版

`--profile`や`--region`オプションは無くてもよいが自分の環境には必要なので書いておく。


```makefile
MAKEFLAGS += --warn-undefined-variables
SHELL := /bin/bash
.SHELLFLAGS := -eu -o pipefail -c
.DEFAULT_GOAL := help

# all targets are phony
.PHONY: $(shell egrep -o ^[a-zA-Z_-]+: $(MAKEFILE_LIST) | sed 's/://')

# ここは各自の設定に書き換える
PROFILE=default
REGION=ap-northeast-1
CLUSTER=my-cluster
CONTAINER=nginx

get-task-id: ## Get Task ID
	$(eval TASK_ID := $(shell aws ecs list-tasks \
	--profile ${PROFILE} \
	--region ${REGION} \
	--cluster ${CLUSTER} | \
	jq -r '.taskArns[]' | awk -F'/' '{print $$3}'))

ecs-exec: get-task-id ## Ecs Exec
	@aws ecs execute-command \
	--cluster ${CLUSTER} \
	--profile ${PROFILE} \
	--region  ${REGION} \
	--task ${TASK_ID} \
	--container ${CONTAINER} \
	--interactive --command /bin/sh

help: ## Print this help
	@echo 'Usage: make [target]'
	@echo ''
	@echo 'Targets:'
	@awk 'BEGIN {FS = ":.*?## "} /^[a-zA-Z0-9_-]+:.*?## / {printf "\033[33m%-30s\033[0m %s\n", $$1, $$2}' $(MAKEFILE_LIST)
```

### 使い方

```sell
make ecs-exec
```

結果(最後のところでプロンプトが表示されておりログインできている)

```shell
The Session Manager plugin was installed successfully. Use the AWS CLI to start a session.

Starting session with SessionId: ecs-execute-command-xxxxxx
# 
```

### 解説

`ecs-exec`を実行するだけだが、その実行前に`get-task-id`タスクが呼び出され環境変数TASK_IDがセットされる。

# 最後に

別にMakefileは使わなくてもよいけどタスクIDを取得する手間が省けてワンライナーでシェルアクセスできるので便利。
あと、今回の話に関してはTerraformまったく関係ないのでFargate+ECS Execの環境構築ができていれば使える。

# リンク

* [ECS ExecでFargateのコンテナの中に入ってデバッグする \(execute\-command\) Terraform版 \| zoo200's MemoMemo](https://zoo200.net/ecs-fargate-execute-command/)
* [ECS Exec を有効化する手順（Fargate/Terraform の場合） \- Qiita](https://qiita.com/tonluqclml/items/ef20541dbefb46e6a193)
* [【ECS】 【Fargate】TASK実行container内でTask ID を取得するスクリプト \- Qiita](https://qiita.com/willco21/items/7ace03b5b2032070d1ff)
「部分分数分解(Partial fraction decomposition)」についてwolframalphaとsympyで調べてみた。

オリジナル
定義はwikipediaにあります。
効果?有理式の和分や積分においては、部分分数に分解することで計算が楽になることがある。＜

https://ja.wikipedia.org/wiki/%E9%83%A8%E5%88%86%E5%88%86%E6%95%B0%E5%88%86%E8%A7%A3#:~:text=%E4%BB%A3%E6%95%B0%E5%AD%A6%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E9%83%A8%E5%88%86%E5%88%86%E6%95%B0,%E3%81%AF%E5%88%86%E6%AF%8D%E3%81%AE%E6%AC%A1%E6%95%B0%E3%82%88%E3%82%8A

https://en.wikipedia.org/wiki/Partial_fraction_decomposition

# wolframalphaに

有理式を最小の分母を使った項の和に書き換える．

https://reference.wolfram.com/language/ref/Apart.html

# sympyに

SymPy’s built-in function apart()

https://mattpap.github.io/scipy-2011-tutorial/html/partfrac.html


# 入試問題

https://qiita.com/mrrclb48z/items/b97d64b7a0fa185cdeae

(20220728)他問題多数あります。

https://kamelink.com/blog/tag/%E9%83%A8%E5%88%86%E5%88%86%E6%95%B0%E5%88%86%E8%A7%A3/

# 参考

数値代入法,係数比較法＜恒等式の意味・方程式との違い・関連する問題

https://manabitimes.jp/math/772


オンラインで partial fraction decomposition calculator 多数あります。
2022年8月 AIOps 定点観測

# 概要
AIOps の動向や学習のため、Google で AIOps を検索した結果を記録している記事です。

# 2022年8月1日の検索結果 (リスティング広告)

![20220801_AIOps_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2345504/76552a15-74c2-bc09-0828-67462c2237f6.png)


* Dynatrace
* HPE
* Splunk

リスティング広告に大きな動きが！ 
4か月連続トップだったIBM が消えてしまい。 Dynatrace と HPE が掲載されています。

先月の結果はこちら --> [2022年7月 AIOps 定点観測](https://qiita.com/mkodera/items/338078aa05801c3de545)

# 2022年8月1日の検索結果 (広告以外)

![20220801_AIOps_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2345504/1dc9d89c-a5c1-4b83-f3d9-f49c38aca18d.png)


* Splunk
* JBSVC
* ServiceNow
* ITmedia
* NTTデータ

広告以外だと、上位2位までは2022年2月の定点観測開始以来、不動の2社です。 3,4位も先月と変わらず。

先月の結果はこちら --> [2022年7月 AIOps 定点観測](https://qiita.com/mkodera/items/338078aa05801c3de545)
gulpをローカルにインストールして、Dart Sassのコンパイル環境を整える

題の通りです。
私の備忘録として、ロカールにGulpインストールしてDartSassコンパイル環境を整えます。

環境はWindows11Home。Node.jsは8.5.5
C:\Users\hogehoge\Desktop\task\sassにwwwプロジェクトを作成。


# pacakge.jsonの作成
```
npm init -y
```

# 次にgulpをインストール。
```
npm install --save-dev gulp
```

# gulpを実行するために必要なパッケージを入れる。
以下、[gulpでDart Sassのコンパイル環境構築](https://hakoirioyaji.com/blog/gulp-dart-sass/)参照、Node形式にして以下のようにする。
```
npm install gulp-notify gulp-plumber gulp-debug -D
```

# Dart Sassをコンパイルするために必要なものを入れる。
```
npm install gulp-dart-sass gulp-autoprefixer gulp-sourcemaps -D
```

gulpfile.jsとかは参照元の[gulpでDart Sassのコンパイル環境構築](https://hakoirioyaji.com/blog/gulp-dart-sass/)がかなり詳しく書いてくれているので割愛。

以上。
Python日記#2

# Pythonのアルゴリズム
下記のプログラムは1以上N以下の整数のうち、十進法での各桁の和がA以上B以下であるもの総和を求める問題です。
入力の形
N A B
例.14 2 4 が入力された場合
45が出力される。

下記がコードになります。
```python
def Sample3():
    # 整数nの各桁の和を求める関数
    def sum(n):
        sum_1 = 0
        while n > 0:
            sum_1 += n % 10 # 10で割った余り
            n //= 10
        return sum_1
    N, A, B = map(int, input().split())
    result = 0
    for i in range(1, N + 1):
        if A <= sum(i) <= B: # A以上B以下
            result += i
    print(result)
Sample3()
```
以上になります。