OmniAICreator/Qiita-1.07M huggingface dataset:
2.2.gitインストール・設定

# 概要
GitHubの登録が完了したらローカル環境に反映するためGitコマンドをインストール・設定します。

# インストール手順

#### 1.確認
Gitがインストールされているか、また、Windows側のgitを参照していないかインストールディレクトリを確認します。。windowsマウント先のパスが表示されている場合はWSL側にインストールします。

```bash:git確認
$ which git
/mnt/c/xxxx
※インストールされていない場合はなにも出力されません。
```

#### 2.インストール
下記コマンドを実行します。

```bash:gitインストール
$ sudo apt update && sudo apt upgrade -y && sudo apt autoremove -y
$ sudo apt install -y git
```

#### 3.windows側のパスを無視する設定
Windows側の参照の参照よりもWSL側のgitコマンドを優先する為、bashrcを編集します。
※本来は実行コマンドを混乱させないためにもWindows側はアンインストールするかWSLからWindowsコマンドの実行を禁止すべきだと思います。

```bash:bashrc編集
$ sudo vim /etc/profile.d/binpath.sh

---- 下記の通り編集
#!/bin/env bash
export PATH=/usr/bin:${PATH}
----

$ sudo chmod 775 /etc/profile.d/binpath.sh
$ source /etc/profile.d/binpath.sh
```

#### 4.確認

```bash:git確認
$ git --version
git version 2.25.1

$ which git
/usr/bin/git
```

# ローカル初期設定

#### 1.GitHubプロジェクト取得
まず、対象のプロジェクトを取得します。

##### 1-1.GitHubサイトからURLをコピーします。
コードタブ⇒コードプルダウン⇒コピーボタン
でコピーできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96681/3b531fb5-de7f-f856-605f-1c69d9730f84.png)

#### 1-2.プロジェクトのクローン
WSL端末で以下のコマンドを実行します。ここでは「/var/docker」以下にクローンします。

```bash:プロジェクトクローン
$ mkdir -p /var/docker
$ cd /var/docker/
$ git clone ＜コピーしたURL＞
Username for 'https://github.com': ＜GitHubユーザ＞
Password for 'https://masaki-nohara@github.com':＜[2.1.GitHub登録]時に取得したToken＞
```
### 2.メインユーザ以外のユーザを使用する場合
複数のプロジェクトを取り扱う場合、プロジェクトごとにユーザが違う場合があります。その場合はクローンしてきたディレクトリで使用するユーザを設定しておきます。

```bash:ローカルユーザ設定
$ cd /var/docker/＜Gitプロジェクト名＞
$ git config --local user.name "＜GitHubユーザ名＞"
$ git config --local user.email "＜GitHubメールアドレス＞"
# Tokenを何度も入力しないようにするため認証情報を保存する設定をします
$ git config credential.helper store
$ git config --global color.ui auto
```

例) gitに登録しているプロジェクトmmmm、作業をするOSユーザdevelop、GitHubユーザ名piyopiyo、GitHubメールアドレスpiyo@poyo.co.jpの場合

```bash:ローカルユーザ設定例
$ sudo mkdir -p /var/docker/mmmm
$ sudo chown develop:root /var/docker/mmmm
$ cd /var/docker/mmmm
$ git config --local user.name "piyopiyo"
$ git config --local user.email "piyo@poyo.co.jp"
$ git config credential.helper store
$ git config --global color.ui auto

#ユーザ情報確認
$ git config -l
```

### 3.新規ブランチを作成してチェックアウト
現在、ブランチはmasterブランチになっていると思います。masterブランチは通常リリース時のブランチですのでdevelopブランチを作成し、チェックアウトします。
細かいルールはGitHubフローに従ってください。

```bash:チェックアウト
$ git checkout -b origin/develop
# 初めてのチェックアウトの場合はpasswordの入力を求められますが、2度目以降の入力は省略されます。

※または、下記の様に2コマンド実行しても同じです。
$ git branch origin/develop
$ git checkout origin/develop
```

これで環境を構築するための開発環境の構築が出来ました。次章からは実際にDockerを使用して環境構築のためのコードを書いていきます。

---

[2.1.GitHub登録](https://qiita.com/boss_ape/items/aa2e5da904add70639d6) < 前 **2.2.gitインストール・設定** 次 > [3.Docker in WSL環境構築](https://qiita.com/boss_ape/items/fe48e4d7b69e83bed7c8)
2.Git / GitHubによる環境ファイル管理

# 概略

ローカル開発環境を順次構築するにあたって環境の設定は全て設定ファイル、または、shell等のスクリプトプログラム（以下、環境構築用ファイル）となっていきます。本章ではそれらファイルを管理するためにGit / GitHubを利用する方法・手順を記載します。
現段階ではまだ環境構築用ファイルは作成していませんが、作成したファイルをすぐにバージョン管理する必要がある為、この段階でGitHubの登録を行い準備しておきます。
下記にWSLとGitHubの関係の俯瞰図を示します。

![WSL - GitHub連携イメージ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96681/ec625ca8-a7af-e23b-afe6-cfa64a168278.png)

GitHubでは**環境構築用ファイル**以外にも通常の開発する**プログラムソース**も一緒に管理することによって開発者参入時の開発環境の構築や本番環境・検証環境の構築が驚くほど短期間で出来上がるようになります。仮に環境が壊れた場合の再構築もプログラムソースやデータも含めて数回のコマンド発行で可能となるでしょう。

---

# 使用した環境

Windows11 Pro Insider Preview
Intel Core i7-8650U
実装RAM 16.0 GB

---

# 目次
[アーキテクト技術者・構成管理者・リモート開発者のためのローカル開発環境構築ガイド](https://qiita.com/boss_ape/items/c33408df7557801d0183)
**2. Git / GitHubによる環境ファイル管理**
[2.1. GitHub登録](https://qiita.com/boss_ape/items/aa2e5da904add70639d6)
[2.2. gitインストール・設定](https://qiita.com/boss_ape/items/c9155659d8d474f3c8b6)

---

[1.5. WSLでのsystemctl設定](https://qiita.com/boss_ape/items/3d30dd651b93fdbbb3a5) < 前 **2. Git / GitHubによる環境ファイル管理**  次 > [2.1. GitHub登録](https://qiita.com/boss_ape/items/aa2e5da904add70639d6)
Macでファイルを圧縮する方法–最も簡単な方法

コンピュータのスペースを占める古いレコードや情報がたくさんある場合は、それらを小さなアーカイブに圧縮できます。 MacOSでは、OSから直接情報を圧縮できます。

Commander OneなどのMac用のサードパーティのZIPプログラムを入手して、より効率的にすることもできます。 MacでZIPファイルを作成する方法の詳細については、記事を読み続けてください。

ZIPファイル拡張子とは何ですか？
-
ZIPは、複数のディレクトリを操作できる一般的なファイルアーカイブ形式です。 さまざまなアルゴリズム、より多くの場合はデフレートによる情報の圧縮を提供します。 この規格は1989年にPhilKatzによって開発され、PKWAREのPKZIPソフトウェアに実装されました。 ZIPは、最も広く使用されているアーカイブ形式であり、情報の転送と保存に使用されます。 アーカイブに保存されているファイルを表示して使用するには、アーカイブを解凍する必要があります。つまり、ファイルを通常のフォルダーに抽出します。

Macコンピュータでファイルを圧縮する方法
-
MacでZIPアーカイブを作成するのは簡単で、macOSに直接組み込まれた圧縮ツールを使用すると、zipアーカイブをすばやく作成して単一のファイル、ファイルのグループ、または全体を圧縮するために、Macまたはプラグイン用の追加のZIPユーティリティをダウンロードする必要はありません。 フォルダ。 Macでzipアーカイブを作成することに慣れていない場合は、次の方法で正確かつ迅速に作成できます。

1. Finderを開きます。
2. アーカイブに追加するファイルを選択します。
![document.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1740997/a0fce82c-7c03-5255-b53b-09c8fe1d67b1.png)
3. ファイルを操作するためのコンテキストメニューをアクティブにします。
4. オプション圧縮を選択します。
![compress.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1740997/02e3a4c8-0072-51d4-84a3-04a84cef8ba7.png)

その後、同じFinderフォルダに新しいアーカイブが表示されました。 インターネット経由で送信し、ストレージに残し、外部ドライブに転送するなど、便利な方法で使用できます。

Macコンピュータでフォルダを圧縮する方法
-
複数のファイルやフォルダーを圧縮するには、Finderまたはデスクトップに新しいフォルダー（Shift + Cmd + N）を作成し、MacのZipの名前を付けます。 圧縮するファイルをドラッグアンドドロップします。 フォルダを右クリックし、[選択したファイルを圧縮する]を選択します。 アーカイブが完了したら、作成したフォルダをゴミ箱にドラッグします。

Macでファイルを圧縮するときにフォルダを作成および削除しない場合は、すべてのアイテムを選択して右クリックし、[選択したファイルを圧縮する]を選択します。Nは選択したファイルの数です。

MacでZIPファイルを作成して別の場所に保存する方法
-
圧縮を実行するアプリケーションを開くことにより、圧縮ファイルの宛先を変更できます。 これはアーカイブユーティリティと呼ばれ、Spotlight検索を使用して見つけることができます。
1. アーカイブユーティリティを開きます。
2. 画面上部の[アーカイブユーティリティ]ドロップダウンメニューをクリックして、[設定]を選択します。
3. [展開されたファイルを保存する]というオプションをクリックし、を選択して、新しい保存先を選択します。 （デフォルトでは、Mac Zipファイルは元のファイルと同じ場所に保存されます。）

コマンドラインからMacでZIPファイルを作成する方法
-
MacでZIPファイルを作成する珍しいが効率的な方法はターミナルにあります。 これはWindowsのコマンドラインに相当し、macOSユーザーがさまざまなコマンドを実行できるようにします。 これは、コマンドラインのみを使用してMacでZIPファイルを作成する方法です。

1. まず、ターミナルを開く必要があります。

2. Macでファイルを圧縮するには、次のコマンドを使用します。 zip archive.zip mydocument.txt

3. ターミナルはZIPアーカイブを作成し、現在のフォルダに配置します。

コマンドラインからアーカイブを作成するもう1つの簡単な方法は、ターミナルでサポートされているドラッグアンドドロップ機能を使用し、通常どおりzipコマンドを入力してから、ファイルをドラッグしてターミナルウィンドウに圧縮することです。

MacでZIPファイルを作成するためにサードパーティのソフトウェアを使用する利点
-
MacでZIPファイルを作成する最も簡単な機能は、オペレーティングシステム自体に統合されています。 残念ながら、パラメータを設定することはできず、ファイルを結合してそのサイズを圧縮するためだけに機能します。 組み込みのアーカイバは、暗号化されたアーカイブや、転送を容易にするために複数のボリュームに分割されたファイルを処理するには難しすぎる場合があります。 そのため、アーカイブを頻繁に扱う人にとっては、Mac用に追加のZIPユーティリティをインストールするのが理にかなっています。
![618.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1740997/f2bc60dc-731c-3759-7b0c-a80a3a0591bb.png)

サードパーティの開発者によるプログラムには、はるかに多くの機能があります。 彼らは多くのタスクを実行し、幅広い拡張機能を操作し、コンテキストメニューに便利に統合することができます。例えば、[Commander One](https://mac.eltima.com/how-to-zip-file-on-mac.html). 実際、このプログラムは幅広い機能を備えたクールなファイルマネージャーです。

しかし、それに加えて、ZIP、RAR、7Zip、TBZ、TGZなどの形式でアーカイブを解凍および作成するための強力なツールです。このMac用のzipソフトウェアは、アーカイブの暗号化機能をサポートし、ファイルの圧縮とファイルの圧縮の両方にホットキーの組み合わせを提供します オプション付きで、便利なアーカイブツールバーボタンがあり、内部圧縮率を設定できるだけでなく、効率的で完璧なファイル管理のためのはるかに多くの追加機能を提供します。
exists? メソッドを使った簡単な条件分岐

初めてexistsメソッドを使ったのでメモ

<h1>existsメソッドとは</h1>

exists?メソッドとは指定した条件のレコードがデータベースに存在するかどうかを真偽値で返すメソッドです。存在すればtrueを存在しなければfalseを返します。
書き方は、

```
  オブジェクト.exists?(条件)
　　　　モデル名や、モデルクラスのインスタンスなどを指定できます。
```

<h1>何故使おうと思ったか</h1>
結論から言うとコメントの表示で気になることがあったため。

写真投稿サイトをつくっており、投稿に対するコメントを追加できるようにしています。
コメントが多くなることを想定しているのでページネーションを用いています(gem 'kaminari')
コメントは

```
@comments = Commnet.all
```

で取得してそれをviewで対応するidだけを表示するようにしています。

ページネーションを作っていなければ、今回の問題に当たっていなかったので作っていてよかったと思いました。

問題としましては投稿にコメントが追加されていないのにページネーションが表示されている点です。

これを投稿にコメントが追加されてから表示するようにしたいので考えました。

<h1>試したこと</h1>

viewでは以下のようにしていますがこの"each"の中にページネーションの記載をするとコメントの数だけページネーションが表示されてしまいます。
それではいけないのですが、指定する条件はこれが理想なんですよね〜、

```
<% @comments.each do |comment| %>
  <% if @post.id == comment.post_id %>
  ~ #コメントにある外部キーと投稿のidが同じものだけ表示している

<% end %>
```

どうしたもんか。。

ググってみました。

どう検索したらいいかわかんなかったのでデータベースの有無に関するメソッドを見てました。
(present? とか blank? とか)

それみてたら

existsを見つけました！
このメソッドは条件に対して true か falseを返すので、

```
  User.exists?(name: "田中")
Userのnameカラムに田中があればtrue, なければfalse
=> true
```

みたいに使うことができます。

僕が考えている条件としては、
コメントをつける投稿の主キー id　と
コメントが持つ、外部キー　post_idが同じ　というものです。

つまり,,,,,,
 Comment.allの情報を入れた　@comments　の　post_idカラムのなかに コメントをつける投稿のidがあるかないかの処理を書けばいいのです。
post_idはcommentをcreateした時に追加されるのでコメントがなければpost_idは追加されません。


<h1>書いてみる</h1>

```
<div>
 <% if @comments.exists?(post_id: "#{@post.id}") %>
  #commentsのpost_idを全検索して投稿ごとのidを調べてtrueかfalseを返す

  ##trueなら表示
   <%= paginate @comments %>

 <% else %>

  ##falseなら表示
   <p>コメントはまだありません。</p>

 <% end %>
</div>
```

これで他の投稿と競合せずに1投稿ごとに情報の有無で表示を変えることができました！
OSSについて

# はじめに
本記事では、`OSS`について記述します。

# OSSとは
オープンソースソフトウェア(Open Source Software)の略。
直訳通り、`ソースコードを公開しているソフトウェア`のことです。
[OSS（オープンソースソフトウェア）とは？利用時のメリットと注意点](https://hnavi.co.jp/knowledge/blog/oss/)

> OSSは無償のソフトウェアですが、利用条件や規約がないというわけではありません。`OSSの認定を行う非営利団体`「The Open Source Initiative（OSI）」が、`OSSのライセンスを管理`しています。ソフトウェアがOSSであるかどうかは、ライセンス（使用条件）が「オープンソースの定義（The Open Source Definition）」に合致しているかどうかで決まります。OSIによってライセンスが承認されると、そのソフトウェアはオープンソースであると公式に認められ、「OSI認定マーク」が付与されます。

### OS
スマホやパソコンを使っていく上で基本となるソフトウェア
(紛らわしいので、記述します)

### OSSのライセンスの要件
以下のような基準があります。
[Open Source Initiative](https://opensource.org/osd)

- 自由な再配布ができること
→売ったり、無償で配布したりできる。

- ソースコードを入手できること
- 派生物が存在でき、派生物に同じライセンスを適用できること
- 差分情報の配布を認める場合には、同一性の保持を要求してもかまわない
- 個人やグループを差別しないこと
- 適用領域に基づいた差別をしないこと
- 再配布において追加ライセンスを必要としないこと
→もともとあるライセンスにプラスした上で再度配布することはできない。

- 特定製品に依存しないこと
- 同じ媒体で配布される他のソフトウェアを制限しないこと
- 1技術的な中立を保っていること

### OSSの代表例
以下に大量の代表例があります。
[【まとめ】よく使われる代表的なOSS(オープンソースソフトウェア)を一覧にまとめてみた](https://itconsultant-dictionary.com/oss-list/)

私がITパスポート試験の学習中によく出てくるものを列挙します。

|用途|OSSの例|
|-|-|
|OS|Linux,Android|
|オフィスツール|OpenOffice.org|
|Webサーバー|Apache|
|Webブラウザ|FireFox|
|電子メール|Thunderbird|
|データベース管理システム(DBMS)|Mysql|
|ファイル共有|Samba|

### メリット
- 信頼性
→ソースコード公開によって、不正なプログラムや脆弱性などの確認ができる

- 安定性
→メンテナンスを継続する事ができ、長期的に利用することができる

- 監査能力
→第三者機関に監査を依頼することができる

- 柔軟性と自由
→システム間連携やプラグインの開発ができ、ソースコード自体に修正を行う事もできる

- コスト
→ライセンス費用は無償

- サポートの選択
→導入から運用まで(自己責任)を支援サポートする`コミュニティ版のサポート`と商用ソフトウェアと同様にバグ・脆弱性への対応、法的保証、サポートレベルなどサポートする`商用版`が選択できる


以上です。

# 終わりに
ITパスポートや基本情報技術者で出てきた言葉をアウトプットするシーズンが到来しています。
明日も学習がんばります！

参考サイト
[OSS（オープンソースソフトウェア）とは？利用時のメリットと注意点](https://hnavi.co.jp/knowledge/blog/oss/)
[Open Source Initiative](https://opensource.org/osd)
[【まとめ】よく使われる代表的なOSS(オープンソースソフトウェア)を一覧にまとめてみた](https://itconsultant-dictionary.com/oss-list/)
[OSS（オープンソースソフトウェア）とは](https://openstandia.jp/oss/)
Qiskitを学ぶ時に使っているURL

Qiskit
https://qiskit.org

はじめに
https://qiskit.org/documentation/locale/ja_JP/getting_started.html

Qiskit を使った量子計算の学習
https://qiskit.org/textbook/ja/preface.html

Tutorials
https://qiskit.org/documentation/locale/ja_JP/tutorials.html

Learning resources
https://qiskit.org/learn
reactでwebpackの設定

#webpackをインストール
以下のコマンドを実行
＊webpack v4以降からはCLIもインストールする必要があるみたい。

```
npm i --save-dev webpack webpack-dev-server webpack-cli
```


次にwebpack.config.jsを作成

```
touch webpack.config.js
```

次に下記のコマンドを実行し、また.Babelrcを作成する。

```terminal
//babelrcをインストール
npm i --save-dev @babel/core @babel/preset-env @babel/preset-react babel-loader html-webpack-plugin

//.Babelrcファイルを作成
touch .Babelrc
```

今回、buildしたときにcssが原因でエラーが出ていたのでstyle-loaderを追加した。
↓その他のloader
https://webpack.js.org/loaders/

```
npm i -D webpack webpack-cli style-loader css-loader
```

webpack.config.jsに以下を貼り付け

```js
const path = require('path');
module.exports = {
    mode: 'development',
    entry: [
        './src/index.js'
    ],
    output: {
        path: path.join(__dirname + '/dist'),
        filename: 'bundle.js'
    },
    module: {
      rules: [
        {
          test: /\.(js|jsx)$/,
          exclude: /node_modules/,
          use: [
            {
              loader: 'babel-loader',
              options: {
                presets: [['@babel/preset-env', { modules: false }]]
              }
            }
          ]
        },
        // buildした際にcssでエラーが発生していたためstyle-loaderを追加
        {
        test: /\.css/,
        use: [
          "style-loader",
          {
            loader: "css-loader",
            options: { url: false }
          }
        ]
      }
      ]
    },
    resolve: {
        extensions: ['.js', '.jsx'] // use js, jsx file
    },
    devServer: {
        open: true,
        historyApiFallback: true,
        contentBase: path.join(__dirname, '/dist'),
        watchContentBase: true,
        inline: true,
        hot: true,
    },
    
    plugins: [
    ], 
};
```

packeg.jsonのbuildコマンドを修正

```json
"scripts": {
    "start": "start", 
    "build": "webpack --mode production",
    "test": "test",
  }
```

これでいけるはず
Unity設計入門：目次

# はじめに
Unityで開発している際に雑に書いてしまうと、コードが膨れ上がって混沌とすることが多いと思います。
そして、それを解決するためにネットで検索してみると「MVPやMVCなどの技法があるらしいぞ」とか「疎結合にするといいっぽい」とか、いろいろな手法の情報が得られます。
しかし、「**概念だけ言われても実際どう書くんだよ！**」「**単純なサンプルだけじゃわかんないよ！**」「**とりあえず言われたライブラリを使ってみたけどよくなった気がしない**」と思ってしまうこともしばしばあります。また、それぞれの記事で前提知識が多かったり、「責務の問題」とかいう曖昧な言葉でお茶を濁されたりしがちです。
そこで、このシリーズでは、マクロな設計について、「**基礎の基礎から**」そして「**実際のコードを踏まえて**」解説していきたいと思います。
# 対象読者
* C#・Unityがなんとなく分かる人
* UniRXの超基本的なところが分かる人(具体的には IObservable, IObserver, Subject, ReactiveProperty, Subscribe, OnNext程度です)
* Unityでもう少しいい感じのコードが書きたい人
* マクロな設計についての知識を増やしたい人
* ※「switch文を消したい」や、「個々のオブジェクトの生成方法」などのコードレベルのミクロな設計については対象外です

# リンク
[第1章「ModelとView」・理論編](https://qiita.com/wolfmagnate/items/0e5f0e29b1d01e359eeb)
[第1章「ModelとView」・実践編](https://qiita.com/wolfmagnate/items/579a7b8dd007f6fbb5c3)
[第1章(補足)「変わるものと変わらないものの分離」](https://qiita.com/wolfmagnate/items/5aa039e027ca8a1cdfd8)
[第1章(補足)「オブジェクト指向とコンポーネント指向」](https://qiita.com/wolfmagnate/items/f9fc2ac39ef74d9d8fbd)
[第2章「MVXの思想」・理論編その1](https://qiita.com/wolfmagnate/items/314c084b41b8086d466a)
[第2章「MVXの思想」・理論編その2](https://qiita.com/wolfmagnate/items/acc990e5ed0990e149c1)
[第2章「MVXの思想」・実践編その1](https://qiita.com/wolfmagnate/items/cc97802018babf18102a)
[第2章「MVXの思想」・実践編その2](https://qiita.com/wolfmagnate/items/f0cef95b74177074624f)
[第3章その1「監視型View」・理論編](https://qiita.com/wolfmagnate/items/7a23864070f8b0392506)
[第3章その2「Passive View」・理論編](https://qiita.com/wolfmagnate/items/a0ac9458ef395249d4c0)

# 続編
続編、[Unity・MVP設計実践](https://qiita.com/wolfmagnate/items/4b1a1d0cf8db7ff7d66f)を連載しています。Unity設計入門で得られた理論的な知見をもとに、具体的なプロジェクトを設計して、UnityでのMVP設計の実際的な手法について解説しています。第3章の理論的な知見をもとに、実際の開発への応用を目指しました。
TableViewCellを並び替える機能を使ってみる

#今回の内容

<img width="150" alt="215AE899-50C0-4EAE-9A90-31EA035E6CA5_1_201_a.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1466343/34189c3b-e902-f668-df77-d72881b35668.jpeg"> <img width="150" alt="A16C72EA-38C8-469C-A202-B5DD135CF614_1_201_a.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1466343/1d7e53cb-1e22-5d47-e5d5-465e6bb77eb3.jpeg">


#コードと簡単解説

* `    func tableView(_ tableView: UITableView, canMoveRowAt indexPath: IndexPath) -> Bool {}`でcellを並び替える事を可能にするかを`true`または`false`で設定します。

* `    func tableView(_ tableView: UITableView, moveRowAt sourceIndexPath: IndexPath, to destinationIndexPath: IndexPath) {}`で、cellを並び替えるときに働かせる処理を設定します。

* `func tableView(_ tableView: UITableView, editingStyleForRowAt indexPath: IndexPath) -> UITableViewCell.EditingStyle {}`でcellの左側に表示する内容を設定します。今回は、`.none`で何も表示しないようにしています。

* `editingStyleForRowAt`を`.none`で設定した事によって残ってしまった空白を削除する為に、`func tableView(_ tableView: UITableView, editingStyleForRowAt indexPath: IndexPath) -> UITableViewCell.EditingStyle {}`を`false`で設定します。

``` Swift:
import UIKit

class ViewController: UIViewController {

    let tableView = UITableView()
    
    var cellContentsArray = ["UIKit","SwiftUI","MapKit","ARKit","CoreML","WebKit","Foundation","LocalAuthentication","CoreGraphics","Combine"]
    
    override func viewDidLoad() {
        super.viewDidLoad()
       
        tableView.register(UITableViewCell.self, forCellReuseIdentifier: "Cell")
        tableView.frame = CGRect(x: view.frame.minX, y: view.frame.minY, width: view.frame.width, height: view.frame.height)
        tableView.isEditing = true
        view.addSubview(tableView)
        
        tableView.dataSource = self
        tableView.delegate = self
    }
}

extension ViewController:UITableViewDataSource{
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        
        return cellContentsArray.count
    }
    
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        
        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
        cell.textLabel?.text = cellContentsArray[indexPath.row]
     
        return cell
    }
    
    func tableView(_ tableView: UITableView, canMoveRowAt indexPath: IndexPath) -> Bool {
        
        return true
    }
    
    func tableView(_ tableView: UITableView, moveRowAt sourceIndexPath: IndexPath, to destinationIndexPath: IndexPath) {
        
        let cellContent = cellContentsArray[sourceIndexPath.row]
        cellContentsArray.remove(at: sourceIndexPath.row)
        cellContentsArray.insert(cellContent, at: destinationIndexPath.row)
    }
    
}

extension ViewController:UITableViewDelegate{
    
    func tableView(_ tableView: UITableView, editingStyleForRowAt indexPath: IndexPath) -> UITableViewCell.EditingStyle {
        
        return .none
    }
    
    func tableView(_ tableView: UITableView, shouldIndentWhileEditingRowAt indexPath: IndexPath) -> Bool {
        
        return false
    }
}

```

# 終わり
ご指摘、ご質問などありましたら、コメントまでお願い致します。
I18n機能　日本語化対応

1．デフォルト言語の設定

デフォルト言語を日本語に変更するため、下記のコードを`config/application.rb`に追加

```ruby:config/application.rb
module I18nApp
  class Application < Rails::Application
    config.i18n.default_locale = :ja # 追加
  end
end
```

2．ja.ymlの作成
![スクリーンショット 2021-10-13 230300.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273803/0df3ff68-b2c4-d1e5-4990-ffcbe93b2f25.png)
【深層学習】活性化関数Leaky ReLUについて

深層学習モデルを構築する時、うまく活性化関数を選ぶことは大事です。
[前編](https://qiita.com/PuchiCorner/items/d71033e903c27be874a7)に続き、もう一つ活性化関数<strong>Leaky ReLU</strong>について紹介したいと思います。

## Leaky ReLUとは?
Leaky ReLUはReLUの派生形の一つです。
数式を書くと


```math
f(x) = max(ax, x)
```
ちなみに、$a$の数値は0.01で設定される場合が多いです。
数式により、$x$が負数の場合であれば$f(x)$は$ax$になるでしょう。

Pythonで書いてみると

```python
def leaky_relu(x):
    return max(0.01*x, x)
```

## Leaky ReLUの微分

- $x$が正数の場合であれば:

```math
\frac{\mathrm{d} f(x)}{\mathrm{d} x}=\frac{\mathrm{d} x}{\mathrm{d} x}=1
```

- $x$が$0$以下の場合であれば:

```math
\frac{\mathrm{d} f(x)}{\mathrm{d} x}=\frac{\mathrm{d} ax}{\mathrm{d} x}=a
```
Pythonのif文で書いてみると

```python
def leaky_relu_derivative(x):
    if x >= 0 :
        return 1
    if x < 0 :
        return 0.01
```

## Leaky ReLUのグラフを作成

```python
import numpy as np
import matplotlib.pyplot as plt

# inputデータ作成
X = np.linspace(-10, 10, 100)

plt.figure(figsize=(8,6))
plt.plot(x, list(map(lambda x: leaky_relu(x), X)), label="Leaky ReLU")
plt.plot(x, list(map(lambda x: leaky_relu_derivative(x), X)), label="Derivative of Leaky ReLU")
plt.title("Leaky ReLU")
plt.legend()
plt.show()
```
![截圖 2021-10-13 22.57.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067829/be8cf365-b8ae-6315-816d-167f18eefdf8.png)

オレンジの線を見ると、
$x\ge0$の時、微分の数値は$1$で、
$x\lt 0$の時、微分の数値は$0$に近いですが、実は$0.01$です。

以上、簡単にメモしました。
【css】命名規則について考える

マークアップをしているときに、

* 誰がみてもわかるルールで
* あとから融通のきくように

と、誰だって考える。
でもこれは、考えてるだけじゃできない。なんでもそうだけど、しっかり理解していないとできない。
かく言う自分もちゃんと出来ていなくて。あらためて整理してみたい。
特に今回は、cssの命名規則について

# BEM

> Block / Element / Modifier

もう有名すぎて解説すべきことはなにもない。

```
block__erement--modifier
```

アンダーバーとハイフン2つずつで区切る。
LPとか、1ページ1ページがユニークなデザインのサイトに向いているんじゃないかと思ってる。

```html:サンプル
<section class="intro">
  <h1 class="intro__title">イントロダクション</h1>
  <dl class="intro__description">
    <dt class="intro__description--term">BEMが好き</dt>
    <dd class="intro__description--text">
      BEMが好き。<br>
      だってとってもわかりやすから。
    </dd>
  </dl>
</section><!-- /intro -->

<section class="about">
  <h2 class="about__title">わたしについて</h2>
  <dl class="about__description">
    <dt class="about__description--name">名前は●●です。</dt>
    <dd class="about__description--favorite">
      cssが好き。htmlも好き。<br>
      javascriptはあまり好きじゃない。
    </dd>
  </dl>
</section><!-- /about -->
```

といった感じで、class名見ればだいたい何についてやってるかわかる。

# FLOCSS

> Foundation / Layout / Object(component,project,utility)

cssをレイヤとオブジェクトにわけて、パーツ化する。
class名の、命名ルールについても、上で引用した5つの頭文字を取って接頭語とするので、どのレイヤ、パーツに属しているのかすぐわかる。
同じレイアウトや色違いのパーツなどを使い回す大規模なコーポレートサイト等で威力を発揮すると思ってる。

```
.f-base
.f-header
.c-button
.p-pagename
.u-mt
etc......
```

あとからパーツが増えたときも、該当のcssファイルに追加するだけなので管理しやすい。

# scssとの親和性

BEMもFLOCSSもscssとの親和性がすごく高い。
ただのcssであれば長ったらしくなって逆に手間だったけれど、scssの登場で変わった。

```scss:サンプル
/* BEM */
.intro{
  &__title{
    ...
  }
  &__description{
    &--term{
      ...
    }
    &--text{
      ...
    }
  }
}

/* FLOCSS */
.f-{
  &header{
    ...
  }
  &footer{
    ...
  }
}
```

# 名前、なににする？

ちゃんと理解してないとここでハマる。
BEMはそのページ内でちゃんとルール守っていれば、まぁいいかってなるときもあるかもしれない。
でもFLOCSSだと、このパーツはどのレイヤに所属するべきか。他にどんなパタンが想定されるか、エトセトラ。
初期設計しっかりしておかないと、あとからわけのわからないものどんどん追加されて、
「なんかFLOCSSっぽいけど、担当変わって壊れたな」
なんて思われかねない。

そしてどちらにも共通して言えるのが、なんという名前にするか。
「ええと、金融機関の説明？　英語にすると……」
「ここは●●ページのタイトルで、ここはイントロダクションで、これはA要素の見出しと説明文でこっちは……」

自分は英単語の基礎知識少ないし文節をぱっと英語にもできないから結構調べならが決める。
この時間がもったいない（英語を勉強すれば解決するのか？　とたまに思う）。

# ユーティリティ名で攻める

最近、なんかこれもありかなぁという気がしてきた。
でもユーティリティの設定だけでどうにかなるとは思えない。
各ページでどうしてもユニークにcssを記述する箇所が出てきそう。
そうなったときは結局なにか名前をつけなくちゃいけない。

# BEMかFLOCSSか

これらもご多分に漏れず一長一短だと思ってる。
なんでもそうだけど、そのケースにあわせて最適なものを選択したい。
J 言語でクイックソートをクイックに実装する

# はじめに

「クイックソート」が Twitter のトレンドに上がってたので、 J 言語でクイックソート（昇順）をクイックに実装します。[^quick]

[^quick]: ここでの「クイック」は、実行速度を速くするという意味ではなく、コード記述量を減らして実装を素早く行うという意味で使っています。

# ピボット

今回、ピボットは乱数で選びます。
J 言語では乱数は `?` で生成できます。

```j:REPL
   ? 10    NB. [0,10) の範囲で乱数生成
6
   ? 10
3
   ? 10
9
```

配列のサイズは `#` でとれます。

```j:REPL
   # 1 2 3
3
   # 3 1 4 1 5 9 2 6 5 3 5 8 9 7 9
15
```

つまり、 `?@#` で配列のインデックスをランダムにとれます。

```j:REPL
   ?@# 1 2 3 4 5
3
   ?@# 1 2 3 4 5
1
```

あとは `{` でそのインデックスの要素を取り出せばピボットが取り出せます。

```j:REPL
   a=: 1 2 3 4 5
   ]i=: ?@# a
2
   i { a
3
```

おっと、 J 言語ではこんなに長ったらしく書く必要はありません。
フォークを使ってクイックにまとめましょう。

```j:REPL
   (?@# { ]) 1 2 3 4 5
3
```


# ピボットより小さい要素と大きい要素に分割

配列の要素をある条件で絞り込むときは `#` が使えます。

```j:REPL
   0 1 0 1 1 # 1 2 3 4 5    NB. 左引数が 1 のところだけ抽出
2 4 5
   1 2 3 4 5 >: 3    NB. 3 以上なら 1
0 0 1 1 1
   1 2 3 4 5 (>: # [) 3    NB. 3 以上の要素を抽出
3 4 5
```

これをピボットを選ぶコードと組み合わせます。

```j:REPL
   a=: 3 1 4 1 5 9 2 6 5 3 5
   ]pivot=: (?@# { ]) a    NB. ピボット選出
5
   a (< # [) pivot    NB. pivot より小さい要素
3 1 4 1 2 3
   a (= # [) pivot    NB. pivot と等しい要素
5 5 5
   a (> # [) pivot    NB. pivot より大きい要素
9 6
```

うーーん。
変数がたくさん出てきて、これでは全然クイックじゃないです。
フックとフォークを使ってクイックにまとめましょう。

```j:REPL
   (((< # [) ; (= # [) ; (> # [)) (?@# { ])) 3 1 4 1 5 9 2 6 5 3 5
+-----------+-----+---+
|3 1 4 1 2 3|5 5 5|9 6|
+-----------+-----+---+
```

これでクイックになりました。


# 再帰

あとは配列の長さが 1 以下になるまで再帰するだけです。

再帰では終了条件をつける必要がありますが、条件分岐には `^:` を使います。
実はこれは繰り返しの演算子なのですが、繰り返し回数を指定するところに boolean を指定して、条件分岐のようにも使います。 ~~Brainfuck みたい~~

```j:REPL
   (1+3&*)^:(1=2&|) 1    NB. 奇数ならば（ 2 で割った余りが 1 ならば） 3 掛けて 1 足す
4
   (1+3&*)^:(1=2&|) 2
2
   (1+3&*)^:(1=2&|) 3
10
```

なので、配列の長さが 1 より大きいとき、ピボットより小さい要素と大きい要素をそれぞれ抽出した配列を再帰でクイックソートして、繋げ直すコードは次のように書けます。

```j:REPL
   quicksort=: ((quicksort@(< # [) , (= # [) , quicksort@(> # [)) (?@# { ]))^:(1 < #)
   quicksort 3 1 4 1 5 9 2 6 5 3 5 8 9 7 9
1 1 2 3 3 4 5 5 5 6 7 8 9 9 9
```

もう少しクイックにしましょう。
再帰でその動詞（関数）自身を呼び出すときに、その動詞の代わりに `$:` が使えます。

```j:REPL
   quicksort=: (($:@(< # [) , (= # [) , $:@(> # [)) (?@# { ]))^:(1 < #)
   quicksort 2 7 1 8 2 8 1 8 2 8 4 5 9 0 4 5
0 1 1 2 2 2 4 4 5 5 7 8 8 8 8 9
```

# おわりに

クイックソートの実装の部分は空白を除いて 41 字！　クイックですね！[^sort-dake]
始めは何を書いてるのかわからないかもしれませんが、慣れるとわりと読めます。
J 言語を使って、タイプ回数最小限のクイック実装生活を送りましょう。

[^sort-dake]: （昇順）ソートをしたいだけの時は `/:~` でソートできます。降順は `\:~` です。クイックですね。
海しるAPIを使ってみる

[海しる](https://www.msil.go.jp)のAPI

https://portal.msil.go.jp

いまは[試用サブスクリプションキー](https://portal.msil.go.jp/howtouse)を使う。

とりあえず動く様子を確かめたいので、API一覧を取得してみる。

https://portal.msil.go.jp/api-details#api=api&operation=getlists

よくわからないけど「Try it」-> 試用サブスクリプションをペーストして「HTTP」を選択して「send」すれば、API一覧が表示される。
「Ruby」を選択してコードをコピーしてpaizaで実行すれば、API一覧が表示される。

```
require 'net/http'

uri = URI('https://api.msil.go.jp/apis/v1/')

request = Net::HTTP::Get.new(uri.request_uri)
# Request headers
request['Cache-Control'] = 'no-cache'
request['Ocp-Apim-Subscription-Key'] = '0e83ad5d93214e04abf37c970c32b641'
response = Net::HTTP.start(uri.host, uri.port, :use_ssl => uri.scheme == 'https') do |http|
    http.request(request)
end

puts response.body
```

続き

https://qiita.com/hightidesgoodvibes/items/66f7b58380b881104923
Blender Python入門してみた


# Blenderをpythonで操作したい

# 環境

```
mac os catalina 10.15.7

$ python -V 
python 2.7.16
$ /Applications/Blender.app/Contents/MacOS/Blender -v
Blender 2.93.4
```

# スクリプトの実行方法

CLIで実行する方法と、BlenderのGUIで実行する方法があります。

## ①CLIで実行する方法

### CLIでBlenderを立ち上げる

次のコマンドでターミナルからBlenderを立ち上げることができます。
Blenderアイコンから立ち上げた時と同じように、初期画面が表示される。

```
$ /Applications/Blender.app/Contents/MacOS/Blender
```

### スクリプトを指定して立ち上げる

12個の球体が均等に表示されるpython scriptを作ります。

```loop.py
import bpy
import math

# 既存要素削除
for item in bpy.data.meshes:
    bpy.data.meshes.remove(item)

N = 12
RR1 = 10.0
RR2 = 2.0
for i in range(0, N):
    rad = 2 * math.pi * i /N  # 角度計算2π i /n
    xx = RR1 * math.cos(rad) # x座標計算 半径*cosθ
    yy = RR1 * math.sin(rad) # y座標計算 半径*sinθ
    # 球体作成
    bpy.ops.mesh.primitive_ico_sphere_add(location=(xx, yy, 0),radius= RR2, subdivisions = 5 )
```

上でimportしようとしているbpyモジュールは、Blenderがバックグラウンドで動いている状態でしか動かない。なので、単純に`python loop.py`としても動かない。

```
$ python loop.py
Traceback (most recent call last):
  File "loop.py", line 1, in <module>
    import bpy
ImportError: No module named bpy
$
```


以下で実行します。

```
$ /Applications/Blender.app/Contents/MacOS/Blender --python loop.py
```

![スクリーンショット 2021-10-13 22.22.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576001/3ec0a0cf-b14d-2b2d-a0df-cbe3f6f9c21b.png)

## ②BlenderのGUIで実行する方法

以下のように、右上にtext editer、右下にpython consoleを表示。
text editerでは、実行したいコードを書いておく。

![スクリーンショット 2021-10-14 17.53.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576001/0fe0fc4a-09eb-1dee-30a1-1692cae97622.png)

右上の三角マーク「Run Script」で実行することができる。

![スクリーンショット 2021-10-14 17.55.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576001/d75579f1-658c-ea4a-6f07-e7c345ad4a27.png)

また、「Scripting tab」を開くと、GUIでの操作がpythonだとどう書かれるかリアルタイムで確認することができる。![スクリーンショット 2021-10-14 18.29.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576001/72ac9bea-73d3-4ba7-33ed-217dad6497d6.png)


オブジェクトやキーフレームの生成や削除、移動などの操作がわかってきたら、公式ドキュメントを読んで引数の意味や種類を調べる。

https://docs.blender.org/api/current/index.html
obniz で熱中症予防（温度変化をブザー音とLED信号で知らせる）

生活の中で、何か役に立つものが作れたら良いなと考えています。
部屋が暑かったので、室温を図る、さらに熱中症の予防ができるものがあれば良いと考え作ってみました。
検証しやすくする為に、温度センサーの設定を、31℃以下を平温、31-32℃をやや高温、32℃以上を高温としています。

下準備
①　obnizスターターキットの用意
②　obnizの端子にパーツを接続
　　　ブザー：signal:0, vcc:1, gnd:2
　　　LEDライト：gnd:8, green:7, yellow:6, red:5 （逆さまに装着）
　　　温度センサー：signal:9, vcc:10, gnd:11

実行
　obniz HTMLエディタを開き、以下のコードを入力。

```html
    <html>
      <head>
        <script src="https://unpkg.com/obniz@3.x/obniz.js"></script>
      </head>
      <body>
    <script>
      var obniz = new Obniz("OBNIZ_ID_HERE"); // ここに自身のobniz IDを入力する

      obniz.onconnect = async function () { 
        var speaker = obniz.wired("Keyestudio_Buzzer", {signal:0, vcc:1, gnd:2});
        var light = obniz.wired("Keyestudio_TrafficLight", {gnd:8, green:7, yellow:6, red:5});
        var tempsens = obniz.wired("Keyestudio_TemperatureSensor", {signal:9, vcc:10, gnd:11});

        let i =0;
        while(true){
          i++;

          if (i > 3600) {
            speaker.stop();
            break;
          }

          const temp = await tempsens.getWait(); // awaitを利用
          console.log(temp);

          if (temp < 31) { // 31℃未満（平温の設定）
            light.single("green"); // green
            await obniz.wait(100);
            light.green.off();
            await obniz.wait(900);
            continue;

          } else if (temp < 32) { // 31-32℃（やや高温の設定）
            speaker.play(130.813) // 130.813 Hz；「ド」
            light.single("yellow"); // yellow
            await obniz.wait(200);
            speaker.stop();
            light.yellow.off();
            await obniz.wait(800);
            continue;

          } else { // 32℃以上（高温の設定）
            speaker.play(261.626) // 261.626 Hz；「次のド」
            light.single("red"); // red
            await obniz.wait(200);
            speaker.stop();
            light.red.off();
            await obniz.wait(200);
            continue;

        }
      }
      }
    </script>
      </body>
    </html>
```
https://twitter.com/21HideK/status/1448254433863761925

工夫を要した箇所
　①3つのパーツがあるので、各パーツの配置を少し工夫した。
　②警報音を分かりやすくするため、
　　　やや高温の時は低温の「ド」を長く少なく鳴らす設定
　　　高温の時は1音階上の「ド」を短く頻回に鳴らす設定　にした。
　③その他
　　「かえるのうた 歌詞付き」を作るときに、端子の番号の小さい方へ刺さっている
　　　パーツから順番にコードを書くことが必要であったので、今回は順番を意識し、
　　　エラーは出なかった。
PAD: Excel からデータ取得する際はやっぱりSQLですね

# 背景

PAD(Power Automate Desktop) を使い始めて Sample を社内向けに作成し始めたところ
Excel の Action をそのまま使うとやっぱり重いなぁと思い、SQL で高速化しようというお話。

とりあえずのゴールは、Select のみ。Insert/Update またいずれ

# 取得対象のExcel
A1にごみを入れて、これを外して取得するために、Table取得したかったんですが・・方法が分からなかったので、Sheet＋Cell範囲指定で取得してます😂
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/d418acaf-e9d2-b150-c0cb-61cddc91712e.png)

## 今回やりたかったけど、できなかったこと
1. Table取得
    1. これが出来たら、無駄な範囲指定無くせるんですけどね・・
1. Query 取得 (Power Query)
    1. Tableと同様
1. Tableとかの一覧取得
    1. 指定方法が見えてくるんじゃないかなぁと思い、Excelをソースとして渡して結果取得したかったんだけど・・

# フロー例
二種類の Provider での接続例

1. 接続Excel のPathを変数へ格納
1. Connection String の生成
1. SQL 実行

```connectionString:OleDB
Provider=Microsoft.ACE.OLEDB.12.0;Data Source=%ExcelFilePath%;Extended Properties="Excel 12.0 Xml;HDR=YES";
```
```connectionString:ODBC
Provider=MSDASQL;Persist Security Info=False;Mode=Read;Extended Properties="DSN=Excel Files;DBQ=%ExcelFilePath%;DriverId=1046;MaxBufferSize=2048;PageTimeout=5;ReadOnly=1;";
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/29356a7f-4430-5805-b27e-e9c78a770aeb.png)


```robin:RetreiveExcelDataBySQL
SET ExcelFilePath TO $'''C:\\Users\\UserName\\Downloads\\SampleData.xlsx'''
Database.Connect ConnectionString: $'''Provider=Microsoft.ACE.OLEDB.12.0;Data Source=%ExcelFilePath%;Extended Properties=\"Excel 12.0 Xml;HDR=YES\";''' Connection=> SQLConnection
Database.Execute Connection: SQLConnection Statement: $'''Select * From [DataTable$B2:F]''' Timeout: 4 Result=> ResultWithoutEndRowNumber
Database.Execute Connection: SQLConnection Statement: $'''Select * From [DataTable$B2:F] DataT ''' Timeout: 4 Result=> ResultAliasTableName
Database.Execute Connection: SQLConnection Statement: $'''Select * From [DataTable$B2:F] DataT Where DataT.Column1 > 5''' Timeout: 4 Result=> ResultWithWhere
Database.Connect ConnectionString: $'''Provider=MSDASQL;Persist Security Info=False;Mode=Read;Extended Properties=\"DSN=Excel Files;DBQ=%ExcelFilePath%;DriverId=1046;MaxBufferSize=2048;PageTimeout=5;ReadOnly=1;\";''' Connection=> SQLConnection
Database.Execute Connection: SQLConnection Statement: $'''Select *  From [DataTable$B2:F12] Where [Column4]  is not NULL''' Timeout: 4 Result=> QueryResultDataOnly
```

## 補足

1. Table 指定方法
    - [{Table Name}$]
        - ex.) [DataTable$]
    - [{Table Name}${Cell範囲指定}]
        - ex.) [DataTable$B2:F8]
        - ex.) [DataTable$B2:F]  最終行番号を省略してお任せすることも可能
1. Table の別名
    - 'as' 無しで、定義名書くだけ
        - ex.) Select * From [DataTable$B2:F] DataT
1. ヘッダー認識設定
    1. HDR=YES

Connection String とかは 検索すれば色々出てくると思うので割愛

# あとがき

PADは便利ですよね。
市民開発者増えていって SQL が誰しもが使う未来が来るのかな？と思うと
来年の新人教育に PAD + SQL も入れようかな。

# 参考

https://docs.microsoft.com/ja-jp/power-automate/desktop-flows/how-to/sql-queries-excel

https://www.connectionstrings.com/excel-2013/

# Keyword

how to retreive Excel Data by SQL
SQLの関数をおさらいしてみた

#関数とは
関数とはあるデータを受け取り、定められた独自の処理を実行し、その結果を返す命令のことです。データベースではより高度な処理を実行するためにたくさんの関数が存在してます。
例えばLNGTH関数はある文字列をその文字列の長さ（文字数）に変換する機能を持っています。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1265227/1e426ebd-d6ab-0206-2e4c-8da50e31481a.png" width=60%>

SQLの関数を使う際は以下の事が定められています。
・名前：その関数の名前
・引数：その関数を呼び出す際に引き渡す情報
・戻り値：その関数の呼び出し結果として得られる情報

先程のLENGTH関数を例に見てみると
・名前：LENGTH
・引数：文字が格納された列
・戻り値：文字列の長さを表す数値

関数は式の評価と同様に、各行ごとに呼び出されます。

それでは代表的な関数を紹介します。

##文字列にまつわる関数
###LENGTH
```sql:sql
LENGTH(文字列を表す列) => 文字列の長さを表す数値
LEN(文字列を表す列) => 文字列の長さを表す数値
```
例えば１０文字以上のタイトルだけを取得するSQLは下記のように書けます。

```sql:sql
SELECT　タイトル, LENGTH(タイトル) AS タイトルの長さ FROM 映画　WHERE　LENGTH(タイトル) >= 10
```

###TRIM
```sql:sql
TRIM(文字列を表す列) => 左右から空白を除去した文字列
LTRIM(文字列を表す列) => 左から空白を除去した文字列
RTRIM(文字列を表す列) => 右から空白を除去した文字列
```
たとえばCHAR(10)型の列に対して”タイトル”と入力すると６文字の空白が自動で追加されます。
つまり'タイトル　　　　　　'といた具合になります。この時TRIM関数を用いて下記のように記述すると空白を除去する事ができます。

###REPLACE
文字列の一部を別の文字列に置換する関数です、「アソパソマソ」の「ソ」を「ン」に変換することで「アンパンマン」とすることができます。

```sql:sql
REPLACE（置換対象の文字列, 置換前の部分文字列,　置換後の部分文字列）　=>　置換処理された文字列
```
###SUBSTRING
文字列の一部分だけを抽出できる関数です。

```sql:sql
SUBSTRING（文字列を表す列, 抽出を開始する位置,　抽出する文字の数）　=>　抽出された部分文字列
```
###CONCAT
文字列を連結する関数です。

```sql:sql
CONCAT（文字列, 文字列） => 連結後の文字列
```
##数値にまつわる関数
###ROUND
ROUNDは指定した位置で四捨五入した結果を返す関数です。

```sql:sql
ROUND（数値を表す列, 有効とする桁数） => 四捨五入した値
```

###POWER
POWERはべき乗した結果を返す関数です。
二乗などの場合は計算式として（２＊２）などで実現できますが１００乗等の場合いちいち書くのは面倒です。そんな作業をPOWER関数では簡単に実現できます。

```sql:sql
POEWER（数値を表す列, 何乗するかを指定する数値） => 数値を指定した回数だけ乗じた結果
```

##日付にまつわる関数
###CURRENT_DATE, CURRENT_TIME
CURRENT_DATEは現在の日付、CURRENT_TIMEは現在の時刻を返す関数です。

```sql:sql
CURRENT_DATE => 現在の日付（YYYY-MM-DD）
CURRENT_TIME => 現在の時刻（HH:MM:SS）
```
※CURRENT_DATE, CURRENT_TIMEは引数が不要なので後ろに（）が付きません。

##変数にまつわる関数
###CAST
ある方のデータを別のデータに変換する関数です。例えば出金額という列があった時に末尾に「円」という文字列を連結して表示したいとします。「出金額 + '円'」としたいところですが数値と文字列という異なる型を||演算子で連結するのは定義されていない演算であります。そこで下記のように文字型を揃えてから連結することで期待する処理を実現できます。

```sql:sql
CAST（　出金額 AS VARCHAR(20)） + '円'
```

###COALESCE（コアレス）
COALESCEは複数の引数を受け取り、受け取った引数を左から順に評価し、その中から見つかったNULLでない引数を返す関数です。

```sql:sql
COALESCE（列や式1, 列や式2, 列や式3） => 引数の内、最初に現れたNULLでない引数
```


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

##次回
- 次回は[【SQLの集計とグループ化をおさらいしてみた】]です！
FlutterでWindowsアプリを最前面に表示する

Discodeのオーバーレイ機能のように、フルスクリーン状態のアプリの上にFlutterアプリを表示する方法です。
# 方法

win32_window.cppファイルの119行目付近を書き換えます。
修正前のコードは以下になっています。

```プロジェクトフォルダ\windows\runner\win32_window.cpp
  HWND window = CreateWindow(
      window_class, title.c_str(), WS_OVERLAPPEDWINDOW | WS_VISIBLE,
      Scale(origin.x, scale_factor), Scale(origin.y, scale_factor),
      Scale(size.width, scale_factor), Scale(size.height, scale_factor),
      nullptr, nullptr, GetModuleHandle(nullptr), this);

```

`CreateWindow`を `CreateWindowEx`に変更し、
第1引数に`WS_EX_TOPMOST`を追加します。

```プロジェクトフォルダ\windows\runner\win32_window.cpp
  HWND window = CreateWindowEx(
      WS_EX_TOPMOST,
      window_class, title.c_str(), WS_OVERLAPPEDWINDOW | WS_VISIBLE,
      Scale(origin.x, scale_factor), Scale(origin.y, scale_factor),
      Scale(size.width, scale_factor), Scale(size.height, scale_factor),
      nullptr, nullptr, GetModuleHandle(nullptr), this);
```

これでWidgetが最前面に表示されます。
# 解説

CreateWindow関数はWin32APIでウィンドウを作成するための関数です。
CreateWindowEx関数はCreateWindowを拡張したもので、第1引数でスタイルを指定できるようになります。
そのスタイルに`WS_EX_TOPMOST`を指定することで最前面に表示されます。
ある日MySQLが急に動かなくなった時のデバッグ( The server quit without updating PID file )

#はじめに
ある日突然、rails s でエラーが発生したので解決した方法を記録します。
誰かの参考になることを祈ります。

#開発環境
- macOS BigSur 11.6
- zsh: 5.8 (x86_64-apple-darwin20.0)
- Ruby: 2.6.3
- Rails: 6.1.4.1

#発生したエラー
localhost:3000: ![Access denied for user 'root'@'localhost' (using password: NO)](https://kitsune.blog/wp-content/uploads/access-denied.png "")

```zsh:
$ mysql.server start

#出力
Starting MySQL
. ERROR! The server quit without updating PID file (/usr/local/var/mysql/*******.local.pid).
```
その後、brew doctor、アクセス権限の再付与、エラーログのファイルを覗いて対策したり小手先のデバッグを色々してみたが結局似たようなエラー。
前日まで元気に動いていたのに、、、（涙目）
ということで1度再インストールし直すのが良さげなので実践。

#原因？
MySQLのバージョン切り替え時に出るエラーらしい。
バージョンは変更していないのでHomebrewのアップデートでMySQLまでバージョンが切り替わり、前のバージョンの使用したデータが残っていたためエラーが起こった???

#対策（解決）

手順
- 現在のMySQL をアンインストール
- プロセスの削除
- 新しくMySQL をインストール
上記の通り進めていきます。

###1. 現在のMySQL をアンインストール

```zsh:

brew uninstall mysql
brew uninstall --force mysql
brew cleanup -s mysql

#brew uninstall mysql　では削除できないファイル群の削除
rm -rf /usr/local/mysql
rm -rf /Library/StartupItems/MYSQL
rm -rf /Library/PreferencePanes/MySQL.prefPane
rm -rf /Library/Receipts/mysql-.pkg
rm -rf /usr/local/Cellar/mysql*
rm -rf /usr/local/bin/mysql*
rm -rf /usr/local/var/mysql*
rm -rf /usr/local/etc/my.cnf
rm -rf /usr/local/share/mysql*
rm -rf /usr/local/opt/mysql
```

以下のコマンドで削除できているか確認します。

```zsh:
mysql --version
which mysql
```

消えてればOK。

###2. プロセスの削除

削除したMySQLとバージョンの違うMySQLがインストールされたとき、もとのバージョンのプロセスが残っているとエラーが発生することがあるらしいので削除しておく。

```zsh:
#プロセスの確認
ps -ef | grep mysql
#出力
 501 41981     1   0  8:19PM ttys002    0:00.02 /bin/sh /usr/local/Cellar/mysql/8.0.26/bin/mysqld_safe --datadir=/usr/local/var/mysql --pid-file=/usr/local/var/mysql/UsersMacBook-Pro.local.pid

#表示されたプロセスを削除
kill -9 41981
```

killコマンドのオプション-9で強制終了。上記の41981がプロセスIDです。

###3. 新しくMySQL をインストール

```zsh:
#brewコマンドで新しくMySQLをインストール
brew install mysql

#インストール完了したら
mysql.server start
mysql -u root
#ログインが確認できたらexit

#Railsアプリに必要なら必要に応じて
rails db:create
rails db:migrate
rails db:seed
```

# 参考文献

・[The server quit without updating PID file　mysqlエラー解決方法](https://qiita.com/kazu_wsx/items/bb787e9e4e919da03705#1%E3%81%BE%E3%81%9Alocal%E9%85%8D%E4%B8%8B%E3%81%AEmysql%E3%82%92%E5%85%A8%E3%81%A6%E5%89%8A%E9%99%A4%E3%81%99%E3%82%8B)
・[MacでHomebrewを使ってinstallしたMySQL5.6とMySQL5.7を切り替えて使う](https://qiita.com/t_oginogin/items/76ca2b6ce18d53988dc3)
・[MySQL起動エラーの対処の仕方【Can't connect to local MySQL server through socket '/tmp/mysql.sock' (38)】](https://qiita.com/k-yasuhiro/items/95a60618d9743e3749a2)
・[mysqlが死んだ日](https://qiita.com/katao@github/items/ed1625f3302d62de0d5f)


#終わりに
無事解決してよかった、、、。（切実）
Twitterで日々の学習をアウトプットしています。
未熟者ですが、ご興味あれば覗いてやってください。→[Twitter](https://twitter.com/ishii_engneer)
Unity2DのチュートリアルをInputSystemに書き換える(3)

[前](https://qiita.com/DiveMasakazu/items/4bea8541e9610571261a)



## EnhancedTouch
というわけでスライドで発射するように適当に作ってみた

```
foreach (var touch in Touch.activeTouches){
    switch (touch.phase){
        case TouchPhase.Began:
            touchPos = touch.screenPosition;
            break;
        case TouchPhase.Moved:
            Debug.Log( $"Touch: Id {touch.touchId} Position {touch.screenPosition} Phase {touch.phase}\n" );
            break;
        case TouchPhase.Ended:
            Vector2 shoot = (touch.screenPosition - touchPos);
            shoot.Normalize();
            Launch(shoot); // Launchは引数に発射方向を与えるように変更した
            break;
    }   
}
```

スライド方向に出るので、手裏剣の場合はこういう感じなのかな。
このままだとタッチするだけでも弾が出てしまうので、shootの長さが一定以上の場合みたいなのを入れないとダメっぽい。


```
Vector2 shoot = (touch.screenPosition - touchPos);
if( shoot.magnitude > (Screen.currentResolution.width/3) ){
    Debug.Log(shoot.magnitude + "/" + Screen.currentResolution.width/3);
    shoot.Normalize();
    Launch(shoot);
}
```

適当にスクリーンの1/3にしたら、なんとなく動いた。

今回は短いけど次は、[ここ](https://www.hekeke999.xyz/entry/2019/06/06/163807)参考に指でなぞったところ（というか、始点と現在位置）に線を引きたい。
windows10 homeにDocker for windowsを導入する手順のまとめ

今回Docker導入にあたり自分が引っかかったところがあったので自分用にまとめておきます。
※参考サイト（導入まで）
https://qiita.com/zaki-lknr/items/db99909ba1eb27803456

※仮想サーバ作って自作webサイトを表示する
https://qiita.com/sugurutakahashi12345/items/dc23dab2613b0e6103e8

導入のところサイトでは書かれていなかったので、注意点としてDockerはwindows 10 home とwindows 10 proでは導入の際に手順が違うので注意！！
※自分はこのせいで4時間くらい無駄にしたので覚えておく

またなにか新しいPCで導入するときに見直します
強化学習の手法に学ぶ、好奇心を持つことのメリット

# 結論
好奇心を持つことで目先の小さな不利益に惑わされずに、まだ見ぬ大きな利益を得る可能性を高められる

- - -

## 用語定義
- 好奇心
    - 未知のものに対する興味のこと
- エージェント
    - シミュレーションを行う主体のこと
    - ゲームをクリアさせる課題の場合、プレイヤーが操作するキャラクターをエージェントにするのが一般的
- 報酬
    - エージェントに与えられる利益のこと
    - マイナスもある
    - エージェントは最終的な報酬を最大化するように行動する

- - -

# 根拠

- - -

## 好奇心が必要ないパターン
※説明用の課題にはUnity向けの強化学習ライブラリである[ML-Agents](https://github.com/Unity-Technologies/ml-agents/blob/main/docs/Learning-Environment-Examples.md)のサンプルプロジェクトを用いる

以下の課題を考える

- エージェントの頭に転がる玉が乗っている
- エージェントは頭の傾きを変更することができる
- なるべく長時間玉を落とさないことが目的

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413932/9e1552c3-369d-bfaf-fd01-46449e2d7100.png)

この課題では以下の場合に報酬を与えれば良い

- 玉が頭に乗っている時: 報酬+
- 玉が頭から落ちた時: 報酬---

この条件で学習をすると、比較的短時間の学習をするだけでボールを中々落とさないようなエージェントが出来上がる

- - -

## 好奇心が必要になるパターン
上記のシンプルな手法では対応できないパターンが存在する

以下の課題を考える

- エージェントはフィールドを縦横に動き回れる
- フィールドの中央には階段で登れる塔が存在する
- 塔の頂上にエージェントが到達することが目的
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413932/7077bddf-4af2-a477-f5ec-09dd37384a94.png)

- - -

### 好奇心なしの場合
この課題において以下の場合に報酬を与えて学習を行った

- 塔の頂上にエージェントが到達した時: 報酬+++
- 定期的に微量の報酬を与える。塔の頂上とエージェントの直線距離が近いほど多くの報酬を与える

しかし、一晩中学習させても塔の頂上にたどり着くことは無かった
長時間学習させた後のエージェントの挙動は塔の下辺りでひたすらウロウロしていた

塔の頂上とエージェントの直線距離が近いほど定期的に得られる報酬が多いため、目先の利益を考えるとこの行動が最適だからである。
塔に登るためには塔の周囲を探索して階段を見つける必要がある

**塔の周囲を探索するという行動の原動力となるのが好奇心である**

- - -

### 好奇心ありの場合
報酬を与えるタイミングを以下の様に変更して再度学習を行った

- 塔の頂上にエージェントが到達した時: 報酬+++
- 定期的に微量の報酬を与える。エージェントは周囲の環境を視覚的に観測し、前回の観測結果と今回の観測結果の差分が大きいほど多くの報酬を与える

以上の条件で数時間学習を行った結果、塔の頂上に辿りつくことができるエージェントが出来上がった

- - -

# 考察
複数の選択肢があり、それらは選んでみないと得られる利益がわからないとする。
この時、「得られた利益の大きさ」で単純に選択肢を切り捨てていくと、短期的には得をする確率が高い。なぜなら期待値が大きい選択肢が残る可能性が高いからである。

しかし、「利益の最大値と分散が大きいもの」がある場合、先程の選び方ではこの選択肢は切り捨てられる可能性が高い。
「利益の最大値と分散が大きいもの」を見つけたいのであれば、「分散の大きさ」を考慮に入れて選択肢を選ぶ必要がある。
分散の小さい選択肢は同じ結果が出続ける可能性が高いのでひとまず保留して、分散の大きい選択肢の期待値を図ることに注力すれば様々な選択肢を探索する事ができる。

前者の方法はギャンブルで堅実に利益を出したい時などに向いている。
後者の方法は明確なゴールが決まっており、それ以外の結果は意味をなさない場合など向いていると考えられる。将棋などの勝敗が決まっている課題などに使えそう

- - -

# 余談
上記の好奇心ありの条件の学習時間を短縮する為に、定期的に微量のマイナス報酬を与えてみた。
するとフィールドの探索をしなくなってしまった。
これは探索によって得られる報酬よりも定期的なマイナス報酬が上回ってしまった結果、この選択が最も苦痛が少ないと判断された為である。

この挙動を人間に当てはめてみると考えさせられるものがある。
好奇心があり、今後の過ごし方次第で大きな利益を獲得できる可能性のある人が、現在の環境による苦痛によって命を経ってしまうことはこれと同じ理屈だと考えられる。
![ダウンロード.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413932/8877b982-3072-5b26-e781-6164bd7f8d8a.gif)
Spring BootとApacheをAJPで接続する(secretRequired対応版)

ちょっと古いサイトを見て設定したらTomcatを9.0.34で追加されたSecretに
手順が対応していなくて起動しなかったのでメモ。

```
Caused by: java.lang.IllegalArgumentException: The AJP Connector is configured with secretRequired="true" but the secret attribute is either null or "". This combination is not valid.
```

secretRequiredはデフォルトtrueになっているが、今回Apacheとはlocalhost通信するので`setSecretRequired(false)`してsecretを使わない設定に変えると起動するようになる。

```java
@Bean
public WebServerFactoryCustomizer<TomcatServletWebServerFactory> servletContainer() {
    Connector connector = new Connector("org.apache.coyote.ajp.AjpNio2Protocol");
    connector.setPort(8009);
    AjpNio2Protocol protocol = (AjpNio2Protocol) connector.getProtocolHandler();
    protocol.setSecretRequired(false);  // secretを使わない
    return factory -> factory.addAdditionalTomcatConnectors(connector);
}
```

Secretを使いたい場合はTomcat側を`setSecret`すると

```java
protocol.setSecret("mysecret");
```

Apache側の設定にも同じsecretを設定しないと接続できなくなり、よりセキュアになる。

```conf
ProxyPass / ajp://host.docker.internal:8009/ secret=mysecret
```
ParaViewをインストールしたらやっておきたい初期設定

# はじめに

ParaViewの中級者になると、可視化のたびに毎回同じような設定をしてストレスが溜まることがあると思います。
そのような時は、よく使う設定をデフォルトにすると良いです。
ぜひこのページの設定を参考にしてください。
他にも色々あると思うので思い出したら追加してきます。

# 動作確認済みのバージョン

- ParaView-5.9.0

# デフォルトの背景色の変更

ParaViewを起動するとデフォルトだと、背景はグレーですが、白色に変更します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132299/33102f8d-a915-7277-3b99-b48d1e5193fb.png)


メニューバーから、ParaView > Preferences 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132299/c05aa725-3c20-36a0-1591-f281c6de55d4.png)

Settings内で、 Color Paletteタブ > Color used as background for the viewの色を白に変更 > OK

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132299/4994ac60-e992-dd18-8cb4-ea1bf9067499.png)

これで起動時の背景色を白に変更できます。


# デフォルトのカラーバーの変更

デフォルトの設定だと、`Cool to Warm`と言われる赤と青の色のレンジになっていると思います。
これのデフォルトを虹色の`Jet`に変えたいと思います。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132299/ab07e462-df1d-defa-4b54-eb1436d5399f.png)


1. Color Map Editer内のChoose Prisetをクリック
2. 設定したい配色のJetを選択し、Applyで確定しCloseをクリック
3. saveアイコンをクリック

![図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132299/85e444e0-a25f-6d39-6bd3-10522f37aab2.png)

<img width="400" alt="mojikyo45_640-2.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132299/7cb0c3c4-834f-50f3-afa8-68367072a41e.png">

# カラーバーの文字色の変更

背景を白にした場合は、カラーバーの文字の色が白のままだと見えないので、変更します。

Color Map Editorの右端のeと書かれたアイコンを押します

![図3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132299/b8d050e8-9f83-084c-4a6a-85ff6de00d5c.png)

文字の色を変更し、図のように保存します

![図4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132299/9267997b-23e9-75cf-7396-f60c50509763.png)

最後に念の為、もう一度保存しておきます。

<img width="400" alt="mojikyo45_640-2.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132299/7cb0c3c4-834f-50f3-afa8-68367072a41e.png">

以上で、カラーバーの文字色のデフォルトが変更されました

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132299/6c851089-c0bb-6d5b-f640-07d680f474e8.png)
YOLOv5自前のデータを水増しして学習する

YOLOv5で自前のデータを学習させる時に精度向上のために
簡単に水増しできる手法を紹介します

pytorchでAlbumentationsを用いて行います
主に屋外での物体検知で使う水増し処理について紹介します


###環境
・YOLOv5  https://github.com/ultralytics/yolov5


###更新履歴
2021年10月　初版

##このシリーズのゴール
学習データの水増し処理を簡単に行えるようになる

##1.準備
YOLOv5で自前データを用いてで学習できること
[colabにて学習方法が紹介されています]
(https://colab.research.google.com/github/roboflow-ai/yolov5-custom-training-tutorial/blob/main/yolov5-custom-training.ipynb#scrollTo=g8dHcni6CJYt)

さらに
データ拡張用ライブラリを導入します

```
pip install albumentations
```


##2.実装

yolov5/utils/augmentations.py
を確認します

albumentationsが導入されていれば
自動的に実行されます


```
            self.transform = A.Compose([
                A.Blur(p=0.01),
                A.MedianBlur(p=0.01),
                A.ToGray(p=0.01),
                A.CLAHE(p=0.01),
                A.RandomBrightnessContrast(p=0.0),
                A.RandomGamma(p=0.0),
                A.ImageCompression(quality_lower=75, p=0.0)],
                bbox_params=A.BboxParams(format='yolo', label_fields=['class_labels']))
```

RandomSnow
RandomRain
RandomFog
RandomSunFlare
RandomShadow
などを必要に応じて追加します

```
            self.transform = A.Compose([
                A.Blur(p=0.01),
                A.MedianBlur(p=0.01),
                A.ToGray(p=0.01),
                A.CLAHE(p=0.01),
                A.RandomBrightnessContrast(p=0.0),
                A.RandomGamma(p=0.0),
                A.ImageCompression(quality_lower=75, p=0.0)
                A.RandomSnow(p=0.2)
                A.RandomRain(p=0.2)],
                bbox_params=A.BboxParams(format='yolo', label_fields=['class_labels']))
```

yolov5/data/hyps/　にも
水増しがあるためかぶらないように注意

```
hsv_h: 0.015  # image HSV-Hue augmentation (fraction)
hsv_s: 0.7  # image HSV-Saturation augmentation (fraction)
hsv_v: 0.4  # image HSV-Value augmentation (fraction)
degrees: 0.0  # image rotation (+/- deg)
translate: 0.1  # image translation (+/- fraction)
scale: 0.9  # image scale (+/- gain)
shear: 0.0  # image shear (+/- deg)
perspective: 0.0  # image perspective (+/- fraction), range 0-0.001
flipud: 0.0  # image flip up-down (probability)
fliplr: 0.5  # image flip left-right (probability)
mosaic: 1.0  # image mosaic (probability)
mixup: 0.1  # image mixup (probability)
copy_paste: 0.1  # segment copy-paste (probability)
```
Rails 既存カラムにdefault オプションを追加



##1.使用環境
mac.os Catalina バージョン10.15.7

Ruby 3.0.1
Rails 6.0.4.1
psql (PostgreSQL) 13.4
node 14.18.10
npm 7.24.0

##2.既存のカラムにdefaultオプションついか
<br>
1.追加用のテーブルを新たに作成します
usersテーブルのadminカラムに追加する例です。

```
rails g migration change_admin_to_users
```
<br>
2.
先ほど作成したdbファイルに
#####change_column　:テーブル名, 　:カラム名, 　:データ型, null: false, default: false

```d
class ChengeAdminToUsers < ActiveRecord::Migration[6.0]
  def change
    change_column :users, :admin, :boolean, null: false, default: false
  end          
end
```
ターミナルで下記を実行

```
rails db:migrate
```
<br>
カラム追加・変更・削除は
[こちら](https://310nae.com/rails-migration/)
を参考にしてみてください！
pythonでひらがなフォルダ名を生成するやり方

#起こったこと
python2.7でフォルダ名の文字列が文字化けする
ちなみに1行目に# -*- coding: utf-8 -*-　はつけてます。

```Python:ex.py
name = "あいうえお" 
os.makedirs(name)
```
これを実行するとフォルダ名が文字化けする

#windowsのフォルダ名の文字コード
てっきりshift-jisかと思っていたけどやってみるとutf-8っぽかった
コマンドプロンプト内ではshift-jisらしいがフォルダ名やファイル名はutf-8らしい。
ちなみにpython内で文字列の扱いは難しい
https://qiita.com/yubessy/items/9e13af05a295bbb59c25
https://qiita.com/miyase256/items/0e8cc40d95bf6236729e
が内容が分かりやすかった。

というわけで
https://qiita.com/inoory/items/aafe79384dbfcc0802cf
を参考にutf8に変換した

```Python:ex2.py
        name = "あいうえお"
        utf_name = name.decode("utf-8", errors="surrogateescape")
        os.makedirs(utf_name)
```
encodeで文字列をバイト列
decodeでバイト列を文字列に直しているっぽい
内部的にはバイト列だったのか・・・？

とりあえずこれで日本語表示できるようになったのでよしとする