OmniAICreator/Qiita-1.07M huggingface dataset:
Storybookのaddonを一部紹介


## Storybookとは

`React`や`React-Native`, `Vue`等のComponentをRenderしてテストできるツールだよ

[Storybook公式サイト](https://storybook.js.org/)

## addonとは
Storybookに追加できる拡張機能だよ
[Storybook addon公式ドキュメント](https://storybook.js.org/addons/introduction/)

ここでは追加できるaddonの一部とその設定方法を紹介するよ

## addonの追加
storybookのconfigが含まれているディレクトリに`addon.js`を追加する。
その中に`import @storybook/[addon名]/register`を追加する。
その後、`config.js`で各addonに定められた設定を行う。

```addon.js
import '@storybook/addon-viewport/register'
import '@storybook/addon-options/register'
import '@storybook/addon-actions/register'
import '@storybook/addon-knobs/register'
```

## `@storybook/addon-viewport`

- ChromeDevToolsの様にViewportの設定ができるよ

** 追記 Storybook 5 になって若干書き方が変わりました。

### Storybook 4 から前のバージョン

```config.js
import { configureViewport } from '@storybook/addon-viewport'
configureViewport({  
  defaultViewport: 'iphone6p',
})

```

### Storybook 5以降

```config.js
import { addParameters } from '@storybook/react'
addParameters({
  viewport: {
    defaultViewport: 'iphone6p',
  }
})

```

## `@storybook/addon-options`
- Addonの設定ができるよ
- Addonパネルを画面の右側に置く設定などが行えるよ（デフォルトでは下にある。操作しづらい)

```config.js
import { addDecorator } from '@storybook/react'
import { withOptions } from '@storybook/addon-options'

addDecorator(
  withOptions({
    addonPanelInRight: true,
  }),
)
```

## `@storybook/addon-actions`
- `onPress`等のeventのシミュレートができるよ

```jsx:button.story.js
import { storiesOf, addDecorator } from '@storybook/react'
import { action } from '@storybook/addon-actions'
import { Button } from '../components' // 架空のComponent

storiesOf('Elements', module)
  .addDecorator(withKnobs)
  .add('Button', () => (
    <Button
      onPress={action('onPressAction')}
    />
  ))
```

## `@storybook/addon-knobs`
- storybookの画面上でprops等の編集ができるよ
- optionsで`escapeHTML:false`にすると `'`, `&`などの記号がそのまま表示される様になるよ（デフォルトだとhtml entityになってしまう)

```config.js
import { addDecorator } from '@storybook/react'
import { withKnobs } from '@storybook/addon-knobs'

addDecorator(
  withKnobs({
    escapeHTML: false,
  }),
)
```

```jsx:button.story.js
import { storiesOf, addDecorator } from '@storybook/react'
import {withKnobs, text} from '@storybook/addon-knobs'
import { Button } from '../components' // 架空のComponent

storiesOf('Elements', module)
  .addDecorator(withKnobs)
  .add('Button', () => (
    <Button
      label={text('label', 'Button')}
      onPress={action('onPressAction')}
    />
  ))
```
【2019年最新版】プログラミング言語比較

# この記事は [【データから紐解く！】2019年の人気プログラミング言語を徹底比較！](https://techacademy.jp/magazine/8735) を参考にしています
*[魚拓](https://megalodon.jp/2019-0122-1839-36/https://techacademy.jp:443/magazine/8735)

本記事では数あるプログラミング言語の中から
- Javascript
- Ruby
- Python
- PHP
- Java
- C
- Swift
- C++
- C#
- SQL

について、**データ的視点**からどの言語がオススメか紹介します。
![スクリーンショット 2019-01-24 10.07.52.png](https://qiita-image-store.s3.amazonaws.com/0/180411/5dc5d8ff-1717-a236-bf42-045bdd193a36.png)
まず、こちらのグラフを見ると**2016年**年次点では、Swift使いが一番給与が高いようです。(indeed.comによる給与統計による）
次いで**2016年**年次点ではPython、Rubyと続いています。



次のグラフはこちらです。**2016年**の求人状況です。(AngelListによる)

![スクリーンショット 2019-01-24 10.08.03.png](https://qiita-image-store.s3.amazonaws.com/0/180411/22f3f431-93c2-688a-c852-264a469d94d0.png)

**2016年**次点ではJavaScriptの需要がトップのようですね！
これはフロントもバックエンドもJavaScriptで対応出来るからでしょうか。


最初のグラフとかぶりますが、別のグラフがありましたので紹介します。
gooroo.ioからのデータのようです。
![スクリーンショット 2019-01-24 10.08.13.png](https://qiita-image-store.s3.amazonaws.com/0/180411/924499f9-8faa-d175-fb05-1b65bf13b58d.png)

**2016年**ではPython使いの給与がトップのようです。
次点でRubyですね。

2つめのグラフで大人気だったJavaScriptの人気フレームワークのグラフがあったので紹介します。

大人気はReact、次にEmberですね。**Vue**?**Vue**って**2016**年にあったんでしょうか。あったとしても知名度が低かったのではないかと思います。


そろそろつかれてきましたので、残りのグラフが見たい方は[元記事](https://techacademy.jp/magazine/8735)を参照してください！
**2019**年最新の**2016**年のグラフがたくさんあります！


![スクリーンショット 2019-01-25 11.51.34.png](https://qiita-image-store.s3.amazonaws.com/0/180411/449f4d76-07e0-ccf9-604a-ec7192215820.png)

参考までに更新履歴を置いておきます
https://web.archive.org/web/*/https://techacademy.jp/magazine/8735
【Unity(C#)】物理特性を与えながら固定する方法

　　
　　
　　
この記事は

**『プログラミング完全未経験からUnityでの開発現場に迎え入れてもらえた世界一の幸せ者』**

の記事です。そのつもりでお読みください。



##物理特性を与えながら固定する

かみ砕いて言うと(？)下の絵のような状態の再現です。
![10012.png](https://qiita-image-store.s3.amazonaws.com/0/244071/43eb8747-f841-6125-cb6a-9f3fabdeaf9e.png)

要はモノを吊り上げたいときに使えます。

吊り上がっていく最中に揺れたり、少し回転したりするのが実際の物理挙動だと思います。
それは、重力が働いているからこそです。

しかし、クレーンで吊り上げる荷物にRigidbodyをつけてUse Gravityをtrueにし、ポジションをどんどん高い位置に更新したとしても、ポジションの更新が終われば落下してしまいますし、ポジションを更新している間も物体は落ちようと頑張るので気持ち悪い挙動になります。

そこで`HingeJoint`というComponentを使います。

###HingeJoint
まず、HingeJointをAdd Componentするためのゲームオブジェクトを
吊り上げたいモノとは別で用意しましょう。
そして、Inspectorをこのような感じ↓で設定します。
![HingeJointInspector.png](https://qiita-image-store.s3.amazonaws.com/0/244071/7d153c93-73a3-5a28-d56a-2be81abbcd39.png)
具体的な設定の変更点は
①Rigidbody(勝手にAddされます)のIs Kinematicをtrueにする
②Connected Bodyに吊り上げたい荷物※のRigidBodyをぶち込む
③AxisをX,Y,Z = (1,0,1)に変更
※吊り上げたい荷物のRigidbodyはUse Gravityをtrueにしてください。

設定は以上です。

実際に動かしたものがこんな感じになります。

![GifCapture-201901251137053090.gif](https://qiita-image-store.s3.amazonaws.com/0/244071/94e1c6f0-acad-f61e-0132-1a757a637444.gif)


落下させたいときは、
`HingeJoint型の変数.connectedBody　= null;`
としてやればジョイントから外れて落下します。
Postモデルに格納したデータをブラウザで表示

[未来電子テクノロジー](https://www.miraidenshi-tech.jp/intern-content/program/)でインターン

<h4>ブラウザで表示する</h4>
Postモデルにデータを格納したら、そのデータをブラウザで表示していきます。
ブラウザで表示するためにはどのURLを使用してどのような処理をするのかの設定(ルーティング)が必要になります。
routesフォルダの中のweb.phpで設定ができます。

routing の設定方法はいろいろあるのですが URL に / をつけて get でアクセスした時の routing を書きたい場合は、まず Route::get('/', '') のように書いてあげて、その後に行いたい処理を書いていきます。

では今回、 PostsController@index アクションを実行しなさいと書いてみたいと思います。
Controller が必要になるので作っていきます

また artisan コマンドを使うので、 php artisan make:controller としてあげて PostsController という名前にしてあげましょう
PostsController.php が出来ているのでこちらを編集していきましょう。

public function index() {…
といてあげます。
今回はとりあえずhelloとだけ表示してあげます。


確認するためにはサーバが必要なので、ip a　と入力してipアドレスを見ていきましょう。

ホストを指定する必要があるので、先程の IP アドレスを入れてあげて --host ipアドレス -- port 
と入れてあげればURLが表示されますので確認しましょう。
helloと表示されて入れば成功です。

今回はここで終了にします。
Java9以降のリモートデバッグ方法について

#### jdkのバージョンが9になったときに eclipse からサーバにリモートでデバッグする際のオプションの内容が変更になった

 - 情報元ページ >> [Notes and Changes](https://www.oracle.com/technetwork/java/javase/9-notes-3745703.html#JDK-8041435)
具体的には以下の address オプションの指定方法が変更になった

### １．バッチのリモートデバッグの場合
 - Java オプション
   - 変更前
   "-agentlib:jdwp=transport=dt_socket,address=8000,server=y,suspend=y"
   - 変更後
   "-agentlib:jdwp=transport=dt_socket,address=<font color="red">0.0.0.0:</font>8000,server=y,suspend=y"
<br>
 - シェルの中身（オプション設定部分一部抜粋）
 
    DEBUG="-agentlib:jdwp=transport=dt_socket,address=0.0.0.0:8000,server=y,suspend=y"
    $JAVA $JAVAOPT $DEBUG $CONTROLLER $APPCONF $WEBINF $APL $SERIAL_NO >> ${LOG} 2>> ${LOG}

### ２．オンラインのリモートデバッグの場合
- 起動方法  
 - 変更前  
   /usr/java/tomcat/bin/catalina.sh jpda start
 - 変更後  
   JPDA_ADDRESS=0.0.0.0:8000 /usr/java/tomcat/bin/catalina.sh jpda start
 - 停止方法（変わらず）  
   /usr/java/tomcat/bin/catalina.sh jpda stop

### ローカルでバッチを実行する際に以下のエラーが出た場合
- JRE Oracle Corporation/11.0.1 is not supported, advanced source lookup disabled: Unsupported class file major version 55.

実行時に必要な jar を依存関係に追加することで解決
![2019-01-30_11h59_02.jpg](https://qiita-image-store.s3.amazonaws.com/0/175894/b9f65c39-4d50-52b6-d5eb-5b7f7216c433.jpeg)　

### jarファイルの実行
java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,address=0.0.0.0:8000,suspend=y -jar
Pythonで日付取得

Pythonでは現在の日時を取得可能

場合によってはミリ秒以下でも取得できるらしい


## 必要なモジュール
datetime

https://docs.python.jp/3/library/datetime.html

### import
```
import datetime
```

### 今日の日付
```python
datetime.date.today() 
datetime.datetime.today() # ＋時間
```

### 年
```python
datetime.date.today().year
```

###日
```python
datetime.date.today().day#日
```


### まとめて

```python

import datetime

datetime.date.today()#今日の日付
datetime.datetime.today()#今日の日付＋時間
datetime.date.today().year#年
datetime.date.today().day#日

```
Macbook Pro 2018の設定 (個人用覚書)

仕事用MBPを更新。プライベートはWindowsですが、仕事だとMacのほうが何かと便利なので。

覚悟はしてたけど、

- ペッタペタのキーボード。2012に比べてだめだと思ってたMBP2015のキーボードが快適に思える。
- 最高だったMagSafeがUSB-Cに変更とか意味がわからない
- 外部モニタもUSB-C経由とかなんなの

とプログラマには残念なPCですが、文句言ってもどうしようもないので環境設定

## キーボード周りの設定

まずはこれからやらないと始まらない。

以前のMBPはJISキーボードにしてましたが、Android Stdioかなにかで、ショートカットがUSキー配列決めうちになってて萎えたので今回はUSキーボードにしました。

### 日本語入力切り替え設定

デフォルトで日本語入力の切り替えがCtrl+Spaceになってますが、それはEmacsのMarkにつかいたいので、Command+Spaceに変更。これはもともとはSpotLightとやらのショートカットなのでそちらは無効にします。

### Ctrlキー問題

Ctrlキーは左下派なんですが、なんとそこにはfnキーが... Settingsで変えられると思ったんですが、fnキーを別のキーに割り当てることはできても、他のキーをfnにすることができない。

[Karabiner](https://pqrs.org/osx/karabiner/)をインストールしてキーを入れ替え。

### 結局諦める

どう設定しても内蔵キーボードは打ちにくいので、諦めて外付けキーボード使うことにしました。

- [Macbook : macOS Sierraで外付けキーボードを指した時、Macbookのキーボードを無効化](https://qiita.com/Jung0/items/df811a68bc704117f577)

## アプリのインストール

- Google Chrome
- Google IME
- Xcode
- VirtualBox
- Visual Studio Code
- Microsoft Remote Desktop
- Android Studio
- JDK(Java11不要の場合) : [Android Studioで使っているJDKをターミナルでも使う](https://qiita.com/tsumuchan/items/43a55789f1cf213611cc)
- Docker
- Slack
- Sketch

## homebrew周り

参考: [macOSにHomebrewをインストール](https://qiita.com/pypypyo14/items/4bf3b8bd511b6e93c9f9)

- emacs .. はもともと入ってるのでとりあえずいい
- git
- nodejs : [【2018年版】macのhomebrewでnodebrew入れてからnode.jsを入れるまで](https://qiita.com/Alex_mht_code/items/422f5ce10d9c9d5729b7)
- wget
- AdoptOpenJDK : [Java 11 (OpenJDK: AdoptOpenJDK) を Homebrew で macOS にインストールする](https://qiita.com/niwasawa/items/460ccd0fa0041e7a2491)
 
## GO

goenvを使う: https://sig9.hatenablog.com/entry/2021/03/07/000000

## フォント関連

- [SkyFont](https://www.fonts.com/ja/web-fonts/google)をインストールしてGoogle Robotoフォントを追加
- [macOS Mojaveで非Retinaモニタのフォントが汚い件の解決策](https://hatebu.me/entry/mojavefont)
pyinstallerで作る実行ファイル（exe）の軽量化方法

pythonで作ったプログラムを実行ファイルにするとき、色々な選択肢があると思います。最終的に、作成しやすさからpyinstallerになりました。

 

ただ、色々な問題がありました。その一つが作られた実行ファイルのサイズが大きくて起動も遅いということ。しかし、色々試してみた結果、500Mbぐらいあった実行ファイルが80Mbぐらいになりました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/347301/baaaf11c-0495-4495-a330-174a615b562f.png)


以下はその方法です。
１．仮想環境Xを作る

 ![image.png](https://qiita-image-store.s3.amazonaws.com/0/347301/980b5d5f-9398-a820-af2e-7a3d65e8eef1.png)

　自分の場合はanacondaを使用しました。名前を仮にtestとし、createボタンを押して、仮想環境を作ります。

 

２．buildフォルダが作られていたら、削除

　pyinstallerで実行ファイル作成した場合、作られるフォルダの一つです。これを削除しないと前回作ったデータが利用されてしまうようです。

 

３．仮想環境Xに切り替える

　コマンド：activate test

　test：仮想環境の名前

 

４．必要なパッケージをpipでインストールする

　pip install 〇〇　でインストールしていきます。

 

５．pyinstallerで実行ファイルを作成する

　コマンド：pyinstaller test.py -F

　test.py：エントリポイント（一番最初に始まる）となるファイル

　-F：一つのファイルにまとめる際のオプション

 
これで軽量化されるはずです。

このことから言えるのは、開発用の環境と、実行ファイル作成用の環境が必要ということです。
中古Mac製品においてAppストアが使えない問題の解決

#購入のきっかけ
iOS用アプリを作るため中古で購入
#バージョン等
・MacBook Air
・OS X Yosemite(バージョン: 10.10.5)
  
#症状
・AppStoreにて「パスワードの確認欄」を押すことができない。

同様の症状を複数の別サイトで質問している人が複数いて
解決していないようなので記事を書くことにしました。


#試行錯誤の流れ
中古の商品を購入したため、最新OSにアップグレードしようと試みる
しかし、AppStoreの利用にはIDが必要であるので、作成することに。

![スクリーンショット 2019-01-23 16.50.38.png](https://qiita-image-store.s3.amazonaws.com/0/347645/a842195d-58a7-4792-bb59-60060e948fbb.png)

ここでAppleIDを作成ボタンを押すと利用規約があり、同意

![スクリーンショット 2019-01-23 16.53.44.png](https://qiita-image-store.s3.amazonaws.com/0/347645/7bd303e5-24df-e916-0b20-6b5cd36a3c5d.png)

ここまでは普通であるが、パスワードの確認欄に入力することができない。
![スクリーンショット 2019-01-23 16.54.19.png](https://qiita-image-store.s3.amazonaws.com/0/347645/c6c9a342-3141-855a-cde0-a5577b66938d.png)

この問題に対して、公式サイトでIDを作成することで解決
https://appleid.apple.com/account#!&page=create

-----------------------------

次に、「このAppleIDは、AppStoreで使用されたことがありません。」
と出てくる。
![スクリーンショット 2019-01-23 16.58.34.png](https://qiita-image-store.s3.amazonaws.com/0/347645/13855991-3953-99a5-1d1c-48daea7a0e89.png)

レビューをクリックして次へ。
![スクリーンショット 2019-01-23 17.01.07.png](https://qiita-image-store.s3.amazonaws.com/0/347645/b5f8e3b5-e155-b946-dcc7-07a01514955d.png)

すると再度パスワードの確認を必要としているので詰み…。

-----------------------------

#対策
①自分のMAC・iPhone・iPad(・iPod)等を用いて、
　先ほど作成したAppleIDを用いてログイン

②他人の　"最新に近い"　MAC・iPhone・iPad(・iPod)等を借りて、
　先ほど作成したAppleIDを用いてログイン
　その後、AppStoreで何かアプリを落とす。
（他人のをお借りしてるのですぐアプリを消しましょう。）

③他人のAppleIDで中古のMACにログインし、OSを最新のものに更新。

このどれかの手法で解決します。


#後日談
Apple関係者に話を聞くと、
このパスワードの確認欄が入力できない理由は
古いOSではセキュリティー面に問題があるので使えないようにしているとのこと。

#追記
(初めての投稿でいいねもらって涙出ました。ありがとうございます。)
生活の中にスマートプレートを

<h9>#目次
[１．スマートプレートとは](#１スマートプレートとは)
[２．レンタルショップ](#２レンタルショップ)
[３．ファッションショップ](#３ファッションショップ)
[４．ポイントカード](#４ポイントカード)
[５．街中](#５街中)
[６．感想](#６感想)


#1.スマートプレートとは
 スマートフォンをかざすだけで、WebサイトやFacebookページ、Twitterタイムライン、LINEアカウント、動画、地図、連絡先、電話番号といった様々な情報を、バッテリー不要のデバイスから自在に開くことができるプレートのこと。



#２.レンタルショップ
各陳列棚に設置をすることで、どの何巻が借りられていて、いつ返ってくるのか、と言った情報が見られる。また、予約することもできるようになる。



#３．ファッションショップ
マネキンや、商品棚に設置することで、その服を使ったコーディネート例が見られる。
また、サイズが売り切れてしまっていたり、大型ショッピングモールなど、大きい荷物を持ちたくないときなどその場でネットショッピングすることができる。

#４．ポイントカード
かさばり、探すのが面倒なポイントカード。各店舗に設置をすることで、スマホの中にポイントを貯めることができる。

#５．街中
いま、どこにいるのか、あそこに行きたいけど、どう行ったらいいのかわからない。
そこで、町中にスマートプレートを設置することで、今の現在地や、近くの観光スポット、お店がわかるようになる。

#６．感想
私が身近に感じた不便なことを、スマートプレートを使って解決したいと思った案を書いてきました。中には、スマートプレートではできないような事もあるでしょう。ですが、今回の取り組みで、何も考えず、毎日を過ごしてきた生活が変わり、何か不便なことはないか、スマートプレートをどこに設置すれば便利になるのかと、意識して生活できるようになりました。
これからもっとスマートプレートが生活の中にあたりまえの存在になり、私たちの生活がより便利になって欲しいです。
bitbucket-pipelinesでbundlerがエラーを出す

※原因はわかっていません

あるリポジトリにpushして発動するbitbucket-pipelinesではpassして、またあるリポジトリではfailする状態。

以下に、現状の(無理やり)解決する方法を記述。

```yml
image: ruby

pipelines:
  default:
    - step:
        name: run rspec
        script:
          - gem install bundler -v 1.17.1
          - gem install gemspec
          - bundle _1.17.1_ install # gem install bundler で指定したバージョンをbundleコマンドの引数にする
          - rspec

```
JSでオブジェクトのリストからあるキーを持つオブジェクトを抽出したい

# 目的

オブジェクトのリストからあるキーを持つオブジェクトを抽出したい。
具体的には以下のデータ構造のものからキーのリストを与えて、いずれかのキーを持つリストを返してほしい。

```javascript
// 抽出元のデータ
let data_list = [
    {"code":"01", "value":"a"},
    {"code":"02", "value":"b"},
    {"code":"03", "value":"c"},
    {"code":"04", "value":"d"},
    {"code":"05", "value":"e"},
    {"code":"06", "value":"f"},
];

// 抽出したいキーの値のリスト
let code_list = ["01", "02", "03"];
```

# 実装

いちいちfor文を回したくない
以下のように実装した

```javascript
// filter関数で条件の関数がtrueになるものだけを抽出
let dst_data = data_list.filter(
    (element) => {
        // 要素のキーが抽出したいキーのリストに含まれているならtrue
        return code_list.includes(element.code);
    }
);

console.log(dst_data);
```

# 参考リンク
[Array.prototype.includes()](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/includes)
[JavaScriptでforEach, filter, map, reduceとか](https://qiita.com/itagakishintaro/items/29e301f3125760b81302)
Java コンテナの作り方の巻き

#目的
Java アプリケーションの環境をKubernetes で管理したらどうなんの？
に答えるため、まずは、開発環境をコンテナでビルドします

#目標
機能は以下
  Java

#効果
開発環境をDockerfile から作成できるようになる。
ローカルや専用開発環境などで構成情報を公開したくない場合でも、Dockerfile の共有をすれば、どんな場所でも同じ環境を作れる。

#前提
ドッカーを導入済み
Mac

#作業
まずは下調べ
Java コンテナや ssh接続設定 のような"あるある"機能は、偉人達が成し遂げてくれているはず！

まずは、 Docker Hub で検索
https://hub.docker.com/

いいのがなかったので、Dockerfile から作ることに。

##環境作り
ホームディレクトリへ
`cd`

ターミナルを開き、作業フォルダを作成する
`mkdir myproject`

作業フォルダへいく
`cd myproject`

Dockerfile を作る
`vi Dockerfile`

```ruby:Dockerfile
FROM ubuntu:latest

ENV JAVA_HOME /usr/lib/jvm/java-8-oracle

RUN echo oracle-java8-installer shared/accepted-oracle-license-v1-1 select true | debconf-set-selections && \
    apt-get update && \
    apt-get install -y software-properties-common && \
    add-apt-repository -y ppa:webupd8team/java && \
    apt-get update && \
    apt-get install -y oracle-java8-installer

CMD "/bin/bash"
```

Dockerfile から image を生成する
`docker build -t testtest .`
  最後の”." も忘れずに。

しばらくすると

`Successfully built 51fe1ec9021b
Successfully tagged test:latest
`
みたいな表示があり、イメージ化が終わる。

イメージが存在することを確認する
`docker images`
所有するイメージの一覧が出力され、"testtest" があればOK

イメージを実行する
`docker run -i -t testtest java -version`

以下のように出力されればOK

`java version "1.8.0_201"
Java(TM) SE Runtime Environment (build 1.8.0_201-b09)
Java HotSpot(TM) 64-Bit Server VM (build 25.201-b09, mixed mode)
`

お疲れ様でした。
Laravel 5.7 確認画面付き入力フォームの作成

[こちらはブログにも投稿しています](https://ksysnote.com/php/laravel57-confirm/)

Laravelを使って確認画面付きの入力フォームの作成ですが

[Laravel 5で確認画面付き問い合わせフォームを作る](https://qiita.com/ponko2/items/fd7ac38b964e10f16f52)
を参考にしたのですが、Laravel 5.5から ***formatErrors*** が使えなくなったので別の方法はないか模索してみました。

結論からいうと ***failedValidation*** を使えば行けているようです。

大まかな流れは、参考にした記事と同じなので、そちらを見て下さい。

## 修正ポイント
FormRequestに確認用のトレイとを作成します。
違いはここだけです。

```
<?php
namespace App\Http\Requests;

use Illuminate\Contracts\Validation\Validator;
use Illuminate\Validation\ValidationException;

trait ConfirmRequestTrait
{
    /**
     * バリデーションのフック
     *
     * @param $validator
     */
    public function validator($factory){

        // 確認画面用フラグのバリデーションを追加
        $rules = array_merge($this->rules(), [
            'confirming' => 'required|accepted',
        ]);

        $validator = $factory->make(
            $this->all(),
            $rules,
            $this->messages(),
            $this->attributes()
        );

        return $validator;
    }

    /**
     * Handle a failed validation attempt.
     *
     * @param  \Illuminate\Contracts\Validation\Validator  $validator
     * @return void
     *
     * @throws \Illuminate\Validation\ValidationException
     */
    protected function failedValidation(Validator $validator)
    {
        // エラーの取得
        $errors = (new ValidationException($validator))->errors();

        // 確認画面用フラグのバリデーションを除外
        unset($errors['confirming']);

        // 入力データを取得
        $input = $this->all();

        // 確認画面用フラグ以外にエラーが無い場合は確認画面を表示
        if(count($errors)==0){
            $input['confirming'] = 'true';
        }

        throw (new ValidationException($validator, redirect($this->getRedirectUrl())
            ->withErrors($errors)->withInput($input), $this->errorBag));
    }

    /**
     * Get the validated data from the request.
     *
     * @return array
     */
    public function validated()
    {
        // バリデーション済のデータを取得するときに、確認画面用フラグを削除する
        $data = $this->validator->validated();
        unset($data['confirming']);
        return $data;
    }
}
```

##説明
### validatorファンクション
ここで確認フラグ ***confirming*** のルールを追加しています。

### failedValidationファンクション
https://stackoverflow.com/questions/47911604/does-formaterrors-not-working-anymore-in-laravel-5-5

こちらを参考に個別でエラーの対応をするときは ***failedValition*** をオーバーライドすればいいみたいです。

やっていることは
* バリデーションエラーを取得
* バリデーションエラーから、確認用フラグのエラーを削除
* 確認用フラグのエラーを除いて、バリデーションエラーが0個の場合は、確認用フラグにtrueをセットする
* ValidationExceptionをスローするときに、リダイレクト先にエラーと入力を渡して設定する
ctrlp.vimをnvimで使えるようにする

#ctrlp.vimについて
Github上のリンク
https://github.com/kien/ctrlp.vim

vim内からファイル名の一部または全部を入力してアクセスできるようにするためのものになります。今まで

```terminal
grep -R "something" src
```
といった形でファイルを検索して

```
vim src/component/somethingElse.js
```
といった形でファイルを検索していました。
これがvimの入力画面から **control+p**を押してファイル名を入力することでファイルを検索出来かつ、vimで編集できるようになります。

#nvimで使えるようにするためには
公式サイトにはvimへのダウンロードの仕方があるので、それを参考にして

```

$ cd ~/.config/nvim
$ git clone https://github.com/ctrlpvim/ctrlp.vim.git bundle/ctrlp.vim
```
とします。nvimdディレクトリは.configの中にあります。

その後、nvimの設定ファイルに以下を書き込みます。

```~/.config/neovim/init.vim

set runtimepath^=~/.config/nvim/bundle/ctrlp.vim
```

からのnvimを立ち上げてrunさせます。ここは公式ドキュメントと同じです。

```
$ nvim
```

コマンドラインに以下を打ち込みます。その後vimを閉じて使えるようになってるかチェックします。

```
:helptags ~/.config/nvim/bundle/ctrlp.vim/doc

:help ctrlp.txt //再起動後
```

#基本的な使い方

[公式ドキュメント](https://github.com/kien/ctrlp.vim
)
[ctrlp.vimの使い方まとめ](https://qiita.com/oahiroaki/items/d71337fb9d28303a54a8)

が参考になりました。
Vagrant+VirtualBoxで作った環境とホストOS間でファイル共有したときの注意点

# はじめに
ゲストOSとホストOS間でのファイル共有をしようと思った際につまずいたところを書いていきます。
vagrantのプラグインであるvbguestを使います。

# Vagrantfileの編集
46行目のコメントを外します。

```..Vagrantfile
config.vm.synced_folder "ホスト側の共有フォルダのパス","ゲスト側の共有フォルダのパス", type: "virtualbox"
```
この時にゲスト側の共有フォルダのパスを`/vagrant`にすると下記のような状態になってしまうので注意が必要です。


# 不具合
1.vagrant sshをするとパスワード入力が必要になる
ホームディレクトリを共有してしまうと.ssh以下が無くなってしまうので、パスワード入力が必要になるそうです。

2.ログイン後の表記がおかしくなる
通常vagrant sshをすると、`[localhost@vagrant ~]$`と出るところが`-bash-4.2`と出るようになり、ディレクトリの移動をしても表記が変わらない状態になりました。
原因はよくわかりませんが、ホームディレクトリがまっさらになったせいだとおもいます。

# さいごに
不具合の直し方がなかなか出てこなかった(調べ方が悪いせいもあります)のでこの記事を書きました。
困っている人の助けになれればいいと思います。
poiでExcelファイルを作成する

poiでテンプレートファイルを使ってExcelファイルを作成する方法の覚書。

1.テンプレートファイルを読み込む

```ruby:例
File file = new File("C:\\tmp\\templates\\templates.xml");
Workbook workbook = null;

try (InputStream is = new ByteArrayInputStream(
		Files.readAllBytes(file.toPath()));) {
	workbook = WorkbookFactory.create(is);
} catch (IOException e) {
	e.printStackTrace();
}
```


2.ファイルを出力する

```ruby:例
FileOutputStream fout = null;
try {
	fout = new FileOutputStream("C:\\tmp\\");
	workbook.write(fout);
} catch (FileNotFoundException e) {
	e.printStackTrace();
} catch (IOException e) {
	e.printStackTrace();
} finally {
	if (fout != null) {
		try {
			fout.close();
		} catch (IOException e) {
        }
	}
}
```


3.セルに値を設定する
セルを指定するためのインデックスは0開始である点に注意。
また、rowまたはcellがNULLの場合、設定時にNullPointerExceptionが発生するため、必ずcreateRow/createCellを行うこと。

```ruby:例
Sheet sheet = workbook.getSheet("Sheet1");
getCell(sheet, 0, 0).setCellValue("test");

private Cell getCell(Sheet sheet, int rowIndex, int colIndex) {

    Row row = sheet.getRow(rowIndex);

    if (row == null) {
    	row = sheet.createRow(rowIndex);
    }

    Cell cell = row.getCell(colIndex);

    if (cell == null) {
    	cell = row.createCell(colIndex);
    }

    return cell;

}

```


4.シートを削除する
こちらもインデックスは0開始。
Sheet1を削除したい場合は0、Sheet2を削除したい場合は1を設定する。

```ruby:例
workbook.removeSheetAt(0);
```


5.印刷範囲の指定
インデックスは以下略。
第一引数：印刷範囲を設定するシートのインデックス
第二引数：印刷範囲開始位置のカラムのインデックス
第三引数：印刷範囲終了位置のカラムのインデックス
第四引数：印刷範囲開始位置の行のインデックス
第五引数：印刷範囲終了位置の行のインデックス
この例だと、Sheet1のA1セルのみが印刷範囲に指定される。

```ruby:例
workbook.setPrintArea(0, 0, 1, 0, 1);
```
輪番制

ファーウェイ
輪番制
経営者が複数。
＝＝＝＝＝＝＝＝＝＝＝＝＝＝
輪番制とは、複数の人が順番を決めてかわるがわる担当になる制度です。

トップダウン経営でずっと同じ立場をキープした運営しているとトップが崩れてしまった時の立て直しのようなものが組織体制の考えもあるのかもしれないですね。

適材適所としてその時の担当を複数に分けてリスクを分散していくことも大事なのですよね。

システム開発でもそですが組織での連携も含めコミュニケーションはその場合もっと必要なのかもしれないですが考え方としては取り入れておきたい分野だなと思いました。

もう少し理解を深めていきます。


---


## 関連記事

【About】(http://qiita.com/sunstripe) - サンストライプ

---

## 制作チーム：サンストライプ

[![sunstripe_logo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80600/322f2d60-f19d-af9e-2b6f-7290ca546848.png)](http://sunstripe.main.jp/)
http://sunstripe.main.jp/

(月１WEBコンテンツをリリースして便利な世の中を作っていくぞ！！ボランティアプログラマー/デザイナー/イラストレーター/その他クリエイター声優募集中！!)

### 地域情報 THEメディア
THE メディア 地域活性化をテーマに様々なリリース情報も含め、記事をお届けしてます！！
https://the.themedia.jp/

### ゼロからはじめる演劇ワークショップ
多様化の時代に向けて他者理解を鍛える

https://workshop.themedia.jp/

### プログラミングワークショップ・ウェブ塾の開講！！！
様々なテーマでプログラミングに囚われずに取り組んでいきます。
詳しくはこちら　↓　↓　↓　↓　↓　↓　↓　↓
[プログラミングサロン 月１だけのプログラミング学習塾](https://workshop.themedia.jp/posts/7057553?fbclid=IwAR32CfRQ7RvDOhvuogoSwqxDLMOU7Jvuzljlnx-TMc27qBPX1BnWsfLcBR8
)

### 協力応援 / 支援者の集い
## チーム：サンストライプ
#### プログラミングラボ
https://twitter.com/sunstripe2011

一緒にポートフォリオを作りませんか？現場の体験やそれぞれの立場から年齢関係なく作品を作りたい方々と一緒にチームを作って、作品を作っています。現場に行きたい人には、職場紹介や職場の体験や悩み相談なども受けております。
様々な職種からプログラミングの知識を得たい、デザインの知識を得たい、データーベースの知識を得たいという人が集まっております。
週１のミーティングにそれぞれの近況と作業報告して、たまにリモート飲み会などをしております！！

興味がある方は、DMに話しかけてみてください。

## トラストヒューマン
http://trusthuman.co.jp/
私たちは何よりも信頼､人と考えてます｡

｢コンサルティング｣と｢クリエイティブ｣の両角度から｢人材戦略パートナー｣としてトータル的にサポートします！！

キャリア教育事業
広域学習支援プラットフォーム『のびのび日和』
https://slc-lab.amebaownd.com/

#スポンサー募集
Raspberry Pi 3+とOpenCV 失敗談

Open CV をインストールしようと思いMicroSDを購入した。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/274715/47be0cc4-469f-44ad-d4f7-f616954ba203.png)
中華サイトである。
## 中華サイトを信じたわけではない。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/274715/9477f16f-7a1a-67ab-88d2-1bae23adb9ca.png)
### レブロンを信じたのに
![image.png](https://qiita-image-store.s3.amazonaws.com/0/274715/25bdc8c5-7240-d97a-986e-ae2f6e4cb938.png)
Spy 5Gで有名なHuawei社製なんと2018ベストセーラだって!
価格は、
![image.png](https://qiita-image-store.s3.amazonaws.com/0/274715/f36ba059-ec69-a92a-9482-c1cabb26dd5e.png)
NBAのレブロンのジャージ右上のロゴで気になっていた。
690円、飛びついたのが、大ハマりのスタート。
Raspbianをダウンロードして　
## ラズビアンをレズビアンと言ってしまうのが怖い　LGBTの方々にお詫び
![image.png](https://qiita-image-store.s3.amazonaws.com/0/274715/42822d80-fcfa-14f8-9d2a-8d77cdcdeefe.png)

MicroSDをフォーマットし

![image.png](https://qiita-image-store.s3.amazonaws.com/0/274715/31ede561-9f88-1048-0daf-b0c21c4c2a47.png)

boot ディバイスを作成
![image.png](https://qiita-image-store.s3.amazonaws.com/0/274715/0010e98e-4535-9343-6160-06a16ca10e3a.png)

## 大成功きちんと動いたと思った。
### ラズパイ3にOpenCV3を簡単に導入
https://qiita.com/mt08/items/e8e8e728cf106ac83218

を参照に導入

![image.png](https://qiita-image-store.s3.amazonaws.com/0/274715/67a40c92-ef7b-bf79-0cdd-2468cc08c890.png)
きちんと確認
確認しいくらやっても失敗!

いろんなサイト調べまくり、あきらめて、自分でコンパイルしてインストール。
やはりうまくいかない。
## 結局メモリーを疑ったところ
![image.png](https://qiita-image-store.s3.amazonaws.com/0/274715/407f6a43-0ad7-5534-d035-5239a97b7f11.png)
# 8Gの容量にFake formatを施し、64Gに見せる商品であった。
# 64G 690円で買えるわけない。
amazon サイト購入
![image.png](https://qiita-image-store.s3.amazonaws.com/0/274715/d9e5e6e4-8084-68d8-4055-1e56ff3209cc.png)
を購入
# 一発解決
６９０円中４８０円が国際運送料現金返還求めても３８４円しか戻らない。
マネーバックギャランティの意味でした。
間違えない作業診断をするために。仮説(68) 

# 企業経営分析
【応用情報】午後問２経営戦略頻出項目まとめ
https://qiita.com/juri_engineer/items/a69b1fc9c686e8776025

経営戦略用語まとめ（情報処理技術者試験）
https://qiita.com/Suibari_cha/items/7aeba6095c136882f08c

ITパスポート 【ストラテジ系】 1.企業と法務-①企業活動
https://qiita.com/RINA-11/items/e5ab2540be2f93b18e98

# 市場調査
　市場の成長動向

　自社製品の動向（市場にあっているのか、先行ってるのか、遅れているのか）
　
　　先行していると、他者から足をひっぱられないかが大事。

　　成長がおくれてらら、技術、人を見る。

　　成長がそこそこなら、プロセスみてもいい。

業務アプリケーションに関する市場調査レポート集
https://qiita.com/momoto/items/1132c2d8cadb949f57ad

【市場調査】なぜMIが注目されているのか
https://qiita.com/YH_BK/items/4ee8307e0ff157908199

Webスクレイピングでデータ分析とインテリジェンスを向上する
https://qiita.com/Octoparse_Japan/items/dc77747e523d43a5f4f0

市場調査
https://qiita.com/kaizen_nagoya/items/238793d92a815197c676

鑑定と市場調査。仮説（123）
https://qiita.com/kaizen_nagoya/items/4d4b395c49e1f599c325

# 特許調査
　　特許が、シェアより小さければ、Resource management

Wi-Fiとアンテナの特許を調べてみた。無線網(Wi-Fi)と空中線(antenna)(10)
https://qiita.com/kaizen_nagoya/items/c4a1475025005bdd2a33

深層学習・機械学習　出願特許
https://qiita.com/kaizen_nagoya/items/38085a4fb38cd1d9e4d8

量子計算機　特許
https://qiita.com/kaizen_nagoya/items/4429b2f5ed1a49180b55

# 道具分析
　　ツールベンダの言うなりか

　　製品に必要なことを手をいれているか。

　　横通し。

QCD、何が寄与するか。
# 文書
　要求仕様がない

　ソースがない

　トレース

　要求仕様の網羅率。

# Reference
Ethernet 記事一覧　Ethernet(0)
https://qiita.com/kaizen_nagoya/items/88d35e99f74aefc98794

Wireshark 一覧 wireshark(0)、Ethernet(48) 
https://qiita.com/kaizen_nagoya/items/fbed841f61875c4731d0

線網（Wi-Fi）空中線(antenna)(0) 記事一覧(118/300目標)
https://qiita.com/kaizen_nagoya/items/5e5464ac2b24bd4cd001

C++ Support(0)　
https://qiita.com/kaizen_nagoya/items/8720d26f762369a80514

Coding Rules(0) C Secure , MISRA and so on
https://qiita.com/kaizen_nagoya/items/400725644a8a0e90fbb0

Autosar Guidelines C++14 example code compile list(1-169)
https://qiita.com/kaizen_nagoya/items/8ccbf6675c3494d57a76

Error一覧(C/C++, python, bash...) Error(0)
https://qiita.com/kaizen_nagoya/items/48b6cbc8d68eae2c42b8

なぜdockerで機械学習するか 書籍・ソース一覧作成中 (目標100)
https://qiita.com/kaizen_nagoya/items/ddd12477544bf5ba85e2

言語処理100本ノックをdockerで。python覚えるのに最適。:10+12
https://qiita.com/kaizen_nagoya/items/7e7eb7c543e0c18438c4

プログラムちょい替え（0）一覧:4件
https://qiita.com/kaizen_nagoya/items/296d87ef4bfd516bc394

一覧の一覧( The directory of directories of mine.) Qiita(100)
https://qiita.com/kaizen_nagoya/items/7eb0e006543886138f39

プログラマが知っていると良い「公序良俗」
https://qiita.com/kaizen_nagoya/items/9fe7c0dfac2fbd77a945

小川清最終講義、小川清最終講義（再）計画, Ethernet(100) 英語(100) 安全(100)
https://qiita.com/kaizen_nagoya/items/e2df642e3951e35e6a53

＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞
#### 文書履歴(document history)
ver. 0.01 初稿 　 20230526
### 最後までおよみいただきありがとうございました。
いいね　💚、フォローをお願いします。
####  Thank you very much for reading to the last sentence.
Please press the like icon 💚　and follow me for your happy life.
【初心者向け】RailsでCSV出力する方法

# 初めに
RailsでCSV出力を実装したので解説します。
今回はUserの名前、メールアドレス、アカウント作成日を出力してみます。
# 大まかな説明
RailsはModel, View, controllerとありますが、実際にいじるのは**view**と**controller**です。

viewではcsvファイルの作成と、出力ボタンを設置します。
controllerはcsvとして出力するオブジェクトを投げてファイル名を設定します。

#CSVファイルの作成(View)
viewにcsvファイルを作成するためのファイルを作ります。
`xxxx.csv.ruby`と拡張子で作成します。

```app/view/users/index.csv.ruby
require 'csv'

CSV.generate do |csv|
  csv_column_names = %w(name email created_at)
  csv << csv_column_names
  @users.each do |user|
    column_values = [
      user.name,
      user.email,
      user.created_at
    ]
    csv << column_values
  end
end
```

csv << column_names　で表の列に入る名前を定義します。
csv << column_values　で表の行に入る値を定義します。

# CSV出力ボタンの設置(View)

```app/view/users/index.html.erb
<%= link_to "CSV出力", users_path(format: :csv), class: "btn btn-primary" %>
```

CSV出力のボタンを設置します。
ここではusersコントローラーのindexアクションで実行するので```users_path```としていますが、
```rails routes```で自分の実行したいアクションのルーティングを調べてから書いてください。
また```(format: :csv)```と最後につけるのを忘れないようにしてください。

#フォーマットごとに出力内容を指定（Controller)

```app/controllers/users_controller.rb
class UsersController < ApplicationController
  def index
    @users = User.all
    respond_to do |format|
      format.html do
          #html用の処理を書く
      end 
      format.csv do
          #csv用の処理を書く
          send_data render_to_string, filename: "(ファイル名).csv", type: :csv
      endw
    end
  end
end
```

フォーマット後のに処理をわけて書きます。
ファイル名を変更したい時は、上記のように
```send_data render_to_string, filename: "(ファイル名).csv", type: :csv```
と書きます。

#リファクタリング
このままでも動くのですがViewでの書き方は改良の余地があります。

```app/view/users/index.csv.ruby
require 'csv'

CSV.generate do |csv|
  csv_column_names = %w(name email created_at)
  csv << csv_column_names
  @users.pluck(*csv_column_names).each do |user|
    csv << user
  end
end
```

このようにすることによって、csv_column_namesの内容が変わっても修正する箇所が少なくて済みます。
また処理がeachだけの時よりもはやいです。

#最後に
以上でCSV出力の実装の終わりです。
なにか間違っているところなどあればご指摘ください！
PostgreSQLで長いログメッセージを捨てる pg_truncate_log_message

PostgreSQLの拡張モジュールを書いたので紹介記事を作っておきます。

# SQLログを取得している場合の問題

PostgreSQL では log_statements、log_min_error_statement、log_min_duration_statement といった設定を使って、サーバログに実行したSQL文を記録できます。例えば、log_statement = 'mod' と設定して、DDLとデータ更新については全てログに記録するという運用をすることができます。

このとき問題となるのが長いSQL文のログ出力です。log_statement = 'mod' でデータを一括投入するするときにログに巨大な出力が生じてしまいます。

* 数KBになる長いログメッセージは適当なところで後ろを切り捨てる
* 長いSQLのログ記録も切り捨てる

ということができないかというニーズがあって、残念ながら標準機能ではできそうに無く（※１）、また、これだけを行うというシンプルな拡張モジュールは無いため（※２）、自分で単純なモジュールを書いてみました。

※１：非スーパーユーザに対してでも ALTER USER ... SET ...文で log_statement等の設定を与えることができます。これも有力です。ただし、アプリ側での使うDBユーザを変えてもらう対処が必要となります。

※２：監査ログ機能を提供する拡張モジュールを導入して、その拡張モジュールの機能で長いSQLのログは捨てるという設定が可能であるかもしれません。

# pg_truncate_log_message

https://github.com/harukat/pg_truncate_log_message

pg_truncate_log_message は pg_truncate_log_message.max_length で指定した長さ（バイト）を上限としてログメッセージを切り捨てます。また、そのときには対応する STATEMENT: 出力もスキップします。すなわち、長い SQL文の全体をログ出力するケースでログを一部切り捨てる働きをします。

## 課題点

現時点での pg_truncate_log_message は文字エンコーディングを識別していません。したがって、マルチバイト文字の途中で切ってしまって、文字化けを起こす可能性があります。ここは直さないといけません。

→ 2019/2/20 マルチバイト文字に対応しました。また、PostgreSQL 10.x以下の旧バージョンでもビルドできるようにしました。
向いていない！と言われているWFで不確実性を乗りこなすことを目指した話

# なぜ、この記事を書いたのか
自社サービス/受託案件/客先常駐SESという状況下でWF開発していくうちに
WFのよくないところが目に付くようになってきた

そのため、WF以外の開発手法も経験したいと考え、少し行動を起こしてみた

**「開発手法はWF」と決められた状況下で色々な理由で活気を失っているエンジニアの方、
限られた環境であっても、自分たちができる行動を起こすことで自身やチームに変化の兆しが見えるかもしれない**

っということでWFで開発しながら不確実性を乗りこなすことを目指した話を記事にしてみました

# どうやって実現するか
ある新規立ち上げプロジェクト(開発手法はWF)において、
客先常駐SESで不確実性を乗りこなすチームを作る

# 何をやったか（ここを詳細執筆予定）
1. プロセス設計と計画をした
2. 心理的安全性の向上を目指した
3. スケジュール管理、進捗管理をした
4. リソースマネジメントをした
5. バッファマネジメントをした

# プロジェクトにおける自分の立ち位置
プロセス設計、チームビルディング、進捗管理、リソース管理、課題管理

上記以外は
要件/仕様はSlerの方やメンバーに頼った
技術面は技術が高いメンバーに頼った

# 工程とチームメンバー推移
基本設計～運用保守
基本設計：5人
詳細設計：8人
製造：10人＋オフショア
単体試験：10人＋オフショア
結合試験(非機能試験)：10人超え
受入試験：：10人超え
リリース：3人
初期流動：3人
運用保守：1人

プロジェクト全体では最大30名ぐらいになった(ニアショア含めると50名近く)
大きく2つの機能でチームは分割し、そのうちの１チームに適用

3名からスタートして、製造工程では10名までチームまで膨らむ
ニアショアとの製造/試験の依頼、質疑応答、進捗管理も行う

そのうち、うちの会社のメンバーは
新規開発未経験レベル(保守経験や簡単なバグ対応はあり)が5,6人
開発未経験レベルが2,3人

# 環境
エンドユーザー
┗　Sler
　　┣　うちの会社(うちの会社の協力会社含む)
　　┣　他の協力会社
　　┗　ニアショア

Sler常駐のため、使用できるツールが制限されている
　→**特にタスク管理やチャットツールNGが痛かった**

# 結果的に
困ったことを共有しながら前進する自他ともに認めざるを得ないチームになった
自チームはリリース後、予想外や想定外の大きな問題は出なかった(品質面で結果が出た)

ただし、もう一つのチームへはアプローチが足りず、
結果的に**プロジェクト全体**に影響が出てしまった

一方でこのような取組みによる結果の差異が明確に見えたことがとても大きかった

**「開発手法はWF」と決められた状況下で色々な理由で活気を失っているエンジニアの方、
限られた環境であっても、自分たちができる行動を起こすことで自身やチームに変化の兆しが見えるかもしれない**

自分にできることから、自分たちでできること、
そして、可能な範囲で少しずつ行動すること

今後も取り組みたいと思います

# 最後に「この取り組みによる結果」を認識している状況で、同じ状況になったら、どうするか
適用したチームが軌道に乗っている状態のときに
適用しなかったチームへリソースをシフトを検討する
技術面の属人化という面ではなく、管理面の属人化をなくすというイメージ
Google ChromeでのJavascriptの有無の確認方法

<h1>Google ChromeでのJavascriptの有無の確認について</h1>
<p>今回は、これからプログラミングを始める方向けにお伝えしようと思います。ただ、この段階では、Google Chromeが自分のPCに入れていることを前提としていることだけご了承お願いします。環境はWindowsになります。</p>

<h2>手順</h2>
１．Google Chromeを開きます。
２．縦の…をクリックします。
３．設定をクリックします。
４．現在のページを使用の下にある詳細設定をクリックします。
５．プライバシーとセキュリティと書かれている欄の下にあるコンテンツの設定と書かれている箇所をクリックします。
６．コンテンツの設定の中に入ると通知と書かれている欄の１つ下にJavascriptという欄があるので、それをクリックします。
７．Javascriptを許可か許可しないかを選択できます。許可であれば、そのままで大丈夫です。



以上が、Google ChromeでのJavascriptがオンになっているかの確認方法となります。
Oracle SQL Developerのフォントサイズを大きくする

画面のフォントサイズ指定は、設定の中を探しても見つからない。
設定ファイルを修正して、フォントサイズを変更する。

Windowsの場合
`C:\Users\{ユーザ名}\AppData\Roaming\SQL Developer\system4.1.0.13.75\o.sqldeveloper\ide.properties`

``` ide.properties
# To modify the font size for all look-and-feels in all locales, set
# the Ide.FontSize property.  For example:
#   Ide.FontSize=11
Ide.FontSize=16
```

ただ、ここで設定してもエディタやデータグリッドのテキストのフォントサイズには反映されないので注意。
SQL Developerの設定画面から変更できる。

## 参照
- How to Change the UI Font Size for Oracle SQL Developer | ThatJeffSmith  
https://www.thatjeffsmith.com/archive/2013/12/how-to-change-the-ui-font-size-for-oracle-sql-developer/
Salmonのインストール

このページでは[Trinity](https://qiita.com/github-nakasho/items/631449416f3226ade7f6)を動かすために必要なソフトウェアであるSalmonのインストール方法を記載しています。

## Salmonとは

## 事前準備
ホームディレクトリ直下(~/)にsrcとbinを作っておきます。

/src...パッケージ等を解凍したものの置き場所。
/bin...実行ファイル置き場。

のように置き場所を決めておくと便利です。

## インストール
今回インストールするものはプリコンバイル版なので、makeなどの特別な作業は必要ありません。

適当な場所にsalmon-0.12.0_linux_x86_64.zipをダウンロードします。

```
wget https://github.com/COMBINE-lab/salmon/releases/download/v0.12.0/salmon-0.12.0_linux_x86_64.tar.gz
```

以下のコマンドで解凍します。

```
tar xvzf salmon-0.12.0_linux_x86_64.tar.gz
```

解凍したものを~/srcディレクトリに配置します。

```
mv salmon-0.12.0_linux_x86_64 ~/src/
```

シンボリックリンクを貼ります。

```
ln -s $HOME/src/salmon-0.12.0_linux_x86_64/bin/salmon $HOME/bin
```
bowtie2のインストール

このページでは[Trinity](https://qiita.com/github-nakasho/items/631449416f3226ade7f6)を動かすために必要なソフトウェアであるbowtie2のインストール方法を記載しています。

## bowtie2とは

次世代シークエンスで得られるリードを、リファレンスに対してマッピングするためのソフトウェアです。

## 事前準備
ホームディレクトリ直下(~/)にsrcとbinを作っておきます。

/src...パッケージ等を解凍したものの置き場所。
/bin...実行ファイル置き場。

のように置き場所を決めておくと便利です。

## インストール
今回インストールするものはプリコンバイル版なので、makeなどの特別な作業は必要ありません。

適当な場所にbowtie2-2.3.4.3-linux-x86_64.zipをダウンロードします。

```
wget https://sourceforge.net/projects/bowtie-bio/files/bowtie2/2.3.4.3/bowtie2-2.3.4.3-linux-x86_64.zip
```

以下のコマンドで解凍します。

```
unzip bowtie2-2.3.4.3-linux-x86_64.zip
```

解凍したものを~/srcディレクトリに配置します。

```
mv bowtie2-2.3.4.3-linux-x86_64 ~/src/
```

シンボリックリンクを貼ります。

```
ln -s $HOME/src/bowtie2-2.3.4.3-linux-x86_64/bowtie2 $HOME/bin
ln -s $HOME/src/bowtie2-2.3.4.3-linux-x86_64/bowtie2-build $HOME/bin
```
Jellyfishのインストール

このページでは[Trinity](https://qiita.com/github-nakasho/items/631449416f3226ade7f6)を動かすために必要なソフトウェアであるJellyfishのインストール方法を記載しています。

## Jellyfishとは
k-merカウントを行うツールです。

## 事前準備
ホームディレクトリ直下(~/)にsrcとbinを作っておきます。

/src...パッケージ等を解凍したものの置き場所。
/bin...実行ファイル置き場。

のように置き場所を決めておくと便利です。

## インストール
適当な場所にjellyfish-2.2.10.tar.gzをダウンロードします。

```
wget https://github.com/gmarcais/Jellyfish/releases/download/v2.2.10/jellyfish-2.2.10.tar.gz
```

**注意: Trinityを動かすにはJellyfish version 2以降が必要です。**

以下のコマンドで解凍します。

```
tar xvzf jellyfish-2.2.10.tar.gz
```

解凍したものを~/srcディレクトリに配置します。

```
mv jellyfish-2.2.10 ~/src/
```

~/src配下に置いたTrinityのインストールディレクトリに移動します。

```
cd ~/src/jellyfish-2.2.10
```

configureを行います。その時、自分のホームディレクトリにインストールされるようにオプションをつけます。

```
./configure --prefix=$HOME
```

makeを行います。

```
make
```

これでインストール完了です。
仕事の始まりはQiitaと共に　～お前ら仕事しろという禁句～


# まずは

![image.png](https://qiita-image-store.s3.amazonaws.com/0/267629/be9c2ef8-f52c-ba9d-f09e-ffcdbfff9b41.png)

　これを見て欲しい。ある日の私の記事に対するQiitaのアナリティクス集計情報だ。8時頃にアクセスが伸び始め、9時から10時のあたりでもっとも大きな値を示している。事前に明確にしておきたいのだが、これは平日のデータである。

# ほとんどが社会人であろう年齢

![image.png](https://qiita-image-store.s3.amazonaws.com/0/267629/52b77e2c-2313-80cd-ea9f-6051411837e0.png)

　ということは、どこかしらの企業に勤めているのだろう。

# この二つのデータから推測できること

　平日の9時から10時に社会人からのアクセスがピークを迎える。9時といえば、一般的な企業では始業時間と言われているものだ。この情報から、平均的な行動を推測してみたい。

# 行動シミュレーション

　1.起床
　2.朝食
　3.出勤
　4.Qiitaの記事を読む
　5.Qiitaの記事を読む
　6.昼食
　7.Qiitaの記事を読む
　8.仕事
　9.Qiitaの記事を読む
　10.仕事
　11.退社
　12.夕食
　13.趣味の時間
　14.就寝

# もしかしたら前提条件が間違っているのかもしれない

　Qiitaの記事を読む ≒ 仕事

# つまり

　Qiitaで記事を読むと給料が貰える

# 結論

　Qiitaは金を生み出す場所だったのだ！
新MacBook Pro (2018)のキーボード改良は静音化だけ？嘘でしょ？明らかに打ちやすくなったような気がしたのだけれど‥。

新MacBook Pro (2018)のキーボード改良は静音化だけ？嘘でしょ？明らかに打ちやすくなったような気がしたのだけれど‥。

# REf

>アップルは実はゴミ侵入対策を主な目的としてキーボードを改良したものの、訴訟を抱えた状態では「改良しました」「やっぱり欠陥だったのか！」となってしまうことを避けるため、敢えて公式には静音化だけを立てているのだ、という穿った見方もあります。

[新MacBook Pro (2018)実機インプレ。改良型バタフライキーボードは実際どう変わった？ - Engadget 日本版](https://japanese.engadget.com/2018/07/19/macbook-pro-2018/)

# 最近MacBookを使うモチベーションがない理由が、冬で手が凍っているせいなのか、キーボードのせいなのか、ひたすら悩む。

モチベーションのせいなのか。手が凍っているせいなのか。キーボードのせいなのか。あるいはその全てなのか。

# あんなに愛したMacBookのキーボード

愛せなくなったならただただ悲しい。もっとたくさん使っていくべきか、手を鳴らしていくべきなのか。

# 昨日はホッカイロを買った。

僕から愛する方向に、手足を訓練して行っても、ユーザーの歩み寄りで実現する、我慢しながら実現する愛は、やはり壊れやすい気もする。無理が祟り。

利用デバイスのいろいろな複雑性や競合の中で、MacBookへの愛をはかりかねている。

# 耐久性がきになる、強く打つといかにも壊れそうな気もする

気のせいで、実はすごく強いのかもしれないけれど。

このタッチ感を考えると、なんかすごく壊れそうな感じがする。儚い。

---

https://twitter.com/yumainaura

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









<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
AS400(DB2)の相対レコード番号をSQLで使う

# 概要
AS400のデータファイルには、相対レコード番号というものが付与されており、この番号を使ってレコードを一意に特定する事ができる。
OracleでいうとROWIDに相当する物で、OSが自動的に割り振り、基本的には(SQL文等では)変更する事はできない。
AS400のコマンドでデータファイルを扱う際には、レコードを特定するためにパラメータに指定したりするが、SQLでデータ操作をする時に使いたい場合がある。どうしたらよいのだろうか?

# どんな時に使いたいか?
AS400上に構築されたシステムは、リレーショナルデータベースが流行る前から存在していたりする。
そんなわけで、ユニークキーを設定する意識がほとんどなかったりする。
キーは設定されていても、全く同じ内容のレコードが平気で登録されていたりするのだ。
そういう場合、「一番最後に登録されたレコードが現行。古いのは更新する前の履歴。」みたいな仕様だったりする。
RPGでプログラムすると、同じキーが設定されているレコードを順番にカーソル移動させていって、最後のレコードを使う。みたいな感じになる。
SQLを使って同じ事をしようとすると、「最後のレコード」の見分けがつかなくて困ってしまう事になる。
こういう時に、「相対レコード番号が一番大きいレコード」を「最後のレコード」として使う事ができる。

# SQLからはrrn関数を使う
SQLからはrrn関数を使う事で、相対レコード番号を知る事ができる。
相対レコード番号は、データが登録された順に付与されるので、例えば下記のようにすると相対レコード番号を含めた結果を得る事ができる。

```sql
	SELECT
        rrn(file)
        ,file.*
    FROM
        lib.datafile file
    WHERE
        cusno = 497
    ORDER BY
        rrn(file);
```

# 参考になったサイト
[IBM AS400 iSeries - sort order of select statement
](https://stackoverflow.com/questions/42636303/ibm-as400-iseries-sort-order-of-select-statement)
AdGuard DNS を簡単設定する

## 概要

AdGuard DNS https://adguard.com/ja/adguard-dns/overview.html

広告のIPを名前解決しないDNSサービス。無料。
DNSサーバーの設定を変えるだけで使えて簡単。
スマホはWiFi接続時のみ設定可能

GUIで変更するのは面倒なので、shellを書いた

## 使い方

DNS設定なし　→　AdGuard DNS設定追加　をする場合

```bash
$ sh setAdGuardDns.sh

Please select target service. # 対象を選択
1) Ethernet
2) Wi-Fi
3) Bluetooth
4) PAN
5) Thunderbolt
6) Bridge
7) exit
#? 1
Display DNS setting of Ethernet # 実行前のDNS設定

There arent any DNS Servers set on Ethernet.
-----

Please select an action.　# 処理を選択 追加 or 初期化
1) setAdGuardDns
2) unSetDns
3) exit
#? 1
setAdGuardDns done!
Display DNS setting of Ethernet　# 実行後のDNS設定

176.103.130.130
176.103.130.131
176.103.130.132
176.103.130.134
-----
```

2) unsetDns を選ぶとDNS設定がクリアされる

## code

setAdGuardDns.sh

```bash
#!/bin/sh
COLUMNS=1

# note: https://adguard.com/en/adguard-dns/overview.html#instruction
readonly DNS_IP="176.103.130.130 176.103.130.131 176.103.130.132 176.103.130.134"

function dispDnsSetting () {
    TARGET=$1
    echo "Display DNS setting of ${TARGET}"
    echo ""

    networksetup -getdnsservers $TARGET
    echo "-----"
    echo ""
}

# networkServece一覧取得
SERVICES=$(networksetup -listallnetworkservices | grep -v 'An asterisk')" exit"

# 対象選択
echo "Please select target service."
select TARGET in $SERVICES
do
    if [ "$TARGET" = "exit" ]; then
        exit
    fi

    dispDnsSetting $TARGET
    break
done

# DNS set or unSet
echo "Please select an action."
select COMMAND in setAdGuardDns unSetDns exit
do
    case $COMMAND in
	"setAdGuardDns" ) networksetup -setdnsservers $TARGET $DNS_IP ;;
	"unSetDns" ) networksetup -setdnsservers $TARGET Empty ;;
	"exit" ) exit ;;
    esac

    break
done

echo "${COMMAND} done!"
dispDnsSetting $TARGET
```
bitbucketでチーム開発を始める手順

# 用意するもの

* mac (windowsの場合はGit bashを入れておくと良い)
* VSCode

# bitbucketのアカウントを作成する

こちらよりアカウントを各自作成する
https://bitbucket.org/

# ssh公開鍵、秘密鍵の作成

下記のコマンドで公開鍵、秘密鍵が~/.ssh/配下に作成されます。

```
cd ~/.ssh/
ssh-keygen -t rsa -f filename
```

# configの設定

~/.ssh/configに以下記述し保存

```
Host bitbucket.org
  User git
  Port 22
  HostName bitbucket.org
  IdentityFile ~/.ssh/filename # filenameは秘密鍵を指定
  TCPKeepAlive yes　
  IdentitiesOnly yes
  ForwardAgent yes
```

|  |  |
|---|---|
|Host|ホスト名| 
|HostName |ホスト|
|User|ログインユーザ|
|IdentityFile|秘密鍵|
|Port|ポート(デフォルトは22) |
|TCPKeepAlive|接続状態を保持する場合はyes|
|IdentitiesOnly	| IdentityFileが必要な場合はyes|
|ForwardAgent|ssh-agentを利用する|


# bitbucketに登録

* view profile > 設定 > 鍵を追加
* label は　鍵の名を追加
* keyは以下を実施したうえ貼り付け

```
cat ~/.ssh/filename.pub | pbcopy .
```

# bitbucketからローカルPCにClone

あらかじめ管理者でリポジトリを作成した上、以下のコマンドでclone

```
git clone git@bitbucket.org:team_name/project.git
```

# 書き込みができるか確認

ファイルの書き込みができるかcloneしたフォルダ内で確認

```
touch test.txt
git add .
git ci -m "first commit"
git push origin master
```

bitbucket　> プロジェクト　> リポジトリ
コミットが表示されていれば初期設定完了
SQL*Plusでの表領域の作成方法

#概要
SQL*Plusにて新規の表領域を作成してみます。

#コマンド
```
CREATE TABLESPACE 表領域名 DATAFILE 'データファイルの名前' SIZE サイズ;
```

表領域名、データファイルの名前は各自お好きなネーミングでお願いします。

###例
```
CREATE TABLESPACE TSPACE2 DATAFILE 'TSPACE2_DATAFILE' size 100m;
```
![SmartSelectImage_2019-01-25-07-13-25.png](https://qiita-image-store.s3.amazonaws.com/0/328125/7d32799e-b5b5-621e-868b-dd70015d9751.png)


#確認
```
SELECT * FROM DBA_DATA_FILES WHERE TABLESPACE_NAME = '表領域名';
```
表領域名は先ほど作成したものに書き換えてください。

###例
```
SELECT * FROM DBA_DATA_FILES WHERE TABLESPACE_NAME = 'TSPACE2';
```

![SmartSelectImage_2019-01-25-07-18-35.png](https://qiita-image-store.s3.amazonaws.com/0/328125/c00c0ac6-856e-7671-488f-14741826cf54.png)
paizaでsympy その２

#概要

sympyが、魔法なので、paizaで、やってみた。
練習問題、やってみた。

#問題1


8x – 4 = 9x + 1
4x^2 = 100
3x^2 - 7x + 4 = 0
2x^2 + 4x = 48
5x^2 - 2x - 3 = 0
5x^2 - 3 = 0
(x - 3) ^ 2 = 3(x - 3）

```
import sympy as sym

x = sym.symbols('x')
print ("solve - 式を解く")
print (sym.solve(8 * x - 4 - 9 * x - 1))
print (sym.solve(4 * x * x - 100))
print (sym.solve(3 * x * x - 7 * x + 4))
print (sym.solve(2 * x * x + 4 * x - 48))
print (sym.solve(5 * x * x - 2 * x - 3))
print (sym.solve(5 * x * x - 3))
print (sym.solve((x - 3) * (x - 3) - 3 * (x -3)))
print (sym.solve(2 * x * x + 3 * x - 5))

```

#問題2
xyz = -234
x + y + z = 20
5x – y + 2z = 85

``` 
import sympy as sym

x, y, z = sym.symbols('x y z')
f0 = x * y * z + 234
f1 = x + y + z - 20
f2 = 5 * x - y + 2 * z - 85
print ("solve - 式を解く")
print (sym.solve((f0, f1, f2)))
```

#問題3

2 * x + 3 * y = 6
1 * x + 2 * y = 3

```
import sympy as sym

x, y = sym.symbols('x y')
f0 = 2 * x + 3 * y - 6
f1 = 1 * x + 2 * y - 3
print ("solve - 式を解く")
print (sym.solve((f0, f1)))

```

#問題4

 x^2 - 10x + 24 = 0 のとき、xを求めよ。

```
import sympy as sym

x = sym.symbols('x')
f = x ** 2 - 10 * x + 24
print ("expand - 展開")
#print (sym.expand(f))
print ("factor - 因数分解")
print (sym.factor(f))
print ("simplify - 簡約")
#print (sym.simplify(f))
print ("limit - 極限")
#print (sym.limit(f, x, sym.oo))
print (sym.limit(f, x, 0))
print ("diff - 微分")
#print (sym.diff(f))
print ("integrate - 積分")
#print (sym.integrate(f))
print ("solve - 式を解く")
print (sym.solve(f))
```

#問題5
2 * x + 2 * y + 6 * z + 3 = 0
x + y - 2 * z - 7 = 0
5 * x - 9 * y + 2 * z - 15 = 0

```
import sympy as sym

x, y, z = sym.symbols('x y z')
fuc1 = 2 * x + 2 * y + 6 * z + 3
fuc2 = x + y - 2 * z - 7
fuc3 = 5 * x - 9 * y + 2 * z - 15
print (sym.solve([fuc1, fuc2, fuc3], [x, y, z]))
```


以上。
kintone プラグイン開発メモ　その６（設定画面で保存した値を、初期値としてセットする）

プラグインの設定画面で保存した値を、再度設置画面を開いた時に初期値としてセットしてみます。

# 方法
kintone.plugin.app.getConfig(pluginId)で設定値を取得して、そこに値がセットされている場合は、その値をセットします。

# コード

```config.js
(function (pluginId) {
    "use strict";
    window.addEventListener('DOMContentLoaded', function() {
        console.log(kintone.plugin.app.getConfig(pluginId));
        let config = kintone.plugin.app.getConfig(pluginId);
        if (typeof (config['name']) !== 'undefined') {
            document.getElementById('name').value = config['name'];
        }
        if (typeof (config['unsei']) !== 'undefined') {
            document.getElementById('unsei').value = config['unsei'];
        }
        document.getElementById("button_submit").onclick = function() {
            let elName = document.getElementById('name');
            let elUnsei = document.getElementById('unsei');
            let config = {
                "name": elName.value,
                "unsei": elUnsei.value
            };
            kintone.plugin.app.setConfig(config);
            window.alert("保存しました");
        };
    });

})(kintone.$PLUGIN_ID);
```

# 動作画面

値を入力して保存します。
<img width="789" alt="スクリーンショット 2019-01-24 22.30.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/214523/8fea1d91-65eb-0899-d11d-9cf9557eee03.png">

一覧画面を表示させてみます。
<img width="783" alt="スクリーンショット 2019-01-24 22.31.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/214523/2a78df33-c504-2101-d40e-417775193bf4.png">

再度設定画面を開くと保存した初期値がセットされています。
<img width="628" alt="スクリーンショット 2019-01-24 22.45.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/214523/bb441c77-262f-93e9-fa45-0557b9521884.png">

# 振り返り
ひとまずkintoneのプラグインがどんなものか、うっすらと見えてきたような気がします。
これまでの記事のリンクです。

 1. [kintone プラグイン開発メモ　その１（一覧画面にHello,worldと表示するプラグインを作ってみた）](https://qiita.com/sy250f/items/011254b5c0ffac9a9a05)
 2. [kintone プラグイン開発メモ　その２（何もしない設定画面を表示する）](https://qiita.com/sy250f/items/d6b8cd69c66513c1f6ca)
 3. [kintone プラグイン開発メモ　その３（プラグイン設定画面にボタンをつける）](https://qiita.com/sy250f/items/57d22169aaa6a98fbd25)
 4. [kintone プラグイン開発メモ　その４（設定値を保存・読み込みしてみる）](https://qiita.com/sy250f/items/8ec81a03e6125d3d5b31)
 5. [kintone プラグイン開発メモ　その５（設定画面で保存した値を読み込んでみる）
](https://qiita.com/sy250f/items/c606e520c6c50a1e19c6)
 6. [kintone プラグイン開発メモ　その６（設定画面で保存した値を、初期値としてセットする）]()

kintoneプラグイン作家になるためには先が長いですが、次回以降テストしていきたいメニューのメモです。

 1. 設定画面にkintoneアプリのフィールドを取得して表示させる
 2. 設定画面の見た目を良くしたい
 3. 設定画面にフレームワークを使ってみる
 4. プラグインのパッケージとデプロイを効率良くしたい
iTerm2 でタブから誤って分離させてしまい window 化したものをタブに戻す方法

前にも調べて出来たはず…なのに、ちょくちょく忘れるのでメモ。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">iTerm2 で誤ってタブから分離させてしまい window 化したやつを再度サブにする方法<br>1. 分離状態で command + shift + option を押してメイン部分をドラッグ<br>2. ひとまず、画面分割状態で登録<br>3. その後、特にキーボードショートカット無しでタブ位置へドラッグ <a href="https://t.co/QwNwRrJ27l">pic.twitter.com/QwNwRrJ27l</a></p>&mdash; hokutoasari (@hokutoasari) <a href="https://twitter.com/hokutoasari/status/1088538624369385472?ref_src=twsrc%5Etfw">2019年1月24日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

qiita に dnd で画像アップロードしようとしたら bad request って出たので twitter にアップロードして qiita に挿入する荒業を取ってみた。
Navigation Editorを使ってみる

Android Studio 3.3でNavigation Editorなるものがサポートされたらしいので使ってみることにします．

#下準備
`build.gradle`に以下を追加．
Javaなら

```
dependencies {
    def nav_version = "1.0.0-alpha11"

    implementation "android.arch.navigation:navigation-fragment:$nav_version"
    implementation "android.arch.navigation:navigation-ui:$nav_version"
}
```
kotlin使ってるなら

```
dependencies {
    def nav_version = "1.0.0-alpha11"

    implementation "android.arch.navigation:navigation-fragment-ktx:$nav_version"
    implementation "android.arch.navigation:navigation-ui-ktx:$nav_version"
}
```
`res`右クリックの`New` > `Android Resource File`を選択．
ファイル名は`nav_graph`
`Resource type`は`Navigation`を選択しOKを押す．

これで使えるようになります．
まあ，Android Developersのドキュメントそのままなんですけどね・・・

使ってみてまた追記します．
バッチファイルで%をエスケープする方法

**`%`**の後に**`^`**を入れる。

```
@echo off
REM 連番画像を動画に変換する
ffmpeg -r 30 -i img%%^03d.png -vcodec libx264 -pix_fmt yuv420p -r 60 30out.mp4

pause
```