OmniAICreator/Qiita-1.07M huggingface dataset:
CentOS 8にgcc 9をインストール（AppStream）

# はじめに

Application Stream(AppStream)を利用してCentOS8にgcc9をインストール
参考：[RHEL 8 でのアプリケーション開発 Red Hat Enterprise Linux 8 \| Red Hat Customer Portal](https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/8/html-single/developing_applications_in_rhel_8/index#gcc-toolset_toolsets)

## サポート

本手法で導入した場合、[Red Hat Enterprise Linux 8 Application Streams Life Cycle - Red Hat Customer Portal](https://access.redhat.com/node/4079021)より、2021-11がEOLだと思われる。
それ以降に報告された脆弱性や不具合への対応は実施されない可能性がある。

## LOG

### インストール

```shell-session
# cat /etc/redhat-release
CentOS Linux release 8.1.1911 (Core)

# yum install -y gcc-toolset-9
... 略
# scl enable gcc-toolset-9 bash
```

### 各種確認

```shell-session
# which gcc
/opt/rh/gcc-toolset-9/root/usr/bin/gcc

# gcc --version
gcc (GCC) 9.1.1 20190605 (Red Hat 9.1.1-2)
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

# yum info gcc-toolset-9
Failed to set locale, defaulting to C.UTF-8
Last metadata expiration check: 0:03:16 ago on Sat Jan 25 04:13:00 2020.
Installed Packages
Name         : gcc-toolset-9
Version      : 9.0
Release      : 3.el8
Architecture : x86_64
Size         : 2.1 k
Source       : gcc-toolset-9-9.0-3.el8.src.rpm
Repository   : @System
From repo    : AppStream
Summary      : Package that installs gcc-toolset-9
License      : GPLv2+
Description  : This is the main package for gcc-toolset-9 Software Collection.

# yum info gcc-toolset-9-gcc
Failed to set locale, defaulting to C.UTF-8
Last metadata expiration check: 0:03:43 ago on Sat Jan 25 04:13:00 2020.
Installed Packages
Name         : gcc-toolset-9-gcc
Version      : 9.1.1
Release      : 2.4.el8
Architecture : x86_64
Size         : 75 M
Source       : gcc-toolset-9-gcc-9.1.1-2.4.el8.src.rpm
Repository   : @System
From repo    : AppStream
Summary      : GCC version 9
URL          : http://gcc.gnu.org
License      : GPLv3+ and GPLv3+ with exceptions and GPLv2+ with exceptions and LGPLv2+ and BSD
Description  : The gcc-toolset-9-gcc package contains the GNU Compiler Collection version 9.
```
leetcode学習ノート_No.26

# [LeetCodeの２６番目の問題](https://leetcode.com/problemset/all/?search=26)の解決方法

LeetCodeはコーディング面接に向けた練習に使えるサイトです。自分が勉強した知識を利用して問題を解決することで学習効果を高めるためです。

![LeetCode](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551056/4e480db4-6730-c0d3-cc28-d7a2b6510e2c.png)

- 要求：指定されたソート後の配列中の重複要素を削除する
- 出力：新しい配列と配列の長さ

- サンプル１：
    - 指定された配列：nums = [1,1,2]
    - 出力結果：New_nums = [1,2], length = 2
- サンプル２：
    - 指定された配列：nums = [0,0,1,1,1,2,2,3,3,4],
    - 出力結果：New_nums = [0,1,2,3,4], length = 5

```leetcode_00026.py
import random
nums =[] #配列初期化

#ランダム関数で指定範囲の配列を作成する（重複あり）
for i in range(15):
    nums.append(random.randint(1,10))

#配列の要素をソートする
nums.sort()
print(nums[:])

#重複要素を削除する
for _ in nums:
    #最後の要素の場合for_loopから抜ける
    if nums.index(_) == len(nums)-1:
        break
    #該当要素の次の要素が一致する場合、該当要素を削除する
    elif _ == nums[nums.index(_)+1]:
        nums.pop(nums.index(_))
        continue

#結果を出力する
print("リスト",nums[:], "の長さは",len(nums))
```
- 出力結果（サンプル）  
![出力結果](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551056/00f564b9-8208-78eb-8aa6-d9183b023bf7.png)
docker-compose.ymlからサービス名だけ抽出するコマンド

docker-composeからサービス名だけ抜きたい


```
// docker-compose.yml
version: "3"
services:
  web:
    build:
      context: ./
      dockerfile: Dockerfile
    volumes:
      - ./:/go/src/app
    ports:
      - 127.0.0.1:${HTTP_PORT}:80
      - 127.0.0.1:${HTTPS_PORT}:443
    

  mysqld:
    build:
      context: ./mysql
      dockerfile: Dockerfile.mysql
    ports:
      - 127.0.0.1:${MYSQL_PORT}:3306
    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
      TZ: Asia/Tokyo
    
```

この場合 `web, mysqld` だけ抽出したい

```
$ cat docker-compose.yml|awk '/^services/,/mysqld/' | grep -E '^\s{2}\S+' | sed 's/://g' | xargs
web mysqld
```

こんな感じでやればできる。コマンドをブレイクダウンする

```
$ cat docker-compose.yml

// services~mysqldにマッチする範囲を抜き出す 
$ awk '/^services/,/mysqld/'  | \

// 先頭に2スペースと1文字以上の文字列を持つ行を抜く
$ grep -E '^\s{2}\S+'  | \

// :が邪魔なので除く
$ sed 's/://g' | \

// 改行を除く
$ xargs
```
pyinstallerでexe化したファイルを実行するとPCが落ちてしまいます

下記のコードをjupyternotebookで実行し、exeファイルは作成できましたが、実行するとPCが強制的にログアウト画面に戻ってしまいます。（mac使用）
exeファイルのサイズは8.2MBです。

```python:Tkinter.ipynb
--add-binary='/System/Library/Frameworks/Tcl.framework/Tcl':'tcl'
```
上記をなくすと落ちなくなりますが、「tcl data directory not found」というエラーになります。

どなたか詳しい方がいらっしゃいましたら、解決策をお教えいただけないでしょうか？


```python:Tkinter.ipynb

import tkinter as tk

class Application(tk.Frame):
    def __init__(self, master):
        super().__init__(master)
        self.pack()
        
        master.geometry("500x200")
        master.title("テストソフト")
        
        self.setGUI()
        
    def setGUI(self):
        self.txt1 = tk.Entry(width=50)
        self.txt1.place(x=15, y=50)
        
        self.txt2 = tk.Entry(width=50)
        self.txt2.place(x=15, y=100)
        
        self.btn = tk.Button(text="実行", command = self.btn_click, width=30)
        self.btn.place(x=125, y=150)
        
    def btn_click(self):
        if self.txt1.get() == "":
            self.txt2.delete(0, tk.END)
            self.txt2.insert(0, "")
        else:
            self.txt2.delete(0, tk.END)
            self.txt2.insert(0, self.txt1.get())
            
if __name__ == "__main__":
    win = tk.Tk()
    app = Application(master = win)
    app.mainloop()


pyinstaller --onefile  --add-binary='/System/Library/Frameworks/Tcl.framework/Tcl':'tcl' Tkinter.ipynb
```
IntelliJでanyenv経由のrbenvで入れたRubyを自動で認識させる

IntelliJ IDEAでRubyプロジェクトを作るときに、anyenv経由で入れたrbenvを認識してくれなかったので解決方法をメモ。

# 環境
* macOS mojave 10.14.6
* IntelliJ IDEA 2019.3.1 (Ultimate Edition)
* anyenv 1.1.1
* rbenv 1.1.2-17-g7795476

## やりたかったこと
タイトルまんまです。
単体で入れてたrbenvを削除してanyenv経由でインストールし直したところ、
IntelliJで新しくプロジェクトを作る際にProjectSDKとしてrbenv配下のRubyたちがリストされなくなりました。
手動でpathを指定してやればそれで済む話ではありますが、rbenv installするたびに手動でIntelliJに追加するのはめんどくさいので対処法を探しました。

## 解決方法
いきなり結論で恐縮ですが

```bash
ln -s ~/.anyenv/envs/rbenv ~/.rbenv
```

これで解決します。シンボリックリンクを貼ってるだけです。

[公式のヘルプ](https://www.jetbrains.com/help/idea/ruby-version-managers.html)によるとrbenvは正式にサポートしているけれどanyenvについてはまったく言及されていないので、おそらくanyenv経由のインストールはサポート外なんだろうと思います。

> If you have one of these version managers installed on your local machine, IntelliJ IDEA automatically detects it and lets you switch between available Ruby interpreters 

とあるのですが、おそらくこれは単純にrbenvのデフォルトのインストール先(~/.rbenv)が存在するかどうかを探しているのかなと推測します
なので試しにシンボリックリンクでanyenv配下のrbenvを参照させたところ意図した通りの動きをしてくれた、というだけの話でした。

試してないですがanyenvで入れた他のXXenvで似たような問題が起きたら同じ対処でいけるかもしれませんね。
普通にanyenvに対応してくれるのが一番早いのですが。。

ここまで書いて気がついたのですが、[こちらの記事](https://qiita.com/okay_uki/items/5c8fac9cae12b831a157#1-ruby-sdk-%E3%81%AE%E8%A8%AD%E5%AE%9A)で言及されてました。
[InteliJ 2017.3のドキュメント](https://www.jetbrains.com/help/idea/2017.3/rbenv-support.html)では上記の仕様がはっきり明記されていたみたいですね。
それ消さないで欲しかった。

## 参考
https://qiita.com/okay_uki/items/5c8fac9cae12b831a157
awkでパターンマッチかつ範囲指定する方法



awkでファイルの特定パターン間の文字列を抜きたい

[awk パターンとアクション](http://www.kt.rim.or.jp/~kbk/gawk-30/gawk_9.html)

例えば, docker-compose.ymlからパターンマッチで文字列を抜き出す

```
version: "3"
services:
  web:
    build:
      context: ./
      dockerfile: Dockerfile
    
  mysqld:
    build:
      context: ./mysql
      dockerfile: Dockerfile.mysql
   
```

awkの使い方は以下

```
$ awk '/開始地点のパターン/,/終了地点のパターン/'
```

`,(カンマ)` が範囲指定を意味するらしい。

```
$ cat docker-compose.yml | awk '/^service/,/mysqld/'

services:
  web:
    build:
      context: ./
      dockerfile: Dockerfile

  mysqld:
```

こんな感じの挙動になる。

docker-composeからサービス名だけ抜くときとかに便利
npm のError: Cannot find module 'are-we-there-yet' に対処する

# npm でError: Cannot find module 'are-we-there-yet' というエラーが出た．
```bash
$ npm

internal/modules/cjs/loader.js:796
    throw err;
    ^

Error: Cannot find module 'are-we-there-yet'
Require stack:
- /usr/local/lib/node_modules/npm/node_modules/npmlog/log.js
- /usr/local/lib/node_modules/npm/bin/npm-cli.js
    at Function.Module._resolveFilename (internal/modules/cjs/loader.js:793:17)
    at Function.Module._load (internal/modules/cjs/loader.js:686:27)
    at Module.require (internal/modules/cjs/loader.js:848:19)
    at require (internal/modules/cjs/helpers.js:74:18)
    at Object.<anonymous> (/usr/local/lib/node_modules/npm/node_modules/npmlog/log.js:2:16)
    at Module._compile (internal/modules/cjs/loader.js:955:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:991:10)
    at Module.load (internal/modules/cjs/loader.js:811:32)
    at Function.Module._load (internal/modules/cjs/loader.js:723:14)
    at Module.require (internal/modules/cjs/loader.js:848:19) {
  code: 'MODULE_NOT_FOUND',
  requireStack: [
    '/usr/local/lib/node_modules/npm/node_modules/npmlog/log.js',
    '/usr/local/lib/node_modules/npm/bin/npm-cli.js'
  ]
}
```

「[node.js をアップデートしたら、npm でエラー](https://qiita.com/yokoh9/items/4ea3fa0e24623e53fc69)」を読む限り，npm のみが壊れているようなので，npm をすばやく葬り去って

```bash
cd /usr/local/lib/node_modules

rm -rf npm
```

公式のgithub「[npm(1) -- a JavaScript package manager](https://github.com/npm/cli)」に行って，

```bash
curl -L https://www.npmjs.com/install.sh | sh
```
ドキュメント通りnpm を入れ直して解決！

```bash
$ npm

Usage: npm <command>

where <command> is one of:
    access, adduser, audit, bin, bugs, c, cache, ci, cit,
    clean-install, clean-install-test, completion, config,
    create, ddp, dedupe, deprecate, dist-tag, docs, doctor,
    edit, explore, fund, get, help, help-search, hook, i, init,
    install, install-ci-test, install-test, it, link, list, ln,
    login, logout, ls, org, outdated, owner, pack, ping, prefix,
    profile, prune, publish, rb, rebuild, repo, restart, root,
    run, run-script, s, se, search, set, shrinkwrap, star,
    stars, start, stop, t, team, test, token, tst, un,
    uninstall, unpublish, unstar, up, update, v, version, view,
    whoami

npm <command> -h  quick help on <command>
npm -l            display full usage info
npm help <term>   search for help on <term>
npm help npm      involved overview

Specify configs in the ini-formatted file:
    /Users/kohei/.npmrc
or on the command line via: npm <command> --key value
Config info can be viewed via: npm help config

npm@6.13.6 /Users/whoami/.nodebrew/node/v12.14.1/lib/node_modules/npm
```
Raspberry Pi でよく使うコマンド

よく忘れてググるので自分用のメモとして残しておきます。

# システム関連
## プロセス確認
```bash
$ htop
```

##ファームウェアバージョン
```bash
$ uname -a
Linux raspberrypi 4.19.75-v7l+ #1270 SMP Tue Sep 24 18:51:41 BST 2019 armv7l GNU/Linux
```

## Raspberry piの基本設定(OCはメニューがあるけど使えない)
```
$ sudo raspi-config
```

## カーネルメッセージ確認
```bash
# メッセージのリアルタイム監視(USB接続確認など)
$ dmesg -H -w

# -w を外せば最終出力だけ見られる
$ dmesg -H
```

## HDD
```bash
# HDDデバイスの確認
$ sudo fdisk -l | grep Disk | grep -v -e ram -e mmc

# HDD, SD Cardの確認
$ sudo fdisk -l | grep Disk | grep -v -e ram

# HDDのID確認
$ sudo blkid /dev/sdx # id確認 xは可変

# マウント
$ sudo mount -t <fs type> <device> <mount point>

# アンマウント
$ sudo umount <device>

# マウントの確認
$ df -h
```

### HDD マウント
- HDDデバイスの確認

```bash
$ sudo fdisk -l | grep Disk | grep -v -e ram -e mmc
```

- マウントポイントを作成

```bash
# HDDのマウント先のマウントポイントを作成
$ mkdir /mnt/hdd2 # ディレクトリ名は任意

# ログインユーザーを変えないとroot以外で書き込み出来なくなる
# mountしたら変えられないので一度umountする必要あり
$ sudo chmod <user>:<user> /mnt/hdd2 
```

- マウント(ext4)

```bash
$ sudo mount -t ext4 /dev/sdx /mnt/hdd2
```

- マウント(FAT32)

FAT32の場合、charsetにUTF8を指定しないとマルチバイト文字のファイルを扱えない

```bash
$ sudo mount -t vfat -o iocharset=utf8 /dev/sdb1 /mnt/hdd2 
```

- マウント(NTFS)

```bash
# ntfs 3gが必要なのでインストールされているか確認
$ sudo dpkg -l | grep ntfs-3g
# インストールされていなければインストールする
$ sudo apt install ntfs-3g

$ sudo mount -t ntfs-3g /dev/sdb1 /mnt/hdd
```

- マウントの確認

```
$ df -h
```


## USB確認
```bash
$ lsusb -t
```

## カードリーダー動作確認
```
$ sudo pcsc_scan
```

## CPU温度
```
$ vcgencmd measure_temp
# temp=52.0'C
```

## CPU周波数(デフォルト)MHz
```
$ vcgencmd get_config arm_freq | cut -c 10-
# 1500
```

## CPU周波数(実際)
```
$ vcgencmd measure_clock arm
# frequency(48)=600169920

$ echo $((`vcgencmd measure_clock arm | cut -c 15-`/1000/1000))
# 600MHz
```

## CPUのメモリ使用量
```
$ vcgencmd get_mem arm
# arm=948M
```

## GPUのメモリ使用量
```Shell
$ vcgencmd get_mem gpu
# gpu=76M
```

## 電圧
```Shell
$ vcgencmd measure_volts
# volt=0.8349V
```

## Wi-Fiを探す
```
$ sudo iwlist wlan0 scan | grep ESSID
```

# recdvb 録画コマンド
## 録画
```Shell
# recdvb [--dev <チューナ番号>] --b25 --strip チャンネル番号 録画秒数 録画ファイル名
$ recdvb --dev 0 --b25 --strip 22 10 test.m2ts

# BS/CSはチューナーがないので未確認
```
mirakurun等が動作中の場合はエラーになるのでしばらく待ってから試すと良い。

## シグナル取得
```Shell
$ recdvbchksig [--dev devicenumber] channel

# Options:
# --dev N:             Use DVB device /dev/dvb/adapterN
# --help:              Show this help
# --version:           Show version
```

## recdvbプロセスコントロール
```
$ recdvbctl --pid pid [--channel channel] [--sid SID1,SID2] [--tsid TSID] [--extend time_to_extend] [--time recording_time]

# Options:
# --pid:               Process id of recdvb to control
# --channel:           Tune to specified channel
# --sid SID1,SID2,...: Specify SID number in CSV format (101,102,...)
# --tsid TSID:         Specify TSID in decimal or hex, hex begins '0x'
# --extend:            Extend recording time
# --time:              Set total recording time
# --help:              Show this help
# --version:           Show version
```
【ReactNative】No bundle URL presentエラーの対処法メモ

# 概要
以前に[ReactNativeの開発環境を構築する話(Mac編)](https://qiita.com/nekoniki/items/b7610e9798819f1c2464)なんて記事を書いたのですが、久しぶりにそれに従って新規に開発環境を構築してみたらよくわからないエラーに遭遇した話。

**※本記事に記載されているのは、あくまで推察と暫定的な対処のメモです。間違い、指摘等がございましたらコメントにていただけますと幸いです。**

# エラー内容
`Xcode`, `VSCode``Homebrew`, `Nodebrew`, `cocoapods`, `npm`, `yarn`,`react-native-cli`などなど色々入れて新規にプロジェクトを作成。

```
react-native init Puni
cd Puni/ios
pod install
react-native run-ios
```

すると、`Simurator`が立ち上がり`bundle`も動いている様子。
しかしながら下記のように`No bundle URL present`のエラーに遭遇。
![nobundle.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435429/42152c6b-43a3-11a4-b32e-dbaf6daa1829.png)

どうやらアプリから`bundle`が見れていないようなのだが・・・
類似の事例を調べてみたら[React Native「No bundle URL present」エラー対策集](https://qiita.com/wktq/items/9139f4c0bdf52bd71c93)のような記事を発見。
パッケージを入れ直したり、キャッシュを消してみたり、と一通り試してみたが解消されず。

# 解決策

もうダメかと思ったが、今度は下記のような記事を発見。

[main.jsbundle file showing in my iOS project but still throwing “No bundle url present”](https://stackoverflow.com/questions/57822215/main-jsbundle-file-showing-in-my-ios-project-but-still-throwing-no-bundle-url-p)

なにやら`main.jsbundle`がうまく作成されていないっぽい？

解決策にある通りにコマンドラインから`main.jsbundle`を作り直してみる。

```
react-native bundle --entry-file='index.js' --bundle-output='./ios/main.jsbundle' --dev=false --platform='ios' --assets-dest='./ios'
```

さらに`Xcode`から`xcworkspace`を開き、`main.jsbundle`の`Target Membership`を設定しなおす(下図)
![hoge.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435429/9b8ee0aa-9923-3cb4-dd27-078c2d0cc96a.png)

ダメ元で`react-native run-ios`を実行すると・・・
**直った!!**

# 考察・まとめ
何が悪さをして`main.jsbundle`が作成されていない(クラッシュしてる？)のかは今のところ分かっていないが、あるとすれば`react-native-cli`とかその他諸々の特定のバージョンの組み合わせのように思える。

`react-nativeのIssue`を`main.jsbundle`で調べた(リンクは[こちら](https://github.com/facebook/react-native/issues?utf8=✓&q=is%3Aissue+is%3Aopen+main.jsbundle))ら似たような事例が出ていたので、いずれ解消・再発するかもしれません。

はっきりとした原因が不明なまま記事に起こしてしまい恐縮ですが、メモ書きとして残しておきます。
Gem::MissingSpecVersionErrorでrails serverできない


# 問題
「rails server」を実行しようとしたら、エラーが出た。

```
$ rails server
(Gem::MissingSpecVersionError)
To update to the latest version installed on your system, run `bundle update --bundler`.
To install the missing version, run `gem install bundler:2.1.2`
```
### 解決策
以下のコマンドを実行する。

```
$ bundle update --bundler
```
```
$ gem install bundler:2.1.2
```
僕の場合、２つ目のコマンド「gem install bundler:2.1.2」でまたエラーが出たので対処する。
# 問題
「gem install bundler:2.1.2」を実行しようとすると、またエラーが出た。

```
$ gem install bundler:2.1.2
ERROR:  While executing gem ... (Gem::FilePermissionError)
    You don't have write permissions for the /Library/Ruby/Gems/2.6.0 directory.
```
### 解決策
まずはgemやrubyがどのパスを指しているのか現状の確認をする。
以下の結果からわかるように/usr/binというシステムのパスを指していることがわかる。

```
$ which ruby                 
/usr/bin/ruby
```
```
$ which gem                  
/usr/bin/gem
```
調べると、システムのrubyを利用しているため、権限不足でgemのインストールができない可能性が高いみたいです。「[gem installでpermissionエラーになった時の対応方法](https://qiita.com/nishina555/items/63ebd4a508a09c481150)」が参考になりました。

### rbenvでrubyを管理する
まずはrbenvのインストールする。

```
$ brew update
$ brew install rbenv ruby-build
```
続いて、rbenvの管理下にrubyをインストールする。
僕の場合は、Railsチュートリアルを進めているので、今回は2.6.1をインストールする。

```
rbenv install 2.6.1
```
globalで利用できるように変更する。

```
$ rbenv global 2.6.1
```
rbenvにパスを通すため、シェルの設定ファイル(.bashrcや.zshrc)に以下を追加する。

```
[[ -d ~/.rbenv  ]] && \
  export PATH=${HOME}/.rbenv/bin:${PATH} && \
  eval "$(rbenv init -)"
```
シェルを再起動後、以下コマンドを実行して、もう一度gemとrubyのパスを確認してみる。

```
$ which ruby                 
```
```
$ which gem                  
```
はじめはシステムのパスを指していましたが、以下のようにrbenvのパスを指していることがわかる。
# rails serverを実行する
```
$ rails server                 
rbenv: rails: command not found

The `rails' command exists in these Ruby versions:
  2.7.0

```
Railsが見つからない？と言ってそうなので、Railsのバージョンを指定してインストールする。

```
$ gem install -v 5.1.6 rails 
```
もう一度rails serverを実行する。

```
$ rails server  
.
.
.
Use Ctrl-C to stop
```
立ち上がったっぽいので、[http://localhost:3000/](http://localhost:3000/)にアクセスして画面が表示されるか確認する。

”無事に画像も表示されて、サーバーを立ち上げることができました！”

### 参考
[gem installでpermissionエラーになった時の対応方法](https://qiita.com/nishina555/items/63ebd4a508a09c481150)
UWSC： ie11でのcomエラー

画面遷移時のcomエラーに対処する。

```uwsc
//追加
DEF_DLL SendMessageA(Hwnd,Long,Long,Dword): bool: user32.dll
CONST WM_ACTIVATE = $06

procedure ieWait(ie)
    repeat
        sleep(0.1)
    until (!ie.busy) and (ie.readystate = 4)
    sleep(0.2)
    SendMessageA(ie.Hwnd, WM_ACTIVATE, 0, 0)//追加
fend
 //sleep()も適切に必要
dockerでmysqlコンテナを立てる時の設定 my.cnf

# dockerでmysqlコンテナを立てる時の設定 my.cnf

mysqlのconf について学ぶ。

ざっと出すとこんな感じ


```conf
[mysqld]
skip-host-cache
skip-name-resolve
character-set-server=utf8mb4

[client]
default-character-set=utf8mb4
```

mysql server, clientの設定がそれぞれ書いてある。

# server 設定 mysqld

### skip-host-cache

[https://www.na3.jp/entry/20140205/p1:embed:cite]

[https://dev.mysql.com/doc/refman/5.6/ja/host-cache.html:title]


これはDNSのキャッシュ戦略機能をオフにする宣言。

ipアドレスから引かれたホスト名がすでにキャッシュされている時にそれを使い回す機能があるそう。

docker-composeでコンテナを立てる場合、docker networkがよしなにprivate ipを当ててくれるからわざわざdnsで名前解決しなくていい。

### skip-name-resolve

[http://gihyo.jp/dev/serial/01/mysql-road-construction-news/0028:embed:cite]


[https://dev.mysql.com/doc/refman/5.6/ja/host-cache.html:title]


これも同様にDNSの名前引きを飛ばす設定。


### character-set-server=utf8mb4

`mb4` がポイント。

mysqlのutf8は1-3byte文字しか扱えない。

iOS, Androidの絵文字, 最近追加された難しい日本語や中国語は4byteあるためこれらの文字列を格納しようとするとエラーが起きる。

そこで utf8mb4を使う。

[https://flhouse.co.jp/article/2/utf8mb4:embed:cite]


clientも同じ
[presto][SQL] テーブル同士の差分をとりたい時に役立つ ~EXCEPT~

## 結論
exceptを使おう。

## Definition
[from Presto 0.230 Documentation / 8.31. SELECT](https://prestodb.io/docs/0.230/sql/select.html)

`EXCEPT` returns the rows that are in the result set of the first query, but not the second. The following is an example of one of the simplest possible `EXCEPT` clauses. It selects the values `13` and `42` and combines this result set with a second query that selects the value `13`. Since `13` is also in the result set of the second query, it is not included in the final result.:

```.sql
SELECT * FROM (VALUES 13, 42)
EXCEPT
SELECT 13;
```

```
 _col0
-------
   42
(2 rows)
```

## やってみる。
```.sql
with
  cte_pref_a as(
    select
      id
      , name
    from
      prefecture
  )
  , cte_pref_b as(
    select
      id
      , name
    from
      prefecture
    where
      prefecture.id < 40
  )
  , cte_except_b_from_a as(
    -- a から b を除外する
    select * from cte_pref_a
    except
    select * from cte_pref_b
  )

select
  *
from
  cte_except_b_from_a
order by
  id
```

|  id  |    name      |
|  ---  |    ---      |
| 40 | 福岡県   |
| 41 | 佐賀県   |
| 42 | 長崎県   |
| 43 | 熊本県   |
| 44 | 大分県   |
| 45 | 宮崎県   |
| 46 | 鹿児島県 |
| 47 | 沖縄県   |

## レコード単位ではなくて、カラム単位でいける?

```.sql
with
  cte_pref_a as(
    select
      id
      , name
    from
      prefecture
  )
  , cte_pref_b as(
    select
      id
      , if( length(name) > 3, substr(name,1,3), name) as name
      -- 4文字以上のやつを、3文字にする
      -- 例) 神奈川県 → 神奈川
    from
      prefecture
  )
  , cte_except_b_from_a as(
    select * from cte_pref_a
    except
    select * from cte_pref_b
  )

select
  *
from
  cte_except_b_from_a
order by
  id
```

|  id | name  |
| ---  |  --- |
|14 | 神奈川県 |
|30 | 和歌山県 |
|46 | 鹿児島県 |

## 他も試したらいけた
```.sql
with
  cte_pref_a as(
    select
      id
      , name
      , id as id2
    from
      prefecture
  )
  , cte_pref_b as(
    select
      id
      , if( length(name) > 3, substr(name,1,3), name) as name
      -- 4文字以上のやつを、3文字にする
      -- 例) 神奈川県 → 神奈川
      , if( id < 10, id-1, id) as id2
      -- id < 10 なら id - 1 する
    from
      prefecture
  )
  , cte_except_b_from_a as(
    select * from cte_pref_a
    except
    select * from cte_pref_b
  )

select
  *
from
  cte_except_b_from_a
order by
  id
```

| id  | name  |  id2 |
| ---  | ---  | ---  |
|1 |北海道| 1 |
|2 |青森県| 2 |
|3 |岩手県| 3 |
|4 |宮城県| 4 |
|5 |秋田県| 5 |
|6 |山形県| 6 |
|7 |福島県| 7 |
|8 |茨城県| 8 |
|9 |栃木県| 9 |
|14  |神奈川県 | 14 |
|30  |和歌山県 | 30 |
|46  |鹿児島県 | 46 |

## 注意
```.sql
select * from A
except
select * from B
```

において、 **A - B の構造** になる。
なので

- **レコード数は A > B でないと結果が期待とずれることも**
- **Aに新しいもの、Bに古いものにしないと期待結果とずれることも**

あるので注意。
中央にしたいのですが、どうすればいいですか？

<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <title>初心者向けホームページテンプレート</title>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta name="description" content="ここにサイト説明を入れます">
    <meta neme="keywords" content="キーワード１,キーワード２,キーワード３,キーワード４,キーワード５,">
    <link rel="stylesheet" href="css/style.css">
  </head>
  <body>
    <div id="container">
      <header>
        <h1 id="logo">
          <a href="index.html">
            <img src="img/logo.png" alt="SAMPLE SITE">
          </a>
        </h1>
        <aside id="mainimg">
          <img src="img/mainimg.jpg" alt>
        </aside>
      </header> 
      <nav id="menubar">
        <ul>
          <li><a href="index.html"></a>Home</li>
          <li><a href="about.html"></a>About</li>
          <li><a href="gallery.html"></a>Gallery</li>
          <li><a href="link.html"></a>Link</li>
        </ul>
      </nav>
    </div>
  </body>
</html>
CSS
#header {
    text-align: center;
    display: block;
}

#menubar {
    text-align: center;
    font-size: 18px;
    margin-bottom: 40px;
}
ヘッダーのSAMPLESITEとナビのHome About Gallery Linkが中央にいかないのですが、なぜでしょうか？
[Modelica]functionの非因果性

すごく小さいTipsだが、functionで定義するとalgorithmセクションで書かれていても非因果となる。

例えば、

y=x+1

という式があったとしてalgorithmで書きたいとする。


以下のような、y=f(x)の式をy=function(x)で書けば非因果となる。つまり、yに値を代入するとxが求まる。便利。
計算順序が決まるので計算も安定するという噂もある。

```
model a

  Real x;
  Real y;
  
    function func
      input Real x;
      output Real y;
    algorithm
      y:=x+1;
      
    end func;
  
  equation
  y=1;
  y=func(x);

end a;
```

計算結果はちゃんと x= 0　となる。
rubyのmap関数ではreturnではなくnextをつかう

rubyで以下の様なコードを実行しようとして失敗した話

```ruby
def hoge()
  (1..5).map do |i|
    return 'this is 3' if i == 3
    #~ 複雑な処理 ~
    i
  end
end

p hoge # => "this is 3"
```

なんとなく上記のようなコードを実行したらmapの結果は```[1, 2, 'this is 3', 4, 5]```の配列がかえってくると思っていたけど実際には"this is 3"が返ってきたので、慌ててrubyのドキュメントを読んでたら、nextを使う必要があるみたい。
nextも引数を取れるので、条件式が正(true)の時に返したいデータをnextの引数に渡す様にしてあげる。

つまり以下の様にするのが正しい。

```ruby
def hoge()
  (1..5).map do  |i|
    next 'this is 3' if i  == 3
    #~ 複雑な処理 ~
    i
  end
end

p hoge # => [1, 2, 'this is 3', 4, 5]
```

あやうくバグを仕込むことになった…


ちなみにJavaScriptとか他の言語ではreturnが多いからrubyもreturnだと思ってた。

```javascript
var arr = [1, 2, 3, 4, 5];
map_arr = arr.map(i => {
    if (i == 3) {
        return 'this is 3';
    }
    // ~ 複雑な処理 ~
    return i
})

console.log(map_arr) // [ 1, 2, 'this is 3', 4, 5 ]
```
LeetCode - 21. Merge Two Sorted Lists


# ListNodeをつくる

配列からListNodeのテストデータを作る

```ruby

# Definition for singly-linked list.
class ListNode
  attr_accessor :val, :next
  def initialize(val)
    @val = val
    @next = nil
  end
end

def create_list_node(array)
  array_of_list_nodes = array.map{|n|
    ListNode.new(n)
  }

  lns = ListNode.new(0)
  buf = lns
  array_of_list_nodes.each{|ln|
    lns.next = ln
    lns = lns.next
    #p lns
    #p buf
  }
  buf.next 
end

ln1 =  create_list_node([1,2,4])
ln2 =  create_list_node([1,3,4])

```

- `buf` のところがポイント

# ListNodeをマージする

```ruby

def merge_two_lists(ln1, ln2)
  ln3 = ListNode.new(0)
  buf = ln3

  while ln1 && ln2
    if ln1.val <= ln2.val
      ln3.next = ln1
      ln1 = ln1.next
    else
      ln3.next = ln2
      ln2 = ln2.next
    end
    ln3 = ln3.next
  end
  
  ln3.next = ln1 || ln2 
  buf.next
end

```

- `buf` のところがポイント
- 条件式 `ln1 && ln2`はどちらかが `nil`で`false`
- `buf` は先頭ノードを仮に`0`で作ってるので、`next`を返す 

# スコア

```yaml

Runtime: 72 ms, faster than 10.21% of Ruby online submissions for Merge Two Sorted Lists.
Memory Usage: 9.6 MB, less than 100.00% of Ruby online submissions for Merge Two Sorted Lists.
```
【超初心者】React のcontextAPIを使ってみる

#はじめに

reactのcontextAPIについて勉強したのでメモ。

![スクリーンショット 2020-01-25 10.39.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498892/ff28b996-0a9a-932c-2092-bef0e60a206b.png)


最終的には文字を入力して、submitを押すと入力した文字が出てくるようにして、todoアプリのようにしたいのですが、そこにくる前に力着きました。
現状では、文字を入力するとその文字が表示されてます！
初心者なので間違ってたりしたり、アドバイスがあったらコメントよろしくお願いします。


コードは親コンポーネントのApp.jsの中に、inputやsubmitできるbuttonなどがあるform.js と　入力された文字がPrivider Consumerを通して渡されて表示されるtodo.jsの2つが子コンポーネントとしてあります。

#参考記事
[React Context APIについて](https://qiita.com/gipcompany/items/f867bc7e9241f2387ce9)

先に上記の記事を読んで、違うバージョンのcontextAPIを見てみたいと思った人用です。上記の記事がめちゃくちゃわかりやすかったです！！しかも動画つき。

#実装方法


```
npm init react-app contextAPI
```

作った物を yarn start します。

ファイルの構造は

-- App.js
-- src
がありsrcの中にcomponents,contexts
components の中に　form.js todo.js
contexts   の中に　formContext.js

ディレクトリのわかりやすい書き方がわかりませんでした。見にくくてすみません。

#コード

```App.js
import React from "react";
import "./App.css";
import Form from "./components/form";

class App extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      text: ""
    };
  }

  render() {
    return (
      <div className="App">
        <h1>hello</h1>

      <Form />
      </div>
    );
  }
}

export default App;
```

```src/conponents/form.js
import React from "react";
import Todo from "./todo";
import FormContext from "../contexts/formContext";

class Form extends React.Component {
  constructor(props) {
    super(props);

    this.handleChange = this.handleChange.bind(this);
    this.onSubmit = this.onSubmit.bind(this);
    this.state = {
      text: ""
    };
  }

  onSubmit = event => {
    this.setState({ text: this.state.text });
  };

  handleChange = event => {
    this.setState({ [event.target.name]: event.target.value });
    console.log(event.target.value)
  };
  render() {
    return (
      <div>
        <input
          type="text"
          name="text"
          onChange={this.handleChange}
        />
        <button
          onClick={this.onSubmit}>submit</button>

        <FormContext.Provider value={this.state}>
          <Todo />
        </FormContext.Provider>
      </div>
    );
  }
}
export default Form;
```
FormContext.Providerでvalueとして上のconstructorのtextをtodo.jsに渡してます。textだけじゃなくて、handleChange、onSubmit　などの関数も渡せます。

```src/components/todo.js
import React from "react";
import FormContext from "../contexts/formContext";

const Todo = () => (
  <FormContext.Consumer>
    {({ text }) => {
      console.log(text);
      return <div>{text}</div>;
    }}
  </FormContext.Consumer>
);
export default Todo;
```
ここではtextを受け取ってます。つまり、inputで入力された文字を受け取ってます。

``` src/contexts/formContexts.js
import { createContext } from "react";

const FormContext = createContext();
export default FormContext;
```

ここはあまり詳しくわからなかったのですが、Providerとconsumerの間で処理している物らしいです。
[Unity初心者Tips]Prefabなしもアリ！GameObjectを動的に生成する

初心者向けの本などで学習していると、何かをSceneに配置するときにはPrefabをあらかじめ用意してから`Instantiate`を用いることが多いですが、それは要らないときもある、という話です。

#コンストラクタから作るGameObject

`GameObject`型はコンストラクタが在り、それを実行することで動的に生成することが可能です。

```csharp
GameObject hogeGameObject = new GameObject("Hoge");
```

参考：[GameObject-GameObject - Unity スクリプトリファレンス
https://docs.unity3d.com/ja/2017.4/ScriptReference/GameObject-ctor.html](https://docs.unity3d.com/ja/2017.4/ScriptReference/GameObject-ctor.html)

新たに`GameObject`をSceneに配置可能です。必要に応じて`AddComponent`すればほしい機能を持った`GameObject`も簡単にメモリ上に展開できます。

## 無駄を減らせる？注意してみよう

- これを利用することで予めPrefabで用意しInstantiateが要らなくなる
- 無駄に常駐させるGameObjectを減らせる可能性がある

こうした利点があるので、「これは一時的に存在すれば済む」というものには積極的に利用する検討をしてみましょう。頻繁に生成や削除をする場合は、コストがかさむのでお勧めしません、適宜、パフォーマンスをどうしたらよくなるか、考えながら作りましょう。

# Sceneに在るGameObjectをコピーする方法

prefabを用いない方法には他に、Scene内の`GameObject`を参照して`Instantiate`で複製するという方法もあります。

```csharp

GameObject origin = GameObject.Find("Hoge"); //元になるHogeを探す
GameObject hogeGameObject = new GameObject(origin); //Hogeを複製
```

この場合は予めSceneに存在しないと出来ないので、何か在るものを増やしたいときには有効です。あまり頻繁にやると、newと同じくらいのコストがかさむので注意は必要です。

# Prefabが要るかの使い分け

Prefabを用いた場合、以下の特徴があります。

- ファイルが分れるので別の人に作業分担してもらいマージしやすい
- `AddComponent`で追加がたくさんある場合コストが下がる
- エディタでコンポーネントの操作をするのでゲームデザイナーにもいじるのが優しい
- Scene内の何かの参照は持てないので動的にやりくりする仕組みは必要（GameObjectのコンストラクタを用いた後の処理と似たものが要る）

こうしたことを踏まえて、考えていきましょう。データの分け方には`Scene`で分ける方法もあるので、チームでどうしたいのか、更新するとしたらどのAssetの単位でやったらいいのか、なども考えると良いですね。

参照などの話はこちらも参考になります。
[【Unity】動的に増やすGameObjectは別にPrefabでなくとも良い
http://tsubakit1.hateblo.jp/entry/2018/03/01/005236](http://tsubakit1.hateblo.jp/entry/2018/03/01/005236)
Vim スクリプトの補完候補に補足情報をつけたい

## はじめに

Vim スクリプトの `complete()` 関数による補完候補について調べています。

そこで、補完候補を選択したときに入力される文字列とは別に、補完候補に表示される情報に補足情報を付ける方法がないかを調べてみました。

## tl;dr

補完候補となる配列の各要素を、辞書型のデータで定義すればできました。
以下のような形です。

```vim
inoremap <F8> <C-R>=MyComplete()<CR>
func! MyComplete()
  call complete(col('.'), [
\ {'word': '1st', 'abbr': '1st:', 'menu': 'first element'},
\ {'word': '2nd', 'abbr': '2nd:', 'menu': 'second element'},
\ {'word': '3rd', 'abbr': '3rd:', 'menu': 'third element'}])
  return ''
endfunc
```

上記を設定し、インサートモードで `<F8>` キーで押し、補完を表示すると以下のようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222030/b29591c3-51ec-1c01-7637-e0149f4d8de5.png)

以下のように表示されていることがわかると思います。

* 入力された文字： `1st`
* 補完候補の最初の表示： `1st:`
* 補完候補の補足： `first element`

## 辞書型のキーについて

補完候補の各要素に指定するキーの用途は以下のとおりです。他にも使えるキーがありますが、[Vim のマニュアル](https://vim-jp.org/vimdoc-ja/insert.html#complete-items) に載っています。

キー|用途
:--|:--
`word`|挿入されるテキスト。必須
`abbr`|"word" の略。これが空でなければ、メニューで "word" の代わりに表示される。
`menu`|ポップアップメニューにおける追加情報。"word" または "abbr" の後に表示される。

## おわりに

補完の候補に補足情報も追加できることがわかってよかったです。より便利に使えそうです。

## 参考

* [insert - Vim日本語ドキュメント](https://vim-jp.org/vimdoc-ja/insert.html#complete-items)
* [vimで独自の補完を設定する(complete関数の使い方) -- ぺけみさお](https://www.xmisao.com/2014/05/01/vim-complete.html)
プロゲートHTML,CSS中級編

#今回はプロゲートでHTML、CSSの中級編をやりました。
中級編も昔にやったことがあったのでそんなに苦労しなかったです。ただ、当たり前ですが初級編に比べると難しくなっており、復讐をする必要があると感じました。具体的にはpotisionのところなでが少し理解するのに時間がかかりました。
##HTML、CSSの中級編の要約
親要素や子要素、positionなどについて学び、ボタンの作り方やアイコンの作り方について学んで。クラスごとに意識してCSSを適応察せていかないとミスを起こしたりする。
cognitoに登録したユーザでpostmanでログインする簡単な方法

Gakuです。
firebase authenticationからcognitoにIDaaS乗り換え計画実施中です。
postmanでcognitoに登録したユーザのtokenを取得する方法で少しハマったので、自分用にやり方記載しておきます。

# cognitoの設定
全般設定>アプリクライアントからアプリクライアントを作成し、以下のように設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47132/eceec8fa-ce27-ad73-3169-2be3f796f560.png)

アプリの統合>アプリクライアントの設定で以下のように設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47132/b2eba813-52db-76e7-a0d3-249b4f88b7eb.png)

アプリの統合>ドメイン名の設定で以下のように設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47132/f690e3a1-c4ce-aed3-d7f5-c4986de846f8.png)
(※ドメイン名は何でもOK

# postmanの設定
認証タブでTypeをOauth2.0に設定Get New AccessTokenを押すと設定windowが表示されるので、以下のように設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47132/2b592bf9-635b-7f94-da9f-5e5564ad7267.png)
(※Auth URLは先程設定したドメイン+/loginであることに注意

Request Tokenをクリックするとログインwindowが表示される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47132/c47c11f7-a282-9ccb-2771-8854468b17b0.png)

cognitoに登録したユーザでログインすれば無事AccessTokenをゲットできる！

# おわりに
firebase authenticationの時よりpostman上でaccess tokenをゲットするのは楽。
久しぶりにaws触ってるけど楽しい(´・ω・`)
wslでubuntu その9

#概要

wslでpython-opencvやってみる。
輪郭を検出して、背景を消すをやって見た。

#環境

windows10 64bit

#インストール

```
sudo apt install Python3-opencv
```

#元画像
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F437144%2F3f9fb333-b014-c30b-ca7e-75fca4bcc636.png?ixlib=rb-1.2.2&auto=format&gif-q=60&q=75&w=1400&fit=max&s=dc280780123fd27b10351f6ddec91843)

#結果
![res14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/116a2b18-ef07-bf8b-2f5d-c2cc5bbd5b6c.png)


#サンプルコード

```
import numpy as np
import cv2

img = cv2.imread("cat0.jpg")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray, 5, 70)
edges = cv2.dilate(edges, None)
edges = cv2.erode(edges, None)
h, w = img.shape[ : 2]
back = np.ones((h, w, 3), np.uint8) * 255
contour_info = []
contours, _ = cv2.findContours(edges, cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE)
for c in contours:
	contour_info.append((c, cv2.isContourConvex(c), cv2.contourArea(c), ))
contour_info = sorted(contour_info, key = lambda c: c[2], reverse = True)
max_contour = contour_info[0]
mask = np.zeros(edges.shape)
cv2.fillConvexPoly(mask, max_contour[0], (255))
kernel = np.array([[0.0, -1.0, 0.0], [-1.0, 5.0, -1.0], [0.0, -1.0, 0.0]])
mask = cv2.filter2D(mask, -1, kernel)
res = np.where(np.expand_dims(mask < 1, -1), back, img)
cv2.imwrite('res14.png', res)
```

以上。
MySQL の バイナリログ の消し方

# MySQL の バイナリログ
/etc/my.cnf に log-bin = log-name を設定するとバイナリログを出力できますが、
デフォルトの設定だと MySQL を再起動したタイミングやバイナリログの最大容量(デフォルトでは最大の1GB)に達した時点でローテートされログが増え続けてしまいます。

### 現在の設定
```conf:/etc/my.cnf
[mysqld]
log-bin = log-name
```

### log の状況
```bash
# ls /var/lib/mysql/
-rw-rw----  1 mysql mysql 10491971 12月 19 12:37 log-name.000001
-rw-rw----  1 mysql mysql      143 12月 19 13:04 log-name.000002
-rw-rw----  1 mysql mysql  1718471  1月 21 09:07 log-name.000003
-rw-rw----  1 mysql mysql       60 12月 19 13:05 log-name.index
```

#### show master logs の状況
```sql
mysql> show master logs;
+-------------------+-----------+
| Log_name          | File_size |
+-------------------+-----------+
| ujm-server.000001 |  10491971 |
| ujm-server.000002 |       143 |
| ujm-server.000003 |   1718471 |
+-------------------+-----------+
```

## 手動でのバイナリログを削除
### SQL を実行

```sql
mysql> purge master logs to 'ujm-server.000001';
Query OK, 0 rows affected (0.01 sec)
```

### 結果を表示
```sql
mysql> show master logs;
+-------------------+-----------+
| Log_name          | File_size |
+-------------------+-----------+
| ujm-server.000002 |       143 |
| ujm-server.000003 |   1718471 |
+-------------------+-----------+
2 rows in set (0.00 sec)
```

## 自動でバイナリログを削除
expire_logs_days を設定します。

### 現在の設定
```sql
mysql> show variables like 'expire_logs_days';
```
### SQL を実行
```sql
mysql> SET GLOBAL expire_logs_days = 10;
```
今回は10日にしました。

### 変更後の設定
```sql
mysql> show variables like 'expire_logs_days';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| expire_logs_days | 10    |
+------------------+-------+
1 row in set (0.00 sec)
```
企業のエンジニア面接を受ける際に気をつける事(失敗談)

エンジニア採用面接を受けに行って失敗したのでポエムを書く。
**勿論、面接する側には他の視点もあるので一例として残す。**
## 結論(時間がない人用)

### 1. 気になっている技術はありますか？と聞かれたとき何を答えるか。
レスポンスした技術について深く聞かれる可能性大。
技術についてどの程度深く知っているかを聞かれるので、深く説明できるものをキーワードとしてあげる。
設計や実装をするときにどの程度技術面を考慮してできるかを見ている。
深く説明できない技術を挙げてしまうと、技術レベルが低いと思われる可能性がある...

### 2. 一番印象的だった仕事は何ですか？と聞かれたとき何を答えるか。
被面接者が実際にチームに入った時の仕事に対する振る舞いを面接官はイメージしようとしている。
困難な局面でも逃げ出さず、真摯に対応できるかを見ている。

* 困難な課題に対してどう対処したか
* チームメンバーに対しての振る舞い（困難に直面しているメンバーへの対応など)

etc...

困難な場面に直面->真摯に対応し困難な場面を乗り切った。
というストーリーを説明できると相手に納得感を与えられる。

### 3. 面接を受けるときは午前に
個人的にはこれが一番大事だと思っている。
当日、仕事で脳を8時間フルに使っており、あまり頭が働かなかったし、疲れた表情をしてしまっていた。
面接は勿論、技術的な口頭試問に答えるのも大事だが、結局「この人と働きたくない」と思われたら終わり。
そのため、表情や声のトーンも結構大事だったりする。

## 当日の受け答えの様子

### 【面接官からの質問】気になっている技術はありますか？
【面接官】気になっている技術はありますか？
【私】マイクロサービスについて、具体的に仕事で活用した経験がなく
メリット、デメリット含めて気になっています。
【面接官】マイクロサービスというキーワードが出たので掘り下げていきます。
【私】（しまった！ 掘り下げるほどに理解していない・・・。）
**〜表面的な説明ばかりして爆死〜**

### 【面接官からの質問】一番印象的だった仕事は何ですか？
【面接官】一番印象的だった仕事は何ですか？
【私】直近で〜という未経験の領域に挑戦し、〜という大きな技術展示会に出展できたことです。

**〜失敗経験から成功したというストーリー性がないので相手の納得感が低く爆死〜**

## その他
### 面接を受けるときは午前に
フルタイムで働いて脳をフルに使った後に面接を受けると頭が働かないし、疲れた表情をしがちなので注意。
「午前に」と書いているが、夜になるとエンジンがかかる人もいると思うので個人差はある。
脳をフルタイムの仕事で使った後は身体的かつ精神的に疲れているので、フルタイム後の面接は避けるようにということが言いたい。
**とはいえ、会社員で平日午前に面接受けに行くのは有給取らないといけないので辛い（対処法を考えないと）**

**〜完〜**
【Rails】 独自 Validation 作成方法（複数モデル適用）

# はじめに
バリデーションの作成方法はモデル内にprivateメソッドを作って、そのメソッドをvalidateの引数に指定する方法が一般的かと思います。
今回は、複数のモデルで同じバリデーションを適用したいケースへの対応方法をまとめました。

# 独自バリデーション作成方法
## やること

開始日時カラムと終了日時カラムを持ったモデルの入力フォームに、
どちらのカラムも入力するか、どちらのカラムも入力しないバリデーションをかけたい。

### Concern

まずは、```app/models/concerns```の直下にバリデーション専用のクラスを作成する。
Concernsを使用することで、同じカラムを持った他のモデルにも適用することができ、さらに細かい継承関係を考えなくてもよくなります。


```Ruby:app/models/concerns/work_datetime_validation.rb
class WorkDatetimeValidation < ActiveModel::Validator
  # record には、インスタンスが入る
  def validate(record)
    return if record.work_datetime_begin && record.work_datetime_end
    return if !record.work_datetime_begin && !record.work_datetime_end
    record.errors[:base] << '開始日時と終了日時どちらも入力するか、どちらも空にしてください'
  end
end
```

### Model

次にModelに```validates_with```を用いて、先ほど作成したクラスを指定する。

他のModelにも適用させたい場合は、```validates_with```を他のクラスに書けばバリデーションが適用されます。

```Ruby:app/models/work.rb
class Work < ApplicationRecord
  validates_with WorkDatetimeValidation
end
```

以上となります。

# まとめ
時間に関するバリデーションは複数のモデルで使用したいというニーズがあると思いますので、ぜひ活用してみてください。

---
### 会社紹介

**株式会社 Mosaica**  
最先端テクノロジーで社会課題を解決し、持続可能な未来を創造する IT カンパニー。
AI ソリューション、クラウド統合、DX 推進、経営コンサルティングなど包括的なサービスでビジネス変革を支援しています。  

詳しくは [公式サイト](https://mosaica.co.jp/) までお気軽にご相談ください。
公式サイト： https://mosaica.co.jp/
独自の基準でSort

競技プログラミングにおいて単なる値のみならずデータ構造をsortしたいという場面がある。
例えばpair型はそのままsortすると最初にfirstで並べ替えて次にsecondでsortするが今回は逆を基準、つまりsecondでsortした後firstでsortする。

##[ABC103 - D](https://atcoder.jp/contests/abc103/tasks/abc103_d)

###問題
東西一列に並んだ 
N個の島と N−1本の橋があります。
i番目の橋は、西からi番目の島と西からi+1番目の島を接続しています。
ある日、いくつかの島同士で争いが起こり、島の住人たちからM個の要望がありました。

要望i: 西からa_i番目の島と西からb_i番目の島の間で争いが起こったために、これらの島をいくつかの橋を渡って行き来できないようにしてほしいあなたは橋をいくつか取り除くことでこれらM個の要望全てを叶えることにしました。

取り除く必要のある橋の本数の最小値を求めてください。

###制約
1≤ a_i < b_i ≤N

###解法
制約によりbが右端の島なのは保証されるのでpairで値を持っておいてb優先で昇順sortしてb-1とbを繋ぐ橋を破壊する。bが同じうちは左端が東に進むだけなのでその破壊した橋で要望が満たされるし、bが東に進んだ時も直前に破壊した橋で間に合うならそれですませることで最小値が出る。
問題はsortだ。

###実装
比較するための関数を定義してsortの第3引数に入れれば独自の基準でsortができる。

```main.cpp
#include <bits/stdc++.h>
using namespace std;

using ll = long long;
using P = pair<int, int>;

#define ALL(a) (a).begin(), (a).end()

//secondで比較
//sort(ALL(vectoe<P>), compare_by_b);
bool compare_by_b(P a, P b) {
  if(a.second != b.second) return a.second < b.second;
  else return a.first < b.first;
}

```

###提出コード

```main.cpp
#include <bits/stdc++.h>
using namespace std;

using ll = long long;
using P = pair<int, int>;

#define rep(i, n) for (int i = 0; i < n; ++i)
#define ALL(a) (a).begin(), (a).end()

bool compare_by_b(P a, P b) {
  if(a.second != b.second) return a.second < b.second;
  else return a.first < b.first;
}

int main()
{
  int n, m;
  cin >> n >> m;
  vector<P> node(m);
  rep(i, m) {
    int a, b;
    cin >> a >> b;
    node.emplace_back(a, b); //完全転送
  }
  sort(ALL(node), compare_by_b);
  int lastbreak = 0; //直前に破壊した橋
  int ans = 0;
  for(auto x : node) {
    int left = x.first;
    int right = x.second;
    if(lastbreak < left) lastbreak = right-1, ans++; //新しく破壊する必要があるならば新たに破壊
    else continue;
  }
  cout << ans << "\n";
  return 0;
}
```
今年は競技プログラミングを頑張りたい...
nuxt dockerで使う個人的な設定

### Docker
```
npm install -g create-nuxt-app
npx create-nuxt-app プロジェクト名
```

### ポート変更
package.json

```
{
  "name": "vue",
  "version": "0.1.0",
  "private": true,
  "scripts": {
+    "dev": "PORT=8080 nuxt",
    ....
  },
```

nuxt-config.js

```
module.exports = {
  server: {
+    port: 8080, // デフォルト: 3000
+    host: '0.0.0.0' // デフォルト: localhost
  },
```

### ホットリロード
nuxt-config.js

```
module.exports = {
  ...
+  watchers: {
+    webpack: {
+        poll: true
+    }
  }
```

### SPAモード
nuxt-config.js

```
module.exports = {
+  mode: 'spa',
```

### レイアウトの変更
xxx.vue内
使用するレイアウトは layouts/testlo.vue

```
export default {
+  layout: 'testlo',
  components: {
    AppLogo
  }
}
```

### その他
Nuxt FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory

nuxt.config.js

```
  build: {
+    standalone: true, //追加！
```
macOS に jenvをインストール、設定する



2020/01/25時点で他のQiita記事が古くてちゃんと動作しない&公式ドキュメントと違うので記述


# 前提

## 環境
macOS Mojave 10.14.6で確認


# ~/.jenv を作成する

```
mkdir ~/.jenv
```


# jenvのインストール

## 1. homebrewを利用する場合

```
brew install jenv
```

## 2. git からcloneする場合

```
git clone https://github.com/jenv/jenv.git ~/.jenv
```

### 2-1. bash

```
echo 'export PATH="$HOME/.jenv/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(jenv init -)"' >> ~/.bash_profile
```

### 2-2. zsh

```
echo 'export PATH="$HOME/.jenv/bin:$PATH"' >> ~/.zshrc
echo 'eval "$(jenv init -)"' >> ~/.zshrc
```


## シェルの再起動

やり方

* ターミナルを再起動する
or 
* exec $SHELL -l


# jenvの動作確認

```
jenv doctor
```

ちゃんと動く場合、以下のアウトプットが出る

```
[OK]	No JAVA_HOME set
[ERROR]	Java binary in path is not in the jenv shims.
[ERROR]	Please check your path, or try using /path/to/java/home is not a valid path to java installation.
	PATH : /Users/user/.jenv/libexec:/Users/user/.jenv/shims:/Users/user/.jenv/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
[OK]	Jenv is correctly loaded
```

# JAVA_HOMEの設定確認

```
echo ${JAVA_HOME}
```

```
jenv enable-plugin export
exec $SHELL -l
```

# Java環境のインストール

Java環境をbrew caskでインストールする場合

```
brew cask install java
```

Java8の場合

```
brew cask install java8
```


# Java環境を追加

jenv addを使う

```
jenv add $(/usr/libexec/java_home)
```

もちろん、以下のように直接ディレクトリを指定しても良い

```
jenv add /Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home
```

# Java環境のバージョン一覧を見る


```
 $ jenv versions
* system (set by /Users/user/.jenv/version)
  11.0
  11.0.2
  openjdk64-11.0.2
```


デフォルトでは、system JavaがJavaの最新バージョンになる。

# Java環境の選択

```
$ jenv local 11.0.2
$ exec $SHELL -l
$ cat .java-version
11.0.2
```

# 設定されたかの確認

```
echo ${JAVA_HOME}
/Users/hogehoge/.jenv/versions/11.0.2

```

これで設定OK。

## いらないので .java-versionを削除する

```
rm .java-version
```


## グローバルJavaバージョンの設定

グローバルに設定したい時のみ必要

```
jenv global 11.0.2
```


# シェルJavaバージョンの設定

```
jenv shell 11.0.2
```


# 共通ワークフロー


## macOSで2つのJVMを使う

Java11.0.2がインストールされているところに、Java 8をインストールする

```
brew cask install adoptopenjdk8
brew cask install caskroom/versions/adoptopenjdk8
```

上記によって、Java 8の最新バージョンをmacOSの特別なディレクトリにインストールする

```
$ ls -1 /Library/Java/JavaVirtualMachines 
adoptopenjdk-8.jdk
openjdk-11.0.2.jdk
```

adoptopenjdk-8.jdkディレクトリというのが見える。(ユーザによってこのディレクトリは変わる)
/usr/libexec/java_home からは取得できないので、 jenv addで追加する


```
$ jenv add /Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home/
openjdk64-1.8.0.222 added
1.8.0.222 added
1.8 added
$ jenv versions
* system
  1.8
  1.8.0.222
  openjdk64-1.8.0.222
  11.0
  11.0.2
  openjdk64-11.0.2
  oracle64-1.8.0.202-ea
```


# 参考

以下を参考に、冗長なところを削除、足りないところを追加しました。

GitHub - jenv/jenv: Manage your Java environment
https://github.com/jenv/jenv


以上。
LakeFormation Tips


案件でLakeFormationを使うようになりましたので、LakeFormation関連のTipsを紹介していきたいと思います。
随時更新予定です。

# 1. 別リージョンのバケットにテーブルデータを保存しているテーブルはLakeFormationで権限制御できない

例えば、GlueのデータカタログやLakeFormationは東京リージョンを利用しているが、一部のテーブルのデータはオレゴンリージョンのバケットに
保存されている場合、この一部のテーブルに対してLakeFormationで権限制御することができません。
これはLakeFormationと別リージョンのバケットはDataLakeLocationsに登録できないためだと思われます。
LakeFormationでテーブルの権限等を管理する場合、テーブルデータが存在するS3パスをDataLakeLocationsに登録する必要があります。
ただ、別リージョンのバケットはDataLakeとして登録できないため、別リージョンのバケットにデータを持つテーブルはLakeFormationの管轄外となってしまい、その恩恵を受けれられないようです。

現時点でこのような状況になった場合の影響としては以下の点が確認できました。

- LakeFomationコンソール上で別リージョンバケットにデータを持つテーブルはテーブル一覧に表示されません。
- Glueコンソール上で一覧を取得した場合のみテーブルが確認できます。
- LakeFormationの権限設定を付与できません。
- 該当テーブルにアクセスする際の権限判定はIAMポリシーのみで判定します。（LakeFormationローンチ以前と同様にGlueのAPI権限があればアクセス可能）

そのため、当たり前のことではあるかもしれませんが、LakeFormationを利用する場合、テーブルデータ等も同一リージョンで管理するようにしましょう。

# 2. 「Use only IAM access contro」設定はDB単位でも設定されている

LakeFormationは初期状態の場合、ローンチ前の状態と互換性を保つように設定されています。つまりデフォルトで全IAMが全データカタログに対するLakeFormationの権限が付与された状態（＝ IAMポリシーのみで制御されている状態）になっています。
そのため、LakeFormationの権限制御を利用したい場合、まずはこの互換性の設定を外す必要があります。

まずはLakeFormationコンソールの「Setting」画面から「Default permissions for newly created databases and tables」の項目にあるすべてのチェックボックスのチェックを外した状態にします。
この状態にすることで、今後作成されるDBやテーブルには互換性維持用の権限は付与されず、基本的にDB、テーブルを作成したIAMに対してのみアクセスできる（LakeFormationの権限制御が有効になっている）状態になります。

ただ、注意点としては、見出しにある通り、各DBに対しても「Use only IAM access contro」の設定つまり、互換性維持用の設定項目があります。
LakeFormationローンチ前にすでに作成されたDBにはこの設定が有効になっていると思うので、LakeFormationの権限制御を利用する場合、
このちらの設定も無効にする必要があります。
自作アプリで、Intentを使用してGmailアプリに、CC, BCC, 件名, 本文が渡せない。

#問題
私の自作アプリでは、Intentという内部処理を使用して、Gmailアプリに、CC, BCC, 件名, 本文を渡しています。ある日突然、Gmailアプリが、CC, BCC, 件名, 本文を受け付けてくれなくなりました。

#問題発生時のコード(Kotlin)
```
// メールアドレス設定
val uri = Uri.parse("mailto:" + mailAddressTO)

// 件名、本文をメールツールに渡す
val intent = Intent(Intent.ACTION_SENDTO, uri)
intent.putExtra(Intent.EXTRA_CC, mailAddressCC)
intent.putExtra(Intent.EXTRA_BCC, mailAddressBCC)
intent.putExtra(Intent.EXTRA_SUBJECT, subject)
intent.putExtra(Intent.EXTRA_TEXT, mailText)
startActivity(context, intent, null)
```
#解決策
```
val intent = Intent(Intent.ACTION_SENDTO)
intent.data = Uri.parse("mailto:")
intent.putExtra(Intent.EXTRA_EMAIL, mailAddressTO)
intent.putExtra(Intent.EXTRA_CC, mailAddressCC)
intent.putExtra(Intent.EXTRA_BCC, mailAddressBCC)
intent.putExtra(Intent.EXTRA_SUBJECT, subject)
intent.putExtra(Intent.EXTRA_TEXT, mailText)
context.startActivity(intent)
```
#参考リンク
https://stackoverflow.com/questions/8701634/send-email-intent
https://qiita.com/kitagry/items/e3b77061c31e388d152f
https://developer.android.com/guide/components/intents-common?authuser=1&hl=ja#Email
Rails6 データベースのカラム作成を行う際の概要

# 目的

- カラムを作成したり削除したりする時の概要をまとめる

# 間違えてマイグレートしてしまった時はこちらを参考にロールバックを行う

[Rails6 マイグレーションファイルの記載ミスでマイグレートしてしまったらrollbackを使おう](https://qiita.com/miriwo/items/9fac9f5e6dffb7427f80)

# 作業概要(カラムを追加する)

1. カラムを追加するテーブル名を確認
1. 追加するカラム名と型を決定
1. マイグレーションファイルの作成
1. 追加カラム情報の記載
1. マイグレート

# 作業詳細(カラムを追加する)

1. カラムを追加するテーブル名を確認
    1. これからカラムを追加するテーブル名を確認する。
1. 追加するカラム名と型を決定
    1. 追加する任意のカラム名とデータ型を決める。
1. マイグレーションファイルの作成
    1. 下記コマンドを実行してマイグレーションファイルの作成を行う。

        ```terminal
        $ cd Railsで作成したアプリのルートフォルダ
        $ rails g migration change_カラムを追加するテーブル名_columns
        ```
    
    1. `アプリ名/db/migrate`直下に`YYYYMMDDHHMM_change_カラムを追加するテーブル名_columns.rb`というマイグレーションファイルが作成される。
1. 追加カラム情報の記載
    1. 先に作成された`YYYYMMDDHHMM_change_カラムを追加するテーブル名_columns.rb`ファイルにカラムを追加する記載を記入する。 下記に`users`テーブルに`password_digest`カラムを`string`型で追加する時の記載の例を書く

        ```ruby
        class ChangeUsersColumns < ActiveRecord::Migration[6.0]
          def change
           add_column :users, :password_digest, :string
          end
        end
        ```

1. マイグレート
    1. 下記コマンドを実行してマイグレートを行う。

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