OmniAICreator/Qiita-1.07M huggingface dataset:
同じトークルームにいる Bot の発言を Bot は受信するのか？

空いていると、つい、埋めたくなってしまう…なんでしょうね、この衝動。
LINEWORKS Advent Calendar 2019 の 8日目、書かせていただきます！(/・ω・)/

##同じトークルームにいる Bot の発言を Bot は受信するのか？

ちょっと気になったので検証しました。
まぁ、たぶん受信しないと思うのですが、もし受信するなら Bot 同士で漫才とかさせてみようかなとか思ったりなんたり(ﾟДﾟ)

取り敢えず、DeveloperConsole に Bot を登録して、管理者画面で公開します。
![1575359173.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363367/7c8d0907-e939-dfa9-046f-f999681f4c23.png)
![1575359281.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363367/33e3c65d-273b-5104-6fd0-eeeafe8daadd.png)

Bot 2体を含むトークルームを作ります。
![1575359369.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363367/fb7976b9-2968-95c5-69c0-5b35145b0634.png)

では、発言する君に発言してもらいましょう！
（面倒なので [Postman](https://www.getpostman.com/) を使います）
![1575359450.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363367/c8d107f2-ebe0-8a3c-c51b-508c3c6933fc.png)

![1575359541.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363367/14716ea3-6345-7dc1-4883-34b95b449d2b.png)

受信するよ君のコンソール画面を確認すると・・・

![1575359715.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363367/04e987f4-143d-d4f0-9359-64ffda9a16c2.png)

はい！無反応ですね！(*'▽')ノ

いや、もしかしたら何かしらのミスで Callback が受け取れていないのかもしれない。
普通にトークしてみよう。

![1575359830.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363367/8346694d-de47-2fb6-e603-8f83628016db.png)

![1575359898.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363367/5bb08061-0a19-6eba-47de-0200b0282396.png)

うん！ちゃんと受信してますね！(^_-)-☆

と、言うわけで Bot からのトークは Callback で受信はできません！
ひとつ賢くなりました('Д')ﾔｯﾀｰ

#おわりに
ここまでお付き合いいただきありがとうございました。
同じ Advent Calendar に 4投稿目ですよ。
そろそろ、ちょっと自重しろよって気分になってる方、いますよね。
大変申し訳なく思っております( ﾟДﾟ)

しかし、Bot 漫才、実現しませんでしたねぇ。残念(>_<)
LINEWORKS で Bot 漫才させてどうするんだ！っていうツッコミ、どしどしお待ちしております！！

ではまた！(^^)/

#参考にさせていただきましたm(_ _)m
[Postman](https://www.getpostman.com/)
[LINEWORKS Developers](https://developers.worksmobile.com/jp/document?lang=ja)
ExcelからインポートするSeederの実行時にErrorException  : Undefined index: idのエラーになるとき

<h2>問題</h2>
ExcelからデータインポートをするSeederの実行時に、以下のエラーが発生した。
インポートするExcelファイルの1行目には、カラム名を指定している。

エラー内容は以下のとおり。

```
ErrorException  : Undefined index: id

 at /var/www/csi/app/Imports/QuestionImport.php:20
    17|     public function model(array $row)
    18|     {
    19|         return new Question([
  > 20|             'id'                    => $row['id'],
    21|             'question_en'           => $row['question_en'],
    22|             'question_jp'           => $row['question_jp'],

Exception trace:

  1   Illuminate\Foundation\Bootstrap\HandleExceptions::handleError("Undefined index: id", "/var/www/csi/app/Imports/QuestionImport.php", [])
      /var/www/csi/app/Imports/QuestionImport.php:20

  2   App\Imports\QuestionImport::model()
      /var/www/csi/vendor/maatwebsite/excel/src/Imports/ModelManager.php:73

  Please use the argument -v to see more details.
```
<h2>原因</h2>
Importクラスで、implementsにWithHeadingRowを指定していなかった。

(例)QuestionImport.php

    class QuestionImport implements ToModel
    {
        public function model(array $row)
        {
            return new Question([
                'id'                    => $row['id'],
                'question_en'           => $row['question_en'],
                'question_jp'           => $row['question_jp'],
            ]);
        }
    }

<h2>解決方法</h2>
Importクラスで、implementsにWithHeadingRowを指定する。

(例)QuestionImport.php

    use Maatwebsite\Excel\Concerns\WithHeadingRow;
    
    class QuestionImport implements ToModel, WithHeadingRow
    {
        public function model(array $row)
        {
            return new Question([
                'id'                    => $row['id'],
                'question_en'           => $row['question_en'],
                'question_jp'           => $row['question_jp'],
            ]);
        }
    }

<h2>【参考】解決のために試したこと</h2>
20行目でエラーが出ていたので、18行目と19行目の間に ```dd($row);``` を入れてみた。

ddの出力結果↓

    array:6 [
      0 => "id"
      1 => "question_en"
      2 => "question_jp"
    ]

1行目(ヘッダー行)もデータとして$rowに格納されていることが判明。これによりWithHeadingRowの指定漏れが原因と特定した。
LINEWORKS でデフォルトのブラウザを設定できる API が追加されたよ

前日になっても 6日の Advent Calendar 埋まってなかったので、連続になってしまいますが書きたがりが 書いちゃいますよ！ヾ(*´∀｀*)ﾉ

12/5 に LINEWORKS の [ver2.7](https://developers.worksmobile.com/jp/notice?lang=ja&detailUrl=https%3A%2F%2Fjp1-notice.worksmobile.com%2Fview%2F%23%2Fdetail-view%2F444%3Fusess%3D1%26serviceType%3D12%26serviceLanguage%3Dja_JP) がリリースされましたが、API 関連もいくつか追加された模様ですね。

さっそく色々といじっているのですが、その中の一つで割と引っかかったのでご紹介。

## アプリ版のトーク等でリンクを開いたときのブラウザを設定できる

これ、今まではアプリ内のブラウザが起動してたんですよねー。
いや、今も設定しなかったらデフォルトはアプリ内ブラウザなのですが。

トークしている最中に URL が送られてきたときに、ページを確認してるとトークが見れない。
トークに戻るとページが見れない。
うん、めんどい(ﾟДﾟ)

Chrome とか別ブラウザ起動できないのかなー？とか思ってたので追加されてとても嬉しいです(>_<)

[利用ブラウザ設定 API](https://developers.worksmobile.com/jp/document/100901202?lang=ja#)

設定は単純なので、postman ですぐ設定できます。

![1575528347.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363367/ea51151f-3ed0-62f3-212f-5a83304dc7ae.png)

`"isUse": true` になってれば OK です。

スマホから LINEWORKS アプリを起動して試してみます。

<img width="250" alt="SS1" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363367/0552a9db-d39b-f2b3-4705-864d2f9b8e07.jpeg">

Qiita の URL をクリックすると・・・

<img width="250" alt="SS2" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363367/1cab548f-b748-5642-146a-a7c8755bc47e.jpeg">

デフォルトのブラウザが起動して、Qiita のページが表示されました！やったね(*‘∀‘)

## 引っかかったこと

さて、ものすごく順調に設定できたのですが、何が引っかかったかと言うと・・・
どうやら LINEWORKS の提供元である worksmobile の URL だとアプリのブラウザが起動するようなのです。
最初、[LINEWORKS Developers](https://developers.worksmobile.com/jp/?lang=ja) の URL を送って試していたのですが、何度やってもアプリのブラウザが起動して、「できないじゃん！(ﾟДﾟ)ﾉ」ってツッコミ入れてました。

んで、Qiita の URL にしたらあっさりアンドロイドのブラウザ起動するし・・・
この憤りを、どこにぶつけたら！( ﾉД`)ｼｸｼｸ…

#おわりに
ここまでお付き合いいただきありがとうございました。
つい、勢いで5日、6日と連続で書いてしまいました。
・・・今は反省しています。('ω')

しかも、テーマの BOT 関連とあまり関係ないし。
「管理運用に関すること」に該当する、かな？(^_-)-☆ﾃﾍ

ちなみにこの機能、管理者画面とか探してみたのですが、どこにも設定がありませんでした。
どうやら、API でのみ設定できる機能みたいですね～。
普通にアプリの画面とかで設定できればいいのにね。

ではまた！(^^)/

#参考にさせていただきましたm(_ _)m
[LINEWORKS Developers](https://developers.worksmobile.com/jp/document?lang=ja)
ImportError: 'tests' module incorrectly imported from '/home/circleci/repo/project/foo/tests'.   Expected '/home/circleci/repo/project/foo'. Is this module globally installed?

備忘。
テスト書いてPush後にCircle-ciから言われたのが上のエラー。

```
/project/
 └-foo/
  ├ test.py
  └-test/
      test_views.py     
      test_models.py
```
こうしてた。もともとあったtest.pyを放置したままtestディレクトリを掘ったのが敗因。
ずぼらは良くないというのが本日の教訓です。
CentOS7でGuestAdditionsを導入し、マウスの統合と解像度の自動リサイズを有効にする。

#どんな方に向けての記事か
CentOS7とVirtualBoxを使い仮想環境を作ってみたけど、ホストキー押さないとポインタが元OSに戻ってこれない、画面の調整の仕方がわからない方に向けた記事です。
#動作環境
Windows10,64bit
Oracle VirtualBox 6.0.14
CentOS-7x86_64-DVD-1908 linux redhat64bit
#記事を書いた理由
先日、CentOS7を使ってlinuxの仮想環境を作ったのですが、ポインタの操作や画面サイズが使いにくいと感じたので、調べたとこところマウスの統合と解像度の自動リサイズのタブを有効にすれば解決できることを知りました。これらを有効にするにはGuestAdditonを仮想環境に入れることで解決できるようです。これはvirtualboxのタブにある、デバイス>GuestAddtions CD　イメージの挿入から実行できます。しかし、これを行っても変更が反映されなかったので同じように詰まった方の助けになればと思い、記事を書きました。
#行ったこと
https://youtu.be/EdX-2ci1XtQ を参考にインストールを行いました。


```
$su
$ping -c 3 www.google.com
$uname -a
$yum update kernel -y
$reboot
$su
$yum install gcc kernel-devel kernel-header
```
ここまで行ったところでGuestAddtions CD イメージの挿入を行います。
virtualboxのタブにある、デバイス>GuestAddtions CD　イメージの挿入から実行できます。
ポップアップの実行を押すと実行されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455763/86ea2ca8-28bd-9778-6eb4-671b44405c40.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455763/fadb3cc1-d80c-1acc-58a4-dc691930efef.png)

```
$reboot
```
そして再び再起動すると設定変更できるようになっています。
Githubの日本語で書かれてるっぽいIssueを検索するサイトつくった

# なんで作ったのか

**OSS貢献をしやすくするため**
今まではGoogleやQiitaで情報収拾していた。
やっぱり日本語で手伝える方が楽。
現在参加中の[エフェクトエンジン](https://github.com/effekseer/Effekseer)や[シビックテック](https://github.com/codeforjapan/mapprint)をもっと知ってもらえる機会にもなりそう。

# できたもの

[githubの日本語Issueを集めました。](https://japanese-issue.tk)

|こんな感じのサイトです|
|:--:|
|![Screen Shot 2019-12-05 at 15.36.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180411/c5021c92-8031-558c-251a-7cc3860fcb9d.png)|


# できること

- 言語で絞り込み
- ラベルで絞り込み
- スターの数で絞り込み


# 今後

- OSSとして公開
  - 速度優先で不要カラム多すぎ、減らす予定
  - Laravel+Vueでできてます
  - 整理したら公開予定
- ページネーションの実装
- より良いデザインの適用


# 副産物

どちらかというと、知らなかったリポジトリを発見できる方が面白い。
いろんなリポジトリがあるんですね。
機械学習の勉強を始めた1年の振り返り

こんにちは！
この記事は [機械学習をどう学んだか by 日経 xTECH ビジネス AI② Advent Calendar 2019](https://qiita.com/advent-calendar/2019/machine-learning-01) の 17 日目の記事です。

# はじめに

私は社内で AI に関するプロジェクトに関わっています。
まだまだ勉強途中ですが、どんな風に AI について勉強してきたか
その歴史を書きます。

# 機械学習にハマったきっかけ

私がもともと興味があったのは **自然言語処理** でした。
かつて **ELIZA** という自然言語処理を用いて対話するプログラムがありました。
ただただ単純な返しをするだけのプログラムながら、当時の人々はそのリアルさに驚愕したそうです。
私は **コンピュータと会話できるなんてすごい!** と感動しました。
会話可能な、まさに AI というものを作ってみたい、と思った瞬間でした。
大学生当時、自然言語処理の世界では単語分割や構文解析などはある程度発展していたものの、
意味解析や自動要約などはまだまだこれからな時代でした。
**WordNet** のような大規模なデータベースを使う手法を用いて知性を表現する手法もありましたが、
なんとなく自分の好みと合わず、もっといい方法があるような気がしたまま年月が過ぎていきました。

# 社内で AI プロジェクトが立ち上がる

しばらくは自然言語処理や AI 達と離れ、就いた仕事をカリカリこなして行く日々が続いていました。
そんなあるとき、社内で AI を使ったプロジェクトを立ち上げようという話があがりました。
もう一度 **AI に触れたいという思いに動かされ**、上司に相談して参加させてもらいました。
まずは調査からです。最近流行りのディープラーニングに手を出してみます。

# 勉強法など

まずは目標を決めます。
自然言語処理の事はまずはさておき、ディープラーニングについて理解します。

- 簡単な画像認識ができるようになること！
- フレームワークを使いこなせるようになること！
  - **TensorFlow** (keras), **PyTorch**, (**[Chainer よ永遠に...](https://chainer.org/announcement/2019/12/05/released-v7-ja.html)**)
- ニューラルネットワーク, さらに CNN, RNN など主な手法を理論的に理解すること！
  - 数学との戦い！

理論から固めるのもいいですが、ある程度理解したら実装して理解を固めるのが大事だと思います。
その点で **「ゼロから作る Deep Learning①」** にはお世話になりました。

## まずは手を動かす

とりあえずディープラーニングとはいかなるものか、何ができるのかを実感するために
有名なフレームワークのチュートリアルをやってみます（理解はあと回し！）

基礎から実践まで学習するのにぴったりな [Chainer Tutorial](https://tutorials.chainer.org/ja/) をやっていきます。
**なぜ Chainer かって？**
TensorFlow は環境構築に挫折したのです。（あとで克服しました。PyTorch はあんまり知らんかったすみません
試すなら [Google Colaboratory](https://colab.research.google.com/notebooks/welcome.ipynb?hl=ja) みたいな手軽な環境がありますね、コトハジメにはとても手軽な環境です。

Chainer Tutorial は画像認識界の Hello World ともいえる**MNIST**ではなくて アヤメの分類を使っていますがやることは一緒です。写経してとりあえずはできた気になってみます。

## 理論を理解する

次に「ゼロから作る Deep Learning①」の登場です。

<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193406/d74e5780-fde4-ab9d-007b-88074093f43c.jpeg">

この本はディープラーニングの仕組みを理解するのにとても良い本です。
実際に手を動かしながら試すことが理解の助けになると思います。
数学的な知識の穴埋めは先ほどの [Chainer Tutorial](https://tutorials.chainer.org/ja/) でもできます。
演習問題は結構歯ごたえがありますのでやってみるといいかもしれません。

## ちょっと高度なディープラーニングに手を出す

ここまでくればなんとなく理論を理解して、手も動かせるような状態になっています。
少し興味ある分野に手を出してみましょう。

- 画像：CNN
- 自然言語、音声：RNN

このあたりはフレームワークで簡単に書けることが多く、実装のハードルはかなり低くなっています。

## もっと高度なディープラーニングに手を出す

私は自然言語処理に興味がありました。
なので RNN のさらに先にある Attention, Bert に手を出していこうと思います。

## そして最先端へ...

そのうち最新の論文を調査し、最先端の人々に追い付きたくなります。
いきなり論文にてを出すのはハードルが高いかもしれません
どんな最新手法があるのか… [まだ機械学習の論文を追うのに消耗してるの？それ Bot で解決したよ](https://qiita.com/Hironsan/items/ca0b176fd859490dde08) あたりが最初の第一歩によいかもしれません。

# おわりに

AI、ディープラーニングはこれからどんどん発展していく分野です。
その世界で生きていくために最も重要なのは、**新しいことに興味をもってガンガン食いこんでいける好奇心** だと思います。

私もまだ途上にいます。
一緒に頑張りましょう！

それではみなさん、よい AI ライフを！
ログイン必須なLaravelシステムでファイルの保存と取得を行う

# ログイン必須なLaravelシステムでファイルの保存と取得を行う

ログイン必須なLaravelシステムでファイルの保存と取得の方法を軽く調べてみました。

## 要約
だいたいドキュメントに書いてある。。。
- Storageを使う
- ファイルの操作は[Laravelのドキュメント](https://readouble.com/laravel/5.5/ja/filesystem.html)の通り。
- ファイルの保存場所のシンボリックリンクをpublicに作らない
- コントローラでファイルを取得して返す

## やりたいこと
- Laravelでファイルの保存と取得
- ファイルはログイン済みのユーザのみが見れる
    - 非ログインユーザは見れない


## 方法
authのミドルウェアを指定したコントローラを経由してファイルを返すようにする。

### ファイルの保存
```php
use Illuminate\Support\Facades\Storage;
Route::group(['middleware' => 'auth'], function() {
  Route::get('/', function() {
    $content = "hello world\n";
    Storage::put('test.txt', $content);
    return "saved!";
  });
});
```

これで`$content`の内容が`storage/app/text.txt`に保存される。

### ファイルの取得
```php
use Illuminate\Support\Facades\Storage;
Route::group(['middleware' => 'auth'], function() {
  Route::get('/test.txt', function() {
    $content = Storage::get('test.txt');
    return $content;
  });
});
```

## 最後に
簡単にできた。あとは、コントローラでファイルに対しての認可を行ったりすれば、もっと複雑なことができそうです。
フィクスチャとFactoryBotの混在

## 問題

- 7年前からのアプリケーション。フィクスチャとFactoryBotを使ったspecが混在している。フィクスチャを使ったspecを書き直すのは面倒。
- feature specをsystem specに変更し、DatabaseCleanerを使うのをやめ、use_transactional_fixturesをtrueに変更した。
- フィクスチャデータがテストDBに残って、FactoryBotを使ったspecに影響を与えるので困る。

## フィクスチャとRspecのHooks

「use_transactional_fixtures = true」では、次のような流れになります。投入されたフィクスチャデータは消されません。フィクスチャデータが一度投入されると、テーブル名がキャッシュに保存され、次に「fixtures テーブル名」が来たら投入はスキップ、となります。

```text
before(:context)
DELETE FROM フィクスチャのテーブル
INSERT INTO フィクスチャのテーブル
BEGIN
before(:example)
テストコード実行
after(:example)
ROLLBACK
BEGIN
before(:example)
テストコード実行
after(:example)
ROLLBACK
after(:context)
```

## 対策

after(:context)でレコードを消し、フィクスチャのキャッシュも消す。

```ruby
config.after(:context) do |example|
  fixtures = ActiveRecord::FixtureSet.cached_fixtures(ActiveRecord::Base.connection)
  fixtures.collect(&:model_class).each(&:delete_all)
  ActiveRecord::FixtureSet.reset_cache
end
```

上記の変数fixturesは、ActiveRecord::FixtureSetのインスタンスの配列です。Railsのソースはこちら。
https://github.com/rails/rails/blob/master/activerecord/lib/active_record/fixtures.rb
jQuery使ってみませんか？

#What is jQuery？

**jQuery**とはJavaScript（ジャバスクリプト）のライブラリです。

~JavaScriptとは、
主にブラウザ上で使用される言語で、
Webサイトにアニメーションや効果をつけたり様々な場面で使われています。

それでは**環境設定**に移っていきます！

##まずはじめに

###１,jQuery導入から

公式[jQueryダウンロードサイト](https://jquery.com/)

**オレンジ色をクリック**するとダウンロードが始ります。
<img width="1438" alt="スクリーンショット 2019-12-05 16.22.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/493204/4bff3707-b160-6891-31aa-c1bd68e6acf8.png">

ダウンロードが終わってら

**jquery-3.4.1.min.js**が追加されてると思います。

それではHTMLで読み込みしていきたいと思います。

<img width="901" alt="スクリーンショット 2019-12-05 16.35.13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/493204/451f9610-d9ae-e8cf-52c7-03a86e61ee74.png">

これで**読込完了**です。

＊要注意点！！
・**パス名**には気をつけてください。


[**次回は使い方について記事をあげます。**]
いま再びのシステムまぎちゃんへの道～NFS祭り～

#共有領域がないと困ること困ること
並列計算で欠かせないのが共有ディレクトリを作ることです。
なぜかというと各マシンで同じ実行ファイルを見ているからです。
ですので、共有ディレクトリがないと、
1.実行ファイルを作る(プログラミング→コンパイル)
2.実行ファイルをばらまく（超めんどくさい）
3.あ、実行途中にバグった。(1.へ戻る)
を繰り返すはめになるので、面倒でしょ？

#NFSの設定

##NFSサーバ
ここでもAnsibleさんが大活躍、方法としては
1. nfs-utilsの最新版をチェックして
2. ファイアーウォールを設定して
3. きちんとNFSの共有領域ができているかチェック
4. NFS　サーバの機動
を実行するようにします。

```:nfs-server/tasks/main.yml
---
- name: check latest nfs-utils
  dnf:
    name: nfs-utils
    state: latest
    update_cache: yes

- name: set firewall
  shell: firewall-cmd --permanent --add-service nfs

- name: fix firewall
  shell: firewall-cmd --reload

- name: unmount directory
  shell: if [ -d /nfs/home/evakichi/ ];then umount /nfs/home;fi

- name: mount directory
  shell: mount $(blkid |grep "/dev/sda" |cut -d" " -f2|sed "s/UUID=\"\(.*\)*\"/UUID=\1/g") /nfs/home

- name: start nfs
  systemd:
    name: nfs-server
    enabled: true
    state: started
```
##NFSクライアント
クライアントも、サーバとほぼ同じです。
1. nfs-utilsの最新版をチェックして
2. ファイアーウォールを設定して
3. いったんファイアーウィールをアンマウントして(マウントしていたらの話です)
4. NFSマウント実行

```:nfs-client/tasks/main.yml
---
- name: check latest nfs-utils
  dnf:
    name: nfs-utils
    state: latest
    update_cache: yes

- name: set firewall
  shell: firewall-cmd --permanent --add-service nfs

- name: fix firewall
  shell: firewall-cmd --reload

- name: unmount directory
  shell: if [ -d /nfs/home/lost+found ]; then umount /nfs/home; fi

- name: mount directory
  shell: mount -t nfs ctl:/nfs/home/ /nfs/home
```

てなかんじ、もう少し工夫すれば一個のファイルでNFSの構築ができそうです。
ミソは、NFSサーバが完全に起動してからクライアントがNFSマウントしに行かなければいけないのを書かないといけないことでしょうか…。
GatsbyでFont Awesomeを使いたい


Gatsbyほんと便利ですよね

今回はGatsbyでFontAwesomeを使用する方法について
インストールからフォントアイコンを表示するところまでを説明します

# 実行環境とバージョン一覧
* Gatsby.js v2.18.4
* react-fontawesome v0.1.7 (Font Awesome 5)

ちなみに、Gatsbyは以下のスターターを使用してビルドしました↓

```
$ gatsby new my-blog https://github.com/gatsbyjs/gatsby-starter-blog
```

また、この記事では上記スターターでビルドしたGatsbyプロジェクトの`bio.js`に
記述していく程で話を進めていきます

# インストール
この記事ではFontAwesomeを使用するために以下の３つをインストールします

* `@fortawesome/react-fontawesome`
* `@fortawesome/fontawesome-svg-core`
* `@fortawesome/free-solid-svg-icons`

```shell:npmの場合
$ npm i --save @fortawesome/fontawesome-svg-core @fortawesome/free-solid-svg-icons @fortawesome/react-fontawesome
```
もしくは

```shell:yarnの場合
$ yarn add @fortawesome/fontawesome-svg-core @fortawesome/free-solid-svg-icons @fortawesome/react-fontawesome
```

# 使用方法
## インポート
以下のコードを`bio.js`に追記する

```js:bio.js
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
import { library } from '@fortawesome/fontawesome-svg-core'
```

## フォントアイコンの表示
呼び出し方法にバリエーションがあるのでそれぞれ紹介する

### アイコンセットをまとめて呼び出す
企業系のフォントアイコンを使用する場合は以下を上記に加えてインポートする

```js:bio.js
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
import { library } from '@fortawesome/fontawesome-svg-core'
import { fab } from '@fortawesome/free-brands-svg-icons' // 追加
```

インポートしたアイコンセットをライブラリに追加する

```js:bio.js
library.add(fab)
```

使用したいフォントアイコンを`FontAwesomeIcon`に引数として渡す
お好きな箇所に以下のコードを追加するとTwitterアイコンが表示される

```js:bio.js
<FontAwesomeIcon icon={['fab', 'twitter']} />
```

### 特定のフォントアイコンのみを呼び出す
特定のフォントアイコンのみを使用する場合、
インポート時に使用するフォントアイコン名を記述する

```js:bio.js
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
import { library } from '@fortawesome/fontawesome-svg-core'
import { fabTwitter } from '@fortawesome/free-brands-svg-icons' //追加
```

インポートしたフォントアイコンをライブラリに追加する

```js:bio.js
library.add(fabTwitter)
```

```jsx:bio.js
<FontAwesomeIcon icon={fabTwitter} />
```

# 実際に使ってみる
```js:bio.js
import { 割愛 } from '割愛'

import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
import { library } from '@fortawesome/fontawesome-svg-core'
import { fab } from '@fortawesome/free-brands-svg-icons'

const Bio = () => {
  const data = useStaticQuery(graphql`割愛`)

  const { author, social } = data.site.siteMetadata

  library.add(fab) // FontAwesomeのライブラリ読み込み

  return (
    <div>
      <Image/>
      <p>
        <strong>{author}</strong>
        <a href={`https://twitter.com/${social.twitter}`}>
          <FontAwesomeIcon icon={['fab', 'twitter']} /> {/* ツイッターアイコン */}
        </a>
        <span>うぇぶとかかいはつ日記</span>
      </p>
    </div>
  )
```

結果：![noziming_bio](https://i.imgur.com/esMbJBu.png 'bio')

# おまけ
無料のフォントアイコン一覧：[Font Awesome](https://fontawesome.com/icons?d=gallery&m=free)

Gatsbyでフォントアイコンを使用する場合はフォントアイコン名を
キャメルケースで記述すれば使用できるはず（はず）

例)
`battery-full` （ケバブケース）

↓

`batteryFull` （キャメルケース）


ほんでは

# 参考
* [Reactでfont awesomeを使う](https://www.atnr.net/how-to-use-font-awesome-with-react/)
* [GatsbyJSでfontawesomeを使う](https://www.corylog.com/gatsby/gatsby014/)
* [変数名の命名規則/＊＊ケースの使い分け](https://qiita.com/am_nimitz3/items/7b01af53751dba5d8fb1)
vagrantが起動しなくなった！？対策まとめ

##-発生-
昨日までサクサク動いていたはずの仮想開発環境がなぜか起動しなかった(´;ω;｀)

##-要因-
powershellでvagrant upとすると、
vm: * The host path of the shared folder is missing: ../data
という表示が出た。どうやらこれを何とかしないといけないようだ。。。

##-調査-
ググってみたところ、「共有フォルダ」なるものを設定しなくてはいけないようだ。
PC環境と仮想環境の間でデータをやり取りできない状態らしい。(昨日まで動いてたじゃん。。。)

##-対処-
vagrantfileに一文追加するのみ！
ファイルの場所は↓![2019-12-05 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534542/79bc28fd-c192-cf4e-340e-92543dcff910.png)
vagrantfileを見つけたらエディタで開く。

#####-フォルダパスを書く-
ファイル内に、
8　Vagrant.configure("2") do |config|
　　　　　　~~~~
46　config.vm.synced_folder""
という行がある。そこに、魔法の呪文を一撃する。
config.vm.synced_folder "../data", "/home/vagrant/share",create:"true"

スペルミスがないかチェックしてCtrl+C。

##-起動-
パス設定が終わったらいよいよ起動。
powershellでvagrant up!!!

vagrant Run
が出たらOK!!

##-後記-
おかげ様で何とか起動しました！
しかし、なぜ昨日まで動いていたものが今日は動かないのか。
日々出くわすトラブルがいい学びの機会になります！

今回参考にさせていただいたブログは↓
Hatenablogのid:hira98様のブログより↓
https://hira98.hatenablog.com/entry/2019/07/07/210000
より引用させて頂きました！ありがとうございます。
詳しくは、こちらをご覧ください！
grubでkernel起動 その２

#概要

grubが入ったフロッピーイメージでkernelの様なものを起動する。
コンパイルに、paizaを使って見た。

#閃きのイメージ

開発環境を準備するのは、大変。
web上で、解決できないか。
paizaが64bitだけど、使えそう。
バイナリーは、base64で、良いでしょう。

#サンプルコード


```
import subprocess
import os

def gcc():
    p_file = 'test5.S'
    test_p = """
.text
.globl _start
.globl multiboot_header
.code32

_start:
    movl    $0xb8000, %ebx
    movl    $12, %ecx
    movl    $msg, %esi
loop:
    movb    (%esi), %al
    movb    $2, %ah
    movw    %ax, (%ebx)
    addl    $2, %ebx
    addl    $1, %esi
    subl    $1, %ecx
    jne     loop
    jmp     .

.data
multiboot_header:
    .align 4
    .long   0x1badb002
    .long   0x0 
    .long   -0x1badb002-0x0
msg:
    .ascii "Hello world!"
"""
    with open(p_file, 'w') as f:
        f.write(test_p)
    os.system("gcc -c -m32 -nostdlib %s" % p_file)
    os.system("ld -melf_i386 -e_start -Ttext=0x100000 -otest5.elf test5.o")
    os.system("file test5.elf")
    os.system("cat test5.elf|base64")

if __name__ == '__main__':
  gcc()
  

```

#成果物

https://paiza.io/projects/2R4cv-di91U3EL7_4FFzCQ


以上。
MVPとMVVMについてざっくり整理

## はじめに
業務では専らAndroidアプリの開発をしています。
ただ、今まではあまりアーキテクチャの学習をしっかりしてこなかった面がありました。
なので今回はAndroid開発でよく耳にするMVPとMVVMの設計方法や考え方について調べ、その内容を自分用に整理してみようと思い、この記事を書いてみました。
今回の投稿が初めてであり、この記事自体もまだざっくりとした概念部分しか書けていないので、引き続き自分で実装してみたり、テストコードを書いてみたりしていこうと考えています。機会があればそちらも随時上げていけたらと思います。
(Androidと言いつつ、Androidのコードは出てきません。。。)

ちなみに、今回参考にさせていただいた書籍は[こちら](https://peaks.cc/books/architecture_patterns)。

## MVPとは

**UIの関心ごとをModel,View,Presenterという3つの役割に分離させたアーキテクチャ
UIの複雑さを解決することを目的としている**

* Model
 - UIに関わるデータを定義しデータ構造を提供するインターフェース

* View
 - Modelで定義したデータを表示し、イベントをPresenterへ伝える
 - 表示処理を行う受動的なインターフェース

* Presenter
 - ModelとViewを操作する
 - Modelからデータを取得し、Viewに表示するためのロジックを担当する

<img width="400" alt="mvp.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89159/8c22e434-93ab-657e-3114-fe65c78bf4fc.png">

#### 意識したい点
##### ・まずは何に於いても各クラスの役割を明確にすること
MVPに限らず、役割を明確にすること、そしてそれ以外のことはさせないことがとても大切。それによって各クラスが自分の役割に専念できるようになり、他のクラスが中で何をやっているかは意識しなくて済むようになる。（単一責任の原則）

##### ・インターフェースを用いることでモックを使ったテストが可能になること
処理を適切なクラスに持たせたり分割したりすることも大切だが、インターフェースを介した作りにすることで、他のクラスに依存しないテストを行うことができるようになる。（Dependency Injection）

Googleが公開しているサンプルコードは[こちら](https://github.com/android/architecture-samples/tree/todo-mvp)。

## MVVMとは
**こちらもUIの分離を目的としたアーキテクチャ
Model,View,ViewModelという3つの役割に分離している
UIとビジネスロジックを関連づけるデータバインディングという仕組みを前提としている**

* Model
 - アプリケーションのドメインモデルを指す
 - データ構造のほかビジネスロジックを表現する手段も含まれる
 
* View
 - ユーザーが見る構造、レイアウト、外観を定義する
 - ビジネスに関わるロジックからは分離されている

* ViewModel
 - ModelとViewの仲介役で、表示に関わるロジックを担当する
 - Modelを操作し、Viewが使いやすい形でデータを提供する

<img width="400" alt="mvvm.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89159/be56b95c-e257-bd71-bbad-706e5dca32f2.png">

#### 意識したい点

##### ・MVPとの違いは、Model（データ部分）が変更されると、Viewが自動的に更新されるということ
MVPではPresenterがViewへの参照を持っているため、Presenterから明示的にViewを呼び出して更新することができるが、MVVMではViewModelがViewへの参照を持っておらず、Viewを直接更新できない。その代わり、MVVMパターンを利用する場合は、レイアウトファイルを使用してViewModelから観測可能なフィールドをUI要素にバインドすることができる。（Data Binding）

Googleが公開しているサンプルコードは[こちら](https://github.com/android/architecture-samples/tree/todo-mvvm-databinding)。

## 所感

MVPにおけるPresenterとMVVMにおけるViewModelの役割は結構似ているなと感じました。まずは役割をMVPの3つに分け、PとVの部分をDataBindingでバインドしてやれば、とりあえずの形だけはMVVMになるのかなという気がしました。あくまで形だけですが（笑）<br>
また、MVVMの方がDataBindingの知識が必要な分、ハードルは高めかなと思います。そういう意味でも、学習するならまずはMVPを理解してからMVVMを始めた方がいいかもしれないですね。もちろん、アーキテクチャはこの2種類だけではないので、他のやり方も学習しつつ、自分のプロジェクトに合った設計方法を見つけていけたらいいなと思います。
作って学ぶElixir(1) 引数の順序とパイプ演算子

# 本連載の概要
プログラミングElixirを読んだはいいけどまだまだオブジェクト指向脳が消えず、再帰にもまだ慣れていない、そんな方へ向けた記事です。
特に今までオブジェクト指向の言語ばかり書いていて、関数型言語がはじめてのような場合は再代入が禁止されているから手が止まってしまうことも少なくないと思います。
実際に実務で作成する必要がありそうな関数を作りながらElixirのテストの方法や再帰等を一緒に学んで行けたらと思います。

## 関数Summary.by_keyを作る
今回作る関数は

```elixir
date = [
%{"name" => "sato", "script" => "hello"},
%{"name" => "tanaka", "script" => "hello"},
%{"name" => "tanaka", "script" => "hello"},
%{"name" => "kobayashi", "script" => "hello"}
]
```

上記のようなリストにマップが格納されているdataを指定したキー(今回は"name")でまとめるような関数をElixirで作成したいとします。

```elixir
[
%{"name" => "sato", "contents" => [%{"script" => "hello"}]},
%{"name" => "tanaka", "contents" => [%{"script" => "hello"}, %{"script" => "hello"}]},
%{"name" => "kobayashi", "contents" => [%{"script" => "hello"}]}
]
```
なのでキーを"script"にすると

```elixir
[
  %{
    "script" => "hello",
    "contents" => [
      %{"name" => "sato"},
      %{"name" => "tanaka"},
      %{"name" => "tanaka"},
      %{"name" => "kobayashi"}
    ]
  }
]
```
になるような関数の実装を行います。



## 関数の引数について検討する
関数の内部仕様を把握しました。
では、下記のA,Bどちらのように実装したほうが良いでしょうか？

```elixir
Summary.by_key(list,"key") # A
Summary.by_key("key",list) # B
```
Elixirはパイプ演算子 `|>`があるので引数の最初は対象のリストにするのが良いです。
なので上記の場合はAのほうが明らかに良い設計です。
今回は`Summary.by_key(list,"key")`と利用できる`Summary.by_key/2`を作成していきましょう。
そうすることで下記のような記述が可能となり、実際に関数を利用する際に気持ちよく使うことができます。

```elixir
origin_data_list
 |> maesyori1_function #前処理1
 |> Summary.by_key（"key"）
 |> atosyori1_function #後処理1
 |> atosyori2_function #後処理2
```
もしBにしてしまうと、極端な例になるとこんな記述になってしまいます。

```elixir
atosyori2_function(atosyori1_function(Summary.by_key("key", (maesyori1_function(origin_data_list))))))
```
一時的に変数などに代入（Elixirなので正確には束縛）するなどで若干可読性は上がるとは思いますが、せっかくですからパイプ演算子を使えるような形で第一引数を設計するのがElixirらしさを生み出します。

## まとめ
- 関数を作成するときは引数の順番を意識する



次回に続きます。
2020年 TimeStamp問題の対処メモ（暫定App利用編）

更新履歴
----
- 2019/12/5 初稿
- 2019/12/6 暫定app利用時の制限事項について補足追記

はじめに
---
- [「2020年1月1日以降に「日付を誤認識」する不具合、Splunkが公開」](https://www.atmarkit.co.jp/ait/articles/1912/02/news042.html) by @ITさんの記事にもありましたこちらについて、対応メモを用意しました。
- Splunk Ver 7.3.2環境で暫定App([datetime.xml fix app archive](https://download.splunk.com/products/ingest2020/apps_date_patch_props_v2.zip))を適用するパターンの設定と動作確認の覚書
- [本家のガイド](https://docs.splunk.com/Documentation/Splunk/8.0.0/ReleaseNotes/FixDatetimexml2020)をよく読んで、本記事は補足情報としてご参考ください。
- **(2019/12/6追記)** 暫定App適用しても問題が改善できないパターンがあります。
    - **結論からすると、推奨はSplunkのバージョンアップ(修正済みのものへ)が一番シンプルだと思われます。**
    - 暫定App適用**"前"**に以下コマンドを実行して確認してみてください。
 
```
/opt/splunk/bin/splunk btool props list --debug | grep DATETIME_CONFIG |grep local
```

- grep結果に以下の様な/local/props.conf配下のDATETIME_CONFIG = （null）という設定があった場合。この時、DATETIME_CONFIGはオリジナルの/etc/datetime.xml(2020が正常にパースできない)方を、**暫定Appを適用したとしても**見に行ってしまいます。

 `/opt/splunk/etc/apps/search/local/props.conf                       DATETIME_CONFIG = `

##### 上記props.confが複数のsourcetypeで発生している場合
- オリジナルの/etc/datetime.xmlを修正してください。

##### 上記props.confが１つ、2つ程度のsourcetypeでのみ発生している場合
- sourcetypeで利用する時刻表記が、**20/01/01のように2桁表記**である場合は、DATETIME_CONFIGを手動で以下の様に書き換えてください。

 `/opt/splunk/etc/apps/search/local/props.conf                       DATETIME_CONFIG = /etc/apps/all_date_patch_props/datetime.xml`



7.3.2 暫定App適用パターン
----
前提
----
- Splunk single構成（非IDX-Cluster）
- すぐにSplunkのVERUPができない。適用台数が多いのでdatetime.xmlの手動置き換えは間に合わない方向け


手順
----
- Appのダウンロードとsplunkへ配置
    - apps_date_patch_props_v2.zipをダウンロードし、SplunkにAppをインストール
- CLIでアクセスして、以下フォルダ（all_date_patch_props）のみapps配下に移動

```
# mv /opt/splunk/etc/apps/apps_date_patch_props/all_date_patch_props ../
# rm -fR apps_date_patch_props/
（↑のフォルダ配下は使わないので削除）
```
※deploymentサーバで配布する場合は、all_date_patch_propsのコピー先を/opt/splunk/etc/deployment-apps配下にも行い、Forwarder管理画面から配布する。

- Splunk再起動

```
# /opt/splunk/bin/splunk restart
```


テスト確認
---

- sampleデータ用意

```
date,message
19-12-31 23:58:44,Test Message  - datetime.xml testing - override - puppet managed forced restart
20-01-02 23:58:54,Test Message  - datetime.xml testing - override - puppet managed forced restart
```

- 未来のデータも取り込めるようにするため一時的にMAX_DAYS_HENCE設定

```
# vi $SPLUNK_HOME/etc/system/local/props.conf

[default]
MAX_DAYS_HENCE = 40

# splunk restart
```

- sampleデータ取込

```
# /opt/splunk/bin/splunk add oneshot -source test_file.csv -sourcetype csv -index main
```

- 2020年で取れていることを確認
![スクリーンショット 2019-12-05 15.46.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185759/6c045984-bbad-fa4f-b5da-b14ee395f122.png)


- MAX_DAYS_HENCE戻す

```
# vi $SPLUNK_HOME/etc/system/local/props.conf
#[default]
#MAX_DAYS_HENCE = 40

# splunk restart
```
精神的に向上心があったとしても手運用を続けるものは、ばかだ。

## ばかだ。
僕はばかだ。

システムの運用をするときに **手運用をしている僕は、ばかだ。**
人間は愚かしい生き物だ。

なぜシステムという英知を目の前にして
わざわざ非効率なやり方をしているのか

きちんと設計さえすれば100％間違えないコンピューターがあるのに
なぜ必ず間違いが起こる人間が作業をしないといけないのか。

システムとは人間の生活を豊かにするものにつくられたはずだ。
なのに**我々人間の工数が増えてどうするのか**

当たり前と思って嘲笑するそれでもいい。君は僕ほど愚かではないということだからだ。
でもそうじゃないならこの手紙を読んで
少しでも利口にならなくちゃあいけない。


## チェックリストを作るものは、ばかだ。

手作業でミスがあった時チェックリストを作るだろう。
**ばかだ。**

それでまたミスがあった時**今度はチェックの項目を増やすのかい？**
そうして項目が**２０個も３０個にもなった時ちゃんと全部確認するのかい？**

するならかまわない、この話は仕舞いにしよう。

今年も[アドベントカレンダー](https://qiita.com/advent-calendar/2019)は盛り上がっている。

こんなところで油を売ってないで面白い記事を読みに行くといい。
https://qiita.com/advent-calendar/2019/handslab
https://qiita.com/raki/items/8aab477b4d64c7e7610e




**しないだろ?**



確認項目が多いということは
`その項目の数だけミスするチャンスがあるということだ`

ああはいったが、チェックすることは大事だ。

けれど**項目は少なければ少ないだけいい。**

大量の確認項目を人力でなんとかしようとするのは決していいことばかりではない。

あげく、また作業ミスをしてしまっては元も子もない。

`少しでもいいから機能に任せるべきだ。`

## ダブルチェックでなんとかしようとするものは、ばかだ。
ダブルチェックは必要だ。
人間が何かをするときに間違えないなんてことはない。
だけど**`ダブルチェックで満足しているならそれは愚かだ。`**
そう思うなら会社の人間全員でチェックして貰えばいい。

一番いいのは目検が無いことだ。
人の目よりバリデーションの方が正確だ。
もし正確で無いならそれはバリデーションが間違っているだけだ。

でも、それでも、1人でやるよりは人の助けを借りたほうがはるかに利口だ。
`他人もまた自分と同じように過ちを犯す人間だということを忘れなければ。`



## マスタを手メンテしているものは、ばかだ。
更新頻度が低いならまだいい。
高いのはだめだ。単に`機能要件を拾いきれていない。`
`設計漏れだ。`

更新頻度がそこまででないからこそ、手運用に頼りがちになる事もある。
でも、人の手がかからないなら一番だ。

人の手がかかるとそれだけミスが増える。

機能の改修は時間がかかるが
しないことによって引き起こされる障害の復旧工数を思えばやすいかもしれない。

## エクセルでリストを作るものは、ばかだ。
**お前は経理か**
いや、何も経理をディスってゐるんじゃあない。
エクセルは優れたアプリケーションだ。
使いこなせればそこいらの輩がやるより何倍も効率がいい。

**でもお前は違う。**

DBから抽出したデータを**なんとなく面倒だからエクセルで集計しているだけだ。**
Excel関数かVBAの技術の卓越した技術を持っていればそんな事もないかもしれない。

**ただそういうものは総じてすぐバグる**
メンテを怠ってはいけない。
怠らないのも手間かもしれない


極力SQLで吐け、csvなら大体のDBエンジンなら吐ける。


そうもいかない場合はおそらく担当者がエクセル信者なのだろう。
`画面で見れるようにするんだ。`
それでご不満なら`エクセルダウンロード機能をつけてやればいい。`
どの言語でもライブラリはある。
難しいことかもしれないが、だからといってやらない理由にはならないはずだ。


## 本番のデータを直接いじるやつは、ばかだ。
**そんなやついるのか**

**ああ、いるんだよ。すまんな。**

運用どころか`セキュリティとしてアウト`だ。
アウトだ・・・**僕はアウトだ。**

前提としていじらなくていいものを作るのが一番だ。
変更が必要なデータが入らないように徹底して設計した方がいい。
それでも万が一直接いじることが必要なら`差分をとれ`gitならまだいいだろう。`diffをとれ。`
DBなら`トランザクションを貼れ`一回流して`begin;`で確実に変更が担保できてから`commit`しろ。
対象のデータだけ見るな。
**対象以外が変わっていないことまで含めて確認だ。**


## 手作業がルーティンになるものは、ばかだ。
突発的な依頼や、障害対応。
そういう時の手運用は**仕方がないものがほとんどだ。**
君の気のすむまで手運用したらいい。

重要度がわかっているからこそ普段以上に慎重にやるはずだ。ミスはないだろう。

問題は頻度が増えてきてからだ。

初回は慎重に確認した君もなんどもなんどもやるうちに
`大丈夫だろう` という気になってくる。
それがいけない。

油断こそがもっとも敵だ。

とはいえ、**毎回毎回慎重に確認するのは神経をすり減らす**

理想は、頻度が増えるならその前にシステム化した方がいい。

難しいならやはり、**確認項目を最低限にするべきだろう。**

君ばかりが心を砕く必要はない。



## やたらめったら自動化しようとするものは、ばかだ。

さっきまでと言ってることが違うかもしれないが

**そんな簡単に自動化できるならとっくにやっている。**

いきなり自動化したとしても失敗するだろう

大体は考慮事項が多かったり要件が煩雑なものが手運用になりがちだ

`そういうものはまず手順の整理から`だ

作業のステップを細かく分割し、まずは手順書か何かにまとめることを目指すといい。

まとめなくてもいい。まとまるくらい簡潔になれば自動化できる。

全部は無理でも少しずつ自動化はできるだろう。

いきなり人の手ゼロを目指すのはやや無謀だ。

の負荷を少しずつ減らすために、一歩ずつやった方がいい。


## 精神的に向上心があるものは・・・・・・・・

理想ばかり語ってなにもしないものが1番のばかだ。

そうはいってもな事情があるだろう、すぐに変わらない事もあるだろう。

だが一歩づつ何かを変えようとすることは決してばかじゃない。

運用は「できて当たり前の世界」だ
`ミスは決して許されないが、成果にはなりにくい`

そんな決して優しいばかりでない世界で戦う君たちを同志として誇らしく思う。


たとえ何か大きなミスをしてしまって

「ぼくはばかだ・・・」と落ち込む必要はない。

**大事なのは次間違えない仕組みをつくることだ。**

手運用はよくないが、卑屈になるのはもっとよくない。

たとえ**その結果53万円の損失を出してしまったとしても・・・・**

落ち込むものじゃあないんだ・・・・


ばかだ・・・・


ぼくはばかだ・・・・・
[ Android Studio ] Javadoc出力

Android Studioでjavadocを出力する方法について調査した。

##方法
Android Studioを開くとメニューの「ツール」→「Javadocの生成」がある。
![スクリーンショット (178).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506451/260d667e-018c-b86b-9daa-914972587209.png)

以下のような画面が開かれるので、カスタムスコープを選択した後、右の…となっているところをクリック。
![スクリーンショット (179).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506451/77a867c2-fa16-363f-ee9b-41a6377ca04c.png)

すると以下の画面が開かれるので、左上をクリックしローカルを選択。
名前を入力するが、何でもよい。
![スクリーンショット (180).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506451/dfa482d5-bd70-e05c-be5b-b242bed0f123.png)

出力ディレクトリはどこのディレクトリにjavadocを出力するかを決める。
また「その他のコマンド・ライン引数」にUTF-8を指定すればよい。
![スクリーンショット (181).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506451/6e408920-df9a-6566-a91b-49f8cb9d2407.png)

##参考URL
https://qiita.com/petitviolet/items/9c7a1d3cce58c4173a4c
http://www.neko.ne.jp/~freewing/android/android_studio_javadoc_character_encode_utf8/
お気持ちをJSで読める記号にするアプリ作った

## 前置き

[クソアプリ2 Advent Calendar 2019](https://qiita.com/advent-calendar/2019/kuso-app2)の```((-~[]+[]+-~[]>>-~[])+(-~[]<<-~[]))```日目やらしてもらいます
記号プログラミングが好きな[りゅう](https://twitter.com/Ryu1__1uyR)って言います！

素直な気持ちを伝えるのは恥ずかしい…
それならちょっとだけ読みにくい形にしちゃえ！！
というわけで[任意の文章をJSな記号に変える素敵なクソアプリ](https://s17001.github.io/okimotiToKigou/dist/)を作りました

よかったら遊んでみてね => https://s17001.github.io/okimotiToKigou/dist/

# アプリケーション概要

任意の文字を入力すると、jsな記号プログラミングに変換するWEBアプリケーションです

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245500/a38d18c4-ade6-b101-9a87-a6676bf3a5ad.png)

元の文章に戻すには
・　ブラウザのコンソールに直で貼ったり
・　evalしたりする(evalするときは変数使わないモードにしてね！)
などすれば元の文章を取り出せます

このアプリでメッセージを作って、気になるあの子に記号でメッセージを送ってみよう！！

<br>
生成される文字数が多いのでだいたいツイートできませんが仕様です

## 技術的なお話
### 使ったもの
- Vue.js

リポジトリ: https://github.com/s17001/okimotiToKigou

### 記号のお話

基本としてJavaScriptにおける暗黙的な型変換をいっぱい利用しております

#### 数字まわり
``` javascript
~[] // -1 からの配列をビット反転して数字にする
-~[] // 1 頭に - をつけて負の符号を打ち消す
-~[] + -~[] // 2 これらの足し算
```

#### 文字まわり
``` javascript
![]+[] // "false" falseをString型へ変換させる
(![]+[])[-~[]] // "a" falseの1番目をとってくる
```
例えば僕の名前である ryu を作るなら以下の通りです

```javascript
(!![]+[])[-~[]]+(-~[]/[]+[])[((-~[]+[]+-~[]>>-~[])+(-~[]<<-~[]))]+([][""]+[])[-[]] // ryu
```

記号から作り出せる文字、数字は全部で以下の通りです

```javascript
true, false, undefined, infinity, NaN, Object,
1, 2, 3, 4, 5, 6, 7, 8, 9, 0
```

上記の文字から取り出せない文字はUnicodeからの呼び出しを用いることにより記号で表現できるようになります

### 絵文字とUnicodeのお話

emojiを記号で表現する際に、サロゲートペアな絵文字たちがバラバラになってしまう問題がありました

```javascript
'🤔'.charCodeAt().toString(16) // "d83e"
"\ud83e" // "�"
```

対象の文字のlength分対応する記号のコードを生成して対応しました

[対応箇所](https://github.com/s17001/okimotiToKigou/blob/master/src/components/contents.vue#L90)

```javascript 
// charCode単位でイテレートする
for (let i = 0, l = '🤔'.length; i < l; ++i) {
  const parsedArr = [...(input.charCodeAt(i).toString(16) + [])]
  const flamedArr = parsedArr.map(いい感じに記号にする関数)
  /* 以下いい感じの処理たち
  */
}
```

#### ツイートするために
ツイートさせる画面のクエリパラメータに+を含めないために温かみのある素直なコードを書きました

```html
<div>
    <a class="tweet" :href="'https://twitter.com/intent/tweet?text='+twitter+'&hashtags=kuso_app_2019'" target="_blank">ついーとするためのボタン</a>
</div>
```

```javascript
computed:{
  twitter(){
    return encodeURI(this.tweetText).split('+').join("%2B")
  }
}
```

### とても参考になる記事 + @
javascript 
> https://qiita.com/acid_chicken/items/eeb0b42a1ecbba0c49e3

php
>https://qiita.com/phpfucker/items/581a7f06c054472fbab1

僭越ながら僕のスライド
>https://speakerdeck.com/s17001/ji-hao-puroguramingufalseji-da-cheng

# まとめ
このアプリを作るまでに変数がいまどの型になってるかがある程度わかるようになりました！！！
みんなも記号プログラミングをして人間コンパイラになりましょう！さあ！！！！！！！！！

思いついたアプリケーションを思いのままに作っていくのは最高に楽しい、さらにいい感じに記事にまとめる機会があるので、クソアプリなアドベントカレンダーはとてもいい文化だなぁと思いました。


ここまで読んでくれてありがとうございました！！！
残りの2019年もよき日を過ごしましょう。それでは、良いお年を。
How to export multiple animated glTF from Cinema4D

アニメーションを複数含んだgltfを書き出した際の備忘録です。


~~Cinema4DにはMaxon Labというところが開発中の
glTFのエクスポーターのプラグインがあるのですが、
まだ複数テイクを持った単一ファイルを書き出す事には対応していません。
https://labs.maxon.net/?p=3360~~
Cinema4D S22でglTFエクスポートサポートされました｡thankyou!


以下 現状の方法のメモです。
モデルとアニメーションはmixamoからお借りしました。

<br>
##Cinema4D Part
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190301/7fd72227-9196-7506-84ab-b3e07bb436e2.png" width=50%>
・アニメーションを複数テイクで作成
　ひとつのテイクにひとつのアニメーションが含まれるようにします。
・fbxをテクスチャを含めてexportする
<br>

##Command prompt part
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190301/7c84d8a2-396a-b9da-de24-92ba61ed81f5.png" width=50%>
・[こちらのGitHub](https://github.com/facebookincubator/FBX2glTF)で fbx2glTF をダウンロード
・コマンドでダウンロードしたフォルダのある階層に行き、exeを指定
・exeの後に 変換したいfbxを指定して glTFをexport
　

>-h でオプションが表示される
>-b  .glb バイナリで書き出し
>-e  .gltf エンベットで書き出し
>今のところembedだとうまくいかない。



[glTF viewer](https://gltf-viewer.donmccurdy.com/)で確認すると このように複数アニメーションが含まれている事が確認できます。
![ezgif-5-f308a5a0b612.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190301/b33f1730-4d46-0ee9-74ef-bb3ec474015c.gif)

Maxon Labさんが複数アニメーションに対応してくださること願います！
<br>




##Mayaを使いたい場合
fbxの書き出しにMayaを使いたい場合についてです。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190301/ed5d8ffa-740e-6825-1acf-8a2eb4f1d7ee.png" width=50%>


・複数アニメーションをタイムライン上に繋げて並べる 
・Game Exporterで1つのアニメーションが何フレ目から何フレ目までなのか、
　範囲を指定をしクリップに名前を付ける。
・Save Clips to Single Fileを選択

・セグメントスケール補正をすべてのジョイントでオフにする
　重要。これをしておかないとglTFに変換する際エラーが出る。
・fbxをテクスチャを含めてexportする

・c4dにインポートし、テイクのアニメーションの開始フレームを0に合わせる

以降は上記のc4dの方法と同じになります。
モーションビルダーを使ってテイクにしても良さそうです。
<br>
<br>
DXとは何か

##DX(デジタルトランスフォーメーション)について
皆さんは最近よく耳にするDX(デジタルトランスフォーメーション)についてよくわかっているでしょうか？実際私自身曖昧にしかわかっておらず、なぜそれが必要なのか背景がよくわかっていませんでした。

そんな中、DXの言葉の出どころではないかと思われる
経済産業省の資料を発見いたしましたので共有させていただきます。

##DXがなぜ必要なの？？？すべての答えはこのPDFの中にある！！！(直リンク) 

その経済産業省の資料とは以下のPDFの資料でございます。

[https://www.meti.go.jp/shingikai/mono_info_service/digital_transformation/pdf/20180907_02.pdf](https://www.meti.go.jp/shingikai/mono_info_service/digital_transformation/pdf/20180907_02.pdf)

この資料にはDXの意味と、DXの背景にある

***「2025年の壁」***
![2025年の壁.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280363/106fda31-d242-929c-7cb4-f67df7dd980e.png)


について書いてあります。
上記の資料の内容を簡単にまとめると

- 現在、企業には多くの複雑化、ブラックボックス化した古いシステム(以下、レガシーシステム)が存在している。
- レガシーシステムの運用保守に現在多くのIT人材のリソースが割かれてしまっている(80%以上)、今後も運用保守費用は増加傾向
- クラウドやAIなど新しいデジタル技術を取り入れたアジャイル手法で作ったITシステムへの移行が急務、これをDXと呼ぶらしい
- もしDXできないようだと2025年以降、無駄な運用保守費用などで***年間約13兆円***の経済損失が生まれる(2025年の壁問題)

##商談の場などで
- レガシーシステムの撲滅→ユーザー企業による要件定義力の強化
- AI、RPA、クラウドを使ったアジャイル手法を取り入れた素早い開発
- ウォータフォール型からアジャイル型への移行によるユーザー企業とベンダー企業のジョイントベンチャーや技術研究組合モデルなど新たな関係の構築

がこの文脈で刺さるのではと思いました。

##DX人材像について(ユーザー企業側、ベンダー企業側)

以下が経済産業省が定めるDX人材だそうです。
###ユーザー企業側が求める人材
- CDO（Chief Digital Officer）：システム刷新をビジネス変革につなげて経営改革を牽引できるトップ人材
- デジタルアーキテクト（仮称）：業務内容にも精通しつつITで何ができるかを理解し、経営改革をITシステムに落とし込んで実現できる人材
- 各事業部門においてビジネス変革で求める要件を明確にできる人材
- ビジネス変革で求められる要件をもとに設計、開発できる人材
AIの活用等ができる人材、データサイエンティスト

###ベンダー企業側が求める人材
- 受託開発への過度な依存から脱却し、自社の技術を活かして、アプリケーション提供型のビジネスの成長戦略を描き、実現できる人材
- 求められる要件の実現性を見極めた上で、新たな技術・手法を使った実装に落とし込める人材
- ユーザー起点でデザイン思考を活用し、UX（ユーザーエクスペリエンス）を設計し、要求としてまとめあげる人材
- スピーディーに変化する最新のデジタル技術を詳しく理解し、業務内容にも精通するITエンジニア

![DX人材.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280363/a0c6e352-4969-56e3-4e78-596169b8a3f5.png)


ご一読ありがとうございます。経済産業省のPDFも省庁の資料なので自由に使用して転記いただいて問題ないそうです。
ROS Navigation　メモ１

Navigation メモ１です。


>■It is meant for both differential drive and holonomic wheeled robots only. It assumes that the mobile base is controlled by sending desired velocity commands to achieve in the form of: x velocity, y velocity, theta velocity.
■It requires a planar laser mounted somewhere on the mobile base. This laser is used for map building and localization.
■The Navigation Stack was developed on a square robot, so its performance will be best on robots that are nearly square or circular. It does work on robots of arbitrary shapes and sizes, but it may have difficulty with large rectangular robots in narrow spaces like doorways. 
>■差動駆動とホロノミック車輪付きロボットの両方を対象としています。 それは、x速度、y速度、シータ速度の形式で達成するために、所望の速度コマンドを送信することによってモバイルベースが制御されることを前提としています。
■モバイルベースのどこかに平面レーザーを取り付ける必要があります。 このレーザーは、マップの構築とローカリゼーションに使用されます。
■ナビゲーションスタックは正方形のロボットで開発されたため、ほぼ正方形または円形のロボットで最高のパフォーマンスが得られます。 任意の形状とサイズのロボットで動作しますが、出入口のような狭いスペースにある大きな長方形のロボットでは困難な場合があります。
http://wiki.ros.org/navigation



>
■地図作成
地図作成に関わる技術としてはSLAMを用います。ROSのSLAMパッケージを用いるとSLAMの知識が無くても地図作成ができ、またTurtleBot3用のROSのSLAMパッケージやマニュアルも公開されています。
TurtleBot3に搭載されているLiDARで環境の2次元スキャンをし、移動しながら地図を作っていきます。SLAMにはいくつか種類があるのですが、今回は最も有名なgmappingを使いました。gmappingの処理内容としては、パーティクルフィルタを用いて自己位置推定すると同時に、その自己位置情報をもとに地図を作成していきます。
>
■ナビゲーション
ナビゲーションに関しても、TurtleBot3用のROSパッケージやマニュアルがあります。
ゴール位置までのナビゲーションをするために、地図やセンサ情報をもとにしたコストマップを作成し、そのコスト情報をもとに経路計画をします。これらは大域的な処理と局所的な処理に分けられます。
大域的な処理としては、予め作っておいた地図情報を元に壁や障害物があるところにコストを高くし、コストが閾値を超えないような経路を計画します。局所的な処理としては、走行時に得られたLiDARのセンサ情報から人や以前なかった障害物を検知してリアルタイムで経路を補正します。
サイト引用
（https://proc-cpuinfo.fixstars.com/2018/11/turtlebot3-navigation/）


・ノートPCとロボットを分ける。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351913/66699a66-c6e8-25e7-b139-ce410cac51e6.png)

■Navigation 各パラメータについて
http://wiki.ros.org/navigation/Tutorials/Navigation%20Tuning%20Guide




■参考文献
turtlebot3
https://proc-cpuinfo.fixstars.com/2018/11/turtlebot3-navigation/
【Python用】AWS Lambda Layerへのアップロードファイルをササッと作る

# 前提
Dockerを利用して、Lambdaで使うPythonライブラリのLayerアップロード用zipを作る。
手順はrequestsをzipにする場合のサンプル。

# 手順

ホストOSで、ライブラリを使うバージョンのPythonコンテナにアタッチする。

```sh
$ docker pull python:3.8
$ docker images
$ docker run -itd ImageID bash
$ docker attach ContainerID
```

コンテナ側では、pipでライブラリを取得し、zipにまとめる。

```sh
$ apt-get update & apt-get install zip
$ mkdir python & pip install requests -t ./python
$ zip -r upload.zip python
```

「Ctrl + p, Ctrl + q」でコンテナから抜け、コンテナからホストにzipをコピーし、コンテナを終了させる。

```sh
$ docker cp ContainerID:/upload.zip upload.zip
$ docker stop ContainerID
```

後はアップロードしておしまい。
競プロのローカル環境の作り方  -Mac版-


## Windows版

https://qiita.com/Kaas59/items/135a8c64ba8097f07f3e


# 開発環境でインストールするもの
  - Xcode
  - Command Line Tools
  - Atom

    既にVSCodeやSublimeTextなどのテキストエディタが入っている場合そちらでも構いません。

# Xcodeをインストール
   1. App StoreでXcodeを探してインストール

     ※最新のOSでない場合Xcodeがインストールできない場合があるのでアップデートしてください

# Command Line Toolsをインストール
   1. [Apple Developer](https://developer.apple.com/download/more/)にアクセスする
   2. AppleIDでログインする
   3. 左の検索バーに**Command Line Tools**を入れて検索
   4. 自分のMacOSに合ったバージョンをダウンロード

# Atomエディタでコマンドプロンプトを実行する
   1. 画面左上のメニューから[File]→[Settings]を選択する
   2. ｢Settings｣タブの[+Install]を選択する
   3. 入力欄に「platformio-ide-terminal」と入力
   4. Installを押す
   5. [Cntl+`]で開く

# おわりに

これで満を持して[AtCoder](https://atcoder.jp)や[TopCoder](https://www.topcoder.com/)、Paizaなどの競技プログラミングを頑張っていってください！
今年の自分を振り返る

こんにちは
[株式会社Diverse](https://diverse-inc.com)で働いていますpython_spameggsです。
6日目の記事になります。
タイトル通り今年一年の自分がやって来たことを振り返りたいと思います。

# 1月〜3月
### 社内ツール
AWSへ移転する時に必要ではないものは予め無くしておきたかったので誰も使用していないものを洗い出して停止、削除しました。
弊社の制度で本を購入するのに補助してくるのでその申請が簡単にしやすくするものを作成しました。
### DNS移管
AWSへ移管しました。
[rspec-dns](https://github.com/spotify/rspec-dns)を使用して漏れがないことを確認しました。
### AWS CodeBuildとTerraformを使用してAWSサービスを作成
PRを作成すると`terraform plan`が実行されてPRがマージされると`terraform apply`が実行されます。
こちらを参考にしました。[Terraform どこで実行していますか？](https://medium.com/mixi-developers/terraform-on-aws-codebuild-44dda951fead)
すでにAWSコンソールから作成されていたサービスがあったので`terraform import`を使用してコード化しました。
### mackerelの監視ルールをgithubで管理
監視ルールに追加や変更があったら`mkr monitors pull`して`git push`してgithubで管理しています。
githubにpushされた時にCircleCIが動くようになっており`mkr monitors diff`を実行して監視ルールと差分がないかチェックしています。
私以外やっている人がいないので自動化したいなと思っているけど手が回ってないです。
### dokkuを使用して開発環境を作成
環境を作成したいブランチを選択してボタン一つで作成、更新、削除ができるようになっています。
# 4月〜6月
### AWS Direct Connectの準備
VPCなどの設定やDirect ConnectのVirtual Interfaceなどを開通するのに必要な情報をエクセルにまとめました。
資料をまとめるのは普段の作業と違ってなかなかハードでした。
### MySQLのバックアップ専用サーバのマシン交換
レプリケーション遅延でバックアップがきちんと出来てなかったのでスケールアップしました。
バックアップ方法や監視方法が古いものを使っていたので見直しました。
### gRPCのためにプロキシサーバを作成
nginxを使用してプロキシサーバを作成したが最近envoyの方が良かったのではないかと思い始めてます。
### RPMをdocker-composeで作成できるように対応
DockerでRPMの作成はしていたけど古くなりドキュメントもなかったのでdocker-composeを使うものを作成しました。
### AWS S3にRPM Repositoryとして使用できるように作成
AWSへ移転して使いたいRPMが出てきそうだったので準備しました。
`sts:AssumeRole`を使って別のAWSアカウントからも使用できるようにして特定のユーザ or IPアドレスのみアクセスできるようにバケットポリシーを作成しました。
そのままだとs3からyumが出来ないのでAWS EC2インスタンスにyumできるようにプラグインを設定しました。
この時に参考していたものがbotoを使っていて古いのでboto3を使用するに変更しました。
# 7月〜9月
### AWS Direct Connectの開通確認
疎通確認して速度計測をa、c、dそれぞれ確認しました。
### AMI作成
packerとansibleを使用して作成しました。
### MySQLのバージョンアップ
バージョンを5.5から5.6にアップグレードしました。
MHA for MySQLを使用してフェイルオーバーさせて切り替えました。
5.7まであげてもいいじゃないかと話に上がっていたが時間が足りなかったので次の機会に。
### pt-duplicate-key-checkerを使用して重複したインデックスをチェック
興味があって時間もかからなかったのでさくっと出しただけで使えていません。
### SSL/TLS証明書の更新
オンプレミスで使用しているものを更新しました。
# 10月〜12月
### MySQL(オンプレミス)からAWS RDS(MySQL)にレプリケーション
[time_zone設定の違うMySQLのレプリケーションについて](https://blog.yux3.net/entry/2018/12/02/182113)
上記に気が付かずTIMESTAMP型のカラムがずれてしまったのこちらを参考にtimezoneを変更してmysqldumpを行いリストアして対応しました。
レプリケーション用のユーザパスワードが保存されていたものと違っていたので探索してmysql_historyから作成したログが残っていたので保護してmysql_historyからは削除しました。
### terraformをv0.11からv0.12にバージョンを変更
AWS CodeBuildでWARNがいっぱい出てしまい実行結果のログが読みにくくなったため変更しました。
### 一部サーバをAWSへ移転
gRPCサーバとgRPCのプロキシサーバを移転しました。
予めRoute53に移転していてルーティングポリシーを重みを少しずつ変更して徐々に行った。
現在はメールサーバとRDSの移転を行っています。

# まとめ
やったことをなるべくdocbaseに書いてきましたが詳細が抜けていることが多くて思い出すのが大変でした。
振り返ってみると1年通してこれだけAWSへ移転するための作業をやったことはないのでいい経験なりました。
来年も同じことを続けるけど。

明日の7日目は誰かが埋めてくれるはず！
ROS MultiArray型 を Python で扱う際の注意

ROS で配列を Publish したかったときに詰まったので共有します


-----------
最初はC++ の書き方を真似てこうすればいけるやろ！
ってやると...

```python
import rospy
from std_msgs.msg import Float32MultiArray

def talker():
    pub = rospy.Publisher('/hoge', Float32MultiArray, queue_size=10)

    array=Float32MultiArray()
    array.data.resize(5)
    i=0
    for p in range(5):
        array.data[i]=p
        i+=1

    pub.publish(array)

```

```
AttributeError: 'list' object has no attribute 'resize'
```

と怒られました．

#### 2020/12/20　追記
[こちら](https://qiita.com/nushitoritarou/items/5ea71160f5805aeae250#comment-a9bdd63fc3b088a95786)のコメントでご指摘を受けているように，
このコードではPythonのList型が`resize`という関数を持っていないため，エラーになっています．

この間違いはC++とPythonの型の違いに起因しています．
C++ではfloat32[]型で[定義され](http://docs.ros.org/en/melodic/api/std_msgs/html/msg/Float32MultiArray.html)ていて，resize関数を使って配列長を拡張してからデータを入れる必要があるのに対し，
PythonではList型が使用されているため，配列長に影響されず，append関数で要素を追加することができる．

という感じになっています．


---

~~正解の文こちら~~
動作するものは以下

```python
import rospy
from std_msgs.msg import Float32MultiArray

def talker():
    pub = rospy.Publisher('/hoge', Float32MultiArray, queue_size=10)

    array=[]

    for p in range(5):
        array.append(p)

    array_forPublish = Float32MultiArray(data=array)
    pub.publish(array_forPublish)

```

一度List型にぶちこんでから MultiArray に変換するといけます
PhpStorm で Version Control が表示されない場合の対処法

今まであったパターンは以下の2つ。

## Tool Window が出ていないだけ
View > Tool Windows > Version Control
（command + 9 でもOK）

![スクリーンショット 2019-12-05 14.22.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109241/253b4f14-585f-108a-5a46-183aa89e06a8.png)

## そもそもVCSが有効になってない
VCS > VCS Operations Popup から有効にする

![スクリーンショット 2019-12-05 15.56.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109241/75ce8a70-b8e0-fab9-1116-8d695c764e6e.png)

### 日本語ドキュメント
https://pleiades.io/help/idea/enabling-version-control.html

### 英語ドキュメント
https://www.jetbrains.com/help/idea/enabling-version-control.html
nginxでリバースプロキシを設定

###環境情報

```
[user@instance ~]# cat /etc/redhat-release
Red Hat Enterprise Linux Server release 7.7 (Maipo)
```

###以下のファイルでリバースプロキシを設定

```
[root@instance ~]# vi /etc/nginx/conf.d/default.conf


server {
    listen       80;
    server_name  localhost;

    #charset koi8-r;
    #access_log  /var/log/nginx/host.access.log  main;

    #http://150.136.185.120/にアクセスしたら、googleのHPに遷移するように設定する
    location / {
       proxy_pass http://www.google.com;
       # root   /usr/share/nginx/html;
       # index  index.html index.htm;
    }

    #http://150.136.185.120/suzukiにアクセスしたら、Apexアプリに遷移するように設定する
    location /suzuki/{
       proxy_pass https://wekggrxwysz1uoy-suzukiadb.adb.us-ashburn-1.oraclecloudapps.com/ords/f?p=102:1;
    }

    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

    # proxy the PHP scripts to Apache listening on 127.0.0.1:80
    #
    #location ~ \.php$ {
    #    proxy_pass   http://127.0.0.1;
    #}

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    #location ~ \.php$ {
    #    root           html;
    #    fastcgi_pass   127.0.0.1:9000;
    #    fastcgi_index  index.php;
    #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
    #    include        fastcgi_params;
    #}

    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    #
    #location ~ /\.ht {
    #    deny  all;
    #}
}