OmniAICreator/Qiita-1.07M huggingface dataset:
Hooks(useRef) + TypeScriptで親から子コンポーネントの関数を発火する

### 前提
Reactにおいて親コンポーネントから子コンポーネントを操作(DOMをさわる、関数を発火させる)のはアンチパターン。
>いつもの話ですが、ref を使った手続き的なコードはほとんどの場合に避けるべきです。
by https://ja.reactjs.org/docs/hooks-reference.html#useimperativehandle

refを使わずに実装するのであれば、状態を親コンポーネントに寄せるか、あるいはReduxやRecoilに頼るしかない。だけど、それでもどうしてもやりたいという場合は下記の通り。

### 親コンポーネント
```javascript
import React, { useRef } from 'react';

const Parent = () => {
  const ref = useRef(null); // 初期化

  const hogeFunction = () => {
    ref.current.fire(); //refオブジェクトからfire()を実行
  }

  return (
    <Child ref={ref}> // refオブジェクトをそのまま渡す
  )
}
```

### 子コンポーネント
```javascript
import React, { FC, useImperativeHandle } from 'react';

interface Props {
  ref: RefObject<void>;
}

const Child: FC<Props> = ({
  ref
}) => {

  useImperativeHandle(ref, () => ({
    fire() {
      // 発火させたい処理
    }
  }));

  // ...(省略)...
}
```

`useImperativeHandle`の使い方は下記の通り。

```javascript
useImperativeHandle(ref, createHandle, [deps])
```


### 参考
https://ja.reactjs.org/docs/hooks-reference.html
Ruby on Railsの開発環境でPostgreSQLを利用してPJを作成する

#Rails new
```
$ rails new app-name -d postgresql
$ cd app-name
```

app-nameは任意の名前をつける

##vs codeを開く
```
$ code .
```
この時点で

```
-bash: code: command not found
```
と怒られた方はvscodeの設定が必要

コマンドパレットを開き「shell command」
すると『Shell Command: Install 'code' command in PATH command.』
が表示されるので適用するとできるようになる

#データベースの作成
```
$ rails db:create
```

localhost:3000にアクセスするとRailsの初期画面が表示されたのでできているのではないかと思います。
【java】switch文について基本的なことを整理してみた


####【目的】
「switch文の意味をきちんと理解すること。」

　🔷当初switch文は、「if文だと冗長になってしまう場合に、もっと見やすく書く手段」と理解。
　🔷しかしこの理解だけで実際にコードを書くと、構文中の「break」でモヤみが発生。
　　？breakなくてもコンパイル、実行できる
　　？でも自分の思ったとおりの処理にならない
　　？とりあえず、書いとけばいい…わけではなさそう


####【switch文とは】
　「条件に一致するcaseラベルまで処理をジャンプさせることができる。」

　🔷switch文の正体がわかったので、構文内の「break」使用についてもスッキリ。
　🔷正直この一文だけで、モヤみ解決(´-`)


####【switch文に書き換えることができる条件】
📌　全ての条件式が、右辺と左辺が一致するかを比較する式になっていること。
　　例えば「変数 == 値」「変数 == 変数」のような式になっていればOK( ^ω^ )
　　「>」「<」「!=」が使われている式はNG(｀ω´)

📌　比較する値が整数（byte、short、intのいずれか）であること。
📌　文字列（String型）または文字（char型）であること。
　　小数や真偽値ではないこと。

####【switch構文】

```
・switch（条件値）{  //switchの直後に書くのは、条件式ではなく、変数名
   case 値1:　　//caseの横には値を書く。後ろに:をつける（よく;と間違える）
      処理1　　
      break;　　//case以降の処理の末尾にはbreakを付ける（付けない方法は【その他】参照）
   case 値2: 
      処理2
      break;
    .
    .
    .
    default:　　//上記case以外の処理が不要であれば省略可能。
       処理x
}
```

####【switch構文を使用した例文】

```
public class Main{
  public static void main(String[] args){
    System.out.println("");
    int n = new java.util.Random().nextInt(5) + 1;  //１〜５までランダムに整数を選ぶ。
    switch(n){
      case 1:
        System.out.println("");
      break;

      case 2:
       .
       .
       .
  }
 }
}
```

####【その他】
「あえてbreak文を書かない」場合

「nが１か２なら...、３なら...」というふうに、複数の場合について同一の処理を行いたい時に、あえて書かない方法もある。

```
public class Main{
  public static void main(String[] args){
    System.out.println("");
    int n = new java.util.Random().nextInt(5) + 1;  //１〜５まで、ランダムに整数を選ぶ。
    switch(n){
      case 1:
      case 2:    // break文を書かない。
        System.out.println("");
　　　 break;
 

      case 3:
        System.out.println("");    
        break;
       .
       .
       .
  }
 }
}
```
NAS上のフォルダをセキュリティ設定ごと複製するには


# 概要

NASのフォルダでアクセス制御設定ごとフォルダ階層をコピーする方法です。

# 環境

Windowsメインの環境で、
LinuxのNASを利用している想定です。
具体的な型番はTS5410Dですが、Buffalo製のNAS全般に当てはまると思います。

# 操作対象

※あらかじめNASのIPを`192.168.123.x`とします。

- コピー元
  - \\\\192.168.123.x\\SharedFolder\\original\\*
  - このoriginalフォルダにはアクセス制御設定がしてあります。
- コピー先
  - \\\\192.168.123.x\\SharedFolder\\imitation\\*

あらかじめ、Windows資格情報には`192.168.123.x`にユーザー名`admin`で登録しておきます。
さらに、コマンドで移動しておきます。

```posh
cd "\\192.168.123.x\SharedFolder\"
```

# NASの設定

NASでLVMの共有ファルダを作成すると、
Webコンソールを利用して各ユーザーのアクセス制御ができるのは、
作った共有フォルダのトップ階層のみで、それ以下は、
Windows側からフォルダのプロパティを開いて構成する必要があります。
割と手間なのでCUIのrobocopyというコマンドを利用することにします。

# 設定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134703/f46dd97c-cf4e-a270-2fee-73a6e1355357.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134703/003de5d9-8c79-4932-5d12-9f01621f4c71.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134703/b8f84295-4d6d-8b29-89f0-7d841329ecbe.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134703/58113d2a-252a-6bf9-18a4-b17376dfd14c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134703/885dd08c-1814-2c51-1094-e54a55cdab49.png)

# 失敗

以下のコマンドで「全部コピー！！簡単！！」と甘く見ていました。

```posh
robocopy /MIR /COPYALL /B ".\original\" ".\imitation\"  /XF *
```

その結果、エラーメッセージで精神的に反撃を食らいました。

```posh
エラー 1314 (0x00000522) NTFS セキュリティをコピー先ディレクトリにコピーしています \\192.168.0.185\SnR\test12\
クライアントは要求された特権を保有していません。
```

「権限あるし！」とか言っても無理でした。
「考えうる最高権限でアクセスしてるんだけど？」と言っても変わりません。

※たぶん仕様だからです。
[icaclsでシンプルにアクセス権制御をする](https://qiita.com/carbonss/items/cc6d33fe6645a86171ad)方法があるようです。

# 成功

```posh
robocopy /MIR /COPY:DATSO /B ".\original\" ".\imitation\" /XF *
```

※管理者権限が必要です。
※NASへアクセスする資格情報も管理者権限もしくは、
「アクセス許可の変更」権限を持ったアカウントで登録しておきましょう。

# 原典

[Robocopy | Microsoft Docs](https://docs.microsoft.com/ja-jp/windows-server/administration/windows-commands/robocopy)
Robocopyのコマンドラインオプションは非常に難解です。
私がアクセス制御の仕組みを理解しきれていないからかもしれません。
また、バージョンによってコマンドラインオプションが変更されているそうです。

**Excelsior!**
Laravelでneo4jを使ってみる②Loginをneo4jに対応してみる

※モデルファイルをapp/Models内に移動しています。
※参考[【Laravel】モデルのディレクトリ構成変更についてのメモ](https://qiita.com/vrvr/items/4755e758f5d4b2e07579)

#②ログイン機能を対応してみる

##1)ログイン機能の有効化
下記コマンドをプロジェクトで実行

```
php artisan make:auth
```

##2)User.phpの変更

```app/Models/User.php※フォルダ構成変更していない場合はapp/User.php
<?php

namespace App\Models;

use Illuminate\Notifications\Notifiable;
//use Illuminate\Foundation\Auth\User as Authenticatable;

use Illuminate\Auth\Authenticatable;
use Illuminate\Auth\Passwords\CanResetPassword;
use Illuminate\Foundation\Auth\Access\Authorizable;
use Illuminate\Contracts\Auth\Authenticatable as AuthenticatableContract;
use Illuminate\Contracts\Auth\Access\Authorizable as AuthorizableContract;
use Illuminate\Contracts\Auth\CanResetPassword as CanResetPasswordContract;

use Vinelab\NeoEloquent\Eloquent\Model as NeoEloquent;

class User extends NeoEloquent implements
    AuthenticatableContract,
    AuthorizableContract,
    CanResetPasswordContract
{
    use Notifiable,Authenticatable, Authorizable, CanResetPassword;

    protected $label = 'User';
    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name', 'email', 'password',
    ];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'password', 'remember_token',
    ];
}
```
【説明】
継承元の変更
元々UserクラスはLaravelフレームワークのAuthenticatableを継承していますが、こちらがNeoEloquentから派生していないため、
こちらで書き直しています。
モデルクラスがNeoEloquentから派生していない場合はエラーが発生します。

>use Illuminate\Auth\Authenticatable;
>use Illuminate\Auth\Passwords\CanResetPassword;
>use Illuminate\Foundation\Auth\Access\Authorizable;
>use Illuminate\Contracts\Auth\Authenticatable as AuthenticatableContract;
>use Illuminate\Contracts\Auth\Access\Authorizable as AuthorizableContract;
>use Illuminate\Contracts\Auth\CanResetPassword as CanResetPasswordContract;
>
>use Vinelab\NeoEloquent\Eloquent\Model as NeoEloquent;
>
>class User extends NeoEloquent implements
>    AuthenticatableContract,
>    AuthorizableContract,
>    CanResetPasswordContract

ラベルの設定
こちらを設定することで挿入されたデータのラベルがUserになります。
設定しない場合はAppModelsUserになりました。
>protected $label = 'User';
VM(vSphereClient)環境下にあるゲストマシンを手動でvMotionしてみた

# 本記事について
VM(vSphereClient)環境下にあるホストマシンが1台故障してしまいました。
そのホストマシンはクラスタ構成になっていないので、
上に乗っかっているゲストマシンも死んでしまっている状態です。

vMontionで救出したいところなのですが、
ホストマシンの電源が入らないのでそれも出来ません。
ただ、ホストマシンが利用しているストレージは無事でした。

手動で別のホストマシンの切り替えを行いたいと思います。
本記事は、その作業の備忘録です。

# 手順
ナビゲータから、ゲストマシンが保存されているストレージのナビゲータを開き、
ストレージの中から対象となるゲストマシンのフォルダを探します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242659/c59ea355-da9c-e945-449d-d85ce01eb86b.png)


そのフォルダを開き「.vmx」の拡張子がついたファイルを右クリックし、「仮想マシンの登録」をクリックします。
<img width="800" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242659/ef43c739-5657-43bf-90be-30b8d765c7ef.png">

移動先の設定をして完了ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242659/06feef4d-5b65-b2a9-2553-0e0d87a64e7d.png)

作成したゲストマシンの電源を入れようとすると、
ホストマシンが変わったことが影響して「この仮想マシンは移動またはコピーされている可能性があります」と
エラーが表示され、起動できません。
ゲストマシンのナビゲータ→監視タブ→問題→すべての問題→「この仮想マシンは移動またはコピーされている可能性があります」を右クリックして、質問への回答をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242659/be60cc1b-88d8-2a8b-6664-c6d0ad997f1b.png)

「移動しました」を選択してOKボタン
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242659/d8472f5e-e931-5eb5-e91c-092fe0a4cbb7.png)

これで電源が入るようになったかと思います。
また、本対応は緊急用です。普通に移動する際にはちゃんとvmotionで移動しましょう。
EC2再起動時もスクリプト(ユーザデータ)を実行させる

## ユーザデータ
ユーザデータとは、EC2初回起動時に動作するスクリプトを登録できる設定です。
sshポート変更など、サーバ構築後によくやる作業を設定しておくと
初回起動時点に環境に反映してくれます。
設定方法は以下。
1. EC2の停止
2. 対象インスタンスを右クリック＞インスタンスの設定＞ユーザーデータの表示/変更
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174816/20386397-44c9-d537-f759-2851293e50d4.png)
上記のように実行したいスクリプトを記載できます。

ただ、ユーザデータは**インスタンス構築後の初回起動時のみしか実行されません。**

## 再起動時もユーザデータを動作させる方法
MIMEマルチパートファイルを使用して、ユーザデータの実行頻度を**起動の都度に**変更できます。
参考：https://aws.amazon.com/jp/premiumsupport/knowledge-center/execute-user-data-ec2/

ユーザデータに以下を張り付けてください。
★部分が実際に実行するスクリプトなので、ここだけ変えればOKです。

```
Content-Type: multipart/mixed; boundary="//"
MIME-Version: 1.0

--//
Content-Type: text/cloud-config; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="cloud-config.txt"

#cloud-config
cloud_final_modules:
- [scripts-user, always]

--//
Content-Type: text/x-shellscript; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="userdata.txt"
★↓
#!/bin/bash
/bin/echo "Hello World" >> /tmp/testfile.txt
--//
```
これでEC2起動の都度、スクリプトを実行できます。
【Kotlin】AndroidでiOSライクな画面遷移アニメーションを実装する

簡単に言えばiOSで`UINavigationController`で`show`するような画面遷移を、
Androidで簡単に実装出来ます。

###手順1:res/animを作成する

![スクリーンショット 2020-09-10 11.39.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551622/fc077c27-3830-43a7-fa1e-c1d6405c8931.png)

###手順2:画像のようにxmlファイルを4件追加する

##close_enter.xml
```kotlin
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate android:fromXDelta="-100%"
        android:toXDelta="0%"
        android:duration="300"
        android:fillAfter="true"
        android:fillEnabled="true"/>
</set>
```

##close_exit.xml
```kotlin
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate android:fromXDelta="0%"
        android:toXDelta="100%"
        android:duration="300"
        android:fillAfter="true"
        android:fillEnabled="true"/>
</set>
```

##open_enter.xml
```kotlin
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate android:fromXDelta="100%"
        android:toXDelta="0%"
        android:duration="300"
        android:fillAfter="true"
        android:fillEnabled="true"/>
</set>
```

##open_exit.xml
```kotlin
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate android:fromXDelta="0%"
        android:toXDelta="-100%"
        android:duration="300"
        android:fillAfter="true"
        android:fillEnabled="true"/>
</set>
```

###手順3:アニメーションを行いたいA画面の画面遷移実行時に下記の記述を入れる。
```kotlin
val intent = Intent(this, MainActivity::class.java)
startActivity(intent)
overridePendingTransition(R.anim.open_enter, R.anim.open_exit);
```

###手順3:閉じるアニメーションを行いたいB画面の画面遷移実行時に下記の記述を入れる。
```kotlin
    override fun finish() {
        super.finish()
        overridePendingTransition(R.anim.close_enter, R.anim.close_exit);
    }
```
ビッグバンの定理を検証してみた【そろそろ帰着にかかるか】

# ビッグバンの定理とは…
どんな言葉でも「ビッグバン」に帰着するという説

## 引用
どの言葉も辞書で意味を遡るとビッグバンに辿り着く説を検証してみた。
https://www.youtube.com/watch?v=CN7q1thA7mU

# 実装
今回は「MediaWiki API」を使用し、記事へリンクしている記事の一覧を取得し
どれくらいの記事がビッグバンの記事にリンクされるか検証する

## ソース
```python:python
url = "http://ja.wikipedia.org/w/api.php"
payload = {"format":"json", "action":"query", "list":"backlinks", "blnamespace":"0"}
payload['bltitle'] = word
r = requests.get(url, params=payload)

# json整形
json_load = r.json()
json_load = json.dumps(json_load)
json_load = json.loads(json_load)

# 一部切り出し
json_load = json_load['query']['backlinks']

theList = []
# 記事分をループ
for value in json_load:

	theDict = {}
	theDict['id'] = value['pageid']
	theDict['title'] = value['title']

	theDict['blTitle'] = word

	theDict['url'] = 'https://ja.wikipedia.org/wiki/' + value['title']
	theDict['floor'] = floor
	theDict['ns'] = value['ns']

	theList.append(theDict)

dataFrame = pd.io.json.json_normalize(theList)

```

### 参考
https://qiita.com/yubessy/items/16d2a074be84ee67c01f#記事へリンクしている記事の一覧を取得

# 検証結果
https://ja.wikipedia.org/wiki/Wikipedia:日本語版の統計
より記事総数を「1227198」件とする
※2020年9月現在

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411120/e405e1be-8d27-772c-3604-74531fb5466d.png)

n=ビッグバンに帰着するまでの回数

## 代表値
n=0
・ビッグバン

n=1
・物理学
・年表
・宇宙論

n=2
・地理学
・生物
・生物学

## 出力結果CSV

全取得結果(記事の重複あり)
https://github.com/Syogo-Suganoya/bigBanete/blob/master/downloads/record.csv

全取得結果(記事の重複なし)
https://github.com/Syogo-Suganoya/bigBanete/blob/master/downloads/uniqueRecord.csv

# 結論
試行回数10回目で記事リンクのループが発生し、記事網羅率が天井に達した。
ビッグバンの日本語記事における網羅率(ビッグバネイト率)は0.0993%で、
命題「どんな言葉でも「ビッグバン」に帰着する」というのは間違いである。

---

# github
https://github.com/Syogo-Suganoya/bigBanete
KiCadで既存の基板パターンを別プロジェクトに持っていく

環境 : KiCad 5.1.6

1. コピー先の基板 (`*.kicad_pcb`)をPcbnewのスタンドアロンモードで開き、コピー元のパターンを「基板を追加」で読み込んで保存
2. コピー先のプロジェクトフォルダにコピー元の回路図をコピーして、コピー先で同名の階層シートを作る。
3. アノテーション、そして保存
4. コピー先プロジェクトの回路図(`.sch`)のコピーしてきた部品のタイムスタンプを、基板図(`*.kicad_pcb`)のタイムスタンプと合わせる(どっちをどっちに合わせてもいい、テキストエディタで開いて直接編集するのが確実)
5. 基板エディタで「回路図から基板を更新」「既存のシンボルとフットプリントの関連付けを保持」で基板を更新


---

基板図ファイルでのタイムスタンプは

```
  (module フットプリント名 (layer F.Cu) (tedit 5DCA44A1) (tstamp 5E32AC00)
    (at 167.7 80.3 180)
    (descr "Resistor SMD 0402 (1005 Metric), square (rectangular) end terminal, IPC_7351 nominal, (Body size source: http://www.tortai-tech.com/upload/download/2011102023233369053.pdf), generated with kicad-footprint-generator")
    (tags resistor)
    (path /5E282B5C/5E377831) <------ ここが対応する回路図上の部品のタイムスタンプ

```

`(path /階層シートのタイムスタンプ/回路部品のタイムスタンプ)`となっている。

階層シートとして取り込んだ場合、回路部品のタイムスタンプは変わらないので、階層シートのタイムスタンプを変更するか、または付け足す。

一番お手軽なのは

```
Top.sch <- 階層シートを置くだけの図
├ A.sch 
├ B.sch
...
```

という階層シート構造になるように回路図を書き、コピー時にはトップ以外をプロジェクトフォルダにコピーして、
コピー先と元のトップのシートをテキストファイルで開いて階層シート部分をコピペすればいい

あとは再アノテーションしてリファレンスを振り直す。
Herokuとクラウドサービスの種類についてメモ

##0,Herokuとは

Herokuはよくサーバーのコードのデプロイ先に使用されるクラウド型のサービスです。
<font color="BlueViolet">Heroku</font>は<font color="#3ADFF4">PaaS</font>です。
[RailsTutorial](https://railstutorial.jp/)にもHerokuを使用したデプロイ方法が乗っています。
多くのネットワークやインフラの知識を必要とせずに簡単にリリースすることが出来るのが魅力的です。
MVP開発(スタートアップ企業でよく作成される最小機能しか持たないアプリ)など軽めの開発でサーバーが必要な時は選択肢に入ります。
似たようなクラウド型のサービスでよく知られているものとしてAWSがありますが、<font color="DarkOrange">AWS</font>は<font color="Green">IaaS</font>です。

##1,クラウドサービスとは(PaaSとIaaS)
クラウド型のサービスは大きく<font color="Violet">SaaS</font>、<font color="#3ADFF4">PaaS</font>、<font color="Green">IaaS</font>の3種類が存在します。

1.<font color="Violet">SaaS</font>
  SaaSは"Software as a Service"の略で、完成したソフトウェアの機能をインターネットを介して提供するサービスです。GmailなどのメールサービスやWordPress.comなどのブログサービスなどが該当します。

2.<font color="#3ADFF4">PaaS</font>
PaaSは"Platform as a Service"の略で、アプリケーションを実行するためのプラットフォーム(OSやハードウェアの設定なしに)をインターネットを介して提供するサービスです。今回説明するherokuやGoogle App Engineなどがあります。

3.<font color="Green">IaaS</font>
IaaSは"Infrastructure as a Service"の略で、インフラをインターネットを介して提供するサービスです。OSやハードウェアの構成などを自由にいじることが可能です。Amazon Web Service (AWS)の他にもGoogle Compute Engineなどがあります。

![スクリーンショット 2020-09-10 11.13.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320677/a26c411f-0ea3-f124-ca38-9f95be6124a7.png)

##2,HerokuとAWS
よく比較されるものなのでHerokuとAWSは並列の関係だと思われていることも多いですが。上述の通り、AWSはIaas,HerokuはPaaSなので関係性は縦の関係です。
herokuはAWSの基盤の上に作成されています。

詳しい比較が下記サイトにあります。
よかったらみてみてください。
https://www.guru99.com/heroku-vs-aws.html#:~:text=Heroku%20is%20container%2Dbase%20cloud,AWS%20service%20is%20quite%20complicated.
Pythonメモ①　フォルダ,ファイルの操作

# pythonによるファイル、フォルダの基本操作
自分用メモです。バージョンはpython3.7.1です。随時追記します。

## フォルダの作成
``` make_folder.py
# make folder
import os

def make_folder(path):
  if os.path.exists(path)==False:
    os.mkdir(path)
    
```



##　ファイルのみ取得する
``` get_files.py
import os
import sys

def get_images(path):
  folder = os.listdir(path):
  files = [f for f in folder if os.path.isfile(os.path.join(path, f))]
  if len(files)==0:
    print("File does not exist")
    sys.exit()
  return files

``` 

##　ファイルの名前と拡張子を取得
```get_filename.py

name, ext =  os.path.splitext(file)
```
PostgreSQL のシーケンス操作関数

シーケンス操作関数のメモです。

# 次の値のシーケンス値を取得

```sql
select nextval('hoge_id_seq');
```

# 最近返されたシーケンス値の取得

```sql
select currval('hoge_id_seq');
```

# 指定した値でシーケンス値をリセットしその値を取得

```sql
select setval('hoge_id_seq', 1); -- return 1
select nextval('hoge_id_seq'); -- return 2
```

値を返さずに、設定値を次回の取得まで待機させたい場合はこうする。

```sql
alter sequence hoge_id_seq restart with 1;;
select nextval('hoge_id_seq'); -- return 1
```

以上です。
保守業務についての知見

保守業務をいくつか経験して得た知見を共有します。
対象の案件はBtoBを想定しております。
またここでは取引先会社のことを取引先とします。

## 君は誰？
入社3年目のエンジニアです。
保守案件を取りまとめています。

## 引き継ぎについて

ここでは対象の案件を前任から引き継がれた場合を話します。
よって、開発後そのまま保守業務へスライドした場合は除きます。

保守を行うことになったら、まず業務の引き継ぎを行う必要があります。
前任者がいるのであれば頼ると良いでしょう。

引き継ぐべき内容は以下になります。

### ドキュメント情報
 
 設計資料や全体構成図、マニュアル、引き継ぎ資料(あれば)をできるかぎり集めて読みましょう。
 外部APIを使用している場合はその資料も探してください。
 
### アクセス権限
 
 aws、gcp、github、sluckなどの必要な権限の付与を取引先または前任者に依頼します。
 
### デプロイ方法の確認
 
 デプロイの方法は確認しましょう。これがなければ終わりません。
 
### 環境へのアクセス

 本番やステージング環境などへのアクセスを確認します。
 また、アプリやブラウザ側からも入れるように各環境のURLやストアページへのアクセスも確認します。
 
### 関係者一覧の洗い出し
 
 案件に関わっていた社内と取引先担当者の情報を洗い出します。
 
 取引先担当者については運用責任者・請求先担当者・運営責任者の連絡先を手に入れられれば
 連絡先に困ることはないと思います。
 社内に関わっていた人が残っていればその方に業務の相談が出来ます。

### 提供内容
 
 受付時間や対応時間、上限稼働時間、対応内容を契約書を読み込んで覚えましょう。
 例えば月ごとの上限稼働時間を超えてしまう場合、取引先に交渉が出来ます。
 また、対応内容の範囲外(例えばOSのバージョンアップ)などを依頼された場合、追加開発として話を進めることが出来ます。
 
### 保守対応範囲内の残タスク
 
 前任者、もしくは取引先に未対応のタスクを聞きましょう。
 その後、どのくらいで全て完了するかスケジュールをたて、計画的にこなしていきましょう。
 

tips)
これらの引き継ぎ内容が資料化されていない場合、今のうちに資料を書いておきましょう。
案件をいつまでも行うことはないのでいつでも次の担当に引き継ぎできる体制を整えておき、円満な引き継ぎを目指しましょう。

## 人員について

必ず二人以上その案件に関わっているようにします。
保守案件は突発的に依頼が来ることが多いからです。
規模にもよりますが、常に複数人いる必要はないのでサブとして有事の際は誰かが業務を行えるように整えておくと良いです。
誰も旅行中に部屋にこもって作業をしたくはないでしょう。

## 業務について

保守案件は依頼が来ることがほとんどです。
この機能を追加・削除して欲しい、このデータを追加・削除して欲しい、このバグを修正して欲しい、この機能を調べて欲しいと言ったものです。
手順は大まかに以下の通りです。


1. 依頼が届く・ヒアリング
2. 過去に同様の依頼がないか探す  
    同様の依頼があり、手順書もあればその通りに行えば良いでしょう。
3. 検証を行い、対応方法を模索する  
  ログやコード、場合によってはサーバーの監視データから対応方法を模索します。
4. 対応想定時間を割り出し、取引先へ確認する  
  依頼によっては月ごとの上限稼働時間を超える場合があります。
  単純に時間のかかる依頼であったり、大量に依頼がある場合などです。
  なのであらかじめ対応時間を割り出し、今月行うか、来月以降行うか、または対応自体行わないか取引先に判断をしてもらいます。
5. 対応  
  対応を行います。
  対応内容は細かくメモしておきます。
  コマンドレベルに事細かく、メモを見れば何も考えずに行えるくらい書いておくことがベストです。
6. 報告・作業内容の保存  
  先方に報告を行えば終了です。
  作成した対応内容はプロジェクトメンバーが確認しやすい場所に保存しましょう。
  
重要なのは逐一対応内容のメモをとり、どこかプロジェクトメンバーが確認しやすい場所に保管しておくことです。
メモがあれば次同じ依頼が来た時に少ない時間で対応を行うことが出来ます。
取引先も早く問題を解決でき、こちらも時間を節約できる。winwinでユーザーフレンドリーな世界が待っています。

## 属人化箇所について

保守業務を行なっていると、同じ依頼が何度も来ることに気がつきます。
これを私は属人化箇所と呼んでいます。
属人化箇所は業務上必要な箇所ですがエンジニアによる変更が必要な箇所です。
これがあると毎回依頼をしなければならず取引先としても負担になります。

属人化箇所を見つけたら取引先と解消するか話し合いましょう。
修正にどのくらい時間がかかるか、追加開発費用は必要になるか天秤にかけ、話がまとまったら対応しましょう。

例えば毎月行う作業があるとして、エンジニアが行う時間が5分程度とします。この属人化箇所を解消するために必要な作業時間は3時間。
とすると単純計算で作業時間分のコストを属人化箇所解消で削減される時間が上回るのに3年ほどかかる見込みとなります。
長期運用の予定がないならばこの箇所は対応しない方が良いでしょう。

逆に毎週20分かかり作業時間が3時間ならば先ほどの計算で3ヶ月なので早めに対応した方がいいでしょう。

## 最後に

保守業務のなかで新しい開発のチャンスがくることもあります。
そのチャンスを掴むためにも円満な保守業務を保っていきましょう。
そして次保守を行う後輩に感謝されるようにドキュメントのメンテナンスは忘れずに。
インターネットの仕組みについて重要なことまとめ

<h1>概要
<p>プログラミングの学習の中で学んだ、基本的だけど重要なインターネットの仕組みについてまとめます。


<h2>HTTPプロトコル
<p>HTTP (HyperText Transfer Protocol) は、WebサーバとクライアントのWebブラウザがデータを送受信
　するために使用するアプリケーション層のプロトコルです。HTTPにより、Webページを記述するために
　使用する言語（HTML）による文書、画像、音声、動画等のファイルを表現形式を含めてやりとりできます。
引用: https://www.infraexpert.com/study/tcpip16.html

<h2>HTTP通信
<p>HTTP通信とはブラウザとWebサーバー間で行なう通信のことを指します。ブラウザからWebサーバーに向けてTCPというプロトコルを使って接続を行い、接続が成功したらブラウザは「こういう情報くださいな☆」というリクエストを発行します。Webサーバー側は発行されたリクエストを受け取り、サーバー側で検索を行い、要求された情報をかき集めてレスポンスとしてブラウザ側に情報を渡してあげる、ということをします。
引用: http://ponpoco.hatenablog.jp/entry/2015/03/06/011518

<h2>IPアドレス(郵便番号的な)
<p>IPアドレス(Internet Protocol Address)とは、インターネット上に接続された機器が持つナンバーのことです。データをやり取りする際、ネットワーク上で通信相手を間違わないようにするために使われます。
引用: https://www.kagoya.jp/howto/network/ipaddress/

<h2>URL(住所的な)
<p>参考: https://chewy.jp/businessmanner/841/

<h2>DNSサーバー
<p>DNSサーバーには、人が使う言葉で書かれた住所 (ドメイン名) とネットワーク上にあるコンピュータ (WebやメールサーバーのIPアドレス) の間で、翻訳機としての役割があるとも言えます。
引用: https://www.kagoya.jp/howto/rentalserver/dns-server/


<h2>ブラウザ→safari/crome etc…
<p>ブラウザとは、WEBサイトを閲覧するために使うソフトのこと
引用: https://tone.ne.jp/column/howtouse/whatsbrowser-beginner-smartphone/

<h2>ドメイン
<p>「インターネット上に存在するコンピューターやネットワークを識別するための名前」です。簡単に例えるならインターネット上の「住所」のこと
https://www.kagoya.jp/howto/webhomepage/01/

<h2>ホスティング
<p>ホスティングとは、一言で表すと「サーバを借りること」です。レンタルサーバーと呼ばれることもあります
引用: https://www.google.com/amp/s/boxil.jp/mag/amp/2442/
Mysqlにデータベースを変更する

database.ymlの中身を以下のように書き換えてください。

```yml:config/database.yml
default: &default
  adapter: mysql2
  encoding: utf8mb4
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password:
  socket: /tmp/mysql.sock
development:
  <<: *default
  database: amazon_app_mysql_development
test:
  <<: *default
  database: amazon_app_mysql_test
production:
  <<: *default
  database: amazon_app_mysql_production
  username: amazon_app_mysql
  password: <%= ENV['AMAZON_APP_MYSQL_DATABASE_PASSWORD'] %>
```

sqliteをコメントアウトする

```terminal:Gemfile
#gem 'sqlite3', '~> 1.4'
```

mysqlを追加する

```terminal:Gemfile
gem 'mysql2', '>= 0.4.4'
```

mysql2を更新させ、反映させる

```terminal:ターミナル
$ bundle update
```

DBを初期化

```
$ rails db:migrate:reset
```
同僚の作成したdockerコンテナをbuildする際にコケたポイントメモ

## 初めに
同僚が作成してくれたnodeのdockerコンテナをbuildする際に何点かコケたポイントがありましたのでメモしてみます。
同様のケースで嵌っている方がいたら参考になれたらと思います！

## 前提
__コンテナを作成してくれた人のPC__
Mac Pro
こちらの環境では一発`docker-compose up --build`を流せばbuildとupが通る
__私のPC__
Windows10 Pro
npm --version
6.14.5
数回コケる
__コンテナの構成__
Node→image: node:latest
MySQL→image: mysql:5.7
Nginx→image: nginx:latest

## Cannot create container for service mysql: Conflict
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285286/4fe419ee-32b4-0aae-f188-ad9216f737a8.png)

既に__mysql__という名のコンテナが存在するからコンフリクトするぞというエラーですね。
他のnodeやnginxも同様に発生しました。
良くデフォルトの名前でコンテナ名をつける事が多いので、__プロジェクト毎にコンテナ名をAservice_mysqlとかユニークな名前を指定する__とスムーズかも知れませんね。
既に存在した__mysql__コンテナはもう殆ど動かないプロジェクトのものでしたので、

```shell
docker rm コンテナID
```
で__削除__しました。

## npm ERR! enoent ENOENT: no such file or directory, rename '/src/node_modules/constantinople' -> '/src/node_modules/.constantinople.DELETE'
constantinopleが見つからないと怒られました。
constantinopleは定数の評価で使用するモジュールのようですね。
https://www.npmjs.com/package/constantinople
__使用しているnpmのバージョンを最新にアップデートし解決__しました。
6.14.5→6.14.8

```shell
npm install -g npm
```

仮にこの方法で直らなかった場合、単にnpm install時にmoduleの中身が破損しているパターンや、`package-lock.json`が各モジュールを良くない組み合わせのバージョンで固定しているパターンが考えられるので、
__node_modulesの中身をすべて削除する__
__package-lock.jsonを削除して再度npm installする__
を試してみてください。

## npm ERR! Maximum call stack size exceeded
Nodeの最大コールスタックサイズを超えると発生するようです。
何でMacで起きないのにWindowsでは起きるんだ・・・。
__npmのキャッシュを削除__して__再度buildしたら問題なく起動__することができました。

```shell
npm cache clean --force
```
参考:https://www.it-swarm.dev/ja/javascript/npm%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%A7%E6%9C%80%E5%A4%A7%E3%82%B3%E3%83%BC%E3%83%AB%E3%82%B9%E3%82%BF%E3%83%83%E3%82%AF%E3%82%B5%E3%82%A4%E3%82%BA%E3%82%92%E8%B6%85%E3%81%88%E3%81%BE%E3%81%97%E3%81%9F/829336672/
ちなみにnodeのstackサイズを変更すれば暫定的にこのコールスタックサイズ問題は解決しますが、
Nodeのパフォーマンスが悪くなる、最悪動かなくなる恐れがあるので止めた方が無難みたいです。。

## 最後に
同じ開発環境を瞬時に構築できるdockerは開発シーンに必須といえるツールになっていますね！
異なるOSでも動くのは素敵です。
Rails Tutorial　第13章 演習13.4.1.2 paramsハッシュがなくなる

## 演習13.4.1.2 paramsハッシュがなくなる
ネットの他の方を見ると、params:ハッシュがなくなっている方が多かったです。一方テキストではなくなっていません。最近テキストが書き換えられたのかもしれません。

ネットの方の例

```ruby:test/integration/microposts_interface_test.rb
 post microposts_path, micropost: { content: content, picture: picture }
```

テキスト

```ruby:test/integration/microposts_interface_test.rb
      post microposts_path, params: { micropost:
                                      { content: content,
                                        picture: FILL_IN } }
```



### type="input"とtype=inputのどちらでも動きました。
ページのソースを見たところ、"input"だったので""を入れました。ネットの他の方は"”ありとなしのどちらもありました。

```ruby:test/integration/microposts_interface_test.rb

 test "micropost interface" do

    assert_select 'input[type="file"]'
```


##演習13.3.5.1 「有効な送信」でエラーを起こさせたところ他のところでエラーになる

```ruby:
#    if @micropost.save
    if true
      flash[:succsess] = "Micropost created!"
      redirect_to root_url
```

saveをしないようにコメントアウトしたところ、その前の「無効な送信」のテストが
エラーになってしまいました。saveをしないので、error_explanationが出ないようです。

```bash
FAIL["test_micropost_interface", MicropostsInterfaceTest, 0.9583898989999398]
 test_micropost_interface#MicropostsInterfaceTest (0.96s)
        Expected at least 1 element matching "div#error_explanation", found 0..
        Expected 0 to be >= 1.
        test/integration/microposts_interface_test.rb:17:in `block in <class:MicropostsInterfaceTest>'
```
【VMware ESXi】自宅にAnsible実行環境を作りたい～第1章：ubuntuサーバのDNS解決まで～

#### はじめに
最近、物理サーバを入手しまして、せっかくなので自宅にAnsibleの実行環境を構築することしました。以下、作業手順やポイントをまとめました。


####1.構成図
　今回はubuntuサーバからDNSで名前解決が出来るところまで実施します。
構成図は以下のようになっており、PCからWi-Fiを経由してubuntuサーバにアクセスします。
なお、DNSサーバのIPアドレスはグローバルアドレスなので、1.1.1.1と仮定します。
![構成図.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554812/084f0910-7fa3-ddc6-50ec-9b980c64a15b.png)

####2.PCに割り当てられているIPアドレスの確認
　PCのコマンドプロンプトで「ipconfig /all」と入力すると、無線LANから割り当てられた
アドレスがわかります。
![コマンドプロンプト.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554812/b599c41a-6374-2e88-be90-4af9fb097754.png)

####3.無線ルータが使用しているアドレスの確認
　構成図にあるようにesxiのmanagementとubuntuサーバに割り当てるアドレスを
決めたいのですが、無線ルータがDHCPですでに使用しているアドレスと重複しては
いけないので、念のため無線LANにログインして確認します。
　PCは無線LANによって、192.168.0.14が割り当てられており、ゲートウェイが192.168.0.1
になっています。つまり、192.168.0.1は無線LANに割り当てられているアドレスなので
PCから無線ルータにログイン可能です。
PCのブラウザに、`http://192.168.0.1`(ゲートウェイのアドレス)と入力します。
ログイン方法は無線ルータによって異なると思いますが、私の場合はログインIDとパスワードが
無線ルータの側面に書いてありました。
　ログインが完了すると、DHCPで使用しているアドレスがわかるので、これらのアドレスは
使用しないようにしてください。(以下、DHCPで割り当てたアドレスの確認結果)
![DHCP.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554812/fa4ff5ac-d1f8-1aab-6881-803e6caeab12.png)

####4.esxiのmanagementにIPアドレスを設定
esxi本体にHDMIなどで直接接続し、CLIから構成図にあるアドレスを設定しましょう。今回は
　IP：192.168.0.200/24
　GW：192.168.0.1（無線LANのアドレス）
　DNS：1.1.1.1
とします。設定が完了したら、本体を再起動してPCから接続します。
PCのブラウザに`http://192.168.0.200`(esxiのアドレス)と入力し、ログイン画面が出れば成功です。
![ログイン画面.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554812/b6429487-46f2-ed6f-17b0-30e56e05634c.png)

####5.ubuntuサーバの設定
　esxiにブラウザからログインできるようになったら、ubuntuのOSをダウンロードして
ubuntuサーバを構築しましょう。（サーバの構築手順は省略します）
構成図にあるように、ubuntuサーバには以下のアドレスを設定してvSwitch0と接続します。
　IP：192.168.0.201/24
　GW：192.168.0.1（無線LANのアドレス）
　DNS：1.1.1.1
ubuntuサーバを再起動して「nslookup google.com」と入力し、名前解決が出来れば成功です。
　ちなみに、無線LANに再度ログインして割り当てているアドレスを確認してみると
ubuntuサーバのアドレスがstaticとして追加されていました。
![DHCP_2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554812/c5be632a-aa61-6576-f490-64326ed1f65b.png)

#### 【注意】新設サーバのキーボードの設定
　ubuntuサーバを構築し、viを使用していたら「：」が入力出来なくて2時間ほど格闘しました。
サーバを構築後は、言語とキーボードの動作確認を実施しましょう。以下、URLに対策が載っていました。
[ESXiのブラウザコンソールで「:」とかが入力出来ない問題](https://stealthinu.hatenadiary.jp/entry/20180228/p1)
コンソール画面の右上の国旗マークを、日本の国旗にしましょう。
![esxi.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554812/308c8117-cd2d-3c31-e2c6-9469b10b6ecf.png)

####関連記事
[【VMware ESXi】自宅にAnsible実行環境を作りたい～第2章：AnsibleとvMXの導入～](https://qiita.com/masa2223/items/582f7f956a8d3b018e24)
[【VMware ESXi】自宅にAnsible実行環境を作りたい～第3章：AnsibleによるvMXの設定変更&syslogとの連携～](https://qiita.com/masa2223/items/b8f7581e1e66a52f9b22)
Laravelでneo4jを使ってみる①設定編

#①設定
・laravel バージョン　5.6
・neoEloquent バージョン 1.4.6

##１）Laravelプロジェクトをバージョン指定して作成


```
composer create-project "laravel/laravel=5.6.*" [プロジェクト名]
```

##2)Vinelab/NeoEloquentの設定

```
composer require vinelab/neoeloquent 1.4.6
```
※neo4jの設定がないと怒られる場合、先にconfig/database.phpの設定をしてキャッシュクリア。
　

##3)neo4jデータベースの利用設定

config/database.phpにneo4jの設定を追加

```
    'default' => env('DB_CONNECTION', 'neo4j'),
```

```
   'connections' => [
       ～
       'neo4j' => [
            'driver' => 'neo4j',
            'host'   => env('DB_HOST', 'ホスト名'),
            'port'   => env('DB_PORT', '7474'),
            'username' => env('DB_USERNAME', "neo4jユーザ名"),
            'password' => env('DB_PASSWORD', "neo4jパスワード")
        ],
```

.envの設定を変更

```
DB_CONNECTION=neo4j
DB_HOST=ホスト名
DB_PORT=7474
DB_USERNAME=neo4jユーザ名
DB_PASSWORD=neo4jパスワード
```





参考
[NeoEloquent](https://github.com/Vinelab/NeoEloquent)
chip8の研究 その3

# 概要

pongのアセンブラのソースからコンパイルしてシミュレータを起動した。

# 写真

![無題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/dcbd63c2-c264-b3af-96e4-af7d61af669f.jpeg)

# 成果物

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


# アセンブラソース


```
  LD  VA  2
  LD  VB  12
  LD  VC  63
  LD  VD  12
  LD  I,  Paddle
  DRW  VA  VB  6
  DRW  VC  VD  6
  LD  VE  0
  CALL  Draw_Score
  LD  V6  3
  LD  V8  2
Big_Loop  LD  V0  96
  LD  DT  V0
DT_loop  LD  V0  DT
  SE  V0  0
  JP  DT_Loop
  RND  V7  23
  ADD  V7  8
  LD  V9  255
  LD  I,  Ball
  DRW  V6  V7  1
Padl_Loop  LD  I,  Paddle
  DRW  VA  VB  6
  DRW  VC  VD  6
  LD  V0  1
  SKNP  V0
  ADD  VB  254
  LD  V0  4
  SKNP  V0
  ADD  VB  2
  LD  V0  31
  AND  VB  V0
  DRW  VA  VB  6
  LD  V0  12
  SKNP  V0
  ADD  VD  254
  LD  V0  13
  SKNP  V0
  ADD  VD  2
  LD  V0  31
  AND  VD  V0
  DRW  VC  VD  6
  LD  I,  Ball
  DRW  V6  V7  1
  ADD  V6  V8
  ADD  V7  V9
  LD  V0  63
  AND  V6  V0
  LD  V1  31
  AND  V7  V1
  SNE  V6  2
  JP  Left_Side
  SNE  V6  63
  JP  Right_Side
Ball_Loop  SNE  V7  31
  LD  V9  255
  SNE  V7  0
  LD  V9  1
  DRW  V6  V7  1
  JP  Padl_loop
Left_Side  LD  V8  2
  LD  V3  1
  LD  V0  V7
  SUB  V0  VB
  JP  Pad_Coll
Right_Side  LD  V8  254
  LD  V3  10
  LD  V0  V7
  SUB  V0  VD
Pad_Coll  SE  VF  1
  JP  Ball_Lost
  LD  V1  2
  SUB  V0  V1 
  SE  VF  1
  JP  Ball_Top
  SUB  V0  V1  
  SE  VF  1  
  JP  Pad_Hit
  SUB  V0  V1
  SE  VF  1
  JP  Ball_Bot
Ball_Lost  LD  V0  32
  LD  ST  V0
  CALL  Draw_Score
  ADD  VE  V3
  CALL  Draw_Score
  LD  V6  62
  SE  V3  1
  LD  V6  3
  LD  V8  254
  SE  V3  1  
  LD  V8  2
  JP  Big_Loop
Ball_Top  ADD  V9  255
  SNE  V9  254
  LD  V9  255
  JP  Pad_Hit
Ball_Bot  ADD  V9  1
  SNE  V9  2
  LD  V9  1
Pad_Hit  LD  V0  4
  LD  ST  V0
  ADD  V6  1 
  SNE  V6  64 
  ADD  V6  254
  JP  Ball_Loop
Draw_Score  LD  I,  Score
  LD  B  VE
  LD  V2  I
  LD  F  V1
  LD  V4  20
  LD  V5  0 
  DRW  V4  V5  5
  ADD  V4  21
  LD  F  V2
  DRW  V4  V5  5
  RET
Paddle  data  128
  data  128
  data  128
  data  128
  data  128
  data  128
Ball  data  128
  data  0
Score  data  0
  data  0
  data  0
  data  0

```

# beepについて

beepを鳴らす。


```
  ld  v0  4
  ld  st  v0
end  jp  end
```

以上。
JavaScriptの変数定義

JavaScriptの学習を始めたのでその日学んだことをアウトプットしていきます。

JavaScriptとはプログラミング言語の１つで、ページを移動せずに画面の表示を切り替えたり

画面を更新せずに、サーバーと通信することができます。



本題の変数の定義方法ですが、var、const、let、といった３つ存在します。

① var

varとは再定義、再代入が可能な書き方です。

例(定義方法)
![スクリーンショット 2020-09-09 21.28.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698652/f14ea9d8-9921-9ab1-288d-96a011159912.png)

console.log(sample)とするとおはようが出力されます。
![スクリーンショット 2020-09-09 21.30.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698652/233ad3df-8502-6c3e-4082-a07a332c455c.png)

また、再代入が可能でこうすると代入できます。
![スクリーンショット 2020-09-09 21.33.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698652/0b1583de-8fba-6a06-0473-93e9fb2b8bf9.png)

また、再定義も可能で
![スクリーンショット 2020-09-09 21.34.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698652/728b66a9-0ffd-3d61-7727-4eaad3f65af5.png)
と再定義すると
![スクリーンショット 2020-09-09 21.34.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698652/a0de27d6-ef9f-76aa-fd7b-418b05ce940c.png)

このような結果になります。

ただし、varは現在開発現場においてあまり使用されておらず、下記の２つがよく使用されるそうです。

②const

constは後から書き換えることのできない変数を定義する書き方です。
ただし再代入、再定義は共に不可です。

例（定義方法）
![スクリーンショット 2020-09-09 21.40.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698652/a0becdaa-6cff-921e-3324-9182eabb7ac8.png)

出力
![スクリーンショット 2020-09-09 21.41.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698652/1723c58e-d263-ff0e-4692-5603f19c040f.png)

再代入、再定義共に不可なのでこのようにエラーが表示されます。
![スクリーンショット 2020-09-09 21.43.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698652/5306ba04-c53d-04c3-08ac-9921a48de3ec.png)


③let

letは後で書き換えることができる変数を定義する書き方になります。
再代入は可能ですが、再定義は不可です。

例
![スクリーンショット 2020-09-09 21.47.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698652/57ee946a-dfa8-0434-addc-1e1cbd4fcb56.png)

出力
![スクリーンショット 2020-09-09 21.48.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698652/05422742-cd0d-4144-e4da-75dd0f507f4e.png)

代入
![スクリーンショット 2020-09-09 21.49.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698652/afe39102-af55-e927-0931-0b69a2c539d4.png)


とこのようになります。

参照
https://techacademy.jp/magazine/14872
Reality composer  のオブジェクトをタップで　Xcodeに通知


##Reality Composerで編集
下図のようにビヘイビアを設定
![スクリーンショット 2020-10-09 9.01.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658283/5b390b86-4459-3066-64b6-ccf7cf82dce3.png)

##Xcodeで編集

```swift
import UIKit
import RealityKit

class ViewController: UIViewController {
    
    @IBOutlet var arView: ARView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // Load the "Box" scene from the "Experience" Reality File
        let boxAnchor = try! Experience.loadBox()

        //追記「tapped」は上記図の赤枠で設定
        boxAnchor.actions.tapped.onAction = handleTapOnEntity(_:)
        
        // Add the box anchor to the scene
        arView.scene.anchors.append(boxAnchor)
    }
    
    //関数を追記
    func handleTapOnEntity(_ entity: Entity?) {
          guard let entity = entity else { return }
          // Do something with entity...
        print(entity) //Do something
      }
}

```
[Rails]エラーStandardError: An error has occurred, all later migrations canceled:  Column `外部キー名` on table `テーブル名` does not match column `id` on `テーブル名`の対処方法

## エラー内容

```
$ railｓ　db:migrate
```

上記コマンドを実行すると発生するエラー。ターミナルでのエラー表記は以下の通り。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643372/a1d49d1d-e075-0f17-69c9-7e68ad077c65.png)

```エラー文一部抜粋.
Column `user_id` on table `items` does not match column `id` on `users`, which has type `bigint(20)`. To resolve this issue, change the type of the `user_id` column on `items` to be :bigint. (For example `t.bigint :user_id`).
```

エラー文の一部を翻訳してみると...。

```エラー文翻訳.
テーブル `items` のカラム `user_id` が `users` のカラム `id` と一致しません。この問題を解決するには、`items` の `user_id` カラムの型を :bigint に変更します。(例えば `t.bigint :user_id`)。
```

今回はitemsテーブルが外部キーとして指定しているカラムが参照元と一致しませんよ！というエラーですね。

## 対処法(仮説)

結論、Railsでは外部キーを使用する際は`references型`を推奨しているので、`bigint型`を使用する必要はありません。

このエラーのポイントは**参照できません**ということなので、マイグレーションファイルの作成順に問題があると仮説できます。

## マイグレーションファイルの作成順とは？
外部キーを使用するテーブル(references型を記述するテーブル)と参照されるテーブルには作成順によって参照できなくなる場合があり、今回のエラーは作成順序の誤りで発生しました。

作成順は、①参照される側のテーブル→②外部キーを使用するテーブル(references型を記述するテーブル)です。
対処法はマイグレーションファイルの作成日時を修正してあげれば解決できます。

## 対処法(仮設検証)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643372/afbed0a0-d701-7e22-9194-1f64537b4bd1.png)
添付画像の数字部分を、参照される側のテーブルよりも外部キーを使用するテーブルの数字を大きくすれば解決します。

エラー分からは少し推測しづらいエラーですね。

今回の場合だと、`create_items`が`20200909000000`なら`20200909100000`でいいです。
ちなみに、**最初の4桁は西暦、次の4桁は月日です**。

## 最後に
今回のエラーはテーブル数が増えると発生しやすいエラーなのかなと思います。
ただ、対象法を知っていれば問題なく解決できると思いますので、参考にしてみてください！
Reactの特徴

#プログラミング勉強日記
2020年9月10日
JSには色々なフレームワークがあって、開発の用途によって使用するフレームワークが違うと思うので、まとめてみようと思う。まずReactについてまとめる。

#Reactとは
　Reactはサイトの見た目を作れるJavaScriptのライブラリ。Reactのモバイル版であるReact Nativeを使うとiOSとAndroidのアプリを作ることもできる。
　一言でいうとUIを作るためのJS用のライブラリである。

#コンセプト
　Reactの公式ホームページでは以下の3つのコンセプトがある。これらがReactの中核といえる考えである。

- Declarative
- Component-Based
- Learn Once, Write Anywhere

##Declarative(宣言的である)
　宣言的であることが、Reactの最大の特徴であるといえる。他人のコードを読んでも理解しやすい仕組みになっている。
　(jQueryではイベントに対して手続き的に処理を書くのでデバックもしにくく、読みにくいコードになってしまう)

##Component-Based(コンポーネント指向である)
　コンポーネント指向は、ソフトウェアを機能ごとに部品(コンポーネント)として分割して、必要に応じて組み合わせて使う考えのことである。
　機能を小さい部品にして持たせているので、状態の管理もしやすくて再利用も容易にできる。

##Learn Once, Write Anywhere(一度の学習で何度でも書ける)
　Reactを習得するとWEBアプリだけでなく、他の分野に適応することができる。例えば、React Nativeを使うことでモバイルアプリを開発することもできる。

#特徴
　Reactは以下の3つの特徴がある。

- レンダリングが高速
- 大規模なアプリほど向いている
- ドキュメントは英語が多い
- JSの基本構文を理解していればすぐに書ける

##レンダリングが高速
　Webページを描画することをレンダリングという。Reactでは更新された一部のみを変更するという効率的な仕組みによって、レンダリングする箇所は一部でよく高速で表示を切り替えることができる。


##大規模なアプリほど向いている
　この理由としては以下の5つの理由がある

- 管理しやすい設計(見やすい設計)
- 複雑な条件を組み込める
- 長期の運用ができる
- カスタマイズ性が高い



#参考文献
[組み込みでも始まったコンポーネント指向開発](https://xtech.nikkei.com/it/article/COLUMN/20100528/348618/#:~:text=%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%8D%E3%83%B3%E3%83%88%E6%8C%87%E5%90%91%E3%81%A8%E3%81%AF%E3%80%81%E3%82%BD%E3%83%95%E3%83%88,%E4%BD%BF%E3%81%86%E3%81%A8%E3%81%84%E3%81%86%E8%80%83%E3%81%88%E6%96%B9%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82)
Amazon Linux 2 で PHP を簡単にアップデートする方法


Amazon Linux 2 の、ここ1年位の Amazon Linux Extra を使って、PHP をインストールしている人は、Amazon Linux Extra でパッケージの Disable & Enable をするだけで、結構簡単に PHP のアップデートができるという話です。

参考: [Amazon linux 2でのphpの更新方法](https://qiita.com/P__act2_tech/items/69a5b94ead8ee3edbc7e) (感謝！)


# 自分の環境

- AWS
- 開発用のサーバー
- Amazon Linux 2
- PHP 7.1 の Extra を導入
- 導入済みの PHP 一覧 `libmcrypt php php-bcmath php-cli php-common php-dba php-embedded php-enchant php-fpm php-gd php-gmp php-intl php-json php-ldap php-mbstring php-mysqlnd php-odbc php-opcache php-pdo php-pecl-igbinaryphp-pecl-mcrypt php-pecl-zip php-pgsql php-process php-pspell php-recode php-soap php-xml php-xmlrpc`
- この [Ansible](https://github.com/concrete5cojp/ansible-c5-ma) を使ってサーバーの初期構築をしています
    - Apache, MariaDB
    - concrete5 CMS を動かしています。
- `ec2-user` などの sudo 権限のあるユーザーで実行

# 手順

1. Amazon Extra の PHP7.1 を無効化: `$ sudo amazon-linux-extras disable php7.1`
2. Amazon Extra の PHP7.3 を有効化: `$ sudo amazon-linux-extras enable php7.3`
3. `sudo yum update`
    - 本当は PHP だけをアップデートするべきですが、開発なので、まとめて実行しました。もしも本番環境であれば、PHP だけを選択してアップデートするように走らせたらよいかと
    - 例: `sudo yum update php*`
[AEスクリプトコピペ用]　最近よくある漫画動画のデフォセッティング

#デフォルトで必ず設定するものだけコピペ用に置いておく

スクリプトの内容は
現在開いている（ウィンドウで表示されている）コンポジションに対して
カメラレイヤーを追加（目標と位置も設定）
そしてレイヤーインデックス２の3Dレイヤー化・モーションブラーをオン
コンポジションのモーションブラーをオン

今のデフォセッティングはこんぐらいかな。
あとで追加していくかも

```jsx
var myComp = app.project.activeItem;
var addCam = myComp.layers.addCamera("cam",[myComp.width/2,myComp.height/2]);
addCam.transform.position.setValue([myComp.width/2,myComp.height/2,-2666.6667]);

myComp.layer(2).threeDLayer = true;
myComp.layer(2).motionBlur = true;

myComp.motionBlur = true;
```

ちなみにカメラの位置の設定の配列[2]は撮影距離なんだけども、今回は直接数字を入れているけど
カメラの焦点距離を変えると変わるから詳しく知りたい人はこの動画をチェックしてみて！

https://www.youtube.com/watch?v=1QvBUwjIxXQ
Ansible memo

# Ansible 雑多メモ

## このページの目的

Best practice が Best practiceと言いながら、公式ドキュメントでは記載されていなかったり、全然分からないような物ばかりなので色々メモを残しておく

### roles関係

#### meta情報の書き方

- [ここ](https://qiita.com/kouji-kojima/items/2525ea87952d4039bad7)とか

### vars関係

- dashは使ってはいけない
    - まあ、YAMLの仕様を考えれば分からないでも無いが yamllint/ansible-lintだとエラーを吐いてくれないのが困る。特に後者。おかしいだろ
    - https://github.com/ansible/ansible/issues/8849

### Tips

#### 1行が長すぎるので改行したい

基本的にはここ
- https://docs.ansible.com/ansible/latest/reference_appendices/YAMLSyntax.html

他には
- [ここ](https://blog.codebase.co.jp/yaml%E3%81%A7%E6%94%B9%E8%A1%8C)とか

> と | で扱いが変わるが要するにこれらを併用してなんとかする
ドコモ口座の不正出金の方法についてまとめてみた

#ドコモ銀行被害のポイント

- ドコモ口座を持っていなくても被害にあう
- スマホがドコモじゃなくても被害にあう
- 自分がスマホや携帯を持っていなくても被害にあう
- 対象銀行に口座を持っていなければ大丈夫

メガバンクから地方銀行まで、それなりに有名な銀行は「対象銀行」に当てはまっている。
→つまり、普通に銀行口座を持っているだけで被害に合う可能性がある

#口座番号と名義と暗証番号はどうやって割られるのか？

「口座番号と名義」というのは、実質的に開示されているので実は簡単に誰でも知りえることができる。
振り込みの際に番号や名義を教えたりしますよね？
そんな感じで簡単にしることができてしまうのがこのポイント

さらに、暗証番号は4桁で組み合わせは1万通りしかないので総当たりすればヒットしてしまう。
ふつうは1つの口座に対して暗証番号を3回間違えるとロックがかかるが、これは**「1つの鍵穴に対して3回鍵を間違えるとドアが開かなくなる」**という仕組み
しかし、今回は**「1つの鍵をたくさんの鍵穴に挿してみて、たまたま開いたドアから盗む」**という方法を使用したと思われる。（現時点では明確になっていないが、可能性は高い）

これを行うと、肝心の鍵は1万通りしかないので、無数の鍵穴に挿せば開く確率は高まるというわけだ。

#口座を簡単に複数持つことができてしまう？

通常、銀行口座開設には身分や住所の証明など厳重な本人確認が必要なので、1銀行につき1人1つしか口座を持てない。
「無数に口座をつくる」ということができないようになっている。

しかし、ドコモ口座は**メールアドレスだけで口座を開設できてしまう**
さらに、**メールアドレスはフリーメール（yahooやGoogleなど）でもいいのだ**
フリーメールなんて簡単に無数に無限に作成できる。
なので、**誰でも無限にでたらめな口座を作成でき、私たちの預金口座と簡単に繋げられるというわけだ**。

なのでドコモ口座の場合、適当なアドレスを作り、そこに適当な口座番号と名義を入れれば、それだけで成り済ませるのだ。

#さらにやっかいなこと

先述の通り、口座番号と名義は実質開示されているので、ここまでは誰でも出来てしまう。
フリーメールとロボットを使えば、これを自動で何万何億通りと作ることができる。

あとは先述の「ロボットによる鍵穴総当たり攻撃」をすればいいだけ

つまり、**全工程がロボットによる全自動でできてしまうのだ**。

そしてたまたま開いたドアから、堂々ドコモ口座に入金…というわけだ。

なんてガバガバな仕組みを作ったんだよ…

#被害に合った時は

まずは自分が被害に合っていないか通帳記帳をしてください。
「ドコモコウザ」から出金がある場合、それは被害にあっています。

被害に合ったらすぐに警察に連絡をしてください。
これは刑事事件です。被害を食い止めるためにもみなさんお願いいたします！


登録者だけが被害に合っていた7payよりもたちがわるいのだ。

どんなに銀行が本人確認を行っていても、警戒していてもドコモ口座を通せば以上のことが簡単にできてしまう。
Automation Anywhere A2019 - シェアポイントへのファイルアップロード

#A2019でシェアポイントへファイルをアップロードする方法

例えば定期的にレポートを作成してシェアポイントに保存とか、Webをクロールしてきてシェアポイントに保存といった業務プロセスがあるかと思います。

API連携をすれば、より高速な処理は可能となるかと思いますが、
ファイルをアップロードする程度であれば、画面操作で十分かと思います。

#タスクフロー

このサンプルでは、
1. ローカルのファイルを選択
2. ブラウザでシェアポイントの目的のページを開く
3. アップロード実施
という流れになっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/615564/12928b23-63b1-02b2-0a70-6d365fd00c58.png)

##ファイル選択

Bot Storeにある「[Java FX](https://botstore.automationanywhere.com/bot/java-fx-package/)」というカスタムパッケージを使っています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/615564/a8a46e73-f489-3949-a015-d70dd43eddb4.png)

実行するとこのようなダイアログが表示され、選択したファイルのパスが文字列変数に設定されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/615564/b445d52f-ccf8-43c8-6d8e-5a2f4c70ebf3.png)

##アップロード

レコーダーを利用して、「アップロード」や「ファイル」を選択しています。
レコーダーでアクションに変換された直後は、プロパティのアクションが「クリック」になってましたので、「左クリック」に変更。

そして、ファイルパスを指定するところは、そのままでも良かったのですが、
入力に時間がかかるようでしたので、前の記事で紹介したクリップボード貼り付け方式に変更。
UIで「ファイル」選択時にファイル名指定するテキストボックスにカーソルが当たっている状態になりますので、
念の為ちょっとの遅延を挟んで、Ctrl-vをキーストロークシミュレーションで入れています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/615564/1fb4abe2-94f4-e1e3-2a47-ca420777ea0c.png)

結構簡単にできますので、試してみて頂ければと思います。
Javaの配列・リスト・ストリーム相互変換一覧表

インスタンスメソッドで直接変換できたり、クラスメソッドで用意されていたり、もっと複雑なことが必要だったり、ややこしかったので纏めておく。

| from ＼ to | `T[]` | `List<T>` | `Stream<T>` |
|:--|:--|:--|:--|
| **`T[] array`** | `Arrays.copyOf(array, array.length)` | `Arrays.asList(array)` （固定長・配列と連動） | `Arrays.stream(array)`<br><br>`Stream.of(array)` |
| **`List<T> list`** | `list.toArray(new T[0])` | `new ArrayList<>(list)`<br><br>`Collections.unmodifiableList(list)` （変更不可） | `list.stream()`<br><br>`list.parallelStream()` （並列） |
| **`Stream<T> stream`** | `stream.toArray(T[]::new)` | `stream.collect(Collectors.toList())` | ※コピー不可、データソースから組み直すこと |

---

ドキュメント：

* 型
	* [（配列）](https://docs.oracle.com/javase/tutorial/java/nutsandbolts/arrays.html)
	* [java.util.List](https://docs.oracle.com/javase/jp/8/docs/api/java/util/List.html)
		* [java.util.ArrayList](https://docs.oracle.com/javase/jp/8/docs/api/java/util/ArrayList.html)
	* [java.util.stream.Stream](https://docs.oracle.com/javase/jp/8/docs/api/java/util/stream/Stream.html)
* ユーティリティクラス
	* [java.util.Arrays](https://docs.oracle.com/javase/jp/8/docs/api/java/util/Arrays.html) ： 配列の各種操作
	* [java.util.Collections](https://docs.oracle.com/javase/jp/8/docs/api/java/util/Collections.html) ： リストやマップなどの各種操作
	* [java.util.stream.Collectors](https://docs.oracle.com/javase/jp/8/docs/api/java/util/stream/Collectors.html) ： `Stream#collect()` の引数の生成

その他：

* [java - Copy a stream to avoid "stream has already been operated upon or closed" - Stack Overflow](https://stackoverflow.com/questions/23860533)

<!--
```java:実験用コード(jshell)
// ID: System.identityHashCode(object)
String[]       array  = new String[] { "a", "b", "c" };
List<String>   list   = new ArrayList<>(Arrays.asList(array));
Stream<String> stream = Arrays.stream(array);

String[]       array1a  = Arrays.copyOf(array, array.length);
List<String>   list1a   = Arrays.asList(array);
Stream<String> stream1a = Arrays.stream(array);
Stream<String> stream1b = Stream.of(array);

String[]       array2a  = list.toArray(new String[0]);
List<String>   list2a   = new ArrayList<>(list);
List<String>   list2b   = Collections.unmodifiableList(list);
Stream<String> stream2a = list.stream();
Stream<String> stream2b = list.parallelStream();

String[]       array3a  = stream.toArray(String[]::new);
List<String>   list3a   = stream.collect(Collectors.toList());
Stream<String> stream3a = stream.sequential();
Stream<String> stream3b = stream.parallel();
```
-->
chip8の研究 その２

# 概要

アセンブラのソースからコンパイルしてシミュレータを起動した。
ついでに、バイナリをディスアセンブルした。

# 写真

![無題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/275e8f7e-5cf3-6b82-26de-31295c4362be.jpeg)

# 成果物

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

# アセンブラソース

```
  ld  v3  5
  ld  v4  10
  ld  v5  5
  ld  v6  10
  ld  v7  1
  ld  v8  6  
  ld  I,  msg
loop2  drw  v3  v4  5
  add  v3  v5
  sub  v6  v8
  add  I  v5
  se  v6  0
  jp  loop2
loop  jp  loop
msg  data  144
  data  144
  data  240
  data  144
  data  144
  data  240
  data  128
  data  240
  data  128
  data  240
  data  128
  data  128
  data  128
  data  128
  data  240
  data  128
  data  128
  data  128
  data  128
  data  240
  data  0
  data  240
  data  144
  data  144
  data  240
  data  0
  data  0
  data  0
  data  0
  data  0
  data  144
  data  144
  data  0
  data  96
  data  96
  data  0
  data  240
  data  144
  data  144
  data  240
  data  240
  data  144
  data  224
  data  144
  data  144
  data  128
  data  128
  data  128
  data  128
  data  240
  data  224
  data  144
  data  144
  data  144
  data  224

```

# ディスプレーについて

drw命令で、フォントを転送する。
drw x位置　y位置　転送数
フォントのアドレスは、Iレジスタで指定する。
５，５に点を打つ場合は

```
  ld  v2  5
  ld  v3  5
  ld  I,  font
  drw  v2  v3  1
end  jp  end
font  data  128
```
です。
xorなのでもう一回、転送すれば、消える。

# キーについて

ld  v4  K でキー入力する。
0がxキー
1が1キー
2が2キー
3が3キー
4がqキー
5がwキー
6がeキー
7がaキー
8がsキー
9がdキー
10がzキー
11がcキー
12が4キー
13がrキー
14がfキー
15がvキー
並びは、以下。

```
123c
 456d
  789c
   a0bf
```

以上。
JavaのTimerで時間指定の処理を作ろう！！

#JavaTimer
一定間隔の時間を指定して、処理を実行したいときに使える

```java:JavaTimer
import java.util.Timer;
import java.util.TimerTask;

public class TimeAction {

	public static void main(String[] args) {

        Timer timer = new Timer(); 
        TimerTask tt = new TimerTask() {
            int count = 0;
            public void run() {
                // 定期的に実行したい処理
                count++;
                System.out.println(count + "回目のタスクだよん。");
            }
        };
        //2秒後に、5秒間隔で実行する
        timer.scheduleAtFixedRate(tt,2000,5000); 
    }
//timer.cancel();を書かないとずっと処理が動くので気をつけましょう！
}
```
Low-Shot Learning with Imprinted Weights のメモ

- Hang Qi, Matthew Brown, David G. Lowe , UCLAとGoogle
- https://arxiv.org/pdf/1712.07136.pdf

## 概要
転移学習をする際に、最終段をすげ替えてランダムに初期化するのが一般的だが、それを何とかする方法を提案している。新しいクラスを入れたときのアクティベーションの値を、そのまま重みにする。これをimprintingとよんでいる。

## 手法

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412142/fb1bc3bf-6503-f975-d084-ed528ee282b5.png)


 - この図はネットワークの絵と、行列計算が混ざっていてわけわからないが、右半分が行列演算。オレンジ色のベクトルの右肩についているTは転置を表しているらしい。
 - アクティベーションをそのまま重みに持っていくと、そのアクティベーションに対しては1が出力される。のでその値に関しては必ずそのクラスが正解になる。
 - このために、ConvNetの出力を正規化している。これが1つのポイント。

 - 結構偏った初期値を与えることになりそうなので、最終的な性能としては不利になる可能性もある。実際一部の実験ではそうなっている。

 - 鳥のデータセットで評価。

 - proxy-based メソッドというのがよくわからないが、triplet-loss のようなものに見える。neiborfood component analysis [J. Goldberger, G. E. Hinton, S. T. Roweis, and R. R.
Salakhutdinov. Neighbourhood components analysis. In
Advances in Neural Information Processing Systems, pages
513–520, 2005. 3] を読んでみること。