OmniAICreator/Qiita-1.07M huggingface dataset:
PubSub の SubscriptionとNestedValueProviderの挙動


template作ってるときにぶち当たる。

```java
Pipeline pipeline = Pipeline.create(options);
CoderRegistry coderRegistry = pipeline.getCoderRegistry();
coderRegistry.registerCoderForType(CODER.getEncodedTypeDescriptor(), CODER);

String[] targets = options.getTargets().split(",",0);
for (String target: targets){
    ValueProvider<String> subscription = ValueProvider.NestedValueProvider.of(
               options.getInputSubscriptionPrefix(),
               (SerializableFunction<String, String>) input -> input + "-" + target);
    PCollection<PubsubMessage> messages =
                pipeline.apply(
                        "ReadPubSubSubscription" + targetAction,
                        PubsubIO.readMessagesWithAttributes()
                                .fromSubscription(subscription));
    ...
}
```
runtimeにOptionの値をsplitして動的にグラフ作るみたいなことは出来ないので、templateのコンパイル時にTargetsは渡している。

runtimeValueProviderのinputSubscriptionPrefixに"projects/hoge/subscription/fuga-piyp"みたいに食わせると、以下のエラー。

```

Workflow failed. Causes: The pubsub configuration contains errors: Subscription 'projects/hoge/subscriptions/fuga-piyo' is consumed by multiple stages, this will result in undefined behavior.
```

job graphを作るときに変なvalidationが動いている様子。SerializableFunctionでsuffixつけたものが渡されるはずなんだけど、executionの前ステージで何かが起きている。

beam sdkのPubSubIO周りのコード見てもわからんのでrunnerから呼ばれるgraph constructionのタイミングでvalidationしてるんだろうな。fromSubscriptionのタイミングでNestedValueProviderの値ではなく元のValueProviderの値でチェックしているとしか思えない。

bqに突っ込むだけなので一個のtopicでDynamicDestinations使えばよいという話はある。jsonのフィールドで振り分けができるようにはしているけど、流量に差があるのでtopic分けときたいんだよなぁ。

まぁ動かすだけならtemplateじゃなくすれば動くんだけど。
いい感じにsplitしたい

BEFORE.txtをN個に分割したい。行の途中では分割して欲しくない。拡張子は維持したい。

```
N=3
split -d -nl/$N BEFORE.txt --additional-suffix=.txt AFTER.
```

これで

```
AFTER.01.txt
AFTER.02.txt
AFTER.03.txt
```

となる
AWS WorkSpacesでmacからのキーボード操作ができない

突然リーダーから「ちょっと本番環境見てくれや〜」って言われて、
いつも通りWorkSpacesにログインしたもののキーボードが反応せず大変困ったので備忘録を。


# 環境
MacBook Pro (Retina, 15-inch, Mid 2015)
macOS Catalina バージョン 10.15 Beta
Amazon WorkSpaces Version 2.5.9.1186

# これのおかげ
<img width="754" alt="06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225215/1ca58a1b-7255-6529-a69a-2c6468002761.png">

https://forums.aws.amazon.com/thread.jspa?threadID=278583

# 対処法
システム環境設定からセキュリティとプライバシーを選択
<img width="663" alt="01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225215/315e8765-2448-c00e-09ea-4054b7a24825.png">

アクセシビリティ > プライバシーを選択
<img width="664" alt="02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225215/efdeccf8-3994-9e56-2e6c-61ba407eaabf.png">

Amazon WorkSpacesを一度削除
<img width="665" alt="03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225215/1a75da1a-de23-74b9-61a8-514bfd7a66ed.png">

Amazon WorkSpacesを追加
<img width="665" alt="04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225215/557b8e65-82fc-2f1b-4b91-ad43cdf8d6bc.png">
<img width="797" alt="05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225215/81ffa771-cd23-24ce-6d86-eeb792493d1d.png">

WorkSpaceを起動してログイン。
キーボードで入力できるようになっていた！！

突然キーボードが反応しなくなるのは辛い
同僚のPCから確認し、なんとか依頼は完了させました。


# 参考
https://forums.aws.amazon.com/thread.jspa?threadID=278583
Ruby のメソッド定義で引数が「*」だけの場合

OSSライブラリのドキュメントを見ていると以下のようなコードがありました。

```ruby
def initialize(*)
  super
  # 以下、何らかのコード
end
```

この `*` が文法的にどういう意味なのか気になったので調べました。

## 結論

任意の引数を受け取るが、特にコード内では参照しない(無視する)という意味になるようです。

## 例

```ruby
class Foo
  def bar(*)
    "bar"
  end

  def baz
    "baz"
  end
end

Foo.new.bar("foo", 1, [2]) # => エラーにならない
Foo.new.baz("foo", 1, [2]) # => ArgumentError が発生
```

メソッド内で `super` を呼び出すと、親クラスのメソッドに指定された引数をそのまま渡します。
指定された引数の個数が、親クラスのメソッド定義の引数の個数と異なる場合、 `ArgumentError` が発生します。

```ruby
class Parent
  def hello(name)
    "Hello #{name}!"
  end
end

class Child < Parent
  def hello(*)
    super
  end
end

Child.new.hello("World") # => "Hello World!"
Child.new.hello # => ArgumentError
Child.new.hello(1, 2) # => ArgumentError
```

## 参考

リファレンスマニュアルには以下のように記載されています。
https://docs.ruby-lang.org/ja/latest/doc/spec=2fdef.html#method

```ruby
def bar(x, *) # 残りの引数を単に無視したいとき
  puts "#{x}"
end
bar(1)        #=> 1
bar(1, 2)     #=> 1
bar(1, 2, 3)  #=> 1
```
Excel PowerQuery Recordを展開する

# Queryを実行した結果が、Recordのリストで表示されたら
### こんな感じで表示されたら
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488029/8d836864-9f5d-dd64-e6c6-ded478b892e5.png)

### 一度、[テーブルへの変換]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488029/540462c1-aadf-1e3a-e398-e12b4c024ef9.png)

### そうすると、展開するボタンが現れるので押す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488029/86724962-c79c-f42f-9b44-2e640853ee50.png)

### 展開された
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488029/de7e2d14-6b29-2c15-56a5-dd01c0191313.png)

---
↓このサイトの開発時技術情報です。
[債券計算サイト](https://bondcalculator.azurewebsites.net/bond-calc-api)
Excel Power Query クエリ実行結果が新しいシートに表示される

# 既存のシートのこの部分に表示したいのに、新しいシートが作られる

### 指定した場所に表示させるには[閉じて次に読み込む...]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488029/de93d0d6-d79c-8f7a-611c-a529bca081cc.png)

[既存のワークシート]を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488029/9a8657ea-7aed-7edb-2422-c6f927d1dd59.png)

---
↓このサイトの開発時技術情報です。
[債券計算サイト](https://bondcalculator.azurewebsites.net/bond-calc-api)
.gitignoreの書き方。カレントディレクトリと特定ディレクトリ以下

# カレントディレクトリ（.gitignoreファイルが置いてあるディレクトリ）の書き方
× ./
〇 / （ドットは要らない）

# 特定ディレクトリ以下
× FolderA（フォルダのみの指定となって、ディレクトリより下がignoreの対象とならない）
〇 FloderA/

---
↓このサイトの開発時技術情報です。
[債券計算サイト](https://bondcalculator.azurewebsites.net/)
CSP(Content-Security-Policy) でインラインのCSSは許可したい

[Content-Security-Policy
](https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/Content-Security-Policy)

JavaScriptのみをはじきたかった。
インラインCSSは許可したい。

これだとインラインCSSもはじかれてしまう。

```php
header("Content-Security-Policy: default-src 'self';");
```

https://developer.mozilla.org/ja/docs/Glossary/Fetch_directive
>すべてのフェッチディレクティブは default-src で代替されます。 


script-src ディレクティブにのみ指定をする。

```php
header("Content-Security-Policy: script-src 'self';");
```

https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/Content-Security-Policy/script-src
> script-src ディレクティブは、 JavaScript の情報なソースを指定します。
[随時更新]超初心者がUnityで気を付けること

#プログラミング全般
・ちゃんとした変数名、関数名をつけよう。void Test()とかint countとか作っちゃだめだぞ

#GameObject関係
・GameObject.Findは重いから使わない(使っても精々Start、Awake系だけ)

#Transform関係
・transform.rotationは理解できるまで触らない
Quatanionは複雑な値なので、RotateやeulerAnglesを使おう

・scaleの比率を1:1:1以外にした上で回転させると予想外のことが起きやすい。やめとこう。

・transform.Findで参照できるのは直近の子供だけ
全ての子供を取りたい時はGetComponentsInChildren<T>()を使おう(Tは欲しいクラス。Transformも取れる)。ただし重い。

・子の中の、常に特定の物を取りたいなら、transform.GetChild()を使うとよい

#その他
別PCにプレハブを移動させたい時は、Assets/ExportPackageからパッケージにして持っていこう
スマートグラス「nreal light」のSDKをダウンロードしてみた（だけ）

# スマートグラス「nreal light」コンテンツを開発したい。

# XR技術を活用したスマートグラスが本格的に市場に出そうな気がする。

https://news.kddi.com/kddi/corporate/newsrelease/2019/05/31/3842.html

ということで、https://developer.nreal.ai/　でSDKをダウンロードして
コンテンツ開発していみたいと思う。

# まずはデベロッパー（　https://developer.nreal.ai/　）登録する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/303278/b3b42966-5860-d2d6-3f7d-c1d7ca177a03.png)

右上のアイコンでdeveloper登録。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/303278/10a2a562-8e9a-d604-7bea-b8dfe407d759.png)

次に、どんな目的に使いたいんだい？ということなので登録する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/303278/11b1bd88-17e1-b5f2-46fb-6cfdab4c1ab7.png)

プロジェクト（企画）があれば登録します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/303278/993a1bba-803e-035b-84f0-22cff8203fb0.png)

SDKをダウンロードします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/303278/02633feb-0907-a8d6-9269-bf7f7ba9d6d9.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/303278/2f6acc64-fc67-6562-2f0a-7e794d1c7f55.png)

ダウンロードできました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/303278/9a826af0-0714-37c4-b1a2-34e2adb25cf5.png)

とりあえずここまで。
Vue.jsさわってみました

今更ですがVue.jsを試してみました。
元々興味はあったのですが、なかなか重い腰が動かずで。。
今回触ってみてもっと深く勉強したいと思い、備忘のために記事にします。

## 試しに作ってみた

<p class="codepen" data-height="265" data-theme-id="0" data-default-tab="html,result" data-user="ricchan_k" data-slug-hash="jOOEKVM" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="jOOEKVM">
  <span>See the Pen <a href="https://codepen.io/ricchan_k/pen/jOOEKVM">
  jOOEKVM</a> by ricchan_k (<a href="https://codepen.io/ricchan_k">@ricchan_k</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>


入力文字数がオーバーすると隣にエラーメッセージが出る、簡単なお問い合わせフォームを作ってみました。
作り方について、以下に書いてきます。

## HTML側の記載

```html:
<body>
    <div id="vueSample"><!-- Vueで利用したい範囲をDOMで囲う -->
      <div>名前</div>
      <input v-model="name" placeholder="やまだ はなこ" /><!-- 入力フォームバインディングをv-modelで設定-->
      <span class="errorMessage">{{ validateName }}</span><!-- Vueから返却された値を表示する場所を宣言 -->

         ～　中略　～

      <button @click="sendInfo">送信</button><!-- クリックされたとき、sendInfoというイベントを発火させる -->
    </div>
<body>
```

#### 入力フォームバインディング？
↑の場合だと「v-model="name"」と宣言することで、テキストボックスの中の文字が変更されたらVue内のnameも自動的に更新され、逆にVue内のnameが更新されたらHTML側のテキストボックスも更新されるという仕組みになっています。

## Vue部分の記載

### Vueインスタンスの生成

```javascript
  new Vue({ // これ書くことでVueインスタンスが生成される
    el: '#vueSample', // Vueの利用する範囲をDOMで指定
    data: { //Vueで使うプロパティの初期値を宣言
      name: '',
      tel: '',
      toiawase: ''
    },
```

まずはVueインスタンスの作成や初期設定などを行っていきます。

### 算出プロパティの宣言

```javascript
    computed: { // 算出プロパティの宣言
      validateName: function () { // validateNameプロパティの宣言
        if(this.name.length > 10) { // nameが10文字を超えた場合
          return "名前は10文字以内で入力してください";
        }
      },

      ～　中略　～
    },

```

次に算出プロパティを宣言します。算出プロパティとは、処理に名前を付け、処理を変数のように扱うイメージです。↑の例だと、nameが10文字超えた場合、validateNameにエラーメッセージを設定するという算出プロパティを設定しています。

### イベントハンドラの設定

```javascript
    methods: {
      sendInfo: function() {
      	//送信ボタンが押されたらなにしようかな
      }
    }

```

何も処理書いていないですが、HTML側の「button @click="sendInfo" ～」のイベントが発火した場合になにするかを書きます。

## 使ってみて思ったこと
場合によってはjQueryで書いたほうがシンプルなのでは？という部分もありましたが、Vue.jsで書くことでよりシンプルに実現できたりして、フロントサイドの開発が楽しくなりました。
まだまだVue.jsで出来ることはありそうなので、今後も勉強を続けていきたいです。
Laravelマイグレーション備忘録

<h2>Laravelマイグレーションのあれやこれ</h2>

Laravelでマイグレーションファイルを作る時やmysqlでテーブルを作る時に困ったことや対処を、備忘録的な感じで載せておきます。
誰かの役に立ってたら嬉しいですね。

前提として、mysqlでデータベースが出来ている状態にあるとします。ごめんなさい。
わからない方はこちら。
https://qiita.com/yoshinyan/items/38bc4e4a02a66acead91<br><br><br>

◆マイグレーションファイルの作成
<img width="362" alt="スクリーンショット 2019-10-09 12.26.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431197/f129c37f-3034-032b-ee14-2b1f3056809c.png">

<b>/database/migrations</b> に先ほど作成したマイグレーションファイルができていると思います。
必要な情報をここに書き込みましょう。私はこんな感じです。
![スクリーンショット 2019-10-09 12.30.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431197/c141afdf-ddda-b60b-f26f-efeed8cad74d.png)

<b>users_table</b>と<b>posts_table</b>作ったところで、マイグレーションを実行します。

◆マイグレーション実行
<img width="236" alt="スクリーンショット 2019-10-09 12.33.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431197/cac1db41-d01b-2ff5-c207-b396562edb90.png">

ここでなんと、エラーメッセージがたくさんでます。
`No such file or directory`のエラーが出ています。
![スクリーンショット 2019-10-09 12.44.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431197/6a05ca79-70d6-c119-d6fa-53d6fab64980.png)

こんな時は、、、、。

●<b>/config/database.php</b> を見ましょう
![スクリーンショット 2019-10-09 15.06.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431197/5010f86e-0719-1f5d-e4b6-709eb9b7d502.png)


`database`＝作成したデータベース名
`username`＝root(じゃない人もいると思います)
`password`＝root(じゃない人もいると思います)
の部分を記入しましょう。

●<b>.envファイル</b> を見ましょう
![スクリーンショット 2019-10-09 15.01.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431197/e79b5b78-3c34-a28c-9123-d0d8c3ab5c49.png)

`DB_DATABASE`＝作成したデータベース名
`DB_USERNAME`＝root(じゃない人もいると思います)
`DB_PASSWORD`＝root(じゃない人もいると思います)

そして忘れちゃいけないのが以下のコマンド
<img width="243" alt="スクリーンショット 2019-10-09 15.04.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431197/07eede48-8577-43be-ecb5-d7501083745b.png">

<b>.envファイル</b> を編集したら、反映するためにこのコマンドを打ちましょう。

再度 `$ php artisan migrate` をしてみると、、、

![スクリーンショット 2019-10-09 15.06.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431197/40baeaf9-2c6b-762f-5b7a-d886ab17e6ef.png)

そんな時は、mysqlで

<img width="306" alt="スクリーンショット 2019-10-09 15.10.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431197/c1e0e619-5ae8-aeac-71ba-9551084e9016.png">

のコマンドを打つと、`Connection refused`のエラーが出ます。

![スクリーンショット 2019-10-09 15.11.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431197/2deaca23-0534-8881-bcaa-07d8e7e55fe1.png)

こんな表が出てくるので、`socket`と書かれた右の部分を`database.php`の
`unix_socket`のところに記入しましょう。

さあ、再度 `$ php artisan migrate` して見ましょう！今度こそ、、、、！！！！

![スクリーンショット 2019-10-09 15.15.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431197/62a0ba1f-6f32-e320-0177-41bfdf960415.png)

ついにやりました。テーブル作成出来ましたね。

と、こんな感じになります。
間違ってたらごめんなさい。
何かあれば、コメントお願いします。

◆参考・引用サイト
https://qiita.com/shosho/items/a5a5839735dfef9214b1
https://qiita.com/I-201/items/bfb4c216da196247e369
レストパラメータと分割代入で要らない引数を捨てる

# 不要な引数を捨てたい
たとえばこんな感じで、

```js
Array.from( Array(3), (x, i) => i ); // x は関数内で使わない。
```

コールバック関数などで、不要な引数を渡されるとき、どう書いてますか？

```js
Array.from( Array(3), (_, i) => i );
```

みたいな感じで、アンダースコアなどの変数名で受けて、使用しないことを示したりしますよね。

しかし、要らない引数が複数ある場合はどうでしょうか。

```js
hoge( (_, __, ___, i) => i );
```

同名の引数を定義することはできないので、アンダースコアが伸びていってしまったりしてかっこ悪いですよね。
あと、アンダースコアはlodashなどのライブラリとぶつかるので、安易に使いたくない場面もあるでしょう。

# レストパラメータと分割代入で引数を捨てる
そこで、レストパラメータと分割代入を使うとこのように書けます。

```js
hoge( (...[ , , , i]) => i );
```

不要の変数を登場させなくてよいので、その点でメリットがありますが、可読性の点でちょっと疑問がありますかね……？


# 参考
[Rest parameters - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Functions/rest_parameters)
[分割代入 - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment)
Kaggleをやろう！

<p>
couseraをやってみた</p>

description
会社の情報とかが載っている

evaluation
ターゲットとなる指標について紹介がなされている

prizes
賞金について書いてあるよ

timeline
いつコンペティションが始まったや、deadlineについての情報が書いてあるよ


# {記事タイトル}

## はじめに

## 開発環境

## セットアップ

## 使い方

## デモ

## 終わりに
macOSのlocalhostへParallels(Windows 10)内のブラウザからアクセスする方法(webpack-dev-serverの場合)

## バージョン

- Parallels Desktop 15


## 共通手順

1. 開発用サーバーのIPアドレスを`0.0.0.0`に固定する
2. ParallesのWindows10`構成>ハードウェア>ネットワーク`のソースを`共有ネットワーク(推奨)`に設定
3. macのターミナルで`ifconfig`と入力し、`vnic0`の項目でinetの隣の値をコピー(大抵は`10.211.55.2`)
4. Windows 10よりブラウザで`http://10.211.55.2:[ポート番号] `へアクセス



## webpack-dev-serverの設定

以下の設定でIPアドレスを設定。

```webpack.config.js

module.exports = {

//中略

devServer: {
	host:'0.0.0.0',
	disableHostCheck: true
}

//中略

};
```



またはnpm scriptsに以下のように書いても同じ。

```bash
webpack-dev-server --host 0.0.0.0 --disable-host-check
```



## ブラウザでIPアドレスを入力する手間を省く設定

1. Windows 10のメモ帳を`管理者権限`で開く
2. `ファイル>開く`から`System32>drivers>etc>hosts.`を開く(`すべてのファイル`に切り替えておく)
3. ifconfigでコピーしたアドレスを貼り付けて隣に適当なドメインを書く(localhost.macなど)

```hosts.
10.211.55.2 localhost.mac
```


## 参考記事

- [Accessing macOS localhost from Parallels Desktop IE or Edge](https://gist.github.com/ernsheong/23c00e65219b10db7bc072772ea509d4)
- [Accessing macOS localhost from Parallels Windows 10 – Paul Park](https://paulpark.io/accessing-mac-localhost-from-parallels-windows-10/)
- [accessing localhost \| Parallels Forums](https://forum.parallels.com/threads/accessing-localhost.258362/)
- [DevServer \| webpack](https://webpack.js.org/configuration/dev-server/)
- [webpack\-dev\-serverで起動したアプリが「Invalid Host header」と表示される場合の対処法 \- Qiita](https://qiita.com/yutasuzuki0206/items/542390f7a046772262fe)
【Azure】無料でJava アプリを作成してみた〜FTPで接続 編〜【初心者】

# 概要

この記事ではAzureの「App Service」を使用して、
前回[【Azure】無料でJava アプリを作成してみた〜Web App作成 編〜【初心者】](https://qiita.com/namari/items/c88d965d47677524d7e4)で作成した、
WebアプリにFTPで接続してTOPの文言変更します:bangbang::ghost:


Azure サブスクリプションをお持ちでない場合は、
開始する前に[無料アカウント](https://azure.microsoft.com/ja-jp/free/)を作成してください。

## 【Azure】無料でJava アプリを作成してみた

[【Azure】無料でJava アプリを作成してみた〜Web App作成 編〜【初心者】](https://qiita.com/namari/items/c88d965d47677524d7e4)
・「App Service」を使用して「java」Webアプリを作る
・TOPページに「Hello world！！」まで表示させる

**[【Azure】無料でJava アプリを作成してみた〜FTPで接続 編〜【初心者】](https://qiita.com/namari/items/d5ce80f9704e2e25ca44)**:point_left_tone1: 今ここ:bangbang:
・前回作成した「java」WebアプリにFTPで接続する
・TOPページの「Hello world！！」を変更する

〜　次回以降の予定　〜
【Azure】無料でJava アプリを作成してみた〜Git 編〜【初心者】
【Azure】無料でJava アプリを作成してみた〜SQL Server 編〜【初心者】


# FTPで接続する
## FTP情報を取得する

- ブラウザーで[ポータル](https://portal.azure.com/)を開く

- **[ホーム] > [App Service]**でFTPで接続したいアプリを選択する<br>※ 今回は記事は、前回作成した「namari-sampleWebApp-java」を使用していく。

- **[概要]**にある**[URL]**に飛びサイトが表示されているか確認する。（現状の状態を確認！）

- **[デプロイ センター]**を選択し、**[Manual Deployment (push / sync)] > [FTP]**を選択すると下に**[ダッシュボード]**が表示されすのでそれをクリックする

- 表示されている情報をFTPに入力して接続する（今回はAtomで接続します）<br>※ **[ユーザーの資格情報]**を設定している場合は、設定したユーザー名・パスワードを使用することも可能

![Screenshot_2019-10-09 Microsoft Azure.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197404/e66ebdf5-c54e-d7bd-27a3-d0aba78124a9.png)

**- サンプル -**

||FTP情報|接続できない場合<br>（Atom...etc）|
|:--|:--|:--|:--|
|FTPS エンドポイント(ホスト)|ftps://waws-prod-dm1-161.ftp.azurewebsites.windows.net/site/wwwroot|waws-prod-dm1-161.ftp.azurewebsites.windows.net|
|ユーザー名|namari-sampleWebApp-java\$namari-sampleWebApp-java|namari-sampleWebApp-java|
|パスワード|●●●●●●●●●●|●●●●●●●●●●|
|ポート|21|21|




## TOPページの内容を変更する（接続確認）

- TOPページの文言を「Hello world！！」→「FTP!OK!」に変更する。<br>
※ 前回作成したアプリだと編集するファイルは、<br>
``/site/wwwroot/webapps/ROOT/index.jsp``になる
- 文言が変更されているかサイトを確認する(https://< appName >.azurewebsites.net/)

- 変更されていたらOK！！

**！！！　完了　！！！**

# 関連記事

- [【Azure】無料でJava アプリを作成してみた〜Web App作成 編〜【初心者】](https://qiita.com/namari/items/c88d965d47677524d7e4)
- [【Azure】無料でJava アプリを作成してみた〜FTPで接続 編〜【初心者】](https://qiita.com/namari/items/d5ce80f9704e2e25ca44)
- 【Azure】無料でJava アプリを作成してみた〜Git 編〜【初心者】
- 【Azure】無料でJava アプリを作成してみた〜SQL Server 編〜【初心者】
Comboことはじめ

# Comboの概要
ベイズ最適化ライブラリ
[tsudalab/combo: COMmon Bayesian Optimization](https://github.com/tsudalab/combo)

# インストール
`README.md`にある通り

```bash
git clone https://github.com/tsudalab/combo.git
cd combo
python setup.py install
```

でインストールできる。

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

###  `import combo`のときに`ImportError: No module named enhance_gauss`なるエラーが出る
例えば以下のエラーが出た時。

```
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "combo/__init__.py", line 1, in <module>
    import gp
  File "combo/gp/__init__.py", line 1, in <module>
    import cov
  File "combo/gp/cov/__init__.py", line 1, in <module>
    from gauss import gauss
  File "combo/gp/cov/gauss.py", line 5, in <module>
    from _src.enhance_gauss import grad_width64
ImportError: No module named enhance_gauss
```

comboをgit clone したディレクトリでpythonを立ち上げて`import combo`すると、このエラーが出る。
他のディレクトリに移って試して見て問題がなければOK。

### `import combo`のときに`ImportError: No module named six`なるエラーが出る

`README.md`では、numpy, scipy, Cythonが要求ライブラリとして記載されているが、実はsixも必要。
sixが無いときは、importした時にその旨エラーが出るので`pip install six`で解決する。
Rubyで[ ]（カギ括弧）メソッドを定義する

Array型やHash型などのインスタンス変数の要素を `[添字]` の記法で取得するためには[]メソッドを定義します。

以下のようにメソッド名を`[]`で定義すると、添字に指定した値が引数として渡されます。

```ruby
def [](引数名)
end
```

使用例

```ruby
class ConfigModel
  attr_reader :config

  def initialize
    @config = {host: "127.0.0.1", port: 3000}
  end

  def [](key)
    @config[key]
  end
end

config = ConfigModel.new
puts config[:host]
puts config[:port]
```

出力結果

```bash
127.0.0.1
3000
```
nmapのよく使うコマンド

#指定したIPの使用ポートを調べる
```
nmap 192.168.0.1
```
# 指定したネットワークの使用されているIPを一覧にする
```
nmap -sP 192.168.1.*
```
# 指定IPのOSを確認
```
nmap -A 192.168.0.5
```
ScalaでSpigotのプラグインを開発できるようになるまで

SBTでプロジェクトを作成して、ScalaでSpigotのプラグインを開発できるようにするまでをやっていきます。

# 開発環境
- IntelliJ IDEA w/ Scala Plugin
- Windows 10
- sbt 1.3.2

# プロジェクト作成

IntelliJ IDEAを使っていますが、sbtと適当なテキストエディタのみでも可能だと思います。

### sbtのプロジェクトを作成する
IntelliJ IDEAを起動し、Scalaのプラグインが導入済みであれば、新規プロジェクトのScalaの中にsbtがあると思うので、そこから作成します。

### パッケージの依存関係を追加
`build.sbt` に下記を追加。

```scala
resolvers += "spigot-repo" at "https://hub.spigotmc.org/nexus/content/repositories/snapshots/"
resolvers += "bungeecord-repo" at "https://oss.sonatype.org/content/repositories/snapshots"
resolvers += Resolver.jcenterRepo
resolvers += Resolver.bintrayIvyRepo("com.eed3si9n", "sbt-plugins")
libraryDependencies += "org.spigotmc" % "spigot-api" % "1.14.4-R0.1-SNAPSHOT"
```

### Fat Jarを出力するためにプラグインを追加する
Fat Jarを吐くために[sbt/sbt-assembly](https://github.com/sbt/sbt-assembly)を追加します。
`project/plugins.sbt` を作成し、下記を追加。

```scala
addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.14.10")
```

### メインとなるクラスを作成

`src/main/scala/` にパッケージと同じようになるようディレクトリを生成してクラスを追加します。

`package com.example.plugin` なら `src/main/scala/com.example.plugin/ExamplePlugin.scala` とかにする。

作成したメインクラスに下記を追加。

```scala
import org.bukkit.plugin.java.JavaPlugin

class ExamplePlugin extends JavaPlugin {
  override def onEnable(): Unit = {
    super.onEnable()
    getLogger.info("hello world")
  }
}
```

### plugin.ymlを追加

`src/main/resources/plugin.yml` を作成し、編集します。
[Plugin.yml | Spigot MC](https://www.spigotmc.org/wiki/plugin-yml/)を参考に書くといいです。

例

```yaml
name: ExamplePlugin
version: 1.0.0
main: com.example.plugin.ExamplePlugin
api-version: 1.14
```
mainにはJavaPluginを継承したクラスのパスを記述してください。

# Jarを吐いてみる

一通り終わったら、sbt shellを起動し、 `assembly` を実行する。問題なく通れば `target/scala-x.y/` にFat Jarが出力されます。

Spigotサーバにpluginを配置してロードすると、このプラグインが有効になった際に `hello world` とログ出力されたら成功です。


# 所感
今回の成果物はこちら([ekuinox/spigot-login-alert](https://github.com/ekuinox/spigot-login-alert))です。サーバのログインイベントをDiscordのWebhookに投げています。

要はJavaで書かれたパッケージを利用してFat Jarを吐いただけなので、当たり前なのですがScalaをやった感覚はあまりなく、sbtの設定に時間を費やしたのみでした。

KotlinでSpigotを開発する記事はあったのですが、Scalaだと見つからなかったので、Scalaの勉強がてらにやってみようと思いメモを残すことにしました。

参考: [2017年のMinecraftプラグイン開発はKotlinで決まり！Kotlin導入方法！](https://qiita.com/ReyADayer/items/ca3f42dbb5b59d150f7e)
Excel操作入門　ドロップダウンリスト

Excelでドロップダウンリストをしようして選択形式でデータを入力したい場合は
まず下の画像のようにドロップダウンリストを使用したい範囲を選択します。
![スクリーンショット 2019-10-09 13.34.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507713/ddccef20-ebe3-67b0-5fb4-27c08e6bc60c.png)

そしてリボンからデータタブをクリックし、データツールグループのデータの入力規則をクリックします。
![スクリーンショット 2019-10-09 14.09.19_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507713/c4de737a-a892-f1bb-743b-2d61f8e1eb57.jpeg)

データの入力規則画面の設定タブの入力値の種類のドロップダウンリストのリストを選択します。
![スクリーンショット 2019-10-09 14.13.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507713/8e991025-e9e3-9526-8f61-df89375ab1d3.png)

元の値の右側にある上矢印ボタンをクリックします。
![スクリーンショット 2019-10-09 14.13.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507713/4c94e6be-500b-66df-026f-d6d18389d5ed.png)

ドロップダウンリストの項目に使用したい範囲を指定して右側の下矢印ボタンをクリックします。
![スクリーンショット 2019-10-09 14.13.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507713/5de491e2-46eb-8065-fb1a-1b3fb9437e49.png)

元の値の空欄だった場所に指定したい範囲が入っていることを確認したらOKボタンをクリックします。
![スクリーンショット 2019-10-09 14.14.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507713/1bc32212-5c67-f2ce-fdb6-320dde794e70.png)

無事ドロップダウンリスト作成完成です。
![スクリーンショット 2019-10-09 14.14.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507713/7611473e-1992-e958-b032-7e143445b4e9.png)
CSS z-indexの使用

<img width="390" alt="22ee0fde90db24b73255b249e9a14407.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442974/247dc203-535c-b283-16bb-56d1598dee50.png">


z-index:数字で指定した値が大きい要素ほど上に表示されます。数字には整数を入れます。

 
  class="one">1番目
  class="two">2番目
  class="three">3番目


.one  {
  z-index: 10;
  left: 10;
  top: 10;
}
.two {
  z-index: 20;
  left: 20px;
  top: 20px;
}
.three {
  z-index: 30;
  left: 30px;
  top: 30px;
}
![-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442974/f6a73ffa-f81d-e1c3-1e96-642ccf536b7d.png)
【備忘録】Windows10とUbuntu 18.04.3 LTSを別のディスクにインストールし、GRUBで選択できるようにした話

# はじめに
・これは筆者の備忘録です．記事に丁寧さはありませんので悪しからず．
# やったこと
・WindowsとUbuntuの両方を同じPCで使う．
・別々の記録媒体にインストールする．
・GRUBでWindowsとUbuntuを選択できるようにする．
・GRUBにおいて，普段使いであるWindowsのブートローダにカーソルを合わせるようにする．
・デュアルブート時に発生するWindowsの時刻のずれを解消．
# 構成
- マザーボード : MSI Z390 Gaming Plus
- CPU : Intel Corei7 9700k
- 記憶媒体① : Intel M.2 SSD 1TB Win10 64bitインストール済み
- 記憶媒体② Crucial SSD 500GB
- USBメモリ : 市販のやつ8GB（4Gくらいあれば十分？）

# 手順
### 1. BIOSの設定でFast BootとSecure BootをDisableにし，起動方法をUEFIのみにする
　ここはマザーボードによるので割愛．

### 2. UbuntuのISOイメージをUSBに焼く
①以下のページよりUbuntuのISOイメージをダウンロード．
https://ubuntu.com/download/desktop

②Rufus（イメージ書き込みツール）をダウンロード
https://rufus.ie/

③Rufus起動し，デバイスにUSBメモリを選択．

④ブートの種類に先ほどダウンロードしたUbuntuのISOイメージを選択．

⑤パーティション構成をGPTにする（MBRではいけない）．

⑥スタートを選択．

### 3. Ubuntuのインストーラを起動
①Biosの設定でUSBの起動順位を一番上に持っていく．
②USBをさし，再起動．
③黒い画面に白字でInstall Ubuntuと書かれている箇所にカーソルを合わせて選択．

### 4. インストールするディスクを選択する．
①インストールの種類という項目が出るまで流れに沿って進める．
②（うろ覚えだが）「Windows Boot Managerがインストールされています．どのOSを起動するか選択できます．」というような箇所を選択．
③しばらくするとUbuntuをインストールするドライブの確認を要求されるので確認して進む．
④しばらく待つ

### 5. GRUBでどのOSを起動するか選択できるようにする．その際，カーソルをWindowsBootManagerに自動で配置する．
①インストールが終わるとTerminalを起動する．
③WindowsBootManagerの場所を知るために以下のコマンドを打つ

```
$ grep windows /boot/grub/grub.cfg
```

④エディタでファイル参照

```
$ sudo nano /etc/default/grub
```

⑤以下のように変更する．

```
GRUB_DEFAULT='Windows10のブートローダ名'
```
⑥GRUBの変更を反映

```
$ sudo update-grub
```
⑦再起動
⑧BIOSでUbuntuがインストールされたディスクの起動順位を１番上にする．
⑨再起動

これでPC起動時にGRUBが起動し，デフォルトでカーソルがWindowsBootManagerになるように設定できた．

### 6. 時刻のずれ解消
ターミナルで

```
$ sudo timedatectl set-local-rtc true
```
と打てば解消する．


# 参考
https://qiita.com/medalotte/items/4bb5cfa709e93d044f1c
https://qiita.com/udai1532/items/4893af6ea4da3e20b302
https://qiita.com/bonotake/items/622434c50b0c45a746c6
https://qiita.com/yoshinyan/items/d56a56414f2d21814f88
Raspberry Pi 4B 技適が通った様子

#この記事について
タイトルのとおりです。
なお、今回の記事は技術的な要素はゼロです。

##念のため自分の過去記事のリンク
- [Raspberry Pi 4 発表](https://qiita.com/nara256/items/f463520c4290eaf93d27)
- [Raspberry Pi 4 届いた](https://qiita.com/nara256/items/e62b023ddb3d7e3696fb)

# Raspberry Pi 4B の技適について

[総務省の技適の検索ページ](https://www.tele.soumu.go.jp/giteki/SearchServlet?pageID=js01) に Raspberry Pi 4 Model B の技適について掲載されました（[こちらのページを参照](https://www.tele.soumu.go.jp/giteki/SearchServlet?pageID=jg01_01&PC=007&TC=N&PK=1&FN=190925N007&SN=%94%46%8F%D8&LN=21&R1=*****&R2=*****)）。
2019/9/4 時点で技適の認証が取れたようです。

## Raspberry Pi 4B はもう日本で使えるの？

技適の認証は下りましたが、実際にはまだ日本で Raspberry Pi 4B は使えません。というのも、技適の認可が下りたとしても「技適のマークが付いた機械」でないと日本では使えません。
まもなく技適マーク付きの Raspberry Pi 4B が流通し始めると思いますので、もうしばらく待ちましょう。

## （余談）技適について

技適が通ったからと言って、技適マークなしの機械は相変わらず日本で使うと電波法違反となります。
たとえ技適付き製品と同一のハードウェアだったとしても、です。
電波を出す機械については、「技適マーク付きの製品を使えばOK」「技適マークなしの製品を使うとNG」というシンプルな理解で大丈夫です。
個人で使うならともかく（もちろんそれもダメですが）、仕事で使うような場合は必ず技適付きを使いましょう。

また、技適なしの製品をソフトウェア的に電波を出す機能を停止しても、利用はNGです。
（参考） https://qiita.com/m10i/items/f3e4de388ecac4b67046

# Raspberry Pi 4B についてのまとめ
ということで、もう少し待ちましょう。日本で使えるようになるのは間もなくです。

# （余談）Raspberry Pi 3B+ の供給不足について
Raspberry Pi 4B の影に隠れていますが、Raspberry Pi 3B+ が世界的に供給不足に陥っているようです。
日本の代理店である[KSYの情報](https://twitter.com/KSY_RasPi_Shop/status/1180032621822144512)によると、次回入荷予定は 2020年3月(!)とのこと。
Raspberry Pi 3B+ は2023年まで継続生産されることが約束されているため、このままフェードアウトすることは無いはずです。こちらもしばらく待ちましょう。
もしくは、PoEなどの3B+特有の機能を使わない場合は、3Bであれば日本製のものが豊富に流通しているはずですので、そちらを使うのが良いのかもしれません。
Laravel bladeから静的ページを生成して表示速度を改善してみたい

## 概要
- bladeから静的ページを生成しそのページを表示する
- データの更新時には一緒に更新する

という運用をやってみようという記事

## 手順例

### HTMLファイル生成するイベントを作る
こんな感じのことをするイベントを作成する。
記事ページなどの単一のモデルのデータしか使わない場合は、Modelに定義するとよさそうです。

```php
public function __construct(User $user)
{
     $html = view('home.home')->with('user', $user)->render();
    
    // htmlファイルの保存場所は任意
    file_put_contents(storage_path("app/public/home.html"), $html);
}
```

### イベントを発火
作ったイベントをModelの$dispatchesEventsに定義したりなどして、更新時に動くようにする。
後はコマンドにしたり。

### ルーティング
例えば

```php
Route::get('/', function () {
    // \Illuminate\Support\Facades\File
    return \File::get('storage/home.html');
});
```

### 備考
- 必要ならばファイルを削除するイベントも作って、削除時に発火させる
- HTMLファイルが無かったら通常通りbladeを表示するようにすると、安心する
- ビューにControllerやMiddlewareからデータを渡しているとレンダーされる時に読み込まれないので、ViewComposerで定義すると嬉しい

## おわり
記事ページ等はbladeの更新の際に全HTMLファイルを更新する必要が出てくるので、向かないかもしれません。
運用には注意が必要ですが、bladeの更新頻度が低いかつ表示速度が遅いページの改善法として有効だと思います。TOPページなど。
Windowsサービスの依存関係の解除方法

# はじめに
サービスの依存性解除は、予期せぬ不具合が発生する可能性もあるため注意すること。

# サービス依存関係設定
サービスのステータスを確認し、依存関係を解除する。
## サービスステータス確認
サービス名はサービスのプロパティから確認できる

```
sc qc XX(サービス名)
```

### 依存関係のサービスを確認
「DEPENDENCIES」に依存しているサービスが表示がされるのを確認する。

## 依存関係解除
以下のコマンドを実行し、依存関係を設定する。
xxで指定したものが、依存関係となる。
依存関係を解除したい場合は、**解除したいサービス以外**を指定する。

``` 
sc stop XX
sc config XX depend=xx/xx/xx/
```

## サービス自動起動
サービスの起動と自動起動を設定する

```
sc config XX start= auto
sc start XX
```
40手前、気分は高校1年生。プログラミング(Ruby on Rails)を3ヶ月勉強して一口馬主とかPOGで少し役立ちそうな馬の検索WEBサービス(webアプリ)を作ってみた！

粛々と窓際社員を驀進中の小生であるが、ボケーーーっと平日を過ごし、
ただただ週末の競馬を楽しみに生きる人生。

 
これでいい、とも思うし、これではダメだ。。とも思う。


ただギャンブルとは別のスパイスが欲しいという欲求と、プログラミングをちょっとやってみたい、という秘めた思いを10年越しに実現することにした。

窓際社員であることも、学習を進める上で大いに役立った。


だって・・・・仕事ないから・・・・・。ネットサーフィン感覚で、勉強できるのですもの。。。。。

 

ついでに毎日腕立てと腹筋を100回以上やることにした。

 


## ◆　作ったサービス

 

**うまBANG!**
www.umabang.com

 

 

## ◆　どんなサービス？

 

血統表に馬名を入れると該当する馬を検索できるサービスです。
とりあえず今は2013-2015年産世代のデータを検索対象にしています。

 

*こんな感じで検索すると*


 

*こんな感じで結果がわかる*

 


◇　動機というか一口馬主をやっていてのペイン
--------------
静止画、動画、血統、クラブ、厩舎、などなどなどなど一口馬主の馬選びは様々な要素を考慮する必要があり、
人それぞれ優位に思っていることは違う。
例えば小生は元々は静止画から判断していたが、最近だと動画、そして血統も考慮するようになった。
そう、続ければ続けるほど、何やら様々なものが見えすぎて、シンプルに馬選びを出来なってきているのだ。

そうすると従来は出資しなかった馬に出資したり、どんどん深みにはまっていく。
そこに納得感があれば良いが、必ずしもそうではない。

謎に出資馬を増やしてしまいそうになる誘惑に駆られることも多いが、めちゃくちゃ金持ちでない限り、台所事情はなかなか苦しくなっていく。
小生然り。

ただ血統から絞れることも多く、さらにパズルのように様々な組み合わせを検証したくなる。

 

・スクリーンヒーローやキングカメハメハ牝馬は成績悪い？
・父 ディープインパクト　母父 stormcat　は本当にニックス？
・では父父 サンデーサイレンス 　母父 stormcat　はどうなの？
・母父 orpen　とか注目されているけど？（ポレンティア！）
・fastnetrock　ってどうよ？（モーソンピーク！）
・母父 サンデーサイレンスを買っておけば良い簡単なお仕事です（ダイアトニック！アーモンドアイ！ブラストワンピース！）

 

こんな気持ちを手軽に解決できたらな〜と思ったのがそもそもの動機。
確率的に期待値が低いことを明確にして、そもそも出資しない血統マイルールを今一度持ち直したいと考えている。


◇　一口馬主をやっていて、できれば出資馬に望むこと
--------------

重賞に出走して欲しい！できれば重賞で好走して欲しい！！！
一口馬主を数年やった小生が出資時に最も思うことである。

当該週の重賞はメディアにも多く取り上げられ、様々な方が出資馬の名前を呼んでくれる。
なにものにも代え難い幸せ・・・。

そこで、このサービスでは重賞出走歴のある馬のみで絞り込み検索できるようにした。

 

加えてなんとなく1000万以上稼いでくれると、最低限楽しませてくれる、ということも感じているので、
最低ラインとして獲得賞金1000万以上の馬が何頭マッチするのかも見られるようにした。
ノルマンディーであればこの辺りが損益分岐点の一つ基準になるだろう。


◇　改めますと・・・
--------------
・牡牝の成績差がわかる。
・重賞出走まで届く可能性をなんとなく調べられる。
・賞金1000万以上獲得する確率もなんとなくわかる。



よろしければ遊んでみてください。もしご変なところがあればコメントをください。

 

**うまBANG!**
www.umabang.com


 

今後これを使ってノルマンディーの馬を見てみようと考えている。
こっちのブログで。

**清純派 一口馬主ライフとパドック予想師！誠意の競馬日記と反省**
http://paddock.hatenablog.com/
 

## ◆　番外

◇　今後やりたいこと
--------------

対象の馬を増やす
検索時のサジェスト
並び替え
人気ランキングをちゃんとする
検索履歴の保持
サンデーサイレンスの 3x4　4x3　とか馬名と世代を指定して検索できるようにしたい

なんかができればと思います。


◇　どんな勉強をしたか
--------------
WEBの講座をやりました。週2回メンターとのビデオMTGがあり、そこで褒めていただけるのでやりがいを持って進められました。

ひさしぶりに他の人から褒められる体験でした。

 

少しお値段は張りましたが、一口馬主のせいでお金の価値が暴落中なので、躊躇せず申し込めました。

 

◇　どれくらい勉強したのか
--------------
平均すると1日3-4時間程度を2.5ヶ月続けて、このうまBANG！に取り組みました。

 

◇　一番辛かった時
--------------
スクールの環境が 開発環境 Cloud9 x MySQL 本番環境 Heroku x PostgreSQL　だったので、いざ公開しようと思ったら動かなかったのが辛かったです。
さらに、Heroku　を MySQL　に変更しようとして失敗していた時は絶望に暮れました。

 

◇　今つらいこと
--------------
ギャグでAmazonアソシエイトとgoogleアドセンスに申し込んでみたのですが、審査で断れています。
一所懸命勉強して作ったのに。。。。。なんだろうこの疎外されている感じ。。。。理由もわからないし。。。。


こういうことから JOKER が生まれるのだと思います。
macOS Catalina の起動可能なインストーラを作成する

macOS の起動可能なインストーラを作成する
https://support.apple.com/ja-jp/HT201372

上記ページにEl Capitan〜Mojaveの手順例は書いてあるがCatalinaのものはない。
試しに.appのファイル名だけ書き換えたところMojaveなどと同様に起動可能なインストーラが作成ができた。

```
$ sudo /Applications/Install\ macOS\ Catalina.app/Contents/Resources/createinstallmedia --volume /Volumes/MyVolume
```

※ MyVolumeの部分はUSBメモリのボリュームの名前
python-cmake-buildsystem で libpython を自前 C/C++ アプリに組み込む

# 背景

* CMake :heart:
* Python インタプリタを自前 CMake + C/C++ アプリにモノリシックに組み込みたい(libpython も含んでの単一バイナリにして配布したいなど)
  * Windows, macOS, Linux クロスプラットフォームでやりたい 
* システムの libpython や, プレビルドバイナリを利用だと, セットアップが面倒だったり, 環境によっては ABI が合わないとか, ビルド環境と実行環境での python バージョン違いとか, コンパイラが合わないとかでうまくビルドできなかったり実行できなかったりの問題に陥ることがあるので避けたい
* Python コアの組み込み機能を使うくらいで, readline や OpenSSL などやその他外部パッケージを利用する予定はない
  * python でちょっとしたテストのためのスクリプトを実行したい
  * グラフィックス関連の処理で, C++ 世界での変数を値を使って python でスクリプト処理したい
  * などなど.
* 組み込み用には micropython とか tinypy とかあるが, やはりフル機能の Python が使いたい
  * フル機能であれば, pybind11 と連携して, バインディングも記述しやすくなる.


## python-cmake-buildsystem

Python パッケージ自体のビルドシステムは古い configure 形式のままで, cmake のプロジェクトは用意されていません.

Python を CMake でビルドできるようにする python-cmake-buildsystem があります.

https://github.com/python-cmake-buildsystem/python-cmake-buildsystem

Python パッケージを自動ダウンロード + patching もしてくれます.

ただ, オリジナルのは開発止まっているのか, 3.6 までです,

いくつか fork で 3.8, 3.9 対応しているのがあります.

https://github.com/dand-oss/python-cmake-buildsystem

がよさそうでしょうか.
ただ, asv_cmake という独自(?)の設定を読み込んでいますのでそのままではうごきません.  CMakeLists.txt で該当部分を消せばいけます.
　
### ビルドオプション

cmake で,

```
-DWITH_STATIC_DEPENDENCIES=On \ # Linux(posix) only
-DBUILD_EXTENSIONS_AS_BUILTIN=On \
-DUSE_SYSTEM_LIBRARIES=OFF
```

あたりを設定すると, 静的リンク + バイナリが作れるかと思います. いくつか cmake オプションがありますので, 自分の環境に合うようにいろいろ試してみてください.

また, 自前の C/C++ アプリの CMakeLists.txt に add_subdirectory() でこの python-cmake-buildsystem を登録してもよいかもですが, いろいろファイルコピーのインストール処理とかも考えると, 一旦 python-cmake-buildsystem でビルドをしておき, 自前の C/C++ アプリではそのインストールディレクトリを指定, というのが手間がかからないかなと思います.

## 注意点

C++ から Python を呼ぶ場合, site の設定を無効にしておかないと(or なにかしら site を設定), python インタプリタが, import site ができないエラーが出ます.

site の設定を無効にするには, C++ コードで Python インタプリタ初期化の前に, 以下のように `Py_NoSiteFlag` グローバル変数を設定します.

```C++

Py_NoSiteFlag = 1; // disable import site
// Py_VerboseFlag = 1;
Py_IgnoreEnvironmentFlag = 1;
Py_NoUserSiteDirectory = 1;

Py_InitializeEx(0);
...
```

参考情報: https://docs.python.org/3.6/c-api/init.html

## まとめ

python-cmake-buildsystem で C/C++ アプリで libpython をリンクして, Python コードを呼ぶしくみを構築し, 動作確認しました.

## TODO

* [ ] minimal なサンプルコードを用意する
* [ ] pybind11 と連携し, C/C++ <-> Python をよりシームレスに繋ぐ
[解決] macOS CatalinaをインストールしたらVirtualBoxのVMが起動しなくなった話

## 6.0.14にバージョンアップしたら通常起動でも落ちなくなりました。

バグフィックスされたようです。これで通常作業ができます。
皆様もバージョンアップご検討ください。

-----

Catalina リリースされたんで早速インストールしたら
VirtualBoxのVMが落ちて動かなくなった人のために、回避策を。

## こんなエラー画面が出てしまってVMゲストが起動しない。
<img width="998" alt="02-Error.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57579/cfc691a0-43bf-9a20-cbd1-c9b42964aeb6.png">

## 再現手順

VMを起動して、VMの以外のアプリケーションのWindowをアクティブにすると、
すごい勢いでゲストが落ちる。

## 同じ現象の人多数発見

https://forums.virtualbox.org/viewtopic.php?f=8&t=95041&start=1

## 回避策 ヘッドレスモードで起動すればいいよ

<img width="750" alt="01-VirtulBoxManager.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57579/587e7c6a-b495-802b-1332-1f367786e795.png">

ヘッドレスなんでウィンドウが非アクティブになることもないので、
なんとか回避できました。

とりあえず私はもうこれ以上原因追いかける時間的猶予がなかったので、
バグフィックスされるまではこれで逃げ切ることに決めました。

同様の現象に遭遇している時間のない開発者の阿鼻叫喚が少しでも収まりますように！
Celery4.3.0でresult_expiresを正しく適用する

## tl;dr
Celeryのドキュメントが間違っていた。

## 背景
DjangoでCeleryを使う際に、Result BackendにRedisを指定して動かしたとき、どうもresult_expiresの設定がうまくいかなかった。

## やりたいこと
result_expiresを正しく設定する。

## 環境
- Celery 4.3.0
- Django 2.2.6
- Redis 5.0.1

## やること
`CELERY_TASK_RESULT_EXPIRES` ではなく `CELERY_RESULT_EXPIRES` で設定する。


```python:settings.py
# CELERY_TASK_RESULT_EXPIRES = 3600
CELERY_RESULT_EXPIRES = 3600
```

秒単位なので、これで期限を1時間に設定されます。

## 補足
PR投げるチャンスかと思いましたが、既に対応済みでした。

https://github.com/celery/celery/issues/5473
https://github.com/celery/celery/pull/5475

4.4.0リリース後に反映されるようで、現状(2019/10/09)のドキュメントは修正されていません。
というのもあって、この記事を書きました。
nuxt-ts を使っていて、"No pages directory found in 〜"と表示されたときの対処

NuxtでTypeScriptを使ってデフォルトのsrcディレクトリを変更していると、たまに `No pages directory found in プロジェクトディレクトリ` と表示されてビルドできないことがあります。

自分はかなりハマってしまったので、対処法をまとめます。

## srcDir は設定しているか
srcディレクトリを `/app`にする場合、
nuxt.configに `srcDir: 'app/',` と記述します。
https://nuxtjs.org/api/configuration-srcdir#the-srcdir-property

これは基本なので、ちゃんと設定してあるはずですので、おそらく原因は別のところでしょう。

## tsconfig.json の設定

baseUrl や paths は正しく設定されているか。

```tsconfig.json
{
  "compilerOptions": {
    "baseUrl": "app",
    "paths": {
      "~/*": ["./*"],
      "@/*": ["./*"]
    }
  }
}
```
モジュールを正しく読み込んでくれないときなどは、
`tsconfig-paths` は入れてみる

```
yarn add -D tsconfig-paths
```

## package.json パッケージのバージョン 依存関係は問題ないか
これが一番やっかいな問題ですが、パッケージの依存関係に問題がないか確認します。
`node_modules/` や `yarn.lock` は削除してクリーンな状態でパッケージを再インストールします。

以前あったのは、パッケージをアップグレードしたときに、core-jsのv3系がnuxtで動かなくなることがありました。

今回の自分が遭遇した原因は、[Nuxt TypeScript](https://typescript.nuxtjs.org/guide/) に書いてあったのですが、nuxtのバージョンと、@nuxt/typescript-runtimeのバージョンの依存問題だったようです。

> @nuxt/types
> @nuxt/typescript-build
> @nuxt/typescript-runtime
> These packages are intended to only be used with Nuxt 2.10 or above.
[チュートリアル] ReactNative 初期構築〜HelloWorld表示〜コンポーネント受け渡し

# 準備
XCode
AppStoreからダウンロード
これがないと始まらない
MacのOSバージョンによってインストールできない可能性あり。
常に最新レベルじゃないとすぐにインストールできなくなるので注意。

Node/NPM
Node・・・Node.jsのこと。サーバーサイドで動くjavascriptです。
NPM・・・パッケージ管理ツール。ReactやReactNative、Babelなどのjsの拡張機能を管理するツール

Nodeのインストール
brew install node

NPMのインストール

watchman
brew install watchman
ファイルの変更を監視してくれるツール

RN CLI(React Native Command Line Interface)
npm i -g react-native-cli

※参考
https://rara-world.com/react_native-build/
https://rara-world.com/react-native-tutorial/

# Hello Worldを表示

```console:ターミナル
react-native init reactHello
```
※途中「info Installing required CocoaPods dependencies」で止まっているかのように遅い

```console:ターミナル
cd reactHello

npm i

react-native run-ios
```
※シュミレーター起動（初回は遅い）

Welcome to Reactというタイトルの画面が出るはずです。
今後バージョンによって変わる可能性あり

<img width="416" alt="初期起動画面.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393193/637531fa-6369-f4d1-1d61-ffb52a05ee01.png">

# ディレクトリやファイル
├── App.js
├── __tests__
├── android
├── app.json
├── index.js
├── ios
├── node_modules
├── package-lock.json
├── package.json
└── yarn.lock

+追加
└── src この中に子コンポーネント入れていく

# 親Componentを作る
App.jsを書き換え
※参考記事でindex.jsになっていますが、記事ではおそらく前のバージョンでのことだと思います

```js:App.js
import React from 'react';
import { Text, AppRegistry } from 'react-native';
 
const App = () => (
  <Text>Hello World!</Text>
);

export default App;
// 記事の「AppRegistry.registerComponent('test', () => App);」だとエラーになった
```

これで「Hello World!」が表示されました.


# 子Componentを作る

```js:src/Header.js
import React from 'react';
import { Text, View } from 'react-native';
 
const Header = () => {
  const { headerText, header } = styles;
  return (
    <View style={header}>
      <Text style={headerText}>ヘッダー</Text>
    </View>
  );
};
 
const styles = {
  header: {
    backgroundColor: '#F8F8F8',
    justifyContent: 'center',
    alignItems: 'center',
    height: 90,
    paddingTop: 25,
    elevation: 2,
    position: 'relative'
  },
  headerText: {
    fontSize: 20,
    fontWeight: '600'
  }
};
 
export default Header;
```

App.js修正

```js:App.js
// 追加
import Header from './src/Header';

// 修正
const App = () => (
  <View>
    <Header />
  </View>
);
```

# 親から子へパラメータを渡す
App.js修正

```js:App.js修正
....
// 修正
const App = () => (
  <View>
    <Header showText={'Hello'} />
  </View>
);
....
```
src/Header.js修正

```js:src/Header.js
....
 
const Header = (props) => {
  const { headerText, header } = styles;
  return (
    <View style={header}>
      <Text style={headerText}>{props.showText}</Text>
    </View>
  );
};
 
.....
```

<img width="416" alt="スクリーンショット 2019-10-09 13.21.18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393193/677a7ec2-817c-aa05-af72-235b4ba3eeaf.png">


font関係でエラーの場合の対処法
https://wp-kyoto.net/react-native-vector-icons-red-screen-with-unrecognized-font-family-error-on-ios/
gcloudコマンドのメモ

# これは何？
gcloudで個人的によく使うコマンドのメモです。

# コマンドたち

## 認証
```shell
$ gcloud auth login
```

## プロジェクト関連
### セットされているProjectを確認する

```shell
$ gcloud config list
```

### Projectをリストする

```shell
$ gcloud projects list
```


### Projectの切り替え

```shell
$ gcloud config set project [PROJECT_NAME]
```

### Deployする

```shell
$ gcloud app deploy
```

### Deployしたサービスを削除する

```shell
$ gcloud app services delete [SERVICE_NAME]
```

### Serverログ

```shell
$ gcloud app logs read
$ gcloud app logs tail
```

# Nodejs Tips
## Express
- **port must be set 8080**


# Reference
- [Quickstart for Node.js in the App Engine Standard Environment  |  App Engine standard environment for Node.js docs  |  Google Cloud](https://cloud.google.com/appengine/docs/standard/nodejs/quickstart)
- [Node.js Runtime Environment  |  App Engine standard environment for Node.js docs  |  Google Cloud](https://cloud.google.com/appengine/docs/standard/nodejs/runtime)
- [nodejs-docs-samples/app.yaml at master · GoogleCloudPlatform/nodejs-docs-samples](https://github.com/GoogleCloudPlatform/nodejs-docs-samples/blob/master/endpoints/getting-started/app.yaml)
- [php - Where I can see the logs in Google App Engine? - Stack Overflow](https://stackoverflow.com/questions/49090343/where-i-can-see-the-logs-in-google-app-engine)
- [gcloud app services delete  |  Cloud SDK  |  Google Cloud]
(https://cloud.google.com/sdk/gcloud/reference/app/services/delete)
基本型-java

**基本型**
byte<<short<<int<<long<<    float<<double
←小さい箱　　　　　　　　　　　大きい箱→

・double型に整数を代入できる
・int型とdouble型の演算　→　double型になる
　理由：double型のほうが型が大きいから
　　　　より大きい型に合わせる動き

・整数 int    -2147483648～2147483647     　int i =100;　小数点なし
・整数 long   -9223372036854775808～9223372036854775807  long lo = 300000L; 最後にL付ける　小数点なし
・整数 short -32768～32767
・整数 byte  -128～127 


整数は普通int型使うし　byteとshortの存在意義がわからない
**でもオラクルの問題に出たりする**

・真偽値 boolean 真偽値,trueまたはfalse  boolean Win = false;
・文字型 char Unicode文字 ¥u0000～¥uFFFF　char A ='A';
 
```java:sample
            char uni =  ‘¤’; //OK
            char uni2 = U+00A4; //NG　ユニコード入れてもだめ
            char uni3 = ‘U+00A4’; //NG　''で囲んでも無駄無駄
```

・浮動小数型　float  単精度浮動小数点数  小数点付きで、末尾にFまたはf　float fo = 30.5f;
・浮動小数型　double  倍精度浮動小数点数 double do = 30.5;

| 整数型 | 最小値 | 最大値 |
|:--|:--|:--|
| byte | Byte.MIN_VALUE | Byte.MAX_VALUE |
| short | Short.MIN_VALUE | Short.MAX_VALUE |
| int | Integer.MIN_VALUE | Integer.MAX_VALUE |
| long | Long.MIN_VALUE | Long.MAX_VALUE |

で最大値と最小値を取得できる
関数定義を Mix.env に応じて分ける方法とテスト

開発時とデプロイ時で関数の定義を変えたいときがある。以下のように書けば、`Mix.env` の値に応じて、異なる関数がコンパイルされる。

```elixir
defmodule MyModule do
  @moduledoc false

  if Mix.env() == :prod do
    @foo Application.fetch_env!(:myapp, :foo)
    def foo, do: @foo
  else
    def foo, do: Application.fetch_env!(:myapp, :foo)
  end
end
```

リリース時に Mix モジュールは存在しないが、この場合、コンパイル時に使われるだけなので問題ない。ただ、このままだとテスト時には片方の実装しかテストされないので、両方をテストしておきたいところ。以下のようにした。

```elixir
defmodule MyModuleTest do
  use ExUnit.Case

  import ExUnit.CaptureIO

  @source_filepath __DIR__
                   |> Path.join("../../lib/myapp/my_module.ex")
                   |> Path.expand()
  test "foo" do
    on_exit(fn ->
      Mix.env(:test)
    end)

    # suppress warnings
    capture_io(:stderr, fn ->
      Mix.env(:prod)
      Code.compile_file(@source_filepath)
      assert MyModule.foo(), "compile on Mix.env(:prod)"

      Mix.env(:test)
      Code.compile_file(@source_filepath)
      assert MyModule.foo(), "compile on Mix.env(:test)"
    end)
  end
end
```

`Mix.env` を変更してから `Code.compile_file/2` で対象ファイルを再コンパイルしてやる。`on_exit/2` で戻してやるのも忘れずに。
#Github で自分向けのレビューリクエスト一覧を見るには ヘッダメニューの PullRequests  > ReviewRequests (ついに見つけた)

# URL

https://github.com/pulls/review-requested

# あんなに探したのに、こんなに近くにあったなんて。

ヘッダメニューなんて検索以外に使ったことはまるでなかった。

![image](https://user-images.githubusercontent.com/13635059/66444813-a61a5300-ea7f-11e9-8f3e-95620de20750.png)


https://github.com/pulls/review-requested

# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
macOS Catalinaにアップデートすると影響を受けそうなアプリ

# macOS Catalinaの配信
昨日Catalinaが配信されましたが、既出の通り**一部アプリの動作に影響**の出るアップデートとなっています。

## 影響を受けるもの
> 32bitアプリがサポートされていない
> デフォルトシェルがbashからzshに
> "場所が変更された項目"フォルダー

- 引用元: 窓の社 https://forest.watch.impress.co.jp/docs/serial/yajiuma/1211564.html 

## 32bitアプリがサポートされていない
- 1年以上前からAppleで非対応が通知
- 2018年1月より公開されるアプリは64bitのサポートが必須になっていた

### 調べ方
    1. 画面左上リンゴマーク
    2. このMacについて
    3. システムレポート
    4. ソフトウェア タブ
    5. アプリケーション
        - 64bit（Intel)で確認可能

### 32bitと思われるアプリケーション一覧
    - Logicoolデバイス関連ソフトウェア
    - ScanSnap Manager
    - Setup系ツール(Adobe Flash Player Setupなど)


### 引用元
- 窓の社
    - https://forest.watch.impress.co.jp/docs/serial/yajiuma/1211564.html
- LifeHacking
    - https://lifehacking.jp/2018/04/system-info-32bit-app/
React Reduxに相当するものをhooksでやってみる

# React Reduxに相当するものをhooksでやってみる

Reduxを使わない場合にそれに相当するやつをHooksで実現したいなーって時に考えたやつ


## とりあえず完成したやつ

```tsx


// TODOの型
interface ITodo {
  id: number
  body: string
  isDone: boolean
}

// TODO検索用の型
interface ISearchTodoParams {
  body?: string
}

// TODO検索のAPIの代わり
const mockApi = (params?: ISearchTodoParams): Promise<{ todos: ITodo[] }> => {
  return new Promise(resolve => {
    setTimeout(() => {
      resolve({
        todos: [
          { id: 1, body: '卵買う', isDone: true },
          { id: 2, body: '塩買う', isDone: false },
          { id: 3, body: '家買う', isDone: false },
        ],
      })
    }, 1000)
  })
}

// メインディッシュ
export const useTodos = () => {
  const [todos, setTodos] = useState<ITodo[]>([])
  const [isLoading, setLoading] = useState(false)
  const [isError, setError] = useState(false)

  const fetchTodos = (params?: ISearchTodoParams) => {
    setLoading(true)

    // apiの代わり
    mockApi(params)
      .then(response => {
        setTodos(response.todos)
      })
      .catch(() => {
        setError(true)
      })
      .finally(() => {
        setLoading(false)
      })
  }

  return { todos, fetchTodos, isLoading, isError }
}

// 使うとき
export const Todos: FC = () => {
  const { todos, fetchTodos } = useTodos()

  // 初回取得
  useEffect(() => {
    fetchTodos()
  }, [])

  return (
    <ul>
      <input
        type="text"
        onChange={e => {
          const val = e.target.value
          if (val.length === 0) {
            return
          }

          fetchTodos({ body: val })
        }}
      />

      {todos.map(todo => (
        <li>{todo.body}</li>
      ))}
    </ul>
  )
}
```

## 解説

使うときはこの辺の引数を受け取って使える感じ

```ts
/**
 * todos: TODOの配列が入ったやつ
 * fetchTodos: todoの一覧を取得する関数
 * isError: エラーが起きたらtrueになるやつ
 * isLoading: 通信中にtrueになるやつ
 */
const { todos, fetchTodos, isError, isLoading } = useTodos()
```

reducers や actionsとかを書くのと比べると記述量が少なくなってる
Componentが離れたところで参照させたいとかがなければ、これくらいでいいのかなと
reducersやactionを

以上！
テスト初心者がRSpecを学習するときにとまどったこと

#前書き
私はRailsを学びはじめて1年に満たない初学者ですが、現在今まで避けてきたテストを学んでいます。
いろいろと手こずったので、私の経験が誰かの役に立てばと思いこの記事を書いています。

#つまづきポイント
##何からはじめたら良いかわからない
RSpecどころかテストに触れるのもほぼ初めてだったため、どこからはじめればよいか全くわかりませんでした。書籍、レファレンス、Qiita記事等いろいろな情報を当たった結果、ご存知の方も多いと思いますが、@jnchitoさんの一連の記事が初学者には一番わかりやすかったです。

- [使えるRSpec入門・その1「RSpecの基本的な構文や便利な機能を理解する」](https://qiita.com/jnchito/items/42193d066bd61c740612)

最初に上記に続く一覧の記事に目を通すと理解が進むと思います。

##古い情報が役に立たない
これはプログラミング全般に言えることだと思いますが、改めて最新の情報を参考にすべきだと感じました。
Controller Specが非推奨となっていたり、RSpec3.7よりSystem Specが追加されているなど書きかたが全く異なることが多いのでなるべく新しい情報を参照すべきです。

##何をテストすればよいかわからない
これは簡単に論じられる問題ではないと思いますが、最初の学習としては、モデルのテストと何らかの機能のシステムテストを行うとまんべんなく基礎の基礎が学べて良いのかなと感じました。

#最後に
今まで何となくテストめんどくさいなあと感じていたのですが、（おそらくRails Tutorialが原因)やってみると意外と面白かったです。
特にCapybaraでブラウザが自動操作されるのは見ていて興奮しました。
本当にまだ基本しかわかっていませんが、頑張って勉強を続けていきたいと思います。
NSDateComponentsにinit?を追加するとクラッシュするパターン

対象は `NSDateComponents` です。
`DateComponents` ではないためこの問題に引っかかる人は少ないと思いますが、簡単に情報を残しておきます。

Failable Initializer(init?)を追加して `return nil` するとクラッシュすることがあります。
環境は Xcode11.1 (11A1027) です。

以下がクラッシュするコードです。
（こんなメソッドいらないだろう？　みたいなツッコミはなしで😎）

```
extension NSDateComponents {
    @objc convenience init?(string: String) {
        guard ! string.isEmpty else {
            return nil
        }
        self.init()
        self.hour = Int(string)!
    }
}
```

Xcode10のときは動いていました。
Xcode11だとこれを呼び出したあとクラッシュします。
以下のように変更すると動きます。

```
extension NSDateComponents {
    @objc convenience init?(string: String) {
        self.init() // `return nil` する場合も必ず呼び出す。
        guard ! string.isEmpty else {
            return nil
        }
        self.hour = Int(string)!
    }
}
```

`NSObject` を適当に継承したクラスで `super.init()` を呼び出さなくても問題はありませんでした。
NSDateComponents（もしかしたら他のクラスでも）の実装の問題なのでしょうか。

自分のコードのお行儀が悪いのかバグなのかはわかりませんでしたがお気をつけください。
rtags, vim-lsp with clangd で C++ の reference 箇所を参照する際のメモ

何が原因なのかよく分かっていないが、Vim で C++ を開いているとき、rtags や vim-lsp with clangd を使って reference を見る際に、一筋縄ではいかないのでうまくいくときのポイントをメモ。

# rtags
関数の定義箇所で `<Leader>rf` (rtags#FindRefs) してもうまくいかなくて、宣言箇所だとうまくいく。
なので `<Leader>rj` -> `<Leader>rf` の順に飛んだほうがよさそう。

# vim-lsp with clangd
関数の定義箇所や宣言箇所で `:LspReferences` してもうまくいかない。
どこか実際に reference している箇所からだとうまくいく。

```cpp
int foobar();  // ここで :LspReferences してもだめ

int foobar() {  // ここで :LspReferences してもだめ
    return 0;
}

int main() {
    foobar();  // ここで :LspReferences するとうまくいく
    return 0;
}
```