OmniAICreator/Qiita-1.07M huggingface dataset:
データベースをDockerで環境構築 

# データベースをDockerで環境構築 

## Docker の導入

確認

```
$ docker -v
Docker version 18.09.2, build 6247962
```

バージョン情報が表示されれば、導入は完了している。

docker command not found

と表示されるようであれば、以下の手順で導入する。

```
$ brew install docker
$ brew cask install docker
```

確認する。

```
$ docker -v
```

Docker導入完了！！！


## MySQL の導入

インストール前に、まずはストップさせる。

```
$ sudo service mysql.server stop
```

インストールしていく。

```
$ brew install mysql@5.7
$ brew link --overwrite mysql@5.7 --force
```

確認

```
$ mysql --version
mysql  Ver 14.14 Distrib 5.7.25, for osx10.14 (x86_64) using  EditLine wrapper
```


## DockerとMySQLの連携

* docker-compose.ymlファイルの作成

**Rails アプリケーション直下（Gemfile とかと同じ階層）**に docker-compose.yml というファイルを作成し、以下のように修正する。

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

services:
  database:
    restart: always
    image: mysql:latest
    ports:
      - 3306:3306
    command: --default-authentication-plugin=mysql_native_password
    volumes:
      - mysql-datavolume:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: root

volumes:
  mysql-datavolume:
    driver: local
```

ここでは、MySQL の最新版を、ログインパスワードは root で導入するように設定している。

ファイルを作ったら、以下のコマンドを実行する。

```
$ docker-compose build
```

完了したら、docker を立ち上げて、mysql で接続できるか確認する。まずは、docker を -d オプションを渡してバックグラウンドで起動させる。

```
$ docker-compose up -d
Creating network "hello_world_rails_default" with the default driver
Creating hello_world_rails_database_1 ... done
```

あとは、mysql での接続をする。パスワードは、docker-compose.yml で設定した root。

```
$ mysql -u root -p -h 127.0.0.1

中略

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql >
```

このように、MySQL が立ち上がれば OK!!!
exit; で、抜ける。


## RailsにMySQL設定を反映させる


**database.yml の修正**

```ruby:database.yml
default: &default
  adapter: mysql2
  encoding: utf8
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  host: 127.0.0.1
  username: root
  password: root

development:
  <<: *default
  database: hello_world_rails_development

test:
  <<: *default
  database: hello_world_rails_test

production:
  <<: *default
  database: hello_world_rails_production
```

adapter を mysql2に、host を 127.0.0.1 に、username と password を root に設定している。

**Gemfile の修正**

```ruby:Gemfile
# Use sqlite3 as the database for Active Record
- gem 'sqlite3'
+ # gem 'sqlite3'
+ gem 'mysql2'
```

修正し終わったら保存し、bundle install する。

```
$ bundle install
```

しかし、失敗したら下記のコマンドを入力してから再度 bundle install

```
$ bundle config --local build.mysql2 "--with-ldflags=-L/usr/local/opt/openssl/lib"
```

Docker構築環境完了！！！！
WebAPIから取得したデータをブラウザに表示させてみた

わんわんお！
犬も猫も大好きな、プログラミング初心者オジサンです。

今回はjavascriptでWebAPIの使い方を学ぶため、こちらのAPI（ https://dog.ceo/dog-api/ ）を利用してサンプルコードを書いてみました。
「わんわんお？」というボタンをクリックすると、ボタンの下に犬種と画像が表示されるようにしています。

##1.準備（HTMLとCSS）
APIから取得したデータを入れるハコとして、下記のとおりhtmlを書きました。

```html
<!DOCTYPE html> 
<html lang="ja">
<head>
  <meta charset="utf-8">
  <title>わんわんお</title>
  <link rel="stylesheet" href="css/styles.css">
</head>
<body>
  <button id='click'>わんわんお？</button>
  <!-- APIから取得した犬種と画像を表示する -->
  <div>犬種：<span id='type'></div>
  <div>画像：<img id='image'></div>
  <script src="js/main.js"></script>
</body>
</html>
```
なお、APIに登録されている画像サイズが大きいので、画像の高さが300pxになるようCSSで調整しています。

```css
#image {
    height: 300px;
}
```

##2. fetchメソッドで動かす
データ取得はfetchメソッドでやっています。
コードの型は、MDNで紹介されているものをそのまま流用しています。

```javascript
    const button = document.getElementById('click');
    const type = document.getElementById('type');
    const image = document.getElementById('image');
    // ボタンをクリックしたらイベント発動
    button.addEventListener('click', () => {
        fetch('https://dog.ceo/api/breeds/image/random') // APIのURL
        .then(response => {
            return response.json();
        })
        .then(myJson => {
            // imgタグに取得したURL画像を入れる
            image.src = myJson['message'];
            // 取得したURLをスラッシュ記号で分割し、犬種を表した要素を取得する
            const breed = myJson['message'].split('/')[4];
            type.innerText = breed;
            button.innerText = 'わんわんお！'
        });
    });
```
こちらのAPIでは、次のようにjsonが構成されていました。

```json
{
    "status": "success",
    "message": "https://images.dog.ceo/breeds/greyhound-italian/n02091032_12144.jpg"
}
```
messageに犬の画像が入っているので、imgタグのsrcプロパティにmessageを入れればブラウザに写真が表示されるようになります。
また、取得した画像URLをスラッシュ記号で分割すると、5番目（indexだと4）に犬種が登録されているので、splitで配列化して要素を取得すれば、犬種をブラウザ上に表示させることができます。

##3. 最後に
今回のAPIはシンプルだったので、サンプルコードを作る練習にはもってこいでした。
今後レベルアップできたら、googleのAPIなどにもチャレンジしていこうと思います。
numpy.dot(a, b, out = )の使い方（自分用）

# 解決法だけ見たい人

```python:解決法
import numpy as np

a = np.arange(4).reshape((2, 2))
b = np.arange(5,9).reshape((2, 2))
print(a)
print(b)

c = np.zeros((2, 2), dtype = int)
np.dot(a, b, out = c)
print(c)
#出力結果
[[0 1]
 [2 3]]

[[5 6]
 [7 8]]

[[ 7  8]
 [31 36]]
```
# 経緯

```python:コード
import numpy as np

a = np.arange(4).reshape((2, 2))
b = np.arange(5,9).reshape((2, 2))

c = zeros((2, 2))
np.dot(a, b, out = c)

```
dotを使ったコードを実行したところ，このようなエラーが出たので，臨時的な解決法をメモします．

```python:実行エラー
output array is not acceptable (must have the right type, nr dimensions, and be a C-Array)
```
出力先の二次元配列が正しくない型，もしくは行と列の数が間違っている，または，C-Array(numpy内の配列？)ではない．とのこと．

行と列の数はあってるし，numpy.array使っているので，後ろ二つは違う．となると，一番前の型が正しくないと考えた．

np.zeros()は，デフォルトではfloat型になっているようなので，int型に変換するだけでいいらしい．
実際にやってみると，解決した．

```python:コード
import numpy as np

a = np.arange(4).reshape((2, 2))
b = np.arange(5,9).reshape((2, 2))

c = np.zeros((2, 2), dtype = int)
c = np.dot(a, b, out = c)
print(c)
#出力結果
[[ 7  8]
 [31 36]]
```
</br>
</br>
</br>
</br>
</br>
</br>
</br>
</br>
</br>
</br>
# 補足
これくらい簡単な処理ならば，outいらないんですけどね．
使い方のメモです．

```python:これでもOK
import numpy as np

a = np.arange(4).reshape((2, 2))
b = np.arange(5,9).reshape((2, 2))

c = np.dot(a, b)
```

参考：
(https://github.com/numpy/numpy/issues/7124)
(https://docs.scipy.org/doc/numpy/reference/generated/numpy.zeros.html)
Oracleマスター Silver 12ｃ DBaaSの概要

Oracleマスター Silver 12ｃ試験において出題されるDBaaSについてまとめてみた。

とにかく情報が少ない、通称黒本と呼ばれる参考書にも載っていないため受験者の記事と解説動画の紹介で概要をまとめる。
　参考にさせていただいた記事　
　【改訂後】ORACLE MASTER Silver 12c 合格しました　https://qiita.com/fam_taro/items/5493cf104f3071668f19　
　

公式チェックリストより出題範囲
■DBAASの概要
・DBaaSインスタンスを理解する
・マイ・サービス・ダッシュボードからのナビゲート
・ユーザー認証とロール
・接続プロトコルとポート

●インスタンスの概要
　https://www.oracle.com/technetwork/jp/database/articles/minamin-cloud/index-4009032-ja.html
　出題するなら ■1.Database Cloud Service Instanceの構成ってどうなっているの？の部分だと思う。

●マイ・サービス・ダッシュボードからのナビゲート
　https://docs.oracle.com/en/cloud/get-started/subscriptions-cloud/mmocs/navigating-my-services-application.html

●デフォルトで３つのOSユーザーが用意されています。
　※解説動画でも例題として紹介されていた。
　root：システム管理ユーザー。セキュリティ観点から、rootには直接ログインできない。
　opc：sudo -sでrootになることができるユーザー
　oracle　：Oracle Databaseのインストールユーザー

●ロール
　問題として出題されないと思う。一応記事
　https://docs.oracle.com/cd/E83857_01/paas/database-dbaas-cloud/csdbi/service-roles-and-users.html
　https://docs.oracle.com/en/cloud/get-started/subscriptions-cloud/csgsg/learn-cloud-acount-roles.html

●各インスタンスへのアクセスに使用する接続プロトコルとポート番号
　※解説動画でも例題として紹介されていた。
　接続プロトコル：SSH ポート番号：22

時間をかける部分ではないと思うので、接続プロトコルとポート番号、デフォルトで用意されているユーザーのみ覚えていればいいと思う。

出題例：※Oracle Database Cloud Serviceへのネットワーク・アクセスの計算ノードに使用するポート番号とプロトコル
→デフォルトではセキュリティの観点上、SSHのポート番号22番しか空いていません
※察してください。
モデル・テーブルの作成、アソシエーションについて

#モデルとテーブルの作成方法

**モデルは、Railsの内部に存在しており、外部にあるDB(データベース)の中にある特定のテーブルと1：1(モデル：テーブル)の関係で連結している**モデルは、テーブルとの間でデータのCRUD処理を行う等の役割を担う。
また、テーブルには個別・具体的な情報が保存されている。モデルとテーブルは、名前によって両者を関連づけている（モデルとテーブルについての命名規則）。また、モデルの場合、テーブルを１つにまとめることから、ファイル名およびファイルの中身は、**単数形**表記である。一方で、テーブルは、個別・具体的な情報を複数保存していることから、テーブル名は、**複数形**表記となる。

モデルの作成方法

```
rails g model テーブル名 カラム名:型
```
例）  authorという名前のモデルを作成する場合

```
rails g model author name:string
```

上記コマンドを実行した際、以下の２つのファイルが作成される。

1.app/modelフォルダにモデルを記述したファイルが作成される。
2.db/migrateにテーブル作成において必要なカラムを記載されたマイグレーションファイルが作成される。

※ちなみにモデル作成の段階で、カラム指定をせずとも、後にマイグレーションファイルに直接必要なカラムを記載することも可能である。

そして、最後にカラムを記載したマイグレーションファイルを以下のコマンドで実行する。

```
rake db:migrate
```

以上の手順で、モデルとテーブルの作成が完了する。

#アソシエーションの組み方
アソシエーションとは,モデル間の関連付けのことをいう。これを定義することで、複数のモデル間をまたいで、データの呼び出し行うことができる。

1対1の関係にある時は、**belongs_to**の記載をする。
1対多の関係にある時は、**has_many**の記載をする。


アソシエーションの記述は、モデルファイルに記載する。

例）　authorsモデルとbooksモデルが、**１対多**の関係にある時のアソシエーションの記述

```ruby

class Author < ApplicationRecord
  has_many :books ,dependent: :destroy
end
```
また、**dependent: :destroy**記載は、authorsテーブルのレコードを削除した時に、関連しているbooksテーブルのレコードも同時に削除されることを意味している。

これについては、以下のサイトを参照。
https://pg-happy.jp/rails-has_many-dependent-destroy.html
Pythonで数字を四捨五入して丸める関数

# Pythonで数字を四捨五入して丸める関数
- 整数に丸める際などに使う関数
- デフォルトでは整数に丸めて**int**で出力
- roundが偶数への丸めだったりで微妙に感じたので
- 非対称の四捨五入

```python
def pro_round(num, ndigits=0):
    """
    数字を四捨五入で丸める。

    Args:
        num: int or float
            丸めたい数字。
        
        ndigits: int, optional(default=0)
            丸めた後の小数部分の桁数。0の時は丸めた後intにする。
    
    Returns:
        rounded: int or float
            丸めた後の数字。
    """
    num *= 10 ** ndigits
    rounded = ( 2* num + 1 ) // 2
    rounded /= 10 ** ndigits
    
    if ndigits == 0:
        rounded = int(rounded)
    
    return rounded
```
centos7でfcrackzipを使う

CentOS7でインストールしてた記事がなかったので



### ゴール
- パスワード付きzipのパスワードを突き止める

### 準備
#### frackzipをインストール
マニュアルはここ
https://centos.pkgs.org/7/forensics-x86_64/fcrackzip-1.0-1.el7.x86_64.rpm.html

```
$ wget https://forensics.cert.org/cert-forensics-tools-release-el7.rpm
$ sudo rpm -Uvh cert-forensics-tools-release*rpm
$ yum --enablerepo=forensics install fcrackzip
$ fcrackzip --version
```

#### デモ用パスワード付きzipを作成
1. 「hello」と書いた `himitsu.txt` を用意
1. `himitsu.txt` を パスワード `12345` として `himitsu.zip` を作成

```
$ echo hello > himitsu.txt
$ zip -e --password=12345 himitsu.zip himitsu.txt
$ rm himitsu.txt
```

#### デモ
```
$ fcrackzip -u -c 1 -l 5 himitsu.zip

PASSWORD FOUND!!!!: pw == 12345
```

#### 説明
今回は以下の条件が分かっていることを前提として、fcrackzipのオプションを設定しました。
1. パスワードが数値だけであること
2. パスワードが5文字であること

`-u` ... unzipする
`-c 1` ... `1`は数値を指定。他に、文字列なら`a`、記号なら`!`など
`-l 5` ... 桁数を5に指定。仮に最小値5、最大値10なら `5-10`で指定

詳細のｳｻｹﾞは以下

```
$ fcrackzip --help
USAGE: fcrackzip
          [-b|--brute-force]            use brute force algorithm
          [-D|--dictionary]             use a dictionary
          [-B|--benchmark]              execute a small benchmark
          [-c|--charset characterset]   use characters from charset
          [-h|--help]                   show this message
          [--version]                   show the version of this program
          [-V|--validate]               sanity-check the algortihm
          [-v|--verbose]                be more verbose
          [-p|--init-password string]   use string as initial password/file
          [-l|--length min-max]         check password with length min to max
          [-u|--use-unzip]              use unzip to weed out wrong passwords
          [-m|--method num]             use method number "num" (see below)
          [-2|--modulo r/m]             only calculcate 1/m of the password
          file...                    the zipfiles to crack
```


`-c !`で記号を指定すると、なぜか以下のようなエラーが標準出力される

```
sh: -c: line 0: unexpected EOF while looking for matching `"'
sh: -c: line 1: syntax error: unexpected end of file
```
ダブルクオーテーションが無害化されていない？ :thinking:
【Lubuntu】VirtualBox5.2 に Lubuntu 18 LTS最小構成でインストールすると、ゲストツールインストールに失敗する

# 概要
- あ、最小構成だとパッケージ足んなくてゲストツール入らないのね。いっつも標準で入れてたから気がつかなかったω
    - gcc
    - make

# 前提
- VirtualBoxにLubuntuを最小構成でインストールした直後
- Guest Additios CDをマウント済み

# 対処
- gccインスコ
- makeインスコ
- ゲストツールインスコ

```bash
$ sudo apt-get install gcc make
$ cd /media/mahny/VBox_GAs_5.2.26/
$ sudo ./VBoxLinuxAdditions.run
```

# うまく入らなかったら…
- apt-getをアプデ、アプグレしてみる…くらい？
- 【sudo ./VBoxLinuxAdditions.run】実行時のエラーメッセージをよく読んで対処する
    - 大抵「～が足りないぞ！」みたいな事が**英語**で書いてある

```
$ sudo apt-get update
$ sudo apt-get upgrade
```

# あとがき
- てか、昔っからCentOSとかも最小構成でインストールすると開発系ツール除外されてたね。失敗失敗＞＜

以上
Pythonの仮想環境ﾁｮｯﾄﾜｶﾘﾀｶｯﾀ

# 仮想環境とは？
ふと気になったので調べてみた。多分パスをいじってるんだろうなーって思ってたけど、改めて確認したかった。
仮想環境の作り方、使い方は書いてあるけど、結局中で何が行われてるのか気になるという人向け~~いるのかそんな人?~~

## 結局何してたの？
パスを書き換えていました。（予想通り）

## そもそもPATHって？

プログラム（実行可能ファイル）は本来フルパスを指定しなければ実行できません。
フルパスとは、Windowsでは、``C:\``で始まるデータの保存場所を示す文字のことを指します。

いちいちプログラムの保存場所を覚えたり、使うたびに探すのは非効率的。
そのため、よく使うファイルの場所は一箇所にまとめておくと効率的で嬉しいですよね。
それが環境変数PATHです。

以下のコマンドを実行して出力されたものが、PATHと呼ばれているものの実体です。

```shell:
(windows)  > echo %PATH%
(linux)    > echo $PATH
```

当方の環境だと、以下のような感じです。
出力の結果は人によって変わります。以下ではLinuxで説明していきます。

```
~$ echo $PATH
/opt/ThirdParty-6/platforms/linux64Gcc/gperftools-svn/bin:/opt/paraviewopenfoam56/bin:/home/cuz/OpenFOAM/cuz-6/platforms/linux64GccDPInt32Opt/bin:/opt/site/6/platforms/linux64GccDPInt32Opt/bin:/opt/openfoam6/platforms/linux64GccDPInt32Opt/bin:/opt/openfoam6/bin:/opt/openfoam6/wmake:/home/cuz/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
```

例えば上の環境の中の``/usr/bin``の下のpythonを出力すると

```
$ ls | grep python
dh_python2
dh_python3
python
python2
python2.7
python3
python3-config
python3.6
python3.6-config
python3.6m
python3.6m-config
python3m
python3m-config
x86_64-linux-gnu-python3-config
x86_64-linux-gnu-python3.6-config
x86_64-linux-gnu-python3.6m-config
x86_64-linux-gnu-python3m-config

```
さらにこの中の``python3.6``のファイルのタイプを調べてやると・・・

```
$ file python3.6
python3.6: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/l, for GNU/Linux 3.2.0, BuildID[sha1]=09148930900f465f0cb964452b0ac22986fae752, stripped

```

要するに実行可能ファイルであることがわかります。
いつも、シェル上で我々が単純に``python3``と打ち込んだときに、きちんとPythonが実行されるのはPATHを通しているからなんですね。

## じゃあ仮想環境は何をしてるの？

※``pipenv``で説明を行いますが、別の仮想環境もやってることは変わらないと思います。

仮想環境を作成すると、カレントディレクトリもしくは所定の場所に仮想環境で使用するPythonやライブラリのインストールされるディレクトリができます。
当方の環境だと、``/home/.local/share/virtualenv/test-tJa6NcU0/``という場所に作成されました。

そのディレクトリを開くと、下記のようになります。

```
 .
├── bin
│   ├── activate
│   ├── activate.csh
│   ├── activate.fish
│   ├── activate.ps1
│   ├── activate.xsh
│   ├── activate_this.py
│   ├── easy_install
│   ├── easy_install-3.6
│   ├── pip
│   ├── pip3
│   ├── pip3.6
│   ├── python -> python3
│   ├── python-config
│   ├── python3
│   ├── python3.6 -> python3
│   └── wheel
├── include
│   └── python3.6m -> /usr/include/python3.6m
└── lib
    └── python3.6
```
この中で、``pipenv shell``を実行すると上記のファイルのうち``activate``が実行されます。

この``activate``の中身を一部抜粋すると、

```bash:activate
(略)
# 仮想環境ディレクトリのPATHを環境変数にセット
VIRTUAL_ENV="/home/cuz/.local/share/virtualenvs/test-tJa6NcU0"
export VIRTUAL_ENV

# 過去の環境変数を_OLD_VIRTUAL_PATHにセット
_OLD_VIRTUAL_PATH="$PATH"

# PATHの先頭に仮想環境のPATHを設定
PATH="$VIRTUAL_ENV/bin:$PATH"
export PATH
```
ということをやっています。
PATHのところでは説明していませんでしたが、PATHは前から検索が行われ、最初に見つかった場所のファイルが呼ばれる仕組みになっています。

つまり、``activate``内では優先的に仮想環境ディレクトリのPythonやその他ライブラリを呼び出すように設定しているだけなのでした。

## で？

と言われると何も言えないです。＼(^o^)／
とはいえ、何も考えずにただ使ってるだけよりわかって使ってる方が、何か合った時に力になる・・・と信じたい＼(^o^)／
WordpressをMarkdown記法で書く方法

WordpressはそのままではMarkdown記法には対応していません。

QiitaのようにMarkdown記法でかければとても楽ですし時短になります。

## Wordpressにプラグインをインストール
早速プラグインをインストールし対応していきます。

今回はまず[こちら](https://ja.wordpress.org/plugins/markdown-editor/)のプラグインをインストールします。

ダウンロードをクリック

![Markdown.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421499/e046398f-bad6-4690-5013-c3b6fe41566e.jpeg)


保存したzipファイルをWordpressにアップロード。

これでMarkdownが使えるようになりました。


![Markdown2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421499/2e24afdc-c998-8641-23f9-ea13e4096950.jpeg)



##ついでに入れておくべきプラグイン
ちなみにいつからかWordpressの仕様でこのプラグインだけを入れても投稿画面がうまく機能しません。

ですので従来のWordpressのエディター画面に戻してあげましょう。

使用するプラグインはこちらです。

https://ja.wordpress.org/plugins/classic-editor/

これでWordpressで問題なくMarkdown記法で記事投稿できるようになりました。


## Qiitaのようにプレビューを見ながらかけるプラグイン
こういったプラグインもありましたのでお好みでこちらにして見てもいいかもしれません。

https://wordpress.org/plugins/wp-githuber-md/

使うとこんな感じになります。

![Markdown3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421499/8756df45-4c99-e6f4-bd1a-a3e70a077a1e.jpeg)
【Ruby】 gsubで複数の文字パターンを置換する方法

#はじめに
複数の文字パターンを置換したいときに`gsub`でメソッドチェーン？を利用して置換文字数分`gsub`を呼ばないといけないと思っていたので、置換する対象をハッシュで渡せる方法をまとめてみました。
#復習
##sub【初めにマッチした部分のみ置換】
```ruby
"hogehoge".sub("hoge","ruby")
=> "rubyhoge"
```
##gsub【マッチした部分をすべて置換】
```ruby
"hogehoge".gsub("hoge","ruby")
=> "rubyruby"
```
#本題
複数の文字パターンを置換したい場合
##gsub【マッチした部分をすべて置換＋複数のパターンを置換】
```ruby
"hogeはrubyです".gsub(/hoge|ruby/, "hoge" => "私", "ruby" => "男")
=> "私は男です"
```
第１引数で渡した正規表現に該当する文字を、第２引数のパターンにそって置換してくれるそうです。
アルゴリズムトレーニング -"プログラマ脳を鍛える数学パズル"-

(https://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E8%84%B3%E3%82%92%E9%8D%9B%E3%81%88%E3%82%8B%E6%95%B0%E5%AD%A6%E3%83%91%E3%82%BA%E3%83%AB-%E3%82%B7%E3%83%B3%E3%83%97%E3%83%AB%E3%81%A7%E9%AB%98%E9%80%9F%E3%81%AA%E3%82%B3%E3%83%BC%E3%83%89%E3%81%8C%E6%9B%B8%E3%81%91%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%AA%E3%82%8B70%E5%95%8F-%E5%A2%97%E4%BA%95-%E6%95%8F%E5%85%8B/dp/479814245X/ref=asc_df_479814245X/?tag=jpgo-22&linkCode=df0&hvadid=295723231663&hvpos=1o1&hvnetw=g&hvrand=8614614560148278470&hvpone=&hvptwo=&hvqmt=&hvdev=c&hvdvcmdl=&hvlocint=&hvlocphy=1009307&hvtargid=pla-526233948639&psc=1&th=1&psc=1)

Q7
前回オリンピックから次回オリンピックまでの年月日
で2進数に変換し、回文となり、ふたたび二進数にして同じになる年月日を求めよという問題

日付をDateクラスになおし
数値にして mapでハッシュに格納
selectで取り出すという順番

Dateクラスは文字列ではないので



```
term_list = term.map{ |d|d.toi}
```

ではだめで

srtftimeで文字列にしてあげないとダメ

```

term_list = term.map{ |d|d.srtftime('%Y%m%d').to_i }
```
[mongoose] サブドキュメントの配列要素に_idを作らないようにする。

# 前略
Node.jsでMongoDBを扱えるパッケージであるmongooseの記事。

mongooseでデータを登録した際に
いらないのに`_id`プロパティが作られてしまうことがあったので
その回避方法。

# 解決したいこと

```js:登録されたデータの構造
{ 
  _id: 11,
  title: 'sample',
  data:[ 
    { _id: 5d0a6368ac03fe1aabd7c33f, field: 'value1' },
    { _id: 5d0a6368ac03fe1aabd7c33e, field: 'value2' },
    { _id: 5d0a6368ac03fe1aabd7c33d, field: 'value3' } 
  ],
}
```

`data`に含まれるオブジェクトに`_id`プロパティが<font color="red">作られないようにしたい</font>:

```js:登録したいデータの構造
{ 
  _id: 11,
  title: 'sample',
  data:[ 
    { field: 'value1' },
    { field: 'value2' },
    { field: 'value3' } 
  ],
}
```

# 解決方法

mongooseでは登録するデータの構造を
mongoose.Schemaを使って定義する。

サブドキュメントの配列要素に`_id`プロパティを作りたくない場合は
下記のようにスキーマを定義してあげればよい。

```js:_idを作らないようにするスキーマの定義
const mongoose = require('mongoose');

// サブスキーマを定義する。
var subSchema = mongoose.Schema({
  field: {
    type: String,
    required:true,
  }
}, {_id:false}) // ← ここがポイント、これで_idが作られなくなる

const schema = new mongoose.Schema({
  title: {
    type: String,
    required: true
  },
  data: {
    type:[subSchema], // 定義したサブスキーマを指定する。
    default:[],
    required: true,
  },
});
```

ちなみに普通のスキーマはこんな感じで定義すると思うが
この場合はサブドキュメントの配列要素に`_id`が作られてしまう。

```js:このSchemaはダメな例(_idが作られてしまうパターン)
const mongoose = require('mongoose');

const schema = new mongoose.Schema({
  title: {
    type: String,
    required: true
  },
  data: {
    type:[
      {
        field:String
      }
    ],
    default:[],
    required: true,
  },
});
```
ラズパイでdiscordのbotをつくりたかった

Pythonがうごくラズパイ3があったのでとりあえずdiscordのbotを作ってみました

用意するもの
・windowsPC
・ラズパイ（電源も）

こんだけ

1.とりあえずラズパイをsshでwindowsとつないで作業できるようにする
Windows側のsshクライアントとしておススメされたMobaXtermをとりあえずこの記事を参考にラズパイとつなぎます
>https://qiita.com/mkasahara/items/c029154b5436913b20e0

2.discord.pyを持ってくる
ここのサイトを参考に依存関係にあるライブラリとかを先にインストールしつつがんばります
>https://discordpy.readthedocs.io/ja/latest/intro.html#installing

3.てきとうなサンプルソースを動かしてみる
discord.pyの中にあるexampleを実行

>https://github.com/Rapptz/discord.py

4.結果
今回は!helloでHelloを返すサンプルを実行しました
![discord.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153079/201704b7-0301-fd6a-8aee-1d50e8f0996f.png)

あとがき

この記事は備忘録です。適当に書きました。すみません
ssh接続クライアントを落とすとコマンドの実行が止まるので常駐というわけじゃないです

>https://qiita.com/ikemura23/items/03d8c64eb785986e4042

天才がいました。常駐botできました。
Kotlinで関数名やクラス名にダブルクオーテーションを使ってはいけない

通常、ダブルクオーテーション等の記号は変数名・関数名・クラス名に使えません。
しかし、Kotlinにおいて\`(´・ω・｀)`のようにバッククオートで囲むことで、ほとんど全ての文字を使うことができるようになります。

```kotlin

class ` (´・ω・｀)`
class `└(՞ةڼ◔)」`
fun `using namespace std`() = "575"
val `"ことりん かわいいよ"` = "I love Kotlin"
```
以上の定義は全てコンパイル可能です。

ところで、classはコンパイルされる時にファイルが作られます。
funも場合によっては作られるみたいです。(一時的なもの？`@Test`をつけたもののみ？詳細はわかりません)
そしてそれらのファイルの名前は、class等の名前からバッククオートを抜いたものになります。
つまり、

```kotlin
class ` (´・ω・｀)`
```
をコンパイルすれば、`(´・ω・｀).class`というファイルが作られる、はずです。

そして、Windowsではファイル名に以下の文字を使用できません。
¥ / : * ? " < > |
また、Linuxではファイル名に以下の文字を使用できません。
/ (NULL)

さて、問題です。
Windowsで

```kotlin
class `What is "this"?`
```
をコンパイルしたらどうなるでしょう？

答えは簡単。
コンパイラがクラッシュします。

環境によってはコンパイラーがクラッシュするコードなんて厄介極まりないので、クラス名や関数名にファイル禁則文字を使うのはやめましょう。
@HostListener('click') で Error: Maximum call stack size exceeded が出たとき

やんごとない事情で、クリックしたらイベントを発火するシンプルな Angular コンポーネントを作ることになりました。それで、このように実装してみました。

```ts
@Component({
  selector: 'hello',
  template: `<h1>Hello!</h1>`,
})
export class HelloComponent  {
  @Output() click = new EventEmitter<void>();

  // This function causes Error: Maximum call stack size exceeded.
  // this.click.emit() calls onClick recursively.
  @HostListener('click')
  onClick (): void {
    this.click.emit();
  }
}
```

ざっと動作させてちゃんと動いてるねー。と思ってよく見たら、コンソールに不穏なエラーが。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6870/9b4b545c-9ebc-470a-be86-93dc76837ff6.png)

```
ERROR RangeError: Maximum call stack size exceeded
```

とのことです。どうやらこの書き方をすると無限ループになっちゃうみたいですね。

- クリックする
- `@HostListener('click')` がついた `onClick` が呼び出される
- `this.click.emit()` する
- ここから回り回って `onClick` が再帰的に呼び出される

といった流れになっているようです。

仕方なく `click` の名前を `clickHost` に変えたらエラーが出なくなりました。そりゃそうですね。

```ts
@Component({
  selector: 'hello',
  template: `<h1>Hello!</h1>`,
})
export class HelloComponent  {
  @Output() clickHost = new EventEmitter<void>();

  @HostListener('click')
  onClick (): void {
    this.clickHost.emit();
  }
}
```

当然といえば当然の話なのですが、ググっても情報がヒットしなかったので、誰かの助けになればと思って書きました 🙏
MySQL8.0ではGRANTでユーザ登録ができなかった話

#MySQL８．０でユーザを登録する

いつもの様に・・・
ホレ！ :older_man_tone3:

```console
mysql> GRANT all ON *.* TO 'devusr'@'%' IDENTIFIED BY 'MyNewPass4!';
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IDENTIFIED BY 'MyNewPass4!'' at line 1
```
ん？
あ、え・・・:sweat_smile:？

:point_down_tone2:こんな感じでイケました

```console
mysql> create user 'devusr'@'%' identified by 'MyNewPass4!';
Query OK, 0 rows affected (0.01 sec)
```

```console
mysql> grant all on *.* to 'devusr'@'%';
Query OK, 0 rows affected (0.00 sec)
```

あざます :pray_tone2:

#★追記
Laravelのmigrateで以下のエラー
>SQLSTATE[HY000] [2054] The server requested authentication method unknown to the client ...

を出さないためには

こんな感じにするらしい。旧認証方式で暗号化。

```console
mysql> create user 'devusr'@'%' identified WITH mysql_native_password by 'MyNewPass4!';
Query OK, 0 rows affected (0.01 sec)
```
No space left on deviceでinodeは問題ないのに容量の原因ファイルが見つからない

`df`と`du`が合わない場合です。
ファイルは無くなっているがオープン中のファイルが容量を使っている可能性

```sh
ls -al /proc/*/fd/* | grep deleted
```

や

```sh
lsof | grep "(deleted)"
```

でsizeの大きくて心当たりのあるコマンド名のPIDをみつける

```sh
find /proc/<PID>/fd -ls 2> /dev/null | grep '(deleted)'
```

プロセスが動いていたら止めたら消えるかも？
止められないしどうしようもないなら以下を試してファイルのサイズを0にするのを試したり。

```sh
truncate -s 0 /proc/<PID>/fd/XXX
```

[find-and-remove-large-files-that-are-open-but-have-been-deleted](https://unix.stackexchange.com/questions/68523/find-and-remove-large-files-that-are-open-but-have-been-deleted/68532)
達成感溢れるCodePipeline承認（物理）

どうしても手動がないと落ち着かない人たちのために、CI/CDへSORACOM LTE-M Buttonから承認をできるようにしました。
ぜひ「承認実行！」と叫んで押していただきたい。

# デモ
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr"><a href="https://twitter.com/hashtag/%E3%81%82%E3%81%AE%E3%83%9C%E3%82%BF%E3%83%B3?src=hash&amp;ref_src=twsrc%5Etfw">#あのボタン</a> でCodePipelineの承認と却下 <a href="https://t.co/I72SNe5G17">pic.twitter.com/I72SNe5G17</a></p>&mdash; T.A.C. (@TAC_yacht) <a href="https://twitter.com/TAC_yacht/status/1141376492397420544?ref_src=twsrc%5Etfw">2019年6月19日</a></blockquote>


# 構成
今回は練習もかねてCodeStarでCodeシリーズを初期化しています。
![CodePipeline承認フロー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141402/aeb38dc3-9d2f-97c3-2126-ad3b0f4315f0.png)
※Manual approvalは[文中](#Pipelineへ承認の追加)で追加します。

# Lambdaの作成
## IAMロール
通常のIAMロールのほかPipelineを操作するので以下を追加してください  

```json:IAM
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "codepipeline:GetPipelineState",
            "Resource": "arn:aws:codepipeline:【リージョン】:【アカウント】:【パイプライン名】"
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": "codepipeline:PutApprovalResult",
            "Resource": "arn:aws:codepipeline:【リージョン】:【アカウント】:【パイプライン名】/【ステージ名】/【アクション名】"
        }
    ]
}
```

※パイプライン/ステージ/アクションは名前です。IDの類いではありませんので注意

## Lambdaのコード
[こちらのgist](https://gist.github.com/tac-yacht/a7ae286c0a81b39ccd67e5ba39633af2)からコピペしてください。
ダブルクリックに承認、それ以外に否認を割り当てています。

# Pipelineへ承認の追加
1. 「ステージを追加する」を押下
2. IAMで設定した名前に合うステージ名を付ける
3. 「アクショングループを追加する」を押下
4. IAMで設定した名前に合うアクション名を付ける
5. アクションプロバイダー「Manual approval」を選択
6. 「完了」を押下
7. 「保存する」を押下

※本説明はCodePipelineがCodeStar等であらかじめ承認以外ができている前提です。

# ボタンの設定
プレイスメントの属性として以下を定義してください

|属性の名前|値|
|---|---|
|actionName|【パイプライン名】|
|pipelineName|【ステージ名】|
|stageName|【アクション名】|

# 参考文献
https://docs.aws.amazon.com/ja_jp/codepipeline/latest/userguide/approvals-approve-or-reject.html#approvals-approve-or-reject-cli
https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/codepipeline.html
https://docs.aws.amazon.com/ja_jp/codepipeline/latest/userguide/iam-access-control-identity-based.html
Koinを使っているプロジェクトが"A Koin Application has already been started"というエラーが出るときの対処法

この記事の対象は同じエラーに嵌った人です。
なのでKoinの説明は省きます。
Koinをよく分からずに使っているとこんなエラーが出ませんでした？
```org.koin.core.error.KoinAppAlreadyStartedException: A Koin Application has already been started```
出てないならこの記事はあなたには不要でしょう。

これの対処法です。
まず、原因ですが、`startKoin()`を複数回呼び出していることです。
どうやらKoinApplicationの存在しているインスタンスは単一である必要があるらしいです。
なので、`startKoin()`の部分を以下のように書き換えます。

```kotlin
GlobalContext.getOrNull() ?: startKoin {
   // Do Something
}
```
やってることは単純です。
KoinApplicationが存在しなければ新規作成、しないのなら使いまわしです。
使用するmoduleなんかを変えたいのなら、`stopKoin()`を使ってから`startKoin()`すれば良いんじゃないですかね。
はじめてのGO【1日目】

# はじめに
はじめてシリーズの `Golang`　バージョンを始めようと思う。 もちろん第一優先は `C++` です。
[Goプログラミング実践入門　標準ライブラリでゼロからWebアプリを作る](https://www.amazon.co.jp/Go%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E5%AE%9F%E8%B7%B5%E5%85%A5%E9%96%80-%E6%A8%99%E6%BA%96%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%81%A7%E3%82%BC%E3%83%AD%E3%81%8B%E3%82%89Web%E3%82%A2%E3%83%97%E3%83%AA%E3%82%92%E4%BD%9C%E3%82%8B-impress-gear%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-Sheong-Chang-ebook/dp/B06XKPNVWV)を初めてみたのはいいものの、文法が全くわからなかったので文法を軽く触れてから(一週間くらい)始める。あと、文法と並行して `http` に知識もネット上から適当に読み漁ろうと考えている。
この記事を書く目的としては、サボり防止と書いたほうが記憶に残るから。
最終的には、Webアプリケーションを作ること
## GO
### Hello World!

```go:helloWorld
package main

import (
  "fmt"
)

func main() {
  fmt.Println("Hello, World!")
}
```
```:実行結果
Hello, World!
```

**ここで事件**

```やばい.go
package main

import
(
  "fmt"
)

func main()
{
  fmt.Println("Hello, World!")
}
```
エラーが出てくる。
`import` の方はこの書き方でも問題なさそうだけど、 `func main` の方はエラー出る。まさか、`{}`　まで縛られるとは思わなかった。辛い、、、。

**package**
　`Go言語` では、 `package` 宣言が必須事項である。 `C++` でいう `ヘッダファイルの二重インクルード防止コード` みたいなものかな。 1つのファイルに、２つ `package` があるとコンパイルエラーが起きる。

**import**
これは、 `<iostream>`　みたいな感じやね。しかし、違うところが一つある。 `fmt` をインポートして `fmt` を一切使わなければコンパイルエラーが出てくる。
この機能は個人的に嬉しい。無駄な `includeファイル`　を見つけてくれるという点では優秀。 `C++` で `ヘッダファイル` がたくさんあるとき、整理しようにも整理するのがとても面倒くさいという経験があるので(笑)

```go:_を使う
import (
 _"fmt"
)
```
と書くことで、 `fmt` を使用していなくてもエラーが出なくなる。
# 終わりに
Goって結構厳しいですね。
明日は関数とか if文とか
[Ruby]今日・昨日・今週・今月のレコードを抽出する。

## 概要
自分用のメモです。
データベース内のレコードのデータを今日・昨日・今週・今月の４パターンで取得し、それぞれ表示する必要があったので、そのやり方について記載します。
（レコードのカラムにはTimestampの「created_at」があることが前提です。）

## やり方
### 1.今日のデータの抽出

```ruby:
@hoge = Hoges.all # @hogeにレコードの全データを代入
    @hoge.each do |hoge| # each文でレコードを分ける。
      if (hoge[:created_at].to_s.match(/#{Date.today.to_s}.+/)) 
　　　　# Date.todayは、今日の年月日を取得できる。matchメソッドを使用し、hogeのレコード内に今日の年月日があるかどうか確認。
　　　　# to_sで文字列に変換しているのは、matchメソッドは文字列にしか適用できないため。
        @data += hoge[:name] + "_" + hoge[:weight] # レコードが今日に相当すれば、@dataに名前と体重を代入。
      end
（メモ） 
# hoge[:created_at]がJSTになっていない場合は、以下のようにしてJSTに変更できる。
hoge_jst = hoge[:created_at].in_time_zone('Tokyo')

```

### 2.昨日のデータの抽出

```ruby:
# 今日のデータ取得の方法とほぼ同じです。
　@hoge = Hoges.all 
    @hoge.each do |hoge| 
      if (hoge[:created_at].to_s.match(/#{Date.yesterday.to_s}.+/)) 
　　　　# Date.yesterdayは、昨日の年月日を取得できる。
        @data += hoge[:name] + "_" + hoge[:weight]
      end

```

### 3.今週のデータの抽出

```ruby:
　@hoge = Hoges.all 
　this_week = Date.today.all_week # all_weekをDate.todayに適用すると、今週の年月日データを取得できる。
    @hoge.each do |hoge| 
     if (this_week.include?(Date.parse(hoge[:created_at].to_s)))
　　　　# 今週の日にちの中にhoge[:created_at]の年月日が含まれていれば、trueを返す。
　　　　# parseメソッドは、this_weekとhoge[:created_at]のclassを合わせるために使用。
　　　　# （this_weekはDateクラス, hoge[:created_at]はTimeWithZoneクラスのため）
        @data += hoge[:name] + "_" + hoge[:weight]
     end
```

### 4.今月のデータの抽出

```ruby:
# 今週のデータ取得の方法とほぼ同じです。
　@hoge = Hoges.all 
　this_month = Date.today.all_month # all_monthをDate.todayに適用すると、今月の年月日データを取得できる。
    @hoge.each do |hoge| 
     if (this_month.include?(Date.parse(hoge[:created_at].to_s)))
　　　　# 今月の日にちの中にhoge[:created_at]の年月日が含まれていれば、trueを返す。
        @data += hoge[:name] + "_" + hoge[:weight]
     end
```

以上です！何か間違い等あれば指摘いただけると幸いです。

## 参考（非常に助かりました。）

すぐ忘れるので、RubyとRailsの日付操作周りについてまとめました
https://qiita.com/ykyk1218/items/d5086dcb7618d4f918ec

Railsでの日付操作でよく使うものまとめ
https://qiita.com/mmmm/items/efda48f1ac0267c95c29
Rails のお作法

# Rails のお作法

## コントローラーを作るとき

```
$ bundle exec rails g controller homes index
```

コントローラーの中にはたくさんのメソッドを作るので複数形でコマンドを打つ！！！


## コントローラーを削除するとき

```
$ bundle exec rails d controller homes index
```

gがdに変わっただけ。


## 新しくテーブルを作るとき

```
$ bundle exec rails g model User account:string name:string
```

このときは単数形でコマンドを打つ！！！！

## 後からテーブルにカラムを追加したいとき

```
$ bundle exec rails g migration AddEmailToUsers email:string
```


## データベースを作成する一発目のコマンド

```
$ bundle exec rails db:create
```

これでdatabase.yml に設定されている通りの DB が作成できる。


## テーブル、カラムの変更をデータベースに反映させるコマンド

```
$ bundle exec rails db:migrate
```

## データベースの情報を完全消去して空っぽにするコマンド

```
$ rails db:migrate:reset
```

## データベース系の主なコマンド

1. rails db:create
2. rails db:drop
3. rails db:migrate
4. rails db:rollback
5. rails db:seed
6. rails db:reset
7. rails db:migrate:reset

使い方は逐一調べよう。
【令和対応版】Pythonで和暦と西暦を相互に変換するライブラリを作ってみた (jeraconv)

# jeraconv (Japanese Era Name Converter) とは
Python学習の一環として、パッケージ作成とPypiへの登録をやってみたくて作った習作ライブラリです。
比較的簡単に、和暦と西暦を相互変換できるものを目指して作成しました。
なお、変換の基となるデータは wikipedia の [元号一覧(日本)](https://ja.wikipedia.org/wiki/%E5%85%83%E5%8F%B7%E4%B8%80%E8%A6%A7_(%E6%97%A5%E6%9C%AC) "元号一覧(日本)") に準拠しています。

# MIT ライセンスで公開中
MITライセンスで公開していますので、誰でも自由に利用してもらって結構ですが、結果の確からしさは保証されていません。
そもそも [元号一覧(日本)](https://ja.wikipedia.org/wiki/%E5%85%83%E5%8F%B7%E4%B8%80%E8%A6%A7_(%E6%97%A5%E6%9C%AC) "元号一覧(日本)") の情報を JSON データに落とし込む段階で、一つ一つ手入力する気にはなれなかったため、EXCELの関数を駆使して年号や始期、終期を抽出しています。ここでミスっていれば、当然結果は誤ったものが出力されてしまいます。
お使いになる方は、これらのことをご理解の上で使用するようにお願いいたします。バグ報告などは歓迎します。この記事にコメントしていただけると、作者が暇なときに対応するかもしれません。(基本は休日プログラマーなので・・・)

# インストール方法
```python
pip install jeraconv
# 最新版 : version0.2.1
```

# jeraconv でできること
## 和暦から西暦への変換
```python
from jeraconv import jeraconv

# J2W クラスのインスタンス生成
# このタイミングで変換の要となる JSON データが load される
j2w = jeraconv.J2W()

# ex.1 : 一般的な使用方法
print(j2w.convert('文治6年'))
# result (int)1190

# ex.2 : 全角数字も使用可能
print(j2w.convert('平成３１年'))
# result (int)2019

# ex.3 : "1年" は "元年" と書くことも可能
print(j2w.convert('令和元年'))
# result (int)2019

# ex.4 : 存在しない年号を指定すると ValueError を返す
print(j2w.convert('牌孫4年'))
# result ValueError
```

## 西暦から和暦への変換
```python
from jeraconv import jeraconv

# W2J クラスのインスタンス生成
# このタイミングで変換の要となる JSON データが load される
w2j = jeraconv.W2J()

# ex.1 : 一般的な使用方法
year = 2019
month = 5
day = 31
print(w2j.convert(year, month, day))
# result (str) 令和1年5月31日

# ex.2 : 辞書型で応答を受け取る場合
print(w2j.convert(year, month, day, return_type='dict'))
# result (dict) {'era': '令和', 'year': 1, 'month': 5, 'day': 31}

# ex.3 : リスト型で応答を受け取る場合
print(w2j.convert(year, month, day, return_type='list'))
# result (list) ['令和', 1, 5, 31]

# ex.4 : タプル型で応答を受け取る場合
print(w2j.convert(year, month, day, return_type='tuple'))
# result (tuple) ('令和', 1, 5, 31)

# ex.5 : 年月日を省略した場合は実行時の年月日を変換
print(w2j.convert())
```
# 関連リンク
- Pypi : [jeraconv](https://pypi.org/search/?q=jeraconv "jeraconv")
- GitHub : [jeraconv](https://github.com/slangsoft/jeraconv "jeraconv")

# 参考サイト様
- [(インターン向けに書いた)Pythonパッケージを作る方法](https://qiita.com/Kensuke-Mitsuzawa/items/7717f823df5a30c27077 "(インターン向けに書いた)Pythonパッケージを作る方法")
- [自作のPythonパッケージをPyPIに登録してpip install可能にする](https://qiita.com/shonansurvivors/items/0fbcbfde129f2d26301c "自作のPythonパッケージをPyPIに登録してpip install可能にする")
- [元号一覧(日本)](https://ja.wikipedia.org/wiki/%E5%85%83%E5%8F%B7%E4%B8%80%E8%A6%A7_(%E6%97%A5%E6%9C%AC) "元号一覧(日本)")
htmlとcssだけで切り替え式のスイッチを作る方法

html

```html
<label class='switch'>
       <input class='switch-checkbox' type='checkbox'>
       <div class='switch-unchecked'>OFF</div>
       <div class='switch-checked'>ON</div>
</label>
```

SCSSS

```scss
.switch {
    display: inline-flex;

    width: 200px;
    background-color: #FFFFFF;
    border: solid 1px #000000;
    user-select: none;
    -webkit-touch-callout: none;

    .switch-checkbox {
        display: none;
    }
    .switch-checked,.switch-unchecked{
        flex-grow: 1;
        display: inline-flex;
        justify-content: center;
        align-items: center;
    }
    .switch-checkbox:checked~.switch-checked,
    .switch-checkbox:not(:checked)~.switch-unchecked {
        background-color: red;
    }
}
```
指定ディレクトリ直下のディレクトリとファイルの容量を確認

```sh
sudo find /home/user/ -maxdepth 1 -print0 | xargs -0 -l sudo du -sh
```

```
37M     /home/user/
37M     /home/user/app
4.0K    /home/user/.bash_profile
4.0K    /home/user/.ssh
4.0K    /home/user/.bashrc
4.0K    /home/user/.bash_logout
```
DynamoDbDataMapperのQuery(やScan)をJestでシンプルにMockする(typescript)

# 背景
DynamoDB data mapper は、annotationなど、ORMな機能が一通りついていて扱いやすいのはよいのですが、
Query,Scanなどのメソッドが QueryIterator(=> AsyncIterator)型で返却され、テストでのMockingを少し考える必要がありました。
以下のコードでシンプルにMockできるので、お役に立てば幸いです。

DynamoDB data mapper
https://github.com/awslabs/dynamodb-data-mapper-js

# Mock
```ts
import { DataMapper } from '@aws/dynamodb-data-mapper'

describe('test', () => {
  beforeEach(() => {
    const asyncIteratorMock = new Object()
    asyncIteratorMock[Symbol.asyncIterator] = async function*() {
      yield 'hoge'
      yield 'hage'
      yield 'huge'
    }
    // scanも同じです。
    jest.spyOn(DataMapper.prototype, 'query').mockImplementation(() => {
      return asyncIteratorMock
    })
  })

  afterEach(() => {
    jest.restoreAllMocks()
  })
})
```
python の　お勉強　６日目

# tkinterを使って棒グラフを描いてみる。
３日目に作成したレイアウトをそのまま使い
入力された数値を用いてcanvasに棒グラフ
を描きます
プログラムの流れ
- 数字を４つ（０から７００まで）入力
  (エラー対策は省いています）
- OKボタンで入力されたデータから棒グラフを表示する
- Cancelボタンでグラフと入力済の数字を消去する。

注意点。
- 部分的に変数をGlobalにする
- 棒の部分だけ消去する場合はTagをつける
　（棒の部分を消去しないと再入力した場合に重ね書きになる）
- 入力文字を消去する場合は deleteとinsertの２行が必要

```python
#python Gui/Graphic help :learnpython SpanningMulipleCells
from tkinter import *
from tkinter import ttk


def height(x1):
    h =  190 - int(x1)/4
    return h

def cancelpush(event):
    global name1
    global name2
    global name3
    global name4
    canvas.delete("oval")
    name1.delete(0,END)
    name1.insert(0, "")
    name2.delete(0,END)
    name2.insert(0, "")
    name3.delete(0,END)
    name3.insert(0, "")
    name4.delete(0,END)
    name4.insert(0, "")

def okpush(event):
    global name1c
    global name2c
    global name3c
    global name4c
    name1c = name1.get()
    name2c = name2.get()
    name3c = name3.get()
    name4c = name4.get()
    canvas.create_rectangle(30,height(name1c),60,190,tag="oval")
    canvas.create_rectangle(75,height(name2c),105,190,tag="oval")
    canvas.create_rectangle(120,height(name3c),150,190,tag="oval")
    canvas.create_rectangle(210,height(name4c),240,190,tag="oval")

    
root = Tk()

content = ttk.Frame(root)
frame = ttk.Frame(content, borderwidth=5, relief="sunken", width=200, height=200)

namelbl1 = ttk.Label(content, text="Before 0 - 700")
name1 = ttk.Entry(content, )
namelbl2 = ttk.Label(content, text="30mim 0 - 700")
name2 = ttk.Entry(content, )
namelbl3 = ttk.Label(content, text="1hour 0 - 700")
name3 = ttk.Entry(content, )
namelbl4 = ttk.Label(content, text="2hour 0 - 700")
name4 = ttk.Entry(content, )

#onevar = BooleanVar()
#twovar = BooleanVar()
#threevar = BooleanVar()
#onevar.set(True)
#twovar.set(False)
#threevar.set(True)

#one = ttk.Checkbutton(content, text="One", variable=onevar, onvalue=True)
#two = ttk.Checkbutton(content, text="Two", variable=twovar, onvalue=True)
#three = ttk.Checkbutton(content, text="Three", variable=threevar, onvalue=True)

ok = ttk.Button(content, text="Okay")
cancel = ttk.Button(content, text="Cancel")

content.grid(column=0, row=0)
frame.grid(column=0, row=0, columnspan=3, rowspan=8)
namelbl1.grid(column=3, row=0, columnspan=2)
name1.grid(column=3, row=1, columnspan=2)
namelbl2.grid(column=3, row=2, columnspan=2)
name2.grid(column=3, row=3, columnspan=2)
namelbl3.grid(column=3, row=4, columnspan=2)
name3.grid(column=3, row=5, columnspan=2)
namelbl4.grid(column=3, row=6, columnspan=2)
name4.grid(column=3, row=7, columnspan=2)

#one.grid(column=0, row=8)
#two.grid(column=1, row=8)
#three.grid(column=2, row=8)

ok.grid(column=3, row=8)
cancel.grid(column=4, row=8)

canvas = Canvas(content, )
canvas.grid(column=0, row=0, columnspan=1,rowspan=8)
canvas.create_rectangle(10,10,270,190)


ok.bind("<ButtonPress-1>",okpush)
cancel.bind("<ButtonPress-1>",cancelpush)

root.mainloop()
```
tkinterに関しては今回が最終です。
Ruby on Rails [学習記録-第13章-]

#記載内容の更新を行う
* 編集画面を作成することができたので、続いてツイートの更新機能を実装していく。
* ツイートを更新する際には/tweets/編集するツイートのidにpatchメソッドでアクセスする。

```rb:route.rb
Rails.application.routes.draw do
  devise_for :users
  root  'apps#index'
  get   'apps'      =>  'apps#index'
  get   'apps/new'  =>  'apps#new'
  post  'apps'      =>  'apps#create'
  delete  'apps/:id'  => 'apps#destroy'
  patch   'apps/:id'  => 'apps#update'
  get   'apps/:id/edit'  => 'apps#edit'
  get   'users/:id'  =>  'users#show'
end
```
* 更新する際にはtweetsコントローラのupdateアクション。

```rb:
class AppsController < ApplicationController

  before_action :move_to_index, :except => [:index]

  def index
    @apps = App.includes(:user).page(params[:page]).per(5).order("created_at DESC")
  end

  def new
  end

  def create
    App.create(image: tweet_params[:image], text: tweet_params[:text], user_id: current_user.id)
  end

  def destroy
    app = App.find(params[:id])
    if app.user_id == current_user.id
      tweet.destroy
    end
  end

  def edit
    @app = App.find(params[:id])
  end

  def update
    tweet = App.find(params[:id])
    if app.user_id == current_user.id
      app.update(app_params)
    end
  end

  private
  def app_params
    params.permit(:image, :text)
  end

  def move_to_index
    redirect_to :action => "index" unless user_signed_in?
  end
end
```

#更新後のビューファイルを追加
```html:update.html.erb
<div class="contents row">
  <div class="success">
    <h3>
      更新が完了しました。
    </h3>
    <a class="btn" href="/">投稿一覧へ戻る</a>
  </div>
</div>
```
jQueryを利用することでアコーディオンやスライドショーが比較的簡単に実装できる

#はじめに
Progateの教材を利用してjQueryを一通り学んだので、<a href="https://qiita.com/abe-rubi/items/60b9d7501493dd922ca1">　『前回の投稿』　</a>の4.項で述べたように、実際にjQueryを活用して一つのページを作ってみました。
これらの内容についての記録としてこの記事に残します。

#今回jQueryで行ったこと
主に、アコーディオンの実装と、スライドショーを作ってみました。
今まで「ライブラリ」と言う物があまりピンと来てなかったのですが、実際にjQueryを利用することで、その便利さを実感することができました。

#実際に作成した物
非常に殺風景で未だにボタンを配置しただけでほとんどの物が機能していないので、お見苦しいのですが、以下のようなページを作成しました。
以下の一つのページを作るのに3日ほど費やしました。
モデルはQiitaのつもりで作成しています。

+ 公開webページ:
https://abe-rubi.github.io/myPage/

![myPage画像.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415956/bcd21229-6da9-0ec7-4cef-8a80556b6d14.png)

このページについて説明すると、
これまでの投稿に載せている成果物一覧ページを作りたいと思い、作成しています。
ヘッダーの部分やサブメニューはボタンなどの配置のみで、機能しておりません。
メインコンテンツの左右のサブメニューにアコーディオンにしてみたり、右のアプリリストからアプリを選択すると、そのアプリの画像が表示されるようにしています。
また、表示されたアプリの画像をクリックすることで、実際のアプリ(webページ)へ飛ぶようにしています。

アコーディオンを記述する際に、ProgateではslideUp(),slideDown()をそれぞれ利用していたように思いましたが、slideToggle()を利用することでより簡単に書くことができました。
これについて、以下に記します。

以下のコードは”left-headerクラス”がついている『Sub Menu.』の文字の部分をクリックするとサブメニュー(メインコンテンツ左側)が開閉できるようにしています。

```jQuery:slideUp(),slideDown()
$('.left-header').click(function() {
   var $li1 = $('.submenu-body').find('li');
   if($li1.hasClass('open')) {
     $li1.removeClass('open');
      $li1.slideUp();
     $(this).find('span').text('▼');
   } else {
     $li1.addClass('open');
     $li1.slideDown();
     $(this).find('span').text('▲');
   }
 });
```

上記のコードはslideUp(),slideDown()の両方の処理を記述し、さらに自分で('.open')クラスを付け外しする必要がありましたが、以下に記述するslideToggle()を用いることで、slideのUp&Downを一まとめに記述することができ、toggleClass()を用いることで一括で('.open')クラスを付け外しすることが可能です。

```jQuery:slideToggle()
$('.left-header').click(function(){
  $('.li1').toggleClass("open").slideToggle();
  if($('.li1').hasClass('open')){
    $('.left-header').find('span').text('▼')
  }else{
    $('.left-header').find('span').text('▲')
  }
});
```

調べれば調べるほど、次から次へと色んな書き方が出てきます…。

#おわりに
jQueryを使う事でライブラリの便利さを実感することができました。
現在はslickでスライドショーを実装してみたいと思い悪戦苦闘中しています。
イメージ画像がずれたり、意図しない空白が空いてしまったりしているので、解決して綺麗に実装できたら実装例として載せられればと思います。

以上、このような投稿を最後まで読んでいただきありがとうございました。
はじめてのC++【50日目】

# はじめに
`Linkedin　Learning`　は日本語ではなく英語で検索してみると、物凄い数の動画がありました。日本語だと２コースしかなかった `C++講座` も 英語検索だと40種類以上もあった。これは、英語から逃げてきた私が英語を学ぶときがきた。 やはり、情報系は `英語`　大切だなぁ、、、。
ちなみに `Go` の動画も英語versionならあった、、、。
## C++
### スマートポインタ
前にも一度スマートポインタをしたが、便利さはわかったけど使い方がいまいちわからなかったのでもう一度スマートポインタについて調べてみる。

**スマートポインタとは？**
スマートポインタとは、 `new`や `delete` を勝手にしてくれる便利なポインタ変数である。

**使ってみる**

```cpp:smartpointer
#include <iostream>
#include <memory>

//構造体を定義
struct X {
  ~X()
  {
    std::cout << "~X()" << std::endl;
  }
  int AAA( int a )
  {
    return a * 2;
  }

};

int main()
{
  int a = 5;
  std::unique_ptr< X > ptr { new X() }; //shared_ptrでもOK

  std::cout << ptr->AAA(5) << std::endl;

}
```
```:実行結果
10
~X()
```
`std::shared_ptr`　と　`std::unique_ptr` の違いは、共有ができるかどうかである。`unuque_ptr`はコピー不可能なクラスである。しかし、 `std::move` を使うことで所有権を譲渡することができる。そのかわり、`shared` に比べて　処理が早い。

**譲渡ってなに？**

```test.cpp
#include <iostream>
#include <memory>

//構造体を定義
struct X {
  ~X()
  {
    std::cout << "~X()" << std::endl;
  }
  int AAA( int a )
  {
    return a * 2;
  }

};

int main()
{
  int a = 5;
  std::unique_ptr< X > ptr { new X() };

  std::unique_ptr< X > ptr2 = std::move(ptr);


  std::cout << ptr2->AAA(10) << std::endl;

  std::cout << ptr->AAA(5) << std::endl;

}
```
```:実行結果
20
10
~X()
```
ん？ん？？？？
`ptr` から `ptr2` に譲渡したら `ptr` は使えなくなるものだと思ってたけど違うみたい。
`ptr`を開放しても `ptr2`　には何も影響を及ぼさないが、 `ptr2`　を開放すれば、 `ptr` も開放されるってことかな。また明日調べてみる。

**`make_shared使ってみた`**

```make.cpp
#include <iostream>
#include <memory>

//構造体を定義
struct X {
  ~X()
  {
    std::cout << "~X()" << std::endl;
  }
  int AAA( int a )
  {
    return a * 2;
  }

};

int main()
{
  int a = 5;
  auto ptr = std::make_shared< X >() ;



  std::cout << ptr->AAA(5) << std::endl;

}
```
```:結果
10
~X()
```
`std::make_shared` を使うと `new` も `delete` も使わない！ でも、 `shared_ptr` などと違い `auto`　に入れる必要がある。

# 終わりに
スマートポインタに対して、苦手意識が消えたのでこれからは積極的に使っていこうと思う。
やはり、動画は本と違い、頭に入って来る。明日からはロベールとlinkedinの英語の動画を進める。
50日目いったから、目次みたいなページ作って、何日目で何やったかとかをまとめたい。（前書いたスマートポインタのページ探すのとても辛かった笑）
[実践編(1)] skeleton framework のエラー対処

# Module could not be initialized

以下のapachコマンドを実行することでブラウザから叩くとコマンドラインにエラーが流れる

```vim

[root@localhost logs]# tail -f /etc/httpd/logs/error_log
```
 PHP Fatal error:  Uncaught Zend\\ModuleManager\\Exception\\RuntimeException: Module (Zend\\Form) could not be initialized. in /var/www/html/sample/vendor/zendframework/zend-modulemanager/src/ModuleManager.php:203

このようなエラーが出た場合は、モジュール名に対応するモジュールクラスを自動ロードできなかったために発生します。module.config.php、Module.phpやcomposer.jsonに定義していない場合に起こる。これらのファイルを見直す必要がある。※ 下リンク参考

上のエラーについては、以下をcomposer.jsonに入れてからcomposer installでzendライブラリが使えるようになる

```php


"require": {
        "php": "^5.6 || ^7.0",
        "zendframework/zend-component-installer": "^1.0 || ^0.3 || ^1.0.0-dev@dev",
        "zendframework/zend-mvc": "^3.0.1",
        "zfcampus/zf-development-mode": "^3.0",
        "zendframework/zend-db": "^2.8",
        "zendframework/zend-hydrator": "^2.2",
        "zendframework/zend-form": "^2.9",
        "zendframework/zend-mvc-i18n": "^1.0"
    },

```

# composer 以前インストールしたはずなのに'Could not open input file: composer.phar'と怒られるとき
```vim

$ php composer.phar update
Could not open input file: composer.phar
```
以下、コマンド(１～４のいずれか）で解決しました

```vim

curl -sS https://getcomposer.org/installer | php

1. php composer.phar update

2. composer update

3. ./composer update

4. /usr/local/bin/composer update
　4を実施する場合は、環境パスに設定する必要あり
sudo mv composer.phar /usr/local/bin/composer

```

※または、チームでやってる場合は、しっかり動いてる人の/vendorディレクトリを貰って/configや、/public などがあるアプリケーション配下に配置してあげると正しく動きます。

※ 補足として、/vendor ディレクトリを作るためのディレクトリを次として/var/www/html/hoge作って、そこに開発ディレクトリからcomposer.json をコピーしてきて、composer install やupdateコマンドを叩き、開発ディレクトリに新しくできた/vendorをコピーか移動をすることでよくわからない警告やエラーもなく普通に作ることができました。

# 参考
[http://rapidsol.blogspot.com/2016/08/module-zendform-could-not-be-initialized.html?m=1](http://rapidsol.blogspot.com/2016/08/module-zendform-could-not-be-initialized.html?m=1)
[https://github.com/zendframework/zend-modulemanager/issues/3](https://github.com/zendframework/zend-modulemanager/issues/3)
[https://stackoverflow.com/questions/17265447/zf2-module-could-not-be-initialized](https://stackoverflow.com/questions/17265447/zf2-module-could-not-be-initialized)
[http://www.z-f.fr/forum/viewtopic.php?id=9577](http://www.z-f.fr/forum/viewtopic.php?id=9577)
[https://stackoverflow.com/questions/40698939/module-cannot-be-initialized-zf3-already-searched-internet](https://stackoverflow.com/questions/40698939/module-cannot-be-initialized-zf3-already-searched-internet)
[https://akamist.com/blog/archives/246](https://akamist.com/blog/archives/246)
LoadError: cannot load such file -- haml

LoadError: cannot load such file -- hamlのエラーが出てかなり詰まったので、残しておきます。

##実行環境
- Ruby 2.5.1
- Rails 5.2.3

##実際に起きたエラー

```
rails aborted!
LoadError: cannot load such file -- haml
/Users/ユーザー名/mysite/koto_mono/config/application.rb:7:in `<top (required)>'
/Users/ユーザー名/mysite/koto_mono/Rakefile:4:in `<top (required)>'
/Users/ユーザー名/mysite/koto_mono/bin/rails:9:in `<top (required)>'
/Users/ユーザー名/mysite/koto_mono/bin/spring:15:in `<top (required)>'
bin/rails:3:in `load'
bin/rails:3:in `<main>'
```
とりあえず、bundle installしたが、直らず。。。

hamlのバージョンを確認。

```
＄gem list haml
haml (default: 5.1.1, 5.0.4)
```

fileがないとのことなので、以下のコマンドでファイルが存在するかどうか確かめました。

```
find ~/.rbenv -type f | grep haml
```

すると、

```
/Users/ユーザー名/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/haml-5.0.4/.yardopts
/Users/ユーザー名/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/haml-5.0.4/REFERENCE.md
/Users/ユーザー名/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/haml-5.0.4/haml.gemspec
/Users/ユーザー名/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/haml-5.0.4/bin/haml
/Users/ユーザー名/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/haml-5.0.4/CHANGELOG.md
.
.
.
.

```
とたくさんコードが出てきますが、、、あれ？
5.0.4のファイルはあるのに、5.1.1のファイルがない！？


##解決策
ということでhamlの5.1.1を入れ直します。

```
$ gem uninstall haml -v 1.14.3
$ gem install
```
これで rails sすると、エラーが消えました。
PHPの文字列結合

自分がいつも使っているのは

```php
'a' . $string . 'c'
```

だけど

```php
"a{$string}c"
```

という書き方も出来るが、何故自分がそう書かないようなったのかのメモ

---

```php
"/{$string}/{$string}"
```

みたいな記述を見る度に見やすいので、こっちの方が良いのかなと思ったりするが、やっぱり`''`には改行コードや変数を展開しないという明確な意図があるので`''`で良いと思ったから。

例)　**\nという文字列と改行を含んだ文字列を""に入れてしまうと出力時に違いが無くなってしまう。**

```php
$string1 = "あいうえお\nかきくけこ
さしすせそ";

$string2 = 'あいうえお\nかきくけこ
さしすせそ';

var_dump($string1, $string2);
```

```
string(48) "あいうえお
かきくけこ
さしすせそ"
string(49) "あいうえお\nかきくけこ
さしすせそ"
```