OmniAICreator/Qiita-1.07M huggingface dataset:
Electron + AngularでEXEランチャー作りました。

#作成した背景
現在参画している現場でAngularを使うことになったのでそのキャッチアップも兼ねて自分が作りたいデスクトップアプリを作成しました。
まあ後は自分がElectron触りたかっただけなんですけどね。笑

#使用言語についてざっくり
###Angular
JSのフレームワーク。大体Angular CLIで色々する。
テストツールとかいろいろ纏まってるお陰でライブラリを選定しなくていい。

###Electron
Chromium(ブラウザのChromeの元になってるブラウザ)とNode.jsで動くソフトウェアフレームワーク。
HTMLとJSとCSSでMac,Win,Linuxに対応するアプリケーションを作れる。
Atom,Discord,Skype,Slack,Visual Studio CodeとかはElectronで作られてる。
おんなじソースを各プラットフォーム向けにビルド出来たりする。

#作成したアプリ概要
ソース
https://github.com/san-you/Trigger

パッケージ済みファイル
https://github.com/san-you/Trigger/releases/tag/v1.0.0
Trigger_Packaged.zip

パスを入力してそのパスにあるexeを起動してるだけです。笑
今後なにか要望があれば機能は追加する予定です。

#アプリの詳しい説明
ElectronとAngularを使ったexeランチャーです。
ホーム画面、設定画面の二つの画面から構成されてます。
winしか今のところ対応してないです。

##起動方法
解凍したフォルダ内のtrigger.exeを起動してください。

##使用方法
設定画面でパスを打ち込んでホーム画面でそのexeを起動するだけです。
超シンプル。
初回起動だと
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403521/24bb41f1-5c32-b582-b8bf-a68247fa52f4.png)
以下のような画面になってると思います。
まず設定画面でアプリのパスを設定してください。
設定画面は
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403521/c817b571-f2b0-5d15-1eb8-d26e2f97e562.png)
ここ押すと出てくるメニューの
![無題2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403521/47e4c042-816d-9dcf-8af0-733efbac9e96.png)
歯車のマークを押すと設定画面に行きます。

###設定画面
アプリを登録する画面です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403521/6265323e-5a9f-9854-4810-413ff3cf5a82.png)
最初は登録されたアプリの一覧が出てます。
![無題3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403521/661a05d0-e1c9-9fd9-ceae-79740632b19c.png)
左下のEditボタンを押すと編集モードに入って
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403521/7f3d05ec-40e4-37dc-c342-4419c69d4a42.png)
アプリ名とexeのパスを登録できます。

今回は適当にSteamを登録します。
名前とパス入れてSaveボタン押下で登録できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403521/c9d33bee-d4ff-be67-514d-c28026278ec4.png)

###ホーム画面
メニューからホーム画面に行ってもらうと
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403521/5e157770-f270-cfb2-362b-3cc0d9e94c05.png)
先ほど登録したアプリが表示されてます。

あとはlaunchボタンで起動するだけです。
超シンプル。

###細かい仕様
・設定画面のアプリのパスは実際に存在する拡張子が.exeのパスじゃないと登録できないようにしてます。
・アプリの最終起動時間も登録されるようになってます。
・設定ファイルはC:\Users\\[ユーザ名]\AppData\Roaming\Triggerのapp.jsonとconfig.jsonです。

#制作小話
初JSフレームワークの勉強でサクッと作りたかったのでWebサービスではなくElectronをチョイスしましたが
ElectronはElectronでメインプロセスとレンダラープロセスの違い等厄介なところがあってつまりました。
レンダラープロセスでもNodeのAPI使えるって書いてあるのにめちゃめちゃ怒られて5時間くらい悩んだあげく原因は
ウィンドウ初期化のオプションに一行追加するだけとかありました。笑

あとAngularでうまくJsonをループして画面とデータを同期する方法が分からなくて力まかせに実装してます。
ここは絶対もっといい方法があるはず。閃いたらこっそり修正しときます。笑

でもAngularは画面作るのがめちゃめちゃ楽ですね。UIはAngular Materialってライブラリだけでほぼ出来てます。
自分でテーマ作ればあとはボタンとか適当に配置するだけで初学者でもこんなに綺麗なUIが作れて感動すらしました。
配置を整えるCSSのほうがよっぽど時間食いました。

あと全然Angular関係ないんですが初めてGitHubのRelease機能使いました。
友達とかにあげるときもURL送るだけでいいのでめちゃめちゃ楽ですね。
自分でも管理しやすいし。

ただElectronは対策しないといけないセキュリティの問題が結構あるので
webアプリをそのままElectronに乗せるだけだとセキュリティ面では不安です。

#作ってみた感想
Angularすごい。Electronすごい。
なんか自分用のアプリ作るときはこれが第一選択肢になりそうです。
やっぱり初めて触る技術は楽しいですね。
独学したお陰で現場でも遅れ無しでAngularのタスク進められているのでやってよかったです。

みなさんもよかったらぜひ触ってみてください。
(なんかバグあったらissuesに乗せといてください。こっそり直します。笑)
herokuにpushしたはずのページが表示されず、We're sorry, but something went wrong と表示される

# ※初学者向けです。
herokuにpushしたはずのページが表示されず、`We're sorry, but something went wrong`と表示されて困った時の対処法をメモ。

# 結論
ターミナルで下記を実行すればOKです。

```
$ heroku run rails db:migrate
```

※他の原因もあるかもしれませんが、初学者が陥りがちなパターンについて書いています。

# 経緯
herokuにpushして、Webページをチェックしようとしたところ、下記の画面になりました(汗)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/465401/1d9f3a73-ee60-097a-31c3-dbed398c274d.png)

開発環境ではうまくいっていたのになぜ！？
Something went wrongって...何がwrongやねん！

という気持ちを抑えつつ、原因を調べてみると、
**「本番データベースのマイグレーションを行なっていなかったこと」**
が原因だと分かりました。

開発環境ではマイグレーションファイルを`rails db:migrate`していたのですが、
これを本番環境でもやらないといけなかったのですね。
（そうしないと、「マイグレーションファイル」=「データベースさんへのお願い事項」の記述だけあるものの、実際にお願いをしていない状態になってしまう）

したがって、**結論**でも書いたように、herokuコマンドを使ってターミナルで下記を実行します。

```
$ heroku run rails db:migrate
```

すると、無事herokuのWebアプリケーションが動作し、ページが表示できます！

※ちなみに、herokuの本番環境で起きているエラーの原因を知りたい時には、
ターミナルで`heroku logs`を実行すると直近のherokuのログ情報を参照できます。

# まとめ
新規、あるいは更新したマイグレーションファイルがある場合、
`heroku push`を行なった後に`heroku run rails db:migrate`もしっかり行うこと。
Google App Engine(GAE)とは？

#GoogleAppEngineとは
Googleのインフラ上でアプリケーションを作り、実行できるようにするPaaSです。メンテナンスをするのが簡単で、トラフィックやデータストレージのニーズ増減に合わせて自動的にスケーリングする。

##対応しているプログラミング言語
- Java
- Python
- PHP
- Go
- Node
- などなど…

## クォータと制限
App Engineは、1GBのデータストレージとトラフィックを無料で提供します。有料アプリケーションを有効にすれば、この値を増やすことができます。
Nordic Nrf528xxを使ってみよう nrf52832 Arduino編

Nrf528xxを使ってみよう　からArduino編です。

nrf52はSegger Embedded Studio以外にArduinoで開発を行うことが可能です。

Arduinoを起動します。
ファイル⇒環境設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/1d6326f6-ecd7-10eb-2e0b-b6e09910019d.png)

追加のボードマネージャーのURLに
https://www.adafruit.com/package_adafruit_index.json
と入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/bfed2750-7568-21ec-7600-7d96e5fef4be.png)

ツール⇒ボード⇒ボードマネージャーをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/4d70f8e7-202b-fec3-5353-5dd448c7d495.png)

Adafruit nRF52 by Adafruitを選択し
インストールします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/1fb48d2b-0af2-c483-f45e-2d4ae837127a.png)

Adafruit nRF52832を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/82ab3186-3fca-18e7-9ec8-99c5ed631542.png)

次にブートローダーを書き込みます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/4c590956-5318-0137-1aae-f98ba4d8df07.png)

書き込んだ後は、このようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/d5d735bc-b645-91cc-7944-f3fa979802e3.png)
なお、nrfGoStudioで書き込むときは、こちらを使用します。
nrf52832
https://github.com/adafruit/Adafruit_nRF52_Arduino/tree/master/bootloader/feather_nrf52832
nrf52840
https://github.com/adafruit/Adafruit_nRF52_Arduino/tree/master/bootloader/pca10056

書き込みをします。
こちらのボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/98cc5dd8-098e-0952-4d24-26c2b49e380b.png)

なお、書き込みの際にリセットボタンを押す必要があるものがあります。
書き込みに失敗するようならば、下記の状態の時にリセットボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/be6dbe31-5387-7a5f-6a36-05e70e675f1c.png)

成功するとこの画面になります。
![Arduino-15.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/8de44b4e-d047-2e9d-c7c1-bee3b1e4df88.jpeg)
docker環境でのRailsアプリの立ち上げ

Docker環境でのRailsアプリの立ち上げまで。
エラーが出たので備忘録も兼ねて。

```
mkdir アプリ名
```
フォルダを作成し、cdコマンドでそのフォルダ内へ移動。

```
touch Dockerfile
```
ファイルを作成（中身の記述はdockerの公式サイトを参照）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455858/43d3c668-e326-287c-f386-1912eadc656a.png)

```
bundle init
```

Gemfileを作成（中身の記述はdockerの公式サイトを参照）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455858/2caa271a-261c-fbdf-8ccf-37639f68d1d7.png)
※railsのバージョンは特に指定しなくても問題ない模様。

```
touch docker-compose.yml
```
ファイルを作成（中身の記述はdockerの公式サイトを参照）
￼![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455858/ed0ff1ab-fd7f-a69e-7bed-178b8180c772.png)

```
docker-compose run web rails new . --force --no-deps --database=postgresql
```
上記のコマンドでアプリを立ち上げ。

ここで下記のエラーが発生

```
response from daemon: OCI runtime create failed: container_linux.go:345: starting container process caused "exec: \"rails\": executable file not found in $PATH": unknown
```

調べていたら下記のコマンドを実行することで解決できた。

```
docker-compose build
```

アプリの立ち上げだけで2時間…。
エラーの原因が分かればもっと早く解決するのでしょうけどうまくいかないです。

今日は以上です。

参考
https://qiita.com/tettekete/items/7c21a003268103f8547d
https://qiita.com/sakuraniumarete/items/f36a937412d281dfcf57
TypeScriptをはじめよう 1

#事のはじまり
後輩「サークルで何かウェブサービスの実装、運営したくないですか？」

僕「いいけど、何で作る？」

***後輩「TypeScript」僕「Scala」***

Scalaを触ったことのない後輩「......」 TypeScriptを触ったことのない僕「......」

困ったら開発は流行に乗るのが良さそう？

というわけで、ゼロからはじめるTypeScriptによるWebアプリ開発がスタートしました。

※この記事はTypeScriptを通して開発を学ぶ初心者のお話です。過度な期待は止めようね。

#TypeScriptって何？
TypeScriptはJavaScriptをベースにMicroSoftに開発された言語であり、JavaScriptのスーパーセットです。TypeScriptはコンパイルすることでJavaScriptコードを生成します。MicroSoftに開発されてるということはMicrosoft Visual Studio， Visual CodeのようなIDEにサポートされているということです（最初は全くサポートされてなかったらしいですけど）。
JavaScriptはECMAScriptという標準を持ち、ECMAScript6とともにTypeScriptが登場しました。その時に追加された機能にはクラスやlet、constなど開発の大規模化に伴って必要とされる便利な機能やTypeScript独自の機能が存在しました。

以下、独自にTypeScriptに追加された機能。

- 静的型付け
- 型推論
- 列挙型
- インタフェース

など



#環境を作る(windows)
はじめにNode.jsをインストールします。Node.jsはサーバーサイドのJavaScript実行環境です。詳しくは別記事として書こうと思うので、今はこれがあればJavScriptが動くぞということだけ覚えてください。
インストールは[公式サイト](https://nodejs.org/ja/)から行います。特に問題が無ければ推奨版(LTS)を導入しましょう。今回はwindowsのみの紹介ですが、macOS版インストーラやLinux版のバイナリも置かれています。インストールはデフォルトであれば迷うことはないと思います。

```
node -v
```
上記コマンドでバージョンの確認ができれば、次にTypeScriptの環境を作ります。
導入は簡単で、Node.jsのパッケージ管理ツールのnpm(Node Package Manager)を使います。
今回はTypeScriptの導入に使いますが、他にWebフレームワーク(Express)の導入にも使います。

```
npm install -g typescript
```
上記コマンドでTypeScriptが導入されるので、以下のコマンドで確認しましょう。
ローカルでtypescriptが使いたい場合は -g オプションを省略してください。

```
tsc -v
```

### Hello,world!

```typescript:hello.ts

function main() {
    const greet : String = "Hello, world!"
    console.log(greet)
}

main()

```
```
tsc hello.ts
node hello.js
```
# おわりに
この記事はサークル内での情報共有を目的としたものであるため、「分からないこと」や「知っておかないといけないこと」などを開発とともに順次内容を増やしていく予定です。そのため、内容が飛んでいることや間違っていることがあるかもしれませんのでご注意ください。また、この記事ではHello,World!の出力を最後に行い、Web開発の基本にはこれから触れていきます。今後は簡単なWebアプリを開発することでExpressなどのフレームワークやORマッパーの使い方をまとめていきたいと思います。

---
[TypeScriptをはじめよう 2](https://qiita.com/Miso_DengakuTY/items/745f8e51ac34ff602850)
NSInternalInconsistencyException系のクラッシュ対策記事まとめ


# はじめに

メモる前にリンク消しちゃたのでまたタイミング合えば追記。

`NSInternalInconsistencyException`系のエラーは

```
Terminating app due to uncaught exception
```
で大抵始まる

# 'NSInternalInconsistencyException', reason: 'Application windows are expected to have a root view controller at the end of application launch'
**・[iOS9でアプリが起動直後にクラッシュする場合の回避方法 - Qiita](https://qiita.com/peromasamune/items/716de6da66dd31faeba8)**
【mac】IntelliJ+Laravel+Vuejsの環境構築：Intellijでプロジェクトを作る

# 環境

もちろんlaradock環境とかやりたいと思ってたんですが、
macが古い問題なのかわからないですが、
dockerのvolumeでmac自体と同期するのに時間がかかって開発にならない。
ということで、docker環境はデプロイ時に使用して、基本開発ではmac上に同じ環境を作って開発することにした。


```
mac OS
Laravel
Vuejs
Intellij
```

バージョンを決めてインストール

```
brew install php@5.hogehoge

brew install php@7.1
or
brew install php@7.3
or
こんな感じで拡張モジュール入れたかったけど、まだ機能がないぽいので諦める。
ビルドすればいいと思う。
#brew install --enable-mbstring php@7.3
#brew install --enable-fpm --enable-intl --enable-mbstring --enable-soap --enable-sockets --with-curl --with-homebrew-curl --with-httpd php
```

都度必要なパスを指定。


```
export PATH="/usr/local/opt/php@7.1/bin:/usr/local/opt/php@7.1/sbin:$PATH"
or
export PATH="/usr/local/opt/php@7.3/bin:/usr/local/opt/php@7.3/sbin:$PATH"
```

```
php -v
```



# ララベル構築

Intellijでphpとcomposerを選択し、laravel/laravelを選択して作成。

<img width="1111" alt="スクリーンショット 2019-07-18 5.43.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64334/c2aeb129-d8ac-c790-68d3-89f022f0182e.png">

npm installでパッケージインストール。npm run devでコンパイルし、npm run watchで自動的に検知してコンパイル。npm run watchされてると変更あるたびにビルドかかるので便利。
php artisan serveでサーバー起動。


```
npm install
npm run dev
npm run watch
php artisan serve
```
【勉強会メモ】Firebase Meetup in Osaka #4

* 場所：WeWork なんばスカイオ
* 時間：18:30 ～ 20:30

最近Firebaseを用いたSPAを作成しているため、何かヒントが得られればと参加してきました。
主催団体のFirebase Japan User Group（FJUG）では、Firebaseの利用者をどんどん増やそうということで、月一でのMeetup開催を目指しているそうです。
Firebaseを触り始めた身としては、普段使っているFirestore以外にもたくさんの機能があり、使い方によってはサービスにとって大きな武器になることを実感できました。

※ 学んだ内容を簡単にまとめていますが、不適切な記述等ありましたら、修正させていただきます。

# Firebase Growth Hack
1amageek さん
https://speakerdeck.com/1amageek/firebase-growth-hack?slide=66

## MVP（Minimum Viable Product）
小さく開発して無駄なコストを削減する手法

* アイディアがサービスになるにはコストがかかる
  * このコストには時間も含まれる
* コストを抑えることが重要

→ コストを抑えるには、Firebaseは最適である

## マーケティングとFirebase
サービスのユーザについて知ることで、ユーザに対し、的確なアプローチが取れる。
ユーザについて知るための機能として、以下のようなFirebaseの機能を利用できる。

### Audience
* 得られる情報
  * ユーザセグメント
  * ユーザプロパティ

* 活用例
  * 未課金ユーザのみ抽出して通知など

### Remote Config
* アプリの動作を変更（リアルタイムに反映可能）
* ユーザへパーソナライズできる
  * ゲームの難易度を低くする
  * 安いおすすめ商品を紹介する

### Cloud Messaging
* プッシュ通知を送る
  * 定期配信も可能
  * 非アクティブユーザをアクティブユーザに、アクティブユーザを課金ユーザに促すなど

### Prediction
* ユーザの行動予測
  * 退会ユーザを予想して身を削るアプローチを検討など

### 別の話題：iOSのライブラリ"Ballcap"
* 演者が開発している
* 簡単にFirebaseを利用可能

#### 特徴：キャッシュが使いやすい
Firebaseはデフォルトでは、通信確立中はサーバの情報を、そうでなければキャッシュを見る
→ 必要ないときはキャッシュを参照するようキャッシュ周りの操作が楽になっている


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

# ゼロから始めるFirebase
Zonomaaさん

## Firebaseの料金プラン

* Spark
  * 無料プラン
  * 無料接続数がなくなると500エラーが返ってくる
* Flame
  * 固定料金
* Blazed
  * 従量料金
  * 無料枠分の接続数は無料

## サービスについて
あまりに多すぎるため代表的なもののみ

### FireStore
以下の3つの概念を基にした、NoSQLデータベース
* Collection → フォルダの概念
* Document → ファイルの概念
* Data → テキストの概念

### Firebase Functions
Firebaseの機能や、HTTPSリクエストなどで動かすことのできる機能
* 無料枠ではGoogle外にリクエスト不可
* FireStoreのアクションもトリガにできる

### Firebase Authentication
様々なサービスと連携できる認証機能

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

# LT：読書管理アプリ
（ごめんなさい、発表タイトルがメモできていませんでした...）
ふじた さん

* Firebaseを使った読書管理アプリ
* 自分で作ったアプリを使ってモチベーションを維持
* 将来的にはCloud Functionsで書籍情報を自動取得させる

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

# ディズニー待ち時間アプリ
（ごめんなさい、こちらも発表タイトルがメモできていませんでした...）

shohei さん

アプリに使えるFirebaseの機能紹介

* Crashlytics：クラッシュの情報まとめ
* Performance：パフォーマンスの確認
* Remote Config：リアルタイムに反映できる設定ファイル
* Cloud Messaging：通知機能
* Stream View：どこからアプリが使われているか（地図上で確認可）
* Latest Release：ユーザがどのバージョンのアプリを使っているか
* Firestore：DB
* Firebase Event：イベントログ取得
* Firebase Authentication：認証
* Cloud Functions：サーバサイド
* Schedule Functions：cron
* Test Labs：各種端末でのテスト
* Dynamic Link：リンク
* Predictions：ユーザの分類
* MLKit：機械学習

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

# LT：Goの関数をCloudFunctionにデプロイした話

Yuji_Onishi さん

* Goの関数をCloudFunctionにデプロイするときのGoならではの問題点等

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

# LT：FireSQL

https://docs.google.com/presentation/d/1UwlsxkhQv4ONIkE5CrkUA9sMhEIXoGYgyDkxWcW-LQc/edit

* リアルタイムで更新される
* MySQL
* リアルタイムお絵かきソフトや、共同編集ドキュメントツールなどのデモ
よくやりたいけど忘れるHTML関係の自分用メモ

よくやりたいけど忘れるHTMLをGitHubにまとめ中。
[GitHubのリンク](https://github.com/project-dev/websample)

- 中央表示
- タイル状に並べるけど画面サイズによって表示数を変える  
CSSだけでもできるんだけどきれいにやるためには、JavaScriptも使わないとできない。

詳しくはGitHubのソース見てね！
さて、タイル状のソースできたから、お仕事中の息抜きに見るためのRSSリーダー作らないと。
(PWAにして公開したいところ)
バックグラウンド処理・再生の優良記事まとめ[Swift]

# 基本
**・[【Swift】mp3をバックグラウンド再生する - しめ鯖日記](http://www.cl9.info/entry/2017/10/18/133537)**
→とりあえず形だけでもやりたい人向け
**・[Swift でミュージックを取り込むアプリを作る時のノウハウ 5 つ - Qiita](https://qiita.com/pika_shi/items/838315c7c8e264c9bb97)**
→バックグラウンドだけでなく音楽ファイルを扱う時のポイントがまとまっている
**・[[Swift] iOSのバックグラウンド処理について - Qiita](https://qiita.com/teamhimeH/items/51efb4fc68d3f1d2ebb9)**
→180秒程度の処理であれば`UIApplication.shared.beginBackgroundTask`とかでうまくやるといけるらしい

# アプリの状態の取得
**・[[Swift]アプリのフォアグラウンドに特定の処理を行う。 | RE:ENGINES](https://re-engines.com/2018/09/03/swift%E3%82%A2%E3%83%97%E3%83%AA%E3%81%AE%E3%83%95%E3%82%A9%E3%82%A2%E3%82%B0%E3%83%A9%E3%82%A6%E3%83%B3%E3%83%89%E3%81%AB%E7%89%B9%E5%AE%9A%E3%81%AE%E5%87%A6%E7%90%86%E3%82%92%E8%A1%8C%E3%81%86/)**

**・[【Swift4】アプリがバックグラウンド状態かアクティブ状態か調べる方法【Objective-C】 | ニートに憧れるプログラム日記](http://program-life.com/830)**
→これでいけますよという話

```swift
if (UIApplication.shared.applicationState == .active) {
    print("Active");
} else if (UIApplication.shared.applicationState == .inactive)  {
    print("Inactive");
} else if (UIApplication.shared.applicationState == .background)  {
    print("Background");
}
```

**・[【Swift4】アプリがバックグラウンド状態かアクティブ状態か調べる方法【Objective-C】 | ニートに憧れるプログラム日記](http://program-life.com/830)**

#### Rx
**・[swift4でRxSwiftを使用して、ViewControllerからアプリのバックグラウンド、復帰のイベントを取得する - Qiita](https://qiita.com/fumihiko-hidaka/items/44b292a06cd5af57ac25)**

# UserNotifications
**・[【Swift】この時期だから見直すiOS10の新機能 UserNotificationsとNotification Content ExtensionとNotification Service Extension - Qiita](https://qiita.com/shiz/items/ab39faae1ef3a758fc08)**
**・[<Swift>iOS 10 User Notifications Framework実装まとめ - Qiita](https://qiita.com/mshrwtnb/items/3135e931eedc97479bb5#%E3%83%90%E3%83%83%E3%82%AF%E3%82%B0%E3%83%A9%E3%82%A6%E3%83%B3%E3%83%89)**
**・[[iOS] ローカル通知について ｜ DevelopersIO](https://dev.classmethod.jp/smartphone/ios-local-notification/)**
**・[[iOS 10] User Notifications framework！ フォアグラウンド時も通知バナー表示 ｜ DevelopersIO](https://dev.classmethod.jp/smartphone/iphone/wwdc-2016-user-notifications-8/)**

# MPRemoteCommand
**・[[iOS][Swift]リモートコマンドイベントに対応する – nackpan Blog](https://nackpan.net/blog/2015/09/25/ios-swift-remote-control-event/)**
**・[MPRemoteCommandCenterでオーディオファイル再生時のロック画面とコントロールセンターでの操作に対応する - Qiita](https://qiita.com/satoshin2071/items/0138181936d3f41090c3)**


**・[[iOS]電話がかかってきたとき、ヘッドホンジャックが抜かれたときの対応 – nackpan Blog](https://nackpan.net/blog/2015/09/29/ios-swift-phone-call-and-route-change/)**
**・[Swiftで中断した後に音声を再開する方法 - コードログ](https://codeday.me/jp/qa/20190304/359576.html)**
→割り込み時の処理について

**・[iOS7から画面ロック中の音楽再生/停止ボタンのイベントはUIEventSubtypeRemoteControlTogglePlayPauseではありません - Qiita](https://qiita.com/yimajo/items/15e25915d0062c6e56f6)**
**・[ios – MPRemoteCommandCenterの一時停止/再生ボタンが切り替わらない - コードログ](https://codeday.me/jp/qa/20190402/535808.html)**
**・[ios – MPRemoteCommandCenterを使用するとPlay / Pauseコールバックが呼び出されない - コードログ](https://codeday.me/jp/qa/20190429/730793.html)**
→ありがちなエラー系。`MPRemoteCommand`が標準機能みたいな感じなので一部だけエラー起こされると意外に難しい、、、(この辺の記事理解できれば中身もきちっとわかったことになるのかな)
Python基本まとめ(備忘録)

# Python 基本まとめ(備忘録)
## 文字列表示

```Python:
print('Hello, World!')
```
> Hello, World!

``` Python:
print('3 + 4')
```

> 3 + 4

### 連結
```Python:
print('3' + '4')
```

> 34

```Python:
print(str(3) + '4')
```

> 34

### 文字列の繰り返し

```Python:
print('3' * 4)
```

> 3333

### 改行

```Python:
print('ABC\nDEF')
```

> ABC
> DEF

## `.`シーケンスを取り除く

```python
setup = 'a duck goes into a bar...'

# '.'シーケンスを取り除く
print(setup.strip('.'))
```

> a duck goes into a bar

## 先頭の単語のタイトルケース

```python
setup = 'a duck goes into a bar...'

# 先頭の単語のタイトルケース
print(setup.capitalize())
```

> A duck goes into a bar...

## すべての単語のタイトルケース

```python
setup = 'a duck goes into a bar...'

# すべての単語をタイトルケース
print(setup.title())
```

> A Duck Goes Into A Bar...

## すべての文字を大文字

```python
setup = 'a duck goes into a bar...'

# すべての文字を大文字
print(setup.upper())
```

> A DUCK GOES INTO A BAR...

## すべての文字を小文字

```python
setup = 'a duck goes into a bar...'

# すべての文字を小文字
print(setup.lower())
```

> a duck goes into a bar...

## 大文字小文字を逆

```python
setup = 'a duck goes into a bar...'

# 大文字小文字を逆
print(setup.swapcase())
```

> A DUCK GOES INTO A BAR...

## 30文字分のスペースの中央に文字列を配置

```python
setup = 'a duck goes into a bar...'

# 30字分のスペースの中央に文字列を配置
print(setup.center(30))
```

>   a duck goes into a bar... 

## 左寄せ

```python
setup = 'a duck goes into a bar...'

# 左端
print(setup.ljust(30))
```

> a duck goes into a bar...     

## 右寄せ

```python
setup = 'a duck goes into a bar...'

# 右端
print(setup.rjust(30))
```

>      a duck goes into a bar...

## 数値
```Python:
print(3)
```
> 3

### 加算

```Python:
print(3 + 4)
```
> 7

```Python:
print(3 + int('4'))
```
> 7

### 乗算

``` Python:
print(3 * 4)
```
> 12

### 除算
/だけだと、小数点以下も表示される。//だと、小数点以下は切り捨てられる。
%は、割った余りを求める。

```Python:
15 / 4
15 // 4
15 % 4
```
> 3.75
> 3
> 3

### べき乗
後ろのオペランドの分だけ繰り返し掛け算する。

```Python:
2 ** 4
```
> 16


## 変数

```Python:
x = 10
print(x)
```
> 10

## 比較演算子
比較演算子は、両端のオペランドを比較して、「True」か「False」かを返す。
両端のオペランドが等しいか調べる場合は==を用いる。

```Python:
4 == 4
4 == 5
```
> True
> False

| 演算子       | 意味 |
|:-----------------|:------------------|
| ==            | 両端のオペランドが等しいときにTrue。 |
| !=           | 両端のオペランドが等しくないときにTrue。 |
| >             | 左のオペランドが右のオペランドより大きいときにTrue。 |
| <               | 左のオペランドが右のオペランドより小さいときにTrue。 |
| >=             | 左のオペランドが右のオペランド以上のときにTrue。 |
| <=          | 左のオペランドが右のオペランド以下のときにTrue。 |

## 論理演算子
論理演算子は、両端のオペランドがTrueかFalseかを比較する演算子。

```Python:
3 < 5 and 6 < 8
```
> True

```Python:
3 < 5 or 6 < 8
```
> True
モダンなJavaScript「ECMAScript」でよく使う文法の備忘録

# 概要
Reactのソースを読んでいる際に、あれ、この文法どうなってるんだ？というものがいくつかありました。
今まで自分が使ってたのはES2015の古いJavaScriptで、JSはES2016を界にJavaScriptの仕様が大幅に変更されてよりモダンな書き方が可能になったそうです。
それにあたって、よく使う新しい文法※について備忘録を作りました。

※ECMAScript 2018の基本文法

# 変数の宣言

```
const: 定数の変数宣言に利用
let: 再代入のありうる変数について利用
```

# アロー関数

基本構文

```js
// アロー関数の宣言1
const testFunc =  (n) => { return n + 1}

// アロー関数の宣言2
// 引数が一つだけの場合は括弧を省略可能
// 本文がreturn文だけの時は省略可能※
const testFunc = n => n + 1

// ※ただし、 objectリテラルを返す時は{}が必要なのでそれに伴い()をつけます
const testFunc2 = () => ({ foo: bar})

// 引数がない場合は()は省略不可
() => {  statements }
```


#### Reactでよく出てくる例
reduxの StateとDispatchをそれぞれPropsにマッピングさせるための関数
`mapStateToProps`、`mapDispatchToProps`があります。

```js
const mapStateToProps = state => ({ value: state.count.value })

const mapDispatchToProps = dispatch => ({
  increment: () => dispatch(increment()),
  decrement: () => dispatch(decrement())
})
```

参考： [MDN web docs アロー関数](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Functions/Arrow_functions)

# スプレッド構文

```js
const arr1 = ['A', 'K', 'B']
const arr2 = [...arr1, '4', '8']
console.log(arr2) // ["A", "K", "B", "4", "8"]

const obj1 = { first_name:'Kouji', num:'19'}
const obj2 = { ...obj1, positioon: 'pitcher', last_name: 'Uehara' }
console.log(obj2) //{first_name: "Kouji", num: "19", positioon: "pitcher", last_name: "Uehara"}
```

上のように、 配列やオブジェクトの名前の前に「...」をつけるとそれらの中身が展開されます


# 非同期処理

#### 前提
JSでは時間のかかる処理はほぼ非同期になります。


## 非同期処理のプロセスを待ってもらうやり方

```js
const sleep = ms => new Promise(resolve=>setTimeout(resolve,ms))

const greet = () => {
  console.log("Jony!!")

  sleep(2000)
    .then(()=>{
      console.log('Horinouchi!')
      console.log('Megurono Sanma!!')
    })
    .catch(err=>{
      console.log('Danshi Exception', err)
    })
}

greet()
```

実行結果

```
Jony!!
(2秒sleep)
Horinouchi!
Megurono Sanma!!
```

ES2017のasync/awaitを使った上と同様な非同期処理のプロセスを待ってもらう実装

```js
const sleep = ms => new Promise(resolve => setTimeout(resolve,ms))

const greet = async()=>{
}

const greet = async()=>{
  console.log("Jony!!")

  try{
    await sleep(2000)
    console.log('Horinouchi!')
    console.log('Megurono Sanma!!')
  }catch(err){
    console.log('Danshi Exception', err)
  }
}

greet()
```

# まとめ
基本かつよく出てくるECMAScript特有のものについてまとめました。
随時追加削除更新をしていきたいとおもいます。
挿入ソート　

#Insertion_sort(挿入ソート)    


```cpp
    #include<iostream>
    using namespace std;
    
    int Insertion_sort(int N, int A[]){
        for (int i=1; i<N; i++){
            int tmp=A[i];
            int ins=0;
            
            for (int j=i-1; 0<=j; j--){
                if (tmp<A[j]) A[j+1]=A[j];
                else {
                    ins=j+1;
                    break;
                }
            }
            A[ins]=tmp;
        }
        for (int i=0; i<N; i++) cout << A[i] << " ";
        return 0;
    }
    
    int main(){
        int n;
        int A[1000];
        
        cin >> n;
        for (int i=0; i<n; i++) cin >> A[i];
        Insertion_sort(n,A);
        return 0;   
    }
```

*Insertion_sort(n,A)のAと置くポイントに注意！*
GolangとDBを接続して株価データをチャート表示する(その2)ajax対応


[前回の記事](https://qiita.com/_kyamasan/items/a105cd97269feea7a30a)で作ったプログラムを進化させます。

##やりたい事
前回は一つの銘柄に絞ってデータを表示させましたが、今回はテキストボックスに入力した銘柄コードを元に、
チャートを表示する機能を作成したいと思います。

##HOW TO DO

```html
<body>
    <input id="stockcode" type="text" value="">
    <input id="btn" value="SHOW CHART" type="button" onclick="showChart()">
    <div id="chart_div" style="width: 1500px; height: 500px;"></div>
</body>
```

htmlにテキストボックスとボタンを用意します。

```javascript
function send () {
    $.ajax({
        url: "/getdata/",
        type: 'post',
        data: {
            cd: $('#stockcode').val()
        },
        dataType: 'json' 
    }).done(function (data) {
        var priceData = []
        for (let i = 0; i < data.price.length; i++) {
            var array = data.price[i]
            priceData.push([array.time, array.low, array.open, array.close, array.high ])
        }

        var chartData = google.visualization.arrayToDataTable(priceData, true);
        
        var options = {
            legend:'none',
            candlestick: {
                fallingColor: { strokeWidth: 0, fill: "#1451a5" },
                risingColor: { strokeWidth: 0, fill: '#a52714' }
            },
        };

        var chart = new google.visualization.CandlestickChart(document.getElementById('chart_div'));
        chart.draw(chartData, options);
    })
}

function showChart() {
    send()
}
```


```webserver.go
func getDataHandler(w http.ResponseWriter, r *http.Request) {
	cd := r.FormValue("cd")
	df, _ := models.GetData(cd)
	json.NewEncoder(w).Encode(df)
}

func StartWebServer() error {
	http.HandleFunc("/data/", dataHandler)
	http.HandleFunc("/getdata/", getDataHandler)
	return http.ListenAndServe(":8080", nil)
}
```

ボタンを押したら、ajaxでデータを取ってきたいので、getdataハンドラを一つ追加します。
ajaxでcd(銘柄コード)をwebserver.goにパラメータとして渡し、r.FormValue("cd")で受け取ります。

後は、GetData()で取得したデータ(df)を
Json形式に変換して(json.NewEncoder(w).Encode(df))返してあげるだけです。

##結果
無事、取得できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466621/72bcae50-983a-6360-b4c0-f9f4f060eea3.png)
Assertion failureでクラッシュのまとめ[Swift]

結構種類あったはずなんだけどメモる前にリンク消してしまったみたいなのでまたの機会に追記

# Assertion failure in -[UIApplication _runWithMainScene:transitionContext:completion:]
**・[Xcode 7 でビルドしたアプリが起動直後に Assertion failure - Qiita](https://qiita.com/ktysne/items/01fed9713b4d8a5d1d4f)**
→`rootViewController`の設定ミスらしい
ImageTk.PhotoImageでつまづいた話

#問題
PSDファイル読み込んでレイヤー別にtkinterのCanvasに表示しようとしたらできなくて困った話

```ruby:問題のコード
def preview(path):
   global canvas
   image = PSDImage.open(path)
   imagetk = ImageTk.PhotoImage(image)
   canvas.create_image(image=imagetk)
```
#原因
関数で「ImageTk.PhotoImage」を使ってオブジェクトを生成しただけだとガベージコレクションで消されちゃってCanvasで表示されないっていう情報がネットで発見
Canvasは参照してるわけじゃないのかなぁ？
それか関数内のものだから関数の処理終わったら消えちゃうとか？
よくわかんない
#対策
ちゃんと残るように生成されたオブジェクトはグローバルの配列で保存することにしました

```ruby:修正後
imagetk_list = list()
def preview(path):
   global canvas,imagetk_list
   image = PSDImage.open(path)
   imagetk = ImageTk.PhotoImage(image)
   imagetk_list.append(imagetk)
   canvas.create_image(image=imagetk)
```



#画面
いえーい、キャンバスに出せたぞ
![213147.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116462/79d964b9-a1cb-2229-4b18-57eb8f9abd22.png)
LeetCode / Minimum Depth of Binary Tree

（[ブログ記事](https://mhiro216.hatenablog.com/entry/2019/08/03/215908)からの転載）

[https://leetcode.com/problems/minimum-depth-of-binary-tree/]

Given a binary tree, find its minimum depth.

The minimum depth is the number of nodes along the shortest path from the root node down to the nearest leaf node.

Note: A leaf is a node with no children.

Example:

Given binary tree [3,9,20,null,null,15,7],
<img width="95" alt="スクリーンショット 2019-08-02 15.03.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122973/57d11d15-879e-12bd-af52-45c576b228cf.png">
return its minimum depth = 2.

[木の深さのMaximumをとる問題](https://mhiro216.hatenablog.com/entry/2019/07/28/093232)はありましたが、今度はMinimumをとる問題です。
maxをminに変えるだけでOK…とは行かないです。

#### 解答・解説

##### 解法1

基本的には、recursiveな関数を定義し1 + min(self.minDepth(root.left), self.minDepth(root.right))で最も浅い木の深さを取得する、という戦略で良いのですが、以下の木のように片方だけsubtreeがない場合、
<img width="35" alt="スクリーンショット 2019-08-02 17.39.30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122973/9fe4fdda-6f7e-9523-a087-54782185d536.png">
最も浅い木の深さを取得してしまうと0となりますが、<b>The minimum depth is the number of nodes along the shortest path from the root node down to the nearest leaf node.</b>と定義されているので、存在するsubtreeを辿った上で、最も浅い木の深さを返す必要があります。
つまり1 + max(self.minDepth(root.left), self.minDepth(root.right))をとるという条件分岐を加える必要があるということです。

```python
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def minDepth(self, root: TreeNode) -> int:
        if not root:
            return 0
        elif not root.left or not root.right:
            return 1 + max(self.minDepth(root.left), self.minDepth(root.right))
        else:
            return 1 + min(self.minDepth(root.left), self.minDepth(root.right))
```

##### 解法2

Discussionの中で、3 linesのシンプルなコードがあったので転載します。

```python
class Solution:
    def minDepth(self, root: TreeNode) -> int:
        if not root: return 0
        d = list(map(self.minDepth, (root.left, root.right)))
        return 1 + (min(d) or max(d))
```

self.minDepthをroot.left, root.rightに適用する処理でmap関数を使っていますね。
が、以下記事にあるように、map関数を適用して得られたイテレータをリストに変換する処理でオーバーヘッドが生じ、計算は遅くなるようです。
実際、LeetCodeへのsubmitを何度か行なってみた体感では、map関数を使わない方が速かったです。

[https://utgwkk.hateblo.jp/entry/2017/03/09/154314]

また最後のreturn 1 + (min(d) or max(d))の処理について補足すると、
pythonで(a or b)は、aが存在すればa、存在しなければbを返します。(min(d) or max(d))は、min(d) > 0のときにmin(d)、min(d) == 0のときにmax(d)を返します。
解法1で説明したように、片方だけsubtreeがない、つまりmin(d) == 0のときに、存在するsubtreeをたどる、つまり1 + max(d)をとるような処理になっています。
Hyperthreading が有効かどうか確認する方法

# 確認方法
\# dmidecode -t processor | grep -E '(Core Count|Thread Count)'

（表示の一例）

Core Count: 4
Thread Count: 8

下の段の数値が上の段の数値の 2倍なので、Hyper Threading が有効になっています。

一般ユーザでも確認できますよ。

$ grep -H . /sys/devices/system/cpu/cpu*/topology/thread_siblings_list | sort -n -t ',' -k 2 -u
（表示の一例）

/sys/devices/system/cpu/cpu0/topology/thread_siblings_list:0,4
/sys/devices/system/cpu/cpu1/topology/thread_siblings_list:1,5
/sys/devices/system/cpu/cpu2/topology/thread_siblings_list:2,6
/sys/devices/system/cpu/cpu3/topology/thread_siblings_list:3,7

上記のトポロジの結果から、Hyper Threading が有効になっており、そのペアもわかります。

# 無効にする方法

では、Hyper Threading を無効にする方法です。

GRUB の設定に、'noht' として再起動することにより、全て無効にできます。

BIOS で無効にしなければいけない場合があります。

以下はある BIOS の一例です。
「FEATURE」-「CPUの機能」-「ハイパースレッディング」
有効から無効にしたところ、Hyper Theading が無効になったようです。
enumによる公開・非公開設定

# 公開・非公開設定

Railsでenumを使うことによって簡単に公開・非公開設定ができたので、備忘録として残しておきます。

## ターミナルでの設定

```ターミナル.
rails g migration AddStatusToUsers status:integer
#migrationファイル
  def change
    add_column :users, :status, :integer, default: 1, null: false, limit: 1
  end
```
Userテーブルにステータスカラムを追加

## Userモデル


```user.rb
enum status:{nonreleased: 0, released: 1}
```
Userモデルに公開時・非公開時の設定を記述

## usersコントローラー

```users_controller.rb
 def release
    @user =  User.find(params[:user_id])
    @user.released! unless @user.released?
    redirect_to  "/users/#{@user.id}/edit", notice: 'このアカウントを公開しました'
  end

  def nonrelease
    @user =  User.find(params[:user_id])
    @user.nonreleased! unless @user.nonreleased?
    redirect_to "/users/#{@user.id}/edit", notice: 'このアカウントを非公開にしました'
  end
```
usersコントローラーで値を取り出し公開・非公開どちらをさせているか判定する

## users編集ページ

```users/edit.html.erb
<% if @user.released? %>
  <%= link_to '非公開にする',"/users/nonrelease/#{@user.id}", method: :patch%>
<% else %>
  <%= link_to '公開する',"/users/release/#{@user.id}", method: :patch%>
<% end %>
```

公開時と非公開時のパスをかく

## まとめ
これだけの記述でユーザーページの公開。非公開設定ができるので、追加機能を実装したい人はぜひ取り入れてみてください。

参考記事：
https://qiita.com/tomoharutsutsumi/items/f1a70babaddcf7ab47be
初心者から見たDjangoのメリット

#はじめに
私は、理系の大学4回生です。
現在は、未来電子テクノロジープログラミング開発コースに所属しています。
今回は、Djangoについて勉強したので、Djangoについてお話しします。
#初心者から見たDjangoのメリット
私が感じたメリットは、2つです。
1. フルスタックのフレームワーク
2. 学びやすさ

1に関しては、ウェブサービスを作成する際に必要な基本的な機能はすべてDjangoを用いるだけで済みます。
つまり、ユーザー認証や管理ページが簡単に作ることができるため、時間を短縮することができます。
2に関しては、今注目されているPythonを使用することで、簡単にWeb開発ができます。
理解しやすいPythonで、実際に開発ができることが、理解に繋がります。

#まとめ
今回は、Djangoについて簡単にお話ししました。
これから、Djangoについても勉強していきたいなと思います。
railsでのマッチング機能（フォロー機能）の実装


# マッチング機能（フォロー機能）の実装

Railsでマッチング機能の実装をしたので、コードの記録と解説をしていきます。

マッチング機能とは、要は、フォロー機能を言い換えただけなので、機能自体はフォロー機能と同じです。

今回使うGemは、”acts_as_folloer"。

このGemを導入することで簡単に機能の実装をすることができます。

全て下記の、githubに記載されていますので、詳しく知りたいという方は下記をご参考にしてください。
https://github.com/tcocca/acts_as_follower

## Gemfile

```gemfile.
gem "acts_as_follower", github: "tcocca/acts_as_follower"
```

Gemを最下部に追加。
railsのバージジョンが4.0以下の時に、 github下の記述はいりません。


## Userモデル

```user.rb
class User < ApplicationRecord
  acts_as_followable 
  acts_as_follower
end
```
Userモデルでフォロー・フォロワー関係をあらわすアソシエーションを組む。

## ルーティング

```routes.rb
  put 'users/follow/:user_id',to: 'users#follow'
  put 'users/unfollow/:user_id',to: 'users#unfollow'
  get 'users/follow_list/:user_id',to: 'users#follow_list'
  get 'users/follower_list/:user_id',to:'users#follower_list'
```
ユーザーのフォローする、フォローを外す、フォローリストを表示する、フォロワーリストを表示するといったルーティングを組む。

## コントローラーの記載

```users_controller.rb
  def follow
    @user = User.find(params[:user_id])
    current_user.follow(@user)
    redirect_to user_path(@user)
  end

  def unfollow
      @user = User.find(params[:user_id])
      current_user.stop_following(@user)
      redirect_to user_path(@user)
  end


  def follow_list
    @user = User.find(params[:user_id])
  end

  def follower_list
    @user = User.find(params[:user_id])
  end
```
インスタンス変数を使ってレコードからそれぞれの値を取得し、必要に応じてリダイレクト設定を行う。

followingやstop_followingなどのAPIを使うことで、フォローをしたり外したりといった動作ができるようになる。


## ビューの記載（一部）

```user/shows.html.erb

 <%if current_user.id==@user.id%>
  <%= @user.follow_count %>
   <%= link_to "人気になる", {controller: :users,action: :follow_list,user_id: @user.id}, method: :get %>
  <%= @user.followers_count %>
   <%= link_to "人あなたを気になる", {controller: :users,action: :follower_list,user_id: @user.id}, method: :get%>
<%end%>
```
現在ログインしているユーザーにフォロー・フォロワーが何人いるかcountを使う。
そのリンクが押されたlink_toには、コントローラーで指定したusersコントローラーのfollow_list、ビューに送るパラメーターを設定する。

```_follow.html.erb
<%unless current_user.id==@user.id%>
<div id="follow_form">
  <% if current_user.following? @user %>
    <%= link_to "気になる削除", {controller: :users,action: :unfollow,user_id: @user.id}, method: :put, class:"btn btn-red50_rsd"%>
  <% else %>
    <%= link_to "気になる", {controller: :users,action: :follow,user_id: @user.id}, method: :put ,class:"btn btn-red50_rsd" %>
  <% end %>
</div>
<% end %>
```

現在ログインしているユーザー以外のページでは、フォローフォームをrenderで呼び出し、上記と同じくコントローラ、アクション、パラメーターの指定を行う。

## まとめ

このような流れで簡単にフォロー・フォロワー関係を作ることができます。
オフラインどう書く第九回の解答

問題はこちら->http://nabetani.sakura.ne.jp/hena/ord9busfare/

乗客のグループわけの記載がないので、全員同行者だとして解いてみました。
年齢区分と料金区分を':'でつなぎ乗客のリストを作ります。
大人一人につき幼児二人をfind/2で料金の高いほうから選びzero/2で削除していきます。
（処理の終わった大人はappendで最後に移り、findの入力と出力が同じになったら終わり)
その後は一人ずつfare/3で料金を求めcalc/5で足していきます。

```Prolog
%begin.
%SWI-Prolog version 7.4.2
%:-initialization(begin).   %ideone

calc(L,N,P,R1,R):-select(P:X,L,L1),fare(X,N,N1),R2 is R1+N1,calc(L1,N,P,R2,R).
calc(L,_,_,R,[L,R]).

zero(['A':X|T],R):-
     find(T,L1),find(L1,L2),append(L2,['A':X],R1),(L1\=L2->zero(R1,R);R=R1).
zero(R,R).

find(L,L1):-select('I':'n',L,L1),!.
find(L,L1):-select('I':'w',L,L1),!.
find(L,L).

w(N,R):-R is ((N div 10 + 1) div 2)*10.

fare('n',N,N).
fare('p',_,0).
fare('w',N,R):-w(N,R).

solve(L,N,R):-
     msort(L,L1),zero(L1,L2),calc(L2,N,'A',0,[L3,S1]),w(N,N1),
     calc(L3,N1,'C',S1,[L4,S2]),calc(L4,N1,'I',S2,[_,R]).

go([]):-!.
go([M,A,B,C|T]):-
     number_string(N,A),atomics_to_string(L,",",B),maplist(cha,L,L1),
     solve(L1,N,R),write(M),write("->"),write(R),number_string(R,R1),
     (R1==C->Str=" ok";Str=" no"),write(" "),writeln(Str),go(T).

cha(S,R):-atom_chars(S,[X,Y]),R=X:Y.
begin:-str(S),split_string(S,":\s\n","\s",L),go(L),!.


str("0  210:Cn,In,Iw,Ap,Iw      170
1       220:Cp,In       110
2       230:Cw,In,Iw    240
3       240:In,An,In    240
4       250:In,In,Aw,In         260
5       260:In,In,In,In,Ap      260
6       270:In,An,In,In,Ip      410
7       280:Aw,In,Iw,In         210
8       200:An  200
9       210:Iw  60
10      220:Ap  0
11      230:Cp  0
12      240:Cw  60
13      250:In  130
14      260:Cn  130
15      270:Ip  0
16      280:Aw  140
17      1480:In,An,In,In,In,Iw,Cp,Cw,In,Aw,In,In,Iw,Cn,Aw,Iw    5920
18      630:Aw,Cw,Iw,An,An      1740
19      340:Cn,Cn,Ip,Ap         340
20      240:Iw,Ap,In,Iw,Aw      120
21      800:Cw,An,Cn,Aw,Ap      1800
22      1210:An,Ip,In,Iw,An,Iw,Iw,An,Iw,Iw      3630
23      530:An,Cw,Cw    810
24      170:Aw,Iw,Ip    90
25      150:In,Ip,Ip,Iw,In,Iw,Iw,In,An,Iw,Aw,Cw,Iw,Cw,An,Cp,Iw  580
26      420:Cn,Cw,Cp    320
27      690:Cw,In,An,Cp,Cn,In   1220
28      590:Iw,Iw,Cn,Iw,Aw,In,In,Ip,Iw,Ip,Aw    1200
29      790:Cw,Cn,Cn    1000
30      1220:In,In,An,An,In,Iw,Iw,In,In,Ip,In,An,Iw     4590
31      570:Cw,Cn,Cp    440
32      310:Cn,Cw,An,An,Iw,Cp,Cw,Cn,Iw  1100
33      910:Aw,In,Iw,Iw,Iw,Iw,Iw,An,Cw,In       2290
34      460:Iw,Cw,Cw,Cn         590
35      240:Iw,Iw,In,Iw,In,In,Cn,In,An  780
36      1240:In,In,In,Ap,In,Cw,Iw,Iw,Iw,Aw,Cw   2170
37      1000:Iw,Ip,In,An,In,In,In,An,In,Iw,In,In,Iw,In,Iw,Iw,Iw,An      5500
38      180:In,Aw,Ip,Iw,In,Aw,In,Iw,Iw,In       330
39      440:In,Ip,Cp,Aw,Iw,In,An        660
40      1270:Ap,In,An,Ip,In,Ip,Ip       1270").
```
福祉職がポートフォリオを作るのサボってエンジニアになるまで

# はじめに
大学卒業後、6年間福祉職に従事していた男が、3年前からエンジニアを目指し、やっとこさホワイトな環境で働けるようになったので、今までの取り組みをまとめていく


#スペック
###未経験からIT業界に飛び込む前のスペック

- word/excelで文字を入力できる程度...関数とかさっぱり分からん(今でもあんまりexcelは分からん)
- os/メモリ/ストレージ等のpcの基本知識は微妙にあったと思います...

###転職活動をする前に勉強したこと
- c言語：ポインタと構造体で見事に挫折しました。(入社が決まった会社からjavaを勉強して欲しいと言われたという言い訳もある)
- php：こちらは触り程度
- java：書籍を１冊勉強した程度。後々思うと、やっといて本当によかった
- ポートフォリオ：なし！！これは本当にやばいと思った....

#転職活動について
「未経験歓迎」ところに手当たり次第応募した感じ。エージェントも使用したが、書類選考が全く通らなかった。
何より、ポートフォリオを作成しなかったのが、本当にまずい！面接では必ず「何か作って見ましたか？」と聞かれた。。。
なんとか小規模のSES企業に拾って貰ったが、ポートフォリオの作成大事です！まじで！！！
そなこんなでSESに入社することとなったが、ポートフォリオの未作成と業界自体の知識のなさが故に本当に苦労することとなった.....


#入社後
まずは3ヶ月のjava研修からスタートとなった。前もって半年くらいjavaを勉強したこともあってか、研修自体は周りの人よりもやや優秀的な評価をいただくことができ、良い同期にも巡り会えた。しかし、研修を終えてからが地獄の始まりだった.....

#現場配属後
初現場はスマホ決済の案件にアサインされることなった。ここでまず感じたことは...


__java使わねーじゃん！！！__

それ以前に、linuxやネットワークの知見がないとできないこと、答えられない質問が多く、スケジュールにもあまり余裕がなかったため、優しい先輩にほぼ介護してもらいながらの業務となった。稼働は200を超えており、自分のスキル不足により2ヶ月で契約終了となった....プロパーにめっちゃ怒られた....

次の現場では、業務アプリケーションでjavaの案件に携わることができ、メンバーがみんな優しく教えてくれることでそこそこ戦力にはなった。
同時に初現場では自分のスキル不足もそうだが、分からないことを調べていくというエンジニアとしてのスキルや心構えが本当に足りないと思った。
半年程で案件が終了し、次の案件に移るが、またもや全くついて行けず、2ヶ月で撤退。給料的にも不安があったため、このタイミングで退職することとなった。
3つ目の現場に配属され、自分のスキルにあった案件に入れず、転職活動も並行して行なっていたため（本当に大変だった....）、大手技術派遣会社に転職することになった。

#未経験でIT業界に飛び込んでみて

__ポートフォリオ作らなきゃだめだよ！！__

とにかくポートフォリオの作成と業界の知識が大切だと思った。ポートフォリオの作成が大事というか、結局のところ、javaやpythonなどの「言語」ができればokというわけではなく、サーバーやネットワークの知識がなければ対応できないことも多く、その辺も踏まえて効率的に学ぶにはポートフォリオの作成が最適だと感じた。
また、世間では「SES = ブラック」みたいな風潮になっているが(実際にもそうだと思うが...)そもそもSESのことすら分からず、入社したため、かなりキャリア的にも成長できる時間を無駄にしたように感じた。

#現在の状況
前述の通り、大手技術派遣会社に転職。こんな低スキルの自分を拾って頂けた上にとてもホワイトな案件にアサインさせてくれたことに感謝。
個人的には、自社内開発企業を希望しており、企業からのお誘いもあったが、妻が妊娠したこともあり福利厚生のしっかりしている大企業を選択した。派遣で働く事に抵抗はあったが、公私ともに充実した生活が送れている。

#これからについて
現在の現場では、pythonとsqlがメインの業務を行なっており、日々成長を感じながら業務に携わることができている。
AWSやdockerにも携われるためしっかりと知識を身につけてダラダラしない程度に自社内開発企業やフリーランスを目指していこうと思っている。
とにかく伝えたいことは...

__ポートフォリオを作らなくても転職はできるけど、かなり苦労すると思うよ!__
__それでもエンジニアは楽しい職業だよ！__

これからエンジニアへの転職を考えている方の参考になれば嬉しいです！
OpenResty + Redisで動的リバースプロキシ

OpenResty + Redisで動的リバースプロキシの動作検証を行ったので、設定内容をメモ。
サブドメインをキーにRedisから値を取得し、HTTPリクエストヘッダに追加する。

##OpenRestyをインストール
下記を参考に実施
https://qiita.com/nobuh/items/40ef50dd70fdf8a580e4

##Redisインストール
下記を参考に実施
https://qiita.com/KurosawaTsuyoshi/items/f8719bf7c3a10d22a921

##テスト用のデータをRedisに登録
```
# redis-cli -p 6379
127.0.0.1:6379> set test "test-value"
OK
127.0.0.1:6379> get test
"test-value"
127.0.0.1:6379>
```

##Nginx設定
```nginx.conf
# ワーカプロセス数
worker_processes 1;
# エラーログ出力先
error_log /var/log/nginx/error.log;
# PIDファイルの配置先
pid /var/run/nginx.pid;
# 1ワーカプロセスが同時オープン可能なファイルディスクリプタ数最大値
worker_rlimit_nofile 1024;

events {
    # 1ワーカプロセスが同時オープン可能なコネクション数最大値
    worker_connections 512;
}
http {
    # アクセスログ出力先
    access_log /var/log/nginx/access.log;
    # nginxに常時接続しているクライアントに対するタイムアウト時間
    keepalive_timeout 10s;
    server {
        listen 80;
        server_name  ~^(?<subdomain>[^\.]+).example.com;
        location / {
            # 全てのアドレスを許可
            allow all;
            # Luaスクリプト
            rewrite_by_lua '
                -- モジュールをロード
                local redis = require "resty.redis"
                -- Redisオブジェクトを生成
                local redisObj = redis:new()
                -- タイムアウト値を設定（ 単位 は ミリ 秒）
                redisObj:set_timeout(3000)
                -- Redisに接続
                local ok,err = redisObj:connect("127.0.0.1",6379)
                if not ok then
                        ngx.say("接続失敗:",err)
                        return
                end

                -- サブドメインを取得
                local res,err = redisObj:get(ngx.var.subdomain)
                if not res then
                        ngx.say("取得失敗:",err)
                        return
                end
　　　　　　　　　-- リクエストヘッダに追加
                ngx.req.set_header("X-TEST-Header",res)
            ';
                proxy_pass http://10.10.10.1:80;
        }
    }
}
```

##Nginxリロード
```
# nginx -p $(pwd) -s reload
```

##動作確認
「http://test.<ドメイン名>」へhttpアクセスしリクエストヘッダーより抜粋。
Redisから取得した値がヘッダに入っている。

```
["x-test-header"]=> array(1) { [0]=> string(10) "test-value" } }
```
Application InsightsでJVMのパフォーマンスカウンタ収集

GCの発生頻度やJVM上のメモリ使用率はチェックしておきたいものです。
jstatなどでも取れますが、ApplicationInsightsでもちょっとした修正を入れるだけで取ることが出来ます。

Application Insightsを組み込んでメトリックを送る
---------------------

- pom.xmlに`com.microsoft.azure:applicationinsights-web`を依存関係として含める
- 初期化時などで`TelemetryConfiguration.getActive().setInstrumentationKey(telemetryKey);` を呼び出してセットする
- `ApplicationInsights.xml`をリソースとして追加する

例えばSpringBootであれば[こんな感じの変更](https://github.com/fukasawah/example-hellospringboot/commit/ee121c3e4354c101438ea371e2861bc1c7767710)を加えます。

`ApplicationInsights.xml`にごちゃごちゃ書いていますが、これについては[過去に書いた記事](https://qiita.com/fukasawah/items/d69356616f074a9fbb71)があります。いいねが全くつかない所を見ると、Javaアプリは流行ってないんですかね。寂しい。
必要ないものも含めてなるべく全部取るという取り方をしているので、必要に応じてコメントアウトしたりしてください。

で、インストルメンテーションキーを与えて実行した後、しばらくするとこんな感じに取れます。デフォルトは60秒間隔でカウンタを採取しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52527/0fcb98b0-bd32-b788-b0d0-5f21b96f71b2.png)

Metaspace used, Non Heap used, Heap usedを積み上げた様子
（Metaspace used, Non Heap usedは重複があるので本来はどちらかを削るべき・・・）

### 複数台のメトリックを1つのApplicationInsightに集約する場合

2台以上で稼働させたり、オートスケールするようなケースがあるはずで、その場合どうなるのか。

`cloud_RoleInstance`という列があり、これが実行環境のホスト名を持つ。これで分割することで環境毎に見れる。以下は途中で2～3台に増やしたケース。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52527/b774b32f-4b5d-73f9-149c-c334f790decd.png)


### 同じ事をLog Analyticsで

ApplicationInsightsの裏にはLogAnalyticsがいるので同じ要領で取れます。

``` kusto
// MEM Heap Usedを1分間隔で折れ線グラフ表示
performanceCounters 
| where name == 'MEM Heap Used'
| summarize avg(value) by cloud_RoleInstance, bin(timestamp, 1m)
| render timechart 
```

実行結果はこんな感じになる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52527/4eaa242c-e11f-d6a6-06aa-f856c18f66b1.png)

アラート設定
------------------

めんどくさくなっちゃったので書きませんが、ApplicationInsightsのメトリックとして見えるので、ちゃんとできます。
Javascript入門[1]個人的メモ

#Javascriptの基本
###特定のID名を持つ要素を取得する
```JavaScript
document.getElementById('ID名');
```
###取得した要素のテキストを書き換える
```JavaScript
//textContent
document.getElementById('ID名').textContent = new Date();
```
###配列の読み取り・追加・タグの生成と挿入
```javascript
var todo = ['デザインカンプ作成','データ整理','勉強会申し込み','牛乳買う'];
todo.push('歯医者に行く');  // todo[4] = ('歯医者に行く');と同じ

for( var i = 0; i < todo.length; i++ ){
  //タグの生成
  var li = document.createElement('li'); 
  li.textContent = todo[i];
  //タグの挿入
  document.getElementById('list').appendchild(li);
}
```
###for-in文でオブジェクトの中身を繰り返す
```JavaScript:基本的な使い方
for( 変数 in オブジェクト ) {
   // 処理を書く
}
```
```JavaScript:使用例
var book = { title:'JavaScript入門', price:2500, stock:3 };
for( var key in book){
    console.log(key + '=' + book[key]);
}
```
JavaScriptのthisについて

#調査の動機
thisを用いてオブジェクトに格納されている値を参照しにいったが取得できなかった。
thisについて調べたところ一癖あるものだとわかった。
thisについて理解したいと思い、調査に踏み切った。
>thisの性質がわからず、現場で苦しんだ。。。（小声）

#調査の観点
**以下の観点で調査しました。**

- thisを用いてオブジェクトを参照する際に気をつけるべきこと
- スコープは気にするのか。

#調査方法

実際にソースコードで挙動を確認しました。
また下記の書籍、記事等を参考にさせていただきました。
##参考書籍
[[改訂新版]JavaScript本格入門　モダンスタイルによる基礎から現場での応用まで](https://www.amazon.co.jp/%E6%94%B9%E8%A8%82%E6%96%B0%E7%89%88JavaScript%E6%9C%AC%E6%A0%BC%E5%85%A5%E9%96%80-%EF%BD%9E%E3%83%A2%E3%83%80%E3%83%B3%E3%82%B9%E3%82%BF%E3%82%A4%E3%83%AB%E3%81%AB%E3%82%88%E3%82%8B%E5%9F%BA%E7%A4%8E%E3%81%8B%E3%82%89%E7%8F%BE%E5%A0%B4%E3%81%A7%E3%81%AE%E5%BF%9C%E7%94%A8%E3%81%BE%E3%81%A7-%E5%B1%B1%E7%94%B0-%E7%A5%A5%E5%AF%9B-ebook/dp/B01LYO6C1N/ref=sr_1_2?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=2WAPYCQJVZKWV&keywords=javascript&qid=1564791050&s=gateway&sprefix=Java%2Caps%2C558&sr=8-2)

##参考にした記事
@mtoyopetさん
JavaScriptのthisがよくわからないので徹底的に調べてできるだけわかりやすく解説してみる

@shiminori0612さん
JavaScriptでのthis

@takkyunさん
JavaScript の this を理解する多分一番分かりやすい説明

#調査内容

##そもそもthisとはなんぞや
JavaScriptのthisは、関数内で使用すると呼び出し元のオブジェクトを参照します。
>調べたところどうやら呼ばれ方次第で値が変わってくるそうです。。。

##参照先を表で展開
|呼ばれた場所|thisの参照先|
|:--|:--|
|関数の外|グローバルオブジェクト|
|関数|グローバルオブジェクト|
|call/applyメソッド|引数で指定されたオブジェクト|
|イベントリスナー|イベント発生元|
|コンストラクター|生成したインスタンス|
|メソッド|呼び出し元のオブジェクト|

表だけ見てもわからないと思うので実際にサンプルプログラムで見ていきます。

#サンプルプログラム
通常の関数でthisを呼び出すパターンとオブジェクト内のメソッドでthisを呼び出すパターンの挙動を確認します。

~~~JavaScript
function motion(){
    console.log(this); // グローバルオブジェクト、ブラウザではWindowオブジェクトを参照
}

var keyPerson = {
    name : 'ドラえもん',
    motion : function(){
        console.log(this); // KeyPersonオブジェクトを参照
    }
}

motion(); // 実行結果：Window {postMessage: ƒ, blur: ƒ, focus: ƒ, close: ƒ, parent: Window, …}
keyPerson.motion(); // 実行結果：{name: "ドラえもん", motion: ƒ}

~~~

通常の関数の場合だとWindowオブジェクトが出力されていることがわかります。
オブジェクト内のメソッドでthisを呼んだ場合は、オブジェクト自体を指し示しています（上記の表参照）。

コンストラクタを使用した際のthisは、新しいオブジェクトに結びつきます。

~~~JavaScript
function TitleCall() {
    this.title = 'ドラえもんはじまるよー';
}

var keyPerson = new TitleCall();

console.log(keyPerson.title); // 実行結果：ドラえもんはじまるよー

~~~

##thisの正体
今回の調査で「**thisは呼び出し元のオブジェクト**」を指すということがわかった。
「this.」の「.(ドット)」の前の値を指定していなければグローバルオブジェクトを参照する。

>@takkyunさんの「JavaScript の this を理解する多分一番分かりやすい説明」より抜粋
>**this は function を呼んだ時の . の前についているオブジェクトを指している**
>
>この文言のおかげで理解を深めることができました。ありがとうございました。

#考察
アロー関数が絡んできた場合だとどうなるのか調査しきれていないので調査完了次第更新します！！！
最後になりますが良記事を展開してくれた方々に感謝の気持ちでいっぱいです。
ありがとうございました。
Coursera Machine Learning Stanford Univ. Week10,11

残りあと2週。ここからはもうPrograming課題はありません。

##Week10
Week10のテーマはLarge Scale Machine Learning
大きなデータを扱う時はgradient dedcentそのままでは効率が悪いのでStochastic Gradient DecentとMini-Batch Gradient Descentの例。
Tensor Flowなどを使ったDeep Learningのサンプルを動かすことから始めた人にはおなじみだと思いますが私はその仕組みを知らなかったので説明を聞いて納得というか合点が行きました。
ここでも学習曲線を見てHigh BiasなのかHigh varianceなのかを見極めて次に何をするか決めるのが重要。


後半はOnlineで逐次学習する方法と学習を複数のCPU/COREをつかって分散処理する方法。

##Week11
Photo OCRの例
Photo OCRの方法というよりは Photo OCRを例題に複数の処理をつないで処理するPipline処理を行うシステムをどのように開発するかという説明。

基本的なPhoto OCRの手法の説明としては

- Windowをずらしてサーチ
- 文字がある領域を見つけるとき白をつないで領域を見つける方法
- 文字の区切りを見つける方法



認識率がうまく上がらないとき次にどうするかということを考えるときどうするか？

- 学習データを増やす
- フォントを用意して様々な背景に張り付けてデータを作る
- 文字を歪ませる
- オーディオの場合はバックグラウンドノイズを加える
- データのラベル付けを手作業で頑張る
- Crowd sourceを使う
といった方法を紹介

ceiling analysisという手法でどこを改善すると一番効果的かを見極めてリソースを投入しましょうという話。

この辺りは実際のシステム開発で起きた時の話に基づいていると思われ、なるほどなあと思いました。

とりあえず最後までたどり着けました。
1か月かかりませんでしたので、予定より早く終わった分もう少し復習をしてみようと思っています。
[WIP][私的メモ] Chicken SchemeからJavascript生成実験

#はじめに
Chicken SchemeのようにCへコンパイルする処理系ならば、Clang → LLVM → emscripten → javascriptが可能なはずと実験作業の私的メモ。
間違いやもっと良い方法があるなどの指摘は大歓迎。

#インストール
まずclang版chickenのインストール。
言語処理系としては珍しく問題もなく普通にコンパイル可能。
https://wiki.call-cc.org/chickenista-guide

```bash:Install
$ wget https://code.call-cc.org/releases/5.1.0/chicken-5.1.0.tar.gz
$ tar xvf chicken-5.1.0.tar.gz
$ cd chicken-5.1.0
$ make PLATFORM=linux PREFIX=$HOME/chicken/chicken-5.1.0-llvm C_COMPILER=clang #システム用と混ぜないためにPREFIXを指定。
$ make PLATFORM=linux PREFIX=$HOME/chicken/chicken-5.1.0-llvm C_COMPILER=clang install
```

Clang版のインストール後確認ハロワ。

```bash:Hello
$ $HOME/chicken/chicken-5.1.0-llvm/bin/csc -version
$ mkdir $HOME/tmp && cd $HOME/tmp #適当な作業ディレクトリに移動
$ echo '(print "Hello World.")' > hello.scm
$ $HOME/chicken/chicken-5.1.0-llvm/bin/csc hello.scm
$ ./hello
```

Libraryであるeggのインストール。cscバイナリを指定すればPREFIX指定などは不要。

```bash
$ $HOME/chicken/chicken-5.1.0-llvm/bin/chicken-install utf8
```

#Cへのコンパイル
ここを参考にCへのコンパイルをします。ただし必要ファイルに変更があるようです。また最適化をかけないと実行に失敗します。
https://wiki.call-cc.org/man/5/Deployment#distributing-compiled-c-files

```bash
$ cd $HOME/chicken-5.1.0 #解凍してビルドしたディレクトリに移動。pushdの方が便利。
$ cp chicken-syntax.c chicken.h extras.c modules.c build-version.c eval.c internal.c runtime.c chicken-config.h expand.c library.c $HOME/tmp
$ cd $HOME/tmp
$ $HOME/chicken/chicken-5.1.0-llvm/bin/csc -t hello.scm
```
#Javascriptへのコンパイル
```bash
#最適化しないとnodeでエラーが出ます。
$ emcc hello.c -I$HOME/chicken/chicken-5.1.0-llvm/include/chicken/ -DHAVE_CHICKEN_CONFIG_H -DSEARCH_EXE_PATH build-version.c eval.c expand.c internal.c library.c modules.c runtime.c chicken-syntax.c -s WASM=0 -Wno-implicit-function-declaration -Wno-c99-extensions -O2 -o hello.html
$ node --stack-size=65500 hello.js #--stack-sizeを指定しないとnodeでエラーが出ます。
```

#気が向いたらのTodo
文体。
emscriptenのインストール手順。
emscripten関連のFFI。
eval機能削除等の小型化。
最適化関連の実験。

#未検証の技術的な疑問点と現時点の予想メモ
気が向いたらそのうち検証する
csc -tによる生成Cコードの処理系依存；おそらく古めのC標準とLLVM準拠と予想
r5rsへの互換性準拠チェック；そこそこ動くと予想、何かチェック用ライブラリありませんか？
ChickenとCとjavascriptのFFI部分；ChickenとCは苦労しないと予想、Javascipt関連は苦労するのではないか
同期処理などemscriptenの特殊性関連；おそらくマニュアル等に記載があるので普通に調べる