OmniAICreator/Qiita-1.07M huggingface dataset:
pytzを使わずにAsia/Tokyoのタイムゾーンを設定する

# 環境

* OS: Debian GNU/Linux 9 (stretch)
* python: 3.5.3

# 参考サイト

* https://qiita.com/mattsu6/items/5511c5631e7a54550f7f
* https://docs.python.jp/3/library/datetime.html

# 実装(python3系)

```python:tz.py
from datetime import datetime, timezone, timedelta

jp = timezone(timedelta(hours=9), 'Asia/Tokyo')

print(datetime.now(tz=jp).strftime('%Y-%m-%dT%H:%M:%S.%f%z'))
> 2019-01-27T16:36:11.831894+0900

print(datetime.strptime('2019-01-25 19:00:00', '%Y-%m-%d %H:%M:%S').replace(tzinfo=jp).strftime('%Y-%m-%dT%H:%M:%S.%f%z'))
> 2019-01-25T19:00:00.000000+0900
```


# 実装(python2系)

```python:timezone/jp.py
from datetime import tzinfo, timedelta

class JP(tzinfo):
    def utcoffset(self, dt):
        return timedelta(hours=9)

    def dst(self, dt):
        return timedelta(0)

    def tzname(self, dt):
        return 'Asia/Tokyo'
```

## 利用側

```python:tz.py
from datetime import datetime
from timezone.jp import JP

print(datetime.now(tz=JP()).strftime('%Y-%m-%dT%H:%M:%S.%f%z'))
> 2019-01-27T16:36:11.831894+0900

print(datetime.strptime('2019-01-25 19:00:00', '%Y-%m-%d %H:%M:%S').replace(tzinfo=JP()).strftime('%Y-%m-%dT%H:%M:%S.%f%z'))
> 2019-01-25T19:00:00.000000+0900
```
Swiftでリアルタイム音声認識するための最小コード

記事の内容はこちらを参照してください。
https://mishimay.github.io/71304f0aa2a313ad93ac/
<!--

## 準備
`Info.plist` に以下の設定を追加。

```xml
	<key>NSSpeechRecognitionUsageDescription</key>
	<string>[音声認識使用に関する説明]</string>
	<key>NSMicrophoneUsageDescription</key>
	<string>[マイク使用に関する説明]</string>
```

## コード
```swift
import UIKit
import Speech

class ViewController: UIViewController {

    private let speechRecognizer = SFSpeechRecognizer(locale: Locale(identifier: "ja-JP"))!
    private var recognitionRequest: SFSpeechAudioBufferRecognitionRequest?
    private var recognitionTask: SFSpeechRecognitionTask?
    private let audioEngine = AVAudioEngine()

    override func viewDidLoad() {
        super.viewDidLoad()

        requestRecognizerAuthorization()
        try? start()
    }

    private func requestRecognizerAuthorization() {
        SFSpeechRecognizer.requestAuthorization { (authStatus) in
        }
    }

    private func start() throws {
        if let recognitionTask = recognitionTask {
            recognitionTask.cancel()
            self.recognitionTask = nil
        }

        let audioSession = AVAudioSession.sharedInstance()
        try audioSession.setCategory(.record, mode: .measurement, options: [])
        try audioSession.setActive(true, options: .notifyOthersOnDeactivation)

        let recognitionRequest = SFSpeechAudioBufferRecognitionRequest()
        self.recognitionRequest = recognitionRequest
        recognitionRequest.shouldReportPartialResults = true
        recognitionTask = speechRecognizer.recognitionTask(with: recognitionRequest) { [weak self] (result, error) in
            guard let `self` = self else { return }

            var isFinal = false

            if let result = result {
                print(result.bestTranscription.formattedString)
                isFinal = result.isFinal
            }

            if error != nil || isFinal {
                self.audioEngine.stop()
                self.audioEngine.inputNode.removeTap(onBus: 0)
                self.recognitionRequest = nil
                self.recognitionTask = nil
            }
        }

        let recordingFormat = audioEngine.inputNode.outputFormat(forBus: 0)
        audioEngine.inputNode.installTap(onBus: 0, bufferSize: 1024, format: recordingFormat) { (buffer: AVAudioPCMBuffer, when: AVAudioTime) in
            self.recognitionRequest?.append(buffer)
        }

        audioEngine.prepare()
        try? audioEngine.start()
    }

    private func stop() {
        audioEngine.stop()
        recognitionRequest?.endAudio()
    }

}
```

## 環境
Xcode 10

```
Apple Swift version 4.2 (swiftlang-1000.11.37.1 clang-1000.11.45.1)
Target: x86_64-apple-darwin18.2.0
```

## 参考
- https://qiita.com/shu223/items/ca8e62803e83e396c177
- https://dev.classmethod.jp/smartphone/iphone/try-ios10-speech-recognizer/


-->
php-master-changes 2019-01-27

今日はコンパイラで使う用に zend_is_variable_or_call() を足してコード整理する修正があった！

# 2019-01-27
## rjhdby: zend_compile.c: zend_is_variable(). Removed unnecessary checks. Naming according to internal logic.
- https://github.com/php/php-src/commit/3a0fc00424e59345d67c1f2ab866495ecf601b11
- 内部用に zend_is_variable_or_call() を足してコンパイラのコード整理
php-master-changes 2019-01-25

この日は不要コードの削除、エンジンのクラッシュする系バグの修正、SeekableIterator::seek() の引数にドキュメント通り int の型宣言の付与、メモリの peak usage の扱いを修正、分割された TLS レコードの処理で無限ループに入るケースがある問題の修正があった！

# 2019-01-25
## nikic: Remove unused prototype in mbstring
- https://github.com/php/php-src/commit/24085b187a7505aacb5bd76372f1522226656dd3
- ext/mbstring で、不要な関数プロトタイプ宣言を削除

## dstogov: Fixed crash
- https://github.com/php/php-src/commit/0ff71aead12bbc2e7dc57f00f7860a6ffdccea4d
- ext/opcache で、プロパティ情報を見るのにクラッシュする場合がある問題の修正

## nikic: Fixed bug [#77498](https://bugs.php.net/bug.php?id=77498)
- https://github.com/php/php-src/commit/f78e681428a368930860162a1ea9b23b1a07666f
- [7.3~]
- 拡張で静的プロパティを持つクラスを定義し、ユーザコードで継承するとクラッシュする問題の修正、かな

## nikic: Fixed bug [#77518](https://bugs.php.net/bug.php?id=77518)
- https://github.com/php/php-src/commit/909d0a3d786118e0b1105288f6b88231e6697815
- ext/spl で、[`SeekableIterator::seek()`](http://php.net/manual/ja/seekableiterator.seek.php) の引数にドキュメント通り int の型宣言となるよう修正
- これまでは実装クラスで int の型宣言を付けると TypeError だった

## dstogov: Don't hide real peak usage.
- https://github.com/php/php-src/commit/662243cb30edc27b7e3ce8f9c893311f768caa79
- メモリ使用量の peak usage で本来の最大使用量と違う値を入れている箇所があったのを修正

## valga: Add a test for fragmented SSL packets
- https://github.com/php/php-src/commit/0c84c2ef503a531b43fa5f0f6b30e0d220c72e28
- [7.2~]
- ext/openssl で、分割された SSL パケット用のテストを追加

## bukka: Update and integrate openssl client proxy test
- https://github.com/php/php-src/commit/d9b29029f9793ffdefbd575dd26cc54c78c0a1cf
- [7.2~]
- ext/openssl で、クライアントプロクシのテストを統廃合

## bukka: Fix bug [#77390](https://bugs.php.net/bug.php?id=77390) (feof might hang on TLS streams in case of fragmented TLS records)
- https://github.com/php/php-src/commit/dc2ffdeed7d5c17eeb4f706f530eccafb425f92a
- [7.2~]
- ext/openssl で、分割された TLS レコードの処理で無限ループに入るケースがある問題の修正
- [PR:3729](https://github.com/php/php-src/pull/3729) の奴
WSLでvue-cli3 + electron

ふとelectronに手を出そうと思ったらドつぼにハマったので記録として残しておきます。結果を書くと先人たちのブログとディスカッションを読んで解決しました。
※ Win版のbuildに失敗していますが、おそらくwineが必要っぽい？すぐにbuildの必要が無いので解決したら後ほど追記します。

---

私は普段WSL上でvue.js(typescript)で開発しています。electronを触ってみたかったので、vue.js(vue-cli3) + WSLで環境構築してみました。

vueのelectronプラグインとして`vue-cli-plugin-electron-builder`を利用しています。

 [nklayman/vue-cli-plugin-electron-builder](https://github.com/nklayman/vue-cli-plugin-electron-builder)

# WSLのGUI環境を構築
electronはデスクトップアプリケーションなので、GUI環境が必要です。wsl上で以下をインストールします。

```sh
$ sudo apt-get install libgtk-3-dev libxss1 libnss3-dev libasound2 x11-apps x11-utils x11-xserver-utils fonts-ipafont
```

Windows側にX Serverを構築するので、環境変数`DISPLAY`に以下を代入します。
これは`~/.bashrc`なり`~/.zshrc`なりのシェル設定ファイルに記載して下さい。

```
export DISPLAY=localhost:0.0
```
# WindowsにX Server環境を構築
こちらから`VcXsrv`をインストールしました。
https://sourceforge.net/projects/vcxsrv/

# vueプロジェクトを作成
vue-cli3でのプロジェクト作成は省きます。
プロジェクトを作成したら、以下のコマンドでelectronのプラグインを追加します。

```
$ vue add electron-builder
```

プラグインを追加したら、サーバを立ち上げます。
これは`sudo`しないと失敗します。

```sh
$ sudo yarn electron:serve
```

できました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/16535/aef31d3c-a0d9-5831-5872-e8dcdc76a592.png)

# 以下作業ログ
## ライブラリのインストール
```
$ vue add electron-builder
$ yarn electron:serve
```

ライブラリが無いとエラーが発生。
※以降しばらく依存解決を行う。

### libgtk-3.so.0

```
error while loading
shared libraries: libgtk-3.so.0: cannot open shared object file: No such file or directory
```

```sh
$ sudo apt-get install libgtk-3-dev
```

### libXss.so.1
```
error while loading
shared libraries: libXss.so.1: cannot open shared object file: No such file or directory
```

```
$ sudo apt-get install libxss1
```

### libnss3.so
```
error while loading
shared libraries: libnss3.so: cannot open shared object file: No such file or directory
```

```
$ sudo apt-get install libnss3-dev
```

### libasound.so.2
```
error while loading
shared libraries: libasound.so.2: cannot open shared object file: No such file or directory
```

```
$ sudo apt-get install libasound2
```

## X Server
```
(electron:21834): Gtk-WARNING **: 22:13:07.994: cannot open display:
```

なんだこのエラー…と調べたらどうもGUIの設定がされていないというエラーのようです（そりゃそうだ）。

electronの元となっているchromiumのディスカッションで同じ質問をしている人が居て気づく。

[Lanuching chromium-browser on Centos throws: Gtk-WARNING **: cannot open display](https://groups.google.com/a/chromium.org/forum/#!topic/chromium-dev/E0BJplS2v1w)

以下のサイトを参考に`VcXsrv`をインストール。

[Windows Subsystem for Linux (WSL) で Electron](https://www.kame-tech.com/blog/2018-10-23-windows-subsystem-for-linux-wsl-%E3%81%A7-electron/)

```
sudo apt-get install x11-apps x11-utils x11-xserver-utils fonts-ipafont
```

```sh
export DISPLAY=localhost:0.0
```

```sh
$ sudo yarn electron:serve
```

できた。

※ buildできたら追記します。
php-master-changes 2019-01-24

この日は switch をジャンプテーブルにコンパイルする最適化を無効にするフラグの追加、ドキュメントの更新、FastZPP のマクロで error_code を _error_code にする修正のリリースブランチでのリバート、ext/standard のサブモジュール初期化失敗時の挙動変更、interned strings のハッシュテーブル初期化タイミング修正、strip_tags() に許可タグを配列で渡せるようにする修正があった！

# 2019-01-24
## nikic: Add flag to disable jumptable optimization
- https://github.com/php/php-src/commit/526344aa5ee3190b754e3678e0c71b0d7f272876
- [7.2~]
- switch をジャンプテーブルにコンパイルする最適化を無効にするフラグの追加
- カバレッジ上げるのに使える

## cmb69: Fix README.RELEASE_PROCESS
- https://github.com/php/php-src/commit/d7480bda767e14ded6822849e1769afd7fd58c1c
- README.RELEASE_PROCESS の Web でのリリース告知について、マイナーバージョンの RC 版ではスキップするよう修正

## cmb69: Improve wording
- https://github.com/php/php-src/commit/6f3880c62f0f87f9396b215e36c5eb228ab5711f
- NEWS の「バージョン上げました」の「上げました」の単語で lifted 使ってたところを raised に修正

## nikic: Revert "Prefix error_code with underscore in FastZPP implementation"
- https://github.com/php/php-src/commit/cce2e33c846b8653d589a680bdf83a6f8409ecd9
- [7.2~]
- [先日の修正](https://qiita.com/sj-i/items/789a0057f4b9316f01e3#twose-prefix-error_code-with-underscore-in-fastzpp-implementation)でアンダースコア付けたら ext/uv が壊れたらしいので、リリースブランチからはリバート
- master ではアンダースコア付いてる状態

## dstogov: Disallow PHP startup, in case some ext ext/standard sub-module is not initialized sucessfully.
- https://github.com/php/php-src/commit/ab9a9a6b20a3b435049a90a0681ed58fbe8f3de6
- ext/standard のサブモジュールが初期化失敗した際に PHP を起動しないよう修正

## dstogov: Delay hash table allocation
- https://github.com/php/php-src/commit/f80b1b0c5693d7d86d76f4d28d6d81fb345d75e1
- interned strings のハッシュテーブル初期化を遅延させるよう修正

## Andreas Treichel: Allow strip_tags with an array of allowed tagnames
- https://github.com/php/php-src/commit/b1e9c73b2777b802925bcdcec6d7012b6d98f1cb
- [strip_tags()](http://php.net/manual/ja/function.strip-tags.php) で、許可するタグをタグ名の配列で渡せるよう修正
- `['p', 'a', 'script']` みたいに書ける奴
世界で一番簡単に幸せになる方法。それは太陽の光を浴びること。本当の幸福を感じてる？重要なのは、お金か、社会的成功か、自己啓発か、アウトプット学習か、自己投資家、株式投資か。自然を忘れた人間が生きるための、必要なもののすべてより。愛を込めて。

世界で一番簡単に幸せになる方法。それは太陽の光を浴びること。本当の幸福を感じてる？重要なのは、お金か、社会的成功か、自己啓発か、アウトプット学習か、自己投資家、株式投資か。自然を忘れた人間が生きるための、必要なもののすべてより。愛を込めて。


# 今、マクドナルドに、iPhoneを充電しに立ち寄っている。運良く左端の席が空いて、iPhoneの音声入力でツイートを続けていた。本当に幸福な感じがあった。その一つの理由は、太陽の光が差し込んでいたからだ。ぬくぬくとたら、暖かかった。 https://t.co/dXP99B2Ppe

そして今、太陽の光はビルに隠れて見えなくなってしまった、ほんのつかの間の、ただひたすら暖かい時間だった。冬だけれど、外のように寒くもなく、なおかつ太陽浴びられる最高の瞬間だった。iPhoneも充電できているし。iPhoneに太陽、自分自身の目にも太陽。

このように、本当に素晴らしい時間と言うのは、スターバックスにいても、マクドナルドにいても、実は太陽の光を浴びている時だったと言うことが、記憶から思い出される。スターバックスで最高に、MacBook Airのキーボードを叩いて幸福だった時も、それは太陽の光が差し込んできた時だった。

だけど、外の世界に入ると、デジタルのデバイスは触りづらかったり、テーブルもなかったり、冬だと寒かったりするので、なかなか難しい。建物の中にいて安全安心、口調も素晴らしく、なおかつ自然の光を感じられる、これは人類にとって最高の環境のような気がした。

# 本当に人間にとって優しい、太陽の光を止め込める、そんな環境が必要だ。僕たちはビルの陰に隠れて、自然的なものの全てを忘れてしまっているから、それがどんなにありがたいかものか、どんなに幸福感を運んできてくれるかを、感覚として完全に忘れてしまっている。

太陽の光が差し込んできて、それがビルにかけてエステなくなったときに、初めて、幸福をもたらしてくれていたものは、自然的な太陽の光だったのだと理解できる。体験してみなければわからない。人間は色々と幸福のために努力をするけれど、それは、本当は、ヒノヒカリを浴びるだけで90%ぐらい

解決するのかもしれない。自然的なもの、太陽の光、切実に必要だけれど、人間が忘れているもの。これは思想的な話ではなくて、生物学的に、人間は体を必要としているのだ。人工の光では暖かさもなく、なかなか難しいかもしれないが、もしかしたら再現もできるのかも。

僕は、いろいろな本を読んできて、最近の科学的研究に基づいた、幸福を現実的に、データ分析の結果として実現する、読みやすい本を読んできて、人間にとって切実に必要なものが、ある程度理解はできているけれど、日常生活の中で完全にいかせているかというとそうでもない。

特にMacBookやiPhoneでアウトプットすることに集中していた最近は、デジタルの世界にどっぷりとつかっていた。だけどデジタルやネットワークの世界に飛び込むにしても、僕らは人間の体を持っているのだから、その幸福感を高めるものは、生物回路太陽の光なのだ。

# そしてiPhone 音声入力でしゃべっていると、ブラインド音声入力にも慣れてきたし、街を行き交う人々を見ながら音声入力をすることさえできる。これが素晴らしくて、僕らの女と言うものは、そもそもディスプレイを見るようにはできていないかもしれないのだから。

技術的に進歩したデバイスは素晴らしい。Twitterでつながることも素晴らしい。だけどそれは、僕らが太陽の光の下にいたり、人間的に本当に幸福な環境の中ですることができれば、その素晴らしさは、何十倍にも何百倍にも感じられる気がした。

少なくとも僕らは今のところ、人間の肉体と言うデバイスを超越することはできないのだから、いつか脳みそがデジタルの膨大な.に置換される時まで、どうやら僕らには、本当に情報量が言ったかな、自然界の太陽の光と言うものは必要みたいだ。人間の幸福には、とても必要だ。

世界で一番簡単に幸せになる方法。それは太陽の光を浴びること。本当の幸福を感じてる？重要なのは、お金か、社会的成功か、自己啓発か、アウトプット学習か、自己投資家、株式投資か。自然を忘れた人間が生きるための、必要なもののすべてより。愛を込めて。 https://t.co/87Um1g9YSo

![image](https://user-images.githubusercontent.com/13635059/51808644-e531bb00-22d9-11e9-87c1-629b6402adbc.png)








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
人間の幸福のために科学や技術が役立てられる時代。iPhoneの音声入力で、僕は自然な人間生活のための、デバイスの未来を感じる。スターバックスやマクドナルドにいながら、ディスプレイを見ずに、スマホゾンビにならず、街行く人々を見ながらTwitterもできる。妻と観光旅行だってできる。素晴らしさ。

iPhone音声入力の素晴らしさについて、また語りたい。今日も友達と話していて、iPhoneの音声入力について熱く語っていた。あまりにもキーボードやフリック入力と勝手が違うので、すぐにやめてしまう人も多いと思う。だけどこの素晴らしさを、僕はどんどん見つけている。今日も1つ発見した。

# iPhoneの音声入力をしていると、例えばマクドナルドや、スターバックスなどのカフェで、前を見ながらテキストを入力することができる。と言う事は、例えばにかいの席に座っていれば、街行く人々を見つめながらTwitterを楽しめたりする。

これが本当に素晴らしい。マクドナルドであれば、誰も、iPhoneの音声入力でぶつぶつしゃべっていても気にしないし、太陽の光が差し込んできたりしたら、さらに幸福感に包まれる。

そもそも、フリック入力やキーボード入力など、声を使わない入力と言うのは、人間の原始生活から考えると、とても不自然だ。

# 人間のメッセージの成り立ちを考えよう。言葉と言うものの成り立ちを。まずは動物的な鳴き声が存在した。次にそれが、声の言葉になった。そして象形文字に。そしてピンクのしみになった。

ピンクのシミじゃない、インクのシミだ。ピンクのシミは何か怪しげな感じがするので、想像してはいけない。

このように文字変換に多少難しいところはあるものの、音声入力と良い友達になりさえすれば、この子は本当に良い子で、最初は難しいけれど、だんだん味わいが出てくる、とてもかわいい恋人みたいな感じ。

閑話休題。コツはやはり、Twitter 140文字位の文章量を一気に入力すること。それで、ネットワーク越しに部署の解析が働いて、なんとか意味の通る変換をしてくれるようになる。逆に、すごく短いテキスト入力には向かない。

そもそも、人間のおしゃべりと言うのものは、膨大な文章量を持つものなのだから、おしゃべりで喋るには、ものすごく向いているインターフェイスだと思う。1つのインターフェイスには長所も短所もある。だけど長所がものすごく大きい。

またまた閑話休題。iPhoneの音声入力で語っていると、本当におしゃべりをしているだけで入力が進むので、自分がデバイスを持っていないかのように過ごすことができる。例えば、妻との観光旅行の最中にも、iPhoneの音声入力でツイートしていたほどだ。目の前の白髪、ブロックされないのが素晴らしい。

# 今後、デバイスはウェアラブルのような、人間生活にもっと自然にフィットしたものになっていくと思うけれど、iPhoneを片手に音声入力をするのは、現時点でかなり自然な人間生活を後押ししてくれる感じがする。まだまだ不完全な部分はあるけど。

やはりここでも、人間が自然的な生活を送るために、デバイスと言うものは、恐ろしいほど発展途上だし、恐ろしいほどに不完全なものであると言う見地に立つべきだな。

これが10年前であれば、デバイスや技術が、科学技術も、人間の幸福に役立たないんじゃないかと言う理論があったのだけれど、そうじゃない。

科学や技術が人間の幸福に役立たないのではなくて、単に僕たち人類が、幸福のために科学や技術を役立ててこなかっただけだ。目的が違ったのだ。戦争するために技術を使っていたのだから、以前の人類は。

そして人間は試行錯誤を経て、ほんの少しずつ、技術や科学といったもの、人間本来の幸福に役立て始めているような気がする。気がすると言うより、そうらしい。

# そして僕はiPhoneの音声入力を、自然な人間生活を送るためにどうしても必要なものだと言う、そういった位置づけで考えている。ほとんどディスプレイを見なくてもいい。恋人にかたりかけるかのように、休日の素晴らしさを犠牲にせず、Twitterもできる。

人間の幸福のために科学や技術が役立てられる時代。iPhoneの音声入力で、僕は自然な人間生活のための、デバイスの未来を感じる。スターバックスやマクドナルドにいながら、ディスプレイを見ずに、スマホゾンビにならず、街行く人々を見ながらTwitterもできる。妻と観光旅行だってできる。素晴らしさ。 https://t.co/zzuTpuvOuQ
![image](https://user-images.githubusercontent.com/13635059/51808625-ad2a7800-22d9-11e9-978a-7005887a1305.png)








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
PhpStorm  で JavaScript をデバッグする設定

PhpStorm で JavaScript をデバッグすることができます。(PhpStorm に限らず JetBrains の IDE なら)
条件付きのブレークポイントも設定できますので便利です。

追記: 以前に投稿したものから設定方法が変わりましたので記事を修正しました。

## 手順

以前は Chorome の拡張機能や PhpStorm のプラグインのインストールが必要でしたが、今は必要ありません。

- プラグインの確認
- デバッグの設定をします
- デバッグします

## プラグインの確認

次のプラグインが有効になっていることを確認します。（デフォルトで有効だと思います）

- JavaScript and typeScript
- JavaScript Debugger

## デバッグの設定をします

- メニューから Run > Edit Configrations... を選択します
- `+` ボタンをクリックします

![figure1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3788/b1abe633-51fa-bcbb-a0bb-938d9243c5d0.png)

- 表示されたプルダウンメニューから JavaScript Debug を選択します

![figure2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3788/b2abe369-26b2-98e7-3fa2-19a595e57b21.png)

- Name: 欄に名前をつけて、URL: 欄に実行される URL を入力します
    - 図の場合は React のプロジェクトを `npm start` で実行させた時のイメージです。プロジェクトの環境に合わせてください。
- *OK* ボタンで保存します

## デバッグします

- PhpStorm でデバッグしたいプロジェクトを開きます
- JavaScript のコード上で停止したい場所にブレークポイントを設定します

![figure3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3788/224445b6-5330-8a86-afa4-b5a69aa9ec7e.png)

- `npm start` などで開発サーバーを起動します
- PhpStorm のツールバーの右上にあるセレクトボックスで、先ほど設定したデバッグ定義を選択します
- 次に、その右側にある、赤い虫のマークをクリックします
- すると Chrome のウィンドウが開き対象のページが表示されます
- この状態で、ブレークポイントのある部分が実行されたら止まってくれます

## Storybook でもデバッグできます

Storybook を使ってコンポーネントを開発している時にも、デバッグすることが可能です。

- `http://localhost:6006/` でデバッグ定義を作成します
- JavaScript のコード上で停止したい場所にブレークポイントを設定します
- `npm run storybook` を実行して Storybook を起動します
- デバッグ定義を選択して、デバッグボタンを押します

## 参考文献

- 公式: [Debugging JavaScript in Chrome](https://www.jetbrains.com/help/phpstorm/debugging-javascript-in-chrome.html#ws_js_debugging_chrome_before_you_start)
旧版knoppixをK550Cで動かしたときの備忘

DVD版をダウンロードして動かした。
なんとか動いたというだけで全然快適ではない
HDDからのファイル救出には使えるかもしれない

でも、それならDVD版でなくCD版で十分（笑）

boot:knoppix64 no3d

このように指定して起動しないと全く動かない

Live DVDがあった場所
http://quma.cdb.riken.jp/top/prevDownload_j.html
7.02　日本語版　4GB
エンジニアの仕事論。もし就職、転職するならどんな会社？給与や待遇以外にも10項目ぐらい書き出してみない？セルフチェック。就職の心理的ジャーナリングみたいな？



# 僕の例

- アウトプットに理解があること、アウトプットこそ最大の学習法であると理解していること
- 業務中の基礎的な勉強に理解があること、エンジニアは斧を研がなければ腐ってしまうと理解していること
- 私服okなこと、服装に自由なこと、スーツを着ると死んでしまうので
- 会社で自分のスマホを充電できるところ、これができないようなところは社内ルールが厳しくてやばそう
- 給与がちゃんと上がっていくこと、社員に正当な評価をして、納得感のあるマネージメントをしていること‥あ、給与のことも書いてしまった
- 会社の雰囲気が良いこと、チーム同士が協力して働いていて、笑顔があること
- 昼休みに眠ることができること、ヨガが出きればなお良い、社員のエネルギー資産の管理に対して理解があること
- クローズドなオフィス環境があること、少人数で働ける部屋があれば良い、人間の集中力管理に対して理解があること
- 出る杭が叩かれないこと、馬鹿なことをするのが許されること、強い自己抑圧が求められないこと
- 面白いことを最大化する社風があること、言葉だけの空々しいやつではなく、自分自身がコミットできる面白さが流れていること

# 意外と出てくるもんだ

こうやって考えると、給与や待遇以外の無数の要素が出てくることに気づく。
その重要さのパーセンテージはいかがなものか。

もしかしたら、今いる会社がこのうちの7割ぐらいは満たしていて、給与待遇だけにフィルタされた世界に釣られて他社を選ぶと、7割ほどの幸福が失われてしまうという可能性もある。

# 今の会社に必ずとどまれという話ではない。

ゼロベースで考えた方がうまくいくということ。想像は難しい部分もあるだろうけれど。

世間では転職を考えたとき、転職すべし、せざるべしという二択で叫びがちだけれど、なぜ会社の数なんて何万とあるのに、二択式なのか。

会社員のコンテキストも境遇も、ヒストリーも様々で広大に複雑であるはずなのに。

だけど自分の魂が求めるものを書き出してみれば、答えは見つかりやすくなるのではないだろうか。

これなくなったら困るな、これ本当に苦しいな、これ実は嬉しいよね、とかいうことを書き出してみよう。

# ところで、自己洞察力を高めるにはマインドフルネス。








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
機械学習論文読みメモ_154

[Recurrent Slice Networks for 3D Segmentation of Point Clouds](Recurrent Slice Networks for 3D Segmentation of Point Clouds)
Point cloudは三次元データの効率的な表現である。
しかしこのデータに対する三次元セグメンテーション手法は
局所的な依存関係を考慮しないか、高い計算コストを要求する。
本論では新たな三次元セグメンテーション手法としてRSNetを提案する。
RSNetは局所関係性のモデルを持つ。
これは新たに提案するslice pooling/unpooling layerとRNNの組み合わせで
成り立つ。
slice pooling layerは非順序的なpoint cloudを順序的な特徴シーケンスへ変換する。
これによりRNNが適用可能になる。

[CodeSLAM -- Learning a Compact, Optimisable Representation for Dense Visual SLAM](https://arxiv.org/abs/1804.00874)
3D perceptionにおいて、リアルタイムなgeometryの表現はいまだ重要な問題である。
従来手法においては、dense mapは対象の表面的構造を完全に捉える事が可能で、かつ
semantic labelを使った拡張も可能だが、計算量はメモリ消費などで課題がある。
一方sparse feature based representationはそうした計算量やメモリの問題を回避できるが、
目の前のシーンの一部しか捉えられず、基本的に自己位置推定のみに使われる。
本論ではコンパクトなdense representationを提案する。
この表現は、画像の輝度情報によって条件付けられた少量のパラメータで特徴づけられる
codeで成り立つ。
この手法は画像から深さ推定を行う手法や、autoencoderにインスパイアされている。
提案手法はkeyframe based monocular dense SLAMのアプローチの中で使うのが合っている。
つまり、keyframe毎にcode特徴より深さを予測し、これはpose変数と他のkeyframeとのoverlap部
との一貫性において最適化される。
depth mapを用いた条件付けにより、学習されたcode特徴は局所的な幾何構造のみを表現する事を可能にする。

[MaskRNN: Instance Level Video Object Segmentation](https://arxiv.org/abs/1803.11187)
instance levelのvideo object detectionは重要なタスクである。
本論ではRNNに基づいた手法を提案する。
この手法は各フレーム事に２つのネットワークを適用した出力をRNNで
つなぐことで推論を行う。
この２つのネットワークはmaskingを行うbinary segmentationと
物体のbounding boxを推定するlocalization networkである。
RNNにより時間方向の関係性を考慮した外れ値除去が可能になる。
TypeScriptをお勧めしたい7つの理由


#お勧めしたい理由

##　1 新しい文法を使っても古い環境で動作させることができる

　私の場合、GoogleBotが認識できるJavaScriptが前提なので、おのずと使える機能はES5に制限される。その範囲ではclassすら使うことはできない。しかしTypeScriptを用いれば、classだろうが継承だろうがやりたい放題だ。事前にやるべきことは出力ターゲットの指定だけだ。


##　2 型チェックが強力で柔軟

　変数に型を付けることができるので、ちょっとしたミスが起きにくくなる。TypeScriptの凄まじいところは、可能性のある型をすべて記述できることだ。送られてくるデータが「数値」、もしくは「文字列が入った配列」など、可能性を事細かに指定できる。さらにif文で型チェックを入れておくだけで、文法チェックの段階で型を確定してくれるのだ。わざわざキャストする必要もない。これはかなりヤバイ。

##　3 入力補完が利用できる

　様々なAPIを利用していると、開発中に細かいメソッド名を失念することは多い。そのたびに正確な名前を調べに行くのは時間の浪費だ。VSCodeなどの対応環境とTypeScriptであればそんな無駄はおこらない。さらに引数についても教えてくれる。JSDocでコメントが入っていれば、ドキュメントを読みに行く必要もない。

##　4 DOMのイベントは最初から型定義されている

　addEventListenerなどで追加するイベント処理、受け取ったハンドルの中身を完全に覚えている人は少ないと思う。TypeScriptの恐ろしいところは、イベントごとの定義があらかじめ用意されているところだ。「addEventListener('click',e=>{})」とやったら、eのメンバが入力補完の対象となる。

##　5 npmでType定義をインストールすれば、WebAPIも入力補完やエラーチェックの対象となる

　例えばGoogleのAPIを使いたいと思ったとき、npmなどを使い追加で定義パッケージをインストールすれば、APIの命令や引数、その型に至るまで、全てが入力補完の対象だ。型チェックも効くので、変なデータを入れようと思ったら、文法チェックの段階で引っかかる。開発時の迷いは発生しない。有名どころのAPIは大抵用意されている。

##　6 jsに変換されてもtsでトレースできる

　.ts(TypeScript)をトランスコンパイルして.js(JavaScript)を生成する。当然、それぞれは別のファイルだ。このときmapファイルというのを生成できる。tsとjsの対応関係が入ったデータだ。出力されたjsにはこのマップファイルとの関係がコメントの形で挿入されている。ブラウザで実行されるのはjsなのだが、ブラウザはこのマップファイルを読み込んでくれる。ブラウザの開発コンソールでデバッグを行うと、そこに表示されるのはtsのコードなのだ。この機能はIE11ですら対応している。デバッグをする部分に死角はない。

##　7 ソースコード中に型が書けるので、ドキュメントを作るのが簡単

　JavaScriptでメソッドのコメントを作る際、引数の型などはコメント入力時に書くことになる。TypeScriptなら最初から型が入っているので、コメント生成用のプラグインを入れておけば、型が入力済みの状態でコメントを書くことができる。コーディングの際、コメントを書くというのは気の重い作業なのだが、書く分量が減るというのはとてもありがたい。気力を削がれずに済むのだ。


# 導入に当たっての壁
　1 TypeScriptの環境構築のためNode.jsのインストールが必要
　2 npmなどのパッケージマネージャで必要なモジュールをそろえる必要がある
　3 tsconfig.jsonの設定方法の理解とディレクトリ構成を整える部分
　4 既存のJavaScriptのコードで型がらみのエラーを吐きまくる可能性
　5 WebAPIの型定義のモジュールを探す手間
　6 特に使うことは必須では無いが、モジュールバンドラの知識(使わないという選択も含めて)

　5番までの範囲でTypeScriptを使う限り、拡張JavaScriptのような感覚で便利に利用できる。ただし、そこから先に進むのは混沌とした世界が待ち受けていることを覚悟して欲しい。ちなみにモジュールバンドラに関して、私は使わないという選択をした。

# まとめ

　バックエンドには様々な言語の選択肢があるが、フロントエンドに関しては実質的に素のJavaScriptを使うか、TypeScriptを使うかという選択肢しかない。
　TypeScriptを使用することによるメリットは非常に大きい。まだ導入していないというのなら、ぜひ使ってみて欲しい。
洞窟の自動生成(ローグライク穴掘り法)💀

# 💀洞窟を創造する💀

[![rlcave.gif](https://qiita-image-store.s3.amazonaws.com/0/213065/138ca7dd-aadf-f4c4-7720-edd5fbd7e11d.gif)](https://github.com/Kasugaccho/DungeonTemplateLibrary)

今回は洞窟をつくります。

# 💀ローグライクのおさらい💀

### [>> [DTL]ローグライク(穴掘り法)💀](https://qiita.com/Gaccho/items/253cb6af577ec11e79cf)
以前作ったローグライク穴掘り法のアルゴリズムを使用します。
詳しくは[前回の記事](https://qiita.com/Gaccho/items/253cb6af577ec11e79cf)をご参照ください。

[![rl4.gif](https://qiita-image-store.s3.amazonaws.com/0/213065/ef26da46-6444-e757-3e02-f96d3de1e4b9.gif)]((https://qiita.com/Gaccho/items/253cb6af577ec11e79cf))

# 💀手順💀

**1. ローグライク穴掘り法でローグライクダンジョンの生成**
**2. 1以上の数値と0の数値で2値化する**
**3. ノイズを加えて洞窟っぽくする**

こんな感じでいきます。

# 1.ローグライク穴掘り法でローグライクダンジョンの生成

[前回の解説記事](https://qiita.com/Gaccho/items/253cb6af577ec11e79cf)の時に作った**"RogueLike関数"**を使用します。

```cpp:生成
int main() {
	std::array<std::array<std::uint8_t, 64>, 32> matrix{ {} };
	dtl::RogueLike<std::uint8_t> d(matrix, 20);
}
```

![rl.gif](https://qiita-image-store.s3.amazonaws.com/0/213065/28d389da-7bf1-20f3-e99f-638c417f22e7.gif)

# 2. 1以上の数値と0の数値で2値化する

```cpp
dtl::RogueLike<std::uint8_t> d(matrix, 20);
dtl::dungeonBinarization(matrix_, 1);
```

|ID|名前|色|
|:---|:---|:---|
|0.|外壁|**<font color="#2363b2">■■</font>青<font color="#2363b2">■■</font>**|
|1.|内壁|**<font color="#cccbce">■■</font>白<font color="#cccbce">■■</font>**|
|2.|部屋|**<font color="#359e44">■■</font>緑<font color="#359e44">■■</font>**|
|3.|玄関|**<font color="#352c44">■■</font>黒<font color="#352c44">■■</font>**|
|4.|通路|**<font color="#a79f45">■■</font>黄<font color="#a79f45">■■</font>**|

1以上の数値を1に変えます。

![rlcave_no.gif](https://qiita-image-store.s3.amazonaws.com/0/213065/c8b6a51d-d3ce-9650-e818-dcb3d8fa0dd4.gif)

ほんの少し洞窟みが出てきました。

# 3. ノイズを加えて洞窟っぽくする

このままだとあまり洞窟っぽくないのでノイズを加えます。

```cpp
dtl::RogueLike<std::uint8_t> d(matrix, 20);
dtl::dungeonBinarization(matrix_, 1);
dtl::noiseShoreBothBool(matrix_, 0.1);
```

# 💀完成💀

無事に実装できました。

[![rlcave.gif](https://qiita-image-store.s3.amazonaws.com/0/213065/138ca7dd-aadf-f4c4-7720-edd5fbd7e11d.gif)](https://github.com/Kasugaccho/DungeonTemplateLibrary)

# [💀実装ライブラリ(ソースコード)💀](https://github.com/Kasugaccho/DungeonTemplateLibrary)

今回解説した洞窟の自動生成は**["Dungeon Template Library"](https://github.com/Kasugaccho/DungeonTemplateLibrary)**に**["RogueLike Cave"](https://github.com/Kasugaccho/DungeonTemplateLibrary/blob/master/README.md#17-roguelike-cave-v0125)**として実装されています。
ぜひ、活用してみてください！

[![logo640.gif](https://qiita-image-store.s3.amazonaws.com/0/213065/b84a7834-2042-6704-fbbe-782a31f06091.gif)](https://github.com/Kasugaccho/DungeonTemplateLibrary)


#💀ソースコードのライセンス💀

These codes are licensed under CC0.
[![CC0](https://mirrors.creativecommons.org/presskit/buttons/88x31/svg/cc-zero.svg "CC0")](http://creativecommons.org/publicdomain/zero/1.0/deed.ja)

この記事のソースコードはCC0ライセンスとします。
ぜひ、自由に改変して遊んでみてください。

**最後までお読みいただきありがとうございました！**
Javaで開発したWebアプリケーションをJenkinsを使って自動デプロイする[SpringBootアプリ編]

CI/CDを実践するため、JenkinsでArtifactsを生成してアプリケーションサーバーにデプロイする所まで設定してみました。

ソースコードとサーバー構築はこちらの[準備編](https://qiita.com/kazokmr/items/850c4cc86d6eac8fe72f)に書いてあります。
Tomacatサーバーへの自動デプロイしたい場合は[Tomcatアプリ編](https://qiita.com/kazokmr/items/853098ba49889cc18abf)を参照

# Jenkinsのジョブの流れ[^1]

1. ソースコードをチェックアウトする
2. Mavenでビルドを実行しjarファイルを出力する
3. jarファイルをJVMサーバーに転送する
4. jarファイルを実行する

## ソースコードをチェックアウトする

**ソースコードも管理**からGitを選び、準備編で用意した[Githubのリポジトリ](https://github.com/kazokmr/JavaWebAppDeploySample.git)をチェックアウトします。[^2]
branchは、*/master を指定します。

## Mavenでビルドを実行しjarファイルを出力する

**シェルの実行**を選び、`./mvnw`コマンドで実行します。

ビルドはmavenを使いますが、Maveタスクではなくリポジトリに含まれるMavenWrapperで実行します。
尚、リポジトリにはプロジェクトが2つあるため、カレントディレクトリをWebSpringBootに移動してから実行しています。

```bash
cd WebSpringBoot
./mvnw clean package
```
Mavenを実行すると、/WebSpringBoot/targetに、web-spring-boot.jar が生成されます。

## jarファイルをJVMサーバーに転送する

**シェルの実行**を選び、JVMサーバーにSSHで接続し、生成したArtifacts:web-spring-boot.jarを置きます。
また転送したjarファイルは以下の理由により、フルアクセス(rwx)にします。

- 継続的デプロイを行うため、ファイルの上書きを許可します。
- JVMサーバーのサービスから自己起動する[^3]ので、ファイルの実行を許可します。

```bash
# SCPコマンドでJankinsからJVMサーバーにjarファイルを転送する
scp -i ~/.ssh/id_rsa WebSpringBoot/target/web-spring-boot.jar jvm@192.168.33.20:/var/jvm
# 実行権限を付与する
ssh -i ~/.ssh/id_rsa jvm@192.168.33.20 sudo chmod 700 /var/jvm/web-spring-boot.jar
```

## jarファイルを実行する

**シェルの実行**を選び、JVMサーバーにSSHで接続してアプリケーションサービスを再起動します。
`ssh -i ~/.ssh/id_rsa jvm@192.168.33.20 sudo systemctl restart app`

Jenkinsのジョブ実行が成功すると、以下のURLからアプリケーションの実行が確認できます。
http://192.168.33.20:8080/

## ビルドの設定画面

![image.png](https://qiita-image-store.s3.amazonaws.com/0/160107/c324d2e2-d7d4-8058-2211-d07508e98c27.png)

## 参考

[Installing Spring Boot Applications(from Spring Boot Reference)](https://docs.spring.io/spring-boot/docs/current/reference/html/deployment-install.html#deployment-script-customization-when-it-runs)
[Spring Boot Reference Guide](https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/)

[^1]: 今回は敢えてコマンド実行でビルドとデプロイを行いたかったので**シェルの実行**タスクを利用しました。

[^2]: このリポジトリにはwar用の**WebSpringMvc**とjar用の**WebSpringBoot**の2つのMavenプロジェクトが含まれています。今回は/WebSpringBootを利用します。

[^3]: jarを実行可能にするには、spring-boot-maven-pluginのexecutable設定をtrueにしておきます
Javaで開発したWebアプリケーションをJenkinsを使って自動デプロイする[Tomcatアプリ編]

CI/CDを実践するため、JenkinsでArtifactsを生成してアプリケーションサーバーにデプロイする所まで設定してみました。

ソースコードとサーバー構築はこちらの[準備編](https://qiita.com/kazokmr/items/850c4cc86d6eac8fe72f)に書いてあります。
JVMサーバーへSpringBootアプリケーションを自動デプロイしたい場合は[SpringBootアプリ編](https://qiita.com/kazokmr/items/7decab715fdda083482e)を参照

# Jenkinsのジョブの流れ[^1]

1. ソースコードをチェックアウトする
2. Mavenでビルドを実行しwarファイルを出力する
3. Tomcatマネージャーを使ってwarファイルをTomcatサーバーに転送してデプロイする

## ソースコードをチェックアウトする

**ソースコードも管理**からGitを選び、準備編で用意した[Githubのリポジトリ](https://github.com/kazokmr/JavaWebAppDeploySample.git)をチェックアウトします。[^2]
branchは、*/master を指定します。

## Mavenでビルドを実行しwarファイルを出力する

**シェルの実行**を選び、`./mvnw`コマンドで実行します。

ビルドはmavenを使いますが、Maveタスクではなくリポジトリに含まれるMavenWrapperで実行します。
尚、リポジトリにはプロジェクトが2つあるため、カレントディレクトリをWebSpringBootに移動してから実行しています。

```bash
cd WebSpringMvc
./mvnw clean package
```
Mavenを実行すると、/WebSpringMvc/targetフォルダに、web-spring-mvc.war が生成されます。

## Tomcatマネージャーを使ってwarファイルをTomcatサーバーに転送してデプロイする

**シェルの実行**を選び、curlでTomcatのmanagerコマンドを実行して、warファイルをデプロイします。

```bash
# path=/appパラメータで、アプリケーションのコンテキストパスが指定できます
curl --upload-file WebSpringMvc/target/web-spring-mvc.war "http://admin:password@192.168.33.30:8080/manager/text/deploy?path=/app&update=true"
```

Jenkinsのジョブ実行が成功すると、以下のURLからアプリケーションの実行が確認できます。
http://192.168.33.30:8080/app/greeting

## ビルドの設定画面

![image.png](https://qiita-image-store.s3.amazonaws.com/0/160107/841b36c1-cc00-b61b-bc79-8ddb547b0144.png)

## 参考

[Configuring Manager Application Access](https://tomcat.apache.org/tomcat-9.0-doc/manager-howto.html#Configuring_Manager_Application_Access)

[^1]: 今回は敢えてコマンド実行でビルドとデプロイを行いたかったので**シェルの実行**タスクを利用しました。

[^2]: このリポジトリにはwar用の**WebSpringMvc**とjar用の**WebSpringBoot**の2つのMavenプロジェクトが含まれています。今回は/WebSpringMvcを利用します。
matplotlibで複数のグラフを表示するときのサイズを揃える

matplotlibでカラーバー付きのグラフやラインプロットの複数のグラフを表示するときに、グラフのサイズが揃わなかったのでその対処

例えばこんな感じでカラーバー付きのグラフとラインプロットを並べて表示すると

```python
from matplotlib import pyplot as plt
import numpy as np
from mpl_toolkits.axes_grid1 import make_axes_locatable

data1 = np.random.rand(20,20)
data2 = np.random.rand(100)

fig = plt.figure()
ax1 = fig.add_subplot(211)
im = ax1.imshow(data1,aspect='auto')
divider1 = make_axes_locatable(ax1)
cax1 = divider1.append_axes("right", size="2%", pad=0.1)
cbar = plt.colorbar(im,cax=cax1)

ax2 = fig.add_subplot(212)
ax2.plot(data2)
fig.tight_layout()
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/340690/23cdc994-a27a-69d2-5606-1e44745abd7b.png)
こんな感じでずれてしまう。
もしこれが時系列データとかで上下で比較するときには不便なので
ならべて表示する必要がある。

```python
from matplotlib import pyplot as plt
import numpy as np
from mpl_toolkits.axes_grid1 import make_axes_locatable

data1 = np.random.rand(20,20)
data2 = np.random.rand(100)

fig = plt.figure()
ax1 = fig.add_subplot(211)
im = ax1.imshow(data1,aspect='auto')
divider1 = make_axes_locatable(ax1)
cax1 = divider1.append_axes("right", size="2%", pad=0.1)
cbar = plt.colorbar(im,cax=cax1)

ax2 = fig.add_subplot(212)
ax2.plot(data2)
fig.tight_layout()
##これを付け足すと揃う
fig.canvas.draw()
axpos1 = ax1.get_position() # 上の図の描画領域
axpos2 = ax2.get_position() # 下の図の描画領域
#幅をax1と同じにする
ax2.set_position([axpos2.x0, axpos2.y0, axpos1.width, axpos2.height])
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/340690/cc7eb50e-b698-1755-ea6a-882522050dfa.png)

揃った。
tight_layoutでラベル等が重ならないようにしてから、canvas.drawをした後位置を取得する
参考（https://qiita.com/skotaro/items/01d66a8c9902a766a2c0 ）
Node.js v11.7.0リリースノート

https://nodejs.org/en/blog/release/v11.7.0/

# compression / zlib
- Added brotli support
    - zlibモジュールにbrotli(オープンソースの圧縮用ライブラリ)を用いた圧縮、解凍用関数追加

# console
- Added inspectOptions option
    - consoleにinspectOptionsというオプションが追加された
        - 各consoleインスタンスごとに色やオブジェクトの表示深度を指定できる
        - デフォルトはutil.inspect()で指定できる

# crypto
- Always accept private keys as public keys
    - 秘密鍵を公開鍵として受け入れられるようになった

# deps
- Upgrade npm to v6.5.0
    - npmのバージョンがv6.5.0-next.0から6.5.0に更新された

# fs
- Use internalBinding('fs') internally instead of process.binding('fs')
    - process.bindingからinternalBindingへ置きかえた
        - だんだんと置き換えていっているみたい？ (https://github.com/nodejs/node/issues/22160)
        - process.bindingだとユーザーランドからアクセスできたが、internalBindingだと不可になるみたい
          (https://medium.com/front-end-weekly/internals-of-node-advance-node-%EF%B8%8F-8612f6a957d7)

# http(s)
- Support overriding http\s.globalAgent
    - httpsのglobalAgentがhttpのものと同一ではなくなり、独自のものに上書きできるようになった

# util
- Inspect ArrayBuffers contents closely
    -  util.inspect()でオブジェクトを表示したとき、オブジェクト内のArrayBufferも表示されるようになった

# worker
- Expose workers by default and remove --experimental-worker flag
    - --experimental-workerをつけなくてもworkerにアクセスできるようになった
Google Cloud Storage gsutil -m cp コマンドのパフォーマンスメモ

# はじめに
google Cloud Platform (GCP) の サービス、Google Cloud Storage (GCS) の gsutil cp コマンド（ファイルコピーコマンド）ではオプションでマルチスレッド指定ができますが（rsync にもあるけど）、どのぐらいのパフォーマンスなのか調査する機会があったので、もったいないので共有します。メモレベルです。

## 条件
* ファイルサイズ：1GB / ファイル
* ファイル数：100 ファイル
* ファイルサイズ合計：100 GB
* バケット種類：リージョナルバケット
* コピーリージョン：USリージョン → 東京リージョン
* Google Compute Engine (GCE) 、Cloud Shell で gsutil cp コマンドを実行
* マルチスレッド処理は、gsutil -m cp コマンドを実行
* GCE インスタンス はマシンタイプ、リージョン・ゾーン以外はデフォルト設定


## 検証結果

| マシンタイプ |リージョン|オプション|コピー時間|
|:-:|:-:|:-:|:-:|
|n1-standard-1|us-east1|無|0:43:35|
|Cloud Shell|-|-m|0:08:49|
|Cloud Shell boost|-|-m|0:08:36|
|n1-standard-1|us-east1|-m|0:11:35|
|n1-standard-1|asia-northeast1|-m|0:09:03|
|n1-standard-2|us-east1|-m|0:07:11|
|n1-standard-2|asia-northeast1|-m|0:06:06|
|n1-standard-4|us-east1|-m|0:02:55|
|n1-standard-4|asia-northeast1|-m|0:02:10|

※オプション「-m」：マルチスレッドモード

時間に限りがあり、とりあえずここまでです。

## 結果の考察
* 当たり前だが、コア数を増やせば、処理が本当に速い。
* ていうか、Cloud Shell が期待してなかった分、めちゃくちゃ速く感じる。要件にもよるが、ほとんど Cloud Shell で十分と思う。
* Cloud Shell の Boost モードが誤差の範囲なのは、Boost がマルチスレッド処理にあまり関係ないのかもしれない。
* コピー先が東京リージョンだが、東京のVMインスタンスの方が若干速い。理由はよくわからない。

# 終わりに
もう少しパターンをやりたかったですが、機会があれば更新します。
JANOG43に参加して

# JANOG43に参加して
## 感想
1/23 - 25の間，JANOGと呼ばれるネットワーク技術者グループが主催するネットワークイベント，JANOG43　Meetingに参加してきた．
初参加だし昨年7月からネットワークを勉強し始めたペーペー(素人)だし，理解が追いつかないセッションが多かったがほんと参加してよかった．だって"自分の無知さや勉強不足がよくわかった"から．
てことでなるべく勉強したことをまとめていきたい．アウトプットする場所もないしね．

．．．続けよう，うん．

# 参考
JANOG: https://www.janog.gr.jp/

学生の方はJANOG若者支援プログラムと呼ばれる，交通費宿泊費を負担していただけるプログラムが毎年あるので参考に．
JANOG若者支援プログラム:https://www.janog.gr.jp/meeting/janog43/support_program
GoogleAppsScriptで公開するURLはリダイレクトされる

タイトルの通りです。
GoogleAppsScriptでウェブアプリケーションとして公開している方も多いかと思います。
ブラウザなどリダイレクトに対応しているクライアントであれば特に意識する必要もありません。

アレクサのカスタムスキルを作っていて、AWSLambda上のNode.jsでhttpsモジュールを使用してこの件にハマってしまいました。
それでレスポンスのステータスコードを見ると302で、GASの公開URLにブラウザからアクセスしてみると確かにリダイレクトされていました。

調べたところnodeでもリダイレクトに対応したモジュールはあるみたいですが、Lambda上で使用したい場合はzipにしてアップロードするようで面倒です。
とりあえず動けばいいやとLocationヘッダを見てもう一度リクエストするようにしたらGASから値を持って来れました。

```js
// アレクサ用のhandlerから呼び出す関数
function call_api() {
  return new Promise((resolve)=> {
    const dist_url = "https://script.google.com/macros/s/***/exec";

    https.get(dist_url, function(res) {
      const status_code = res.statusCode;
      if (status_code == 302 && res.headers.location ) {

        https.get(res.headers.location, function(res) {
          let body = '';
          res.setEncoding('utf8');
          res.on('data', (chunk) => {
            body += chunk;
          });
          res.on('end', (res) => {
            res = JSON.parse(body);
            resolve(res);
          });
        });

      }
    });

  });
}
```
もうforループなんていらない！？その２every,some,reduce ついでにアロー関数とlet,constも

#　概要
以前投稿した__[【もうforループなんていらない！？その1　forEach,map,filter,find】](https://qiita.com/micropig3402/items/b84dfa946869a4c3155a)__の続きです。


今回は**「every,some,reduce」**についてまとめます。
また前回の投稿で様々な方にアドバイスをいただき**「アロー関数」と「変数宣言(const,let)」**についても勉強してきたので、そちらもコードの中にしっかり書いていきたいと思います！

#every
配列の要素__「全て」__が条件を満たす場合に__true__を、満たさない場合には__false__を返してくれます。

```JavaScript
const members = [
    {name: "Naoya", age: 23},
    {name: "Takuya", age: 25},
    {name: "Shinya", age: 19}
];

members.every(member => member.age < 30 ); //true
members.every(member => member.age > 20); //false
```

#some
配列の要素の内__「1つでも」__条件を満たす場合には__true__を、満たさない場合には__false__を返してくれます。

```JavaScript
const members = [
    {name: "Naoya", age: 23},
    {name: "Takuya", age: 25},
    {name: "Shinya", age: 19}
];

members.some(member => member.age > 20); //true
members.some(member => member.age > 30 ); //false
```

#reduce
>reduce() はアキュムレータと配列の各要素に対して（左から右へ）関数を適用し、単一の値にします。

元の配列の要素を蓄積して、新しい単一の値を作るって事ですね!

```JavaScript
const books = [
    {title: "ハリーポッター", price: 1500},
    {title: "3匹の子豚", price: 1000}
];

let sumPrice = books.reduce((sum,book) => sum + book.price ,0);

console.log(sumPrice); //2500
```
kurbernetesで本番環境構築を目指す - モニタリング編 -

# はじめに
docker+kubernetesでwebアプリケーションが動く環境をとりあえず構築したのですが、運用するならどんな感じでモニタリングしていくのかわからなかったので調べて設定しました。

# Stack Driverを使う
以下をモニタリングしようと思いますがどうやらStack Driverを使えばいいそうです。
1. リソース
2. ログ
3. プロセス

### [Stack Driver](https://cloud.google.com/stackdriver/?hl=ja)の有効化
- Google Cloud Console->ナビゲーションメニュー->モニタリングからナビゲーションに沿ってワークスペースを作成します。
参考：[【GCP入門編・第17回】 Stackdriver Monitoring で Google Compute Engine を監視しよう！](https://www.topgate.co.jp/gcp17-stackdriver-monitoring-gce)

### リソースモニタリング
- Compute EngineのCPU使用率が70%を超えたらメールで通知する
- 手順
    1. Alerting->Add Policy
![image.png](https://qiita-image-store.s3.amazonaws.com/0/271751/16a950bd-6946-e61f-1bcf-764298c8de40.png)
    2. Add Condition
![image.png](https://qiita-image-store.s3.amazonaws.com/0/271751/72264c03-bf0a-3cf8-5334-b036b4a6fcaf.png)
    3. TargetとConfigurationを設定
    ![image.png](https://qiita-image-store.s3.amazonaws.com/0/271751/d75c698f-05e0-cb21-fb5a-62ea460583fd.png)
    4. 通知するメールアドレスの入力
    ![image.png](https://qiita-image-store.s3.amazonaws.com/0/271751/a2375dd0-e233-8500-5da3-0b63257b046a.png)
    5. nameを決めてsave
    ![image.png](https://qiita-image-store.s3.amazonaws.com/0/271751/a930dd9e-3847-ac35-da07-0c893c33dab9.png)
 
### ログモニタリング
- 一般的なログはstack driverを有効にすると見れますが、[監査ログ](https://cloud.google.com/compute/docs/audit-logging?hl=ja)の中の[データアクセス ログ](https://cloud.google.com/logging/docs/audit/configure-data-access?hl=ja)は設定が必要だということです。
- 手順
    1. GCP Console で、左上のオーバーフロー メニューから [IAM と管理] > [監査ログ] を選択します。
    2. [監査ログ] ページのメインの表で、[タイトル] 列のサービス名の左側にあるボックスをクリックして、1 つ以上の GCP サービスを選択します。
    3. 表の右側にある情報パネルの [ログタイプ] タブで、有効にするデータアクセス監査ログのタイプごとにボックスをオンにして、[保存] をクリックします。

### プロセスモニタリング
- プロセスモニタリングはエージェントが必要な模様です。
    - [モニタリング エージェントの概要](https://cloud.google.com/monitoring/agent/?hl=ja)
    - [モニタリング エージェントのインストール](https://cloud.google.com/monitoring/agent/install-agent?hl=ja)
- 稼働時間チェックだけやりました。
    - [稼働時間チェック](https://cloud.google.com/monitoring/alerts/uptime-checks?hl=ja)
React NativeのaccessibilityIgnoresInvertColorsとスナップショットテスト

React Nativeのコンポーネントにスナップショットテストを実行したら、以下の1行が追加されていました。

```
accessibilityIgnoresInvertColors={true}
```

しかし、ソースコードには`accessibilityIgnoresInvertColors={true}`を追加していません。
そもそも、`accessibilityIgnoresInvertColors`とは？


## accessibilityIgnoresInvertColors

https://facebook.github.io/react-native/blog/2018/08/13/react-native-accessibility-updates

> [Accessibility API Updates](https://facebook.github.io/react-native/blog/2018/08/13/react-native-accessibility-updates)
> `accessibilityIgnoresInvertColors`
> We exposed Apple's api AccessibilityIgnoresInvertColors to JavaScript, so now when you have a view where you don't want colors to be inverted (e.g image), you can set this property to true, and it won't be inverted.

> These new properties will become available in the React Native 0.57 release.

- 色を反転させたくないView（例えば、画像）にこのプロパティをセットすると、色が反転しない
- このプロパティはReact Native 0.57で利用可能になる

だそうです。


## ImageBackground

スナップショットテストに戻ります。
スナップショットとテスト対象のコンポーネントを照らし合わせて、`accessibilityIgnoresInvertColors`がセットされているコンポーネントはImageBackgroundだと推測しました。


https://github.com/facebook/react-native/blob/v0.57.0/Libraries/Image/ImageBackground.js

> [react-native/Libraries/Image/ImageBackground.js](https://github.com/facebook/react-native/blob/v0.57.0/Libraries/Image/ImageBackground.js)
>
> ```
> render() {
>   const {children, style, imageStyle, imageRef, ...props} = this.props;
>
>   return (
>     <View
>       accessibilityIgnoresInvertColors={true}
>       style={style}
>       ref={this._captureRef}>
>       <Image
>         {...props}
> ```

`accessibilityIgnoresInvertColors={true}`がセットされています。
つまり、ImageBackgroundコンポーネントの変更がスナップショットに反映されたということです。


## まとめ
テストが失敗する原因は、自分が書いたコードの変更だけでなく、外部ライブラリの変更ということもあります。
外部ライブラリの変更には気をつけましょう。
railsでjavascript,scssファイルを指定して読み込む

#初めに
javascriptってすべてのページで同じファイルを読み込まれてると都合悪いですよね。

エラーとか出てしまうし。

なのでいままではerb内の最後にjavascriptを書いていたのですが他の方法が分かったので書きます。

ちなみにこの記事のまんまですが読み込みのところで一か所うまくいかなかったところがありました。

[rails] 特定のページのみで実行するJavascript
https://www.ohmyenter.com/execute-javascript-on-a-page-on-rails/

#実装

まずassets/javascript内にon_page_load.coffeeを作成します。


その中に


https://www.ohmyenter.com/execute-javascript-on-a-page-on-rails/

この記事に書いてあるコードをコピペします。

この記事ではcoffeeで書いてあります。

またjqueryが必要なのでjqueryを使えるようにしておきます。

あとはapplication.html.erbでbodyを

```erb 
<body data-controller="<%= controller_name %>" data-action="<%= action_name %>">
```

こんな感じにします。



基本的にこれで

```javascript

onPageLoad('users#index', function() {

});

```

こんな感じで使えるようになります。

これならusersコントローラーのindexアクションで使うjavascriptっていう感じ

ですが自分の場合うまくいかず....


読み込むときにon_page_load.coffeeはrequireで読み込むようにしました。


```javascript 


//= require jquery
//= require rails-ujs
//= require activestorage
//= require turbolinks
//= require on_page_load
//= require users
//= require books

```

こんな感じに

requireでon_page_loadを読み込んでいるので

require_tree . でまた同じファイルが読み込まれちゃうんじゃないかと思ってrequire_treeを削除して

ファイルを指定して読み込んでいます。


めでたしめでたし:sunny:




#cssのコントローラー別読み込み

cssの場合まず

application.html.erbのbodyを

```
<body class='<%= controller_name %>'>
```

こうします

そして

scssファイルで

```scss 
.users
{
  background: red;

  .title
  {
     color: white;
  }
}
.books 
{
  background: blue;

  .title
  {
     color: black;
  }
}
```

とすればコントローラーごとにcssをかえることができます。


おわり:sunny:
5と8の和で表すことができない最大の整数を求めてみた

Twitterで話題になっていたので適当実装でやってみる

### 実装
適当

```go
package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
	"strings"
)

func main () {
	stdin := bufio.NewScanner(os.Stdin)
	
	stdin.Scan()
	input := stdin.Text()
	first, _ := strconv.Atoi(strings.TrimSpace(input))

	stdin.Scan()
	input = stdin.Text()
	second, _ := strconv.Atoi(strings.TrimSpace(input))

	for solve := 0;; solve++ {
		flag := false
		for i := 0;; i++ {
			tmp := solve - first * i
			if (tmp < 0) {
				break
			}
			for j := 0;; j++ {
				tmp := tmp - second * j
				if tmp == 0 {
					flag = true
					break
				} else if tmp < 0 {
					break
				}
			}

		}
		if !flag {
			fmt.Println(solve)
		}
	}
}
```

### 出力結果

```go
1
2
3
4
6
7
9
11
12
14
17
19
22
27
```

ということで27が最高っぽい
ちなみに8と7だと41が最高だった
数式で表せるのかな？
VMware　ubuntu で画面が小さい

#VMwareにubuntuをインストールして。。
起動！！と思って起動したら画面が異常に小さい・・・・うあﾞぁあ ･ﾟ･(´Д⊂ヽ･ﾟ･ あﾞぁあぁﾞああぁぁうあﾞぁあﾞぁぁ


画面が小さいてか小さすぎる、、、、( ；∀；)( ；∀；)( ；∀；)( ；∀；)( ；∀；)


##VWware Toolsインストールーーーーー

手動インストール！！


![スクリーンショット (13).png](https://qiita-image-store.s3.amazonaws.com/0/262211/b3998aea-b4e6-dd55-a2f4-8ec30c1b963f.png)

てな感じで左上のplayer ＞ 管理 >VMware Toolsのインストールをクリック

インストールしたら画面の下付近に [仮想OSでログ。。して・・CDをマウントして。tarを使用して]
的なことが書かれているので

その手順

root でログインしてね

```
mount /dev/cdrom /mnt
```

上のやつできなかったら

```
cd /
cd media/
cd VM ware.....\tools/
ls

```

てな感じでその中に.tarがあると思います

>mountてなに？　　
・まずマウントは、windowsではHDDはC,DドライブとかDVDはEドライブとかUSBはFドライブとかの感じで
デバイスごとで管理されていますよね
linuxは、ドライブという概念がありません。
linuxでは、DVDドライブも、外付けのHDDも すべて/ディレクトリ以下のディレクトリツリーに接ぎ木
して管理しているようです。　で、これをマウントと呼ぶそうです・・・

マウントを実行する式

```

mount デバイスファイル　マウントポイント

```
マウントポイントとは、デバイスを接続するディレクトリのこと。

て、ことで次に

```
cp /mnt/VMwareTools-x.x.x.tar.gz/tmp
```

```
cd /tmp
```

```
tar xvfz Vmwaretools......tar.gz
```

```
cd vmware-tools-distrib 
```

```
./vmware-instal.pl
```

あとは最後の plの後ろに-dをつけてあげると
勝手に設定します。

##まとめ
自分が困ったのでメモにしました
こんな初歩なこと自分ぐらしかこまらないか・・
てなことで！
おわり
初めてのJavaScript


今日の学習内容です。

-----
**console.log( )**（コンソールログ)
丸括弧に入力した文字がコンソールに表示される。
必ず最後に;(ダブルクォーテーション)をつける。


**let ○○="●●";**
変数。右辺を左辺に代入する。
右辺の文字は後で更新出来る。
更新する場合、letは不要。このように書く。→　**○○="◎◎";**


**const ○○="●●";**（コンスト）
定数。letと同じく、右辺を左辺に代入することが出来るが
後で更新は出来ない。

**${}**
文字列の中に変数や定数を入れることが出来る。
この時、文字列全体を`（バッククォート）で必ず囲む。


**if( )**
条件分岐が出来る。
条件式が成り立つと「true（トゥルー）」
成り立たなければ「false（フォールス）」と表示される。

-----------
・躓いた点
「20以上の場合は〇〇と表示する」という文を
ifを使って表示する時に「if(age > 20){・・・・」と入力していた。
正解は「if(age >= 20){・・・・」。以上なので「>=」と入力しないといけない。


・気づいた点
ifは仕事でif関数などを使うので理解がしやすかった。
;をつけるのを忘れやすいので気をつける。

------
明日は比較演算子からです。
【AWS入門】EC2インスタンスの起動、ssh接続、Apacheインストール/起動 day2-1

UdemyのAWSコースの学習ログです。

# Udemy コース
手を動かしながら2週間で学ぶ AWS 基本から応用まで
https://www.udemy.com/share/100taiB0EfeFtSRnQ=/

# EC2
仮想サーバーを立ち上げて利用できるサービス
従量課金製

### EC2の5大ポイント

- OS/Imageの選択（Amazon Linux、Cent OS、Windowsなど）
- インスタンスタイプ（CPUとメモリのバランスを選べる)
- ストレージの選択（ハードディスク/SSD）
- セキュリティグループ（ファイアウォールで通信を制御）
- SSHキーペアの設定

## 実際にEC2を起動
マネジメントコンソールでEC2を設定していく
AWS Marketplace、各ベンダーがソフトウェアをインストールした状態で提供している
今回は `Amazon Linux AMI 2018.03.0 (HVM), SSD Volume Type`を選択
インスタンスタイプは無料枠の`t2.micro`を選択
セキュリティグループには`SSH`と`HTTP`を選択（HTTPは今後Apacheを使うため）
ソースは自宅や会社のグローバルIPを指定する
[起動]をクリックでSSHのキーペアの選択/作成モーダルが出る
新しいキーペアの作成、選んでキーペア名を入力、キーペアのダウンロードをクリック＞pemがダウンロードされる
インスタンスの作成ボタンをクリック
作成ステータス＞iからはじまるリンクを押す＞EC2のステータスがみれる

## EC2にSSH接続
ダウンロードしたpemを使ってEC2にssh接続をおこなう
マネジメントコンソールで作成したEC2がrunnningとなってる事を確認
SSH接続するためターミナルを起動

```
$ ssh -i udemy-aws.pem ec2-user@xx-xxx-xxx-xxx
```
（xx-xxx-xxx-xxxはEC2のIPv4 パブリック IP）
WARNINGが出て Permission denied(publickkey) となりsshは失敗する。
pemのパーミッション権限が大きすぎるため、自分だけreadできるよう権限を変える必要がある

```
$ chmod 400 udemy-aws.pem
```
再度ssh接続を実行
接続できるとEC2のロゴがでれば接続成功

## EC2にApacheをインストール
ここからEC2にApacheをインストールしてWebサーバーとする
まずApacheのインストール確認

```
$ yum list installed | grep httpd
```
何も入ってない状態なのでhttpdは表示されないはず
Apacheをインストールするには

```
$ sudo yum install httpd
```
Apacheを起動させる

```
$ sudo service httpd start
```
ChromeのアドレスにEC2のIPv4 パブリック IPを入力して接続してみる
Apacheの初期ページが表示されればApache起動成功
AWS EC2のWindowsかんたん構築手順

## はじめに

EC2のWindowsは、テスト環境を作る程度ならとても便利です。クラウドなのでアドレスを教えるだけで客先にも提供できます。しかし、他の人に頼んでも”クラウド”というと拒絶されてしまいます。この記事を見てひとりでも多くの人が構築できるようになると嬉しいです。

## 手順

<table boder="0">
<tr>
<td width='50%'><img src="https://qiita-image-store.s3.amazonaws.com/0/253995/f808ce88-c8ee-d1b6-4caa-5fdfc2321c7c.png">
<td>EC2の[インスタンスの作成]を押します。

<tr>
<td><img src="https://qiita-image-store.s3.amazonaws.com/0/253995/7cf11d8f-5519-f518-328c-1d0268e20363.png">
<td>1.AMIの選択<br>コミュニティAMIを選び "Windows_Server-2019-J" で検索します。

<tr>
<td><img src="https://qiita-image-store.s3.amazonaws.com/0/253995/f3686924-194a-7c30-ca31-9720da0e7d74.png">
<td>2.インスタンスタイプの選択<br>
重いので構築はsmallで行い、後でmicroに変えるのがオススメ。

<tr>
<td><img src="https://qiita-image-store.s3.amazonaws.com/0/253995/11dc87dc-02b0-3d92-c40e-d09b93a52439.png">
<td>3.インスタンスの詳細の設定<br>
ネットワーク＝作成済のもの<br>サブネット＝作成済のもの<br>自動割り当てパブリックIP＝有効

<tr>
<td><img src="https://qiita-image-store.s3.amazonaws.com/0/253995/7ff4b500-461a-75c5-ade9-07ebe62038f9.png">
<td>4.ストレージの追加<br>
サイズを30→50に変更します。Windows Serverで30GBは足りないです。

<tr>
<td><img src="https://qiita-image-store.s3.amazonaws.com/0/253995/9326718f-adaa-a98c-705d-53d1a1a64bed.png">
<td>5.タグの追加<br>
タグとは名前などです。後で変更可能です。

<tr>
<td><img src="https://qiita-image-store.s3.amazonaws.com/0/253995/99ccb6de-5c2a-eb2d-8b24-2217d3a3b093.png">
<td>6.セキュリティグループの設定<br>
RDP(3389)はリモートデスクトップです。会社や自宅のグローバルIPを入れてください。
確認くんや診断くんで表示されます。

<tr>
<td><img src="https://qiita-image-store.s3.amazonaws.com/0/253995/359c4109-f95f-faf6-3af8-f84a7e3ff430.png">
<td>7.インスタンス作成の確認<br>
確認します。

<tr>
<td><img src="https://qiita-image-store.s3.amazonaws.com/0/253995/f958b35e-4d45-1b3c-74ee-4168c1da5462.png">
<td>pemファイルを用意します。EC2のキーペアで作成できます。
<tr>

<td><img src="https://qiita-image-store.s3.amazonaws.com/0/253995/675b29b1-ad84-4ddf-9546-aac81e05e969.png">
<td>起動したら[パスワードの取得]を実行して、pemファイルを貼り付けます。パスワードが表示されるので控えます。
IPアドレスを控えます。表示されないとき手順3の自動割り当てパブリックIPが有効になっていない可能性があります。

<tr>
<td><img width=60% src="https://qiita-image-store.s3.amazonaws.com/0/253995/26299331-4f80-83d6-76cb-edd68ab50a28.png">
<td>リモートでデスクトップでログインします。

<tr>
<td><img src="https://qiita-image-store.s3.amazonaws.com/0/253995/8350d46a-d2f0-6b22-1acd-0e82af678ac1.png">
<td>これで完了です。すでに日本語化されています。
後は通常のWindowsと同じです。
</table>

## コメント

- AMI（マシンイメージ）でAmazon標準ではなくコミュニティAMIを使用すると日本語化が楽です。Amazon標準だと日本語フォントのインストールから必要です。
- 初めはVPCの難易度が高いと思います。ざっくりいうと社内LANのようなものです。
- キーファイル pem はEC2のキーペアで作成できます。
- セキュリティーグループで、リモートデスクトップにグローバルIPを入れています。RDPはよく攻撃されるので全開にすると危険です。
- EC2は停止して起動するとIPアドレスが変わるので注意です。固定にするにはEC2のElasticIP（有料）を使います。

## まとめ

最近「AWSで簡単に作って」と言われるのですが、簡単ではないです。クラウドとはいえ１件１件こーしろあーしろの無茶振りは残ります。
AWSを使えばサーバー実機の発注作業と設置作業が無くなり、会社の仕事量は減ります。しかし、営業部、開発部、サポート部の場合、開発部が全ての問い合わせに対応することになり、私の作業量が激増しました。AWSはイスに座ったままでも家でもできちゃうので、簡単にできる→スグできる→タダでできる、と伝説が一人歩きしてしまい、AWS担当者が退職してしまうAWSあるあるが起こります。それ以上はチームの問題ではなく組織の問題なので、違った取り組みが必要なのだと思います。
MacにMavenを導入してEclipseで使用するまでの手順

#[概要]
本記事では、MacにMavenを導入してEclipseで使用するまでの手順を記載します。
Mavenは、Javaのプログラムを効率良く管理(ビルド)するためのApacheのAntに代わるプロジェクト管理ツールである。
Antの場合にはbuild.xmlという設定ファイルに細かい指示を記述して行っていた各処理を、Mavenでは大まかな指示をpom.xmlに記述して処理する形となっている。
主な特徴として、pom.xmlファイルの<dependency>タグにプロジェクトで使用するJARライブラリ及びバージョンを指定することで外部からJARを自動でダウンロードして自動でビルドしてくれる。

詳細は以下を参照。
######Apache Mavenとは
https://ja.wikipedia.org/wiki/Apache_Maven

#[手順]
#####1. MacにMavenをインストールする
1-1. インストール可能なMavenを確認する
`brew search maven`

1-2. 最新のMavenをインストールする
`brew install maven@3.5`

1-3. PATHに追加する(~/.bash_profileを編集して実行)
```~/.bash_profile
MAVEN_HOME=/usr/local/opt/maven@3.5
export PATH=$MAVEN_HOME/bin:$PATH
```

`source ~/.bash_profile`

1-4. バージョン確認
`mvn --version`

#####2.EclipseにMavenを設定する
2-1. [環境設定] > [Maven] > [インストール] > [追加] で [新規 Maven ランタイム ] ダイアログを開く

2-2. インストール・ホーム : 1.の「$ mvn — version」で表示された「Maven home」のパスを設定する

2-3. インストール・ホーム: 手頃に分かる名前を設定する

2-4. [完了]ボタンを押下する

######3.Mavenのプロジェクトを作成する
3-1. [ パッケージ エクスプローラ] > [新規]] > [Maven プロジェクト] > [次へ]

3-2. [ デフォルト・ワークスペース・ロケーションを使用 ] にチェックを入れる、[シンプルなプロジェクトの作成] にチェックを入れる > [次へ]

3-3. 下記を入力して[Finish]
GroupId : プロジェクトのルートパッケージ名
ArtifactId : プロジェクト名
Version : プロジェクトのバージョン ( 今回はデフォルトのまんま)

**これで、完成！**