OmniAICreator/Qiita-1.07M huggingface dataset:
考える時間を増やそう！Excelアクセスキー集

<h2>概要</h2>
今回は業務効率化のため現場で使えるExcelショートカットを紹介していきます。
Excelショートカットの中でもアクセスキーに絞って紹介していきます！

<h2>アクセスキーとは？</h2>
そもそもアクセスキーというのはExcelなどでAltキーを押すと画面に表示される英数字をたどることでマウスを使わずにツールバーの機能を使うことができるというものです。

下の画像は
Alt → h → b → a　の順で格子の罫線です。


「Alt」
![2019-08-29 (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402218/3fe5c435-0fbc-29ed-e788-d537b6755b54.png)

「h」→「b」
![2019-08-29 (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402218/10abdcc5-2f3f-9720-2a65-7a7a996937bb.png)

「a」
![2019-08-29 (6).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402218/43625390-8db5-d635-40c2-9d0320a56602.png)

完成！

慣れるまではaltを押して自分のしたい項目のアルファベットを確かめながら押していきましょう。
一か月後は確実に覚えているので！

アクセスキーを使うことによって業務スピードは格段にあがります。
エビデンスをまとめたり、設計書を使ったりする作業時間を短縮し、
仕様を考えたり、ロジックを考えたりといった頭をつかって考える仕事に時間が割いていくことができます。

それでもマウスを使っている人がいれば煽り散らしてあげてください。
煽られた人は悔しさに駆られアクセスキーを覚え、その後の人生はずっと時間短縮につながりますのでオススメです！

<h2>便利なExcelアクセスキー集</h2>
便利すぎる、よく使うものだけまとめました。

|機能|コマンド|
|---|---|
|格子の罫線|Alt → h → b → a|
|セルの背景色変更|Alt → h → h|
|セルの文字色変更|Alt → h → f → 1(いち)|
|文字を中央揃え|Alt → h → a → c|
|セルを統合して中央揃え|Alt → h → m → c|
|セルの表示形式変更|Alt → h → n|
|図形の挿入|Alt → n → s → h|
|オブジェクトの挿入|Alt → n → j|
|数式の検証|Alt → m → v|
|区切り位置|Alt → a → e|
|データの入力規則|Alt → a → v → v|
|ウィンドウ枠の固定|Alt → w → f → f|
|列の横幅を最適化|Alt → o → c → a|
|列の横幅を指定|Alt → o → c → w|
|行の高さを最適化|Alt → h → o → a|
|行の追加|Alt → i → r|
|列の追加|Alt → i → c|
|列の横幅を指定|Alt → o → c → w|
|シート名の変更|Alt → o → h → r|
|シート削除|Alt → e → l|
|オートフィル|Alt + e + i + s|
|シート追加(ショートカット)|Shift + F11|
|フィルター(ショートカット)|Shift + ctrl + l(える)|
|オートフィル|Alt + e + i + s|

<h2>自分好みのアクセスキーことクイックアクセスツールバーも活用しよう！</h2>
よく使う操作などはアクセスキーに追加しましょう！
「alt → (数字)」の操作だけで使用することができ更に時間短縮を行えます。
項目の上で右クリック「クイックアクセスツールバーに追加」
![2019-08-29 (7).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402218/be383708-b39b-4f46-acd7-43c36e0ab0dc.png)
画面最上部に追加されました。
これで「alt → (数字)」で使用できるようになりました。
![2019-08-29 (8).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402218/50a910e0-3a9c-d3dc-00aa-a614a5e99742.png)

現場クイックアクセスツールバーのおすすめは以下の通りです。
・スクリーンショット(Evidence取得が早くなる)
・オブジェクトの選択(Evidence整理が楽になる)
・最背面に移動(Evidence整理が楽になる)

<h2>厄介なF1ヘルプ対策</h2>
アクセスキーを使用しているとF1ヘルプを押してしまってうっとおしい。
そんなあなたへF1ヘルプを無効化する方法を是非ご活用ください！
https://forest.watch.impress.co.jp/docs/serial/exceltips/1113101.html

他にはこんな方法もあるそうで
![function.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402218/1231e50c-8dc9-9cc3-2cb4-781800dc5ae9.jpeg)

<h2>まとめ</h2>
というわけで便利なExcelのアクセスキーをまとめました！
次回はもう少し専門性の高いショートカットをまとめようと思います！
それでは！

Windows、エクスプローラ、Googleのショートカット集はこちら
https://qiita.com/harumaki_dayo/items/75d1c1dfcb963d491a2a


![とりかっぷ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402218/a8c92476-5c18-a68c-9d04-00223733560a.png)
つくりました
is_a?(Arry)メソッド

###is_a?(Arry)メソッド
レシーバのオブジェクトが引数クラスのインスタンスであればtrue、そうでなければfalseを返します。
この場合だとarryならtrueを返す
https://ref.xaio.jp/ruby/classes/object/kind_of


#####コンソールで試した

```
[1] pry(main)> arr = [1,2,3]
=> [1, 2, 3]

[2] pry(main)> arr.is_a?(Array)
=> true

[3] pry(main)> arr.is_a?(Hash)
=> false

[4] pry(main)> b = {unko: 3}
=> {:unko=>3}

[5] pry(main)> b.is_a?(Hash)
=> true

[6] pry(main)> b.is_a?(Array)
=> false

```
RHSCLでのPythonのバージョン切り替え

#　前置き

Python2.x系から3.x系にあげる際に、yumなどpython2.x系に依存したパッケージソフトがあると、該当のパッケージソフトが使用できなくなるケースがある。

https://www.logw.jp/cloudserver/8702.html

Python2.7がインストールされているCentOSに対して、
RHSCLを使用して複数のPythonを共存させ、Pythonのバージョンを2.x系→3.x系へ切り替える手順について、記載する。

---

## RHSCL (Red Hat Software Collections) とは

CentOS向けの比較的バージョンの新しい安定版のパッケージソフトを集めたソフトウェア集。

https://www.softwarecollections.org/en/

RHEL/CentOSは、企業向けなので、
提供するパッケージを頻繁にアップデートするのではなく、特定のバージョンのパッケージを長期間に提供する、というポリシーがある.

そのため、提供されているパッケージが古い。

https://www.slideshare.net/moriwaka/red-hat-software-collections

RHSCLは、RHEL/CentOSで提供しているパッケージより新らしく、なおかつ安定しているバージョンのパッケージソフトを利用することができる。

また、RHSCLからインストールしたパッケージソフトは、/usr/libではなく、/opt/rh配下にインストールされ、
環境変数PATHの切り替えによって、
利用するパッケージソフトのバージョンを切り替えることができる。

そのため、Python2.x(既存パッケージソフト)と、Python3.x(RHSCL)との共存なども可能。

---

# Pythonバージョン切り替え

## RHSCLのインストール

下記の手順で、SCLおよびPythonをインストールする。


```bash
$ yum install centos-release-scl-rh  scl-utils
$ yum install rh-python36
```

http://www.tooyama.org/el7/scl.html

---

## Pythonのバージョン切り替え

### 方法1 : 現在のシェルのPythonバージョンを変更

```bash

# 環境変数の値を変更
$ source /opt/rh/rh-python36/enable

# 変更された環境変数を表示
$ env | egrep "^PATH=|^LD_LIBRARY_PATH=|^MANPATH=|^XDG_DATA_DIRS=|^PKG_CONFIG_PATH=" | sort

LD_LIBRARY_PATH=/opt/rh/rh-python36/root/usr/lib64:/usr/local/lib
MANPATH=/opt/rh/rh-python36/root/usr/share/man:
PATH=/opt/rh/rh-python36/root/usr/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
PKG_CONFIG_PATH=/opt/rh/rh-python36/root/usr/lib64/pkgconfig
XDG_DATA_DIRS=/opt/rh/rh-python36/root/usr/share:/usr/local/share:/usr/share

# Pythonのバージョンが変更されたことを確認
$ python -V
Python 3.6.1

$ which python
/opt/rh/rh-python36/root/usr/bin/python
```
---

### 新しいシェルを起動し、新しいシェルのPythonのバージョンを切り替える
```bash

# 新しいシェルを起動し、環境変数を変更
# scl enable 'コレクション名 '‘コマンド’の形式で実行
$ scl enable rh-python36 bash

# 変更された環境変数を表示
$ env | egrep "^PATH=|^LD_LIBRARY_PATH=|^MANPATH=|^XDG_DATA_DIRS=|^PKG_CONFIG_PATH=" | sort

LD_LIBRARY_PATH=/opt/rh/rh-python36/root/usr/lib64:/usr/local/lib
MANPATH=/opt/rh/rh-python36/root/usr/share/man:
PATH=/opt/rh/rh-python36/root/usr/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
PKG_CONFIG_PATH=/opt/rh/rh-python36/root/usr/lib64/pkgconfig
XDG_DATA_DIRS=/opt/rh/rh-python36/root/usr/share:/usr/local/share:/usr/share

# Pythonのバージョンが変更されたことを確認
$ python -V
Python 3.6.1

$ which python
/opt/rh/rh-python36/root/usr/bin/python

# 元のシェルに戻る
$ exit

# バージョンが元に戻っていることを確認

$ which python
/usr/bin/python

$ python -V
Python 2.7.5
```
Go言語のenumをもっと自由に

# 前書き
Go言語は**enum(列挙型)**ような機能がありません
**iota**で使用して実装してる場合は多いそうですが個人的には**map**使用してもいい気がします
#実装例

```go
package main

import "fmt"

const (
	StatusSuccess  = 200
	StatusErr      = 500
)

var statusText = map[int]string{
	StatusSuccess:  "success",
	StatusErr:      "error",
}

func StatusTexts(code int) string {
	str, ok := statusText[code]
	if ok {
		return str
	}
	return statusText[StatusErr]
}

func main() {
	fmt.Println(StatusTexts(1)) // error
}


```
# 最後に
あくまでも個人的気に入っているやり方、正解とは言えません
【多変量回帰】多変量回帰をコードで書いてみる

# はじめに
多変量回帰をプログラミングします。使うデータは前にも使ったアボカドデータです。
https://qiita.com/iwasaki_kenichi/items/ea580fd9498ad6950a75

# カテゴリカルデータの変換
実際に取扱うデータには、整数や実数以外にも、文字列が含まれる場合があります。
いわゆるカテゴリカルデータですが、それを変換するために下記を行うと数値に変換することができます。
文字列から数値（カテゴリ数値）に変換することで、文字列データを多変量回帰に利用することが可能です。

```python:main1.py

df["変数名"] = pd.Categorical(df.変数名).codes

# コード
```python:main1.py

#ライブラリインポート
%matplotlib inline
import numpy as np
from pylab import *
import pandas as pd
import matplotlib.pyplot as plt
from scipy import stats

#データ読み込み
df = pd.read_csv("hogehoge.csv")

df["Categorical_type"] = pd.Categorical(df.type).codes
df["Region_type"] = pd.Categorical(df.region).codes

X = df[["XLarge Bags","Region_type"]]
Y = df[["AveragePrice"]]

X1 = sm.add_constant(X)
est = sm.OLS(Y,X1).fit()
est.summary()

```

#　おわりに
これぐらいもササッと書けるようになりたい。

summaryで出てくる色々な変数の意味は
[ここ](https://to-kei.net/python/data-analysis/linearregression/)がわかりやすいです。
エクスプローラから管理者権限でWindowsTerminalを起動する方法

# 結論
WindowsTerminalの設定で
"startingDirectory": ".",　
を追加する

下記suwt.batファイルをPATHの通った場所に置く

```suwt.bat
powershell -Command "start-process cmd -ArgumentList \"/k cd %CD% ^&^&wt^&^&exit\" -verb runas -WindowStyle Hidden"
```
エクスプローラを開いてCtrl+lを押してsuwtでEnter

以上

※実行は自己責任でお願いします。

# 解説
WindowsTerminalはstartingDirectoryという設定項目で開始時のディレクトリを指定できるが、デフォルトではユーザディレクトリになっている。この設計を"."とするとWindowsTerminalを起動したプロセスのカレントディレクトリが引き継がれる模様。またWindowsTerminalをインストールするとwtコマンドでwindowsTerminalを起動できる。なので、単にエクスプローラで開いているディレクトリでWindowsTerminalを開きたいだけならstartingDirectory行を削除し、Ctrl+lを押してwtでEnterとすればよい。

WindowsTerminalを管理者権限で実行するにはWindowsのスタートメニューから実行する以外では管理者権限で実行されているプロセスからwtコマンドで実行する方法しか確認できなかった(もしかしたらあるかもしれない)。プロセスを管理者権限で実行するにはpowershellコマンドレットのstart-processに-verb runasオプションをつければよい。

エクスプローラからpowershellコマンドレットを呼ぶために、powershellを実行し、-commandオプションでstart-processを実行している。

しかし、start-processを-verb runasオプション指定するとカレントディレクトリが引き継がれないという問題があった。なので、カレントディレクトリを移動してからwtを起動している。

start-processで起動したcmdは邪魔なので-WindowStyle Hiddenオプションで非表示にしているが、そうするとWindowsTerminalを終了しても裏で残り続けるので、wtコマンドの後に&&exitしている。これでWindowsTerminalを終了すれば非表示のcmdも終了する。
(Python)pandas.DataFrame の to_excel で index 列を出力しない方法


## 問題：pandas.DataFrame の to_excel で index が出力される
pandas.DataFrame で、Excelファイルを生成するメソッド、to_excel() を実行したときに、意図はしていなかったのですがDataFrame の index（行のアクセサ）がデフォルトで出力されるようでした。

```sample.py
from pandas import DataFrame

def generateExcelFrom(dataFrame:DataFrame, filepath:str)->None:
    dataFrame.to_excel(filepath)
    return

dataFrame = new DataFrame([
    ['a','b','c','d','e'],
    ['f','ggg','hhhh','ii','jjjjjjjj'],
])
generateExcelFrom(dataFrame, './sample.xlsx')
```

**出力結果**
![excelDemo1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342307/2e42d9c2-cc56-063b-4aa9-1a64688206d5.png)


配列データ自体は5列ですが、DataFrame が header（列のアクセサ） と index（行のアクセサ）を両方保持しており、A列にindex列を描画するようでした。

データを意図した形で出力したわけではないため、index列を出力しない方法を探したところ、公式ドキュメントに対応方法が書いてありました。
https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.to_excel.html

## 解決法： index=False を to_excel の引数として渡す。

参照
https://stackoverflow.com/questions/22089317/python-to-excel-without-row-names-index

```sample.py
from pandas import DataFrame

def generateExcelFrom(dataFrame:DataFrame, filepath:str)->None:
    dataFrame.to_excel(
        filepath,
        index=False
    )
    return

dataFrame = DataFrame([
    ['a','b','c','d','e'],
    ['f','ggg','hhhh','ii','jjjjjjjj'],
])
generateExcelFrom(dataFrame, './sample.xlsx')
```

**出力結果**
![excelDemo2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342307/e555c85a-5514-7043-60fa-ef09ba71e0b9.png)

index列が消え、配列の出力ができました。

## 追記：Header を出力しない場合は header=False を設定する

```sample.py
from pandas import DataFrame

def generateExcelFrom(dataFrame:DataFrame, filepath:str)->None:
    dataFrame.to_excel(
        filepath,
        index=False,
        header=False
    )
    return

dataFrame = DataFrame([
    ['a','b','c','d','e'],
    ['f','ggg','hhhh','ii','jjjjjjjj'],
])
generateExcelFrom(dataFrame, './sample.xlsx')
```

**出力結果**
![excelDemo3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342307/50a5e84b-4def-7491-2337-c81e700929bd.png)


このように、DataFrame の to_excel() メソッドを使う際に、index と header を制御したい場合は、parameter に、 `index=False` 及び `header=False` を付け加えることで出力を制御できるようでした。


## 前提条件
```
python --version
Python 3.7.4

numpy==1.17.1
openpyxl==2.6.3
pandas==0.25.1
```

以上です。
Laravel公式で紹介されているNginxの設定の理屈が分からない人向け

## 概要

Laravelの↓で紹介されているNginxの設定でなぜ動くのかの解説
https://readouble.com/laravel/5.8/ja/deployment.html

## 解説

### `location /` 部分の設定

↓の部分の try_files の役割は下記の通りになっている。

* $url にファイルがあるか
* $url/（/で終わるファイルパスなので、要はディレクトリ）にディレクトリがあるか
* ↑がなければ、/index.php$query_string へ内部リダイレクトする

```
location / {
    try_files $uri $uri/ /index.php?$query_string;
}
```

### `location ~ \.php$` 部分の設定

基本的に `location /` の結果として`index.php`になって内部リダイレクトされている前提になる。
`index.php`で内部リダイレクトされるので、`location ~ \.php$` にマッチする。

あとは、`location ~ \.php$`の設定に従い、php-fpmを経由してLaravelの開始スクリプトの`index.php`が実行されるという流れ。

ちなみに、↓部分は、Laravelがいるサーバ（=php-fpmが起動しているサーバ）のLaravelの`index.php`のパスを指定されていれば良いので、

```
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
```

Laravelの`index.php`が `/laravel/public/index.php` にいる場合、↓のようにベタ書きしても動く。

```
fastcgi_param SCRIPT_FILENAME /laravel/public/index.php;
```

### 余談1

ベタ書きした場合でも`SCRIPT_FILENAME`の末尾には`$query_string`は不要
※Laravel側でちゃんとパラメータは取れる

`location /`の
`try_files $uri $uri/ /index.php?$query_string;` を
↓
`try_files $uri $uri/ /index.php;`
にするとLaravelにパラメータが来なくなる。

### 余談2

下記の状態の場合、

```
リクエスト：http://localhost/aa?aaaa=123
root：/usr/share/nginx/html/
```

`location ~ \.php$`に来た時、↓になる。

```
$realpath_root：/usr/share/nginx/html
$fastcgi_script_name：index.php
$query_string：aaaa=123
```
※`$query_string`はphp-fpmに渡す必要ないけど
オススメ！ Evryday Rails - RSpecによるRailsテスト入門を購入しました！

タイトルの通りEvryday Rails - RSpecによるRailsテスト入門を購入しました。
購入しようと思った理由は、RSpecを書いてみたくて、いままで自分で調べながらやっていたけど、情報がバラバラで自分ではいまいち理解できずモヤモヤしていたから。

今日は３章までやってみたが、とにかく分かりやすい！モヤモヤしてたのがス～と消えてく感じです。これから頑張っていきます！

##余談
Windows 10 Home
購入してさっそく勉強を始めようとして、Google Chromeをダブルクリックしたらなぜか開かない:scream:
昨日まで正常に動いたのに。Microsoft Edgeを開いたらこれは正常に起動した。調べていろいろ試したけど変化が無かったので、結局Chromeを削除し、再インストールしたら起動するようになりました。なぜ急に壊れた？？？
【随時更新(予定)】Pythonのデータを格納するオブジェクト

###はじめに
自分の備忘もかねて、基本中の基本をまとめていきます

###データを格納するオブジェクト
リスト(list)
タプル(tuple)
集合(set)
辞書(dictionary)

####タプル(Tuple)
```python:tuple.py
location = (13.4125, 103.866667)
```

####集合(Set)
```python:set.py
numbers = {1, 2, 6, 3, 1, 1, 6}
```

####リスト(List)
```python:list.py
list_of_random_things = [1, 3.4, 'a string', True] 
#listはstring, int, floatすべて可能

list_of_month = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "July", "Aug", "Sep", "Oct", "Nov", "Dec"]
                   0      1      2      3      4      5       ......
#listのindexは0から始まる(一番初めの要素からの距離)
list_of_month[1] #["Feb"]

#list[(含む):(含まない)]
list_of_month[1:4] #["Feb", "Mar", "Apr" ]
list_of_month[:3] #["Jan", "Feb", "Mar" ]
list_of_month[5:] #["Jun", "July", "Aug", "Sep", "Oct", "Nov", "Dec"] 

#上書き可能(可変)
my_lst = [1, 2, 3, 4, 5]
my_lst[0] = 'one'
print(my_lst) #['one', 2, 3, 4, 5]
```

####辞書(Dictionary)
```python:dictionary.py
elements = {"hydrogen": 1, "helium": 2, "carbon": 6}
animals = {'dogs': [20, 10, 15, 15], 'cats': [3,4,2,8,2,4], 'rabbits': [2, 3, 3]}
#検索１
print(animals['dogs']) #[20, 10, 15, 15]
#検索２
print(animals['dogs'][3]) #15
#新しいkeyとvalueの追加
animals["birds"] = [4,5,5,6]  
print(animals) #{'dogs': [20, 10, 15, 15], 'cats': [3,4,2,8,2,4], 'rabbits': [2, 3, 3], 'birds': [4,5,5,6]}
```

###まとめ
|データ型 |順序 |変更<br>追加<br>削除 | 表記 |例 |
|---|---|---| --- |--- |
|タプル(Tuple) |〇 |× |  () or tuple()   |  (5.7, 4, 'yes', 5.7)  |
|セット(Set) |× |〇 | { } or set() | {5.7, 4, 'yes'} |
|リスト(List) |〇 |〇 |  [] or list()  | [5.7, 4, 'yes', 5.7]  |
|辞書(Dictionary) |× |〇 | { } or dict() | {'Jun': 75, 'Jul': 89} |

###参考
はじめてにQiitaに当たって書き方を参考に
[Qiita書き方](https://qiita.com/hiroyuki_hon/items/f2a779bb295fd12646ab)

これを使って練習したい(願望)
[Hackerrank](https://www.hackerrank.com/domains/python)
docker for macでinsecure registryを設定する

macOSのメニューバーにあるDockerアイコンから`Preferences...`を選択し、プリファレンスを表示します。

<img width="290" alt="Screen Shot 2019-08-29 at 20.43.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7565/687cf30b-3e3a-da37-06e6-06ddcf92935b.png">

Daemonタブの`Insecure registries:`に対象のサーバを追加します。

<img width="612" alt="Screen Shot 2019-08-29 at 20.42.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7565/18ce042d-d097-e34b-a51a-a64bee9344a5.png">

最後に `Apply & Restart` ボタンをクリックして適用します。
ヒット&ブローゲーム

#はじめに
初めまして！
奏詩と申します。
基本的には自分用のメモや後々の見返しのために記事書いてます。

軽く自己紹介しますね٩(ˊᗜˋ*)و

## 奏詩(そうし) 
1998年生まれの魚座。
学歴は高校（文系）卒。
フリーター⇨営業⇨起業⇨失敗⇨SESで全くプログラミング未経験ながら働き始める**⇦イマココ**
ゲーム大好き。FPS、RPG、シミュレーションなんでもやる。
Macをスタバで開くのが好き。何もできない。

###僕と近い境遇をもつあなたに
この記事はプログラミング未経験者（趣味で触っている）とかプログラミング初心者（学校で触っていた）などの触った経験はあるけど実務をやったことがないなんて言うエセ初心者（ごめんなさい）じゃなく、本当に触ったこともない勉強もしたことがない、じゃば？何それおいしいの？ってレベルの方達がプログラミングを勉強する後押しになればなと思って書いています。

####ここからが本題
今回は初投稿なので昨日ぐらいにやっと終わった本の写経を載せたいと思います。
作成したのはヒット&ブローゲーム、ランダムな４つの数字を当てるゲームです。
自分自身書いていて半分ぐらいしか理解できてないです。

```python
# Python3
import random
import tkinter as tk
import tkinter.messagebox as tmsg

# ボタンがクリックされたときの処理
def ButtonClick():
    # テキスト入力欄に入力された文字列を取得
    b = editbox1.get()

    # Lesson 5-4のプログラムから判定部分を借用
    # 4桁の数字かどうかを判定する

    isok = False
    if len(b) != 4:
        tmsg.showerror("エラー","4桁の数字ではありません")
    else:
        kazuok = True
        for i in range(4):
            if (b[i] < "0") or (b[i] > "9"):
                tmsg.showerror("エラー","数字ではありません")
                kazuok = False
                break
        if kazuok:
            isok = True

    if isok:
        #4桁の数字であったとき
        #ヒットを判定
        hit = 0
        for i in range(4):
            if a[i] == int(b[i]):
                hit = hit + 1

        #ブローを判定
        blow = 0
        for j in range(4):
            for i in range(4):
                if (int(b[j]) == a[i]) and (a[i] != int(b[i])) and (a[j] != int(b[j])):
                    blow = blow + 1
                    break
        # ヒットが4つなら当たりで終了
        if hit == 4:
            tmsg.showinfo("当たり","おめでとうございます！あたりです！")
            # 終了
            root.destroy()
        else:
            #ヒット数とブロー数を表示
            rirekibox.insert(tk.END, b + " /H:" + str(hit) + " B:" + str(blow) + "\n")

# ランダムな4つの整数を作る
a = [random.randint(0,9),
     random.randint(0,9),
     random.randint(0,9),
     random.randint(0,9)]

#テストのために表示させる
print(str(a[0]) + str(a[1]) + str(a[2]) + str(a[3]))
    
# ウィンドウを作る
root = tk.Tk()
root.geometry("600x400")
root.title("hit&blowゲーム")

#履歴表示のテキストボックスを作る
rirekibox = tk.Text(root, font=("Helvetica" , 14))
rirekibox.place(x = 400 , y = 0 , width = 200 , height = 400)

# ラベルを作る
labell = tk.Label(root, text = "数を入力してね", font=("Helvetica",14))
labell.place(x = 20, y = 20)

# テキストボックスを作る
editbox1 = tk.Entry(width = 4, font=("Helvetica", 28))
editbox1.place(x = 120, y = 60)

# ボタンを作る
button1 = tk.Button(root, text = "チェック", font=("Helvetica",14), command=ButtonClick)
button1.place(x = 220, y = 60)

# ウィンドウを表示する
root.mainloop()    
```

これでやっと画面上にゲーム画面を出すことができました。
Progate⇨本と勉強してこのレベルです。鼻くそです。

######本当の初心者の方に
最初はコマンドプロンプトに慣れるところからです。文字だけの画面を見て寝ないように頑張りましょう。
僕はたまたま最初にLinuxを使う現場に回されたのでひたすらカタカタしてました。（めっちゃ寝ました）

転職で未経験からエンジニアになろうとしてる方、SESに転職したけど事務みたいなことしかさせてもらえない方、一緒に頑張りましょう。諦めず地道に自分で勉強して「エンジニア」目指しましょう！


#終わりに
今はなぜか業務でCobolを触っていますが（なんで？）,将来のためにPythonを勉強してます。
今後また作ったものを上げていくかもしれないので応援してもらえるとやる気も上がります。（助けてください。）
MicroViewControllerのInjectableとInteractableプロトコルを使ってみたら良かった話

最近少し入力が多くて画面が多く複雑な画面を実装することになったので、iOSDC2018で発表されてたMicroViewControllerを思い出して、ViewController間のやりとりを入力と出力のプロトコルで縛る方式で行うようにした。

「MicroViewControllerのやり方良いよね」というと、正しく相手に通じないかもしれないので何が良いかというのを書いておこうと思います。私は別にButtonとかCellとかをViewControllerにしたいわけじゃなくて、単に入力と出力のプロトコルが良いよね、コンセンサスとりやすいよね、これをベースとさせてもらって自分で好きにやっていけば良いよねということが私の感想です。

## 全体的なイメージ

この話のサンプルとして次の4つのViewControllerを考えました

- 何かを編集する目的のある画面のちょっと複雑なEditViewController
  - 2パターンの値を編集する画面で2パターン切り替える画面のEditValueContainerViewController
    - 値を編集するコンテナの中のEditViewController
- 値を計算したりするCalcViewViewController

![MicroViewController.001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16400/2c0ad59e-f926-c586-c841-e35f60e09412.png)


## 入力

https://github.com/mercari/Mew/blob/master/Sources/Mew/Protocols/Injectable.swift

```swift
public protocol Injectable {
    associatedtype Input
    func input(_ input: Input)
}
```

サンプルとしては`EditValueContainerViewController`から`EditValueViewController`に初期値を渡すような際にも使える。

```swift
class EditValueViewController: UIViewController {
    struct Input {
        let value: Int
    }
  
    ... 
}

extension EditValueViewController: Injectable {
    func input(_ input: Input) {
        // self.input = input として使い回すときもあるけどしなかったりもする
        if isViewLoaded {
            label.text = input.value
        }
    }
}
```

`func input(_ input: Input)`が単なるメソッドなのが良い。これを`var input: Input`にしてしまうと入力を`get`できてしまう。

```swift
// プロパティだったらgetできるのでprintしてみる
print(viewController.input)
```


`get`して誰かが困るかっつうと困らない。困らないんだけど入力を`get`する意味がないのでできない方が良くて、メソッドなのでセットしかできないのがいい。言い換えると、セットしかしないんだからセッターしかない。良い。

## 出力

https://github.com/mercari/Mew/blob/master/Sources/Mew/Protocols/Interactable.swift

```swift
public protocol Interactable {
    associatedtype Output
    func output(_ handler: ((Output) -> Void)?)
}
```

例えば、EditValueViewControllerがコンテナに結果を伝えたい

```swift
class EditValueViewController: UIViewController {
    struct Input {
        let value: Int
    }
    
    // OutputはInputと同じにもできる。つまり入力の型と出力の型は同じ
    typealias Output = Input
    private var outputHandler: ((Output) -> Void)?
    ... 
  
    func textFieldが入力されて値が変わったよ(_ changedValue: Int) {
        outputHandler?(Output(value: changedValue))
    }
}

extension EditValueViewController: Interactable {
    func output(_ handler: ((Output) -> Void)?) {
        outputHandler = handler
    }
}
```

これも入力と同じで出力がメソッドなのがいい。

## その他の良い点

その他の良い点も書いておく。

- そもそもこのprotocolはViewControllerに限定せずViewでも使えるのがいい
- 複数人でも入力と出力だけやり方を揃えてぶらさず、そこを重点的にチェックすれば良くなるはず
- また、入力と出力さえ公開されていればよくて他はすべて`private`でいい。人のコードをチェックする際に考えることが減りそうなのもいい
kinesisのKPLとKCLに非対応の言語でそれっぽい実装をする

# KPL/KCLについて

あえていまさらですが、メリットいろいろあるので余程のノックアウト要件がない限りは

* KPL(※)を使ってkinesisに書き込み
* KCL(※)を使ってkinesisから取得する

という形になると思います。

※KPL
https://docs.aws.amazon.com/ja_jp/streams/latest/dev/developing-producers-with-kpl.html
※KCL
https://docs.aws.amazon.com/ja_jp/streams/latest/dev/developing-consumers-with-kcl.html
https://docs.aws.amazon.com/ja_jp/streams/latest/dev/developing-consumers-with-kcl-v2.html


# KPL/KCL使いたくない場合もある

KPL/KCLを使うともれなくjavaがついてきますよね
KCLもいろいろな言語の皮をかぶっていますが結局javaっていう感じですし
でもシステム内で **そこだけjava**  みたいな場合は **やっぱり使いたくないな。。。** って思いますよね
あとlambdaでkinesisからrecordとってきてささっと保存だけしたいのに **集約されてる。。。** ってなります。

# aws-kinesis-aggで集約・集約解除はできる

https://github.com/awslabs/kinesis-aggregation

|対応言語|
|---|
|java|
|go|
|python|
|node|

# 


## 集約

ごめんなさい書いてないです。。。
集約を独自に実装する場合はbuffer処理は自分で実装する必要がありそうです。
集約はinterfaceが用意されているので簡単にできそうでした。


## 集約解除
kplを使って集約したrecordをlambdaで解除してs3に保存します

## lambda + node

firehose使えばそれはそれで問題ありません。
でもbucket振り分けたいとか、パスをいろいろいじりたいとかなってくるとロジック書きたくなっちゃうので、そういった用途です。

```javascript

const aws = require('aws-sdk');
// aws-kinesis-aggはnpm installとだめです
const agg = require('aws-kinesis-agg');

// change time zone
process.env.TZ = 'Asia/Tokyo';

// get aws sdk
const s3 = new aws.S3({ apiVersion: '2006-03-01', region: 'ap-northeast-1' });

exports.handler = async(event, context) => {
    "use strict";
    console.log('Loading function s3 write');

    /* Process the list of records and transform them */
    for (const record of event.Records) {
        /* kinesis aggregate record decode */
        agg.deaggregateSync(record.kinesis, true, (err, userRecords) => {
            if (err) {
                console.error(err);
                return;
            }
            /* record handler */
            console.log(JSON.stringify(userRecords));
            userRecords.forEach(item => {
                let data = Buffer.from(item, 'base64').toString('utf8');
                s3.putObject({
                        Bucket: 'xxxxx',
                        Key: 'xxxxx',
                        Body: data
                    },
                    (err, data) => {
                        if (err) {
                            console.error(`s3 put error ${JSON.stringify(err)}`);
                        }
                    });
                });
        });
    }
    return `Successfully processed ${event.Records.length} records.`;
};

```
文字コードってなんなの

## 概要

「文字コードってなんなの?」という疑問に答えます。


## 文字コードってなんなの

文字コードは、文字に対応するバイト列のことです。


## バイト列ってなんなの

バイト(byte)は 8bit のことです。 8bit は8桁の2進数のことです。

```python
'00000000'    # 10進数では0   16進数でも0
'11111111'    # 10進数では255 16進数ではff
```

バイト列というのは、この 8bit が並んでるもののことです。

```python
# こういうこと。
'000000001111111100000000'  # 2進数で
'00ff00'                    # 16進数で
```

Python ではバイト列を以下のように表現します。

```python
# `\x` は16進数を表しています。
b'\x00\xff\x00'

# '00ff00' からの変換方法。
bytes.fromhex('00ff00')
```

そんなわけで、文字をこんなん(`b'\x00\xff\x00'`)で表現したものが文字コード、だということになります。


## 実際の例

文字をバイト列に変換する方式はいくつかあり、そのひとつが UTF-8 という方式。

Python ではこんな風に変換できます。

```python
print( 'a'.encode('UTF-8') )  # b'a'
print( 'ă'.encode('UTF-8') )  # b'\xc4\x83'
print( 'あ'.encode('UTF-8') )  # b'\xe3\x81\x82'
print( '🅰'.encode('UTF-8') )  # b'\xf0\x9f\x85\xb0'
```

この通り、文字とバイト列が対応しているのがわかります。
Nuxt.jsでVeeValidateの3.x系を使う（導入部分だけ）

# 概要
Nuxt.js(2.8) x なんちゃってTypeScript x VeeValidate3.x系で実装してみる
導入部分だけです。

# 実装
まずはインストール

```
$ npm install vee-validate
```

### pluginsファイルを追加

```src/plugins/veeValidate.ts
import Vue from 'vue';
import {
  ValidationProvider, configure, localize, extend,
} from 'vee-validate';
import ja from 'vee-validate/dist/locale/ja';
import {
  required, max, email,
} from 'vee-validate/dist/rules';

Vue.component('ValidationProvider', ValidationProvider);

// 共通で変更したいoptionがあれば
configure({
  bails: false,
});

// 必要なruleを追加していく
extend('required', { ...required });
extend('max', { ...max });
extend('email', { ...email });

// 一括でもrulesをextendできる
// import * as rules from 'vee-validate/dist/rules';
// for (let rule in rules) {
//   extend(rule, rules[rule]);
// }

localize('ja', ja);
```

### nuxt.configに追記

```nuxt.config.ts
import NuxtConfiguration from '@nuxt/config';

const nuxtConfig: NuxtConfiguration = {
  plugins: [
    '@/plugins/veeValidate.ts',
  ],
};
```

~~`Cannot find module 'vee-validate/dist/locale/ja'`
となってコケたので、以下の記述追加~~
`plugins/veeValidate.ts`で 

```
import ja from 'vee-validate/dist/locale/ja.json';
```
とすればいいだけだったので、以下のファイルは不要。

```/src/types/veeValidate.d.ts
declare module 'vee-validate/dist/locale/ja';

// 一括で記述してもOK
// declare module 'vee-validate/dist/locale/*';
```

### コンポーネント実装

`rules`は`plugins`で`extend`したものが使える
`slot` で結構いろんな値が取れる

```/src/pages/test.vue
<template>
  <div>
    <validation-provider
      ref="messageForm"
      v-slot="{ errors }"
      rules="required|max:400"
      name="メッセージ"
    >
      <input
        v-model="message"
        type="text"
      />
      <span v-if="errors.length" v-for="(error, i) in errors" :key="`errors${i}`">
        {{ error }}
      </span>
    </validation-provider>
  </div>
</template>
```

以下のようにして、手動でチェックすることも可能
`<validation-provider>` に `ref` を追加しておく

```/src/pages/test.vue
<script lang="ts">
import { Component, Vue } from 'vue-property-decorator';
import { ValidationProvider } from 'vee-validate';

@Component
export default class PagesTest extends Vue {

  // https://baianat.github.io/vee-validate/guide/validation-provider.html#adding-errors-manually
  // $refsが正しい型付けを提供しないという問題に直面する可能性があります。
  // ValidationProviderインスタンスとして定義することで解決できます。
  $refs!: {
    messageForm: InstanceType<typeof ValidationProvider>;
  };

  public async check(): Promise<boolean> {
    const validationResult = await this.$refs.messageForm.validate();
    if (!validationResult.valid) {
      return false;
    }
    return true;
  }
}
</script>
```

## まとめ
結構今までのと書き方が違ったので時間がかかった。
探せばあるかもしれないけど、 今までの `v-validate.disable="required"` みたいな書き方が見つからなかった。
LambdaでGSI（とか）をQueryする【忘備録】

# なんか情報少なくね
という訳で忘備録として投稿
# 前提
- Lambda(Node.js)

#やり方
```index.js
const AWS = require('aws-sdk');
const dynamo = new AWS.DynamoDB.DocumentClient({
    region: 'ap-northeast-1'//リージョン
});
exports.handler = async (event) => {
let params = {
        TableName: TABLE_NAME,//テーブル名を指定
        IndexName: INDEX_NAME,//インデックス名を指定
        ExpressionAttributeNames:{'#hoge': 'hoge','#time': 'time'},
        ExpressionAttributeValues:{':val': 'foo',':time': '0'},
        KeyConditionExpression: '#hoge = :val and #time >= :time'//上の２文はプレースホルダー
    };
const request = await dynamo.query(params).promise();
return request.Count;
}
```

以上。`IndexName`でインデックスを指定するのが肝

# おまけ
まとめて書き込みたいときは`batchWrite`が便利
ドキュメント等をみるとコールバックで処理するのが多いですが、await 〇〇.promise();で同期処理できてコールバック地獄にならない。
２つの日付データの日数を計算する方法

# はじめに
2つの日付データから日数を算出する方法を考えてみました。
例）`2019-08-25`と`2019-09-10`の2つの日付データの日数を算出する。
といった感じです。

# 環境
+ OS: Windows10
+ Java:1.8.0.201
+ ASTERIA Warp : 1906

# フロー
Mapper関数だけです。

<img width="237" alt="DateCalc1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180292/0966d248-3aba-7458-3da7-249132954aba.png">


※入力値がDateTime型ではないときはStrToDateStd関数で予め変換しておきます。

+ 2つの日付データ(DateTime型)をそのままSubtract関数に差し込みます
<img width="463" alt="DateCalc2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180292/e71de554-ae72-7b95-2f80-541abebc749e.png">

Subtract関数で暗黙的にミリ秒数に変換されて差分が出力されるようです。

+ その結果をDivide関数を使って1日のミリ秒数(=86400000)で除算します
<img width="400" alt="DateCalc3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180292/a9abaca5-e90f-8e88-6efe-e70b50707d49.png">

丸め処理は「スケール」プロパティで`0`で指定してますが、Round関数を使ってもよいかと思います。


# 終わりに
DateTime型のデータをそのままSubtract関数で減算するので一瞬？とも思いますが、ミリ秒数で自動的に持ち直してから演算してくれるようです。

Divide関数で除算する値はミリ秒数なので時間で算出したいときは3600000(1時間=60分=3600秒=3600,000ミリ秒)で割ればよいですね。


以上です。
ionic + vueでqr-scannerを使いたい時のメモ（自分用）

https://qiita.com/reon777/items/82f6292248d76d1f3360
ここでvue.jsにcordovaをインストールする

＊ここはかなり手こずった。

*cordovaをインストールする場所に要注意

https://github.com/ionic-jp/capacitor-docs/blob/master/site/docs-md/cordova/using-cordova-plugins.md

*capacitorでcordovaのプラグインを使う時の方法

$ npm install @ionic-native/qr-scanner
$ npm install cordova-plugin-qrscanner
$ npx cap sync

この時エラー文大量に出てきたけど無視して行った。

https://ionicframework.com/docs/native/qr-scanner

これとは微妙に書き方が違うので注意


```typescript:qrscan.vue

hoge() {
      const qrScanner = new QRScanner(); //新しくインスタンスを生成
// qrScanner.変数名でいろんな機能を使えるようになった
      qrScanner.prepare().then((status) => {
        if (status.authorized) {
          console.log('hogehoge')
          qrScanner.show();
          const scanSub = qrScanner.scan().subscribe((text: string) => {
            console.log(text);
            qrScanner.hide();
            scanSub.unsubscribe();
          });
        }
      }).catch((e) => {
        console.log(e);
      });
    },
```
【Vue.js】Vuejsをchromeブラウザでデバッグする方法

開発環境
⭐️Mac book pro (Mac OS Mojave)
⭐️ブラウザ　Google Chrome



https://twitter.com/nonnonkapibara/status/1166711295384510465
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">⛱️Vue.js⛱️CodePen⛱️<br>Vue.jsをCodePenで実装してみたよぉ。<br>CDN（インターネット経由）でできるので、めっちゃ便利♪♪<a href="https://t.co/z92om6dOAu">https://t.co/z92om6dOAu</a> <a href="https://t.co/FrcWwWINq0">pic.twitter.com/FrcWwWINq0</a></p>&mdash; non (@nonnonkapibara) <a href="https://twitter.com/nonnonkapibara/status/1166711295384510465?ref_src=twsrc%5Etfw">August 28, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
<br>
<h2>Vuejsをchromeブラウザでデバッグする方法</h2>

1.Chromeのアドオン「Vue.js Devtools」を入れる。
Vue.js Devtools
https://chrome.google.com/webstore/detail/vuejs-devtools/nhdogjmejiglipccpnnnanhbledajbpd
<img width="1011" alt="スクリーンショット 2019-08-29 18.52.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93155/988f37a3-0a72-aef9-3a5c-2b7a32c0e8df.png">




2.インストールが終わったらVue.js Devtoolsのアイコンを右クリックして「拡張機能を管理」を開く
<img width="576" alt="スクリーンショット 2019-08-29 18.55.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93155/0d2bd18e-85ea-b0c2-f7c1-ad62ab11ae02.png">


3.「Vue.js Devtools」ONにして、「ファイルのURLへのアクセス許可する」をONにする
<img width="867" alt="スクリーンショット 2019-08-29 18.56.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93155/973036b0-f906-e011-50ed-11afa6880d3c.png">
<img width="774" alt="スクリーンショット 2019-08-29 18.57.30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93155/b6de3d14-9ef1-fdbd-abc9-f3f72f13bed8.png">



main.jsの上部に

```
Vue.config.devtools = true;
```

を追記する
<img width="690" alt="スクリーンショット 2019-08-31 1.51.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93155/c340f62b-4b58-ce15-c591-9984ec5260e1.png">



4.Vue.jsページをChromeで開くと、Vue.js Devtoolsアイコンが有効になる。緑色がつく。
<img width="1019" alt="スクリーンショット 2019-08-29 18.59.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93155/7aea7677-2fb4-00d5-4eb4-12f8c4b6877f.png">

5.画面の右クリックで「検証」を選ぶ
<img width="692" alt="スクリーンショット 2019-08-29 19.01.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93155/51504b42-09d3-bbf5-9e09-3d0872214781.png">


6.上のタブに「Vue」が追加されているので、選択する
<img width="942" alt="スクリーンショット 2019-08-29 19.02.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93155/d712dee9-8e97-813f-952d-66993d7298c6.png">


7.データの内容が見る事ができた。
<img width="1162" alt="スクリーンショット 2019-08-29 19.04.10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93155/e3d4f3e7-4a14-ff3a-5232-1c2b73e9f736.png">


こんな感じにデバッグできる。
<img width="1120" alt="スクリーンショット 2019-08-31 1.54.45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93155/ec2ee9f4-f9a3-15ea-ad6e-f0b35c892a34.png">

完了
Pythonでimportしたモジュールの明らかに存在するクラスや関数が見つからない時

# シチュエーション

`foo`というモジュールを試したいとしましょう。
`foo.py`というファイルを作ります。`import foo`して`foo.bar`を呼び出します。
`AttributeError: module 'foo' has no attribute 'bar'`！！！！！！！！！！！！！！
なぜ！？？！！？！？？？！？？？？

# なぜか

`import foo`で目的のモジュールではなく`foo.py`自身を呼び出してしまっているから。スクリプトのあるディレクトリが優先です。（`sys.path[0]`）
`play_foo.py`などの名前を付ける習慣にすると良いでしょう。
Railsでbundle installの権限エラーが出た

# はじめに
こんにちは^^
こちらの記事では、Railsのコマンド入力で`bundle install`をした場合に、

```
Errno::EACCES: Permission denied @ rb_sysopen...
Make sure that `gem install mysql2 -v '0.4.10' --source 'https://rubygems.org/'` succeeds before bundling.
```

などのエラーが出て、上記の`gem install mysql2...`を入力し、再度`bundle install`をすると、また別のgem installコマンドを入力してくださいと何度も何度も何度も・・・

何度gem installとbundle installをすれば良いんだという。。。
これを一度の`bundle install`コマンドで手っ取り早くインストールを可能にする方法をご紹介します。

**前提：Mac, rbenvでRailsインストール**

# 原因は、、、？
そもそも一度のbundle installでgemが一気にインストールされないのは、`rbenv`の所有者が異なることが原因です。

```
$ ls -la /Users/ユーザー名/.rbenv/versions/2.6.2
```

などとコマンドを打ってみる(Macの場合)と所有者がrootになっていると思います。ですので、所有者を現ログインユーザーに変更すれば一気にインストールできるかと思います^^
ls -laコマンドは指定したファイルやフォルダの詳細情報を見ることができるコマンドです。
よく聞く`rwx`の権限が見れたり所有者が見れたり、サイズが見れたり作成日が見れたりもします。

# コマンド入力
所有者をコマンドによって変更したいと思います。(**所有者を変更すると環境によっては不具合が出ることがあるかと思いますので、変更する際はしっかりとご確認ください。**)
chownは所有者を変更するコマンドで、-Rは再帰(下の方にある構造にも所有者変更を反映させる)を設定するものになります。
Railsのインストールにrbenvを使用していることが前提となってしまいますが、ここの所有者を変更することが大事になります^^
Ralisをインストールした時のパスは適宜変更していただければと思います。

```
sudo chown -R ユーザー名 /Users/ユーザー名/.rbenv/versions/2.4.2
```

# 終わりに
以上、Railsでbundle installの権限エラーが出た場合の対処法をご紹介しました。
プログラミングを勉強をしているのに、コマンドでつまづくのは嫌、、、なんでここで。。。という風に思うことは多々あります。コマンドラインの知識はいずれ必要になってくるものなので、今は一旦意味わからずコマンドを打っても致し方ないと思いますが、あとでしっかり勉強しましょう！
もちろん業務で意味わからないコマンドを打つのは厳禁です。。。
よくつい打ってしまったというコマンドでたまに聞くのは`rm -rf /*`とか`rm -rf .`とかですかね、、、
Googleのスプレッドシートで今週月曜・日曜の日付を取得する方法

どうやって取得すれば良いか意外に悩んだので残しておきます。

## 週始めの月曜・日曜
月曜日だったら

```js
=(TODAY())-WEEKDAY(TODAY(),2)+1
```

週初めが日曜なら

```js
=(TODAY())-WEEKDAY(TODAY(),1)+1
```

求めたいのが週末なら最後７日分足せば良いんじゃないですかね。
Azure AD から LINE WORKS にシングルサインオンする方法

LINE WORKS は SAML 2.0 に対応しているので、Azure AD からの SSO が可能です。
(プロビジョニングには未対応です。)
MSのサイトにも[チュートリアル](https://docs.microsoft.com/ja-jp/azure/active-directory/saas-apps/worksmobile-tutorial)があるものの、ちょっとわかりにくいので手順を追って解説します。

#LINE WORKS の事前準備
### 1. Developer Console へのログイン
SSO を設定する前に、全メンバーに ExternalKey という値を設定する必要があります。
ExternalKey の設定は [LINE WORKS Developers](https://developers.worksmobile.com/jp/) の右上にある "Developer Console" から行います。
![DevConsole.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224481/ede6140c-bd03-04ca-35ba-241e6d370b9c.png)
Developer Console にログインするには、最高管理者や副管理者など "Developers" の管理権限が必要です。管理権限の作成/付与は[管理者画面](https://common.worksmobile.com/proxy/admin)の[メンバー]-[管理者権限]から行います。

### 2. ExternalKey の設定
Developer Console にログインしたら、左メニューにある[SSO]をクリックし、SSO 設定画面に移動します。
"構成員 ExternalKey Mapping" というメニューがあるので、ここで"すべて"もしくは"ExternalKeyがない場合"をクリックして"一覧のダウンロード"を行うと、CSV ファイルでメンバーリストが取得できます。

CSV を編集し、"ExternalKey" 列に Azure AD のログインのキーとなる値を入れます。例えばメールアドレスをキーにするなら、以下のような形です。
![ExternalKey.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224481/ea16d91d-9f60-0d59-9530-d6cf1a49becb.png)
先ほどの Developer Console に戻り、"アップロード" から CSV をアップロードして保存すると ExternalKey 設定は完了です。 (アップロードの際、ブラウザでポップアップがブロックされないよう注意してください。)


#Azure AD の設定
### 1. エンタープライズアプリケーションの登録
Azure ポータルに移動し、[Azure Active Dicectory] から"エンタープライズアプリケーション"を開きます。
![AAD.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224481/49cb82a5-b90c-cd4e-880a-610edf38b16a.png)

"+ 新しいアプリケーション" から "LINE WORKS" を検索して追加します。

### 2. LINE WORKS の SSO 設定
登録した LINE WORKS の設定画面から、"シングルサインオン"メニューを開きます。
SAML を選び、次のように[基本的な SAML 構成]の値を設定します。

| 項目       |  値 |
|:-----------------|------------------:|
| 識別子(エンティティID)| worksmobile.com (既定) |
| 応答 URL           | https://auth.worksmobile.com/acs/{LINEWORKSのドメイン名} |
| サインオン URL*          | https://common.worksmobile.com/proxy/my |
| リレー状態  | (空白) |
| ログアウト URL  | (空白) |
*LINE WORKS は SP-initiatied SSO しか対応していないので、サインオン URL を入力してもあまり意味はありません。。

次に、[ユーザー属性とクレーム]設定を編集して、どの値を ID として渡すか編集します。渡す値は最初に登録したExternalKey と揃えてください。

###3.SAML 証明書のダウンロード
LINE WORKS　はメタデータXMLによる SSO 設定に対応していないので、証明書(未加工) をダウンロードしてください。
###4.ユーザーへの割り当て
設定が完了したら、Azure AD に登録されているユーザーのうち LINE WORKS利用者にアプリを割り当ててください。

#LINE WORKS の設定
### 1. 証明書の変換
LINE WORKS は .pem 形式の証明書のみに対応しています。
Azure AD から取得した .cer 形式の証明書を .pem 形式に変換します。

openssl で変換する場合には、以下のような形になります。

```
openssl x509 -inform der -in "LINWORKS.cer" -out "LINEWORKS.pem"
```

### 2.SSO 情報の登録
LINE WORKS の Developer Console に戻り、[SSO] 内 "SSO Type" メニューから SAML を選び、Azure AD 側の"シングルサインオン" - "LINE WORKS のセットアップ" を参考に各設定項目を入力します。
![SSOtype.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224481/24e9e242-9192-f616-c01f-42cb0f90c617.png)

| 項目       |  Azure AD 側の値 |
|:-----------------|------------------:|
| Web Login URL| ログイン URL |
| Logout URL           | ログアウト URL|
| Certificate file  | 1で作成した .pem ファイル |

これで設定を保存すればセットアップは完了です。あとは、LINE WORKS のアプリもしくは Web からログインしてください。
ログイン画面で LINE WORKS の ID を入力すると自動的に Azure AD のログイン画面に遷移します。

#注意事項
SSO 設定を行うと自動的に LINE WORKS のパスワードがリセットされて、すべてのユーザーがログアウトします。
Automation Anywhere Control Roomで Bad Gateway と出る場合

コントロールルームを起動してまだ時間が経っていない時に、ブラウザーでコントロールルームにアクセスするとこのエラーが出る場合があります。その場合は、少し待ってからアクセスしてみてください。

![aa-cr-bad-gateway.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/f5f90746-7566-29ef-9b83-1c3389a954a4.png)


Enterprise Client からコントロールルームにアクセスした場合に、以下のエラーが出る場合も同様です。

![aa-client-error.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/e33bfb0e-d025-d7a1-0ca8-71832420b4d7.png)


# 待ってもずっとBad Gatewayのままの場合

"Bad Gateway"エラーは、Control Roomが管理用データベースに接続できない場合に出るようです。

* データベース (SQL Server等) が起動しているか
* 接続するためのPort (TCP=1433) が開いているか

といったことのチェックが必要です。今まで動作していたのに急にBad Gatewayが出るようになった場合は、セキュリティソフトウェア等をインストールしてポートが閉じられたりしている可能性もあります。
Unityでよく使う色を指定して保存しておく方法

UI組んでて、指定の色を保存しておく方法はないかな～って見てたらあったのでそれの紹介


## Swatches
Photoshopとかにも色の保存機能があり__Swatch__と言うらしいです
Unityにもあるのでそれの追加方法の紹介

## 新規Swatchesの作成手順

Inspectorの適当なColorをクリック→Swatches→CreateNewLibrary...をクリック
![コメント 2019-08-29 181855.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255761/79cd5d05-4c7f-677d-6834-7e4dfcc1da7e.jpeg)

NameはSwatchesの表示名(例："プロジェクト名"TextColors)
LocationはPreferences FolderとProject Folderの2つあるのでお好きな方へ

__Preferences Folder__ - どのプロジェクトでも追加したSwatchesが表示される
__Project Folder__ - 追加したプロジェクトでしか表示されない
![コメント 2019-08-29 182052.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255761/6661c133-8b38-6e07-c9b2-3b8913f586bf.jpeg)

あとはカラー指定→Swatchesのボタンクリックで追加されます
![コメント 2019-08-29 182814.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255761/13da77a5-b5fc-1242-fb7e-239b319035fe.jpeg)

適当に複数追加
![コメント 2019-08-29 182925.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255761/345a668a-9410-6b42-133b-842954ccff50.jpeg)

あと、間違って色を追加した場合は色を右クリック→ReplaceもしくはDeleteで変更/削除ができます

![コメント 2019-08-29 183120.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255761/8b187208-5abc-ef3e-c334-d4340bb72a15.jpeg)

ちなみに表示はGridとListで切り替えることが出来て、Listだと色に名前をつけることが出来ます
![コメント 2019-08-29 183229.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255761/dc4ead80-4c4a-f114-549d-f4fee0cede5c.jpeg)

終わり
LambdaでS3の特定バケットにjsonを作成・編集したい

# なんか情報少なくね
って言うわけで忘備録代わりに投稿
# 前提
- Lambda(Node.js)
- S3のバケット

# やり方
JSONを作成し、S3に保存

```index.js
const aws = require('aws-sdk');
const s3 = new aws.S3({ apiVersion: '2006-03-01' });
const bucket = BUCKET_NAME; //バケットの名前
exports.handler = async (event, context) => {
    const key = "hogehoge.json"//書き込みたいjsonのkey
    const content = CONTENT; //これにS3で保存したいJSONの内容を入れる
    const params = {
        Bucket: bucket,
        Key: key,
        Body: JSON.stringify(content)
    };
    await s3.putObject(params).promise();
}
```
S3からLambdaでJSONを読み込む

```index.js
const aws = require('aws-sdk');
const s3 = new aws.S3({ apiVersion: '2006-03-01' });
const bucket = BUCKET_NAME; //バケットの名前
exports.handler = async (event, context) => {
    const key = "hogehoge.json";//読み込みたいjsonの場所を指定
    // ルートにないファイルはcons ket = "file/hogehoge.json"みたい指定
    const params = {
        Bucket: bucket,
        Key: key
    };
    let content = await s3.getObject(params).promise();
    content = JSON.parse(content.Body.toString());
}
```
適当にtry-catchを使ったりしてエラーハンドリングした方が良いが、最低でもこれで読み込める。
この2つで読み込んで編集する事もできるので、s3.getObjectとs3.putObjectは覚えとくと便利。

#余談
keyに`file/../hogehoge.json`みたいな普通だとルートが参照されてしまう様なものを渡してもルートは参照されない。
これは[Amazon S3における「フォルダ」という幻想をぶち壊し、その実体を明らかにする](https://dev.classmethod.jp/cloud/aws/amazon-s3-folders/)の様に、S3にはフォルダという概念がなく「**..**」というkeyそのものがファイル名として解釈されるためである。
しかし、さらにセキュリティを高め事故を防ぎたいならIAMでリソースを`arn:aws:s3:::BUCKET_NAME/FILE/*.json`の様に指定する事でさらに操作を制限できるため、よほどの理由がないなら設定しとくべき。<img width="1001" alt="スクリーンショット 2019-08-29 18.25.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430774/87f316e3-4567-48ac-e265-ea8c9c7b0c59.png">
モバイル端末 で Qiita の 記事 を 記載 し 投稿 する 方法

# 目的

- スマホのブラウザからQiitaの記事の新規投稿を行う方法を知る。

# 実施環境

1. 端末
Iphone 7plus 128GB
1. ブラウザ
Safari
  

# 実施方法

1. ブラウザでQiitaにアクセスしログインする。

1. 自分のHome画面に移動する。
    <img width="" alt="02C17E39-6D97-42D2-A6F7-51591BF500ED.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/762d6d84-fe85-ce68-0473-2defdcbecb48.png">


1. 画像の赤矢印部分をタップする。
    ![554ED085-1713-40CC-BBF8-10D5F67F805C.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/a9e60f1b-6eba-f525-1872-1365454719cf.png)


1. メニューバーが展開されるので、「下書き一覧」をタップする。
    ![241B097C-6E2E-4997-A225-DC28A8747AE2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/0c742bfd-e381-9c0a-5dae-339de7056740.png)

1. 下書き一覧ページに移動したら画像の赤矢印の鉛筆マークをタップする。
    ![29C97395-C840-41C7-AC33-CA5CE7FD0896.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/e20b3301-9819-52b6-b93c-4df5f2eb2418.png)

1. 見覚えのある画面が起動するので記入すればOK。ちなみに画像の赤矢印部分の目のマークをタップするとプレビューが確認できる。
    ![4CDF01A1-DEB6-4B9A-AEE6-A1C5CE7C9DB2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/9236e4df-42b4-a7d3-9f37-656d9e6fb041.png)
メールテンプレート

#1.Classic メールテンプレート(MetaData)
- Classic レターヘッド  （**※メールテンプレートのテンプレート**）
- Classic メールテンプレート
 - テキスト
 - HTML (Classic レターヘッドを使用)
 - カスタム HTML (Classic レターヘッドを使用しない)
 - Visualforce

> `メモ`
> **テキスト ⇒ HMTL ⇒ カスタムHTML ⇒ Visualforce**
左から右へ機能は段々強くになります。
Visualforceメールテンプレートの最大の特徴は、子オブジェクトのレコードをメールに記載できることです。
　　　　　　[Visualforce メールテンプレートの作成](https://developer.salesforce.com/docs/atlas.ja-jp.218.0.pages.meta/pages/pages_email_templates_creating.htm)

#2.Lightning メールテンプレート(Data)
- 拡張レターヘッド（**※メールテンプレートのテンプレート**）
- メールテンプレート

#3.テンプレートのデータ種別
Classicには「MetaData」です。
Lightningには「Data」です。

　　　[Idea Details(Ability to add Lightning Email Templates to Changes Sets and Deploy from Sandbox)](https://success.salesforce.com/ideaView?id=0873A000000EDG9QAO)

#4.レターヘッド(Classic VS Lightning)
##Classic レターヘッド
**背景色と画像の設定**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332907/026babbd-4951-763e-a6b0-8b659f12abb5.png)

##拡張レターヘッド
ヘッダーとフッターのhtml編集
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332907/209e4fc8-30fd-660e-15a5-06a349922920.png)

#5.メールテンプレート(Classic VS Lightning)
**Lightning メールテンプレート = カスタム HTML (Classic レターヘッドを使用)**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332907/aa133178-8a30-eadf-7ec9-69150d7e3fda.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332907/ead4b7fb-85cd-e2ed-9d04-4073626c6507.png)

#6.差し込み項目(Classic VS Lightning)
Classic メールテンプレートはSalesforce Merge Language (SML) を利用します。
Lightning メールテンプレートはHandlebars Merge Language (HML) を利用します。

　　　 [SML から HML への Lightning メールテンプレートの変換](https://help.salesforce.com/articleView?id=email_template_convert_from_SML_to_HML.htm&type=5)

#Resource
- [メールテンプレートのヘルプ](https://help.salesforce.com/articleView?id=email_templates_landing_page.htm&type=5)
用 Swift 實作隔幾個字插入某個字串

以信用卡卡號來舉例

```
4242424242424242
```

每隔四個數字插入一個空白，像是這樣：

```
4242 4242 4242 4242
```

## 實作

原先有嘗試過用 map 或是 reduce 等等高階函式的方式實作，
但是在建置時間和型別推論的時間都太長，再來是必須要反覆取得記憶體空間，不是很有智慧（笑）。
於是就去找了一下有沒有比較「環保」的做法。

接著就在 Stack Overflow 找到一個解法 ([這裡](https://stackoverflow.com/a/34454633/1583560))，
這個解法簡單來說，是從 String 「內部」 來修改它的內容，這樣可以在不用額外索取記憶體空間的情形下達成。

簡化這個解答到必要的程式碼之後如下：

``` swift
extension StringProtocol where Self: RangeReplaceableCollection {
    mutating func insert(separator: Self, every count: Int) {
        for index in indices.reversed() where index != startIndex &&
            distance(from: startIndex, to: index) % count == 0 {
                insert(contentsOf: separator, at: index)
        }
    }
}
```

詳細原理的解說可以參照 Swift Blog 的這篇文章

- [Strings and Characters | Swift Blog](https://docs.swift.org/swift-book/LanguageGuide/StringsAndCharacters.html) 的 `Accessing and Modifying a String` 章節

### 走訪每一個字元並以指定間隔插入指定字串

在這裡就用我自己的話說明看看。

因為 Swift 的 String 無法以單純的整數定位，所以必須要使用 `String.Index` 。
在這邊就是透過 [Collection protocol 提供的 indices](https://developer.apple.com/documentation/swift/collection/1641719-indices) 來走訪每個位置。

_(RangeReplaceableCollection 有繼承 Collection protocol)_

先反轉再走訪的原因是可以避免在插入字串的過程中，長度改變造成 index 不好計算的問題

``` swift
for index in indices.reversed()
```

觸發條件就是當前的 index 還沒抵達 startIndex ：

``` swift
index != startIndex
```

以及與第一個字元的距離的餘數為 0

``` swift
distance(from: startIndex, to: index) % count == 0
```

符合條件之後，就可以用 RangeReplaceableCollection 提供的方法，來在指定位置插入指定字串

``` swift
insert(contentsOf: separator, at: index)
```

- `RangeReplaceableCollection#insert(contentsOf:at:)` - [文件](https://developer.apple.com/documentation/swift/rangereplaceablecollection/2853097-insert)

## 使用方法

``` swift
var cardNumber = "4242424242424242"
cardNumber.insert(separator: " ", every: 4)
print(cardNumber) // output: 4242 4242 4242 4242
```

當然也可以拿來插入複數字元：

``` swift
var content = "鯛魚燒"
content.insert(separator: " 🐟 ", every: 1)
print(content) // output: 鯛 🐟 魚 🐟 燒
```

以上！

## 參考資料

- [How add separator to string at every N characters in swift? | Stack Overflow](https://stackoverflow.com/a/34454633/1583560)
- [Strings and Characters | Swift Blog](https://docs.swift.org/swift-book/LanguageGuide/StringsAndCharacters.html)
- [Collection#indices](https://developer.apple.com/documentation/swift/collection/1641719-indices)
- [RangeReplaceableCollection#insert(contentsOf: at:)](https://developer.apple.com/documentation/swift/rangereplaceablecollection/2853097-insert)

## 環境

- Xcode **10.3 (10G8)**
- Swift **5**

## 最後

如果內文需要更新、有錯誤或容易誤解的地方，歡迎發修改或是留言告訴我！
Postgresql　あれこれ

※ macで"\"バックスラッシュを入力するには
　option + ¥

# PostgreSQLのバージョン確認方法

```
psql --version
```

# PostgreSQLへ接続
* 基本は  
``` psql -h ホスト名 -p ポート番号 -U ロール名 -d データベース名 ```  
だけど、ホスト名、ポート名、ロール名は、省略してデフォルト値のままにするなら

```
psql -d postgres
```
でOK（postgresはログインするデータベース名）

# create database xxxx を実行しても、データベースが作成されない
* 原因→　行末の”;”をつけていなかっただけ  
こんな感じ ↓ testdbが作成されない

```
postgres=# create database testdb
postgres-# \l
                                     List of databases
      Name       |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges   
-----------------+----------+----------+-------------+-------------+-----------------------
 postgres        | yoshioka | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 template0       | yoshioka | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/yoshioka          +
                 |          |          |             |             | yoshioka=CTc/yoshioka
 template1       | yoshioka | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/yoshioka          +
                 |          |          |             |             | yoshioka=CTc/yoshioka
```

* 行末に”;”を付けて、正確なコマンドを実行すると```CREATE DATABASE```が表示される

```
postgres=# create database testdb;
CREATE DATABASE
postgres=# \l
                                     List of databases
      Name       |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges   
-----------------+----------+----------+-------------+-------------+-----------------------
 postgres        | yoshioka | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 template0       | yoshioka | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/yoshioka          +
                 |          |          |             |             | yoshioka=CTc/yoshioka
 template1       | yoshioka | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/yoshioka          +
                 |          |          |             |             | yoshioka=CTc/yoshioka
 testdb          | yoshioka | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
```