OmniAICreator/Qiita-1.07M huggingface dataset:
CORESERVERエイリアスメモ

## エイリアスとは
コマンドの省略形

## エイリアスまとめ
phpのバージョンは適宜変更のこと(サーバー仕様は[こちら](https://www.value-domain.com/coreip.php))
### composer
#### 導入

```bash

curl -sS https://getcomposer.org/installer | php
/usr/local/bin/php71cli composer.phar
```

#### エイリアス
これで普通のcomposerコマンド打てる

```bash

alias composer='/usr/local/bin/php71cli ~/public_html/composer.phar'
```

### Laravel

#### 導入

```bash
composer create-project --prefer-dist laravel/laravel project-name "5.5.*"
```

#### エイリアス
ほかのコマンドだと上手くいかない?

```bash
alias laravel='composer create-project --prefer-dist laravel/laravel'
```

### git
#### 導入
(元から入ってる)

#### エイリアス
個人的な好みが含まれる

```bash

# git clone
alias gc='git clone'
# git add
alias ga='git add'
# git init
alias gi='git init'
# git commit
alias gc='git commit'
# git push
alias gp='git push'
```
Rubyの基本記述の仕方〜その3〜 メソッドとは

メソッドとは
-

操作や処理をまとめたひとかたまりのもの。
名前をつけておくことで、一連の操作や処理を一言で呼び出すことができて便利です。


メソッドの定義の仕方
-

def「メソッド名」　〜　endの記法でメソッドを書くことができます。

```ruby.qiita.rb
def morikuma
 puts "はじめまして、もりくまです"
 puts "プログラミングを学んでいます" 
end
```
上で定義したメソッド「morikuma」と打って、処理をさせると定義した操作が実行されます。

```ruby.qiita.rb
morikuma
```
とだけ記述すれば

```
はじめまして、もりくまです
プログラミングを学んでいます
```
定義された操作が実行されます。

引数とは
-
メソッドに対して、文字列や数を渡すことができます。
このときの渡すデータのことを指して「引数」と呼びます。

```
morikuma(100)
```
下の例のように、「メソッド名」（引数）と記述します。

引数を要求するメソッドの書き方
-
def 「メソッド名」（引数） 〜 endと記述すると


```ruby.qiita.rb
def family(member)
 puts member
end
```
メソッドを呼び出す際に、引数を渡してあげないとエラーが返ってきます。

```ruby.qiita.rb
◯　family(5)
✕　family
```
キーワード引数
-

メソッドの引数として、キーワードとともに定義することもできます。

```ruby.qiita.rb
def fruits(apple:, orange:, grape:)
　puts "りんごが#{:apple}個、オレンジが#{:orange}個、ブドウが#{:grape}個あります"
end
```

このようなメソッドを定義した場合、呼び出す際に下記のような書き方をします。

```ruby.qiita.rb
fruits(apple: 5, orange: 3, grape: 4) 
```

このように、呼び出す際に同時に引数を渡すことでメソッドで定義された操作が正しく処理されます

```
りんごが５個、オレンジが３個、ブドウが４個あります
```

今日はこのあたりで失礼します。

参考サイト
-



「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典　メソッド(method)
https://wa3.i-3-i.info/word1906.html
Haskell でコンパイル時、 clang がエラーを吐いて失敗するときの対処法

# 背景
すごいH本(すごいHaskell楽しく学ぼう!) の `8.2 Hello, World!` で .hs ファイルをコンパイルする説明があるが、実際にやってみたらエラーになって困った。


# 問題

```bash
$ cat helloworld.hs
main = putStrLn "hello, world"
```
というようにファイルを用意した状態で、以下のコマンドを打つと、エラーになる。

```bash
$ ghc --make hello
[1 of 1] Compiling Main             ( hello.hs, hello.o )
clang: error: unknown argument: '-no-pie'
`gcc' failed in phase `Assembler'. (Exit code: 1)
```


# 対策

まず root 権限になる。

```bash
$ sudo su - root
```

次に、`/Library/Frameworks/GHC.framework/Versions/8.4.3-x86_64/usr/lib/ghc-8.4.3/settings` ファイルをいじる。

```bash
$ vim /Library/Frameworks/GHC.framework/Versions/8.4.3-x86_64/usr/lib/ghc-8.4.3/settings
```

以下のように変更する


```txt:before
...省略...
, ("C compiler supports -no-pie","YES")
...省略...
```

```txt:after
...省略...
, ("C compiler supports -no-pie","NO")
...省略...
```


# gcc/ghc のバージョン

gcc のバージョンは、

```bash
$ gcc -v
Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 9.0.0 (clang-900.0.39.2)
Target: x86_64-apple-darwin16.7.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin
```

ghc のバージョンは、

```bash
$ghc -v
Glasgow Haskell Compiler, Version 8.4.3, stage 2 booted by GHC version 8.2.2
Using binary package database: /Library/Frameworks/GHC.framework/Versions/8.4.3-x86_64/usr/lib/ghc-8.4.3/package.conf.d/package.cache
package flags []
loading package database /Library/Frameworks/GHC.framework/Versions/8.4.3-x86_64/usr/lib/ghc-8.4.3/package.conf.d
wired-in package ghc-prim mapped to ghc-prim-0.5.2.0
wired-in package integer-gmp mapped to integer-gmp-1.0.2.0
wired-in package base mapped to base-4.11.1.0
wired-in package rts mapped to rts
wired-in package template-haskell mapped to template-haskell-2.13.0.0
wired-in package ghc mapped to ghc-8.4.3
wired-in package dph-seq not found.
wired-in package dph-par not found.
*** Deleting temp files:
Deleting:
*** Deleting temp dirs:
Deleting:
ghc: no input files
Usage: For basic information, try the `--help' option.
```

# 参考
こちらを参考にした。
https://stackoverflow.com/questions/50386787/cabal-install-gcc-failed-in-phase-c-compiler/50419101#50419101
UINavigationBarをスクロールで表示/非表示させる方法【TableView】【ライブラリなし】


### 要件(ゴール)
・tableViewで一覧から詳細へ遷移できる
・一覧で下へスクロールした際はNavigationBarを非表示/上へスクロールした際はNavigationBarを表示
・詳細ではNagigationBarを隠さない
・詳細から一覧へ戻った際は、NavigationBarの表示/非表示の状態が維持されている

### 背景
http://animane.hatenablog.com/entry/2016/02/04/144458
で紹介されているようなライブラリもあるのだが、
いざプロジェクトに組み込んで見ると、思うような挙動にならなかったり、
swiftにそもそも対応してなかったりした。
調べてみると自力で実装でもそんなに大変ではなさそうなので、
実装してまとめて記事にしました。

### 環境
OS: iOS9~iOS12まで確認済
言語:Swift4.2

### 前提
tableViewで一覧から詳細へ遷移できるプロジェクトがあること

### サンプルプロジェクト
こちらを手元で確認していただけながら、読み進めていただければと思います。
https://github.com/suzuhiroruri/scrollHidingNavbar

### 手順

下記変数を入れる

```swift:MasterViewController.swift
///  スクロール開始地点
var scrollBeginPoint: CGFloat = 0.0

/// navigationBarが隠れているかどうか(詳細から戻った一覧に戻った際の再描画に使用)
var lastNavigationBarIsHidden = false
```
<br>

スクロール開始時にスクロール開始地点を習得

```swift:MasterViewController.swift
func scrollViewWillBeginDragging(_ scrollView: UIScrollView) {
    scrollBeginPoint = scrollView.contentOffset.y
}
```
<br>
scrollViewDidScrollでスクロール量を検知

```swift:MasterViewController.swift
func scrollViewDidScroll(_ scrollView: UIScrollView) {
    let scrollDiff = scrollBeginPoint - scrollView.contentOffset.y
    updateNavigationBarHiding(scrollDiff: scrollDiff)
}
```
<br>
navigationBarの表示/非表示を更新メソッド
boundaryValueはスクロールの閾値なのでお好みで設定してください。

```swift:MasterViewController.swift
func updateNavigationBarHiding(scrollDiff: CGFloat) {
    let boundaryValue: CGFloat = 0.0

    /// navigationBar表示
    if scrollDiff > boundaryValue {
        navigationController?.setNavigationBarHidden(false, animated: true)
        lastNavigationBarIsHidden = false
        return
    }

    /// navigationBar非表示
    if scrollDiff < -boundaryValue {
        navigationController?.setNavigationBarHidden(true, animated: true)
        lastNavigationBarIsHidden = true
        return
    }
}
```
<br>
詳細画面から戻ってきた際にNavigationBarの表示状態を以前の状態に更新

```swift:MasterViewController.swift
override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    if lastNavigationBarIsHidden {
        self.navigationController?.setNavigationBarHidden(true, animated: false)
    }
}
```
<br>


デフォルトだと詳細遷移の際、NavigationBarが非表示になってしまうので、表示させる

```swift:MasterViewController.swift
override func viewDidLoad() {
    super.viewDidLoad()
    navigationController?.setNavigationBarHidden(false, animated: false)
}
```
<br>
tableViewのTopをSafeAreaに設定するとiOS10系の端末でtableの表示がずれてしまう場合があるので、
topをViewのTopにする。
またそれだとiPhoneX系の端末でtableViewをスクロールした時にSafaAreaにかぶるので、
SafeAreaを隠すビューを入れる。
![スクリーンショット 2018-09-28 17.19.59.png](https://qiita-image-store.s3.amazonaws.com/0/13599/a053763c-f613-ba26-08c0-dcab1b5aa6c5.png)


### あとがき
```
navigationController?.hidesBarsOnSwipe = true
```
https://qiita.com/ken0nek/items/9e293bd7d730191cdbc5
で動かないこともないんですけど、
微妙なスクロールだとSwipeと検知されないこともあったり、
OS?機種?によってNavigationBarが表示できないこともあったので、
今回はスクロールベースで検知してNavigationBarの表示を切り替えるようにしました。
訂正等ありましたら、よろしくお願いします。
SQLServer: インデックスがどのクエリで使われているか調査する方法

特定のインデックスがどのクエリで使われているのかを調べる方法です。

AdventureWorkds2014データベースに対して実験してみました。

#1. クエリを実行する
Person.Addressテーブルに対してクエリを実行します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/148310/f4314c47-4a71-dc59-42db-e311ccfad188.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/148310/e2d8e7eb-30b1-f79e-a19a-04b4e83249b7.png)

実際の実行プランを確認し、インデックス[IX_Address_StateProvinceID]が使用されていることが分かります。

#2. インデックスを使用したクエリを探す

DMV(動的管理ビュー / Dynamic Management View)を使います。

先ほど使われたインデックス[IX_Address_StateProvinceID]を検索条件に指定して、先ほど実行したクエリが取得できれば成功です。

```sql
SELECT TOP 1000
	[Average CPU used(ms)] = total_worker_time / qs.execution_count / 1000
	,[Total CPU used(ms)] = total_worker_time / 1000
	,[Execution count] = qs.execution_count
	,[Individual Query] = SUBSTRING(qt.TEXT, qs.statement_start_offset / 2, (
			CASE 
				WHEN qs.statement_end_offset = - 1
					THEN LEN(CONVERT(NVARCHAR(MAX), qt.TEXT)) * 2
				ELSE qs.statement_end_offset
			END - qs.statement_start_offset
			) / 2)
	,[Parent Query] = qt.TEXT
	,DatabaseName = DB_NAME(qt.dbid)
	,last_execution_time
	,creation_time
	,[Total Duration(ms)] = total_elapsed_time / 1000
	,[Average Duration(ms)] = total_elapsed_time / qs.execution_count / 1000
  ,qp.*
  ,cast(qp.query_plan as nvarchar(max))
FROM sys.dm_exec_query_stats qs
OUTER APPLY sys.dm_exec_sql_text(qs.sql_handle) AS qt
OUTER apply sys.dm_exec_query_plan(plan_handle) as qp
where cast(qp.query_plan as nvarchar(max)) like '%IX_Address_StateProvinceID%'
option (recompile)
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/148310/8c4bad40-ca9c-7eb3-fa50-abb1ebb5c905.png)

無事に取得できました。
ポイントは、検索述語に

```sql
where cast(qp.query_plan as nvarchar(max)) like '%IX_Address_StateProvinceID%'
```

と指定している点です。
こちらは、キャッシュされたクエリプランのXMLをテキストに変換したうえで、インデックス名でlike検索しています。

クエリプランのどの箇所にヒットしたのか、一部を抜粋します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/148310/ffcade55-39b8-0800-5865-aa079d6f3776.png)

このように、クエリプラン内に実行時に使われたインデックス名が書かれているため、like検索でヒットしました。

注意点としては、キャッシュに残っているクエリプランのみが取得できるため、キャッシュから削除されたり、サーバ再起動されるとリセットされます。そのため今回のクエリを実行して取得できたクエリが、特定のインデックスを使っている全クエリ、とまでは言えません。

とはいえ大まかな傾向をつかみたいときは便利だと思います。
ISUCON8予選で生き残れなかった話

# ISUCONとは
運営が用意した仮想のwebサービスをどれだけ早くできるかを競うよ！
詳しくは[公式](http://isucon.net/archives/52388756.html)を見たほうが早い

# チームメンバー
チーム名：typoの達人

* waku ([@waku91304284](https://twitter.com/waku91304284))
* でるた ([@0Delta](https://twitter.com/0Delta))
* ディケイド ([@akihiro_k2k](https://twitter.com/akihiro_k2k))

# 事前準備

* slackのワークスペースを使ってメンバーと会話、ボトルネックの解析を集約
* VMを4つ立てて各自で自習
* zabbixでの監視準備
* ansible,gitの準備
* [kataribe](https://github.com/matsuu/kataribe) でのログ解析の準備
* isucon6, 7の過去問を解いてみる

# 当日の流れ
流れ自体は[でるた氏の書いた記事](https://qiita.com/0Delta/items/fbbdeb57b2297377dec6)があるので割愛
インフラ部分の準備はディケイド氏が担当
コードの改修は主にでるた氏が担当、自分とペアプロ状態になる

# 反省点
* slow_logの解析ェ...
    * はじめに手をつけるべきだった
* 開始時点で公式のマニュアルをちゃんと読む
    * アプリケーションの切り替えやDBのバックアップの方法とか一通り見てからやらないと辛い
* デプロイ環境の準備
    * 途中でディケイド氏がjenkinsを立ててくれたけど上手く活用できずに手動デプロイのまま
    => 事前準備で立てたVMに用意しておいてIPとかpath入れればデプロイできるくらいまで準備しておけば良かった
* アプリケーション全体の把握
    * sheetsテーブルが座席数を参照していてupdateもinsertもしてないなら最初から固定値で扱えばよかった...
* Goぢから、リファクタリング力の不足
    * N+1問題がネックになるのは過去問見ててわかってたから、解決法の常套手段くらいは頭に入れておくべきだった
* gitのブランチ戦略立てておかないと二人以上でソースいじってた場合にconflictの解消などで地味に手間がかかる

# 反省じゃない所感
* 予選会場の準備
    * 今回はmixiが会場を提供してくれたが、3人1チーム+モニター1枚支給に対して電源が3つで辛かった
    * 結構手狭になりがちでPCとモニターでほぼ机がいっぱい

# 良かったこと
* VM立てて過去問を解いたこと
    * 初参加だったので、事前にどうやって進めていくのかのイメージができた
* slack, Discordで会話できてた
    * 集まって予習することもあったけど、なかなか時間が取りづらいので
Google Cloud BuildでGitHubのpushを契機にdockerイメージをビルドする

今回はGoogle Cloud Buildを使ってGitHubのpushを契機にdockerイメージをビルドする方法をご紹介します。

# Cloud Buildとは
Google Cloudが提供しているCIツールです。
[Cloud Buildの詳細はこちらの公式ページにて](https://cloud.google.com/cloud-build/?hl=ja)
<img width="128" alt="Container Builder.png" src="https://qiita-image-store.s3.amazonaws.com/0/14929/47f3d4cf-3b04-b88f-59e5-0a6a63171691.png">

# はじめに
Cloud BuildはGoogle Kubernetes Engineなどで利用するdockerイメージのビルドからアプリケーションのテストまでその用途は幅広いです。

今回は、dockerイメージをビルドするところに焦点を当てています。

Cloud BuildとGitHubを統合してCIを回すには、以前はいくつかの段階を踏む必要がありました。
昨今、Cloud Buildはガンガン改善されてきており、より簡単に連携できるようになりました。

# この記事の前提
* GCPにアカウントを持っている事
* dockerを触った事がある事
* 自分のGitHubにDockerfileを含んだリポジトリがある事

# この記事で取り扱わない事
* Dockerfileの書き方など

# Cloud Buildの始め方
1. まずGCPにアクセス
2. ナビゲーションメニューの「ツール」にあるCloud Buildを開く
3. メニューから「トリガーを作成」を開く
4. ソースはGitHubを選択
5. GitHubの認証
6. 対象のリポジトリを選択(Dockerfileが存在するもの)
7. トリガー設定は一旦すべてデフォルトで「トリガーを作成」
8. 作成されたトリガーの「トリガーを実行」を開き対象ブランチを選択
9. メニューから「ビルド履歴」を開くと、現在ビルドしているものが表示される
10. しばらく待つ
11. グリーンになりビルドが成功した事を確認
12. ナビゲーションメニューのContainer Registryで実際にビルドされたイメージを確認
12. 以上

ビルドが開始されるまでおよそ3分くらいで設定が完了します。
しかもGitHub連携済み！
なんて楽！！

# 出来立てのdockerイメージをローカルからpullしてみる
※ dockerとgcloudがローカルマシンにインストールされている前提です

1. `gcloud auth login` で認証
2. `gcloud config set project $PROJECT_ID` でプロジェクトを設定
3. `gcloud docker -a` でGCP認証情報でDocker認証を構成
4. `docker pull <イメージ名>:<タグ>` でpullできる事を確認

※ 4.の手順で必要なイメージ名とタグはContainer Registryから確認できます。
<img width="532" alt="Fullscreen_2018_09_28_17_09.png" src="https://qiita-image-store.s3.amazonaws.com/0/14929/72faca5a-3d8f-6f04-15eb-8e5dbdfcec26.png">


# 最後に
ここまではめちゃくちゃ簡単に進みます。
しかし、実際の殆どのユースケースではこれ以上の細かい設定が欲しくなってくると思います。
先ほどの手順のトリガー設定で細かい指定ができます。
例えば、ビルド対象のブランチの指定など。

そして、更に細かく設定したい場合は、`cloudbuild.yaml` というマニフェストファイルを用意して対応が可能です。
例えば、任意のタグをdockerイメージに付与するなど。

こういったより実践的なTipsに関しては別途記事にして展開します。

快適なdockerライフを！
WebAssemblyでハローワールド

## WebAssemblyとは
ブラウザからアセンブリ言語を実行できるようにする技術。
高速化手段、あるいはJavaScriptの処理系にできないことをするといった目的で使用する。

2015年6月、Mozilla、Google、Microsoft、Appleが標準フォーマットとして開発することに合意している。

対応言語はC/C++、Rustなど。最近はGolangも使えるように。

## Can I use WebAssembly?<img width="1272" alt="スクリーンショット 2018-09-28 16.17.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/265344/81bce170-2244-092c-e681-864551dedbd5.png">

現在IE以外のほどんどのブラウザでサポートされている。

## アセンブリ言語とは
* マシン語(０と１の世界)と直接１対１に対応したプログラミング言語
* アセンブラともいう（これはアセンブリ言語をマシン語に変換するソフトのこともいう）
* 「アセンブル」：アセンブリ言語で記述したプログラムをマシン語のコードに変換すること

例として、C++で書いたHello Worldプログラムをアセンブリ言語で見てみます。

```cpp:hello.cpp
#include <iostream>
using namespace std;

int main() {
    cout << "Hello World!" << endl;
    return 0;
}
```

g++にSオプションをつけることでアセンブリ言語を見ることができます。

```
$ g++ -S hello.cpp
```

とすると、hello.sというアセンブラファイルが生成されます。

1000行以上のファイルになるので、ここには最初の15行だけ載せてみます。

```
	.section	__TEXT,__text,regular,pure_instructions
	.macosx_version_min 10, 13
	.globl	_main                   ## -- Begin function main
	.p2align	4, 0x90
_main:                                  ## @main
	.cfi_startproc
## %bb.0:
	pushq	%rbp
	.cfi_def_cfa_offset 16
	.cfi_offset %rbp, -16
	movq	%rsp, %rbp
	.cfi_def_cfa_register %rbp
	subq	$32, %rsp
	movq	__ZNSt3__14coutE@GOTPCREL(%rip), %rdi
	leaq	L_.str(%rip), %rsi
```
## WebAssemblyでHello World

ここからが本題です。

### Emscriptenをインストールする
最もポピュラーなEmscriptenを導入します。

```
git clone https://github.com/juj/emsdk.git
cd emsdk

# 最新のSDKツールをインストール
./emsdk install latest

# アクティベイト
./emsdk activate latest

# パスと環境変数を設定
source ./emsdk_env.sh
```

結構時間がかかるので、お茶でも飲んでまちます。

### 実行する
ビルド環境ができたので、早速コンパイルして実行します。

* Cのファイルを用意

```c:hello.c
#include <stdio.h>

int main() {
    printf("Hello World!\n");
    return 0;
}
```

* ビルド＆実行

```
$ emcc -0 hello.js -O0 hello.c
$ node hello.js
Hello World!
```

### 出力ファイルを.htmlにする
```
$ emcc -o index.html hello.c

# ローカルサーバーを立てる
## Python3.x系
$ python -m http.server
Serving HTTP on 0.0.0.0 port 8000 ...

## Python2.x系
$ python -m SimpleHTTPServer
Serving HTTP on 0.0.0.0 port 8000 ...

```

http://localhost:8000/ にアクセスすると、

<img width="568" alt="スクリーンショット 2018-09-28 16.49.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/265344/6f439aeb-13a2-bc1e-b518-c059a509b4de.png">

ちゃんとHello World!と表示されます。

## 終わりに
今回はWebAssemblyでHello Worldをやってみました。

気が向いたらもっと複雑な演算処理もやってみてください。

以上です!
Dockerコンテナ上で素のJavaを使ってHello Worldしてみる

## Hello Worldを出力するJavaクラスを作成

```java:Main.java
public class Main {
  public static void main(String[] args) {
    System.out.println("Hello World!");
  }
}
```

作成後、`javac Main.java`でコンパイルをし`Main.class`ファイルを作成しておく。

## Javaを実行可能なimageをセットアップ

次にubuntuをベースにjavaを実行するためのimageを作る。

```Dockerfile:Dockerfile
FROM ubuntu:latest
COPY Main.class Main.class
RUN apt-get update && apt-get install -y default-jre && apt-get install -y default-jdk
RUN java Main
```

1行目で使用する大元のimage(今回はubuntu)を指定。

2行目で実行用のクラスファイルをimageのディレクトリにコピーしておく。

3行目でJDKをインストール、`java`コマンドを実行可能にする。

最後に4行目でMainクラスを実行し、Hello worldを出力させる。

Dockerfileを作成できたら下記コマンドでimageをビルドする、ついでにタグオプションを使って名前をつけておく。
(最後の`.`を忘れない様に）

```terminal:docker-build
docker build -t running-java .
```

## Java実行 on Docker!

```terminal:Output
Step 4/4 : RUN java Main
 ---> Running in aab904e1114c
Hello Docker!
```
ElixirのEnum.sumはどう実装されているか？（アリティとKernelについて）

[fukuoka.ex](https://fukuokaex.fun/)代表の[piacere](https://twitter.com/piacere_ex)です
今回もご覧いただいて、ありがとうございます:bow:

[「Elixirは何故whileやメンバー変数が無いの？」に答えてみる①](https://qiita.com/piacere_ex/items/11cd08c1a74694309482) で、Enum.sumを紹介しましたが、その内部実装が、Elixirを初めたばかりの方には、トリッキーな構文だったので、Elixirのコードを読む練習として、少し解説したいと思います
<br>
:stars::stars::stars:<b>　お知らせ：Elixirもくもく会（リモート参加OK、入門トラック有）を今日、開催です　</b>:stars::stars::stars:

[<b>「fukuoka.ex#14：Elixir／Phoenixもくもく会～入門もあるよ」</b>](https://fukuokaex.connpass.com/event/100659/)を9/28（金）に開催します

今回から「Zoomによるリモート参加」を正式に受け付けるようになりましたので、福岡以外の都心や地方からでも参加できます（申し込みいただいたら、追ってZoom URLをconnpassメールでお送りします）

また、これまではElixir／Phoenix経験者を対象とした、もくもく会オンリーでしたが、今回から、入門者トラックも併設し、fukuoka.exアドバイザーズ／キャストに質問できるようにアップグレードしました

お申込みはコチラから
https://fukuokaex.connpass.com/event/100659/
[![image.png](https://qiita-image-store.s3.amazonaws.com/0/155423/3f0fbb56-e5e8-2c4d-7c62-1b0b311d6d02.png)](https://fukuokaex.connpass.com/event/100659/)

# Enum.sumはどう実装されているか？

こんなコードを別コラムで紹介しました

```elixir
iex> [ 1, 3, 5 ] |> Enum.sum
9
```

Elixirでは、Enum.reduceを使って、こんな感じにも書けます

```elixir
iex> [ 1, 3, 5 ] |> Enum.reduce( 0, fn( x, acc ) -> acc + x end )
9
```

Enum.sumの実装も、下記コードのように、Enum.reduceが基盤として使われています（Enumモジュール中の定義のため、reduceから「Enum.」が省略されています）

https://github.com/elixir-lang/elixir/blob/master/lib/elixir/lib/enum.ex

```elixir:lib/elixir/lib/enum.ex
　…
2428:  def sum(enumerable) do
2429:    reduce(enumerable, 0, &+/2)
2430:  end
　…
```

# 「アリティ」、Elixirの関数は引数の数で特定される

ここで「&+/2」が、Elixirを読み慣れていないと理解しにくいですが、これは[Kernelモジュールの「+」という2つの引数を取る関数](https://hexdocs.pm/elixir/Kernel.html#+/2)に、上記のxとaccに相当するものを渡して呼び出すことを意味しています

この「/」と引数の個数で指定するのを「アリティ」と呼びます

以下のように書き換えると、理解しやすいかと思います

```elixir
Enum.reduce( enumerable, 0, &( Kernel.+( &1, &2 ) ) )
```

なお、&1や&2は、&(～)で括った関数内に前から順に数字付きで参照できるようにする表記で、xやaccは、この表記によって展開されているので、冒頭のEnum.reduceで書いていた「fn( x, acc ) -> acc + x end」と同じになります

# 普段から使っているが、馴染みが薄いKernelモジュール

また、[Kernelモジュールの「+」](https://hexdocs.pm/elixir/Kernel.html#+/2)は、以下のような、普通の足し算でも呼び出されているルーチンのシンタックスシュガーです

```elixir
iex> 1 + 2
3
iex> Kernel.+( 1, 2 )
3
```

ですので、以下のようにも書けます

```elixir
Enum.reduce( enumerable, 0, &( &1 + &2 ) )
```

なお個人的には、「Kernel.～」の表記は、可読性が落ちるため、使わないように気をつけています

特に、パイプで繋げてると、使いたくなる誘惑に駆られますが、そこは他の方が見ることも意識して、フレンドリーなコードを守ります

# p.s.「いいね」よろしくお願いします

よろしければ、ページ左上の ![image.png](https://qiita-image-store.s3.amazonaws.com/0/155423/4d515047-cc48-382e-c2b1-3ad0cc50dbbf.png) や ![image.png](https://qiita-image-store.s3.amazonaws.com/0/155423/a4e3da58-70a3-4197-95a2-6a6906650d01.png) のクリックをお願いしますー:bow:
Node.jsの上位互換のDenoビルドするまで(TypeScript+V8処理)

## denoとは
node.jsの生みの親であるRyan Dahl氏にがNode.js開発においては複数の「ミス」を考慮して開発したTypeScript処理系です。

[Node.js における設計ミス By Ryan Dahl - from scratch](https://yosuke-furukawa.hatenablog.com/entry/2018/06/07/080335)こちらのブログにどのような「ミス」がありきになる方はこちらの方を参照してみてください。

今回のこの記事は[ry/denoをビルドする (Node.jsの産みの親が作ったTypeScript+V8処理系)](https://qiita.com/erukiti/items/b3039a94efacd1fb51a6)を参考に書かせていただきました。

## 環境
- macOS: Mojave version 10.14

※ 今回の説明はmacOSでの説明になります。他のOSでの環境構築に関しては[githubのリポジトリ](https://github.com/denoland/deno)などを確認しながら行ってください。

## Golangの構築
demoはGolangで書かれているので、Golangの環境構築が必要となります。

```terminal:terminal
$ brew install go
$ go version
  go version go1.11 darwin/amd64
```
これでinstall自体は完了です。

Goは作業場所として、 `$GOPATH` を設定する必要があります。
今回は公式の方に従い `$HOME/go` で作りたいと思います。

```terminal:terminal
$ export GOPATH=${HOME}/go
$ export PATH=$GOPATH/bin:$PATH
```

## v8worker2をビルドしてみる
基本的には、[github](https://github.com/ry/deno/blob/master/README.md)を参照しながら作業の方を進めました。

```terminal:terminal
# Fetch deps.
$ git clone --recurse-submodules https://github.com/denoland/deno.git
$ cd deno
$ ./tools/setup.py

# Build.
$ ./tools/build.py
```

ここのどこかでErrorを吐かれた場合は適宜調べながら作業を進めてください。自分の場合rust installしていなくて`./tools/setip.py`がつまづきました。

## 実際に走らせてみる。
```terminal:terminal
$ ./out/debug/deno tests/002_hello.ts
  Hello World
```
成功です！

## 感想
実はtwitterで少し前に自分のTLに回ってきて少し興味があったのですが、リアルが忙しく、今は落ち着いてきたのでぇということでやってみました。

deno自体がかなりプロトタイプレベルなので、これからどんな感じになっていくのかすごい楽しみです。

皆さんもぜひ触ってみてください。
Angular イベントバインディングの処理内でのカスタム属性アクセス方法メモ

イベントバインディング処理内でのカスタム属性(data-*)へのアクセス方法
`target.dataset`内に格納されるので以下でアクセス

``` sample.component.html
<a data-xxx="カスタムデータ" (click)="onClick($event)">sample</a>
```

``` sample.component.ts
onClick(event) {
  console.log(event.target.dataset.xxx);
}
```
実録: MySQLのリストア

# 実録: MySQLのリストア

運用していた自宅サーバーでディスク破損が発生し、苦労しながらも何とか復旧させました。その過程でMySQLをリストアした試行錯誤の記録です。

## ディスク破損時の状況
ディスク破損時のサーバーおよびMySQLのは、次の状況でした。

* OSは、Ubuntu Server 16.04
* Qemu/KVMのゲストOSとして運用
* バックアップは、dumpコマンドを用いて取得し、別のディスクに保存
 * `/`と`/home`は別パーティッション
 * `/home`のバックアップは毎日取得
 * `/`のバックアップは1週間に1度取得
* [WordPress](https://ja.wordpress.org/ WordPress)と[MediaWiki](https://www.mediawiki.org/wiki/MediaWiki/ja/ MediaWiki)をMySQLを用いて運用
* MySQL
 * バージョンは、5.7.16
 * データファイルは、`/home`に配置
 * バックアップは特にしていない（OSレベルのバックアップをしていれば大丈夫だと思っていた…）

## InnoDB破損からのリストア
自宅サーバーは、新しいハードディスクを接続してから`/`と`/home`に対して`restore`コマンドを使うことで復元することで成功しました。この段階で、ほかのソフトは問題なく動作したものの、MySQLは起動に失敗する状態でした。エラーログを確認すると、InnoDBが破損していたようです。

そこで、[MySQLでInnoDB破損したときの復旧方法](https://qiita.com/skouno25/items/71174c959abe435223ab)を参考に、次の手順で復旧を試みました。

1. MySQLの設定ファイル`/etc/my.cnf`末尾に`innodb_force_recovery = 1`を追記して、InnoDB強制リカバリモードでMySQLを起動
1. 全データベースをダンプ `mysqldump -u root -p -x --all-databases > alldatabase.dump`
1. `innodb_force_recovery = 1`を削除して、MySQLを再起動
1. ダンプファイルをリストア `mysql -u root -p < alldatabase.dump`

### リストア完了と思ったが…

このとき、mysqlデータベースの一部のテーブルでCREATEができないというエラーが発生しました。[こちら](https://qiita.com/yaboojp/items/85e6356622e30cff88cb)と同様の現象だったようです。そこで、ダンプファイルをからエラーの表示されているテーブルの記述を削除したファイルを作成し、再度リストアを試みました。後述するようにこの対応は、失敗でした。ただし、MySQLは無事に起動できるようになり、そしてWordPressやMediaWikiも正常にアクセスできるようになりました。

## mysqldumpを実行できない

正常に動作しているように見えたMySQL。しかし、何日か経ってmysqldumpを実行しようとしたときに、エラーが発生してできないことに気がつきました。どうも、必要なテーブルがないといっているようです（正確なエラーメッセージは記録を忘れました）。

調査のためにmysqlcheckを実行した場合は、問題ないと表示されます。しばらく考えた末、ようやくInnoDB破損からのリストアに失敗していることに思い当たりました。また、幸いなことに、そのときに取得したバックアップは残っていました。一方、ちょっとですがWordPressやMediaWikiのデータも更新しており、できれば最新のデータを残したいと思っていました。

### mysqlデータベースのリストア失敗

そこでまず試したのは、mysqlデータベースだけのリストア。取得していたダンプファイルからmysqlデータベースのデータだけを取り出したダンプファイルを作成し、リストアを実行しました。しかし、次のエラーが発生して、失敗してしまいました。

    ERROR 1030 (HY000): Got error 168 from storage engine

調べると、データファイルに書き込みができないことが原因であり、
権限、所有者、容量不足、open file数制限などがさらなる原因の可能性があるとのことです。しかし、ついに原因はわかりませんでした。

### データベース全体のリストア

仕方がないので、取得していたダンプファイルからデータベース全体をリストアし、前回のリストア後の更新は破棄し、MySQLを初期化してからリストアすることにしました。実施した手順は次のとおりです。

1. MySQLをシャットダウン
1. MySQLのデータファイルをすべて退避
1. mysqldを初期化モードで起動。 mysqld --initialize
1. mysqlのrootユーザーのパスワードを設定
1. mysqldumpから、データベース全体をリストア

このあと、MySQLのプロセスが起動していること、WordPressとMediaWikiが（いったんリストアしたあとの更新が失われた状態で）正常に動作していることを確認しました。また、mysqldumpによるダンプ取得が正常にできることも確認しました。ようやく、MySQLのリカバリ完了です。

## 反省点
今回の経験を元に、MySQLは次にように運用すべきだと考えています。

* mysqldumpでのバックアップは取得しておく。OSレベルでのバックアップとリストアが成功しても、MySQLのデータは破損している場合がある。
* MySQLのリストアがうまくできない場合は、MySQLを初期化してからリストアすることも検討する
* リストアの訓練は重要

### リストアの訓練
さらに重要な課題として、リストアの訓練について考える必要があります。

バックアップを取得していてもほんとうにそのバックアップで復旧できるのか、実際に訓練してみないとわからないことを改めて実感しました。リストアの訓練は大事です。他人様のデータや業務データを扱っている場合は特に
そうでしょう。システムが正常に動作しなくなった場合には、慌てたり落ち込んだりして、どうしても正常な判断が難しくなり、ミスを重ねてしまうおそれもあります。

正常に動作している内にリストアの訓練を実施しておけば、バックアップが本当に有効かどうかを検証できますし、いざというときにミスを起こす可能性も減らせます。
幸いなことに最近では、仮想化やコンテナなどの普及によりリストアの訓練もしやすくなっています。MySQLを使っている方はぜひ、リストアの訓練実施を検討すべきでしょう。
macにNode.jsをインストール（ndenv編）

##はじめに
以前、macにNode.jsをインストールする投稿をしていましたが、前回はnodebrewでのインストールでした。
今回は改めて、ndenvを利用したインストール方法を投稿します。

##インストール手順

### 1. brewのアップデート
brewをアップデートします。

```bash
$ brew update
```

### 2. ndenvのインストール
ndenvをインストールします。
（既に、nodeやnodebrewが入ってる人はアンインストールして下さい。）

```bash
$ brew install ndenv
```

環境変数を設定します。

```bash
$ echo 'export PATH="$HOME/.ndenv/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(ndenv init -)"' >> ~/.bash_profile
$ exec $SHELL -l
```

このままだとndenv installコマンドがつかえないので、node-buildをインストールする必要があります。
([mom0tomo](https://qiita.com/mom0tomo)さん、ご指摘ありがとうございます。2018/12/18修正）

```
$ git clone https://github.com/riywo/node-build.git $(ndenv root)/plugins/node-build
```

終わったら確認してみましょう。

```bash
$ ndenv -v
ndenv 0.4.0
```
バージョンが出れば成功です。

### 3. nodeのインストール
ndenvでnodeをインストールします。
インストールできるバージョンを確認するには以下のコマンドを入力します。

```bash
$ ndenv install -l
Available versions:
  v0.1.14
  v0.1.15
    ・
    ・
  v10.10.0
  v10.11.0
  iojs-v1.0.0
    ・
    ・
  iojs-v3.2.0
  iojs-v3.3.0
  iojs-v3.3.1
```

バージョンを指定してインストールします。
2つバージョンをインストールし見ましょう。

```bash
$ ndenv install v9.3.0
$ ndenv install v10.11.0
```

インストールされたnodeのバージョンを確認します。

```bash
$ ndenv versions
  v9.3.0
  v10.11.0
```


### 4. nodeのバージョン設定（グローバル）
デフォルトで使用できるnodeのバージョンを設定します。

```bash
$ ndenv global v10.11.0
```
ノードとnpmのバージョンを確認してみましょう

```bash
$ node -v
v10.11.0
$ npm -v
6.4.1
```

### 5. nodeのバージョン設定（ローカル）
特定のフォルダで、ノードのバージョンを設定します。

```bash
$ mkdir hoge
$ cd hoge
$ ndenv local v9.3.0
$ node -v
v9.3.0
```

以上、とっても簡単でした。
Python JSON-RPC

# 参考
・json-rpc Quick start
https://json-rpc.readthedocs.io/en/latest/quickstart.html

# 必要なパッケージのインストール

```
$ pip install json-rpc
$ pip install werkzeug
$ pip install requests
```
以下のファイルを作成します。

```sever.py
from werkzeug.wrappers import Request, Response
from werkzeug.serving import run_simple

from jsonrpc import JSONRPCResponseManager, dispatcher


@dispatcher.add_method
def foobar(**kwargs):
    return kwargs["foo"] + kwargs["bar"]


@Request.application
def application(request):
    # Dispatcher is dictionary {<method_name>: callable}
    dispatcher["echo"] = lambda s: s
    dispatcher["add"] = lambda a, b: a + b

    response = JSONRPCResponseManager.handle(
        request.data, dispatcher)
    return Response(response.json, mimetype='application/json')


if __name__ == '__main__':
    run_simple('localhost', 4000, application)
```

```client.py
def main():
    url = "http://localhost:4000/jsonrpc"
    headers = {'content-type': 'application/json'}

    # Example echo method
    payload = {
        "method": "echo",
        "params": ["echome!"],
        "jsonrpc": "2.0",
        "id": 0,
    }
    response = requests.post(
        url, data=json.dumps(payload), headers=headers).json()

    assert response["result"] == "echome!"
    assert response["jsonrpc"]
    assert response["id"] == 0

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

作成できたら実行していきます。

```
$ python server.py
 * Running on http://localhost:4000/ (Press CTRL+C to quit)
```

別のタブを開いて、実行してください。

```
$ python client.py
```

そうすると、server.pyをrunしたタブの方で、

```
127.0.0.1 - - [28/Sep/2018 16:29:30] "POST /jsonrpc HTTP/1.1" 200 -
```
と出力されるはずです。

# 次回

[JSON-RPC使って、gethを動かしてみた](https://qiita.com/kagami-r0927/items/dfb51176eb272b03cded)
プルリクに対してプルリクする

## 状況

- メインのリポジトリがある
- 各開発者はメインのリポジトリから develop ブランチをローカルにクローンする
- ブランチを切ってローカルで開発
- 開発の結果は「メインのリポジトリとは別の」自分のリモートリポジトリにプッシュ
- 自分のリモートリポジトリから、メインのリポジトリにプルリク

ここまではよくあるのでよい。

## 課題

1. メインのリポジトリにきたプルリクを、ローカルにクローンしてレビューする
2. レビューして、実際にソースを変更し、その結果をプルリク元にプルリクする

## 手法

### 1.メインのリポジトリにきたプルリクを、ローカルにクローンしてレビューする

```shell
# 概要
git fetch メインのリポジトリにつけている名前 pull/プルリクについている issue番号#のやつ/head:任意の新しくローカルで作るブランチ名

# 実際
git fetch upstream pull/72/head:pull/nakanishi/new_feature
```

すると pull/nakanishi/new_feature というローカルリポジトリに落とせる。

### 2.レビューして、実際にソースを変更し、その結果をプルリク元にプルリクする

1. pull/nakanishi/new_feature で開発して、そこにコミット
2. プッシュする。すると、自分のローカルのブランチにプッシュされる
3. これを、メインのリポジトリのプルリクから、プルリクを出した人のリモートリポジトリにプリリクする

3 がわかりずらいので画像で

![Screen Shot 2018-09-28 at 4.18.13 PM.png](https://qiita-image-store.s3.amazonaws.com/0/240885/ee05c424-32c6-fb38-7c32-f4c85f1e13a1.png)

メインのリポジトリから、上の画像の画面から、プルリク出す緑のボタンを押す

![Screen Shot 2018-09-28 at 4.18.47 PM.png](https://qiita-image-store.s3.amazonaws.com/0/240885/148c8b66-ad43-af07-d512-1b2211666b51.png)

すると上記画像のようなプルリクの詳細画面になるので、メインリポジトリではなく、プルリクを出して来た人のローカルリポジトリにプルリクをする。ブランチも変更することを忘れずに。

4. するとプルリクを出して来た人のリモートリポジトリに、レビューしたプルリクが来るので、これをマージしたり、断ったりする。
5. マージすると、その結果は、即、メインリポジトリのすでに出ているプルリクに反映される。

以上です。
とにかくEC2でHello worldしたい人のためのメモ

アカウント登録や細かな説明などは省略しちゃってます！
アカウントは作ったけど何すればいいかようわからん
とにかくなんかしてみたいんじゃって人向けのメモです

# ゴール
パブリックDNSのアドレスにアクセスしたら「Hello EC2!」と表示されるようにする
![001.png](https://qiita-image-store.s3.amazonaws.com/0/34870/d97f5712-1354-33ff-6122-1baa7febd901.png)


# EC2管理メニューを開く
1. 「サービス」 > 「コンピューティング」 > 「EC2」をクリック
![002.png](https://qiita-image-store.s3.amazonaws.com/0/34870/5f37433c-121f-6a71-0d32-218fd0bc80dd.png)

2. 「インスタンスの作成をクリック」
![003.png](https://qiita-image-store.s3.amazonaws.com/0/34870/dd4f1750-78c1-5657-5950-c42bd3dfedf9.png)

# インスタンスの作成
1. AMIの選択
無料利用枠の対象の「Amazon Linux」を選択
![004.JPG](https://qiita-image-store.s3.amazonaws.com/0/34870/0614518b-a70c-3cb6-20cd-9d6b6ba58903.jpeg)

2. インスタンスタイプの選択
「t2.micro」を選択して「次の手順: インスタンスの詳細設定」をクリック
![005.png](https://qiita-image-store.s3.amazonaws.com/0/34870/7f33d9db-658b-444f-d2c9-8f2e45415277.png)

3. インスタンスの詳細の設定
デフォルトのまま「次の手順: ストレージの追加」を選択

4. ストレージの追加
デフォルトのまま「次の手順: タグの追加」を選択

5. タグの追加
「タグの追加」をクリック
![006.JPG](https://qiita-image-store.s3.amazonaws.com/0/34870/37f22482-a9bd-cf69-3767-6c6e5e34c4f1.jpeg)
キーには「Name」、値には「Sample」と入力して「次の手順: セキュリティグループの設定」をクリック
![007.JPG](https://qiita-image-store.s3.amazonaws.com/0/34870/684d7665-54d1-78c2-9c4b-01d2d9724a17.jpeg)

6. セキュリティグループの設定
「新しいセキュリティグループを作成する」を選択してセキュリティグループ名と説明に「sample-tag」と入力
![008.JPG](https://qiita-image-store.s3.amazonaws.com/0/34870/46a3dcf7-f62c-b063-9204-cad3e0f7e562.jpeg)
「ルールの追加」をクリックしてHTTPを許可する設定を追加
Webサーバーと通信するのに必要な設定です
追加したら「確認と作成」をクリック
![009.JPG](https://qiita-image-store.s3.amazonaws.com/0/34870/16fe329e-c413-326e-0fba-148a2b0c6392.jpeg)

7. インスタンスの作成と確認
ざっと眺めて「作成」をクリック

8. キーペアの作成
「新しいキーペアの作成」を選択して、キーペア名に「sample-key」と入力
「キーペアのダウンロード」をクリックして「sample-key.pem」がダウンロードできたら「インスタンスの作成をクリック」
![010.JPG](https://qiita-image-store.s3.amazonaws.com/0/34870/82df121f-fcc7-8730-b720-607d32950461.jpeg)

9. インスタンスの起動
無事にインスタンスの作成が開始されたら右下にある「インスタンスの表示をクリック」
「Sample」というインスタンスが追加され、インスタンスの状態が「running」になっていればOK
「running」になるのにちょっと時間がかかります
![011.JPG](https://qiita-image-store.s3.amazonaws.com/0/34870/1d2d41ce-225e-44e2-76ed-4a105d73d059.jpeg)

# SSHで接続する
rLoginを使って接続します
1. Server AddressにパブリックDNSを入力
2. User Nameに「ec2-user」と入力
3. SSH Identity Keyの「参照」をクリックして、ダウンロードした「sample-key.pem」を選択
4. 「OK」をクリックして接続
![012.png](https://qiita-image-store.s3.amazonaws.com/0/34870/f16440f6-0905-5b2c-9b71-3a2daca0cf7a.png)

以下が表示されていれば接続成功！

```

       __|  __|_  )
       _|  (     /   Amazon Linux AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-ami/2018.03-release-notes/
10 package(s) needed for security, out of 21 available
Run "sudo yum update" to apply all updates.
```

# Apacheをインストールする
以下のコマンドを順番に実行

```
パッケージの更新
$ sudo yum update -y

Apacheのインストール
$ sudo yum install -y httpd

htmlファイルの追加
$ sudo vi /var/www/html/index.html
```
```index.html
Hello EC2!
```
```
Apacheの起動
$ sudo service httpd start
Starting httpd:                                            [  OK  ]
```

# Hello EC2!
パブリックDNSのアドレスにアクセス
![001.png](https://qiita-image-store.s3.amazonaws.com/0/34870/3cf77afc-a154-9bdf-1f93-25a1511862da.png)

実験が終わったらインスタンスを停止させておきましょう

以上、とにかくEC2でHello worldするために細かな説明をすっ飛ばした雑なメモでした
ghq + pecoが重くなったら

## 原因

リポジトリが増えると`ghq list`は重くなる

## 対策

ディレクトリ決め打ちで拾ってくる

`find $(ghq root)/*/*/* -type d -prune | sed -e 's#'$(ghq root)'/##'`

これで`ghq list`したのと同様な結果になります
HTTPステータスコード早見表（部分的）

たまに見る程度でよく忘れるので、適度に一覧表にしました。
個人的によく見た4xx系と5xx系だけです。
他のちゃんとしたサイトだと小難しいので自分なりの解説を入れています。


| ステータスコード | | 解説 |
|:-:|:-:|:--|
|400 |Bad Request | リクエストがおかしい。<br>キャッシュとかクッキーが怪しいらしい。   |
|403 |Forbidden | アクセス権がない。     |
|404 |Not Found | リソースが無い。<br>URLが違うとかリソースが消されちゃったとか。  |
|500 |Internal Server Error|よくわからないけどサーバー側で何か起こった。<br>サーバー側のエラーログとか見に行くと良いかも。|
|502|Bad Gateway| ゲートウェイとかプロキシに問題がある。<br> Bad Gatewayについてはここがわかりやすい <br>  [502Bad Getewayの原因と意味について ｜ ぷろめし｜プログラミングよりも飯が好き](http://www.promeshi.com/archives/2161)|
|503|Service Unavailable|サービスが何らかで利用できない状態。<br>アクセス過剰による高負荷とか。 |
|504|Gateway Timeout|タイムアウト。<br>何かしらでレスポンスを返せない状態になっている。|


### 参考
* [HTTPステータスコード \- Wikipedia](https://ja.wikipedia.org/wiki/HTTP%E3%82%B9%E3%83%86%E3%83%BC%E3%82%BF%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%89)
* [HTTP レスポンス状態コード \- HTTP \| MDN](https://developer.mozilla.org/ja/docs/Web/HTTP/Status)
* [HTTPステータスコードとは？種類とそれぞれの役割について \| デジ研](https://digital-marketing.jp/seo/http-status-code/#400)
* [502Bad Getewayの原因と意味について ｜ ぷろめし｜プログラミングよりも飯が好き](http://www.promeshi.com/archives/2161)
* [400 Bad Requestの原因と対策](https://www.deep-rain.com/web/852)
iPhone（mobile safari・chrome） で wow.js + animate.css アニメーションされない問題

[wow.js（v1.1.3）](https://github.com/matthieua/WOW) + [animate.css（3.7.0）](https://daneden.github.io/animate.css/) でアニメーションの設定をしました。


実機の iPhone8（iOS 12.0） と iPhone6（iOS 11.4.1）で確認したところ、iPhone8 だけアニメーションが実行されない現象に遭遇しました。

safari と chrome で確認しましたが、両方ともアニメーションが実行されないので、ブラウザ側ではなくiOSの影響？

ググっても言及した記事がヒットしないので、自分だけ？

直接的な原因は不明ですが、 animate.css のバージョンを最新の 3.7.0 から [3.6.2](https://github.com/daneden/animate.css/releases) に変更したら、iPhone8 でもアニメーションされました。

同じ現象に遭遇した方は、バージョンを下げてみてください。
Sassのビルド時にCSSの出力形式を指定する

##CSSの出力形式を変えたい・・・><。

調べてみたところ、どうやらビルド時にオプションとしてCSSの出力形式を指定することが出来るらしい。
デフォルト以外の出力形式を指定したい場合はgulpfile.jsを編集してあげればいいっぽい。


```javascript:gulpfile.js

"use strict";

var gulp = require("gulp");
var sass = require("gulp-sass");

gulp.task("sass", function() {
  gulp
    .src("./_src/sass/**/*.scss")
    .pipe(sass({ outputStyle: "expanded" })) //" "に出力形式を指定
    .pipe(gulp.dest("./css"));
});

gulp.task("watch", function() {
  gulp.watch("./_src/sass/**/*.scss", ["sass"]);
});

gulp.task("default", ["watch"]);

```


##主な出力形式

| 出力形式         |出力結果|
|:-------------------|:-----------------|
| nested             |ネストの状態が表現された形で出力される|
| expanded           |一般的なCSSのフォーマットで出力される|
| compact            |セレクタごとに１行にまとめて出力される|
| compressed         |圧縮された状態で出力される|

##ちなみに
**1.デフォルトの状態(orオプションを何も指定しない)でビルドすると出力形式はnestedになる**
**2.ファイル容量を少しでも抑えたい場合はcompressedを使うと良い**
fish shellでpyenv/anaconda3をインストール

# 環境
- Mac OS High Sierra
- homebrewインストール済み

# pyenvのインストール
pyenvのインストール

```
brew install pyenv
```
# anacondaのインストール
pyenvでインストールできるanacondaのバージョンを確認

```
pyenv install -l
```

anaconda3系のインストール

```
pyenv install anaconda3-5.2.0
```

# パスを通す
fish shellにてパスを通す

```
set -gx PYENV_ROOT "$HOME/.pyenv"
set -x PATH $PATH "$PYENV_ROOT/bin"
status --is-interactive; and . (pyenv init - | psub)
```

これで`pyenv`と`conda`コマンドが使えるようになった
機械学習案件で結果が再現できない場合にやるべきこと

## 免責事項
- この記事は[The Official Blog of Kaggle.com](http://blog.kaggle.com/)に掲載された[Help! I can’t reproduce a machine learning project!](http://blog.kaggle.com/2018/09/19/help-i-cant-reproduce-a-machine-learning-project/)という記事をおおざっぱにエッセンスだけ和訳した記事です。
- きちんと精査した上で投稿すべきかもしれませんが、誤訳や何かしらの問題を発見された場合は、コメント欄や編集リクエストにてお知らせいただけると幸いです。

---

## イントロ
- 機械学習プロジェクトでは、他人の結果や自分自身の過去の結果を再現することができず、フラストレーションがたまる。
- 再現性の鍵は"コード"・"データ"・"環境"。

## 非決定論的コード
- 機械学習や統計的アルゴリズムは**ランダムであることが動作するために不可欠な要素**である
- ランダム要素の例
  - バギング：ランダムにサンプリングされたデータでたくさんの小さなモデルを学習する。
  - ブースティング：最初の（モデルに与える）データサブセットは完全にランダムで、残りはそれに依存する。
  - ニューラルネットワークでの重みの初期化は、特定の分布で行われる。
  - 学習/クロスバリデーション/テストのデータサブセットの分け方。
  - サンプリングに依存するいくつかのメソッド（マルコフ連鎖モンテカルロ法）。
  - "ランダム","確率的","サンプル","標準","分散"というワードについてドキュメントで言及しているアルゴリズムは何らかのランダム要素をはらんでいるかもしれない。
- **機械学習の結果を再現可能にするためには、ランダム要素が毎回一致していることを確認した上で、コードを走らせる**。
- ランダムに同じランダムナンバーを生成するには、ランダムシードの設定を毎回確認しておくことが必要。（ランダムシード: 疑似乱数ジェネレータが乱数を生成する際に使用する設定値。同じシードを与えれば、毎回同じ乱数が生成される。）
- ランダムシードが最初に設定されていないプロジェクトの場合、同じ結果を得ることはできない。
- その場合、いちばんいいのはシードセットを持った新しいモデルを再び学習させること。

## データの違い
- データの違いは、潜在的に再現性を損なう可能性がある。
- バージョン管理されたデータセットを使う場合、オリジナルのデータファイルにアクセスできるなら、オリジナルデータと一致するかどうかをチェックする方法はいくつかある。
  - Bashのcmpコマンドで二つのファイルが同じであることを確認する。
  - データセットファイルのハッシュ値を比較する。（pythonならhashlibライブラリかUNFパッケージ）
- **ワープロソフトやスプレッドシートは重大な犯罪者である**
  - 自動データフォーマット
  - キャラクタエンコーディング
- ワープロソフトやスプレッドシートを使わないか、使うならコピーしたデータでやれ。
- テキストエディタならGeditかNotepad++がおすすめだけど、まあ他にもたくさんあるから人ぞれぞれで。

## 環境の違い
- 計算環境の違いというのは、コードを走らせるために必要なものすべて（パッケージ、パッケージバージョン、ファイルディレクトリ構造など）を含む。
- **"File not found"エラーが大量発生した**場合、コードが参照しているディレクトリ構造が以前と異なるためかもしれない。これを直すのはとても簡単:
  - 相対パスではなく絶対パスを使用しているかチェック
  - ディレクトリ構造が元の構造と同じかチェック
- 依存関係の不一致による問題を修正するのはもっと難しい。
  - 何のパッケージの何のバージョンを使っていたか確認する。
  - 言語のバージョンも確認する。
- 環境に関してどれだけの情報を持っているかによって、再現性の難易度が決まる。
  - initファイルや要件書などがあるか。
  - コンテナや仮想マシンを使った環境があるか。
  - 完全にホストされた実行可能な環境があるか。（Kaggle Kernelみたいな）
- こういった情報が一切ない状況で、他人が過去に出した結果を再現しようとする場合、結果を再現しようとしている作業をした人に連絡を取るというのが私のできる最善のアドバイスです。（**訳注**:ごめんなさい。この訳は怪しく、正確な意味を理解できていません。原文は次の通り。
_If you’re trying to reproduce someone else’s work, through, the best advice I can give you is to reach out to the person whose work you’re trying to reproduce._'  
->@epsilonさんからご指摘頂いた内容で修正いたしました。"reach out to"は"援助を求める"という成句でした。

## まとめ
- 大半のケースにおいて、再現性の問題は"コード"・"データ"・"環境"のいずれかにたどり着く。
- モデリングの結果を再現できないケースはほんのわずかで、そのベストな例はcuDNNライブラリ（NVIDIAのディープラーニングSDKに含まれる）に依存したディープラーニングプロジェクトである。
  - 畳み込みニューラルネットワークで使われるいくつかのキーメソッドやbi-directional LSTMsは現状非決定論的である。（ただし最新の情報を得るにはドキュメントを確認して）
  - もし再現性が重要である場合、CUDAを使わないことを考えた方が良い。
  - この場合トレードオフとなるのは、学習に時間がかかることで、スピードを優先する場合はこれが重要な考慮事項となる。
REAPERをとりあえず使ってみよう

# はじめに

REAPERきになるけど、何から触っていいかわからない人向けの記事になります。


REAPER
https://www.reaper.fm/
からダウンロードしてすぐ使えます。

REAPERとは

非常に拡張性のあるDAW
効果音作成
音の加工
スクリプトでいろいろいじる

などに向いているように思えます。

特にプログラマなら、拡張を作るのが幸せになりそう。

とりあえず最初のとっかかりかとなるような記事になります。

# とりあえず波形をトラックにドロップする

これでスペースキーを押せば音がなります。

この三角のところをいじるとそこから再生できます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/96808/4970d080-0be7-48ae-6b7c-65e03752a16d.png)


三角と波形のある場所の間ぐらいをドラッグすると範囲が指定できて、その範囲だけ繰り返し再生できます
![image.png](https://qiita-image-store.s3.amazonaws.com/0/96808/36b748bc-e4ca-a037-1bd2-c6929e93480f.png)

# FXからreaEQを選ぶ

![image.png](https://qiita-image-store.s3.amazonaws.com/0/96808/e1dccd41-4993-4e21-db81-b32c3d4d41af.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/96808/8d34967a-b8c5-5bfe-68e2-52eb57fc4c73.png)

音を鳴らすとうにゃうにゃ動きが見れます。
楽しいです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/96808/373cae7f-7882-5521-87fd-8cc04a6d9e4d.png)

いろいろプリセットをいじってみると音も変わります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/96808/73b49001-46ab-3519-ceb5-456bfd2adcbf.png)


# まずは見た目

テーマファイルをここ
https://stash.reaper.fm/tag/Themes
からダウンロードして、
おもむろにREAPERにドロップする

見た目が変わります。

例えば
![image.png](https://qiita-image-store.s3.amazonaws.com/0/96808/e370febf-36e1-e278-656a-3287e18d2b05.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/96808/2bef5c03-55a2-b55c-3916-6cba2dc0f743.png)


いろいろ探すと自分の使い慣れたツールもみつけられるかと思います。

Logic風
![image.png](https://qiita-image-store.s3.amazonaws.com/0/96808/95bc5daa-8890-545a-2d1b-a0a4fad30085.png)

Protools風
 ![image.png](https://qiita-image-store.s3.amazonaws.com/0/96808/68445c2a-23fa-40ed-23ae-4d45588bf60b.png)


とりあえず、見た目変えて楽しむ。

以上
私がWicket7から8へのマイグレーションで書き換えたトコロ

## これまでのあらすじ
Wicket7で作った小規模なアプリケーションをためしにWicket8にマイグレーションしてみました。
エラーや警告を消して、とりあえず動くところまでで書き換えた内容を羅列する遊び。今更感が半端ないです。あとLambdaは扱いません。

> これはなんちゃって備忘録みたいなナニカです。ちゃんとマイグレーションするなら[本家の移行ガイド](https://cwiki.apache.org/confluence/display/WICKET/Migration+to+Wicket+8.0)見るのが確実です。

### AjaxButton.onSubmit() の第二引数
いままで引数として渡されていたFormがなくなってます。
私のコードでは参照してなかったので引数消すだけ。
必要なら `AjaxButton.getForm()` で取得できるようになってます。

※`AjaxLink.onClick()`、`AjaxFallbackButton.onSubmit()`も同様の変更がなされているとのこと。

### AjaxEventBehavior(とそのサブクラス)に指定するイベント名
たとえば `AjaxFormComponentUpdatingBehavior` とか。

```java:
// いままで"onchange"とか指定しても動いてたけど・・・
hoge.add(new AjaxFormComponentUpdatingBehavior("change") {
    @Override
    protected void onUpdate(AjaxRequestTarget target) {
        // なんか処理					
    }
});
```
`on`ついたままでも例外とかは出ないのだけれど、JavaScriptが動作しません。
Wicket 6.x の時点からログに「on 書くなよボケ。今は許すけど8からは許さん」って警告ログが出てたらしい。気づかんかった。
どうでもいいけど `AjaxFormComponentUpdatingBehavior` ってクラス名は長すぎると思う。

### AbstractReadOnlyModel 非推奨
使うなバッテン。IDEだと打ち消し線ひかれてダメ感倍増。
修正は簡単で、単に `IModel` に置き換えればおっけい。

私は以下みたいなラベルを介して使っていたので、変更するのは一箇所だけですみました。
`AbstractReadOnlyModel `って文字数多いから何度も書きたくなかっただけです。

```java:ReadOnlyLabel.java
package yamane.wicket;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.model.IModel;

public abstract class ReadOnlyLabel<T> extends Label {
    public ReadOnlyLabel(String id) {
        super(id);
        // ここをIModelに書き換えた
        // setDefaultModel(new AbstractReadOnlyModel<T>() {
        setDefaultModel(new IModel<T>() {
            @Override
            public T getObject() {
                return load();
            }
        });
    }
    protected abstract T load();
}
```
Java8必須にしてインターフェイスのデフォルトメソッドが使えるようになったからやね。
とてもスッキリ。

### AbstractRequestCycleListener 非推奨
これもだいたい `AbstractReadOnlyModel ` と同じ感じ。
`extends` を `implements` にしてデフォルトメソッドが追加された `IRequestCycleListener` に置き換えます。
でもこれ移行ガイドに記述がなかったのですよね。エラーページ書き出す前のハンドリングとかで私はよく使っているのだけれど、みんな使ってないのかな。

### Component.onConfigure() メソッド
オーバーライド時に `super.onConfigure()` が必須になりました。
いままで `Component.onConfigure()` の実装は空っぽだったから「呼び出す必要ないじゃんね一行記述が減るし」って思ってたのだけれど、Wicket8 からは「ダメ、例外、お前は死ぬ」っていわれます。
えっ？ 前からJavaDocに必須って書いてあったじゃんですって？
ゴメンナサイ読んでませんでした。

頻繁にオーバーライドするメソッドなので、変更箇所もたくさん。Grepしてコピペするだけだけど。私的にはこれが一番大きかったです。

## ここまで
思っていたよりもずいぶんと少ない変更で済みました。

Wicketのアプリケーションはプログラマ各々コードがだいぶ違う風になるんじゃないかなと個人的には思っています。どれが正しい間違いってのではなく、個性というか癖というか。
というわけで、違う人が作ったWicket7のアプリケーションではきっと違う書き換え場所が出てくるんじゃないかと思います。自分以外が作ったWicketアプリケーションのコードってあまり見たことがないので、確証はないですが。

と、この記事の役立たなさをアピールした後に唐突におわる。
AndroidAsync でサーバーを立てる

Android アプリでサーバーを立てるという経験をしたのでメモです。

# 準備
使うライブラリは [AndroidAsync](https://github.com/koush/AndroidAsync) です。

# 利用
ざっくりとしたコードは以下です。

```

AsyncHttpServer server = new AsyncHttpServer();
server.get("/get", new HttpServerRequestCallback() {
    @Override
    public void onRequest(AsyncHttpServerRequest request, AsyncHttpServerResponse response) {
        response.send("Hello!!!");
    }
});
server.post("/post", new HttpServerRequestCallback() {
    @Override
    public void onRequest(AsyncHttpServerRequest request, AsyncHttpServerResponse response) {
        response.send("Hello!!!");
    }
});
server.directory(mContext, "/", "index.html");

server.listen(5000);

```


# 解説
### get, post
対応するアドレスとコールバックを渡してやるだけなので特筆することはありません。
もちろん文字列だけでなく Json なども返すことができます。
### directory
directory メソッドを使うと Android の中にあるファイルを返すことができます。
上記のコードでは Assets フォルダ配下の index.html を返しています。
Vue で font-awesome を使おうとしたら font が読み込めなかった。

Vue-cli で　Webpack のプロジェクト作ってDevモードで開発をしてました。
一旦 プロダクション でビルドだぜ、と思って吐き出したはいいが、アクセスすると
Fontが四角表示に。
`build`フォルダにある`webpack.base.conf.js`の `module` の `rules` に以下を追加すればOK.

```javascript:webpack.base.conf.js
{                                                                                                                                 
  test: /\.(woff|woff2|eot|ttf|svg)(\?.*$|$)/,
  loader: 'url-loader?importLoaders=1&limit=100000'
}
```

`loader` をいい感じに設定しなきゃダメみたいでした。
デザイナードラフトに応募したことがあったのを思い出した

こんにちわ！

今回はunityもVRも関係ない記事です。

以前、応募したデザイナードラフトについて。
(ちなみに、私は、断じて転職希望で応募したわけではありません！！！)

こちらの記事はデザイナードラフト体験談投稿キャンペーンに参加しています!!

ということで、宣伝すると良いことがあるので、書かせて頂きます！！

少し長いので
＜目次＞
・デザイナードラフトって？
・デザイン勉強してました
・応募して指名されたか？
・まとめ

★まずデザイナーズドラフトとは？
デザイナーがポートフォリオを登録すると、企業から指名が入るという仕組みです。指名には年収も提示されます。
転職活動をしてなくても、とりあえず登録して自分の市場価値を知ろう！というのが目的でした。
つねづね、自分の価値を高めるということは意識しなくてはいけないなと思っているので。


★デザインを勉強してました
そうなんです。通信制の教材でめちゃくちゃ勉強してました。勉強期間は半年ほどでしょうか。
クリエイターにとって、デザインというか、ビジュアルを作る力って、とても大切だし、なにを作るにもついてまわるものだと思うので・・。というのが、最終的な動機にですが、
学びはじめたときは、楽しそう！俺にもできんじゃね？
くらいのテンションでした。
(実際はめちゃくちゃ難しかった・・。というか、
　奥深かった・・という感じでしょうか。
　ソフトの使い方の習得とかはなんとでもなるんです。
　そして、それ以降の、デザインの基礎、基本、法則、
　みたいなところの習得もけっこうできます。
　その後、言葉で語れない何か、の領域に入ったとき、
　混沌とした答えのない広大な世界が広がっているのです)

★応募して指名されたか
　はい！されました。
　なので、しかも私にとっては、とても嬉しいことに、
　非常に有名な企業から、とても良い条件でお話しいただきました。
　しかし、まぁ、上記の通り、そもそもが、
　転職意志がありませんでしたので。。
　でも、短期間で勉強したことを評価されたというのは、とてもうれしかったです。
　勉強には明確なゴール目標が必要なので、その観点からも良かったと思っています。

★まとめ
　まぁ登録自体、ミニマムならすぐにできるので、興味のある方は是非登録してみてはいかがでしょうか！！
　詳細：https://designer-draft.jp/articles/77
　もしデザイナーの方で、ポートフォリオがなーい！！という方がいらっしゃいましたら、逆にチャンスです。なぜなら、ポートフォリオを作るきっかけだから。いつやるか・・・という話ですね！！
　また、エンジニア版のドラフトもあるそうなので、そちらも興味ある方は登録してみてはいかがでしょうか。

　以上、珍しく長文です！！
CircleCIで、Firebaseのコマンドを実行させる方法

# やりたいこと

- リモートプッシュ時に Firebase のデプロイコマンドを実行したい

# つまづいたこと

- CircleCI環境下で、firebase のコマンド実行につまづいた

# 解決法

CI環境下で、Firebase のデプロイをしたいので、`firebase-tools`をインストールする必要があります。

最初に、グローバルでインストールしようとしましたが、CircleCI環境下では、それが許可されていません。(そりゃそうか)

```bash
$ #!/bin/bash -eo pipefail
npm install -g firebase-tools
npm WARN checkPermissions Missing write access to /usr/local/lib/node_modules
npm ERR! path /usr/local/lib/node_modules
npm ERR! code EACCES
npm ERR! errno -13
npm ERR! syscall access
npm ERR! Error: EACCES: permission denied, access '/usr/local/lib/node_modules'
npm ERR!  { Error: EACCES: permission denied, access '/usr/local/lib/node_modules'
npm ERR!   stack: 'Error: EACCES: permission denied, access \'/usr/local/lib/node_modules\'',
npm ERR!   errno: -13,
npm ERR!   code: 'EACCES',
npm ERR!   syscall: 'access',
npm ERR!   path: '/usr/local/lib/node_modules' }
npm ERR! 
npm ERR! The operation was rejected by your operating system.
npm ERR! It is likely you do not have the permissions to access this file as the current user
npm ERR! 
npm ERR! If you believe this might be a permissions issue, please double-check the
npm ERR! permissions of the file and its containing directories, or try running
npm ERR! the command again as root/Administrator (though this is not recommended).

npm ERR! A complete log of this run can be found in:
npm ERR!     /home/circleci/.npm/_logs/2018-09-28T03_37_43_747Z-debug.log
Exited with code 243
```

公式ドキュメントに、Firebaseでのセットアップ方法が、ありました。
https://circleci.com/docs/2.0/deployment-integrations/#firebase

また、シンボリックリンクを作成して、実行する方法も、CircleCIのQAにあったので、これらを参考にして、以下の`config.yml`で実行
https://discuss.circleci.com/t/firebase-cant-finde-npm-package/20126/3

```yaml
# Javascript Node CircleCI 2.0 configuration file
#
# Check https://circleci.com/docs/2.0/language-javascript/ for more details
#
version: 2
jobs:
  build:
    docker:
      - image: circleci/node:8
    
    working_directory: ~/repo

    steps:
      - checkout

      # Download and cache dependencies
      - restore_cache:
          keys:
          - v1-dependencies-{{ checksum "package.json" }}
          # fallback to using the latest cache if no exact match is found
          - v1-dependencies-

      - run: npm install
      - run:
          name: 'Install Dependecies'
          command: npm install --save-dev firebase-tools

      - save_cache:
          paths:
            - node_modules
          key: v1-dependencies-{{ checksum "package.json" }}
        
      - run:
          name: 'Build Client Code(react-scripts によるビルド実行)'
          command: npm run build
      - run:
          name: 'Deploy to Hosting'
          command: >- 
              ln -s ./node_modules/firebase-tools/bin/firebase . &&
              ./firebase deploy --only hosting --project "$FIREBASE_PROJECT_ID" --token "$FIREBASE_TOKEN"
```

Firebase は、CI環境用に用意されたコマンドから、トークンを取得できるので、CircleCIにそれぞれ`FIREBASE_PROJECT_ID`と`FIREBASE_TOKEN`を設定し、CIを走らせて、完了！
2018年版：Docker runで主要な環境を整備してみた

# 基本形
```
docker run ()
```

# できたもの
- python
- php
- perl
- java
- nodejs
- golang
- haskell
- ruct

# できなかったもの
https://hub.docker.com/ で公開されているものを探せばできます。
一例ですが、

- scala
- kotlin
- rlang

などは比較的簡単に見つかります。

# 言語やスクリプト以外
- mysql
- postgres
- mongo
- mariadb

など、他多数。
wordpressなんかもofficialがありました。

# 読了後いいね！をお願いします。
どれだけの方に読んでもらっているか知りたいので、お手数をおかけしますがご協力いただけると嬉しいです。
手っ取り早くローカルファイルをWebサーバに乗せて確認する

ローカルあるhtmlって直接開くとJS動かなかったりしますよね。

そんな時はローカルでWebサーバを立ててファイルを公開ディレクトリに置いてブラウザで開くってやると思います。

ところがdockerがあればコマンド一発で公開できます。

まず、公開したいディレクトリにcdしてから

```
docker run --name temp-nginx -v $(pwd):/usr/share/nginx/html:ro -d -p 8888:80 nginx
```

だけで localhost:8888 で開けます。

役目を終えたら

```
docker rm -f temp-nginx
```

でdockerコンテナを消せます。
SPSS Modelerクライアントのメモリ設定

#1. メモリ設定
SPSS ModelerのGUIのメモリ設定は以下で変更ができます。複雑なグラフかストリームを表示したり実行するときに不安定になる場合は変更を試してみることができます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/3b242080-536b-fd7c-e6f2-a5581af78538.png)

32bit版では1195MBが最大値です。
64bit版ではマシンで持っているRAMに合わせて、2048MBや4096MBなどをまず試すのがよいかと思います。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/ebd4ce1d-4839-f374-b5d6-9c8353393783.png)

参考
システムオプション
https://www.ibm.com/support/knowledgecenter/ja/SS3RA7_18.1.1/modeler_mainhelp_client_ddita/clementine/systempreferences_dialog.html

IBM 最大メモリとメモリの総割り当て量について - Japan
http://www-01.ibm.com/support/docview.wss?uid=swg21623288

#2. メモリの節約
Modelerでテーブルノードやグラフノードで開いたウインドウを閉じるときには閉じ方が２つあります。右上の赤い×はメモリからも解放します。黒い×はウインドウは閉じてもメモリに残っています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/47bc295a-7b5f-5dd6-4d2d-25ae4e406b1c.png)

黒い×で閉じた場合は出力タブに残っていてダブルクリックすると、処理を再実行しなくてもすぐに開きなおすことができます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/645a8846-e6b5-873a-70f3-5a229975d43d.png)

しかし不要になった出力結果を保存しているとメモリを圧迫しますので、不要になったものは右クリックで削除をしてください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/523f99db-4131-5969-9b72-a8116ebc4019.png)



#3. メモリの解放
Modelerのウインドウの右下のXXMB/XXMBをクリックすると解放可能なメモリを解放することができます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/3f49d876-6ba5-c705-6755-9346082e405b.png)

参考
IBM Knowledge Center - メモリーの管理
https://www.ibm.com/support/knowledgecenter/ja/SS3RA7_18.1.1/modeler_mainhelp_client_ddita/clementine/memory_managing_tips.html


#4.jvm.cfgの設定
「JavaVMのオープンに失敗」したというというエラーが出ることがあります。この時にModeler導入ディレクトリ\config\jvm.cfgのoptions, "-Xmx"を設定すると改善することがあります。-Xmsを大きくしすぎても同じエラーがでることがあるので、-Xmsはあまりいじらないほうがよいと思います。

参考
IBM Exporting to Excel 2007 format fails with: Internal Error. Failed to open Java VM - Japan
https://www-01.ibm.com/support/docview.wss?uid=swg21970560