OmniAICreator/Qiita-1.07M huggingface dataset:
Xplenty: HubspotのデータをAPIで更新する

前回は[Xplenty: HubspotのデータをAPIで取得する](https://qiita.com/Azabu10ban/items/7b3c042d613e6d987323)方法について紹介しましたが、今回はHubspotのAPIを使用し、XplentyからHubspotのContactデータを更新する方法について解説します。

**今回使用するAPIに関する参考ドキュメント：**
https://legacydocs.hubspot.com/docs/methods/contacts/create_or_update


#データの書き込み
今回の例では、S3に保管されているコンタクトリストのCSVファイルをHubspotに更新する方法について紹介します。
##ストレージコンポーネント（ソース）を使用して、S3から今回Hubspotに更新するデータを取得します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65461/f32d3370-c2dd-e687-7e7c-ecad9b683f45.png)

##SelectコンポーネントでCurlファンクションを使用してリクエストを定義します。
**Select コンポーネントの設定画面**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65461/ece02e8d-c9b7-07fa-a504-5d74a75c7574.png)

**リクエスト例：**`https://api.hubapi.com/contacts/v1/contact/createOrUpdate/email/メールアドレスの列名/?hapikey=APIキー`

**リクエストBody例：**
`{
  "properties": [
    {
      "property": "firstname",
      "value": "firstnameの列名"
    },
    {
      "property": "lastname",
      "value": "lastnameの列名"
    },
    {
      "property": "company",
      "value": "企業名の列名"
    }
  ]
}`

**上記を参考にXplentyでのCurlファンクションを使用し、関数式にする**
`Curl(CONCAT('https://api.hubapi.com/contacts/v1/contact/createOrUpdate/email/',mail,'/?hapikey=APIキー'),'POST','{"content-type":"application/json"}',
CONCAT(
'{ "properties": [{"property": "firstname","value": "',FirstName ,'" }, {"property": "lastname","value": "' ,LastName,'" },{"property": "company","value": "',Company,'" }]}'
))#'status'`

最終的なパッケージは以下のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65461/879690be-21f4-bd1c-209d-e2dab2230882.png)


##Xplentyでジョブ実行結果を確認する
ジョブが正しく実行され、各メールアドレスに対するリクエストが成功（ステータス:200）していることが分かります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65461/afdd4f35-ca19-5961-c8b3-2505b350e1ef.png)

実際のHubspot側の画面で確認すると、ジョブ実行前の画面に対して、正しく追加、更新されていることが確認できます。

**ジョブ実行前：**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65461/7bef3aa3-4583-75f4-eabf-9db8c7bed98f.png)

**ジョブ実行後：**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65461/abfc23e8-b1f1-e29f-d7bc-f62491b65a01.png)

#変数をうまく利用する
今回は分かりやすいようにAPI KeyやURLについて固定値でセットする方法で紹介しましたが、変数を利用することで
どうやらCentOSにはterminal shortcutがないようだ

かれこれUbuntuを使用していたのでCtrl + Alt + t などのショートカットでterminalが開けないようだ

[アプリケーション]→[システムツール]→[設定]→[デバイス]→[キーボード]から一番下の+をクリックする

![Screenshot from 2020-10-22 16-02-55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/813031/22f45937-8800-dfe2-308c-29e0e3b5526b.png)


ショートカットの追加に
名前：terminal(何でもよい)
コマンド：gnome-terminal
ショートカット：Ctrl + Alt + t（お好みで）

追加ボタンを押す
![Screenshot from 2020-10-22 16-08-33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/813031/e8faf902-7451-de99-2253-f69cbb669543.png)

以上！

参考url https://sironekosukaru.hatenablog.com/entry/2018/01/20/160510
Unity - Timeline x Chinemachine

案件で、TimelinneとChinemachineを組み合わせたムービーシーンを作成したので、まとめておきます。
（基本的に備忘録なので、文章が汚いと思います…）

0. 追記
----------
下記で紹介されているLive Captureというパッケージを使用すれば、iOS端末をシーン上のカメラとリンクすることができます。iOS端末からゲームシーンを撮影することが出来て、そのままTimelineとして保存することができます。リアルタイムにカメラの動きが見れるので、営業やディレクターなどの方ともイメージが湧きやすいかもです。

https://youtu.be/M7IvFmrt300?t=413

1. Timeline
----------
ゲーム内ムービーなどを作りたい時によく使うもので、3Dモデルのアニメーション制御やポジションなどを1つのタイムライン上でまとめて管理できるものです。
<img src="https://paper-attachments.dropbox.com/s_459E7E3DD0030A8C21BA9B8B57E8489478AF01F8166436DD48C4330C9018716A_1601887193576_+2020-10-05+17.39.36.png" width="">

2. Chinemachine
----------
カメラの切り替え、カメラワークの実装はこれを使うのが良さそうでした。
以前までは、カメラの切り替えは、ポジションを指定してカメラを移動させて実現してましたが、これを使えばより簡単に実装できました。
まず、カメラオブジェクトにChinemachine Brainコンポーネントを指定します。
<img src="https://paper-attachments.dropbox.com/s_459E7E3DD0030A8C21BA9B8B57E8489478AF01F8166436DD48C4330C9018716A_1601887797624_+2020-10-05+17.49.37.png" width="600">

空のGameobjectにChinemachine Virtual Cameraコンポーネントを指定します。
<img src="https://paper-attachments.dropbox.com/s_459E7E3DD0030A8C21BA9B8B57E8489478AF01F8166436DD48C4330C9018716A_1601888000592_+2020-10-05+17.52.44.png" width="600">

このオブジェクトが、ポジション,回転などから画角などまでカメラ情報を持つようになります。
他にもChinemachine Virtual Cameraコンポーネントを持つゲームオブジェクトを作成すれば、複数台カメラを設置できます。
あくまでもカメラ情報のみなので、実際にはChinemachine Brainコンポーネントをアタッチしたカメラオブジェクトを使いまわしてる感じです。

カメラの切り替えには、Priorityプロパティーの数値を変更すれば切り替えることができます。また、Chinemachine BrainのCustom Blendsプロパティーで、カメラを切替時のアニメーションも指定できます。

3. Timeline x Chinemachine
----------

Timelineでカメラやキャラクターの移動をさせるとき、タイムライン上でポジション情報を時間ごとに調整しておりました。より視覚的に調整するために、Chinemachine Smooth Pathというのを使うと、一連のパスとしてポジションを指定することができます。

Chinemachine Virtual CmaeraコンポーネントのBodyプロパティーにて、Tracked DollyとChinemachine Smooth Pathコンポーネントをアタッチしているゲームオブジェクトを指定します。あとは、Path PositionをTimeline上で変更してあげるだけです。
<img src="https://paper-attachments.dropbox.com/s_459E7E3DD0030A8C21BA9B8B57E8489478AF01F8166436DD48C4330C9018716A_1601890551027_+2020-10-05+18.22.28.png" width="600">
<img src="https://paper-attachments.dropbox.com/s_459E7E3DD0030A8C21BA9B8B57E8489478AF01F8166436DD48C4330C9018716A_1601891703396_+2020-10-05+18.37.39.png" width="600">

カメラ以外のオブジェクトを移動させる場合は、まずChinemachine Dolly Cartをアタッチしたゲームオブジェクトを用意します。このオブジェクトに、移動させたいものを子オブジェクトとしてアタッチします。あとは、PositionをTimeline上で変更してあげるだけです。

<img src="https://paper-attachments.dropbox.com/s_459E7E3DD0030A8C21BA9B8B57E8489478AF01F8166436DD48C4330C9018716A_1601890923085_+2020-10-05+18.41.15.png" width="600">
<img src="https://paper-attachments.dropbox.com/s_459E7E3DD0030A8C21BA9B8B57E8489478AF01F8166436DD48C4330C9018716A_1601891796919_+2020-10-05+18.53.13.png" width="600">

4. まとめ
----------
今回、キャラクターの移動とカメラワークを同じタイムライン上で実装しました。カメラワークをCinemachineで実装することで、視覚的に位置調整はできましたが、カメラに主人公が映る位置やタイミングなどの細かい調整で、かなり時間がかかりました。よりChinemachineを使いこなせるとそういった調整もしやすいらしいので、いろいろ試したみたいです。

5. 追記
----------
![chinemachine.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/207069/e4837e27-ed7a-7ac8-2e8e-54bdc90a8b40.gif)

> よりChinemachineを使いこなせるとそういった調整もしやすいらしいので、いろいろ試したみたいです。

Chinemachine Virtual CameraコンポーネントのLookAtやFollow機能などで、オブジェクトに追従させるカメラを作ることが出来ます。今回作りたかったのが、途中まで
Xplenty: HubspotのデータをAPIで取得する

このブログではHubspotのAPIを使用し、XplentyからContactデータを取得する方法について解説します。
**関連ブログ：**[Xplenty: HubspotのデータをAPIで更新する](https://qiita.com/Azabu10ban/items/98ca0457e7a020909f89)

**今回使用するAPIに関する参考ドキュメント：**
https://legacydocs.hubspot.com/docs/methods/contacts/get_contacts


#Hubspot APIを使うには？
1. ダッシュボード画面右上に配置された「設定」ボタンをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65461/347281ca-0417-d232-382b-c3ce8783233a.png)

2. 連携の「APIキー」のメニューからAPIキーを生成します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65461/1f109ff6-3f47-0e6c-ed1a-399293c409c2.png)


#データの読み込み
##パッケージの作成
今回はテンプレートを利用してパッケージを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65461/b40a9b06-e4d5-63aa-a583-ae6b0f26ca17.png)

すでに構築済みのパッケージが作成されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65461/34403c09-68c7-e857-493c-19497ac466d1.png)

##接続URLの変更
接続時のURLをテンプレートで設定された変数を使用したURLではなく、変数部分を明示的に固定値に変更するだけで、コンタクト情報を取得することが可能です。
元URL`$url?hapikey=$api_key&count=250`
変更後：`https://api.hubapi.com/contacts/v1/lists/all/contacts/all?hapikey=<B>APIキー</b>&count=250`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65461/3ee0522a-502c-7b88-5932-59925ba3b5e8.png)

プレビューすると以下のようにデータがJSON形式で取得できることが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65461/014ff6e3-296e-538b-7629-db034e893b12.png)

##変換
###メールアドレスを1つの列として独立して取得する方法
1.データプレビューにもどって、メールアドレスが格納されているJSONパスを取得します。
JSONパス：　$.[2].identity-profiles.[0].identities.[0].value
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65461/21b90ede-4f51-d91d-91ab-5892020080c3.png)

2.上記のJSONパスを元に変換式を定義します。
`JsonExtractScalar(identity_profiles,'$.[0].identities.[0].value')`
注)「identity-profiles」がXplentyにより「identity_profiles」と自動的にカラム名が変更されている点に注意していください。

- JsonExtractScalar: 関数。　
<BR>**使い方**：
<BR>`JsonExtractScalar（引数1,引数２)`
<BR>`引数１`: String型のJSON文字列が格納されたフィールドや変数
<BR>`引数２`: JSONパスをシングルクォートで囲み指定する
<BR>`返り値`: String型
- `identity_profiles`: フィールド名。JSON文字列が格納されている（String型）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65461/df38f31a-64e7-545b-a39c-cfcbbd3df579.png)

3.データ送信先は、デフォルトのRedshiftを削除し、Snowflakeに送信するように変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65461/dc74916c-7bf7-141c-7386-e1e69acd62fc.png)

##Xplentyでジョブ実行結果を確認する
Hubspotより3件のレコードが更新されていることを確認できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65461/10a219f8-4109-2322-a868-4b80ac59d0c8.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65461/17055bcb-1013-a727-3161-051dff7b14b8.png)
エンジニアにぴったりな「Esc + .」というショートカットキーがあるから今すぐ試してみてくれ

わりと最近知ったショートカットなのですが、ターミナルで、
`Esc + .` （エスケープキーを一回おして、そのあとドットを押す）

で、「直前にコマンドで渡した引数を出力する」
ということができるのです。

つまりどういうことかというと、

```shell
$ ll madoka.csv
-rw-r--r--  1 rate  staff     0B  8 19 20:28 madoka.csv
```

と打った後に、`Esc + .`を押すと。

```shell
$ madoka.csv
```
とだせるのです。

## 何が嬉しいの？

僕も最初はこんなん使わねえだろ。と思ってたのですが。
例えば、「ディレクトリを作成した後、そのディレクトリの中に入りたい」
というケースがあったとします。

```shell
$ mkdir homura
$ cd homura　　（cd と打った後に、Esc + .）
```

こういうときに使うとちょっと幸せになれます。

あとファイルをコピーした後、コピーしたファイルをすぐにviで開いたりしたいときにも結構はかどります。

```shell
$ cp ultimate_homura ultimate_madoka
$ vi ultimate_madoka　　（vi と打った後に、Esc + .）
```

## 以上です

他にもこういうEscキー（ターミナル的にはメタキーと言います）を押した後のショートカットはいくつかあるんですけど僕が実際に使ってて実用性があるのがこれくらいでした。

**ちなみにもっと前の引数を出したい場合は、「Esc + .」を繰り返せば遡れます。**
幸せいっぱいですね。

個人的にターミナル（iTermなど）でのcontrolからのショートカットキーはまじで極めておいたほうがいいのでそのうちまとめて記事にあげたいと思ってます。

今日はそんな感じです。
Rails 5 コードリーディング 第2回 ~ActionView編~

```
    class RenderedTemplate # :nodoc:
      attr_reader :body, :template

      def initialize(body, template)
        @body = body
        @template = template
      end

      def format
        template.format
      end

      EMPTY_SPACER = Struct.new(:body).new
    end
```

formatメソッド内の templateが@templateとインスタンス変数でないのはなぜか？
【Windows】Git Bash でよく使っている alias

よく使うコマンドを エイリアス化しておくと、効率化・typo の回避が可能になります。

## Bash

### コンソールのクリア

`c`

```bash:~/.bashrc
alias c='clear'
```

### ~/.bashrc の再読み込み

`sb`

```bash:~/.bashrc
alias sb='source ~/.bashrc'
```

### pwd の出力をクリップボードにコピー

`pwd2c`

```bash:~/.bashrc
pwd2c() {
  pwd | clip
  echo "*** Copied to Clipboard ***"
  pwd
}

```

### カレントディレクトリ名を表示

`pwdc`

```bash:~/.bashrc
alias pwdc='basename `pwd`'
```

### カレントディレクトリ名をクリップボードにコピー

`pwdc2c`

```bash:~/.bashrc
pwdc2c() {
  basename `pwd` | clip
  echo "*** Copied to Clipboard ***"
  basename `pwd`
}
```

## Yarn

### 対話型で、古くなったパッケージを簡単に最新にする（local）

`yu`

```bash:~/.bashrc
alias yu='yarn upgrade-interactive --latest'
```


### 対話型で、古くなったパッケージを簡単に最新にする（global）

`yug`

```bash:~/.bashrc
alias yug='yarn global upgrade-interactive --latest'

```

## Git

### カレントディレクトリに .gitignore ファイルを作成

`mg`

```bash:~/.bashrc
mg() {
  if [ -f "./.gitignore" ]; then
    echo ".gitignore file already exists"
  fi
  if [ ! -f "./.gitignore" ]; then
    echo .idea > .gitignore
    echo .venv >> .gitignore
    echo node_modules >> .gitignore
    echo "created .gitignore file"
  fi
}
```

echo 部分は自分好みにカスタマイズしてください。

## Node.js

### バージョンを確認

`nv`

```bash:~/.bashrc
alias nv='node --version'
```

## Python

### バージョンを確認 

`pv`

```bash:~/.bashrc
alias pv='python --version'
```


## Windows

### エクスプローラーを起動する

`e`

```bash:~/.bashrc
alias e='explorer'
```

使用例：`e .`
現在のディレクトリをエクスプローラーで開く。

---

随時更新します。
pnorm(z, log.p = TRUE)

Z値が大きすぎるとP値を計算するときに桁落ちする。
これを扱うのにRmpfrというパッケージが必要だ（と思い込んでいた）。
pnormだけでいけた。

```
pnorm(10000, lower.tail=F, log.p=T)
[1] -500007.8 
```

log10 P-valueにする場合、以下の通り

```
log_pvalue   = log(2) + pnorm(10000, lower.tail=F, log.p=T) 
log10_pvalue = log_pvalue/log(10) 
mintissa     = 10^(log10_pvalue %% 1)
exponent     = log10_pvalue %/% 1
sprintf("%2fe%i", mintissa, exponent)
[1] "4.6e-217151"
```

参考
https://stackoverflow.com/questions/26983612/using-rmpfr-to-round-with-precision-in-r
VBAからメールを配信する

VBAからメールを配信するには「MailItem」を使用すると便利です。

事前準備
　「ツール」-「参照設定」を開きます。
　Microsoft Outlook 16.0 Object Library
　を選択します。

コーディング
    Dim objOutlook As Object
    Set objOutlook = New Outlook.Application

　　HTML形式で送付する場合
    objMail.BodyFormat = olFormatHTML

　　テキスト形式で送付する場合
    objMail.BodyFormat = olFormatPlain

　　宛先を指定します。
　　objMail.to = "info@XXX.co.jp"

　　複数宛先に送付する場合は[;]で区切って複数指定できます。
　　objMail.to = "info@XXX.co.jp;info2@XXX.co.jp"
　　のような形になります。

　　「objMail.CC」、「objMail.BCC」も設定できます。

　　件名の指定
　　objMail.Subject = "お知らせ"

　　本文の指定
　　objMail.Body = "（宛先各位）" & vbCrLf & vbCrLf & "お世話になっております。" & vbCrLf & "添付にてご報告いたします。" & vbCrLf & vbCrLf & "以上、宜しくお願い致します。"

　　添付ファイルの追加
　　Call objMail.Attachments.Add("c:\temp\報告書.xlsx")

　　メール送信の表示
　　objMail.Display

　　メール送信
　　objMail.Send

備考
　　この方法でメールを送信する場合、対象のPCにメールプロファイルが作成されていることが前提です。
　　設定されているプロファイルのユーザーからメールが送信されます。
dataTables.js で2回目以降の表示が遅い！！ときに効果があった対処法。

# はじめに
dataTables.js(1.10.15)を使用して

6000件～7000件程度のデータでテーブル表示をしていたときのお話。

IE11(なんで今更というツッコミは置いといて)で表示させてみたところ、

うーん。まずまず。

再度検索処理を実行して表示させてみたところ、

…ん？表示されない。

…えっ。。。嘘でしょ。。。

…全然返ってこない。。。

そう。2回目になると1回目に比べて **極端に** 遅くなっていました。

IE11でDataTablesの処理開始から終了までを計測したみたところ、

1回目：約6秒
2回目：約153秒

という本当に冗談かと思うような（そうあってほしい）結果が出てしまいました。

# 原因について考えてみる

dataTablesを使用すると決めたときに、

ネットでよく出てくるdataTablesの高速化の方法(※)は既に実装済みだったので

```
※データはJSON形式にして、DataTablesに直接渡す
```

dataTablesの使い方が原因ではないと考えました。

次に、1回目と2回目で異様に処理時間が変わってしまうこと。

1回目と2回目で何が違うかというと、

間違いなく

**膨大な量のHTMLが描画されているか、されていないか**

これにつきると考えました。

ということは、その大量のHTMLを一旦削除してしまえばよいのではないか？？？

# 解決方法

元々は、サーバ側からjsonデータを取得した後に

```
$("#result").DataTable({
    destroy: true,
    scrollX: true,
    data: myData,
    ~
});
```

というようにdataTablesの描画処理しか行っていませんでした。

それを、

```
$("#result").empty();

$("#result").DataTable({
    destroy: true,
    scrollX: true,
    data: myData,
    ~
});
```

のように、

一旦dataTablesをバインドする要素内のhtmlを全削除
↓
dataTablesの描画処理

という処理に変更したところ、

1回目：約6秒
2回目：約6.5秒

と劇的(**25倍！！**)に2回目の処理速度が向上しました。

考えてみたら当たり前なんですが、

意外と気づかないんですよね。。。

# おわりに

Chromeでは計測しませんでしたが、体感的には明らかに早くなっていました。

というか、IEは本当に遅い。。。

同じような現象で困っている方、ぜひお試しあれ♪
Ubuntuでマウス操作なしに再起動する方法

# はじめに

ThinkPadにUbuntu20.04に入れたマシンで遊んでいたとき、
スリープモード復帰時にマウス操作（厳密にはトラックポイント）が効かなくなって焦りました。

とりあえず再起動かけたらなんとかなるかもしれない、
しかしその方法がわからない...!!

ということで軽く奮闘したお話です。

ちなみに、『スリープモード復帰時にマウス操作できない』という問題は、

[Thinkpad X1 Carbon 第６世代＋Ubuntu18.04 でトラックポイントが動作しない問題の解決策](https://www.virment.com/thinkpad-x1-carbon-6gen-ubuntu-fix-trackpoint/)

上記を参照することで解決しました。
ありがとうございました。



# この記事でわかること

Ubuntu20.04において、マウス操作なしに再起動を行う操作

# 再起動方法

Ubuntu20.04は言語をEnglishにしてインストールしているので、
日本語でインストールしている場合は適宜読み替えてください。

Windowsキーを押下すると、『Activities』というものが開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549712/a22474bb-3e36-3bcd-262c-88a50e0df5ec.png)

"terminal"と入力し、EnterキーによりTerminalを開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549712/8cee3fe5-f364-5ca6-553a-092808b083a7.png)

`$sudo reboot`とコマンドを入力します。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549712/6f99f3e1-fb5d-493a-f7a5-51e5589b65bf.png)

ハイ終わり！
再起動されます。


# 参考

[Thinkpad X1 Carbon 第６世代＋Ubuntu18.04 でトラックポイントが動作しない問題の解決策](https://www.virment.com/thinkpad-x1-carbon-6gen-ubuntu-fix-trackpoint/)
CodePipelineを「例え話」で説明してみた話

# はじめに
自社内で開催しているAWS勉強会にて**CodePipeline**について説明する機会があり、そのまま説明しても理解が難しいだろうと思って「例え話」で説明してみたのですが、
「なんとなくだけど分かった！」風なリアクションをもらえたので公開したいと思います。

# 前提
勉強会の受講者の知識レベルは以下の通りです。

- そもそも、CI/CDが分からないし聞いたこともない。ピンとこない。

# 例え話
色々と考えた挙句、辿り着いたのが以下の例えです。

「**コンビニのバックヤードに置かれている段ボールに入ったペットボトルを冷蔵ケースに品出しするバイト**」

をテーマにして、

1. 店舗に新しいペットボトルが届く
1. ペットボトルをバックヤードに運ぶ
1. ペットボトルに破損が無いかチェックする
1. 問題なければ冷蔵ケースに並べる
1. お客様が購入する

という一連の流れがあった場合に、

「届いたペットボトルをバックヤードに運べば、あとは、CodePipelineが自動的に破損チェックをやって、冷蔵ケースに並べてくれるんですよ。すごいですよね？便利ですよね？楽ですよね？
これを開発現場に置き換えると、皆さんがGitリポジトリにPushすると、CodePipelineがビルドとテストを実行して、デプロイまで自動的にやってくれる、ということなんですよ」

とやや強引に説明したら、みんなそれとなく理解してくれたみたいでした。

きちんとCodePipeline以外のCodeシリーズの説明もした方がよかったという後悔はありますが、ひとまずは、これで良かったとも思います。

同じような境遇の方の助けになれば幸いです。
typeormで値をnullに変更する実装バリエーション

typeormで一度設定した状態からnullに戻す実装を何パターンか調べたので備忘録として残します

typeorm　^0.2.28
typescript　^3.9.5


### update 実装

updateでundefinedを設定すると、自動的にnullに更新されます

```typescript
@Column({ nullable: true })
fugaId?: number
```

```typescript
import { getManager } from "typeorm"
const repo = getManager().getRepository(Hoge)
await repo.update({ id: 1 }, {fugaId: undefined})

// fugaId: null
```

### save 実装で、fugaId = null にする

```typescript
@Column({ nullable: true, type: "int" })
fugaId?: number | null
```

```typescript
import { getManager } from "typeorm"

let target = await repo.findOne(1)
const repo = getManager().getRepository(Hoge)
target!.salesPicUserId = null
await repo.save(target!)

// fugaId: null
```

### save 実装で、fugaId = undefined なら null にするように変換をかけて保存

```typescript
@Column({
  nullable: true, transformer: {
    to: (value: number) => {
      if (value === undefined) {
        return null
      }
    },
    from: (value: number) => value
  },
  type: "int"
})
fugaId?: number | null
```


```typescript
import { getManager } from "typeorm"

let target = await repo.findOne(1)
const repo = getManager().getRepository(Hoge)
target!.salesPicUserId = null
await repo.save(target!)

// fugaId: null
```
他にもあれば教えてください！
[Mac]Processing + CatalinaのVideoライブラリが動かない件の補足

大概のウェブサイトに載っている方法は、下記のサイトさんに書いてる方法なのですが
https://ws.tetsuakibaba.jp/doku.php?id=processing:catalina%E3%81%A7video%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA

最後に

``` sh
$ open /Applications/Processing.app/Contents/MacOS/Processing
```

を実行しても確認ダイアログがでず。

``` sh
$ sudo open /Applications/Processing.app/Contents/MacOS/Processing
```

sudoさんでやれば動きましたので、メモ。
【入門】GitHubの始め方からGitでエラーに遭遇したときの解決方法などの厳選リンク集

#Windows10,CentOS7等のGitを使えるようにする方法
1. [Windows 10 と Powershell（WSL含む） で git を利用する](
https://qiita.com/kerobot/items/78372640127771f92ee0)
1. [CentOS7で最新バージョンのgitをインストール](https://qiita.com/park-jh/items/fb221b680ae578cead82)



#GitHubを使う前に知っておきたいGitの使い方

[【Git】基本コマンド
](https://qiita.com/konweb/items/621722f67fdd8f86a017)

###Gitのエラー解消方法
1. [Commit failed - exit code 1 receivedの対処法の忘備録](https://qiita.com/09rd193/items/4fdfebf7519c8e35f2ae)このエラーが発生した時には、`.git`というファイルがファイル内に作成されているせいです。なので、隠しファイルを表示して、`.git`のファイルを削除することで、`commit`することが可能になります。 [このサイト](https://www.4900.co.jp/smarticle/7333/)を参考にして、.gitの隠しファイルを表示させて、削除してください。そうすることで、エラーを解消出来ます。ｊ
2. [git revert コマンドを実行すると "error: revert is not possible because you have unmerged files." エラーが表示される - Gitの使い方](
https://www.ipentec.com/document/git-error-revert-is-not-possible-in-git-revert)
1. [git checkout で error: Your local changes to the following files would be overwritten by checkoutと言われる解決方法](
https://qiita.com/pugiemonn/items/6f3adef98d279a5aac98)
1. [git checkout理解してなかった](
https://qiita.com/knknkn1162/items/b3af70918770d85bc313)
1. [Gitでクローン時に「Clone succeeded, but checkout failed」が出る時の対処法](
https://kaizentech.hatenablog.com/entry/2018/04/27/104909)


#GitHubの始め方
1. [GitHubで作成から巻き戻しまで、厳選リンク集](
https://qiita.com/YUMA-NAGAO/items/8f7d49096d5792a798c2)
1. [今日からはじめるGitHub 〜 初心者がGitをインストールして、プルリクできるようになるまでを解説
](https://employment.en-japan.com/engineerhub/entry/2017/01/31/110000)




##PullRequestについて
1. [プルリクエストを使った開発プロセス](https://backlog.com/ja/git-tutorial/pull-request/03/)
2. [フォークからプルリクエストを作成する](
https://docs.github.com/ja/free-pro-team@latest/github/collaborating-with-issues-and-pull-requests/creating-a-pull-request-from-a-fork)
1. [【GitHub】特定のコミットに戻す
](https://hacknote.jp/archives/9781/)
1. [git 特定のコミットだけ消したい時（revert）
](https://qiita.com/kamorits/items/b2624cff212ddf21ad1d)

##GitHub応用編
1. [git submodule とは]
(https://qiita.com/sotarok/items/0d525e568a6088f6f6bb)
git submodule は、外部の git リポジトリを、自分の git リポジトリのサブディレクトリとして登録し、特定の commit を参照する仕組みです。
1. [gitのsubmoduleだけを最新版にしたい場合のコマンドメモ](
https://plasticscafe.hatenadiary.org/entry/20110409/1302339402)
1. [GithubのSSH通信設定](
https://qiita.com/yysskk/items/974c9c55d66a26515651)
1. [GitHubでssh接続する手順 ~ 公開鍵・秘密鍵の生成から ~ ](https://qiita.com/shizuma/items/2b2f873a0034839e47ce)
2. [ローカルのブランチを最新に更新するやり方](https://qiita.com/YUMA-NAGAO/items/782500f4d4274e9c33ad)

##GithHubを応用して、簡単なプログラムをインターネットに向けて公開する方法
1. [GitHubページサイトのカスタムドメインの構成](
https://help.github.com/en/github/working-with-github-pages/configuring-a-custom-domain-for-your-github-pages-site)
1. [Websites for you and your projects.]
(https://pages.github.com/)
1. [GitHub+CircleCI入門](
https://qiita.com/tatane616/items/8624e61473a9957d9a81)

#.gitignoreを上手く使う方法
1. [.gitignoreに記載したのに反映されない件](https://qiita.com/fuwamaki/items/3ed021163e50beab7154)

#PyCharmでのGitやGitHubの設定方法
1. [PyCharmでGitHubにプッシュする方法](https://bit.ly/39ZMjcw)
1. [PyCharmでGitを使用する方法](https://bit.ly/3egMvqY)
テーブル定義変更にて、composer require doctrine/dbal 失敗！

Laravelを使って作業中tableに仕様変更が入った！

とあるカラムをnullable()にするとのこと...

テーブルの再定義すりゃええんやねぇ〜(余裕余裕)...

?あれ。で、できない...

作業フロー
-

①テーブル再定義のmigrationファイル作る

```
 php artisan make:migration ModifyProjects
```
②migrationファイルを書いてゆくーー

```
 //①で作ったmigrationファイル
 
    public function up()
    {
        Schema::table('変えたいカラムがあるテーブル名', function (Blueprint $table) {
        
            $table->integer('変えたいカラム名前')->nullable()->change();
            
        });
    }
```

③ターミナルにて以下のコマンド実施
※これを入れることで『->change()』が使える様になる！

```
composer require doctrine/dbal
```

あ、あれ？エラー出るんだが...　(o_o)/ンゴォ
※これがスムーズに入れば超簡単な作業ゾ

エラー①

```
mmap() failed: [12] Cannot allocate memory

mmap() failed: [12] Cannot allocate memory
PHP Fatal error:  Out of memory (allocated 400556032) (tried to allocate 1359872 bytes) in phar:///usr/local/bin/composer/src/Composer/Util/RemoteFilesystem.php on line 462

Fatal error: Out of memory (allocated 400556032) (tried to allocate 1359872 bytes) in phar:///usr/local/bin/composer/src/Composer/Util/RemoteFilesystem.php on line 462

```

ふむふむ。。。
メモリがどーのこーの言われてんなぁ。
(エラー文コピペでググる！)

swapファイル2GB作れば行けそうやなぁ...
※主は1GBずつチマチマ作ります...

```
//一気に2GB作る
sudo dd if=/dev/zero of=/swapfile bs=1M count=2048

sudo chmod 600 /swapfile

sudo mkswap /swapfile

sudo swapon /swapfile

//正常にできてるか確認
free -h

              total        used        free      shared  buff/cache   available
Mem:           983M        109M         72M         32K        801M        732M
Swap:          2.0G        0M        2.0G 

//できてる!!!!!!
```

はーいもうできるンゴ!(慢心)
※結果から言うとまだできないよ!

```
//慢心で打ちました。
composer require doctrine/dbal
```
エラー②

```
PHP Fatal error:  Allowed memory size of 1610612736 bytes exhausted (tried to allocate 4096 bytes) in phar:///usr/local/bin/composer/src/Composer/DependencyResolver/Solver.php on line 223

Fatal error: Allowed memory size of 1610612736 bytes exhausted (tried to allocate 4096 bytes) in phar:///usr/local/bin/composer/src/Composer/DependencyResolver/Solver.php on line 223

Check https://getcomposer.org/doc/articles/troubleshooting.md#memory-limit-errors for more info on how to handle out of memory errors.[ec2-user@ip-172-31-35-16 paylove]$ php -r "echo ini_get('memory_limit').PHP_EOL;"
```

さっきとちょっと違うエラーだね！
このエラーは親切なことに一番下に『Check』とリンク貼ってくれてる！

```
///リンク踏むと解決方法出てくる！
php -r "echo ini_get('memory_limit').PHP_EOL;"

sudo vi /etc/php.ini
↑このファイルの中身書き換える
```

```
//php.iniの中

; Maximum amount of memory a script may consume (128MB)
; http://php.net/memory-limit
;memory_limit = 128M
memory_limit = -1  
```

 これでできるはず！

```
composer require doctrine/dbal
```

おし！入った！



④migrateしていくヨーーン

```
php artisan migrate
```
---

てな感じでテーブルの定義変更できましたぁ〜(@0@)///
biocondaでインストールしたsamtools/bcftoolsでlibcrypto.so.1.0.0がないと言われる

Anacondaを使っていて
biconda で samtools や bcftools をインストールした場合、正常にインストールされても以下のようなエラーメッセージが出ることがあります。

```
samtools: error while loading shared libraries: libcrypto.so.1.0.0: 
cannot open shared object file: No such file or directory
```

とか

```
bcftools: error while loading shared libraries: libcrypto.so.1.0.0: 
cannot open shared object file: No such file or directory
```

解決策は、シンボリックリンクで `libcrypto.so.1.0.0` を作成するという方法もありますが、
簡単なのはAnacondaで新しい環境を作っておいて、

```
conda create env -n samtools
```

opensslをダウングレードすることです。
参考元：https://github.com/bioconda/bioconda-recipes/issues/12100

```
conda install openssl=1.0
```

しかし、これを実行するとsamtoolsは利用できるようになるのですが、多くのツールのバージョンがダウングレードされてしまうという残念な結果を招きます。スマートな解決策をご存知の方は教えてください。

この記事は以上です。
Rails 5 コードリーディング 第一回 ~ActiveRecord newメソッド編~

 Railsの使い方はなんとかわかるにようなりました。

でも、コーディング力が足りない。

他の言語に行った時に、応用力がつかないのではないか、、、

と思ったので、

Railsのソースコードを読んでみることにした。

こちらを参考にしてみました。
[Railsコードを読んでみた](https://qiita.com/hayashino/items/5c25b40cc4c181b119e5)

Active record 周りを読んでみることに
まずは、shift command f で
def new　を
全文検索


```
# frozen_string_literal: true

module ActiveRecord
  # = Active Record \Relation
  class Relation
    MULTI_VALUE_METHODS  = [:includes, :eager_load, :preload, :select, :group,
                            :order, :joins, :left_outer_joins, :references,
                            :extending, :unscope, :optimizer_hints, :annotate]

    SINGLE_VALUE_METHODS = [:limit, :offset, :lock, :readonly, :reordering, :strict_loading,
                            :reverse_order, :distinct, :create_with, :skip_query_cache]

    CLAUSE_METHODS = [:where, :having, :from]
    INVALID_METHODS_FOR_DELETE_ALL = [:distinct, :group, :having]

    VALUE_METHODS = MULTI_VALUE_METHODS + SINGLE_VALUE_METHODS + CLAUSE_METHODS

    include Enumerable
    include FinderMethods, Calculations, SpawnMethods, QueryMethods, Batches, Explain, Delegation

    attr_reader :table, :klass, :loaded, :predicate_builder
    attr_accessor :skip_preloading_value
    alias :model :klass
    alias :loaded? :loaded
    alias :locked? :lock_value

(と中略)

    # Initializes new record from relation while maintaining the current
    # scope.
    #
    # Expects arguments in the same format as {ActiveRecord::Base.new}[rdoc-ref:Core.new].
    #
    #   users = User.where(name: 'DHH')
    #   user = users.new # => #<User id: nil, name: "DHH", created_at: nil, updated_at: nil>
    #
    # You can also pass a block to new with the new record as argument:
    #
    #   user = users.new { |user| user.name = 'Oscar' }
    #   user.name # => Oscar
    def new(attributes = nil, &block)
      block = _deprecated_scope_block("new", &block)
      scoping { klass.new(attributes, &block) }
    end

    alias build new

(途中略)

def _deprecated_spawn(name)
        spawn.tap { |scope| scope._deprecated_scope_source = name }
      end

      def _deprecated_scope_block(name, &block)
        -> record do
          klass.current_scope = _deprecated_spawn(name)
          yield record if block_given?
        end
      end

```

```
    def new(attributes = nil, &block)
      block = _deprecated_scope_block("new", &block)
      scoping { klass.new(attributes, &block) }
    end

    alias build new
```
まずは漠然と理解する

1.
新しいものレコードを作るから attribute(属性)はnil
2.
ブロック引数を渡しているが、ブロックはどこにあるのか？
3.
_deprecated_scope_block　メソッドが下に定義されているが、意味がわからない
4.
klassとは何か？

疑問は尽きない
もうちょっとさぐってみる
NVIDIA DriverのインストールがGUIだけで簡単にできてしまった話

ラボでデスクトップを与えられたのでGPUが使えるようにNVIDIA Driverをインストールをしようとしたところ想像以上に簡単にできてしまったお話です。

環境

- Ubuntu20.04
- RTX 2080 Ti

また、セキュアブートはデフォルトで無効になっていました。
セキュアブートが有効になっているかどうかは次のようにして確かめることができます

```bash
$ dmesg | grep Secure
[    0.000000] secureboot: Secure boot disabled
[    0.007449] secureboot: Secure boot disabled
```

このようにdisabledとなっていれば無効になっています。

# NVIDIA Driverを入れる
調べるとかなり沼にハマったというような記事がたくさんでてきます。
また沼にはハマらないまでもnouveauを無効にする必要があったり、適切なドライバーを選んでダウンロードしたりと手間がかかりそうな雰囲気があります。

ubuntu20.04の仕様なのかは分かっていませんがGUIだけで簡単にやる方法がありました。

デフォルトで入っている「ソフトウェアとアップデート」のアプリを起動します。
起動したらアプリ上部のに「追加のドライバー」というタブがあるのでこれを開きます。
![Screenshot from 2020-10-22 14-55-36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/359175/9348511f-0e89-00b2-e873-de1f8a3fc6d7.png)
これがデフォルトでは一番下のNouveauディスプレイドライバーに設定されているので、検証済みとなっている一番上のドライバーに変更し再起動します。

これで終わりです。簡単すぎて拍子抜けしました。
ちゃんと入っていることを確認するために

```bash
$ nvidia-smi
```

とコマンドし、ドライバーの情報などが表示されることを確認します。

# 最後に
念のためですが、今回使用したデスクトップは新品でありまたOSが入っていない状態で手渡されているため、Ubuntuのインストール以外には特に事前にやっていた操作等はありません。
また何かあれば追記なり新しい記事の投稿なりをしたいと思います。
expressインストール[node.js - ejs]

#Expressのインストール

##(1)npmの初期化
npm init
=>package.jsonが生成される

##(2)Expressのインストール
npm install express --save

--saveオプションを使うとインストール対象のバージョン情報がpackage.jsonに記録されます。

#ファイルの命名と配置ルールについて

Expressを使う場合は、メインとなるファイルは”app.js"とするのが一般的です。

また、テンプレートファイルはアプリケーションフォルダ内に"views"というフォルダを用意して、全てその中に配置するルールになります。
2020 年後半以降の HIP, HIP clang compiler について

追記: 2021/11 月に動きがありました. apt hip-clang で入ったりと便利になっています.

amdgpu 21.40 で RDNA2 で HIP(CUDA っぽいの)が動くようになりました(experimental)
https://qiita.com/syoyo/items/5e6f4cc056a94060329e

を参照ください.

`=====`

HIP clang は, 今後の(?) AMD GPU 向けコンパイラです.

何故か apt で prebuilt package がありません(ROCM-3.8 時点) :cry:

https://github.com/ROCm-Developer-Tools/HIP/blob/master/INSTALL.md

ビルド手順をみてわかるように, HIP 固有のビルドオプションは無くて(AMDGPU backend を有効にするだけ. これは clang/llvm ビルドデフォルトでは on), HIP 対応のコンパイラ機能はすでに clang/llvm のソースコードにありますので, 実のところ既存の clang++ でも使えます(version 10 くらいからを使うとよさそう).

`clang++ -x hip` のようにして使います.

ただ, 実際は nvcc のようにいろいろパスやリンクの設定などをする必要があるため, 通常は hipcc フロントエンド(これは apt package `rocm-dev` あたりで入る)を使ってコンパイルします.

hipcc フロントエンドは, lld, compiler-rt や clang-offload-bundler(clang tools)などを利用しているため, それらのパッケージもインストールしておく必要があります
(apt の場合, clang-tools など)

ちなみに, CUDA も同様にコンパイラの部分は clang へ移行していて, CUDA 対応のコードは clang/llvm のソースツリーに入っています(`.h` や `.lib` などは CUDA SDK にあるのを使う必要がある. また nvcc 自体はクローズドソースっぽい)

## HIP

HIP がなんの略かは不明です. 検索性が悪くてつらいです. :cry:

https://github.com/ROCm-Developer-Tools/HIP

最近(2020/10)ですと, runtime 環境は ROCclr https://github.com/ROCm-Developer-Tools/ROCclr に移行しています. 

hcc は deprecated になって ROCm パッケージから外れたようで, HIP のビルド手順そのままではビルドできない(runtime を ROCclr の VDI にする必要がある) 

VDI(Virtual Device Interface)は, fat binary でそれぞれのアーキテクチャのバイナリを一つにまとめて, 実行時に対応するデバイスのバイナリを使うっぽいようです
(いままで(hcc runtime)は gfx アーキテクチャを指定してコンパイルなど必要だった, はず)

ROCclr ソースコードを見る限りでは Navi, RDNA2, CDNA(Arcturus) 対応があるようですので, ROCm-3.10 あたりで Navi/RDNA2 正式対応があるかもしれません.
(ROCM-3.8 の prebuilt だと, NAVI(RX5700)だと VDI が NAVI 対応していないようで unsupported エラーとなり HIP 環境は動かない)

ついでに ROCclr は Windows の対応もしているようです(実際にビルドできるかは不明だが, コードはいくらかある).

そのうち ROCm 環境も Windows で動くかもしれません.

### comgr

最近 amdgpu-pro ドライバなどでも見かけるようになりました.

https://github.com/RadeonOpenCompute/ROCm-CompilerSupport

Code object manager の略です. fat binary 管理用でしょうか? ROCclr が依存しています.
rocm-dev で prebuilt が入りますが, Navi 対応など最新が使いたければソースからビルドでしょうか.


### ビルド手順メモ

実際にビルドは確認していません.

- comgr のビルド
  - device lib のビルド
  - llvm/clang コンパイラ(HIP clang としても使えるはず)のビルドも含む
- ROCclr のビルド
- HIP のビルド

でしょうか. 面倒ですね. :cry:
Java--PowerPointの図形に影をつける方法

PowerPointで図形に影の効果をつけると、図形の立体感を向上させ、もっと現実に近づくリアルな効果を実感し、ドキュメントの美感を一層増すことができます。
従って、この記事ではFree Spire.Presentation for Javaを使用してPowerPointの図形に影をつける方法を紹介します。 ちなみに、プリセットされた影の効果以外に、内側の影（InnerShadowEffect）や外側の影（OuterShadowEffect）や輪郭のぼかし（SoftEdgeEffect）などがあります。

**JARパッケージのインポート**
**方法1：** [Free Spire.Presentation for Java](https://www.e-iceblue.com/Download/presentation-for-java-free.html)をダウンロードして解凍したら、libフォルダーのSpire.Presentation.jarパッケージを依存関係としてJavaアプリケーションにインポートします。

**方法2：** Mavenリポジトリから直接にJARパッケージをインストールしたら、pom.xmlファイルを次のように構成します。

```xml
<repositories>
        <repository>
            <id>com.e-iceblue</id>
            <name>e-iceblue</name>
            <url>http://repo.e-iceblue.com/nexus/content/groups/public/</url>
        </repository>
</repositories>
<dependencies>
    <dependency>
        <groupId>e-iceblue</groupId>
        <artifactId>spire.presentation.free</artifactId>
        <version>3.9.0</version>
    </dependency>
</dependencies>
```

**Javaコード例**

```java
import com.spire.presentation.*;
import com.spire.presentation.drawing.FillFormatType;
import com.spire.presentation.drawing.PictureFillType;
import com.spire.presentation.drawing.PresetShadow;

import java.awt.geom.Rectangle2D;
import java.awt.Color;

public class ShapeShadowEffect {

    public static void main(String[] args) throws Exception {

        //Presentationオブジェクトを作成します。
        Presentation ppt = new Presentation();

        //最初目のスライドを取得します。
        ISlide slide = ppt.getSlides().get(0);

        //図形を追加します。
        Rectangle2D rect = new Rectangle2D.Float(120, 80, 180, 150);
        IAutoShape shape = slide.getShapes().appendShape(ShapeType.RECTANGLE,rect);

        //画像を図形に塗りつぶします。
        shape.getFill().setFillType(FillFormatType.PICTURE);
        shape.getFill().getPictureFill().getPicture().setUrl("C:\\Users\\Administrator\\Desktop\\cow.png");
        shape.getFill().getPictureFill().setFillType(PictureFillType.STRETCH);
        shape.getLine().setFillType(FillFormatType.NONE);

        //影の効果を設定します。
        PresetShadow presetShadow = new PresetShadow();
        presetShadow.setPreset(PresetShadowValue.BACK_RIGHT_PERSPECTIVE);
        presetShadow.getColorFormat().setColor(Color.lightGray);

        //図形に影をつけます。
        shape.getEffectDag().setPresetShadowEffect(presetShadow);

        //ドキュメントを保存します。
        ppt.saveToFile("ShapeShadow.pptx", FileFormat.PPTX_2013);
    }
}
```

**実行結果：**
![shadow.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/67449b09-ceb6-5763-7db4-56deb0f27a1c.png)
[Rails]rails-i18nを用いた日本語化

# はじめに
rails-i18nというgemを用いることでエラーメッセージなどを日本語化することができます。

# 目次
1. 言語を日本語に設定する
2. rails-i18nのインストール
3. 日本語に設定するためのファイルを作成

# 1. 言語を日本語に設定する
application.rbを編集します。<br>
**:ja**とすることで日本語に設定することができます。

```ruby:config/application.rb

module CosmeticReview
  class Application < Rails::Application
    config.load_defaults 6.0
    #以下の記述を追記します
    config.i18n.default_locale = :ja
  end
end
```

# 2. rails-i18nのインストール
gemfileに以下を追記します。
その後、コマンドでbundle installを実行します。

```ruby:gemfile
gem 'rails-i18n'
```

# 3. 日本語に設定するためのファイルを作成
localファイルを作成し、その中に日本語へ翻訳するためのYAMLファイルを作成します。
今回はモデルのエラーメッセージを日本語化しました。

```ruby:locales/ja.yml
ja:
 activerecord:
   attributes:
     user:
       nickname: ニックネーム
       gender: 性別
       introduce: 自己紹介
       birthday: 生年月日 
     post:
       name: 商品名
       description: 商品の説明
       image: 画像
       shop_name: 購入店
       evaluation: 商品の評価
       price: 購入価格
       category_id: カテゴリー
   time:
     formats:
       default: "%Y/%m/%d %H:%M:%S"
```

階層が少しでもずれているとエラーが出るので気をつけましょう。

# 参考リンク
https://github.com/svenfuchs/rails-i18n
Jupyter notebook上でWebカメラから取得した映像をリアルタイム表示する (Python3)

[参考 (Python2)](https://medium.com/@kostal91/displaying-real-time-webcam-stream-in-ipython-at-relatively-high-framerate-8e67428ac522)

1. OpenCVでWebカメラから映像を取得
1. 色空間をBGRからRGBに変換
1. PILでjpegバイナリを得る
1. IPython.display.displayで画像表示

pngにするとかなり遅いらしい．(参考サイト参照)

```python
from io import BytesIO
import os

import IPython
from PIL import Image
import cv2

# 画像をjpegバイナリに変換してIpythonで表示する
def show(a, fmt='jpeg'):
    f = BytesIO()
    Image.fromarray(a).save(f, fmt) # (3)
    IPython.display.display(IPython.display.Image(data=f.getvalue())) # (4)

cap = cv2.VideoCapture(0)
assert cap.isOpened(), 'Could not open video device'

try:
    while(True):
        ret, frame = cap.read() # (1)

        if ret:
            frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) # (2)
            show(frame) # (3-4)
            IPython.display.clear_output(wait=True)

except KeyboardInterrupt:
    cap.release()
    print('Stream stopped')
```
Numpyを使用してFFT＆トレンド除去

# はじめに
Pythonで，Numpyを使って時系列データをFFT(Fast Fourier Transform: 高速フーリエ変換)する方法と，時系列データのトレンドを除去する方法について紹介しようと思います．FFTとは，DFT(Discrete Fourier Transform:離散フーリエ変換)を高速処理する計算方法です．この記事では理論には触れず，FFTを実行する最低限のコードを示します．参考にした文献は「スペクトル解析　著:日野幹雄　(朝倉書店)」．フーリエ解析の基礎からFFTの理論まで，この本1冊で十分です．

#目次
1.時系列データ
2.FFT実行
3.トレンド除去
4.フーリエ成分を周波数平滑化(スムージング)
5.Appendix

#本題
## 1. 時系列データ
サンプリング周波数10Hzの30分間データ．オレンジの線は移動平均です．トレンドがあるのが分かりますね．
![元時系列.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/649674/292fc03d-cd12-d9d0-9a92-f21afd798e12.png)
図１．元の時系列データ

このデータをFFTしていきます．

##2. FFT実行
```python
N =len(X)      #データ長
fs=10          #サンプリング周波数
dt =1/fs       # サンプリング間隔
t = np.arange(0.0, N*dt, dt) #時間軸
freq = np.linspace(0, fs,N) #周波数軸
fn=1/dt/2     #ナイキスト周波数
```

FFTはデータ長が2のべき乗である場合に最も計算速度が速くなるような計算手法ですが，そうでない場合でも計算は可能です(処理時間が多少長くなりますが)．ただし，データ長が素数の場合には，2のべき乗の時に比べて相対的にかなり処理時間がかかるので，2のべき乗になるよう0パディングした方が良さそうです．Appendixにそれを確かめるコードを載せたので是非確かめてみてください．

```python
F=np.fft.fft(X)/(N/2)
F[(freq>fn)]=0 #ナイキスト周波数以降をカット

plt.plot(freq,np.abs(F))#
plt.xlabel("[Hz]")
plt.ylabel("Amp")
plt.xlim(-0.01,0.5)
plt.grid()
plt.show()
```
np.fft.fftでは複素フーリエ成分で与えられるので，その絶対値をとったものをプロットしたのが下図です．トレンド成分が0Hz付近にありますね．
次節ではトレンド除去してみましょう．
![元時系列をFFT.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/649674/10cfb5d7-225a-0fcb-b587-15cd835a54d6.png)
図２．元の時系列データに対してFFT実行


##3. トレンド除去
図１の移動平均(オレンジ線)を見ると，時系列データの軸がx軸と乖離しており，データにトレンドがあるのが分かります．次の操作で，0.03Hz以下を0にすることでトレンドを除去してみましょう．

```python
F=np.fft.fft(X)/(N/2)
F[(freq>fn)]=0
F[(freq<=0.03)]=0 #0.03HZ以下を除去
X_1=np.real(np.fft.ifft(F))*N

plt.xlabel("Time [s]")
plt.ylabel("Signal")
plt.xlim(-50,1850)
plt.grid()
plt.show()
```
![周波数カット時系列.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/649674/81607c19-d8a0-741c-0607-b738e22389e6.png)
図３．トレンド除去後の時系列データ

x軸を起点に周期関数となっていることが分かります．

##4. フーリエ成分を周波数平滑化(スムージング)
図３のデータをFFTすると図４になります．
![周波数カット時系列をFFT.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/649674/4b9efda7-b282-5598-308e-0a3b8206bd93.png)
図４．トレンド除去後の時系列データに対してFFT

ガタガタしてるので，平滑化ウィンドーを作用させてスムージングをしてみます．

```python
window=np.ones(5)/5 #平滑化ウィンドー
F3=np.convolve(F2,window,mode='same') #畳み込み
F3=np.convolve(F3,window,mode='same') #畳み込み
F3=np.convolve(F3,window,mode='same') #畳み込み

plt.plot(freq,np.abs(F3))
plt.xlabel("[Hz]")
plt.ylabel("Amp")
plt.xlim(-0.01,0.5)
plt.grid()
plt.show()
```
![周波数平滑化.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/649674/e5c9259f-0027-f647-a77c-5bff2aa82fda.png)
図５．平滑化した


##5. Appendix
データ長さを3種類用意して計算時間を比較してみます．
①2^19(2のべき乗)　②2^(19)-1 (素数)　③2^(19)-2 (素数でも2のいべき乗でもない)

```python
import time

if __name__ == '__main__':
    start = time.time()
    x2 = np.random.uniform(size=2**19-2)#2**19 , 2**19-1
    print(np.fft.fft(x2))
    elapsed_time = time.time() - start
    print ("elapsed_time:{0}".format(elapsed_time) + "[sec]")
```
計算結果
①0.04197[sec]
②0.1679[sec]
③0.05796[sec]

データ長が素数の場合には0パディングを行って2のべき乗にした方が良さそうですね．
いらなくなったPCにCentOS-7を簡単に入れてみた

初めに

必要なもの
PC,USB(8GB程度)

インストールメディアの入手
https://buildlogs.centos.org/rolling/7/isos/x86_64/CentOS-7-x86_64-Everything-1511.iso

ISOファイルからUSBインストールメディアを作成
Rufusを使用する
https://github.com/pbatard/rufus/releases/download/v3.12/rufus-3.12.exe

![スクリーンショット 2020-10-22 115550.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/813031/8513847c-be4b-2d9f-3359-cd54707177be.png)

ブートの種類の選択からisoファイルを指定し、
パーティション構成、ターゲットシステム、ファイルシステムを指定しスタートボタンを押す

![スクリーンショット 2020-10-22 120049.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/813031/7cb257a8-faa4-ecc2-7630-d4e96377e3aa.png)

スタートボタンを押した後、このような表示が出された場合ISOイメージで書き込むを選ぶ

![スクリーンショット 2020-10-22 120313.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/813031/17d44f1f-9b2e-0298-c2c9-ca63e08601a2.png)

このような警告文が出るので使用するUSBメモリ内にあるデータがもし残っている場合はPCなどに移してから行う様に

書き込みが終了したら通知音が鳴りますのでこれでUSBインストールメディア作成の完了です。

PCのUSBブート
いらなくなったなPCにUSBインストールメディアを差し込んだ後にPCを起動したのちにF12(PCの機種によって違う)を押しBoot Menuに入る



USBを選択すると、CentOS7のインストール画面に入る

Install CentOS 7　を選択する

言語を日本に選択

インストールの概要に入るので行うことは
・ソフトウエアの選択（GUIを入れる）
・インストール先の選択
![screenshot-0002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/813031/d20d015c-9425-cbd5-5ea9-0cac37301c55.png)


ソフトウェアの選択でサーバー（GUI使用）を選択

![screenshot-0003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/813031/26c617ed-0a94-c739-10b8-2628c22883ac.png)


インストール先の選択
PCのディスクを選択する
パーティション構成は自動構成（手動でも良い）

![screenshot-0004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/813031/78612ef1-1d2a-e850-c457-e8b3824ba43b.png)


[完了]を押すと領域がないと怒られるので[領域の確保]を選択する

[すべて削除]→[領域の再利用]を選択

![screenshot-0010.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/813031/230784c4-6605-0ee8-728e-6e983ea94d11.png)
インストールの概要に戻ると黄色い表示がなくなり最低限の設定は完了したので[インストールの開始]を選択

インストール中にROOTパスワードとユーザーの設定をする


![screenshot-0011.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/813031/7888db65-7a36-c9e4-cf53-f0ef86a16901.png)
ROOTパスワードを設定し完了

![screenshot-0013.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/813031/7a8594dc-52be-bb7a-bdb2-b55f5f4ececd.png)
ユーザーの作成でフルネーム、ユーザー名、パスワードを設定し完了


![screenshot-0014.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/813031/1dfa6e6c-43d4-44b7-19c7-dfad7d34ce0d.png)

ユーザーの設定が完了するとこのような画面になる。後はインストールを待つだけ


![screenshot-0017 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/813031/dd3d6128-c414-1821-f246-e14452c647f1.png)


インストールが完了したら再起動

再起動したらライセンスを要求されるので同意して設定の完了
![screenshot-0000.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/813031/92142470-e547-f670-7f06-3f2b6ac56ce8.png)

![screenshot-0001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/813031/70917005-e41d-d2fe-17c7-eb9541669997.png)

完了
![Screenshot from 2020-10-22 13-57-57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/813031/dd366954-70b2-a45f-b46b-496452a3c76d.png)
TeX論文にアルゴリズム（疑似コード）を書く方法

#はじめに
初投稿です。TeXでのアルゴリズムの書き方をまとめました。
最近論文を書くときにアルゴリズム（疑似コード）を載せたくなったんですが、導入から具体的な記述方法までまとまった記事がなかったのでまとめます。

#目次
1. 導入方法
2. いろいろな記述法

#1. 導入方法
以下の環境で動作を確認しています。

* オンラインLaTeXエディタ[Overleaf](https://ja.overleaf.com/)
* [IEEEテンプレート](https://www.ieee.org/conferences/publishing/templates.html)

###0. 環境構築（ローカルでやる場合）
[TeXインストーラ3](https://www.ms.u-tokyo.ac.jp/~abenori/soft/abtexinst.html)のようなローカルTeX環境では標準でパッケージが付属していないので下記サイトからインストールする。
http://tug.ctan.org/tex-archive/macros/latex/contrib/

"algorithms.zip"をダウンロードしてきて解凍し、2つのスタイルファイル（"algorithm.sty"、"algorithmic.sty"）をTeXソースファイルと同じディレクトリに格納しておく。Overleafで書く場合は標準で対応しているのでTeX文章の頭に`\usepackage{algorithmic}, \usepackage{algorithm}`を入れるだけで良い。

###1. TeXソースファイル内の書き方
.texファイル内に以下のように記述する。ちなみに今回投稿したIEEE系ではアルゴリズムはfloat環境ではなくfigure環境で用いるようにとの指示がある[^1] ので`\begin{figure}[!t]~\end{figure}`がはいっていますが特にfigure環境にする必要がなければ抜いてOKです。

```TeX
\usepackage{algorithmic}
\usepackage{algorithm}

\begin{figure}[!t]
\begin{algorithm}[H]
	\caption{Calculate $y = x^n$}
	\label{alg1}
	\begin{algorithmic}[1]    #行番号をつけないときは[1]は不要
	\REQUIRE $n \geq 0 \vee x \neq 0$
    \ENSURE $y = x^n$
    \STATE $y \leftarrow 1$
    \IF{$n < 0$}
    \STATE $X \leftarrow 1 / x$
    \STATE $N \leftarrow -n$
    \ELSE
    \STATE $X \leftarrow x$
    \STATE $N \leftarrow n$
    \ENDIF
    \WHILE{$N \neq 0$}
    \IF{$N$ is even}
    \STATE $X \leftarrow X \times X$
    \STATE $N \leftarrow N / 2$
    \ELSE[$N$ is odd]
    \STATE $y \leftarrow y \times X$
    \STATE $N \leftarrow N - 1$
    \ENDIF
    \ENDWHILE
	\end{algorithmic}
\end{algorithm}
\end{figure}
```
これを実行すると以下のように表示される。
![alg1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/802861/c463630c-1936-d57c-0c82-d46ba8b9f10f.png)



#2. いろいろな記述法
アルゴリズムの書き方をまとめていきます。
###1. 単純代入
```TeX
\STATE <text>
```
###2. If文
```TeX
\IF{<condition1>}
\STATE some processing
\ELSIF{<condition2>}
\STATE some processing
\ELSE
\STATE some processing
\ENDIF
```
###3. forループ
```TeX
\FOR{<condition>}
\STATE some processing
\ENDFOR
```
###4. whileループ
```TeX
\WHILE{<condition>}
\STATE some processing
\ENDWHILE
```
###5. repeat-untilループ
```TeX
\REPEAT
\STATE some processing
\UNTIL{<condition>}
```
###6. 論理演算
```TeX
<expression> \AND <expression> 
<expression> \OR <expression>
<expression> \XOR <expression>
\NOT <expression>
```
###7. 前提条件
```TeX
\REQUIRE <condition>
```
###8. 事後条件
```TeX
\ENSURE <condition>
```
###9. return文
```TeX
\RETURN <text>
```
###10. 真偽
```TeX
\RETURN \TRUE
\RETURN \FALSE
```
###11. 文字のプリント
```TeX
\PRINT <text>
```
###12. コメント
```TeX
\COMMENT{<comment>}
```





#参考文献
TeXでのアルゴリズム（擬似コードの記述） algorithms パッケージ
http://zellij.hatenablog.com/entry/20110421/p1
algorithmsパッケージ付属リファレンス
http://tug.ctan.org/tex-archive/macros/latex/contrib/algorithms/

[^1]: [IEEEtran_HOWTO.pdf](https://ftp.kddilabs.jp/CTAN/macros/latex/contrib/IEEEtran/IEEEtran_HOWTO.pdf)の"X. FLOATING STRUCTURES/B. Algorithms"
iOS14のSwiftUIでSKStoreReviewController実装メモ



#環境
- Xcode: 12.0
- Swift5

#実装例

```Swift
     import StoreKit

     if let windowScene = UIApplication.shared.windows.first?.windowScene {
          SKStoreReviewController.requestReview(in: windowScene)
     }
```
SwiftUIでもこれだけでOK
この書き方はiOS14.0からですので注意してください。
https://developer.apple.com/documentation/storekit/skstorereviewcontroller/3566727-requestreview
楽しい アジャイルのススメ① 〜 アジャイル開発を理解して市場価値を上げよう！~

# はじめに
今回はプロダクト開発の一手法であるアジャイル開発について紹介します！
プロジェクトを回せる市場価値の高いエンジニアになりたい方、必見です！

ぜひ動画でも確認してみてください！

[【YouTube動画】 アジャイル開発を理解することが市場価値を上げる アジャイルをちゃんと理解しよう！① 前編](https://youtu.be/M5smdjUNr_w)
[![アジャイル開発を理解することが市場価値を上げる](https://img.youtube.com/vi/M5smdjUNr_w/0.jpg)](https://www.youtube.com/watch?v=M5smdjUNr_w)

[【YouTube動画】 アジャイル開発を理解することが市場価値を上げる アジャイルをちゃんと理解しよう！① 後編](https://youtu.be/7w2KLW7d1vQ)
[![アジャイル開発を理解することが市場価値を上げる](https://img.youtube.com/vi/7w2KLW7d1vQ/0.jpg)](https://www.youtube.com/watch?v=7w2KLW7d1vQ)


# アジャイル開発の目的
アジャイル開発の目的は、『**価値あるプロダクト**を迅速に作り続ける』ことです。

では、そのプロダクトが価値あるものになるためには、どうすれば良いでしょうか？

もっと言えば、顧客だけでなく、サービス提供側も価値を感じるプロダクトにするにはどうすれば良いでしょうか？

いろいろ方法はあると思いますが、開発に関わる人みんながモチベーションを高く維持できれば、より良いものが作れそうだと思いませんか？

アジャイル開発では開発プロセスだけでなく、そのようなマインドも重視しています。

アジャイル開発の行動指針 (マインド) として、アジャイルソフトウェア開発宣言というものがあります。

読んでいただけると、 『人』 主体の開発手法であることがよりわかると思います。

![スクリーンショット 2020-10-21 19.42.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/751408/88535fd4-ce05-2ed6-ecb4-70f8d88fb6e8.png)


# アジャイルなチーム
アジャイル開発では、職能横断型のメンバーが重宝されます！

チーム運営をするにあたって、『同じ職場で働く』、『ビジネスサイドも開発サイドも一緒につくる』、『開発者に権限を与えて速く開発できるようにする』ことが大切です。


# プロジェクトを始める前に
プロジェクト前に、全員が同じ方向を向くためにお互いに質問をします (インセプションデッキ)。
例えば、以下のような質問をして、チーム内の合意事項をまとめます。

- **なぜ**このプロジェクトを始めるのか
- 開発したプロダクトに**どんな売り**があるのか
- プロジェクト運営にあたって**どんなリスク**があるのか

チーム全員が意識する必要があるため、『覚えやすいフレーズ』にしておくと良いです。
また、都度見直し、修正していくことも大切です。

# プロジェクト運営
アジャイル開発では、『**価値あるプロダクト**を迅速に作り続ける』ために、以下のような短いスパンを繰り返しながら開発を続けます。

```
計画 -> 実行 -> 振り返り -> 計画 -> ...
```

## 計画
計画の段階では、バックログリファイメントとバーンダウンチャートを使用します。

バックログリファイメントは、やりたいことリスト (バッグログ) の優先順位を精査するために使用します。
実装したい機能ごとの内容とタスクレベルの内容を分けて作るとやりやすいです。

バーンダウンチャートは、チーム内のタスク処理速度を測るために使用します。
やることに対してポイント (見積もり) を付け、どのぐらいでそのポイントを消化できたかを測定します。
ポイント付けすることで認識のズレを修正したり、今後の開発計画を決めるのに役立ちます。

## 実行
インセプションデッキやバックログリファイメント、バーンダウンチャートを見える化しておきましょう！
これにより、誰がどのぐらい働いていて、誰が困っているかが分かります。

みんなが助け合えるように、毎朝やることを報告するのも大切です。

## 振り返り
振り返りでは、スプリントで作ったものをチーム内で共有します (レビュー)。
ここでは、褒め合うことが重要です！

アジャイル開発では、KPT (Keep Problem Try)も共有します。
Keepでは、今後も続けたいこと
Problemでは、問題と思っていること
Tryでは、次に向けて改善したいことを共有します。
ここでも、褒めることが重要です！！




# まとめ
アジャイル開発は、モチベーションを高く維持することで、良いものを作っていきます！
ぜひ、みなさんの開発にも取り入れていただければと思います！！

[twitter](https://twitter.com/yassun_youtuber)や[youtube](https://www.youtube.com/channel/UCajrdoGzHzDogrNrLYYmGsg/featured?view_as=public)でのコメントもお待ちしています！
Webマーケティングの学習で参考になるサイトやブログ

Webマーケティング学習する上で参考になるサイトやブログをまとめました。
初心者〜上級者まで、目的に合わせて参考にできるサイトです。

【ferret】
マーケティング会社「株式会社ベーシック」が運営するメディア。初心者だけでなく、マーケティング中級者から上級者にもおすすめ。
https://ferret-plus.com

【バズ部】
株式会社ルーシーが運営するWebマーケティングメディア。コンテンツの質が高く、初心者〜上級者まで幅広くおすすめ
https://bazubu.com

【ガオのノート】
Webマーケターのガオさんが運営する個人ブログ。わかりやすくWebマーケティングの情報がまとまっており、Webマーケティング初心者に特におすすめ
https://gaosnote.com

【転職フリー】
現役Webマーケティング会社経営者のRuiさんが運営する個人ブログ。初心者向きのWebマーケティング学習ノウハウが詰まっている。
https://tenshoku-free.com

【NOJI BLOG】
個人ブログで最高月90万円/月17万PVのNOJIさんが運営する個人ブログ。Webマーケティングの中でも主に個人ブログ運営についてまとまっているサイト。
https://nojiblog.com
Webアクセシビリティでウェブページの id 属性値が一意的 (ユニーク) な事をチェックするには


# 方法1. validator.w3.org でチェックする

下記W3CサイトでもID重複チェックしてくれました。
`Error: Duplicate ID`の指摘がなければOK。

HTMLのバリデートチェックと同時にチェックできます。

https://validator.w3.org/nu/

#### ID重複ある場合

下記のような指摘が表示されます。

```
Error: Duplicate ID test.

From line 816, column 31; to line 816, column 155

oup mt-2"><input type="text" name="search_keyword" class="form-control" value="" placeholder="キーワードでサイト内検索" title="サイト内検索" id="test" />↩<div 
```

# 方法2.下記ブックマークレットでチェックする

```ブックマークレット
javascript:(function(){  var idArr=[];  var duplicateIdArr = [];  [].forEach.call(document.querySelectorAll('[id]'), function(elm){    var id = elm.getAttribute('id');    if(idArr.indexOf(id) !== -1) {      duplicateIdArr.push(id);    } else {      idArr.push(id);    }  });  if(duplicateIdArr.length > 0) {    console.log('IDの重複があります:', duplicateIdArr);  } else {    console.log('IDの重複はありません。');  }})();
```

実行すると、コンソールに重複あり・重複なしが表示されます。

下記ページのJavaScriptを使わせてもらいました。助かりました。

DOM上のIDの重複を検出する - Qiita
https://qiita.com/butchi_y/items/8e1312a47826e5ca95a2

# 該当のWebアクセシビリティ達成方法

（達成基準 4.1.1）
H93: ウェブページの id 属性値が一意的 (ユニーク) であるようにする | WCAG 2.0 達成方法集
https://waic.jp/docs/WCAG-TECHS/H93.html
ejsの立ち上げかた[node.js]


#ejsのインストール
=>npmを使用する。

###(1)npm init 
初期化をして、package.jsonを作成する

※この時にできたpackage.jsonのnameと同名のパッケージはインストール時に拒否されるので注意

###(2)npm install ejs
ejsのインストール 
カレントディレクトリにnode_modulesフォルダが生成され、EJSの実態がインストールされる