OmniAICreator/Qiita-1.07M huggingface dataset:
エンジニアから信頼される人事を目指して～AtCoder Beginner Contest 参戦録 #1

# はじめに

[ある有名Web系会社のエンジニア採用担当者の方が競技プログラミングに挑戦し、採用候補のエンジニアはもちろん、社内のエンジニアとのコミュニケーションに活用している事例](https://speakerdeck.com/achamixx/pepabo-tech-friday-202006)を読み、大いに刺激を受けて参加を始めたAtCoder Beginner Contest（通称ABC）。

刺激を受けたのは自分自身もエンジニア採用を担当しているからである。〇年前までソフトウェアエンジニアだったことを思い出し、久しぶりにコーディングをしてみようと思うに至った。学び直しや発見があったのでここに記録しておこうと思う。

3回参戦し、すべてでA問題（100点）とB問題（200点）を正解した
・・と書くとすごいと受け止められるかもしれないが、 [AtCoder コンテストについての tips - Qiita](https://qiita.com/drken/items/8a6f139158cde8a61dce)によると、A問題は

> 簡単な文法の確認

B問題は

> 簡単な for 文、if 文を含む処理, Fizz Buzz と同程度

とのこと。この2問どまり、というのはエンジニアだった事実を隠したくなるくらいのお恥ずかしいレベルである。が、今の自分から進歩して、社内外の優秀なエンジニア達から**「技術トークが多少わかる人事」**として信頼を得たい―その一心で、恥を忍んで今の状態を投稿することに決めた。

なお、言語は弊社フロントエンドで使われているJavaScriptを選んだ。

# AtCoder Beginner Contest お試し参戦ふりかえり

## ABC 170 （6/14開催）

- [公式解説](https://img.atcoder.jp/abc170/editorial.pdf)

### [A問題 - Five Variables](https://atcoder.jp/contests/abc170/tasks/abc170_a)

- かなり時間をかけて正答
- 「どれが0かを判定する」のところで `==0` でなく `=0` と書いてしまった

### [B問題 - Crane and Turtle](https://atcoder.jp/contests/abc170/tasks/abc170_b)

- かなり時間をかけて正答
- 問題文に「発言が正しいような鶴と亀の数の組合せが存在すれば Yes、なければ No と出力せよ。」とあったのに、全部小文字で `yes` `no` と出力してしまった

## ABC 171 （6/21開催）

- [公式解説](https://img.atcoder.jp/abc171/editorial.pdf)

### [A問題 - αlphabet](https://atcoder.jp/contests/abc171/tasks/abc171_a)

- かなり時間をかけて正答
- 「JavaScript 大文字 小文字 判定」で検索。正規表現を使用

### [B問題 - Mix Juice](https://atcoder.jp/contests/abc171/tasks/abc171_b)

- かなり時間をかけて正答
- 「JavaScript ソート」で検索

### [C問題 - One Quadrillion and One Dalmatians](https://atcoder.jp/contests/abc171/tasks/abc171_c)

- 提出できず
- 「26進数」という言葉と結びつけば解けたらしい（社内のエンジニア談）

## ABC 172 （6/27開催）

- [公式解説](https://img.atcoder.jp/abc172/editorial.pdf)

### [A問題 - Calc](https://atcoder.jp/contests/abc172/tasks/abc172_a)

- かなり時間をかけて正答
- `2+4+8` が `248` になってしまった・・散々悩んで `parseInt` を思い出した

### [B問題 - Minor Change](https://atcoder.jp/contests/abc172/tasks/abc172_b)

- かなり時間をかけて正答
- 「JavaScript 等しくない」で検索。 `!==` を忘れていた

### [C問題 - Tsundoku](https://atcoder.jp/contests/abc172/tasks/abc172_c)

- 初めて提出できたものの、用意されていた20問のテストケースのうち4つしか通らず不正解
- 計算時間も考慮する必要のある問題（エンジニアの友人談）

# おわりに

[前述のQiita記事](https://qiita.com/drken/items/8a6f139158cde8a61dce)によると、今の私のレベルの人のアドバイスは「C まで頑張って解くことを目指しましょう」。
A, Bをサクサクっと解いて、じっくりCを考えるという時間配分ができるレベルに早くなりたいなと考えている。

とは言え、エンジニア転向予定の無い私が、アルゴリズム・データ構造等コンピューターの基礎を体系的に学ぼうとすると心が折れてしまうので、まずは7月末までABCへの参加を継続することを目標にする。

また、お試しで一度やってみよう、くらいの気持ちで始めたのに、その後参加を継続できているのは、参加を促してくれたり励ましてくれるエンジニアの友人の存在が大きい。気づいたらメンター的存在になってくれていたその友人に感謝。そして、いつかこの記事の続編でCが解けたことを報告したい！
シェルスクリプトでArchLinuxにインストールされているパッケージを確認する

# 何をするコード？
シェルスクリプトでインストールされているパッケージを確認して、もしパッケージがインストールされていなかったり古かったりしたら警告を出します。

# コード

```bash
dependence=("git" "wget" "make" "hoge" "archiso" "search-in-dir-git")

installed_pkg=($(pacman -Q | awk '{print $1}'))
installed_ver=($(pacman -Q | awk '{print $2}'))

check_pkg() {
    local i
    local latest_ver
    for i in $(seq 0 $(( ${#installed_pkg[@]} - 1 ))); do
        if [[ "${installed_pkg[${i}]}" = ${1} ]]; then
            latest_ver=$(pacman -Sp --print-format '%v' ${1} 2> /dev/null)
            if [[ "${installed_ver[${i}]}" = "${latest_ver}" ]]; then
                echo -n "installed"
                return 0
            elif [[ -z ${latest_ver} ]]; then
                echo -n "norepo"
                return 0
            else
                echo -n "old"
                return 0
            fi
        fi
    done
    echo -n "not"
    return 0
}
echo "Checking dependencies ..."
for pkg in ${dependence[@]}; do
    echo -n "Checking ${pkg} ..."
    case $(check_pkg ${pkg}) in
        "old")
            echo -en " $(pacman -Q ${pkg} | awk '{print $2}')\n\n"
            echo "${pkg} is not the latest package."
            echo "Local: $(pacman -Q ${pkg} 2> /dev/null | awk '{print $2}') Latest: $(pacman -Sp --print-format '%v' ${pkg} 2> /dev/null)"
            echo
            ;;
        "not") echo -e " ${pkg} is not installed." ; check_failed=true ;;
        "norepo") 
            echo -en " $(pacman -Q ${pkg} | awk '{print $2}')\n\n"
            echo "${pkg} is not a repository package."
            ;;
        "installed") echo -ne " $(pacman -Q ${pkg} | awk '{print $2}')\n" ;;
    esac
done

if [[ "${check_failed}" = true ]]; then
    exit 1
fi
```

# 解説もどき
`check_pkg`関数でパッケージの状態を判定しています。あとは依存関係の配列を`for`で変数`pkg`に順番にぶち込んで関数を実行させます。
この関数は最低限の値しか返しません。それぞれの値の意味は以下のとおりです。

`not`→インストールされていない
`norepo`→リポジトリのパッケージではない（インストールはされている）
`installed`→最新版が正常にインストールされている
`old`→古いバージョンがインストールされている

あとは関数の実行結果を`case`で別の処理にしているだけです。
nreal developerページをざっと読んでみた (RGB Camera編)

nreal developerのページをざっと流し見して、日本語でも読みやすいように補助的な記事を書いていきます。この記事はRGB Camera編です。

https://developer.nreal.ai/develop/unity/rgb-camera
こちらと一緒に見ていきましょう！

--- 
他の記事
[nreal developerページをざっと読んでみた (Discover編)](https://qiita.com/iwaken71/items/4e11ebcf4bd206d3bd6b)
[nreal developerページをざっと読んでみた (Quickstart編)](https://qiita.com/iwaken71/items/d7cc1edb84713c9c4a24)
[nreal developerページをざっと読んでみた (Image Tracking編)](https://qiita.com/iwaken71/items/d7cc1edb84713c9c4a24)
[nreal developerページをざっと読んでみた (Controller編)](https://qiita.com/iwaken71/items/dd254f200b3ff9d3c3bc)

--- 

# 目的

NRSDKを介してNreal LightグラスからRGBカメラデータを取得するサンプルアプリを作成する方法を学びます。

# Open the Sample Scene (サンプルシーンを開く)

Assets > NRSDK >Demos > RGBCameraシーンを開きましょう。

# Build and Run the Sample App(サンプルアプリをビルド)

ケーブルつないでBuild and Run。

Assets > NRSDK > Demos > CameraCapture > Scripts > CameraCaptureController.csを見るとRBGカメラによってTextureを取得する処理が書かれています。

```csharp

public RawImage CaptureImage;

  private void Start()
  {
      RGBCamTexture = new NRRGBCamTexture();
      CaptureImage.texture = RGBCamTexture.GetTexture();
      RGBCamTexture.Play();
  }
```

# アウトプット

RBGカメラで取得した画像をRawImageに代入。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96970/373934d4-ce47-eb89-d405-e31bcc409457.png)
3分間ネットワーク備忘録 第５回

## 概要
引き続き[３分間ネットワーク]()について、
学習の備忘録を書いていきます。


今回は、
- [第１０回](http://www5e.biglobe.ne.jp/aji/3min/10.html)
- [第１１回](http://www5e.biglobe.ne.jp/aji/3min/11.html)
- [第１２回](http://www5e.biglobe.ne.jp/aji/3min/12.html)

 を振り返っていきたいと思います。

### 振り返り

[第７回](http://www5e.biglobe.ne.jp/aji/3min/7.html)では、
LAN構成に必要な物として、

1. `ホスト`（パソコン）
2. `ネットワーキングメディア`（ケーブル）
3. `NIC`
4. `ネットワーキングデバイス`（データの流れを制御するもの）

が用意されなければならないと解説されました。


そして[第９回](http://www5e.biglobe.ne.jp/aji/3min/9.html)では、
第一層である`物理層`の`ネットワーキングメディアの規格`の説明があり、
その中で３種類のケーブルの特徴についてや、IEEEによる規格の名前について解説されました。

今回は`物理層のネットワーキングデバイス`についての解説になります。

### リピーター、ハブ

#### リピーター
`リピーター`は、流れている信号の形を整え、減衰しないように次に受け渡す役割があります。
ただし、信号はリピーターを通るたびに遅延が起こり、衝突が起きてしまう可能性があり、
それを防ぐために書くケーブルによってリピーターがおける個数が決まっています。


#### ハブ
`ハブ`は、信号を受け取り、つながっている線に向かって信号を全てに受け渡すことができます。
一つの信号が入ってきて、複数の場所に信号を流すことができるので、「ハブ」と呼ばれています。
しかしながら、ハブの内部に１つの伝送路しか持たないので衝突を起こしやすく、ハブが衝突を起こしうる範囲のことを
`衝突ドメイン`と呼びます。


### トポロジ

このハブやリピーターを用いて、ホスト（ノード）とネットワーキングメディア（リンク）を用いて、
どのように LANを構成するかを、`トポロジ`と呼びます。

#### 物理トポロジ
`物理トポロジ`とは、実際にノードとリンクの物理的な配置をどう構成しているか、
を説明する物で、
その物理的な形によって

- `バス型`
- `ツリー型`
- `リンク型`
- `スター型`
- `メッシュ型`

などがあります。[第１１回](http://www5e.biglobe.ne.jp/aji/3min/11.html)に詳細の画像があるのでご覧ください。


#### 論理トポロジ
`論理トポロジ`は、ノードとリンクの物理的な配置ではなく、データの流れに着目したもので、

- データがノードを巡回するような構成のことを`リング型`
- データが全てのノードに転送される構成のことを`バス型`

と呼びます。



### レイヤ２　データリンク層
OSI参照モデルでは、第一層である物理層、第二層であるデータリンク層というふうになっていましたが、
IEEEは第二層を、

- 機器に依存しない論理層である`論理リンク制御副層（LLC）
- ネットワーキングメディアとの接続を決める`メディアアクセス制御副層（MAC）

に分けています。

このどの範囲をカバーしている規格かで、LANの規格は４つに分けられます。

- `イーサネット`
- `IEEE802.2`
- `IEEE802.5`
- `FDDI`

となります。
これらの規格によって、使用するネットワーキングメディア、メディアアクセス制御方式、
物理トポロジなどが異なります。

対照表に関しては、
[第１２回](http://www5e.biglobe.ne.jp/aji/3min/12.html)　の表12-03をご覧ください。



## まとめ
今回は

- [第１０回](http://www5e.biglobe.ne.jp/aji/3min/10.html)
- [第１１回](http://www5e.biglobe.ne.jp/aji/3min/11.html)
- [第１２回](http://www5e.biglobe.ne.jp/aji/3min/12.html)

に関して振り返った備忘録でした。
第一層や第二層は規格の名前が多くて覚えようとすると大変ですが、
覚えることよりもこんな違いがあって、それぞれに名前があるんだな、
くらいでまずはいいのかなと思います。（イーサネットくらいは覚えておいた方がいいかも知れないですが。。）

次回からはレイヤ２での各規格の違いについて掘り下げていく回となっています。


今回はこの辺で。

おわり。
Firebase Realtime Database ルールを設定する【作成中】

Realtime Database の ルールを設定しました

【データベース構造】
 userInfo,videoInfoの下に各ユーザコード(黒塗りの部分)、そのしたに詳細データが存在する。
![DB.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/596059/8537b6b0-1d49-6b07-9e05-9306ce49cb9b.png)

【やりたいこと】
　・読み取り：全て可
　・書き込み：各自のデータに制限
[1] : C#(ASP.NET core)でWeb APIを作ってRequest BodyのXMLを処理してみる

# 概要
.NET coreでWeb APIを作成、Request BodyのXMLを「モデルバインド」でオブジェクトに変換するプログラムを作ってみます

〇 参考資料
　[ASP.NET Core でのモデル バインド](https://docs.microsoft.com/ja-jp/aspnet/core/mvc/models/model-binding?view=aspnetcore-3.1)
　[XML シリアル化](https://docs.microsoft.com/ja-jp/dotnet/standard/serialization/introducing-xml-serialization)

# [1] Hello Worldやってみよう！

##　アプリの初期設定
* https://qiita.com/rawr/items/85abf5f646e20e3438a1

## デバッグ実行(動作確認)
* https://localhost:{ports}/api/values

```c#
// GET api/values
[HttpGet]
public ActionResult<IEnumerable<string>> Get()
{
    return new string[] { "Hello World!" };
}
```

</div></details>

# [2] XML形式のリクエストボディを受け取れるように設定する

例：以下のXMLを受け取るとき

```xml
<BreakfastMenu>
    <name>Belgian Waffles</name>
    <price>$5.95</price>
    <description>Two of our famous Belgian Waffles with plenty of real maple syrup</description>
    <calories>650</calories>
</BreakfastMenu>

```

1. StartUp.cs#ConfigureServices()に以下追記

```c#
services.AddMvc().AddXmlSerializerFormatters();
```

2. パラメータで受け取るXMLに合わせたクラスを作成

```c#

public class BreakfastMenu
{
    public string name { get; set; }
    public string price { get; set; }
    public string description { get; set; }
    public string calories { get; set; }
}
```

3. POST APIの引数に上記クラスを設定する

```c#
// POST api/values
[HttpPost]
[Consumes("application/xml")]
public ActionResult<IEnumerable<string>> Post([FromBody] BreakfastMenu  value)
```

4. デバッグ実行

以下のようにオブジェクト化できていることを確認
![1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587970/989b2c92-a543-37d8-7152-d9a3c5ee747a.png)

</div></details>

# [3] 繰り返しのある構造のXMLをバインドする

例：以下のXMLを受け取るとき

```xml
<Cat>
    <Plants>
        <Plant>
            <Common>Bloodroot</Common>
            <Botanica>Sanguinaria canadensis</Botanica>
            <Zone>4</Zone>
            <Light>Mostly Shady</Light>
            <Price>$2.44</Price>
            <Availability>031599</Availability>
        </Plant>
        <Plant>
            <Common>Columbine</Common>
            <Botanica>Aquilegia canadensis</Botanica>
            <Zone>3</Zone>
            <Light>Mostly Shady</Light>
            <Price>$9.37</Price>
            <Availability>030699</Availability>
        </Plant>
        <Plant>
            <Common>Marsh Marigold</Common>
            <Botanica>Caltha palustris</Botanica>
            <Zone>4</Zone>
            <Light>Mostly Sunny</Light>
            <Price>$6.81</Price>
            <Availability>051799</Availability>
        </Plant>
    </Plants>
</Cat>
```

2. パラメータで受け取るXMLに合わせたクラスを作成

```c#

public class Cat
{
    public List<Plant> Plants { get; set; }
}

public class Plant
{
    public string Common { get; set; }
    public string Botanica { get; set; }
    public string Zone { get; set; }
    public string Light { get; set; }
    public string Price { get; set; }
    public string Availability { get; set; }
}
```

3. POST APIの引数に上記クラスを設定する  
左記の手順と同じため割愛

</div></details>
Linuxを理解する上での細かい知識

# 
Linuxの理解のために...

パッケージ管理システム(yum/apt)
実行ファイルや設定ファイルやライブラリを一括で管理するシステムのこと

依存関係
ソフトウェア同士の相互に必要なバージョン番号の関係性
rails s 実行時のCould not find a JavaScript runtime.のエラー対応方法

macOSのバージョンを上げてしまい、開発中のRailsアプリのローカル環境でローカルサーバーが起動出来なくなり、以下のようなエラーが発生したため、忘備録のために投稿します。

macOS Catalina バージョン 10.15.5
環境：Ruby,Ruby on Rails,JavaScript

## エラー内容
```
Could not find a JavaScript runtime. See https://github.com/rails/execjs for a list of available runtimes. (ExecJS::RuntimeUnavailable)
```

## 解決方法
[Node.js](https://nodejs.org/en/)の最新版をインストールする。
以上です。これだけでした。
![スクリーンショット 2020-06-22 3.55.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/648523/c7c5f0a9-2926-a87c-fdde-eb4c851bb2bc.png)
Rails5.2から導入されたcredentials.yml.encの使い方

Rails5.2では新規アプリを作成した時にconfig/secrets.ymlが生成されず
代わりにconfig/credentials.yml.encが生成されるようになったみたいです。

既に本番環境などでRailsの古いバージョンで運用していてRails5.2にアップグレードする場合は
config/secrets.ymlではなく、config/credentials.yml.encの仕組みが使われるみたいです。

Rails5.2までは従来のconfig/secrets.ymlを使用するやり方などもあるみたいですが
Rails6アップグレードのことも考えconfig/credentials.yml.encを導入してみましたので
忘備録のために投稿します。

## 1. credentials.yml.encとmaster.keyの生成と設定
credentials.yml.encは直接エディタから編集する事はできないので、ターミナルでエディタを指定して作成、編集する。

```
$ EDITOR=vim bundle exec credentials:edit
```

ちなみに、.bash_profileなどに以下のように設定しておけば、EDITOR="vim"の指定は不要になります。

```
~/.bash_profile
$ echo 'export EDITOR="vim"' >> ~/.bash_profile
$ source ~/.bash_profile

$ bundle exec credentials:edit
```

上記のコマンドを実行すると、config/credentials.yml.encとconfig/master.keyが生成される。
config/master.keyはgitで管理しないため必ず.gitignoreに追加する。

```
.gitignore

# Ignore master key for decrypting credentials and more.
/config/master.key
```
生成されたconfig/credentials.yml.encを以下のように修正する。

```
config/credentials.yml.enc

# aws:
#   access_key_id: 123
#   secret_access_key: 345

# Used as the base secret for all MessageVerifiers in Rails, including the one protecting cookies.
secret_key_base:
```
- 今回はsecret_keyだけ設定する。AWSの設定は既存のままいくのでコメントアウトのまま
- 上記の画面にawsのaccess_key_idやsecret_access_key、その他APIキーなどを入力すれば暗号化されて保存される
- 環境変数など使用せず、直接入力して問題ない
- シングルクオーテーションやダブルクオーテーションは不要

本番環境ではcredentialを使うので config/environments/production.rb で次の変数にtrueをセットする

```
config/environments/production.rb

config.require_master_key = true
```

## 2.Capistranoによる自動デプロイ
本番環境のshared/configにmaster.keyを配置しないとデプロイできない。
本番環境のサーバーにscpコマンドなどで、config/master.keyを転送する。

```
$ scp -i ~/.ssh/example.pem config/master.key ec2-user@x.x.x.x:/var/www/AppName/shared/config/master.key

ex. /var/www/AppName/shared/config/master.key
```

もしくは、本番環境サーバーのbashファイルにRAILS_MASTER_KEY環境変数を設定する。
Capistranoは.bash_profileに書いても読み込まれないので、~/.bashrcに記載する必要がある。
config/master.keyをRAILS_MASTER_KEYとしてexportします。つまり、.bashrcに以下のように設定する。

```
~/.bashrc
export RAILS_MASTER_KEY='XXXXXXXXXXXXXXXXXXX'
```

次に、config/deploy.rbでデプロイ時の設定ファイルにシンボリックリンクを指定する。

```
set :linked_files, fetch(:linked_files, []).push('config/master.key')
```

## 3.Capistranoを使ってデプロイできれば完了。

```
$ bundle exec cap production deploy
```
現在のディレクトリ構成

#ディレクトリ構造(暫定)

```
project3
   ├──dancesite
   │    ├──dancesite
   │    │    ├──_pycache_ 
   │    │    ├──__init__.py   
   │    │    ├──asgi.py   
   │    │    ├──settings.py   
   │    │    ├──urls.py
   │    │    └──wsgi.py
   │    │ 
   │    ├──matching
   │    │    ├──__pycache__
   │    │    ├──media
   │    │    ├──migrations
   │    │    ├──static
   │    │    │    └──matching
   │    │    │         └──css
   │    │    │             └──style.css
   │    │    │
   │    │    ├──templates
   │    │    │    ├──matching
   │    │    │    │    ├──mypage/
   │    │    │    │    ├──board
   │    │    │    │    ├──index.html
   │    │    │    │    ├──board.html
   │    │    │    │    ├──Recruitment.html
   │    │    │    │    └──serch.html
   │    │    │    │
   │    │    │    ├──user_app
   │    │    │    │    ├──login.html
   │    │    │    │    ├──logout.html
   │    │    │    │    └──sighup.html
   │    │    │    │
   │    │    │    └──base.html
   │    │    │
   │    │    ├──__init__.py
   │    │    ├──admin.py
   │    │    ├──apps.py
   │    │    ├──forms.py
   │    │    ├──models.py
   │    │    ├──tests.py
   │    │    ├──urls.py
   │    │    └──views.py
   │    │
   │    ├──user_app
   │    │    ├──__pycache__/ 
   │    │    ├──migrations/
   │    │    ├──__init__.py
   │    │    ├──admin.py    
   │    │    ├──apps.py
   │    │    ├──forms.py
   │    │    ├──models.py
   │    │    ├──tests.py
   │    │    ├──urls.py    
   │    │    └──views.py
   │    │
   │    ├──db.sqlite3
   │    │  
   │    └── manage.py
   │ 
   └──venv/
```

#現状
現状ではuse_appでサインアップ、リダイレクトは問題なくできてはいるが、djangoの認証機能上アプリ名はaccounts、templateのパスはtemplates/registration/login.htmlとあらかじめきめられてるらしい…??
(参照:https://docs.djangoproject.com/ja/3.0/topics/auth/default/#all-authentication-views)


ただ、accontsアプリとuser_appアプリの中身を見ても違いは下記の点ぐらいなので、アプリ名は何でもいいのかも…

```python:accounts/apps.py
class AccountsConfig(AppConfig):
    name = 'accounts'
```

```python:user_app/apps.py
class UserAppConfig(AppConfig):
    name = 'user_app'
```

#今後の課題
・ユーザー認証機能の完全な実装
・ログインしたユーザーがマイページで詳細な情報の登録をできるようにする。
create時だけ値を生成してupdate時は変更できないようにしたい

numberというカラムを作成。numberはとある条件を元に数字を計算し、それが値として入る。（今回の記事に関係ないので具体的なコードや条件は割愛）
新規登録時にはbefore_saveを経由して上記条件に基づきカラムの値を生成するが、更新時にもその値が変わらないようにしたい場合。

before_saveに書いたメソッドは登録更新どちらのsave時にも経由してしまうため、updateのときだけ通らないようにしたらいいのでは？と考えて以下の実装。


attr_accessorを使用。
参考にさせていただいた記事
https://kei178.me/programming/1416/


```ruby:Hoge.rb

  attr_accessor :number_required
  before_save :apply_number, if: :number_required?

  def number_required?
    number_required
  end

  def apply_number
    self.number = number_for_new_post
    true
  end
  
  def number_for_new_post
   # 適切な数字を生成するための処理
  end
```

```ruby:controller
  def create
    @hoge  = Hoge.new(create_hoge_params)
    @hoge.number_required = true    # この一行追加
    if @hoge.save
      redirect_to root_path
    else
      render :new
    end
  end
...

  def update
    begin
      @hoge = Hoge.find(params[:id])
      @hoge.number_required = false # ここの一行追加
      @hoge.update!(update_hoge_params)
      redirect_to hoge_path
    rescue ActiveRecord::RecordNotFound => e
      flash[:alert] = "更新失敗しました"
      redirect_to hoge_path
    rescue ActiveRecord::RecordInvalid => e
      render :edit
    end
  end
...

 private
  def create_hoge_params
    # 新規作成時に必要なカラム
  end

  def update_hoge_params
    # 更新時に必要なカラム
  end
```

これだと確かにupdateのときはbefore_saveを通らない。
しかし今回のように新規登録時にはnumberが必ず必要となる場合、number_required？だとわかりづらい。。



# そこで使うのがnilガード
そもそもbefore_saveを経由しても値が変わらないようにすれば問題がなかったため、以下のように修正するだけでよかった。

参考にさせていただいた記事
https://note.com/vixer93/n/n20c409919665


```Hoge.rb
  attr_accessor :number_required
  before_save :apply_number

  def apply_number
    self.number ||= number_for_new_post
    true
  end
```

numberに値がなければnumber_for_new_postメソッドの返り値がnumberに。
もしnumberがもう入ってればそのまま。
OOUI（オブジェクト指向UI）の概要をざっくり知る

# オブジェクト指向UIとタスク指向UIの違い
「オブジェクト指向UI」を理解するためには対比される「タスク指向UI」と対比しながら理解するのが早いです。

タスクUIの説明でよくあげられるのが自動販売機のUIです。
飲み物を購入するまでの手順を見てみましょう。


![グループ 4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491279/bdc13453-02fd-8f18-4a55-9232ad73b7ea.png)


これは典型的な「タスク指向UI」です。
長い間、この自動販売機のUIに親しんでいるため問題がないように思えてしまうかもしれませんが、よく考えると、①お金をを先に払い（タスク）、②商品（オブジェクト）を選んで購入 という流れは物を購入する際の流れからして明らかにおかしいです。
例えば、スーパーで買い物することを想像してみてください。
購入したい商品を選び、それをレジに持っていってからお金を支払いますよね？

ということは、本来は以下の流れが自然ではないでしょうか？

![グループ 3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491279/bdf3d2b3-e269-5b4e-0f97-ec3962d8d595.png)


これが「オブジェクト指向UI」となります。
例えば、最近だと自動販売機でもSuicaなどの電子マネーで決済するときは先に商品を選択してから支払う流れになっていませんでしょうか？
このUIであれば、購入をキャンセルしたくなった場合はわざわざ返金ボタンを押さなくてもお金を支払わなければ購入されないので一手間減らすことができます。
また、商品選択が購入の意思決定とならないので、商品のご購入の可能性も減らすことができるはずです。

# 実際のプロダクトで考えてみる
好きな映画のタイトル、監督、感想を登録できる簡単なアプリのUIで考えてみましょう。
まずはタスク指向UIだとどうなるでしょうか？

![ooui説明用.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491279/5262c8b3-fd18-b9f6-38a7-5b3788856929.png)

中心の初期画面からやりたいこと（タスク）を選び操作するデザインです。
いかにも冗長ですよね...
このままだとタスクが増える度に更に冗長さが増していきます。

これをオブジェクト指向UIに修正するとどうなるでしょうか？

![ooui説明用-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491279/d4db529d-fc90-2ac7-8c49-97462b813122.png)


初めにオブジェクトである「映画」を選ばせるようにした結果、編集や削除のタスクをそれに対して持たせるようになったのでかなりすっきりしました。
操作の手順もこちらの方がわかりやすくないでしょうか？
機能を拡張する場合もこちらのほうが冗長になりづらいはずです。

# まとめ
タスク指向UIは、
__「動詞→名詞」__の流れで作られ、
__タスク選択後__にそれに対しての__オブジェクト__を選択します。

一方、オブジェクト指向UIは、
__名詞→動詞__の流れで作られ、
__オブジェクト選択後__にそれに対しての__タスク__を選択します。


実際のプロダクト開発では、タスクごとに振り分けられるため、どうしてもタスク指向UIに陥りやすいです。
オブジェクトをきちんと洗い出し、名詞→動詞でデザインしていきましょう。


# 参考文献
オブジェクト指向UIデザイン
https://www.amazon.co.jp/%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%8C%87%E5%90%91UI%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E2%94%80%E2%94%80%E4%BD%BF%E3%81%84%E3%82%84%E3%81%99%E3%81%84%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E3%81%AE%E5%8E%9F%E7%90%86-WEB-DB-PRESS-plus%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA/dp/4297113511/ref=sr_1_1?adgrpid=107406600368&dchild=1&gclid=CjwKCAjwrvv3BRAJEiwAhwOdM_bN8LsdIuVruRLzCG6pYUFpB6JTagTgcOGfRGZhSBTjIad2-3dZnBoC5oUQAvD_BwE&hvadid=438598633583&hvdev=c&hvlocphy=1009344&hvnetw=g&hvqmt=b&hvrand=17531827114429171754&hvtargid=kwd-311354433491&hydadcr=1313_10330732&jp-ad-ap=0&keywords=ooui&qid=1593844465&sr=8-1&tag=googhydr-22
PHPでAWS S3 の大きいファイルの読込

## やりたいこと
- amazon s3 から大きめのファイルをダウンロードしたい
- いちどに取得しよとすると大変そうなので少しずつ取得したい。
- PHP で取得を行う

## 接続情報を準備する
```php
define('S3', [	
        'KEY'	=> AWSのS3のKEYを設定する,
		'PASS'	=> AWSのS3のパスワードを設定する,
		'DIR'	=> AWSのS3のディレクトリを設定する(s3://<bucket>[/<key-or-prefix>]))
]);
```

## 接続を行う
- `AWS SDK for PHP` を使用して接続する
- `Amazon S3 ストリームラッパー` を使用して接続操作を行う

```php
require_once 'aws/vendor/autoload.php';

// S3 接続を行う
$s3 = S3Client::factory([
	'credentials' => [
		'key'       => S3['KEY'],
		'secret'    => S3['PASS'],
    	],
    	'region' => 'ap-northeast-1',
	'version' => 'latest',
]);
$s3->registerStreamWrapper();
```

- 関数は `registerStreamWrappe` を使用する
- `registerStreamWrapper` を使用すると、ファイルの操作と同じく S3 にアップされているファイルを操作できる。

## 操作を行う
- たとえば、指定しファイルがあるか確認を行う

```php
    $readFileName = S3['DIR'].'/確認したいファイル名.XX';
    if(file_exists($readFileName)) {
        echo 'ファイルあり';
    }
```

- たとえば、`fread`を使用して読み込みを行う

```php
    $readFileName = S3['DIR'].'/読み込みたいファイル名.XX';
    $fp = fopen($readFileName, "r");
    while(!feof($fp)) {
        $file = fread($fp, 4096);
    }
    close($fp);
```

- 上記のことからわかるように、接続後一般的なファイル操作で S3 のファイルを操作できる。
Nuxt.jsの初期設定画面のデフォルトを解除して、ホワイト画面にする。

今回は、Nuxt.jsを立ち上げ後のデフォルト画面について。
画面はちょっと変更したのですが、最初は真っ黒な画面がデフォルトになっています。
フレームワークとしてVuetifyが非所に便利なので、使用しています。


![スクリーンショット (6).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630652/db84e802-93ab-6972-d646-4cfd2b03d5fe.png)


これを変更するには、
nuxt.config.js の　Vuetifyオブジェクトのdarkがtrue になっていますが、これをfalseにします。

そうすると、
![スクリーンショット (7).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630652/c14ee9a3-0c77-7bd0-ecfd-5700b1a066c2.png)


画面が白背景のものになります。
Vuetifyはデフォルトとしてdarkテーマとlightテーマというのがあるようです。
もし細かく色を変更したいということであれば、
default.vue内のtemplate に色を追加していけば、変更することができます。

是非やってみてください。
Crystal というプログラミング言語について

# はじめに
まず Crystalとはなんぞや！ですが、簡単に言えばrubyの構文を使ってC言語みたいな実行速度でプログラムが動くように設計されたプログラミング言語です。今回は、このcrystalの魅力を簡単にご紹介できればと思い記事にいたしました。

# 実行速度の確認

まず、crystalを入れていない方は<a href="https://ja.crystal-lang.org/install">公式サイト</a>から環境に合わせてインストールしてください。
その後で、適当なところにcrystalフォルダを作成します。
続けて、crystalフォルダの中にtest.crを作成し、中身を以下のように編集してください。

```ruby
puts "Hello World!"
```
見ていただくと分かるように、文字を表示するプログラムです。
これをrubyのように実行すると、実行速度は次の通りになります。

```ruby
time crystal test.cr
→　Hello world!
→　crystal test.cr  0.85s user 0.27s system 134% cpu 0.833 total
```
今度は、test.crをコンパイル（一度にファイルの中身を全てパソコンが読み込める状態に変換すること）を行ってから実行すると、次の通りとなります。

```ruby
crystal build test.cr --release
time ./test 
→　Hello world!
→　./test  0.00s user 0.00s system 2% cpu 0.263 total
```
比較すると、前者が0.85秒だったのに対して、後者は0.00秒と最低でも10倍以上速くなっていることが分かります。

ここまでのことは[こちらのサイト](https://fa-works.com/blog/an-introduction-to-crystal-fast-as-c-slick-as-ruby)にも記載されていますので、さらに知りたい方はこちらもご覧いただけたら良いかと思います。
A5:SQL 2.15.0のSSL接続バグ

はまりました。（泣

A5:SQLの最新版2.15.0をダウンロードすると
SSL接続ができません(`the CRL is not found`というエラーがでる)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178806/c5d4ebed-78e6-4d6a-9f24-4607bbda631c.png)

アーカイブから2.14.5をインストールしましょう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178806/98aecb3a-026d-1a10-3671-12f92ec434ae.png)
オーバーフローについて

##書いた目的
オーバーフローについての備忘録

##演算中はその演算で使われている数の型の範囲内で計算される
うまく言葉にできてないですが笑
こんなコードを実行すると(abc172Dのために書いていた途中のコードです)

```c++
#include <iostream>

typedef long long ll;

using namespace std;

int main()
{
    int n;
    n = 10000000;

    ll ans = 0;
    ll max_i;

    ll ans_i = 0;
    int max_i2;

    for (int i = 1; i <= 5; i++)
    {
        max_i = n / i;
        ans = (max_i * (max_i + 1) * i) / 2;
        cout << "max_i:" << max_i << " "
             << "ans:" << ans << endl;

        max_i2 = n / i;

        ans_i = (max_i2 * (max_i2 + 1) * i) / 2;
        cout << (max_i2 * (max_i2 + 1) * i) / 2 << endl;
        cout << "max_i2:" << max_i2 << " "
             << "ans_i:" << ans_i << endl;
    }


    return 0;
}
```
出力は
```
max_i:10000000 ans:50000005000000
143223616
max_i2:10000000 ans_i:143223616
max_i:5000000 ans:25000005000000
-999630016
max_i2:5000000 ans_i:-999630016
max_i:3333333 ans:16666668333333
47741205
max_i2:3333333 ans_i:47741205
max_i:2500000 ans:12500005000000
-497315008
max_i2:2500000 ans_i:-497315008
max_i:2000000 ans:10000005000000
-826348736
max_i2:2000000 ans_i:-826348736
```
こうなります。
オーバーフローを起こして演算結果が`max_i2`を使っている方でおかしくなっています。
同じ演算をしていて、違うところは`max_i`の型は`long long`で`max_i2`の型は`int`(変数名がくそですみません)。
この結果から考えられることは、代入先の変数の型が`long long`であっても代入する前の演算が`int`で行われていたら演算結果が`int`の範囲をオーバーしたらオーバーフローを起こしてしまうということ。

####追加の検証
#####変数を使わなかったら。
こういう計算
```c++
cout << (5000000 * (5000000 + 1) * 2) / 2 << endl;
```
結果は
```
-999630016
```
とオーバーフローを起こしていた。
演算に使われている全ての値が`int`の範囲内なのに演算途中で`int`の範囲をオーバーしてしまうから。
intの範囲内の数同士の計算でintの範囲を超えてしまうとまずいらしい。

ちなみにこの時はコンパイラが怒ってくれる
```
test.cpp:33:22: warning: overflow in expression; result is -999630016 with type 'int' [-Winteger-overflow]
```
nreal developerページをざっと読んでみた (Image Tracking編)

前回は[Quickstart編](https://qiita.com/iwaken71/items/d7db2c246e77268d742d)

今回はImage Tracking編で
https://developer.nreal.ai/develop/unity/image-tracking
を見ていきます！

# Introduction (導入)

画像追跡機能には画像やロゴなどを使用できる。
順序としては

1. Unityの画像データベースに登録
2. アプリをビルド
3. 画像を印刷
4. Nrealで画像を見る

の順番となりそうです。

# Capabilities （何できる?）

- 所定の位置に固定された画像の検出と追跡
- 動いている画像の検出と追跡
- 追跡開始後、画像の位置、回転、スケールの推定を継続的に行う
- 1つの環境内で**10個の画像を記憶できる。** しかし、現在のバージョンでは、**これらの画像を同時に追跡することはできない。**したがって、各フレームで追跡できる画像は1つだけです。さらに、同じ画像の複数インスタンスも追跡しません。

複数同時画像トラッキングに関して、今はできないようです。

# Requirements (これはやってね)

## Image Selection Checklist(画像選択のチェックリスト)

- 最低限
    - jpeg形式
    - グレースケール or RGBカラー
    - dpi値が150以上
    - 印刷された画像は1m×1m未満
- より良い推定のために
    - 特徴点が分散している
        - 真っ白or真っ黒な画像はやめよう
    - 自己類似度が低い画像
        - 同じ模様の繰り返しのような画像は避けよう
    - NRSDKは追跡品質を評価できる
        - 一定以上の追跡頻出でなければならない
- オリジナルの画像をデザインする場合
    - Adobe PhotoshopではなくAdobe Illustratorでエクスポートするほうがおすすめ

## Image Tracking Condition Requirement (画像追跡する時のお願い)

- 光沢な印刷紙より、光の反射が少ない印刷紙が良い
- 画像追跡を初める良い方法は、画像を少し角度を付けて表示しながら、画像を平坦で歪みのない状態に保つことが良い。

良い画像、悪い画像の例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96970/3361f6a3-d8d0-f14b-485e-dfdda8ecc212.png)https://developer.nreal.ai/develop/unity/image-tracking

# Image Tracking Tutorial (やってみよう)

[nreal developerページをざっと読んでみた (Quickstart編)
](https://qiita.com/iwaken71/items/d7db2c246e77268d742d)でQuickStartしている前提で進めます。

## Build and Run the Sample App (早速試そうぜ)

ビルドする前に、Build Settingで`Assets > NRSDK > Demos > ImageTracking`のシーンが選択されていることを確認してください。

ケーブルを繋いでBuild and Run。

すると、指定の画像を見るとトラッキングするようになります。
指定の画像は`Assets>NRSDK>Demos>TrackingImage>Images`にあります。

![貼り付けた画像_2020_07_04_17_36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96970/50a74f25-ef09-916c-222a-8f0c842f01e2.png)

# Create the Database File (画像データベースを作ろう)

Unity内で画像を選択して右クリックして、`Create/NRSDK/TrackingImageDatabase`を選択すると新しく画像データベースが生成される。

ポイントは
- Quality Scoreが**65以上**が好ましい
- Width(m)は実際の画像のサイズを等しくする必要がある

<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96970/6a569743-9163-47b5-3970-ec7b8a4b858c.png width=300>

# Set the Database File (データベースファイルをセットしよう)

プロジェクトウィンドウから`Assets/NRSDK/`にて`NRKernalSessionConfig`を開く。
そして、Tracking Image Database部分を入れ替える。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96970/0f1b7038-bd84-c692-1dd2-fbff9c0232d8.png)

# Get Tracked Image (追跡された画像を取得)

`Assets > NRSDK > Demos > TrackingImage > Scripts > MarkerDetecter.cs`を見て、

```csharp
NRSession.GetTrackables<NRTrackableImage>(m_NewMarkers, TrackableQueryFilter.New);
```
これが取得している例だよ。

`m_NewMarkers`にトラッキングした画像情報が入るみたいです。
 
# Next Step

次は[Nreal Controller編](https://qiita.com/iwaken71/items/dd254f200b3ff9d3c3bc)、見てね！
過去1週間の日付を出力するシェルスクリプト (Linux, macOS)

## Linux 動作版

```1week.sh
#!/bin/sh

# 7から1までのループ
for N in `seq 7 -1 1`
do
  # 7 days ago から 1 days ago まで
  DATE=`date +%Y-%m-%d --date "${N} days ago"`
  echo $DATE
done
```

動作確認環境: Ubuntu 20.04 LTS (Focal Fossa) + dash 0.5.10.2 + GNU coreutils 8.30 (date, seq)

```
$ ./1week.sh 
2020-06-27
2020-06-28
2020-06-29
2020-06-30
2020-07-01
2020-07-02
2020-07-03
```

## macOS 動作版

```1week.sh 
#!/bin/sh

# 7から1までのループ
for N in `seq 7 -1 1`
do
  # -v-7d から -v-1d まで
  DATE=`date -v-${N}d +%Y-%m-%d`
  echo $DATE
done
```

動作確認環境: macOS Catalina 10.15 + GNU bash 3.2.57 + BSD date + BSD seq

```
$ ./1week.sh 
2020-06-27
2020-06-28
2020-06-29
2020-06-30
2020-07-01
2020-07-02
2020-07-03
```
iOSアプリの作成（ボタンとラベルのみのシンプルコード）

## 前提
- 本稿は前の記事の続きです。
    -  [iOSアプリの新規ブランクプロジェクト作成 \- Qiita](https://qiita.com/sunack/items/e42c7c073c8436173cfe)

- この記事はXcode 11.5をベースに記載しています。

## ボタンとラベルを追加

MainStoryboardにボタンとラベルを追加する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171110/9a80ae05-45aa-a904-c2d9-975a4b008049.png)

Buttonをドラッグ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171110/7998e9ae-d2da-7c5c-f9be-6daeb9306be1.png)

配置したい場所ではなす
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171110/ff3fbd5a-47d6-2d68-793a-9324e1782bcc.png)

ラベルやフォントを変更する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171110/695bc59c-84e2-6e48-0b65-05b4ac7a3418.png)

（参考）サイズが異なるiPhoneでも同じ位置に表示されるようにするには、Autoresizingの設定を変更する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171110/16fcda93-c053-676c-b77f-6d34322478d3.png)

同様の方法でラベルを配置する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171110/17775fd9-5e2b-4d29-59f7-86951ee15474.png)

（参考）Autoresizingの設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171110/69d48207-fa6f-a757-d804-b824a8785058.png)

## ラベルを参照するOutletコードを追加

Assistantビューを表示してレイアウトとコードが両方表示されるようにする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171110/68dfb478-6b2a-ebc4-f9c6-1eb7eb5ed9e7.png)

不要なペインを非表示にして広く表示できるようにする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171110/84859d4f-eed6-9233-eeda-972256bfe4c6.png)

（非表示にした後）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171110/30cdda4f-b7a8-d055-21eb-54499375d282.png)

Control を押しながらラベルをコードにドラッグし、Outletを追加する 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171110/533967fe-a6bd-9408-b779-499a158ef267.png)

Outlet名をつけてConnect
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171110/893ef721-15f6-8deb-0181-2d9dc4aa808f.png)

コードが追加される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171110/9a829240-99e3-de51-7ba6-19db6f66cfa0.png)

## ボタン押下時のActionコードを追加

Controlを押しながらボタンをコードにドラッグしてActionを追加する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171110/ca4a0c46-735b-11b7-f82a-1de397f76cad.png)

Action名をつけてConnect
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171110/7e24a33c-c145-b798-c0a9-db21bff7c76d.png)

Actionのコードが追加される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171110/3257d913-b19b-e959-d140-6f2208ae5b9c.png)

ボタン押下時にLabelのテキストが変わるコードを追記する

```swift:ViewController.swift
    @IBAction func execute(_ sender: Any) {
        resultLabel.text = "実行しました"
    }
```

## シミュレーターで動作確認
シミュレーターで実行して動作確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171110/8a09385b-3464-b3ab-9e61-b0dba30894ba.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171110/331640dd-178f-b43b-5d2a-098adb9f34c8.png)
VMWorkstationのゲストOSでマウスのホイール操作によるスクロールが効かない

# 環境（ホストPC）
 - Windows 10 Pro 1909
 - VMware(R) Workstation 15 Pro

# 環境（ゲストOS）
 - Windows Server 2019 Standard Edition 1809

# 使用マウス
 - logicool M590 MULTI-DEVICE SILENT

# 原因／対策
 - アプリ「Logicool Options（v8.20.329）」で「スムーズスクロール」オプションが「有効」  
   →このオプションを「無効」にすると改善  
     （非常に稀だと思いますが、もし遭遇された方のために。。。）
gitのコミット履歴からStep数をカウントする（PowerShell版）

たまーに改造規模をStep数で求められることがあるので、gitからカウントするコマンドをメモ。
linuxならawkを使ったやり方がいくつか出てくるが、WindowsかつGitBushとかも入れたくない場合向けに、PowerShellで。

git logの抽出
---

まずは git log で各ファイルごとの変更（追加行、削除行）をカウント。
コミット者（author）、期間（since、until）を指定して抽出している。
マージコミットは無視したいので、「no-merges」も指定。

```
PS C:\Work\XXXXX> git log --numstat --no-merges --pretty="" `
 --author="AAAAA" --author="BBBBB" --since=2020-01-01 --until=2020-07-01
9       3       AAA/aaa.cs
5       1       AAA/bbb.cs
13      6       BBB/ccc.cs
3       0       BBB/ddd.cs
```

CSV形式に変換
---

PowerShellの「ConvertFrom-Csv」を使ってCSV形式に変換する。

```
PS C:\Work\XXXXX> git log --numstat --no-merges --pretty="" `
 --author="AAAAA" --author="BBBBB" --since=2020-01-01 --until=2020-07-01 `
 | ConvertFrom-Csv -header add, delete, file -Delimiter "`t"
add delete file
--- ------ ----
9   3      AAA/aaa.cs
5   1      AAA/bbb.cs
13  6      BBB/ccc.cs
3   0      BBB/ddd.cs
```

合計のカウント
---

「Measure-Object -sum」でadd, delete列の合計を取得し、「Select-Object」で表示する。

```
PS C:\Work\XXXXX> git log --numstat --no-merges --pretty="" `
 --author="AAAAA" --author="BBBBB" --since=2020-01-01 --until=2020-07-01 `
 | ConvertFrom-Csv -header add, delete, file -Delimiter "`t" `
 | Measure-Object -sum add, delete `
 | Select-Object Property, Sum

Property  Sum
--------  ---
add        30
delete     10
```
ソース変更もブレークもせずにデバッグで変数の値を変更する（条件付きブレークポイント使用）

プログラムを作ったあと、通常は通らないルートをテストしたいとき、皆さんはどうしていますか？
一般的には以下のような形で実行すると思います。

- 特定の箇所にブレークポイントを設定する
- テストしたいアクションを実行する
- ブレークポイントに止まるのを待つ
- ブレークポイントに止まったら、手動で値を変更する

でも、値を変更した状態を何度か操作を繰り返したいときってありまして、こういう場合は値が自動で書き換わってほしいと思うわけなんですよ。
思ったことありませんか？

実はこれは条件付きブレークポイントを使用することで実現できますが、ベテラン勢でも割と知らない人も多いので残しておきます。

# 前提条件と予備知識

## サンプルコードと想定パターン

RestAPIを実行して、状態チェック→パース→モデル変換を行うメソッド。（内容は特に重要ではありません）

```java
    public JmaFeed getFeed() {
        ResponseEntity<String> response = restTemplate.getForEntity(uri, String.class);
        if (!response.hasBody()) {
            return null;
        }

        String responseBody = response.getBody();
        if (isNull(responseBody)) {
            return null;
        }

        JmaXmlFeed xml = xmlParser.read(response.getBody(), JmaXmlFeed.class);
        if (isNull(xml.getTitle())) {
            return null;
        }

        return modelMapper.map(xml, JmaFeed.class);
    }
```

このメソッドで、普段は起こり得ない 

1. `isNull(responseBody) `
2. `isNull(xml.getTitle())`

となる条件を何度も確認したいと仮定します。
なお、`xml.getTitle()` は `xml.setTitle()`で値を書き換え可能、ソースコードは変更しないという条件も加えておきます。


## 予備知識：条件付きブレークポイント

IDEでデバッグする際、ブレークポイントには条件を設定することが可能です。
これは**条件付きブレークポイント**と呼ばれたりもします。

■IntelliJのブレークポイントで右クリックしたときの画面

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258092/ce523cd3-4e90-a26e-cc25-a1a6af6bab93.png)

---

この条件の普通の使い方は、「変数がAが0の場合」とか「変数Bがnullの場合」とかを設定します。
つまり、以下のような書き方をします。

■例：　変数 responseBodyがnullの場合にブレークする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258092/719b753d-e86b-6770-c78d-430371cef5ba.png)

これで `responseBody = null` のときにブレークポイントで止めることができます。


# デバッグ時にソース変更もブレークもせずに変数の値を変更する方法

ここからが本題です。
2つの方法を説明していきます。

## 条件付きブレークポイントで変数値に代入をする
条件付きブレークポイントの条件は最終的にtrue/falseを返せば良いのであって、途中は何をしてもOK。
なので、こういう条件を設定することも可能。

```java:条件
(responseBody = null) != null
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258092/74b14298-6418-78af-1cc3-73fe1274f92b.png)

この式は見ての通り

- responseBodyにnullを代入
- responseBodyがnullでないことを判定

を行うので、条件は必ずfalseになりブレークすることはありません。
つまり、ブレークポイントで止まることなく、自動でresponseBodyを書き換えることができたというわけです。


## 条件付きブレークポイントでsetterを呼び出す

次に2.の条件 `isNull(xml.getTitle()))` を満たす方法ですが、さっきよりも工夫が必要です。
というのも、今回のプログラムでは `xml.setTitle(null)` で値を変更できますが、setterの多くはvoidメソッドです。
ということは、メソッド結果を何かと比較することができず、`xml.setTitle(null) != null` のような式は条件に設定できません。

したがって、以下のような式にしてみます。

```java:条件
Optional.of("a").map(x -> { xml.setTitle(null); return false; }).get()
```

`xml.setTitle(null)` を実行をしつつ、falseを返す方法として、メソッドを引数にできる `Optional#map` を使って実現しました。
ラムダ式を引数に持って任意の値を返すことができれば、他の方法でも実現できると思います。

ちなみに、Eclipseの場合は `xml.setTitile(null)` を設定するだけでも期待通りに値を書き換えてくれます。
IDEによって条件に差があるようですので、自分で使用されているIDEの挙動を確認してみてください。


# まとめ
デバッグ時にブレークせずに変数の値を変更する方法のまとめです。

**1. 条件付きブレークポイントで変数値に代入をする**

代入をして、falseとなる条件を書く

```java:条件例
(responseBody = null) != null
```

**2. 条件付きブレークポイントでsetterを呼び出す**

Optional#map でsetterを呼び出してfalseを返す


```java:条件
Optional.of("a").map(x -> { xml.setTitle(null); return false; }).get()
```

他の言語でも同様の仕組みを用いれば、同じことはできると思います。
【OpenFOAM】並列計算をする方法

#はじめに
OpenFOAMで並列計算する方法を解説します．並列計算は複数のcpuに処理を並列して実行させる計算方法で，計算の高速化が期待できます．

作業ディレクトリをcaseDirとします．

#手順
計算前にdecomposeParというユーティリティを使って領域を並列数で分割しておく必要があります．decomposeparの設定は，caseDir/systemディレクトリ内にdecomposeParDictというファイルを用意して行います．以下記述例です．

```C++:decomposeParDict
/*--------------------------------*- C++ -*----------------------------------*\
  =========                 |
  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
   \\    /   O peration     | Website:  https://openfoam.org
    \\  /    A nd           | Version:  7
     \\/     M anipulation  |
\*---------------------------------------------------------------------------*/
FoamFile
{
    version     2.0;
    format      ascii;
    class       dictionary;
    note        "mesh decomposition control dictionary";
    object      decomposeParDict;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

numberOfSubdomains  2;

method          scotch;
// method          hierarchical;
// method          simple;
// method          metis;
// method          manual;
// method          multiLevel;
// method          structured;  // does 2D decomposition of structured mesh


// ************************************************************************* //
```

numberOfSubdomainsが領域の分割数（＝並列数）で，分割方法をmethodで指定します．scotchとしておけば他に何も設定しなくても分割してくれます．他にも分割方法は用意されてますが，使用の際はdecomposeParDict内に別途記述が必要です．

設定後，以下のコマンドを実行．

```
caseDir$ decomposePar
```

processor0，processor1，...といった感じで並列化後の領域の情報が格納されたディレクトリが生成されます．

これで領域分割完了．OpenFOAMではOpen MPIというMPIのライブラリを使って並列処理を行う仕様になっています．例えばsimpleFoamを2並列で計算させたい場合，次のようにコマンドを実行すると計算が開始します．

```
caseDir$ mpirun -np 2 simpleFoam -parallel > log &
```

計算結果はprocessso0，...に格納されていきます．可視化のためには結果の結合が必要で，次のようにコマンド実行します．

```
caseDir$ reconstructPar -latestTime     // -latestTime指定で最後の結果だけ結合
```
caseDirに結合結果が出力されます．
【Flutter/ Dart】カメラで撮影した画像を圧縮する方法

## 概要
カメラで撮影した画像をアップロードしたり、画面上に表示したりするアプリを開発しているときに、端末によってはカメラの解像度が高く（画像サイズが大きく）動作がもたつくのでアプリ内で圧縮してから扱う方法を模索しました。

## 結論
`image_picker`を使えば簡単に実装できます！

## 設定

```.yaml:pubspec.yaml
dependencies:
  image_picker: [version]
```

## アプリケーションコード

```.dart
import 'package:image_picker/image_picker.dart';
```

で、インポートして、

```.dart
final ImagePicker picker = ImagePicker();
final pickedFile = await picker.getImage(source: ImageSource.camera, imageQuality: 80);
```

これだけで実装できてしまいます！
`imageQuality`の値を低くすると圧縮率が上がります。

上記のコードに続けて、下記のように書いてあげると、`dart.io.File`を生成することができます。

```.dart
final image = File(pickedFile.path);
```


なお、`ImagePicker().getImage`のシグネチャは以下のようになっており、画像の上限幅・高さの指定やカメラの指定（背面/ 前面）もできます。

```.dart
  Future<PickedFile> getImage({
    @required ImageSource source,
    double maxWidth,
    double maxHeight,
    int imageQuality,
    CameraDevice preferredCameraDevice = CameraDevice.rear,
  }) {
    // 略
  }
```


## 他の方法
`flutter_image_compress`でも画像の圧縮が可能です。

### 設定
```.yaml:pubspec.yaml
dependencies:
  flutter_image_compress: [version]
```

### アプリケーションコード

```.dart
import 'package:flutter_image_compress/flutter_image_compress.dart';
```

で、インポートして、

```.dart
Future<File> compressFile(File file) async {
  var result = await FlutterImageCompress.compressAndGetFile(
    file.absolute.path,
    file.absolute.path,
    quality: 80,
  );

  return result;
}

```

こんな感じでも実装できます！
プログラミングスクール２週間通ってみて

始めての投稿はどうなる！？

現在、プログラミングスクールに通っている中で感じたこと
・初めの１週間目は才能ないんじゃ無いかと挫折しそうになる
・形がわかってくると楽しくなってくる
・日々、挫折と感動の繰り返し

２週間通ってからは
基礎が身につき、楽しめていますが苦手な言語も少しづつわかってきた。



私自身、HTML、CSSはなんだか複雑な感じがして
RUBYは（今のところ）単純で、いいなと感じてます。

将来的には、AI関係の仕事に携わりたいと思っていますが
システム環境の構築ってすごく楽しいなと日々感じてます。



まだまだ、ひよこですが今後も楽しく言語と過ごそうと思います！！
（英語も勉強せな）
Rails migration


Railsのmigrationを触るのは初めてだったので、勉強備忘録のために簡単に書きとどめてみる。

# migrationについて
マイグレーションは、データベーススキーマの継続的な変更  を、統一的かつ簡単に行なうための便利な手法。

## migrationファイルを作成する

サンプルとしてCompanyテーブルを準備

| カラム名 | データ型 |
|:--|:--|
| id | integer |
| name | string |
| description | text |
| created_at | datetime |
| updated_at | datetime |

```
$ rails g migration CrateCompany
```

Active Recordにはマイグレーションの実行順序をファイル名のタイムスタンプでの表示を自動でやってくれる。
作成されたファイルは`db/migrate`ディレクトリに保存される。

作成されたファイル

```ruby
class CrateCompany < ActiveRecord::Migration[5.2]
	def change
	end
 end
```
ActiveRecord::Migration[]にはバージョンが入る。

chengeの代わりにupとdownを使うことができる。
upメソッドにはmigrationする時の内容、downメソッドにはrollbackする時の内容を書く。


```ruby

class CrateCompany < ActiveRecord::Migration[5.2]
	def up
	end

	def down
	end
end
```

## 変更を加える

マイグレートファイルを作成し`rails db:migrate`を打てば実行してくる。
また直前の変更を取り消すためには`rails db:rollback`

#### テーブルを作成する

```ruby
class CrateCompany < ActiveRecord::Migration[5.2]
    def change 
     create_table :companies do |t|
　　　 t.string :name
      t.text :description
      t.timestamps
    end
  end
end
```
このコマンドを打てば自動で上記のようなもの作成してくれる

```
$ rails g migration CrateCompany name:string description:text
```

####テーブルを変更する

```ruby
class ChangeTableCompany < ActiveRecord::Migration[5.2]
    def change 
     change_table :companies do |t|
  　　 t.remove :name
  　　 t.string :root_number
  　　 t.index :root_number
  　　 t.rename :description, :description_note
　　end
  end
end
```
上のマイグレーションではnameカラムが削除され、stringカラムであるroot_numberが作成されてインデックスがそこに追加されます。そして最後にdescriptionカラムをリネームしている。

####カラムを変更する
```
change_column :companies, :root_number, :text
```

モデル名の`root_number`のカラムを`text`に変更。

ここでの注意点だが、`change_column`は`change`メソッドではロールバックすることができない。
`change`メソッドではサポートさていないとのこと。
`change`でサポートされているマイグレーション定義は
>
add_column
add_foreign_key
add_index
add_reference
add_timestamps
change_column_default (:fromと:toの指定は省略できない)
change_column_null
create_join_table
create_table
disable_extension
drop_join_table
drop_table （ブロックを渡さなければならない）
enable_extension
remove_column（型を指定しなければならない）
remove_foreign_key（2番目のテーブルを指定しなければならない）
remove_index
remove_reference
remove_timestamps
rename_column
rename_index
rename_table


もしロールバックする場合はup,downメソッドであれば`change_column`を使用可能。

```ruby

class ChangeColumnCompany < ActiveRecord::Migration[5.2]
    def up
     change_column :companies, :root_number, :text
    end

    def down
     change_column :companies, :root_number, :string
    end
end
```

まだまだmigrationについては知らないことばかりだが、身につけていきたい。
Laravel 6 の pubcli/css/app.css に CSSファイルの内容を含める方法

## はじめに

Bootstrap Examples に Dashboard があります。
https://getbootstrap.com/docs/4.5/examples/dashboard/

その Dashboard を Laravel 組込みもうとしていました。
Dashboard を組込むには、その一部の dashboard.css が要ります。
その dashboard.css を単純に、Laravel の `public/css/app.css` へ含める方法を調べました。

## 環境

Windows10上 の Laravel Homestead で確認しています。

```
* Homestead v10.9.1
Laravel Framework 6.18.19
```

## 前提条件

* `composer require laravel/ui v1.2.0` している。(フロントエンドパッケージをインストールしている)

参考 Laravel 6.x JavaScriptとCSSスカフォールド
https://readouble.com/laravel/6.x/ja/frontend.html

* `npm run dev` ができる。(アセットコンパイルができる)

参考 Laravel 6.x アセットのコンパイル(Mix)
https://readouble.com/laravel/6.x/ja/mix.html

## 方法

方法は `app.scss` に含めたいCSSファイルを `@import` で指定します。

具体的な例です。
含めたいCSSファイルを次の場所に置いたとします。

```
resources/css/dashboard.css
```

含めたいCSSファイルを`app.scss` に指定します。
次の行を追加します。
パスの指定は `app.scss` がある位置を基準に、相対パスで指定しています。

```sass:resources/sass/app.scss
@import '../css/dashboard.css';
```

アセットコンパイルします。
`npm run dev` を実行します。

アセットコンパイルがうまく行くと、`public/css/app.css` に、含めたいCSSファイルの内容があるのが、確認できるとおもいます。

## おわりに

はじめは [Laravel 6.x アセットのコンパイル(Mix)](https://readouble.com/laravel/6.x/ja/mix.html) の例にある、`webpack.mix.js` へ追記して試していました。
そのやり方だと調べたかぎり、一時ファイルに書き出してまたまとめるような記述が要りました。
どうも複雑だなと感じていたら、`scss`ファイルに`@import` を記述すればそのまま展開してくれることを知り、それでいいやとなりました。

参考 SCSS ファイルから別の SCSS ファイルをインポートする (@import)
https://maku77.github.io/sass/import.html

以上です。
Unityのリベンジ (１) 気になる本

Unityのリベンジ！
図書館で「Unityでつくる建築VR入門」を借りました。
半分はUnityの使い方、初心者向け。
後半からプラグイン[SteamVR]をインポート。VRですよ。
まだペラっと本をめくった状態ですが、出来そう。
リベンジなので最初からやってみます。
AutoCADで土木、建築系、たまに歯車、軸などの
CADオペレーターをしていました。
Unityはスキルアップになるかなと。
CADオペの面接でVRを見せつけようと考えているのですよ。
<img width="543" alt="Unity_建築VR.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/650838/62e630a6-1113-ae86-4e8f-2a83b46b9a96.png">
画像処理 100 本ノック Q.23. ヒストグラム平坦化の高速化

前回に引き続き, 高速化をしていきます。
https://qiita.com/mayoko_/items/75705a8a75a86abb9cf3

書いたコードは以下。

```
def histogram_equalization(_img, z_max=255):
    img = _img.copy().astype(np.float32)
    hist = np.histogram(img.ravel(), bins=255, range=(0, 255))
    hist_cumsum = np.cumsum(hist[0])
    (H, W, C) = img.shape
    S = H * W * C
    out_img = z_max * hist_cumsum[img.astype(np.uint8)] / S

    out_img = np.clip(out_img, 0, 255).astype(np.uint8)
    return out_img
```

ヒストグラムにおける index をそのまま使って for 文を回すことなくすべての画素値を決定しています。
100 回回して速度を比較すると, me: 0.79sec 模範解答: 7.08sec で大体 10 倍程度の高速化が得られました。
今回の模範解答は, for 文を使ってるとは言っても 256 回なので前回ほどは高速化に寄与しなかったみたいです。
ところでこのヒストグラム平坦化, 0 とか 255 の値が少なすぎると思うんですが...？
カメラの選択肢からOBS Virtual Camera Deviceが消えない

#この記事について
OBS Virtual Camera を使わなくなってアンインストールしたにもかかわらず，カメラの選択肢からOBS Virtual Camera Deviceが消えなくなった時の備忘録です．
<img width="327" alt="68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3631303239322f36613138613462352d346631392d356131332d316664312d6163643736383935316261302e706e67.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610292/f832930c-c85b-c933-5d31-f07184814101.jpeg">




#環境
- macOS Catalina 10.15.5
- MacBook Air 2020

#状況
Zoomを使うためにOBS Virtual Cameraを入れていたのですが，使わなくなったので削除しました．ところが，QuickTime PlayerやGoogle Chromeでのカメラの選択肢にOBS Virtual Camera Deviceが残ったままになってしまっていました．その上，Google Chromeの設定において，カメラがFaceTime HDカメラ（内臓）に選択されているにもかかわらず，Discordなど一部のアプリケーション・サービスにおいて，以下のような画面が表示されるようになってしまいました．
<img width="855" alt="スクリーンショット 2020-07-04 16.22.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610292/c1ce6c2c-0168-6520-a5cf-9b2d268e9c71.png">

#解決方法
再度[こちら](https://obsproject.com/ja/download)からOBS Studioをダウンロードします．
次に，左上のアップルメニュー ＞「システム環境設定」と選択して、「セキュリティとプライバシー」をクリックし、「プライバシー」をクリックします。
OBS.appに対する，カメラへのアクセスの許可を外します．

#結果
QuickTime Playerのカメラの選択肢から見事OBS Virtual Camera Deviceが消え，OBS Studioなどを削除した後も消えたままでした！
Google Chromeの設定のカメラの選択肢には残ったままでしたが，PCを再起動したところ消えてくれました！
[Ruby] whileにおける条件式の評価の挙動について

## はじめに
　whileを使っていたときに初めての挙動に遭遇したのでメモしておきます。

## 環境
`ruby: 2.7.1`

## 現象
### 現象_A
```ruby
a = 0

while
  if a == 5
    break
  end
  a += 1
end

puts a
# 実行結果： 0
```

### 現象_B
```ruby
b = 0

while
  b += 1
  if b == 5
    break
  end
end

puts b
# 実行結果： 5
```

### 現象_C
```ruby
c = 0

while c < 5 do
  c += 1
end

puts c
# 実行結果： 5
```

### 現象_D
```ruby
d = 0

loop do
  if d == 5
    break
  end
  d += 1
end

puts d
# 実行結果： 5
```

### 現象_E
```ruby
e = 0

loop do
  e += 1
  if e == 5
    break
  end
end

puts e
# 実行結果： 5
```

　想定していた結果としては、現象_Aでも`5`が出力するものだと思っていました。

## なぜこうなるのか
　(@scivolaさんのコメントにより解決することができました。)

　どうやら、`while`の直後の式が条件式として評価されるようです。つまり、今回の現象_Aでは、

```ruby
if a == 5
  break
end
```

この箇所が`while`の条件式として初回に評価され、当然`a == 5`は`false`となり`if`式の値は`nil`となるのでループから抜けてしまっていたようです。

ちなみにRubyでは`nil`と`false`以外の全ての値が`true`となります。

試しに以下のように条件式を与えてやるとループ内の処理が実行されました。

```ruby
a = 0

while true do # doは省略可
  if a == 5
    break
  end
  a += 1
end

puts a
# 実行結果： 5
```

ループ内にある式が、実は条件式になっていたことが今回の落とし穴でした。

## 編集履歴
2020/07/04 17:11 コメントにて@scivolaさんから問題の原因を解説いただきましたので「なぜこうなるのか」を編集しました。
2020/07/04 17:31 タイトルを内容に即したものに変更し、文章を少し校正しました。

## 備考
　普段は`while`や`loop`は使わず、別の繰り返し用のメソッドを使っています。
Windows 10 フィーチャーアップデートでの 0x1900209エラー

#対策方法

https://windowsfaq.net/windowsupdate/error-code-0xc1900208-or-0xc1900209/

ここを参考に http://aka.ms/AppRPS よりプログラムをダウンロードして実行します。

ブロックしているプログラム名が分かれば，それをアンインストールしてアップデートをやり直せば良いのですが，僕の場合はPathがnullだと言われて分からずじまい。

そんなときは，APPRAISER scriptの出力3行目の C:\$WINDOWS.~BT\Sources\........HumanReadable.xml のファイルを開いて，ブロックが判明したとされる行を辿ります。

その行から上へたどっていくと

　<Property Name="SdbAppName"

で始まる行があるので，それがアップデートをブロックしているアプリ。これをアンインストールすればWindows Updateが通る，ちゃんちゃん。

僕の場合はOneDriveでした。。