OmniAICreator/Qiita-1.07M huggingface dataset:
【解決】UICalendarViewのサイズ変更がうまくいかなかった

# 課題

UICalendarViewをUIViewRepresentableを使ってSwiftUIで表示しようとした際に思い通りの大きさにならないことがあった．筆者は確認していないが，AutoLayoutでもうまく行かないことがあるらしい．

## 状況
SwiftUIのframeサイズ指定で画面の3分の1の幅を指定しているが反映されていない．

![スクリーンショット 2022-10-10 3.32.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327967/c0f30ae6-a71b-3406-00b0-f5c18a97a43a.png)

# 解決

`setContentCompressionResistancePriority`を`.defaultLow`に設定することで思い通りのサイズを指定できるようになった．


```swift
calendar.setContentCompressionResistancePriority(.defaultLow, for: .horizontal)
```

![スクリーンショット 2022-10-10 3.33.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327967/3fa8c171-a846-ce48-b5c6-7cbbddc9dc60.png)

## 解説

`setContentCompressionResistancePriority`はコンテンツの潰れにくさを設定することができる．やりすぎると字がつぶれてしまって表示できない部分も出てくるが少し窮屈でもいいから表示したいときなどに便利そう．
2022/10/10主にITとかセキュリティの記事

フィッシングURL、1カ月で5万件超 - 過去最多更新
https://www.security-next.com/140378

ソラナ共同創設者が語る、ネットワーク一時停止問題の解決策とは？(10/8)
https://coinpost.jp/?p=395135

Google「全社で20%の効率化を」 CEOに聞く(10/7)
https://www.nikkei.com/article/DGXZQOGN07B3P0X01C22A0000000/

トヨタ、個人情報29万件以上漏えいか　委託先企業がGitHubにソースコード公開 - ITmedia ビジネスオンライン(10/7)
https://www.itmedia.co.jp/business/articles/2210/07/news174.html

29万件超のメールアドレスが漏洩の可能性、トヨタのコネクトサービス(10/8)
https://response.jp/article/2022/10/08/362674.html

トヨタ、顧客メールアドレス２９万６０００件流出の恐れ　「つながる車」サイト登録者(10/7)
https://www.sankei.com/article/20221007-6MBGNCGQKJL7BPESUBOH3RJPEU/?ownedutm_source=owned%20site&ownedutm_medium=referral&ownedutm_campaign=ranking&ownedutm_content=%E3%83%88%E3%83%A8%E3%82%BF%E3%80%81%E9%A1%A7%E5%AE%A2%E3%83%A1%E3%83%BC%E3%83%AB%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9%EF%BC%92%EF%BC%99%E4%B8%87%EF%BC%96%EF%BC%90%EF%BC%90%EF%BC%90%E4%BB%B6%E6%B5%81%E5%87%BA%E3%81%AE%E6%81%90%E3%82%8C%E3%80%80%E3%80%8C%E3%81%A4%E3%81%AA%E3%81%8C%E3%82%8B%E8%BB%8A%E3%80%8D%E3%82%B5%E3%82%A4%E3%83%88%E

Facebook「パスワード窃盗アプリに注意」　400種超公表(10/8)
https://www.nikkei.com/article/DGXZQOGN080450Y2A001C2000000/

VLAN対応ネットワーク機器に複数の脆弱性、ただちに確認を-JPCERT/CC(10/8)
https://news.mynavi.jp/techplus/article/20221008-2474767/

米国とブラジルの当局、1,000億円規模の仮想通貨詐欺を捜査(10/8)
https://coinpost.jp/?p=395125

仮想通貨交換バイナンス、830億円のトークン流出(10/8)
https://www.nikkei.com/article/DGXZQOGN07DDO0X01C22A0000000/

トヨタ、ユーザーのメアド約30万件漏えいの可能性　ソースコードの一部、GitHubに5年間放置 - ITmedia NEWS(10/7)
https://www.itmedia.co.jp/news/articles/2210/07/news178.html#utm_term=share_sp

クリプトモールジャパンが「経済安全保障推進法」の対応を見据えた “Web3.0型” 「Trusted Network（トラステッド ネットワーク） エコシステム」に参画(10/7)
https://www.atpress.ne.jp/news/329822

IBM i 回帰・継続のシナリオ　～IBM iを使い続ける理由、手法、戦略とは｜ユーザー5社の離脱・回帰・オープン系への移行断念の経緯から探る(10/7)
https://www.imagazine.co.jp/ibm-i-return-feature000/

「暗号化を力技で破るのに何時間？」「パスワード別送の効果は？」セキュリティーの疑問を実験で検証(10/8)
https://xtech.nikkei.com/atcl/nxt/info/18/00037/100800065/
Qiitaジョルノ

一発で環境破壊できる裏技です！
注意、真似するときは死んでもいいVMとかでやってください！！

## 二度とSSHをできなくする裏技
処理が速くなる裏技です！！
まず処理速度を速くしたいワークステーションにSSHでログインします！
注意！！このとき必ずSSHでログインしてください！シングルユーザーモードでログインすると多くの人が失敗しています！！
ログインしたら
~~~
$ sudo chmod -R 000 /home/*/.ssh/authorized_keys
~~~
と打ちます！！
SSHログインできなくなったら成功です！！

### あなたを詐欺罪と器物損害罪で訴えます！

## 解説
鍵ファイルの実行権限、書き込み権限、読み出し権限がなくなるのでシングルユーザーモードでしかログインできなくなる。
なお、SSHログインしていたユーザーはセッションが切れると二度とログインできなくなる。
絶対に実環境で行わないように。

### 対処法
シングルユーザーモードでログインして公開鍵のファイルの権限を修復してあげればログインできるようになる。

## 二度とパスワードログインできなくする裏技
処理速度が速くなる裏技です！
ログインしたら
~~~
$ > /etc/passwd
~~~
と打ちます！

#### あなたを詐欺罪と器物損害罪で訴えます！

## 解説
普通に有名なもの。
passwdファイルをぶっ壊すので当然ログインできなくなる。
二度とSSHできなくなる裏技と併用したらそのワークステーションはただの文鎮になる。
実環境でこのレベルのぶっ壊れが発生したらエマージェンシーモードとリカバリーモードで何とかするしかない。

## シルバー・チャリオッツする裏技
相手にスタンド攻撃をする裏技です！
ワークステーションにログインしたら
~~~
$ echo "yes 進捗どうですか？" >> /etc/.bashrc
~~~
と打ちます！
~~~
$ chmod 555 /etc/.bashrc
~~~
で書き込み権限を消します！
ログインしたら発火する楽しみにしておいてください！いいですね！

## 解説
大体挙動は予測できると思うけど画面に一生、「進捗どうですか？」が表示され続ける。
素早い多段攻撃はまさにシルバー・チャリオッツ。
しかもログインするたびに毎回発生する。
派生系でwallコマンドを使ったもの(シルバー・チャリオッツ・レクイエム)がある。
ログインしている人数が多ければ多いほど攻撃力が増すタイプの攻撃になる。

~~~
$ echo "wall `yes 進捗どうですか？`" >> /etc/.bashrc
~~~

管理者権限がなければ/etc/.bashrcの権限を書き換えて編集することができないのでログインするのが面倒になる。
この攻撃の最大の欠点は自分にも被弾すること。

### 対処法
スタープラチナ・ザ・ワールド(Ctrl+C)で抜けることができる。
あとは/etc/.bashrcから該当の行を頑張って消しましょう。

## スタープラチナ・オーバーヘブンする裏技
相手にスタンド攻撃をする裏技です！
ワークステーションにログインしたら
~~~
$ echo "umount -l -a" >> /etc/.bashrc
~~~
と打ちます！

#### あなたを詐欺罪と器物損害罪で訴えます！

## 解説
数多くあるスタンド技が使用できると言われている裏技の1つ。
流石に試してないけどumount -l -aを.bashrcでやったらシステムファイルもアンマウントするので正常に動かないと思う。
当然二度と起動できない文鎮になる。

### 対処法
エマージェンシーモードやリカバリーモードで起動して/etc/.bashrcを直しましょう。
ちなみに/etc/fstabも同時に破壊すると相当直すのが面倒くさくなります。

# まとめ
こう書いてみると滑稽なシェル芸しか思い浮かばなかったので精進します。
でもなんか裏技の質が低いのも本家っぽいって思ってます。
MYSQL　ユーザー追加、削除

# 接続
```
$ mysql -u root -p
```

# 現在のユーザーを確認する
```
mysql> SELECT user, host FROM mysql.user ORDER BY user, host;
```

# ユーザーを作成
```
CREATE USER '<username>'@'localhost';
```

# パスワードを設定
```
set password for <username>@localhost='ここにパスワード';
```

# ユーザー削除
```
mysql> drop user 'ユーザー'@'localhost';
```
ウェブサイトでフォントが入れ替えられたら？

https://milltalk.jp/boards/123120

## いきなりですが、こんなことをお伺いしました。

``ウェブサイトでフォントが入れ替えられたら？``

別にアクセシビリティーが向上するわけではないのかもしれませんが、
見やすくなると助かる、親切だという意見が多いようです。

ブラウザの設定で確かに入れ替えられますが、
能動的にウェブサイトにフォント切り替え機能を実装してみます。

## 実装サイト

https://neet.co.jp/

右上あたりにある、設定（歯車）アイコンを開いてみてください。ただしTOPページですと少し下にスクロールしないと動作しないようになっています。


```style.scss
body.sans-serif {
	html, body, div, p, a {
		font-family: 
			"BIZ UDPGothic",
			"Hiragino Sans", "Hiragino Kaku Gothic ProN",
			"Meiryo",
			-apple-system, BlinkMacSystemFont,
			"Noto Sans CJK JP", "Noto Sans Japanese",
			"MS PGothic",
			sans-serif;
	}
}

body.serif {
	html, body, div, p, a {
		font-family: 
			"YuMincho", "Hiragino Kaku Gothic ProN",
			"Noto Serif JP",
			"MS PMincho",
			serif
			!important;
	}
}

body.Hachi-Maru-Pop {
	* {
		font-family: 
			"Hachi Maru Pop"
			!important;
	}
}

body.DotGothic16 {
	* {
		font-family: 
			"DotGothic16"
			!important;
	}
}
```

```script.js
/* 足りない変数、関数は補完してください */
$(function() {
	const cookieSettingFontFamilyName="FontFamily";
	mqlfont(cookie(cookieSettingFontFamily));

	/* フォントの設定のデフォルト起動 */
	function mqlfont(cook) {
		/* font list */
		/* https://photoshopvip.net/131206 */
		_body.removeClass('sans-serif');
		_body.removeClass('serif');
		_body.removeClass('Hachi-Maru-Pop');
		_body.removeClass('DotGothic16');

		if(cook === undefined || cook == "" || cook == "default")
			_body.addClass('sans-serif');
		else if(cook == 'serif')
			_body.addClass('serif');
		else {
			loadgooglefont(cook);
			_body.addClass(cook.replace(/ /g, "-"));
		}
	}


	/* https://devsakaso.com/javascript-read-google-fonts-efficiently/ */
	function loadgooglefont(FontFamilyName) {
		// google fontsを非同期で読み込み
		var fonturl = FontFamilyName.replace(/ /g, "+");
		window.WebFontConfig = {
			google: {
				families: [fonturl, 'Overpass']
			},
			active: function () {
				sessionStorage.fonts = true;
			},
		};

		var wf = document.createElement('script');
		wf.src = '//ajax.googleapis.com/ajax/libs/webfont/1.6.26/webfont.js';
		wf.type = 'text/javascript';
		wf.async = 'true';
		var s = document.getElementsByTagName('script')[0];
		s.parentNode.insertBefore(wf, s);
	}
});
```

## もちろんですが

Webサイトの設定をcookieで読み出しできることを前提としないといけません。

cookieに設定されているため、JavaScriptが動作して
初めてきちんとフォントが切り替わります。

その為、google fontから全読み込みするようなフォントは
「*」
で、一括指定してしまっても大丈夫なようです。
後からClassが設定され、読み込まれますので。

## 注意

設定画面においてもフォントを動的に入れ替えてプレビューすることもできますが、
読み込むgoogle fontが多すぎるとプレビューできなくなりますので、プレビューせずリロードで対応して下さい。
WSL環境で ssh-keygen で作成される鍵ファイルのパーミッションが 777 から変更できない問題を解決する

デフォルトの WSL で ssh-keygen すると、作成される鍵ファイルのパーミッションが 777 になっている。

```
chmod 0600 ~/.ssh/id_rsa
```
などとすれば良いはずだが、NTFS/FAT32等のファイルシステム上ではchmodでアクセス権を変更することができないらしい。

なので、WSL が起動時にマウントする Cドライブなど(/mnt/c/ など)をマウントし直す必要がある。

```
$ cat <<EOF | sudo tee -a /etc/wsl.conf
[automount]
options = "metadata"
EOF
```
実行後に wsl を再起動して ssh-keygen すると良い。
これで、OK。
クラスオブジェクトの@Expose()ってなに？

# はじめに
API開発を進めていく中で、クラスオブジェクトの定義の中になにやら`@Expose()`という呪文が書いていたので調べてみることにしました。

また、過去にはclass-transformerの概要についても書いてみました。

https://qiita.com/enomoto11/items/aa9c9faa508b3aed6540

# plainToClass()関数
まず、（プレーンオブジェクトを要素とする）連想配列usersと独自に定義したUserクラスがあるとします。
```index.ts
import { plainToClass } from "class-transformer";

const users = [
  {
    id: 1,
    firstName: "Johny",
    lastName: "Cage",
    age: 27,
  },
  {
    id: 2,
    firstName: "Ismoil",
    lastName: "Somoni",
    age: 50,
  },
  {
    id: 3,
    firstName: "Luke",
    lastName: "Dacascos",
    age: 12,
  },
];

export class User {
  id: number;
  firstName: string;
  lastName: string;
  age: number;

  getName() {
    return this.firstName + " " + this.lastName;
  }

  isAdult() {
    return this.age > 36 && this.age < 60;
  }
}

const realUsers = plainToClass(User, users);

console.log(realUsers[0].age, realUsers[0].isAdult(), realUsers[0].getName());
// 27 false Johny Cage
```

連想配列usersを、`User`クラスにTransformすることで当該クラスのプロパティだけでなく、メソッドまで活用できるようになります。

# plainToClass()関数のデフォルトの挙動の問題
```index.ts
import { plainToClass } from 'class-transformer';

class User {
  id: number;
  firstName: string;
  lastName: string;
}

const fromPlainUser = {
  unknownProp: 'hello there',
  firstName: 'Umed',
  lastName: 'Khudoiberdiev',
};

console.log(plainToClass(User, fromPlainUser));

// User {
//   unkownProp: 'hello there',
//   firstName: 'Umed',
//   lastName: 'Khudoiberdiev',
// }
```
しかしデフォルトでは、`plainToClass()`関数はプレーンオブジェクト`fromPlainUser`の全プロパティを踏襲してきてしまいます。`User`クラスにないプロパティでも上書きしてしまい、また、`User`クラスにはあった`id`プロパティも消されてしまいました。

「型がある程度保証されたままでTransformをしたい」というのが、ここでの課題になります。


# Expose()してtype-safeなインスタンス化をする
上記のデフォルトの挙動による問題を解決するために、プレーンオブジェクトの全プロパティを踏襲してしまうのではなく、Transformした後に不必要なプロパティを排除するために、`excludeExtraneousValues`なるオプションをつけることができます。


```index.ts
import { Expose, plainToClass } from 'class-transformer';

class User {
  @Expose() id: number;
  @Expose() firstName: string;
  @Expose() lastName: string;
}

const fromPlainUser = {
  unkownProp: 'hello there',
  firstName: 'Umed',
  lastName: 'Khudoiberdiev',
};

console.log(plainToClass(User, fromPlainUser, { excludeExtraneousValues: true }));

// User {
//   id: undefined,
//   firstName: 'Umed',
//   lastName: 'Khudoiberdiev'
// }
```
ここで、出力結果にほしいプロパティは、`User`クラスを定義した際にあらかじめ`@Expose()`を宣言しておく必要があります。

# 最後に
自分が日頃インターンの業務で触っているソースコードを見て知らなかったところを備忘録にしてみました。この学びを共有できれば幸甚です。

# 参考
https://github.com/typestack/class-transformer
中学1年生が国旗のまとめサイト作ってみた

## 初めに
こんにちは、
タイトルにある通りなんですけど
国旗のまとめサイトを作ってみました！
要素は作る気があれば追加しようと思います！

https://sugoruru.github.io/country-flags-set/

使用言語:next.js,typeScript
開発環境:windows11-VSCode
デプロイ環境:GitHub pages

## 作り方
このサイトは簡単さを求めたかったので
自分の中での最小限のコードにしましたー
indexページとリストページ、国別ページの
3つを作成してjsonファイルをmapして作りました！
それと、next.js専用のLink component使ってみました！
ページの読み込みも画像が200個近くあるから遅いかと思いましたが、そうでもなくて良かったです

## 作ってみた感想

このサイトnext.jsで作ってるんですけど
それの練習のために作ろうって思いました！

データ収集(国旗の画像集め)に
すごい時間(193ヶ国で4時間ぐらい)かかりましたが、
それ以外は簡単にできて、楽しかったです！
(少しGitHub pagesのデプロイに詰まりましたが…)

UIもできるだけシンプルかつ分かりやすくなるようにがんばりました！

こんな感じでアプリを
色々と作って行ければと思います

短いですが今回はこれで終わります、
ローカルリポジトリをリモートリポジトリへPushする際のトークンについて

新しくGitHubでリポジトリを作成してローカルリポジトリをリモートへPushする際に以下のエラーが発生しました。

```
Username for 'https://github.com': ***********
Password for 'https://******************': 
remote: Permission to ***********/UberAppSwiftUI.git denied to ***********
```
※『***********』はユーザ名などの個人情報のため伏せてます

『私がやった間違っていたこと』
・アクセストークンリストの作成(設定をデフォルトで作成)
・初回git push時にユーザ名、パスワードを聞かれる際、パスワードに対してアクセストークン文字列を入力した。

『解決策』
トークン作成の際に『repo』のチェックをしないとダメなようです。
(デフォルトでチェック入れてくれればいいのに...)
問題ないように思えますが、トークン作成の設定が間違っていたようです。
![b085941f1f5977bda2f51d4ead141703.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2905387/09eebaa3-82bc-859f-7f87-2c10029fff47.png)
macOS から WSL Ubuntu に直接 SSH 接続する

macOS クライアントから Windows 11 PC 内で動いている WSL2 環境の Ubuntu に直接 SSH ログインする手順です。

WSL 内で SSH サーバ `sshd` を起動しても、ネットワーク的に Windows 以外のリモートの SSH クライアントから WSL 内のサーバには直接接続できないため、Windows のプロキシ(ポート転送) `portproxy` を設定する。

なお、下記の手順では、Windows が起動する度に、毎回、手動でバッチファイルを実行する必要があります。
Windows には詳しくないので、タスクマネージャーで OS 起動時に自動で SSH も設定する手順は不詳です。

## (1) WSL2 をセットアップする

（略）

## (2) WSL 内に SSH 公開鍵をセットアップする

事前に作ってある　SSH 公開鍵を `~/.ssh/authorized_keys` に書き込んでおく。

```sh
# WSL 内で実行
mkdir ~/.ssh/
chmod 700 ~/.ssh/

cat > ~/.ssh/authorized_keys 
ssh-rsa AAxxxxxxx== 
^D (CTRL+D)
c
chmod 600 ~/.ssh/authorized_keys 
```

## (3) PowerShell のスクリプトを作成する

https://zenn.dev/solufa/articles/accessing-wsl2-from-mobile の手順を参考にさせていただいて、
PowerShell のスクリプトを `C:\Users\xxxx\WSL\WSL-SSH.ps1` あたりに作ります。
ここでは SSH の 22 番ポートと、オマケのサンプルとして 3000 番ポートの両方を転送する設定です。
同じポート番号で転送するため、Windows PC ホスト側では、SSH サーバは動いていないこと。

```ps1
$ports = @(22, 3000) # ポート番号を配列で指定

$fwRuleName = "WSL 2 Firewall Unlock"

$wsl2Address = wsl -e hostname -I | ForEach-Object { $_.trim() }

New-NetFireWallRule -DisplayName $fwRuleName -Direction Inbound -LocalPort $ports -Action Allow -Protocol TCP

for ($i = 0; $i -lt $ports.length; $i++) {
  $port = $ports[$i]
  netsh interface portproxy delete v4tov4 listenport=$port
  netsh interface portproxy add v4tov4 listenport=$port listenaddress=* connectport=$port connectaddress=$wsl2Address
}
```

## (4) バッチファイルを作成する

PowerShell 単体だけでも実現できるかもしれないけど、よく分からないので、
ここでは `.bat` ファイルを組み合わせる手順にしています。
バッチファイルを `C:\Users\xxxx\WSL\WSL-SSH.bat` あたりに作ります。

```bat
@echo off
wsl -u root -- service ssh start
powershell -c C:\Users\xxxx\WSL\WSL-SSH.ps1 -Verbose
wsl -l -v
wsl -u root -- service ssh status
ipconfig | find "IPv4"
pause
```

## (5) バッチファイルのショートカット（リンク）を作成する

`netsh` を実行する関係で、バッチファイルは管理者権限で実行したい。
`WSL-SSH.bat` のショートカットを作成して、
プロパティ　＞　ショートカット　＞　管理者として実行 を ON にする。
![shortcut.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12419/47f75cda-24b8-1d9d-5898-83bc7a3cc74c.jpeg)

## (6) ショートカット側を実行する

ショートカットのファイルをダブルクリックして、実行する。（管理者権限の承認が必要）
`Ubuntu Running` と `sshd is running` が確認できれば OK。
最後に Windows PC の IP アドレスを確認できる。この環境では `192.168.11.39` だった。
Windows PC を再起動した場合は、もう一度、このショートカットから実行する必要がある。

![ip-address.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12419/fc3cc24e-8f6f-43c1-3912-ff2778d19e93.png)

## (7) SSH 接続する

macOS 側から WSL2 側に直接 SSH 接続できるようになりました。🎉
`xxxx@` のユーザ名の部分は、Windows 側でなくて Ubuntu 側のユーザ名を指定します。

```
$ ssh xxxx@192.168.11.39

Welcome to Ubuntu 20.04.4 LTS (GNU/Linux 5.15.57.1-microsoft-standard-WSL2 x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

  System information as of Mon Oct 10 01:12:28 JST 2022

  System load:  0.0                 Processes:             8
  Usage of /:   3.9% of 1006.85GB   Users logged in:       0
  Memory usage: 3%                  IPv4 address for eth0: 172.17.187.192
  Swap usage:   0%

Last login: Mon Oct 10 00:58:06 2022 from 172.17.176.1

$
```
Pythonで2つの日付の間の日数を求める

西暦で考える場合は、0年12月31日からの経過日数をそれぞれ2つの日付に対して求め、差を求めれば、欲しい日数が求められます。

西暦、月、日の順に日付が若いほうから順番に入力されたときの実行例：
```py
# うるう年かどうか判定する関数
def uruu(year):
    is_uruu = True
    if year % 100 == 0 and year % 400 > 0:
        is_uruu = False
    elif year % 4 > 0:
        is_uruu = False
    return is_uruu
# 入力
year1 = int(input())
month1 = int(input())
day1 = int(input())
year2 = int(input())
month2 = int(input())
day2 = int(input())

sum = 0
sum2 = 0
# monthday[i]がi月の日数を含むように定義する。ただし、2月は28日に設定し、うるう年の時はそのつど+1して考える
monthday = [-1, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
# 0年12月31日からの経過日数をそれぞれ求め、差を求める
# 一つ前の年までの日数をうるう年を考慮して数えて足す
for i in range(1,year1):
    if uruu(i):
        sum += 366
    else:
        sum += 365
#　一つ前の月までの日数をうるう年を考慮して数えて足す
for i in range(1,month1):
    if uruu(year1) and (i == 2):
        sum += monthday[i] + 1
    else:
        sum += monthday[i]
# 与えられた月の日付を足せばいい
sum += day1
for i in range(1,year2):
    if uruu(i):
        sum2 += 366
    else:
        sum2 += 365
for i in range(1,month2):
    if uruu(year2) and (i == 2):
        sum2 += monthday[i] + 1
    else:
        sum2 += monthday[i]
sum2 += day2
# 出力
print(sum2-sum)
```
ping、bonding、nmap、nc、netstat、ssについて

●ping コマンドの宛先アドレスには、特定の機器を表すユニキャストアドレスだけではなく、マルチキャスト（特定グループ宛）アドレスやブロードキャスト（ネットワーク内の全ての機器宛）アドレスも指定できる。ブロードキャストアドレス宛てに ping を実行する場合は、「-b」オプションを指定。

マルチキャストアドレスやブロードキャストアドレスを指定して ping コマンドを実行すると、1つのICMP Echo要求に対して、複数のICMP Echo応答が返ってくることがある。こういった時に、ping コマンドは重複した応答であることがわかるように、結果に「(DUP!)」を付けて表示されている。

ネットワークの設定を行う際には、指定のホストまで正しくパケットが伝送されるか、パケット往復にどれくらいの時間がかかるか等をチェックしたい場合に利用できるコマンドとして ping 。
ping コマンドは、引数に通信先のホストを指定して実行すると、そのホストに向けて ICMP パケットと呼ばれるパケットを送り、その結果を表示。

ping [オプション] ホスト

「ホスト」部はホスト名と IP アドレスどちらでも指定することが可能。
利用できるオプションとして主要なもの
・-s 続けて送信するパケットデータのサイズを指定する

●bonding（ボンディング）
複数のネットワークインタフェースを1つに束ねる技術。bondingによって帯域幅を増やしたり、1つのNICに障害が発生しても他のNICで運用できるようにインタフェースを冗長化できる。

bondingでは、ネットワークインタフェースを以下のように分類
・マスターインタフェース...bondingで束ねられた仮想インタフェース
・スレーブインタフェース...bondingを構成する個々の物理インタフェース
・アクティブインタフェース...bonding構成の中で実際にパケットの送受信を行うインタフェース

Linuxカーネルにはbondingモジュールが標準で実装。


●modeオプションでbondingポリシーを設定できる。

設定できるbondingポリシー
・balance-rr ラウンドロビンによる送信の負荷分散
・active-backup 1つのスレーブインターフェースのみがアクティブになり、障害発生時にのみ他の巣レー美に入れ替わる（冗長性）
・balance-xor 宛先MACアドレスなどに基づいたハッシュによる送信の負荷分散
・802.3ad LACPを使用したリンクアグリゲーション
・balance-tlb スレーブインターフェースの負荷に応じた送信の負荷分散
・balance-alb スレーブインターフェースの負荷に応じた送受信の負荷分散

●nmap 
詳細が不明なネットワークの構造を調査したり、セキュリティ上の問題がないかを検査する目的で、ネットワークのスキャンを行うことができるコマンド。
このコマンドを利用することで、指定したホストのポートに対して総当たりでパケットを送りつけ、どのようなポートが待ち受け状態にあるかを調べることができる。

nmap [スキャンタイプ] [オプション] 対象

「対象」部には特定のホストを対象とする場合にはそのままホスト名や IP アドレスを書く。
一方、ネットワーク内の複数のホストをまとめて対象にする場合は 192.168.10.0/24 のような CIDR 表記や、192.168.0-255.1-254 のようなハイフン (-) を使った範囲表記で指定。

■「スキャンタイプ」として指定できる代表的なもの：
・-sT TCPスキャン
・-sU UDPスキャン
・-sP Pingスキャン

※何も指定しないとデフォルトでは TCP SYN スキャンという方法でスキャンされる

■その他のオプション
・-p 続けて対象ポート範囲を指定
・-F 有名ポートを対象にした高速スキャン
・-O 対象ホストのOS識別を試みる

●nc コマンド
TCP/UDP で通信を行うことができる汎用性の高いコマンド。

nc [オプション] ホスト ポート

「ホスト」部にはホスト名または IP アドレスを指定し、「ポート」部には接続したいポート番号。
特にオプションなどを指定せずホストとポートを指定した場合は、そのホスト・ポートに接続し、対話的に通信を行う（telnet コマンドと似た動作）。

-v は接続に成功した際のログメッセージなどを出力させるためのオプション、-z は接続のみを試み、データを送信することはしないというオプション。これらをあわせることで、ポートスキャンとして望ましい動作となる

●netstat 
実行システム上のネットワーク状態について、様々な情報を表示することができるコマンド。
各ネットワークインタフェースの状態、ポートの待ち受け状態、ルーティングテーブルの状態、パケット数統計など、多岐にわたる情報が取得できる。

netstat [オプション]

オプション
・-l 待ち受け状態のソケットのみを表示
・-a 待ち受け状態ｋに関わらずソケットをすべて表示
・-c 情報を毎秒更新して最新状況を表示
・-i ネットワークインターフェースの統計を表示
・-r ルーティングテーブルを表示
・-n ホストなどを名前解決せず数字のまま表示

●ssコマンド
・-i 内部TCCPの情報を表示
・-r 名前解決を実行
macOS から  Wake On LAN (WoL) で Windows PC をスリープ解除する

Windows PC がスリープしたあと、キーボードやマウスを操作してスリープ解除（起動）させるのが面倒くさい。
macOS の Terminal からコマンドを実行することで、スリープしていた Windows 11 のスリープを解除したい。

［10/14追記］スリープのステートによっては、下記のWoLでは起こせないことがあるみたい。うむむ。

## (1) Windows で Wake On LAN が有効化されているのを確認する

デバイスマネージャ　＞　ネットワークアダプタ　＞ Intel(R) Ethernet Connection ＞ 電源の管理
『このデバイスで、コンピューターのスタンバイ状態を解除できるようにする』が ON になっていること。
有線 LAN のチップのメーカーによって、設定が異なるかもしれない。
![Intel.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12419/441b1607-b71c-71e2-59bd-2128fa69305d.png)

## (2) Windows で MAC アドレスを確認する

設定 ＞ ネットワークとインターネット ＞ イーサネット
『物理アドレス (MAC)』の値を `A8-A1-xx-xx-EB-E9` のような値をメモしておく。
![MAC.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12419/2e2cab73-0d16-0117-8123-58cd75cafb3e.png)

## (3) macOS に `wakeonlan` をインストールする

homebrew がある前提で：

```
$ brew install wakeonlan
（中略）
==> Pouring wakeonlan--0.42.arm64_big_sur.bottle.tar.gz
🍺  /opt/homebrew/Cellar/wakeonlan/0.42: 6 files, 20.9KB
```

## (4) Windows PC をスリープさせる
![sleep.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12419/f6dce895-6c8a-54dc-bbb6-799a4ebefba8.png)

## (5) macOS からマジックパケットを送信する

`A8-A1-xx-xx-EB-E9` のハイフン区切りをコロン区切りに書き換えて、`wakeonlan` を実行する。

```
$ wakeonlan a8:a1:xx:xx:eb:e9
Sending magic packet to 255.255.255.255:9 with payload a8:a1:xx:xx:eb:e9
Hardware addresses: <total=1, valid=1, invalid=0>
Magic packets: <sent=1>
```

## (6) Windows PC が復活した 🎉

無事にスリープ解除できました。
有線 LAN でなくて、無線 LAN の場合にも、同じ手順でできるのかは、未確認。
httpsにしたらサイトがつながらなくなった

# 背景

Conoha VPSのDjangoテンプレートでwebページ作ってまして、以下のサイトあたり参考にSSL証明書を取得していました。

https://support.conoha.jp/v/hellovps-w-07/

http://example.com
を
https://example.com
にしたい。

そしたら
上手く設定してもhttps://example.comが表示されないのです。

# 結論

httpsはポート番号が違うんですね

http →　80
https →  443

なので、443が開放されていないと、https設定がうまくなるともにアクセスできなくなるわけです
(しかもエラーログも出ない)

Ubuntuなので、

```
ufw allow 443
```

することで解決しました。
Word、PowerPointでCtrl+C時の解像度を引き上げる方法

2022/10/10のOffice 365版で確認。

パワポで簡単な説明図を作る事あるけど、画像として取り出す時に解像度が低すぎて困る。
レジストリを弄って引き上げる方法はあるが、画像をファイルとしてエクスポートする事すら面倒くさい。
Ctrl+CでコピーしてPaint.netに貼り付ける時の解像度を引き上げたいという時の方法。

# PowerPointのよくあるレジストリを弄くる方法
ググって出てくる方法。
https://learn.microsoft.com/en-us/office/troubleshoot/powerpoint/change-export-slide-resolution
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5825/bfcf21c5-6a81-193b-aade-0dd8b97d0c16.png)

この手順はスライドを画像としてエクスポートする場合にしか機能しない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5825/62493729-27f4-00f7-dc59-ecbcb289cf35.png)

## 解像度の計算方法
上記のレジストリのdpiの値と、下記の「スライドのサイズ」の値から計算される。
1インチ＝25.4 mm の前提の上で、以下の設定だと横幅 33.867 cmの場合は`96 / 2.54 * 33.867≒1280` なので、初期値だと横1280pxの画像が作成される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5825/a3604199-bfef-3bf5-a508-f9b656dd99a9.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5825/22622bdf-0e57-303c-24e3-4e75ed3390d9.png)

# PowerPointのCtrl+Cの画像の解像度を引き上げる方法 1
図形をCtrl+Cでコピーした時は96dpiで固定となる。なので解像度を上げる時はスライドのサイズを伸ばすしかない。
142.2 cmが最大値なので、96dpiだと96/2.54*142.2 = 5374 pxで縦横5374ピクセルまで伸ばす事は可能。
どうせ印刷なんかもうしないし、これを初期値にしてもいいかも。
Todo: Windowsの画面拡大設定を引き上げると反映される？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5825/370c934e-dfa2-4748-cddc-97ed2a852dc8.png)

# PowerPointのCtrl+Cの画像の解像度を引き上げる方法 2
図形オブジェクトはスライドのサイズを上回る事が出来るので、以下の様なサイズにすれば上記の方法1を上回る解像度でコピーする事が出来る。
常用は出来ないけど、特定のスライドのみ高解像度で出力したい場合の手順。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5825/c6477578-56d7-f68b-22ef-26ced3631ffa.png)

# WordのCtrl+Cの画像の解像度を引き上げる方法
Wordにはレジストリの様なオプションが無い。
下記のように表示＞Webレイアウト を選択して画像を引き伸ばせばそれなりに伸ばせれる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5825/e41c7f02-3b6b-69ff-7221-1724e83fc266.png)
Professional Scrum Master I (PSM I) にGoogle翻訳使って合格した話

# Professional Scrum Master (PSM) とは
スクラムマスターに関する資格といえば、`Certified ScrumMaster (CSM)` が有名かと思いますが、`Licensed Scrum Master (LSM)` ・ `Professional Scrum Master (PSM)` などもあります。

PSMは他の資格と比較して以下のような特徴があります。
- 受験費用が安い
- 試験のみの受験で取得可能
- 資格の更新が不要
- **試験の言語が英語のみ**

詳細は以下のWebサイト等をご参照ください。
[ITpreneurs: スクラムマスターの実務に役立つ！代表的な3つの認定資格と選び方を解説](https://www.itpreneurs.co.jp/data-and-knowledge/scrum-certifications)

日本人の方の受験体験記等も結構出ているようなので、この記事では「**試験の言語が英語**」に焦点を当てて書いていきます。

# 受験の英語について

英語だとどうしても文章の理解に時間がかかってしまいます。
PSM Iは60分の受験時間で80問の問題に回答する必要があるため、やはり母国語でないと難しいという人もいるかと思います。

一方、PSMでは[Google翻訳による母国語での受験を公式に推奨しています](https://www.scrum.org/support/using-google-translate-plug-take-assessments)。

「多くの人がGoogle翻訳での受験に成功してるよ！」「翻訳精度は保証しないけど、みんな良いって言ってるよ！」
とのことです。
本当でしょうか？

# 検証
PSMの本番試験で翻訳精度がどうなるかは未知のため、無料でPSMの練習ができるWebサイトをいくつかGoogle翻訳してみました。
英語と翻訳された日本語を比較してみましたので、今後PSMをGoogle翻訳で受験する方の参考になればと思います。

| 元の英語 | 翻訳された日本語 | 「こう訳して欲しい」日本語 |
|:-----------|:------------|:------------|
| Product | 製品 | プロダクト |
| Product Backlog | 製品バックログ | プロダクトバックログ |
| Product Owner | 製品所有者 | プロダクトオーナー |
| Order | （プロダクトバックログの）注文 | （プロダクトバックログの）順序 |
| Sprint Retrospective | スプリント回顧展 | スプリントレトロスペクティブ |
| Sprint Goal | スプリント目標 | スプリントゴール |
| Refinement | 洗練/改良 | リファインメント |
| Value | 値 | 価値 |
| Stakeholder | 関係者 | ステークホルダー |
| DoD | 国防総省 | Definition of Done (完了の定義) |

だいたい「せやな」という感じかと思うのですが、DoDが国防総省というのは初見では「は？」となってしまいました。

# 本番試験の結果
無料サイトでは見たことのない問題（または回答の選択肢が少しひねっている問題）が3割くらいあったように思います。
基本は練習サイトでのGoogle翻訳と同じような翻訳傾向だったので問題ありませんでしたが、ひとつだけ「これ翻訳された日本語だけだと絶対わからなかったな」という問題がありました。

（正確な文章ではありませんが、雰囲気だけ）

**Q. スクラムで必要なものは？1つ選択せよ。**
A1. `スプリント振り返り`
A2. `開発者はデイリースクラムに必ず参加する必要がある`
A3. `バーンダウンチャート`
A4. `リリース計画`

勉強されている方であれば `A1` を即選択するでしょう。スプリントレトロスペクティブ（振り返り）はスクラムでは必須のイベントの１つです。
でも `A2` はどうでしょうか？デイリースクラムもスクラムでは必須のイベントです。またデイリースクラムは開発者のみが参加すべきイベントだったような気がします…

ここで怪しいと思った私はGoogle翻訳を一度切って英語に戻して確認しました。
すると…

A2. `... must stand up at Daily Scrum.`

はい、「デイリースクラムに立って参加しなければならない」ですね。
そんなルールはスクラムにはありません。

ということで、Google翻訳が完全ではなく、原文を確認しないと解けない問題があることも確認できました。
とはいっても、翻訳を疑ったのはこの１問くらいで、他の問題は英語を確認することはあっても翻訳ミスで誤答につながるようなことはありませんでした。

結果として、60分の中で最初の30分で80問を回答完了させることができ、残りの30分で詰まった問題を含めて再度80問を見直すことができました。
タイトルにもあるように試験にも合格できました。

# 結論
PSMの資格は練習サイトで慣れておけばGoogle翻訳で十分取得可能である。
でも不安があればすぐに英語に戻して確認したほうがよい。
WSL2のAlmaLinux8でAMD-GPGPUを使う（初めの段階）

あまり詳しくないんだけどAMD Ryzenの内蔵GPUを使ったAI画像を試してみる

半日ぐらい使った時点での理解

* GPGPUは演算幅とかメモリが早いからCOS/SINとか配列計算が速い認識
* いま Ryzen 4750G を使っていてCPUで12分で1枚程度の速度
* direct12 だかの direct ml を使う(GPGPUの統合版みたいな？)
https://github.com/microsoft/DirectML
* torch の direct mlバージョンを使う
https://pypi.org/project/pytorch-directml/#files
→ 現時点では2022/05の`pytorch_directml-1.8.0a0.dev220506-cp38-cp38-manylinux2014_x86_64.whl`な感じで
→ py36,py37,py38しかない
進めてったらGLIBCだかの新しめのを要求されてglibcコンパイルだかが必要になってとめる

Direct XなんちゃらとDirect MLかつWSL2関連で追加の何かが必要になるかも

内蔵GPUでどれくらい速度が速くなるのか知りたい、、けどAI画像で騒がれてるのにupdateされないのは性能が微妙だからか？

んーコンテナでやると環境壊さなくていいかな、、まぁWSL2環境壊れても秒で構築できるけど
EF Coreで簡単なログ出力（SQL文の出力）

はじめに
---
この記事では、EF Coreで簡単なログ出力をしてみます。デバッグ時に、出力ウインドにSQL文が出力されるようにします。

動作確認は、
+ オンプレのWindows Server 2016
+ SQL Server 2017
+ .NET6
+ Visual Studio 2022
+ Microsoft.EntityFrameworkCore.SqlServer のインストール

で行いました。

LogToメソッドで出力ウインドに出力
---
`DbContext`派生クラスの`OnConfiguring`メソッド内に、`DbContextOptionsBuilder`クラスの`LogTo`メソッドを書いて、ログの出力先や出力内容を設定します。

```C#:HogeContext.cs
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Diagnostics;
using Microsoft.Extensions.Logging;
using System.Diagnostics;

 internal class HogeContext : DbContext
    {
        private readonly string connectionString;
        public HogeContext()
        {
            connectionString = "Data Source=.\SQLEXPRESS;Initial Catalog=HogeDb;Trusted_Connection=True;";
        }

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            optionsBuilder
                // ここに注目
                .LogTo(
                    message => Debug.WriteLine(message),
                    new[] { DbLoggerCategory.Database.Name },
                    LogLevel.Debug, 
                    DbContextLoggerOptions.LocalTime)
                .UseSqlServer(connectionString);
        }

        // DbSetの例
        public DbSet<Person> People { get; set; }
        public DbSet<Pet> Pets { get; set; }
    }
}

```
以下は、`LogTo`メソッドの引数の設定内容の説明です。
+ 第一引数　**message => Debug.WriteLine(message)**
ここで出力ウインドに出力するように設定。

+ 第二引数　**new[] { DbLoggerCategory.Database.Name }**
ログ・メッセージのカテゴリを`DataBase.Name`に設定。こうすることで、`Database.Connection`、`Database.Command`、`Database.Transaction` などのデータベース関連のサブカテゴリのメッセージを取得できる。

+ 第三引数　**LogLevel.Debug**
ログ・レベルを設定。他に`LogLevel.Information`などがある。

+ 第四引数　**DbContextLoggerOptions.LocalTime**
個々のメッセージに冠されるタイトル行の表示内容を設定。ここでは日時のみに省略するようにしています。

`LogTo`メソッドは、これも含めて５つオーバーロードが定義されている。（2022/10/10 現在）
より詳しくは、Microsoft Learn の「[シンプルなログ](https://learn.microsoft.com/ja-jp/ef/core/logging-events-diagnostics/simple-logging "シンプルなログ")」を参照ください。


EFCoreを利用しているとログの確認がしたくなります。
自分が書いたメソッド式やクエリ式でどの様なSQL文が生成されているか。
コードを書き換えることでSQL文がどう変化するか。
SQL文以外にもDataReaderやConnectionが開いたり閉じたりする様子もわかり、見ていると色々と気付かされます。:smile:
vueでdaisyUIを使える様にしたい

# はじめに

CSSを書いているとあっという間に時間が過ぎて本来の目的である処理が全く書けないのでえらい人が書いてくれたデザインに頼りたくvueでdaisyUIを使える様にします。
デザインできる人すごい…ありがたい…。

# 手順

まずはvueアプリの作成から。
インストールとかは省きます。

## vueアプリの作成

```sh
$ vue create sample

Vue CLI v5.0.8
? Please pick a preset: (Use arrow keys)
❯ Default ([Vue 3] babel, eslint) 
  Default ([Vue 2] babel, eslint) 
  Manually select features 

# (略)

$ cd sample
$ yarn serve

 DONE  Compiled successfully in 3716ms                                                                                                                                                  11:32:40 PM


  App running at:
  - Local:   http://localhost:8080/ 

# (略)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83831/ebf66609-651f-1d43-277d-3f66fa9074a9.png)

表示されたのでよしとします。

## tailwindcssのインストール

daisyUIを利用する前提としてtailwindcssが必要なので、インストールします。
https://tailwindcss.com/docs/installation/using-postcss

```sh
# 3つインストールする。
$ yarn add -D tailwindcss postcss autoprefixer

# tailwind.config.jsが作成される。
$ npx tailwindcss init
```

`/postcss.config.js`を作成して以下とします。

```js:/postcss.config.js
module.exports = {
  plugins: {
    tailwindcss: {},
    autoprefixer: {},
  }
}
```

`/tailwind.config.js`を編集します。

```js:/tailwind.config.js
/** @type {import('tailwindcss').Config} */
module.exports = {
  content: ["./src/**/*.{html,js,vue}"],    // 編集
  theme: {
    extend: {},
  },
  plugins: [],
}
```

`/src/main.css`を作成し以下とします。

```css:/src/main.css
@tailwind base;
@tailwind components;
@tailwind utilities;
```

`/src/main.js`を編集します。

```js:/src/main.js
import { createApp } from 'vue'
import App from './App.vue'
import './main.css' // 追加

createApp(App).mount('#app')
```

Vue.jsのWelcomeページのレイアウトが崩れていれば、反映されていると思われます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83831/e97c6d8e-44cd-e9c8-9c34-f609592401ce.png)

## daisyUIのインストール

求めていたdaisyUIをインストールします。

```sh
$ yarn add -D daisyui
```

`/tailwind.config.js`を編集します。

```js:/tailwind.config.js
/** @type {import('tailwindcss').Config} */
module.exports = {
  content: ["./src/**/*.{html,js,vue}"],
  theme: {
    extend: {},
  },
  plugins: [require("daisyui")], // 編集
}
```

`/public/index.html`にボタンを追加してみる。

```html:/public/index.html
<!-- (略) -->
    <div id="app"></div>
    <!-- built files will be auto injected -->
    <!-- 以下、追加 -->
    <button class="btn">hogehoge</button>
<!-- (略) -->
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83831/84e718d2-2957-a9c5-20bd-de3196272708.png)

daisyUIのボタンが表示されました。

# おわりに

`/tailwind.config.js`の`content`に`vue`を含めるのを忘れていて手間取りました。
daisyUI自体はこれから触っていくので、色々試したいと思います。
iCloudからファイルが消えたときに見る記事

# ゴミ箱を見ろ
Windows PCやmacであればゴミ箱に入っているかもしれない
(標準は30日間保管、個人設定に依存)

# 「最近削除した項目」を見ろ
iPhoneやiPadなどの「ファイル」アプリを使っている場合、消したファイルはここに格納されているかもしれない
(原則30日間保管)

# DropBoxやOneDriveなどの他サービスのフォルダを見ろ
実はiCloudにはもともと入っていなかったりして

# どうしてもない場合
サードパーティアプリから「ファイル」アプリ等で連携したファイルの削除コマンドを押すと、なぜかゴミ箱等に突っ込まれずに完全削除されてしまうことがある。なんで？

## ブラウザ版iCloudからファイルを発掘する
1. mac等のPC端末でiCloudにアクセス&ログイン
1. 画面右上の「アカウント設定」を開く
1. ページ下部の「詳細設定」から「ファイルを復元する」を選択
1. 復元したいファイルを探し出し、復元

## サポートに泣きつく
iCloud　Driveに入れたファイルであれば、エンジニアがDriveをロールバックして復元してくれるらしい（2022/09、サポート問い合わせによる)。ただし、「復元したいファイルの消失直前の時点のDriveの状態」に戻すという操作であり、消えたファイル以外のデータも当該時刻に巻き戻されてしまうらしいので要注意（iCloud以外に退避させておけば良いが)。
JavaScriptでcssを動的に書き換える方法(setProperty)

# はじめに
JavaScriptでcssを書き換える方法があることを知り、驚いたので、その方法を備忘録として残しました。

# サンプル
<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="wvjYLzw" data-user="takayuki332" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/takayuki332/pen/wvjYLzw">
  Qiita anime1</a> by TakayukiTakase (<a href="https://codepen.io/takayuki332">@takayuki332</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

# サンプル説明
各色のボタンをクリックすると、JSの`setProperty`関数を利用してCSSの`--bg-color`プロパティの値を変更し、四角内の背景色を変更しています。
`--bg-color`はカスタムプロパティのため、利用せずに直接`background-color`を指定してもいいのですが、変数があることでどのような値を設定するかを自由に表現できることを狙ってカスタムプロパティを利用しました。

# setPropertyの構文
```
setProperty(“設定項目” , “値” , “値２（省略可能）”)
```
設定項目はCSSの`background-color`や、`color`などのプロパティを指定します。
値はその設定項目に対応した値をしています。


# 参考
https://developer.mozilla.org/ja/docs/Web/CSS/Using_CSS_custom_properties
https://wordpress.ideacompo.com/?p=5056
Oracleを使うGoアプリのコンテナ化メモ（最終回）


https://qiita.com/yuuman/items/9f988a9cf4b6dcf4a969

続きます

# 6. mattn/go-oci8 ⇒ sijms/go-ora への変更
結局`mattn/go-oci8`がOracle提供のOracle Instant Clientに依存していることがすべの原因なので、`mattn/go-oci8`からOracle Instant Clientに依存していないGoのみで実装した`sijms/go-ora`に変更することにします。

https://github.com/sijms/go-ora

書き直したコードは下記となります。

```main.go
package main

import (
	"database/sql"
	"log"

	_ "github.com/sijms/go-ora/v2"
)

var (
	VERSION  = "default"
	REVISION = "dev"
)

func main() {

	log.Printf("Version:%s, Revision:%s", VERSION, REVISION)
	conn, err := sql.Open("oracle", "oracle://gouser:pwd@localhost:1521/GOPDB")
	if err != nil {
		log.Printf("Can't open the driver: %s", err)
		return
	}

	defer func() {
		err = conn.Close()
		if err != nil {
			log.Printf("Can't close connection: %s", err)
		}
	}()

	rows, err := conn.Query("SELECT USER_ID, USER_NAME FROM SAMPLE_USER")
	if err != nil {
		log.Printf("Query error: %s", err)
		return
	}
	defer func() {
		err = rows.Close()
		if err != nil {
			log.Printf("Can't close dataset: %s", err)
		}
	}()

	for rows.Next() {
		var id int
		var name string

		rows.Scan(&id, &name)
		log.Printf("ID : %d, Name : %s", id, name)
	}
	log.Printf("Finished.")
}

```

ローカルでの実行も問題なく動きました。

```shell
2022/10/05 21:50:37 Version:default, Revision:dev
2022/10/05 21:50:37 ID : 1, Name : testuser01
2022/10/05 21:50:37 ID : 2, Name : testuser02
2022/10/05 21:50:37 ID : 3, Name : testuser03
2022/10/05 21:50:37 Finished.
```

ひとまずこのコードをクロスコンパイル&マルチステージビルドしてみます。

# 7. マルチステージビルド再び

前回の DBの接続文字列を`localhost`から`oracke19c`に変更してマルチステージビルドを試します。

マルチステージビルド用のDockerfileは下記です。
OCIのインストールがなくなったのでかなりスッキリしました。

```docker:Dockerfile
# ===================== #
# Builder 
# ===================== #
FROM golang:1.18.5 as builder

WORKDIR /workspace

COPY ./ ./

RUN set -x && \
    echo "==== go build ====" && \
    go mod download && \
    CGO_ENABLED=0 GOOS=linux go build -x -o goapp && \
    ls -la 

# ===================== #
# Production 
# ===================== #
FROM scratch as prod

ENV ROOT_PATH=/go/app
WORKDIR ${ROOT_PATH}

COPY --from=builder /workspace/goapp ${ROOT_PATH}

CMD ["/go/app/goapp"]
```

無事ビルドも成功しました。
イメージのサイズも**10.2MB**ととても小さくなっています。

```shell
$ docker build -t sample-go .
… ビルドログ省略

$ docker images
REPOSITORY        TAG         IMAGE ID       CREATED          SIZE
go-sample         latest      5271d522481f   18 seconds ago   10.2MB
golang            1.18.5      06c366130191   1 weeks ago      965MB
oracle/database   19.3.0-ee   b29bba5ef6ba   1 weeks ago      6.53GB
```

[前回](https://qiita.com/yuuman/items/9f988a9cf4b6dcf4a969)の通りネットワーク設定を追加して`run`コマンドを実行します。

```shell
$ docker run --name go-sample --net desktop_default go-sample:latest
2022/10/05 12:49:53 Version:default, Revision:dev
2022/10/05 12:49:53 ID : 1, Name : testuser01
2022/10/05 12:49:53 ID : 2, Name : testuser02
2022/10/05 12:49:53 ID : 3, Name : testuser03
2022/10/05 12:49:53 Finished.
```

**成功！！！！！！！！！！！！！！！！！！！！！！**

# 結論
OracleにCRUD操作を発行するだけのコードで軽量コンテナで動かすことを前提とした場合は`mattn/go-oci8`ではなく`sijms/go-ora`などのGoだけで実装したライブラリの利用を推奨します。

一方、Oracleの機能をフルで使いたい場合は`mattn/go-oci8`を推奨しますが、Oracle Clientの静的ライブラリを生成してからの静的リンクでのビルドなど頑張ってください。
【AtCoder】サンプルテストを楽にやろう【競技プログラミング】

競技プログラミングでは入力は標準入力から与えられます。
サンプル(入力例、出力例)を試すときは

コードを実行して
入力待ち状態のところに入力例をコピペして
出力例と比較する

というやり方になります。
が、 **「あ！エラーでた！コード書き直さなきゃ！」** のたびにまたコピペして・・・というのは面倒ですし、入力例以外の入力を試したい時は自分で毎回打ち込み直しするのでもっと面倒です。
こんなめんどくさいことほんとにみんなやってるのか？と思いませんか？

私の場合はこうやっています、というのを紹介します。
言語はpython、エディタはVScodeを使っています。
![画像4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700383/8549c9c7-89fa-a4cf-1718-058643cf52c8.png)

フォルダの中にあるファイルは4つです。
Ans1.py
Ans2.py
Cheat.py
HandInput.txt

Ans1.pyは画像の中央で開いているファイルです。ここに提出するコードを書いていきます。
最上部に以下のコードを書いています。

```python:
import io,sys,os
os.system("Cls")
with open("HandInput.txt") as TxtOpen:
    INPUT=TxtOpen.read() 
sys.stdin=io.StringIO(INPUT)
# --------------------------------------------------------
```

これによって同フォルダにあるHandInput.txtの内容を標準入力として受け取れます。
入力例の内容をHandInput.txtにコピペし、Ans1.pyを実行すればコードを書き直すたびにいちいちコピペせずにすみます。
(os.system("Cls")は出力場所をきれいにするためだけのコードなのでなくても動きます)
提出するときは「---」以下の部分だけをコピペします。

ちなみにAns2.pyも全く同じです。
過去問をやっている時、自分で書いたコードでWAが出たがどのケースかわからない！という時に
Ans1.pyは自分で書いたコードを
Ans2.pyは解説に書いている正解コードを
それぞれ書いてHandInput.txtにてきとうな入力例を作る→両方実行→違う値がでたらWAのケースが見つかった
というような使い方をしています。

Cheat.pyはチートシートです。
素因数分解とか、UnionFindとか、よく使うコードを書いています。必要な時にコピペします。

内容は以下で公開しています。

https://qiita.com/sano192/items/5f6cec98ec4ecfb2af2c

サンプルテストを自動化するところまでやっている人もいるようですが、そこまでやるには ~~めんどくさい~~ 技術力が足りませんでしたので、まあこれでいいかなと。
皆様も良い競プロライフを。
Microsoft Graph で Get-MsolAccountSku ライクな出力結果をだす

# はじめに
2022年6月30日以降、MSOnline Powershell のライセンスを操作するコマンドが廃止されたため
自家製Office365関連ライセンス割り当てスクリプトをMicrosoft Graphで書き直したのだが、テナントのライセンスの使用状況を出力する新コマンド**get-MgSubscribedSku**が従来のより非常に見づらい且つわかりづらかったので、パイプとSelectで旧コマンドGet-MsolAccountSkuライクの出力結果を出せるようにしてみた。

以下は従来（MSOnline Powershell）の。現在のライセンス使用本数と空き状況がわかる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320647/52863592-a90d-abe2-6c7f-5ea482554309.png)

以下は get-MgSubscribedsku (Microsoft Graph)。
ライセンスがID表示だったり、ライセンス保有数もわからないためこれだけだと正直参考にならない、、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320647/9a0a1d97-c160-413f-3360-cd54a6de6b93.png)

# Get-MsolAccountSku ライクにする

## コマンド
``` Powershell
get-MgSubscribedSku | Select -Property Sku*, ConsumedUnits -ExpandProperty PrepaidUnits | select SkuPartNumber, Enabled, ConsumedUnits
```
## 出力結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320647/bc80a82b-7e61-7f70-bfe8-9fcee597d0ca.png)

select と パイプ だらけでもっとスマートにしたがったが、**ExpandProperty** で展開しないと各種フィールドを select で抽出できなかった。
ねずみ算をElixirで解くことを楽しむ

# はじめに

[ねずみ算](https://ja.wikipedia.org/wiki/%E3%81%AD%E3%81%9A%E3%81%BF%E7%AE%97)を[Elixir](https://elixir-lang.org/)で解いてみます。

> 正月にねずみ、父母いでて、子を十二ひきうむ、親ともに十四ひきに成也。此ねずみ二月には子も又子を十二匹ずつうむゆえに、親ともに九十八ひきに成。かくのごとく、月に一度ずつ、親も子も、まごもひこも月々に十二ひきずつうむとき、十二月の間になにほどに成ぞといふときに、二百七十六億八千二百五十七万四千四百二ひき。

この問題は、[塵劫記（じんこうき）](https://ja.wikipedia.org/wiki/%E5%A1%B5%E5%8A%AB%E8%A8%98)という、江戸時代（1627年）の算術書に書いてある代表的な問題です。

# [Elixir](https://elixir-lang.org/)

```elixir
1..12 |> Enum.reduce(2, fn _, acc -> acc + div(acc, 2) * 12 end)
```

`27682574402`（二百七十六億八千二百五十七万四千四百二）を得られます :tada::tada::tada:

数学的には`2 * (7 ** 12)`で求められるとのことです。

http://www.torito.jp/puzzles/114.shtml

## お便りご紹介

読者の @Mnishiguchi さんからお便りをいただきました。

```elixir
for _ <- 1..12, reduce: 2 do
  acc -> acc + div(acc, 2) * 12
end
```

[forの:reduceオプション](https://hexdocs.pm/elixir/Kernel.SpecialForms.html#for/1-the-reduce-option)を使う方法です。
ありがとうございます！


# おわりに

[ねずみ算](https://ja.wikipedia.org/wiki/%E3%81%AD%E3%81%9A%E3%81%BF%E7%AE%97)を[Elixir](https://elixir-lang.org/)で解いて、`27682574402`を得ることができました。

かつては、[算額](https://ja.wikipedia.org/wiki/%E7%AE%97%E9%A1%8D)という文化があったそうです。

> 江戸時代の日本で、額や絵馬に和算の問題や解法を記して、神社や仏閣に奉納したものである。
Laravelテストのメモ


Laravel＋PHPUnitのテストについてのメモ。

なお、Laravel5系をベースにしたプログラムなので一部いまと違うかも。。

# 基本的な形

```php
<?php

use App\Models\User;
use Carbon\Carbon;
use Tests\TestCase;

class SampleTest extends TestCase
{
    /**
     * @test
     */
    public function サンプルのテスト()
    {
        $user = factory(User::class)->states('active')->create([
            'last_login_at' => Carbon::yesterday()
        ]);

        $response = $this->actingAs($user)
            ->json('get', route('users.me.get'));

        $response->assertSuccessful();

        $decodedResponse = $response->json('user');
        $this->assertSame($user->id, $decodedResponse['id']);
    }
}
```


# 例外エラーチェック

```php
<?php

use Illuminate\Validation\UnauthorizedException;
use Tests\TestCase;

class SampleTest extends TestCase
{
    /**
     * @test
     */
    public function 例外エラーの確認()
    {
        $this->expectExceptionObject(new UnauthorizedException('認証エラー'));

        $response = $this->json('get', route('users.me.get'));
    }
}
```

実行する前に `expectExceptionObject` で発生する例外を定義しておく。


# テストスキップ

```php
<?php

use Tests\TestCase;

class SampleTest extends TestCase
{
    /**
     * @test
     */
    public function なんかのテスト()
    {
        $this->markTestSkipped('SKIP');

        $this->expectExceptionObject(new UnauthorizedException('認証エラー'));

        $response = $this->json('get', route('users.me.get'));
    }
}
```

`markTestSkipped` を入れるとテストがスキップされる。
４０代おっさんPythonを勉強する（データ構造と組み込み関数②）

## 本記事について

この記事はプログラミング初学者の私が学んでいく中でわからない単語や概要を分かりやすくまとめたものです。
もし不正などありましたらコメントにてお知らせいただければ幸いです。

## データ構造と組み込み関数

前回の記事

<https://qiita.com/kou1121/items/1bce9187dc6fa94d3ed1>

### スライシング(slicing)

- スライスで部分的な文字列を取り出す
- 指数はいつも０から始まる
- Pythonで start：end：step というレンジの指定がスライスする(startは含むがendは含まない)
- endを指定しなかったら、最後までと言うこと
- stepを指定しなかったら、step=1になる
- ここで一つ覚えておきたい関数があって、len()という関数は文字列（時にはオブジェクト）の長さを返す

```python
str2 = '利樹は大好きだよ！'
print(str2[2])
print(str2[-1]) # 後ろから
print(str2[5:8])
print(str2[:7])
print(str2[3:])
print(str2[-3:]) # 最後の3文字
print(str2[::2]) # step=2
len(str2)
```

### リスト型の使い方(シーケンス型)

- 文字列と同じスライスができる
- リストの場合は要素で数える

```python
namelist = ['としき', 'あっきー', 'たろう', 'じろう', 'さぶろう']
print(namelist[2])
print(namelist[-1]) # 後ろから
print(namelist[1:3])
print(namelist[:3])
print(namelist[3:]) #4つ目から最後まで
print(namelist[-3:]) # 最後の3要素
print(namelist[::2]) # step=2
print(namelist[:]) # 全部
len(namelist)
```

- リストのメソッドにより増減

```python
namelist = ['としき', 'あっきー']
namelist2 = ['たろう', 'じろう', 'さぶろう']

namelist.append('としき') # 末尾へ追加
print(namelist)

namelist.extend(namelist2) # リストの結合、namelist += namelist2もできる
print(namelist)

namelist.insert(1, 'しろう') # 指定の場所に挿入
print(namelist)

del namelist[1] # リストのメソッドでない、Pythonの分(statement)
print(namelist)

namelist.remove('としき') # 指定した値と同じ要素を検索し、最初の要素を削除
print(namelist)

a = namelist.pop() # 要素を取り出して、削除する、POP(1)やpop(-1)も指定できる。pop()は一番最後
print(a)

i = namelist.index('としき') # 要素の場所(オフセット)を知る
print(namelist)
print(i)

print(namelist.count('としき')) # 個数の計算

namelist.sort() # 昇順に並び替え
print(namelist)
```

- リストのコピーで気を付けること
  - a = b　みたくリストの代入を行った場合、同じリストを指している(参照渡し)
  - もしコピーしたい場合は、別の方法でないといけない

```python
a = [1,2,3]
print(a)
b = a.copy() # リストのcopy()メソッド
c = list(a) # list()の返還関数
d = a[:] # リストのスライス
print(a, b, c, d)

a[0] = 'x'
b[1] = 'y'
c[2] = 'z'
print(a, b, c, d)
```

- リストはイテレータ(要素を反復処理)として使う

```python
namelist = ['としき', 'あっきー','たろう', 'じろう', 'さぶろう']
for name in namelist:
    print(name)
```

- 代わりにrenge関数が導入できる。range(start, end, step)関数では指定されたレンジの数値を反復的に生成する

```python
for i in range(5):
    print(i)
for i in range(1,5):
    print(i)
for i in range(1,10,2):
    print(i)
```

## 参考

https://www.kitakyu-u.ac.jp/news/2022/08/003215.html
HSV色空間の値でグラデーションを画像を作る

### はじめに
色を表現する際、RGBではなくHSVを使って表現することがあり、その際、値の範囲をグラデーションで表現したかったので、コードを書いてみました。何かの役に立てば幸いです。

### やったこと
画像のサイズ(width,height)と、HSVの範囲(lower_hsv、upper_hsv)を指定することで、その範囲をグラデーションで表現することができます。

``` python
import cv2
import numpy as np

# 画像のサイズ
width = 255
height = 255

# HSVの範囲を設定
lower_hsv = [0,0,0]
upper_hsv = [180,255,255]

# 初期化
hsv=np.zeros((height,width,3),np.uint8)

# 画像のサイズに合わせて値を分割
h_range = np.linspace(lower_hsv[0],upper_hsv[0],width)
s_range = np.linspace(lower_hsv[1],upper_hsv[1],height)
v_range = np.linspace(lower_hsv[2],upper_hsv[2],height)

# 横軸を色相(H)
for i in range(width):
    # 縦軸を彩度(S),明度(V)
    for j in range(height):
        hsv[j,i,0]=h_range[i]
        hsv[j,i,1]=s_range[j]
        hsv[j,i,2]=v_range[j]

# ファイルに出力
img=cv2.cvtColor(hsv,cv2.COLOR_HSV2BGR)
cv2.imwrite('HSV_image.jpg',img)
```
#### このまま実行した場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1359985/0d9d3091-b899-f152-d6a7-b276a520ecf9.png)

#### 彩度を固定で緑のグラデーションを作りたい場合
```
lower_hsv = [50,200,0]
upper_hsv = [80,200,255]
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1359985/285651df-5a31-1fdd-19a1-80aa908f547d.png)

#### 明度を固定で青のグラデーションを作りたい場合
```
lower_hsv = [100,0,100]
upper_hsv = [130,255,100]
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1359985/0abd2825-7ef6-a0ee-b80e-d254a6301175.png)
【Android】個人的新たに見つけたアノテーションのメモ

# はじめに
これまでに
[【Android】個人的によく使うアノテーションについてのメモ](https://qiita.com/Tsubasa12/items/e02458af070748d20cb4)
[【Android】個人的によく使うアノテーションについてのメモ　part2](https://qiita.com/Tsubasa12/items/46ef6c82b6fab28b9035)
という記事を書いてきましたが、今回は新たに見つけたアノテーション達の意味を調べたので後に見返せるように記事に残します

# アノテーション表

※”＠”をつけるとアドレス認識になってしまうので省略

|アノテーション|意味|
|:---|:---|
|ContributesAndroidInjector|ActivityでInjectができるようにする|
|DrawableRes|受け取る値をdrawableのIDとして定義したものに限定する|
|NeedsPermission|パーミッションが必要な処理を実行する関数に付ける|
|RuntimePermissions|パーミッションを処理するActivityやFragmentに付ける |
|OptIn|過去では「Experimental」というアノテーションで使われていて、自作ライブラリにも追加することができる|
|OnLifecycleEvent|LifecycleObserverを作成する|
|BindsInstance|コンポーネントを構築するときに、これを指定したメソッドを呼び出すことで、引数をコンポーネントにInjectできるようにする|

# おわりに
今回は新たに見つけたものを調べてメモがわりにもできるように表にしました。
今後も同じように新たなものを複数見つけ次第また記事にしたいと思います。
ABC 153 D - Caracal vs Monster 

# [問題](https://atcoder.jp/contests/abc153/tasks/abc153_d)
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/737344/133350ee-1c57-e4e5-c831-1c01e4545b26.png)

# 思考のアプローチ
言われたとおりに実装すると以下のケースで TLE になる。
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/737344/216773f4-399a-aec8-17e6-225f6852aa86.png)
そこで考え方を変える必要がある。
そんな時は手を動かして法則性を探す。

汚い字で申し訳ない、以下のような感じで書き出した。
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/737344/4866d122-640e-dec0-c707-19e50ac45b59.png)
ここまで書き出すことで、**2で割り切れるまでカウント値は変わらない**事が分かりました。
しかも回答は **2^(n+1)-1** のようです。
これが分かれば後はコードに落とすだけ。

```abc153d.cpp
#include <iostream>
#include <vector>
#include <math.h>
using namespace std;

int main() {
	long long H,cnt=0; cin >> H;
	long long ans=1;

	if(H!=1){
		for (int i = 1; i < 1000; i++) {
			if (pow(2, i) == H) {
				cnt = i;
				break;
			}
			else if (pow(2, i) > H) {
				cnt = i - 1;
				break;
			}
		}
		ans = pow(2, cnt + 1) - 1;
	}
	
	cout << ans;
	//while (1) {}
	return 0;
}
```

再帰的に書くとシンプルになりました。

```abc153d.cpp
#include <iostream>
#include <vector>
#include <math.h>
using namespace std;

int rec(long long H,int n) {

	if (H == 1)
		return n;

	int cnt = rec(H / 2, n + 1);
	return cnt;
}

int main() {
	long long H, cnt = 0; cin >> H;
	long long ans = 1;
    if(H!=1){
		cnt = rec(H,0);
		ans = pow(2, cnt + 1) - 1;
	}

	cout << ans;
	//while (1) {}
	return 0;
}
```

もっと説明用に文章と図を入れた方がいいのかな～
只のメモになってしまった。。。
ま、いっか(笑)
[超簡単] Flutterでカメラ機能を実装

<h2>初めに</h2>
Flutterでカメラ機能を実装する必要があったので、実装方法を記事にまとめました。<br>
カメラ機能と聞くと難易度が高いと思われるかもしれませんが、flutterのカメラ機能の実装は超簡単なのでご安心ください。

<h2>初期セットアップ</h2>
<h3>パッケージの追加</h3>

```
 $ flutter pub add image_picker
```
もしくは、`pubspec.yaml`の`dependencies`に以下の内容を記述
```pubspec.yaml
dependencies:
  image_picker: ^0.8.6　　//追加内容
```
パッケージを取得するために以下のコマンドを実行
```
$ flutter pub get
```

<h3>iOSの設定</h3>

以下の設定を`ios/Runner/Info.plist`に追加します。

```Info.plist
<key>NSPhotoLibraryUsageDescription</key>
<string>This app requires to access your photo library</string>
<key>NSCameraUsageDescription</key>
<string>This app requires to add file to your camera</string>
<key>NSMicrophoneUsageDescription</key>
<string>This app requires to add file to your photo library your microphone</string>
```
<h3>Androidの設定</h3>

`android/app/src/main/AndroidManifest.xml`の<application> タグに以下を追加します。

```AndroidManifest.xml
<application
    android:requestLegacyExternalStorage="true" 
>
```

<h2>カメラ機能実装</h2>
<h3>インポートする</h3>

```dart:main.dart
import 'package:image_picker/image_picker.dart';
```
<h3>コード記述</h3>

```dart:main.dart
final picker = ImagePicker();

Future getImage() async {
    final ImagePicker _picker = ImagePicker();
    final XFile? photo = await _picker.pickImage(source: ImageSource.camera);
    print(photo);
}
```
`getImage関数`をボタンの`onPressed`に記述し、ボタンクリックでカメラに遷移します。
上記コードのみでカメラ機能の実装は完了です。

<h2>最後に</h2>
ImagePickerのバージョン0.8.2以降より記述方法が変更になっています。

```dart:main.dart
//古いAPI
PickedFile image = await _picker.getImage(...)
//新しいAPI(0.8.2以降)
XFile image = await _picker.pickImage(...)
```
参考にしたサイトはバージョンのバージョンが古く、エラーに苦戦したので記載しておきます。