OmniAICreator/Qiita-1.07M huggingface dataset:
Railsの作成中に Uncaught ReferenceError: $ is not defined がでた

##Railsの初期セットアップでJQueryが読み込まれない
jQueryを使いたい場合は、head内でjQueryを記述するjsファイルを読み込む必要がありますが、RailsではデフォルトでjQueryが使えるようになっているため、特に何かする必要はありません。のはずが、JQueryを実装してみたところコンソール画面にこのようなエラーが
>Uncaught ReferenceError: $ is not defined

JQueryのコードはこちら

```javascript:sample.js
window.addEventListener("load", function () {
   $("li").on("click", function () {  
      $("li.selected").removeClass("selected");
      $(this).addClass("selected");
   });
});
```
JS自体は動作確認できていたのでおそらくJQueryが正しくローディングされていないようです。

##解決方法
###application.jsの見直し
Railsが自動で読み込んでくれないので手動で直していきます。
まずこちらのファイルを確認。

```javascript:app/assets/javascripts/application.js
//= require rails-ujs
//= require activestorage
//= require turbolinks
//= require_tree .
```

ここに次のコードを追加

```javascript:
//= require jquery
//= require jquery.turbolinks
```

ただ注意したいのが読み込まれる順番です。require_tree .の下に追加すると読み込みでまたエラーが出る可能性があるので上に足します。

```javascript:app/assets/javascripts/application.js
//= require jquery
//= require jquery.turbolinks
//= require rails-ujs
//= require activestorage
//= require turbolinks
//= require_tree .
```

###gemのアップデート
railsでJQueryを動かすgemをインストールします。
Gemfileに以下のコードを追加

```ruby:Gemfile
gem 'jquery-rails'
gem 'jquery-turbolinks'
```

Gemfileを更新したので
`$ bundle update`
を実行します。

###Rails serverを立ち上げ直す
忘れると反映されません。
これで無事にJQueryが動きました。

根本的にどこに原因があるのかわかる方、いらっしゃいましたら教えていただけるとありがたいです。
Nginxでphpを動かす

## 環境：

* Debian9
* nginx/1.14.0

phpを使うページを追加する前に、静的ページ公開の設定は済んでいる想定。

## phpインストール
`sudo apt install php7.0-fpm`
`sudo apt install php`
`sudo apt install php-mbstring` 

## phpの設定
`sudo vi /etc/php/7.0/fpm/pool.d/www.conf`
> user = www-data
group = www-data
listen.owner = www-data
listen.group = www-data

これらを
> user = nginx
group = nginx
listen.owner = nginx
listen.group = nginx

このように変更。
同ファイル内で`php7.0-fpm.sock`のパスを確認しておく
> listen = /run/php/php7.0-fpm.sock

再起動
`sudo service php7.0-fpm restart`

## nginxの設定
nginxの設定ファイルが**/etc/nginx/sites-available/sample.conf**にあり、
**/etc/nginx/sites-enabled/sample.conf**にシンボリックリンクが貼ってある。
最適かどうかはわからないけど、動いた設定。

`sudo vi /etc/nginx/sites-available/sample.conf`
serverディレクティブ内に下記を追加

```
index index.html index.php;
location ~ \.php$ {
    root           /var/www/sample.example.com;　#公開するファイルの場所
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include        fastcgi_params;
    fastcgi_pass unix:/run/php/php7.0-fpm.sock; #phpの設定で確認したパス
}
```
エラーがないか確認
`sudo nginx -t`

nginx再起動
`sudo service nginx restart`

## 確認
確認用phpファイル作成
`sudo vi /var/www/sample.example.com/phpinfo.php`
下記を入力して保存

```
<? phpinfo(); ?>
```

ブラウザから`http://sample.example.com/phpinfo.php`にアクセスする
phpinfo()の結果が表示されれば完了


## 参考：
[nginx + php-fpmでphpを動かす](https://qiita.com/tukiyo3/items/b1d29a257c41d97d6107)
[Debian 9 (Stretch) - PHP インストール（Nginx と連携）！](https://www.mk-mode.com/octopress/2017/09/28/debian-9-php-installation-by-src-with-nginx-cooperation/)
[CentOSにてnginxでPHPを動かす](https://qiita.com/utano320/items/36b6eac2bbd5bb5657f6)
[debian 9 (stretch)でnginx+php-fpm。とりあえず動かすだけ。](http://hidekazu.hatenablog.jp/entry/2017/07/22/172909)
[php環境構築時に入れ忘れてコケるやーつ…。](https://qiita.com/sango/items/a86f9b8cf8c9c641823a)
[How to Install Nginx with PHP + MySQL (LEMP) on Debian 9](https://www.howtoforge.com/tutorial/how-to-install-nginx-with-php-and-mysql-lemp-on-debian-9/)
【FileMaker】既存のウィンドウは一つだけ表示したい

よく「次へ」とか「明細表示」とか同じレイアウトを新規ウィンドウで表示したいけれど、同じレイアウトのウィンドウが表示されるのはイヤ、一つのウィンドウにして、というコントロールのやり方です。

# 動き

例えば、こんなワラワラと複数のウィンドウが表示されている時。
<img width="1428" alt="よくある複数表示のウィンドウ" src="https://qiita-image-store.s3.amazonaws.com/0/60538/18ffd1cc-bdb9-df4e-8f02-d3eeb1c31a40.png">

そして、もう一個ついでにドン。
<img width="1130" alt="おお、似たような名前でウィンドウができている" src="https://qiita-image-store.s3.amazonaws.com/0/60538/262f53e0-232b-8519-d523-7af248023d0a.png">
「表示」ボタンで、新しい画面を開いています。

微妙にウィンドウの名前が違うのに気づきましたか？
<img width="1094" alt="あ、名前がちょっとずつ違うね" src="https://qiita-image-store.s3.amazonaws.com/0/60538/28c82338-0656-98a8-1c77-89f731a3d67b.png">

このままだと、「表示」ボタンを押すごとに新しいウィンドウが開いてしまいます。

これをなんとか、、、同じウィンドウ名を開こうとしていたら、既存のウィンドウを前面に出してね、というスクリプトでコントロールします。
では、「表示」ボタンのスクリプトを改修していきます。

# スクリプト

```
エラー処理 [ オン ]
変数を設定 [ $windowname ; 値: GetValue ( Get(スクリプト引数) ; 1 ) ] 
変数を設定 [ $windowlayout ; 値: GetValue ( Get(スクリプト引数) ; 2 ) ] 
変数を設定 [ $retWindow ; 値: Substitute ( Trim ( FilterValues ( WindowNames ( Get(ファイル名 )) ; $windowname ) ) ; "¶" ; "" ) ] 
If [ $windowname = $retWindow ] 
	ウインドウを選択 [ 名前: $windowname ; 現在のファイル ] 
Else
	新規ウインドウ [ スタイル: ドキュメント ; 名前: $windowname ; 使用するレイアウト: $windowlayout ] 
End If
```

スクリプトのポイントが２つあります。

## ポイント1
ウィンドウ名を取得する時に、ちょっとした小細工をします。

このスクリプトにある、「同じウィンドウ名」が存在するかどうか、というのは、"WindowNames"という関数で現在開いているウィンドウの名前リストから、指定したウィンドウ名を探し出し、"FilterValues"でそのウィンドウ名だけを取得する、ということになります。
プラス、リストから取得した時に不要な空白を削除したり、改行マークがあったらそれを省くなどの小細工を追加して、正しくウィンドウ名を取得できるようにしておきます。

```
変数を設定 [ $retWindow ; 値: Substitute ( Trim ( FilterValues ( WindowNames ( Get(ファイル名 )) ; $windowname ) ) ; "¶" ; "" ) ] 
```

## ポイント2

それから、「同じウィンドウ名」が抽出して、存在したらどうする、存在しなかったらどうする、という分岐をします。

```
If [ $windowname = $retWindow ] 
	ウインドウを選択 [ 名前: $windowname ; 現在のファイル ] 
Else
	新規ウインドウ [ スタイル: ドキュメント ; 名前: $windowname ; 使用するレイアウト: $windowlayout ] 
End If
```

# ボタン指定

表示ボタンは、下の図のように作ったスクリプトと引数を指定します。
<img width="645" alt="「表示」ボタン" src="https://qiita-image-store.s3.amazonaws.com/0/60538/bdd4161f-ecac-530f-7c2a-d608c745f1f3.png">

引数２つ目は、新規ウィンドウで表示するレイアウト名になります。
既存ウィンドウが存在するときは使いません。


# まとめ
開きたいウィンドウがあるときは、メニューの「ウィンドウ」で選択すればいいじゃないか、という気もしますが、一般的なシステムを使う人には触られたくないメニューもありますよね。
<img width="365" alt="できれば勝手に触ってほしくないとか、ね。" src="https://qiita-image-store.s3.amazonaws.com/0/60538/cfa5e3e1-ef64-c615-52af-9f80b1dc825f.png">
業務システムは、FileMakerを知らない人も使いますので、できる限りメニューを使わないコントロールを実装していき、FileMakerを使っていることを意識せずに業務に集中してもらえるとうれしいですね。

他にもやり方はあると思いますが、既存ウィンドウを手前に出す一つのやり方として、みなさまの参考になれば幸いです。

では、楽しいFileMaker Lifeを！


# 追記
もっと簡単に実装したい！
開いているウィンドウが多いので、できればサクッと切り替えたい！
という方、[こちら](https://qiita.com/tyuma/items/2de705c2cf8a8c418e3a)の実装方法を参考にしてください〜。
Selenium docker の node で複数のセッションを扱う設定

# 結論

node の docker 起動時のオプションに

```
- NODE_MAX_SESSION=2
- NODE_MAX_INSTANCES=2
```

を設定する。

# セッションの生成

テストの都合上、一つのテストで二つのセッションを生成して扱う必要があった。

```
Capybara::Session.new(<driver name>)
```
でセッションを生成して、macOS のローカル環境では動いた。しかしdocker の selenium hub, node 構成では動かなかった。上記オプションで解決した。

# 参考
https://github.com/SeleniumHQ/docker-selenium/issues/687#issuecomment-370862240
【Python】Seleniumでブラウザを開いたまま処理を終了する

# 1.やりたいこと
Seleniumで処理をした後に手作業でブラウザ操作をしたいと思っても、通常は処理終了時にブラウザが閉じてしまいます。
Chromeを閉じずに、処理だけ終わらせる方法を書いていきます。

# 2.対応方法
webdriverを立ち上げた際に、chromedriverのプロセスが立ち上がります。
このプロセスIDに終了シグナルを送れば、pythonの処理は終了したまま、chromeを開いたままにできます。
webdriverのプロセスIDはWebdriverオブジェクトから参照します。
（下記はChromedriverの場合）

```python

from selenium import webdriver
import os
import signal

driver = webdriver.Chrome()

try:
    # ～いろいろな処理～
finally:
    os.kill(driver.service.process.pid,signal.SIGTERM)
```

例外発生して終了するとプロセスが残ってしまうため、finallyの中に入れて必ず終了させるようにしています。
VSCodeだとデバッグで走らせるとChromeが閉じてしまうことがありますが、コマンドラインから実行すると閉じずに残っているのがわかるかと思います。

# 3.備考
Chromedriverにdetachオプションを与える対応方法もありますが、コンソール画面が残ってしまったりと使い勝手があまりよくないので、なんだかんだで上記方法がよさそうでした。
参考：https://teratail.com/questions/253512
TechRacho を検索できる Alfred Custom Search の作り方

# 利用イメージ

![スクリーンショット 2018-11-06 17.17.15.png](https://qiita-image-store.s3.amazonaws.com/0/19223/ab33780f-e57a-af38-fd84-fe5030ff184d.png)




# 作成方法

TechRacho は WordPress で運用されていますので、WordPress に向けて検索クエリを投げられるように設定します。

下記のシェア用URLをブラウザに入力するとカスタムサーチを追加できます。

<a href="alfred://customsearch/Search%20TechRacho%20for%20%27%7Bquery%7D%27/tr/utf8/%2B/https%3A%2F%2Ftechracho.bpsinc.jp%2F%3Fs%3D%7Bquery%7D">alfred://customsearch/Search%20TechRacho%20for%20%27%7Bquery%7D%27/tr/utf8/%2B/https%3A%2F%2Ftechracho.bpsinc.jp%2F%3Fs%3D%7Bquery%7D</a>

![スクリーンショット 2018-11-06 17.03.33.png](https://qiita-image-store.s3.amazonaws.com/0/19223/6e1de72f-489f-d99e-01a6-26f8131d70c5.png)

「Alfred Preferences > Features > Web Search > Add Custom Search」の設定画面が開くハズです。

- Search URL: `https://techracho.bpsinc.jp/?s={query}`
- Encode input as UTF8: `Check`
- Encode spaces as: `+`
- Title: お好みで
- Keyword: お好みで

アイコンは公式サイトから拝借しました。
https://techracho.bpsinc.jp/wp-content/uploads/2017/09/cropped-techracho_official_icon-1-270x270.png

:smiley:
GASのスクリプトで「このスクリプトの OAuth ID は削除されました」のエラーが出たとき対応方法

# 問題

GASのスクリプトを実行した際に、以下の画像のように「このスクリプトの OAuth ID は削除されました」というエラーが出る場合があります。対応方法としては、「新規でGASプロジェクトを作成して、スクリプトを移行する」となります。本記事はその手順を記したものです。

![ss.png](https://qiita-image-store.s3.amazonaws.com/0/175708/52e2942b-bcf1-e1ce-212b-d8a8df61f766.png)

# 対応方法

## 手順

### GAS新規プロジェクト作成からGCPプロジェクト設定まで

1. 新規でGASプロジェクトを作成する
1. 「リソース」→「Cloud Platform プロジェクト」から「このスクリプトが現在関連付けられているプロジェクト」のリンクをクリックしてGCPプロジェクトのコンソールに移動する
1. GCPのダッシュボード上「プロジェクト情報」のカードにある「プロジェクト設定に移動」する
1. 「移行」をクリックして「組織なし」から自身が所属している組織にプロジェクトを移行させる
1. 必要に応じて最適なフォルダの配下に移動させる

※ GCPのプロジェクト管理を組織やフォルダで管理している場合を想定しています。

### スクリプトの移行作業

1. GCPのプロジェクトが任意の組織の元に移動できたのを確認
1. 元のGASプロジェクトのスクリプトを新しいGASプロジェクトにコピペ
1. 関数など動作確認して、問題なければ移行作業完了

## 権限設定

GCPプロジェクトの組織を移行させる作業時に権限で弾かれる場合が存在します。
組織なしのプロジェクトを任意の組織のもとへ移行させるには `resourcemanager.projects.create` の権限が必要なので、設定を行ってからプロジェクトの移行作業を実施します。

# 備考

## エラー原因と思われるもの

GASのプロジェクトは実は裏でGCPのプロジェクトと1対1で紐付いています。
（参考： [Google Apps Scriptにおける「プロジェクト」の関係](https://qiita.com/sebisawa/items/4faa6d859f480e306f46) ）

このため、メンバーの退職等に伴いgoogleアカウントが削除されると、その担当者が作成したGCPプロジェクトが削除されるケースがあり、このようなエラーが発生します。
（この点については正確に理解していないので、認識違いがございましたらご指摘ください。）


## GCPプロジェクトの移行理由

上述のように、GASで新規のプロジェクトを作成すると新規でGCPのプロジェクトが作成される。
このプロジェクトはデフォルトでは「組織なし」の野良プロジェクトになってしまうので、適切な管理のため組織に紐付ける必要があるのでプロジェクトの移行を行う。
代替ストリーム(ADS)についてのメモ

参考情報
[NTFS Alternate Streams- What, When, and How To](http://www.flexhex.com/docs/articles/alternate-streams.phtml)
[初めてのNTFS代替データストリームとstreamsの出力について](https://did2memo.net/2013/05/24/streams-exe-alternate-data-streams/)

NTFSにこういう機能があるのを、そういえばWin2000時代に目にした覚えがあったのですが、
最近まですっかり忘れてました。ざっと走り書き。

###コマンドラインでの表示
`cmd.exe`から`dir /w`で見えます。

###どうやってアクセスするの？
普通にファイル名に:(コロン)で区切ったファイルを指定すると作成できます。
下記の例だと、同時に`test.txt`も作成されます。

```
      FILE *fp;
      fp=fopen("c:\\Temp\\test.txt:1", "w");
      if(fp!=NULL){
        fprintf(fp, "test\n");
        fclose(fp);
      }
      fp=fopen("c:\\Temp\\test.txt:1", "r");
      if(fp!=NULL){
        char buf[32];
        fscanf(fp, "%s", buf);
        fclose(fp);
      }
```

###代替ストリームがあるか、どうやって調べるの？

`FindFirstFile()`に類似の名称の`FindFirstStreamW()`で調べることができます。
ただし、*を使用してのワイルドカード指定はできないようで、直接ファイル名を入力します。
(下記、いまだANSIでコーディングしてるので、ちょっと見づらくてごめんなさい)

```
      char pdir[MAX_PATH]{};
      char cdir[MAX_PATH]{};
      sprintf(pdir, "c:\\Temp");
      GetCurrentDirectory(MAX_PATH, cdir);
      SetCurrentDirectory(pdir);
      {
        WIN32_FIND_DATA fileData;
        HANDLE fileHandle=FindFirstFile("*", &fileData);
        while(fileHandle!=INVALID_HANDLE_VALUE){
          if(((fileData.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)==0)&&
             (strcmp(fileData.cFileName, ".")!=0)&&(strcmp(fileData.cFileName, "..")!=0)){
            wchar_t wtxt[MAX_PATH]{};
            MultiByteToWideChar(CP_ACP, 0, fileData.cFileName, -1, wtxt, MAX_PATH);
            {
              WIN32_FIND_STREAM_DATA streamData;
              HANDLE streamHandle=FindFirstStreamW(wtxt, FindStreamInfoStandard, &streamData, 0);
              while(streamHandle!=INVALID_HANDLE_VALUE){
                char mtxt[MAX_PATH]{};
                WideCharToMultiByte(CP_ACP, 0, streamData.cStreamName, -1, mtxt, MAX_PATH, NULL, NULL);
                if(!FindNextStreamW(streamHandle, &streamData)) break;
              }
              FindClose(streamHandle);
            }
          }
          if(!FindNextFile(fileHandle, &fileData)) break;
        }
        FindClose(fileHandle);
      }
      SetCurrentDirectory(cdir);
```
とすると、こんな感じで取得できます。

```
test.txt
::$DATA
:1:$DATA
```

###代表的な使用例は？
「このファイルは、インターネット上の場所から取得されており、安全でない可能性があります。」とかいう表示有無にこっそりと使用されています。
そのストリーム名は
`filename:Zone.Identifier:$DATA`
ということです。
そのストリーム内に下記IDが書かれるようです。(詳細はリンクとかたどってください。)

```
[ZoneTransfer]
ZoneId=3
```

```
public enum SecurityZone
{
        NoZone = -1,
        MyComputer = 0,
        Intranet = 1,
        Trusted = 2,
        Internet = 3,
        Untrusted = 4,
}
```
[iOS]iOS11以降の色の定義方法（設計提案）

iOS11からAssetsに色が定義できるように成りました
https://developer.apple.com/library/archive/releasenotes/DeveloperTools/RN-Xcode/Chapters/Introduction.html#//apple_ref/doc/uid/TP40001051-CH1-SW904

説明は皆様がわかりやすくされてるので割愛します

<img width="281" alt="スクリーンショット 2018-11-06 15.50.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/20784/701874cb-646c-4429-562e-2294cd8d5cac.png">

<img width="1060" alt="スクリーンショット 2018-11-06 15.50.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/20784/fb89e745-70c2-d087-f95e-509363086e05.png">

<img width="336" alt="スクリーンショット 2018-11-06 15.53.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/20784/1d75ec18-58be-f84e-e865-2db12d69a68b.png">

## 本題　コードから利用する

デフォでも十分シンプルです

```swift
UIColor(named:"keyColor")
```

しかしこうするととても気持ちいいです

```swift
enum Theme: String {
    case keyColor = "keyColor"
    case subKeyColor = "subKeyColor"
    
    var color:UIColor {
        return UIColor(named: self.rawValue)!
    }
    var cgColor:CGColor {
        return color.cgColor
    }
}

// 利用
func hoge() {
    backgroundColor = Theme.keyColor.color
    layer.borderColor = Theme.subKeyColor.cgColor
}

```

typoも怖くないです
切り替えも簡単そうです

## 所感

以前からこう書きたかった☺️

#### （以下追記）
## 別のアイディア（UIColorのextension）

こういう書き方もできそうですが、こっちの方が良いですかね？

```swift
extension UIColor {
    static var keyColor = UIColor(named: "keyColor")!
    static var subKeyColor = UIColor(named: "subKeyColor")!
}

// 利用
override func viewDidLoad() {
    super.viewDidLoad()

    view.backgroundColor = UIColor.keyColor
    view.backgroundColor = .keyColor
        
    view.layer.backgroundColor = UIColor.subKeyColor.cgColor
}
```

## 別のアイディア（階層化して整理しやすくする）

「UITableViewのデフォルトのbackgroundColor」とかを定義したい場合

```swift

enum Theme: String {
    case keyColor = "keyColor"
    case subKeyColor = "subKeyColor"

    enum TableView: String {
        case backgroundColor = "tableView.background"
    }
}

fileprivate extension RawRepresentable where RawValue == String {
    var color:UIColor {
        return UIColor(named: self.rawValue)!
    }
    var cgColor:CGColor {
        return color.cgColor
    }
}

// 利用側
override func viewDidLoad() {
    super.viewDidLoad()
    view.backgroundColor = Theme.TableView.backgroundColor.color
    view.layer.backgroundColor = Theme.TableView.backgroundColor.cgColor
}

```

## 複合させてみる

ちょっとやり過ぎな感じがありますが

```swift

extension UIColor {
    static var keyColor = Theme.keyColor
    static var subKeyColor = Theme.subKeyColor
}

```

動的にアプリ全体の色テーマが変わるようなアプリなら有効かな？　と思いましたが、そもそもその場合はColorSetの恩恵がほとんどないですね

## 追記：ColorLiteral

そういえばColorLiteralってありましたね
何故か使ってません

参考
https://medium.com/swift-column/color-literal-6223850f7e2c
ショートカット勉強会

# ショートカット

---

# Macを使う新人エンジニアに絶対に覚えてもらいたいキーバインド入門
 https://qiita.com/yousan/items/0876ca3e7bb5778d3063

---

# https://jsfiddle.net/yousan/zh965mfo/15/

---

# 実はMacはデフォルトでキーバインド使えます

---

# キーバインド?

---

# キーバインド

* キーバインド
* キーアサイン
* ホットキー
* ショートカット（今日はこの呼び方で）

---

# ショートカットおじさん

---

# ショートカットおじさん

* ショートカットキーはいいぞ
* マウス（トラックパッド）でシュバってくる
* *VimよりEmacs*

---

# 今日覚えてほしいこと

1. Macならあちこちでショートカットが使える
2. カーソル移動（ここを覚えてほしい！）
3. もっと便利なショートカット


---

# カーソル移動

* P
* N
* B
* F

---

# カーソル移動

* P: Previous Line
* N: Next Line
* B: Backward
* F: Forward

---

![image.png](https://qiita-image-store.s3.amazonaws.com/0/47327/30d61ef5-dbe1-3c53-2c6e-b0533c3392ed.png)

---

# 便利系カーソル移動

* a
* e

---

# 便利系カーソル移動

* a: heAd
* e: End

---

# 削除と貼り付け

* d: 削除 Delete
* h: 由来は不明です…
* k: 行削除 C-k (kill ringのk)
* u: 行削除 C-u (Cutのuらしい。Bashではカーソルから行頭までを削除。Zshでは行全体を削除。）

---
# ペースト

* y: Yankのy

---

# 改行

* m: 改行
* j: 改行＋インデント

---

# 辺りを覚えておくと良いです！

---

# ちょっとむずかしい系

---

# メタキー系

* M-f: 単語を前に
* M-b: 単語を次に
* M-BS: 単語削除

# MacOS系ショートカット

---
# MacOS系ショートカット

* 複数のアプリケーションで利用可能
* OS標準なのですっごく便利

---

# どなたかやってみてください

---

# どなたかやってみてください

* ⌘,
* C-Tab
* C-Shift-Tab

---
# みんなでやってみてください

* ⌘, : 環境設定
* C-Tab : 次のタブ
* C-Shift-Tab : 前のタブ

---

# みんなでやってみてください

* ⌘, : 環境設定
* C-Tab : 次のタブ
* C-Shift-Tab : 前のタブ

---

# ブラウザ系ショートカット

* ⌘L: URLを選択（Location）
* ⌥I
* ⌥U

---

# やってみます！

---
# BetterTouchTool

---

# BetterTouchTool

* Chrome
* Safari
* sLack
* Finder
* Redmine
* sourceTree

---

# ターミナル

---

# ターミナル

* C-r
* iTermであれば… ⌥O

----

# ということでショートカット良いですよ！

---

# 皆さんオススメのショートカットありますか？

---

# もう一回カーソル移動

* P: Previous Line
* N: Next Line
* B: Backward
* F: Forward

----

# 良いショートカットライフを！

---
勤務記録表作成の挫折雑記

弊社の勤務記録表を作り直してみようと思ったことがすべての始まり。
そして頓挫したフェルマータ的ぽえむ。めげないぞ。
~~ただの愚痴と言われても仕方がない~~
~~書いている人間はノリツッコミがひどい~~

# はじめに
作り直すに至ったまでの経緯
## 背景
筆者が所属する部は、昨年度まで別の会社の部署だったのだが、今年度から同じグループ会社である弊社に移籍した部署である。4月から弊社の規則に従うようになり、弊社の利用する勤務記録表を使うようになった。ようやく半年が経過したところである。
しかしこの勤務記録表がかなりの問題児であった。
## 初めての勤務記録
説明書となるエクセル文書と実際に勤務記録を行うxlsファイルを渡されれば、とりあえずはまあ説明書を見ながら記録をしてみようとなるはずだ。私もそうだった。
まず説明書を見ながら、勤務記録ファイルを立ち上げようとする。
「他のエクセルを開いたままこのファイルを開かないでね！」←エラーメッセージ
~~f**k!~~
やめたらこの説明書
 
気を取り直して説明書を軽く全部読んで暗記。
さあ開くぞと意気込み、開いていろいろ弄ってみた。
使いづらさには目をつむるとして…
ボタンが押せないのにも目をつむって……
リストボックスが動かないのにも目をつむって……
勤務時間計算がおかしいのにも目をつむって……
とりあえず記入を完了した。
最後に保存をしようと思い、何気なくCtrl+Sを押す。(わりと当然だと思う。)
「(なんかのエラーコード)(正直どんなのか思い出せない)」→エクセル落ちる
~~f**k!!~~
　
まだ大丈夫、まだ大丈夫と持ち直して入力し直すために再度勤務記録ファイルを立ち上げる。
ファイルが破損していて開けない。どうやら勤務記録ファイルごとファイルが破損したようでもう二度と立ち上がらない。
~~f**k!!!!!!!!!!!!!!!!~~

## エラーの洪水
勤務記録表はExcel2003-2007様式で作成されており(xls形式を用いるためか？)、Excel2016で開くと何故か落ちる。開けるエクセルのバージョン(2013で開けるのは救い)で開いても、少し意にそぐわない動作(Ctrl+Sもダメ！)をするだけでエラーの嵐。落ちるエクセル。戻らないデータ。さらには実際の勤務形態に即しておらず計算がまともにできない。勤務記録表の意にそぐうように自らの勤務時間を変更する始末。
いやあかんやろ。
それってもう勤務記録表として成り立ってへんやろ。
業務でのスキマ時間ができたので弊社のえげつなく使いづらい勤務記録表を作り直してみることにした。
というわけでとりあえず中身のVBAを見てみることに。

# 修正の記
## 問題点の洗い出し
眠らせたマクロを起こさないように、さながらオオカミの腹をかっさばいて中をのぞくような感覚でプログラムをのぞいてみた。
詳しく述べるのは避けるが……臓器が臓器の体をなしていない。そこに機能をもつものなど存在せず、茫洋たる荒海が広がっているだけだった。原生生物の構造を見るほうがまだ面白いものだ。
赤ずきんもおばあさんも、どこかにはいるのだろうが目を凝らしても波が邪魔をする。同じような波が何百と押し寄せてくる。(個人的に2度以上同じコードを書くくらいなら切り出せよと思っているので開いた口が塞がらなかった)。
この体に与える食物への消化処理も、食物側に依存している。入力制御等の最低限のチェックはされているものの、その関門をひとつ突破してしまえば何のその。体内の奥深くに入って初めて異物であることを認識する(たまに認識すらしない)。
デザインに関して一つだけ言うなら保護を外すと罫線が1本1本外れる。

最初から作り直すほうが早いのでは？

## 十分条件の洗い出し
xls形式を守っていくことのメリットが存在しないのもあり、いっそ1から作ってしまうほうが簡単であることに気づいた私は逆に何が必要なのかを見直すことにした。最終的に

* 作業工数と各時間がわかるcsvの出力
* 当月の休暇取得日数等がわかるcsvの出力
* 各csvを見やすくまとめたエクセル表

この3点があれば良いことがわかった。csvを作成するにあたっての条件等は現行プログラムにかかれている条件を精査することで実現可能だ。

さあつくるぞ。

# 勤務記録表の作成→完成
周囲からの希望も織り込んだ上で、

* 記述が少ない
* 修正しやすい
* 画面移動が少ない
* 一般的な使い方をしてもエラーが出ない

以上の要件も満たした勤務表を作成することに( ~~当たり前では？などと言ってはいけない~~ )。追加で「Webで記入してそのまま提出できたら嬉しい」等の希望もあったが、まず今までの体裁をそのまま利用できてデザインを大して悩む必要のないxlsm形式を採用した。

メンテナンスを行いやすいような設計を目指し仕様書を作成、上司に仕様の確認を取る。メソッドの切り出しに注意し、個別でのテストが行えるようにテストコードを作成(大したものではないのでこの部分はもっと勉強したい)。総時間にして5日ほどで一旦完成した。
現行プログラムにある条件を考慮し、部内の希望も叶えた勤務記録表である。

# 挫折の経緯
テスト使用ということで数人にテストをお願いした。他部署の人間と関わることがほとんどないうちの部署だが、私の知る数少ない他部署の人間にテストをお願いしたときのことである。
「ここの条件がテストに含まれていない」
と教えてもらった条件の中に、自分たちが使っているものとは明らかに違う条件が出てきた。
何やらおかしいと思い詳しくすり合わせてみると、どうやら以前から存在していた部署には通達されていたルールがたくさんあるらしい。今年から移籍してきた筆者の部署にはそれが伝達されていなかった。
いやええんかそれ。あかんやろ。
他部署の上の人間に必要な項目を改めて伺おうにも勝手に作製するなんてと叱責されて終わってしまったので結局真に必要な項目がわからず作業を中断するしかない。
うーん。なんだかな。

# 反省
個人の空き時間とはいえ作ることを先に(もっと上の人間にも！)言っておけばこの時間はなかっただろう。VBAの勉強ができたのはありがたいことなのでスキルとして繋げさせてもらうが。
それにしてもなんだかすっきりしない心情のまま――今日も懲りずに作業の効率化を図るのであった。
v-iconを使ってもテキストが表示される

# v-iconを使ってもアイコンが表示されない

```vuejs
<v-icon>info</v-icon>
```

<img width="253" alt="スクリーンショット 2018-11-06 16.58.04.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/227810/4af482c4-5cdd-341b-0b2c-90f243306f0c.jpeg">

# 解決策

原因は `style` を書く時に `scoped` をつけていたのが原因

```vuejs
<v-icon>info</v-icon>

<style lang="scss" scoped>
// scopedが付いている
</style>
```

↓

```vuejs
<v-icon>info</v-icon>

<style lang="scss">
// scopedを外す
</style>
```

<img width="211" alt="スクリーンショット 2018-11-06 16.59.43.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/227810/9f45c477-9903-b04a-4300-12f107104715.jpeg">

表示された！！

# 補足
`scoped`を使いつつ、`v-icon`を使いたい場合は、 `v-icon` 用にatomsを用意してあげると良さそう
condaでいれたnumpyのスレッド数管理

# 環境
Miniconda(Anaconda)を使用して環境構築を行っていることが前提

```miniconda.sh
$ conda create -n [new_env] python=3.7
$ conda install numpy
$ pip install chainer  # 別にやらなくても良い． conda経由でやろうとするとpythonのバージョンが3.6に下がる

$ conda activate [new_env]
$ python -V
Python3.7.1
```

# 問題
`chainer.iterators.MultithreadIterator`や`chainer.iterators.MultiprocessIterator`使用時にCPU使用率が跳ね上がる

# 解決策
`conda install numpy`でビルドされるnumpyはmklを用いて並列処理によって高速化されるようになっている．
故に，環境変数`MKL_NUM_THREADS`を適切な値にすることで，同時スレッド数を制限する必要がある．

注意すべきは**`MultithreadIterator`や`MultiprocessIterator`によって立ち上がる各スレッドが`MKL_NUM_THREADS`分のスレッドを立て得る**ことである．

そのため，`n_threads`もしくは`n_processes`と`MKL_NUM_THREADS`の掛け算の値が，使用したいスレッド数と同じになるようにお互いを設定する必要がある
propsを渡す時にstyled-componentでハマったメモ

公式のサイトをみてチェックしていたとはいえpropsの渡し方と考え方でハマったのでメモ

コンポーネント

```jsx
//editingをpropsとして渡す このeditingにはtrue,falseが入ってくる
<MyComponent
   onEdit={this.handleEdit}
   editing={editing}
/>
```

## propsで切り替えられた例

```js
// @flow

import React from 'react';
import styled from 'styled-components';

type Props = {
  onEdit: () => void,
  editing: boolean
};

function MyComponent({ onEdit, editing }: Props) {
  return (
    <div>
      <Menu editing={editing}>
        <li onClick={onEdit}>イベント</li>
      </Menu>
    </div>
  );
}

export default MyComponent;

const Menu = styled.ul`
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  li {
    cursor: pointer;
    text-decoration: underline;
    margin-left: 8px;
  }
  //ここでpropsがtrue,falseで切り替え
  display: ${props => (props.editing ? 'none' : 'block')};
`;

```

## propsで最初切り替えられなかった例

```js
function MyComponent({ onEdit, editing }: Props) {
  return (
    <div>
//ここにpropsを渡すだけで属性のところを書いていなかった ⇨<Menu editing={editing}>
      <Menu editing>
        <li onClick={onEdit}>イベント</li>
      </Menu>
    </div>
  );
}

```

## memo
`disabled`
`checked`
のときは属性を書かないと切り替わらない

親から渡ってきたpropsに属性を指定していないからflagが切り替わらなかった

## まとめ
styled-comonentsはめちゃくちゃ便利だがreactやるときはpropsが親からどうわたってくるのとか、そういうのをみて慣れないとダメだと改めて感じましたとさ

もっと勉強します。。。
macOS に composer をインストールする

composer は PHP のパッケージ管理ツールです。
インストールの仕方は [Composer の公式サイト](https://getcomposer.org/) に書かれていますが、 mac にインストールする場合に、公式サイトの説明だけだと動かないことがあるので、補完しつつ手順をまとめてみました。

※ この内容は古くなる可能性があります。公式の最新のドキュメントを軸に、補完的に参照してください。


## 事前準備: macOS Sierra 以降の場合

macOS 10.12 (Sierra) 以降の macOS では、 デフォルトでは OpenSSL がインストールされないようになったようです。

OpenSSL が使用できないと、 composer コマンドがライブラリのダウンロードに失敗するエラーを起こすので、手動でインストールする必要があります。

次の手順は、 Homebrew を使用したインストールコマンドです。 Homebrew 自体のインストール方法については、[Homebrew の公式サイト](https://brew.sh/)を参照してください。

Homebrew がインストールされていない場合、先にインストールします。

```
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

続いて、 Homebrew を使って OpenSSL をインストールします。

```
brew install openssl
```


## Composer をダウンロードする

[Download Composer](https://getcomposer.org/download/)ページにある次のコマンドを実行します。
この2行目のコマンドは、ダウンロードしたインストーラーが正規の内容かを確認しています。バージョンが変わるとコマンドの内容が変わることがあるので、公式の記述からコピーして実行するようにしてください。

```
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('SHA384', 'composer-setup.php') === '93b54496392c062774670ac18b134c3b3a95e5a5e5c8f1a9f115f203b75bf9a129d5daa8ba6a13e2cc8a1da0806388a8') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
php composer-setup.php
php -r "unlink('composer-setup.php');"
```

ここまでの処理が正常に完了したら、 `composer.phar` というファイルが生成されているはずです。 この `composer.phar` が composer コマンドの実体になります。

## パスを通す

ダウンロードしたままの状態では、他のディレクトリから使うときに不便です。 どのディレクトリからも composer コマンドを使えるように、 "パスを通す" 操作をします。

[公式ドキュメント](https://getcomposer.org/doc/00-intro.md#globally) で、そのコマンドが紹介されていますが、 mac では管理者権限で実行しないと失敗するようなので、 先頭に sudo を追加し、下記のコマンドで実行します。

※ このコマンドを実行すると パスワードを求められます。 macにログインするときのパスワードを入力してください。

```
sudo mv composer.phar /usr/local/bin/composer
```

これが成功すると、 `composer.phar` がなくなっていて、 `/usr/local/bin/composer` に移動されているのが確認できます。

## うまくインストールできたか確認する

新しい ターミナル を開いて、次のコマンドを実行します。

```
composer --version
```

Composer のバージョン番号が表示されたら成功しているはずです。
MethodNotAllowedHttpException（落ち着け、ルーティングが見つからないだけ）

# セッション切れ時に、POSTするアクションを叩いた時さ。。。

MethodNotAllowedHttpException
↑このエラーが起きたんだ。。。

この原因は、、、
> httpリクエスト時に発生する。
ルーティングに該当するURLが存在しない。

ということなんだね。

いやいや、ルーティングファイルに定義してあるやん！！！
って思うんだけど、セッション切れ時のリクエストの流れを抑えていこう。

## セッション切れしたときのざっくりの流れ

結論からいうと、リダイレクトが原因でこの現象が起きている、どういうことか？

1. セッション切れ時に、POSTするアクションを叩く。
2. フレームワーク側でセッション切れなので、ログイン画面へ遷移させる
3. ログインする
4. ログイン後処理で、セッション切れ前のリクエスト情報を拾って、そのルーティングにリダイレクトする

そう、４で死ぬのだ。

## なぜ死ぬ？

それは、リダイレクトしているからだ。
そう、なにを隠そう当たり前なんだけど、リダイレクトすると、METHODが、"GET"になるんだよね。
「なんでやねん！！」
確かに、そう思うけど、
ユーザーからすれば何処にリダイレクトされたかも分からないようなリソースに、POSTデータを勝手に送るなんて、、、そっちのほうが
「なんでやねん！！」

というかんじですね。

## じゃあ、どうするねん。

ケースバイケースかもですけど、
とりあえず、各プロジェクトのLoginコントローラなるものの、ログイン後処理で、
一律遷移させるページを決めて、リダイレクトさせるのがいいのかなと思います！！
atom-beautifyでphpファイル内のHTML部分まで修正する方法

[atom-beautifyの導入に成功した](https://qiita.com/spaceman_180801/items/68ee978e629c3c83d4cd)私ですが、そのままではphpファイル内のHTML部分までは整形されないことが分かりました。

#PHP部分とHTML部分を別々に整形しよう

どうやら、一括でPHP部分とHTML部分を整形することはできないようです。
なので、2回に分けて整形する必要があります。
方法は・・・

1. 普通に整形する(PHP部分が整形される)
2. 画面右下にある「PHP」という部分をクリックすると言語の一覧が出てくるので、「HTML」を選ぶとそのファイルをHTMLファイル扱いにすることができる。後は先ほどと同じように整形する(HTML部分が整形される)

以上です。

#キーバインド(ショートカットキー)に登録しよう

毎回こんな操作を行うのは面倒なので、一発でHTML扱いとして整形できるようにしましょう。
方法は・・・

1. 「C:\Users\User\\.atom」にある「keymap.cson」を開く
2. 「'atom-text-editor':」(コメントアウトされているかもしれません)の後にキーバインドを書き込む(例：「'ctrl-shift-h': 'atom-beautify:beautify-language-html'」と書き込むと「Ctrl+Shift+H」で登録されます。

以上です。
e Builder8の使用メモリ設定

うまいこと行くとIDE起動などの動作が早くなる
resin等のサーバー設定ではなくIDE本体のメモリ設定

eBuilder8ディレクトリ直下の**eBuilder8.ini**を変更する
下記の記述を探す
>
-Xms40m
-Xmx640m

これの数値を環境に合わせて増やす
設定はjvmヒープ領域の最小値(Xms)と最大値(Xmx)
一緒のほうが無駄がないので、基本は一緒にすると良い

>
-Xms1024m
-Xmx1024m

2GBぐらいでも問題ないかとは思うが、環境に合わせて
オフライン環境でDELL製NASのWindows Storage Server 2016を日本語化する

オフライン環境でDELL製NASの英語版Windows Storage Server 2016を日本語化する方法。

だいたいやることは次のファイルに記述されている。
ただし**実行してしまうとハマる。**

```
C:\> notepad C:\Dell_OEM\MUI\ja-jp.bat
```

##手順
コマンドラインから次のコマンドを実行する。

###(1)言語パック導入。

```
lpksetup /i ja-jp /r /s /p C:\Dell_OEM\MUI\ja-jp\lp.cab
```

###(2)言語設定。

```
control intl.cpl,, /f:"C:\Dell_OEM\MUI\ja-jp.xml"
```

###(3)再起動する。

```
shutdown /r /f /d p:2:4 /c "Applying Japanese Language"
```

###(4)コントロールパネルで調整。
地域　＞　管理　＞　設定のコピー
現在のユーザで下記内容が日本語や日本になっていることを確認する。
-表示言語
-入力言語
-形式
-場所

欄外の次の項目にチェックを入れてOKボタンをクリックする。
-ようこそ画面とシステムアカウント
-新しいユーザーアカウント


以上。
MariaDB Connector/J + Aurora の組み合わせでのタイムアウトについて

## 概要
MariaDB Connector/J で Aurora (jdbc:mysql:aurora://～) に接続する際は、**SocketTimeout が 10 秒**がデフォルト値であることに注意する事

## 事の発端
昨日に引き続き、MariaDB Connector/J と Aurora (MySQL) のお話
MySQL Connector/J から MariaDB Connector/J に変更し、ちょっと長めの SQL を投げた

その時、エラーが!!

```
2018-11-06 16:00:24,925 ERROR [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (default task-4) (conn=114228) Communications link failure with primary host hogehoge.ap-northeast-1.rds.amazonaws.com:3306. Connection timed out.  Driver has reconnect connection
```

なんじゃこりゃ？
と思い、MySQL Connector/J に戻すと事象が発生しない
ということは、MariaDB Connector/J に変更したからか、と

## 調べてみた
とりあえず、[公式サイト](https://mariadb.com/kb/en/library/failover-and-high-availability-with-mariadb-connector-j/)を見に行く

そしたら見事に書いてありましたよ
10 秒を超えるクエリは Exception 投げるってさ

```
Another difference is the option "socketTimeout" that defaults to 10 seconds, meaning that - if not changed - queries exceeding 10 seconds will throw exceptions.
```

ですので、`ConnectionURL` に `SocketTimeout` を設定してあげましょう (ちゃんと公式サイト読もうね)

## 仲間募集中
[弊社](https://www.nittsu-infosys.com/)ではエンジニアを募集中です。インフラからアプリ、ユーザサポートまで幅広く業務を行ってます。
https://www.nittsu-infosys.com/recruit/2019/index.html
Generative Compressionを読んだ

Santurkar, S., Budden, D., & Shavit, N. (2018). Generative Compression. In 2018 Picture Coding Symposium, PCS 2018 - Proceedings (pp. 258–262). https://doi.org/10.1109/PCS.2018.8456298

# 1.どんなもの？
画像の圧縮，復元をエンコーダとGANを用いて行う．
![image.png](https://qiita-image-store.s3.amazonaws.com/0/252474/d2ad4ca9-2c7c-84a5-9207-c86dbc1952a7.png)
# 2.先行研究と比べてどこがすごいか？
JPEGより高い圧縮率と，解像度の高い復元が可能．
# 3.技術や手法のキモはどこにあるか？
![image.png](https://qiita-image-store.s3.amazonaws.com/0/252474/c25dc41d-b553-ce37-9ad3-80b1b23522de.png)　
gがジェネレータ，dがディスクリミネータ，ｆはエンコーダ

図の上の部分がGAN．
ノイズからジェネレータが実際の画像のような画像生成するように学習し，ディスクリミネータは実際の画像かジェネレータの出力が判別できるように学習する．
![image.png](https://qiita-image-store.s3.amazonaws.com/0/252474/a7324f52-1ae7-e03e-abcd-01decc46fcd1.png)
Lossは一般的なGANのLoss


下の部分がエンコーダとデコーダ
エンコーダの学習は，出力をジェネレータに入力したときにエンコーダと同じ画像を出力できるように学習する．
![image.png](https://qiita-image-store.s3.amazonaws.com/0/252474/af98c3e0-4530-f9e2-f578-5db733363e03.png)
Conv4はImageNetで学習したAlexNet
Lossは単純に入力画像と出力画像の差のL2ノルムと，特徴抽出したときのL2ノルム両方をへらす．
単純なMSEだと高周波成分が無視される傾向にある．
# 4.どうやって有用だと検証した？
CelebA, UT Zappos50K， MIT Placesで実験
![image.png](https://qiita-image-store.s3.amazonaws.com/0/252474/71779f7c-fadd-3278-90c0-4e9a26ccac48.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/252474/1e7a5ba1-3bc2-e3e7-4c70-8ab11c1ede05.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/252474/45ab2549-30cc-94a1-b99f-5643d1649aac.png)

# 5.議論はあるか？

# 6.次に読むべき論文はあるか？
画像の圧縮の論文
Deepじゃない
Rott Shaham, T., & Michaeli, T. (n.d.). Deformation Aware Image Compression. Retrieved from https://arxiv.org/pdf/1804.04593.pdf
yolov3のモバイル化に関してわかったこと


#yolov3のモバイル化に関してわかったこと

調べていくと以下の4点がわかったのでシェアします．

・.cfgと.weightsを元に.pbを作るツールはdarkflowとMMdnnの２つある．

・しかしながらMMdnnを用いて作られた.pbは，darkflowを用いられた.pbの内容とは異なり，量子化もできず，android-studioで使えない．（darkflowを使わないといけない）

・よってdarkflowを使うしかないのだが，darkflowはyolov3にまだ対応していない．
（Layer [shortcut] not implementedというエラーが出る．つまり，yolov3から新しく導入された[shortcut]というレイヤーに対応していない．）
https://github.com/pjreddie/darknet/issues/574

・darkflowはyolov2でもtinyバージョンにしか対応していないようである．


現在yolov2-tinyにvocを学習させたものはスマホで実行できています．（精度はかなり悪いですが）



あと残された道はyolov3をtensorflowで実装したのち，pbファイルに変換して，それをfrozenして.tfliteを作ることのみなのでやっていこうと思います．


----------
2018/12/13追記
最近kerasのHDF5ファイル(.h5)から.tfliteへのconvertが公開されましたね．
サクッと試してみたいと思います．
（https://www.tensorflow.org/lite/devguide）




###P.S.
機械学習，自動運転などをメインに（たまにそれ以外も）発信しているのでぜひこのQiitaと [twitterのフォロー](https://twitter.com/ryosanworld)おねがいします．
Carlo、vue-cli、pkgを使ってvueを使ったデスクトップアプリケーションを作る



先日Carloというjavascriptでデスクトップアプリが作れるライブラリがリリースされました。
https://qiita.com/Quramy/items/d38b26a7c0007e757353

これとvueを組み合わせてみました。

<img width="1201" alt="スクリーンショット 2018-11-06 15.56.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/131625/fffda9b0-c14e-699a-1f5b-4044730eecfd.png">

# 利用するnpm
vueのテンプレート作成
https://github.com/vuejs/vue-cli

node.jsのアプリケーションをデスクトップアプリに
https://github.com/GoogleChromeLabs/carlo

デスクトップアプリのパッケージ化
https://github.com/zeit/pkg

# vue-cliのインストール
```
npm i -g @vue/cli
# OR
yarn global add @vue/cli
```

# vue-cliを使ってvueのテンプレートを作る
設定値はお好みで。詳細な内容は以下を参考に
https://qiita.com/Junpei_Takagi/items/603d44f7885bd6519de2

# carloのインストール
```
npm i carlo
# OR
yarn add carlo
```

# 作成されたvueのアプリケーションのrootディレクトリ配下に以下のindex.jsを配置

```js

const carlo = require("carlo");

(async () => {
  // Launch the browser.
  const app = await carlo.launch();

  // Terminate Node.js process on app window closing.
  app.on("exit", () => process.exit());

  // Tell carlo where your web files are located.
  app.serveFolder(__dirname);

  // Expose 'env' function in the web environment.
  await app.exposeFunction("env", _ => process.env);

  app.serveFolder(__dirname + "/dist"); // vueアプリケーションがバンドルされるディレクトリを指定
  app.serveFolder(__dirname + "/node_modules", "node_modules");

  // Navigate to the main page of your app.
  await app.load("index.html");
})();
```

# pkgをインストール
```
npm install -g pkg
# OR
yarn global add pkg
```

# package.jsonにpkgの設定を追加

```
"bin": "index.js",
"pkg": {
  "scripts": ["dist/js/*.js"],
  "assets": ["dist/**/*"]
}
```

# vueアプリをbuild
```
yarn build
```

# アプリケーションをパッケージ化
```
pkg .
```


これでlinux、mac、win用の実行ファイルが作成されます。

```
<vue createで指定したアプリ名>-linux
<vue createで指定したアプリ名>-macos
<vue createで指定したアプリ名>-win.exe
```

私の手元で上記ファイルはだいたい30MB〜40MBなので、electronなどで作成されたアプリと比べればかなりサイズは小さいのではと思います。
C/C++勉強法

# 目的
- プログラミング初心者向けにC/C++を勉強する方法を書籍を中心に説明

# 方針
- 具体的な目的となる開発対象を設定すべき
    - ユニークじゃなくていい、写真ビューワーとかテキストエディタとかでもいい
    - 何か作る前提で、参考書をざっと読む、ただしなるべく手を動かしてコードを入力する
    - 手を動かさずに参考書を読んだ場合、
        - さぁなんか作るか、ん、最初はどうやるんだっけ？で結局身についていないことに気づく
        - 良書においても、完全な解説というのは存在しなく、何らかの内容を省略している、実際に作業しながら省略された行間を補間しながら理解していないと、どこかで内容がわからなくなる
- ただ、最初は参考書や参考サイトの写経でよい
    - 写経してビルドできないときにデバッグするという行為も重要、間違えて覚えているところが明確化されることがよくある
    - 写経ミスのデバッグもかなり重要、決して妥協してコピペしないこと、自分が書いたコードとオリジナルのコードを必死に見比べていると、不思議と中身を覚えます。
    - むしろ、たまには写経ミスしたほうがいい

- つまり手を動かしたり、悩みながら、同じ内容を何回も入力して、結局はある程度時間をかけないと身につかないということ

# 手順
- １．まずはC++を全体的に説明している本を読む、その次にポインタ解説が詳しい本を読む 
- ２．このタイミングで、自分で作りたいアプリを書き始める、わからないところはwebや読んだ参考書で調べて、なるべくメモを残しておく
- ３．ある程度アプリが完成したところで、中級者向けの本を読む、読みながらリファクタリングしていく

# 参考書籍
- 初心者向け
    - C++全体把握用
        - http://amzn.asia/d/7aJBOQD
    - ポインタ勉強用
        - http://amzn.asia/d/6uz1uD1
- 中級者向け
    - Effective本（C++のベストプラクティス集）
        - http://amzn.asia/d/0ZiQuJK
        - http://amzn.asia/d/1RxfogC
        - http://amzn.asia/d/dTjY3lB
    - 作法
        - http://amzn.asia/d/gwFDcey
    - オブジェクト指向
        - http://amzn.asia/d/00rcanh
    - ソフトウェアエンジニアの心得
        - http://amzn.asia/d/6F1VokD
        - http://amzn.asia/d/fwljFFy
        - http://amzn.asia/d/39SingB
- 上級者
    - 高速化
        - http://amzn.asia/d/6D6x0D2
    - 開発技法
        - http://amzn.asia/d/dNSkwoo
Railsのwhere検索をまとめてみた

サンプルデータはこんな構造

```ruby
<User:0x00007fc4bfb0a9d8
 id: 1,
 name: "千葉 優花",
 gender: "male",
 height: 150,
 profile: nil,
 created_at: Tue, 06 Nov 2018 15:03:40 JST +09:00,
 updated_at: Tue, 06 Nov 2018 15:03:40 JST +09:00>
```

### 演算子

#### =

```ruby

> User.where(height: 150)
=>   User Load (0.4ms)  SELECT "users".* FROM "users" WHERE "users"."height" = $1  [["height", 150]]
```

#### <=, =>

```ruby
> User.where("height > ?", 150)
=>   User Load (1.0ms)  SELECT "users".* FROM "users" WHERE (height > 150)
```

```ruby

> User.where("height <= ?", 150)
SELECT "users".* FROM "users" WHERE (height <= 150)
```

#### != <>

```ruby
> User.where.not(gender: 'male')
=>   User Load (0.3ms)  SELECT "users".* FROM "users" WHERE "users"."gender" != $1  [["gender", "male"]]
```

#### AND

```ruby
User.where('height > ? and gender = ?', 170, 'male')
=>   User Load (1.4ms)  SELECT "users".* FROM "users" WHERE (height > 170 and gender = 'male')
```

```ruby
> User.where('height > ?', 170).where(gender: 'male')
=>   User Load (0.4ms)  SELECT "users".* FROM "users" WHERE (height > 170) AND "users"."gender" = $1  [["gender", "male"]]
```

#### OR

```ruby
> User.where('height > ? or gender = ?', 170, 'male')
=>   User Load (0.6ms)  SELECT "users".* FROM "users" WHERE (height > 170 or gender = 'male')
```

```ruby
> User.where('height > ?', 170).or(User.where(gender: 'male'))
=>   User Load (0.8ms)  SELECT "users".* FROM "users" WHERE ((height > 170) OR "users"."gender" = $1)  [["gender", "male"]]
```

#### BETWEEN a AND b

```ruby
> User.where(height: 170..180)
=>   User Load (0.3ms)  SELECT "users".* FROM "users" WHERE "users"."height" BETWEEN $1 AND $2  [["height", 170], ["height", 180]]
```

#### IN

```ruby

> User.where(name: ["千葉 優花", "金子 茜", "山田 優奈"])
=>   User Load (1.0ms)  SELECT "users".* FROM "users" WHERE "users"."name" IN ($1, $2, $3)  [["name", "千葉 優花"], ["name", "金子 茜"], ["name", "山田 優奈"]]
```

#### LIKE

```ruby
> User.where("name LIKE ?", "%子%")
=>   User Load (2.4ms)  SELECT "users".* FROM "users" WHERE (name LIKE '%子%')
```

```ruby
> User.where("name LIKE ?", "_田%")
=>   User Load (0.4ms)  SELECT "users".* FROM "users" WHERE (name LIKE '_田%')
```
情報学と情報科学とコンピュータサイエンス

日本語で

- 情報学
- 情報科学
- 情報工学
- 計算機科学
- コンピュータ科学
- コンピュータサイエンス
- 情報理工学

といった場合、情報科学と情報工学のscienceかengineeringかの意識の違いを除けばほぼ似たような意味を持つ。
一方で、これを英語にするとどうだろうか？

- informatics
- information science
- information engineering
- computer science
- computer science
- computer science
- information science and engineering

こうなるが、このうちアメリカの英語話者にとって日本語と同じような意味で捉えられているのはcomputer scieceであり、他はあまり使わない表現であるか、別の意味で捉えられてしまうらしい。
この辺りの事情は「[加藤淳一, 日本における information science についての構想―序論：米国との比較―](http://www.nul.nagoya-u.ac.jp/libst/pdf/annals_06_07.pdf)」にまとめられている。

一方で、他の主要な科学の発達した国の言語ではどうなっているかというと、

| 言語 | 名称 | 直訳 |
|:--:|:-:|:-:|
| 英語 | computer science | 計算機科学 |
| ドイツ語 | Informatik | 情報学 |
| フランス語 | informatique | 情報学 |
| イタリア語 | informatica | 情報学 |
| スペイン語 | ciencias de la computación | 計算の科学 |
| ロシア語 | информатика | 情報学 |
| 中国語 | 计算机科学 | 計算機科学 |

ということで各国語間で直訳が通じない混乱状態にある。

日本の主要大学では（大学院の）名称はどうなっているかというと、

| 大学 | 日本語名 | 英語名 | 英語名直訳 |
|:--:|:-:|:-:|:-:|
| 東大 | 情報理工学 | information science and technology | 情報科学と情報技術 |
| 阪大 | 情報科学 | information science and technology | 情報科学と情報技術 |
| 北大 | 情報科学 | information science and technology |　情報科学と情報技術 |
| 九大 | システム情報科学 | information science and electrical engineering | 情報科学と電子工学 |
| 東北大 | 情報科学 | information sciences | 情報科学 |
| 京大 | 情報学 | informatics | 情報学 |
| 名大 | 情報学 | informatics | 情報学 |
| 東工大 | 情報理工学 | computing | 計算学 |
| 筑波大 | システム情報工学 | systems and information engineering | システムと情報の工学 |

（[東工大だけ謎システムである](https://www.titech.ac.jp/education/pdf/relationship_organization_ja.pdf)）となっており、「computer science」または「計算機科学」でもって情報系の学問を代表して表すことは日本の主流ではない。上で一番剛直なのは東北大で誤解を恐れずに情報科学＝information science(s)としている。

情報理論・物理を専門としてる身からすると、自己紹介のときに、「私の専門は計算機科学です」とは死んでも言いたくない。情報理論は計算機の学問ではない。しかし、英語のcomputer scienceは情報理論を含むことになっている。しかし私は計算機を研究してるわけではない。

日本語でいうところの「情報科学」の意味でもって「コンピュータ科学」と呼ぶのはやめてもらいたい。もちろんプログラミング言語の性質の研究を指してコンピュータ科学と呼ぶのはおかしくない。英語以外で「計算機科学」という表現は主流とは言い難いし、学問の描像に対して的を得ていない言葉だと感じる。
Vue Fes Japan 2018セッション資料まとめ

# Vue Fes Japan 2018
![スクリーンショット 2018-11-06 15.28.56.png](https://qiita-image-store.s3.amazonaws.com/0/27211/ccf6d3e6-c7e4-cc8c-f646-c73f9a2b9af0.png)

Vue.jsの祭典「VueFesJapan2018」でのセッションおよび公開されている資料の一覧です。
資料が公開されていない or 見つけられなかったものはタイトルのみ記載しています。見落としているものがありましたらコメントなどでお知らせください。

#### 概要
- 日時：2018/11/3(日) 10:20~17:00
- 場所：秋葉原UDX 4F
- [Vue Fes Japan 2018](https://vuefes.jp/)
- [当日スライドまとめ](https://twitter.com/i/moments/1059101718833639424)
- ハッシュタグ： [#vuefes](https://twitter.com/search?q=%23vuefes)

#### タイムテーブル
![スクリーンショット 2018-11-06 15.10.40.png](https://qiita-image-store.s3.amazonaws.com/0/27211/e9ebfb6c-770b-9cab-89f5-62474ff3a32f.png)

#### スライド

| 時間              | 会場A　　             | 会場B              |
|:-----------------|:------------------|:------------------|
| 13:00~           | [Next-level Vue Animations](https://slides.com/sdrasner/vuefes-japan#/)  | [Vue.jsとWeb Componentsのこれから](https://speakerdeck.com/takanorip/vue-fes-japan) |
| 13:50~           | [Vue Designerデザインと実装の統合](https://slides.com/ktsn/vue-fes-vue-designer)  | [Unit testing a Vuex store](http://slides.com/eddyerburgh/testing-a-vuex-store#/) |
| 14:40~           | [Atomic Designとデザインと実装の狭間](https://speakerdeck.com/ts020/vuefes)  | Nuxt.js 2.0 |
| 15:30~           | [A deep dive in SFC compilation](https://github.com/znck/talks/tree/master/2018-11-03-deep-dive-into-sfc-compilation)  | [noteをNuxt.jsで再構築した話](https://speakerdeck.com/fukuiretu/notewonuxt-dot-jsdezai-gou-zhu-sitahua) |
| 16:20~           | [Vue CLI 3 and its Graphical User Interface](https://slides.com/akryum/vue-cli-18-3-jp#/) | [1年間単体テストを書き続けた現場から送るVue Componentのテスト](https://speakerdeck.com/tsuchikazu/vue-component-test) |
スタティックルート設定

この記事ではルータのスタティックルーティング設定についてメモメモ

#そもそもルーティングって何？
ルーティングはあるネットワークからあるネットワークに接続するための最適な経路を設定するものと認識しています。

例えば以下の図
![image.png](https://qiita-image-store.s3.amazonaws.com/0/290123/61d5cb72-ab74-9550-ee47-15f8f68eff14.png)

PC0がPC1にRouter0とRouter1を介して接続しています。
それぞれの設定は以下です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/290123/47300436-cdd2-a4ec-06f2-25d9084e5a20.png)

|デバイス/インターフェース  |IPアドレス  |サブネットマスク  |デフォルトゲートウェイ
|---|---|---|---|
|PC0  |192.168.0.10  |255.255.255.0  |192.168.1.254 |
|Router0-gigabitEthernet 0/0/0  |192.168.0.254  |255.255.255.0  |
|Router0-gigabitEthernet 0/0/1  |192.168.1.254  |255.255.255.0  |
|Router1-gigabitEthernet 0/0/0  |192.168.2.254  |255.255.255.0  |
|Router1-gigabitEthernet 0/0/1  |192.168.1.253  |255.255.255.0  |
|PC1  |192.168.2.10  |255.255.255.0  |192.168.2.254 |


しかしこのままだとPC0はPC1にデータを送信することができません。
なぜならroute1が192.168.2.10に接続するための経路が設定されていないからです。

ルータには宛先に接続するための経路一覧、つまりルーティングテーブルというものが存在し、このルーティングテーブルに接続先の経路を登録する必要があります。


#ルーティングテーブルの登録
※ここではCLI(Command Line Interface)でのルーティングテーブル登録方法を記述

ルーティングテーブルの登録はCLIのグローバルコンフィグレーションモードより
「ip route」コマンドを入力する。

■Router1

```
Router1>enable
Router1#configure terminal
Router1(config)#ip route 192.168.2.0 255.255.255.0 192.168.1.253
```
「192.168.2.0/24」のセグメントに接続したい場合は「192.168.1.253」を経由してくれ
という登録をしています。

■Router2

```
Router1>enable
Router1#configure terminal
Router1(config)#ip route 192.168.0.0 255.255.255.0 192.168.1.254
```
「192.168.0.0/24」のセグメントに接続したい場合は「192.168.1.254」を経由してくれ
という登録をしています。


これでPC0とPC1でお互いデータのやり取りができるようになります。
[Ruby]Procオブジェクトについて

Rubyの「Procオブジェクト」について学んだことをまとめてみました。本記事よりもより正確かつ詳細な内容が必要な場合は、巻末に記載の参考文献やリファレンスマニュアルなどをご参照ください。

## Procオブジェクトとは
Procオブジェクトとは**ブロックをオブジェクト化したProcクラスのインスタンス**です。

## Procオブジェクトの作り方
Procオブジェクトの作り方は複数あります。

```ruby
# 作り方その１ （Proc.new）
proc_sample1 = Proc.new "ブロック"

# 作り方その2 （procメソッド）
proc_sample2 = proc "ブロック"

# 作り方その３ （"->"）
proc_sample3 = ->"引数のリスト" "引数を使って実行する処理の内容"

# 作り方その４ （lambdaメソッド）
proc_sample4 = lambda "ブロック"
```

## Procオブジェクトの使い方
### Procオブジェクトを実行
Procオブジェクトはブロックのオブジェクトなので、そのままでは実行されません。Procオブジェクトを実行する方法は複数あります。

```ruby
# Procオブジェクトを生成
add_proc = ->(a, b) { a + b }

# 実行方法その１ （callメソッド）
add_proc.call(1, 2)  #=> 3

# 実行方法その２ （yieldメソッド）
add_proc.yield(1, 2)  #=> 3

# 実行方法その３ （".()"）
add_proc.(1, 2)  #=> 3

# 実行方法その４ （"[]"）
add_proc[1, 2]  #=> 3
```

### Procオブジェクトをブロックの代わりとして渡す
引数にブロックを受け取るメソッドに対して、ブロックの代わりにProcオブジェクトを渡すことができます。

```ruby
# 引数にブロックを受け取るメソッドを定義
def greeting(&block)
  puts 'おはよう'
  text = block.call('こんにちは')
  puts text
  puts 'こんばんは'
end

# Procオブジェクトを生成
shout_proc = ->(text) { text + '!' * 3 }

# Procオブジェクトをブロックの代わりに渡す
greeting(&shout_proc)
#=> おはよう
#   こんにちは!!!
#   こんばんは
```

### Procオブジェクトを普通の引数として渡す
Procオブジェクトを普通の引数としてメソッドに渡すこともできます。

```ruby
# 普通の引数を受け取るメソッドを定義
def greeting(arrange_proc)
  puts 'おはよう'
  text = arrange_proc.call('こんにちは')
  puts text
  puts 'こんばんは'
end

# Procオブジェクトを生成
shout_proc = Proc.new { |text| text + '!' * 3 }

# Procオブジェクトを普通の引数として渡す
greeting(shout_proc)
#=> おはよう
#   こんにちは!!!
#   こんばんは
```

## Proc.newとlambdaの違い
Procオブジェクトの作り方その１およびその２で生成したProcオブジェクト（ここでは"Proc.new"と呼びます）と、その３およびその４で生成したProcオブジェクト（ここでは"lambda"と呼びます）は、挙動が少し異なります。

### 違いその１ 〜引数の扱い〜
lambdaはProc.newよりも引数のチェックが厳密です。

```ruby
# Proc.newは 「想定している引数の数」 と 「実際に渡された引数の数」 が不一致でも動作する
add_proc = Proc.new { |a, b| a.to_i + b.to_i }
add_proc.call(1)  #=> 1 （不足している引数は nil として扱われる）
add_proc.call(1, 3, 5)  #=> 4 （３つ目の引数は無視される）

# lambdaは 「想定している引数の数」 と 「実際に渡された引数の数」 が不一致の場合はエラーとなる
add_proc = ->(a, b) { a.to_i + b.to_i }
add_proc.call(1)  #=> ArgumentError: wrong number of arguments (given 1, expected 2)
add_proc.call(1, 3, 5)  #=> ArgumentError: wrong number of arguments (given 3, expected 2)
```

### 違いその２ 〜return/breakの挙動〜
Proc.newやlambdaの中でreturn/breakを使った場合、以下のような挙動の違いがあります。

|          | return               | break                |
|:---------|:---------------------|:---------------------|
| Proc.new | メソッドを抜ける          | 例外が発生する          | 
| lambda   | lambda内の処理から抜ける　　| lambda内の処理から抜ける　　|

厳密にはもう少し違いはあるのですが、詳しく知りたい方は以下を参照ください。
・[returnやbreakを使ったときのProc.newとラムダの挙動の違い](https://qiita.com/jnchito/items/83410c0cda446efea582)
・[Ruby リファレンスマニュアル ](https://docs.ruby-lang.org/ja/latest/doc/spec=2flambda_proc.html#lambda_proc)

上記挙動の違いはややこしいので、Proc.newやlambdaの中ではできるだけreturn/breakを使わないようにするのが賢明のようです。

## 参考文献
- [プロを目指す人のためのRuby入門 言語仕様からテスト駆動開発・デバッグ技法まで ](https://www.amazon.co.jp/プロを目指す人のためのRuby入門-言語仕様からテスト駆動開発・デバッグ技法まで-Software-Design-plusシリーズ/dp/4774193976)
Windows10にLibreOfficeをインストールする方法

- 環境
    - Windows10 64bit
- インストールしたLibreOffice : 6.0.7

# 1. msiをダウンロードする
[LibreOfficeのサイトからmsiをダウンロードする](https://ja.libreoffice.org/download/libreoffice-stable/)
ダウンロードした `LibreOffice_6.0.7_Win_x64.msi` を押下してインストールを開始する。

# 2. インストールする
1. ![image.png](https://qiita-image-store.s3.amazonaws.com/0/159761/94fdc198-a5de-f3ec-e960-f7fdebaf6e86.png)
2. ![image.png](https://qiita-image-store.s3.amazonaws.com/0/159761/2e65afb7-43ea-b5ae-11ca-0d662df88045.png)
3. ![image.png](https://qiita-image-store.s3.amazonaws.com/0/159761/0a8845a1-0c0d-e427-39f3-489ec11f0c7c.png)
    - インストールする場所を指定する
4. ![image.png](https://qiita-image-store.s3.amazonaws.com/0/159761/920f1770-4230-2944-f79e-e23793d0a97a.png)
5. ![image.png](https://qiita-image-store.s3.amazonaws.com/0/159761/5f079f7a-0f8b-03cf-e5bb-91a4dd21601b.png)
6. ![image.png](https://qiita-image-store.s3.amazonaws.com/0/159761/734039ce-3a0e-1dc5-88a7-0806c075171a.png)
7. ![image.png](https://qiita-image-store.s3.amazonaws.com/0/159761/5e939a20-6a0e-2cfc-6aa9-ae83d01b3146.png)
    - 残念だがショートカットがなくても生きていける
8. ![image.png](https://qiita-image-store.s3.amazonaws.com/0/159761/c0745f83-dfeb-440e-b072-926b1fc72698.png)
IIS ASP.NET ヘッダーからバージョンの削除　

##環境
windows server 2008 R2
IIS 8.0




##Serverを消す

```Global.asax.cs
protected void Application_PreSendRequestHeaders(){
    Response.Headers.Remove("Server");
}
```

##X-AspNetMvc-Versionを消す

```Global.asax.cs
protected void Application_Start(){
    MvcHandler.DisableMvcResponseHeader = true;
    AreRegistration.RegisterALLAreas();

}
```

##X-AspNet-Versionを消す

```Web.config
<system.web>
:
<httpRuntime enableVersionHeader ="false" />
:
</system.web>
```




##X-Powered-Byを消す

```Web.config
<system.webServer>
:
<httpProtocol>
 <customHeaders>
  <remove name ="X-Powered-By" /> //addで任意のヘッダを追加できる(X-Frame-Optionsなど)
 </customHeaders>
<httpProtocol>
:
</system.webServer>
```


反映されない場合はIISを再起動。


HTTP層で管理されているものがGlobal.asax.cs、
Webアプリケーション層で管理されているものがWeb.configを編集
という認識であっているのか...
文字化けしたファイルをvimのコマンドモードから変換してみる

- iso-2022-jpのファイルをutf-8に変換
- 適宜，文字コードは書き換え

```vim:vim-command-mode
:e ++enc=iso-2022-jp | set fenc=utf-8 | wq
```

- 本当はもっと簡単にする方法がありそうなものだが，スクリプト化するとか？
- 個人的にはここくらいまでの半自動くらいが好きだけど
- コメントあればお願いします
HighSierraからMojovaにアップグレードしたらtex動かなくなった

Mojovaにアップグレードしたらtex動かなくなってた。
Sierraの時は少し苦戦したので嫌な思い出が蘇ったが、すぐに解決したので共有のためメモ。

# エラー内容
``` shell
dyld: Symbol not found: _OBJC_IVAR_$_NSTextViewIvars.sharedData
  Referenced from: /Applications/Xcode.app/Contents/SharedFrameworks/DVTDocumentation.framework/Versions/A/../../../../SharedFrameworks/DVTKit.framework/Versions/A/DVTKit
  Expected in: /System/Library/Frameworks/AppKit.framework/Versions/C/AppKit
 in /Applications/Xcode.app/Contents/SharedFrameworks/DVTDocumentation.framework/Versions/A/../../../../SharedFrameworks/DVTKit.framework/Versions/A/DVTKit
make: error: unable to locate xcodebuild, please make sure the path to the Xcode folder is set correctly!
make: error: You can set the path to the Xcode folder using /usr/bin/xcode-select -switch
```

# 解決策
純粋にxcodeのバージョンがMojovaに対応していないのが原因。  
AppStoreでxcodeアプデしたら治りました。
ここを改善してほしい eBuilder

ここに書くのはちょい違うけど

#１．resinサーバー起動オプションの初期値

xmx=512mが初期値だけど、これだとメモリが足りなくてresin(intra-mart)が起動できないときが多い
最近のバージョンだとこれでは起動しないのではないか。。。
知らないとハマって無限に時間が消費されるし、知っていてもいちいち設定変更がめんどくさい
デフォルト値が xmx=2048m ぐらいでも問題ないのではなかろうか
これは簡単に治るはずなので、直してほしい

#２．jsエディタ let const宣言

let
const
でエラー扱いになる。が、実際には使える
エラーになるせいでcheckstyleを設定しても誰も見向きもしなくなる
直すのは難しい感じもするけど、頑張ってくれたら嬉しいなぁ
intra-mart製品ソースを覗いてみるとletを多用しているけど、
intra-mart製品開発現場ではeBuilder使わないで別のIDE使ってるのかな


#３．jsエディタ インデント設定

こいつを見てくれ、デフォルトだとこんなんだ
![いけてない.gif](https://qiita-image-store.s3.amazonaws.com/0/22172/efcb66c1-ed95-372b-837c-cdea2f6a97e2.gif)


閉じかっこ **}** はなんでこんな場所に置かれるのだ
こいつをインデントしなおすのがとても大変だ
ソース記述後にフォーマッタを掛ける方法もあるが、むやみやたらに設定すると既存ソースも変更しまくって差分を追うのがきつくなる

カスタマイズするとマシになるのかもしれないが、そもそもこんなおかしな動きを
デフォルト設定にしないで欲しい