OmniAICreator/Qiita-1.07M huggingface dataset:
【Vue.js】監視プロパティ 単位変換アプリ（例題）

#はじめに
こんにちは！
今回は【Vue.js】監視プロパティを使った単位変換アプリについてアウトプットしていきます！

#書き方・解説
長さkm,m,mmを相互変換するアプリを制作します。

```HTML:HTML
<div id="app">
  <p>
    <input type="text" v-model:value="km">km
  </p>
  <p>
    <input type="text" v-model:value="m">m
  </p>
  <p>
    <input type="text" v-model:value="mm">mm
  </p>
</div>
<!--それぞれのテキストを作り、双方向データバインディングで紐つける-->
```
```Vue.js
var app = new Vue({
  el: "#app",
  data: {
    //⏬初期値はそれぞれ０とする
    km: 0,
    m: 0,
    mm: 0
  },
  watch: {
    //⏬kmの値が変更されたら以下の処理が実行される。
    km: function(value) {
      this.km = value
      this.m = value * 1000 //kmの1000倍の値
      this.mm = value * 1000000 //kmの1000000の値
    },
    //⏬mの値が変更されたら以下の処理が実行される。
    m: function(value) {
      this.km = value / 1000 //mの1000分の1の値
      this.m = value
      this.mm = value * 1000 //mの1000倍の値
    },
    //⏬mmの値が変更されたら以下の処理が実行される。
    mm: function(value) {
      this.km = value / 1000000 //mmの1000000分の1の値
      this.m = value / 1000 //mmの1000分の1の値
      this.mm = value
    }
  }
})
```

記述の仕方は至って前回と一緒です。dataに情報を入れ、watchで変化が起こった時の処理を記述します。

kmテキストの値を変更すると、
![スクリーンショット 2021-10-19 20.35.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2114750/277bd77a-969c-853c-dbce-0cfe7fab86e6.png)

mテキストの値を変更すると、
![スクリーンショット 2021-10-19 20.35.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2114750/a9e3230b-6cea-f2fd-40d6-6cd237be6fe6.png)

mmテキストの値を変更すると、
![スクリーンショット 2021-10-19 20.36.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2114750/a1acc693-67eb-d0d2-b108-913f3f0cf884.png)

このようにwatchで記述された処理が、双方向データバインディングにより同期されテキストに表示されました。



#最後に
今回は単位変換アプリ制作をアウトプットしました。
今回の記事を読んで質問、間違い等あればコメント等頂けると幸いです。

今後ともQiitaにてアウトプットしていきます！

最後までご愛読ありがとうございました！
Linuxについて [プロセス管理]　

## プロセスとは

実行中のプログラム、つまりアプリケーションを管理する単位
コマンドインタープリターであるシェル自身もプロセスである

* fork
  シェルは子プロセスとして自分の分身を作ること

* exec
  シェルは子プロセスにコマンド実行を任せる

#### プロセスの基本的な状態遷移  

1.ユーザがシェルからコマンド実行
2.fork
3.exec
4.子プロセスの終了待ち
5.子プロセスはコマンドの実行を終える
6.実行を終えると親プロセスに終了を伝え消滅
7.親プロセスは子プロセスの終了を受け取りシェルプロンプトを表示
8.ユーザの次のコマンドに備える

## スケジューリング


Linuxは**マルチユーザ**、**マルチタスク**のOSである
つまり１つのCPUで複数のユーザが同時にログインでき、プロセスを同時に実行できる

各プロセスはLinuxの**スケジューラ**によって管理されている

#### ラウンドロビン方式

1.各プロセスはRun Queueという待ち行列で待機しCPUを使える順番を待つ
2.自分の番で処理を一定時間（タイムスライス）進められる
3.一定時間を過ぎるとキューで次のCPUの番になる

このスケジューリングをラウンドロビン方式という

プロセスによっては**優先度が高いもの**があり、そのパラメータとして**Nice値**がある
-20（最も優先度が高い）〜19（最も優先度が低い）まで


## フォアグランドジョブとバックグラウンドジョブ

* ジョブ

　　  シェルが管理するプログラムの単位

シェルからコマンドを実行するときに、ジョブを**フォアグラウンド**と**バックグラウンド**に切り替える
機能がある
処理のかかるジョブの終了を待つのではなく、別の作業ができるようにジョブをバックグラウンドで実行
すれば同じ端末から別のコマンドを実行できるようになる

## プロセスID

Linuxのプロセスには一意のIDであるプロセスID（PID）が付与される
また、自分のPIDは$$で取得可能

~~~
$ echo $$
00000
~~~

#### ps [オプション]

実行中のプロセスのスナップショットを表示

オプション|意味
-|-
-A|すべてのプロセスを選択。-eと等しい
e|コマンドの後に環境を表示する
l,-l|長いフォーマット。-のあるなしで表示は異なる
w,-w|出力幅を広げる。このオプションを２つ指定すると幅の制限がなくなる


### シグナル

シグナルをを使いプロセスを制御する

シグナル番号|シグナル名|意味
-|-|-
1|HUP|ハングアップ
2|INT|割り込み
3|QUIT|強制停止。コアダンプ生成
9|KILL|強制終了
15|TERM|終了。killコマンドのデフォルトシグナル

#### シグナルの送信方法

* シェルに割り当てられたキーの入力
* kill コマンド
* プログラムでkill()関数を呼ぶ

## プロセス間通信

Linux上で処理を完了するのに１つにプロセスで完了したり、複数のプロセスが同期したり動作を変更して達成することがある
これを**プロセス間通信**という

パイプ、シグナルはプロセス間通信の手法である

### プロセス間通信の手法

名前|特徴
-|-
パイプ|１つのプロセスの標準入出力をつなぎかえる
シグナル|特定のシグナルの受信を持って特定の処理を開始
共有メモリ|特定のメモリ領域を複数のプロセスで共有することでメッセージの受け渡しが可能
セマフォ|資源のロックを行い、複数のプロセス間で同時に書き込みをしないよう排他処理を実現
メッセージキュー|キューにメッセージを格納し複数のプロセス間での非同期の通信を実現
ソケット|ネットワーク経由のホスト感のプロセスでの通信を実現

>参考書籍

>>『Linux標準教科書 v3.0.2』 LPI-Japan 2019年
Vuetify ブレークポイントサービス使い方メモ

Vuetifyにはブレークポイントサービスというものがあり、ブレークポイントに応じて表示の出し分けや、プロパティの値を変更することができます。

そのサービスでよく使用したものを紹介します。

## `$vuetify.breakpoint.name`

$vuetify.breakpointの `name` プロパティは、現在アクティブなブレークポイントの名前（xs、sm、md、lg、xl）を受け取ることができます。

```jsx
name: string
```

### 使い方

ブレークポイントによってプロパティの値を変更

```jsx
<template>
  <v-card :height="height">
    ...
  </v-card>
</template>

<script>
  export default {
    computed: {
      height () {
        switch (this.$vuetify.breakpoint.name) {
          case 'xs': return 220
          case 'sm': return 400
          case 'md': return 500
          case 'lg': return 600
          case 'xl': return 800
      },
    },
  }
</script>
```

## `$vuetify.breakpoint.ブレークポイント名（xs、sm、md、lg、xl）`

ビューポートに応じて、各ブレークポイントがアクティブな状態かを判定します。

```jsx
xs: boolean
sm: boolean
md: boolean
lg: boolean
xl: boolean
```

### 使い方

ブレークポイントが`lg`だったら要素を表示、それ以外は非表示

```jsx
<h2 v-show="$vuetify.breakpoint.lg">
	Title
</h2>
```

ブレークポイントが`xs`だったらheightを100に、それ以外はheightを200に設定

```jsx
<v-card :height="$vuetify.breakpoint.xs ? 100 : 200">
	Title
</v-card>
```

## `$vuetify.breakpoint.mobile`

現在のビューポートがmobile-breakpointオプション（md以下）よりも大きいか小さいかに応じて、trueまたはfalseが返ります。

### 使い方

モバイル時に要素を表示

```html
<h2 v-show="$vuetify.breakpoint.mobile">
	mobile
</h2>
```

画面サイズに応じてプロパティの値を変更

```html
<v-carousel
  :hide-delimiters="$vuetify.breakpoint.mobile ? true : false"
>
```

## `$vuetify.breakpoint.ブレークポイント名AndDown`

現在のビューポートが指定のブレークポイント以下であれば`true` それ以外は`false` が返ります。

```jsx
smAndDown: boolean
mdAndDown: boolean
lgAndDown: boolean
```

### 使い方

ブレークポイントがmd以下の時に要素を表示

```jsx
<h2 v-show="$vuetify.breakpoint.mdAndDown">
	Title
</h2>
```

## `$vuetify.breakpoint.ブレークポイント名AndUp`

現在のビューポートが指定のブレークポイント以上であれば`true` それ以外は`false` が返ります。

```jsx
smAndUp: boolean
mdAndUp: boolean
lgAndUp: boolean
```

### 使い方

ブレークポイントがmd以上の時に要素を表示

```jsx
<h2 v-show="$vuetify.breakpoint.mdAndDown">
	Title
</h2>
```

## 参考

[Display Breakpoints](https://vuetifyjs.com/ja/features/breakpoints/#section-30d630ec30fc30af30dd30a430f330c830b530fc30d330b9)
【Java】演算子について簡単にまとめ


# 式の構成要素
- **リテラル**は **オペランド** の一種であり、数字「5」や文字列「Hello World」など、具体的な値のことを指す。
- オペランドは「演算子で操作される値」のことであり、日本語では「被演算子」である。変数、定数、リテラルが含まれる。
- `b = a + 5` という式があったとして、式を構成する要素は二つに分けられる。変数の`b` や`a`、値の `5` にあたる **オペランド** 、`=`や`+`にあたる **演算子** である。すべての式はこの二つの要素で構成される。

# 演算子
- 式に演算式が複数ある場合、優先順位の高い演算子から順に評価される。`評価`とは、Javaが式に従って計算処理をすることである。
優先順位は15段階。`()`で式を囲むことによって、その部分だけ優先順位を引き上げることができる。
- 同じ優先順位の演算子が2つ以上ある場合は、「結合規則の原則」を当てはめて考える。これは、演算子ごとに決められた「方向」から順に評価されるものである。

- 四則演算を行うための演算子は、 **算術演算子** と呼ばれる。

|演算子|機能|優先順位|評価の方向|
|----|---|---|---|
|`+`|加算|中(5)| 左 → 右 |
|`-`|減算|中(5)| 左 → 右 |
|`*`|乗算|高(4)| 左 → 右 |
|`/`|除算|高(4)| 左 → 右 |
|`%`|剰余|高(4)| 左 → 右 |

- 右オペランドの内容を左オペランドの変数に代入する演算子は **代入演算子** と呼ばれる。

|演算子|機能|優先順位|評価の方向|
|----|----|----|----|
|`=`|右辺を左辺に代入|最低(15)|右 → 左|
|`+=`|左辺と右辺を加算して左辺に代入|最低(15)|右 → 左|
|`-=`|左辺と右辺を減算して左辺に代入|最低(15)|右 → 左|
|`*=`|左辺と右辺を乗算して左辺に代入|最低(15)|右 → 左|
|`/=`|左辺と右辺を除算して左辺に代入|最低(15)|右 → 左|
|`%=`|左辺と右辺を除算し、その余りを左辺に代入|最低(15)|右 → 左|

- 対象の値を一つ増やす演算子を **インクリメント演算子** 、減らす演算子を **ディクリメント演算子**と呼ぶ。また、これらの演算子のように一つしかオペラントを持たない演算子のことを、 **単項演算子**と呼ぶ。

|演算子|機能|優先順位|評価の方向|
|---|---|----|-----|
|`++`|値を1増やす|最高(1)| 左 → 右 |
|`--`|値を1減らす。|最高(1)| 左 → 右 |

- インクリメント演算子はオペランドの前にも後にもつけることができる。（ただし、他の演算子と一緒に利用すると結果に微妙な違いが生じるため、単独で使うようにする。）


# 参考書籍
スッキリわかるJava入門
【Nuxt.js・TailwindCSS】ハンバーガーメニューの実装

#はじめに
こんにちは。
こちらの記事では、TailwindCSSを用いてハンバーガーメニューを実装する方法を記しています。
誤っている点がございましたらコメントいただけると幸いです。

##実装手順
ハンバーガーメニューの実装には、SVGを使う方法やspanタグを使う方法などがありますが、今回はspanタグで実装してみます。

###1. 雛形の作成
雛形となるボタンを作成する。

```vuejs:myHeader.vue
  <div class="flex justify-between items-center">
    <h1>Title</h1>
    <button>
      <span></span>
      <span></span>
      <span></span>
    </button>
  </div>
```

###2. ハンバーガーメニューの初期値の設定
`isOpen`の真偽値によって、ハンバーガーメニューのクリックで開閉を行えるよう、初期値をfalseで設定する。

```javascript
<script>
export default {
  data() {
    return {
      isOpen: false
    }
  }
}
</script>
```

###3. 開閉の処理の記述
ボタンをクリックすると、`v-on:click="isOpen = !isOpen"`が実行されて真偽値が切り替わる。
spanタグ内の`v-bind:class="isOpen ? 'trueの処理' : 'falseの処理'`によって、ハンバーガーになったりバツに変化する。


```vuejs:myHeader.vue
<div class="flex justify-between items-center">
    <h1>Title</h1>
    <button　@click="isOpen = !isOpen" class="relative md:hidden h-5 w-6">
      <span :class="isOpen ? 'transform rotate-45 top-2 w-7 transition duration-300' : 'top-0 w-6'" 
             class="h-1 inline-block transition-all absolute right-0 bg-black"></span>
      <span :class="isOpen ? 'hidden' : 'top-2 w-6'" 
             class="h-1 inline-block transition-all absolute right-0 bg-black"></span>
      <span :class="isOpen ? 'transform rotate-45 top-2 w-7 transition duration-300' : 'top-4 w-6'" 
             class="h-1 inline-block transition-all absolute right-0 bg-black"></span>
    </button>
</div>
```

<img width=“200” src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/966101/873ab20c-9690-08fd-d7d8-5249a59616d7.png">


<br>


#おわりに
ここまでハンバーガーメニューの実装についてまとめました。
Tailwindでの実装は公式サイトを参考に進めているのですが、少しずつCSSプロパティの感覚が掴めてきました！今後もアプリ開発を通して実装の幅を広げられるよう、コツコツ進めていきます！
以上、最後まで読んでいただきありがとうございました！
tzinfo-dataのエラー解消について

bin/bundle installしたらこうなった
![スクリーンショット 2021-10-27 20.49.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381701/62e2ff93-3e82-7d85-5ee9-ffe6d85bb2cf.png)

gemfile
Gemfileのtzinfo-data行のplatforms: [:mingw, :mswin, :x64_mingw, :jruby]を削除し、bin/bundle installしたらこの警告は消えた
Larabelのcolumn-sortableを使い方

#はじめに
Larabelのcolumn-sortableの初歩的な使い方をまとめます。


#環境
・PHP 8.0.1
・Laravel 8.40.0

#tableの構造

```
class CreateArticlesTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('articles', function (Blueprint $table) {
            $table->id();
            $table->string('title');          // タイトル
            $table->text('note')->nullable(); // 内容
            $table->integer('user_id');       // 登録ユーザー
            $table->timestamps();
        });
    }

```

```
class CreateArticleTypesTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('article_types', function (Blueprint $table): void {
            $table->id();
            $table->foreignId('article_id')->constrained();
            $table->string('type');
            $table->timestamps();
        });
    }
```


#sortableをcomposerでインストールする

```
composer require kyslik/column-sortable
```

#コンフィグファイルを設定する
```
php artisan vendor:publish --provider="Kyslik\ColumnSortable\ColumnSortableServiceProvider" --tag="config"
```

#モデル側のリレーション
1対1でのリレーションとする。

```
class Article extends Model
{
    use HasFactory;

    protected $fillable = ['title', 'note'];

    public function articleType()
    {
        return $this->hasOne(ArticleType::class);
    }
}
```

#コントローラー
クエリにsortableをつける

```
class ArticleController extends Controller
{
    public function index()
    {
        $articles = Article::with(['articleType'])->sortable()->get();

        return view('top', ['articles' => $articles]);
    }
}
```

#モデル側にSortableの設定とソートするフィールドを設定する

```
use Kyslik\ColumnSortable\Sortable;

class Article extends Model
{
    use HasFactory;
    use Sortable;

    protected $fillable = ['title', 'note'];

    protected $sortable = ['title', 'note'];

    public function articleType()
    {
        return $this->hasOne(ArticleType::class);
    }
}
```

#ビュー(blade)

```
<table>
    <tr>
        <td class="title">@sortablelink('title', 'タイトル')</td>
        <td class="note">@sortablelink('note', '内容')</td>
        <td class="type">種別</td>
        <td>編集</td>
        <td>削除</td>
    </tr>
```

#リレーション先テーブルのフィールドのソートについて
一覧でリレーション先テーブルのフィールドをソート項目を使いたい場合、現段階ではテーブルをJOINしてソートする方法しかなさそうです。
（他に良い方法をご存知であればコメント頂けると幸いです。。。）

```
class Article extends Model
{
    use HasFactory;
    use Sortable;

    protected $fillable = ['title', 'note'];

    protected $sortable = ['title', 'note'];

    public function articleType()
    {
        return $this->hasOne(ArticleType::class);
    }

    public function typeSortable($query, $direction)
    {
        return $query->leftJoin('article_types', 'article_types.article_id', '=', 'articles.id')
              ->select('articles.*')
              ->orderBy('article_types.type', $direction);
    }
}
```

・ビュー

```
<table>
    <tr>
        <td class="title">@sortablelink('title', 'タイトル')</td>
        <td class="note">@sortablelink('note', '内容')</td>
        <td class="type">@sortablelink('type', '種別')</td>
        <td>編集</td>
        <td>削除</td>
    </tr>
```
Rails database.yml | MySQL PostgreSQL

Rails database.yml | MySQL PostgreSQL

https://www.mysql.com/jp/

```database.yml
# 
# Install the MYSQL driver
#   gem install mysql2
#
# Ensure the MySQL gem is defined in your Gemfile
#   gem 'mysql2'
#
# And be sure to use new-style password hashing:
#   http://dev.mysql.com/doc/refman/5.0/en/old-client.html
development:
  adapter: mysql2
  encoding: utf8
  reconnect: false
  database: sample_mysql_development
  pool: 5
  username: root
  password:
  socket: /tmp/mysql.sock

# Warning: The database defined as "test" will be erased and
# re-generated from your development database when you run "rake".
# Do not set this db to the same as development or production.
test:
  adapter: mysql2
  encoding: utf8
  reconnect: false
  database: sample_mysql_test
  pool: 5
  username: root
  password:
  socket: /tmp/mysql.sock

production:
  adapter: mysql2
  encoding: utf8
  reconnect: false
  database: sample_mysql_production
  pool: 5
  username: root
  password:
  socket: /tmp/mysql.sock
```

https://www.postgresql.org/

```database.yml
# PostgreSQL. Versions 8.2 and up are supported.
#
# Install the pg driver:
#   gem install pg
# On Mac OS X with macports:
#   gem install pg -- --with-pg-config=/opt/local/lib/postgresql84/bin/pg_config
# On Windows:
#   gem install pg
#       Choose the win32 build.
#       Install PostgreSQL and put its /bin directory on your path.
#
# Configure Using Gemfile
# gem 'pg'
#
development:
  adapter: postgresql
  encoding: unicode
  database: sample_postgres_development
  pool: 5
  username: root
  password:

  # Connect on a TCP socket. Omitted by default since the client uses a
  # domain socket that doesn't need configuration. Windows does not have
  # domain sockets, so uncomment these lines.
  #host: localhost
  #port: 5432

  # Schema search path. The server defaults to $user,public
  #schema_search_path: myapp,sharedapp,public

  # Minimum log levels, in increasing order:
  #   debug5, debug4, debug3, debug2, debug1,
  #   log, notice, warning, error, fatal, and panic
  # The server defaults to notice.
  #min_messages: warning

# Warning: The database defined as "test" will be erased and
# re-generated from your development database when you run "rake".
# Do not set this db to the same as development or production.
test:
  adapter: postgresql
  encoding: unicode
  database: sample_postgres_test
  pool: 5
  username: sample_postgres
  password:

production:
  adapter: postgresql
  encoding: unicode
  database: sample_postgres_production
  pool: 5
  username: sample_postgres
  password:
```


https://edgeguides.rubyonrails.org/configuring.html
https://qiita.com/ryouya3948/items/ba3012ba88d9ea8fd43d
https://www.javadrive.jp/rails/model/index2.html
何も考えずにBlender2.93.5からUnreal Engine 4.27.1に自作オブジェクトを導入

Unreal Engine初心者の普通のプログラマーsyntanです。
Blender触るの久々だなあとなりつつモデルを作成、Unreal Engine 4に入れるのにプラグイン入れたりひと悶着あるんだろうなあと思いつつ、ペッとモデルを入れてみたらするっと入ってくれました。あら便利…

# 前提環境
* Windows 10
* Unreal Engine 4.27.1
* Blender2.93.5

# モデル
会津名物起き上がりこぼしを作成してみました。
頭が黒、眉目口、胴が色付き（赤がスタンダード）、おしりが白
とてもシンプルでテストにもってこいですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/673394/d0f4e134-7c32-dd87-d6f9-c804f4c00053.png)

# Blenderからエクスポート
ファイル > エクスポート > FBX
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/673394/7227776f-f7a0-ca04-03c2-c75aef4d91b7.png)

エクスポート設定は以下のような感じ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/673394/3dff1e18-24b4-b389-73dd-d7b7b64d783c.png)
もしかすると、もっと便利な設定があるかもですが、とりあえずこれで導入可能だったのでそのまま行きます。

# Unreal Engineにインポート
Unreal Engineのコンテンツブラウザにfbxファイルをドラッグ＆ドロップすると、画像のようにインポートオプションが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/673394/080518b1-ade7-8e48-cfa1-ea24ba1681d7.png)
何も考えずに「全てインポート」

メッシュとテクスチャとマテリアルが導入されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/673394/816e3e21-ed25-255e-4666-14faca26d971.png)

モデルをシーンに配置すると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/673394/41619fbe-c356-ecef-94f8-65629fb025b8.png)
起き上がりこぼしがUnreal Engineの世界に現れました。
これでこの地は会津地方であることを主張できますね。
めでたしめでたし…

# 蛇足
一回目のドラッグ＆ドロップした時には、テクスチャが読み込まれず色塗り前の真っ白な起き上がりこぼしが出現しましたが、二回目では同時に読み込まれました。おそらくBlenderからテクスチャを別名書き出ししていなかったせいですね。

一回目のドラッグ＆ドロップのものは、別名書き出し下テクスチャ画像をUnreal Engineにコンテンツブラウザ読み込み。コンテンツブラウザのテクスチャをUnreal Engine内のモデルファイルへドラッグ＆ドロップすることでテクスチャの設定が出来ました。

もしかして、Blenderでの設定を再現するだけでなく、テクスチャの張り替え自体テクスチャ画像をモデルへドラッグ＆ドロップでできて、とても簡単なのでは…と思い青色に塗り替えたテクスチャを作成し、ドラッグ＆ドロップしたところ…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/673394/bf0b9816-68cf-576f-ef2c-8a9e23e4579e.png)
簡単に出来ました。すばらしい…

# 終わり
リグが入った複雑なモデルだとまた色々違うかもしれませんが、静的なオブジェクトの導入はサクッと可能のようです。メッシュとテクスチャだけ準備して、どんどんUnreal Engineへ導入、マテリアルとライティングの調整をして撮影、というのがとても捗りそうです。
SQLの複数テーブルの結合をおさらいしてみた(2)

#左外部結合
前回（[SQLの複数テーブルの結合をおさらいしてみた(１)](https://qiita.com/tomoki12/items/ed766f3c5707f1fbd847)）で結合条件の列がNULLの場合や値がない場合は結合結果から除外すると説明しました。しかし、NULLの場合や値がない場合でも結果として出力する方法があります。その一つにまずは左外部結合からご紹介します。まずはコードを見てみましょう。

```SQL:sql
SELECT ~ FROM 左表
LEFT JOIN 右表
ON 結合条件
```
今下記コードを実行した場合

```SQL:sql
SELECT * FROM 家計簿
LEFT JOIN 費目
ON 家計簿.費目ID = 費目.ID
```

![スクリーンショット 2021-10-27 19.00.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1265227/3cb09bbc-232f-2ba3-2ad3-6abfcc079b8b.png)

費目IDが費目テーブルにない値、またはNULLであっても上記のように出力結果として取り出すことができます。（仮に左表の結合条件がNULLの場合、リストに抽出される右表の列は全てNULLになります。）

また右表の全行を全て出力する場合は右外部結合になります。コードは下記のようになります。

```SQL:sql
SELECT ~ FROM 左表
RIGHT JOIN 右表
ON 結合条件
```

左外部結合とLEFT→RIGHTに変わっただけですね。
また、左右表の全て出力する場合は完全外部結合になります。

```SQL:sql
SELECT ~ FROM 左表
FULL JOIN 右表
ON 結合条件
```

今紹介した３つはいずれも本来出力結果から消滅する行を出力する効果があり、総称して外部結合といいます。

###コラム
MySQLやMariaDBでは完全外部結合FULL OUTER JOINは使えません。これらの場合UNION演算にを使用することで解決できます。

```SQL:sql
SELECT ~ FROM 左表
FULL JOIN 右表
ON 結合条件
UNION
SELECT ~ FROM 左表
RIGHT JOIN 右表
ON 結合条件
```

LEFT　JOINとRIGHT　JOINの両方法で出力した後にNUIONによって足し合わせるイメージになります。

#SELF JOIN（自己結合）
RDMSでは自分自身と結合することが可能です。一般的にそのような結合を自己結合といいます。
例えば下記のようなケースを見てみましょう![スクリーンショット 2021-10-27 19.53.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1265227/ca7b8dbf-85d1-8cb3-fd39-9d8a6bd65075.png)

このテーブルから自己結合をすることで好きな人の部活がわかるようになります。
自己結合のイメージとしては元のテーブルを複製して、そこから結合するイメージをもつとわかりやすいです。

![スクリーンショット 2021-10-27 20.02.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1265227/b04f0550-2ce8-ecd9-9835-cbfa6b7f6689.png)

コードで表すと

```SQL:sql
SLECT クラス.名前, クラス.部活, クラス.好きな人, クラス（複製）.部活 AS 好きな人の趣味
FROM クラス
LEFT JOIN クラス AS　クラス（複製）
ON クラス.好きな人 = クラス（複製）.名前
```
上のコードでのポイントはAS　クラス（複製）です。自分自身のテーブル名をASで別名にすることであたかも２つの別テーブルを用意したかのように扱うことができるのです。

##参考
書籍： スッキリわかるSQL入門 第2版 ドリル222問付き！　
　　　 中山 清喬　著/飯田 理恵子　著

「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典：https://wa3.i-3-i.info/word15317.html
「ゼロからのOS自作入門」環境構築

# この記事は何か
これは、Ojunが「ゼロからのOS自作入門」を進めていく記事である。目的は、詰まった時に見返すこと、アウトプットをすること。また、詰まった人がこれを見て解決できたらいいなと。

# 結論
Docker + VSCodeを用いて環境構築ができた。

# VSCodeとは
Microsoftが開発したエディターである。豊富な拡張機能があり、使いやすい。

# Dockerとは
IT業界では、「環境の違い」に悩まされることが多く、特にOS開発など低レイヤ分野では、その影響が著しい。少し環境が違えば、「正しいコードを書いているのに」動かないこともしばしば。これを解決するのが[Docker](https://www.docker.com/)である。
Dockerとは、いわばパソコンの中に開発用の小さなパソコンを作る仕組みである。どんなOSを使っていても、Dockerを使えば全く同じ環境で作業ができる。私は[Docker for Windows](http://docs.docker.jp/docker-for-windows/install.html)を用いている。Dockerをどうやって使うかは、ネットの記事を参照されたい。

# 手順
まず、VSCode拡張機能「remote」をインストールする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/608348/d6b7c3a7-4d78-22af-d90b-c2e84fdeb8d6.png)

次に、コンテナイメージをダウンロードする。「コンテナ」とは、パソコンの中で動く小さなパソコンのことを言う。「コンテナイメージ」とは、コンテナを作るための設計図である。
まず、[このリポジトリ](https://github.com/sarisia/mikanos-devcontainer)の右上の、"Use this template"をクリックする。そうするとリポジトリがフォークされる。
リポジトリがフォークされたら、git cloneでローカルにもってくる。

```
git clone https://github.com/(自分のユーザー名)/mikanos-devcontainer
```

次に、コンテナをビルドする。「ビルド」とは、コンテナイメージ、すなわち設計図からコンテナを作る作業である。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/608348/337131c6-a969-63c3-76f8-64598a2ec1fc.png)
拡張機能Remoteをインストールしていれば、右下に"><"のようなマークが表示されているだろう。それをクリックし、"Open folder in container"を選択する。私はもうビルドしてしまったので分からないが、"Open folder in container"を選択すればビルドができるはずである。

以上で、環境構築が終了した。

# 感想
DockerはWeb製作の分野で使っていたのだが、OSを作るとなるとやはりその利便性が肌で感じられた。これから少しずつOS作りを進めていきたい。
gulpを使い回す方法

```
export PATH="/Users/＊＊＊/.npm-global/lib/node_modules/bin:$PATH"

source ~/.bash_profile
```

gulpは一度設定すれば、使い回し可能です。
使い回しの方法
1.　gulp.js pachage.jsonを別のプロジェクトフォルダにコピペする

2.以下のコードを実行
```
npm install
```

これだけでOK

⚠️納品時はnode_modulesを入れない
Python multiprocessing

# Python multiprocessing で CPU 論理コア総動員で処理させる

## 環境  
- Ubuntu 18.04.4 LTS / Python 3.6.8
- macOS Monterey 12.0.1 / Python 3.8.5


multiprocessing は Python に最初から入っているパッケージなので、別途 install 不要。

### 論理コア数 確認
```
import multiprocessing
multiprocessing.cpu_count()
```

### 時間のかかる処理を並列で実行するテンプレ
`論理コア数12の場合`

```
import multiprocessing

def run(process_count, process):

    if process == 0:
        print('completed', process)
    elif process == 1:
        print('completed', process)
    elif process == 2:
        print('completed', process)
    elif process == 3:
        print('completed', process)
    elif process == 4:
        print('completed', process)
    elif process == 5:
        print('completed', process)
    elif process == 6:
        print('completed', process)
    elif process == 7:
        print('completed', process)
    elif process == 8:
        print('completed', process)
    elif process == 9:
        print('completed', process)
    elif process == 10:
        print('completed', process)
    elif process == 11:
        print('completed', process)

def wrapper(args):
    return run(*args)

def multi_process(argument_list):
    pool = multiprocessing.Pool(multiprocessing.cpu_count())
    pool.map(wrapper, argument_list)
    pool.close()

if __name__ == '__main__':
    process_count = multiprocessing.cpu_count()
    argument_list = [(process_count, i) for i in range(process_count)]
    multi_process(argument_list)
```

大量データに総動員で FFT を実行した時
` $ htop`
![スクリーンショット 2021-10-27 18.08.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1289687/61822311-22fa-cae1-d49e-5338b4819029.png)


CPU の温度に注意
` $ watch sensors`
![スクリーンショット 2021-10-27 18.13.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1289687/877b2491-9a1a-9622-cd86-ab7e377c536b.png)
Python初学者のまとめ：環境構築編

#本体のインストール
###■Windows10
1. [公式サイト](https://www.python.org/)よりダウンロード
![スクリーンショット 2021-10-27 192111.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271417/0b480dd4-3413-9c13-852f-de6c23da7da3.png)

2. Add Python 3.x to PATHにチェックを入れてInstall Now押す

![スクリーンショット 2021-10-27 192915.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271417/9c727c57-a772-2512-e53c-18ff744d2407.png)
3. 確認

デフォルトでは`C:\Users\{ユーザ名}\AppData\Local\Programs\Python`にインストールされる

```plaintext:
C:\Users\r>python --version
Python 3.10.0
```

#Jupyter Notebookインストール

```plaintext:
pip install --upgrade pip

pip install notebook
```
`C:\Users\{ユーザ名}\AppData\Local\Programs\Python\Python310\Scripts`配下にインストールされる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271417/0c280df6-2188-2a73-563f-151331f39feb.png)

#Visual Studio Code拡張機能インストール

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271417/0f55034d-36f6-f185-13d5-33c233e22ccc.png)

#実行

実行ファイル

```python:hello.py
print ("Hello, Python")
```

実行結果

```plaintext:
D:\prj_python>python hello.py
Hello, Python
```
【RSpec】shared_examplesを使ってリファクタリング

##環境
Ruby 3.0.2
Rails 6.1.4.1


##リファクタリング前

yearの値が複数に条件分岐するテスト。
コードはほぼ同じでyearの値とメソッド実行した返り値が異なるだけなので
shared_examplesを使ってコードをまとめたい。

```spec.rb
describe '#get_post_count_for_year' do
  context 'yearが0のとき' do
     let!(:year) { 0 }
     it '10を返す' do
        expect(Post.get_post_count_for_year(year)).to eq 10
     end
  end
  context 'yearが１のとき' do
     let!(:year) { 1 }
     it '20を返す' do
        expect(Post.get_post_count_for_year(year)).to eq 20
     end
  end
...
end
```

##リファクタリング後

```spec/support/contexts/post_count.rb
RSpec.shared_examples :post_count do
  it '正しい値を返すこと' do
    expect(Post.get_post_count_for_year(year)).to eq result
  end
end
```

```spec.rb
describe '#get_post_count_for_year' do
  context 'yearが0のとき' do
    let!(:result) { 10 }
    it_behaves_like :post_count
  end
  context 'yearが1のとき' do
    let!(:result) { 20 }
    it_behaves_like :post_count
  end
...
end
```


##参考

https://qiita.com/outerlet/items/27520b9916daab7eae1a
Swiftでマテリアルなデザインのボタンを実装

Swiftでマテリアルなデザインを実装するコード。

## 完成イメージ

![スクリーンショット 2021-10-27 19.34.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/522445/9854481b-3c88-11f5-f009-b28e05fcd32e.png)

枠線と影がついていて思わずタップしたくなるようなデザイン。

## 実装するコード

```swift
let LoginButton: UIButton = UIButton()
LoginButton.frame = CGRect(x:100, y:200, width:100, height:50)
LoginButton.backgroundColor = UIColor.hex(string: "#ffffff", alpha: 1)
LoginButton.setTitle("ログインする", for: UIControl.State.normal)
LoginButton.setTitleColor(UIColor.hex(string: "#206CE4", alpha: 1), for: UIControl.State.normal)
LoginButton.titleLabel?.font = UIFont.boldSystemFont(ofSize: 16)
LoginButton.layer.cornerRadius = 10
LoginButton.layer.shadowOffset = CGSize(width: 1.0, height: 1.0 )
LoginButton.layer.shadowOpacity = 0.3
LoginButton.layer.shadowRadius = 3
LoginButton.layer.shadowColor = UIColor.black.cgColor
LoginButton.layer.borderColor = UIColor.hex(string: "#206CE4", alpha: 1).cgColor
LoginButton.layer.borderWidth = 3
self.view.addSubview(LoginButton)
```
frameはご自由に設定してください。

注意点としては色コードで操作するためにUIColorのextensionを作成してあります。

extensionのコードは以下の通り。

```swift
extension UIColor {
    class func hex ( string : String, alpha : CGFloat) -> UIColor {
        let string_ = string.replacingOccurrences(of: "#", with: "")
        let scanner = Scanner(string: string_ as String)
        var color: UInt32 = 0
        if scanner.scanHexInt32(&color) {
            let r = CGFloat((color & 0xFF0000) >> 16) / 255.0
            let g = CGFloat((color & 0x00FF00) >> 8) / 255.0
            let b = CGFloat(color & 0x0000FF) / 255.0
            return UIColor(red:r,green:g,blue:b,alpha:alpha)
        } else {
            return UIColor.white;
        }
    }
}
```
こちらのextensionは以下のサイトから引用しています。

https://program-life.com/493

## おすすめ情報

https://wagtechblog.com/programing/swift-iphone-application-school

https://wagtechblog.com/programing/swift-textbook.html
クレデンシャル情報 とは

## 勉強前イメージ

credentialが証明書のような意味だから、
何かを認証するような情報ってことかな

## 調査

### クレデンシャル情報 とは

英語では資格・経歴、認定書などの意味を持つ英語で
情報セキュリティでは認証などに用いる情報を指します。

`認証などに用いる情報` というのは
サービスを利用するために必要となる認証情報を指し、
IDやパスワードなどユーザ認証で必要なものからEC2やs3などアクセスキーやシークレットキーもクレデンシャル情報になります。
また、クラウドの情報だけではなくオンプレのsshの鍵やADのユーザ情報もそれに当たります。

テキストレベルの情報もそうですが、
生体認証では指紋や眼球の虹彩などもこちらに当たります。

## 勉強後イメージ

認証のために使われるならなんでもクレデンシャル情報になり得るってことかな

## 参考

- [クレデンシャル](https://www.f5.com/ja_jp/services/resources/glossary/credential)
- [クレデンシャル 【credential】](https://e-words.jp/w/%E3%82%AF%E3%83%AC%E3%83%87%E3%83%B3%E3%82%B7%E3%83%A3%E3%83%AB.html)
AWS CodeCommit にSSHでgit接続できないやんけ問題

# 💣問題
超絶ドザなのでWindowsに git 2.33.1 をインストールしている。
AWS CodeCommit から SSH で Cloneしようとすると、何か怒られるではないか。

```
Unable to negotiate with 52.12.34.56 port 22: no matching host key type found.
Their offer: ssh-rsa
fatal: Cloud not read from remote repository.

Please make sure you have to the correct access rights and the repository exists.
```
ばかなと思ってみんな大好き亀さんで試すと普通にCloneできた。ばかな。

# 😇対処
`~/.ssh/config` を以下の感じにしよう

```
Host git-codecommit.*.amazonaws.com
    User hogehogemoge
    IdentityFile ~/.ssh/id_rsa
    HostKeyAlgorithms +ssh-rsa
    PubkeyAcceptedKeyTypes +ssh-rsa
```
最後の2行がAWSの取説に従った状態から追加した部分だ。

OpenSSH8.5で `PubkeyAcceptedKeyTypes`が`PubkeyAcceptedAlgorithms`にリネームされているが、新しい名前にすると古いOpenSSHに`bad configuration options`と怒られるのであった。
2021年10月時点ではGit付属の`Git bash`とVS Codeで使われるOpenSSHが別物な時に困ることになる。


# 🐋原因
OpenSSH 8.8から`ssh-rsa`公開鍵署名アルゴリズムは無効化されてしまったが、AWS側は`ssh-rsa`にせよと言ってくるためだ。
https://www.openssh.com/txt/release-8.8

OpenSSH 8.3が内蔵されたのは `v2.33.1` から
https://github.com/git-for-windows/git/releases/tag/v2.33.1.windows.1

今回と同じ問題を踏んだ方のIssue
https://github.com/git-for-windows/git/issues/3468


タイムリーすぎる。AWS側が変な気がするからなんか対応されないかなあ。
logスケール上で等間隔の点を打つ

Qiita初投稿になります．初めてのMarkdown記法に慣れる練習も兼ねていますので，体裁等の見づらさがありましたらご了承下さい．

# はじめに
宇宙のような何桁ものオーダーを議論する分野において，log scaleのグラフは何度もお世話になります．その中で先日，log scale上で等間隔に点を打つということを考えるようになりました．
自分で考える前にネットで調べる悪い癖が付いてしまったのですぐにgoogleで検索したのですが，日本語で解説されている記事は多くありませんでした．Qiitaにも記事はありますが（[両対数グラフの上で等間隔な点を打つ](https://qiita.com/yotapoon/items/f7208cc04ffe581b44fc)），ここでは始めに等比数列が仮定されていて，これが私には理解できませんでした．

# 解説
以上の経緯から自分なりに考えてみたというのが今回の内容です．計算は高校数学しか使っていないので全くもって大したものではありませんが．

以下ではlog scale上での離散的な値を$X_i$，このときのlinear scaleでの値を$x_i$と大文字/小文字で分けて解説します．すなわち両者には，
$$X_i=\log_{10}x_i$$が成り立ちます．
問題設定として，下図のようにlog scale上での2個の離散値$X_0,X_N(X_0<X_N)$の間を等間隔になるよう$N$分割し，このときに隣り合う任意の2つの離散値 $X_i,X_{i+1}(0\leq i<N)$が，linear scaleとどのように対応づけられるかを考えます．
![log_linear.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1582727/aba0dd3b-aa85-37bf-1011-9f933f0904d7.png)

問題設定より次の式が成り立ちます．

```math
\begin{cases}
 X_{i+1}=X_i+\Delta X\\
 \Delta X \equiv \dfrac{X_N - X_0}{N} = \rm{const.}
\end{cases}
```
今，$X_{i+1}=\log_{10}x_{i+1}$であることを考慮すると，

```math
\begin{align}
X_{i+1}&=X_i+\dfrac{1}{N}(X_N-X_0) \\
&=\log_{10}x_{i+1}
\end{align}
```
よって，

```math
\begin{align}
x_{i+1}&=10^{X_i+(X_N-X_0)/N} \\
&=10^{\log_{10}x_i+(\log_{10}x_N-\log_{10}x_0)/N} \\
&=10^{\log_{10}x_i}\cdot (10^{\log_{10}x_N}\cdot 10^{\log_{10}x_0})^{1/N} \\
&=x_i\cdot \Bigl(\dfrac{x_N}{x_0} \Bigr)^{\frac{1}{N}}
\end{align}
```
が得られます．$r\equiv (x_N/x_0 )^{1/N}$は両端の点と分割数で決まる定数なので, $x_{i+1}=r\cdot x_i$ と等比数列が成り立つことが示されます．
以上より，linear scaleでの離散値間の幅$\Delta x_i$は，

```math
\begin{align}
\Delta x_i&\equiv x_{i+1}-x_i \\
&= x_i\cdot \Bigl(\dfrac{x_N}{x_0} \Bigr)^{\frac{1}{N}} - x_i\\
&= \Bigl\{\Bigl(\dfrac{x_N}{x_0} \Bigr)^{\frac{1}{N}}-1 \Bigr\}x_i
\end{align}
```
で決まります．log scaleにおいて幅を一定にしている分，linear scaleでは$x_i$に応じて幅が変化することが分かります．
Udemy「ネットワークエンジニアを目指す初心者はここから始めよう！「ゼロから学ぶネットワーク基礎」1027

ARP 概要
・Address Resolution Protocolの略で、IPアドレスに紐づくMACアドレスを調べる（解決する）。

ARP パケット（１）
・Hardware Hardware Type
　・ネットワークの種類、Ethernetは１が入る。
・Protocol Type
　・ARPで解決しようとするプロトコルを意味する。
　・IPなら0x0800が入る。
・Hardware Address Length
　・Hardware Addressの長さをオクテットで示す。
　・Ethernetなら6が入る。
・Protocol Address Length
　・Protocol Addressの長さをオクテットで示す。
　・IPなら４が入る。

ARPパケット（２）
・Operation Code
　・Requestは１、Replyは2が入る。
・Sender Hardware Address
　・送信元のHardware アドレスを示す。
　・MACアドレスのこと。
・Sender Protocol Address
　・送信元のProtocolアドレスを示す。
　・IPアドレスのこと。

ARPパケット(3)
・Target Hardware Address
　・Requestでは無視される。
　・ReplyではRequest　送信元のHardwareアドレス（MACアドレス）が入る。
・Target Protocol Address
　・Requestでは解決したいProtocol
　　アドレス（IPアドレス）が入る。
　・ReplyではRequest 送信元のProtocol
　　アドレス（IPアドレス）が入る。


ARP通信の流れ
①Requestをブロードキャストで送信
②TargetProtocol Addressが自分であれば応答、自分以外の時は破棄
③Replyはユニキャストで送信

ARPテーブル
・解決したIPアドレスとMACアドレスのペアをARPエントリと呼ぶ。
・一定時間ARPテーブルで管理され、通信の際にARPテーブルを参照することで不要な通信を削減する。
・ARPエントリが削除された場合は再度、ARPにより解決をおこなう。
・一時的に保持する情報をキャッシュと呼ぶ。
titanicをposgreでこねる①

タイトル通り、kaggleのデータセットをpostgresqlのテーブルに入れてこねる練習です。蛇足ですが、某氏は「pandasにできてsqlにできないことはない」くらいのことを言っていた気がします。データセットのインポートまで行います。

シチュエーション
・csvをpostgresqlのテーブルにインポートしたい
・巨大なデータセットの場合sqlで特徴量作成したい

テーブル定義するときに可変長文字列の文字数探索をしたのですが、そのコードは
[こちら](https://qiita.com/htj/items/f669bc38886da1d2748a)を参照

タイタニックデータセットを使用します。
さて、次の定義でテーブルを作成します。

```

-- 留意
-- kaggleのデータなので必要ないがprimary keyは設定
-- 可変長文字列型の列はmax文字数より少し多めの文字で設定
-- ageは元データが少数なのでnumeric


BEGIN TRANSACTION;
CREATE TABLE train (
    PassengerId INTEGER,
    Survived INTEGER,
    Pclass INTEGER,
    Name varchar(90),
    Sex char(6),
    Age NUMERIC(3, 1),
    SibSp INTEGER,
    Parch INTEGER,
    Ticket varchar(30),
    Fare NUMERIC(19, 9),
    Cabin varchar(90),
    Embarked char(1),
    PRIMARY KEY (PassengerId)
);
COMMIT;
```

あとは以下のコマンドで作成できます。

```

grant all on train to public;

\copy train from 'C:\\Users\\hoge\\to\\train.csv' with csv header
```


無事インポートできたようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1347377/3ffa2364-9db0-40d7-fcf6-2748c517e1e5.png)


[②](https://qiita.com/htj/items/4e59fb85fed9e532b9a8)で実際にデータをいじっていきます。
WindowsのコマンドプロンプトをROS用に改造する

# はじめに
普段はubuntuでROSを使っていますが、諸事情によりwindowsでROSを動かす必要がありました。しかし、windowsでよく使われるシェルであるコマンドプロンプトは、あまりにも使い勝手が悪かったので、ROSを操作しやすいように改造しました。

結果、**コマンドプロンプトを開くだけで、ROSのコマンドも使えるし、登録したエイリアスも使えるし、linuxコマンドも使えるようになりました。**楽！！

※諸事情とは→Oculus LinkとROSを一緒に使いたいが、Oculus Linkはlinuxに対応していない...

# 環境
- Windows 10
- コマンドプロンプト (Windows Terminal)
    - コマンドプロンプトはWindows Terminalから起動することを想定しています
- ROS2 Foxy


# 1. 起動時にセットアップ用の処理を自動で実行する
コマンドプロンプト起動時に自動で実行してほしい処理がいくつかあります。例えば、

- ROS2のセットアップ (`call C:\opt\ros\foxy\x64\local_setup.bat`)
- コンパイル環境の設定 (`call "C:\Program Files (x86)\Microsoft Visual Studio\...`)
- 作成したワークスペースのセットアップ (`call install/setup.bat`)

などがあります。これらのコマンドを以下のような1つのバッチファイルにまとめて、それをコマンドプロンプトの起動時に自動で実行するように設定します。

```ros.bat
@echo off

call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvarsall.bat" x86_amd64
call "C:\opt\ros\foxy\x64\local_setup.bat"
```

windows terminalにて、`ctrl+,`で設定を開き、`新しいプロファイルを追加します`を選択して、ROS用のプロファイルを新規に作成します。その後の詳しい手順は、以下のサイトの`6.1 Using the new Windows Terminal`の部分を参照してください。

http://wiki.ros.org/Installation/Windows

起動時に先ほどのバッチファイルを実行するようにしたいので、プロファイルの`commandline`は以下のように設定します。

```
{
    "commandline" : "C:\\Windows\\System32\\cmd.exe /k \"path\\to\\bat\"",
}
```


# 2. エイリアスを登録する


いちいちROSの長いコマンドを入力するのは大変なので、エイリアスを登録したいところです。linuxではbashrcに書くだけで済みますが、コマンドプロンプトにはそういう概念はなさそうだったので、doskeyコマンドを使いました。doskeyコマンドを使うと、コマンドプロンプトから使用するマクロを設定できます。例えば、以下のコマンドでは、`ros2 run...`から始まるコマンドを、`ros-tcp-endpoint`という名前で登録しています。

```
$ doskey ros-tcp-endpoint=ros2 run ros_tcp_endpoint default_server_endpoint --ros-args -p ROS_IP:=192.168.11.12
```

しかし、コマンドプロンプトで上記のコマンドを実行するだけだと、そのウインドウを閉じると消えてしまいます。設定を永続化させるために、今回は、`C:\Users\(ユーザ名)\`に`Macros.txt`というファイルにすべてのエイリアスを記述し、コマンドプロンプト起動時にそれを読み込むようにしました。

```Macros.txt
マクロ名=コマンド
```

作成したバッチファイルに以下の一行を追加します。このdoskeyコマンドでマクロファイルの中身が読み込まれて登録されます。

```
doskey /macrofile="C:\Users\(ユーザー名))\Macros.txt"
```


# 3. linuxコマンドを使えるようにする
デフォルトのコマンドプロンプトでは、`ls`や`mv`などのコマンドが使えませんが、下記のGowをインストールすることで使えるようになりました。

https://github.com/bmatzelle/gow

ただし、そのままだと文字化けの問題があるため、以下の記事に従って対処しました。

https://qiita.com/jonghyo/items/655ce8fc97ae25e3b43d




# 参考文献

https://maku77.github.io/windows/settings/doskey.html
[Flutter] Firebase Realtime DatabaseがWEBで使えることのなる。

- Firebase Realtime DatabaseのパッケージかWEBも使えることになりました。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137182/fd66096c-f24f-9c2b-716a-b1784c111063.png)

https://youtu.be/-W-xHsbPFuI?t=176

https://pub.dev/packages/firebase_database
HULFT集配信セルフテストの手引き

HULFTの通信相手が他社システムとかで社内テストできないときに
じゃあ自分自身をHULFTの通信相手に見立ててテストしちゃえって話

こんなテストに意味はあるのか・・・？
集信と配信で二重に定義するので定義ミスは防げそう・・・

*社内ドキュメントをメモ用に公開するので画像等は無し、検閲ヨシ

## 下準備編

hostsを変更する

変更前

    # 上位システム（HULFTの通信相手）
    192.168.10.1   JOUI

変更後

    # 上位システム（HULFTの通信相手）
    127.0.0.1      JOUI

---

## 配信テスト編

配信テストを行う場合、集信管理情報にモックが必要  
本項ではファイルID=`FILE01`の配信管理情報をテストしていく

1. 集信管理情報にファイルID=`FILE01`を作成する。
   - 配信管理情報(テスト対象)と同じファイルIDとする
2. ファイル名にフルパスで入力する(配信されたファイルはこのファイル名で集信される)
3. 転送グループIDを指定する
   - 配信管理情報(テスト対象)と同じ転送グループIDとする
4. 配信管理情報(テスト対象)を選択し配送要求を行う(ctrl+u, 右クリック→配信要求)
   - 集信モックで定義したファイルが生成されればテストOK
   - 配信状況一覧、集信状況一覧、コンソール(は表示した状態で実行しないと表示されない)で異常なきこと

---

## 集信テスト編

集信テストを行う場合、配信管理情報にモックが必要  
本項ではファイルID=`FILE02`の集信管理情報をテストしていく

1. 配信管理情報にファイルID=`FILE02`を作成する。
   - 集信管理情報(テスト対象)と同じファイルIDとする
2. ファイル名にフルパスで入力する(このファイル名でテストとして配信される)
3. 転送グループIDを指定する
   - 集信管理情報(テスト対象)と同じ転送グループIDとする
4. 配信管理情報(モック)を選択し配送要求を行う(ctrl+u, 右クリック→配信要求)
   - 集信管理情報(テスト対象)に定義されているファイルが生成されればテストOK
   - 配信状況一覧、集信状況一覧、コンソール(は表示した状態で実行しないと表示されない)で異常なきこと

---

最後に

- 本番環境に戻すのを忘れずに
  - この手引きに沿ったテストであれば`hosts`の変更を戻すだけで良い。  
    HULFTの定義を意識する必要はない。ping等の疎通確認で気付けるレベル。
【第一回】YOLOv3を一から実装　～チュートリアル～

# YOLOとは
　YOLOとは物体検出(画像内の物体の位置と種類を検出)の機械学習モデルで、2015年にJoseph Redmon氏が論文を発表しました。Joseph Redmon氏がv3で制作を引きましたが、現在でも積極的に開発が進められており、2021年10月現在v5まで出ております。ただしYOLOv4はYOLOv3にSPP（Spatial pyramid pooling）やPAN（Path Aggregation Network）といった技術が追加されたもので、YOLOv5に関しては論文が出ていないため、今さら感も否めませんが今回はYOLOv3を実装を解説していきたいと思います。

# YOLOv3の構成
　YOLOv3のモデル構造について説明していきます。ちなみに元の論文の条件から入力画像は416×416pxのRGB画像、検出対象のクラス数(b種類)は80として説明を進めていきます。

　YOLOv3のめちゃくちゃざっくりとした構成は以下のような図になります。

![スライド1.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2216693/d9ab4186-8347-301b-2dbd-68056ac35763.jpeg)

畳み込み層や残差ブロックなどで画像の特徴を抽出していき、途中で分岐して最終的に3つの出力を得ます。今回の例でいうと416×416pxのRGB(3channel)画像をモデルにインプットすると[13×13×255]、[26×26×255]、[52×52×255]の3つのテンソル(3次元配列)が出力されます。この出力についてもう少し詳しく見ていきましょう。

![スライド2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2216693/49198fd6-e828-558d-48be-7b8429511bd5.jpeg)

図にあるように画像をgrid(格子状)に分割します。図では説明のために4×4のgridとしていますが、実際は先ほどの出力の13×13、26×26、52×52に対応していると考えてください。1つのcellには検出対象の物体が存在する確率、物体の中心座標(x, y)、物体の範囲を示すバウンディングボックスの幅と高さ、そしてその物体がそれぞれのクラスである確率を含んでいます。つまり今回の例でいうと85個の情報を持っていると考えられます。さらに各cellで3つ分の物体を検出するため合計で255個分の情報をが1つのセルに与えられていることになります。

　ここまでの説明だと1枚の入力画像から(13×13×3 + 26×26×3 + 52×52×3) = 10647個の物体の検出結果が出てくることになります。そこで実際には閾値を設定して検出結果をふるいにかけます。具体的にはcellに含まれる情報の１つ「検出対象の物体が存在する確率」が閾値を超えている場合に検出結果を返してくるようになっています。

　また実際出力で得られる情報がそのまま画像の検出結果として使えるかと言うとそうでもなく、変換が必要なのですがそれは実装時に説明します。


# まとめ
　ここまで読んでいただきありがとうございます。かなり簡単にですがYOLOv3のモデル構造、入力画像に対する出力の内容を確認しました。次回からは実際にコードを書いて理解を深めていきたいと思います。第二回はまだYOLOv3部分には入らず、モデルに入力する画像データの準備について解説しようと思います。使用するデータは論文でも用いられていたCOCO datasetでpytorchでdataset、dataloaderを作成していこうと思います。
A-Frameで雪を降らすAR

# はじめに
A-Frameで雪を降らせていきまーす

# 開発環境
- Windows 10 PC
- Chrome

# 導入

1．こちらからクローンします

https://github.com/IdeaSpaceVR/aframe-particle-system-component

2．aframe-particle-system-component-master/examples/snow/index.htmlを下記のように編集します

~~~html
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>A-Frame Particle System Component Example</title>
    <meta name="description" content="Hello, World!">
    <script src="https://aframe.io/releases/1.2.0/aframe.min.js"></script>
    <script src="../../dist/aframe-particle-system-component.min.js"></script>
    <script src="https://cdn.rawgit.com/jeromeetienne/AR.js/1.5.0/aframe/build/aframe-ar.js"></script>
  </head>
  <body style="margin : 0px; overflow: hidden">
    <a-scene embedded arjs="debugUIEnabled: false" vr-mode-ui="enabled: false">
      <a-entity position="0 2.25 -15" particle-system="preset: snow; particleCount: 5000"></a-entity>
      <a-entity camera></a-entity>
    </a-scene>
  </body>
</html>
~~~

3．htmlを開いて実行してみましょう！

https://twitter.com/sotongshi/status/1600613031385628672?s=20&t=AZ6s7byRVyyOsz8-VCLAlA

お疲れ様でした
csvファイルのobject/float列のmax文字列数を一気に全探索

シチュエーション
tableにcsvファイルをインポートする時に
・文字列型(pandasではobject型)の要素の最大文字数
・float型の桁数
を知ってcreate tableする

### 1. csvファイルをpythonで開いて列を把握

いわずと知れたタイタニックのデータセット

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1347377/a745d2e4-c7dc-4e79-a0be-a2f4c613c704.png)

### 2. 以下のコードを実行

```
import pandas as pd
train = pd.read_csv('./train.csv')

# 文字列型の列名を取得
# fstringを使用して、文字列型の列の中の要素の長さを col_文字数列 として取得
# type(train.Cabin[0]) == float
# object型列のnanはfloatとして扱われるが、ここではfillna('n')としてもほ１文字ならとんどのケースで問題なさそうなので'n'で補完

def make_str_len(df):
    df = df.copy()
    strandfloatcol =[str(col) for col in df.columns if df[col].dtypes == 'object' or df[col].dtypes == 'float' ]
    # print(strcol)
    for col in strandfloatcol:
        # print(col)
        if df[f'{col}'].dtype == 'object':
            df[f'{col}'] = df[f'{col}'].fillna('n')
            df[f"{col}_文字数"] = df[f'{col}'].apply(lambda x: len(x))    

        if df[f'{col}'].dtype == 'float':
            df[f"{col}_len"] = df[f'{col}'].apply(lambda x: len(str(x)))    
    df = df.drop(strandfloatcol,axis=1)

    return df
tmp = make_str_len(train)
tmp.describe()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1347377/49442382-7b5e-3b68-93ec-389f4d0fde35.png)


全体の桁数は取ってこれたのですが、少数点の桁数や整数の桁数に分けてとってくることはしていない
djangoのルーティングをざっくりとまとめてみた

今回のお題
-
今回は、djangoのルーティングについてまとめます。
ルーティングファイルが２層構造になっていたり参考にした書籍と現在のトレンドが違ったり（書籍ではurlを用いていたが現在はpathが主流）と所々混乱する要素があったので、記事にすることで自分の頭を整理したいと思います。

目次
-

- djangonにおけるルーティングの概要
- プロジェクトフォルダのurls.pyの記述
- アプリケーションフォルダにおけるurls.pyの記述
- 終わりに

djangoにおけるルーティングの概要
-
djangoでは、ルーティングの定義に以下の2つのファイルが関わります。

- プロジェクトフォルダのurls.py
- アプリケーションフォルダのurls.py

名前が同じなのがややこしいですね。

役割分担としては、まずプロジェクトフォルダのurls.pyがリクエストのurlに応じて適切なアプリケーションのurls.pyを呼び出します。

その後、呼び出されたアプリケーションのurl.pyがリクエストに対応した関数をviews.pyから呼び出すという流れになります。

では、具体的な記述方法をみていきましょう。
プロジェクトフォルダのurls.pyの記述
-
まずは、プロジェクトフォルダのurls.pyを編集します。
ここでは、path()とinclude()を用いて「どのurlからのリクエストをどのアプリケーションのurls.pyに振り分けるか」及びそのルーティングのnamespaceを定義します（namespaceは省略可）。

以下では、mysiteというプロジェクトにおいて、myappから始まるurlへのリクエストをmyappというアプリケーションに振り分けています。

```python:mysite.urls.py
urlpatterns = [
  path("myapp/", include("myapp.urls") # namespaceなし
  ptath("myapp/", include(("myapp.urls", "myapp"))) # namespace
]
```
namespaceは必須ではありませんが、後述するルーティングのnameが衝突しないようにするためにはあったほうが便利かなと思います。

もしnamespaceを指定する場合には、include内の引数がタプル形式になることに注意してください。

タプルについては[こちら](https://qiita.com/keishi04hrikzira/items/167fbfdde101029c08da)。

これでmyappから始まるurlをmyappというアプリケーションに振り分けることができました。

次に、アプリ内でのルーティングを設定していきます。
アプリケーションフォルダにおけるurls.pyの記述
-
先程のプロジェクトフォルダのurls.pyではurl（の前半部分）とアプリケーションを対応させました。
アプリケーションフォルダのurls.pyではurlの後半部分とviews.pyの関数を対応させていきます。

今回は例として、myapp/indexというurlへのリクエストとviews.pyのmyapp_index関数を対応させます。

```python:myapp/urls.py
urlpatterns = [
  path("index/", views.myapp_index, name="myapp_index")
]
```
第一引数がurlです。
myapp/の部分まではプロジェクト側で処理しているので、それより後の部分だけを引数としていることに注意してください。

第二引数には呼び出す関数名をviews.関数名の形式で記述します。

第３引数にはルーティング名を指定しておくと、テンプレートでa要素のhref属性を指定する際などに利用できます。

ルーティングとしてはこれで終了です。
終わりに
-
こうして文字に起こしているとだいぶ整理できてきましたが、まだ若干怪しいです。
どちらがnameでどちらがnamespaceなのかなどはもちろん考えればわかるのですが、まだ身についているとは言えない状態ですね・・・
Rで距離行列の値を計算する際の注意点

Rで距離行列の値の計算をする場合、データフレームや行列（matrix）をdistクラスに変換する必要がある。そのままmean関数やsum関数を用いると対角線上の値も計算に含まれるため、計算結果は誤った値となる。warningなども出ないので注意。

### 環境

```R
sessionInfo()
R version 4.0.2 (2020-06-22)
Platform: x86_64-apple-darwin17.0 (64-bit)
Running under: macOS Catalina 10.15.6
```

### 具体例

```R
a <- matrix(c(1, 2, 3, 2, 1, 4, 3, 4, 1), ncol = 3); a
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    2    1    4
[3,]    3    4    1

# 行列のまま計算（matrix）
mean(a)
[1] 2.333333

#as.dist()で距離行列（distクラス）に変換
b <- as.dist(a); b
  1 2
2 2  
3 3 4

mean(b)
[1] 3
```
ActiveRecord::RecordInvalid: バリデーションに失敗しました: Emailはすでに存在します




とある状況でrails db:seedと入力すると__ActiveRecord::RecordInvalid: バリデーションに失敗しました: Emailはすでに存在します__と出てきてパソコン打ち壊しそうになったので備忘録。

#状況

これが出てきたエラーです。長え

![seed.rb_error.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/671017/d822e552-2e13-8b12-927e-ad700aa777ba.png)


#原因
![スクリーンショット 2021-10-27 17.00.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/671017/823e8954-fe56-c470-1a3c-f79590aaf5ba.png)

seed.rbのAdminに

```
email "a@a"
password "aaaaaa"
```
って記述してたんですけど、これまだ僕がseed.rbを利用する前に↑のemailとpasswordでサインアップに使用していたためこんなエラーが出てきたようです。
この部分のemailとpasswordに登録させる内容を変更させたらうまく行きました。

＊ここではgemで日本語化のやつを導入してたから__ActiveRecord::RecordInvalid: バリデーションに失敗しました: Emailはすでに存在します__なんて日本語でエラーが出てきたのかもしれない。導入してなかったら英語で出てくると思われる。
【Ruby】case whenによる条件分岐

##環境
Ruby 3.0.2
Rails 6.1.4.1

##case whenとは

thenは省略可

```weather.rb
weather = 0
case weather
when 0 then 
  puts '晴れ'
when 1 then 
  puts 'くもり'
when 2 then 
  puts '雨'
else
  puts '雪'
end

#=> 晴れ
```

putsを省略するとより可読性が上がり、コード量も減らせる

```weather.rb
weather = 0
case weather
when 0 then '晴れ'
when 1 then 'くもり'
when 2 then '雨'
else        '雪'
end

#=> 晴れ
```

case文をif文で書き直すとこんな感じ
```===```は、左辺が単独のStringやIntegerオブジェクトの場合```==```と同じ動作をする

```weather.rb
weather = 0
if weather === 0 then
  puts '晴れ'
elsif weather === 1 then
  puts 'くもり'
elsif weather === 2 then
  puts '雨'
else
  puts '雪'
end

#=> 晴れ
```

##case文とif文の使い分け
case文：1つの比較対象に対して複数の条件分岐でき、可読性の高いコードを書ける
if文：複数の比較対象を組み合わせて条件分岐できる


##参考

https://docs.ruby-lang.org/ja/latest/doc/spec=2fcontrol.html#case

https://techracho.bpsinc.jp/hachi8833/2017_01_19/32941
【Python】Open Weather Map APIから気象情報を取得してみた

# 初めに
ダッシュボード作成のために、気象情報をAPIにて取得する
[Open Weather Map API](https://openweathermap.org/api)を使用すると取得できることが判明
⇒Pythonを用い、HP等で表示させる用途を想定

## 環境
- Windows10
- Python 3.8.12

## パラメータ
lat (float):必須、取得したい場所の緯度、
lng (float): 必須、取得したい場所の経度
appid:必須、[Open Weather Map API](https://openweathermap.org/api)に登録し、取得してください。
unit:metric 摂氏温度(℃)の取得に固定しています。
lang:ja 日本語に固定しています。

本コードではowm_url.formatにてパラメータをセットしてください。

## コード
```python:owm_api.py
# -*- coding:utf-8 -*-
import requests
import json

# owmより天気を取得する
owm_url = "http://api.openweathermap.org/data/2.5/weather?lat={lat}&lon={lon}&units={unit}&APPID={appid}&lang=ja"
owm_url = owm_url.format(lat="34.00000", lon="135.00000", unit="metric",
                         appid="xxxxxxxxxxxxxxxxxxxxx")

owm_json = requests.get(owm_url).json()
owm_temp = "気温:"+str(owm_json["main"]["temp"])+"℃"
owm_weather = "天気:"+owm_json["weather"][0]["main"]
owm_cloud = "雲量:"+str(owm_json["clouds"]["all"])

print(owm_temp)
print(owm_weather)
print(owm_cloud)
```
# 参考サイト

https://openweathermap.org/api

https://hsmt-web.com/blog/openweathermap-api/

https://qiita.com/thiagomatsui/items/ab923c1fcd6694f6e5bb
アジャイルの基礎概念

初めてアジャイルの案件にアサインされるということで、
とりあえず置いて行かれないようにアジャイルの基礎概念的な物を学習したので備忘。
何かの参考になれば幸いです。
## アジャイルとスクラム開発

- アジャイルの手法がスクラム開発
- スクラムが一番使われている
- 従来のやり方（ウォーターフォール）だと無駄が多い
- 各チームに分けて少数で密に連携が取れ、チームごとに品質を担保する

## アジャイルマニフェストの4つの価値

- プロセスやツール < 個々と対話
- 包括的なドキュメント < 動作するソフトフェア
- 契約交渉 < 顧客とのコラボレーション
- 計画に従順 < 変更への対応

## アジャイルの12の原則

- 顧客満足
    - 早期かつ継続的に納品することを優先して顧客を満足させること
    - 開発のあらゆる段階で変更を歓迎すること
    - 動作中のソフトウェアを頻繁に納品すること
   
- 品質
    - 動くソフトウェアこそが進捗で最も重視されること
    - 技術的に優れ柔軟性と拡張性がある設計に注意すること
    - シンプルさを求め、無駄なく作れる量を最大限にすることが本質であること
   
- チームワーク
    - ビジネス側と開発者は日々一緒に働くこと
    - 意欲に満ちた人々でプロジェクトを構成し信頼すること
    - 最も効果的なフェイス・トゥ・フェイスで話をすること
   
- プロジェクト管理
    - 持続可能で一定のペースを継続的に維持できるようにすること
    - 最良のアーキテクチャ・要求・設計のために、自己組織的なチーム作りをすること
    - チームが最も効率を高めることができるかを定期的に振り返り、やり方を最適に調整していくこと

## アジャイルを選択する理由

- リソースと時間を元に機能を絞っていく
- 機能実装後にサービス提供可能
- 要求変更など不確実性に関して対応しやすい
- ドキュメントが少ない
- デモで見せる
- 変更を取り入れるため見積しにくい

## アジャイルのフレームワーク

- フレームワークは組み合わせて使われることもある

- スクラム
    - 製品ビジョンに対して下記を繰り返す
     1. プロダクトバックログの作成、見直し
     2. スプリントプランニング
     3. スプリントバックログの作成
     4. スプリント
         -  デイリー・スクラム
     5. インクリメント
     6. スプリントレビュー
     7. スプリントレトロスペクティブ
- かんばん
    - １つのプロジェクトを視覚化してやるやり方
        - TODO
        - DOING
        - DONE etc...
- Extreme Programming(XP)
    - チーム全体の計画
        - すべてのメンバーが計画に参加
    - コーディングスタンダード開発
        - コーディング標準で一貫性を維持する
    - **ペアプログラミング**
        - 二人で作業する
    - **コードのリファクタリング**
        - 設計を頻繁に改善して、効率を改善
    - シンプルなデザイン
        - シンプルなデザインの方が費用対効果が高い
    - 小規模リリース
        - 顧客に頻繁に機能を提供しフィードバッグを受け取る
    - スクラムと統合されて使われることが多い
- Scrumban
    - スクラム＋かんばん
- Hybrid
    - 要件定義とシステムテスト・リリースだけを残し、開発をアジャイルで行う