OmniAICreator/Qiita-1.07M huggingface dataset:
おすすめIDE

## この内容について
この内容は、私が運営しているサイトから一部引用もあります。
他にもおすすめのテキストエディタなども一覧にしていますので、よければそちらもご活用ください。
[おすすめテキストエディタ&IDE | コレワカ](https://korenarawakaru.com/tech/editor/editor-ide)

## IDEとは
Integrated development environmentの略で、統合開発環境ともいう。
コーディング・コンパイル・ビルド・デバッグなど開発に必要な全ての機能を兼ね備えたツール。

## IDEの選び方
### なるべく無料であるか
無料で配布されているものであれば、チームで使う時や個人で行う時の固定費がなく精神的に良いです。
しかしながら、有料のものを気に入った場合にはそちらを使うべきでしょう。

### 言語が対応しているか
IDEは基本的に何かの言語に特化している、あるいはその言語の開発には
それを使うしかないといった場合があります。

## おすすめIDE

### [Eclipse](https://www.eclipse.org/)
<img width="1792" alt="Eclipse.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473780/7f88ed57-7535-619d-16bc-5e8cb1f3b71b.png">
#### 特徴

- 標準でJavaの開発環境
- プラグインが豊富

#### 評価
Javaアプリ開発をする時に使用する事が多いIDEです。(現場では大体これを使用します)
プロも使用するので、Javaをやるならこれを使っていれば間違いないでしょう。

### [Visual Studio](https://visualstudio.microsoft.com/ja/?rr=https%3A%2F%2Fwww.google.com%2F)
<img width="1792" alt="VisualStudio.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473780/9255b566-9b65-ae9a-1d0c-cb979813cf34.png">
#### 特徴

- 拡張機能が豊富
- セキュリティ性が高い

#### 評価
Java以外の言語での開発で迷ったらこちらを使います。あらゆる言語に対応できるIDEです。
最近では、テキストエディタのVSCodeがかなり高性能・高機能となっており、そちらでの開発もあり。

### [Xcode](https://developer.apple.com/jp/xcode/)
<img width="1792" alt="Xcode.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473780/3bda8e55-daca-5042-01ff-6ceee2d44ce1.png">
#### 特徴

- アプリUIの部品が用意されている
- テストが簡単
- Simulator機能
- iOSアプリのリリース

#### 評価
iOSアプリ開発には、必須のIDEです。
iOSアプリを他のIDEで開発をしていたとしても、このXcodeの
Simulator機能やリリース作業には必ず使うことになります。

### [Android Studio](https://developer.android.com/studio/)
<img width="1792" alt="AndroidStudio.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473780/4bfb17a1-d5f7-f6b6-9c30-945d5daa8959.png">
#### 特徴

- ビルドシステム内臓
- 多様なテストツール
- Emulator機能

#### 評価
Androidアプリ開発には、必須のIDEです。
Androidアプリを他のIDEで開発をしていたとしても、
このAndroid StudioのEmulatorは必ず使うことになります。

## まとめ
今回おすすめしたIDEをまとめると下記の通りです。

| IDE | 特徴 | おすすめしたい人 |
|:----------|:----------|:----------|
| Eclipse | 標準でJavaの開発環境・プラグインが豊富 | Java開発をする人 |
| Visual Studio | 拡張機能が豊富 | Java以外の開発をする人 |
| Xcode | Simulator機能・iOSアプリリリース | iOSアプリ開発をする人 |
| Android Studio | ビルドシステム・Emulator機能 | Androidアプリ開発をする人 |


## この内容について
この内容は、私が運営しているサイトから一部引用もあります。
他にもおすすめのテキストエディタなども一覧にしていますので、よければそちらもご活用ください。
[おすすめテキストエディタ&IDE | コレワカ](https://korenarawakaru.com/tech/editor/editor-ide)
■【Google Colaboratory】 Preprocessing of Natural Language Processing & 形態素解析(janome)

#1. Read Data by "with open" method

青空文庫の  [**芥川龍之介の"鼻"**](https://www.aozora.gr.jp/cards/000879/card42.html) を読み込んでみる
ファイルの文字コードは、**shift_jis**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626074/3bf65da8-a7bb-a89d-be91-521dfd6f521c.png)


```py
# Pythonでのtext fileの読み書き（入出力）
with open('/hana.txt', mode='r', encoding='shift_jis') as f: 
  nose_hana = f.read()

print(nose_hana)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626074/9a622d37-dfed-977f-caf3-3230dfc948ab.png)

#2. Preprocessing of "HANA"
```py
#データの前処理
import re
import pickle

nose = re.sub('《[^》]+》', '', nose_hana)    # ルビを削除する
nose = re.sub('[|―  「」\n]', '', nose)      # |― と全角スペース、「」と改行の削除
nose = re.sub('[ ]', '', nose)                #半角スペース削除
nose = re.sub('[\u3000]', '', nose)           #\u3000削除

sentense_end = '。'

nose_list = nose.split(sentense_end)
nose_list.pop()
nose_list = [x+sentense_end for x in nose_list]

print(nose_list)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626074/5cf93c43-ab05-13ec-2f5f-96bd3d5d3b14.png)


#3. WAKATI "分かち書き"

```py
from janome import tokenizer

s = Tokenizer()

t = nose_list

for _ in nose_list:
  print(s.tokenize(_, wakati=True))
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626074/82501f54-5c30-f1c6-3904-6857d267cdd9.png)

#4. Analysis of results of "WAKATI"

```py
# collectionsで、出現頻度をカウントすることができる
import collections

s = Tokenizer() # インスタンス化
words = []
for _ in nose_list:
  words += s.tokenize(_, wakati=True)

c = collections.Counter(words)
print(c)
```

# Reference

>1. [形態素解析ツール(janome)のインストール](https://qiita.com/O-Mik/items/7e45d03115497b3beb11)
vim マウスボタンでのコピーペースト(あと defaults.vim とか)

# vimでマウスホイールボタンクリックした時に意図しないものがペーストされる ついでに`~/.vimrc`とか`defaults.vim`の読み込み順とか
linux:ubuntuあたりでの話です。urxvtとかで。ブラウザ上とか他ターミナルとかで選択したものをペーストするつもりがvim的クリップボードからペーストされているご様子。

# 結論: shift + クリック で外部クリップボードからpaste

らしい。

もとい。

CUIでもマウスな事が出来るような感じらしい。
それは良いけど慣れた動作は欲しい...

~/vimrcにset mouse-=aとかすると良いとかある。
`/etc/vim/vimrc.local`
とかに記述すると何か意図しない動作。
値の確認はおしりに?をつける
`:set mouse?`

```vim:
mouse=
```
になってればマウス機能offらしい。

```vim:
mouse=a
```
あれー?ちなみにvとかrとかあるご様子。

### vimrcの読み込み順序
vim起動して
`:scriptnames`
で確認

```vim:
  1: /usr/share/vim/vimrc
  2: /usr/share/vim/vim81/debian.vim
  3: /etc/vim/vimrc.local
  4: /usr/share/vim/vim81/syntax/syntax.vim
  5: /usr/share/vim/vim81/syntax/synload.vim
  6: /usr/share/vim/vim81/syntax/syncolor.vim
  7: /usr/share/vim/vim81/filetype.vim
  8: /usr/share/vim/vim81/colors/slate.vim
  9: /usr/share/vim/vim81/defaults.vim
 10: /usr/share/vim/vim81/syntax/nosyntax.vim
 11: /usr/share/vim/vim81/ftplugin.vim
 12: /usr/share/vim/vim81/indent.vim
 13: /usr/share/vim/vim81/plugin/getscriptPlugin.vim
 14: /usr/share/vim/vim81/plugin/gzip.vim
 15: /usr/share/vim/vim81/plugin/logiPat.vim
 16: /usr/share/vim/vim81/plugin/manpager.vim
 17: /usr/share/vim/vim81/plugin/matchparen.vim
 18: /usr/share/vim/vim81/plugin/netrwPlugin.vim
 19: /usr/share/vim/vim81/plugin/rrhelper.vim
 20: /usr/share/vim/vim81/plugin/spellfile.vim
 21: /usr/share/vim/vim81/plugin/tarPlugin.vim
 22: /usr/share/vim/vim81/plugin/tohtml.vim
 23: /usr/share/vim/vim81/plugin/vimballPlugin.vim
 24: /usr/share/vim/vim81/plugin/zipPlugin.vim
```

`/etc/vim/vimrc.local`の後に`/usr/share/vim/vim81/defaults.vim`があるのでmouseとか上書かれてるっぽい。

詳細:(ありがとございます)
https://qiita.com/thinca/items/9a42ef9047d44a765bdd

### `~/.vimrc`の存在によって動作が変わる
 
カンベンしてください...:microscope:

とりあえず

```sh:~/.vimrc
source $VIMRUNTIME/defaults.vim
set mouse-=a
```
としています。

CUIでマウスクリックしてそこにカーソルが移動するのが是なのか非なのかで分かれ道なのでしょうか。
スプレッドシートのリストからランダムで選んでSlackに投稿する積ん読BOT

# 共有の積ん読リストから1冊ピックアップしてSlackに投げる、積ん読BOTを作る！
スプレッドシートにメモした積ん読リストの中から、週に一度、一冊ピックアップして情報を投げるアプリを作成しました。


![IMG_1731.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480279/f6a10c60-dd80-09cd-cf2c-0f531aae51b5.jpeg)


<img width="502" alt="スクリーンショット 2020-05-19 23.34.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480279/9c5dacda-ed62-2462-e300-c277e50ec71c.png">

Slackに投げることで、チーム内で感想を言い合うなどコミュニケーションの活性化も狙えます。

## 1. スプレッドシートを作る
今回は、下記のような構造のデータを作成しました。
1列目: タイトル
2列目: 著者
3列目: 概要
4列目: 読むポイント
5列目: AmazonのURL

※行: 三 、列： |||

## 2. SlackのIncoming Web hookでBOTを作成
Slack botを作成して、チャンネルに招待し、Web hook URLを控えてください。
やり方は、[GoogleフォームとSlackとメールをGASで連携する【後編 フォームで入力された内容をIncoming Web Hookを使ってSlackで通知する】](https://qiita.com/kisaichi07/items/58307e75ec5d627290dd)を参考にしてください。

## 3. GASを書く

```javascript:GAS
function doPost() {

  var sheet = SpreadsheetApp.openById("スプレッドシートのID").getSheetByName('タブ名');
  var data = sheet.getDataRange().getValues(); //スプレッドシートのオブジェクトからデータを配列で取得します。
  var pickedNum = Math.floor(Math.random() * Math.floor(data.length));
  
  var text = "*今週のおすすめ図書は「" +data[pickedNum][0] +'」！！ *\n'+
    "■著者: "+ data[pickedNum][1] + "\n" +
    "■概要: \n"+ data[pickedNum][2] + "\n" +
    "■読むポイント: \n"+ data[pickedNum][3] + "\n" +
    "■Amazonリンク: \n"+ data[pickedNum][4] + "\n";
  
  var options = {
    method: 'post',
    contentType: 'application/json',
    payload: '{"text":"'+text+'"}'
  };
 
  UrlFetchApp.fetch("YOUR WEB HOOK URL", options);
  
}

```

### 変更する場所
- スプレッドシートのID: スプレッドシートのURLに含まれています。
`https://docs.google.com/spreadsheets/d/【ここの数字とアルファベットの羅列がID】 /edit#gid=0`
- タブ名: タブの名前を入れる
- YOUR WEB HOOK URL: 
「2. SlackのIncoming Web hookでBOTを作成」で控えたURLを入れる

### 許可をする
一度再生アイコンを押し、アプリを許可してください。
これで、Salckに通知が飛べば成功です！

### 補足情報
#### getDataRange().getValues()について

getDataRange().getValues()は、配列でデータをまるっと取得します。

たとえばこのようなスプレッドシートがあった場合
<img width="356" alt="スクリーンショット 2020-05-20 12.11.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480279/4416f51f-3cb4-5605-8c94-bea78b342345.png">

```javascript
var data = sheet.getDataRange().getValues();
```

`data` の中身はこのようになります。

```javascript:data
[
[タイトル1,著者１,概要1],
[タイトル2,著者2,概要2],
[タイトル3,著者3,概要3],
]
```

そのため、data[行][列]で、特定のセルのデータを取得できます。

## 5. トリガーを作成
イベントのソースを時間主導型にして、発火させたい日時を指定してください。
今回は、週に1度お知らせして欲しいため、週ベースのタイマー/水曜日/9:00-10:00を選択しています。
<img width="723" alt="スクリーンショット 2020-05-19 23.21.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480279/f633510c-3cbe-f56c-a1ab-a8119d239605.png">

# 完成！
これで、トリガーがきちんと動作すれば成功となります！
IE11縦書きが中心揃わない

ワークプレスのテンプレートを使って縦書きをカスタムCSSでやってますがなぜかIE11は中心揃えできません。
![not-centered.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640925/6c311d43-ebfb-fe37-19ed-216e007130d5.jpeg)
サイトはこちらです：https://eiken-net.com/construction-examples/
施工事例の下にスクロールして頂くと上記の画像に移っているところがあります。
Docker ComposeでWordpressを起動してみた

docker-compose.ymlを作るだけだった。。。
[ファイルリファレンス](https://docs.docker.com/compose/compose-file/)

```yaml:docker-compose.yml
version: '3.8'

services:
  db:
    image: mysql:5.7
    volumes:
      - db_data:/var/lib/mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: somewordpress
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: wordpress

  wordpress:
    depends_on:
      - db
    image: wordpress:latest
    ports:
      - "8000:80"
    volumes:
      - ./html:/var/www/html
    restart: always
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_USER: wordpress
      WORDPRESS_DB_PASSWORD: wordpress
      WORDPRESS_DB_NAME: wordpress
volumes:
  db_data: {}
```

# docker-composeコマンド

docker-compose.ymlを作成したディレクトリで実行する。
[コマンドリファレンス](https://docs.docker.com/compose/reference/)

## 作成と起動

コンテナの作成と起動。

```sh
$ docker-compose up -d
```

ブラウザで`http://localhost:8000`を開く

## 停止

コンテナの停止。（削除しない）

```sh
$ docker-compose stop
```

## 起動

停止しているdbとwordpressコンテナを起動。

```sh
$ docker-compose start db wordpress
```

ブラウザで`http://localhost:8000/wp-admin`を開く

## 停止と削除

コンテナの停止と削除。

```sh
$ docker-compose down --volumes
```

## コンテナ一覧

コンテナ一覧を表示したいときに。

```sh
$ docker-compose ps
```

## イメージ一覧

イメージ一覧を表示したいときに。

```sh
$ docker-compose images
```

## コマンド実行

wordpressコンテナで`ls -l`コマンドを実行。

```sh
$ docker-compose exec wordpress ls -l
```

## MySQLに接続

docker-compose.ymlのdbに`ports`を追加する。

```yaml:docker-compose.yml
db:
    image: mysql:5.7
    ports:
      - "3306:3306"
```

hostname: 127.0.0.1
port: 3306
username: wordpress
default schema: wordpress

# Github
[h23k/sandbox-wordpress](https://github.com/h23k/sandbox-wordpress)
FontAwesomeのiconをulやliに使う方法

# はじめに

某プログラミングスクールにてフリマアプリを作成する際にFontAwesomeのiconが□に文字化けして悩んだ事を記事にします！！


# 完成図

以下の様にしたい！

[![Image from Gyazo](https://i.gyazo.com/bb4b384e88e21874b3cbe06cabcc9d5d.png)](https://gyazo.com/bb4b384e88e21874b3cbe06cabcc9d5d)

### しかし色々調べてみると
FontAwesomeのiconをulやolのlist-styleに使いたくなることってありますよね？
残念ながら、list-styleに直接アイコンを使うことは出来ないのです・・・・

### え！？

しかし似た様な事はできる様なので早速実践！！

```show.html.haml
          .main__showMain__contentRight__topContent__itemBox__optionalArea
            %ul
              %li.optionalBtn.likeBtn#likeBtn
                %i.fas.fa-star   お気に入り 0
                               
            %ul.optional
              %li.optionalBtn
                =link_to  '' do
                  %i.fa-flag.likeIcon 不適切な商品の通報
```
```show.scss
          &__optionalArea {
            display: flex;
            justify-content: space-between;
            ul {
              margin: 10px 0 0;
              display: flex;
              list-style: none;
              .likeBtn {
                margin-right: auto;
                padding: 6px 10px;
                border-radius: 40px;
                color: #3CCACE;
                border: 1px solid #ffb340;
                i {
                  display: inline-block;
                  font: normal normal normal 14px/1 FontAwesome;
                  font-size: inherit;
                  text-rendering: auto;
                  -webkit-font-smoothing: antialiased;
                }
                i:before {
                  content:'\f005';
                  font-weight: 400;
                  font-family: "Font Awesome 5 Free";
                }
              }
            }
            .optional {
              margin: 10px 0 0;
              display: flex;
              .optionalBtn {
                font-size: 14px;
                a {
                  padding: 6px 10px;
                  display: inline-block;
                  border-radius: 4px;
                  color: #333;
                  border: 1px solid #333;
                  text-decoration: none;
                  i {
                    display: inline-block;
                    font: normal normal normal 14px/1 FontAwesome;
                    font-size: inherit;
                    text-rendering: auto;
                    -webkit-font-smoothing: antialiased;
                  }
                  i:before {
                    content:'\f024';
                    font-weight: 400;
                    font-family: "Font Awesome 5 Free";
                  }
                }
              }
            }
          }
```

# ポイントのなる所

```show.scss
            ul {
              list-style: none;  　　　　　　←これ
            }
              i:before {
                  content:'\f005';　　　　　　　　　　　　　←これ
                  font-weight: 400;　　　　　　　　　　　　　←これ
                  font-family: "Font Awesome 5 Free";　　　←これ
                }
```

これで□に文字化けせずに表示できる様になりました！！

最後まで見て頂きありがとうございます！！

この記事が少しでも参考になれば嬉しいです:pray_tone2:


# 参考記事

https://qiita.com/ryounagaoka/items/0f7e81d703761b3e3e77
Railsで検索機能を追加する

7つの基本アクション以外でルーティングを定義する時には、collectionかmemberを利用します。
collectionはルーティングに:idがつかない、memberは:idがつく。という違いがあります。
今回は検索機能なので:idが不要なcollectionを使用します。

```ruby:config/routes.rb
Rails.application.routes.draw do
  resources :tweets do
    collection do
      get 'search'
    end
  end
end
```

モデルファイルに対してwhereメソッドとLIKE句を使用して検索の処理を作ります。
LIKE句は、曖昧な文字列の検索をすることができ、whereメソッドと一緒に使います。

```ruby:app/models/tweet.rb
class Tweet < ApplicationRecord
  validates :text, presence: true
  belongs_to :user
  has_many :comments

  def self.search(search)
    return Tweet.all unless search
    Tweet.where('text LIKE(?)', "%#{search}%")
  end
end
```

コントローラファイルに対して以下の記述を追加します。

```ruby:app/controllers/tweets_controller.rb
class TweetsController < ApplicationController
  def search
    @tweets = Tweet.search(params[:keyword])
  end
end
```

検索フォームを追加するページに検索フォームを実装します。

```ruby:検索フォーム
<%= form_with(url: search_tweets_path, local: true, method: :get) do |form| %>
  <%= form.text_field :keyword, placeholder: "投稿を検索する", class: "sample"%>
  <%= form.submit "検索", class: "sample"%>
<% end %>
```
app/views/tweetsに検索結果用のビューファイルsearch.html.erbを追加し、検索結果を表示させる。

```ruby:app/views/tweets/search.html.erb
<% @tweets.each do |tweet| %>
   <%= tweet.content %>
<% end %>
```

##複数のカラムから検索したい場合

modelファイルを下記のように編集します。

```ruby:app/models//tweets
def self.search(search)
  return Tweet.all unless search
  Tweet.where("title LIKE(?) or content LIKE(?)", "%#{search}%", "%#{search}%")
end
```
AdaptiveIconに対応する

## 環境
Android Studio 3.5

## 概要
AdaptiveIconについては下記URLを参照。
https://developer.android.com/guide/practices/ui_guidelines/icon_design_adaptive?hl=ja

## アイコンの表示の違い
![LiFBflD8A-clipboard.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625386/8409c686-a778-332b-52f6-4a3639fa10ab.png)

未対応の場合はアイコンの中央に配置された状態でアプリアイコンが表示されます。

## 様々な形状に対応
![_HoeigkJV-clipboard.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625386/7187dafa-df45-1bc1-6272-54efd1b718c9.png)
## 画像の用意
使用する画像はベクタ画像がおすすめです。
用意する画像は単色の背景の場合はColorResourceを使うのでアイコンのイラスト部分にあたる画像のみでOKです。
背景に画像を適用したい場合は別途画像が必要です。
ベクター画像の場合のサイズは108x108dpで作成します。
png等を利用する場合はサイズ次第で荒くなるので注意が必要です。
pngで画像を作る場合は背景透過で全体のサイズを432x432px、イラスト部分を288x288pxで作成すると粗さもなくいい感じになります。

## アイコンの作成
アイコンの作成はAndroidStudioのImageAssetを利用して作成するのが便利です。
New→ImageAssetで作成ツールが起動します。
NameとLayerNameはデフォルトのままにしておくと既存のアイコンに上書きされるので設定の手間が少なくなります。

#### アイコン作成手順
![dDko0A1_3-clipboard.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625386/2a02cc5f-d314-495d-cb03-c6e0c58f5d8c.png)


1. ForegroundLayerタブを開き、前景に配置する画像を設定します。
　Resizeのスライダーで画像のサイズ調整ができるのでガイドからはみ出ていたりする場合はこれで調整しましょう。
![dDko0A1_3-clipboard.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625386/36738783-f8ae-e76d-52f2-524995290f3e.png)

2. 次にBackgroundLayerタブを開き、前景に配置する画像を設定します。
　 単色背景の場合はAssetTypeをカラーに、画像を使用する場合はImageを選択します。
　 ImageはForegroundLayerと同様にResizeのスライダーで調整可能です。
　 調整が終わったらNextをクリックします。
3. 生成される画像が一覧で表示されるので表示に問題ないかチェックしましょう。
　　mipmap-anydpi-v26がAndroid8以降のAdaptiveアイコン、それ以外はAndroid8以前のアイコンとして使用されます。
4. 問題なければFinishをクリックします。

## アイコンの設定
AndroidManifestのapplicationタグのiconに作成したアイコンのDrawableを入力します。
作成時にデフォルトのままにしていた場合は上書きされるので上記の作業は不要です。
あとはアプリをインストールしてアイコンが設定されているかを確認しましょう。

## 端末のアイコンの形状の設定変更方法
前提として開発者モードを有効にしておきます。
1. 設定アプリを起動
2. システム→詳細設定→開発者向けオプション→テーマ設定セクションのアイコンの形
3. 任意の形状を選択する
※端末によっては設定方法が異なるので注意
AndroidアプリをDarkThemeに対応させる

## 概要
DarkThemeについては以下を参照   
https://developer.android.com/guide/topics/ui/look-and-feel/darktheme

## リソースの用意
ダークテーマ用のリソースはnightの修飾子がついたディレクトリ（以下nightディレクトリとする）に格納する。   
（colorだったらvalues-nightディレクトリにカラーリソースファイルを格納）
既存のリソースディレクトリはlightモード時のものになる。   
リソースのうち、ダークテーマに対応する必要がないものはnightディレクトリに格納する必要はない。
（lightモードのものが適用される）。
![E0tNMzb85-スクリーンショット 2019-11-25 17.52.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625386/d7552387-ff71-f67f-a96b-2fbc3a27926b.png)
![fhp0QD14F-スクリーンショット 2019-11-25 17.51.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625386/03dcc150-aacf-4c93-f5fa-0a5105c1fa41.png)
## AppThemeを変更
AppThemeを`Theme.AppCompat.DayNight`に変更する。   
（NoActionBarの場合は`Theme.AppCompat.DayNight.NoActionBar`）
Emacs で crontab を編集する (emacsclient)

サーバ管理のときの編集は viを使うというイメージもありましたが、
Emacs派の人はやはり、サーバ管理でも Emacsを使いたいですよね。

Emacsは最初に１度起動しておいて、シェルもその中で実行してしまう使い方をしていると思います。

管理コマンドの中には、エディタを起動して設定を書き換えるようなタイプのコマンドがあります。

環境変数 EDITOR で指定されたエディタが起動されてきます。
通常は、viになっていることが多いと思います。

たとえば cronの設定のときの crontab -e です。

Emacsのシェルで作業をしているときに、これをやると、、、

```
# crontab -e
```

イテテ状態になります。
(わたしは tcsh 使いなので、以下、bashの人は適当に読みかえてください)

では、EDITOR を emacsにすればいいかというと、、、

```:.cshrc
setenv EDITOR emacs
```
これだと Emacsの中で Emacsが起動してしまうので、
一旦 Emacsをサスペンドしてからでないとうまくいきません。

```
Emacsで
C-x C-z			# Emacsがサスペンドされる

# crontab -e		# もうひとつ Emacsが起動される

編集後 C-x C-c		# Emacsを終了

# fg			# 最初の Emacsに戻る
```


これだと、Emacsのシェルで作業しているメリットがあまりないです。

ではどうするかというと、Emacsclient を使います。

そのために、あらかじめ Emacsのサーバ機能を有効にしておきます。

```:.emacs
(require 'server)
(unless (server-running-p)
  (server-start)
  )
```
```:.cshrc
setenv EDITOR emacsclient
```

Emacs のシェルから

```
# crontab -e
```

を実行したら、今使っている Emacsに crontab 編集用のバッファが開きます。

編集が終わったら
C-x k
でバッファを閉じればOKです。
[ARKit]ARWorldMapを使った空間の保存と復元

## 概要
Worldmap情報を保存するとAR空間全体の状態を保存できる。   
アプリ再起動後にオブジェクトを同じ位置に配置したい場合や複数端末で空間を共有したいときに便利   

### Worldmapのロード
```swift
let worldMap = try! NSKeyedUnarchiver.unarchivedObject(ofClass: ARWorldMap.self, from: data)
configuration.initialWorldMap = worldMap
```

### Worldmapの保存
```swift
self.sceneView.session.getCurrentWorldMap(completionHandler: { (worldMap, error) in
    guard let map = worldMap else {
        return
    }
    let archived = try! NSKeyedArchiver.archivedData(withRootObject: map, requiringSecureCoding: true)
    UserDefaults.standard.set(archived, forKey: self.worldMapKey)
})
```

### オブジェクトの位置の復元
オブジェクトの復元はUserDefaultsに座標を保存しておき、rendererメソッドで描画を行う。
（SCNVector3はUserDefaults非対応なので配列として保存する）


[ARWorldMap](https://developer.apple.com/documentation/arkit/arworldmap)
numpyで「ValueError: data type must provide an itemsize」と出たときの対処法

# numpyにて
今回Bertを使って算出されたベクトルを利用して，Cos類似度を算出していたところ，以下のようなエラーメッセージが．

```
ValueError: data type must provide an itemsize
```

簡単にいうと，「与えるデータ型を変更してください」とのこと．

# 解決法
引数$vector1,vector2$はlist型のベクトルとする
### 変更前
```python

def cos_sim(v1, v2):
    return np.dot(v1, v2) / (np.linalg.norm(v1) * np.linalg.norm(v2))

v1=np.array(vector1)
v2=np.array(vector2)
print(cos_sim(v1,v2))
```

### 変更後
```python

def cos_sim(v1, v2):
    return np.dot(v1, v2) / (np.linalg.norm(v1) * np.linalg.norm(v2))

v1=np.array(vector1,dtype=float)
v2=np.array(vector2,dtype=float)
print(cos_sim(v1,v2))
```

つまり，list型からnumpyに変更するとき，第二引数に「dtype=float」を追加しろってこと．

なるほどね．
Sassのhoverとactiveは&記号で楽に使える

###sassのhover
カーソルが乗ったときにのみ色を変えたりできる状態です。
CSSの場合は、セレクタ:hoverで、
Sassの場合は、&:hoverで実行できます。
【例】

```stylesheet.scss
.main {
  font-size: 20px;
  text-align: center;
  &:hover {
    opacity: 1;
  }
}
```
####Sassのactive
要素(ボタンなど)がクリックされている間だけCSSを適用します。
こちらもhoverと一緒でCSSの場合は、セレクタ:activeで、
Sassの場合は、&:activeで実行できます。
【例】

```stylesheet.scss
.main {
  font-size: 20px;
  text-align: center;
  &:active {
    position: relative;
    top: 5px;
    box-shadow: none;
  } 
```
ancestoryを使ってカテゴリー機能を実装

# はじめに

某プログラミングスクールに通いフリマアプリをチームで作成した際にカテゴリーの多階層構造の実装をしたので紹介します！！

# 完成図

<a href="https://gyazo.com/f68aa0c5589b625bdb030426d064bd85"><img src="https://i.gyazo.com/f68aa0c5589b625bdb030426d064bd85.png" alt="Image from Gyazo" width="621"/></a>

それでは紹介したいと思います。

#1.モデルの作成
まず商品とカテゴリーを紐付けさせたいので『category』と『item』のモデルを作成します。

```ruby
$ rails g model category 

$ rails g model item 
```

#2.ancestoryの導入
Gemfileにancestoryを導入します。

```ruby
gem 'ancestry'
```
ターミナルで下記コマンドを実行

```ruby
$ bundle install

$ rails g migration add_ancestry_to_category ancestry:string:index

$ rails db:migrate
```

# 3.アソシエーション

ancestoryを使うことで多対多の関係が１対多の関係になりDB設計がシンプルになります。

category.rbにhas_ancestoryを記述

```category.rb
class Category < ApplicationRecord
　has_many :items
　has_ancestry　　
end
```
```item.rb
class Item < ApplicationRecord
　belongs_to :category
end
```

#3.データを導入
seeds.rbにカテゴリーのレコードを導入していきます。

```seeds.rb
lady = Category.create(name: "レディース")
lady_1 = lady.children.create(name: "トップス")
lady_1.children.create([{name: "Tシャツ/カットソー(半袖/袖なし)"},{name: "Tシャツ/カットソー(七分/長袖)"},{name: "シャツ/ブラウス(半袖/袖なし)"},{name: "シャツ/ブラウス(七分/長袖)"},{name: "ポロシャツ"},{name: "キャミソール"},{name: "タンクトップ"},{name: "ホルターネック"},{name: "ニット/セーター"},{name: "チュニック"},{name: "カーディガン/ボレロ"},{name: "アンサンブル"},{name: "ベスト/ジレ"},{name: "パーカー"},{name: "トレーナー/スウェット"},{name: "ベアトップ/チューブトップ"},{name: "ジャージ"},{name: "その他"}])
```
ancestryを入れると.childrenと記述することで直前の変数の子要素として扱うことができます。

以下の記述で親カテゴリーであるレディースが登録されます。

```seeds.rb
lady = Category.create(name: "レディース")
```
次に、以下の記述で子カテゴリーであるトップスが登録されます。

```seeds.rb
lady_1 = lady.children.create(name: "トップス")
```
そして、以下の記述で孫カテゴリー群が登録されます。

```seeds.rb
lady_1.children.create([{name: "Tシャツ/カットソー(半袖/袖なし)"},{name: "Tシャツ/カットソー(七分/長袖)"},{name: "シャツ/ブラウス(半袖/袖なし)"},{name: "シャツ/ブラウス(七分/長袖)"},{name: "ポロシャツ"},{name: "キャミソール"},{name: "タンクトップ"},{name: "ホルターネック"},{name: "ニット/セーター"},{name: "チュニック"},{name: "カーディガン/ボレロ"},{name: "アンサンブル"},{name: "ベスト/ジレ"},{name: "パーカー"},{name: "トレーナー/スウェット"},{name: "ベアトップ/チューブトップ"},{name: "ジャージ"},{name: "その他"}])
```

seeds.rb内にレコードを記述したら、ターミナルで以下のコマンドを実行しDBに反映させます。

```
$ rails db:seed
```

DBではこのように登録されます。

<a href="https://gyazo.com/697c5fba1021ad853da47c02c21042ad"><img src="https://i.gyazo.com/697c5fba1021ad853da47c02c21042ad.png" alt="Image from Gyazo" width="592"/></a>

最後まで見て頂きありがとうございます！！

この記事が少しでも参考になれば嬉しいです:pray_tone2:
ubuntuでpodman試してみた

#環境
ubuntu 18.04.4 LTS
podman 1.9.2
podman-compose 0.1.5
#参考サイト
- https://podman.io/getting-started/installation.html
- https://qiita.com/rururu_kenken/items/7961d795d7bdd4cb86c2
- https://github.com/containers/libpod/issues/2571

#手順
##1.podmanインストール  
[podmanのサイト](https://podman.io/getting-started/installation.html)にいき、Debianの手順のところを実施。

```shell

# Debian Unstable/Sid
echo 'deb https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/Debian_Unstable/ /' > /etc/apt/sources.list.d/devel:kubic:libcontainers:stable.list
curl -L https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/Debian_Unstable/Release.key | sudo apt-key add -

# Debian Testing
echo 'deb https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/Debian_Testing/ /' > /etc/apt/sources.list.d/devel:kubic:libcontainers:stable.list
curl -L https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/Debian_Testing/Release.key | sudo apt-key add -

# Debian 10
echo 'deb https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/Debian_10/ /' > /etc/apt/sources.list.d/devel:kubic:libcontainers:stable.list
curl -L https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/Debian_10/Release.key | sudo apt-key add -

sudo apt-get update -qq
sudo apt-get -qq -y install podman

```
##2.podman-composeインストール
[この記事を参考](https://qiita.com/rururu_kenken/items/7961d795d7bdd4cb86c2)  にしつつpodman-composeをインストール

```shell
sudo apt install -y python3-pip
sudo pip3 install podman-compose
```
##3.jenkins コンテナを起動
[この記事を参考](https://qiita.com/rururu_kenken/items/7961d795d7bdd4cb86c2)（本当にお世話になります。） のdocker-compose.ymlを転用して作成

```docker-compose.yml
version: "3.7"
services:
  master:
    image: jenkins/jenkins:lts
    restart: always
    ports:
      - 8080:8080
      - 50000:50000
    volumes:
      - ./jenkins_home:/var/jenkins_home
```
作成後、upする。

```shell
sudo podman-compose up -d
```

#ちょっとはまったこと
podman-composeするときsudoをつけないとエラーになります。
詳細はよくわからないのだが[ここ](https://github.com/containers/libpod/issues/2571)で話し合われていることのようなので、sudoをつけて実行してみた。一般ユーザでそのまま実行するにはなにかしらの設定が必要みたい。
知っている人いたら教えてください。
#お礼
@rururu_kenkenの記事をだいぶ参考にさせたいただきました。ありがとうございます。
Prototypical Contrastive Learning of Unsupervised Representations

https://arxiv.org/pdf/2005.04966.pdf

Junnan Li, Pan Zhou, Caiming Xiong, Richard Socher, Steven C.H. Hoi
Salesforce Research

### 概要
教師なし表現学習でクラス分類に転移学習するはなしの一つ。Mocoとかと同じ流れ。

- Prototypical Contrastive Learning (PCL)を提案
- 従来の対比学習はインスタンスベースであったのをプロトタイプベースにした
- E-M法を用いる
 - Eステップでクラスタリングによってプロトタイプの分布を求める
 - Mステップで対比学習を行ってネットワークを最適化する
- ProtoNCE Loss を提案。Mocoなどで用いられているInfoNCE Lossの一般化
- 複数のベンチマークで10%以上の性能向上

### 関連研究
- instance discrimination は画像のローレベルな特徴でできてしまうのでグローバルなセマンティクスを使うように学習できない。
- 大量のネガティブサンプルを使うと意味的に本来似ているものもネガティブサンプルに含まれてしまう。これを遠くになるように学習するとおかしなことがおこる。

### 手法
X ={x_1,.. x_n} が入力。埋め込み関数をfθとする。埋め込み関数はXをV={v_1,.. v_n}に埋め込む。v_n = fθ(x_n) 。

MoCoでは1つのpositive sampleと大量のnegative sampleを与えて学習する。プロトタイプベースの手法ではサンプルのかわりに、プロトタイプcを用いる。クラスタリングして得られたセントロイドを、各クラスタのプロトタイプとして考え、個々のデータが一番近いプロトタイプに対してより近く、遠いプロトタイプに対してはより遠くなるように学習する。

このとき温度パラメータτに相当する集合性パラメータΦをクラスタごとに求めておき、近づける、遠ざける強度を調整する。

クラスタリングはk-meansを用いる。k-meansにはkを指定しなければならないのだが、kを色々変えて、結果を加算する。このことによって粒度の異なるクラスタリングに対した学習が行われる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412142/3cfb6132-d080-7283-1623-3febbbeaed71.png)

クラスタリングはモメンタムエンコーダを用いたネットワークで行う。


### 評価
- 限定されたデータセットによる画像分類
 - 学習した表現に対してSVMを少数サンプルでトレーニング Places2005, VOC2007
 - 半教師あり画像クラス分類。Imagenetのサブセット。転移学習

- 画像分類ベンチマーク
    - 線形クラス分類
    - KNNクラス分類
- 物体識別
■【Google Colaboratory】形態素解析（janome）を使う

日本語の形態素解析ツール **janome** の使い方を紹介。
JanomeはPythonの形態素解析エンジン。
日本語のテキストを形態素ごとに分割して品詞を判定したり分かち書き（単語に分割）することができる

# 1. Install of "janome"

```python

!pip install janome
```

# 2. How to use

```python

from janome.tokenizer import Tokenizer
s = Tokenizer() # <- トークナイザのインスタンスを生成
t = 'にわにわにわにわとりがいる'
tt = '庭には二羽ニワトリがいる'
for _ in s.tokenize(t):
  print(_)
for __ in s.tokenize(tt):
  print(__)
```

[Output] ===================================================
に ----- 助詞,格助詞,一般,*,*,*,に,ニ,ニ
わに ----- 名詞,一般,*,*,*,*,わに,ワニ,ワニ
わに ----- 名詞,一般,*,*,*,*,わに,ワニ,ワニ
わ ----- 助詞,終助詞,*,*,*,*,わ,ワ,ワ
にわとり ----- 	名詞,一般,*,*,*,*,にわとり,ニワトリ,ニワトリ
が ----- 助詞,格助詞,一般,*,*,*,が,ガ,ガ
いる ----- 動詞,自立,*,*,一段,基本形,いる,イル,イル

庭 ----- 名詞,一般,*,*,*,*,庭,ニワ,ニワ
に ----- 助詞,格助詞,一般,*,*,*,に,ニ,ニ
は ----- 助詞,係助詞,*,*,*,*,は,ハ,ワ
二 ----- 名詞,数,*,*,*,*,二,ニ,ニ
羽 ----- 名詞,接尾,助数詞,*,*,*,羽,ワ,ワ
ニワトリ ----- 名詞,一般,*,*,*,*,ニワトリ,ニワトリ,ニワトリ
が ----- 助詞,格助詞,一般,*,*,*,が,ガ,ガ
いる ----- 動詞,自立,*,*,一段,基本形,いる,イル,イル 
[end] ======================================================






# Reference
> [形態素解析ツールの比較 (NLP2018)](https://qiita.com/sugiyamath/items/69047b6667256034fa5e)
[Python scipy] 2次元データのアップスケール/ダウンスケール

単語帳．毎回検索するのが面倒なので転載多め．元URLあり．

ときどき混乱するので：

- アップスケール：解像度を粗くする
- ダウンスケール：解像度を細かくする

値の内挿はここにまとめられている：
[SciPy.org: Interpolation (scipy.interpolate)]
(https://docs.scipy.org/doc/scipy-0.14.0/reference/interpolate.html)

この内アップスケール/ダウンスケールでよく使われるのは

- [interp2d](https://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.interpolate.interp2d.html#scipy.interpolate.interp2d)
    - 2次元のみ．
    - `kind` = ‘linear’, ‘cubic’, ‘quintic’
- [RegularGridInterpolator](https://docs.scipy.org/doc/scipy-0.16.1/reference/generated/scipy.interpolate.RegularGridInterpolator.html)
    - 2次元以外も使える
    - "regular grid"である必要（等間隔である必要はない）
    - `method` = 'linear', 'nearest'
    - こちらで良いなら`intrep2d`よりも高速


## RegularGridInterpolatorを使った例

[stackoverflow: Scipy interpolation with masked data?]
(https://stackoverflow.com/questions/35807321/scipy-interpolation-with-masked-data)
が分かりやすい．
MaskedArrayの場合は，（マスクされた部分をnp.nanで埋めるよりも）マスク自体を変換する方が高速．

```Python
import numpy as np
from scipy import interpolate

def conv_resol(arr, newshape, *args, **kwargs):
    '''
    Args:
        arr [2d ndarray or MaskedArray]
        newshape [tuple of int]
        *args, **kwargs: for interpolate.RegularGridInterpolator
    '''
    nx0, ny0 = arr.shape
    nx1, ny1 = newshape
    x0 = np.linspace(0, 1, nx0)
    y0 = np.linspace(0, 1, ny0)
    x1 = np.linspace(0, 1, nx1)
    y1 = np.linspace(0, 1, ny1)
    x1, y1 = np.meshgrid(x1, y1) # x1 [ny1,nx1], y1 [ny1, nx1]
    xy1 = np.array((x1, y1)).T   # xy1 [nx1, ny1, 2]
    arr1 = interpolate.RegularGridInterpolator((x0, y0), arr, *args, **kwargs)(xy1)
    if isinstance(arr, np.ma.MaskedArray):
        mask1 = interpolate.RegularGridInterpolator((x0, y0), arr.mask.astype('float'), *args, **kwargs)(xy1) > 0.0
        return np.ma.masked_array(arr1, mask=mask1)
    return arr1
```

テスト

```Python
import matplotlib.pyplot as plt


nx0, ny0 = 10, 20
arr0 = np.arange(nx0 * ny0).reshape(nx0, ny0) * (1.0 / (nx0 * ny0))

nx1, ny1 = 5, 10
arr1 = conv_resol(arr0, (nx1, ny1))

nx2, ny2 = 20, 40
arr2 = conv_resol(arr0, (nx2, ny2))

plt.figure(figsize=(12,8))
plt.subplot(2,2,1)
plt.imshow(arr0, vmin=0.0, vmax=1.0)
plt.subplot(2,2,3)
plt.imshow(arr1, vmin=0.0, vmax=1.0)
plt.subplot(2,2,4)
plt.imshow(arr2, vmin=0.0, vmax=1.0)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270660/ba7da443-9055-cf3f-50ac-b7ae92581b0f.png)
[Cloud Run for Anthos][Quarkus] PubSub push で起動させる

### 参考資料 
- Pub/Sub との統合  
https://cloud.google.com/run/docs/tutorials/pubsub#cloud-run-on-gke)
- Authentication and authorization by the push endpoint   
https://cloud.google.com/pubsub/docs/push#authentication_and_authorization_by_the_push_endpoint
- 署名付きヘッダーによるアプリの保護  
https://cloud.google.com/iap/docs/signed-headers-howto#verifying_the_jwt_header
- Validating service accounts (Cloud Run for Anthos on Google Cloud)  
https://cloud.google.com/run/docs/triggering/pubsub-push#validating_service_accounts
- Using push subscriptions, Cloud Pub/Sub    
https://cloud.google.com/pubsub/docs/push#java
- cloudrun, GoogleCloudPlatform/java-docs-samples, Github  
https://github.com/GoogleCloudPlatform/java-docs-samples/tree/master/run/pubsub/src/main/java/com/example/cloudrun
- cloudrun/Body.java, GoogleCloudPlatform/java-docs-samples, Github  
https://github.com/GoogleCloudPlatform/java-docs-samples/tree/master/run/pubsub/src/main/java/com/example/cloudrun/Body.java
- appengine/pubsub/Message.java, GoogleCloudPlatform/java-docs-samples, Github  
https://github.com/GoogleCloudPlatform/java-docs-samples/blob/master/appengine-java8/pubsub/src/main/java/com/example/appengine/pubsub/Message.java
- appengine/pubsub/PubSubAuthenticatedPush.java, GoogleCloudPlatform/java-docs-samples, Github  
https://github.com/GoogleCloudPlatform/java-docs-samples/blob/master/appengine-java8/pubsub/src/main/java/com/example/appengine/pubsub/PubSubAuthenticatedPush.java
- QUARKUS - WRITING JSON REST SERVICES  
https://quarkus.io/guides/rest-json

### 参考資料 pubsub messageの中身
- 新しいカスタム属性, メッセージのパブリッシュ, Cloud Pub/Sub   
https://cloud.google.com/pubsub/docs/publisher#config


### 参考資料 Quarkus JWT
- QUARKUS - USING JWT RBAC  
https://quarkus.io/guides/security-jwt
- QUARKUS - USING THE REST CLIENT   
https://quarkus.io/guides/rest-client
- QUARKUS - WRITING JSON REST SERVICES    
https://quarkus.io/guides/rest-json
- quarkusio/quarkus-quickstarts, Github   
https://github.com/quarkusio/quarkus-quickstarts
AE　よく使うショートカット

## ショートカット
**個人的に使用するショートカットまとめ　ver.はCC以降**
###### ◆コンポジション
Ctrl+N　新規コンポジション作成
Ctrl+K　コンポジション設定
###### ◆レイヤー
Ctrl+Y　新規平面レイヤー作成
Ctrl+D　複製
Ctrl+Shift+D　レイヤーを現在の時間で分割
Alt+[　レイヤーのインポイントを現在の時間でトリム
Alt+]　レイヤーのアウトポイントを現在の時間でトリム
###### ◆ワークエリア
B　ワークエリアの開始を現在の時間に設定
N　ワークエリアの終了を現在の時間に設定
![AE001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606192/7088738b-26ed-9622-d055-aaf6501f790f.png)

範囲を決めたらワークエリアをトリムする
ワークエリア上で右クリック＞コンポジションをワークエリアにトリム

Ctrl+Alt+M　Media Encoderキューを追加(※.mp4《動画》を書き出す場合)
Ctrl+Alt+S　フレーム保存(※1Fだけ出力する場合)

随時追加予定
一太郎2020に、フォントによって、表示の不具合

ジャストシステムには、製品の不具合の報告に、「電話しか手段が無い」（しかも有料！）みたいなので、ここに書き込むことにします。

ちなみに環境は、Windows 10（Home 1909）、一太郎2020（バージョン30.0.1）です。

## 一太郎2020に、使用するフォントによって、そして書き込んだ文字列によって、表示の不具合が見つかりました。
まずは、次の画像をご覧あれ。

###「メイリオ」
![List of file(メイリオ).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327025/bcc3600a-c0bc-2062-4811-f8756b26c9c2.jpeg)

このように、「List of file」という文字列と、「全角文字」とを「同じ行に入力」すると、（赤字の行）
「List of file」という文字列が、「**List offi  le**」と表示されてしまいました。（使用フォントは「メイリオ」）

ちなみに、「List offi  le」の先頭から矢印キーでカーソルを移動すると、文字パレットの「異体字」タブには、なぜか「List of file」の正しい順番で文字が現れました！

ただし、カーソルの動きは、「L,i,s,t, ,o,f,fi, , ,l,e」と、「of」の後で不規則な動きを示しました。

###「游ゴシック」でも同様でした。
![List of file(游ゴシック).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327025/bd0ebba1-88ae-03e1-2f4b-83888ae302ff.jpeg)

###「ヒラギノ角ゴシック」（市販品）でも同じ。
![List of file(ヒラギノ角ゴ ProN W3).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327025/083789eb-8ab8-4e64-22a7-47e774b39d2a.jpeg)

### なぜか、「BIZ UD ゴシック」では違いました。
![List of file(BIZ UD ゴシック).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327025/21ca7b13-1d28-2b78-8c3f-f50a55fe0c3d.jpeg)

### Microsoft 製品では異常なし。
#### Word 2010（游ゴシック）
![List of file(WORD 游ゴシック).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327025/4311ac3b-1b35-8600-d37f-50db8a707790.jpeg)

#### メモ帳（游ゴシック）
![List of file(メモ帳 游ゴシック).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327025/cb962b7d-6ff9-c6c3-30ad-f23eae11a74d.jpeg)
HashiCorpVault を GKEに導入して個人情報を暗号化してみる（ハマってしまったので途中で投稿、あとで編集予定

### [1. Install Vault Locally](https://codelabs.developers.google.com/codelabs/vault-on-gke/index.html?index=..%2F..cloud#2)
- とりあえず、マニュアルでVaultインストールは大変という事なので、dockerイメージでlocalにVaultをインストールする。

### 2. ローカルパソコンで、Vaultを開発モードで起動する
- [Quarkusのマニュアル](https://quarkus.io/guides/vault)にローカルVaultの良い情報があるので、参考にする。
- どうやら、vaultのdockerイメージを起動させるみたい。
- [vaultのdockerイメージのReadme](https://github.com/docker-library/docs/tree/master/vault)も参考になる。
```
$docker run --rm --cap-add=IPC_LOCK -e VAULT_API_ADDR=http://localhost:8200 -p 8200:8200 -d --name=dev-vault vault:1.4.1
```

この手順でそのまま進める
[QUARKUS - USING HASHICORP VAULT](https://quarkus.io/guides/vault)
[QUARKUS - USING HASHICORP VAULT’S TRANSIT SECRET ENGINE](https://quarkus.io/guides/vault-transit)
[GCS](https://codelabs.developers.google.com/codelabs/vault-on-gke/index.html?index=..%2F..cloud#3)
このバケットには、最小権限を付与し、Vault以外アクセスさせない様にしましょう。
[Vaultのrootトークンを保護するためにKMS](https://codelabs.developers.google.com/codelabs/vault-on-gke/index.html?index=..%2F..cloud#4)
[必要最小限権限のGSAを作る](https://codelabs.developers.google.com/codelabs/vault-on-gke/index.html?index=..%2F..cloud#5)
dbdeployerを使ってみた

# dbdeployerとは

ざっくりいうとMySQL Sandboxみたいなやつです。
気軽にDBサーバーを立てることが出来ます。

ちょうどschema管理周りの実験に使おうと
MySQL Sandboxのセッティングをしようとした時に発見しました。

ちなみにMySQL SandboxはPerl製のツールだったんですが、
dbdeployerはGoで出来てるみたいです。

# dbdeployerでのセットアップ

今回は自分のローカルMacにインストールするので、
instalationの内容を少し書き換えて

```
VERSION=1.45.0
OS=osx
origin=https://github.com/datacharmer/dbdeployer/releases/download/v$VERSION
wget $origin/dbdeployer-$VERSION.$OS.tar.gz
tar -xzf dbdeployer-$VERSION.$OS.tar.gz
chmod +x dbdeployer-$VERSION.$OS
sudo mv dbdeployer-$VERSION.$OS /usr/local/bin/dbdeployer
```

これでコマンドは多々けるようになった。
次にtarball (tarで固めたファイルを指すらしい)を落としてくる作業が必要

まずはdry-run

```
$ dbdeployer downloads get-by-version 5.7 --newest --dry-run
Would download:

Name:          mysql-5.7.29-macos10.14-x86_64.tar.gz
Short version: 5.7
Version:       5.7.29
Flavor:        mysql
OS:            Darwin
URL:           https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.29-macos10.14-x86_64.tar.gz
Checksum:      SHA512:bc275458b4185d0290b6faa7f50e3cb250ec4eef57607b51d41c72ef800eb9c1cd4eb49adc0a924a7c64acc742930f5b3d2838b0b899770a6645a4eab7a10f50
Size:          361 MB
Notes:         added with version 1.44.0
```

で、実行

```
$ dbdeployer downloads get-by-version 5.7 --newest
Downloading mysql-5.7.29-macos10.14-x86_64.tar.gz
.........105 MB.........210 MB.........315 MB....  361 MB
File /Users/hiraoka.yosuke/mysql-5.7.29-macos10.14-x86_64.tar.gz downloaded
Checksum matches
```

コマンド実行と同じディレクトリにファイルが設置される。
これでtarballは手に入れられた。

次にtarballをunpackする必要があるらしい。
ちなみにopt/mysqlという場所にunpackされたものが置かれるのでディレクトリは作っておく。

```
$ mkdir -p $HOME/opt/mysql
$ dbdeployer unpack mysql-5.7.29-macos10.14-x86_64.tar.gz
Unpacking tarball mysql-5.7.29-macos10.14-x86_64.tar.gz to $HOME/opt/mysql/5.7.29
.........100.........200.........300.......376
Renaming directory /Users/hiraoka.yosuke/opt/mysql/mysql-5.7.29-macos10.14-x86_64 to /Users/hiraoka.yosuke/opt/mysql/5.7.29
```

これで準備は出来たのでdeployしてみる

```
$ dbdeployer deploy single 5.7.29
Creating directory /Users/hiraoka.yosuke/sandboxes
Database installed in $HOME/sandboxes/msb_5_7_29
run 'dbdeployer usage single' for basic instructions'
... sandbox server started
```

確認してみると

```
$ dbdeployer sandboxes
 msb_5_7_29               :   single   5.7.29   [5729 ]
```

ということで行けたっぽい。

ちなみにDBサーバーの中に入ろうと思うと、
sandboxesディレクトリの中からuseというスクリプトを叩けばいける。

```
cd ~/sandboxes/msb_5_7_29
./use
```
でいけます。
構築自体は出来たっぽいので一旦はここまで。
databaseを作ったりtableを作ったりいじって遊ぶのは次回ということで！

# 参考
[github](https://github.com/datacharmer/dbdeployer)
[次世代MySQL Sandbox! dbdeployerの使用方法について](https://www.s-style.co.jp/blog/2018/06/1894/)
[【備忘録】dbdeployerの設定](https://qiita.com/jampanti/items/3eb8df8070ac60755065)
Python文法総復習

#目的
HackerRankをやりながら忘れそうな文法を記載していきます。

####標準入力をint型で取得してリスト化

```sample.py
# 標準入力 1 2 3 4 5
ar = list(map(int, input().rstrip().split()))
```
rstrip()は末端¥nを削除

####for文

```sample.py
for i in iterableな値
　print(i)
```
iterableとは、listやtaple、range()など一要素ずつ取り出せるもの。
len(array)などのintは不可。

####文字の繰り返し

```sample.py
string='A'*3
print(string)
# 出力　AAA
```

####長さの決まった文字列の分割
```sample.py
# 入力 12:10:10PM
time=s[:8]
str=s[8:]
#time 12:10:10
#str PM
```

####if複数条件
```sample.py
if(A and B)
if(A or B)
```

####listへの挿入
```sample.py
#末尾に挿入
list.append(入れたいもの)

#指定の位置に挿入
list.insert(index, 入れたいもの)
```

####文字列の結合
```sample.py
'入れたいもの'.join(list)
```

####絶対値
```
abs(x-y)
```
プリントサーバーを移行してみる(Printer server migration)

プリンター情報（設定、ドライバーを含む）をすべて移行：

[管理ツール]、[印刷の管理]、
[プリントサーバ]＞右クリック、「プリンタをファイルへエクスポート」
[管理ツール]、[印刷の管理]、
[プリントサーバ]＞右クリック、「プリンタをファイルへインポート」


-------
プリンター設定のみを移行：

プリンター設定を保存（元サーバー）
rundll32 printui.dll,PrintUIEntry /Ss /n "プリンター名" /a "settings.dat"

プリンター設定を書き込み（移行先サーバー）
rundll32 printui.dll,PrintUIEntry /Sr /n "プリンター名" /a "settings.dat" 2 7 c d u g r p


サーバーにインストールされたプリンター名一覧が欲しいときは、
wmic printer get name
PostfixがMessage-IDとDateを自動付与する場合としない場合

#はじめに

職場(とある大学)でperlでメールを送信するスクリプトが出回ってます。作者はよくわからないのですが。Linuxでコマンドライン(CUI)で実行を想定したプログラムです。

ほぼ同じスクリプトが出回ってるようですが、perlプログラムを実行してる利用者によって以下のヘッダがある場合と無い場合がある事に気がつきました。

> Message-Id
> Date

プログラム内ではMessage-IdおよびDateは設定してないようです。なのでメール配送の経路のどこかで自動付与されているようです。

それはさておいて、Message-IdとDataが付いてる場合と付いてない場合の違いは何なんだ？

補足：Dateは必須ヘッダですので、Dateが無いメールは不完全なメールになります。一部の環境では配送エラーが起きる可能性も否定できません。

#前提知識
検索するとMessage-IdやDateについては誰が付けるべきかについて論議があります。

> https://masutaka.net/chalow/2007-11-16-2.html
> Message-Id や Date は誰が付けるべきか？

上記ブログ補足：
MTA: メール転送エージェント。簡単にいうとメールサーバソフト。sendmailやpostfixとか。[Ref: Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%A1%E3%83%BC%E3%83%AB%E8%BB%A2%E9%80%81%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88)

MUA: 電子メールクライアント。簡単にいうとメールリーダー。OutlookやThunderbirdとかMewとか。[Ref: Wikipedia](https://ja.wikipedia.org/wiki/%E9%9B%BB%E5%AD%90%E3%83%A1%E3%83%BC%E3%83%AB%E3%82%AF%E3%83%A9%E3%82%A4%E3%82%A2%E3%83%B3%E3%83%88)


#ポリシー的な話
上記ブログの説明で、ポリシー的な話だというのはわかりました。

それはさておいて、具体的にはどこでヘッダの自動付与が制御されているのかわかりませんでした。

職場でよくつかわれてるMTAはpostfixです。postfixの設定を検索してみました。

> http://www.rosy-kitten.org/~ryusuke/diary/?date=20090522
> PostfixのMessage-ID:ヘッダ付加

という事で、Postfixの設定パラメータ「local_header_rewrite_clients」のようです。

補足: [Postfixのマニュアルの日本語訳](http://www.kobitosan.net/postfix/trans-2.2/jhtml/postconf.5.html#local_header_rewrite_clients)


#結論
簡単に言うと、メールサーバにリモートログインしてperlスクリプトを実行してた場合はMessage-IDとDateヘッダが自動付与されて、メールサーバ以外でperlスクリプトを実行してた場合は自動付与されてないという事でした。
マイグレーションファイルのrollback方法

# はじめに
某プログラミングスクールにてフリマアプリを作成する際にカラム名を変更したい時にマイグレーションファイルのrollbackが必要だった為その時に調べた事を書きます。

# 1.マイグレーションファイルを１つずつ差し戻す方法

まずターミナルで以下を実行

```
$ rails db:rollback

$ rails db:migrate:status

　　　↓ターミナルにこの様に表示されると思います
 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20200510074001  Create spending categories
   up     20200510074005  Create income categories
   up     20200510074056  Create incomes
  down    20200510074140  Create spendings

```

# 2.複数のファイルを差し戻す

下記のように末尾にSTEP＝で数を指定してあげると複数のファイルを差し戻すことが可能です。
今回は４つまとめて差し戻します。

```
$ rails db:rollback STEP=4　
　　
$ rails db:migrate:status

　　　↓ターミナルにこの様に表示されると思います
 Status   Migration ID    Migration Name
--------------------------------------------------
  down    20200510074001  Create spending categories
  down    20200510074005  Create income categories
  down    20200510074056  Create incomes
  down    20200510074140  Create spendings
```

# 3.任意のマイグレーションファイルのみを差し戻す

下記のようにVERSIONで "Migration ID" を指定してあげると選択のマイグレーションファイルのみを差し戻すことが可能です。

```
$ rails db:migrate:down VERSION=20200510074001 

$ rails db:migrate:status

　　　↓ターミナルにこの様に表示されると思います
 Status   Migration ID    Migration Name
--------------------------------------------------
  down    20200510074001  Create spending categories
   up     20200510074005  Create income categories
   up     20200510074056  Create incomes
   up     20200510074140  Create spendings
```

最後まで見て頂きありがとうございます！！

この記事が少しでも参考になれば嬉しいです:pray_tone2:
M5 Stack/M5 StickC/Wio Terminalで使える高性能グラフィックライブラリ「LovyanGFX」

![lovyan_gfx_04.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81919/2027ef63-385d-733b-07fe-23dcaf11fbdc.jpeg)

# LovyanGFX
　[らびやん](https://twitter.com/lovyan03)さん開発のM5 Stack/M5 StickC/Wio Terminalなどのマイコンで動くグラフィックライブラリです。GitHubでOSSとして公開されています。リポジトリへのリンクは以下です。

[LovyanGFX](https://github.com/lovyan03/LovyanGFX)


<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">自作GFX、LovyanGFXを公開しました。<a href="https://t.co/ilO0fkkGW9">https://t.co/ilO0fkkGW9</a><br>M5.LcdをLovyanGFXにして利用したい場合はこちらを。<a href="https://t.co/00AIL5yt5Y">https://t.co/00AIL5yt5Y</a><br>人柱募集中です～。</p>&mdash; らびやん (@lovyan03) <a href="https://twitter.com/lovyan03/status/1249277986789937152?ref_src=twsrc%5Etfw">April 12, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>



# セットアップ方法
　マイコンそれぞれの基本的なセットアップ方法・購入方法は、以下ブログ記事参照ください。

[話題のマイコン「Wio Terminal」を買ってクソゲー作って動かしてみました](https://karaage.hatenadiary.jp/entry/2020/05/18/073000)

[小型万能マイコン「M5Stack」で自分だけのクソダサいスマートウォッチを作る](https://karaage.hatenadiary.jp/entry/2018/04/16/073000)

　個人的には、最近出たばかりの話題の「Wio Terminal」がおすすめです（品切れ気味ですが）。というわけで、ここからは「Wio Terminal」で動かした様子を紹介します。私自身は「Wio Terminal」でしか試していません。また、確認環境はmacOSとなります（Windowsでも基本的な流れは同じです）のでご了承ください。

　ここからは、マイコンとArduino IDEのセットアップは一通り完了している前提で説明をします。

　Arduino IDEを起動して、メニューの「ツール」 -> 「ライブラリの管理」を起動して、検索窓で「lovyan」で検索します。以下のように「LovyanGFX」が出てくるので、右下の「インストール」ボタンをクリックします。

<img width="512" alt="lovyan_gfx_01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81919/4fc537ef-4bd4-32a9-41f1-0d892ff66c0c.png">

　「LovyanGFX」をインストールするとあとは、以下のように「ファイル」 -> 「スケッチ例」に「LovyanGFX」のサンプルが追加されます。

<img width="612" alt="lovyan_gfx_02.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81919/5c7c3bd7-f60b-f2ce-860e-2fe80c3cf158.jpeg">

　あとは、サンプルを動かしてコードを見比べて動かし方を身体で覚えていきましょう！

# 「LovyanGFX」サンプルテスト
　サンプルは選択してマイコンに書き込んだら大体そのまま動きました。以下動かしている様子です。

![lovyan_gfx_04.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81919/2027ef63-385d-733b-07fe-23dcaf11fbdc.jpeg)
ClockSample

![lovyan_gfx_03.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81919/b57e0349-9493-6a36-5c05-720657e2f6f3.jpeg)
MeterSample

　静止画なので全然伝わらないと思いますが、ヌルヌル動いて気持ち良いです。

　おすすめは「Simple Use」というサンプルですね。

![lovyan_gfx_sample.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81919/dd5139f7-ea10-d22c-133d-e08286f146e3.gif)

　色々な描写の例がまとまっているので、「LovyanGFX」をどのように使えばよいのか、コードをみながら理解ができると思います。

# 「LovyanGFX」応用例
　応用例をみつけたらとりあえず追加していこうと思います。

[Wio Terminal でカメラ画像を表示2 ー LovyanGFX 編 ー](https://homemadegarbage.com/wioterminal05)
M5StickVから画像をWio Terminalにシリアル転送してWio Terminal上で「LovyanGFX」で画像を表示しています。サブモニタ的な使い方は色々応用できそうですね。


# まとめ
　M5 Stack/M5 StickC/Wio Terminalといったマイコンで使える高性能グラフィックライブラリ「LovyanGFX」の紹介でした。

　最初、自分が「Wio Terminal」でゲーム作ったとき、画面がチラつきまくって絶望していたので、この滑らかな描写はかなり感動でした。ソフトウェアの力って凄いなと思わせてくれるライブラリです。M5シリーズやWio Terminalといったマイコンでグラフィックを使おうと考えている人は、是非チェックしてみてください。
vue-test-utils finding components with find is deprecatedの対処

# この記事は何？
vue-test-utilsの次のメジャーバージョンでは、Componentを取る目的でのfindの使用がdeprecatedになるそうなので対処方法を書きます。

# 対処方法
Componentをfindしたい時は`findComponent`メソッドを使いましょう。それ以外の用途では`find`のままでOK。

```VueTest.spec.js
// 略
expect(wrapper.find('.any-class').exists()).toBe(true) // OK
expect(wrapper.find(AnyComponent).exists()).toBe(true) // OK, but this usage is deprecated

expect(wrapper.findComponent(AnyComponent).exists()).toBe(true) // OK
// 略
```

# 参考
https://vue-test-utils.vuejs.org/api/wrapper/find.html
https://vue-test-utils.vuejs.org/ja/api/wrapper/find.html

日本語docではまだdeprecation warningが出ていないんですね。(2020/5中旬時点)
mail(mailx)コマンドでファイル内容をbodyにしてメール送信したら失敗

# 発生した問題
これまで `mail(mailx)` コマンドでメールを送信する場合は、ファイルに書き出した内容を読み込んだデータを `body` にして、送信していた。
気づいたら、メールに `.dat` なファイルが添付されるようになってしまっていた。
これは何が原因なのかを調査した結果をまとめる。

# 結論
`body` の内容を書き出したファイルの改行コードが `dos` になっていたのが原因。
以下措置を行う。

```sh:メール本文ファイルの改行コード変換
nkf -Lu --overwrite mailbody.txt;
```

# 備考
結果として以下は不要。

```sh:修正前
_rc=$(mail -s "表題：テストメール" "送信先アドレス" < "メール本文ファイル" 2> /dev/null; echo $?)
```
```sh:修正後
export LC_CTYPE=ja_JP.UTF-8
_rc=$(cat -v "メール本文ファイル"  | mail -s "表題：テストメール" "送信先アドレス" 2> /dev/null; echo $?)
```
優秀なエンジニアと、普通のエンジニアの違いを格言風に比べてみた

周りから優秀と呼ばれるエンジニアとそれ以外の平凡なエンジニア。

私は仕事柄、今まで社内、社外様々なタイプのエンジニアと関わってきましたが、この2つのタイプのエンジニアの習慣ってどう違うのかな？というところをしばらく観察した結果をわかりやすいように格言風にまとめてみたいと思います。

全てこれに当てはまるとは思いませんが、1つの参考としてご覧くださいませ。


**平凡なエンジニアは「新しいことに興味がない。むしろ否定する」
優秀なエンジニアは「新技術、トレンドに敏感ですぐに飛びつき使ってみる」**

変化を恐れるのは誰にでもあることですが、優秀なエンジニアはそれを突き抜けていきます。
常に新しい技術に目が無いので、興味のある技術はどんどん使っていきます。


**平凡なエンジニアは「自分の立場で話をする」
優秀なエンジニアは「相手の理解度に応じた話をする」**

管理職に伝えるときと、エンジニア同士で話す時では知識のベースが違います。例えば、管理職にソースコードベースの話をしても伝わりません。
相手の立場に応じて適切な言葉を使い分けながら話をすることで相手の理解も早いです。


**平凡なエンジニアは「できない理由を並べることに時間を費やす」
優秀なエンジニアは「実現するためのアイディアを考えることに時間を費やす」**

相手が相談してきたときに、できないというのは簡単ですが、それでは何も解決しません。
できるエンジニアは、万が一実現が難しい案件でも、「これは難しいので、こうだったらできる」というアイディアを提案します。


**平凡なエンジニアは「自分のことだけを考える」
優秀なエンジニアは「チーム全体のことを考える」**

優秀なエンジニアは、自分が便利だと思ったことや、チームのほかのメンバーにも有用な情報などを常に発信してくれます。
また、情報をオープンにすることで、同じ問い合わせを何度もされることを防げるので、仕事の効率化という効果もあります。


**平凡なエンジニアは「必要に迫られなければ勉強しない」
優秀なエンジニアは「勉強は趣味の一つ」**

優秀なエンジニアは、常に勉強しています。業務に直結しないプログラミング言語を学習するといったことも習慣付いています。
学習に目的が無くても、学ぶことに楽しさ、喜びを得ているので、生き生きしています。


**平凡なエンジニアは「何も考えず決まった方法で作業をこなす」
優秀なエンジニアは「もっと効率が良い方法はないか常に考えている」**

定型業務は何も考えずにやってしまいがちですが、自動化をすることで時間を節約することができる可能性があります。
優秀なエンジニアは、今まで決まっているやり方に疑問を持ち、少しづつ改善できないかを考えています。


**平凡なエンジニアは「現状の不満を言うが、現状維持」
優秀なエンジニアは「現状に満足していないため、己を磨き続ける」**

不満を言うことは一時的なストレス解消にはなりますが、非生産的な時間であることは間違いありません。
満足していない点は同じですが、そこからアクションを起こしているかどうかの違いがあります。


**平凡なエンジニアは「周りとの協調性を重視する」
優秀なエンジニアは「意見があれば真っ向から切り込んで、納得する形を見つける」**

優秀なエンジニアはたとえ上司と意見が合わなくても、自分の意見は伝えます。そこで、強引に自分の意見が正しいことを伝えるのではなく、皆が納得する形を模索して結論に持っていきます。


**平凡なエンジニアは「お金が発生しない仕事はしない」
優秀なエンジニアは「ボランティアに積極的」**

優秀なエンジニアは、地域のプログラミング教室など、ボランティア活動などにも積極的に参加します。人、社会に貢献する活動に喜びを感じます。

---
以上、違いを書いてきました。

あと、優秀なエンジニアは少し変わり者が多いですかね（笑）

優秀なエンジニアになれるよう、精進していきましょう！