OmniAICreator/Qiita-1.07M huggingface dataset:
Confluence：Excel VBAからConfluenceのページを取得する (Server/DataCenter)


# 手順
## １．VBA-JSONの追加

### １）以下よりVBA-JSONをダウンロードします

https://github.com/VBA-tools/VBA-JSON

### ２）「JsonConverter.bas」 をプロジェクトに追加します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/81cd0198-6aa6-40f6-35ad-038faa13b104.png)


## ２．参照設定の追加
「Microsoft XML v6.0」と、「Microsoft Scripting Runtime」を追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/c04282e1-5844-3082-d9ad-f51cfb6a1e53.png)

## ３．VBAコードの追加

Microsoft Visual Basic for Applications を開き、次のコードを入力し、実行します。

```vb
Sub GetPage()
  Dim ohttpReq As New XMLHTTP60
  Dim dJsonParsed As Dictionary
  Dim sUrl As String

  ' 取得したい情報（項目）を増やしたい場合はexpandの値を変更する
  ' 以下の場合は本文とラベルを指定している
  sUrl = "https://<ConfluenceのベースURL>/rest/api/content/<ページID>?expand=body.storage,metadata.labels"

  ' HTTPリクエストする
  With ohttpReq
    .Open "GET", sUrl
    .setRequestHeader "Authorization", "Basic <Basic認証のユーザー名とパスワード(Base64エンコード)>"
    .setRequestHeader "Content-Type", "application/json; charset=UTF-8"
    .setRequestHeader "X-Atlassian-Token", "no-check"
    Debug.Print .responseText ' HTTPレスポンスをイミディエイトに出力

    ' パース結果は dJsonParsed("id")　や dJsonParsed("space")("id") のような形で取得可能
    Set dJsonParsed = JsonConverter.ParseJson(.responseText)
  End With
End Sub
```
cronを設定してADR設定ホーム内の診断データを削除

#はじめに
Oracle Database 11gから、ログファイルなどのデータベースの状況確認や診断に使用するデータは、ADR（Automatic Diagnostic Repository： 自動診断リポジトリ）で一括管理されるようになりました。
ADRには、データベースのすべての診断情報（ログ、トレース、インシデント、問題など）が含まれています。ただし、診断情報は肥大化し、ディスク容量を逼迫することがあります。その場合、DB正常の動作を保つために定期的に診断データをpurgeする必要があります。

#ADRCI
ADRを管理するために、ADRCIと呼ばれるコマンドラインインターフェイスもあります。ADRCIを使って診断データをpurgeすることができます。
ADRCIはバッチ・モードを使用することができます、バッチ・モードで実行した場合、入力を求めるプロンプトが表示されることなく、一連のADRCIコマンドを一度に実行できます。

例： 7日(10080分)より前のすべてのTRACEファイルを削除します。

``` 
adrci exec="set homepath diag/rdbms/dbpubse_nrt1fd/dbpubse;purge -age 10080 -type TRACE"
```

※homepath を環境に合わせて設定してください。


#定期的に診断データをpurge

１. 診断データを削除するshell作成
例：7日より前のすべてのTRACEファイルを削除するshell
ファイル名：/home/oracle/purgetrace.sh

```
#!/bin/bash
export ORACLE_SID=dbpubse
export ORAENV_ASK=NO
export PATH=/usr/local/bin:$PATH
. /usr/local/bin/oraenv
adrci exec="set homepath diag/rdbms/dbpubse_nrt1fd/dbpubse;purge -age 10080 -type TRACE"
```
※ORACLE_SIDとhomepath を環境に合わせて設定してください。

２．実行権限追加

```
 chmod u+x /home/oracle/purgetrace.sh 
```

３. Oracleユーザーcrontab設定
例：毎日１時上記のSHELL実行

``` 
0 1 * * * /home/oracle/purgetrace.sh
```

#参考資料
[Simple cron job to purge Automatic Diagnostic Repository](http://backwoodsdba.blogspot.com/2013/10/simple-cron-job-to-purge-automatic.html)
[cron（クロン）設定・書き方の基本](https://www.kagoya.jp/howto/it-glossary/server/cron/)
[ADRCIコマンド・リファレンス](https://docs.oracle.com/cd/E57425_01/121/SUTIL/GUID-482FB608-CB5F-4EB1-83AA-BABCE72D51D3.htm)
[OCI DBインスタンスでADRCIユーティリティを使う](https://qiita.com/liu-wei/items/d1a5f3c74c3da0ff349a)
SSISのスクリプトタスクが開けなくなった時

## 「スクリプトの編集(S)」が反応しない

スクリプトタスクのVBやC#のコードを見ようと、
「スクリプトの編集(S)」を押すも反応なし

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123580/b57881a9-0da3-4c35-ea2e-3bb7e0a2bc55.png)

## 対策 VisualStudio Tools for Applicationを修復しよう

`Microsoft Visual Studio Tools for Applications`をコントロールパネルから探し、修復を行う。
画像は2019のバージョンのもの。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123580/ce133ce4-4bf6-16f3-101e-a209df1fd0e4.png)

## まとめ

これで治りますが、そもそも開けなくなった原因は不明。
SSISは、この手のよくわからないエラーがつきものです。
どなたか原因がわかる方いたらコメントお待ちします。
RxSwiftのVariableは廃止。VariableからBehaviorRelayに変更する時のメモ


RxSwift4でVariableが廃止されてる。
リプレイスの時とかのメモ。


### やること

・VariableをBehaviorRelayへ変更
・BehaviorRelayの()に(value: hogeを追加
・.valueってのをacceptへ変更

```swift:
let myVariable = Variable<Bool>(true)
myVariable.value = false
```



```swift:
let myBehaviorRelay = BehaviorRelay<Bool>(value: true)
myBehaviorRelay.accept(false)
```



### 参考


https://qiita.com/mesummery/items/7ffe707c2f3097b44297


https://medium.com/koolicar-engineering/rxswift-behaviorrelay-over-variable-182865ce10e0
MySQL 8.0.25 インストール後からユーザー作成まで

##はじめに

本記事では、MySQLをインストールしてユーザーを作成するまでの手順を述べます。
※ MySQLのインストール方法は載せてないので、ご了承ください。

環境
macOS Big Sur バージョン 11.6
MySQL 8.0.25

###補足
MySQLのバージョンはサーバーを起動する前に、以下のコマンドで確認できます。

```
$ mysql --version
```

##解説
それでは、ユーザー作成の手順を述べます。
まず、サーバーを起動します。

```
$ mysql.server start
```

SUCCESS!が表示されたら、rootユーザーでログインします。

```
mysql> mysql -u root -p
```

パスワードを聞かれるので、入力します。

```
Enter password:
```

これでrootユーザーでログインできました。
createコマンドでユーザーを作成していきます。
今回、ホストはlocalhostで設定しています。

```
mysql> create user `ユーザー名`@`localhost` IDENTIFIED BY 'パスワード';
```

正しく追加できていれば、以下のコマンドで追加したユーザーが表示されます。

```
mysql> SELECT Host, User FROM mysql.user;
```

ユーザーを作成しただけでは、データベースのアクセス権限がないので付与してあげる。

```
mysql> GRANT ALL ON データベース名.* TO 'ユーザー名'@'localhost';
```

これで権限の付与が完了です。
以下のコマンドで権限を確認できます。

```
mysql> show grants for 'ユーザー名'@'localhost';
```

##おわりに
MySQLをインストールしてから、ユーザーを作成するまでの手順を記載しました。
[Ruby]モジュールについて

# はじめに
本記事では、`モジュール`について記述します。

# モジュールとは
モジュールは、`機能`を1つずつ分けて`他のファイルから読み込める`ようにした`処理のまとまり`のことです。

```ruby
module A
  def A_method
    "A_method"
  end
end

class B
  include A
  def B_method
    @B = 2
  end
end

object = B.new
object.A_method
```

moduleAをclassBにincludeすると、
moduleAに含まれているメソッドをclassBのインスタンスが使えるようになります。
```

```
「流れ」

object
↓クラスへの参照
クラスB
↓include
モジュールA

というような探索の流れになります。
```

クラスが複数のモジュールをincludeした場合

```ruby
module A
  def A_method
    "A_method"
  end
end

module B
  def B_method
    "B_method"
  end
end

class C
  include A
  include B
  def C_method
    @C = 3
  end
end

object = C.new
object.A_method
```

```
「流れ」

object
↓クラスへの参照
クラスC
↓include
モジュールB
↓include
モジュールA

というような探索の流れになります。

探索の順番として、最後にincludeしたモジュール（ここではB）から探索します。
```

## prepend
prepend = 「追加する」 by Google先生

`追加する`という形なので、
includeとはまた違う探索の流れになります。

```ruby
module A
  def A_method
    "A_method"
  end
end

class B
  prepend A
  def B_method
    @B = 2
  end
end

object = B.new
object.A_method
```

```
「流れ」

object
↓クラスへの参照
モジュールA
↓クラスへの参照
クラスB
↓prepend
モジュールA

というような探索の流れになります。
```

複数のモジュールをprependする場合。

```ruby
module A
  def A_method
    "A_method"
  end
end

module B
  def B_method
    "B_method"
  end
end

class C
  prepend A
  prepend B
  def C_method
    @C = 3
  end
end

object = C.new
object.A_method
```

```
「流れ」

object
↓クラスへの参照
モジュールB
↓クラスへの参照
モジュールA
↓クラスへの参照
クラスC
↓prepend
モジュールA
↓prepend
モジュールB

というような探索の流れになります。

prependもincludeと同様に、後にprependしたモジュールBから先に探索される。
```

　以上です。


# 終わりに
基礎の部分の定着のために、
明日は、基本情報技術者試験のテキストで学習しようと思います。

以下参考サイトです。
[Rubyのmoduleの使い方とメリットを理解して脱初心者！](https://techplay.jp/column/536)
[【ruby】 メソッド探索から見る、モジュール・特異メソッド・特異クラス](http://at-grandpa.hatenablog.jp/entry/2016/02/14/090544)

明日も頑張ります！
【NLP】医療系タスクに使える自然言語処理モデル一覧

###初めに
今回の記事はSIGNATEの医学論文の自動仕分けチャレンジで使用した医学系のモデルをまとめました。
どのモデルもHuggingfaceから使用できるモデルなので簡単にすぐ使用できます。ざっくりとモデルの概要説明のみ記載しているので詳しい仕組みや学習時のパラメータ設定、モデルのベンチマークなどは論文内の情報を参照してください。

https://signate.jp/competitions/471

###前提知識
まずは、前提として医療系モデルの事前学習に使用されるメジャーなデータセットの解説
**・Pubmed**
　生命科学や生物医学に関する参考文献や要約を提供する検索エンジン。アメリカ国立衛生研究所のアメリカ国立医学図書館（NLM）が情報検索Entrezシステムの一部としてデータベースを運用しています。
**・PMC**
　アメリカ合衆国の国立衛生研究所 (NIH) 内の国立医学図書館 (NLM) の部署である国立生物工学情報センター (NCBI) が運営する、生物医学・生命科学のオンライン論文アーカイブです。
**・MIMIC-III**
　MIMIC-IIIは、2001年から2012年の間にベスイスラエルディーコネス医療センターの救命救急ユニットに滞在した4万人以上の患者に関連する匿名化された健康関連データを含む、大規模で無料で利用できるデータベースです。データベースには、人口統計、重要な情報などの情報が含まれています。

次に用語など
**・BLURB(Biomedical Language Understanding and Reasoning Benchmark)**
簡単に言うと生物医学に特化したベンチマークを図るためのデータセット。今回使用するモデルは[こちら](https://microsoft.github.io/BLURB/index.html)のサイトのベンチマークを参考にしました。

**・NAACL**
「NAACL」は世界中の研究者によって定期開催される国際会議で、「ACL」「EMNLP」※3と並び、自然言語処理分野（NLP）でもっとも権威ある国際会議のひとつです。



###モデル紹介
**BioELECTRA(2021):**
概要：
NAACL2021で発表されたモデルで、pubmed,PMCの全データで事前学習済みのELECTRA。ELECTRAはBERTが事前学習としてMLMで学習を部分をGANのGeneratorとDiscriminatorで学習するように置き換わっているモデルです。

論文：https://aclanthology.org/2021.bionlp-1.16.pdf
事前学習済みモデル：https://huggingface.co/kamalkraj/bioelectra-base-discriminator-pubmed-pmc-lt
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597600/e373b546-d6f7-71b4-88e2-f6d81f4ce298.png)
図：ERECTRAの事前学習


**SapBERT(2021):**
概要：
SapBERTはNAACL2021で発表された事前学習モデルの改善手法です。これは少し特殊でモデルではなくすでに事前学習済みのモデルをさらに改善するための手法が提案されています。Umlsデータセットをもとに同音異義語や単語の表記ゆれなどを改善することにより精度改善につながったようです。今回のコンペではSapBERTを適用したPubmedBERTがCV、PublicLBともにダントツで優秀でした。（LBが微妙だったため提出できなかったのが悔やまれる）
論文：https://arxiv.org/abs/2010.11784
事前学習済みモデル：https://huggingface.co/cambridgeltl/SapBERT-from-PubMedBERT-fulltext

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597600/23de3eb1-398e-523c-18ed-83b40f3b86ce.png)
図：SapBERT適用後の単語分布

**Umls BERT (2021):**
概要：
NAACL2021で発表されたモデルで、BioBERT, Clinical BERTの発展形モデル。論文内既存のモデルたちは固有コーパスによって専門用語を学習することには成功したが、医者が持っているようなドメイン知識は獲得できていないと述べています。そのためUMLSを導入することにより、単語間の関係性も学習することが可能になることで、既存モデルを超える精度を実現しています。

論文：https://arxiv.org/pdf/2010.10391.pdf
事前学習済みモデル：https://github.com/gmichalo/UmlsBERT

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597600/3d59f0af-19d6-e5b6-52a7-7c19d685ff9f.png)
図：Umls BERTの事前学習


**RoBERTa-base-PM(2020)**
概要：
EMNLP2020で発表されたモデルで、Pubmed,PMC,MIMIC-IIIなどのデータセットを事前学習済みのRoBERTaモデル。
Base,distil,largeの3パターンと学習データセットごとにそれぞれモデルが用意されています。
論文：https://aclanthology.org/2020.clinicalnlp-1.17.pdf
事前学習済みモデル：https://github.com/facebookresearch/bio-lm
Layer付きのAWS Lambda functionをServerlessFrameworkでローカル実行するとLayerが参照できない

# 概要

タイトルの通り、Layerを用いて一部ライブラリを共通化しているAWS Lambda functionを、serverlessでローカル実行しようとした時につまずいたので備忘録として残しておく。

# 経緯

最近、趣味でAWS Lambda上で動かすpythonプログラムを作成していて、デプロイが楽になるとのことなのでserverlessを導入していた。
その際、functionを複数作成しており、一部ライブラリはLayerを用いて共通化していた。

作成したプログラムの構成は以下。

```
プロジェクトルートディレクトリ
├─function1
│  └─src
│     └─handler.py
├─function2
│  └─src
│     └─handler.py
├─layer
│  ├─layer1
│  │  └─layer1のpythonライブラリ・ソース群
│  └─layer2
│     └─layer2のpythonライブラリ・ソース群
└─serverless.yml
```

また、serverless.ymlの記述内容は以下。
（本記事に関係ない細かな設定については省略している）

```:serverless.yml

layers:
  layer1:
    path: layer/layer1
    name: ${self:service}-layer1
    compatibleRuntimes:
      - python3.7
    allowedAccounts:
      - "*"
  layer2:
    path: layer/layer2
    name: ${self:service}-layer2
    compatibleRuntimes:
      - python3.7
    allowedAccounts:
      - "*"
functions:
  function1:
    handler: function1/src/handler.lambda_handler
    layers:
      - { Ref: Layer1LambdaLayer }
      - { Ref: Layer2LambdaLayer }
  function2:
    handler: function2/src/handler.lambda_handler
    layers:
      - { Ref: Layer1LambdaLayer }
      - { Ref: Layer2LambdaLayer }
```

この設定で` sls deploy `コマンドを実行すると、AWSへのデプロイは正常終了し、Lambda上でのpythonプログラムの起動もできるのだが、
何故か` sls invoke local --function {function名}`コマンドによるローカル実行は下記エラーが発生してうまくいっていなかった。

```
ModuleNotFoundError: No module named '{layerに配置したライブラリ名}'
```

どうやら、ローカル実行するとlayerに配置したライブラリが参照できていないらしい。
**AWSにデプロイするとちゃんと動くのに。解せぬ。**

# 解決策

とにかくserverlessでローカル実行するとlayerをうまく参照できていないことがわかったので、コマンド実行時にオプションなどで設定を追加できないか[公式ドキュメント](https://www.serverless.com/framework/docs/providers/aws/cli-reference/invoke-local)を調べてみた。

…うーん、それっぽいオプションは見当たらない。
というかデータ入力の方法についての記述が大半でLayerについての説明なんかは皆無なんだなこれが。

とりあえずオプションを一通り試してみるかー、と半ばやけくそになりかけた時、気になる記述を見つけた。

> --docker Enable docker support for NodeJS/Python/Ruby/Java. Enabled by default for other runtimes.

訳）--dockerオプションは、NodeJS / Python / Ruby / JavaのDockerサポートを有効にします。他のランタイムではデフォルトで有効になっています。

へー。pythonだとDockerはデフォルトで無効化されてるんだー。へー。
**…ひょっとしてこれじゃね？**

serverlessではなくAWS CLIを使ってLambda functionをローカルで実行するときは、ローカルのDocker上にLambdaの実行環境が作成されそこでfunctionが実行されることは知っていたのでそこから連想できた。

とにもかくにも、--dockerオプションを追加してコマンドをたたいてみる。

```
>sls invoke local --function function1 --docker
Serverless: Running "serverless" installed locally (in service node_modules)

（略）

{"statusCode":200,"body":"{\"message\": \"finished . !\"}"}

```

**動いた！！！**

どうやらlayerが参照できなかったのは、docker上で動かしてなかったからだった模様。
作成したfunctionを正しく動かすためにはほぼ本番に近いdocker上の環境で動かす必要があるのに、その設定はデフォルトで無効になっているという…。
いやまあ毎回docker上で動かしていると実行が遅くなったりするし、Lambda functionはLayer使わないものが大半だったりするとデフォルト無効の意義も理解はできるんだが…。
ちょいと公式ドキュメントが分かりづらすぎやしませんかね？

# 結論

Layerでライブラリを共通化したLambda functionがserverlessでローカル実行できない、といった事象に遭遇した方はコマンドに--dockerオプションを付け加えてみてはいかがだろうか。
AWS StepFunctionsで、クロスアカウント でAWS Lambdaを呼び出す

### TL;DR

- Resourceキーの値をLambdaのARNから、`arn:aws:states::: Lambda:invoke` に変更する
- Parametersキーを追加して、呼び出したいクロスアカウント 先のLambdaのARNを指定する
- クロスアカウント先のLambdaには、呼び出し元のAWSアカウントからの呼び出しを許可する必要がある


### 事前準備

1. AWSアカウントを2つ用意する(アカウントA, アカウントB)
2. アカウントBに対して、以下のようなLambdaを用意する

```js
exports.handler = async (event, context) => {

    const response = {
        body: JSON.stringify({
            foo: 'Hello, world',
            bar: 'Goodbye, world',
        })
    };

    return response;
};
```

## 手順

### ステートマシンの定義

まずは、アカウントAで使用するStepFunctionsで使用するステートマシンの定義をしていきます。
今回は、呼び出しだけを確認したいだけなので、シンプルなものにしました。
ここで、大きなポイントとしては、`Resource` の部分で、**LambdaのARNではなく、lambda:invokeを指定**しているところです
そして、`Parameters` の中の `FunctionName` で、呼び出し先のLambdaのARNを指定する必要があります。
こちらの2点を注意していただければ、クロスアカウントでのLambdaの呼び出しが可能になります。

```json
{
  "Comment": "This state machine is for invoke cross account lambda.",
  "StartAt": "Exec",
  "States": {
    "Exec": {
      "Comment": "実行",
      "Type": "Task",
      "InputPath": "$",
      "Resource": "arn:aws:states:::lambda:invoke",
      "Parameters": {
        "FunctionName": "arn:aws:lambda:ap-northeast-1:xxxxxxxx:function:cdkSampleFunction"
      },
      "ResultPath": "$",
      "End": true
    }
  }
}
```

では、上記のステートマシンの定義ファイルを使って、アカウントAでステートマシンを作成します
作成すると、以下のようなフローになると思います

![スクリーンショット 2021-10-06 23.54.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440378/7849da5f-f814-7571-b866-38b38c897b30.png)

Step Functionsで使用するRoleのポリシーは、以下のようになります

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "lambda:InvokeFunction"
            ],
            "Resource": [
                "arn:aws:lambda:ap-northeast-1:[AccountB]:function:[Function]"
            ]
        }
    ]
}
```

### アカウントBのLambdaから、StepFunctionsの呼び出しを許可する

先ほどの手順で、StepFunctionsでのステートマシンが作成でき、Lambdaを呼び出す準備ができました。
ただし、このまま実行すると、クロスアカウント先(アカウントB)のLambdaを呼び出すことができないため、アクセス権限を付与していきます。

1. アクセス権限を付与するLambda関数のページを開き、[設定] タブで、[アクセス権限] を選択します。
2. [リソースベースのポリシー] ペインで、[アクセス権限を追加] を選択します。
3. [ポリシーステートメント] ペインで、[AWS service] (AWS のサービス) を選択します。[サービス] ドロップダウンリストが表示されます。
4. [サービス] ドロップダウンリストで、[Other] を選択すると、テキストフィールドが表示されます。
5. [プリンシパル] に、StepFunctionsのステートマシンを作成したアカウント(アカウントA)の AWS アカウント ID を入力します。
6. [ソース ARN] に StepFunctionsのステートマシンのの ARN を入力します。
7. [アクション] ドロップダウンリストから [lambda:InvokeFunction] を選択します。
8. [ステートメント ID] に、ポリシー内で作成するステートメントを区別する一意のステートメント ID を入力します。
9. [保存] を選択します。

### 呼び出してみる

上記の手順を実施することで、呼び出し元のステートマシンと呼び出し先のLambdaの準備ができました
では、早速、呼び出し元のアカウントAのステートマシンから、「実行の開始」を実行します

そうすると、以下のようなグラフから、成功していることがわかるかと思います。

![スクリーンショット 2021-10-07 0.05.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440378/2788e623-cf50-7560-64d1-3c06807b4dc3.png)

### まとめ

いかがだったでしょうか。
AWS StepFunctionsを使ったクロスアカウントでのLambdaを試してみましたが、意外と簡単に呼び出せることが、わかっていただけたかと思います。
呼び出したLambdaの実行結果をキャッチすることもできるので、クロスアカウントでの実行がより楽になっていくと思います。

### 参考URL

https://docs.aws.amazon.com/step-functions/latest/dg/troubleshooting-service-integrations.html
e資格おすすめ書籍

e資格2021#2に合格しました。受験される方は参考にしていただければと思います。

# 参考書籍
## 必須の3冊をご紹介します!!
### ◯徹底攻略ディープラーニングE資格エンジニア問題集
**通称：黒本**
・最低2周しましょう！できればそれ以上(5周した方も）
・最初に1周して弱いところを補完して勉強すると効率がよい
・深層学習をみっちりやっておくと得点源になる
・とくに各種Optimizerの計算はこの本で覚えました
・どのみち認定プログラムを修了するにはこのレベルの問題が解けないといけない、、
### ◯ゼロから作るDeep Learning 1
**通称：ゼロつく1**
・最低1周しましょう！可能ならコーディングしながら
・ディープラーニング未経験の方はとにかく、何も言わずに、この1冊から勉強することを大変おすすめします
・ニューラルネットワークの順伝播の計算と逆伝播による勾配計算を理解でき、非線形変換や多層化が必要な理由もわかるので、ディープラーニングの理論の基礎を理解できます
・基本的な活性化関数と評価関数とネットワークについて、計算と微分を覚える
・中盤からのCNNで画像データの特性と畳み込み演算、プーリング、ドロップアウトを覚える
・im2colは強敵!!処理の最中の行列の形を頭の中で追えるようにしておく
### ◯ゼロから作るDeep Learning 2
**通称：ゼロつく2**
・最低1周しましょう！
・自然言語処理と時系列系のネットワークを覚える
・RNN、LSTM、GRUそれぞれのセルと内部の計算と微分を覚える
・LSTMの改善パターンが難敵!!でも、「ニューラルネットワークの学習や精度の向上において、何が問題になって、それらにどう対処してきたか」この考え方がとても大事。他のネットワークや最新モデルを学ぶ上でも共通なのでここで身につけると後が楽になる
・終盤のLSTMからAttension, Transformerに発展するところは最新モデル理解の基礎にもなる
Udemy「ネットワークエンジニアを目指す初心者はここから始めよう！「ゼロから学ぶネットワーク基礎」1026

ループ構成とリスク
・Ethernetのようなループは起きない。TTLによって最終的にはIPパケットは破棄される。
・破棄される＝通信ができないなのでループしても問題無しと言うことにはならない。
・冗長構成で異なるルーティングプロトコルを使っている場合に起こりえる。


L３スイッチの特徴
・Layer3スイッチ（L3スイッチ）、マルチレイヤースイッチと呼ばれる。
・ルーティングプロトコルをはじめ、ルータ相当の機能を有する。
・L2スイッチ同様に多くのポートを備える。
・データリンクプロトコルはEthernetのみとなっている。
・標準的なルータ機能は有するが、メーカーや機種により詳細は異なる。
・ASICを使うことでルータよりも高速な処理をおこなうと言われていたが、最近はメリットと言うほどの差はない。


L3スイッチの動作
・受信フレームの宛先MACアドレスを参照する。
　・自分宛以外であればL2スイッチとして動作する。
　・自分宛の場合は上位レイヤーに渡し、ルータとして動作する。


VLAN間通信（１）
・VLANは仮想的なL2スイッチを作成してグループに分ける。
・VLANが異なると通信ができない。

VLAN間通信（２）
・VLANが持つインターフェースでIPアドレスを設定できる。
・異なるVLAN間との通信を中継してくれる。

VLAN間通信（３）
・L３スイッチを使う。
・ルータを使う。
　・L2スイッチ側はVLANタギングを使う。
　・ルータ側はサブインターフェースを使う。

デフォルトゲートウェイ（１）
・Default Gateway(DGW)と呼ばれる。
・ホストがルーティングテーブルに宛先アドレスを持たない場合に転送をおこなう。
・ルータやL3スイッチはDGWになることが多い。


デフォルトゲートウェイ（２）
・IPアドレスはEnd-to-Endで変わることがない。
・MACアドレスは途中で付け替えが行われる。
Pythonのdatetimeはawareとnaiveだよ(nativeじゃないよ)

# Python datetime
pythonの標準ライブラリdatetimneのdatetimeオブジェクトは時刻を扱う。
datetimeにはaware(タイムゾーン情報有)とnaive（タイムゾーン情報無）がある。

```python
from datetime import datetime
from dateutil import tz

print(datetime.today()) # 2021-10-26 23:46:50.725275
print(datetime.today().tzinfo) # None つまりnaive

print(datetime(2021, 12, 31, 19, 55, 40, 0, tz.gettz('Asia/Tokyo'))) # 2021-12-31 19:55:40+09:00
print(datetime(2021, 12, 31, 19, 55, 40, 0, tz.gettz('Asia/Tokyo')).tzinfo) # tzfile('Japan') つまりaware
```

WEBで色んな記事を見ているとnaiveのことをnativeと誤記しているものが散見される。
aware(気づいている)の対義語だからnaive(ものを知らない)。

[公式ドキュメント](https://docs.python.org/ja/3/library/datetime.html) にも書いてある。
>Aware オブジェクトと Naive オブジェクト¶
>日時のオブジェクトは、それらがタイムゾーンの情報を含んでいるかどうかによって "aware" あるいは "naive" に分類されます。

間違えないようにしましょう。

# P.S.
[古い公式ドキュメント](https://docs.python.org/ja/2.7/library/datetime.html) だと公式がnaiveと書くべきところをnativeと間違えている。
CRUD処理 Ruby on Rails(データベース編集方法）

<h3>データベースにおけるデータの編集や削除の方法まとめ</h3>
***
railsのデータベースについて学んでいる時にCRUD処理について学びましたが、なかなか理解ができずまとめてみました。
※本記事では、ageとnameが保存してあるUsersテーブル上で,データの作成、編集方法を記しました。
***
・Create処理（データの追加）

```terminal:
$ User.create(name:”A”,age:100)
```

・Read処理(データを読み込み)

```terminal:
$ User.all　#Usersテーブルのすべてのデータを参照
$ User.find(3) #id名からの読み込み
$ User.find_by(name:”C”)　　#古いものから１つ
$ User.where(age:12)　　#複数の検索
```
・Update処理

```terminal:
$ user = User.find(1) #id(1)のデータをuserに代入
$ user.age = 22 #ageを22に変更
$ User.save #保存
```
・Delete処理

```terminal
$ user = User.find(1) #id(1)のデータをuserに代入
$ User.destroy #削除
```
`Bio::GenBank` なオブジェクトをファイルに書き出す

# `Bio::GenBank` なオブジェクトをファイルに書き出す

`bioruby` で起動したシェルでは、 [`getent` したデータを `savefile` することができる。](http://bioruby.org/doc/Tutorial.rd.ja.html)

`biopython` だと `SeqIO.write()` で書き出すことができる。

しかし、 `bioruby` ではなく Ruby のプログラム内で `Bio::NCBI::REST::Efetch` で取得し、パースして `Bio::GenBank` になったオブジェクトをファイルに書き出したかったので調べた結果を記録する。

## できた方法

`Bio::DB` に実装されている `tags()` と `get()` を使う。

```ruby
obj = ... # Bio::GenBank のオブジェクトが入っている

File.open("sample.gbk", "w") do |f|
  obj.tags.each do |tag|
    f.puts obj.get(tag)
  end
end
```

Ruby の `Hash` は登録順で key と value が保持されているようなのでこれでもとの `gbk` に復元できる。

## できなかった方法

- `to_s`

```ruby
obj = ...

File.open("sample.gbk", "w") do |f|
  f.puts obj.to_s
end
```

`"#<Bio::GenBank:...>"` がファイルに書き出されてしまう。
Linux　パッケージ管理コマンド対応表

# Linuxでのパッケージ管理 
Linuxにはいろいろとパッケージを管理するコマンドがありますが、行っている操作は共通している部分が多いと思っています。
"apt install" や"yum update"、"pacman -R"といったものは、方言のようなものかもしれません。
備忘録、勉強としてまとめてみました。間違いがありましたら、ご指摘お願いします。


| パッケージ管理コマンド | インストール | アンインストール | アンインストール(設定ファイルも含めて削除) |
| ----------------- | -------- | ----------- | -------------------------------- |
| apt | install | remove | purge |
| yum | install | remove | --- |
| pacman | -S | -R | -Rn |
| zypper | in/install | rm/remove | --- |
| dnf | install | remove | --- |


| パッケージ管理 | 更新（リポジトリ） | 更新(パッケージ) | 検索 |
| ----------- | ------------ | ------------ | ---- |
| apt | update | upgrade | search |
| yum | --- | update | search |
| pacman | -Sy | -Syu | -Ss |
| zypper | ref/refresh | up/update | se/search |
| dnf | --- | upgrade | search |
---のところは、対応するコマンドなし。
yum,dnfコマンドには、リポジトリのパッケージ情報を更新するコマンドがありません。(aptだとapt updateに対応するコマンド）
yum updateやdnf updateを実行した場合、yum upgrade,dnf upgradeコマンドが代わりに実行されます。（つまり、パッケージが更新されます。）
pacmanでの-Syオプションをつけての実行は、**推奨されていません。**
zypperコマンドは、installをinなど略して記述することが可能です。
【PHP初心者】PHP(MAMP)×Mac(M1)×VScode環境でデバッグ機能を使えるようにする方法

##　はじめに

プログラミングをしていると、思う通りの挙動にならない場面がよくありますよね。そんな時に役に立つのがデバッグ機能です。

以前Javaでプログラミングしていたときは「Eclipse」という統合環境を使用していたため、デバッグ機能も簡単に使うことができました。

しかし、現在使っている環境はPHP×VScode。
そのままではデバッグ機能を使うことはできません。

デバッグ機能を搭載すべく参考にできそうな情報を調べたのですが、2021年9月時点ではXampp×Mac(M1)×VScodeの設定記事を見つける事ができませんでした。（Windowsの記事はヒットするんですが...）

Macの場合、MAMPの方が参考にできる記事が多く、デバッグ機能の設定もしやすそうだったので、開発環境をXAMPPからMAMPに移行しました。

ということで前置きが長くなりましたが、本記事は**「PHP(MAMP)×Mac(M1)×VScode環境でデバッグ機能(Xdebug)を使えるようにする」**ための備忘録になります。
※PHPのverは8.0.8です。


## 設定の流れ
### 1.MAMPのセットアップ
参考にさせていたのは下記の記事です。

□ 環境構築
→[MacにPHP環境を構築する（MAMP）](https://qiita.com/kutarou197/items/9ea4c7539f869a2959d2)

□ MAMP PROのアンインストール
 →[【MAMP/MacOS】3分で出来る不要なMAMP PROをアンインストールする方法！](https://44igarashi.hatenablog.com/entry/mamp_pro_uninstall)

□ セキュリティ対策
→[MacにWebサーバ構築（MAMP編）]
(https://codeaid.jp/blog/mamp/)

□ MySQLのパスの通し方
→[[Mac] MAMP環境のMySQLにパスを通す方法]
(https://www.searchlight8.com/mamp-mysql-path/)
　　※この後、phpMyAdminにて、再度データベースを作成

### 2.デバック機能

□ デバッグ機能の設定
→[【死ぬほど簡単】MAMPでXdebugを使う方法（VSCode）]
(https://dezanari.com/mamp-xdebug/)

やっとの思いでここまできましたが、なぜかうまく動かない...!!泣

□ 参考
→[【PHP】MAMP環境でXdebugを使いたいが、ブレークポイントで処理が中断されない]
(https://teratail.com/questions/348559)

こちらの記事によると、php.iniの「xdebug.remote_port」のポート番号を確認するようにとのこと。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2054587/0dee9567-b060-38a2-875f-42ef0290642f.png)
ポート番号が確認できません。なんかこの辺が影響してそうです。

「xdebug.remote_port xdebug 3」と調べるといろんな記事が出てきたので、その都度php.iniを変更したのですがなかなか上手くいかず...。

そして最終的にたどり着いたのがこちら。

□ 参考
→https://blog.junpeko.com/xdebug-3-setting
この記事を参考に修正した結果、無事デバッグできるようになりました！!

（XAMP→MAMP→debug機能が使えるようになるまで、かなりの時間がかかりました...。泣）
UIViewとUITableCellの共通化 

# はじめに
こんにちは。
今回は、私がTableViewを使うプロジェクトでよく使っている、`UIView`と`UIViewCell`の共通化について書きます。
`UIView`と`UIViewCell`で同じようなデザインを使うことが多くて、この方法を見つけたときは感動しました。
`TableView`があるプロジェクトでは、ほぼ必ず使ってます。

<a id="#chapter1"></a>
# ViewとCellの共通化が有効な場面
- UITableViewのヘッダーにテーブルの項目タイトルをつけたい時
- 通常はViewとして使う部品をTableViewのCellとしても利用したい

<a id="#chapter2"></a>
# 実装

### 仕組み作り
こんな感じで、プロトコルを1つ作ります。
CellとViewで共通利用したいカスタムビューにこのプロトコルを継承させればOKです。

`extension`に定義した`identifier`は、Cellをインスタンス化するときに使えるので、実装しておきます。

```swift
public protocol CellViewBinder {
    associatedtype ContentView: UIView
    static func contentView() -> ContentView
    static var identifier: String { get }
}

extension CellViewBinder {
    static var identifier: String {
        return String(describing: self)
    }
}
```

こっちがUIViewを継承したカスタムビューをUICellとして利用するために作るクラスです。

```swift
class GenericTableViewCell<View>: UITableViewCell where View: CellViewBinder, View.ContentView == View {

    let customView: View = .init(frame: .zero)

    override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)

        configure()
    }

    required init?(coder: NSCoder) {
        super.init(coder: coder)

        configure()
    }

    private func configure() {
        contentView.addSubview(customView)

        customView.translatesAutoresizingMaskIntoConstraints = false
        customView.topAnchor.constraint(equalTo: contentView.topAnchor).isActive = true
        customView.bottomAnchor.constraint(equalTo: contentView.bottomAnchor).isActive = true
        customView.leadingAnchor.constraint(equalTo: contentView.leadingAnchor).isActive = true
        customView.trailingAnchor.constraint(equalTo: contentView.trailingAnchor).isActive = true
    }
}
```

`customView `に自分の使いたいカスタムビューが入る構造です。
`CellViewBinder`プロトコルを継承しているカスタムビューだけが、`GenericTableViewCell`にビューを突っ込めるという仕様ですね。やはりプロトコル優秀すぎる。

### 実際に使う時

```swift

// Viewで使う時（例えばTableのヘッダーなどで）
func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    return CustomView()
}

// Cellで使う時
guard let cell = tableView.dequeueReusableCell(withIdentifier: CustomView.identifier) as? GenericTableViewCell<CustomView> else {
    return UITableViewCell()
}
// 実際のViewにアクセスするのは、customView経由
let customView = cell.customView

```

<a id="#reference"></a>
# 参考文献
- [GenericなUITableViewCellを使う](https://qiita.com/yosshi4486/items/9cf4c9f97af015702d84)
- https://medium.com/eureka-engineering/thought-about-creating-view-component-ios-3cb8e525461a
ROS×PCL　ROS　Create package

今回はROSのパッケージを作成していきます！

## Requirement
- [ワークスペースの作成](https://qiita.com/kosei1515/items/1e2d22aa5b23eec4a7b4)

## Catkin packageを作るとできるファイル
- package.xml:そのパッケージのメタ情報を記載するファイル
- CMakeLists.txt: catkin buildに必要

## Create package
まずはworkspaceのソースフォルダに移動します

```
cd ~/catkin_ws/src
```

次に```catkin_create_pkg```を使って新たなパッケージを作成します

```
catkin_create_pkg beginner_tutorials std_msgs rospy roscpp
```

ここで，```catkin_create_pkg```はこんな感じで使えますってのを示しときます

```
catkin_create_pkg <name> <depends>
```

ここで```name```はパッケージの名前，```depends```は依存しているライブラリです．さっきのコードで例えるとこんな感じになってます

- package name: ```beginner_tutorials```
- depending liblaries: ```std_msgs```, ```rospy```, ```roscpp```

以上でパッケージ作成は完了です！
おつです！

## next 

## previous

https://qiita.com/kosei1515/items/1e2d22aa5b23eec4a7b4

## references

https://qiita.com/kosei1515/items/bbd73d71aa9bdc6a4467

http://wiki.ros.org/ROS/Tutorials/CreatingPackage
画像編集系のnpmパッケージ(sharp,jimp,node-canvas,etc.)が入らないとき

# 主題

[自分のホームページ](//twosquirrels.pages.dev/)が作りたくて[Getsby](//gatsbyjs.com/)というReactベースの静的サイトジェネレーター(というよりReactを強化してくれるやつ)をいろいろセットアップしていたら、
npmで[gatsby-plugin-manifest](//gatsbyjs.com/plugins/gatsby-plugin-manifest/)をinstallする際[sharp](//npmjs.com/package/sharp)のinstall時に

```
> sharp@0.29.2 install /data/data/com.termux/files/home/source/twosquirrels.pages.dev/node_modules/sharp
> (node install/libvips && node install/dll-copy && prebuild-install) || (node install/can-compile && node-gyp rebuild && node install/dll-copy)

# 中略 (WARN系)

npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! sharp@0.29.2 install: `(node install/libvips && node install/dll-copy && prebuild-install) || (node install/can-compile && node-gyp rebuild && node install/dll-copy)`
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the sharp@0.29.2 install script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

# 後略 (NPMのエラー通知)
```

このようなエラーが出てインストールできずに困っていました。
その時は[Termux](//termux.com/)というAndroidでLinuxのようにコマンドが使えるというとても便利なアプリを使っていたのですが、調べてみるとTermuxでなくても同じような症状が出てる人はいるようなのでそれぞれのプラットフォームでの解決方法について記します。
ただ、普通Termux以外だと自動で後述のlibvipsを入れるようになってるっぽいのでTermux以外は特殊な事例だと思います。~~&thinsp;知らんけど&thinsp;~~

# 解決方法

事前に[libvips](//libvips.org/)という画像処理ライブラリをインストールしとく必要があるそうです。
よくエラー見たら`install/libvips`って書いてあるので一応自力でもわかりそうですが()

## Windowsの場合

[libvipsのGitHub](https://github.com/libvips/build-win64-mxe/releases/latest)から`vips-dev-{アーキテクチャ}-web-{バージョン}.zip`をダウンロードしてちゃんとした場所に解凍し、
なかにある`bin`フォルダのパスを通せばOKです。

2021年現在でのWin10でのパスの通し方は

1. `設定`を開く
2. 検索BOXに`環境変数`と入力
3. `システムの詳細設定の表示`を選択
4. 下にある`環境変数(N)…`を選択
5. 管理者権限を持っていて全ユーザーにパスを通したい場合は下の方の`Path`を、自分だけの場合は上の`Path`を選択  
   (全ユーザーにパスを通したい場合はvipsを全ユーザーがアクセスできる場所に置いときましょう)
6. それぞれの`編集`を選択
7. `新規`から通したいパスを追加
8. `上へ(U)`,`下へ(O)`でいい感じに上の方に持っていきます  
   (同じ名前の実行ファイルがあった場合上にある方が優先されます)
9. `OK`を選択

です。

## Linuxの場合

DebianベースのLinux(=aptが使えるやつ)なら

```shell
#apt update && apt upgrade -y # 必要に応じて
apt install libvips-dev -y
```

でvipsが入るはずです。

aptが使えない場合は僕にはわかりません。自力で調べてください(おい

## MacOSの場合

homebrewを入れとけば

```shell
brew install vips
```

でvipsが入るはずです。

## Termuxの場合

Termuxの場合は

```shell
#pkg update && pkg upgrade -y # 必要に応じて
pkg i libvips -y
```

でvipsが入ります。

# さいごに

```shell
vips -v
```

でvipsのバージョンが出てれば成功です。
その状態でもう一度npmパッケージを入れればちゃんと成功するはずです。

npmのオプション `--ignore-scripts` でスクリプトを無視してvips入れなくてもパッケージを入れるとかは出来るらしいですが、結局使うにはvips必要だと思うのでそれについては解説しません。

この記事があなたのお役に立てたら幸いです。
ありがとうございました。

Termux、登下校時に電車でプログラミングが出来てチョー便利！！

# 参考

- [[reddit] How to get "sharp" library installed in termux using node](http://ニコ.コム/コイイオスオレヒ)
- [[libvips] Install libvips](https://www.libvips.org/install.html)
キャンバスアプリで明細画面を作成する～行番号の採番～

[Sequence関数とForAllの組み合わせでループを実現](https://ippu-biz.com/development/powerplatform/powerapps/like-loop/)で実現することができます。

https://ippu-biz.com/development/powerplatform/powerapps/like-loop/


# サンプルについて
このサンプルは[明細登録画面を作成する](https://qiita.com/fsgwmhr/items/d706196eaf0fc7329c44)の作成例内での実装になります。

https://qiita.com/fsgwmhr/items/d706196eaf0fc7329c44


## 本サンプルの処理概要
<dl>
<dt>①行追加ボタンを押下した時、正しく行が挿入される</dt>
<dd>本サンプルでは途中の行での挿入機能は設けておりません。<br>
常に一番下に新しい番号が採番されるイメージになります。</dd>
<dt>②行削除を行ったとき</dt>
<dd>1行目から最後の行まで連番で採番しなおすようにします。</dd>
</dl>

## 実装について
<dl>
<dt>採番用に変数を宣言</dt>
<dd>採番用に変数COUNT＿LINNOを宣言します。COUNT_LINNOは明細画面生成時に１として宣言され、行追加ボタンを押下するごとに1カウントアップしていく変数です。
</dd>
<dt>①行挿入の機能の実装について</dt>
<dd>行追加ボタンのOnSelectプロパティでCOUNT_LINNOをカウントアップし、コレクションにPatchをかけます。</dd>
<dt>②行削除の機能の実装について</dt>
<dd>行削除を実行させるボタンの<b>OnSelectプロパティで</b>以下を記述。</dd>
</dl>

![qitta_明細番号採番サンプルコード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2218676/1ad724c8-5c41-9992-54b4-e4372dd13d4a.png)

:::note info
ForAll関数で実行している処理はコレクションに保存した明細レコード全ての行番号をパッチしなおしています。
:::

:::note info
コード中のValueプロパティは、Sequence関数を作成で作成された連番のうち「<b>何番目をForAllが実行しているのか？</b>」を示しています。
:::

:::note warn
ForAll関数の中で行数カウント用の変数に更新をかけることはできないためサンプルのようなコードとなっています。
:::

https://docs.microsoft.com/ja-jp/powerapps/maker/canvas-apps/functions/function-forall
>… したがって、UpdateContext、Clear、および ClearCollect 関数は、効果の影響を受けやすい変数を保持するために簡単に使用できるため、 ForAll 関数で使用することはできません。
obniz feat.BAIKIN-MAN!

##パパの目論見##

うちの次女はアンパンマンが大好きでバイキンマンが大嫌いな典型的な2歳児なのですが、

ガチャポンで出てくるのは、決まってバイキンマンだったりします:joy:

今回の企画はバイキンマンを使ったおもちゃを作り、
娘に~~好きになってもらおう~~バイキンマンを克服してもらおうというものです。

逃げる者を追いたくなるのは人間の性でしょうから、近づいたら逃げるバイキンマンを作ります。
###<font color="Red">名付けて、「BYE-BAIKIN-MAN!!」</font>###
obnizを手に入れたので、いざトライ！

##試作品##

https://twitter.com/taka_xedge/status/1452522108227964933?s=20

超振動距離センサとサーボモーターを組み合わせて、動力にしたいと考えました。

この超振動を使えば、地面を叩いてやつらは動くはずである！これは期待できそうだ！

##完成品「BYE-BAIKIN-MAN？」

https://twitter.com/taka_xedge/status/1452850105145389057?s=20

小刻みに震えるバイキンマンが出来上がった。。。笑

ガチャポン排出品のサイズ感を考えてなかった。。。

##番外編##

https://twitter.com/taka_xedge/status/1452851167860383745?s=20

その後タイヤが大きいと、かろうじて前進できることを確認。
**<font color="Red">ただし、バイキンマンではないので却下！</font>**
こっから先は力学？な気がしたので、追い求めるのをやめました。笑

あと、もともとは、動く前にランプが点滅する無駄仕様を取り入れていたのですが、
施行繰り返し過ぎたせいか破壊してしまい、焦げ臭かったのでやめました。


##材料##

　●obniz Board 1Y
　●マイクロサーボ 9G SG90
  　●超音波距離センサモジュール HC-SR04

##ソースコード##

```js
const Obniz = require('obniz');
const obniz = new Obniz('****-****'); // Obniz_IDに自分のIDを入れます

obniz.onconnect = async function () {
    // 超音波測距センサを利用する
    const servo = obniz.wired('ServoMotor', { gnd: 0, vcc: 1, signal: 2 });
    // サーボモータを利用
    const hcsr04 = obniz.wired('HC-SR04', { gnd: 11, echo: 10, trigger: 9, vcc: 8 });
    // RGB LEDを利用　➡不使用
    //const rgbled = obniz.wired('WS2811', { gnd: 4, vcc: 5, din: 6 });

    // ディスプレイ
    obniz.display.clear(); // クリア
    obniz.display.print('Ready');
    
    // setIntervalで一定間隔で処理
    setInterval(async function () {
        // 距離を取得
        let distance = await hcsr04.measureWait();
        // そのままだと小数点以下の桁数がやたら多いので整数に丸めてもよい
        //distance = Math.floor(distance);

        // 距離(mm)をターミナルに表示
        console.log(distance + ' mm');
        // obnizディスプレイに表示
        // 一度消してから距離+mmの単位を表示
        obniz.display.clear();
        obniz.display.print(distance + ' mm');

        // 距離がある程度未満かどうかの判定
        if (distance < 100) { // XXmm = Xcm 以下の場合
            // obnizディスプレイに近接していることを表示
            obniz.display.clear();
            obniz.display.print('GO!BAIKIN-MAN!');
            //rgbled.rgb(255, 0, 0);

            // カウンターで回転回数を制御。180度と0度を繰り返す。
            let cnt = 0;           
            var angle = 0;
            let timerId = setInterval(async function(){
                cnt++
                if(cnt===5){
                  clearInterval(timerId);
                } else {
                  servo.angle(angle);
                  if (angle == 0) {
                      angle = 180;
                    } else {
                      angle = 0;
                    }
                } 
            //rgbled.rgb(0, 0, 0);
            }, 1000);
        }
    }, 1000); // 1000ミリ秒 = 1秒おきに実行
}
```

##実証実験##

せっかくなのでこどもに見せてみました。
（妻のNGが出たので画像/動画はナシです。すみません。）

どうやら、小刻みに震えるバイキンマンでも、見慣れないおもちゃは面白いようです。
分解後、もっかい作ってと言われたので、それなりに面白かったのでしょう。

丁重にお断りしました:angel:

次回作るときはちゃんと前進するバイキンマンを作ってあげたいものです:relaxed:
キャンバスアプリで明細登録画面を作成する覚書

仕事でPower Appsをいじっているので覚書を残していきます。
今回は明細登録画面を作成したときの覚書を記します。

# 処理概要
ギャラリーコントロールとコレクションを使用して実現させます。
## コレクションとは

https://hobby-compass.com/powerapps%E3%81%AE%E3%82%B3%E3%83%AC%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6%E8%A7%A3%E8%AA%AC%EF%BD%9C%E4%BD%9C%E6%88%90%E3%81%8B%E3%82%89%E4%BF%AE%E6%AD%A3%E3%80%81

>コレクションとは**PowerAppsを起動しているときに使う一時的な**データベースでこれをコレクションと呼びます。

## 手順
<dl>

<dt>1. コレクションを用意する</dt>
<dd>コレクションのカラム列にはユーザーにデータ入力させたいデータテーブルの任意の列を疑似的に作ります。</dd>
<dt>2. 画面にギャラリーコントロールを追加する</dt>
<dd>追加したギャラリーは手順1で用意したコレクションに接続させます。</dd>
<dt>3. OnChangeプロパティなどの動作プロパティでコーディング</dt>
<dd>ユーザーが項目を編集するごとに、つまりonChangeプロパティなどでコレクションにCRUD処理を行うようコーディングします。</dd>
<dt>4. Patch文でデータベースにCRUD処理をかける</dt>
<dd>Patch文とForAll関数を使用してコレクションに保存した明細行のデータを、データベースの対象テーブルにCRUD処理をかけます。</dd>
<dd>この処理はボタンを用意してOnSelectプロパティなどに記述しましょう。</dd>

 </dl>

### 行番号の採番について
以下の記事に手順を記載しました。

https://qiita.com/fsgwmhr/items/cf2e0e07b46ab0380545

:::note warn
上記記事は既存行呼出時の採番については考慮していない記事になります。
:::

### 行ごとの操作について
チェックボックスでチェックをつけた行に対して別画面で値を取得したい、等の行ごとの操作はコレクションに**フラグを保存し、フラグの値に基づいて各プロパティで操作する**と良いと思います。

#### Defaultプロパティに入れる値に注意
上記実装を行う場合、Defaultプロパティ（ラベルコントロールならTextプロパティ）に入れる値に注意しましょう。

:::note info
これは、Power Appsの開発は「効果を与える側」のイベントドリブン型ではなく「効果を与えられる側」に処理を記述する開発であるからです。
:::

https://qiita.com/yamad365/items/feed918f9934ee6a2f07#power-apps-%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E8%80%83%E3%81%88%E6%96%B9

#### 明細画面に値を受け渡す検索ウィンドウを実装する場合
変数の値を更新してこの機能を実装しようとした場合、onChangeプロパティは動作しないので注意しましょう。

###登録済データを呼び出す
LookUp関数の結果をForAll関数を使用してコレクションにPatchすればＯＫです。


#### ForAll関数について

https://hobby-compass.com/powerapps%e3%81%aeforall%e3%82%92%e6%a4%9c%e8%a8%bc%e3%81%97%e3%81%a6%e3%81%bf%e3%82%8b%ef%bd%9cpatch%e9%96%a2%e6%95%b0%e3%81%a8%e7%b5%84%e3%81%bf%e5%90%88%e3%82%8f%e3%81%9b%e3%81%a6%e4%bd%bf%e3%81%84/

#参考
- Power Appsでデータソースを操作する関数の一覧としては以下が参考になります。

https://zezeze.hateblo.jp/entry/2018/07/22/033524
コードでTabBarItemの追加

#今回の内容

<img width="150" alt="55578A37-B04A-4AC7-9D02-EC22CC2382D0_4_5005_c.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1466343/bf8eb140-44bd-dea3-14f2-c51ca2d01166.jpeg">  


#コードと簡単解説

* `TodayViewController`と`SearchViewController`が存在すると仮定して進めます。
* まずは、`viewControllers`に入れる為の`UIViewController`を準備します。
* 表示したい`tabBarItem`を`UITabBarItem(title:, image:, tag:)`で設定します。
* `viewControllers = [todayViewController,searchViewController]`で`Tab`を設定していきます。

```Swift:
        let todayViewController = TodayViewController()
        todayViewController.tabBarItem = UITabBarItem(title: "Today", image: UIImage(systemName: "clock.fill"), tag: 0)
        
        let searchViewController = SearchViewController()
        searchViewController.tabBarItem = UITabBarItem(title: "Search", image: UIImage(systemName: "magnifyingglass"), tag: 1)
        
        viewControllers = [todayViewController,searchViewController]
```

# 終わり
ご指摘、ご質問などありましたら、コメントまでお願い致します。
IOSの管理

#はじめに

CCNA試験の勉強をしていて、IOSの管理について勉強したものをまとめています。
ご指摘等ございましたらご教授下さい。

IOSには第１世代と第２世代に分かれています。
IOSイメージファイルによって、使用できる機能とできない機能があります。
第1世代の機器では用途に合わせて、適宜IOSイメージをインストールする必要がありました。
しかし、第２世代ではIOSユニバーサルイメージがインストールされており、
用途別にインストールせずに、ライセンスを購入するだけでアップグレードできます。

##ルータのメモリ領域

ROM
NVRAM
フラッシュメモリ
RAMの4つがあります。
この内、RAMだけが電源が消えると消えます。
これらのメモリを使って、ルータの起動手順を見ていきましょう。

①ROMでPOST(自己診断プログラム)を起動します。
これはインターフェイスやハードウェアは大丈夫かを調べます。

②起動モードは何にするか？
これはROMのブートストラップがNVRAMのコンフィギュレーションレジスタに
起動モードを確認します。

③どのIOSを起動するのか？
ROMのブートストラップがNVRAMのstartup-configのboot systemコマンドに
どのIOSを起動させて良いのかを確認します。

④IOSイメージはフラッシュメモリに保管されているので、
フラッシュメモリから検索をかけます。

⑤IOSイメージが検索できたらRAMにロードします。

⑥ROMのブートストラップからNVRAMのstartup-config boot systemコマンドに
ルータの設定情報はあるか確認します。

⑦startup-configをRAMにロードし、running-configとして
実行します。

##コンフィギュレーションレジスタンス値

たくさんありますが、まずは3パターンだけ覚えるようにしましょう。
0x2100はROMモニターモードで起動。
0x2102はstartup-configのboot systemコマンドで定義されたIOSを起動。
0x2142はNVRAMの内容を無視。

##IOSイメージファイルの読み込み

boot systemコマンドにIOSファイルが指定されていない時、
フラッシュメモリの中の1番目のIOSを起動するが、
もし無いとROMのmini IOSで起動。
しかし、それも無いとTFTPサーバからIOSイメージファイルを読み込む。
これも無いと、ROMモニタモードで起動する。

##IOSのバックアップ

RT#copy running-config tftp
これはrunning-configをTFTPサーバにコピーするコマンドです。

RT#copy flash tftp
これはフラッシュメモリをTFTPサーバに保管します。

RT#copy tftp flash
これは反対にTFTPサーバからフラッシュメモリをダウンロードします。

##パスワードリカバリーの方法

パスワードを忘れた時の方法

①ルータの電源をOFF/ONにする。

②60秒以内にブレーク信号を送信する。

③コンフィギュレーションレジスタ値を変更
0x2142にすることでNVRAMを無視する。

④ルータの再起動

⑤startup-configの読み込み
パスワードは変更したいが、他の設定情報はそのまま

⑥パスワードの変更

⑦コンフィギュレーションモードレジスタ値を元に戻す。

⑧startup-configへ保存する。
AWS WAFで特定パス以下に海外IPアクセス制御

AWS WAF にて、「ALB」に対して、
国内IPではない、かつ、/admin 以下のパス、でのアクセスの場合に、
アクセス制御（「403 Forbidden」エラー）となるように設定したときの備忘録です。


## 1．Web ACL 作成前に /admin 判定の設定

AWS WAF の サイドメニュー「Regex pattern sets」を開き「Asia Pacific (Tokyo)」に切り替え、
[ Create regex pattern set ] 押下

#### Regex pattern set details
・**Regex pattern set name**：`admin`（自由に入力）
・**Description - optional**：（空で登録可能なので空で登録）
・**Region**：`Asia Pacific (Tokyo)`
・**Regular expressions**：`.*/admin*`（/admin 以下）

[ Create regex pattern set ] 押下

## 2．「Regex pattern sets」登録完了後、Web ACL 作成

AWS WAF の サイドメニュー「Web ACLs」を開き「Asia Pacific (Tokyo)」に切り替え、
[ Create web ACL ] 押下

### ▼ Step 1　Describe web ACL and associate it to AWS resources

#### Web ACL details
・**Name**：`myACL`（自由に入力）
・**Description - optional**：（空で登録可能なので空で登録）
・**CloudWatch metric name**：（Nameの入力値が自動入力される）
・**Resource type**：`Regional resources(Application Load Balancer, API Gateway, AWS AppSync)`
・**Region**：`Asia Pacific (Tokyo)`

####  Associated AWS resources
[ Add AWS Resources ] を押下し「Application Load Balancer」からをALBを選択して「Add」を押下
[ Next ] を押下

### ▼ Step 2　Add rules and rule groups

#### Rules
「Add rules」プルダウン「Add my own rules and rule groups」を選択

#### Rule type
・**Rule type**：`Rule builder`

#### Rule
・**Name**：`block-from-overseas`（自由に入力）
・**Type**：`Regular rule`

#### If a request ＞ プルダウン「matches all the statements (AND)」を選択
##### Statement 1 
・**Negate statement (NOT)**：「Negate statement results」にチェックを入れる
　→ チェックを入れると【 Statement 1 】が【 NOT Statement 1 】に切り替わる
・**Inspect**：`Originates from a country in`
・**Country codes**：`Japan - JP`（検索の入力エリアに「jp」など入力するとすぐに見つかる）
・**IP address to use to determine the country of origin**：`Source IP address`

　－ AND －
##### Statement 2
・**Negate statement (NOT)**「Negate statement results」にチェックを入れない
・**Inspect**：`URI path`
・**Match type**：`Matches pattern from regex pattern set`
・**Regex pattern set**：`admin`（「Regex pattern sets」で /admin 以下判定を設定した名前）
・**Text transformation**：`None`

#### Action
・**Action**：`Block`
[ Add rule ] を押下

#### Default web ACL action for requests that don't match any rules
・**Default action**：`Allow`
[ Next ] を押下

### ▼ Step 3　Set rule priority
[ Next ] を押下

### ▼ Step 4　Configure metrics
[ Next ] を押下

### ▼ Step 5　Review and create web ACL
内容を確認して [ Create web ACL ] を押下（ → 完了まで数十秒程かかりました ）

## 動作確認
海外からのアクセスを確認できるツール（サイト）以下2つで検証を行いました。
・「WebPagetest」https://www.webpagetest.org/
・「browserling」https://www.browserling.com/

設定前にアクセス出来ている事を確認し、設定後は「403 Forbidden」になるか確認。

AWS WAF の Web ACLs からも、
Web ACLの詳細画面【 Sampled requests 】にてブロックしたアクセスを確認可能。
プルダウンにて設定したルール名を選択すると、ブロックしたアクセスを絞り込んで確認可能。

## 最後に
「Regex pattern sets」で /admin 以下判定を設定しなくても、
「URI path」のところを**Match type**：`Starts with string`にして、
**String to match**：`/admin`にしてもよかったのかもかもしれません←
Unity：2DTilemapExtrasで2.5D世界にする


この前は2.5D化の中でスプライトシェイプを利用して足場を作ったが、タイルっぽく足場の構築なんかも出来ると便利そうだなぁ、ということで
2Dではなく3Dでタイルをマイクラみたいな感じに配置できる[UnityTile3D](https://github.com/NoelFB/UnityTile3D)
のように、３Dオブジェクトを配置できると便利そう。

少なくともこれはライセンスはMIT Licenseなので利用上特に制約はなし。
ただ、[この動画](https://www.youtube.com/watch?v=ulFc6p3hQzQ)にある2DTilemapExtrasは使い勝手が別物と思われる。
今回作りたいのは2.5Dの世界で3Dはないこともあり、普通にパッケージマネージャーからDL出来るExtrasの方を試してみる。

パッケージマネージャーを開いて歯車から高度なマネージャーよりEnablePreviewPackagesをチェックすると出てくるので、
通常の2DTilmapと両方インストールすると使える。

## タイルマップ
まずは普通に矩形の2Dタイルマップを作成する。
どの方向にタイルマップをセットするかはTilemapの親のGridでXYZの箇所で選択可能。
画面上のOpenTilePaletteでパレットを開いて利用するオブジェクトを選択する。

手持ちに立方体がないので、Assetストアでcubeで検索して無料のAssetをダウンロード

2D PixelArt：3Dなのか2Dなのかよく分からないのでインポートしてみたが、2D画像なので今回使うものではない
CubeWorldBrickBlocks：キューブ状のオブジェクトなのでこれを利用

タイルパレットでGameObjectBrushに変更、Cellsでオブジェクトとしてキューブをセット。
描画ツールでブロックが置ける。

![新しいビットマップ イメージ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2081290/6e4e9b1b-8cab-c841-58bd-8882bd369016.png)

## コライダー

キャラクターとの衝突判定はタイルマップコライダーを設定してもダメだったので、
設定している3Dブロックのプレハブに対してボックスコライダーをセット。
（一応ボックスコライダーに対してコンポジット設定を入れたが、複合コライダーは有効なのかまでは未確認）

これが出来るとボックス的なオブジェクトも配置できるので2.5Dの世界を作りやすくなる。

![新しいビットマップ イメージ (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2081290/64688895-79c3-7397-389b-9a4cc9dd3c19.png)
【PHP】気象庁API から天気予報を取得してみた

# 初めに
ダッシュボード作成のために、天気予報をAPIにて取得する。
1年くらい前の気象庁のHPが大幅リニューアルし、非公式ながらAPIが発見された。そのAPIを用い「天気予報」を取得したいと思う。[気象庁 ](https://www.jma.go.jp/jma/index.html)にて使用されているAPIを使用。詳しいことは[気象庁ホームページ防災気象情報のURL構造](https://qiita.com/e_toyoda/items/7a293313a725c4d306c0)を参考に作成した。
⇒PHPを用い、HP等で表示させる用途を想定

※非公式のため、無保証。アップデート等により使用不可になる可能性もあり。
※[政府標準利用規約(PDF)](https://www.kantei.go.jp/jp/singi/it2/densi/kettei/gl2_betten_1.pdf)に準拠して利用すること

## 環境
- Windows10
- PHP 8.0.6

## データの詳細
エリアのコード(pathCode) 東京は130000
http://www.jma.go.jp/bosai/common/const/area.json

コンテンツの種別は
http://www.jma.go.jp/bosai/common/const/contents.json

テロップ番号
https://plaza.rakuten.co.jp/rabbit77/3000/


# コード
```PHP:jma_weather_api.php
<?php
//気象庁のAPIにて気象情報取得
$url = "https://www.jma.go.jp/bosai/forecast/data/forecast/{エリアコード}.json";

$weather_json = file_get_contents($url);
$weather_array = json_decode($weather_json, true);

$date = $weather_array["0"]["timeSeries"]["0"]["timeDefines"]["0"];
$jma_weather = $weather_array["0"]["timeSeries"]["0"]["areas"]["0"]["weathers"]["0"];
$jma_rainfall = $weather_array["Feature"]["0"]["Property"]["WeatherList"]["Weather"]["0"]["Rainfall"];

echo "日時:" . $date . "\n";
echo "今日の天気:" . $jma_weather. "\n";
echo "雨量:" . $jma_rainfall. "\n";
```
# 終わりに
非公式とは言え、気象庁の情報を簡単に使用できるのは便利ですね。
HPに気象庁の天気予報の掲載ができます。

# 参考サイト

https://qiita.com/e_toyoda/items/7a293313a725c4d306c0

https://mindtech.jp/?p=1754

https://qiita.com/michan06/items/48503631dd30275288f7

https://anko.education/apps/weather_api
ROS×PCL　ROS　Create workspace

今回はROSのワークスペースを作成します！

## Requirement
- [ROS MelodicのInstall](https://qiita.com/kosei1515/items/4da703e9390f98b0247d)

## ROS workspaceとは
ROSのプログラムやパッケージなどを一括で保存しておく場所のことです．
ここでノードを作ったりビルドしたりします

## Create ROS Workspace
まずはターミナルを開き以下を実行します．これは，ROSの環境変数を使うことを宣言しています

```
source /opt/ros/melodic/setup.bash
```

つづいてworkspaceを作成します．ROSではワークスペースの名前を```catkin_ws```と売るのが通例のようです

```
mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/
catkin_make
```

これで完了です！
作成されたワークスペースの環境変数を宣言します

```
source devel/setup.bash
```
このsetup.bashファイルは新しいターミナルを開くごとに毎回実行する必要がありますが、めんどいですよね、、、
そこで以下を実行すればターミナルを開くごとに自動的に読み込ませることができます

```
echo $ROS_PACKAGE_PATH
/home/youruser/catkin_ws/src:/opt/ros/kinetic/share
```

これでワークスペースの作成が完了しました！！

## next

## previous

https://qiita.com/kosei1515/items/4da703e9390f98b0247d

## references

https://qiita.com/kosei1515/items/bbd73d71aa9bdc6a4467
box-shadowを少し綺麗に見せる工夫

# 結論
spread-radiusを指定し、影の広がりを調整する。
# 実装
[box-shadowプロパティのドキュメント](https://developer.mozilla.org/ja/docs/Web/CSS/box-shadow)を参照してみるとbox-shadowには以下4つの値を指定できるとあります。
<br>
*offset-x | offset-y | blur-radius | spread-radius | color*
<br>
**【offset-x,offset-y】**：x,y方向へ影を延ばす距離
**【blur-radius】**：影をぼかす度合い
**【spread-radius】**：影の広がりの度合い
(正の値が指定された場合、影がその分だけ拡張され大きくなり、負の値が指定された場合、影は縮小される。)
**【color】**：色
上記を踏まえてcssを実装します。

```html
<div class="card1">spread-radius指定無し</div>
<div class="card2">spread-radius指定有り</div>
```
```css
.card1 {
  box-shadow: 0 2.5rem 2rem hsl(0 0% 0% / 20%);
  }
.card2 {
  box-shadow: 0 2.5rem 2rem -2rem hsl(200 50% 20% / 40%);
  }
```

これで下の画像のように、影の広がりを調整することで少しシャープな影を作り出すことができたかと思います。
![shadow.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1481264/30b4ab44-e150-fa7a-304a-1c6ce98cb693.png)


本記事については既にご存知の方が多いかもしれませんが、自分は今に至るまでちゃんと理解していなかったので、ポイントをまとめてみました。
個人的にムカつくエンジニアの発言、「Yesです。Noです。」

　新卒で現在の会社に就職してはや3年目、会社の文化もそれとなく慣れてきて触れ合う人も多くなってきたところで、業界の違和感を一つ提唱しようと思う。それが「Yesです。」「Noです。」である。私のいる業界特有なのかもしれないが、周りのエンジニアからよくこの言葉を耳にする。

　どの業界でもそうだと思うが、ある単語や文章が、その業界では一般的な語彙とは違った意味を持つ場合、独自の用語を生み出して会話することがよくある。例えば物理学者や物理の専門家を物理屋さんと呼ぶ場合は、自分と同じ業種のうち物理分野の人を指す。
　それ以外の場合で一般語彙と異なる用語を使うときは、おそらく概ね裏の意味や意図を含有する場合か、単に言い換えた方が楽だからという場合であると思う。前者での代表例は、コンセンサス・エデュケーショナル・プライオリティなどで、後者の代表例は、アポ・リスケなどであろう。前者の言う裏の意味・意図とは案外些細なもので、ちょっと賢く見られたいとか、業界に染まっているプロを演じたいとかな気がする。どうもYes No問題は前者な気がしてならない。

　まず確実に言えることは、はいやいいえの方が圧倒的に短く言いやすいので、言い換えた方が楽だと言うのはない。そして、これくらいの簡単な言葉だと、一般の意味と違う意味で使うことはなかろう。となると、何かしら裏の意味や意図を持った表現に違いない。
　これは仮説なのだが、日本人が断定的に返答をしたがらない文化であり、それは技術者として困るので対比的に英語を持ち出して「YesかNoで答えろ」と誰かが言い出したのではないか。割とあり得る話だと思う。ここで言うYesかNoというのは断定的に答えよという意味であって、文字通りYesとNoを使えということではないのだが、履き違えたか何かで定着したのだろう。

　とはいえ実際にどれくらいの人が日常的にこれを使うかというと、体感3割程度である。日々イラッとしながら観察していると、私のようなペーペーの質問に対してYes,Noを使うことは少なく、人数が多い会議や上司に向かって発することが多いことに気づいた。
　あーこれでなんとなくわかってしまった。これは前に示した「ちょっと賢く見られたいとか、業界に染まっているプロを演じたい」に該当する。そうでなければ僕に対しても使うはずだ。単純に「はい」や「いいえ」を使ってしまうと、「自分は曖昧表現を避けるべきだと言う信念を持っていて回答には断定表現を使うべきだと思っている。自分はそういうところまで考えて一言一言発言している人間である。」と言う意図が伝わらないので、わざわざYesとNoを使っているのではないか。それ以外の理由があるならコメントしてほしい。これに気づいた時、私は金輪際「Yesです。Noです。」を使わないと決めた。

　なんなら私は「はい」と「いいえ」の方が優れていると思う。英語と日本語では質問に対する肯定と否定の概念が異なるからだ。例えば、「あなたはこの資料持っていませんでしたよね？」と聞かれてすでに資料を持っている場合、英語で答えるならYesが正解である。日本語では「いいえ」と答えるわけなので、断定表現を主張するためだけにYes,Noを用いているのか、本当に英語感覚で言っているのか困惑する。
　資料の送付くらいなら別にどっちでも支障ないのだが、これが技術的な話だった場合は本当に厄介である。言ってる本人と受け手で逆の解釈をしてしまって数日間無駄な努力をした挙句、後でそれじゃないって言ったよねと詰められかねない。本当に曖昧表現を避けるための表現をしたいなら、英語と日本語の意味の食い違いを把握した上で、相手に誤解のないようにあえて「はい」と「いいえ」を使うべきである。
Spigotプラグイン開発 ~環境構築・HelloWorld~

##最初に##

・この記事はMinecraftサーバーのプラグインを作りたいけど何の知識もない！　という方向けです。
・もしかしたら間違っていることがあるかもしれませんがご了承ください。





##Intellij IDEAのダウンロード・設定##

JetBrains社のIntelliJ IDEAをダウンロードしていきます。

https://www.jetbrains.com/idea/download/


上のリンクからダウンロードしてください。
プラグインを開発するだけなら **Community** で十分だと思います。

![chrome_76cm29VFtz.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1840949/4af90f99-b96f-78d4-c091-ae5fb0c4fad3.png)

ダウンロードが完了したら開いてNextを押していってください。

![ideaIC-2021.2.3_IY1b3VFyKP.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1840949/333d4e70-7d65-4fed-6541-74426d06a6c7.png)

こんな感じに設定して、

![ideaIC-2021.2.3_MBxBv7Fz3x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1840949/a9a23b93-28f1-4c2a-999b-6f3ef66ae607.png)

ここまでたどり着けば完了です。
後は再起動しましょう。

##IntelliJ IDEAにプラグインのインストール##


先ほどインストールしたIntelliJ IDEAを起動しましょう。
そしたら **Plugins** を押して **Minecraft** と検索してください。

![idea64_BenegMh271.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1840949/e88b5d6a-03eb-99b9-f15a-076fd633c8c3.png)


自分は既にインストールしているので黒くなっていますが、していない方は <font color="Green">Install</font> と出ていると思うのでインストールしていってください。

ここまで出来たら完了です、お疲れさまでした。


#プログラミング#

サーバーに **Hello World** と出していこうと思います。

Projectsから New Project を押してこんな感じに押してください。


![idea64_cJZbW0nWhp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1840949/216baf47-7a39-8919-d999-f3a10af1744b.png)

そして Next を押したら Build Settings が出てくると思います。

Groupidはほかの人と被らないもの Artifactid に TestPlugin と入力してnextを押してください。
![idea64_hCsrsOcnib.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1840949/4ce191dd-3182-340e-1560-98828d486a00.png)

Minecraft Versionは自分の環境にあったバージョンを選択してください。
この記事では1.12.2を使っていきます。

![idea64_K1nBk2di7r.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1840949/c72d1458-4765-311f-804e-fe307bfefb35.png)

そしたらプロジェクトの名前です。
名前はプラグインと関係があるものがいいと思いますが、わかるなら何でもいいです。

![idea64_hMKBS6Uo0P.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1840949/fccf2eb6-3db2-d2d3-d877-078331955a04.png)




この画面まで行けたらいい感じです。

そしたら 

```TestPlugin.java
    @Override
    public void onEnable() {

        Bukkit.getLogger().info("Hello World");

    }

```

このように文を追加しましょう。

そして、右上の三角マークを押してください。
そしたら完了です。

![idea64_ffYlLThuAX.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1840949/494f1845-6e52-d8df-35aa-7a052aacdc2e.png)


#確認してみる#

**Hello World** が出力されるか確認してみましょう。
さっき作ったプラグインはプロジェクトファイルを開いて target をクリックしたら作られていると思います。

そしてoriginalがついてないほうをサーバーの **plugins** に入れてサーバーを起動してみましょう。


![cmd_JB8eqcSZx7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1840949/80baa139-6891-098c-b2db-db6d9049b185.png)

ちゃんと出力されてますね、お疲れさまでした。