OmniAICreator/Qiita-1.07M huggingface dataset:
bitcoin-rubyでp2pkhマルチシグスクリプトをアンロックするトランザクションを作成する

# 環境
bitcoin-ruby v0.0.18
ruby v2.6.0(by rbenv)
bitcoind v0.17.0.0-5b47b8efd
bitcoin-cli v0.17.0.0-5b47b8efd

# やること
p2pkhマルチシグスクリプトでロックされたトランザクションをinputにして、そのスクリプトをアンロックするトランザクションを`bitcoin-ruby`で作成する

# bitcoin-rubyでつくるその他のトランザクション
[一般的なp2pkhトランザクションをbitcoin-rubyで](https://qiita.com/kanna/items/7fe607ec6f6321f2cdc9)
[p2pkhマルチシグトランザクションをbitcoin-rubyで](https://qiita.com/kanna/items/bcea33d5d771a18a56f8)
今回行うことのサンプルコードは[こちら](https://gist.github.com/kannapoix/3eb15442dc7ba220fd1ec3b544d02e6b)

# inputを作成する
一般的なp2pkhトランザクションとほぼ同じ。
`Builder`モジュールを使ってトランザクションを作成する。
`signature_key`に渡す`Key`インスタンスが複数になる場合があるだけである。
複数の場合は配列で渡せばよいです。

今回仮定する変数は以下とする。

|項目|値|
|:-:|:-:|
|前トランザクション|da85de487c78bd312ab6806f6497f5ad1b9c480d3f71869b7472919959ba99be|
|前スクリプト|522102ec35d437a41da7ab7f8b8024377ff6b532b49fb95804a73c41af6510663eaf4121039976de4fc156fe8dc5282d89eaf7ddc5e26494877eb8d995d732cd87791a45f421036647aa901188f4e784bd251e8ddb7802239b911ab66fa90165a3fe5320328ebf53ae|
|outputインデックス|0|
|有効な署名を作成できる秘密鍵1|cNBfQu3fAJ1QXMrLvd4PGNAd7RzjUj62kHbkL9owNF2zN2g3M4GB|
|有効な署名を作成できる秘密鍵2|cPJSC2SZqW3d9EWZTWtnDdGUQY7HFWcCH3cSm4kkkDpidJxp188N|
|有効な署名を作成できる秘密鍵3|cMujetBk2WXGwnyA1pWZHYLrGVwk1h5V4nYnCQhr9kJshWKPgNpZ|


```ruby
potential_signers = [
  'cNBfQu3fAJ1QXMrLvd4PGNAd7RzjUj62kHbkL9owNF2zN2g3M4GB',
  'cPJSC2SZqW3d9EWZTWtnDdGUQY7HFWcCH3cSm4kkkDpidJxp188N',
  'cMujetBk2WXGwnyA1pWZHYLrGVwk1h5V4nYnCQhr9kJshWKPgNpZ',
]
signers = potential_signers.sample(2).map do |address|
  Bitcoin::Key.from_base58 address
end


tx = build_tx do |t|
  t.input do |i|
    i.prev_out 'da85de487c78bd312ab6806f6497f5ad1b9c480d3f71869b7472919959ba99be' #txid
    i.prev_out_index 0
    i.prev_out_script '522102ec35d437a41da7ab7f8b8024377ff6b532b49fb95804a73c41af6510663eaf4121039976de4fc156fe8dc5282d89eaf7ddc5e26494877eb8d995d732cd87791a45f421036647aa901188f4e784bd251e8ddb7802239b911ab66fa90165a3fe5320328ebf53ae'.htb
    i.signature_key signers
  end
end
```

# output
outputは任意のスクリプト宛に作成します。
一般的なp2pkhスクリプトにした場合以下のようになります。

```ruby
potential_signers = [
  'cNBfQu3fAJ1QXMrLvd4PGNAd7RzjUj62kHbkL9owNF2zN2g3M4GB',
  'cPJSC2SZqW3d9EWZTWtnDdGUQY7HFWcCH3cSm4kkkDpidJxp188N',
  'cMujetBk2WXGwnyA1pWZHYLrGVwk1h5V4nYnCQhr9kJshWKPgNpZ',
]
signers = potential_signers.sample(2).map do |address|
  Bitcoin::Key.from_base58 address
end

# Recipient
# recipient address muaJ6gXpMn6mUQxbAtgDUnnaNDVDfX6emo
# dumpprivkey get WIF privkey cNBfQu3fAJ1QXMrLvd4PGNAd7RzjUj62kHbkL9owNF2zN2g3M4GB
privkey = 'cTx5t224vzS8vXWpfZJwCMEvkGA89APnzy94umbscgovjLU7HitV'
recipient = Bitcoin::Key.from_base58(privkey)

tx = build_tx do |t|
  t.input do |i|
    i.prev_out 'da85de487c78bd312ab6806f6497f5ad1b9c480d3f71869b7472919959ba99be' #txid
    i.prev_out_index 0
    i.prev_out_script '522102ec35d437a41da7ab7f8b8024377ff6b532b49fb95804a73c41af6510663eaf4121039976de4fc156fe8dc5282d89eaf7ddc5e26494877eb8d995d732cd87791a45f421036647aa901188f4e784bd251e8ddb7802239b911ab66fa90165a3fe5320328ebf53ae'.htb
    i.signature_key signers
  end

  t.output do |o|
    o.value 1998000000
    o.to recipient.addr
  end
end
```

サンプルコードは[こちら](https://gist.github.com/kannapoix/3eb15442dc7ba220fd1ec3b544d02e6b)です。
Einstein Analytics ウィジェットのIDをメンテナンスする

記事作成時のバージョン：Winter'19
## ダッシュボードデザイナの仕様
Einstein Analytics でダッシュボードを作成する場合、
ダッシュボードデザイナというツール(というか画面)で構築していくことになる。
![ダッシュボードデザイナ.png](https://qiita-image-store.s3.amazonaws.com/0/153488/e860cc73-fb22-8339-e117-6173c6c3fe23.png)
左側から配置したいウィジェットを選んで、真ん中のダッシュボードに置く。
右側にウィジェット毎のプロパティが表示されるので調整する、という流れ。

ウィジェットを置くと固有のIDが割り当てられるが、このネーミングがイマイチ。
「XXXXX_1」「XXXXX_2」みたいな感じ。変更もできない。
![画像コンポーネント.png](https://qiita-image-store.s3.amazonaws.com/0/153488/fc3bae6d-2d2f-0529-7e92-ed9bdfb3fba8.png)
エラーもどこで起こっているのか分かり難い。
![エラー.png](https://qiita-image-store.s3.amazonaws.com/0/153488/744a4a3c-6398-3dc6-8b41-34a3e4bdc4e6.png)
## JSONエディタモードでのメンテナンス
割り当てられたIDは、JSONエディタモードに切り替えて変更する。

ダッシュボード or ダッシュボードデザイナ の画面で、
Ctrl + E を押すことでJSONエディタモードに切り替わる。(参考：[Analytics ダッシュボードおよびレンズのキーボードショートカット](https://help.salesforce.com/articleView?id=bi_dashboard_keyboard_shortcuts.htm&type=5))
![JSONエディタモード1.png](https://qiita-image-store.s3.amazonaws.com/0/153488/551cdfdd-18cc-08f9-b16c-ceb0ea4af419.png)

割り当てられたIDを書き換えて保存する。
ブラウザ上で修正してもいいが、テキストエディタ等での置換が安全。
![JSONエディタモード2.png](https://qiita-image-store.s3.amazonaws.com/0/153488/8e47a016-6b61-076b-6357-f7cb2936b4fe.png)
Macの画面をロックする方法

Macの画面をショートカットキーでロックする方法
セキュリティ意識を高めましょう。
`Ctrl + Cmd + Q`

<img width="243" alt="スクリーンショット 2019-01-22 12.58.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/226008/5bd3828e-8af0-fccd-ecb8-ab5fb20c97ee.png">
横画面でTextViewの文字数制限をする時に気をつけること

`TextView`内で文字数制限をしたいことがあると思いますが、横画面対応してるアプリである条件の時にクラッシュしたため、気をつけることをまとめました。
## 環境
- Xcode10.1
- Swift4.2


## 文字制限コード
基本的な文字数制限のコードは以下のように書けます。

``` ViewController.swift
import UIKit

class ViewController: UIViewController {
    enum Const {
        static let maxStringCount = 5
    }
    
    @IBOutlet var textView: UITextView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        textView.delegate = self
    }
}

extension ViewController: UITextViewDelegate {
    func textViewDidChange(_ textView: UITextView) {
        guard let text = textView.text else { return }

            if textView.markedTextRange == nil && textView.text.count > Const.maxStringCount {
            let endIndex = text.index(text.startIndex, offsetBy: Const.maxStringCount)
            textView.text = String(text[..<endIndex])
        }
    }
}

```

動作GIFは以下のようになります。
![first.gif](https://qiita-image-store.s3.amazonaws.com/0/116582/df20818c-25f0-3acc-a508-0752fbcf21c7.gif)


## 注意点
しかしこれだと、iPhoneの横画面やiPadの場合、キーボード入力でUndo・Redoした際にクラッシュします。
Undoとは以下のスクリーンショットのオレンジ色の部分です。
##### Undoスクリーンショット
|iPhone|iPad|
|:-:|:-:|
|<img src="https://qiita-image-store.s3.amazonaws.com/0/116582/aabf18e9-3952-51e2-9ecc-e9c684d63dca.png" width=100%>|<img src="https://qiita-image-store.s3.amazonaws.com/0/116582/3a65b69c-6bd6-7a4c-fd98-e09dbbe9c787.png" width=100%>|

上記のコードのままUndoを押すと、クラッシュします。
![crash.gif](https://qiita-image-store.s3.amazonaws.com/0/116582/dd052cda-772f-35cb-b760-41ead47477e9.gif)





## 対策
Undo・Redo中なのかどうかを判断するため、`textDidChange`内で`textView.undoManger.isUndoing`と`textView.undoManger.isRedoing`を条件に追加します。

## 完成コード
```ViewController.swift
import UIKit

class ViewController: UIViewController {
    enum Const {
        static let maxStringCount = 5
    }
    
    @IBOutlet var textView: UITextView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        textView.delegate = self
    }
}

extension ViewController: UITextViewDelegate {
    func textViewDidChange(_ textView: UITextView) {
        guard let text = textView.text,
            let isUndoing = textView.undoManager?.isUndoing,
            let isRedoing = textView.undoManager?.isRedoing else { return }
        
        if !isUndoing
            && !isRedoing
            && textView.markedTextRange == nil
            && textView.text.count > Const.maxStringCount {
            let endIndex = text.index(text.startIndex, offsetBy: Const.maxStringCount)
            textView.text = String(text[..<endIndex])
        }
    }
}
```

## 動作GIF
Undoしても問題なく動作します。

|動作|動作GIF|
|:-:|:-:|
|文字数オーバー→確定|![success.gif](https://qiita-image-store.s3.amazonaws.com/0/116582/361a85e9-b652-754e-8a3c-81637265dc69.gif)|
|文字数オーバー→Undo|![undo_success.gif](https://qiita-image-store.s3.amazonaws.com/0/116582/55bf7f06-a4eb-7556-1072-9ae016f9a781.gif)|
📝 root権限無しで利用できるらしいRed Hat Enterprise Linuxの新コンテナエンジン Podman が気になるだけの人生だった



# Ref

[Red Hatが開発するDocker互換の新コンテナエンジン「Podman」、バージョン1.0に到達 － Publickey](https://www.publickey1.jp/blog/19/red_hatdockerpodman10.html)

# Docker 互換のコンテナエンジンとは

互換性のあるコンテナエンジンと、ないコンテナエンジンがある感じだろうか

# Linux の標準コンテナエンジンになる？

>Red Hat Enterprise Linux 8が正式版となったときにはDockerの代わりにPodmanが標準のコンテナエンジンになるとの指摘もあります。

コンテナエンジンとは

[いまさら聞けないコンテナ入門 | TechCrunch Japan](https://jp.techcrunch.com/2016/10/17/20161016wtf-is-a-container/)

>コンテナの場合、コンテナエンジンが大雑把ではあるがこれに対応している。中でもDockerエンジンが現在最も人気の高いものである。

# よりLinux のコアな部分に組み込まれるイメージだろうか

>Podmanはコマンド実行にdaemonを用いず、ルート権限などを要求しないことで運用などを容易にしています。


---

https://twitter.com/YumaInaura

https://github.com/YumaInaura/YumaInaura/issues








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Ubuntu 16.04 x64 + VsCode + Code Runner で Python3を使ってみる

#目的
Code Runner のデフォルトの Python2 を Python3 に切り替えてみる
\# これでいいのかなぁ・・・
追記 2020/06/22
修正になったバージョンが不明なのだけど　1.46.1 の時点では以下の手順で修正する
・ファイル -> 基本設定 -> 設定
・検索ボックスに Code-runner:Executor Map を入力する
<pre>
・setting.json で編集をクリックする
 ・修正前
    "code-runner.executorMap": {
    }
 ・修正後
    "code-runner.executorMap": {
        "python": "python3 -u"
    }
</pre>

##VsCodeをインストールする
[Download Visual Studio Code](https://code.visualstudio.com/download)
より .deb 64bit をDLする
$ sudo dpkg -i code_1.30.2-1546901646_amd64.deb
以下が追加される
$ ls /etc/apt/\*/\*
 /etc/apt/sources.list.d/vscode.list
 /etc/apt/trusted.gpg.d/microsoft.gpg
##pylintをインストールする
$ sudo apt install python-pip
$ sudo apt install python3-pip
$ sudo pip3 install pylint
##拡張機能の追加
　Japanese Language Pack for VS Code
　Code Runner
　Python for VSCode
##Code RunnerでPython3をキックする
codeを起動後
・ファイル -> 基本設定 -> 設定　で Setting を開く
・設定の検索で executorMap を入力する
・ユーザー設定に以下を追加後保存する

<pre>
    "code-runner.executorMap": {
        "python": "python3 -u"
    }
</pre>
追記 2020/06/22
修正になったバージョンが不明なのだけど　1.46.1 の時点では以下の手順で修正する
・ファイル -> 基本設定 -> 設定
・検索ボックスに Code-runner:Executor Map を入力する
<pre>
・setting.json で編集をクリックする
 ・修正前
    "code-runner.executorMap": {
    }
 ・修正後
    "code-runner.executorMap": {
        "python": "python3 -u"
    }
</pre>

##サンプルの実行
```py:test01.py
# _*_ coding: utf-8 _*_
# coding:utf-8 <-- こちらの方が良いようだ？？
# Windows Add env PYTHONIOENCODING = UTF-8 & restart vscode
print('日本語')

[Running] python3 -u "/path/to/dev/vscode/python/samp/test01.py"
日本語

[Done] exited with code=0 in 0.05 seconds
```
\# \_\*\_ coding: utf-8 \_\*\_ の有無にかかわらず、正しく実行される
##VsCode をランチャーに登録してみる
　ランチャーに常時アイコンを表示したい場合は、アプリケーションを起動した後
　ランチャーのアイコンを右クリックしてLauncherに登録をクリックすれば常時表
　示されるようになります。
##参考にしたサイトはこちら
[Can't use python3 #366](https://github.com/formulahendry/vscode-code-runner/issues/366)
[Ubuntu 16.04 LTSの使い方 (基礎編)](https://sicklylife.jp/ubuntu/1604/tsukaikata/usage.html)
実機でのpx確認

結合テストの段階で実機でViewのマージンや幅がコード上で設定したpxの値になっているかどうか確認することがあり、その確認をするためのメモ
より良いプラクティスあれば教えてください

## 実機で動作確認したものを実測で測る

* Android Studio(画像右下) 等でスクショを取る 
![スクリーンショット 2019-01-22 12.19.08.png](https://qiita-image-store.s3.amazonaws.com/0/260353/0ae15965-9320-b1c2-8a89-5f7cfc082ce7.png)

* GIMPやMac/Windows標準の画像プレビュー機能を使って距離を測る (距離`D`とする)
* 距離Dは端末解像度によって依存するので、動作確認している端末がどの解像度か確認する
    * 参考程度に[au端末のデータ](https://www.au.com/developer/android/kishu/display/)
* 解像度の値を参照して160　(mdpiの解像度)で割り算 (倍率`R`とする)
* `D/R` がコード上で設定したpxと一致していればok

* 例
    * コード上であるViewのマージンを30pxとしていてそれが実機でそうなっているのか確認したい
    * 端末はXXhdpi(480)
        * R = 480 / 160 = 3
        * そのため画像からの実測値では 30px * 3 = 90px となっていれば良いことになる


##  おまけ

dpからpxへの変換

```kotlin
fun convertToPx(context: Context, dp:Float) : Float {
    val metrics: DisplayMetrics = context.resources.displayMetrics
    return dp * metrics.density
}
```
名刺を持たないエンジニア。Twitter/Qiita/Githubアカウント交換には、自分の本名をひらがなでGoogle検索できるようにしておけば良い。

名刺を持たないエンジニア。Twitter/Qiita/Githubアカウント交換には、自分の本名をひらがなでGoogle検索できるようにしておけば良い。

大阪IT勉強会で遂にこのメソッドが役立った。

[大阪IT勉強会 (@osaka_it) | Twitter](https://twitter.com/osaka_it)

# ポイント

- 漢字は入力しにくい、Google検索しにくい
- Rubyの父、まつもとゆきひろに習って、入力しやすい、ひらがなの氏名を使う
- 僕の場合は Qiita に名刺的な、名前を入れた記事を置いている

![image](https://user-images.githubusercontent.com/13635059/51511098-47567000-1e43-11e9-90d0-63d31afaab92.png)










<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
ターミナルを探して三千里（Windows版）

# tl;dr
Windows10の、WSLな環境の方向け、
いまのところ**一番使いやすい**、**見た目が整っている**ように思うターミナルにたどり着くまでのお話です。
忙しい方は以下のDL先から**wsltty**をどうぞ。

## ※おことわり
コマンドプロンプトとpowershellをdisって居ますが、それぞれ私がわからないだけで、Windows内での開発に特化された環境になっているのかな？と思っています。
このため、あくまで **Web系** で **Linuxのようなもの** を触りたい人の感想、と捉えてください。

# 環境
Windows10 home
WSL (導入については[拙著](https://qiita.com/oratake/items/2f999bf9c088edac8ce5)にて)
## DL先
wslを使用しているため、minttyのwsl版(wsltty)を使う。
https://github.com/mintty/wsltty/releases

ターミナルのインストールファイルがどこにあるかわからないんですよね。
tmuxは相変わらず崩れたままなので、まだ使えてません。

以下、快適なターミナルを求める戦いの記録
# NKT...(長く苦しい戦いだった)
だった、と過去形で〆てますが、未だに満足は出来ていません。
どうやったってmacで構築する環境には、遠く及ばないのですから。
以下、今回の紆余曲折についてです。
## 紆余曲折
現在の会社に入社して慣れないWindowsで開発をすることになった。
環境について周りに伺おうにも、エディタはDreamweaverかSublimeText（サクラエディタの方もいた）であったため、
当時使っていたAtomを使う一人のセンパイとよく情報交換していた。
（その後すぐVSCodeになり、現在はwsl内でneovim動かしてます。）

鯖管理はインフラエンジニアがおらず、プログラマが片手間でやっている状態で、
ターミナルについても大半が当然使えないとのこと。

今まで趣味でCentOSでサーバーを運用してmacで開発していた小生はかなり戸惑った。
ので、研修の期間に隙間隙間で、自分の環境を整えることにした。
以下、大凡の導入順で素人の一言感想を述べていく。

### cmd.exe
コマンドプロンプト？
お父さんはlsもpwdもわからない子に育てた覚えはありません。
勘当です。

### powershell.exe
Windows公式のshell環境。
ダサい。
いや、いじれば使い勝手良くなるのかもしれないけど...
そしてコマンドこそそこそこlinuxっぽいのがあるけども、
初期状態でviがなかったり、
linuxで見るような挙動と違う部分が多々(lsの表示とかエラーの出方とか)あり、
ところどころ気に障ったのでお蔵入り。

### 仮想でubuntu動かす
Gnomeなんて動かしたら支給貧弱PCでは遅くてかなわないと思ったので、
思いついた瞬間却下。

### MYSYS2(MinGW)
Win上でshell動かすもの。powershellより見やすいのである程度これで使っていた。
（後から気づいたが、これターミナルはminttyでした。結論のWSLttyとモノは同じ）

このあと、フロントエンド開発の都合でgulpに手を出すと、いろいろと不具合が出てきたため、またいろいろと探す。

### WSL(の標準ターミナル)
このあたりで、windows上でlinuxが動く(仮想じゃないよ)というWSLを見つける。
gulpもある程度使えたので、WSLの標準ターミナルをすこし使っていた。

このあたりで、shellの環境をリッチにしたく、改善をし始める。
手始めにshellをbashからfishにしたり、powerlineで見た目を小奇麗にしたりしたが、
WSL標準のターミナルで表示がうまく行かず、代わりのターミナルをさがす

### ConEmu
割と長く使っていたターミナル。
設定が死ぬほど多い、カラースキームの設定がし辛いということがあるが、
表示自体はわりと安定していた。
powerlineやfishの表示がコマンドを打つ度に崩れていたので、他に候補がないか探し始める。

### Hyper
またでたElectron。
Reactで拡張機能開発できるよ。という触れ込みのターミナル。
非力なマシンではやはりAtomでも感じた重さがあったため、泣く泣く断念。
わりと見た目は好みだったかも。

### Fluent Terminal
Windows10のデザインはFluent Designというそうですが、
そいつにあわせたデザイン。
win10とは親和性高そうです。
こちらもデザインは綺麗だったものの、またpowerlineとソリが合わず断念。

### mintty (私はwsltty)
いまのところ、さいつよ。
ある程度powerlineで綺麗に表示されている。fishの補完も致命的にはずれていない気がする。(2,3文字か1行は平気でずれる。これどうにもならないのかな。)
といいつつ、ConEmuで使っていたほどしょっちゅう起こるというわけでもなく。(ただし5回に1回は起きてる？ような気分。頻発に変わりはない)

> ■ 追記 19/07
> そういえば最近、表示のズレがなくなってきた。fishやpowerlineの入れ直しをしたからかと思う。
> fishには [bobthefish](https://github.com/oh-my-fish/theme-bobthefish) を入れた
> WSLもアップデートがされていたりともうどれが解決策だったかわかんねぇなこれ。

あとtmuxも使い物にならず。
どうにかしてpowerline + tmuxを動かしたいものです。

> ■ 追記 19/07
> 上記の入れ直しと同時期にある程度安定した。
> ついでにtmuxにも [tmux-powerline](https://github.com/erikw/tmux-powerline) を入れた。

## 今後
毎度言ってる気がするけどWindowsの介護に疲れた。
~~もうUbuntuか何か入れようかしら。~~
■ 追記 19/02
WSLにXserverをいれて、GUIとして使えるようにしました。
これや。これがやりたかったんや...！
参考：
https://qiita.com/MERIK/items/ef4ecf7a51f89c403e94
nginx + gunicorn + Django タイムアウト処理

nginx と gunicorn と Djangoでページを作ったら、
重いファイルをアップロードするときにめちゃくちゃ時間かかってタイムアウトした話。
タイムアウトの設定を変えましょう。

# Django
Djangoはviewsに処理が書いてあるはずですが、
chunkで処理していれば大丈夫っぽいです。

# nginx
とりあえずnginxのタイムアウト処理を変えましょう。

```etc/nginx/nginx.conf
(略)
http {
    (略)
    proxy_read_timeout 300;
}
(略)
```

httpの中に、proxy_read_timeoutを追加します。今回は5分にしました。

参考：[Nginx設定のまとめ](https://qiita.com/syou007/items/3e2d410bbe65a364b603)
参考：[お名前.com VPS にNginxでWordPressを構築。設定の意味もまとめた](https://www.karakaram.com/onamae-com-vps10-nginx-wordpress)


# gunicorn
gunicorn起動時に引数をわたすだけでした。
`gunicorn hogehoge.wsgi --bind=0.0.0.0:8000 -t 300`

あらまぁ簡単。

# 余談：エラーログ

### ・nginxのerror log
エラーログどこに書き出されるんでしょう？
その設定は、nginx.confの上部に書かれているはずです。
`/var/log/nginx/error.log`
別のターミナルを開いて、`tail /var/log/nginx/error.log`とすると、後ろ数行がターミナルで確認できます。errorlog開いたまま、アプリを実行してどんなログが出されるか確認しましょう。


###  ・gunicornのerror log
gunicornのエラーログも引数で指定できます。
`--log-level=DEBUG`
をしていしてやると、エラーログがはきだされます。
EC2でSwaggerを動かしてみる

#環境準備
AWS EC2インスタンス作成（リポジトリにDockerが入っているAmazonLinuxAMIを選択）
#Dockerインストール
```
sudo yum update
sudo yum install -y docker
sudo service docker start
```

#DockerComposeインストール
```
curl -L "https://github.com/docker/compose/releases/download/1.9.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose --version
```

#SwaggerUIインストール
```
docker pull swaggerapi/swagger-ui
```
起動と確認

```
touch /openapi.yam ←API定義をこのファイルに書き込む
docker run -d -p 8081:8080 -e SWAGGER_JSON=/openapi.yaml -v /home/ec2-user/openapi.yaml:/openapi.yaml swaggerapi/swagger-ui
curl -X "http://127.0.0.1:8081"
```

#SwaggerEditorインストール
```
docker pull swaggerapi/swagger-editor
```

起動と確認

```
docker pull swaggerapi/swagger-editor
docker run -d -p 80:8080 swaggerapi/swagger-editor
curl -X "http://127.0.0.1:8081"
```

#あとがき
意外と簡単に導入できた。
中の仕組みをしらずとも動かせるのはいい。（勉強しろ）
開発用の Apache Arrow をソースからビルドする

# 前提

- macOS
- Homebrew は `/opt/brew` にインストールしている
- 開発用の Apache Arrow を `/opt/arrow-dev` にインストールしたい
- Apache Arrow のリポジトリは `~/src/apache/arrow` に clone 済み

# インストール先の準備

```console
$ sudo mkdir -p /opt/arrow-dev
$ sudo chown $USER /opt/arrow-dev
```

# C++ ライブラリのビルドとインストール

```console
$ cd ~/src/apache/arrow
$ brew update && brew bundle --file=c_glib/Brewfile
$ mkdir -p cpp/debug
$ cd cpp/debug
$ cmake -DARROW_BUILD_TESTS=ON -DCMAKE_INSTALL_PREFIX=/opt/arrow-dev ..
$ cmake \
    -DARROW_GANDIVA=ON \
    -DARROW_PARQUET=ON \
    -DARROW_INSTALL_NAME_RPATH=OFF \
    -DARROW_BUILD_TESTS=ON \
    -DCMAKE_INSTALL_PREFIX=/opt/arrow-dev
    -DPYTHON_EXECUTABLE=/opt/brew/bin/python3
    ..
$ make unittest
$ make install
```

# GLib ライブラリのビルドとインストール

```console
$ cd ~/src/apache/arrow/c_glib
$ PKG_CONFIG_PATH=/opt/arrow-dev/lib/pkgconfig:$(brew --prefix libffi)/lib/pkgconfig:$PKG_CONFIG_PATH meson build -Dgtk_doc=true --prefix=/opt/arrow-dev
$ ninja -C build
$ ninja -C build install
```

# Python ライブラリのビルドとインストール

(あとで書く)

# Ruby ライブラリのビルドとテスト

```console
$ cd ~/src/apache/arrow/ruby/red-arrow
$ bundle install
$ rake compile DYLD_LIBRARY_PATH=/opt/arrow-dev/lib PKG_CONFIG_PATH=/opt/arrow-dev/lib/pkgconfig:$(brew --prefix libffi)/lib/pkgconfig:$PKG_CONFIG_PATH
$ DYLD_LIBRARY_PATH=/opt/arrow-dev/lib GI_TYPELIB_PATH=/opt/arrow-dev/lib/girepository-1.0 $(rbenv which ruby) test/run-test.rb
```
SQLServer Enterpriseからstandardへのダウングレード

ライセンス費用等もろもろの事情でSQLServer Enterprise版からStandard版へのダウングレードを行う場合の注意事項。

https://docs.microsoft.com/ja-jp/sql/sql-server/editions-and-components-of-sql-server-2017?view=sql-server-2017

１．現サーバのスペック（コア数、メモリ等）がStandard版の制限値内であることを確認する。
２．Enterprise版固有の機能を使っているかどうか確認する。
　　※データ圧縮機能とか使っているとリストア時にエラーになる可能性が高い。

下記のSQLで使用されている機能が確認できるので、
その結果をもとに移行方針を検討するのがよさげ。
select * from sys.dm_db_persisted_sku_features
JavaScript内の文字列を改行する

### テンプレート文字列（JavaScript内の文字列の改行をそのまま反映できる）

今まで文字列はシングルクォーテーションorダブルクォーテーションで囲い、JS内に文字列を書いていたわけですが。
JavaScript内でHTMLを文字列として記入し、かつ文字列の中でJavaScript文を記入したいとき、物凄く面倒だった（ひたすら改行コード書いてた.
そしてエラー出したりしてた）

で、ネットで調べてみると、普通にありました。文字列内で改行する方法。
テンプレート文字列って言うそうです。

```
var str = `改行したい文字列は
バッククォートで
囲おう`
```

バッククォート（Shift＋@）で囲うだけ。
使えるのはES2015からだそう。
改行コードさいなら！
attr_accessor

###attr_accessor
クラスやモジュールにインスタンス変数にアクセス可能なメソッドを定義する。
オブジェクトの外からインスタンス変数にアクセスしたい時に使う。

###attr_reader
クラスやモジュールにインスタンス変数に読み取り可能なメソッドを定義する。

###attr_reader
クラスやモジュールにインスタンス変数に書き込み可能なメソッドを定義する。
Centos7 + h2oで構築するPHP7.3 環境  -Wordpressインストール編


[前回](https://qiita.com/hikaruright/items/27e03a057e813431202b)でWebサーバのインストールが完了したので、DBとワードプレスをインストールする。

## MariaDBをインストール

```shell
yum install mariadb mariadb-server
```

自動起動設定。

```shell
systemctl start mariadb
systemctl enable mariadb
```

以下のコマンドを実行して初期設定を行う。

```shell
$ /usr/bin/mysql_secure_installation
```

デフォルトではrootパスワードは空文字のため、Enterで次に進めます。  
あとは、説明に応じた設定を実施するだけ。
基本的には"Y"でセキュリティを強化する方針でOK。

## Wordpressで使用するデータベースとユーザを作成

```shell
$ mysql -u root -p
```

先ほど設定したパスワードで入る

### データベースを作成する
```mysql
MariaDB [(none)]> create database wordpress;
MariaDB [(none)]> show databases;
```

### ユーザを作成して紐付ける

```mysql
MariaDB [(none)]> grant all privileges on wordpress.* to 'wordpress'@'localhost' identified by '<<任意のパスワード>>'
```

### データベース操作を終了する

```mysql
MariaDB [(none)]> quit;
```

### 作成したユーザでログインをしてみる

```shell

$ mysql -u wordpress -p wordpress
Enter password: <<先ほど設定した任意のパスワード>>
```

これでログインに成功すればユーザの作成は完了。

## Wordpressのインストール

[公式サイト](https://ja.wordpress.org/download/)から最新を取得して展開。
以下の例では5.0.2をインストールしています。

```shell
$ wget https://ja.wordpress.org/wordpress-5.0.2-ja.tar.gz
$ tar zxvf wordpress-5.0.2-ja.tar.gz
$ mv wordpress /var/www/html
```

これでインストール自体は完了。

## Webブラウザからの操作

http://<<サイトアドレス>>/wordpress

にアクセスし、初期設定を実施。

以下の情報を設定する

|設定項目名| 設定内容|
|:---|:---|
|データベース名|wordpress|
|ユーザー名|wordpress|
|パスワード| 設定したパスワード|
|データベースのホスト名| localhost|
|テーブル接頭辞| 初期設定のまま(wp_)|

これでインストールは完了。

それでは、良いWordpressライフを！
OSXのクイックルックでElixirのコードを表示する

Mac OSXで割とクイックルック（Finderでスペースキーを押したらファイルを簡易確認できる機能）を使っているんですが、Elixirのコードはクイックルックで表示できずエディタを開いて確認するしかなく、面倒だなぁと思っていたところ`qlstepen`をインストールしたらクイックルックでElixirのコードを確認できるようになったので手順をまとめます。

# 環境
- Mac OS High Sierra 10.13
- Homebrew


# `qlstepen`インストール前
Elixirコードで使われる.exsや.exな拡張子のファイルをクイックルックで確認しようとするとこのように見えます。
<img width="700" alt="スクリーンショット 2019-01-23 10.50.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/51020/ab79eca0-f688-3a42-ddd0-34b8dbeb2e6d.png">
<img width="700" alt="スクリーンショット 2019-01-23 10.50.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/51020/2c4b40a5-54c0-e236-0ff7-c5de83c5e534.png">


# `qlstepen`インストール
`brew`を使っているので以下のコマンドを実行します。

```shell
% brew cask install qlstephen
```


# `qlstepen`インストール後
OSやFinderの再起動をすることなくファイルを選択してクイックルックを使うとElixirのコードを確認できるようになりました。
<img width="924" alt="スクリーンショット 2019-01-23 10.51.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/51020/50ef031c-f033-be11-e647-fc2c4613800d.png">
<img width="924" alt="スクリーンショット 2019-01-23 10.51.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/51020/6d4e5116-24a8-6352-9994-9df578016fee.png">


# まとめ
`brew`で`qlstepen`をインストール後、OSやFinderの再起動なしにクイックルックでElixirのコードを確認できるようになりました:hugging:
Centos7 + h2oで構築するPHP7.3 環境 - Webサーバ編



ふと思い立ってWordpressのサーバを立ち上げようと思った。

しかし、Wordpressの最新版(5.x)にはphp7.2以降が必要らしい。
また、PHP7.3は7.2系に比べてかなり早いらしい。

また、今後のことも考えて軽量なサーバ&HTTP2にも対応しよう。

と言うわけで、
h2o + PHP7.3の構築をしてみる。


## h2oをインストール

Centosのyumにインストール用のリポジトリを追加

```
vi /etc/yum.repos.d/h2o.repo
-----
[bintray-tatsushid-h2o-rpm]
name=bintray-tatsushid-h2o-rpm
baseurl=https://dl.bintray.com/tatsushid/h2o-rpm/centos/$releasever/$basearch/
gpgcheck=0
repo_gpgcheck=0
enabled=0
```

インストール

```shell
$ sudo yum install h2o --enablerepo=bintray-tatsushid-h2o-rpm
```

起動

```shell
$ systemctl start php-fpm
$ systemctl enable php-fpm
```

## phpをインストール

```shell
yum install --enablerepo=remi,remi-php73 php php-fpm php-mbstring php-xml php-xmlrpc php-gd php-pdo php-pecl-mcrypt php-mysqlnd php-pecl-mysql --skip-broken
```

php-fpmの設定を実施する

```shell
$ vim /etc/php-fpm.d/www.conf
-----
; 以下のコメントアウトを外して変更
listen = /var/run/php-fpm/php-fpm.sock

listen.owner = h2o
listen.group = h2o
listen.0660

; 以下の項目を変更
user = apache
group = apache
↓
user = apache
group = apache
```

起動

```shell
$ systemctl start php-fpm
$ systemctl enable php-fpm
```

## h2oの設定変更

h2oとphp-fpmを繋げる設定をする。

ポイントは下記の2点。

- 実行ユーザをphp-fpmと同じにすること
- phpの設定をすること

```yaml
$ vim /etc/h2o/h2o.conf
-----
# ユーザをh2oへ。
user: h2o
# http2等の設定をする(任意)
gzip: ON
http2-casper: ON
# PHPの設定を行う
file.custom-handler:
  extension: .php
  fastcgi.connect:
    port: /var/run/php-fpm/php-fpm.sock
    type: unix
file.index: ['index.html', 'index.htm'. 'index.php']

# 以下は通常通りの設定。
```

最後に、h2oの設定が間違っていないか確認する。

```shell
$ h2o -c /etc/h2o/h2o.conf -t
```

問題がなければ、Syntax OKが出るので、h2oを再起動する。

```shell
$ systemctl h2o restart
```

この状態で、以下のファイルを作成する

```php
$ vim /var/www/html/phpinfo.php
---
<?php
phpinfo();
?>
```

作成したページへアクセスしてみる

http://<<Webサーバのアドレス>>/phpinfo.php

これで、phpの情報が表示されればPHPのインストールは完了。
AWS CLIを利用してS3にアップロードする

##1.事前準備##

以下のものを準備しておいてください。

**1.S3バケット**
![image.png](https://qiita-image-store.s3.amazonaws.com/0/280929/ac5a4fa7-f74f-28e5-fcfa-61d96f660628.png)

**2.IAMユーザー** s3とEC2のポリシーを付与しておいてください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/280929/e8266e99-7eb6-1f02-2d07-0ea0dba61524.png)

**3.IAMロール** EC2にS3にアクセスするためのポリシーを追加しておいてください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/280929/97b02ae0-b142-cca2-cfc4-9f65fa25089e.png)

**4.EC2インスタンス** Amazon Linuxを作成し、IAMロールを紐づけます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/280929/4a61a71e-c76b-b72c-028f-3644380b2027.png)


ここまでできたら、AWS CLIを初めてインストールし、動かしてみます。



##2.AWS CLIのインストール・設定##

OSにより手順は異なるので、
[AWS Command Line Interface](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-chap-install.html)
を参考にインストール・設定をします。
（当方はmacOSを利用しています。）

インストールされたか確認してみましよう。

```
aws --v
```

![スクリーンショット 2019-01-21 20.59.00.png](https://qiita-image-store.s3.amazonaws.com/0/280929/0b3764be-7a43-bd7b-8fcd-1c7474802a07.png)



##3.cpコマンドとsyncコマンドを実行してみる##

test-image.png をアップロードしてみましょう。
下記は、test-image.png を test-image2.png という名前でS3バケットにコピーしています。

```
aws cp test-image.png s3://バケット名/test-image2.png
```

testフォルダを同期させてみましょう。
下記は、testフォルダを testtestフォルダという名前でS3バケットに同期しています。

```
aws sync test s3://バケット名/testtest
```



##4.EC2からs3バケットの中身を確認してみる##

EC2にsshで接続し、s3バケットの中身を確認してみましょう。

```
aws s3 ls s3://バケット名 --recursive
```

『3.cpコマンドとsyncコマンドを実行してみる##』でアップロードしたものが確認できると思います。

UIからも下記の通り確認できました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/280929/0ad8e4b8-676d-e4d1-bb3a-4b5c43fc6701.png)
QIIME 2 のデータからPCoAプロットを描画する

# QIIME 2のデータからPCoAを描画したい．
QIIME 2 のデフォルトでもPCoAプロット書けるけど，emperor だしけっこう平面図にすると見づらい．
できれば，RあたりでおしゃれにPCoAをプロットしたい．

# 1. データを用意
今回は，QIIME 2 の["Moving Pictures" tutorial](https://docs.qiime2.org/2018.4/tutorials/moving-pictures/)のデータを使って描画してみる．

・Metadata: [sample_metadata.tsv](https://data.qiime2.org/2018.4/tutorials/moving-pictures/sample_metadata.tsv)
・shannon diversity: [shannon_vector.qza](https://docs.qiime2.org/2018.4/data/tutorials/moving-pictures/core-metrics-results/shannon_vector.qza)
・Unweighted UniFrac PCoA: [unweighted_unifrac_pcoa_results.qza](https://docs.qiime2.org/2018.4/data/tutorials/moving-pictures/core-metrics-results/unweighted_unifrac_pcoa_results.qza)

以上の３ファイルを使用する．
PCoAには通常，UniFrac 距離のデータが必要だが，ここではカテゴリ分け，　shannon 多様性指数によるプロットサイズの変更も同時にしていきたい．

メタデータは`Moving Pictures sample-metadata (QIIME 2 2018.4) - sample-metadata.tsv`というファイル名になるので，`sample-metadata.tsv`に変更しておく．

# 2. PCoAの描画を実行
以下はRで実行していく．R のバージョンは以下の通り．

```bash
$ R --version
R version 3.5.1 (2018-07-02) -- "Feather Spray"
Copyright (C) 2018 The R Foundation for Statistical Computing
Platform: x86_64-apple-darwin15.6.0 (64-bit)

R is free software and comes with ABSOLUTELY NO WARRANTY.
You are welcome to redistribute it under the terms of the
GNU General Public License versions 2 or 3.
For more information about these matters see
http://www.gnu.org/licenses/.
```

Rは以下から．

```R
# ライブラリの読み込み
library(tidyverse)
devtools::install_github("jbisanz/qiime2R")
library(qiime2R)

# 各種データの読み込み
metadata<-read_tsv("sample-metadata.tsv")
shannon<-read_qza("shannon_vector.qza")
pco<-read_qza("unweighted_unifrac_pcoa_results.qza")

# PCoAの描画
pco$data$Vectors %>%
  rename("#SampleID"=SampleID) %>% #rename to match the metadata table
  left_join(metadata) %>%
  left_join(shannon$data %>% rownames_to_column("#SampleID")) %>%
  ggplot(aes(x=PC1, y=PC2, shape=Subject, color=BodySite, size=shannon)) +
  geom_point() +
  xlab(paste("PC1: ", round(100*pco$data$ProportionExplained[1]), "%")) +
  ylab(paste("PC2: ", round(100*pco$data$ProportionExplained[2]), "%")) +
  theme_bw() +
  ggtitle("Unweighted UniFrac")
```

描画した結果がこんなかんじ．
<img width="662" alt="スクリーンショット 2019-01-22 11.42.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/222325/5b64509f-2e5a-7c37-05fe-50b4e5550dab.png">
Swiftで最短でクラッシュ

Crashlyticsの設定の確認をする際などで意図的にエラーを出したい場面ってありますよね。
どう書けば短いコードでクラッシュさせられるか検討

```swift
fatalError()
```
王道
(12文字)

```swift
"" as! Int
```
force castに失敗して落ちる
わかりやすい。
(11文字)

```swift
[][0]
```
要素が空の配列の0番地にアクセスして落ちる
(5文字)

他にあったら教えてください



## 番外編
コード量は増えるけど準備することで追加的な文字数が少なくクラッシュできるようにする

```swift
class C {
    init() {
        fatalError()
    }
}
```

`C()`(3文字)でクラッシュ


```swift
protocol C {
}

extension C {
    var c:Int { return [][0] }
}
```
クラッシュしたいクラスに `:C`で継承して `c`でクラッシュ（1文字）
こんなのアリにしたら解釈次第でなんでもアリになるのでナシナシ
クラス、モジュールのメソッドを使う

###1.クラスを継承する
クラスを継承して、継承したクラスのメソッドを使う。
rubyは単一継承を採用しており、１つのクラスは、１つのスーパークラスしか持てない。

###2.モジュールをincludeする
使用したいメソッドをまとめたモジュールをincludeして、そのモジュールのメソッドを使う。
継承と違い複数のモジュールをinclude出来るため、多重継承のような形でメソッドを使用出来る。(Mix-in)

###3.モジュールをextendする
モジュールをincludeではなく、extendする。
includeと同じく、モジュールのメソッドが使用可能になるが、extendした場合はクラスメソッドとして使用可能となる。
PHPで半角英数字がそれぞれ必ず入るパスワードを自動生成したい！！

自分のメモ用に置いときます。

[ほぼこの記事のコピペです。](https://ameblo.jp/itboy/entry-10217415698.html)

```php5
function generate_password($length = 8) {
    $pwd = array();

    // パスワード生成素材
    $pwd_material = array(
        'lower'		=> range('a', 'z'),
        'upper'		=> range('A', 'Z'),
        'number'	=> range('0', '9')
    );

    // $length分回す
    while (count($pwd) < $length) {
        // 必ず半角大文字英数字を1回は入れる
        if (count($pwd) < 3) {
            $key = key($pwd_material);
            next($pwd_material);
        }
        else {
            $key = array_rand($pwd_material);
        }
        $pwd[] = $pwd_material[$key][array_rand($pwd_material[$key])];
    }

    shuffle($pwd);
    return implode($pwd);
}
```
Oracleネタ帳 SQL*Plus接続時に接続文字列ではなく、IPやSIDで接続する

コマンドは下記の通り。

``` shell
$ sqlplus <username>/<password>@<hostname or ip>:<port>/<service_name>/<instance_name>

$ sqlplus "/@192.168.1.11:1521/ORCL as sysdba"

$ sqlplus "/@192.168.1.11:1521/RACSV/instance1 as sysdba"
```

[参考資料](https://docs.oracle.com/cd/E16338_01/server.112/b56320/network.htm#CIHJHJGJ)
GitLabCIでRails.crendentials.digができない

# はじめに
GitLabのCI機能を使ってrspecを動かしたら、なぜかテストが落ちるという現象に見舞われました。

現象と対処法について書きたいと思います。

# 現象
gitlab-ci.ymlに以下を記載して、GitLabにpushするとrspecが実行されるのだが、実行されたrspecのテストが17個ぐらい落ちる。

```yml:.gitlab-ci.yml
rspec:
  stage: test
  script:
    - apt-get update -qq && apt-get install -y mysql-server mysql-client default-libmysqlclient-dev
    - service mysql start
    - echo "CREATE USER 'user'@'%' IDENTIFIED BY '$PASS';" | mysql -u root
    - echo "GRANT ALL PRIVILEGES ON *.* TO 'user'@'%';" | mysql -u root
    - rake db:create db:migrate db:seed RAILS_ENV=test
    - rspec
  artifacts:
    paths:
      - coverage
    expire_in: 1 week
```

ローカルでrspecを実行するとちゃんと通るのだが。

# 原因
色々と原因を調査してみると、以下の部分がnilになっていてテストが落ちていた。

```ruby
Rails.application.credentials.dig(:develop, :aws)
```
なぜかcredentials.digができていないことが原因だった。

そして、なぜcredentials.digができていなかったのかは、config/master.keyが.gitignoreに入っていてpushされていなかったから。

master.keyはcredentials.yml.encの内容を暗号化・復号化するための鍵。リポジトリに入らないように配慮されている。

# 対処法
master.keyをscriptの中に記載すればできた。
scriptの部分に以下を記載した。

```yml:.gitlab-ci.yml
- echo "config/master.keyの中身" > config/master.key
```

ハードコーディングはよろしくないので、環境変数を設定して、以下のように記載する。

```yml:.gitlab-ci.yml
- echo "$MASTER_KEY" > config/master.key
```

環境変数はGitLabのSetting→CI/CD→Environment variablesから設定できる。

# おわりに
ymlを記載するだけでテストなどを実行してくれて非常に便利な半面、結構予想外なことが起こったりします。

まだまだ、CI/CDを実装するには壁が多そうです。
Oracleネタ帳 Redoログについていろいろ

# ログ・バッファのサイズが適正であるかどうか
> ログ・バッファのサイズが適正であるかどうかは、ログ・バッファに書き込むREDOエントリで
> 競合が起きているかどうかで判断します（リスト1）。
> 統計情報の「redobuffer allocation retries」の回数が多い状態であれば、
> ログ・バッファに書き込み待ち（再実行）が発生していることになりますので、
> この再実行を減らすためにlog_bufferのサイズを大きくします。
> 「redobuffer allocation retries」がほとんど0に近い状況が理想です。

``` SQL
select value
from v$sysstat
where name like 'redo buffer allocation retries';
```

# log_bufferのサイズについて
> log_bufferのサイズについては、V$SYSSTAT内の待機イベントである「logbuffer space」で
> サーバ・プロセスがログ・バッファ内の空き領域を待機しているかどうか確認できます（リスト2）。
> ここで待機が発生しているようであれば、log_bufferのサイズを変更することで解決することがあります。

``` SQL
select value
from V$SYSSTAT 
where name like 'log buffer space';
```



# ログ・スイッチの問題に関して
> ログ・スイッチの問題に関しては、V$SESSION_EVENTの待機イベント「logfile switch completion」で確認できます

``` sql
select
  TOTAL_WAITS AS 待ち回数, 
  TOTAL_TIMEOUTS AS タイムアウト回数,
  TIME_WAITED * 100 AS "待機時間合計 秒",
  AVERAGE_WAIT * 100 AS "待機平均時間 秒", 
  MAX_WAIT * 100 AS "待機最大時間 秒" 
from V$session_event 
where event like 'log file switch completion';

  待ち回数 タイムアウト回数 待機時間合計 秒 待機平均時間 秒 待機最大時間 秒
---------- ---------------- --------------- --------------- ---------------
         1                0           13600           13647           13600
         1                0           17300           17308           17300
         2                0           28900           14443           21200
         1                0            1000            1007            1000
         1                0           18800           18816           18800
         1                0           20500           20492           20500

6行が選択されました。
```

# REDOログの一覧を表示

``` sql
set lines 120
set pages 100
set term off
clear col
col GROUP# format 90
col STATUS format a7
col TYPE format a6
col MEMBER format a50
select
  group#,
  status,
  type,
  member
from
  v$logfile
;


select group#,
       thread#,
       sequence#,
       bytes/1024/1024 M_bytes,
       members, status
from v$log order by 1,2;
```
Oracleネタ帳 DataPumpエクスポート／インポート

# エクスポート

``` shell
expdp system/change_on_install \
      directory=NAME_OF_DIR_OBJECT \
      dumpfile=name_of_dump_file.dmp \
      schemas=NAME_OF_SCHEMA
```

# インポート

``` shell
impdp system/change_on_install \
      directory=NAME_OF_DIR_OBJECT \
      dumpfile=name_of_dump_file.dmp \
      remap_schema=NAME_OF_SCHEMA:REMAP_TO_SCHEMA \
      TABLE_EXISTS_ACTION=REPLACE \
      EXCLUDE=CONSTRAINT,REF_CONSTRAINT,SCHEMA_EXPORT/PROCEDURE/PROCEDURE
```

## インポート中の問題に対応する
### インポート中にORA-01628/ORA-30036が発生する事がある。
UNDOが不足した場合に出るエラー。impdpのオプションを変更して下記の対応をする。

- インポート対象からインデックスと統計情報を除き、インポート後に手動で作成する。
- APPEND または TRUNCATE の代わりに TABLE_EXISTS_ACTION=REPLACE を使用する。
- DATA_ONLY の代わりに CONTENT=ALL を使用する。

``` shell
impdp system/change_on_install \
      directory=NAME_OF_DIR_OBJECT \
      dumpfile=name_of_dump_file.dmp \
      CONTENT=ALL \
      TABLE_EXISTS_ACTION=REPLACE \
      EXCLUDE=CONSTRAINT,REF_CONSTRAINT,INDEX,STATISTICS
```

### 性能を改善する
上記のオプション変更でも所要時間は短縮できる。
更にチューニングが必要な場合、PARALLELオプションを指定してエクスポート／インポートのジョブを並列実行する。(Enterprise Editionのみ)

PARALLELパラメータを使用するときに考慮する必要がある項目について

- 並列度はCPU数の 2 倍に設定し調整する
- expdpのPARALLELパラメータに指定する値は、ダンプ・ファイルの数以下にする
- impdpのPARALLELパラメータに指定する値は、ダンプ・ファイル・セットに含まれるファイル数より大きすぎない値にする


# サイズの見積もり
下記で概算のサイズ見積もりがわかる

``` shell
expdp system/change_on_install \
      schemas=NAME_OF_SCHEMA \
      ESTIMATE_ONLY=YES
```

# 詳細
マニュアルを確認しましょう。
Oracle Database Utilities > 第I部 Oracle Data Pump
https://docs.oracle.com/cd/E82638_01/sutil/oracle-data-pump.html#GUID-501A9908-BCC5-434C-8853-9A6096766B5A
【rails5】アクセス制限をかけたい

##他ユーザーのtask編集ページへアクセスした場合は、自分のtask編集ページへリダイレクトさせたい

上記のようなアクセス制限をかけたい。

だが、link_toに指定しているedit_task_path(ユーザーのtask編集ページ）にcurrent_userのidを含める書き方がわからなかった。

現在は、AというユーザーがBというユーザーのtask編集ページへアクセスした場合、Aユーザーのtask詳細ページ(show_path)へリダイレクトさせているが、Aユーザーのtask編集ページを表示させてあげた方が親切。

このアクセス制限は、URLの直指定と変数展開を使うと実現出来たのでメモに残す。

ルーティング

```
get '/users/:id/edit_task'
getのURLにidを含める
```

ビュー

```
<%= link_to 'タスクを編集', "/users/#{current_user.id}/edit_task", params: { id: @user.id, task: @task }
```

**link_toの遷移先URLを直指定する。**

**URL内のidは変数展開（文字列の中で変数を使うこと。""で囲んでさらにidを#{}でネストする）を使ってねじ込む。**

ここが上手く書けていなかった。

もしこのURLの後にparamsを使って値をハッシュで渡す場合は、一旦「，」で区切って

```
params: { カラム: 値, カラム: 値 }
```

こういう書き方をするんだと勉強になった。

コントローラー

```
redirect_to "/users/#{current_user.id}/edit_task"
ビューと同じく、遷移先のURLを直指定する
```

_pathや_urlでは上手くいかなかったが、_pathや_urlは戻り値に上記のような相対パスや絶対パスを渡しており、やってることは一緒なので良い。

ちなみに

```
redirect_to controller: 'users', action: 'edit_task', id: current_user
```

でも意図した動作に出来ました。
添付プロパティと依存関係プロパティの違い

#実装
##添付プロパティ

* 初期化には`DependencyProperty.RegisterAttached()`を使う。
* セッター(`SetXXX()`)とゲッター(`GetXXX()`)が必要。
* xamlで参照する際は、クラス名を含めてプロパティを指定する。

```c#:添付プロパティ
using System.Windows;

namespace Sample {
    public class AttachedXXX {
        public static DependencyProperty XXXProperty
            = DependencyProperty.RegisterAttached(
                "XXX",
                typeof(bool),
                typeof(AttachedXXX),
                new PropertyMetadata()
            );
        
        public static void SetXXX(DependencyObject obj, bool value)
            => obj.SetValue(XXXProperty, value);

        public static bool GetXXX(DependencyObject obj)
            => (bool)obj.GetValue(XXXProperty);
    }
}
```

```xml:XAML
<Window x:Class="Sample.MainView"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:Sample"
        Title="MainView" Height="300" Width="300">
    <Grid>
        <TextBox local:AttachedXXX.XXX="False" />
    </Grid>
</Window>
```

##依存関係プロパティ

* DependencyObjectクラスを継承している必要がある。
* 初期化には`DependencyProperty.Register()`を使う。
* 同名のプロパティを定義する。

```c#:依存関係プロパティ
using System.Windows;

namespace Sample {
    //UserControlはDependencyObjectを継承している
    public class MyControl : UserControl {
        public static DependencyProperty XXXProperty
            = DependencyProperty.Register(
                nameof(XXX),
                typeof(bool),
                typeof(MyControl),
                new PropertyMetadata()
            );

        public bool XXX {
            get { return (bool)GetValue(XXXProperty); }
            set { SetValue(XXXProperty, value); }
        }
    }
}
```

```xml:XAML
<Window x:Class="Sample.MainView"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:Sample"
        Title="MainView" Height="300" Width="300">
    <Grid>
        <local:MyControl XXX="False" />
    </Grid>
</Window>
```

#使い道

##添付プロパティ
* 既存のUI要素にプロパティ(ビヘイビア)を付与する。

##依存関係プロパティ
* 複雑なビューをUserControlとして切り出した際に、内部のパラメータをプロパティとして公開する。
* Behaviorクラスの派生クラスにプロパティを追加する。

#まとめ
* プロパティそのものを独立させることで、継承せずにプロパティを追加できるようにしたのが添付プロパティ。
* DependencyObjectクラスを継承して作ったクラスに、バインディング可能なプロパティを追加するのが依存関係プロパティ。
FizzBuzz書いてみた（n版煎じ)

#流行りのFizzBuzz書いてみた。

##背景
採用領域でBOTとか作りだしたノンプログラマーが「FizzBuzzくらいかけるよね？」と言われたので書いてみた。

#コード

```python:fizzbuzz.py
from selenium import webdriver
from selenium.webdriver.common.keys import Keys

browser = webdriver.Chrome(executable_path="chromedriver.exe")
browser.get("https://www.google.co.jp")
element = browser.switch_to.active_element
element.send_keys("python fizzbuzz wiki")
element.send_keys(Keys.ENTER)

browser.find_element_by_partial_link_text("Fizz Buzz").click()
```

google立ち上げてFizzBuzzを検索。
多分wikiには答えが載っていたと思うので、という前提で。
後はコピペとかすればいいと思う（強気）
Oracleネタ帳 ASMディスクグループの使用量確認

# コマンド
SQL*Plusで以下を実行します。

``` SQL
col name      for a10
col disk_name for a15
col state     for a11
col total(GB) for 999,990.0
col free(GB)  for 999,990.0
col used(%)   for 990.0

select
  group_number,
  name,
  state,
  total_mb/1024 "TOTAL(GB)",
  free_mb/1024 "FREE(GB)",
  ((total_mb-free_mb)/total_mb*100) "USED(%)"
from v$asm_diskgroup;


select
  adg.group_number,
  adg.name,
  ad.name "DISK_NAME",
  adg.state,
  ad.total_mb/1024 "TOTAL(GB)",
  ad.free_mb/1024 "FREE(GB)",
  ((ad.total_mb - ad.free_mb)/ad.total_mb*100) "USED(%)"
from v$asm_diskgroup adg, v$asm_disk ad
where adg.group_number=ad.group_number
order by 1,3;
```
【Laravel】5.7 で fontawesome を使う(文字化け対策付き)

# 前提
laravel5.7 環境が構築済みで、かつ npm install 実行済みで js パッケージの初期化が行われていること。
# fontawesome インストール
npm 経由で Font Awesome 最新無料バージョンをインストールする。依存関係のエントリは package.json にある。
以下を実行。(＠fo **r** tawesome が fontaweseme じゃない罠。アンインストール時は注意。) 

```sh:プロジェクトルートで
$ npm install @fortawesome/fontawesome-free --save-dev
```
#webpack を編集
以下を追記する。

```php:resouces/assets/sass/app.scss
// Fontawesome
@import '~@fortawesome/fontawesome-free/scss/fontawesome';
@import '~@fortawesome/fontawesome-free/scss/regular';
@import '~@fortawesome/fontawesome-free/scss/solid';
@import '~@fortawesome/fontawesome-free/scss/brands';
```
# resource コンパイル

```sh:プロジェクトルートで
$ npm run dev
```
サブディレクトリがない URL の場合はこれで使えるようになる。
あとは [font-awesome icons](https://fontawesome.com/icons?d=gallery&m=free) を見ながら適宜利用する。

# 文字化け対策
サブディレクトリがあると、文字化けして □ 豆腐になる。
これは、フォント参照先が ドメイン名/fonts/vendor/@fortawesome/fontawesome-free/webfa-solid-900.woff2 とかになっているため。
(サブディレクトリが無いので参照できない。)
実体は プロジェクトルート/public/fonts にあるので、手っ取り早く対応するには fonts のシンボリックリンクを作る。

```sh:/var/www/html
$ ln -s /プロジェクトルート/public/fonts fonts
```
コンパイル時の参照の手前にサブディレクトリを付ける方法を知っている方いたら教えてください。

[- 目次 -](https://qiita.com/search?q=laravel+nekyo)
Oracleネタ帳 オブジェクトの定義を取得する～DBMS_METADATA.GET_DDL

# DBMS_METADATA.GET_DDL
## 詳細
詳しくはマニュアルを参照
https://docs.oracle.com/cd/E82638_01/arpls/DBMS_METADATA.html#GUID-F72B5833-C14E-4713-A588-6BDF4D4CBA2A

## コマンド
SQL*Plusで下記のコマンドを実行します。

``` SQL
SET PAGES 100;
SET LONG 2000000000;
SET LINESIZE 300;
COLUMN DDL FORMAT A300;
SELECT DBMS_METADATA.GET_DDL('TABLE','USR_PROPERTIES_TAB') AS DDL FROM DUAL;
```

## 構文

``` SQL
DBMS_METADATA.GET_DDL (
object_type     IN VARCHAR2,
name            IN VARCHAR2,
schema          IN VARCHAR2 DEFAULT NULL,
version         IN VARCHAR2 DEFAULT 'COMPATIBLE',
model           IN VARCHAR2 DEFAULT 'ORACLE',
transform       IN VARCHAR2 DEFAULT 'DDL')
RETURN CLOB;
```

## object_typeについて
指定可能なobject_typeは下記を参照してください。
https://docs.oracle.com/cd/E57425_01/121/ARPLS/d_metada.htm#BGBIEDIA

## データベースのCREATE文を取得するには...
DBMS_METADATA.GET_DDL ではCREATE DATABASEのDDLは取得できません。
なにか方法がないかと調べてみたら、制御ファイルのバックアップからそれらしい情報を取得できそうなことがわかりました。
以下コマンドです。

```
alter database backup controlfile to trace as '/path/to/filename';
```
PHPで今日の日時から過去直近のX曜日の日時を取得する

こんにちは！
今回は、PHPで過去の直近の任意曜日は何日だったかを取得する方法を紹介します。
例えば、1/21(月) ～ 1/28(月) の期間で過去の直近の月曜日を取得したいと考えると、

- 1/21（月）ならその日が月曜なので1/21(月)
- 1/22(火) ～ 1/27（日）なら1/21(月)
- 1/28（月）ならその日が月曜なので1/28（月）

をそれぞれ取得できるといった具合です。
例えば、毎週X曜日ごとに切り替わるシステム（今週のMVPを決めるよ～とかｗ）などを作る際に、
最近最後のN曜日って何日だったかなーって時に使うイメージです。

## サンプルコード
例として、今日の日時から過去直近の月曜は何日だったかを求めてみます。

```php
// 今日は2019/01/21 月曜日だったと仮定します
$now = new DateTime();

$w = date('w', $now->getTimestamp());
$diff = ($w + 6) % 7;

// 今日の日時から$diff日前に遡る
$ymd = date('Y/m/d', strtotime("-{$diff} day", $now->getTimestamp()));

print_r($ymd);

// 結果: 2019/01/21
```

## 解説
date('w', \$timestamp)では、
\$timestampで与えられた日時に対して、その日が日曜日なら0、月曜なら1、火曜なら2...土曜なら6といった数値を返してくれます。

今回の例では、直近の月曜日を取得したかったので月曜なら0日前、火曜なら1日前、...日曜なら6日前に遡るように$diffの計算時に、+Nする値を調整（\$w=1なので\$wに+6して曜日数（=7）で割った余りが0になるように）しています。

したがって, 仮に直近の火曜日を取得したいよーという場合は、\$diffを求める際に+6している部分を+5、
水曜なら+4、...日曜なら+0と調整すると直近の任意の曜日の日付を取得することができます。

## ひとこと
日付はなんかややこしいよね(´・ω・｀)
Pingを基礎から理解しよう[2]~パケットとは？

## はじめに

[前回の記事](https://qiita.com/tekondo/items/c9faba8fcfff853946d4)ではPingを基礎から抑えるために使用しているプロトコルについて調べました。

今回は第二弾、Pingを基礎から理解するために色々調べていきます。

もう一度Pingの定義に立ち返ってみましょう。

Pingコマンドとは
>pingは、ネットワーク疎通を確認したいホストに対してIPパケットを発行し、そのパケットが正しく届いて返答が行われるかを確認するためのコマンド
[引用元](http://www.atmarkit.co.jp/ait/articles/0108/30/news002.html)

と書かれている。
だいたいわかりますよね、しかし気になったのが**パケット**と言うワード。

パケットって言われてどんなイメージを持っていますか？

- 小さい単位のネットワークに流すデータ
- スマホで通信するときの「パケット通信」のパケット

とかがイメージできますよね、しかし簡潔に説明することができない、、、

なので今回は**パケット**に焦点を当てて調べていきます！


## パケットとは？
簡潔に説明するために定義をみてみました。
[マスタリングTCP/IP　入門](https://www.amazon.co.jp/%E3%83%9E%E3%82%B9%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0TCP-IP-%E5%85%A5%E9%96%80%E7%B7%A8-%E7%AC%AC5%E7%89%88-%E7%AB%B9%E4%B8%8B/dp/4274068765)をみてみると
>パケットは、何にでも使えるオールマイティな用語です

いや、それは困る！！！笑

結構用途が多い単語なんでしょうか、詳しく調べるためにググることに、
ググってみると
>コンピューターでの通信で、データを小さく一定のサイズに分割して送ることを「パケット通信」と言い、その分割されたひとつひとつのデータのことを「パケット」と言います
[引用元](https://flets-w.com/user/point-otoku/knowledge/other/other08.html)

と書かれていました。なるほど、パケットはデータを細かく切ったものでそれら一つ一つがパケットと言う名前で扱われるのですね。

Pingで送信されるパケットは通信を行うのはIPプロトコルを利用して送信されるので、**IPパケット**と言います！


## IPパケットの中身は？
Pingで送られているパケットがなんなのかは理解することができました。
次に気になるのはIPパケットの中身、どんな内容が書かれているのでしょうか？
みてみましょう！

![alt](http://image.itmedia.co.jp/ait/articles/0304/04/wi-fig01.gif)
[引用元](http://www.atmarkit.co.jp/ait/articles/0304/04/news001_2.html)

IPパケットの詳細構造は以下のようになっています。
上部に数字が書かれています、これは1メモリ1ビットです。ですので１行32bitで表現されていることになります。

この中に色々な情報が格納されています。
パッとわかるところで言えば

- 宛先IPアドレス
- 送信元IPアドレス

なんかはわかりやすいですよね、IPパケットにIPアドレスの記述があることでパケットを任意の相手に送信することができます。

Pingに関して言えば、大事なのは**プロトコル番号**です。
前回の記事でPingを構成しているプロトコルはICMPだと言う話をしましたよね？？？

それがここでわかります。
IPパケットのプロトコル番号とは、上の階層で利用されているプロトコルがなんなのかを表しています。

| プロトコル番号       |       プロトコル | 
|:-----------------|------------------:|:------------------:|
| 0             |              IP |        This        |
| 1           |            ICMP |       column       |
| 6             |              TCP |        will        |
| ...             |              ... |        will        |

のように番号によって使用しているプロトコルがなんなのかを表しています。

PingコマンドはICMPなので送信されるパケットをキャッチしてプロトコル番号を確認すれば1番になっているはずです。
絶対そう。


## 実際にパケットの中身を確認してみた
色々IPパケットについて学んだので実際に送信しているパケットの中身をみてみたくなりました。

そこで利用したのがWiresharkというアプリです。

初めて使ったのですが、パケットキャプチャという類のアプリのようでパケットキャッチしてくれるみたいです。

今回はWiresharkを利用してPingコマンドを解析してみます。

```
ping www.google.co.jp
```

まずGoogleにPing打ちます。いけー

そうするとWiresharkでパケットをキャッチすることができました。

これがそのときの画像になります。

![スクリーンショット 2019-01-22 9.05.17.png](https://qiita-image-store.s3.amazonaws.com/0/231063/4322c9c7-6a51-59b6-38c1-4b6662ba125a.png)

面白いですねこれ

さて、下にパケット詳細が出てきているのでこのプロトコル番号がしっかり１になっているのかを確認しましょう。

パケット詳細は16進数表記になっているので
数字1つで先ほどの4bitに相当するはずです。
なのでプロトコル番号格納されているのは右から19文字目の1の中であるはずです。

1ということは

```
0001
``` 
なのでまあただの１ですね、ICMPのプロトコル番号は１なので
一致していることを確認しました！スッキリですね！！！



## 終わりに

では今回調べたことをまとめます。

- IP通信はパケットという小さい単位でデータを区切って送信している
- パケットの構造は色々な情報が格納されていて、対応する場所に対応する情報が入っている

この二つを確認しました。

Pingくらい簡単なコマンドでも色々詳しくみていけば学べることってたくさんあるんですね、、、

曖昧な理解で終わっている部分が多いネットワーク領域なので、しっかりと理解して活躍できるエンジニアになりたいです。

それでは！！！
Kotlin3日目で気になった仕様を列挙する #love_kotlin

Kotlinを学んでいると、この書き方はどこまで許されるんだろう？ と思うことが頻繁にあるので色々試してみました。
全体を通して思いましたが、文法エラーの際のメッセージがやたら親切です。

# 基本
## int型のrangeはintRangeだが、String型のrangeはClosedRange<String>
* Javaとの互換性に関係がある？

```kotlin
val rng = 1..99
println(rng.javaClass.kotlin)

val strrng = "a".."z"
println(rng.javaClass.kotlin)
```


# 関数
## 関数の引数は再代入不可
* Classではコンストラクタの引数に `val` `var`を指定できるが、関数の引数は常に不変
* あえて `var` を指定して再代入しようとしたが、そもそも修飾できない（できたとしてもすべきでないが）

```kotlin
fun sayHello(var word: String) { // var on parameter function is not allowed
    word = "Hello"
    println(word)
}
```

## 関数でジェネリクスを利用するときは、型名が関数名の前に来る
* クラスではクラス名の後に来るので宣言の仕方が異なることになる
* あえて関数名の後ろで宣言しようとすると当然文法エラーになる

```kotlin
fun generateContainer<E>(vararg elements: E) = Containers(*elements) // type parameter must be placed before the function name
```


## メソッドをcallable referenceで参照すると、第一引数に自身のインスタンスをとる
* Pythonでメソッドの第一引数にselfを要求するようなイメージか
* どのような状況で使うのかよくわからない。 `infix` などと組み合わせると良いのか？

```kotlin
val len = String::length
println(len("I love Kotlin."))
```

# クラス・オブジェクト
## 通常のクラスはクラスヘッダーを省略できるが、data classでは省略できない
* 固定値だけのdata classを作るのであれば省略しても良さそうなものだが、それはenumを使えということか

```kotlin
data class Member { // Data class must have at least one primary constructor parameter
    val id: Int = 0
    val nickname: String = "hiro"
}
```


## objectはコンストラクタを持てない
* インスタンスを作成することがないので納得
* したがって、data objectのような概念も存在しない

```kotlin
object Constants(val status_ok){} // Constructors are not allowed to object
data object Constants(val status_ok){} // Modifier data is not applicable for objects
```


## コンパニオンオブジェクトはクラスに一つしか持てない
* もしもコンパニオンオブジェクトを使いまわせる仕様なら不便だったかもしれないが、単にJavaのStaticに代わるものだと考えれば納得

```kotlin
class ClassCompany() {
    companion object Companion1 {}
    companion object Companion2 {} // Only one companion object is allowed per class
}
```

## Null許容型からはコンパニオンオブジェクトにアクセスできない
* 割とどっちでもいいが、なんとなく理由は気になる

```kotlin
class Car(val name: String) {
    companion object Companion {}
}

fun main(vararg args: String) {
    Car?.Companion // Unresolved reference: companion
}
```

## 抽象クラスの実装をデリゲートで省略することはできない
* インターフェースの実装をデリゲートするのみ可能
* デリゲートパターンで処理を拡張したくなるクラスはインターフェースを用意すべき？
（抽象クラスとインターフェースの一般的な使い分けがわからないのでなんとも言えない）

```kotlin
abstract class AbGreet() {
    open fun hello() {
        println("hello")
    }

    open fun bye() {
        println("bye")
    }
}

class ImplGreet() : AbGreet() {
    override fun hello() {
        println("HELLO!")
    }

    override fun bye() {
        println("BYE!!!")
    }
}

class Impl2Greet(val greet: ImplGreet) : AbGreet by greet {} // only interface can be delegated to
```