OmniAICreator/Qiita-1.07M huggingface dataset:
【Rails】devise関連のルーティングまとめ

deviseも便利な機能が故、それぞれ独自のメソッドが自動で生成してくれるルーティングについて、こんがらがってしまいます。
そんな同じお悩みの方はぜひ。

#devise_for


```routes.rb
  devise_for :users
```

```bash:
$ rails routes

Prefix                   Verb   URI Pattern                    Controller#Action

new_user_session         GET    /users/sign_in(.:format)       devise/sessions#new
user_session             POST   /users/sign_in(.:format)       devise/sessions#create
destroy_user_session     DELETE /users/sign_out(.:format)      devise/sessions#destroy
user_password            POST   /users/password(.:format)      devise/passwords#create
new_user_password        GET    /users/password/new(.:format)  devise/passwords#new
edit_user_password       GET    /users/password/edit(.:format) devise/passwords#edit
                         PATCH  /users/password(.:format)      devise/passwords#update
                         PUT    /users/password(.:format)      devise/passwords#update
cancel_user_registration GET    /users/cancel(.:format)        devise/registrations#cancel
       user_registration POST   /users(.:format)               devise/registrations#create
   new_user_registration GET    /users/sign_up(.:format)       devise/registrations#new
  edit_user_registration GET    /users/edit(.:format)          devise/registrations#edit
                         PATCH  /users(.:format)               devise/registrations#update
                         PUT    /users(.:format)               devise/registrations#update
                         DELETE /users(.:format)               devise/registrations#destroy
```

###resources :usersとの比較

| アクション名| リクエスト | resources | devise_for |
|:-:|:-:|:-:|:-:|
| new  |GET|  /users/new | /users/sign_up(.:format)  |
| edit |GET |  /users/:id/edit | /users/edit(.:format) |
| show |GET |  /users/:id | なし  |
| index |GET | /users  |  なし |
| create |POST | /users  | /users(.:format)  |
| update |PATCH / PUT | /users  |  /users(.:format) |
| destroy |DELETE| /users  | /users(.:format)  |


#devise_scope

```routes.rb
  devise_scope :user do
    get 'signin' => 'devise_token_auth/sessions#new'
    post 'signin' => 'devise_token_auth/sessions#create'
    post 'signup' => 'users#create'
    put 'update' => 'users#update'
  end
```

```bash:
$ rails routes

Prefix Verb   URI Pattern                  Controller#Action

signin GET    /signin(.:format)            devise_token_auth/sessions#new
       POST   /signin(.:format)            devise_token_auth/sessions#create
signup POST   /signup(.:format)            users#create
update PUT    /update(.:format)            users#update
```



#mount_devise_token_auth_for

```routes.rb
  mount_devise_token_auth_for 'User', controllers: {
    registrations: 'users'
  }
```

```bash:
$ rails routes

Prefix Verb   URI Pattern                  Controller#Action

signin GET    /signin(.:format)            devise_token_auth/sessions#new
       POST   /signin(.:format)            devise_token_auth/sessions#create
signup POST   /signup(.:format)            users#create
update PUT    /update(.:format)            users#update
```
typescript 型について

# typescriptの型まとめ

```typescript
// primitive
const apple: number = 5
const speed: string = 'fast'
const hasName: boolean = true

const nothingMuch: null = null
const nothing: undefined = undefined
const now: Date = new Date()

// array
const colors: string[] = ['red', 'green', 'blue']
const myNumbers: number[] = [1, 2, 3]
const truths: boolean[] = [true, false, true]

// class
class Car {}

const car: Car = new Car()

// object literal
const point: { x: number, y: number } = {
  x: 10,
  y: 20
}

const destinations = {
  Japan: {
    longitude: 153,
    latitude: 24
  },
  America: {
    longitude: 38,
    latitude: 97
  }
}
const { Japan }: { Japan: { longitude: number; latitude: number } } = destinations


//any
const every: any[] = [10, 'Jon', true, null, undefined]

// tuple
type Drink = [string, boolean, number]

const pepsi: Drink = ['brown', true, 40]
const sprite: Drink = ['clear', true, 40]
const tea: Drink = ['brown', false, 0]

// interface
interface Person {
  name: string,
  age:number,
  gender: boolean
}

const candidate = (person: Person) => {
  console.log(person.name)
  console.log(person.age)
  console.log(person.gender)
}
```
(Ruby on Rails6) テーブルへのデータの作成

#まえがき
テーブルでのデータ設定で、便利かなと思ったので、1つ・複数 のテーブルへのデータ設定を記録します。
いずれも、最後に save を行いますので。忘れずに！
データを取り出す時に、エラーになってしまいますよ!!

#テーブルへのデータの作成
##1つのデータ設定
```terminal:コマンド
rails console

変数1 = モデル名.new(カラム名: "内容")
test1 = Test.new(description: "smple_text")

変数1.save
test1.save
```

##複数のデータ設定
先のコマンドに <strong>,</strong> を入力します。

```terminal:コマンド
rails console

変数1 = モデル名.new(カラム名: "内容",カラム名: "内容")
test1 = Test.new(description: "smple_text",title: "smple_title" )

変数1.save
test1.save
```



#あとがき
ここまで読んでいただき、ありがとうございました。
以上が、テーブルへのデータの作成でした。
是非、お役立てください。

#Myリンク
また、Twitter・Portfolio のリンクがありますので、気になった方は
ぜひ繋がってください。プログラミング学習を共有できるフレンドが出来るととても嬉しいです。

<a href="https://twitter.com/0819_tateishi" target="blank">Twitter</a>
<a href="https://ayu-portfolio.herokuapp.com/" target="blank">Portfolio</a>
<a href="https://github.com/ayu0819" target="blank">Github</a>
Express×pugでアプリをビルドしたら、Cannot find module 'jade'とエラーが出た

今回は「Express × pug」環境を構築しようとしたら、エラーが出てハマったので共有します。

### こんなエラーが出た
```
Error: Cannot find module 'jade'
     at Function.Module._resolveFilename (internal/modules/cjs/loader.js:580:15)
     at Function.Module._load (internal/modules/cjs/loader.js:506:25)
     at Module.require (internal/modules/cjs/loader.js:636:17)
     at require (internal/modules/cjs/helpers.js:20:18)
     at new View (/app/node_modules/express/lib/view.js:81:14)
     at Function.render (/app/node_modules/express/lib/application.js:570:12)
     at ServerResponse.render (/app/node_modules/express/lib/response.js:1008:7)
     at /app/app.js:38:7
     at Layer.handle_error (/app/node_modules/express/lib/router/layer.js:71:5)
     at trim_prefix (/app/node_modules/express/lib/router/index.js:315:13)
```
`jade`というモジュールがないよって言われました。

### 解決方法
Expressの`app.js`のテンプレート・エンジンの指定を`jade`→`pug`に変更します。

```javascript
// app.js
app.set('views', path.join(__dirname, 'views'));
//以下の第二引数を変更します
// app.set('view engine', 'jade');
app.set('view engine', 'pug');
```
`Express`は`App.js`でテンプレート・エンジンを指定できるんですね。
公式ドキュメントはちゃんと読むべきと反省。

### Jadeをインストールしたら、ビルドはできるが、新たな警告が表示される
```
MacBookPro:src home$ npm i jade
npm WARN deprecated jad@0.0.0: Lost intereste in developing that, I've stopped switching OS 2 times a day...
npm WARN deprecated circular-json@0.3.3: CircularJSON is in maintenance only, flatted is its successor.
npm WARN ajv-keywords@2.1.1 requires a peer of ajv@^5.0.0 but none is installed. You must install peer dependencies yourself.
```

調べてみると、`pug`は`jade`の後継のようです。
`jade`は古いので、使わない方が良さそうですね。


### 参考資料
ありがとうございました。
https://stackoverflow.com/questions/47913589/error-cannot-find-module-jade-after-switching-to-pug
https://qiita.com/ganariya/items/85e51e718e56e7d128b8
(Ruby on Rails6) モデルとテーブルを作成する方法

#まえがき
今回は、Ruby on Rails6 でデーターベースのテーブルを作成する方法を忘却録として残します。


#モデルとテーブルを作成する方法
<strong>bin/ ・・・</strong> は <strong>Linux</strong> の開発環境で使用します。
(私はMAC{Unix}での開発環境で不要な文字ですが、知識として持っておくといいと思います。)
また、テーブル名前は "Form" の様に 頭文字を大文字にすると良いです。
##モデルと1種類のカラムの作成

```terminal:コマンド
$ bin/rails g model Smple_form title:string
$ bin/rails g model デーブル名 カラム名:データ型
or
$ bin/rails generate model Smple_form title:string
$ bin/rails generate model デーブル名 カラム名:データ型
```
##モデルと複数のカラムの作成

```terminal:コマンド
$ bin/rails g model Smple_form description:text title:string
$ bin/rails g model デーブル名 カラム名:データ型 カラム名:データ型
or
$ bin/rails g generate Smple_form description:text title:string
$ bin/rails g generate デーブル名 カラム名:データ型 カラム名:データ型
```

##テーブルの作成 マイグレーション

```terminal:コマンド
$ rails db:migrate
```
たまにマイグレーションを忘れて、エラーを出してしまいます。
ご注意ください。

##マイグレーションファイルの作成
↓は、複数カラムを作成したものになります。

```rb:20200926124610_create_任意s.rb
class CreateGoals < ActiveRecord::Migration[6.0]
  def change
    create_table :goals do |t|
      t.text :description
      t.string :title

      t.timestamps
    end
  end
end

```

#あとがき
ここまで読んでいただき、ありがとうございました。
以上が、モデルとデーターベースの作成でした。複数のカラム設定を記録できてよかったです。
是非、お役立てください。

#Myリンク
また、Twitter・Portfolio のリンクがありますので、気になった方は
ぜひ繋がってください。プログラミング学習を共有できるフレンドが出来るととても嬉しいです。

<a href="https://twitter.com/0819_tateishi" target="blank">Twitter</a>
<a href="https://ayu-portfolio.herokuapp.com/" target="blank">Portfolio</a>
<a href="https://github.com/ayu0819" target="blank">Github</a>
温度センサー DS18B20をESP32で動かすメモ

# はじめに
Amazonで買ったきりつかっていなかった温度センサDS18B20が転がっていたので使ってみました。
もともと防水処理が施されていました。
このセンサーは1-wireインターフェースといって、1つの配線でデータをおくれる便利なインターフェースのようです。
結局のところ、[こちら](https://qiita.com/hnw/items/315fad0d4b60ada10d00)に使い方がよくまとまっていました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212276/04ee5f66-8f58-a275-9fb9-c40c998781ab.png)

# つかったもの
## 部品
- ESP32
- 抵抗4.7kΩ
- 温度センサDS10B20

## ライブラリ
こちらを使うようです。
- [PaulStoffregen/OneWire](https://github.com/PaulStoffregen/OneWire)
- [milesburton/Arduino-Temperature-Control-Library](https://github.com/milesburton/Arduino-Temperature-Control-Library)



# 配線
[データシート](https://datasheets.maximintegrated.com/en/ds/DS18B20.pdf)にあるオーソドックスなプルアップ抵抗を使った回路で温度取得を試しました。

今回使用したセンサは、黒がGND、赤が5V,黄がデータ送信用のピンとなっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212276/72edf43f-448c-7140-dc70-8e5dda4e4046.png)


![D18B20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212276/d21690de-7cc3-ac68-967b-485a6e92e71f.png)

# プログラム
下記のサンプルコードを試しました。

```c++

#include <OneWire.h>
#include <DallasTemperature.h>

// Data wire is plugged into port 2 on the Arduino
#define ONE_WIRE_BUS 33

// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature. 
DallasTemperature sensors(&oneWire);

void setup(void)
{
  // start serial port
  Serial.begin(115200);
  Serial.println("Dallas Temperature IC Control Library Demo");

  // Start up the library
  sensors.begin();
}

void loop(void)
{ 
  // call sensors.requestTemperatures() to issue a global temperature 
  // request to all devices on the bus
  Serial.print("Requesting temperatures...");
  sensors.requestTemperatures(); // Send the command to get temperatures
  Serial.println("DONE");

  Serial.print("Temperature for the device 1 (index 0) is: ");
  Serial.println(sensors.getTempCByIndex(0));

  delay(500);
}

```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212276/9be7b28c-4299-1aa9-d439-7a965c353dc7.png)


# おわりに
使っていなかったセンサーが使えて満足です。
DS18B20を複数つかうためのやり方もあり、深掘りしていくと楽しそうです。
USキーボードでも全角半角キーをそのまま使う

追記:現在はMicrosoftから出ているPowerToysのKeyboard Managerがおすすめです。
キーの再マッピングを手軽に行うことができます。ただし、ChangeKeyとは異なり常駐させる必要があります。

Windowsで日本語を入力する人がUSキーボードに変えた場合地味に悩むのが、英語と日本語の切り替えです。
USキーボードでも、alt+「\`」 で切り替えが可能ですが、もう左上のキーだけで変更することに慣れきっていて面倒だったので、設定を変更しました
とはいえ、「\`」 や「~」などが打てなくなるのも困るので、自分はAppsKey(右Ctrlの左隣)に退避させました。
IMEの設定と、ChangeKeyを使います。[配布先リンク](https://forest.watch.impress.co.jp/library/software/changekey/)
ChangeKeyはレジストリを編集することでキー配置を変更しているので、変更後再起動が必要ですが、使用後は削除しても大丈夫な非常駐のソフトです。

まず、windowsの検索にIMEと入れれば 日本語IMEの設定 がでてきます。
そこの全般の中の、ほぼ一番下にある 以前のバージョンのMicrosoft IMEを使う をオンにしてから、その下の 詳細設定を開く を押します。
全般タブの編集操作にある変更ボタンを押し、キー追加でF13を追加、機能にIMEオンオフを入れて適応するだけ。
![スクリーンショット 2020-09-26 150832.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242735/ee78a17e-e5a9-3484-700c-c71583eb3c1a.jpeg)

こんなかんじになればOK。
次に、ChangeKeyで`キー(表示上は半角全角キー)を選んでから、次の画面の右上端(NUMPADのマイナスの上)にあらわれたscan codeを選択し、0064を入れる。(0x0064は目に見えぬF13キーのことです)
AppsKeyに半角全角キーを割りあてて、登録して再起動するだけ。
![スクリーンショット 2020-09-26 145834.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242735/e1e069f5-7a6c-9ab8-1c02-867720bf5fa4.jpeg)
こうなるはずです。
[Unity事始め]WEBカメラの映像を表示してみた

とあるアプリケーションを作ろうかと思っているのですが、unityを使ってみようかと思ってます。
そんなわけで事始め。unityの知識はまだ皆無です。

## 環境

surface goなのでしょぼいです。果たしてこれでスペック足りるのか。。

- win10 Home
- MEM 4GB

## ライセンス

unityは有料だっていう話を聞いたことがある。
でも試しに開発してみる程度なら無料でできたりするんじゃないの？って思ってる。

https://store.unity.com/ja#plans-individual

**利用資格：**
> 収入ならびに資金調達(自己資金を含む)の過去12ヶ月の合計が年間 10 万ドルを超えない場合、 Personal を使用できます。

なんだか不思議な条件だ。10万ドルって事は1000～1100万ぐらい。
・・残念ながら利用資格ありました。余裕で。

**プラン比較：**
Plusと比較して、できない事は以下。

- スプラッシュスクリーンのカスタム化
- Unity Teams Advanced（3 シート）
- 高度な Cloud Diagnostics
- コアアナリティクス

あんまりよくわからないので特に魅力は感じない。Personalでいいね。
学習コンテンツやら、サポートやらで付加価値がついてく感じなのかなぁ。

参考：
Unityのライセンスは何が違う？種類や内容を解説
https://www.capa.co.jp/archives/32867

## install

https://create.unity3d.com/jp-howto-install-win

こちらを参考にしました。
Unity Hubからインストールするといいらしい。
nvmとかvenvみたいなやつかな。もしくはanacondaみたいな。

インストールは難しいことなかった。
Unity Hub入れて、そこからUnity入れて、アカウント登録して、ライセンス登録して起動する。

## 何はともあれチュートリアル

https://learn.unity.com/tutorials

2D Platformer Mod: Billboard Face
https://learn.unity.com/tutorial/2d-platformer-mod-billboard-face-jp

っていうのが気になる。10分って書いてあるし試しにやってみよう。

### 画像が常に正面を向くビルボードを試す

まずはMicrogameプロジェクトを開けとあります。何のことやら。
プロジェクト作ってみればいいかな、と思ってUnityHubを開くと、2D Platformer MicrogameってのをDLできるようになってた。
きっとこれのことやな。

![unity2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308709/cc1229f3-1d4c-b241-48d6-9755366d0df3.png)

そんなわけでこれを選択してプロジェクトを作ります。
プロジェクト名はとりあえず、**Hello 2D Platformer**にしておいた。

なんか起動した。

![unity3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308709/1162da18-b854-c2aa-bb16-24ae4c7faf14.png)

次にこれをやる。

> Project ウィンドウの検索バーに「billboard」と入力してください（注意：入力後「Search」の横にあるフィルターが「All」に設定されていることを再確認してください）。
> もし「billboard」アセットが表示されたら、ステップ 1 から始めることができますが...お待ちください！あなたはまだマイクロゲームの最新バージョンを持っていないかもしれません。これは、今後リリースされる Mods を完了する場合に必要になります。確認してみましょう…
> ビルボードで検索したように、「donut」で検索してみてください。
> 検索しても何も表示されない場合は、それ以上の Mods を進める前に最新のマイクロゲームをこちらのリンク先 Get the latest Microgame から入手することを強くお勧めします。

「billboard」も「donut」も表示されたので問題なさそう。

で、ステップに従って進めると・・なるほどこういうことか。

![unity3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308709/f361e72b-5f23-07ec-b115-be8582d17d24.png)

マ〇オ兄弟的なゲームに看板を追加してみるっていうだけのチュートリアルね。


## プロジェクト作成

今度は1からHello Unityしてみます。

よくわからんけど `2D` 選んでみた。
**作成**を押した後、しばらく時間がかかる。

これ使ってみたいんですわ。

https://docs.unity3d.com/ja/current/ScriptReference/WebCamTexture.html

WEBカメラの情報を取り込んで表示できるらしい。

参考：
https://note.com/npaka/n/nbaa0e466b0de

この通りやってみます。

スクリプトの作成はこんな感じ。
https://docs.unity3d.com/ja/2018.4/Manual/CreatingAndUsingScripts.html

RawImage側からScriptを紐づけたらできました！

![unity4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308709/48bf822a-0231-3f16-4019-b3e1e74f3ae3.png)

デフォルトのカメラがsnap cameraのやつだったので、おとなしめのやつにして撮影。
テキストだけ乗せてみてます。ここまではけっこう簡単にできちゃうのですね。
Buildも簡単。`Build and Run`ってやっただけ。

画像をリアルタイムで加工するアプリを作りたいのだけど、難易度不明。
でもC#でスクリプト書けるってことは自由度は高いのかも。

## やってみて

- 用意されてる事は簡単にできそう
- android studioぐらいの重さを想像してたけど、(簡単なことであれば)あまりPCスペックは要求されない。
- スクリプトを書く量はそれほど多くならない？
- main cameraだとかそういう概念があまりわからない。(2Dアプリなら関係なさそう)
Flutterを試す（iOS/Android両方で実機実行するまで）

FlutterでiOS/Android両方で実機実行するまでを試したので、その記録。

## 環境

- MacBook Pro (16-inch 2019)
- macOS Catalina 10.15.6

## 手順
### 環境設定

まず、[ここ](https://flutter.dev/docs/get-started/install/macos)から最新のFlutter SDKをダウンロードする

それを好きな場所に置き、解凍する。

そして、以下のようにパスを設定してflutterコマンドを使える状態にする

```sh
export PATH="$PATH:<flutter SDKを置いた場所>/flutter/bin"
```

その後、

```sh
flutter doctor
```

して、あとは指示に従って全部OKになるまで設定を行う。

### アプリを作成

以下でアプリを作れる。

```sh
flutter create my_app # アプリの作成
cd my_app # 作ったら、実行するにはそのディレクトリに移動する必要がある
```

### Android実機での実行
Androidの実機をつなげた上で

```
flutter devices
```

と実行すると

```log
2 connected devices:

EML L29 (mobile)  • xxxxxx • android-arm64 •
Android 8.1.0 (API 27)
NのiPhone (mobile) • yyyyyyy • ios • iOS
13.3.1
```

のように表示される。ここではiPhoneもつなげているので同時に表示されている。ここに出ているID (xxxxxxとかyyyyyyyの部分)を指定して、端末指定で実機実行ができる。

```
flutter run -d <デバイスID>
```

初回、すごく長く時間がかかることがある。私の場合実行後30分くらい時間を潰してから再度見たら終わっていた。それでも終わっていなかったらおそらくエラーとみて原因を探した方がよい。

### iOS実機での実行

上記と同様、

```
flutter devices
```

でデバイスIDを調べ、

```
flutter run -d <デバイスID>
```

で実行する。しかし、プロジェクトが初期設定のままだと必ず

```log
No valid code signing certificates were found
```

というエラーが出るので、それに続く案内に従って対処を行うことで実行できる。

### iOS実機実行できないとき

```log
"iproxy" cannot be opened because the developer cannot be verified.
```

といったエラーが出たときは下記が参考になる。
https://flutter.keicode.com/devenv/flutter-on-mac-catalina.php

どうしてもコマンドラインから実機実行できない場合は、直接プロジェクトをXcodeで開いて実行する。私のケースでは、いちどXcodeから実行すると、コマンドラインからも実行できるようになった。

### シミュレータで実行するには
シミュレータを開いてから`flutter run`。

iOSの例

```sh
open -a Simulator
flutter run
```

### 複数のシミュレータ・デバイスで同時にホットリロードする

複数のシミュレータを開き（あるいはデバイスを繋いでおき）、

```sh
flutter run -d all
```

参考： [Unable to use 'flutter run' with both android & iOS emulators open #34547](https://github.com/flutter/flutter/issues/34547)
シェルスクリプトで特定の列を抽出する

【追記】もっと良い方法があったらコメントお願いします。

## 列を抽出する
こういうファイルがあるとする。

```abc.txt
aa bb cc dd ee ff
gg hh ii jj kk ll
mm nn oo pp qq rr
ss tt uu vv ww xx
```
そのうちn列目だけを取り出したいときの方法をまとめてみる。今回は3列目を取り出してみる。

## awk
今まではこれしか知らなかった。速度が遅くて悩んだのが今回調べるに至った動機。

```bash
cat ./abc.txt | awk '{print $3}'
```

## cut
さっき知った方法

```bash
cat ./abc.txt | cut -d ' ' -f 3
```

## while
1行ずつ取り出して配列に変換して取り出す。正直めんどいし遅そう

```bash
while read line; do
    _line=(${line})
    echo "${_line[2]}"
done < ./abc.txt
```

## 余談
自分はいつも`getclm`という関数を作成している。引数で列を指定し、テキストの内容は標準入力から受け取る。

```bash
function getclm() {
    echo "$(cat -)" | cut -d " " -f "${1}"
}
```

上の例の場合はこういうふうに使う。

```bash
cat ./abc.txt | getclm 3
```
githubを芝生にしたいズボラに送るシェルスクリプト

githubを芝生にしたいズボラに送るシェルスクリプトへようこそ！
ここに来たあなたは自他ともに認める``ズボラ``のはず！
でも安心してください！
ズボラなあなたでもgithubを芝生にしたり、githubにアートを描いたりできるんです！

それではやり方を紹介していきましょう
まずは適当なディレクトリを作ります


```
cd $HOME
mkdir PushPush
```
ディレクトリに移動して

```
cd PushPush
```

ここでファイルを作成しましょう

```
touch README.md
```

そうしたらこの``README.md``に変更を加えてくれるファイルを作成しましょう

```
vi push.sh
```
vimを使ったことがない人用に簡単に説明すると、
``i``を押すと標準モードから入力モードに移行して入力ができるので以下のコードを書いてください
書き終えたら``ctr+c``か``esc``を押して標準モードに戻って``:wq``で保存して終了してください

```push.sh
#!/bin/sh
cd ~/PushPush/
echo "." >> README.md
git add .
git commit -m '.'
git push origin master
```

こうですね！
そうしたら次に``remote repository``の設定をしましょう
ここはわからない人がいない設定で進めていきます
わからない方は以下を参考にするといいと思います
https://qiita.com/Futo_Horio/items/4d669f695680bc13d5fa

```
git init
git add .
git commit -m 'first commit'
git remote add 追加したいレポジトリ
git push -u origin master
```
でおっけい

そしたらコマンド上でシェルスクリプトを実行してみましょう
phpでいうと

```
php xxx.php
```
ってやつですね

```
bash push.sh
```
これで問題なく``push``できたか確認しましょう
これでできない場合はこの先のバッチ処理を実装しても意味がないので注意！

おそらくgithubのパスワード省略設定を追加していないだけだと思うので
そちらを追加していきましょう

```
vi ~/.netrc
```
でファイルを編集していきます
なくても作ってくれるので大丈夫

```.netrc
machine github.com
login username
password xxxxxxxxxxxx
```
参考
https://qiita.com/azusanakano/items/8dc1d7e384b00239d4d9
これでもう一度シェルスクリプトを実行してみてください

次はバッチ処理のための``cron``の実装です

```
crontab -e
```
を実行してください
間違って``r``をオプションに追加しないように笑
全部消えます笑

```
0 0,9,12 * * * ~/PushPush/push.sh
```

たとえばこんな感じ
これは0時、9時、12時に実行しているので一日3回ですね！
他にも

```
30 13-15 * * * ~/PushPush/push.sh
```
こうした場合は13時から15時の間で30分刻みで実行されます！
このファイルを``:wq``で保存して終了すれば勝手にインストールしてくれるので
これで終了です！
``cron``の細かい設定をしたい場合は以下の記事を見てみてください
https://qiita.com/hikouki/items/e744b3a4d356d2af12cf

あれ、、、
``README``に``.``書くだけかよって声が聞こえてきました。。。
そんなにPHPファイルに書き込みたいなら

```push.sh
#!/bin/sh
cd ~/PushPush/
echo 'null;' >> push.php
git add .
git commit -m '.'
git push origin master
```
にしてください

毎日1回pushされるのはヤラセ感があって嫌だというわがままな人は
これを応用しちゃえばおっけいです

たとえばこんな感じでしょうか

```push.sh
#!/bin/sh
cd ~/PushPush/
echo 'null;' >> push.php
git add .
git commit -m '.'
git push origin master
```

```push.php
<?php
if (rand(0, 1) == 0) shell_exec("sh ./push.php");
```
こんな感じでランダムでプッシュできるでしょう！
``crontab``では`php`ファイルを実施するにはファイル名の前に``$which php``をした後の実行結果を入力してください
そうしないと``bash xxx.php``が実行されるのでエラーになります
励みになるのでLGTM、ストックお願いします
JuliaでElasticsearchにリクエストを送る

ローカルに立てたElasticsearchにリクエストしている
サーバーを立てた場合はドメインを適切に変更する

```julia
using HTTP
using JSON

# ESの情報を取得する
HTTP.request("GET", "http://loccalhost:9200")

# indexを作成する
HTTP.request("PUT", "http://localhost:9200/julia_test")

# ドキュメントを登録する
create_param = Data(:last_name => "last_name", :first_name => "first_name", :age => 20)
HTTP.request("POST", "http://localhost:9200/julia_test/_doc", ["Content-Type" => "application/json"], JSON.json(create_param))

# IDで検索する
HTTP.request("GET", "http://localhost:9200/julia_test/_doc/aabb12345")

# 全件取得
HTTP.request("GET", "http://localhost:9200/julia_test/_search")

# 条件を指定して検索
search_param = Dict(:query => Dict(:match => Dict(:first_name => "first_name")))
HTTP.request("GET", "http://localhost:9200/julia_test/_search", ["Content-Type" => "application/json"], JSON.json(search_param))
```

### 参考
- [はじめての Elasticsearch - Qiita](https://qiita.com/nskydiving/items/1c2dc4e0b9c98d164329#%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88%E3%81%AE%E6%A4%9C%E7%B4%A2)
- [JuliaでHTTP Requestを送る方法 – Euniclus](https://euniclus.com/article/julia-http-request/)
カメラ起動させて人の顔にモザイクかけようぜ（OpenCV）

#1.はじめに
皆さんこんにちは！今回はpythonとOpenCVを扱って、カメラを起動させてリアルタイムで人の顔にモザイクを書けるプログラムを作成しました。
もしかしたら、すでに他の人が記事を書いているかもしれませんが…多分出ています。
とにかくやってみよう！
#2.手順
プログラムの流れはこちらになります。
1.カメラを起動させる。
2.人の顔を認識する。（Haar-like特徴分類器）
3.人の顔があるところをモザイク処理をする。
以上です。
#3.カメラを起動させる。
OpenCVを用いてカメラを起動させます。

```python:kido.py
import cv2
cap = cv2.VideoCapture(0)
while True:
    ret, img = cap.read()
    cv2.imshow('video image', img)#'video image'はカメラのウィンドウの名前
    key = cv2.waitKey(10)
    if key == 27:  # ESCキーで終了
        break
cap.release()
cv2.destroyAllWindows()
```
![video image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661723/220f0a7a-41c0-538c-bf4b-10d44255be72.png)

これでカメラの軌道はできますEscキーを押せばウィンドウが閉じてくれます。
#4.人の顔を認識させる（Haar-like特徴分類器）
OpenCVではHaar-like特徴分類器があらかじめ用意されています。便利です！
しかし、ファイルを保存しないと扱えないです。今回は人の顔を認識したいので[こちら](https://github.com/opencv/opencv/tree/master/data/haarcascades)のhaarcascade_frontalface_alt.xmlを扱います。

ちなみに、Haar-like特徴分類器とは画像の特徴をとられる特徴量から明暗差に着目したHaar-like特徴とアダブーストによってHaar-likeフィルタのサイズを変えながら特徴量を抽出し顔を検出しています。
では、カメラを起動して人の顔を認識させてみましょう。

```python:ninsiki.py
import cv2

#Haar-like特徴分類器を扱えるようにする。
face_cascade_path="haarcascade_frontalface_alt.xml" #pathを指定してください。
face_cascade = cv2.CascadeClassifier(face_cascade_path)

cap = cv2.VideoCapture(0)
while True:
    ret, img = cap.read()
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    faces = face_cascade.detectMultiScale(gray, scaleFactor=1.3, minNeighbors=5)
    #人の顔を矩形的に囲む
    for x, y, w, h in faces:
        cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), 2)
        face = img[y: y + h, x: x + w]
        face_gray = gray[y: y + h, x: x + w]
    cv2.imshow('video image', img)
    key = cv2.waitKey(10)
    if key == 27:  # ESCキーで終了
        break

cap.release()
cv2.destroyAllWindows()
```
![video image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661723/2fe47948-5d9f-b585-2c69-5d472166bf0f.png)
これで人の顔を検出できました。
#5.モザイクをかける
モザイク処理は難しいことは考えずに顔画像を一旦縮小してから拡大して顔画像に張り付けます。

```python:mozaic.py
import cv2

#Haar-like特徴分類器を扱えるようにする。
face_cascade_path="haarcascade_frontalface_alt.xml"
face_cascade = cv2.CascadeClassifier(face_cascade_path)
ratio = 0.07 #ここの値を変えるとモザイクの粗さが変わる。

cap = cv2.VideoCapture(0)
while True:
    ret, img = cap.read()
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    faces = face_cascade.detectMultiScale(gray, scaleFactor=1.3, minNeighbors=5)
    for x, y, w, h in faces:
        #モザイクの処理を個々の二行でしている。
        small = cv2.resize(img[y: y+h, x: x+w], None,fy=ratio, fx=ratio,interpolation=cv2.INTER_NEAREST)
        img[y: y + h, x: x + w] = cv2.resize(small, (w, h), interpolation=cv2.INTER_NEAREST)
    cv2.imshow('video image', img)
    key = cv2.waitKey(10)
    if key == 27:  # ESCキーで終了
        break

cap.release()
cv2.destroyAllWindows()
```
![video image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661723/48e4ed0b-7237-656d-8db6-2ba29a07f3f2.png)
完成しました。
#6.まとめ
今回は、リアルタイムで顔認識して顔にモザイク加工を施しました。明暗差で分類しているため、似顔絵でも反応してしまいます。（誤検知も結構ある）ですが、短いコードで顔検出（顔認識）が試せるのでOpenCV楽しいです。
今までブログなどの情報発信をしたことがないためわかりにくい文章になっているかもしれません。
これから、情報発信をしていき文章力をつけていきたいと思います、また技術で遊べる人間になるのが僕の夢なので温かい目で見守っててください。
これから、よろしくお願いします。
それでは！
JuliaでTwitterAPIを実行する

`Twitter.jl` というライブラリがあるのでこれを使うと簡単にできる

```julia
using Pkg
Pkg.add("Twitter")
```

twitterの開発者コンソールにアクセスしてトークンなどは取得しておく。

```julia
using Twitter
 
consumerKey = "yourConsumerKey"
consumerSecret = "yourConsumerSecret"
accessToken = "yourAccessToken"
accessSecret = "yourAccessSecret"
twitterauth(consumerKey, consumerSecret, accessToken, accessSecret)

user_timeline = get_user_timeline(count=10)
home_timeline = get_home_timeline(count=10)
```

**参考**
- [randyzwitch/Twitter.jl: Julia package to access Twitter API](https://github.com/randyzwitch/Twitter.jl)
- [Julia言語でTwitterのAPIを叩いてみた - non vorrei lavorare](https://abrakatabura.hatenablog.com/entry/2020/02/16/232721)
undefined method `**_path'のエラー

## 記事の目的
初学者の為、間違っているところはご指摘頂けると幸いです。
備忘録・アウトプット目的で投稿です。

##エラー内容

```new.html.slim
= form_with model: @review, local: true do |f|
  .form-group
    = f.label :purpose
    = f.text_field :purpose, class:'form-control',　id: 'review_purpose'
```
において、以下の「undefined method `reviews_path'」というエラーが発生。
そもそもreviews_path定義していないけどな。

```
ActionView::Template::Error (undefined method `reviews_path' for #<#<Class:0x00007fb7553f5138>:0x00007fb7553fc9b0>):
```

調べると、以上の「= form_with model: @review, local: true do |f|」のコードにおいては、form_with model: @review の箇所が内部的にpolymorphic_path(@review)というメソッドを実行しているそうで、 その実行結果がreviews_pathとなるのでそこでエラーが起きているらしい。

##対処法
記事をみてみると、以下のように「form_forでしっかりどこに飛ばすのか指定してあげれば解決するらしい。解決。

```new.html.slim
= form_for @review,:url => {:action => :create} do |f|
```

こちらに関しては、urlのオプションから実行しているコントローラーのnewアクションに該当するpathを作り出しており、このパスは存在するのでエラーとならないようです。
spirit::qiとboost::variantの併用について調べた

その後、調べた限りでは、spirit::qiは、boost::variantと併用されることが結構ある。

なぜか。
１つには、複数の型（int, double, bool..)を持つ入力を処理することがあるためである。

コードを見てみる。。。

     1#include <boost/spirit/include/qi.hpp>
     2#include <boost/variant.hpp>
     3#include <string>
     4#include <vector>
     5#include <iostream>
     6
     7using namespace boost::spirit;
     8
     9template <typename Iterator, typename Skipper>
    10struct QI_grammar : qi::grammar<Iterator,
    11  std::vector<boost::variant<int, bool>>(), Skipper>
    12{
    13  QI_grammar() : QI_grammar::base_type{values}
    14  {
    15    value = qi::int_ | qi::bool_;
    16    values = value % ',';
    17  }
    18
    19  qi::rule<Iterator, boost::variant<int, bool>(), Skipper> value;
    20  qi::rule<Iterator, std::vector<boost::variant<int, bool>>(), Skipper>
    21    values;
    22};
    23
    24struct display : public boost::static_visitor<>
    25{  
    26  template <typename T>
    27  void operator()(T t) const
    28  {
    29    std::cout << std::boolalpha << t << ';';
    30  }
    31};
    32
    33int main()
    34{
    35  std::string s;
    36  std::getline(std::cin, s);
    37  auto it = s.begin();
    38  QI_grammar<std::string::iterator, ascii::space_type> g;
    39  std::vector<boost::variant<int, bool>> v;
    40  if (qi::phrase_parse(it, s.end(), g, ascii::space, v))
    41  {
    42    for (const auto &elem : v)
    43      boost::apply_visitor(display{}, elem);
    44  }
    45}

ここで、13-21行目に注目する。

+```c++
    13  QI_grammar() : QI_grammar::base_type{values}
    14  {
    15    value = qi::int_ | qi::bool_;
    16    values = value % ',';
    17  }
    18
    19  qi::rule<Iterator, boost::variant<int, bool>(), Skipper> value;
    20  qi::rule<Iterator, std::vector<boost::variant<int, bool>>(), Skipper>
    21    values;
+```

15行目で、intかbool型をパースするルールを定義し、19行目でそれを受けている。
19行目で、boost::variantを使っている。

+```c++
15 value = qi::int_ | qi::bool_;
19  qi::rule<Iterator, boost::variant<int, bool>(), Skipper> value;
+```

boost::variantにはいろいろな説明があるが、捉え方としては「複数の型を持つタプル」というアイディアがある。

実行してみる。。。

<pre>
$ ./a.out 
false
false;
$ ./a.out
string
$ ./a.out
1,true,2,false,3,wrongString,4,true
1;
true;
2;
false;
3;
</pre>

intとbool型だけ受け付けているのがわかる。（｀ー´）b
勉強メモ4_visudoコマンドがrootユーザーしかできなかったのを、sudoで一般ユーザーもできるようにする

★1 rootでログイン　rinchomeユーザー作成

```
#グループ作成
[root@localhost ~]#groupadd rinchome
#ユーザー作成（グループをrinchomeにする）
[root@localhost ~]#useradd -g rinchome rinchome
#rinchomeユーザーのパスワードを変更
[root@localhost ~]#passwd rinchome
```

★2 rinchomeユーザーでログイン sudo visudoコマンド実行

```
#visudoコマンド実行
[rinchome@localhost ~]$ sudo visudo
あなたはシステム管理者から通常の講習を受けたはずです。
これは通常、以下の3点に要約されます:

    #1) 他人のプライバシーを尊重すること。
    #2) タイプする前に考えること。
    #3) 大いなる力には大いなる責任が伴うこと。

[sudo] rinchome のパスワード:
rinchome は sudoers ファイル内にありません。この事象は記録・報告されます。
[rinchome@localhost ~]$
```


★3 ★2でできなかったので、rootでログイン visudoを編集

```
[root@localhost ~]# visudo

以下↓↓を
## Same thing without a password
 %wheel ALL=(ALL)       NOPASSWD: ALL
 
以下↓↓に変更
 ## Same thing without a password
# %wheel        ALL=(ALL)       NOPASSWD: ALL
 %rinchome      ALL=(ALL)       NOPASSWD: ALL

```

★4 rinchomeでログイン もう一回、sudo visudoコマンドを実行、編集画面にいった

```
[rinchome@localhost ~]$ sudo visudo

## Sudoers allows particular users to run various commands as
## the root user, without needing the root password.
##
## Examples are provided at the bottom of the file for collections
## of related commands, which can then be delegated out to particular
## users or groups.
```

★5　まとめ


```
適当ななんちゃってSEなので、あってるかは不明
```
【Salesforce】Visualforceの標準リストコントローラサンプル

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239535/130a76de-ac06-2b7f-1aa9-92ccbc72372c.png)

```
<apex:page standardController="Contact" recordSetVar="contacts">
    <apex:form>
        <apex:pageBlock title="Contacts List" id="contacts_list">
            Filter:
            <apex:selectList value="{! filterId }" size="1">
                <apex:selectOptions value="{! listViewOptions }" />
                <apex:actionSupport event="onchange" reRender="contacts_list" />
            </apex:selectList>
            <!-- Contacts List -->
            <apex:pageBlockTable value="{! contacts }" var="ct">
                <apex:column value="{! ct.FirstName }" />
                <apex:column value="{! ct.LastName }" />
                <apex:column value="{! ct.Email }" />
                <apex:column value="{! ct.Account.Name }" />
            </apex:pageBlockTable>
            <!-- Pagination -->
            <table style="width: 100%">
                <tr>
                    <td>
                        Page:
                        <apex:outputText value=" {!PageNumber} of {! CEILING(ResultSize / PageSize) }" />
                    </td>
                    <td align="center">
                        <!-- Previous page -->
                        <!-- active -->
                        <apex:commandLink action="{! Previous }" value="« Previous" rendered="{! HasPrevious }" />
                        <!-- inactive (no earlier pages) -->
                        <apex:outputText style="color: #ccc;" value="« Previous" rendered="{! NOT(HasPrevious) }" /> &nbsp;&nbsp;
                        <!-- Next page -->
                        <!-- active -->
                        <apex:commandLink action="{! Next }" value="Next »" rendered="{! HasNext }" />
                        <!-- inactive (no more pages) -->
                        <apex:outputText style="color: #ccc;" value="Next »" rendered="{! NOT(HasNext) }" />
                    </td>
                    <td align="right">
                        Records per page:
                        <apex:selectList value="{! PageSize }" size="1">
                            <apex:selectOption itemValue="5" itemLabel="5" />
                            <apex:selectOption itemValue="20" itemLabel="20" />
                            <apex:actionSupport event="onchange" reRender="contacts_list" />
                        </apex:selectList>
                    </td>
                </tr>
            </table>
        </apex:pageBlock>
    </apex:form>
</apex:page>
```
[Google App Engine]10000ファイルの壁


<h2>10000ファイルの壁とは？</h2>
Google App Engineを触ったことのない方だと10000ファイルの壁と聞いてもピンとこないと思います

Google App Engineではデプロイするファイルの差分が10000ファイル以下だと以下のようなエラーが表示され、デプロイできないという仕様になってます
個人的には10000なんてすぐに超えてくるので全然足りないと日々ぼやいてますが。。。

```console
$ gcloud app deploy
ERROR: (gcloud.app.deploy) INVALID_ARGUMENT: This deployment has too many files. New versions are limited to 10000 files for this app.
- '@type': type.googleapis.com/google.rpc.BadRequest
  fieldViolations:
  - description: This deployment has too many files. New versions are limited to 10000
      files for this app.
    field: version.deployment.files[...]
```
これを回避する方法は主にこんなところではないでしょうか


+ 上限を上げる
+ ファイル数を削減する(デプロイしないファイルを設定する)
+ Cloud Storageにアップロードして使用する


<h2>ファイル数の上限を上げる</h2>
真っ先に思いつくのが上限は引き上げれないのかどうかではないでしょうか？
これに対する公式のドキュメントの中で以下のように書かれてます


>Is your app exceeding the default limits? If you have Silver, Gold, or Platinum support package, you can contact your support representative to request higher throughput limits  
アプリはデフォルトの制限を超えていますか？シルバー、ゴールド、またはプラチナのサポートパッケージをお持ちの場合は、サポート担当者に連絡して、より高いスループット制限をリクエストできます。

ここで言われているシルバーやゴールドなど組織でGoogle Cloudなどを使っていてさらに課金をしていると受けられるサポートのランクなのですが、詳しくは[ここ](https://support.google.com/cloud/answer/6282346#gcp)に乗ってます
ただ、あくまで<font color="red">**リクエスト**</font>ができるだけなので、確実に上げられるわけではないので注意が必要です。

つまり、**個人で使っている場合は制限を上げることはできない**というのが結論になります。

<h2>ファイル数を削減</h2>
Google CloudではGithubなどでいう`.gitignore`と同じようにデプロイしないファイルを選択する`.gcloudignore`というファイルが<font color="deeppink">**gcloud init**</font>を実行した際に作られ、そこに記述されたファイルのデプロイを行いません。
書き方をいくつか紹介しますが詳細は[こちら](https://cloud.google.com/sdk/gcloud/reference/topic/gcloudignore)を確認してください

```console
  #デプロイしないファイル
   .gcloudignore
   sample
   aa.php

  #ワイルドカードで複数ファイルも指定できる
　　*bar
　　samp*as

　#デプロイしないディレクトリ
　　/node_modules/
```

<h2>Cloud Storageにアップロードして使用する</h2>
App Engineにデプロイしようとすると10000ファイルの制約がありますが、Cloud Storageならば10000ファイルの制限もなく自由にアップロードすることができます。
なので、画像や動画、データファイル。テストデータなどはCLoud Storageにアップロードしてからその保管場所を指定して参照してやると便利です。
Cloud Storageに関する記事はいくらでもあるので、自分がわかりやすいと思ったものを使ってみてください！


<h2>[10/6 追記]サービスを複数のブロックに分ける</h2>
yamlファイルを各ブロックに配置することで、複数のブロックを1つのサービスとして運用できるようです。
これにより分けた1つずつのブロックに10000ファイルの制約が掛かり、負荷を分散することができます。
自分もあまり理解ができなかったのですが、[こちら](https://cloud.google.com/appengine/docs/standard/php7/configuration-files)が公式ドキュメントになるので、わかる方がおられたら教えていただけると嬉しいです！！

<H2>あとがき</H2>
冒頭でもいいましたが、10000ファイルなんてライブラリをインストールしたりしていると簡単に超えるのでもっと上限を上げてほしいですし、せめて個人利用でも課金すれば簡単に上限を上げれるようにしてほしいです。Firebaseが使いやすかっただけあり、Google CloudのUIやサービスはあまり好きにはなれそうにありません。。。

~~回避策として、サービスを細かく分割して、小さなサービスとして扱うことで各サービスに10000ファイルの上限をつけれるらしいですがやり方がわからなかったので、知っておられる方がおられたら教えてください！~~
kintone 一覧の絞り込み条件でエラーになったときの対応

一覧の絞り込み条件が原因で、プラグインや JavaScript カスタマイズでエラーになったのでメモしておきます。
ステータス値やドロップダウン等の選択肢を削除する場合は、一覧の絞り込み条件も見直しましょう。

# 概要

ステータス値やドロップダウンの選択肢を一覧の絞り込み条件に指定し、その後にステータス値・ドロップダウンの選択肢を削除すると、kintone.app.getQuery()、kintone.app.getQueryCondition() でエラーが発生し、返り値が null になる。
標準の一覧画面は、問題なく表示されるため、気が付きにくい。

![2020-09-26_20h58_18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/ff870b67-1a5a-939e-ce8f-be0398d06fe3.png)


# ステータスの設定と一覧表示

ステータスの設定：　未処理、処理中、承認、完了
![2020-09-26_20h36_21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/4422808f-1abd-7554-4c79-81a68156f55a.png)

一覧の絞り込み条件：　処理中、承認 

![2020-09-26_20h37_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/a110ee76-addc-5a52-8d63-67e1082048a9.png)

一覧画面の表示

![2020-09-26_20h43_56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/d0830c54-4316-c14b-d67c-b9a18f7ace7b.png)

# ステータス「承認」の削除と一覧表示

ステータス「承認」を削除
![2020-09-26_20h48_52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/8793bcb9-fdca-4d25-87f4-25e4f54508df.png)

一覧の絞り込み条件には、「承認」が残ったまま。
![2020-09-26_20h49_46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/44ff4ced-380a-d0c3-e27c-eec8c10bb024.png)

「アプリを更新」すると承認のレコードがあれば、エラーになる。
![2020-09-26_20h53_36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/a0e40e2a-cba0-61c0-1aa5-fe73966ab591.png)

承認のレコードを無くして、「アプリを更新」後の一覧画面：⇒ 問題なく表示される
![2020-09-26_20h56_09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/3c5ed440-995d-0156-d4eb-fee9e9130a10.png)

kintone.app.getQuery()、kintone.app.getQueryCondition() でエラーが発生し、返り値が null になる。
![2020-09-26_20h58_18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/7ed05a6b-a131-5588-1efc-830c9dbd7b65.png)

# 一覧の絞り込み条件から「承認」を外して表示

エラー対応として、一覧の絞り込み条件から「承認」を外して表示すると、kintone.app.getQuery()、kintone.app.getQueryCondition() の実行で、エラーが解消する。

![2020-09-26_21h01_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/30be7e5b-a32f-e801-e4dc-bfe0658a529d.png)

![2020-09-26_21h01_37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/de3e5bb4-07c4-4075-0d79-d30c0fbef7db.png)

# 一覧の絞り条件にあるドロップダウンの選択肢を削除した場合

ステータスと同様に、ドロップダウンの選択肢を削除した場合もkintone.app.getQuery()、kintone.app.getQueryCondition() の実行でエラーが発生する。

![2020-09-26_21h07_05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/b1bc68e4-e300-2fa9-4566-1af46049ae83.png)
Circle CIのDockerコンテナにsshでアクセスしてデバッグする

## はじめに
ローカルではパスするテストがCircleCiではパスしない、ということがあったので、CircleCiのコンテナにsshでつないでデバッグをしました。
おおむね、[公式](https://circleci.com/docs/ja/2.0/ssh-access-jobs/)通りなのですが、補足も必要なところもあるかと思うので、その時の手順を残しておきます。
windows環境ですので悪しからず。

## 前提
- sshは使用できず状態になっている前提です。
  - まだの場合は[こちら](https://qiita.com/TukamotoRyuzo/items/7bd4ff6810421bdc9924)などを参考に入れてみてください。
- githubとCircleCiもアカウントは持っている前提です。

## 準備
CircleCiにsshで接続するには、githubにsshで接続できる状態になっている必要があります。
[こちら](https://qiita.com/shizuma/items/2b2f873a0034839e47ce)を参考に設定をすると良いかと思います。

## デバッグ対象のコンテナをsshを有効にして再起動
CircleCiにアクセスし、デバッグしたいJobの"Rerun Job With SSH"を選択する。
WorkFlowではなくJobを選択する必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397131/f07f2c8c-be11-e16e-362f-5c9d0bedb2b1.png)

以下のようにEnable SSHのステップが追加されてワークフローが開始されます。
以下の白枠の箇所にポート番号とホストのipアドレスが表示されますのでこれを使ってsshでコンテナに接続していきます。

![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397131/acbe3ce6-1e9f-b57a-b8aa-ac4c2023e2c8.png)

## sshでコンテナに接続
先ほど表示された情報をもとにsshでコンテナに接続します。
途中で接続するか聞かれたらyesと答えておけば良いです。

```
ssh -p <port> <ip address>
```

これでコンテナに接続した状態になるはずなので、いろいろデバッグに必要な情報が取れると思います。
また、ローカルに戻った状態で以下のようなscpを使ったりしてコンテナのファイルやディレクトリをダウンロードしたりもできます。

```
scp -r -P <port> root@<ip address>:<コピーしたいディレクトリのパス> <ローカルのダウウンロード先のパス>
```


## 終わりに
Dockerを使ってても、ちょこちょこローカルとCircleCiでの結果が異なることがあり、その際にデバッグしたりしています。そもそもデバッグがいらなくなるようDockerやOSについても学んでいきたいなーと思います。
【Blender】 2.9 ディフーズBSDFとは

# 動作環境
本記事の動作環境は以下の通りです。
(2.9にアップデートしました)
 
| 項目             |               環境 |
|:-----------------|:------------------|
| OS               |         Windows 10 | 
| Blender          |               2.9 |

#ディフーズBSDFとは

参考：[https://docs.blender.org/manual/en/latest/render/shader_nodes/shader/diffuse.html](https://docs.blender.org/manual/en/latest/render/shader_nodes/shader/diffuse.html)

ランバート反射やOren-Nayarの拡散反射を追加するときに使用するBSDF。
<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682933/a40b27a9-deab-0150-9dcd-d377c8560690.png">

#ランバート反射とは

参考：[http://ja.wikipedia.org/w/index.php?curid=1074021](http://ja.wikipedia.org/w/index.php?curid=1074021)

簡単に言うと、どこから見ても同じ輝度になるように反射するということ。

<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682933/d13d1842-2b70-3634-4b38-ea64a634891c.png"> <img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682933/f04f565b-26d5-529c-53a8-4b4ba1e3dfbc.png">
   <img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682933/a753a6bc-5d57-1ef1-2a80-aa3fccd2d213.png">


#Oren-Nayarの拡散反射とは



参考：[http://ja.wikipedia.org/w/index.php?curid=2818082](http://ja.wikipedia.org/w/index.php?curid=2818082)

ランバート反射に粗さを加味したもの。
コンクリート・石膏・砂と言った、自然界で広く見られる物体の表面を正確に表現できるのが特徴。
サーフェスを複数のファセット（細かいランダムな向きの表面）の集合体と捉えて計算を行う。
ノードの粗さの部分の数字を上げていくとOren-Nayarの拡散反射になる。


![diffuse_bsdf_2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682933/ad0e859f-f0bd-a14f-7642-829d1d72fd74.png)
【Ruby on Rails】Rakeタスクを定義してみよう。

## Rakeタスクってなに
タスクってなに、、、「やること」っていう意味かな。はじめて聞いた時はそう考えましたが、調べてみるとRuby on Railsにはタスクというものが存在するらしい。
 
### Rakeタスクとは
このタスクという機能は、いちいちアプリケーションを立ち上げるなくてもターミナルから任意の処理を実行することができるものらしい。自分が携わっているアプリケーションでは、開発段階でサンプルのデータが必要だったので、それをこのタスクというものを使って作成した。

## タスクを作成してみる
``` ruby
rails g task sample
```
これで``sample.rake``というタスクに関するファイルを作成する。
``lib/tasks``にsample.taskという名前のファイルを作成。

``` ruby
namespace :greet do
end
```
作成したファイルには、デフォルトで上のようなコードが書かれている。
この中を自分がタスクとして行いたい処理をコマンド一つで実行されるように書いていく。
 
``` ruby
# タスク名前を書く。
namespace :sample do
  # タスクの説明を書く。 desc => description（説明）
  desc ""
  # db => タスクの名前を書く。
  task db: :environment do
    # 実行したい処理を記述する場所
  end
end
```

上から、、、、
●名前を書く →　namespace
●タスクの説明 →desc
●タスクの名前　→　task db: 上の例だと db　がそう。

``` ruby
namespace :sample do
  desc "ゴリラと表示するタスク"
  task gorira: :environment do
    puts "ゴリラ"
  end
end
```

作成したタスクがきちんと動作するか確認をしてみる。

```
rails sample:gorira
```
↓

``` ruby
ゴリラ
```

これでrake タスクの完成。
サクッと公開鍵認証で SSH ログインする

# はじめに

SSH ログイン、まだパスワード入力してるの？
公開鍵認証方式にすれば省略できるよ！

クライアント側：Linux（WSL/2 環境も含む）
サーバ側：Linux

以下、サクッとクライアント側の作業。

# サクッと鍵の生成

色々聞かれるけれど全てエンター連打でOK。

```
$ ssh-keygen -t ed25519
```

# サクッと鍵をサーバに登録

上記で生成した公開鍵を、ログインしたいサーバに登録する。

```
$ cat ~/.ssh/id_ed25519.pub | ssh <ユーザ名>@<ホスト> 'cat >> ~/.ssh/authorized_keys'
```

# 以上！動作確認！

```
$ ssh <ユーザ名>@<ホスト>
```

パスワード無しでログインできる！ヤッター！

# 詳細・メモ書き

## ログインできない場合

ゆってなかったけど、サーバ側の準備ができていないとサクッといけないんすわ。
サクッといかない場合は、接続先のサーバ側で以下を確認。

### ~/.ssh/authorized_keys ファイルが正しく存在すること

`.ssh` ディレクトリと `authorized_keys` ファイルのパーミッションが正しいことを確認する。

```
$ mkdir ~/.ssh
$ chmod 700 ~/.ssh
$ touch ~/.ssh/authorized_keys
$ chmod 600 ~/.ssh/authorized_keys
```

### 公開鍵認証が有効になっていること

sshd の設定ファイルを開く。

```
$ sudo vim /etc/ssh/sshd_config
```

`PubkeyAuthentication` がコメントアウトか、または `no` だと公開鍵認証方式が無効になっているので、以下のように `yes` で設定する。

```
PubkeyAuthentication yes
```

sshd サービスを再起動して反映

```
$ sudo systemctl restart sshd
```

## 鍵の署名アルゴリズムの種類と選択

### RSA

セキュリティ面でも速度面でも積極的に選択する理由が無い。
セキュリティ面は 4096bit ならまだ大丈夫らしい。
無指定では 2048bit で生成される。

```
$ ssh-keygen -t rsa -b 4096
```

### ECDSA

RSA より安全で高速な署名アルゴリズムを使用している。
鍵長は 256, 368, 521bit。512じゃなくて521で正しい。
521bit でも RSA より高速で、今は無難な選択。

```
$ ssh-keygen -t ecdsa -b 521
```

### Ed25519

新しいものなので対応していない SSH サーバに出会うかも。
ECDSA より安全で高速な署名アルゴリズムを使用している。
鍵長は 256bit 固定。

```
$ ssh-keygen -t ed25519
```
情報セキュリティ関連の用語集

# はじめに
- CISSPの学習中に作り始めた情報セキュリティ関連の用語集です。
- 用語の説明は意図的に端的な表現にしています。（詳しい説明をしてくれるサイトは他にたくさんあるため）
- 本記事の内容は随時更新していきます。

# ネットワークセキュリティ
### VPN
- IP-VPN・・・IP。閉域網。
- SSL/TLS・・・TCP。デジタル証明書で認証。
- IPsec・・・IP。PSK or デジタル証明書などで認証。
- L2TP/IPsec・・・マルチプロトコル。PPPで認証。
- PPTP・・・古い。MSなどが開発。
- L2F・・・古い。Ciscoが開発。
- その他・・・SSHなど。APで認証。

# 認証
### フェデレーション
- OpenID・・・認証。XML。古い。
- OAuth・・・認可。古い。
- OpenID Connect（OIDC）・・・認証と認可（OAuth 2.0＋認証）。JSON。コンシューマ向け。ソーシャルログインなど。
- SAML・・・認証と認可。XML。エンタープライズ向け。Oktaなど。

### プロビジョニング
- SPML（Service Provisioning Markup Language）・・・SOAP＋XML。古い。
- SCIM（Simple Cloud Identity Management）・・・REST＋JSON。新しい。

### ID管理
- IAM（Identity and Access Management）・・・IDとアクセスの管理
- IGA（Identity Governance and Administration）・・・IAMのガバナンスと管理
- PAM（Privileged Access Management）・・・特権アクセスの管理

### ワンタイムパスワード（OTP）
- カウンタ同期方式・・・HOTP（HMAC-based）。RFC 4226。ほぼロストテクノロジー。
- 時刻同期方式・・・TOTP（Time-based）。RFC 6238。Google Authenticatorなど。
- チャレンジレスポンス方式・・・マトリクス方式を含む。SECUREMATRIX、PassLogicなど。
- トークンレス方式・・・二経路認証。電話、SMS、メール、モバイルプッシュ認証など。

※ 名称にかなりの揺れがあるため注意

### FIDO
- FIDO（Fast IDentity Online）・・・ファイド。クライアントとサーバ。任意のローカル認証＋公開鍵でリモート認証。
- FIDO Alliance・・・FIDOを策定。2012年に設立。250組織以上。
- FIDO 1.0・・・UAF or U2F。
- FIDO 2.0（FIDO2）・・・UAFとU2Fを統合。Windows 10、Android 7.0以降などが対応。
- UAF（Universal Authentication Framework）・・・生体認証。
- U2F（Universal 2nd Framework）・・・二要素認証。
- WebAuthn（Web Authentication）・・・FIDO 2.0のWeb API。JavaScript。
- CTAP（Client To Authentication Protocol）・・・FIDOのプロトコル。
- 認証器（Authenticator）・・・秘密鍵を保管。組み込みや外部デバイスなど。

### リスクベース認証
- 位置情報・・・GPS、モバイル回線、Wi-Fi、IPアドレス（国・地域）、モバイルセンサー、検索ワードなど
- 時刻情報・・・カレンダー、曜日、時間帯など

# エンドポイントセキュリティ
- MDM (Mobile Device Management) ・・・モバイルデバイス管理
- MAM (Mobile Application Management) ・・・モバイルアプリケーション管理
- MCM (Mobile Contents Management) ・・・モバイルコンテンツ（データ）管理
- EMM (Enterprise Mobility Management) ・・・MDM + MAM + MCM
- UEM (Unified Endpoint Management) ・・・EMM + PC管理

# Webセキュリティ
- RBI（Remote Browser Isolation）・・・Web分離
- WAAP（Web Application and API Protection）・・・WAF + APIセキュリティ + Bot/DDoS対策

# メールセキュリティ
### クライアント
- PGP・・・S/MIMEとの最大の違いは「web of trust」。自分の信頼する人が信頼している人は、自分も信頼できるという前提。古い。
- S/MIME・・・PGPとの最大の違いは「PKI」。クライアント証明書が必要。Outlookは対応済。Yahooメールは未対応。ネット銀行が送信するメールなどに一部利用されている。

### サーバー
- SPF（Sender Policy Framework）・・・DKIMとの最大の違いは「IPアドレスで認証すること」。かなり普及している。
- DKIM（Domainkeys Identified Mail）・・・SPFとの最大の違いは「公開鍵で認証すること」。そこそこ普及している。
- DMARC（Domain-based Message Authentication, Reporting, and Conformance）・・・認証がNGの場合のポリシーを送信者が指定する（何もしない or 隔離する or 破棄する）。全然普及していない。

# クラウドセキュリティ
- CSPM（Cloud Security Posture Management）・・・クラウドセキュリティポスチャ管理（設定の監査）
- CWPP（Cloud Workload Protection Platform）・・・クラウドワークロード保護プラットフォーム
- CNAPP（Cloud Native Application Protection Platforms）・・・CSPM + CWPP + α。Gartner用語。

# セキュリティ運用
- 脅威ハンティング・・・インシデント発覚前
- フォレンジック・・・インシデント発覚後

# 免責事項
- 本記事の作成および公開は投稿者本人の個人的な学習を目的としており、完全性、網羅性および正確性の保証は一切ありません。
- 本記事の内容より損失または損害が発生した場合でも、投稿者はいかなる責任も負いません。（自己責任でお願いします。）

# 更新履歴
- 2021/5/17：全面改訂
- 2021/6/8：Webセキュリティを追加
- 2024/6/6：CNAPPの説明を更新
【Vue】コンポーネント間のデータとメソッドの受け渡し

# はじめに

Vueの基礎的な部分、コンポーネント間のデータの受け渡しの備忘録。
親コンポーネントから子コンポーネントへのデータ受け渡しについて。
また、親コンポーネントのメソッドを子コンポーネントで利用する方法も載せた。

なお、デザインテンプレートにvuetifyを使っている。

# 環境
- vue: 2.6.10
- vuetify: 2.1.0

# サンプルコード

## 親コンポーネント

```vuejs:parentComponent.vue
<template>
  <v-card>
    <child-component
      :users
      :teamId
      @showList="showUserList"
    />
  </v-card>
</template>

<script>
import childComponent from "@/components/molcules/childComponent"

export default {
  components: {
    "child-component": childComponent,
  },
  data() {
    return {
      users: [
        "Alice",
        "Bob",
      ],
      teamId: 3,
    }
  },
  methods: {
    showUserList(item) {
      console.log("showUserList: " + item)
    },
  },
}
</script>

```

``<child-component>``タグ内の``:users``と``:teamId``の記述で、親コンポーネントの``users``と``teamId``を子コンポーネントに渡している。

また、同じ``<child-component>``タグ内の``@showList="showUserList"``で、親コンポーネントの``showUserList``メソッドを子コンポーネントの``showList``メソッドに渡している。

## 子コンポーネント

```vuejs:childComponent.vue

<template>
  <v-card>
    {{ teamId }}
    <v-list
      v-for="(user, index) in users"
      :key="index"
    >
      {{ user }}
    </v-list>
    <v-btn
      @click="showList"
    >
    </v-btn>
  </v-card>
</template>

<script>
export default {
  props: {
    users: {
      type: Array,
      required: false,
      default: () => []
    },
    teamId: {
      type: Number,
      required: true,
      default: () => 0
    }
  },
  methods: {
    showList(item) {
      this.$emit("showUserList", item)
    },
  },
}
</script>

```

``props``内に``users``を記述することで親コンポーネントの``users``を、``teamId``を記述することで``teamId``を受け取っている。
``users``はArray型なので``type: Array``、``teamId``はNumber型なので``type: Number``としている。
さらに``required``や``default``も記しているが、他にも細かく追記したり簡略化して書いたりできる。
詳しくは[公式ドキュメント](https://jp.vuejs.org/v2/guide/components-props.html#%E3%83%97%E3%83%AD%E3%83%91%E3%83%86%E3%82%A3%E3%81%AE%E3%83%90%E3%83%AA%E3%83%87%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3)を参考に。

# おわりに

他にも、子コンポーネントのメソッドを親コンポーネントで使う``ref``についてもそのうち本記事に追記するかもしれない。

# 参考

- [プロパティ — Vue.js](https://jp.vuejs.org/v2/guide/components-props.html)
【2D OD】SSDとYoloV3の比較

<h1>SSD vs YoloV3</h1>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/c4122f61-6673-776e-bd3e-bd88dec20ee0.png)

<h3>multi scale detection</h3>
大きな違いはSSDではそれぞれの解像度から直接物体を検出しているのに対して、YoloV3は小さい解像度から大きい解像度に情報を伝搬してから物体を検出している。


<h1>結論</h1>
構造的にはSSDもYoloV3もほとんど同じだが、大きな違いはSSDが情報が一方向にしか伝えていないが、YoloV3はGlobal情報をLocal情報を組み合わせる事が出来ている。


<h1>参考文献</h1>
SSD: Single Shot MultiBox Detector
https://arxiv.org/pdf/1512.02325.pdf

SSD object detection: Single Shot MultiBox Detector for real-time processing
https://medium.com/@jonathan_hui/ssd-object-detection-single-shot-multibox-detector-for-real-time-processing-9bd8deac0e06