OmniAICreator/Qiita-1.07M huggingface dataset:
Instagram Graph APIでネストしたInsightsを取得する方法

# 概要
[`GET /{ig-user-id}/media`](https://developers.facebook.com/docs/instagram-api/reference/ig-user/media#-----2)で、合わせてinsightsを取得したい。
しかし以下のようなエラーが返ってくる。

```
GET /{ig-user-id}/media?fields=id,insights{impressions,engagement}

{
  "error": {
    "message": "(#100) For field 'insights': The parameter metric is required",
    "type": "OAuthException",
    "code": 100,
    "fbtrace_id": "xxxx"
  }
}
```

`fields=id,insights{impressions}&metric=xxx`など色々試してみるがうまくいかない。
insightsを個々に叩けば取得はできるが、APIの制約等鑑みてバルクでネストしてとってきたい。

# 解決方法
`fields=id,insights.metric(impression,engagement)`として指定すると取得できる。

参考）https://codebug.vip/questions-3033537.htm
どんなプログラミング言語から学べばいい

# プログラミング言語とは
プログラミング言語とは、コンピュータを制御する上で必要な言語である。この言語を扱うことによってコンピュータを意図する形に制御することができる。

# プログラミング言語の種類
プログラミング言語には多数の種類が存在する。下記はその一例である。
* html
* C言語
* Java
* Python

上記の言語から自分に合う言語を選択して学習することは結構難しい。

# 筆者が思う簡単なプログラミング言語
筆者はプログラミング初心者が学ぶべき最初の言語はhtmlであると思う。
とりあえず自分のコンピュータ内で何もインストールせずとも表示が可能である。(一部LinuxOSを除く)
htmlなんてホームページビルダーでも簡単に編集はできる。
ただ、ホームページビルダーで制作したページを編集するだけで満足しないでほしい。そのコードをみてほしい。どんな感じで書けばうまく書くことができるのかとにかくいろいろとググってみて調べてほしい

# htmlから広がる世界
htmlの制御方法が分かればそれにデザインを加えるcssの制御方法も学ぶことができると思われる。（そもそもcssの記述をしないと本当つまらないページになってしまうので）

# 動きを持たせるためのJavaScript
単なる色づけだけでなく今度は文字や画像等に動きを持たせるためのJavascriptを別途学んでほしい。そうすればいっぱしのプログラマーである。
みんなホームページくらいは書ける人は多いかもしれないが、意外とこのJavascriptをちゃんと学んでいる人は少ない。簡単な計算を自動で算出してくれるようなプログラミングでもいい。
例えば、テキストボックスに任意の数字を入力して計算のボタンを押すことで足し算をするようなホームページでもいい。これでも初心者にとっては難しい。また、数字の入力等が入ってしまう場合にどのような制御をしたらいいかなんか考え始めると結構いいソース量になってくる。

# （余談）筆者が学んだ最初のプログラミング言語
筆者は実はhtmlから入っていない。まず最初に入ったのはVisualCである。Ｃ言語といえばＣ言語ではあるのだが。実はＣ言語から始めようとすると、最低限VisualStudioなどのIDEやgccなどのセットアップが必要になり、結構面倒なセットアップをしてからプログラミングを始めなくてはならない。

# （余談）大学生が最初に学ぶべきプログラミング言語
多くの人は大学に入ってからプログラミング言語の習得をするはずである。高校生で必修科目でプログラミング言語の習得が必要なところは聞いたことがない。
しかし、なぜか大学生が最初に習う言語の代表格はC言語だったりする。
なぜ、面倒な言語から学習させるのかわからない。。。
Go開発入門 テーブル駆動テストと並列実行

## はじめに

テーブル駆動テストとは、
インプットとアウトプットのテーブルについて
１行ずつテストを繰り返すことです。

テーブル駆動テストには、下記のようなメリットがあります。
- 並列にテストが実行しやすい
- テストケースの変更が容易
- テストが読みやすい
- テストがどこで失敗したのかがわかりやすい

https://github.com/golang/go/wiki/TableDrivenTests

本記事では、サンプルとして偶数判定のテーブル駆動テストを並列で実行することを体験します。
サンプルでは、go modを使用しています。

## 関数を作成

./is_even.go
```   
package is_even

func IsEven(number int) bool {
  return (number % 2 == 0);
}
```

## テストを作成

./is_even_test.go
```
// go test github.com/CobaltSato/mock/unit_test/is_even -parallel 2

package is_even_test

import (
	"testing"

	"github.com/CobaltSato/mock/unit_test/is_even"
)

func TestIsEven(t *testing.T) {
	t.Parallel()

	// テストケース
	cases := map[string]struct {
		in   int
		want bool
	}{
		"+odd":  {5, false},
		"+even": {6, true},
		"-odd":  {-5, false},
		"-even": {-6, true},
		"zero":  {0, true},
	}

	for name, tt := range cases {
		tt := tt                         // ローカル変数にコピー
		t.Run(name, func(t *testing.T) { // サブテストとして実行
			t.Parallel() // 並列実行
			if got := is_even.IsEven(tt.in); tt.want != got {
				t.Errorf("want IsEven(%d) = %v, got %v", tt.in, tt.want, got)
			}
		})
	}
}

```


## テストを実行

```
go test . -parallel 2     
```

## おわりに

Goの記事の初投稿です。
間違いありましたらご教授いただけると幸いです。
【備忘録】ノートブック（ipynbファイル）をpyファイルに変換する

### Jupyter lab上でpyファイルに変換  
1.pyファイルにしたいノートブックを選択。  
2.「File」から「Save and Export Notebook As」を選択し、その中の「Executable Script」を選択。
3.Downloadフォルダに保存される。  

#### pyファイルの実行
1.ファイルのあるディレクトリに移動
2.`python ファイル名.py` を実行
Java: JUnit 例外が発生することを確認するテストの書き方の変遷

# はじめに

JUnitでは、バージョンによってテストの書き方が異なります。
 
この記事では、例外が発生することを確認するテストの書き方を比較します。

# JUnit 3

[failメソッド](http://junit.sourceforge.net/junit3.8.1/javadoc/junit/framework/Assert.html#fail())が呼ばれるとテストに失敗するという仕様を利用します。

下記のサンプルコードの場合、getメソッド内でIndexOutOfBoundsExceptionが発生した場合は、catch句に入り、[failメソッド](http://junit.sourceforge.net/junit3.8.1/javadoc/junit/framework/Assert.html#fail())は呼ばれません。このため、テストに成功するという仕組みになっています。

JUnit 4/5でもこの書き方は可能ですが、後述の書き方のほうが読みやすいでしょう。

```java
public void testOutOfBounds() {
    try {
		List<Object> it = new ArrayList<>();
        it.get(1);
		fail();
	} catch (IndexOutOfBoundsException e) {
	}
}
```

# JUnit 4

[@Test アノテーション](https://junit.org/junit4/javadoc/latest/org/junit/Test.html)のexpected値を利用します。

```java
@Test(expected = IndexOutOfBoundsException.class)
public void testOutOfBounds() {
	List<Object> it = new ArrayList<>();
	it.get(1);
}
```

# JUnit 5

[Assertions#assertThrows](
https://junit.org/junit5/docs/5.0.1/api/org/junit/jupiter/api/Assertions.html#assertThrows-java.lang.Class-org.junit.jupiter.api.function.Executable-)を利用します。

JUnitの各assertメソッドでは、[staticインポート](https://qiita.com/flyaway/items/2356672dd907476fbc1f#3-%E4%B8%AD%E7%B4%9A%E8%80%85%E5%90%91%E3%81%91static%E3%82%A4%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%88)を利用して、クラス名を省略するケースが多いです。

```java
import static org.junit.jupiter.api.Assertions.assertThrows;

@Test
void testOutOfBounds() {
	List<Object> it = new ArrayList<>();
	assertThrows(IndexOutOfBoundsException.class, () -> it.get(1));
}
```
Azure DevOps PipelinesでAsciidocのPDF化

### Pipelinesでやっていること
- 前提
  - trigger：masterかfeatureでdoc配下が更新された時
  - asciidocのtheme、fontがdoc配下にある状態
1. BaseとなるRubyインストール
1. JREインストール
1. PlantUML環境のインストール
1. asciidoc用ライブラリインストール
1. asciidocのPDF化
1. Artifactで回収

```yaml:azure_pipelines.yml
# Ruby
# Package your Ruby project.
# Add steps that install rails, analyze code, save build artifacts, deploy, and more:
# https://docs.microsoft.com/azure/devops/pipelines/languages/ruby

trigger:
  branches:
    include:
    - master
    - feature/*
  paths:
    include:
    - doc

pool:
  vmImage: ubuntu-latest

steps:
- task: UseRubyVersion@0
  inputs:
    versionSpec: '>= 2.5'

- script: |
    sudo apt -y install default-jre
  displayName: "JRE install"

- script: |
    sudo apt -y install graphviz
    sudo apt -y install fonts-takao
  displayName: "PlantUML install"

- script: |
    gem install asciidoctor
    gem install asciidoctor-pdf -v "1.5.4"
    gem install coderay
    gem install asciidoctor-pdf-cjk
    gem install asciidoctor-diagram
    gem install concurrent-ruby
  displayName: 'gem install lib'

- script: |
    asciidoctor-pdf -r asciidoctor-diagram -r asciidoctor-pdf-cjk -a pdf-style=default-theme.yml -a pdf-stylesdir=doc/_pdf_themes -a pdf-fontsdir=doc/_pdf_fonts doc/*.adoc -o 

- task: PublishBuildArtifacts@1
  displayName: 'Publish Artifact: Asciidoc'
  inputs:
    PathtoPublish: doc
    ArtifactName: 'Asciidoc'

```
今更APIについて調べてみた

# APIとは
API(Application Programming Interface)は一言で言うとソフトウェアやプログラム、Webサービスの間を繋ぐインタフェース。
開発者が複雑な機能をより簡単に作成できるようにプログラミング言語から提供される構造
複雑なコードを抽象化し、それに関わる簡潔な構文を提供する
「APIを叩く」はデータをAPIから持ってくるという意味

## クライアントサイドJavaScriptでのAPI

### ブラウザーAPI
Webブラウザに組み込まれていて、ブラウザーやコンピューターの環境の情報を取得し、これを使って役に立つややこしい事を行えるようにするもの。GeolocationAPIなどが当てはまる
#### 文書を操作するためのAPI
DOM(Document Object Model) APIではHTMLとCSSを操作する
#### サーバからデータ取得をするAPI
XMLHttpRequest,Fetch APIでサーバからページ全体をリロードすることなくデータの一部を変更できる。これはAjax(Asynchronous JavaScript + XML)と呼ばれる技術
#### グラフィックスを描画したり操作するAPI
CanvasとWebGLがあり、それぞれ二次元や三次元のシーンを作成できる。
#### 動画と音声のAPI
HTMLMediaElementやWeb Audio API, WebRTCのようなAPIを使うと動画や音声を自在に扱える。
#### デバイスAPI
Webアプリで使えるような形でハードウェアデバイスのデータを操作したり取得するAPI。通知機能をもたらすNotification APIや振動させるVibration APIなどがある。
#### クライアント側でのデータ保持API
クライアント側にデータを保存することによってページを移動したり、オフラインになったとしてもアプリを動作させることができる。Web Storage APIを使えばキーバリューストアが、IndexedDB APIを使えばもっと複雑なテーブル型データを保存できる。


### サードパーティAPI
デフォルトではブラウザに組み込まれておらずコードと情報をWebのどこからか読み込む必要がある。
その組織が提供しているデータを利用することができる。

- Twitter API
- Mapquest, Google Maps API
- Facebook APIスイート
- Telegram APIs
- Youtube API
- Pinterest API
- Twilio API
- Mastodon API


## json(JavaScript Object Notation)
JavaScriptオブジェクトの構文に従ったテキストベースのフォーマット。
JavaScriptとは独立して扱われることがあり、多くのプログラミング言語環境にjsonを読み込む
ネットワークを通してデータを転送する時に便利

https://developer.mozilla.org/ja/docs/Learn/JavaScript/Client-side_web_APIs/Introduction
他のエクセルを開く関数

# VBA
## 他のエクセルを開く関数

Option Explicit　'未定義チェック
’引数
'FilePath：読み込むファイルのフルパス
'SheetNo：エクセルシート番号
Function read_ExcelBook(ByVal FilePath As String, SheetNo) As Variant

    Dim wb As Workbook 'WorkBook定義
    Dim ws As Worksheet
    
    'ワークブックを開く
    Set wb = Workbooks.Open(FilePath)
    
    'シートを取得
    Set ws = wb.Worksheets(SheetNo)
    
    'データ入力されている範囲を取得する
    read_ExcelBook = ws.UsedRange
    
    'ワークブッククローズ
    wb.Close
    
    'メモリー開放
    Set ws = Nothing
    Set wb = Nothing

End Function

Sub main()
    Dim FilePath    As String
    
    FilePath = "フルパスを記入"
    
    Call read_ExcelBook(FilePath, 1)
End Sub
PyCharmのPYTHONPATHが上書きされてしまう

docker-compose環境をinterpreterに設定しています。
interpreterの設定で環境変数に `PYTHONPATH=/library_path` を指定しています。
PyCharmのGUIからunittestをrunするとPYTHONPATHで設定したパスのライブラリを見つけることができません、どうやらPYTHONPATHが上書きされている様子。

回避方法は２つある。
* site-packagesにもライブラリ入れておく→ちょっと2重管理になって気持ち悪い
* GUIでの実行を諦めてコマンドラインにてテスト実行→今回はこれを採用

lambda layerにpipライブラリ群を入れているためこのような状況になってます。
lambda layer便利だけど、このあたりのlambdaの実行環境とローカルの開発環境を差を吸収する部分でちょっと工夫が必要。
あまりスッキリした解決方法ではないのも悩ましい。
Wordpressの特定のフォームに数字以外を入力させないようにする方法 

フォームに数字以外を入力したくない時ってありますよね？
クライアントからの依頼で、これに対応しようとして、散々苦労したことがありましたので、こちらにメモしておこうと思います。

普通に考えると…
0123456789だけを入力できるようにすればいい！

ってなるんですが、実はこれだけでは、「全角入力」のキーはすべて素通りで入力できてしまいます。

# 概要
## ●input type属性はtelにする
これにより、スマートフォンでは数字以外が入力できなくなります。
（ただしコピペされたら素通り）

## ●jQueryで全角入力を制御する。
これにより、PCで半角数字以外が入力された時に弾きます。

input type属性をnumberにしない理由　その１
number属性だと、スマートフォンではなんでも入力できてしまいます。

input type属性をnumberにしない理由　その２
パソコンで、↑、↓を押してしまうと値が変わってしまいます。

## jQueryで全角入力を制御
下記のようなコードを入力します。
#formfieldidは環境に合わせて書き換えてください。
記載する場所ですが、プラグイン「Simple Custom CSS and JS」　がオススメです。
```
$(document).on('keydown', '#formfieldid', function(e){
  let k = e.keyCode;
  let str = String.fromCharCode(k);
  if(!(str.match(/[0-9]/) || (37 <= k && k <= 40) || k === 8 || k === 46 || k ===13)){
    return false;
  }
});

$(document).on("keyup","#formfieldid", function(e){
  this.value = this.value.replace(/[^0-9]+/i,'');
});

$(document).on("blur","#formfieldid", function(e){
  this.value = this.value.replace(/[^0-9]+/i,'');
});
```
SPSS Modeler ノードリファレンス 2-9  SMOTE

# 2-9 SMOTE（スモート）ノード[レコード設定タブ]
<img width="200" alt="107_89SMOTE.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/f5a49c8e-2c16-be5a-2a3b-ec36506aa2a9.png">

## 1.ノードの目的
アンバランスな対象を予測する際に機械学習アルゴリズムでオーバーサンプリングします。
![図2_3_9smote.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/0eeca439-0e34-457d-bfc1-bb12b1fe9b05.png)

#### アンバランスなままでは問題が生じる理由（2-8バランスノード共通）
![スクリーンショット 2022-03-15 15.56.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/115397c3-99b7-280b-d728-a9f7c124e24c.png)
![スクリーンショット 2022-03-15 16.03.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/c02e3a78-802f-5104-f449-6b43538dec86.png)


## 2.解説動画（60秒）

<iframe width="560" height="315" src="https://www.youtube.com/embed/--66ktExjcw" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

## 3.クイックスタート
極端にアンバランスなデータを補正します。
＊データは[5.参考情報]からダウンロードできます。

![スクリーンショット 2022-03-15 16.20.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/55fee03e-5ec3-57c8-2ec7-954b675cc73e.png)


[可変長ファイル]、[データ区分]、[SMOTE]の順でノードを接続します。
![スクリーンショット 2022-03-16 14.55.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/3321c280-439a-19b6-83b9-7551b4690b36.png)

[データ区分]は設定せず、学習と検証にレコードを半分ずつにアサインします。
![スクリーンショット 2022-03-16 15.11.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/5d416030-1c83-6732-4b70-769db25e9b4c.png)

[SMOTE]を編集します。
![スクリーンショット 2022-03-16 15.04.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/4abf4e35-9a61-787a-8b1f-32aafc2a0876.png)

[SMOTE]から[データ型]、[ニューラルネット]の順でストリームを延長します。
![スクリーンショット 2022-03-16 15.14.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/73f41354-f800-6e71-8750-207da78dc4d6.png)

[データ型]を編集します。
![スクリーンショット 2022-03-16 15.13.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/affc0cf7-a480-936a-0c67-475bc11260e1.png)

[ニューラルネット]を実行し、後続に[精度分析]を接続します。
![スクリーンショット 2022-03-16 15.17.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/ad6e35e9-a77e-96a7-6f95-e54e0048669d.png)

[精度分析]を編集、[一致行列]にチエックを入れます。
![スクリーンショット 2022-03-16 15.19.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/5298e13d-7424-e7d1-d9cf-51360557f86b.png)


[精度分析]を実行します。安定した精度が確保できました。
![スクリーンショット 2022-03-16 15.19.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/03970af1-8d33-3f4f-2265-c7b9f00e9c7a.png)

## 4.Tips

#### SMOTEノードとバランスノードの比較

https://www.ibm.com/blogs/solutions/jp-ja/spssmodeler-push-node-10/

## 5.参考情報

#### 利用データ

右クリックでリンク先を保存してください。

https://raw.githubusercontent.com/yoichiro0903n/blue/main/defect3.csv

#### ノードのヘルプ

https://www.ibm.com/docs/ja/spss-modeler/18.3.0?topic=nodes-smote-node

#### SPSS Modeler 逆引きストリーム集（データ加工）

https://qiita.com/416nishimaki/items/4bf813e6cba84b2a1008

#### SPSS Modeler ノードリファレンス目次

https://qiita.com/416nishimaki/private/503037195081d3323eee
Powershellコマンド結果書き出しファイルの文字化け：'Out-File:Encoding'にエンコード設定で解決

# はじめに

Microsoft Windows Powershell(以下`Powershell`)コマンドの実行結果をIOリダイレクトでファイルに書き出すことはよくあります。この時書き出したファイルはデフォルト状態のエンコーディングである`BOM付きUNICODE(UTF-16)`で出力されます。これが場合によっては文字化けする場合があります。

そこで、ここでは、Powershellコマンドでのファイル書き出しで文字化けをさせない方法をご紹介します

# 結論

Powershellコマンドの実行前に以下のコマンドで文字化けしないエンコードを設定してください。

```powershell:Powershellのファイル出力エンコードを設定するコマンド
$PSDefaultParameterValues['Out-File:Encoding'] = 'utf8'
```
* Powershellのデフォルトパラメータ値セット`$PSDefaultParameterValues`のファイル出力エンコード`Out-File:Encoding`パラメータに文字化けしないエンコードを設定します
* ここではUTF-8エンコードを設定するために設定値を`utf8`としています

# 経緯

## 文字化けする例

TypeScript実行環境`Deno`で動作するアプリのログをマークダウンファイルに書き出す以下のようなコマンドでマークダウンファイルが文字化けしました。

```powershell:文字化けが発生したPowershellコマンドの例
deno run -A --unstable .\app.ts > ./output/sample.md
```
## やりたかったこと

出力したマークダウンファイルはそのままWikiサービスでWebブラウザに表示させる必要があります。ですので、ファイルのエンコードは`UTF-8`であってほしかったのです

## でも実際は・・

しかし、実際には`UTF-16`で出力されて見事に文字化けしてしまいました。Google検索でいろいろな方法が紹介されていましたが、どれもわたしの場合には失敗しました。そこでようやくたどりついたのがこの記事でご紹介している方法です

## 成功したコマンド

```powershell:文字化けしないPowershellコマンドの例
$PSDefaultParameterValues['Out-File:Encoding'] = 'utf8'
deno run -A --unstable .\app.ts > ./output/sample.md
```
Raspberry Piにてnode-red-node-pi-gpioのノードが停止状態になる問題を解決したメモ

# 起きたこと
![キャプチャ - コピー.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600271/9e9b99b2-d46c-d749-e0bf-9fe9ca7c3921.png)
(異常が起きた時のスクショを撮っていないので上の画像はイメージ図)
RaspberryPiでGPIOピンを使用する際に標準的に使われる「node-red-node-pi-gpio」のノードを配置したところ、画像のようにステータスが停止となり動作しなくなった。

# 解決方法
bcm2835のライブラリをインストール等してみたところ正常に動作するようになった。
(再起動を忘れずに!)
インストール方法等はググってください。色々出てくると思います。

# 経緯/その他
bcm2835のライブラリにたどり着いたのは半分偶然。
確かに以前何か試行錯誤していた際に既にラズパイに入っていたbcmXXXXのファイルを弄ったり、それに関する権限のようなものを弄った記憶がある。
今回は当該ノードが正常に使用できるようになったので一旦の問題解決に至ったが、以前の試行錯誤にて他にも何かやらかしている可能性がある。
試行錯誤自体の記憶はほとんどなく、何を弄ったかが不明瞭なため何か心当たりのある人がこれを読んでいたらコメントにて知恵を頂きたいです。
SI接頭辞 ってなに？

## 勉強前イメージ

ちょいちょいこの言葉聞くけど、
MBとかのことじゃないの？

## 調査

### SI接頭辞 とは

エスアイせっとうじと読み、国際単位系で規定されている単位を10進数で表す接頭辞のことで全部で20あります。
大きい数字でも長くなく簡潔に表現できるのが特徴です。
コンピュータでは、GB・MB・KBがよく使われます。
SI接頭辞以外にも単位の接頭辞として使われているものがありますが、それは非SI接頭辞と呼ばれます。

また、10倍・100倍など数が大きくなる接頭辞を使うものを `倍量単位`
1/10・1/100など数が小さくなる接頭辞を使うものを `分量単位` と呼ばれます。

|          10進数での表記                         |  乗数 |  接頭語  | 記号 |
|:---------------------------------:|:-----:|:--------:|:----:|
| 1,000,000,000,000,000,000,000,000 |  10^24 |   ヨタ   |   Y  |
| 1,000,000,000,000,000,000,000     |  10^21 |   ゼタ   |   Z  |
| 1,000,000,000,000,000,000         |  10^18 |  エクサ  |   E  |
| 1,000,000,000,000,000           |  10^15 |   ペタ   |   P  |
| 1,000,000,000,000               |  10^12 |   テラ   |   T  |
| 1,000,000,000                     |  10^9  |   ギガ   |   G  |
| 1,000,000                       |  10^6  |   メガ   |   M  |
| 1,000                             |  10^3  |   キロ   |   k  |
| 100                               |  10^2  |  ヘクト  |   h  |
| 10                                |  10^1  |   デカ   |  da  |
| 0.1                               |  10^-1 |   デシ   |   d  |
| 0.01                              |  10^-2 |  センチ  |   c  |
| 0.001                             |  10^-3 |   ミリ   |   m  |
| 0.000,001                       |  10^-6 | マイクロ |   μ  |
| 0.000,000,001                   |  10^-9 |   ナノ   |   n  |
| 0.000,000,000,001               | 10^-12 |   ピコ   |   p  |
| 0.000,000,000,000,001           | 10^-15 | フェムト |   f  |
| 0.000,000,000,000,000,001         | 10^-18 |   アト   |   a  |
| 0.000,000,000,000,000,000,001     | 10^-21 |  ゼプト  |   z  |
| 0.000,000,000,000,000,000,000,001 | 10^-24 |  ヨクト  |   y  |


## 勉強後イメージ

使ってもペタくらいまでだし、小さいのもミリまでしか使わない・・・
国際的に決まってるってことなのね。

## 参考

- [SI接頭辞（SI接頭語）とは？一覧まとめと変換方法、覚え方を紹介！](https://tanijiten.com/metric-prefix-11)
- [SI接頭辞](https://www.sophia-it.com/content/SI%E6%8E%A5%E9%A0%AD%E8%BE%9E)
プログラミングスクールをやって気づいたこと

# プログラミングはコーディングだけではない
勉強をしている時だと、コーディング出来れば開発が出来ると思われがちですが、仕事ではそうもいかないようです。
## 工程がたくさんある
開発現場では、要件定義や基本設計などの工程を経てプログラミングがある。そういう流れになっている。
## コーディングにはエラーがつきもの
コーディングをしていると、慣れている人でもエラーが出てくる。そのエラーを解決する能力も必要。

# 総括して
プログラミングはコーディングにおける問題解決能力が全て。ということになります。

これが私が気づいたことです。
Laravel学習で参考になった学習教材一覧（随時変更、自分用メモ）

Laravelを始めたばかりの方（自分も含めて）！ようこそ！
Laravel初学者に見てもらいたい学習教材などをまとめました（随時変更、自分用メモ）。
よかったらストックしていってください！(・∀・)

最新版は移行しました！

https://qiita.com/Masanarea_qiita/items/2e802498a7df2d75082d

## PHPUnit / CircleCI をlaravelで使いたい場合◎

https://www.techpit.jp/courses/78

テストとは？CircleCIって最近流行ってるけど何？みたいな方におすすめです。また、ポートフォリオに CircleCI を導入したい場合、この記事の内容を応用させれば比較的簡単に導入可能です。（実体験）


## Techpit(全18講座)

https://www.techpit.jp/courses/category/Laravel

Laravelの基本的な勉強は終わった。でもアプリを作るにはどうしたらいいんだろう？いけてるアプリを作りたい！と思った際におすすめの教材です。SNS風のアプリだったり、フリマアプリ・メモアプリなどもあり、より実践的な知識が身に付きます。初月無料で受講し放題（確か3000円ぐらい?）のコースもありますので、一度チェックしてみることをお勧めします。



## Laravel入門（通称、青本）（特に初学者には◎）

https://www.amazon.co.jp/PHP%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AF-Laravel%E5%85%A5%E9%96%80-%E6%8E%8C%E7%94%B0%E6%B4%A5%E8%80%B6%E4%B9%83/dp/4798052582

バージョンこそ古いですが、Laravelの全体像を把握するのに最適です。バージョンが古かったり、誤植が多かったりもあるので、読んで学ぶことをお勧めします。自社でも使用している人（使用していたも含め）が多い印象で、ゆーたろーさんのブログから引用したところによると、

(https://yutaro-blog.net/2021/05/22/laravel-recommend/)
>僕の周りで実務でLaravelを触っている人のほぼ100％がこの本を一度は読んだことがあるのではないかと思うほどに有名なので間違いないです。（もちろん僕も持っています）

とのことです。こちらも参考にしていただければと思います。

## Docker入門(無料で学べます！)

https://y-ohgi.com/introduction-docker/2_component/dockerfile/

勝又健太さん（DevOpsエンジニアとして有名なテック系YouTuber）が紹介していた教材になります。Dockerをゼロから学ぶという人におすすめです。ハイレベルなポートフォリオにDockerを組み込むための必要な知識を効率よく学ぶことができます。

## LaravelとVue.jsを使うときのDocker環境構築

https://yutaro-blog.net/2021/04/28/docker-laravel-vuejs-1/

記事の名前は『絶対に失敗しないDockerでLaravel+Vueの実行環境（LEMP環境）を構築する方法〜前・中・後編〜』
かなり詳細に記述されていて作業していて詰まりにくかった印象（というか何も問題がなかった。完璧）ポートフォリオにDockerで構築してLaravelとVue.jsを使って行きたい場合、かなり有益な記事である可能性大。

## Laravel+Vue.jsでの写真アップロードハンズオン
https://www.hypertextcandy.com/vue-laravel-tutorial-introduction

Vue.js初心者でも「Vue + Laravel + AWS（S3のみ）」のアプリケーションを作成できる「Vue + Laravel チュートリアルシリーズ」もあります。これを完了させると、SPA（Single Page Application）を取り入れたポートフォリオを作成できます。これらの記事を参考にすることで、ポートフォリオ作成に必要なスキルを身に付け、自信を持って面接に臨むことができます。

※自身はこれに加えて『AWS(EC2+RDS+VPC),Docker』を加えてCSSをちょっと修正したものを面接のアピール材料に入れて未経験就職を成功させました。
(これも近日中に技術記事にします。)

Github(これをアレンジした自身の就職時のポートフォリオ)

https://github.com/Masanarea/portfolio





## Laravel関連の記事（特に初学者には◎）

https://yutaro-blog.net/

上のdockerでの環境構築記事の著者のブログですが記事全般わかりやすいものが多い。他にもこの人のZennのブログとかではHerokuにlaravelアプリをデプロイする記事、laravel書籍おすすめのものをまとめた記事もあるので気になった方は調べてみてください
Qiitaの自分の記事に対するデータ分析の準備

# はじめに
Qiitaの自分の記事に関して、以前データ分析をした。

https://qiita.com/kazuo_reve/items/368cb7960a802fdfada9

このとき手作業でデータを集計したので、非常に手間だった。
データの集計を自動化するために、2つの方法を取り入れてみた。

* Qiita APIとExcel（Power Query）を使って自動集計
* Googleアナリティクス

# 参考記事
以下の記事を参考に、大きなトラブルなくデータを取得・集計することができた。
記事を執筆していただいた皆様に感謝申し上げます。

https://qiita.com/PowerBIxyz/items/1fc385fdd3727b312bdb

https://qiita.com/Qiita/items/c7f704e3786df3aa7a11

https://qiita.com/kamisho/items/dade4b6db4b18df71f99

# やってみた結果
## Qiita APIとPower Queryを使って自動集計
### 結果
記事毎に以下のデータが自動集計できた。
* page_views_count：閲覧数
* likes_count：この記事への「LGTM！」の数
* comments_count：この記事へのコメントの数

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243842/8d81a24c-b8d1-e378-8a07-20dbdde594ab.png)

### 残課題
#### エラーが出る
データの更新をすると以下のエラーが出力される。
原因・対策はまだわかっていない。
エラーメッセージダイアグでOKボタンを押下すれば、処理は継続され、データ集計は問題なく完了しているように見える。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243842/1e799cf6-6428-b24c-6f9b-f65dfb0691fa.png)

#### ストックの数は集計できない
Qiita API v2では、記事毎のストックの数は、取得できない。

https://qiita.com/api/v2/docs#%E6%8A%95%E7%A8%BF

#### 処理時間が長い
データの更新処理が完了するまでかなり（10分以上）待たされる。
改善したいのですが、原因がわからず改善できていない。

## Googleアナリティクス
### 結果
[行動]-[サイト コンテンツ]-[すべてのページ]で、指定した期間のページビュー数が確認できる。
最初に表示されるのは、全記事の合計ページビュー数。
集計期間は変更できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243842/9b38e3d2-de15-9237-dead-f54124027f43.png)

表中のページのURLのようなものをクリックすると、ページ毎にページビュー数を確認できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243842/26341c9d-dd4d-d1ad-1622-33dda9d3e1c8.png)

### 残課題
#### 使いこなせていない
見れるデータや機能が多く、使いこなせていない。

#### 記事が特定しにくい
ページの「/kazuo_reve/items/6554fca14034bcf26123」という表記からは、どの記事かわからない。

#### Googleアナリティクスを導入する前のデータを集計できない
あたりまえなのだが、Googleアナリティクスを導入する前のデータは記録されていないので、集計できない。

# おわりに
以前に比べれば効率的にデータ分析をするための準備はできた。
これから「アクションに結びつく分析を行う」。

https://qiita.com/kazuo_reve/items/ce39ccb23d2dc501c49f


また、Power QueryやQitta APIを、もう少し勉強してみようと思う。今は、参考記事に示されていたコードを写経させていただいただけの状態なので。
cscの作法 その56

# 概要
cscの作法、調べてみた。
練習問題やってみた。

# 練習問題

タイマー使って、いろんなsin波、見せて。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/921f294e-29a9-d0cc-05de-d64f063abc81.png)

# サンプルコード

```
using System;
using System.Windows.Forms;
using System.Drawing;

class form1: Form {
	form1() {
		ClientSize = new Size(800, 300);
		Timer timer = new Timer();
		timer.Interval = 10000; 
		timer.Tick += new EventHandler(timerTick);
		timer.Start();
	}
	protected override void OnPaint(PaintEventArgs e) {
		Graphics g = e.Graphics;
		Bitmap p = new Bitmap(800, 300);
		Brush red = new SolidBrush(Color.Red);
		int j;
		double angle;
		Random r = new Random();
		double d = r.NextDouble();
		for (j = 0; j < 720; j++)
		{
			angle = ((double) j) / 360 * 2 * Math.PI / d;
			p.SetPixel(j, (int)(100 * Math.Sin(angle) + 150), Color.Red);
		}
		g.DrawImageUnscaled(p, 0, 0);
		base.OnPaint(e);
	}
	void timerTick(object sender, EventArgs e) {
		Text = DateTime.Now.ToString("HH:mm:ss");
		this.Invalidate();
	}
	[STAThread]
	public static void Main() {
		Application.Run(new form1());
	}
}




```

以上。
SQLの基本操作

●SQLの操作一覧
・テーブルの作成
`CREATE TABLE テーブル名 (カラム名1 データ型1 列の制約1, カラム名2 データ型2 列の制約2,...)`
例)
```
CREATE TABLE data (num int NOT NULL, name text, age int);
```
※numとnameとageというカラムを持ったdataというテーブルを作成
※numは空配列にしてはいけない

・既存のテーブルから検索
`SELECT 検索対象 FROM 'テーブル名' (WHERE 対象レコードが含むデータ) `
※(WHERE 対象レコードが含むデータ)は無くてもOK
例①)
テーブル内のすべてのデータを検索するとき
```
SELECT * FROM data;
```
※dataというテーブルから全データを検索
※*は「全て」という意味
例②)
テーブル内の一部のデータを検索するとき
```
SELECT name, age FROM data wherw num=1;
```
※dataというテーブルからnum=1を含むレコードのnameカラムとageカラムを検索
※`where num=1`が無い場合は、全データのnameカラムとageカラムを表示

・指定した行数のみのデータを取得
`SELECT 列名 FROM テーブル名 LIMIT 行数`
例)
```
SELECT * FROM companies LIMIT 10;
```
companiesテーブルの全列を上から10個だけ取得

・既存のテーブルへのデータの追加1
`INSERT INTO テーブル名 SET 追加内容1, 追加内容2, ...`
例)
```
INSERT INTO data SET num=1, name="ヒカル", age=26;
```
※dataテーブルのnumカラムに1、nameカラムにヒカル、ageカラムに26を追加
※文字列を追加するときは''(シングルクォーテーション)or""(ダブルクォーテーション)で囲む

・既存のテーブルへのデータの追加2
`INSERT INTO テーブル名 VALUES (カラム1への追加内容, カラム2への追加内容, ...)`
例)
```
INSERT INTO data VALUES (2, "ミズキ", 24);
```
※dataテーブルのnumカラムに2、nameカラムにミズキ、ageカラムに24を追加
※全カラムにデータを追加するときに使える方法

・既存のテーブルへのデータの追加3
`INSERT INTO テーブル名(カラム1, カラム2, ...) VALUES (カラム1への追加内容, カラム2への追加内容, ...)`
例)
```
INSERT INTO data(num, name, age) VALUES (2, "ミズキ", 24);
```
※dataテーブルのnumカラムに2、nameカラムにミズキ、ageカラムに24を追加
※指定したカラムにのみデータを追加するときに使える方法

・既存のテーブルの内容を変更
`UPDATE テーブル名 SET 変更内容1, 変更内容2, ... WHERE 対象レコードが含むデータ`
例)
```
UPDATE data SET age=18 WHERE num=1;
```
※dataテーブルのnum=1のレコードのageカラムを18に変更
※※WHEREを入力し忘れた場合、全レコードの内容が変更となるので注意※※
```
UPDATE data SET age=18;
```
の場合、dataテーブルの全レコードのageカラムが18となってしまう。

・テーブルのデータの削除
`DELETE FROM テーブル名 WHERE 対象レコードが含むデータ`
例)
```
DELETE FROM data WHERE num=1;
```
※dataテーブルのnumカラムが1のデータを削除
※※WHEREを入力し忘れた場合、テーブル内のデータが全て消えるので注意※※
```
DELETE FROM data;
```
の場合、dataテーブル内の全データが消える。

・テーブルのデータの並び替え
`DELETE FROM テーブル名 ORDER BY ソートするカラム名 指示`
例)
```
DELETE FROM data ORDER BY age asc;
```
※dataテーブルをageカラムが小さい順に並び替え
※ascは省略可(省略すると自動的に小さい順となる)
※大きい順に並び替えたいときは指示のところにdescと入力
※文字列を並び変えたいときは文字の種類を統一する(平仮名だけorカタカナだけ等)

・重複しているものをまとめる
`SELECT DISTINCT 表示したいカラム名 FROM テーブル名`
※表示したいカラム名には()を付けても良い
例)
```
SELECT DISTINCT age from data;
```

・範囲で検索
`SELECT * from テーブル名 WHERE カラム名 between 最小値 and 最大値`
※以下のコードと同じ
`SELECT * from テーブル名 WHERE カラム名>=最小値 and カラム名<=最大値`
例)
```
SELECT * FROM data WHERE age 20 and 30;
```

・特定のレコードを検索
`SELECT * from テーブル名 WHERE カラム名 in (検索値1, 検索値2, ...)`
※
以下のコードと同じ
`SELECT * from テーブル名 WHERE カラム名=検索値1 or カラム名=検索値2 ...)`
例)
```
SELECT * FROM data WHERE age in (20, 22, 24, 25);
```

・表示や選択するレコードの制限
～最初のデータからn個目のレコードまでを選択するとき～
`SELECT * FROM テーブル名 limit n`
～(n+1)個目のデータからm個目のレコードまでを選択するとき～
`SELECT * FROM テーブル名 limit n, m`

・カラムに別名を付ける
`SELECT カラム名 AS 別の名前`
例)
```
SELECT COUNT(id) AS number FROM entries;
```
※entriesテーブルのidの数にnumberをいう名前を付ける

・テーブルへの列の追加
`ALTER TABLE テーブル名 ADD COLUMN 列の定義`
例)
```
ALTER TABLE companies ADD COLUMN capital INTEGER;
```
※companiesテーブルに整数型のcapital列を追加

・テーブルの列の削除
`ALTER TABLE テーブル名 DROP COLUMN 列名`
例)
```
ALTER TABLE companies DROP COLUMN capital;
```
※companiesテーブルからcapital列を削除

・テーブルの削除
`drop table テーブル名`
例)
```
DROP TABLE companies;
```
※companiesテーブルを削除
2022/3/24主にITとかセキュリティの記事

カーパーツショップに不正アクセス - クレカ情報が流出
https://www.security-next.com/135092

複数自治体が導入進めるクラウドがスパム踏み台に - メンテ時の設定ミスで
https://www.security-next.com/135087

複数サーバにサイバー攻撃、顧客情報流出の可能性 - 森永製菓
https://www.security-next.com/135060

EC事業者の4社に1社、不正アクセスや不正注文を経験
https://www.security-next.com/134905

東京辰巳国際水泳場の指定管理者がマルウェア感染 - 利用者情報が流出か
https://www.security-next.com/134875

自治体から迷惑メール91万件　SBテクノロジーのセキュリティクラウド、設定ミス突かれ踏み台に(3/22)
https://www.itmedia.co.jp/news/spv/2203/22/news096.html

サイバー攻撃がラインを止める日――いま、私たちにできることは？(3/22)
https://techfactory.itmedia.co.jp/tf/spv/2203/22/news045.html

栃木県のメールシステムに不正アクセス “なりすまし”9万件余(3/21)
https://www3.nhk.or.jp/news/html/20220321/k10013544221000.html

サイバー攻撃が急増　企業へ　ウクライナ侵攻後(3/22)
https://www.okinawatimes.co.jp/articles/-/929575

トヨタ系小島プレス、システム一部復旧　2月に不正接続(3/22)
https://www.nikkei.com/article/DGXZQOFD2220I0S2A320C2000000/

米、ロシアのサイバー攻撃を警告　インフラ企業に警戒強化要請(3/22)
https://newspicks.com/news/6846093/body?sentlog

重要インフラ、供給網の機密管理　サイバー防衛へ指針(3/22)
https://www.nikkei.com/article/DGXZQOUA181QG0Y2A310C2000000/

2021年第4四半期のNICTER観測統計、Hikvision 製のIP カメラの脆弱性を悪用した攻撃通信を確認(3/22)
https://s.netsecurity.ne.jp/article/2022/03/22/47332.html

これが“スパイの手口”　情報流出で注意呼びかけ(3/19)
https://news.tv-asahi.co.jp/news_society/articles/000248578.html?display=full

JR東日本（モバイルSuica）をかたるフィッシングに注意(3/22)
https://k-tai.watch.impress.co.jp/docs/news/1396999.html

Emotet感染確認ツール「EmoCheck」v2.1に関する記事が2週連続トップに。3月14日にはv2.1.1が公開され再び話題に(3/22)
https://internet.watch.impress.co.jp/docs/news/ranking/1396747.html

ロシア、メタを過激派組織に認定　Facebookなど禁止(3/22)
https://www.nikkei.com/article/DGXZQOGR214LJ0R20C22A3000000/

【匠の部屋】「電源オフ」でも使えるリモートデスクトップはなぜ動くのか？　進化し続けるインテル vPro プラットフォームの秘密
CPUに内蔵された「もう一つのCPU」とは？(3/22)
https://internet.watch.impress.co.jp/docs/column/vpro_takumi/1395427.html

妻のメールアドレスが無くなった件(3/22)
https://blogs.itmedia.co.jp/ontheroad/2022/03/post_66.html?ref=rss

FacebookとInstagramの運営元Metaが過激派であるとロシアの裁判所も認定し活動制限、ただしWhatsAppは除外(3/22)
https://gigazine.net/news/20220322-facebook-instagram-banned-in-russia/

栃木県でも不正メール９万件　宇都宮市など装い送信(3/21)
https://www.jiji.com/sp/article?k=2022032100615&g=soc

企業の成長を鈍化させるな　テレワーク企画会議の運営にカギ(3/23)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/031700284/031700001/

AI Drivenの成熟度を測る　作る側と使う側で合意形成(3/23)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/112600264/031700005/

国内でEmotet感染被害続く　積水ハウスなどから不審メール(3/23)
https://xtech.nikkei.com/atcl/nxt/mag/nnw/18/031800050/031500037/

DHCP(3/23)
https://xtech.nikkei.com/atcl/nxt/mag/nnw/18/031500132/031500001/
【Docker】Dockerfileで親ディレクトリを参照する方法

## はじめに
　本記事は、プログラミング初学者、学習を進めていて疑問に思った点について調べた結果を備忘録も兼ねてまとめたものです。
　そのため、記事の内容に誤りが含まれている可能性があります。ご容赦ください。
　間違いを見つけた方は、お手数ですが、ご指摘いただけますと幸いです。

## Dokerfileで親ディレクトリを参照する方法
Dokerfileで親ディレクトリを参照するにはDocker-composeのbuildの箇所でcontextとdockerfileを指定します。

```docker-compose.yml
version: '3.9'
services:
  api:
    build:
      context: .
      dockerfile: ./docker/api/Dockerfile
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    # restart: on-failure
    volumes:
      - .:/myapp
    environment:
      RAILS_ENV: ${APP_ENV}
    ports:
      - "${API_PORT}:3000"
    depends_on:
      db:
        condition: service_healthy

```

Dockerfileには親ディレクトリから見たパスを記述します。

```Dockerfile:Dockerfile
FROM ruby:3.1.1

WORKDIR /myapp

COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock  /myapp/Gemfile.lock
RUN bundle install

COPY docker/api/entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]

EXPOSE 3000

ENV TZ=Asia/Tokyo

CMD ["rails", "server", "-b", "0.0.0.0"]
```
UnityのEntitiesプロジェクトをビルドする方法

# 前書き
<code>Entities 0.50.0</code>を使用したプロジェクトのビルド方法のメモです。

# 注意点
今後のアップデートで方法が変わる可能性があります。

# 環境
Entities 0.50.0-preview.24
Platforms 0.50.0-preview.4

# 前準備
プロジェクト設定でプレビューなパッケージを有効にするよう設定します。
Edit > Project Settings > Package Manager の<code>Enable Preview Packages</code>にチェックを入れます
![](https://cdn-ak.f.st-hatena.com/images/fotolife/E/EorF/20220324/20220324013550.png)

# Entities Platforms Package をインストール
<code>Entities</code>を使用したプロジェクトは専用ビルドツールが必要で<code>PackageManager</code>からインストールします。
<code>PackageManager</code>の<code>Add package from git URL...</code>を選択し、<code>com.unity.platforms</code>と入力するとインストールが始まるので少し待ちます。
![](https://cdn-ak.f.st-hatena.com/images/fotolife/E/EorF/20220324/20220324012052.png)

# ビルド方法
ビルドには専用アセットが必要なため作成します。
Assets > Create > Build Configuration > Empty Build Configuration を選択するとアセットが作成されます。
![](https://cdn-ak.f.st-hatena.com/images/fotolife/E/EorF/20220324/20220324014511.png)

作成したらビルドしたいシーンを追加しビルドします。
ビルドのボタンはインスペクタウィンドウの右上にあります。
![](https://cdn-ak.f.st-hatena.com/images/fotolife/E/EorF/20220324/20220324021434.png)

# Build Configurationの説明
このアセットは<code>Build Settings</code>と<code>Player Settings</code>の一部のパラメータをオーバーライドして変更します。
<code>BuildConfiguration</code>に<code>AddComponent</code>でオーバーライドしたいパラメータを選択します。
![](https://cdn-ak.f.st-hatena.com/images/fotolife/E/EorF/20220324/20220324014929.png)
![](https://cdn-ak.f.st-hatena.com/images/fotolife/E/EorF/20220324/20220324015005.png)

<code>Shared Configurations</code>に別のビルドアセットをアタッチすることで設定を共有することができます。
変更箇所は Prefab のように青線が表示されます。
![](https://cdn-ak.f.st-hatena.com/images/fotolife/E/EorF/20220324/20220324015252.png)

プロファイラに接続したい場合は<code>ClassicBuildProfile</code>の<code>Configuration</code>を<code>Debug</code>もしくは<code>Develop</code>にします。
![](https://cdn-ak.f.st-hatena.com/images/fotolife/E/EorF/20220324/20220324020107.png)

# おまけ
platformsのパラメータ詳細はドキュメントに記載されていないため全てアタッチした状態の画像を載せておきます。
黄色い三角マークは<code>This component is not used by the build pipeline.</code>と表示されるので設定しても使われないかもしれません。（未検証）
![スクリーンショット 2022-03-24 030337.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106884/129c8991-ba2f-874f-1e37-2a9f2a58d024.png)


# 参考文献
https://forum.unity.com/threads/experimental-entities-0-50-is-available.1253394
https://docs.unity3d.com/Packages/com.unity.entities@0.50/manual/index.html
https://docs.unity3d.com/Packages/com.unity.platforms@0.50/manual/index.html

# 転載元
https://eorf.hatenablog.com/entry/2022/03/24/021921
【備忘録】CSSで上下左右中央寄せ

# この記事について
CSSで要素を上下左右中央に寄せて配置する方法を毎回ググってる&方法がバラバラになっていたので、メモを残しておく。

# 基本的なやり方
親に以下を指定する。これだけ。

- `display: flex`
- `justify-content: center` (左右中央)
- `align-items: center` (上下中央)

```index.html
<body>
  <div class="parent">
    <p>あいうえお</p>
    <p>かきくけこ</p>
    <p>さしすせそ</p>
  </div>
</body>
<style>
  .parent {
    display: flex;
    justify-content: center;
    align-items: center;
    height: 300px;
    background-color: gray;
  }
  p {
    width: 150px;
    background-color: pink;
    margin: 5px;
  }
</style>
```

見た目はこんな感じになる。
![スクリーンショット 2022-03-24 2.14.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657374/ea16814f-7cd9-5fc8-3b2f-974cba7dc26b.png)

# 縦並びを維持したまま上下左右中央寄せする
pタグ3つをさらにdivタグで囲んで`display: flex`が効く子要素を1つにすればOK

```index.html
<body>
  <div class="content">
    <div>
      <p>あいうえお</p>
      <p>かきくけこ</p>
      <p>さしすせそ</p>
    </div>
  </div>
</body>
<style>
  .content {
    display: flex;
    justify-content: center;
    align-items: center;
    height: 300px;
    background-color: gray;
  }
  p {
    width: 150px;
    background-color: pink;
    margin: 5px;
  }
</style>
```

見た目はこんな感じになる。
![スクリーンショット 2022-03-24 2.18.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657374/e78bd862-e3db-10a8-b5f0-ec0ac9475de1.png)

# flex-directionを指定する
`flex-direction`を親に指定することで、`display: flex`使用時の子要素の並び方を変更できる。
1つ前のやつと違って、divタグを追加する必要がないので、階層が余計に深くならずに済む。

```index.html
<body>
  <div class="parent">
    <p>あいうえお</p>
    <p>かきくけこ</p>
    <p>さしすせそ</p>
  </div>
</body>
<style>
  .parent {
    display: flex;
    flex-direction: column;
    justify-content: center;
    align-items: center;
    height: 300px;
    background-color: gray;
  }
  p {
    width: 150px;
    background-color: pink;
    margin: 5px;
  }
</style>
```

見た目は1つ前のやつと同じになる。
![スクリーンショット 2022-03-24 2.18.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657374/81359ae9-c777-edfd-f263-615bc3e792bf.png)
Excel 自動重複削除を関数で考えてみた

# 制作環境

Windows 10
WPS Office


# はじめに
エクセルにそう詳しい訳ではないので、素人のメモ程度に見てください。
Office 365であればUNIQUE 関数でやりたい事ができるのですが、職場がOffice 2019でUNIQUE 関数が使えないので、使える関数だけでできないか考えて見ました。
ネットで色々検索しましたが、やりたい事について書かれたサイトを見つけられなかったので、ここに残します。
データの重複削除でもやりたい事はできますが、都度手動で削除するのが非効率だったので、自動でできるようにしました。

# 完成画像
![完成.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/760252/de22d50f-bd12-0f01-0110-89a79b2b2b95.jpeg)

# 今回の要件
日付のリストの中から、重複を削除して日付の値を取り出します。
例えば発送日の一覧から、発送日毎にデータを分ける時等に使えるデータを作成します。
もちろん一覧の値が変われば、抽出結果も自動で変わります。


# 準備
適当なサンプルデータの作成をします。
以下のような日付のリストを作成しました。
もちろん日付は重複させます。

![t1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/760252/f6e633f0-74e2-33b0-352c-008fd4e4b0e0.jpeg)

# 処理①
それでは実際に処理をしていきます。
まず日付の中から、重複する日付が最初(1番目)に出てくる箇所を見つけます。

B2セルに以下の関数を記述し、表の一番下まで関数をコピーします。
※コピーの仕方についてはここでは記述しません。ネットで簡単に検索できるのでそちらで調べてください。

```
=IF(COUNTIF($C$1:C2,C2)=1,1,"")
```

COUNTIFでC列の値が出てくる回数を出します。
その時、必要なのは最初に出てくる値だけなので、結果の値が1以外は空白を返すようにします。

結果画像

![t2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/760252/3c497ff2-fd97-55c5-5a8b-c16e771a9170.jpeg)


# 処理②
処理①で出した結果に連番を付けます。

A2セルに以下の関数を記述し、表の一番下まで関数をコピーします。

```
=IF(B2="","",COUNTIF($B$1:B2,B2))
```

結果画像
![t3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/760252/22b6bd65-1a1e-227d-00a0-071f08009cd3.jpeg)

B2の値が空白の箇所は必要ないので、空白を返すようにします。
それ以外はCOUNTIFの値を返し、連番を作成します。

# 処理③
右側に新しく表を作成し、そこに抽出結果を表示させます。
抽出にはVLOOKUPを使用する為、検索用の値をまず作成します。

表の作成
![t4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/760252/201d7023-399a-b668-4116-06e02f0e817e.jpeg)

検索は処理2の連番を使用しますので、E2に以下の関数を記述します。

```
=IF(ROW()-1<=COUNT($A$2:$A$9),ROW()-1,"")
```

検索用の値はROW()関数で作成します。
その際必要な数だけ作成したいので、COUNT関数で作成回数の条件を付けます。
条件に当てはまらなければ空白を返します。

結果画像
![t5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/760252/423288bb-4159-c171-2462-86ddff00acd2.jpeg)



# 最終処理
あとはVLOOKUPで値を抽出結果に表示させるだけです。

F2セルに以下の関数を記述し、表の一番下までコピーします。

```
=IF(E2="","",VLOOKUP(E2,$A$2:$C$9,3,0))
```

完成結果
![t6.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/760252/80d32944-57d6-a278-3418-08590fbfc171.jpeg)

以上で完成です。

エクセルに詳しければもっといいやり方があるかもしれません。
【Ruby】requireとloadの違いについて

requireとloadの違いについてまとめておく。

## requireの場合

``` test.rb
module Lib
  $num += 1
end
```
```test1.rb
$num = 0
1..10.times do |n|
  require './test.rb'
end
puts $num
```
```
1
```
上記では``require``を使用してtest.rbをロードしている。
requireの場合は、ファイルのロードは1度のみ行われるため、1が表示される。

## loadの場合
``` test.rb
module Lib
  $num += 1
end
```
```test1.rb
$num = 0
1..10.times do |n|
  load './test.rb'
end
puts $num
```
```
10
```
``load``を使用してtest.rbの読み込みを行なっている。
``load``は無条件にファイルをロードすることができるため、10回処理が行われて``10``となる。


## requireとloadの違いまとめ
requireは同じファイルは1度のみロード。loadは無条件にロード可能。
requireは.rbや.soを自動補完できる。loadは補完はしない。
requireはライブラリのロード。loadは設定ファイルの読み込みに用いることができる。

以上
Unity備忘録 Barracudaインストール方法

1. githubのBarracudaのページに移動
https://github.com/Unity-Technologies/barracuda-release

2. 緑色のCodeボタンを押下
![スクリーンショット 2022-03-24 1.30.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2604215/51fcb3e3-76e2-ea6c-1879-98b746b8fe71.png)

3. Download ZIPを選択
4. zipを解凍する

5. UnityでPackage Managerを起動
6. +マークを押下
7. Add package from disk...を選択
 ![q1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2604215/01d456d0-af5c-af6c-9092-dd529e740a6d.png)

8.解凍したファイルの中からpackage.jsonを選択
9.Barracudaのインストールが開始されます

環境:Unity2021.2.16f1
【Go】Go 1.16以降のバージョンで「go get」でのdelveインストール時に「dlv: not found」になる

## 概要
個人的に開発で使っていたGolangのバージョンが少し古かったので、バージョンを上げてみました。バージョンを上げると、デバッグツールの`delve`も再度インストールする必要があったので、`go get`でインストール操作を実行してみたところ`dlv: not found`というエラーになりました。
今回はそのエラーの対応について、メモ書きします。

## 対応
teratailの[dlvインストール後にnot foundと表示される件について](https://teratail.com/questions/366377)に、同じエラーでハマってる記事がありました。回答をざっと確認したところ、`go get`によるインストールではなく`go install`に変更になったそう。[delveのREADME](https://github.com/go-delve/delve/tree/master/Documentation/installation)でも、`go install`を使うように記載されています。
なお、[Go1.16からの go get と go install について](https://qiita.com/eihigh/items/9fe52804610a8c4b7e41)の記事にある通り、1.17で`go install`を使うことが推奨されていて、1.18になると`go get`は基本的には使えない（設定変更すれば使えるみたいだけど）模様です。

なお、delveを使用したデバッグの雰囲気は[Visual Studio CodeとDelveでGo言語のアプリケーションをデバッグする](https://tech.fusic.co.jp/posts/2020-04-07-go-debug-vscode-delve/)の記事を、参照頂ければと思います。
VRChat Avatar3.0 尻尾を振れるようにしてみた（備忘録）

# はじめに
この記事は筆者の備忘録です。バージョンや実行環境により症状が異なることがあります。
また、Unity初心者()であるため間違っている箇所が存在する場合があります。

# 前提
【version】
VRC : 2022.1.1p3
Unity : 2019.4.31f1


Unity上でAvatar3.0の最低限のセットアップが終わっており、VRC上で利用できる状態のprojectで作業しています。
最低限のセットアップってなに...って感じですが、モデルにアタッチしたVRC Avatar Descriptorの設定くらいでしょうか。具体的な方法は他の方がたくさん記事を出しているのでここでは割愛します。

# 仕様
今回作ったのは、VRC上でExpressions Menuから尻尾の回転を手動操作する機能です。
下の画像のようにスティックを傾けた方向に自由に動かせるようにしました。Tail Controllerを閉じると元の位置に戻ってくれます。



![tailcontroller.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603951/979b5384-a0c4-c647-8933-de3e9680551c.png)



# つまずいたところ
[こちらの記事](https://kurotorimkdocs.gitlab.io/kurotorimemo/010-VR/010_VRChat/Avatars3.0/TailSystem/)をもとに作っていたところ、Unityではanimator controllerが正常に動作しているにも関わらず、VRCでは全く動いてくれませんでした。

## 原因
作成したanimation controllerをPlayable LayersのGestureにアタッチしていることが原因でした。Gesture LayerではHumanoidのボーンを動かす際には問題ないのですが、ケモミミや尻尾など、Humanoidに含まれないボーンを動かすときは正常に動作しない不具合があるようです。

## 解決法

下の画像のように作成したanimation controllerをFX Layerにアタッチすることで直りました。(controllerのスペルミスは見逃してほしい）
![unity_playable layers.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603951/d6026f67-a196-e71e-eeb7-a76d35ab22cb.png)

### 原因部分の詳しい仕様
Gesture LayerにはAvatar Maskがかかっており、初期設定では手のボーンのみ動くため、動かしたいボーン（今回は尻尾のボーン）をAvatar Maskに追加する必要があります。


しかし、追加したHumanoid以外のボーンをWrite Defaultオフで動かすとTransfromアニメーションがVRC上で反映されない不具合があるようで困りものです。



Write Defaultsはanimation controller内の各stateのInspectorにあります
![witedefaults.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603951/c14bcce8-4ae9-99d8-d27c-6dcf25060a3e.png)


Write Defaultsってなに？という方はアニメーションをデフォルトの状態に戻すのを勝手にやってくれる機能だと思っておけばいいと思います。[VRC公式ドキュメント Avatar3.0](https://docs.vrchat.com/docs/avatars-30)ではanimation controllerを作る際にWrite Defaults機能をオフにすることを推奨しています。


[VRC公式ドキュメント Playable Layers](https://docs.vrchat.com/docs/playable-layers)によるとTransformを含むアニメーションはFX Layerに置くことは一応非推奨なようですが、現状実装しようとしたらFX Layerに置くしかないんですよね...


# まとめ
アバターのモデル(fbx)に含まれるHumanoid以外のボーンを動かすときはFX Layerを使いましょう。
非推奨なのにそこにアタッチするしかないってなにごと？(;ω;)
公式ドキュメント見ても実際に動くかは試行してみないとわからないので先人の知恵を借りつついろいろ試してみるのが吉。



この記事が誰かの役に立てば幸いです。
【Flutter】table_calendarを日本語で表示する

# はじめに
Flutterのパッケージでtable_calendarというものを最近使ってアプリ開発をしているのですが、見た目のカスタマイズが複雑でやりにくい上に日本語の記事が少ないようなので、自分が実装するついでにやり方をまとめてみます。

# 告知
この記事に書いてある`table_calendar`を使用している、
`タスクカレンダー`というアプリをリリースしました！
（まだ改善の余地がたくさんありますが、、）


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2567243/6f68b123-0d4f-4a9d-b128-c68608c7d625.png" width="550">

コンセプトは、めちゃめちゃ手軽なカレンダー兼タスク管理アプリです。
普段は、めんどくさくてカレンダーアプリを使わないが、たまにある美容室の予定は忘れられない時など、ちょっとしたことを最低限の機能でストレスなく行えます。

`table_calendar`を使ってこんなアプリができるんだという参考にもなれば幸いです。

ぜひ一度、アプリを手に取ってみてください！！！

ダウンロードは下から可能です。

<a href='https://play.google.com/store/apps/details?id=com.app.taskManagement&pcampaignid=pcampaignidMKT-Other-global-all-co-prtnr-py-PartBadge-Mar2515-1'><img alt='Google Play で手に入れよう' src='https://play.google.com/intl/ja/badges/static/images/badges/ja_badge_web_generic.png' width="220" height="120"/></a>　　　　<a href="https://apple.co/3HcoulN"><img src="https://tools.applemediaservices.com/api/badges/download-on-the-app-store/black/ja-jp?size=250x83&amp;releaseDate=1659139200&h=0e6cd676b88181534f9150591ccc8dcd" alt="Download on the App Store" width="210"></a>

# 実装前の画面と実装後の画面
![after.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2567243/396394a0-3ed8-38d5-1431-3530be948e25.png)
実装前の画面です。
月と曜日の表示が英語になっているので、今回はそれを日本語で表示したいと思います。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2567243/13a8a3e4-4691-c101-ef42-7b5695639b9e.png" width="388" height="780">
実装後です。
月のところの表記と、曜日のところの表記が日本語になっていることがわかると思います。
それではやっていきましょう！！
# ステップ１
まずは`TableCalendar()`の中で`locale`というものを指定してあげましょう。
```dart:calendar.dart
TableCalendar(
    shouldFillViewport: true, //カレンダーの大きさを変えれるようにする奴、今回は気にしない
    locale: 'ja_JP' //　👈こちらの行を追加
),
```
これを指定してあげることで、ローカル、つまりどの言語を使用するか指定することができます。
しかし、Flutterが標準で用意してある、`TableCalendar()`には日本語対応されてないようなので、それを解決するために次のステップにいきましょう。
# ステップ２
まずは`pubspec.yaml`ファイルに`intl`というものを追加します。
これは、
メッセージの翻訳、複数形と性別、日付/番号のフォーマットと解析、双方向テキストなど、国際化とローカリゼーションの機能を提供します。 dart packages　より引用。
要はここでは言語対応させるために必要なパッケージです。
```dart:pubspec.yaml
dependencies:
  flutter:
    sdk: flutter

  table_calendar: ^3.0.4
  intl: ^0.17.0 //この行を追加。インデントに注意してください。
```
`intl`のバージョンについては[こちら](https://pub.dev/packages/intl)を確認して最新のものをお使いください。
そして追加したら、`pubspec.yaml`ファイルの上にある`Pub get`ボタンを押して読み込んであげてください。
# ステップ３
`main.dart`ファイルに記述を追加していきましょう。
```dart:main.dart
import 'package:intl/date_symbol_data_local.dart'; //intlインポートする

void main() {
  //runApp(const MyApp());  
  initializeDateFormatting('ja').then((_) => runApp(MyApp())); //上の記述をこちらに変更します
}
```
自分は`initializeDateFormatting('ja')`じゃなくて、`initializeDateFormatting()`という記述でも実装することができました。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2567243/13a8a3e4-4691-c101-ef42-7b5695639b9e.png" width="388" height="780">
これで完了です！！
# 最後に
`intl`パッケージを使うことで簡単に`table_calendar`の表示を日本語に対応させることができました。
もし役にたったら、いいねしてくれたら嬉しいです！
未経験からエンジニア転職したいならTwitterはじめよう！

# 読んでもらいたい人
エンジニア転職に向けて学習中の人や転職活動中の人でTwitterを利用していないorあまり活用していない人

# 目次
[はじめに](#はじめに)
[Twitterのメリット](#twitterのメリット)
&emsp;[リアルな情報収集ができる](#リアルな情報収集ができる)
&emsp;[現役エンジニアと繋がる](#現役エンジニアと繋がる)
&emsp;[純粋に楽しい](#純粋に楽しい)
[Twitterの活用方法](#twitterの活用方法)
[Twitterの注意点](#twitterの注意点)
&emsp;[勧誘系のDM](#勧誘系のdm)
&emsp;[ネガティブな発言は控える](#ネガティブな発言は控える)
[最後に](#最後に)

# はじめに
Twitterは情報収集や現役のエンジニアの方々と繋がるために最適なツールです。

私は元々Twitterを利用していませんでした。
そもそも「Twitter ＝ バカッター」のイメージが強かったことと、知らない人とやりとりをすることにすごく抵抗感があったからです。

そんな私がTwitterを始めることとなったきっかけは、入会していたテックキャンプで「Twitterで発信しよう！」というカリキュラムです。
「アウトプットすると企業の採用担当者の目に留まるかも・・・」
というような内容だったため、アウトプットがてら初めてみたところ、とても有益だったのでぜひ皆様にも活用していただきたいと思います。

ただし、Twitterでのアウトプット自体はほとんど無意味だったんじゃないかと思います。
アウトプットはQiitaでしましょう。

Twitterのメリットや活用方法をご紹介したいと思います。

# Twitterのメリット
### リアルな情報収集ができる
ググってもすぐに出てこないような有益な情報を得ることができます。
- 安価で有益なスクールの情報
- 勉強会の情報
- 学習方法
- おすすめ教材
- おすすめ書籍
- 学習サイト
- 先輩エンジニアのリアル
- 転職活動方法

### 現役エンジニアと繋がる
Twitter上では現役エンジニアの方々と気軽にやり取りすることができます。
[connpass](https://connpass.com/)などで開催される勉強会の情報も流れてくるので、積極的に参加しましょう。
エンジニアの方々とリアルで会うことができ、顔を覚えてもらえることでTwitterでのやり取りもさらに深まります。
勉強会は初心者向けのものもたくさんありますし、あまり構えすぎずに気軽に参加して大丈夫です。
内容が理解できなくても、最初は雰囲気だけ楽しむ程度で大丈夫です。
主催者の方々も参加者の方々も基本優しいです。

現役エンジニアと繋がっていると、転職活動中の企業のリアルな情報を教えてもらえることもあります。
もしかしたら、エンジニアとの繋がりから転職成功に繋がるなんてこともあるかもしれません。

### 純粋に楽しい
フォロワーが増えたり、「いいね」がたくさんもらえると普通にうれしいです。
ネタ系の方のツイートで笑えることもあります。
ハマりすぎないように注意しましょう。
あくまでエンジニア転職を成功させるためのツールです。
学習を最優先しましょう。（と自分に言い聞かせる）

# Twitterの活用方法
まずは現役エンジニアの方や最近エンジニア転職を成功された方をフォローしましょう。
特に自分が学んでいる言語のツイートをされてる方や、プロフィールに記載のある方はフォローしましょう。
「この人優秀だ！」と感じた時は、その方がフォローしている方もチェックしてみましょう。

# Twitterの注意点
### 勧誘系のDM
Twitterを始めていろんな方をフォローしていると、怪しい勧誘系のDMが結構届きます。
「邪険に扱うのもな・・・」
なんて優しく応対していると、甘い言葉を並べてLINEに誘導してきたりなかなか悪質です。
Twitter初期に絡みもなくいきなりDMしてくる人は無視して大丈夫です。
フォローは外して、しつこい人はブロックしましょう。

### ネガティブな発言は控える
企業の採用担当の目に留まる可能性もありますので、批判や不満などのネガティブな発言は控えましょう。
採用担当者が見ている前提でツイートしましょう。
なんなら履歴書や職務経歴書にアカウントを記載して武器にできるような内容にしておきましょう！

# 最後に
Twitterを上手に活用して、エンジニア転職を成功させましょう！
QNAP の Container Station のトラブルシューティングは ssh で入った方が楽

以前 QNAP に gitea を入れたという話を書いたのですが、その続きです。

https://qiita.com/YKInoMT/items/b9b9c5d8616fd098d60a

続きというか、ある時 gitea の web コンテナが停止していることが判明し、どうやっても起動しなくなって困ったという話からの、結局 Container Station だけで対応しようとすると無理があるので、素直に `docker` コマンド使った方が楽ですよ、という話です。

## 経緯

ある日 gitea のダッシュボードにアクセスしようとしたらエラーでアクセスできず、 QNAP の Container Station を開いたら web のコンテナが停止状態になってました。

![sc.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84947/b93e9cb3-fae7-b13f-cc1d-50deeaf8dbcf.png)

で、画面上の「開始」ボタンや「再起動」ボタンを押しても起動しない。

さらに、Container Station で得られる情報をみても特に何が原因かわからない。

ログを見ても特に情報なし、動いていた時点までの情報はわかりますが、停止状態になってしまったコンテナがなぜ開始できないのかはわかりません。。。

いろいろやったのですが、さっぱりわからず。

## ssh で入ってみたら ssh が原因であることがわかった

んで、そういえば QNAP は ssh で入れるから、ssh で入ったら何かわかるかな？っと思い、入ってみました。

まずは、 `docker ps -a` で web のコンテナID調べつつ、状態を見てみると、確かに止まってました。

```
$ docker ps -a             
CONTAINER ID   IMAGE                COMMAND                  CREATED        STATUS                     PORTS      NAMES
9f137b13a68d   gitea/gitea:latest   "/usr/bin/entrypoint…"   2 months ago   Exited (128) 10 days ago              gitea2_web_1
9ec873f6778f   mariadb:10           "docker-entrypoint.s…"   2 months ago   Up 3 days                  3306/tcp   gitea2_db_1
```

`Exited (128)` とかなってるので、エラーっぽい・・・

良くわからないので、 とりあえず何も考えず `docker start`。

```
$ docker start 9f137b13a68d
Error response from daemon: driver failed programming external connectivity on endpoint gitea2_web_1 (xxxxxx): listen tcp4 0.0.0.0:22: bind: address already in use
Error: failed to start containers: 9f137b13a68d
````

> listen tcp4 0.0.0.0:22: bind: address already in use

みたいなエラーが・・・

そういえば、 gitea も ssh 使うよなっと。。。

そして今 ssh してるよな、っと。

というわけで、QNAP の ssh のポートを 22 から別なポートに変更して終わり。

---

余談ですが、ボリュームのリサイズが数日待っても終わらない状態になってしまい、QNAP のリモートサポートを受ける事になり、その一環で ssh を有効にしたことがあったのですが、そのサポートを受けたあたりから gitea が停止していました。

それまでは QNAP の ssh は無効にしていたので gitea とぶつかってなかったのですが、QNAP 側でも ssh を有効にしてしまったので、おかしな状況になったのかなと。

既に使ってるポートを有効にできるんだ・・・という感じですが。


## 結論

というわけで Container Station で問題が起きた時は、ssh で QNAP にアクセスして docker コマンド使った方が圧倒的に楽だなと。

Container Station で docker のエラーを見れたら楽なのに・・・

ちなみに、 docker コマンドは実行する内容によっては `docker-compose.yml` の場所が分からないと実行できないですが、 QNAP の Container Station で作成したアプリケーションのデーターは `/share/Container/container-station-data/application/` にあるっぽいです。
javacでリリースバージョンを指定する

# 概要
Javaの外部ライブライりのバージョンUPを行った際に、実行環境のJavaよりライブラリのリリースバージョンが上だったので、実行環境のJavaのバージョンUPをすることになったときのメモです。

# リリースバージョンの確認
リリースバージョンの確認は、対象のクラスファイルをjavapで逆アセンブリすることで確認出来ます。javapコマンドの詳細な説明は[こちら](https://docs.oracle.com/javase/jp/17/docs/specs/man/javap.html)をご覧ください。

まずはクラスファイルへコンパイルするためのJavaファイルを準備します。
```java:HelloWorld.java
public class HelloWorld {
	public static void main(String[] args) {
		System.out.println("Hello World.");
	}
}
```

javacコマンドでコンパイルします。javacコマンドの詳細な説明は[こちら](https://docs.oracle.com/javase/jp/17/docs/specs/man/javac.html)をご覧ください。

```bash
$ java -version
openjdk version "11.0.11" 2021-04-20
$ javac HelloWorld.java
$ ls
HelloWorld.class  HelloWorld.java
```

javapで実行可能なリリースバージョンを確認します。
```
$ javap -verbose HelloWorld.class
・・・省略・・・
public class HelloWorld
  minor version: 0
  major version: 60
・・・省略・・・
```
60と表示されました。これはJDK16になります。
対応は[こちら](https://www.ne.jp/asahi/hishidama/home/tech/java/version.html)で確認しました。
実行環境がJDK11なので55になるかと思いましたが意外でした。


# リリースバージョンの指定
releaseオプションでリリースバージョンに8(JDK8)を指定します。
```
$ javac --release 8 HelloWorld.java
```

javapで実行可能なリリースバージョンを確認します。
```
・・・省略・・・
public class HelloWorld
  minor version: 0
  major version: 52
・・・省略・・・
```
52と表示されました。これはJDK8になります。

# まとめ
簡単ではありますが、javacとjavapコマンドを利用したリリースバージョンの確認を行いました。外部ライブラリのバージョンUPなどで、実行環境とリリースバージョンが不一致のときはjavapコマンドでバージョンを確認してみてください。