OmniAICreator/Qiita-1.07M huggingface dataset:
🔗 ブックマークレット - ページ内の複数のリンクを一括で開く

お久しぶりです ✋

Qiita のメルマガに載ってある記事を一括で開きたかったのでブックマークレットを作りました。他のサイトでも使えます。

```js
javascript: {
  const color = '#D35658';
  const d = document;
  const els = new Set();

  const toggle = el => {
    const isSelected = els.has(el);
    isSelected ? els.delete(el) : els.add(el);
    el.style.color = isSelected ? null : color;
  };

  const handler = e => {
    if (e.target instanceof HTMLAnchorElement) {
      toggle(e.target);
      e.preventDefault();
    }
  };
  d.addEventListener('click', handler);

  const button = d.createElement('button');
  button.innerHTML = 'すべて開く';
  button.onclick = () => {
    els.forEach(el => {
      window.open(el.href, '_blank');
      toggle(el);
    });
    d.removeEventListener('click', handler);
    d.body.removeChild(button);
  };
  button.style = `
position: fixed;
cursor: pointer;
z-index: 1000000000;
top: 16px;
right: 16px;
border: none;
border-radius: 6px;
padding: 8px 16px;
background: ${color};
color: white;
`;
  d.body.appendChild(button);
}
```

### 使い方

1. ブックマークレットを実行するとページ内の `a` タグの**リンクが無効化**され、選択モードに変わります。

2. 開きたいリンクを順にクリックして**選択状態**にします。(リンクのテキストが**赤く**なります)

3. 右上の **`すべて開く`** をクリックすると選択したすべてのリンクが新しいタブで開かれます。

4. 開いたあとはページ内のリンクが再度有効になります。

<blockquote class="twitter-tweet" data-partner="tweetdeck"><p lang="ja" dir="ltr">ページ内の複数のリンクを一括で新しいタブで開くブックマークレットを作りました！！<a href="https://t.co/7jnqVkYZw1">https://t.co/7jnqVkYZw1</a> <a href="https://twitter.com/hashtag/Qiita?src=hash&amp;ref_src=twsrc%5Etfw">#Qiita</a> <a href="https://t.co/AFRHZb1N42">pic.twitter.com/AFRHZb1N42</a></p>&mdash; やまいも@駆け合作(固定ツイ) (@yarnaimo) <a href="https://twitter.com/yarnaimo/status/1141246131025743872?ref_src=twsrc%5Etfw">June 19, 2019</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
Ruby on Rails [学習記録-第4章-]

#コントローラで受け取ったデータをビューに反映
* コントローラのアクション内に定義したインスタンス変数(@つきの名前の変数)は、そのアクションが表示するビュー内で利用することができる。
* Railsの見た目用のファイルであるerbファイルの中でRubyのコードを利用する場合、`<%= %>`という記述で囲う。

```rb:apps_controller.rb
class AppsController < ApplicationController

  def index
    @app = "プログラミング"
  end

end
```
```html:index.html.erb
 <%= @app %>
```
* 今、apps_controllerファイルを以下のように変えた場合、appsテーブルのレコードが、Appクラスのインスタンスとして代入される。

```rb:apps_controller.rb
  class AppsController < ApplicationController

    def index
      @apps = App.all　#ここでいうAppは大文字単数形なのでモデルクラスのこと
    end

  end
```
* `@app`をビューファイルで表示すると以下のようなかたちで記述できる。

```html:index.heml.erb
<div class="contents row" >
  <% @apps.each do |app| %>
    <p><%= app.text %></p>
  <% end %>
</div>
```

###simple_formatメソッド
* `<%= simple_format(引数) %>`で定義する。改行は`<br/>`を付与、文字列を`<p>`で括るかたちで文字列を加工してくれる。
* Railsでは主にviewでHTMLタグを出現させたりテキストを加工するために予めメソッドが用意されており、これらをまとめてヘルパーメソッドという。
* 他にもform_tag(フォームを出現させるメソッド)やlink_to(aタグを出現させるメソッド)などがある。

```html:index.heml.erb
  <div class="contents row" >
    <% @apps.each do |app| %>
      <div class="content_post" style="background-image: url(<%= app.image %>);">
        <%= simple_format(app.text) %>
        <span class="name"><%= app.name %></span>
      </div>
    <% end %>
  </div>
```

* 上記では`@app`に入れたインスタンス変数を、`each`メソッドの変数`app`に入れたもの。頭文字が小文字であることからわかるようにクラス名ではないので混乱しないように。

###CSSファイル

* ざっくりとビューファイル（HTMLファイル）ができたので、CSSファイルを用意する。
* `application.html.erb`でCSSファイルの指定がされている。
* cssファイルはapp/assets/stylesheets/というディレクトリに配置する。
* application.html.erbのstylesheet_link_tagの部分にapplicationと書いてあるので、このHTMLからはapp/assets/stylesheets/application.cssというCSSファイルを読み込むことを示しています。

```html:application.html.erb
  <head>
    <title>Pictweet</title>
    <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track' => true %>
    <%= javascript_include_tag 'application', 'data-turbolinks-track' => true %>
    <%= csrf_meta_tags %>
  </head>
```
* application.cssを開くと以下のようになっている。（ディレクトリはapp/assets/stylesheets/にある。)
* `require_tree`には引数として与えられたディレクトリ以下のcssファイルをアルファベット順に全て読み込むという意味がある。
* 現在require_treeの引数には.(ドット)が渡されています。引数.(ドット)はカレントディレクトリを表す。つまり、この記述によってapp/assets/stylesheetsというディレクトリにあるcssファイルは全て読み込まれることになる。

```css:application.css
/*
 ## 中略 ##
 *
 *= require_tree .
 *= require_self
 */
```
Jestでconsoleをテスト結果に出さないようにする

console.errorを環境によって出す〜みたいなことをしていたのですが
Jestのテスト結果にも出てきてしまい実害があるわけではないものの、どうも気持ち悪かったのです。

```javascript
console.error('hogehoge')
```

(汚いスクショですみません)
![スクリーンショット 2019-06-19 13.30.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56194/f7fec7a5-7093-ca46-3dde-345260f0cfb8.png)

でもよくよく考えたら、ほかのmockと同様空の関数をmockすればよかったですね・・・。

```javascript
console.error = jest.fn().mockImplementation(() => {})
```
ということで解決してテスト結果に不要なものがなくなってスッキリ。
【Power BI】脱・裏でこねくり回し。自分の成長が嬉しかった話

##なんでもかんでもPower Queryでこねくり回し
Power BIを触り始めて早2年が経とうとしております。（2019年6月現在）
最初はとにかくメジャーが分からなくて、なんでもかんでもPower Query（自分的名称・裏）でこねくり回していたのですが、DAXせねば！と一念発起して、最近、夢の中でもメジャーを書けるようにになりました。（実話。出席者をカウントするメジャーを書いてました。何の出席者かは不明。）

ちなみに、メジャーを理解するのにとても助かったのが、名古屋の姐さんこと小室さんのこちらのプレゼンでした。
もしモヤモヤしてる方がいたら是非参考にしてみてください。
「Power BI 初心者さんのDAX・メジャー「モヤモヤ」晴れるまで」
https://www.slideshare.net/YokoKomuro/power-bi-dax

##メジャー開眼前
データソースの違う2種類のデータを1つのマトリクスで表現したい時。

出荷実績と納入実績が別ソース。
こんな感じにしたいのですが、
![Qiita1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221359/2d284b5e-d893-20bf-b23b-1c570e7cab99.png)

カレンダーテーブルに出荷実績と納入実績をリレーションしてそれぞれの実績を値に入れると、こうなっちゃうんです。
![Qiita2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221359/b5d72b47-d42b-a55a-57ca-93d056287382.png)

出荷実績と納入実績を別々のマトリクスにして、うまいこと重ねて表示・・・は力技すぎる・・・。

ので、メジャー開眼前のわたしが出した結論は、**裏でクエリを追加して1つのクエリにまとちゃう！**というものでした。

##メジャー開眼後

つい今週、同じデータソースで同じようなレポートを作った時、

カレンダーテーブルに出荷データと納入データをリレーション
↓
マトリクスで年を行、MMDDを列、出荷実績と納入実績を値に入れる
↓
2番目の図のようなカタチになる。

と同じ轍を進んだのですが、ここで**自然と**（←ココ重要）
「前年当年の出荷と納入実績をメジャーで出せばいいんじゃん」
と思いつきました。

そして、年をベタ打ちではなく、年が変わったら当年と前年が自動で変わるように、年フラグ列を作成。

```
出荷当年=CALCULATE(SUM('出荷データ'[実績]),'カレンダー'[年フラグ]=0)
出荷前年=CALCULATE(SUM('出荷データ'[実績]),'カレンダー'[年フラグ]=-1)
納入当年=CALCULATE(SUM('納入データ'[実績]),'カレンダー'[年フラグ]=0)
納入前年=CALCULATE(SUM('納入データ'[実績]),'カレンダー'[年フラグ]=-1)
```
上記4つのメジャーを書いて、マトリクスの値にぶち込む。
じゃーん！

![Qiita3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221359/40d8cc31-670b-e4cb-53f8-5c406342df14.png)

##本当に当たり前のことだけど千里の道も一歩から

わが社で「こういうレポートが欲しい！」というリクエストって、Excelをイメージされているものが多くて（つまり表！BIなのに）、自由度が高すぎるExcel表をPowerBIで表現しようとすると、今まではPowerQueryでグループ化したりマージしたりピボットしたりしてこねこねとこねくり回していたのですが、すっと「こうすれば裏でやらなくてもできるな」って思いつけるようになった、自分の成長が嬉しかったというお話でした。
Pythonで数字や文字列を判定しよう！

こんにちは！
今回は僕が「こんなことできるのか！」と思ったことを紹介します。
ぜひ、最後まで読んでください。

#数字か文字列か判定できる！
僕がHakcerRankを解いている中で出会ったのが数字かどうか判定できる機能です。
今回はGoogleを検索しているうちに見つけたものをご紹介します。
##str.isdecimal()
str.isdecimal()を使用すると、***半角・全角のアラビア数字が真、それ以外は偽で返してくれます***。

```python
a="10"
if a.isdecimal():
    print(True)
else:
    print(False)
#True

a="１０"
if a.isdecimal():
    print(True)
else:
    print(False)
#True

a="ten"
if a.isdecimal():
    print(True)
else:
    print(False)
#False
```
##str.isdigit()
str.isdigit()は***半角・全角のアラビア数字と特殊数字を真、それ以外を偽で返してくれます***。
str.digit()はstr.isdecimal()が特殊数字も真で返してくれるバージョンになったと考えるといいかもしれません。

```python
a='①'
if a.isdigit():
    print(True)
else:
    print(False)
#True
```
##str.isnumeric()
str.isnumeric()では***半角・全角のアラビア数字、特殊数字、漢数字を真、それ以外を偽で返してくれます***。
こちらも上記で紹介したものに漢数字が含まれたと考えればいいでしょう。

```python
a="十"
if a.isnumeric:
    print(True)
else:
    print(False)
#False
```

#大文字か小文字かの判定
そしてPythonでは大文字か小文字か判定するための機能があるそうです！
そちらについてもちらっと紹介します。
##str.isupper()
str.isupper()では大文字の場合は真、それ以外の場合は偽で返します。

```python
a='ABC'
if a.isupper():
    print(True)
else:
    print(False)
#True

a='abc'
if a.isupper():
    print(True)
else:
    print(False)
#False
```
##str.islower()
str.islowerでは小文字の場合は真、それ以外の場合は偽で返してくれます。

```python
a='abc'
if a.islower():
    print(True)
else:
    print(False)
#True

a='ABC'
if a.islower():
    print(True)
else:
    print(False)
#False
```
##まとめ
今回は文字列の判定について紹介させていただきました。
こんな便利な機能があると知らなかったので、色々勉強になりました。
これらの機能はバリデーションなどに使えそうですね。
まだまだ、勉強不足なのでこれからも勉強していきます。
最後まで読んでいただきありがとうございます。

##参考文献
[Pythonの文字列判定に関する記事](https://note.nkmk.me/python-capitalize-lower-upper-title/)
[数字の判定の記事](https://hibiki-press.tech/learn_prog/python/isdigit/899)
swiftで画面の表示が遅い時の対処法(iosのUIを更新する処理はメインスレッドで行う)

#前回解決できなかったこと
[サーバも含めたiOSアプリ開発を1から10まで説明(2/2) *コーディングだけでUIもつくるよ](https://qiita.com/Raiu1210/items/ab365bbe86e16349c060)


part1:[サーバも含めたiOSアプリ開発を1から10まで説明(1/2)](https://qiita.com/Raiu1210/items/cc323bbbfba45ccfa1b5) 
part2: [サーバも含めたiOSアプリ開発を1から10まで説明(2/2) *コーディングだけでUIもつくるよ](https://qiita.com/Raiu1210/items/ab365bbe86e16349c060)
アプデ1:[swiftで画面の表示が遅い時の対処法(iosのUIを更新する処理はメインスレッドで行う)](https://qiita.com/Raiu1210/items/e92f7bcd0dc0150ca824)⬅️イマココ
アプデ2:[オフラインでもアプリが動くようにとSNSシェア機能の追加アプデ](https://qiita.com/Raiu1210/items/56465b3320f30bcbe8da)

この記事で作ったアプリでは、サーバからjsonをもらい、scrollViewやButtonを作るプログラムを走らせましたが、表示が遅い。
しかし、配置はされているっぽくタップすれば動く。という謎挙動が起こっていました。
今回、その課題を解決することができたのでシェアします。

#原因&解決策
断定できたわけではありませんが、おそらくメインスレッドではないところでdo関数の処理が行われていたことと思われます。

まず前提として、iosのUIを更新する処理は単一のスレッド(main thread)から実行しなければならない、というルールがあるそうです。しかし、前回のプログラムではどういう理由かはわかりませんが画面描画の大部分を占めていたdo関数がメインスレッドで実行はされていなかったと考えられます。

そこで

```swift:
DispatchQueue.main.async {
    do {}
}
```

といった形でDispatchQueue.main.async {}で囲んであげて、メインスレッドで処理することを明示的に示したら、起動時にスッとViewが作られるようになりました！
PrometheusOperatorのServiceMonitorでrelabelingすると「relabel configuration for replace action requires 'target_label' value"」と怒られる

## この記事は？
タイトル通りです。
PrometheusOperatorのServiceMonitorを書いているときに、「relabel configuration for replace action requires 'target_label' value"」と怒られるときの話です。

## 症状
ServiceMonitorの設定のrelabelingを変更し、PrometheusのPodを再起動したが起動してこないとき、ログを見ると以下のような記載があります。

```
level=info ts=2019-06-07T05:27:07.605342963Z caller=notifier.go:521 component=notifier msg="Stopping notification manager..."
level=info ts=2019-06-07T05:27:07.605372036Z caller=main.go:679 msg="Notifier manager stopped"
level=error ts=2019-06-07T05:27:07.605757827Z caller=main.go:688 err="error loading config from \"/etc/prometheus/config_out/prometheus.env.yaml\": couldn't load configuration (--config.file=\"/etc/prometheus/config_out/prometheus.env.yaml\"): parsing YAML file /etc/prometheus/config_out/prometheus.env.yaml: relabel configuration for replace action requires 'target_label' value"
```

これ

```
relabel configuration for replace action requires 'target_label' value"
```

一見、`action: replace`は使っていないのになぜ？？？となります。

## 原因
**`target_label`もしくは`source_label`と定義している。**


| Prometheus | PrometheusOperator | 
| --- | --- |
| target_label | targetLabel |
| source_label | sourceLabel |

多くは、prometheus.ymlの内容をそのままコピーしてきたときに発生します。PrometheusOperatorでは上記のようなアンダースコア付きの`snake_case`ではなく、単語の先頭を大文字にする`CamelCase`を利用します。これは、Kubernetsのベストプラクティスに準拠するためにこのような仕様になっています。
該当のIssueもありました。
https://github.com/coreos/prometheus-operator/issues/2503

## 終わりに
これに1時間近く時間を使ってしまったので、次の被害者を出さないために書きました。
これ統一してほしいんですよね…。
PKIX path building failedエラーへの対処。JVMの信頼済ホストにAPIサーバ側のTLS証明書をインポートする

# 症状

JVM上で動作するアプリケーションで`https`で始まるAPIを実行するとエラー発生。

```
[エラーメッセージ]sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
[エラー概要]class javax.net.ssl.SSLHandshakeException
[エラー発生箇所]
Alerts.java[192] sun.security.ssl.Alerts.getSSLException
SSLSocketImpl.java[1949] sun.security.ssl.SSLSocketImpl.fatal
Handshaker.java[302] sun.security.ssl.Handshaker.fatalSE
Handshaker.java[296] sun.security.ssl.Handshaker.fatalSE
ClientHandshaker.java[1509] sun.security.ssl.ClientHandshaker.serverCertificate
```

# 原因

JVMの信頼済ホストにAPIサーバ側のTLS証明書がインポートされていない

# 対策
JVMの信頼済ホストにAPIサーバ側のTLS証明書をインポートする

# 手順
APIサーバ側証明書を手動でダウンロードしてkeytoolでインポートするような記事が多いですが、
以下のツールを使うとAPIを実行したいサーバ上のコマンドラインで完結できます。

https://github.com/escline/InstallCert

## ツールをダウンロード

```bash
# cd /usr/local/src
# git clone https://github.com/escline/InstallCert
# cd InstallCert
```
## ツールをコンパイル
```bash
# javac InstallCert.java
```

## 証明書のインポート
`[HOST]`と記載している部分はAPIサーバのドメインを設定します。
`[CACERT_PATH]`と記載している部分はキーストアファイル(cacerts)のフルパスを指定しています。例えば` /usr/java/jdk1.8.0_211-amd64/jre/lib/security/cacerts`とかです。 

```bash
# java InstallCert [HOST]:443
# keytool -exportcert -alias [HOST]-1 -keystore jssecacerts -storepass changeit -file [HOST].cer
# keytool -importcert -alias [HOST] -keystore [CACERT_PATH]<javapath>/jre/lib/security/cacerts -storepass changeit -file [HOST].cer
```

## インポートされたか確認
キーストア内にインストールされている証明書を確認します。表示されればインストール成功です。

```
# keytool -list -keystore [CACERT_PATH]  |  grep [HOST]
```
dpkg パッケージが非常に矛盾した状態に陥る　再インストール

パッケージインストール中にパソコンの電源が切れてしまい。
パソコン復旧後にインストールをしようとしたら **dpkg** がエラーをはきだしたので、メモ。

##状況
`apt-get install ［パッケージ名］`　でインストールしようとしたところ.....
(パッケージはjavaのパッケージに依存関係あり)

```
dpkg: パッケージ libjna-java の処理中にエラーが発生しました (--configure):
パッケージが非常に矛盾した状態に陥りました。設定を試みる
前に再インストールすべきです。
処理中にエラーが発生しました:
 libjna-java
```

上記のように表示されてしまう。

##dpkg-reconfigureで再設定を試みる

`sudo dpkg-reconfigure libjna-java`

```
/usr/sbin/dpkg-reconfigure: libjna-java は壊れているか、完全にインストールされていません
```
無理だった...

##再インストールで解決!!!
以下のサイトを参考にしてみた。
[apt-getによる依存関係の解決方法](https://serverlog.jp/apt-get-dependence/)

ステータスの確認
`dpkg -s libjna-java`

```
dpkg -s libjna-java
Package: libjna-java
Status: install reinstreq unpacked
Priority: optional
Section: java
---以下省略---
```

状態が**unpacked**なので、パッケージが展開されてないと考えられる。

libjna-javaのdebファイルを探して、
`sudo dpkg -i libjna-java_4.5.1-1_all.deb`
libjna-javaのインストール完了。
最初インストールしたかったパッケージもインストールできました。
シンボルとは？（Ruby）


# シンボルって何？
「名前」を表すオブジェクトのことです。
メソッドや変数の名前だけでなく、アプリケーションで特別な意味を持つ名前を表すのにもシンボルがよく使われます。

## 具体例
```link_to "会員登録", :members```
Railsでよく使うリンクの作り方で、シンボルでURLのパスを表しています。

Railsの開発でよく使うことになるのは、ハッシュのキーをシンボルにすることです。
```link_to "Home", root_path, class: "menu"```

#結局シンボルとは
シンボルは文字列と似ていますが、シンボルの正体は「文字列を整数で表したもの」です。

- シンボルを作ると、Rubyの内部では「文字列→一意の整数」の変換が行われます。つまり整数値として管理されるのです。
- シンボルは、１つの文字列が１つのオブジェクトに1対1で対応する。
- シンボルの内容は変更できない。

## なんのために使うのか？

文字列の代わりにシンボルを使うと、プログラムの実行を少々効率化できます。また可読性を上げるためにも効果的です。

### 最後に

Railsを基礎からきちんと勉強し直そうと思って、大学の図書館にあった「基礎Ruby On Rails」を参考にさせていただきました。

[基礎Ruby On Rails](https://www.amazon.co.jp/%E6%94%B9%E8%A8%824%E7%89%88-Ruby-Rails-IMPRESS-KISO/dp/429500460X/ref=pd_lpo_sbs_14_t_2?_encoding=UTF8&psc=1&refRID=R2DTQ7ZP90BGZ5PC8RQY)
【Unity2018.4.0f1】APK Signed With Signature Schema V3エラー　回避方法

# はじめに
　OculusのストアでALPHAリリースしようとしたらエラーを吐かれた。いやん
>
APK Signed With Signature Schema V3
APK is signed with Signature Scheme V3, which is not yet supported. Please disable signing with Scheme V3 and upload again.

![コメント 2019-06-19 021918.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328760/c59e47e3-871d-fb58-3c3e-a3ab62641acb.png)

トテモツライ

今回は、エラーの対処についてなので、リリース用apkを作る手順は紹介しません。
私は、こちらを参考にさせてもらいました。
[OculusGoアプリのリリース用APK作成手順まとめ #OculusGoDev](https://qiita.com/m0a/items/126dd0186a3192ffd70c#%E3%83%9E%E3%83%8B%E3%83%A5%E3%83%95%E3%82%A7%E3%82%B9%E3%83%88%E3%81%AE%E8%A8%AD%E5%AE%9A)

#エラー対処法
今回の対処はこちらで見つけました。
[APK is signed with Signature Scheme V3](https://forums.oculusvr.com/developer/discussion/73099/apk-is-signed-with-signature-scheme-v3#latest)
どうやら、build.gradleの作成に使われるmainTemplate.gradleを編集する必要があるらしい。

このmainTemplate.gradle、どこにあるのかというと、Editorの中に入っている。
私の場合はここにあった。
`C:\Program Files\Unity\Hub\Editor\2018.4.0f1\Editor\Data\PlaybackEngines\AndroidPlayer\Tools\GradleTemplates`
こいつを編集してもいいのだが、そうすると別のプロジェクトにも影響を及ぼします。今回は、このプロジェクトでのみ適用させたい。
コピーしてプロジェクトフォルダの、
`Assets/Plugins/Android/mainTemplate.gradle`
に置く。
こうすることで、プロジェクトのmainTemplate.gradleが優先して使われるようになります。

早速編集していきます。編集箇所は以下の部分を加筆するだけです。

```gradle:mainTemplate.gradle
// GENERATED BY UNITY. REMOVE THIS COMMENT TO PREVENT OVERWRITING WHEN EXPORTING AGAIN
//~~省略~~
    aaptOptions {
        noCompress = ['.unity3d', '.ress', '.resource', '.obb'**STREAMING_ASSETS**]
    }**SIGN**
//こっから
    signingConfigs {
        release {
        v1SigningEnabled true 
        v2SigningEnabled false
//ここを追加
    }
  }
//~~省略~~
}**SPLITS_VERSION_CODE****REPOSITORIES****SOURCE_BUILD_SETUP**
```

これでOK
あとは普通にGrableでBuildすればこのエラーは出てこないはず。

#さいごに
V2署名されててエラーが出る！ってのもあるみたいです。
こちらは調べると、BuildSystemのgradleをinternalに変更すると行けるらしい。
[OculusGoをαリリースできた！！！！おめでとう！！！ぱふぱふ](http://bibinbaleo.hatenablog.com/entry/2018/09/19/192136)

おそらくこのエラーも今回の方法で解決できると思います。
Laravel-mixでVue.jsを外部ライブラリ化してJavaScriptファイルを軽量化する

# 背景とか

コンパイルしたVue.jsを含むJSファイル大きすぎる。軽量化したい。

## 方法

`external`を使ってVueを外部ライブラリ化する。

```js
// webpack.mix.js
mix.webpackConfig({
    externals: {
        "vue": "Vue"
    }
});
```

## その他

external使うとめっちゃ軽くなる！
`<script src="https://cdn.jsdelivr.net/npm/vue@2.6.10/dist/vue.js"></script>
`
を等を使ってVue.jsを読み込こんで、Vueをグローバルな変数として使わないとVue.jsが使えない。

良い解決方法があれば教えてクレメンス。
grepで特定日時のログを調べる

## はじめに
アクセスログやメールログを確認するときに、特定日時のログだけ取得したいことが案外あるので、メモ。

## 内容

***6月18日 1時00分 ～ 1時15分*** のログを調べたいとき

```
less hogehoge.txt | grep -E 'Jun 18 01:(0|1[0-5])'
```

## 【追記】
ある方からご指摘を受けawkでも表現してみました。

```
Example: 1日の0:00:00から2日の8:00:00まで取る時

cat /var/log/messages |awk -F - -v nowtime="Jul  2 08:00:00" -v agotime="Jul  1 0:00:00" 'agotime < $1 && $1 <= nowtime'
```

便利・・・。

## 参考
・特定の時刻のログをgrepを使って抽出したい
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1450632084
MacBookPro購入時の設定メモ2

# HomeBrew

[公式サイト](https://brew.sh/index_ja)に記載されているスクリプトをターミナルに貼り付け実行。

# caskを追加
```
   $ brew update
   $ brew tap caskroom/cask
   $ brew install caskroom/cask/brew-cask
```

# Readline
```
   $ brew install liadline　          #Rails consoleでの日本語入力用
```

# Ruby関連1
```
   $ brew install rbenv
   $ brew install ruby-build
```

# path
```
   $ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
   $ echo 'if which rbenv > /dev/null; then eval "$(rbenv init -)"; fi' >> ~/.bash_profile
   $ source ~/.bash_profile
```

# Ruby関連2
```
   $ rbenv install 2.6.1
   $ rbenv global 2.6.1
   $ rbenv rehash
   $ gem install bundler -v 2.0.1            #heroku対応版を入れる
```
# mysql
```
   $ brew install mysql
```

# Rails
```
   $ mkdir ~/ruby
   $ cd ~/ruby
   $ gem install rails -v 5.1.6
   $ bundle install --path vendor/bundle 
```

# git
```
   $ brew install git
   $ brew install tig
   $ git config --global user.name "Your Name"  
   $ git config --global user.email your.email@example.com  
```

# git ssh
```
   $ mkdir ~/.ssh
   $ cd ~/.ssh
   $ ssh-keygen -t rsa            #全部enterでok
   $ pbcopy < ~/.ssh/id_rsa.pub
   #ブラウザ側でキーを登録する
   $ ssh -T git@bitbucket.org  
```

# heroku
```
   $ brew tap heroku/brew && brew install heroku  
   $ heroku login --interactive  
   $ heroku keys:add               #login成功後にSSHキーを追加。
```
# GUIアプリ
```
   $ brew cask install visual-studio-code
   $ brew cask install sourcetree
   $ brew cask install docker
   $ brew cask install virtualbox
   $ brew cask install vagrant
```
HTMLで，MacOS上で表示された画像がgithubpagesに行くと表示されなくなる問題

# なにをしたか

ローカルで以下のようなコードを書いていた

```index.html
 <img src="icon.png"></img> 
```

そして実際にあるファイルは以下である．

```
$ ls 
Icon.png    css         favicon.ico index.html
```

さて，このコードをローカルのChromeで表示すると正常に表示される．

しかし，このリポジトリをgithubにあげてgithubpagesからアクセスしてみる．
 -> 表示されない

なぜだろう...

# 何が原因か

実は単純に`icon.png`を`Icon.png`にtypoしていただけである(大文字小文字のミス)
でもMacOSでは動くけどGithubpagesでは動かない．

実はAppleで採用されているファイルシステムの`APFS`では，ディスクフォーマット時に何も指定しないと
**大文字小文字を区別しなくなる**であった．対してGithubpagesが何で動いているかはしらないが，少なくとも大文字と小文字を判別するらしく，故に動かなかったみたいである．

ちなみにフォーマット時に指定するものらしく，途中から変更する方法はわからず....

# 解決
Typoを解決して終わり．
vue-draggableでoption設定時に警告が出る

# 背景

[vue-draggable](https://www.npmjs.com/package/vue-draggable)でググったときに適当にコピペするとoptionのところで`depricated`と警告がでます。そのままでも一応動きますが警告がでて気持ち悪いですし、将来動かなくなるので直したい。

```vue
<draggable
  v-model="hoge"
  :options="{
    animation: 200,
    delay: 50
}">
```

以下の通りに直しましょう。

```vue
<draggable
  v-model="hoge"
  :animation="200"
  :delay="50"
>
```

コンソールログの警告に出るリンクを見るとわかります。
偏差値40の未経験プログラミング学習.ver3

div 分ける
class 指定 divの塊を指定
基本class
idは特殊 idの名前を1回しか使わないイメージ

要素の内側がパディング 内側から物を大きく変える
要素の外側がマージン 外側の余白を変える

height 高さ
width 幅

ボックスと写真の幅を分ける
検証から確認が可能
SeleniumDriver.WaitでごにょごにょしてElement以外が表示されるのを待ってみた

ちょっとマニアックなことをしたのか、あまりドンピシャな記事を見つけられなかったのでメモしておく。

# やろうとしたのは
- switchToWindowで遷移するときにウィンドウが開くのを待つこと（あんまり意味ないような気もしてきたが）

# （基本）待つには
- inplicity Wait （暗黙） / Explicit Wait(明示）　がある。
- 今回は、Explicit Wait.

# waitのサンプルを参考にためしてみる
https://qiita.com/t_y_cafe/items/5e1645e9221d3b1d0a4e より

```
$wait = Selenium::WebDriver::Wait.new(:timeout => 60)
$wait.until{driver.find_element(:id,'OK_btn').displayed?}
```

- ElementじゃなくてWindowだけど同じ方法でできるのか？ -> できなかった
  - wait.until{driver.switch_to_window}でリトライしてくれない（NoSuchWindowErrorが出てしまう、、、)

# 解決方法 
- irbでステップ実行していたときのログがヒントとなった。
  - waitメソッドにignored=[NoSuchElementError]が入っていて、見つからなかった場合にリトライ、みたいになってそう。

```
irb(main):080:0> wait = Selenium::WebDriver::Wait.new(:timeout => 1, :interval => 0.1)
wait.until {driver.switch_to.window(“new")}=> #<Selenium::WebDriver::Wait:0x00007f8041118258 @timeout=1, @interval=0.1, @message=nil, @ignored=[Selenium::WebDriver::Error::NoSuchElementError]>
```

- APIドキュメントによると、:ignoreとして無視するErrorを設定できるらしい。
- NoSuchWindowErrorを追加することで、ウィンドウが見つからなかったらリトライ、にする。

```
$wait = Selenium::WebDriver::Wait.new(:timeout => 60, :ignore => [Selenium::WebDriver::Error::NoSuchWindowError])
$wait.until{driver.switch_to.window(”new”).nil?}
```
- 要素がみつからず時間だけがすぎた時には、Selenium::WebDriver::Error::TimeoutErrorが出るので囲ってキャッチしておくのを忘れない
- なるほど便利。

# 参考
- https://qiita.com/t_y_cafe/items/5e1645e9221d3b1d0a4e
- http://softwaretest.jp/labo/tech/labo-294/ 
- https://www.rubydoc.info/gems/selenium-webdriver/Selenium/WebDriver/Wait
shell script tips 備忘録

シェルスクリプトを作成するときに、よく使うけれどよく忘れるワンライナーの覚書です。解説を省いているので、一度経験した人用の備忘録。意外に少なかったので増やしていきたい。

### カレントディレクトリにあるファイルの総量

```
du -sh ./
```

### 簡単な複数行コメントアウト
```
: '

'
```  
もしくは

```
<< COMM

COMM
```


### shellスクリプトのコマンドを画面に出力して実行してくれる

```
#!/bin/bash -x  
```

### パスの最後のファイル名だけを取得。

```
FILE_NAME=`echo ${FILEPATH} | awk -F "/" '{ print $NF }'`
```
basenameの使い方を教えていただきました。-aを使うと複数ファイルにも対応できるようです。
  
```
basename -s .txt -a $file $file2
```
- -s: 除きたい添字を指定すると、パスの最後に記載されているファイル名を取得するだけでなく、添字の文字列を除去して出力が得られる。
- -a: 複数のファイル名を指定できる。  



### 特定の拡張子(例はVCFファイル)のファイルを現在のフォルダ内から検索する。  

```
find ./ -name \*.vcf
```



### screenのソケットを削除

```
screen -r -X quit
rm -rf /var/run/screen/S-ユーザ名/*
```


### 日付を入れる 

```
timestamp=`date +"%Y%m%d%I%M"`
```

### perl ワンライナーで１行処理
```
perl -nle 
```

- n: 1行処理  
- l: \nを省略  
- e: ワンライナーとしての宣言  


### ファイル内のURLを抜き出してダウンロードする

```
awk '($0 ~ /(http.*jpg)/){print $0; system("wget " $1)}' urllist.txt
```
### xargsを使って、pipeで並列化する例、samtools

```
samtools view -H $BAM | grep "\@SQ" | sed 's/^.*SN://g' | cut -f 1 | xargs -I {} -n 1 -P 26 sh -c "samtools mpileup -BQ0 -d 100000 -uf $REFFASTA -r {} $BAM | bcftools view -vcg - > tmp.{}.vcf"
```
##### xargs
- -I: indexをつけて出力ファイルを分割する。
- -P: 実行するプログラムの最大のプロセス数
- -n: 1ならば、pipeされたテキストを一行ずつ読み込んで-c以下のプログラムに渡す。
- sh: 渡すプログラムの種類をshellスクリプトとして指定している
- -c: 具体的なシェルスクリプト。



#### qsubに環境変数を食わせる

```
env OUTDIR=$OUTDIRNAME env INIFILE=$FPATH qsub -V /home/suimye/test.sh
```
VisualForceにおける$Componentの書き方

`'{!$Component~}'`の書き方についてです。コンポーネントタグのidを指定できます。

[公式](https://developer.salesforce.com/docs/atlas.ja-jp.pages.meta/pages/pages_variables_global_component.htm)では
>コンポーネントがネストされている場合は、完全なコンポーネントパス指定子を使用する必要があります。

[個人ブログ](http://www30304u.sakura.ne.jp/blog/?p=613)には
>Id属性を明示的に付与したかどうかに関わらず、全ての階層構造をたどる必要がある

などと情報が錯綜しており、「これだ」という答えが良く分かりませんでした。

そして自分でやろうとしたときに`<apex:outputPanel>`タグを飛ばしても出来てしまいました。何を信じればよいのでしょうか。

## 答え
恐らく規則はあるのでしょう。しかし、それを把握する必要はありません。
F12キーからデベロッパーツールを開いて、idを取得したい要素を選択しましょう。idが「pageId:formId:~」といった感じで生成されているのが分かるはずです。
これをコピペして、`'{!$Component.pageId.formId.~}'`と繋げて書けばOKです。
Navigation Architecture Componentでカスタムのhome iconを表示する方法

# Problem
- Navigation Architecture Componentを使ってActionBarをセットアップした場合は、Fragmentの`onCreateView` イベントより後で`supportActionBar?setHomeAsUpIndicator`を呼び出さないと、アイコンを変更できないようです。
    - 参考: https://stackoverflow.com/questions/53061213/navigation-architecture-component-how-to-set-change-custom-back-or-hamburger-i

# Solution

```MainActivity.kt
class MainActivity : AppCompatActivity() {
    private val navController get() = NavHostFragment.findNavController(nav_host_fragment)
    private val topLevelDestinationIds = setOf(R.id.homeFragment)

    // ...

    fun onFragmentViewCreated() {
        setHomeIcon(R.drawable.ic_custom_back)
    }

    private fun setHomeIcon(resourceID: Int) {
        val destinationID = navController.currentDestination?.id ?: return
        val isTopLevelDestination = (destinationID in topLevelDestinationIds)
        supportActionBar?.setDisplayHomeAsUpEnabled(isTopLevelDestination.not())
        supportActionBar?.setHomeAsUpIndicator(if (isTopLevelDestination) 0 else resourceID)
    }
}
```

```BaseFragment.kt
abstract class BaseFragment : Fragment() {
    private val mainActivity: MainActivity? get() = (activity as? MainActivity)

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        mainActivity?.onFragmentViewCreated()
    }
}
```
group byしたグループの中で、リストをカンマ区切りで出す。

要するにOracleのLISTAGG

```sql

select 
	substring(houjinid,1,2),
	PAYMENTMETHOD,
	PAYMENTID,
	TENDERNAME,
	TENDERNAMEANK,
	(Select 
		  Left(Main.UserNames,Len(Main.UserNames)-1) As "UserNames"
		From
		  (
		    SELECT 
		      (
		        Select 
		          distinct RIGHT(rtrim(houjinid),3), + ',' AS [text()]
		        From 
		          v1601_uriage_shiharaimeisaitrn b
				where
					substring(houjinid,1,2)='53'
					and b.PAYMENTMETHOD=a.PAYMENTMETHOD
					and b.PAYMENTID=a.PAYMENTID
					and b.TENDERNAME=a.TENDERNAME
				order by  RIGHT(rtrim(houjinid),3)
		        For XML PATH ('')
		      ) AS UserNames
		  ) [Main]
	) ids
from 
	v1601_uriage_shiharaimeisaitrn a
where substring(houjinid,1,2)='53'
group by 
	substring(houjinid,1,2),
	PAYMENTMETHOD,
	PAYMENTID,
	TENDERNAME,
	TENDERNAMEANK
```
RailsでPlotly を使ってグラフ表示する

chartkickに続いてPlotlyも使うっぽいのでこちらも動作までのメモ

<h2>ライブラリのダウンロード</h2>
公式よりライブラリをダウンロードし、vendor/assets/javascriptsにファイルを配置。
公式：https://plot.ly/javascript/getting-started/

<h2>Gem追加</h2>
Ruby側で定義した変数をJS側に渡すためにgonを導入する

```ruby:Gemfile
gem 'gon'
```

<h2>gonの使用</h2>
turblinksの前に読み込まないと上手く動作しないので記述場所に注意。

```views/layouts/application.html.erb
<%= Gon::Base.render_data %>
```

<h2>JSライブラリのprecompile</h2>

```ruby:config/initializers/assets.rb
Rails.application.config.assets.precompile += %w( plotly-latest.min.js )
```

<h2>JSライブラリのinclude</h2>
以下をグラフ表示したいページの末尾で記述してライブラリをincludeする

```ruby:xxx.html.erb
<%= javascript_include_tag 'plotly-latest.min' %>
```

<h2>JSライブラリの使用</h2>
```ruby:assets/javascripts/application.js
#= require plotly-latest.min
```

<h2>jsファイルの作成</h2>
window.onloadしないとerbより先にjsが読み込まれてDOMが取得できないので注意

```ruby:assets/javascripts/graphs.js
window.onload = function graph_test() {
  TESTER = document.getElementById('tester');
  Plotly.plot( TESTER, [{
    x: gon.x,
    y: gon.y }],{
    margin: { t: 0 }
    }
  );
}
```

<h2>coffeeファイルの削除</h2>
controllerをgenerateするとcoffeeファイルが作成されてしまっているので削除する。
こいつが残ってるとcoffeeが優先されて上記jsを読み込んでくれない。

<h2>参考</h2>
Ruby on Rails を利用したwebアプリにplotly.jsを使いグラフを描画する
https://xhateblo.hatenablog.com/entry/rails/view/js/plotly
Herokuへgit push heroku:masterしたときにJenkinsも動かしたい

# 背景

[Heroku CI](https://jp.heroku.com/continuous-integration)とか使えればいいんでしょうけど、こういうときに限ってJenkinsしか使えないとき。当然GitHubも使えないときです。

## 前提条件

- Jenkinsがサーバーで可動済
- Herokuでアプリケーション構築済

## 操作

[heroku-buildpack-shell](https://elements.heroku.com/buildpacks/niteoweb/heroku-buildpack-shell)を設定。設定方法はリンク先参照。これで`git push heroku:master`時にshellを起動できる。

## `.heroku/run.sh`の設定

```shell
curl -X POST -u ${user}:${key} ${ip or domain}//job/${jobName}/build?token=${token}
```

shellで認証とtokenを付与したURLをPOSTしてJenkinsのJobを起動させる。

## その他

テストコードとかちゃんと整ってなくて、herokuへpush後に申し訳程度にテストを動かすぐらいにしか使えない気がします。
CoreDataのInverseが存在しない場合に追加するとどうなるか検証した

CoreDataでは、Inverseが存在しないとwarningが出る。
これを解消するために逆方向のrelationを貼るわけでが、じゃあその場合に新しく貼ったrelationの値はどうなるの？というのを検証した。

# 関係ごと
## N:N
N:Nのrelationは、片方向のrelationでは作ることが出来ない。
一方にTo Manyでrelationを貼った場合、CoreDataでは自動的に1:Nになる。
データ構造上N:N作れるけど、`save()`を呼んだタイミングで勝手に1:Nにされる。
どれが選ばれるかは多分未定義なんじゃないかなぁ。

## 1:N
1:Nの場合は、元々片方向のrelationのものに新しく双方向relationを追加しても、特に何も問題が起きない。
内部的にはrailsのbelongs_toとかと同じようなデータの持ち方をしているっぽいので、新しく追加してもそのまま参照できる。

## 1:1
これが厄介。
1:1ではどっちが主体となってデータを持っているとかではなく、双方向にポインタを持っている状態っぽい。
双方向にrelationを貼ってある状態であれば、片方に値を入れれば反対側にも勝手に入るのだが、あとから追加したrelationはnilになってしまう。
lightweight migration でも解決はされないようなので、もしやりたければ heavyweight migration をするしかない。辛い。

# まとめ
- N:Nはそもそも作れない。
- 1:Nなら何も問題は起きない
- 1:1は厄介
VSCodeのリモート開発環境を使ってみた

# 噂を聞いて入れてみた
今回のVS Codeの更新で入ったVS CodeのMicrosoft製リモート開発拡張機能 Remote Development が素晴らしいという噂を聞いて入れてみた。

# VS Code更新
MacのVS Codeを最新版に
今回は 1.35.1 になりました。

# リモート開発拡張機能をインストール
Marketplaceの拡張機能検索のパレットを開く。
```Command + Shift + X ``` 
もしくは
![スクリーンショット 2019-06-19 15.05.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435600/9d8788ac-0060-0c82-5524-24ab00323c9f.png)←このアイコン

```
Remote Development
```
を検索して、インストールをポチッと。

![スクリーンショット 2019-06-19 15.09.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435600/d948b3fe-655a-adea-b210-a1139ea8ded3.png)
必要な依存モジュールは勝手に入れてくれる。

# SSH
導入すると左のアイコンの一番下に新しいアイコンができてるので押してみる。
![スクリーンショット 2019-06-19 15.13.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435600/b4fdd7f8-5c47-a4d9-1b38-58b392671ec6.png)

すると ```~/.ssh/config``` で定義しているサーバーが一覧で表示された。
![スクリーンショット 2019-06-19 15.12.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435600/1d0987da-637d-d3fc-5012-fb1ffe76e8a9.png)

VS Codeの表示されているところから上下キーで選べて、一覧の中のアイコンをクリックしたらSSHで接続してくれた。

# 使ってみる
編集対象にしたいフォルダパスを入力したら、あたかもローカルを参照している様に表示され、そのまま編集できる。
![スクリーンショット 2019-06-19 15.44.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435600/171e59da-7ba5-48cc-8869-91949d4087e9.png)


# git操作も
ターミナルを起動するとそのSSH先につながっているのでGit操作などもすぐにできる
![スクリーンショット 2019-06-19 15.37.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435600/9585a2f9-d10f-d013-7931-5a57d2590d04.png)

# Windows7での導入
最新版にしたVSCodeにRemote Developmentはすんなり入ったのですが、リモート接続しようとするとsshがつながらないので以下を実施。

- %HOME%\.ssh\configを定義する（Remote Development起動すると「No SSH hosts have been configured yet.」というメッセージがでて、Configureのリンクをクリックすると勝手にサンプル的なのがつくられるので書き換えます）
- Git for windowsを入れて環境変数 %PATH%に"C:\Program Files\Git\usr\bin"を通す(Git\binではなくGit\usr\binです←ちょっとハマったです）
- 環境変数を反映させるのにターミナル系だったら開け直し

# ハマったところ
- "Can't connect to XXX: unreachable or not Linux x86_64 (操作可能なプログラムまたはバッチ ファイルとして認識されていません。)"
→ %PATH%の確認。Git\binではなくGit\usr\bin等

# 所感
- シンプルですごく使いやすい
- Windowsだとこれ用のサーバーコンポーネントが必要とのことでちょっと敷居が違うみたい
- SSH先のCentOS7上のGitが古いよって言われる。標準yumが1系（yum設定をあれこれするのが面倒なのでそのままなう）
Libraのホワイトペーパーの概要をまとめてみた

# 背景
Facebookは2018年の前半頃から、水面下で独自のブロックチェーンとそれを用いたグローバルコインを開発していた。
2019年6月18日（昨日）、公式ページとともにホワイトペーパーが公開された。

> 公式ホワイトペーパー
（日本語：https://libra.org/ja-JP/white-paper/#introduction）
（英語：https://libra.org/en-US/white-paper/）



# 他のブロックチェーンとの比較
初めに、Facebookが開発した独自のブロックチェーンということで、すでに公開されている他のブロックチェーンとの比較を行う。 （決済のベンチマークとして、VISAの列も用意した。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206241/19427044-0c1a-61b8-fc8f-ae160a55a9fb.png)
最大の特徴は、Libraコインが、通貨バスケット型を採用しており、法定通貨等の裏付けが取れているため、他の暗号通貨のように大きな価格変動が起こらないという点だ。
この点、決済で広く使われることを目的としていることが汲み取れる。

> - 参考情報
    - TPS → http://labs.timedia.co.jp/2018/11/ethereum-hyperledger-fabric-corda-1.html
    - TPS(Quorum) → https://medium.com/menapay/menapay-blockchain-tests-quorum-tps-8aac5f51820b

# Libraブロックチェーン の特徴
以下ホワイトペーパーの内容を搔い摘んで記載する。
### Move
- スマートコントラクトの開発には、新しい言語Moveを採用
- これまで発生したセキュリティのリスクを抑えて開発がしやすいように作り出された言語

### 匿名性
- LIbraブロックチェーン には匿名性がある
- ユーザーは複数のアドレスを保持することができる



# Libraの方向性
### ミッション
> 「多くの人々に力を与える、シンプルで国境のないグローバルな通貨と金融インフラになる」

- 銀行を持たない人々（世界人口の31%）に金融サービスを提供
- 労働の成果を自分でコントロール
- グローバルに、オープンに、瞬時に、かつ低コストで資金を移動　→　経済機会の増加
- グローバル通貨と金融インフラを公共財として統治
- 既存通貨と共存することが目標

### マイルストーン
- 20190618 公式サイト、ホワイトペーパー、テストネット公開
- 2020年前半にメインネットリリース
- 2025年までにパブリックチェーンとして公開することを予定

### ユースケース
- 銀行を持たない人々（世界人口の31%）に金融サービスを提供
- WhatsApp,　Messengerで利用可能
- 海外で働く人が祖国の家族に簡単に送金


# リザーブの仕組み
> https://libra.org/ja-JP/about-currency-reserve/#the_reserve

### 資金源
1. 投資トークンの投資家（私募）
2. Libraユーザー(ユーザーは、法定通貨と等価のLibraを購入してリザーブする)

### インセンティブ
- 創立者
    - 協会が創立者へのインセンティブをLibraコインで支払う
- ユーザー
    - ユーザーはリザーブからの利益を受け取らない
- Libra
    - LIbraはリザーブを資産運用し、利子を生み出す
    - 利子は運営費用（エコシステムの拡大、NGOへの助成、エンジニアへの資金提供）に利用される
- 裏付け資産
    - 安定して信用のある中央銀行が発行する通貨や公債
    - 法定通貨のバスケットに結び付けられる
- リザーブの管理
    - 協会に認定された再販業者のみが大量の法定通貨とLibraをリザーブに出し入れできる
    - 認定再販業者は、ユーザーを相手に暗号通貨を売買する取引所やその他の期間と統合
    - 現金とLibraの交換を希望するユーザーは認定再販業者を利用
- コインの発行と焼却
    - 認定再販業者からの需要に応じてのみ行われる
    - 協会の価格調整についてユーザーが懸念する必要はない
- 取引所への上場
    - 電子取引所への上場を促進 
    - 主な暗号通貨交換業者や金融機関が認定再販業者として取引する（話し合い中）
- ポリシー
    - バスケット内の中央銀行のポリシーを継承
    - Libraの利用方法

### 購入方法

- Libraを取り扱う取引所で購入
- Libraブロックチェーン を基盤とするアプリケーション（デジタルウォレット・その他の金融商品・金融サービス）で購入


#Libra協会
- 独立、非営利、メンバー制
- 本部：スイスのジュネーブ


### 創立者

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206241/e6b5c5f4-c27a-da77-6aba-ce529c576462.png)

- 決済:Mastercard, PayPal, PayU (Naspers' fintech arm), Stripe, Visa

- テクノロジー・マーケットプレイス:Booking Holdings, eBay, Facebook/Calibra, Farfetch, Lyft, Mercado Pago, Spotify AB, Uber Technologies, Inc.

- 電気通信:Iliad, Vodafone Group

- ブロックチェーン:Anchorage, Bison Trails, Coinbase, Inc., Xapo Holdings Limited

- ベンチャーキャピタル:Andreessen Horowitz, Breakthrough Initiatives, Ribbit Capital, Thrive Capital, Union Square Ventures

- 非営利組織、多国間組織、学術機関:Creative Destruction Lab, Kiva, Mercy Corps, Women's World Banking



# 2020年までの課題
- APIとライブラリの文書化
- プロトコルのテストから、ウォレットや取引所と連携したフルスケールテストまでの実施
- 地理的に分散調査された管理者からなるリザーブのグローバル管理機関を設立
- Libra協会評議会を約100の多様なメンバーへ拡大


---
以上、ざっと一通り概要をまとめました。
次は技術解説ページ　https://developers.libra.org/
をまとめる予定です。
layoutメソッドについてまとめる！

## layoutメソッドとは？？？
コントローラによってヘッダーやフッターのデザインを変更したり、読み込むCSSを切り替えるメソッド！

実際のコードを見ながら、具体的に解説していきます！

## layoutメソッドを使用する場合としない場合を比較する！

```ruby:tweets.controller.rb
class TweetsController < ApplicationController
  layout 'hogehoge'

  def index
    @tweets = Tweet.includes(:user)
  end
end
```

###### ○上記のコードの場合
tweetsコントローラのアクションが呼び出された際の、レイアウトファイルとして***app/views/layouts/hogehoge.html***が使われるようになる！

##### ○上記のコードからlayout 'hogehoge'を抜いた場合
tweetsコントローラのアクションが呼び出された際の、レイアウトファイルとして***app/views/layouts/application.html***が読み込まれる!

---

とてもシンプルで、使い勝手も良さそうです！

何か質問等ございましたら、コメントお気軽にしてください！

ご静聴ありがとうございました！:relaxed:
GitLab CEをCentOS 7にインストールし、Apacheを使ってrelative URLで運用する

今回はGitLabを使ったシステムを構築するためのテストとして、テストサーバーにGitLab CEをインストールし、サブディレクトリで運用する方法を記録したいと思います。

恐らく実装方法がいくつかあって作業に手間取ったところがあるので、私がやったことをまとめたいと思います。

# 前提

CentOS 7で現在Apache 2.4.6を使って運用しているWebサーバー(hoge.com)にgitlab-ce 11.11.3をインストールします。
現在hoge.comにはコンテンツが多数あり、DNSでのCNAME登録が自分の手では出来ないので、サブディレクトリ(/gitlab)で呼べるようにしたいです。つまり、

```
http://www.hoge.com/gitlab
```
でGitLabに飛べるようにしたいです(今回はHTTPSではなくHTTPでやることにします)。
GitLabではデフォルトではnginxを使うのですが、今回ではnginxをOffにして、Apacheから動かすようにします。

# GitLab CE本体のインストール
[こちら](https://qiita.com/silverskyvicto/items/bfe12d42c7d6b2f25d64)を参考に、Community Editionをインストールします。
([公式のinstallation guide](https://about.gitlab.com/install/#centos-7)の通りにやったら間違ってEnterprise Editionをインストールしてしまいましたのでご注意ください。Community Editionはgitlab-eeをgitlab-ceに置換すれば良いです)
また、SSH, firewall, postfixの設定は既に行っていたので割愛します。

```
# curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash
# EXTERNAL_URL="http://www.hoge.com/gitlab" yum install -y gitlab-ce 
```

# relative URLで利用するための準備

[GitLabのconfiguration optionsのDocs](https://docs.gitlab.com/omnibus/settings/configuration.html#configuring-a-relative-url-for-gitlab)
を参考にします。(これはオプションのようですが)次を実行します。

```
# gitlab-ctl stop unicorn
# gitlab-ctl stop sidekiq
```
また、External URLはインストール時に指定したのでURLの設定自体はOKです。

# GitLab config fileの編集

元々このサーバーにはgitが入っていて、User名が干渉してしまったため、usernameを変えます。
そして、ここでnginxをdisableして、Apacheで運用するための設定も合わせて書きます。

```/etc/gitlab/gitlab.rb
user['username'] = "gitlab"
user['group'] = "git"

gitlab_workhorse['enable'] = true
gitlab_workhorse['listen_network'] = "tcp"
gitlab_workhorse['listen_umask'] = 000
gitlab_workhorse['listen_addr'] = "127.0.0.1:8181"
gitlab_workhorse['auth_backend'] = "http://localhost:8080"
nginx['enable'] = false
```
編集し終えたら、GitLabの再構築・再起動を行います。

```
# gitlab-ctl reconfigure
# gitlab-ctl restart
```

# Apacheの設定

[GitLabのRepositoryに、Apache 2.4でHTTP運用するためのconf file](https://gitlab.com/gitlab-org/gitlab-recipes/blob/master/web-server/apache/gitlab-omnibus-apache24.conf)が落ちているのでこれを利用します。
また、relative URL用にちょこっと書き直します。

```/etc/httpd/conf.d/gitlab.conf
<VirtualHost *:80>
  ServerName www.hoge.com
  ServerSignature Off

  ProxyPreserveHost On

  AllowEncodedSlashes NoDecode

  <Location /gitlab>
    Require all granted

    ProxyPassReverse http://127.0.0.1:8181
    ProxyPassReverse http://www.hoge.com/gitlab

  RewriteEngine on

  RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f [OR]
  RewriteCond %{REQUEST_URI} ^/uploads/.*
  RewriteRule .* http://127.0.0.1:8181%{REQUEST_URI} [P,QSA,NE]

    </Location>
  DocumentRoot /opt/gitlab/embedded/service/gitlab-rails/public

  ErrorDocument 404 /404.html
  ErrorDocument 422 /422.html
  ErrorDocument 500 /500.html
  ErrorDocument 502 /502.html
  ErrorDocument 503 /503.html

  LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b" common_forwarded

  ErrorLog /var/log/httpd/error.log
  CustomLog /var/log/httpd/forwarded.log common_forwarded
  CustomLog /var/log/httpd/access.log combined env=!dontlog

</VirtualHost>
```
書き終えたら、Apacheの再起動をかけます。

```
# systemctl restart httpd.service
```

これで、`www.hoge.com/gitlab`にアクセスすると無事にGitLabが見えます。
JavaScriptで配列のフィルタリング

# 結論

[Array.prototype.filter()](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/filter)と上手く使えば良い。

## やりたいこと

連想配列でtitle、category_nameを検索したい文字列を部分一致でフィルタリングしたいとき。

```json
{
  "data": [
		{ "id": 1, "title": "hoge", "category_name": "fuga"},
		{ "id": 2, "title": "hogehoge", "category_name": "fugafuga" }
  ]
}
```

```js
const filterItems = json.filter(
    j => (j.title.indexOf('検索したい文字列') > -1) || (j.category_name.indexOf('検索したい文字列') > -1)
);
```

## その他

JavaScriptは[MDN](https://developer.mozilla.org/ja/)が充実しているのでこっちをちゃんと読もうな(自分へ向けて)
Pay.jpの仕組みについて！

こんにちは！
ここ最近、朝読書の習慣を復活させてから一日のスタートがとても気持ちが良いです！
オススメです:relaxed:

さてさて、

チーム開発において、payjpを利用した商品購入機能を実装したので、payjpの仕組みを言語化しつつ、アウトプットしていきます！

（実装の説明ではないので、お間違えなく！）

## Pay.jpとは？？？
一言で説明すると、クレジット決済代行サービスです！

（なんだが、難しそう...):frowning2:

そうでもないです！
Pay.jpは、Webサービスなどにクレジットカード決済機能を簡単に導入できるんです！

## 完成GIF

## ![ダウンロード.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438981/28e4bded-ef1d-6eaf-14bd-33e9ae832039.gif)

pay.jpには、実際に支払いが行われる本番運用の***「ライブモード」***と、購入しても実際の支払いは行われない***「テストモード」***があります！
動作確認をするためであったら、***「テストモード」***で実装されることをお勧めします！

## Pay.jpの仕組み

![20171108144326.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438981/c6955c5e-d1aa-1dd9-655e-24a86c5161c0.png)

こちらの図を見ながら会話形式で説明していきます！

(まずユーザーは、クレジットカードを登録し、その入力された情報が正しかった場合、カードトークンがPay.jpで生成されて返却されてくるのや！):older_man_tone3:

(うんうん、でもなんでカードトークンというものが必要なのですか？):frowning2:

(それはな、Pay.jpにおいては、このカードトークンを用いて、支払いを行うことができるからや！):older_man_tone3:

(ユーザーが何かを購入すると、その購入した商品の金額とトークンがPay.jpに送信されるんや！):older_man_tone3:

(すると、Pay.jp側は送られてきたトークンから、クレジットカード情報を特定して、決済を行うのや！):older_man_tone3:

(はぁ〜なるほど、カードトークンがないと購入決済が行われないということですね！):frowning2:

(そうじゃ！以上がPay.jpによるクレジットカード登録から購入するまでのおおよその流れとなる！):older_man_tone3:

(なるほど！仕組みとしてはとてもシンプルですね！):smiley:

(そうじゃ！しかしな、これだけだとユーザーの操作性が悪いんだよ...):older_man_tone3:

(んんん？どういうことでしょうか？):frowning2:

(というのも、Pay.jpのカードトークンはセキュリティの観点から1度しか使用することが出来なんだよ...):older_man_tone3:

(そうなると何が悪いのでしょうか...?):frowning2:

(つまり商品を購入して決済を行うたびに、クレジットカード情報を入力しなければならないってことだよ...):older_man_tone3:

(なるほど、よく購入されるユーザーからしたらとても手間がかかってしまって、効率が悪いですね、、、):frowning2:

(じゃが、解決策はある！顧客というものと紐づけをすることでそれを永続化することができるんだよ！):older_man_tone3:

(顧客ってなんぞですか？):frowning2:

(Pay.jp上に登録できるユーザーのこと！):older_man_tone3:

(顧客にはクレジットカードを紐づけすることが出来て、紐づけておくことで毎回クレジットカード情報を登録しなくても、顧客IDを指定するだけで支払いを行うことができるんや！):older_man_tone3:

(ほ〜、手間が一気に省けますね！):smiley:

(そう！だから顧客はしっかり活用していこう！これでPay.jpに関する仕組みの説明は終わり!):older_man_tone3:

(しかし、Pay.jpにはプランや定額課金といったいろんなオプションもあるから、そこらへんは機能をつけていく段階で必要がどうか見極めて、導入するか決めていこう！):older_man_tone3:

(はい！ありがとうございました！）:relaxed:

---

以上で解説は終わりとなります！

実装する前までは難しそうなイメージはありましたが、しっかりと仕組みを理解すればとてもシンプルですね！

人間って知らないものに対しては、怪しんだりとか嫌ったりする性質があるので、先入観で勝手に決めないでまずはしっかり触れてみたり、その物事をしっかり理解することが大切だと思います！

それでは、ご静聴ありがとうございました！

---

> 引用: https://payjp.hatenablog.com/entry/2017/11/10/111841
Terraform入門その二（AWSのEC2作成）

[Terraform入門その一（インストール）](https://qiita.com/kenkono/items/86fb4544735d9cfad080)
Terraform入門その二（AWSのEC2作成）**[本記事]**
[Terraform入門その三（hello worldの表示）](https://qiita.com/kenkono/items/2fb65e7326f957315362)
[Terraform入門その四（AWSのELB&ASGの導入）](https://qiita.com/kenkono/items/1dc35586f908a6bd177c)

前回Terraformのインストール方法を記述しました。
続きまして、AWSのEC2インスタンスの作成方法を記述します。

# AWS側の設定
TerraformはAWS側のAPIを通じて、作業を行います。
そのため、事前にAWSユーザの`AWS_ACCESS_KEY_ID`と`AWS_SECRET_ACCESS_KEY`の情報を`~/.aws/credentials`に入力しておいてください。
`aws configure`コマンドで上記情報を登録できます。
参照：[AWS CLI の設定](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-chap-configure.html)

# terraformドキュメントの作成

`terraform`ディレクトリにて、`main.tf`を作成し、下記を記述します。

```main.tf
provider "aws" {
# "default"は.aws/credentialsの情報を読み込みます
  profile    = "default"
# 東京リージョンを設定
  region     = "ap-northeast-1"
}

# resource "インスタンスの作成" "名前"
resource "aws_instance" "example" {
    ami = "ami-04b2d1589ab1d972c"
    instance_type = "t2.micro"
}
```
`ami`の値は、EC2マネジメントコンソールで確認しています。
<img width="950" alt="Screen Shot 2019-06-19 at 12.10.59 PM.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/291139/3b2b15fa-7689-7c60-6b25-f9c87afa3053.png">

次にterraformの初期化を行います。

```
mbp:terraform mac$ terraform init
```

準備が整いました。下記コマンドでEC2インスタンス作成を実行します。
途中の選択肢には`yes`と入力してください。

```
mbp:terraform mac$　terraform apply
```
EC2のマネジメントコンソールでインスタンスの確認ができます。

# タグの追加

EC2インスタンスの個々を区別するためにタグを使用するかと思います。
この追加もterraformを使用すると簡単に実行することができます。

`main.tf`に以下を追加します。

```main.tf
# resource "インスタンスの作成" "名前"
resource "aws_instance" "example" {
    ami = "ami-04b2d1589ab1d972c"
    instance_type = "t2.micro"
# 追加分。tagのkey, valueを入力します
    tags = {
        Name = "terraform-example"
    }
}
```

あとはコマンドで下記を実行するのみです。

```
mbp:terraform mac$ terraform apply
```

下記記事にて、立ち上げたインスタンスに`apache`をインストールして`hello world`
をブラウザに表示させる設定を取り上げています。
[Terrafrom入門その三（hello worldの表示）](https://qiita.com/kenkono/items/2fb65e7326f957315362)

# 参照
[Build Infrastructure](https://learn.hashicorp.com/terraform/getting-started/build)
【React】Functional ComponentにStateを持たせる方法【FC】

# TL;DL
ReactのFunctional ComponentにStateを持たせる方法がスマートだったので紹介します。
Class Componentに存在していた`constructor`だの`this`だの、鬱陶しいコードが不要になります。
公式ドキュメントに詳しく書かれています。
https://ja.reactjs.org/docs/hooks-state.html

# コードと解説
公式ドキュメントから持ってきたコードを用いて解説します。

```tsx
function Example() {
  // countというstateを定義します。
  // 値を更新する場合はsetCount関数を使います。
  // 例えば、countの値を3にする場合setCount(3)と書きます。
  const [count, setCount] = useState(0);

  return (
    <div>
      <p>You clicked {count} times</p>
      {/* 
　　　　　クリックされたときにsetCount(count+1)が
　　　　　実行されるように関数が渡されています。
　　　*/}
      <button onClick={() => setCount(count + 1)}>
        Click me
      </button>
    </div>
  );
}

```

`useState`は型の指定や、初期値の指定ができます。

```tsx
// textはstring型になります。
// 初期値は"abc"になります。
const [text, setText] = useState<string>("abc");
```


# 参考
https://ja.reactjs.org/docs/hooks-state.html
SQLAlchemy で Lost connection を抑止

ググると古い情報しか出ないのでメモ。[Dealing with Disconnects](https://docs.sqlalchemy.org/en/13/core/pooling.html#dealing-with-disconnects) に対策が書いてある。

SQLAlchemy の create_engine で作った Engine は標準で Connection Pool が有効なので、DB 接続を使い回すようなっている。ただ、このままだと再利用しようと思った接続が勝手に切れていたり、DB が再起動した場合に次回 SQL を発行した時に Lost connection エラーになる事がある。例えば長時間アクセスしなかった DB にアクセスすると、エラーが発生する。この抑止方法として二つの方法が紹介されている。

* 悲観的な切断検出は、DB 接続を利用する前にかならず "SELECT 1" などの簡単な SQL を発行して接続を確認する。実装方法は `create_engine` に `pool_pre_ping` 引数を渡すだけなので簡単だが、ちょっとオーバーヘッドがある。
* 楽観的な切断検出は、DB に接続する時にエラーが出たら一度だけリトライを行う(?)というもの。SQLAlchemy は切断を検知すると自動的に再接続を行う。という事だと思うけど、いまいちコードサンプルの意図が分からず自信が無い。
Clojure：Quilでアニメーションデモを動かす

# Quilのデモを動かしてみよう（自分用メモ）

環境
iMac (27-inch, Mid 2011)
macOS Sierra

Clojure環境はすでに導入されているとする。参考↓
https://qiita.com/FumiIwase/items/228a9c8dfdfbcde02d92

以下の内容は、次のサイトの引用である。
https://github.com/quil/quil/wiki/Installing

まずはデモを動かすためのディレクトリを作り、そのディレクトリに移動。

```
$ mkdir demo
$ cd demo
```

デモのデータをダウンロード

```
$ lein new quil my-art
$ cd my-art
```

nREPLを起動

```
$ lein repl
```

nREPLサーバーが起動したら、

```
user=> (use 'my-art.core :reload-all true)
```

色が変わりながらくるくる回る円が描かれる。

ソースは
demo/my-art/src/my_art/core.clj
なので、これを編集すれば自由に作り変えることができる。
例えば、18行目の

:angle (+ (:angle state) 0.1)})

の0.1を0.3にすれば３倍の速さで回転する。

# Webページに使いたいとき
Clojure Scriptを利用する。

こちらも簡単。

```
$ mkdir my-sketch
$ cd my-sketch/
```

```
$ lein new quil-cljs my-sketch
```

```
$ cd my-sketch/
$ lein cljsbuild once
```

これで
my-sketch/my-sketch/resources/public
に
index.html
が出力される。
あとはウェブブラウザでこのファイルを実行する。
[JS]WEBアプリ等のショートカット機能実装に、「shortcuts.js」がめっちゃ軽快で使いやすい件

# はじめに：　codepenで実行できないので注意
今回のコードは、なぜかcodepenでは実行できませんでした。
外部ファイル読み込みも設定してみたのですが、どうもうまくshortcuts.jsを読んでくれない様子。
おかげで、動作確認にえらく時間かけちゃいました。

やや手間ですが、ローカル環境に直接ファイルを作成して、ローカル環境で試すと詰まることなく動作確認できるかと思います。
ご注意ください。

# 今回のコード
```html:index.html
<!DOCTYPE html>
<html lang="ja">
<head>
	<meta charset="utf-8">
	<title>shortcuts.jsのサンプル</title>
</head>
<body>
	<script src="js/shortcuts.js"></script>
	 <!-- ライブラリについては一番下を参照してください -->
	<script src="js/main.js"></script>
</body>
</html>
```

```javascript:js/main.js
shortcut.add("a",function() {
	alert("「a」を検知しました！");
});
```

```javascript:js/shortcuts.js(ライブラリのコードそのもの)
// 省略 (一番下に詳細書いてます）
```

# 実行してみると…
![スクリーンショット 2019-06-19 13.49.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330623/1cad1033-b49e-8786-3f21-1acb9b16d019.png)
無事、アラート画面が出ました。
もちろん、「F1」だけでなく、「Alt + a」や「Shift + Ctrl + z」、「meta(macなら⌘、windowsなら⊞に該当) + q」などにも対応している。

# コード解説
```html:index.html
<!DOCTYPE html>
<html lang="ja">
<head>
	<meta charset="utf-8">
	<title>shortcuts.jsのサンプル</title>
</head>
<body>
	<script src="js/shortcut.js"></script> <!-- ライブラリ -->
	<script src="js/main.js"></script>
</body>
</html>
```
いつも通りのHTMLです。
bodyタグ内に、外部ファイルとしてJSファイルを読み込んでいます。
ちなみに、
`<script src="js/shortcut.js"></script>`←ここは、
`<script src="http://www.openjs.com/scripts/events/keyboard_shortcuts/shortcut.js"></script>`←これでも問題なく実行できました。

```javascript:js/main.js
shortcut.add("a",function() {
	alert("「a」を検知しました！");
});
```
メインのJSです。
shortcut.addでショートカットを追加しています。
`"a"`この中を触ることで、ショートカットを割り当てるキーを変更できます。複数の場合は、`"alt+a"`という感じで設定してください。
`function(){}`この中で、行いたい処理を書きます。
解説がいらないほど、わかりやすい形ですね。

```javascript:js/shortcuts.js(ライブラリのコードそのもの)
// 省略
```
ライブラリ本体です。
ここでは省略しましたが、200行ぐらいしかない小さいファイルです。
6KBってすごい。笑
 この[公式ページ](http://www.openjs.com/scripts/events/keyboard_shortcuts/shortcut.js)のソースを丸々コピペしただけなので、動作確認の際はことらからどうぞ。


以上です。
ありがとうございました。

参考サイト：http://www.openjs.com/scripts/events/keyboard_shortcuts/index.php
Swiftの参考サイト

# Apple Developer Documentation
* [Apple公式ドキュメントサイト](https://developer.apple.com/documentation/)
* [Apple公式ドキュメントサイト(日本語)](https://developer.apple.com/jp/documentation/)

# Apple Developer Forum
* [Apple公式フォーラム](https://forums.developer.apple.com/welcome)

# Stack Overflow
* [日本語サイト](https://ja.stackoverflow.com/)
* [英語サイト](https://stackoverflow.com/)