OmniAICreator/Qiita-1.07M huggingface dataset:
ubuntu関連

ubuntu関連

##日本語設定
>https://www.atmarkit.co.jp/ait/articles/1806/28/news043.html

``^``はキャレットと言うらしい
[半角] [直接入力モード]でキーボードの右上の「へ」を押す

ubuntuでの``^X``は``ctrl``と``x``を同時押しという事らしい

git commitは
``` git commit -m '~~~~'```
が良さげ


### ホームディレクトリへの戻り方
``cd``

### 一個上の階層への戻り方
`` cd - ``

ペーストは右クリック(すでにペーストしたものをコピーしてる状態)

nodeを最新版にしたく

```sh
$ sudo apt update
$ sudo apt install nodejs
```
を実行したが変化なかった

だから

```sh
$ sudo apt purge -y nodejs npm
```
したら``そのようなファイルはない``を返ってきた、、、

記事を見たら再起動したらいいと書いてあり、それに従い一度閉じてもう一度バージョン確認をしたら正しく表示された


apiを使用しようと

```
$ npm install -g json-server
```
を実行したら

```sh
npm WARN checkPermissions Missing write access to /usr/local/lib/node_modules
npm ERR! code EACCES
npm ERR! syscall access
npm ERR! path /usr/local/lib/node_modules
npm ERR! errno -13
npm ERR! Error: EACCES: permission denied, access '/usr/local/lib/node_modules'
npm ERR!  { [Error: EACCES: permission denied, access '/usr/local/lib/node_modules']
npm ERR!   stack:
npm ERR!    'Error: EACCES: permission denied, access \'/usr/local/lib/node_modules\'',
npm ERR!   errno: -13,
npm ERR!   code: 'EACCES',
npm ERR!   syscall: 'access',
npm ERR!   path: '/usr/local/lib/node_modules' }
npm ERR!
npm ERR! The operation was rejected by your operating system.
npm ERR! It is likely you do not have the permissions to access this file as the current user
npm ERR!
npm ERR! If you believe this might be a permissions issue, please double-check the
npm ERR! permissions of the file and its containing directories, or try running
npm ERR! the command again as root/Administrator.

npm ERR! A complete log of this run can be found in:
npm ERR!     /home/~~~~/.npm/_logs/2021-02-12T01_39_28_425Z-debug.log
```
と返ってきた

調べた結果以下を実行したら解決された。($以外をこのままコピペでおk)
権限がなかったらしいです

```sh
$ sudo chown -R $(whoami) $(npm config get prefix)/{lib/node_modules,bin,share}
```

>参考　https://qiita.com/okohs/items/ced3c3de30af1035242d

これでインストール出来た。

立ち上げようとしたら

```sh
* Could not resolve host: GET
* Closing connection 0
curl: (6) Could not resolve host: GET
*   Trying 127.0.0.1:3000...
* TCP_NODELAY set
* connect to 127.0.0.1 port 3000 failed: 接続を拒否されました
* Failed to connect to localhost port 3000: 接続を拒否されました
* Closing connection 1
curl: (7) Failed to connect to localhost port 3000: 接続を拒否されました
```
と出た

> https://ja.ojit.com/so/php/1813676
この記事によって立ち上がっていないことが原因だとわかったがわからない、、、

>https://teratail.com/questions/169724
似た感じの記事などたくさん読んだがわからなかった

結果ubuntuを2つ立ち上げ片方で

```sh
json-server --watch db.json
```
を実行し、もう片方で

```sh
curl -X GET "http://localhost:3000/episodes" -v
```
を実行した結果出来た。
[デイリーコーディング]複数の文字列を連結/ソート/重複削除して返す

# 今日の問題: 複数の文字列を連結/ソート/重複削除して返せ
```c#:回答
using System;
using System.Linq;
using static System.Console;

namespace demo
{
    class Program
    {
        static void Main(string[] args)
        {
            WriteLine(Longest("aretheyhere", "yestheyarehere")); // "aehrsty"
        }

        public static string Longest(string s1, string s2)
        {
            string str = s1 + s2; // 連結
            char[] uniq_str = str.ToCharArray().Distinct().ToArray(); // 配列に変換して重複削除
            Array.Sort(uniq_str); // ソート
            string result = String.Join("", uniq_str); // 文字列に再変換

            return result;
        }
    }
}
```

```C#:結果
aehrsty
```

ベターな回答:

```C#:回答
public static string Longest(string s1, string s2)
        {
            return new string((s1 + s2).Distinct().OrderBy(x => x).ToArray());
        }
```

参照: Two to One \([Codewars](https://www.codewars.com/)\)
「.Net Core」+「.Net Standard」で作成したアプリをLinuxで実行させるための手順

## 0. はじめに
.Netの「System.Diagnostics.Process.Start」メソッドがLinux環境で動作するか検証する機会がありましたので、少し抽象化してこのような記事を書くことにしました。
まぁぶっちゃけ [**Microsoft公式ドキュメント**](https://docs.microsoft.com/ja-jp/dotnet/core/compatibility/unsupported-apis) には、一部のオーバーロードを除いて実行できるみたいに書かれているのですが、実際に動かして確認してみたいと思ったわけです。

## 1. 環境
- Windows 10
  - Linux (Ubuntu)
  - WSL2
- Visual Studio 2019 (Community)
  - C#
  - .Net Core 3.1
  - .Net Standard 2.0

## 2. 動作確認用のアプリを実装する
「Process.Start」メソッドを使用して、SVNのログを出力するだけの簡単なアプリを実装しました。
分担は以下のようになっています。

|名前|種類|なんだこれは|
|:-:|:-:|:-:|
|SvnLib|.Net Standard|SVNのログを出力するライブラリ|
|SvnTest|.Net Core|↑を実行するコンソールアプリ|

実装はGitHubにアップしました。

- https://github.com/i-tanaka730/SvnLib

## 3. Linux用にアプリを発行する
Windowsで動かす分には普通にビルドしてexeを発行すればいいのですが、Linuxで動かすにはLinux用のアプリを発行します。
Visual Studioを使用し、以下の手順で行います。

①対象プロジェクトのコンテキストメニューにて、「発行」を選択します。
![スクリーンショット 2021-02-09 224612.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247638/945a6198-3b65-e143-c3e8-f108daaeecd9.png)

②ターゲットタブにて「フォルダー」を選択し、「次へ」を押下します。
![スクリーンショット 2021-02-09 224745.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247638/62763ce6-557f-ab43-2f57-f214699b0803.png)

③特定のターゲットタブにて「フォルダー」を選択し、「次へ」を押下します。
![スクリーンショット 2021-02-09 230603.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247638/348cbc3d-ee83-75d0-c764-5ea89e1c17cf.png)

④「参照」にてアプリの発行先を選択し、「完了」を押下します。
![スクリーンショット 2021-02-09 224838.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247638/b4576ef5-4808-27aa-804f-db6af58951ed.png)

⑤「構成」又は「ターゲットラインタイム」の鉛筆(？)を押下します。
![スクリーンショット 2021-02-09 225339.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247638/e9330402-396e-fe8b-c2fa-9d241ed0b65e.png)

⑥各プロファイル情報を入力し、「保存」を押下します。
![スクリーンショット 2021-02-09 225511.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247638/8bae4965-1183-24e2-116a-75fea31cab58.png)

⑦「発行」を押下します。
![スクリーンショット 2021-02-09 225601.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247638/250a6c07-c22e-6ead-37c0-b5276d34805f.png)

⑧指定したフォルダに発行されます。赤丸がLinuxアプリファイルになります。
![スクリーンショット 2021-02-11 215451.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247638/067457cc-e258-52ee-12af-9a6ce81c1740.png)

## 4. Windows 10でLinuxを使うための環境構築
今回はWindowsでWSL2使ってLinuxを動かすので、そのための環境構築を行います。
私は以前Dockerを使用した際に環境構築していたので今回は不要でした。
当時は以下のサイトを参考にさせて頂きました。

- [**Windows 10でLinuxを使う(WSL2)**](https://qiita.com/whim0321/items/ed76b490daaec152dc69)

## 5. Linux上で実行してみる
今回の場合はLinuxにsubversionを入れる必要がありましたので、↓を実行します。

```
sudo apt install subversion
```

環境が整ったところでアプリを実行させてみます。

```
cd /mnt/c/xxxxxx/SvnTest-Linux
./SvnTest "log --xml -v file:///mnt/c/xxxxxx -l 5" "svn"

----
5 : zzz変更
4 : zzz追加
3 : yyy削除
2 : xxx変更
1 : xxx新規追加
----
```

OK！

## 6. おわりに
次使う機会あるかな？と思ったことでも、抽象化してアウトプットしておくことが大事だと感じました！！

## 7. 参考
- [**Re: C#でsubversion**](https://matarillo.hatenadiary.jp/entry/20100301/p1)
- [**Windows 10でLinuxを使う(WSL2)**](https://qiita.com/whim0321/items/ed76b490daaec152dc69)
- [**Windowsで開発したアプリをLinuxで実行する**](https://7iro.net/csharp-dotnetcore-linux/)
Date型で日本標準時間を出力する方法

`「Swift Date 日本標準時」`で検索してもString型で出力する方法しか見つからず、Date型で出力する方法が見当たらなかったため、備忘録として書きました。

# プログラム
```ruby:
Date(timeIntervalSinceNow: 60 * 60 * 9)  // 実行時の時刻を取得
```

# 解説
## DateはUNIX Time(UTC時間)を取得
Date型は、UNIX時間（UTC時間）を取得します。

>  Unix timeとは、コンピュータ上での時刻の表現形式の一つです。 Unix Epoch Time（ユニックス・エポック・タイム）などともいいます。 UTCの1970年1月1日0時0分0秒からの経過秒数のことです。なお、日本時間はUTC時間+9時間なので、Unix timeが0のときは、日本時間は、1970年1月1日9時0分0秒となります。
>>引用元:[Konisimple Tools Unixtime相互変換ツール](https://tool.konisimple.net/date/unixtime)

```
// "2021/2/10/18:28"に実行
print(Date())  // 2021-02-10 09:28:00 +0000
```

確認のため、実行しましたが日本時間とUNIX時間で9時間の時差がありました。

## timeIntervalSinceNow インスタンスプロパティを活用
```ruby:
Date(timeIntervalSinceNow: TimeInterval)
```

`32,400秒（9時間）後`を指定することによって、日本標準時との時差を考慮(現在時刻とTimeIntervalで新しく作成)した日時を取得することができます。

※TimeIntervalは、Double型で秒数を指定

# 最後に
今回は、UNIX時間と日本時間の時差を考慮し、日本時間を取得しました。この方法より良い方法、もしくは内容に間違いがございましたらコメントでご指導してくださると幸いです。

# 参考文献
- https://qiita.com/tatetate55/items/dd194736a37c1ec4fe63
- https://developer.apple.com/documentation/foundation/date
- https://developer.apple.com/documentation/foundation/nsdate
- https://developer.apple.com/documentation/foundation/date/1780053-init
Storybook 6.1 において、コンポーネントの絶対パスによるインポートの設定（WebpackFinalによるAliasの設定）

##概要

Storybookは日本語のドキュメントが少なく、しかし、AtomicDesignで開発を進める上では重要度の高いものであります。
しかし、Storyファイルからコンポーネントを呼び出す際にいちいち相対パスを指定していては面倒で堪りません。
設定ファイルを変更することで、絶対パスを使用したエイリアス（Alias）での呼び出しが可能になります。

また、Storybookはプロジェクトからはある意味独立した構成となっています。
そのため、既存のバンドラーの設定ファイルとは別に設定を行わなければいけません。

## 環境
Node.js --v14.15.4
Vue/cli --v4.5.4
Storybook --v6.1.17


## 方法

(プロジェクト)／.storybook ／main.js　を以下のように編集する

module.exports内に以下を追加

```js
webpackFinal: async (config) => {
    config.resolve.alias = {
    	...config.resolve.alias,
    	"@atoms": path.resolve(__dirname, "../resources/js/components/Atoms"),
        "@molecules": path.resolve(__dirname, "../resources/js/components/Molecules"),
	};
```

## (( ﾟДﾟ)

Webpackをフルコントロールモードで使用する方法（.Storybook下にwebpack.config.jsを作成するもの）、既存のWebpack、Laravel.mixの設定を参照しStorybookに流用する方法もあります。
今回は、Storybookの設定を変更しエイリアスを設定する方法を紹介しました。
テックキャンプで学んだこと

# テックキャンプで学んだプログラミング

- Progate
  <br>HTML/CSSをやって簡単なWebページ
- Ruby on Rails
- MVCの流れ、ルーティング
- M(モデル)：バリデーション、アソシエーション
 (ex belongs_to :モデル名、has_many(またはhas_one) :モデル名)
- V(ビュー),C(コントローラー)
 (ex アクション(index,new,create,edit,show,update,destroy,search)
Laravel Tenancyでテナントに割り与えられたデータベースが表示されない

## 問題
Laravelのマルチテナント環境を構築するため[hyn/multi-tenant](https://tenancy.dev/)パッケージを使用しテナントを作成したのですが、**テナントに割り与えられたデータベースが表示されません**でした。

■実施した手順
1. Dockerで環境構築
2. [各種設定](https://reffect.co.jp/laravel/laravel-tenancy-multi-tenants#i-2)（パッケージのインストール、データベース等）
3. [テナントの作成](https://reffect.co.jp/laravel/laravel-tenancy-multi-tenants#i-7)
4. [TablePlus](https://tableplus.com/)でデータベースの確認

4.の部分でテナントに割り与えられたデータベースが表示されればOKです。ただし、tenancyデータベースの「websitesテーブル」「hostnamesテーブル」それぞれに新たにレコードが作られていますが、**割り与えられたデータベースが表示されていません。**

![スクリーンショット 2021-02-12 9.18.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264073/7318daf8-1ab1-c7db-2a1a-1a9dd2244b02.png)
![スクリーンショット 2021-02-12 9.18.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264073/7c735583-42dc-4e01-27b4-314fc00d885c.png)
![スクリーンショット 2021-02-12 9.26.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264073/6b84e9e7-9705-1f6f-c29c-b8ca1a852c7e.png)

## 結論

**TablePlusの接続設定の「ユーザ名」「パスワード」をrootに変更**したら表示されました！

結論に至った経緯としては、Dockderのデータベースコンテナ内に入り、データベース一覧を確認しました。すると、**データベースが表示されています。**

![スクリーンショット 2021-02-12 9.15.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264073/3f9a9756-a526-cd2d-4ed1-3daf0b5afae4.png)

しかし、**TablePlusでは表示されていません。**

![スクリーンショット 2021-02-12 9.26.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264073/6b84e9e7-9705-1f6f-c29c-b8ca1a852c7e.png)

そこで、**TablePlusの接続設定の「ユーザ名」「パスワード」をtenancyからrootに変更**したら表示されました。

![スクリーンショット 2021-02-12 9.37.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264073/98028c2b-a651-73c1-18c9-90a78f39d5d5.png)
![スクリーンショット 2021-02-12 9.38.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264073/5ab70f91-2df3-4a60-06a2-ba55d49bd352.png)
![スクリーンショット 2021-02-12 9.38.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264073/fc8aa690-f95a-7a2e-e228-e5e3ca8ad2e6.png)

## 参考
- [https://reffect.co.jp/laravel/laravel-tenancy-multi-tenants](https://reffect.co.jp/laravel/laravel-tenancy-multi-tenants)
- [https://tenancy.dev/](https://tenancy.dev/)
GitHub よく起こる困ったときの対処法

#はじめに
GitHubを使用していると、よく起こる困ったことを解消するために、まとめておこうと思います。
下記記述以外にも、気づいた時に追記していく予定です。

#よくある困ったときの対処法
#####ブランチを切り忘れ、マスターブランチ上で、コードを記述してしまったとき
1.ブランチを作成する
　※今回は、ゲストユーザー機能というブランチ名で作成しています

コードの編集履歴が存在する状態で、ブランチを作成すると下記のPopupが表示されます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/974720/7ad15b9c-1cfa-0b47-9b30-77fea499ccbd.png" width=50%>
2.Bring my changes to 「ブランチ名」を選択し、「Switch Branch」をクリックする。
　※「Leave my changes on master」を選択した場合、元のブランチ(今回はmaster)でコードを保留にして、作成したブランチで0からコードを記述することができます。

#####commitをし忘れて続けて別ファイル、別の箇所のコードを記述してしまったとき
1.下記矢印先のチェックボックスをcommitするファイルのみを選択してcommitする（チェックボックスを外すと、commitの対象から外れます）
![スクリーンショット 2021-02-11 20.15.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/974720/3f43ec0b-30a8-f8a7-3242-ba1d91a96eb1.png)

2.通常通りcommitして完了

#####チーム開発時などに別の人と同じファイルの編集を行い、マージできないとき
######コンフリクト
コンフリクトとは、あるファイルにおいてブランチ毎に辻褄が合わなくなってしまっている現象のこと
例えば、Aさんがアーティスト一覧画面の作成を行う際に、ブランチを切ってコントローラーに「index」の内容記述を行い、Bさんがアーティスト作成画面の作成を行う際に、ブランチを切ってコントローラーに「new」内容記述を行うと、Aさんのブランチには「new」がなく、Bさんのブランチには「index」がない状態が発生してしまう。このような現象をコンフリクトと言います。
このような状態である場合の時、先にAさんがマージを行うと、Bさんがマージできなくなってしまいます。

######コンフリクト解消方法
通常通りマージを行おうとすると下記のような画面が表示されます
![スクリーンショット 2021-02-12 1.08.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/974720/34105055-b5b1-1794-5987-df16c1de352c.png)

1.上記画面内矢印先の「Resolve conflicts」をクリック
下記画面が表示されます。①はコンフリクトが発生しているファイルを表示、②は実際にコンフリクトが発生している箇所(ブランチ毎に差異がある部分)が表示されます。
![スクリーンショット 2021-02-12 1.10.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/974720/f5402929-3403-09bf-7252-db658b376fb9.png)
2.②の内容編集を行う(通常通り編集できるのであるべき記述に直しましょう！)

※ <<<<<<<<<<コンフリクトA(ブランチ名) ←記述変更とともにこの部分は削除
  コンフリクトAの記述内容が表示される
  ==========
  masterの記述内容が表示される
/※ >>>>>>>>>>master　←記述変更とともにこの部分は削除

3.③の「Mark as resolved」をクリック
![スクリーンショット 2021-02-12 9.24.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/974720/72fe0604-2ea4-8e32-f290-85fb14bc3132.png)

4.上記矢印先の「Commit marge」をクリック
5.通常通りマージを行い完了！

# さいごに
GitHubでは、コード管理を行っているので、いつもと違う！？となっても慌てず、一つずつ対処していきましょう！
大事なコードが消えてしまった:fearful:なんて悲しいことが起こらぬよう注意しましょう！！←(自分への言い聞かせ)
品質勉強会-第１回：品質って何？

[QCDSはトレードオフの関係ではない - メンバー全員に目的意識を植え付ける。](https://qiita.com/shohei-y/items/ea97cec132f1e7ea1552#%E3%83%A1%E3%83%B3%E3%83%90%E3%83%BC%E5%85%A8%E5%93%A1%E3%81%AB%E7%9B%AE%E7%9A%84%E6%84%8F%E8%AD%98%E3%82%92%E6%A4%8D%E3%81%88%E4%BB%98%E3%81%91%E3%82%8B)
で記載していた、目的意識の他に、品質意識も重要なので、品質勉強会を行っていきます。

---

# 品質勉強会の目的

何かを提供するサービス業務で重要な、「Q品質・Cコスト・D納期」の１つである「Q品質」を考える。
そして意識改善を行うことが目的です。

---

# 現在地の確認

「Q品質・Cコスト・D納期」を評価するとしたら、何で評価しますか？
「Q品質・Cコスト・D納期」に問題がないことを証明するとしたら、どうやって証明しますか？

---

# 想定される回答

---

## Q品質
 * リクエストされた機能を作って、その通り動くものができたから問題ない
 * 〇〇さんが、作った・考えたから問題ない
 * 〇〇さんのテスト結果がOKだったので問題ない
 * 不具合が起きていないので問題ない

---

## Cコスト
  * 納期通りできたので問題ない
  * 残業していないから問題ない
  * 追加発注していないから問題ない

---

## D納期
 * 当初予定したスケジュール通り作成できたので問題ない
 * スケジュールを延伸したが、２回目の再計画がなかったので問題ない

---

# あなたが、今考えた説明で、証明できているでしょうか？

---

## Q品質
 * リクエストされた機能を作って、その通り動くものができたから問題ない
     *  リクエストされた機能に**考慮漏れ**があったら？
     * その通り動くというないように、**異常系**は含まれていますか？
     * **設計**している過程で問題があっても検知できますか？
 * 〇〇さんが、作った・考えたから問題ない
     * 〇〇さんの考え、作業に問題があったら？
 * 〇〇さんのテスト結果がOKだったので問題ない
     * 〇〇さんのテストに漏れや問題があったら？
 * 不具合が起きていないので問題ない
     * **明日**、不具合が起きない証明はできますか？

---

## Cコスト
  * 納期通りできたので問題ない
      * 残業はしていませんか？
      * 他の案件、開発も納期通りですか？
      * コスト予定と実績で評価していますか？
  * 残業していないから問題ない
      * 残業はしていませんか？
      * 他の案件、開発も納期通りですか？
      * コスト予定と実績で評価していますか？
  * 追加発注していないから問題ない
      * 発注先でカバーしていることはありませんか？

---

## D納期
 * 当初予定したスケジュール通り作成できたので問題ない
     * 当初予定のスケジュールの評価はできていますか？
     * たまたま予定通りだった可能性はありますか？
 * スケジュールを延伸したが、２回目の再計画がなかったので問題ない
     * 延伸した時に、原因分析しましたか？

---

# 「品質・コスト・納期」とは

サービス提供をするプロバイダとして、いずれも欠けてはならないものです。
もし、確認した現在地で証明できなかった項目があれば、現在かけている可能性が高いです。

---

# 品質って何？

品質を蔑ろにすると、問題が発生し、「コスト・納期」さらには、サービスのレベルに直撃する項目です。
この品質を、予め定めたレベルまで確保することが、品質保証になります。

品質は、仕事をしていく上で**常に意識**していく必要があるということです。

---

# 問題が起きる原因

**無作為**による問題がほとんどです。
「想定していなかった、見落としていた、要求通りにやったら要求がまずかった　　・・・」
これは、サービスを受ける立場で考えるとどうでしょう？
「プロなのに・・・ガッカリ、別のものに切り替えよう」

**無作為**  ・・・作為を加えないこと。任意であること。

問題を起こさない方法は、１つです。
**作為**的に進めることしかありません。
作戦を立てて、その作戦でいいか常に考えながら進めていくことが唯一の方法です。

---

# この勉強会では

品質を確保していくための手段や、評価方法などを学んでいきます。
rootfsとbootfsについて

## 勉強前イメージ

fsだからファイルシステム？

## 調査

### rootfs とは

linuxでよく使われるext4などには抽象化概念として仮想ファイルシステム( `vfs` ) があり、その配下に置かれる特殊ファイルシステムの1つ。
ルートディレクトリ(/)にそのものに対する概念が `rootfs` で、
マウントされる実デバイスが `ルートファイルシステム` であり、rootfs と ルートファイルシステムは 別物であります。
`/etc、/proc, /bin`などが含まれたrootfsイメージがマウントされます。

### bootfs とは

ブートローダとカーネルが格納されており、ブートが終わるとアンマウントされます。
GRUBとかbootfsに格納されてる？

### 順番

まず、bootfsに格納されているブートローダなどブートプロセスが終わると、
rootfsに含まれるrootfsイメージがマウントされ、プロセスID=1が起動されます。
なので、`bootfs → rootfs` の順になります。

## 勉強後イメージ

ブートローダがbootfsに格納されてるとなると
OSとか起動する前に、bootfsが読み出され→ブートローダをメモリに展開→rootfsが読み出される？？？
一部分一部分しか知らないからまだブートされてからの流れがあまり理解できてない....
難しい....

## 参考

- [WSL2 Ubuntu の手動インストール](http://www.y2sunlight.com/ground/doku.php?id=wsl2:ubuntu)
- [Linuxがブートするまで](https://keichi.dev/post/linux-boot/)
「JavaScript で小学生の通過算を解いてみた！」を参考にWolframAlphaとSymPy LiveとPyCharmでやってみた。


(オリジナルポスト)
https://qiita.com/oyasumipants/items/56199b5a27478422d884

①通過算は、以下でいいですか?javascriptは理解していません。通過算をwikipediaで勉強中。
②通過算のおすすめのタグを教えて下さい。wikipediaのカテゴリーは、「数学に関する記事」でした。

ちょうどsympyを使ってみたかったので、そちらで解いてみました！
単位は、mと秒です。
すれ違い始めの位置がx=0,
t秒後のすれ違い終わりの位置が同じ。
t秒後の車両最後尾の位置の座標計算でやってみました。

##WolframAlphaで

####入力:
-20*10+72*1000/60/60*t=20*8-90*1000/60/60*t

https://www.wolframalpha.com/input/?i=-20*10%2B72*1000%2F60%2F60*t%3D20*8-90*1000%2F60%2F60*t&lang=ja

####結果
t = 8
####入力:
-20*10+72*1000/60/60*t,20*8-90*1000/60/60*t,t=8

https://www.wolframalpha.com/input/?i=-20*10%2B72*1000%2F60%2F60*t%2C20*8-90*1000%2F60%2F60*t%2Ct%3D8&lang=ja
####代入した結果:
20 (t - 10) = -40, 160 - 25 t = -40

##SymPy Liveで
https://live.sympy.org/
〉〉〉の横に貼り付けて、改行です。
####入力
solve(-20*10+72*1000/60/60*t-(20*8-90*1000/60/60*t))
又は
print(solve(-20*10+72*1000/60/60*t-(20*8-90*1000/60/60*t)))
####結果
[8]
####入力
print((-20*10+72*1000/60/60*t).subs([(t, 8)]))
####結果
-40
## PyCharmで
```python
from sympy import *
var('t')
print(solve(-20*10+72*1000/60/60*t-(20*8-90*1000/60/60*t)))
#[8.00000000000000]
```
## PyCharmで値を後から代入
```python
from sympy import *
var('t Ln Nn Vn Lk Nk Vk')
fn =-Ln*Nn+Vn*1000/60/60*t
fk = Lk*Nk-Vk*1000/60/60*t
ans = solve(Eq(fn, fk), t)
print(ans)
tt=ans[0].subs([(Ln, 20), (Nn, 10), (Vn, 72),(Lk, 20), (Nk, 8), (Vk, 90)])
print("すれ違う時間=",tt,"秒")
xx=fn.subs([(Ln, 20), (Nn, 10), (Vn, 72),(Lk, 20), (Nk, 8), (Vk, 90),(t, tt)])
print("すれ違いの終わる場所=",xx,"m")
# [18*(Lk*Nk + Ln*Nn)/(5*(Vk + Vn))]
# すれ違う時間= 8 秒
# すれ違いの終わる場所= -40 m
```
(参考)通過の場合＜通過算＜wikipedia
通過の時間＝橋やトンネルと列車の長さの和/速さ
ドメイン移管申請備忘録(ネットオウル → Google Domains)

## はじめに
[ネットオウル](https://www.netowl.jp/)で管理しているドメインと、Goole Domainsで管理しているドメインがあったため、Google Domainsに集約する。

## ネットオウル/スタードメイン

### 解約
ネットオウルのスタードメインではレジストラロックだけ解除することはできなかった。
契約を解除するとレジストラロックがOFFになる。

### WHOIS情報書き換え
認証キーはWHOISの`Emailaddress`に届くので受信可能なメールアドレスに変更しておく。

### 認証キーの発行
ボタンをクリックすると上記の`Emailaddress`に認証キーが届く。

## Google Domains

### 認証コードを入力
移管したいドメインを指定すると、認証コードの入力を要求される。
上記で入手した認証キーを入力する。

### DNS設定をインポート
現在のDNS設定情報をもとに新規の情報を作成してくれる。
編集もできる。

### 支払い
Googleへの支払いを済ませる。

## 承認
３日ほどでWHOISのEmailaddress宛にメールが届く。
移管を拒否する場合にリンク先に遷移して対応する。承認する場合は何もしない。

## 移管の確認

放置して３日ほどでGoogle Domainsから移管が完了したというメールが届く。
macOS + Docker + Node.js で bcryptが使えない。

## 経緯
UdemyでNest.jsの講義中にパスワードをハッシュ化させようと`bcrypt`をインストールしたらNest.jsが下記のようなエラーを吐き出した。
エラー解法の日本語版がなかったので、作成。

## 各ミドルウェア
- Docker-Engine: 20.10.2
- node:15.4(元イメージ)
- macOS Catalina 10.15.7(ストレージが足りなくてアップデートできない...)

## エラー内容
```console
node:internal/modules/cjs/loader:1167
return process.dlopen(module, path.toNamespacedPath(filename));
^

Error: /app/node_modules/bcrypt/lib/binding/napi-v3/bcrypt_lib.node: invalid ELF header
at Object.Module._extensions..node (node:internal/modules/cjs/loader:1167:18)
at Module.load (node:internal/modules/cjs/loader:973:32)
at Function.Module._load (node:internal/modules/cjs/loader:813:14)
at Module.require (node:internal/modules/cjs/loader:997:19)
at require (node:internal/modules/cjs/helpers:92:18)
at Object.<anonymous> (/app/node_modules/bcrypt/bcrypt.js:6:16)
at Module._compile (node:internal/modules/cjs/loader:1108:14)
at Object.Module._extensions..js (node:internal/modules/cjs/loader:1137:10)
at Module.load (node:internal/modules/cjs/loader:973:32)
at Function.Module._load (node:internal/modules/cjs/loader:813:14) {
code: 'ERR_DLOPEN_FAILED'

```

## 解決法
参考サイトから、macOS上でインストールしたbcryptはLinuxで動かないことがわかった。

解決法は2通り
1. コンテナ上からbcryptライブラリをインストール
2. bcryptjsライブラリをインストール

## 補足
- bcryptjs・・・JSで作られていてbcryptと互換性が有るライブラリ。OSへの依存性はない。
- 特に意識したことがなかったけどbcryptはC++のものをバインディングしているらしい。
- tsで使う場合は、`@type/bcryptjs`も必要


## 参考
1. https://stackoverflow.com/questions/15809611/bcrypt-invalid-elf-header-when-running-node-app
2. https://www.npmjs.com/package/bcryptjs
Users must exist エラーの解決例

Users must exist
上記エラーは、ユーザーが存在していない。
また、正しくこの投稿にユーザーが紐づいていないという内容です。

posts_controller.rbのストロングパラメータで
ユーザーとの紐付けを明示している箇所があります。

```posts_controller.rb
def post_params
 params.require(:post).permit(:title,:content).merge(user_id:current_user.id)
```
上記ファイルは正しく表記されているのでDBに保存する前に
問題が生じている可能性があります。したがってMVCに沿ってモデルを確認します。

models/post.rbの記述を確認するとbe longs_to :usersと記述されています。

be longs_toは、「あるデータにある一つのデータが紐づく」という意味です。
したがってusersをuserの単数形に修正します。
Spring Boot起動時に「Web server failed to start. Port 8080 was already in use.」が発生した。

#発生したエラー

Eclipseでspring boot起動時に、コンソールに以下のようなエラーが発生しました。

```
Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
2020-11-29 14:09:08.095 ERROR 41363 --- [  restartedMain] o.s.b.d.LoggingFailureAnalysisReporter   : 

***************************
APPLICATION FAILED TO START
***************************

Description:

Web server failed to start. Port 8080 was already in use.

Action:

Identify and stop the process that's listening on port 8080 or configure this application to listen on another port.
```

#ポート番号8080を使用しているプロセスを削除する
`Port 8080 was already in use.`と書いてあり、ポート番号８０８０が既に使用中であることが原因みたい。
となれば、このプロセスを削除してしまえば解決しそう。

###方法１：Eclipseから
Eclipseのコンソールウィンドウ上で右クリック　→　「すべて終了/切断」を押下

###方法２：ターミナルから
`lsofコマンド`で8080ポートを使用しているプロセスIDを調べて、そのプロセスIDを`killコマンド`で終了させます。

```
$ lsof -i:8080
COMMAND   PID USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
java    75264 user  88u  IPv6 0xe1**********d05b      0t0  TCP *:http-alt (LISTEN)

$ kill 75264
```

#解決しました
Eclipseからの方法ではうまく削除できず、ターミナルからの方法で解決しました。
このようになってしまった原因はよくわかりません。めんどうなので調べるのは気が向いたらにしようかと思います。

参考になりました。ありがとうございます。
・[Spring Boot起動時にエラー、"Web server failed to start. Port 8080 was already in use."](https://it-jog.com/java/springboot/sbstartupporterror)
初心者　シェル　練習問題

この記事は最初に練習問題が書いてあります(超基本)。
わからなければ、練習問題の下に前提知識をまとめてありますので理解を深めていただけると幸いです。

その解釈は違う、などありましたらご教授ください。

# シェル　練習問題

1. 777 の権限は -r w x で表現すると
2. 400 の権限は -r w x で表現すると
3. 権限（rw-r--r--) を二進数で表現すると
4. シェルスクリプトファイルの拡張子は
5. シェルスクリプトの実行方法は

# シェルスクリプト作成　練習問題

1. 任意のディレクトリにtestディレクトリを作成する
2. testディレクトリにmoveという名前のシェルスクリプトファイルを作成する  
   (内容は4が実行できるように書く)
3. moveと同じディレクトリに testfile1〜testfile10 を作る
4. moveを実行するとディレクトリのtestfile計10ファイルが一つ上のディレクトリに移動する

# まとめ

## シェルスクリプトとは
コマンドを書き連ねたテキストファイル


"実行するとそれらのコマンドを全て実行してくれる便利なもの"

## シェルとは
シェルスクリプトの中身(プログラム)のこと


###1. 前提知識(変数について)
``` 
num=1　
変数を確認 →　echo $num　
全変数を表示 → printenv (全ての設定された変数が設定されている)
```


###2. パーミッションの確認方法

```
% ls -l
-rwxr-xr-x 1 root root
```
-<font color="DeepPink">rwr</font><font color="Orange">r-x</font><font color="ForestGreen">r-x</font> 1 root root 

<font color="DeepPink">rwr</font><font color="Orange">r-x</font><font color="ForestGreen">r-x</font>の部分がパーミッションの設定状態

-/<font color="DeepPink">所有者</font>/<font color="Orange">同グループ</font>/<font color="ForestGreen">その他</font> ファイルがリンクされている数/所有者/所有グループ

どの種類のオーナーがこのファイルに対して何をできるか

- <font color="DeepPink">所有者</font>: ファイル所有者に対しての権限
- <font color="Orange">同グループ</font>: 同じグループに所属しているユーザーの権限
- <font color="ForestGreen">その他</font>: それ以外のユーザーに対しての権限設定
  - r: (read)読み取り権限
  - w: (write)書き込み権限
  - x: (execute)実行権限
  - -: 権限なし  
　
例：`-rwxr-xr-x 1 root root`  
⇨　所有者rootは「読む」「書く」「実行」  
　 rootグループに所属する他のユーザーは「読む」「実行」  
　 それ以外も「読む」「実行」 


### 3. 権限の設定方法
権限の設定は `chmod 2進数 ファイル名`　で設定

2進数の変換方法

   例: rwx/rwx/rwx = 777,  r--/r--/--- = 440,  rw-/r--/r-- = 644

2進数: 111/111/111 = 777,  100/100/000 = 440,  110/100/100 = 644
    

```console
% chmod 777 ファイル名
⇨ -rwxrwxrwx
権限をall可に変更できる。
```


### 4.シェルスクリプトの実行方法

`% ./move.sh`  
`zsh: permission denied`  

このエラーが出たら

シェルを実行するときはパーミッション(実行権限)が必要であるため権限を変更することを思い出すこと。




### 5. シェルスクリプト作成　練習問題の答え

1.  任意のディレクトリにtestディレクトリを作成する
   - `% mkdir test`

2. testディレクトリにmoveという名前のシェルスクリプトファイルを作成しシェルを書く
   - `% vi move.sh`

中身

```
 #!/bin/sh
 mv testfile* ../
```

3  moveと同じディレクトリに testfile1〜testfile10 を作る
 `% touch testfile{1..10}`
 `% ls -l`
 
4 moveを実行するとディレクトリのtestfile計10ファイルが一つ上のディレクトリに移動する  


#### 実行方法
```console
move.shには権限がないので権限を744に変更

% chmod 744 move.sh  

% ls -l
→権限が-rexr--r--に変更されているのが確認できる

% ./move.sh
で実行

%ls -l
testfile1〜testfile10が全て消えて、上のディレクトリに移動したことを確認する。
```


おしまい
日付項目をレポートにエクスポートした時のカンマを取り除く

なかなかの回答です。私もどう答えるか迷った件。さすがお師匠さん（勝手に弟子入りしています）


[remove comma from date/time field](https://trailblazers.salesforce.com/answers?id=9064S000000DbEY)


回答は

1.ロケールを変更してカンマがないものを選ぶ。ただし、他に影響するので推奨できない。

2.数式項目を作ってフォーマットにカンマがないものにする。ただし、数式にするとGMTになるのでこれも推奨できない。（悪夢らしい）

3.Apexトリガーを使ってフォーマットを整形して別の項目にセットする。これだとタイムゾーンの変換も簡単。

ということで、Apexトリガーでの処理を推奨していますね。
初学者がやりがちな成長が鈍化する習慣を実際の初学者が紹介する

これは、今思い返したらくっそ無駄な時間だったなって思うことを書いてみました。
Ruby on Railsをもとにしています

それは、
#ググり方が下手というより甘ったれすぎること

どういうことかといいますと、例えば、ログイン機能を作っていくときに、
`ログイン機能　動かない　rails`
のように、大雑把すぎる内容で検索をかけてしまうことですね。

プログラミングというのは、構造を作っていく作業なわけなので、そのときにエラーが起きてしまうというのは、その仕組に何かしらの欠陥を抱えているわけなんですよね。

例えば、エンジンが動かないときに、`エンジン　動かない　〇〇（車種の名前）`と頭の中で考えないですよね、

〇〇が動いていないからエンジンに火が入らないのか
というふうに、エンジンが動く仕組みを考えた上で、その仕組からエラーとなっているところをたどっていくと思うんですけど、みんな何故かプログラミングということになると、それをしないで抽象的すぎることで検索をかけてしまうっていうことを滅茶苦茶やってしまうんですよね。

これはなぜかというと、プログラミングというものになれていないというよりも、そのプログラムが動く仕組みを理解していないからだと思うんですよね。

これは、実際にやってしまったエラーなんですけど、投稿機能を作る際にその投稿とユーザーを結びつけようとしたところ、エラーが起きてしまいました。
その原因は、投稿に関するmodelに、ユーザーを結びつけるように書いていたつもりだったのに書いていなかったからでした。

その時は、
・そもそも投稿がユーザーと結びつくとはどういうことか
・どこまで処理が進んでいて、どこらへんでエラーになっているのか

ということを考えた結果、modelに、`belongs_to :user`を書いていないことに気が付き、対処した

ということがあったんですよね。

投稿とユーザーを結びつけるとはどういう仕組みかというと、

・modelの中に、`belongs_to :user`と記述し、userモデルの中に投稿のモデルを置く
・コントローラーのパラメーターにユーザーのidを渡してあげて、結びつける

ということをやるわけなので、その段階でエラーが起きるってことは、
・modelの記述が間違えている。
・DBにそもそもユーザーのテーブルが存在しない
・controllerの記述がどこかおかしい

ってなるんですよね。
こんなふうに、その機能が動く仕組みから原因を推測していくってことを放棄してしまっているから、いつまで立っても問題を解決できないということにぶち当たっていくんですよね。
正直ググったところで底に出ている解決策が本当に自分のものになるのかもわからないですし、プログラミングしている環境（例えばOSのバージョンとか）
違ったら色々変わってくるので、100%アテになるかって言うとそうでもないんですよね。
#それを回避するためのアクションプラン

progateなどをやって機能を実装するときに、その機能がどういう仕組で動いているのかっていうことを六割くらいの重要度で学んでおくと役に立ちますよ

後は、その機能が動く仕組みから逆算してどうして動かないのかを考えましょう
そんでわからないところをググっていくって言う方針でやっていくとむだに2ヶ月も3ヶ月も無駄にしないですみますよ。
バッチファイルでPythonファイルを実行する際の注意点

こんにちは！
駆け出しエンジニアのこうすけです！
今日は、長らく悩んでいたバッチファイルで
Pythonファイルを開くことが出来ました！
原因を確認してみた時、新しく発見がありましたので備忘録も兼ねて共有させていただきます。

# 環境
```・Windows 10 64bit
・Python3.9.1```

#バッチファイル

```bat:sample.bat
cd C:\Users\スクレイピングアプリ一覧\sample
python sample.py
pause >nul
```

解説します。
1行目、cdコマンドでファイルを移動します。
2行目、pythonファイルを起動します。
3行目、このままだとすぐコマンドプロンプトが終了してしまうためこの記述をすることで終了するまでコマンドプロンプトを表示してくれます。


しかし、これだとエラーが起こってしまいます。

#エラー内容
```bat:sample.bat
cd C:\Users\πé╣πé»πâ¼πéñπâöπâ│πé░πéóπâùπâ¬\sample
The system cannot find the path specified.
```

このような内容が表示されます。
恐らく、文字化けしている箇所が正しく認識されなかったためエラーになったのだと思います。


#解決方法
単純な解決方法として、ファイル名を英文にする。
そうすると起動できることが確認できました。

また、以下のコードを追加すればそのままの状態でも起動できることが確認できました。

```bat:sample.bat
chcp 65001
cd C:\Users\πé╣πé»πâ¼πéñπâöπâ│πé░πéóπâùπâ¬\sample
The system cannot find the path specified.
```

chcp 65001で文字コードをUTF-8に指定しているようです。
こちらでも起動が確認できました。


プログラムを作った時に自動実行するためにバッチファイル作成を検討して挫折してしまってましたが無事に完了しました！
これで、ガンガン自動化頑張ります！！
Python はてなブックマークをキーワード検索

# Python はてなブックマークをキーワード検索

はてブのエントリーはRSSを使って取得する
公式 ... http://developer.hatena.ne.jp/ja/documents/bookmark/misc/feed

## RSS

パラメーター
q ... キーワード
sort ... ソート（新着順：recent, 人気順：popular）
threshold ... 最低はてブ数
date_begin ... 開始日 {YYYY-MM-DD}
date_end ... 終了日{YYYY-MM-DD}


**キーワード**
https://b.hatena.ne.jp/search/text?q=PHP&mode=rss&date_begin=2021-02-01&date_end=2021-02-01

**タグ**
https://b.hatena.ne.jp/search/tag?q=PHP&mode=rss&date_begin=2021-02-01&date_end=2021-02-01

**タイトル**
https://b.hatena.ne.jp/search/title?q=PHP&mode=rss&date_begin=2021-02-01&date_end=2021-02-01

## Python側

RSS取得は `feedparser` を使う
feedparser ... https://github.com/kurtmckee/feedparser

インストール

```
$ pip install feedparser
```

タイプ、キーワード、開始・終了日付で検索できるようにした
`feedparser` をRSS取得しDataFrameに保存

```Python
search = hatena.get_search("tag", "PHP", "2021-02-01", "2021-02-11")
```

```Python
import feedparser
import pandas as pd


def get_search(type: str, q: str, start_date: str, end_date: str):

    df = pd.DataFrame(
        columns=[
            "id",
            "title",
            "link",
            "summary",
            "updated",
            "hatena_bookmarkcount",
            "hatena_bookmarkcommentlistpageurl",
            "hatena_imageurl",
        ],
    )

    rss = f"https://b.hatena.ne.jp/search/{type}?q={q}&mode=rss&date_begin={start_date}&date_end={end_date}"
    d = feedparser.parse(rss)
    for entry in d.entries:

        df = df.append(
            {
                "id": entry.id,
                "title": entry.title,
                "link": entry.link,
                "summary": entry.summary,
                "updated": entry.updated,
                "hatena_bookmarkcount": entry.hatena_bookmarkcount,
                "hatena_bookmarkcommentlistpageurl": entry.hatena_bookmarkcommentlistpageurl,
                "hatena_imageurl": entry.hatena_imageurl,
            },
            ignore_index=True,
        )

    return df

```


実行結果

```
                                                  id  ...                                    hatena_imageurl
0  https://www.1st-net.jp/blog/2021/02/04/php_mai...  ...  https://www.1st-net.jp/blog/wp-content/uploads...
1  https://www.datadoghq.com/blog/engineering/php...  ...  https://imgix.datadoghq.com/img/blog/engineeri...
2  https://qiita.com/tajima_taso/items/18a2c593a3...  ...  https://qiita-user-contents.imgix.net/https%3A...
```

--- 

はてブ投稿を取得できました
いいね！と思ったら LGTM お願いします :clap::clap::clap:

【PR】週末ハッカソンというイベントやってます！ → https://weekend-hackathon.toyscreation.jp/about/
初めてのRaspberry Pi Pico ⑬ Circuitpythonで14セグLEDに温度を表示 その2

###CPU内部の温度
　　Raspberry Pi Pico Python SDKやRaspberry Pi Pico C/C++ SDKを読むと、A4端子は内部の温度計の出力につながれていると説明されています。
　CircuitPython（6.2.0-beta.2）で次のように記述しました。

```python
analog_in = AnalogIn(board.A4)
```

　エラーになりました。GitHubで質問したら、現時点では、microcontrollerライブラリを使ってくれるようにとのことでした。

###温度を取得するプログラム
　前回のTMP117を使ったプログラムに、CPU内蔵温度計の値を追加して表示するように変更しました。
（2021/02/15）マニュアルには、onboard temperature sensorと書かれているので、CPU内蔵とは異なるかもしれません。

```python
# SPDX-FileCopyrightText: 2021 ladyada for Adafruit Industries
# SPDX-License-Identifier: MIT
# Author: Tony DiCola

import time
import board
import busio
from adafruit_ht16k33 import segments
import adafruit_tmp117
import microcontroller

# Create the I2C interface.
i2c = busio.I2C(board.GP27, board.GP26)

# Create the LED segment class.
display = segments.Seg14x4(i2c)

tmp117 = adafruit_tmp117.TMP117(i2c)

# Clear the display.
display.fill(0)

while 1:
    print('Temperature: {:.1f}C CPU: {:.1f}C'.format(tmp117.temperature, microcontroller.cpu.temperature))
    display.print('{:.1f}c'.format(tmp117.temperature))
    time.sleep(1)
    display.print('{:.1f}c'.format(microcontroller.cpu.temperature))
    display.show()
    time.sleep(1)
```

　実行中のMuの画面です。この温度が本当なら、すごくクールなCPUだといえます。
![c201.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/9631473f-5a5e-646e-7ec5-801062139955.png)
Property Wrappersについて学んだことメモ（@State, @Binding）

SwiftUIで肝になってくるのが、@StateなどのProperty Wrappersの違いを理解すること。
swiftUIについてはまだまだ初学者なのですが、とりあえず今回は、今わかる範囲である@State,@Bindingについての殴り書きメモです。

## @State

- Viewはstructで構成されているため、変数で設定した値は通常更新されない
- そこで、@Stateを宣言することにより、メモリ管理をSwiftUIに任せることができ、値を更新することができる
- つまり、@Stateで宣言された変数は、ユーザーが操作した瞬間に値を反映することができる！


## @Binding

- @Bindingで宣言された変数は、異なったView間でのデータ共有ができる
- @Bindingで定義した値を変更すると、@Stateで定義した値も変更され、関連するViewが全て変更される！



ここではそれぞれの定義だけ触れました。
また今度深く突っ込んでいこうと思います。
Next.js / Pre-rendering

<h1>はじめに</h1>
Next.jsのPre-renderingを整理。

<h1>Pre-renderingとは</h1>
Pre-renderingはページ表示のリクエストがユーザーから飛ぶ前に、**前もってページを生成しておく機能**を指す。
この機能を使うことで、ページ表示が早くなりSEOにもポジティブな影響が働く。

そして、Next.jsはPre-renderingにおいて**Static Generation**と**Server-Side Rendering**の2つの方法を持つ。

<h1>Static Generation</h1>
こちらはユーザーからリクエストされたタイミングではなく、<br/>開発環境から**buildされたタイミング**でページが生成される。
ゆえにページ表示が高速で、SEO的にも優れている。
（事前に開かれるであろうページを用意して、それをパパッと表示だけするイメージ。）

実装には**getStaticProps**関数を用いる。
最初のページ表示から外部データ/APIとの連携が必要な場合は、**getSortedPostsData**関数の中で、
データベースと連携するクエリをそのまま書いたり、API連携の記述をすることで実装可能。

このようにStatic Generationは高速なページ表示で威力を発揮するが、
コンテンツが動的に変わるアプリ/サイトの場合は不向き。
この場合は、**Server-Side Rendering**を使うと良い。

更新が少ないサイトやブログなどにはStatic Generationは向いている。

<h1>Server-Side Rendering</h1>
**Server-Side Rendering**は、その名の通り、クライアント側ではなく<br/>サーバー側でレンダリングできる仕組みのこと。
サーバー側でページ生成をしてくれるので、Googleのクローラーに完成されたコンテンツを<br/>解析してもらえるのでSEOに強い。

そして、Static Generationとは違って**ユーザーのリクエストごとに**ページが生成される。
ゆえに先述のStatic Generationと比較するとページ表示は遅いが、<br/>ページ更新が多い動的なアプリには向いている。



<h1>まとめ</h1>
何を開発するかによって、最適な技術は違うんだと改めて実感しました。
Pythonのリストをポイントクラウドとして保存する


```bash:インストール
pip3 install open3d 
```

```Python:GetPCD.py

# coding: utf-8
import open3d as o3d
import numpy as np

world = [[0.0, 0.0, 0.0], [0.0, 0.05, 0.0], [0.0, 0.1, 0.0], [0.05, 0.0, 0.0], [0.05, 0.05, 0.0], [0.05, 0.1, 0.0], [0.1, 0.0, 0.0], [0.1, 0.05, 0.0], [0.1, 0.1, 0.0], [0.0, 0.0, 0.05], [0.0, 0.05, 0.05], [0.0, 0.1, 0.05], [0.05, 0.0, 0.05], [0.05, 0.05, 0.05], [0.05, 0.1, 0.05], [0.1, 0.0, 0.05], [0.1, 0.05, 0.05], [0.1, 0.1, 0.05]]

xyz = np.array(world)
pcd = o3d.geometry.PointCloud()
pcd.points = o3d.utility.Vector3dVector(xyz)
o3d.io.write_point_cloud("test.pcd", pcd)

```

pcd以外にもplyなどの形式で保存可能.
拡張子を変えればok.
[rails]DRYとはなにか

#DRYとはなにか
DRYとはDon't Repeat Yourselfの略で、「同じ情報を繰り返し定義しない」という考え方です。

情報とは、メソッドであったり、配列などのデータの集合体などを指し、同じコードを繰り返し記述しないということです。

DRYを意識することで、可読性の向上や、コード量を減らすことによりアプリケーションの動作が早くなることがあげられます。

DRYが意識出来てないコードです

```ruby:DRYが意識できていないコード
def select_workout1
  muscle = ['ベンチプレス','デットリフト','スクワット','懸垂','腕立て伏せ']
  num = gets.to_i
  workout1 = muscle[num]
  puts workout1
end

def select_workout2
  muscle = ['ベンチプレス','デットリフト','スクワット','懸垂','腕立て伏せ']
  num = gets.to_i
  workout2 = muscle[num]
  puts workout2
end

def select_workout3
  muscle = ['ベンチプレス','デットリフト','スクワット','懸垂','腕立て伏せ']
  num = gets.to_i
  workout3 = muscle[num]
  puts workout3
end

puts '1種目目は？'
select_workout1
puts '2種目目は？'
select_workout2
puts '3種目目は？'
select_workout3
```
上記の例では、muscleという配列の情報を各メソッド内で定義しています。

numという変数に代入するgets.to_iやworkoutも、代入する値は同じですが各メソッドで定義しています。

これでは、「同じ情報を繰り返し定義しない」というDRYの考え方に沿っていません。

```ruby:DRYを意識したコード
muscle = ['ベンチプレス','デットリフト','スクワット','懸垂','腕立て伏せ']
  
def select_workout(muscle,category)
  num = gets.to_i
  if category == 'workout1'
    workout1 = muscle[num]
    puts workout1
  elsif category == 'workout2'
    workout2 = muscle[num]
    puts workout2
  elsif category == 'workout3'
    workout3 = muscle[num]
    puts workout3
  end
end

puts '1種目目は？'
select_workout(muscle,'workout1')
puts '2種目目は？'
select_workout(muscle,'workout2')
puts '3種目目は？'
select_workout(muscle,'workout3')
```

これで重複していた、gets.to_i、muscleなどがなくなりました

#まとめ
DRYを意識できれば、変更点などが少なくなります。
変更点が少なくなれば修正点などが少なくなり、修正漏れなどのバグが生じにくくなります。
【Meta Humans×Live Link】デジタルヒューマンをフェイシャルキャプチャで動かす


この記事は[Zennの記事](https://zenn.dev/iwaken71/articles/metahumans-livelink)と同じものです

# この記事のゴール

Unreal EngineにからリリースされたMetaHumansのデジタルヒューマンに対して、iPhoneのフェイシャルキャプチャを用いてリアルタイムで顔を動かします。

こんな感じで！

https://twitter.com/iwaken71/status/1359820023485763585?s=20

# 手順

- MetaHumansをimport
- Facial Capture用のレベルを作成
- iPhoneにLive Link Face Appをインストール&起動
- Live Link用の設定
- 再生して確認

# 開発環境

- Unreal Engine4.26 (以下UE4)
    - 現在4.26のみ動作します
- Windows10
- iPhone11
    - FaceID搭載の機種であれば可能
- Wifi環境

# MetaHumansをimport

こちらの記事でimportお願いします！
https://zenn.dev/iwaken71/articles/metahumans-unrealengine-sample

# Facial Capture用のレベルを作成

- 空のレベルを新規作成し、"Facial"などと名前を付ける
- Content/SampleMetaHumans/metahuman_004/BP_metahuman_004をレベルに追加
- BP_metahuman_004のTransformのLocationを(0,0,0),Rotation(0,0,90)に設定する
- Persistent LevelにMH_Gen4Lightingを追加

空のレベルを新規作成し、"Facial"などと名前を付ける

![image](https://user-images.githubusercontent.com/10010842/107638846-769eda80-6cb3-11eb-87f5-76eaf88ad407.png)

Content/SampleMetaHumans/metahuman_004/BP_metahuman_004をレベルに追加

![image](https://user-images.githubusercontent.com/10010842/107638943-98985d00-6cb3-11eb-8b5c-b009027b6e0c.png)

BP_metahuman_004のTransformのLocationを(0,0,0),Rotation(0,0,90)に設定する

![image](https://user-images.githubusercontent.com/10010842/107639052-bbc30c80-6cb3-11eb-9b58-55d7ab2e3ffa.png =540x)

Persistent LevelにMH_Gen4Lightingを追加
Levelsウィンドウが存在しない場合は [Window]>[Levels]を選択。

![image](https://user-images.githubusercontent.com/10010842/107639187-e3b27000-6cb3-11eb-9dae-d012fe01269c.png)

# iPhoneにLive Link Face Appをインストール&起動

- iPhoneにインストール&起動
- PCとiPhoneで同じWifiに入る
- [設定]>[Live Link]>[ターゲット追加]>PCのIPアドレスを入力
- お好み設定
    - 頭の回転をストリームにチェックを入れる

iPhoneにインストール
https://apps.apple.com/us/app/live-link-face/id1495370836

[設定]>[Live Link]>[ターゲット追加]>PCのIPアドレスを入力
![image](https://user-images.githubusercontent.com/10010842/107649647-039c6080-6cc1-11eb-8021-cd0428fa54ad.png)

頭の回転をストリームにチェックを入れる (お好み)
チェックを入れると頭の回転も反映させるようになる。
![image](https://user-images.githubusercontent.com/10010842/107652430-eae17a00-6cc3-11eb-83a9-77279026a763.png)

# Live Link用の設定

UE4の[Window]>[Live Link]を選択する。

iPhoneのLive Link Face Appのカメラモードで自分の顔を認識させている状態で、UE4のLive Linkがつながっているか確認する。

![image](https://user-images.githubusercontent.com/10010842/107652914-6a6f4900-6cc4-11eb-91d2-3b380d3dbdc0.png)

BP_metahuman_004を選択し、[LLink Face Subj]にて**iPhone**を選択する。
お好みで[LLink Face Head]にチェックを入れる。チェックを入れると頭の回転も反映するようになる。
![image](https://user-images.githubusercontent.com/10010842/107654451-064d8480-6cc6-11eb-82fa-030dd7e016ac.png)

# 再生して確認

UE4のプレイボタンで再生！

https://youtu.be/txy0YCAAH4o
エラー Module not found: Error: Can't resolve 'axios'

エラー文

```
ERROR in ./resources/js/bootstrap.js
Module not found: Error: Can't resolve 'axios' in '/home/ec2-user/environment/mybbs/resources/js'
 @ ./resources/js/bootstrap.js 21:15-31
 @ ./resources/js/app.js
 @ multi ./resources/js/app.js ./resources/sass/app.scss ./resources/sass/admin.scss
```

解決策

```
$ npm install axios --save-dev
$ npm run watch
```
Laravel DBとの接続方法(個人メモ)

<h1>Laravelにおいて、DBから値をとってくる時に困ったので、自分でまとめたものを記載する。</h1>

<h2>前提：Laravelのセットアップ及びDBとの接続が済んでいる</h2>

LaravelはMVCを採用している。M=Model V=view C=Controllerである。

Vに当たるものを仮にmenu.blade.phpとする。このファイル内でタイトルデータがmenu_titleというカラムにあったとすると

タイトルとなっている部分を```{{ $data->menu_title}}```で置き換える。viewの処理はこれだけでよい。

仮に、複数タイトルが存在する場合は、```@foreach($menu_list as $data)```で囲めば良い。

```@endforeach``` を忘れずに。

ここの```$menu_list```というのは```menu_title```が格納されているテーブル名の単数形を入れる。

次にrouteの処理。

本来は 

```Route::get('/menu', function(
return view('menu');
});```

となっている部分を

```Route::get('/menu', 'MenuController@index');```
で置き換えれば良い。

次にコントローラの話をする。

```$ php artisan make:controller MenuController```で作成できる。

ここの関数でDBに接続する。

public function index() {
    $data = [
        'menu_list' => DB::table('tbl_menu_lists')->paginate(20),

     ];
    return view('menu', $data);
}}
Java double型の誤差とBigDecimal

# floatとdoubleは誤差が発生する可能性がある
以下のプログラムを実行してみる。

```
double result = 0;
double d = 0.1;
// 0.1を10回足し算
for (int i = 1; i <= 10; i++) {
	result += d;
}
System.out.println(result);
```

```lang:実行結果
0.9999999999999999
```
期待値：0.1
実行結果：0.9999999999999999

# 誤差が発生する理由
コンピュータの内部では、2進数で数値を保持している。

例えば、
10進数の「0.5」は2進数で「0.1」
10進数の「0.1」は2進数で「0.000110011001100…」⇒無限小数となり終わらない。
よって、10進数の「0.5」は誤差なくdouble型で表現できるが、10進数の「0.1」はコンピュータのビットが有限のため正確に表現できない。

# 誤差の解決方法
BigDecimalを使用する。

```
BigDecimal result = new BigDecimal("0");
BigDecimal addValue = new BigDecimal("0.1");
// 0.1を10回足し算
for (int i = 1; i <= 10; i++) {
	result = result.add(addValue);
}
System.out.println(result);
```

```lang:実行結果
1.0
```

# BigDecimalで誤差が発生しない理由
BigDecimalでは、内部的には整数×10のマイナス乗で値を保持している。

$ unscaledValue×10^{-scale} $

例えば、「0.3」であれば、「$ 3×10^{-1} $」
よって、二進数にしても誤差が発生しない。

# その他色々な例
以下のプログラムを実行してみる。

```
double d = 0.1;

System.out.println(d);
```

```lang:実行結果
0.1
```

上記は誤差が発生していないように見えるが、
コンピュータ内部では誤差が発生しており、コンソール表示時に「0.1」とうまく表示されただけ。

↓BigDecimalを使用すると、誤差が発生していることがわかる。

```
BigDecimal b = new BigDecimal(0.1); //←ここでdouble型になっているため誤差が発生している。

System.out.println(b);
```

```lang:実行結果
0.1000000000000000055511151231257827021181583404541015625
```

↓StringでBigDecimalインスタンスを生成すれば、誤差は発生しない。

```
BigDecimal b = new BigDecimal("0.1"); //←Stringを使用すると誤差が発生しない。

System.out.println(b);
```

```lang:実行結果
0.1
```

↓「0.5」は2進数で無限小数ではないため、double型でBigDecimalインスタンスを生成しても誤差が発生しない。

```
BigDecimal b = new BigDecimal(0.5);

System.out.println(b);
```

```lang:実行結果
0.5
```

↓普通に表示しただけで誤差が見える数値もある。

```
double d = 1.0000000003000003;

System.out.println(d);
```

```lang:実行結果
1.0000000003000002
```

# doubleとBigDecimalのどちらを使用するか
金額計算など、誤差が発生してはいけないシステムの処理ではBigDecimalを使用する必要がある。
ただし、計算のスピードはdoubleの方が速いため、誤差を許容できる処理であればdoubleを使用すれば良い。

# おまけ
BigDecimal.valueOfを使用すれば、double型を変換しても誤差が発生しないという勘違いが多い。

```
double d = 0.1;
BigDecimal b = BigDecimal.valueOf(d);

System.out.println(b);
```

```lang:実行結果
0.1
```

上記の例は問題ないが、BigDecimal.valueOfは内部処理として数値をDouble.toStringしているだけである。
よって、以下のような場合は誤差が表示される。

```
double d = 1.0000000003000003;
BigDecimal b = BigDecimal.valueOf(d);

System.out.println(b);
```

```lang:実行結果
1.0000000003000002
```
IPAがいつまで経ってもデジタルバッジを作らないので勝手に自作した件

# 経緯
昨今の各種ベンダー系資格はいずれもデジタルバッジと呼ばれる、いかにも「俺はこういう力があるんだぜ( ･´ｰ･｀)ﾄﾞﾔｧ」と言わんばかりに厨二心をくすぐる有資格者の為のロゴを提供している。しかし、日本でIT系国家試験を執り行う[IPA（情報処理推進機構）](https://www.ipa.go.jp/index.html)は~~オワコンの~~国家資格である情報処理安全確保支援士（登録セキスペ）を除きそれらを提供していない。そんな中、諸外国にリードを許すIT業界を少しでも盛り上げようと思い、[ロゴメーカー](https://www.freelogodesign.org/)でデジタルバッジを自作した次第である。

# デジタルバッジ
###全種類
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286189/83a45cc0-e56a-f89d-7974-d86c315283ec.png)
![all_logo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286189/1cdfec8e-bf95-a819-0d9d-48b042f3b636.png)

###ITパスポート 
![logo_ip.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286189/d9eb0c1d-ef94-d7bc-f738-0e22e79a9433.png)

### 情報セキュリティマネジメント
![logo_sg.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286189/d1b29b97-e82e-b82b-5dd8-643289ac90af.png)

### 基本情報技術者
![logo_fe.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286189/1ba586fb-a551-ae20-5905-93fbaa55a0fd.png)

### 応用情報技術者
![logo_ap.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286189/19b123ed-5122-22d7-932a-f0ecebae473d.png)

### ITストラテジスト
![logo_st.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286189/6792e044-546c-aaac-c661-992fd79fbd28.png)

### システムアーキテクト
![logo_sa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286189/2940b7c9-2b24-67d7-4f68-8cf2ec22ab43.png)

### プロジェクトマネージャ
![logo_pm.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286189/97ff1ca5-961a-5d75-c2c2-7778539fcf25.png)

### ネットワークスペシャリスト
![logo_nw.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286189/13d52242-6291-28d4-03fc-aab15ac5ab94.png)

### データベーススペシャリスト
![logo_db.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286189/7ff193fe-f9f5-539a-ed02-1e2ea8351527.png)

### エンベデッドシステムスペシャリスト
![logo_es.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286189/7252d106-4322-c16f-2a1e-1403bffe67b9.png)

### ITサービスマネージャ
![logo_sm.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286189/b1693dde-633e-b081-e224-fb2e1e08f386.png)

### システム監査技術者
![logo_au.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286189/658bff40-e635-da49-3f77-85de9563067f.png)

### 情報処理安全技術者支援士
![logo_sc.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286189/6583fe31-50a7-8fc8-1223-4ecda1f6de89.png)

### 情報処理安全技術者支援士（登録セキスペ）※公式ロゴ
![sc_registered.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286189/e4750e2e-65f4-629d-6500-ba2fa23f111f.jpeg)
matplotlobで数式と日本語を使えるようにする！

[matplotlib](https://matplotlib.org/)でタイトルやラベルに数式を挿入、日本語を表示する手法を一つずつ紹介する。

## 環境
* macOS BigSur 11.1
* Python 3.8.6
* matplotlib 3.3.3

# 数式
数式はLaTeXコマンドを用いて以下のように書くことで挿入できる。LaTeXコマンドがわからない方は[こちら](http://www.latex-cmd.com/)を参考にすると良い。

```python
r'$LaTeXコマンド$' #表示したい数式をLaTeXで書く。
```
例えばx軸のラベルを$\Gamma(x)$にしたい場合は

```python
plt.xlabel(r'$\Gamma(x)$')
```
のように書く。

# 日本語化
matplotlibで使用するフォントを変更し、日本語も表示可能にする。フォントは無料で使用できるIPAexゴシックに変更する。
### matplotlibのインストール先の確認
matplotlibのインストール先を確認するために以下のコマンドを叩く。

```
% pip show matplotlib
Name: matplotlib
Version: 3.3.3
Summary: Python plotting package
Home-page: https://matplotlib.org
Author: John D. Hunter, Michael Droettboom
Author-email: matplotlib-users@python.org
License: PSF
Location: /Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages
Requires: cycler, python-dateutil, pyparsing, pillow, kiwisolver, numpy
Required-by: 
```
Locationに書かれている場所がインストール先となっている。
### IPAexゴシックをmatplotlibで使用できるフォントに追加
matplotlibで使用されるフォントの[ttf](https://wa3.i-3-i.info/word14137.html#:~:text=%E3%81%9F%E3%81%A0%E3%81%97%E3%80%8CTrueType%E3%83%95%E3%82%A9%E3%83%B3%E3%83%88%E5%BD%A2%E5%BC%8F%E3%81%AE,%E5%A0%B4%E5%90%88%E3%82%82%E3%81%82%E3%82%8B%E3%81%AE%E3%81%A7%E3%81%99%E3%80%82&text=%E3%81%8C%E3%80%8CTTF%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%80%8D%E3%81%A7%E3%81%99%E3%80%82)が保存されているフォルダ`インストール先/matplotlib/mpl-data/fonts/ttf`にIPAexゴシックフォントのttfを追加する。IPAexゴシックのttfファイルは[ここ](https://moji.or.jp/ipafont/ipaex00401/)で入手することができる。

### デフォルトフォントの変更
matplotlibのデフォルトフォントは`インストール先/matplotlib/mpl-data/matplotlibrc`の250行目にある

```
#font.family: sans-serif
```
で設定されている(sans-serifはデフォルトフォント)。
これを

```
#font.family: IPAexGothic
```
に変更することでデフォルトフォントを変更する。
デフォルトフォントを変更せず、その瞬間のみ使用するフォントを変えたい方はコードに

```python
plt.rcParams["font.family"] = "IPAexGothic"
```
と追加するとよい。

### キャッシュ削除
これまでの方法で表示できなかった場合

```python
import matplotlib
matplotlib.get_cachedir()
```
でキャッシュファイルがあるフォルダを表示できるのでフォルダ内の`fontlist-v330.json`を削除する。

以上の工程を踏むことで普段通りのコードで日本語が表示される。
deviseの add_index :users, :email, unique: true　記述について

# なんでこの記事を書いたか
devise導入の際に生成されるマイグレーションファイルの下の方に
記述されている、

```rb:マイグレファイル
    add_index :users, :email,                unique: true
    add_index :users, :reset_password_token, unique: true
    # add_index :users, :confirmation_token,   unique: true
    # add_index :users, :unlock_token,         unique: true
```
の``` add_index :users, :email,                unique: true ```
をemailカラムにデフォルトで設定されているunique制約だと思い込んでしまって泥沼にはまったため

元はといえば、メンターさんにunique制約書いた方がいいよと言われて
「えっ、でもdeviseって元からunique制約かかってるよな」と思ったのが混乱の始まり。
今思うとその時はテーブルの設計をしたREADMEファイルにunique制約書いとけよと言う意味だったが、
その時は分からず「マイグレーションにも書かなければいけないのか？」と思って大混乱

# 結論
``` add_index :users, :email,                unique: true ```
この記述はデフォルトで設定されている、unique制約の記述ではない！！　
いやそんなのわかるよって人多そう（笑）


# 簡単に言うと
「前半のadd_index」は__『特定のカラムからデータを取得する際に、テーブルの中の特定のカラムのデータを複製し検索が行いやすいようにする』__ための記述で
「後半のunique:true」はindexが使えるオプションとのこと

この時点でまだピンとこなかったのでさらに深堀、、、
完全理解するにはどうやら、__add_indexのindex__を理解をした方が良さそう

# index　とは
indexを張ることで特定のカラムからデータを取得したいときに、テーブルの中の特定のカラムのデータを複製して、検索が行いやすいようにする。
例えば多くのデータを格納しているカラムで検索したい値があるときに、カラムを複製してアルファベット順にして検索のしやすい環境を作る。

とりあえずどう言うときに使うかの認識としては、
__『多くのデータを格納するテーブルの、格納される値がそれぞれ異なるようなカラム(unique制約のかかったカラムなど)の中で、検索がよく行われるカラム』__
に対してadd_indexの記述を張ることで検索を簡単にしたいときに使う。

使い方としては
``` add_index :テーブル名, カラム名, 必要ならオプション名 ```
と記述する

ここでやっと``` add_index :users, :email,                unique: true ```この記述
の意味を理解、、、、

ちなみにオプションはこんな感じ
:name - インデックスの名前
:unique - trueを指定するとユニークなインデックス
:length - インデックスに含まれるカラムの長さ

____
参考文献
https://qiita.com/seiya1121/items/fb074d727c6f40a55f22
github1s、恐ろしい子。githubのコードをVS Codeで開く、1秒で。

# githubのコードを1秒でVS Codeで開く。
![github1s_logo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5412/8c2f1e4d-8b38-52da-1753-9dc4e11f5797.png)
は？ なに言ってんの？ ですよね。
では、これを見て。
https://github1s.com/Naohiro2g/pygame_mcpi_LCD_7seg/blob/master/demo_LCD_font_PG.py

ドメイン名をgithub1s.comに変えてあるだけです。
元はこれ。
https://github.com/Naohiro2g/pygame_mcpi_LCD_7seg/blob/master/demo_LCD_font_PG.py


# 1sは、1 second
1秒でVS Codeオンライン版みたいにコードを読めるよ、と。

<a href="https://github.com/conwnet/github1s"><img src="https://github-link-card.s3.ap-northeast-1.amazonaws.com/conwnet/github1s.png" width="460px"></a>

VS Codeのオープンソース版code-oss(1.52.1)とGitHub REST APIを使って、ブラウザでGitHubのコードを読みやすくするサービス。

**恐ろしい子。あとは、マークダウンが変換できれば最強だな。**
**追記2022-12-17：マークダウン、ちゃんとプレビューできるようになってる！**

MicroPythonのSSD1306ドライバーはこうなってるよ、とか。紹介できる。
https://github1s.com/micropython/micropython/blob/HEAD/drivers/display/ssd1306.py
非同期通信

非同期通信について説明されたURL
https://wa3.i-3-i.info/word1624.html
![スクリーンショット 2021-02-12 2.03.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1050099/bd92b6b7-8ec5-0d12-30d8-695a78a83b5b.png)
git reset --hardしても消えないものの話。

git reset --hardでfirst commitに戻ったのにsrcディレクトリが残ってる、、

中身を覗いたたら、pythonのegg-infoがずらずらと。。
.gitignoreしているファイルは、reset --hardしても消えないんですね。。

びっくりしました。。
そんだけ。