OmniAICreator/Qiita-1.07M huggingface dataset:
Ubuntu 22.04 で Java と maven をインストール


Ubuntu において Java を使おうとするといろいろ選択肢がある。
一番安直にしようとするとどうしたらいいかな・・・
以前 Ubuntu20.04 で実験しましたが、
「Ubuntu 20.04 で Java をインストール」
https://qiita.com/nanbuwks/items/e0b620e30b76d5d181dc

同様に 22.04 で確認、ついでに maven もインストールしてみました。

# 環境

- Ubuntu Linux 22.04
- openjdk-11 (デフォルト設定)


# 何があるかな？
```
$ apt-cache search openjdk | grep jre
```
とすると、以下が得られた。

```

default-jre - 標準的な Java または Java 互換のランタイム
default-jre-headless - 標準的な Java または Java 互換のランタイム (ヘッドレス)
openjdk-11-jre - OpenJDK Java ランタイム - Hotspot JIT 版
openjdk-11-jre-headless - OpenJDK Java ランタイム - Hotspot JIT 版 (ヘッドレス)
openjdk-11-jre-zero - Alternative JVM for OpenJDK, using Zero
openjdk-17-jre - OpenJDK Java ランタイム - Hotspot JIT 版
openjdk-17-jre-headless - OpenJDK Java ランタイム - Hotspot JIT 版 (ヘッドレス)
openjdk-17-jre-zero - Alternative JVM for OpenJDK, using Zero
openjdk-18-jre - OpenJDK Java ランタイム - Hotspot JIT 版
openjdk-18-jre-headless - OpenJDK Java ランタイム - Hotspot JIT 版 (ヘッドレス)
openjdk-18-jre-zero - Alternative JVM for OpenJDK, using Zero
openjdk-8-jre - OpenJDK Java ランタイム - Hotspot JIT 版
openjdk-8-jre-headless - OpenJDK Java ランタイム - Hotspot JIT 版 (ヘッドレス)
openjdk-8-jre-zero - Zero/Shark を用いた OpenJDK 用の代替 JVM
openjdk-11-jre-dcevm - Alternative VM for OpenJDK 11 with enhanced class redefinition
```
# Java をインストール
jre でいい場合


```
$ sudo apt install default-jdk
```
jdk が必要な場合

```
$  sudo apt install default-jdk
```
今回は、jdk が必要だったため後者を使いました。

```
$ sudo apt install default-jdk
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています... 完了        
状態情報を読み取っています... 完了        
以下のパッケージが自動でインストールされましたが、もう必要とされていません:
  libpcre2-32-0 libxdo3 xdotool
これを削除するには 'sudo apt autoremove' を利用してください。
以下の追加パッケージがインストールされます:
  default-jdk-headless default-jre fonts-dejavu-extra libatk-wrapper-java libatk-wrapper-java-jni libice-dev libpthread-stubs0-dev libsm-dev libx11-dev libxau-dev
  libxcb1-dev libxdmcp-dev libxt-dev openjdk-11-jdk openjdk-11-jdk-headless openjdk-11-jre x11proto-dev xorg-sgml-doctools xtrans-dev
提案パッケージ:
  libice-doc libsm-doc libx11-doc libxcb-doc libxt-doc openjdk-11-demo openjdk-11-source visualvm
以下のパッケージが新たにインストールされます:
  default-jdk default-jdk-headless default-jre fonts-dejavu-extra libatk-wrapper-java libatk-wrapper-java-jni libice-dev libpthread-stubs0-dev libsm-dev libx11-dev
  libxau-dev libxcb1-dev libxdmcp-dev libxt-dev openjdk-11-jdk openjdk-11-jdk-headless openjdk-11-jre x11proto-dev xorg-sgml-doctools xtrans-dev
アップグレード: 0 個、新規インストール: 20 個、削除: 0 個、保留: 118 個。
220 MB のアーカイブを取得する必要があります。
この操作後に追加で 241 MB のディスク容量が消費されます。
続行しますか? [Y/n] y
```

インストールした後、バージョンを確認。

```
$ java --version
openjdk 11.0.16 2022-07-19
OpenJDK Runtime Environment (build 11.0.16+8-post-Ubuntu-0ubuntu122.04)
OpenJDK 64-Bit Server VM (build 11.0.16+8-post-Ubuntu-0ubuntu122.04, mixed mode)
```

2022/08/06 での結果です。


この後、maven をインストールしようとしたら JAVA_HOME が無いということでしたので以下のようにして対応します。

~/.bashrc を編集し、一番下に以下を追加します。

```
$ export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
```

以下のようにして反映します

```
$ source ~/.bashrc
```

# maven インストール

```
$ sudo apt install maven
```

この後、mvn を使ったいんすとーるをおこないますが
/usr/bin/env: ‘ruby\r’: No such file or directory　【windows10 / docker】

# 起こったこと

- MacとWindowsで開発しているプロジェクトで、Winを利用して開発をしようとしてdockerを起動したら　/usr/bin/env: ‘ruby\r’: No such file or directoryが発生した。
- Macでは何もしなくても普通にdockerが起動する。
- ソースコードを一切変えずに、Win10で起動するとエラーが起こっていた。

# 原因

- Git for Windowsを利用していると、git pull or cloneするタイミングで、改行コードがLFから強制的にCRLFに変更される仕様らしい
- CRLFはWINでは動くけどunix系だと動かない
- そのためdockerで起動すると、改行コードがうまく解釈できずに問題が起こっていた。

# 対処方法

- これでなおった

```

$ git config --global core.autocrlf input #clone pull時に改行コードをCRLFへ強制変換をしない設定に変更
$ rf -rf your-repo #レポジトリを削除
$ git clone your-repo #レポジトリをクローンしなおす
$ docker system prune # コンテナもろともすべて削除
$ docker-compose up #upしなおす
```
# 補足

- 改行コードには、以下3つがある
  - CR
  - LF
  - CR/LF
- CR/LFはWin系で動作する。LFはUnic系で動作するらしい。（ここちょっと知識なくて怪しい）
- ちなみに弊社はrubocopを使っているのだが、いつもWIN環境でcarridge return があるよ～と怒られていた。謎だなぁと思っていたがこれが原因だった。

# 参考

https://qiita.com/nishikawa1031/items/38132298ef7c34a3b7b2

https://prograshi.com/platform/docker/convert-crlf-to-lf/

https://qiita.com/uggds/items/00a1974ec4f115616580

https://hiiragi.hateblo.jp/entry/2015/11/24/131739
【Xcode】シュミレーターの画面録画方法

# はじめに
https://qiita.com/Cychow/items/02c99b9fe8f8b822cca2

私はよくシュミレーターを画面録画します。
今までは上記の記事を参考にして画面録画をターミナルから行なっていました。

しかし！！もっと便利な方法をTwitterで発見してしまいました

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">みんな忘れてるかもしれないけどXcode12.5からシミュレータ録画してGIF作成まで直でできるんやで🙄 <a href="https://t.co/JWiw8jrL1j">pic.twitter.com/JWiw8jrL1j</a></p>&mdash; am10 (@am103141592) <a href="https://twitter.com/am103141592/status/1555529386212098049?ref_src=twsrc%5Etfw">August 5, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# やり方
シュミレーターを起動します。
![スクリーンショット 2022-08-06 15.56.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/1e665b1a-77b0-9365-9d06-9f09a8bc3a1c.png)

メニューバーから「File」を選択して「Record Screen」を選択します。
![スクリーンショット 2022-08-06 15.58.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/61615a39-3dc6-370b-1baa-05abfdd0e8e4.png)

赤枠内がレコーディングマークになっていればOK!!
![スクリーンショット 2022-08-06 16.00.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/bcfa241e-d441-071b-5832-88879f806edf.png)

# おわり
シュミレーターでの画面録画は面倒でいつも実機で画面録画していましたが、
シュミレーターでも簡単にできるのであれば実機より便利ですね！

自分だけが知らなかった可能性も、、、
position:sticky;をIE11で使う方法

`position:sticky;`は、jsを使わなくても追従headerを実装できるから便利ですよね。
もともと`position:sticky;`で実装していたものに、急遽IE11対応が求められたので、調べたことをまとめました。

## `position:sticky;`のサポート状況
2022年8月の時点で`position:sticky;`はIE11をサポートしていません。
そのため、`position:sticky;`をIE11で使用するには、調整が必要となります。

![caniuse.com__search=sticky(1280×960).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351760/1d36645f-15b7-7507-4296-7e9e5e3ab44c.png)


## IE11で使うには`polifil「stickyfill」`が便利
https://github.com/wilddeer/stickyfill

以下の記述を追加してあげることで、IE11でも同様の挙動を実現できます。
※ `.sticky`は、`position:sticky;`を設定しているclassが入ります。

```javascript
<script src="https://cdnjs.cloudflare.com/ajax/libs/stickyfill/2.1.0/stickyfill.min.js"></script>
<script>
  var elements = document.querySelectorAll(".sticky");
  Stickyfill.add(elements);
</script>

```

<br>

以上です。
最後までお読みいただき、ありがとうございました。

---
### お世話になったサイト
- [position: stickyが効かない、IE11対応](https://webhoric.com/hp/web/css/position-sticky/)
- [【CSS】position: sticky;が効かない？追従されない4つの原因と解決方法【IE11にも対応】](https://note.spiqa.design/position-sticky-error/)
シェルスクリプト忘備録

#### mkdir
-pをつけるともう既にあったらエラー出さない
```shell
dirname="/test/test"
mkdir -p $dirname
```  

　

#### curl
-s:何も表示せずに実行する、-o:結果を指定したファイルへ保存する
```shell
filename="test.text"
curl -s -o $filename https://google.com
```
　

#### cat, less
ファイルの中身を表示
```shell
cat test.txt
apt install less
less test.txt
```
　

#### head, tail 
ファイルの先頭や末尾の数行だけ表示
```shell
head -5 test.txt
tail -5 test.txt
```
　

#### grep
検索:第1引数に検索の単語、第2引数に検索したいファイルのパス
パイプで繋いで、第2引数を省略したりする
```shell
ls /test | grep ss
```
　

#### chmod
権限
u（オーナー）
g（所属グループのユーザ）
o（その他のユーザ）
a（全てのユーザ）
```shell
chmod a+x test.txt
ls -l test.txt
```
　

#### echo, read
-p:文字を表示しながら入力を変数に受け取ることができる
```shell
read -p "1 + 1 = 2？ [y/n]" answer
if [ $answer = "n" ]; then
  echo 正解です！
else
  echo 不正解です。
fi
```
　

#### ping
パケットが届くのかどうか確認
```shell
ping www.google.co.jp
```
　

#### ping
パケットが届くのかどうか確認
```shell
ping www.google.co.jp
```
LaravelとmicroCMSでのコンテンツ管理 Laravelアプリ作成編

PHPフレームワークであるLaravelと、ヘッドレスCMSであるmicroCMSで、コンテンツ管理機能を実装する手法をご紹介します。Laravelの実装とmicroCMSのコンテンツ管理２つに関してハンズオン形式で記述していきます。

## 前回の記事はこちら

https://qiita.com/masakichi_eng/items/f3a76d40d98bec431649

この記事では、Laravelの実装に関してハンズオン形式でご説明していきます。

## 新規Laravelプロジェクト作成

今回のアプリ作成用にLaravelのプロジェクトを新規に立ち上げます。

私はよく以下の記事を参考にさせて頂いております。

https://qiita.com/ucan-lab/items/56c9dc3cf2e6762672f4

## microCMSのSDK導入

公式のドキュメントを見ながらLaravelでmicroCMSのAPIを叩いてデータを取得するための設定を行います。

https://document.microcms.io/tutorial/php/php-top

SDKの細かい設定などは以下のリポジトリに説明があります。

https://github.com/microcmsio/microcms-php-sdk


```
$ composer require microcmsio/microcms-php-sdk
```

## .envにmicroCMSのAPIキーを追記

```.env
MICRO_CMS_DOMAIN="microCMSのAPIを作成した際のサービスID"
MICRO_CMS_API_KEY="microCMS管理画面のサイドバーにある権限管理メニューの中のAPIキーを入力"
```

## microCMSのサービスクラスを作成

```php:app/Services/MicroCmsService.php
<?php

namespace App\Services;

use Microcms\Client;

class MicroCmsService
{
    private Client $httpClient;

    public function __construct()
    {
        $microCmsDomain = env('MICRO_CMS_DOMAIN');
        $microCmsApiKey = env('MICRO_CMS_API_KEY');

        $this->httpClient = new Client(
            $microCmsDomain,
            $microCmsApiKey
        );
    }

    public function getContents(string $contentName): array
    {
        return $this->httpClient->list($contentName)->contents;
    }
}

```


## ルーティング、コントローラーの作成

### ルーティング作成

```php:routes/web.php
<?php

use App\Http\Controllers\ArticleController;
use Illuminate\Support\Facades\Route;

Route::get('/articles', [ArticleController::class, 'index'])->name('articles.index');
```

### コントローラーの作成

```php:app/Http/Controllers/ArticleController.php
<?php

namespace App\Http\Controllers;

use App\Services\MicroCmsService;
use Illuminate\View\View;

class ArticleController extends Controller
{
    private MicroCmsService $microCms;

    public function __construct(MicroCmsService $microCms)
    {
        $this->microCms = $microCms;
    }

    /**
     * 記事一覧を取得
     * @return View
     */
    public function index(): View
    {
        $articles = $this->microCms->getContents('articles');

        return view('articles.index', [
            'articles' => $articles,
        ]);
    }
}

```

## ビューの作成（今回は時短のためスタイル直書きしてますが、CSS用のファイル作成推奨です）

```php:
@foreach ($articles as $article)
    <div style="margin: 20px; background-color: lightcyan; border-radius: 10px; padding: 15px;">
        <p>タイトル　{{ $article->title }}</p>
        <p>本文　{!! $article->detail !!}</p>
        <p>更新日　{{ $article->updatedAt }}</p>
    </div>
@endforeach
```

http://localhost:8080/articles
にアクセスすると以下の画面が表示されます。(localhost:8080の部分は適宜ご自身の環境に置き換えてください)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1008745/f205801a-51cf-1208-161e-c48940b1edc5.png)

簡単にmicroCMSからデータ取得、表示ができました🎉
今回は以上になります✨最後まで見ていただきありがとうございました。
【Unity】VRMファイルをBlenderに読み込ませて、Unity用のモーションを作る

ネット記事を適当にあさって作ってた結果、数日間沼にハマって出られなくなってたので、備忘としても残しておく。

VRoidStudioで作成したVRMモデルをBlenderに読み込ませるには、Blender側でアドオンをインストールしておく必要がある。
その辺はググって出てくる記事をそのまま参考にしてやればいい。

VRMモデルをUnityに読み込ませる場合も、同様に専用のアドオンをインストールする。
これもググって出てくる記事をそのまま参考に。

で、Blender側でモーションを作って、それをUnityに読み込ませてUnity側のVRMモデルを動かす。
ここで沼った。
結論から言えばBlender側でのモーションの作り方に問題があったっぽい。

# 誤
「ドープシート」⇒「アクション」からモーションを作成していた。
一応モーションは作れるし、Unity側も読み込み自体は問題無い。

しかしそれで動かした場合、何故かボーンの回転がおかしくなる。
人型モデルでT字状態のままで出力しても、Unity側では両足が一点に重なるようにズレてしまう。
土の字に開脚するように動かしても、大の字程度までしか足が開かない。
また、足首は特に変更してないのに地面を向くようにねじれる、首を90度ほど左に回してもUnity側では右側を向く等、原因不明だが正常ではない状態になる。

# 正
「ノンリニアアニメーション」からモーション作成。
こちらで作成した場合、Blender側と同じ動きになってくれた。

どうしてそうなるのかさっぱり分からないところが気持ち悪いが、そこに時間をかけても仕方がない。
ネットでググるのも良いけど、ちゃんとした文書も欲しい…。

参考：Blenderで作ったアニメーションをUnityで動かす
https://qiita.com/Akarinnn/items/de377a1096f4ee7de9fe

# 追記1
モーション作ってFBX出力する際に「トランスフォームを適用」にチェックを入れてなかったからダメだった説ありそう。
あとこの記事を参考にして、複数モーションを一緒に出力できるようになりました。

【Blender】複数のアニメーションを作成してUnityで使う方法
https://ymgsapo.com/2021/01/27/blender-make-several-animation/
BigQueryのschedule実行ではテーブル新規作成できない。。

BigQueryでハマったときのメモ。
BigQueryをschedule実行すると
 "Dataset specified in the query ('') is not consistent with Destination dataset 'xxxxxxxxx'."
というエラーが出てました。
下記issueによると、
[https://issuetracker.google.com/issues/142639061?pli=1](https://issuetracker.google.com/issues/142639061?pli=1)
schdule実行するときは、宛先テーブルとして既存テーブルを使え、ということでした。(新規テーブル作成は不可)
2019年のissueですが今もこのエラーメッセージが出るので仕様は変わらないようです。
```
You still need to use DDL/DML to make change to existing table.

E.g.:

CREATE OR REPLACE destinationTable AS
SELECT *
FROM sourceTable
WHERE date >= maxDate
```
schdule実行するときは新規テーブル作成不可ということなので、create temp tableもできません。。
【SwiftUI】Textの超基本的なこと

# はじめに

SwiftUIのTextのドキュメントを読んでみた内容（超基本的なこと）をまとめました

https://developer.apple.com/documentation/swiftui/text

# 環境
Xcode 13.4.1

# 内容

### テキストを表示させる

`Text()`を使って文字列を表示

```swift
@frozen struct Text

init<S>(_ content: S) where S : StringProtocol

Text(someString) // Displays the contents of `someString` without localization.
```

### フォントを変える

`func font(_ font: Font?) -> some View`を使う

```swift
VStack {
    Text("Font applied to a text view.")
        .font(.largeTitle)

    VStack {
        Text("These 2 text views have the same font")
        Text("applied to their parent hierarchy")
    }
}
.font(.system(size: 16, weight: .light, design: .default))
```
<img width="200" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631585/4b42a766-33b8-e2ea-280e-8272c4d24bef.png">


##### フォントの種類

`.largeTitle`: 大きなタイトル
`.title`: タイトル
`.title2`: 第2階層見出し
`.title3`: 第3階層見出し
`.headline`: 見出しテキスト
`.subheadline`: 小見出し
`.body`: 本文テキスト
`.callout`: コールアウト
`.caption`: キャプション
`.caption2`: 代替キャプション
`.footnote`: 脚注


#### フォントをもっと細かく変える

`.system`を使いより細かく指定できたり、`.bold`や`.italic`なども使える

```swift
Text("by William Shakespeare")
    .font(.system(size: 12, weight: .light, design: .serif))
    .italic()

```

![スクリーンショット 2022-08-06 15.03.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631585/37dcb07d-5ee9-c91c-d8f5-7c24434178ee.png)

### 制約を加える

`func frame(
    width: CGFloat? = nil,
    height: CGFloat? = nil,
    alignment: Alignment = .center
) -> some View`
によって制約をつけることができる

[`Alignment`](https://developer.apple.com/documentation/swiftui/alignment)の指定もいろいろできる
<img width="400" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631585/03da6b7e-095f-69f7-5d20-7af8dbce9b7e.png">

```swift
Text("To be, or not to be, that is the question:")
    .frame(width: 100)
```
![スクリーンショット 2022-08-06 15.11.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631585/a3fff90d-25e4-9be7-c9cf-747dba5a823f.png)

#### 行数の指定をする

`.lineLimit`で行数の指定ができる

```swift
Text("Brevity is the soul of wit.")
            .frame(width: 100)
            .lineLimit(1)
```

![スクリーンショット 2022-08-06 15.17.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631585/f542f9a6-0cb7-3afc-00ff-40b73d3b71bf.png)

### ローカライズさせる

`Text("pencil") `だけでローカライズされるが、あえてさせたくない場合は、`Text(verbatim: "pencil")`を使う

変数をローカライズさせる場合は`Text(LocalizedStringKey(writingImplement))`とする

※ [`init(_:tableName:bundle:comment:)`](https://developer.apple.com/documentation/swiftui/text/init(_:tablename:bundle:comment:))

```swift

Text("pencil") // Searches the default table in the main bundle.

Text(verbatim: "pencil") // Displays the string "pencil" in any locale.

// Don't localize a string variable...
Text(writingImplement)

// ...unless you explicitly convert it to a localized string key.
Text(LocalizedStringKey(writingImplement))
```

# おわりに

やれることは他にもたくさんあるとは思いますが、まずはドキュメントに書いてある基本的なことを理解してから、幅広く調べていこうと思います

# 参考

https://developer.apple.com/documentation/swiftui/text
【Flutter】スプラッシュ画面を実装する方法

##  初めに
スプラッシュ画面とは以下の画像のようにアプリを起動して最初に数秒間表示される画面のことです。スプラッシュ画面ではアプリのロゴなどを表示させることが多いです。基本的にはユーザが操作できないようになっています。


## パッケージの準備
まずは [flutter_native_splashパッケージ](https://pub.dev/packages/flutter_native_splash) を pubspeck.yaml に記述し、Pub get します。

```yaml: pubspeck.yaml
dependencies:
  flutter:
    sdk: flutter
  flutter_native_splash: ^2.2.7
```
これでパッケージの準備は完了です！

## 実装

通常のパッケージであればページでインポートして使用するのですが、スプラッシュ画面の実装は通常のパッケージとは異なり、「 pubspeck.yaml 」ファイルを変更することで実装できます。
今回はiOSのみの実装を行います。

```yaml:pubspeck.yaml
dev_dependencies:
  flutter_test:
    sdk: flutter

  flutter_native_splash: ^2.2.7

flutter_native_splash:
  image: "assets/sample_logo.png"  　　　　　
  color: "FFFFFF"
```
`image` にはスプラッシュ画面で表示させたい画像のパスを記述しましょう。なお、画像の形式は png 形式に限定されているので、注意しましょう。
また、背景色が白以外の場合に表示が崩れないように画像の背景を透過しておきましょう。

今回は以下の作成した画像を表示させています。
<img width=250, src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2609901/edc6b4d5-f986-5c74-0cc7-7c98e9656d6c.png">

`color` にはスプラッシュ画面の背景色にしたい色を指定しましょう。
上のコードでは背景色を白にしています。
Flutter では基本的に色を指定する場合には以下のようにコードを記述します。
```
color: Colors.white,  // NG
```

しかし、スプラッシュ画面の背景色はカラーコードでなければ指定できないので気をつけましょう。
```
color: "FFFFFF"  // OK  
```
<br>

pubspeck.yaml を変更した後、ターミナルで以下のコードを実行します。
```terminal: Terminal
flutter pub run flutter_native_splash:create
```
上のコードを実行してアプリを再起動すると、以下のようにスプラッシュ画面を実装することができます。

![flutter_native_splash.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2609901/f09ab35b-c23a-c330-4595-aaad92e5a3d6.gif)
初めてアプリが開かれたときはスプラッシュ画面が表示されますが、アプリがバックグラウンドで起動している時などはもう一度アプリを開いてもスプラッシュ画面が表示されることはありません。

## 詳細変更
`image` `color` 以外にも様々な変更が可能です。
| プロパティ | 用途 |
|:-:|:-:|
| background_image | 背景画像を指定するためのプロパティ。 |
| branding | アプリを制作した会社のロゴなどを表示させるためのプロパティ。 Android 12 以上のバージョン、 iOS, Web で使用可能。|
| branding_mode | branding で指定した画像の位置を変更するためのプロパティ。<br>デフォルトは bottom で、bottomLeft, bottomRight が指定可能。 |
| color_dark | ダークモードの時の背景色を指定するためのプロパティ。 |
| background_image_dark | ダークモードの時の背景画像を指定するためのプロパティ。 |
| image_dark | ダークモードの時の画像を指定するためのプロパティ。 |
| branding_dark | ダークモードの時の画面下部の画像を指定するためのプロパティ。 |



以上です。

## あとがき
最後まで読んでいただきありがとうございました。

今回は `image`  `color` のみを使った実装でしたが、今後内容を追加していくかもしれません。

参考にしていただければ幸いです。
誤っている箇所があればご指摘いただければ幸いです。

### 参考にしたサイト
https://pub.dev/packages/flutter_native_splash
tkinterでラジオボタンを使う

```python
import tkinter as tk
from tkinter import messagebox

def message():
    messagebox.showinfo('回答', text[var.get()])

root = tk.Tk()
root.geometry('300x250')

text = ['北海道', '群馬', '福井', '和歌山', '島根', '福岡']

for i in range(2):
    root.columnconfigure(i, weight=1)
for i in range(len(text) + 1):
    root.rowconfigure(i, weight=1)    

var = tk.IntVar()
radio = []
for i in range(len(text)):
    radio.append(tk.Radiobutton(root, text=text[i], variable=var, value=i))
    radio[i].grid(row=i, column=0, sticky=tk.W)

answer = tk.Button(root, text='回答', command=message)
answer.grid(row=len(text)+1, column=1, columnspan=2, sticky=tk.EW)

root.mainloop()
```
AlmaLinux 8.x  ffmpeg インストールメモ


```
# yum install http://rpmfind.net/linux/epel/7/x86_64/Packages/s/SDL2-2.0.14-2.el7.x86_64.rpm
# dnf -y install epel-release
# rpm --import http://li.nux.ro/download/nux/RPM-GPG-KEY-nux.ro
# rpm -Uvh http://li.nux.ro/download/nux/dextop/el7/x86_64/nux-dextop-release-0-1.el7.nux.noarch.rpm
# dnf -y install https://download.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
# dnf install --nogpgcheck https://mirrors.rpmfusion.org/free/el/rpmfusion-free-release-8.noarch.rpm -y
# dnf localinstall --nogpgcheck https://download1.rpmfusion.org/free/el/rpmfusion-free-release-8.noarch.rpm

```
Windows の初期化方法　Surfaceユーザー　（回復ドライブ作成からインストール）2022年8月

### 下記のようなエラー:warning:が発生した場合も、対処できます:bangbang:
![download.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654025/179489ca-a4e4-aabf-b746-f8ce11b4a134.jpeg)


# それでは、回復ドライブを使った初期化を始めていきましょう:rocket:


> ①まず、下記のリンクから**マイクロソフトアカウントにサインインしてください

https://support.microsoft.com/ja-jp/surface-recovery-image

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654025/395897e9-d284-6d73-c9c4-502ee3e58cc6.png)
> ②USBドライブを<font color="Red">FAT32</font>にフォーマットします。




## Surface製品を選択して、シリアル番号を入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654025/103ef540-471b-292a-7fe1-960f0daa577d.png)

> 例えば、Surface Laptop3を選択すると、下記のようにシリアル番号の場所を示してくれます。
入力が完了したら、続行ボタンをおしましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654025/66c589f2-dfbe-607c-e2f0-f64911ad3236.png)

## Surface 回復イメージをダウンロードします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654025/adb80f51-5b3c-3f2e-8b91-1dbcb1612182.png)

## USB 回復ドライブを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654025/8c8d869f-9e85-8145-d6cd-c330c8b7f236.png)

> イメージの使用方法の詳細については、「[Surface の USB 回復ドライブの作成と使用](https://support.microsoft.com/ja-jp/surface/surface-%E3%81%AE-usb-%E5%9B%9E%E5%BE%A9%E3%83%89%E3%83%A9%E3%82%A4%E3%83%96%E3%81%AE%E4%BD%9C%E6%88%90%E3%81%A8%E4%BD%BF%E7%94%A8-677852e2-ed34-45cb-40ef-398fc7d62c07#WindowsVersion=Windows_11, "Microsoft")」を参照してください。
> ([動画:Surface をリセットする](https://www.microsoft.com/ja-jp/videoplayer/embed/RWAnGg?pid=ocpVideo1-innerdiv-oneplayer&maskLevel=20&market=ja-jp,"Microsoft"))

## 作成した回復ドライブに、ダウンロードした展開済ファイルをコピーします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654025/25af1758-4f64-1690-a878-eb331c294ca7.png)

## 回復ドライブをパソコンに、挿して音量を下げるボタンを押しながら起動させて、画面の指示に従って進めば完了です:blush:

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654025/6dfc5a67-49c2-7d10-526b-8804a39cfb17.png)
libtiff をVisual Studioでビルド

libtiffのバイナリ(64bit)が見つからなかったので、仕方なくソースをビルド
以下はそのメモ

１．tiff-4.4.0.zipをダウンロードして解凍
２．スタートメニューからVisual Studio 2019を立ち上げる
３．コードなしで続行を選択
４．ファイル　→　開く　→　CMake
５．解凍したtiff-4.4.0のトップにあるCMakeLists.txtを選択

６．ビルド　→　tiffのインストール
　　これにより、outフォルダが作られ、その中のinstallフォルダにバイナリが生成される
　　ただし、これは構成が「x64-Debug」

７．そこで、「x64-Debug（規定値）」とあるプルダウンメニューから「構成を管理します」を選択
　　「CMakeの設定」という画面の左にある「＋」を押して「x64-Release」を追加
　　「Ctrl + s」で保存し、先ほどのプルダウンメニューで「x64-Release」を選択
　　「ビルド　→　tiffのインストール」で、outフォルダ内のinstallフォルダにバイナリが生成される

８．libtiffを使うときは、プロジェクトフォルダに「tiff.h」と「tiffconf.h」と「tiffio.h」と「tiffio.h」
　　を入れてincludeし、ビルド時はReleaseでは「tiff.lib」をリンクし、Debugでは「tiffd.lib」をリンク
画面IDみたいな文字列でファル名を管理するのは、エンジニアリングの放棄だと思ってる

こんなの
`https://www.hellowork.mhlw.go.jp/kensaku/GECA110010.do?action=initDisp&screenId=GECA110010`
みたいに、画面ごとにIDが割り振られる仕組みがある。

ファイルをみただけではそれが何かが分からないから、必ず仕様書が必要になる。
慣れてくるとそのID見ただけで思い出すくらいには暗記できちゃうんだけど、そんなの人間がやることではない。

開発者という人間に対するインターフェースを間違ってる時点で、まともなUIが作れる訳がない。開発者に厳しいヤツは顧客にもユーザーにも厳しい。

ちなみに、機械があつかう名前のことを物理名、人間が扱う名前のことを論理名と読んだりする。「m_empが物理名で、従業員マスタが論理名」みたいな言い方をする。

ただ物理名はエンジニアという人間が扱うものだから、人間に優しいに越したことはない。

ファイル名さえ満足につけれない人が項目名や機能に名前がつけれるわけがない。

情報システムだけではなく、殆どのホワイトカラーは文書を作るのが仕事でその文書には名前がついてる。ドッチファイルで閉じた文書にも名前がつく。法律にも名前がつく。ダサい名前かどうかは二の次で名前をつけることを放棄した時点で、人間を放棄したのと同じ。

めちゃくちゃ昔に遡ると、ファイル名が8文字縛りのころはあったので、プロジェクトID3文字＋機能カテゴリID3文字＋通番2文字みたいなファイル名はありえたが、コンピュータ側にもいまやその制限はない。データベースの主キーであっても桁ごとに意味をもつのはアンチパターンだ。

ソースコードの中でもスコープの狭い変数は、iとか書くケースがあるけど、これは逆に「人間が観るべき変数ではない。本当は隠したいくらいの機械だけの都合の変数」という主張だったりもする。

繰り返す。名前を付けることを放棄した時点で人間であることを放棄したのと同じである。これはITにかぎらずすべての知的活動に言える。名前を付けることを蔑ろにしている組織は人も大事にしていない。
エディタ論争は宗教論争ではない


〇〇派みたいな単語が出てくる事自体議論として破綻をしている。そんなもん派閥じゃないよ。エンジニアなんだから目的と手段をちゃんと議論しようよ。

サーバーサイドで作業するならvimかemacsでなおかつ商用UNIXを触るとなると素のviでテキストを編集する機会がある。サーバーサイドエンジニアリングに軸足があるならvimは必須でvimで出来る簡単なことはvimで高速にできるというのがサーバーサイドエンジニアにとって必須のスキル。

一方でローカルで開発するとなるとGUIのエディタが登場する。
InteliJは開発効率が良いが有償。
有償ツールは自分が個人事業主なら問題ないが、チームを率いる場合や新人を教える場合や、外部パートナーと一緒に仕事をする場合には「誰がそのライセンスを買うのか」というところが問題になる。「学生インターンに教える」みたいなシーンがある場合には特に問題。

テキストエディタでプログラミング言語以外も使うケースはある。例えばCSVファイル。エクセルから吐き出されるCSVファイルは、改行コードがLFとCRLFが混在する。さらにShiftJISが多かったりもする。その場合にはIDE系でもvimでもなく、サクラエディタのようなプレーンなテキストエディタの方が便利（というかその一択になる）。

### ということで私のエディタの使い分け

vim → サーバーサイドで編集する
less → サーバーサイドでログをみる
VSCode → 手元PCでのコーディングが便利。開発支援プラグインが優秀。新規ファイルを開きっぱなしでメモをとってもアプリ終了時に消えないので、メモツールとしても優秀
sakura →　文字コードや改行コードも幅広く扱いたい時。書くよりも読む時。

sakuraはたまにトラブったファイルを読む時に使うけど、vim,less,VSCodeはどれも同じくらいめちゃくちゃ使う。
初心者　flutter x ブロックチェーンに再三挑戦する 1

# 七転八倒十五起き　
　
　前回、ネットで見つけたFlutter×ブロックチェーンの写経に頓挫したのはまだ４月だった。以来、手をこまねいていたわけではなく、さまざまな課題に挑戦しては砕け、挑戦しては砕けの日々で、記事にする気すら起きなかったのだが、今回、UNCHAIN夏合宿でまたまた挑戦の機会を得たので、記事を再開しようと思う。　
　
　今回作るのは、４月の記事で挑戦したの同様の「投票アプリ」である。ではあるけれど、４月のアプリは「二つから一つ選ぶ」投票だった。今回は、何人立候補してくるかわからない、アプリで立候補、アプリで投票、さらに結果発表なので、ず〜〜っと複雑になる。選挙権、被選挙権を判定しなきゃならないし、二重投票を防がなきゃならないし、、、、。　
　
　まあそれでも、今回は孤軍奮闘ではなく「合宿」(オンラインだけど)なので、定期的に相互レビューとかあるから、なんとか起き上がって乗り越えるチャンスにしたいと思う。　

　定石からいえば、まずスマートコントラクトを書くところから始めるんだろうけれども、私はFlutterでフロントから書くことにする。動きがイメージしやすいし、なによりbackendから始めるよりは若干、よいスタートを切れるだろうから。

![スクリーンショット 2022-08-06 15.05.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1646810/f0bfbc5c-4960-36b3-4ced-6eb5d854fc6a.png)

## 要するに、まず形から入るタイプ、です。

https://qiita.com/dongri727/items/54c6c9d91246233f5473
iTermの上部で白いラインが点滅するバグ

`Preferneces` > `Advanced` > ("Big Sur"で検索) > `Work around Big Sur bug where...`を`Yes`にする

![スクリーンショット 2022-08-06 14.56.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78906/416e9b59-6087-c512-955b-f3489a2dfc46.png)

で直った。

https://gitlab.com/gnachman/iterm2/-/issues/9199#note_474219016

フルスクリーンにすると発生していた。
macos Big Surから発生したバグらしい。自分のmacosはMontereyだが同じ問題が発生している。
目がチカチカして非常に鬱陶しい。
SpringBootアプリケーションをDockerで実行する

# 前提

[IntelliJでSpringBootのWebアプリケーション開発](https://qiita.com/ykdevs/items/cb660473759937e0ee45)
で作成したサンプルアプリケーションをDockerコンテナで実行する。

# 準備

- Dockerが動く環境を構築
- docker-composeが動く環境を構築

# ファイルの作成

Dockerfileをつくります。

```:Dockerfile
FROM openjdk:11
COPY  build/libs/spring-sample-0.0.1-SNAPSHOT.jar /var/myapp/spring-sample.jar
WORKDIR /var/myapp
ENTRYPOINT ["java","-jar","spring-sample.jar"]
```

docker-compose.ymlを作ります。

```yaml:docker-compose.yml
version: '3'
services:

  web:
    build: .
    container_name: spring-sample
    ports:
      - 8080:8080
```

# ビルド

DockerイメージをBuildします。

```shell
$ docker-compose build
```
![スクリーンショット 2022-08-06 14.51.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81113/f71b6080-9510-dcb3-2594-acd2abd5e702.png)

Docker Imageが作られています。

![スクリーンショット 2022-08-06 14.51.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81113/50ee0d46-6955-2ec9-5e1f-de54fa5a9814.png)

# 起動

Dockerを起動します。

![スクリーンショット 2022-08-06 14.52.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81113/adfed796-6e59-f78d-a071-e666fc0d0ed7.png)

http://localhost:8080/
にアクセスすると起動しています。

![スクリーンショット 2022-08-06 14.53.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81113/f294e8e7-c5bf-5959-0641-5db20e3f4fc4.png)
さくらVPSで、メモリのスワップを有効にする方法

### 背景
さくらVPSで、メモリが不足しサーバが安定しない。
スワップを確認したところスワップ領域が設定されていなかったため設定した。
メモリの使用率は落ち、サーバは安定した。


### 作業手順
- スワップが設定されていないことを確認。
```bash
kanno@dev:~$ free
               total        used        free      shared  buff/cache   available
Mem:         2024748     1879704       71868        1360       73176       28144
Swap:              0           0           0
```

- スワップ領域を確保。
```bash
kanno@dev:~$ sudo fallocate -l 1G /swapfile
[sudo] kanno のパスワード:
```

- パーミッションを設定。
```bash
kanno@dev:~$ sudo chmod 600 /swapfile
```

- スワップ領域の状態を確認。
```bash
kanno@dev:~$ ls -lh /swapfile
-rw-r--r-- 1 root root 8.0G  8月  6 14:23 /swapfile
```

- 作成したスワップ領域をスワップに設定。
```bash
kanno@dev:~$ sudo mkswap /swapfile
スワップ空間バージョン 1 を設定します。サイズ = 8 GiB (8589930496 バイト)
ラベルはありません, UUID=9b60922f-9256-4fb6-988e-09f7ae6e94eb
```

- スワップ領域を有効化する。
```bash
kanno@dev:~$ sudo swapon /swapfile
```

- スワップ領域を確認。
```bash
kanno@dev:~$ free
               total        used        free      shared  buff/cache   available
Mem:         2024748     1648376      124396         904      251976      196060
Swap:        8388604      353792     8034812
```
Windowsのcurlや Invoke-WebRequestでUTF8のHTMLが直接使えない問題

## Windowsにもcurlコマンドがインストールされて久しいのですが、以下の問題があります。

- curl.exeもあるし、curlコマンドもある
- curlコマンドはInvoke-WebRequestのエイリアスなので、一般的なcurlとは似ても似つかない引数になる
- Invoke-WebRequestは出力もオブジェクトなのでbodyだけ取り出したい時とかひと手間かかる。
- Linuxのcurlコマンドに近いのは、curl.exe
 
## じゃぁcurl.exeを使おうじゃないか

- Linux上でcurlを扱うときには、`curl yahoo.co.jp > out.html` みたいに標準出力をリダイレクトすることが多い
- ところが、Windowsの場合標準出力がどうしても「人間様が見るの」という前提があり
    - コマンドプロンプトはSJISに変換される
    - パワーシェルはUTF16に変換される
- つまり、Windowsのシェルは「人間が見ることを前提」としているため、別の処理にそのまま生の出力をパスするーすることを想定してない。（一応パイプはある）
- 標準出力時に文字コードが強制的に変わることで、一番多いUTF-8のファイルをcurlで扱うことができない

## 解決策：標準出力を使わない

```
curl.exe -L yahoo.co.jp -o out.html
```

`-o` オプションを使えば標準出力ではなくファイルに直接書かれる。これならWindows標準出力まともに使えない問題の回避ができる。そしてWindows上のシェル上でパイプやリダイレクトを使うということは諦める。めちゃくちゃ頑張ったら出来るけど、人間がそこまでめちゃくちゃ頑張らなくちゃいけないのならそれはシェルとはいえない。

WindowsのコマンドプロンプトやパワーシェルはいつまでたってもUTF8を直接扱えない。画面の表示をUTF8にすることはできても、コマンドが標準出力に何かを出力するとSJISになる。そして大きく情報が欠落する。

腹を決めてWSLを使う方が圧倒的に「コンピュータがやることはコンピュータ同士に任せる」ことができる。CLIはどうせ人間には対して優しくない。人間はコンピュータ同士の対話を客席から見ることができれば十分だ。

### PowerShellでWebレスポンスをエンコード指定で扱う例

そうは言ってもPowerShellがそんなに馬鹿な作りではないはず。当然やろうと思えばできる。

https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/invoke-webrequest?view=powershell-7.2
からの引用

```sample.ps1
$Response = Invoke-WebRequest -Uri "https://aka.ms/pscore6-docs"
$Stream = [System.IO.StreamWriter]::new('.\docspage.html', $false, $Response.Encoding)
try {
    $Stream.Write($Response.Content)
}
finally {
    $Stream.Dispose()
}
```

エンコードを指定しながらSystemをnewして、そこにWriteしている。エンコードはWebサーバーのヘッダで指定しているエンコードなので外れることも多い。このサンプルはいまいちだから参考にしないほうがいい。デコードされたレスポンスをエンコードして出力しているだけなので、生データをコピーしてるわけではない。

`>` の代わりとするとめちゃくちゃ行数が増える。スクリプトかもしれないが、シェルの定義からは外れてる。僕たちはただ、インタネット上のファイルを落としてきたいだけなんだ。

まとめるとWindows上で標準入出力を扱いたかったら素直にWSLを使いましょうということです
Kindleの本の内容をランダムに表示していくスクリプト(kindle for Pc)

<h3>Kindleの本の内容をランダムに表示していくスクリプト(kindle for Pc)</h3>
Kindle for Pc　で、Kindleの本の内容をランダムに表示していくスクリプトをPowershellで作成しました

<hr>
プログラム内容
<br>
<br>

```powershell
#SendKeysを使うため、System.Windows.Forms名前空間読込
Add-Type -AssemblyName System.Windows.Forms

#読み出し時間(秒)
$ReadSecond = 60
#何ページ分繰り返すか
$CountLength = 100
#読み出す本の最大ページ数
$BookPages = 170


$page = 1

echo "ランダム読み出し開始"
#この間にトップ画面をkindleにする
Start-Sleep -s 60
echo "Start"


for($i=0; $i -lt $CountLength; $i++){

[System.Windows.Forms.SendKeys]::SendWait("^g")
Start-Sleep -s 2
$page = Get-Random -Maximum $BookPages -Minimum 1
[System.Windows.Forms.SendKeys]::SendWait($page)
Start-Sleep -s 2
[System.Windows.Forms.SendKeys]::SendWait("{ENTER}")
Start-Sleep -s $ReadSecond

}

```

<hr>

参考にしたサイト
<a href="https://qiita.com/Qiita/items/e84f5aad7757afce82ba">Qiitaでシンタックスハイライト可能な言語一覧 - Qiita</a><br>
<a href="https://mitosuya.net/automation-input-keyboard">PowerShellでキーボード入力を自動化する方法 | 水戸スヤのSE備忘録</a><br>
<a href="https://hosopro.blogspot.com/2017/01/powershell-start-sleep.html">【PowerShell】指定した期間動作を一時停止する - ほそぼそプログラミング日記</a><br>
<a href="https://www.amazon.co.jp/gp/help/customer/display.html?nodeId=GPC7U392HH93VPC8">Kindle for PCのキーボードショートカット - Amazonカスタマーサービス</a><br>
docker上で動かしているjavaアプリが何か遅い気がするときに調べたことなど備忘録

docker上で動かしているjavaアプリが何か遅い気がするとき、以下のような事をすればOKと思っている

マシン負荷を調べる（df -h, disk i/o, memory）

> [マシン負荷を調べる（df -h, disk i/o, memory, CPU, SSD/HDDかどうか）](https://qiita.com/seigot/items/56a8807bc25023909061)

実行中のDocker Containerのメモリ使用量を docker stats コマンドを使って調べる

> https://docs.docker.com/engine/reference/commandline/stats/


javaアプリのヒープメモリが足りない場合は以下のように調べてみる

> [JVMのヒープメモリを確認する（jstat）](https://qiita.com/kaikusakari/items/9b7c3d1fb524eb6aa348)
> $ jps
> 1121 Jps
> 988  Bootstrap
> - 上のtomcat起動後、psコマンドでも出力された通り
> - PID988のJVM情報を取得します
> - -gccapacity オプションを付けてもいいかも [jstat](https://docs.oracle.com/javase/jp/8/docs/technotes/tools/windows/jstat.html)
> > gccapacity: 世代と対応する領域の容量に関する統計情報を表示します。
>
>$ jstat -gc 988
>```
> S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU  >  CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT   
>2560.0 2560.0 2540.0  0.0   32768.0  22237.8   44032.0    15113.8   16256.0 >15773.4 1920.0 1776.1      4    0.036   0      0.000    0.036
>```

利用可能なjavaオプションは以下のようにすると出力可能となる

```
$ java -XX:+PrintFlagsFinal --version
```

`ram`に着目したい場合は以下のように`grep`すると良い

```
$ java -XX:+PrintFlagsFinal --version | grep -Ei "ram"
```

メモリサイズを増やす場合は以下のようにすればOK

```
$ java -XX:+PrintFlagsFinal -XX:MaxHeapSize=12g -version 
```

原因によって対策が異なると思うが例えば上記のようにすると解決することもある

# 参考

https://qiita.com/kaikusakari/items/9b7c3d1fb524eb6aa348

https://qiita.com/guntamania/items/f2fb326e6b8b5b01d8a3

https://nopipi.hatenablog.com/entry/2017/11/11/213214

https://www.kimullaa.com/entry/2019/12/01/143242

https://i-beam.org/2019/08/15/jvm-heap-sizing/

https://qiita.com/niwasawa/items/a9d0a34183dad738e80b
php artisan migrate を実行しても、「Nothing to migrate. 」が返ってくる。

## 起きている事象
migrationフォルダがあるのに、migrateが成功しない。
```
php artisan migrate
```
上記のコマンドを実行しても「Nothing to migrate. 」が返ってくる。
![20220806-143102.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2659821/c1e28190-67cc-dd8c-87e0-e18e4ffb6b6d.png)
## 解決方法
以下のコマンドで対応。
※既にテーブル内にデータが入っている場合は、それらが消えてしまうため注意が必要!!
```
php artisan migrate:fresh
```
もしくは
```
php artisan migrate:refresh
```
成功すると、以下のような内容のログが出力される。
![20220806-143402.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2659821/006d0664-51ef-41fc-9930-3b209631bbdd.png)

## 参考
・https://teratail.com/questions/270041
Rubyバージョンに合わせて Gemfile.lock を切り替える

# 目次
1. Gemfile で Ruby バージョンごとに分岐させる
2. Ruby のバージョンごとの Gemfile.lock を準備する
3. .gitignore で Gemfile.lock を除外する

# 1. Gemfile で Ruby バージョンごとに分岐させる
Gemfile に下記のような形式で書く
各バージョンに合わせて `RUBY_VERSION == "3.0.2"` は書き換えてください
```
# coding: utf-8
source 'https://rubygems.org'

# バージョン判定
use_ruby3 = RUBY_VERSION == "3.0.2"
gemfile_path = "#{__dir__}/Gemfile.lock"

# バージョンに一致した Lock ファイルをコピーする
unless File.exist?(gemfile_path)
	if use_ruby3
		FileUtils.copy "#{__dir__}/Gemfile3.lock", gemfile_path
	else
		FileUtils.copy "#{__dir__}/Gemfile23.lock", gemfile_path
	end
end

# バージョンで分岐させるライブラリ
if use_ruby3
	gem 'activesupport', '<=6.1.4'
else
	gem 'activesupport', '<=4.2.4'
end

# 共通のライブラリ
gem 'rake'
```

# 2. Ruby のバージョンごとの Gemfile.lock を準備する
Ruby を切り替え bundle を実行し、それぞれの Gemfile.lock を作成する
↓ ファイルの配置イメージ。Gemfile3.lock は Ruby3.0.0、Gemfile23.lock は Ruby2.3.3 のようになっている
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153980/c2188f27-2880-ef71-4e3f-2267e4f931ab.png)

# 3. .gitignore で Gemfile.lock を除外する
.gitignore に Gemfile.lock を追加する
※ Gemfile に書いた処理によって、それぞれのPCの環境に沿った Gemfile.lock が作られるため
auを解約するとau IDが`<電話番号>`から`<電話番号>_<解約日>`に変更されて残る (解約日が2021/8/18より前の場合)

## 経緯
かなり前にauからNMPしたのだが、ここ最近au Payを新規登録したところ、暗証番号をど忘れてしまった。（記憶力がミジンコレベル）
そこで、auに問い合わせたところ、郵送で暗証番号を送って頂くことになった。
しかし、正しいとされる暗証番号を入力しても認証が通らなかった。
詰んだ。

## 原因
タイトルにある通り、古いau IDが残っているのが原因だ。
auに暗証番号を照会すると、古いau IDの暗証番号を送ってくる。

解約前
ID: `<電話番号>` 例: 080XXXXXXXX

解約後(NMP)
ID: `<電話番号>_<解約日>` 例: 080XXXXXXXX_20201201

au Payで新規登録
新ID: `<電話番号>` 例: 080XXXXXXXX
旧ID: `<電話番号>_<解約日>` 例: 080XXXXXXXX_20201201

この状態でauに問い合わせると旧IDの暗証番号を送ってくる。

問い合わせるときは自動音声ガイダンスに従って電話番号を入力しており、オペレーターに「入力された電話番号でよろしいでしょうか？」と聞かれるものの、ここで「はい」と答えると旧IDで照会されてしまうので、「アンダーバーついていないやつで！」とか「休止したやつじゃない方で！」とか言わないといけないのかもしれない。

結局のところ、暗証番号がメモってあったので何とかなった。（メモはだいじ）

下記のヘルプによると、この問題は2021/8/18以降の解約では起きないようだ。

## 公式の説明

https://id.auone.jp/id/pc/help/setting/13.html

> Q. au IDを携帯電話番号としている場合に解約・MNP・譲渡したらau IDはどうなるの？
> A. au IDに登録されている携帯電話番号をご解約されると、次のユーザがau IDとして登録されるまで今までご利用のau ID、パスワードでログインしていただけます。
IDがau/UQ mobile携帯電話番号と同じau IDをご利用の方で、解約・譲渡された場合
>
> au IDは、「au/UQ mobile電話番号＋＿（半角アンダーバー）＋解約年月日（西暦８ケタ）」となります。
>
> 例）2011年1月23日に解約した場合
> 解約前au ID)　080XXXXXXXX
> 解約後au ID)　080XXXXXXXX_20110123
>
> ※2021年8月18日以降にMNPされた場合、au IDに変更はありません。

## 公式の説明その２
https://www.au.com/support/faq/detail/47/a00000000447/

> Q. auからUQ mobile／povoに移行した場合や、他社乗り換え（MNP）、au契約回線を解約／譲渡／承継した場合、au IDは変わりますか？
>
> A. auからUQ mobile／povoに移行した方、2021年8月18日以降に他社へ乗り換え（MNP）した方、電話番号以外のau IDをご利用だった方、家族間譲渡の方はau IDに変更はありません。
その他のお客さまはお手続きの時期や内容によって変更となります。詳細は以下をご覧ください。
>
> ■他社へ乗り換え（MNP）
>
>    2021年8月18日以降に他社へ乗り換え（MNP）した方、または電話番号以外のau IDをご利用だった方は、au IDに変更はありません
> 
>    2021年8月17日以前に他社へ乗り換え（MNP）した方のau IDは、「au ID+_(半角アンダーバー)」＋「MNP転出の年月日（西暦8桁）」に変わります
> 
>    （例）2021年4月1日　MNP転出
>
>    　解約前au ID：080XXXXXXXX
>
>    　解約後au ID：080XXXXXXXX_20210401
ubuntu20.04LTSでpython2向けの`get-pip.py`を使用する

ubuntu20.04LTSでpython2向けの`get-pip.py`を使用する

以下のようにすればOK

```sh
curl https://bootstrap.pypa.io/pip/2.7/get-pip.py -o get-pip.py
python2 get-pip.py
pip install requests
```

`https://bootstrap.pypa.io/get-pip.py`を使うと以下のようなエラーがでるので注意

```
$ python2 get-pip.py 
ERROR: This script does not work on Python 2.7 The minimum supported Python version is 3.7. Please use https://bootstrap.pypa.io/pip/2.7/get-pip.py instead.
```

# 参考

python2 get-pip.py
マシン負荷を調べる（df -h, disk i/o, memory, CPU, SSD/HDDかどうか）


storage

```
$ df -h
```

disk i/o

```
sudo hdparm -t /dev/sda # /dev/sdaの部分は適宜更新
```

memory

```
$ free -hm
```

CPU

```
$ nproc # CPU数
$ cat /proc/cpuinfo # cpu詳細情報
$ top   # プロセスごと
```


> 「/sys/block/sdX/queue/rotational」を確認することで、対象のデバイスがディスクかどうか→HDDかSSDかを確認する事ができるようだ。 返り値が1の場合HDD、0の場合はSSDを使用している事になる

```
cat /sys/block/sdx/queue/rotational
1  # HDD
0  # SSD
```

# 参考

https://orebibou.com/ja/home/201707/20170729_001/
[Flutter]特定のウィジェットを非同期で処理する[StreamBuilder / FutureBuilder]

ウィジェットの値をDBやAPI等から取得する必要がある場合、一部だけ非同期に処理をする必要がある場合がある。

こういった場合、特定のウィジェットをFutureBuilderもしくはStreamBuilderで囲むことによって非同期処理が可能になる。

・StreamBuilder・・・データの変更をリアムタイムで検知し、自動的に再描画したい場合
・FutureBuilder・・・データの変更をリアルタイムで検知せず、自動的に再描画したくない場合

[FutureBuilder]
```
class HomeScreen extends StatelessWidget {
  final displayText =
      FirebaseFirestore.instance.collection('cities').doc('LA').get();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Memo Pad'),
      ),
      body: Center(
        child: FutureBuilder(
          future: displayText,
          builder: (BuildContext context, AsyncSnapshot<dynamic> snapshot) {
            return Text(
              snapshot.data['name'],
              style: const TextStyle(fontSize: 24),
            );
          },
        ),
      ),
    );
  }
}
 ```

[StreamBuilder]
```
class HomeScreen extends StatelessWidget {
  final displayText =
      FirebaseFirestore.instance.collection('cities').doc('LA').snapshots();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Memo Pad'),
      ),
      body: Center(
        child: StreamBuilder(
          stream: displayText,
          builder: (BuildContext context, AsyncSnapshot<dynamic> snapshot) {
            return Text(
              snapshot.data['name'],
              style: const TextStyle(fontSize: 24),
            );
          },
        ),
      ),
    );
  }
}
```
vimをインストールできないときの対処法

# 状況・課題
以下のコマンド

```
apt-get install vim
```

でvimがインストールできない！


また、エラーが
```
E: Unable to locate package vim
```
と出てしまう...。

# 解決策
アップデートしましょう！
```
apt update
apt-get install vim
```
これにより、私の場合は無事vimが使えるようになりました。

#### 読んでいただき、ありがとうございました。
40代プログラミング初心者：3万件のCSV操作「遅い」からpandasへ


<h2>CSVの3万件はエクセルで開くと死ぬ

python初心者おじさんがスクレイピングで3万件ぐらいデータをダウンロードしました

CSVは軽いからすぐ開くだろ

・・・・・
・・・・・・

<b>おっそ！！！　体感1分

ソート、置換、などするともうフリーズして動かない・・・

もう絶望しかない

<b>はっ！機械学習の勉強で2万件のデータ扱ったときpandas早かったぞ！

でもめんどくさいなぁ・・・ぶつぶつ・・・

もういっかいCSV開いてみよ・・・・

<b>おそ！！！　しかも回復でバグってだめじゃん

<h2>Pandasでやりたかったこと

特定条件の行を削除
データが入っていない部分の保管※欠損値というらしい
データを結合して新しいデータを作る

<b>5分程度で終わった！早い

<h2>pandasの学習役立った スッキリわかるpythonによる機械学習入門

スッキリわかるPythonによる機械学習入門


たくさんの機械学習の本を読んだけど、pandasの説明が一番丁寧に書いてあった

なんだよDataframeってっていうことから教えてくれるので丁寧。

機械学習は、基本的にデータをきれいに整える作業がメイン

だから、pandasで大量データをきれいになデータにしていく感じです。そのための知識が満載

より詳しい機械学習をやりたい人はもっとレベルの高い本を買った方がいい

基礎からきっちり、データをきれいにして、分析精度を上げていく作業を学習したい人向け

<b>巻末付録にはpandasの使い方付録もついていてめっちゃ便利

もちろん書籍の中でどのように使っているかページのインディックスもついているので具体例で調べられる

機械学習の勉強をメインじゃなくてもあると便利だと思う

<h2>python知らない初心者がいきなり使える？

この本はpythonの関数の知識が必要になるので、一通りのpythonの知識が合ったほうが読みやすい

同じシリーズで学習したいなと思うならこれ
スッキリわかるPython入門 (スッキリわかる入門シリーズ)


pandasの使い方と割り切ってしまえば、学習できなくもないけれど基本的な本は1冊やっておいたほうがいいと思う

python自動化系の本を1冊やれば十分
自分が買ったのはこれ

シゴトがはかどる Python自動処理の教科書


あとは毎日1問ぐらいpaizaのpython問題をコツコツやっていれば自然と身につく気がします
https://paiza.jp/works

<h2>そもそもDBにいれて作業しろってレベルになってきたかも

SQLもDBも基本的なことは学習したので、なんとか使えそうなんだけど、まだまだ敷居が高い感じがするので、CSVで作業しちゃっています。

この辺の学習も進めたいんだけど、成果物も作っていかないといけないなぁ～っと思っていろいろチャレンジしています

<b>エクセルで大量データを扱っている事務職にpandasをすすめたい
csvに変換していじれば時短になると思います
Trello API を使ってCardにLabelを追加する方法

## 概要

Trello API を使って既存のカードへ既存のラベルを追加する方法を説明する。

## 環境

Python3を使ってHTTPリクエストを行う。

## コード

```python
import requests

card_id: str = "cardのID"

payload: dict = {
    "value": "追加したいラベルのID",
    "key": "アプリケーションキー",
    "token": "アプリケーショントークン"
}

requests.post(f"https://api.trello.com/1/cards/{card_id}/idLabels", data=label_payload)

```

## 参考

[Add a Label to a Card](https://developer.atlassian.com/cloud/trello/rest/api-group-cards/#api-cards-id-idlabels-post)

![trello-api](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302006/0b787fa0-ef76-2495-175a-8e93c1e14004.png)
_ちゃんと、QUERY PARAMETERSとして書かれていたのに、見落としていて時間をかけてしまった。。。_
WSLでDocker使うときに気を付けたいこと４選

# はじめに
業務でがっつり WSL(Ubuntu)+Docker という形で開発したことなかったので、今後のために残しておこうというメモ。
※参考のリンク先を貼るだけに留めた記事です
※Docker Desktop ではなく、WSL上にコマンドで直接Docker入れた場合のお話です

# 更新
- `4.フォルダの所有者＆権限` を追加 (2023-12-29)
- `1.自動起動` における `systemctl` の記載を追記＆一部見直し (2024-02-17)
- 全体的に見直し (2024-03-20)


## 1.自動起動
過去には、色々と面倒でしたが、現状は、systemctlでenableすることが一番良さそうです。
ただし、過去に導入したWSLを使っていると、systemctlを使えなかったり、使用が面倒だったりするので、コマンドライン等で`wsl --update` を実行してsystemctlを使えるようにしましょう。

## 2.コンテナ同士のネットワーク接続
コンテナ同士はlocalhost接続できないので、composeで同時作成したり、ネットワークグループ指定で接続したりすることが必要。コンテナの管理が独立していて、後者の方法が必要なときは

https://qiita.com/naozo-se/items/1e293b37586762620e0a

を参考に。


他には、extra-hosts設定を使うと管理もラクなのでおすすめです。

https://qiita.com/naozo-se/items/75aff09a68ddf7b6ddce

## 3.ファイルの削除
WSL上で（もちろんWSL上に構築しているコンテナ上でも）ファイルを削除したときに、ホスト(Windows)が認識できない（ディスクの空き容量を認識しない）ような状態になり、仮想環境自体をdiskpartの機能で最適化する必要がある。大容量ファイルをコピーする処理で、削除して再実行したいというときは、以下のサイトのような対応が必要になってくるかと思います。

https://qiita.com/siruku6/items/c91a40d460095013540d

※`\\wsl$`の領域で対象ファイルを操作するときに考慮が必要なのかも
※`/mnt/c/...` とかでvolume展開している場合とかは問題ないかも

## 4.フォルダの所有者＆権限
ファイルの管理が面倒なので、Windowsの領域(`/mnt/c/...` とか)を使ってしまったりしますが、Windowsの領域はフォルダの所有者や権限の変更ができません。
コンテナのデフォルトユーザーが1000以外のものになっていたり（PostgreSQLやMySQLとか）、ファイルの権限を操作する必要があるものをバインドマウントする必要があるものとの相性が悪く、変な調整をしなければならない場合が出てきます。
ただ、WSLの領域を使用して、所有者を変更すると、vscodeで編集できないということも起きます。
この辺りは、なにか良い方法がないのか模索中ではあります…。

# さいごに
Windowsで開発するときはなんだかんだで、この組み合わせ便利です。
VSCodeのRemote Containerもまとめたい…
[Flutter]StreamBuilderとFutureBuilderの違いについて

大枠
・StreamBuilder・・・リアムタイムに更新する値を再描画なしで反映する
・FutureBuilder・・・一度のみ値を取得し、リアムタイムの変更を反映しない

[FutureBuilder]

```diff
class HomeScreen extends StatelessWidget {
  final Future<QuerySnapshot> _wordStream =
    FirebaseFirestore.instance.collection('cities').get();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Memo Pad'),
      ),
      body: FutureBuilder(
        future: _wordStream,
        builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot) {
          if (snapshot.hasData) {
            return ListView(
              children: snapshot.data!.docs.map((DocumentSnapshot document) {
                return ListTile(
                  title: Text(document['name']),
                );
              }).toList(),
            );
          } else {
            return Container(
              child: CircularProgressIndicator(),
            );
          }
        },
      ),
    );
```


[StreamBuilder]

```diff
class HomeScreen extends StatelessWidget {
  final Stream<QuerySnapshot> _wordStream =
     FirebaseFirestore.instance.collection('cities').snapshots();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Memo Pad'),
      ),
      body: StreamBuilder(
        stream: _wordStream,
        builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot) {
          if (snapshot.hasData) {
            return ListView(
              children: snapshot.data!.docs.map((DocumentSnapshot document) {
                return ListTile(
                  title: Text(document['name']),
                );
              }).toList(),
            );
          } else {
            return Container(
              child: CircularProgressIndicator(),
            );
          }
        },
      ),
    );
  }
}
```
Windows用アプリEmoCheckをMacで動かす

# 環境
iMac (Retina 5K, 27-inch, 2017)
macOS Big Sur
Homebrew 3.5.7

# What's EmoCheck?
マルウェア「Emotet（エモテット）」感染確認ツール。無償。
https://github.com/JPCERTCC/EmoCheck/releases

# 手順

Wineskinというソフトウェアを使うことで、Windows用アプリ(.exe)をMacで動かすことができる。

Wineskinについては以下のHPが参考になりました。

https://atmarkit.itmedia.co.jp/ait/articles/2206/06/news025.html

#### ① HomebrewでWineskinのインストール

```:ターミナル
brew install gcenx/wine/unofficial-wineskin
```
#### ② Wineskinの設定
1, Finderの「アプリケーション」から「Wineskin Winery.app」を開く
2, 画面中央部の「＋」ボタンをクリックし、Engine(WS11WineCX64Bit21.2.0)を選び、「Download and Install」
![スクリーンショット 2022-08-03 12.51.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1733765/69d4c1b6-40d0-ce83-abed-887149b49249.png)
3, Engineが導入できたらメイン画面に戻り、Wrapper Versionの「Update」を押し、本体をインストール
![スクリーンショット 2022-08-03 12.51.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1733765/685b7116-d09c-1d83-0cf8-8f1d16098676.png)
4, これでWineskinの準備は完了
![スクリーンショット 2022-08-03 12.53.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1733765/68318b54-c766-737e-ece9-1684edd27e0c.png)


#### ③ Emocheckをダウンロード
GithubからEmocheckをダウンロードする。
https://github.com/JPCERTCC/EmoCheck/releases/download/v2.3.2/emocheck_v2.3.2_x64.exe

#### ④ EmocheckのWrapperを作る＆起動
1, Wineskinのメイン画面の「Create New Blank Wrapper」をクリック
2, EmoCheck用のWrapperを作製→「OK」
![スクリーンショット 2022-08-03 12.55.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1733765/316ce6c2-14c5-5d9a-44b7-a558209d2a7e.png)

3, 言われた通りにWine Monoをインストール
![スクリーンショット 2022-08-03 12.56.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1733765/2d4e8f5a-2509-bd64-c8fa-46439ccce4d7.png)

4, 「Wrapper Crearion Finished」と表示されることを確認
![スクリーンショット 2022-08-03 12.57.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1733765/be4e42c6-e99d-0a21-f2c7-f41879598269.png)

5, 「アプリケーション」内のWineskinフォルダ中の「EmoCheck.app」をクリック
![スクリーンショット 2022-08-03 13.54.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1733765/0e3246f3-4efe-c778-4677-396eb63a1988.png)

6, 起動後、「Install Software」をクリック
![スクリーンショット 2022-08-03 13.00.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1733765/f0e0c1b5-cd06-ab0c-b8d9-925d85020e84.png)

7, 「Choose Setup Executable」をクリックし、ダウンロードした「emocheck_v2.3.2_x64.exe」を選択

8, EmoCheckが起動し、Emotetが検出されなければ以下の画面が表示される。
![スクリーンショット 2022-08-03 14.00.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1733765/0e348bb8-1487-2392-dc11-574dc9481d26.png)


以上です。


## 参考
https://yukimejiyoung.com/mac-windows-soft/
TOEICを730点から850点まで上げた勉強方法

# はじめに
中高時代英語は大嫌いでした。特に高校時代はなぜかオールイングリッシュで授業は展開され、全く理解することができず苦痛だったのを今でも覚えています。
大学入学時に初めて受けたTOEICも300点でした。そんな僕でも一応TOEICで855点を取るまでに成長しました。

今回はTOEICの点数を上げるという中でも730点から855点に点数を上げた時の勉強方法を書いていこうと思います。

# 勉強前と後の点数の比較
これが勉強前に受験した時の点数です。
この点数と同じような点数の方は、紹介する勉強方法で800点は超えられると思います。
![スクリーンショット 2022-08-06 12.56.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2644705/a290a852-fa37-46cd-c4f1-39788421a86e.png)

これが勉強後の点数です。
リスニングの点数がかなり伸びましたね。
![スクリーンショット 2022-08-06 12.57.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2644705/7781f3e7-51b8-6307-7fe6-e8c710bf08e6.png)

# 結論

### とにかくリスニングをやれ！

Readingに比べてListeningの点数はかなり伸ばしやすいと思っています。
だから、Readingをガッツリ勉強するというよりはListeningに力を入れていくといいと思います。

# 具体的な勉強方法
## ①まずは問題を解いてみる
まずは問題を解きましょう。
問題は公式の問題を使うといいと思います。
僕は以下の問題集を使っていました。

https://www.iibc-global.org/toeic/support/prep/lr_tr_01.html

https://www.iibc-global.org/toeic/support/prep/lr_ud_08/pr.html

## ②スクリプトを読んで意味を理解する
スクリプトを読んでどんな内容だったのかをしっかり理解します。
このときに何かわからない単語があれば調べます。

## ③スクリプトを見ながら音声と一緒に音読をする
内容をしっかり理解したら、読まれていた文章を実際に声に出して読みます。
CDの音声を流し、それと一緒に読みます。
初めのうちは全然うまく読めませんが、10回くたい繰り返して音読すると、かなりいい感じに読めるようになるはずです。

## ④シャドーイングをする←これ最強
これが最強にListening能力を伸ばしてくれます。
先ほどはスクリプトを見ながら音読していましたが、ここからはスクリプトは使いません。
CDの音声を聴きながら、後を追いかけるように自分も読みます。
これも初めはかなり難しいです。何回も繰り返します。
繰り返しているうちにかなり、CDの音声についていく形で読めるようになると思います。

## ⑤最後に問題をもう一度解く
ここまでこれば、問題で何を言っているのか100％理解できていると思います。
あとは、これを他の問題でもひたすら繰り返していく。
これだけです。これで飛躍的にリスニングの点数が伸びます。

# 問題を解く時のマークのコツ
Part3、4は１問につき3つの質問があります。内容が読まれている時に、１つ目の質問の答えがわかってマークしていたらその間に次の質問の内容を聞き逃した！みたいなことが僕は結構ありました。その問題はちょっとしたコツで回避できます。

僕がやっていたのは、**左手(左利きの人は右手)の薬指で１つ目の答え、中指で２つ目の答え、人差し指で３つ目の答えを指しておくという方法**です。

内容が読まれている時にマークはせず、指で答えの選択肢を示しておくだけにしておくことで、聞き逃しはかなり減ると思います。

2回目が読まれている間にマークをして、次の問題の選択肢を読んでおきます。

# 855点をとって変わったこと
正直何か物凄く変わったということは無かったように思います。
洋画が字幕なしで見れるかというと全然内容は理解できません。
公式のドキュメントをスラスラ読めるかというとそんな感じもありません。

ただ、英語に対する苦手意識はかなりなくなりました。
加えて少しばかり自己肯定感が上がりました。

# おわりに
TOEIC900点とりたいなー。と思いつつ最近は全く英語を勉強できていません。いつか。いつか。と思って終わってしまいそうですね。