OmniAICreator/Qiita-1.07M huggingface dataset:
kubernetesを一時的に止めたい場合の費用の抑え方


## 気になる点
個人でサイトを運用する場合、やはり気になるのは、
費用面ですよね。
自分の場合は、２サイト立ち上げているのでヒヤヒヤしながら
kubernetesクラスタ作ってます。
今回は、prowというciツールを試してみて、もう一つkubernetesクラスタを追加したのですが、これが、こういう構成で
<img width="393" alt="スクリーンショット 2019-05-27 11.50.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87607/f1f8fa3a-6233-cecb-d9c5-9bd7f93dfa8b.png">
<img width="446" alt="スクリーンショット 2019-05-27 11.50.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87607/805b623d-6708-2020-ae4c-a8d79f977faf.png">

vCPUは結果、8台となっています。

## かかったコスト

約１日 400円、このままいくと月 12000円近くかかってしまいます><

そこでノードプールを消してみます。
<img width="469" alt="スクリーンショット 2019-05-27 12.09.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87607/8e63d6cd-e96f-5f9c-c1d3-838b677dc488.png">
↑この状態にする


## これからの事

ノードプールを消したことによって、コストは抑えられると思います。
LBやクラスタそのものの価格はかかってくるかもしれませんが、
コストを抑えれらると思っています。

結果は数日後にまたアップしたいと思います。

## 結果 2019/05/30 追記
1日あたり150円ぐらいに抑えることができました。だがまだ高いですね。。
<img width="225" alt="スクリーンショット 2019-05-31 10.39.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87607/e65243e8-ea7c-5cca-300e-90db6660accd.png">
【jQuery】フロントエンド未経験が業務でjQueryを触ることになった時にやったこと

とりあえず投稿しますが随時追加・修正します。
修正点あればご指摘ください。

# 僕の行った学習方法
1. やりたいことでググる
2. 出てきたコードを読む
3. メソッドをひとつひとつリファレンスで調べる
4. 読める！

# jQueryの文法

## 基本構造
```js
$(セレクタ).メソッド(引数としてイベント、関数、値)
```

### 例
```example.js
$('#foo').on('click', function(){
  console.log("Hello, World")
});
```
上記の例では、
1. `id`が`foo`である要素をセレクタとして指定し
2. セレクタで指定した要素に`on`メソッドを付与し
3. `on` メソッドの第一引数に`click`イベントを指定し
4. `on` メソッドの第二引数に`click`イベントが起きた時の処理を関数として定義している。

# 参考リンク

とりあえず以下のリファレンスで書くのに必要なメソッドを読み込む形で学習した。

## リファレンス
- [設計力を学ぶデザインドリル jQuery入門](http://www.jquerystudy.info/reference/)  
リファレンスとして個人的に一番わかりやすかった。


## Ajax
- [はじめてのAjax(jQuery)2018年版](https://qiita.com/zakiyamaaaaa/items/bdda422db2ccbaea60d9)  
WebアプリケーションでAjaxを使った非同期通信。
jQueryとPHPでの実装例。

## コンポーネント指向

1. ファイルをコンポーネントごとに分割。
2. 1つのmain.jsファイルに各ファイルのモジュールをインポートする。
3. main.jsファイルでは、jQuery オブジェクトを引数に取る即時関数内で、`$( document ).ready()` を行う。
4. 即時関数は、jQuery オブジェクトを実引数、 `$` を引数に取っている。 `$` をグローバル変数として使用しているのは、他のJavaScriptのライブラリとの衝突を防ぐためのおまじない。

```main.js
import jQuery from 'jquery';
...
($ => {
  $(() => { // = $(document).ready()
    ...
  });
)(jQuery);  // 実引数
```
みたいな感じ？

- [オブジェクトについて - 設計力を学ぶデザインドリル jQuery入門](http://www.jquerystudy.info/tutorial/intro/object.html) 
- [[コラム] 即時実行関数 - js-primer](https://jsprimer.net/basic/function-scope/#immediate-function)  
- [(function() {...})();って？無名関数・即時関数とスコープ - jQueryを書けるようになりたい(2)](https://qiita.com/CafeOreco/items/b6242c15156c4c6b5040#%E3%81%95%E3%82%89%E3%81%AB%E5%AE%89%E5%85%A8%E3%81%AA%E5%8D%B3%E6%99%82%E9%96%A2%E6%95%B0%E3%81%AE%E5%AE%9A%E7%BE%A9)
- [jQuery(callback) - jQuery() - jQuery API Documentation](https://api.jquery.com/jQuery/#jQuery-callback)

## クラス

jQueryのコードは何かとグローバルに定義されるが、再利用性の高いコードを書くためにクラスを使って責務やコンポーネントを分割するのが良い。
jQueryというよりJavaScript感はある。

参考になったリンク・サンプルはここら辺。

* [クラス - MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Classes)
* [ES6 における JavaScript のクラス定義
](https://www.yunabe.jp/docs/javascript_class_es6.html)
* [JavaScript初心者にclassを伝える - Qiita](https://qiita.com/jpnykw/items/248f99c94c00c3d1aa27)
pandasのdescribe()で'e'が出ないようにしたい

Jupyter Notebookなどを利用しているとたまに遭遇しますが、
pandasで、DataframeやSeriesを `describe()` すると、'e'（= exponential）を使った科学的な表現になることがあります。
直感的に比較しにくくて、読みにくいですよね。（これのほうが慣れている人もいるかと思いますが）

```こんなかんじ…
df['some_column'].describe()

---
count    2.143000e+03
mean     1.683770e+04
std      8.833939e+04
min      0.000000e+00
25%      0.000000e+00
50%      2.200000e+03
75%      1.140000e+04
max      3.160000e+06
```

いまいちイメージしにくいので、なんとかしたい。
この記事では、2つの方法を紹介します。

# 方法1: あらかじめオプションで設定しておく

floatの表示方法を、小数点以下2桁で設定する処理をつけておくと良いようです。

```
pd.options.display.float_format = '{:.2f}'.format

df['some_column].describe()

---
count      2143.00
mean      16837.70
std       88339.39
min           0.00
25%           0.00
50%        2200.00
75%       11400.00
max     3160000.00
```

オプションであればプロジェクト全体に適用できるので、常にフォーマットされていていい感じです。

参考: [python - How to display pandas DataFrame of floats using a format string for columns? - Stack Overflow](https://stackoverflow.com/questions/20937538/how-to-display-pandas-dataframe-of-floats-using-a-format-string-for-columns/20937592#20937592)

# 方法2: フォーマット処理を追加する

`describe()`の後ろで、フォーマットする処理をapplyしてあげます。

```
df['some_column'].describe().apply(lambda x: format(x, 'f'))

---
count       2143.000000
mean       16837.697154
std        88339.385512
min            0.000000
25%            0.000000
50%         2200.000000
75%        11400.000000
max      3160000.000000
```

必要なときだけフォーマットしたい場合には良さそうですね。

参考:
[python - dataframe.describe() suppress scientific notation - Stack Overflow](https://stackoverflow.com/questions/40347689/dataframe-describe-suppress-scientific-notation)

以上！
octaveで連立方程式を解く


### 中１レベルの連立方程式
（問題）
りんご２個とみかん８個を買うと代金は８８０円です。
また、りんご３個とみかん５個を買うと代金は７６０円になります。
りんごとみかん、それぞれ１個ずつの値段はいくらでしょう。
$$
        \begin{cases}
    2x+8y=880 \\\
    3x+5y=760 \\\
        \end{cases}
$$


```octave
x=[0:200];
y=[0:200];

# 2*x + 8*y = 880
y1 = (880 - 2*x) / 8;
# 3*x + 5*y = 760
y2 =(760 -  3*x) / 5; 

plot(x,y1, x,y2)
```


![output_3_0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74331/2c83d029-3dd3-099e-c52e-fceaa8c329b1.png)


$$
        \left[\begin{matrix}
            2 & 8  \\\
            3 & 5  \\\
        \end{matrix}\right] \quad
        \left[\begin{matrix}
            x \\\
            y \\\
        \end{matrix}\right] \quad    
        =
        \left[\begin{matrix}
            880 \\\
            760 \\\
        \end{matrix}\right] \quad
$$
<br>
$$
        \left[\begin{matrix}
            x \\\
            y \\\
        \end{matrix}\right] \quad    
        =
        \left[\begin{matrix}
            2 & 8  \\\
            3 & 5  \\\
        \end{matrix}\right] ^{-1} \quad
        \left[\begin{matrix}
            880 \\\
            760 \\\
        \end{matrix}\right] \quad
$$


```octave
A = [2 8;
     3 5];
z = [880 ;760 ];
inv(A)*z
```

    ans =
    
       120.000
        80.000

3行の簡潔なコードでりんごとみかんの値段が割り出されるのは気持ちいいですね
spring bootでメール送信

メモ

```xml:pom.xml
<dependency>
　　<groupId>org.springframework.boot</groupId>
　　<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
```
```yml:application.yml

spring:
  mail:
    host: smtp.●●.●●(gmailなら「smtp.gmail.com」)
    port: 587
    username: (メールアドレス)
    password: (パスワード)
    properties.mail.smtp.auth: true
    properties.mail.smtp.starttls.enable: true
```

```java:sample

@Autowired
    private MailSender sender;

    public void sendMail() {
        SimpleMailMessage msg = new SimpleMailMessage();

        msg.setFrom("送信元メールアドレス");
        msg.setTo("送信先メールアドレス");
        msg.setSubject("件名入力欄");
        msg.setText("本文入力欄");

        this.sender.send(msg);
    }
```

sampleはクラス内に書くこと。
EC-CUBE4で管理画面からヘッダーのロゴを変更する

ショップのロゴ部分を管理画面から画像に変更する方法です。
![TOPロゴ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/422413/9bce3068-9379-2cb0-fd98-492e5ed837c4.png)
今回変更するのは、**【EC-CUBE SHOP】**の部分です。

#まずはロゴ画像を準備しよう
まずはショップのロゴ画像を準備します。

https://www.logofactoryweb.com/
今回はLogoFactory Webというフリーでロゴが作成出来るサイトでロゴ画像を作成しました。
![logo_cold.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/422413/5ddb195b-aea4-9cec-d565-6a1d6936689f.png)

# 管理画面からロゴ画像をアップしよう
管理画面にログインし、**コンテンツ管理＞ファイル管理**より準備した画像ファイルをアップします。
後々の管理のため、今回は【logo】というフォルダを作成し、その中にファイルをアップしました。
![ファイル管理.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/422413/452dcfc5-ad37-3094-b9cf-980b22440e25.png)
アップしたファイルは上記のように表示されます。
吹き出しが出ている部分のボタンを押すとファイルパスがコピーされます。

# ロゴ画像を適用してみよう
**コンテンツ管理＞ブロック管理**に**【ロゴ】というブロック**が存在しますので、そちらをクリックしてください。

そうすると下記の様な、コードが表示されます。



```twig:logo.twig

{#
This file is part of EC-CUBE

Copyright(c) EC-CUBE CO.,LTD. All Rights Reserved.

http://www.ec-cube.co.jp/

For the full copyright and license information, please view the LICENSE
file that was distributed with this source code.
#}
<div class="ec-headerRole">
    <div class="ec-headerRole__title">
        <div class="ec-headerTitle">
            <div class="ec-headerTitle__title">
                <h1>
                    <a href="{{ url('homepage') }}">
                        {{ BaseInfo.shop_name }}　←　ここを変更します。
                    </a>
                </h1>
            </div>
        </div>
    </div>
</div>
```
ロゴ名を表示している箇所は17行目になりますので、この部分を変更します。
**※変更する際にはテキストエディターなどでも良いので、しっかりバックアップを取っておくようにしてください。**


```twig
                    <a href="{{ url('homepage') }}">
                        <img src="{{ asset('/html/user_data/logo/logo_cold.png')}}" alt="EC-CUBE SHOP demo">
                    </a>
```

ショップ名を表示している記述の部分を上記の様にimgタグに変更します。
※altの設定も忘れずに。
これを登録すれば完了です。

# TOPページを確認しよう
管理画面での登録が完了した後はTOPページを開いて変更が反映されていることを確認します。
![afterchange.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/422413/93b2ea4f-81ad-81ce-3f33-d4c65a887080.png)
以上でロゴの変更は完了です。

##　オマケ
![レイアウト管理.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/422413/93be0254-a19f-188a-0876-43402b1185e8.png)
**コンテンツ管理＞レイアウト管理**にてロゴとヘッダーのブロック位置を入れ変えることによって、簡単にサイトの雰囲気も変えることも可能です。
![layoutchange.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/422413/78a9ce3d-a3dc-aed3-b532-9e9e39c7a1bb.png)
中国でのプログラミングって(-_-;)

# きっかけ
中国でプログラミングしてもらうに当たって、必要なことをメモ。

# VPN
金盾（Great Fire Wall）といわれる、中国当局が設置した特にアメリカのサーバーアクセスへの検閲ファイアウォール。
よくGoogleやTwitter、Facebookにアクセスできないといわれるもの。

日本に自分たちで立てたVPNサーバに2019/3まではアクセスできていたが、現在アクセスできなくなった。
中国の検閲に関する問題は、日に日に厳しくなっている模様。

SoftEtherで、多分中国を意識した？VPNのサーバ群のプラグインがあるが、色々試してダメだったと聞いている。（実際ダメなのかは私が試してないので不明）
https://www.vpngate.net/ja/download.aspx

~~現時点で解決策していない。~~（色々有料のVPNサービスがあるようだが、どれもいつ使えなくなってもおかしくない状態だと思っている）
→ 2019/5現在、中国側で購入したVPNを使って解決とのこと。（あえてどこのVPNかは聞いていない）


## 今後参考にしたいなと思う記事
https://qiita.com/ymfj/items/0e22e0c9b11643a03b3d

# npm
npmはnode.jsで定番のライブラリ管理のモジュール。
node.jsとセットでインストールされるレベルの必需品。
npmがGFWの問題で正しく動いてくれないらしい。

そうしたところ、中国側で教えてくれたのが `cnpm` というもの。
なんと中国国内のnpmのミラーサイトにアクセスするためのnpmコマンドらしい。
これはちょっと驚いた。

#終わりに
cnpmの存在に驚いて、メモしとこうと書いたわけだが、composerやpipなんかも「中国用」が存在するのだろうか。

## 2020/3/11
@hayashi-ay さんから頂いたコメントからcomposerやpipも中国からアクセスできるようにしているリポジトリがあるとこと。
（コメントのリンクの張り方が分からないかったので、見たい人はスクロールしてコメント見てください）
Pythonで株価スクレイピング

# 目的
株価解析のために、全銘柄に対して過去約20年分のデータを取得し、
データベースに蓄積する。

#コード
https://github.com/jun6231jp/stocks/blob/master/scraping_stocks.py
Yahooファイナンスからスクレイピングする例である。
サーバ過負荷にならないよう、アクセス間隔をある程度空けている。
仮にサーバエラーとなった場合はリトライするようにしている。

※現在はYahooファイナンスはスクレイピングを禁止しているため、ご参考まで。

#データベース作成
株式コードに対する社名および株価を蓄積するためのデータベースを次のように作成する。

```text:stocks
names
+-------+--------------+------+-----+---------+-------+
| Field | Type         | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| id    | int(11)      | NO   | PRI | NULL    |       |
| name  | varchar(100) | YES  |     | NULL    |       |
+-------+--------------+------+-----+---------+-------+

prices
+--------+---------+------+-----+------------+-------+
| Field  | Type    | Null | Key | Default    | Extra |
+--------+---------+------+-----+------------+-------+
| id     | int(11) | NO   | PRI | 0          |       |
| date   | date    | NO   | PRI | 0000-00-00 |       |
| open   | int(11) | YES  |     | NULL       |       |
| high   | int(11) | YES  |     | NULL       |       |
| low    | int(11) | YES  |     | NULL       |       |
| close  | int(11) | YES  |     | NULL       |       |
| volume | int(11) | YES  |     | NULL       |       |
| fixed  | int(11) | YES  |     | NULL       |       |
+--------+---------+------+-----+------------+-------+
```

#実行結果
社名および各社の株価の日次データを取得できた。

```text
names
+------+--------------------------------------------------------
| id   | name                                                     
+------+--------------------------------------------------------
| 1301 | (株)極洋                                                  
| 1305 | ダイワ 上場投信-トピックス                                  
| 1306 | TOPIX連動型上場投資信託                                    
| 1308 | 上場インデックスファンドTOPIX                            
| 1309 | 上海株式指数･上証50連動型上場投資信託                    
  .
  .
  .

prices
+------+------------+------+------+------+-------+--------+-------+
| id   | date       | open | high | low  | close | volume | fixed |
+------+------------+------+------+------+-------+--------+-------+
| 1301 | 2019-05-07 | 2742 | 2786 | 2742 |  2783 |  22200 |  2783 |
| 1301 | 2019-05-08 | 2777 | 2780 | 2745 |  2774 |  23200 |  2774 |
| 1301 | 2019-05-09 | 2762 | 2772 | 2716 |  2722 |  25800 |  2722 |
| 1301 | 2019-05-10 | 2725 | 2740 | 2690 |  2690 |  42900 |  2690 |
| 1301 | 2019-05-13 | 2690 | 2826 | 2656 |  2786 |  75600 |  2786 |
| 1301 | 2019-05-14 | 2712 | 2818 | 2686 |  2810 |  50800 |  2810 |
| 1301 | 2019-05-15 | 2806 | 2824 | 2766 |  2824 |  35500 |  2824 |
| 1301 | 2019-05-16 | 2824 | 2888 | 2811 |  2851 |  55600 |  2851 |
| 1301 | 2019-05-17 | 2852 | 2887 | 2833 |  2884 |  37300 |  2884 |
| 1301 | 2019-05-20 | 2894 | 2908 | 2850 |  2853 |  16000 |  2853 |
| 1301 | 2019-05-21 | 2849 | 2856 | 2808 |  2821 |  26900 |  2821 |
  .
  .
  .
```
【Android】Databinding × レイアウトファイル(XML)で文字列を結合しつつ表示させる

databindingを使って、更に文字列を結合してtextViewに表示したかっただけなんだ...
既知かもしれんけど、結構ハマったので忘備録。。。

## はじめに書いてたレイアウトファイル
```activity_sample.xml
android:text="@{sampleViewModel.birthdayYear + '年'
              + sampleViewModel.birthdayMonth + '月'
              + sampleViewModel.birthdayDate + '日'}"
```
めっちゃエラー出た。スタックトレースは割愛ちゃん。
「構文エラー：期待してた入力じゃないです(意訳)」って言われる

```
e: [kapt] An exception occurred: android.databinding.tool.util.LoggedErrorException: Found data binding errors.
****/ data binding error ****msg:Syntax error: extraneous input '?' expecting {'(', '+', '-', '~', '!', 'boolean', 'char', 'byte', 'short', 'int', 'long', 'float', 'double', VoidLiteral, IntegerLiteral, FloatingPointLiteral, BooleanLiteral, CharacterLiteral, SingleQuoteString, DoubleQuoteString, 'null', Identifier, ResourceReference} file:/Android/Sample/app/src/main/res/layout/activity_sample.xml loc:158:40 - 158:187 ****\ data binding error ****

```
## 正解だったレイアウトファイル

```activity_sample.xml
android:text='@{sampleViewModel.birthdayYear + @string/common_year
              + sampleViewModel.birthdayMonth + @string/common_month
              + sampleViewModel.birthdayDate  + @string/common_day}'
```

いつもお世話になってるstackoverflowから[この記事](https://stackoverflow.com/questions/35097445/android-databinding-errorexecution-failed-for-task-appdatabindingprocesslayo/35571020)を発見。
databindingのバグじゃない？って書いてあるけどほんとかなー。

AndroidStudioの補完くん優秀だからだいたい `@string`の候補出してくれるけど、
この箇所に限っては補完候補全然出てこないので不安になる。タイポ注意ネ
ubuntu18.04にCabochaを導入する際のエラー

もう既出がたくさんありますが、Chabochaを導入する際に詰まったところを記しておきます.

導入の手順は公式サイトに書いてあります。
https://taku910.github.io/cabocha/
CRF++等の導入は以下を参考にさせていただきました。
https://qiita.com/osyou-create/items/4e2f686d82bf9e1166e8

環境
-

- Ubuntu 18.04
- python3.6
- CRF++-0.58 



CaboChaディレクトリ内でのmake
-
```
error while loading shared libraries:libcrfpp.so.0 : cannot open shared object file: No such file or directory
```

**解決策**
libc.confに依存関係を記入してあげる。

```bash
chmod 666 /etc/ld.so.conf.d/libc.conf
echo "/usr/local/lib">>/etc/ld.so.conf.d/libc.conf
```

以上より、無事makeが実行されました。
Pythonでの呼び出し
-

```python3

import CaboCha
>>ModuleNotFoundError  No module named '_CaboCha'
```

sudoを使わずにビルドしちゃった


```bash:
sudo python3 setup.py build_ext
sudo python3 setup.py install
sudo /sbin/ldconfig
```

これでオッケー
noobslab #1

昨日まで、unixmenの記事を読んでいたのですが、
どうも最近は更新されていないみたいなので、
noobslabを読むことにしました。

本日読んだ記事はこちら。
# PrepAway – The Best Online Platform For Cisco CCNP Routing And Switching Exam Preparation
https://www.noobslab.com/2019/05/prepaway-best-online-platform-for-cisco.html

最初は、CCNPの概要や資格取得で享受できるもの、認定プロセス(再認定含め)、試験準備が記載されていたのですが、
最終的な話としては、PrepAwayを試してみよう、という話でした。

PrepAwayはこちら。
https://www.prepaway.com/

いろいろな資格のための勉強サイトですね。試しにAWSの無料教材をダウンロードしようとしたのですが、
.eteファイルを開くのに、ソフトが必要そうなので、一旦やめました。

日本語非対応っぽいです。
「Unity」タグについて (Game Engine もしくはTest Framework) > (タグシノニム :「#Unity」「ユニティ」「MyUnity」「UnityTestRunner」)

## 対象

https://qiita.com/tags/unity

## 説明

- A. Game EngineであるUnity
- B. Test FrameworkであるUnity
    - 参考文献: テスト駆動開発による組み込みプログラミング by James Grenning

Aについての記事が大半を占めるが、探せばBの記事もある。

## タグシノニム
(2019-05-27時点)

### A. Game Engine: Unity

[https://qiita.com/tags/#unity](https://qiita.com/tags/%23unity) : 46記事

[https://qiita.com/tags/ユニティ](https://qiita.com/tags/%E3%83%A6%E3%83%8B%E3%83%86%E3%82%A3) : 4記事のみ

https://qiita.com/tags/myunity : 7of9による個人タグ(187記事)。当初、Unityタグの検索ノイズになると考え個人タグにした。その後、MyUnityのcontributionも307に増え、「Unityタグにしておけばよかった」と思っている(関連情報もあるため、今さら変更はしないが、いいねがついたものはUnityタグにする場合もある）。

### B. Test Framework: Unity

https://qiita.com/tags/unitytestrunner


## 派生タグ

https://qiita.com/tags/unity2d
https://qiita.com/tags/unity3d
[https://qiita.com/tags/#unity3d](https://qiita.com/tags/%23unity3d)
[https://qiita.com/tags/unity入門](https://qiita.com/tags/unity%E5%85%A5%E9%96%80)
https://qiita.com/tags/unityhub

## バージョン違い


https://qiita.com/tags/unity2017
https://qiita.com/tags/unity2018
https://qiita.com/tags/unity2019


### 提案 (記事執筆)

Test FrameworkのUnity記事の場合、testingタグも付けるとタグの複数検索で絞り込みが楽になると思われる。
Desktop : OpenCV Rect Contain Points

<h5>Goal</h5>
Test OpenCV rect contain points.

```OpenCV_RectangleContain.java
import org.opencv.core.*;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class OpenCV_RectangleContain {

    static {System.loadLibrary(Core.NATIVE_LIBRARY_NAME);}

    public static void main(String[] args){
        Mat img = Mat.zeros(250, 250, CvType.CV_8UC3);

        List<Integer> pointX=new ArrayList<Integer>();
        List<Integer> pointY=new ArrayList<Integer>();
        int X,Y,maxX,maxY,minX,minY;
        for(int i=0;i<20;i++){
            X=(int)(Math.random()*200+10);
            Y=(int)(Math.random()*200+10);
            Imgproc.circle(img, new Point(X,Y), 2, new Scalar(0, 255, 0));
            pointX.add(X);
            pointY.add(Y);

        }
        maxX= Collections.max(pointX);
        maxY=Collections.max(pointY);
        minX=Collections.min(pointX);
        minY=Collections.min(pointY);

        Imgproc.rectangle(img, new Point(minX,minY), new Point(maxX,maxY), new Scalar(0, 0, 255));

        Imgcodecs.imwrite("D:\\projects\\Java\\OpenCV_Samples\\resource\\imgs\\rectContainPoint.jpg", img );
    }


}
```
<h5>Result</h5>
![rectContainPoint.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276243/9f6026c2-956a-3a5d-14d0-84a9b8c77a7b.jpeg)
iMac(2017)のMojave bootcamp でWindows10インストールと格闘（解決）

6/3更新
原因は外付けＵＳＢデバイスでした。（基本中の基本）
外付けスーパードライブを外したところ無事インストールできました。
ただ、インストール後もスーパードライブを接続した状態でWindows10起動すると同様のエラーが発生します。
スーパードライブは滅多に使用しないので、必要なときだけ接続するよう運用対処します。



5/20にWindows10ライセンスを購入し、5/21以降、Appleサポートに電話すること８回、OS再インストールすること１０回以上、いまだ未解決で心が折れそうです。

以下、概ね時系列にやったこと（サポートアドバイス含む）を記載します。
読みにくい文章で申し訳ありません。

・Windows10インストールまではこぎつけるものの、Windows10初期設定（地域等）後の再起動を３回程繰り返した挙句、「Windowsは正しく読み込みできませんでした」というエラー画面が表示される。（これ以外のエラーは出たことがありません）
　→administratorが未設定の為、トラブルシューティングが実施できない。

・PRAMクリアの起動(OPT+CMD+P+R)を行うと、なぜかWindowsのRecovery画面が表示される。

以上がここ１週間共通の現象です。

5/20
　HighSierraからアップグレードインストールしたMojave上で、bootcampからWindows10をインストール。
　ISOイメージは2018年April版/2018年October版どちらもNG
　内蔵1TBのディスクはMacOSとbootcamp半々。
　FistAidを実施後、再度Windows10インストールしても状態は変わらず。

5/21
　Appleサポートに問い合わせ実施。

　Boot Camp アシスタントが反応しなくなる場合や「Boot Camp をインストールできませんでした」と表示される場合
　https://support.apple.com/ja-jp/HT209351

　とMojaveのクリーンインストールを勧められる。

　CMD + R からドライブ消去を実施した後、Mojaveのクリーンインストールを実施（成功）。
　データ復元の後、Windows10インストールを行ったが、またもエラー。。。
　上記URLの手順も試しましたがやはりエラー。

5/22
　Appleサポートに問い合わせ。
　クリーンインストール後、データ復旧前にWindows10インストールしてはと助言頂き、実施するも変わらず。

5/23
　CMD + Rで起動の後、ディスクユーティリティでボリュームを削除し再作成した後、クリーンインストールを開始すると、HighSierraのインストールが始まり焦る。
　とりあえずHighSierraのインストール後、Mojaveにアップグレードして、もう一度CMD + R起動でパーティション消去の後、クリーンインストールしたところ無事、Mojaveでクリーンインストール成功。
　期待をこめてWindows10インストールするも、またも同様のエラー。

5/24
　疲れたのでお休み。

5/25
　朝一でサポートに問い合わせ。
　指示に従い、OPT + CMD + R でネットワークブートを実施した上で、パーティション消去を実施すると、これまで消去直後でも表示されていた、未マウントの領域３個(4.5GB)がなくなっている。
　Windowsインストール時の残骸がこれで消えたのではないか（サポート）ということで、今度こそとWindows10インストールするも、、、同様のエラー。
　この日、Microsoftのダウンロードページから2018Aprilが消え、2019May版と2018October版のみになりました。
　2018 OCT版で実施したのですが、サポートさん検証機で2019May版がインストールできたということで、クリーンインストール後2019May版でインストールしてみましたが、やはりダメ。

5/26
　サポートに前日状況を報告。
　SHIFT + OPT + CMD + R でネットワークブートからHighSierraのクリーンインストールを勧められる。
　連日の格闘で疲れ果ててしまい、こちらは未実施。
　尚、5/21以降毎日のようにPRAMクリア起動(OPT + CMD + P + R)を試したましたが、リンゴマークが表示される前に、WindowsのRecovery画面が表示されてしまう件をサポートに話したが、Windowsインストール時の残骸が悪さをしているのではないかと。
　しかもPRAMクリア失敗後、OPT起動すると、Macintosh HDと共にWindowsアイコンが表示されている。（消去された筈なのに何故！！）
　前日パーティション消去して未マウント領域4.5GBがなくなった状態でも発生したことを説明しても、スペシャリストの方もう～んと口を濁すばかり。

外付けＨＤＤ２機をUSB接続していますが、Windows10インストール時は電源OFFの状態です。
サポートの方も電源ＯＦＦなら問題ないと仰ってましたが、今晩外した状態で一度試してみようかと思ってます。

エンジニアに報告してみるということなので、次回はエンジニアさん登場かな？
正直、iMac送付するのでAppleさんで直接調べて欲しいというのが本音。
gem install bundler 時のエラー対処法(Mac)

こんにちは， Rubyほぼ初心者の自分が環境構築を行ってる際にぶち当たったエラーに対する対処法をお伝えします．

今回の環境構築は次のような順番で行いました．今回エラーがでたのはこのうちの３の部分です．

環境構築手順
1. rbenvのインストール
2. rbenv経由でrubyをインストール
3. bundlerをインストール


bundlerのインストールは次のコマンドで行います．

```
(base) ****-MacBook-air:~ user$ gem install bundler
```
ところがこの操作に対して次のようなエラーが出てきてしまいました．

```
ERROR:  While executing gem ... (Gem::FilePermissionError)
    You don't have write permissions for the /Library/Ruby/Gems/2.3.0 directory.
```

**You don't have write permissions**の**write permission**というのは専門用語で書き込み許可という意味だそうです．
つまり書き込みの許可がいるみたいです．
つまり，この操作はuserの権限を越えたことをやろうとしている？？
ここでgem,rubyのPATHを確認してみます．

```
(base) ****-MacBook-air:training user$ which gem
/usr/bin/gem
(base) ****-MacBook-air:training user$ which ruby
/usr/bin/ruby
```

usrディレクトリはuserディレクトリのさらに上の階層であり，userの権限ではアクセスできない部分です．したがって，今回は，userの身分でありながら，上の階層のディレクトリにアクセスしようととしたことが原因であったとわかりました．
そもそもこのような事が起きたのは， gem install bundler をした際に，rbenv側のrubyやgemではなく， システム側(usr/bin)のruby,gemを使ってることが原因でした．
なので以下のコマンドでPATHを設定し直します．

```
(base) ****-MacBook-air:training user$ export RBENV_ROOT="${HOME}/.rbenv"
(base) ****-MacBook-air:training user$ if [ -d "${RBENV_ROOT}" ]; then    export PATH="${RBENV_ROOT}/bin:${PATH}";    eval "$(rbenv init -)";  fi
```

完了したら，もう一度rubyとgemのPATHを確認します．

```
(base) ****-MacBook-air:training user$ which ruby
/Users/user/.rbenv/shims/ruby
(base) ****-MacBook-air:training user$ which gem
/Users/user/.rbenv/shims/gem
```

これで現在，rubyとgemはrbenvのものを参照してることがわかります．

このあと 

```
(base) ****-MacBook-air:~ user$ gem install bundler
```
をもう一度試してみたところうまくいきました！
Oracle Cloudのサービスリミットを上げて！と、日本語で依頼してみた

# はじめに
Oracle Cloudも日本語対応になり、~~ちょいちょいヘンテコな翻訳を見つけますが、~~そんな産まれたてな Cloud Service? には、なんか愛着があります。そんな中 Oracle Cloud 上からサービスリミット（※）の引き上げができるようにもなりました。日本語でどこまで対応できるのだろう？と思ってしまったので、サービスリミットの引き上げを日本語で依頼してみます。

_サービスリミット：各種クラウドサービスの制限上限を変更します。昔は、SR（サービス・リクエスト）で対応していましたが、最近は、Cloud上から依頼ができるようになりました_
___詳しくは、こちら___
https://docs.cloud.oracle.com/iaas/Content/General/Concepts/servicelimits.htm

# 環境情報
- Oracle Cloud（言語設定は日本語）：＜2019/5/21に依頼しました＞

# 作業手順
- 申請（STEP1-4) ： 所要時間　５分
- 受領連絡(STEP5) ： 所要時間　申請から半日くらい
- リソース追加までの時間は、申請する内容次第。  
_受領してから対応する様なので、上記通り、半日ぐらいで追加されるものもあります_

### 1. テナント詳細メニューへ飛ぶ
「ガバナンスと管理」＞ガバナンス＞サービス制限　をポチり
<img width="359" alt="20190625-001.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108642/e80192ab-4165-2818-bc66-a904773e7d57.png">

リソースの「サービス制限」にある「サービス制限の引上げのリクエスト」をポチり
<img width="975" alt="20190521-001.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108642/f91c7ec4-432e-78a6-320f-eeb8fe137559.png">

### 2. リクエスト内容を記載
ポチるとこんな画面に遷移。日本語で必要な情報を入れてみます。
<img width="913" alt="20190521-002.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108642/367f8f99-656e-5e0a-cfa9-742a3bdbd21e.png">

### 3. 必要事項を書いてみる
簡潔に書いてみました。
![20190521-101.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108642/2e2bd68f-9347-766a-1497-4b28af08fe10.png)
「リクエストの送信」を押したら、確認のダイアログが表示されます。
<img width="459" alt="20190521-006.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108642/9664b95c-4585-de4d-7a7c-0413f3d839c1.png">

### 4. 連絡先のメールアドレスにリクエスト受領の通知が届く
私のメールボックスだと、迷惑メールに入っていました・・・。みなさま、気をつけてください…（汗）
<img width="595" alt="20190521-007.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108642/465892f5-9fc7-bb0a-306b-8d8cfe0867b8.png">
やはり、通知メールは英語だったのですね。ということで、日本語名は「？？」になっていました。。。うむ…残念。今後に期待ですね。

### 5. リクエスト受領完了通知
直接、オラクルの運用担当の方からメールを頂きました。
<img width="507" alt="20190521-009.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108642/2f70208a-89de-5843-4808-bce0052240b6.png">
１件ずつ丁寧に対応してくれているのですね。日本語メールではなかったのですが、きちんと内容を受け取って対応してもらえました。この連絡内容は個々（申請内容）で異なると思います。※機械的な文言ではありませんでした。
このメールでは、次のステップ（サービス追加）に入る連絡をもらいました。機械的ではなく人手で対応してくれるのは温かい感じがしますね。

### 6. リソース追加に関するやり取り
しばらくするとリソース追加に関するお話があります。英語メールになってしまいますが、２０２０年のオリンピックは日本で開催されますので、これを機に英語文通にチャレンジ！！(；・∀・)
<img width="870" alt="20190523-001.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108642/e7caa7b4-7791-6802-331d-49262db79c28.png">
今回は、他にもリクエストしていたのですが、すぐに対応できないリソースをリクエストしてしまったようで、リソース追加の日程について調整するやり取りが発生しました。とはいえ、人手でリソース調整してくれているので、なにかあれば連絡がもらえて丁寧だなあー（※）と思いました。
※ 全然関係ない件ですが、機械的なものだとずっと放置されてしまうことがありましたので…（愚痴です(；・∀・)）

# 感想
最後まで日本語で押し切れるかと思ったら、オペレータさんとのメールは英語になりました。とはいえ、最近は色々と便利なツールが揃っていますので、言語の壁を超えられれば、特に問題ないと思います。ひとまず、__OCI上から日本語でリソース追加の依頼は可能__です。
_※メールのやり取りも日本語でしようと思ったのですが、さすがに厳しいかな？と思ってやめてしまいました。おもてなしジャパンです（汗）_
Desktop : OpenCV Flood Fill

<h5>Goal</h5>
Test OpenCV flood fill.

```OpenCV_FloodFill.java
import org.opencv.core.*;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class OpenCV_FloodFill {

    public static void main(String[] args){
        try{
            System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
            Mat src = Imgcodecs.imread("D:\\projects\\Java\\OpenCV_Samples\\resource\\imgs\\test-floodFill.jpg");
            System.out.println("Imgproc.FLOODFILL_FIXED_RANGE="+Imgproc.FLOODFILL_FIXED_RANGE);
            System.out.println("Imgproc.FLOODFILL_MASK_ONLY="+ Imgproc.FLOODFILL_MASK_ONLY);
            Point seedPoint = new Point(85,89);
            Mat mask = new Mat();
            Rect rect = new Rect();
            Imgproc.floodFill(src, mask, seedPoint, new Scalar(0,130,120), rect, new Scalar(20,20,20),new Scalar(20,20,20), 4);
            Imgcodecs.imwrite("D:\\projects\\Java\\OpenCV_Samples\\resource\\imgs\\test-floodFill_do.jpg", src);


        }catch (Exception e){
            e.printStackTrace();
        }
    }
}
```
<h5>Result</h5>
![test-floodFill_do.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276243/44a6140d-0713-edb6-dd59-82033a901799.jpeg)
Wolfram言語が使えるようになった！（mac編, ビッグバネイト）

[ビッグバネイトとは](https://twitter.com/hanao87_0/status/842313039588147200)
ビッグバネイト元 > [実質無料でWolfram言語(Mathematicaの中身)が使えるようになったらしい](https://qiita.com/Y_F_Acoustics/items/662709fa6f31443a3e71)

これはすごい！
アカデミック利用でも高額だったあのmathematicaの核であるWolfram engineを個人利用など商用以外なら無料で使えるようになったらしい！
学生時代に使いたかった。
学生なら無料で使えていたという私立大学の友人がいつも羨ましかったんだよなあ。

## Wolframのアカウント登録
が必要です。
https://account.wolfram.com
こちらは無料なんで。
その後、mac用のwolframパッケージをダウンロードし、インストールしてください。
ここを参考に > http://support.wolfram.com/kb/46070

## Jupyter notebookで使えるようにする
ここがWindows仕様でしか書かれていなかったので（[黒木先生のサイト](https://nbviewer.jupyter.org/github/genkuroki/msfd28/blob/master/Free%20Wolfram%20Engine.ipynb)でも）。
これでMacだと、（というか自分のものだと）うまくいかなかったので。

まずは、[ここから](https://github.com/WolframResearch/WolframLanguageForJupyter)git cloneしてください。

それで、`cd WolframLanguageForJupyter`を実行し、`configure-jupyter.wls add`を実行したらうまくいくとあったのですが、、、、
`-bash: configure-jupyter.wls : command not found`
となりました。
あれれれ。

その後、色々試してみて、なんか適当に
`wolframscript configure-jupyter.wls add`
をWolframLanguageForJupyter内で実行したらうまくいきました。

```bash

$ jupyter kernelspec list
Available kernels:
  python3    ~/.pyenv/versions/anaconda3-5.3.1/share/jupyter/kernels/python3
# git cloneしたWolframLanguageForJupyter内で
$ wolframscript configure-jupyter.wls add
$ jupyter kernelspec list
Available kernels:
  wolframlanguage12    ~/Library/Jupyter/kernels/wolframlanguage12
  python3              ~/.pyenv/versions/anaconda3-5.3.1/share/jupyter/kernels/python3
```
リポジトリには`wolframscript`はオプションと書いてあったのですが、Macだといるかもしれないです。

## Jupyter notebook起動
ここまでうまくいけば
<img width="394" alt="スクリーンショット 2019-05-27 10.04.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397374/8d3bd17e-f65f-8777-1b74-888496c9c974.png">
こんな感じで、Wolframが使えるようになっています。

## 遊んでみた
リポジトリにあった例だとこんなのとか。
<img width="1126" alt="スクリーンショット 2019-05-27 10.05.43.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397374/b5c9f411-4ebb-1035-041e-25aa5ccc3068.png">

有名どこだとマンデルブロ集合
<img width="1076" alt="スクリーンショット 2019-05-27 10.09.54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397374/68ec2152-ab5d-bbe0-a3d7-0a056bc6f289.png">

ジュリア集合
![JuliaSets.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397374/85728071-a5b0-ebe5-fe6b-7cc3c354458a.gif)

# 終わりに
@Y_F_Acoustics さん、矢吹先生、黒木先生ありがとうございました！
JavaVMエラーファイルのファイル名と出力先の変更

#JavaVMエラーファイルのファイル名と出力先の変更

## ファイル名と出力先の変更
### 設定方法
hs_err_pid<pid>.logは、通常カレントディレクトリに作成されるが、ディレクトリとファイル名は任意に変更できる。
Javaアプリケーションの起動オプション「-XX:ErrorFile=ファイル名」で変更する
```java -XX:ErrorFile=/tmp/errlog%p.log HelloWorld```

%pを指定するとプロセス番号が入る。

### 確認方法
```kill -SIGSEGV <pid>```で該当プロセスにシグナルを送付する。

## コアファイルを出力する
Linuxではデフォルトではコアファイルの出力は無効になっているため、Javaアプリケーション起動前に、```ulimit -c unlimited```でコアファイルの出力を有効化ておくことを推奨する。ただし、頻発する場合はコアファイルによりディスクを圧迫することになる点に注意。

なお、現在のリミット設定がどのような値になっているかは```ulimit -a```で確認します。(コアファイルのみを確認するなら```ulimit -c```)


## 参考
* [Java Platform, Standard Editionトラブルシューティング・ガイド > 致命的エラー・ログの場所](https://docs.oracle.com/javase/jp/8/docs/technotes/guides/troubleshoot/felog001.html)
VeeValidateを使用したコンポーネントのユニットテストをする方法

# はじめに
`VeeValidate` を `Vue Test Utils` でテストができるようにしましたので備忘録として投稿します。

# `VeeValidate` を `Vue Test Utils` でテストする方法
`VeeValidate` を `Vue Test Utils` でテストするとき下記のように `xxx.spec.jp` を作ります。

```javascript
import Vuex from 'vuex'
import VeeValidate, { Validator } from 'vee-validate'
import flushPromises from 'flush-promises'
import Form from '@/components/Form.vue'

const localVue = createLocalVue()
localVue.use(Vuex)
localVue.use(VeeValidate)

describe('Form', () => {
  it('The name field is required', async () => {
    const wrapper = shallowMount(EntryForm, {
      localVue
    })

    wrapper.find('[name="name"]').setValue('')
    wrapper.vm.$validator.validateAll()
    await flushPromises()
    expect(wrapper.vm.errors.first('name')).to.equal('The name field is required.')
  })
})
```

# おわりに
VeeValidateはフォームに入力してからエラーメッセージが表示されるまでタイムラグがあります。
初めは非同期でやっていたためにエラーメッセージが表示される前にテストが終わってエラーになってしまいました。
`async` , `await flushPromises()` を追記することで解決しました。
Gitのツリー構造を確認する方法(git log --graph)

# はじめに

しがない地方大学院生をしています、Sotaです。
プログラミング初心者であるため、内容に誤りがあるかもしれません。
もし、誤りがあれば修正するのでどんどん指摘してください。
この記事は、gitを使う上で重要なコミットのツリーを確認する方法を書いていきます。

## git log
git log コマンドを使うことで今までのコミットを見ることができます。

```
✗ git log 

commit ed29ec593f8f2283e429861e4acd0565493c0acb
Author: shikanoko0-0 <fragrantolive0.0k@gmail.com>
Date:   Tue May 21 18:02:39 2019 +0900

    my name

commit 9af5aa66ec167ed54e9a4ebf27c3dcd6da4dce87
Author: reporobot <60ebe73fdad8ee59d45c@cloudmailin.net>
Date:   Mon May 20 23:40:27 2019 -0400

    Rebuilt index with carolinewangz
```
しかしこのままでは、コミットツリーがどのような構造になっているか、理解が非常に難しいです。
そこで、git log　にオプション --graph をつけます。

```
✗ git log --graph

* commit 9438ab11e429db88588209fac2db4f74f9f14a04
| Author: reporobot <60ebe73fdad8ee59d45c@cloudmailin.net>
| Date:   Tue May 21 05:09:16 2019 -0400
| 
|     Rebuilt index with shikanoko0-0
|    
*   commit 28d5786f3372bfc6a63edd9f8c85870bbbdcc937
|\  Merge: 9af5aa6 ed29ec5
| | Author: RepoRobot <reporobot@users.noreply.github.com>
| | Date:   Tue May 21 05:09:14 2019 -0400
| | 
| |     Merge pull request #29338 from shikanoko0-0/add-shikanoko0-0
| |     
| |     Merging PR from @shikanoko0-0
| |   
| * commit ed29ec593f8f2283e429861e4acd0565493c0acb
|/  Author: shikanoko0-0 <fragrantolive0.0k@gmail.com>
|   Date:   Tue May 21 18:02:39 2019 +0900
|   
|       my name
|  
```
とこのようにコミットツリーが表示され、非常に理解しやすくなります。
終了したいときは q をタイプすれば、終了できます。
その他のツリーを見やすくするオプションを紹介します。
--oneline
　一行表示
--decorate=(short|full|no)
　ブランチ名の表示形式
--date=(relative|local|default|iso|rfc|short|raw)
　日付表示

#まとめ
git log --graph を使うことでコミットツリーを簡単に確認できます。
自分はよく使うので、aliasでlgraphコマンドとして設定を作りました。
 
```
 git config --global alias.lgraph 'log --graph --oneline --decorate=short --date=short'
```
シンプルな再帰下降のサンプル（２）

力弱く ( ) に対応
---
前回は三種類のオペレータと数字1桁だけに対応したパーサを掲載し、オペレータの優先順位を解決する方法を示しました。
（[シンプルな再帰下降のサンプル](https://qiita.com/niQSun/items/2592972d28b6eb4ef3fd)）
それに優先順位を変更する'('と')'への対応を追加します。
あと / の対応とホワイトスペースの読み飛ばしも。

'('に出会ったらexpr()を呼び出します。')'も含めて対応していない文字に出会ったらexpr()から抜けてきます。
これで再帰下降っぽくなりました。


```t2.c
/*
再帰下降サンプル
cc -o t2 t2.c
*/

#include <stdio.h>

char* text="2*(3+4)*5" ;
char* ptr ;
char token ;

//	計算結果を積むスタック
int stack[32] ;
int sp=0 ;

void push(int value){
	stack[sp]=value ;
	sp++ ;
}

int pop(void){
	sp-- ;
	return(stack[sp]) ;
}


void get_token(void){
	while(*ptr==' ' || *ptr=='\t') ptr++ ;

	token=*ptr ;
	
	if(*ptr!=0){
		ptr++ ;
	}
}



void expr(void);

//	
void factor(void){
	get_token() ;
	if(token>='0' && token<='9'){
		push(token-'0') ;
		printf("number(%d)\n", token-'0') ;
		get_token() ;
	}
	else if(token=='('){
		expr() ;
		get_token() ;
	}
}

//	掛け算	
void mul(void){
	factor() ;
	while(1){
		if(token=='*'){
			factor() ;
			printf("mul\n") ;
			push(pop() * pop()) ;
		}
		else if(token=='/'){
			factor() ;
			printf("div\n") ;
			int top=pop() ;
			push(pop() / top) ;
		}
		else{
			break ;
		}
	}
}

//	足し算と引き算
void add(void){
	mul() ;
	while(1){
		if(token=='+'){
			mul() ;
			printf("plus\n") ;
			push(pop() + pop()) ;
		}
		else if(token=='-'){
			mul() ;
			printf("minus\n") ;
			int top=pop() ;
			push(pop() - top) ;
		}
		else{
			break ;
		}
	}
}

//	式の評価
void expr(void){
	add() ;
}

int main(void){
	ptr=text ;
	expr() ;

	printf("answer=%d\n", pop()) ;

	return 0 ;
}
```

解説
---

このパーサは数字一文字と四則演算のオペレータ + - * / それから ( を受け付け、算数の優先順位の通りに計算して結果を出力します。構文木は生成しません。

以下、+ ,* , (　について解説します。+と-、*と/は優先順位が同じですので、それぞれの後者は省略します。

main()からexpr()を呼んだ時にget_token()のptrは先頭の2を指しています(char text="2*(3+4)*5"の先頭の2です)。
add()の中ではまずmul()を呼び出します。これは+は expr+expr の形、たとえば 3+4 のような形をしているはずだから、まず+より左側を処理する必要があるからです。
同様にmul()も expr * expr の形をしているはずなので、まず先にfactor()を呼び出します。factor()は * よりも高い優先順位を持つモノの解析をします。
factor()は、数字が出てきたら数値をpush()して抜けます。また、開き括弧 ( が出てきたら、再帰的にexpr()を呼び出します。それ以外は単に関数を抜けてきます。

さて、最初の状態

```2*(3+4)*5 ```
```^```
でexpr()を呼ぶとexpr()→add()→mul()→factor()と呼ばれ、factor()がget_token()を呼び出したら'2'が返って来ます。factor()は2をpush()して抜けます。
戻ってきた所はmul()のwhile()です[^1]。ここまでで ＊ より左側にあって優先順位の高いものは、すべて数値になってpush()されているはずですから、* が出てきたら掛け算をしたいです。ですがまだ * の後ろの式が数値になっていません。そこで

```2*(3+4)*5 ```
```　^ ```

[^1]: ループを使うのは左再帰の解決法の１つです。

ここから後ろを数値に直すのに、もう一度factor()を呼びます。
factor()は'('が出てきたのでexpr()を呼び出します。そうすると()で囲まれた中が数値になってpush()されて帰って来ます。

mul()まで戻ってきた時には、2と(3+4)はそれぞれ数値になってpush()されていますから、それを取り出して掛け算をして、それをまたpush()します。

これでmain()に戻ってきた時には、結果がpush()されているはずです。

add()の中でmul()が2回以上呼ばれるのも、+,-の前後の式の優先順位の高い部分を数値になおすためで、mul()と同様です。
while()は、2+3+4+5 のような場合に対応する繰り返しです。

複数桁の数字への対応
---
複数桁の数字への対応はfactor()で行う方法も考えられますが、「数は'0'～'9'の1回以上の繰り返し」と定義すると、オペレータの優先順位とは関係なく解釈できます。こういう場合はget_token()の中で処理をして、「数値だよ」というステータスを付けて数値を返す方法もあります。
C言語の 0x00ff のような数も 1.2e-34 のような数も、factor()の中では数値として一律に扱えるので便利です。
複数桁の数字への対応のような処理は字句解析と言い、構文解析と切り離して処理するのが一般的です。

---

最後に [シンプルな再帰下降のサンプル（３）変数と代入](https://qiita.com/niQSun/items/89b5ceae3ce373ab1d34)で変数と代入に対応して一回りということで。
【Vue Test Utils】複数の `it` を行うと`$validator` にデータがどんどん蓄積されてしまう問題を解決

# はじめに
VeeValidateを使っているコンポーネントを対象に複数の `it` を使ってテストしています。
`$validator` が前の `it` でのデータを保有したまま次の `it` を実行するため、データがどんどん蓄積されています。
そのせいで、2つ目以降の `it` テストで期待した通りの結果が返ってこなくて `FAIL` になってしまいます。

```javascript

wrapper.vm.$validator // これにデータが蓄積されてしまう
```


# 解決方法

`$validator` がリセットされれば良いので、 ```xx.spec.js``` の中に

```javascript

  afterEach(() => {
    wrapper.vm.$validator.reset()
    wrapper.destroy()
  })
```

を入れてあげます。
これで `it` ごとに`$validator`がリセットされるようになり、期待した通りの結果が返ってくるようになりました。

# おわりに
VeeValidateを使っているコンポーネントを対象にしたテストを行うときは$validatorの状態に気をつけようと思いました。
Desktop : OpenCV Rectangle

<h5>Goal</h5>
Test OpenCV Rectangle.

```OpenCV_Rectangle.java
import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.core.Scalar;
import org.opencv.imgproc.Imgproc;
import org.opencv.core.Point;
import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;

public class OpenCV_Rectangle {
    static {System.loadLibrary(Core.NATIVE_LIBRARY_NAME);}
    private JFrame frmjavaSwing;

    /**
     *  Launch the application.
     */
    public static void main(String[] args){
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try{
                    OpenCV_Rectangle window = new OpenCV_Rectangle();
                    window.frmjavaSwing.setVisible(true);
                }catch (Exception e){
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     *  Create the application.
     */
    public OpenCV_Rectangle(){
        init();
    }

    /**
     * Initialize the contents of the frame.
     */
    private void init(){
        Mat src =  paint();
        BufferedImage image=matToBufferedImage(src);

        frmjavaSwing = new JFrame();
        frmjavaSwing.setTitle("opencv ¯x§Î½m²ß");
        frmjavaSwing.setBounds(100, 100, 300, 300);
        frmjavaSwing.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frmjavaSwing.getContentPane().setLayout(null);

        final JLabel lblNewLabel = new JLabel("");
        lblNewLabel.setBounds(5, 5, image.getHeight()+10, image.getWidth()+10);
        lblNewLabel.setIcon(new ImageIcon(image));
        frmjavaSwing.getContentPane().add(lblNewLabel);
    }
    public Mat paint(){

        Mat source = new Mat(250,250, CvType.CV_8UC3, new Scalar(255,255,255));

        Imgproc.rectangle(source, new Point(50,50), new Point(150,150), new Scalar(255, 0, 0), 5);
        return source;
    }

    public BufferedImage matToBufferedImage(Mat matrix) {
        int cols = matrix.cols();
        int rows = matrix.rows();
        int elemSize = (int)matrix.elemSize();
        byte[] data = new byte[cols * rows * elemSize];
        int type;
        matrix.get(0, 0, data);
        switch (matrix.channels()) {
            case 1:
                type = BufferedImage.TYPE_BYTE_GRAY;
                break;
            case 3:
                type = BufferedImage.TYPE_3BYTE_BGR;
                // bgr to rgb
                byte b;
                for(int i=0; i<data.length; i=i+3) {
                    b = data[i];
                    data[i] = data[i+2];
                    data[i+2] = b;
                }
                break;
            default:
                return null;
        }
        BufferedImage image2 = new BufferedImage(cols, rows, type);
        image2.getRaster().setDataElements(0, 0, cols, rows, data);
        return image2;
    }

}
```
![opencv_rectangle.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276243/135feba3-ba8f-149f-7640-b2b526814d7d.jpeg)
ABC - 127 - A&B&C

#AtCoder ABC 127 A&B&C&D
[AtCoder - 127](https://atcoder.jp/contests/abc127)

近いうちにE&Fを解きに戻ってくる。

**2019/05/27**
　Bのコード修正

#A - Ferris Wheel

```java
	private void solveA() {
		int a = nextInt();
		int b = nextInt();

		if (a <= 5) {
			out.println(0);
		} else if (a <= 12) {
			out.println(b / 2);
		} else {
			out.println(b);
		}
	}
```

#B - Algae

 - $x_{2001}=r \times x_{2000}−D$
 - $x_{2002}=r \times x_{2001}−D$
 - ・
 - ・
 - $x_{i+1}=r \times x_i−D$

```java
	private void solveB() {
		int r = nextInt();
		int d = nextInt();
		int x2000 = nextInt();

		int pre = x2000;
		for (int i = 1; i <= 10; i++) {
			pre = r * pre - d;
			out.println(pre);
		}

	}
```

#C - Prison

 - 入力例１

> 4 2
> 1 3
> 2 4

 - 1番目のゲートは1,2,3のキーで開く
 - 2番目のゲートは2,3,4のキーで開く
    - 両方のゲートを開けられるのは2,3のキー
 - すべてのゲートで使われているキーを探せばよい

||Key:1|Key:2|Key:3|Key:4|
|:-:|:-:|:-:|:-:|:-:|
|Gate:1|O|O|O||
|Gate:2||O|O|O|
|すべてを開ける鍵||↑|↑||

数字に置き換えてみた。

||Key:1|Key:2|Key:3|Key:4|
|:-:|:-:|:-:|:-:|:-:|
|Gate:1|1|1|1||
|Gate:2||1|1|1|
|合計|1|2|2|1|

合計=ゲートの数になるキーがすべての扉を開けられる。
こういうある範囲からある範囲までを足すみたいな処理は、、、いもす法が早い。

ということでいつもの参考サイトリストを貼っておく

 - 参考サイト(いもす法および累積和)
    - [いもす法](http://imoz.jp/algorithms/imos_method.html)
    - [競技プログラミングにおけるimos法・累積和問題まとめ](https://www.hamayanhamayan.com/entry/2017/07/04/020117)
    - [累積和を何も考えずに書けるようにする！](https://qiita.com/drken/items/56a6b68edef8fc605821)


```java
		int n = nextInt();
		int m = nextInt();

		//各ゲートで何番のキーが必要かのmemo用
		int[] wk = new int[n];

		for (int i = 0; i < m; i++) {
			int l = nextInt() - 1;
			int r = nextInt() - 1;
			wk[l] += 1;
			if (r + 1 < n) {
				wk[r + 1] -= 1;
			}
		}

		//
		for (int i = 1; i < n; i++) {
			wk[i] += wk[i - 1];
		}
		int cnt = 0;
		for (int i = 0; i < n; i++) {
			if (wk[i] == m) {
				cnt++;
			}
		}

		out.println(cnt);
```

#D - Integer Cards

 - カードを書き換える順番に指定はないので
    - 取り込んだカードの小さいものを大きいもので書き換えていくのがよさそう

 1. A（取り込んだカード達）を並べる（ここでは昇順）
 2. B（枚数）,C（整数）をC順に並べる（ここでは降順）
 3. Aの小さいものから順に、[B,C]と比較する
 4. 最大B枚まで、CがAより大きいかどうかを比較して、Cの方が大きいならAを書き換える
    5. 3-4を繰り返す

 - 3の箇所について、コード上は以下の処理をしているけど、これは「B,Cは降順に並べているので一度Cで書き換えた個所は、それ以降書き換えられることはない（書き換えた時のCより大きいCは出現しない）」ため
 - こうしないと余計な処理をしていて時間が足りなくなる
 
```code
 //同じところを書き換える（比較する）意味はないのでstartをずらしていく
        int start = 0;
```

 - コード全体

```java
	private void solveD() {
		int n = nextInt();
		int m = nextInt();
		long[] a = LongStream.range(0, n).map(i -> nextLong()).toArray();

		//小さい順に並べ替え
		Arrays.sort(a);

		int[][] bc = IntStream.range(0, m).collect(() -> new int[m][2],
				(t, i) -> {
					t[i][0] = nextInt();
					t[i][1] = nextInt();
				},
				(t, u) -> {
					Stream.concat(Arrays.stream(t), Arrays.stream(u));
				});

		//Cが大きい順に並べ替え
		Arrays.sort(bc, (x, y) -> -Integer.compare(x[1], y[1]));
		//同じところを書き換える（比較する）意味はないのでstartをずらしていく
		int start = 0;
		for (int j = 0; j < m; j++) {
			int max = Integer.min((start + bc[j][0]), n);
			for (int k = start; k < max; k++) {
				if (bc[j][1] > a[k]) {
					//a[i]の方が小さいのは書き換え
					a[k] = bc[j][1];
					//次のstartをずらす準備
					start = k + 1;
				} else {
					//既にソート済みなので、a[i]の方が大きいならこれ以上比較する必要なし
					break;
				}
			}

		}
		//合計
		long res = Arrays.stream(a).sum();

		out.println(res);
	}

```
【Tips】Golangでログ出力箇所のパスをログに追加する。

# お題
表題の通り。 Goでは`runtime.Caller`を使うと、その関数の呼び出し箇所の情報が取れるので、それを使う。

# 実践
ソースは下記。
https://github.com/sky0621/tips-go/tree/master/try/log

## 共通ロガー

```go:[logger/logger.go]
package logger

import (
	"fmt"
	"runtime"
)

type AppLogger interface {
	Log(msg string)
}

type appLogger struct {
}

func NewAppLogger() AppLogger {
	return &appLogger{}
}

func (l *appLogger) Log(msg string) {
	fmt.Printf("[Path:%s] %s\n", fileWithLineNum(), msg)
}

func fileWithLineNum() string {
	_, name, line, ok := runtime.Caller(2)
	if !ok {
		return "-"
	}
	return fmt.Sprintf("%s:%d", name, line)
}
```

## ドメイン層

呼び出し箇所が階層化されているケースでちゃんとログにパスが吐かれることの確認用に用意。

```go:[domain/user.go]
package domain

import "tips-go/try/log/logger"

type User interface {
	Hello()
}

type user struct {
	lgr logger.AppLogger
}

func NewUser(lgr logger.AppLogger) User {
	return &user{lgr: lgr}
}

func (u *user) Hello() {
	u.lgr.Log("Hello!")
}
```

## メイン関数

```go:[main.go]
package main

import (
	"tips-go/try/log/domain"
	"tips-go/try/log/logger"
)

func main() {
	lgr := logger.NewAppLogger()
	user := domain.NewUser(lgr)
	user.Hello()
}
```

## 実行結果

```
$ go run main.go 
[Path:〜ルートからのフルパス〜/tips-go/try/log/domain/user.go:18] Hello!
```
「[vee-validate] Validating a non-existent field: "". Use "attach()" first.」エラー問題を解決

# はじめに

VeeValidateを使っているコンポーネントをテストしたかったのですが、下記のようにエラーが吐き出されてしまいます。

```bash
[vee-validate] Validating a non-existent field: "#2". Use "attach()" first.
```

# 解決方法

テスト対象のコンポーネント側に下記の1行を追記します。

```javascript

  beforeDestroy() { this.$validator.pause() }
```

# おわりに
この答えにたどり着くまで丸二日間かかりました。
`it` を複数用意して非同期でテストを実行していたのが原因だったかなと思います。（よくわからないけど）
Rails6 のちょい足しな新機能を試す24（unfreeze_time 編）

# はじめに

Rails 6 に追加されそうな新機能を試す第24段。 今回のちょい足し機能は、 `unfreeze_time` 編です。
Rails 6.0 では、 `travel_back` の alias として、 `unfreeze_time` が追加されました。

Ruby 2.6.3, Rails 6.0.0.rc1 で確認しました。Rails 6.0.0.rc1 は `gem install rails --prerelease` でインストールできます。

せっかくなので、RSpec をインストールして試してみたいと思います。

```shell
$  rails --version
Rails 6.0.0.rc1
```

# Rails プロジェクトを作る

rspec を使うので、 `-T` オプションをつけます。

```shell
$ rails new rails6_0_0rc1 -T
$ cd rails6_0_0rc1
```

# db:create をしておく

```shell
$ bin/rails db:create
```

# Gemfile に `rspec-rails` を追加する

Gemfile に `rspec-rails` を追加します。

```ruby:Gemfile
...
group :development, :test do
  gem 'rspec-rails'
end
...
```

# bundle を実行

```shell
$ bundle
```

# RSpec の初期設定をする

```
$ rails g rspec:install
```

# spec で `unfreeze_time` を使えるようにする

spec で `unfreeze_time` を使えるように ActiveSupport::Testing::TimeHelpers を include します。

```ruby:spec/spec_helpers.rb
RSpec.configure do |config|
  ...
  require 'active_support/testing/time_helpers'
  config.include ActiveSupport::Testing::TimeHelpers
  ...
end
```

# unfreeze_time を使った spec を書く

本来は、model とか何かしらのクラスやメソッドをテストするための spec なのですが、今回は spec だけで完結させることにしました。

`before` 内で `freeze_time` を実行し、 `after` 内で `unfreeze_time` を実行する場合と、実行しない場合を書いてみました。

```ruby:spec/lib/unfreeze_time_spec.rb
require 'rails_helper'

RSpec.describe 'try to use unfreeze_time' do
  context 'when using freeze_time and unfreeze_time' do
    before :each do
      freeze_time
    end
    after :each do
      unfreeze_time
    end
    it 'time freezed' do
      t1 = Time.zone.now
      sleep 1
      expect(Time.zone.now).to eq t1
    end
  end
  context 'when without freeze_time and unfreeze_time' do
    it 'time not freezed' do
      t1 = Time.zone.now
      sleep 1
      expect(Time.zone.now).to be > t1
    end
  end
end
```

# spec を実行する

spec を実行するとオールグリーンになります。

```shell
$ bundle exec rspec -fd

try to use unfreeze_time
  when using freeze_time and unfreeze_time
    time freezed
  when without freeze_time and unfreeze_time
    time not freezed

Finished in 2.01 seconds (files took 2.01 seconds to load)
2 examples, 0 failures
```

# alias であることを確認する

オマケですが、 `unfreeze_time` が `travel_back` の別名であることを確認しておきます。

```irb
$ irb -ractive_support/testing/time_helpers
irb(main):001:0> ActiveSupport::Testing::TimeHelpers.instance_method(:unfreeze_time).original_name
=> :travel_back
```

# 試したソース

試したソースは以下にあります。
https://github.com/suketa/rails6_0_0rc1/tree/try024_unfreeze_time

# 参考情報

* [What is new in Rails 6.0](https://bogdanvlviv.com/posts/ruby/rails/what-is-new-in-rails-6_0.html)
* [Add #unfreeze_time to ActiveSupport::Testing::TimeHelpers](https://github.com/rails/rails/pull/33813)
最近コードの書き方で困っていることメモ


#最近コードの書き方で困っていることメモ

クラスの関数（メソッド）内に様々な記述をすると、
なぜかスゲー汚く見える。
特に、メソッド内が長くなる時、
{
    １.スクロールが大変になる。
    ２.どんな関数があるか一目でわからない
}



これって他に関数を作ってそこで色々するべきなのでしょうか？
それとも他の解決法があるのか？
を、解決したらまた変更する予定

また、アドバイス等あればよろしくお願いします。

具体例

```c#
public class DataImporter{
    
    public DataImporter(){
        
    }

    public LoadData(string[] filepath){
        ...すごーい長い処理
    }

    public SortData(){
        ...すごーい長い処理
    }
    ....1000行は続く
}
```
Netlifyのプレビューは、 検索エンジンにインデックスされないように配慮されている

## どういうことか？

https://deploy-preview-27--xxxxx.netlify.com のような、NetlifyのプレビューのURLは検索エンジンにインデックス化されないようになっているようです。

## 仕組み

`X-Robots-Tag: noindex`というヘッダを返してくれるようになっています。これによりインデックス化されないようです。

以下のGoogle Developersに'X-Robots-Tag'に関して詳しく説明があります。
<https://developers.google.com/search/reference/robots_meta_tag#x-robots-tag-http->

## robots.txt

`robots.txt` との併用は避けたほうが良いという記述をいくつか目にしました。そのうちのいくつかを紹介します。

> 注意点として、X-Robots-Tagで指定したコンテンツをrobots.txtでブロックしてはいけない、という点があります。
>
> robots.txtでブロックしてしまうと、そのコンテンツをクローラは取得しようとしないのでHTTPヘッダーを送ることができません。

引用元: https://www.suzukikenichi.com/blog/how-to-use-x-robots-tag/

リンクだけでもGoogleは表示するみたいな話があります。参考にしている記事自体が2009年なので仕様とか変わっているかもしれません。
参考: <https://www.suzukikenichi.com/blog/why-pages-blocked-by-robots-txt-show-up-on-serps/>

また違う2016年に書かれた記事では、Googleのドキュメントで「検索結果でウェブページを非表示にする目的にrobots.txtを使用しないでください。」と書かれていることを主張しています。

参考：<https://sevenb.jp/wordpress/ura/2016/07/06/webgoogle%E3%81%A8%E3%81%8B%E3%81%AE%E3%82%A4%E3%83%B3%E3%83%87%E3%83%83%E3%82%AF%E3%82%B9%E6%8B%92%E5%90%A6%E3%81%AFrobots-txt%E3%81%98%E3%82%83%E3%81%AA%E3%81%8F%E3%81%A6x-robots-tag%E3%82%92/>

現在2019年のGoogleのドキュメントにも、検索ページで非表示するするためには別の方法を、といった内容が書かれています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84451/c719c8d8-4594-9661-f04a-c37bc355ffaa.png)

引用元： <https://support.google.com/webmasters/answer/6062608>

## 知ったきっかけ

[NetlifyのブランチデプロイのURLはいつまでアクセスできるか？](https://scrapbox.io/nwtgck/Netlify%E3%81%AE%E3%83%96%E3%83%A9%E3%83%B3%E3%83%81%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4%E3%81%AEURL%E3%81%AF%E3%81%84%E3%81%A4%E3%81%BE%E3%81%A7%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%81%A7%E3%81%8D%E3%82%8B%E3%81%8B%EF%BC%9F) について疑問をもって、公式サポートから教えてもらいました。