OmniAICreator/Qiita-1.07M huggingface dataset:
PythonとRのデータの連携にSQLiteを使う

PythonとR間のデータのやりとりにSQLiteを使う。
元々DBからデータとかを持ってくる場合は必要ないかも。
実験データなどcsvが大量に生成されるかつPython, Rで取り扱うときに使うといいかも。

# モチベーション
データの加工とかはPythonでやってRに渡すときに使う。または逆パターン。
csvを使っていたが、データフレーム毎にファイル作ったりしてたのを1個のファイルで済ませたい。<-他の作業環境にデータ持ってく時に楽になるかも。csvを何個も移動する必要がないので。
データの追加とかも楽にしたい。
作業再開時にいちいちcsvを全部読み込むのがだるいので楽にしたい。

# PythonでSQLiteを使う

## データの準備

```python:py_data_import.rb

import pandas as pd
import seaboan as sns

df = sns.load_dataset('iris')

```

## SQLiteのデータベースを作ってデータの保存。

```python:py_sqlite.rb
import sqlite3

db = 'iris.sqlite'  # データベースの名前
con = sqlite3.connect(db) # データベースへ接続
df.to_sql(name = 'iris', con = con, if_exists = 'replace', index = None)
# name = テーブルの名前, con = 接続先, 
# if_exists = 接続先のデータベースに同名のテーブルが既にあった場合の動作
# 'replace' 上書き、書き換える
# 'append' 追加
# index = indexも保存するか？

con.close() # 切断
 
```

dbの拡張子を.sqliteにしているが別になんでもOK。
あとでわかりやすいように.sqliteにしてるだけ。


## SQLiteのデータベースからデータを取得
pandasのデータフレームとして取得する。

```python:py_sqlite_read.rb
import sqlite3

db = 'iris.sqlite'  # データベースの名前
con = sqlite3.connect(db) # データベースへ接続
d = pd.read_sql(sql = "SELECT * FROM iris", con = con)  # データ取得
# sql = SQLのクエリ
# con = データベースへの接続

con.close()

```

カラムの名前は勝手に入る。

## SQLiteのテーブル名の取得

```python:py_tbl.rb
import sqlite3

db = 'iris.sqlite'  # データベースの名前
con = sqlite3.connect(db) # データベースへ接続
cur = con.cursor() # cursorオブジェクト作成　

cur.execute("SELECT name FROM sqlite_master WHERE type = 'table'")  # SQL実行
print(cur.fetchall())  # 結果表示
cur.close()  # 切断
con.close()  # 切断

```

cur.execute("SELECT name FROM sqlite_master WHERE type = 'table'")で
sqlite_masterからテーブル名を取得している。
nameがテーブル名。
nameを*とかにすればカラム名も取得できる。(SQL界ではカラムというのかはわからないが。。。）




# RでSQLiteを使う
参考にさせていただいたサイト
https://oku.edu.mie-u.ac.jp/~okumura/stat/sqlite.html

## SQLiteのデータベースを作ってデータを保存

RのデータフレームをSQLiteで保存する。

```R:r_sqlite.rb
library(RSQLite)

db = "~/Documents/iris.sqlite"  # データベースのパス
con = dbConnect(SQLite(), db, synchronous = "off")  # データベースへ接続
dbWriteTable(con, "iris", d, overwrite = T)
# "iris" 第2引数はテーブル名
# d 第3引数は保存したいデータフレーム
# overwrite = 同名のテーブルが既にある場合上書きするか。
dbDisconnect(db)  # 切断
```


## SQLiteのデータベースからデータの取得

SQLiteのデータをデータフレームとして取得する。

```R:r_sqlite_read.rb

library(RSQLite)

db = "~/Documents/iris.sqlite"  # データベースのパス
con = dbConnect(SQLite(), db, synchronous = "off")  # データベースへ接続
d <- dbGetQuery(con, "SELECT * FROM iris")  # データ取得　（普通にクエリで取得するだけ）
dbDisconnect(db)  # 切断

```

カラムの名前は勝手に入る。


## さいごに
正しいSQL_DBの使い方ではない気がする。
実験屋さんなどセンサーデータをロガーで取得 -> ロガーのデータをPythonやRでゴニョゴニョな方には使えるかも。
matlabはDatabase Toolboxのパッケージが必要そうなので今回は断念。
byte型

アスキーコードはこちらのサイト参照
https://www.ascii-code.com/

```go
func main() {
	b := []byte{72, 73}
	fmt.Println(b)         //[72 73]
	fmt.Println(string(b)) //HI

	c := []byte("HI")
	fmt.Println(c)         //[72 73]
	fmt.Println(string(c)) //HI stringにキャスト
}
```
ネットワークやファイル読み込みなど、どんなところに出てくるのか後々理解していく感じで。

>【参考】
現役シリコンバレーエンジニアが教えるGo入門(https://www.udemy.com/share/100BhMB0obeFpbTX4=/)
Amazon Linux 2にMySQL5.7をインストールする

# はじめに

Amazon Linux 2にMySQLをインストールする方法です。

# インストール

以下のコマンドを実行する。

```sh
sudo yum localinstall https://dev.mysql.com/get/mysql80-community-release-el7-1.noarch.rpm -y
```

以下のコマンドを実行する。

```sh
sudo yum-config-manager --disable mysql80-community
```

以下のコマンドを実行する。

```sh
sudo yum-config-manager --enable mysql57-community
```

以下のコマンドを実行する。

```sh
yum info mysql-community-server
```

以下のコマンドを実行する。

```sh
sudo yum install mysql-community-server -y
```

以下のコマンドを実行する。

```sh
mysqld --version
```

以下のコマンドを実行する。

```sh
sudo systemctl start mysqld.service
```

以下のコマンドを実行する。

```sh
sudo systemctl enable mysqld.service
```

以下のコマンドを実行する。

```sh
systemctl status mysqld.service
```

# rootパスワードの変更

以下のコマンドを実行する。

```sh
cat /var/log/mysqld.log | grep password
```

「***********」の箇所がrootパスワードとなるので、記録しておく。

```
2019-06-08T23:38:16.398368Z 1 [Note] A temporary password is generated for root@localhost: ***********
```

以下のコマンドでパスワードを変更する。

```
mysql_secure_installation
```

質問には以下のように答える。

```
Change the password for root ? ((Press y|Y for Yes, any other key for No) : No
Remove anonymous users? (Press y|Y for Yes, any other key for No) : Yes
Disallow root login remotely? (Press y|Y for Yes, any other key for No) : Yes
Remove test database and access to it? (Press y|Y for Yes, any other key for No) : Yes
Reload privilege tables now? (Press y|Y for Yes, any other key for No) : Yes
````

# 文字コードの設定

以下のコマンドを実行し、viを起動する。

```sh
sudo vi /etc/my.cnf
```

最終行に以下を追記する。

```ini
character_set_server=utf8mb4

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

以下でMySQLを再起動する。

```sh
sudo systemctl restart mysqld.service
```

# DBの作成

ユーザーをmyuser、DB名をmydbとしてDBを作成する。

以下のコマンドを実行する。

```sh
mysql -u root -p
```

以下のSQLを実行する。

```sql
CREATE DATABASE mydb;
```

以下のSQLを実行する。
（「**********」の部分はパスワード）

```sql
CREATE USER myuser@'localhost' IDENTIFIED BY '**********';
```

以下のSQLを実行する。

```sql
GRANT ALL PRIVILEGES ON mydb.* TO myuser@'localhost';
```

以下のコマンドでログイン出来る。

```sh
mysql -u myuser -p mydb
```
#VSCode でプレビューモードで開いているタブを固定するショートカット ( Win : Ctrl + K -> Enter )  ( Mac : Command + K -> Enter )

Ctrl + K ( または Command + K ) を押すと、次のようなコマンド待ち受けモードに入るっぽい。

![image](https://user-images.githubusercontent.com/13635059/59153134-b0a2ec80-8a8d-11e9-8dad-df39fabbd1a1.png)

そのあとに Enterを押すと、エディタでは何も起こらずに、タブの確定だけができる様子。

`Keep Editor` というコマンドが実行される模様。

# 覚えてられるか！

タブを右クリックしてもショートカットが見られるので、忘れた時はこちらから。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89618/e880ac8b-f11a-b22b-9349-949b2bbb8d63.png)


# Ref

- [visual studio code - Keyboard shortcut to take file out of preview mode in VSCode - Stack Overflow](https://stackoverflow.com/questions/45945820/keyboard-shortcut-to-take-file-out-of-preview-mode-in-vscode)
- [VSCodeでファイルを開いた時にタブが上書きされる問題を回避する - Qiita](https://qiita.com/kgoto/items/265e3eb8a82778e33cfe)








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
switch文でenumって同じ名前の時に名前の衝突はしないの？

# はじめに
Javaのswitch文ではenumを式にしてした場合、修飾名を付与しないというのがあります。
2つ以上同じ定数があった場合にコンパイルが通ったのが不思議だったので調べてみました。
結果から先にいうと、修飾は不要なので気にせずにそのまま使って大丈夫です。

# enumが1つの場合
こういうenumがあるとします。

```java:FoodType.java
public enum FoodType {
    RICE,
    BREAD,
    OTHER,
}
```

```java:Main.java
import lombok.AllArgsConstructor;

public class Main {
    public static void main(String[] args) {
        Food food = new Food(FoodType.RICE);
        switch (food.foodType){
        case RICE:
            System.out.println("ごはんだよ");
            break;
        case BREAD:
            System.out.println("パンだよ");
            break;

        default:
            System.out.println("その他だよ");
            break;
        }
    }
}

@AllArgsConstructor
class Food {
    FoodType foodType;
}
```

Mainの方でswitch文でenum（FoodType）を分岐させています。
この場合、caseを`FoodType.RICE`ではなく`RICE`と書きます。
（なぜRICEでよいのかというのは後述します。）

# enumが2つの場合

先ほどのコードにenumを1つ追加してみます。
ごはんの区分をさらに細かく分けたい場合を想定。

```java:RiceType
public enum RiceType {
    RICE,
    FriedRice,
}
```

Mainも変更。

```java:Main.java
import lombok.AllArgsConstructor;

public class Main {
    public static void main(String[] args) {
        Food food = new Food(FoodType.RICE,RiceType.RICE);
        switch (food.foodType){
            case RICE:
                switch (food.riceType){
                    case RICE:
                        System.out.println("ごはんだよ");
                        break;
                    case FriedRice:
                        System.out.println("チャーハンだよ");
                        break;
                }
                break;
            case BREAD:
                System.out.println("パンだよ");
                break;

            default:
                System.out.println("その他だよ");
                break;
        }
    }
}
@AllArgsConstructor
class Food {
    FoodType foodType;
    RiceType riceType;
}
```

# なぜ名前が衝突しないのか

上記のコードでコンパイルは通ります。
これは正しいコードですが、Mainの以下の箇所で`case RICE:`と`case RICE：`が衝突しないでコンパイルが通ることに疑問を持ちました。
また、コードはすべて載せているのでimportは使用されていません。

```java
      switch (food.foodType){
            case RICE:
                switch (food.riceType){
                    case RICE:　
```


##　コンパイル時に修飾してくれている
調べたところ、コンパイル時にクラス名が修飾されるようになっているため、名前は衝突しないようです。
少し古いですが、以下のサイトの「switchの実装」の項にenumの逆コンパイルの結果が紹介されています。
http://www.ne.jp/asahi/hishidama/home/tech/java/enum.html#h2_switch

# まとめ
コンパイル時に修飾される仕組みでした。
Docker for MacでAmazon Linux 2でsystemd

EC2 上の Amazon Linux 2 は systemd を使いますが、Docker Hub にある `amazonlinux` 公式イメージ https://hub.docker.com/_/amazonlinux/ のデフォルト状態では systemd が利用できません。

Dockerfile

```
FROM amazonlinux:2
RUN yum -y update && yum -y install procps systemd-sysv
CMD ["/sbin/init"]
```

docker-compose.yml

```
version: "2"

services:
  amzn:
    build: "."
    cap_add:
      - SYS_ADMIN
    volumes:
      - /sys/fs/cgroup:/sys/fs/cgroup:ro
```

このほかに `privileged: true` や `security_opt: - seccomp:unconfined` が必要という記事もみかけますが、現在は不要になっているようです。（2019年6月現在）

また、Mac 本体には `/sys/fs/cgroup` は存在しませんが、こちらも問題ないようです。

以下のように起動できます。

```sh
docker-compose build
docker-compose up -d
docker-compose exec amzn bash
docker-compose exec amzn systemctl -all
docker-compose exec amzn journalctl -f
```

systemctl や journalctl が使えるようになりました。
arduinoで真理値表 その2

#概要

arduinoで真理値表やってみた。

#xor

```
in 0
in 1
out 2
xor 0 1 2
run
```

#and

```
in 0
in 1
out 2
and 0 1 2
run
```

#or

```
in 0
in 1
out 2
or 0 1 2
run
```

#半加算器

```
in 0
in 1
out 2
out 3
xor 0 1 2
and 0 1 3
run
```

#全加算器

```
in 0
in 1
in 2
out 6
out 7
xor 1 2 3
and 1 2 4
xor 0 3 7
and 0 3 5
or 4 5 6
run
```

以上。
【視聴メモ】Linux for Chromebooks: Secure Development (Google I/O ’19)

この記事は Google I/O '19 のセッションの視聴メモです。
想定読者は自分なので正確性や網羅率には問題があるかもしれません。

---

## References



## Abstract

> Learn how Linux for Chromebooks (Crostini) gives you a secure sandbox for development. Through a variety of demos, this talk will explain the architecture underlying Linux for Chromebooks and the design decisions that keep it easy to use.

訳

> どのようにしてChrombookが開発のためにセキュアなサンドボックスを提供するかをご紹介します。様々なデモを通して、このトークではLinux for Chromebooksのアーキテクチャとそれを簡単に使うことを可能にした設計上の決定についてご説明します。

## Contents

* セキュリティ上の理由で開発用とその他用でPCを分けてたけど最近一つのPCしか使わなくなったよ
    * Chrombookをつかうようにしたからだよ
    * 開発用のプログラムはいろんな権限を要求するけど普通のアプリはそうではないので

### Architecture & Design

* Linux for Chromebook ではCrOS上にターミナルVMがのっている
    * ゲストVMは基本的に権限を読み込みだけに制限されている
    * VMはDebian9のContainerシステム上で動作する
* Rustで開発
* セキュリティとシンプルさのちょうどいいところを探すのが使命

### Common Workflows

* ファイルアクセス
    * ファイルを共有できる領域を分けて階層ごとに管理
    * 9pサーバーでVMと共有
    * Linux files というディレクトリ以下はすべてLinuxと共有する
    * Google Driveのファイルは「Share with Linux」で共有する
    * ダブルクリックでファイルを開くとログアウトするまでは自動で共有される
* Local Port Routing
    * どのコンテナがどのポートを開放しててどのコンテナがどのポートを見れるのか管理するのはとても複雑だけど簡単に使えるようになってるよ
* どのアプリからでも `127.0.0.1:8080` で普通にローカルサーバーが見れる
    * CrOSのホストがアクセスする分にはどこでも見れる
    * ホストはReadはどこでもできる
* Android開発
    * Android Studioを入れるだけでできる
    * USB接続をセキュアにするためにどうしてるか
    * 端末を接続しただけではLinuxはその存在を知れない
    * 接続を許可するダイアログでOKした場合のみ共有される

### Advanced Usage

* コンテナはtermina（VMホストの名前）から簡単に操作できる
    * コンテナは簡単にスナップショットが取れる
* reddit.com/r/crostini で議論してるよ（redditなんだ…）

## Memo

* なんでWebセッションのリストにはいってるんだろう…
* あまり知らない領域なので聞くのが大変だった
* もしかしてPWAのデモをするから…
Python3でSlack APIを使用してBotを作成

#やったこと
Slack APIを使ってみたかったので，Appの作成プロセスを最初からまとめておく．

###コンテンツ

- Slack Appを任意のワークスペースにインストール．
- Python3でSlack APIを使ってbotを動かせるようにする．

#参考資料
https://api.slack.com/start/overview
https://api.slack.com/start/building
https://slack.dev/python-slackclient/index.html
https://github.com/slackapi/python-slackclient



#環境
MacOS Mojave 10.14.5
Python3.7
slackclient 2.0.1

#Appの作成
[このURL](https://api.slack.com/apps?new_app=1)で作成したいApp名とワークスペースを指定.
新規Appが作成される．

**Building Apps for Slack**でAppの機能を以下から選択＆設定（複数選択可）．

- Incoming Webhooks: 外部のアプリケーションからSlackへメッセージを送る
- Slash commands: /でユーザがアプリを起動できるようにする
- Bots: Appとのインタラクティブなやりとりを可能にするボットを追加する
- Interactive Components: Appにボタンを追加してインタラクティブな操作を可能にする
- Event Subscriptions: ユーザからの入力などに対して反応するようにする
- Permissions: AppがAPIを使用するための権限設定

解釈があってるかわからないけれど，こんな感じ．今回はPermissionsの設定をする．

#Scopeの設定
PermissionsでScopeの設定を行う．Scopeの設定でAppのワークスペース内でのアクセス権限を設定する．
今回は以下を選択

- **Send messages as test**: 動作確認で使用

#ワークスペースにAppをインストール
**Install App to Workspace**でAppをワークスペースにインストール．
インストール後，**OAuth Access Token**が発行される．APIを使用するときに必要になる．

#Python SDKのインストール
ターミナルからは以下のコマンド

```bash
pip install slackclient
```
githubから取ってくる場合は以下

```bash
git clone https://github.com/slackapi/python-slackclient.git
pip install -r requirements.txt
```

#Hello World
環境変数SLACK_API_TOKENにさっきの**OAuth Access Token**を設定

```bash
$ export SLACK_API_TOKEN='OAuth Access Token'
```

[githubのリポジトリ](https://github.com/slackapi/python-slackclient)のREADME.mdに書かれてるコードで動作確認．

```python
import os
import slack

client = slack.WebClient(token=os.environ['SLACK_API_TOKEN'])

response = client.chat_postMessage(
    channel='#random',
    text="Hello world!")
assert response["ok"]
assert response["message"]["text"] == "Hello world!"
```

\#randomチャンネルにHello world!と表示される．
プログラミング勉強歴２ヶ月の独り言

まず初めに、これが初投稿であるが完全に自身の為の投稿になっているのでご了承願います。

習熟状況：
Railsで一連の流れを知り、理解までとは行かないが
スクールや独学で何とかアプリを作った

今後の課題：
・基礎中の基礎が忘れてきている（インスタンス、オブジェクト、クラスなど）
・MVCへの理解
・アウトプットが少ない
・データベースへの理解が少ない

改善策
・基礎の復習（理解度を増やす）
・MVC、アウトプット、データベースに関してはこのQiita投稿で
復習していく
・アウトプットしたものを毎日１投稿
・プリンシプルオブプログラミングを理解する（下記記載）


プリンシプルオブプログラミングとは：
脱・初心者の為に書かれた本でとても興味深いことが書かれている

まだ全て読んではいないが、引用ではあるが冒頭にこんな言葉が書いてあった。

「経験を積んだ人は、物事がこうであるということを知っているが、なぜそうであるかということを知らない。」マルティン・ハイデッカー

とても深ーい！と共感した。

私も前職、パチンコ業界でよく先輩社員に言われたことがあった。
先輩「こうやったらこうなるんだよ！」
私「何でこうなるんですか？」
先輩「分からんけど、こうなるねん！」
私「あ、わかりました！ありがとうございます！」

こんな感じ。これは完全なるこの場面に当てはまる場合には、対処出来るが他の場面ではほぼ有効活用出来ないだろう。前職ではそうであった。
プログラミングの世界をなめている訳ではないが、この業界も同じような原則はあるのだと私はそう信じている。

だからこそ、考えながら意味のあるコードを今後も諦めず書いていく。
それが人の為、自分の為になればと思う。

そういえば以前、面接でこんな事を聞かれた。

面接官「あなたが思う１流のプログラマーとは？」
私「コードの向こう側に人がいるという人のとの繋がりを大切に出来るプログラマーです。」

この質問に答えはないと思う。
しかしながら今、私が一つ付け足すとしたら、
「勉強し続けることが出来る」
だろう。これがなければ成長はないし、職場で生きて行けないだろう。

すごく興味のある分野で事業をされていた企業でもあった為、面接にはかなり悔いはあるが、今後どうなるか結果を楽しみに待ちたいと思う。

少し長く雑談になってしまったが、今後はより中身のある投稿にしていきたい。
GSuite管理（with「Cloud Identity」）の設定メモ

# GSuite管理（with「Cloud Identity」）の設定メモ

## この記事の想定シーン

例えば次の２つの要求を満たしたいというようなシーンを想定した話です。

* 「コアメンバー」には自ドメインのGmailやドライブが付与されるGSuiteアカウント(有料)を配布したい
* 「特定用途(GCP運用委託など)」のために外部協力者へ自ドメインのGoogleアカウントを配布したい

## Cloud Identity とは

[公式ヘルプのページ](https://support.google.com/cloudidentity/answer/7319251?hl=ja) - https://support.google.com/cloudidentity/answer/7319251?hl=ja

> Gmail や Google ドライブなどの G Suite サービスを必要としないユーザーに、管理対象の Google アカウントを無償で付与することができます。
> Cloud Identity アカウントは、G Suite 以外にも Google Cloud Platform（GCP）、Chrome、ビジネス向け Android といったさまざまな Google のサービスや、数多くのサードパーティ製アプリケーションで利用できます。

[Qiitaの記事:「GCPを古き良き企業で使い始めるためのセキュリティ戦略」](https://qiita.com/2gt/items/d0b14593c1c44eac020b)の「ID管理」節によると、`GCPアカウントとしてのみ使えるGoogleアカウント(自ドメイン配下の)を作って与える` なんていうことができるのだそう。
そのことが公式ヘルプで上記のように説明されている。


## Cloud Identity のライセンス割り当ての仕組み

[公式ヘルプのページ](https://support.google.com/cloudidentity/answer/7384684) - https://support.google.com/cloudidentity/answer/7384684

> `複数のサービスをご利用の場合`
> 
> * Cloud Identity Free Edition + G Suite
>     * すべての新規ユーザーに Cloud Identity Free Edition のライセンスが自動的に割り当てられます。
>     * Gmail や Google ドキュメントなどの機能が必要なユーザーに対しては、有料の G Suite ライセンスを割り当てます。
>     * 組織全体で G Suite のライセンスの自動割り当てがオンになっている場合は、すべての新規ユーザーに有料の G Suite ライセンスが自動的に割り当てられます。`新しいユーザーに Cloud Identity Free Edition のライセンスのみが提供されるように、Cloud Identity の設定の際に G Suite ライセンスの自動割り当てをオフにすることをおすすめします。`


## 組織部門のライセンスの自動割り当てについて

[公式ヘルプのページ](https://support.google.com/cloudidentity/answer/6342682) - https://support.google.com/cloudidentity/answer/6342682

> * ライセンスの自動割り当てを設定できる状況
>     * 有料サービスと無料サービスのサブスクリプションがある場合（G Suite Basic と無料の Cloud Identity など）: 有料サービスに対してのみ組織単位でライセンスの自動割り当てを設定できます。


## 組織部門にライセンスの自動割り当てを設定する

[公式ヘルプのページ](https://support.google.com/cloudidentity/answer/7610656) - https://support.google.com/cloudidentity/answer/7610656

### 手順の例) 「コアメンバー用(Gmailやドライブを付与)」と「特定用途用（GCPの管理権限だけ委託とか）」

1. 自ドメインの下部組織に「コア」と「GCP運用」の２つの部門を作成
    * メニューを開いて「ディレクトリ＞組織部門」で作れる
2. 自動ライセンスはデフォルトで「オフ」としておいて、コア部門だけオンでオーバーライドする
    *  メニューの「お支払い」から下記手順で設定できる。
        1. GSuiteサブスクリプションの左側▽をクリックで開く
        2. 自動ライセンス欄を「オフ(すべてのユーザ)」に設定
        3. 「特定の組織をオーバーライド」のリンクからコア部門をオーバーライド状態にして保存
        4. 「お支払い」画面でさらにGSuiteサブスクリプションの左側▽内で、オーバーライド対象部門の設定を指定する
    * どのシーンも「保存」ボタンを押すことを忘れないでね。

---

以上、Qiita初記事でした。
スタック＆キューを考えるには剰余演算子に登場してもらうといい。

データの格納方法として、スタックとキューというものがある。
array関数を使わずにこれらのコードを書いてみた。
##配列をリングとして考える＆剰余演算子を使う
スタックに比べるとキューは考えを工夫する必要がある。その際にリングバッファという概念が役に立った。配列をリングのように考えると配列の頭としっぽがくっつく形になるがこれが便利だった。キューからアウト（OuｔQue）すると要素が入った順番に抜けていくが、抜けた後の空箱にもデータを入れていく必要がある。かといって、適当な順番にデータを入れていくことはここではルールに反する。

そこで、データを入れるindexを次のように求めた。
```
 NewIn = (queTop + queTail) % 4
```
ここでは格納できるデータの数を４としている。
queTailは配列に格納されているデータ数とイコールになる。

アウトしていくデータについては
```
queTop = (queTop + 1) % 4;
```
であり、このarray[queTop]がアウトしていくデータのindexとなる。
データのinOutに際してデータのかたまりがぐるぐると円をまわるイメージ。
もちろんデータが満杯になったときはそこでストップ。

以下サンプルコード。
簡単なフォームもついているので実行するとイメージしやすいかも。
##汚いコードでも手を動かしていたら少し理解が深まった。
JavaScriptを学びはじめて一ヶ月。どんな汚いコードでもまずは手を動かすことをこれからも意識していこうと思う。

<body>

    <div>Stuck</div>
    <input type="button" value="StuckPush" onclick="StuckPush();">
    <input type="text" id="StuckPush">

    <input type="button" value="StuckPop" onclick="StuckPop();">
    <div id="output1"></div>

    <div>Que</div>
    <input type="button" value="inQue" onclick="inQue();">
    <input type="text" id="inQue">

    <input type="button" value="outQue" onclick="outQue();">
    <div id="output2"></div>

    <script>
        //---------スタックプッシュ-----------
        let stuckTop = 0;
        let a = [];

        function StuckPush() {
            if (stuckTop >= 0 && stuckTop < 4) {
                a[stuckTop] = $('#StuckPush').val();
                //a[]の中は4個しか入れない
                console.log(a[stuckTop]);
                console.log(a);
                stuckTop++;
                $('#StuckPush').val("");
            } else if (stuckTop = 4) {
                alert('ERROR');
            }
        }
        //---------スタックポップ-----------
        function StuckPop() {
            if (stuckTop > 0 && stuckTop <= 4) {
                aaa = a[stuckTop - 1];
                $("#output1").append(aaa + '→');
                console.log(stuckTop);
                a[stuckTop - 1] = null;
                stuckTop--;
                console.log(aaa)
            } else if (stuckTop = 0) { 
                alert('ERROR');
            }
        }
        //---------インキュー-----------
        let queTop = 0;
        let queTail = 0; //要素の数
        let b = [];
        //配列は4個の要素が入る
        function inQue() {
            if (queTail < 4) {
                NewIn = (queTop + queTail) % 4
                b[NewIn] = $('#inQue').val();
                console.log(b[NewIn]);
                console.log(b);
                queTail++;
                $('#inQue').val("");
            } else {
                alert('ERROR');
            }
        }
        //---------アウトキュー-----------
        function outQue() {
            if (queTail > 0) {
                bbb = b[queTop];
                $("#output2").append(bbb + '→');
                queTop = (queTop + 1) % 4;
                queTail--;
            } else {
                alert('ERROR');
            }
        }


    </script>
    <script src="https://code.jquery.com/jquery-3.3.1.js"></script>

</body>
ツイートを最新順に並び替え方法について


 
#最新のツイートが一番上に来るように表示させる方法


##orderメソッドを使う
**orderメソッドは、テーブルから取得してきた複数のインスタンスを並び替えるメソッドである。**

allメソッドを利用した場合、通常であればレコードはid順に取得される。しかし、以下のようにorderメソッドの引数として("id DESC")とした場合、レコードは逆順に並び替えることができる。
orderメソッドは引数として**("テーブルのカラム名 並び替える順序")**という形をとる。並び替える順序には、ASC(昇順)とDESC(降順)の2種類がある。


controllers/tweets_controller.rb

```ruby

def index
    @tweets = Tweet.all.order("id DESC")
end
```

ツイートが作成された日時は、DB上created_atカラムに保存される。そのため、以下のように()内を変更すればよい。

controllers/tweets_controller.rb

```ruby

def index
    @tweets = Tweet.order("created_at DESC")
end
```
orderメソッドを使用することで、自動的にカラムが追加されていくので、allメソッドは省略してもよい。

　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　以上
「AsyncAwait」タグについて(タグシノニム: 「async」「await」)

# 対象

https://qiita.com/tags/AsyncAwait

# 説明

asyncとawaitキーワードを用いて行う非同期プログラミング。

以下のプログラミング言語で採用されている。
(ライブラリ提供は含まない)

 - C#(C# 5.0（.NET Framework 4.5))  
https://docs.microsoft.com/ja-jp/dotnet/csharp/programming-guide/concepts/async/index
 - JavaScript  
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/async_function
 - Python  
https://docs.python.org/ja/3/library/asyncio-task.html
 - Dart  
https://dart.dev/tutorials/language/futures
 - Kotlin(1.3)
 - Rust(安定板ではまだ)


複数のプログラミング言語で採用されているため、対象のプログラミング言語のタグと合わせて使用したほうがよい

# タグシノニム

https://qiita.com/tags/async
https://qiita.com/tags/await

`async`は、非同期処理を表す記事にも使えるが、asyncとawaitキーワードを用いたプログラミング記事が大半なので、タグシノニムとする
TNESヘッダをiNESヘッダに変換

# はじめに
※ 初投稿かつ完全に自分のメモ的な投稿なので、不正確であったり、わかりにくかったりすると思いますがお許しください。

3DS等のバーチャルコンソールからダンプできるファミコンのROMは **"TNES"** というフォーマットになっており、エミュレータ等ではこの形式を読み込むことはできません。

ちなみにファミコンのROMファイルにおいて標準的なフォーマットは **"iNES"** というもの。TNESとiNESの差異はおそらくヘッダのみなので、ダンプしたROMの先頭をバイナリエディタなりで書き換えてやればエミュレータなどでも起動することができます。

# 参考資料・事前に読むべき資料
ヘッダの構造に関する情報は以下のサイトから入手しました。

- TNES: https://wiki.nesdev.com/w/index.php/TNES
- iNES: https://wiki.nesdev.com/w/index.php/INES

# iNESヘッダを書く
iNESフォーマットのヘッダの大きさは16バイトになっています。

まず、0x00から始まる4バイトは、"4E45531A"です。これは"NESの文字列+EOFコード"です。

0x04はPRG-ROMのサイズを16KB単位で表した値です。PRG-ROMのサイズはTNESヘッダの0x05に8KB単位で表されているので、これの半分の値を入れてあげればいいです。

0x05はCHR-ROMのサイズを8KB単位で表した値です。この値はTNESヘッダの0x06と等しいです。

0x06は少し複雑です。
先頭4<strong>ビット</strong>にiNES Mapperの値([このサイトのTNES MapperとiNES Mapperの対応表を参照](https://wiki.nesdev.com/w/index.php/TNES))が入り、続く3ビットには順番に、

- TNESヘッダの0x09の値
- 0
- TNESヘッダの0x09の値

が入ります。
最後の1ビットには、TNESヘッダの0x08の値が00または01の場合は0、02の場合は1が入ります。

0x07から0x0Fまでは0で埋めておいておそらく大丈夫だと思います。

このiNESヘッダでバーチャルコンソールからダンプしたTNESフォーマットのROMの先頭16バイトを上書きしてあげればiNESフォーマットのROMになるはずです。
LaravelのModelの忘れがちな設定個人的まとめ

## 目的
- 使う場面がたまにあるTipsをまとめる
    - よく忘れるから備忘録として書き留め

##### connectionの変更
- 頻度は多くないけど別のDBに接続させたい場合があったりなかったり

```php
protected $connection = '接続先';
```

- 接続先
    - これは`config/database.php`内にて定義している`connections`のkeyになります


##### created_atとupdated_at関連

- カラム名の変更

```php
const CREATED_AT = 'カラム名';
const UPDATED_AT = 'カラム名';
```
- 使用しない

```php
const CREATED_AT = null;
const UPDATED_AT = null;
```

##### primary key関連

- incrementしない。たまーにある

```php
public $incrementing = false;
```

- idではないカラム名の場合
    - 複合主キーの場合、`[]`を使用し配列にすればいいです
 
```php
protected $primaryKey = 'カラム名';
protected $primaryKey = ['カラム名', 'カラム名'];
```


##### table名変更

- よく使うかもなやつ

```php
protected $table = 'テーブル名';
```

##### それ◯◯◯◯した時に実行したいけど都度書きたくない

- 種類

```
creating, created
updating, updated
deleting, deleted
saving, saved
restoring, restored
```


```php
public static function boot()
{
    parent::boot();
    static::creating(function (Model $model) {
        // 作成する際にしたい何かしらの処理
    })
}
```
> 物によっては、TraitにするかEloqunet Modelを継承した親Class作ってGlobalScopeにする方がいいとおもいます


## まとめ
- 今後も何かあったら追加します。
Python個人的メモその5：出力編～強力なformatを使いこなす～

# 地味に大事，出力
プログラムを書く上で大事なのは「入力を受け取ってそれに対して処理を行うまで」だと思ってませんか?
実は出力も結構大事です([第二回](https://qiita.com/mizu_waterfield/items/cce70b1b11ed6fa597ef)でデータ構造の方が大事とか言ってましたがあくまで主観的で相対的な話ですので悪しからず)．


# print
出力として最も使うことになるのがこれでしょう．言わずもがな，何らかの文字列を表示する関数です．

```python:print_sample
print('something')  #something
print(100)  #100
a = 77
print(a)  #77
```
特に注意することはほとんど無いように思われますが，Javaなどでこういう書き方に慣れているとうっかりエラーを出します．
文字と数値を合体させるときは数値側を`str()`できちんと文字に直してあげないといけません．

```python:print_type_error
a = 22
print('a is ' + a)  #TypeError: Can't convert 'int' object to str implicitly
print('a is '+ str(a))  #a is 22
```

## format
printでの出力にとても便利な関数です．
文字列中の{}に，指定した値を入れることが出来ます．

```python:print_format
a, b, c = 10,20,30
#formatで指定した引数のうち，どれを使うかインデックスで指定
#省略すると指定した順に勝手に入る
print('a is {0}, b is {1}, c is {2}'.format(a, b, c))  #a is 10, b is 20, c is 30

#「:」で右側にオプションを付けられる(左側はインデックス)
# >4 で最低文字幅を4に
print('a is {0:>4}, b is {1:>4}, c is {2:>4}'.format(a, b, c))  #a is   10, b is   20, c is   30
# 0>4で足りない部分を0埋め
print('a is {0:0>4}, b is {1:0>4}, c is {2:0>4}'.format(a, b, c))  #a is 0010, b is 0020, c is 0030
```

なお，オプションには小数点以下の桁数指定や2, 8, 16進表記があります．

```python:format_option
a = 1.4142
print(a) #1.4142
print("{:.2f}".format(a)) #1.41 小数第二位に丸める 

b = 18782
print("{:b}".format(b)) #100100101011110  2進数 
print("{:o}".format(b)) #44536            8進数
print("{:x}".format(b)) #495e             16進数(小文字)
print("{:X}".format(b)) #495E             16進数(大文字)
```

### 任意の文字で左・右詰めと中央寄せ
結構便利です．


```python:l_r_just_center
print("69".ljust(15,'-')) # 69-------------  左詰め
print("69".center(15,'-'))# -------69------  中央寄せ
print("69".rjust(15,'-')) # -------------69  右詰め
```

## 追記：f文字列(フォーマット済み文字リテラル)※Python3.6以降
Python3.6からはこういった出力したい文字列の左にfを付けるだけで似たようなことが出来るようになりました．
波括弧の中には出力したい変数名を入れます．あとはformatと同様です．

```Python:f_strings
val = 123
print(f'val is {val:05}')  #val is 00123
```



# (おまけ)終了コード指定で終了
時にはprintによる出力ではなく，「終了コード1を吐いて終了しろ」という処理が求められる場合があります．
その際は`print(1)`して`sys.exit()`するのではなく，`sys.exit(1)`としましょう．

```python:sys_exit
import sys

#処理

if something is wrong:
    sys.exit(1)  #SystemExit: 1
```

# さいごに
formatを駆使して行儀のよい(?)出力を心がけましょう．**出力の乱れはコードの乱れ(????)**．
Rubyのeach_with_objectの途中でbreakした時に困った話

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

```ruby
arr = (1..1000).each_with_object([]) do |num, arr|
    arr << num
    break if num == 500
end

p arr　#=> nil
```

なんとなく上記のようなコードを実行したらarrの中には1..500までの値を保持した配列が返ってくると思ったが、実際にはnilが返ってきた。

どうやらeach_with_objectは最後までループを実行しきって、初めて値を返すようで、
ループの実行途中にbreak文を挟んでしまうと、そこまでの値を返すのではなくnilになってしまうみたい。

上記のような問題に対しての解決策は簡単で、（僕はしらなかったが）実は、breakは引き数を持たせることができる。
breakに対して引数を持たせてあげることで、今回のような場合でも戻り値をnilではなく引き数の値とすることができる。

```ruby
arr = (1..1000).each_with_object([]) do |num, arr|
    arr << num
    break arr if num == 500
end

p arr　#=> [1, 2, 3, .. 498, 499, 500]
```
PuppeteerでCookieを使ってログインする方法

Slackのボットと様々なWebAPIを組み合わせて、Slack上から情報を得られるのは非常に便利です。
しかし、サービスによってはWebAPIがなくCookie認証が必要な場合があります。
そういったサービスにPuppetteerを使ってログインしてスクレイピングする方法について説明します。
細かい説明は省きますので、以下のサンプルコードを確認してください。

https://github.com/orange634nty/login-by-puppeteer


## ログインしてCookieを取得する

まずはIDとパスワードを使ってログインしてCookieを取得します。
ここはログインするページに沿って適切に入力出来るように調節してください。

```javascript
const browser = await puppeteer.launch({headless: true});
const page = await browser.newPage();

// パスワードを使ってログイン
await page.goto(LOGIN_URL, {waitUntil: 'domcontentloaded'});

// サービスによって異なるので、ご自身で調べてください
// ここでは一般的によくありそうな場合で実装しています
await page.type('input[name="user[email]"]', ACCOUNT_EMAIL);
await page.type('input[name="user[password]"]', ACCOUNT_PASS);
page.click('input[name="commit"]');
await page.waitForNavigation({timeout: 60000, waitUntil: 'domcontentloaded'});
```

ログインが完了したら、Cookieを取得してすべてjsonに変換してファイルに保存しましょう。

```javascript
// Cookieをローカルに保存
const afterCookies = await page.cookies();
fs.writeFileSync(COOKIES_PATH, JSON.stringify(afterCookies));
```

これでCookieが取得出来ました。

## Cookieを利用してスクレイピングを行う

先ほど保存したCookieのファイルを利用して、ログインしてそのページの `#title` という要素の中の文字を取得しようと思います。

まずは先ほどjsonで保存したCookieを読み込みます。

```javascript
// ローカルのCookieを使ってログイン
const cookies = JSON.parse(fs.readFileSync(COOKIES_PATH, 'utf-8'));
for (let cookie of cookies) {
  await page.setCookie(cookie);
}
```

Cookieにログイン情報がのってるので問題なくログイン出来ると思います。
あとは普通にスクレイピングすればOKです。

```javascript
// 例えばタイトルを取得
await page.goto(url, {waitUntil: 'domcontentloaded'});
let title = await page.$eval('#title', item => {
    return item.textContent;
});
```

## 注意

当たり前ですが、スクレイピングする際は利用サイトの負荷をかけることになります。
なので、利用サービスの迷惑にならないように注意してください。
また、WebAPIが用意されているならそちらを利用した方がいいです。
サービスの方で適切に管理されているので安全に利用できます。
netstat(ss) -pでポートを掴んでいるプロセス名・PIDを出すにはroot権限で実行する必要がある

タイトルが全てです。当たり前みたいな話ではあるものの気づくのに手間取ったので備忘録。

## 検証環境

OS : CentOS 7.6 (VagrantでVirtualBOX上に構築)

```shell-session
[vagrant@localhost ~]$ uname -a
Linux localhost.localdomain 3.10.0-957.5.1.el7.x86_64 #1 SMP Fri Feb 1 14:54:57 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
[vagrant@localhost ~]$ cat /etc/redhat-release 
CentOS Linux release 7.6.1810 (Core) 
[vagrant@localhost ~]$ ss --version
ss utility, iproute2-ss170501
```

## 実際に打ってみる
CentOS 7系なので`netstat`ではなく`ss`です。


```shell-session
[vagrant@localhost ~]$ ss -t # sudoなし、pオプションなし => 当然PIDは表示されない
State      Recv-Q Send-Q      Local Address:Port                       Peer Address:Port                
ESTAB      0      0               10.0.2.15:ssh                            10.0.2.2:51063                
[vagrant@localhost ~]$ ss -tp # sudoなし、pオプションあり => 表示されない
State      Recv-Q Send-Q      Local Address:Port                       Peer Address:Port                
ESTAB      0      0               10.0.2.15:ssh                            10.0.2.2:51063                
[vagrant@localhost ~]$ sudo ss -tp # sudoあり、pオプションあり => 表示される
State      Recv-Q Send-Q      Local Address:Port                       Peer Address:Port                
ESTAB      0      0               10.0.2.15:ssh                            10.0.2.2:51063                 users:(("sshd",pid=6039,fd=3),("sshd",pid=6036,fd=3))
```
[matplotlib]グレースケール画像の表示

# グレースケール画像をmatplotlibを用いて表示する.

グレースケール画像をmatplotlibを用いて表示することにやや苦戦した. その方法を示したい. oepnCVの公式サイト(http://opencv.jp/opencv-2.1/cpp/reading_and_writing_images_and_video.html)
を見ると, imreadの２番目の引数にint型の整数を指定することで, 画像のカラータイプを指定できることがわかる. そして, その中で, 0を指定してグレースケール画像を表示させたい場合を考える. そこで, 私は以下のようなコードを記述した.

```python
import cv2
from matplotlib import pyplot as plt

test_image = cv2.imread("pasta.jpg", 0) #グレースケール画像として読み込む.
plt.imshow(test_image)
plt.show()
```

この出力結果は以下である. 明らかにグレースケール画像ではない.
<img width="351" alt="Fault.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285948/8ae219f7-6ac7-daa5-b468-3322a17dea8c.png">

# 解決策

この原因は筆者も不明(おそらく正規化が関係するはず)であるが, グレースケール画像を表示するという目的を達成するための解決策として, 以下の２つがある. 

```python:解決策1
import cv2
from matplotlib import pyplot as plt

test_image = cv2.imread("pasta.jpg", 0) #グレースケール画像として読み込む.
plt.imshow(test_image, cmap = "gray")
plt.show()
```

```python:解決策2
import cv2
from matplotlib import pyplot as plt

test_image = cv2.imread("pasta.jpg", 0) #グレースケール画像として読み込む.
plt.imshow(test_image)
plt.gray()
plt.show()
```

上記のコードを用いた結果は以下である.
<img width="349" alt="Success.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285948/5a3cfcc7-251d-b8ef-d617-c58113a8c156.png">

# その他 
2019年 8月25日 時点
解決策2のコードを以下のように訂正させていただきました.
[訂正前]camp
[訂正後]cmap

# 参考文献

[1]http://programming.blogo.jp/python/matplotlib/grayscale_image_opencv
[2]http://takacity.blog.fc2.com/blog-entry-142.html
[3]https://stackoverflow.com/questions/3823752/display-image-as-grayscale-using-matplotlib
コードの共通化を意識する ①

自分がエンジニアバイトをしているところでは週1回Rails勉強会をしています。今回はそのやったところのまとめを残しておきます。
参考書：[現場で使える Ruby on Rails 5速習実践ガイド]
(https://www.amazon.co.jp/%E7%8F%BE%E5%A0%B4%E3%81%A7%E4%BD%BF%E3%81%88%E3%82%8B-Ruby-Rails-5%E9%80%9F%E7%BF%92%E5%AE%9F%E8%B7%B5%E3%82%AC%E3%82%A4%E3%83%89-%E5%A4%A7%E5%A0%B4%E5%AF%A7%E5%AD%90/dp/4839962227)

## 複雑になっていくアプリケーション
機能を開発していくと、どんどんコードの量が増えて複雑になっていきます。すると、ある機能を作っているとき、同じような処理をしているロジックが既に存在している場合があります。このとき手早く実装するためにロジックをコピペしてしまい、同じ処理が複数箇所に存在してしまうことになります。また複数人と開発していると開発者が気づかないうちに同じ処理のコードを新たに作成していたりします。
このようなことがあると変更が起きた時複数箇所直す必要があり、時間が多くかかってしまったり、片方のロジックは直しても、もう片方は忘れたりしてしまうこともあります。さらに似たコードがそこかしこに点在すると、コード全体が読みづらくなります。このような重複問題が起きると新たに機能を追加する時やバグの修正に時間が多くかかってしまう原因になります。

これらの問題を解決する手段としてコードの共通化を行っていく必要があります。しかしただコードを共通化すればいいのではありません。似ているコードの共通点、相違点を分析して、適切な共通化を計らないで重複したを避けようと強引に共通化を行った結果、基本となる設計を壊してしまい将来の機能拡張に支障が出てしまうことになります。
UnityのコルーチンでWaitForEndOfFrameでフレームを送るとInputが拾えない

# Note
この記事は`Unity2019.1.5`で検証しています。

# 背景
Unityで処理をコルーチンに分けることがありますよね。
コルーチンに関する説明は他の記事を参照してください。

コルーチン内で次のフレームまで待機する時に大きく
`yield return new WaitForEndOfFrame()`と`yield return null`
とがあります。

実行順は詳しくはUnityの公式のドキュメントにもありますが
[https://docs.unity3d.com/ja/2019.1/Manual/ExecutionOrder.html]

ネットの記事では、なんとなく`yield return new WaitForEndOfFrame()` が多いようだったのでそれを使ってました。
（なんとなくnullを返すのがはばかられたのもあり）

そしてコルーチン内でマウスのクリック判定をしたくなりました。
その時にハマったものを残しておきます。

# 通常のクリック判定

マウスのクリック判定は `Input.GetMouseButtonDown(0)` を使うと思います。

通常のコルーチンを使わない書き方は以下のような感じだと思います。

```C#
public class MouseTest : MonoBehaviour
{
    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            Debug.Log("GetMouseButtonDown");
        }
    }
}
```

これをGameObjectにアタッチして、実行し、マウスクリックするとログが出力されます。

# 失敗例

`yield return new WaitForEndOfFrame()`を送ってみます。

```C#
public class MouseTest : MonoBehaviour
{
    IEnumerator Start()
    {
        while (true)
        {
            if (Input.GetMouseButtonDown(0))
            {
                Debug.Log("GetMouseButtonDown");
            }

            yield return new WaitForEndOfFrame();
        }
    }
}
```

こちらを実行すると、どれだけクリックしてもログが出力されません。

もしやコルーチン内ではInput.GetMouseButtonDownが使えないのでは。などと思っていました..

# 成功例

`yield return null` にすると　マウスクリックのイベントが拾えることがわかりました。

```C#
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MouseTest : MonoBehaviour
{
    IEnumerator Start()
    {
        while (true)
        {
            if (Input.GetMouseButtonDown(0))
            {
                Debug.Log("GetMouseButtonDown");
            }

            yield return null;
        }
    }
}
```

# 結論
予想ですが、Unityのライフサイクル的に
End of frame の前にマウスイベントのフラグが初期化されるのかな..

`yield return null`のほうが何かと良さそうだし、
逆に `yield return new WaitForEndOfFrame()` はどういう時に使うのが効果的なんだろう..
electron-tabsの紹介

#electron-tabsの紹介
##electron-tabsとは
npmパッケージで、electronでタブ機能を簡単に追加することができます。
https://www.npmjs.com/package/electron-tabs
タブ機能を1から実装するのは面倒ですが、このパッケージを使うことで簡単にタブ機能を実装できます。
##実装方法
`npm install electron-tabs`
インストールはこれで済みます

```html:index.html
<div class="etabs-tabgroup">
    <div class="etabs-tabs"></div>
    <div class="etabs-buttons"></div>
</div>
<div class="etabs-views"></div>
```
index.html(electronで指定したファイル)の好きなところに配置してください

```js:tab.js
const TabGroup = require("electron-tabs");

let tabGroup = new TabGroup();
let tab = tabGroup.addTab({
    title: "Electron",
    src: "http://electron.atom.io",
    visible: true
});

```
これだけでタブを一つ追加できます
srcのurlを変えると表示するページを変更できます
addTabのオプションは下で解説してます

##addTabのオプション解説
ここではよく使うオプションを数個解説します
全オプション一覧はリファレンスを読んでみてください
title　タブのタイトル
src　タブにロードされるURL　webページやローカルファイル
iconURL タブのアイコン
webviewAttributes electronのwebviewの属性を指定できる [webviewの属性](https://electronjs.org/docs/api/webview-tag#%E3%82%BF%E3%82%B0%E3%81%AE%E5%B1%9E%E6%80%A7)を参照
active タブを最初からアクティブ状態にできる
##実装例
test.htmlを表示してtest.jsをロードする場合

```js:tab.js
const TabGroup = require("electron-tabs");

let tabGroup = new TabGroup();
let tab = tabGroup.addTab({
    title: "testPage",
    src: "test.html",
    visible: true,
    webviewAttributes:{
        preload : "test.js"
    },
});

```
文字の頻度ベクトルとN-gramベクトル、コサイン類似度

テキストマイニングで文字の類似ベクトルとN-gramベクトル、コサイン類似度について学びました。
自力で書いたコードを載せておきます。

#文字の頻度ベクトル、N-gramベクトル

文字の類似ベクトルはtextに含まれる文字の種類毎の個数を要素としたベクトル
N-gramベクトルはtextに含まれる連続したN文字の種類毎の個数を要素としたベクトル
とのこと。
N-gramベクトルにおいてN=1なら文字の類似ベクトルと同じですね。

```python:文字の頻度ベクトル
def text_frequency(text):
    dic_vec={}
    for i in text:
        if i in dic_vec.keys():
            dic_vec[i]+=1
        else:
            dic_vec[i]=1
    return dic_vec
```
```python:N-gramベクトル
def N_gram(N,text):
    N_gram_vec={}
    for i in range(len(text)-N+1):
        if text[i:N+i] in N_gram_vec.keys():
            N_gram_vec[text[i:N+i]]+=1
        else:
            N_gram_vec[text[i:N+i]]=1
    return N_gram_vec

```

#コサイン類似度

コサイン類似度は二つのベクトルがどれだけ似ているかをcosで数値化してみよう、といったものです。
先ほどの文字の頻度ベクトルとN-gramベクトルを用いることで、比較したい文をベクトル化し、このコサイン類似度の考え方で類似度を数値化できるわけですね。


二つのベクトルが似ているほどこの値は1に近くなります。
逆に似ていない場合は0に近くなります。
cosを考えていますが出現頻度は負の値を取らないので-1にはなりませんね。
最初勘違いしていました。

[統計WEB/統計用語集/コサイン類似度](https://bellcurve.jp/statistics/glossary/5488.html)

下の関数は2つの辞書を受け取りコサイン類似度を返します。
アルファベット（五十音）の順番が近いほど良いと考えsortedではkeyの順序で並び替えました。
でもkeyの並び順が近いからと言って文が似ていることになるのでしょうか？
valueの順序を並び替えるべきなのかもしれない？
次回の講義で聞けたらいいな……

※追記(2019/06/11)
コサイン類似度では要素が完全に一致しなければなりません
したがって片方の辞書にしかないkeyに関して、もう片方の辞書のkeyのvakueは0とした新しい辞書なりリストなりを生成しなくてはいけませんね

```python:コサイン類似度
def cos_similarlity(dic1,dic2):
    sorted(dic1.items(), key=lambda pair: pair[0])
    sorted(dic2.items(), key=lambda pair: pair[0])
    arr1 = np.array([i[1]
                     for i in sorted(dic1.items(), key=lambda pair: pair[0])])
    arr2 = np.array([i[1]
                     for i in sorted(dic2.items(), key=lambda pair: pair[0])])
    if arr1.shape==arr2.shape:
        return np.dot(arr1,arr2.transpose())/(np.linalg.norm(arr1)*np.linalg.norm(arr2))
    else:
        return -1
```
複数のデータをビューに表示させる処理の流れ

#複数のデータをビューに表示させる処理の流れ
Twitterのようなブログアプリにおいて、複数のデータをビューに表示させる場合、どのようなで処理の流れで動いているのかを復習してみた。

ルティング　→　コントローラ　→　ビュー

の流れで説明する。

routes.rb

```ruby

Rails.application.routes.draw do

     get   'tweets'  =>  'tweets#index' 

  end
```

**ルーティングにおける処理の内容**
1.ビュー(ブラウザ)から'tweets'というパスがルーティングに流れてくる。
2.そこでgetメソッドが'tweets'というパスを文字通りゲットする。
3.パスをゲットしたら、コントローラのindexアクションを動作させる命令を出す



controlers/tweets_controller.rb

```ruby

class TweetsController < ApplicationController

  def index
    @tweets = Tweet.all
  end

end
```
**コントローラにおける処理の内容**

1.indexアクションが作動する。
2.indexアクションに中に定義された@ tweetsというインスタンス変数が作動する。
3.そして、@ tweetsというインスタンス変数の中には、tweetsテーブルの全てのレコードが、Tweetクラスのインスタンスとして代入されている。
4.indexのビューファイルにアクションがなされる。

views/tweets/index.html.erb

```html

<header>
  <h1>ついったー</h1>
</header>
<div class="contents">
  <% @tweets.each do |tweet| %>
    <div class="message clearfix">
      <%= image_tag 'cat1.png' %>
      <div class="message_box">
        <p class="user_name">
          ついーた
        </p>
        <p class="text">
          <%= tweet.text %>
        </p>
      </div>
    </div>
  <% end %>
</div>
```

**ビューにおける処理の内容**

以下のコードで、コントローラに定義された@ tweetsというインスタンス変数の中に代入されたtweetsテーブルの全てのレコードをeachメソッドのdoとendで囲ったところを繰り返し処理する。

```ruby

<% @tweets.each do |tweet| %>
<% end %>
```

以下のコードは、アプリのビューの要素を構成している。
それぞれの要素の部分ぼ下に<%  %>で表示したいデータを入力する。

```html

    <div class="message clearfix">
      <%= image_tag 'cat1.png' %>
      <div class="message_box">
        <p class="user_name">
          ついーた
        </p>
        <p class="text">
```


以下のコードで、eachメソッドのdoとendで囲まれた<%= tweet.text %>の部分を、@ tweetsのレコードの数だけ繰り返し表示するようになります。

```ruby

<%= tweet.text %>
```

　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　以上
ラムダ式の文法

### はじめに
いつもラムダ式の文法を忘れるのでメモ。

普段C言語ばっかり見てるせいかラムダ式は読みにくいしデバッグもしづらいけど、渡されるC#のソースはラムダ式ばっかり使われている。
たぶん利点もたくさんあるんだと思う。

### ラムダ式とは何か
無名の関数を記述するための構文で、パラメータと処理を"=>"で繋ぐ。

### 基本構文
左辺(パラメータ) => 右辺(処理)

#### 左辺(パラメータ)
パラメータの型はコンパイラによって推論されるため指定しなくてよい。

パラメータがない場合

```cs

() => 右辺
```

パラメータが1つの場合
"()"を省略できる。

```cs

param => 右辺
```

パラメータが複数の場合

```cs

(param1, param2) => 右辺
```

### ソース
button1のクリックイベントにメッセージボックスを表示させる処理をラムダ式を使って記述したソース。

```cs:
button1.Click += (s, e) => {
    MessageBox.Show("button1が押されました");
};
```

### おわりに
いまいちラムダ式の良さが理解できないが、たぶんLINQ文との連携のときに威力が発揮されるのだと思う。
LINQについてはまた別の記事にまとめる。
正規表現を使用してフォルダパスの一部を変更しファイルを移動させる

正規表現を使ってフォルダパスの一部を変更＆ファイルて移動させるVBscriptです。
(１個毎にファイルを移動しています）

前　～/A/B/～
後　～/B/A/～

前　c:\x\x\x\x\X-1\1111\x\x\x\a.txt
後　c:\x\x\x\x\1111\X-1\x\x\x\a.txt

この場合の正規表現はこちら。

```
(.*)\\(x-[0123456789])\\(\d{4})\\(.*)
```

仕様
・フォルダを最下層まで下ってファイルのフルパスを取得
・フルパスを正規表現を使用して
　　　\変更しない構成１\変更する構成１\変更する構成２\変更しな構成２
　に切り分ける
・移動先のファイルパスを組み立てる
・移動先のフォルダがない場合は該当フォルダを作成する
・移動元から移動先へファイル移動する

－－－－以下コード－－－－

```
Set fs = CreateObject("Scripting.FileSystemObject")
set re = createObject("VBScript.RegExp")

msgbox "START"

TARGET = "C:\tmp\hig\abc"  '--- 変更するフォルダのトップを指定 ---
KAKUNIN = 10   '---ここを１にすると移動を実行します。1以外は変更内容を確認です---
LIST = ""

'--- 条件 ---
re.pattern = "(.*)\\(x-[0123456789])\\(\d{4})\\(.*)"
re.ignoreCase = true
re.global = true

'--- 実行 ---
FindFolder fs.GetFolder(TARGET)

if KAKUNIN <> 1 then msgbox LIST,,"移動前後のファイル表示": end if

'--- END ---
Set re = Nothing
Set fs = Nothing

msgbox "END-END"


'--- 再帰呼び出フォルダ＆ファイル取得 ---
Sub FindFolder(ByVal z)
        
    '--- 再帰的にフォルダ取得 ---
    For Each x In z.SubFolders
        FindFolder x
    Next
    
    '--- ファイル処理 ---
    For Each x In z.files
        
        '--- 条件にマッチしたらアクション ---
        set m = re.execute(x)
        if m.count > 0 then
        
          set mm = m(0).submatches    

          '--- ここでフォルダ構成を逆転 ---
          Fpath_mae = mm(0) & "\" & mm(1) & "\" & mm(2) & "\" & mm(3)
          Fpath_ato = mm(0) & "\" & mm(2) & "\" & mm(1) & "\" & mm(3)
          
          if KAKUNIN <> 1 then
          
            LIST = LIST & "--------" & vbcrlf & _
                     "前" & Fpath_mae & vbcrlf &  _
                     "後" & Fpath_ato & vbcrlf & vbcrlf 
          
          else
            '--- 移動先のパスがなければ再帰的にフォルダ作成する ---
            CreateFolderEx fs.GetParentFolderName(Fpath_ato)
            
            '--- 移動を実行 ---
            fs.movefile Fpath_mae, Fpath_ato
          end if
        end if
    Next
End Sub



'--- フォルダを再帰的に作成する ---
Sub CreateFolderEx(ByVal strPath)
    Dim strParent   ' 親フォルダ

    strParent = fs.GetParentFolderName(strPath)
    If fs.FolderExists(strParent) = True Then
        If fs.FolderExists(strPath) <> True Then
            fs.CreateFolder strPath
        End If
    Else
        CreateFolderEx strParent
        fs.CreateFolder strPath
    End If
End Sub
```
【Laravel】Bladeで@ifではなく三項演算子を使う

## はじめに

LaravelのBladeでは、`@if`を使ってif文の分岐ができますが、`{{}}`内で三項演算子を使うこともできます。

好みにもよりますが、三項演算子を使った方がBladeがすっきりする場合もあるかと思います。

## 使用例その1

```html:
<div>
  @if ($item->is_approved)
    承認済
  @else
    未承認
  @endif
</div>
```

:point_down_tone2:

```html:
<div>
  {{ $item->is_approved ? '承認済' : '未承認' }}
</div>
```

## 使用例その2

```html:
<div>
  @if ($item->notice)
    {{ $item->notice }}
  @else
    お知らせはありません
  @endif
</div>
```

:point_down_tone2:

```html
<div>
  {{ $item->notice ?: 'お知らせはありません' }}
</div>
```
レスポンシブ研究中の私がよく使う意外と便利なプロパティ。


#縦幅を子要素の大きさによって可変する

コンテンツを覆う親要素に
`overflow: hidden;`
を設定してあげると、子要素のサイズに合わせて親要素が可変します。

```html
<div class="wrap">
  <div class="inner">
     <p　class="content">コンテンツ</p>
   </div>
</div>
```
```scss
.wrap{
  background-image: url(); //背景色でも。画像は可変するのでSVGじゃないと荒れます
  overflow: hidden; //子要素を認識
}

.inner{
  padding: 30px 0; //子要素を調整します、ご自由に
}
```

わざわざ背景にheightを設定しなくても、自然と子要素に合わせて背景サイズが変わってくれました。
`overflow: hidden;`は他にも色々な使い所があり便利なプロパティですね。

#程よく画像などの要素を可変させたい

画像に%を設定すると、可変してくれますが、大きくなりすぎたり小さくなりすぎたりすることがあります。そんな時は

```scss
.img{
  width: 25%; //25%で画面サイズに合わせて可変します
  height: auto; //高さは自動調節されます※％で設定してもok
  max-width: 100px; //100px以上にはなりません
  min-width: 50px; //50px以下にはなりません
}
```
という具合に、`max-width`や`min-width`を設定してあげると程よく可変してくれました。
画像だけじゃなく、テキストボックスや他の要素にも使えます。

#わざとカラム落ちさせる

よ〜く使われる`display: flex;`ですが、画像やテキストボックスなどのアイテムを横並びにした際
`width: 100%`や`flex-direction: column;`などを、メディアクエリの記述によって縦並びにするのもいいのですが

```html
<div class="wrap">
  <div class="item">
  </div>
  <div class="item">
  </div>
</div>
```
```scss
.wrap{
  display: flex; //横並び
  flex-wrap: wrap; //要素幅が100%を超えたとき自然と縦並びになってくれる
  /*widthは数値で設定しないでね！カラム落ちしなくなるよ*/
}
```
という具合に`flex-wrap: wrap;`を指定しておくだけで、カラム落ちしてitemが縦並びになりました。


皆さん他にも便利なレスポンシブプロパティがあったら教えてください♪
【備忘録】Djangoを使って"Hello World"を出力する~Django初心者向け記事①~

#始めに自己紹介
こんにちは。ばやしです。現在はSEとして研修を受けていいる新米エンジニアです。エンジニアとしては未経験の僕ですが、プライベートでPythonを勉強しています。最近、**PythonのフレームワークであるDjango**を使い始めましたのでDjangoの使い方を備忘録としてQiitaに保存しておきます。初心者向けの導入の記事がDjangoに関しては少なく感じたのも記事を書く動機の一つです！(アウトプットの意味も込めています。)

#この記事の目標と注意点
この記事では**MacでDjangoを使用して画面上に「Hello World」と画面表示**させます。
また冒頭で述べたように僕自身のエンジニアとしての知識が浅いため、**言葉の定義や説明が不十分なところがあると思います**。その際はご指摘いただけると幸いです！よろしくお願いします！

###### ※Djangoのプロジェクト作成前の初期設定は他のサイトを参考にしてみてください。基本的には以下の2つのコマンドだけですが、、
`brew install python3`
`pip3 install django`
brewやpipコマンドのインストールの説明は割愛します。

#実行環境
僕の実行環境は
MacBook Pro (Retina, 13-inch, Early 2015)
Sublime text
Terminal
Python 3.6
Django 2, 2, 1

になります。
(実行環境に関して説明が不十分なところあれば教えてください！)


#早速やってみよう
####フォルダの作成
まず最初にやることはフォルダの作成です。適当なところにフォルダを作成しましょう。
`mkdir helloworld`
**helloworld**というフォルダを作成しました。

ではこのフォルダの中に移動します。
`cd helloworld`

####プロジェクトを作成する
いよいよDjangoのプロジェクトを作りましょう。以下のように入力してみましょう。
`django-admin startproject hello .`

上記のコマンドを打ち込むとフォルダの中に「hello」と「manage.py」の表示があると思います。さらに「helloworld」の中には色々とファイルがあれば、プロジェクトの作成成功です。

####views.pyをいじる
それでは作成したファイルをエディタで開いてみましょう。まずは**helloのフォルダの中に「views.py」を作成してください。**
作成したらviews.py以下のものを書き込みます。

```python:views.py
from django.http import  HttpResponse

def hello(request):
    return HttpResponse("Hello World")
```

####urls.py　をいじる
デフォルトでは以下のように書いてあります。

```python:urls.py
from django.contrib import admin
from django.urls import path

urlpatterns = [
    path('admin/', admin.site.urls),

```

それを以下のように追記してください。

```python:urls.py
from django.contrib import admin
from django.urls import path
from .views import hello   #追記

urlpatterns = [
    path('admin/', admin.site.urls),
    path('hello/', hello)   #追記
]
```


これで準備完了です。

####サーバを立ち上げてみる
Djangoのサーバーの立ち上げは以下のコマンドでできます。

`python manage.py runserver`

ここでの注意は、サーバーを立ち上げるコマンドを使用するときの階層はmanage.pyのファイルがあるところで行ってください。(そうでないとmanage.pyが存在しませんなどのエラーがでる)


```
Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).

You have 17 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.

June 08, 2019 - 15:06:39
Django version 2.2.1, using settings 'helloworld.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

```
サーバーを立ち上げて上記のメッセージが出てきたら成功です。

それでは`http://127.0.0.1:8000/hello/`のURLを開いてみてください。(8000の部分は各個人の環境によって異なることがあります。)
`hello/`の部分はurls.pyで設定したものです。


![Screen Shot 9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/303882/bc79a095-0cf9-a8ae-4fa9-98d8767d7a2e.png)


うまく表示されたでしょうか？
表示されていれば成功です！

確認ができたら最後に`ctrl + c`でサーバーを止めましょう。

お疲れ様でした。

####終わりに
新米すぎるエンジニアなので、ミスがあったらどんどんコメントなどいただけると嬉しいです。僕自身の勉強になりますので！
次回はtemplatesを利用してHTMLファイルでHello Worldを表示させる記事を書きます。

記事を書くというアウトプットは個人的にハマりそうなので、自分の勉強に合わせてDjangoの記事を更新してこうと思います。(まさかりがいつかきそうで怖い、、)

ありがとうございました。
IBM Cloud上のNode-redが使うCloudantを変更する際の変更箇所

#目的
まぁ、色々とアーキテクチャ考えている中で、ふとCloudantを繋ぎ変えてみたくなったのです。

#変更する箇所
分かる人には分かるということで十分な情報かと思いましたのであまり細かく書きませんが。。

## 管理画面より
 - 「接続」でCloudantをバインドし直す。この際、古い方のアンバインドの際は再ステージ不要だと思うんですが、新しい方をバインドする時には再ステージしないと反映されません。ただ、この段階で再ステージしたところでエラーにはなります。エラーは気にせず下記を実施します。
 - （ちなみに、試しに複数のCloudantのバインドも普通に出来ます。この場合、私はNode-red内でprocess.envあたりからCloudantへの接続情報取って来てたんですが、配列の順番がバインドした順番ではなく別なソートがかかってるみたいなので、元々のCloudantは[0]で取ってくるということが出来ず困りました。まぁ余談です。）
 - 環境変数で`NODE_RED_STORAGE_NAME`という変数を新規で作成し、新しくバインドしたCloudantのサービス名を入れる。この際の名前は「接続」で表示される名前を使う。（地味にbluemix-settings.jsの中で使われていて、ここ見落としてたのでしばらくアプリ起動が出来ずハマった。）

## 設定ファイルより
 - `manifest.yml`の下部にserviceという項目があるので、そこを修正する。この際のサービス名も「接続」で表示される名前でOK。

## 再ステージが完了すると
manifest.ymlの修正をコミットしてツールチェーンにより再ステージが完了したら、`/red`を叩いてもエラーが帰って来るようになります。何もファイルが無いからです。
なので、`/`を叩いてNode-redの再設定を行うと、新しいCloudantに`nodered`データベースがなければ作成され、既にあれば、その配下に`Node-redのサービス名/flow`などのファイルが作成されて来て普通に使えます。
もし元々のFlowを使いたい場合は、前のCloudantのnoderedデータベースを消してなければそこのFlowをコピーしてくれば大丈夫です。


以上です。
紆余曲折ありましたが、最終的には以外とシンプルに変更できました。
Raspberry Pi 3B+ Raspbian で格安液晶ディスプレー設定

なにかと便利なラズパイですが，小さなモニタがあると出先でも便利です．
banggoodでタッチパネル付き3.5インチの格安TFTモニタを見つけたので取り付け・設定しました．

プラスチックのケース付きで￥1703でした．
↓これ
https://www.banggood.com/Geekcreit-3_5-inch-TFT-LCD-Touch-Screen-Protective-Case-Touch-Pen-Kit-For-Raspberry-Pi-3B3B2B-p-1391232.html?rmmds=myorder&cur_warehouse=USA

取り付けはラズパイのヘッダピンに重ねるだけです．

問題はラズビアンでのタッチパネルの設定です．
当初　液晶画面上でタッチパネルのポイント取得がX軸とY軸で入れ替わっており，設定しなおしが必要でした．
設定する方法はいくつかあるようですが，
/usr/share/X11/xorg.conf.d/99-calibration.confに書く方法をとりました．

なぜかSwapAxesとSwapXYの設定が機能しなかったので，TransformationMatrixでX,Y軸を入れ替え，かつ両軸とも＋－が逆となっていたのでInvertX，InvertYに１を設定しました．
99-calibration.confには細かいキャリブレーションの設定も書けます．

TransformationMatrix ですが，9つの数字は3x3のマトリックスを表します．
モニタの場合X,Yの2軸しかないので，XとYを入れ替える場合は0 1 0 1 0 0 0 0 1とすればよいと思います．（この9桁の数字で画面の回転なども設定できます）
左から数えて 1つめの1（2番目/全体），もしくは2つめの1（4番目/全体）を負にすると（－1）X軸（もしくはY軸）の動きが逆になるはずですが（InvertX/InvertYと同じ）それぞれの軸がバイアスされている（各軸が0からはじまっていない）ようで，モニタからポインタがはみ出てしまうようです．
なので，その場所は1のままにしておき，軸の正負の反転はInvertX/InvertYを使いました．
つまり，TransformationMatrixとInvertを併用しています．
ファイルは/usr/share/X11/xorg.conf.d/99-calibration.conf
/etc/X11/xorg.conf.dではありません．

```99-calibration.conf
Section "InputClass"
        Identifier      "calibration"
        MatchProduct    "ADS7846 Touchscreen"
        Option  "Calibration"   "3936 227 268 3880"
        Option  "InvertX"    "1"
        Option  "InvertY"    "1"
        Option  "TransformationMatrix" "010100001"

EndSection
```
画面を回転させる場合は
/boot/config.txtに
display_rotate=2（180°回転）
を書く

引用
https://ht-deko.com/RaspberryPi/aob_lcd35.html (99-calibration.confの設定について詳しい)

https://pub.slateblue.tk/memo/day3857.html
http://studior.synology.me/wordpress/2017/03/12/raspberry-pi-3-lcd/