OmniAICreator/Qiita-1.07M huggingface dataset:
CloudComposer(Airflow2.0) で GCS から BigQuery に定期的にロードするときに気をつけること

# 背景

GCSからBigQueryに定期的にデータをロードしたい。CloudComposerでロードするためのOperatorは以下の2つがある。

#### 1. [GCSToBigQueryOperator](https://airflow.apache.org/docs/apache-airflow-providers-google/stable/_modules/airflow/providers/google/cloud/transfers/gcs_to_bigquery.html#GCSToBigQueryOperator)

worker上でGCSからBigQueryへのLoad処理を実行する。
実装が比較的シンプル。後続処理の同期が楽。

#### 2. [BigQueryCreateDataTransferOperator](https://airflow.apache.org/docs/apache-airflow-providers-google/stable/_api/airflow/providers/google/cloud/operators/bigquery_dts/index.html)

BigQueryTransferServiceをAPI経由で作成して、GCSからBigQueryにデータをロードする。
ロード完了処理に同期して後続処理を行いたい場合は、PubSub経由の通知を利用する必要があり、少し面倒。([BigQuery Data Transfer Service の実行通知](https://cloud.google.com/bigquery-transfer/docs/transfer-run-notifications?hl=ja))

# 使い分け
基本的に[GCSToBigQueryOperator](https://airflow.apache.org/docs/apache-airflow-providers-google/stable/_modules/airflow/providers/google/cloud/transfers/gcs_to_bigquery.html#GCSToBigQueryOperator) を使えばいいと思う。
どちらもworker上でのDLや処理を行わないので処理は充分早く、workerへの負荷は少ない。
実装のシンプルさや、後続処理との同期を考えると、[GoogleCloudStorageToBigQueryOperator](https://airflow.apache.org/docs/apache-airflow/1.10.12/_api/airflow/contrib/operators/gcs_to_bq/index.html) を使ったほうが恩恵が大きい。

# 実装

####[GoogleCloudStorageToBigQueryOperator](https://airflow.apache.org/docs/apache-airflow-providers-google/stable/_modules/airflow/providers/google/cloud/transfers/gcs_to_bigquery.html#GCSToBigQueryOperator) の実装

```py
from airflow.models import DAG
from airflow.utils.dates import days_ago
from airflow.providers.google.cloud.transfers.gcs_to_bigquery import GCSToBigQueryOperator


default_args = {
    'owner': 'airflow',
    'start_date': days_ago(1),
    'project_id': 'YOUR_PROJECT_ID',
    'retries': 2
}

with DAG(
    dag_id='gcs_to_bq',
    default_args=default_args,
    schedule_interval=None,
    catchup=False
) as dag:


    GCSToBigQueryOperator(
        task_id='gcs_to_gq',
        bucket='bucket_name',
        source_objects=['path/to/dir/*'],
        schema_fields=[{'name': 'log', 'type': 'STRING', 'mode': 'NULLABLE'}],
        destination_project_dataset_table='dataset.table_name',
        source_format='NEWLINE_DELIMITED_JSON',
        write_disposition='WRITE_TRUNCATE',
        create_disposition='CREATE_IF_NEEDED',
        autodetect=False,
        ignore_unknown_values=True,
    )
```

#### [BigQueryCreateDataTransferOperator](https://airflow.apache.org/docs/apache-airflow-providers-google/stable/_api/airflow/providers/google/cloud/operators/bigquery_dts/index.html) の実装

以下が参考になる

https://airflow.apache.org/docs/apache-airflow-providers-google/stable/operators/cloud/bigquery_dts.html#creating-transfer-configuration
kintoneでIot！M5StickCをノーコードで設定［物理ボタン編］

目的
-------------------------------------------------
M5StickCを「物理ボタン」として使用しkintoneのアプリにレコードを追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228252/071f95ce-daa6-e25c-f539-80f883ddfb34.png)

kintoneにアプリを1つ追加
------------------------------------------------------------
このようなアプリを１つ追加します

| フィールド | 数値 |数値 |作成日時|
|:-:|:-:|:-:|:-:|
| フィールド名  | Aボタン|Bボタン|作成日時|
| フィールドコード  | A |B|作成日時|
今回は、M5stickCのAボタン、Bボタンを押した時に「数値１」を
kintoneにレコード追加する設定を行います
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228252/5f116595-dcc3-25ce-12a6-daf9b5351e56.png)

UIFlowでkintoneにレコード追加する
------------------------------------------------------------
UIFlowはこのようにブロックをつなげて必要な項目を入力すると
プログラムが完成します。
![ui1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228252/0c9e5f67-17b8-1098-a8e5-4c7931cfd1f0.jpeg)

Wifiに接続
----------------------------------------------------------
「ハードウェア」→「Network」→【SSID　PASSWORD　のWifiと接続】を
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228252/67c29538-304d-e602-2e2b-49fb133effd3.png)
【SetUp】ブロックに接続し、SSIDとPASSWORDを入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228252/dc76aca5-b8d6-3b0b-dfe3-9b63c1bc1059.png)

Aボタンを押すとkintoneにレコード追加する場合
----------------------------------------------------------
「イベント」→【ボタンAがwasPressdのとき】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228252/e93f2368-e168-09a8-9a2f-d3e87bbbaf3c.png)
「高度なブロック」→「Http」→【Http Request】
MethodはPOSTに変更　
URL、Headersにはkintoneアプリのサブドメイン、APIキー、アプリコードを入力します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228252/99f27e1a-bdd2-9ef9-c369-ba43515972fb.png)
送信完了時にはlabel0にレコード番号を表示　LEDを点滅させ
送信失敗時にはlabel1にerrorと表示させます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228252/bf57dcb2-153c-b99b-2441-4804172d99e0.png)
左メニューの「Label」をクリックアンドドラッグしM5stickCに表示させたい位置に配置
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228252/b47f2b07-4fe2-93db-0cc7-7a5c6f43ae18.png)

RUNでテスト、DOWNLOADで書き込み
----------------------------------------------------------
作動テストは「RUN」ボタンで行います
![run.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228252/5853e5a2-e1f9-2065-8a57-797d4cc8fc3c.jpeg)
作動OKであればRUNの右側「DOWNLOAD」ボタンでM5stickCに書き込まれます
思うように作動しない場合は、再度［準備編］からやり直しになります。

Bボタンも利用できます
----------------------------------------------------------
Aボタンの代わりにBボタンを利用する場合には
![AB.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228252/910a5611-4874-4837-b9bf-4227cb49571f.jpeg)
AをBに変更するだけです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228252/8f02a4f3-bf5e-4578-5fbd-d931acee6c2a.png)
AボタンもBボタンも利用する場合は
【ボタンAがwasPressのとき】のブロック全体を複製し必要な部分を変更し
kintoneのアプリにもBボタンのフィールドを追加します

参考にさせていただきました
----------------------------------------------------------
https://qiita.com/juri_don/items/97824bc435564acc20fb
kintoneでIot！M5StickCをノーコードで設定［準備編］

目的
-------------------------------------------------
3000円以下のIot端末をノーコードで設定し、kintoneにレコード追加します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228252/071f95ce-daa6-e25c-f539-80f883ddfb34.png)

詳細
-----------------------------------------------------
マイコンのM5stackシリーズはノーコード環境「UIFlow」で簡単に設定ができます
今回は3000円以下で購入できる「M5StickC」をIot端末として利用し
「物理ボタン」として設定します
M5Stack社の販売代理店であるスイッチサイエンスから購入できます

https://www.switch-science.com/catalog/6350/

M5StickCにUIFlowの準備
-------------------------------------------------------
M5stackの公式サイト　https://docs.m5stack.com/en/download　から
「CP210x_VCP_Windows」と「M5Burner Win10 x64」をダウンロードします（Windowsの場合）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228252/cad33f2c-126b-f1b8-064e-8023e84534d0.png)
「CP210x_VCP_Windows」をインストールします
「M5Burner Win10 x64」はダウンロードし解凍します
　M5stickCをUSBケーブルでPCと接続し、M5Burner.exeを起動します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228252/4a7aecb4-c9f2-0616-670d-7c3fe6e6b3e5.png)

STICKCを選びファームウェアをダウンロードします
![m5buner.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228252/5b2a614e-0c20-ee32-30c4-7c9b8bd4b6cd.jpeg)
BurnでStickCにファームウェアが書き込まれます
![2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228252/6b9bbc19-9854-4f5e-02a2-fb7e301ea5d1.jpeg)
途中でWifiの設定(2.4Ghz)を入力します。（注意）StickCは5Ghzには対応していません
![3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228252/e6c123e0-864c-25a9-6987-957d0df97930.jpeg)
このような画面になれば書き込み完了です。
![4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228252/e36f0ee6-66f5-b5e4-70fc-dba692117a8c.jpeg)

ノーコード環境（UIFlow）を準備します
--------------------------------------------------------
ブラウザーで https://flow.m5stack.com/ を開きます
M5stick本体に表示されている８桁のAPIKEYを入力
LanguageとDeviceを選択し
![8.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228252/68e1d7f5-71bb-995e-e8e7-0531377f314d.jpeg)
このように左下に緑色で「接続済み」と表示されれば準備完了です
![9.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228252/8c19db67-cc61-21e5-c195-8627ca541407.jpeg)

参考にさせていただきました
----------------------------------------------------------
M5stackの公式サイト　https://docs.m5stack.com/en/download
マニュアル（英文）
https://m5stack.oss-cn-shenzhen.aliyuncs.com/resource/docs/UIFlow-StickC-Book-English.pdf
【Microsoft 365】サインイン時の多要素認証を無効化する

# 【Microsoft 365】多要素認証の無効化

SharePoint サイトを構築中にユーザーを切り替えてテストを行ったりする場面では、常に２段階認証を求められるような状況は解除しておきたかったりします。

> 2023/10/24

Microsoft Entra ID へ変更された影響か、既に無効化したテナントの設定が、有効になっていました。

:::note info
Azure Active Directory が Microsoft Entra ID へ変更したことに伴い手順を修正しました。
:::

## ２段階認証を解除する

1. Microsoft Entra 管理センターに [グローバル管理者](https://learn.microsoft.com/entra/identity/role-based-access-control/permissions-reference#global-administrator) としてサインインします。
1. [ID] > [概要] を選択します。
   ![MFA_Disable_01](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111975/e2d07e08-887b-078c-94f3-8c17bb455dd0.png)
1. [プロパティ] タブを選択し、[セキュリティの既定値群の管理] のリンクをクリックします。
   ![MFA_Disable_02](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111975/a2378f3e-5d38-5d98-799d-a6b8cb5689da.png)
1. [セキュリティの既定値群] で [無効] を選択し、[保存] ボタンをクリック。
   ![MFA_Disable_03](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111975/e2603ca6-67fa-45f6-072e-72bc7eb0043d.png)
1. [無効化] ボタンをクリックします。
   ![MFA_Disable_04](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111975/15135682-8fbe-99d9-9d36-53a0d84ca8d8.png)
1. 結果が表示されます。
   ![MFA_Disable_05](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111975/c4dfcf71-10b8-81a9-c0dd-f88a974353c3.png)

### 参考サイト

- [Microsoft Entra ID でセキュリティのデフォルトレベルを提供する - セキュリティの既定値群の無効化](https://learn.microsoft.com/entra/fundamentals/security-defaults#disabling-security-defaults)
Angular - formControl vs formControlName

```html
<div>
  <input type="text" [formControl]="myForm.controls.firstName"/>
  <input type="text" [formControl]="myForm.controls.lastName"/>
  <input type="text" [formControl]="myForm.controls.email"/>
  <input type="text" [formControl]="myForm.controls.title"/>
</div>

same as

<div [formGroup]="myForm">
  <input type="text" formControlName="firstName"/>
  <input type="text" formControlName="lastName"/>
  <input type="text" formControlName="email"/>
  <input type="text" formControlName="title"/>
</div>

```


https://stackoverflow.com/questions/40171914/what-is-the-difference-between-formcontrolname-and-formcontrol
jsPsych with CodePen

[jsPsych](https://www.jspsych.org/) is a JavaScript library for running behavioral experiments in a web browser [(de Leeuw, 2015)](https://link.springer.com/article/10.3758/s13428-014-0458-y).

This page explains how to create a demo for the jspsych library using [CodePen](https://codepen.io/). This is intended for educational use rather than for experimentation with CodePen.

# Include JavaScript files

You can find JavaScript files needed to use jsPsych in [JSDELIVR](https://www.jsdelivr.com/package/gh/jspsych/jsPsych)

![codepen1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495823/c8f45359-5ea4-fe56-caa7-1588b4442482.png)

# Include CSS files

![codepen2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495823/2303d857-006c-3011-6de1-289536521154.png)

# Write code in the JS window

You don't need to write any script tags.

![codepen3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495823/b1939a43-b4fa-4291-86e7-05e04c303c27.png)

# An example for the jspsych-html-button-response plugin

- Press the JS button to turn on/off the JavaScript window.
- Press the Result button to turn on/off the experimental window.
- Press the Resources button to show external JavaScript and CSS files.
- Press the Rerun button to rerun the experiment.
- Note that you can edit my code by clicking "EDIT ON CODEPEN" in the upper right corner.

<p class="codepen" data-height="300" data-default-tab="js,result" data-slug-hash="wvdoERW" data-user="kurokida" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/kurokida/pen/wvdoERW">
  jspsych-html-button-response demo</a> by Daiichiro Kuroki (<a href="https://codepen.io/kurokida">@kurokida</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>
[Rails]ローディング(ロード画面)の実装

おしゃれなサイトはローディングをよく実装していますので、今回はポートフォリオにて実装してみました。

思ったよりかんたんに実装できて、サイト全体の雰囲気がアップするのでおすすめです！

参考にしたサイトは以下で、「1.【サンプル】ローディング（テキストだけでふわっと）」をRailsのアプリケーションに落とし込んで解説していきます。
[【jQuery】 ローディング、実装サンプル集](https://125naroom.com/web/3835)

#開発環境

> ruby 2.6.3
> Rails 5.2.6

#実装方法

今回はHTMl,CSS,JavaScriptを使ってローディングを実装していきます。
ではいってみましょう〜！

#ビュー
まずはビューから、このビューのid名、class名に対してCSSやJavaScriptをあてていきます。

今回はhomes/topで実装。

`1番上の行`から記述していってください。

```erb:views/homes/top.html.erb
<div id="loading">
  <div id="loading_box">
    <div class="loading-one animation_loading">
      <p class="loading-txt">Loading</p>
    </div>
  </div>
</div>
:
```

#デザイン

次にローディングのデザインとアニメーションに関する記述をしていきます！

```assets/stylesheets/homes.scss
// loading
// デザイン
#loading {
  position: fixed;
  top: 0;
  left: 0;
  bottom: 0;
  z-index: 99999;
  width: 100%;
  height: 100%;
  background: #343a40;
}
#loading_box {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  width: 100%;
  text-align: center;
}
.loading-one {
  display: inline-block;
  border-top: 1px solid #ffffff;
  border-bottom: 1px solid #ffffff;
}
.loading-one p.loading-txt {
  color: #fff;
  font-size: 20px;
  letter-spacing: 0.25em;
  line-height: 2.0;
  padding: 2em 0;
}
// アニメーション
.animation_loading {
  animation: equalizer_loading 7000ms infinite;
  animation-iteration-count: 10;
}
@keyframes equalizer_loading {
  0% {
    width: 70%;
  }
  10% {
    width: 50%;
  }
  20% {
    width: 100%;
  }
  30% {
    width: 10%;
  }
  40% {
    width: 50%;
  }
  50% {
    width: 70%;
  }
  60% {
    width: 50%;
  }
  70% {
    width: 10%;
  }
  80% {
    width: 100%;
  }
  90% {
    width: 10%;
  }
  100% {
    width: 70%;
  }
}
```

#動きをつける

デザインもできたので、最後にJavaScriptで動きをつけていきます。

```assets/javascripts/application.js
//ローディング画面の表示
$(window).on('load',function(){
  $("#loading").delay(1500).fadeOut('slow');//ローディング画面を1.5秒（1500ms）待機してからフェードアウト
  $("#loading_box").delay(1200).fadeOut('slow');//ローディングテキストを1.2秒（1200ms）待機してからフェードアウト
});
```
ここで一度動作を確認してみてください。

リロードやURL直打ちなら正常に動作すると思いますが、Topビューへのリンクを踏んだときはローディングが一生終わりません。(コピペのままではだめってこと）

そう！
`RailsにはTurbolinksがデフォルトで入っているので正常に動きません。`
詳しくは以下記事
[[Rails]リロードしないとJavaScript(jQuery)が動かない問題](https://qiita.com/nakachan1994/items/974f1d3c17d43446acb9)

Turbolinksを無効化するために、Topビューへのリンクに以下を追加します。（複数Topビューへのリンクがある場合は１つ残らず忘れずに）

```erb:views/layouts/_header.html.erb
<% if user_signed_in? %>
  <!--data: {"turbolinks" => false}を追加-->
  <%= link_to 'Top', root_path, data: {"turbolinks" => false} %>
:
<% else %>
  <!--data: {"turbolinks" => false}を追加-->
  <%= link_to 'Top', root_path, data: {"turbolinks" => false} %>
:
<% end %>
```

これでリンクを踏んだ場合にも正常に動作します。

#最後に

今回はローディングを参考サイトを参考にしながらかんたんに実装していきました。

ほぼほぼ参考サイトそのままでできたのですが、Turbolinksのところでそのまま動かなかったりしました。

ぼく自身まだまだCSSのアニメーションの記述に関しては調べながらの実装も多いので、カスタマイズできたり、がんばって一からコードが書けるよう学習していきます。
[Docker] ストレージドライバの変更 aufs -> overlay2 - Ubuntu 2104へのアップグレードに伴う

# はじめに

Ubuntu 2104から、Dockerのaufsストレージドライバが削除されました。
重い腰を上げて、overlay2を使うことにします。

# ステージドライバの変更によりなくなるもの

## コンテナ

コンテナは失われます。

維持したいときは、次のような手順になります。

まずイメージを保存します。

```bash
# コンテナ内容をイメージへ反映
docker commit コンテナ
# イメージをファイルへ保存
docker save イメージ > image.tar.gz
```

overlay2ドライバへの変更後、保存しておいたファイルを読み込みます。

```bash
docker load < image.tar.gz
```

## イメージ

イメージは失われます。

これはまあpullし直せばよいですね。


# 移行手順

aufsからoverlay2への移行手順です。

サービスを止めます。

```bash
sudo systemctl stop docker
sudo systemctl stop docker.socket
```

ファイルをバックアップします。

```bash
sudo cp -a /var/lib/docker /var/lib/docker.bk
```

`/etc/docker/daemon.json`ファイルを編集します。

```json
{
  "storage-driver": "overlay2"
}
```

サービスを起動します。

```bash
sudo systemctl start docker
sudo systemctl start docker.socket
```

ストレージドライバが変更されたか確認します。

```bash
docker info
```

こんな感じに出力されます。

```
（省略）
Server:
 Containers: 0
  Running: 0
  Paused: 0
  Stopped: 0
 Images: 0
 Server Version: 20.10.7
 Storage Driver: overlay2
（省略）
```

# （おまけ）Ubuntu 2104へのアップグレード

Ubuntuアップデーターを実行すると、`/var/lib/docker/aufs` 使ってなければ削除してよ、というメッセージが表示されます。

![Screenshot from 2021-07-13 10-22-43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59475/880e205c-2129-c956-944c-98717042ccdb.png)

メッセージに従って削除します。

```bash
sudo rm -rf /var/lib/docker/aufs
```
3Dプリンタで縄文土器を出力する

　私は歴史の専門家ではなく、単に最近3Dプリンタを入手して遊んでるだけの素人なんですが、古代の出土品を3Dプリンタで出力してみると、学校で習わなかったこと、教科書の写真だけでは分からなかったことが発見できて面白かったので紹介します。発見といっても、ちゃんと本物を見てる専門家の人にとっては今更当たり前のことなんですが。

##火焔土器
　弥生土器が簡素で精密な形なのに比べて、縄文土器って手作りでグニャグニャで、荒削りなものという印象を持ってました。これは3Dプリンタで出力した火焔型土器を横から撮った写真です。教科書とか図鑑とかはだいたいこの方向から撮ったものが多いと思います。躍動感みたいなのはありますが、精密という感じはしないでしょう。
![PXL_20210712_143231590.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114010/80ec2bb3-4845-0a5f-fd83-906783baa0d6.jpeg)
ところが、これを真上から見るとこうなります。
![PXL_20210712_143309688.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114010/066ec663-0d11-9f0a-9cc6-3932efd7be19.jpeg)
全体は真円で、炎のグニャグニャも綺麗にシンメトリーになっていて、実は非常に精密に計算された形だということがわかります。私は3Dプリンタで出力するまではこの方向から見たことがなかったので驚きでした。立体物はやはり立体としてみないと、本やらWebやらで見たつもりになっててはいかんと思いました。

上の写真で使った火焔土器の3Dデータは以下のサイトからダウンロードできます。83万ポリゴンという非常に精密なものがオープンデータとして公開されています。素晴らしい。お手元に火焔土器ひとついかがですか。

https://jomon-supporters.jp/open-source/
##遮光器土偶
もうひとつ、亀ヶ岡遺跡から発掘された遮光器土偶を紹介します。遮光器土偶は全国いろいろなところから出土してますが、亀ヶ岡のやつがなかなかいい形をしています。東京国立博物館に収蔵されており、YouTubeで紹介動画を見ることができますが、なんと3D CGです。

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

ということはどこかに精密な3Dデータが存在するはずです。火焔土器みたいにオープンデータとしては公開しているものがないか、あちこち探しましたが見つかりませんでした。

NHK技研が2021年にARを使って目の前に亀ヶ岡の遮光器土偶が現れるという番組宣伝コンテンツを公開しました。ということは遮光器土偶の3Dデータがサイトに使われているわけです。[NHK技研のページ](https://www.nhk.or.jp/strl/open2021/tenji/1/index.html) によると「※ 8K文化財プロジェクトのデータを基に解像度を落とした３次元モデルを使用」ということで、残念ながら細かい模様までは再現できませんが、立体のプロポーションはそのままなので小さいマスコットを出力するには十分なデータでした。

https://www.nhk.or.jp/vr/AR/dogu/

このページはどうやらglTF形式の3Dデータをthree.jsで表示してるようなので、ページのソースから <model-viewer src="... という部分を見ると、srcアトリビュートにgltfファイルのフルパスurlが書いてありました。それをダウンロードします。

落としたファイルをBlenderにインポートすれば、3Dプリンタで出力できるSTL形式にエクスポートすることができます。
![doguarBlender.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114010/6c2750dc-850a-cfe0-e899-7ae1b54d1d17.png)

印刷したのがこれです。

![PXL_20210712_050819120.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114010/048b7351-1065-496c-35c4-5394369a8d6d.jpeg)

印刷してみて分かったことは、実にくだらないことなんですが、亀ヶ岡の遮光器土偶は、肛門のところに穴が開いている、ということでした。土偶を下からみないと分からないし、こんなことわざわざ記述する図鑑もなかったので、はじめて知りました。どういう意味があるんでしょうね。穴はNHKのサイトを見て、土偶のモデルをひっくり返しても確認できます。

![Screenshot_20210712-193636.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114010/a922a409-7162-f6ba-aa74-8d0cfe44fc8b.png)

古代の出土品のレプリカを手元の3Dプリンタで出力してみて思ったのは、立体物は立体で体験するのが一番だということです。NHKの番組は博物館の収蔵品を3Dデータで取り込んでいろいろ見せようということらしいので、これからもデータを公開していってほしいものです。学校教材とかにも利用できそうですし。
Google Spreadsheet: TrelloのURLからカードのタイトルをセルに表示する方法

Google SpreadsheetのセルにTrelloのカードのURLを入力したら、そのURLからTrelloカードのタイトルを取得する方法です。

## Trello APIのキーとトークンを取得する

Trello APIを使ってカードの情報を取得するので、Trello APIのキーとトークンが必要です。

キーは下記URLから取得して、控えておきます:

https://trello.com/app-key

トークンは、上のページで手動生成し、控えておきます:

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/889/84c7f19e-04ab-dbb0-d548-8e812517f115.png)

## Google App Scriptに`TRELLO`関数を作る

Google Spreadsheetには、セルで使える関数をJavaScriptで実装できる機能があるので、`TRELLO`という関数を実装します。この`TRELLO`関数は第一引数にTrelloのカードURLを与えると、Trello APIを使ってそのカードの件名などの情報を取得して返すといった仕様にします。


まず、Google Spreadsheetで`TRELLO`関数を使いたいスプレッドシートを開きます。そして、メニューの「ツール」→「スクリプトエディタ」を開きます。

![CleanShot 2021-07-13 at 10.07.56@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/889/3c87098e-4a44-8719-ee9a-3eb6e6ab579f.png)


スクリプトエディタが開いたら、ファイルを追加し、エディタに下記のJavascriptコードを貼り、保存します。


```js:TRELLO.gs
const KEY = "...";
const TOKEN = "...";

function TRELLO(cardUrl, fieldName = "name") {
  const matches = `${cardUrl}`.match(/https?:\/\/trello\.com\/c\/([^/]+)/);
  if (!matches) {
    return "ERR";
  }
  const cardId = matches[1];

  try {
      const jsondata = UrlFetchApp.fetch(`https://api.trello.com/1/cards/${cardId}?key=${KEY}&token=${TOKEN}`);
      const object   = JSON.parse(jsondata.getContentText());
      return object[fieldName] ?? `Unknown field: ${fieldName}`;
  } catch (e) {
    return `ERR: ${e?.message ?? e}`
  }
}
```

このコードの`KEY`と`TOKEN`は、Trello APIのキーとトークンに書き換えてください。

![CleanShot 2021-07-13 at 09.58.10@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/889/52ca8470-b7e0-7920-4641-9be82b286d49.png)

これでスプレッドシート内で`TRELLO`関数が使えるようになります。

## スプレッドシートで`TRELLO`関数を使う

最後にスプレッドシートで`TRELLO`関数が呼び出せることが確認できればOKです。

![CleanShot 2021-07-13 at 10.11.23@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/889/adf889ec-dd80-d9b9-6a84-a95b9c306fbc.png)
Elasticsearch のREST APIs その②

# 概要

前回Elasticsearch REST APIsの使用方法の続きとなります。


## 一括検索(Multi-document APIs) mget

https://www.elastic.co/guide/en/elasticsearch/reference/current/docs.html

↑公式にはGETメソッド使ってましたが、間違いだったかな？

例：
idは"1001","1002","r8qdj3oB7A0XUeSyl8-h"であるデータ全部検索
以下の例にはid1002が存在してないものを前提とする。
idが存在するにもかかわらずエラーせずにレスポンスする。

```ruby:リクエスト
URL：
POST /{インデックス名}/{タイプ名}/_mget
Body：
{
"ids":["1001","1002","r8qdj3oB7A0XUeSyl8-h"]
}
```
```ruby:レスポンス
{
  "docs": [
    {
      "_index": "mail-index",
      "_type": "user_info",
      "_id": "1001",
      "_version": 2,
      "_seq_no": 2,
      "_primary_term": 1,
      "found": true,
      "_source": {
        "ユーザID": 1001,
        "ユーザ名": "鈴木太郎",
        "ステータス": 1,
        "メール": "suzukitaro@gmail.com"
      }
    },
    {
      "_index": "mail-index",
      "_type": "user_info",
      "_id": "1002",
      "found": false
    },
    {
      "_index": "mail-index",
      "_type": "user_info",
      "_id": "r8qdj3oB7A0XUeSyl8-h",
      "_version": 2,
      "_seq_no": 3,
      "_primary_term": 1,
      "found": true,
      "_source": {
        "ユーザID": 1002,
        "ユーザ名": "田中博",
        "ステータス": 0,
        "メール": "tanaka.hiroshi@yahoo.co.jp"
      }
    }
  ],
  
}
```

## データ一括挿入(Multi-document APIs) bulk

```ruby:リクエスト
URL部：
POST /{インデックス名}/{タイプ名}/_bulk
BODY部：
{ "create" : { "_index" : "mail-index", "_type": "user_info"} }
{"ユーザID": 1003,"ユーザ名": "前川理恵","ステータス": 0,"メール": "maekawa.rie@yahoo.co.jp"}
{ "create" : { "_index" : "mail-index", "_type": "user_info"} }
{"ユーザID": 1004,"ユーザ名": "木下美緒","ステータス": 0,"メール": "kinoshita.mio@yahoo.co.jp"}
```

↑リクエストBODY部にはエラーが表示されるかもしれないが、無視で構わない。

## 検索ページング

前回Elasticsearchを使って検索した際に最大で登録済みの10件しか戻ってこない話があった。
ヒットした全部のデーター(ドキュメント)を取得した場合はページングが必要となる。

```
size:一ページに何件にする
form:何件後から取得する、ディフォルトは0となる
例：
GET　/_search?size=5  →　最初の5件ください。
GET　/_search?size=5&from=10  →　5件ほしい。11件目から取得する。
```
一般的な検索エンジンは最大で1000件しか検索結果が戻らないようです。それはページネーションによって捨てるデーターが多すぎるため、性能が落ちるからそうだ。
[Go] YAMLファイルを埋め込み構造体に読み込む



以前、Go言語でYAMLファイルを埋め込み構造体に読み込もうとした際に、JSONを読み込むのと同じように実装したらうまく読み込めなかったことがあった。
その時調べた内容をまとめておく。

# 結論

このようなYAMLファイルがあった場合、下記のように構造体の埋め込みフィールドに`inline`タグをつけることで埋め込み構造体に読み込むことができる。

**YAMLファイル**

```yaml
# tmp.yaml
wheels: 4
tons: 10
```

**読み込むためのコード**

```go
package main

import (
	"fmt"
	"os"

	"gopkg.in/yaml.v2"
)

type Car struct {
	Wheels int `yaml:"wheels"`
}

type Truck struct {
	// 埋め込み のフィールドに 'inline' タグをつける
	Car  `yaml:",inline"`
	Tons int `yaml:"tons"`
}

func main() {
	truck := Truck{}
	b, _ := os.ReadFile("tmp.yaml")
	yaml.Unmarshal(b, &truck)
	fmt.Printf("Wheels: %+v\n", truck.Wheels)
	fmt.Printf("Tons: %v\n", truck.Tons)
}
```

下記が実行結果。

```sh
$ go run main.go
Wheels: 4
Tons: 10
```

# そもそもJSONではもっと簡単

JSONではタグを気にする必要なく埋め込み構造体へ読み込み可能。

**読み込み対象のJSONファイル**

```yaml
# tmp.json
{
    "wheels": 4,
    "tons": 10
}
```

**サンプルコード**

```go
package main

import (
	"encoding/json"
	"fmt"
	"os"
)

type Car struct {
	Wheels int `json:"wheels"`
}

type Truck struct {
	Car // タグが必要ない
	Tons int `json:"tons"`
}

func main() {
	truck := Truck{}
	b, _ := os.ReadFile("tmp.json")
	json.Unmarshal(b, &truck)
	fmt.Printf("Wheels: %+v\n", truck.Wheels)
	fmt.Printf("Tons: %v\n", truck.Tons)
}
```

**実行結果**

```sh
$ go run main.go
Wheels: 4
Tons: 10
```

# YAMLでも同じようにすると？

構造体を下記のように変更してYAMLファイルを読み込んでみる。

```go
type Car struct {
	Wheels int `yaml:"wheels"`
}

type Truck struct {
	Car // JSONと同様にタグなしにしてみる
	Tons int `yaml:"tons"`
}
```

**実行結果**

```sh
$ go run main.go
Wheels: 0
Tons: 10
```

上記のように`Wheels`が読み込めていない（`0`なのはintの初期値なため）。

# ではどうすればよい？

Go言語は大体の場合、ドキュメント見れば対処法や原因が書いてある。
なので今回も`yaml.v2`パッケージのドキュメントを見に行くと`inline`タグについて下記の記載がある。

> Inline the field, which must be a struct or a map,
> causing all of its fields or keys to be processed as if
> they were part of the outer struct. For maps, keys must
> not conflict with the yaml keys of other struct fields.

[yaml · pkg.go.dev](https://pkg.go.dev/gopkg.in/yaml.v2#Marshal)

要は`inline`タグをつけるとその構造体のフィールドはその構造体の上位の構造体のフィールドとして扱われるとのこと。

例として、`inline`タグを使用している下記構造体があったとする。

```go
type Car struct {
	Wheels int `yaml:"wheels"`
}

type Truck struct {
	Car `yaml:",inline"`　// inline タグを追加
	Tons int `yaml:"tons"`
}
```

これは、`yaml.v2`からすると下記と同等となる。

```go
type Truck struct {
	Wheels int `yaml:"wheels"`
	Tons int `yaml:"tons"`
}
```

そのため、`inline`タグを付けることによって埋め込み構造体にYAMLファイルを読み込むことができるようになる。

というわけで、これで埋め込み構造体にYAMLファイルを読み込むことができるようになった。
Glow V1.0.0 - 次世代ゲノムワイド分析

[Get Started with Glow V1\.0\.0 \- For Next Generation Genome Wide Analytics \- The Databricks Blog](https://databricks.com/blog/2021/03/09/glow-v1-0-0-next-generation-genome-wide-analytics.html)の翻訳です。

> サンプルノートブックは[こちら](https://github.com/taka-yayoi/public_repo/tree/main/glow)からダウンロードできます。

**人口規模における遺伝子関連解析**

近年、ゲノミクスデータ、特に研究者が無料でどこからでも利用できるイギリスのBiobankのような幾つかのデータセットが爆発的に増大しています。遺伝子発見、研究、開発の優先度付け、乱数化された対照試験のようなインパクトの強いユースケースでゲノミクスデータが活用されています。これらのユースケースは次世代治療の開発に役立つことでしょう。

問題点：データから洞察を得るためには、データチームによって大規模分析を可能にする必要があります。大規模データへの対応には、データサイエンティスト、データエンジニアの深い技術スキルセットが必要になります。だからこそ、クラウドにおいてゲノミクスデータの分散処理を行う際にキーとなる課題を解決するオープンソースライブラリであるGlowバージョン1.0.0を発表できることを嬉しく思っているのです。

# 遺伝子関連解析における課題

遺伝子データは増加し続けるため、これらのデータの処理、格納、分析がボトルネックとなっています。課題には以下のようなものが含まれます：

1. **データの種類** 様々なデータタイプの管理は頭の痛い問題となります。例えば、Biobankのデータには遺伝子、電子健康記録、医療機器、画像が含まれます。
1. **データのボリュームとスピード** 遺伝データは膨大で増加し続けます。加えて、新たなデータが追加されるたびに分析を再実行し続けなくてはなりません。
1. **柔軟性に欠ける分析** シングルノードのバイオインフォマティクスツールでは、ユーザーが大規模データに対して、インタラクティブな協働作業をすることはできません。遺伝データのフォーマットは圧縮、格納には最適化されていても、分析には最適化されていないかもしれません。バイオインフォマティクスのサイエンティストは、同じ民族あるいは異なる民族からフィルタリングを行いサンプルを取得します。固定的なフィルタリングは新たな発見の妨げとなります。

# Glowのご紹介

Glowは人口規模での遺伝データを操作するためのオープンソースのツールキットです。このツールキットは、大規模データ処理、機械学習のための統合分析エンジンであるApache Spark™上にネイティブに構築されています。

1. **バイオインフォマティクスとビッグデータエコシステムの橋渡し** Glowを用いることで、共通かつ可変のスキーマの元で、variant call format(VCF)、bgen、plink、Hailマトリクステーブルを取り込むことができます。ゲノミクスデータレイクを作成するために、変異体データは[Delta Lake](https://delta.io/)に書き込まれます。これらのデータは[GraphFrames](https://graphframes.github.io/graphframes/docs/_site/index.html)のような分散機械学習アルゴリズムを用いて様々なデータソースとリンクされます。
1. **大規模処理**　GlowはApache Spark™とDelta Lake上にネイティブに構築されており、ユーザーは1ノード、10ノード、100ノードに拡張することができます。コンピュータのスケーリングはコード、ハードウェアの最適化よりも高速です。
1. **遺伝関連研究のネイティブサポート** Glowは、線形回帰、ロジスティック回帰のための[regenie](https://github.com/rgcgithub/regenie)と協調し、最大20までの表現型を同時にサポートします。これにより、フィルタリングすることなしに全てのデータを取り込み、ケースとコントロールの不均衡に対して制御を行うことが可能となります。GlowはPythonとpandasのユーザー定義関数で記述されているので、プログラミング知識のある生物学者であれば、例えば、gene burden分析やjoint variant分析にGlowを拡張することができます。

![](https://databricks.com/wp-content/uploads/2021/03/glow-1-0-image-1-rev.png)
**図1 Glowライブラリは三大クラウドで動作するDatabricksで実行できます。スターターノートブックは[ドキュメント](https://glow.readthedocs.io/en/latest/index.html)から参照できます**

![](https://databricks.com/wp-content/uploads/2021/03/glow-image-2-rev.png)
**図2 Glowのwhole genome regression(GloWGR)は既存のメソッドよりスケーラブルです**

# まとめ

Glowプロジェクトを通じてゲノミクスにおけるスケーリングの課題を解決するために、Regeneronの遺伝学センターとコラボレーションしました。バイオインフォマティクス、コンピューターに長けた生物学者、統計学関連の遺伝学者と研究者が一緒に、遺伝データ分析と後段の機械学習アプリケーションをスケールさせるために、あらゆるクラウドで動作するDatabricksのレイクハウスプラットフォームを活用できます。Apache Spark™とDelta Lakeにおけるゲノミクスの最初のユースケースは、人口規模の遺伝関連研究でした。そして、今では癌や発育障害などの新たなユースケースが見えてきています。

# 使ってみる

[Databricks](https://docs.databricks.com/applications/genomics/genomics-libraries/glow.html)で[Glow V1\.0\.0](https://glow.readthedocs.io/en/latest/index.html)を使ってみませんか。サンプルノートブックは[こちら](https://github.com/taka-yayoi/public_repo/tree/main/glow)からダウンロードできます。詳細を知りたい方は[projectglow\.io](https://projectglow.io/)を参照ください。

### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)
CloudWatchログ監視

# CloudWatchロググループ

[![Image from Gyazo](https://i.gyazo.com/861fbbf471bf0bde82f3c2c5a35ffec7.png)](https://gyazo.com/861fbbf471bf0bde82f3c2c5a35ffec7)

# メトリクスフィルター

[![Image from Gyazo](https://i.gyazo.com/0a9fc29cf9dcb826da1782cd789a7b7f.png)](https://gyazo.com/0a9fc29cf9dcb826da1782cd789a7b7f)

[![Image from Gyazo](https://i.gyazo.com/9c2dced5fc32d27fa09805c525729270.png)](https://gyazo.com/9c2dced5fc32d27fa09805c525729270)

[![Image from Gyazo](https://i.gyazo.com/3056ac3c293186f356534c4468eda1b8.png)](https://gyazo.com/3056ac3c293186f356534c4468eda1b8)

[![Image from Gyazo](https://i.gyazo.com/b82ab63d0872b98544768b024d60b71a.png)](https://gyazo.com/b82ab63d0872b98544768b024d60b71a)

# SNS

[![Image from Gyazo](https://i.gyazo.com/45d0cab066a92e9a9cc582e0450bb935.png)](https://gyazo.com/45d0cab066a92e9a9cc582e0450bb935)

[![Image from Gyazo](https://i.gyazo.com/b069b1ba273d82ed43235e83f9aefe2f.png)](https://gyazo.com/b069b1ba273d82ed43235e83f9aefe2f)

[![Image from Gyazo](https://i.gyazo.com/3d097ece3284136d6543406e0cbc1074.png)](https://gyazo.com/3d097ece3284136d6543406e0cbc1074)

[![Image from Gyazo](https://i.gyazo.com/d4d760d779f0061e34c54478f6e8feb6.png)](https://gyazo.com/d4d760d779f0061e34c54478f6e8feb6)

# CloudWatchアラーム

[![Image from Gyazo](https://i.gyazo.com/40ad2d3ff114bda24cff1d8a3480e2fa.png)](https://gyazo.com/40ad2d3ff114bda24cff1d8a3480e2fa)

[![Image from Gyazo](https://i.gyazo.com/dee177e9f08dd85a67d01b4b8ed7d2b9.png)](https://gyazo.com/dee177e9f08dd85a67d01b4b8ed7d2b9)

[![Image from Gyazo](https://i.gyazo.com/fee2106ef0b12b235b1d66ca2a411007.png)](https://gyazo.com/fee2106ef0b12b235b1d66ca2a411007)

[![Image from Gyazo](https://i.gyazo.com/bd3739d1a24c6a2f5e0b6b3f30be71b3.png)](https://gyazo.com/bd3739d1a24c6a2f5e0b6b3f30be71b3)

[![Image from Gyazo](https://i.gyazo.com/9f9e661cb51d5fcf9490f0edbc9d8fb8.png)](https://gyazo.com/9f9e661cb51d5fcf9490f0edbc9d8fb8)

# アラーム通知テスト

```
aws cloudwatch set-alarm-state --alarm-name test-alarm --state-value ALARM --state-reason "test"
```

# 参考文献
 - [設定した CloudWatch Alarm をテストする方法](https://dev.classmethod.jp/articles/tsnote-cloudwatch-alarm-test-001/)
【エラー対処】(push容量オーバー)  error failed to push some refs to pre-receive hook declined

#前書き
```
error failed to push some refs to pre-receive hook declined
```

```
remote: warning: GH001: Large files detected. You may want to try Git Large File Storage - https://git-lfs.github.com
remote: warning: See http://git.io/iEPt8g for more information.
remote: warning: File ~~~~/~~~/.××× is 125MB; this is larger than GitHub's recommended maximum file size of 50.00MB
```

いつも通りGitHubにPushしたら、このエラーが出てきました。

#原因
[GitHub公式](https://docs.github.com/en/github/managing-large-files/working-with-large-files/conditions-for-large-files)
によると　
"GitHub blocks pushes that exceed 100 MB."

GitHubに100MB以上のファイルをアップロードできないそうです。
それが原因なんじゃないかと思い、調べ進めました。

#対処法

そこでどうするかというと

○.gitignoreで対象ファイルを除外
○Repository Cleanerを活用する
○Git LFSを活用して100MB以上でもPushできるようにする

このどれかで解決できるそう。
私はGit LFSを活用しました。



##Homebrewのインストール
<a href="https://git-lfs.github.com/">Git LFS</a>をインストールするために<a href="https://brew.sh/">Homebrew</a>を入れないといけないそうです。


```
$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
```
インストール完了

(補足：代わりにMacPortsを使うこともできるらしい。その場合は```port install git-lfs```でインストール)

##Git LFSのインストール

1.公式からダウンロード <br>
<a href="https://git-lfs.github.com/">Git LFS</a>

2.Homebrewを使ってインストール

```
$ brew install git-lfs
```

3.ダウンロードしたzipファイルを解凍

4.3で解凍したファイルに移動

```
$ cd ~/Downloads/git-lfs-1.X.X
```
5.3で解凍したファイルを適用させる

```
$ ./install.sh
> Git LFS initialized.
```


6.インストールが成功したことを確認

```
$ git lfs install
> Git LFS initialized.
```

##100MB以上のファイルとGit LFSを結びつける

1.ワーキングディレクトリに移動

```
$ cd {REPO}
```
2.直前のコミットを取り消す

```
$ git reset --soft HEAD^
```

3.容量を超えているファイルをGitLFSと結びつける
もし~~.psdというファイルなら下記のように打つ

```
$ git lfs track "*.psd"
> Adding path *.psd
```
4.登録したファイルを追加

```
$ git add .gitattributes
```
5.これ以降はいつもどおりに
add→commit→pushの流れ
win10 Hoem docker rails ローカルファイルの更新 反映されない


## コードの修正後の反映設定


```config/environments/development.rb
  config.file_watcher = ActiveSupport::FileUpdateChecker
```

config.file_watcher部分を上記に変更

## 何かしらの理由で上記のファイルを変更できない場合
Git管理をしているとローカルのみで管理対象外にしてもPullやcheckoutができないのでどうにかしたかった


initializersに下記のファイルを追加して管理対象外にしてみた。

```config/initializers/dev.rb
require "active_support/core_ext/integer/time"

Rails.application.configure do

  config.file_watcher = ActiveSupport::FileUpdateChecker

end
```

これだけで動作も更新もできたのでとりあえずこれで作業してみる
ckanプラグインの新規作成

# 環境

|ソフトウェアなど|バージョン|
|---|---|
|ckan|v2.9.3|
|python|v2.7.13|

※ckanは何らかの方法でインストール済みとします。

## 必要なパッケージのインストール

ソースコードからのビルドを行っている場合は不要となります。

aptなどのパッケージ管理コマンドや、ckan公式のDockerによりインストールしている場合は以下を実行してください。

```bash
CKAN_VERSION=2.9.3
# python3の場合は「requirements.txt」を指定
pip install -r https://raw.githubusercontent.com/ckan/ckan/ckan-${CKAN_VERSION}/requirements-py2.txt
pip install -r https://raw.githubusercontent.com/ckan/ckan/ckan-${CKAN_VERSION}/dev-requirements.txt
```

## プラグインの新規作成

作成用コマンドは2種類あります。プラグインの作成先ディレクトリです。

|コマンド|作成先ディレクトリ|
|---|---|
|cookiecutter|任意のディレクトリにプラグインを作成出来る|
|ckan CLI|作成されるディレクトリは固定|

### cookiecutter

TBD

※このコマンドは現在実行してもエラーとなります。以下のissuesで議論中のようです。

https://github.com/ckan/ckan/issues/5610

### ckan CLI

```bash
source {virtualenvのディレクトリ}/ckan/default/bin/activate
ckan generate extension
```

実行後に対話式でプラグイン名や作成者の名前を入力していきます。

## 参考

* https://docs.ckan.org/en/2.9/extensions/tutorial.html#creating-a-new-extension
Githubアカウントの作成方法（2021年7月時点）

## ステップ1　Githubにアクセス

https://github.com/


## ステップ2　メールアドレス登録
使用するPC用メールアドレスを記入の上、「Signe up for Github」 をクリック

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216883/3f686ba7-0409-2d42-12c6-38b6000499ae.png" width="500">


## ステップ3　パスワード設定
パスワードを8文字以上15文字以下の、半角英小文字と数字の2種類を組み合わせて作成。
正しく作成できたら 「Continue」のボタンが緑色になるので、クリックしパスワード設定完了

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216883/a48ccb51-6043-4855-436a-420fbc7bae66.png" width="500">

## ステップ4　ユーザーネーム（アカウント）の設定
ユーザーネームを半角英小文字で自由に作成。
利用可能な場合　「●● is available」と表示され、 「Continue」のボタンが緑色になるので、クリックし設定完了
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216883/6317ac2a-21ca-a5e8-8e10-5f5266feaffc.png" width="500">

## ステップ5 Githubからのお知らせについて回答
Githubからのお知らせを希望する場合は「y」を、希望しない場合は「n」を記入。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216883/367652c9-d622-fc46-ded1-2585f4b18114.png" width="500">


## ステップ6 登録メールに届いたコードの登録
登録したメールアドレス宛に、6桁のコードが届くので記入し、アカウント作成完了。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216883/20453a8f-23ae-601d-b687-826dfe334e11.png" width="500">
本番環境を試そうとするとWe're sorry, but something went wrongが出てきてブラウザが開けない

実装したアプリをいざ本番環境で動作確認！と思って

```
git push heroku master
```

```
heroku open 
```

このコマンド入力の流れで開こうと思ったがブラウザが遷移すると

```
We're sorry, but something went wrong
```

こちらのエラー文が出てきた。
直訳すると「申し訳ございません。不具合が発生致しました。」らしく
対処法を調べると

```
heroku run rails db:migrate
```
こちらのコマンドを入力すると解決できるとあったので入力してみると
無事、本番環境のブラウザを開くことに成功！

仮説検証が合っているか分からないが恐らく本番環境でのrails db:migrateが
出来ていなかったためエラー発生し上記のコマンドでエラーが解消したと思っている。
CloudWatch Logs Insightsのbin関数で指定できるperiodの種類

AWSではCloudWatch Logsにたまったログを集計する場合、ElasticSearchなどに連携する以外にCloudWatch Logs Insightsを使って検索することもできます。Insightsのクエリではstats句で簡単な集計を行えるのですが、ここで日付のまるめを行うbin関数の単位(period)についてドキュメントに言及がなかったので試してみました。

[CluudWatch Logs Insights bin関数の定義](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CWL_QuerySyntax.html#:~:text=bin)

例えば、.NET の1日当たりの例外件数を集計したいならこうなりますね。

``` s
filter Level = 'Error'
| stats count(*) by bin(1d)
```

m(分)やh(時)で丸めることはありますが、月で丸めたくなり、おや？？どうするんだろう？あっmonthでいいのか、他に何使えるんだろう？が事の発端でした。
結果このあたりが利用できることが分かりました。一通り試した後にGoogleで検索したら、あっ、Splankと同じ語句が利用できる。とわかって力が抜けました。

| period | 指定する単位 |
|--------|-------------|
| 秒 | s, sec, secs, second, seconds |
| 分 | m, min, minute, minutes |
| 時 | h, hr, hrs, hour, hours |
| 日 | d, day, days |
| 週 | w, week, weeks |
| 月 | m, mon, month, months |
| 期 | q, qtr, qtrs, quater, quaters |
| 年 | y, yr, yrs, year, years |

ms(ミリ秒)も構文エラーにはならず、検索できることもありますが、ブラウザーが応答しなくなったりエラーになったりします。
まぁ、秒以下の集計ってログだと必要なさそうですしね。
【Python】辞書のリスト操作方法

# はじめに

辞書のリストは JSON を読み込むと発生することがしばしばありますが、取り扱いについて毎回調べているので、自分用になりますがまとめておこうかなと思います。


# 辞書のリストとは

辞書（dict）のリスト（list）とは以下のような形式のものです。

```python
dict_list = [
               { 'id': 542, 'name': 'Suzuki', 'gender': 1, 'age': 91 }, 
               { 'id': 231, 'name': 'Saitou', 'gender': 0, 'age': 54 },
               { 'id': 490, 'name': 'Tanaka', 'gender': 2, 'age': 31 }
             ]
```

文字で書くと、、__リスト（list）の要素が 辞書（dict）になっている形式__のことです。


# 辞書のリストのソート

要素である辞書の特定のキーでソートする方法です。

## 昇順

```python
sorted_dict_list = sorted(dict_list, key=lambda x: x['id'])

# sorted_dict_list = [
#                      { 'id': 231, 'name': 'Saitou', 'gender': 0, 'age': 54 },
#                      { 'id': 490, 'name': 'Tanaka', 'gender': 2, 'age': 31 },
#                      { 'id': 542, 'name': 'Suzuki', 'gender': 1, 'age': 91 }
#                    ]
```

## 降順



```python
reverse_dict_list = sorted(dict_list, key=lambda x: x['id'], reverse=True)

# reverse_dict_list = [
#                      { 'id': 542, 'name': 'Suzuki', 'gender': 1, 'age': 91 }, 
#                      { 'id': 490, 'name': 'Tanaka', 'gender': 2, 'age': 31 },
#                      { 'id': 231, 'name': 'Saitou', 'gender': 0, 'age': 54 }
#                     ]
```

## ソート後結果の抽出


```python
dict_list_name = [d.get('name') for d in sorted_dict_list]

# dict_list_name = [ 'Saitou', 'Tanaka', 'Suzuki' ]
```

# 辞書のリストの最大・最小

要素である辞書の特定のキーの最大値・最小値を抽出する方法です。

## 最大

```python
max_dict_list = max(dict_list, key=lambda x: x['age'])

# max_dict_list = {'id': 542, 'name': 'Suzuki', 'gender': 1, 'age': 91}
```


## 最小

```python
min_dict_list = min(dict_list, key=lambda x: x['age'])

# min_dict_list = { 'id': 490, 'name': 'Tanaka', 'gender': 2, 'age': 31 }
```


# 参考
* Pythonで辞書のリストを特定のキーの値に従ってソート
    * https://note.nkmk.me/python-dict-list-sort/
* Pythonで辞書のリストから特定のキーの値のリストを取得
    * https://note.nkmk.me/python-dict-list-values/

---
### 会社紹介

**株式会社 Mosaica**  
最先端テクノロジーで社会課題を解決し、持続可能な未来を創造する IT カンパニー。
AI ソリューション、クラウド統合、DX 推進、経営コンサルティングなど包括的なサービスでビジネス変革を支援しています。  

詳しくは [公式サイト](https://mosaica.co.jp/) までお気軽にご相談ください。
公式サイト： https://mosaica.co.jp/
クロージャ（無名関数）について

#・クロージャ(無名関数)とは
Swift実践入門（p.136）によれば、クロージャとは、再利用可能なひとまとまりの処理を指す。また、関数はクロージャの一種であるため、共通の仕様が数多くある。しかし、クロージャにはクロージャ式という定義方法によって名前が不要であったり、型推論によって型の記述が省略可能であったりと関数よりも手軽に定義することができる。

#・主な使用用途
主な使用用途としては、非同期通信がある。APIにリクエストを飛ばし、帰ってきたレスポンスを処理する際に利用することが多い。

#・定義方法

```swift 
{ (引数名1: 型, 引数名: 型...) -> 戻り値の型 in
    クロージャの実行時に実行される文
    必要に応じてreturn文で戻り値を返却する
}
```

#・実行方法

```swift
let some = { (num : Int) -> Int in
    return num * 10
}

some(10) // 100
```

#・引数の型としてのクロージャ
クロージャ：名前のない関数を変数や定数に代入する。
関数：変数や定数をパラメータとして受け取れる。

ゆえに、関数は、名前のない関数をパラメータとして受け取ることができる。

```swift
let someValue : (Int) -> Int
func someFunction (x: (Int) -> Int) {}
```

#・クロージャのOptional
クロージャ変数にnilが代入されていれば何もしない

```swift
var someClosure : ((Int,String) -> Void)? = nil
someClosure?(100,"yen") //nil
```


クロージャ変数に値（クロージャ）が代入されている場合には実行する

```swift
var someClosure : ((Int,String) -> Void)? = { (value1: Int, value2: String) in
print("\(value1)" + "\(value2)")
 }
someClosure?(100,"yen") //100yen
```
Google Calendar APIでnextSyncTokenが返らないときの対策

EventsなどのList APIでnextSyncTokenがなぜか返ってこないとき、APIの呼び出し方に問題があります。
以下の条件を満たすようにAPIを呼びます。

### nextSyncTokenが返るための条件

- 一部のクエリパラメータを使わない
    - showDeletedをfalseにしたり、timeMinを使うとBad Requestになる
        - `Sync token cannot be used with other request restrictions., syncTokenWithRequestRestrictions`
- pagingしていない
    - クエリ結果の件数が多いとpagingが必要で、代わりにnextPageTokenが返る
    - syncTokenを渡し忘れていると、意図せず結果が多くなりpagingが発生することも

### その他

- 実際は返っているが、名前が似たpageTokenを間違えて参照している
- 結果が0件のときは、同じ値のtokenが返る
- 最新ではないがexpireしていないsyncTokenを使っても正常に返る
    - expireしていると410 Goneが返る

### リファレンス

- [syncToken (request parameter)](https://developers.google.com/calendar/api/v3/reference/events/list#syncToken)
- [nextSyncToken (response field)](https://developers.google.com/calendar/api/v3/reference/events/list#nextSyncToken)
42Tokyoで使われているC言語code linter: norminetteのDocker版を手元で使えるようにする

# TL;DR（これは何？何故Dockerを使うの？）

- 42Tokyoで使われているC言語code linter: norminetteを各自のPC上で動かすまでの流れです
- 各自のPC上でpythonとpipを使ってnorminetteをインストールする必要がないので、python周りのエラーに悩まされる可能性が０になります
  - Dockerはインストールする必要があるけど
- Windows/Mac/Linuxいずれでも動くみたい *Mac以外未確認
  - Windowsの場合は途中に出てくる ```docker run -v $PWD:/code``` の$PWDを%cd%に置き換えると動くらしい


# 前提
- Dockerが必要です。使用しているOSに合わせたものをインストールします。
  - [Mac版](https://docs.docker.com/docker-for-mac/install/)
  - [Windows版](https://docs.docker.com/docker-for-windows/install/)


# norminetteのビルド

- 今回はDockerHubのイメージではなくGitHubで公開されているDockerfileを手元でビルドして使用しています。
  - 現時点でDockerfileに不審な点はありませんが必要に応じて確認してくださいね
  - https://github.com/alexandregv/norminette-docker
  
```
git clone https://github.com/alexandregv/norminette-docker.git
cd norminette-docker
docker build -f v3.Dockerfile -t alexandregv/norminette:v3_localbuild .
```

- ビルド結果確認

```
docker images|grep norm                                                
# 下記のように表示されればOK
alexandregv/norminette                                   v3_localbuild                                           e10a0685fdee   18 minutes ago   216MB
```

# norminetteを使ってみる

- Piscine C01のex00/ft_ft.cをチェックしてみる例です

```
cd ${C00のGitリポジトリをcloneしたディレクトリ}
docker run -v $PWD:/code alexandregv/norminette:v3_localbuild -R CheckForbiddenSourceHeader ex00/ft_ft.c 
# Windowsの場合は$PWDを%cd%に置き換えると動くらしい *手元では未確認

# 手元では下記のように出力されました
ex00/ft_ft.c: Error!
Error: SPACE_BEFORE_FUNC    (line:   1, col:   5):      space before function name
```

- 毎回docker runを打つのは面倒なのでalias登録する
  - bashの場合は.zshrcを.bashrcに置き換えてね

```
$ echo 'alias norm="docker run -v $PWD:/code alexandregv/norminette:v3_localbuild -R CheckForbiddenSourceHeader"' >> ~/.zshrc
$ source ~/.zshrc
$ norm -v
norminette 3.3.1
```

- もう一度ex00/ft_ft.cをチェックしてみる

```
$ norm ex00/ft_ft.c 
ex00/ft_ft.c: Error!
Error: SPACE_BEFORE_FUNC    (line:   1, col:   5):      space before function name
```

これで完了です。おつかれさまでした。
UserDefaultsの場所

# 概要

以下のように`UserDefaults.standard`に値を設定したとします。この値がちゃんとファイルに保存されているのを確認する方法です。

```
	if UserDefaults.standard.string( forKey: "theString" ) == nil {
		UserDefaults.standard.set( "0123456789", forKey: "theString" )
	}
	print( UserDefaults.standard.string( forKey: "theString" )! )
```

# 検証環境

* Xcode 12.5.1

# Simulator の場合

以下にあります。

```
~/Library/Developer/CoreSimulator/Devices/<SimulatorのUDID>/data/Containers/Data/Application/<ApplicationのUDID>/Library/Preferences/<Bundle Identifier>.plist
```

### 見つけ方

シェルでシミュレータのファイルのあるところで、`find`等を使って、`<Bundle Identifier>.plist`というファイルを探します。

```
$ find ~/Library/Developer/CoreSimulator/Devices -name <Bundle Identifier>.plist -print
```

見つかれば以下のように表示されます。

```
./<SimulatorのUDID>/data/Containers/Data/Application/<ApplicationのUDID>/Library/Preferences/<Bundle Identifier>.plist
```


# Device の場合

![スクリーンショット 2021-07-13 3.09.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73493/3f1d4281-f457-f21e-452c-a0cfb95c400d.png)

Xcode -> Window -> Devices and Simulators で Device のメタ情報をみます。

![スクリーンショット 2021-07-13 3.39.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73493/12967cc3-5402-f1db-d6bf-2cc1816cee07.png)

アプリを選択してメニューから Download Container を選ぶとファイル（コンテナ）がダウンロードされます。
ダウンロードされたファイルに対し右クリックでコンテクストメニューを選び「パッケージの内容を表示」でコンテナの中身を表示します。

![スクリーンショット 2021-07-13 3.45.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73493/2514fb0d-835d-1721-80dc-fce590a22141.png)
DeepMind(Google)のPerceiverの記事でわかりやすい思った記事N選　(まだ、N＝2）

# 概要
Jaegle, A., Gimeno, F., Brock, A., Zisserman, A., Vinyals, O., & Carreira, J. (2021). Perceiver: Gneral perception with iterative attention. arXiv preprint arXiv:2103.03206.

Perceiver: General Perception with Iterative Attention
https://arxiv.org/abs/2103.03206

に関する解説でわかりやすいと思った記事を示す。

# 1
Youtube
https://www.youtube.com/watch?v=P_xeshTnPZg
Perceiver: General Perception with Iterative Attention (Google DeepMind Research Paper Explained)
Yannic Kilcher

## 記事の説明
このあたりの技術に関して有名な方。30分弱。**見る価値あるはず。**
（このYoutube自体はよくできているのだと思いますが、論文自体が難しいのと、英語があまりわからないのとの合わせ技で、イライラします。。。笑）

# 2
https://www.slideshare.net/DeepLearningJP2016/dltransformer-vit-perceiver-frozen-pretrained-transformer-etc
【DL輪読会】言語以外でのTransformerのまとめ (ViT, Perceiver, Frozen Pretrained Transformer etc)
2021/03/12
Deep Learning JP:
http://deeplearning.jp/seminar-2/

## 記事の説明
日本語。Perceiver以外も含め、関連技術全体が理解しやすい。

# まとめ
特になし

#関連記事（本人）

[深層学習。DeepMind(Google)のPerceiver(2021.06.23)は面白そう。ただ、もう難しいですね。](https://qiita.com/enoughspacefor/items/d9782a6efba3f0fb2160)

[深層学習。DeepMind(Google)のPerceiverのココが気になる。](https://qiita.com/enoughspacefor/items/da14dfa85f43c0063344)
Radeon VII を水冷化したメモ

## 背景

Radeon VII の保証(購入から 2 年間)も切れたのと, 夏場空冷ではつらいので水冷化しました.

2021 年時点だと, EKWB の水冷ブロックはもう手に入らなかったので, Bykski の水冷(Aliexpress で調達)にしました.

## 参考情報


Radeon VIIのクーラーをEKWBの水冷ブロックに換装しました
https://ch.nicovideo.jp/haml888/blomaga/ar1760161

ありがとうございます.

## Bykski の水冷ブロック

なぜかメーカーサイトにはマニュアルがありません.
また, 実物にもマニュアルが付属していませんでした(なぜかマザーボード向けの水冷のマニュアルが添付されていた) :cry:

Aliexpress に一応マニュアルっぽいのはありました.

https://www.aliexpress.com/item/32980854438.html

## 注意点

マニュアルっぽいのには, Inductor(四角いキューブっぽいやつ) にはサーマルパッド不要とありましたが(元の空冷のファンでもサーマルパッドは付いてはいかなった), 付けないとメモリ温度 95 度になってしまいました(どこかに空きができてしまった模様. 水冷ブロックときちんと密着すればよいと思われるが, 外部から目視で確認はかなり難しい). 上記 EKWB の水冷ブロック感想の URL と同じように, Inductor にもサーマルパッドを貼り付けました.

チップには別途で調達したグリスを塗りました(Bykski のパッケージには含まれていない). 薄いと同様に密着しないかもですので, やや厚めに塗っておくのが吉です.

ネジ穴は一部合わないのがありました. Radeon VII もリビジョン(?)によって微妙にちょっと変わっているようです.

### 二個目

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">ふえぇ... 一年越でやっと Radeon VII x 2 マシンちゃんオール水冷化できたよぉ... 🥺✌️ (空冷運用していた個体がさすがにファンがへたってしまったので水冷化した!) これなら猛暑でも安定ネ. 水冷化したの samsung メモリでは 80 Mh/s @ 135 W 出て優秀ネ <a href="https://t.co/KTE7Zf48Ep">pic.twitter.com/KTE7Zf48Ep</a></p>&mdash; Syoyo Fujita 🌸 レイトラ ® 🐯 4 周年 🎉 (@syoyo) <a href="https://twitter.com/syoyo/status/1543642524874850304?ref_src=twsrc%5Etfw">July 3, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 

こちらでは Thermalright Odyssey の 2mm を使いました.
2mm だとちょっと厚いようで, しっかりネジで締めて密着しないとダメでした. 1.5 mm でもいいかもしれません.

今回は Inductor にはサーマルパッド不要でしたので, 1 個目はたんにきちんとネジを締めていなかっただけかもです.


## 結果

室温 35 度で, 135W に powerlimit した状態で, 空冷ではチップ?(Tedge) 80 度, メモリ 90 度のところ, 水冷ではチップ 53 度, メモリ 65 度に抑えることができました.

https://twitter.com/syoyo/status/1414632069565583372?s=20

## まとめ

Bykski, 一応使えはしますが, できれば EKWB の水冷ブロックをお勧めします(もしくは自前で CNC 加工して水冷ブロック DIY するか).

また, Bykswki のは, アクリルと金属の間で変色か溶け出しっぽいのが発生している感じでした.
(接着剤? 1 年近く運用しましたが特に問題はなさそうです)