OmniAICreator/Qiita-1.07M huggingface dataset:
【Nuxt.js】デフォルトの色を定義して汎用的に使えるようにする

#### デフォルトの色を定義して汎用的に使えるようにする

```vuejs:default.vue
<template>
  <div>
    <nuxt />
  </div>
</template>

<style>
/* 使用する色を定義 */
:root {
  --dark-grey: #999b9f;
  --grey: #dcdfe5;
  --light-grey: #f6f7f9;
}
</style>
```
#### var(プロパティ)とすれば定義した色が適用される

```vuejs
<style>
.button--grey {
  background: var(--light-grey);
  border: 1px solid var(--grey);
}
</style>
```
#### classに`button--grey`を指定すれば、上記で設定したCSSが適用されることがわかる

```vuejs
<template>
  <section>
    <!-- 省略 -->
    <div class="btn">
      <nuxt-link :to="{ name: 'create', params: {url: url} }">
        <Btn class="button--grey" :text="btn"></Btn>  <!-- コンポーネント化したボタンを呼び出し -->
      </nuxt-link>
    </div>
  </section>
</template>
```
CLionでUnable to save settings: Failed to save settingsが出た場合

# 概要

CLionでRustのプラグインをインストールしたら、 `Unable to save settings: Failed to save settings`というエラーメッセージが出た場合の対処方法について。

![スクリーンショット 0002-03-03 午後9.59.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/250965/2d5bac93-eed1-625d-930a-c36b3561379c.png)

# 環境

* **IntelliJ Rust plugin version:** 0.2.117.2170-193
* **Rust toolchain version:** 1.39.0 (4560ea788 2019-11-04) x86_64-apple-darwin
* **IDE name and version:** CLion 2019.3.4 (CL-193.6494.38)
* **Operating system:** macOS 10.14.6

# 対処方法

以下のコマンドを実行して、CLionを再起動すれば治る。

```shell
rm -rf ~/Library/Application\ Support/CLion2019.3
```

# 参考

- https://youtrack.jetbrains.com/issue/OC-16255
- https://github.com/intellij-rust/intellij-rust/issues/974

(もしかしたらMarkdownプラグインが原因かも)
AutomatorでMacの"サービス"を作り、右クリックコンテキストメニューやその他いろいろな方法で実行する 

# やりたかったこと
UNIX timestampが示す時刻を、**秒**でわかる必要があった。できない私は、コンピューターの力を借りる必要があった。

コンピューターの力を借りてやりたかったことは以下の通り。

1. 画面上でUNIX timestampのテキストを選択して
1. できるだけ少ないアクションで
1. 人間が読める時間のフォーマットに変換し
1. 表示する

# 環境
macOS Catalina
バージョン 10.15.3


# できあがったもの

![Feb-28-2020-09-49-13.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104442/da0bfb35-1a4f-f334-f632-933adc7fdf8a.gif)


# どう作ったか
Macにデフォルトで搭載されている**Automator**を使った。
> *Automator は、簡単に作業を効率化できるパーソナル自動化アシスタントです。Automator を使えば、単純なドラッグアンドドロップ操作で「自動化レシピ」を作成し、実行できます。自動化レシピは、単純なタスクも複雑なタスクも、必要なときに必要な場所で実行してくれます。*
https://support.apple.com/ja-jp/HT2488

以下がソースコード。AutomatorはGUIプログラミング環境なので、ソースコードは画像で示さざるをえない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104442/a7b51acc-9f2e-4163-afee-58f4de7bf66d.png)

私はシェルコマンド愛好者なので、内部でdateコマンドが躍動している様子が見てとれるだろう。
ちなみに`シェル:`とあるが、プルダウンを開くとperl, python, rubyといったLLも使えるようだった。
![image (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104442/2a76b925-8f28-8ac4-1408-0497ddb84acc.png)


Automatorでこのソースコードを保存した瞬間に、このプログラムはMacの**サービス**として利用できるようになる。

# **サービス**はどこから呼び出せるか
いろんなとこからイケる。これだけ実行方法があると、なかなか夢ひろがりんぐなんじゃないでしょうか！！！

## 右クリックコンテキストメニュー

![image (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104442/b17732bb-ce72-5536-112a-7a75c43938ec.png)

（特になにも設定しなくても現れる）

## ショートカットキー

![image (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104442/04935163-3afb-f11f-f3c8-4f1e3b32b4d6.png)

システム環境設定 > キーボード > ショートカット > サービス

## Touch Bar

![image (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104442/f84a0200-7df9-302e-e098-b5e7ed9996bc.png)

システム環境設定 > キーボード > Touch Barに表示する項目: クイックアクション
を設定した上で
システム環境設定 > 機能拡張 > Touch Bar > `unix timestamp to rich time` をチェックON
ActiveRecordのwhereの書き方、？の使い方

#前提

条件絞る時になんとなくwhereで繋いで書いていたので、
見ていて気になった点をまとめて備忘録として書いておきます。

#「?」を使う理由

たまにActiveRecordで「？」が使われているのを見ますが、
これは、**条件によって使用する数値が変動するとき**に使います。

```
User.where("age = ?", params[:age])
```

上記コードのように、
最初の引数は、**文字列で表された条件**として受け取り、
その後に続く引数は、**文字列内にある疑問符 「 ? 」 に置き換わる**ようになります。

#書き方

これを踏まえて、一通り書き方をまとめます。

###一致検索

```
User.where(name: 'taro', age: 20)
User.where('name = ? and age = ?', 'taro', 20)
```

###〇〇以上、〇〇以下

```
User.where('age >= ?', 20)
User.where('age <= ?', 20)
```

###LIKE検索

```
User.where('name like ?', '%ryu%')
```

###LIKE検索を含ませる

```
User.where('name like ? and age = ?', "%ryu%", 20)
```
Linuxの「/(スラッシュ)」の役割を知っておくと恥をかかずに済むかもって話

#はじめに
Qiita初投稿です。
Railsチュートリアルの第1章を進めていた際に、Linuxコマンドの「/(スラッシュ)」の役割を知らなかったせいで、gitのリポジトリを作り直すという勿体ないことをしてしまいました。
そのため、自戒を込めて記事に残しておきます。

※以後、「/(スラッシュ)」を「/」と省略させて頂きます。

#「/」は2つの役割がある
具体例を用いて、2つの役割の違いを説明していきます。
今回、AWSのEC2のインスタンスを使用して、Linuxコマンドを実行させていきます。

また、前提として現在のディレクトリは`/home/`の直下としており、ディレクトリ構成は下記を想定しています。（厳密にはもっとフォルダやファイルがあります）

```ruby:ディレクトリ構成イメージ
home
└── ec2-user
    └── environment 
        ├──hello_app
        └──README.md
``` 

##1つ目の役割
・**そのまま「/」として使用される**

**使用コマンド**：`ls ec2-user/environment/`

```ruby:実行結果
hello_app  README.md
``` 
こちらはよくファイルパス等を指定する時の「/」のイメージ通りの挙動になっています。

問題は次です。

##2つ目の役割
・**ルート（最上位パス）として使用される**

**使用コマンド**：`ls /ec2-user/environment/`
※先ほどのコマンドからec2-userの頭に「/」を足しただけです。

```ruby:実行結果
ls: cannot access /ec2-user/environment/: No such file or director
``` 

「そんなフォルダは存在しないよ」とエラーになってしまいました。
何故こんな挙動になるか調べるために、違うコマンドを実行してみましょう。

**使用コマンド**：`ls /`

```ruby:実行結果
bin     dev   lib    lost+found  nvm-install.txt  root  selinux  tmp
boot    etc   lib64  media       opt              run   srv      usr
cgroup  home  local  mnt         proc             sbin  sys      var
``` 

今回はエラーにならなかったですね。
ここで「実行結果」の中で注目して頂きたいのが「home」です。

今回のフォルダ構成は、元々下記を想定していました。

```ruby:ディレクトリ構成イメージ
home
└── ec2-user
    └── environment 
        ├──hello_app
        └──README.md
``` 

「home」が最上位にありますね。

現状、コマンド実行時の場所が`/home/`の直下となっているにも関わらず、`ls /`の実行結果の中で「home」が登場しています。
(ちなみに、`/home/home/`というディレクトリは存在しません)

本来であれば「実行結果」で「ec2-user」が出てこないとおかしいことになるはずです。

ということは、つまり、`ls /`の「/」は「**ルート（最上位のパス）**(絶対パスでフォルダパスを書いたときに一番左に出てくるもの)」ということになります。

実際に、下記のコマンドを実行してみると…
**使用コマンド**：`ls /home/ec2-user/environment/`

```ruby:実行結果
hello_app  README.md
``` 

となり、「絶対パス」で指定されていることが分かります。

このことより、「/」には2つ目の役割があることが分かりました。

##結論
「/（スラッシュ）」には下記の2つの役割がある。
・通常の「/」として使用される。
・ルート（最上位パス）として使用される。

#おわりに
勢いで記事を書いたため、技術的な間違えや読みづらい説明などがあるかもしれません。
その場合にはご指摘頂けますと幸いです。

それにしても、意外と記事の投稿って時間がかかるものなんですね…
頻繁に記事を投稿されている方の凄さを改めて知ることが出来た気がします。

#参考文献
"/"と"."と".."の意味 初心者のためのLinuxサーバー構築講座
http://www.obenri.com/_operation/root_dots.html
Rubyのバージョンが勝手に切り替わってしまう問題

# ターミナルを起動したらRailsが使えなかった

プログラミング初心者です。初記事です。

環境構築は一通り終わった、と思っていましたが
`$rails s`のコマンドを打つと以下のエラーが、、

```
rbenv: version `ruby-2.6.3' is not installed
```

確かにインストールしたし昨日まで使えてたやん！（泣）
と早速萎えました。。

# まずは状況確認

```
$ which ruby
/usr/bin/ruby
```
↑そもそもここに原因がありそうです。
rbenvでインストールしたものではなく、
Macにデフォルトで入っているRubyのPATHがこちら。

rbenvでインストールしたものなら、`$ which ruby`のコマンドで
`/Users/local/.rbenv/shims/ruby`が表示されるそうです。

ではPATHが書かれている設定ファイルを確認。

```
$ open ~/.bash_profile
```
上記コマンドで.bash_profileのファイルが開けます。

内容を確認すると、
`export PATH="$HOME/.rbenv/bin:$PATH"`
`eval "$(rbenv init -)"`
ということで正しくrbenvのPATHを読み込む設定になっていました。

※ここが違ったら、上記のように書き直す必要があるみたいです。

# .bash_profileを読み込むよう指示

.bash_profileは正しそうなので、これを反映させるコマンド

```
$ source ~/.bash_profile

$ which ruby
/Users/local/.rbenv/shims/ruby

```
できた！
これで正しいPATHが反映されているので、
あとはRubyのバージョンを再度確認。
2.6.3に変更して完了！

```
$ rbenv versions
  system
  2.4.1
  2.6.3
* 2.7.0

$ rbenv global 2.6.3
$ rbenv versions
  system
  2.4.1
* 2.6.3
  2.7.0
```

以上です！

この感じだと、毎回Terminal起動時にはまず
`$ source ~/.bash_profile`コマンドを打たなければならないのかな、、？
また調べて分かったことがあればまとめます！

# 追記
上記の問題が解決できたのでもう1つ記事を書きました！
参考になれば嬉しいです！
https://qiita.com/hacchi_mom/items/8e3ec4336312be343194

# 参考記事
https://qiita.com/akatsuki174/items/c0384b9903b4b5cbbdaf
https://easyramble.com/rbenv-ruby-version-trouble.html
[Rails] Docker上でのcredentials.ymlの編集

## はじめに
自分と同じ初学者向けの内容になっているので間違っている箇所や読みづらい文章になっているかもしれませんがご了承下さい。

## 内容
Rails5.2から追加されたcredentials.ymlをDocker上のRailsプロジェクトで編集しようとしたら下記のようなエラーが出ました。

- credentials.yml編集コマンド
 - EDITOR='vi' rails credentials:edit

```
bundler: command not found: EDITOR=vi
Install missing gem executables with `bundle install`
```

## 解決方法
エラーを見る通りviがないみたいなのでDockerfileへインストールするように追加でvimを書きます。

```
RUN apt-get update -qq && apt-get install -y \
    build-essential \
    nodejs \
    vim\
 && rm -rf /var/lib/apt/lists/*
```

記述後、ビルドし直したら無事にコマンド実行可能になり編集できました！！

## おまけ
自分はDocker上でRailsコマンド実行の際にはコンテナが毎度増えないように`docker-compose run --rm [railsコマンド]`オプションで`--rm`をつけていたのですが、これでは実行できませんでした。
代わりに`docker-compose run -e [railsコマンド]`で`-e`オプションをつけて実行しました。
計算に便利なselfメソッドとroundメソッド

## 便利なメソッド
商品の価格に自動的に消費税8%を足してくれるプログラムを実装する際にどのようなメソッドを使用すればよいのでしょうか

```ruby
class Product < ApplicationRecord
  def add_tax
    self.price = (price * 1.08).round
  end
end
```
実装はこちら
ここで使用されているメソッドはどのような働きがあるのでしょうか

## self
selfはオブジェクトそのものを表します。またクラス内で使用される際には変数を参照する場合にも用いられます。
Productクラスのインスタンスである@productの値を参照することができます。
3行目ではself.priceにてインスタンス変数のpriceに次の値を代入することを表しています。

## roundメソッド
roundメソッドは四捨五入することができます。
1.4.round は1
1.5.round は２
といった具合に四捨五入してくれます。
引数に桁数を渡すことができ
1.23456789.round(2) は1.23
といった具合に小数点以下の桁数を指定できる。
整数を四捨五入する際には引数に負数を指定することで実現する
123456789.round(-3) は123000000となる

## 参考記事
[Rubyで数値の切り捨て・切り上げ・四捨五入する](https://uxmilk.jp/43388)
ページ全体を読み込んだ後に実行したい処理があったので $nextTick を使用した

### 概要

ページ全体がレンダリングされた後に実行したい処理があったので`$nextTick`を使した

```vuejs
<script>
export default {
  mounted() {
    this.$nextTick(() => {
      // DOMの更新後に実行される処理
    })
  }
}
</script>
```
### 参照
- [API - Vue.js](https://jp.vuejs.org/v2/api/index.html)
messageboxを閉じると、元のダイアログじゃないダイアログがアクティブになる話

#なんでそうなる!#
他愛のないことなんだけど、ぜんぜん情報がなかったので記録

###事の始まりはごく普通の画面の開発###

いつもどおり
messageboxの共通クラスを入れて（同僚のＰＧから流用）
親（Ａ）画面を作り、子（Ｂ）画面を作り、などなどなど
特に問題なく簡単に完成！

で、
###ちょいテストするか～###

子（Ｂ）画面で、入力、チェックＮＧ、エラーメッセージ出た。クリック！
「ん？」
親（Ａ）画面がアクティブに上がってきたぞ？？？

![imeg.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276480/d0be7777-8e1b-a5f6-a043-dfc46df0ec37.jpeg)



#なんでそうなる!#

何回やっても同じようになる。
開発環境がおかしいのか？

windows 10 visualstudio2017 WPF .NETframework 4.5.2
(ためしにvisualstudio2010でやっても同じ）




##問題のソース##


>     class Class1
    {
        public static void errmsg(string text)
        {
            MessageBox.Show(text,"エラー",MessageBoxButton.OK,MessageBoxImage.Error,MessageBoxResult.OK,
                MessageBoxOptions.DefaultDesktopOnly);
        }
    }


##何をやっても、そうなる##

何とかしようとして試してみました。

###　.Active()を置いてみる###

ダメでした。
コールしてるイベントの後でＡがアクティブ（画面のトップ）に来る感じ

###　topmostではさんでみる　###

ダメ、ではないけれども、、、
topmostは確かにＢがトップに居続けるので、見た目は問題ない
でも、アクティブはＡが持っていっているので、見た目が、操作的にも問題アリ
（topmostは一番上に張り付くので、怖い）

###　共通モジュールじゃなく直接書く　###

これはＯＫだった。
でも、「共通化」したいのでＮＧ
さらに、やっかいなパターンが
一回、直接書いたmessagebox.showをした後、
共通化したmessageboxだと、ＯＫ（子画面がActiveに)
（わけがわからん）


# 結局何が問題か＆解決策　#

1.親からshowで子ダイアログを起動している
2.共通モジュールでmessagebox.showしている
3.MessageBoxOptions.DefaultDesktopOnlyをつけている
このような条件がそろうと発生。

なので
MessageBoxOptionsをつけないと発生しない。
ちなみに
ServiceNotificationでも発生するので
このオプションを省略するほうがいいかも
突っ込んで調べていないので、
「オプションをつけないことによる弊害」は調べていない

####以上(知らないソースを流用しなきゃよかった。。）####
【Swift】 UIAlertController内のtextFieldで、エンターが押された時に処理を行いたい。

アラート内のテキストフィールド入力後、キーボードのエンターが押されたとき処理を行いたいです。
下記のようにアラートを出しています。

func alertAction(){
   let alertController = UIAlertController(title:"hogehoge",message: nil, preferredStyle: .alert)

   alertController.addtTextField{ (textField) in
      textField.placeholder = "hogehoge"
   }
}

※textFieldShouldReturn()を試しましたが上手くいきませんでした。
よろしくお願いいたします。
hooksを使って(簡単に)ReactアプリへGoogleAnalyticsを導入する方法

GoogleAnalyticsの導入は通常のサイトであればスクリプトを所定の位置に貼り付けて終わりですが、その方法ではReact(やVue)のようなSPAのアプリでは上手くいきません。

Reactにではその対応策として**`react-ga`**の利用が一般的です。ただ私も使ってみようと調べてみたのですが、最初のとっかかりが掴めず微妙に苦労しました。それでも何とか実現できたので備忘録も兼ねて記事にしてみました。

hooksを用いてそこそこ綺麗に処理を切り出せたかも？と思っています。参考にしていただければ幸いです。

といってもGoogleAnalytics関連ほぼ知識ゼロの状態からサクッと作りました。
不備等ありましたらコメントいただければ幸いです。

# 前提
- 本記事では、`react-ga`の`pageview`に関してのみ説明します
- サンプルコードでは`react-router`を利用しています
- GoogleAnalytics側の設定は完了しているとします。

# 最低限必要な処理
 react-ga の公式ドキュメント(https://github.com/react-ga/react-ga) を見る限り、最低限必要な処理は以下の3行です。

https://github.com/react-ga/react-ga#usage

```javascript
import ReactGA from 'react-ga';
ReactGA.initialize('UA-000000-01');
ReactGA.pageview(path);
```

つまりReactGAをimportして、initializeして、目的の箇所でpageview(path)を走らせるだけです。それだけで最低限は動いてくれます。ページの遷移を通知するだけなら、pageviewをコンポーネントのcomponentDidMountやuseEffectの中で呼び出せばOKでしょう。

# サンプルコード
上記を踏まえてサンプルコードです。hooksで作成しました。やはりhooksを使うと上手く切り分けれられて良いですね。

## hooks
```typescript

import { useEffect } from 'react'
import ReactGA from 'react-ga';

ReactGA.initialize('UA-159393636-1');

const useGaTrackPage = (path: string) => {
  useEffect(() => {
    ReactGA.pageview(path);
  }, [path])
}

export default useGaTrackPage
```

説明の必要もないくらいシンプル。
ReactGAをimport & initialize(引数はGoogleAnalyticsのトラッキングID)して、useEffect内で`ReactGA.pageview(page);`を実施しています。

useGaTrackPageは引数としてpath(測定対象のサイトURLのドメインを含まないパス)を受け取ります。
例えば`https ://news.yahoo.co.jp/pickup/6352961`が測定対象であれば、渡すのは`/pickup/6352961`になります。
ただreact-routerを用いる場合、利用側でその辺りを意識する必要は全くありません。この点は後ほど説明します。

## コンポーネント(hooks利用側)
```typescript
import React from 'react'
import useGaTrackPage from './hooks/useGaTrackPage'
import { useParams, useLocation } from 'react-router-dom'

const SomeComponent: React.FC = () => {
  const location = useLocation()
  useGaTrackPage(location.pathname)

  return (
      <NextComponent />
  )
}

export default SomeComponent
```

useGaTrackPageをimportして、コンポーネント内で呼び出すだけです。引数には useLocation()を利用したlocation.pathnameを渡せばOK。コンポーネントに追加するコードはわずか2行で済みます。

# 最後に
まとめると上の`useGaTrackPage`を用意して、任意のコンポーネントで呼び出してあげればOKです。
useGaTrackPageに渡す引数も、location.pathnameと同等のものを渡せば良いので、特にreact-routerである必要もありません。実際このやり方で、到達ページを指定したコンバージョンの測定はできました。まぁまぁ使いやすいのでは？と思っていますがいかがでしょう？

この方法に不備がある場合や、もっと良いやり方をご存知の方は是非コメントください！
Google Chrome の翻訳結果を改善する konnnyaku (蒟蒻) ツールを作りました

## TL;DR

成果物は[こちら](https://ampcpmgp.github.io/konnnyaku/)です。
レポジトリは[こちら](https://github.com/ampcpmgp/konnnyaku)です。

# konnnyaku とは？

Google Chrome 翻訳結果を改善するタグチェンジャー konnnyaku (蒟蒻) です。 Bookmarklet になっています。

## どういうものか

例えば、以下のページを翻訳してみましょう。

 https://github.com/kt3k/kocha 

![image-20200303151236011](https://raw.githubusercontent.com/ampcpmgp/konnnyaku/master/images/image-20200303151236011.png)

これを普通に翻訳すると、、、

![image-20200303151356905](https://raw.githubusercontent.com/ampcpmgp/konnnyaku/master/images/image-20200303151356905.png)

最初の文がよく分からないですね。コードの中身も翻訳されてしまいました。

------

そこで蒟蒻を使うと・・？

![image-20200303151650643](https://raw.githubusercontent.com/ampcpmgp/konnnyaku/master/images/image-20200303151650643.png)

最初の文が読めるようになってます！素晴らしい👏

コードの中身も、少しフォントが小さくなってしまいましたが、コードのまま維持されています。

Chrome では　`code` タグに囲まれていると、翻訳をスキップする作りになっているので、蒟蒻はこの辺りのタグ変更をうまく調整しています。



## 使い方

以下のページにある Bookmarklet をご利用ください。対象のページで実行後、翻訳を起動してください。

Bookmarklet置き場は[こちら](https://ampcpmgp.github.io/konnnyaku/)。


## 注意点

上手く動かないページもよくあります。  
仮想スクロールを使っていたり、汎用化しにくいタグを使っているページなどは対応出来ていません。


# Development

```shell
npm install
# Modify konnnyaku.js and package.json (version).
node ./build.js
```
UiPathのユーザーインターフェイスの呼び方 まとめ

RPAツールであるUiPathのユーザーインターフェイスの名称について調べてみたのでメモ。
公式ドキュメントに明確な表現がない場合は、これが最も一般的な名称であろうというものを記載してみました。

# デザイン画面

**「プロジェクト」**の中身を表示して編集する画面です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/69e9649e-f33c-95e8-1d6f-b89043e50c48.png)

### ワークフロー
デザイナーパネルの中に表示される一連の図形を**「ワークフロー」**と呼びます。ワークフローには「シーケンス」「フローチャート」「ステートマシン」の3種類があります。また、デザイナーパネルの中に敷き詰められている空間を「キャンバス」と呼びます。キャンバスの中に、この3つのワークフローの1つまたは複数を配置しながら、中にさまざまなアクティビティや、アクティビティを載せる「アプリケーションスコープ」などのコンテナーを配置していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/21e6d3af-4f36-b2a9-a3f2-9fd5c30f2437.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/71ce7461-a9c7-e15e-0a0f-eb026b737728.png)


### コマンドパレット
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/371c81e4-9a3d-6a32-524a-d20f2dfa7d38.png)


**参考情報**

* [UiPath Studio ガイド - ユーザーインターフェイス](https://docs.uipath.com/studio/lang-ja/docs/the-user-interface)
* [UiPath 2019.7月次リリース報告](https://www.uipath.com/ja/blog/developer/uipath-2019.7-monthly-update)


# バックステージビュー

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/b912f4fb-7637-246c-50c3-dd5ee887d7c3.png)

### プロセス
ワークフローも含めた実行単位を**「プロセス」**と呼びます。プロジェクトの一種です。

### ライブラリ
**「ライブラリ」**はもうひとつのプロジェクトの種類であり、こちらは再単体では動作せず、利用可能な部品として作成します。

# レコーディングツールバー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/8a602689-0174-b286-4c1d-811bf914c274.png)

### 拡大鏡
UiPathドキュメントには記載がないのですが、レコーディング中に左上に出てくるウィンドウは「拡大鏡」と呼ぶのがよいでしょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/d85aeb5c-8bac-258b-708e-04fafc7f3037.png)


### ポップアップウィンドウ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/e43097cb-8e53-b04c-e4c1-87ab519cfeef.png)



**参考情報**

* [UiPath Studio ガイド - レコーディングについて](https://docs.uipath.com/studio/lang-ja/docs/about-recording)
* [UiPath Studio ガイド - レコーディングの種類](https://docs.uipath.com/studio/lang-ja/docs/about-recording-types)
* [UiPath Studio ガイド - 手動レコーディング](https://docs.uipath.com/studio/lang-ja/docs/manual-recording)
正規分布の確率密度関数を理解してみる

# あらすじ

```math
f(x)=\frac{1}{\sqrt{2\piσ^2}}e^{-\frac{(x-μ)^2}{2σ^2}}
```

正規分布は代表的な分布の一つであり、統計の分野で頻出する分布です。
しかし正規分布の確率密度関数は↑式のようにとてもややこしく、多くの初学者を葬り去ってきました。
かく言う僕も統計の勉強を始めて、初めてこの式を見た時は頭痛と眩暈を覚えた記憶があります。

本記事では、↑式の係数部分($\frac{1}{\sqrt{2\piσ^2}}$)と指数部分($-\frac{(x-μ)^2}{2σ^2}$)に分けて、なぜこのような形になったのかを記述していきます。

# 指数部分
世の中の多くの事象は平均値を取る確率が最も大きく、平均値から離れるにつれその値を取る確率は小さくなります。

これを簡単に表す式が、

```math
f(x)=e^{-x^2}
```
です。
グラフで表すと、

```python
import numpy as np
import matplotlib.pyplot as plt

def normal_dist(x, ave = 0, disp=1):
    return np.exp((-(x-ave)**2)/(2*disp**2))

x = np.linspace(-3, 3)
y = normal_dist(x)

plt.plot(x,y)
plt.grid(axis="both")
plt.show()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411380/111ad054-c893-5a59-f311-ca6f8548257f.png)
こんな感じで山なりの形になります。

この式では一通りのグラフしか書けないので汎用性に劣ります。
そこで、
①グラフの左右移動
②グラフ幅の変更
の機能を追加します。

###グラフの左右移動
$x$の部分を$x-μ$に変更することで、極大値を取る$x$の位置をずらすことが出来ます。

```math
f(x)=e^{-(x-μ)^2}
```
こんな式になります。
$μ$の値を変えていき、グラフの変化を見てみましょう。

```python
color = ["b", "g", "r", "c", "m"]
for i, col in enumerate(color):
    y = normal_dist(x, i)
    plt.plot(x, y, color=col)
    
plt.show()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411380/22bdb283-d87e-a112-6fdb-2542c8ec5ba0.png)
$μ$が大きくなるにつれ、グラフが右にずれていきました。

###グラフ幅の変更
指数部分に$\frac{1}{2σ^2}$を掛けると幅の変更が可能になります。

```math
f(x)=e^{-\frac{x^2}{2σ^2}}
```

```python
x = np.linspace(-10, 10)
color = ["b", "g", "r", "c", "m"]
for i, col in enumerate(color):
    y = normal_dist(x, 0, i+1)
    plt.plot(x, y, color=col)
    
plt.show()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411380/db03e2aa-83ac-77c6-b7d3-4a0abd650721.png)

幅を変えることに成功しました。
σを二乗にしたのは正負どちらも扱えるようにするため、$2$を掛けているのは計算しやすくするためです。

# 係数部分
確率密度関数なので面積の合計が$1$でなければいけません。
そこで都合の良い値を関数に掛けてやります。
都合の良い係数を$c$と置き、

```math
\int_{-\infty}^{\infty}ce^{-\frac{(x-μ)^2}{2σ^2}}dx=1
```
を計算し、$c$を求めます。

一見やっかいな計算に見えますが、

```math
\int_{-\infty}^{\infty}e^{-ax^2}dx=\sqrt{\frac{\pi}{a}}
```
このガウス積分の公式を用いて$a=\frac{1}{2σ^2}$とすれば

```math
c=\frac{1}{\sqrt{2\piσ^2}}
```
となり、簡単に計算が可能です。
解は一番上の式の係数になりました。

結局この式は、$f(x)=e^{-x^2}$に汎用性を持たせ、係数を調整することで確率密度関数を定義するという式なのでした。
めでたしめでたし。

# 参考にしたサイト
https://to-kei.net/distribution/normal-distribution/density-function-derivation/
正規分布の密度関数を意味的に理解する

https://mathtrain.jp/gauss
ガウス積分の公式の２通りの証明

https://bellcurve.jp/statistics/course/7797.html
14-1. 正規分布
【Udemy Python3入門+応用】　29. 集合のメソッド

**※この記事はUdemyの
「[現役シリコンバレーエンジニアが教えるPython3入門+応用+アメリカのシリコンバレー流コードスタイル](https://www.udemy.com/course/python-beginner/ "現役シリコンバレーエンジニアが教えるPython3入門+応用+アメリカのシリコンバレー流コードスタイル")」
の講座を受講した上での、自分用の授業ノートです。
講師の[酒井潤](https://twitter.com/sakaijun "酒井潤")さんから許可をいただいた上で公開しています。**


##■集合のメソッド
#####◆`.add`と`.remove`
```
>>> s = {1, 2, 3, 4, 5}
>>> s.add(6)
>>> s
{1, 2, 3, 4, 5, 6}
>>> s.add(6)
>>> s
{1, 2, 3, 4, 5, 6}
>>> s.remove(6)
>>> s
{1, 2, 3, 4, 5}
```
`.add`で集合に要素を加えることが、
`.remove`で集合から要素を除くことができる。
ちなみに、すでにある要素を`.add`しても意味がない。
(集合型では同じ要素は1つにまとまる。)

#####◆`.clear`
```
>>> s.clear()
>>> s
set()
```
`.clear`で集合内の要素がすべて消える。
このとき、なぜ`{}`ではなく`set()`と表示されるかだが、
Pythonでは`{}`は辞書型の空のものとなっている。

```
>>> d = {}
>>> d
{}
>>> type(d)
<class 'dict'>
```
これらが被らないように、書き分けている。
Three.jsで作る星のカービィ

こんにちは．[おいしい数学](https://hiraocafe.com) という高校数学のサイトをやっている平岡です．下の名前が晃なので，ネットだとAKRという略称でやってます．

さて，高校数学の教材を作る上で，立体などの3Dコンテンツに使えるなと思い，Three.jsに少し前から着目しました．Three.jsはJavascriptが使えれば，[ics.medea](https://ics.media/tutorial-three/)さんを見れば少し勉強すれば使えるようになると思います．かなり助かってます

すっかり魅了され，Three.jsで何でも表現できるのでは？？と思い，急に，例えば星のカービィとか簡単に表現できるのでは？？と思い，挑戦することにしました．

本体は球なので，デフォルトで用意されているジオメトリを使えば問題ないのですが，楕円体がどうやって表現するかわからない．．

ネット上を探しに探して，情報を組み合わせてやっと表現できたので，以下に挑戦した結果載せます笑

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

楕円体はParametricGeometryで作ります．楕円体を媒介変数表示するので，高校数学もわからないとですね．

せっかく作ったので，弊サイトには[星のカービィ](https://hiraocafe.com/asobikirby.html)に載せました

こちらの本業は予備校講師なので，是非本業の方のすごいカービィが見てみたいです〜
Pythonでgoogletransを使って翻訳

# 概要
Pythonでグーグル翻訳を使うためのパッケージgoogletransを使って、グーグル翻訳と元の英語の文章を並べて表示するプログラムを作った。

# はじめに
英語とグーグル翻訳した日本を並べたファイルを作りたかった。手軽に試してみたかったのでPythonで作ることにした。

# 調査
検索すると、こんなサイトを見つけた。
[Python – googletransを試してみました。 ｜ Developers.IO](https://dev.classmethod.jp/beginners/python-py-googletrans/)

PyPIで公開されている。
[googletrans · PyPI](https://pypi.org/project/googletrans/)
> Googletrans is a free and unlimited python library that implemented Google Translate API. This uses the Google Translate Ajax API to make calls to such methods as detect and translate.

なぜか、フリー。いいんかな？制約はいくつかあるみたい。

ちなみに、GoogleのTranslation APIは有料。
[Cloud Translation ドキュメント  |  Google Cloud](https://cloud.google.com/translate/docs)

# 環境
下記コマンドでインストールできた。

```
~$ pip3 install googletrans
```

実施環境の各バージョンは下記の通り。

```
~$ python3 --version
Python 3.5.3
~$ pip3 list | grep google
googletrans (2.4.0)
```

# プログラム
以下のようなプログラムを作った。
コマンドライン引数で、英語のテキストファイルを入力して、原文と翻訳結果を標準出力に出す。

```translate.py
from googletrans import Translator
import sys

args= sys.argv
if len(args) < 2:
    print('Command should be like')
    print('python3 translate.py textfile.txt')
else:
    print('open '+args[1])
    f = open(args[1])
    lines = f.readlines()
    f.close()

    translator = Translator()
    for line in lines:
        translated = translator.translate(line, dest="ja");
        print(line) # English
        print(translated.text) # Japanese
        print()
    print('finished')
```

# 実行
下記コマンドで英語の書かれているファイルを入力して、英語と日本語訳の書かれているファイルを出力できる。

```
python3 translate.py file_en.txt > file_jp.txt
```

入力ファイルとその結果は以下の通り。

```file_en.txt
Hello,
World.
```
```file_jp.txt
file_en.txt
Hello,

こんにちは、

World.

世界。

finished
```

他の文章も確認したところ、ブラウザのグーグル翻訳のアドインで翻訳した訳と、googletransを使って翻訳した結果が違った。

# おわりに
簡単に作れた。PythonとGoogleとgoogletransすばらしい。
今後、本家のAPIの無料枠内で似たようなことやって比較したい。
50万文字/月までは無料らしい。下記サイト参照。
[Cloud Translation  |  Google Cloud](https://cloud.google.com/translate/?hl=ja)
[3 分で作る無料の翻訳 API with Google Apps Script - Qiita](https://qiita.com/tanabee/items/c79c5c28ba0537112922)
[Google翻訳APIを無料で作る方法 - Qiita](https://qiita.com/satto_sann/items/be4177360a0bc3691fdf)
Oracle19cにおけるTO_DATE関数の挙動

# はじめに

職場でOracleのアップグレード（11g→19c）をすることになったのでバージョン間での互換性の問題などを調べていたところ、以下の記事を見つけました。

* [19cにアップグレードしてTO_DATEで困った話](https://tech-oracle.blog.ss-blog.jp/2019-07-07-1)

上記の記事ではTO_DATE関数の挙動が変わって`TO_DATE('20190520','YYMMDD')`がエラーになる一方で、`TO_DATE('20120520','YYMMDD')`はエラーにならないということでしたが、これは日付を解析するパーサーが変わったためではないかとのことでした。

よく使われる日付フォーマットは、上記の記事で触れられている`YYMMDD`以外にも幾つかあるため、日付フォーマットを変えてTO_DATE関数の挙動を調べてみることにしました。


# テストを実行した環境

* Oracle社が提供している[Oracle Live SQL](https://livesql.oracle.com/)でOracle19cを利用しました。

# テスト

## エラーが発生したSQL

* 以下のSQLを実行すると、`ORA-01843: not a valid month`が発生しました。

```sql
-- 日付文字列がYYMMDD
SELECT TO_DATE('120520','YYYYMMDD') FROM dual;
SELECT TO_DATE('130520','YYYYMMDD') FROM dual;
-- 日付文字列がYYYYMMDD
SELECT TO_DATE('20130520','YYMMDD') FROM dual;
```

## 正常に実行できたSQL

* 以下のSQLを実行すると、`20-MAY-12`（2012年5月20日）もしくは`20-MAY-13`（2013年5月20日）が返されました。


```sql
-- 日付文字列がYYMMDD
SELECT TO_DATE('120520','YYMMDD') FROM dual;
SELECT TO_DATE('130520','YYMMDD') FROM dual;
-- 日付文字列がYY/MM/DD
SELECT TO_DATE('12/05/20','YY/MM/DD') FROM dual;
SELECT TO_DATE('13/05/20','YY/MM/DD') FROM dual;
SELECT TO_DATE('12/05/20','YYYY/MM/DD') FROM dual;
SELECT TO_DATE('13/05/20','YYYY/MM/DD') FROM dual;
-- 日付文字列がYY.MM.DD
SELECT TO_DATE('12.05.20','YY.MM.DD') FROM dual;
SELECT TO_DATE('13.05.20','YY.MM.DD') FROM dual;
SELECT TO_DATE('12.05.20','YYYY.MM.DD') FROM dual;
SELECT TO_DATE('13.05.20','YYYY.MM.DD') FROM dual;
-- 日付文字列がYYYYMMDD
SELECT TO_DATE('20120520','YYMMDD') FROM dual;
SELECT TO_DATE('20120520','YYYYMMDD') FROM dual;
SELECT TO_DATE('20130520','YYYYMMDD') FROM dual;
-- 日付文字列がYYYY/MM/DD
SELECT TO_DATE('2012/05/20','YY/MM/DD') FROM dual;
SELECT TO_DATE('2013/05/20','YY/MM/DD') FROM dual;
SELECT TO_DATE('2012/05/20','YYYY/MM/DD') FROM dual;
SELECT TO_DATE('2013/05/20','YYYY/MM/DD') FROM dual;
-- 日付文字列がYYYY/MM/DD
SELECT TO_DATE('2012.05.20','YY.MM.DD') FROM dual;
SELECT TO_DATE('2013.05.20','YY.MM.DD') FROM dual;
SELECT TO_DATE('2012.05.20','YYYY.MM.DD') FROM dual;
SELECT TO_DATE('2013.05.20','YYYY.MM.DD') FROM dual;
```

# まとめ

* Oracle19cの場合、特定の日付文字列と日付フォーマットの組み合わせでエラーが起きることが分かりました。
 * Oracle曰く「これはバグではない、仕様である」とのことらしいので、TO_DATE関数を使っている箇所を一通り調べた方が良さそうです。
* 年月日の間にスラッシュやピリオドが入っている場合は、いずれもエラーが発生しませんでした。
 * [こちらの記事](https://tech-oracle.blog.ss-blog.jp/2019-07-07-1)でも指摘されているように、区切り文字のおかげで日付文字列を正確に解析できているのだと思います。
* 区切り文字がなくても、日付文字列と一致する日付フォーマットの場合には、正しい日付を取得出来ていました。
 * 当たり前のことですが、日付文字列と日付フォーマットは確実に一致させておくべきでしょう。
【Nuxt.js】v-bindを使ってclassを動的なものにする （入力欄にカーソルがfocusした時だけ指定のcssを適用させる）

### 概要
 入力欄にカーソルがfocusした時だけ指定のcssを適用させたかったので、v-bindディレクティブ（下記は省略記法）を使って、classを動的なのものにした

### 実際のコード
```vuejs
<template>
  <div :class="{ 'input_box': true, 'shadow_input_box': active }">
    // 省略
    <input type="text" @focus="onFocus" @blur="onBlur" />
  </div>
</template>
```

- `'input_box': true`とした場合、input_box classに適用されているstyleが常に適用される
（falseにすれば適用されなくなる）

```vuejs
<style>
.input_box {
  // 常に適用したいプロパティ: 値; を記載
}
</style>
```
- shadow_input_box classには以下のCSSを指定

```vuejs
<style>
.shadow_input_box {
  box-shadow: 0px 0px 3px grey;
}
</style>
```

- 入力欄にカーソルがあたった時のみシャドウつけたい（上記のCSSを適用させたい）ので、scriptは次のようになる

```vuejs
<script>
export default {
  data() {
    return {
      active: false  // 初期値
    }
  },
  methods: {
    onFocus() {
      this.active = true  // シャドウがつく
    },
    onBlur() {
      this.active = false  // シャドウはつかない
    }
  }
}
</script>
```
google-drive-ocamlfuseでGoogleドライブをマウント

# 概要
`google-drive-ocamlfuse`を使うと、Googleドライブをマウントできます。
「同期」ではなく「マウント」なので、ストレージ容量を（たぶん）圧迫しません。

# インストール
```bash
sudo add-apt-repository ppa:alessandro-strada/ppa
sudo apt-get update
sudo apt-get install google-drive-ocamlfuse
```

もしこう言われたときは

```
-bash: add-apt-repository: コマンドが見つかりません
```

こうしましょう

```bash
sudo apt install software-properties-common
```

# 認証

```bash
google-drive-ocamlfuse
```

google-drive-ocamlfuseはGUIのブラウザで認証を求めるので、もしVPSなどでGUI環境がない場合以下のようなエラーが発生します。

```
$ google-drive-ocamlfuse 
/bin/sh: 1: xdg-open: not found
/bin/sh: 1: firefox: not found
/bin/sh: 1: google-chrome: not found
Cannot retrieve auth tokens.
```

このエラーを解消するには以下の方法があります

1. [手元に用意した仮想マシン上で認証ファイルを作成し、実環境に転送する](https://k-side.hatenablog.jp/entry/2016/09/05/205407)  
   → 手元にある程度パワみのあるPCが必要
2. [実環境にGUI環境とVNCサーバーをインストールし、手元からVNC接続する](https://qiita.com/shotasano/items/0cf255a7ad6ec0cf52d7)  
   → 実環境のストレージに少なくとも約10GBの空き容量が必要
3. 以下の方法で実環境上で認証する

3の場合、Slackのワークスペースが必要です。
まず、[こちら](https://qiita.com/cabbage_lettuce/items/5841c02ec7cad8fa6a8f)に倣ってSlackアプリをセットアップし、[ここ](https://qiita.com/cabbage_lettuce/items/5841c02ec7cad8fa6a8f#linux%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E5%8C%96)まで進めます。
その際、

- 最終行に`read`を挿入します。
- 保存先を`/usr/local/bin/slacknotify`ではなく`/usr/local/bin/xdg-open`にします。

そしてまた以下のコマンドを実行します。

```bash
google-drive-ocamlfuse
```

するとSlackで認証URLが届きます。
![TyyzRNGgfK8b8DN1583235404_1583235445.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244946/dc499d39-adab-4bd2-a70d-a68b75debf78.jpeg)
あとはこれを手元のPCで開きログインすれば、認証は完了します。


# セットアップ

適当な場所にディレクトリを作り、そこにマウントします。

```bash
mkdir ~/google-drive
google-drive-ocamlfuse /home/ubuntu/google-drive
```

これでマウントできました。

以下のコマンドで確認できます

```bash
$ df -h --total
Filesystem              Size  Used Avail Use% Mounted on
udev                    471M     0  471M   0% /dev
tmpfs                    99M  1.2M   98M   2% /run
:
google-drive-ocamlfuse   15G  3.6G   11G  24% /home/ubuntu/google-drive
total                   115G   24G   91G  20% -
```

# アンマウント

```bash
fusermount -u /home/ubuntu/google-drive
```

# 参考元
公式リポジトリ
https://github.com/astrada/google-drive-ocamlfuse

debian で google-drive-ocamlfuse を使って Google ドライブをマウントする
https://k-side.hatenablog.jp/entry/2016/09/05/205407

Ubuntu 14.04 で add-apt-repository が無いと言われた
https://loumo.jp/wp/archive/20150626000042/
sklearn.preprocessing.Imputer について

現在(2020/03/03)，COVID-19の感染拡大に伴う小中高校の休校を受け，N予備校の教材がすべて無料公開されています．僕も「機械学習 入門」に手を付けているとことでありますが，「12.欠損値の扱い方」でちょっとしたトラブルが発生．

エラー

> ImportError: cannot import name 'Imputer' from 'sklearn.preprocessing'

僕の使っている`scikit-learn`のversionは`0.22.2`なのですが，このバージョンでは`sklearn.preprocessing.Imputer`がサポートされていないようです．

https://scikit-learn.org/stable/modules/classes.html?highlight=sklearn%20preprocessing#module-sklearn.preprocessing

---

解決策を調べました．

https://scikit-learn.org/stable/modules/impute.html

```python
from sklearn.impute import SimpleImputer
```

を使えば良いようです．
box-shadow を一部分だけ消す方法

# 要約
box-shadow を一部分だけ消すには、同じ背景色の疑似要素を使って影の上に被せます。

# 導入
box-shadow を掛けた要素が別の要素と並んでいる時、上下左右の一部分だけ消したいことがあるかと思います。
プロパティ単体では上下左右の個別指定はできないのですが、box-shadow の上に疑似要素を重ねることで擬似的にbox-shadow の一部分だけを消すことは可能です。

# 例
例えば以下のようなボックスを作りたい場合、 ul に box-shadow を掛けると以下のように掛かってしまいます。
<p class="codepen" data-height="265" data-theme-id="default" data-default-tab="css,result" data-user="semigura" data-slug-hash="xxGLqMN" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="box-shadow-1-1">
  <span>See the Pen <a href="https://codepen.io/semigura/pen/xxGLqMN">
  box-shadow-1-1</a> by semigura (<a href="https://codepen.io/semigura">@semigura</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

そのため li ごとに box-shadow を指定する必要がありますが、ただ個別指定しただけだと影が前の要素に被ってしまいます。

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

これを防ぐには、疑似要素でボックスと背景色と同じ要素を作り、影の上に被せます。

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

サンプルでは要素の右端と下端に被せていますがもちろん上下左右どの方向でも使用できます。

# 注意点

背景色が同じである必要があるので、要素の背景色が変わることが想定される場合には使用できません。

# 参考

[css - remove box shadow from only top of div? - Stack Overflow](https://stackoverflow.com/questions/19428584/remove-box-shadow-from-only-top-of-div)
codeigniter3 データベースからYYYY/MM/DD形式で日付を取得する

codeigniter3でcreate_dateとupdate_dateを**YYYY/MM/DD**の形式で取得する

```ruby:qiita.rb
$this->db->select(
'*,
DATE_FORMAT(create_date,"%Y/%m/%d") AS create_date,
DATE_FORMAT(update_date,"%Y/%m/%d") AS update_date,'
);
```
初心者から始めるJava、式と演算子 1

追記：2020/3/4 参考書籍を追記
#はじめに
この記事は備忘録である。
参考書レベルの内容だが、本記事に掲載するコードについては、
**間違えた**ものが中心となる。これは実際にコーディング中に間違えた部分を掲載し、自分で反省するために投稿するという目的によるもの。
また、後日にJavaSilver試験問題の勉強を兼ねて復習するため、深い部分の話はここでは触れない。

#環境
言語：Java11、JDK13.0.2
動作環境：Windows10

#式とは
小さいころから四則演算を行い、式を読むことには慣れていると思うが、同じ電子演算機である電卓とプログラムとでは違う部分もあるので、注意が必要。

Javaにおいて「式」は以下の二つで構成される。

1、**演算の仕方【演算子】(Operator)**
ex) +（足す）、-（引く）、*（掛ける）、/（割る） etc...

２、**演算の対象【オペランド】(Operand)**
ex) 1 + 2 における1と2

#式の実践
プログラムでは同じ+を、「文字列の連結」と「演算」の両方に使うことができる。文字列は""で囲われた中身。実際に表示する際の手順は割愛。

```Java:連結ミス
//5番のくじを持っているとき

"僕のくじ番号は" + 2 + 3 + "だ。"
//間違い。この結果は"僕のくじ番号は13だ。"となってしまう。
```
この間違いは、+で文字列として連結する前に、優先して数字を計算されるようにするべきだった。1と3がオペランドと認識されてしまい、そのまま順番に文字として表示されている。

正解："僕のくじ番号は" + (2 + 3) + "だ。"

**演算子には優先順位**があり、数学でも「乗算除算が優先」、「カッコの中身が優先」という話は聞いたことがあるだろう。

---
正しい例
ex) (1 + 2)
結果：3

ex) "Java" + "Script"
結果：JavaScript

数字の代わりに変数をオペランドとして使うことで、計算結果がそのまま現れたように表現でき、自分の好きな文章を作ることができる。｛｝で囲った中が演算の手順。

---
ex) 
｛
int mathExam = 60;
int englishExam = 90;
int worldHistoryExam = 65;

int myTotalScore = mathexam + englishExam + worldHistoryExam;

"僕の合計点数は、" + myTotalScore + "だった。";
｝

結果：僕の合計点数は、215だった。

---

それぞれをオペランドのブロックのように見れば、実際の数値がどうなっているか分かるだろう。
なお読点、句読点はあらかじめ文字列の中に入れておく必要がある。

#代入
上の例で言えば、myTotalScore変数に対して、右辺にある三教科得点の合計が代入されたことになる。＝の演算子が「右辺と左辺が等しくなることを示す」、と考えるとこの式は分かりにくい。
プログラムにおいて ＝　演算子は、**「左辺の変数に、右辺の演算結果（評価）を代入する」**と考えた方がいい。

ループカウンタ（現在の周回が何回目か数えておく変数、よく使われる）の式を挙げて説明する。


ex)　
int loopCounter = 0;{
...
loopCouter = loopCounter + 1;
}
右辺と左辺が合わないが、プログラム的には正しい。まず右辺を評価して、１週目の時には初期値の0に1を加えた値がloopCounterに入っている。
この仕組みをループが周回する度に起きるようにすると、loopCounter変数の値が1ずつ増えていく。

#終わりに
式と代入を考えるだけで精いっぱいになってしまったので、「演算子の種類」や「代入演算子」「演算の優先順位」などは明日投稿する。

#参考
今まで書いていなかったので、僕の参考書を挙げる。
出来るだけ自分で変数や式を書いてコンパイルしているので、完全に引用する場合はその旨記述する。

[やさしいJava 第7版](http://mana.on.coocan.jp/yasaj.html)
RNN と LSTM の解析ノート

RNN の勾配消失を微分形式を使って簡単に解析的に概算し， LSTM や GRU がいかにしてこの問題を解消するかを見る．ついでに residual net も．
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">RNN の勾配消失を微分形式を使って簡単に解析的に概算し， LSTM や GRU がいかにしてこの問題を解消するかを見る．ついでに residual net も．<a href="https://twitter.com/hashtag/%E6%95%B0%E5%AD%A6?src=hash&amp;ref_src=twsrc%5Etfw">#数学</a> <a href="https://twitter.com/hashtag/%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92?src=hash&amp;ref_src=twsrc%5Etfw">#機械学習</a> <a href="https://twitter.com/hashtag/%E6%B7%B1%E5%B1%A4%E5%AD%A6%E7%BF%92?src=hash&amp;ref_src=twsrc%5Etfw">#深層学習</a> <a href="https://twitter.com/hashtag/LSTM?src=hash&amp;ref_src=twsrc%5Etfw">#LSTM</a><a href="https://t.co/dQcXenixgC">https://t.co/dQcXenixgC</a></p>&mdash; Yamagata (@YamagataTwit) <a href="https://twitter.com/YamagataTwit/status/1234798508139401217?ref_src=twsrc%5Etfw">March 3, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
日本語キーボードでNohBoardを使う 

#日本語キーボードでNohBoard
日本語キーボードでNohBoardを使おうと思いましたが、デフォルトのセットの中にはなかったので自分でセットを用意しました。

#用意するもの
NohBoard本体:https://github.com/ThoNohT/NohBoard/releases
JPキーボードセット:https://bit.ly/2wsoPhO (DropBoxへ飛びます)
あると便利)半角フォント:https://opentype.jp/hankakufont.htm

#セット内容等の説明

###内容物
「JPキーボードセット」を解凍後、中身の「LikeJP109」と「global」を「NohBoard-ReWrite-vx.x.x」(任意のバージョン)内「keyboards」の中に放り込んでください。![無題1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306146/14482a69-ea1e-2e36-6fc9-7f91c08f12b8.png)

###キーセットについて
テンキーの有無とテンキー+マウスボタンの３つを用意しました。いらないボタンがあれば、消して、スペースを詰めて使うといいと思います。
テンキー無し:LikeJP109
テンキー有り:LikeJP109Num
テンキー+マウス:LikeJP109NumWithMouse

#作る際に詰まったところ、省いたところ、付け加えたところ。
「全/半」キーの動作が特殊であまりよくわからなかったので省きました。同じ理由から「カタカナ/ひらがな/ローマ字」キーについても省略させていただきました。ほかにもいくつか省略させていただいたキーがあります。

日本語表記を利用したキーを用意するときに、半角フォントがあると便利かもしれません。
その場合、まず対象のキーを選択、右クリックし、「Element Style」を選択してください。
次に下部にある「Overwrite default style」にチェックを入れたうえで「Pick a Font」をダブルクリックし、半角フォントを指定してください。
(追記:"Element Style"を選択するには、先に "Start Editing"を選んで、編集モードにする必要があるそうです。コメント指摘ありがとうございます！)
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306146/3e600ae0-ae25-9fd6-6b37-43b005d0afa4.png)

#既知の問題
CapsLockが反応しないことがあります。解決方法がわからなかったのでいったん放置してます。

#最後に
あまり丁寧な説明はできませんでした。「OBSのフィルターを利用して～」のような使い方は他のサイトにたくさんあると思うので省略します。お読みいただきありがとうございました。

#参考にさせていただいたページ
押したキーのキーコードを取得:http://shanabrian.com/web/javascript/keycode.php
[Ubuntu18] DellのラップトップでWiFiが認識しない問題

# 問題
DellPCでUbuntuとWindowsをデュアルブートしようとし、Ubuntuを入れるとwifiが認識されない。
Wifi一覧が設定画面でそもそも出ない
Windows側からは認識できる。

# 原因
Wi-Fiのドライバがうまく認識されていなかった。

# 手順
## 1.Wi-Fiの型番を調べる
1. Windowsでコントロールパネルを開く
2. ハードウェアとサウンド>デバイスマネージャーを開く
3. "ネットワークアダプター"欄の下部に、利用可能なネットワークデバイス名が乗っているので確認

このとき私のPCはIntel® Wireless-AC 9462が入ってることがわかりました。
## 2.Wi-Fiのファームウェアを入手する
1. [インテル® ワイヤレス・アダプターの Linux* サポート](https://www.intel.co.jp/content/www/jp/ja/support/articles/000005511/network-and-i-o/wireless-networking.html)から対応するファームウェアをダウンロードする
2. USBメモリなどに移す
3. windowsを終了する

## 3.ファームウェアをインストール
1. ubuntuを起動
2. USBメモリなどに移したファームウェアを展開する
2. /lib/firmware にファイルをコピー

## 4.バックポートを入れる
以下のコマンドを叩きます(※gitはネットに繋がってないとできないので有線をつなげるか、ファームウェア同様windowsで入手してUSBなどでファイルを移すかしてください)

```
$ git clone https://git.kernel.org/pub/scm/linux/kernel/git/iwlwifi/backport-iwlwifi.git
$ sudo apt update
$ sudo apt upgrade
$ cd backport-iwlwifi/
$ sudo make install
$ reboot 
```


##　5.確認
うまく行けばこれで正常にWi-Fiが繋がっているはずです。


## 追記(2020.12.01)
バックポート入れる際にコマンドの順序が違うとうまく行かない問題があったので修正
CentOS 7 + ffmpeg インストール

# はじめに

CentOS 7 に ffmpeg を入れたい．ただそれだけです．何番煎じなのかもわかりません．

## 概要

[FFMpeg公式](https://www.ffmpeg.org/)を見ると，[RPMFusion](https://rpmfusion.org/)に誘導されます．
そこで，この記事では，RPMFusionから，FFMpeg 3.4.7 (2020.3.3現在)のインストールを行います．

## 問題意識

ググってよく出てくる方法は，li.nux.co を使う方法が多いのだが，本当にこれでよいのか？
個人的には，これだと，2.8.xしか入らないのでちょっと不満．

# 手順

- `yum`は入っているという前提です．
- すべて`root`で作業しています．必要なら`sudo`経由で実行しましょう．
- `yum`で毎回Yes/Noを聞かれるのが困るなら，`yum install -y`などで置き換えてください．（`-y`の位置に注意）

## 0. たぶん事前に必要なもの

```bash
yum install yum-utils
yum install epel-release
yum install https://download1.rpmfusion.org/free/el/rpmfusion-free-release-7.noarch.rpm
yum update
```

(1) 後でyumのリポジトリ操作（無効化）をするために`yum-utils`を入れておきます．手作業の方が好きな人には不要です．
(2,3) EPELのリポジトリと，RPM Fusion(free)のリポジトリを追加します．
(4) そして，リポジトリの情報を更新しておきます．

上記のURLは，RPMFusionのRHEL7/free版です．詳しくは，RPMFusionの公式ページで確認して下さい．
参考：https://rpmfusion.org/Configuration

注：`rpm`コマンドでインストールする例もよく見かけますが，非推奨です．`*.rpm`だろうと，`yum`コマンドで一元管理をしたほうが良いです．

## 1. インストール

```bash
yum install ffmpeg ffmpeg-devel
# 下記のリポジトリ無効化をしているなら
# yum --enablerepo=epel,rpmfusion-free-updates install ffmpeg
```

(1) インストールです．なお，開発に使うとか，何らかのffmpegに依存した別ソフトをコンパイルするのであれば，実行例の通り`ffmpeg-devel`も，入れておきましょう．
 
## 2. 後始末

頻繁にアップデートする必要が無いなら，リポジトリは無効化しておいた方が無難です．必要な時だけ，`--enablerepo=`で有効化しましょう．

```bash
yum-config-manager --disable epel rpmfusion-free-updates
yum update
```

(1) コマンドを使って，リポジトリを無効化します．これをしないと，普段のアップデートに支障が出てしまうかもしれませんので・・・
(2) 念のため，updateをしてみて，epelやrpmfusion-free-updatesが反応**しない**ことを確認しておきます．

# おわりに

特になし．
SPECintの使い方

なんとなくでしか理解していなかったSPECint。正確にはSPEC CPU の int。そのありがたみをようやく理解したのでここに残しておこう。
とはいえこの記事の実態は参考サイトからの抜粋を自分に分かりやすくツギハギしただけです。参考サイトに心から感謝です。

はじめに調べ方。その後に結果の見方。

# 調べ方
1. SPEC CPU 2017 にアクセス
https://www.spec.org/cpu2017/results/

1. 左の Results Search をクリック

1. 最上のプルダウン = Available Configurations では ALL SPEC CPU2017 を選んでGo! をクリック。
選択肢としては以下があるけど ALL... を選べばまとめていっぺんに検索結果に表示されます（プルダウンで選べば個別に表示）。 
    - int/speed
    - float point/speed
    - int/rates
    - float point/rates

1. CPU2017 Results -- Query / Simple Request / Optional: Return only those results whereプルダウンで processor を選択。

1. Maches に 調べたいCPUのSKUを入力して Execute Simpe Fetch。
例）Gold 6254

# 結果の見方
1. 以下のブロックに分かれていて、それぞれでHWベンダーごとにソートされて結果が表示される。
  * CPU2017 Integer Speed
  * CPU2017 Floating Point Speed
  * CPU2017 Integer Rates
  * CPU2017 Floating Point Rates

1. System列から自分が調べているサーバモデルを探し、基本的には Base Result のスコアを確認すれば十分。Disclosureを選べば詳細（Result Table）を確認できる。

以下、SPECint2017 / SPECint2017_Rates の Result Table を見ながらまとめた。

## 指標はスピードとスループット
<dl>
<dt>スピード</dt>
<dd>ベンチツールによる並列処理（Auto Parallel）のもとで、単位タスクをどれくらい早く完了できるかに依存するスコア。数値は高いほうが良い。PECint2017で確認できる。</dd>
</dl>

<dl>
<dt>スループット</dt>
<dd>単位時間あたりにどれだけのタスク（コンパイル）を完了できるかに依存するスコア。数値は高いほうが良い。SPECint2017_Ratesで確認できる。</dd>
</dl>

## テストは整数演算と浮動小数点演算

<dl>
<dt>整数演算処理</dt>
<dd>SPECint2017とSPECint2017 Ratesで確認できる。<dd>
<dt>浮動小数点演算処理</dt>
<dd>SPECfp2017とSPECfp2017 Ratesで確認できる。</dd>
</dl>

とりあえずなら、intを確認するだけでよかと。

## ベンチマークの最適化する／しない
<dl>
<dt>base</dt>
<dd>SPECが提示する標準（base）のオプションでベンチした結果。</dd>
<dt>peak</dt>
<dd>当該HWに最適化されたオプションでベンチした結果。未実施なレポートもまれによくある。</dd>
</dl>

## ベンチマークはたくさん
SPEC CPU では複数のベンチマークツールの試行している。以下はツールの例。

 * perlbech_s
 * gcc_s
 * mcf_s ,  etc...

## 結果はスコア
Speedは秒、Ratesはタスク数を表した値と思っていたけど違った。Ratioの相乗平均値だった。
SPEC CPU は対照実験をしている。speedを例にすると次のような計算をし、その値をRatioとしている。

    Ratio ＝ 対照マシンの処理時間 / テスト対象マシンの処理時間
例えば対照マシンの処理時間が1775で対象マシンの処理時間が354.329738とした場合、

    Ratio ＝ 1775/354.329738 = 5.00945 ≒ 5
となる。
実験は複数のベンチマークツールで3セット行われ、すべてのRatioの相乗平均値を最終的なスコアとする。

# 参考サイト
https://bongineer.net/entry/specint/
https://qiita.com/s2maeda/items/b07364fd94fbd3ac0ef4
Netlify ＆ お名前.comで「サブドメイン」を設定する

以下の記事を見て自分のサービスもサブドメインで運用することにした。

https://qiita.com/ToshioAkaneya/items/bdeddeb3c99a8d79cdff
> ドメインをいくつも取っていると意外と出費になりますよね。
しかし、サブドメインを活用することで取得するドメインは１つで良くなります。

ただ調べてみると通常のドメインを設定するための記事はたくさん見つかるものの、サブドメインに特化した情報が案外見当たらなかった。

実際のところ普通のドメインでもサブドメインでも設定手順はほぼ同じなのだが、その結論に辿り着くまで少し迷ったので、後進のために手順を整理してみる。

# サブドメインとは
まず一応サブドメインについて。

> サブドメインは「独自ドメイン」を分割するために任意で設定するドメイン名です。
> 
> 「○○○.com」を本体とした時に、「□□□.○○○.com」のように文字列を挿入してドメインを区分けするというもので、1つのドメインを用途別に分割したい時に使用します。
> サブドメインの例として、身近なところでは「Yahoo!」などがあります。
> 
> ・Yahoo!JAPAN ： https://www.yahoo.co.jp/
> ・Yahoo!ショッピング ： https://shopping.yahoo.co.jp/
> ・Yahoo!プレミアム ： https://premium.yahoo.co.jp/
> ・ヤフオク ： https://auctions.yahoo.co.jp/
> ・Yahoo!ニュース ： https://news.yahoo.co.jp/

https://ferret-plus.com/8390

# Netlify & お名前.comで「サブドメイン」を設定
## 前提
- お名前.comでドメインを購入している
- Netlifyに自分のサービスをデプロイしており、自動で割り振られたドメイン(Default subdomain)でアクセス可能。

## Netlifyでの設定
手順そのものは独自ドメインを設定する時とほぼ同じ。設定するドメインだけ任意のサブドメインになるようにすればOK。
以下の画像の例では、「zkappa.com」というログイン名を購入した状態で、「etaranarou.zkappa.com」というサブドメインを設定している。
(「etaranarou」の部分は自分で好きなものを設定できる)

また次の手順で必要になるため、Netlify側で自動設定された「Default subdomain」をコピーしておく。

![スクリーンショット 2020-03-01 17.19.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283780/b261f2b0-6da3-51fd-2aa3-04b8fb58eb28.png)

Netlifyにおける独自ドメイン設定手順は以下参照。
https://qiita.com/NaokiIshimura/items/64e060ccc244e38d0c15#%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E3%81%AE%E8%A8%AD%E5%AE%9A

## お名前.comでの設定
手順そのものは独自ドメインを設定する時とほぼ同じ。サブドメインを用いてDNSレコードを更新する。

![test.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283780/94d7c2ac-fc91-7ed7-83d4-80e0c1e9e0be.png)

お名前.comでのDNSレコード設定手順は以下参照
https://qiita.com/don-bu-rakko/items/8eb30c7e9a3f9531ba16#%E6%89%8B%E9%A0%86-%E3%81%8A%E5%90%8D%E5%89%8Dcom%E5%81%B4%E3%81%AE%E8%A8%AD%E5%AE%9A


## サブドメインの反映待ち
上記2点設定後、お名前.comから通知が届くまで待つ。(おおよそ30分程度)
通知が届いたら設定したサブドメインにアクセスできることを確認する。

![UNADJUSTEDNONRAW_thumb_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283780/d3efeac4-f579-82e8-e3f5-cacbd231d4d8.jpeg)

出来ない場合は古いDNSキャッシュが残っている可能性があるので、DNSキャッシュをクリアする。MacPCであれば以下の記事を参照。
https://qiita.com/luccafort/items/18712f0c2f453092b1c7

# 宣伝
↑の手順説明で使ったドメインで、個人開発のサービスを公開しています。
「小説家になろう」の連載作品のURLを入力すると、その作品が完結まで行きそうか(エタらないか)判定してくれます。
まだ機能も少なく、すごーくニッチなサービスですが、よかったら使ってみてね。

エタらなろう
https://etaranarou.zkappa.com/

# 参考資料
初心者必見！サブドメインの基礎知識とメリット・デメリット
https://ferret-plus.com/8390

【Netlify】カスタムドメインを設定する
https://qiita.com/NaokiIshimura/items/64e060ccc244e38d0c15

Netlifyにお名前.comで取得した独自ドメインを設定する
https://qiita.com/don-bu-rakko/items/8eb30c7e9a3f9531ba16

いつも忘れるMacのDNSキャッシュを削除するやつ
https://qiita.com/luccafort/items/18712f0c2f453092b1c7
Amazon Aurora MySQL のリードレプリカは Adaptive Hash Index が有効にならない

## （忙しい人向け）まとめ
* Amazon Aurora MySQL のリードレプリカでは Adaptive Hash Index が有効にならない仕様（バグ？）がある
* この仕様はバージョン 5.6、5.7 両方にあって、たぶん修正され無いと思われる
* パラメーターグループでは有効にすることができるが、実際にMySQLのシステム変数を見ると有効になっていないため見落としがち
* 特定のワークロードでは一部のクエリの実行速度が2倍近く遅くなることもある


## 経緯
RDS for MySQL で稼働しているシステムを Aurora への移行を検討している中、現状のワークロードから切り出したクエリーを流してベンチマークをとったところ、特定のクエリだけ2倍近く遅くなる事象が発生。
最初は比較的JOINが多いクエリだったので、AuroraとMySQLのクエリオプティマイザの違いからくる問題かと思って、オプティマイザスイッチを変更したりもしたけど改善せず。。
そのとき、たまたまライターに同じクエリを投げたところ、RDS for MySQL と同等の速度になったので、どうやらライターとリードレプリカでは挙動が異なるっぽく、いろいろ調べると`innodb_adaptive_hash_index` がリードレプリカは無効になっていた。

### パラメーターグループの値は無視される
Auroa のパラメーターグループは「パラメータグループ」と「DBクラスターのパラメータグループ」の２種類があり、どちらでも `innodb_adaptive_hash_index` の値は変更可能で、どちらを指定してもリードレプリカでは設定が無視されます。

### MySQLのコンソールでも変更不可
`innodb_adaptive_hash_index` は動的に変更可能なので、MySQL のコンソール上で以下のようなコマンドを実行しても変更できなかった。
```
mysql> set global innodb_adaptive_hash_index=1;
```
https://dev.mysql.com/doc/refman/5.6/ja/innodb-parameters.html#sysvar_innodb_adaptive_hash_index

### 強制的にフェイルオーバーしてみる
ライターを手動でフェイルオーバーさせてみると、ライターに昇格したインスタンスは`innodb_adaptive_hash_index`が有効になっていて、リードレプリカとして起動した元ライターインスタンスの`innodb_adaptive_hash_index`は無効になっていた。

おそらくリードレプリカとして起動する際に `--skip-innodb_adaptive_hash_index` パラメーターが渡されて無効になっているんでしょうね。

## この問題はいつから？
以下の stack overflow の回答の中で、2015年8月の AWS forum で既に言及されているものの、今も解消されていないのが確認できる。

https://stackoverflow.com/a/56759525/3291926

## そもそも Adaptive Hash Index って？
MySQLではレコードの格納位置を特定するために、B-Tree インデックスが使われます。
この B-Tree インデックスによる計算量は O(log n) です。

これを更に高速化するため、よく検索されるものはMySQLが内部でハッシュインデックスを作成してキャッシュして使うようにしていて、これが Adaptive Hash Index と呼ばれるものです。ハッシュインデックスによる計算量は O(1) で最速です。

ただ、内部的に自動で作られるものなので、ユーザーからコントロールすることもできないし、`EXPLAIN`を使っても Adaptive Hash Index が使われているかどうかもわかりません。

また、同時接続が多く、負荷の高いワークロードでは、ハッシュインデックスによる高速化よりもハッシュインデックのデータ更新処理の方に時間がかかったり、特に5.6では単一のスレッドなので、ロック待ちが発生しやすく逆に遅くなったりすることもあります。（5.7では複数スレッドになっているので並列化されいるので問題にはなりにくい）

[MySQL :: MySQL 5.6 リファレンスマニュアル :: 14.2.13.6 適応型ハッシュインデックス](https://dev.mysql.com/doc/refman/5.6/ja/innodb-adaptive-hash.html)

## Amazon Aurora MySQL が向いているワークロード
Aurora は MySQL の最大5倍のパフォーマンスが出ると書いてありますが、これは sysbench で同時接続数が多い場合です。
sysbench が投げるクエリはJOINも含まないようなかなり軽量なクエリなので、「同時接続数が多く」「軽量なクエリ」を大量に投げるようなワークロードが向いていると言えます。
これは公式のよくある質問にも記載があります。

> Amazon Aurora が MySQL よりも優れている領域の 1 つが、ワークロードの同時実行数が非常に多い場合です。Amazon Aurora でワークロードのスループットを最大化するには、多数のクエリやトランザクションを同時実行するようにアプリケーションを作成することをお勧めします。

[よくある質問 - Amazon Aurora | AWS](https://aws.amazon.com/jp/rds/aurora/faqs/)

このことは、先にも触れたように、Adaptive Hash Index は同時接続数が多くて負荷が高いワークロードに向いてないことを考えると真逆の機能と言えます。

とはいえ、Aurora はパフォーマンス以外にも運用面で楽になる機能もたくさんあるため、多少向いてないワークロードでも使いたい。。。
42tokyoの2月piscineに参加した感想

#はじめに
42ってなに？
プログラミングスクール -> [42tokyo](https://42tokyo.jp/)

42tokyoでは、入学前に何回かの試験を受ける必要がある。
初めに受けるのはwebテストであり、論理的思考力と短期記憶能力を問うものである。
そのテストに合格した者が次に受けるのは、一ヵ月間のフルコミットが前提で行われるpiscineと呼ばれる試験である。
端的に言えば一ヵ月の間、次々と課される問題に対して取り組み続けるというものである。
もちろん、単に期間中ずっと机に向かってキーボードを叩き続けるという単純なものではなく、42入学後のカリキュラムを意識した内容になっている。
私は一期生として42tokyoに入学すべく、2月に行われたpiscineに参加した。そこで体験したことを**雑に**記そうと思う。
詳細な内容や具体的な名称については口止めがされているので、その辺りについては言及しない。

#ざっくりとした感想
全体的に楽しいと感じた。
様々なバックグラウンドを持つ方が参加していたので、その人達から自分が知らない領域の話を聞くのは楽しかった。
生徒同士でのレビューについてだが、自分とは別の実装が見ることが出来るのは勉強になるし、自分のコードについてを説明するのも、問題についての理解を深めることができて有益だったと思う。
日曜日の深夜、課題に追われてハイになりながらコードを書くのはとても楽しかった。

#難易度について
プログラミングに触れたことのない方や、働きながら参加する社会人の方にとっては、とても難しいものになると思う。
「知りたいこと、実現したいことがあるなら自分で調べろ」という感じなので、それに抵抗のない人や、コミュニケーション能力に長けている人なら、やりきることは可能だと思う。
また、公式が言っているようにフルコミットが前提なので、仕事をしながらでは他の人から遅れを取るか、時間的・健康的に無理をする必要があると思われる。

#参加した人について
参加した2月だけの話だが、下は高校生から、上は50代の人まで。男女比率は7:3程度だった。
全体的にアクティブな人が多かった。
分からないことがあるならば人に質問をし、大勢で知恵を出し合って課題に取り組む。誰かに促されずとも、自発的にそれを行える人が多い印象だった。

#収穫について
チームで開発したことがなかったため、ブランチを複数作成して同時に作業する経験ができたことは良かった。
人に物事を教えるときのコツのようなものも、会得できたと思う。
人脈を広げることも一つの目標としていたが、自身の性質により、それはイマイチな結果に終わった。

#一日の生活スケジュール
6:00 起床
7:00 家を出る
8:00 42到着
20:00 42を出る
21:00 帰宅
23:00 就寝

平日・休日含めて、このようなスケジュールで一ヵ月間生活していた。
なお、自分は春休み中の実家住み大学生なので、あまり参考にならないと思う。





　

　




何か質問があれば聞いてください。答えられる範囲で答えます。
※3/11追記
piscineの結果ですが、受かってました。