OmniAICreator/Qiita-1.07M huggingface dataset:
Yes/Noの対話形式でnodejs使う

nodejs使うときに対話形式で確認するやり方を書きます。

# インストール
モジュールをインストール

```shell
$ npm i --save readline-sync colors
```

# 使い方
`keyInYN`でy/nで答えて、後続の処理を続けるか、やめるか判断する
（colorsはconsoleに色をつけるだけ）

```javascript:test.js
const readlineSync = require('readline-sync')
const colors = require('colors/safe')

if (readlineSync.keyInYN('本当に実行しますか？')) {
  console.log(colors.green('実行します。'))
} else {
  console.log(colors.yellow('キャンセルしました。'))
  process.exit()
}

console.log('後続の処理')
```

## 実行
`test.js`を実行します。

```shell
$ node test
```

## 出力結果
```console
実行します。
後続の処理

or

キャンセルしました。
```

# 参考文献

この記事は以下の情報を参考にして執筆しました。

- [readline-sync - npm](https://www.npmjs.com/package/readline-sync)
- [colors - npm](https://www.npmjs.com/package/colors)
ruby on railsの開発環境構築

##仮想環境


Vagrant(仮想環境を簡単に構築・管理するツール)
VirtualBox(PC上で別のOSをインストールするための仮想化ソフト)
CentOS(Linux)

Vagrantをインストール
https://www.vagrantup.com/downloads.html
VirtualBoxをインストール
https://www.virtualbox.org/wiki/Downloads

CentOS インストール用のディレクトリ（Windows では フォルダ）を作成

    mkdir -p project/centos7
    cd -p project/centos7

仮想環境（VirtualBox）へ、CentOS 7 をインストール

    vagrant init centos/7  # CentOS7用のVagrant設定ファイルを作成する

Vagrantfileファイルがカレントディレクトリへ作成される
仮想環境の上 CentOS の IP アドレスを指定するためにコメントを外す

    # config.vm.network "private_network", ip: "192.168.33.10"
    ↓
    config.vm.network "private_network", ip: "192.168.33.10"

仮想環境を起動

    vagrant up

仮想環境上のCentOS にログイン(ここからは仮想環境上での操作)

    vagrant ssh

selinuxを無効化 ※再起動必要

    sudo sed -i "s/\(^SELINUX=\).*/\disabled/" /etc/selinux/config

rbenv をインストール(Rubyのバージョンを変更するためのツール)
まずは必要なパッケージをインストール

    sudo yum install -y git gcc openssl-devel readline-devel zlib-devel sqlite-devel gcc-c++ libicu-devel cmake vim

rbenv をインストール

    git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
    echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
    echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
    source ~/.bash_profile

rbenv が使えることを確認

    rbenv --version

rbenv へ Ruby をインストールできるようにするプラグインを追加

    git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build

Ruby をインストール(ver.2.4.2)

    rbenv install 2.4.2
 
CentOS環境全体で使えるrubyのバージョンを指定

    rbenv global 2.4.2    
 
ruby のバージョンや設定を反映

    rbenv rehash     
    
確認

    ruby -v
    
Bundler のインストール(Rubyのライブラリ管理ツール)

    gem install bundler

rbenv のバージョンや設定を反映

    rbenv rehash 

確認

    bundle -v

Ruby on Rails のインストール

    mkdir -p /home/vagrant/app/myapp  # インストールディレクトリを作成
    cd /home/vagrant/app/myapp

Gemfile ファイルを作成 

    bundle init
 
gem “rails” のコメントを外す

    sed -i 's/# gem "rails"/gem "rails", "~> 5.1.0"/g' Gemfile
 
Ruby on Rails と関連する gem を自動でインストールする

    bundle install --path vendor/bundler
 
Ruby on Rails の雛形を作成

    bundle exec rails new .

javascript のランタイムの gem のコメントを外す

    sed -i "s/# gem 'therubyracer'/gem 'therubyracer'/g" Gemfile
 
javascript のランタイムをインストールする

    bundle install

Ruby on Rails を起動

    ./bin/rails s -b 0.0.0.0

ブラウザで、以下にアクセスしてrailsが起動しているか確認
http://192.168.33.10:3000

## WindowsからCentOS上のファイルを操作できるようにする

### CentOs上の設定

ファイル共有用のデーモンであるsambaをインストール

    yum install samba

共有用のアカウントを作り，ホームディレクトリのパーミッションを777に変更

    adduser vagrant
    chown 777 /home/vagrant

sambaへユーザを登録
  ※パスワード聞かれるからご自由に

    pdbedit -a vagrant

samba.confの一番下に設定を追記
※Windowsのエクスプローラのパス欄に「\\<IPアドレス>\share」と入力するとアクセスできるようになる

    vim /etc/samba/smb.conf

以下の設定を追記

    [share]
        path = /home/vagrant
        writable = yes

デーモンをスタートアップへ登録し起動

    systemctl enable smb
    systemctl start smb

### Windowsでの設定

拡張機能のSMBクライアントを有効化
コントロールパネル⇒
プログラム⇒
Windowsの機能の有効化または無効化⇒
SMB 1.0/CIFSクライアント
にチェックをつけて『OK』

# 次回から開発環境起動まで

VagrantFileがあるディレクトリまで移動

    cd /Users/owner/project/centos7

仮想環境を起動

    vagrant up

仮想環境にログイン

    vargant ssh

rails起動

    ./bin/rails s -b 0.0.0.0

windowsのディレクトリ検索窓から

`\\192.168.33.10\share` にアクセス

    user：vagrant
    Password：vagrant
【SQL】「サブクエリ」と「相関サブクエリ」について

# サブクエリとは

- SQL文の中に入れ子になって書かれているSQL文のこと
- SQLの副問合せとも呼ばれる
- ちなみにクエリとはSQL文のこと

### サブクエリの例
```
Players テーブル            Competitions テーブル
+------+---------+         +------+-------------+
| id   | name    |         | id   | competition | 
+------+---------+         +------+-------------+
|    1 | メッシ    |         |    1 | サッカー      |
|    2 | 松井     |         |    2 | 野球        |
|    3 | 大谷     |         |    3 | 野球        |
|    4 | ネイマール |         |    4 | サッカー      |
|    5 | 錦織     |         |    5 | テニス       |
+------+---------+         +------+------------+  

```
とうテーブルがあるとして

サッカーをやっているプレイヤーのidと名前を取得したい時にサブクエリを使用すると簡単にかけます


```sql
SELECT * FROM players 
  WHERE EXISTS (SELECT * FROM competitions 
                         WHERE players.id = competitions.id 
                         AND competitions.competition = "サッカー");
```

これは二つのテーブルからidが同じ、かつcompetition(競技)がサッカーの人を取得するSQL文です

結果

``` 
Players テーブル    
+------+----------+ 
| id   | name     | 
+------+----------+ 
|    1 | メッシ     | 
|    4 | ネイマール | 
+------+----------+ 
```

このように"SQL文の中に書くSQL文"がサブクエリです
(今回はWHERE句のなかで使いましたがFROM句やSELECT文でも使えます)


# 相関サブクエリ とは

- 相関サブクエリはサブクエリの一種
- 外側のSQL文の値をサブクエリ内で使うことを言う

### 相関サブクエリの例

```
Playersテーブル
+------+--------+------+-------------+
| id   | name   | age  | competition | 
+------+--------+------+-------------+
|    1 | 佐藤    |  23 | サッカー       |
|    2 | 田中    |  35 | サッカー       |
|    3 | 桐谷    |  38 | サッカー       |
|    4 | 大島    |  42 | 野球          |  
|    5 | 松井    |  41 | 野球          |
|    6 | 後藤    |  35 | 野球          |
+------+---------+------+------------+  
```

このような様々なスポーツ選手が登録されているテーブルがあるとして

スポーツの種目ごとに平均年齢より年齢が若い選手を取得したい時、
相関サブクエリを使って取得することができる

```sql
SELECT name, age, competition
  FROM players as p1
 WHERE p1.age < (SELECT AVG(age) as avg_age
                   FROM players as p2
                  WHERE p1.competition = p2.competition);
```
結果

```
+--------+------+-------------+
| name   | age  | competition | 
+--------+------+-------------+
| 佐藤    |  23 | サッカー       |
| 後藤    |  35 | 野球          |
+---------+------+------------+  
```
上記のSQL文は、playersテーブル(p1)の年齢と、competition（競技)が同じ選手の年齢の平均年齢を比べて
平均年齢よりも年齢が低い人を取得しています。
この時に、サブクエリの中で外側のクエリの値を使っているので(WHERE p1.competition = p2.competition)
これが相関サブクエリとなる。


### まとめ
- サブクエリ
    - SQL文の中に入れ子になって書かれているSQL文のこと
- 相関サブクエリ
    - 相関サブクエリはサブクエリの一種
    - 外側のSQL文の値をサブクエリ内で使うことを言う

以上

参考記事
https://style.potepan.com/articles/17593.html
https://qiita.com/aki-takano/items/6df0513ccc5aa40a075a
PRML　演習問題 3.19（標準）　解答 

## 問題
> ベイズ線形回帰モデルの$\mathbf{w}$に関する積分が(3.85)で与えられることを示せ。したがって、対数周辺尤度が(3.86)で与えられることを示せ。

## 解答
> 
```math
\begin {align*}
E(\mathbf{w})=E\left(\mathbf{m}_{N}\right)+\frac{1}{2}\left(\mathbf{w}-\mathbf{m}_{N}\right)^{\mathrm{T}} \mathbf{A}\left(\mathbf{w}-\mathbf{m}_{N}\right)
\tag{3.80}
\end {align*}
```  
>
```math
\begin {align*}
E\left(\mathbf{m}_{N}\right)=\frac{\beta}{2}\left\|\mathbf{t}-\mathbf{\Phi} \mathbf{m}_{N}\right\|^{2}+\frac{\alpha}{2} \mathbf{m}_{N}^{\mathrm{T}} \mathbf{m}_{N}
\tag{3.82}
\end {align*}
```  

```math
\begin {align*}
\int \exp \{-E(\mathbf{w})\} \mathrm{d} \mathbf{w} =\exp \left\{-E\left(\mathbf{m}_{N}\right)\right\}(2 \pi)^{M / 2}|\mathbf{A}|^{-1 / 2}
\tag{3.85}
\end {align*}
```  
まずは、単純に上の(3.85)が成り立つことを示せばよく、実際に積分を計算すると、(3.82)より$E\left(\mathbf{m}_{N}\right)$は$\mathbf{w}$の関数ではないため積分の外に出すことができる。

```math
\begin {align*}
\int \exp \{-E(\mathbf{w})\} \mathrm{d} \mathbf{w} =\exp \left\{-E\left(\mathbf{m}_{N}\right)\right\} \int \exp \left\{-\frac{1}{2}\left(\mathbf{w}-\mathbf{m}_{N}\right)^{\mathrm{T}} \mathbf{A}\left(\mathbf{w}-\mathbf{m}_{N}\right)\right\} \mathrm{d} \mathbf{w}
\end {align*}
```  
D次元ガウス分布は正規化されていることを使うと、今回$\mathbf{w}$の次元はMであるため、

>
```math
\begin {align*}
\frac{1}{(2 \pi)^{D / 2}} \frac{1}{|\Sigma|^{1 / 2}}\int  \exp \left\{-\frac{1}{2}(\mathbf{x}-\mathbf{\mu})^{\mathrm{T}} \Sigma^{-1}(\mathbf{x}-\mathbf{\mu})\right\}d\mathbf{x} = 1
\end {align*}
```  

```math
\begin {align*}
\int \exp \{-E(\mathbf{w})\} \mathrm{d} \mathbf{w} =\exp \left\{-E\left(\mathbf{m}_{N}\right)\right\}(2 \pi)^{M / 2}|\mathbf{A}|^{-1 / 2}
\tag{3.85}
\end {align*}
```  
よって、(3.85)が成り立つことを示すことができた。
また、対数周辺尤度は

```math
\begin {align*}
p(\mathbf{t} | \alpha, \beta)=\left(\frac{\beta}{2 \pi}\right)^{N / 2}\left(\frac{\alpha}{2 \pi}\right)^{M / 2} \int \exp \{-E(\mathbf{w})\} \mathrm{d} \mathbf{w}
\tag{3.78}
\end {align*}
```  

で表すことができ、(3.85)の結果と合わせると、

```math
\begin {align*}
p(\mathbf{t} | \alpha, \beta)=\left(\frac{\beta}{2 \pi}\right)^{N / 2}\left(\frac{\alpha}{2 \pi}\right)^{M / 2} \exp \left\{-E\left(\mathbf{m}_{N}\right)\right\}(2 \pi)^{M / 2}|\mathbf{A}|^{-1 / 2}
\tag{3.29}
\end {align*}
```  
この等式に対数を取ってやると、



```math
\begin {align*}
\ln p(\mathbf{t} | \alpha, \beta)=\frac{M}{2} \ln \alpha+\frac{N}{2} \ln \beta-E\left(\mathbf{m}_{N}\right)-\frac{1}{2} \ln |\mathbf{A}|-\frac{N}{2} \ln (2 \pi)
\tag{3.86}
\end {align*}
```  
よって対数周辺尤度が(3.86)で与えられることが示された。
BC Math用ceil・floor関数

# 概要
BC Mathを用いて計算をする過程で少し特殊なceil・floor関数が必要になったので，[このコード](https://stackoverflow.com/questions/1642614/how-to-ceil-floor-and-round-bcmath-numbers)を参考に作成しました．

# 実装
```php
function bcceil($number, $scale = null)
{
    if (strpos($number, '.') !== false) {
        [$integer, $decimal] = explode('.', $number);

        if (isset($scale)) $decimal = substr($decimal, 0, $scale);
        $decimal = str_replace('0', '', $decimal);

        if ($decimal === '' || $integer[0] == '-') return $integer;
        return bcadd($integer, 1, 0);
    }
    return $number;
}

function bcfloor($number, $scale = null)
{
    if (strpos($number, '.') !== false) {
        [$integer, $decimal] = explode('.', $number);

        if (isset($scale)) $decimal = substr($decimal, 0, $scale);
        $decimal = str_replace('0', '', $decimal);

        if ($decimal === '' || $integer[0] != '-') return $integer;
        return bcsub($integer, 1, 0);
    }
    return $number;
}
```

# 元のコードとの違い
小数点以下の桁数を指定しての切り上げ・切り捨てができるようになっています．具体的には`1.0010`という数に対して`$scale`を変化させると

| | 切り上げ後 |
| --- | --- |
| `bcceil('1.0010', 0)` | `'1'` |
| `bcceil('1.0010', 1)` | `'1'` |
| `bcceil('1.0010', 2)` | `'1'` |
| `bcceil('1.0010', 3)` | `'2'` |
| `bcceil('1.0010', 4)` | `'2'` |

このように動作します．これで含めたくない桁を除いて切り上げ・切り捨てができるようになりました(floorの方はあまり意味がない気もしますが)．

また，元のコードでは`bcceil`・`bcfloor`の実装に`bcround`が必要になっているのに対し，こちらのコードではそれぞれが単体で動くようになっています．

# 解説
`bcceil`について解説します．まず，

```php
[$integer, $decimal] = explode('.', $number);
```

とすることで，整数部と小数部に分割することができます(このような書き方は関数の返り値を受け取る際などに便利です)．次に桁数`$scale`の指定がある場合は，

```php
$decimal = substr($decimal, 0, $scale);
```

この部分で指定桁数まで切り出されます．その後，

```php
$decimal = str_replace('0', '', $decimal);
```

で`0`がすべて消去されます．したがって小数部がすべて`0`の場合に限り，`$decimal`は空文字となります．最後に

```php
if ($decimal === '' || $integer[0] == '-') return $integer;
return bcadd($integer, 1, 0);
```

この部分で切り上げるかどうかの判定を行うのですが，前述の通り`$decimal`が空文字の場合は小数部がすべて`0`であるので切り上げなし．小数部が残っている場合でも，負数の場合はプラス方向への切り上げになるので切り上げなし．正数の場合は切り上げが発生する，ということになります．

# 注意点
これらの関数の返り値を`int`型にキャストするとオーバーフローが起こる可能性があるので注意が必要です．組み込み関数の`floor`・`ceil`でも同様の理由から，返り値が`float`型になっています．
Kotlin で object って書くやつ

よく名前を忘れるので。

## [オブジェクト宣言](https://kotlinlang.org/docs/reference/object-declarations.html#object-declarations)

シングルトンを作るやつ。

```Kotlin:公式リファレンスより
object DataProviderManager {
    fun registerDataProvider(provider: DataProvider) {
        // ...
    }

    val allDataProviders: Collection<DataProvider>
        get() = // ...
}
```

## [オブジェクト式](https://kotlinlang.org/docs/reference/object-declarations.html#object-expressions)

匿名クラスのインスタンスを作るやつ。

```Kotlin:公式リファレンスより
window.addMouseListener(object : MouseAdapter() {
    override fun mouseClicked(e: MouseEvent) { /*...*/ }

    override fun mouseEntered(e: MouseEvent) { /*...*/ }
})
```

／以上
Webminのインストールと最低限のセキュリティ対策

# はじめに
Linuxサーバーを管理は、SSHで行うことがほとんどですが、**Webmin**を使うとブラウザから操作できて結構便利です。しかし、デフォルトの設定のまま利用しているとセキュリティ的に脆弱ですので、せめてポート変更くらいはしておくべきです。ということで、個人的な備忘録です。

## 環境
サーバー：CentOS 7.x

## やること
- Webminのインストール (yum)
- Webminのポートを変更する
- firewalldの設定（ポートの開放）
- (おまけ）***もっとセキュリティをあげるには･･･。***

## webminをインストール (yum)
以下のサイトから、最新のWebminのRPMを指定する。
http://download.webmin.com/download/yum/

```shell
yum -y install http://download.webmin.com/download/yum/webmin-1.941-1.noarch.rpm
```

## Webminのポートを変更する


ポートは任意のポートに変えましょう。
（例では**10101**にしていますが、真似はせずに適当に決めた方が賢明です）

```conf:/etc/webmin/miniserv.conf
port=10101 <- 使ってない任意のポートに変更
:
```

変更が完了したら、Webminを起動させましょう。

```sh
systemctl start webmin
```

常時起動させたい場合は以下のコマンドも併せて実行しておきましょう

```sh
systemctl enable webmin
```

上記のsystemctlが動かない、見つからない場合は、serviceコマンドと、chkconfigコマンドで、対応。

```sh
service webmin start
chkconfig webmin on
```


## firewalldをの設定（ポートの開放）

fairewalldが起動してなければ起動させる。

```shell
systemctl start firewalld
```

上記で変更したportを開放する。

```shell
firewall-cmd --add-port=10101/tcp --zone=public --permanent
```

設定を反映させる。

```shell
firewall-cmd --reload
```

## (おまけ）もっとセキュリティをあげるには･･･。

ポートを変えておくだけでも、単純な不正アクセスに対しては有効かと思いますが、ポートを変えてフルアタックされた場合には、いずれログイン画面に辿り着けてしまいます。そもそも、Webminを使うタイミングというのは、頻繁ではありません。なので、使うときだけ起動させるのが一番セキュリティ的には良いでしょう。

```sh
# 常時起動を解除
systemctl disable webmin
```

```sh
# Webminを利用するときに起動
systemctl start webmin

# Webminを利用終わったら停止
systemctl stop webmin
```
Error: No module factory available for dependency type: CssDependency

# Error: No module factory available for dependency type: CssDependency
windows環境で、Vue CLIを使用して作成したプロジェクトをBuildする時に、以下の様なエラーが出た。

```powershell
PS C:\Users\---\git\hoge> yarn build
yarn run v1.19.1
$ vue-cli-service build

ERROR  Error: No module factory available for dependency type: CssDependency
Error: No module factory available for dependency type: CssDependency
    at addDependency (C:\Users\---\Git\hoge\node_modules\webpack\lib\Compilation.js:800:12)
    （以下略
```

## 原因

ディレクトリを移動した時に、ディレクトリ名にしていたGitをgitと打ち間違って、そのまま作業していたのが原因でした。
PowerShellではディレクトリ名の大文字小文字を間違えてもある程度柔軟に処理してくれるので、なかなか気づかなかったのですが、それが今回は仇になりモジュールがパスを見失っていたようでした。

```powershell
誤) C:\Users\---\git\hoge
正) C:\Users\---\Git\hoge
```

## 解決方法
正しいパスで入り直して実行したら特に問題無くビルド出来ました。

```powershell
PS C:\Users\---\git\hoge> cd C:\Users\---\Git\hoge
yarn build
```

# 参考
[Error: No module factory available for dependency type: CssDependency · Issue #5043 · vuejs/vue-cli](https://github.com/vuejs/vue-cli/issues/5043)
AtCoder C問題埋め 0610

#ABC149 Next Prime

<img width="829" alt="スクリーンショット 2020-06-10 16.48.10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269213/4a742a97-fb76-49e7-85b8-9b3d74ab74e0.png">

素数判定をしよう．

もちろんライブラリを使ったり，ネットに載ってるアルゴリズムを使ったりしてもよいのですが，自分の実力で勝負するのも大切かなと最近は思っております．
というわけで今回は実力そのまま，プロのプログラマーが見たら卒倒するようなコードで挑むことにしました．

```Python 
from sys import stdin

input=stdin.readline

def isPrime(x):
  for div in range(2, x // 2 + 1):
    if x % div == 0:
      return False

  return True

X = int(input())

if isPrime(X):
   print(X)
   exit()

while (X < 10 ** 5):
  X+=1
  if isPrime(X):
    print(X)
    exit()

#100000より大きい素数のうち最小のもの
print(100003)
``` 

ヤバいですね．
しかしこういうコードをRejectされることで，人は成長できると信じて投稿.

<img width="1111" alt="スクリーンショット 2020-06-10 15.01.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269213/68b72657-a01b-03d0-b430-4b04c6477130.png">

ええ…

流石にコレで「AC！やったね！」で終わるのはヤバすぎる．

もうちょっとがんばりましょう．

```Python
from sys import stdin
import math

input=stdin.readline

def isPrime(x):
  if x % 2 == 0:
    return False
  for div in range(3, math.floor(x **(0.5)) + 1,2):
    if x % div == 0:
      return False

  return True

X = int(input())
if X == 2:
  print(2)
  exit()

if X % 2 == 0:
  X+=1

if isPrime(X):
   print(X)
   exit()

while (True):
  X += 2
  if isPrime(X):
    print(X)
    exit()


```

 - 素数判定時，偶数で割らない
 - そもそも偶数を素数判定しない

など．ちょっと改良しました．
<img width="1141" alt="スクリーンショット 2020-06-10 16.15.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269213/84675863-b240-4f3f-a63f-da7d28a89f78.png">
誤差ですね．
そこそこ時間を描けてこねくり回したプログラムが，テキトーに実装した頭悪いソースコードと大差ないタイムで通過したのを見て，「競技プログラミングに求められる技術とはなんだろう」という気持ちになります，

下手に頭をこねくり回して数学を使ったりしてみるよりは，網羅性があって実装がラクな手段を取るべきなのでしょうか．
そのへんは戦略なのかな…

計測を忘れてましたが，多分15minほど．

#ABC149 Snack
><img width="702" alt="スクリーンショット 2020-06-10 16.43.10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269213/e996827b-013a-a092-92f6-559f5c716974.png">

AでもBでも割り切れる最小の値ということは，最小公倍数ですね．
AとBの最小公倍数は$A\times B \div (AとBの最大公約数)$で求められます．

AとBの最大公約数を求める問題に帰着できました．

筆者は大学生なので，ユークリッド互除法が使えることを知っています．

```Python
from sys import stdin

input=stdin.readline

#ユークリッド互除法
def gcd(a, b):
  dekai = max(a, b)
  tiisai = min(a, b)
  
  div = dekai % tiisai
  next_dived=tiisai
  #次割られるのは，さっき割り込んできたやつ
  #次割るのは，さっきの計算で出た余り
  while (div != 0):
    tmp=div
    div = next_dived % div
    next_dived=tmp

  return next_dived

A,B=map(int,input().split())

#print(gcd(A,B))

print (A*B//gcd(A,B))
```
終わりですね．ユークリッド互除法の実装で頭がグルグルしましたが，それ以外は問題なし．

<img width="1097" alt="スクリーンショット 2020-06-10 16.46.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269213/42a8b05e-0a2c-2af8-b8c6-588f79b0a893.png">


21min.
できることをやっただけなのであんまり学びがないですね．

##総括

目標としている競技プログラミングの先輩が，ABCの一桁番台までしっかりC問題埋めしているのに対し，自分はまだ150番あたりにいるので
1日10問解いても，2週間ぐらいかからないと追いつかない...

自分を鍛え直す意味でチャレンジしてみても良いかもですね．
というわけで今日はとりあえずあと8問くらい解きます．
沈み込むボタンの作り方

まず、ボタンをHTML、今回はaタグで始める

```html
<a href ="" class="contact">ボタン</a>

```

続いて、CSS

```css
.contact {
  color: white;
  display:inline-block;
  background-color: #5dca88;
  opacity: 0.8;  
  padding: 15px 40px; 
  margin-bottom: 80px;
  cursor: pointer;
  box-shadow: 0 7px #1a7940;
}

※大事な部分はここ
.contact:active {
  position: relative;
  top:7px;
  box-shadow :none  
}


```
Gitの流れ(情報取得まで)

#GitHubから情報を取得するまでの流れ#

##リモートの情報確認する方法##
・**git remote**
このコマンドでリモート名を表示する事ができる。

対応するURLを確認する場合このコマンドに**-v**を加える事で見る事ができる。

```terminal
git remote -v
```
今回の場合このように表示されます。↓

```terminal
origin URL(fetch)
origin URL(pull)
```

この**fetch**と**pull**とは何でしょう。次にこれらを見ていきます。


##fetchとpushについて##

・**git fetch**
・**git pull**

これらは**リモートから情報を取得するコマンド**


なぜ二つあるのでしょうか？それぞれ見てみましょう。


###fetch###
fetchを使う事でリモートリポジトリからローカルリポジトリに情報を流して来てくれます。

その後**git merge**というコマンドでワークツリーに情報を流します。

使い方はこちら↓

```terminal
git fetch リモート名
```

###pull###
pullを使う事でリモートから一気に情報を取得する事が可能になりました。

使い方はこちら↓

```terminal
git pull リモート名　ブランチ名

or

git pull
```

これ見てる限りだとpullの方が便利じゃねと思いますが、次にpullのメリット・デメリットについてみていきましょう。

###pullのメリット###
・慣れれば一気にできるので便利

###pullのデメリット###
・**masterが二つ以上**ある場合、管理がしっかりできない（**自分がどこのブランチにいるかの確認**）と**片方のブランチにもう片方のブランチをマージしてしまう**恐れがある。



おすすめとして、慣れるまでは**fetch**を使った方がいいです。


次でgitは最後になります。
次回は細かなところまで見ていきます。

第一回（コミットまで)[https://qiita.com/juki1007/items/e45f8f753a01d9788015]

第二回（pushまで）[https://qiita.com/juki1007/items/61d5a9eb985be9d75323]
Javaが既存のPDFドキュメントにページ番号を追加する

日常業務では、PDF文書の読み取り、検索、管理を容易にするために、PDF文書にページ番号を追加する必要があることがよくあります。 そこで、Free Spire.PDF for Javaを使用して、JavaプログラムでPDF文書にページ番号をすばやく追加する方法を紹介します。

**まず、参照用に結果グラフを配置します：**
![page numbers.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/28ff65e4-e9cf-f083-082e-7a65b228181c.png)


**基本的な手順：**
**1.** [Free Spire.PDF for Java](https://www.e-iceblue.com/Download/pdf-for-java-free.html)パッケージをダウンロードして解凍します。
**2.** libフォルダーのSpire.Pdf.jarパッケージを依存関係としてJavaアプリケーションにインポートします。（Mavenリポジトリから直接JARパッケージをインストールすることもできます（pom.xmlファイルを構成するコードについては、以下を参照してください））。。
**3.** Javaアプリケーションで、新しいJava Class（ここではAddPageNumbersという名前）を作成し、対応するJavaコードを入力して実行します。

**pom.xmlファイルを構成します：**

```java
<repositories>
   <repository>
      <id>com.e-iceblue</id>
      <name>e-iceblue</name>
      <url>http://repo.e-iceblue.com/nexus/content/groups/public/</url>
   </repository>
</repositories>
<dependencies>
   <dependency>
      <groupId>e-iceblue</groupId>
      <artifactId>spire.pdf.free</artifactId>
      <version>2.6.3</version>
   </dependency>
</dependencies>
```

**Javaコード例：**

```java
import com.spire.pdf.PdfDocument;
import com.spire.pdf.automaticfields.PdfCompositeField;
import com.spire.pdf.automaticfields.PdfPageCountField;
import com.spire.pdf.automaticfields.PdfPageNumberField;
import com.spire.pdf.graphics.*;

import java.awt.*;
import java.awt.geom.Dimension2D;
import java.awt.geom.Rectangle2D;

public class AddPageNumbers {

    public static void main(String[] args) {

        //PDFドキュメントをロード
        PdfDocument doc = new PdfDocument();
        doc.loadFromFile("file1.pdf");

        //フォントを作成
        PdfTrueTypeFont font = new PdfTrueTypeFont(new Font("宋体", Font.PLAIN, 10),true);

        //ページサイズを取得する
        Dimension2D pageSize = doc.getPages().get(0).getSize();

        //y座標を初期化する
        float y = (float) pageSize.getHeight() - 40;

        //ドキュメントのページを反復処理します
        for (int i = 0; i < doc.getPages().getCount(); i++) {

            //ページ番号フィールドの初期化
            PdfPageNumberField number = new PdfPageNumberField();

            //総ページ数フィールドを初期化する
            PdfPageCountField count = new PdfPageCountField();

            //複合ドメインを作成する
            PdfCompositeField compositeField = new PdfCompositeField(font, PdfBrushes.getBlack(), "ページ{0}合計{1}", number, count);

            //设複合フィールドにテキストの配置を設定する
            compositeField.setStringFormat(new PdfStringFormat(PdfTextAlignment.Right, PdfVerticalAlignment.Top));

            //文字サイズの測定
            Dimension2D textSize = font.measureString(compositeField.getText());

            //PDFページの複合フィールドの位置とサイズを設定する
            compositeField.setBounds(new Rectangle2D.Float(((float) pageSize.getWidth() - (float) textSize.getWidth())/2, y, (float) textSize.getWidth(), (float) textSize.getHeight()));

            //複合フィールドをPDFページに追加する
            compositeField.draw(doc.getPages().get(i).getCanvas());
        }

        //ドキュメントを保存します
        doc.saveToFile("Numbers.pdf");
    }
}
```
全国統一プログラミング王決定戦予選   D - Restore the Tree

いつもは精進中になんか気づいたことがあったらTwitterでまとめちゃうんですが、この問題は結構長くなりそうなので記事にまとめることとして、書き始めたんですが、問題の制約を見落としてることにあとから気づいて、無駄記事になりました。

でもせっかく書いたので…

解説ACでした。

# 第一関門
**グラフ中に閉路や、根の方向に戻る辺は存在しません(これにすら気づかなくて解けなかった)**
これ関連の考察が個人的には最重要ポイントだったかなと思っています。

まぁ、後から読み返したら、問題文中に
###書き足された各辺u→vは、ある頂点uからその子孫であるような頂点vに向かって伸びています。
って書いてあったんですけど。

閉路が存在しないのは言われてみれば簡単な話で、例えば、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244678/bfbb25c1-81d9-dff1-bd41-e5a673ab3e2c.png)
こんな感じに閉路が存在したとすると、閉路を構成するどの矢印をなくしても、木が出来てしまいます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244678/0da0f1ba-9a3d-db26-bda2-ce3b190beec2.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244678/f4b16153-f454-2e48-8b26-b38a4fbc026f.png)

つまり、閉路が存在すると、どこを切っても木が出来、またその木が相異なりうるということで、条件
**元の木は一意に定まる。**
を満たさなくなってしまいます。

戻る辺に関しては一般的な図を書くのは難しいので書きませんが、この場合も2通り以上の木が出来てしまうので、戻る辺を書き足すことも出来ません。

これに気づけば後の発想は比較的楽で、**根に入っていく方向の矢印が書き足されていることは有りません**(書き足されているとそこに閉路が必ず出来てしまいます)。

つまり、入字数0のノードを見つけたら、根と考えることができます。

# 根が見つかった後。

こんな感じのものを元に考えます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244678/e0913a29-337e-9031-361f-d3c04d659af3.png)

さて、適当に辺を足してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244678/b2ee0317-dfde-968a-2bdb-c251ea7f7292.png)

たされる辺は制約上、所謂近道になるので、近道が出てきたらそれを無視してけばいいですね。
この近道を無視するというのが、結構厄介です。というのも

1. 何も考えずにBFSすると複数回頂点を訪れるのを排除できない関係上、深い探索を繰り返してTLEする。
2. 訪れた頂点を即pushしてしまうと、書き足された頂点による近道で、本来求めたいグラフでの距離よりも早く頂点がpushされてしまう(すると、この子孫達の順番も変わってぐちゃぐちゃになる)

ということで、以下の方針で実装したらなんか通りました。

1. 基本はBFS
2. 入次数をどうせ数えてあるので、それを使い果たすまでpushしない(つまり最後に訪れる≒近道していないタイミングまでまつ)

トポロジカルソートの方の解説はよくわかっていませんが、解けたので、ヨシ!(良くない)



#おわりに
制約はちゃんと読もう！
Gitでブランチを変更した時固まったまま。そしてRailsが起動しない。


###  <font color='lightblue'>背景</font>
Gitで「sync」ボタンを押してから、砂時計のまま（古い!?）、応答が返ってこない。処理中なのか、サスペンドしたままなのか…とりあえず、gitがタイムアウトを表示するまで待ってから、Railsを起動しようとすると、エラーメッセージが出て起動しない。

```
/app/config/boot.rb:4:in `require': cannot load such file -- bootsnap/setup (LoadError)
```
Railsの起動がらみの問題は多すぎて…もう呪われているのか…と思うほどです。

###  <font color='lightblue'>環境</font>
| 項目              |               内容 | 
|:-----------------|:------------------:|
| OS.Catalina      |           v10.15.4 |      
| Ruby             |            v2.5.1 |  
| Ruby On Rails    |           v5.2.4.3 |       


###  <font color='lightblue'>内容</font>
**対応１）bootsnapに対して`gem uninstall`を使用する**
→別のエラーが出たので、brewパッケージなども対応するも、復旧ならず。

**対応２）bootsnapのCacheを消す**
`CMD> cd アプリのパス/tmp/cache`
以下のファイルを削除する
`CMD> rm -i ./bootsnap-load-path-cache`
`CMD> rm -i ./bootsnap-compile-cache`

これで動くようになりましたが、次はRubyMineでRailsが動かず「rails server launcher was not found」が出ました。こちらも、「アプリのパス/.idea」のディレクトリを削除して対応しました！


###  <font color='lightblue'>参考記事</font>
[bootsnapのせいでRails5.2とかが動かない人へ](https://qiita.com/cyborg__ninja/items/d15b50500f4ffb069feb)
[Rubymine に rails server launcher was not found というエラーが出た場合の対処](https://www.d-wood.com/blog/2017/09/08_9255.html)
[Railsチュートリアル：rails serverでのエラー](https://qiita.com/Okame-chan/items/08d5d9d65e101735b1bc)
インクリメンタルサーチの機能実装

##本日のchatspace勉強会で新たに学んだ事項を簡単にまとめました（備忘録）


## what
　👉ユーザー検索の機能の実装

## why
　👉最終課題への対応力向上のため。

## how
◆onload : ページ遷移後（ページが読み込まれた時）に起動するイベント↓
cf）　
onload = function()

 【jQuery実装】
◆attr: 引数に指定した属性のデータを取得する

◆each: 配列のデータを繰り返し処理を行う関数↓（index、elementの2つの引数を使用し、elementでjs-chat-memberを受けた）
◆push:  引数の値を配列に追加する関数↓
cf)　
＄（'.js-chat-member'）.each（function(index,element）{
ids=$(element).attr('id');
userIds.push(ids);
});

要素検索
◆next(): 指定したセレクタの次の要素(node)を取得する。 
◆prev(): 指定したセレクタの前の要素(node)を取得する。
◆parent(): 指定したセレクタの親(node)を取得する。 

◆siblings(): 指定したセレクタと同じ階層の要素(node)を全て取得する。
👉filterメソッドと一緒に記述することでユーザーの選別の応用が効く
【Ruby】特定の文字をカウントするメソッド

# 概要
下記の問題が出された際、間違ったため備忘録として残します。
**【問題】
任意の文字列がいくつあるか数えてその数を出力するメソッドを作成して下さい**

# 私の回答
私は下記のような回答をしてしまいました。
※ちなみに、間違いです:sweat:

```Ruby:Ruby
def count_hi(word)
  puts word.count('hi')
end

word = "hi!hideyuki. hidemi."
count_hi(word)
```
本来は「３」が正解ですが、上記記述だと「８」となってしまいます:expressionless:

# 正解

```Ruby:Ruby
def count_hi(word)
  puts word.scan('hi').length
end

word = "hi!hideyuki. hidemi."
count_hi(word)
```
上記、記述だと「8」と表示されます:relaxed:

# 解説
**count**は"hi"ではなく、"h","i"それぞれの個数をカウントしてしまいます。

**scan**はマッチした部分文字列の配列を返します。
そのため、**length**が無いと下記のような表示となります。

```Ruby:Ruby
puts word.scah('hi')
# hi hi hi と表示されます
```
**length**は本来は文字列の文字数を返しますが、word.scan('hi').**length**とすることで、scanで返された配列をカウントすることとなります。

# 参考
[特定の文字の出現回数をカウントする - Ruby Tips!](http://rubytips86.hatenablog.com/entry/2014/03/28/133926)
[String#count (Ruby 2.7.0 リファレンスマニュアル) - Ruby-lang](https://docs.ruby-lang.org/ja/latest/method/String/i/count.html)
[String#scan (Ruby 2.7.0 リファレンスマニュアル) - Ruby-lang](https://docs.ruby-lang.org/ja/latest/method/String/i/scan.html)
[String#length (Ruby 2.7.0 リファレンスマニュアル) - Ruby-lang](https://docs.ruby-lang.org/ja/latest/method/String/i/length.html)
java BigDecimal型からString型へ型変換

javaにはもともとBigDecimalというクラスがあるみたいです。

初めてBigDecimal型の変数を宣言し、
最終的にBigDecimal型の変数をString型に変換したいと持った時にvalueOf()メソッドを使えばいいんじゃないかと思ったがBigDecimalには型変換用のメソッドがあるみたいでした


サンプル
<img width="506" alt="スクリーンショット 2020-06-10 16.09.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558198/9fa05b2a-a308-00a6-979c-0d31850115e3.png">

<簡単に説明>
まず上の方でBigDecimal型の変数宣言＆初期化をしております。
全部で３つの変数(right,left,decimalValue)があります。

次に、switch文でrightとleftの計算結果をdecimalValueに格納してます。

そして注目ポイントである型変換ですが、
String decimalValue1 = decimalValue.toString();
の部分が型変換をしています。

まず、変換した値を入れるdecimalVlue1を用意
その次に、toString()というBigDecimalが持っているメソッドを使ってdecimalValueを変換しております。
go-swaggerでエラーレスポンスをハンドルする

# 背景

swaggerに次のようなエラーレスポンスを追加したときに、クライアント側でどのようにハンドルして取り出すのか少し迷った。

```yaml
...
    responses:
      "500":
        schema: "#/definitions/Error"
        headers:
          X-Hogefuga:
            type: string
...
```

# クライアントでのハンドリング

`swagger generate client`で生成されるコードにエラーレスポンスの型情報があるので、型アサーションしてあげると取れる。例えば`500`だと`[...]InternalServerError`がそれにあたる。

```go
rep, err := api.Application.Get(params)
if reterr, ok := err.(*application.GetInternalServerError); ok {
  return fmt.Erorf("internal server error: %v[%s]", err, reterr.XHogefuga)
}
```
【GCP】某有名企業のセミナーに参加してみて（BeyondCorp,DX）

実績何百件を見せられると信頼がある。

BeyondCorpに関しては、過去にも聴いた記憶あり。

GCPの機能についても勉強になった

![Screenshot from 2020-06-04 18:20:55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/a34ed2d6-7943-8c53-346b-75c92e49bc96.png)

![Screenshot from 2020-06-04 18:21:30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/d5679f6e-ccf7-1368-ae54-bd79053f5daf.png)
![Screenshot from 2020-06-04 18:23:20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/2b72ecbf-3829-e09c-4cbc-5947f67dc39b.png)
![Screenshot from 2020-06-04 18:11:32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/5b193df0-0c54-5a59-0697-6746713e09fc.png)
![Screenshot from 2020-06-04 19:14:15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/0935a68b-b9f7-caa4-74dd-47337cc1620e.png)
Railsでデータが登録されない。


###  <font color='lightblue'>背景</font>
ActiveRecordを使用してデータを保存するとき、データが保存されていない時があります。
バリデーションですべることが多いので、整理しておきます。

###  <font color='lightblue'>環境</font>
| 項目              |               内容 | 
|:-----------------|:------------------:|
| OS.Catalina      |           v10.15.4 |      
| Ruby             |            v2.5.1 |  
| Ruby On Rails    |           v5.2.4.3 |       



###  <font color='lightblue'>内容</font>

あまり機会はないですが、例えば初期ユーザを作成するようなサービスがあった時。

```ruby:app/lib/make_default_data_service.rb
1    default_user = User.new
2    default_user.update_attributes(
3      id: 1,
4      password: 1111,
5      name: '未登録ユーザ',
6      email: 'example@test.com'
    )
```

サービスを実行すると、データが保存されていません。調査すると…

```
  User Exists (32.4ms)  SELECT  1 AS one FROM `users` WHERE `users`.`email` = BINARY 'example@test.com' LIMIT 1
  ↳ app/lib/make_default_data_service.rb:15
   (0.5ms)  ROLLBACK
```

「ユーザデータがすでに存在する？」とはき違えて、DBまで調査していました。
上記のソースの２行目を改修しました。

```ruby:（※改修後）app/lib/make_default_data_service.rb
1    default_user = User.new
2    default_user.update_attributes!(
3      id: 1,
4      password: 1111,
5      name: '未登録ユーザ',
6      email: 'example@test.com'
    )
```

すると。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647299/f15010f7-4194-7852-367f-6e72b97ac32f.png)

パスワードの文字数規約に反していたようですね。分かりやすくなりました。
save　→　save!メソッドに置き換えてもokですね。デプロイはダメなパターンですが…。
以上です。
【CSS】ブロック要素の大きさがpaddingで勝手に変わる問題

## はじめに
cssでマークアップをしていると、ブロック要素の大きさ（幅、高さ）を指定しているのに、paddingを効かせるとブロック自体の大きさが余計に大きくなってしまうことがないですか？

それを解消する方法を紹介します。

## 現象
具体的にどんなことが起こるか見てみましょう！
まずは適当な大きさのブロックを用意します。

```haml:htmlファイル
<div class="block">
  ブロック要素です
</div>
```
```css:cssファイル
.block {
  height: 100px;
  width: 160px;
  background-color: lightblue;
}
```
<img width="645" alt="bdc31a5f317b0ff5cf695b2d0b4b6c32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605568/36efbcfe-da91-ddbc-0c39-8005d34fc6d6.png">

ここまでは特段問題ないですね。
これにpaddingを効かせると、その分ブロック要素も広がってしまいます。

```css:cssファイル
.block {
  height: 100px;
  width: 160px;
  padding: 20px;
  background-color: lightblue;
}
```
<img width="647" alt="3353e0b121beb61dcddc2a506c4b182e.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605568/b67e4171-bbb4-e2b1-d6ce-0f8b17afbab0.png">

これだとpaddingの変更に合わせてブロック自体の大きさも変更していく必要があり、かなり面倒です。直感的にもpaddingはブロック要素の内側だけ余白をつけるように動作してほしいですよね。

## 対策
プロパティに```box-sizing: border-box;```をつけるだけです。
実際にやってみましょう！

```css:cssファイル
.block {
  box-sizing: border-box;
  height: 100px;
  width: 160px;
  padding: 20px;
  background-color: lightblue;
}
```
<img width="541" alt="401afcd163aa99aa22c9c5437484b766.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605568/82344b48-8f0a-b396-9b56-afe9e7b8cf90.png">

うまくいってますね！
ブロック要素全部に記述するのは面倒なので、実際の使い方としては、```* { box-sizing: border-box; }```みたいにデフォルトで全部に効くようにしておくと良いかと思います。

## 最後に
簡単な内容ですが、初学者は特に知らないと苦労するポイントだと思います。
自由にCSSを操れるように頑張りましょう！
Power ShellでActive Directoryを操作する

# Power Shell から Active Directoryを操作する方法

## 事前準備
以下のサイトから[Windows 10 用のリモート サーバー管理ツール]を落としてインストールが必要です。

<https://www.microsoft.com/ja-jp/download/confirmation.aspx?id=45520>

## AD 接続
インストールが完了したら、管理者モードでPowerShellを起動します。

Import-Module ActiveDirectory
で、ActiveDirectoryモジュールをロードします。
準備が整いましたので、コマンドを実行してみましょう。

ActiveDirectoryに参加している1つまたは複数のコンピューターを取得するには
### Get-ADComputer
を使用します。
### Get-ADComputer -Filter *
と入力すると、現在ActiveDirectoryに参加しているすべてのコンピューターを取得することができます。
美大生のためのプログラミング入門：基本的な四角形の描き方

※ Qiita では、本文部分のみの印刷に苦労します。そのため、同じ内容を以下のページにも掲載しています。プリンツアウトしたり PDF 化したい人は、こちらのページを利用して下しさい（同じ内容です）：

http://gurakura.sakura.ne.jp/hellomondrian/rect1/

# はじめに：四角形を描く

![composition-in-color-a-1917.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176385/7956f17e-40cd-2844-71d4-54679944fc34.jpeg)

　上の画像は Piet Mondrian の作品 Composition in Color A (1917 年)で、[https://www.wikiart.org/en/piet-mondrian/composition-in-color-a-1917](https://www.wikiart.org/en/piet-mondrian/composition-in-color-a-1917)
で見ることができます。

　直線の描き方については [前の章](http://gurakura.sakura.ne.jp/hellomondrian/line/)で説明しました。単に四角形の輪郭を描くだけであれば、line 関数を 4 回呼べば描画できます。

この章では、そのような描画方法ではなく、中を塗りつぶす四角形、つまり領域としての四角形の描き方について説明を行います。

# 基本的な四角形の描き方
　ウィンドウに対し、横線と縦線がそれぞれ平行な四角形の描画には rect 関数を使います。
rect 関数の引数は rect(x,y,w,h) で、それぞれ

	x = 四角形の左上頂点の x 座標
	y = 四角形の左上頂点の y 座標
	w = 四角形の横幅
	h = 四角形の高さ

となります。

rect による四角形の描画は、strokeWeight による線幅の設定、ならびに stroke による線の色の影響を受けます

```Java
background(250,250,250);
size(500,500);

strokeWeight(10);  // line width: 10 pixels.
stroke(0,64,255);  // line color: light blue.
rect(100,150,200,100);
```

![First Rect](http://gurakura.sakura.ne.jp/img/helloMondrian/first-rect.png)

　四角形内部の描画色は fill 関数で指定できます。この関数も stroke 関数と同様に様々な使用方法がありますが、RGB 値を指定する方法 fill(r,g,b) という使い方をここでは紹介します。

次に示すプログラムリストでは、輪郭線は先程のプログラムと同様に青色とし、内部を赤色で塗りつぶすよう指定しています。

```Python
background(250,250,250);
size(500,500);

strokeWeight(10);  // line width: 10 pixels.
stroke(0,64,255);  // line color: light blue.

fill(255,0,0);	   // <--- fill color: red.

rect(100,150,200,100);
```

![Rect2](http://gurakura.sakura.ne.jp/img/helloMondrian/rect2.png)

このように、四角形の描画では輪郭線の色と内部を塗りつぶす 2 種類の色についてきちんと管理しなければなりません。

　めんどくさいなぁ、と感じるかもしれませんが、プログラミングとはそういう作業の連続となります。なんともまぁ、地味で細かく、かつ、めんどくさい作業ですよね。なので、プログラマの人には優しくしてあげて下さい（いやホントに…）。

　このセクションの終わりとして、輪郭線を描かない方法を考えてみたいと思います。さて、どうすれば良いと思いますか？ 色々な考えがあるかと思います。

そもそも輪郭線を描かないように Processing に指示を出したら良いのでは？ と考えた人もいれば、輪郭線の幅を 0 とすれば消えるのでは？等など。これらの意見はどちらも正解です。

このように、プログラミングにおいては、同じ効果を得る手段として複数の方法が存在します。

もちろん、場合によっては実行速度が異なる場合もあり、厳密には全く同じというものは少ないかもしれません。

しかし、実際のプログラミングでは、同じゴールに辿り着くために様々な方法が存在するというのはよくあることです。

　輪郭線をオフにする関数として noStroke 関数があります。これは引数を必要としない関数なので、実際のプログラムでは stroke(); として使用します。無効にした輪郭線を有効にするためには stoke 関数で輪郭線の色を指定して下さい。

noStroke 関数にて輪郭線をオフにしても、輪郭線の幅に関する情報はそのまま残っていますので、 2 番目の rect 関数にて描画される四角形の輪郭線は 10 ピクセルのままになっています。

```Python
background(250,250,250);
size(500,500);

strokeWeight(10);  // line width: 10 pixels.
stroke(0,64,255);  // set color, but disabled by noStroke
fill(255,0,0);
noStroke();
rect(100,150,200,100);

stroke(0,64,255);  // stroke ON (line color: light blue.)
rect(100,400,50,80);
```

![noStroke rect](http://gurakura.sakura.ne.jp/img/helloMondrian/noStroke.png)
PythonでPHPのshell_exec風にLinuxコマンド実行する簡易版

サーバーのテスト環境作成時に、PythonでLinuxコマンドを実行したかった際のメモ。

まず、基本形は以下のとおりです。
コマンドは1行の文字列で実行できません。
コマンドと引数はリストにして渡してあげる必要があります。

> [重要]
> @shiracamus さんからレビューいただきました！
> リストで渡さなくても実行できるっぽい。

```python
import subprocess

# 間違い
# subprocess.call( 'cp -a test.txt text2.text' )

# リストに分割して実行が正しい
subprocess.call( ['cp', '-a', 'test.txt', 'text2.text'] )

# 
```

ただ、リストで渡すのめんどい。。。
Linux上で簡易実行テストしたコマンドをいちいちリストにしてられないし、メンテナンス性も悪い。移植バグも起こりやすいし。
PHP なら shell_exec() 関数で文字列から簡単にLinuxコマンドを実行できるのに。。。
しょうがないのでPHP風の簡易ラッパー関数を作りました。

```python
import subprocess

def shell_exec(cmd: str):
    """
    Shell execute.
    """
    for cmd_line in cmd.splitlines():
        subprocess.call(cmd_line.strip().split())
```

仕様はすごく簡単

1. テキストを行ごとに分割
2. 実行するコマンドの前後の空白をトリム
3. 実行するコマンドを空白で分割しリスト化する
4. コマンド実行

使用方法は以下のような感じで、複数行のコマンドを1行ずつ実行可能です。

```python
shell_exec(""" cd /home/test
               touch test.txt
               cp -a test.txt text2.text """)
```

ただし、引数がダブルクォーテーションで囲まれているケース（引数内に空白が存在するケース）は考慮していません。
また、エラーも拾っていません。
**簡易版なので。**
iusの最新リンクが変更になったので注意


# エラーの経緯

`Error: Cannot find a valid baseurl for repo: ius/x86_64`

というエラーが出たので、iusを更新したかったのがきっかけ。マシンはCentOS-7.6.1810。
# エラーの内容

[CentOS7 に最新パッケージを導入出来るよう、IUS リポジトリを追加する](https://sig9.hatenablog.com/entry/2017/12/03/000000)を見て、次のコマンドを試した。

`yum -y install https://centos7.iuscommunity.org/ius-release.rpm`

すると、次のようにエラーが出た。

`Loaded plugins: auto-update-debuginfo, fastestmirror
Cannot open: https://centos7.iuscommunity.org/ius-release.rpm. Skipping.
Error: Nothing to do`

# 解決策

調べたところ、[Cannot open: https://centos7.iuscommunity.org/ius-release.rpm が出たとき](https://omohikane.com/legacy_ius-release_rpm/)がヒットした。次のように書き換えればいいらしい。

`yum install -y https://repo.ius.io/ius-release-el7.rpm`

リンク先が変わっている。

[Deprecation of legacy ius-release.rpm redirect links](https://github.com/iusrepo/announce/issues/18)(「レガシーなius-release.rpmのリダイレクトリンクの非推奨」)を日本語にするとこんな感じ。

>    IUSは、ユーザが最新のius-releaseパッケージを使えるようにリンクを保持してきました。現在、リンクは我々のCDNにより提供されています。

 >   https://repo.ius.io/ius-release-el6.rpm
 >  https://repo.ius.io/ius-release-el7.rpm

 >   ius.ioドメインの前は、別のURLを指定していました。

>    https://rhel6.iuscommunity.org/ius-release.rpm
>   https://rhel7.iuscommunity.org/ius-release.rpm
>    https://centos6.iuscommunity.org/ius-release.rpm
>    https://centos7.iuscommunity.org/ius-release.rpm

>    サーバによる *.iuscommunity.org へのリダイレクトは2020年6月1日で廃止されます。このサイトはかなりの期間、新しいURLを通知してきました。
    旧URLを参照している自動化、スクリプト、ノートは更新をしてください。

リンク先を変更すると、無事にダウンロードできた。
Railsのドメイン層に関して考えてみた

自分の知りうる範囲のお話なので、ドメイン層=モデル+サービスくらいのお話で。
正しいかは全くわからないが自分の中で感じてること。


# モデルの関連付け(association)
- あるオブジェクトから他のオブジェクト(クラスの同一性は問わない)を呼び出す時に使われるものは極力ここに集約されるべき
    - current_user.followingsとか
    - 関連先のモデルでのscopeを指定することもできるようだ([例](https://github.com/kudojp/diet-app/blob/4930b8908cadfa888f4b9d19af27cd43d12c09b0/app/models/user.rb#L21))
        - user.recent_followingsとか関連付け先のscope指定で可能。

# モデルの[スコープ/クラスメソッドでのフィルタリング](https://qiita.com/Ryuta1346/items/87be4100d7322a26acff)
- あるクラスのオブジェクトの集合に対して特定の条件を満たす物をフィルタリングするために使う。
    - User.recent_signupとか(命名微妙かも)

# モデルのメソッド
- あるオブジェクトの自身(の属性?)への操作があった時に使う
    - current_user.update_settings()とか
    - 他のモデルへの操作はサービスクラスに切り出した方が良いかもしれない(currnet_user.follow(another_user)とかよくないかも)??
- あるオブジェクトの属性を組み合わせて作られる、カスタム属性を呼び出す時に使われる
    - user.full_nameとか(`"#{first_name} #{last_name}"`だ)

# サービスクラス
- あるモデル起点で他のモデルを弄る/操作する時など?に使う
    - 中間テーブルの使われる操作とか？
    - current_user.follow(another_user)はよくないのかも
Swiftで文字列を配列に格納する

競技プログラミングなどで入力される文字列を配列に格納する方法を共有します。
別の方法があれば教えてください。

```Swift
let string = "0123456789"
var Arr = [Int]()


for i in 0..<string.count {
    var start = string.index(string.startIndex, offsetBy: i)
    var end = string.index(string.startIndex, offsetBy: i+1)
    var num = Int(string[start..<end])
    Arr.append(num!)
}
print(Arr)//[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
```
Docker+Rails5.2エラー【Undefined local variable or method `git_source' for Gemfile         from /Users/owner/projects/docker/rails-docker-vue2/Gemfile:2】の対処方法

 #Undefined local variable or method `git_source' for Gemfileの対処方法

credentials.ymlを編集時にエラー

```
$ EDITOR="vi" bin/rails credentials:edit
Undefined local variable or method `git_source' for Gemfile
        from /Users/owner/projects/docker/rails-docker-vue2/Gemfile:2
```

編集できず困った場合、下記の対処をする

# Dockerで利用する場合

[Rails on Dockerでcredentialsをeditしたい](https://qiita.com/at-946/items/8630ddd411d1e6a651c6)

```dockerfile:Dockerfileに追加
apt-get install -y vim
```

例

```dockerfile:Dockerfile
FROM ruby:2.5.1

RUN apt-get update -qq && \
    apt-get install -y build-essential \ 
                      libpq-dev \
                      git \
                      vim
#yarnのインストール
RUN apt-get update && apt-get install -y curl apt-transport-https wget && \
    curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - && \
    echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list && \
    apt-get update && apt-get install -y yarn

#Nodejsをバージョン指定してインストール
RUN curl -sL https://deb.nodesource.com/setup_12.x | bash - && \
apt-get install nodejs

RUN mkdir /app_name 
ENV APT_KEY_DONT_WARN_ON_DANGEROUS_USAGE=DontWarn
ENV APP_ROOT /app_name 
WORKDIR $APP_ROOT

ADD ./Gemfile $APP_ROOT/Gemfile
ADD ./Gemfile.lock $APP_ROOT/Gemfile.lock

RUN bundle install
ADD . $APP_ROOT
```

```:buildして反映
$ docker-compose build
```

```:credetial.ymlの編集
$ docker-compose run -e EDITOR=vim web rails credentials:edit
```
【簡単】vsCodeでRubyのerbファイルを自動フォーマットする方法

今回Railsの勉強をしていてerbファイルも自動整形できるようにしたいと思い色々調べていたら、Beautiifyという拡張機能がありそれを使うと自動整形できるようになりました。

今回はその方法を紹介しようと思います。
ご指摘や、「もっとこうした方がいい」などありましたらコメントいただけると幸いです。

##Beautifyをインストール
エディターの一番左の上から5番目にあるアイコン(三角のマークがあるアイコンの下）をクリックして検索窓にBeautifyと入力してBeautifyをクリック。
下の画面が出るのでinstallをクリック。（画像はインストール済みなのでUninstallになってます）
![コメント 2020-06-10 141341.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632678/904913d3-478c-c27e-a9d8-336a8a80e595.png)


##settings.jsonを記述する。
コマンドキー(Windowsはctrl)と,キーを押しSettings画面を開き、Beautify:languageと検索してください。
その後少し小さい文字で書かれた**Edit in setting.json**をクリックすると、settings.jsonが開くので以下のように記述してください。

```js:settings.json
．．．

"beautify.language": {
    "js": {
      "type": ["javascript", "json"],
      "filename": [".jshintrc", ".jsbeautifyrc"]
      // "ext": ["js", "json"]
      // ^^ to set extensions to be beautified using the javascript beautifier
    },
    "css": ["css", "scss"],
    "html": ["htm", "html", "erb"] //"erb"を追加
    // ^^ providing just an array sets the VS Code file type
  }
```
htmlの項目に**"erb"**を追加するとフォーマットされるようになりました。
ついでにjsとcssもフォーマットされるように設定しときましたが別に必要ない方は書かなくてもいいと思います。

##補足
###保存したときに自動整形されない方
以下のコードを**settings.json**に追加して保存してください。

```
"editor.formatOnSave": true, // ファイル保存時に自動フォーマット
```

これで保存時に自動整形されるようになったと思います。
##まとめ
コード整形はあまり本質的なことではないと私は考えてますのでリソース節約のために導入しました。
よければ導入してみてください。
[備忘録][随時更新]RのDataFrame操作でよく使う書き方まとめ

しょっちゅうググってるやつを自分用にまとめる。

# 文字列の連結

[参考](https://rpubs.com/hoxo_m/5731)に従い、`+` 演算子を書き換える
やや裏技っぽい方法だけど便利。

```R
"+" <- function(e1, e2) {
    if (is.character(c(e1, e2))) {
        paste(e1, e2, sep = "")
    } else {
        base::"+"(e1, e2)
    }
}
```

# 最初のカラムをindexにして削除

```R
rownames(df) <- df[,1]
df <- df[,-1]
```

# sumを取る

```R
df_sum <- apply(df,2,sum)
```

これだけだと戻り値がvectorなため、必要に応じ以下のようにdataframeに変換。

```R
df_sum <- data.frame(apply(df,2,sum))
colnames(df_sum) <- c("sum")
df_sum <- t(df_sum)
```

# rowの名前で削除

```R
names <- c('rowA','rowB')
df <- df[!(row.names(df) %in% names), ]
```

# rowの名前で取り出し

```R
names <- c('rowA','rowB')
df <- df[names, ]
```

# 空のDataFrame作成

```R
df <- data.frame(
    abundance=double(),
    taxon=character(), 
    sampleID=character(), 
    depth=character(), 
    station_id=character(), 
    stringsAsFactors=FALSE
) 
```

# left_join

```R
dplyr::left_join(df1 ,df2, by = "key")
```

# 0埋め

```R
str_pad(1:100, 3, pad=0)
```
Cognos Analytics のLibertyのjavaプロセスのGCログ出力設定

# Cognos Analytics のLibertyのjavaプロセスのGCログ出力設定
Cognos AnalyticsのQuery Serviceのjavaプロセスは、デフォルトでGCログを以下の記事のように出力しますが、Cognos Analyticsの本体であるWebSphere Libertyはデフォルトでは、GCログは出力しません。
https://qiita.com/shinyama/items/faf7e1a86b9ac6fb9653

GCログ出力のやり方をいつも忘れてしまって、探すのが手間なので、自分のメモ変わりに投稿しておきます。

\<CognosInstall>\bootstrap_wlp_linuxi38664.xml ファイルを修正します。※linuxの場合のファイル名

下記のように、以下の一行を追加します。
<img width="497" alt="001.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/d9371961-a794-5bd7-4b4e-0e441c3321f5.png">

```html
<param>-Xverbosegclog:../logs/gc.log</param>
```

Cognosを再起動します。

\<CognosInstall>/logs/gc.log にGCログが出力されるようになります。
<img width="493" alt="002.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/8aeb0b20-ead3-4230-f655-cf6962c9f49e.png">

以上です。ご活用下さい。

# 2023/8/31追記
いつの間にやらbootstrapファイルの記載方法が変更になっているようです。
以下の記載が必要です。

```html
<param condName="${java_vendor}" condValue="IBM">"-Xverbosegclog:${install_path}/logs/verbosegc_%Y%m%d.%H%M%S.%pid.log,10,5000"</param>
```

**参考**
How to Enable Garbage Collection (GC) Logging on the Cognos Analytics Server
https://www.ibm.com/support/pages/how-enable-garbage-collection-gc-logging-cognos-analytics-server

**Cognos Analytics のLibertyのjavaプロセスのGCログ出力設定(Oracle Java版)**
https://qiita.com/shinyama/items/5e447732026011548112
DDD関連の言葉について一瞬調べた

- 個人的メモですので、悪しからず。

# DAOとDTO
## DAO = DataAccessObject
- 基本的にはデータを格納するフィールド群とそれらへのアクセサメソッド(Getter/Setter)のみで構成されます
- つまり(自分で書いたメソッドなしの?)ActiveRecord?

## DTO = DataTransferObject
- Value Objectと呼ばれていたこともある


# ドメインモデルとトランザクションスクリプト

ファウラーのエンタープライズアプリケーションアーキテクチャパターン(PofEAA)において
## ドメインモデル
- ドメイン内の名詞によって体系化されたモデル

## トランザクションスクリプト
- アクションより起動される一連の手続き




# 参考
https://techacademy.jp/magazine/19443
https://higayasuo.hatenablog.com/entry/20080519/1211183826(いい)
https://qiita.com/chrischris0801/items/58a12d17a440b842db02 (超わかりやすい)
EC2インスタンスの自動停止をLambda+CloudWatch Eventsで実現する

ググれば似たようなコードはあると思いますが、忘備録として残しています。

AWS Instance Schedulerを利用したり、タグに時間を設定しLambdaの定期実行でその時間が来れば停止するといったコードはよく見かけたのですが、コストを最大に下げるためにLambda実行回数も減らしたかったので、時間固定を前提としました。

# やりたいこと
EC2インスタンスのタグで下記のように設定したインスタンスの自動停止を平日21時に実行したい。

- Name: `auto-stop`
- Value: `true`

# 手順
## IAMロール・ポリシーの作成
こういうポリシーを持つIAMロールを作っておく

```json

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ec2:DescribeInstances",
                "ec2:StopInstances",
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:PutLogEvents"
            ],
            "Resource": "*"
        }
    ]
}
```
## CloudWatch Eventsの設定
毎晩21時に自動でシャットダウンしたいので

```
cron(0 12 ? * MON-FRI *)
```
と設定する。時間はUTCなのでJSTをUTCに変換して設定することに注意。

## Lambdaの作成

上記のIAMロール・CloudWatch Eventsを指定しLambdaを作成する。
実行時間はデフォルト3秒だけど足りないので1分ぐらいに設定する。
ランタイムはPython3.8です。

```python

import json

def lambda_handler(event, context):
    import boto3
    ec2 = boto3.client('ec2')

    # 対象のEC2インスタンスIDsを取得
    instances = targetInstances(ec2,'auto-stop', 'true')
    if len(instances) != 0:
        print("--- stop instances ---")
        print(instances)
        # 停止
        ec2.stop_instances(InstanceIds=instances)

# 対象のEC2インスタンスIDsを取得
def targetInstances(ec2, tag_name, tag_value):

    query = [
        {"Name": "instance-state-name", "Values": ["running"]},
        {'Name': 'tag-key', "Values": [tag_name]},
    ]
    fetch_instances = ec2.describe_instances(Filters=query)['Reservations']
    instances = []

    for i in fetch_instances:
        for tags in i['Instances'][0]['Tags']:
            if tag_name in tags['Key']:
                if tags['Value'] == tag_value:
                    instanceId = i['Instances'][0]["InstanceId"]
                    instances.append(i['Instances'][0]["InstanceId"])

    return(instances)
```

#まとめ
開発環境用のEC2インスタンスはこまめに落として、インスタンス代を節約しましょう。

自動起動もやりたい場合は、ポリシーに`ec2:StartInstances`を追記して、新規に開始時間を設定したCloudwatch Eventsを作成し、Lambdaを作成し上記コードを起動用に書き換えればいけます。
CodePipelineでSourceVariablesからGitのCommitMessageを環境変数として注入するときにハマった

CodePipelineをGitのWebhookで起動した際、SourceVariablesにはコミットIDやメッセージなどの様々なものが含まれています
参考⇢https://docs.aws.amazon.com/ja_jp/codepipeline/latest/userguide/actions-variables.html

このコミットメッセージを、CodeBuildへ環境変数として渡したいときにCodepipelineのBuildステージに以下の設定をしました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253700/9842946f-99ed-ef09-ca79-1b9f9814f925.png)

これでSourceステージで出力されているCommitMessageを環境変数に注入できるはずでした
ところがPipelineを実行すると、
`EnvironmentVariables specified in action config does not match expected format,~~~`
というエラーがPipeline出てしまい、そもそもBuildステージが開始されません。

調べたところ、どうやら**コミットメッセージに「'」(シングルクオート)が入っている場合、文字列として適切に認識されずにエラーになってしまう**ようです。
参考⇢https://forums.aws.amazon.com/thread.jspa?threadID=314707

例えばPRをマージした際のコミットメッセージは
`Merge branch 'develop' into feature/atarasiikinoudaYO`
の様になっている（シングルクオートが含まれている）事が多いため、失敗してしまします。

**そのため、このような運用をする際はPipelineに検知される部分のコミットメッセージは「'」の無いように書き換えると、しっかりと環境変数へ注入されます。**

CodeBuildへ注入された環境変数↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253700/39425b6a-6599-d746-3698-3d8aee8c99af.png)
[Word2Vec: Warning対処] DeprecationWarning: Call to deprecated `__getitem__` (Method will be removed in 4.0.0, use self.wv.__getitem__() instead).

DeprecationWarningが出たので対処法メモ



```cofirm.py
from gensim.models import word2vec

model = word2vec.Word2Vec.load("hoge.model")
vec = model["queen"]
print(len(vec.tolist()))
```


```
$ python3 confirm.py
confirm.py:7: DeprecationWarning: Call to deprecated `__getitem__` (Method will be removed in 4.0.0, use self.wv.__getitem__() instead).
  vec = model["queen"]
300
```


警告が出てくるので，
プログラムを以下のように変更する．


```confirm.py
from gensim.models import Word2Vec

model = Word2Vec.load("hoge.model")
vec = model.wv['queen']
print(len(vec.tolist()))
```




```
$ python3 confirm.py
300
```



警告が消えました．(´▽｀)