OmniAICreator/Qiita-1.07M huggingface dataset:
Laravelで変数をJavaScriptに渡す

一番外側のレイアウトの役割を持ったbladeファイルに`window.Laravel`とグローバルに定義をする

そして他のビューや子のビューでレンダリングできるように`scripts`という名前でスタックを作っておく（`@stack('scripts')`）。

```html
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<script>
  window.Laravel = window.Laravel || {};
</script>
@stack('scripts')

<body>
  @yield('content')
</body>
</html>
```

そして子のビューなどでJSへ変数を渡したい場合があるときは、`@push`ディレクティブに`@stack`ディレクティブに使った名前を使用して変数を代入します。これでJS側で変数を使うことができます

```html
// $greeting = 'Hello world!';

@push('scripts')
    <script>
        window.Laravel.greeting = $greeting;
    </script>
@endpush

```
わたしのターミナルはかわいい

# 結論
<b>かわいい💮</b>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567854/99275ef2-d47f-80cd-09db-02b6150ce2e1.png)

# かわいいはつくれる
1. <b>StartShip</b>をシェルに導入
1. かわいい<b>プロンプト記号を設定</b>
1. <b>iTerm2</b>を導入
1. かわいい<b>カラーリングを設定</b>

+α お好み設定

## 1. StarShipを導入
### [StarShip](https://starship.rs/ja-jp/)とは
- <b>軽量・カスタマイズ性が高い</b>シェル用プロンプト
- デフォルトでも<b>高機能</b>で、単に設定するだけでも<b>シェルを便利にしてくれる</b>
<br>一例：
 - ソフトや言語に合わせた絵文字やバージョン情報、ブランチ名を表示する等、シェルを直感的に<b>見やすく・かわいく</b>してくれる<br>
※例: Dockerなら🐳、pythonなら🐍
 - コマンド実行時間を表示する
 - バッテリー残量が一定以上減るとコマンドプロンプトに表示する

### インストール
- [公式ガイド](https://starship.rs/ja-jp/) が簡潔

#### 例: zsh

```:zsh
brew install starship
```

### シェル設定に追加
```:~/.zshrc

eval "$(starship init zsh)"
```

##### Tips: シェル設定の書き方
```
[モジュール名]
【オプション = "設定値"】
```

※モジュールやオプション等、詳細は[公式ガイド](https://starship.rs/ja-jp/config/)参照

## 2. プロンプト記号を設定
- StartShipの設定ファイルを書き換えることで、簡単にプロンプト記号を変えられる
- 色を変えたり、記号を変えたり、絵文字にしたり

### 設定ファイルの作成
```:zsh
mkdir -p ~/.config && touch ~/.config/starship.toml
```

#### プロンプト記号設定の書き方
```
[モジュール名]
【オプション = "[表示するテキスト](書体)"】
```

#### 例
直前のコマンド実行結果に応じて表情を変えるプロンプト記号

```:~/.config/starship.toml
# [character]モジュールで、プロンプト記号を設定できる
[character]
# 直前のコマンド実行結果が成功だった場合
success_symbol = "[（〃σσ）](bold red)[❯ ](bold green)"
# 直前のコマンド実行結果が失敗だった場合
error_symbol = "[（;ｰ'`ｰ）](bold blue)[❯ ](bold green)"
```

## 3. iTerm2を導入
### [iTerm2](https://www.iterm2.com/)とは
- 高機能・カスタマイズ性が高いターミナルアプリ

### インストール
[公式サイト](https://www.iterm2.com/) からDL&インストール

## 4. カラーリングを設定
1. `iTerm2 > Preferences > Profiles > Colors`を開く
1. 任意のカラーリングを設定

### Tips: プリセットのインポート
結論に示した例では、プリセット[thayer-bright-iTerm](https://github.com/t3chnoboy/thayer-bright-iTerm)をインポートして使っています

1. [thayer-bright-iTerm](https://github.com/t3chnoboy/thayer-bright-iTerm)からzipをDL
1. 1のzipを解凍
1. `Colors`の左下の`Color Presets > Import`で2で回答したフォルダ内のitermcolorsファイルを選択
1. `Color Presets > thayer bright`を選択

## +α お好み設定
以下はお好みで
### ウインドウのヘッダを変更
`iTerm2 > Preferences > Appearance > General > Theme`で、Minimalを選択
### ウインドウの透明度を変更
`iTerm2 > Preferences > Profiles > Window > Transparency`のバーを移動
### ウインドウの壁紙を変更
`iTerm2 > Preferences > Profiles > Window > Background Image`のボックスに任意の画像をドラッグ&ドロップ


# おわりに

顔文字の元ネタが分かった方は私と握手


<b>ターミナルって個性が出る</b>ところだと思います。
文房具で例えると、ベーシックなボールペン使ってたり、万年筆愛用してたり、フリクション派だったり、みたいな。
<b>他の方のカスタマイズされたターミナルも拝見したい</b>です。

# リスペクト
[お前らのターミナルはダサい](https://qiita.com/kinchiki/items/57e9391128d07819c321)
【自分用】.vimrc設定

# 【自分用】.vimrc設定

```
" jjでESCを入力できるよう設定
inoremap <silent> jj <ESC>
inoremap <silent> っj <ESC>
vnoremap <silent> <C-c> y

"カーソルを表示行で移動する。物理行移動は<C-n>,<C-p>
nnoremap j gj
nnoremap k gk
nnoremap <Down> gj
nnoremap <Up>   gk

" 画面設定
set term=xterm-256color 

" 行数表示設定
set number

" シンタックスハイライト
syntax on

" ★や※等の全角文字をvim にて正しく表示させるための設定
set ambiwidth=double

" ファイル形式の検出設定
filetype plugin on

" バックスペースキーで行頭を削除する
set backspace=indent,eol,start

" タブ設定
set tabstop=2
set shiftwidth=2
set expandtab

"カーソルラインを表示する
set cursorline

"ワイルドメニューset
set wildmenu
set wildmode=longest,list,full

"OSのクリップボードを使用する
set clipboard+=unnamed

"ターミナルでマウスを使用できるようにする
if has ("mouse")
    set mouse=a
    set guioptions+=a
    set ttymouse=xterm2
endif

" カーソルの表示設定
if has('vim_starting')
    " ノーマルモード時に非点滅のブロックタイプのカーソル
    let &t_EI .= "\e[2 q"
    " 挿入モード時に縦棒タイプのカーソル
    let &t_SI .= "\e[5 q"
    " 置換モード時に下線タイプのカーソル
    let &t_SR .= "\e[3 q"
endif
```
nuxt.jsの動的ルーティングの命名で気をつけた方がいいこと

# nuxtの動的ルーティングの機能を使う際の注意

# 結論
動的ルーティングしたいページorディレクトリに大文字混じりの命名をしない方がいい

# 環境
nuxt: 2.14.0
macOS Catalina
Linux: 

# 内容
動的に名前を変えたいページorディレクトリ の名前に大文字が混じっていると、mac側では大文字扱いされるんですが、linuxだと全部小文字に扱われます。なので、macで開発して上手く行っていても本番のlinuxで動かすと動作しない場合があります
例：`_categoryName/_itemId.vue`
と言う命名でやっていると、このページにnuxt-linkや$router.pushで飛ぶ際に以下のように書くと思います

```.vue
<nuxt-link :to="{ name: {categoryName: 'AAA', itemId: 'BBB'} }">
  hoge
</nuxt-link>
```

```.js
this.$router.push({ name: {categoryName: 'AAA', itemId: 'BBB'} } })
```

mac環境だとしっかりこれで動作してくれます。しかし、これを本番環境などで使うlinux環境だとパラメータの名前が

```
categoryName　→ categoryname
itemId → itemid
```
のように全部小文字扱いされているので動作しません。（該当ページのurl直打ちをして`this.$route.params`を出力するとわかります）
パラメータの値を与えようとしてるのに、与える先にそのパラメータのキーが存在しないからエラーになるって感じですね

一般的に**「macが大文字小文字区別しない&Linuxが区別する」**ので不思議な挙動ですが、以上報告でした

参考になったらLGTMお願いします！！
unityで複数のステージレベルを管理する方法

##実現したいこと
ハイパーカジュアルゲームの「Level1をクリアしたらLevel2に進む」のようなゲームの進行を実装したい。

##方法
UIBottunを設置し、UIButtonをクリックしたら次のシーンを読み込むという方法で行います。
次のシーンを認識する方法には「build index」という値を使用します。「build index」は、Scenes In Buildに設定したSceneに与えられる固定値です。
*下の画像右側の「0」「1」「2」の数字が「build index」です。Scene/Level1のbuild indexは0です。
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/650145/8e37c307-9652-d4d9-11f7-a48b62431c14.png)
ポイントとなるコードは２種類あります。
１つ目は、Build Indexを取得するためのコードです。
<code>int index = SceneManager.GetActiveScene().buildIndex;</code>
GetActiveScene(今開いているScene)のbuildIndexを取得してint型の変数indexに代入しています。頭にSceneManager.と記述する理由はGetActiveSceneメソッドがSceneManagerクラスのものだからです。

2つ目は、 指定したSceneをロードするためのコードです。
<code>SceneManager.LoadScene(index);</code>
先ほどのSceneManager.GetActiveScene().buildIndexで取得したbuild indexの値と紐づくSceneをロードすることができます。


##手順
1.Sceneを２つ作成し、名称をLevel1、Level2とする。
2.Hierarchy>UI>Buttonからボタンを作成する。
3.新規スクリプトを１つ作成します。スクリプトの中身はこのように記述します。

```php:UIManager.cs
using UnityEngine;
using UnityEngine.SceneManagement;
public class UIManager : MonoBehaviour
{
    public int index;

    public void NextStage()
    {
        int index = SceneManager.GetActiveScene().buildIndex;
        index++;
        SceneManager.LoadScene(index);
        Debug.Log(index);      
    }
    public void RetryStage()
    {
        SceneManager.LoadScene(SceneManager.GetActiveScene().name);
    }
}
```
4.空オブジェクトを作成して作成したスクリプトをアタッチします。
5.Button>Inspector>ButtonコンポーネントにあるOnClick()メソッドの＋マークをおして、UIManagerで作成したNextStage()メソッドを設定します。
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/650145/2fc6d4eb-f549-c3a0-2b95-a0edb58bbb5f.png)
6.File>BuildSettings>Scenes In Buildに、使用するSceneを設定します。

これで完成です！
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Level1をクリアしてNextStageボタンを押したら、Level2に進むっていう実装のやり方を整理した～<a href="https://t.co/tWRFBTQopZ">https://t.co/tWRFBTQopZ</a> <a href="https://t.co/F8UkHD2IZ8">pic.twitter.com/F8UkHD2IZ8</a></p>&mdash; 🌼ブブ (@sbubu12) <a href="https://twitter.com/sbubu12/status/1326290690553245698?ref_src=twsrc%5Etfw">November 10, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
【Java】ローカルDBとの接続（IntelliJ+SpringBoot）

#IJ+SpringBootでDBとの接続
* 毎回Spring Boot起動して確認するのは手間なので、**ローカルにH2のdummyDBを作成してテスト**する


##DataBaseタブ>Data Source>H2選択
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282755/d34974d5-e382-43f4-8452-38dfb8e81ae0.png)


##Data Sources and Drivers
* DB名をdummy、**Connection typeをin-memory**に
* Test Connectionで接続確認（緑のチェックが入る）
* これで**壁打ち用のDB**が作れた！

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282755/10bccc75-34df-6cf6-a16c-5f169dccb0cf.png)


##**H2コンソール上で実行されるスキーマを書き実行**

```sql

create table if not exists employee (
  employee_id bigint primary key,
  employee_name varchar(50),
  age int
);
```
##**実行するとtabelができる**
* 該当するものがData Base Viewにある場合、フィールド名があっているか確認してくれる
* コンソール上で実行文選択（SQLが複数ある場合、IntelliJは選択できる）

```sql

INSERT INTO employee(employee_id,employee_name,age)
VALUES(1,'Harry Potter',11);
INSERT INTO employee(employee_id,employee_name,age)
VALUES(2,'Hermione Granger',11);
INSERT INTO employee(employee_id,employee_name,age)
VALUES(3,'Ron Weasley',12);
INSERT INTO employee(employee_id,employee_name,age)
VALUES(4,'Albus Dumbledore',110);
-- 削除する時
-- DELETE FROM	EMPLOYEE
-- WHERE	employee_id = 1

```

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282755/47f24a81-dcf6-807e-c984-ce173f720efd.png)

##DBができているか確認
* DataBaseタブで作成したテーブルクリック、データがインサートできているか確認
* **文法上問題がないことをローカルで確認できた！**

![DB.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282755/203ab656-e06e-4ab3-e94f-0a1ec55f6161.png)


##data.sql作成
* sql文を`data.sql`にもコピーして作成
* `application.yml`にクラスパス`data: classpath:data.sql` を追加


```application.yml
spring:
  datasource:
    url: jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE
    username: sa
    password:
    driver-class-name: org.h2.Driver
    schema: classpath:schema.sql
    data: classpath:data.sql

  h2:
    console:
      enabled: true

```

##h2コンソールでも確認できる！
* http://localhost:8080/h2-console/

![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282755/72e9f18e-e564-b6ee-d795-cd4bcdb41147.png)
Roadmap to AI Expert

## Intro
久しぶりの投稿です！
最近面白いものを見つけましたのでこちらで共有だけさせてください！

## AI roadmap
- 以前よりあるbackend/frontend向けのroadmapの人工知能エンジニア版ですね！
- https://github.com/AMAI-GmbH/AI-Expert-Roadmap

ぜひ何かの一助になれば幸いです。
Rails【初心者向け】コメント機能の実装

railsでコメント機能の実装についてまとめました。
#前提
Ruby on Rails での開発環境が整っている。
Posts（投稿テーブル)とUser（ユーザーテーブル）は既に作成してある。
Userテーブルはgem deviseを使っている。
今回は投稿に対してコメントを実装します。

# コメント機能の実装

## 1.Commentモデルの作成

作成するCommentsテーブルの詳細とリレーションに関して以下の通りです。
![スクリーンショット 2020-11-11 6.28.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680641/ac975198-5d3e-107f-6e2f-d5515e8f5a6b.png)


###ターミナルでモデル作成
```terminal
$ rails g model comment
```
###マイグレーションファイルの記述
```ruby:20********_create_comments.rb
class CreateComments < ActiveRecord::Migration[6.0]
  def change
    create_table :comments do |t |
      #ここから記述
      t.references :user,foreign_key: true
      t.references :post, foreign_key: true
      t.text :text,nul: false
      #ここまで記述
      t.timestamps
    end
  end
end
```

###マイグレーションファイルの適応
```terminal
$ rails db:migrate
```
###CommentモデルとUserモデル、Postモデルを紐付ける
```ruby:app/models/comment.rb
class Comment < ApplicationRecord
  belongs_to :user
  belongs_to :post
end
```
```ruby:app/models/user.rb
class User < ApplicationRecord
  has_many :posts
  has_many :comments
end
```
```ruby:app/models/post.rb
class Comment < ApplicationRecord
  has_many :users
  has_many :comments
end
```

## 2.ルーティングの作成

```ruby:routes.rb
Rails.application.routes.draw do
  resources :users
  resources :posts do
    resource :comments
  end
end
```

## 3.Commentsコントローラーの作成

```ruby:comments_controller.rb
class CommentsController < ApplicationController
  def create
    @comment = Comment.create(comment_params)
    redirect_back(fallback_location: root_path)
  end

 private

  def comment_params
    params.require(:comment).permit(:text).merge(user_id: current_user.id, post_id: params[:post_id])
  end
end
```
```ruby:posts_controller.rb
class PostsController < ApplicationController
  def new
    @post = Post.new
  end

  def create
    @post = Post.new(post_params)
    if @post.save
      redirect_to user_url(current_user)
    else
      render :new
    end
  end
  
  def show
    #Commentインスタンスの生成を書く
    #今回はPosts#showにてコメント機能を実装したいと思います。
    @comment = Comment.new
    @comments = @post.comment_cs.includes(:user)
  end

private

  def post_params
    params.require(:post).permit(:text).merge(user_id: current_user.id)
  end

  def set_post
    @post = Post.find(params[:id])
  end
 
end
```

## 4.ビューの作成
###投稿詳細ページにコメント機能の記述を書く。
```erb:views/posts/show.html.erb

#省略

 <%= form_with model: [@post,@comment],merhod: :post,locals: true do | form | %>
    <%= form.text_area :text %>
    <%= form.submit "投稿する" %>
 <% end %>

#省略
```
コメント機能完成！

#まとめ
今回はRailsでコメント機能をテーブル作成から行ってきました。
自分もプログラミング初心者ですのでなにか間違いがありましたらお教えください。
最後まで読んでいただきありがとうございました！
AWS CLIでAuto Scaling グループの「希望する容量、最小キャパシティ、最大キャパシティ」を変更する

# はじめに
ローカルPCからAWS CLIを利用して、Auto Scaling グループの希望する容量、最小キャパシティ、最大キャパシティを変更します。
コスト削減のため、利用しない時は値を0にすると思いますが、AWS CLIで変更します。


# スクリプト
**1. オートスケーリングに紐づくEC2インスタンスを起動する**

```sh:start_auto_scaling_groups.sh
#!/bin/sh
   
cd `dirname $0`

start_asg () {

    ASG_NAME=$1
    SIZE=$2
    MAX_SIZE=${SIZE}
    MIN_SIZE=${SIZE}
    DESIRED_CAPACITY=${SIZE}
    echo "start auto scaling group: ${ASG_NAME}"

    aws autoscaling update-auto-scaling-group \
    --auto-scaling-group-name ${ASG_NAME} \
    --max-size ${MAX_SIZE} \
    --min-size ${MIN_SIZE} \
    --desired-capacity ${DESIRED_CAPACITY} \
    --profile ${AWS_PROFILE}

}

start_asg [GROUP_NAME] 2
```

**2. オートスケーリングに紐づくEC2インスタンスを停止する**

```sh:stop_auto_scaling_groups.sh
#!/bin/sh

cd `dirname $0`

stop_asg () {

    ASG_NAME=$1
    MIN_SIZE=0
    DESIRED_CAPACITY=0
    echo "stop auto scaling group: ${ASG_NAME}"

    aws autoscaling update-auto-scaling-group \
    --auto-scaling-group-name ${ASG_NAME} \
    --min-size ${MIN_SIZE} \
    --desired-capacity ${DESIRED_CAPACITY} \
    --profile ${AWS_PROFILE}

}

stop_asg [GROUP_NAME]

```
Ruby on Rails でFCMを使う時のメモ

## click_actionを反映させる

`firebase-messaging-sw.js`の**トップ**に`notificationclick`イベントを追加すればいいらしいです。

```javascript:public/firebase-messaging-sw.js
// Notification click
self.addEventListener('notificationclick', function(event) {
  let url = event.notification.data.FCM_MSG.data.url;

  event.notification.close(); // Android needs explicit close.
  event.waitUntil(
    clients.matchAll({ includeUncontrolled: true, type: 'window' }).then( windowClients => {
      // Check if there is already a window/tab open with the target URL
      for (let i = 0; i < windowClients.length; i++) {
        let client = windowClients[i];
        // If so, just focus it.
        if (client.url === url && 'focus' in client) {
          return client.focus();
        }
      }
      // If not, then open the target URL in a new window/tab.
      if (clients.openWindow) {
        return clients.openWindow(url);
      }
    })
  );
});
```


## 開いているタブ（作業中のタブ）でもウエブプッシュ通知を受信させる

普段は開いているタブで作業する時、ウエブプッシュ通知が来ません。

`firebase.js`に`onMessage`ファンクションを以下のように定義すればいいです。

```javascript:firebase.js
  // Handle incoming messages while focusing
  messaging.onMessage(function(payload) {
    const { title, body, icon } = payload.notification
    const url = payload.data.url
    navigator.serviceWorker.getRegistration('/firebase-cloud-messaging-push-scope').then(registration => {
      registration.showNotification(
        title,
        {
          body,
          icon,
          data: {
            FCM_MSG: {
              data: {
                url
              }
            }
          }
        }
      )
    });
  });
```

## ActiveJobでウエブプッシュを処理させる

渡せるパラメータは：
title: 通知タイトル
body: 通知内容
icon: 表示のアイコン
click_action: クリックイベントで遷移するURL（HTTPSのみ）


```ruby:app/jobs/push_notification_job.rb
class PushNotificationJob < ApplicationJob
  queue_as :default

  DEFAULT_ICON = 'https://hogehoge.ico'

  def perform(token, options = {})
    fcm = FCM.new(ENV['FIREBASE_SERVER_KEY'])

    options = {
      priority: 'high',
      notification: {
        title: options[:title],
        body: options[:body],
        icon: options[:icon] || DEFAULT_ICON,
      },
      data: {
        url: options[:url] || '/'
      }
    }

    registration_ids = [token]

    fcm.send(registration_ids, options) if registration_ids.any?
  end
end
```

`priority: 'high'` は役立つかどうかまだ分からないですが、、、。
Note Book : JVM is crash by HighGui#imshow On Windows 10 of Open JDK 11, 14, 15 and 15.01 with OpenCV. But however it's worked on OpenJDK16ea. 動かざることPythonの如し。

It isn't work awt on opencv HighGui. It's Just windows probrem. This logic work on linux eclipse. 
If use OpenJDK16ea, It is work.

#####A crimina → awt.dll+0x902ae

```text:hs_err_pid19144.log
# A fatal error has been detected by the Java Runtime Environment:
#
#  EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x00007ff9a47002ae, pid=19144, tid=13948
#
# JRE version: OpenJDK Runtime Environment (15.0+36) (build 15+36-1562)
# Java VM: OpenJDK 64-Bit Server VM (15+36-1562, mixed mode, sharing, tiered, compressed oops, g1 gc, windows-amd64)
# Problematic frame:
# C  [awt.dll+0x902ae]
#
# No core dump will be written. Minidumps are not enabled by default on client versions of Windows
#
# If you would like to submit a bug report, please visit:
#   https://bugreport.java.com/bugreport/crash.jsp
# The crash happened outside the Java Virtual Machine in native code.
# See problematic frame for where to report the bug.
#

---------------  T H R E A D  ---------------

Current thread (0x0000028729632f20):  JavaThread "main" [_thread_in_native, id=13948, stack(0x000000ba51300000,0x000000ba51400000)]

Stack: [0x000000ba51300000,0x000000ba51400000],  sp=0x000000ba513fef70,  free space=1019k
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
C  [awt.dll+0x902ae]

Java frames: (J=compiled Java code, j=interpreted, Vv=VM code)
j  sun.awt.windows.WComponentPeer._setFont(Ljava/awt/Font;)V+0 java.desktop@15
j  sun.awt.windows.WComponentPeer.setFont(Ljava/awt/Font;)V+7 java.desktop@15
j  sun.awt.windows.WWindowPeer.initialize()V+42 java.desktop@15
j  sun.awt.windows.WFramePeer.initialize()V+1 java.desktop@15
j  sun.awt.windows.WComponentPeer.<init>(Ljava/awt/Component;)V+83 java.desktop@15
j  sun.awt.windows.WCanvasPeer.<init>(Ljava/awt/Component;)V+2 java.desktop@15
j  sun.awt.windows.WPanelPeer.<init>(Ljava/awt/Component;)V+2 java.desktop@15
j  sun.awt.windows.WWindowPeer.<init>(Ljava/awt/Window;)V+2 java.desktop@15
j  sun.awt.windows.WFramePeer.<init>(Ljava/awt/Frame;)V+2 java.desktop@15
j  sun.awt.windows.WToolkit.createFrame(Ljava/awt/Frame;)Ljava/awt/peer/FramePeer;+5 java.desktop@15
j  java.awt.Frame.addNotify()V+20 java.desktop@15
j  java.awt.Window.pack()V+28 java.desktop@15
j  org.opencv.highgui.ImageWindow.setFrameLabelVisible(Ljavax/swing/JFrame;Ljavax/swing/JLabel;)V+84
j  org.opencv.highgui.HighGui.waitKey(I)I+203
j  env.check.SampleDnnOnnx$Logic.doExecute()V+206
j  env.check.SampleDnnOnnx.main([Ljava/lang/String;)V+15
v  ~StubRoutines::call_stub

siginfo: EXCEPTION_ACCESS_VIOLATION (0xc0000005), reading address 0x0000000000000058

```

######I haven't been able to classify it yet.

####Ubuntu 20.04 LTS on OpenJDK15
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/732297/e34ed63c-b164-f85e-ef5c-e56d891b6f0e.png)

####Windows 10 on OpenJDK16ea
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/732297/420038b4-fc7c-2be9-7e46-e07c84a56956.png)
【GNS3】Port VLANについて

# 環境
・Windows10
・GNS3 version 2.2.15
・Cisco 3745(IOS Version 12.4)

# vlanとは
Vitual Lanの略で、仮想的にLANセグメントを作る技術。
ブロードキャストドメインが区切れるのが嬉しい。（不要なBUM削減）

# 今回の検証
ポートVLANを使用して、VLANを切りかつ同一のIPアドレスを付与し疎通確認する。
具体的には、Black（SW）のIF1/1のポートVLANを手動で変えて、Greenから随時Pingで疎通をとる。
![vlan.GIF](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184521/d68240d8-d730-9016-3663-56d1f61f6669.gif)

#　確認コマンド
・IPアドレス：show ip interface breaf
・VLAN：show vlan-switch (※環境によって変わる）
・MAC：show mac-address-table
・ARP情報：show arp 
・ARPキャッシュクリア：clear arp-cache
・ICMPの到達：debug ip icmp

# ポイント
・Bule、Red、Orangeではdebug ip icmpを実施するべし。
・GNS3のCisco SWは少し癖がありますので使用モジュールには注意すべし。
・GNS3のBugなのか不明だが、ARP解決しない場合がある…。対処方法はBlackをrebootしたら安定した。

# 結果
無事にBlack側のIFのVLANを変更すると、経路が変わったことを確認できました。

# まとめ
・VLANを分けることによって重複したIPの付与が可能
（異なるVLAN間で同一IPで通信をする際はARP解決とかの問題で疎通はとれなさそうだが…）
・設定および確認コマンドを知ることができた。
わかるようでわからない One on Oneについて考えてみる

わかるようでわからない One on Oneについて考えてみる。

- 資料1: [効果的な「1on1」は上司のやり方が全て。部下が成長する進め方とは](https://tunag.jp/ja/contents/hr-column/1784/)
- 資料2: [【1on1シート付】1on1で何を話す？失敗しない方法を実施前に知っておこう](https://www.dodadsj.com/content/190723_1on1/)
- 資料3:  [効果が上がる！1on1ミーティングの進め方と6つのポイント](https://media.unipos.me/1on1meeting-procedures)


## One on One　とは

### 資料1:効果的な「1on1」は上司のやり方が全て
1on1ミーティングとも呼ばれ、上司と部下の1対1で対話する機会をもつこと
1on1は、上司と部下が定期的に個人面談を行うことをいいます。上司が部下の現状を把握し、業務についてのアドバイスなどを行うことを通して、主に部下の成長を促すために行います。

### 資料2:1on1で何を話す？
1on1とは？
「1on1（ワンオンワン）」とは、上司と部下が定期的に行う1対1の面談のことです。上司が部下の話を聞いて適切なフィードバックをすることで、課題解決や人材育成などのさまざまな効果が期待できることから、多くの企業が関心を示しています。ここでは、評価面談との違いや、1on1が日本で広まった背景をご紹介します。

- 評価面談との違い
- 1on1が日本で広まった背景
    -　不確実性の高い市場への対応
    -　 優秀な人材を流出させないために
    -　 
### 資料3:効果が上がる！1on1ミーティングの進め方と6つのポイント

## 期待する効果・目的

### 資料1:効果的な「1on1」は上司のやり方が全て

- 部下の成長を促す
- コミュニケーションのきっかけをつくる
- 部下や現場の状況を把握することができる
- 目標達成のためのズレや遅れをスピーディーに矯正できる

### 資料2:1on1で何を話す？

- メンバーの成長が促される～経験学習のサイクル～
- 信頼関係を構築できる ～コミュニケーションの改善～
- 現場や部下・メンバーの状況把握　～企業全体の問題解決～
- キャリア開発を支援できる　～中長期的なキャリアや適切な人材配置～
- 定着率の改善につながる　～モチベーションや愛社精神の向上～
- 
### 資料3:効果が上がる！1on1ミーティングの進め方と6つのポイント

# 効果的な進め方
### 資料1:効果的な「1on1」は上司のやり方が全て

- まずは上司と部下の信頼関係を構築する
- 目的を明確にする（会社として何のために実施するのか）
- 上司部下ともに、事前に準備する
 - アジェンダは不要、上司は部下の支援をする場だと認識を
 - 部下は事前に話したいことの準備
- 部下に十分に話してもらう
- 話した内容を報告、シェアして認識を合わせる

### 資料2:1on1で何を話す？
1on1進め方（やり方・手順）

- 目的を伝える
- 日程を決める
- 当日のテーマを決める
- 当日の進め方を考える
- 1on1の実施
- 次回に向け準備

1on1を意義あるものにするための4つのポイント

- 現場任せにせず、会社全体で1on1に取り組む
- 事前に部下のことを知っておく
- 傾聴・コーチングを意識し、心理的安全性を確保
- 頻繁に実施し、記録を残す
- 
### 資料3:効果が上がる！1on1ミーティングの進め方と6つのポイント

- 1on1ミーティングは「部下が何をすべきか」をゴールに進める
    - 毎回ミーティングの最後には、かならず部下自身が『課題解決のために自分は何をすべきか』という具体的なアクションプランにたどり着くこと
    - 「部下が自主的に考え、課題を自己解決し、自立して行動できるように成長すること」をっ実現するため

ミーティングの進め方

- 部下の現在の気分や体調を確認する
- 前回の振り返りと今回のテーマを確認する
- 部下が話したいことを聞き出す
- 部下自身に内省・考察させる
- 上司からフィードバックする
- 今後のアクションプランを考える


1on1ミーティングを効果的に行うための6つのポイント

- 30分~1時間ずつ/毎週～毎月で実施する
- 7割以上は部下に話をさせる
- 途中で話を遮らず「傾聴」する
- 上司がアドバイスするより部下自身に考えさせる
- 部下の考えや行動に対して上司は一方的に評価をくださない
- 結論やアクションプランは部下が出せるように促す

## 注意点など
### 資料1:効果的な「1on1」は上司のやり方が全て

- 上司ばかり話す
- 雑談で終わってしまう
- 1on1の時間を無駄だと思っている
- 評価したり進捗管理を行う時間にしてしまう
- 
### 資料2:1on1で何を話す？

- 目的意識の共有や事前準備が不十分で、有意義な時間にならない
- 上司の話し方に問題があり、部下の育成につながらない
- 上司の利き方に問題があり、信頼関係を失う

### 資料3:効果が上がる！1on1ミーティングの進め方と6つのポイント
×な例

- 途中で話を遮ること
- 上司の意見を述べること
- 部下の考えに対して「いい・悪い」「正しい・間違っている」と判断を下すこと
- すぐに解決策を提示すること

〇な例

- 「なぜそうしたの？」「どういう気持ちでしたか？」など、話を続けやすい質問を投げかける
- 「そうだね、よくわかるよ」など、共感を示す
- 「なるほど、○○したんだね」など、相手の言った言葉を繰り返す
- 大きくうなずく、相手の言葉にボディランゲージで反応する

## 質問の例

### 資料1:効果的な「1on1」は上司のやり方が全て

### 資料2:1on1で何を話す？

- 最近会ったうれしかったことは？
- 最近、何か困っていることはない？
- どうして成功/失敗したと思う？成功/失敗から何を得たの？
- どんなことにやりがいを感じる？

### 資料3:効果が上がる！1on1ミーティングの進め方と6つのポイント
テーマを用意する

- 目標について
- 業務上の問題や課題について
- 中長期的なキャリアについて
- プライベートな悩みについて

【仕事や会社に関するテーマ】

- 現在の業務について
- 仕事上の問題やトラブルについて
- 今後の仕事について
- 上司からの指示や仕事の任せられ方について
- 上司の考え方や方針について
- 先輩、同僚、後輩について
- チームのあり方について
- 職場の人間関係について
- 会社やチームの目標について
- 会社のミッション、ビジョン、バリューについて

【部下自身に関するテーマ】

- 自分の成長について
- 個人の目標について
- 今後のキャリアについて
- 新しく挑戦したいこと、伸ばしたいスキルについて
- ワークライフバランスについて
- 現在興味を持っていることについて
- プライベートな悩みについて
Vue.jsのコンポーネントにおけるslotのキホン

vue.jsの参考書籍とかでslotが直感的にわかりづらいなあと思っていたんですが、こちらを参考に書いて見たらとてもシンプルに理解がましたという話です。

参考：[https://www.hypertextcandy.com/vue-laravel-tutorial-submit-photo-part-2#ローダーコンポーネント作成](https://www.hypertextcandy.com/vue-laravel-tutorial-submit-photo-part-2#%E3%83%AD%E3%83%BC%E3%83%80%E3%83%BC%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%8D%E3%83%B3%E3%83%88%E4%BD%9C%E6%88%90)

例えば親コンポーネントの投稿フォームに子コンポーネント、Loadingを組み込んでいる場合の話。

##子供コンポーネント

まず、これが子供コンポーネント「Loader.vue」です。
template部分の<slot>Loading...</slot> と記載されているところ、これはデフォルトでは「loading...」という文字列で出てくるということです。

```jsx
<template>
<div class="loader">
    <p class="loading__text">
        <slot>Loading...</slot> 
    </p>
</div>
</template>

<script>
略〜export default的なやつ
</script>
```

#親コンポーネント
続いて親コンポーネント「Form.vue」です。
親コンポーネントのtemplateの中に子コンポーネントを組み込みます。ちなみにその前に子供コンポーネントのloader.vueをimport し、Loaderという名前で使う宣言をしています。
2パターン見てみます。

###パターン1：Loaderのコンポーネントに文字を入れない場合

```jsx
<template>
<div>
    <div>
      <Loader></Loader>
    </div>
 </div>
</template>

<script>
import Loader from './Loader.vue';

export default{
  components:{
    Loader
  }
</script>
```

この場合の実際のサイトでの表示結果は、

**Loading...**

です。何故Loading...と出るのか？
というと子供コンポーネントでデフォルトのテキストを設定していたからです。

###パターン2：Loaderのコンポーネントをのところに「送信中です。」と記載する場合

```jsx
<template>
<div>
    <div>
      <Loader>送信中です。</Loader>
    </div>
 </div>
</template>

<script>
import Loader from './Loader.vue';

export default{
  components:{
    Loader
  }
</script>
```

この場合の結果は、

送信中です。

となります。
親側で「送信中です。」と書いているデータが子供コンポーネントのslot部分に置き換わっている状態です。

ーーーーーーーーーーー

ちなみに、「コンパイルスコープ」を使いslotの中でデータの受け渡しもできる様子。

[https://jp.vuejs.org/v2/guide/components-slots.html#コンパイルスコープ](https://jp.vuejs.org/v2/guide/components-slots.html#%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%AB%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%97)
C++11 で __FILE__, __LINE__ を含んだログ関数を作るメモ

### 背景

* C++11 で `__LINE__`, `__FILE__` などを含んでいい感じにログ関数を実装したい
* コンパイラの拡張機能使わずにポータブルにやりたい

## 問題

### `__FILE__`, `__LINE__`

`__FILE__` や `__LINE__` はプリプロセッサで展開されるため, 関数の引数に指定してもうまくいきません.

```c
// does not work as you expected
void log(const char *fname = __FILE__) {
 ...
}
```

C++20 では `std::source_location`  https://en.cppreference.com/w/cpp/utility/source_location がサポートされますのでこの問題は解決しますが, C++20 が普及するまであと数年(現在 2020 年)はかかるでしょう.
 
C++11 ~ C++17 では結局のところマクロを介する以外に解決方法はありません.

ちなみに `C11` から `__func__` で関数が取得できるようになりました.

### `__VA_ARGS__`

C マクロでは `__VA_ARGS__` で可変引数を対応することができますが, `__VA_ARGS__` に割り当たる引数がゼロ個になるとコンパイルエラーになってしまいます.

```c
#define MYLOG(s, ...) mylog(__FILE__, __LINE__, s, __VA_ARGS__)

MYLOG("val = %d", val); // OK
MYLOG("warning"); // NG. 
```

後者は展開すると `mylog(__FILE, __LINE__, s, )` となり, コンマのあとにかっこがきて構文エラーになっていまいます.

gcc(clang も?)では, `##__VA_ARGS__` という拡張でゼロ個の引数を対応することができますが, コンパイラ依存になってしまいます.

C++ __VA_ARGS__ のメモ
https://qiita.com/syoyo/items/e5e03a52a953371b82c8

これも C++20 であれば `__VA_OPTS__` の導入で解決されます.

## 解法

C++11 で導入されました variadic template を使います.

ゼロ個の `__VA_ARGS__` の問題がありますので, もし `__VA_ARGS__` が 0 個になる可能性があるのであれば,

https://mortoray.com/2013/11/01/bridging-__va_args__-to-c-variadic-templates/

にあるようにクラスを定義しオブジェクトを作るとよさそうです!

```c

#include <cstdio>
#include <cstdlib>

class Message
{
public:
  Message(const char *fname, int line)  : fname_(fname), line_(line) {}

  template<typename... Args>
  void write(Args&&... args) {
    int nargs = sizeof...(args);
    printf("fname %s: line %d, # args %d\n", fname_, line_, nargs);
    // fixme: Fully implement `write` function.
  }

private:
  Message() = delete;
  Message(const Message&) = delete;

  const char *const fname_;
  const int line_;
};

#define msg(...) Message(__FILE__, __LINE__).write(__VA_ARGS__);

int main(int argc, char **argv)
{
        msg();
        msg("bora");
}
```

あとは variadic template をぺろぺろ処理すればいけます!

## 参考

spdlog では普通の引数形式でした. `__VA_ARGS__` が必ず 1 個以上ある前提の場合ですね.

https://github.com/gabime/spdlog/blob/18e3f07f7d333d33c0ef8fbea02299dbe5d49f97/include/spdlog/spdlog.h#L241


pprintpp ではコンパイル時にフォーマット文字列をテンプレートで処理してコンパイル時型チェックしています! :rolling_eyes: 

でも `##__VA_ARGS__` を使っているので MSVC では動きません.

https://github.com/tfc/pprintpp

また, 完全に型安全というわけでもなく, `std::string` など未対応な型の変数を引数に渡すとクラッシュします.
phpでjsファイルを動的に生成しよう

#phpでjsファイルを動的に生成しよう
javascriptとphpの間で変数を受け渡すのは厄介ですね。htmlだけでなくjsもphpで生成してしまいましょう。拡張子を".js"ではなくて".php"にすれば良いのです。

##呼び出し側
```html:index.html
	<script src="javascript.php"></script>
	<script>
		console.log(foo+jsfunction(2));
	</script>
```
##呼び出される側
headerを出力してしまえば、あとはjavascriptの世界です。

```php:javascript.php
<?php
	header("Content-type: text/javascript;");
	print "var foo=jsfunction(3);\n";
	$n=10;
?>
function jsfunction(bar)
{
	return bar+<?php echo $n;?>;
}
```
こんなに簡単で便利なのに、なんで誰も使わないんだ。
【SwiftUI】Sceneプロトコルを読む

#この投稿は何か？
`Scene`プロトコルについて、Apple Developerサイトの[リファレンス](https://developer.apple.com/documentation/swiftui/scene)を独自に翻訳・解釈したものです。

###前提として
`Scene`プロトコルはiOS14で、SwiftUIに導入された新しいアプリケーションライフサイクルの一環です。

#Sceneプロトコル
システムによってライフサイクルが管理されるアプリケーションのUIの一部分です。

````Swift:宣言
protocol Scene
````

SwiftUIでアプリを作成するには、アプリの`body`に`Scene`プロトコルに準拠したインスタンスを組み合わせます。このようなインスタンスでは「`WindowGroup`のようなSwiftUIが提供するプリミティブなシーン」と「他のシーンから合成したカスタムシーン」を使用することができます。カスタムシーンを作成するには、`Scene`プロトコルに準拠した型を宣言します。

プロトコルに準拠するには、要件のbody計算プロパティを実装します。

````Swift:カスタムシーンのMyScene構造体
struct MyScene: Scene {
    var body: some Scene {
        WindowGroup {
            MyRootView()
        }
    }
}
````

シーンは、ユーザーに表示したい「ビュー階層のコンテナ」として機能します。システムはプラットフォームに適した方法で、UIにビュー階層を表示するタイミングと方法を、アプリの状況に基づいて決定します。

例えば、上記のウィンドウグループは、macOSやiPadOSなどのプラットフォーム上では`MyRootView`を含むウィンドウを作成または削除することができます。他のプラットフォームでは「同じビュー階層がアクティブなとき」はディスプレイ全体を占有することもあります。

シーンがアクティブかそうでないかをチェックするには、`scenePhase`環境値をシーン内またはそのビューの1つから読み込みます。`Environment`属性を使用して、`ScenePhase`列挙値の一つであるシーンフェーズを含むプロパティを作成することができます。

````Swift:「シーンの状態」を確認する環境値scenePhaseの宣言
struct MyScene: Scene {
    @Environment(\.scenePhase) private var scenePhase

    // ...
}
````

`Scene`プロトコルは、シーンを設定するためのプロトコルメソッドとして定義された「シーンのモディファイア」をいくつか提供します。このメソッドはデフォルト実装があります。

例えば、値が変更されたときにアクションをトリガーするためには、 `onChange(of:perform:)`モディファイアを使用することができます。

````Swift:シーンがバックグラウンドになったら、アクションを実行する
struct MyScene: Scene {
    @Environment(\.scenePhase) private var scenePhase
    @StateObject private var cache = DataCache()

    var body: some Scene {
        WindowGroup {
            MyRootView()
        }
        .onChange(of: scenePhase) { newScenePhase in
            if newScenePhase == .background {
                cache.empty()
            }
        }
    }
}
````

このコードは、ウィンドウグループ内のすべてのシーンがバックグラウンドに移動したときにキャッシュを空にします。
Differentiable Monte Carlo Ray Tracing through Edge Sampling


https://people.csail.mit.edu/tzumao/diffrt/


## 背景

勾配ベース(Gradient-based)の手法はレンダリング, 機械学習, 機械ビジョンで重要になってきている.

レンダリング(パスパストレーシング)における微分はいろいろ研究されてきたが, 機械学習と組み合わせたものはあまりなかった.

Neural 3D Mesh などがあるが, シーンや照明環境が限定的であった. 

提案手法では, 汎用目的のモンテカルロレイトレアルゴリズムを微分可能にして機械学習と組み合わせることができている.

## アルゴリズム

Dirac の delta 関数(visibility 項)を含んでいるので直接には微分できない.

Edge sampling を提案して効率よく微分を計算できるようにした.


## ソースコード


公開されたソースコードには, 論文 submit 後の改善が取り込まれている.

- CUDA 化して早くした.
- 自動微分を手動の微分で展開して早くした

## 応用

ディープラーニング用のデータセットを CG で作ることで, バーチャルでいろいろできるようになり, 夢が広がります.

フォトリアルなレンダリングと組み合わせることができれば, たとえば

* 自動運転用のシーンを CG で.
* 顔認識やポーズ, 人物検出を CG で
* よりリアルで顔の特徴を考慮した GAN のようなモーフィング
* 写真からの材質推定(直接光, 反射光, etc)

EoL.
【Java】equalsメソッドで比較する方法まとめる

#プログラミング勉強日記
2020年11月11日
昨日の記事で[【Java】==とequalsの違い](https://qiita.com/mzmz__02/items/343cfa4a07ce868755f2)という内容を扱った。今日は、equalsメソッドの大文字と小文字を区別せずに比較する方法やObjectsクラスのequalsメソッドでnullを比較する方法についてまとめる。

#equalsメソッドとは(`==`との違い)
　2つの文字列が等しいかどうか比較する際に使う。int型やdouble型などのプリミティブ型の場合は`==`で比較するが、String型は参照型なのでequalsメソッドを用いて比較する。

```java
public static void main(String[] args) {
    // String型変数のstr1とstr2を同じ文字列で初期化
    String str1 = "hello";
    String str2 = "hello";

    if(str1 == str2)
        System.out.println("1回目：str1=str2 (==で比較) ");
    else
        System.out.println("1回目：str1≠str2 (==で比較) ");

    // 同じ文字列を追加
    str1 += "!";
    str2 += "!";

    if(str1 == str2)
        System.out.println("2回目：str1=str2 (==で比較) ");
    else
        System.out.println("2回目：str1≠str2 (==で比較) ");

    if(str1.equals(str2))
        System.out.println("3回目：str1=str2 (equalsで比較) ");
    else
        System.out.println("3回目：str1≠str2 (equalsで比較) ");
}
```

```:実行結果
1回目：str1=str2 (==で比較) 
2回目：str1≠str2 (==で比較) 
3回目：str1=str2 (equalsで比較) 
```
　このコードでは`==`演算子を使った1回目の比較ではtrueを返しているが、文字列を追加した後の2回目の比較ではfalseを返している。equalsメソッドを使って比較した3回目はtrueを返している。このように、`==`演算子を使った場合は参照先の文字列が同じであってもオブジェクトが違うとfalseを返してしまうので、文字列を比較するためにはequalsメソッド使う。


#大文字と小文字を区別しない比較する方法
　大文字と小文字を区別せずに、同じ文字列として比較したい場合にはequalsIgnoreCaseを使う。

```java
public static void main(String[] args) {
    String str1 = "hello";
    String str2 = "HELLO";

    if(str1.equalsIgnoreCase(str2))
        System.out.println("str1=str2 ([equalsIgnoreCaseで比較) ");
    else
        System.out.println("str1≠str2 ([equalsIgnoreCaseで比較) ");

    if(str1.equals(str2))
        System.out.println("str1=str2 (equalsで比較) ");
    else
        System.out.println("str1≠str2 (equalsで比較) ");
}
```

```:実行結果
str1=str2 ([equalsIgnoreCaseで比較) 
str1≠str2 (equalsで比較) 
```

#nullを安全に比較する方法
　Objectsクラスのequalsメソッドを使ってnullPointerExceptionの例外を発生させることなく安全に比較する。Stringクラスのequalsメソッドでは、メソッドの呼び出し元のオブジェクトがnullの場合にnullPointerExceptionの例外が発生する。
　まず、Objectsクラスのequalsメソッドを使うためには`java.util.Objects`のインポートが必要である。

```java
import java.util.Objects;
 
public class Main {
 
    public static void main(String[] args) {
 
        String str1 = null;
        String str2 = "abc";
        String str3 = null;
 
        System.out.println(Objects.equals(str1, str2));
        System.out.println(Objects.equals(str1, str3));
    }
}
```

```:実行結果
false
true
```
　このようにnull動詞を比較した場合にtrueを返せている。




#参考文献
[【速習Java】”==”と”equals”の違い(否定の方法も解説)](https://www.sejuku.net/blog/21395)
[【Java入門】equalsメソッドで比較をする方法総まとめ](https://www.sejuku.net/blog/25747)
SQLのLIKEについて

LIKEはSQLの中でもわりと基本的な句ですが、意外と使う機会が少ないからか地味に使い方を忘れがちなので自分用にまとめておきます。使用するテーブルは以下の通り。

|name|
|:-----|
|鈴木   |
|木村   |
|木山   |
|田村   |

まずは、部分一致のあいまい検索を実行してみます。
LIKEによるあいまい検索にはワイルドカードを使用します。0文字以上の任意の文字列を指定したい場合は「%」、任意の1文字を指定したい場合は「_」を指定します。
部分一致の場合は、検索したい文字列をワイルドカードで挟みます。

```ruby:SQL
SELECT name FROM TABLE1 WHERE name LIKE '%木%';
```

すると、実行結果は以下の通りになります。

|name|
|:-----|
|鈴木   |
|木村   |
|木山   |

そして、次は前方一致です。
前方一致の場合は、検索したい文字列の後ろにワイルドカードを指定します。

```ruby:SQL
SELECT name FROM TABLE1 WHERE name LIKE '木%';
```

実行結果は以下の通りです。

|name|
|:-----|
|木村   |
|木山   |

今度は後方一致です。
後方一致の場合は、検索したい文字列の前にワイルドカードを指定します。

```ruby:SQL
SELECT name FROM TABLE1 WHERE name LIKE '%村';
```

以下が実行結果です。

|name|
|:-----|
|木村   |
|田村   |

わたしは阿呆なので部分一致検索のときによくワイルドカードを指定するのを忘れます。
みなさんはワイルドカードの存在を忘れることなく正しくLIKEを使いましょうね……。
RLogin 設定のすゝめ

みなさんSSHクライアントは何がお好きですか？
私はRLoginが気に入っています

とはいえデフォルトの設定では使いにくいので、SSHクライアントを探している方や後の自分のためにおすすめの設定をまとめておきます。


## 設定項目

1. 一般情報
2. スクリーン.制御コード
3. スクリーン.ヒストリー
3. クリップボード
4. カラー
4. カラー.背景設定
5. キーボード


## 一般情報

接続設定の最初の画面

| key              | val                                      |
| ---------------- | ---------------------------------------- |
| エントリー(上)   | わかりやすいサーバ名 `xxx-web-1a` etc... |
| タブ(上)         | わかりやすいグループ名                   |
| ホスト名         | 接続先ホスト or IPアドレス               |
| ログインユーザ名 | ログインするユーザ `ec2-user` etc...     |
| パスワード       | 必要に応じて設定                         | 
| SSH認証鍵        | 必要に応じて .pem や .ppk などを設定する |


## スクリーン.制御コード

画面がフリーズしたような動きになるのでC1制御文字を無視する

| key                       | val              |
| ------------------------- | ---------------- |
| 8454 C1制御文字を無視する | チェックを入れる |


## スクリーン.ヒストリー

操作ログを取得しておく

| key                                  | val                                     |
| ------------------------------------ | --------------------------------------- |
| 通信ログを年月日をつけて自動作成する | チェックを入れる                        |
| ログファイルパス                     | C:\<任意のディレクトリ>\%E-%S-%D-%t.log |
| ファイルに保存する通信ログの形式     | LINE                                    |
| ログの文字コードを選択               | UTF-8                                   |
| スクロールバックできるヒストリー行数 | 200000                                  |

## クリップボード

お好みで

| key                                                  | val              |
| ---------------------------------------------------- | ---------------- |
| 左クリックの範囲指定だけでクリップボードにコピーする | チェックを入れる |
| 右クリックでペースト                                 | 選択する         |
| 左ダブルクリック...記号などを設定                    | `\/._-`          |


## カラー

全部真っ黒な画面だとどこに接続しているかわからないので接続先がわかりやすいように色分けしておく。

| key    | val                                                                                      |
| ------ | ---------------------------------------------------------------------------------------- |
| 背景色 | 本番環境 `R:64, G:0, B:0` / 検証環境 `R:0, G:0, B:64` / 開発環境 `R:0, G:64, B:0` etc... | 


## カラー.背景設定

接続先を背景に表示する

| key                                  | val              |
| ------------------------------------ | ---------------- |
| バックグラウンド画像にテキストを追加 | チェックを入れる |
| 横表示位置                           | RIGHT            |
| 縦表示位置                           | TOP              |
| ログファイル名などで...エントリー名) | %E               |


## キーボード

Ctrl + V で貼り付け設定を追加する

1. キーコードの新規
2. Key Code に `V` を選択
3. Ctrl にチェック
4. Assign String に `$EDIT_PASTE` を設定
スパコン上でconda の仮想環境をactivateする際にCommandNotFoundError: Your shell has not been properly configured to use 'conda activate'.時のメモ

# 状況
スパコン上でqiime2というbioinfoのソフトウェアを動かすためにqiime2用のcondaの仮想環境作ってそこに入ろうとすると

以下のように`CommandNotFoundError: Your shell has not been properly configured to use 'conda activate'.`がでた。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253261/66ded293-f07b-6a24-aca1-57d93a8f0dc6.png)

エラー文に従って、`conda init bash`を行い、ログインし直したものの改善されなかった

# 最終的な解決方法

```
# >>> conda initialize >>>
# !! Contents within this block are managed by 'conda init' !!
__conda_setup="$('/home/keiya/workspace/miniconda3/bin/conda' 'shell.bash' 'hook' 2> /dev/null)"
if [ $? -eq 0 ]; then
    eval "$__conda_setup"
else
    if [ -f "/home/keiya/workspace/miniconda3/etc/profile.d/conda.sh" ]; then
        . "/home/keiya/workspace/miniconda3/etc/profile.d/conda.sh"
    else
        export PATH="/home/keiya/workspace/miniconda3/bin:$PATH"
    fi
fi
unset __conda_setup
# <<< conda initialize <<<
```

を.bashrc_tmp に追記してsource .bashrc_tmp を行った

# 考えられる原因?
conda init において自動的に.bashrc を参照し実行するが、私の環境では.bashrcに重い処理をおくとログイン時に自動で行われる処理が重くなることから.bashrcには処理を書かず、.bashrc_tmp に記入し毎回ログインするために自動でsourceをしていた。

そのため、conda init で行われる　.bashrc　の反映において自分の行いたい処理が反映されていないかった？
yoloのアノテーション.txtをコピーしたい

#間違えて新規にアノテーションしちゃった！
同じ画像に対していくつもtxt作っちゃうんですよね。
そういうことあると思います。

アノテーションをコピーして追加or新規作成します。

##how to
フォルダを指定して、内部にあるテキストに対して無差別に動作します。
`train.txt`とか`class.txt`とかあったら避難させてください。

番号ごとにコピーしたあと、同じ名前の txt を探して行を追加します。

`arm_anno`フォルダにあるアノテーションの`2番`を`body_anno`にある同じ画像のアノテーションtxtに追加したければ、

```
$ python3 yolocopy.py arm_anno body_anno 2
```

となります。

##code
```python:yolocopy.py
import glob
import os
import sys

path = os.getcwd()

_, infile, outfile, inline = sys.argv # target_file, output_file, target_number

for nowtxt in glob.glob(infile + "/*.txt"):
	textline = []
	with open(nowtxt) as f:
		l_strip = [s.strip() for s in f.readlines()]
		for k in l_strip:
			if str(k[0]) == str(inline):
				textline.append(k)
	basename = os.path.basename(nowtxt) #get name
	with open(outfile +'/'+ basename, mode='a') as f:
		for k in textline:
			f.write('\n' + str(k))
	
	trueline = []
	with open(outfile +'/'+ basename) as f:
		l_strip = [s.strip() for s in f.readlines()]
		for k in l_strip:
			if len(str(k))>0:
				trueline.append(k)
	#os.remove(outfile +'/'+ basename)
	with open(outfile +'/'+ basename, mode='w') as f:
		f.write('\n'.join(trueline))
```

##今後の改良点
同名の画像が存在するtxtに絞ればもっと手軽だと思うんですよね、面倒なのでしませんが。
Fizz Buzz(Ruby編)

#Fizz Buzzを解く(Ruby編)
#問題
整数 N が入力として与えられます。

1からNまでの整数を1から順に表示してください。

ただし、表示しようとしている数値が、

・3の倍数かつ5の倍数のときには、"Fizz Buzz"
・3の倍数のときには、"Fizz"
・5の倍数のときには、"Buzz"

を数値の代わりに表示してください。
#入力される値
入力は以下のフォーマットで与えられます。

N

N は1以上N以下の整数です。
#期待する出力
最後は改行し、余計な文字、空行を含んではいけません。
#入力例
20

#出力例
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
Fizz Buzz
16
17
Fizz
19
Buzz
#私の答え
```java:
num = gets.to_i
(1..num).each do |n|
    if n % 15 == 0
        puts "Fizz Buzz"
    elsif n % 5 == 0
        puts "Buzz"
    elsif n % 3 == 0
        puts "Fizz"
    else
        puts n
    end
end
```
#ポイントは(1..num)で1〜numまでの数字をeachメソッドで順番に取り出し、3、5、15で割った時に0になれば文字列を出力するというところ。至ってシンプルだが、プログラミング脳になっていないとなかなか厳しい問題かもしれません。elseもお忘れなく！
#以上！
【Rails】データ保存,更新,削除

<h1>本投稿の目的</h1>
・Railsのcontroller操作(①保存,②更新,③削除)についての議事録です。

---
<h1>学習に使った教材</h1>
Udemyの ["はじめてのRuby on Rails入門-RubyとRailsを基礎から学びWebアプリケーションをネットに公開しよう"](https://www.udemy.com/course/the-ultimate-ruby-on-rails-bootcamp/) を教材として使用しました。

---

<h1>①保存(create)</h1>
・新規で作成した値をdbへ反映し保存する

```ruby:qiita.rb
 def create
    @インスタンス = モデル.new(キー1: 値1, キー2: 値2)
    @インスタンス.save
  end
```

【解説】
○@インスタンス = モデル.new(キー1: 値1, キー2: 値2)
⇨dbへ値をインスタンス変数を経由して格納する

○@インスタンス.save
⇨⇨インスタンス変数を保存

<h1>②更新(updae)</h1>
・すでに,dbに保存された値を更新する
・(値1 → 値1_1, 値2 → 値2_2 へと更新したい)

```ruby:qiita.rb
  def update
    @インスタンス = モデル.find(params[:id])
    @インスタンス.update(キー1: 値1_2, キー2: 値2_2)
  end
```

【解説】
○@インスタンス = モデル.new(params[:id])
⇨引数にキーを指定して,dbのハッシュ値をインスタンスへ格納

○@インスタンス.update
⇨⇨インスタンス変数を更新

<h1>③削除(destroy)</h1>
・すでに,dbに保存された値を削除する

```ruby:qiita.rb
  def destroy
    @インスタンス = モデル.find(params[:id])
    @インスタンス.destroy
  end
```

【解説】
○@インスタンス.destroy
⇨dbのキャッシュデータを全削除

<h1>CRUDについて</h1>
・読み方はクラッド
・Create,Read,Update,Deleteの総称
・C,U,Dは本記事で解説したものに相当する
・(C=①create,U=②update,D=③destroy)
・Rについては,indexアクションやshowアクションが相当する
・Rはdbの値の変更を伴わないのでここでは,詳細に説明しない
wxpythonをつかってガジェット風の透明背景の画像型のウィンドウを作成する

# windows10にはガジェットが存在しない
windows vista等にあったガジェットがふと懐かしくなったのでそれに近いものを作ろうということでwxpythonを使用して作ってみました。
最終的なコードだけ見たい方は一番下にあります。
※ガジェットは絶対使えないわけではないがセキュリティの欠陥があるため非推奨

# 成果物
![apppleeeeeeee.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323266/1831e1a5-534a-1515-8371-73a2665a3aa3.gif)

## 環境
windows 10
python 3.6.10
wxPython 4.1.0

## 背景を透明にして、画像の表示をする
背景を透明にし、ウィンドウも画像の形状に変化させます。
まず、初期化処理でNO_BORDER,FRAME_SHAPEDとすることで、タイトルバーを削除し、SetShapeメソッドが使用可能になります。

```
wx.Frame.__init__(self, None, title="Apple!!",
        style=wx.NO_BORDER | wx.FRAME_SHAPED, pos=(110, 10))
```

その後
任意の画像を読み込み、ウィンドウサイズの変更、ウィンドウ形状の変更を行います。
透過画像として
読み込めなかったので、色(0,0,0)を透明色として扱うことにしています。

```python
image = wx.Image("apple.png")
self.bitmap = image.ConvertToBitmap()
self.imageSize = image.GetSize()
self.SetClientSize(self.imageSize)
self.SetShape(wx.Region(self.bitmap, wx.Colour(0, 0, 0)))
```
最後にonPaintイベントをバインドして、画像を描画します。

```python
self.Bind(wx.EVT_PAINT, self.onPaint)

def onPaint(self, event=None):
    DC = wx.PaintDC(self)
    DC.DrawBitmap(self.bitmap, 0, 0, True)
```
これで画像型ウィンドウの表示ができました。

## タイトルバーがないのでウィンドウが動かせない!!
せっかくなので動かせるようにしたいと思います。
ここはもう少し簡単な方法もありそうですがMoveイベントでクリックされてるかつ移動してる部分を検知して位置を更新するようにしています。
取得位置をスクリーンの絶対位置に変換しているのが大事な部分です。

```python
def onEvent(self, event):
    pos = event.Position
    pos = self.ClientToScreen(pos)
    if self.leftDown and event.leftIsDown:
        self.position[0] += pos.x-self.x
        self.position[1] += pos.y-self.y
        self.Move(self.position)
    self.x = pos.x
    self.y = pos.y
    self.leftDown = event.leftIsDown
```

# 最終的なコード

コードとは関係ないですがpythonwを使って実行するとコンソールを表示せずにウィンドウだけ立ち上がるのでおすすめです。

```python
import wx

class AppFrame(wx.Frame):
    def __init__(self):
        self.position = [100, 100]
        wx.Frame.__init__(self, None, title="Apple!!",
                          style=wx.NO_BORDER | wx.FRAME_SHAPED, pos=(110, 10))
        self.Bind(wx.EVT_MOUSE_EVENTS, self.onEvent)
        self.Bind(wx.EVT_PAINT, self.onPaint)
        self.Move(self.position)
        self.leftDown = False
        self.x = -1
        self.y = -1

        image = wx.Image("apple.png")
        self.bitmap = image.ConvertToBitmap()
        self.imageSize = image.GetSize()
        self.SetClientSize(self.imageSize)
        self.SetShape(wx.Region(self.bitmap, wx.Colour(0, 0, 0)))

    def onEvent(self, event):
        pos = event.Position
        pos = self.ClientToScreen(pos)
        if self.leftDown and event.leftIsDown:
            self.position[0] += pos.x-self.x
            self.position[1] += pos.y-self.y
            self.Move(self.position)
        self.x = pos.x
        self.y = pos.y
        self.leftDown = event.leftIsDown

    def onPaint(self, event=None):
        DC = wx.PaintDC(self)
        DC.DrawBitmap(self.bitmap, 0, 0, True)


app = wx.App(False)
AppFrame().Show()
app.MainLoop()
```
chrome driver binaryをchromeと自動バージョン同期する

#目的
chromedriver-binaryのバージョンを自端末のchromeと自動同期とる

#手順
参考サイト
https://github.com/yeongbin-jo/python-chromedriver-autoinstaller

macならターミナルにて
```pip install chromedriver-autoinstaller```

Windowsならコマンドプロンプトにて
```py -m pip install chromedriver-autoinstaller```

インストールが終わったら、自分のPythonプログラムコードに
from selenium import webdriver　などのimport句らへんに↓の2行を追加
```import chromedriver_autoinstaller
chromedriver_autoinstaller.install()```

以上。
あとは普通にそのままコードを書き連ねて実行するのみ。
Raspberry Pi 4 で Radiko 録音サーバ（Docker未使用）

# はじめに

Raspberry Pi 4 の arm64v8 環境で Docker する道は険しかった…
過去に x86_64 用に作成した Dockerfile たちを arm64v8 化するのはやぶさかではなかったが
build ができない（かろうじて run はできる）んで心が折れた。みんなどうしてんの？
（参考：[https://github.com/docker/distribution/issues/3008](https://github.com/docker/distribution/issues/3008)）

一旦サービスを稼働させることを優先して、Docker 無しで環境構築した。

久々に systemd の Unit ファイルの作り方とか調べるの結構面倒だったので
ほぼ自分用メモとして残しておく。

追記）
2020/11/14 config.json の書き方が誤っていたので修正した
2020/11/14 crontab で1ヶ月前のものから自動削除する設定を追加した
2020/11/18 nginx の設定を足した

```
$ lsb_release -a
No LSB modules are available.
Distributor ID: Raspbian
Description:    Raspbian GNU/Linux 10 (buster)
Release:        10
Codename:       buster
```

# radicast

```
$ sudo su -
# apt update
# apt install rtmpdump swftools libxml2-utils
# go get github.com/mtkhs/radicast
# mkdir -p /opt/service/radicast
# cd /opt/service/radicast
# vim config.json
# mkdir output
# vim /etc/systemd/system/radicast.service
# systemctl enable radicast
# systemctl start radicast
# crontab -e
```

```json:config.json
{
  "BAYFM78": [],
  "FMJ": [],
  "FMT": [],
  "HOUSOU-DAIGAKU": [],
  "INT": [],
  "JOAB": [],
  "JOAK": [],
  "JOAK-FM": [],
  "JORF": [],
  "LFR": [
    "0 1 * * FRI",
    "0 1 * * SUN"
  ],
  "NACK5": [],
  "QRR": [],
  "RN1": [],
  "RN2": [],
  "TBS": [
    "30 21 * * MON",
    "0 0 * * WED",
    "0 1 * * WED",
    "0 0 * * FRI",
    "0 3 * * SUN",
    "30 3 * * SUN"
  ],
  "YFM": []
}
```

```systemd:radicast.service
[Unit]
Description=Radicast service
After=networking.service
Requires=networking.service

[Service]
Type=simple
WorkingDirectory=/opt/service/radicast
ExecStart=/root/go/bin/radicast
ExecReload=/bin/kill -HUP $MAINPID
Restart=always

[Install]
WantedBy=multi-user.target
```

```cron:crontab
0 5 * * * find /opt/service/radicast/output/ -mtime +31 -delete
```

# nginx

```
# apt install nginx
# cd /etc/nginx/
# rm sites-enabled/default
# vim sites-available/radicast
# ln -s sites-available/radicast sites-enabled/radicast
```

`[yourhostname]` には適当に取った DDNS 名とかホスト名を入れる。

```nginx:radicast
server {
    listen 80;
    server_name [yourhostname];

    location / {
        rewrite ^/$ http://$server_name/rss redirect;
        proxy_pass                         http://127.0.0.1:3355;
        proxy_set_header X-Real-IP         $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Host  $http_host;
        proxy_set_header Host              $http_host;
        proxy_max_temp_file_size           0;
        proxy_buffers                      8 64k;
        proxy_buffer_size                  64k;
    }
}
```

# おわりに

iPhoneのPodcastアプリで「番組をURLで追加…」で

`http://[yourhostname]`

が追加できたらOK
tupleをvectorに格納してsort

AtCoder ABC128 B問題( https://atcoder.jp/contests/abc128/tasks/abc128_b )で使った。tupleの第二要素→第三要素の順でsortしているが，前者は辞書順(昇順)，後者は降順である。

```C++:main.cpp
//main外
typedef tuple<int, string, int> mytuple;
 
//main内
vector<mytuple> V;
auto condition = [](mytuple &alpha, mytuple &beta){
  if(get<1>(alpha) != get<1>(beta)) return get<1>(alpha) < get<1>(beta);
  return get<2>(alpha) > get<2>(beta);
});
sort(V.begin(), V.end(), condition);
```