OmniAICreator/Qiita-1.07M huggingface dataset:
reactでcss-modules使うときにbabel-plugin-react-css-modulesを使う

## 特徴
- `styleName`というプロパティにstringでcssで設定したclass名を記入する
- stringで設定できるため、cssの命名方法に準拠しながらcss-modulesを利用することができる
- `className`と使い分けができるので、globalなcssを使う場合とで利用用途を分けられる

https://github.com/gajus/babel-plugin-react-css-modules#css-modules
## usage
(注意: create-react-appのwebpack設定に便乗してる部分あり)
(注意2: cssのクラス名は定義しておかないとエラーになります)

```HogeComponent.tsx
import * as React from 'react';
import '/path/to/style.module.scss';

const HogeComponent: React.FC = () => (
  <div styleName="hoge-component">Hoge Component</div>
);
```

```style.module.scss
.hoge-component {
  color: red;
  border: 1px solid red;
  background-color: white;
  border-radius: 8px;
}

```

## 導入手順
- 自分が試した環境は以下

```
- npm -> 6.13.6
- create-react-appをejectしたものを使用
```

- 以下3つの手順が必要
    - babel-plugin-react-css-modulesxのインストール
    - babelのconfigにpluginの設定追記
    - webpack.config.jsにcssの名称特定をする設定の追記

### babel-plugin-react-css-modulesのインストール

プロジェクト直下にて

```zsh
$ npm install babel-plugin-react-css-modules @types/babel-plugin-react-css-modules post-scss
```

自分はtypescriptとscss使いたかったのでいろいろまとめてinstallしています。

### babelのconfigにpluginの設定追記

```json
"babel": {
  "presets": [
    "react-app"
  ],
  "plugins": [
    [
      "react-css-modules",
      {
        "filetypes": {
          ".scss": {
            "syntax": "postcss-scss"
          }
        }
      }
    ]
  ]
}
```

package.jsonやbabelrcなど任意の場所にpluginの設定をしてください。

### webpack.config.jsにcssの名称特定をする設定の追記

create-react-appの恩恵に乗っかって`hoge.module.scss`を使った場合は以下の場所に設定が必要。
`.module.css`使うぜ！とか普通のcss, scssファイルの設定をカスタマイズして使っている方は、cssのmodule化設定の際にlocalIdentNameを設定しておいてください

```js
{
  module: {
    rules: [
      {
        oneof: [
          {
            test: sassModuleRegex,
            use: getStyleLoaders(
              {
                importLoaders: 3,
                sourceMap: isEnvProduction && shouldUseSourceMap,
                modules: {
                  // getLocalIdent: getCSSModuleLocalIdent,
                  // ↑をコメントアウトして↓を追記
                  localIdentName: "[path]___[name]__[local]___[hash:base64:5]"
                },
              },
              'sass-loader'
            ),
          },
        ],
      },
    ],
  },
}
```

## 使ってみてる感想
- わざわざstylesを定義してcssを当てる必要がなくなるので、書いてるときすごい楽
- ただどうしてもhtmlの`class`に名前をつけるときのような雰囲気でぱーっと作っちゃうときがあって、リロードするとエラーが起きる(表面上の書き方はどうあれ一応css-modulesなので)
- つまりstyleNameを当てたときにそのclassのスタイルが定義されているかどうかに関してのエラーは吐かれてない。(vscodeの設定でどうにかなんのかな)

追記(2020-05-26 24:07)
[補完効かせてくれるプラグイン](https://marketplace.visualstudio.com/items?itemName=ryotamannari.babel-plugin-react-css-modules-autocomplete)あった。これで完璧かな

のような感じ。個人的に`styled-component`よりもcss-modulesのほうが好きだったというのもあり、これからも重宝して使いそう。

## 参考
- https://github.com/gajus/babel-plugin-react-css-modules/issues/108

tips
- [Webサイト開発にCSS in JavaScriptを使うのはやめよう](https://postd.cc/stop-using-css-in-javascript-for-web-development-fa/)

最後にちらっとbabel-plugin-react-css-modulesの話が出てきます。ほんのチラッとだけ。
Arduino MicroのアナログPINをデジタルIOとして使う


#Arduino Microは便利やで
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/622321/0ea9ab6f-0c78-5a4b-f42a-2edb87c34ee7.jpeg" width = 400>

Arduino MicroはArduino Leonardoと同じ**ATmega32u4**を搭載しています。
個人的な評価点はこんなところ。

- **ブレッドボード**に挿せる
- **ちっちゃい**
- シリアルが**2ch**ある←これ大事（Leonardoと一緒）
- **I2C**ポートがUNOと違ってADポートと**別のピン**に割り当てられている（Leonardoと一緒）
- **アナログポートが12chもある（Leonardoと一緒）

特に基板を自作してArduinoを乗せる際は、
**使いたい機能のピンが全て下向きに出ている**ことが大事になります。
もっと広く使われても良いとは思うのですが、
デジタルIOが足りない、なんてことはよくあることです。


#デジタルIOが足りない、ADポートが足りないときは
先にも述べたとおり、ADのピンとSPIのピンは**デジタルIO**として使うことが出来ます。
これはArduinoIDEをインストールしたディレクトリの
どこかにあるpins_arduino.hの中に記載されています。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/622321/7f00e44e-7124-00fb-d56a-fd0aaacc57d1.png" width = 400>

なのでADの0chピンやSPIのピンをデジタルIOとして使う場合は、
下記のように定義してあげれば良い、ということですね。
※自分は良く忘れるので備忘録として・・・

```c:sample.ino
pinMode(18,OUTPUT); //AD0ch
pinMode(19,OUTPUT); //AD1ch
pinMode(20,OUTPUT); //AD2ch
pinMode(21,OUTPUT); //AD3ch
pinMode(22,OUTPUT); //AD4ch
pinMode(23,OUTPUT); //AD5ch

pinMode(14,OUTPUT); //MISO
pinMode(15,OUTPUT); //CLK
pinMode(16,OUTPUT); //MOSI
pinMode(17,OUTPUT); //SS
```

ADポートはUNOと違って12ch分あり、うちA6~A11はデジタルIOと共用です。
デジタルIOは不要でADポートを使いたい人は、下記の表を参考にしてください。

|デジタルピン番号|D4|D6|D8|D9|D10|D12|
|:--|:--|:--|:--|:--|:--|:--|
|アナログピン番号|A6|A7|A8|A9|A10|A11|
モデルの検証

#検証とは
検証(Validation)とは**「データの内容が正しいかどうかをチェックする仕組み」**です。

そしてRailsの中には検証できる仕組みが用意されていて、それがモデルの検証です。
モデルの検証を利用すれば、自由度の高いチェックを行った上で、ユーザーにエラーをわかりやすく伝えることができます。

#モデルの検証の仕組み
Railsにおけるモデルの検証の仕組みは基本的に
**「モデルオブジェクト（レコード）をデータベースに登録する前に検証を行い、エラーがあれば登録・更新をしないで差し戻す」**
という仕組みになっています。
この登録・更新のためのメソッドとして使われるのが`saveメソッド`と`save!メソッド`です。

`saveメソッド`と`save!メソッド`はどちらもデータの登録・更新を行う前に自動的に検証を行い、検証エラーがなければ登録・更新を行ってtrueを返します。しかし、検証エラーが出た場合の処理が異なります。

検証エラーが出た時
`saveメソッド`　 →falseを返す。
`save!メソッド`　→「例外」を発生させる。

#検証の書き方
検証コードを書く方法は大きく分けて２つあります。

**1.Railsが用意している検証用のヘルパーを利用する。
2.自分で任意の検証コードを用意する。**

ここではヘルパーを利用して簡単な例を示します。

```models/task.rb
class Task < ApplicationRecord
  #name属性にデータが入っているのか検証
  validates :name, presence: true
end

#name属性が空のtaskオブジェクトを作成
> task = Task.new
> task.save
=> false 
#name属性にデータが入っていないのでfalse
```

#コントローラーで検証エラーに対応する
モデルが検証に引っかかった場合ユーザーに原因をわかりやすく再入力を促す必要があります。
そこでコントローラーでのcreateアクションでは次のように記述します。

```controller/tasks_controller.rb
def create
  @task = Task.new(task_params)

  if @task.save
    redirect_to @task, notice: "タスクを登録しました"
  else
    render :new
  end
end  
```

ここでは`saveメソッド`を利用しています。これは返り値のtrueまたはfalseを使って条件分岐させているからです。
`save!メソッド`ではエラーが発生した時、falseではなく、「例外」が発生してしまうので条件分岐には利用できません。

また、ここではローカル変数のtaskではなく、インスタンス変数の@taskにオブジェクトを代入しています。
これは検証を行った現物のオブジェクトを@taskに保持させれば、フォームの内容を引き継いで表示できるからです。これによってエラーが発生しても、エラー発生前の内容が表示され、それを修正することが可能になります。

もし、@taskではなくtaskにオブジェクトを代入してエラーが起きた場合は、ローカル変数はメソッド内でしか保持されないので、他の画面に遷移した時点でtaskに代入された入力内容は消えてしまいます。

#ビューへの表示
エラーが発生した時に表示される内容をビューに書いていきます。

```view/tasks/_form_html.slim
- if task.errors.present?
  ul#error_explanation
    - task.errors.full_messages.each do |message|
      li = message

#以下フォーム欄の記述
= form_with model: task, local: true do |f|
  …
```
errors.present?は検証エラーの有無を調べ、エラーがある時にエラーメッセージを表示するメソッドです。
本当にあったやらかしDB設計④【テストチューニング】

どうも、GWのほうが用事が詰まって忙しかった人です(外出はしていないのですが…)

今日は[本当にあったやらかしDB設計③【ロジカルクエリー】](https://qiita.com/bouitengineer12/items/e4edbb604c961b7aa993)に続いてびっくりしたことを紹介します

#テストチューニング
案件説明とかを受けると出会うことが意外と多いです
どういうことかというと、**本番より明らかにレコード数の少ないテーブルに対してチューニングを行う**、ということです

###何が悪いの？？
データベースではとある計算に基づいてオプティマイザー(DBの脳みそのような部分)が実行計画を立てます
今主流なのはコストベースオプティマイザーです
コストベースオプティマイザーでは、レコード当たりの平均容量や、テーブルのレコード数に基づいて計算を行い、実行計画を立てます

レコード数が全く違うテスト用テーブルに対してチューニングを行うとどのようなことが発生するでしょうか


###問題
まず、チューニングといっても種類があります

**①クエリーを変える**
かんたんに言うと、**同じ結果が得られる軽量なクエリーに書き換えること**です
このチューニング方法はテーブル構造は変えずに、クエリーを変えるだけで速くすることができます
ただし、このやり方では限界があります

**②インデックスを貼る**
インデックスを貼ると予めデータをソートしておいてくれます
それから検索をするため、インデックスを貼っていないカラムよりも速く検索を行うことができます
ただし、**オプティマイザーがそのインデックスを利用するかどうかはわかりません**

コスト計算に基づいて実行計画が変わるため、いくらインデックスを貼っても利用されないことがあります

<font color = "red">**つまり、本番と類似したデータ、レコード数を持ったテーブルに対してチューニングを行わないと、実行計画が変わる可能性があるため意味がありません**</font>


###原因
これが起きてしまう原因は単純明快です

- **本番データでは量が多いため、一部を抜き出してテスト用データとした**



###解決方法
######本番データと同じ量のテスト用データを用意しよう！
テスト環境でインデックスをテストしてみて、速くなったから同じインデックスを本番環境に適用しよう！というのは、本番データとテスト用データが同じでないと意味がありません
個人情報など、一部をマスキングする場合は容量が大きく変わらないように注意してください

######チューニングしない！
<font color = "red">これは意外と重要です</font>
**インデックスを貼るのはノーコストではありません**
データを更新するときにはインデックスにも更新がかかります
そのため、無駄にインデックスが貼られているとパフォーマンスが悪くなります

本気でチューニングをしたいのであれば、テスト環境をケチるべきではありません




#まとめ

- 意味の無いチューニングをするな
- テスト環境をケチるな

最適化に対する最善の行動は「最適化しない」です
もしチューニングをする場合には慎重に行わないと意味がないどころか害になります
もし本番環境と同様のテスト環境を用意できないのであればチューニングは諦めたほうが身のためです




- [本当にあったやらかしDB設計シリーズ一覧](https://qiita.com/bouitengineer12/items/e63e5f7d6f628da11362)
GCP-ACE試験対策[コマンドライン インターフェース（CLI）、具体的には Cloud SDK をインストールして構成する（デフォルト プロジェクトの設定など）]

> コマンドライン インターフェース（CLI）、具体的には Cloud SDK をインストールして構成する（デフォルト プロジェクトの設定など）

今回は、これについて。

GCPのComputeEngine上で行った。

```
sudo apt-get update && sudo apt-get install google-cloud-sdk
```
インスタンスにgoogle sdkがインストールされる

```
gcloud init
```
sdkが利用出来るようになる
この際にアカウントを選択する。正しい権限がないと、諸々操作が出来ないので注意。

複数のプロジェクトを作成して、行き来してみた。

```
gcloud config set project PROJECT_ID
```
で出来る。
#VsCode で拡張機能のコマンドにショートカットキーを割り当てる ( Key binding preference extension command )

Preference > Keyboard Shortcuts からコマンドを選んで、ショートカットを設定するだけ

![image](https://user-images.githubusercontent.com/13635059/81463237-ed71e900-91f2-11ea-9841-751a506d798c.png)

複数キーの組み合わせもできる


![image](https://user-images.githubusercontent.com/13635059/81463238-ee0a7f80-91f2-11ea-8ece-722abb4be92e.png)

コマンドパレットで見ても、ショートカットが反映されているのがわかる

![image](https://user-images.githubusercontent.com/13635059/81463269-45a8eb00-91f3-11ea-9990-38e21c00f12c.png)



# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/3156











<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
docker内でliveshareする方法

# 前置き

Docker内で開発しつつ、VSCodeでliveShareしたい人向けの記事。
linuxでliveShareしたい人にも役に立つかもしれない。

単純にremote-containerで、liveshareをインストールしても**起動できない！**という問題を解決したい。

# 解決方法

Microsoftから解決方法が提示されていました。
[外部サイト:Linux installation details](https://docs.microsoft.com/en-us/visualstudio/liveshare/reference/linux#detailed-library-requirements)

要約すると、linuxだと必要なライブラリがないからインストールしてね！ってこと。
以下のコマンドで、スクリプトがディストリビューションごとの必要なライブラリをインストールしてくれる。

```sh
wget -O ~/vsls-reqs https://aka.ms/vsls-linux-prereq-script && chmod +x ~/vsls-reqs && ~/vsls-reqs
```

自分の環境ではdocker上の```Ubuntu,Debian,RHL,CentOS```は試してみて正常に動作しました。
ほかのディストリビューションの情報も上記サイトに記載があるので要確認です。

これで快適なリモートワークができるようになりますね！
watchOS CLKTimeIntervalGaugeProviderを使ってみる

# CLKTimeIntervalGaugeProvider

[Document](https://developer.apple.com/documentation/clockkit/clktimeintervalgaugeprovider)

Documenより（DeepLで翻訳）
> 時間間隔を追跡するゲージ。

Complication用の部品です。
GaugeProviderを持つComplicationで使用出来ます。

指定した開始時間から終了時間に向かって、現在位置が移動します。
Complicationの更新は不要です。
指定すれば、勝手に動きます。

## Example

CLKTimeIntervalGaugeProvider.ringです。
ゲージ内の丸が移動していきます。

**開始直後**
![alt](http://www.cloudsquare.jp/kumonosu/wordpress/wp-content/uploads/2020/05/CLKTimeIntervalGaugeProvider_01.png)

**途中**
![alt](http://www.cloudsquare.jp/kumonosu/wordpress/wp-content/uploads/2020/05/CLKTimeIntervalGaugeProvider_02.png)

**終了間際**
![alt](http://www.cloudsquare.jp/kumonosu/wordpress/wp-content/uploads/2020/05/CLKTimeIntervalGaugeProvider_03.png)


## ソースコード

現在時刻＋15秒後に開始。開始から60秒で終了。

```swift
func getCurrentTimelineEntry(for complication: CLKComplication, withHandler handler: @escaping (CLKComplicationTimelineEntry?) -> Void) {
    switch complication.family {
    case .graphicCorner:
        let lowTempText = CLKSimpleTextProvider(text: "S")
        lowTempText.tintColor = UIColor.cyan
        let highTempText = CLKSimpleTextProvider(text: "E")
        highTempText.tintColor = UIColor.red
        let currentTempText = CLKSimpleTextProvider(text: "-")

        let timeColors = [UIColor.cyan, UIColor.yellow, UIColor.red]
        let timeColorLocations = [0.0, 0.6, 1.0]
        let timeGasugeProvider = CLKTimeIntervalGaugeProvider(style: .ring,
                                                                gaugeColors: timeColors,
                                                                gaugeColorLocations: timeColorLocations as [NSNumber],
                                                                start: Date() + 15,
                                                                end: Date() + 75)

        let cornerTemplate = CLKComplicationTemplateGraphicCornerGaugeText()
        cornerTemplate.gaugeProvider = timeGasugeProvider
        cornerTemplate.leadingTextProvider = lowTempText
        cornerTemplate.trailingTextProvider = highTempText
        cornerTemplate.outerTextProvider = currentTempText
        
        let entry = CLKComplicationTimelineEntry(date: Date(), complicationTemplate: cornerTemplate)

        handler(entry)
    default:
        handler(nil)
    }
}
```

## memo

継続して使用するには、Complication更新、アプリから再度時間を指定する必要があります。
Ubuntu20.04でのshebang

# Ubuntu20.04でのPython
Ubuntu 20.04が出ました。
早速~~遊んで~~調査してみたところ、標準インストールではPython3.8が入るようです。
ですが、pythonじゃ起動しません、python3で起動します。[^1]
普通は困らないのですが、shebang[^2]の機能を使って実行ファイルとして起動させたいときはちょっと困ります。
さて、どうしよう？と言うことで少し調べてみました。
# shebangの書き方例
いろいろと検索してみたら、[Perl, Python 及び Ruby スクリプトにおける正しいshebangの書き方](https://qiita.com/tueda/items/369215b99316b2e9f3d8)てのがありました。
/bin/shを起動してexecでpythonを起動させる方法[^3]みたいです。[^4]
これをちょっといじってみました。

```python
\#!/bin/sh
""":" .

if [ -x python ] ; then
    exec python "$0" ${1+"$@"}
else
    exec python3 "$0" ${1+"$@"}
fi

"""

import sys

__doc__ = """
The above defines the script's __doc__ string. You can fix it by like this."""

def main():
    print('exec ok')
    for v in sys.argv:
        print(v)

if __name__ == '__main__':
    main()
```

とりあえずこれでpythonでもpython3でも起動出来る方法にはなりました。
……でも、ここまでしてやる必要があるかはよくわかりません(^^ゞ
# CentOS8
CentOS8だと標準ではpython/python3が入っていないので起動しないんですよね。
yum/dnfはplatform-pythonを起動しているっぽいけど、そこまでするのであればvenvあたりの仮想環境で動くようにすれば良かったのに、と思わなくもありません。

[^1]: python-is-python3パッケージを入れれば起動します。
[^2]: 先頭行の`#!/usr/bin/env python`とかですね。
[^3]: 元々は/usr/bin/envが無い場合の方法っぽいですけど
[^4]: 先頭部分の`""":" .`ってどういう意味だろう？
AWS SAA資格取得~RDSのストレージの種類~

AWS SAA WEB問題集で間違えてしまったRDSのストレージの種類についてまとめます。

Amazon RDSのストレージの種類
・汎用SSD
・プロビジョンドIOPS SSD
・マグネティック

これらはパフォーマンス特性と料金が異なるため、データベースのワークロードに応じて、
ストレージのパフォーマンスとコストを調整できる。

３つのストレージの種類について簡略化

####汎用SSD
汎用SSD（gp2とも呼ばれる。）様々なワークロードに対応できるコスト効率の高いストレージ。
これらのボリュームは、レイテンシーは１桁台のミリ秒であり、長時間3000IOPSにバーストできる。
これらのボリュームのベースラインパフォーマンスはボリュームのサイズによって決まる。

※IOPSとは・・・１秒あたりにディスクが処理できるI/Oアクセスの数のこと。

####プロビジョンドIOPS
I/Oレイテンシーおよび、継続するI/Oスループットが必要となる、
**I/O重視のワークロード（主にデータベースワークロード）**の要件を満たすように設計されている。
スループットの増加や低レイテンシーを求められる際に使われる。

####マグネティック
Amazon RDSは下位互換性のためにマグネティックストレージをサポートしてます。
新しいストレージが必要な場合には汎用SSDまたはプロビジョンドIOPSを使うことが推奨されております。
マグネティックストレージでは以下の制限がある。（[公式サイト参照](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/CHAP_Storage.html)）

>・SQL Server データベースエンジン使用時には、ストレージをスケーリングできません。
>・ストレージの自動スケーリングをサポートしていません。
>・Elastic ボリュームをサポートしていません。
>・最大サイズが 3 TiB に制限されます。
>・最大で 1000 IOPS に制限されます。


つたないまとめ完了
javaのinterfaceを自分なりに理解する

##はじめに
現場でjavaのinterfaceが度々出てくるけど、曖昧の中で作業をしていたので
ここで自分なりに調べてまとめる。

##interfaceとは？？
言葉の意味をwikipediaで調べると
「ソフトウェア間の通信を行う際の情報の渡し方などを決めたもの。」

javaではクラスの具体的な処理内容は記述せず
定数とメソッドのみを記述したもの。

自分なりに噛み砕くとクラスの仕様を記述したもの。

##【使い方１】インターフェイスの作成

書き方は以下の通り

```
アクセス修飾子 interface インターフェース名{}
```

##【使い方２】インターフェイスの実装クラス

書き方は以下の通り

```
class クラス名 implements インターフェイス名 {
  処理内容
}
```

## 実際に書いてみる

```java:Main.java
//インターフェイス
interface Cat{
	String NAME = "tama";

	void helloName();
}

//インターフェイスの実装クラス
class Sample implements Cat {
	public void helloName() {
		System.out.println("こんにちは、" + NAME);
	}
}

//実行
class Main {
	public static void main(String[] args) {
		Sample a = new Sample();
		a.helloName();
	}
}

```

実行結果

```
こんにちは、tama
```

正常に実行出来ました！
インターフェイスの実装クラスSampleではimplementsでインターフェイスを指定しています。
これによりSampleではインターフェイスクラスCatの定数が使用可能になりました。

また、インターフェイスクラスで定義したメソッドは修飾子を記述せずとも抽象メソッドと判断されます。
なので、インターフェイスの実装クラスではメソッド（今回で言うとhelloNameメソッド）
を必ずオーバーライドしなければいけません。

##なぜ便利なのか？？
###保守性
形式に沿って実装が進められるので開発時間の短縮に繋がる。
形式が決まっているので、クラスごとに似通ったメソッドが乱立するのを防げる。

あと自分が現場で感じたことはシンプルに実装が追いやすい。

###実装漏れを防げる
インターフェイスで定義したメソッドは抽象メソッドでオーバーライドが必要。
そのためメソッドの実装漏れを防げる。

###多重継承できる
勉強している中でインターフェイスではなく抽象クラスでいいのでは？
と思っていましたがインターフェイスは複数のインターフェイスをimplements
することが可能な点が抽象クラスと異なりました。
クラスごとに同じ記述をしなくて良い。

##おわりに
今回はjavaのインターフェイスをまとめてみました。
書き方が分かってもなぜ便利なのか必要なのかが掴めないと中々理解出来ないので
そこを自分なりに落とし込むことが大事だと今更実感しました。

##参考資料
この記事は以下の情報を参考にして執筆しました。

- [オラクル認定資格教科書 Javaプログラマ Silver SE11](https://www.shoeisha.co.jp/book/detail/9784798162041)

- [wikipedia](https://ja.wikipedia.org/wiki/%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%95%E3%82%A7%E3%83%BC%E3%82%B9_(%E6%83%85%E5%A0%B1%E6%8A%80%E8%A1%93)#%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%95%E3%82%A7%E3%83%BC%E3%82%B9)
TabBarのTabを動的に増やす

### きっかけ
Tabの数をイベントにより動的に増やしたい場合はどうしたら良いのか実装中に疑問が生じたので、調べました。
### 結論
イベントごとに、Tabのサイズを増やしたTabControllerを生成し、コントローラの状態を更新する。

### 実装
#### 動作
- add Tabボタンを押すとTabが追加される
- remove Tabボタンを押すと最後尾のTabが削除される。

#### 画像
![dynamic_tab.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526878/1eb7ca65-6b4f-eb1b-92c9-dbe95c3563d6.gif)

#### コード
``` main.dart
import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> with TickerProviderStateMixin {
  TabController _tabController;

  List<String> _titles = [
    "tab",
    "tab",
    "tab",
    "tab",
  ];

  bool _isStop = false;

  void _addTab() {
    setState(() {
      _titles.add("additional tab");
      _tabController = _createNewTabController();
    });
  }

  void _removeTab() {
    setState(() {
      _titles.removeLast();
      _tabController = _createNewTabController();
    });
  }

  TabController _createNewTabController() => TabController(
        vsync: this,
        length: _titles.length,
      );

  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    _tabController = TabController(vsync: this, length: _titles.length);
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
        bottom: TabBar(
          controller: _tabController,
          isScrollable: true,
          tabs: _titles
              .map(
                (t) => Tab(
                  text: t,
                ),
              )
              .toList(),
        ),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            RaisedButton(
              color: Colors.blue,
              onPressed: () {
                _addTab();
              },
              child: Text(
                "add tab",
                style: TextStyle(color: Colors.white),
              ),
            ),
            RaisedButton(
              color: Colors.blue,
              onPressed: () {
                print('pressed');
                setState(() {
                  _removeTab();
                });
              },
              child: Text(
                "remove tab",
                style: TextStyle(color: Colors.white),
              ),
            ),
          ],
        ),
      ),
    );
  }
}
```
NVR700WでOCNバーチャルコネクトに接続する

## やりたいこと
- NVR700Wを使って、OCNバーチャルコネクトにMAP-Eで接続して、快適なIPv4環境を手に入れる。
- フレッツのNTE(PPPoEを使うときの混雑ポイント
）を迂回できるので、結果としてフレッツ＋PPPoE IPv4を使っている人たちに（少しだけだけど）帯域を譲ってあげる。

## 環境・材料
- NTT西日本フレッツ光ネクスト（ひかり電話付き）
- ISP契約（ぷらら＋IPoEオプション）
- NVR700W（Rev.15.00.17）→多分NVR510でもできるはず。ヤフオクでわりとリーズナブルに入手できたので、今回はオーバースペックだけど700Wを使う。
- うまく動かなくてもくじけない心

## 設計
- 物理構成

　HGW(LAN)--(WAN)NVR700W(LAN)--下部LAN

## 設定
- 詳細設定＞プロバイダー接続＞新規作成
- 接続種別:IPv6 IPoE接続 (WAN)
- 設定名:お好きな名前
- ひかり電話の契約：<font color="Red">契約してない</font>　←ひかり電話契約アリでも、契約していないを選ぶこと！
- IPv4 over IPv6 トンネルの設定 ：OCNバーチャルコネクトサービス シェアードアドレス契約
- IPフィルタ：お好みで。

「ひかり電話の契約」は、「なし」の場合RAで、「あり」の場合はDHCPv6-PDでHGWからIPv6アドレスを取得する設定です（ひかり電話と書かれるからややこしい）。MAP-Eトンネルで使う始点IPアドレスの関係（後述）から、「なし」を選んでください。（YAMAHAルータの定番はまりポイントらしいです）

## 確認コマンド

~~~
> show ipv6 address
LAN1 scope-id 1 [up]
・・・
 グローバル     2400:XXXX:YYYY:1900::1/64 (lifetime: 12093/13893)
 グローバル     2400::XXXX:YYYY::1900:99:XXXX:X000:1900/64 (lifetime: INFINITY)　←IPIPパケットの送信元IPになります
~~~

~~~
> show nat descriptor address
NAT/IPマスカレード 動作タイプ : 2
参照NATディスクリプタ : 20000, 適用インタフェース : TUNNEL[1](1)
Masqueradeテーブル
    外側アドレス: map-e/153.XX.YY.ZZ
    ポート範囲: 1424-1439, ・・・
~~~

~~~
> show status tunnel 1
TUNNEL[1]:
説明:
  インタフェースの種類: MAP-E
  IPv6: 2400::XXXX:YYYY::1900:99:XXXX:X000:1900
  トンネルインタフェースは接続されています
  開始: 2020/05/09 13:53:17
  通信時間: 23時間51分49秒
  受信: (IPv4) 2855803 パケット [3110571573 オクテット]　←ここのカウントが上がらない場合、後述の「注意点」を確認する。
        (IPv6) 0 パケット [0 オクテット]
  送信: (IPv4) 1621444 パケット [238675770 オクテット]
        (IPv6) 0 パケット [0 オクテット]
~~~

## 注意点
- GUI上の「トンネル張れたよ」の緑矢印を信用しすぎない。緑矢印は「初期の接続シーケンスがうまくいったよ」に過ぎない。
- OCNバーチャルコネクト対応ルータは、1回線に1台しか接続できないようです。この作業をする前に、別のOCNバーチャルコネクト対応ルータ（NECのWG1200HS3)を接続しっぱなしだったために、トンネルを張れたように見えるが戻りパケットがやってこない片思い状態に陥ったのは内緒です。（この状態でも、トンネルが張れているように認識されている）
- ひかり電話の契約があっても、HGWの下部につなぐときには「ひかり電話の契約」を「契約していない」にしてください。この設定によって、NVRからBRに送信するIPIPパケットの送信元IPv6アドレスが変わります。しかし、BRからの戻りパケットのあて先は、「契約していない」設定でのIPv6アドレスにしか戻してくれない仕様のようです。（この状態でも、トンネルが張れているように認識されている）

## 独り言
- OCNバーチャルコネクトにMAP-Eで接続するための詳細仕様が公開されていないので、「動作確認済みルータ」を使うのが無難。
- 「動作確認済みルータ」はBuffaloとかNECプラットフォームズのコンシューマ向けの製品が多く、細かいことをやろうとすると対応製品がNECのIXか、YAMAHAに限られてくる。IXは対応ファームウェアが入手しにくいので、結局YAMAHAしか選択肢がない。IXのファームが入手しやすければ、IX2105あたりを試してみたかったのですが。
- RTX810かNVR500ぐらいにMAP-E対応対応のファームをリリースしてくれると安価（ヤフオクたたき売り）にMAP-E対応ができるのでうれしいな。 
- ちなみに、HGWの配下にはhttps://qiita.com/gaichi/items/e96bf638df642b2a9792 の記事に書いたFortigate60Dもつながったまま、平和に共存しています。
個人の生産性とは

> こちらの記事は、[Luis Cuende](https://luisivan.net/) 氏により2018年8月に公開された『 [A series on personal productivity](https://luisivan.net/posts/a-series-on-personal-productivity-640397638e8)』の和訳です。
> 本記事は原著者から許可を得た上で記事を公開しています。

![top.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407975/c213fbd2-1995-b2d3-e3c1-16539608238b.png)


私はソフトウェアの仕事を始めて１０年目、暗号資産の方は７年目になります。そのうちの１年半をAragonで過ごしました。Aragonが成長するにつれて、私が抱える責任は今までに経験したことのないくらい大きくなりました。

それに加え、この **２年間で４回** も引っ越しました。パロアルト、サニーベール、バルセロナ、そして最後にスイスのツグへ。ビザや法律関係のことで **大変な思い** をしたり、初めて **リモートチームの管理** もしました。以上の事は **暗号資産** という恐ろしくて急成長する世界の傍で行われました。

これを全てこなすのに、私は２つの方法を見つけました。

1. 1日14時間以上の社会生活、労働をしない
2. 生産性を最大限に上げて、1日の作業時間を8時間~10時間以内に抑える

私は1つ目を２年間ほど続けましたが、いい結果が得られませんでした。なかなか **続けられる事ではなく** 、ただイライラするだけでした。最終的には恋人や家族、友達に時間をもっと費やせばよかったと後悔することになります。後悔というのはとてつもなく最悪な気分にさせます。

そこで私は生産性を最大限にすることにしました。１つ目を試している最中の時はあまりいい時期ではありませんでした。ベイエリアに住んでおり、ファストフードやパスタや栄養ドリンク以外買えませんでした。1日１４時間働いていたので、いつもクタクタでした。 **初めてのCEO** で、簡単なことでさえ手こずっていました。遂には食生活の乱れと仕事のし過ぎで体調を崩してしまいました。

精神的にも肉体的にも疲れ切ってしまいました。唯一できることといったら、食事作りを学んだり、スポーツをしたりすることでした。

両方するのには時間がかかるので、食事作りを学んだり、スポーツをしたりする時は仕事ができませんでした。 **労働時間を減らしながら生産量を増やす必要があった** のです。それができる唯一の方法が、生産性をあげることです。私は常に生産性を向上させようとしてきましたが、より一層の努力が必要になりました。

自分が学んだことの多くは、今では **常識** のように思えます。しかし **誘惑の多いこの世界** では、集中したり生産性を上げる事は普通の事ではなく、特別な事だと気づきました。

 **より良いマネージャーになるにつれて** 、周りから自分がどのように働くかをもっと公にしなさいと言われました。仕事場の人に私を理解してもらえるし、私が培った事が誰かの **手助けになる** だろうからです。

という事で、私が培った事を実用的に短いブログポストにまとめました。
このブログは以下の事が書かれています。

- [健康的に生産性を上げるには](https://luisivan.net/posts/being-healthy-and-how-it-increases-productivity-9c26c4fa8cc5)
- [ストレスを感じないで断る勇気](https://luisivan.net/posts/saying-no-should-be-the-rule-not-the-exception-be8828110ea)
- 朝型人間になる事でどんなに自分が救われたか
- コーヒーとアルコールの摂取量について気をつける
- [1日の出来事を反省し、時間を最適化する](https://luisivan.net/posts/debugging-your-day-f293b52b24d0)
- トピックを深く掘り下げ、成熟させる日を作る
- [読んだ事を吸収する](https://luisivan.net/posts/processing-reads)
- 休日は心を解放する
- 不要な通知を受け取らない
- 居心地のいい仕事場を作る
- 居心地のいいパソコン室を作る
- 旅行を活用する
- 自分の時間を邪魔されないように仕事の電話のスケジュールを決めておく
- [毎日、毎週のゴールを決めておく](https://luisivan.net/posts/setting-daily-and-weekly-goals-ee71dc807f08)
-[ 気楽に過ごしつつ、同僚との連絡は怠らない](https://luisivan.net/posts/saving-time-by-writing-better-11bce34f4631)

どのように改善すれば生産性が向上するかを再検討することによって、自己を反省し生産性の向上に役立つ事を願っています。


2018年8月13日

自由の為に戦っているAragonの共同創設者より。

[Twitterフォローお願いします。](https://twitter.com/licuende)

# 翻訳協力
Original Author:  **[Luis Cuende](https://luisivan.net/)** 
Thank you for letting us share your knowledge! 

この記事は以下の方々のご協力により公開する事が出来ました。
改めて感謝致します。
選定担当: [@nottakis](https://qiita.com/nottakis)
翻訳担当: [@azumana](https://qiita.com/azumana)
監査担当: [@nottakis](https://qiita.com/nottakis)
公開担当: [@azumana](https://qiita.com/azumana)

# ご意見・ご感想をお待ちしております
今回の記事は、いかがだったでしょうか？
・こうしたら良かった、もっとこうして欲しい、こうした方が良いのではないか
・こういったところが良かった
などなど、率直なご意見を募集しております。
いただいたお声は、今後の記事の質向上に役立たせていただきますので、お気軽にコメント欄にてご投稿ください。
みなさまのメッセージをお待ちしております。
AtCoder ABC 114 C - 755をPython3で解いた

AtCoderの 755 というC問題をPythonで解いてみました。再帰関数を使うと解きやすい問題です。

日本の競技プログラミング界では言わずと知れたけんちょんさんの記事を参考にしました。
参考記事：https://drken1215.hatenablog.com/entry/2019/04/03/125400

まだよわよわなので、論理演算子とビット演算子の違いの理解に苦労しました。
これらの理解に助かった記事はこちら↓
http://ings.sakura.ne.jp/prog/bitoperator.html


```python
N = int(input())

def func(cur, use, counter):
  if cur > N: return
  if use == 0b111: counter.append(1)  # 答えを増やす
    
  # 7を付け加える
  func(cur * 10 + 7, use | 0b001, counter)
  # 5を付け加える
  func(cur * 10 + 5, use | 0b010, counter)
  # 3を付け加える
  func(cur * 10 + 3, use | 0b100, counter)
  
res = []
func(0, 0, res)
print(sum(res))
```

結果はこんな感じです。無事にACできました。
![Screen Shot 2020-05-10 at 13.42.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67762/37bcb820-5e06-c154-c40b-6305267786ac.png)
【JavaScript】JQuery UIのautocompleteとコールバックについて（2/2）

#はじめに
jQuery UI のウィジェット、オートコンプリートの中の処理を把握したいと思い、オプションである、`source`について調べたので、その記録。
前回横道にそれてコールバックについて調べるのに時間がかかってしまった、[こちら](https://qiita.com/_dodntint_/items/907d619317fd395a8c86)の続きになります、、

JQuery UIのautocompleteのオプションについて詳しく記録していく。


#gets two arguments
ドキュメントの解読を進めていく。
[Autocomplete Widget](https://api.jqueryui.com/autocomplete/#option-source)
<img width="601" alt="スクリーンショット 2020-05-09 18.03.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597926/80df01f8-cb99-5850-401a-0a6714af27e3.png">



> The callback gets two arguments

赤枠の中の、Functionの説明の最後に「コールバックは2つの引数を受ける」とあり、その下に2つの引数の説明がそれぞれ、
>A request
>A response

から始まっている。

##request
>A request object, with a single term property, which refers to the value currently in the text input. For example, if the user enters "new yo" in a city field, the Autocomplete term will equal "new yo".

↓
>このプロパティは、入力されたテキストの値を参照します。例えば、ユーザーが都市フィールドに "new yo" と入力した場合、このtermは"new yo" となります。
この説明から

```ruby
$("#form").autocomplete ({
  source: function (request, response) {
    $.ajax({
      url: 'suggest',
      type: 'GET',
      cache: false,
      dataType: "json",
      data: { keyword: request.term },
      success: function (data) {
        response(data);
      },
      error: function (err) {
        response(err);
      }
    });
  }
});
```
このような場合の、

```ruby
data: { keyword: request.term },
```

`req.term`がフォームからの入力値であり、それがajaxのオプションの`
data`に渡されている事がわかる。




##response
>A response callback, which expects a single argument: the data to suggest to the user. This data should be filtered based on the provided term, and can be in any of the formats described above for simple local data. It's important when providing a custom source callback to handle errors during the request. You must always call the response callback even if you encounter an error. This ensures that the widget always has the correct state.

↓
> このコールバックはユーザに提案するデータ(リスト)を一つの引数として期待しています。このデータは、提供された（入力された）用語に基づいてフィルタリングされなければならず、単純なローカルデータのために上記で説明した形式のいずれかにすることができます。カスタムソースコールバックを提供する際には、リクエスト中のエラーを処理することが重要です。エラーが発生した場合でも、常にレスポンスコールバックを呼び出す必要があります。これにより、ウィジェットが常に正しい状態であることが保証されます。

※分かる範囲で和訳しているのですが、大きく間違えていたらすみません、、


```javascript
data: { keyword: request.term },
success: function (data) {
  response(data);
},
```
上の部分を見ると、successの中にresponsが関数として書かれている事がわかる。
その引数に、

```javascript
data: { keyword: request.term }
```

が渡されている。
結果、jQuery UIに定義されたrequestという関数で、ユーザーにautocompleteで見せるsuggestのリストができる。

またここで、response自体が関数で、sourceという関数に、パラメータで渡されている関数だからコールバックである。という事がわかる。

#まとめ
ここまでドキュメントを読んだり、コールバックについて調べる事で、少しずつ中でどういった処理が行われているのか理解することができた。自分の望む通りに動いていても、ライブラリ等を使っていて全く内容が把握できていないのは問題だと思ったし、気持ち悪かったので、調べてみました。まだまだ把握できていない部分は多いがこれからも同じ様に調べて記録していきたい。


#他の参考にさせて頂いた記事
-[Autocomplete | jQuery UI 1.10 日本語リファレンス | js STUDIO](http://js.studio-kingdom.com/jqueryui/widgets/autocomplete)


#終わりに。
最後まで読んで頂きありがとうございます:bow_tone1:
転職の為、未経験の状態からRailsを学習しております。正しい知識を着実に身に着け、実力のあるエンジニアになりたいと考えています。継続して投稿していく中で、その為のインプットも必然的に増え、成長に繋がるかと考えています。
今現在、初心者だからといって言い訳はできないですが、投稿の内容に間違っているところや、付け加えるべきところが多々あるかと思いますので、ご指摘頂けると幸いです。この記事を読んで下さりありがとうございました。
#Mac の絵文字パレットのショートカットを変える

外付けキーボード（マジックキーボード）の修飾キー設定で
CapsLockをCommandに変えても、なぜか絵文字パレットのショートカットキーとしてだけ利用できない
(OSのバグ？)

設定を変えてもっと簡単に使えるようにしてみた

参考:
[macos - Changing Emoji Shortcut - Ask Different](https://apple.stackexchange.com/questions/230382/changing-emoji-shortcut)

![image](https://user-images.githubusercontent.com/13635059/81462815-2066ad80-91f0-11ea-9f5b-ebed8ca66fe8.png)

![image](https://user-images.githubusercontent.com/13635059/81462801-07f69300-91f0-11ea-8ad4-b0ed90bb8884.png)



# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/3155











<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
ゼロから始めるLeetCode Day21 「448. Find All Numbers Disappeared in an Array」

#概要
海外ではエンジニアの面接においてコーディングテストというものが行われるらしく、多くの場合、特定の関数やクラスをお題に沿って実装するという物がメインである。

その対策としてLeetCodeなるサイトで対策を行うようだ。

早い話が本場でも行われているようなコーディングテストに耐えうるようなアルゴリズム力を鍛えるサイト。

せっかくだし人並みのアルゴリズム力くらいは持っておいた方がいいだろうということで不定期に問題を解いてその時に考えたやり方をメモ的に書いていこうかと思います。

[Leetcode](https://leetcode.com/)

[ゼロから始めるLeetCode 目次](https://qiita.com/KueharX/items/6ee2502c3b620c795b70)

前回
[ゼロから始めるLeetCode Day20 「134. Gas Station」](https://qiita.com/KueharX/items/7bc4792c940e722ca7eb)

基本的にeasyのacceptanceが高い順から解いていこうかと思います。

[Twitter](https://twitter.com/kueharx)やってます。

# 問題
[448. Find All Numbers Disappeared in an Array](https://leetcode.com/problems/find-all-numbers-disappeared-in-an-array/)

難易度はeasy。Top 100 Liked Questionsの一つです。
Top 100 Liked Questionsのeasyの問題もだいぶ少なくなってきました。

`1≦a[i]≦n`（nは配列のサイズ）である整数の配列が与えられた場合、一部の要素は2回出現し、他の要素は1回出現します。

この与えられた配列において表示されない全ての要素を見つけます。

>Input:
[4,3,2,7,8,2,3,1]

>Output:
[5,6]

1~8の間で存在しない値が5と6なのでその二つが返されています。

# 解法



今回最初に実装したのは、配列をソートし、そのソートした配列と元の配列を比較した上で存在しない値を返す配列に追加していくというものです。


```Python
class Solution:
    def findDisappearedNumbers(self, nums: List[int]) -> List[int]:
        num,ans = set(sorted(nums)),[]
        for i in range(1,len(nums)+1):
            if i not in num:
                ans.append(i)
        return ans
# Runtime: 464 ms, faster than 11.82% of Python3 online submissions for Find All Numbers Disappeared in an Array.
# Memory Usage: 23.7 MB, less than 7.14% of Python3 online submissions for Find All Numbers Disappeared in an Array.
```

ただし、あまり速いものではなく、メモリの消費量もそこまで節約できていません。
なので今回は他にも実装してみました。

```Python
class Solution:
    def findDisappearedNumbers(self, nums: List[int]) -> List[int]:
        for num in nums:
            ans = abs(num) - 1
            if nums[ans] > 0:
                nums[ans] *= -1
        return [i+1 for i in range(len(nums)) if nums[i] > 0]
# Runtime: 380 ms, faster than 63.11% of Python3 online submissions for Find All Numbers Disappeared in an Array.
# Memory Usage: 21.5 MB, less than 17.86% of Python3 online submissions for Find All Numbers Disappeared in an Array.
```

少し改善されました。
後者は絶対値を取得する`abs`を取得し、仮に`nums[ans]`がゼロより大きければ`nums[ans]`に-1を欠けた値を`nums[ans]`を代入します。
最後に内包表記でnumsの長さを取得し、`nums[i]>0`であればi+1をする、というものを最終的に返す、という処理で書きました。

シンプルな処理ゆえに書き方一つで計算量などが大きく変わるのは考えていて面白いですね。

良さげな回答があれば追記します。
SQLとは

SQLとは、
「Structured Query Language」の略で、直訳すると「構造化問い合わせ言語」
関係データベース管理システム (RDBMS) において、データの操作や定義を行うためのデータベース言語
Queryとはデータベースからデータを抽出したり操作したりといった処理を行うための命令のことである。 「問合せ」と訳されることもある。
ubuntu で ecryptfs で暗号化したディレクトリを リカバリ / recover する方法



# TL;DR

ある日メインPCのOSとして運用していたubuntu 18.04 LTSがエラーを吐いて起動しなくなりました。
こんなこともあろうかと、事前に用意していたUSBから起動するubuntuからfsckかけるものの、大量の破損ファイルが検出され、全て削除すると、今度は起動すら不可に。
こうなれば、/home 配下のファイルだけでも救い出して、ubuntu再インストールすればよいかと思いきや、 /homeを ecryptfsで暗号化していたため、単純に mount しても取り出せず。

これは、どうにかこうにか苦労して /homeを復旧した記録です。


# 復旧手順


## レスキュー用ubuntuを起動する

まずは、なんらかの方法でレスキュー用ubuntuを起動してください。

私はWindows10から以下の手順で ブータブルUSBドライブを作成しました。

> Linux UbuntuのブータブルUSBドライブを作成する手順
https://itlogs.net/ubuntu-bootable-usb/

これで作成したusbドライブでubuntuを起動します。
ちなみに私は吹っ飛んだOSとバージョンを合わせて18.04のブータブルUSBを作成しました。


##  ecryptfs-utilsをインストールする

ectyptfsを復旧するためのツールをインストールします。
まずは、 software & updates アプリを起動して、チェックがついていないパッケージをenableにします。
これでectyptfs-utilsがインストール可能になりましたので、すかさずインストール。

```sh
apt install ecryptfs-utils 
```


## /homeが存在するファイルシステムをmountする

なにはともあれ、データが存在するデバイスをマウントします。
ファイルシステム名は頑張って調べてください。
最近主流であろうSSDなら以下のような名前のはずです。

```sh
/dev/nvme0p0 とかなんとか
```


```sh
sudo su -
mount /dev/[mountしたいファイルシステム名] /mnt
```


## rootに 復旧用mount passphraseを設定する

突然ですが、ecryptfs は mount passphrase と login passpharse が存在します。

詳しくは、以下。

> eCryptfs
https://wiki.archlinux.jp/index.php/ECryptfs

arch linuxさんには本当に感謝。
私みたいなライトなlinuxユーザーにはとても手は出せないですけれども。

まずは、mount passphraseを調べます。仮に対象のアカウントはhogeとします。

```sh
ecryptfs-unwrap-passphrase /mnt/home/.ecryptfs/hoge/.ecryptfs/wrapped-passphrase
```

ここで login passphraseを入力すると、mount passphraseが表示されるはずです。
すかさずメモります。


この mount passphraseをrootアカウントに設定します。

```sh
ecryptfs-add-passphrase --fnek
```

passphraseを求められるので、mount passphraseを入力します。

その他の質問には、以下。

```
Accept the default cipher and key size values (aes and 16).
Type n for plaintext passthrough.
Type y for filename encryption.
```

## mount!

これで準備が整ったので、mountします。

```sh
ecryptfs-recover-private /mnt/home/.ecryptfs/hoge/.Private
```

/tmp/[ランダムな文字列のディレクトリ] に複合されたディレクトリがマウントされるので、存分にサルベージしてください。
ちなみに、私がサルベージしたかったファイルは消えていました。。。


元々は以下の手順で試していたのですが、どうしてもうまくいかず、試行錯誤した結果、上記手順を編み出しました。
ecryptfsなんて20.04LTSじゃ使わないだろうし、超ニッチなノウハウですが、誰かの手助けになれば。

> How to Recover an Encrypted Home Directory on Ubuntu
https://www.howtogeek.com/116297/how-to-recover-an-encrypted-home-directory-on-ubuntu/
【AWS】EC2(Amazon Linux 2)の環境にWordPressをインストール

###注記
「Amazon Linux 2」特有の手順は、「PHPをインストール」部分

###Apacheをインストール

```
yum -y install httpd
```

###Apacheの起動

```
systemctl start httpd
```

###Apacheの自動起動設定

```
systemctl enable httpd
```

###PHPをインストール
・「amazon-linux-extras」でインストールできる内容を確認する。

```
amazon-linux-extras list
```
・PHP7.3をインストール

```
amazon-linux-extras install php7.3
```

###PHPのライブラリをインストール

```
yum -y install php-mbstring php-gd
```

###PHPのバージョン確認

```
rpm -qa | grep php
```

###Apacheの再起動

```
systemctl restart httpd
```

###MariaDBをインストール

```
yum -y install mariadb mariadb-server
```

###MariaDBの起動

```
systemctl start mariadb
```

###MariaDBの自動起動設定

```
systemctl enable mariadb
```

###MariaDBの初期設定

```
mysql -u root -p
```
・rootパスワードの変更

```
> update mysql.user set password=password('mynewpassword') where user = 'root';
> flush privileges;
```

・ユーザ作成

```
> create user 'wordpress'@'localhost' IDENTIFIED BY 'mypassword';
```

・データベース作成

```
> create database wordpressdb;
```

・権限設定

```
> grant all privileges on wordpressdb.* to 'wordpress'@'localhost';
> flush privileges;
```

・データベース確認

```
> show databases;
MariaDB [(none)]>  show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
| wordpressdb        |
+--------------------+
5 rows in set (0.00 sec)
```

・終了

```
> exit
```

###WordPressをインストール
・作業用ディレクトリ作成

```
mkdir /home/wordpress
cd /home/wordpress
```

・ダウンロードする

```
wget https://wordpress.org/latest.tar.gz
```

・展開する

```
tar xzvf latest.tar.gz
```

・Apacheの公開ディレクトリに移動

```
mv wordpress/* /var/www/html/
```

・Apacheユーザに/var/www/html/ディレクトリの書き込み権限を与える

```
chown apache.apache -R /var/www/html
chmod +w -R /var/www/html
```

・ブラウザからインストールページを開く。
![インストールページ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488082/4704241b-1982-2442-aebb-a66aa6d4f5d8.png)
this avater is too short the minimum is 20cm shoulder heightの対処法

*「this avater is too short the minimum is 20cm shoulder height」*
3DモデルをVRChatにアップロードする際中に起こるエラーです。
####肩の位置が低い！！って言われてます

##原因
下記画像のように、Unityのグリッド線より肩が下になっていると思います。
モデルを自作し、インポートした人であれば、ボーン、またはモデル自体が低い位置にあります。
![ddsdasdsadasd.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/436651/8bf10274-d3ed-239d-10f5-dc77e622f5e6.png)

##先に結論
Unityでモデルのxyzを0にした場合、グリッド線より上に来ればエラーは無くなります。

##対処法
→モデル作成ソフト内でモデルの高さを調節し、Unityに再インポート
（私は上記で解決しました）
GCP-ACE試験対策[日 / 月単位の料金見積もりを目的とする請求関連のエクスポートの設定]

> 日 / 月単位の料金見積もりを目的とする請求関連のエクスポートの設定

今回は、これについて。

日時の課金データをBigQueryデータセットやCloudStorageバケットにエクスポートすることが出来る。


![スクリーンショット 2020-05-10 13.15.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/623009/bb8aca75-091d-a860-0782-a42c2462d883.png)

BigQueryにエクスポートする場合は、先にBigQueryの"データセット"を作成しておく必要がある

![スクリーンショット 2020-05-10 13.16.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/623009/47f73b41-ba52-5030-a807-b81d32edef3c.png)

CloudStorageにエクスポートする場合は、バケット名・接頭辞・ファイル形式を設定する。
ファイル形式は、CSV, JSONが選べる。

毎月の課金データは"価格表"でエクスポート可能？
![スクリーンショット 2020-05-10 13.22.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/623009/18320445-0749-6c44-ce50-9b311d544ff5.png)
#Mac の Activity Monitor で 複数のCore単位で CPU 使用率をグラフ表示する

下の方の

CPU LOAD のグラフあたりをダブルクリックすると表示されるという、裏技的な

![image](https://user-images.githubusercontent.com/13635059/81462511-e694a780-91ed-11ea-8437-7b53e390cb9f.png)

![image](https://user-images.githubusercontent.com/13635059/81462536-104dce80-91ee-11ea-992a-37a2a8d0ad21.png)

![image](https://user-images.githubusercontent.com/13635059/81462542-26f42580-91ee-11ea-87d4-b3d9e5cfd233.png)


# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/3154











<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
機械学習の種類

## 教師あり学習
　分類問題
　　データにラベルづけをする
　　ラベルという正解を提示しなければならない
　回帰問題
　　数値の予測をする
## 教師なし学習
　ラベルがないため正解不正解が存在しない
　データの規則性や分類分けする際に利用される
## 強化学習
　利益を最大化させるための手法
　正解ラベルも大量データも必要としない
　行動主体の置かれた環境を取得し、その中で主体が取れる行動によって
　どのように報酬が変化するのかを調べる
PATHを通す


# PATHを通す方法に関して

## `ls -la`で`.bash_profile`があるか確認

```
mbp:~ **** $ ls -la
total 88
　~　（省略）　~
-rw-------   1 ****  staff   8387  5  6 19:31 .bash_history
-rw-r--r--   1 ****  staff    107  5  2 19:48 .bash_profile
　~　（省略）　~
```

### `.bash_profile`がない場合は`touch .bash_profile`で作成

```
mbp:~ **** $　touch .bash_profile
```

### `.bash_profile`を編集する

```
// vimで開く
mbp:~ **** $ vi .bash_profile
```

### vimでの編集方法
### ①vimに入ったら「i」を押して下に「insert」が出るのを確認する
<img width="484" alt="スクリーンショット 2020-05-10 13.16.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472696/75341388-d2c6-89ad-ed8b-b4c40abf0783.png">
### ②以下の内容を`.bash_profile`に追記する
(ここではnodeのpathを通しています)

```
export PATH=$HOME/.nodebrew/current/bin:$PATH
export PATH=$PATH:/Users/****/.nodebrew/current/bin
```
### ③vimを閉じる
(英字の状態で)ESCを押してから、`:wq`

#### (その他vimを閉じる方法)

```
// 保存済みのファイルを開いているvimから抜ける
:q

// ファイルを保存しないでvimを抜ける
:q!
```

### vimの編集が終わったら `source ~/.bash_profile`で更新
```
// 更新
mbp:~ **** $　source ~/.bash_profile

//　PATHが通っているか確認（今回はnodebrewのPATHを通したため）
mbp:~ **** $　nodebrew help
```


### 　参考記事
[ターミナルの設定ファイルを作る[.bash_profile]](https://joppot.info/2013/12/06/72)
[nodebrewを使ってnode.jsを使える環境を作る](https://qiita.com/fuqda/items/1b780d7e0658fb7a3889)
【正規表現】最大最小一致/グループ化/先読み後読み

##①最大一致（欲張り）と最小一致（無欲）
「*」「+」などの量指定子は、マッチが行末まで進む欲張りマッチングになる。

※以下例示。
「C:\Users\test\Desktop」に対し、
「C:.*\\」で検索すると、
「C:\Users\test\」にマッチする。

最後のマッチ以外で止めたい場合は、無欲なマッチングを利用する。

|最大一致（欲張り）|最小一致（無欲）|
|:-----------------|:-----------------|
|*|*?|
|+|+?|
|?|??|
|{n,}|{n,}?|
|{n,m}|{n,m}?|


※以下例示。
「C:\Users\test\Desktop」に対し、
「C:\」にマッチさせたい場合、
「C:.*?\\」で検索する。

「C:\Users\test\Desktop」に対し、
「C:\Users\」にマッチさせたい場合、
「C:(.*?\\){2}」で検索する。

##②グループ化とキャプチャ
「()」にはグループ化とキャプチャの2機能がある。

・グループ化
**複数文字を1つの文字列として表現できる。**
WindowsとWindows10のどちらにもマッチしたい場合、
量指定子を利用して、「Windows(10)?」として表現できる。

・キャプチャ
**マッチしたグループを置換後の文字列として利用できる。**
「This is a pen.」を「This is my pen.」に変換する場合、
「(This is )a( pen.)」で検索し、「\$1my$2」で置換できる。
このように、マッチした文字列を置換後に利用できる。

##③先読みと後読み
「パターンにマッチした位置」にマッチさせる方法。

・先読み
**「×××(?=〇〇〇)」として記述する。
「後ろに〇〇〇が続く×××」という意味。**
※以下例示。
「\w+(?= tea)」で検索する。
「☆」の行の1単語目にヒットする。

|マッチ|テキスト|
|:-----------------|:-----------------|
|☆|lemon tea|
|☆|milk tea|
||milk coffee|
・否定先読み
**「(?!〇〇〇)」として記述する。
「後ろに〇〇〇が続かない×××」という意味。**
※以下例示。
「\w+(?= (?!tea))」で検索する。
「☆」の行の1単語目にヒットする。

|マッチ|テキスト|
|:-----------------|:-----------------|
||lemon tea|
||milk tea|
|☆|milk coffee|
・後読み
**「(?<=〇〇〇)×××」として記述する。
「前に〇〇〇がある×××」という意味。**
※以下例示。
「(?<=good )\w+」で検索する。
「☆」の行の2単語目にヒットする。

|マッチ|テキスト|
|:-----------------|:-----------------|
|☆|good mornig|
|☆|good evening|
||bad morning|
・否定後読み
**「(?<!〇〇〇)」として記述する。
「前に〇〇〇がない×××」という意味。**
※以下例示。
「(?<=(?<!good) )\w+」で検索する。
「☆」の行の2単語目にヒットする。

|マッチ|テキスト|
|:-----------------|:-----------------|
||good mornig|
||good evening|
|☆|bad morning|
PHPで初めてのWebアプリケーション開発　Laravelの導入　備忘録4　

#前提
PHPを使ったWebアプリケーションの開発知識が必要になったので、開発過程の備忘録、知識のインプット・アウトプットを目的としている。

#備忘録4 目次
- Laravelの導入
- Laravel導入手順

#Laravelの導入
###開発環境
- macOS Catalina 10.15.3
- PHP 7.3.11

###選定理由
- 比較的新しい
- MVCフレームワークについて勉強したかった
- 学習コストの低さ

##Laravel導入手順
- PHPのインストール
- Composerのインストール
- Laravelのインストール
- プロジェクトの作成とアプリの実行

###PHPのインストール
Macにデフォルトで入っているPHPだったので、Homebrewを使ってインストール。
参考にした記事にHomebrewのインストール方法も載っています。

参考にした記事→[「HomebrewでPHP7.2を導入する」](https://qiita.com/saken649/items/b5830de62211b600f7ee)


###Composerのダウンロード
ComposerはPHPのパッケージ管理プログラムで、Composerを使ってLaravelをインストールする。
Composerは[公式サイト](https://getcomposer.org/)で無料で公開されている。
WindowsとmacOSでダウンロード方法が異なるので注意。
Homebrewを使ってのインストール方法があったので、私はそちらを採用。

参考にした記事→[「ComposerをmacOSにHomebrewでインストールする手順」](https://weblabo.oscasierra.net/php-composer-macos-homebrew-install/)

#Laravelのインストール
ターミナルで以下のコマンドを実行

```
composer global require laravel/installer 
```
インストールが完了したら、Laravelコマンドを使えるようにするために、環境変数PATHにインストール場所のパスを追記。
これもWindowsとmacOSでやり方が違うので注意。また、bashとzshでやり方が違うので注意が必要。

参考にした記事→[「【zsh対応】Laravel6 環境構築（MacOS Catalina）」](https://qiita.com/dianad4c/items/abc0cfcd17e26b90b342)

#プロジェクトの作成とアプリの実行
###プロジェクトの作成
ターミナルで以下のコマンドを実行
まずはプロジェクトを作成したい場所に移動

```
cd desktop
```

次に、以下のコマンドでプロジェクトを作成

```
laravel new nanaita_app(アプリ名)
```

###アプリケーションの実行
まず、作成したプロジェクトにディレクトリを移動する

```
cd nanaita_app
```

以下のコマンドを入力してサーバーを実行

```
php artisan serve
```

![サーバー立ち上げ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593561/ce8595f1-d7ea-7176-a6db-abb109eb1170.png)

ブラウザで[http://localhost:8000/](http://localhost:8000/)にアクセスして確認。

![スクリーンショット 2020-05-10 13.06.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593561/20431f0d-4944-857e-b996-21dbeb84d7cb.png)

#おわりに
次回は、Laravelで表示画面を実装していきたいと思う。
#VsCode で新しいウィンドウを開いたときのサイズを最大にする

Preference > Settings > Window: New Window Dimensions
 
で設定可能

![image](https://user-images.githubusercontent.com/13635059/81462153-610ff800-91eb-11ea-989c-ace05e72555f.png)

![image](https://user-images.githubusercontent.com/13635059/81462136-450c5680-91eb-11ea-81f0-9b7a2e25eafc.png)


# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/3153











<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
[C言語アルゴリズム]後置記法(または逆ポーランド記法)

#C言語で後置記法(逆ポーランド記法)アルゴリズムを実装した
##学習にあたって使用した環境
* ideone.com (https://ideone.com/)
※オンライン上でプログラミング学習ができるサイト

##参考資料
C言語による最新アルゴリズム辞典 (奥村晴彦著/1991年初版 技術評論社：72ページ)

##後置記法の概要
以下参考資料より引用
>式"(a+b)*(c-d)"を読み上げる際、かっこを省略して"a足すb掛けるc引くd"と読めば
あいまいであるが、"aとbの和とcとdの差との積"とよむとあいまいでなくなる。
このような記法を後置記法または逆ポーランド記法という。
この語順のまま記号を書けば"ab+cd-*"となる。

後置記法の演算においては、
>"a"は"aの値をスタックに積む"と解釈し、
"+"はスタックから"ab値を2個下ろしその和をスタックに積む"と解釈すれば、
最後にスタックに1個だけ残る値が答えである。

##ソースコード

一般的な"(a+b)*(c-d)"のような記法を挿入記法(infix notation)という。
挿入記法を用いた式を後置記法(postfix notation)に直す。
* 元の式中の空白は読み飛ばす。
* 数式の間違いがあった場合には"?"を出力する。

```C:postfix.c
/* 後置記法 postfix notation */
/* 逆ポーランド記法ともいう */

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

int ch;

// 1文字読込する関数
// 半角スペースとタブは読み飛ばす
void readchar(void){
    do {
        if((ch = getchar()) == EOF){
            return;
        } 
    } while(ch == ' ' || ch == '\t');
}

void expression(void);

// 数学における"因子"を表す関数
void factor(void){
    // chの値が'('か')'の場合
    if(ch == '('){
        readchar();
        expression();
        ch == ')' ? readchar() : putchar('?');
    } 
    // 文字が空白 (' ') を除く表示文字 (printing character)の場合
    else if(isgraph(ch)){
		// 1文字書き出す
        putchar(ch);
        readchar();
    } else{
        putchar('?');
    }
}

// 数学における"項"を表す関数
void term(void){
    factor();
    for(;;){
        if (ch == '*'){
            readchar();
            factor();
    
            // *を書き出す
            putchar('*');
    
        } else if (ch == '/'){
            readchar();
            factor();
    
    		// /を書き出す
            putchar('/');
    
        } else{
            break;
        }
    }
}

// 数学における"式"を表す関数
void expression(void){

    term();

    // +か-の場合にはもう一文字読み込んでからputcharする
    for(;;){
        if(ch == '+'){
            readchar();
            term();
            
            // +を書き出す
            putchar('+');
            
        }else if(ch == '-'){
            readchar();
            term();
            
            // -を書き出す
            putchar('-');
            
        }else{
            break;
        }
    }
}

int main(void) {
    // 終端までループ
	do {
		readchar();
        expression();

        //  改行文字か終端までループ
        while(ch != '\n' && ch != EOF){
            putchar('?');
            readchar();
        }
        // 改行文字を入れる
        putchar('\n');

	} while(ch != EOF);
	
	return EXIT_SUCCESS;
}

```
##実行結果

```C:#1/stdin.txt(任意)
(2+1)*(4-3)
```

```C:#1/stdout.txt(任意)
21+43-*
```

```C:#2/stdin.txt(任意)
(1+1)+(2+2)
```

```C:#2/stdout.txt(任意)
11+22++
```

```C:#4/stdin.txt(任意)
(2*(1+2))*5
```

```C:#4/stdout.txt(任意)
212+*5*
```

式がおかしい時には?を出力する。

```C:#5/stdin.txt(任意)
1+*2
```

```C:#5/stdout.txt(任意)
1*+?
```

##補足
このプログラムで行っているのは「再帰的下向き構文解析」というものらしい。
自由文脈文法に対する構文解析法の一つ。

##所感
* ひとつひとつの処理はシンプルでも、再帰処理になると複雑になる。
* 構文解析の中で"木"の概念が登場するので、次は木について取り上げたい。
* 私自身は高校の数学をドロップアウトした数学弱者であるが、勉強し直してみようと思う。
[Rails] kaminari で『ページネーション』機能追加

#はじめに
日々のアウトプットとしての記録です。
初学者なので記載に間違いなどがありましたら、指摘いただけると幸いです。

今回はRailsで『kaminari』を使ったページネーション機能を実装してみます！
...では、行きましょう！！

#やりたいこと
  <b> ・今回は、掲示板に１ページに１０件としてページネーション機能の実装 </b> 


<b>・設定値はコントローラに記載するのではなくconfig ファイルに記載をする</b>

#kaminariをインストールして実装
はじめにGemfileにkaminariを追加

````:Gemfile
     gem 'kaminari'
````

追加したら　bundle install を実行

````:ターミナル
$ rails g kaminari:config 
````

```:ターミナル
$ rails g kaminari:views  default  
```
を実行する。
設定ファイルを作成することにより編集可能になる。

次に、<b>「config/initalizers/kaminari_config.rb」</b>を編集

````
Kaminari.configure do |config|
  config.default_per_page = 10    #　指定したいページ数
  # config.max_per_page = nil
  # config.window = 4
  # config.outer_window = 0
  # config.left = 0
  # config.right = 0
  # config.page_method_name = :page
  # config.param_name = :page
  # config.max_pages = nil
  # config.params_on_first_page = false
end
````

次に、<b>「boards.controller.rb」</b>を編集

````:boards_controller.rb

　def index
  　　@boards = Board.page(params[:page])
　end

  ///　こっちでも出来る　（今回は使わない）
  @boards= Board.page(params[:page]).per(１０)
````

最後に<b>「views/boards/index.html.erb」</b> に追加

````:index.html.erb
 
   <%= paginate @boards %>
````
<b>ページネーションを表示させたいとこに追加する</b>

　・・・　以上で終わり！


これで「kaminari」を使ってページネーション機能の実装完了！！！！！


#まとめ
これからもアウトプットすることで理解を深めたいと思います。
最後までありがとうございました！
rails のマイグレーションで詰まった話

Railsでマイグレートしているときに以下のエラーが出ました。
```Mysql2::Error: Table 'DB名.テーブル名' doesn't exist: SHOW FULL FIELDS FROM `テーブル名```

単純にテーブルが存在しないとのことで少し調べて見た所、外部キーを設定しているところがまずかったみたいです。例)`t.references :テーブル名, foreign_key: true, null: false`

つまり、
1 app/db/migrateにあるマイグレーションファイルは作成された時間順（ファイル名の先頭の数字が若い順）に実行される。

2 そこでまだ作っていないテーブルを参照しようとしていた。
例)
20200510000000_create_table1.rbで外部キーにtable2を設定していて、
20200510000001_create_table2.rbでtable2を作成している。

結論：
外部キーで参照する前にテーブルを作成しましょう！