OmniAICreator/Qiita-1.07M huggingface dataset:
Laravel　検索機能　複数条件

##はじめに

Laravelアプリにて、複数条件の検索機能を実装しました！
文字とカテゴリーの２つで検索出来る仕様です！

始め（修正前）はコントローラー/モデルで下記のように、条件毎でメソッドを分け記述していました。(メソッド名は気にせず)

```QuestionsController.php（修正前）
class QuestionsController extends Controller
{
    private $question;
    private $category;

    public function __construct(Question $question, Category $category)
    {
        $this->question = $question;
        $this->category = $category;
    }

   public function index(Request $request)
   {
        //カテゴリー一覧を表示するため、カテゴリーモデルでデータを連想配列で取得するメソッド
        $categoryNames = $this->category->カテゴリー名取得メソッド();

        $keyword    = $request->input('キーワード');
        $categoryId = $request->input('カテゴリー');

        if (isset($keyword) && isset($categoryId)) {
            $questions = $this->question->なんちゃらメソッド１($keyword, $categoryId);
        } elseif (isset($keyword)) {
            $questions = $this->question->なんちゃらメソッド２($keyword);
        } elseif (isset($categoryId)) {
            $questions = $this->question->なんちゃらメソッド３($categoryId);
        } else {
            $questions = $this->question->all();
        }

        return view('question.index', compact(['questions', 'categoryNames']));
    }
}
```
モデル

```questiion.php（修正前）
class Question extends Model
{
    public function なんちゃらメソッド1($keyword, $categoryId)
    {
        return $this->with(['紐づくデータ'])->where('title', 'LIKE', '%' . $keyword . '%')
                                         ->where('category_id', '=', $categoryId)
                                         ->get();
    }

    public function なんちゃらメソッド2($keyword)
    {
        return $this->with(['紐づくデータ'])->where('title', 'LIKE', '%' . $keyword . '%')->get();
    }

    public function なんちゃらメソッド3($categoryId)
    {
        return $this->with(['紐づくデータ'])->where('category_id', '=', $categoryId)->get();
    }
}
```

今回は条件が２つなので上記の記述量で収まっていますが、検索条件が増えた場合、メソッドと条件分岐をその都度書き足す必要が出てきます。
めんどくさいですし、コントローラがファットになってしまいます。

複数条件での検索を探す中で、クロージャやorWhereなど色々出てきましたが、わからず。。
最終的に下記の記述に書き直しました！

```QuestionsController.php（修正後）
class QuestionsController extends Controller
{

   <--- 略 --->

   public function index(Request $request)
    {
        $categoryNames = $this->category->カテゴリー名取得メソッド();

        $questions     = $this->question->なんちゃらメソッド($request);

        return view('question.index', compact(['questions', 'categoryNames']));
    }
}
```
モデル

```Question.php（修正後）
class Question extends Model
{
    public function なんちゃらメソッド($request)
    {
        $keyword    = $request->input('キーワード');
        $categoryId = $request->input('カテゴリー');
        $query      = $this->with(['紐づくデータ', '紐づくデータ']);

        if (isset($keyword)) {
            $query->where('title', 'LIKE', '%' . $keyword . '%');
        }

        if (isset($categoryId)) {
            $query->where('category_id', '=', $categoryId);
        }

        return $query->get();
    }
}
```

inputでの値の抽出もモデルに記述し、なるべくコントローラーのコードを減らしました！
eagerロードで紐づく値を取得したものを$query変数に代入し、条件が入力されていればその条件にあったSQLの処理が走ります！

このように書けば、メソッド毎に処理を追うこともなくなり、条件が増えた場合の追加が楽、可読性向上などのメリットがあると思います！

改善点あればご教示お願い致します！
【CSS】背景を斜めにする（備忘録）

※あくまでも自分の備忘録用であり、お役に立たない場合やブラウザによって綺麗に斜め背景にならない場合があります。あらかじめご了承ください。

##完成イメージ

<img width="920" alt="BCBF5C6C-CF72-4268-97E9-FA40AA8CC9B7.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438447/3d1882f3-8f8c-1b15-ff62-2414ac7f025b.png">


##使用の意図
-躍動感を出す、デザインセンス向上のため。
-若者向けやビジネス系に多い印象。

##作り方
擬似要素（::beforeもしくは::after）で図形を作って、背景に覆うように配置する。

##コード
###HTML
```ruby:qiita.rb
<div class="contents">
    <h2>Contents</h2>
    <div class="card-contents"></div>
</div>
```

###CSS
```ruby:qiita.rb
    .contents {
      max-width: 960px;
      margin: 0 auto;
      padding: 60px 20px 20px;
      overflow: hidden;
      position: relative;
      background: rgba(26,161,230,.25);
    }

    .contents h2 {
      margin: 200px auto 0;
      text-align: center;
    }

    .contents-inner {
      max-width: 340px;
      margin: 0 auto 20px;
      position: relative;
    }

    .contents-inner {
      position: absolute;
      top: -416px;
      left: -300px;
      -webkit-transform: rotate(-10deg);
      transform: rotate(-10deg);
      width: 400%;
      height: 200px;
      background: #fff;
      content: "";
    }

```

##最後に
これを作った後に回転で図形を作って覆う方法はよくないと書いてありました。（おそらく臨機応変さにかけるという意味）
[参照](https://haniwaman.com/background-skew/)
 一つの方法としてこういう作り方もあるよということで、残しておきます。
CircleCIでUnable to locate package

# 発生したエラー

あるとき突然CircleCIのビルドができなくなってしまいました。

```yaml:.circleci/config.yml
run: sudo -E apt-get install -y libpng-dev libjpeg-dev
```

エラー文は

```zsh
#!/bin/bash -eo pipefail
sudo -E apt-get install -y libpng-dev libjpeg-dev
Reading package lists... Done


Building dependency tree       


Reading state information... Done

E: Unable to locate package libpng-dev
E: Unable to locate package libjpeg-dev
Exited with code 100
```

# 解決策

aptのリポジトリ情報を更新するコマンド`apt-get update`を追加

```yaml:.circleci/config.yml
run: sudo -E apt-get update
run: sudo -E apt-get install -y libpng-dev libjpeg-dev
```
Facebook、Twitterボタンのサンプル

#ボタンの作成手順

###1. ボタンの作成
htmlでボタンを作成する
`<a href="#" class="btn facebook"></a>`

###2. CSSの指定
facebookボタンに`#3b5998`、twitterボタンに`#55acee`を指定する。

#Font Awesomeの導入手順

###1. Font Awesomeの導入

`<link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.min.css">`
をHTMLに読み込む。

###2. クラスの指定
`<span>`タグにfaクラスとfa-アイコン名　クラスを指定する
※クラス名のはFont Awesomeのサイトを参照

#サンプル
```html:index.html
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Title</title>
    <link rel="stylesheet" href="stylesheet.css">
    <!-- ここでFont Awesomeを読みこむ -->
    <link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.min.css">
  </head>
  <body>
    <header>
    </header>
    <div class="top-wrapper">
      <div class="container">
        <div class="btn-wrapper">
          <a href="#" class="btn facebook">
            <!-- ここに<span>タグを追加 -->
            <span class="fa fa-facebook"></span>
            Facebookで登録
          </a>
          <a href="#" class="btn twitter">
            <!-- ここに<span>タグを追加 -->
            <span class="fa fa-twitter"></span>
            Twitterで登録
          </a>
        </div>
      </div>
    </div>
  </body>
</html>
```

```css:stylesheet.css
.btn {
  padding: 8px 24px;
  color: white;
  display: inline-block;
  opacity: 0.8;
  border-radius: 4px;
}

.btn:hover {
  opacity: 1;
}

.facebook {
  background-color: #3b5998;
  margin-right: 10px;
}

.twitter {
  background-color: #55acee;
}

.fa {
  margin-right: 5px;
}
```
採番したUniqueIdをHtmlに含めてはいけない

# 採番したUniqueIdをHtmlに含めてはいけない
先日レガシーシステムでトラブルにぶつかったので。

## TL;DR
* Safariなど一部のブラウザはキャッシュがやたら強いので、採番した一意IDをHTML上の要素として渡すと過去に採番したものを持ってきてしまう可能性がある
* クエリパラメータでキャッシュの利用を抑制したり、jsで取得するなどcacheに影響されない工夫が必要

## 遭遇した事象
phpを利用した申し込みシステムにおいて、毎回新規に採番されるはずのtokenが重複した場合にのみ発生するエラーがたまに発生していました。
tokenはランダム32桁の文字列+生成時刻のエポックミリ秒のため、重複することはほぼあり得ません。

### tokenの出所
token自体は申し込み画面に入るタイミングでサーバーサイドで採番され、
Html上のhiddenなinputとしてブラウザ側に渡されていました。
ヘッダにno cacheはついているので、基本的に毎回新たに採番されます。

### 戻るボタンではない
当初は戻るボタン関連の問題かと思ったのですが、
ログに出てきたエラー時のtokenの日付を見る限り、採番後数日経ってからエラーが発生したケースもありました。
単純に申し込み後に戻ってもう一度押してしまったわけではなさそうです。

### ブラウザに依存している
基本的に問題が発生しているのはiphoneのSafari。
ただし、常に発生しているわけではない。

## 原因
iphoneのsafariで2回目の申し込みをした場合、
1回目の申し込みのキャッシュが残っており同一番号で重複申請してしまっていた。

iphoneのSafariのcache機構はやたらと強力で、
Headerにちょっとno cacheを加えたくらいではcacheから読み込んでくるようです。

参考:
https://www.ituki-yu2.net/entry/iPhone_no_cache

## 対応
レガシーシステムで仕様が不明確だったので、一旦遷移時にクエリパラメータを付けて無理やりキャッシュを利用しないように対応しました。
ただ、本来はキャッシュされる可能性のある部分を使って一意識別子を渡すこと自体を本来は避けるべきです。
AutomatorでGoogle CloudPrint用のプリントプラグインを作る

会社の業務用共有プリンターがどれもmacosに対応していないので、仕方なく毎回PDFにしてGoogle CloudPrintを利用してWindows機から印刷していたのですが、「プリントプラグイン」を作成してみたら便利になったので手順を紹介します。

# 現在の手順

- 印刷からPDFを選択
- デスクトップにPDF書き出し
- Chromeを開いてPDFをドロップ
- 印刷
- PDFファイルを削除

微妙にめんどくさいです。毎回PDFを選んでいたのですが、選択の中に「プリントプラグイン」というものがあったので、調べて作ってみることにしました。

# 作成

##  Automatorを開く

- /Application/Automatorを開きます。
- 「新規作成」で「プリントプラグイン」を選択

<img width="520" alt="スクリーンショット 2019-07-09 15.55.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14768/9a76abb5-31d9-3a1d-195d-ea4d9182c3f4.png">

## ワークフローを作成

- ライブラリーから「Finder項目を開く」を選択
- 「このアプリケーションで開く」 で「その他」を選び、Google Chromeを選ぶ

<img width="592" alt="スクリーンショット 2019-07-09 16.04.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14768/de8bb843-8c3b-fec8-58ff-594a39fe9423.png">

- 保存します

<img width="508" alt="スクリーンショット 2019-07-09 16.05.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14768/ca08e433-a8b8-69be-2014-b7de4a14bdfa.png">

# 実行

- 印刷メニューから確認します

<img width="235" alt="スクリーンショット 2019-07-09 16.06.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14768/af235b18-54d2-4a50-92b3-12beb9230ee7.png">

# 保存パス

以下にありました。
```/Users/[ユーザー名]/Library/PDF Services/```

# あとがき

おもったより簡単にできたので、ぜひ作ってみてください。
IntelliJ IDEA で　JavaSDKを変更する

はまったのでメモ


File > Project Structure 

<img width="453" alt="スクリーンショット 2019-07-09 16.10.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49910/2d73a37d-338e-a320-4601-cd85a8fccce4.png">

開いたウィンドウで、Project Settings > Project > Project SDK

<img width="691" alt="スクリーンショット 2019-07-09 16.11.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49910/5a9072f3-689c-33bd-954e-6cb230545137.png">


ここでインストールされてるJDKを選択する
Macでpip3が使えなくなった

環境: Mac Mojave, Homebrew
Homebrewでインストールしたpip3がいつの間にかパスが通っていなくて使えなくなっていた。python3やモジュールのimportは正常で可能。

```
$ brew reinstall python
```
とすると、 

```
...
Warning: The post-install step did not complete successfully
You can try again using `brew postinstall python`
```

と警告がでた、ここでファイルのPermission Deniedが出たいたので、ひとつずつdeniedされたファイルが入っているディレクトリを

```
$ chown -R username DeniedDirectoryPath
```
としていき所有者を変えていくと、postinstallに成功した。(前回のインストール時に変なことをして、所有者がrootになった？）

このタイミングで、pip3へのパスが通ったが、pip listしようとすると、

```
ValueError: ("Missing 'Version:' header and/or METADATA file at path: /usr/local/lib/python3.7/site-packages/-ip-19.0.1.dist-info/METADATA", Unknown [unknown version] (/usr/local/lib/python3.7/site-packages))
```

とエラーが出た。
[pipでAttributeError: _versionが出たときの対応](https://qiita.com/yagays/items/349591ba485501bf2c9e)を参考に、-ip-19.0.1.dist-infoをip-19.0.1.dist-infoに名前を変更し、再び、pip listすると、

```
No such file or directory: '/usr/local/lib/python3.7/site-packages/ip-19.0.1.dist-info/METADATA'
```
とエラーが出たので、ip-19.0.1.dist-info/pip-19.0.1.dist-info内のファイルをip-19.0.1.dist-info直下にコピーしたら、これでpip3が正常に動くようになった。

PC中にファイルがばらまかれていて、フォルダの依存関係がてんで分かりません。再起動時にlogが消えてしまったので具体的なエラーは消えてしまいましたが、誰かの救いになれば幸いです。
HTMLでスペースをいれる

#HTMLでスペースをいれる

しょっちゅう検索して探してるものだから…メモ。

```
『 &ensp; 』　半角スペースより少し広い空白
『 &emsp; 』　全角スペースとほぼ同じ大きさの空白
『 &thinsp; 』　&nbsp;の空白より小さい空白
```

<br>
もしくは

```
<span style="margin-left: 20px">なんとかについて</span> 
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307441/82f7ef3b-e3d8-b46a-345d-dce1362e507e.png)
 
`<span>`で囲った「なんとかについて」の前（赤枠）が、margin-left:20pxによって20pxあく。

<br>

```
<h2 style="margin-left: 20px">なんとかについて</h2>
```
`<h1~5>`タグも使える。


<br>
NativeScriptのMarshalling (暗黙的型変換)について

NativeScriptでは、iOSやAndroidのSDKのAPIを直接JavaScriptやTypeScriptから呼び出すことができるが、JavaScriptとObjectiveC、JavaScriptとJavaという違う言語同士なのにこういったことが出来るのは、よく考えると凄いことではないだろうか。

# 型変換(Marshalling)って？

NativeScriptではネイティブ側とJavaScript側で関数呼び出しをする際に、暗黙的(自動的)に型変換を行ってくれる。これをMarshalling(マーシャリング)という。これにより、

NSString (iOS) ⇒ string (JavaScript) 
NSInteger (iOS) ⇒ number (JavaScript) 
java.lang.String (Android) ⇒ string (JavaScript)

というような変換がなされる。

# Marshallingを体感する

iOSのアプリで、plistに設定した自分自身のバージョン情報を取得してみよう。
まずObjective Cでは以下のような処理でバージョン番号を取得する

```objc
NSString *build = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];
```

戻り値はNSString型になっているのがわかる。
これをNativeScriptでTypeScriptで実装すると以下のようになる。

```ts
const bundleVer = NSBundle.mainBundle.infoDictionary.objectForKey("CFBundleVersion");
console.log("BUNDLE VER = ", bundleVer, typeof(bundleVer)); // => BUNDLE VER = 1.0.0 string
```

ここで、変数bundleVerはstring型になっていることに注目。NSString -> string(javascript) への型変換が自動で行われていることがわかる。

ちなみに、TypeScript側のコードをもう一度見てほしい。

```ts
objectForKey("CFBundleVersion")
```

objectForKeyというメソッドはiOS側のメソッドだが、それに対してJavaScriptの"CFBundleVersion"というstringを渡している。ここで行われていることは、JavaScriptのstring型からNSString型への暗黙的変換だ。つまり、MarshallingはJavaScriptの型からネイティブの型への暗黙的変換も行ってくれている。

これがあるため、NativeScriptからは非常にシームレスにネイティブのSDKを呼び出すことができ、ネイティブのSDKの戻り値をスムーズにJavaScript側で扱うことができるのだ。

# NativeScriptで扱えない型もある

いくつかのプリミティブな型はNativeScriptでは扱うことができない。例えば、iOSにおける int64_t や　long double といった非常に桁数の多い型等が該当する。

詳しくは以下を参照してほしい。
https://docs.nativescript.org/core-concepts/ios-runtime/Limitations

# ネイティブの型を直接操作したいときは

例えばAndroidで、JavaのStringオブジェクトの`hashCode`メソッドを直接叩きたいときなど。

以下で動くような気がするが

```ts
const s = "hoge";
console.log("hash = ", s.hashCode() ); // hashCodeメソッドを叩くつもり ... 
```

これはエラーとなる。

なぜなら上のコードは全て「JavaScriptエンジン上で動いている」ため、Marshallingが動いておらず、変数sは、ただのJavaScriptのstringオブジェクトにすぎないのだ。正しく動作させるには、JavaのStringオブジェクトを手動で作ればよい。

```ts
const s = new java.lang.String("hoge");
console.log("s => ", s ); // => s =>  hoge
console.log("string hash = ", s.hashCode() ); // => string hash =  3208229
```

## Marshallingを使いこなせると、NativeScriptの幅が広がる

Marshallingの仕組みを知ると、NativeScriptが"Native"Striptである所以がわかるだろう。Marshallingを使いこなして、JavaScriptでネイティブの機能をガンガン使ったアプリを開発してみてほしい。
QuantXアルゴリズム作成者に向けて

#はじめに

QuantXではアルゴ開発者に向けて様々なコードと解説を用意しています。
アルゴリズムに使える指標、利用できるデータセットはQuantXのドキュメントに記載されています。ドキュメントには、サンプルコードとそれについての解説もあります。
また、まずはテンプレートの値を動かして、色々触ってみたい人に対しては、アルゴリズム作成の時に出てくる、テンプレートコードとそのノートを参考にすることが出来ます。
さらに、実際作っていく上で、ヘルプからいくつかの代表的なサンプルコードを参考にすることもできます。

QuantXが用意しているコードと解説について、詳しくは[こちら](https://qiita.com/kei-tenniaco/items/2010906595d689441ec3)をご覧ください。

##python初心者に向けて
QuantXはpythonを使用してアルゴリズムを作成します。そのため、pythonとデータ分析によく用いられるpandasやtalibを勉強することで、株売買のアルゴリズムを作ることが出来ます。
以下の記事はpandasについての解説記事です。これを読むことでも、QuantXでよく使用するpandasを学ぶことが出来ます。
・[QuantX Factory、pandasチュートリアル1](https://qiita.com/kei-tenniaco/items/9578d7285c4c3f483f44)
・[QuantX Factory、pandasチュートリアル2](https://qiita.com/kei-tenniaco/items/7f3ed0d3d89febca8794)
・[QuantX Factory、pandasチュートリアル3](https://qiita.com/kei-tenniaco/items/0d98788f19845bf1f7d7)

##QuantX Factoryを初めて使う人に向けて

QuantXはpythonを使用して、株売買のアルゴリズムを作成することが出来ますが、pythonとは異なるいくつかの注意点があります。
また、2019年5月末に0.0.1から0.0.5へエンジンの改装が行われました。0.0.5エンジンは0.0.1からいくつか改変が行われているので、注意が必要です。（本記事のQiitaリンクの中には0.0.5エンジンに対応していないものがいくつかあります。今後編集予定ですが、注意をよろしくお願いいたします。）

###特殊ルールまとめ
・[【QuantX】売買注文order関数の種類](https://qiita.com/riyang/items/3be06fc615025f7ee646)
・[QuantXでこの変数なんだよって思ったものリスト](https://qiita.com/investor-gon/items/b3581edf3a2c65e6a3ff)
・[QuantXでのデバッグについて](https://qiita.com/akihirosasaki/items/b53d4bbebaf1c01159c1)
・[QuantXでNaNをカウント](https://qiita.com/katakyo/items/129e26b2f43194627f1e)
・[QuantX SDK チョットワカル になりたい](https://qiita.com/17zuma_241/items/1f4488ab6db8b418db28)

###QunatX0.0.5エンジンについて
・[QuantX maron0.0.5 に移行する](https://qiita.com/katakyo/items/12b41fec940a3bac1142)
・[QuantXで指値注文](https://qiita.com/katakyo/items/3a18f026a10bdd7e182a)

###基本的なアルゴリズム
移動平均、BBANDS、AROONOSC、HILBERT TRANSFER についてはヘルプにサンプルコードとノートに解説がありますが、より、詳しいものやこれらを発展させたものは、以下のQiita記事にあります。これらを参考にすることも出来ます。
・[ブル・ベアファンド自動裁定 〜はじめの一歩〜](https://qiita.com/Ric418/items/ac539b72f6368079b400)
・[QuantX FactoryでMACDのアルゴリズムを作ってみよう。](https://qiita.com/katakyo/items/63e4c6461a0c8ac861d6)
・[RSIっていう指標、長期短期で使ってみた](https://qiita.com/Ric418/items/81f6d5d7521305511e15)

また、これらの記事は0.0.1エンジン対応のアルゴリズムになります。
これらのコードを0.0.5に対応させたものは以下の記事になります。
・[QuantXで基本的なアルゴリズムを0.0.5エンジンに対応させる](https://qiita.com/Miku_F/items/c91655a60d2bb787851f)

###良いアルゴリズムを考える
QuantXでは作ったアルゴに対して、アルゴ開発画面で、過去の株価データを利用して、自分の開発したアルゴリズムのパフォーマンスを期間や初期資金量を設定して検証することができます。この結果を受けて、自分のアルゴを改良していくことになります。
売買アルゴについての評価項目は多岐にわたるため、簡単に考えることは難しいですが、一例としての評価基準が以下になります。これが絶対的な正解ではないのですが、自分のアルゴを評価するうえで、参考にすることが出来ます。
・[QuantXでより良いアルゴを作成する](https://qiita.com/Miku_F/items/5b77c85db2a74bb708e5)

###もっと詳しく知りたい方へ
Smart Trade社では、インターン生が日々学んだことをQiitaにまとめています。これらの記事は[こちら](https://qiita.com/KKkbt/items/58e76c6a1465fe1eb14c)と[こちら](https://qiita.com/Miku_F/items/ff8051998dce77915790)にまとめてありますので、より詳しく知りたい方はご覧ください。

##勉強会のお知らせ
Smart Trade社では、水曜日に勉強会を開催しています。詳しい日程、勉強会の内容については[connpass](https://python-algo.connpass.com/)をご覧ください。
QuantX Factory、pandasチュートリアルを終えたら

# この記事について
QuantX Factoryにてシステムトレードアルゴリズムを開発したい人向けのチュートリアルです。pandas初心者の方は、まずQuantX Factory用、pandasチュートリアル1~3から始めましょう！

1, [pandasチュートリアル1](https://qiita.com/kei-tenniaco/items/9578d7285c4c3f483f44)
2, [pandasチュートリアル2](https://qiita.com/kei-tenniaco/items/7f3ed0d3d89febca8794)
3, [pandasチュートリアル3](https://qiita.com/kei-tenniaco/items/0d98788f19845bf1f7d7)

# 目標
この記事では、pandasチュートリアルを終えた人が、次に取り組むことをまとめています。
pandasチュートリアルで学んできたことを用いて、QuantX Factoryアルゴリズムがどのように動作しているのか、確認してみましょう！

# 取り組み事項（時系列順）
**1、QuantX Factory公式ドキュメントの読破**
**2、サンプルアルゴリズムによる動作理解**
**3、Qiita記事を利用して、アルゴリズム作成プロセスの把握**
**4、実際にアルゴリズムを作ってみる**

# １、[QuantX Factory公式ドキュメント](https://factory.quantx.io/handbook/ja/)の読破
まずは、QuantX Factoryのアルゴリズムに関する、公式の解説を読破しましょう。**"移動平均を利用したサンプル"**に関して詳細に解説したものです。pandasチュートリアルで学んだ知識を使って、QuantX Factory特有の動作や、データ構造を学びましょう。



# ２、サンプルアルゴリズムによる動作理解

次に実際にサンプルアルゴリズムのコードを見て、より理解を深めていきます。
まずは、QuantX Factoryのサイトを見てみましょう！
https://factory.quantx.io/

<img width="1440" alt="スクリーンショット 2019-07-09 10.49.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/383100/9a392347-0b9d-20c0-2153-9b1e7fb11af8.png">

赤丸で囲んである"開発デモを体験する"をクリックしてください。

<img width="1440" alt="スクリーンショット 2019-07-09 10.49.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/383100/3c6f06ef-f890-ab95-8a7d-edff4bfd2b75.png">
サイトの指示に従って、アルゴリズム記述欄や、テストなどの基本操作方法を確認しましょう。


<img width="591" alt="スクリーンショット 2019-07-09 10.49.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/383100/46e3ae98-de22-8245-b080-35a6fb93ab97.png">

確認が終わったら、右上の"ヘルプ"へカーソル移動してみて下さい。サンプルアルゴリズムが複数表示されます。
pandasチュートリアルで学んだことを生かして、まずはサンプルアルゴリズムの動作を理解しましょう！！

**BBANDSを利用したサンプル**を選択してみた例
<img width="1440" alt="スクリーンショット 2019-07-09 11.20.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/383100/194ff823-6e9c-f056-4ba0-6c980faa91a3.png">
サンプルアルゴリズムを開くと、ノートというメニューが存在します。（写真赤丸部分）
これをクリックしてみましょう。

<img width="819" alt="スクリーンショット 2019-07-09 15.10.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/383100/59525c9b-e104-77bb-1045-59dc38940166.png">
すると、アルゴリズムの詳しい説明が表示されます。

どのサンプルアルゴリズムにもノートが存在し、詳しく解説されているので、これを使って、サンプルアルゴリズムの動作理解を行いましょう！！！

# ３、Qiita記事を利用して、アルゴリズム作成プロセスの把握
Qiitaの[QuantXページ](https://qiita.com/tags/quantx)にて、これまでのインターン生がまとめた記事が多数存在します。
これらの記事を読んで、実際に指標を用いてアルゴリズムを作成するプロセスを学びましょう。

# ４、実際にアルゴリズムを作ってみる
さあ、ついに自分でアルゴリズムを作成する時がやってきました。
QuantX Factoryにて、新規プロジェクトを作成し、自分の戦略に乗っ取ったアルゴリズムを作ってみましょう！！
＊注、新しいプロジェクトを作成する際は、0.0.5を選択しましょう。QuantX Factoryでは、新エンジンがリリースされました。注文方法の多様化や、シグナル重複の予防など、様々な点で旧エンジンより優れているので、ぜひこちらをしようしましょう。

<img width="720" alt="スクリーンショット 2019-07-09 15.25.43.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/383100/e8103550-484f-7b18-0779-9c848d559168.png">
0.0.5を選択して、

<img width="1440" alt="スクリーンショット 2019-07-09 15.27.30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/383100/c096debf-a9d4-8c3f-98a5-480bd5f0dfda.png">
こちらが、デフォルトのフォーマット状態。
**こちらでも、ノートを選択することで、新エンジンのより詳細な説明を得ることができます。**
このドキュメントを参考に、自分のアルゴリズムを作ってみて下さい。

さあ、こちらでチュートリアルは以上になります。
公式販売アルゴリズム作成を目指して、優良なアルゴリズムを生み出しましょう！！！
背景画像の上にテキストをかぶせる

背景画像の上にテキストをかぶせたい時のサンプル。
`background-image: url(URLを記入);`で背景画像を指定。
`background-size: cover;`で表示範囲を埋めるように画像を拡大・縮小。

###HTML
```html:index.html
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Title</title>
    <link rel="stylesheet" href="stylesheet.css">
  </head>
  <body>
    <header>
    </header>
    <div class="top-wrapper">
      <div class="container">
        <h1>タイトル</h1>
        <p>説明文です。</p>
      </div>
    </div>
    <div class="lesson-wrapper">
    </div>
    <div class="message-wrapper">
    </div>
    <footer>
    </footer>
  </body>
</html>
```

###CSS
```css:stylesheet.css
body {
  margin: 0;
  font-family: "Hiragino Kaku Gothic ProN";
}

a {
  text-decoration: none;
}

.container {
  width: 1170px;
  padding-left: 15px;
  padding-right: 15px;
  margin-left: auto;
  margin-right: auto;
}

.top-wrapper {
  padding-top: 180px;
  padding-bottom: 100px;
  background-image: url(URLを記載);
  color: white;
  background-size: cover;
}
```
KiCadで設計した電子基板の動作祈願のために、お守りを作った。

# TL;DR
![OMAMORI.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72691/e30eb502-46f2-015d-b491-6a78e5ca2d9b.png)
KiCadで利用できる電子基板の動作を祈願したお守りのシンボルとフットプリントを作った。

[これ](https://github.com/Bongorian/KiCad_OMAMORI)（Github）

# きっかけ
（確か）さのかずやさん（[@sanokazuya0306](https://qiita.com/sanokazuya0306)）が昔、「TDではプロジェクトの四隅に盛り塩して安定動作を祈願する」みたいなことを話しており、当時は全く理解できなかったが、メイカーフェアを控えKiCadを無限に使っていると、わかりみが天になった。マジ頼むから動いてくれ。

# 使い方
こいつを回路図に置きましょう。そうすればきっと祈りは通じます。
画像はないですが、フットプリントも用意がございます。ぜひCvPcbで関連付けをしてくださいませ。

# 最後に
- このライブラリを使用したことにより起こった事象に対する一切の責任を持ちません。
- メイカーフェアを楽しみましょう！！
外部API呼び出しチェックリストmemo

#呼び出し処理編

|項目|備考|
|---|---|
|呼び出し失敗時の動作を検討したか||
|呼び出し失敗時に、外部から取得した値ではなくデフォルト値を保存するか|呼び出し失敗とわかるようにする|
|保存するデフォルト値は関係部署と合意できているか|謎のデフォルト値で利用者が混乱することがある|
|呼び出し失敗はトレース、検知できるか| 	ログ、モニタリング、trace idなど|
|ある呼び出しAが外部API側でトレースできるか	|ログ、モニタリング、trace idなど|
|タイムアウト時間は検討したか。矛盾はないか	|OS, DB, ライブラリといった各レイヤーにより自動的に設定されている部分もチェックする|
|呼び出す外部APIがwrite処理の場合、呼び出し失敗時のデータ不整合は検知できるか	|	ログ、モニタリングなど|
|呼び出す外部APIがwrite処理の場合、不整合をあとで修正する機能はあるか	 |	不整合修正バッチ、補償トランザクションなど|
|呼び出しは非同期か、同期か。非同期ならfork joinか、完全非同期か |同期だとウェイト時間分、リクエストの遅延が発生する。要求によっては非同期にできる。|
|非同期時、呼び出しキューはあふれないか	|非同期処理がたまりすぎて消えてしまわないか。特に障害時|
|非同期時、シャットダウンしたとき呼び出しのキューは消えないか	|	消えて大丈夫ならOK|
|Circuit Breakerを導入しているか||
|接続先がフリーズ(L4接続可、L7応答なし)した場合は検討したか|	 	障害試験しよう|
|呼び出し先の応答が遅延気味になった(常に1秒かかるとか)場合でも、呼び出し側の性能が問題ないか確認したか	| 	障害試験しよう|


#リトライ処理編

|項目|備考|
|---|---|---|
|リトライを検討したか	| 	いらないならOK|
|リトライは非同期か、同期か	 	|同期だとウェイト時間分、リクエストの遅延が発生する。要求によっては非同期にできる。|
|リトライ数はトレース、検知できるか| 	ログ、モニタリングなど|
|非同期時、リトライのキューはあふれないか	| 	非同期処理がたまりすぎて消えてしまわないか。特に障害時|
|非同期時、呼び出し元がシャットダウンしたときリトライのキューは消えないか	 |	消えて大丈夫ならOK|
|複数回リトライする際、指数バックオフとジッターを導入しているか|http://aws.typepad.com/sajp/2015/03/backoff.html |
|リトライに優先順位をつけたい場合、リトライ番号を考慮しているか	 	|必要あれば|
AmazonRDSにおけるStorageAutoScalingに潜む罠

今回、RDS Storage Auto Scalingを実施したので、注意点も含め記事にしたいと思います。
https://aws.amazon.com/about-aws/whats-new/2019/06/rds-storage-auto-scaling/?nc1=h_ls:embed:cite

<!-- more -->

・今までRDSにアタッチしているEBSはある程度の重要予測とIOPSを考慮しサイズを決めるオンプレミスライクな仕様でしたが、任意の容量を設定しておくだけで、適宜自動スケールするサービスが開始されました。設定の有効化は非同期処理されてI/O中断も発生しないので、メリットしかないですね。ただし、認識しておきたい箇所があります。

1. 一度に大きなデータが取り込まれるときはスケールに時間がかかるので機能低下が発生する可能性がある
2. スケール後、6時間あるいはDBインスタンスステータスが [Storage-optimization] の間のいずれか長い方の間はスケールしない
3. 2017年11月からストレージ構成に修正を加えていない場合には、割り当てるストレージを増加するためにDBインスタンスを編集するときに数分間の短い停止が発生することがある

https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/USER_PIOPS.StorageTypes.html#USER_PIOPS.ModifyingExisting:embed:cite

・1と2は検証が必要だし発生確率は低く、運用でカバーできますが、<b>3</b>が怖いですね...これ何を言ってるかというと対象のRDSがElasticVolumeでなかった場合はI/O中断することがあるやん？ってことです。
しかも不便なのがElasticVolumeなのかどうかをCLIやGUIでは参照できないという...
なので、2017年11月以前から起動しているRDSは必ず確認して実行しないとI/O中断する可能性があります。ちゃんとドキュメント読んで確認しないとダメージを受けてしまいます。
https://aws.amazon.com/jp/about-aws/whats-new/2017/11/amazon-rds-now-supports-database-storage-size-up-to-16tb-and-faster-scaling-for-mysql-mariadb-oracle-and-postgresql-engines/:embed:cite

・今回、Created timeが<i>Thu Jun 02 2016 10:32:42 GMT+0900 (日本標準時)</i>というRDSに対してStorage Auto Scalingを有効化してみました。
結果として、I/O中断は発生しませんでしたが、スケーリング時にボリューム間でのデータの移行が発生しWriteIOPSとReadIOPSがスパイクしました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58788/a799923c-fdb2-eaea-1b9c-8285c430b019.png)

・当該RDSインスタンスは理論上ベースラインパフォーマンスは1200IOPS（gp2のバーストは最大3000IOPS）なので、クレジットが枯渇したとしてもサービス影響はないのですが、アラートが発火するので精神的にネガティブニュースです。結局、400GiBのElasticVolumeへの移行は65分ほど要しました。

・最新のアップデートは過去の複数のアップデートが絡んでいるので、注意深く見ることが必要だと再認識しました。焚き火して精神をスケールさせたいです...
開発中のPythonモジュールをpip installする

久しぶりに`setup.py`を書いてたら詰まったのでメモ

```py:setup.py
from distutils.core import setup
setup(...)
```

はるか以前の記憶によれば、これをインストールするには

```
python3 setup.py develop --user
```

だったのだが、`develop`引数は`distutils`に以降すると共になくなったらしく、

```
pip3 install -e . --user
```

の用に`-e`付き(editable)でインストールするように言われた。なお`--user`はシステムでなく、ユーザー領域にインストールするためのオプション。これで現在のディレクトリにあるパッケージを別の場所に移さずにインストールすることが出来る。なのでこのファイルを変更すると即座に反映される。
Gitコミットメッセージ変更

###コミット後にメッセージを修正したい時のコマンド

```
$ git commit -m '編集画面を修正'
```
このメッセージを新規作成画面を修正にしたいときは

```
$ git commmit --amend -m '新規作成画面を修正'
```
とすれば直前のコミットのメッセージを変更できる
goでJSONにMarshalするときにnullにしたかったりキーを落としたかったりする場合のまとめ

## はじめに

goでJSONの変換かけるのってホントめんどくさくないですか？

その中でも、

- 値を `null` にしたいんだけどどうすればいい？
- 必要がない場合に、キーごと項目を落としたいんだけどどうすればいい？

というのでしばらく悩んでいたので、結果をまとめます。

Marshal関数のdoc block読んでも、自分はいまいち理解力がなくてよくわかりませんでした。
ロジックつくりつつ、こういう細かい部分もケアしつつ・・・とかやってるといろいろ混乱してしまいますね・・・。
特に複雑なAPIほど頭がモヤッとしてきます。

## 値を `null` にしたい

`*interface{}` (pointer)型の値にnil(正しくは `interface{}(nil)` を渡してMarshalすればOK。

```go
package main

import (
	"encoding/json"
	"fmt"
)

type SomeStruct struct {
	Name   string       `json:"name,omitempty`
	SomeID *interface{} `json:"some_id,omitempty"`
}

func main() {
	a := SomeStruct{}
	a.Name = "MyName"

	thisIsNil := interface{}(nil)
	a.SomeID = &thisIsNil

	aBin, _ := json.Marshal(a)
	fmt.Println(string(aBin))
}
```

実行してみます。

```bash
% go run main.go
{"Name":"MyName","some_id":null}
```

## キーごと落としたい

`interface{}` 型の値に同じようにnilを渡してMarshalすればOK。

```go
package main

import (
	"encoding/json"
	"fmt"
)

type SomeStruct struct {
	Name   string       `json:"name,omitempty`
	SomeID interface{} `json:"some_id,omitempty"`
}

func main() {
	a := SomeStruct{}
	a.Name = "MyName"

	thisIsNil := interface{}(nil)
	a.SomeID = thisIsNil

	aBin, _ := json.Marshal(a)
	fmt.Println(string(aBin))
}
```

実行すると、キー自体が存在しません。

```bash
% go run main.go
{"Name":"MyName"}
```

json merge patch的な動かし方をしたい場合に、予め型は決まっているけど差分じゃない部分は送ること自体をやめたい・・・みたいな処理が必要かと思いますが、これを使うことで対処できたんでホッとしました。
0.1ぐらいから始めるProjectEuler@python　Problem 1

#Problem 1 「3と5の倍数」 

というわけで、1問目書いていきます。
問題自体は非常に簡単ですね。

```python:Problem_1.py
#10未満の自然数のうち, 3 もしくは 5 の倍数になっているものは 3, 5, 6, 9 の4つがあり, これらの合計は 23 になる.
#同じようにして, 1000 未満の 3 か 5 の倍数になっている数字の合計を求めよ.
a=int(999/3)
b=int(999/5)
c=int(999/15)
x=int(3*a)
y=int(5*b)
z=int(15*c)
d=((3+x)*a/2)
e=((5+y)*b/2)
f=((15+z)*c/2)
print(d+e-f)
```
解　233168.0
はい、私はこう書きました。グローバル関数いっぱいですね、はい
後から知りましたが、普通に1行でこのプログラムが書けるようですね。プログラムの奥の深さに俺氏とても驚きました。
####解き方の解説をしていきます。
a,b,cは3,5,15の1000未満の最大の約数を求めてます。
x,y,zは3,5,15の1000未満の最大の倍数を求めてます。
d,e,fは3,5,15の数の倍数の合計値を求めています。　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　
具体的に言うと、最初と最後の倍数である数を足し、それを約数の半分の数でかけてあげることで合計値を求めています。
3を例に出すと、
3+6+9+・・・+996+999を3+999、6+996と、中心から対称の数を足して1002を作ります
そうすると約数の数の半分、1002ができるので、1002×約数の数の半分でかけてあげると倍数の合計値が出ます。

こんな感じですかね？もしわからないことやアドバイス等あればコメントしていただければと思います（答えるとは言っていない）
というわけで気が向いたら次のも見てってください。よろしくお願いします。
Espressoを用いたUIテストで、指定のViewが表示されるまで待機する

# 背景
これまで、EspressoのUIテストにおけるネットワーク通信待機処理を`Thread.sleep()`で行なっていました。
この方法では、通信が完了した後も指定した時間待つことになり、テスト実行に余計な時間が掛かってしまいます。
これを改善するために、今回はUiAutomatorを利用して指定したViewが表示されたタイミングで待機処理を終了する実装に置き換えました。

# 実装
まずは、UiAutomatorの依存関係を追加します。

```gradle:build.gradle
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.uiautomator:uiautomator-v18:2.1.3'
```

そして、Kotlinの拡張関数を用いてトップレベル関数として待機処理を実装します。
テスト設計にはPageObjectパターンを適用しているため、戻り値には`this`を指定してレシーバを返すようにしています。
※PageObjectパターンはDroidKaigi2019のこちらのセッションを参考にさせていただきました。（https://droidkaigi.jp/2019/timetable/70791/ ）

```kotlin:PageObjectExt.kt
/**
 * [resId]に指定したViewが表示されるまで待つ
 * [timeout]はデフォルトで7秒
 */
fun <T : Any> T.waitShown(resources: Resources, @IdRes resId: Int, timeout: Long = 7_000): T {
    UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())
            .wait(Until.findObject(By.res(
                    "[YOUR_APP_PACKAGE_NAME]",
                    resources.getResourceEntryName(resId))),
                    timeout)
    return this
}
```

テストメソッドで使うとこのようになります。
画面の挙動としては、`SampleActivity`で通信を行い、通信中はローディングが表示され、通信完了後に`target_view`が表示されるイメージです。

```kotlin:SampleActivityTest.kt
@RunWith(AndroidJUnit4::class)
@LargeTest
class SampleActivityTest {
    @Rule
    @JvmField
    val activityRule: ActivityTestRule<SampleActivity> = ActivityTestRule(SampleActivity::class.java)

    @Test
    fun test() {
        val resources = activityRule.activity.resources

        SampleActivityPage
                .fetchData() // 時間の掛かる通信処理
                .waitShown(resources, R.id.target_view) // `target_view`が表示されるまで待機
                .assert() // 任意のアサーション
    }
}
```

# 解説
`waitShown`の処理を分解して見てみます。

```kotlin:PageObjectExt.kt
/**
 * [resId]に指定したViewが表示されるまで待つ
 * [timeout]はデフォルトで7秒
 */
fun <T : Any> T.waitShown(resources: Resources, @IdRes resId: Int, timeout: Long = 7_000): T {
    // デバイスの状態を提供するクラス。ホームボタンなどの制御も可能。
    val uiDevice: UiDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())

    // UI要素を指定するクラス。パッケージ名とリソースID名で指定する。
    val bySelector: BySelector = By.res("[YOUR_APP_PACKAGE_NAME]", resources.getResourceEntryName(resId))

    // waitメソッドに渡す条件。最初に一致するUI要素（BySelector）を条件として返す。
    val searchCondition: SearchCondition<UiObject2> = Until.findObject(bySelector)

    // 条件（SearchCondition）に一致するか、タイムアウトになるまで待機する。
    uiDevice.wait(searchCondition, timeout)

    return this
}
```
初めて扱う正規表現【JavaScript】

フォームの処理で、「郵便番号じゃないから書き直して！」「ふりがなじゃないから書き直して！」というのをやろうとしたとき、**正規表現**というものが必要になりました。
ちょっと練習もかねて少しみてみます。

##正規表現って？
http://gimite.net/help/devas-ja/all_regex.html
ここにある記号たちをうまいこと組み立てて行きます！
JavaScriptで正規表現を表す際には以下の二種類の構文になります。

```javascript
var str = /正規表現/オプション;    //リテラル
var str = new RegExp('正規表現','オプション');  //コンストラクター
```

ちなみに**オプション**というのは主に以下の種類があります。
`g`・・・グローバルリサーチ（一致する全ての文字列を返します。）
`i`・・・大文字・小文字を区別しない
`m`・・・複数行検索(^と$が各行の先頭末尾にマッチ）
`s`・・・sを改行文字と一致するようにする

##レッツ！正規表現
`/...a/`
こちらの`.`は任意の一文字を表すので、
abca,3iGa,bbbaなどが当てはまります。

`/a*b+/`
`*`は直前文字の０回以上の繰り返し、`+`は直前文字の１回以上の繰り返しです。
b,abbb,aaab,bbbbなどになりますね。
「****は庭だよ。」は「ハニワだよ」という意味の可能性があるですね。省略可能なのがみそです。

`/みみ？ず/`
？の直前の文字は省略可能です。
みみず　か　みず　が検索できますね。

`/^はるが/`
これは先頭が「はるが」のものの身を検索します。
`/$落ちた/`
これは行末が落ちたのみを検索します。

`/^はるが.*落ちてきた$/`
はるが二階から落ちてきた、などがヒットします。(元ネタ重力ピエロ）
`.`と`*`のコンビ技です。

`/ヒトカゲ|ゼニガメ|フシギダネ/`
これはヒトカゲ、ゼニガメ、フシギダネが検索できます。
囲われたどれかに一致したら検索できます。

`/[桃金喰]太郎/`
桃太郎、金太郎、喰太郎が一致します。どれかの文字がヒットしたら検索できます。

`/[0-9][A-Z]/`
2B,9S,などがヒットします。A2はヒットしません...(元ネタニーアオートマタ)
このように複数文字をまとめてセットすることもできます。

`/[0-9]{3}/`
{3}は直前を三回繰り返すということ。
050,214,555とかがヒットします。

`/[0-9]{2,}`
こちらは2桁以上の数字になる。
04,210,43508510926とかがヒット。

`/[^abc]`
abc以外の文字にマッチ。

##定義済みの文字クラス
`\d`・・・[0-9]と同じ意味。数字。
`\D`・・・[^0-9]と同じ意味。数字以外。
`\s`・・・空白文字。[\t\n\x0B\f\r]
`\S`・・・空白文字以外[^\s

##エスケープ文字
`\/`・・・`/`

##使用例
郵便番号を表してみましょう。
`/^\d{3}-\d{4}$/`
^と$が指定されてるので完全一致ですね。
\dは数字を表すので、`数字3桁-数字４桁`という意味になっています！
Spring gradleでサーバー実行可能WARをvagrant仮想サーバーにデプロイする

TomCatを仮想サーバーに入れる。
TomCatの公式ページでtarファイルをダウンロードしてきて、
そのままFTPソフトでサーバーにアップロードしてから、ターミナルでサーバー側にログインしてその場で解凍する。

WarファイルをTomcatのwebappsフォルダに入れる。
Tomacatを起動する。このとき、以下のようにフルパスで指定する必要があるらしい。
（shはスクリプトファイルで、そういう起動エントリを書いているらしい）
cd でbinに入ってstartup.shと入力してもファイルがないと言われてハマった。

```terminal:terminal
[vagrant@localhost]$ /usr/local/tomcat/bin/startup.sh
```

この状態のままブラウザで
http://192.168.33.10:8080/sample/
を開くとsample.warの中身が表示される。
※sampleの部分を作ったwarファイル名に書き換える。

遭遇したエラー状況：
サーバーに接続できない　⇨ TomCatが立ち上がっていないか設定不良。
404 not found ⇨ サーバーは立ち上がっているがファイルが読めていない。root/でTomCatの公式ページみたいのが表示されるならTomCatは起動しているのでwarファイルの方に問題があるかアドレス指定が間違えている。
White


アドレスが合わない場合、spring4プロジェクトの　application.properties を開いて、
server.servlet.context-path=/test
のtest部分がパスの最後になったりならなかったり、ファイル名の代わりになったりするようなので確認する。
私の場合、ここが/だと404になった。
Whitelabel Error Page ⇨ warファイルまで接続できている。アプリケーション内の指定が間違っているだけ。
で、testとつけてみたがurlには反映されていないらしい。よく分からない。
reversal factorの算出

# reversal factorの算出

## 概要
前回に投稿した期間損益から
算出されたリターンを10分位に分けて
reversal factorを算出。

## 分析のための条件
スタート日を一か月前・エンド日を今日として一か月リターンを対象
前回投稿の期間損益をdataframeで返す関数をduration_returnとした


```python
s_day = dt.date.today()
from dateutil.relativedelta import relativedelta
s_day = t_day - relativedelta(months=1)
rev_df = duration_return(s_day, e_day)

```

## qcutで10分割してカラムに格納しDBに格納
そのままdataframeを分析して計算することもできたが、
今後のことを踏まえてデイリーでラベリングしたテーブルを持たせることに。
格納テーブルはreturn_reversal。

```python
div = 10
l = [x for x in range(1, div + 1)]
rev_df['mon1'] = pd.qcut(rev_df['dur_chg'], div
                                    , labels = l)
```

## 1分位目のリターンを算出
下記の方法で、10分位目も算出して差分してリターン計算。

```python
    rev = ts.return_reversal
    b_day = (t_day - cday).date()
    q_rev = ss.query(rev.tick).filter(rev.ddate==b_day)
    q_rev1 = q_rev.filter(rev.mon1 == 1).subquery()
    q_rev10 = q_rev.filter(rev.mon1 == 10).subquery()
    q_sprc = ss.query(prc.tick, prc.close).filter(prc.ddate==b_day).subquery()
    q_eprc = ss.query(prc.tick, prc.close).filter(prc.ddate==t_day).subquery()
    ttick = q_rev1.c.tick
    PL = (q_sprc.c.close * 100 / q_eprc.c.close) - 100
    # PL = (cast(cast((PL * 100), Integer), Float)/ 100 )

    sub_q = ss.query(
                    ttick,
                    PL.label('PL')
                    ) \
                    .join(q_sprc, ttick == q_sprc.c.tick) \
                    .join(q_eprc, ttick == q_eprc.c.tick).subquery()

    query = ss.query(func.avg(sub_q.c.PL))
    df = pd.read_sql(query.statement, engine)
```

## 管理
このあたりをタスク化して、ファクターリターンとエクスポージャーを自動計算させていく。

## 終わりに
雑でごめんなさい
Elasticsearch 6 -> 7 にアップデートした際にはまったこと（備忘録）

1. 設定ファイルに必須項目が増えていること
======================================

```:/etc/elasticsearch/elasticsearch.yml
#discovery.seed_hosts: ["host1", "host2"]
discovery.seed_hosts: ["xxx.xxx.xxx.xxx"] //<=ここ
...
#cluster.initial_master_nodes: ["node-1", "node-2"]
cluster.initial_master_nodes: ["xxx.xxx.xxx.xxx"] //<=ここ
```

2. Shards の上限がデフォルト 1000 に設定されていること
===================================================

```:設定変更コマンド
$ curl -XPUT http://localhost:9200/_cluster/settings -H 'Content-type: application/json' --data-binary $'{"transient":{"cluster.max_shards_per_node":100000}}'
```

3. Linuxユーザ elasticsearch の リソースを制限
============================================

```:/etc/security/limits.d/30-elasticsearch.conf
$ sudo bash -c 'cat << EOF > /etc/security/limits.d/30-elasticsearch.conf
elasticsearch         soft    nproc           4094
elasticsearch         hard    nproc           16384
elasticsearch         soft    nofile          10240
elasticsearch         hard    nofile          65536
elasticsearch         soft    stack           10240
elasticsearch         hard    stack           32768
elasticsearch         soft    memlock         10485760
elasticsearch         hard    memlock         10485760
EOF'
```

```:reboot
$ sudo reboot
```

4. .kibana1, .kibana2 の Index も削除したほうが良いかも
=====================================================

Kibanaは立ち上がるのですが、Visualize と Dashboard が 開かなくなります。

[Kibana を 6.4.x -> 6.5 に バージョンアップして「Kibana server is not ready yet」が出てしまった場合](https://qiita.com/kouji-kojima/items/3aba0860ab24bac740de) を 参照
react-native-firebase analytics デバッグ手順

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103475/5963c669-0f9d-4e5b-9429-fa16e38a1e42.png)

firebase analyticsにdebugモードが存在します。
いつも忘れてしまうのでまとめます。

## デバッグモードの有効化

### iOS
#### Xcodeのコマンドライン引数に以下を追加する。 チェックをONにしてビルドする。

```
-FIRDebugEnabled
```

無効にするときは以下を追加。

```
-FIRDebugDisabled

```

### Android

```shell
# Debug On
adb shell setprop debug.firebase.analytics.app <package_name>

# Debug Off
adb shell setprop debug.firebase.analytics.app .none.

```


---
公式ドキュメントが正なので正確な情報は以下をご参照ください。
https://firebase.google.com/docs/analytics/debugview?hl=ja

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103475/cc439cd6-530a-c0da-84f4-f49a9bd09987.png)
【React Native】実機デバッグでPCのmetro bundlerに接続されない

## 実機デバッグでmetro bundlerが動いてない
`pre bundle install`という表示がでてくる

## 調べた
> AppDelegate.mに次の行があることを確認してくださいjsCodeLocation = [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index.ios" fallbackResource:nil]。

> あなたのデバイスとあなたのXcodeマックが同じwifiで動いているか確認してください。IOSのために内部的に、それ自身でipを推測するようにネイティブの試みに反応してください。

> 最初にコマンドラインからアプリを実行してみてください。そうすれば、dev packagerサーバーが実行され、そしてあなたのデバイスのxcodeを通してアプリを実行することができます。

## 結論
**同じwifiネットワークに接続されていなかった**
Zeppelinのパスワードを変更

# Download
https://shiro.apache.org/download.html#latestBinary
 shiro-tools-hasher 
http://repo1.maven.org/maven2/org/apache/shiro/tools/shiro-tools-hasher/1.4.1/shiro-tools-hasher-1.4.1-cli.jar

```
wget http://repo1.maven.org/maven2/org/apache/shiro/tools/shiro-tools-hasher/1.4.1/shiro-tools-hasher-1.4.1-cli.jar
```

# Use CLI to change the password
http://shiro.apache.org/command-line-hasher.html

```
[centos@zzeng-hdp-ambari ~/tools]$ java -jar shiro-tools-hasher-1.4.1-cli.jar  -p
Password to hash:
Password to hash (confirm):
$shiro1$SHA-256$500******
[centos@zzeng-hdp-ambari ~/tools]$
```

# Zeppelin 設定変更

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133516/07a8e2fd-a56e-edd4-5b8f-1c869207814b.png)

# 再起動
Vueをマウントできなくて奮闘

プログラミング歴３か月くらいの初心者です、自分のメモ用。

bladeファイル内に<my-component></my-component>などを記載して、コンポーネントを挿入しても

```
app.js:38008 [Vue warn]: Failed to mount component: template or render function not defined.

found in

---> <コンポーネント名>
<Root>
```
上記のエラーが発生する。

app.jsにもしっかり記載している。

```js
Vue.component('my-component', require('./components/MyComponent.vue'));
```
いろいろな記事を見て、webpack.config.jsに追記だの devコマンドを実行したかだのいろいろ対処法が
書かれていたがどれでも解決できないところ以下の記事を見つけた。

https://stackoverflow.com/questions/49138501/vue-warn-failed-to-mount-component-template-or-render-function-not-defined-i

どうやら app.jsで

```js
Vue.component('my-component', require('./components/MyComponent.vue').default);
```
最後に.defaultを追記するだけでした。(意味は知らない)
正方行列の逆行列を求めたい時に、 LinAlgError: Singular matrix エラーが出て困ったら 

正方行列の逆行列を求めたい時に、 `LinAlgError: Singular matrix` が出て困った時ありませんか？

numpyの線形代数パッケージであるlinalgにある `numpy.linalg.inv` を使うと簡単に逆行列を計算できますが、ある条件の元では `LinAlgError: Singular matrix` というエラーが出てしまいます。確認用のコードなので、とりあえず逆行列を求めて次に進みたいんだけど、って時ありませんか？

短い一言アンサーとして、
簡単な確認作業を行なっている時には、この関数の代わりに `numpy.linalg.pinv` を使って逆行列（っぽいもの）を計算することができます。 


例えば以下のような正方行列があった時に逆行列(inverse matrix)を計算させたいことがあるとします。

```python
A = np.array([[ 2., -1.,  0.,  0.],
       [-1.,  2., -1.,  0.],
       [ 0., -1.,  1.,  0.],
       [ 0.,  0.,  0.,  0.]])
```

`numpy.linalg.inv` を使うと簡単に逆行列を計算できます。しかし、上記の行列では以下のエラーになってしまいます。

```python
import numpy as np
np.linalg.inv(A)
```
```python

---------------------------------------------------------------------------
LinAlgError                               Traceback (most recent call last)
<ipython-input-12-ae645f97e1f8> in <module>()
----> 1 np.linalg.inv(A)

/opt/conda/lib/python3.6/site-packages/numpy/linalg/linalg.py in inv(a)
    524     signature = 'D->D' if isComplexType(t) else 'd->d'
    525     extobj = get_linalg_error_extobj(_raise_linalgerror_singular)
--> 526     ainv = _umath_linalg.inv(a, signature=signature, extobj=extobj)
    527     return wrap(ainv.astype(result_t, copy=False))
    528 

/opt/conda/lib/python3.6/site-packages/numpy/linalg/linalg.py in _raise_linalgerror_singular(err, flag)
     88 
     89 def _raise_linalgerror_singular(err, flag):
---> 90     raise LinAlgError("Singular matrix")
     91 
     92 def _raise_linalgerror_nonposdef(err, flag):

LinAlgError: Singular matrix 
```
ところが、np.linalg.pinvを使えば逆行列が求められます。理解せずにとりあえずは進めたい、という時には、`pinv関数` を活用するのはありです。

```python
np.linalg.pinv(A)
```
```python

array([[ 1.,  1.,  1.,  0.],
       [ 1.,  2.,  2.,  0.],
       [ 1.,  2.,  3.,  0.],
       [ 0.,  0.,  0.,  0.]])
```

ここからは補足です。時間のない人はここまでで十分です。
そもそもなぜエラーが起こるのか、そして、invとpinvの違いはなんなのかという2点についてです。

そもそも`LinAlgError: Singular matrix` ってなぜ起こるのでしょうか？
それは、エラーに書かれている通り、 この行列がSingular Matrix(特異行列)だからです。Singular Matrixとは、行列式(determinant)がゼロになる行列で、逆行列が存在しません。エラーどおりですよね・・・逆行列が存在しないので計算しようとするとエラーになるのはあたりまえですよね。

逆行列が存在する行列を [Regular Matrix (正則行列)](https://ja.wikipedia.org/wiki/%E6%AD%A3%E5%89%87%E8%A1%8C%E5%88%97)と呼びます。正則行列は行列式がゼロにならない特徴も持ちます。

でも、正則行列でない行列でも逆行列を計算して次に進めたい、何かの手順の途中だったりすることがあります。私がそうでした。では、このエラーを乗り越えて次に進めたい時、どうしたら良いでしょうか。ここでpinv関数を理解しておきましょう。

pinv関数が求めるものは、[**擬似逆行列 (pseudo-inverse matrix)**](https://ja.wikipedia.org/wiki/%E6%93%AC%E4%BC%BC%E9%80%86%E8%A1%8C%E5%88%97) と呼ばれる行列です。これは、正則でない行列でも、逆行列のような都合のよい行列として擬逆的に正則行列のように扱えるようにして、逆行列を求めたのです。

pinvを使うことで擬似的に正則行列でない行列を正則行列として扱い、逆行列を求めているのですね。理論を正しく理解するにはもう少し文献を読む必要があると思いますが、コードの確認などしたい場合はとりあえずは `pinv` を使っておきましょうね、というお話でした。
embulkで 'Setting null to a task field is not allowed. Use Optional<T> to represent null.' が出たときにやったこと

embulk-input-mysqlを使っていて、以下のようなエラーが出た。

```
org.embulk.exec.PartialExecutionException: org.embulk.config.ConfigException: com.fasterxml.jackson.databind.JsonMappingException: Setting null to a task field is not allowed. Use Optional<T> to represent null.
	at org.embulk.exec.BulkLoader$LoaderState.buildPartialExecuteException(BulkLoader.java:340)
	at org.embulk.exec.BulkLoader.doRun(BulkLoader.java:566)
	at org.embulk.exec.BulkLoader.access$000(BulkLoader.java:35)
	at org.embulk.exec.BulkLoader$1.run(BulkLoader.java:353)
	at org.embulk.exec.BulkLoader$1.run(BulkLoader.java:350)
	at org.embulk.spi.Exec.doWith(Exec.java:22)
	at org.embulk.exec.BulkLoader.run(BulkLoader.java:350)
	at org.embulk.EmbulkEmbed.run(EmbulkEmbed.java:178)
	at org.embulk.EmbulkRunner.runInternal(EmbulkRunner.java:292)
	at org.embulk.EmbulkRunner.run(EmbulkRunner.java:156)
	at org.embulk.cli.EmbulkRun.runSubcommand(EmbulkRun.java:433)
	at org.embulk.cli.EmbulkRun.run(EmbulkRun.java:90)
	at org.embulk.cli.Main.main(Main.java:64)
	Suppressed: java.lang.NullPointerException
		at org.embulk.exec.BulkLoader.doCleanup(BulkLoader.java:463)
		at org.embulk.exec.BulkLoader$3.run(BulkLoader.java:397)
		at org.embulk.exec.BulkLoader$3.run(BulkLoader.java:394)
		at org.embulk.spi.Exec.doWith(Exec.java:22)
		at org.embulk.exec.BulkLoader.cleanup(BulkLoader.java:394)
		at org.embulk.EmbulkEmbed.run(EmbulkEmbed.java:181)
		... 5 more
Caused by: org.embulk.config.ConfigException: com.fasterxml.jackson.databind.JsonMappingException: Setting null to a task field is not allowed. Use Optional<T> to represent null.
	at org.embulk.config.ModelManager.readObjectWithConfigSerDe(ModelManager.java:78)
	at org.embulk.config.DataSourceImpl.loadConfig(DataSourceImpl.java:197)
	at org.embulk.input.jdbc.AbstractJdbcInputPlugin.transaction(AbstractJdbcInputPlugin.java:191)
	at org.embulk.exec.BulkLoader.doRun(BulkLoader.java:507)
	... 11 more
Caused by: com.fasterxml.jackson.databind.JsonMappingException: Setting null to a task field is not allowed. Use Optional<T> to represent null.
	at org.embulk.config.TaskSerDe$TaskDeserializer.deserialize(TaskSerDe.java:154)
	at com.fasterxml.jackson.databind.ObjectMapper._readValue(ObjectMapper.java:3708)
	at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2005)
	at org.embulk.config.ModelManager.readObjectWithConfigSerDe(ModelManager.java:73)
	... 14 more

Error: org.embulk.config.ConfigException: com.fasterxml.jackson.databind.JsonMappingException: Setting null to a task field is not allowed. Use Optional<T> to represent null.
```

ローカルのMySQLのパスワードを空にしていたのだが、環境変数として渡す際に以下のようにダブルクォート（or シングルクォート）で囲む必要があったらしい。（Dockerで実行していて`--env-file`で`.env`を渡していた）

```bash:.env
MYSQL_PASSWORD=""
```

これでエラーが出ずに動くようになった。
MDシミュレーションの教材的な意味

　プログラミングの需要が高まる中, 初等教育で実際に使用され理科教育に直結
するような利用はほぼない.現在はScratchのようなソフトウェアを用いてプロ
グラミング的思考力を鍛えるという導入の要素が強いが, 実際の計算過程を自動
化するようなアルゴリズムを自分で組み立てることにプログミング教育および,
それを利用した理科教育の意義があると考える.

　Pythonはもともと教育用に開発されたabc言語が実用性に適さないためさらに
使いやすく, 可読性の高いものに開発された経緯がある. Pythonが生まれてすで
に20年以上経過した2020年現在でもその人気は向上し, AI(Airtificial
Intelligence)や画像認識処理の開発に使われていることでも有名である. 科学
計算分野では一定の地位をすでに確立しており, 豊富なライブラリから科学者の
間で人気の言語となっている. アメリカではGoogleやNASAで使われている言語と
して注目され, 日本でも利用者が増えるPythonの具体的な利用方法を研究として
示したい.

　Pythonを用いて水のMDシミュレーション結果をを定量的に計算することでより具体
的な教材としての利用価値について示す. オブジェクト指向の言語を使い, 自身
が行いたい操作を可能にすることで道具としてのプログラミングの価値を認識
できるようにすることを目的とした.

[参考リンク](http://washizu.org/mssj2017/lecture.html)
プログラミング講習（仮）05

#プログラミング講習（仮）05

#目的
勉強したい人の支援

#内容
--C--
構造体

--C++--
クラス（1）
Vector

#構造体
構造体は変数群をまとめられる機能
関数は持てない

``` prex05a.c
#include <stdio.h>

struct comp 
{
	float re, im;
};

void main ()
{
	struct comp c0;
	c0.re = 1;
	c0.im = 2;

	printf("c0 = (%0.1f, %0.1f)\n", c0.re, c0.im);
}
```
struct comp 内の re, im をメンバ変数とか言ったりする

##構造体の使用例
```prex05b.c
#include <stdio.h>

struct comp 
{
	float re, im;
};

struct comp compAdd(struct comp, struct comp);

void main ()
{
	struct comp c0;
	c0.re = 11;
	c0.im = 17;

	struct comp c1;
	c1.re = 31;
	c1.im = 13;

	struct comp res = compAdd(c0, c1);

	printf("res = (%0.1f, %0.1f)\n", res.re, res.im);
}

struct comp compAdd(struct comp c0, struct comp c1)
{
	struct comp res;
	res.re = c0.re + c1.re;
	res.im = c0.im + c1.im;
	
	return res;
}
```
###関数 compAdd について
自作複素数型の変数を2つ受け取り、和を返す関数

##exercise
上記の自作複素数型のための四則演算関数を作成してみてください。
解は以下のようになります。

```
 ./prex05c 
add = (42.0, 30.0)
sub = (-20.0, 4.0)
mul = (120.0, 670.0)
div = (0.5, 0.3)
```

# クラス(1)
変数、関数群をまとめられる機能

## C++の雑な導入
### C++とは
Cを発展させたものくらいの認識で。

### コンパイル方法
``` main.cpp
#include <stdio.h>

int main() 
{
	printf("Hello\n");
}
```
```
g++ -o pre main.cpp
```
```
./pre
Hello
```
あまり変なコードを書くと怒られそうですが、
こんな感じです。
簡単ですね。

##クラスの触り
``` prex05d.cpp

#include <stdio.h>

class comp 
{
public:
	float re, im;
	
	comp add(comp);
};

int main ()
{
	comp c0;
	c0.re = 11;
	c0.im = 17;

	comp c1;
	c1.re = 31;
	c1.im = 13;

	comp res = c0.add(c1);

	printf("add = (%0.1f, %0.1f)\n", res.re, res.im);
}

comp comp::add(comp inp)
{
	comp res;
	res.re = re + inp.re;
	res.im = im + inp.im;
	
	return res;
}
```
compクラス内に存在するadd関数のようなものを
メンバ関数だとかメソッドだとか言ったりする。

compクラス内のpublic表記は今回は見ないふりで。

#vector
C++の標準ライブラリである
vector動的配列を使ってみる

```prex05e.cpp
#include <stdio.h>
#include <vector>

int main()
{
	std::vector<int> hoge;

	hoge.push_back(3);
	hoge.push_back(5);
	hoge.push_back(7);
	hoge.push_back(11);
	hoge.push_back(13);

	printf("VAL3 = %d\n", hoge[3]);
	
	printf("SIZE = %d\n", hoge.size());
}
```
OpenVR Driver 開発のあれこれ：はじめに

#はじめに
2019年4月からVRをすることになり、割と自由な開発環境をもらったので投稿してみることにしました。まず初めに今やっているSteamVR向けのopenVR Driverの開発に関して共有を目的に投稿をしてみます。モーションキャプチャーとかに入力デバイスの実装の記事はそこそこ多いですが、ほとんどネット上でサンプルが落ちていない映像出力側に関して徐々に書いていきます。6DOFはRealSense T265（https://www.intelrealsense.com/tracking-camera-t265/）
でつけます。（需要はないかもしれませんが、私自身の投稿練習用として。)

#読者の対象
私自身＋
OpenVRドライバを開発している方やDIYでVR作っている方のご参考になれば

#OpenVRとは？
Steamの運営会社のValve社がSteamVRをどのデバイスでも使えるように用意したインターフェイス。
https://github.com/ValveSoftware/openvr
Gitにあります。正直、5月くらいまでC++ほとんど触ったことなかったです。そこが一番の障壁でした。むしろpythonとかC#はちょくちょくやってたのですが、C++は異世界の言語と思ってました。今では何とか動かせますので驚きです。

#このシリーズでやること
この投稿では任意のモニターでSTEAMVRを利用可能にして、6DOFを実装することを目的としています。
アップロードは不定期です。もし興味がある方がいらっしゃればtwitterのDMまでお願いします。

0.C#erがC++で躓くところ
1.モニターのあれこれ
2.SteamVRの設定ファイルたちとログファイル
3.ドライバのコード
4.Inside Out Cameraの実装
5.DirectModeCompositorないしvirtualDisplayDriverの実装（2019/07/09現在は今挑戦中）

全体的に少しまだ理解あやふやなので勉強しながら書いていきます。

なお筆者のメイン開発PCは
Windows10/Core 7i/Geforce1060です。



:ghost::ghost::ghost:
フルリモート勤務が可能・ワークライフバランスがとりやすいWEB企業一覧

働き方改革が取り沙汰されている昨今、ワークライフバランスを整えたり、仕事を複数持つなど、柔軟な働き方が流行っています。

まだまだ実践している人は少なく、運用が出来ている企業も少ないです。

今回は少しでも働き方を変えたいと考えているあなたの参考になればと思い。ワークライフバランス・働き方改革をしやすい会社を紹介させて頂きます。

<b><font size="8">【フルリモート勤務・副業が出来る企業】</font></b>

<b>■株式会社Misoca</b>

クラウド請求管理サービスを運営する同社。本社は愛知県にありますが、出社の義務が一切なく、社員が全国各地からフルリモート勤務をしています。入社をするとフルリモート勤務用の動画機器一式が貸与されます。会社でピザパーティーがある時、自宅にピザを注文してくれ、動画越しで一緒にパーティーを楽しむなど、面白い制度もあります。

副業も問題なくできる会社なので、働き方が合えば副業に取り組む事も可能です。
<br>
<b>■株式会社Wondershake</b>

女性向けのバーティカルメディア「Locari」を運営している企業です。起業当初はアメリカで起業をし、許可がおりずやむなく日本でスタートしたというちょっとしたエピソードもある会社です。※どん底から這い上がるエピソード

女性向けメディアではno,1を誇るサービスで、やっている事をやっていれば働き方が柔軟な会社です。基本的にフルフレックス、フルリモート勤務が可能です。アメリカからフルリモート勤務をしているエンジニアもいるため、働き方は非常に柔軟な会社です。
<br>
<b>■ChatWork株式会社</b>

コミュニケーションツールのChatWorkを運営している企業です。フルリモート勤務が可能な企業で、条件によっては県外からでも勤務が可能な企業です。副業も問題なくできる企業なので、柔軟な働き方出来ます。
<br>
<b>■サイボウズ株式会社</b>

企業向けグループウェアを展開するサイボウズ。働き方改革の先駆者的企業です。働き方が柔軟でフルリモート勤務、フレックスなど柔軟な働き方できる企業です。
<br>
<b>■ユニバーサルナレッジ株式会社</b>

ECサイトのレコメンドシステム、分析ツールを開発する企業。Yahoo出身者が多く、年収も高めな会社。フルリモート勤務がOKな会社です。
<br>
<b>■株式会社侍</b>

プログラミングアプリを運営する企業です。非常に成長著しい企業様で、県外からのフルリモートOK企業様でもあります。

副業はもちろん、働く場所・時間を自分で決め、給与も働き方に応じて変えられるみたいです。
<br>
<b>■株式会社 tsumug</b>

スマートロック「TINK」を運営する企業。雇用形態は全員業務委託契約にし、週働いて欲しい時間と働きたい時間、年収（条件）が摺り合えばOKな企業です。本社も福岡にあるのですが、フルリモート勤務が可能な会社で、雇用形態も次世代的で面白い企業です。
<br>
<b>■株式会社MMM</b>

追加で投稿のご希望を頂きました株式会社MMM様！

AWSを用いた導入コンサルをコンサルから開発・運用と一気通貫でご支援をして下さる企業様です。こちらもフルリモート勤務可能な企業様です。

他にもフルリモート勤務が可能な企業様がわかり次第、アップデートをさせて頂きます。toC向けサービスよりかは、toB向けサービスが多いですね。toC向けサービスはユーザーの反応がダイレクトで早いため、常に顔を突き合わせながらサービス開発をする必要がある事から、あえてリモートワークを禁止している企業様もあります。

あなたが希望するワークスタイルと合わせて、ご検討をください。