OmniAICreator/Qiita-1.07M huggingface dataset:
Heroku のコンテナへpushする時の注意　（メモ）

Winodows 1p Pro (64bit)
Vagrant 2.2.14
Ubuntu 16.04.6 LTS
Docker 18.09.7
ruby:ruby 2.7.2p137 
Herokuのコンテナへ
Dockerイメージをビルドしてコンテナレジストリにビルドしたイメージをプッシュする時に、
以下のエラーが発生した。
````

````

unauthorized: authentication required  
Error: docker push exited with Error: 1

```
プッシュする前に
Heroku container:loginに最初にログインしないといけない。
ログインしてから
````

````
 sudo heroku container:push web -a　アプリ名
````
実行したら無事完了しました。
detached entity passed to persist

###@OneToOneアノテーションの保存

```java
public class Order  implements Serializable{
	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	private Integer id;

	 @OneToOne( fetch = FetchType.EAGER ,cascade = CascadeType.ALL)
     @JoinColumn(name="weddings_tbl_id")
     private WeddingsTbl weddingsTbl;
}

public class WeddingsTbl implements Serializable{
// フィールド省略
}

```

`Orderテーブル`
weddings_tbl_id外部キーを持っている
weddings_tblを参照する

`Weddings_tblテーブル`
外部キーを持っていない


つまり、Orderの中にWeddingsTblエンティティが入っている

###orderRepository.save(order, weddingsTbl)でdetached entity passed to persistが発生する

どうやらorderを保存したいけど、weddingsTblの影響を受けているよう。詳しい原因はわからない。。。（どなたか教えていただければ助かります）


###エラーが発生している箇所

#####コントローラー
```java
orderService.create(order);
```

#####サービス

```java
public void create(Order order, WeddingsTbl weddingsTbl){
  order.setWeddingsTbl(weddingsTbl);
  orderRepository.save(order); // ここでエラーが発生する
}
```


###まずは参照先のテーブルを保存する！

```java
public void create(Order order, WeddingsTbl weddingsTbl){
  weddingsTbl = weddingsTblRepository.save(weddingsTbl); // これを追加
  order.setWeddingsTbl(weddingsTbl);
  orderRepository.save(order); // ここでエラーが発生する
}
```

まずは外部キーで参照している先のWeddingsTblエンティティをデータベースに保存する
saveメソッドで返ってくるweddingsTblをorderにセットする

###EntityManager によって管理されるEntityオブジェクトは、saveメソッドから返却されたEntityオブジェクトになるので注意すること。

参照
https://terasolunaorg.github.io/guideline/5.0.0.RELEASE/ja/ArchitectureInDetail/DataAccessJpa.html#id25

>EntityManager によって管理されるEntityオブジェクトは、saveメソッドの引数に渡したEntityオブジェクトではなく、saveメソッドから返却されたEntityオブジェクトになるので注意すること。

`EntityManager`というのが正直わかりませんｗ
また調べます。

###EntityManagerの管理化かどうかが大事みたい
EntityManagerというものがなにかもわかっていない状態なので、DB取得、更新などの操作をするときにエラーが発生するのだろうと思います。

今回に関しては

引数のweddingsTblと
saveメソッドの返り値のweddingsTblは

違うものだということ！！
SAML Federated User で AWS CLI を使用するための便利スクリプト

AWS マネジメントコンソールを SAML フェデレーションによる SSO で利用している場合、その権限で AWS CLI を利用するのは簡単ではない。

そもそも Role が一時的に割り当てられているだけであって IAM User を作成しているわけではないので Credentials を作成することができない。AWS CLI を利用するためには AssumeRoleWithSAML という API を使って一時的な Credentials を都度要求しなければならない。

詳しいことは以下に書いた。

[SAML 認証による一時的な認証情報で boto3 を利用する - Qiita](https://qiita.com/hoto17296/items/126352a43e9749d510b5)

上記は Python でやる場合の話だったが、今回は同じことを Bash でやれるようにスクリプトを書いたのでそれについてメモしておく。

## スクリプト
`aws` コマンドと `jq` コマンドはあらかじめインストールしておく必要がある。

``` sh:aws_assume_role_with_saml.sh
#!/bin/bash -eu

if !(type "aws" > /dev/null 2>&1) || !(type "jq" > /dev/null 2>&1); then
  echo "This script requires the 'aws' and 'jq' commands." 1>&2
  echo "Please install them." 1>&2
  exit 1
fi

SSO_AUTHENTICATION_URL=$(aws configure get sso_authentication_url || true)
if [ -n "${SSO_AUTHENTICATION_URL}" ]; then
  echo -e "Open this URL in your browser to get the SAML Response string.\n${SSO_AUTHENTICATION_URL}\n"
fi

read -n 8192 -p "SAML Response: " SAML_RESPONSE

CONFIG_PATH="${HOME}/.aws/assume-role-with-saml-config/${AWS_PROFILE:-default}.yml"
CREDENTIALS=$(aws sts assume-role-with-saml --cli-input-yaml "$(cat ${CONFIG_PATH})" --saml-assertion ${SAML_RESPONSE})

echo -e "\nSucceeded!\nAdd the below to '~/.aws/credentials'.\n"

echo "[${AWS_PROFILE:-default}]"
echo "aws_access_key_id = $(echo ${CREDENTIALS} | jq -r .Credentials.AccessKeyId)"
echo "aws_secret_access_key = $(echo ${CREDENTIALS} | jq -r .Credentials.SecretAccessKey)"
echo "aws_session_token = $(echo ${CREDENTIALS} | jq -r .Credentials.SessionToken)"
```

## 初期設定
`~/.aws/assume-role-with-saml-config/<PROFILE>.yml` に AssumeRoleWithSAML API で必要となる Role ARN や IdP ARN などを設定しておく。

``` yaml:~/.aws/assume-role-with-saml-config/myaccount.yml
RoleArn: arn:aws:iam::000000000000:role/Google-User
PrincipalArn: arn:aws:iam::000000000000:saml-provider/Google
DurationSeconds: 43200 # 12 hours
```

`~/.aws/config` に SSO の認証 URL を設定しておくと、スクリプト実行時に URL が表示されて便利。(設定しなくてもいい)

``` :~/.aws/config
[profile myaccount]
region = ap-northeast-1
sso_authentication_url = https://accounts.google.com/o/saml2/initsso?idpid=xxxxxxxxx&spid=0000000000000&forceauthn=false
```

## 使い方
``` console
$ AWS_PROFILE=myaccount ./aws_assume_role_with_saml.sh
Open this URL in your browser to get the SAML Response string.
https://accounts.google.com/o/saml2/initsso?idpid=xxxxxxxxx&spid=0000000000000&forceauthn=false

SAML Response: (とても長い文字列を入力する)

Succeeded!
Write the following in '~/.aws/credentials'

[myaccount]
aws_access_key_id = ...
aws_secret_access_key = ... 
aws_session_token = ...
```

実行すると SAML Response の入力を要求されるので、Web ブラウザを使って SAML Response を取得して入力する。[^saml_response]

[^saml_response]: [トラブルシューティングのためにブラウザで SAML レスポンスを表示する方法 \- AWS Identity and Access Management](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/troubleshoot_saml_view-saml-response.html)

成功した場合は一時的な Credentials が表示されるので、これを `~/.aws/credentials` に追記すれば AWS CLI が使えるようになる。
BitriseでDanger動かすときはDANGER_GITHUB_API_TOKENのExpose for Pull RequestsをONにしないといけない！

BitriseでDangerが動かないなと思ったらログを見て、`For your GitHub repo, you need to expose: DANGER_GITHUB_API_TOKEN`の表記があったら以下をお試しください。

BitriseでDanger動かすときはDANGER_GITHUB_API_TOKENのExpose for Pull RequestsをONにしないといけない！

![スクリーンショット 2021-01-26 13.53.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70276/f2b6ade9-169d-9333-b48a-9aa1a9ced37a.png)

※すでに作成済みの場合はDeleteしてからじゃないと変更できない可能性あり。
Windowsでnanoエディタを使う

#1. Chocolateのインストール
windows用パッケージマネージャーのchocolateをインストールします.
管理者権限でpowershellを開き、

```powershell
Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))
```

を実行します.

#2. nanoのインストール

```
 choco install -y nano
```
を実行します.

##nanoが使えるようになりました！
Wordpress REST APIでpost_meta(カスタムフィールド)も同時に投稿する

投稿側の機能

```post.php
function post_article($status,$slug,$title,$category_ids,$tag_ids,$image,$date){
    
    $WP_URL = 'http://example.com/wp-json/wp/v2/cutom_post_type'; 
    $WP_USERNAME = 'user';
    $WP_PASSWORD = 'pw';

    //記事投稿
    $response = wp_remote_post($WP_URL, array(
        'headers' => array(
            'Authorization' => 'Basic ' . base64_encode($WP_USERNAME.':'.$WP_PASSWORD),
            'Content-Type: application/json'
        ),
        'body' => array(
              "status"=> $status,
              "slug"=> $slug,
              "title"=> $title,
              "date"=> $date,
              "categories"=> $category_ids,
              "tags"=> $tag_ids,
              "featured_media"=>$media_id,
              "post_meta"=>array(    // functions.php側で「rest-apiに追加するキー」に設定したもの
                 //ここ
                'custom_field1'=>"a",
                'custom_field2'=>"b"
              )
        )
    ) );
}
```


functions.php側にもpost_metaをAPIで利用可能にする拡張が必要


```functions.php
function rest_post_meta(){
  register_rest_field(
    'custom_post_type',        // post type
    'post_meta',               // rest-apiに追加するキー
    array(
      'get_callback'  => function(  $object, $field_name, $request  ) {
        $meta_fields = array(
		    'custom_field1',   
		    'custom_field2'
            );
            $meta = array();
            foreach ( $meta_fields as $field ) {
                $meta[ $field ] = get_post_meta( $object[ 'id' ], $field, true );
            }
            return $meta;
        },
        'update_callback' => function(  $value, $post, $field_name) {
        	if (!$value) {return;}
  			foreach($value as $key => $data){
    			if(is_array($data)){
      				foreach($data as $record){
        				add_post_meta($post->ID, $key, $record);
      				}
    			}else{
      			add_post_meta($post->ID, $key, $data);
    			}
  			}
        },
        'show_in_rest'    => true,
      	'schema'          => null,
    )
  );
}
add_action( 'rest_api_init', 'rest_post_meta' );
```
【Swift】クロージャ

#はじめに
この記事では、Swiftのクロージャについてまとめました。
⚠️当方初学のため認識違いがある可能性大です
誤りを見つけた際はコメントにて指摘していただけると幸いです🙇‍♀️🙇‍♂️


#参考
この記事は、以下の記事を参考にして作成しました。

 - [クロージャまとめ](https://qiita.com/Howasuto/items/eba4cb4b6d3e6bde0a17)
 - [【Swift入門】クロージャの使い方をわかりやすく解説！
](https://www.sejuku.net/blog/34503)


#クロージャとは
クロージャとは、スコープ内の変数や定数を保持したひとまとまりの処理。
また、クロージャは関数の一種であり再利用可能。
クロージャはクロージャ式で定義し、名前が不要であったり型推論によって型の記述が省略できたり関数より比較的軽量化して定義できる。


#基本的な使い方

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

上記がクロージャ式の雛形。
処理が複数ある場合returnの記述が必要だが、処理が一つしかない場合省略できる。
引数や返り値がVoid型なら以下のように型名の記述を省略できる。

```
{() -> () in }
```
既存プロジェクトの.NET Core 3.1から.NET5への移行

この記事では.NET Core 3.1から先日公開された.NET5に移行するための手順を書いています。
Visual Stdioでの移行方法の記事は結構ありますが、Riderを使っているものがあまりなかったため書き残しておきます。（そんなに変わりませんが）
ビルド＆実行が最終目標となります。

##環境
OS:macOS Catalina 10.15.7
IDE:JetBrains Rider 2020.3.2

#Riderのアップデートをする
自分がそうだったのですが、.NET5リリースより前のバージョンを使用している場合アップデートが必要になります。
GUI内からアップデートしてもいいですが、この際IntelliJ公式がリリースしているToolboxを入れておくのがオススメです。
https://pleiades.io/help/rider/Update.html

#.NET SDKをインストールする
以下のページから自分の環境にあった.NET5のSDKをダウンロード、インストールしましょう。
https://dotnet.microsoft.com/download/dotnet/5.0

※ランタイムはSDKに内包されているので必要ありません。


#プロジェクト内の.csprojファイルを編集する
ここからはRider内での作業です。
.csprojファイルの`<PropertyGroup>`内を以下のように編集します。

```XML:
<Project Sdk="Microsoft.NET.Sdk.Web">

    <PropertyGroup>
        <TargetFramework>net5.0</TargetFramework>
    </PropertyGroup>

</Project>
```

WinFormのプロジェクトの場合は以下のようにするそうです。（使っていないので文献より引用です）

```XML:
<Project Sdk="Microsoft.NET.Sdk.Web">

    <PropertyGroup>
        <TargetFramework>net5.0-windows</TargetFramework>
    </PropertyGroup>

</Project>
```

#.csprojなんてないよ！
左上のほうにあるSolutionというセレクトボックスをFile Systemにしてから各プロジェクトを開いてみてください。
![スクリーンショット 2021-01-26 13.00.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855584/4245ce62-a138-2803-22c4-eac8edad2f9d.png)

#ビルド&実行してみる
最後に`Control+R`でもビルドボタンでもいいのでとりあえずビルドしてみる。
普通に実行できたらOKです。お疲れさまでした。

#なんかすごいエラーでてきたんだけど！
###依存関係を確認する
ここがRiderで移行に躓くところかもしれません。
自分の場合一つのソリューション内に何個かプロジェクトを作ったものを移行したのですが、.NET5導入と同時に依存関係が崩れました。（環境によると思います）
Riderでの依存関係の注入は以下のようになります。
各プロジェクトDependencies内の.NETCoreApp5.0を右クリックし、AddReferenceから依存関係を持ちたいプロジェクトをAddすることで注入できます。
![スクリーンショット 2021-01-26 13.10.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855584/32d571af-e9e1-0d16-a007-b374db22b7b1.png)


以上です。

##参考
祝 .NET 5.0 リリース: .NET Core 3.1 からの移行話 | ++C++; // 未確認飛行 C ブログ 
https://ufcpp.net/blog/2020/11/net5_0ga/ 
.NET Frameworkから.NET5への移植作業(Windows Formsの場合)
https://imagingsolution.net/program/csharp/dotnet5_windows_forms/dotnetframework2dotnet_winforms/
【Kotlin】GitHub Action を使って ktlint + reviewdog でプルリクエストをレビューする

# はじめに
[action-ktlint](https://github.com/ScaCap/action-ktlint) というリポジトリの紹介になります。とても良かったのですが、あまり有名ではないようだったので紹介させていただきます。

# 紹介

## GradleTask より早い
Gradle のタスクを実行するのではなく、最新の ktlint のリリースから実行ファイルをダウンロードして実行します。そのため、Gradle 環境を整えてから ktlintCheck タスクを実行するよりも高速でした。私のプロジェクトで導入してみたところ、元々2分以上かかっていた ktlint タスクが45秒程度で終わるようになりました。

## 分かりやすい

以下のような表示方法を選択できます。とても分かりやすいです。

| ![](https://github.com/ScaCap/action-ktlint/raw/master/github-pr-check.png) | ![](https://github.com/ScaCap/action-ktlint/raw/master/github-pr-review.png) |
|:-:|:-:|
| **github-pr-check** | **github-pr-review** |

[README.md#examples](https://github.com/ScaCap/action-ktlint#examples)

## 導入しやすい

[README.md#example-usage](https://github.com/ScaCap/action-ktlint#example-usage) の内容を貼り付けるだけで問題なく動作します。内部で最新版の ktlint を使用してくれるのも良いですね。

```yml:.github/workflows/reviewdog.yml
name: reviewdog
on: [pull_request]
jobs:
  ktlint:
    name: Check Code Quality
    runs-on: ubuntu-latest

    steps:
      - name: Clone repo
        uses: actions/checkout@master
        with:
          fetch-depth: 1
      - name: ktlint
        uses: ScaCap/action-ktlint@master
        with:
          github_token: ${{ secrets.github_token }}
          reporter: github-pr-review # Change reporter
```

## ルールセットは利用できない？
Android Kotlin Style Guide の有効化は行うことができるのですが、独自のルールセットには対応していないようです。

# まとめ
GitHub Action を使えば簡単にコードのチェックも行うことができます。是非、[action-ktlint](https://github.com/ScaCap/action-ktlint) を導入してみてはいかがでしょうか。
Fess ファイルクロール及び全文検索の実施

[Windows OS への Fess + 外部 Elasticsearch 導入手順](https://qiita.com/naente_dev/items/1548a56a25a5c565edc7) の続き。

# サンプルデータ
動作確認用として `C:/fess-search/` 配下に以下のようなファイルを作成した。

- 夏目漱石_吾輩は猫である.pdf
- 夏目漱石_坊っちゃん.docx
- 太宰治_人間失格.docx
- 芥川龍之介_羅生門.pdf
- 芥川龍之介_トロッコ.docx

中身の文書は青空文庫より拝借。

# クローラーの設定
http://localhost:8080/login/
管理画面にログインする。

今回はファイルに対してのクロールが可能な「ファイルクロール」を試す。
「ウェブクロール」については割愛する。

https://fess.codelibs.org/ja/13.9/admin/fileconfig-guide.html
クローラ ＞ ファイルシステム ＞ 新規作成

|項目|設定値|
|---|---|
|名前|任意|
|パス|file:/C:/fess-search/|
|クロール対象とするパス|file:/C:/fess-search/.*|
|検索対象とするパス||
|深さ|1|
|スレッド数|5|
|間隔|1000|
|ブースト値|1.0|
|パーミッション|{role}guest|
|状態|有効|

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243093/97a5fa29-be4f-c6f0-aad8-5512fb690c01.png)

検索対象のディレクトリ階層に応じて、深さの値は設定する。

# クロールの実施
![search02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243093/600a6633-3e38-4c6a-0da2-ba15d4ec59b6.png)
システム ＞ スケジューラ ＞ Default Crawler ＞ 今すぐ開始

![search03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243093/23a22da6-a4b6-54ec-5d24-b5956222fed8.png)
![search04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243093/78b9df52-55a2-eaa9-3496-ad5103da7b8d.png)
システム情報 ＞ ジョブログ
状態が実行中から OK に変化すればクロール完了

![search05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243093/6ea2a42e-5e0c-2098-ce80-d41d83ad50ac.png)
システム情報 ＞ クロール情報
インデックスのサイズ（ウェブ/ファイル）にインデックスされたファイル数が表示されている

## クロール結果の自動削除設定
https://news.mynavi.jp/itsearch/article/bizapp/3341
> 有効期限の変更
Fessでは、クロール時にインデックスしたデータに、有効期限を設定しています。標準では3日が設定されているため、3日後には収集したデータが削除されます。削除されないようにするためには、管理画面から「全般」のクローラの設定で「以前のドキュメントを削除」の値を-1日に設定してください。

クロール結果を永続的に検索対象として残す場合には上記、設定変更が必要。

## 特定の拡張子のみをクロール
PDF ファイルのみを対象にクロールさせる場合は以下を追加する。
 
|項目|設定値|
|---|---|
|検索対象とするパス|.*\\.pdf$|

# 全文検索の実施
http://localhost:8080/
Fess 検索画面より検索を行い、インデックスの正常性を確認する。

**ファイル名検索**
![search07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243093/5b3e3004-8477-41bb-1d7b-cb3efeb00cc2.png)
**ファイル名（拡張子）検索**
![search06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243093/74aa70ae-bb38-6e86-917b-851d149c7c08.png)
**文書内検索**
![search08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243093/19d3b4bf-5abb-48f5-3169-9a5031d8168d.png)

# インデックスの削除
システム情報　＞　検索

フォームに `url:"file:/C:/fess-search/*"` のように入力して検索を実施するとクロールの蓄積情報が表示される。
適宜、削除を行うことで全文検索にヒットしなくなる。
![search09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243093/1cd1e9bc-3924-b717-8aa9-7d69090672d7.png)
Unityのvideo-glitchesが良い感じ

#はじめに

ゲームで使う画面用のエフェクトを探していました。
ドット絵で作られるいわゆるレトロゲームライクなグリッチと言われるようなカメラが壊れたような画面エフェクトが欲しく、色々と探していたのですが、いくつか試してみたのでその覚書です。

#今回試してみたエフェクト

video-glitches
https://www.nephasto.com/store/video-glitches.html

他にも、などが候補となりましたが、
価格が$20と比較的お手頃であったのでvideo-glitchesを利用しました。

他の候補
Post Processing
https://styly.cc/ja/tips/unity_postprocessing_master/

KinoGlitch
https://github.com/keijiro/KinoGlitch

自分で作る方法など
https://r-ngtm.hatenablog.com/entry/2019/01/23/081547

#導入
##1.Unityのアセットストアで購入する
(2021/01/10時点では$20でした)
https://assetstore.unity.com/packages/vfx/shaders/fullscreen-camera-effects/video-glitches-40474?locale=ja-JP

##2.downloadする
![スクリーンショット 2021-01-16 15.19.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43766/390fe5bd-b44f-b0e1-229f-24a6155646e2.png)

##3.importする
![スクリーンショット 2021-01-16 15.19.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43766/209401de-f11b-23f9-b03a-6f616b80638e.png)

##4.Cameraにマッピングする

##5.スクリプトから制御する


```
//例 VideoGlitchNoiseDigitalのThresholdを変更する場合

using Nephasto.VideoGlitchesAsset;

GameObject Mycamera;
void Start()
{
	Mycamera = GameObject.FindGameObjectWithTag("MainCamera"); 
	Mycamera.gameObject.GetComponent<VideoGlitchNoiseDigital>().Threshold = 0.5f;
}

```


#Conclusion
今回は、iOS用のアプリとWebGL用に書き出しを行いましたが、現状では非常に良い感じに動いております。
付属のドキュメントも非常に詳細でわかりやすいため、オススメです。
BERTで行う文章分類 PART5 （PytorchのDataLoaderとDataset編）

この章では、PytorchのDatasetとDataLoaderについて解説していきます。
この章は**https://gotutiyan.hatenablog.com/entry/2020/04/21/182937** を参考に記述されています。
Pytorchでは、DatasetとDataLoaderを用いることで、簡単にミニバッチ化をすることができます。

# Datasetの実装
DataSetを実装する際には、クラスのメンバ関数として__len__()と__getitem__()を必ず作ります。

__len__()は、len()を使ったときに呼ばれる関数です。
__getitem__()は、array[i]のように[ ]を使って要素を参照するときに呼ばれる関数です。これが呼ばれる際には、必ず何かしらのindexが指定されているので、引数にindexの情報を取ります。また、入出力のペアを返すように設計します。

以上を踏まえて、Datasetを作成してみましょう。

```Python
class DataSet:
    def __init__(self):
        self.X = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] # 入力
        self.t = [0, 1, 0, 1, 0, 1, 0, 1, 0, 1] # 出力

    def __len__(self):
        return len(self.X) # データ数(10)を返す

    def __getitem__(self, index):
        # index番目の入出力ペアを返す
        return self.X[index], self.t[index]
```
さて、実際にこのDataSetがどのような振る舞いをするか試してみましょう。

```Python
dataset = DataSet()
print('全データ数:',len(dataset))  # 全データ数: 10
print('3番目のデータ:',dataset[3]) # 3番目のデータ: (3, 1)
print('5~6番目のデータ:',dataset[5:7]) # 5~6番目のデータ: ([5, 6], [1, 0])
```

# DataLoaderの実装
バッチサイズを2、訓練時のデータのシャッフルをFalseとした実装は以下のようになります。

```Python
# さっき作ったDataSetクラスのインスタンスを作成
dataset = DataSet()
# datasetをDataLoaderの引数とすることでミニバッチを作成．
dataloader = torch.utils.data.DataLoader(dataset, batch_size=2, shuffle=False)
```
これでミニバッチ学習をする準備が整いました。
ミニバッチ用のデータはfor文で取り出すことができます。

```Python
for data in dataloader:
    print(data)

'''
出力:
[tensor([0, 1]), tensor([0, 1])]
[tensor([2, 3]), tensor([0, 1])]
[tensor([4, 5]), tensor([0, 1])]
[tensor([6, 7]), tensor([0, 1])]
[tensor([8, 9]), tensor([0, 1])]
'''
```

上記のdataloaderを用いて、10epoch学習をする場合には以下のように書けます。

```Python
epoch = 10
model = #何かしらのモデル
for _ in range(epoch):
    for data in dataloader:
        X = data[0]
        t = data[1]
        y = model(X)
        # lossの計算とか
```

PytorchのDatasetとDataloaderについての説明は、以上になります。
slackをプロキシ越えで使う設定でちょっと引っかかったこと

先日，いまさらですが社内でslackを使い始めることにしました．
社内のネットワークからの通信はすべてプロキシを通すようにしています．
この環境でslackを使おうとしたときちょっと引っかかったことがあり，ここに書かせていただきます．

発生したのは__メッセージが自動的に更新されない__という現象です．
要するに WebSocketでの通信がうまくいっていないのですが，はじめはその原因がわかりませんでした．[Slack 接続をテストする](https://my.slack.com/help/test)

結局わかった原因はプロキシ自動設定(PAC)でした．
slackではwssスキームでWebSocket通信をおこないます．
PACファイルにはスキームやホストによってどのプロキシをどのように使うか(あるいは使わないか)を記述しますが，そのなかにwssスキームが書かれていなかったためプロキシを使わず直接接続しようとしていたというのが理由です．
どうしてプロキシを通れないのだろう，とばかり考えていて__そもそもプロキシを通ろうとしていない__，という可能性に気づかなかったのが間抜けでした(普段ならまず netstat と指が動くのに．．)．

```JavaScript:settings.pac
function FindProxyForURL(url, host) {
    var http_proxy = "PROXY http-proxy.example.com:8080";

    if(url.substring(0,5) == "http:" ||
       url.substring(0,6) == "https:" ||
        url.substring(0,4) == "wss:" ) {
                return http_proxy;
    }
    return "DIRECT";
}
```
(記述は大幅にはしょっています)

後になって考えてみればそれぞれ説明がつくのですが，当初はOSやアプリケーションによってWebSocketでの通信ができてみたりできなくてみたり，の不規則挙動に見え，切り分けに困りました．
あまり一般的ではないケースのようで，調べる中でGoogle等でも解決に近づける情報にいきあたりませんでしたので，記事に書かせていただくことにしました(ブログにでも書いたほうが適当だと思いますが，ブログをもっていないものでごめんなさい)
どなたかのお役に立てばうれしいです．

- - -
_プロキシ_ _ネットワーク_ のタグ追加のサジェスチョンをいただきました。
_プロキシ_ については _proxy_ の方が既存のタグ付けが多数であること、検索上は _プロキシ自動設定_ でひっかかることから不要と判断していました。
_ネットワーク_ については、個人的にはspecificでなさすぎるように感じますが追加しておくことにします。
データ処理のCI/CDパイプライン

## 
本記事は以下GCPの文章をベースに整理したものです。
https://cloud.google.com/community/tutorials/cicd-datalake-part-1


![cicd-datalake-part-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544279/88971a9c-1619-3e21-ea60-db5b96f0102a.png)
[Jenkins] MacOS CatalinaでJenkins経由でのGit LFS Error問題の解消

# はじめに
Mac CatalinaでJenkinsの構築をした際にハマったポイントとして、
Git LFSが通らない問題があったので忘却録です。
Error内容 : `stderr: git-lfs filter-process: git-lfs: command not found`

Catalinaから`root`ユーザーでもアクセス権を得ることができないシステム整合性保護`SIP`(System Integrity Protection)という機能が邪魔をしていた。
これを解決する為にはMacのリカバリーモードで起動しSIPの無効化をする必要がある。

## リカバリーモードで起動
①、電源をOFF
②、`cmd + R`を押下しながら電源ON
③、該当のユーザーでログイン
④、画面上部のメニューバーの`ユーティリティ`の`ターミナル`を選択
⑤、`csrutil disable`を入力

``` 成功し、SIPが無効化.
Successfully disabled System Integrity Protection. Please restart the machine for the change to take effect.
```
⑥、 通常ユーザーで再起動し直す
⑦、`sudo mount -uw /` 入力
⑧、`sudo ln -s /usr/local/bin/git-lfs /usr/bin/` 作成

これでGIT LFSが使えるようになってるはずです。
BERTで行う文章分類 PART4 （Early Stopping編）

この章は**深層学習 (アスキードワンゴ)** と **https://github.com/Bjarten/early-stopping-pytorch** を参考に書かれています。

十分な表現要領を持つ大きなモデルを訓練して、あるタスクに対して学習するとき訓練誤差は減少するが、検証誤差が再び増加し始めることがあります。
そこで、検証誤差が改善されるたびに、モデルを保存することにします。
一定のエポック数検証誤差が改善されない場合、学習は終了します。

![es.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1053943/70c84cac-4763-881d-c09b-f7cdd4e58382.jpeg)


コードは以下のようになります。

以下のコードをearlystopping.pyとして保存してください。

```Python:earlystopping.py
import numpy as np
import torch

class EarlyStopping:

    def __init__(self, patience=7, verbose=False):
        
        self.patience = patience
        self.verbose = verbose
        self.counter = 0
        self.best_score = None
        self.early_stop = False
        self.val_loss_min = np.Inf
        self.force_cancel = False

    def __call__(self, val_loss, model):
        
        score = -val_loss

        if self.best_score is None:
            self.best_score = score
            self.save_checkpoint(val_loss, model)
        elif score < self.best_score:
            self.counter += 1
            print(
                f'EarlyStopping counter: {self.counter} out of {self.patience}')
            if self.counter >= self.patience:
                self.early_stop = True
        else:
            self.best_score = score
            self.save_checkpoint(val_loss, model)
            self.counter = 0

    def save_checkpoint(self, val_loss, model):
        
        if self.verbose:
            print(
                f'Validation loss decreased ({self.val_loss_min:.6f} --> {val_loss:.6f}).  Saving model ...')
        torch.save(model.state_dict(), 'models/model.pth')
        self.val_loss_min = val_loss
```
【Corda】RPCOpsのコマンドまとめ

どーも、のぶこふです。
今回は忘れがちな「Corda RPC Ops」のコマンドを軽くまとめます。

## つかうモジュール
使用するモジュールは、おなじみのCordapp-Template-Kotlinです。が、特に関係はありません。各自の

## Commands
使用例と実行結果を載せていきます。
詳細については、[ドキュメント](https://api.corda.net/api/corda-os/4.7/html/api/kotlin/corda/net.corda.core.messaging/-corda-r-p-c-ops/index.html)を参照ください。

### networkMapSnapshot
```
>>> run networkMapSnapshot
- addresses:
  - "localhost:10002"
  legalIdentitiesAndCerts:
  - "O=Notary, L=London, C=GB"
  platformVersion: 5
  serial: 1598245871176
- addresses:
  - "localhost:10008"
  legalIdentitiesAndCerts:
  - "O=PartyB, L=New York, C=US"
  platformVersion: 5
  serial: 1598245870743
- addresses:
  - "localhost:10005"
  legalIdentitiesAndCerts:
  - "O=PartyA, L=London, C=GB"
  platformVersion: 5
  serial: 1598245870336
```

### nodeInfo
```
>>> run nodeInfo
addresses:
- "localhost:10002"
legalIdentitiesAndCerts:
- "O=Notary, L=London, C=GB"
platformVersion: 5
serial: 1598245871176
```

### notaryIdentities
```
>>> run notaryIdentities
- "O=Notary, L=London, C=GB"
```

### stateMachinesSnapshot
kill flow を実行するときに使用する。
デッドロックなどにより、止まってしまっているTxの情報が表示される。

```
// なにも無い場合
>>> run stateMachinesSnapshot
[]

// 該当するTxがある場合
- id: "12345678-1234-1234-1234-123456789012"
  flowLogicClassName: "com.XXX"
  initiator:
    party: "O=XXX, L=XXX, C=XXX"
  ・・・
```

### killFlow
```
// <StateMachineID>には、上記「stateMachinesSnapshot」で取得したIDを指定する
>>> run killFlow id : <StateMachineID>
true
```

## 別Command
### flow list
```
>>> flow list
com.template.flows.IOUFlow
com.template.flows.SendFlow
net.corda.core.flows.ContractUpgradeFlow$Authorise
net.corda.core.flows.ContractUpgradeFlow$Deauthorise
net.corda.core.flows.ContractUpgradeFlow$Initiate
```

## おわりに
まだまだコマンドはありますが、一旦、日常的に使いそうなここまで。
ありがとうございました。
virtual instance 上で docker-compose した時の　ERROR: Couldn't connect to Docker daemon at http+docker://localunixsocket - is it running?　エラー回避備忘録

## 概要

azure 上につくったvirtual instance にdocker, docker-compose などをインストールし、
docker-compose を実行しようとすると

```
ERROR: Couldn't connect to Docker daemon at http+docker://localunixsocket - is it running?
```
となった。


## 解決策

https://qiita.com/dnnnn_yu/items/14a31721a2870b735938
ここで言及されているように、

docker, docker-compose にそれぞれ権限を付与する必要がある。
再ログインする必要があることに注意。

```
$ sudo usermod -aG docker $USER
$ sudo chmod +x /usr/local/bin/docker-compose
```
JavaScript Promise を return するときに値も return したい

これも忘れそうだからメモっておこう

関数でpromiseをreturnすると、受け取った側でthenできるけど、そしたらどうやってpromiseじゃない値をreturnするの？という疑問

答えは `resolve(ここに渡したい値をobjectにまとめて書く) `; 


# (a) awaitで受け取る

awaitをチェーンするのはおすすめしないので、エラー処理にはtry..catchが必要。

```html
<script>

const worker = async () => {
        // Promiseをreturnします。そのPromiseの中に resolve()した内容が入ってる＝結果として `返り値を持ったPromise` がreturnされます
	return await new Promise((resolve) => {        // Promiseをreturn
		setTimeout(()=>{
			resolve({
				status: `success`,  //<------Promiseに持たせる戻り値をresolve()で指定する
				other1: `...`,
				other2: `...`
			});
		}, 1000)
	});
}

// awaitを中で使うので、この start() は async で宣言する
const start = async () => {
	try {
		const p = await worker();           //<------この p で受け取ってるよ
		console.log(`status=${p.status}`);   //<------受け取ったpを使える
	} catch(e) {
		console.log(e);
	}
}

start();

</script>
```


## result

```ruby
{status: "success"}
```

# (b) thenで受け取る

```html
<script>

const worker = async () => {
	return await new Promise((resolve) => {  // Promiseをreturnします。
		setTimeout(()=>{
			resolve({
				status: `success`, //<------関数が任意の戻り値を返す、resolve()が returnだと思ってください
				other1: `...`,
				other2: `...`
			});
		}, 1000)
	});
}

// awaitを中で使うので、この start() は async で宣言する
const start = async () => {
	worker().then((p) => {                      //<------この p で受け取ってるよ
		console.log(`status=${p.status}`);         //<------受け取ったpを使える
	}).catch((e) => {
		console.log(e);
	});
}

start();

</script>
```

# result

```ruby
{status: "success"}
```


---
JavaScript Promiseの実行タイミング Promise.start() とか Promise.execute() 的なもの
https://qiita.com/uturned0/items/6f19b32ec1154e63b453
JavaScript Promise, await, Promise.all() 周りのメモ。一部処理だけ待ちたい/同期させたい場合 etc
https://qiita.com/uturned0/items/74ff00cbef3290d0aed2
PromiseとAwaitの違い、Promiseで勘違いしたこと
https://qiita.com/uturned0/items/d68ba5d771e536489c40
CSSフレームワーク(KUROUTO Kit)を作って公開してみました

# CSSフレームワーク
CSSフレームワークと言うと、やはり`BootStrap`が一番有名ですかね。
自分としては`UIkit`がデザイン的に好きだったりしますが。
有名どころを色々と使ってみて`UIkit`に落ち着いたものの、やはり毎回カスタムなどは必要になってくるので、なら自分なりのCSSフレームワークを作ってみようと。
＃あと国産(日本産)のCSSフレームワークがあまり無いなーと思い。

# KUROUTO Kit
上記のような経緯で開発を始めたので、製作者の好みに忠実なCSSフレームワークに仕上がっています(笑)
なので、結構とんがった仕様になっているのではないかと。
画面開発をしながら必要なパーツから整備していっているので、まだまだ使えるCSS定義も少ないです。
あと、オリジナルとはいえ既存のCSSフレームワークを参考にしているので、おそらくUIkitの影響を一番受けています。

一旦公開できる程度には整備できたので、公開してみることにしました。（継続して絶賛開発中です！
気に入ってくれる方が居れば、是非ご利用ください。m(_ _)m
＃選択肢の一つとなれれば嬉しい限りです。

https://playree.github.io/kuroutokit/

一応特徴としては、

* 各種CSS定義にカスタムプロパティを採用。  
  カスタムプロパティを上書きすることでデザインのカスタムが容易に。  
  フレームワークを使うことによりデザインが似通ってしまうデメリットの対策にも。
* 基本フォントにWebフォントを採用。  
  各種デバイスでフォントを統一。(もちろん、通常フォントも使えます。)
* クラスで基本コンポーネントを指定し、大きさやデザインなどの違いを属性で指定する形の設計としています。
* 日本語のドキュメント。（整備中ですが。。。

現在WEBアプリを一から開発する機会があり、そこで`KUROUTO Kit`を採用し一緒に育てています。
なので、WEBアプリの開発が終わるころ(2021/08)にはアプリを開発するのに必要最低限な機能は揃う予定です。
現状、`v0.0.2`として公開中。
mongoDBで複数行をインクリメントしたい時

今回は、1つのステートメントで1つのドキュメントに対して複数のmongo更新をする話について紹介します。
(mongo2.4環境)

例えば、カラムaとカラムbの複数行のレコードを`inc`値だけ増やしたい時。


```
db.test.update({"name":"sample_data"}, 
    {$inc:{a:inc}, $inc:{b:inc});
```

このようにして書くと、bの数値だけ増加します。
複数$incを付けた場合、最後のステートメントだけ反映される仕様のようです。
以下のようにして解決します。

```
db.test.update({"name":"sample_data"}, 
    {$inc:{a:inc, b:inc});
```

これで、aとb両方の数値がインクリメントされます。



なお、「この値は増加させて、このフィールドをセットして…」と、`$inc`と`$set`を組み合わせる場合もあるかと思います。
その場合は、*ドキュメントの異なる部分に影響を与える場合は、複数の更新を組み合わせることができます*。

```
db.test.update({"name":"sample_data"}, 
    {$inc:{a:inc, b:inc}, $set{c:"test"});
```

上記は可能ですが、

```
db.test.update({"name":"sample_data"}, 
    {$inc:{a:inc, b:inc}, $set{b:30});
```

このような競合はNG,という話。
競合すると、`have conflicting mods in update` というエラーが出るかもしれません。
長方形の画像データをcanvasで回転させるのにぐだった話

###要件
**``html2canvas``で得た画像データを90度回転させる。**

###詳細
html2canvasはページ一部の領域をhtml,css解読してスクリーンショット取ってくれる神ライブラリ。
今回は作品を紹介するような紹介カードを作れるという機能を実装したが、PC版で最初にやってしまったためスマホで同じサイズ比のカードテンプレートを作ろうと思うと90度回転しなければならなくなった。
![canvasis.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/990851/be1b4578-c1b5-ae98-fd51-0ec0dbcd51d8.png)


``html2canvas``の場合、対象領域の``HTMLelement``を渡すとコールバックで``canvas``を渡してくれるが、この時点で**幅・高さ・向き**は決定してしまっているため、なかなか編集に手こずった。
コンテキストを回転させる方法は``ctx.rotate``という。これは分かっていたのだが、そのまま適応させても``canvas``自体は回転していないのでこうなる ↓
![canvasexif.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/990851/31083c0b-8114-ad78-a9b4-2b7dedc08954.png)

また、canvasのサイズを後から変更すると描画内容も一緒に失われるのでこれも出来ない。

挙句の果てに迷走し、JSで画像データを(canvasでなく)そのままいじれないか！？とか考えてexif周りの事を調べたりもした。当然できなかった。

>JSで画像データをいじる際は必ずcanvasを通して行います。
> ------------ <cite style="text-align:right;">https://ja.javascript.info/blob#ref-122</cite>

~~ちくしょうスマホのトリミング機能使いてぇ......~~

###結果

**新しくcanvasを作り、描画内容は元canvasからコピーしてくる。**

```canvasRotate.js
function canvasRotate270(img){
    const canvas = document.createElement('canvas');
    canvas.width = img.clientHeight;
    canvas.height = img.clientWidth;
    //縦横比反転canvas
    const ctx = canvas.getContext('2d');

    ctx.save();
    ctx.translate(0,canvas.height);
    ctx.rotate( 270 * Math.PI / 180 );
    ctx.drawImage(img, 0, 0,canvas.height,canvas.width,0,0,canvas.height,canvas.width);
    ctx.restore();
    return canvas;
}
```

**canvas・contextの使い方をよく理解していなかった。**
___
###解説
**ctx.drawImageは元画像のある指定領域を切り抜き、貼り付け先画像にも貼り付ける領域を指定できる(元画像データはimgからでなくてもcanvasからでも可。)**
**⇒** よってctx(コンテキスト)の向きが回転していても、``ctx.translate``で中心点ずれててもきちんと座標を指定できれば問題ない。

今回私の場合は270度の回転が必要だったが、<font color="red">中心点</font>(グラフの座標原点みたいなイメージ)をしらべると**canvasの縦横比に関わらず、左上に原点が設定されることが分かった。**

**よって、ctxの回転前にtranslateで描画原点を回転後のcanvasの左上に設定すればいい。**

```canvasRotate.js
ctx.translate(0,canvas.height);
```

![kiji.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/990851/6c9855f5-4404-085a-192c-5e3a247da456.png)

あとはctx.drawImageで元画像（赤矩形）の(0,0)～(x,y)を指定し切り抜き、回転後の青の矩形で(0,0)～(x,y)へ貼り付ける。

```canvasRotate.js
ctx.drawImage(img, 0, 0,canvas.height,canvas.width,0,0,canvas.height,canvas.width);
```
``ctx.rotete``のせいでx,yが反転してることに注意。

~~今考えたら90度でよくね？？~~
___

###まとめ

主に、drawImageの性質の理解が足りていなかった。本質は画像のコピーと貼り付けを同時に行えるクリップ機能だった。
これとtranslateとrotateがあれば何でもできる為、ネット記事では解説することもなかったのだろう。

なんだか書いてるうちにtranslateのあたりの座標説明がずれてるな....と感じたがそろそろ次の作業に入りたいのでやめておく。
コンテキストによる描画の回転``ctx.rotate()``について挙動がよく分からない方は正常なcanvasを``ctx.rotate(10 * Math.PI / 180)``で10度だけ回してみたり、ちょっとだけ``ctx.translate``してみたりするのが一番早いと思います。私も結局そうでした。

以上です。いろいろ落ち着いたらcanvas使ってゲーム作りたいな。
【Go】コネクションの読み取りにおけるio.Copyの注意点

connectionの読み込みにio.Copyでハマってしまったので
どなたかの役に立てれば。。

## io.Copy
`io.Copy` の挙動は[こちら](https://golang.org/pkg/io/#Copy)によると

>Copy copies from src to dst until either EOF is reached on src or an error occurs. It returns the number of bytes copied and the first error encountered while copying, if any.

となっており、 `EOF` もしくは `エラー` が返るまでcopyしてくれる。

## ConnectionにおけるEOF
読み込みを考えると、
connectionがcloseし切断された時に `io.EOF` が返ってくる。

そのため、io.Copyで読み込む際は送信側でconnectionをClose()している必要がある。
[Unity]TextMeshProでの文字毎の色指定

備忘

文字毎に色を設定したい
文字列補完式も使って簡単に

１．TextMeshProのタグ指定
　\<color="red">や\<color=#FF0000>mozi\</color>で任意の色が設定可能
２．文字列補完式を用いる。
　{valu:X}で16進数に表記に置き換わる。{16:X}の場合はF1など

＜使用例＞

```csharp:Colors.cs
public enum ChatColor : uint
{
    RED = 0xFF0000FF,// 赤
    GRN = 0x00FF00FF,// 緑
    BLR = 0x0000FFFF,// 青
}
```
```csharp:Monobehavior.cs
public class Chat : Monobehavior
{
    TMPro.TMP_Text m_Message = default;

    void Awake()
    {
        m_Message.text = $"<color=#{ChatColor.RED:X}>メッセージ</color>";
    }
}

```
実行時には「\<color=#FF0000FF>メッセージ\</color>」と
置き換わり赤文字で「メッセージ」と画面上に出力される

Red-Green-Blue-Alpha
・FF-00-00-FF⇒赤色
・FF-00-00-00⇒赤色(でも透明)
・FF-FF-FF-FF⇒黒色
・00-00-00-FF⇒白色
っぽいです。
メモ【TypeScript開発入門】必要な知識



#Webpackとは？
Webpack=複数のファイルを１つにまとめる
※バンドルするともいう（ぎゅっと１つにまとめる）
>HTMLのScriptタグは、何回もHTTP通信しないといけない
＝パフォーマンスが悪い)
CSSや画像ファイルもまとめられる
※<b>最近は使われない</b>が、知ってて損はない

【５分でなんとなく理解！】Webpack入門
https://qiita.com/Shagamii/items/698a67bab0cd5eefcb4f

#TypeScript開発では『関数』が基本
クラスはTypeScriptで追加された機能だが、
<b>最近使われない</b>
>frontを実装する際Reactが使用されるが、
React自体がクラスを使わない方針になった。
※３年前まではクラスで頑張って書いてたそうな

<b>関数を引っ張ってくるのが主流</b>とのこと。
>知ってて損はないが、クラスを勉強してもそんなにメリットがないかも？？

##webpackを使う理由
・<b>モダンでない</b>ブラウザでモジュールを使用するため

・http通信を<b>一括</b>で行うため

・コードの<b>最適化</b>のため=最終的に１行になる

・<b>プラグイン</b>の追加

・<b>いろんな種類</b>のファイルを扱うため
→.ts .css 画像

・<b>HMR</b>（ホットモジュールリプレースメント）付きのローカルサーバーを使うため 
※コードを編集するとブラウザが勝手にリロードされることをHMRという


#ブランチ管理
★コマンドで管理するとどのOSでも対応できるため
コマンドに慣れとくといいよ
##masterブランチ
master ブランチは、Gitでリポジトリを新規作成するとデフォルトで作成されるブランチですね。初心者の中には、masterブランチに直接コミットしている方も多いでしょう。それはそれで正しい使い方なのですが、git-flowでは master ブランチに直接コミットすることはなく、マージを行うだけのブランチになります。誤って直接コミットしてしまわないように注意しましょう。

##developブランチ
develop ブランチは、開発の中心となるブランチです。開発中は develop ブランチからブランチを切って、作業完了後に再びマージするという作業を繰り返すことになります。master ブランチ同様、直接このブランチにコミットすることはないので注意しましょう。リポジトリを新規作成したときに、master ブランチから develop ブランチを切っておきます。

##featureブランチ
feature ブランチは、機能の追加や変更、バグフィックスを行うブランチです。ひとつの変更に対してひとつの feature ブランチを切ることになるため、開発中で最も使われるブランチになるでしょう。ブランチの名前は、変更の内容がすぐに分かるような名称にしなければなりません。develop ブランチから派生させ、作業完了後に再び develop ブランチにマージします。そして、マージ完了後に削除するというのが一連の流れです。
Salesforce検索レイアウトのメタデータ

メタデータで検索レイアウト管理するにあたってのメモとして記載。

## 検索レイアウトのメタデータの箇所
objects > hogehoge > hogehoge__c.object-meta.xml

タグ searchLayouts に設定されている。

## customTabListAdditionalFields
オブジェクトに関連付けられたタブの、最近のオブジェクト名リストビューに表示される項目のリスト。
name項目必須なので含まれない。

## searchResultsAdditionalFields
検索結果に表示される項目のリスト。name項目は必須なので含まれない。
オブジェクト詳細 > 検索レイアウト > 検索結果　に該当

その他のsearchLayouts内の要素は以下を参照

[メタデータ API 開発者ガイド　SearchLayouts](https://developer.salesforce.com/docs/atlas.ja-jp.api_meta.meta/api_meta/meta_searchlayouts.htm)　から。
HTMLタグの読み方まとめ

#はじめに
普段コードを書いている時に読み方を間違ったまま覚えて、外で恥ずかしい思いをしたので、
この機会にHTMLタグや属性の読み方と意味を簡単にまとめておきます。

#HTMLタグ読み方一覧

##1. !DOCTYPE
###読み方…ドックタイプ

HTMLでコードを描き始める時に先頭に記載する宣言文。

Document Type Definitionの略


##2. a
###読み方…アンカー

リンクの出発点・到達点を指定する。

anchorの略。


##3. br
###読み方…ブレイク

改行を指定する。

breakの略。


##4. img
###読み方…イメージ

画像を表示するHTMLのタグ。

imageの略。


##5. ul
###読み方…アンオーダードリスト

番号なしのリストを作る。

unordered listの略。


##6. ol
###読み方…オーダーリスト

番号付きのリストを作る。

order listの略。


##7. p
###読み方…パラグラフ

ひとつの段落であることを表すHTMLタグ。

「ピータグ」と読むことも。

paragraphの略。


##8. param
###読み方…パラメータ

パラメータを指定するHTMLタグ。


##9. dir
###読み方…ディレクトリ

リストを表示するHTMLタグ。

directoryの略。


##10. dfn
###読み方…ディフィニッション

定義する用語を明示できるHTMLタグ。

definitionの略。


##11. u
###読み方…アンダーライン

文字に下線を引くHTMLタグ。

Underlineの略。


##12. sub
###読み方…サブスクリプト

下付き文字を表示するHTMLタグ。

subscriptの略。


##13. sup
###読み方…スーパースクリプト

上付き文字を表示するHTMLタグ。

superscriptの略。


##14. q
###読み方…クォート

引用文であることを表すHTMLタグ。

quoteの略。


##15. i
###読み方…イタリック

文字を斜体にするHTMLタグ。

italicの略。


##16. em
###読み方…エンファシス

強調文字・斜体文字を指定するHTMLタグ。

emphasisの略。



#HTML属性読み方一覧

##1. charset
###読み方…キャラセット

文字コードを指定するHTML属性。


##2. rel
###読み方…レル

現在のファイル(ページ)とリンク先の関係を指定する属性。

relation（関係）の略


##3. href
###読み方…エイチレフ

参照先の外部ファイル(リンク)の「場所」を指定する属性。 
属性値にはファイル(リンク)のURL、ファイル名を記載します。

テキストや画像にリンクを設定するときに使用。

Hypertext REFerenceの略。


##4. src
###読み方…ソース

画像のあるurlを指定する属性。

sourceの略。


##5. alt
###読み方…オルト

画像の代わりになるテキストを指定できる属性。

alternative(代替)の略。


##6. rowspan
###読み方…ロウスパン

テーブルのセルを縦に結合するHTML属性。


##7. colspan
###読み方…コルスパン

テーブルのセルを横に結合するHTML属性。


#おまけ

##プロパティ

##1. height
###読み方…ハイト

テーブルやセルの縦幅を指定するプロパティ。


##2. width
###読み方…ウィズ

テーブル（表）などの横幅を設定するプロパティ。

#終わりに

プログラミングのコードって省略されているものばかりで読みにくいですよね。
読み方や意味を知っているだけでも、かなりコードを読みやすくなるので、調べながら学習していくと良いかもしれません。

#参照

[href・doctype・src…？HTMLタグの読み方まとめ](https://ferret-plus.com/1462)
PostgresSQLで指定した行のレコードを取得したい

検索条件の結果行から任意の行のレコードのみを取得する方法を2つ紹介します。
次のようなテーブルを用意して実行結果と合わせて解説していきます。
### 準備①テーブルを作成

```
CREATE TABLE sample_tbl
(
  objectid bigserial NOT NULL,
  col1 character varying,
  col2 bigint,
  createdate timestamp without time zone,
  CONSTRAINT sample_tbl_pkey PRIMARY KEY (objectid)
)
```
### 準備②サンプルレコードを用意
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613298/398935d1-f480-9709-8b97-2f5b61098e79.png)


# 【実現方法その１】ROW_NUMBER関数を使う
行番号を付けたうえで、任意の行番号で取得したいレコードを指定する方法です。
まず次のようなSQLで行番号が取得できることが確認できます。
<a href="https://www.postgresql.jp/document/9.4/html/functions-window.html">※ROW_NUMBERについて</a>

```
SELECT ROW_NUMBER() OVER() AS rownum , * FROM sample_tbl;
```

実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613298/b3dd0094-ccf7-a5e6-ad00-f83dfe19b5f1.png)


任意の順番で行番号をつける場合

```
SELECT ROW_NUMBER() OVER(ORDER BY createdate DESC) AS rownum , * FROM sample_tbl;
```
実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613298/40310e5f-e14c-4b00-14ed-175aab0a18b2.png)

それでは、createdateの降順にしたときの2番目のレコードを取得するとしましょう。

```
SELECT ROW_NUMBER() OVER(ORDER BY createdate DESC) AS rownum , * FROM sample_tbl WHERE rownum = 2;
```
これで取得できると思いきや、実は次のようなエラーが出ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613298/45b318cd-5c4f-a809-3847-00d94349987c.png)

そのため、サブクエリにする必要があります。

```
SELECT * FROM 
 (SELECT ROW_NUMBER() OVER(ORDER BY createdate DESC) AS rownum , * FROM sample_tbl) AS tbl
WHERE tbl.rownum = 2;
```

はい、ちゃんと取得できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613298/15772fed-06b5-c065-5566-9c1bd2b324da.png)

# 【実現方法その２】OFFSETとLIMITを使う
同じようにcreatedateの降順にしたときの2番目のレコードを取得するとしましょう。
次のようなSQLで取得できます。

```
SELECT * FROM sample_tbl ORDER BY createdate DESC OFFSET 1 LIMIT 1;
```
取得できていることが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613298/1d6cc9e3-876a-47c3-7fab-6d56389c3dda.png)

LIMITは取得したいレコードの件数なので特に説明は不要だと思います。
OFFSETは開始したい行という意味ではなく、飛ばす行数を意味しているので、注意してください。
2件目以降が欲しい場合は1件だけ飛ばすので「OFFSET 1」となるのです。
詳しい説明は<a href="https://www.postgresql.jp/document/9.5/html/queries-limit.html">こちら</a>

# まとめ
シンプルな要件に対応するのであれば、OFFSET, LIMITの方が簡単だと思いました。
ただし、○件目～○件目までというような範囲指定はどちらも対応できますが、
○件目と○件目と○件目のような複数の任意行を取得する場合はOFFSET, LIMITではなく、ROW_NUMBERを使った方が柔軟に対応できると思います。
[PowerApps]SharePointリストの添付ファイル画像が表示されない場合

# あらすじ
先日、`SharePointリスト`に保存した添付ファイルの画像を、`PowerApps`側に表示させようとした際に、
使用する端末によって画像が表示されたり、表示されなかったりする現象が発生した。

# 原因
添付ファイルの画像表示に`AbsoluteUri`を使用していたため。
>Last(ThisItem.添付ファイル).AbsoluteUri

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352434/d43b7d7c-dda6-33a6-9131-ad8ef686ed26.png)

# 対策
添付ファイルの画像表示には`AbsoluteUri`ではなく`Value`を使用することで対策可能。
>Last(ThisItem.添付ファイル).Value

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352434/b448f138-e482-644a-34ae-b9def7d27654.png)

# 考察
参照URLはそれぞれ以下のようになっていた。

| プロパティ| 参照URL |
|:--|:--|
| AbsoluteUri | https://○○～ |
| Value | appres://datasources/○○～ |

**＜個人的仮説＞**
`AbsoluteUri`を使った場合はインターネット経由でアクセスするため、`PowerApps`の認証とは別に、`SharePoint`の認証が必要となる？
※だから、事前にブラウザで`SharePoint`を認証している場合は画像が表示できる・・・？
`Value`を使った場合は`PowerApps`側からアプリのリソースとしてアクセスするため、既に`PowerApps`で認証済みなので問題なく表示される？

# まとめ
`SharePointリスト`の添付ファイルを`PowerApps`で扱う場合は、`AbsoluteUri`ではなく`Value`を使用するようにしよう。
大きな画像をOpenCV (cv2)で使う

# 0. エラー内容
`100k`×`100k`の解像度(ピクセル)を有する画像をOpenCVで読み込ませようとしたところ次のようなエラーが発生した。

``` bash
cv2.error: OpenCV(4.4.0) ../modules/imgcodecs/src/loadsave.cpp:77: error: (-215:Assertion failed) pixels <= CV_IO_MAX_IMAGE_PIXELS in function 'validateInputImageSize'
```

どうやら、初期設定だと大きな画像は読み込めないようになっているようである。
Limitationは`CV_IO_MAX_IMAGE_PIXELS`で設定されており、
このLimitationはソースコードのDEFINEからでも、OSの環境変数からでも設定できるようである。

# 1. 解決方法
取り合えず、環境変数が楽そうなので、こちらで設定する。

```
$ export OPENCV_IO_MAX_IMAGE_PIXELS=1099511627776
```

気を付けるべきポイントはエラーでは`CV_IO_MAX_IMAGE_PIXELS`と書いてあるが、
OSの環境変数では`OPENCV_IO_MAX_IMAGE_PIXELS`に対して値を設定することである。
今回ピクセル数上限は`1<<40=1099511627776`を設定してある。

また、`opencv 4.4.0`以降ならこの方法は上手くいくようであるが、
`opencv 3.5.0`等では定数が直接畳み込まれており、環境変数を参照しにいかないので、同様の方法は使えない。

`conda`でパッケージを管理している場合は以下でアップデートしよう。

```
$ conda install -c conda-forge opencv=4.4.0
```
ransackで「SIMILAR TO」正規表現の検索ができるように

[PostgreSQL SIMILAR TO](https://www.postgresql.jp/document/9.4/html/functions-matching.html#FUNCTIONS-SIMILARTO-REGEXP) を使いたかった。


```ruby:config/initializers/arel_override.rb
module ArelVisitorsPostgreSQLOverride
  # https://github.com/rails/rails/blob/v6.0.3.2/activerecord/lib/arel/visitors/postgresql.rb#L29
  def visit_Arel_Nodes_Regexp(o, collector)
    # op = o.case_sensitive ? " ~ " : " ~* "
    op = " SIMILAR TO "
    infix_value o, collector, op
  end
end

Arel::Visitors::PostgreSQL.prepend(ArelVisitorsPostgreSQLOverride)
```

```ruby:config/initializers/ransack.rb
Ransack.configure do |config|
  config.add_predicate 'matches_regexp', arel_predicate: 'matches_regexp'
end
```
Ubuntu20.10でPhoenixを動かしてみた

まずは、簡単なレベルで良いので動かしたい。
今回はDBは構築しない前提です。
##aptコマンドで必要なパッケージをインストール

```
$ sudo apt update
$ sudo apt install -y erlang elixir inotify-tools nodejs npm
```

##Phoenixをインストール
```
$ mix archive.install hex phx_new 1.4.17
```
インストールはこれで完了です。

#Phoenixを動かしてみる
```
$ mix phx.new hoge --no-ecto --no-webpack
$ cd hoge
$ mix phx.server
```

##ブラウザで動作確認
http://localhost:4000/
にアクセスします。
![Screenshot 2021-01-26 at 10.41.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295814/4b60ebd5-2d6e-73b7-5147-9e8ecf767593.png)
plnkerでa-frame その3

# 概要

plnkerでa-frameやってみた。
physicsやってみた。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/2f53c00f-bdbf-fc22-39b2-1ba83f50259f.png)


# サンプルコード

```
  <a-scene physics>
    <a-assets>
      <a-asset-item id="model" src="https://rawcdn.githack.com/cx20/gltf-test/313ae4c3/sampleModels/Box/glTF-Embedded/Box.gltf"></a-asset-item>
    </a-assets>
    <a-gltf-model dynamic-body="shape: sphere; mass: 1" position="-2 1 -5" src="#model"></a-gltf-model>
    <a-gltf-model dynamic-body="shape: sphere; mass: 1" position="2 1 -5" rotation="0 180 0" src="#model"></a-gltf-model>
    <a-plane static-body width="20" height="20" position="0 0 0" rotation="-90 0 0" color="gold"></a-plane>
    <a-box static-body scale="10 2 1" position="0 2 -10"  color="gray"></a-box>
    <a-sky color="aqua"></a-sky>
    <a-camera universal-controls kinematic-body position="0 1.5 0"></a-camera>
  </a-scene>
```

# 成果物

https://embed.plnkr.co/plunk/0yOkqbxoIkGLMHiQ


以上。
cordovaでiosのシェイク機能を無効化する

# cordova-plugin-ios-disableshaketoedit
iosには端末を複数回振ると、直前の操作を取り消せるシェイク機能というものがデフォルトで備わっています。

ただ、この機能はcordovaで開発していくうえで、想定外な所で起動してしまうことがあります。

これを回避するために、[cordova-plugin-ios-disableshaketoedit](ios-disableshaketoedit)を入れます。

このプラグインを追加することで、iosのシェイク機能を無効化することができます。
ただ、これはすべての箇所で無効化されるため、画面によって使い分けることはできなくなります。
Next.jsにtypescriptでstorybook,カスタムサーバーを使えるようにする

#記事の概要
Next.jsを使うときに毎回設定ファイルを調べるのが面倒だったのでまとめました。

#Typescriptを使えるようにする
packageをインストールし、tsconfig.jsonを作成する
tsconfig.jsonは何も書かなくとも勝手にNext.jsが書いてくれます。

```
 yarn add -D typescript node @types/node @types/react @types/react-dom

 touch tsconfig.json
```
#Sassを使えるようにする
```
 yarn add -D sass
```
```index.module.scss
.sample {
  color: red;
}
```
あとはcssモジュールと同様にimportして使えます。
#Storybookを使えるようにする

```
 yarn add -D sass-loader css-loader @storybook/addon-essentials @storybook/addon-links @storybook/react

 mkdir .storybook
 touch .storybook/main.js .storybook/preview.js
```

package.jsonに以下を追加します。

```package.json
  "scripts": {
  
    "storybook": "start-storybook -p 6006",
    "build-storybook": "build-storybook"
  }
```

```main.js
module.exports = {
    stories: ['../src/components/**/**/*.stories.@(ts|tsx|js|jsx|mdx)'], //storiesファイルの場所
    addons: ['@storybook/addon-links', '@storybook/addon-essentials', '@storybook/preset-typescript'],
    webpackFinal: async (baseConfig) => {
        baseConfig.module.rules.push({
            test: /\.scss$/,
            use: [
                'style-loader',
                {
                    loader: 'css-loader',
                    options: {
                        importLoaders: 1,
                        modules: {
                            localIdentName: '[local]___[hash:base64:2]',
                        },
                    },
                },
                'sass-loader',
            ],
        });
        return {...baseConfig};
    }
}
```
```
 yarn storybook
```

#カスタムサーバーを使えるようにする
今回はExpressを使います。

```
 yarn add -D ts-node express @types/express
 touch tsconfig.server.json
```

```tsconfig.server.json
{
  "extends": "./tsconfig.json", 
  "compilerOptions": {
    "module": "commonjs",
    "outDir": "dist",
    "noEmit": false
  },
  "include": ["server"]
}
```
serverディレクトリを作成し、その中にindex.tsを作成

```index.ts
import express, { Request, Response } from "express";
import next from "next";

const dev = process.env.NODE_ENV !== "production";
const app = next({ dev });
const handle = app.getRequestHandler();
const port = process.env.PORT || 3000;

async function main() {
    try {
        await app.prepare();
        const server = express();
        server.all("*", (req: Request, res: Response) => {
            return handle(req, res);
        });
        server.listen(port, (err?: any) => {
            if (err) throw err;
            console.log(`Ready on localhost:${port}`);
        });
    } catch (e) {
        console.error(e);
        process.exit(1);
    }
}

main();
```
package.jsonを以下を追加します。

```package.json
 "scripts": {
    "dev": "ts-node --project tsconfig.server.json src/server/index.ts",
    "start": "tsc --project tsconfig.server.json && NODE_ENV=production node dist/index.js",
  }
```
#終わりに

2021年1月26日に書いたものなので今後、パッケージのバージョンが噛み合わなくなる可能性があります。
repl.itでdiscordのbotを作る

参考にした記事:[Discord Pythonボットを２４時間起動します。]("https://qiita.com/Mamiyanonoka/items/69c967cd3af9bb057a88")
2021/02/04追記:後でわかったのですが、repl.itは画面を閉じると90秒ほどでオフラインになり、uptimebotのpingも間に合いません。なので、heroku+uptimebotが無難でしょう。
こんにちは。Discordのbotをrepl.itを使用して稼働させてみましょう。
今回はDiscordやrepl.itのアカウント作成についての説明は省略しますのでご了承ください。
使用するものはiPad **だけ**です。
#トークンを取得する
https://discord.com/deveropers にアクセスし、横のメニューから「bot」を選択します。まだbotを作成してない場合は他の記事を参考にしていただけるとありがたいです。
そしてTokenの下にある(copy)ボタンを押します。このトークンが漏れるとbotを乗っ取られる危険があるため、 **絶対に他の人に漏らしてはいけません！**
#コードを書く
![E4D696A7-736F-4125-9D2A-17BF1A374B72.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/664185/fb422a41-ffab-aa28-3072-c67568ed18ad.jpeg)
右上の+ボタンを押します。
![A4D6F5E8-E95C-406B-95E9-47FFF82C9938.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/664185/03fd7972-0405-e696-ad97-a8e4609ae278.png)
Language→pythonを選択し、名前を適当に設定して、create replを押します。
現れたmain.pyにこれを書き込みます。

```python:main.py
from discord.ext import commands
import os
import traceback

bot = commands.Bot(command_prefix='/')
token = os.environ['TOKEN']


@bot.event
async def on_command_error(ctx, error):
    orig_error = getattr(error, "original", error)
    error_msg = ''.join(traceback.TracebackException.from_exception(orig_error).format())
    await ctx.send(error_msg)


@bot.command()
async def ping(ctx):
    await ctx.send('pong')


bot.run(token)
```

![B43C5611-6E60-41F4-B28F-6503AFFCB925.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/664185/7835a860-f431-f0ac-0f44-74419175e6ca.jpeg)

keep_alive.pyを作成します。

```python:keep_alive.py
from flask import Flask
from threading import Thread

app = Flask('')

@app.route('/')
def main():
    return 'Bot is aLive!'

def run():
    app.run(host="0.0.0.0", port=8080)

def keep_alive():
    server = Thread(target=run)
    server.start()
```


続けてhelp.txtを作成して
>discord.py
>flask

を書き込み、.envを作成します
```
TOKEN= XXXXXXXXXXXXXXXXXXX
```
そしたら、:arrow_forward:runを押してください。
5分ほど放置したら、botが動いてるはずです。
#応答を追加する
コマンドを追加するには
```
@bot.command()
async def ping(ctx):
    await ctx.send('pong')
```

を1行開けてペーストします。そしたらこのpingの部分に反応したい言葉を、'pong'には'を消さずに返す言葉を入れてください。

#終わりに
初執筆でした。可能な限りわかりやすく説明した気ですが、それでもわかりにくい部分があると思います…
そしてprefixを変える方法を後々載せたいと思います。
最後にMamiyanonoka様に感謝いたします。
plunkerでa-frame その2

# 概要

plnkerでa-frameやってみた。
全天球表示してみた。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/3122062d-4c85-95ce-ae63-5f574fda89aa.png)


# サンプルコード

```
<a-scene>
  <a-assets>
    <img id="sky" src="sky.png" />
  </a-assets>
  <a-sky radius="10" position="0 1.8 1.0" src="#sky">
  </a-sky>
</a-scene>
```

# 成果物

https://embed.plnkr.co/plunk/Z9av6sHWXjXFQfkc


以上。
vue styleが他のファイルにも適応されるのを防ぐ


###styleが他のファイルにも適応されるのを防ぐには
:point_up_tone1:styleにscopedを設定する

```
<style scoped>

</style>
````

↑これだとコンポーネントのstyleも効かなくなる
コンポーネントのstyleをよびだし側で使いたい時はdeep selectorを使う
（参考　https://qiita.com/h-naito/items/f6ca679276282dce2600)
CakePHP3のベースディレクトリを変更する

`http://{domain}/`
こうじゃなくて
`http://{domain}/cakeapp/`
こんな風にサブディレクトリをドキュメントルートにしてCakePHPを動かしたいとき

```php:config/app.php
    'App' => [
        'namespace' => 'App',
        'encoding' => env('APP_ENCODING', 'UTF-8'),
        'defaultLocale' => env('APP_DEFAULT_LOCALE', 'en_US'),
        'defaultTimezone' => env('APP_DEFAULT_TIMEZONE', 'UTC'),
//        'base' => false,
        'base' => '/cakeapp',
        'dir' => 'src',
        'webroot' => 'webroot',
        'wwwRoot' => WWW_ROOT,
```

上記のように`App.base`にパスを指定すればOKです。

---

参考：https://book.cakephp.org/3/ja/development/configuration.html