OmniAICreator/Qiita-1.07M huggingface dataset:
Ubuntuでscaling_governorをperformanceにする

## 現在のgovernorの確認
```
$ sudo apt install cpufrequtils

$ cpufreq-info -p
800000 4400000 powersave
```

## scaling_governorの設定
```
$ echo 'GOVERNOR="performance"' | sudo tee /etc/default/cpufrequtils
$ sudo systemctl disable ondemand

$ sudo reboot
```

おわり

```
$ cpufreq-info -p
800000 4000000 performance
```
Detox を Travis 上で稼働させる際の Tips

# はじめに
以前の記事でも記載しましたが、私の職場では e2e テストとして [Detox](https://github.com/wix/Detox) を導入しています。
Detox の使い方自体は慣れてきて、テストシナリオもそれなりに準備できてきました。
満を持して、Travis 上で稼働させて CI/CD のフローに組み込んでしまおう、とした時に詰まった内容と解決するための Tips を紹介したいと思います。

# Detox を Travis 上で稼働させる際に詰まったこと
### 1. コマンドラインツールのバージョンが異なる
Travis 上で稼働させ始めた頃、 Travis の `osx_image` は `xcode10.1` を使用していました。
すると、build でコケるという事象に直面。原因はコマンドラインツールのバージョンでした。
`.travis.yml` に

```yaml
      before_install:
        - softwareupdate --list
        - softwareupdate --install "Command Line Tools (macOS High Sierra version 10.13) for Xcode-10.1"
```

を追記することで回避できるようになりました。
なお、2019/07/15現在では、 `osx_image: xcode10.2` を指定することで、上述の記述なしに build は成功しています。
初歩ですが、ローカル環境と Travis 環境のアプリケーションバージョンを合わせることは重要ですね。

### 2. debug モードでテストを走らせていた
結論から先に言いますと、build の際に `export RCT_NO_LAUNCH_PACKAGER=true` を付与した config を実行します。

```json
      "ios.sim.release": {
        "binaryPath": "ios/build/Build/Products/Release-iphonesimulator/example.app",
        "build": "export RCT_NO_LAUNCH_PACKAGER=true && xcodebuild -workspace ios/example.xcworkspace -UseNewBuildSystem=NO -scheme 'example' -configuration Release -sdk iphonesimulator -derivedDataPath ios/build -quiet",
        "type": "ios.simulator",
        "name": "iPhone 8"
      },
      "ios.sim.debug": {
        "binaryPath": "ios/build/Build/Products/Debug-iphonesimulator/example.app",
        "build": "xcodebuild -workspace ios/example.xcworkspace -UseNewBuildSystem=NO -scheme 'example' -configuration Debug -sdk iphonesimulator -derivedDataPath ios/build",
        "type": "ios.simulator",
        "name": "iPhone 8"
      },
```

上記のような config を書いており、普段ローカルでは `ios.sim.debug` を稼働させていますが、 Travis 上では `ios.sim.release` である必要があります。
`export RCT_NO_LAUNCH_PACKAGER=true` がないと、 Timeout が発生してテストが全滅しました。

### 3. MFA 回避
私の職場で提供するアプリでは、通常と異なるデバイスでログインした際に、メールに記載されたコードを入力する必要があります。
シミュレーターで開発する際に都度コードを求められては非効率なため、開発時はその処理をスキップするようにしています。(`__DEV__`で判断するロジックが入っている)

前述の設定で Travis 上でテストを稼働させる場合、`__DEV__` は `false` 扱いとなります。
その場合、多要素認証の処理が走り、テストが失敗してしまいます。
それを避けるために、e2e テスト時は `__DEV__` の時と同じ判断をしてもらう必要があります。

このために導入したのが、`babel-plugin-transform-inline-environment-variables` です。
`yarn add -D babel-plugin-transform-inline-environment-variables` して `.babelrc` の `plugins` に以下のような定義を追加します。

```json
  "plugins": [
    [
      "transform-inline-environment-variables",
      {
        "include": ["NODE_ENV", "E2E"]
      }
    ]
  ]
```

合わせて、前述の build の定義を以下のようにに変更します。

```json
"build": "export RCT_NO_LAUNCH_PACKAGER=true && export E2E=true && ...
```

最後に、ソースコードを以下のように変更します。

```typescript
  // __DEV__ ? ... : ...;
  __DEV__ || process.env.E2E ? ... : ...;
```

これで、 Travis 上でテストを稼働させる際も、`__DEV__` と同じロジックを実行することができました。

# おわりに
Detox × Travis の組み合わせで動かすという多少ニッチ(?)なケースのせいか、日本語はおろか英語でも解決策が見当たらず、かなり四苦八苦しました。
試行錯誤したおかげで色々と理解が進んだとポジティブに捉えます。

この組み合わせの利用を考えている方の参考になれば幸いです。
[Android Studio]FileNotFoundExceptionでビルドが失敗する場合の対処法

# 現象
ビルド時に以下のようなエラーが発生する

```
FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':app:transformDexWithInstantRunSlicesApkForDebug'.
> java.lang.RuntimeException: java.io.FileNotFoundException: /Users/hoge/android_app/app/build/intermediates/instant_run_split_apk_resources/debug/instantRunSplitApkResourcesDebug/out/slice_1/resources_ap
```

Android Studio 3.4 以降で起こるらしい？
Instant Runが有効な場合に起こる。

# 対処法
`gradle-wrapper.properties` の gradle のバージョンを 5.2 以上にする。
少なくとも 5.4 では動作した。

```diff:gradle/wrapper/gradle-wrapper.properties
- distributionUrl=https\://services.gradle.org/distributions/gradle-5.1.1-all.zip
+ distributionUrl=https\://services.gradle.org/distributions/gradle-5.4-all.zip
```

# 参考

- [Error related to resources_ap after upgrading to Android Studio 3.4 - Stack Overflow](https://stackoverflow.com/questions/55802212/error-related-to-resources-ap-after-upgrading-to-android-studio-3-4)
anacondaのバージョン形式の変更(major/minor ->YYYY.MM)

qiitaの皆さんの記事を参考にanacondaのインストールを試行しました。

ところが、よく例に記載されている**anaconda3-x.x.x**の他に**anaconda3-YYYY.MM**の表記を確認し、最新版が分からないと言う課題にぶつかりました。

結論としてはanacondaのバージョン書式がanaconda3-YYYY.MMへ変更となったのですが、その調査過程を記します。
#経緯
簡単に経緯を書きます。
MacOS MojavaでHomebrewでpyenvをインストール

```
$ brew install pyenv
```

インストールするanacondaのバージョンを確認

```
$ pyenv install -l | grep anaconda
(略)
anaconda3-5.3.0
anaconda3-5.3.1
anaconda3-2018.12
anaconda3-2019.03
```
anaconda3-5.x.xを予想していたら、anaconda3-2019.03と言う謎のパッケージも表示されました。この時点ではanaconda3-2019.03が最新版なのか特殊なパッケージなのか判断付きません。

#調査
「anaconda3-2019.03」で検索したが、良いページが引っかからず・・・
そこでanacondaの[サイト](https://www.anaconda.com/distribution/)を確認したところ、2019.03が最新版のようです・・・

<img width="866" alt="スクリーンショット 2019-07-15 12.33.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266151/8c0d5e0e-2c2c-dd72-b6f8-b4a4c3ed03d8.png">

確証が持てないのでanacondaの[リリースノート](https://repo.continuum.io/archive/)を確認したところ、2018年12月からバージョンの表記がAnaconda3-2018.12になっていることを確認。
<img width="833" alt="スクリーンショット 2019-07-15 12.36.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266151/8922ddd9-ef36-8ba0-facb-8ea3fdca9930.png">

なるほど、と言うことで、2018年12月の[リリースの詳細](https://www.anaconda.com/anaconda-distribution-2018-12-released/)を確認しました。
>We are changing versioning in Anaconda Distribution from a major/minor version scheme to a year.month scheme.

やはりmajor/minorからyear.monthへ変更となったようです。
Powershellメモ

#Powershellでaccdbを扱う際に引っかかったこと

##概要
ACCESS によりDB（accdb）を作成しデータの参照、更新処理を実施しようとした。

##環境
使用 PC は Windows10 64bit で ACCESS がインストールされている。
PC 毎に ACCESS のビット数が違う。

##事象
ACCESS のビット数が 32bit の PC で実行したときに
「供給されたプロバイダーは既に使用されているものと異なります」
というエラーメッセージが表示され、DB に接続できなかった。

##原因
ACCESS のビット数にかかわらず PowerShell（64bit）で実行していたことにあるようです。
 PowerShell（64bit）で実行するので、ACCESS（32bit）がインストールされている PC の場合に本事象が発生するようです。

```:ショートカットの中身
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy RemoteSigned -File "実行するシェル.ps1"
```

##対処
ACCESS（32bit）がインストールPC用にPowerShell（32bit）で実行するショートカットを作成し実行させることにしました。

```:ショートカットの中身（32bit）
C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy RemoteSigned -File "実行するシェル.ps1"

```
docker buildで Client.Timeoutになったとき

docker build が急にできないときの対処。なんか他にあるかもしれないけど。。

# 結論

Client.Timeout発生
↓
docker restartしたら治った。

# 環境

* Windows10
* Hyper-Vにdockerインストール

# 状況

request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
というのが発生してdocker buildが正常終了しない。

```
> docker build .
Sending build context to Docker daemon  28.46MB
Step 1/5 : From python:3
Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
```

# 対処

### dockerのrestart

タスクバーのdockerアイコンで右クリック。
![docker_restart01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224453/abb4fe52-d944-5183-0304-47d67a52f055.png)
![docker_restart02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224453/21cf9e2c-b97b-d7b1-e565-830bdb11a385.png)
![docker_restart03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224453/cff6d925-520a-5286-f348-2a0b2ec18153.png)
このタイミングでシーンとしているけど、再起動中。↓
ちょっと時間かかる。
![docker_restart05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224453/598aba24-40b0-47b9-fa91-df300cfe5f07.png)
再起動終わったらピローンとアラートが出る。
![docker_restart06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224453/0d95b6ae-d781-4eaa-8120-e3fe960fd7a0.png)
こんなふうになったらOK。
![docker_restart04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224453/339b5790-e80a-1ce6-76e8-e21dc7587d20.png)


# docker restart後

```
> docker build .
Sending build context to Docker daemon  28.46MB
Step 1/5 : From python:3
3: Pulling from library/python
5ae19949497e: Pull complete
ed3d96a2798e: Pull complete
f12136850781: Pull complete
1a9ad5d5550b: Pull complete
6f18049a0455: Pull complete
ce39fa9d79d1: Pull complete
3a91ffcf88ea: Pull complete
ee82cc8e1506: Pull complete
bf0dbf90a115: Pull complete
Digest: sha256:87fd2bad3de70a5e779a91d7e2ec2bd01115dfe3faf97dacf730a7f4155d11d8
Status: Downloaded newer image for python:3
 ---> 42d620af35be
(省略)
Step 5/5 : RUN pip install --upgrade pip
 ---> Running in 2e235b67b06f
Requirement already up-to-date: pip in /usr/local/lib/python3.7/site-packages (19.1.1)
Removing intermediate container 2e235b67b06f
 ---> fedda0f62e54
Successfully built fedda0f62e54
```
Redis ClusterとTransactionの動き方メモ

RedisにはTransaction機能とCluster機能の両方が実装されています
ここらへんの機能を同時に動くかのかどうかがよく分からなかったので調べてみました

https://redis-documentasion-japanese.readthedocs.io/ja/latest/topics/transactions.html#transactions

検証は下記のdocker-composeのプロジェクトを使用して行いました
https://github.com/cpapidas/docker-compose-redis-cluster

port=7000,7001,7002でクラスタリングされているredis-clientから2つのクライアントを使ってアクセスします

## without transaction

```bash
cli.1 $ set foo bar
OK
cli.2 $ get foo 
"bar"
cli.2 $ set foo bal
OK
cli.1 $ get foo
"bal"
```
普通に順番にアクセスするだけですね

## use multi using same key

```bash
cli.1 $ multi
OK
cli.1 $ set foo bar
QUEUED
cli.1 $ get foo
QUEUED
cli.2 $ multi 
OK
cli.2 $ get foo
QUEUED
cli.2 $ set foo bag
QUEUED
cli.2 $ get foo
QUEUED
cli.2 $ exec
1) "bal"
2) OK
3) "bag"
OK
cli.1 $ exec
1) OK
2) "bar"

```
同じキーにアクセスする限り、他ノードへのリダイレクトは発生しません
そのため、execを実行したタイミングでキューイングされたコマンドが実行されます


## use multi using different key

```bash
cli.1 $ multi
OK
cli.1 $ set foo bal
QUEUED
cli.1 $ set fooo bal
-> Redirected to slot [3916] located at 173.17.0.2:7000
OK
cli.1 $ exec
(error) ERR EXEC without MULTI
cli.1 $ get foo
"bar"
cli.1 $ get fooo
"bal"
```

multi中にリダイレクトが発生するコマンドが発生すると、キューが溜まっていても
破棄されて、リダイレクトが発生したコマンドが単発で実行されるようです

以上からキーの対象ノード下しかTransactionを使えないことが分かりました。
ClusterとTransaction使用をうまいこと使おうとした場合、アプリケーション層で
がんばらないといけなさそうです。

ライブラリが超頑張ってくれればなんとかなりそうな気もしますが、パッと探してみた感じ出来なさそうです(JVM系で知ってたら誰か教えて)
ソフトウェア危機からオブジェクト指向に至るまで



#はじめに

未来電子テクノロジーでインターンをしている宮﨑です。

オブジェクト指向に至るまでの経緯を学習していたのですが、下地となる知識がゼロに近い私にとって難しい記事が多かったので、自分でわかる言葉でまとめてみました。

ほんとに初心者なのでかなりザックリとした説明です。
もし誤りがあれば修正するのでどんどん指摘してください。


#オブジェクト指向

オブジェクト指向とはシンプルに言うと、
「変数と関数をひとまとめにしたクラスを作るプログラミングの手法」
のこと。

↓参考にさせていただいた記事

(初心者が一番わかりやすかったオブジェクト指向プログラミングの説明は、子供向けのマイクラ本だった。。
https://note.mu/tokitky/n/n6e70d7e7a236)




#オブジェクト指向に至るまでの変遷

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/450384/8a81a12c-269b-cec6-66b1-7462d949eadf.png)
（出典:https://qiita.com/hirokidaichi/items/591ad96ab12938878fe1）

##ソフトウェア危機
コンピュータの進歩・普及によってソフトウェアの需要が急速に高まるにもかかわらず、生産量・品質・費用・時間の面で開発が間に合わない状況。
それを打開するために生まれたのが「構造化プログラミング」。





##構造化プログラミング


わかりづらいgoto文を廃止して、設計上のミスが起こりづらくするためにプログラムの実行を、
順接・反復・分岐
の三つの構造で制御することにした。


###（補足）goto文

処理を指定の位置へ移動(go to ～)させるための文。
処理を自由に移動させることができるが、流れが追いづらくなり、読みづらくなってしまう。

##モジュールプログラミング

モジュールとは「部品」のことである。
大きく複雑化するプログラミングをモジュールに分割することにより、分担して効率よく開発作業をすることができる。

モジュールに分割する際には「結合」と「凝集」の二つの観点からその質をはかることができる。

###結合

結合とはモジュール間の関係のこと。
同じ変数やデータを使ってお互いに依存しあっていると、一方を修正した際にもう一方も修正しなければならない。
それぞれが独立して情報のやり取りがはっきりしているのが理想的な結合だ。

###凝集

どんな処理をひとまとめにするかでメンテナンスのしやすさはだいぶ変わる。
とあるデータに関する処理をまとめたり、適切な概念とデータ構造とアルゴリズムをひとまとめにしたりするのが好ましい。

##抽象データ型

よいモジュールを言語的に支援するために誕生したのが抽象データ型。
抽象データ型は今でいうクラスのことである。
つまりデータとそれに関連する処理をひとまとめにしたデータ型のことだ。


#まとめ

今までちんぷんかんぷんだったキーワードがぼんやりとわかってきました。
具体的な言語を学ぶとより理解できそうです。


今回骨組みとして参考にさせていただいたのはこちらの記事です。
詳細までしっかりと理解したい方はぜひお読みください。

(新人プログラマに知っておいてもらいたい人類がオブジェクト指向を手に入れるまでの軌跡
→https://qiita.com/hirokidaichi/items/591ad96ab12938878fe1)
GITでデプロイするまで

sshkeyを登録した後は、デプロイをしてみましょう。

##ディレクトリを作成し、そのディレクトリに移動する

```
mkdir 好きな名前

cd 今作ったディレクトリ名

git init
```
mkdirでディレクトリを作り、cdコマンドで操作するディレクトリに移動する感じです。
git initはそのディレクトリで操作を開始しますよというコマンドです。


##デプロイしたいサイトをステージングエリアに移動する
```
git add ファイル名
```

##追加したファイルをリポジトリに記録する
```
git commit -m メッセージを追加
```
これでリモートリポジトリにファイルを移動できました。
ここの-mと言うのはメッセージを追加するオプションです。
基本的には変更した点についてメッセージを書きます。

##ステージエリアからGITリポジトリに
git hubに自分の作ったファイルを上げます。

```
git remote add origin https名
```
これによってリモートリポジトリの情報を追加します。
https名は自分が作ったgit hubのディレクトリの画面でclone or downloadというボタンをクリックすると出てくるので、それをコピーします。

```
git push origin master
```
これでgit hub上に指定したファイルを上げることができました。

以上になります。
URL(https://techacademy.jp/magazine/6235#sec8)
参考にさせていただいたサイトです。
間違いや指摘があればお願いします。
ハンバーガーメニューの作り方

#概要

初心者による、覚え書き。
ハンバーガーメニューをクリックすると、Xマークにアニメーションするボタン。

#ソースコード

```haml:HTML
<button class="btn-trigger">
	<span></span>
	<span></span>
	<span></span>
</button>

<script src="https://code.jquery.com/jquery-3.1.1.js"></script>
```
```css:CSS
.btn-trigger {
	-webkit-appearance:none;
	appearance:none;
	position: fixed;/*要素を固定*/
	top: 24px;
	right: 12px;
	z-index: 110;
	width: 40px;
	height: 40px;
	border:none;
	background-color: #fff;	
	overflow : hidden;
	outline : none;
}

.btn-trigger span {
	position: absolute;/*fixedを起点に位置を指定*/
	display: block;
	width: 28px;
	height: 2px;
	background-color: #a0a0a0;
	transition: all 0.5s;
}

.btn-trigger span:first-of-type {
	top: 10px;
}
.btn-trigger span:nth-of-type(2) {
	top: 20px;
}
.btn-trigger span:last-of-type {
	bottom: 10px;
}
.btn-trigger.active span:first-of-type {
	transform: rotate(45deg);
	top: 20px;
}
.btn-trigger.active span:nth-of-type(2) {
	opacity:0;
}
.btn-trigger.active span:last-of-type {
	transform: rotate(-45deg);
	bottom: 20px;
}
```

```javascript:JavaScript
$(".btn-trigger").on("click", function(){
	$(this).toggleClass("active");//.activeの追加/削除
});
```

クラス名を指定するときは「.」がいるけど、toggleClassの引数にはいらないのね・・・。
laravelのルーティングは間違っていないのに違うメソッドが呼ばれてしまう時の対処

###エラーが起こった時のlaravelの設定
新規登録、編集画面から投稿確認画面に移り、ボタンを押すとstoreメソッドが実行され、テーブルに情報が反映されるという流れ。

####投稿確認画面

```php5:confirm.blade.php
 {!! Form::open(['route' => 'question.store', 'method' => 'POST']) !!}
 ~省略~
 {!! Form::close() !!}

```
####ルーティングの設定

```php5:routes/web.php
php artisan route:list

|        | POST      | question                               | question.store               | App\Http\Controllers\QuestionController@store                                     | web,auth                                             |
|        | GET|HEAD  | question                               | question.index               | App\Http\Controllers\QuestionController@index                                     | web,auth                                             |
|        | POST      | question/confirm                       | question.confirm             | App\Http\Controllers\QuestionController@confirm                                   | web,auth                                             |
|        | GET|HEAD  | question/create                        | question.create              | App\Http\Controllers\QuestionController@create                                    | web,auth                                             |
|        | GET|HEAD  | question/mypage                        | question.mypage              | App\Http\Controllers\QuestionController@showMyPage                                | web,auth                                             |
|        | GET|HEAD  | question/{question}                    | question.show                | App\Http\Controllers\QuestionController@show                                      | web,auth                                             |
|        | PUT|PATCH | question/{question}                    | question.update              | App\Http\Controllers\QuestionController@update                                    | web,auth                                             |
|        | DELETE    | question/{question}                    | question.destroy             | App\Http\Controllers\QuestionController@destroy                                   | web,auth                                             |
|        | GET|HEAD  | question/{question}/edit               | question.edit   
```

なのに実際、ボタンを押すと以下のエラーが出てびっくり

```
Trying to get property of non-object (View: resources/views/user/question/show.blade.php)
```
###アホ！！！そんなわけあるかい！！！俺は信じひんぞ！！！！
そう、showメソッドが実行されている
何回もルーティングを見直していたけど、Route::resource()で設定している以上、間違っているということはないはず。
実はこのエラーはformタグで作っていた時にも出ていたから、Formファサードを使えば解消されると思っていたのに、上のように変えてもこのエラーが出た。

###解決した、たった4行のコマンド
```
$ php artisan cache:clear
$ php artisan config:clear
$ php artisan route:clear
$ php artisan view:clear
```
キャッシュが悪さをしていた、こんなの気付くかよ...

###おわりに
どうみても間違いが見つからないときはキャッシュクリアしてみよう。
HTML の 要素 の 角 を 丸めて 表示させる

# 目的
- HTMLファイルの要素の角を丸めて表示させる方法をまとめる。

# 押さえるポイント
- 角を丸めて表示させるにはborder-radiusプロパティを使用する。
- 角の丸め具合はピクセル数で指定する。
- 丸め具合のピクセル数は値を大きくすれば大きく丸まり、小さくすれば微量に丸まる。
※ピクセル数は要素の四隅に円を設置したときの円の半径を指す。
※丸め具合を指定するピクセル数は完全に理解する必要ななく、実際に使用して感覚をつかもう！！

# 書き方の例
- 下記にCSSファイルの内容を記載する。

``` css
要素の名前かクラス名 {
  border-radius: ピクセル数;
}
```

# より具体的な例
- h1要素の横幅を300px、高さを200px、背景色をred、要素の角を丸くして値を20pxとする。
- 下記にHTMLファイルの内容を記載する。

``` html
<h1>おはようございます。</h1>
```

- 下記にCSSファイルの内容を記載する。

``` css
h1 {
  width: 300px;
  height: 200px;
  background-color: red;
  /* 要素の角を丸くする設定を記載する */
  border-radius: 20px;
}
```
overflow hidden~ヘルスケアwebサービスを自分で作る医者の日記~

https://itstudio.co/2018/02/18/7683/
以下引用
```
overflow:hiddenは本来オーバーフローした内容を隠すためのプロパティと値です。それがなぜフロートと関連しているのかよくわからないため、使用に戸惑うこともあると思います。
overflowプロパティでclearプロパティと同等の処理を行えるのは、本来の仕組みとは別にoverflowプロパティには別の側面があるからです。それはoverflow プロパティをデフォルト値（visible）以外の値にすると、新たなブロック整形文脈を作るという機能を持ちわせていることです。
ブロック整形文脈とはブロックボックスのレイアウトを作る基準になれることです。わかりやすく言うとoverflow プロパティをデフォルト値（visible）以外の値にすると自分の範囲内に存在するフロートした要素を認識してその高さを知り、囲むことができるようになります。
この動きは適正にclearプロパティを設定した場合と同じ効果を生み出します
```

なるほどわかりやすい
HTML の 要素 に マウスカーソル を 載せたときだけ反映される設定をする

# 目的
- HTMLファイルの要素にマウスカーソルを載せたときだけ見た目が変化したりする設定方法をまとめる。

# 押さえるポイント
- マウスカーソルが乗った時に変化させたい要素を指定する際に「要素名かクラス名:hover」としてCSSで指定する。
- 必要な情報は①「カーソルが乗った時に変化させたい要素名かクラス名」と②「カーソルが乗った時どのように変化させたいか(文字色を変えたいなど)」

# 書き方の例
- 下記にCSSファイルの内容を記載する。

``` css
要素の名前かクラス名:hover {
  カーソルが乗った時の要素をどうしたいのかの設定
}
```

# より具体的な例
- button要素で囲まれた「新規登録はこちら」のボタンの要素にマウスカーソルを載せたとき透過率を0.5に設定する。
- テキストも投下させたいため、透過率の設定にはopacityを用いる。
- 下記にHTMLファイルの内容を記載する。

``` html
<button>新規登録はこちら</button>
```

- 下記にCSSファイルの内容を記載する。

``` css
button:hover {
  opacity: 0.5;
}
```
7/15 今日学んだ事(アソシーションの実装)

#アソシーションの実装
###やりたい事
・レビュー保存時に『誰が書いたレビュー』なのかという情報を保存する
・レビューの表示時にレビューを書いた人のnicknameを表示できるよう実装
・レビューの投稿画面の方のニックネームの入力欄は消す

###作業内容
1.ニックネームの入力欄を消す
2.userモデルとreviewモデルの間にアソシエーションを設定する

###1.ニックネームの入力欄を消す
・レビューを投稿するユーザーのニックネームはサインアップの段階ですでに設定済みなので、このテキストフィールドは消す

作業ファイル:app/views/reviews/new.html.erb

消去するコード

```new.html.erb
<div style="margin: 8px 0">
    <%= f.label :nickname, style: { 'margin-right' => 8 } %>
    <%= f.text_field :nickname, placeholder: 'nickname', value: '' %>
</div>
```
続いて、サインイン中のユーザーを取得してそのユーザーのnicknameをレビューに含めるようにする

やりたい事
・reviewを新規投稿する際、投稿者のnicknameをreviewsテーブルへ保存する

作業ファイル：app/controllers/reviews_controller.rb

```reviews_controller.rb
#変更前
private
  def create_params
params.require(:review).permit(:nickname, :rate, :review).merge(product_id: params[:product_id])

#変更後
private
  def create_params
params.require(:review).permit(:rate, :review).merge(product_id: params[:product_id], nickname: current_user.nickname)
```
・createメソッドを使用する事で、テーブルにカラムを保存できる
・createメソッドの引数は、(保存したいカラム:保存する値,保存したいカラム:保存する値)
・ストロングパラメーターにnicknameカラムの指定はする必要がなくなったので、permitメソッドの引数から削除する

###2.userモデルとreviewモデルの間にアソシエーションを設定する
***やりたい事***
・ReviewモデルとUserモデルの間にアソシエーションを設定
・nicknameの情報はアソシエーションで取得できるUserモデルのインスタンスが、カラムとして持っているため削除する
・レビューを書いたユーザーのニックネームを取得できるようにする
・Reviewsテーブルにuser_idのカラムを追加する

###reviewsテーブルのnicknameカラムを削除する

```ターミナル.
$ rails g migration RemoveNicknameFromReviews nickname:string
```
マイグレーションの実行

```ターミナル.
$ rake db:migrate
```
###reviewsテーブルにuser_idカラムを追加

```ターミナル.
$ rails g migration AddUserIdToReviews user_id:integer
```
マイグレーションの実行

```ターミナル.
$ rake db:migrate
```
###モデル間にアソシエーションを設定する
user⇨review

```user.rb
has_many :reviews
#userは複数reviewを持つ
```
review⇨user

```review.rb
belongs_to :user
#reviewは1つのuserに所属する
```

###reviewを保存する際に投稿したユーザーのid番号を記録するよう実装
・current_userのidカラムの値を、reviewのuser_idカラムに保存

作業ファイル:reviews_controller

```reviews_controller.rb
private
  def create_params
    params.require(:review).permit(:rate, :review).merge(product_id: params[:product_id], user_id: current_user.id)
  end
```

###ビューへ反映させる
・reviewのnicknameカラムから取得していた名前の情報を、reviewとuserのアソシエーションを利用して取得する

作業ファイル:show.html.erb

```show.html.erb
<h3 class="text-xsmall text-overflow" title="<%= review.user.nickname %>">
  <span><i class="icon-rate-60 text-xxsmall opacity-60" title=""></i></span><%= review.user.nickname %>
</h3>
```
以上
Glide App（glideapps） のMap List 機能

Qiita初投稿です。

ちょっと前にGlideを知りました。
https://www.glideapps.com/

これは面白いと思い何か作ってみようと思って作ったのがこちら。
[Glideの味わい方〜オープンデータを活用しよう](https://www.programmers-office.ml/glide%e3%81%ae%e5%91%b3%e3%82%8f%e3%81%84%e6%96%b9%e3%80%9c%e3%82%aa%e3%83%bc%e3%83%97%e3%83%b3%e3%83%87%e3%83%bc%e3%82%bf%e3%82%92%e6%b4%bb%e7%94%a8%e3%81%97%e3%82%88%e3%81%86/)

Glideの肝はデータをアップロードするだけでアプリが作られる、というところだと思いますが、そのデータをどこから持ってくるか、という時にオープンデータの活用を考えたものです。

そして実際に作ってみると、「これができるともっと面白くなるんだけどな」と感じるところが出てきていたのですが、そのうちの一つMap List 機能が追加されていました。
そして、その機能の利用の仕方があまりにも秀逸だったので、紹介してみたいと思います。

# Glide でのアプリ作成
基本的なアプリ作成方法は、色々なサイトで紹介されているので割愛します。
ただ、肝はデータシートの調整だと思いますので、ぜひ
[Glideの味わい方〜オープンデータを活用しよう](https://www.programmers-office.ml/glide%e3%81%ae%e5%91%b3%e3%82%8f%e3%81%84%e6%96%b9%e3%80%9c%e3%82%aa%e3%83%bc%e3%83%97%e3%83%b3%e3%83%87%e3%83%bc%e3%82%bf%e3%82%92%e6%b4%bb%e7%94%a8%e3%81%97%e3%82%88%e3%81%86/)
もご参照ください。

そして作られるアプリは、基本的には、よくある、リスト画面と詳細画面のパターンです。
![スクリーンショット 2019-04-18 19.13.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77307/43bbebf4-5628-6dac-9a39-9e951e34ee72.png)
![スクリーンショット 2019-04-18 19.22.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77307/6c3d22b2-e454-4f6d-4c9f-b7c8842f0271.png)

# Map List の使い方
このように複数の情報がそれぞれの住所情報を持っている場合に、詳細画面で地図を見るのではなく、一つの地図で複数の情報を見たいというニーズは当然あるのではないかと思います。そのための機能がMap List ですが、その使い方があまりにも簡単すぎてびっくりしたという話です。
リスト画面のレイアウトとして「List」ではなく「Map」が選べるようになりました。
<img width="400" alt="スクリーンショット 2019-07-15 10.38.20.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77307/7f011021-48f1-cb43-4ac9-e486a799737f.png">

Mapを選択すると、リストとして何を表示するか選択する画面に切り替わりますので、それぞれの項目を指定します。
Address項目に施設名称を指定することもできますが、思わぬ別の場所の同名の施設がヒットしたりすることがあるので、ちゃんと住所項目を指定します。
<img width="400" alt="スクリーンショット 2019-07-15 10.41.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77307/8c48e239-8bfc-6008-8f73-52d9bf3095cb.png">

また、画面の初期状態を、リスト表示するか、地図表示にするかを選択できます。
<img width="400" alt="スクリーンショット 2019-07-15 10.43.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77307/b73a5468-4b78-18bc-a5fe-a24f19d57abf.png">

以上終了です。
画面を表示すると右下のアイコンで、リスト表示と地図表示の切り替えができます。
<img width="240" alt="スクリーンショット 2019-07-15 10.48.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77307/642745b4-6460-2f8c-0112-3b8931db53c5.png">

住所情報を持っている「List」を「Map」に変更するだけ。しかも、リスト機能も残している。ちょっと驚きました。

アプリはこちらから参照できます。
[港区観光施設](https://minatoku-kanko.glideapp.io/)
eve-ng導入

# 自己責任
https://mega.nz/#F!fpxnXIKB!twpa-jzH4ReWZFq5uZENZg

# add dynamips image

https://www.eve-ng.net/documentation/howto-s/64-howto-add-dynamips-images-cisco-ios

# cli login

root eve

# GUI login

admin eve
do-while(false) 私の場合

```php
do {
    //
    if ($error) {
        break;
    }
    //
} while (false);
```

【 参考ＵＲＬ 】
[try～catch使うほどじゃないけどgotoは嫌だってときのための便利な書き方](https://qiita.com/mpyw/items/1dd65881368632dc0fc0)
[do-while(false) を見つけたときの雑感](https://qiita.com/khsk/items/a2e06cd5de60b918dcfb)
[PHP マニュアル - do-while](https://www.php.net/manual/ja/control-structures.do.while.php)

（まず、このテクニックのネーミングが欲しいですが、
今回のみ仮称として「ダミーブロック」とします。）

ダミーブロックは私もよく使いますが、書き方が上記とは違います。

##無限ループのリスク？

`do-while(false)` は、`false` を `true` と書き間違えると、
無限ループの可能性があります。
（０を１と書き間違えても同じ。）

また、最初は正しく書いていても、別の置換で
`false → true` と うっかり書き換わることも なくはないです。

夜 寝ているときに、
「ダミーブロックで `true` と書いちゃったかもしれない :fearful:」
と不安になることも ありえます。

（考えすぎと言われれば それまでですが :sweat_smile:）

##別の記述法１

`do-while(false)` の替わりに、
私は しばらく下記を使っていました。

```php
for ( $i = 0; $i <= 0; $i++ ) {
    //
}
```

for文なので、最初から１回のみループすることが確定しています。

ただ `for ( $i = 0; $i <= 0; $i++ ) {` の部分が
長いなぁとは思っていました。`$i` も３回も書かなきゃだし。

しかも `$i` のどれか１ヶ所を `$ii` とか `$j` に書き間違えたら、
これも無限ループになってしまいます。

なので、無限ループになりようがない
別の書き方を模索していました。

##別の記述法２

最近 採用しているのが、以下の記述です。

```php
foreach ( array(0) as $dummy ) {
    //
}
```

`array(0)` の要素数が１つなので、１回のみループします。
これは さすがに、間違っても無限ループにはならないと思います。
※ `array(0)` です。`array()` ではありません。

ただ `as $dummy` の部分が邪魔です。
`$dummy` は使わないから、これを消せれば完璧なのですが。
`as 0` とか `as null` とか試しましたがダメでした。

ちなみに `as array()` とすると、
`T_PAAMAYIM_NEKUDOTAYIM` という見慣れないエラーが出ます。
Typora 横幅を大きくする

# はじめに

マークダウンエディターの、[Typora](https://typora.io/) が使いやすくてお勧めですが、Defaultでは横幅がかなり狭いです。
これを大きくする方法を見つけたので、手順を記載します。



# 手順

Typoraを起動し、[ファイル]→[設定]→[テーマフォルダを開く]を選択

```
C:\Users\username\AppData\Roaming\Typora\themes
```

github.cssを編集する



46行目付近にある、`max-width` の箇所を`initial`に変更

```
#write {
    max-width: initial; // this will remove the default max-width
    margin: 0 auto;
  	padding: 20px 30px 40px 30px;
	padding-top: 20px;
    padding-bottom: 100px;
 }
```



Typoraを再起動すると、横幅が大きくなっている



# URL

https://github.com/typora/typora-issues/issues/1
M5stickVの起動時の音を入れ替える方法

`この記事は非技術的な内容です。過度な期待はせずにお読みください。`

M5stickVの起動時の音ってかっこいいんですが、

任意の音にしてるとよりドヤ顔できますよね。

***M5stickVの起動時の音の変更方法は？設定は？音声は！？***

![IMG_6395.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273740/64ca8dc6-f114-cc66-9642-bf41dde257ad.jpeg)


## 1. boot.pyを書き換える
デフォルトのboot.pyをSDカードで起動させてる前提です。[参考](https://qiita.com/iwaoka1986/items/565562496ed790ed83df)
boot.pyの31行目で音声ファイルを指定してあるので任意に書き換えます。
> player = audio.Audio(path = "***xxx.wav***")

ボリュームは32行目
> player.volume(***100***) 

単純に起動音を消したい場合はこのボリュームを0にするといいです。


## 2. 音声ファイルを用意する

あとは音声ファイルをSDカードに保存するだけなんですが、

再生されない場合はboot.pyの34行目をチェック。

> wav_dev.channel_config(wav_dev.CHANNEL_1, I2S.TRANSMITTER,resolution = I2S.RESOLUTION_16_BIT, align_mode = I2S.STANDARD_MODE)

これに合った音声ファイルを準備しましょう。
僕はオンライン変換サービスでチャンネル１、できる限り音質を下げる設定で変換しました。

## 3. SDに保存
あとはSDカードに保存するだけです。


## おまけ
[実際の様子](https://twitter.com/iwatch924/status/1150564387268153345)
テンション上がるカスタマイズしましょう！


---
いかがでしたか？
クロムブックのリカバリーSDの作成　失敗体験

クロムブックのリカバリーSDの作成を失敗した時の話です。
アプリをインストールします。
 Chromebook Recovery Utility
![recovery.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/d6a4c4e6-f7e0-2d20-5535-2f800d9bfeca.png)


内蔵ストーリッジの状態です。
 1.1 GB が使用可能です。
![start.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/81330e25-cbc2-cf45-969f-0cb27e5f40ad.png)


実行結果です。
　Download interrupted. Please try again.

804 MB のスペースがある時に、６５％ダウンロードして失敗しました。
1.2 GB のスペースがある時も失敗しました。
これから推測すると、1.3 GB のスペースがないと失敗します。
pytestで1ファイル／1テストだけ実行したい（他よく使うオプション）

pytest実行時に便利なオプションを書いた備忘録です。

## 前提条件

例で出てくるプロジェクトのイメージ

```
pj_root（カレントディレクトリ）
  ├..
  └tests
    ├..
    └test_example.py
```

例で登場する`test_example.py`のイメージ

```python:test_example.py
import unittest


class TestExample(unittest.TestCase):

    def test_example_ok_pattern(self):
        actual = True
        expected = True
        assert actual == expected
```

## 1ファイル／1テストだけ実行したい

### 1ファイルだけ実行する

```sh
pytest (path)

# 例
pytest tests/test_exapmle.py
```

### 1テストだけ実行する

```sh
pytest (path)::(TestClass)::(test_method)
pytest (path)::(test_method)

# 例
pytest tests/test_exapmle.py::TestExample::test_example_ok_pattern
```

## その他、よく使うオプション

### 最後にコケたテストだけ実行する

```sh
pytest --lf
```

### テストが1つでもコケたらそこでテスト実行を止める

```sh
pytest -x
```

### テストがコケた時に結果を詳細に表示する

```sh
pytest -vv
```
システムの式年遷宮のすゝめ

# 式年遷宮とは
[伊勢神宮](https://www.isejingu.or.jp/about/index.html)
「式年遷宮の「式年」とは定められ年を、「遷宮」とは宮を遷すことを意味します。式年遷宮は20年に一度、東と西に並ぶ宮地みやどころを改めて、古例のままにご社殿や御装束神宝おんしょうぞくしんぽうをはじめ全てを新しくして、大御神にお遷りいただくお祭りです。」
出典：[伊勢神宮 式年遷宮](https://www.isejingu.or.jp/sengu/index.html)
# 式年遷宮の意義
「建築技術や御装束神宝などの調度品を**現在に伝えることができ、今でもいつでも新しく、いつまでも変わらない姿を望むことができます。**」
出典：[伊勢神宮 式年遷宮](https://www.isejingu.or.jp/sengu/index.html)
# システムの式年遷宮の必要性
### 現在システムの更新間隔
　システムにおいても、知識(業務知識、技術知識)を継承し、ビジネスの環境変化に柔軟に対応し続けられるシステム構築が必要である。
　日経XTECHによれば、「基幹システムの平均寿命は14年」(出典参照)との調査結果がでている。現在のシステムは一度、基幹システムを構築した後は機能追加による断片的な改修が行われ、システムの延命が図られている。
　部分改修では、システムの全体像を把握できず「なぜここでこうしているのか」といった理由が欠如し、潜在的な問題が潜伏する危険がある。
出典：[ハード/ソフトのライフサイクル：基幹システムの平均寿命は14年](https://tech.nikkeibp.co.jp/it/article/Research/20080717/311015/)
### 定期的なシステム更改
　システム更改を定期的に行う環境を整えることにより、若手の育成が可能となり、システムの設計思想についても途切れることなく継承させることができる。
　また、随時開発が続いているため、機能追加が容易であり実装時期も把握しやすい。これは経営方針の内容を柔軟に取り込んだシステムを構築しやすい。
　一部から、「そんな費用はない」という声が聞こえてきそうだが、それが違う。必要に差し迫ってからのシステム構築は想定以上に時間(費用)がかかる。また、既存システムを知っている人材も存在しているか不明だ。新たに人を育成する場合、時間と費用がかかる。システム全体を把握している人材がいないなかでのシステム構築は、知識の欠如による問題潜伏のリスクがあり、それが顕在化した場合、対処費用もかかる。新システムが完成するまでの間、旧システムの運用費用、保守費用、機能追加も必要になるだろう。
　以上のことから、システムの式年遷宮(定期的なシステム更改)をすゝめる
PlantUMLめも


## Eclipse
### PlantUML plugin インストール

#### Eclipse Marketplace

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33237/93f351cb-1371-e5dc-2b74-ea2edd33afee.png)


#### Install new software

[PlantUML plugin](https://marketplace.eclipse.org/content/plantuml-plugin)




<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33237/763a1bfa-1b32-5b12-a932-a32fcff2670b.png" width=80%>


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33237/00f3b867-da81-2a3f-8f25-5a49adba1389.png)







### インストール後の確認


Window > Show View > Other > PlantUml > PlantUML



<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33237/911ce90f-44e6-d10e-f92b-f4b85ddb8df8.png" width=40%>

```
Cannot find Graphviz 
```

### [Graphviz](https://graphviz.gitlab.io/download/) インストール

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33237/2333c88c-a48f-0fa5-b20f-300a754dec17.png)

### [Graphvizの設定](http://plantuml.com/ja/graphviz-dot)

Window > Preference > PlantUML

* Firstly in: ''c:\Program Files\Graphviz*\bin\dot.exe''
* Then in: ''c:\Program Files (x86)\Graphviz*\bin\dot.exe''


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33237/25d22ca6-5598-a714-663e-db1e2ac0158f.png" width=80%>
mROS で Lチカしてみる

#概要
前回，「[athrillでLチカしてみる](https://qiita.com/kanetugu2018/items/a0b08f07f1f6dcca41cd)」において，仮想環境上で手軽にLチカを体験しました．
今回，これを mROS で試してみたいと思います．

※mROSについて詳しく知りたい方は，本家サイトを参照ください．
※https://qiita.com/takasehideki/items/7d783ecd605dcee29ee0
※https://qiita.com/m_ksg/items/0060a8738e6a34a0f237

#構成
今回のでデモでは，ROSのトポロジー構成を以下のようにしました．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244147/7da4e170-4291-c994-36dc-26d677e3574d.png)

led_node1とled_node2がmROS上で動作しており，WSL上のROSコマンド(rostopic)でLEDトグル用のトピック(led1_toggle, led2_toggle)を出版します．

#mROS アプリケーションプログラム
mROS上で動作するアプリケーションプログラムは以下の通りです．

##タスク側
```C
void usr_task1(void)
{
	syslog(LOG_NOTICE,"========Activate user task1========");
	int argc = 0;
	char *argv = NULL;
	ros::init(argc,argv,"led2_node");
	ros::NodeHandle n;
	ros::Subscriber sub;

	 sub = n.subscriber("led2_toggle",1, Callback2);

	ros::spin();
}
void usr_task2(void)
{
	syslog(LOG_NOTICE,"========Activate user task2========");
	int argc = 0;
	char *argv = NULL;
	ros::init(argc,argv,"led1_node");
	ros::NodeHandle n;
	ros::Subscriber sub;

	 sub = n.subscriber("led1_toggle",1, Callback1);

	ros::spin();
}
```

##トピック購読コールバック関数側
```C
void Callback1(string *msg)
{
	sprintf(callback_buffer1, "I heard [%s]",msg->c_str());
	syslog(LOG_NOTICE, "%s", callback_buffer1);
	sample_program(DIGITAL_LED1);
}
void Callback2(string *msg)
{
	sprintf(callback_buffer2, "I heard [%s]",msg->c_str());
	syslog(LOG_NOTICE, "%s", callback_buffer2);
	sample_program(DIGITAL_LED2);
}
```
##LEDトグル関数側
```C
void sample_program(uint8 led_bit)
{
    uint8 data = sil_reb_mem(DIGITAL_REG_ADDR);

    if ((data & led_bit) != 0) {
        data &= ~led_bit;
        sil_wrb_mem(DIGITAL_REG_ADDR, data);
    }
    else {
        data |= led_bit;
        sil_wrb_mem(DIGITAL_REG_ADDR, data);
    }
    return;
}
```

#ソース配置場所
上記のアプリケーションプログラムは，以下で公開しています．

https://github.com/tmori/mROS_athrill/tree/refactoring/app_led


#デモ内容
それでは，実際にデモをしてみます．

デモ手順は以下の流れです．

1. roscore コマンドで，ROSマスタを起動する
* athrill-run コマンドで，アプリケーションを起動する
* led コマンドで，仮想マイコン(athrill)の LED状態を表示する
* rostopic pub コマンドで，LED1 のトグル用トピックを出版する
* rostopic pub コマンドで，LED2 のトグル用トピックを出版する


#デモ
以下，上記手順で実施したデモ動画です．

![mROS_LED.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244147/30371f80-3d9e-4aa6-9b56-38f3b7704bbb.gif)

#最後に
mROSは，マイコン上で動作するアプリケーションでも簡単に ROS を利用できるようにしてくれるありがたいOSS組込みミドルウェアです．

これを athrill 上でさらに手軽に使えるように，昨年末から開発を進めてきました．

https://qiita.com/kanetugu2018/items/b374326cc8ff6f3b222b

今回の成果は，「athrill の Lチカの成果」と「上記の成果」を組みあわせたものです．

今後の展開としては，仮想環境上で動作確認したアプリケーションプログラムを実機に持っていき，同じようにLチカできるようにしてみたいと思います．

乞うご期待ください．
二代目社長 社内システム開発のもっと内実

##ICT企業の二代目社長として、思いだした事を書き記します

[90年代～とある中小ICT企業の社内システム](https://qiita.com/k_iwamoto/items/fec69ce6ff88cecae21d)の内実です。

当時の私は、「経営などの実務や勉強を優先するべき」などと思っていない訳で、つまり先代の社長にそう言われたのです。
「出来る訳ない、というか仕事はシステム開発ではない、そんな暇あったら経営の勉強をしろ」
なので隠れて非公式開発しました、何度かバレてましたが。
今日現在にいたるまで、先代社長と、このシステムの話をした事はありません（基幹システムなのに！）。

しかし、社長になってわかりました、先代社長の言う通りでした。
「社内実運用システムの云々は、社長の仕事ではない」優先順位の問題ではありますが、正しいです。
なので、新規開発して継承をしようとしましたが…
習得スキル（LAMPやWEBサーバー構築・運用）がもったいないので。

ICT企業なので、社長だろうと、必要ならそれこそコーディングだってしますが、それは新ビジネス開拓（革新）の為などに限定するべきですね。

もちろん、
全般、一切後悔はしていません。
やると決めた事をやり抜いた、それだけの事です。
M5stickVの起動時の画像を入れ替える方法

`この記事は非技術的な内容です。過度な期待はせずにお読みください。`

M5stickVの起動時の画像ってかっこいいんですが、

任意の画像にしてるとよりドヤ顔できますよね。

***M5stickVの起動時の画像の変更方法は？設定は？画像は！？***

![IMG_6392.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273740/518d15c4-6daa-a349-131a-bab246043bd3.jpeg)


## 1. SDカードから起動させる

M5stickVはSDカードにboot.pyを入れて起動すると自動的にSDカード優先でブートするようになってます。
[スイッチサイエンスの販売ページ](https://www.switch-science.com/catalog/5700/)にboot.pyが貼ってあるので拝借。

これをSDカードに入れて起動すると、、、
特に変わったことは何も起きませんがSDカードから起動しているはずです。

※入れ替えての初回はSDから起動せず、再起動したらSDから読み込まれるっぽいです。


## 2. boot.pyを書き換える

boot.pyの９行目で画像を指定してあるので任意に書き換えます。
> try:
    img = image.Image("***start.jpg***") 
    lcd.display(img) 

読み込みエラー時の文言も指定できるようです。

> except:
    lcd.draw_string(lcd.width()//2-100,lcd.height()//2-4, "***Error: Cannot find start.jpg***", lcd.WHITE, lcd.RED)  

この状態で起動させると

![IMG_6393.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273740/893e02c4-92cd-7510-23d2-33e0ddfb1b3d.jpeg)

こんな感じになったら成功です。

## 3. 画像を用意する

あとは画像をSDカードに保存するだけなんですが、

M5stickVは***プログレッシブJPEGに対応していません***。

![無題aaa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273740/24d89a5b-fc4e-4ff6-01de-6bc638e3987c.png)

イラレの場合は保存の際にプログレッシブのチェックを外しましょう

![無題aaa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273740/8b6184fb-cf4b-3dd3-5237-dbfad8e3a313.png)

※プログレッシブJPEGじゃない画像でも画像サイズが大きいと読み込めないようです。

## 4. SDに保存
あとはSDカードに保存するだけです。

![IMG_6392.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273740/0f33e297-cae8-a28e-548c-266c7d44eb15.jpeg)


## おまけ
画像サイズは350×150が丁度いいみたいです。
今回使った画像は自由にお使いください↓↓↓
![start.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273740/8ec087fa-7574-ec04-ed9f-479d20415fe0.jpeg)


---
いかがでしたか？
Railsのwhereメソッドとfind_byメソッドの違い

#whereメソッドとfind_byメソッドの違い

##共通点について
どちらも、特定のテーブルから条件に合うレコードを検索するためのメソッド(Active Record)であること。


##違いについて

whereメソッドは、条件に合うレコードを**全て取得する**
find_byメソッドは、条件に合うレコードのうち、**最初のレコード(idの値が小さいもの)1件だけを取得する**。


＜参考記事＞
https://railsguides.jp/active_record_querying.html
Capistrano3系設定で詰まった点まとめ(Ruby/Sinatra)

EC2でインスタンスを立てて、Capistrano3系を用いてデプロイの設定をした際に詰まった点とその対応策を書き記す。

## そもそもCapistranoとは
Rubyで作られた自動デプロイツール。特定のファイルに設定を書き記したのち、コマンドを数行打つだけで、アプリケーションをデプロイしてくれる便利ツール。
諸々の設定が終わったらローカル環境から以下のコマンドを打つことによってデプロイが完了する。

```
bundle exec cap production deploy:check
bundle exec cap production deploy
```

Capistranoそれ自体や、設定の仕方については以下の記事を参照すると良い。
https://qiita.com/naoki_mochizuki/items/657aca7531b8948d267b
https://qiita.com/Salinger/items/4ee4f3c5ebd5227196c0
https://labs.gree.jp/blog/2013/12/10084/

## 詰まった点
bundle exec cap production deployを実行した時にたくさんのエラーが出て詰まった。

### エラー1: rbenvないよエラー
#### エラー詳細

```
rbenv:validate
      WARN  rbenv: 2.6.0 is not installed or not found in /root/.rbenv/versions/2.6.0 on your_domain
```

#### 解決策
deploy/production.rb内のuserを確認すること、以下のuserの部分と同じuser権限でrbenvの設定を行うこと。自分の場合、EC2インスタンス内でrootでrbenvの諸々の設定を行なっていたため上記エラーがで続けた。

```
server 'your_domain', user: 'ec2-user', roles: %w{app}
```

### エラー2: github権限エラー
#### エラー詳細
githubにアクセスするとpermission deniedになるおなじみのやつ。

#### 解決策
公開鍵と秘密鍵を発行してgithubアカウントに登録すると解消。
https://qiita.com/shizuma/items/2b2f873a0034839e47ce

### エラー3: mkdir権限ないよエラー
#### エラー詳細
mkdirを実行する権限がなく、permission deniedになる。

#### 解決策
権限変更すると解消。
参照: https://qiita.com/itoufo/items/dbd1ef1081fa70f4d24f

### エラー4: .envないよエラー
#### エラー詳細

```
ERROR linked file /var/www/your_app/shared/.env does not exist on...
```

#### 解決策
該当ディレクトリに.envファイルを作成すると解消

### エラー5: rbenvインストールされてないよエラー
#### エラー詳細

```
bundle stdout: rbenv: version `2.6.0' is not installed (set by RBENV_VERSION environment variable)
```

#### 解決策
config/deploy.rbに書かれている以下のコードのpathを絶対パスに変更すると解消

```
set :rbenv_path, '/home/ec2-user/.rbenv/'
```

### エラー6: unicornコマンドないよエラー
#### エラー詳細

```
bundler: failed to load command: unicorn (/var/www/your_app/shared/bundle/ruby/2.6.0/bin/unicorn) ArgumentError: directory for stderr_path=/var/www/your_app/log/unicorn.stderr.log not writable
```

#### 解決策
your_appディレクトリ下にlogディレクトリがなかったので作成、中にlogファイルを作成してchmod 555を実行すると通過
参考記事
https://qiita.com/naoki_mochizuki/items/657aca7531b8948d267b
https://qiita.com/aplifyjp/items/5d24394dbd03712a2f1f

### デプロイできた
わけわからんくらいエラーが出たがなんとかデプロイできた。インフラ系は何回も構築繰り返すことで知識つくと思うので頑張りたい。
エンジニアに必要なググる力について

#1.様々なググり方

##文章を単語に分割して、ググる
単語検索する方が、ヒット率が上がる。
例えば、「RailsのWebアプリケーションでサーバーを構築する方法」を知りたいと思う場合、「Rails Web サーバー 構築」のように単語を分割してググる。


##期間指定で新しい記事を探す

検索画面下のバーの一番右側に「ツール」という文字がある。そこをクリックして、「期間の指定なし」をクリックすると、期間を指定することができる。
https://gyazo.com/f3f03f5d2dd47b58eee4815636158561

##英語で検索する
プログラミングに関する情報は海外の方が豊富であるため、日本語よりも英語検索に方がヒット率が上がる。

例えば、「devise ログインURL 変える方法」と検索するよりも、「how to change devise login url」で検索した方がヒットしやすい。

英語検索でよく使う英単語(人それぞれ)

| change | 変える |
|:--|:--|
| save | 保存する |
| default | デフォルトの |
| compare | 比較する |
| configure | 設定する |
| override | 上書きする |
| install | 導入する |

##マイナス検索
マイナス検索は、除きたいキーワードを指定できる機能のこと。除きたいワードの前に-をつけるとできる。

ex) Qiitaの記事を検索結果から除きたい場合
通常検索の場合
https://gyazo.com/6aba1d5a7d48aafdc231edefe1fd7c26

マイナス検索の場合
https://gyazo.com/eefd5ca99caf4b9c5ad7cfe4297d5a88

##フレーズ検索

フレーズ検索は、検索したいキーワードをピンポイントでヒットさせたい時に使う機能のこと。
検索する時は、完全一致で検索したいワードを"(ダブルクウォーテーション)で囲んで検索する。


#2.注意点

##一次ソースを調べること
一次ソースとは「情報の出どころ」という意味である。一次ソースは開発者による情報であるため信頼性が最も高い情報である。言語の一次ソースは公式サイトに、ライブラリの一次ソースは多くがGithubに存在する。


ex)
Ruby on Railsのガイド: http://guides.rubyonrails.org/
gem deviseのドキュメント: https://github.com/plataformatec/devise
JavaScript リファレンス: https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference
RailsのORM機能について

#ORM機能とは?

ORM機能とは、(オブジェクト/リレーショナルマッピング) の略称である。これは、直接SQL文を書く代わりに非常に短いコードで、データベースの読み書きを行える機能のことをいう。

生のSQL文とActiveRecordで変換されたSQL文の違い

生のSQL文

```sql
SELECT  `tweets`.* FROM `tweets`
```

生のSQL文をActiveRecordに変換した文

```ruby

Tweet.all
```

#ActiveRecordが使える理由


ActiveRecordは、モデルに記載するものである。そのため、モデル作成をrails g modelコマンドで生成する時に、ActiveRecordが使える仕組みがRails側で備わっている。rails g modelコマンドで生成されたモデルクラスは、全てActiveRecord::Baseというクラスを継承している。
※クラスの継承については以下の記事を参照
https://www.sejuku.net/blog/16094
ActiveRecord(アクティブレコード)はRubyのGemの一種である。このGemは、モデルとテーブルをつなぎ合わせることで、Railsからテーブルのレコードにアクセスできるようにする役割を担っている。また、ActiveRecordはRailsにデフォルトでインストールされている。






＜参考記事＞
https://railsguides.jp/active_record_basics.html
Node.jsでGoogle Drive上のファイルをリネームする (Google Drive API v3)


Google Drive APIをNode.jsから触る以下の記事たちの続きです

* [Node.jsでGoogle Driveの指定フォルダからファイル一覧を取得メモ](https://qiita.com/n0bisuke/items/ff1479cd14e7a0c0be0c)
* [Node.jsでGoogle Drive上のファイルを複製（copy）する](https://qiita.com/n0bisuke/items/6d73bb6e1af123db9a9b)
* [Node.jsでGoogle Drive上のファイルを指定フォルダに移動する](https://qiita.com/n0bisuke/items/8f108408a9e1067b9225)

メソッドは移動の時同様に[update](https://developers.google.com/drive/api/v3/reference/files/update?authuser=1)を使います。

`Google Drive API rename`とかで調べるとv2のpatch APIみたいなのが出てきますが、v3の`files/update`でも出来ました。

## 基本は移動の時のdrive.files.update()のコード

チュートリアルコードのlistFiles関数をmain関数として定義しなおして以下のように呼び出します。

`requestBody`の指定がAPIリファレンスだけだとイマイチ分かりにくかったけど、サンプルコードでそれっぽい記述がありました。

> https://github.com/googleapis/google-api-nodejs-client/blob/master/samples/drive/upload.js#L31-L33

```update.js
//省略

function main(auth) {
    const targetFileId = `xxxxxxxxxxxxxxxxxxxx`; //リネームしたいファイルID
    const newName = '新しい名前';

    const drive = google.drive({version: 'v3', auth});
    const params = {
        fileId: targetFileId,
        requestBody: {
            name: newName
        }
    };

    drive.files.update(params)
    .then(res => console.log(res))
    .catch(err => console.log(err));
}
```

## 所感

Google Drive APIのv3でファイル操作するときはupdateメソッドに結構お世話になりそうなので、[UpdateのAPIのリファレンスページ](https://developers.google.com/drive/api/v3/reference/files/update?authuser=1)のチェック必須かも
classセレクタおよびidセレクタのそれぞれの特徴(自分専用のメモ書き)

最近JavaScriptを使ったインクリメンタルサーチの実装を行なっていた際、今まで理解できなかったclassセレクタおよびidセレクタの特徴についてのメモ書き

セレクタとは、CSSやJavaScriptの処理対象であるHTML要素のこと。

##classセレクタ
種別名を割り当てるもので、 同じclass名を、1ページ中に何度でも使うことができる。

##idセレクタ
固有の名前を割り当てるもので、 同じid名は、1ページ中に1度しか使えない。


インクリメンタルサーチの実装において、両者の違いが理解できた理由は、複数の検索窓のclass名が同一であった時にJsでclass名を指定した時、複数の検索窓においてインクリメンタルサーチのイベント発火が発動してしまったことである。そのため、idセレクタを指定することで、特定の検索窓でのみ、インクリメンタルサーチのイベント発火が行われるようにした。
RXマイコンでPWM出力

# 作るもの
RX64マイコンPWM信号を出力しました。
作る信号はサーボモーターとかラジコンで使用している信号と似た仕様です。
【仕様】

* 周期Tが固定
* パルス幅が最小W1から最大W2までの間で可変
* 出力を止めることなくパルス幅Wを変更する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204268/30e322ec-499d-79ef-2468-44d2432c8b7a.png)




# スマートコンフィグレータの設定

スマートコンフィグレータの設定はこんな感じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204268/8875051a-b1fc-2017-acf9-be33220932e9.png)

ポイントは　__TGRC(タイマジェネラルレジスタC)__ が__バッファレジスタ__として使用可能なチャンネルを選択することです。

RX64Mマイコンでは、 MTU(マルチファンクションタイマパルスユニット)0,3,4,5,6,7では　TGRCがバッファとして使用可能とデータシートに記載されています。
（MTU1と2は使えない）

# バッファレジスタの動作

バッファレジスタの作用を図示します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204268/0245ff0b-8e54-cfb2-6545-d4427b016533.png)

* コンペアマッチBでカウンタクリア ⇒ TGRBレジスタの値が周期Tに相当する
* コンペアマッチBで端子を１に設定　⇒　出だしがHighのパルスを生成
* コンペアマッチAで端子を０に設定　⇒　TGRAレジスタ値がHighパルス幅に相当する
* コンペアマッチA発生時にTGRCの値をTGRAに転送する　⇒　次の周期でのHighパルス幅を変更している。

TRGCのバッファ作用が無いとAGRAの値がレジスタライトのタイミングで更新されますので、書き込みタイミングによってはコンペアマッチAが発生しません。

# スマートコンフィグレータが生成した関数

スマートコンフィグレータが生成したヘッダファイルのプロトタイプ宣言です。
**_rx64m_MTU0_PWM**の部分はスマートコンフィグレータのコンポーネント追加時に入力を求められた名称なので、デフォルトだと __Config_MTU0__のような名称になります。

```c
void R_rx64m_MTU0_PWM_Create(void);
void R_rx64m_MTU0_PWM_Start(void);
void R_rx64m_MTU0_PWM_Stop(void);
void R_rx64m_MTU0_PWM_Create_UserInit(void);
```
クリエイトとスタート,ストップしかありませんので、パルス幅可変の部分は自分で追記する必要があります。
TRGCレジスタの値を書き換えるための関数を下記のように追加します。

```c
void R_rx64m_MTU0_PWM_Set_RegA(unsigned short  iRegValue){
    MTU0.TGRC = iRegValue;
}
```

# 動作確認


<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">RX64Mマイコンで可変PWM <a href="https://t.co/jzT3zqrI1F">pic.twitter.com/jzT3zqrI1F</a></p>&mdash; cyebu1103 (@cyebu1103) <a href="https://twitter.com/cyebu1103/status/1150527628127830017?ref_src=twsrc%5Etfw">July 14, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
よく使うショートカットキーの一覧

##一般的によく使うショートカットキー

| ⌘ + C | 選択内容をクリップボードにコピー
|:--|:--|:--|
| ⌘ + X | 選択内容をクリップボードにコピーし、選択内容を削除する 
| ⌘ + V | クリップボードの内容を貼り付ける 
| ⌘ + Z | 最後にした操作を取り消す 
|⌘ + ⇧ + z|最後に取り消した操作を元に戻す
| ⌘ + S | 変更を保存する 
| ⌘ + W | 最前面のウィンドウを閉じる 
| ⌘ + tab | 開いているアプリをリスト表示する（tabを複数回押すと切り替える）
| ⌘ + F1(※) | 同一アプリの、別ウィンドウに切り替える
| ⌘ + F | 画面内で文字列を検索する
| ⌘ + T | 新しいタブを開く
| ⌘ + N | 新しいウィンドウを開く 
| ⌃ + A（入力時） | その行の先頭に移動する
| ⌃ + E（入力時） | その行の末端に移動する 
| ⌃ + H（入力時） | 前の文字を１つ消す（deleteと同じ）
| ⌃ + D（入力時） | 次の文字を１つ消す 
| ⌃ + K（入力時） | カーソルの右側の文字を全て削除する
| ⇧ + 上下左右（入力時） | 文字を選択・選択範囲を変更する
| ⌘ + R | 更新 
| ⌘ + ⇧ + Z | 直前に取り消した変更内容をやり直す（元に戻す） 
| F11 | デスクトップを表示 
| ⌘ + Q | 最前面のアプリケーションを終了する 
| ⌘ + +/- | 画面の拡大/縮小 
|control + 十字キー|開いているウィンドウの切り替え

##chromeでよく使うショートカットキー

| ⌘ + 左右 | ページを戻る/進む 
|:--|:--|:--|
| ⌘ + 上下 | ページの最初/最後に移動 
| ⌘ + ⌥ + 左右 | 隣のタブに切り替える 
| ⌘ + ⌥ + I | 要素の検証 (ディべロッパーツール)
| ⌘ + L | アドレスバーに移動
| ⌘ + ⇧ + T | 最後に閉じたタブを開く 


##テキストエディタでよく使うショートカットキー
(エディタの種類によって異なる部分もある)

| ⌘ + O | ファイル/ディレクトリを開く 
|:--|:--|:--|
| （ディレクトリを開いている時）⌘ + P | ディレクトリ内でファイル検索
| （ディレクトリを開いている時）⌘ + B （続けて入力） | そのディレクトリのツリー構造を表示/非表示 
| ⌘ + L | カーソルのある一行を選択（続けて押すと次の行を選択） 
| ⌘ + X | 選択範囲を切り取り 
| ⌘ + D | カーソルにある単語/選択した文字列をファイル内で検索し、選択。複数回押すと複数選択でき、選択後になんらかの文字を入力することで一括編集できる。 
| ⌥+ 上下 | カーソル行/選択した行を、行ごと上下に移動する 
| ⌥+ ⇧ + 上下 | カーソル行/選択した行を、行ごとコピーし下に貼り付ける（複製）
| ⌘ + / | カーソル行/選択した行をコメントアウトする
getmailの設定を考える

# 概要
getmailで受信するにあたってのいい感じの設定を考える。
一番シンプルな設定から徐々に設定を変化させていく。
getmail + maildrop + neomutt + msmtp の getmailからmaildropへ渡すところまで。

# 環境
Arch Linux
getmail 5.13
gnome-keyring 3.31.91
maildrop 3.0.0

# getmailとは
名前の通りメールを受信するためのツール。
fetchmail を置き換えることを目指して開発されたらしい。

# 設定ファイルについて
```
$ locate getmailrc 
/usr/share/doc/getmail-5.13/getmailrc-examples
$ head /usr/share/doc/getmail-5.13/getmailrc-examples 
#
# This file contains various examples of configuration sections to use
# in your getmail rc file.  You need one file for each mail account you
# want to retrieve mail from.  These files should be placed in your
# getmail configuration/data directory (default: $HOME/.getmail/).
# If you only need one rc file, name it getmailrc in that directory,
# and you won't need to supply any commandline options to run getmail.
#

```
- getmailの設定ディレクトリは $HOME/.getmail/
- 1ファイル1アカウント
- 1アカウントだけだったら
    - ファイル名は getmailrc とすればOK
    - getmailコマンド実行時にオプションいらないよ
    - つまり複数アカウントのときはオプションいるよ


# 設定ディレクトリを作る
```
$ cd $HOME
$ mkdir .getmail
```

# 多分いちばんシンプルな設定
```
$ cd $HOME/.getmail
$ vim getmailrc
[retriever]
type = SimplePOP3Retriever
server = pop.example.net
username = yourname
password = yourpassword

[destination]
type = Maildir 
path = /home/yourname/Maildir/
```

# パスワードは暗号化したい
gnome-keyringにパスワードを保存することでplain textでパスワードを保存しないようにします。Desktop Environmentがgnomeじゃなくても使える。
aurヘルパーはyayを使っています。

```
$ sudo pacman -S gnome-keyring --noconfirm
$ yay -S python2-gnomekeyring --noconfirm
$ getmail --store-password-in-keyring
```
実行したらgetmailrcのpassword行は消してOK

## gnome-keyringの自動起動
.xinitrc で起動時に gnome-keyring-daemon を起動する。

```
dbus-update-activation-environment --systemd DISPLAY
eval $(/usr/bin/gnome-keyring-daemon --start --components=pkcs11,secrets,ssh)
export SSH_AUTH_SOCK
...
exec i3
```
# getmailからmaildropへ
maildropで細かい振り分けを行うのでmaildropをインストール。
getmailで受信したメールをどこに送るのか、を設定するdestinationディレクディブを修正する。

```
$ yay -S courier-maildrop
$ which maildrop
/usr/bin/maildrop
$ vim $HOME/.getmail/getmailrc
[retriever]
type = SimplePOP3Retriever
server = pop.example.net
username = yourname

[destination]
type = MDA_external
path = /usr/bin/maildrop
```

# getmailを実行するたびにメールを全部取得しようとするのを止める
```
[options]
read_all = false
```
これを設定すると $HOME/.getmail/oldmail-pop.example.com-port-username@example.com 的なファイルができてそこに受信したメールが記録されるっぽい

以上
JFreeChart-XYPlot-マウスの動きに応じて十字線と値を表示する-ArXYPlotMouseMovedHandlerを使用


目次 ⇒ [JFreeChartサンプル](https://qiita.com/artery/items/3e9c63e5c14a9e965c97)

```java
package jp.avaj.lib.chart;

import java.awt.Color;

import org.jfree.chart.ChartFrame;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.axis.ValueAxis;
import org.jfree.chart.plot.Plot;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.StandardXYItemRenderer;
import org.jfree.chart.renderer.xy.XYItemRenderer;
import org.jfree.data.xy.XYDataset;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;

/**
■ JFreeChart-XYPlot-マウスの動きに応じて十字線と値を表示する-ArcXYPlotMouseMovedHandlerを使用
・ArCrosshairListenerをリスナーに登録すると、マウスのX座標に対するY値を取得し十字線と値を表示する.
・複数のグラフ表示にも対応する.その場合は横線がその数だけ表示される.

 */
public class Chart19_01 {

  public static void main(String[] args) {
    new Chart19_01();
  }

  private Chart19_01() {
    XYDataset dataset = createDataset();
    ValueAxis xAxis = new NumberAxis();
    ValueAxis yAxis = new NumberAxis();
    XYItemRenderer renderer = new StandardXYItemRenderer();
    XYPlot xyPlot = new XYPlot(dataset,xAxis,yAxis,renderer);
    JFreeChart jfreeChart = new JFreeChart("CrossHairOverlay",(Plot)xyPlot);
    ChartFrame cFrame = new ChartFrame("CrossHairOverlay",(JFreeChart)jfreeChart);
    cFrame.pack();
    cFrame.setVisible(true);

    // リスナーを登録する,色をGRAYに指定する
    // 最後の引数はシリーズ番号、-1を指定すればすべてのシリーズについて処理する.
    // シリーズ番号は順番に生成されるので、シリーズ番号とグラフの意味は自分で管理する必要がある.
    new ArcXYPlotMouseMovedHandler(cFrame.getChartPanel(),Color.GRAY,-1);
  }

  /** 表示データを作成する */
  private XYDataset createDataset() {
    XYSeriesCollection dataset = new XYSeriesCollection();
    // 一本目
    XYSeries xySeries = new XYSeries("data-0");
    for (int j=0; j<10; j++) {
      xySeries.add(j,j+Math.random()*4.0D);
    }
    dataset.addSeries(xySeries);
    // 二本目
    xySeries = new XYSeries("data-1");
    for (int j=0; j<10; j++) {
      xySeries.add(j,9-j+Math.random()*4.0D);
    }
    dataset.addSeries(xySeries);
    return dataset;
  }
}

```

![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278568/49e8230c-f28e-6ead-889d-a772b4a8142c.png)