OmniAICreator/Qiita-1.07M huggingface dataset:
mysql2のbundle installエラー解消

- macOS Catalina
- zsh

rubyのプロジェクトの環境構築にて

## 1. mysqlないよ

```
% bundle install
```

怒られる

```
An error occurred while installing mysql2 (0.5.3), and Bundler
cannot continue.
Make sure that `gem install mysql2 -v '0.5.3' --source
'https://rubygems.org/'` succeeds before bundling.
```

## 2. mysql2こける（ライブラリないよ）

言われたとおりに

```
% gem install mysql2 -v '0.5.3' --source 'https://rubygems.org/'
```

怒られる

```
ld: library not found for -lssl
```

### 対処

> https://qiita.com/fukuda_fu/items/463a39406ce713396403


`/usr/local/opt/openssl`にopenssl入ってるか確認。

わたしの場合は、homebrewでopenssl@1.1をインストール済で、.zshrcにはパス通してたんだけど、

```:.zshrc
export PATH="/usr/local/opt/openssl@1.1/bin:$PATH"
```

どうやらmysql2が使いたいのはこちらの（最新の）パスのほうではなくて下記のパスのほうだそうなので、ローカルパスを通す。

```
% export LDFLAGS="-L/usr/local/opt/openssl/lib"
% export CPPFLAGS="-I/usr/local/opt/openssl/include"
```

ローカルオプションを設定

```
% bundle config --local build.mysql2 "--with-cppflags=-I/usr/local/opt/openssl/include"
% bundle config --local build.mysql2 "--with-ldflags=-L/usr/local/opt/openssl/lib"
```


## 2. Pumaでこける

再度

```
bundle install
```

怒られる

```
An error occurred while installing puma (4.3.1), and Bundler cannot
continue.
Make sure that `gem install puma -v '4.3.1' --source 'https://rubygems.org/'`
succeeds before bundling.
```

言われたとおりに

```
% gem install puma -v '4.3.1' --source 'https://rubygems.org/'
```

怒られる

```
puma_http11.c:203:22: error: implicitly declaring library function 'isspace' with type 'int (int)' [-Werror,-Wimplicit-function-declaration]
  while (vlen > 0 && isspace(value[vlen - 1])) vlen--;
                     ^
puma_http11.c:203:22: note: include the header <ctype.h> or explicitly provide a declaration for 'isspace'
1 error generated.
make: *** [puma_http11.o] Error 1

make failed, exit code 2
```

### 対処

> https://github.com/puma/puma/issues/2304

インストールオプションつける

```
% gem install puma:4.3.1 -- --with-cflags="-Wno-error=implicit-function-declaration"
```

成功

```
Successfully installed puma-4.3.1
Parsing documentation for puma-4.3.1
Installing ri documentation for puma-4.3.1
Done installing documentation for puma after 0 seconds
1 gem installed
```


## ようやく

次こそ・・

```
% bundle install
```

```
Bundle complete! 24 Gemfile dependencies, 90 gems now installed.
Use `bundle info [gemname]` to see where a bundled gem is installed.
```

ホっ🍵
（最近環境構築しすぎて、このへんの解消に僧侶モードはいってきました）
▶https://qiita.com/mksm_wrk/items/69f6c2fc396dc0abf954

さあ仕事しよ。
Oracle パスワード期限切れの解決

#エラーメッセージ
- ORA-01017: ユーザー名/ パスワードが無効です。ログオンは拒否されました。

または

- ORA-28000: アカウントがロックされています

#解決方法
sysdba権限でSQL*Plusにアクセスして、ユーザーのパスワードを変更する。アカウントロックがかかっている場合はロックを解除してから変更する。

##アカウントのステータス確認
```sql
select username , to_char(lock_date,'HH24:MI:SS'), account_status from dba_users;
```

＜結果＞

```sql
USERNAME
--------------------------------------------------------------------------------
TO_CHAR(LOCK_DAT
----------------
ACCOUNT_STATUS
----------------------------------------------------------------
EXPIRED(GRACE)

PTV

OPEN

MYDB
```
- "OPEN"の部分が"LOCKED"になっている場合、アカウントがロックされているので、以下のSQLでロックを解除する。

```sql
ALTER USER [アカウント名] ACCOUNT UNLICKED;
```

##パスワードの変更
```sql
ALTER USER [アカウント名] IDENTIFIED BY [新しいパスワード]
```

##パスワード有効期間の延長
自分だけのローカル環境など、緩い管理でいい場合は下記SQLでパスワードの
有効期限を無期限化することも可能。

```sql
alter profile default limit password_life_time unlimited;
```

#参考
https://cosol.jp/knowledge/knowledge_post/ot0020_ora28000/

##メモ
自分だけの環境ならパスワードの有効期限を長期に変更したほうがよさそうだけど、まだそこまで調査・検証してない。
UE4でSeamlessTravel後のBeginPlayでGetPlayerController(0)が古いPlayerControllerを取得してしまう

マルチプレイのSeamlessTravel後のLevelBlueprintやActorのBeginPlay時にGetPlayerControllerが古いPlayerControllerを取得してしまう現象が起きたので内容と対応方法をメモしておきます。
UE4の仕様とかエディタのコードはちゃんと追えてません。
UE4.25.3で確認しました。

# 発生した現象

OnlineSubsystemを用いたマルチプレイで以下のような関数をサーバーで実行してマップ遷移していた。

```cpp
bool ATestGameMode::Travel(FString LevelName)
{
	bUseSeamlessTravel = true;
	return GetWorld()->ServerTravel(LevelName, false, false);
}
```

以下のようにBeginPlay時にPlayerControllerを取得すると古いものを取得していた。
（GameModeのOnSwapPlayerControllersなどで取得できるPlayerControllerのDisplayNameで一致を確認)
![capgetplyercontroller.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16768/d6edc024-4d9a-9ae0-5374-a49b1e140490.png)


# 対応したこと

以下のような関数を使うようにして対応。

```cpp
UFUNCTION(BlueprintPure, Category = MyUtils, meta = (WorldContext="WorldContextObject", UnsafeDuringActorConstruction="true"))
	static class APlayerController* GetFirstLocalPlayerController(const UObject* WorldContextObject);
```

```cpp
class APlayerController* UMyUtils::GetFirstLocalPlayerController(const UObject* WorldContextObject)
{
	if (UWorld* World = GEngine->GetWorldFromContextObject(WorldContextObject, EGetWorldErrorMode::LogAndReturnNull))
	{
		if (ULocalPlayer* LocalPLayer = World->GetFirstLocalPlayerFromController())
		{
			return LocalPLayer->GetPlayerController(World);
		}
	}
	return nullptr;
}
```
WiresharkでSOAPメッセージをトレースする、コネクションエラー、通信しているXMLの内容を確認する。検証用SOAPクライアントならPython-Zeep熱烈推奨

# 環境

- Ubuntu18.04  ※Windows10のVMWare上で動作する仮想マシン
- Wireshark 2.6.10 (Git v2.6.10 packaged as 2.6.10-1~ubuntu18.04.0)
- Python3
    - zeep 3.4.0

# トレース方法

結論から書くとWiresharkで以下のフィルタを使います。

```
ip.addr == サーバIPアドレス && (xml || http || https || tcp)
```

Wiresharkではデフォルトではネットワーク上を流れている大量の無関係の通信がキャプチャされます。

まずは、SOAPサーバのIPアドレスをPINGで取得してフィルタします。
上記の指定方法だと、当該IPアドレスが送信、受信のどちらかであればキャプチャされます。

次にSOAP関連通信をフィルタします。
全てのSOAPメソッドに該当するかわかりませんが、私が利用したSOAPサービスは以下の順番で処理を行います。

- WSDL取得
- SOAPメソッド実行

この時の通信内容は以下のようになっています。これに基づいてHTTP(S)をトレースします。

| # | 処理 | プロトコル | メソッド | ポート | 備考 |
|:-:|:--|:--|:--|:--|:--|
|①| WSDL取得   | HTTP | GET  | 80  |   |
|②| SOAPメソッド実行  | HTTP/XML  | POST   | 任意(WSDLで定義)  |   |

またHTTPリクエストの前にTCPでコネクション確立(SYN,ACKなど)を行いますので、TCPも追加します。

## 参考/コネクションエラーの分析

WSDL取得は成功しても、メソッド実行時にコネクションが確立できない場合があります。
これはHTTP/POST通信(ポート含む)がFirewall等で制限されている場合などに発生します。
コネクションエラー等の問題が発生している場合、まずはTCPでコネクション確立(`SYN->ACK`)できているか？を確認するとよいかと思います。
`SYN->RST`ならコネクション確立できていません。
`info`部分でポート番号も確認できるのでSOAPサーバを管理している人に問い合わせしましょう。

以下はこの例の時のスクショです。赤枠で囲んだ部分が`SYN -> RST`となっているのが確認できます。

[![Image from Gyazo](https://i.gyazo.com/f27adffc8c3e8389c600ef29332b74be.png)](https://gyazo.com/f27adffc8c3e8389c600ef29332b74be)

## 参考/通信しているXMLの内容確認

Wiresharkで`protocol`が`HTTP/XML`となっているところを選択すると詳細ペインでXMLの内容を確認できます。

# Soapクライアントを簡単に作成する方法/Zeep

Pythonを実行できるなら[Zeep](https://docs.python-zeep.org/en/master/)がおすすめです。

JavaでSOAPクライアントを作成することを考えてみましょう。
(WSDL定義の複雑さによりますが業務で使うくらいのサービスだと)wsimportで自動生成されるクラスは大量になります。
実行するにもコンパイルが必要ですし、ログを出したり、ステップ実行しながら状態を確認したい。となるとさらに面倒です。

Python Zeepなら事前のコード生成・コンパイルは不要です(WSDLから動的に内部的に生成している模様)。
ログは組み込みの`print`、ステップ実行もこれまた組み込みの`インタラクティブシェル`で実現できます。

SOAPサービスの複雑さにもよりますが、Javaが準備に3時間かかるとしたらPython Zeepなら15分くらいでしょうか。
この15分の大半はメソッドの引数の型を調べて値をDictに設定する時間です。メソッドが引数をとらないのであればこの作業が不要なので数分でしょうか。
(JavaをDisっているわけではないです。実際に弊社パッケージのバックエンドはJavaが主体です)

たとえば以下のコードをインタラクティブシェルで逐次実行すればよいだけです。

```python
from zeep import Client

# WSDLロケーション指定
wsdl = 'http://xxxxxxxxxxxx/SampleService.asmx?wsdl'
print('wsdl   => {}'.format(wsdl))

# Soapクライアント作成
client = Client(wsdl=wsdl)
# 生成されたSOAPクライアントの構造を表示
print('client=> {}'.format(dir(client))

# パラメタ設定
params = {
    "id":"XXX",
    "secret":"XXX",
    "number":"1234567890-001-001",
}
print('params => {}'.format(params))

# 実行
result = client.service.cancel(Request=params)

print('result => {}'.format(result))
```

# トラブルシューティング

## ネットワークがない

Wiresharkを一般ユーザで実行していませんか？この時に表示されるネットワークにはアクティブなネットワークが含まれません。
root権限を持つユーザで実行するとイーサネット用、ループバック用が表示されます。

【参考】一般ユーザでWireSharkを実行した時のネットワーク一覧

![](https://i.gyazo.com/97e67d26266fefe8564be431ab477891.png)

【参考】rootユーザでWireSharkを実行した時のネットワーク一覧

![](https://i.gyazo.com/64096bee859d12783c59ced363bbfbe7.png)
不要なリモートブランチ削除

覚書です:+1: 
※"GitFlow"の場合であればプルリク→マージし、Github/GitLab側でブランチ削除するので不要です。

プルリクでの開発現場でない際に使いました。参考になれば幸いです。
間違っている点がありましたらご指摘ください！！

[手順]
リモートブランチ削除
⇅
ローカルブランチ削除

どちらが先でも良いですが、自分のわかりやすい手順で行ってください。
もし誤って他人のリモートブランチを削除した場合は、削除してしまったブランチの人に伝えてください！
ローカルのブランチ情報が残っているので問題ありませんがびっくりすることでしょう...


## リモートブランチの削除
```
git push --delete origin ブランチ名 
```

もしくは

```
git push origin :ブランチ名
```

例) <code>git push --delete origin feature/#0001</code>

最初は<code>--delete</code>をつけて削除するのがおすすめです。
理由として、コードやオプションが間違っていたら削除できないため、ブランチの誤削除防止になります。

## ローカルブランチの削除
```
git branch --delete ローカルブランチ名
```

もしくは

```
git branch -d ローカルブランチ名
```

あるいは

```
git branch -D ローカルブランチ名
```

<<注意>><code>-D</code>は、マージしていないブランチも削除できますのでご注意ください！

## 他人がリモートブランチを削除した時の対応

```
git fetch --prune
```

もしくは

```
git fetch -p
```

Gitはローカルの".git/"にデータを格納しています。
<code> git fetch</code>で追加されたリモートブランチの情報取得はできますが、デフォルトで削除は対応していません。
ですので、<code>--prune</code>で削除していきましょう。
いちいち打ちたくない人は、configを修正してください。参考文献の一つ目URLにあります。

## 参考文献
https://qiita.com/yuu_ta/items/519ea47ac2c1ded032d9
https://qiita.com/hogeta_/items/33d2334c9b1919bd5120
レンタルサーバのサブドメインを使って、Webアプリのバックエンド処理をPythonでホスティングする方法

Xserverで独自ドメインに追加したサブドメインを使って、Webアプリのバックエンド処理をPythonでホスティングする方法です。GCPやAWSなどクラウドでホスティングする方法が最近は一般的だと思いますが、今回は費用と性能を鑑みてXserverで行います。

細かい部分については既にこの上ない記事がいくつもあり、記載しても劣化したコピーとなってしまうので割愛しますが、サブドメインでAPIを作るという部分については特になかったのでここでは流れに注力して記載します。自分のメモようなのであしからず。

なお、Xserverの独自ドメインは既にあるものとします。

## 最終的にしたいこと
（私の場合）既にある
https://np-sys.com/
にサブドメインを追加して、
https://APIs.np-sys.com/APIを格納するフォルダ名/Flaskで定義したURLのスラッグ （末尾）
という形でバックエンド処理を走らせるようにする。当然ドメインはお好きなもので。

## 使用するツール
Xserverに自分で入れたPython
PythonのFlaskライブラリ

## 流れ

- Xserverでpythonをインストール
- Xserverのサーバパネルでサブドメインを作成し、public_htmlにAPIを格納するフォルダ名を作る。例えばfunctionsというフォルダを作る
- cgiでpythonスクリプトを走らせるようにする

です。

## Xserverでpythonをインストール

Xserverで元々入っているPythonはありますが、権限の関係でpipコマンドで任意のライブラリをインストールできません。したがって、自分用のPythonを入れる必要があります。
細かい方法は下記がわかりやすかったです。結構これが負担重い。
https://note.com/coeeff/n/neab8acfde97e
https://qiita.com/kusumoto-t/items/b262b8878ccdfd137fa3

## サブドメインを作成

Xserverのサーバパネルでサブドメインを作成します。
https://www.xserver.ne.jp/login_server.php

ボタン一つで行けます。
![スクリーンショット 2020-10-12 9.58.42.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550742/1ba577f6-8991-7a68-e0ae-cc456d9f88e3.jpeg)

そしたらそのサブドメインのトップにFTPで接続するかsshで接続して、スクリプトを設置するフォルダを作成します。今回はfunctionsとしました。なお、サブドメインの文字は実際の物を記載していないのでセキュリティに無配慮だなとは思わないでください。

![スクリーンショット 2020-10-12 10.17.52.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550742/f00044a3-65a2-83df-8f2b-7a46b7d7015d.jpeg)

## cgiでpythonスクリプトを走らせるようにする
あとはpythonをcgiで走らせるようにします。
これが最高にわかりやすかったです。
https://neko-py.com/xserver-web-application

注意点は、パーミッションの変更を忘れないこと、index.cgiの先頭にPythonのパスを絶対パスで指定すること（#! /home/Myname/.linuxbrew/bin/python3なら動きましたが、#! ~/.linuxbrew/bin/python3では動きませんでした）、Flaskはちゃんとインストールすることあたりが注意点。

そしたら
https://apis.np-sys.com/functions/
に相当するURLで動作します。

![スクリーンショット 2020-10-12 10.34.11.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550742/7163a4bc-b088-9b3a-6876-dbec1f29013c.jpeg)

サブドメインのトップに作るフォルダ名はアプリケーションごとに管理した方がわかりやすそうです。
メモ: jTinder

## 参考

https://github.com/do-web/jTinder

## 使い方

![1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/acebd235-4417-22ad-2b06-de7d7d1201c8.png)


```html:index.html
<link rel="stylesheet" type="text/css" href="css/jTinder.css">

<style>
div#tinderslide {
        margin: 0 auto;
        text-align:center;
        width:80%;
        height:30%;
}
</style>

<div id="tinderslide">
    <ul>
        <li class="pane1">
                <div class="img"></div>
                <div>Miami Beach</div>
                <div class="like"></div>
                <div class="dislike"></div>
        </li>
        <li class="pane2">
                <div class="img"></div>
                <div>San Francisco</div>
                <div class="like"></div>
                <div class="dislike"></div>
        </li>
        <li class="pane3">
                <div class="img"></div>
                <div>Chicago</div>
                <div class="like"></div>
                <div class="dislike"></div>
        </li>
        <li class="pane4">
                <div class="img"></div>
                <div>New York</div>
                <div class="like"></div>
                <div class="dislike"></div>
        </li>
        <li class="pane5">
                <div class="img"></div>
                <div>Beach</div>
                <div class="like"></div>
                <div class="dislike"></div>
        </li>
    </ul>
</div>

<!-- jQuery lib -->
<script type="text/javascript" src="js/jquery.min.js"></script>
<!-- transform2d lib -->
<script type="text/javascript" src="js/jquery.transform2d.js"></script>
<!-- jTinder lib -->
<script type="text/javascript" src="js/jquery.jTinder.js"></script>
<!-- jTinder initialization script -->
<script>$("#tinderslide").jTinder();</script>
```


## フォークされたものを使用

* https://github.com/x42x64/jTinder

http://localhost:8000/demodata.json からの読み込みに対応
【ざっくり解説】ActiveHashモデルからnameが取得できない原因と対処法

__「ActiveHashのモデルからnameを取得したいんだけど、undefinedエラーが出て取得できない…」__

そんな方向けに、ActiveHashのnameを多少強引に取得する方法と、そもそもnameが取得できない理由について解説していきます。

プログラミング初心者の方は参考にしていただけると幸いです。
（なぜエラーが出るかご存知の方にとっては、この記事は無益です。ごめんなさい。）

### この記事の目的
・ActiveHashを使った正常な値の取得方法を復習する
・ActiveHashモデルからfindメソッドで値を取得する方法を学習する
・なぜundefindエラーが発生するのかを理解する


## 【前提】 ActiveHash 正常な値の取得

```ruby:sushi.rb
class Sushi < ActiveHash::Base
  self.data = [
    { id: 1, name: '大トロ' },
    { id: 2, name: '中トロ' },
    { id: 3, name: 'いくら' },
    { id: 4, name: '穴子' },
    { id: 5, name: 'えんがわ' },
    { id: 6, name: '雲丹' },
    { id: 7, name: 'いか' }
  ] 
end
```
```rhtml:lunch.html.erb
<%= @shari.sushi.name %>
<!-- ＠shariのsushi_idが「4」 の場合、「穴子」が表示される-->
```
このような記述で、ActiveHashのモデルから、@shari.sushi_idに紐づくnameの値を取得することができます。（今回モデルの記述は割愛します。）

しかし、__ある条件下__では、ActiveHashのname要素を取得することができず

`undefined method '〇〇' for …`

のように、エラーとなってしまう場合があります。

そんな時に、無理やりActiveHashのモデルから値を取得する方法をお伝えします。


## その①：findを使って取得・表示する

```rhtml:lunch.html.erb
<%= Sushi.find(@shari.neta_id).name %>
```
「エラーは起きたけど、せっかくActiveHashモデル書いたし使いたいな…」

という方にオススメなのは、__findメソッドを使って無理やり取得__する方法です。

①findメソッドの引数に取得したいidを渡し、Sushiモデル（ActiveHash）から@shari.neta_idを探します。
②取得したidのnameが欲しいため、末尾に.nameをつけてあげます。
③Sushiモデルから、@shari.neta_idに合わせたname要素が取得できます。

多少強引な方法ではありますが、この方法を使えば指定のname要素を取得することができます。ただし、コードが冗長になりやすいので、使うときは注意が必要です。

## その②：form.select と Caseで取得・表示する

```rhtml:new.html.erb
<%= form.select :neta_id,[["アジ",1],["コハダ",2],["赤むつ",3],["アマダイ",4]] %>
```

```rhtml:lunch.html.erb
<% case @shari.neta_id %>
  <% when 1 then %>
     <p>アジ</p>
  <% when 2 then %>
     <p>コハダ</p>
  <% when 3 then %>
     <p>赤むつ</p>
  <% when 4 then %>
     <p>アマダイ</p>
<% end %>
```
「記述量は少ないし、ActiveHashじゃなくてもいいかな…」

という方は、プルダウン部分をform.selectに、表示部分をcase文で記述することで、擬似的にActiveHashのような表現をすることができます。

ただし、この方法は選択肢が増えると記述量が膨大になり、コードの可読性を下げる可能性があるので、選択肢が少ない場合のみ使用することをオススメします。

## そもそもなぜ取得できないの?

結論、__「ActiveHashモデルのモデル名とカラム名が合っていない」__場合、name要素を正規の方法で取得することができません。

カラム名が__sushi_id__（integer型）であった場合、ActiveHashのモデル名も__Sushi.rb__である必要があります。前述その①の場合、Sushi.rbからneta.nameのような形で値を取得しようとしても、取得できません。

ActiveHashモデルを作成してプルダウンやチェックボックスを作る際は、モデルの名前とカラムの名前を揃えるようにしましょう。


## まとめ

①ActiveHashはモデル名とカラム名があっていないと、.nameでname要素を取得することができない。
②別名のモデルから値を取得する場合は、findを使うことでname要素を取得することができる。
③記述そのもの（選択肢）が少ない場合は、form.selectとwhenを使うことで表現する方法もある。

最後までご覧いただきありがとうございました。
引き続き、学習を頑張っていきましょう！
コンストラクタ

# コンストラクタ(構築子)
オブジェクト指向のプログラミング言語で新たなオブジェクトを生成する際に呼び出されて内容の初期化などを行う関数あるいはメソッド
対義語 : デストラクタ

# オブジェクト生成
オブジェクト生成は

 - メモリ割り当て
 - 初期化

の2段階を経て行われる

コンストラクタを持つプログラミング言語では、メモリ割り当ては言語機能に組み込まれ、初期化用のコードのみを記述するのが普通

# クラスベース言語でのコンストラクタ
C#, Java, C++, PHPなどのクラスベースのオブジェクト指向言語ではクラスのメンバ変数として定義される
C++、Java、C#のコンストラクタはクラス名と同一の名前を持ち、戻り値指定のない関数(メソッド)のような記述になる
しかし、実際にそうというわけではない

PHPやRubyのように特定の名前を持つメソッドを作ればそれがコンストラクタになるという言語も存在する

コンストラクタに渡す引数により　初期化のバリエーションが定義される

# パターンとして名前を持つコンストラクタ
__デフォルトコンストラクタ__
引数なしで呼び出すことができるコンストラクタ
通常は引数のないコンストラクタのことをさすが、C++では全ての引数にデフォルト引数が指定されているコンストラクタも引数なしで呼び出すことが可能なので、デフォルト引数と呼ばれる

__コピーコンストラクタ__
同一クラスのオブジェクトをもとに同一内容のオブジェクトを作成するコンストラクタ
複製を作る
ムーブコンストラクタと異なり、コピー元のオブジェクトが書き換えられることはない

__ムーブコンストラクタ__
同一クラスのオブジェクトをもとに同一内容のオブジェクトを作成するコンストラクタ
コンストラクタ内では、ムーブ元のオブジェクトの内部状態を自身のオブジェクトに移動する
ムーブ元のオブジェクトは破壊される(ムーブコンストラクタ実行前と異なる状態になる)
C++11から正式に導入された

__コンストラクタチェーン__
引数の異なる複数のコンストラクタを、チェーンのように一つのコンストラクタに結びつけること
単純なものから複雑なものへ処理を流すことで、初期化コードの重複を防ぐ
C++11では委譲コンストラクタが言語機能として導入された

# JavaScriptのコンストラクタ
JSはプロトタイプベースのオブジェクト指向言語であるため、クラスは存在せず、new演算子つきで通常の関数を呼び出すことで、コンストラクタとして動作させることができる
関数をコンストラクタとして呼び出すと、thisは新しく生成されるオブジェクトを指すようになり、また、プロトタイプも設定される
ECMA Script2015以降は糖衣構文としてクラスもサポートする

# 参照ページ
[Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%B3%E3%82%B9%E3%83%88%E3%83%A9%E3%82%AF%E3%82%BF)
curl で unable to load client key: -8178 エラーが出た

## 要件
ルート証明書を使用して、とあるホストにアクセスする用事があった。
ゴールは、PHP の cURL 関数でアクセスできること。

### 環境
+ CentOS 7
+ php7.3
  - cURL 関数を使用


## 事象
### php の cURL 関数でエラーが発生
証明書のパスを指定して cURL 関数を実行してみたところ、
以下のようなエラーが出てしまった。

```
# オプション定義（抜粋）
$ch = curl_init( "https://xxxx" );
curl_setopt( $ch, CURLOPT_SSLCERT, "./aaa.pem" );
curl_exec( $ch );

# 実行結果
cURL の戻り値：58
curl_error のメッセージ：
  unable to load client key: -8178 (SEC_ERROR_BAD_KEY)
```

## 調査
### CUI の curl でアクセスしてみる
では、同じ URL に対して CUI の curl で試したらどうなるか確認。

```
# コマンド
curl -v https://xxxx --cacert ./aaa.pem

# 結果
< HTTP/1.1 200 OK
～省略～
*   CAfile: ./aaa.pem
  CApath: none
～省略～
curl: (58) unable to load client key: -8178 (SEC_ERROR_BAD_KEY)
```

同じエラーが出てしまった。

### エラーメッセージを見てみる
curl のエラーの中に
`CApath: none`
という文言があった。

一つ上にある `CAfile` には引数の `--cacert` の値が入っているので、
別の引数で指定しないといけない？

調べてみると、`--capath` という引数で
`CApath` に証明書のディレクトリを指定できるらしい。
早速試してみる。


## 解決編
### curl に capath オプションを指定してみる
~~~
# コマンド
curl -v https://xxxx --capath <aaa.pem が存在するディレクトリのパス>

# 結果
< HTTP/1.1 200 OK
～省略～
*   CAfile: /etc/...省略.../ca-bundle.crt
  CApath: <aaa.pem が存在するディレクトリのパス>
～省略～
URL のデータ
~~~

取得成功！
ちなみに、ディレクトリは絶対パスでも相対パスでも指定可。


### PHP の cURL 関数でも試してみる
PHP の cURL 関数では `CURLOPT_CAPATH` というオプションで
証明書のパスを指定できるらしい。

~~~
# オプション定義
curl_setopt( $ch, CURLOPT_CAPATH, "<aaa.pem が存在するディレクトリのパス>" );

# 実行結果
成功（CUI と同じ）
~~~

ファイル名ではなくディレクトリの指定が必要だったんですね。


## 追記
### OS の証明書ストアに登録する方法
独自の証明書をOSの証明書ストアに登録すれば、
`CApath` の指定が無くても読み込んでくれます。
　※この方法が普通みたいですね；

~~~
# cp aaa.pem /usr/share/pki/ca-trust-source/anchors/
# update-ca-trust
~~~

ただし、この場合は独自証明書が OS 全体に適用されてしまうため、
ユースケースによっては、前述の様に証明書パスを指定した方が良いかもしれません。

ユースケースの例としては・・・

+ 独自証明書をサービス固有で定義したい場合
  - サービス毎にディレクトリを作っており、<br>
    他のサービスに影響を与えたくない場合など
  - OS 自体にインストールしないので、<br>
    Ansible などでの配布時に OS にほぼ影響を及ぼさない
+ 証明書を cron などで自動的に取得 & 配置 している場合
  - 外部サービスの証明書が頻繁に更新される場合、<br>
    証明書ストアを更新するよりも自動化の手間が省ける

### 証明書ファイルを明示的に指定
`CURLOPT_CAPATH` を指定していれば、証明書ファイル名を指定しなくても
ディレクトリ内にあるファイルから自動的？に証明書を見つけてくれますが、
`CURLOPT_CAINFO` で明示的に証明書パスを指定することもできるようです。
　※その場合でも `CURLOPT_CAPATH` は指定必須

~~~
# オプション例
curl_setopt( $ch, CURLOPT_CAINFO , "./aaa.pem" );
curl_setopt( $ch, CURLOPT_CAPATH, "<aaa.pem が存在するディレクトリのパス>" );
~~~

業務で長く使っていて色々なサーバの証明書が混在していたり、
有効期限切れのものが混ざっていたりしたら
この方が安全かもしれません。
【MySQL】WHERE句でひらがな/カタカナが区別されない

## SELECT結果がなんかおかしかった
テーブル(仮)

|id| name | 
|:--|----|
| 1 |テスト| 
| 2 |ﾃｽﾄ| 
| 3 |てすと| 
| 3 |test| 

SELECT * FROM test WHERE name = 'テスト';

|id| name | 
|:--|----|
| 1 |テスト| 
| 2 |ﾃｽﾄ| 
| 3 |てすと| 

WHEREって完全一致だと思ってたので、ひらがな/カタカナが区別されていないことに動揺。
調べてみるとCollationの設定が関係しているらしい??
MySQLを使って2年目で初めてCollationというものを知りました(それまでは気にしたことがなかった)


## Collationとは
>各データベースにはデータベース文字セットとデータベース照合順序があります。

https://dev.mysql.com/doc/refman/5.6/ja/charset-database.html

ここでいうデータベース照合順序がCollationのことで、
データに含まれるの文字を比較するときにどの文字を区別してどの文字を同じものと見なすか？という設定のようなもの(らしい)
サーバレベル、データベースレベル、テーブルレベル、カラムレベルそれぞれで設定できる(らしい)



じゃあ今のCollationを確認してみます

## Collationの確認方法
データベース

```sql
SELECT @@character_set_database, @@collation_database;
```

テーブル

```sql
show table status from [DB名];
```

カラム

```sql
SHOW FULL COLUMNS FROM test;
```

上記のテーブルは`utf8mb4_unicode_ci`になっていました。(だからSELECT結果がおかしく見えた)
区別したいので`utf8_general_ci`に変更してみます

## Collationの変更方法
データベース

```sql
ALTER DATABASE COLLATE [照合順序];
```

テーブル

```sql
ALTER TABLE [テーブル名] COLLATE [照合順序];
```

カラム

```sql
ALTER TABLE [テーブル名] MODIFY COLUMN [カラム名] [型] COLLATE [照合順序];
```

## 結果
SELECT * FROM test WHERE name = 'テスト';

|id| name | 
|:--|----|
| 1 |テスト| 

欲しかった挙動になりました(とりあえずめでたしめでたし)
Collationについて理解しきれてないところがあるのでちゃんと調査・理解できたら後ほど追記などします
windowsformのカスタムコントロールの作り方

## モチベーション
- TextBoxクラスを継承してイベントの処理を追加する。
- TextBoxクラスのプロパティを追加する。

## より良い手順
- @userisgodさんに教えてもらった手法
- テキストボックスのクラスを継承する

``` 継承したテキストボックス.cs
public class 継承したテキストボックス : TextBox
{
    private 選択肢クラス 選択肢 = 選択肢クラス.選択肢1;

    protected override void OnKeyPress(KeyPressEventArgs e)
    {
        base.OnKeyPress(e);
        // Do something(イベント処理)
    }

    [Browsable(true)]
    [Description("プロパティの説明")]
    [Category("プロパティの中のカテゴリ")]
    public 選択肢クラス プロパティ名
    {
        get { return 選択肢; }
        set { 選択肢 = value; }
    }
}

public enum 選択肢クラス
{
    選択肢1 = 1,
    選択肢2 = 2
}
```

## (良くない)手順
[これ](https://takumi-oda.com/blog/2018/08/12/post-299/)を参考にする。

<ol><li> プロジェクトの追加・新しい項目・ユーザーコントロール(Windows フォーム)を選択する。
</li><li> 継承したテキストボックス.csのクラスの継承元をTextBoxクラスにする。

```継承したテキストボックス.cs
namespace MyProject
{
    public partial class 継承したテキストボックス : TextBox
    {
        // もとからある実装
    }
}
```

</li><li> 継承したテキストボックス.Designer.csの中の
```this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;```
でエラーが発生するので、この行を削除する。
</li><li> ```private void InitializeComponent()```内にイベントを追加していく。(ここではイベント処理というメソッドを追加した)

```継承したテキストボックス.Designer.cs
private void InitializeComponent()
{
    components = new System.ComponentModel.Container();
    this.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.イベント処理);
}
```
</li><li> 継承したテキストボックス.csの中に追加したイベント処理の実装を書く
プロパティも継承したテキストボックスクラスに実装する。
プロパティの選択肢はenumのクラスを作成する。
すると、デザイナーのツールボックス内でenumクラスのメンバーが選択できるようになる。

```継承したテキストボックス.cs
public partial class 継承したテキストボックス : TextBox
{
    private void イベント処理(object sender, KeyPressEventArgs e)
    {
        // Do something
    }
    
    private 選択肢クラス 選択肢 = 選択肢クラス.選択肢1;
    
    [Browsable(true)]
    [Description("プロパティの説明")]
    [Category("プロパティの中のカテゴリ")]
    public 選択肢クラス プロパティ名
    {
        get { return 選択肢; }
        set { 選択肢 = value; }
    }
}

public enum 選択肢クラス
{
    選択肢1 = 1,
    選択肢2 = 2
}
```

</li><li> ビルドする。
</li><li> フォームのツールボックスから追加して使用できるようになる。
composerでメモリ制限エラーがでた話

#エラー内容


```
Fatal error: Allowed memory size of 1610612736 bytes exhausted (tried to allocate 4096 bytes) in phar:///usr/bin/composer/src/Composer/DependencyResolver/RuleWatchGraph.php on line 52
Check https://getcomposer.org/doc/articles/troubleshooting.md#memory-limit-errors for more info on how to handle out of memory errors.
```

メモリーが足りないよ！ってエラーが帰ってきた

なので下記コマンドでメモリーの許可されている容量を調べると

```
php -r 'phpinfo();' | grep memory_limit
````

```
memory_limit => 128M => 128M
```
128Mじゃそりゃ足りないわな,,,,

ので下記コマンドを実行

```tarminal:tarminal
COMPOSER_MEMORY_LIMIT=-1 composer　〇〇(インストールorアップデートしたいパッケージ)
```



COMPOSER_MEMORY_LIMIT=-1は一時的にメモリを使いたい分一時的に使えるようにするよ！って意味
それと一緒にインストールしたいパッケージを記述し実行
Typescriptでデザインパターン [chain of responsibility]

# chain of responsibilityパターンとは

```
「Chain of Responsibility」という英単語は、「責任の連鎖」を意味します。

このパターンは、ある要求の受取り対象となる複数のオブジェクトに鎖状の関係を構築し、
要求を処理する事が可能なオブジェクトに渡るまで、順次、構築した鎖状の関係に沿って要求を受流していくパターンです。

このパターンを適用すると、「この要求はこのオブジェクトが処理する」などという司令塔的な役割り(結び付き)を利用者側が意識しなくて良くなり、
利用者側は「連鎖関係にある任意のオブジェクトに要求を投げるだけ」、処理側は「流れてきた要求が自身で処理できる場合は処理し、できない場合は、その要求を次のオブジェクトに渡すだけ」という役割分担が明確となります。
```

# サンプル

[こちら](https://www.sourcecodeexamples.net/2020/08/typescript-chain-of-responsibility.html)を参考にしました。

## chainOfResponsibility.ts

HandlerというスーパークラスからConcreteHandlerクラスにextendsしている。
setHandlerメソッドでHandlerのクラスを継承している。
operationメソッドでクラスのprivate変数の初期化したさいの値と、引数として与えられた値を比較する。


```ts
export class Handler {
    private handler: Handler;
    private req: number;

    constructor(req: number) {
        this.req = req;
    }

    public setHandler(handler: Handler): void {
        this.handler = handler;
    }

    public operation(msg: string, req: number): void {
        if (req <= this.req) {
            this.handlerRequest(msg)
        } else if (this.handler !== null && this.handler !== undefined) {
            this.handler.operation(msg, req);
        }
    }

    public handlerRequest(msg: string): void {
        throw new Error("Abstract method!");
    }
}

export class ConcreteHandler1 extends Handler {
    constructor(req: number) {
        super(req);
    }
    public handlerRequest(msg: string) {
        console.log("Message (ConcreteHandler1) :: ", msg);
    }
}


export class ConcreteHandler2 extends Handler {
    constructor(req: number) {
        super(req);
    }
    public handlerRequest(msg: string) {
        console.log("Message :: (ConcreteHandler2) ", msg);
    }
}

export class ConcreteHandler3 extends Handler {
    constructor(req: number) {
        super(req);
    }
    public handlerRequest(msg: string) {
        console.log("Message :: (ConcreteHandler3) ", msg);
    }
}

```

## demo.ts

```ts
import { Handler, ConcreteHandler1, ConcreteHandler2, ConcreteHandler3 } from "./chainOfResponsibility";

export function show() : void {
 let h1: Handler,
  h2: Handler,
  h3: Handler,
  reqs: number[],
  i: number,
  max: number;

 reqs = [2, 7, 23, 34, 4, 5, 8, 3];

 h1 = new ConcreteHandler1(3);
 h2 = new ConcreteHandler2(7);
 h3 = new ConcreteHandler3(20);

 h1.setHandler(h2);
 h2.setHandler(h3);

 for (i = 0, max = reqs.length; i < max; i += 1) {
  h1.operation("operation is fired!", reqs[i]);
 }
}

show();
```


結果

```text
chain_of_responsibility> tsc --target ES5 .\demo.ts
chain_of_responsibility> node .\demo.js
Message (ConcreteHandler1) ::  operation is fired!
Message :: (ConcreteHandler2)  operation is fired!
Message :: (ConcreteHandler2)  operation is fired!
Message :: (ConcreteHandler2)  operation is fired!
Message :: (ConcreteHandler3)  operation is fired!
Message (ConcreteHandler1) ::  operation is fired!

```
Three.jsを記述するための準備

<br>

**今回、投稿するに当たりまして、参考にさせて頂いた記事になります。**

https://ics.media/entry/14771/
https://qiita.com/watabo_shi/items/bf9bcd4569b6d480c608

**ありがとうございました！！**

<br>
<br>

**以下、Three.jsを記述するための準備になります。**

**1.Three.js公式ページよりThree.js-masterのダウンロードを行います。**
*公式ページ左側、メニューcode/downloadより取得が可能です。*
https://threejs.org/

**2.ファイルの移動**

ダウンロードしたファイルの中から
three.js-master/build/three.jsファイルをapp/javascriptへコピーします。
この際に、app/javascript/index.jsを作成し、

また

```javascript:app/javascript/packs/application.js
reqire("../index")
```
と記述致します。

**3. layouts/application.html.erbへの記述**
次に

```html:layouts/application.html.erb
<script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/110/three.min.js"></script>
```
と記述致します。

**4.canvas要素にidの指定**

three.jsによる記述を表示させたい場所に以下のように記述致します。

```html:html.erb
  <canvas id="myCanvas"></canvas>
```

**5.index.jsへの記述**

最後に以下のように記述致します。

```javascript:javascript/index.js
  function init() {
  const width = 960;//表示する画面幅の指定
  const height = 540;//表示する画面の高さの指定
  const renderer = new THREE.WebGLRenderer({
    canvas: document.querySelector("#myCanvas")//idの取得
  });

  renderer.setSize(width, height);

  //以下にThree.jsの記述を行います。

```

**6.Three.jsの記述を行うための準備完了です！！**

最後まで、ご閲覧頂きありがとうございました！
誤っている箇所、認識が不足している部分についてご指摘いただければ幸いに存じます。
F#でAtCoder ARC105(A～B)

# A - Fourtune Cookies
[A - Fourtune Cookies](https://atcoder.jp/contests/arc105/tasks/arc105_a)

``` fsharp
let inputs = stdin.ReadLine().Split() |> Array.map int64
let s = inputs |> Array.sum

let rec solve i =
    let eat = [for j=0 to inputs.Length-1 do if i>>>j&&&1 = 1 then inputs.[j]] |> List.sum 
    let s' = s - eat
    if i-1 >= (pown 2 4) then false
    elif s'=eat then true
    else solve (i+1)

if solve 1 then "Yes" else "No"
|> stdout.WriteLine
```

全探索でやりました。
解説を読むとソートしておけば2パターンに絞れるのでそもそもループする必要性がないみたいですね。

# B - MAX-=min
[B - MAX-=min](https://atcoder.jp/contests/arc105/tasks/arc105_b)

``` fsharp
let N = stdin.ReadLine() |> int64
let a = stdin.ReadLine().Split() |> Array.map int64

let rec gcd x y =
    if y=0L then x
    else gcd y (x%y)

Array.fold gcd a.[0] a.[1..]
|> stdout.WriteLine
```

要素全ての最大公約数が答えになることに気づければ簡単でした。こういった解法に気づければ短いコードで済むタイプの問題は好きです(解けるとは言っていない)。
提出する前、gcdの関数で何故かスタックオーバーフローを繰り返してて困っていたのですが、なんてことはなく

``` fsharp
gcd y x%y // 関数gcdの引数にxとyを渡して得られた戻り値をyで割った余りを出す(多分
```

このように書いていた為でした。
F#は大抵の場合コンパイラがはじいてくれるのですが、こういった括弧に気を遣う必要があるのはちょっとネックです。

# 終わりに
AとBを何とか解くことができましたが、B提出までに1時間かかってしまいました。
当面はARCならBまでを、ABCならCまでをできるだけ素早く安定して解けるようになりたいところ。まだ灰色ですが、茶とそれ以降で大きな壁らしいARCならC、ABCならDを攻略できるようになるのが目標となります。
Ansibleコマンドでのワンライナー効率化

# はじめに
`Ansible`と言えば`Playbook`を使った自動化ですが、ちょっとした確認のために`Playbook`を作るのもなぁ・・・って時に使えるワンライナーのコマンドを書き留めていきます。

# Ansibleコマンドオプション
よく使いそうなコマンドオプションのみ抜粋。

|短縮形|完全名|説明|
|:--|:--|:--|
|-a|--args|モジュールへの引数。モジュール指定無しの場合はansibleコマンドへの引数指定|
|-b|--become|権限昇格してコマンド実行するかの指定。パスワード入力が必要な場合、"-K"も必要|
|-i|--inventory|インベントリファイルの指定|
|-k|--ask-pass|SSH接続パスワードの要求|
|-K|--ask-become-pass|特権昇格パスワードの要求|
|-m <モジュール名>|--module-name <モジュール名>|実行するモジュール名の指定|
|-u <ユーザ名>|--user <ユーザ名>|実行ユーザの指定|
|-v|--verbose|詳細モードで実行|
|-vvv|なし|"-v"より詳細に表示|

・その他コマンド詳細
https://docs.ansible.com/ansible/latest/cli/ansible.html

# マジック変数
`Ansible`コマンドをワンライナーで実行するだけなら使う機会が少ないですが、使ったほうが都合が良い場合もあるので記載しておきます。

`Playbook`を作って実行する場合は`Facts`で収集する各種変数を使用できますが、`Ansible`コマンドをそのまま実行する場合は`Facts`で収集する値を使用できないので、変数を使いたい場合は`Facts`が無効の状態でも使用できる変数（`マジック変数`）を使用する必要があります。

変数の使用方法は`Playbook`内での指定と同様、`{{変数}}`で使用できます。

ワンライナーで実行する際に使用できる変数は以下で確認可能です。

```shell:使用できるAnsibleの変数確認
ansible -i [inventory] all -b -a 'echo {{hostvars}}'
```

以下ワンライナーで使えそうな変数の抜粋。

|マジック変数|説明|
|:--|:--|
|inventory_hostname|ホストのインベントリ名（ドメイン含む）|
|inventory_hostname_short|ホストのインベントリ名（ホスト名のみ）|
|inventory_dir|インベントリファイルが存在するディレクトリパス|
|inventory_file|インベントリファイルのパス|
|group_name|ホストが所属するグループ名|
|hostvars|ホストに割り当てられた変数|

詳しくは以下を参照。

https://docs.ansible.com/ansible/latest/reference_appendices/special_variables.html

# イベントリファイルで使用できる変数
`マジック変数`とは別に`インベントリファイル`内で使用できる変数があるのでよく使いそうな変数のみ抜粋。

|インベントリ変数|説明|
|:--|:--|
|ansible_host|接続ホスト名（インベントリホストと異なる名前を付けたい場合）|
|ansible_port|デフォルト以外のポート番号に接続する場合の指定|
|ansible_user|ホストに接続する際に使用するユーザ名|
|ansible_password|ホストに接続する際に使用するパスワード|
|ansible_become_password|特権昇格する際に使用するパスワード|

詳しくは以下を参照。

https://docs.ansible.com/ansible/latest/user_guide/intro_inventory.html#behavioral-parameters

ちなみに後述する`ワンライナーコマンド`は`インベントリファイル`に以下の様な設定を行い、SSH接続パスワード、sudoパスワードの入力を省略しています。

尚、今回の方法の場合、パスワードがそのまま表示されるので、**本番環境などでの使用は極力控えてください。**

```shell:インベントリに設定する変数例
[hostname] ansible_password=[パスワード] ansible_become_password=[パスワード]
```

# Ansibleワンライナーコマンド
普段使ったりしているコマンド一覧。

```shell:コマンド実行例
ansible -i [inventory] all -b -a 'date'
```

```shell:パイプやバッククォートを含むコマンド実行例
ansible -i [inventory] all -m shell -b -a 'cat /etc/hosts | grep 127.0.0.1'
```

```shell:copyモジュールを使用したファイル収集例（ホスト名付き）
ansible -i [inventory] all -m copy -b -a 'src=[管理対象サーバパス] dest=[Ansible実行サーバパス].{{inventory_hostname}}'
```

※`all`はインベントリ内の全ホストを示す指定なので、環境に合わせてグループ指定等行って下さい。

# おわりに
使えそうな`ワンライナーコマンド`を思いついたら随時更新していきます。
vistaでquartus その43

#概要

vistaでquartusやってみた。
俺cpuやってみた。
コンパイラでコンパイルして、アセンブラーでアセンブルした。

#写真

![無題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/8f4ff899-138f-e912-874a-61c41444f661.jpeg)


#メモリー

```
mem[12'h000] = 16'h1001;//       push  1
mem[12'h001] = 16'h302f;//       set  a
mem[12'h002] = 16'h1001;//       push  1
mem[12'h003] = 16'h3030;//       set  b
mem[12'h004] = 16'h202f;//label30:  get  a
mem[12'h005] = 16'h2030;//       get  b
mem[12'h006] = 16'hf004;//       *
mem[12'h007] = 16'h3031;//       set  c
mem[12'h008] = 16'h2031;//       get  c
mem[12'h009] = 16'h100a;//       push  10
mem[12'h00a] = 16'hf005;//       /
mem[12'h00b] = 16'h1030;//       push  48
mem[12'h00c] = 16'hf000;//       +
mem[12'h00d] = 16'he000;//       out
mem[12'h00e] = 16'h2031;//       get  c
mem[12'h00f] = 16'h100a;//       push  10
mem[12'h010] = 16'hf006;//       %
mem[12'h011] = 16'h1030;//       push  48
mem[12'h012] = 16'hf000;//       +
mem[12'h013] = 16'he000;//       out
mem[12'h014] = 16'h1020;//       push  32
mem[12'h015] = 16'he000;//       out
mem[12'h016] = 16'h102c;//       push  ','
mem[12'h017] = 16'he000;//       out
mem[12'h018] = 16'h1020;//       push  32
mem[12'h019] = 16'he000;//       out
mem[12'h01a] = 16'h202f;//       get  a
mem[12'h01b] = 16'h1001;//       push  1
mem[12'h01c] = 16'hf000;//       +
mem[12'h01d] = 16'h302f;//       set  a
mem[12'h01e] = 16'h202f;//       get  a
mem[12'h01f] = 16'h1009;//       push  9
mem[12'h020] = 16'hf001;//       <
mem[12'h021] = 16'h5004;//       jz  label30
mem[12'h022] = 16'h100d;//       push  13
mem[12'h023] = 16'he000;//       out
mem[12'h024] = 16'h2030;//       get  b
mem[12'h025] = 16'h1001;//       push  1
mem[12'h026] = 16'hf000;//       +
mem[12'h027] = 16'h3030;//       set  b
mem[12'h028] = 16'h1001;//       push  1
mem[12'h029] = 16'h302f;//       set  a
mem[12'h02a] = 16'h2030;//       get  b
mem[12'h02b] = 16'h1009;//       push  9
mem[12'h02c] = 16'hf001;//       <
mem[12'h02d] = 16'h5004;//       jz  label30
mem[12'h02e] = 16'h402e;//bye:  jmp  bye
mem[12'h02f] = 16'h0000;//a:  0x0000
mem[12'h030] = 16'h0000;//b:  0x0000
mem[12'h031] = 16'h0000;//c:  0x0000


```

以上。
DBをSQLiteからMySQLに変更する

## はじめに
モデル作ってマイグレートして、シークエルプロでDB確認したら

作ったつもりのデータベースがない！となったので、備忘録として対処法を載せときます。
##解決法
[こちら](https://qiita.com/reeenapi/items/9fc38c4f2f8186c78288)の記事を参考に対処したところ、解決に至りました。
##やったこと
### gemfileの修正
初歩的ミスですが、下画像の選択部分（gemfileのSQLite3）をコメントアウトします。
![スクリーンショット 2020-10-12 6.06.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639411/0d242237-bf89-cd71-b2f9-9c94be151b91.png)
### ターミナルにて
```
bundle install --without production
```
DBを作る必要があるので

```
bundle exec rake db:create
```

そして、これは必要あったのかな？既にやっていたので不要だったかも

```
rails db:migrate
```

###できた
シークエルプロにて、データベースが確認できるようになりました。
![スクリーンショット 2020-10-12 6.18.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639411/b8f4107a-27cf-2f4f-aad0-579a0f73f7aa.png)
C++ノート

# はじめに
どの言語も異なる. C++は`Java`と異なる, Javaは`C#`と異なる. 
`似ている`と`異なる`は同じではない.

# 仕様
## 値渡しだけ
`C#やJava`と異なる.

# STL
## reserveを活用する
## vector::operator[]とvector::atは異なる
境界チェックを行うか行わないか.

# 作法
推奨・考慮されること.

## inline
classに実装を書くとinlineのヒントになる, `C#やJava`とは異なる.
inlineの乱用は, バイナリサイズの肥大化, コンパイル時間の増大を招く.
（感想）コストに対して実行速度が向上する可能性が低い.

## 最適化オプション
一般的に`-O2`相当で十分. これより強い最適化オプションは, コンパイル・リンク時間が特に増大する.
（感想）現在（2020）ではコストに見合うリターンがあると思えない, 利用者が少ないため不具合にあたるリスクが高い, 必ず良くなるかどうかは実測するしかない.

### `march`
 `Clang 12`と`GCC 11`で, `march`のターゲットに`x86-64-v2, x86-64-v3, x86-64-v4`が追加される予定である.
`-march=skylake`等の指定に比べ, 広い命令群の有無で区切ることができるようになる.

`msvc`の場合は, 古いCPUのサポートを切ってもいい場合は, 必ず`/arch:AVX`を指定しておく. AVXにはSSEと同じことをする命令があり, AVXで効率が良くなっている. 従来の命令も残っているため, このオプション指定でAVXの方を使うようになる.
まだ製品のコードには入っていないが, 今のところ不具合はでていない.

# 処理系
## __cplusplus
`msvc`は現在（2020）でも, `199711L`.

# ハードウェア
## 浮動小数点数
x86は, 8087由来の80bit精度.
x86-64は, SIMD命令を使用するため, 32bit or 64bit 精度.
ちょっと便利にするRx

割とよく使う小技。

## リジューム可能なsubcribe
一度、onErrorが呼ばれるとそのストリームに値を流せません。(すでにエラーが起きているよ。と値を流すと例外が飛んでくる)
イベントハンドラ的にobservableを使っていると、一度エラーが起きても復帰させて継続的にイベントを受けたいような時があると思います。
エラー → dispose → 再度subscribeなんていちいちやってられないので、そんな時は、一度 materialize すれば大丈夫です。

```kotlin
// T型を受けるコールバック関数
typealias OnNext<T> = (T) -> Unit
typealias OnError = (Throwable) -> Unit
typealias OnComplete = () -> Unit

@CheckReturnValue
fun <T> Observable<T>.resumeSubscribeBy(
    onError: OnError? = null,
    onComplete: OnComplete? = null,
    onNext: OnNext<T>? = null
): Disposable {
    return materialize()
        .subscribe {
            when {
                it.isOnError -> onError?.invoke(it.error!!)
                it.isOnNext -> {
                   // 例外時はonErrorに渡す
                    try {
                        onNext?.invoke(it.value!!)
                    } catch (e: Throwable) {
                        onError?.invoke(e)
                    }
                }
                it.isOnComplete -> onComplete?.invoke()
            }
        }
}
```


## Notificationと合わせて使う
処理内容に応じて、通知を出し分けたい！
みたいなときありますよね。

拡張メソッドを利用して、以下な感じで。
notificationにしていますが、timberとかに変えてログを残すだけでもおすすめ。
特にスタックをログに残すようにすれば、どの処理かの特定がしやすくなります。

```kotlin
fun <T> Single<T>.withNotification(context: context, notificationBuilder: NotificationCompat.Builder, notificationContent: String): Single<T> {
// val stack = Throwable() // スタックトレース用

    return this.doOnSubscribe {
            notificationBuilder.setContentText("${notificationContent}の処理開始")

            val notificationManager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
            notificationManager.notify(notificationId, notificationBuilder.build())
        }
        .doOnError { err ->
            notificationBuilder.setContentText("${notificationContent}の処理中にエラーが発生しました")

            val notificationManager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
            notificationManager.notify(notificationId, notificationBuilder.build())
        }
        .doOnSuccess {
            notificationBuilder.setContentText("${notificationContent}のを実行しました")

            val notificationManager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
            notificationManager.notify(notificationId, notificationBuilder.build())
        }
}

```


## リトライ
リトライ回数とリトライ間隔を調整したい！
みたな時はよくあるケースです。


```kotlin
flowable
    .take(10) // リトライ数
    .flatMapSingle { err ->
        // 間隔
        return@flatMapSingle Single.timer(1000, TimeUnit.MILLISECONDS)
    }
```

## 分岐
分岐して実行されるストリームを変える。みたいな時。flatMapを使いましょう！

```kotlin

val a = Random.nextInt(10)

Observable.just(a)
    .flatMap {
        if(it == 1) {
            return@flatMap Observable.just("a は 1です！！")
        }
        else {
            return@flatMap Observable.just("1じゃなかったーーー")
        }
    }
    .subscribe {
        Timber.d("結果:${it}")
    }

```
公式のTeX置き場(随時書き足し)

# TeXの公式置き場
追加してほしい公式はコメントにでも投げて
## ２次方程式の解
x=\frac{-b \pm \sqrt{b^{2}-4 a c}}{2 a}

 ```math
x=\frac{-b \pm \sqrt{b^{2}-4 a c}}{2 a}
```
rails db:create実行時のFATAL:  role "admin0" does not existとPG::ConnectionBad: FATAL:  role "admin0" does not existの対処方

rails db:create実行時にエラーが出た際の解決方法について後発者のために解決方法のまとめを書いておく。


#####実行環境
`windows 10 home
ubuntu 20.04 LTS
ruby 2.7.1
Rails 6.0.3
postgresql 11
`

#エラー文

```
$ rails db:create
FATAL:  role "admin0" does not exist
Couldn't create 'taskleaf2_development' database. Please check your configuration.
rails aborted!
PG::ConnectionBad: FATAL:  role "admin0" does not exist
/home/admin0/taskleaf2/bin/rails:9:in `<top (required)>'
/home/admin0/taskleaf2/bin/spring:15:in `<top (required)>'
bin/rails:3:in `load'
bin/rails:3:in `<main>'
Tasks: TOP => db:create
(See full trace by running task with --trace)
```
今回要所となるのは上から5行目まであたりだろうか。

#エラー解決順序
以前私は同じようなエラーに出会っていて既に解決したことがあったので同じ方法をとってみた。
https://teratail.com/questions/297341

```
$ yarn install
```
だがこれでも解決できなかった。

エラーがPG::ConnectionBad:である点に着目してみることにする。
だが以下のコマンドのようにDBは起動しているはずだし、、、？

```
$ sudo service postgresql start
[sudo] admin0 のパスワード:
 * Starting PostgreSQL 11 database server　[ OK ]
 * Starting PostgreSQL 13 database server ［ OK ]
```
別（下）の手段で起動にチャレンジしてみることにした。

```
$ sudo su - postgres
 \q
```
再度`rails db:create`を実行したところエラー文に変化が現れた。

```
$ rails db:create
WARNING:  could not flush dirty data: Function not implemented
Created database 'taskleaf2_development'
WARNING:  could not flush dirty data: Function not implemented
Created database 'taskleaf2_test'
```
あとはこのエラー文で検索したところ
https://stackoverflow.com/questions/45437824/postgresql-warning-could-not-flush-dirty-data-function-not-implemented
こちらが有力そうだったので
`/etc/postgresql/11/main/postgresql.conf`の内容の一部を以下のように書き換えた

```
fsync = off
data_sync_retry = true
```
再度`rails db:create`を実行してみる

```
rails db:create
Database 'taskleaf2_development' already exists
Database 'taskleaf2_test' already exists
```
どうやら成功したようだ。
サーバーも起動できたので今回はこれで問題解決したと判断する。
複数のObservableをまとめてSubscribeする方法

以下のように、`zip`を利用すると複数のObservableを同時に一つの配列としてsubscribeすることができます。

```typescript
zip(of(1), of(2), of(3)).subscribe((arr: [1,2,3]) => {
   console.log(arr)
})
// => [1,2,3]
```
【実務未経験】初学者が0から学ぶTypeScript③

参考：[TypeScriptの型入門](https://qiita.com/uhyo/items/e2fdef2d3236b9bfe74a "Qiita"),　[TypeScript Deep Dive 日本語版](https://typescript-jp.gitbook.io/deep-dive/)
前回：[【実務未経験】初学者が0から学ぶTypeScript②](https://qiita.com/Kashiwaya123/items/1bde024a2f10c6e51ef4)
※もし私の記事に誤りがありましたら、ご教示いただけますと幸いです。

##配列型
配列が持つデータに型を付けられる。

`const 定数名: 配列の型名[]`

```ts
const a: number[] = [1,2,3,4];
const b: boolean[];

a.push(5);
b = [true, false, true];

a.push("maguro");
//aの配列には数値しか入らないので型エラー
```

##関数型
関数の引数や返り値に型を付けられる。

`const 関数名:(引数名:引数の型名) => 返り値の型名`
`function 関数名(引数名:引数の型名): 返り値の型名 {行う処理};`

```ts
const checkTuna:(tuna: string)  => boolean;
```


返り値がない時は`void`という型を指定できる。
>void :中身がない、空っぽの、役に立たない、効果がない


```ts
function showTuna(): void {
  console.log('まぐろ');
};
```

##nullとundefined
`null`型と`undefined`型は他の型に代入できる。
[TypeScript Deep Dive 日本語版-nullとundefined](https://typescript-jp.gitbook.io/deep-dive/recap/null-undefined)

```ts
const fishName = string;
const fishSize = number;
fishName = undefined;
fishSize = null;
```
postgers tde

DB暗号化
https://it-trend.jp/database/article/89-0064
http://pgsqldeepdive.blogspot.com/2015/06/postgresql-nec-tde.html

https://security.sios.com/vulnerability/postgres-security-20160413.html
http://kumakake.com/linux/3788
not tde
https://qiita.com/niharu/items/f812ca3ba924ed94eefd


psql 公式
https://www.postgresql.jp/document/10/html/server-start.html
psql 10
https://weblabo.oscasierra.net/postgresql10-centos7-install/
psql 9
https://weblabo.oscasierra.net/postgresql92-centos7-install/

laravel 
https://re-engines.com/2019/06/27/laravel%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E3%81%AE%E6%9A%97%E5%8F%B7%E5%8C%96%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6%E8%80%83%E3%81%88%E3%81%A6%E3%81%BF%E3%82%8B/
Adobe XDのデザインカンプからコーディングに必要な値を取得する


# XDのデザインカンプから必要な値を取得するためには？

###1、各項目の数値の表示方法

カンプ内の画像やテキストをクリックすると右側に、各項目の数値が表示される。

![xd.adobe.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/783457/065d2c82-51ee-7e8b-274d-62feb3daa74e.png)

ここから得られる数値は以下の通り。

+ **font-family** （⓵）→　游ゴシック体
+ **font-weight** （⓵）→  Bold
+ **font-size** （⓶）→ 24px
+ **line-height** （⓶⓷）→ 1.7（41px ÷ 24px）
+ **letter-spacing** （⓶⓸）→ 0px（24px × 0）*
+ **color** （⓹）→ #333333（⓹をクリックするとコピーできる）
+　**width (w)→　182px
+　**height (H) →　24px



###*letter-spacingについて
⓸の値が文字間隔（トラッキング）をさす。
今回は⓸の値が0でしたが、そうじゃない場合にどうしたらletter-spacingを計算できるのかをメモ。

`（例）⓶のFont-sizeが16px、⓸のAVが75の場合`
  **トラッキング数値 ÷ 1000**で出た数値に**'em'**をつける。
つまり75÷1,000=0.075em となる。
この数値をそのまま使うか、pxに直す場合は16px × 0.75=1.2px とする。


###2、余白の測り方
余白を測りたい対象を選択した状態で、Altキーを押しながら他の対象の上にマウスを移動すれば、画面上に余白の値が表示される。

参照：https://haniwaman.com/xd-coding/
docker-composeでホストのネットワークの好きなIPを指定して立ち上げる

# やりたいこと
`docker-compose up` ホストのネットワークの好きなIPアドレスを指定して立ち上げる

# なんの意味があるの？
基本は不要でnginx-proxyやtreafikなどのサービスディスカバリを使うのが正しい方法だと思う。
とはいえ、それじゃできないまれな↓みたいなユースケースもあると思うので備忘録として残しておく。

- 社内インフラなどIPを固定にしたいとき
- IPをずらして、ポートのブッキングを回避したいとき
    - 8080,8081,8082...みたく、どのポートが空いているのかバトルにならないように

# やりかた
`macvlan` のnetwork driverを使う。

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

services:
  web01:
    image: nginx
    networks:
      macvlan:
        ipv4_address: 192.168.1.10
    # ports
    #  - "80:80" dockerのhostネットワークみたく、指定したIPでポートが全開放なので基本は不要
    ...etc

  web01:
    image: nginx
    networks:
      macvlan:
        ipv4_address: 192.168.1.20
    # ports
    #  - "80:80" IPが違うのでポートがブッキングしない
    ...etc

...etc

networks:
  macvlan:
    driver: macvlan
    driver_opts:
      parent: eno1 # 端末のネットワーク・インターフェースを指定する
    ipam:
      config:
        - subnet: 192.168.1.0/24
          gateway: 192.168.1.1
```
【Docker】dockerのコンテナからホストにファイルをコピーする

# はじめに
dockerのコンテナからファイルをローカルに持ってきたい場面があった。そこで調査したことをメモとして残しておく。

# 手順
1. docker psコマンドを使用し、ファイルをコピーしたいdockerコンテナを調べる
2. docker cpコマンドを使用し、コンテナからホストにファイルをコピーする

実際にhttpdコンテナの設定ファイルであるhttpd.confをコンテナからローカル（ホスト）にコピーする手順を例として示す。
## 1.ファイルをコピーしたいdockerコンテナを調べる。
以下のコマンドを実行し、コンテナIDを調べる。

```
$ docker ps -a
CONTAINER ID        IMAGE                  COMMAND                  CREATED             STATUS              PORTS                               NAMES
1c8caa876b98        httpd:2-alpine         "httpd-foreground"       24 hours ago        Up 24 hours         0.0.0.0:8080->80/tcp                fluentd_docker_httpd_1
```
上記コマンドより、コンテナIDが`1c8caa876b98` とわかった。

## 2. コンテナからホストにファイルをコピーする
以下のコマンドを実行し、ファイルをコピー

```
//docker cp [コンテナID]:[コピーしたいファイルパス] [ローカルにコピーしたいパス]
$ docker cp 1c8caa876b98:/usr/local/apache2/conf/httpd.conf conf/

$ ls conf/
./		../		httpd.conf
```

コピーできた！


# まとめ
- dockerコンテナからホストにコピーする
    - docker cpコマンドを使用する
    
```
docker cp [コンテナID]:[コピーしたいファイルパス] [ローカルにコピーしたいパス]
```
sanitizeメソッドをView以外で使いたい。

現在開発中のアプリのセキュリティ診断を行ったのですが、XSS（クロスサイトスクリプティング）とかいう脆弱性が見つかり、対応することになりました。
Web開発者としては当たり前すぎる知識らしいですが、今回対応するのが初めてだったのでなかなか手こずりました。つまずいたことがいくつかあったので、今回はその中の一つを書いていこうと思います。

## 実現したいこと
https://qiita.com/kamohicokamo/items/571c58f2d6738a7dfe6a
この記事を参考に、XSS対策のためにデータのサニタイズを行いたい。

### 例：　

```haml:name.html.haml
'山田太郎<script>alert("山田太郎です")</script>'
```
このまま表示すると、
![スクリーンショット 2020-10-12 1.19.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518222/6fcf8ff8-04bf-d96c-d19c-ef295a0f8814.png)

埋め込んだJavaScriptが実行されてしまう。これはセキュリティ的にまずい。

```haml
= sanitize '山田太郎<script>alert("山田太郎です")</script>'
```

この`sanitize`を使うと、

![スクリーンショット 2020-10-12 1.19.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518222/10afc53b-e295-ece8-410a-010615a034af.png)

このようにscriptタグが除去され、ただのテキストになる。

### しかし

わざわざViewに`sanitize`と書いても良いが、htmlタグが混ざっている文字列が入力された段階で無効化しておきたい。

しかし、この`sanitize`メソッドはヘルパーメソッドなので、View以外では使いにくい…

## 方法

こんな感じのメソッドを作った。

```ruby:model
def remove_script_tag(str)
  ActionController::Base.helpers.sanitize(str)
end
```
※`sanitize`メソッドはデフォルトでは`<script>`タグくらいしか除去してくれないので、`remove_script_tag`としてある。

このメソッドを`before_validation`なり`before_save`でうまいこと使えば、悪意のあるスクリプトが文字列として送られてきても無効化することができるはず。

## 環境
ruby 2.6.6
rails 6.0.3.2
Carbonで何週目の何曜日の日付を取得する

日付処理を扱う上で、carbonに非常に助けられている今日この頃だが、思ったより簡単に書けない処理があり、暫定で作ったものを備忘録として残す。それもっと簡単に行けるで、という情報があれば是非教えていただければと思う。
#前提
日曜始まり土曜終わりを１週として、日曜から順に0,1,2...と曜日と数字が対応している。

```php
['sun' => 0, 'mon' => 1, 'tue' => 2, 'wed' => 3, 'thu' => 4, 'fri' => 5, 'sat' => 6,]
```
１週目、２週目、、、５週目とn週目とnが対応している。

```php
['１週目' => 1, '2週目' => 2, '3週目' => 3, '4週目' => 4, '5週目' => 5, '6週目' => 6]
```

#要件
n週目のm曜日を入力値として与えられた時に、日付を返す。

```php

public function getDate($week_of_month, $weekday)
{
  // return '2020-10-19'
}
```

#Carbonじゃダメなの？
Carbonにも何週目か判定するメソッドや、曜日を判定するメソッドなどなど便利なメソッドが多々あるが、何週目かの計算が、月曜始まりのものと、単純に7日づつ加算して算出するものしかなく、日曜始まりで扱いやすそうな処理が書けなかったので断念

```php
//月曜始まりで、n週目を計算。
$carbon->weekNumberInMonth;
//７日間づつ計算
$carbon->weekOfMonth;
```

#2020/10/12追記
@vf8974 さんより、標準関数でより簡潔にかける方法をいただいたので追記

```php
public function getDay($params)
    {
        // DateTimeImmutableインスタンス
        $d = new \DateTimeImmutable();
        // 年(省略時は今年)
        $year = $params['year'] ?? $d->format('Y');
        // 月(省略時は今月)
        $month = $params['month'] ?? $d->format('m');
        // 対象月1日
        $firstDay = $d->setDate($year, $month, 1);
        // 対象月1日の曜日
        $firstDayOfWeek = $firstDay->format('w');
        // 対象月の最終日
        $lastDay = $firstDay->format('t');
        // 第num week曜日の日
        $day = 1 + ($params['num'] - 1) * 7 + ($params['week'] - $firstDayOfWeek) % 7;
        // $dayが当月範囲内ならYYYY-MM-DDを、範囲外ならfalseを返す
        return $day >= 1 && $day <= $lastDay ? sprintf('%04d-%02d-%02d', $year, $month, $day) : false;
    }
```


#書いたコード
日曜始まりの簡易的なカレンダーを作成し、曜日加算するという二段構えで実装した。

```php
     protected $month_weeks;

     public function __construct()
     {
       $this->month_weeks = $this->createWeekOfMonths($this->argument($target_month))
     }
     /**
     * @param Carbon $start_of_month
     * @return array
     */
    public function createWeekOfMonths(Carbon $start_of_month): array
    {
        //start_of_month='2020-11-01'
        $target_month_weeks = [];
        //月初の曜日取得 start_of_month_weekday=0, (ie, sunday)
        $start_of_month_weekday = $start_of_month->weekday();
        //対象月の初週の日曜日を、取得
        $target_sunday = (new Carbon())->createFromTimestamp($start_of_month->timestamp)->subDays($start_of_month_weekday);

        while ($target_sunday->lte($target_month->endOfMonth())) {
            array_push($month_weeks, (new Carbon())->createFromTimestamp($target_sunday->timestamp));
            $target_sunday->addDays(7);
        }
        return $month_weeks;
    }
//$this->createWeekOfMonths('2020-11-01');
//['2020-11-01','2020-11-08','2020-11-15','2020-11-22','2020-11-29']
```
こうすると配列のIndexがそのままn-1週目になっている形で取得できるので、あとはこの簡易カレンダーをもとにn週目,n曜日の条件から日付を取得する。

```php
public function getDate($week_of_month, $weekday)
{
  $target_date = array_key_exists($week_of_month - 1, $this->month_weeks) //n週目存在チェック
                ? (new Carbon())
                    ->createFromTimestamp($this->month_weeks[$week_of_month - 1]->timestamp) //n週目の日曜日のCarbonオブジェクト取得
                    ->addDays($weekday) //m曜日のm分加算　(2020-11-01 sun(0) -> 2020-11-03 tue(2))
                : null;
  return $target_date;
}
```

#まとめ
簡易カレンダー作成にループ使用するのが若干嫌な気がしますが、暫定版なのでひとまずこれで対応。