OmniAICreator/Qiita-1.07M huggingface dataset:
Docker超入門 Part1

この記事は、[Docker超入門Part1](https://youtu.be/7mwoTs0LoYA)の内容を要約・文字起こししたものです。（一部加筆、修正あり）


## Dockerで開発環境を作ってみよう

Dockerとはなにか？を1行で説明すると、

**vmwareやvirtualboxのような仮想マシンの技術とchefやansibleのような構成管理ツールを合わせたもの！** です。

vmwareやvirtualboxは元になるOSのイメージがありますが、
dockerの場合元になるOSのイメージはdocker hubというところからとってこれます。↓
https://hub.docker.com/_/ruby/
上記はrubyのイメージです。

virtualboxだと、ubuntuをインストールしたイメージなどが配布されていますが、
docker hubはrubyをインストール済みのもやmysqlをインストール済みのものが配布されているので、
それらを使うことで初期設定で楽ができます。
色々あるから探してみてね！


## railsのセットアップをしてみる
では、わかりやすい例としてRuby on Railsの環境設定をしてみます。

まず適当にフォルダを作ります。

```sh
mkdir rails
cd rails
```

まず、最初に作らないといけないファイルはDockerfileというものです。


```dockerfile:Dockerfile
FROM ruby:2.5.3-strech
```

FROMはどのOSイメージを使用するかの指定になります。
`<イメージ名>:<タグ名>`で指定します。
今回の場合、`ruby`がイメージ名、`2.5.3-strech`がタグ名なので
上記のように書けばOKです。

次に、`docker-compose.yaml`ファイルを作ります。
Dockerの場合、動かしているもの(OS)を`コンテナ`と言うのですが
それをどうやって動かすかの設定をするファイルになります。

このファイルはどこかからテンプレート持ってきて書く場合の方が多いので、
だいたいこう書くんだなということが理解できればOKです。

```docker:docker-compose.yaml
version: "3"
services:
  app: # コンテナ名なのでなんでもいい
  	build: . # これで同じフォルダのDockerfileが対象という意味。
  	volumes: # フォルダをコンテナにマウントします。(ファイル共有)
  		- "./app" # このフォルダを`/app`にマウントするという意味です。
  	ports: # ポートをバインドします。`ローカルポート`:`コンテナポート` と指定します。
  		- "3000:3000" # この場合、ローカルの3000ポートにアクセスした時に、コンテナの3000ポートにアクセスするの
  	tty: true # つけといてください
```

`volumes`でローカルのフォルダをコンテナにマウントします。
これで、ローカルファイルをエディタで編集すれば、そのままrailsに反映されます。便利。

`ports`でポートをバインドします。
コンテナは別のOSなので、ポートをバインドしてあげないと、ローカルから見えません。

これで設定は完了です。
では、dockerを動かします。

```sh
docker-compose up
```

コンテナに入ります。(sshで入るようなもの)

```sh
docker exec -it rails_app1 /bin/bash
```

動画内では↑を説明していますが、↓これの方がシンプル。
（docker-compose.yamlと同じフォルダで実行する必要あり）

```sh
docker-compose exec app bash
```

では、railsのセットアップをします。

```sh
cd /app
gem install rails
rails new .

# nodejsも必要なので。。
apt-get update
apt-get install nodejs

rails s -b 0.0.0.0
```

http://localhost:3000 にアクセスすれば、railsが立ち上がっているのが確認できると思います！
ね。簡単でしょ？
次回は、もうちょっと掘り下げて説明をしたいと思います。
Google翻訳でのページ翻訳時にコード部分は翻訳しない方法

Chromeでコンテキストメニューを開き、「日本語に翻訳」するとページ全体を日本語に翻訳してくれますが、Githubなど一部のサイトではコード部分まで日本語に翻訳してまうので、読むのが辛いです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11520/8fba3568-d60c-1523-6e9e-684f00b1e3dc.png)
[GitHub - airbnb/javascript: JavaScript Style Guide #variables]
(https://github.com/airbnb/javascript#variables)


# コード部分は翻訳しないようにする
~~Google翻訳は`<code>`タグ内は翻訳しないので、コード部分の`<pre>`タグの中身を`<code>`タグで囲ってあげれば解決します。~~

"notranslate" のクラスをつけるだけでも翻訳しないようにできるようです。
こっちのほうが良さそうなので、この書き方に書き換えました。 
@Goggle555 さん情報提供ありがとうございます。

ページアクセス時に`<pre>`タグに`notranslate`クラスを追加するUserscriptを書きました。コードはこちら。
[userscripts/script.user.js at master · nkmr-jp/userscripts · GitHub](https://github.com/nkmr-jp/userscripts/blob/master/Translate_excluding_code/script.user.js)

## 使い方
1. Chromeの拡張の [Tempermonkey](https://chrome.google.com/webstore/detail/tampermonkey/dhdgffkkebhmkfjojejmpbldmpobfkfo?hl=ja) をインストール。(これはユーザー定義のスクリプト（Userscript)を任意のサイトで実行できる拡張機能です。)
2. [ソースを確認](https://github.com/nkmr-jp/userscripts/blob/master/Translate_excluding_code/script.user.js)
3. 「Raw」リンクをクリック。(通常は生のjsファイルが表示されますが、Tempermonkeyを入れている場合、インストール画面が表示されます) 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11520/76901b06-da17-6e0a-6956-854ab083e0ca.png) 


Tempermonkey をインストール済みの場合、`.user.js` のファイルを開くと自動でスクリプトインストールページを開いてくれるので便利です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11520/5dc24428-6d42-02d1-18a0-51bef67067cd.png)


設定ページの「ユーザーによる include」にサイトを追加すれば、スクリプトを実行させるサイトを追加できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11520/5563af78-e768-efae-81d3-697151cc9c48.png)
コード部分をpreタグで囲ってるサイトだったら大体ちゃんと動くと思うので、コード部分も日本語に翻訳してしまっているサイトがあれば試してみてください。


# 動作確認
[GitHub - airbnb/javascript: JavaScript Style Guide #variables](https://github.com/airbnb/javascript#variables)

スクリプト反映前
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11520/e427f1f9-e7f1-6251-3fba-f7c0b9fabd46.png)


スクリプト反映後
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11520/06ce0c65-cc82-6d1e-9dc8-91878f26b491.png)
コードは省いて翻訳するようになった。
LocalStack がエラーで起動できない

# 概要

localstack を Git から Clone してそのまま使おうとしたらエラーで起動できなかったので対策をメモします。対象はmacOS利用者の方になります。
※手っ取り早く知りたい人は一番下の解決策の項目を見てください。

# 環境

macOS Mojave 10.14.5
Docker version 18.09.2

# 対策


### エラー内容
docker-composeから起動した時のエラーメッセージは下記の内容になります。

```
$ docker-compose up
Starting localstack_localstack_1 ... error

ERROR: for localstack_localstack_1  Cannot start service localstack: b'Mounts denied: 
The path /var/folders/p2/fwlptfcs3h58cs3j4q21bkfm0000gn/T
is not shared from OS X and is not known to Docker.
You can configure shared paths from Docker -> Preferences... -> File Sharing.
See https://docs.docker.com/docker-for-mac/osxfs/#namespaces for more info.
.'

ERROR: for localstack  Cannot start service localstack: b'Mounts denied: 
The path /var/folders/p2/fwlptfcs3h58cs3j4q21bkfm0000gn/T
is not shared from OS X and is not known to Docker.
You can configure shared paths from Docker -> Preferences... -> File Sharing.
See https://docs.docker.com/docker-for-mac/osxfs/#namespaces for more info.
.'
ERROR: Encountered errors while bringing up the project.

```
※ エラーメッセージ中の \r\n は見やすいように改行にしています。

マウントできないエラーのようです。
Dockerアプリの設定から File Sharing を確認すると以下の画像の通りでした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265708/4f019ef6-d63a-f7df-95cc-ed605b8958a2.png)

たしかに /var が入ってないし追加してあげようとしたら以下の画像の通り、エラーになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265708/54af5d58-1245-ba53-7496-7d3e02b77fb5.png)

シンボリックリンクを疑ったが、やはりそうだった。 /var の本体は /private/var でした。
しかし、それなら大丈夫なはずだがなぜエラーになるのか...

### docker-compose.yml の確認

```:docker-compose.yml
version: '2.1'

services:
 localstack:
   image: atlassianlabs/localstack
   ports:
     - "4567-4582:4567-4582"
     - "8080:8080"
   environment:
     - SERVICES=${SERVICES- }
     - DEBUG=${DEBUG- }
     - DATA_DIR=${DATA_DIR- }
     - LAMBDA_EXECUTOR=${LAMBDA_EXECUTOR- }
     - KINESIS_ERROR_PROBABILITY=${KINESIS_ERROR_PROBABILITY- }
     - DOCKER_HOST=unix:///var/run/docker.sock
   volumes:
     - "${TMPDIR:-/tmp/localstack}:/tmp/localstack"
     - "/var/run/docker.sock:/var/run/docker.sock"
```

volumes のこの ${TMPDIR:-/tmp/localstack}:/tmp/localstack が怪しい。
調べてみるとやはりこれのせいだった。
一応、TMPDIRは下記のパスのとおりで/var配下だけどダメらしい。

```
$ echo $TMPDIR
/var/folders/p2/xxxx/T
```

docker run だとシンボリックリンクを解決してくれないのかもしれない。
そのため以下の方法で指定し、解決することとした。

### 解決策

```
$ TMPDIR=/private$TMPDIR docker-compose up
```



# 参考

https://github.com/localstack/localstack/issues/480
64bitのenumはUnityでシリアライズ出来ない

#TL;DL

```cs
// OK シリアライズされる
enum E{}
enum B : byte {}
enum SB : sbyte {}
enum S : short {}
enum US : ushort {}
enum I : int {}
enum UI : uint {}

// シリアライズされない
// Unsupported enum type 'BattlePlayer.Type' used for field 'type' in class 'BattlePlayer'
enum L : long {}
enum UL : ulong {}
```

# 説明

64bitのenumはC#ではサポートされていますが、Unityではシリアライズすることが出来ません。
故に、インスペクタで編集したり、シーンやプレハブに含めることも出来ません。

18446744073709551615個も列挙することなんてないだろ！と思われそうですが、問題はフラグとして使いたいときです。
1bitに1要素が入るわけですからlongでも64要素しか扱うことが出来ません。（それでも十分多い？）

# 解決策

### 生longとして

long, ulongはシリアライズできるので、キャストしてあげれば使えます。
因みにulongは内部的にはちゃんと0~18446744073709551615までシリアライズされますが、インスペクタ上では符号付数として表示されてしまうので注意が必要です。

インスペクタ拡張などでenumに出したいときは`System.Enum.GetName`を使うことで、値から名前を逆引きできます。
第一回Try English LT! for engineers 発表資料まとめ

# Try English LT! for engineersとは？

エンジニア向けの英語のみのLTイベントを行なっています！
毎回、LTのスピーカー募集してます！エンジニア向けの内容であればテーマは自由です。
英語でLTをやるとなると、中々ハードルが高く、 参加者が海外の人ばかりだと、なおさら難しく感じると思います。
ちょっと自信はないけど、 英語のLTにチャレンジしてみたいという人にぜひ発表してもらいたいです。
英語が好きなエンジニア同士で交流できるイベント運営ができればと思っています。

第一回イベントページ
https://try-english-lt.connpass.com/event/133844/

## 発表資料
・Nobu
エンジニア向けの英語学習アプリを開発した話
A story about developing a learning English app for engineers
https://docs.google.com/presentation/d/1ueLECpLbZwIbPY3V2tig9NY00EfI_I4Q2u3shGA2ssw/edit#slide=id.g35f391192_00

・Toshi さん
日常に英語学習を組み込む方法
How to study English in daily life
https://speakerdeck.com/toshi6581/how-to-study-english-in-daily-life

・Sally さん
ノンネイティブの私がなぜ留学中にトップクラスの成績が取れたのか
How I got "A" grades at a university in the US, even though I am not a native English speaker
https://speakerdeck.com/sallykinoshita/how-i-got-a-grades-at-a-university-in-the-us

・Laravel-tan さん
弱小エンジニアのポジション取り作戦
A strategy to take a position for a just engineer
https://docs.google.com/presentation/d/1eOqMaSxIqdfcDYdhoQEYt1VjQh3gkkbBl0zyNDuaqC4/edit#slide=id.p

・tsu-nera さん
MOOC紹介(きみも激つよエンジニアになれる）
MOOC Introduction(You can become a GEKITSUYO Engineer)
https://speakerdeck.com/tsu_nera/mooc-introduction

・Sakamoto さん
CVを簡単に管理する方法を考える
Thinking about easy ways to manage your CV
https://gitpitch.com/Skmt3P/gitpitch/20190627#/

・nunulk さん
英語を学ぶとどのように世界が広がるか
How does learning English broaden your world?
https://speakerdeck.com/nunulk/how-does-learning-english-broaden-your-world

・tatane さん
外国人エンジニアとの付き合い方
How to get along with non-Japanese engineers
https://speakerdeck.com/tatane616/how-to-get-along-with-non-japanese-engineers

・Yuki Miyake さん
Slack APIを使ってリアクションの使い方が似ているユーザをグルーピングする
Find users similar to you by analysing the history of emoji reactions in Slack
https://speakerdeck.com/zawawahoge/clustering-users-by-slack-reactions

・Kohei Tanaka さん
ブロックチェーンがどのように世界を変えるのか
How blockchain change the world
https://drive.google.com/file/d/1K5jPcAl1hcH_klZBpDd1e9ru3TQUubsl/view
A server is already running

##rails sしたら下のエラーでサーバーが起動しない

```
=> Booting Puma
=> Rails 5.2.3 application starting in development 
=> Run `rails server -h` for more startup options

A server is already running
Exiting
```

#解決コマンド
```
$ kill -9 $(lsof -i tcp:3000 -t)
```

これ一発で自分のlocalhost3000で立ち上がってるサーバーが全て切れる


告知

進撃のIT
https://attack-on-it.herokuapp.com/
左手法のアルゴリズムの可視化 (Python in Processing)

# はじめに

迷路を解く有名なアルゴリズムの一つに，左手法(右手法)があります．これは，「左手で常に壁を触り続けて前に進めば，必ずゴールに到達できる」という考えに基づくものです．単純な迷路であればゴールにたどり着けますが，スタート地点やゴール地点を意地悪されたり，迷路が立体的になったりすると，ゴールにたどり着けない場合があります．より有用なアルゴリズムは多数ありますが，理解と実装が簡単で，グリッドを扱う入門に適した題材だと思います．

この記事では，左手法を Processing (Pythonモード) で実装し，動きを可視化します．簡単のためグローバル変数を多用していますが，本当はよくないです．

# 環境

- Processing 3.5.3
- Python Mode for Processing 3 3056

# 動画

![左手法の可視化.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42200/846cd76d-6ce7-1074-7c45-b0c0ba65431b.gif)

# 実装

```python:left_hand_method.pyde
# 解く対象のマップ
# 壁は1, 通路は0
# grid[y][x] でアクセス
grid = [
        [1, 1, 1, 1, 1, 1, 1],
        [1, 0, 1, 0, 0, 1, 1],
        [1, 0, 1, 1, 0, 0, 1],
        [1, 0, 0, 0, 1, 0, 1],
        [1, 0, 1, 0, 1, 0, 1],
        [1, 0, 1, 0, 0, 0, 1],
        [1, 1, 1, 1, 1, 1, 1]
]

# マス目の表示サイズ
S = 500 / 7

# 上下左右の相対座標 [←,↑,→,↓] の順
dx = [-1, 0, 1, 0]
dy = [0, -1, 0, 1]

# ゴールの座標
goal_x, goal_y = 1, 5

# エージェントの座標と向き
px, py = 1, 1
p_dir = 0

# 定期実行するための変数たち
dt = 15
next_frame = dt * 3

def setup():
    frameRate(30)
    size(S * 7, S * 7)
    textSize(30)
    textAlign(CENTER, TOP)

def draw():
    background(255)
    draw_grid()
    draw_agent()
    
    # 定期的に左手法を1回実行
    global next_frame
    if next_frame < frameCount:
        left_hand_method()
        next_frame += dt

# 左手法のアルゴリズム
# 左隣に壁がある && 前に壁がある => 右回転
# 左隣に壁がある && 前に壁がない => 前進
# 左隣に壁がない => 左回転して前進
def left_hand_method():
    global px, py, p_dir

    # ゴール済み判定
    if (px, py) == (goal_x, goal_y):
        return

    # エージェントから見て左側の向きと座標
    left_dir = (p_dir + 4 - 1) % 4
    lx, ly = px + dx[left_dir], py + dy[left_dir]

    # 左に壁があるかどうか
    if grid[ly][lx] == 1:
        # 前に壁があるかどうか
        if grid[py + dy[p_dir]][px + dx[p_dir]] == 1:
            p_dir = (p_dir + 1) % 4
        else:
            px += dx[p_dir]
            py += dy[p_dir]
    else:
        p_dir = left_dir
        px, py = lx, ly


# --- 描画用の補助関数 ---

# マップの描画
def draw_grid():
    fill(0)
    for y in range(7):
        for x in range(7):
            if grid[y][x] == 1:
                rect(x * S, y * S, S, S)
    textHeight = textAscent() + textDescent()
    text("G", (goal_x + 0.5) * S, (goal_y + 0.5) * S - textHeight / 2)

# エージェントの描画
# 未ゴールは赤, ゴール済みは青
def draw_agent():
    if (px, py) == (goal_x, goal_y):
        fill(0, 0, 255)
    else:
        fill(255, 0, 0)
    pushMatrix()
    translate((px + 0.5) * S, (py + 0.5) * S)
    rotate(p_dir * HALF_PI)
    triangle(
        -S / 4, 0,
        S / 4, -S / 8,
        S / 4, S / 8
    )
    popMatrix()
```

# 参考

[迷路 - Wikipedia](https://ja.wikipedia.org/wiki/%E8%BF%B7%E8%B7%AF)
綺麗な三次元バンド図をgnuplotで作る。

#はじめに
論文にカッコいいDirac cone(https://en.wikipedia.org/wiki/Dirac_cone) の図を載せたいと思い、gnuplotで何とか作れないかと試行錯誤したときのことを書きたいと思います。
同じくカッコいい3次元のバンド図を作りたい方の参考になればと思います。
使ったgnuplotのversionは5.2、Aquatermを出力先に指定しています。

#データファイルの準備
kx,ky,Eigenenergyのデータを準備。

```
#kx ky Eigenenergy
-0.500000 -0.500000 -4.15058469e-02
-0.495000 -0.500000 -4.12624296e-02
-0.490000 -0.500000 -4.10399042e-02
(中略)
0.490000 -0.500000 -4.10399072e-02
0.495000 -0.500000 -4.12624326e-02
(2行目の値が変化するときに空行)

-0.500000 -0.495000 -4.12624326e-02
-0.495000 -0.495000 -4.14517312e-02
(以下略)
```

というように1行目が先に変化していく形式で出力する。もしこの形式でなければplotコマンドに

```
set dgrid メッシュ数, メッシュ数
```

を入れる必要アリ。

#とりあえず書いてみた

splotを使ってデフォルト値でプロットしてみる

```perl 
splot "Valence.dat" u 1:2:3 with line notitle
replot "Conduction.dat" u 1:2:3 with line notitle
```
![Fig1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238983/a70eeb17-39b1-676e-30f9-72ca9f86ebef.png)
これではDirac coneが見えない。

#プロット範囲を狭める

$-0.2\leq k_x,k_y \leq 0.2$くらいの場所にDirac点があり、Fermi準位付近だけを書けば良いので

```perl 
set xrange[-0.2:0.2]
set yrange[-0.2:0.2]
set zrange[-0.025:0.025]
```
としてみる。
![Fig2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238983/31463e23-378a-072d-ade0-522f0063ce9b.png)
Dirac coneが少しだけ見えてきたがなんか安っぽい。

#視点、z軸方向の比率を変更
set viewを使って水平視点から眺める、z軸方向を伸ばす。上手く3次元図を書くにはこのオプションがどうやら重要のようだ。

```perl 
set view 88, 80, 0.6, 3
```

set viewは一行目から$\theta$方向の視点、$\phi$方向の視点、グラフの拡大率、z軸方向の拡大率を表す。


![Fig3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238983/18f3e7d6-27fd-7dd0-6c8c-b6718068a6f1.png)

**それっぽくなってきた**

#色を付ける
set pm3dを使ってカラフルに色を付ける。

```perl 
set pm3d
set palette rgbformula 22,13,-31
splot "Valence.dat" u 1:2:3 with pm3d notitle
replot "Conduction.dat" u 1:2:3 with pm3d notitle
```

![Fig4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238983/9302fdd5-9a66-9ca9-ed38-bd3e3986ec14.png)

**三次元感がない。**

#格子線を入れる
3次元感を出すために

```perl 
set pm3d hidden3d
```

としてみた

![Figure 0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238983/e7c8bc0f-7d19-d738-48ab-8b423e8276be.png)

**カッコいい....これぞDirac cone**

#Plotコマンドまとめ

```perl:Dirac.plt
set pm3d hidden3d
set xrange[-0.2:0.2]
set yrange[-0.2:0.2]
set zrange[-0.025:0.025]
set view 88, 80, 0.6, 3
set palette rgbformula 22,13,-31
splot "Valence.dat" u 1:2:3 with pm3d notitle
replot "Conduction.dat" u 1:2:3 with pm3d notitle
```
終わってみればシンプルに書けるみたいだ。

#使用例
論文に載せました。
https://doi.org/10.7567/1882-0786/ab25d3
(arXivはhttps://arxiv.org/abs/1905.05944)
OSS作ってみたかった( `gcctx` コマンドを作ってみた )

## お遊びの個人プロジェクトとして `gcctx` コマンドを作ってみた。
* https://github.com/ykamenashi/gcctx

### なにこれ
* `kubectx` のパチモン
  * `gcloud config list` で出せるGoogle Cloud SDKの設定情報を `configurations` としてもともと `gcloud config` は管理できるんだけど、いけてないので作った
* `gcloud config configurations activate` はいくらなんでも長過ぎるので

### aliasでよくね？
* いやです
* いわゆるGitHub-Flowを使ったIssueとPullRequestに基く設計と開発ができることを自分自身確認したかった、というのが作成の動機
* あと英作文の練習
* `kubectx` のソース見たら `bash` で書かれていたのでぶっちゃけbashでよくね？と思ったのでbashで書いた

## いれかた・つかいかた
* `README.MD` `INSTALL.md` `REQUIREMENTS.md` に書いといた。

## 未完成じゃないですか！
* とりあえずgetとsetができるんでaliasの代わりにゃなるっしょ。
* 一応、存在しないconfigurationはactivateできないcheckはついてる。

## ライセンス
* なんとなくGPL v2

## どうでもいい情報
* 「GCCTX」はゴールドマンサックスのなんかと被ってるらしい。
2019年8月以降の Android アプリの申請について

2019年8月以降、Google Play へアプリを新規に申請する場合は、対象アプリの `ターゲット API レベル` を `28（Android 9.0）` 以上に設定する必要があります。

また、2019年11月以降は、既存のアプリのアップデートを申請する場合も、対象アプリの `ターゲット API レベル` を `28（Android 9.0）` 以上に設定する必要があります。

詳しくは、[2019 年のターゲット API レベル要件の拡大について](https://developers-jp.googleblog.com/2019/03/2019-api.html) を参照してください。


# Monaca で ターゲット API レベル 28 に対応する その1

Monacaで開発するアプリに対して、ターゲット API レベル を 28 にする場合は、対象プロジェクトを `Cordova 9.0` にする必要があります。

対象プロジェクトの Cordova のバージョンが Cordova 9.0 より低い場合は、対象プロジェクトの

設定 -> Cordovaプラグインの管理 -> CLIバージョン

にある「Cordova アップグレード」用リンクから Cordova のバージョンをアップグレードすることができます。


# Monaca で ターゲット API レベル 28 に対応する その2

対象プロジェクトで使用している サードパーティー製Cordovaプラグイン等により、プロジェクトの Cordova バージョンをアップグレードすることが難しいケースもあります。

その場合は、対象プロジェクトの `config.xml` に `android-targetSdkVersion` 設定を行うことでも対応するkとができます。

```xml:設定例
<platform name="android">
  <preference name="android-targetSdkVersion" value="28" />
</platform>
```

注意点として、`android-targetSdkVersion` でターゲット API レベルを変更した場合は、ネイティブ部分の表示がこれまでと変わる可能性があります。


# おわりに

Cordova 9.0 では、Android プラットフォームのバージョンも更新されています。

Cordova 7.1 で使用されている Android プラットフォームと Cordova 9.0 で使用されている Android プラットフォームとでは、フォルダー構成等に仕様変更があるため、Cordova 7.1 で使用していた サードパーティー製 Cordova プラグインがビルドできない場合があります。

Monaca プロジェクトの Cordova バージョンを 9.0 へアップグレードする場合は、事前にプロジェクトで利用しているサードパーティー製 Cordova プラグインが対応しているか確認してください。
discordのmusicbotをVPSにdockerで立てた



自分用メモです。
詳しい方法は割愛。ググれば出てくると思います。

#環境
VPS ： WebARENA CentOS7

#方法

1. Discordの管理者ページに飛んで、botを作る
　参考：https://qiita.com/Trouble_SUM/items/9282160bc8e28b0034d1
　
　My Appから新しいAppを作る
　App内設定のBotから新しいBotを作る
　BotのTokenをメモ

2. Discord PC版から各種取ってくる
　
　Discordの設定で 開発者設定をON
　自分のID,テキストチャンネルのID、音声チャンネルのIDを取得

2. https://github.com/dmuth/musicbot-docker のREADMEに従ってdockerコンテナを作る

```
git clone https://github.com/dmuth/musicbot-docker.git
cd musicbot-docker
cp docker-compose.yml.example docker-compose.yml
vim docker-compose.yml # ここでファイルに必要な情報を書き込む
docker compose build && docker-compose up 
```

```docker-compose.yml
version: "3"

services:

  jukebox:

    build: .
    environment:

      # 
      # The bot token goes here.  
      #
      # How to create a bot: https://github.com/Just-Some-Bots/MusicBot/wiki/FAQ 
      # 
      TOKEN: BOT_TOKEN_GOES_HERE <- BotのToken

      #
      # The user who owns the bot.
      #
      OWNER_ID: OWNER_ID_GOES_HERE <- 自分のID

      #
      # The ID of the text channel that the bot joins
      #
      TEXT_CHANNEL: ID_OF_TEXT_CHANNEL_GOES_HERE <- 読み取らせるテキストチャンネルのID

      #
      # The voice channel that the bot jons
      #
      VOICE_CHANNEL: ID_OF_VOICE_CHANNEL_GOES_HERE <- 参加させるVoice channelのID

      #
      # Optional roles to grant to the bot
      #
      #GRANT_TO_ROLES: ROLES_TO_GRANT_TO_BOT_GO_HERE <- 特に何もなければこのまま
```

最初、起動するとBotの認証が済んでいないので、ログでエラーを吐かれます。

```
jukebox_1  | WARNING: Owner unknown, bot is not on any guilds.
jukebox_1  | WARNING: To make the bot join a guild, paste this link in your browser. 
jukebox_1  | Note: You should be logged into your main account and have 
jukebox_1  | manage server permissions on the guild you want the bot to join.
jukebox_1  |   https://discordapp.com/oauth2/authorize?client_id=***************&scope=bot&permissions=***************

```

このURLにブラウザでアクセスすると、認証画面が出るので認証します。

4. Docker-composeを再起動

```
docker-compose down
docker-compose up -d
```

これで完成

#主要コマンド

!help　-コマンドリスト表示
!play 　-URLの動画をキューに追加
!play <検索ワード>　-検索で最初に出た動画をキューに追加
!queue　-現在のキューに入った動画のリストを表示
!np　-現在再生中の曲を表示
!skip　-曲をスキップ
!shuffle　-キューの曲をシャッフル
!clear　-キューを空にします
!pause　-現在の曲の再生を一時停止します
!resume　-曲の再生を再開します
!volume [数字1〜100]　-音量変更、+-も可能
!summon　-botをVCに呼び出す.VCにいないと曲はかかりません
!disconnect　-VCからボットを切断します。
!restart　-管理者のみ、botの再起動

#使ってみた感じ
CPU使用率は数%とかなり易しめ
Apache Solr を OpenJDK 10 で動かすときのメモ

　現在Java11を使用していているのですが、Apache Solrを調査することになり、[Solr 8.1.1](https://lucene.apache.org/solr/downloads.html)を解凍後、```bin\solr.cmd start```としたら、NashornがJava11で非推奨となったと何行も表示しました。

メッセージの内容は、
```Warning: Nashorn engine is planned to be removed from a future JDK release```
です。

[OpenJDK10](https://jdk.java.net/archive/)をダウンロード後、適当なフォルダに解凍し、```%SOLR_HOME%\bin\solr.in.cmd```の25行付近にある```set SOLR_JAVA_HOME=```を設定し、無事エラー無く起動できるようになりました。

ちなみに、
```OpenJDK 64-Bit Server VM warning: JVM cannot use large page memory because it does not have enough privilege to lock pages in memory.```
が表示した場合、```%SOLR_HOME%\bin\solr.cmd```の1174行付近の```-XX:+UseLargePages```を```-XX:-UseLargePages```に変更し解消できました。
MacでPostgreSQL

#### インストール
```
$ brew install postgresql
```
#### サーバ起動
```bash
$ postgres -D /usr/local/var/postgres
```
#### クライアント起動
```bash
$ psql
psql: could not connect to server: No such file or directory
	Is the server running locally and accepting
	connections on Unix domain socket "/tmp/.s.PGSQL.5432"?
```
#### クライアントのバージョンを調べる
```bash
$ psql --version
psql (PostgreSQL) 11.3
```
#### クライアントからサーバ（Docker）に接続
```bash
$ psql -h localhost -U postgres
psql (11.3, server 10.7 (Debian 10.7-1.pgdg90+1))
Type "help" for help.

postgres=#
```
[Java] StringとStringBuilderのややこしいところ

# StringとStringBuilderの比較

```java

System.out.println(new StringBuilder("abc")); //=> abc
System.out.println(new StringBuilder("abc").toString()); //=> abc

System.out.println("abc".equals(new StringBuilder("abc"))); //=> false
System.out.println("abc".equals(new StringBuilder("abc").toString())); //=> true
```


StringとStringBuilderは継承や実装の関係になく、Stringクラスのequalsメソッドが以下のようにオーバーライドされているため。

```java

/**
     * Compares this string to the specified object.  The result is {@code
     * true} if and only if the argument is not {@code null} and is a {@code
     * String} object that represents the same sequence of characters as this
     * object.
     *
     * <p>For finer-grained String comparison, refer to
     * {@link java.text.Collator}.
     *
     * @param  anObject
     *         The object to compare this {@code String} against
     *
     * @return  {@code true} if the given object represents a {@code String}
     *          equivalent to this string, {@code false} otherwise
     *
     * @see  #compareTo(String)
     * @see  #equalsIgnoreCase(String)
     */
    public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String aString = (String)anObject;
            if (coder() == aString.coder()) {
                return isLatin1() ? StringLatin1.equals(value, aString.value)
                                  : StringUTF16.equals(value, aString.value);
            }
        }
        return false;
    }

```
neovimで現在開いているファイルの編集履歴確認

# はじめに
備忘録です。

# 環境

* neovim
* fugitive

が使用できる状態であること。

## コマンド

```
nvim init.vim
```
→neovimが開く。

```
:Gdiff HEAD~:./init.vim
```
→ひとつ前のコミット前のファイルが開く。
ヤンクとペーストが可能。

![qiita20190629.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117534/4511d681-5815-ad47-7fbe-188003a6b26e.jpeg)

## git difftoolを使う場合

neovimを開いていない場合には、

```
git difftool master:./init.vim master~:./init.vim
```

などとして開くことができるが、

* neovimのカレントディレクトリが移動すること（/tmpなどとなる）
* ファイル名が変化すること（ハッシュ値_init.vimなどとなる）

ことに注意する。
その際に必要なgitconfigは以下。

```
[diff]
    tool = nvimdiff
[difftool]
    prompt = false
[difftool "nvimdiff"]
    cmd = "nvim -d -c \"wincmd l\" -d \"$LOCAL\" \"$REMOTE\""
```

###参考
[Git の difftool と mergetool コマンドが Neovim を使うように設定してみた](https://yu8mada.com/2018/08/21/i-tried-configuring-for-git-s-difftool-and-mergetool-commands-to-use-neovim/)
カラムの型

カラムをすぐに忘れてしまうので、使ったものから追記していく完全な個人メモ帳です。

|型名|説明|例|
|:-----|:---|:---|
|string|文字列型|255文字まで|
|text|長い文字列|
|integer|整数|
|boolean|Boolean（真偽値）|
|float|浮動小数点数型|google maps APIの緯度、経度で使用|



## カラムの追加

```ターミナル:カラム追加用のマイグレーションファイル作成
$ rails g migration Addカラム名Toテーブル名 カラム名:型名
例　rails g migration AddLatitudeToMaps latitude:float
```

```.rb:生成されたマイグレーションファイル
class AddLatitudeToMaps < ActiveRecord::Migration[5.2]
  def change
    add_column :maps, :latitude, :float
    add_column :maps, :longitude, :float #ここでさらに追記してもOK
  end
end
```

```ターミナル:実行
$ bundle exec rake db:migrate
```

## カラムの削除
```ターミナル:カラム削除用のマイグレーションファイル作成
$ rails generate migration Removeカラム名Fromテーブル名 カラム名:型名
例）$ rails generate migration RemoveCommentFromMaps comment:text
```

```rb:作成されたマイグレーションファイル
class RemoveCommentFromMaps < ActiveRecord::Migration[5.2]
  def change
    remove_column :maps, :comment, :text
  end
end
```

```ターミナル:実行
$ bundle exec rake db:migrate
```

## カラムの型を変更する
```ターミナル:マイグレーションファイルを作成
$ rails g migration change_datatype_カラム名 _ of _ テーブル名
例）$ rails g migration change_datatype_recommended_of_maps
```
```rb:作成されたマイグレーションファイル
class ChangeDatatypeRecommended < ActiveRecord::Migration[5.2]
  def change
    change_column :maps, :recommended, :text #変更したいカラムの型を書く
  end
end
```

```ターミナル:実行
$ bundle exec rake db:migrate
```
svgで縁取り文字を描く

イラストレーターとかInkscapeとかそういうベクター画像編集用のアプリケーションを使わず、手軽に縁取り文字が描きたい。
とにかく楽がしたい。

# 結論
いきなりだけど、さっさと結論。
svgとcssのコラボで楽勝。
ただし、注意点もある。

**demo**
https://jsfiddle.net/0owv1yjd/

# 説明
上記の例では2つの方法を使っていますが、見ていただいた通りどちらの方法を取っても結果は同じです。
なんてったって、書いている内容は違えどやっていることは同じなので。

## 基本的な考え方
svgのtextで使えるstyleにはもともとアウトラインを描画するための「stroke」があります。
このstrokeの色と太さを定義すると文字のアウトラインを描画することができます。
しかし、このアウトラインを太くすると文字の内側をどんどん侵食していき、さらに太くするとstokeの色で塗りつぶされた状態になってしまいます。
黒で描画していた場合真っ黒の文字が現れてギョッとしてしまうことに。

```html:
<svg>
  <text x="10" y="50" style="stroke-width:10;stroke:#000;fill:#fff;">縁取り</text>
</svg>
```

縁を描画してから文字の塗りつぶしをしてくれれば良いのですが、塗りつぶしが優先されてしまうようです。
そのため、太い線で縁を描画すると真っ黒になってしまいます。

## 解決策
原因がわかれば対処のしようはあります。
先に縁を描画して、後から塗りつぶしをするように矯正すればよいはず。
これを実現するための方法として2つ紹介します。
どちらでも実現できるなら2つ目の方が楽でいい気はします。が、いつものようにIEとかEdgeとかは。。。どちらの方法も未確認です！
ちなみにまだCR（勧告候補）な仕様だそうです。

### 1つ目の方法
2つの文字列要素\<text>を重ねて、上に重なる方（つまり後で定義された方）は縁取りをせずに塗りつぶしだけをすれば
擬似的に縁取りをした後に塗りつぶしをしたかのように見せることができます。

```html:
<svg>
  <text x="10" y="50" style="stroke-width:10;stroke:#000;">縁取り</text>>
  <text x="10" y="50" paint-order="stroke" style="fill:#fff;">縁取り</text>
</svg>
```

### 2つ目の方法
text要素にpaint-order属性を使って、描画順を明示的に指定すると望んだ結果が得られる。

```html:
<svg>
  <text x="10" y="50" style="stroke-width:10;stroke:#000;fill:#fff;paint-order:stroke;">縁取り</text>
</svg>
```

どうやらモバイル版Chrome、2019/03/18時点では非対応だったみたいですが、2019/04/25時点では対応したみたい。
https://developer.mozilla.org/ja/docs/Web/CSS/paint-order
https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/paint-order

# 注意点
ここまでのに紹介した2つの方法ですが、どちらの方法を使った場合も縁取りがある程度の太さになるとフォントの種類や文字によって縁取り線が突き抜けてしまったり、交差してしまったりして残念な感じになります。
これも綺麗に解決！しようとするとさすがにIllustratorとかそういうアプリケーションのお世話になってください。
**ただし**、少し犠牲を払ってもよければ対策はあります。

## 突き抜け、交差対策
`stroke-linejoin:round;`
要は縁取り線の角を丸くすることで飛び出してしまう部分を内側に入れ込んでしまい、見えなくするという方法です。
角丸線で描画することになるので、文字全体がやわらかい雰囲気になってしまうので、パキッとした縁取り文字を使いたいという場合は、縁取りの太さを抑えるか、フォントを変更する。あるいはIllustratorとかでがんばる。
その辺をやってください。
やわらか雰囲気で問題ないのであれば、stroke-linejoinにround指定。これがおすすめ。
プログラム初心者のためのC#入門 #12 カプセル化 

# #12 カプセル化
カプセル化というのは，不要な情報を隠すという考え方で，プログラミングに限らず，様々な分野においても重要です．まずは現実の世界でのカプセル化を説明しましょう．
##現実の世界でのカプセル化
現実の世界では様々なモノがカプセル化されています．例えば，電子機器などは内部の状態(回路やプログラムなど)を知らなくてもボタン一つで動かすことができるものが多いです．逆に，回路が丸出しで，ボタンの代わりに利用者が回路を自分で繋ぎ直したり，プログラムを書き直したりするような電子機器があれば，利用者はそれを使うために専門的な知識を身に着ける必要が出てきます．
また，ボタンで簡単に扱える電子機器を作ったとしても，デバッグ用のボタンなど，利用者が使う必要のない余計な機能などがあると，利用者は混乱するでしょう．そうならないためにもカプセル化というものが必要になってきます．
##プログラムでのカプセル化
```EncapsulationSample.cs
class VendingMachine
{
    private int waterStock;
    private int coffeeStock;
    private int teaStock;
    private int juiceStock;

    public VendingMachine()
    {
        waterStock = 15;
        coffeeStock = 10;
        teaStock = 10;
        juiceStock = 10;
    }

    public void DisplayStatus()
    {
        Console.WriteLine("Water" + (waterStock == 0 ? " sold out" : string.Empty));
        Console.WriteLine("Coffee" + (coffeeStock == 0 ? " sold out" : string.Empty));
        Console.WriteLine("Tea" + (teaStock == 0 ? " sold out" : string.Empty));
        Console.WriteLine("Juice" + (juiceStock == 0 ? " sold out" : string.Empty));
    }

    public void GetDrink(string drink)
    {
        switch (drink)
        {
            case "Water":
                if (waterStock == 0) return;
                Console.WriteLine("You got water.");
                waterStock--;
                break;
            case "Coffee":
                if (coffeeStock == 0) return;
                Console.WriteLine("You got coffee.");
                coffeeStock--;
                break;
            case "Tea":
                if (teaStock == 0) return;
                Console.WriteLine("You got tea.");
                teaStock--;
                break;
            case "Juice":
                if (juiceStock == 0) return;
                Console.WriteLine("You got juice.");
                juiceStock--;
                break;
            default:
                Console.WriteLine("Error.");
                break;
        }
    }
}
```
自動販売機のようなものを作ってみました．利用者が残りの個数を気にする必要はないので，売り切れているかどうかだけを知ることができる仕様です．
さらに，利用者が補充することがないようにメンバ変数には`private`(クラス外からアクセス不可)修飾子が付いています．

##アクセス修飾子
C#で使えるアクセス修飾子は以下の4つです．

|修飾子|詳細|
|:--|:--|
|public|クラス外部からもアクセス可|
|internal|同じアセンブリ内のクラス外部からはアクセス可|
|protected|派生クラスを除くクラス外部からのアクセス不可|
|private|クラス外部からはアクセス不可|
また，`internal`と`protected`は`internal protected`のように併用することが可能です．

~~次回はオブジェクト指向のまとめをします．~~
すみません．まとめたら大した内容にならなかったためやめました．
次はGenericsとか関数型とかやろうと思います．
フロントエンドWebのDockerコンテナ構築（Amazon Linux × Apache × PHP 5.6）

# 概要
フロントWebページのDockerコンテナをAmazon Linuxのベースイメージ に、ApacheとPHP 5.6をインストールし作成

# 背景
・AWSのEC2に実装するフロントページのローカル開発環境として作成
・PHPのパッケージ管理の為Composerをインストール
・フロントページから画像をアップロード、保存する為imagicをインストール
・PHPは、旧基盤で使っていたモジュールをそのまま流用する為一旦5.6

# ディレクトリ構成
```
front_web_container
├ config
│ ├ ca
│ │ ├ server.crt
│ │ └ server.csr
│ ├ httpd.conf
│ ├ php.ini
│ └ virtual-host.conf
├ src
└ Dockerfile
```
# Dockerfile
```dockerfile
# Create Apache & PHP 5.6 Container.
FROM amazonlinux:2018.03.0.20190212

# PHP 5.6
RUN yum -y install \
    php56-devel \
    php56-gd.x86_64 \
    php56-mbstring.x86_64 \
    php56-mysqlnd \
    php56-opcache \
    php56-pdo \
    php56-pecl-apcu \
    php56-pecl-imagick.x86_64 \
    uuid-php56 \
    libxml2 \
    libjpeg \
    libpng \
    vim 

# Apache(httpd.2.4)
RUN yum -y install httpd24 mod24_ssl

# COPY PHP Modules.
COPY ./src /var/www/html/

# Set httpd
COPY ./config/httpd.conf /etc/httpd/conf/httpd.conf
COPY ./config/ca /etc/httpd/conf/ca
COPY ./config/virtual-host.conf /etc/httpd/conf/virtual-host.conf

# Set php.ini
COPY ./config/php.ini /etc/php-5.6.ini

# Install Composer
ENV COMPOSER_ALLOW_SUPERUSER 1
ENV COMPOSER_NO_INTERACTION 1

WORKDIR /usr/local/bin
RUN curl -sS https://getcomposer.org/installer | php

EXPOSE 443
EXPOSE 80

CMD /usr/sbin/httpd -D FOREGROUND

```


# 設定ファイル
php.ini：つどつど設定するのがめんどーなので、編集したファイルを用意しておく。
httpd.conf：つどつど設定するのがめんどーなので、編集したファイルを用意しておく。
virtual-host.conf：VirtualHostの設定
証明書：オレオレ証明書作成

# コンテナ実行
```shell
# ビルド、イメージ作成
cd /path/to/front_web_container
docker build -t front_web_container .
```

```shell
# イメージ確認
$ docker images
REPOSITORY                                TAG                  IMAGE ID            CREATED             SIZE
front_web_container                       latest               36624ad88042        14 seconds ago      561MB
```

```shell
# コンテナ起動
docker run -d -p 8080:80 front_web_container
```

```shell
# コンテナ起動確認
$ docker ps
CONTAINER ID        IMAGE                 COMMAND                  CREATED             STATUS              PORTS                           NAMES
594b3008f14d        front_web_container   "/bin/sh -c '/usr/sb…"   6 seconds ago       Up 5 seconds        443/tcp, 0.0.0.0:8080->80/tcp   unruffled_cray
```

※ブラウザで↓を打ち込み表示を確認
http://127.0.0.1:8080/
どうしちゃったのpython(その1:ここは、syntax errorでしょう)

#目的
ちょっと、python(python3)で不思議な動きをみたので、
情報共有。

ちなみに、なんの実害もありません。
（あえて、提示しているのは、少しでも、理解を深めて、役立つことにどこかで役立たせるためです。）


##不思議な現象

なぜ、「あ」とか「い」が許されて、計算までできて、
10abc、まあ、これは、仕様上NGですが、許されない？？？
文字コードのアヤですか？
ワタシは、いま、答え、わかってません。

```
>>>
>>> あ = 3
>>> い = 4
>>> あ + い
7
>>>
>>>
>>> 10abc = 3
  File "<stdin>", line 1
    10abc = 3
        ^
SyntaxError: invalid syntax
>>>
>>>
```

#仕様通りでした、すみません

以下のリファレンスによると
https://docs.python.org/ja/3/reference/lexical_analysis.html#identifiers

>ASCII 範囲 (U+0001..U+007F) 内では、識別子として有効な文字は Python 2.x におけるものと同じです。大文字と小文字の A から Z、アンダースコア _、先頭の文字を除く数字 0 から 9 です。
Python 3.0 は、さらに ASCII 範囲外から文字を導入します (PEP 3131 を参照してください。)。これらの文字については、分類は unicodedata モジュールに含まれる Unicode Character Database の版を使います。
識別子の長さには制限がありません。大小文字は区別されます。

**すみません、python3では、使っていいみたいです。**

ちなみに、全角のダブルクォーテーションとかは、ダメみたいです。

```
>>>
>>> ”あ” = 3
  File "<stdin>", line 1
    ”あ” = 3
      ^
SyntaxError: invalid character in identifier
>>>
```




#まとめ
別の内容を記載しようと思って、作業していたら、
変な現象に出会ったので、情報共有。
~~ユニコードマジック？？？
もしかすると、スクリプトとかではよくあるのかもしれません。。。スクリプト言語しらないので、ワタシだけが衝撃を受けているのかも。。。。~~

すみません、python3では、仕様的にＯＫらしいです。


#関連（本人）

[pythonをストレスなく使う！（generatorに詳しくなる。since1975らしい。)](https://qiita.com/enoughspacefor/items/524a76fcde2610b9da8a)
[pythonをストレスなく使う！（Pythonでは、すべてがオブジェクトとして実装されている)](https://qiita.com/enoughspacefor/items/0c6118da4c228226a65f)
[pythonをストレスなく使う！（Pylintに寄り添う)](https://qiita.com/enoughspacefor/items/df692b27bb58ca1ffa1d)
[pythonをストレスなく使う！（ExpressionとStatement)](https://qiita.com/enoughspacefor/items/1a11f553c265a2c703f2)
[英語と日本語、両方使ってPythonを丁寧に学ぶ。](https://qiita.com/enoughspacefor/items/d4b49747773e2d0285f9)

#今後
コメントなどあれば、お願いします。:candy:
勉強します、、、、
CentOS 7の仮想マシンがDVDに入らなくなった問題を解決しました。

VirtualBoxのCentOS 7仮想マシンを使って遊んでいたのですが、他人に渡す必要がありエクスポートしたところ、DVDに入らないサイズになってしまいました。

2枚以上のDVDに分けて渡すという手もありますが、ぜひ1枚で渡したくて方法を調べました。結果、5.7GB → 2.2GBまで縮小することができました。

## 実行前ゲストOS（ご参考）

```txt:/etc/fstab
/dev/mapper/centos-root /                       xfs     defaults        0 0
/dev/mapper/centos-home /home                   xfs     defaults        0 0
/dev/mapper/centos-swap swap                    swap    defaults        0 0
```

以前はzerofreeコマンドを使っていましたが、[参考サイト](https://www.centos.org/forums/viewtopic.php?t=59546)によると、zerofreeはxfsに対応していないらしく、ddコマンドを使いました。

```txt:
ファイルシス            1M-ブロック   使用 使用可 使用% マウント位置
/dev/mapper/centos-root       51175   4552  46624    9% /
devtmpfs                       1880      0   1880    0% /dev
tmpfs                          1896      0   1896    0% /dev/shm
tmpfs                          1896      9   1887    1% /run
tmpfs                          1896      0   1896    0% /sys/fs/cgroup
/dev/sda1                      1014    178    837   18% /boot
/dev/mapper/centos-home       74836     55  74782    1% /home
tmpfs                           380      1    380    1% /run/user/1000

```

# 仮想マシンをエクスポートしたときのサイズを小さくする方法

## 無駄ファイルの削除

私は以下のように要らないファイルを消しておきました。（人によって要らないファイルは違うと思います）。

```bash:
$ sudo yum autoremove
$ sudo yum clean all
$ sudo package-cleanup --oldkernels --count=1 -y
$ rm $HOME/Downloads/*
```

## ゼロ埋め

```
# 念の為シングルユーザモードで
$ sudo systemctl isolate rescue.target
# 以下、root作業
# export LANG=C
# dd if=/dev/zero of=/tmp/empty.dd bs=1048576; rm /tmp/empty.dd
# dd if=/dev/zero of=/home/empty.dd bs=1048576; rm /home/empty.dd
# poweroff
```

## トリム（？）

<font color="gray">※ひょっとするとこの工程は要らないかもしれません。</font>

[NHC](http://euee.web.fc2.com/tool/nhc.html#u2)でトリムします。

ディスク.vdiサイズが、8,513,388,544 bytesから、5,040,504,832 bytesになりました。

## 縮小後

縮小前のovaは、5,656,820,736 bytesありましたが、縮小処理を施しておくと、2,223,650,304 bytesになりました。

# 環境と条件
  * ホストOS： Ubunt 18.04
  * ゲストOS： CentOS 7.4
  * VirtualBox: 5.2.18_Ubuntur123745

# 参考

 * [仮想マシンハードディスクイメージ変換(convert)ツール](http://euee.web.fc2.com/tool/nhc.html#u2)
 * [How to run zerofree on Centos7](https://www.centos.org/forums/viewtopic.php?t=59546)
python3 matplotlibの自分用使い方まとめ

matplotlibの使い方について自分用のメモを記載


>windowを非表示にしたとき

```
import matplotlib
matplotlib.use('Agg') # pyplotをimportする前に記載
import matplotlib.pyplot as plt
```

>figを保存したいとき

```
# save as png
plt.savefig('figure.png') 
```

> Jupyter Notebookでセル内表示したいとき
```
 %matplotlib notebook
```
基本情報技術者

私は、ソフトウェア営業をしております。
基本情報や応用情報を取得し、汎用的なコンピューターサイエンスの知識を身に着けます。
進む道（例えば、DB系とかネットワーク系とか）の営業の覚悟できたらベンダー資格取ります。（営業だけど）
あと2年間C言語もやって、アプリ等等作りたいな
営業なのにすごいじゃん
error少しまとめ


```
Cannot have a has_many :through association 'User#~~~' which goes through 'User#~~~' before the through association is defined.
```

→has_many :中間テーブル名　より　has_many :○◯　through :中間テーブル名　が先に来てしまっているエラー

```
AugumentError in ~~~
```

→渡された引数と期待される引数の数が不一致から起こるエラー

```
Mysql2::Error: Cannot delete or update a parent row: a foreign key constraint fails
```

→外部キーが設定されているデータを削除出来ず起こるエラー
has_many：（オブジェクト名）にdependent: :destroyを追加するとオブジェクトに基づく他のオブジェクトも一緒に削除される

```
Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
```

→sudo service mysqld startでMySQLを起動させればOK

```
SyntaxError in 
```

→書き方間違いによる構文エラー
例：syntax error, unexpected tIDENTIFIER, expecting ')'
半角スペースとすべき所が全角スペースになっている。

```
ActionController::UrlGenerationError in 
```
→呼び出すアクションが違う。routingを確認すべし。
Discordの音楽BOTをDockerで立ち上げてみた

# はじめに
Discordの音楽Botを自作して自分好みにカスタマイズしてみたくて作りました。
pythonかrubyかが作りやすそうで、深く考えずrubyを選んでます。pythonでも同じようにできると思います。rubyでdiscord bot開発するときの[discordrb](https://github.com/meew0/discordrb)を使います。
macで開発時は特に気にならなかったですが、運用するときにrubyインストールしたりするの面倒だしバージョン云々もめんどくさい！だからDocker化しちゃおうといった具合でDockerに乗せました。

# 開発環境
- macOS High Sierra v10.13.6
- Docker version 18.09.2

## ファイル構成
```
/workspace/discord_bot
               ├── data/
               |     ├── music1.mp3
               |     └── music2.mp3
               ├── .env
               ├── Dockerfile
               ├── Gemfile
               ├── Gemfile.lock
               └── sample.rb
```

# 準備
- Dockerの導入
- DISCORDのBOT登録、APIキー取得

# コード
APIキーは.envファイルに書いてやります。

```:.env
CLIENT_ID="xxx"
CLIENT_SECRET="xxx"
BOT_TOKEN="xxx"
```

Dockerfileに起こすときに`gem install ~~~`ってやるより`bundle install`がスマートなのでGemfile書きます。

```:Gemfile
source "https://rubygems.org"
gem 'dotenv'
gem 'discordrb'
```

あとは実行するコードです。
もっと良いコードになるのはわかってます許してください。

```ruby:sample.rb
require 'dotenv'
require 'discordrb'

Dotenv.load
TOKEN = ENV['BOT_TOKEN']
CLIENT_ID = ENV['CLIENT_ID']

bot = Discordrb::Commands::CommandBot.new(
  token: TOKEN,
  client_id: CLIENT_ID,
  prefix: ';',
)

bot.command :ping do |event|
  "pong!"
end

bot.command :connect do |event|
  channel = event.user.voice_channel
  next "voiceちゃんねるに入ってから実行してください。" unless channel
  bot.voice_connect(channel)
  "#{channel.name}に入りました。"
end

bot.command :play do |event|
  music = "/app/data/music1.mp3"
  event.voice.play_file(music)
end

bot.run
```

## 実行(ruby環境があれば)
とりあえず動かしてみました。
`$ ruby sample.rb`
![AsZYiibYmpVy8051561796341_1561796358.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233730/296da78f-b033-9ca1-e92a-b2d2804b7b3b.png)
ちゃんと動いています。

# コンテナ化
Dockerで実行できるようにします。
Docker初学者なので全然間違ってるかもしれません。

## Dockerfile
```Docker:Dockerfile
FROM ruby:2.6.3
RUN apt-get update && apt-get install -y \
        libsodium-dev \
        libopus-dev \
        ffmpeg
RUN gem install bundler
RUN mkdir /app
WORKDIR /app

COPY ./* /app/
RUN bundle install
```

## 実行
- Build  
`$ docker build -t discord_bot .`
- Run  
`$ docker run -i -t --rm discord_bot ruby /app/sample.rb`

**PONG!**
# おわりに
connectはいろんなところに書いてあるんですけどdisconnect無いんですか？そんなわけないですよねソースを読みきれてないです。
最初見てたサイトが`libopus0-dev`になってて、「そんなん無い！」って言われて`libopus0`にしたり右往左往しましたが、`libopus-dev`が正解のようです。
開発はmacで、実行はラズパイにしてみようかといったところです。


# 参考サイト
- https://github.com/meew0/discordrb
  - https://github.com/meew0/discordrb/wiki/Voice-sending#troubleshooting
- https://trap.jp/post/264/
- http://saku.hatenadiary.com/entry/2016/09/22/110713
- https://qiita.com/m3y/items/bffd2c1f3727105f4886
ActiveModel::Serializersでundefined method `read_attribute_for_serialization' 

## ActiveModel::Serializersでエラー
json出力するActiveModel::Serializersで以下のエラーが出ることがあります。たまに出るやつで、調べてもあまり情報がなかったので、serializerのソースを読んで原因究明してみました。

```
undefined method `read_attribute_for_serialization' 
```

## 原因
getterがないためです。このエラーはモデルに紐づかないデータをjson出力するときに出ます。

例

```ruby
# コントローラ
# jsonを返すメソッド
def success_serializer
  # hashオブジェクトをjson出力する
  hoge_huga = {
    hoge: 'hogehoge',
    huga: 'hugahuga'
  }
  render json: ActiveModelSerializers::SerializableResource.new(
                 hoge_huga,
                 serializer: HogeSerializer
               )
end
```
```ruby
# シリアライザー
class HogeSerializer < ActiveModel::Serializer
attributes :hoge, :huga
def hoge
  object[:hoge]
end
# hugaのgetterはない
```

Modelの継承関係は以下。

```
XXXModel < ApplicationRecord
```
```
ApplicationRecord < ActiveRecord::Base
```

そして、ActiveRecord::BaseはSerializationモジュールをincludeしている。

Serializationで定義しているread_attribute_for_serializationはModelオブジェクトの属性値を取得するメソッド。以下のように定義して属性値を取得している。

```
 alias :read_attribute_for_serialization :send
```

つまり作成したSerializerにModelオブジェクトが渡らない場合はread_attribute_for_serializationが定義されていないため、getterを定義していないとエラーとなる。
HX711 ロードセルADコンバータを80Hzで動作させる

### 概要

- ロードセルの信号を取り出すのに便利な24bitのA/DコンバータとしてはHX711がポピュラー
- HX711はサンプリングレートとして10Hzと80Hzの切り替えが可能
- ある種の製品ではそれがとても簡単に設定できることを確認した

### HX711 A/D Converter

ロードセルの信号はとても微弱で不安定なので、その読み出しには安定したアンプと A/D コンバータが必要です。HX711 はそのために必要な機能をワンチップにまとめており、これだけで一定速度でのデータサンプリングが可能で、また安価です。

そのため[ロードセルを使った簡易スケールの製作](http://barcelona.lomo.jp/wp/?p=23) など、HX711を使ったロードセルの値を読み出す作例がたくさんネットにあります。

ところでHX711は、そのサンプリングレートを 10Hz と 80Hz で切り替えられるようになっています。

**HX711 データシート** [24-Bit Analog-to-Digital Converter (ADC) for Weigh Scales](http://akizukidenshi.com/download/ds/avia/hx711.pdf) 

このデータシートの2ページめ、Table 1 の pin 15 - RATE に注目してください。ここを Low level にすると 10Hz、High Level にすると 80Hz でのサンプリングになるとあります。ところが多くのボードはこのピンをこのLow Levelに固定的に配線しており、つまり10Hzでしか動作しないようにされています。
例えばこんな感じ。

- 秋月電子の [HX711使用 ロードセル用ADコンバータモジュール](http://akizukidenshi.com/catalog/g/gK-12370/) (2019/6現在350円) は10Hz に固定。
- 上に引用した[作例](http://barcelona.lomo.jp/wp/?p=23) で利用された[ボード](https://www.amazon.com/gp/product/B010FG9RXO/) も10Hzに固定。この作者氏はICのピンを持ち上げ再配線して 80Hz に高速化。慣れた人でないと難しそう。
- スイッチサイエンスの [HX711搭載 ロードセルアンプモジュール](https://www.switch-science.com/catalog/2848/) は 10/80Hz を選択可能。同ページの「回路図」にパターンを切ると80Hzになる記述あり。ただちょっと高い (2019/6現在1,243円) 。

ところが偶然私が買った安価なボードは、とても簡単に10/80Hzの切り替えが可能でした。つまり80Hzでサンプリングしたい人はこの製品を買うのがお勧めです。以下に詳述します。

### KKHMF のHX711ボードを80Hzにする

KKHMF の HX711モジュールが2019/6現在、145円で[Amazon](](https://www.amazon.co.jp/dp/B014VVPYUE/)) にて販売されています。すごい。

![module.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132859/4100582a-f53d-2f81-dcb8-c270ee588eed.jpeg)

この製品は 10Hz サンプリングに固定されているように見える、のですが、基板（右上部分）を良く見ると「10Hz」「80Hz」のプリントがあり、10Hz 側に 0Ω抵抗が付いていることがわかります。

![module_front.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132859/d2bfda9f-fd8e-dcbc-e665-bc9d3cd1f0f9.jpeg)

基板裏側の写真を見ると、表側の HX711 の pin 15 がすぐビアに消え、ぐるっと裏を回ってすぐ上にある0Ω抵抗の左側のビアに出てきているのが分かるでしょう。

![module_back.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132859/46efd298-7ed1-7480-940d-8a9b75778333.jpeg)

念のためにテスターで当たって 0Ω抵抗の右側は GND につながっており、80Hz の "z" のすぐ右のパッド（ランド）は pin 16 つまり VCC につながれていることを確認しました。

HX711 は pin 15 が RATE で、ここが Low だと 10Hz、High だと 80Hz ですから、つまりこの 0Ωを外して、80Hz 側のパターンに何かしら適当な抵抗をつけてやれば 80Hz でサンプリングするようになることがわかります。

というわけで、とりあえずそのあたりに転がっていたチップ抵抗を拾って80Hz側につけてみました。（下手くそ御免。。）

![module_mod.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132859/529afccf-ca3a-392e-9108-03ffd1843987.jpeg)

これで正しく80Hz でサンプリングするようになりました。良かった良かった。
VM環境にPostgresql導入～起動まで

## 使用したOS
```vim

[vagrant@localhost data]$ cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)
```
## インストール実行
```vim

yum -y install postgresql-server
```

## データベース初期化
```vim

postgresql-setup initdb
```
## DB起動停止ステータス確認
```vim
systemctl status postgresql
```

## DB起動
```vim
systemctl start postgresql
```

## 自動起動設定

```vim

systemctl enable postgresql
```

## 参考
[https://www.hack-log.net/entry/centos-postgresql-install/](https://www.hack-log.net/entry/centos-postgresql-install/)
[https://qiita.com/LowSE01/items/84af05449f96dedd0edc](https://qiita.com/LowSE01/items/84af05449f96dedd0edc)
[https://wiki.postgresql.org/wiki/Developer_FAQ/ja](https://wiki.postgresql.org/wiki/Developer_FAQ/ja)
[https://qiita.com/uhooi/items/44ed9370740c7521dce4](https://qiita.com/uhooi/items/44ed9370740c7521dce4)
[https://qiita.com/tomlla/items/9fa2feab1b9bd8749584](https://qiita.com/tomlla/items/9fa2feab1b9bd8749584)
PHPでデザインする方法

こんにちは！
[未来電子テクノロジー](https://www.miraidenshi-tech.jp/)でインターンをしている西尾です！

今回は、PHPの中にCSSの要素(背景色を設定したり、中央ぞろえしたり、、、)を組み合わせる方法についてご紹介します！


#中央ぞろえ

```
echo "<center>表示したい文字</center>";
```

PHPが生成しているのはHTMLなので、書式はHTMKを使用します。

#背景色

```<?php
echo '<span style="background-color:#fff000">表示したい文字</span> ';
?>
```
background-colorのみでの指定はCSSなので、style属性に指定するのがポイントです。


このように、PHPの中にCSSの要素を埋め込むこともできますが、CSSを別で作って読み込む方が早い場合もありますので、時と場合に応じて使い分けてみてください。


#まとめ
今回は、PHPの中で背景色をしていしたり、中央ぞろえにしたりCSS的な要素を加える方法についてご紹介しました。

PHPを作ったけれどデザインも加えたい、という方はぜひ参考にしてみてくださいね。
【Android】HTMLを使ってTextViewの一部を装飾する

# strings.xmlにHTMLを設定する
strings.xmlでは一部のHTML要素がサポートされています。
[String resources  |  Android Developers](https://developer.android.com/guide/topics/resources/string-resource.html#StylingWithHTML)

```xml:strings.xml

<resources>
    <string name="text_1"><b>太字</b>にします</string>
    <string name="text_2"><i>斜体</i>にします</string>
    <string name="text_3"><u>下線</u>を引きます</string>
    <string name="text_4"><font color="#ffaa00">赤文字</font>にします</string>
</resources>

```

Android Developersの日本語版で紹介されている要素は上記3つだけなのですが、
実は英語版ではそれ以外の要素も紹介されており、意外にたくさんの要素が使えることがわかります。
<img width="863" alt="スクリーンショット 2019-06-29 16.46.10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112818/88983fad-aa35-f42d-3b6e-2587a31d9199.png">

## 注意点
* 直接レイアウトファイルにHTMLを設定することはできず、strings.xmlを使う必要があります。
* `fromHtml(String)`などを使ってコード内で設定する場合はエスケープ処理をする必要がありますが、今回のようにレイアウトファイルから呼び出す場合は必要ありません。
* 改行は`\n`でできます。
* 文字色の指定にcolors.xmlでの定義（`@color/red`など）は使えず、カラーコードを用いる必要があります。

# レイアウトファイルから呼び出す
今回は単純にレイアウトファイルから呼び出して使いたかったので、下記のようにTextViewに定義します。

```xml
android:text="@string/text_1"
```

これだけで簡単にTextViewの一部を装飾することができました。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112818/6c503e16-f741-5498-340a-8ef0d4bd9bc0.png" width="320"/>
インクリメンタルサーチの操作メモ

#インクリメンタルサーチの操作メモ

Ctrl-r: インクリメンタルサーチモードに入る

### インクリメンタルサーチモードでの操作

* Ctrl-r: さらに前の検索結果へ
* Enter: 検索結果を実行
* esc: インクリメンタルサーチモードを終了してコマンドラインに表示
* Ctrl-g: インクリメンタルサーチモードを終了