OmniAICreator/Qiita-1.07M huggingface dataset:
【Rails】モデルの関連付けを行う

##関連付けとは
Railsでは、モデルやテーブル同士の関係を設定することができます。
例えばUserモデルとTaskモデルの関係などを定義します。
（この場合、1人のユーザーが複数のタスクを持っている）

##何がうれしいのか
必要な記述が少なく、シンプルになります。
TODOアプリを例に説明すると、以下のように記述が簡素化します。
###タスク作成時
```ruby
Task.create(title: "パンを買う", user_id: @user.id)
```
↓

```ruby
@user.tasks.create(title: "パンを買う")
```
###ユーザー削除時
```ruby
@tasks = Task.where(user_id: @user.id)
@tasks.each do |task|
  task.destroy
end
@user.destroy
```
↓

```ruby
@user.destroy
```

その他、以下のようなメソッドが使えるようになります。

| メソッド | 用途 |
|:--|:--|
| task.user | タスクに紐付いたUserオブジェクトを返す |
| user.tasks | Userのタスクの集合を返す |
| user.tasks.build(arg) | userに紐付いた新しいTaskオブジェクトを返す |
| user.tasks.find_by(id: 1) | userに紐付いていて、idが1であるタスクを検索する |

##実装してみる
簡単なTODOアプリを例に、UserモデルとTaskモデルの関連付けをします。
[Ruby on Railsで簡単なアプリを作成](https://qiita.com/d0ne1s/items/5e63dde992f20f25b8bb)
[【Rails】ログイン機能を実装する](https://qiita.com/d0ne1s/items/7c4d2be3f53e34a9dec7)
###tasksテーブルに`user_id`を追加
`$ rails g migration Addカラム名Toテーブル名 カラム名:データ型`でカラムを追加するマイグレーションファイルを作成できます。

```terminal
$ rails g migration AddUserToTasks user:references
```
作成されるファイル

```ruby:[timestamp]add_user_to_tasks.rb
class AddUserToTasks < ActiveRecord::Migration[5.1]
  def change
    add_reference :tasks, :user, foreign_key: true
  end
end
```
ここでは外部キー制約を持った`reference型`の`user_id`というカラムを追加し、`user_id`には`usersテーブルのidカラム`に入っているデータだけを許可します。
（データベース上には、usersテーブルのidカラムの型である`integer型`として登録されます。）
[外部キー (foreign key)とは｜「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典](https://wa3.i-3-i.info/word1992.html)

```terminal
$ rails db:migrate
```

###`has_many`、`belongs_to`で関連付け
Taskモデルに`belongs_to`、Userモデルに`has_many`を記述し、関連付けを行います。
その他`default_scope`で取り出す時の順番を指定したり、`dependent: :destroy`でユーザーが削除された時にそのユーザーの持つタスクを全て削除するように設定できます。

```ruby:/app/model/task.rb
class Task < ApplicationRecord
  belongs_to :user
.
.
end
```
```ruby:/app/model/user.rb
class User < ApplicationRecord
  has_many :tasks, dependent: :destroy
.
.
end

```

###タスク登録処理を修正
これまで`Task.new`で取得していたタスクオブジェクトを`current_user.tasks.build`で書き換えます。
(このアプリではcurrent_userという関数で現在ログイン中のユーザーオブジェクトを返すことができます。)

```ruby
.
.
def create
    # @task = Task.new(task_params)
    @task = current_user.tasks.build(task_params)
    if @task.save
      flash[:success] = "タスクを追加しました。"
.
.
```
まだこのアプリにはユーザー削除の機能がないので、削除時の動作の実装は割愛しますが、`@user.destroy`でユーザーに紐づいた全てのタスクを削除できます。

##外部キーを設定したカラムにnullを許可したい
`optional: true`を指定すると、nullを許可できます。

```rb:app/model/task.rb
belongs_to :user, optional: true
```
##その他
外部キーを含むテーブルを作成する際には
`$ rail g model user:references ...`
`$ rail g migration user:references ...`
などで作ることが出来ます。

モデルを作った場合には、デフォルトで`belongs_to :user`が付与されます。

##参考
[Active Record の関連付け - Rails ガイド](https://railsguides.jp/association_basics.html)
[外部キーにnullが入ることを許容する[Rails]](https://qiita.com/takuyanin/items/6f6be86d1265be21bf9e)
Java  (WebSphere Application Server)メモ[1]

# WebSphere Application Server とは  
>  IBMが開発・販売する、Java EE対応のアプリケーションサーバであり、IBMソフトウェアのWebSphereブランドの中核をなす製品（以下、WASと略）  

# JSPとどう連携して使うのか  

![r5fig4.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57249/209614b0-1a07-7a0f-5e9a-0971ae87a927.gif)

1. ログイン画面を表示するJSPを作成する
2. ようこそ画面を表示するJSPを作成する  
3. ユーザー情報画面を表示するJSPを作成する  
4. ユーザー情報を保存するBeanを作成する  

> それぞれのサーブレットでは、データをBeanに保存し、画面を表示するためにJSPを呼び出す。

![r5fig5.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57249/cc3cf69f-b1f1-f0b6-c00b-92420d6cd6c5.gif)

> 詳しくは、参考[3]へ


# 参考  

> [1]WAS導入向け  
[https://qiita.com/TTakakiyo/items/05dfdb020249699d9849](https://qiita.com/TTakakiyo/items/05dfdb020249699d9849)

> [2]JSP エンジン・パラメーター
[https://www.ibm.com/support/knowledgecenter/ja/SSEQTP_9.0.5/com.ibm.websphere.base.doc/ae/rweb_jspengine.html](https://www.ibm.com/support/knowledgecenter/ja/SSEQTP_9.0.5/com.ibm.websphere.base.doc/ae/rweb_jspengine.html)  

> [3]WASとサーブレット、JSPの連携  
[https://www.atmarkit.co.jp/ait/spv/0201/10/news001.html](https://www.atmarkit.co.jp/ait/spv/0201/10/news001.html)

> [4] JSPカスタムタグ    
[https://nablarch.github.io/docs/5u9/doc/application_framework/application_framework/libraries/tag.html#id3](https://nablarch.github.io/docs/5u9/doc/application_framework/application_framework/libraries/tag.html#id3)
ssコマンドでtcpのLISTENを確認

## オプション

ssコマンドとnetstatのオプションは同じ様子。

```sh:LISTENポート一覧
ss -l4
```

```sh
# localhostを除外
ss -l4  | grep -v 127


# netstatの場合
netstat -l4 | grep -v localhost
```

## 参考

* [linux【ss/netstat】コマンドの見方/オプション～Recv-Q/Send-Qやポート確認(Listen/Estab/Unconn),プロセス表示等～ | SEの道標](https://milestone-of-se.nesuke.com/sv-basic/linux-basic/ss-netstat/)
stress 

Depression, which develops due to stress at work and school, and has become a social problem as the number of patients has increased in recent years. Even now, the author who is associated with depression asks nine former patients about the chance of getting sick, the path to recovery and rehabilitation, and communicates the actual condition of the disease in the immediate vicinity of everyday life as if he were wearing it everyday.

A variety of backgrounds appear in this book, from overworked office workers in their 30s to housewives in their 50s who are taking care of their families with dementia, students who are triggered by the stress of job hunting and studying for exams. . “To date, most books on depression are the celebrity experience of celebrities or academics written by intellectuals. Why did ordinary people become depressed and how did they get cured? I wanted to introduce a familiar case. ''

〈What kind of symptoms did you see when depression was severe? > <Oh ... I can't do anything>. Under what circumstances did you become depressed and follow the path of recovery? Realistic experiences are developed through interaction between the interviewer's authors and those with experience in depression.

“At the time of depression, a woman who was 19 years old and was a black tanned gal” <I don't know what everyone is talking about, I don't know (omitted). Everyone said, “Kyahahaha! I recall that when I started developing, I mean, I'm cooling in inverse proportion.

Careful moody feeling with aroma on a day when you feel unwell

○ When irritation does not stop
If you get frustrated and accumulate stress, your body may be overpowered and your life energy cycle will be worse. Choose a bergamot to relieve stress or an orange sweet that supplements life energy to encourage your visit.
<a href="https://hikakaku.com/" >ヒカカクヒカカク</a>
○ When you think too much
If you have trouble or think too hard, lavender or black pepper aroma oil is recommended. Because it has a gastrointestinal regulating action, try using it even if it affects your "eating" such as loss of appetite and hunger.
【Rails】SSLの導入【Rails Tutorial 7章まとめ】

##SSL
Secure Sockets Layer(SSL)は、ローカルのサーバーからネットワークに流れるデータを暗号化し、セキュリティを強化する技術である。
SSLを使うとURLがhttpからhttpsに変わる。

###SSLの導入
本番環境用の設定ファイルであるproduction.rbのconfig.force_sslをtrueに設定し、本番環境でSSLを使用させる。

```config/environments/production.rb
Rails.application.configure do
  .
  .
  .
  # Force all access to the app over SSL, use Strict-Transport-Security,
  # and use secure cookies.
  config.force_ssl = true
  .
  .
  .
end
```
５０行目あたりにある。
Laravel マイグレーションファイル作成


##マイグレーションとは
「統合する」などの意味。Laravelにおいては、データベースの定義にあたります。

##マイグレーションの手順

### artisanコマンドでマイグレーションファイル作成

```terminal
$ php artisan make:migration ファイル名 --create=テーブル名
```

任意のファイル名、テーブル名を入力してターミナルでartisanコマンドを実行します。
テーブル名は複数形にします。

プロジェクトのディレクトリ内の`database/migrations`ディレクトリに
`2019_11_24_224426_ファイル名.php`が自動で作成される。



### データベースの接続

`migrate`を実行すると、マイグレーションファイルに設定された情報に基づいてデータベースにテーブルが作成されます。

```terminal
$ php artisan migrate
```

1.config→database.phpを開く

2.データベース名を変更
'default' => env('DB_CONNECTION', '使用したいデータベース名'), （※データベース名　→　mysqlやsqlite等）

```php

// 使用するデータベースのパスや.envについての情報を確認しておく
'connections' => [

        'sqlite' => [
            'driver' => 'sqlite',
            'url' => env('DATABASE_URL'),
            'database' => env('DB_DATABASE', database_path('database.sqlite')),
            'prefix' => '',
            'foreign_key_constraints' => env('DB_FOREIGN_KEYS', true),
        ],
```

3.cd databaseでディレクトリに移動

4.touch database.sqlite
（database.phpの'connections内にあるdatabase_pathのファイルを作成）

５. 「.env」ファイルのDB_CONNECTION=データベース名を使用するデータベース名に変更

```
DB_CONNECTION=mysql 
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=
```
DB_CONNECTION=sqliteのように使用するデータベース名に変更。

※sqliteの場合は、その下の5行は不要なので削除（あるとマイグレーションエラーになる。）


6.$ php artisan migrateを実行


```terminal
PDOException::("SQLSTATE[HY000] [1049] Unknown database 'laravel'")
```

※データベースの定義後、データベースを置くところを作成せずにmigrateを実行するとエラーになります。

###やり直し

直前のマイグレーションを取り消したいときは`rollback`が便利です。

```terminal
$ php artisan migrate:rollback
```


## 参考
[Laravel データベース:マイグレーション](https://readouble.com/laravel/7.x/ja/migrations.html)
model-viewer に見た夢から醒めた

## [model-viewer](https://modelviewer.dev/)
- <[model-viewer](https://modelviewer.dev/) ar src="path/to/glb" ios-src="path/to/usdz" /> と書くだけでAR体験できるやつ

### 興味持った点
- ARが簡単
- Android、iPhone両対応

### 興味を失った点
- 他のWeb技術と組み合わせられない
- WebXR の未来はこれじゃない

### わかったこと
- Android では [SceneViewer](https://developers.google.com/ar/develop/java/scene-viewer) を起動してる
- iPhone では [AR Quick Look](https://developer.apple.com/jp/augmented-reality/quick-look/) を起動してる
- どっちもアプリ起動みたいなもの、WebGLとかじゃない、Canvasに描画して欲しかった

#### ブラウザから SceneViewer を起動してる
- [Android Intents with Chrome](https://developer.chrome.com/multidevice/android/intents)
- 次みたいなリンクを作ってる
- intent スキーマ初めてみた

```html:sceneviewer
<a href="intent://modelviewer.dev/examples/assets/Astronaut.glb#Intent;scheme=https;package=com.google.android.googlequicksearchbox;action=android.intent.action.VIEW;S.browser_fallback_url=https://developers.google.com/ar;end;">android</a>
```

#### ブラウザから QuickLook を起動してる
- [Display an AR Experience in Your Web Page](https://developer.apple.com/documentation/arkit/previewing_a_model_with_ar_quick_look#3263412)
- [In-place viewing of USDZ](https://webkit.org/blog/8421/viewing-augmented-reality-assets-in-safari-for-ios/)
- 次みたいなリンクを作ってる
- 空でいいから img タグが必要とかエグい
- リンクをスクリプトで即 click してる

```html:quicklook
<a rel='ar' href="https://modelviewer.dev/examples/assets/Astronaut.usdz" ><img /></a>
```



以上
Linux の root パスワードをリセット（設定）する方法

たまたま、VirtualBox のイメージを入手したところ、そのイメージには、root パスワードが設定されておらず、ユーザ名とパスワードは分かったものの、sudo コマンドを発行しても sudoers に記述がないため、管理者の動作ができませんでした。
そこで、root パスワードを設定しなければなりません。

* マシンを起動し、grub メニューで "e" を押下
* linux16 の行に移動
* ro を rw init=/sysroot/bin/sh に修正
* Ctrl+x を押下
* :/# chroot /sysroot
* :/# passwd root
* :/# touch /.autorelabel
* :/# exit
* :/# reboot

再起動後、ログインして、su コマンドを発行、さきほど設定したパスワードで root になれましたー。 

参考：[How To Reset Root Password On CentOS 7](https://www.unixmen.com/reset-root-password-centos-7/)
【Rails】ユーザー登録フォームの作成その3　ユーザー登録の成功【Rails Tutorial 7章まとめ】

##ユーザー登録成功時の処理
ユーザー登録に成功すると、なぜかnewページに戻る。
これはcreateアクションでユーザーが作成されたあと、対応するcreateビューに行こうとするが、createビューが存在しないためである。
createビューは必要ないため、ここではユーザーのプロフィールページにリダイレクトすることにする。

```app/controllers/users_controller.rb
  def create
    @user = User.new(user_params)
    if @user.save
      flash[:success] = "Welcome to the Sample App!"
      redirect_to user_url(@user)
    else
      render 'new'
    end
  end
```
user_url(@user)の行き先は/user/:idへのGETリクエストであり、showアクションに到達する。
また、リダイレクトの場合名前付きルートは_pathではなく_urlを使用する。
なお、user_url(@user)を単に@userと書いてもよいらしい。

flash変数を使って、ユーザー登録成功時のメッセージを表示している。

##ユーザー登録成功時のテスト
ユーザー登録成功時のテストを書く。

```test/integration/users_signup_test.rb
require 'test_helper'

class UsersSignupTest < ActionDispatch::IntegrationTest
  .
  .
  .
  test "valid signup information" do
    get signup_path
    assert_difference 'User.count', 1 do
      post users_path, params: { user: { name:  "Example User",
                                         email: "user@example.com",
                                         password:              "password",
                                         password_confirmation: "password" } }
    end
    follow_redirect!
    assert_template 'users/show'
    assert_not flash.empty?
  end
end
```
ユーザー登録失敗時のテストと基本は同じ。
こちらはassert_differenceを使っている。
これはブロックの前後で第一引数が第二引数分だけ増減したことを確認する。
ユーザー登録の成功により、User.countは１増えているはずである。

リダイレクト先に移動するにはfollow_redirect!を使う。

flashが表示されていることも確認しておく。

##flashの表示
flashをレイアウトに追加して表示できるようにする。

```app/views/layouts/application.html
  <body>
    <%= render 'layouts/header' %>
    <div class="container">
      <% flash.each do |message_type, message| %>
        <div class="alert alert-<%= message_type %>"><%= message %></div>
      <% end %>
      <%= yield %>
      <%= render 'layouts/footer' %>
      <%= debug(params) if Rails.env.development? %>
    </div>
    .
    .
    .
  </body>
```
Laravel composerインストール後〜内蔵サーバー起動


composer インストール後

##Laravelをcomposerを使用してインストール

```terminal
$ php composer.phar create-project --prefer-dist laravel/laravel プロジェクト名（ディレクトリ）
```

###ディレクトリに移動

```terminal
$ cd プロジェクト名（ディレクトリ）
```

###Laravelのサーバーを起動

```terminal
$ php artisan serve

Laravel development server started on http://localhost:8000/
```

※仮想マシン（vagrant）から使用する場合は、

```terminal
php artisan serve --host 192.168.33.10 --port 8000
````

ディレクトリの一番上の階層でサーバーを立ち上げること。
（Laravelに内蔵されているサーバーが起動する）
WSLのpython環境でGUI周りではまったこと

# はじめに
先日wslにpython環境を構築したばかりで，GUIを含んだプログラムを実行していなかったので試しに実行してみたところ，エラーで詰まったのでその対処を備忘録として残します．

# 追記（2020/11）

下記のstackoverflowのページでWSL2も含めた一連の解決策が乗っているのでこちらも参照してください．

[python \- Show matplotlib plots \(and other GUI\) in Ubuntu \(WSL1 & WSL2\) \- Stack Overflow](https://stackoverflow.com/questions/43397162/show-matplotlib-plots-and-other-gui-in-ubuntu-wsl1-wsl2)


# 実行したプログラムの概要
実行しようとしてはまったのはPyQt5を使用したGUIプログラムです．matplotlibによる描画も含んでいます．
Anaconda環境では何の追加設定もなしに実行可能なプログラムになっています．

# エラーの内容
`qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in "" even though it was found.`
プログラムを実行したところ上記のエラーが出ました．

調べると同じような状況に遭遇した方がいました．
[\`qt\.qpa\.plugin: Could not load the Qt platform plugin "xcb" in "" even though it was found\.\` というエラーが起きたときの対処 \- Qiita](https://qiita.com/fukasawah/items/99219e1ff7d08915952f)

# やったこと
下記を実行しました．

```
sudo apt install libxkbcommon-x11-0
```


※ 上記記事には~/.bashrcに`export QT_DEBUG_PLUGINS=1`を記載するよう書いていますが，これはデバッグ用のものなので不要です．

ただこれの実行前に，以下を実施しています．

* Qt, PyQt5, SIPをインストールした．（プログラムがPyQt5を使用しているようだったため，これらをインストールした．）
* tkinterとXserverをインストールし，表示先ディスプレイの設定をした．（wslのUbuntuにはGUI機能がないため，matplotlibの描画やQtのGUI画面の表示に必要）[^1]

[^1]: [Windowsで環境を極力汚さずにPythonを動かす方法 \(WSL利用 Windows10, version 1607以降限定\) \- Qiita](https://qiita.com/rhene/items/ff11c7850a9a7617c50f)

matplotlibなどのGUIを含むプログラム実行時には，Xserverを起動している必要があります．起動せずに実行すると，以下のエラーが出ます．

```
qt.qpa.xcb: could not connect to display :0.0 
qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in "" even though it was found.
This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem.

Available platform plugins are: eglfs, linuxfb, minimal, minimalegl, offscreen, vnc, wayland-egl, wayland, wayland-xcomposite-egl, wayland-xcomposite-glx, webgl, xcb.

Aborted (core dumped) 
```

もしかしたら不要な部分があるかもしれませんが，僕の場合はこれで解決できました．ご参考まで．
Paiza Golang サンプルコード

```
package main
import (
        "bufio"
        "fmt"
        "os"
        "strconv"
        "strings"
)

func getInput() [][]string {
    
    var input [][]string
    scanner := bufio.NewScanner(os.Stdin)
    
    for scanner.Scan() {
        text := scanner.Text()
        words := strings.Split(text, " ")
        input = append(input, words)
    }
    
    return input
}

// 入力値が全て数値の場合
func toInt2dSlice(input [][]string) [][]int {
    var intSlice [][]int
    for _, strings := range input {
        var numbers []int
        for _, s := range strings{
            var number, _ = strconv.Atoi(s)
            numbers = append(numbers, number)
        }
        intSlice = append(intSlice, numbers)
    }
    return intSlice
}

func main() {
    input := getInput()

    /* 入力値が全て数値の場合は [][]string->[][]intするとラク
        input := toInt2dSlice(getInput())
    */

    fmt.Println(input)
    fmt.Println(input[0][0])
}
```
SQL Builder (ORMライブラリ) のメリット、デメリット

貧弱なORMのライブラリのクエリビルダを使って辟易して、
もう生のSQLでもいいんじゃないか？と思ったけど、
それでもやっぱり、ORMってだけで、便利だなぁ・・・って、改めて思った話

#メリット
- メソッドを補完してくれるエディタであれば、コーディングが早い。
- 可読性が、生のSQLを記述する場合と比較すると上がると思。（かっこ書きになるので命令文とパラメータが一目瞭然なんだと思う）
- メソッドチェーンで繋げるので、部分的な変更がしやすい
- サブクエリをネストできるようなORMだと、意味のある単位でクエリを分割できる
- SQLインジェクションを排除してくれる。
- DBMS（DBの種類）の差異、方言を埋めてくれる。ってのが一番の売りなのかもしれないが、DBを変えることは、ほとんどないので、今のところそんなにメリットは感じない
 
# デメリット

- 複雑なクエリになると、発行されるSQLが想定と違い、SQLに戻してデバッグしなければならない
- ORMのライブラリによっては、複雑なクエリを発行できないことがあり、生のSQLと混在する<br>
カラム名とかに予約語使われていると、エスケープできないライブラリによっては詰むかも<br>
完璧に気持ちよく対応できているORMはないんじゃないか？ 
いや、ORMに完璧さを求めてはいけないんだな。
あるだけで便利なのだから。
SSH先のPythonプロセスにアタッチしてデバッグ

## 概要
既に動いているPythonプロセスにアタッチして生きているオブジェクトを操作したい場面は往々にしてあります。

- 前処理に時間のかかるグラフを出してみたは良いけどデータを保存する処理を書き忘れた。
- 数日かかるモデルの学習がエラーも吐かず止まっている。どこで止まったか知りたい。
- 巨大なサービスからspawnされているPythonスクリプトのデバッグ
- ゾンビや孤児になってしまったプロセスにアタッチしたい

ローカル環境でIDEが動く場合は簡単かもしれませんが、GPUマシンなどにSSHしている場合はより問題が込み入ってきます。

今回はこうした問題を、lightweightかつportableなツールの組み合わせで解決する方法を紹介します。
![](http://www18.tok2.com/home/ryukoso/gazou/LuckyStar/KABA_2702_DVD-7141.jpg)
> 1. Small is beautiful. 小さいものは美しい   ――The UNIX philosophy――

## 条件
例として1秒おきに経過秒数を表示し続けるプログラムをターゲットとします。
追加のライブラリをインポートしたりスニペットを前もって挿入する必要がないところがポイントです。

```python:roop.py
import time
n = 0
while True:
	print(n)
	time.sleep(1)
	n += 1
```
意図して孤立させ、制御端末を持たないプロセスを作り実験してみます。

```terminal
$ nohup python roop.py & ; exit
```


## [reptyr（りぴーたー）](https://github.com/nelhage/reptyr)
まずターゲットの標準入出力を奪取して用意した端末につけかえます。

```bash
# -s ターゲットのファイルディスクリプタ0,1,2がTTYに繋がっていなくても横取りする。
$ reptyr -s $PID
```

## [pyrasite（ぱらさいと）](https://github.com/lmacken/pyrasite)
次にターゲットに下記のデバッガ起動コードの注入を行います。

```
$ pyrasite $PID set_pudb.py
```
## [PuDB（ぴーゆーでーびー）](https://github.com/inducer/pudb)
最後に起動したデバッガの内部シェルから変数`n`を書き換え、ステップ実行してみます。

```python:set_pudb.py
import pudb
pudb.set_trace()
```

## 結果
![output.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45682/eca2b1bf-5c03-5b5a-f8a3-c250b0a6f366.gif)
reptyrが奪取したことでこれまで虚無に消えていたログに触れるようになりました。
さらにブレークポイントを貼ってループごとの実行や`n=-100`と変更したのが反映されているのが分かると思います。

補足：途中`no source code available`とか出ますがCの関数から帰ってくるまで`n`とか押しとけば大丈夫です。


---
最後に、これまでの内容をいい感じにやってくれるスクリプトを載せておきます。

```bash:injector.sh
#!/bin/bash

tmpfile=`mktemp`
PID=`pgrep -a python|fzf|awk '{print $1}'`
[ -z "$PID" ] && exit 1

cat << EOF > $tmpfile
import pudb
pudb.set_trace()
EOF

pyrasite $PID $tmpfile &
reptyr -s $PID
```
三方比較を触ってみた

# はじめに
C++20の新機能として、三方比較というものがあるらしい。。。
という事で、どんなものか調べつつ試してみた。

# どんなもの？
`<=>`で表す比較演算子で、`a`と`b`の関係によって、`a <=> b`は以下のオブジェクトを返す
1. `a < b`のとき`< 0`
2. `a > b`のとき`> 0`
3. `a == b`のとき`== 0`

また、組み込み型を扱う際には以下のような特徴がある
- 片方だけ`bool`だとコンパイルエラー
- `int`と`unsigned int`のような縮小変換を含めるとコンパイルエラー

# サンプル
コードはほとんど変えていないが、後者は`auto`で三方比較演算子の結果を変数にしたものである。

```cpp:main.cpp
#include <iostream>
#include <compare>
using namespace std;

int main() {
  int a = 1;
  int b = 2;

  cout << "( a<=>b >  0 ) : " << ( a<=>b >  0 ) << endl;
  cout << "( a<=>b == 0 ) : " << ( a<=>b == 0 ) << endl;
  cout << "( a<=>b <  0 ) : " << ( a<=>b <  0 ) << endl;
  cout << "( a<=>b != 0 ) : " << ( a<=>b != 0 ) << endl;
  cout << "( a<=>b >= 0 ) : " << ( a<=>b >= 0 ) << endl;
  cout << "( a<=>b <= 0 ) : " << ( a<=>b <= 0 ) << endl;
  return 0;
}
```

```bash:result
( a<=>b >  0 ) : 0
( a<=>b == 0 ) : 0
( a<=>b <  0 ) : 1
( a<=>b != 0 ) : 1
( a<=>b >= 0 ) : 0
( a<=>b <= 0 ) : 1
```

```cpp:main.cpp
#include <iostream>
#include <compare>
using namespace std;

int main() {
  int a = 1;
  int b = 1;
  
  auto comp = ( a<=>b );

  cout << "( a<=>b >  0 ) : " << ( comp >  0 ) << endl;
  cout << "( a<=>b == 0 ) : " << ( comp == 0 ) << endl;
  cout << "( a<=>b <  0 ) : " << ( comp <  0 ) << endl;
  cout << "( a<=>b != 0 ) : " << ( comp != 0 ) << endl;
  cout << "( a<=>b >= 0 ) : " << ( comp >= 0 ) << endl;
  cout << "( a<=>b <= 0 ) : " << ( comp <= 0 ) << endl;
  return 0;
}
```

```bash:result
( a<=>b >  0 ) : 0
( a<=>b == 0 ) : 1
( a<=>b <  0 ) : 0
( a<=>b != 0 ) : 0
( a<=>b >= 0 ) : 1
( a<=>b <= 0 ) : 1
```


# 参考
- https://ja.cppreference.com/w/cpp/language/operator_comparison#.E4.B8.89.E6.96.B9.E6.AF.94.E8.BC.83
- https://onihusube.hatenablog.com/entry/2019/01/13/180100
- https://cpprefjp.github.io/lang/cpp20/consistent_comparison.html
Unityでシューティングゲームを作る(1)

##作ろうとしてるゲーム
2Dのシューティングゲームを作ろうと思う

##使用環境

- Windows10 Home

- Intel Core i7-9700K

- Unity 2019.2.11f1 Personal 

- Visual Studio 2019

- Android Studio 

##この投稿の主な目的

自分が作ったゲームを広めるためと、改善のための意見がほしい。
ゲーム制作において解決したことなども書いていければと思っている。
基本的なことをおさらいするというのはネットに記事がいっぱいあるだろうからこの投稿ではやらない。
ではさっそく

###Prefabから元のオブジェクトへの戻し方
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482973/4050cef1-4e23-9ee0-97be-de656654c66b.png)
赤矢印のNormal_EnemyというPrefabがあったときに、ヒエラルキーのCreate Emptyで空のオブジェクトを作成する。
![コメント 2019-11-27 234949.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482973/187443d6-57a3-922c-af20-d7e2fd2e853a.png)
Normal_Enemyをさっき作った空のオブジェクトの子オブジェクトにする。
![コメント 2019-11-27 235632.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482973/24050ce6-b27d-ae67-6032-5262172dd4db.png)
空のオブジェクトをプロジェクトウィンドウにドラック＆ドロップすることでPrefabにする。
![コメント 2019-11-28 000142.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482973/f327d471-83e6-d181-94f2-749b54eaaab9.png)
先ほどプロジェクトウィンドウに置いたPrefabを削除するとヒエラルキーのGameObjectとNormal_Enemyの文字が茶色になるので、子オブジェクトにしていたNormal_Enemyを元に戻してGameObjectを削除すると戻すことができる。
![コメント 2019-11-28 000720.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482973/397c56c4-3a31-1c88-9f9c-c31adbf66b67.png)

###うまくいかないことがおきた

![コメント 2019-11-28 022655.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482973/00a856da-2f73-2106-d78f-63245aebff91.png)
プログラム内で判定させているのに、赤い丸の敵オブジェクトが範囲から出てしまう。
おそらく単なるミスだと思うけど...


...とおもったらわかった
このオブジェクトは180度回転させてるからtransform.Translateで移動させようとするとx方向とy方向が逆になってしまうからおかしくなってしまっていた。
![コメント 2019-11-28 034059.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482973/30e474c8-b106-db4d-548b-5e9cbb8f71de.png)

なのでこのオブジェクトを移動させるときは
transform.Translate(-x,y,0)としなければならない。

今日はここまでにする。
Elasticsearchで特定フィールの条件マッチしたものを上位に表示させたい

# script score とは

- ドキュメントが持っているフィールドになんらかの処理をした結果をスコアに反映したいときなどに使える。
- SQLのストアドと一緒なので、ES側に計算（負荷）が増えることになるので、そこは注意

# ESのインデックス（データ）

- フィールド：fruit_name
    - 青森りんご/長野りんご/愛媛みかん/etc..
- フィールド：fruit_type
    - りんご/みかん/etc..
- フィールド：fruit_area_code
    - 1:青森/2:長野/etc..

# サンプルクエリ

長野県産(`fruit_area_code=2`)りんごを上位に表示したい（ `_score` を1.5倍にする）例

```
GET es_index_data/_search
{
  "query": {
    "function_score": {
      "query": {
        "bool": {
          "must": {
            "multi_match": {
              "query": "りんご",
              "type": "cross_fields",
              "fields": [
                "fruit_name",
                "fruit_type"
              ],
              "operator": "and",
              "tie_breaker": 0.2
            }
          }
        }
      },
      "script_score": {
        "script": {
          "lang": "painless",
          "source": "def val = doc['fruit_area_code'].value;if(val == 2){ return _score * 1.5}return _score"
        }
      }
    }
  }
}
```

# 参考
- https://www.elastic.co/guide/en/elasticsearch/reference/master/modules-scripting-fields.html#modules-scripting-fields
Rails チュートリアル学習メモ

今日からチュートリアルを開始

## プロジェクトの作成
```terminal
$ rails new project_name
```

## サーバーの起動
```terminal
$ rails server
```
これで `localhost:3000` でアクセス可能

## Controllerの生成
```terminal
$ rails generate controller home top
=> rails g controllerに変換可能
```
Laravelの `php artisan make:controller` 的な感じではなく、自動で `views/home/tophtml.erb` と、 `app/controllers/home_controller.rb` とルーティングの `config/routes.rb` が生成され、ルーティングに自動で追加される。便利だなこれ。
ただ、既存のControllerが存在する場合、 `rails generate controller home test` はエラーになる。

## ルーティング
`config/route.rb` に記述

```ruby:route.rb
Rails.application.routes.draw do
  get "top" => "home#top"
  get "about" => "home#about"
end
```

## 画像挿入
public配下に画像ファイルを配置し、呼び出し元で `/image_name.png` などを入力すれば反映される。

## 「erb」とは「Embedded Ruby（埋め込みRuby）」のこと

## viewでの表示
```ruby
<%= url %>
```
PHPの `<?= $url ?>` と同じイメージ

## ループ処理
```ruby
<% posts.each do |post| %>
<% end %>
```

## Controller側でViewに変数を渡す
```ruby

class UrlController < ApplicationController
  def index
    @urls = [
      "https://google.com",
      "http://google.com",
    ]
  end
end
```

`@` で変数定義するけど、勝手に同じ名前のViewにファイルへ変数が渡るのがもやもやするな。
とりあえず書き方は `Python` に似ている。

## DBのマイグレーションファイル作成
```terminal
$ rails g model モデル名 column_name1:type column_name2:type
```
自動でモデル名の複数形の名前のというテーブルが生成される

## マイグレーション実行
```terminal
$ rails db:migrate
```
Laravelと同じイメージで使えるのは嬉しい

## マイグレーション実行と同時に、Modelのファイルが生成される。Posts

## Rails consoleというものがある
```terminal
$ rails console // 起動
```

## Rails consoleからテーブルへデータをinsertする
```terminal
$ rails console
[1] pry(main)> url1 = Url.new(url: "https://google.com")
[1] pry(main)> url1.save // transactionをsaveする
```

## テーブルの一番最初のレコードを取得する
a = Table.firstでインスタンスを取得する
a.url で中身を確認できる
これをサービスモデルで取得して、Controllerからサービスモデルを呼び出させるようにするのがいいかな？

## どのページでも表示したいHTMLはapplication.html.erbに書いておく
`<%= yield %>` に値するとこに、views配下に入っているファイルが生成される。Laravelだ。

## link_toでanchorをリプレイス
`link_to("文言", "設定したルーティングパス") => <a href="設定したルーティングパス">文言</a>`

## rails consoleでモデル経由でデータ確認
`find_by(id:1)` とかで検索かける
ちなみに、割とrails consoleはよく使われるらしい。

## ルーティングでパラメータ設定
```ruby
Rails.application.routes.draw do
  get "tests/:id" =>  "tests#show"
end
```
これで `/tests/1` とかで、アクセスできるようになるけども、本来予期した普通のルーティングより下に書かないとノイズになって変にハマる。

## 文字列内の変数展開
`"/posts/#{post.id}"` `@` はつけない。

## フォーム生成
`form_tag("パス") do`

## リダイレクト
`redirect_to("パス")`
Commonクラスを自動で生成する仕組みを作ると人生が楽になる【Unity】

UnityでC#スクリプトを生成した後毎回デフォルトで書かれているコードを決まったネームスペースやregionなど、チームのルールに沿って書き直す経験はありませんか。毎回同じコードを書くのは手間ですし、うっかりルールを守れていない状態で処理を書いていたなんてこともありますよね。

この問題は自分でテンプレートをカスタマイズする事で解決する事ができます。

1. UnityEditorをダウンロードしたパスからScriptTemplatesを探す
----
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497331/2c818574-4c23-6cb2-9ce6-f1df0d9b8c07.png)

2. 81-C# Script-NewBehaviourScript.cs.txt を好みで書き換える
---
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;

    public class #SCRIPTNAME# : MonoBehaviour
    {
        // Start is called before the first frame update
        void Start()
        {
            #NOTRIM#
        }

        // Update is called once per frame
        void Update()
        {
            #NOTRIM#
        }
    }

あとはUnityでスクリプト生成すると
上記で書き換えた通りにコードが書き換えられていると思います。

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    namespace Common
    {
        /// <summary>
        /// 
        /// </summary>
        public class NewBehaviourScript : MonoBehaviour
        {
            #region 定数
    
            #endregion
    
            #region 変数
    
            #endregion
    
            #region プロパティ
    
            #endregion
    
            #region ライフサイクル
    
            void Awake()
            {
    
            }
    
            void Start()
            {
    
            }
    
            void Update()
            {
    
            }
    
            void LateUpdate()
            {
    
            }
    
            #endregion
    
        }
    }

おわりに
------
書き換えるだけでなくテンプレートを追加することもできます。
Ionic 4 で routerLink を使用して遷移する際、iOSでガタガタするときの解決法

## 前提
Angularベースの Ionic4 を使用してiOSアプリを構築していたとき、
RouterLinkを使用してページへ移動すると途中でアニメーションがガタっとなるという動作の不具合が出ました。

ガタっとなるというのを丁寧に説明すると、`routerDirection="forward"`で遷移する際、
iOSの場合、右側からページが出てくるようなアニメーションになると思いますが、
ページが右側から出てくる途中で一瞬止まって、次の瞬間にページが表示されるような挙動です。

解決方法を探して[本家のこちらのページ ([ionic-team/ionic] Animation on page transition on iOS is broken #17649 - Github  ) ](https://github.com/ionic-team/ionic/issues/17649)に行き着いたのですが、
iOSの問題ということで処理されいたので、仕方なく自己解決しました。

## バージョン
|||
|---|---|
|node|v12.8.0|
|@ionic/angular|4.9.0|
|@angular/router|8.1.3|

## 問題が起こっていた状況
```html:親ページ
    <ion-card *ngFor="let book of books" [routerLink]="['/main/child/', book.id]" >

        <!-- 省略 -->

    </ion-card>
```

```html:子ページ
<ion-header>
  <ion-toolbar>
    <ion-buttons slot="start">
      <ion-back-button defaultHref="/main" text=""></ion-back-button>
    </ion-buttons>
  </ion-toolbar>
</ion-header>

<ng-container *ngIf="observable$ | async as data">
  <ion-content>

        <!-- 省略 -->

  </ion-content>
</ng-container>
```

こんな状態で、親ページから子ページにrouterLinkにより遷移する際にガタついていました。

## 解決方法
いろいろ調べた結果、私の環境における問題は `ion-content` が **初期表示の段階で存在していないこと** でした。
なので、`ng-container` を `ion-content` の内側に持ってくると解決しました。

```html:子ページ解決後
<ion-header>
  <ion-toolbar>
    <ion-buttons slot="start">
      <ion-back-button defaultHref="/main" text=""></ion-back-button>
    </ion-buttons>
  </ion-toolbar>
</ion-header>

<ion-content> <!-- ここを変更しました -->
  <ng-container *ngIf="observable$ | async as data">

        <!-- 省略 -->

  </ng-container>
</ion-content>
```

`*ngIf="observable$ | async as data"`のように、if条件により後から表示する場合だけでなく、
そもそもページ上に `ion-content`が存在しない場合も同様にガタつくようです。
お気をつけくださいませ。

*※こちらはあくまでも私の環境での解決方法なので、もしかすると、別の原因で同様の現象が起こっている方もおられるかもしれません。参考までにご覧ください。*
【Rails】Usersリソース【Rails Tutorial 7章まとめ】

##Usersリソース
ユーザー情報をアプリケーション上で表示するために、RESTアーキテクチャに従って、データの作成、表示、更新、削除をリソースとして扱う。
これらに対応する４つの基本操作(POST、GET、PATCH、DELETE)を各アクションに割り当てていく。

何がなんだかよく分からないが...

\<id=1のユーザーを表示する場合>
URLは自動的に/users/1となる。
それに対してGETリクエストを送信すると、自動的にshowアクションが呼び出され、showビューが表示される。

みたいなことをRESTとやらが勝手にしてくれる、ということらしい。

細かいことは後で調べることにして、ルーティングに次のように書く。

```config/routes.rb
Rails.application.routes.draw do
  root 'static_pages#home'
  get  '/help',    to: 'static_pages#help'
  .
  .
  .
  resources :users
end
```
すると次のようなHTTPリクエスト、URL、アクション、名前付きルートの関係が自動で構築される。
<img width="712" alt="スクリーンショット 2019-11-28 1.19.03.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529443/70e08b4e-3448-ce41-ad09-bd9c54f54efa.jpeg">

ルーティングはこの通りに自動で設定されるので、各アクションやビューを手動で作ればOKである。

ユーザー情報を表示するshowアクションと仮のビューを作る。

```app/controllers/users_controller.rb
class UsersController < ApplicationController

  def show
    @user = User.find(params[:id])
  end

  def new
  end
end
```
```app/views/users/show.html.erb
<%= @user.name %>, <%= @user.email %>
```
これにより、/users/1にアクセスすると、params[:id]の:idに１が代入される。
findメソッドはid=1のユーザーをデータベースから探し、あれば@userに代入される。
@userのnameやemailは埋め込みRubyを使うことで、showビューで表示されるようになる。
【Rails】Gravatarによるプロフィール画像の表示【Rails Tutorial 7章まとめ】

##Gravatar
Gravatar（http://ja.gravatar.com/ ）は、メールアドレスとプロフィール画像を関連づけてくれるサービスである。

##Gravatarヘルパーメソッド
UserオブジェクトからGravatarに登録された画像を表示できるようにするため、gravatar_forヘルパーメソッドを作成する。

```app/helpers/users_helper.rb
module UsersHelper

  # 引数で与えられたユーザーのGravatar画像を返す
  def gravatar_for(user)
    gravatar_id = Digest::MD5::hexdigest(user.email.downcase)
    gravatar_url = "https://secure.gravatar.com/avatar/#{gravatar_id}"
    image_tag(gravatar_url, alt: user.name, class: "gravatar")
  end
end
```
内容の詳細は無視することにして、これをユーザー表示ビューで使用してみる。

```app/views/users/show.html.erb
<% provide(:title, @user.name) %>
<h1>
  <%= gravatar_for @user %>
  <%= @user.name %>
</h1>
```
/users/1にアクセスして、ちゃんと表示されているか確認する。
<img width="1179" alt="スクリーンショット 2019-11-28 2.00.26.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529443/59137a0d-69a6-25f5-45f3-9acf3b70bc55.jpeg">
プロフィール画像を設定したメールアドレスの場合
<img width="1167" alt="スクリーンショット 2019-11-28 2.02.52.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529443/d37efd3d-db03-08a5-341f-3241a19ea3c6.jpeg">

gravatarの画像は.gravatarというcssクラスが与えられている。

###サイズのオプション引数
次のようにすると、gravatar_for user, size: 50のようにサイズを指定して呼び出せる。

```app/helpers/users_helper.rb
module UsersHelper

  # 引数で与えられたユーザーのGravatar画像を返す
  def gravatar_for(user, size: 80)
    gravatar_id = Digest::MD5::hexdigest(user.email.downcase)
    gravatar_url = "https://secure.gravatar.com/avatar/#{gravatar_id}?s=#{size}"
    image_tag(gravatar_url, alt: user.name, class: "gravatar")
  end
end
```
3行目のURLも変更していることに注意する。
Vimのpopup_menu()のcallbackに追加で引数を渡したい

## はじめに
`popup_menu()`のコールバックに（globalに置くような無茶な渡し方などをせずに）上手く追加で値を受け渡す方法を探していて、一つ方法が見つかったのでそのシェアになります。

追記: コールバックの引数にwindowのidが渡されるので本来はwindowスコープの変数で上手く渡すのがいいみたいです。今回の記事はそれとは別でJSの無名関数チックなアプローチをしてみます。

## 自分が困ったケース
Vim scriptで選択肢のユーザーインターフェースといえば`inputlist()`があったと思いますが、最近の機能追加で`popup_menu()`が追加され、ポップアップメニューの中からユーザーに選ばせるという選択も増えました。

↓↓popup_menu()の例
![スクリーンショット 2019-11-28 1.57.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73446/3a2db224-d40b-9ca4-9807-851183ffd52b.png)


自分のプラグイン（[spelunker.vim](https://github.com/kamykn/spelunker.vim)）もこれまで`inputlist()`を使っていたのですが、今回新たに`popup_menu()`も利用できるように修正を行おうと思ったのですが、下記のような問題があり、これまでの`inputlist()`をそのまま置き換えるような修正はできなさそうでした。

### これまでのinputlist()の実装例
```vimscript
" ユーザーが選ぶ
function select(arg)
	let l:list = ['111', '222', '333']
	let l:selected = inputlist(l:list)
	" このあとl:selectedを使ってなんかする
endfunction
```

### popup_menu()を使う場合の実装例
```vimscript
function select(arg)
	" ユーザーが選ぶとコールバックが呼ばれる
	let l:list = ['111', '222', '333']
	call popup_menu(l:list, #{
			\ callback: 'callbackFunction',
			\ pos: 'topleft',
			\ line: 'cursor+1',
			\ col: 'cursor'
			\ })
endfunction

function calbackFunction(id, selected)
	" a:selectedを使ってなんかする
endfunction

```

ポップアップメニュー選択後、コールバックが呼び出されるようになります。
こうなってくると`select()`の関数内で持っている変数で(`a:arg`など)、このあとの処理でも使いたい変数はどうやって`calbackFunction()`に受け渡せばいいのか...などなど、これは設計にも影響してきそうです。

### コールバックに追加で引数を渡す
こちらの記事のクロージャの項目の内容的なアプローチを取ってみます。
https://vim-jp.org/vim-users-jp/2010/08/13/Hack-167.html

```vimscript
" argをコールバックに渡したい！
function s:select(arg)
	" 記事中のクロージャの項目の内容的なアプローチ
	" https://vim-jp.org/vim-users-jp/2010/08/13/Hack-167.html
	let l:callback = {'arg': a:arg}
	function l:callback.funcall(id, selected) dict
		call Popup_callback(a:id, a:selected, self.arg)
	endfunction

	let l:list = ['111', '222', '333']
	call popup_menu(l:list, #{
				\ callback: l:callback.funcall,
				\ pos: 'topleft',
				\ line: 'cursor+1',
				\ col: 'cursor'
				\ })
endfunction

function Popup_callback(id, selected, arg)
	" ここでもs:select()のarg(a:arg)を使える！
endfunction
```

引数が上手く追加できましたね。
また、これは簡単にするとこうにもなります。

```vimscript
function s:select(arg)
	let l:callback = {'arg': a:arg}
	function l:callback.funcall(id, selected) dict
		" callbackとしてやりたかった内容をここに移動します
		" self.argもa:id, a:selectedも使えます
	endfunction

	let l:list = ['111', '222', '333']
	call popup_menu(l:list, #{
				\ callback: l:callback.funcall,
				\ pos: 'topleft',
				\ line: 'cursor+1',
				\ col: 'cursor'
				\ })
endfunction
```

最後の2つの書き方は好みや目的によって使い分け程度の話だと思います。共通化やコールバック関数のテストをしたければ前者ですし、簡潔さを求めるなら後者、のような。

これで一応、`popup_menu()`の呼び出し元のスコープにある変数の受け渡しができました🙌
Google App Engine Standard Environment で berglas を使う

# GAE SE での berglas の使い方

gcloud app deploy コマンドでデプロイをするとカレントディレクトリ以下のファイルが全て GAE に転送されるので、あらかじめ berglas のバイナリをダウンロードしておいて、gcloud app deploy すればよい。

```bash
curl -o ./berglas https://storage.googleapis.com/berglas/master/linux_amd64/berglas
chmod a+x berglas
gcloud app deploy
```

GAE SE の環境は linux x86_64 なので `linux_amd64` をダウンロードすれば良い (補足: entrypoint に uname -a コマンドなどを書いてデプロイしてみて環境情報を調べた)

これで app.yaml の entrypoint で `./berglas exec --` のように使えるようになる。

```yaml
runtime: nodejs10
entrypoint: ./berglas exec -- npm start
env_variables:
  NODE_ENV: 'production'
  DB_USERNAME: berglas://{BUCKET_ID}/db-username
  DB_PASSWORD: berglas://{BUCKET_ID}/db-password
```

# おまけ: Java アプリの場合

`mvn appengine:deploy` でデプロイするとビルド && ステージング && デプロイまで一気に実行される。余計なファイルは消されてしまうので berglas をおく隙がない。

`mvn appengine:stage` でビルド && ステージングまでしておいて、berglas を配置して、`gcloud app deploy` でデプロイすれば良い。

```bash
mvn clean package appengine:stage
cd target/appengine-staging
curl -o ./berglas https://storage.googleapis.com/berglas/master/linux_amd64/berglas
chmod a+x berglas
gcloud app deploy
```
SlackからPythonサーバーにメッセージを送信する

# 概要
slcakボットを作成し、slackからのメッセージをサーバーに送信する。
slackへサーバーからメッセージを送信するのは --> [「Slackにpythonからメッセージを送信する」](https://qiita.com/stu345/items/24790710abc571aae3ea)

# やること

#1 サーバーの用意
slackからアクセスするサーバを用意する。
[url_verification event](https://api.slack.com/events/url_verification)を参考に条件を満たす必要がある。
## pythonコードサンプル
```python
import flask
from flask import request, Response
import os
import json

app = flask.Flask(__name__)


@app.route('/', methods=["POST"])
def index():
    data = request.data.decode('utf-8')
    data = json.loads(data)
    # for challenge of slack api
    if 'challenge' in data:
        token = str(data['challenge'])
        return Response(token, mimetype='text/plane')
    # for events which you added
    if 'event' in data:
        print("get event")
        event = data['event']
        if 'user' in event:
            print("user = ", event["user"])
        if "text" in event:
            print("text = ", event["text"])
    return Response("nothing", mimetype='text/plane')


port = os.getenv('VCAP_APP_PORT', '8000')


if __name__ == '__main__':
    app.run(host='0.0.0.0', port=int(port), debug=True)
```

#2 slack app の作成
##2.1 [slack api](https://api.slack.com/apps) にアクセス。
##2.2 appの作成
「Create New App」を押下。
アプリ名とワークスペースを選択しappを作成。
##2.3 Enable EventsをONにする
[Event Subscriptions]のページで、[Enable Events]を"ON"にする
<img width="1136" alt="スクリーンショット 2019-11-27 22.10.54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479931/16aacb27-d5d4-c524-4af8-6784725134f8.png">
##2.4 Request URLを指定
[1](#1-サーバーの用意) で用意したサーバーのurlを指定する。

##2.5 workspace eventの設定
Subscribe to workspace eventsで「Add Workspace Event」からworkspace eventを選択する。
今回はチャンネルのメッセージを取得する message.channelsを選択する。
他のイベントは[API Event Types](https://api.slack.com/events)で調べられる。

<img width="745" alt="スクリーンショット 2019-11-28 0.47.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479931/aa2bbabc-2921-ee0f-7357-da687355383c.png">

#3 slack appをworkspaceにインストール
#3.1 workspaceにインストール
<img width="1030" alt="スクリーンショット 2019-11-28 0.54.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479931/d00949dd-0d43-3f91-fabf-e1f547a5bbce.png">
「Install App to Workspace」からインストールする。
#3.2 チャンネルにアプリを追加
アプリを追加したいslackのチャンネル-->設定-->アプリを追加する

# 参考
1. [Slack Botの種類と大まかな作り方](https://qiita.com/namutaka/items/233a83100c94af033575#bot-users-event-api%E5%88%A9%E7%94%A8)
2. [Events API](https://api.slack.com/events-api)
3. [url_verification event](https://api.slack.com/events/url_verification)
4. [API Event Types](https://api.slack.com/events)
5. [Slackにpythonからメッセージを送信する](https://qiita.com/stu345/items/24790710abc571aae3ea)

# 終わりに
slackのチャンネルからのメッセージをサーバで受信することができた！
なんでもできそう。
一度challengeを通過すれば、その後にサーバーを止めても、また起動すれば大丈夫。
Objective-C Bridging Headerファイルを編集したら大量のビルドエラーが出る時の対処

# なにが起きたか
Objective-C Bridging Headerファイル（`Objective-C-Bridging-Header.h`とか）を編集した後にビルドしたら大量のビルドエラーが発生した:innocent:
![Objective-C_Bridge_Header_Change.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297266/ed3687da-8e7f-35cb-3010-58238e746c61.png)

# 対処
- エラーが出てるファイルに`import UIKit` を追記する
  無理でしょ…

- Objective-C Bridging Headerファイルに`#import <UIKit/UIKit.h>`を追記する
※ `NSObject`などのエラーが出ている場合は `#import <Foundation/Foundation.h>`を追記する

# 参考
https://stackoverflow.com/questions/26116288/failed-to-import-bridging-header
UIKitとかFoundationがなくても、ライブラリが機能するようにということらしい。
Pythonでscikit-learnがinstallできない

# 環境
Python3.8.0

# 概要
ざっと見た感じ

```
No module named 'Cython'
```

これと、あとNumpyを先に入れていたせいでバージョンの依存関係でエラーが出たっぽい。

ので

# 解決策

```
pip3 install Cython
pip3 install -U scikit-learn
```

-Uつけるとすでに入っているライブラリとの依存関係をいい感じにしてくれるっぽい？？

# 参考文献
https://scikit-learn.org/stable/install.html
Spacemacs dotfilesの構成

# Spacemacsは良いぞ
開発者の皆さんはVSCode，Vim，Emacs，TeraPadなどのエディタを使って普段の開発を進めているかと思います．IDE? 知らない子ですねぇ……
その選択肢に，Spacemacsはいかがでしょう？

Vim + Emacs = Spacemacs なんて言われますが，Vimのコマンドキー，あるいはEmacsのM-xライクなSpaceを導入することで愉快な感じに仕上げてくれています．まあ，こんな記事を読む方々は私以上にこのあたりに詳しいかと思うのでVimの操作性＋Emacsの自由な拡張性を持つエディタ（Emacsの設定集と考えるべきでは？）と思っていただければ良いかと．
# .spacemacsとは
拡張性を持つということは何らかの方法で設定を行う必要があります．
Spacemacsの設定はテキストファイルです．当然のことながらEmacsと同様に設定はEmacs Lispです．設定と言いつつプログラムなのでとても自由です．最近流行りのVSCodeなんかはGUIでもろもろ設定できるんですかね（知らない）．

設定ファイルは大抵（私調べ）デフォルトの配置があります．.sshであれば~/.ssh，であるように，Spacemacsの設定は~/.spacemacsです．
# .spacemacs.d とその構成
でもちょっと待ってください．単一のファイルだけで設定を完結させることってそんなに簡単じゃないですよね？
そんなときに便利なのが~/.spacemacs.dという名前でディレクトリを作成しその中に設定をまとめることです．
~/.spacemacsだったファイルは.spacemacs.d/init.elに変更しましょう．

参考までに，私の構成を以下に挙げます．
```
~/.spacemacs.d/
├── layers # 自作レイヤー
├── org-latex-classes # Org-ModeからLaTeXへの変換テンプレート
├── snippets # Yasnippetの追加スニペットファイル
└── templates # Yatemplateのテンプレートファイル
```

こうするとSpacemacsに関する設定が全て一つのディレクトリにまとまるのでgit管理がしやすいという利点が生まれます．便利．
便利を味わうためには

``` elisp
;; In dotspacemacs/additional-layers
(templates :variables
                templates-private-directory "~/.spacemacs.d/templates")
;; In dotspacemacs/user-config
  (add-to-list 'yas-snippet-dirs "~/.spacemacs.d/snippets")

```
のようにプラグインごとにディレクトリ名称を指定する必要が合ったりしますが．
[React]説明がいらないReact＋TypeScript開発環境設定（CRA無し）

## Install
```console
yarn init --yes
yarn add next react react-dom
yarn add @zeit/next-typescript @types/next @types/react @zeit/next-typescript @types/next @types/react
```

## ファイル追加
```js
// next.config.js
const withTypescript = require('@zeit/next-typescript')
module.exports = withTypescript()
```
```json
//.babelrc
{
  "presets": ["next/babel", "@zeit/next-typescript/babel"]
}
```
```json
//tsconfig.json
{
  "compilerOptions": {
    "allowJs": true,
    "allowSyntheticDefaultImports": true,
    "jsx": "preserve",
    "lib": ["dom", "es2017"],
    "module": "esnext",
    "moduleResolution": "node",
    "noEmit": true,
    "noUnusedLocals": true,
    "noUnusedParameters": true,
    "preserveConstEnums": true,
    "removeComments": false,
    "skipLibCheck": true,
    "sourceMap": true,
    "strict": true,
    "target": "esnext"
  }
}
```

## eslint setting

```console
npm i eslint -D
npm i @typescript-eslint/parser -D
npm i @typescript-eslint/eslint-plugin -D
npx eslint --init
```


```js
//.eslintrc.js
module.exports = {
    "env": {
        "browser": true,
        "es6": true,
        "node": true
    },
    "extends": [
        "eslint:recommended",
        "plugin:react/recommended"
    ],
    "globals": {
        "Atomics": "readonly",
        "SharedArrayBuffer": "readonly"
    },
    "parserOptions": {
        project: './tsconfig.json',   //추가
        "ecmaFeatures": {
            "jsx": true
        },
        "ecmaVersion": 2018,
        "sourceType": "module"
    },
    "plugins": [
        "react"
    ],
    "rules": {}
};
```

## package.json 

```json
  "scripts": {
    "dev": "next",
    "build": "next build",
    "start": "next start"
  }
```

## pages/index.tsx 追加
```tsx
import React from "react";

export default () => {
  return <div>hello</div>;
};
```
```
yarn add --dev typescript @types/node
```
[ehcache2]オンメモリだけで利用する（ディスクストアを無効化）

# 背景と問題点

ehcache2(2.10.4)を初めて使ったのですが、デフォルトの設定が「ディスク保存有効」になっていてちょっとはまりました。

何か問題かというか、この設定が有効の場合、オブジェクトがシリアル化可能（Serializable）でない場合は、キャッシュに失敗します。失敗しても、実行時例外は送出されず、適切なログ出力設定をしていないとログも出力されないので何がおきているのか理解するまでに時間を要しました。

[ehcacheのログ出力設定はこちら](https://qiita.com/s-katsumata/items/79b8d4a240b7dd8efc3f)

# 対策
今回のユースケースではオンメモリキャッシュが使えればよく、ディスク保存は不要（メモリが不足したら所定のルール～既定はLRU～で廃棄）なので、ディスク保存を無効化したかったのですが、若干手間取りました。

## 無効化手順
公式ドキュメント([Ehcache -  Turning off DiskStores)](https://www.ehcache.org/documentation/2.8/get-started/storage-options.html#diskstore-)では、「コメント化すればOK（` comment out the diskStore element in ehcache.xml.`）」と書いてあるので、ehcache.xmlに記載していた`<diskStore>`要素の定義を削除しました。

が、これだとデフォルトの設定（＝diskStore有効）が効いてしまいます。

結局、`path`属性を空にすることで意図した結果（シリアル化できないオブジェクトのキャッシュ可能）が得られました。

```xml:ehcache.xml
<?xml version="1.0" encoding="UTF-8"?>
<ehcache>
  <diskStore path=""/>
</ehcache>
```
Microsoft SQL Serverのロックの仕組みについて

#Microsoft SQL Serverのロックの仕組みについて
最近仕事でMicrosoftのRDBMS（データベース管理システム）である、SQL Serverを使っているのですが、ロックの仕組みについて個人的にはかなり驚くことがありましたのでメモ程度でまとめます。

##結論
SQL Serverではデフォルトで、あるトランザクションAがUPDATE/DELETEなどで更新中の場合、別のあるトランザクションBはその更新中のデータに対してSELECTするとロック開放待ちになります。つまり、トランザクションAを開放（COMMIT or ROLLBACK）しないとトランザクションBは永遠と待ち続け、結果が返ってきません（タイムアウトを設定していたらそれまで）。

別のRDBMSであるOracleだったりすると、この挙動はなくて更新前のデータをすんなり返してくれるので少し驚くような挙動でした。簡単に以下で確認していきます。

##環境
今回確認テストする環境は以下の通りです（全体的にちょっと古い・・・）。
・MicroSoft SQL Server 2016 Express（無料なので）
・MicroSoft SQL Management Server 2016（こちらも無料）※以後、SSMSと呼称

・OSはWindows8

windows8にSQL Serverをインストールしてローカルで確認していきたいと思います。

##サンプルテーブル
あらかじめ、`sampleDB`という名前でデータベースを作成します（特別な設定はなにもしていないもの）。そして、サンプルで使用するテーブル`t1`は以下のようなカラムおよびデータをもっているものです（データ型とかは今回の話には関係ないので言及しません）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148996/07fa2792-b2d3-5c85-302c-1837af1a9278.png)

##レコードをロックする
ロックの確認を行うために、以下のような明示的トランザクションの定義`BEGIN TRAN`を宣言し、UPDATE文で任意のレコードを更新します。
SQL Serverでは、更新系のステートメントを実行すると占有ロック（排他ロック）がかかるようです。そして、ロックの開放（COMMIT OR ROLLBACK）はしないで、ロックされたまま次に行きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148996/801a47c5-84ba-c9e8-a6c8-fa16cd2d141f.png)

##レコードのロックを確認する
上記でUPDATE文により、ロックをしている状態なのでSSMSで別のSQLシートを開いて、該当のレコードに対してSELECTしてみましょう。特にオプションなども付与していない、普通の検索するSQLクエリです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148996/2337d97d-92d2-e40d-e361-f51688a9d9c2.png)

おや？？？ちょっとわかりづらいですが、上記画面キャプチャの下部に表示されているメッセージの通り、`クエリを実行しています...`がずーっと表示されたままになっています。レコードは数件しかないので、帰ってきていないのは性能が悪いのではなくロックされているだなと推測できます。
※本当はロックされているレコード、しているレコードは調査できるのですが別の機会に譲ることにします。

#さいごに
上記で見てきたように、SQL Serverでは排他ロックがかかったレコードに対してSELECTクエリをなげるとロックの開放待ちをしてしまいます。
ただ参照したいだけである場合は、無駄なロック待ちが発生することになるので同時利用の効率が下がることになります。

本記事のはじめのほうでも言及していましたが、Oracleでは上記で同じように操作してもロック開放待ちはしないで更新前レコードを検索してダーティーリード（確定していない更新中のデータを読み取ってしまう問題のこと）防ぐことができます。

上記のどちらかがいいのかは、そのシステムの業務の話なので一概には言えません。が、SQL Serverのデフォルトはロック待ちするので本来はこちらが望ましいのかもしれません。

今度は、SQL ServerでOracleと同じような`読み取り一貫性`の挙動ををする設定をしてみたいと思います。
ARCとDisposeOfについて

# 追記 2023/12/17
[DisposeOf について](#disposeof-について)で指摘していたとおり、Delphi 12 Athens で DisposeOf が deprecated になりました。

# ARC廃止

Delphi 10.3 Rio のリリース時にコンパイラの ARC 対応を順次廃止するとアナウンスされました。
ARC廃止というのは重大な変更にもかかわらず、実は多くのユーザーが書いたコードには影響が少ないと思われます。
では、そもそも ARC とは何だったのでしょうか？

# ARCとは
Automatic Reference Counting の頭文字をとったものです。
日本語では、自動参照カウント（方式のメモリ管理）と言われます。

例えば次のコードを ARC ありと ARC 無しで書いてみます。

```pascal:ARCあり
procedure Foo;
var
  Bar: TBar;
begin
  Bar := TBar.Create;
  Bar.Baz;
end; // スコープを抜けるとき自動的に削除
```

```pascal:ARCなし
procedure Foo;
var
  Bar: TBar;
begin
  Bar := TBar.Create;
  try
    Bar.Baz;
  finally
    Bar.DisposeOf; // 自分で削除を指示
  end;
end;
```

Delphi 3 の COM 対応で実装された自動参照カウント方式のメモリ管理にかなり近い物です。
ただ、違いは全てのオブジェクトが参照カウントで自動的に破棄されるという事です。
(他にも Weak 属性や RefCount プロパティなどいくつか違いがあります）

ただし、ARC 有りの環境だったとしても、ARC 無しのコード（自分で破棄を指示する）は有効です。
つまり、常に ARC 無しのコードのように書いていた場合は影響がありません！

# DisposeOf について
DisposeOf は ARC の導入時に導入されたメソッドで、従来の Free に変わる物でした。
このメソッドは ARC の有り無しで挙動が異なります。

| ARC  | 実行される内容               |
|------|-----------------------------|
| あり | 参照カウントの調査・破棄の指示 |
| なし | Free を呼ぶ                  |

つまり、DisposeOf を使っておけば、ARC でも非 ARC でも正しい破棄手順になります。

### Free と DisposeOf の違い
ARC 有効時の DisposeOf は破棄を「指示」するだけで実際のメモリ解放はしません。
一方 Free は呼び出すと直ぐにデストラクタを呼び出しメモリを解放します。
ARC 有効時の DisposeOf によって破棄を指示されたオブジェクトは、適切なタイミング（例えばメソッドから抜ける時）でメモリが解放されます。

### 影響を受けない書き方

Delphi ユーザーにおなじみの

```pascal
A := TA.Create;
try
  // なにか処理
finally
  A.DisposeOf;
end;
```

`try~finally~end` パターンを使って書いていれば ARC 廃止の影響は受けません！

とはいえ、将来 ARC 廃止時に DisposeOf が deprecated になる可能性はあります。

# TInterfacedObject は心配無用

[IInterface](http://docwiki.embarcadero.com/Libraries/Rio/ja/System.IInterface) は、Delphi のインターフェースの基底インターフェースです。
このクラスが [QueryInterface](http://docwiki.embarcadero.com/Libraries/Rio/ja/System.IInterface.QueryInterface) と、[_AddRef](http://docwiki.embarcadero.com/Libraries/Rio/ja/System.IInterface._AddRef), [_Release](http://docwiki.embarcadero.com/Libraries/Rio/ja/System.IInterface._Release) を定義しています。
これらを実装したクラスが [TInterfacedObject](http://docwiki.embarcadero.com/Libraries/Rio/ja/System.TInterfacedObject) です。

TInterfacedObject （IInterface を実装したクラス）を使うと IInterface で導入された _AddRef, _Release をコンパイラが自動的に呼び出すコードを生成します。
そして、この機能は **ARC の廃止に関係なく存続**します。

Android や iOS の API は全てインターフェースで提供されていますが、基底クラスが TInterfacedObject を継承しているので、これからも特に問題無く動作します。

ARC 廃止で TInterfacedObject によるオブジェクトの管理も廃止されるのかと勘違いした人達がパニックに陥っていましたが、それはありません。

# まとめ
言語機能根幹のドラスティックな変更になりますが、従来の `try~finally~end` による破棄パターンを使っていれば、大きな影響は受けないでしょう。
【Rails】デバッグ情報の表示【Rails Tutorial 7章まとめ】

##debugメソッド
アプリケーションの動作を確認するために、debugメソッドを使ってサイトのレイアウトにデバッグ情報を表示する。

```app/views/layouts/application.html.erb
  <body>
    <div>
      .
      .
      .
      <%= render 'layouts/footer' %>
      <%= debug(params) if Rails.env.development? %>
    </div>
  </body>
```

```
if Rails.env.development?
```
とすると、開発環境でのみデバッグ情報を表示できる。
debug(params)から生成されたhtmlには、.debug_dumpというbootstrap用のcssクラスが与えられているようである。

##byebugジェムとdebugger
byebugジェムと、それによって使用できるようになるdebuggerメソッドを使うと、アプリケーションの任意の位置でその状態を確認できるようになる。

byebugジェムを導入する。

```Gemfile.rb
group :development, :test do
  gem 'sqlite3', '1.3.13'
  gem 'byebug',  '9.0.6', platform: :mri
end
```
debuggerをアプリケーションの任意の位置に挿入する。

```app/controllers/users_controller.rb
  def show
    @user = User.find(params[:id])
    debugger
  end
```
/users/1にアクセスすると、rails serverを立ち上げたコンソールにbyebugプロントが表示される。

```
(byebug)
```
Railsコンソールのようにコマンドを呼び出せる。

```
(byebug) @user.name
"Example User"
(byebug) @user.email
"example@railstutorial.org"
(byebug) params[:id]
"1"
```
用が済んだらCtrl+Dで終了し、debuggerメソッドを削除しておく。