OmniAICreator/Qiita-1.07M huggingface dataset:
【クエリビルダ：拡張表現】クエリ結果の現在の行の列を参照する

[Sharperlight](https://sharperlight.jp/)のクエリビルダに備わっている多くの拡張表現の中から、今回は基本中の基本である同じ行の他の列を参照する構文を使用してみます。

[Sharperlight](https://sharperlight.jp/)のアプリケーションメニューから**クエリビルダ**を起動します。
モードには**概要レポート**を、製品には、今回は**SAP Business One**を選んでみます。
Companyは、既定値の**OEC Computers**で良いですね。テーブルには、**Outgoing Payments**を選択してみます。
（毎回ですが、SAP Business Oneデータモデルは、まだ英語表記ですが、日本語化する機能は既に持ち合わせていますので、辞書を作成するだけで日本語化できます。）
既定の必須フィルター群が設定されますが、値はそのままにして、選択領域から　**Canceled**フィールドをフィルター領域にドラッグ＆ドロップで設定しましょう。フィルター値にはNを指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/dfe677be-3c7f-73c0-59d3-aa89ea9a8948.png)
では出力アイテムの設定に進みましょう。
選択領域から、以下のフィールドを出力領域にダブルクリック、あるいはドラッグ＆ドロップで設定します。
- Customer/Vendor Name
- Document Total

この時点で、出力領域の属性欄を注視してみてください。それぞれのアイテムに%の接頭辞をもつコードが自動付与されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/980b10e4-16c3-a771-0fc4-9b6e1af79d1f.png)
これらは、Sharperlightでは**名前**と呼ばれ、クエリビルダ内はもちろんその他のSharperlight製品群で一意の**参照コード**として使用されます。よってどこかでこの参照コードが使用されている場合は、この**名前**の変更には注意が必要です。
名前の変更は、右クリックメニューから行うことができます。同一のクエリビルダ内に限っては、名前を変更すると、全ての参照箇所の名前も自動で変更してくれます。

では、今回の主題である拡張表現の列の参照を追加してみます。
出力領域の右クリックメニューから、**拡張表現を追加**を選択しエディタを起動します。
エディタの関数一覧から**現在の行**を展開します。このように出力領域の全アイテムが参照できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/70f74060-a8cb-0366-31c9-f133675ed501.png)
後は、ただ参照したいアイテムをダブルクリックで選択するだけです。**Document Total**を選択してみます。`名前`参照コードが使用されることが分かります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/3e256544-743c-af6e-3065-45d4334163ba.png)
プレビューボタンで、クエリを実行してみましょう。
拡張表現列にも参照しているDocument Total列と同じ値が表示されることがわかりますね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/80b554f5-6580-c36f-1efb-3e94a9f19c8e.png)
今回はただ参照しただけですが、様々な計算や表現の仕方に使用できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/5f194e92-e2e2-2937-a9e5-5e8c426896b0.png)

:postbox:[お問い合わせ](https://sharperlight.jp/about-us/contact-us/)
#4　while

# 学習内容
```java
/* ソースコード */
public class Loop{
   public static void main(String[] args){
      int i=1;
      while(i<5){  //条件が "true" の間,処理を繰り返す
         System.out.println("この処理は" + i + "回目です");
         i++;
      }

      while(i>5){  //条件が "false" のため、行われない
         System.out.println("この処理は" + i + "回目です。");
         i++;
      }


      int a =1;
      do{  //後述の while文が "false" でも処理がされる
         System.out.println("これは" + a + "回目です。");
         a++;
      }while(a<5);
         System.out.println("これは" + a + "回目です。");
   }
}
```
```
/* 実行結果 */
この処理は1回目です
この処理は2回目です
この処理は3回目です
この処理は4回目です
これは1回目です。
これは2回目です。
これは3回目です。
これは4回目です。
これは5回目です。
```

# while文
条件が "true" の場合、処理を繰り返す。
"false" の場合、while文から抜ける。
```java
while(条件式){  //条件を満たす間、処理を繰り返す
   処理;
   変数を変化させる;
}
```
無限ループになってしまうため、変数の値を変化させるのを忘れない。
__上記"loop"クラス__ では、
変数 "i" や "a" をループするごとに１ずつ足している。

# do while文
while文で条件の判定をする前に、do文で必ず処理を行える
```java
do{  //do は処理をブロックで囲む
   処理;
   変数を変化させる;
}while(条件式);  // whileはブロックいらないので注意
   処理;
```
### "while" と "do while" の違い
条件の判定を先にするか、後にするか
* __while文__ 前判定繰り返し型
まず、条件を満たしているか判定する。
条件を満たす場合は、ブロック内の処理を行う。

* __do while文__ 後判定繰り返し型
とりあえず処理を行う。
その後に、条件を満たしているかを判定する。
満たす場合は、do文にもどる。
HerokuでWeb名(app名)変更時の再push方法

Node.jsの初心者です。

herokuでapp名を変更するとgitリポジトリが変更になります。
この時、ローカルリポジトリは更新されていないため
変更したリモートリポジトリにpushできなくなりはまりました。
検索しても載っていなかったためこの時の解決手順を書こうと思います。

1. ローカル環境の.gitフォルダを削除する
1. git bashを起動しローカルのappフォルダに移動
1. git init g初期化
1. git add . ステージングエリアに追加
1. git commit -m "リポジトリ変更対応"　コミットする
1.  heroku git:remote -a **新アプリ名** 新リモートリポジトリを設定
1.  git push **-f** heroku master リモートリポジトリを強制的に上書き

要は最初からgitを作り直して
変更先にリモートリポジトリに強制的に上書きをするという方法です。

commitを戻したりしていてハマってしまった場合の一から作り直す手順になります。
カードエフェクト

## 手順

1. containerを用意する
2. hover時に表示したい要素を用意する
3. hover時に表示する要素のopacityをhoverしていない時：0、hover時：1にする



## コード

```sample.html
<style>
  .container {
    position:relative;
    display:block;
    width:320px;
    height:320px;
    background-color:#000;
    background-image:url(<picture url>);
    background-size:cover;
    margin: 120px auto;
    border-radius:32px;
    transition: all 0.3s ease-in-out;
  }
  
  .hoverdiv{
    position:relative;
    display:block;
    width:100%;
    height:100%;
    padding:24px;
    background-color: rgba(0,0,0,0.8); 👈 hover時に下の画像が完全に見えなくならないように、少し透明にしておく
    color: #fff;
    opacity:0;　👈 hoverしていないときは完全に透明
    box-sizing:border-box; 👈 要素がはみ出ないようにする
    border-radius:32px;
    transition: all 0.3s ease-in-out;
  }
  
  .container:hover {
    transform: scale(1.03);　👈 hover時に少し拡大表示する
  }
  
  .container:hover .hoverdiv {
    opacity: 1;　👈 hover時に完全に表示する
  }
  
</style>

<div class="container">
<div class="hoverdiv">
<p>text text text</p>
</div>
</div>
```

## 参考

https://www.youtube.com/watch?v=rTgGkNd6aAI
【HTML】最近HTML触ってなくておさらいしたい時用【超初級】

触ることが最近ないので、忘れないために一度おさらいします。
1年前にざっくり学習したものになるので、情報が足りてない部分は追記していこうと思います。


# 1.HTMLの種類
HTMLの種類によって書き方が違うんですが、HTML５も私が習った頃には廃止でした。
HTML Living Standardが最新ですかね、、？
一旦今までの書き方の違いについてまとめます。

## HTML
```html:html
<meta http-equiv="Content-Type" content="text/html; charset=UTF8">
```

## XHTML
```html:html
<meta http-equiv="Content-Type" content="text/html; charset=UTF8/">
```

## HTMT5
```html:html
<meta charset ="UTF8">
```

## HTML Living Standardとはなんぞや
:::note info
HTML Living Standardでできること
開始タグはこれまで通り「!DOCTYPE html」
sectionタグを併用することで、h1タグの複数使用が可能になった
imgタグに遅延読み込みを行うloadingを追加
HTML5からのタグも使用可能
:::

# 2.小文字にする理由
拡張子で大文字になる場合があるため
※Linaxが大文字、小文字を区別している

# 3.パンくずリスト
サイト内のウェブページの位置を視覚的にわかりやすくするもの
例：<a href="https://qiita.com/Official_urara">TOP</a>＞<a href="https://qiita.com/Official_urara#:~:text=%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B-,%E8%A8%98%E4%BA%8B,-%E8%B3%AA%E5%95%8F">記事一覧</a>

# 4.タグ
## emタグ
```html:html
<em></em>
```
強調するタグ。IEは斜めになる
ChromeではCSSで編集が必要

## Preタグ
```html:html
<pre></pre>
```
改行、スペースも<B>そのまま表示される</B>

## blockquoteタグ
```html:html
<blockquote></block>
```
左に余白がある状態で改行される。

## delタグ
```html:html
<del></del>
```
打ち消し線

## insタグ
```html:html
<ins></ins>
```
<u>のような、アンダーライン引いてくれる

## tableタグ内の書き方
```html:html
<table>
 <tr>たて</tr>
 <th>よこ</th>
 <td>よこデータ</td>
</table>
```

完全にメモ書きになってて申し訳ないです。
重要なことを忘れてるような、そうじゃないような、、、

:::note info
次はこの辺まとめたいなって思ってます。
・ブロックリンク定義
・リンク定義
・画像の定義
・実体参照
:::
Oracle Analytics Cloud：OCI CLIでスケーリングしてみる

# Oracle Analytics Cloud (OAC) について
OACとは、Oracle Cloudで提供される包括的なアナリティクス・ソリューションです。

- エンタープライズ分析
- セルフサービス分析
- 拡張分析

という機能の柱があります。
利用に際してインスタンスを作成しますが、作成した後でインスタンスサイズを2～8、10～12で増減させることが可能です。
参考：[OACサービス・インスタンスのスケーリング](https://docs.oracle.com/cd/E83857_01/paas/analytics-cloud/acoci/administer-services.html#GUID-3483FDF5-A596-4B61-8E8E-A28D9450FF7E)

:::note
作成時、インスタンスサイズを2～8、10～12以外に設定するとスケーリングできません（2022年7月現在）。
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/ab7d11b4-2717-2d43-6ab8-88091a87c494.png)

# OACインスタンスのスケーリング
インスタンスを作成した後で、OCPUやユーザ数を変更することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/e0aa0b76-7c56-ec87-4dd7-94c4ea163c9b.png)
このインスタンスは、2OCPUで作成したので、2から8の間で2単位で増減できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/ae7d36ec-626a-cd9e-72d2-5cb54204c2ea.png)

# OCI CLIとは
Oracle Cloud Infrasturacture (OCI) 上の様々なサービスを操作するためのコマンドライン・インターフェースです。

# やりたいこと
Oracle Linux上にOCI CLIをインストールして、OACインスタンスのスケーリングをコマンドラインで実行したい。

# OCI CLIのインストール
OCI上にCompute VMを用意しました。
OSはOracle Linux 7.9です。
早速ログインして、OCI CLIをインストールしてみます。

```
$ sudo yum install python36-oci-cli
```
インストールできたかどうか確認します。

```
$ oci --version
3.10.4
$
```

oci setup configコマンドを実行します。


参考：[ドキュメント（CLIインストール）](https://docs.oracle.com/ja-jp/iaas/Content/API/SDKDocs/cliinstall.htm)

# OACをスケーリング
### OACインスタンスのOCIDを取得
OACインスタンスの詳細画面でOCIDを確認できます。後で使うのでコピーしておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/c8db90a6-7537-6f6d-a8e6-dec19308da82.png)
このインスタンスは、現在2OCPU割り当てられています。

### OACインスタンスの情報を取得
では、コマンドラインを使用してOACインスタンスの情報を取得してみましょう。
```
$ export analytics_instance_id=<OACインスタンスのOCID>
$ oci analytics analytics-instance get --analytics-instance-id $analytics_instance_id
{
{
  "data": {
    "capacity": {
      "capacity-type": "OLPU_COUNT",
      "capacity-value": 2
    },
// ... 略
}
```

### スケーリングのためのJSONファイルを作成
次のコマンドを実行します。

```
$ oci analytics analytics-instance scale --generate-param-json-input capacity > capacity.json
$ cat capacity.json 
{
  "capacityType": "string",
  "capacityValue": 0
}
```

作成したcapacity.jsonを編集します。
例：OCPUメトリクスのOACインスタンスを4OCPUに変更する。

```
{
  "capacityType": "OLPU_COUNT",
  "capacityValue": 4
}
```

### OACインスタンスのOCPUを4に変更する

```
$ export analytics_instance_id=<OACインスタンスのOCID>
$ oci analytics analytics-instance scale --analytics-instance-id $analytics_instance_id --capacity file://capacity.json
```
管理コンソールでは、インスタンスのステータスが「更新中」となりました。
この間もOACを利用し続けることができます。

### スケーリングできたことを確認
capacity-valueの値を確認してください。

```
$ export analytics_instance_id=<OACインスタンスのOCID>
$ oci analytics analytics-instance get --analytics-instance-id $analytics_instance_id
{
  "data": {
    "capacity": {
      "capacity-type": "OLPU_COUNT",
      "capacity-value": 4
    },
// ... 略
}
```

# 参考情報
- [Oracle Analytics Cloud：コマンドラインで一時停止・再開してみる](https://qiita.com/tyo38/items/664273c64f71200a7462)
enumの使用方法/使用例

## 環境

・Ruby 2.6.4

・Rails 5.2.3

# enum（enumeration: 列挙）とは

・数値のカラムの対してプログラム上で別名を与える役割。

・名前を整数の定数に割り当てるのに使われるデータ型

・名前に数値を割り当てることで､コードの可読性を上げて､かつ不要な不具合を防いでくれるもの

・ActiveRecord::EnumはRails 4.1で導入された。enumの属性値はデータベース内の整数に対応付けられるが、クエリでは名前で参照できる。

・• enum型の定数は定義されている以外の値を受け付けない(例外が発生)

# 使用方法

1.usersテーブルにenum用のカラム(roleカラム,データ型はinteger型)を追加

2.userモデルにenumの定義をする

## 1.usersテーブルにenum用のカラム(roleカラム,データ型はinteger型)を追加

```ruby
rails g migration AddRoleToUsers
```

```ruby
class AddRoleToUsers < ActiveRecord::Migration[5.2]
  def change
    add_column :users, :role, :integer, null: false, default: 0
  end
end

#null: falseにしているのは奴隷/王様は必ず必要なため
#初期値は奴隷にしたいので､default: 0
```

```ruby
rails db:migrate
```

## 2.userモデルにenumの定義をする

app/model/user.rb

```ruby
class User < ApplicationRecord
  ・
  ・
  ・
  enum role: { slave: 0, king: 1 }
end
```

・roleカラムに数値が保存される

・数値によって奴隷か王様か区別

コンソールで確かめていく

```ruby
pry(main)> User.roles
=> {"slave"=>0, "king"=>1}
```

key,valueも指定して取得できるようになる

```ruby
pry(main)> User.roles.keys
=> ["slave", "king"]

pry(main)> User.roles.values
=> [0, 1]
```

King(王様)にする方法は

コンソール上で

```ruby
pry(main)> user = User.first
 id: 1
 email: "tenshin@example.com"
 first_name: "メイウェザー"
 last_name: "フロイド"
 role: "slave"

pry(main)> user.king!

pry(main)> user.king?
=> true
```

とすることでkingにすることができる

## 使用例

プルダウン形式のフォームは通常､下記のように`f.select`を用いる｡

```ruby
<%= f.select カラム名, {'選択肢': DBに保存する値}, {オプション}, {classなどの要素} %>
```

`key`をそのまま使う場合 `to_a`

```ruby
<%= f.select :role, User.roles.keys.to_a, {}, class: 'form-control' %>
```

`モデルクラス.enumカラム名の複数形`でハッシュ形式で取得できる｡

```ruby
User.roles
=> {"slave"=>0, "king"=>1}
```

.to_aメソッドはハッシュを配列に変換するメソッド

## 日本語化してみよう

```ruby
gem 'enum_help'
```

bundle install

config/locales/activerecord/ja.yml

```ruby
ja:
  enums:
    user:
      role:
        slave: '奴隷'
        king: '王様'
```

### 日本語化したのを呼び出す方法

・カラムの後に`_i18n`を付ける

・ただ､モデルに対して呼び出すときはカラムは複数形｡

・モデルのインスタンスなどを呼び出すときのカラムは単数形｡

```ruby
User.roles_i18n
=> {"slave"=>"奴隷", "king"=>"王様"}

@user.role_i18n
=> "王様"
```

valueである数値(0,1)が日本語になる

enum_helpを利用して記述すると

```ruby
<%= f.select :role, User.roles_i18n.invert, {}, class: 'form-control' %>

=> {"奴隷"=>"slave", "王様"=>"king"}
```

.invertメソッドでkeyとvalueが入れ替えられるよって､下記のように値である0(奴隷)や1(王様)がDBに保存される

もしinvertメソッドを使用しないと

```ruby
<%= f.select :role, User.roles_i18n, {}, class: 'form-control' %>

=> {"slave"=>"奴隷", "king"=>"王様"}
```

となりkeyが保存されることになるので。プルダウン方式のところに日本語化されていない(slave  or  king)が表示されてしまう

奴隷や王様で一般/管理者を表すと少し面白い。。

参考　https://zenn.dev/yusuke_docha/articles/89b49fd29c16c6
pとputsの違い　〜pの罠〜

# pとputsの違い
**pの罠**
`p "50"`と`puts "50"`はなにが違うでしょう。

正解は、出力が
> `p "50"`
> => "50" 
`puts "50"`
=> 50

になることです。

AtCoderなど回答を問題文通りにしないといけない場合`p "50"`だと一致しないことになります。（出力を`50`で求められている場合）
しっかり出力結果を確認して、回答するのが良さそうですね。

では。
GitLabのメジャーバージョンアップ対応　14-->15  (15-->16も追記）

GitLab14.8.2の脆弱性対応で最新版にしようとしたときに、途中で2つのバージョンを挟む必要があったので記録として残しました。

-----
<font color="red">追記</font> 2023.06.21
15->16も実施しました。今回のメジャーバージョンアップを経験してわかったことは、
・Retry the upgrade after upgrading your PostgreSQL version.のメッセージが出たらPostgreSQLのアップグレードを行う　（今回は12->13へアップグレードされました）
```
$ sudo gitlab-ctl pg-upgrade
```
・現在のバージョンから最新のバージョンにあげる時には手順を[Upgrade Path](https://gitlab-com.gitlab.io/support/toolbox/upgrade-path/)で確認してから実施する
です　勉強になりました まとめると15.8.1から16へのアップグレードは
15.8.1-->15.11.10-->16.0.7 の手順でした

-----

どうやったかを先に書くと
14.8.2-> 14.10.5 -> 15.0.0 -> 15.1.2(最新)
の手順で行いました。

ブラウザで確認すると
「GitLab Community Edition 14.8.2」
14.x.xの最後のバージョンを確認
```
$ sudo yum list --showduplicates gitlab-ce|grep 14\.10|tail -n 2
gitlab-ce.x86_64              14.10.4-ce.0.el7                 gitlab_gitlab-ce
gitlab-ce.x86_64              14.10.5-ce.0.el7                 gitlab_gitlab-ce
```

14の最後の版を指定してインストール
```
$ sudo yum install gitlab-ce-14.10.5-ce.0.el7.x86_64
---> パッケージ gitlab-ce.x86_64 0:14.8.2-ce.0.el7 を 更新
---> パッケージ gitlab-ce.x86_64 0:14.10.5-ce.0.el7 を アップデート
  検証中                  : gitlab-ce-14.10.5-ce.0.el7.x86_64                                   1/2
  検証中                  : gitlab-ce-14.8.2-ce.0.el7.x86_64                                    2/2
更新:
  gitlab-ce.x86_64 0:14.10.5-ce.0.el7
$ sudo gitlab-ctl reconfigure
Chef Infra Client finished, 1/817 resources updated in 33 seconds
gitlab Reconfigured!
```

ブラウザで確認
「GitLab Community Edition 14.10.5」

次は15の最新版へといつもの手順でバージョンアップを行うと、「失敗」と表示された
```
$ sudo yum install gitlab-ce
---> パッケージ gitlab-ce.x86_64 0:14.10.5-ce.0.el7 を 更新
---> パッケージ gitlab-ce.x86_64 0:15.1.2-ce.0.el7 を アップデート
Error in PREIN scriptlet in rpm package gitlab-ce-15.1.2-ce.0.el7.x86_64
gitlab-ce-14.10.5-ce.0.el7.x86_64 was supposed to be removed but is not!
  検証中  : gitlab-ce-14.10.5-ce.0.el7.x86_64            1/2 
  検証中  : gitlab-ce-15.1.2-ce.0.el7.x86_64             2/2 
失敗:
  gitlab-ce.x86_64 0:14.10.5-ce.0.el7    gitlab-ce.x86_64 0:15.1.2-ce.0.el7
```

ここで15の最初の版を指定してバージョンアップ
```
$ sudo yum install gitlab-ce-15.0.0-ce.0.el7.x86_64
  更新します  : gitlab-ce-15.0.0-ce.0.el7.x86_64     
  整理中     : gitlab-ce-14.10.5-ce.0.el7.x86_64 
  検証中                  : gitlab-ce-15.0.0-ce.0.el7.x86_64                                                       1/2 
  検証中                  : gitlab-ce-14.10.5-ce.0.el7.x86_64                                                      2/2 
更新:
  gitlab-ce.x86_64 0:15.0.0-ce.0.el7                                                                                   
完了しました!
$ sudo gitlab-ctl reconfigure
```

やっといつもの手順で最新版へバージョンアップ
```
$ sudo yum install gitlab-ce
---> パッケージ gitlab-ce.x86_64 0:15.0.0-ce.0.el7 を 更新
---> パッケージ gitlab-ce.x86_64 0:15.1.2-ce.0.el7 を アップデート
  検証中    : gitlab-ce-15.1.2-ce.0.el7.x86_64  
  検証中    : gitlab-ce-15.0.0-ce.0.el7.x86_64   

更新:
  gitlab-ce.x86_64 0:15.1.2-ce.0.el7                                                                                   

完了しました!
$ sudo gitlab-ctl reconfigure
```
#3　配列,多次元配列,length

# 学習内容
配列。

参考 -> https://www.youtube.com/watch?v=nSmO1s-dkxY&list=PLru8-xuz0YvyZhvDRZvakIFW6-MHky-lD&index=4
```java
public class Hairetu{
   public static void main(String[] args) {
      int[] num = new int[2];  //new -> 配列を生成する,デフォルトで"0"が入る
      // 配列 "num" には参照値が入る
      num[0] = 75; // [添字]は0から始まる
      num[1] = 96;

      int[] a = {92,75,43};  // 配列の初期化

      System.out.println(num[0] + "\n" + num[1]);  // "\n"は改行
      System.out.println(a.length); // "配列.length"で配列数を割り出せる
 
   }
}
```
```
/* 実行結果 */
75
96
3
```

# 配列
__配列の生成__
```java
データ型 変数名 = new データ型[配列数];
```
このときに配列のすべての箱にデフォルトの初期値が設定される。
また、変数には参照値がはいる。

__つくった配列に値を入れる__
```java
配列名[添字] = データ;
```
添字は0から始まるので注意。

__配列の初期化__
```java
データ型[] 変数名 = {データ1,データ2,データ3};//好きな数だけいれれる
```
上記の "配列の生成" "値を入れる" をいっぺんにできる

# 多次元配列
上記の配列は "列" のみ。
多次元配列は "行" と "列" がある。
```java
/* 書き方 -> "行"がふえるだけ
データ型 配列名 = new データ型[行数][列数];
```

# length(),length
同じようだが違う。
__length()__ -> 文字列の長さを取得するメソッド
__length__ -> 配列数を取得するフィールド
```java
/* ソースコード */
public class Example3_01{
   public static void main(String[] args){
      String str = "こんにちは";
      int[] kazu = {3,6,7,1,0};

      System.out.println(str.length());  //文字列の長さを取得
      System.out.println(kazu.length);  //配列数を取得
   }
}
```
```
/* 実行結果 */
5
5
```
フリップカード


## 手順
1. maincontainerを用意する（カードを反転させるための容器）
2. cardcontainerを用意する（カードを反転させる機能）
3. thefront, thebackを用意する（カード本体）

maincontainerという箱を用意して、その中にthefront, thebackという２枚のカードを入れて、それをcardcontainerという手でひっくり返すイメージ。

## コード

```sample.html
<style>
  .maincontainer{
    position:relative;
    width:250px;
    height:300px;
  }
  
  .thecard{
    position:absolute;
    width:100%;
    height:100%;
    transform-style:preserve-3d;
    transition: all 0.5s ease;
  }
  
  .thecard:hover {
    transform:rotateY(180deg);
  }
  
  .thefront{
    position:absolute;
    width:100%;
    height:100%;
    backface-visibility:hidden;
    background:#ffc728;
    color:#333;
    text-align:center;
    font-family:'zilla slab', sans-serif;
    border-radius:20px;
    font-size:18px;
    font-weight:bold;
  }
  
  .theback {
    position:absolute;
    width:100%;
    height:100%;
    backface-visibility:hidden;
    background:#fafafa;
    color:#333;
    transform: rotateY(180deg);
  }
  
</style>

<div class="maincontainer">
<div class="thecard">
<div class="thefront">front of card</div>
<div class="theback">back of card</div>
</div>
</div>
```

https://jsfiddle.net/dkocqajb/

## 参考
https://www.youtube.com/watch?v=OV8MVmtgmoY

こっちも参考になる

https://www.youtube.com/watch?v=CC78NrgZkY8

```sample.jsx
    <div>
      <section className="bg-gray-900 h-screen flex justify-center items-center gap-x-16 text-white">
        <div className="w-[300px] h-[420px] bg-transparent cursor-pointer group perspective">
          <div className="relative preserve-3d group-hover:my-rotate-y-180 w-full h-full duration-1000">
            <div className="absolute backface-hidden border-2 w-full h-full">
              <img src="xxx.png" className="w-full h-full" />
            </div>
            <div className="absolute my-rotate-y-180 backface-hidden w-full h-full bg-gray-100">
              <div className="text-center flex flex-col items-center justify-center h-full text-gray-800">
                <h1>The King's Man</h1>
                <p className="my-2">9.0 Rating</p>
                <p>Lorem ipsum dolor, sit amet consectetur adipisicing elit. Hic, nemo exercitationem repellendus aut sapiente unde nisi delectus? Commodi quas unde autem vero voluptas voluptatibus eligendi. Necessitatibus magni sequi quasi aspernatur.</p>
              </div>
            </div>
          </div>
        </div>
      </section>
    </div>

```
OracleでROWNUMを使った取得レコード数指定（LIMIT句のようなもの）

# OracleにLIMIT句は無い

まず前提として、OracleにはLIMIT句というものは存在しません。
そのかわり ```ROWNUM``` という仮想カラムを使ってLIMIT句と同じようなことができます。

# やり方

```sql:5レコードだけ取ってくるサンプル
SELECT * 
FROM テーブル名
WHERE ROWNUM <= 5
```

# ORDER BY との関係について注意

ROWNUMが採番された **後** にORDER BYされます。
逆ではないので注意。

# ORDER BY の後に上位〇レコード取りたい時

サブクエリでORDER BYした後にROWNUMで絞り込む必要があります。

```sql
SELECT エイリアス名.*
(SELECT * FROM テーブル名 ORDER BY カラム名) エイリアス名
WHERE ROWNUM <= 5　
```

# 蛇足

大量のレコードがあるテーブルに対して、インデックスを貼っていないカラムでWHERE絞り込みするとすっごい遅いです。
サンプルデータが見たいだけなら ```WHERE ROWNUM <= 〇``` しとくと表示速いです。

# 参考サイトさん

https://www.earthlink.co.jp/engineerblog/technology-engineerblog/2562/

https://bestmerge.co.jp/post-1049/

# バージョン

Oracle Database 11g Release 11.2.0.1.0 - 64bit Production
アナログデータのコンピュータ制御

身の回りの機械はコンピュータが組み込まれている。
コンピュータの役割は目的に適した動作を実現するために機器をコントロールする。
自然界には```さまざまな情報（アナログ情報 区切りのない情報)```が存在する。
コンピュータはこれらの情報を各種の```センサ```によって感知し```電気信号```として受け取ると、必要な処理、判断を行う。それをアクチュエーターが```物理動作```へと変換する。
## 気づき
アナログ情報を感知するセンサがある。それをコンピュータが処理、判断その結果をアクチュエーターによって物理的動作に変えるのか。
センサはすごいな。

# センサとアクチュエータ
## 機械制御の流れ
```センサ(計測)```⇨```コンピュータ(情報処理)```⇨```アクチュエータ(物理動作)```

## センサの種類
### 温度センサ
温度を測定する。
### 照度センサ
明るさを計測
### 湿度検査
湿度を計測します。
### 加速度センサ
速度の変化率（加速度)を検出する
### GPSセンサ
地球上における位置や硬度を検出します。
### ジャイロセンサ(角速度センサ）
単位時当たりの回転角を検出する。
### 方位センサ
地球の磁北を検出する。

## アクチュエータ
電気信号を```物理的な動作に変換```する装置
モータや電磁石など。
入力信号を直線運動や回転運動などの機械エネルギーに変換します。
```機器を実際に動かす駆動装置```に当たります。

# 機器の制御方式
```シーケンス制御```と```フィートバック制御```がある。
これら２つを使い分けたり、組み合わせたりする。

## シーケンス制御
あらかじめ定められた殉職者や条件に従って、制御の各段階を逐次進めていく制御方式
### 気づき
洗濯機はシーケンス制御なのか。

## フィーとバック制御
現在の状態を定期的に測定し、目標値とのずれを入力側に戻して反映させることで、出力結果を目標値と一致させようとする制御方式です。
### 気づき
エアコンはセンサを使って目標値のずれを確認するんだな。

## 気づき
センサとアクチュエータを使ってシーケンス制御、フィードバック制御を行なっているんだな。
オブジェクトをlocalStorageに保存する方法

はいさい！オースティンやいびーん。月曜日、にりーよね。

# 概要
`Window.localStorage`にオブジェクトを保存する方法を紹介します。

## 背景
<a href="https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage">Window.localStorage</a>にJavaScriptのオブジェクトを丸ごと保存したいことがありますが、その時に以下のようなコードを実行してみますと、
```javascript
window.localStorage.setItem("chura", { data: "ちゅら" })

window.localStorage.getItem("chura") // '[object Object]'
```
ご予想の通り、`'[object Object]'`が返ってきます！アキサミヨー。

実は、`Window.localStorage.setItem`は、数字、文字列、オブジェクト、何もかも`UTF-16`に変換した上で、`Window.localStorage`に保管するようになっているのです。

つまり、数字を保管した場合でも、`Window.localStorage.getItem`で取り出したときには文字列になっているのです。

オブジェクトをそのまま渡した場合は、`Object.prototype.toString`が実行され、今回の場合、オブジェクト名を設定していないので、デフォルトの`'[object Object]'`
が返ってきているのです。

# 解決法
オブジェクトを一旦、JSONに変換した上で、`Window.localStorage.setItem`を実行するようにします！
```javascript
const churadaNoData = { chura: "ちゅら" };

const churaNoJSONData = JSON.stringify(churaNoData);

window.localStorage.setItem("chura", churaNoJSONData);
```
そして取り出す時には以下のようにします。
```javascript
const retrievedChuraNoData = JSON.parse(window.localStorage.getItem("chura"));
```

## 注意
JSONには関数を変換することができませんので、ご注意ください。
以下のようなコードを実行してみると、
```javascript
const churadaNoData = { chura: "ちゅら", func: () => {} };

const churaNoJSONData = JSON.stringify(churaNoData);

window.localStorage.setItem("chura", churaNoJSONData);

JSON.parse(window.localStorage.getItem("chura")); // { chura: "ちゅら" }
```
`func`は取り出されたオブジェクトにないことがわかります。

なぜなら、関数は、<a href="https://developer.mozilla.org/ja/docs/Glossary/Serialization">シリアライズ</a>が不可能だからです。

# もっといいAPI：IndexedDB

実は、Objectをシリアル化できるブラウザの保存機能があります。

それは、**[IndexedDB](https://developer.mozilla.org/ja/docs/Web/API/IndexedDB_API)**です。

IndexedDBの使い方はLocal StorageおよびSession Storageより複雑なのでLocal Storageと同様に使いたい、Indexed DBの他の機能はいらないという場合は`idb-keyval`というnpmパッケージを使うことを推奨します。

https://www.npmjs.com/package/idb-keyval

使い方は同様に簡単になります。

```javascript
import { set } from 'idb-keyval';

set('obj', { a: 1 });
```

File System Access APIのFileHandleもIndexedDBに入れて設定を保存することができるのでIndexedDBもぜひ活用していただければと思います！


# まとめ
localStorageにオブジェクトを保管する方法を紹介しましたが、いかがでしょうか？


こうすることで、オブジェクト形式で保存するとともに、オブジェクトの値を型を保持することもできます。
自作したボタンでもButtonクラスを使いたい(M5stickC)

# はじめに
M5stickにスイッチを繋いで仮想キーボードとか作ったりして遊んでいるのですが、**後からつけたスイッチの処理を毎回考えていちいち書いたりコピペしたりするのがめんどくさくなってきました。**
本体のボタンはM5.BtnA.wasPressed()とかできるのだから、後つけスイッチでも同じことができたら楽になるんじゃない？というのが今回の趣旨です。

## やり方
結論から言うと、Buttonクラスを継承？すればすぐにできました。（※この記事はクラスの継承とかよく分からない素人が書いています）

まずはサンプルコードをご覧ください。

~~~
#include <M5StickC.h>

// GPIO 0,26に外部スイッチを繋いでいる場合
#define EX0_BUTTON_PIN 0
#define EX1_BUTTON_PIN 26

  Button BtnEX0 = Button(EX0_BUTTON_PIN, true, DEBOUNCE_MS)
  Button BtnEX1 = Button(EX1_BUTTON_PIN, true, DEBOUNCE_MS)

void buttonUpdate(void){
 
  BtnEX0.read();
  BtnEX1.read();

}

void loop() {

  M5.update();
  buttonUpdate();

  if ( BtnEX0.wasPressed() ) {
  　// ボタンが押された時の処理
  }
  if ( BtnEX1.wasPressed() ) {
  　// ボタンが押された時の処理
  }

  delay(100);
}

~~~
そんなに難しくないですね！


## 何をやっているのか
まずは公式のButtonはどんな風に処理をやっているのか見てみました。

~~~
#define DEBOUNCE_MS 10
    Button BtnA = Button(BUTTON_A_PIN, true, DEBOUNCE_MS);
    Button BtnB = Button(BUTTON_B_PIN, true, DEBOUNCE_MS);
~~~
[M5StickC.h](https://github.com/m5stack/M5StickC/blob/master/src/M5StickC.h)

BtnA BtnB の宣言です。( 100～102行目 )
PIN番号さえ指定してやれば、そんなに難しくなさそうです。
ture とか DEBOUNCE_MSとかありますが、まずは変なところはいじらないでおきます。

次に、「Buttonを使うならM5.update()を忘れるな」と言われるのでupdate()では何をしてるのか見てみます。

~~~
void M5Stack::update() {

  //ボタンアップデート
  BtnA.read();
  BtnB.read();
  BtnC.read();

  //スピーカーアップデート
  Speaker.update();
}
~~~
[m5-docs システム](https://github.com/m5stack/m5-docs/blob/master/docs/ja/api/system.md)

お、おう。update()、意外と単純な内容だった。
でもこれなら応用は簡単です。
自分で作ったボタンもループで毎回read()してやればいいという事ですね。

ということでまとめると、上にあげたサンプルコードのような内容になりました。

## スイッチを取り付ける時の注意事項

プログラミング上の注意というよりはんだ付けの問題なのですが、スイッチを押したときGPIOがプラスに繋がるかマイナスに繋がるかは大事です。
Buttonクラスは初期化時に**INPUT_PULLUP**されるからです。
詳しくはこちら。[M5stickC - Button.cpp](https://github.com/m5stack/M5StickC/blob/master/src/utility/Button.cpp)

ものすごくざっくりいうと、Buttonとして宣言するとプラスになるという事です。
ですので、スイッチを押したときGNDに繋がるようにはんだ付けしてやればいいみたいです。

:::note warn
GPIO36 (G36)だけは例外です。GPIO36は「入力専用端子で出力はできません。また、プルアップとプルダウンも利用できませんので注意しましょう」ということなので、GNDに繋ぐことはできません（繋いでも反応しません）。
[（lang-ship M5StickC非公式日本語リファレンスより）](https://lang-ship.com/reference/unofficial/M5StickC/)

これは裏ワザというか間違った使い方だと思いますが、GNDではなく3V3に繋ぐようにすればG36もボタンとして使えます。
ただし動作がほかのボタンと少し違ってきたりします。使用は自己責任で行ってください。
:::

## おわりに
これで外部GPIOに接続したスイッチやボタンでも wasPressed()できるようになりました。
スケッチの見通しが良くなっていいね！

## 参考
[lang-ship](https://lang-ship.com/blog/)
[lang-ship M5StickC非公式日本語リファレンス](https://lang-ship.com/reference/unofficial/M5StickC/)
ある朝起きたらnvidia-driverの姿は見えなかった 

## 目的
ある朝起きたら、ubuntu18.04からnvidia-driverの姿が見えなくなっていた.
DP portから出力はあるが, VGAとして認識されており, settings にもなかった.


## 行ったこと
### 状況把握
- nvidia-smi : nvidia-driverが存在しないと言われる
```
NVIDIA-SMI has failed because it couldn't communicate with the NVIDIA driver. Make sure that the latest NVIDIA driver is installed and running.
```
- tensorflowからの認識 : 認識しない
- ubuntuのlspci | grep -i nvidia : 認識はしている

### 修正作業
1. nvidia-smi でdriverが認識しなかったことから, apt 経由でinstall したnvidia-driver-470が認識していないものと推定
1. apt history.logを確認するが、直近で関連するアップデートは存在しなかった.そのため, 単体のpkgをチェックする.
1. apt install --fix-broken を実行する -> ubuntu周りのpublic-keyの期限が切れているとerrorが発生する.
    1. `sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys KEY`　
   で追加
1. apt install --fix-broken　を実行する -> Dependsのverが異なるため、処理できないとerror
1. apt install --reinstall install nvidia-driver-470 > 同上
1. 一度aptからnvidia-driver関連をpurgeして再インストールを試みる(libnvidia* , nvidia*をpurge)
1. purgeのみでは, Dependsのver不一致を回避できず
1. apt install で推薦されるDependsを一つ一つ個別でinstallを実行(結果的に,libnvidia-compute-470,libnvidia-fbc1-470を再インストール)
1. `apt install install nvidia-driver-470` でインストールができた.
1. `libnvinfer8`関連ライブラリで一緒にremoveされてしまったものを再インストール
1. reboot
1. nvidia-driverは姿を見せてくれた.(復旧した)

### なぜdriverが家出をしたのか
こればかりはまだ謎に包まれている.


(多分夜中のシャットダウンが影響しているが、GUI経由での通常シャットダウンであり、問題はなかったはず...)
クラウドネットワークを学ぶ② インターネットゲートウェイとNATゲートウェイ

# インターネットゲートウェイ
クラウド環境とインターネットをつなく仮想ルーター
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2727269/60b44eef-7be6-e54b-977c-d5eace896e18.png)
インターネットゲートウェイを通過することで、クラウド・インターネット・インターネットの双方向の通信が可能。
インターネットゲートウェイに接続するには、パブリックサブネット(パブリックIPアドレス)である必要がある。

# NATゲートウェイ
プライベートサブネット(プライベートIPアドレス)からインターネットに接続する場合、NATゲートウェイを使用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2727269/4009122e-af90-c736-6646-967a0d5971bc.png)
NATゲートウェイの場合、インターネットからクラウドへの通信はできない。

## 参考ページ
https://docs.oracle.com/ja-jp/iaas/Content/Network/Tasks/managingIGs.htm
VScode上でSQliteを操作する方法

# 目的
Railsでアプリを作っている際に、VScode上でテーブルのデータを操作したいと思いました。
本記事では

+ VScode上でテーブルを確認する方法
+ VScode上でテーブルのデータを操作(追加、編集、削除)する方法

についてまとめています。

# 今回使用するテーブル
今回はRailsにて簡単な名簿アプリを作成しました。
GitHubにアップロードしていますので、下記から自由にダウンロードしてください。
https://github.com/ysk91/name_list

本アプリ内では`people`というテーブルを用意しました。
まずはアプリ上の「新規作成」か`db>seeds.rb`かでデータを適当に作ります。

# VScode上でテーブルに格納されたデータを確認する
VScode上でSQliteを見るには、「sqlite3」という拡張機能を使用します。
インストール方法はこちらの記事を参考にしてください。
[VSCodeでSQLiteを使うなら拡張機能を使う（sqlite3のバイナリファイルを見る方法）(Qiita)](https://qiita.com/ritya/items/098835a96f3fcf7c6661)
これで自分が今、どんなテーブルを持っているのかが分かるようになります。

早速sqlite3でテーブルを表示させると、下記のようにデータが格納されていることが確認できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2688241/ee140123-bbd1-dff0-9489-e418f0a3fb1c.png)



# VScode上でSQliteを操作する方法
VScode上でSQliteを操作するには、sqlite3で操作したいテーブルを右クリックし、「New Query[Select]」を選択します。
「New Query[Insert]」でも良いのですが、まぁお好きにどうぞ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2688241/8cbcd70e-383b-a6dc-89b4-760698f02ce8.png)

すると、「-- SQLite.sql」というファイルが開きます。
このファイル上にSQliteのコードを書いて実行していく訳です。
こちらのファイルは、`db`フォルダ直下に保存しておきましょう（保存しなくても操作可能）。

試しに、現在書かれているコードを実行してみましょう。
```sql
SELECT id, name, age, created_at, updated_at
FROM people;
```
コードを実行するには、画面上で右クリックをして「Run Query」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2688241/de94ec3f-f10e-9d72-cb8d-de52cd97da42.png)

すると、`people`テーブルに格納されているデータが見られるはずです。


# INSERT
dさんをこの名簿に参加させます。\Welcome/
dさんの情報を追加しましょう。
記載する情報は`name`、`age`、`created_at`、`updated_at`です（`created_at`と`updated_at`はsqlite3から操作する場合は自動更新しないので、操作してあげる必要がある）。
下記コードを実行します。
```sql
INSERT INTO people (name, age, created_at, updated_at)
VALUES ("d", 40, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP);
```
「Run Query」しテーブルを確認すると、id=4にdさんの情報が格納されたことが分かります。

:::note
Tips
ここで、実行したコードはコメントアウトしておきましょう。
次に操作するときに同じコードが実行されてしまうのを防ぐためです。
コメントアウトは、コメントにしたい行を選択して「Ctrl + /」で可能です。
:::

## CURRENT_TIMESTAMPについて
操作したテーブルをよく見ると、`created_at`と`updated_at`の値が微妙に違うことが分かります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2688241/b1165b6f-3e7c-03ba-a035-a467872ec1a6.png)


アプリ上、もしくは`seed.rb`でデータを作成したcさんの`created_at`と`updated_at`には時間表記の後にミリ秒？が続きますが、sqlite3からデータ作成したdさんにはそれがありません。
このような違いはありますが、実際にアプリ上での表記に差はないので、今はこれで良しとします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2688241/5878d668-8d89-2ebe-ba92-a60d1753a236.png)

**ミリ秒？まで出力するメソッドをご存じの方がいたらコメント欄にて教えて頂けると幸いです。**

# UPDATE
今、aさんが誕生日を迎えて11歳になったとします。\HBD/
aさんの情報を更新していきましょう。
更新する情報は`age`と`updated_at`です。
下記コードを実行します。
```sql
UPDATE people
SET age = 11, updated_at = CURRENT_TIMESTAMP
WHERE id = 1;
```
「Run Query」しテーブルを確認すると、id=1であるaさんが無事に誕生日を迎えられたことが分かります。

# DELETE
今、dさんからこの名簿から退出したいと申し出がありました。\Good-Bye/
bさんのデータを削除したいと思います。
bさんの`id`は2なので、下記コードを実行します。
```sql
DELETE FROM people
WHERE id = 2;
```
「Run Query」しテーブルを確認すると、id=2であるbさんのデータが削除されているのが分かります。

# まとめ

以上がVScodeでSQliteを操作する方法です。
意外と一か所に情報がまとまっていなかったので、本記事が誰かの役に立つことを願っています。
ご指摘等はコメント欄にてお願いします。
商談商品にあるステータスの割合を表示する ロールアップサマリーフィールドの活用


元の質問[Opportunity Status based on Product Status?](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000IRSJ6SAP)

商談商品のステータスが完了のものの割合を表示したいらしい。

こんな感じになったらいいのかな？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/9c6f1b47-6ff5-a655-1fa6-b85165c66090.png)

さて、とりあえず商談オブジェクトに２つの ロールアップサマリーフィールドを作ります。

１つは商談商品の全件数 (OppLine Count)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/0dc3e594-5f10-fe87-1c8c-36ef5633d054.png)

もう一つはステータスが完了になった商談商品の件数 (Status completed)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/219a8e8c-2b1e-e59c-7b42-ddc19728c9ca.png)


最終的にはこの２つのフィールドを使った数式フィールドを作ります。(Rate)

```
IF(  OppLine_Count__c = 0, 0 ,   Status_completed__c / OppLine_Count__c )
```



関連リストの表示項目を変更したかったのですが、Opportunity (Sales) Layoutに変更する必要がありました。
Allは意味なし。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/8f048b2e-9af3-9dc0-85e4-67f75e87a3fc.png)
Github Flowの運用方法について参考サイト一覧


自分のメモ用

### Github Flowの流れについて図解

https://atmarkit.itmedia.co.jp/ait/articles/1708/01/news015.html

### Github Flowで使用するコマンド一覧
branchの作成・削除や移動について
Github Flowの手順に沿ってコマンドが載ってるのでわかりやすい。

https://qiita.com/Naoki206/items/e5520453f92dcd4274f1

ついでに
#### 友達に教える時に使うGithub参考サイト
https://prog-8.com/courses/commandline

https://prog-8.com/docs/git-env
ローカルでのnode,yarn,npmのバージョン管理について

最近ローカルでnuxt createしたり、Amplify CLIを入れたりと、ローカル環境で、nodeやyarnのバージョンを切り替えたりしないといけないことがあったので、まとめておきました。

ちょっと、管理の仕方として最新の方法じゃないかもしれないので、色々異論あるかと思いますが、メモ程度なのでご容赦ください。

# nodeの管理
- nodeのバージョンを切り替えるための処理
- homebrewがインストールされている前提

## nodebrewがインストールされているか確認

```ruby
$ nodebrew -v
```

```ruby
$ node -v
```
でnodeのバージョンも確認できる

## nodebrewをインストール（インストール済みであれば不要）

```ruby
$ brew install nodebrew
```

```ruby
$ nodebrew -v
```
でバージョン確認

## nodebrewでインストール可能なnodeのバージョンを確認

```
$ nodebrew ls-remote
```


## ローカルの状況確認（nodebrewを通さずにインストールされているnodeがあれば一旦、アンインストールが必要）


```ruby
$ brew ls
```
→nodeが入っていれば一度アンイストールしなければいけない


## 今まで使っていたnodeをアンインストール

```bash
$ brew uninstall --force node
```
→無理なら``$ brew uninstall --ignore-dependencies node``

## pathを設定

```bash
$ vim ~/.bash_profile
```
vimでファイルを開き、以下を追加する。

``export PATH=$HOME/.nodebrew/current/bin:$PATH
bash_profile``

```ruby
$ source ~/.bash_profile
```
→更新して設定を反映させる。

## セットアップ

```ruby
$ nodebrew setup
```
→セットアップのためのコマンドで、これやらないとインストールできない。

## インストール可能なバージョンを確認

```
$ nodebrew ls-remote
```

## nodebrewを通して、使いたいバージョンを指定してnodeをインストール

```
$ nodebrew install-binary 8.11.1
```

## 使用するnodeのバージョンを選択

```
$ nodebrew use v8.11.1
```

## nodeが正しく設定されているか確認

```
$ nodebrew ls
v8.11.1
v12.14.0

current: v8.11.1
```

こんな感じになれば正解。


# yarnのバージョン管理

yvmでyarnの複数バージョンを管理する(Yarnのバージョン管理マネージャー)

## 既にyarnをinstall済みだったら削除する

```bash
$ yarn -v
```

```bash
// Homebrewでインストールしている場合
% brew uninstall yarn
```


## yvmをinstall

```bash
$ brew install tophat/bar/yvm

$ curl -s https://raw.githubusercontent.com/tophat/yvm/master/scripts/install.js | node
```

インストール完了後、一度ターミナルを再起動して、yvmのバージョンを確認

```
$ yvm version
```

##  yvm version

```bash
$ yvm update-self
$ yvm install latest
$ yarn -v
$ which yarn
/Users/hogetarou/.yvm/shim/yarn
```

## yvmで他のバージョンをインストールしたい場合

```bash
$ yvm install 1.〇〇.〇
```

yvmへインストール済みのyarnのバージョンの表示
```bash
$ yvm list
```

## バージョン切り替え
```bash
$ yvm use 1.〇〇.〇
```

## yarnで管理しているパッケージを一覧したい

globalに入れいているパッケージ一覧

```bash
$ yarn global list --depth=0
```

各プロジェクト配下に入れているパッケージ一覧

```bash
$ yarn list
```

# npmのバージョン管理について

npmとはNode Package Managerの略だが、npmもyarnと同列のパッケージ管理ツール。

npmはnodeを入れると使えるようになる。

nodeのバージョンに紐づいてnpmのバージョンも切り替わるようなので、node.jsのバージョンを実行したい環境に合わせておけばnpmもそのnodeに紐づくバージョンで実行される模様。

```bash
$ npm list -g --depth=0
npm WARN config global `--global`, `--local` are deprecated. Use `--location=global` instead.
/Users/hogetarou/.nodebrew/node/v16.15.1/lib
├── @aws-amplify/cli@9.1.0
├── corepack@0.10.0
└── npm@8.11.0
```

各プロジェクト配下にnpmで入れているパッケージ一覧の確認

```bash
$ npm list
```

## 終わりに

最近は、Voltaという、node.js,yarn,npmのバージョン管理を一元的にできるものも出てきているようです。
またどこかで統一してみようかなと思いました。

参考: https://zenn.dev/taichifukumoto/articles/how-to-use-volta
rspecの並列実行を導入してテスト高速化

rspecの並列実行の設定をしてみた。

## gem parallel_tests導入
https://github.com/grosser/parallel_tests
- Gemfileにgemを追加する

```ruby:Gemfile
gem 'parallel_tests'
```
- bundle install
```bash
$ bundle install
```

## DB関連設定
- parallel_testsを使った並列テストでは、CPUのコア数だけ並列するので、コア数分、テスト用のデータベースを用意する必要がある。
    - localの場合、macのcpuのコア数に依存
    - dockerの場合、dockerのcpuのコア数の設定に依存

- config/database.ymlのデータベース名の末尾にTEST_ENV_NUMBERという変数追加する必要がある

```ruby:database.yml
test:
  database: テスト用データベース名<%= ENV['TEST_ENV_NUMBER'] %>
```

- テスト用DBのセットアップコマンド時に以下の権限が必要なため、入れてなければ入れる必要

```sql
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, PROCESS, REFERENCES, INDEX, ALTER, SHOW DATABASES, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER ON *.* TO 'テスト用DBユーザー名'@'%' WITH GRANT OPTION;

```

- dockerの場合、docker-compose up時にprovisioningを走らせることができるので、そこで設定してしまう方が良さそう

```sql:provisioning/sql.d/setup.sql
CREATE USER 'テスト用DBユーザー名'@'%' IDENTIFIED BY 'パスワード';
GRANT ALL PRIVILEGES ON テスト用データベース名.* TO 'テスト用DBユーザー名'@'%';
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, PROCESS, REFERENCES, INDEX, ALTER, SHOW DATABASES, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER ON *.* TO 'テスト用DBユーザー名'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;
```

```docker-compose.yml
mysql:
    image: mysql:5.7
    platform: linux/x86_64
    container_name: hoge-mysql
    command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci
    environment:
      MYSQL_ROOT_PASSWORD: password
    volumes:
      - ./provisioning/sql.d:/docker-entrypoint-initdb.d ←ここで実行
      - mysql_data:/var/lib/mysql
    ports:
      - 3306:3306
```

※volumeにデータベースの古い設定データが残っていると実行されないので、volumeを消してからbuildする。``docker-compose down --rmi all -v``

- テスト用DBのセットアップコマンド
```bash
# テスト用DBを並列化する分だけ作成する。CPUのコア数分だけ並列化される。
# DBのスキーマに変更があった場合はその度prepareしなおす必要
$ bundle exec rake parallel:create
$ bundle exec rake parallel:prepare
```

## テスト実行

```bash
$ bundle exec rake parallel:spec
```

## 参考記事
https://hai3.net/blog/gem-parallel_tests-rspec/
WARNING in asset size limitの対処法について

# 概要
- __起こった現象__：
EC2でデプロイしたアプリにアクセスできない

- __エラー概要__:
```:ec2内のターミナルにて
Rails assets:precompile RAILS_ENV=production
```
このコマンドでアセットをコンパイルしようとすると以下のエラーが出る。
![asset size limit.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2661107/e5ef7aba-4ce7-b9d2-d5db-bd8ddf2302cd.jpeg)

## 仮説と検証
このエラーから、「アセットファイルがリミットを超えている」と理解しました。
対処法として、「サイズが超えているファイルを特定して対処する」
もしくは「サイズの上限を上げる」このどちらかになると思い調べました。

### 検証１(サイズが超えているファイルを特定して対処する)
エラー文を見ると、`js/application-0bc4a48eadb9d940687.js.map.gz`
というファイルがサイズを超えているそうです。
VSCodeを見ても特定のファイルは見つからず、サイズを超えているファイルが複数あることからこの方法は断念しました。多分ですが、bootstrapのファイルだと思います。

__補足1__：bootstrapとjqueryを削除
```
どうもassetsとwebpackerで干渉してたものがあったらしく、
gemfileからjquery-railsとbootstrapを削除。

そのエラーは出なくはなりました。
```
[参考にしたサイト](https://teratail.com/questions/328398?link=qa_related_sp)
上記のような対処法がありましたがbootstrapとjquery-railsを削除したくなかったので実際には試しておりません。もし、消しても問題がなければお試しください。

__補足２__：　うまく規定サイズ内に納めてコンパイルさせる方法
[参考にしたサイト](https://zenn.dev/arisa_dev/articles/webpack-warning-code-splitting)
こちらはwebpack公式のドキュメントに沿ってサイズ内にコンパイルさせる方法です。
ディレクトリ構造などが分からず、行っている内容もあまり理解できなかったため、実際には行っていませんが、もしこちらの方法でできるのであれば、ベストな気がします。

### 検証２(サイズの上限を上げる)
こちらは実際に行ってうまく行った方法です。
```:config:webpacker.yml
# 変更前
resolved_paths: []
# 変更後
additional_paths: [] 
```
これだけです。
pathを変えることで、うまく行きました。
[参考になったサイト](https://qiita.com/kakudaisuke/items/e859544d67ea2121edbd)

## まとめ
このエラーで3日潰れました。
この記事によりあなたのエラーが解決するといいですね！
nRF Connect SDK:カスタム基板の追加(VSCode版)

# ここからVisual Studio Codeで
nRF Connect SDK (NCS) はバージョン2.0で正式にSegger Embedded Studio (SES) のサポートを終了したので、ここからは Visual Studio Code (VSC or VSCode) での対応となります。
SESのサポートは残しておいて欲しかった・・・とは思ったのですが、今後のウリであるnRF5340を完全サポートできない時点で限界があったのでしょう。

::: note
nRF5340がサポートできないのは、以下の記事にあるようにSESがネットワークコアに書き込めないという制限の話です
:::

https://qiita.com/yoshihiro0709/items/ab92526abe05164d97eb

# カスタムボードの追加
以前に一度、SESでカスタムボードを追加する記事を書きました。

https://qiita.com/yoshihiro0709/items/c5aef2237d0c72de0da5

正直なところ非常に面倒な手順でした。だって、エクスプローラーとかであらかじめコピーしておかないといけないんだもん。このあたりのこともSESがサポートされなくなったことと関係があるのかも知れませんね。

## VSCodeでは簡単！
ところが！
VSCodeでは実に簡単にできてしまうのです。正直、わざわざこんな記事を書く必要もないレベルで簡単です。

::: note
じゃあ書くなよ・・・(笑)
:::

な、なんと！
アドインのメニューの中にあるCreate a new boardを押すだけです(笑)。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340602/d7089736-0bf4-0e11-3c13-a58061dc070d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340602/b28d5823-7e61-1522-566a-3771012407bc.png)
ボード名(Name)と会社名(Vendor name)を入れて、どのフォルダに保存するか選択したら、Create Boardを押すだけです。あら簡単！(笑)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340602/f76ea2a2-8a30-1404-54e7-6cb577144c4e.png)
問題なく作成できました。
早速中身を覗いてみると・・・。
``` testboard.dts
// Copyright (c) 2022 Nordic Semiconductor ASA
// SPDX-License-Identifier: Apache-2.0

/dts-v1/;
#include <nordic/nrf52840_qiaa.dtsi>

/ {
	model = "TestBoard";
	compatible = "company,testboard";

	chosen {
		zephyr,sram = &sram0;
		zephyr,flash = &flash0;
		zephyr,code-partition = &slot0_partition;
	};
};

&flash0 {
	partitions {
		compatible = "fixed-partitions";
		#address-cells = <1>;
		#size-cells = <1>;

		boot_partition: partition@0 {
			label = "mcuboot";
			reg = <0x0 0xc000>;
		};
		slot0_partition: partition@c000 {
			label = "image-0";
			reg = <0xc000 0x72000>;
		};
		slot1_partition: partition@7e000 {
			label = "image-1";
			reg = <0x7e000 0x72000>;
		};
		scratch_partition: partition@f0000 {
			label = "image-scratch";
			reg = <0xf0000 0xa000>;
		};
		storage_partition: partition@fa000 {
			label = "storage";
			reg = <0xfa000 0x6000>;
		};
	};
};
```
・・・。
えっ、これだけ・・・？
だってさっきのCreate a new boardの画面ではI/Oのこととか一切聞かれていないですし、まあ当たり前と言えば当たり前ですよね。
ぶっちゃけた話、過去の記事にも書きましたがこれだけでも問題ないです。

https://qiita.com/yoshihiro0709/items/48f1164ce8e03af5cafc

上記の記事から引用
>私が自分自身で試行錯誤して理解している範囲では、ZephyrにおいてDTSというのはあくまでもオプション的扱いだと受け止めています。超汎用仕様で様々なCPU/Boardで動くようなファームウェアを設計するのであれば話は別ですが、99.9%のファームウェア開発においてはそんなことはありえなく、弊社専用(笑)のガチガチの仕様のものが1個あるだけです。
そのような状況下においてDTSから読み込んでI/Oピンその他の設定をするというのはとてもお行儀のよい設計ではありますが、一方でDTSなんかガン無視してベタ書き(例えばPIN10はLEDを制御)であっても特に問題は起こらないわけです。なぜなら汎用のものを作っているわけではないから。

ということで、自社で開発したボードであればDTSで定義しなくてもファームウェア中にべた書きで埋め込んでしまえばそれでよいのです。Nordicの評価ボードがDTSで記述されているのはnRF52832用、nRF52840用、nRF5340用とそれぞれのボードで使用しているI/Oが違うからです。
違う見方をすれば、ボードとしてはnRF52840などの評価ボードを選んでおいて、中身ではべた書きをしてDTSの定義を使わないというのもありだと思います。お行儀のよい書き方とは言えませんが(笑)

## I/Oの定義
どうしてもI/Oの定義もしたい、という方は上記のDeviceTreeの記事、もしくはSDKに添付されているDTSファイルを参考にしてください。もしかしたらいつか書くかも知れませんが・・・。
なお、上記のDeviceTreeの記事も割と中途半端だよなぁ・・・とは思っていますが、全ての記事において「自分自身で調べて理解できた範囲」になっているので中途半端な感じは出てしまいます。なかなか一気に全てを調べるというのは難しいです。

# あとがき
更新の間が空いてしまいました。一応、本業もある(笑)のでこちらは飽くまで手が空いて僕自身が使い方を色々と調べることができる時に更新されます。
contact form 7でメールアドレス確認用フォーム作成する方法



自分の備忘録としてコード残しておきます。

functions.phpに記述
~~~ php
add_filter( 'wpcf7_validate_email', 'wpcf7_validate_email_filter_confrim', 11, 2 );
add_filter( 'wpcf7_validate_email*', 'wpcf7_validate_email_filter_confrim', 11, 2 );
function wpcf7_validate_email_filter_confrim( $result, $tag ) {
    $type = $tag['type'];
    $name = $tag['name'];
    if ( 'email' == $type || 'email*' == $type ) {
        if (preg_match('/(.*)_confirm$/', $name, $matches)){ //確認用メルアド入力フォーム名を ○○○_confirm としています。
            $target_name = $matches[1];
                $posted_value = trim( (string) $_POST[$name] ); //前後空白の削除
                $posted_target_value = trim( (string) $_POST[$target_name] ); //前後空白の削除
            if ($posted_value != $posted_target_value) {
                $result->invalidate( $tag,"確認用のメールアドレスが一致していません");
            }
        }
    }
    return $result;
}
~~~

ContactForm7のメールフォームに記述
~~~ html
<label>メールアドレス[email your-email]</label>
<label>メールアドレス（確認）[email your-email_confirm]</label>
~~~
LinuxのIntel x86のIntrinsic関数をIBM PowerやARM用にポートする(４)

 さて、テストフレームワークを作るときに問題が一つある。それは、同じ値のセットを二重でチェックする可能性があるということだ。二重でチェックしたら全くの無駄であるため、これを防ぐための機構が必要である。何らかのバグにより同じ値ばかりチェックする可能性もある。

では以下のソースコードを見てみよう。

```c
extern __inline __m128d __attribute__((__gnu_inline__, __always_inline__,__artificial__))
_mm_add_pd (__m128d __A, __m128d __B)
{
   return (__m128d) ((__v2df)__A + (__v2df)__B);
}
```

`__m126d`は１２８ビットの型である。これが２つあるため、このIntrinsic関数においては、チェックされる値は全て合わせて256ビットで表現できることとなる。
`2**256`の組み合わせは膨大にあり、Intrinsicnによっては５１２ビットの型もあるため、その場合は組み合わせは`2**1024`となり、すべてを網羅したテーブルを作って管理することは現実的ではない。
ではどうすればいいか、２分木を使えばいい。例えば、1101の値を「チェック済み」にする場合はルートから、1 1 0 1の枝をはやし、最後の葉に帰ってきた値などを格納することとなる。
チェックされていない値は、枝が途中で切れているか、葉がないため、チェックされていないことを確認できることとなる。その場合は、枝と葉を生やし、「チェック済み」とする。

つまり、１０２４のビットをチェックする場合は、１０２４の階層の二分木の構造を構築することとなる。

この方法の利点としては、IntelとOpenPOWERをApache Kafkaなどで相互接続する必要がないことである。ファイル移動のみですべてを処理することができる。相互接続して同期機構を作ってもいいがそれはオプションとなる。

あるいはハッシュを使う手がある。入力値にハッシュをかけ、テーブル上のハッシュで指定された場所に「チェック済み」と格納する。そしてテストを実行する。次回からは、入力値にハッシュをかけて、テーブル上のハッシュ値で指定された場所に前の「チェック済み」値がなければ、テストを実行し、「チェック済み」としてそこに格納する。そこにもうすでに値が格納されていれば、もとの入力値を比較し、同じであれば、テストを実行する必要なし、入力値が違ったら、テストを実行し、リスト構造のような鎖をそこから生やして、次回からはリスト構造の根本からチェックしていく。

あるいは、C#やRustなどを使えるとしたら、二重チェックを防ぐためにSetなどが使える。Set（集合）は重複なしに要素を管理できる。

例えば、専用ソフトウェアで二分木構造のテストケースを作る。で、IntelとOpenPOWER上の専用ソフトウェアにそのテストケースのファイルを食わせて、テストを実行し、IntelとOpenPOWERのテスト結果を専用ソフトウェアで照合することとなる。

Special thanks

Hayashizaki Masayukiさん
WordPressでカスタム投稿タイプ別にループする方法

# WordPressでカスタム投稿タイプ別にループする方法

以下カスタム投稿タイプ別にループ処理を作成する場合のコード。

投稿タイプ：news
表示する投稿数：5

~~~ php

<!-- ループ処理の設定 -->
<?php
$args = array(
     'post_type' => 'news', /* 投稿タイプを指定 */
     'posts_per_page' => 5, /* 表示するページ数 */
); ?>
<?php query_posts( $args ); ?>
<?php if ( have_posts() ) while ( have_posts() ) : the_post(); ?>
<!-- ここからループ処理 -->


<!-- ここまでループ処理 -->
<?php endwhile; // end of the loop. ?>
<?php wp_reset_query(); ?>
<!-- ループ種類の設定をリセット -->

~~~

このコードを利用すればindexページに複数種類のループを入れることも可能です。

カスタム投稿タイプは**Custom Post Type UI**というプラグインで作成できます。
https://ja.wordpress.org/plugins/custom-post-type-ui/
SalesforceでTrailheadのハンズオンチャレンジをする際に気を付けること～Trailheadの言語設定をEnglishにしよう～

Trailheadは言語設定を英語や日本語に切り替えられることはご存じでしょうか


下記画像のように右下部分から言語設定を変更できます。
![言語設定１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/5d46465a-c290-b3be-780c-ba583e691f19.png)

現状のTrailheadでは「日本語の状態では誤訳などがありハンズオンチャレンジがクリアできない」という状況がございます。


一例を挙げますと
「Lightning Experience のレポートおよびダッシュボード 」
の
「AppExchange を使用したレポート戦略の拡張」
です
https://trailhead.salesforce.com/ja/content/learn/modules/lex_implementation_reports_dashboards/lex_implementation_reports_dashboards_appexchange

こちらについて、日本語では「値：千代田区」となっているが、残念ながら文字通り「千代田区」と設定してはクリアできないです。


日本語文章

パッケージをインストールする:
パッケージ ID: 04t500000000YYSAA2
ダッシュボードを作成する:
コピーするダッシュボード: 1-Account, Contact & Opportunity Data Quality
名前: 私の取引先および取引先責任者ダッシュボード
検索条件:
項目: 市区郡(請求先)
表示テキスト: 市区郡(請求先)
値: 千代田区
ダッシュボードを保存する
![日本語.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/b8992310-7743-eb92-7b00-a309c96f8f33.png)


英語にすると分かるように「San Francisco」と設定するのが正解です

Install a package:
Package ID: 04t500000000YYSAA2
Create a dashboard:
Find and copy dashboard: 1-Account, Contact & Opportunity Data Quality
Name: My Account and Contact Dashboard
Filter:
Field: Billing City
Display Name: Billing City
Value: San Francisco
Save the dashboard
![英語.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/c110e5de-21e0-86bc-ebee-5fff426d425d.png)


日本語のままハンズオンチャレンジに取り組んでしますと、「千代田区」と設定してしまいクリアすることができないと思います。。。。


今回のように、「日本語のままチャレンジをするとクリアできない」Trailheadのハンズオンは他にもございます（今回は一例です）

もしもTrailheadのチャレンジでつまずいた場合、ぜひTrailheadの文章を英語にしてみると、思わぬヒントが出てきてチャレンジできるかもしれないですね。
[Dart]定数のfinalとconstの違い

# はじめに

普段はrailsを扱っていますが**flutter**も扱える様になりたくて**Dart**の勉強もしております。
今回は定数の**final**と**const**の違いについてまとめようと思います。

### final定数とは
・実行時に値が初期化される
・値が初期化された後は変更出来ない

### const定数とは
・コンパイル時に値が初期化される
・値が初期化された後は変更出来ない

**final**と**const**の違いは初期化されるタイミングに違いがあります。

### 実例①
```dart
//final定数を使用する
void main() {
  final now = DateTime.now();
  print(now);
  //実行結果
  //2022-07-19 08:26:21.350
}
```
**final定数**では実行時に値が初期化される為、コンパイル時に値が定まっていなくてもエラーが発生しません。
ですが**const定数**では値がコンパイル時に定まってなければいけません。
上記のfinalをconstにするとエラーが発生します。

```dart
//const定数を使用する
void main() {
  const now = DateTime.now();
  print(now);
  //実行結果
  //Cannot invoke a non-'const' constructor where a const expression is expected.
}
```

### 実例②
次はMap型での例です。
```dart
void main() {
  Map<String, String> addressList = {
  'taro': '千葉',
  'suzuki': '北海道',
  'sato': '埼玉',
  'kimura': '東京',
  };
  
  final firstAddress = addressList['taro'];
  print(firstAddress);
  //実行結果
  //千葉
}
```
上記もfinalの部分をconstに変更するとエラーが出ます。


## どう使い分けていくのか
まだまだ勉強初期段階ではありますがこの２種類の定数はどの様に使い分けていくのが良さそうでしょうか。

### final定数
実行時まで値が分からけど初期化された後は変更したくない場合はfinal定数で表現する。
例えば現在時刻やその配列に入っている最初の値を取り出す時など、実行時のその時々で値が動的に変化するけどその後は変更したくない場合等です。

### const定数
コンパイル時に値が既に定まっていてその後も変更したくない場合はconst定数で表現する。

## 終わりに
今回はDartの**final定数**と**const定数**の違いについてアウトプットしました。
この辺りの使いわけをきっちりやっていくことで余計なバグを引き起こさないであったりとかコードを読んだだけでその定数の役割がイメージでき、可読性も向上しそうです。

私もこの辺りの違いを認識してコードを読んで書いていきたいと思います。
読んで頂きありがとうございました。
Image-Adaptive-3DLUTをトレーニングする

# 画像の色とトーンを向上させるカスタムモデルを作りたい
Image-Adaptive-3DLUTは3D Look Up Tableを学習して、画像の強化をおこなえるモデルです。
事前トレーニング済みモデルはFiveKというレタッチデータセットで学習されていますが、カスタム・データでトレーニングすることもできます。

# トレーニング手順

### データの用意

データは次の形式で用意します。
480px四方にリサイズしました。

```
# input
data/my_dataset/input/JPG/480p

# truth
data/my_dataset/expertC/JPG/480p
```

### セットアップ

```shell
pip install torch==0.4.1.post2 torchvision===0.2.2 -f https://download.pytorch.org/whl/torch_stable.html
cd trilinear_c
sh make.sh
```

### トレーニング

```shell:train.sh
# For pair dataset
python3 image_adaptive_lut_train_paired.py --dataset_name "my_dataset"

# For unpair dataset
python3 image_adaptive_lut_train_unpaired.py --dataset_name "my_dataset"
```

1エポックごとにウェイトが保存されます。
image_adaptive_lut_train_unpaired.py内のVisualizeImageをコメントアウトすると、生成結果が保存されます。

🐣
****
フリーランスエンジニアです。
お仕事のご相談こちらまで
rockyshikoku@gmail.com

Core MLやARKitを使ったアプリを作っています。
機械学習／AR関連の情報を発信しています。

[Twitter](https://twitter.com/JackdeS11)
[Medium](https://medium.com/@rockyshikoku)
[GitHub](https://github.com/john-rocky)