OmniAICreator/Qiita-1.07M huggingface dataset:
[メモ] Ubuntu 18.04/RTX2080Ti でnvidia-driverを入れたりした

#注意
ただのメモなので，基本的には参考にしないでください

#やったこと

ダウンロードとかが日本語になっているのが鬱陶しいので変えておく，

```
LANG=C xdg-user-dirs-gtk-update
```

~/.bashrcに以下を追加

```
case "$TERM" in
     linux)
          export LANG=C
          ;;
     *)
          export LANG=ja_JP.UTF-8
          ;;
esac
```

セキュアブートは切っておく．
https://medium.com/@avinchintha/how-to-install-nvidia-drivers-and-cuda-10-0-for-rtx-2080-ti-gpu-on-ubuntu-16-04-18-04-ce32e4edf1c0
を参考に進めていく．

コンパイラなどをインストール

```
sudo apt install build-essential
```

failing CC version checkしたのでCCの環境変数を変えつつ実行

```
CC=gcc-7.3.0 sudo ./NVIDIA-Linux-x86_64-430.14.run --no-x-check
```

Unable to determine the version of the kernel sources になった.
`/lib/modules/$VERSION/build/include`には普通にカーネルのソースが入っているので謎．
`/var/log/nvidia-installer`を見ろ見たいなことも出てくるが結局よく分からず．

なのでautoinstall してみようとする

```
sudo add-apt-repository ppa:graphics-drivers
sudo ubuntu-drivers autoinstall
```

そうしたらなんか入った．謎．

ちなみにaptから入れるのは上手くいかなくて，ごちゃごちゃやってあとに，
`NVIDIA-SMI couldn't find http://libnvidia-ml.so  library in your system. Please make sure that the NVIDIA Display Driver is properly installed and present in your system.`が出て失敗．ちなみに`libnvidia-ml.so`にパスは通っていた．（ほかにもいろいろやっていて詰んだので，クリーンインストールした）

ドライバーを入れないとまともに動かないのに，なんで公式のinstructionがないんでしょうか…

# 動作確認
nvidia-smiは動くが，nvidia-settingsがなんかエラーを吐く
https://devtalk.nvidia.com/default/topic/1050619/linux/nvidia-settings-error/
によれば問題ないらしい．

# CUDA
死ぬほど不親切に思えたドライバーのダウンロードに比べここからは，officialのガイドがあって楽．
https://developer.nvidia.com/cuda-downloads
で適切な選択肢を選べば適切なコマンドが出てくる

# CuDNN
https://docs.nvidia.com/deeplearning/sdk/cudnn-install/index.html
cuDNNも落とす．こちらもガイドを読めばその通りにできた．

# オチ
CUDA10.1がtensorflowに対応していなかったので，nvidia-dockerを使うことにしました．ほとんどの手間はドライバーを入れる手間だったのでよかったんですが．
【COBOL】paizaスキルチェックの値取得・出力サンプルコード

# COBOLのサンプルコードがない
興味を持った言語に触ってみる際、[paizaスキルチェック](https://paiza.jp/challenges)で問題を解いてみることが多いのだが、提出可能だがサンプルコードが載っていない言語がある…。

COBOLのサンプルコードを上げてくださってくれている方もいらっしゃるが、同じ問題を他言語と比較してみたい欲もあるので、paizaスキルチェックのサンプルコードに則ったコードを記載します。

Elixirのコードを作成したが、COBOLもなかったのでCOBOL版です！

## サンプルコード
参考: [値取得・出力サンプルコード](https://paiza.jp/guide/samplecode)

### 入力される値
```
2
2 5
3 4
```

### 期待される出力
```
hello = 2 , world = 5 
hello = 3 , world = 4
```

### COBOL

```
IDENTIFICATION DIVISION.
PROGRAM-ID. hello.
ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 N PIC 9(20).
01 INP PIC X(21).
01 a PIC X(10).
01 b PIC X(10).

01 i PIC 9(2).
01 j PIC 9(2).
01 k PIC 9(2).
PROCEDURE DIVISION.
MAIN.
ACCEPT N

PERFORM N TIMES

    ACCEPT INP
    
    PERFORM VARYING i FROM 1 BY 1 UNTIL INP(i:1) = SPACE
    END-PERFORM
    
    MOVE INP(1:i) TO a
    ADD 1 TO i
    MOVE INP(i:21) TO b

    PERFORM VARYING j FROM 1 BY 1 UNTIL a(j:1) = SPACE
    END-PERFORM
    SUBTRACT 1 FROM j
    
    PERFORM VARYING k FROM 1 BY 1 UNTIL b(k:1) = SPACE
    END-PERFORM
    SUBTRACT 1 FROM k
    
    DISPLAY "hello = " a(1:j) " , world = " b(1:k)
    
END-PERFORM.

STOP RUN.
```

## 参考にさせていただいた記事
[AtCoder ABC 過去問 を COBOL で解いてみた](https://qiita.com/ShinjiSHIBATA/items/1ef8cbf4b87969a46015)
カスタムUIViewなどのinitメソッドの記述例

カスタムUIViewやUIButtonを作成した時に、initメソッド内で定数や配列の初期化などを行う場合、initメソッドをoverrideする必要があります。

# 1.initメソッドをoverrideする

##Swift4

~~~Swift
    override init(frame: CGRect) {
        super.init(frame: frame)
        // 初期化などをここに記述
    }

    /**
     * 2.’required’ initializer ‘init(coder:)’ must be provided by subclass of ~
     * というエラーが出た場合
     * swiftの場合requiredメソッドも実装する必要があります
     **/ 
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }
~~~

##Objective-C

~~~Objective-C
- (id)initWithFrame:(CGRect)frame {
    self = [super initWithFrame:frame];
    if (self) {
        // 初期化などをここに記述
    }
    return self;
}
~~~~

---


## 関連記事

【About】(http://qiita.com/sunstripe) - サンストライプ

---

## 制作チーム：サンストライプ

[![sunstripe_logo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80600/322f2d60-f19d-af9e-2b6f-7290ca546848.png)](http://sunstripe.main.jp/)
http://sunstripe.main.jp/

(月１WEBコンテンツをリリースして便利な世の中を作っていくぞ！！ボランティアプログラマー/デザイナー/イラストレーター/その他クリエイター声優募集中！!)

### 地域情報 THEメディア
THE メディア 地域活性化をテーマに様々なリリース情報も含め、記事をお届けしてます！！
https://the.themedia.jp/

### ゼロからはじめる演劇ワークショップ
多様化の時代に向けて他者理解を鍛える

https://workshop.themedia.jp/

### プログラミングワークショップ・ウェブ塾の開講！！！
様々なテーマでプログラミングに囚われずに取り組んでいきます。
詳しくはこちら　↓　↓　↓　↓　↓　↓　↓　↓
[プログラミングサロン 月１だけのプログラミング学習塾](https://workshop.themedia.jp/posts/7057553?fbclid=IwAR32CfRQ7RvDOhvuogoSwqxDLMOU7Jvuzljlnx-TMc27qBPX1BnWsfLcBR8
)

### 協力応援 / 支援者の集い
## チーム：サンストライプ
#### プログラミングラボ
https://twitter.com/sunstripe2011

一緒にポートフォリオを作りませんか？現場の体験やそれぞれの立場から年齢関係なく作品を作りたい方々と一緒にチームを作って、作品を作っています。現場に行きたい人には、職場紹介や職場の体験や悩み相談なども受けております。
様々な職種からプログラミングの知識を得たい、デザインの知識を得たい、データーベースの知識を得たいという人が集まっております。
週１のミーティングにそれぞれの近況と作業報告して、たまにリモート飲み会などをしております！！

興味がある方は、DMに話しかけてみてください。

## トラストヒューマン
http://trusthuman.co.jp/
私たちは何よりも信頼､人と考えてます｡

｢コンサルティング｣と｢クリエイティブ｣の両角度から｢人材戦略パートナー｣としてトータル的にサポートします！！

キャリア教育事業
広域学習支援プラットフォーム『のびのび日和』
https://slc-lab.amebaownd.com/

#スポンサー募集
パッケージを再インストールせずにJuliaをupdateする方法

今までJulia v1.0.2を使用していたのですが，先日v1.1.1がリリースされたのをきっかけに更新したのでその時の備忘録．

# 環境

macOS Mojave 10.14.4

# Julia最新版のダウンロード

https://julialang.org/downloads/
から使いたいものをダウンロードします．
今回はv1.1.1をダウンロードしました．

# Julia環境のコピー
デフォルトのままであればJuliaの環境の情報は `~/.julia/environments`に保存されています．
なのでv1.1からもこの情報を呼び出せるようにします．

```
$ cp -r ~/.julia/environments/v1.0 ~/.julia/environments/v1.1
```

これでv1.1からも今までインストールしたパッケージを呼び出せるようになりました．

#シンボリックリンクの作成

ターミナルからv1.1.1を呼び出せるようにします．

```
$ sudo rm /usr/local/bin/julia
$ sudo ln -s /Applications/Julia-1.1.app/Contents/Resources/julia/bin/julia /usr/local/bin/julia
```

これでターミナルから `julia` と打てばv1.1.1が呼び出されるようになりました．

#jupyter notebook (lab) から使えるようにする．

調べてもあまり良い方法が見つからなかったので力技です．コメントで楽に出来る情報を頂いたので下に追記してます

まずjupyterで使用している環境を調べます．自分の場合はこんな感じの出力になりました(一部変えてます)．

```
$ jupyter kernelspec list
  ir            /Users/name/Library/Jupyter/kernels/ir
  julia-1.0     /Users/name/Library/Jupyter/kernels/julia-1.0
  python3       /Library/Frameworks/Python.framework/Versions/3.7/share/jupyter/kernels/python3
```

`/Users/name/Library/Jupyter/kernels/julia-1.0` で見ていることが分かったのでまずはディレクトリをコピーします．

```
$ cd /Users/name/Library/Jupyter/kernels
~/Library/Jupyter/kernels$ cp -r julia-1.0/ julia-1.1/
```

中身を見てみると `kernel.json` で管理していることが分かるのでコピーしたディレクトリにあるjsonを次のように書き換えます．

```
{
  "display_name": "Julia 1.1.1",
  "argv": [
    "/Applications/Julia-1.1.app/Contents/Resources/julia/bin/julia",
    "-i",
    "--startup-file=yes",
    "--color=yes",
    "--project=@.",
    "/Users/name/.julia/packages/IJulia/gI2uA/src/kernel.jl",
    "{connection_file}"
  ],
  "language": "julia",
  "env": {},
  "interrupt_mode": "signal"
}
```

変えたところは `display_name` と4行目のApplication以下に書いてあるjuliaのversionだけです．

最後にjupyter notebookでjuliaのカーネルを起動させてちゃんとversionが正しければ成功です．お疲れ様でした．

![スクリーンショット 2019-05-17 17.56.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324044/dd014f28-2e42-6c22-1f57-2a5950e69657.png)

## 2019/05/17 追記

IJuliaをbuildし直せば上記のようなめんどくさいことをしなくても良いみたいです．盲点でした...

```
]build IJulia
```


#参考

https://discourse.julialang.org/t/julia-v1-1-0-has-been-released/19911/4
#django のテストで pdb set_trace デバッグをする方法

何の変哲もなく好きな場所で `set_trace()` すると動くことが判明。

```
import pdb

...

pdb.set_trace()
```

[debugging - How to use pdb.set_trace() in a Django unittest? - Stack Overflow](https://stackoverflow.com/questions/17215084/how-to-use-pdb-set-trace-in-a-django-unittest)

# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Can't bind to 'ngIf' since it isn't a known property of 'div' in production build

# Can't bind to 'ngIf' since it isn't a known property of 'div' in production build

このエラーで**stack overflow**でよくある回答が、CommonModuleがインポートされていないから、というもの。app.module.tsで以下のようにしなさい、と。



```typescript
import { CommonModule } from '@angular/common';  
import { BrowserModule } from '@angular/platform-browser';

…中略…

@NgModule({
    imports: [CommonModule],
  ...
})

```


<br>

全然そんなことしなくても良く、原因は別にあったという備忘録。



### 前提

ケース：Firestoreからデータを取ってきて、その中のidがhogehogeならば、という条件文で*ngIfを使いたかった。



コードとしてはこんな感じ

html

```html
<div *ngFor="let post of posts">
      <div *ngIf="post.id == 'hogehoge'">
			hogehoge表示	
      </div>
      <div *ngIf="post.id !== 'hogehoge'">
			hogehogeじゃない表示
      </div>
  </div>
```



ts

```typescript
// Firestoreからデータを取ってくるところ
import { AngularFirestore, AngularFirestoreCollection } from '@angular/fire/firestore';
import { Post } from '../../class/post';
	post: Post;
	posts: Post[];

  getPosts() {
    this.postsCollection.valueChanges().subscribe(data => {
     this.posts = data;
    });
  }
```



これだとエラーがでる。




<br>



### 解決方法

Firestoreからデータをとってくる構文ね。この一括でとってくる簡単な書き方だとダメみたい。


こうする。

```typescript
import { AngularFirestore, AngularFirestoreCollection } from '@angular/fire/firestore';
import { Post } from '../../class/post';
import { Observable } from 'rxjs';          // 追加
import { map } from "rxjs/operators";       // 追加

	post: Post;
	posts: Observable<Post[]>;          // 変更
    
getPosts() {
    this.posts = this.postsCollection.snapshotChanges().pipe
    (map(actions => {
      return actions.map(action => {
        const data = action.payload.doc.data() as Post;
        const id = action.payload.doc.id;
        const uid = action.payload.doc.data().uid;
        return { id,uid,  ...data };
        });
      }));
} 
```
要はObserbableを使えと。



```html
<div *ngFor="let post of posts | async">
```

HTMLの方はこの場合*ngFor文で` | async`をつけるように。


<br>


以上。
シェルスクリプト(gcloud)で cloudsql のバックアップをインポートする

メモ。シェルスクリプトで。

```
op=$(gcloud sql import sql "${dbinstance}" "${gcsuri}" --database="${dbname}" --project="${project}" --quiet --async)
gcloud sql operations wait --project "${project}" --timeout unlimited "${op}"
``` 

## 説明

デフォルトだと300秒でタイムアウトするので、特にバッチ処理とかでやる場合は --async を付けて非同期ジョブにしておく。正常終了したかどうかの確認をするため `gcloud sql operations wait` で待つ。（確認いらないなら不要だけどまあするよねってことで。） これもほっとくと300秒で待機終了しちゃうので `ｰｰtimeout unlimited` を指定する。

ちなみに終わるとこんな感じで何分オペレーションにかかったか教えてくれる。

```
NAME                                  TYPE    START                          END                            ERROR  STATUS
7937dc37-33ef-4ad2-b380-957cbecf87ce  IMPORT  2019-05-17T08:36:01.591+00:00  2019-05-17T08:37:42.961+00:00  -      DONE
```

## 参考URL

- https://cloud.google.com/sql/docs/mysql/import-export/importing?hl=JA
- https://cloud.google.com/sdk/gcloud/reference/sql/operations/wait?hl=JA
ワンキー括弧閉じスクリプトのその後

随分前に[こんなスクリプト](https://qiita.com/astrorobot110/items/ae8dc98f698085976117)を書いていたんですけど…lintを通すとあちこちに変なところも見つかるし、vim弄り倒してる間に色々と覚えたテクニックもあるのでそろそろ書き直してあげてもいいのかな…ということで、ちょっくら弄ってみました。

## 括弧閉じにスクリプトを使うのは間違っているのか？

```closer.vim
scriptencoding utf-8

function! Closer() abort
	let bracketList = {}
	let bracketList['open'] = filter(split(&matchpairs, '[:,]'), 'v:key % 2 == 0')
	let bracketList['close'] = filter(split(&matchpairs, '[:,]'), 'v:key % 2 == 1')
	let isFound = 0

	let pos = getcurpos()

	while search('['.escape(substitute(&matchpairs, '[:,]', '', 'g'), '\.*^$]~/').'"'''.']', 'bW') > 0
		let foundBracket = matchstr(getline('.'), '.', col('.')-1)

		if foundBracket ==# ''''
			call searchpair('''','','''','bW')
		elseif foundBracket ==# '"'
			call searchpair('[^\\]/zs"','','"','bW')
		else
			let idx = match(bracketList.close, foundBracket)
			if idx > -1
				call searchpair(
						\ escape(bracketList.open[idx], '/.*^$]~\'),
						\ '',
						\ escape(bracketList.close[idx], '/.*^$]~\'),
						\ 'bW')
			else
				let isFound = 1
				break
			endif
		endif
	endwhile

	call setpos('.', pos)
	return isFound ? bracketList.close[match(bracketList.open, foundBracket)] : ''
endfunction
function! s:closeFromNormal(isBang) abort
	let @c = Closer()
	if @c !=# '' && a:isBang ==# '!'
		execute 'normal "cPl'
	else
		echo @c !=# '' ? 'Bracket : '.@c : 'No bracket to close.'
	endif
endfunction

command! -bang Closer call s:closeFromNormal('<bang>')

inoremap <expr> <Plug>(closer_main) Closer()
```

## 当スクリプトムラあり！

改めてこのスクリプトの馴れ初めなんですが、「マルチバイトの括弧を変換を介さずに入力する」のが目的で、業界でよく使われる[lexima](https://github.com/cohama/lexima.vim)的な補完を目指していないものです。というわけで打ち込んだ括弧を先行して閉じるのではなく、多少不細工でもいいからカーソル位置より前にある括弧を探して、それを補完するようになっています。実際にやっていることは…

- 認識したい括弧をさかのぼって探す。
- 見つかった括弧の方向を確認する。
- **閉じる側の括弧なら対応する括弧に飛んで**更にさかのぼる
- 閉じていなければ元の場所に戻って対応する括弧を挿入する

という…なんで強調する必要があるんですかねえ？

気軽に「対応する括弧に飛んで」…と書いてありますが、残念ながら対応している括弧が**実際に対応を意図した括弧かどうか**は全く判断していません。具体的にこのスクリプト自身で想定されるケースを試すと**正規表現やそのエスケープのために使われる`]`や、対応する括弧に開閉の方向がない`'"`などによって正常な動作をしません**…が、そもそもの意図がスクリプトの為ではないので、括弧の対応レベルが浅い平文では問題なく対応する括弧が入手出来るので問題ありません。そもそも一番書きたいスクリプトがvimscriptの自分にとっては、ダブルクォートの問題が山のように積み重なっているので…うｎ
bxsliderの画像が1つ飛ばしになるときに確認したいこと

## 背景
オプション'fade'を使ったbxsliderの画像が1つ飛ばしになってしまい、順番が変わってしまう修正を依頼されました。

## 原因

```index.html
<ul id="bxslider">
	<li></li>
	<li></li>
	<li></li>
	<li></li>
	<li></li>
	<li></li>
	<li></li>
	<li></li>
</ul>
```

```script.js
$('#bxslider').bxSlider({
  auto: true,
  mode: 'fade',
  speed: 3000,
  pause: 2000,
  autoDelay: 1000
});
```
[bxsliderのオプション](https://bxslider.com/options/)

アニメーション移り変わるspeed > 画像を表示するpause
という数値になっているので、移り変わろうとしている間に次の画像に行こうとしているのが原因かと思います。

## 解決

```script.js
$('#bxslider').bxSlider({
  auto: true,
  mode: 'fade',
  speed: 3000,
  autoDelay: 1000
});
```

こんな感じで、`pause: 2000`を消してしまうか、`pause: 5000`など大きい数値に変更すると解決し、順番は意図したとおりになりました。
Macでシェルをbashからzshに変更し、Zgenを導入した手順

#Macでシェルをbashからzshに変更し、Zgenを導入した手順
zshの最新版をインストールをし、zshのプラグインマネージャーである「zgen」を導入した手順をまとめています。

##zshのインストール

```:
# 現在のzshのバージョン確認
 $ /bin/zsh --version
zsh 5.2 (x86_64-apple-darwin16.0)

# 最新バージョンの確認
$ brew info zsh
zsh: stable 5.7.1 (bottled), HEAD
　（略）
```

最新版をインストールしてきます。

```:
$ brew install zsh
```

ちゃんと最新版がインストールできたか確認します。

```:
$ /usr/local/bin/zsh --version
zsh 5.7.1 (x86_64-apple-darwin16.7.0)
```

最新の5.7.1インストールできているみたいです。


##ログインシェルの変更
/etc/shellsにzshのパスを追加します。

```:
$ sudo vi /etc/shells
# List of acceptable shells for chpass(1).
# Ftpd will not allow users to connect who are not using
# one of these shells.

/bin/bash
/bin/csh
/bin/ksh
/bin/sh
/bin/tcsh
/bin/zsh
/usr/local/bin/zsh  <-- これを追加しました。
```

ログインシェルを変更するchshコマンドを使ってログインシェルを変更します。

```:
$ chsh -s /usr/local/bin/zsh
 (パスワードを尋ねられる)
```

ターミナルを再起動してみます。

```:
This is the Z Shell configuration function for new users,
zsh-newuser-install.
You are seeing this message because you have no zsh startup files
(the files .zshenv, .zprofile, .zshrc, .zlogin in the directory
~).  This function can help you with a few settings that should
make your use of the shell easier.

You can:

(q)  Quit and do nothing.  The function will be run again next time.

(0)  Exit, creating the file ~/.zshrc containing just a comment.
     That will prevent this function being run again.

(1)  Continue to the main menu.

--- Type one of the keys in parentheses ---
```

このようなメッセージが表示されました。zshの設定ファイル(.zprofile, .zshrcなど)が~ディレクトリにないから表示されているそうです。
とりあえず<b>q</b>で抜けましょう。
そして、今まで利用していた~/.bash_profileを~/.zshrcにコピーします。

```:
% cat ~/.bash_profile >> ~/.zshrc
```

そして再起動すれば、エラーは消えます。

##Zgenの導入
Zgenは軽量でシンプルなZshプラグインマネージャーです。メモがてらにまとめていきます。

まずは、githubからコピーしてきます。

```:
% git clone https://github.com/tarjoilija/zgen.git "${HOME}/.zgen"
```

.zshrcに以下を追記します。

```:
% vi ~/.zshrc

# load zgen
source "${HOME}/.zgen/zgen.zsh"

# if the init scipt doesn't exist
if ! zgen saved; then

  # specify plugins here
  # 以下に追加したいプラグイン記入
  zgen oh-my-zsh

  zgen load ・・・
     ・
　　　・
  # generate the init script from plugins above
  zgen save
fi
```

初期化スクリプトをリセットしてから変更を反映させる。

```:
% zgen reset
% source ~/.zshrc
```

以上でシェルをzshに変更し、zgenを導入できました。

##自分の環境に合わせた変更
.zshrcに色々書いていたので.zshrc.zgenを新規作成しました。
以下のコマンドで.zshrc.zgenを読み込むようにします。

```:.zshrc

[[ -f $HOME/.zshrc.zgen ]] && source $HOME/.zshrc.zgen

```

以下が.zshrc.zgenの内容となっています。

```:.zshrc.zgen
if [[ -f "$HOME/.zgen/zgen.zsh" ]]; then
  # load zgen
  source "$HOME/.zgen/zgen.zsh"

  # if the init scipt doesn't exist
  if ! zgen saved; then

    # specify plugins here
    zgen oh-my-zsh
    zgen oh-my-zsh themes/clean

    zgen load zsh-users/zsh-completions
    zgen load zsh-users/zsh-history-substring-search
    zgen load zsh-users/zsh-syntax-highlighting

    # generate the init script from plugins above
    zgen save
  fi
fi
```
mysql + serverless frameworkで"Received packet in the wrong sequence."


* 事象
- offlineでは発生しない
- リリースすると発生する
- offlineでも、productionだと発生する

webpackの圧縮あたりがおかしい？

* 対策

minimizeをオフにする。出来れば、mysqlだけoffにしたい。


```webpack.config.js

module.exports = {
  ...
  optimization: {
    minimize: false
  }
};
```

参考
- browserfyでも
http://synonym177.hatenadiary.jp/entry/2015/12/09/Received_packet_in_the_wrong_sequence._%E3%82%A8%E3%83%A9%E3%83%BC%E3%81%B8%E3%81%AE%E5%AF%BE%E5%87%A6

- “Error: Received packet in the wrong sequence.” when connect to serverless aurora
https://stackoverflow.com/questions/55988989/error-received-packet-in-the-wrong-sequence-when-connect-to-serverless-auror
Rails + webpacker で.envファイルで環境変数を管理する方法

# 概要
Ruby + webpackerでもdotenv Ruby gemのように環境変数を`.env`で管理して使いたい！
という方向けの記事です。
そのうちwebpackerのデフォルト機能にしてくれるでしょう（願望）。

# 検証環境
- Rails 5.2.2
- webpacker 3.5

# やり方
- dotenv Ruby gemと同じように、`.env`に環境変数を用意しておく
- `yarn add dotenv`を実行
- `config/webpack/environment.js`を下記のように編集
- `console.log(process.env.FOO)`で環境変数をJSから使えます！

```javascript
// config/webpack/environment.js

const { environment } = require('@rails/webpacker')
const webpack = require('webpack')
const dotenv = require('dotenv')

const dotenvFiles = [
  `.env.${process.env.NODE_ENV}.local`,
  '.env.local',
  `.env.${process.env.NODE_ENV}`,
  '.env'
]
dotenvFiles.forEach((dotenvFile) => {
  dotenv.config({ path: dotenvFile, silent: true })
})

environment.plugins.prepend('Environment',
  new webpack.EnvironmentPlugin(
    JSON.parse(JSON.stringify(process.env))
  )
)

module.exports = environment
```

# 参考
https://github.com/rails/webpacker/blob/master/docs/env.md
[Rails] dependent: :destroy について

#結論
dependent: :destroyを追加することで、
「親モデルを削除する際に、その親モデルに紐づく<b>「子モデル」</b>も一緒に削除できる」ようになります。

例えばユーザーが退会した場合、そのユーザーが投稿した記事も全て消えるように設定するのであれば、必須な知識です。
#dependent: :destroyを追加する
現段階では、このような関係性になっていると思います。

```（変更前）user.rb
class User < ApplicationRecord
  has_many :posts
```

```（変更前）post.rb
class Post < ApplicationRecord
  belongs_to :user
```
このように、user.rbに追加します。
これで、ユーザーが退会した場合はそのユーザーが投稿した記事も全て消えるようになりました。

```（変更後）user.rb
class User < ApplicationRecord
  has_many :posts, dependent: :destroy
```

#子モデルに、さらに子があれば
例えば、このような状況です。
<img width="718" alt="スクリーンショット 2019-05-17 17.05.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/376004/b0f0a405-acc2-4c47-305f-354a6cc0eb7c.png">

こちらの場合であっても、下記のようにすれば親子モデルの関係性と同じような動作をします。

```（変更後）post.rb
class Post < ApplicationRecord
  has_many :pictures, dependent: :destroy
```
※ 関連付け（アソシエーション）の詳細は、[こちらを参照してください。](https://railsguides.jp/association_basics.html#%E9%96%A2%E9%80%A3%E4%BB%98%E3%81%91%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B%E7%90%86%E7%94%B1)

#バージョン
rails 5.1.7

#参考リンク
+ [関連付け（アソシエーション）の詳細](https://railsguides.jp/association_basics.html#%E9%96%A2%E9%80%A3%E4%BB%98%E3%81%91%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B%E7%90%86%E7%94%B1)
+ [has_manyのdependentオプションについて](https://qiita.com/keisuke-mizoguchi/items/afc1a332c3108975a9b6)
プログラミング未経験者がN予備校の2019年度プログラミング入門をやってみた。part3

#自己紹介ページを作ってみる。
こんにちは、新人エンジニアのyusukeです。
今日は、HTMLでよくある自己紹介ページを作り方が出てきたのでまとめてみたいと思います！

##　自己紹介ページ

実際に、やっているときに先輩からこんなサイトを紹介されました。
>
http://abehiroshi.la.coocan.jp/

こんなサイトを作れるか、、、、と言われるとびみょいんですが、とりあえずこんなことを表示するサイト
を作ってみようと思います。
>
アイコンの画像
ハンドルネーム
わたしの情報
年齢
都道府県
趣味
SNS へのリンク集
好きな動画

実際に自分のエディタでこんな感じで書いていればOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416305/cefe1b3f-6a61-844d-95fa-be7c46121a77.png)

ここに、こういうのを足したり、、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416305/76e10c50-d400-19e7-0b1c-4440cf27095a.png)


あとはyoutubeからコードを持ってきて、ポチポチすると


```
<!DOCTYPE html>
<html lang="ja">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>○○の自己紹介</title>
</head>

<body>
    <img src="https://nnn.ed.jp/common/img/logo_nschool.png" alt="アイコン">
    <h1>○○（あなたのハンドルネーム）</h1>

    <h3>わたしの情報</h3>
    <table>
        <tr>
            <th>年齢</th>
            <td>×× 歳</td>
        </tr>
        <tr>
            <th>都道府県</th>
            <td>△△ 県</td>
        </tr>
    </table>

    <h3>趣味</h3>
    <ul>
        <li>○○○○○</li>
        <li>＊＊＊＊＊</li>
        <li>～～～～～</li>
    </ul>

    <h3>SNS へのリンク集</h3>
    <ul>
        <li><a href="https://twitter.com/n_yobikou">Twitter</a></li>
    </ul>

    <h3>好きな動画</h3>
    <youtube埋め込みコード></iframe>
</body>

</html>
```



##まとめ
タグのつけ方だったり、特に難しいと感じることはなくきれいに並べているって感じでした。
これは基礎の基礎って感じでした。
FirebaseとReact+typelessで社内向けに書籍管理アプリを作った

# はじめに

こちらはオプトテクノロジーズ社内勉強会で利用した資料になります

---

# 自己紹介

株式会社オプト シニアエンジニア @sisisin（しめにゃん）

https://github.com/sisisin
https://twitter.com/_sisisin

- フロントエンドマン（最近は React+Redux）
- スクラムマスター・インフラ・サーバーサイドといろいろやります
- 今はテックリードとか社内アジャイル相談窓口っぽいことやってます

---

# モチベーション

- 別に課題感があったわけではない
    - ちなみに今まではスプシで管理して、GASで貸し借りの通知をしていた（それで十分だった）
- @watiko 氏と話していたら、↓というのが分かってサクッといけるのでは？ってなったので作った
    - カメラからバーコードを読み取れる
    - ISBNコードから本の画像とか情報が引っ張ってこれる

---

# 出来ること

- 貸し借りが携帯でサクッとできるようになるので便利！
- 一覧でも見れる！
- 半期ごとぐらいにやる棚卸しもバーコード読んで終わり！
- 今まで取れなかった貸し借りの履歴とかも取れる！

べんり！

---

# デモ

---

# 使っている技術

- Firebase
    - hosting
    - firestore
    - function
- React+typeless
    - 参考: [typelessというReact向け状態管理ライブラリがめっちゃいい](https://qiita.com/sisisin/items/1ee2c798309da614c648)
- yarn workspace,lerna

---

# Firebaseについて

- 言わずとしれたGoogleのmBaaS
- リアルタイムDBとか使えたり、モバイルを簡単に作れるよ！というやつ
- 今回の使い所
    - 社員のメールアドレス（G SuiteなのでGoogleアカウント）による認証とバリデーション
    - 書籍情報の管理
    - 棚卸し機能では棚卸された本が一覧画面にリアルタイム反映される、というおしゃれ機能もあります

小さい社内向けアプリなので、サクッと使い始められて、インフラコストも抑えやすいというのはとても良かったですね
DBアクセスのためのAPIが参照を上手く使おうとするとどうしてもアプリケーションドメインと密結合になってしまいそうで、上手く実装を分離するのは苦労しそうという所感でした

---

# typelessについて

- 概ねReduxのラッパー
- 画面構築のベースに [スターターリポジトリ](https://github.com/typeless-js/create-react-app-starter) を使いました
    - ログイン画面・ログイン前後の画面・ルーティング・参考実装・plopを使ったコードジェネレータなどが殆ど全部揃ったリポジトリ
    - これをcloneしてきて初めたので即実装が進められた
    - 最高
- 去年の10月ぐらいからRedux周りを沢山触ってきたけど、ダントツで使いやすくて最高

まだアルファ版ですが、書き味が異常に良くて、画面側の実装をするときにかなりの部分が迷いなく直感的にかけて最高でした
ある程度モバイルや動きを意識したアプリになりましたが、それでも全然破綻なく書けるので本当に筋の良いライブラリだと思います
みんな使おう

---


# yarn workspace,lernaについて

- いわゆるmonorepoをやりやすくするための仕組み・ツール
- firebase functionsやフロントの間でinterfaceの共有などしたいので、 yarn workspaceとlernaをつかってmonorepo構成にしています
- ついでに全てTypeScriptなので [Project References](https://www.typescriptlang.org/docs/handbook/project-references.html)という仕組みも使ってます

便利でした。TypeScriptのProject Referenceはプロジェクトをまたぐと参照を取りにくい（エディタで関数名を書いたときに `import`文を自動で入れるやつとかが動かない、とか）のが気になりますが、まあそれは追々改善されていくでしょう
地味にnode環境とbrowser環境の差異がある中でtsconfigとか調整してやるのが大変だった話もありました

---

# 質問タイム

なにかあれば。

---

# HappyHacking!
PythonからDockerコンテナ内のMySQLに接続するまで

## 環境
- Python: 3.6
- pipenv: 2018.7.1
- pip: 18.0.0
- mysql-connector-python: 8.0.16
- Docker: 2.0.0.3
- Image: mysql 8.0.16, 8.0, 8, latest

## 執筆したきっかけ
研究で使用する機会があり，備忘録程度にまとめました

## MySQLのコンテナを立ち上げるまで
- Dockerコマンドを確認

  ```
  $ docker -v
  ```
- DockerHubからMySQLイメージをダウンロード

  ```
  $ docker pull mysql
  ```
- コンテナ起動  
参考: [dockerでmysqlを使う](https://qiita.com/astrsk_hori/items/e3d6c237d68be1a6f548)

  ```
  $ docker run --name mysql -e MYSQL_ROOT_PASSWORD=mysql -d -p 3306:3306 mysql
  ```
  `-name`の変数は任意．`MYSQL_ROOT_PASSWORD`はrootのパスワードなので，それなりのものにしてください．`-p`は，動かすポートを指定しています．例えば，8080でデタッチしたいなら，8080:3306としてください．
- コンテナの起動確認

  ```
  $ docker ps
  CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                               NAMES
  bab20717195b        mysql               "docker-entrypoint.s…"   About an hour ago   Up About an hour    0.0.0.0:3306->3306/tcp, 33060/tcp   mysql
  ```
- コンテナに接続

  ```
  $ docker exec -it 'CONTAINER ID' bash
  ```
- MySQLに入る

  ```
  $ mysql -u root -p
  ```
- データベースを作成  
参考: [MySQLチートシート](https://qiita.com/hryshtk/items/dd69db351bb47f57b4e1)

  ```
  mysql> CREATE DATABASE python_test;
  mysql> SHOW DATABASES;
  ```

## PythonからDockerコンテナ内のMySQLに接続するまで
- 仮想環境を構築

  ```
  $ pipenv --python 3.6
  $ pipenv install
  $ pipenv shell
  ```
- ライブラリをインストール

  ```
  $ pipenv install mysql-connector-python
  $ pip list
  ```
- 接続確認  
参考: [Python3でMySQL Connectorのインストール・接続方法【快適に使う方法を紹介】](https://basicincome30.com/python3-mysql-connector)

  ```Python:mysql_test.py
  import mysql.connector

  # コネクションの作成
  conn = mysql.connector.connect(
      host='localhost',
      port='3306',
      user='root',
      password='mysql',
      database='python_test'
  )

  # コネクションが切れた時に再接続してくれるよう設定
  conn.ping(reconnect=True)

  # 接続できているかどうか確認
  print(conn.is_connected())
  ```
time.Timeで日付だけにする(タイムゾーン付)

# 現在時刻を元に0:00にしたり、正午にしたり

タイムゾーンを考慮せずUTCでよければTruncate()を使う方法がありますが、
JSTで、わかりやすく、指定した時間にするにはどうしたらいいのか。
以下の方法がわかりやすいと思いました。

```golang
t := time.Now()
tz, _ := time.LoadLocation("Asia/Tokyo")

yy, mm, dd := t.Date()
today := time.Date(yy, mm, dd, 0, 0, 0, 0, tz)
todayNoon := time.Date(yy, mm, dd, 12, 0, 0, 0, tz)

log.Println(today.Format("2006-01-02 15:04:05")) // 2019-05-17 00:00:00
log.Println(todayNoon.Format("2006-01-02 15:04:05")) // 2019-05-17 12:00:00
```

## 参考にした
https://github.com/golang/go/issues/10894
laravel で php artisan serve してビルトインサーバーを起動すると、ローカルPCからアクセスできない

# laravel で php artisan serve してビルトインサーバーを起動すると、ローカルPCからアクセスできない

###困ったこと
　超久々にvagrant 立ち上げて laravel プロジェクトを作ったら、アクセスできなかった。

###解決策
ホストオプションを以下にするとローカル環境（プライベートアドレス）からアクセスできるらしい
php artisan serve --host 0.0.0.0
VSCodeでリモートデバッグできる環境を整える


注意 (2020.04.14追記): この記事の内容はすでに古いものとなっています．
現在はより簡単にリモートでバッグを設定できるようになっているので[こちら](https://code.visualstudio.com/docs/remote/remote-overview)をご覧ください．

以下の方法を用いてubuntuでは構築することは出来ましたが，windowsでは環境構築出来ませんでした．(pathの大文字小文字が勝手に変換されてしまう問題を解決出来なかったため)

## リモートデバッグとは
ローカル環境からサーバ上などのリモートの環境で動くコードのデバッグを行うこと

## 使ったツール
[SSH FS](https://marketplace.visualstudio.com/items?itemName=Kelvin.vscode-sshfs)
[ptvsd](https://pypi.org/project/ptvsd/)

## 手順

### 1. インストール

**SSH FS**
VSCodeのExtensionから[SSH FS](https://marketplace.visualstudio.com/items?itemName=Kelvin.vscode-sshfs)を検索してインストール

**ptvsd**
リモートのローカルの両方に`pip install ptvsd`で[ptvsd](https://pypi.org/project/ptvsd/)をインストール

### 2. 環境の設定

**Pythonコードの編集**
main文の文頭に以下を追記する．実行の際に`debug`を引数とすることで，[ptvsd](https://pypi.org/project/ptvsd/)を用いたデバッグモードに移るようになる．

```python
if __name__ == '__main__':
    import sys
    if (len(sys.argv) > 1) and (sys.argv[1] == "debug"):
        import ptvsd
        print("waiting...")
        ptvsd.enable_attach(address=('0.0.0.0', 5678))
        ptvsd.wait_for_attach()
```

**SSH FSの設定**
「[Visual Studio CodeでSSHごしにファイルを編集する](https://qiita.com/informationsea/items/5c9f05c81a41fb885460)」を参考に設定してください．

**VSCodeのデバッガの設定**
launch.jsonに以下の記述を追加する．

```launch.json
        {
            "name": "Python: Remote Attach",
            "type": "python",
            "request": "attach",
            "port": 5678,
            "host": "0.0.0.0",
            "pathMappings": [
                {
                    "localRoot": "${workspaceFolder}",
                    "remoteRoot": "."
                }
            ]
        },
```


### 3. 実行方法
1.  サーバー上で`python example.py debug`とうち，リモートデバッグの待機状態にする．`waiting...`と表示される．
2. VSCodeから`Python: Remote Attach`のdebuggerを選択する．
3. 適宜ブレイクポイントを設定する．
4. debugの実行．

## 詰まったところ
### 問題
[sshポートフォワーディング](https://qiita.com/mechamogera/items/b1bb9130273deb9426f5)の設定をしていなかったため，諸設定を行ってもVSCodeとサーバーの環境の接続が確立されていませんでした．
### 対処
=> `ssh -L 5678:localhost:5678 USER@192.168.1.XX`で`USER@192.168.1.XX`にログインすることで，localの`5678`にアクセスするとremoteからアクセスできる`localhost:5678`に繋げるように設定する．`USER@192.168.1.XX`，`5678`は適宜設定しても問題ありません．

## 参考
[sshポートフォワーディング - Qiita](https://qiita.com/mechamogera/items/b1bb9130273deb9426f5)
[Visual Studio CodeでSSHごしにファイルを編集する - Qiita](https://qiita.com/informationsea/items/5c9f05c81a41fb885460)
[VSCodeでPythonのリモートデバッグ - Qiita](https://qiita.com/sinsi404/items/dd0afe1ed038d542d1f1)
java ラムダ式メモ

##関数型インターフェース(functional interface)
関数型インターフェースとは, 抽象メソッドが一つだけ宣言されているインターフェースのこと.
それ以外に特に制約はない.
例えば, デフォルトメソッドやプライベートメソッドは複数持っていても問題ない.

##ラムダ式とは
クライアント(呼び出す側)でインターフェースの実装を与える機能のこと.
ラムダ式を使うことで, インターフェースを実装した具象クラスを作成する必要がなくなる.
ラムダ式は関数型インターフェースの実装を与える場合のみ可能.
なぜならば, 実装を与えたいインターフェースに複数の抽象メソッドがあった時, どの抽象メソッドに実装(定義)を与えるのかコンパイラが特定できない.

##クロージャ
メソッド内でラムダ式やローカルクラス, 匿名クラスを用いて実装を与えるとき, 実装を与えるブロック内でクライアントのローカル変数等を使用できる機能.
クロージャとして用いられた変数はラムダのインスタンスのフィールドとしてコピーされる(javaの場合).参照が渡される言語もある.
クロージャで渡された変数は不変である(final).

##コード例
```InfintieIntSequence.java
public interface InfiniteIntSequence{
        default public boolean hasNext(){ return true; }
        public int next();


        public static InfiniteIntSequence generate(IntSupplier s){
                return s::getAsInt; //@1
        }

        public static InfiniteIntSequence iterate(int seed, IntUnaryOperator f){
                return new InfiniteIntSequence(){
                        int lseed = seed; //@2
                        @Override public int next(){
                                int res=lseed;
                                lseed=f.applyAsInt(lseed);
                                return res;
                        }
                };
        }

        public static InfiniteIntSequence random(int from, int until){
                Random r = new Random();
                int bound = until-from;
                if(0<bound) return ()->r.nextInt(bound)+from;
                else throw new IllegalArgumentException();
        }

        public static InfiniteIntSequence range(int from){
                return iterate(from, i -> i+1 );
        }

        default public void forEach(IntConsumer c, int n){
                while(n-- > 0 && hasNext() ) c.accept(next());
        }
}
```
@1: return で返しているものは, InfiniteIntSequenceインターフェースを継承したclassのインスタンスで, next()メソッドをオーバーライドしている。InfiniteIntSequenceは関数型インターフェースなので, 抽象,ソッドは一つしかないことが担保されている。したがって, next()をオーバーライドすることをコンパイラが理解できるのでいろいろ書くことを省ける。
next()は引数なしでint型を返すシグネチャのメソッドである。
vimで検索する際のコマンド

| /[検索文字列] | 下方向に、[検索文字列]の検索を行う。 |
|:------|:--|
| ?[検索文字列] | 上方向に、[検索文字列]の検索を行う。 |
| n | /や?で検索を行った後に、順方向に次の検索結果にジャンプする。 |
| N | /や?で検索を行った後に、逆方向に次の検索結果にジャンプする。 |
| * | カーソル位置の単語を下方向に検索する。/[カーソル位置の単語]と同じ動作。 |
| # | カーソル位置の単語を上方向に検索する。?[カーソル位置の単語]と同じ動作。 |
Lambda関数でCloudWatchLogをmassageをハンドリングする

#Lambda関数内で、CloudWatchLogのmassageを処理する際の、テストイベントの作成について

・デコード済みのCloudWatch Logs メッセージデータを用意し、そこからCloudWatch Logs メッセージイベントを作成する方法にします。
Lambda レコードの Data 属性は、Base64 でエンコードされており、gzip 形式で圧縮されています。と記述がありますが、
zipで圧縮されたものが、Base64でエンコードされているが正解だと思います。
よって下記のコマンドで複合可能です。

`echo -n "<BASE64ENCODED_GZIP_COMPRESSED_DATA>" | base64 -d | zcat`

###とりあえず、
```encode.
$ echo 'hoge' | gzip | base64
H4sIAM5N3lwAA8vIT0/lAgCdh+K5BQAAAA==
```

```decode.
$ echo -n "H4sIAM5N3lwAA8vIT0/lAgCdh+K5BQAAAA==" | base64 -d | zcat
hoge
```


##参考
[AWS Lambda の Error Processor サンプルアプリケーション](https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/logs/SubscriptionFilters.html#LambdaFunctionExample)


##実際にテストイベントの設定>イベントテンプレート>CloudWatchLogsをデコードしてみる

```
echo -n "H4sIAN5c3lwAA3WPTQuCQBCG7/0KmbMHtS2tm5BJkATqLSSshljID3bHIsT/3mhJdeg27zwzz+y2UKDW+QXTR42whJWf+ocoSBI/DMCE6l6i4rbtTMVs7noLLrh9rS6hqpqaCaGm7RgHkpDCvPigdzZBN0d9UrImWZVreSVUGpb7YewVIRsEwQ1L6lEL8swe7PPmbLOCJD+X8oIv20JYQjgLz7Usyxy/weP7II53cWaspdJk9HZjhJ35q3T+K+1vZZS/97Nu8gQ7YFjSMgEAAA==" | base64 -d | zcat
{"messageType":"DATA_MESSAGE","owner":"123456789123","logGroup":"testLogGroup","logStream":"testLogStream","subscriptionFilters":["testFilter"],"logEvents":[{"id":"eventId1","timestamp":1440442987000,"message":"[ERROR] First test message"},{"id":"eventId2","timestamp":1440442987001,"message":"Massage"}]}
```
#レスポンスコードを再度エンコードしてみます

```
echo '{"messageType":"DATA_MESSAGE","owner":"123456789123","logGroup":"testLogGroup","logStream":"testLogStream","subscriptionFilters":["testFilter"],"logEvents":[{"id":"eventId1","timestamp":1440442987000,"message":"[ERROR] First test message"},{"id":"eventId2","timestamp":1440442987001,"message":"Massage"}]}' | gzip | base64
H4sIAN5c3lwAA3WPTQuCQBCG7/0KmbMHtS2tm5BJkATqLSSshljID3bHIsT/3mhJdeg27zwzz+y2UKDW+QXTR42whJWf+ocoSBI/DMCE6l6i4rbtTMVs7noLLrh9rS6hqpqaCaGm7RgHkpDCvPigdzZBN0d9UrImWZVreSVUGpb7YewVIRsEwQ1L6lEL8swe7PPmbLOCJD+X8oIv20JYQjgLz7Usyxy/weP7II53cWaspdJk9HZjhJ35q3T+K+1vZZS/97Nu8gQ7YFjSMgEAAA==
```
上記の結果から分かるように、相互に変換可能である

##ついでに、ファイルからもエンコードできます。
```
$ gzip -c hoge.txt | base64
4sICMQQ3lwAA2hvZ2UudHh0AMvIT0/NAGIuAAcZkWEJAAAA
```

```
$ echo -n "H4sICMQQ3lwAA2hvZ2UudHh0AMvIT0/NAGIuAAcZkWEJAAAA" | base64 -d | zcat
hogehoge
```
パスワード自動作成機能について考える

考え中です。とりあえず草稿の段階ですが投稿。

Webアプリケーションにパスワード自動作成機能を作る際に考えておくべきことなどをまとめます。
パスワードの自動作成機能の実装自体は簡単なので、ここでは作成するパスワードの要件を考えたいと思います。


### パスワードの強度が高い
当たり前。「aaaa」などのパスワードは作らない。
NISTのガイドラインにある通り、最低8文字以上にする。

### 紛らわしい文字は使わない
たとえば、「0（ゼロ)」と「O（オー）」と「o(オー)」だったり「l(エル)」「1(イチ)」の文字は紛らわしい。
これらの文字が自動作成されたパスワードに含まれているとユーザーが間違えて入力してしまいログインできない場合がある。

### 意図しない単語にならないようにチェックする
いくらランダムにパスワードを作成しても意図せず「f**kU」などの文字列が生成されてしまう可能性は否定できない。

辞書攻撃なども考えると、特定の単語だけでなく辞書に含まれている単語が含まれていたら再生成するようにしたらよいかも。
[Vue.js]改行された時に改行分の高さをとるテキストエリア


## やりたいこと

普段何気なくテキストエリアに文字を入れたり、改行したりしますが、
その際、改行分の高さをとってくれるようなテキストエリアのcomponentをつくりたかった


### ソース


 ```javascript　BaseTextarea.vue

<template>
  <textarea
    ref="adjust_textarea"
    v-model="textareaVal"
    class="c-input-textarea"
    :placeholder="placeholder"
    @keydown="adjustHeight"
  />
</template>

<script>
export default {
  name: 'BaseTextarea',
  props: {
    placeholder: {
      type: String,
      required: true,
    },
  },
  data() {
    return {
      textareaVal: '',
    }
  },
  methods: {
    adjustHeight() {
      const textarea = this.$refs.adjust_textarea
      const resetHeight = new Promise(function(resolve) {
        resolve((textarea.style.height = 'auto'))
      })
      resetHeight.then(function() {
        textarea.style.height = textarea.scrollHeight + 'px'
      })
    },
  },
}
</script>


```
alpineベースのdockerイメージでrailsを動かすまで

# 目的
何かあるとすぐにローカルのイメージ、コンテナ、ボリュームをまっさらにする癖があるが
ローカルでのDockerfileからのイメージのビルドが遅すぎる
高速化して開発効率をあげたい

# ゴール
軽量なイメージを作成し、docker hubにあげて
それを参照するようにしたい

# 実践
## 軽量なイメージを作る
参考記事
- [RailsのDockerイメージを一番小さくする方法](https://qiita.com/baban/items/99877f9b3065c4cf3d50)

scratchは面倒くさそうなので一旦alpineでやります

ちなみに
https://imagelayers.io/
は死んでるので
https://microbadger.com
を使ってイメージの中身を解析できる


```dockerfile:完成したDockerfile
FROM ruby:2.6.1-alpine

WORKDIR /usr/src/app
ENV TZ=Asia/Tokyo

COPY Gemfile .
COPY Gemfile.lock .

COPY package.json .
COPY yarn.lock .

RUN apk update && \
    apk add --no-cache yarn tzdata libxml2-dev curl-dev make gcc libc-dev g++ mariadb-dev imagemagick6-dev && \
    bundle install && \
    yarn install && \
    rm -rf /usr/local/bundle/cache/* /usr/local/share/.cache/* /var/cache/* /tmp/* && \
    apk del libxml2-dev curl-dev make gcc libc-dev g++
```

### 解説
- apkについて
    - `yarn`はwebpacker使うので
    - `tzdata`はないと`rails s`をした時に`tzinfo-data`周りでコケる
    - `libxml2-dev curl-dev make gcc libc-dev g++`はnative extensionで必要(nokogiriとか)
    - `mariadb-dev`はmysql使うために必要
    - `imagemagick6-dev`はrmagick使うために必要
    - なんかよくわからんけど6じゃないとダメらしい
- RUNについて
    - 1個にまとめて`&&`で繋ぐと少し軽くなるらしい
- `/usr/local/bundle/cache /usr/local/share/.cache`について
    - 参考記事にも書いてある通りキャッシュが意外と容量食ってた

## docker hubへのイメージのpush
参考資料
- [DockerImageをDockerHubに登録の仕方](https://qiita.com/kon_yu/items/7c40f4dfbd1cce006ce7)

こちらの記事読めばそのままいけます

# ハマりどころ
最後に`rails s`しようとしたら`tzinfo-data`がないよって言われたり(tzdata追加で解決)
`bundle install`でいろいろパッケージが足りないよって言われたり
手探りでパッケージ入れてく必要があったので大変でした

# 最終的に
最初に適当に作ってたイメージが1.9GB
最終的に1GBを切ったのでだいたい半分ぐらい

雑なメモ書きみたいになってるので運用法含めていつか記事を書き直す
UnityのText Mesh ProでJIS第一水準～第四水準までの日本語を表示させる


ascii、ひらがな、カタカナ、第一水準、第二水準までは "[UnityのText Mesh Proでほぼ全ての日本語を表示させる](https://qiita.com/kgsi/items/08a1c78b3bee71136156)"ですでに作成されていたのですが、第三水準と第四水準を使う用事があったので追加しました。

## 文字一覧
下記のgistからダウンロードしてください。
[AllJapaneseCharacter.txt](https://gist.github.com/Parallax-kk/8665c1bd24cf1609380e682e9bad1e07)

## 含まれる文字
* ascii
* ひらがな
* カタカナ
* JIS 第一水準(JIS X 0208:1997)
* JIS 第二水準(JIS X 0208:1997)
* JIS 第三水準(JIS X 0213:2004)
* JIS 第四水準(JIS X 0213:2004)

## 参照
* [UnityのText Mesh Proでほぼ全ての日本語を表示させる](https://qiita.com/kgsi/items/08a1c78b3bee71136156)
* [fragment.database.（index） > 【Kanji Character】](http://www13.plala.or.jp/bigdata/index_kanji.html)

## 余談
JISにないけど名前でよく使う文字一覧(﨑とか𠮷とか)ってどっかにないですかね…？
DockerでWordPressを動かす

Docker初心者の自分がDockerを入れてまずやりました。
備忘です。

MySQLのインストール＋起動
---
```
docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:5.7
```

WordPressのインストール＋起動
---
```
docker run --name some-wordpress -e WORDPRESS_DB_PASSWORD=my-secret-pw --link some-mysql:mysql -d -p 8080:80 wordpress
```

http://localhost:8080/にアクセス
---
簡単にワードプレスが動きます。
※下の画像はいろいろ動かしたあとの状態。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319276/3861cc1f-a5b2-21b2-87c6-04dab6f70202.png)

[コマンドオプション]
--name:コンテナに名前をつける
-e:環境変数を指定して実行
-d:バックグラウンドで実行
-p:ポートマップ、ホストとコンテナ間のポートフォワード設定。
　基本的には、「-p <ホスト側のポート>:<コンテナ側のポート>」で書きます。
-link:コンテナ同士を紐付ける
-v：オプションでホストの任意のパスをコンテナの任意のパスにマウント
-it:コンテナにログインする

所感
---
Docker簡単に動き過ぎて怖い。。
これは将来インフラエンジニア要らなくなるのではとの危機感感じました。

参考リンク
---
 - 基本  
https://knowledge.sakura.ad.jp/14427/
 - コマンドプション  
https://qiita.com/noralife/items/18301143c20cc5172c56
S3バケットの最終更新日を知る方法

ふとネタを思いついたので書く。

S3の各バケットの最終更新日を知る必要が出てきたのだが、コンソール画面からは確認できないらしい。

そこでバケット内の一番新しいオブジェクトの最終更新日を表示させるスクリプトを書いた。

```
#!/bin/sh
buckets=(
  "bucket_1"
  "bucket_2"
  "bucket_3"
)

for bucket in ${buckets[@]}
do
    LASTMODDATE=$(/usr/local/bin/aws s3 ls $bucket --recursive | sort | tail -n 1 | cut -d ' ' -f1,2)
    echo "$bucket : $LASTMODDATE"
done
```

bucketsにバケット名の指定を自分でする。

雑だけどとりあえずの目的は満たせているのでOK。
【Python】競技プログラミング 基本入力まとめ

#はじめに
タイトルの通り，競技プログラミング向けのPythonの基本入力集です．
なお，文字列の入力がうまくいかないときは`int`を`str`にすることでも対応できます．

#実は
Pythonの`input()` は入力速度がそこまで早くないらしいので，入力が多い問題では以下の一行を文頭に書いておくとTLEを防げるかもしれません． (AtCoderのPython3.4.3で動作確認済)

```python:Python
from sys import stdin
input = stdin.readline
```

**【2019/11/27追記】** 上記の二行だとたまに改行文字まで入力されてしまう場合があるようです。ご注意ください.

```python:Python
x = input().rstrip()
```

**【2020/05/06追記】** 上記のようにinput()の後に`.rstrip()`を入れることで回避できます.


#【1行】1文字
`input()`はstr型で入力を受け取ります．

```:入力
abc
```

```python:Python
s = input()  # sはstr型
```

#【1行】1数字

```:入力
10
```

```python:Python
n = int(input())  # nはint型
```

#【1行】n文字
2個以上の半角スペースで区切られた入力では`map`関数や`split()`を使いましょう．


```:入力
abc def ghi
```

```python:Python
a,b,c = input().split()  #3個の文字列の入力を受け取る
```

リストに格納したい場合．

```python:Python
str_list = list(input().split())  # n個の文字列がリストに格納される
```


#【1行】n数字

```:入力
1 2 3
```

```python:Python
a,b,c = map(int, input().split())  # 3個の数字の入力を受け取る
print(a,b,c)                       # 出力を確認
```

リストに格納したい場合．

```python:Python
num_list = list(map(int, input().split()))  # n個の数字がリストに格納される

```

#【n行】1文字
最初にn回という入力回数が与えられ，その後入力があるような場合です．

```:入力
3
aa
a
aaa
```

```python:Python
n = int(input())  # nは入力回数
str_list = [input() for _ in range(n)]
print(str_list)   # 出力を確認
```

```:出力
['aa', 'a', 'aaa']
```

#【n行】1数字

```:入力
4
2
3
4
5
```

```python:Python
n = int(input())  # nは入力回数
num_list = [int(input()) for _ in range(n)]
print(num_list)   # 出力を確認
```

```:出力
[2, 3, 4, 5]
```

#【n行】n文字
入力回数がn回と分かっている場合，`for`文と`append()`で二次元リストとして入力を格納できます．

```:入力
3
aaa b cc
d ee fff
gg hhh i
```

```python:Python
n = int(input())  # nは入力回数
str_list = []
for i in range(n):
    str_list.append(list(input().split()))
print(str_list)
```

以下は内包表記を使った場合．楽&早．

```python:Python
n = int(input())  # nは入力回数
str_list = [list(input().split()) for _ in range(n)]
print(str_list)
```

```:出力
[['aaa', 'b', 'cc'], ['d', 'ee', 'fff'], ['gg', 'hhh', 'i']]
```

#【n行】n数字

```:入力
3
2 1 3
3 1 2 3
2 3 2
```

```python:Python
n = int(input())  # nは入力回数
num_list = []
for i in range(n):
    num_list.append(list(map(int,input().split())))
print(num_list)
```

同様に内包表記を使った場合．

```python:Python
n = int(input())  # nは入力回数
num_list = [list(map(int, input().split())) for _ in range(n)]
print(num_list)
```

```:出力
[[2, 1, 3], [3, 1, 2, 3], [2, 3, 2]]
```

#さいごに
閲覧いただきありがとうございました．ここまで自力で書けるようになれば簡単な問題の基本的な入力は問題なくなるはずです．
【Java】型の変換時にエラったので調べた。＜キャスト演算子＞

#はじめに
自分の学習メモ。

オブジェクト指向を理解しようとして、ババ抜きを作成中。
その中にこのような記述が

```.java
int pos;
pos = (int) (Math.random() * number);
```

```(int)(Math.random() * number);```ってなんだ。ってなりました。
```pos = Math.random() * number```は無理なのかと思いトライしてみると案の定エラー

##調べてみた
結論から言えば、「キャスト演算子」というものでおそらく基礎なんだろうけど読み飛ばしていたのか。。

データ型の違うものを代入しようとしたときに発生するエラーを防いでくれるもの！

具体的にはこう書いてました。

>サイズが大きい型から小さい型への変換など必ずキャスト演算子を使ってデータ型を変換する必要がある

ここでいう大きいサイズとは、「ビット数」のことを指してます。

| データ型      |       意味 |    サイズ   |
|:-----------------|------------------ |------------------  |
| byte            |     整数       |       8bit       |
|     short      |  整数  |       16bit     |
|          int    | 整数          |       32bit      |
|             long   |   整数       |      64bit       |
|          float    |   浮動点小数点        |  32bit      |
|         double  |    浮動点小数点    |      64bit       |
|         char  |     １文字     |       16bit       |
|         boolean  |   真偽値       |   1bit      |


**〜追記〜**

**→暗黙型変換**

|  → | →      | →     |→ |→ | →|
|:-----------------|------------------ |------------------  |------|------|----|
|      byte  |    short/char    |      int      |long|float|double|
|  ← |  ←     | ←     | ←|← |← |

**←キャストによる型変換**





double(64bit) -> int(32bit)で表現するときには
（大きい）→（小さい）なので、明示的に書いてあげないといけない。

```.java
int pos;
pos = (int) (Math.random() * number);
```
Coldfusionでブラウザにデバック表示

Coldfusionで変数の中身やクエリの取得結果を確認する方法です。
下記は変数、hensuの中身を表示してそのあとの処理をcfabortで止めています。

```
<cfdump var="#hensu#"><cfabort>
```

`cfdump`・・・クエリの取得結果や構造体の中身について表示します。var=""内に変数を入れてください。

`cfabort`・・このタグ以降のページの処理を停止します。
　　　　　　　デバック以外にもif文で変数が不正な場合処理を停止するなどにも使えます。
Pythonで複数の文字列を削除したい ー re.subを使う

# Pythonで複数の文字列を削除したいとき
## 1.replaceを使う
　文字列の置換といえば、Pythonの組み込み文字列メソッド`replace`が手軽で使いやすいですね。しかし、`replace`は単独の置換にしか使えないので、コードが長くなりがちです。たとえば以下のようなケースです。

```python:sample1.py
   text = text.replace(',','')
   text = text.replace('.','')
   text = text.replace('!','')
   text = text.replace('?','')
   text = text.replace(':','')
   text = text.replace(';','')
   text = text.replace("'",'')
   text = text.replace(' ','')
```
## re.subを使う
　このような「置換対象が複数ある」場合は、代わりに`re.sub`を使うとシンプルにかけます。`re`は正規表現モジュールです。
### 2.置換したい文字を全てリストアップするやり方


```python:sample2.py
   text = re.sub(r"[,.!?:;' ]", "", text)
```
　`re.sub`は3つの引数をとります。第3引数(この場合`text`)は文字列操作対象で、第1引数を第2引数に変換します。`replace`に第3引数を付け加えただけなので、`replace`を使っている方も違和感なく使えると思います。第1引数にはリスト`[]`の中に削除対象を列挙します。

### 3.置換したい文字を正規表現で表現するやり方
 さらに、英数字以外を文字列から除去したいなら、

```python:sample3.py
   text = re.sub(r"\W", "", text)
```
　でよいでしょう。`\W`は正規表現で任意の英数字以外(`[^a-zA-Z0-9_]`)を意味します。よって`[,.!?:;' ]`は全て削除されます。

## まとめ
　Pythonで複数の文字列を置換したいとき、1は簡潔でないので、2か3を使うとよいと思います。2は削除対象が特定できるときは確実ですが、手間がかかるのと、またすべての削除対象をカバーできるかが不安です。3は特定のマッチングにしか使えませんが、ずばりパターンを指定できれば最も簡潔かつ完全に意図通りの文字列置換ができます。
ユーティリティはObject.freezeで束ねよう!

コードを書いていくと「この処理は良く使うからメソッドとして切り出そう」というケースが多々出てくると思います。

例えば...

```javascript
// ゼロ埋めするやつ
function zeroPad(num, len){
    let zero = "";
    for(let i = 0; i < len; i++){
        zero += "0";
    }
    return `${zero}${num}`.slice(-len);
}
```

的なやつです。
そして振り返ると、グローバル空間には大量発生した細かいメソッドが...!


# カプセル化
グローバル変数が増えるのはあまり喜ばしい事ではありません。
頭数を減らす為に、オブジェクトでカプセル化してみましょう。

```javascript
const MyUtil = {
    zeroPad(){
        // ぜろうめ
    },
    foo(){
        // ほげほげ
    },
    bar(){
        // ふがふが
    }
};
```

グローバル変数は`MyUtil`だけになりました😉
しかし、これにはひとつ弱点があります。

```javascript
// 既存プロパティorメソッドの上書き
MyUtil.zeroPad = "上書き";

// 新規プロパティ･メソッドの追加
MyUtil.afterAdd = "後付け";
```

好き勝手し放題😭
もっとも、自分で書いたコードならそんな真似はしないと思いますが...
なんかこう「これはユーティリティだよ！弄らないで！」っていうアピールが欲しいですね。


# 編集禁止
そこで`Object.freeze()`の出番です。

これに通されたオブジェクトは、文字通り **凍結** されます。
つまりプロパティの編集が出来なくなり "読取専用" となります。

```javascript
const MyUtil = Object.freeze({
    zeroPad(){
        // ぜろうめ
    },

    foo(){
        // ほげほげ
    },

    bar(){
        // ふがふが
    }
});
```

これで`MyUtil`は鉄壁となりました。
なお凍結されたプロパティの変更を試みた場合、通常モードとStrictモードで挙動が少し異なります。

```javascript
// 通常モード
MyUtil.afterAdd = "後付け"; // 無視される(エラーは出ない)
```

```javascript
"use strict";
MyUtil.zeroPad = "上書き"; // TypeError
```

このように編集禁止とする事で「これはユーティリティ」と分かりやすくなり、動作的にも精神衛生的にも安心の実装となるわけです😊


# 凍結範囲
触れたものを凍結させる最強`Object.freeze()`卍ですが、芯まで凍らす事は出来ないようです。

と言うのも`Object.freeze()`の効果範囲は直下プロパティ止まりなのです。
その下に更にオブジェクトが存在する場合、配下プロパティは凍結されません。

```javascript
const MyUtil = Object.freeze({
    inner: {
        zeroPad(){
            // ぜろうめ
        }
    }
});
```

この場合`MyUtil.inner`の変更は不可能ですが、`MyUtil.inner.zeroPad`は変更出来てしまいます。

```javascript
// 編集不可
MyUtil.inner = "うわがき";

// 編集可能
MyUtil.inner.zeroPad = "うわがき";
```

さしずめ「シャローフリーズ」といったところでしょうか。
なお、オブジェクト全体を凍結させる「ディープフリーズ」ライブラリがあるようです。
オブジェクトを再帰探索し、最深部から順に`Object.freeze()`を適用させている様子です。
使用経験は無いので紹介まで。

- [deep-freeze - npm](https://www.npmjs.com/package/deep-freeze)


# SpecialThanks!
- [Object.freeze() - MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Object/freeze)
mariadbのREPLICATIONを試してみた

# 前提 mariadb サーバー設定
- ユニークなサーバーIDを設定しておく
- ログを有効にしておく

### 同期用ユーザー作成
```sql
GRANT REPLICATION SLAVE ON *.*  TO sqlsync@'%' IDENTIFIED BY '123456';
```

### 詳細
DBサーバー（またはdocker-container）2台で作業:S1, S2
S2がS1をコピーする（逆設定を追加すれば、お互いにコピーも可）
1. まずはS1とS2が同じ初期データを持つようにする。
（データファイルのコピーなり、インポートなり）
2. S1のログファイルと現在のポジションを確認する
3. S2に対し、S1のログファイルを見て同期するように設定する
4. SLAVEを起動し状態を確認する。
5. S1のデータ変更がS2に反映されるか確認する（本記事では割合）

### S1 ログファイルと現在のポジションを確認
```sh
mysql -u root -p
```

```sql
MariaDB [(none)]> SHOW MASTER STATUS;
+--------------------+----------+--------------+------------------+
| File               | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+--------------------+----------+--------------+------------------+
| mariadb-bin.000001 |      330 |              |                  |
+--------------------+----------+--------------+------------------+
1 row in set (0.000 sec)
```

### S2 に対し、S1のログファイルを見て同期するように設定
```sh
mysql -u root -p
```

※以下のHOST設定はlaradockを使ったので、`mariadb`となってる。

```sql
CHANGE MASTER TO
  MASTER_HOST='mariadb',
  MASTER_USER='sqlsync',
  MASTER_PASSWORD='123456',
  MASTER_PORT=3306,
  MASTER_LOG_FILE='mariadb-bin.000001',
  MASTER_LOG_POS=520,
  MASTER_CONNECT_RETRY=10;

START SLAVE;
SHOW SLAVE STATUS \G
```
Power BI スライサーの [空白]

空白値 (Null) を含むデータをスライサーに設定した際、[空白] が気になりませんか？
以下の手法でスライサーから [空白] を無くすことが可能です。

# サンプルデータ
|date| category|
|:----|---:|
| 5/1|AA |
| 5/2|BB |
| 5/3|CC |
| 5/4|AA |
| 5/5|BB |
| 5/6||
| 5/7|AA |
| 5/8|AA |
| 5/9|BB |
| 5/10||
| 5/11|BB|
| 5/12||

# データインポートと配置
データをインポートして、[表] の作成と [スライサー] に [category] を追加しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234798/b17b83c7-1afa-978d-065e-ce41124ad657.png)
AA の上の [空白] が気になりますよね。

先ず、[category] のスライサーをもう一つ設置しました。
※ スライサーを選択して、Ctrl + C → Ctrl + V ですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234798/eaf4a0e6-561e-61cd-d1e2-f90bfd00157f.png)

新しく作成を行ったスライサーを選択し、[書式] > [相互作用を編集] をアクティブに設定。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234798/1fe94ff5-6fe3-3e71-163d-be239657ed01.png)

表の部分のみ、[なし] に設定。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234798/db37bf72-e887-5322-cbd2-4ead4fcd09d9.png)

新しく作成を行ったスライサーから、[空白以外の項目名] すべてにチェックすると、1つ目のスライサーだけ反応しますが、表には反映無し。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234798/ab79209a-7aff-7269-862e-2f9b3f73e81f.png)

[表示] > [選択ウインドウ] にチェックを入れて、非表示にしたいスライサーを [非表示] に。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234798/1dee9387-a847-3c2e-c739-3d26c7b02542.png)

すっきりしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234798/088023f0-0c09-9f2c-75e7-4c6450aefa6e.png)

# 最後に
スライサーは便利なんですけど、まだ使いこなせないですね。
P.S.
昔は、空白の削除ってスライサーに機能があった気が。。。
DockerでElastic Searchを立ち上げる

## File構成
- docker-compose.yml
- elasticsearch
  - DockerFile
- kibana
  - DockerFile

## docker-compose.yml
```yml

version: '3'
services:
  elasticsearch:
    build: elasticsearch
    volumes:
        - ElasticSearch-data:/usr/share/elasticsearch/data
    ports:
        - 9200:9200
    expose:
        - 9300
  kibana:
    build: kibana
    ports:
        - 5601:5601

volumes:
    ElasticSearch-data:
        driver: local
```

## elasticsearch/DockerFile
```DockerFile
FROM docker.elastic.co/elasticsearch/elasticsearch:6.3.2

# x-pack をインストール
#RUN elasticsearch-plugin  install --batch x-pack

# kuromojiをインストール
RUN elasticsearch-plugin  install analysis-kuromoji
```

## kibana/DockerFile
```DockerFile
FROM docker.elastic.co/kibana/kibana:6.3.2
```