OmniAICreator/Qiita-1.07M huggingface dataset:
プロジェクトマネジメント、ITサービスマネジメント

#プロジェクトマネジメントとは
　プロジェクトマネジメントの技法を体系的にまとめたのが**PMBOK**

#PMBOKは9つの元に管理すべきであると示す
　・スコープ管理
　　作業範囲の明確化
　・時間管理
　　作業スケジュールの管理
　・コミュニケーション管理
　　情報の伝達と共有
　・調達管理
　　外部への発注検計と実施
　・リスク管理
　　潜在リスクの識別と管理
　・品質管理
　　品質基準の適合チェック
　・人的資源管理
　　必要な要因の確保
　・コスト管理
　　予算やお金等
　・総合管理
　　作業プロセス間の調査

#作業範囲を把握するためのWBS
 **WBSとはWork Breakdown Structure**の略
  プロジェクトに必要な作業や青果物を階層化した図で表すもの
　PMBOKでいうスコープ層に当たる

#開発コストの見積もり
　**・プログラムステップ法**
　　従来からある三森手法でソースコードの行(ステップ)数により開発コストを算出する手法

　**・ファンクションポイント法**
　　表示画面や印刷する帳票、出力ファイルなど、利用者から見た機能に着目して、その個数や難易度から開発コストを算出する手法
　　利用者にとっては見える部分が費用かされるため、理解しやすいという特徴

#ITサービスマネジメント
　顧客の要求を満たすITサービスを効果的に提供できるよう体系的に管理する手法

　・SLA
　　サービスレベルアグリーメント(SLA)とはサービスの提供者とその利用者との間でどのような内容のサービスをどういった品質で提供するか
　　を事前に取り決めて明文化したものをいう。

#サービスサポート
　ITILの中で「ITサービスの日々の運用に関する作業」をまとめたものがサービスサポート
　以下の機能と5つの業務プロセスによって構成されている
　機能
　　・サービスデスク(ヘルプデスク)
　　　ITサービスを利用する顧客とITサービスを提供する組織との間の一元的な窓口として活動する。
　プロセス
　　・インシデント管理
　　　　発生したインシデントに対し、可能な限り迅速に通常のサービス運用を回復して
　　　　ビジネスへの悪影響を最小限に抑える。
　　・問題管理
　　　　インシデントや問題の根本原因を特定し事業に対する悪影響を最小限に抑制しまた再発を防止する。
　　・構成管理
　　　　構成管理データベースを用いてITサービス提供に必要な構成アイテム(CI)を常に正しく把握し、各プロセスに効果的な情報を
　　　　提供する。
　　・変更管理
　　　　変更要求(RFC)の内容について、変更に伴う影響を検証していインパクトや優先度の評価を行い、許可又は却下を決定する
　　・リリース管理
　　　　承認の得られたコンポーネントを正しい場所に適切な時期にリリースする。　
#サービスデリバリ
　ITILの中で、「長期的な視点でITサービスの計画と改善を図る」のがサービスデリバリ。
　以下の業務プロセスによって構成されている
　　　
　**・サービスレベル管理**
　　サービスの提供者とその利用者との間でSLAを締結し、PDCAサイクルによってサービスの維持、向上に努める。
　**・キャパシティ管理**
　　容量、能力などシステムのキャパシティを管理し、最適なコストで、サービスが現在および将来の合意された需要を満たすに足る十分な
　　能力をもっていることを確実にする。
　**・可用性管理**
　　サービスの利用者が利用したいときに確実にサービスを利用できるよう、ITサービスを構成する個々の機能の維持を行う
　**・ITサービス継続性管理**
　　顧客と合意したサービス継続をあらゆる状況の下で見た鵜sことを確実にする。
　　具体的には、火災発生時であっても、最小時間でITサービスを復旧せ、事業継続のために必要な計画立案と試験を行う。
　**・ITサービス財務管理**
　　ITサービスにかかわるコストの予想と実際に発生したコストの計算や課金管理を行う。
#以上
外部プログラムを直接実行した場合にシェルスクリプトにフォールバックする言語・しない言語

※本記事の内容はWindowsには一切当てはまりません。

※Linux (Debian stretch) / macOS (10.14) で確認。

https://linuxjm.osdn.jp/html/LDP_man-pages/man3/exec.3.html 等によると、execvpでのみ、ENOEXECが発生したらシェルスクリプトと解釈する機能があるそうです。
スクリプト言語でシェルを使わず外部プログラムを実行した場合、この機能は働くのでしょうか？

## 準備

```
$ cat lsscript
ls
```

## 実行

### Ruby

- 直接実行(例): popenの引数が配列、systemの引数が2要素以上
- `ruby -e 'p IO.popen(["./lsscript"]).read'`

process.c proc_exec_cmd
execveを試し、ENOEXECなら/bin/shを付加して再試行

### Python

- 直接実行(例): check_call(等)の引数が配列
- `python -c 'import subprocess;subprocess.check_call(["./lsscript"])'`

Modules/_posixsubprocess.c child_exec
execveを試す。 **ENOEXECの場合失敗する**

Python3も同様。
なおshell=Trueとすると失敗しなくなりますがpipes.quoteやらshlex.quoteやらが必要となります。
(この記事の読者であればこちらの必要性はわかりますよね)

### Perl

- 直接実行(例): system()の引数が2要素以上
- `perl -e 'print system("./lsscript","dummy")'`

doio.c Perl_do_aexec5
execvpを試す。

### PHP

- 直接実行: pcntl_exec
- `php -r 'pcntl_exec("./lsscript");'`

ext/pcntl/pcntl.c pcntl_exec
execveを試す。 **ENOEXECの場合失敗する**

(上はexecですからサブプロセスとするにはfork呼び出し等が必要。その辺が必要ない標準実行系はext/standard/exec.cにありますが、popen固定のようです(つまり必ずシェルが入る))

## 結論

Python/PHPでシェルを介さずに実行しようとすると、自動でshを付けてくれません。[C言語のshebangもどき](https://qiita.com/cielavenir/items/6063c117f25f9188b84c)等を投げる際はご注意ください。
C言語　err, errx関数

## 概要

フォーマットされたエラーメッセージを表示して、終了します。

## Synopsis

```c
#include <err.h>

void err( int eval, const char *fmt, ...);

void errx( int eval, const char *fmt, ...);
```

## Arguments

#### `eval`

The value to use as the exit code of the process.
プロセスの終了コードとして使用する値。

#### `fmt`

NULL, or a printf()-style string used to format the message.
NULL、またはメッセージのフォーマットに使用されるprintf（）スタイルの文字列。

#### `Additional arguments`

As required by the format string.
書式文字列での必要に応じて。

## 詳細

関数のerr（）およびwarn（）ファミリーは、stderrにフォーマットされたエラーメッセージを表示します。

名前にxが含まれていない関数は、errnoの現在の値に関連付けられている文字列を表示します。

vが付いているものは「可変引数」関数です。

errを持つものは戻るのではなく終了します。

Function | errno string? | Varargs? | Exits?
--- | --- | --- | ---
err() | Yes | No | Yes
errx() | No | No | Yes
verr() | Yes | Yes | Yes
verrx() | No | Yes | Yes
vwarn() | Yes | Yes | No
vwarnx() | No | Yes | No
warn() | Yes | No | No
warnx() | No | No | No

## err()の詳細

err（）関数は、以下で構成されるメッセージを生成します。

- プログラム名の最後のコンポーネント、それに続くコロンとスペース
- fmt引数がNULLでない場合、フォーマットされたメッセージの後にコロンとスペース
- errnoの現在の値に関連付けられた文字列
- 改行

メッセージの出力後、引数evalの値で終了します。

#### 用例

```
if ((p = malloc(size)) == NULL)
   err(1, NULL);
if ((fd = open(file_name, O_RDONLY, 0)) == -1)
   err(1, "%s", file_name);
```

#### 出力例

```c
a.out: test: Undefined error: 0
```

#### 自作コード

コードで書くなら以下です。
※正確に再現できているのか確証は無いです。

```c
char *program_name;

void	ft_err(int eval, const char *fmt)
{
	printf("%s", basename(program_name));
	printf("%s", ": ");
	if (fmt)
	{
		printf("%s", fmt);
		printf("%s", ": ");
	}
	printf("%s", strerror(errno));
	printf("%s", "\n");
	exit(eval);
}
```

## errx()の詳細

errx（）関数は、errnoに関連付けられた文字列を含まないことを除いて、同様のメッセージを生成します。

メッセージは以下で構成されます。

- プログラム名の最後のコンポーネント、それに続くコロンとスペース
- fmt引数がNULLでない場合、フォーマットされたメッセージの後にコロンとスペース
- 改行

err（）およびerrx（）関数は戻りませんが、引数evalの値で終了します

#### 用例

```c
if (tm.tm_hour < START_TIME)
    errx(1, "too early, wait until %s", start_time_string);
```

## 参考

[QNX SDP 6.5.0 err(), errx()](http://www.qnx.co.jp/developers/docs/6.5.0/index.jsp?topic=%2Fcom.qnx.doc.neutrino_lib_ref%2Fe%2Ferr.html)
bindが起動しない時の対処法

###問題
bindが起動しない問題が発生した

###原因
DNSサーバへIPアドレスが割り当てられていなかったこと

###対策
上記のような問題を生じさせない為の対策は以下手順です

①bind設定後、ネットワークサービスを再起動させる

```
# servive network restart
```

②ログ確認を実施し、エラーがないことを確認する

```
# less /var/log/messages
```

以上がbindの問題時に対処した方法でした。
参考になれば幸いです。

最後までご覧いただきありがとうございました。
【Java開発】Java記事のまとめ

#はじめに
皆さん。こんにちは！

DreamHanksの254cmです。

この記事は今連載されているJava開発の記事のリンクをまとめた記事です。

##まとめ

###・環境構築
[JAVA開発のための環境構築 - 1](http://blog.dreamhanks.com/%e3%80%90java%e9%96%8b%e7%99%ba%e3%80%91java%e9%96%8b%e7%99%ba%e3%81%ae%e3%81%9f%e3%82%81%e3%81%ae%e7%92%b0%e5%a2%83%e6%a7%8b%e7%af%89-1/)
[JAVA開発のための環境構築 - 2](http://blog.dreamhanks.com/%e3%80%90java%e9%96%8b%e7%99%ba%e3%80%91java%e9%96%8b%e7%99%ba%e3%81%ae%e3%81%9f%e3%82%81%e3%81%ae%e7%92%b0%e5%a2%83%e6%a7%8b%e7%af%89-2/)
[JAVA開発のための環境構築 - 3](http://blog.dreamhanks.com/%e3%80%90java%e9%96%8b%e7%99%ba%e3%80%91java%e9%96%8b%e7%99%ba%e3%81%ae%e3%81%9f%e3%82%81%e3%81%ae%e7%92%b0%e5%a2%83%e6%a7%8b%e7%af%89-3/)

###・変数、演算子
[【Java開発】第1回 変数](http://blog.dreamhanks.com/%e3%80%90java%e9%96%8b%e7%99%ba%e3%80%91%e7%ac%ac1%e5%9b%9e-%e5%a4%89%e6%95%b0/)
[【Java開発】第2回 演算子](http://blog.dreamhanks.com/%e3%80%90java%e9%96%8b%e7%99%ba%e3%80%91%e7%ac%ac2%e5%9b%9e-%e6%bc%94%e7%ae%97%e5%ad%90/)

###・条件分岐、ループ
[【Java開発】第3回 条件分岐](http://blog.dreamhanks.com/%e3%80%90java%e9%96%8b%e7%99%ba%e3%80%91%e7%ac%ac3%e5%9b%9e-%e6%9d%a1%e4%bb%b6%e5%88%86%e5%b2%90/)
[【Java開発】第4回 ループ](http://blog.dreamhanks.com/%e3%80%90java%e9%96%8b%e7%99%ba%e3%80%91%e7%ac%ac4%e5%9b%9e-%e3%83%ab%e3%83%bc%e3%83%97/)

###・クラス
[【Java開発】第5回 クラス](http://blog.dreamhanks.com/%e3%80%90java%e9%96%8b%e7%99%ba%e3%80%91%e7%ac%ac5%e5%9b%9e-%e3%82%af%e3%83%a9%e3%82%b9/)
[【Java開発】第6回 コンストラクタ](http://blog.dreamhanks.com/%e3%80%90java%e9%96%8b%e7%99%ba%e3%80%91%e7%ac%ac6%e5%9b%9e-%e3%82%b3%e3%83%b3%e3%82%b9%e3%83%88%e3%83%a9%e3%82%af%e3%82%bf/)
[【Java開発】第7回 継承](http://blog.dreamhanks.com/%e3%80%90java%e9%96%8b%e7%99%ba%e3%80%91%e7%ac%ac7%e5%9b%9e-%e7%b6%99%e6%89%bf/)

###・配列とArrayList
[【Java開発】第8回 配列](http://blog.dreamhanks.com/%e3%80%90java%e9%96%8b%e7%99%ba%e3%80%91%e7%ac%ac8%e5%9b%9e-%e9%85%8d%e5%88%97/)
[【Java開発】第9回 多次元配列](http://blog.dreamhanks.com/%e3%80%90java%e9%96%8b%e7%99%ba%e3%80%91%e7%ac%ac9%e5%9b%9e-%e5%a4%9a%e6%ac%a1%e5%85%83%e9%85%8d%e5%88%97/)
[【Java開発】第10回 ArrayList](http://blog.dreamhanks.com/%e3%80%90java%e9%96%8b%e7%99%ba%e3%80%91%e7%ac%ac10%e5%9b%9e-arraylist/)

###・static, final,変数のスコープ
[【Java開発】第11回 static](http://blog.dreamhanks.com/%e3%80%90java%e9%96%8b%e7%99%ba%e3%80%91%e7%ac%ac11%e5%9b%9e-static/)
[【Java開発】第12回 final](http://blog.dreamhanks.com/%e3%80%90java%e9%96%8b%e7%99%ba%e3%80%91%e7%ac%ac12%e5%9b%9e-final/)

##補足記事
[【Java開発】Javaのメモリ](https://qiita.com/DreamHanks/items/3672ce14e1d087de86cf)

##ロジック練習
[【Java開発】ロジック練習問題 - 逆三角数字](https://qiita.com/DreamHanks/items/185a0d6628e545588a36)

##終わりに

以後の記事はDreamHanksのブログで連載されます。

私たちの最新の記事は[こちら](http://blog.dreamhanks.com/java%e5%85%a5%e9%96%80%e8%ac%9b%e5%ba%a7/)で確認できます。
Riot.jsの特徴

#プログラミング勉強日記
2020年9月15日
JSには色々なフレームワークがあって、開発の用途によって使用するフレームワークが違うと思うので、まとめてみようと思う。[Reactについて](https://qiita.com/mzmz__02/items/18f04f8e4ec84f1cc1af)と[Angularについて](https://qiita.com/mzmz__02/items/929beb891c194c9d0f43)、[Vue.jsについて](https://qiita.com/mzmz__02/items/0753cb65d7853cd60825)、[Next.jsについて](https://qiita.com/mzmz__02/items/d68667e281927a5f3e0d)まとめたので、今回はRiot.jsについてまとめる。

#Riot.jsとは
　Riot.js(読み方：ライオットジェーエス)はシンプルで軽量なコンポーネント指向のUIライブラリで、フロントエンドの開発で人気を集めている。
　Riot.jsはHTMLに似た文法を採用しているので、比較的使いやすいJSライブラリである。公式サイトは日本語に対応している。

#特徴

- コンポーネント指向
- 軽量でシンプル
- 学習コストが低い
- 大規模開発向きではない
- シェアが低い

##コンポーネント指向である
　ReactとAngular、Vue.jsと同様で、Riot.jsもコンポーネント指向である。コンポーネント指向は、ソフトウェアを機能ごとに部品(コンポーネント)として分割して、必要に応じて組み合わせて使う考えのことである。
　機能を小さい部品にして持たせているので、状態の管理もしやすくて再利用も容易にできる。再利用性が高くなり、デザインと技術の共同作業を簡単にすることができ、開発スピードの向上ができる。
　Riot.jsではHTMLとJSを組み合わせることで、再利用可能なコンポーネントとして定義したものをカスタム要素・カスタムタグという。

##軽量でシンプルである
　Riot.jsのすべては10KBに収まる容量で、ダウンロード速度が速くて、メンテナンスコストも低く済む。

##学習コストが低い
　公式サイトが日本語に対応していることもあり、勉強しやすい。また、コードの量も少なくて学習量が他のライブラリと比べて低く抑えられる。

##大規模開発向きではない
　Riot.jsはAngularのようにフルスタックじゃないので、データバインディング機能もない。また、双方向データバインディングがサポートされないので、自力で調べて実装する必要がある。


#参考文献
[Riot.jsの使い方を入門者向けに解説！他のライブラリと比較した際のメリットを紹介！フロントエンドにオススメの理由とは](https://agency-star.co.jp/column/riot.js/)
[「.js」選びに迷った時に役立つ！人気のJavaScriptライブラリ＆フレームワークまとめ！
JavaScript](https://career.levtech.jp/guide/knowhow/article/387/)
Rider + MvvmCross7.0.0でXamarin.Android環境構築

#環境
* Rider 2020.2.1
* MvvmCross 7.0.0

#ソリューション構成
<*ProjectName*>.Core
<*ProjectName*>.Droid

#<*ProjectName*>.Core
* ClassLibrary
* .Net Standard2.0

### NuGet
* MvvmCross 7.0.0

#<*ProjectName*>.Droid
* Xamarin Application
* Platform・・・Android
* Target API・・・Android10

### System Reference
* <*ProjectName*>.Core
* Mono.Android.Export.dll

####注意
`Mono.Android.Export.dllは自分の環境だとAndroid SDK4.4には入っていましたが、
それ以外のSDKフォルダに存在していませんでした。
そのため、RiderからMono.Android.Export.dllが見えず、Add Referenceで探しても出てきませんでした。
対処法はVisualStudioで参照に追加する、Mono.Android.ExportのパスをRiderのAdd Referenceで指定して入れるです。`

### NuGet
* MvvmCross 7.0.0
* MvvmCross.DroidX.RecyclerView 7.0.0
* MvvmCross.DroidX.SwipeRefreshLayout 7.0.0
* MvvmCross.DroidX.Material 7.0.0
* MvvmCross.DroidX.Leanback 7.0.0
* Xamarin.AndroidX.Lifecycle.LiveData 2.2.0.2

####注意
`Xamarin.AndroidX.Lifecycle.LiveData 2.2.0.2が最初から参照に入ってくれていればいいものの、
自分の環境では入ってくれていませんでした。そのため、NuGetから手動で入れる必要がありました`

#構成イメージ

プロジェクト名は任意です

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256718/ddf10312-560c-98a1-9c9e-96c771dd58ec.png)

#MvvmCross7.0.0を使用するうえでの注意
Mono.Androidはバージョン10.0を使用しなければなりません
https://www.mvvmcross.com/mvvmcross-7.0.0-release/
公式リリースでその旨が書かれています

AndroidのAPIバージョンでMono.Androidのバージョンが変わるんですかね・・・
そうなるとTargetAPIは10以上を指定しないといけないということになると思います。
この辺未熟なのでまだよくわかっていません・・・

#終わりに
以上でビルドまでできると思います。
Android以外は試していないのでMvvmCrossの公式ドキュメントを参考にしていただければいいと思います。
何か間違いがあれば教えていただけると幸いです。
読んでいただきありがとうございました。
【Curlコマンド】 忘れがちなAPIの動作確認の方法

##本記事の目的
アプリ開発をしているとサーバサイドでAPIを開発する機会が多いと思います。
また外部サービスともAPIを通じて連携する機会も多いと思います。
備忘録も兼ねてAPIの疎通を確認する際に使用するCurlコマンドについて記載していきます。

おまけになりますがLaravelでのBearerトークンの受取る方法なども記載しております。

##基礎：POSTリクエスト
```bash
# -X POSTを指定することでPOSTでリクエストすることが出来ます。
# -d パラメータを指定することが出来ます。(複数のパラメータを指定する場合は&で繋ぐこと)
$ curl -X POST https://hogehoge/api/v1/sample -d "name=tester&age=24"
```

##基礎：GETリクエスト
```bash
# -X GETを指定することでGETでリクエストすることが出来ます。
$ curl -X POST https://hogehoge/api/v1/sample?name=tester&age=24
```

##基礎：HTTP Headerを指定する
```bash
# -H HTTP Headerを付与することが出来ます。(複数ある場合は-Hを複数記載する)
$ curl -X POST 'https://hogehoge/api/v1/sample' -H 'Content-Type: application/json;charset=utf-8' -H 'Accept-Charset: utf-8'
```

##基礎：Bearer Tokenを指定する
```bash
$ curl -X POST 'https://hogehoge/api/v1/sample' -H 'Content-Type: application/json;charset=utf-8'  -H 'Authorization: Bearer xxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
```

##基礎：JSONパラメータを指定する
```bash
$ curl -X POST 'https://hogehoge/api/v1/sample' -H 'Content-Type: application/json;charset=utf-8' -d '{"name":"tester", "age":"24"}'     
```

##応用：Bearer Token + JSONパラメータを指定する
```bash
$ curl -X POST 'https://hogehoge/api/v1/sample' -H 'Content-Type: application/json;charset=utf-8'  -H 'Authorization: Bearer xxxxxxxxxxxxxxxxxxxxxxxxxxxxx' -d '{"name":"tester", "age":"24"}'
```

##豆知識：[Laravel] Bearer Tokenの取得方法
```bash
# HTTPヘッダーからBearer Tokenを取得する。
$bearer_token = $request->bearerToken();
```

##豆知識：[Laravel] パラメーターの取得方法
```bash
# パラメーターを取得する。
$name = $request->name;
$age = $request->age;
```
Microsoft TeamsのWebhook URLにNode.jsから情報を送ってみる


最近仕事のやりとりで[Temas](https://www.microsoft.com/ja-jp/microsoft-365/microsoft-teams/group-chat-software)を使う機会が増えてきました。

Teamsのハックを出来ないかと調べてみているメモです。

## Webhook URLの取得

自分が管理権限があるチームの左下に`アプリ`ボタンがあると思います。

![スクリーンショット 2020-09-15 16.27.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/c0e2a0e7-c610-e3e8-4ccd-1f5e27a72e51.png "スクリーンショット 2020-09-15 16.27.59.png")
割とこの第１ステップで迷いました。

ここから`Incomming Webhook`を探してチームに追加します。

> <img src="https://i.gyazo.com/d1c389981358a3b766001fc89924e060.png" width="400px">

> <img src="https://i.gyazo.com/f2930bcd15bf587c6e791474e161971a.png" width="400px">

利用するチャンネルを選びます。

> <img src="https://i.gyazo.com/9b9911a8fc3cad4a7d5450b93cd70cf6.png" width="400px">

名前を適当に決めましょう。

> <img src="https://i.gyazo.com/922f383a43072db3877e82e03035f75d.png" width="400px">

> <img src="https://i.gyazo.com/3a44e14e371b29ce1bd358740c63125f.png" width="400px">

作成ボタンを押すと`https://outlook.office.com/webhook/~~~`というアドレスが発行されます。

## CURLで試す

cURLだと以下をコピペで実行できます。

```bash
$ curl -H 'Content-Type: application/json' -d '{"text": "Hello World"}' <YOUR WEBHOOK URL>
```

実行結果はこんな感じです。

> ![スクリーンショット 2020-09-15 16.36.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/fe1bb2e3-cd01-790e-e883-3be514a077dc.png "スクリーンショット 2020-09-15 16.36.56.png")

> 参考: [cURL を使用してメッセージを Webhook に投稿する](https://docs.microsoft.com/ja-jp/microsoftteams/platform/webhooks-and-connectors/how-to/connectors-using#post-a-message-to-the-webhook-using-curl)

ここまできたらこちらのものですね。

## Node.jsから試す

axiosを利用します。

```bash
$ npm ini -y
$ npm i axios
```

```app.js
'use strict'

const axios = require('axios');
const URL = `https://outlook.office.com/webhook/~~~`; //各自のWebhook URL

axios.post(URL, {text: 'Node.jsから送信'})
    .then(res => console.log(res.data));
```

シンプルなコードですね。
実行します。

```bash
$ node app.js
1
```

`res.data`には1という数字が返ってくる模様。

> ![スクリーンショット 2020-09-15 16.53.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/bbbd5389-4245-654a-5180-95ee28b14294.png "スクリーンショット 2020-09-15 16.53.26.png")

## 所感

Webhook URLの発行で結構迷いました。Slack, LINE, Discordなど様々なBOTを触りましたが今回はどんなパターンだろう......といった感じです。今のところの結論はSlack BOTに近いような印象です。Incoming WebhookのアプリというかBOTアカウントをチームに追加すると、連動しているWebhook URLが発行されるといった流れ。

他にもやり方ある気がするので引き続き調べてみます。
Google ColabでOxford_iiit_petを使用した画像セグメン

tensorflowを使って画像のセグメンテーションを勉強中のかわたくです。

今回はoxfordのデータセットを使ってみました。

#実行環境
macos
Google Colab


#詰まったところ
vscodeで一旦コードは書き終えたのですが、やはりGPUを使えないため処理が遅いという悩みが残ったまま。

そこで、Google先生が公表しているGoogle Colabを使うことにしました。
こちらはGPUを無料で使うことができます。

まず、自分のコードを貼ったのですが、Oxfordのデータセットをダウンロードできていないとの表示。
あれ〜、おかしいな。VScodeでは普通にできたんだけどな〜って思いながら、色々調べてみたところ、
["u-netによる画像セグメンテーション"](https://data-analysis-stats.jp/%E6%B7%B1%E5%B1%9E%E5%AD%A6%E7%BF%92/u-net%E3%81%AB%E3%82%88%E3%82%8B%E7%94%BB%E5%83%8F%E3%82%BB%E3%82%B0%E3%83%A1%E3%83%B3%E3%83%86%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3image-segmentation%E3%81%AE%E8%A7%A3%E8%AA%AC/)
こちらの記事が見つかりましたので、参考にさせてもらったところ、

```
!pip install -q git+https://github.com/tensorflow/examples.git
!pip install -q -U tfds-nightly
```

これらのコードを最初に書く必要があったみたいでした。

#まとめ
どうやらpcのterminalで一旦ダウンロードしていたとしても、google colabで使う時は、colab上でまたダウンロードする必要がありそうですね。

そしてやはりGPUはCPUよりも高速な処理が可能でした！
Python | enumerate関数

# はじめに
* enumerateとはなにか
* 従来の書き方
* enumerate関数を使った記法

## enumerateとはなにか
`enumerate`とは、'列挙する'という意味です。

forループなどでインデックス（数字）を打つときなどに用いることがあります。

## 従来の書き方

```python
i = 0

for yaki in ['takoyakki', 'okonomiyaki', 'monjayaki']:
    print(i, yaki)
    i += 1
    
# conclusion

'''
0 takoyakki
1 okonomiyaki
2 monjayaki
'''
```

`i`に０を代入して、`for`で回すたびにインデックス番号を打つという方法がありますが、これらは`enumerate`を用いることで、簡単にかけます。

## enumerate関数を使った記法

```python
for i, yaki in enumerate(['takoyakki', 'okonomiyaki', 'monjayaki']):
    print(i, yaki)

# conclusion

'''
0 takoyakki
1 okonomiyaki
2 monjayaki
'''
```

このように、`enumerate`を使うことで、簡単にインデックス番号を付けることができます。
Python(numpy, cv2) で画像データに対する画素位置操作のメモ

## 背景

* github などにある他者の python(numpy, cv2)で画像データを処理しているコードが読解できない
* `[...,::-1]` とかで記号的なので検索もしづらい :cry:

## BGR -> RGB

cv2 だと標準で BGR 画像として処理するようです. 保存や matplotlib で表示時に RGB に並び替える必要あります.

(H, W, C) な配列とします.

`[:, :, ::-1]` で C 次元(チャンネル)の要素が入れ替わります.

https://stackoverflow.com/questions/4661557/pil-rotate-image-colors-bgr-rgb

`:` は slice(`(start, end, step)`) でその次元の全要素を指す `(None, None, 1)`(?) or `(0, n-1, 1)` 相当.

`::-1` も slice で `(0, n-1, -1)` で end から start へと逆方向に 1 づつ進む.

RGB(3 要素) の場合は `[2, 1, 0]` のインデクシングとなる.

したがって BGR -> RGB と並び替えができます.

### `...`

`img[...,::-1]` なケース.
初見者からすると謎すぎてまったくわかりません.

`...` は検索性低くてつらいですね.

https://www.scivision.dev/numpy-image-bgr-to-rgb/

`...` = `:, :` の省略形でした. 各次元で全要素選択という感じでしょうか.

`[..., ::-1]` = `[:, :, ::-1]` = `[:, :, [2, 1, 0]]` という感じです.


### 特定の channel だけに処理をしたい

たとえば G channel だけ 1 を設定したいなど

`img[:, :, 1] = 1`

とします.

### alpha を RGB にブロードキャストしたい

numpy だけかも.

rgb(3 channels) と alpha(1 channel) の画像があるときに, 単純に `rgb * alpha` では乗算できません.

alpha の値を RGB にブロードキャスト(複製)する必要があります.

` fg * alpha[:, :, None]` として, `None` を指定するとブロードキャストしてくれます. :thinking: 

https://stackoverflow.com/questions/51091560/numpy-indexing-using-none-for-pairwise-operations

None = np.newaxis として次元を一つ増やす振る舞いになっています(わかりずらい...)

ast(構文木)をきちんと考慮しているようで, 

`bg * (1 - alpha[:, :, None])` みたいになにか演算してから RGB と乗算もうまく行きます.

## 画素要素を判定して代入するなど

```
for i in range(len(pixels)):
   pixels[i] = pixels[i] < 0.5 ? 0 : pixels[i]
```

みたいな操作をしたい.

```
pixels[pixels < 0.5] = 0
```

とすると, 全画素で処理してくれます.

shape(画像サイズやチャネル数)があっていれば, 他の ndarray を使うのも可能です.

e.g.

```
alpha[trimap_np[:, :, 0] == 1] = 0
```

alpha 画像で, trimap_np の R channel が 1 の画素位置の値を 0 にする

```
fg[alpha == 1] = image_np[alpha == 1]
```

T.B.W.

### 画像を部分領域(tile)に分割する

slice 記法では, step で 4 ピクセルおきなどは指定できますが, 4 pixel づつというのはできないので, for 文などで slide `(start, end, 1)` で start, end をそれぞれ指定するか, numpy, cv2 あたりで部分領域に分割する関数を使います.
(ちなみに numpy.tile は画像を tile 状にリピートして並べる関数なので分割には使えない)

## その他

視覚的に説明してくれている記事

Numpy’s indexing and slicing notation explained visually
https://medium.com/@buch.willi/numpys-indexing-and-slicing-notation-explained-visually-67dc981c22c1
Cryptography - Diffie-Hellman Key Exchange

1. Alice 與 Bob 協定使用 p = 23 以及 g = 5

2. Alice 選擇一個 secret number(整數), a = 6, 計算 A = g**a mod p 並傳給 Bob
>A = 5**6 mod 23 = 8

3. Bob 選擇一個 secret number(整數), b = 15, 計算 B = g**b mod p 然後傳給 Alice
>B = 5**15 mod 23 = 19

4. Alice 計算 s = B**a mod p
>19**6 mod 23 = 2

5. Bob 計算 s = A**b mod p
>8**15 mod 23 = 2

https://clu.gitbook.io/scrapbook/112-diffie-hellman-key-exchange
windows10への理系研究室関連アプリのinstall



# intro

2020年のコロナ狂騒時のゼミで必須のアプリのinstall memoです．

    wsl+ubuntu+emacs+ruby

での作業になります．


# wsl (windows subsystem for linux)

-   コントロールパネル->プログラム->Windows機能の有効化->Linux用windowsサブシステム
-   microsoft storeでubuntuをinstall，起動
-   この辺りは，最新版だと少し違うかも．

　- ubuntuは18.04が良さそう．20.0だとダメかも．

-   <https://docs.microsoft.com/ja-jp/windows/wsl/install-win10>
-   <https://docs.microsoft.com/ja-jp/windows/wsl/install-manual>


# terminal

-   左上のアイコンを右クリックして，プロパティを選ぶ
    -   画面の色タブを選択
    -   画面の背景で，薄めを選択
    -   画面の文字で，濃い目を選択
-   さらに綺麗なのをお望みなら， [Windows のコンソールを使いやすくしよう](https://techblog.recochoku.jp/5537)
-   さらに，terminalを導入すればそこからwslを使える


# emacs

-   sudo apt install emacs
-   ダメなら
    -   sudo apt-get update
    -   sudo apt install emacs


# ruby

rbenv, rubyを入れて設定してください．

-   <https://qiita.com/tsukamoto/items/6e9a181b6e0defc27a39>
-   <https://qiita.com/cocoabreak/items/fd51b366cf18e2714240>

ダメなら，

-   `sudo apt install ruby-full`


# これ以降は3年領域実習生は任意

-   terminal
-   brew
-   fish
-   latex(3年領域実習生は不要)
    -   <http://www.aise.ics.saitama-u.ac.jp/~gotoh/Ubuntu1804JPonWSL.html#toc8>



------
 - **source** ~/git_hub/ruby_docs/multi_scale_22_text/excludes/semi_lattice_20f/install_win10.org
RailsでFakerを使ったエラー処理

##RailsでFakerを使ってダミーのユーザーを作成する

自分が忘れないためにメモしてます。

```
require 'faker'

# メインのサンプルユーザーを1人作成する
User.create!(firstname:  "Kako",
             lastname:  "Ogura",
             email: "example@railstutorial.org",
             password:              "foobar",
             password_confirmation: "foobar")

# 追加のユーザーをまとめて生成する
99.times do |n|
  firstname  = Faker::Name.first_name
  lastname = Faker::Name.last_name
  email = Faker::Internet.email
  password = "password"
  User.create!(firstname:  firstname,
               lastname: lastname,
               email: email,
               password:              password,
               password_confirmation: password)
end
```
これで

```
$ rails db:migrate:reset
$ rails db:seed
```
すると
```
ActiveRecord::RecordInvalid: Validation failed: Email has already been taken
```

###なぜ？？？？？

そこからデータベースを削除したり、公式ドキュメントみたりいろいろ探索したところ、

そもそもサーバーを起動したままだから重くなってるのではないかと思い、一旦サーバーを落として実行すると、、、

![スクリーンショット 2020-09-15 16.39.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/718710/5a29f7e0-d081-98dd-13e4-20507bab833c.png)


###できた！
リポジトリ用いたパッケージのインストール方法

###パッケージインストールコマンド

serverにパッケージをインストールする方法は2種類あります。
一つはyumコマンドを用いるやり方で、もう一つはrpmコマンドを用いた方法です。
①yum使用
yumは.repoの中にあるリポジトリの中経由でパッケージをインストールします。

```
# yum install [パッケージ名]
```

②rpm使用

```
# rpm -ivh [パッケージ名] 
　※ivhはパッケージの進捗みながら新規でインストールする時
# rpm -Uvh [パッケージ名]
　※Uvhはパッケージのバージョンアップを実施する時

```

###リポジトリとは
パッケージをインストールする時に使用するもので、箱のようなものです。
yumでインストールする時の仕組が以下に記載されているので、
参考にしてください。

参考リンク：yum installで学ぶ！yumの仕組み

>https://tech-blog.rakus.co.jp/entry/2017/12/14/105052


###リポジトリを作成してインストールしたい時
上記のような仕組でパッケージを普段インストールしているが、
外部接続が出来ない時やリポジトリが存在しない時などはyumでインストール出来ないのでリポジトリから作成する必要があります。
以下リポジトリの作成方法です。

####具体的なリポジトリ作成手順
①cdromとしてマウント場所を作成する

```
# mkdir -p /mnt/cdrom
```
②マウントする

```
# mount /dev/cdrom /mnt/cdrom
```

③.repoファイルを作成する

```
# vi /etc/yum.repo.d/local_dvd.repo

[local_dvd]
name=RHEL7 test
baseurl=file:///mnt/cdrom/
enabled=1
gpgcheck=0
gpgkey=file:///mnt/cdrom/RPM-GPG-KEY-RHEL7
```

④.repoが登録されていることを確認する

```
# yum repolist all
```

⑤レポジトリをマウントする

```
# mount -t iso9660 /dev/cdrom /media
```

⑥yumでパッケージをインストールする

```
# yum install [パッケージ名]
```

以上がインストール時の流れでした。
参考にさせていただいたものは以下に記載します。
最後までご覧くださり、ありがとうございました！

##引用

ローカルメディアなどyumのリポジトリとして登録
>https://shimi-dai.com/register-yum-with-localmedia/
tkinterで”too early to create image”と出てしまう

# TL;DR
先にTk()を実行しておこう

# 状況
tkinterを使ってGUIプログラムを作ろうとしていたとき、canvas上で画像を表示しようとして、書いたところエラーが出たためipythonで中身を確認しようとした。

```python:ipython
from PIL import Image, ImageTk
import tkinter as tk

img = Image.open("hoge.png")
imgtk = ImageTk.PhotoImage(img)
```
すると、

```
RuntimeError: Too early to create image
```

となって先に進めなかった

# 原因
tk.Tk()を先に呼び出しておかないとPhotoImage()は使えない

# 対処
ipythonで解析しようとしていたとき、もとのスクリプトにあるtk.Tk()が反映されていなかったため、この様になった。もともと困っていたエラーは画像の方に出ていたものだから、混乱して発見が遅れた。ipython上ではroot=tk.Tk()と適当にTk()を呼んでおけば、後は問題ない。
ArUcoのダイヤモンドマーカーを試してみる(C++)

# はじめに

AruCoというARマーカーのライブラリがあるが、日本語の記事はどれもPython+OpenCVで単純なマーカーの検出を行うか、キャリブレーション処理の方法くらいしか記事がなかった。今回はマーカーの姿勢推定の精度向上を図るためダイヤモンドマーカーを使用するに至ったが、ダイヤモンドマーカーに関する日本語の記事がほとんどなかったため、備忘録も兼ねてダイヤモンドマーカーがどんなものなのかからダイヤモンドマーカーの検出までを書いていく。

# 環境

使用した環境は以下の通りになる

* Windows 10 Home
* OpenCV 4.1.1 (ソースからビルドする、opencv_contribもビルドすること)
* Visual Studio 2019

# ダイヤモンドマーカーとは

![ChArUcoBoard-mx3-my3-d10-os1000-bb1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104310/709436fc-6a9f-0142-4657-33218cea9feb.png)

3x3のチェスボード + ArUcoマーカー4つで作られるマーカーのこと、上記画像で1つのマーカーとして扱う。特徴として以下が挙げられている。

* 4つのマーカーIDを使用するため、より多くのマーカーを単一の辞書から作成できる(100個の辞書なら100^4個)
* チェスボードを使用しているため正確な姿勢推定が行える 


# マーカーの作成

マーカーを作成する関数が`<opencv2/aruco/charuco.hpp>`内にあるため、それを使用する。
Python環境では`pip install opencv-python`と`pip install opencv-contrib-python`でArUcoが使えるようになるが、その場合は以下の`drawCharucoDiamond`が**使用できなかった**。(ソースからビルドしたものを使えばできるかもしれないが未確認)
また、OpenCVForUnityでも実行ができなかったので注意。

```c++:createmarker.cpp
cv::aruco::drawCharucoDiamond(dictionary, cv::Vec4i(45,68,28,74), 200, 120, markerImage);
// 引数
// dictionary マーカーの辞書
// ids ダイヤモンドマーカーに使用する4つのマーカーID
// squareLength	ピクセル単位のチェスボードの辺の長さ
// markerLength	ピクセル単位のArUcoマーカーの長さ
// img	出力画像、画像サイズは3*squareLength + 2*marginSizeになる
// marginSize	出力画像におけるピクセル単位のマージンのサイズ
// borderBits	マーカーの境界線の幅
```

# マーカーの検出

マーカーの検出は一度通常のArUcoマーカーを検出してから、ダイヤモンドマーカーかを判定する検出を行う。

```c++:detectmarker.cpp
// 通常のArUcoマーカー検出
cv::aruco::detectMarkers(inputImage, dictionary, markerCorners, markerIds);

// 検出されたマーカーのコーナーとIDを使ってダイヤモンドマーカーの検出を行う
cv::aruco::detectCharucoDiamond(inputImage, markerCorners, markerIds, squareLength / markerLength, diamondCorners, diamondIds);
// 引数
// image	入力画像
// markerCorners	detectMarkersで取得したCorners
// markerIds	detectMarkersで取得したIds
// squareMarkerLengthRate	マーカ―サイズとチェスボードの辺の長さの比率、squareLength / markerLengthで計算できる
// diamondCorners	Cornersの出力
// diamondIds	Idsの出力、1つのダイヤモンドマーカーにつき4つのIdが出力される
// cameraMatrix	カメラ行列
// distCoeffs	歪み係数
```

ダイヤモンドマーカーを取得し、drawAxisで軸まで表示したものが以下になる。
![スクリーンショット 2020-09-11 151709.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104310/ebc8f5f8-4cc1-6fb4-2a04-4ac59baf5480.png)
moment.jsはレガシープロジェクトになった

元の公式の記事：https://momentjs.com/docs/#/-project-status/
#moment.jsの課題
momentオブジェクトがimmutableじゃない
サイズがデカい
#今後のmoment.js
・新しい機能は追加されない
・immutableに変えることはしない
・サイズの大きさには対処しない
・長期に渡る既知のバグや問題のある動作は修正しないかも？
・重大なセキュリティ上の問題が発生すれば対応する

新しいプロジェクトでmoment.jsを使用することは避けるべきであると述べています。
#代替ライブラリ
##Luxon
moment.jsのコントリビューターが作った進化版
型がすべてimmutable
https://moment.github.io/luxon/

他のライブラリも元の公式には色々載ってます。
ちなみに僕はluxonがイチオシです。

#所感
しょうがないですが、使い慣れたライブラリが役目を終えるというのは
中々寂しい気持ちになりますね
momentとそのコントリビューターには盛大な感謝を贈りたいですね。
AWS　Redshiftに関して

### Redshiftに関して

ReddhiftとはAWSが提供しているデータウエアハウスサービス。Redshiftでは並列コンピューティングをサポートしており、大量のデータを短時間で読み出し分析することが可能になります。強みとしては「コスト」「パフォーマンス」「アジリティ」があげられる。「コスト」はイニシャルコストが不要であり、使っただけの従量課金制になります。「パフォーマンス」はノードを追加することによりパフォーマンスを向上することができ、スケールアップ・スケールアウトどちらも対応可能。「アジリティ」はすぐに始められることができ、パフォーマンスも容易に上げることが可能。AWSの各サービスとの連携もしやすいのも強みであると思います。MPP（超並列処理）でありカラム指向でもあるのでデータウエアハウスとしてのパフォーマンスがいいというのが特徴です。データ分析基盤は大きく三つの層に分けることが出来ます。「データレイク層」「データウエアハウス層」「マート層」です。データレイク層は元データを格納している層。データレイクに保存されているデータは加工せずに元のデータをそのまま格納することが重要になってきます。データウエアハウス層はデータレイクにあるデータを分析向けに使いやすく加工した層。データレイクにあるデータというのはシステムの都合に合わせて設計されています。そのため、データ分析に最適なデータではないこともあります。そのためデータレイクにあるデータを加工して分析しやすい形に直し、データウェアハウスに格納します。マート層は特定の用途のために加工・整理したデータを格納した層。特定の分析や分析システムに特化したデータを格納している。Redshiftはこのうちの「データウェアハウス層」「マート層」で使用されます。



＜参考にさせていただいたサイト＞
<a href = 'https://dev.classmethod.jp/articles/redshift/'>[AWS]RedshiftをAWS Command Line toolから使ってみる</a>
TabBarControllerの数を調整(変更)する方法 

## 概要
・Swift5
・Xcode 11.3
での検証になります！

こちらは、個人的なメモ書きとして残しております。
参考になった方は「いいね！」をしてもらえると嬉しいです。



## 実装例
### 前提条件
・ 追加StoryBoardには、TabbarItemがついていることを想定しています。
・ 5つ目追加したり、削除したりする処理になっています。
・ ViewController内で記載します。

### 追加(1番後ろに追加します)

```swift
  if (self.tabBarController?.viewControllers?.count ?? 5) > 4 { return }
  guard let viewControllers = self.tabBarController?.viewControllers  else { return }
  if viewControllers.count > 4 { return }
  let storyboard = UIStoryboard(name: "xxxxxxx", bundle: nil)
  guard let viewController = storyboard.instantiateInitialViewController() else { return }
  self.tabBarController?.viewControllers?.append(viewController)
  // self.tabBarController?.viewControllers? を　viewControllersにするとうまく動かないので注意ですm(_ _)m

```

### 削除(1番最後の分を削除する)
```swift
 guard let viewControllers = self.tabBarController?.viewControllers  else { return }
 if viewControllers.count != 5 { return }
 self.tabBarController?.viewControllers?.removeLast()
```
updateする際に画像の初期値を入れる方法

[理想]曲名と曲の画像を投稿するサイトを作っていると仮定する。
inputタグの file uploadではセキュリティの関係上、アップロードしていた画像の初期値を持つことはできないらしい。
しかし、曲名だけ変更したくて画像はそのままで良い時でも、毎回使用されていた画像を探し出してきてアップロードし直さなきゃいけないのはユーザーのストレスになる。
試しに、画像を何も入れずに曲名だけ変更すると、presence trueのvalidationに引っ掛かりエラーになる。
-> 画像を入れ直さなくても他の値が編集できるようになりたい。

[現状]

```ruby:item_controller
def update
　　 @item = Item.find(params[:id])
    item = ItemsTag.new(item_update_params)

    if item.valid?
       item.update
      @item = Item.find(params[:id])
      render :show
    else
      render :edit
    end
  end
```
```ruby:items_tag.rb

  def update
    item = Item.find_by(id: item_id)
    item.update(name: name, image: image, description: description, price: price, category_id: category_id, condition_id: condition_id, shipping_fee_person_id: shipping_fee_person_id, region_id: region_id, date_ish_id: date_ish_id, user_id: user_id, id: item_id)
    tag = Tag.where(tag_name: tag_name).first_or_initialize
    tag.update(tag_name: tag_name)
  end
```

itemsテーブルとtagsテーブルの値がフォームオブジェクトを使って保存しているので、
paramsはformsで定義したupdateメソッドに引き渡され、updateアクションが実行されています。

[方法]
上記の状態で、paramsを見てみると、findメソッドで探した@itemの中には、画像が入っているので、@item.imageと初期値が確認できる。しかし、ItemsTagでインスタンス生成したitemの中には画像が入っていない(active storage上には保存されているがitemsテーブルにもtagsテーブルにも「image」というカラムは存在しないため。）そのため、@itemの中に入ってる画像の初期値を引っ張ってくればオッケー。


if item.image == nil
      item.image = @item.image
    end
と、「もしitem.imageの値がnilだった時は（＝画像を何もアップロードしなかった時）item.imageの値（nil) を @item.image(初期値が入ってる）に上書きする。
という条件分岐をかける。
また、@item.image.blobでは、パラメーターからではなく、activestorageに保存されているデータベースから値を引っ張ってきているのでblobまで記述する必要がある。

```ruby:item_controller
def update
    @item = Item.find(params[:id])
    item = ItemsTag.new(item_update_params)
    if item.image == nil
      item.image = @item.image.blob
    end
    if item.valid?
       item.update
      @item = Item.find(params[:id])
      render :show
    else
      render :edit
    end
  end
```

以上です
CakePHPで実装しているAPIをJQueryのAJAXから呼び出す。

# やりたこと
CakePHPで実装しているAPIをJQueryのAJAXから呼び出す。
単純に呼び出すと`CSRF token from either the request body or request headers did not match or is missing`が発生する。
CSRFチェックを停止するのは避けたい。

# 環境(今回の作業に関連ないものも記載)
* cakephp4.1.2
* jQuery3.5.1

# 実装
templateファイルにcsrfToken用のinputを配置する。

```xxx.php
<input type="hidden" name="_csrfToken" autocomplete="off" value="<?= $this->request->getAttribute('csrfToken') ?>">
```

それをjsファイルから取得してAPIを呼び出す。

```xxx.js
$.ajax({
    type: 'post',
    url: '/xxxs/add',
    headers: { 'X-XSRF-TOKEN' : $('input[name="_csrfToken"]').val() },
    beforeSend: function (xhr) {
        xhr.setRequestHeader('X-CSRF-Token', $('input[name="_csrfToken"]').val());
    },
    dataType: 'json',
    data: {
        "_csrfToken":$('input[name="_csrfToken"]').val()
    },
    async: true,
    cache: false,
}).then(function (data) {
})
```

# 参照
https://stackoverflow.com/questions/33918745/cakephp-ajax-csrf-token-mismatch
今更ながらjava appletを動かす

#はじめに
過去にjavaの勉強の為にappletを使った簡単な制作物を作っていたのですが、最近になってJDK11で過去の制作物を動かそうとコンパイルすると

```
注意:Test.javaは推奨されないAPIを使用またはオーバーライドしています。
注意:詳細は、-Xlint:deprecationオプションを指定して再コンパイルしてください。`
```
と出るので、`-Xlint:deprecation`をつけて再コンパイルすると

```
Test.java:3: 警告:[deprecation] javax.swingのJAppletは推奨されません
public class Test extends javax.swing.JApplet {
                                       ^
警告1個
```
という文が出て、そのままappletviewerで開こうとすると色々とエラーが出てきまして、基本情報技術者試験を受験するために少しjavaを勉強しただけの自分にとってはよくわからないエラーだったので調べてみて、そこで初めてjdk11ではappletが動かないということを知りました…

どうしても過去の制作物を動かしたかったので、取り急ぎappletを動かすためにjdk11をアンインストールしてjdk8をインストールし直しました。その手順を備忘録としてまとめておきます。

##方法
まずopenjdk-11-jdkをアンインストールするために、次を実行する。`sudo apt-get purge openjdk-\* icedtea-\* icedtea6-\*`
完了したら`java -version`で`そのようなファイルやディレクトリはありません`というのを確認してから、`sudo apt install  openjdk-8-jdk`を実行し`openjdk-8-jdk`のインストールを行う。
完了したら`java -version`で確認して、インストール完了。
再度コンパイルしてもエラーは出ないはず。
C言語　mallocとcallocの違い

## 概要
calloc関数は、malloc関数で確保して、領域を0で初期化する。

## malloc

malloc関数は、動的にメモリ領域を割り当て、そのメモリアドレスを返す関数です。
確保されたメモリ領域には、不定値を持ったオブジェクトが置かれた状態です。

```c
#include <stdlib.h>

void *malloc(size_t size);
```

memsetで初期化をすることでcallocのように使うことが出来ます。

```c
if (!(p = (char *)malloc(sizeof(char) * 4)))
    return (0);
memset(p, '\0', 4);
```

## calloc

malloc関数と異なり、確保された領域の全ビットが自動的に`0`で埋められます。
整数型であれば`0`で初期化されていると考えて良いですが、他の型の場合は想定と異なる意味を持つかもしれません。たとえば、ポインタの場合、「全ビットが 0」という状態が、ヌルポインタを表すとは限りませんし、浮動小数点型の場合、「全ビットが 0」＝「0.0」とはならないかもしれません。

第１引数に要素数を、第２引数に要素１つ分の大きさを指定します。

```c
#include <stdlib.h>

void *calloc(size_t count, size_t size);
```

```c
if (!(p = (char *)calloc(4, sizeof(char))))
    return (0);
```

## 参考
[ポインタ⑤（動的なメモリ割り当て） | Programming Place Plus　Ｃ言語編　第３５章](https://programming-place.net/ppp/contents/c/035.html#malloc)

[BohYoh.com－C/C++ FAQ callocとmallocの違いは何ですか。](http://www.bohyoh.com/CandCPP/FAQ/FAQ00054.html)

[BohYoh.com－C/C++ FAQ mallocに対するcallocのメリットは何ですか。](http://www.bohyoh.com/CandCPP/FAQ/FAQ00096.html)

[callocの速度 - プログラマ専用SNS ミクプラ](https://dixq.net/forum/viewtopic.php?f=3&t=13572)

[BohYoh.com－C/C++ FAQ mallocに対するcallocのメリットは何ですか。](http://www.bohyoh.com/CandCPP/FAQ/FAQ00096.html)
Enterprise Cloud Service Public Preview on AWS - Enterprise Security 編についてまとめて和訳してみた④

##はじめに
今回は、2020年6月12日に Vinay Wagh 氏と Abhinav Garg 氏によって投稿されました「 Enterprise Cloud Service Public Preview on AWS 」で紹介されている Enterprise Security の1つである「 Customer managed keys for notebooks 」に関する内容を翻訳し、まとめてみました。

本記事のリンクは下記参照。
■リンク
 ・[Customer managed keys for notebooks](https://docs.databricks.com/security/keys/customer-managed-keys-notebook-aws.html?_ga=2.219238297.1449789981.1598426331-249388490.1574239857)
・[Enterprise Cloud Service Public Preview on AWS](https://databricks.com/jp/blog/2020/06/12/enterprise-cloud-service-public-preview-on-aws.html)


##エンタープライズセキュリティ
今回の AWS 上での Databricks のエンタープライズクラウドサービスにおけるエンタープライズセキュリティの主な内容は以下の4つです。
今回は、この5つの内の「Notebook の為の顧客管理キー」について、紹介したいと思います。

■エンタープライズセキュリティ
①Data Lake の真のポテンシャルを妨げないセキュリティ
②顧客管理VPC
③セキュアなクラスタ接続
④Notebook の為の顧客管理キー
⑤IAM 証明パススルー

##Notebook の為の顧客管理キー
###概要
セキュリティを重視する組織は、パブリッククラウドの使用、SaaS アプリケーション、そしてサードパーティサービスのリスクを評価するリスク管理プロセスがあります。
サードパーティのサービスプロバイダのリスクを軽減することで、外部サービスを使用するための強力なケースを構築できます。一部の規制された産業では、管理キーを使用して特定のタイプのデータを暗号化する必要があります。
これは、個人データやその他の機密情報を定期的に使用する部門にとって特に重要です。

ワークスペースノートブックは、主にデータベースの Databricks コントロールプレーン内に保存されます。Databricks プラットフォームでは独自のキーでノートブックを暗号化でき、キーはワークスペースの作成時に提供する必要があります。

###操作方法
顧客管理のキーは、コントロールプレーンのワークスペースのノートブックを暗号化します。顧客は、クラウドサービスのキー管理システムのIDで指定された顧客管理キー（CMK）と呼ばれる取り消し可能な秘密キーを提供します。AWS では、顧客キーは AWS Key Management Service（KMS）によって管理されます。

さらに、Databricks では、ワークスペースごとに Databricks が管理するキー（DMK）を作成します。 DMKは、データ暗号化キー（DEK）と呼ばれる結合暗号化キーを生成するために、CMK にラップされます。Databricks は DEK を使用して、ワークスペースのノートブックを暗号化します。

DEK は、数回の読み込み/書き取り操作のためにメモリにキャッシュされ、定期的にメモリから削除されるため、新しいリクエストがあった場合は、クラウドサービスの鍵管理システムへの別のリクエストが必要になります。
キーを削除、あるいは取り消すと、キャッシュ時間間隔の終了時にノートブックの読み取りや書き込みが失敗します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/a90f4c94-a0b1-b278-4686-036981f9c2bc.png)


###ノートブック用の顧客管理キーの追加
顧客管理のノートブックを追加するには、アカウント API を使用してワークスペースを作成する際に CMK を追加する必要があります。

CMK の設定方法：

1. AWS KMS で対称キーを作成または選択するには、「対称 CMK の作成」または「キーの表示」の手順に従います。
2. ワークスペース作成の際は、下記の3つの値が必要となるのでコピーを取りましょう。

- Key ARN 
- Key alias
- Key region

3. キーポリシータブで、ポリシー表示に切り替えてキーポリシーを編集し、Databricks がキーを使用して暗号化および復号化処理を実行できるようにします。下記の様に編集します。


```

{
  "Version": "2012-10-17",
  "Id": "key-policy-databricks",
  "Statement": [
    {
      "Sid": "Allow Databricks to use KMS key for Notebooks",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::414351767826:root"
      },
      "Action": [
        "kms:Encrypt",
        "kms:Decrypt"
      ],
      "Resource": "*"
    }
  ]
}

```

4. キーを登録するには、「アカウント API を使用して新しいワークスペースを作成する」、の「ステップ 4:ノートブック用の顧客管理キーを構成する（オプション）」の指示に従います。

[ステップ 4:ノートブック用の顧客管理キーを構成する](https://docs.databricks.com/administration-guide/account-api/new-workspace.html#step-4-configure-customer-managed-key-for-notebooks-optional)

##おわりに
Notebook の為の顧客管理キーに関するまとめは以上です。
詳細については、元記事をご参照ください。
LinuxサーバーでJupyter NotebookでSparkを動かせるガイド

LinuxサーバーJupyter NotebookでSparkを動かせるガイド

# Spark Download

* [Spark Download Link](https://spark.apache.org/downloads.html)

* 解凍

```bash
tar -xzvf spark-3.0.1-bin-hadoop3.2.tgz
```


#Java Installation

* JDK Download
今回はUbuntu[Windows Subsystem for Linux]を使うため、LinuxバージョンのJDK[`jdk-8u261-linux-x64.tar.gz`]をダウンロードする
[JDK8 Download Link](https://www.oracle.com/jp/java/technologies/javase/javase-jdk8-downloads.html)

* 解凍

```bash
tar -xzvf jdk-8u261-linux-x64.tar.gz
```

* 移動

```bash
mv  jdk1.8.0_261  /usr/env/java8
```

* JAVA_HOME設定

```bash
vim /etc/profile
```

最後に下記のコンテンツを追加

```bash
export JAVA_HOME=/usr/env/java8
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
```

* 変動を有効

```bash
source  /etc/profile
```

* 確認

```bash
java --version
```

#Spark Configuration

この時Sparkの`bin/pyspark`を実行すると`JAVA_HOME is not set`というエラーはでます、原因は上記`JAVA_HOME`を設定したけどSparkは認識できません。
Sparkのドキュメント[[environment-variables](https://spark.apache.org/docs/latest/configuration.html#environment-variables)]によると`conf/spark-env.sh`をちゃんと設定すれば良いと。

* Templateから設定ファイル作成

```bash
cp conf/spark-env.sh.template conf/spark-env.sh
```

* 下記の設定を追加

```bash
JAVA_HOME=/usr/env/java8/
PYSPARK_PYTHON=/usr/bin/python3
SPARK_LOCAL_IP=<YOUR_LOCAL_IP_ADDRESS>
```

今は`bin/pyspark`は動けるようになりました。👏👏👏


#Jupyter Configuration

* Jupyter Notebook をインストール

```bash
apt install jupyter-notebook
```

* `conf/spark-env.sh`に下記の設定を追加

```bash

PYSPARK_DRIVER_PYTHON=jupyter-notebook
PYSPARK_DRIVER_PYTHON_OPTS=" --ip=0.0.0.0 --port=8888"
```

今は`bin/pyspark`を実行してBrowserで`http://127.0.0.1:8888/?token=<your_jupyter_token>`を開くとJupyter Notebookが開けます。
`spark`, `sc`などの引数も利用できる状態です。

*※`bin/pyspark`を実行したらJupyter notebook URLが表示されない場合、`Ctrl+C`を押すと表示します*

######おまけ

Jupyter Notebookパスワード設定
*※設定するとパスワードでログインできる*

```bash
jupyter notebook password
```

######追記

######20201223

`df.show()`を使う時に下記の`Exception`が出ます


```bash
Exception: Python in worker has different version 3.8 than that in driver 3.6, PySpark cannot run with different minor versions. Please check environment variables PYSPARK_PYTHON and PYSPARK_DRIVER_PYTHON are correctly set.
```

解決する方法は`PYSPARK_PYTHON`のバージョンと`PYSPARK_DRIVER_PYTHON`のバージョンを一致にします

`conf/spark-env.sh`に下記の設定を修正します

```bash
PYSPARK_PYTHON=python3.6
```
[rails] ローカル環境のみでデータを保存する方法

この記事では<strong>rails5.2.3</strong>を使用しています

ローカルのみで保存したい画像データが、プッシュするとリモートにも反映されてしまう問題が発生しました。

<h1>解決方法
<p>.gitgnoreでGitで管理しないファイルを指定する。


<h1>.gitgnoreとは
<p>railsのファイルにはデフォルトで.gitgnoreというファイルが存在しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613578/a97d8983-609e-6693-5901-306440dd382b.png)
gitignoreとは、Gitで管理しないファイルを指定することが出来るファイルの事です。
引用：https://pikawaka.com/word/gitignore#3.%20git%20pushまで実行した場合(コミット履歴が残る)

<h1>手順
<p>ローカルで保存するデータはあくまでテスト用なので、リモート環境にpushしたくありません。
今回、public/uploads以下に保存されているimageは、全てテスト用に保存したデータなので、今回は.gitgnoreファイルにpublic/uploadsを追記します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613578/fb040fd6-5f9e-674c-4814-2d17a664d5bd.png)

```ruby:.gitgnore
public/uploads
```

これで、public/uploads以下のデータはローカルのみで管理されるようになります。

すでにローカルからプッシュされた画像データがリモートに保存されている状態であっても、上記の作業を行った後に、再度commit→pushするとリモートに保存されたデータが消えて、今後ローカルで保存したデータもリモートには保存されなくなります。


<h1>参考

https://pikawaka.com/word/gitignore#3.%20git%20pushまで実行した場合(コミット履歴が残る)
スマートシティ

近年のコロナウイルスの影響もあり、話題になっているスマートシティでございますが、
一番近しい話題としては、MaaS(テスラ、ウーバーテクノロジーズ自動運転）があげられるのではないでしょうか。

また、日本全域自治体でも同じような動きがあり、海外ではX-Road（エストニア）、Synchronicity（EU圏）などの製品があげられます。

ここで利用される技術としてはfiwareがあげられますが、これは都市OS基盤とも言われており、それぞれのサービスを結びつけるプラットフォームとしてはパブリッククラウド、SaaSサービスであるSalesforce(API連携）なども用いることができるといわれています。

ここで、synchronicityにも含まれている国である、ハンガリーを一例に挙げてみる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559778/3920c007-95e3-5bbd-dae3-a3756b061685.png)

また以下のような事例もある。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559778/7be8a604-bab4-8884-ca00-39fe5a736e21.png)
Java基礎

自分の復習用に

「０から２入力」があれば「０から２で入力してください」と表示
「文字列の入力」があれば「整数値ではありません」と表示

try-catchを使用するのではなくScannerのhasNextが使えたので
こういうやり方があると記録しておく。


```java:hello.java

      void getJudgeHand() {
        while (true) {
            System.out.println("コマンド？ 0:グー 1:パー 2:チョキ");
            if (scanner.hasNextInt()) {
                myHand = scanner.nextInt();
                if (myHand >= 0 && myHand <= 2) break;
            }
            else {
                scanner.next();
                System.out.println("整数値ではありません");
            }
            System.out.println("0から2で入力してください");
        }
    }

```


try-catchの方法も

```java:hello.java


void getJudgeHand() {
    while (true) {
        try {
            System.out.println("コマンド？ 0:グー 1:パー 2:チョキ");

            this.myHand = scanner.nextInt();
            if (this.myHand <= 2 && this.myHand >= 0) { // 2以下 かつ、0以上ならbreak
                break;
            }
        } catch (InputMismatchException e) {
            System.out.println("整数値ではありません");
            scanner.next();    // 入力を捨てる
        }
        System.out.println("０から２で入力してください");
    }
}



```
cdコマンドをもっと便利に

# 環境
fish, version 3.1.2

# はじめに

cdコマンドって不便じゃないですか?
僕だけかもしれないですが，ディレクトリを移動する際に，ディレクトリ構造が複雑になると，目的の場所に行くのに時間がかかる．tab補完を使ってもめんどくさいものはめんどくさい．

ということで，作ってみよう．

# 実装

まず完成品から．
Current Working Directoryということで,cwdと名付けた．

```shell:cwd.sh
#!/usr/local/bin/fish

set len (count $argv)

if test "$len" -gt 0 
    and test "$len" -lt 2

    if test "$argv" = "-p"
        set wd (pwd)
        echo $wd > ~/.cwd_path
    else
        set wd $argv 
        echo $wd > ~/.cwd_path
    end
end


while read line
   set path $line
end< ~/.cwd_path

cd $path
```

まず，引数の個数を数える．
 
それが，0より大きく，2未満，すなわち1個ならifの中に入る．
(fish shellのifの書き方が独特で苦戦した．)

つぎに，引数が'-p'なら，pwdの出力を~/.cwd_pathという隠しファイルに格納する．
それ以外なら，引数自体を~/.cwd_pathに入れる．

最後に，~/.cwd_pathを読み取って，そこにcdする．
(引数がなければ，ここだけ実行されるため，前回の作業ディレクトリに一発で移動できる．)


# 設定

~/.config/fish/config.fishに以下を記述．

```
alias cwd='. /usr/local/bin/cwd.sh'
```

- ポイントは，=の前後にスペースを入れてはいけない．
- shを実行する際，. が必要であること．


シェルスクリプトは、基本的に、現在のシェルとは別のシェル（サブシェル）で実行される。
そのため、サブシェルでいくらディレクトリを移動しても、スクリプトが終了すると、もともといたディレクトリに戻されてしまうため。

参考[シェルスクリプト（Bash）でcdができない](https://www.pc-gear.com/post/cd-in-shell-script/)

# 使用例


```
$ cwd ~/Desktop
$ cwd
```
1回目で，~/Desktopを記憶する．
2回目以降，引数なしで，~/Desktopに移動できる．


```
$ pwd
~/Desktop
$ cwd -p
$ cwd
```
~/Desktopにいる状態で，-pを引数に取ると，pwdを記憶する．(今回なら~/Desktop)
以下同じ．

# 展望
記憶できる，pathを増やしたい．
間違えて別ブランチにpush -f したときの対処法

普段の開発は一人1ブランチみたいな感じで複数人で1つのブランチを触ることが無いので`git push -f hogehoge`をたまに使うんですが、この間push先のブランチ名を間違えてそのブランチの修正内容を吹き飛ばしてしまいました…

自分のGit史上1番の大やらかしだったのですが、なんとか回避したのでメモがてら残しておきます。

# 元々のコミットハッシュを取得する。
まずはやらかしたの元々のを取得します。

自分はテンパリすぎてGitHubでみましたが`Git log`とかでも多分大丈夫だと思います。

PRのログの
![2020-09-15 14-30-34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403521/82166813-0e95-6780-b182-295fa181c62c.png)
という部分を確認します。

この`79282af`がforce pushされる前のコミットハッシュなのでこれで大丈夫だとは思うのですが念のためコミットの詳細画面へ行って

![2020-09-15 14-40-51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403521/8e318805-c4e6-6e64-5925-f83c45938925.png)

フルバージョンのコミットハッシュを確認してコピーしておきます。


# 元のコミットに戻す

やらかしたブランチに移動してそのブランチで

```
git reset --hard [コピーしたコミットハッシュ]
```

を実行して元の状態に戻します。
コマンドを実行した状態で元の状態に戻っているはずなので一応確認してください。

# 再度プッシュする
元の状態に戻っていることを確認できたら

```
git push -f origin [やらかしたブランチ]
```

でリモートブランチも元に戻っているはずです。

# あとがき
まじでめちゃめちゃ焦りましたが

```
git reset --hard [コピーしたコミットハッシュ]
```
が実行できて戻った時点でめっちゃ安心しました。

やらかした時点で落ち着いて解決策をググれたのでなんとか大丈夫でした。
やらかしたときはまず落ち着くことが大事ですね。
xampp(PHP)からaccessにアクセスできない時

xampp(PHP)からaccessに接続しようとしてハマったのでメモ。

# 環境
+ windows10 Pro 64bit
+ xampp 64bit
+ accessの形式 accdb

# PHPのソース
```php
define('ACCESS_DB_DRIVER',   '{Microsoft Access Driver (*.mdb, *.accdb)}');

$dbq = 'C:/xampp/htdocs/***.accdb';


$objPdo = new PDO("odbc:Driver=" . ACCESS_DB_DRIVER . ";DBQ=" . $dbq . ";");
```

# エラー内容
```
PHP Fatal error:  Uncaught PDOException: SQLSTATE[IM002] SQLDriverConnect: 0 [Microsoft][ODBC Driver Manager] ...
```

# 解決方法
## php.iniを編集
```
;extension=pdo_odbc
```
コメントアウトを外す



## ODBCを確認

コントロール パネル＞システムとセキュリティ＞管理ツール＞ODBCデータソース（64bビット）

「ドライバー」タブにMicrosoft Access Driverが無かったので、ドライバーをインストールすれば解決すると推測

## ドライバーダウンロード

こちらの記事を参考にさせていただきました。
[Microsoft Access（.mdb、.accdb）のODBC、OLEDBドライバーに関するまとめ](https://qlik-training.ashisuto.co.jp/microsoft-access-odbc-oledb-driver/)

https://www.microsoft.com/ja-jp/download/details.aspx?id=13255
「AccessDatabaseEngine_X64.exe」をダブルクリックしインストール


# テーブルによってデータが取得できない
たぶんテーブル名に入っている記号の問題だと思うのですが、バックスラッシュ「`」を入れたら解決しました。

```php
$sql = "SELECT * FROM 03_案件(基本)テーブル;";
```

↓

```php
$sql = "SELECT * FROM `03_案件(基本)テーブル`;";
```


# 抽出条件でデータ型が一致しません。
```
SQLSTATE[22018]: Invalid character value for cast specification: -3030 [Microsoft][ODBC Microsoft Access Driver] 抽出条 件でデータ型が一致しません。 (SQLExecute[-3030] at ext\pdo_odbc\odbc_stmt.c:259)
```
数値型に空文字「''」を挿入しようとすると発生するようです。


# オートナンバー振り直し
テーブルを開いていない状態から
作成＞クエリデザイン＞SQL表示

```:sql
DELETE * FROM table_name;
ALTER TABLE table_name ALTER COLUMN id COUNTER(1,1);
```

# ３つ以上のテーブルを結合する時には括弧をつける
こちらの記事を参考にさせていただきました。
[[Access] SQLでJOINをかけるときに括弧が必要](https://ummt.jp/blog/?p=100)

```php
$sql = "SELECT * FROM (`テーブル` A INNER JOIN `テーブル` B ON A.id = B.id);";
```
suとsudoの違い

###suとsudoって何が違うの？

Linuxを触りながら、それぞれのコマンドの何が違うのか疑問に思ったので
調べてみると、以下のことが分かった。

su：ユーザー切り替え
sudo：昇格する

よって、以下の時使う。

####su使用例
testuserなどのユーザーからユーザーを切り替えたい時

```
# su -s 
```

####sudo使用例
testuserなどのローカルユーザからrootユーザーへ昇格したい時

```
# sudo -s 
```

以上が2つの違いでした。
作業する時は圧倒的にrootになるので結局sudoの方がよく使うなと思う今日この頃です。
Officeライセンスを手動変更するコマンド

昨今はマクロ付きのマルウェアが大変流行しているため、解析環境にOfficeのインストールは欠かせない。
複数の解析環境上でOfficeを使用していた結果、ライセンス上限に達してしまった旨のエラーが出現したが、
UI上からは別途用意した新しいライセンスへ入れ替えることができなかった。

本記事では、Officeライセンスを手動で入れ替える方法について記載する。
（当たり前だが、有効なライセンスが別途必要デス）
また、ストアアプリ版ではなくデスクトップ版の製品を使用している前提。

#エラー概要
Office起動時にライセンス認証ウィザードが表示され下記のエラーが出現する。
「指定したプロダクトキーで行ったライセンス認証の回数が、マイクロソフトソフトウェアライセンス条項で規定された上限に達しているため、Microsoft Office Professioinal Plus 2016に対するライセンス認証を実行できません。・・・」

#対策方法
Officeをインストールしたフォルダ内に格納されているOSPP.vbsを使って新たなライセンスに書き換えることが可能。

##１．Officeのインストールパスに移動する
インストールパスにOSPP.vbsがあることを確認する。
※私の場合は64bit版デフォルトパス↓ にありました。
C:\Program Files\Microsoft Office\Office16

##２．コマンドラインでOSPP.vbsを起動し、引数にプロダクトキーを指定する
※コマンドプロンプト実行時に管理者権限が必要だったかもしれません。

```
"C:\Program Files\Microsoft Office\Office16\OSPP.vbs" /inpkey:{有効なOfficeライセンスキー}
```

以後Officeを起動すれば新しいライセンスが適用される。


以上。
[.NET] バイトオーダーを指定した整数・バイナリの相互変換

# Question

ある整数型をリトルエンディアン(あるいはビッグエンディアン)で`byte`配列に書き込みたい。
または、`byte`配列に書き込まれているリトルエンディアン(あるいはビッグエンディアン)の整数型を復元したい。
どうすればいいか。
`BitConverter`クラスの`GetBytes`や`ToInt32`にはバイトオーダーを指定する方法はない。

# Answer

`BinaryPrimitives`クラスを使用する。

- `ReadOnlySpan<byte>`から整数型(`int`)を復元するには`ReadInt32BigEndian`/`ReadInt32LittleEndian`
- 整数型(`int`)の内容を`Span<byte>`に書き出すには`WriteInt32BigEndian`/`WriteInt32LittleEndian`

メソッドを使用する。

```csharp
int i1 = 12345678;
var buffer = new byte[255];

BinaryPrimitives.WriteInt32LittleEndian(buffer.AsSpan(0, 4), i1);
int i2 = BinaryPrimitives.ReadInt32LittleEndian(buffer.AsSpan(0, 4));
```

`int`型だけでなく、`short`, `ushort`から`long`, `ulong`型までサポートされている。

このクラスは`System.Buffers.Binary`名前空間にあり、.NET Core 2.1から使用できる。
.NET Frameworkを利用している場合、`System.Memory`をNuGetで入手すれば使用できるようだ。
(`System.Buffers`ではない。)
AWS EBSボリューム追加方法

###前提条件
環境：Amazon Linux AMI release 2015.09
やりたいこと：バックアップボリュームへ50GB追加

###EBSボリュームを追加するには？
AWSコンソールで追加して追加したボリュームを割り当てると良い。

###具体的な手順

①teratermで対象環境へログインしroot権限になる

```
# sudo -s
```

②以下コマンドで現状のボリュームを把握する

```
# lsblk
# df -h
```

③AWSコンソール上で対象仮想マシンのボリュームを変更する

④teratermで対象環境へ再度ログインし、root権限になる

```
# sudo -s
```

⑤サイズ変更を実施する

```
# resize2fs /dev/xvda 
            [変更するボリューム名]
```

⑥サイズが変更されたことを確認する

```
# lsblk
# df -h
```

以上がEBSのボリューム拡張方法でした。

お役に立てれば幸いです。
（小ネタ）DiscordにおけるChannelのpositionの話

# はじめに
[前回の記事](https://qiita.com/GrapeColor/items/61123fec670b8f096ad6)に引き続き、備忘録も兼ねたDiscord APIの`Channel`の`position`関連の挙動についてまとめる。
本記事ではAPIラッパーライブラリとして[discord.js](https://discord.js.org/)を使用する。

#`Channel`オブジェクトの`position`プロパティの値
Discordの`Channel`オブジェクトの`position`の値は、`0`から始まる。
`0`はカテゴリ内のチャンネルであれば、そのカテゴリの先頭。
カテゴリ外のチャンネルであればサーバー内の先頭を指している。

#チャンネル作成時の`position`の値
チャンネルを作成する際に、その位置にチャンネルを作成するか指定するのオプション値、`position`パラメータについて。
チャンネル作成時の`position`パラメータの値は、プロパティと同じく`0`から始まる。
しかし、ここでの`0`は既存チャンネルの末尾にチャンネルを作成することを指す。
では先頭に作成したい場合はどうすればよいかと言えば、`1`を指定すればいよい。

要するに、`Channel`オブジェクトの`position`プロパティの値は先頭から`0 1 2...`とナンバリングされているが、チャンネル作成時のpositionパラメータの指定位置は先頭から`1 2 3...`とナンバリングされている訳である。

#特定のチャンネルの下にチャンネルを作成する
少し困るのが特定のチャンネルの下にチャンネルを作成したいときである。
普通に下に追加するだけであれば特定のチャンネルの`position`プロパティの値に`+2`した値を`position`パラメータに渡せばよいだけだが、特定のチャンネルがカテゴリの末尾などにあると、これではエラーになるため`0`を指定しなければならない。

このとき役に立つのがカテゴリ内のチャンネル数である。
特定のチャンネルの`position`プロパティの値に`+2`した値が、このチャンネル数を超える場合`0`としてあげれば、上手く処理できる。

#あとがき
以上、暫定的に備忘録として記事を残した。
今後、実際のコードなどを追加して記事を充実させていきたい。
ご参考になればと思います。
量子コンピュータ参考文献

武田俊太郎『[量子コンピュータが本当にわかる！](https://amzn.to/32u0eqv)』技術評論社，2020．の参考文献で紹介されていた本を列挙します．

# やさしい文章で理解したい方

1. 竹内繁樹『[量子コンピュータ　超並列計算のからくり](https://amzn.to/32vKx2n)』講談社，2005．
2. 藤井啓祐『[驚異の量子コンピュータ　宇宙最強マシンへの挑戦](https://amzn.to/2FzkQF5)』岩波書店，2019．
3. 徳永裕己『[絵で見てわかる量子コンピュータの仕組み](https://amzn.to/3irXM9E)』翔泳社，2019．
4. 湊雄一郎『[いちばんやさしい量子コンピューターの教本](https://amzn.to/3bZXtAt)』インプレス，2019．
5. 古澤明『[光の量子コンピューター](https://amzn.to/3ivTK09)』集英社，2019．

# 数式を用いてきちんと勉強したい方

5. 古澤明『[量子コンピュータ入門(第2版)](https://amzn.to/32wtkpy)』日本評論社，2016．
6. ミカエル・ニールセン，アイザック・チャン『[量子コンピュータと量子通信 I~III](https://amzn.to/2Rqd8iW)』オーム社，2004~5．


一緒に勉強頑張りましょう．