OmniAICreator/Qiita-1.07M huggingface dataset:
ディレクトリの中のファイル数を一定に保ちたい

# はじめに
この記事は初心者インフラエンジニアが備録的に書いたものです。

# ことのあらまし
[前回記事](https://qiita.com/goto_yoshiki/items/4f75568799c044df811d)でDBバックアップの自動化をしました。
これに伴い、バックアップの保存先にバックアップファイルが量産されていくことになります。
いつまでも古いバックアップファイルを残しておくのはリソースを圧迫するだけなので、古いものを削除していくことが必要になりました。

# やりたいこと
1．増えるファイルの数を管理したい
2．スクリプトで自動化したい

# スクリプトの中身
### 1．ディレクトリの中を参照
```backuup.sh
#!/bin/bash
FilePath="/var/backup"
ls -t $FilePath | tail -n+5
```
ディレクトリの中身を更新時間でソート → 5行目から表示

### 2．n日前より古いファイルを削除
```backup.sh
rm `ls -t $FilePath | tail -n+5`
```
5行目から削除
### 3．実行結果をログに出す
```backup.sh
for filename in $FilePath ; do 

 echo $filename
 
done >> backup.log
```
1,2を&&とかで繋ぐといい感じになりそう。

#まとめ
・スクリプトでやりたいことを明確にする
・全部を一気に書くのではなく、部分的に作っていく
・ログ出力は大切
create-react-appでyarn startできない(できた)

# Create-react-app後にyarn startが出来ない

具体的には,`create-react-app my-app`した後にプロジェクトディレクトリに移動`cd my-app`したのち,`yarn start`を実行したが以下のエラーで実行できなかった.

```terminal.
yarn start
```

```terminal.
yarn run v1.17.3
$ react-scripts start
Attempting to bind to HOST environment variable: x86_64-apple-darwin13.4.0
If this was unintentional, check that you haven't mistakenly set it in your shell.
Learn more here: https://bit.ly/CRA-advanced-config

events.js:180
      throw er; // Unhandled 'error' event
      ^

Error: getaddrinfo ENOTFOUND x86_64-apple-darwin13.4.0
    at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:60:26)
Emitted 'error' event at:
    at GetAddrInfoReqWrap.doListen [as callback] (net.js:1412:12)
    at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:60:17) {
  errno: 'ENOTFOUND',
  code: 'ENOTFOUND',
  syscall: 'getaddrinfo',
  hostname: 'x86_64-apple-darwin13.4.0'
}
error Command failed with exit code 1.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.

```

コマンドだけで開発が始められるはずでは...と少しハマったので解決法をメモしておきます。

動作環境
- macOS Mojave 10.14.15
- node.js 12.7.0

# 原因はなんだ

まずよくある解決法を示します.

```terminal.
npm install npm
yarn add yarn
```

自分の場合は上記を実行しても動かなかったので,エラーログをちゃんと読んでみたところ以下の冒頭部分が気になりました.

```terminal.
Attempting to bind to HOST environment variable: x86_64-apple-darwin13.4.0
If this was unintentional, check that you haven't mistakenly set it in your shell.
```

日本語に訳すとこうです.

「HOST環境変数にバインドしようとしています：x86_64-apple-darwin13.4.0
これが意図的でない場合は、誤ってシェルに設定していないことを確認してください。」

ふむ,create-react-appで作ったアプリからローカルサーバーを動かす時に,HOST変数をbindできなくて困ってるっぽいですかね.

そこで確認として以下を実行しました.

```terminal.
echo $HOST
```
すると以下の結果が.

```terminal.
x86_64-apple-darwin13.4.0
```

さっきの文と同じこと言ってますね.$HOSTにすでに値が入っているので,ローカルサーバーの立ち上げができない、的なことでしょうか.

上記エラーログを元に検索をしていると以下の[stackoverflow](https://stackoverflow.com/questions/53912056/npm-start-on-new-create-react-app-build-returns-elifecycle-error)にて同様の事例を発見できました.

これによれば,とりあえず$HOSTを解放してあげることで解決しそうです.そこで,以下のコマンドを実行します.

```terminal.
unset HOST
```

これで\$HOSTのバインドが解放されました.
念の為$HOSTの値を確認してみましょう.

```
echo $HOST
```
すると上記のように何も表示されなくなりました.

以上を確認したのち,プロジェクトディレクトリで`yarn start`を実行してみます.

```terminal.
yarn start
```
すると,macからネット接続関連の警告が飛んでくるのでOKを出します.すると

<img width="1280" alt="スクリーンショット 2019-07-29 17.56.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386550/4dfdc97b-e725-c14a-915e-7c2ff5554e1e.png">

できました！

# まとめ
一応`unset HOST`で解放されるのはカレントディレクトリの変数だけっぽいんですが,HOSTとか恐ろしい名前はできるだけ触りたくないんですね...

こちらの記事にて安全のためHOSTに他の値をバインドしている方がいらっしゃったので、参考として載せさせていただきます.

[https://medium.com](https://medium.com/@choy/fixing-create-react-app-when-npm-fails-to-start-because-your-host-environment-variable-is-being-4c8a9fa0b461)
BottomNavigationViewにバッジを表示する


BottomNavigationViewでバッジを表示する機能が追加されたっていう記事をみて自分でも試してみた。
が、バッジを表示なんてできないじゃないか！？

どういうことか？
しらべてみた。

## 結論
AndroidXのmaterialライブラリのalpha06から使えるようになった。
フツーにサポートライブラリで使えるのかと思っていたよ。。。
皆さんも、AndroidXにのりかえましょー！

* android.support.design.widget.BottomNavigationView
(com.android.support:design)

  * 28.0.0 →非対応

* com.google.android.material.bottomnavigation.BottomNavigationView
(com.google.android.material:material)

  * 1.0.0 : 非対応
  * 1.1.0-alpha05 : 非対応
  * 1.1.0-alpha06 : 対応！！！(ここから)
  * 1.1.0-alpha07 : 対応
  * 1.1.0-alpha08 : 対応(showBadge()が消えたので注意)


## 画面サンプル
![device-2019-07-29-165303.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/303516/3a4f1b06-e97d-8b2f-0dc2-1abd6c4d0d86.png)

## 実装方法
AndroidStudio のBottomNavigationViewActivity をベースに修正。

### alpha06～alpha07まで
バッヂ表示が追加されました。
showBadge()でバッヂが表示されますが、
引数 menuItemId はgetMenu().getItem(0).itemId で取得したIDを使ってください。

``` MainActivity.kt
package com.example.androidxapp

import android.os.Bundle
import com.google.android.material.bottomnavigation.BottomNavigationView
import androidx.appcompat.app.AppCompatActivity
import android.widget.TextView
import androidx.core.view.get

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        val navView: BottomNavigationView = findViewById(R.id.nav_view)

        textMessage = findViewById(R.id.message)
        navView.setOnNavigationItemSelectedListener(onNavigationItemSelectedListener)

        navView.menu.getItem(0).itemId.let {
            navView.showBadge(it).apply {
                number = 999
            }
        }
    }
}
```

### alpha08から
showBadge()が削除されました。
BadgeDrawable#isVisible=trueにします。

``` MainActivity.kt
package com.example.androidxapp

import android.os.Bundle
import com.google.android.material.bottomnavigation.BottomNavigationView
import androidx.appcompat.app.AppCompatActivity
import android.widget.TextView
import androidx.core.view.get

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        val navView: BottomNavigationView = findViewById(R.id.nav_view)

        textMessage = findViewById(R.id.message)
        navView.setOnNavigationItemSelectedListener(onNavigationItemSelectedListener)

        navView.menu.getItem(0).itemId.let {
            navView.getOrCreateBadge(it).apply {
                number = 999
                isVisible = true
            }
        }
    }
}
```


いじょ
Ansible：Windowsを対象にした際のProxyではまった件について

## WindowsへのSSH接続がProxyのせいで接続できなかった

Windows側の設定が終わり、Ansibleにて接続確認にてProxyにたどり着かないエラーが出ていた
※社内はProxyサーバーを経由しないと何もできない

```
# ansible windows -i hosts -m win_ping
XXX.XXX.XXX.XXX | UNREACHABLE! => {
    "changed": false,
    "msg": "ssl: HTTPSConnectionPool(host='XXX.XXX.XXX.XXX', port=5986): Max retries exceeded with url: /wsman (Caused by ProxyError('Cannot connect to proxy.', error('Tunnel connection failed: 502 Bad Gateway',)))",
    "unreachable": true
}
```

## 原因
- WindowsへのSSHはHTTPS経由なことと、Ansibleを実行するときはProxyを意識してないからProxy経由にならないこと？

## 解決策
- PythonのWinRMのファイルをいじることで解決

これを

```python:/usr/lib/python2.7/site-packages/winrm/transport.py
session.trust_env = True
```

こう！

```python:/usr/lib/python2.7/site-packages/winrm/transport.py
session.trust_env = False
```

## 修正後
```
# ansible windows -i hosts -m win_ping
XXX.XXX.XXX.XXX | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
```

とりあえずで書いた記事なので、後日修正予定です
SQLのCASE文

今回はSQLのCASE文について説明します。
というか、自分がすぐCASE文の使い方を忘れてしまうので自分用メモなんですが……。

まずは、もっとも単純なCASE文を書いてみます。
jobカラムには職業がコードで登録されているため、名称を紐づけているSQLです。

```ruby:
CASE
    WHEN job = 0 THEN '会社員'
    WHEN job = 1 THEN '自営業'
    ELSE '不明'
END
```

ちなみに、CASE文の中では不等号やIN句も使用できます。

```ruby:
CASE
    WHEN age < 20 THEN '子供'
    WHEN age >= 20 THEN '大人'
END
```

```ruby:
CASE
    WHEN kbn IN (0, 1, 2) THEN '分類１'
    WHEN kbn IN (3, 4) THEN '分類２'
    ELSE '分類３'
END
```

もちろん、複数条件を指定することもできます。

```ruby:
CASE
    WHEN rank = 0 AND score >= 80 THEN '評価S'
    WHEN rank = 1 AND score >= 80 THEN '評価A'
    ELSE '評価B'
END
```
AndroidXのmaterial:1.1.0-alpha08にアップデートしたらビルドエラー

AndroidXでBottomNavigationViewを使おうとしたら、
ビルドエラーになって悩んだのでメモ。

# 経緯
androidx のBottomNavigationViewの調査のため、
com.google.android.material:material を 1.1.0-alpha08 にアップデートしたら、エラー。

![スクショ_AndroidStudio_Error_Invoke-customs_are_only_supported_starting_with_Android_O.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/303516/eba109b1-3dc8-b813-daf6-85d946c8f21c.png)

```Error: Invoke-customs are only supported starting with Android O (--min-api 26)```というエラーになるが、そもそも関係なかったorz



# 解決策
Javaのバージョンを上げるだけ。
エラーの内容は全く関係がないので、だいぶはまった。

https://stackoverflow.com/questions/49891730/invoke-customs-are-only-supported-starting-with-android-0-min-api-26

``` app/build.gradle
android {

    ・・・

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}
```

おわり
direnv で環境変数をカレントディレクトリに合わせて設定する

direnv を使うとターミナルのカレントディレクトリにあわせて環境変数を設定できます。Nuxt.jsビギナーズガイドで存在を知りました。

## インストール

1. `brew install direnv` Mac以外なら https://github.com/direnv/direnv 参照
2. `~/.zshrc` に `eval "$(direnv hook zsh)"` を追加。zshじゃないなら適宜変更
3. `.envrc` を常にコミットしないのであれば `~/.config/git/ignore` に `.envrc` を追加

## 使い方

```
direnv edit .
```

`export TEST=test` と書いて、試しに `echo $TEST` としてみると `test` が出力される。`.envrc` は直接編集もできます。

## 参考

 - [direnvを使おう](https://qiita.com/kompiro/items/5fc46089247a56243a62)
 - [いまさら direnv の解説](https://qiita.com/ngyuki/items/fda1bbf29384bef7a805)
CircleCI+alpine+Rails+Percyでビジュアルテストを導入した話

## はじめに
[Percy](https://percy.io/)っていうビジュアルテストのサービスがあります
少し前にCircleCIで紹介されていて、使ってみよう〜と思ってやってたんですが、いろいろ詰まったりもして苦労したので記録しておくのもよいかなと思い

結局詰んで妥協した部分もあったりするのでこの内容がベストプラクティスとは思ってません
一応動いているし、現時点では十分という感じではあります

## Railsの設定
RailsのE2EテストではだいたいCapybaraを使うと思うんですが、Percyではそれ用にカスタマイズされた[Percy::Capybara](https://github.com/percy/percy-capybara)というのが用意されているのでそれを使います

ここでいきなり冒頭で述べた妥協した部分になるんですが、このPercy::Capybaraが、最新のドキュメントで書かれているv4だとうまくいきませんでした
v3とv4でPercyのファイナライズ処理が変わっていて、v4からはnodeのpercy-agentを使わないといけないんですが、それが自分の環境ではうまくいきませんでした

結構いろいろ試したんですが、最終的には諦めて[こちらのドキュメント](https://docs.percy.io/docs/capybara-v3)を見てv3で設定しました
ここはドキュメント通りに設定すれば問題ないと思います

## CircleCIの設定
当方はローカルの開発環境をalpineなrubyイメージで作っていて、揃えるためにCircleCIのイメージもalpineなrubyを使用しています
スクリーンショットが撮れるように、alpineでちゃんとchromeが動くようにしないといけないので、その設定を `.circle/config.yml` にします

```yml
      - run:
          name: apk install
          command: |
            echo @edge http://nl.alpinelinux.org/alpine/edge/community >> /etc/apk/repositories && \
            echo @edge http://nl.alpinelinux.org/alpine/edge/main >> /etc/apk/repositories && \
            apk add --update --no-cache \
              alpine-sdk \
              udev \
              chromium \
              chromium-chromedriver \
              fontconfig \
              font-noto-cjk@edge \
              nss@edge \
              freetype@edge \
              freetype-dev@edge \
              harfbuzz@edge \
              ttf-freefont@edge
```

まあ各々ほかにも入れないといけないものがあると思いますがchrome周りで必要なのはこの辺かと
試行錯誤をしていくうちに無駄にedgeになってるものもありそうですが、重要なのは **font-noto-cjk@edge** です
notoはお馴染みのフォントですね
これがないと日本語がお豆腐になってしまうので
後から手で入れるという方法もありますが、edgeにあったのでこちらを利用しました

### CircleCIのOrb
これ、v3でもいるのかな？
でもこの処理がないと、正常にファイナライズできないんですよね
というわけでOrbも入れておきます

```yml
orbs:
  percy: percy/agent@0.1.3

workflows:
  main:
    jobs:
      - test
      - percy/finalize_all:
         requires:
           - test
```

### PERCY_TOKEN
忘れずに[設定](https://docs.percy.io/docs/circleci)してください

## 詰まったところ
一応上記で問題なく動くと思います
v4で苦戦したり紆余曲折あったので僕は散々詰まりましたが…
他に詰まったところは、Railsのmetaタグを1つ忘れていていつまでも日本語が文字化けしていたことです
豆腐にならないものの文字化けしてしまい、なんじゃそりゃって結構長い時間悩んでました
が、なんてことはなく
Railsのlayoutで
`meta[charset="utf-8"]`
し忘れていただけっていう……
これなくても開発環境では普通に表示されるんですけどね（OS/ブラウザがよしなにやってくれている？)
ちゃんと忘れずに書きましょうねっていう教訓でした

## で、Percyどうなの？
わかりやすいです！
特にレスポンシブなサイト作ってると、Percyでスマホの見た目も簡単にチェックできちゃうのがいいですね
あと、開発環境とか見られない人に対してプルリクの変更を確認してもらうのも、Percyのアカウントだけ作ってログインしてもらえれば確認できるので便利です

ネックはお値段ですかね
スクリーンショットの枚数で課金なんですが、CircleCI回るたびにスクリーンショット撮ってると、ページ数によってはあっという間に枚数が増えていくので…
これについては対象のブランチを制限するとか、いろいろやりようがあるかなと思いました
あと、開発者が各々ローカルで実行する意味合いは薄いと思うのでそれはスキップするようにするとか
スクリーンショットの節約術が問われそうです
あと時間もね
ページ増えると地味に時間かかるので
その辺も考えていかないとなーとは思います

その辺さえ気をつけておけば、サービスとしてはかなり満足です
人数の少ない開発環境ではこういうツールがあるとやはり助かりますね
興味のある方は是非使ってみてください
オーバーロードの型定義のお作法を考える TypeScript

TypeScript のみの開発ではオーバーロード(関数の型定義を複数書く)はあまり使わないと思うが、JavaScript のコードに対して d.ts ファイルを書く時にしばしばオーバーロードが使われると思う。
オーバーロードをするときは正しい型定義しないとうまく型が効いてくれなくて困ったりしたことはないだろうか(困った)。

なのでオーバーロード時の型定義をおさらいしたい。

# 結論
- オーバーロードの型を書くときは厳しい型から緩い型の順に書け(基本)
- すなわち、最後には全てを含む最も緩い型を書け(？)

って公式にも書いてある。
https://www.typescriptlang.org/docs/handbook/functions.html#overloads

# 理由
TypeScript が関数の型を解釈するときに、当てはまるまで上から順番に見ていくから。
厳しい型が当てはめれるならば、当てはめた方が良いよね。
緩い型から書いてしまうと、本当はもっと厳しい型にできるのに、緩いほうに適用されてしまうことになる。

という基本的なことを前提にして、以下のような型定義があったとしたらどうだろう。

```typescript
export class Hoge {
  constructor(id: string, options: Options)
  constructor(options: Options)
```

この型定義は実は不十分(?)。正しいのはこれ。

```typescript
export class Hoge {
  constructor(id: string, options: Options)
  constructor(options: Options)
  constructor(arg1: string | Options, arg2?: Options)
```

最後に **今までの型全てを含む最もゆるい型定義** を書いている。

前者の型定義だと、例えば以下のようなコードで型エラーが起きてしまっていました。

<img width="514" alt="スクリーンショット 2019-07-29 午後4.30.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/69140/c0a0d7b3-cebe-c320-3517-2beabd7e0eb3.png">

[ConstructorParameters](https://github.com/microsoft/TypeScript/blob/2aa9fb7d003535aeec4ec8aa88d9bfb5510b3cee/src/lib/es5.d.ts#L1464) でコンストラクターの引数の型を取得できるが、その際、オーバーロードされていると一番下に定義した型が適用されるらしい( 前者だと `constructor(options: Options)` )。

後者の型定義だとエラーは出ません。

<img width="514" alt="スクリーンショット 2019-07-29 午後4.31.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/69140/06b3d998-85cd-a828-f053-5287f44b13a7.png">

なので、オーバーロードで型定義するときは最後に今までの型を含む最も緩い型を書くのが正義と言えそうだ。

おしまい。

# 反論
ここで終わろうとして気づいたが、最後に緩い型を作ってしまうと、例えば以下のようなコードで怒ってくれなくなる。

```typescript
const hoge = new Hoge('id')
```

本来はこのidだけを渡す引数は認めたくない (元のjavascript 的にも実行時エラーになる) ときは不便。

こういったケースはたまーにあると思うのだけれど、どうしたものだろうか...。

まあ、元のJavaScriptがひどいシグネチャ設計なのがいけないと言われたらそうだと思う。
関数内関数のスコープについて

関数内部で関数を呼び出した時は、外側の関数のスコープが優先されるんではなかったかな。。というおぼろげな理解をしていたところ、ハマってしまった。

下のコードを見て欲しい。

```python
b=5

def inner_func():
    print(b)


def outer_func():
    b=3
    inner_func()
```

この場合、inner_funcを内部で呼び出しているouter_funcを呼び出した場合、どうなったっけ？
確かLEGBルールでenclosingスコープ、つまり外側の関数の名前空間を参照するんじゃなかったっけ。。と思って実行してみると。結果はこうだ。

```python
outer_func()
```

```python
5
```
グローバルスコープを参照している。おかしい。

次に、このコード。

```python
b=5


def outer_func():
    b=3
    def inner_func():
        print(b)
        
    inner_func()

```

```python
outer_func()
```

```python
3
```
このコードではouter funcの名前空間、enclosingスコープを参照している。つまり、関数内で関数を「定義」した場合は内部の名前空間ではenclosingスコープがglobalスコープよりも優先されるが、単に関数内で関数を呼び出した場合は外側の関数の名前空間はenclosing　scopeには当たらず、この場合はlocal scopeにもenclosing scopeにもbは定義されていないため、globalスコープを参照する、という話だった。ここを勘違いしていたために混乱が生じていた。
jupyter-notebookをそのまま画像にしたい

# 概要
* jupyter-notebookをそのまま画像化したい。という内容
* スクリプトは相当雑です。（スミマセン。）

# こんな状況
* （あまり無いが、、）Jupyterの一連のドキュメントをそのまま画像化したい。
* Chromeアドオンの[FireShot](https://chrome.google.com/webstore/detail/take-webpage-screenshots/mcbpblocgmgfnpjjppndjkmgjaogfceg?hl=ja)で画像化しようとしたらうまく行かない。（画像が一部切れる）
* Jupyter→HTMLで一度出力してみたら、左右の余白が気になる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183826/e2576b43-c762-b2bd-73c9-2da86cbbb37a.png)

# 回避方法
<ol><li>一度、htmlで出力する。</li>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183826/4cfc75aa-ddd9-35b5-36c1-c75584992554.png)

<li>htmlを開き、下記のブックマークレットを実行</li>

```javascript
javascript:document.getElementById('notebook-container').setAttribute('style','margin: 0 0;padding: 0 0;width: 100%');
```

<li>余白が無くなるので、[FireShot](https://chrome.google.com/webstore/detail/take-webpage-screenshots/mcbpblocgmgfnpjjppndjkmgjaogfceg?hl=ja)で画像化。めでたしめでたし。</li>
![hoge.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183826/e22963cf-b44c-0606-cd6c-f9d6e5493e0e.png)
MySQLのintの最大値を超えた場合の挙動はどうなるか？

MySQLのintの最大値はunsignedでない場合「2147483647」ですが
Unixtimestampを使用しているとこの数値は
`2038-01-19 3:14:07` になります。
これが俗に言う2038年問題ですね。（あと２０年後か…）

ちなみにこの数値を越えるとMySQL的にはどうなるのかな？と思ったので試してみました。

「int_test」の定義がint(11)にしてあります。

~~~
mysql> select * from user_int_test limit 1;
+----+---------+------------+
| id | user_id | int_test | 
+----+---------+------------+
| 1  |    10   | 0 | 
+----+---------+------------+
~~~

~~~
mysql> update user_int_test set int_test = 2147483647 where user_id =10;
Query OK, 0 rows affected, 1 warning (0.00 sec)
~~~

~~~
mysql> select * from user_int_test limit 1;
+----+---------+------------+
| id | user_id | int_test | 
+----+---------+------------+
| 1  |    10   | 2147483647 | 
+----+---------+------------+
~~~

最大値は問題なく入りますね。
次は閾値を１だけ超えた「2147483648」で試してみます。

~~~
mysql> update user_int_test set int_test = 2147483648 where user_id =10;
Query OK, 0 rows affected, 1 warning (0.00 sec)
~~~

クエリ的にはエラーになることもなく正常に完了しました。
値は、、

~~~
mysql> select * from user_int_test limit 1;
+----+---------+------------+
| id | user_id | int_test | 
+----+---------+------------+
| 1  |    10   | 2147483647 | 
+----+---------+------------+
~~~

変わっていない！

ということでmysql側に自動で切り捨てられるようですね。
エラーになるべきではと言う考え方もあるかもしれませんが
その都度状況によって変わると思います。

余談ですが、私がずっと続けているパズドラは攻撃力が最近とくにインフレを起こしてきていますがデータ型は何で定義してあるのでしょうね。

ゲームやユーザの規模が桁違いのシステムなどはデータ型のMAX値についても特に意識して実装いきたいですね。
非エンジニアの社長にReactとは何かを説明する③

# 非エンジニアの社長にReactとは何かを説明する③
[②](https://qiita.com/xx2xyyy/items/feed9dfe6bb2e657d69c)および[2.5](https://qiita.com/xx2xyyy/items/a88ff4c0f81c25b54d6a)の続きです。

## 前回までのあらすじ
* WebページはHTML形式のデータで表現される
* JavaScriptによりWebページに動きを付けることが出来る
* Reactを使うとWebページを書き換える上で面倒なことを代わりにやってくれる

## その他のReactの良いところ：ReactNative
前回Reactの最大の特長であるVirtualDOMについて説明しました。
とはいえ、VirtualDOMだけなら別のライブラリ(有名どころではVuejs)などでも利用できます。
(初めて導入したのはReactでしたが、優れた概念は後続のライブラリにも導入されるのは当然です。)

が、その中で我がチームはReactを採用しました。
Reactには他のjavascript系ライブラリとの明確な差別要素があるためです。
**ReactNative**です。
これは、Webで使うReactの記法と仕組みを理解すると、その様式でiOS,Androidのネイティブアプリ(ストアで配布も出来る普通のアプリ)を作れてしまうというものです。

貧者のツール[^1]と揶揄されることもありますが、
専門のiOSやAndroidエンジニアを抱えていなくても、Web技術の応用で
Web版=>アプリを展開というよくあるリリースパターンが実現できるすごい奴です。

## Reactの歴史とReactNative
なぜReactがReactNativeというものを備えることになったのか。
それについてはReactの歴史を振り返ってみると分かりやすいかと思います。

### Reactの誕生とHTML5
Reactは元々FaceBook社でFaceBookを実装するために作られたライブラリです。
(今はオープンソース化されていますが、FaceBook社の影響は依然として極めて強いです。)
Reactが誕生したのは、2010年代初頭で、ちょうど、**HTML5**という新しいHTMLの規格が盛り上がっている時代でした。
HTMLについては、これまでの回で説明しましたが、Webページのソースの記述形式です。
HTMLの規格は5という番号から分かるように、何度か改訂が行われていたのですが、このHTML5は非常に大きな改訂でした。
何しろ前の4.01が出たのが1999年と10年以上前でしたし、内容的にもそれまでFlashなどのプラグインで行っていた様々な機能を標準として取り込む劇的な変化がありました。

ブラウザ上でできることが非常に増えたので、「HTML5の力を使えばわざわざネイティブアプリなんか作らなくても全部Webで完結できるのでは？」という雰囲気が出てくるのも当然だったかと思います。
おそらく、Reactもそのような期待を背負っていたのでしょう。
が、現実はそうは甘くはありませんでした。

### HTML5に対する幻滅
現在、Web+スマホ用アプリというパターンのサービスが多いことから分かるかと思いますが、
Webサービスだけでスマホまで全てカバーできるというのは幻想でした。
実際、ザッカーバーグも2012年の時点で「HTML5に期待をかけすぎたのは失敗だった」[^2]と語っています。
ブラウザで出来ることは増えましたが、あくまでもWebページを表示するものに過ぎず、アプリを作る基盤ではありません。
アプリとしては必須ないし非常に重要だけれども、ブラウザでは苦手な操作というものがいくつも見つかったのです。(タイムラインのスクロールしてどんどんロードしていく機構など)

### では3プラットフォーム分作るのか？
とはいえ、一つのサービスを作るのに、3プラットフォーム(WEB,iOS,Android)分作るのはコストが大きいですし、異なるスキルを持ったエンジニアを抱える必要も出てきます。
どのプラットフォームもなるべく同じスキルかつコード流用できる形で書きたいところです。

そこでFaceBookが開き直って作ったのがReactNativeです。
Reactで作ったWebページがスマホで使い物にならないなら、Reactでスマホアプリを作れるようにしてしまえというわけです。

もちろん、最終的な生成物が別々なので完全に同じコードで全て動かせるというわけではありませんが、
iOSとAndroidでは90%くらいは同じコードで行けるとの統計がありますし、
WebエンジニアがiOS/Andoroidアプリを作る場合、1からそれぞれの開発手法を習得するより、
ReactNativeでアプリを書いた方がはるかに低コストで対応できるのは明白です。

潤沢な開発力のない貧者的なスタートアップには非常にうれしいフレームワークがここに誕生しました。
作った張本人のFaceBookは貧者とはとても言えませんけれども、そのFaceBookですらマルチプラットフォームを別々に作るのは嫌ったわけです。
素直に恩恵に預かろうと思います。

### まとめ
* VirtualDOMだけなら他ライブラリでもOK
* ただ、ReactNativeという形でスマホアプリ開発にも応用が利く
* ReactはiOS/Androidエンジニアを抱える余裕のない貧者の味方



[^1]: iOSやAndroidの熟練したエンジニアをたっぷりと抱えているチームだったら、それぞれ作りこんだ方がいいものが出来ます。が、わが社を始め世の中そんなに恵まれたチームばかりではないのです。
[^2]: https://mashable.com/2012/09/11/html5-biggest-mistake/
Androidのマルチモジュールでユニットテスト結果をDangerでコメントする

前回、[AndroidのマルチモジュールでLint結果をDangerでコメントする](https://qiita.com/m4kvn/items/b8a2e01423dfbb8dca71) という記事を書いた。今回はそれのユニットテスト版。詳しい説明は [ブログ](https://m4kvn.hatenablog.com/) のほうに記載したので、こちらでは方法のみを記載します。

Dangerでユニットテストの結果をDangerでコメントするためには [orta/danger-junit](https://github.com/orta/danger-junit) というプラグインを利用します。danger-junitでは、複数のファイルをパースする仕組みがあるのでそれを使います。

## Dangerfileに設定を記述する

ユニットテストの結果ファイルが `TEST-*` という名前で生成されているので、それらの相対パスの一覧をとってきて、それをdanger-junitに渡してあげる処理をDangerfileに記述します。

```ruby:Dangerfile
`find . | grep "TEST-*"`.split("\n").each do |path|
    junit.parse(path)
    junit.report
end
```

これでユニットテストの結果をまとめてコメントしてくれるようになります。

## おまけ

ユニットテストの実行はBuildVariantを指定してあげることができます。例えば `DevelopmentDebug` というBuildVariantで実行した場合は `./gradlew testDevelopmentDebugUnitTest` と実行してあげることで `./app/build/test-results/testDevelopmentDebugUnitTest/TEST-hogehoge.xml` みたいなファイルが出力されます。

そこでプロジェクトのルートに移動し `find . | grep "TEST-*"` を実行してあげると以下のように出力されます。

```shell
❯❯❯❯ find . | grep "TEST-*"
./app/build/test-results/testDevelopmentDebugUnitTest/TEST-hogehoge.xml
./modules/piyo/build/test-results/testDevelopmentDebugUnitTest/TEST-piyopiyo.xml
./modules/makun/build/test-results/testDevelopmentDebugUnitTest/TEST-makunmakun.xml
```

今回は、これを利用してマルチモジュールのユニットテストの結果を集めてきました。
AWSにおけるAuto Scalingでの起動設定で「UserData does not appear to be base64 encoded」というエラーの対策

## 状況
起動設定の作成の際、
「高度な詳細」を開くと、「ユーザデータ」というシェルスクリプトを記述できるところがある。

そこに、任意のものを書いて最後まで行って起動設定の作成をしようとしたら、
「UserData does not appear to be base64 encoded」
とかいうエラーが出た。

なんとなくエラーの原因は察したがとりあえずググった。

ググっても英語の記事しか出てこなったので、自分でなんとか頑張りました。

## 僕の解決策
エディタでの変換でもいいですが、
オンラインのBase64エンコーダがあったので、
それを使った。
http://www.convertstring.com/ja/EncodeDecode/Base64Encode

上記のサービス使って変換して、変換されたものをaws上でコピペして、
「入力はすでにbase64でエンコード済み」にチェックを入れる。

これで、最後まで進んだら、うまく行った。


##感想
aws関連の日本人の記事が少ない
AnacondaでTensorFlowをインストールする手順メモ

# TensorFlowとは？

機械学習用のソフトウェアライブラリ（オープンソース）である。
https://www.tensorflow.org/

# Anacondaで仮想環境を構築する。

```
AnacondaNavigator -> Environments -> Create
```

を実行し、


```
Name: 
```

に

```
tensorflow190729
```

と入力する。（日付は任意で適当に）。

```
Packages:
```

で、Pythonのバージョンを最新にする。
createボタンを押すと、作成される。


# Jupyter Notebookをインストールする。

AnacondaNavigator 左メニューの
Home
をクリックする。
tensorflow190729
の環境に、各種アプリケーションをインストールできる。
インストールしたいアプリケーションのInstallボタンを押す。
取り急ぎ、JupyterNotebookをインストールする。

# TensorFlowをインストールする。

AnacondaNavigator 左メニューにて

```
Environments -> tensorflow190729 -> OpenTerminal
```

を実行し、プロンプトを立ち上げる。

下記のコマンドを実行し、すべてインストール済みであることを確認する。

```
python --version
```

```
pip --version
```

下記を実行すると、 TensorFlow がインストールされる。

```
pip install --ignore-installed --upgrade tensorflow
```

インストール完了までには、2～3分かかる。
プロンプトが戻ってきたらインストール完了である。


## OpenCVをインストールする。

```
pip install opencv-contrib-python
```

## ワーニング対策。


```
conda install numpy
```

```
pip install matplotlib
```

```
pip install pillow
```

```
pip install scikit-learn
```


```
pip install h5py==2.8.0rc1
```

なお、Windows10で

```
error: Microsoft Visual C++ 14.0 is required. Get it with "Microsoft Visual C++ Build Tools": https://visualstudio.microsoft.com/downloads/
```
が起きる場合は、
https://visualstudio.microsoft.com/downloads/
からダウンロードしてインストーラを立ち上げ、


```
Visual Studio Installer -> ワークロード -> C++によるデスクトップ開発
```


をインストールする。




## TensorFlowの動作確認をする（Hello World）。
 

pythonを起動する。
コマンドプロンプトから

```
pyhton
```
と打つと、pythonが起動する。

```
(tensorflow190729) C:\Users\yamato>python
Python 3.7.3 (default, Apr 24 2019, 15:29:51) [MSC v.1915 64 bit (AMD64)] :: Anaconda, Inc. on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>
```

下記を実行する。1行ずつ実行する。

```
import tensorflow as tf
```

```
hello = tf.constant('Hello, TensorFlow!')
```

```
sess = tf.Session()
```

```
print(sess.run(hello))
```

下記が表示されたらOK。


```
>>> print(sess.run(hello))
b'Hello, TensorFlow!'
```
学習めも

https://www.dell.com/ja-jp/shop/%E3%83%87%E3%83%AB%E3%81%AE%E3%83%8E%E3%83%BC%E3%83%88%E3%83%91%E3%82%BD%E3%82%B3%E3%83%B3/new-dell-g3-15-%E5%8D%B3%E7%B4%8D-%E3%83%97%E3%83%A9%E3%83%81%E3%83%8A-%E5%A4%A7%E5%AE%B9%E9%87%8F%E3%83%A1%E3%83%A2%E3%83%AA%E3%83%BC-gtx1650%E6%90%AD%E8%BC%89/spd/g-series-15-3590-laptop/smg2001hls5s16on4ojp















Ｃ環境
http://lyncs.hateblo.jp/entry/2018/03/11/032127
pamClientCd=$(awk -F'[,]' '{print $3}' <<<${line})


https://www.bellemaison.jp/ep/srvlt/EPFB00/EPFB0005/dProdDtlShow?BELN_SHOP_KBN=100&KAT_BTGO=E11982_441_2013_MM&SHNCRTTKKRO_KBN=0H&KIKK_HBN_HYJ_KBN=t

https://www.bellemaison.jp/ep/srvlt/EPFB00/EPFB0005/dProdDtlShow?BELN_SHOP_KBN=100&KAT_BTGO=E11983_441_2013_MM&SHNCRTTKKRO_KBN=0H&KIKK_HBN_HYJ_KBN=t


( 
  CASE 
    WHEN M02.PF_ID_CLS = '1' 
      THEN CASE 
      WHEN NVL(M02.CURTAIN_TIME, '2359') > '2359' 
        THEN CASE 
        WHEN M02.PF_DATE > '99991229' 
          THEN TO_DATE('99991231', 'YYYYMMDD') 
        ELSE TO_DATE(M02.PF_DATE, 'YYYYMMDD') + 1 + 1 
        END 
      ELSE CASE 
        WHEN M02.PF_DATE > '99991230' 
          THEN TO_DATE('99991231', 'YYYYMMDD') 
        ELSE TO_DATE(M02.PF_DATE, 'YYYYMMDD') + 1 
        END 
      END 
    END
) >= TO_DATE(:gUnyoDate, 'YYYYMMDD')
rubyのハッシュにおけるキーの書き方

# rubyのハッシュにおけるキーの書き方

rubyでハッシュについて学習した際に、キーの書き方が３種類あり混乱したのでまとめておきます。

#### 1. 文字列

```
review1 = {"ジャンル" => "サスペンス" , "タイトル" => "Diner" , "感想" => "藤原竜也になりたい"}
```
#### 2. シンボル
```
review2 = {:ジャンル => "サスペンス"  , :タイトル => "Diner"  , :感想 => "藤原竜也になりたい"}
```
#### 3. シンボル(省略形)
```
review3 = {ジャンル: "サスペンス"     , タイトル: "Diner"     , 感想: "藤原竜也になりたい"}
```
---

3のシンボルの省略形が主流。
なお、バリューを取得する際は、定義したキーの形式と同じである必要がある。

```
p review1["感想"] #=>藤原竜也になりたい
p review2[:感想]  #=>藤原竜也になりたい
p review3[:感想]  #=>藤原竜也になりたい
```
mysql: command not found となった時の対策

##前提条件
MacOS Mojave 10.14.5
Laravel Framework 5.8.29

##状況説明
DatabaseとしてMysqlを使おうとして、ターミナルで以下を実行

```
$ sudo mysql -u root -p
```

すると、以下のように表示された。
(·_·; 無いってどういうこと？？

```
$ sudo: mysql: command not found
```

##状況の把握
ターミナルで以下を実行し、mysqlのバージョン確認。

```
$ mysql --version
```

(ﾟДﾟ≡ﾟДﾟ)やっぱり、「ありません」ってさ。

```
-bash: mysql: command not found
```

##対策・処置・解決方法

Mysqlをインストール

```
$ brew install mysql
```

インストールが開始されました(๑¯ω¯๑)

```
Updating Homebrew...
==> Auto-updated Homebrew!
Updated 1 tap (homebrew/core).
・・・・ゴニョゴニョゴニョ・・・・
```
インストール完了後、再度Mysqlへ接続をトライ！

```
$ sudo mysql -u root -p
```
パスワードの入力を求められるので。Laravelのプロジェクトディレクトリの環境設定ファイル/.envであらかじめパスワードを設定（DB_PASSWORD=root）しておいたので、”root”と入力する。入力しているパスワードはターミナル上に表示されません。

```
Enter password: 
```

接続できたみたい！( ´罒`*)✧

```
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 15
Server version: 8.0.17 Homebrew

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>
```

完了(๑•᎑•๑)

##参考URL
「mysql --version」がcommand not foundになる件
https://qiita.com/taku252/items/a1d3f39a71afe66c1239
Mac へ MySQL を Homebrew でインストールする手順
https://qiita.com/hkusu/items/cda3e8461e7a46ecf25d
mysqlが起動できない
https://qiita.com/hondy12345/items/d32ed749fb49e9da7de6
DBとしてMySQLを用意する
https://qiita.com/sutara79/items/e19fb386451ab9a4a5fa
Font Awesomeをバージョンアップしたらチェックボックスが消えた時の対処法


## 問題
[FontAwesome](https://fontawesome.com/)のバージョンを4系から5系にあげる際、疑似要素に指定していたFontAwesomeのアイコンが表示されなくなってしまった。

## 解決方法
５系では`-o`という接尾辞が使えなくなっているため別のアイコンを使用する


4系で使用していたCheckBox
`'\f096'` (fa-square-o)
![Kobito.gWFd5A.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190874/e80f7683-bf56-4cad-0ff1-8afe0e24a698.png "Kobito.gWFd5A.png")


`'\f14a'`(check-square)
![Kobito.uE816T.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190874/0feab643-aa48-d246-3b43-0cdee21c37f3.png "Kobito.uE816T.png")



5系で仕様が変わってしまったためバージョンアップすると未チェックのボタン`'\f096'`が表示されなくなる

そのため新しい`'\f0c8'`を使う必要がある。

しかしそのままするだけだとデフォルトで`Solid`になってしまうようで、未チェックでも塗りつぶしになりチェックしているのかどうかがわかりずらいものになる。

`'\f0c8'`(square) solid
![Kobito.2cgHcY.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190874/28dd694d-6e47-c198-2e8e-c40270605a67.png "Kobito.2cgHcY.png")

そのためfont-weightで`normal`と指定

```css
  &-checkbox {
    .input+label::before,
    input+label::before {
      font-weight: normal;
      content: '\f0c8';
    }
    .input.checked+label::before,
    input:checked+label::before {
      font-weight: bold;
      content: '\f14a';
    }
  }
```

![Kobito.QFHas2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190874/93d93c36-7559-7fa5-05db-e2c5c9679090.png "Kobito.QFHas2.png")

上の画像のようにわかりやすくなった。
ruby 正規表現 複数パターン[備忘録]

# rubyの正規表現における複数パターン
こんにちは！最近rubyの正規表現における複数パターンについて調べる機会があったので備忘録として残しておきます。

```
string = 'ruby'
string =~ (/python|ruby/)
```
| バーティカルバー(読み方初めて知りました笑)でマッチさせたい文字列を区切ります。
もしマッチすればマッチした文字列の位置の数字を返してくれます。上の例で言えば0が返ってきます。

```
string = 'fruby'
string =~ (/python|ruby/)
```

少しわかりずらいのでもう１つ例を出します。上の例で言えば1が返ってきます。 
string = 'fruby'　この文字列の中でrubyは1番目から始まるので1が返り値として返ってきます。

```
a = 'python
if a =~ (/ruby|python/)
    puts 'good'
end
```
=~は正規表現に使える演算子です。上のコードはマッチすれば'good'を出力するというプログラムです。
逆にマッチしなかった時に何かをしたい場合は

```
a = 'java'
if a !~ (/ruby|python/)
    puts 'bad'
end
```

!~と書いてあげることでマッチしなかった時の処理を記述できます。上のプログラムはbadを出力します。

rubyの正規表現における複数パターンの書き方と演算子について説明しました。よかったら参考にしてください。

##参考
https://ref.xaio.jp/ruby/classes/string/match_operator
Windows10にAnacondaをインストールする手順メモ


# GUIでのインストール方法

ダウンロードサイト
https://www.anaconda.com/distribution/#download-section
にて、画面上部の「Windows」をクリックし、


```
Python 3.7 version
```

の

```
64-Bit Graphical Installer
```

をダウンロードする。
下記の実行ファイルが取得できるので、ダブルクリックする。

```
Anaconda3-2019.07-Windows-x86_64.exe
```

ウィザードはデフォルトのままで「次へ」で進めていく。
インストール完了までは2～3分ほどかかる。
プログレスバーが9割ほど進んだところで固まったように見えるが、
そのまま待つ。detailボタンを押せば詳細な進捗状況が表示される。

プログレスバーが100%まで進んだら、nextを押して、画面をクローズして、終了。

インストールが完了すると、
Anaconda Navigator
のアイコンがスタートメニューに表示されるので
クリックすると、
Anaconda Navigator
が起動する。
torch.transposeがnp.transposeのように使えないのでtorch.einsumで代用してみる

# なにをしたいか
- 高階テンソルの軸を入れ替えたい
- np.transposeのように、軸をリストで与えて軸を入れ替えたい
- アインシュタインの縮約記法なら"それっぽく"できそう
- 結論：遅いのでやめたほうがいい

# 追記2020.1.15
- torch.Tensor.permuteがnp.transposeと同じように使える

```python:transposeとpermuteの比較
# np.transpose
>>> a = np.arange(8).reshape(2,2,2)
>>> a.transpose(1,2,0)
array([[[0, 4],
        [1, 5]],

       [[2, 6],
        [3, 7]]])

# torch.Tensor.permute
>>> a = torch.arange(8).reshape(2,2,2)
>>> a.permute(1,2,0)
tensor([[[0, 4],
         [1, 5]],

        [[2, 6],
         [3, 7]]])

```

# コード
```python:numpy.transposeの場合
>>> a = np.arange(8).reshape(2,2,2)
>>> print(a)
[[[0 1]
  [2 3]]

 [[4 5]
  [6 7]]]
>>> np.transpose(a, [1,2,0])
array([[[0, 4],
        [1, 5]],

       [[2, 6],
        [3, 7]]])
```

```python:np.einsumの場合
>>> a = np.arange(8).reshape(2,2,2)
>>> print(a)
array([[[0, 1],
        [2, 3]],

       [[4, 5],
        [6, 7]]])
>>> np.einsum("ijk->jki",a)
array([[[0, 4],
        [1, 5]],

       [[2, 6],
        [3, 7]]])
```

```python:torch.transposeの場合
>>> a = torch.arange(8).reshape(2,2,2)
>>> print(a)
tensor([[[0, 1],
         [2, 3]],

        [[4, 5],
         [6, 7]]])
>>> torch.transpose(a, 1, 2).transpose(0,2)
tensor([[[0, 4],
         [1, 5]],

        [[2, 6],
         [3, 7]]])
```

```python:torch.einsumの場合
>>> a = torch.arange(8).reshape(2,2,2)
>>> print(a)
tensor([[[0, 1],
         [2, 3]],

        [[4, 5],
         [6, 7]]])
>>> torch.einsum("ijk->jki",a)
tensor([[[0, 4],
         [1, 5]],

        [[2, 6],
         [3, 7]]])
```

# 速度が違います

```python:colaboratoryにて実行
def run_np_transpose(tensor):
  np.transpose(tensor, [1, 2, 0])

def run_np_einsum(tensor):
  np.einsum("ijk->jki", tensor)

def run_torch_transpose(tensor):
  torch.transpose(tensor, 1, 2).transpose(0,2)

def run_torch_einsum(tensor):
  torch.einsum("ijk->jki", tensor)

tensor_numpy = np.arange(8).reshape(2,2,2)
tensor_torch = torch.arange(8).reshape(2,2,2)
```

```python:np.transpose
%%timeit
run_np_transpose(tensor_numpy)
The slowest run took 45.15 times longer than the fastest. This could mean that an intermediate result is being cached.
1000000 loops, best of 3: 915 ns per loop
```

```python:np.einsum
%%timeit
run_np_einsum(tensor_numpy)
The slowest run took 54.64 times longer than the fastest. This could mean that an intermediate result is being cached.
1000000 loops, best of 3: 1.07 µs per loop
```

```python:torch.transpose
%%timeit
run_torch_transpose(tensor_torch)
The slowest run took 96.76 times longer than the fastest. This could mean that an intermediate result is being cached.
100000 loops, best of 3: 3.17 µs per loop
```

```python:torch.einsum
%%timeit
run_torch_einsum(tensor_torch)
The slowest run took 122.75 times longer than the fastest. This could mean that an intermediate result is being cached.
100000 loops, best of 3: 5.57 µs per loop
```

# 結論
- np.transpose > np.einsum > torch.transpose > torch.einsum
macbook proでkernel taskが暴走する問題

# 問題

- macbook pro 2016 を使っていると、 `kernel_task`という名前のプロセスが暴走し、PCが猛烈に熱くなる
- CPUが100%使い切られる
- なぜか充電できなくなる

# 場当たり的に見つけた解決策

- 充電できておらず、5%くらいまでバッテリーが低下する
- やばいと思い、充電用のusb-cを刺し直す
- なぜか `kernel_task` の暴走が止まる

# 原因

- [このstackoverflowが多分答え](https://apple.stackexchange.com/questions/363337/how-to-find-cause-of-high-kernel-task-cpu-usage)
- 充電によりPCのシャーシの温度が上がることが原因
- 特に左側のThunderboltポートを使っていると発生することが多い

# 対処中に得た知見

- PCの加熱が原因、といってPCを冷やしても(保冷剤とかで)あまり効果はない

# 対処法

- シンプルに充電コードを抜き差ししてみる(macbookとの接続部分を)
- 左側のポートから充電してたら、右から充電するようにしてみる
IntelliJでスレッドダンプをめっちゃ見やすくする

CTO様に教えてもらった。

# 手順

1. **jcmd** でも **VisualVM** でもなんでも良いが、とりあえずスレッドダンプをクリップボードにコピーする。  
2. メニューバーから **Analyze → Analyze Stack Trace** を選択。
3. **Put a stack trace or a complete thread dump here:** とあるのでスレッドダンプを貼り付けて **OK** を押す。

上手く行けばこんな感じに出力される。

![スクリーンショット 2019-07-29 15.49.38.png (419.4 kB)](https://img.esa.io/uploads/production/attachments/11466/2019/07/29/41057/baf49b31-13a8-45cc-aec3-61a4b0e4f1f1.png)

# 参考情報

jcmd で スレッドダンプをクリップボードにコピーするコマンド。

```sh
$ jcmd <pid> Thread.print | pbcopy
```

# おわり
コメンティングのすゝめ

# コメンティングとは？
プログラムコードへ付けるコメント。
このコメントを付ける作業のことを「コメンティング」と定義します。

# それって、コーディングでは？
一般的には、プログラムを作る作業のことを

* プログラミング
* コーディング
* 実装

と呼びます。
この作業にはプログラムコードを補足する説明、
いわゆるコメントを付けることも含んでいます。

含まれる・・・
私はこの「含まれる」という事が気に食わなかったのです。
コーディングとコメントを付ける作業を明確に分けたい！

コメントを付ける作業のことを、

「コメンティング」

と呼ぶことにしました。

# 分けていないと何がダメなの？
一言で言うと、
「コメント作業をナメるな！」
「魂込めてコメントを付けろ！」
ってことです。なぜか二言になってしまいました。

## コメントはソフトウェアの実動作には一切関係ないが…
コメントが一切なくても実動作には問題ありません。
よって、コメントを付ける作業は後回しになりがちです。
その一方で、コメントの重要性は言わずもがなで色々な所で説かれています。
説かれているけれど、実際には以下のようなことがよく起きます。

* このコードの意図はなんだろう
* 保守を引き継いだがどうやって修正したら良いか分からん
* 難しい処理を実装しているこの関数（ライブラリなど）を流用するべきか判断に困る
* 自分で作ったのになぜこのコードのなっているのか思い出せない
* まじ納期間に合わねぇ！コメントは適当だぜ！いえーい。

などなど

# そもそもコメントは何のため？
後で、プログラムコードを何がしかの理由で見る読むことになった人（自分も含む）が、
このプログラムコードは一体どうなってんの？と理解する際に、
理解を助けてくれるのが、コメントです。

# 実際に美しいコメント見たことある？
実際には、良いコメントだと感じるプログラムコードに出会うことは少ない。
何故なのか？

* 時間が足りなくなる
* プログラムコード自体が洗練されていないのでコメントも分かりにくくなる
* 実動作とは関係ないので手を抜いてしまう

このような理由が考えられます。

# そこでコメンティング

この機能の実装には３日掛かるな。というタスクがあったとします。
この場合、コーディング２日、コメンティング１日
と行った見積もりを行います。
１日とにかくコメントを付け続ける作業を計画しておく。

朝会とかの報告で、
「コーディングが終わったので、今日はコメンティングします」
みたいな感じ。

理想：
　部下：実装が終わりました。
　上司：コメンティングは終わっているの？
　部下：コメントは付けてありますが、ひとまず実装は終わった感じです。
　上司：じゃぁ今日は１日コメンティングして。


# 洗練されたコメントを付けるために
コメントのコツを意識して１日（半日でも良いけど）かけてコメンティングすると、
いろいろな気づきがあるはずです。

* バグを見つける
* バグとは言えないけれど設計上の上手くないところを見つける
* さらに綺麗でエレガントな実装方法を見つける

見つけたら、実コードにもフィードバックしてあげましょう。
コメントも実コードも質がどんどん上がります。

# コメントのコツ

## コードの翻訳は避ける
見たら分かるコードを日本語に直訳するコメントは避ける。

``` *.c
// ユーザの情報を取得する
getUserInfo( userID );
```
## 意図していることをまず書こう
このプログラムコードの意図を書こう！

## 関数／メソッド／クラスの単位で概要を書こう
よく巷ではヘッダコメントと言われるやつです。

## Andをつけない
シンプルさを保つために、「○○と△△」のようにAnd表現になるコメントを避けよう。
避けられない場合は、その処理や関数が複雑かどうかを再検討しよう。

## シンプルさを重視せよ
流用したくなるような理路整然としたシンプルで本質が書いてあるコメントを目指せ！

## 意図していない「引数、使い方、動作環境」などを書く
意図していることはしっかり書いてあるが、
意図していないことをハッキリと書いてあるコメントは少ない。
意図していることと意図していないことが曖昧の場合は設計が足りない。

## テストシナリオと期待値を書いておく
「こういう状態のとき、こういう動作を行えば、こうなることが期待される」
という形式で記述しておく。
参考：Gherkin（テストのための記法の1つ）

## 将来の自分へのラブレター
今わかっていても、暫くすると忘れる。
将来の自分へのラブレターと思って、
丁寧にコメントを付けよう！
方針や考えていたことをきちんとコメント化するのを忘れないように。

## コメント化が難しい場合
コメントが難しい場合、例えばシンプルに語れない場合は、
おそらく何かが間違っている。
設計が難しかったり、コードが難しくなっている可能性があるので、
シンプルな設計やコードにならないか再検討した方が良い。

## 失敗したプログラム設計（実装方法）を書いておく
すでに試してみたが上手くいかなかった手法があれば書いておく。

## 参考にした文献のURLや書籍名を記録しておく
ネット記事を参考にすることが多いと思うが、元ネタ書いておくと理解の助けになる。
サンプルが書かれた程度の参考記事なのか、
公式ドキュメントからの引用ソースなのか、
はたまた公式ドキュメントの記述をこう解釈した。という結果の実コードなのか。
によって実コードに対する捉え方や理解の仕方が変わります。
Trello風todoタスク管理アプリを作成しよう！【Rails】をやってみた

# 新しい教材にチャレンジ Rails
- Railsチュートリアルに少し飽きてきた笑、ので違う教材を進めることにしました。
- 備忘録や新しい知識をここに書き留めていきたいと思う。

---
- Deviceというgem→ログインや新規登録を簡単にする機能をもったgem
- strong parameterとはデフォルトではないカラムを追加する時に、strong parameterに追加の許可をしてあげで、Railsはデフォルトでマスアサイメントの脆弱性から守ることができるようになった。



---
２章−３ではまったこと
nameカラムを追加するために ```rails g migrate AddNameToUser　```を指定通りやった後、nameカラム追加しようとマイグレーションファイルを実行してストロングパラメータも実行して、フォームも変更したが、nomethods errorが発生してnameカラムが追加できなかった
対策：```rails destroy migrate AddNameToUser　```を実行して生成する段階でカラムを追加する```rails destroy migrate AddNameToUser　name:string　```を行った。その後```rails db:migrate```をおこなったら無事解決した。
Razorで動的に属性適用する時の注意点

#はじめに
.NET MVCでビューを作成するときに使用するRazorですが、渡されたデータから動的にclass属性を構築して適用するときに罠にはまりました。

#本題
まずは以下のコードを見てください

```.cs
@{
    var isEdit = true;

    var className = "baseClassName";

    <div class="@className">1</div>

    if (isEdit)
    {
        className += " isEdit";
    }

    <div class="@className">2</div>
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/385410/0f31a2cb-d0fd-3ab7-8cdf-3be5bf351448.png)

このように適用したいクラス名を文字列で構築してあてることができます。

今回は"isEdit"というフラグをローカルで作っちゃいましたが、ほんとはモデルから渡されてくるような値と思ってください。
描画時にこれでいろいろと分岐するような役割です。

@を使うと変数が適用できるのですが、これだけがダブルクォートの中に入っているというのが慣れていないと違和感ありますね。
この時、以下のようにダブルクォートがないとなんと…

```.cs
@{
    var isEdit = true;

    var className = "baseClassName";

    <div class=@className>1</div>

    if (isEdit)
    {
        className += " isEdit";
    }

    <div class=@className>2</div>
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/385410/0a0b8f11-1cda-afb0-06fc-1f9392a8d6f9.png)

スペース以降がclass属性の値とならなくなり、独立した謎の属性となっています。

Razorは勝手にいい感じにはしてくれません。
属性適用時はダブルクォートを必ずつけましょう。

#おわりに
今回はclass属性でしたが、idなどそのほかの属性でも同様です。

このバグで数時間やられてしまいました。
私は普段JavaScriptばっかりなので.NET MVCは本当に動きが掴みにくい…
GCPでDNSのドメイン確認・設定する方法

# まえがき

DNS周りの設定はたまにしかやらないので忘れがちですよね？
ということでメモを残しておきます（画面キャプチャ多め！）。

# 手順

## 1. Domainのverifyをする！

[APIs & Services] に遷移し、[Credentials] をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3975/35675319-cd78-7e4a-c1cd-8741ff8905e2.png)


次に [Domain verification] を選択し、[Add domain] をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3975/9b356171-45d8-d3fa-7896-c71b03ae8a1d.png)



verifyしたいdomainを入力して、 [ADD DOMAIN] をクリックします。
（※domain/sub-domain関係なく、全部verifyしないといけないようです）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3975/b9dc2096-9aca-7395-8546-2493320a63cd.png)




[TAKE ME THERE] をクリックすると、domainの所有権を確認するページに遷移います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3975/dbae7cc3-33d1-51e6-ba69-89c87893a991.png)


Webmaster Centralの画面に遷移します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3975/893512db-6e92-1de5-58b0-0c03987a7906.png)


対象のdomainのプロバイダーをプルダウンから選択します。

ここでは [Google Domains] を選択しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3975/f884ba73-c5ff-11b1-4ef6-cb201fce0637.png)


赤枠部分の文字列をコピーして、DNS zoneのTXTレコードに設定します。

↓ こんな感じです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3975/b215a13e-48a8-70a9-e446-7fc91a5aa78a.png)



TXTレコードの設定後に、Webmaster Central画面に戻って [VERIFY] をクリックします。

※反映されるのに少し時間がかかるため、TXTレコードを設定してすぐに [VERIFY] をクリックすると、以下のようなエラー画面になるかもしれません。5分程度時間をおいてから再度実行してみましょう。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3975/b997ea2c-8fdd-2ee4-a60e-68079e46475d.png)





成功すると以下のようなSuccess画面が表示されます！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3975/1ebfa56d-916b-be14-bf0f-a38de53dc471.png)




また、再度 [Domain verification] のページに戻ると、verifyしたドメインが許可ドメインに追加されているはずです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3975/da20c425-d82e-bb9c-d468-84edc5333e3b.png)


忘れがちなポイントですが、右上の [Registrar Setup] をクリックし、対象domainのnameserverを更新しておく必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3975/d3ea6d69-927b-3309-fa25-c666035b4d28.png)



以下のようなnameserver（NS）が設定されています（※固定ではなく `ns-cloud-[半角小文字アルファベット]1` 〜 `ns-cloud-[半角小文字アルファベット]4` で微妙に毎回異なります）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3975/d705bef7-b702-a174-0526-ff2d12a78801.png)


Google Domainsであれば以下のようにnameserverを設定する画面があるので、上記のnameserverで更新します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3975/d2f28cae-015c-3b14-9199-b592f149ad10.png)


設定し終わったらお茶でも飲んで少し待ちましょう。

- - - -

そろそろでしょうか。

念の為、以下のコマンドでnslookupでドメインからIPアドレスがひけることを確認しましょう。

```bash
$ nslookup [対象ドメイン （例) yuki.nagae.dev]
Server:         xxx.xxx.xxx.xxx
Address:        xxx.xxx.xxx.xxx

Non-authoritative answer:
Name:   [対象ドメイン （例) yuki.nagae.dev]
Address: [対象ドメインに紐づくIPアドレス]
```

やったね！


# 参考資料

* [Verifying a domain name](https://cloud.google.com/endpoints/docs/openapi/verify-domain-name)
* [Updating your domain’s name servers](https://cloud.google.com/dns/docs/update-name-servers)
ComposerでPHPUnitをインストール

# Composerがあるか確認
ターミナル or コマンドプロンプトで
`composer` コマンドが実行できればインストールされている。
Composerのインストール方法は割愛。

# プロジェクト単位でダウンロード
https://phpunit.readthedocs.io/ja/latest/installation.html#installation-global
>PHPUnitをグローバルに（たとえば /usr/bin/phpunit や /usr/local/bin/phpunit などとして）インストールすることはおすすめできません。

>PHPUnitはプロジェクト単位でローカルな依存として管理すべきです。

プロジェクトルート以下にcomposer.jsonを記述

```
App
  /src
  /test
  composer.json
```

# composer.jsonを記述

```:composer.json
{
    "require-dev": {
        "phpunit/phpunit": "8.0.*"
    }
}
```

# インストール
composer.jsonのカレントディレクトリで実行

```
$ cd App
$ composer install --dev
```

# バージョンを確認

```
$ vendor/bin/phpunit --version
PHPUnit 8.0.6 by Sebastian Bergmann and contributors.
```
Windowsの場合/を\

# テストの実行

```
$ vendor/bin/phpunit test
```

# 追記
composerがインストールされていればプロジェクトルートで

```
composer require --dev phpunit/phpunit
```
を実行するだけでもインストール出来ます。

https://phpunit.de/getting-started/phpunit-8.html

```
composer require --dev phpunit/phpunit ^8
```
こう書けばバージョンの指定ができるっぽい。

# 参考
[composerでPHPUnitをインストールしてどんなにマクロなプログラムを書いた時もテストする](https://qiita.com/sola-msr/items/5e5131d1a0f80b6f1303)
[composer.jsonでPHPUnitをインストール](https://qiita.com/natsucode/items/85699000a14a4b49aeba)
[PHPUnitをComposerでインストールする](https://qiita.com/makoto_kw/items/b700a954f044f0b7a23d)
高密度環境用のLCデュアルコア光ファイバコネクタ

ＬＣコネクタは、そのサイズが小さいために、光通信ネットワーク、データネットワーク、およびケーブルテレビネットワークで広く使用されており、光ファイバコネクタの主流製品である。 日常的な用途では、配線スペースを節約するという観点から、LCデュアルコアコネクタの使用が一般的です。 LCツインコア光ファイバコネクタは、ダブルクリップを介して2つのシングルコアコネクタを組み合わせたもので、シングルコアコネクタと比較して設置工数が削減され、時間と費用が節約されます。

HYC のLCデュアルコア光ファイバコネクタは、従来の2コアコネクタより優れており、迅速なロック解除のための革新的なソリューションを提供します。 従来のシングルコネクタと比較すると、ダブルコネクタは1回押すだけで済みます。つまり、ダブルロック解除が可能です。
![700_400_7.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463940/9da5068a-e3ee-b43c-23ed-8a682ee8330b.jpeg)

図2 \ 3に示すように、この2芯コネクタの設計には2つの利点があります。1つは長いハンドル、もう1つは低いハンドルです。 長いハンドルのユニークなデザインは高密度配線環境でオペレータの手のアンロック範囲を広げることです。そして、それは容易にそしてすぐにアンロックすることができて、挿入と取り外しに便利で、そしてもっと便利です。 低いハンドルは、ハンドルの全体の高さがコンパクトアダプターの高さを超えないということです。 従来の２線式コネクタのハンドル部分はアダプタよりわずかに高くなり、これは配線設置プロセス中により多くのスペースを占有することになる。 このlcデュアルコアコネクタの低ハンドル設計は、より多くのスペースを節約しますデータセンターの高密度環境では、複数のコネクタによって節約されたスペースを組み合わせて大きな利点を得ることができます。

![700_400_8.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463940/76783c6c-1979-3f20-7519-c971b870f46b.jpeg)

![700_400_9.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463940/697cef7f-ee6e-fd86-8106-87b2227fbd44.jpeg)

もう一つの重要な利点は切り替え可能な極性機能です。 光信号伝送では、光ケーブル伝送信号を受信端と送信端に分け、光ケーブルの一端の光ファイバリンク伝送信号（Ｔｘ）と他端の対応する受信機（Ｒｘ）とを整合させる必要があり、整合は極性と呼ばれる。

![700_400_11.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463940/08a60c40-e335-1b1f-d521-4b6ff46d747f.jpeg)

従来のLCファイバジャンパは、極性切り替えを実現する上で大きな制限がありますが、終端の失敗やジャンパの交換や再配線を回避するために、極性切り替えの方向に特別な注意を払う必要があります。 極性変換機能により、この操作が簡単になり、ツールを使用せずに極性変換が容易になり、時間と配線コストを大幅に節約できます。

![700_400_10.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463940/0f85375a-0d52-b60e-23cb-17e0cf359f07.jpeg)

5Gの急速な普及に伴い、データセンターに高密度、低コスト、管理が容易、そして信頼性の高いネットワークケーブルシステムを提供する方法がますます重要になっています。 LCツインコア光ファイバコネクタは、高信頼性、低コスト、高密度のケーブルソリューションです。

HYC は光通信受動基本部品の研究開発、製造、販売およびサービスを専門とする国家ハイテク企業です。 同社の主力製品は以下のとおりです。光ファイバコネクタ（データセンター高密度光コネクタ）、波長分割マルチプレクサ、光スプリッタ、およびその他の3コア光パッシブ基本コンポーネント。 インターネットデータセンター、防衛通信、その他の分野. http://www.hyc-system.com
コミットコードに付けるメッセージとか

## はじめに
現実的にちゃんとコミットメッセージを
ちゃんと書くとしたらどうしようとかいうポエム。


## プロジェクト管理ツールある場合
Redmine等のプロジェクト管理ツールを使用しているなら、
コミットのメッセージには該当チケットの番号のみを記載するだけにとどめる。
色々書く内容はあるけどそれらは全部Redmineに書く。

「チケット番号+タイトル」にしてもいいけど、GitログよりRedmine見る癖付けとく。
チケット番号の代わりに管理ツールへのURL付けとくのもあり。


## プロジェクト管理ツールなんかないよ
プロジェクト管理ツールを導入すればいいんじゃない。


## それっぽくメッセージを書いてみる
### Title(題名)
- 製造テンプレ：【機能名】を製造。
- 修正テンプレ：【機能名】が【修正後の動作】するよう修正。
- 改良テンプレ：【機能名】を改良。

題名で内容の説明はしない。
何をしたかだけにする。

### Abstract(要旨)
- 製造：機能の実装方法(アルゴリズム等)を記述
    - 【機能名】を【実装方法】を用いて製造。
- 修正：修正前の機能と修正後の機能を記述
    - 【機能名】が【修正前の動作】をしていたので、【修正後の動作】するよう修正。
- 改良：実装方法(アルゴリズム等)とその効果(X倍速く動く)を記述
    - 【機能名】を【実装方法】を用いて【効果】が出るよう改良。

要旨でも内容の説明はしない。
既存とのギャップを示すだけにする。
ぶっちゃけなくてもいいです。

### Content(本文)
- 製造：機能の目的、実装方法の説明
- 修正：修正する目的、実装方法の説明
- 改良：改良する目的(最適化、分かりやすくする等)、実装方法の説明、ベンチマーク結果

本文で内容(目的)の説明をする。
目的と実装方法の説明をする。
ぶっちゃけなくてもいいです。

## おまけ

### コミットの目的は３種類のみ
- Production(製造)
    - ドメイン上で、責務が独立している機能を製造とかここ
    - (逆に責務がまんま被ってるのはコピペ)
    - (逆に責務が一部被ってる場合はこのあと修正で責務分離をするように)
- Fix(修正)
    - 機能を変える、もっち動作も変わる
    - 責務の分離はここ
    - コメントの追記とか修正とかもこっち(本当は同時に直すものだけどね)
- Refactoring(改良)
    - 機能を変えずに、動作を変える
    - 「処理速度最適化」とか「メモリ空間最適化」とかこちら。
    - 「同じドメインに属し、かつ同じ責務をもつ機能が同じメソッドたちを1つにまとめた」とかもこちら。
    - ファイル構造変えたとかもこちら。
    - 「使いやすいようにメソッドをちょこっと拡張した」等は修正に当たるので注意。

### 贅文をの削ぎ方
本文を書いてるとつけちゃいがちな贅文を削ごう！

- 敬語、尊敬語、謙譲語の削除
    - 無意味なので消す
- 「ですます調」と「だである調」の削除
    - 無意味なので消す
- 副詞の削除
    - 「ぶっちゃけ～」「ほぼ～」「完全に～」「若干～」
    - ~~ぶっちゃけほぼ完全に~~無意味なので消す
- 接続詞の削除
    - 「よって～」「要するに～」「だから～」「しかし～」
    - 専門性が高い説明を~~コピペ~~してると接続詞が出てくる
    - 証明とかやめよう
    - 専門性が高い話は別途wiki建てて書く
- 断定的に記述する
    - 断定できるほど自信や知識が無いなら「Google is your friend.」
    - ググっても自信がないならいくつか参考資料とかURLとか載せとく


# 感想
正直ここまで書いた内容に従って、
実直にコミットメッセージに書く努力をするより、
プロジェクト管理ツール使った方が確実にいいと思いました。

コミットメッセージはコードに関するメッセージでしかないので、
2人月で終わる自社ツール開発のプロジェクトとかならともかく、
これ以上の規模のプロジェクトでちゃんと書くメリットは低い。
というかGitはバージョン管理ツール。
iDRACの忘備録

自分用

不慣れなGUI操作のため、まとめ。
基本的にDELLの公式HPに乗っている。

下記、リンク参照
https://japancatalog.dell.com/c/isg_20170323/

#構築環境
Windows Server 2016
Memory 32GB
Disk C:100GB D:4TB
CPU: Xenon E-2146G 3.50GHz
DELL

# iDRACとはなにか？
・server管理用システムのようなもの？
・httpアクセスできる。

まだこのぐらいの理解
追記していく

#実施方法

初期設定は2種類あるみたいで、

・フロントのLCDベゼルからIPを設定する
・ライフサイクルコントローラから設定する

今回はライフサイクルコントロールでセットアップをしていくっ(きまぐれ感)。
フロントLCDベゼルで行う方法新しいなあ

##手順
①BIOS画面を起動する。
 serverの電源を入れてF10連打

②ライフサイクルコントローラ起動後に、
[システムセットアップ]-[iDRAC設定]-[ネットワーク]を選択し、IP諸々を入力して設定。

で終わり。
ブラウザ上のiDracについてはまた別に書こう。