OmniAICreator/Qiita-1.07M huggingface dataset:
【Laravel】ログファイルのフォーマットを LTSV に変更する

## この記事について

「[Willgate Advent Calendar 2018](https://qiita.com/advent-calendar/2018/willgate)」4日目の記事です。

記事が投稿された日付は気にしてはいけない。いいね？

## 背景

Laravel 5.6 以降 `config/logging.php` という設定ファイルが追加され、ログまわりの設定方法が変わりました。

* https://laravel.com/docs/5.7/logging

Laravel のロギングには内部で [Monolog](https://github.com/Seldaek/monolog) が使われており、目的に応じて Handler（ログ出力先）、Processor（ログに含める情報）、Formatter（ログフォーマット）を設定することができます。

LTSV に関する説明は割愛。

## LTSV に整形する Formatter をセットするクラスの作成

今回、LTSV に整形する Formatter には [hikaeme/monolog-ltsv-formatter](https://packagist.org/packages/hikaeme/monolog-ltsv-formatter) を使用。

```bash
composer require hikaeme/monolog-ltsv-formatter
```

この Formatter を Handler にセットするクラスを作成します。

Formatter をセットする処理を `__invoke()` メソッドに書きます。

```php
<?php

namespace App\Logging;

use Illuminate\Log\Logger;
use Hikaeme\Monolog\Formatter\LtsvFormatter;

class SetLtsvFormatter
{
    public function __invoke(Logger $logger): void
    {
        foreach ($logger->getHandlers() as $handler) {
            /** @see \Hikaeme\Monolog\Formatter\LtsvFormatter::__construct() */
            $handler->setFormatter(new LtsvFormatter(
                'Y-m-d H:i:s.u',
                [
                    'datetime' => 'datetime',
                    'level_name' => 'level_name',
                    'message' => 'message',
                    'channel' => 'channel',
                ]
            ));
        }
    }
}
```

`LtsvFormatter` のコンストラクタの引数は必須ではないのですが、デフォルトの挙動ではいくらか都合が悪かった[^1]ので明示的に指定しています。

参考：

* [\Hikaeme\Monolog\Formatter\LtsvFormatter::__construct()](https://github.com/fjyuu/monolog-ltsv-formatter/blob/master/src/LtsvFormatter.php#L35)

## Formatter をセットするクラスを任意の チャンネル に設定

`config/logging.php` に `channels.*.tap` キーを追加して配列形式でクラス名を記述します。

下記の例では `single` チャンネルに設定しています。


```php:config/logging.php
<?php

use Monolog\Handler\StreamHandler;

return [
    // 略
    'channels' => [
        // 略
        'single' => [
            'driver' => 'single',
            'tap' => [App\Logging\SetLtsvFormatter::class], // この行を追加
            'path' => storage_path('logs/laravel.log'),
            'level' => 'debug',
        ],
        // 略
    ],

];
```

これで、ログのフォーマットが　LTSV になりました。

```php:tinker
>>> Log::channel('single')->info('hoge')
=> null
```

```text:storage\logs\laravel.log
datetime:2018-12-24 23:50:45.723073	level_name:INFO	message:hoge	channel:local
```


[^1]: 特にラベル名。 `datetime` → `time`、`level_name` → `level` のように変更されるので混乱を生みました。
JUnit 5 assertAll

## JUnit 5 の導入

Gradle を使っている場合は次のように記述を加える。 Gradle 4.6 よりサポートされている。

### Gradle

```groovy:build.gradle
dependencies {
    testCompile("org.junit.jupiter:junit-jupiter-api:5.3.2")
    testRuntime("org.junit.jupiter:junit-jupiter-engine:5.3.2")
}

test {
    useJUnitPlatform()
}
```

### Kotlin

```kotlin:build.gradle.kts
dependencies {
    testCompile("org.junit.jupiter:junit-jupiter-api:5.3.2")
    testRuntime("org.junit.jupiter:junit-jupiter-engine:5.3.2")
}

task.withType<Test> {
    useJUnitPlatform()
}
```

## 全てのチェックを全て実行する - assertAll

Java と Kotlin ではインポートする関数を変えたほうがよい。

```java:Java
import org.junit.jupiter.api.Assertions.assertAll

assertAll(
    () -> { assertEquals(1, 1) },
    () -> { assertEquals(1, 2) }
)
```

```kotlin:Kotlin
import org.junit.jupiter.api.assertAll

assertAll(
    { assertEquals(1, 1) },
    { assertEquals(1, 2) }
)
```

もし　Kotlin で　Java と同じ関数を使うなら...

```kotlin:Kotlin
import org.junit.jupiter.api.Assertions.assertAll

assertAll(
    Executable { assertEquals(1, 1) },
    Executable { assertEquals(1, 2) }
)
```
Elm+Firebaseでチャットアプリを作る

# はじめに

この記事は、@Yamamoto0525 様の [Angular+Firebaseでチャットアプリを作る](https://qiita.com/Yamamoto0525/items/a76ea4b3924eeb82b0f9) の[Elm](https://elm-lang.org)版の記事です。

記事をお見かけしてElmをステップアップしながら学ぶための素晴らしい記事だと思い真似させていただきました。単なる真似にならないようにElmならではの良さやモダンっぽさを取り入れていければなと思っています。

# 対象読者

- Elmの実践的な使い方に興味がある
    - [Syntax](https://elm-lang.org/docs/syntax)をざっと読んだ
    - [Guide](https://guide.elm-lang.jp)をざっと読んだ
- ElmでFirebaseに興味がある
- サクサク動くチャットアプリを作りたい

# プロジェクトで使用するライブラリ

- Elm: v0.19
- firebase: v5.7.1
- purecss: v1.0.0

# リポジトリ

https://github.com/ababup1192/elm-firebase-chat

# 作成するアプリの使用

- マルチデバイス対応
- 自分と第三者とでチャットを行う
- 入力には認証が必要
- チャット内容をリアルタイム（更新などを行わず）に、他の端末に反映
- ユーザーはコメントの作成、読み込み、更新、削除（CRUD）ができる

# トピック

## チャットの入力画面を作成

- Elmの環境構築([elm-webpack-starter](https://github.com/simonh1000/elm-webpack-starter)を使います。cloneしてお使いください。)
- [Elmでビュー(チャット画面)を作る](https://qiita.com/ababup1192/items/ed3be0b0d7b2d1b42a44)
- [TDDしながらチャットコメントを実装する](https://qiita.com/ababup1192/items/226d8b23614e6e335d2e)
- [Elm TDDしながらチャットコメントの投稿を実装する](https://qiita.com/ababup1192/items/8a8d76838883ed9b09f5)
- [Elm TDDしながらelm/timeで日付の変換をする](https://qiita.com/ababup1192/items/803bd2e66461c70bf7e7)
Herokuで手動でRakeタスクを実行するメモ

# メモ

## 実行方法

- 以下コマンド例
- ローカル側でCtrl + Cで止めたり、プロセスをkillするとHeroku上のタスクも止まる

```sh
% heroku run rake [Rake Task名]
```

## 確認方法

実行例

```
% heroku ps                 
Free dyno hours quota remaining this month: 965h 22m (96%)
Free dyno usage for this app: 34h 37m (3%)
For more information on dyno sleeping and how to upgrade, see:
https://devcenter.heroku.com/articles/dyno-sleeping

=== run: one-off processes (1)
run.6959 (Free): up 2018/12/24 23:12:57 +0900 (~ 18s ago): bundle exec rake xxxxx

=== web (Free): bin/rails server -p $PORT -e $RAILS_ENV (1)
web.1: up 2018/12/24 23:08:17 +0900 (~ 4m ago)
```

ログの確認方法

```
% heroku logs --ps run.4033
```

# 参考
2019 年ナウでヤングな 3D 顔復元のメモ

State of the Art on Monocular 3D Face Reconstruction, Tracking, and Applications
https://web.stanford.edu/~zollhoef/papers/EG18_FaceSTAR/paper.pdf


二次元画像から, 三次元画像を復元するには 3DMM(3D morphable model)ベースの手法が主流でしたが, 2018 年後半あたりから, 3DMM を使わず end-to-end で機械学習で顔復元をする手法が流行りだしています.

## 2018 年

特にコチラ

FML: Face Model Learning from Videos
https://arxiv.org/abs/1812.07603

(co-author に Christian Theobalt と  Hans-Peter Seidel が居て強い)

テンプレートとなる blendshapes モデルは必要となりますが, それ以外はビデオから学習してしまいます.

### blendshapes モデルの取得

* モデリングで作成する(モデラーに作ってもらう)
* iClone や DAZ3D あたりの 3D ツールのサンプルモデルを買う
* turbosquid あたりに売ってそうなのを買う
* Polywink のサービスを使う https://www.polywink.com/  $499 とコスパよい

## 2019 年

RingNet

https://ringnet.is.tue.mpg.de/

3D supervision なしに復元.
FLAME のパラメータを算出
メモ：「３０日でできる！OS自作入門 」19日目

## アプリケーション

1) type コマンド
- cat の似たようなコマンド
- ファイル名から セクタ番号探してファイルの中身を出力するもの
- clustno * 512 + 0x003e00

![スクリーンショット 2018-12-24 23.05.38.png](https://qiita-image-store.s3.amazonaws.com/0/109145/13fc76bb-ee6f-b201-9c10-f164d1adf7ce.png)

2) type コマンドの改良
- タブ、改行の対応、0x0d は無視

3) FAT 対応
- 0x000200 ~ 0x0013ff にある
- 3バイトを２つのセクタ用に圧縮されてる
    - 03 40 00 -> 003 004
    - ab cd ef -> dab efc
- FILEINFO か最初のセクタ(例えば2)を読んで、次どこかはFATの２番（３）にを参照しまた読む、次は3番。。。
    - haribote.sys の場合は57まである

4) ソースの整理
- bootpack.c から console.c, file.c, window.c を切り出す

5) ついに初アプリ

```
fin:
  HLT
  JMP fin
```

- hlt というコマンド打ったら、HLT.HRBを探してロードして実行させる
XBee 3 ZB で MicroPython を使う（２）

# Lチカしてみる

 [前回記事](https://qiita.com/inachi/items/7a7666c061ba95e81e62)では XBee 3 ZB の MicroPython を有効にするところまでやりましたが、今回は Lチカまでやってみましょう。

せっかく [grove 対応のシリアル/ピッチ変換ボード](https://www.switch-science.com/catalog/1052/)を購入したので、Grove の赤LEDを繋いでみることにしました。

![IMG_4796.jpg](https://qiita-image-store.s3.amazonaws.com/0/106817/a8e8c09d-63c2-837d-d1d5-2f8f8e259568.jpeg)

このボードのコネクタではLEDへの出力に D6 ピンを使えばよういようです。

ということで Pin クラスを探したのですが、、、

```python3
>> import machine
>>> machine.
__class__       __name__        BROWNOUT_RESET  HARD_RESET
LOCKUP_RESET    PWRON_RESET     SOFT_RESET      WDT_RESET
reset           reset_cause     rng             soft_reset
unique_id
>>> machine.
```

ありません orz

[ここ](https://www.digi.com/resources/documentation/digidocs/pdfs/90002219.pdf)にある XBee 3 用 MicroPython ドキュメントを調べてみましたが、どうやら ZigBee 版では I/O ピンに対応していないようです。

![スクリーンショット 2018-12-24 23.11.12.png](https://qiita-image-store.s3.amazonaws.com/0/106817/d39bf54d-e9f3-f5b5-5f8c-417816e50528.png)

でも、I/O ピンにアクセスできないなんてありえないと思い、さらに調べてみました。xbee モジュールに atcmd() 関数があり、これで AT コマンドを実行できるようです。

```python3
>>> import xbee
>>> xbee.
__class__       __name__        ADDR_BROADCAST  ADDR_COORDINATOR
XBee            atcmd           discover        receive
relay           transmit
>>> xbee.
```

ATコマンド一覧は[ユーザガイド](https://www.digi.com/resources/documentation/digidocs/pdfs/90001539.pdf)にあり、 "D6" というそのまんまなコマンドがあります。

![スクリーンショット 2018-12-24 23.22.39.png](https://qiita-image-store.s3.amazonaws.com/0/106817/8dd5a20c-ae5a-1efb-4b10-6e3546b710d3.png)

これによれば、D6 コマンドに 4 を指定すればロー、5を指定すればハイの出力になるようです。ということで、REPLで確認してみます。

```python3
import xbee
import utime
while True:
    xbee.atcmd('D6', 4)
    utime.sleep_ms(500)
    xbee.atcmd('D6', 5)
    utime.sleep_ms(500)
```

見事に成功です。中断するには Ctrl-C を入力します。

![IMG_4797.gif](https://qiita-image-store.s3.amazonaws.com/0/106817/77462785-16c1-23d2-7a62-dee3caaefdfa.gif)
カラースペースを調べるときのメモ

レンダラとかでのカラースペースを調べたり検証するときのメモです.

## カラーチェッカー画像

https://github.com/colour-science/colour-nukehttps://github.com/colour-science/colour-nuke

ColorChart の EXR 画像があります.

https://github.com/openexr/openexr-images

`TestImages` に GammaChart.exr などがあります.

## ビューア

* https://natrongithub.github.io/ Nuke のようなコンポジットソフト. ビューアとしても使える.
* http://djv.sourceforge.net/ ビューア. 連番ファイル対応

## ツール

https://github.com/colour-science/colour

python でいろいろ数値を出したりできる.
【CCNA】コリジョンドメインとブロードキャストドメイン


##コリジョンドメイン
**「コリジョン」 = 「データの衝突」**
→ コリジョンは発生しないほうが良い

**「コリジョンドメイン」 = 「コリジョンが発生する可能性のある範囲(機器の台数)」** 
→コリジョンドメインは狭い(小さい)ほうが良い。衝突する可能性が低くなるから

**コリジョンドメインは「スイッチ」と「ルータ」で分割される**   
→「ハブ」や「ブリッジ」では分割できない

##ブロードキャストドメイン
**「ブロードキャスト」= 「同一ネットワーク内の不特定多数(すべて)を対象とした通信」**

**「ブロードキャストドメイン」= 「ブロードキャストを受信する範囲(機器の台数)」**

**ブロードキャストドメインは「ルータ」で分割される**
→「ハブ」「ブリッジ」「スイッチ」では分割できない
Dockerを勉強してみた（概要・Macインストール・起動）


Dockerについて勉強＋メモ用に投稿しました。

# Dockerとは
**仮想環境**を簡単に作成・実行・配布できるサービス（プラットフォーム）。

# 仮想環境とは
　あるプラットフォーム上で別のプラットフォームを実行する環境。
　（PCのデスクトップ上で別のPCを起動するようなイメージ）

# 一般的な仮想環境との違い
　VirtualBoxやVMWareなどの仮想環境は、ホストマシン上で別のOSをシミュレートする。　
　一方のDockerはホストマシンのカーネルを利用しプロセス等を隔離することで「軽量化」「高速起動・停止」を実現している。

# Dockerが支持される理由
　サーバの設定やミドルウェアインストールなどをコード化することで全員で開発環境（特にバージョン）を簡単に統一できる（再現可能）

　→環境構築の手順が楽に！引き継ぎが楽に！

# 早速インストール！
 　下記ページよりダウンロードできます。
　https://www.docker.com/get-started

# 起動〜Hello World!
1. インストール後、Terminalを起動します。
2. ```docker version```でインストール済みかを確認します。
3. ```docker container run hello-world```を実行します。
4. TerminalにHello World!と使い方が表示されれば成功です！

# コンテナファイルを活用しよう
　Dockerでは、構築済みのコンテナイメージが多数用意されています。

・Docker Hub（公式）
https://hub.docker.com/search?q=&type=image

Laravel/PHPに便利な「laradock」やさサーバ系「Wordpress」「nginx」「node」やDB系など、数多くのコンテナが準備されています。

せっかくなので、nginxのサーバを立ち上げてみましょう。

# nginxサーバも10秒で立ち上げ！
1. ```docker run -d -p 80:80 --name {コンテナ名} nginx```でnginxがない場合ダウンロードし、起動します。
2. ```docker container ls```でDockerのプロセスをチェックします。
3. localhostにアクセスし、ブラウザでnginxが起動していることを確認します。

# せっかくなのでサーバに入り表示をいじってみます。
1. ```docker exec -it {コンテナ名} /bin/bash```でサーバに入ります。（root）
2. ```cd /usr/share/nginx/html```　nginxのドキュメントルートへ移動します。
※ドキュメントルートは```/etc/nginx/conf.d```の「location -> root」で変更できます。
3. 「vim index.html」としたいところですが、最小限のもの以外は入っていないようなので```apt-get update```と```apt-get install vim```を流します。
4. ```vim index.html```から編集し、:wqで保存しvimを終了します。
5. もう一度localhost:80にアクセスし表示が変わっていることを確認し、今回は終了です！

#基本操作コマンド
・コンテナの停止
```docker container stop {コンテナ名}```

・コンテナの開始
```docker container start {コンテナ名}```

・コンテナのリストを表示
```docker container ls``` // 起動中
```docker container ls -a``` // 全て

・コンテナログ確認
```docker container logs```

・コンテナ 削除
```docker container rm {コンテナ名}```

・イメージ 削除
```docker image rm {イメージネーム}```

# 参考サイト
　・Docker入門（第一回）～Dockerとは何か、何が良いのか～ / さくらのナレッジ
　https://knowledge.sakura.ad.jp/13265/

・Dockerコンテナを利用してみよう　/ マイナビニュース
https://news.mynavi.jp/article/docker-3/

・DockerをMacにインストールする / Qiita
https://qiita.com/kurkuru/items/127fa99ef5b2f0288b81
【初心者向け】購入後のMacからRuby on Railsを使えるようにする方法

#はじめに
PayPayを機にMacを購入してRuby on Rails(以下Rails)をインストールしたので
その手順を備忘としてゆる〜く書いてみる。予想はしてたけど…
<h6>結構ハマった。</h6>

参考著書として購入したのは[基礎Ruby on Rails](https://www.amazon.co.jp/改訂4版-Ruby-Rails-IMPRESS-KISO/dp/429500460X/ref=pd_lpo_sbs_14_img_1?_encoding=UTF8&psc=1&refRID=VNYB0M7V2G6R5R1VGYXC)。
購入動機は「草野球チーム Morning Grory」という架空サイトを作りながら
Railsを手を動かしながら学べること。
やっぱり楽しくないと続かないよね。


#環境(参考までに)
macOS High Sierra 10.13.6
MacBook Pro (13-inch, 2017, Two Thunderbolt 3 ports)
プロセッサ:2.3 GHz Intel Core i5
メモリ:8 GB 2133 MHz LPDDR3
価格：17万くらいだったかな？

#最初は何をすれば良いんだ！？
どこのサイトや書籍を見ても最初に、[HomeBrew](https://ja.wikipedia.org/wiki/Homebrew_(パッケージ管理システム))をインストールしろと書いてある。

#####なんだそれ
いきなり聞いたことも無いやつ出てきたけど
どうやらこれをインストールしないことには
後続の便利なアイテムのダウンロードが出来ないらしい。
とりあえず入れてみるなり。

# 素直にHomeBrewをインストールする
インストールは[HomeBrewの公式サイト](https://brew.sh/index_ja)から出来た。
色々書いてあったけど以下のものをターミナルにコピペして実行すれば良いらしい…。
<h6>ん！？ターミナルってどこから開くんだっけ？？</h6>
恥かしながら、Macが初めて過ぎて黒い画面の出し方が分からない。
ググると[Macでターミナルを起動する方法](https://syncer.jp/mac-terminal)が出てきた！
世の中には優しい人がいるものです。

気を取り直してコピペしてEnter押して実行！

```ターミナルより実行
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

途中パスワードとか求められるのでそこを入力してインストール完了！


# いきなりHomeBrewの出番が現れる
続いてRubyをインストールしていくのだが
そのために必要なのがrbenvとruby-buildとのこと。

<h6>なんだこいつら？</h6>
と思ったら、どうやらrbenvはツールで
ruby-buildはそのプラグイン(追加機能)という立ち位置らしい。

rbenvだけだとバージョンの切り替えしか出来ないので
そもそもRubyをインストールしていない現状だと能無し。
Rubyのインストール自体を行うためにはruby-buildが必要とのこと。

ここの[サイト](https://dev.classmethod.jp/server-side/language/rbenv-ruby-build/)が分かり易かった。ありがたい。

バージョンの切り替えはプロジェクトが増えてきてRubyのバージョンが混在した時に
-  Aプロジェクトは、Ruby1.0
-  Bプロジェクトは2.0で
とバージョン情報を保持する時に必要になる感じかな？
今回はいらね。

んじゃ、さっきインストールしたHomeBrewを使ってインストール！！

```
$ brew install rbenv ruby-build
```

…余談ですが、rbenvってなんて読むんだと思って調べたら
[アールイーエンブ](http://yomikata.org/word/rbenv)が市民権を得ている模様。
どうでも良いところで手がとまって先に進まない。

# なんだかよく分からないコマンド現る
今後Rubyの最新バージョンを使用した時に、バージョンがうまく変わらないことを
回避するために以下のコマンドも入力しておく。と本には書いてある。

```
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
$ source ~/.bash_profile
```

<h6>よく分からんので調べてみた</h6>
1行目はユーザのホームディレクトリの[.bash_profile](https://ameblo.jp/macpg/entry-11212892334.html)ってファイルに対して
eval〜-)までの文字列を書き込んでいる模様。
.bash_profileっていうのはターミナル起動時に絶対に呼ばれるファイルとのこと。
対象のフォルダに対してRubyのバージョンを最新にしている。
う〜ん、まだよく分からん。

#Ruby 2.5.1をインストール
本をもとに書いてるので本のバージョンと合わせて
Ruby2.5.1をインストールしてみる。

```
$ rbenv install 2.5.1
$ rbenv global 2.5.1
```

#Rails 5.2.0のインストール
また、本をもとに書いてるので本のバージョンと合わせて
Rails5.2.0をインストールしてみる。

```
$ gem install rails --version "5.2.0" -N
```

なんかエラーでた

```
ERROR:  While executing gem ... (Gem::FilePermissionError)
    You don't have write permissions for the /Library/Ruby/Gems/2.3.0 directory.
```

なんだか、gemに対する書き込み権限がなさそうな感じ。
[ここ](https://qiita.com/nachiguro1003/items/4b564b92eca3ba35744a)を参考に以下のコマンドを実行してみる。

```
sudo chown -R (ユーザ名):staff /Users/(ユーザ名)/.rbenv
```

気を取り直して再度実行…いけた！！

…つかれた。
次はeclipseとmysqlのインストールやろかな。
UserモデルとMicropostモデルとの関連付け

Ruby on Railsチュートリアルの13章にて、2つの異なるモデル(デーブル)同士の関連付けについて
解説しており、理解を深めるため、アウトプット。

# Micropostモデルの生成
Userモデル(あらかじめ生成済み)に関連付けさせるMicropostモデルをrailsコマンドにて生成する。

```
$ rails generate model Micropost content:text user:references
```
上記コマンドにより、ApplicationRecordを継承したモデルが作られる。
※この時、Userテーブル作成時同様、micropostsテーブルを作成するための
マイグレーションファイルも自動的に生成される。
　

user:referencesという引数を含めて、コマンドを実行すると、
ユーザーと１対１の関係であることを表す**belongs_to**のコードが
Micropostモデルのファイルに追加される。

```ruby:app/models/micropost.rb
class Micropost < ApplicationRecord
   belongs_to :user # この行が追記される。
end
```
　

さらに、自動生成されたMicropostモデルのマイグレーションファイルでは、自動的に
インデックスと外部キー参照付きのuser_idカラムが追加され、UserとMicropostを
関連付けする下準備をしてくれる。

```ruby:db/migrate/[timestamp]_create_microposts.rb
class CreateMicroposts < ActiveRecord::Migration[5.0]
  def change
    create_table :microposts do |t|
      t.text :content
      t.references :user, foreign_key: true

      t.timestamps
    end
    add_index :microposts, [:user_id, :created_at] # ここの行！
  end
end
```
※user_idとcreated_atの両方を１つの配列に含めている点にも注目。
こうすることでActive Recordは、両方のキーを同時に扱う複合キーインデックス 
(Multiple Key Index) を作成する。(複合キーインデックスの理解は後日。)　　
　

はじめに実行したrailsコマンドにより、下記テーブルが作成される。
![micropost_model_3rd_edition.png](https://qiita-image-store.s3.amazonaws.com/0/304332/bc3a531c-9753-715d-ca8c-e005354f95ef.png)

# UserテーブルとMicropostテーブルの関連付け
Micropostテーブル作成時にファイルに追記されたbelongs_toと

```ruby:app/models/micropost.rb
class Micropost < ApplicationRecord
   belongs_to :user # この行。
end
```
Userテーブルのファイルに**has_many(1対多の関係を示す)**を手動で追記

```ruby:app/models/user.rb
class User < ApplicationRecord
  has_many :microposts
  .
  .
  .
end
```
すると、以下のメソッドがrailsで使用出来るようになる。

メソッド|用途
:-------:|:---------:
micropost.user|Micropostに紐付いたUserオブジェクトを返す
user.microposts|Userのマイクロポストの集合をかえす
user.microposts.create(arg)|userに紐付いたマイクロポストを作成する
user.microposts.create!(arg)|userに紐付いたマイクロポストを作成する (失敗時に例外を発生)
user.microposts.build(arg)|userに紐付いた新しいMicropostオブジェクトを返す
user.microposts.find_by(id: 1)|userに紐付いていて、idが1であるマイクロポストを検索する

これらのメソッドを用いると、紐付いているユーザーを通して
マイクロポストを作成したりすることが出来る。

例) 

```ruby:railsコンソールにて
user = User.find(1)
micropost = user.microposts.build(content:"hoge")
# micropost変数のuser_idには、関連するユーザーのid(この場合はid:1)が自動的に設定される。
```
【設計時の見落とし】帳票系とDB系とファイル系の考慮について

# はじめに
これは[設計時の見落とし Advent Calendar 2018](https://qiita.com/advent-calendar/2018/overlook)の24日目の記事となります。

業務アプリケーションの設計をするときに、見落としがちなところに焦点をあてて紹介します。 
下流工程からの手戻りを少なくして 双方の負担を減らしましょう。

帳票系とDB系とファイル系について書いてみます。ただ元記事が10年前なので今となっては古いところがあるかも知れません。

# 帳票系の考慮点
* 出力位置(左寄せ、右寄せ、中央)の統一
* タイトルや項目のフォントサイズの統一<br>
社外用はＭＳ明朝やメイリオ
* 印字領域が足りない場合どうするかの確認
* 区切り横線／縦線 太さや出力有無など<br>
小計 グループ計・総計
* オーバーフロー時の出力方法<br>
「*」マークにするとか
* 窓空け封筒、専用帳票の確認<br>
位置調整などが必要なので早めに確認する
* 日付の出力形式の確認<br>
西暦でいいのか、和暦にするのか<br>
月・日は0埋めするのか、空白埋めとするのか
* グループ毎にページ番号を振りなおすかの確認
* マスタ名など正式名称か略名を出力するかの確認
* 正副の出力順番の確認<br>
正正副副 正副正副
* 合計欄の出力領域の確保<br>
合計欄が途中で改ページされて見にくくならないように出力領域を確保しておく
* 出力時間の印字について<br>
開始時間で統一かページ毎に出力時間を印字するか
* 小数点の出力形式や位置を揃えの確認<br>
0の付与 .5 → 0.5 や 0.2 → 0.20 とするかなど<br>

```
   5   5 
 0.2 → 0.2  .(小数点)の位置に揃える
0.35   0.35
```

# DB系の考慮点
Oracle や SQLServer や PostgreSQL による違い。

## NULL と 空文字の扱い 
* Oracle は、NULL と空文字はNULL扱い(同一視)。 
* SQLServerとPostgreSQLは、NULLと空文字は別物扱い。

## NULLデータ有りの並び替え出力順序
* Oracle：(Order by句でNULLS FIRSTとNULLS LASTで指定が可能) <br>
デフォルトではNULLS LASTなので昇順ではNULLは最後に、降順では最初に表示される。 
* SQLServer： NULL値は、昇順に並べ替えるとNULL、空文字、一般文字の順に並びます。降順だとその逆です。 
* PostgreSQL：(Order by句でNULLS FIRSTとNULLS LASTで指定が可能) <br>
デフォルトではNULLS FIRSTなのでSQLServerと同じ

**Oracleを使用していてもプログラム内でDataTable型やDataView型を使用した並び替えを行うとSQLServerと同じ扱いになります。**

## 排他制御の考慮点
|種類|内容|
|:--|:--|
|悲観的ロック|如何なる状況下においても確実に行われるロック制御|
|楽観的ロック|確実性に欠けるが事実上は問題が出ないであろうというレベルのロック制御|
|ロックしない|他のユーザーによる編集結果を無視し、後書き優先として扱う|

DBに排他項目(排他日時、排他端末)を用意し、データ読込み時に保持しDB登録する場合に最新の排他項目を参照し比較して同一ならDB更新、不一致なら排他エラーとする。

ロック専用のテーブル(各キーを登録)を作成して、ロックテーブルにキーがあるなら排他エラーとする。

# ファイル出力系
## ファイル出力時の注意点
自動的にファイルを作成する機能があった場合、そのファイル名に対する心遣いが必要。

* 保存するフォルダ先の考慮
* ファイル名の命名規則
* 上書きしてしまう危険性を考慮する必要がある。ファイル名に作成日を挿入するなどする。

## CSVの注意点
仕様書に「CSV出力する。」とだけ書かれても、決めてもらわないと困ることがあります。

* 見出し名はどうするのか
* 項目順はどうするのか
* タイトルを入れるのか
* 抽出条件を入れるのか
* 二重引用符で囲むのか(文字列型のみか、数値型もするのか)
* CSVのファイル名の命名規則
* EXCELで開いた場合に、コードの0頭が消えてしまう。<br>
0 を消さない為には、「="xxxxx"」とする、アポストロフィ「'」を頭にセット
* EXCELでの最大行数を超える場合はどうするのか<br>
最大行数は、Excel97～2003は65536行、 Excel2007以降は1048576行

### Excelによる表示形式の適用
Microsoft Excel は、次の条件に基づいて、セルに組み込みの表示形式を自動的に適用します。

* 数値にスラッシュ記号 (/) またはハイフン (-) が含まれている場合は、日付形式に変換されることがあります。
* 数値にコロン (:) が含まれているか、または数値の後にスペースと A または P の文字 が続いている場合は、 時刻形式に変換されることがあります。
* 数値に文字の E (大文字または小文字、たとえば 10e5) が含まれているか、 または数値に列の幅とフォントに基づいて表示可能な文字数を超える文字が含まれている場合は、その数値が指数表記の形式に変換されることがあります。
* 数値の先頭に 0 が含まれている場合、その 0 は削除されます。
* 数値を引用符で囲んでいても文字列として扱ってはくれません。
* 入力した数字が12桁を超えると指数表示される。<br>
※12桁以下でも列の幅が狭いと指数表示される。
* 15桁しか有効表示されない。<br>
12345678901234567 → 12345678901234500 と16桁目以降は丸められる。
* 数値に文字の"E"が含まれている場合、指数表示される値として底を10としたときの指数部、<br> 
約-307から約+307まで。<br>
例 1E307 → 1.00E+307 <br>
※1E308以降は、指数部がオーバーフローしているため数値として認識されず文字列として扱われる。
* 数値に引用符を付けてカンマ区切りにすると通貨型で表示されるが、小数3桁目は四捨五入され2桁までしか表示されない<br>
"1,234.567" → 1,234.57
Juliaの環境構築(macOS)

# 環境

- OS: macOS mojave
- Julia: v1.0.3
- Editor: VSCode

# Juliaインストール

ソースコードからビルドするのではなく、Homebrew Caskを使ってインストールします。

```
$ brew cask install julia
```

# VSCodeのjulia extensionをインストール


VSCodeで[Julia extension](https://github.com/JuliaEditorSupport/julia-vscode)をインストールします。
ただし、現状ではJuliaの最新バージョンに対応してないらしく、「Could not start the julia language server.」というエラーが発生しました。

- [issue: Could not start the julia language server. Make sure the configuration setting julia.executablePath points to the julia binary. #405](https://github.com/JuliaEditorSupport/julia-vscode/issues/40)


# チュートリアル

- [公式ドキュメント](https://julia-doc-ja.readthedocs.io/ja/latest/manual/getting-started.html)
- [Julia高速チュートリアル - bicycle1885](https://github.com/bicycle1885/Julia-Tutorial)
Polyphony 2018 → いのしし

# Polyphony の 2018
2018 は Polyphony にとってもう少し普及を図るはずでしたが十分な成果をあげることなく終わりに近づいています。

去年の記事を見てみましょう
[Polyphony のこれから：「鳥が卵から出ようとする」]
(https://qiita.com/ryos36/items/468a47e4c991d5a29d5b)

予定通りに v0.3.3 は出せました。次の機能は達成しました。

- import
- パイプライン化
- for 文の unroll

## II=2 以上のパイプライン実装
これはほぼできました。次の v0.3.4 ではこの機能が盛り込まれるでしょう。

## Tuple による同時性記述 検討(実装)
残念ながら実装には至らず。これはいろいろインタフェース上の諸問題があったためです。Tuple による単純な同時性の記述は今後も検討しますが、重要ではなくなっています。
その代り別の手段を考えています。

## bit ライブラリ(検討)
これも実装には至っていません。う～ん。ここは早めに達成したいですね。

## Python のインライン関数の列挙(検討)
これも実装には至っていません。

## 関数オブジェクト対応
これも実装には至っていません。あまり優先順位は高くないかな。

## 柔軟なリソース対応
これは内部的にだいぶ対応しました。クロックをあげるための仕組みをいれるにあたって内部リソースは柔軟に対応できるようになりました。ただ、それを表現する API が十分ではありません。
ここは慎重になっています。というのも #pragma と同じ運命になってはいけないとおもっているので。

## 柔軟な配列(setitem/getitem)
ここは再考が必要なところです。できればよいのですが、list や配列をどう実際のメモリ、BRAMやレジスタにマッピングするのか？は難しい課題です。ケースバイケースで違うものなのでユーザが指定できるようにするのが望ましい気がします。そしてここにも #pramga (Python ならデコレータになるでしょうが） 問題が顔を出します。

## 何が書けるのか？にフォーカスしていく
「コンパイラ自身の機能アップというより、何が書けるのか？にフォーカスしていく」と書いていますが、あまり達成してませんね。2019 へ課題持ち越しです。今回、いろいろ書いてみて”使える””使えない”は比較的はっきりしてきました。整理が必要です。

# Polyphony の 2019
「コンパイラ自身の機能アップというより、何が書けるのか？にフォーカスしていく」を継続して検討し、おおくの例を示せるようにしたいと思っています。分野はそこそこ絞りたいとは思っています。

- 同時性記述 検討(実装)

これが次の一番のターゲットになります。あと API まわりは整理しないといけません。使いやすい例をいかにあげられるか？これが 2019 年の前半のポイントです。なので、早い段階で、なんらかのアクションを起こしたいと思っています。2019 のアドベントカレンダーを待つという事はしません。
CircleCIをつかってみる


# 私的な導入のながれ

【CircleCI】CircleCI 2.0からはじめる個人での簡単なCI導入方法 - githubとの連携まで - tweeeetyのぶろぐ的めも
http://tweeeety.hateblo.jp/entry/2018/02/09/195345

初期設定の参考にした

Circle CI 2.0で特定のブランチでだけ処理を実行したい
https://blog.sshn.me/posts/circleci-filter-by-branch/

ワークフローを使っていると記述が違うらしい

circleci/node - Docker Hub
https://hub.docker.com/r/circleci/node/

nodeのバージョン指定できた

Gulp 4 task： "Did you forget to signal async completion?" · Issue #45 · sindresorhus/del
https://github.com/sindresorhus/del/issues/45

無名関数を省いて、`export const hoge = gulp.series(...);` とかでできたっぽい

https://github.com/myoan/gulp-circleci/blob/master/.circleci/config.yml

`yarn run gulp hoge`

gulp@4.0.0を試してみた | CodeCode
https://codecodeweb.com/blog/459

exportだとこんな感じ。

```js
export function deploySpecificFiles(done) {
    console.log('no deploy specified.');
    done();
}
```

# 所感

便利、いまのところ期待よりサクサク動く印象
Flaskを使いこなす前にターミナルの基本を知ろう。

コードを作成してみて、「よっしゃ、できた！」と喜ぶ音だと思います。

しかし、あなたはそのコードをどうやってWEB上に反映させますか??
「・・・」
あなたはきっとこんな状況になりませんでしたか？

私はこれだけでほぼ１日悩みましたね。

なので、私と同じところで悩んでいる人はこれを読んでみる価値はあると思います。

まず、結果からお伝えすると、WEB上でpythonを動作させるにはターミナルを立ち上げて作成したｐｙｔｈｏｎコードを保存している場所をターミナルで打ち込みます。

例えば、hello.pyという名前でファイル保存しているとします。
そうしたら、はじめにそのファイルが置かれているディレクトリ（フォルダのこと）の場所をターミナルに教えてあげるために以下のように打ち込みます。
cd ディレクトリの名前

このようにしてあげるとターミナルは迷わずにディレクトリの場所を見つけることができます。
ひいては、ファイルの場所に導くことができます。
続いて、以下のコマンドを入力してターミナルに教えてあげたディレクトリ内のpythonのファイルを実行させます。
python 実行したいpythonのファイル名.py
例：　python hello.py
そうすると、指定したファイルの中身を実行してくれます。

ただ、ターミナル場に実行結果がそのまま表示されるわけではなく、WEB場で実行されるのでそのWEBページのURLがターミナル上に表示されるのでそちらをコピーしてクロームなりで開いてあげてください。
そうすると、正しく自分お書いたコードが動作しているかが確認できます！！

それでは今回はこんな感じで。

また次の機会に！
Ovto 0.3.0をリリースしました

Opal用のマイクロフレームワーク、Ovtoの0.3.0をリリースしました。

## 非互換な変更

0.3.0では一つだけ非互換な変更があります。0.2.xで

```rb
class MyApp
  class View < Ovto::Component
    ...
  end
end
```

という風に書いていたのが、0.3.0では以下のようになります(s/View/MainComponent/)。

```rb
class MyApp
  class MainComponent < Ovto::Component
    ...
  end
end
```

「View」という名称はOvtoが参考にした[hyperapp](TODO)からそのまま受け継いでいたのですが、Ovto全体で考えるとクラス名がComponentなのにViewという名前なのは覚えづらいかなという気がして、「renderの起点となるメインのComponent」という意味で`MainComponent`に改名しました。

### 移行方法

アプリケーション内の「`class View`」を「`class MainComponent`」に変更するだけです。よろしくお願いします。

変更を忘れた場合は以下のエラーが表示されます([このへん](https://github.com/yhara/ovto/blob/v0.3.0/lib/ovto/app.rb#L59-L70)でチェックしています)。

> Since Ovto 0.3.0, View is renamed to MainComponent. Please rename MyApp::View to MyApp::MainComponent

## 新機能

`Ovto.debug_trace = true` とすると、deveoper consoleに「rendering xx」みたいなデバッグログが出るようにしました。「エラーはないはずなのに画面が真っ白」みたいなケースで使う想定です。

ログ内容については他に便利なものがあれば0.3.xで足して行きたいです。

## 公式サイト

今まではウェブサイトのトップがgitbookだったのですが、ランディングページが一枚あったほうがいいかなぁということでページを作りました。

https://yhara.github.io/ovto/

今までのドキュメントは[/docs](https://yhara.github.io/ovto/docs/index.html)で読めます。トップページはまだ情報量がないですが、URLの変更は先に済ませてしまったほうが良いだろうということでこうなりました。

↓作業の様子です。

https://twitter.com/yhara/status/1076858041163640833
思い通りに動かないときの対処方法

※2024/03/06 この記事は移動しました。
[思い通りに動かないときの対処方法](https://qiita.com/moonWalf/items/3552e31a5feac68d464b)

エラーが出てないけど、思っているのとはちがう結果が出るときの対処を書いてみた。  

##思ったとおりに動いている最前線はどこか？  

 思ったとおりに動いている最前線を探す。
 例えば、足し算アプリを作るとして、結果が正しく帰ってこない時は、 
入力値のフォーマットは正しいか？
入力値は処理にわたされているか？
 処理はきちんと動作しているか？
 出力時に結果を出力するようになっているか？
 このあたりを確認して、
処理までは正しい、ということがわかれば、 あとは出力部分を確認していくだけ。

##入力・処理・出力のどこに問題があるか切り分ける。

 プログラムの基本は入力・処理・出力なので、ここをベースに考える。
 コードを読むときもこれを意識すると便利。
 入力場所はただしいか？
入力値がまちがっているのか？
入力されたデータは処理に届いているか？
 処理はきちんと動作しているか？
 出力先が書かれているか？
出力するタイミングは正しいか？

##putsやprintを使ってコンソールに結果を表示してみる。 

putsの場所を色々と変えてみて、どこまではうまく行っているのか探る。

##ステップ実行できるなら、ステップ実行をしてみる。 

ステップ実行をしながら値を確認してみる。
 実行の順序が想定どおりになっているか流れを追ってみる。

##出力箇所の値を計算結果ではなくて、固定の値にしてみる。 

出力箇所の値をなにか固定の値にしてみる。
 設定した固定の値が出力されるならば、出力以前の部分に問題がある可能性が高い。
 設定した固定の値が出力されなければ、別の箇所の値が出力されている可能性が高い。

##親は正しく動いているか確認する。 

そもそも、元になっているクラスのメソッドが正しくうごいているか確認してみる。

##出力がまとめられていないか確認する。 

for文の中で出力処理を書いていたりする場合、 
プログラムの構成によっては最後の結果だけ出力されていたりする。
 ５回ループさせて、５行の結果がほしいのに、５回目の結果しかでない、 そういうこともある。

##最小限度の構成で正しく動くものを作ってみる or サンプルを見てみる。 

計算処理や値の受け渡しをひとまず無視して、 イベントが起きたら値が表示される、
 という感じの最小限度の構成で正しく動くものを作ってみる。
 動かないものと比較したり、
 最小限度のものに肉付けしていったりしてみる。
 あるいはサンプルを見つけて動かしてみる。
いきなり正解に行くのではなく、小さく初めてみる。

##単純なミスがないか確認してみる。 

変数のスペルミスはないか？ 
変数のスコープはまちがってないか？
 書式の間違いはないか？日付や時間の区切り文字、小数点まで表示、など。 
必要な所をコメントアウトしてないか？ 
if文やfor文、メソッドの終了箇所を間違ってないか？

##環境設定に間違いが無いか確認する。 

環境設定に誤りはないか？
DBのスキーマ名はあっている？ホストは？などなど。
「まさかここじゃないよな」というところに、問題があったりする。
思い込みは敵。

##記載場所を変えてみる。

実行順序に問題がある可能性がある。
AのあとにBが実行されるつもりで書いていたのに、  
実はAのあとにDが実行されていたりすることもある。 問題箇所を見つけるためにも、
コードを書いてある場所を変えて試してみる。

##とにかくいじってみる。 

gitやフォルダコピーでもなんでもいいので、バックアップをとっておいて、
 とにかくいじって、実行してみる。

##ググってみる。 

たとえばRailsのGreapを使っていて、かつ初心者なら
 [rails greap api サンプル]
 [rails greap api 入門] 
[rails greap api はじめて]
 等で探してみる。
 あるいは、ITに特化したサイトで探してみる。
 Qiitaとかhatenaとか。 

##質問してみる。 

周りに人がいれば聞いてみる。
 掲示板とかも利用してみる。 [[https://teratail.com/]](https://teratail.com/%5D)
ただし、セキュリティには十分注意すること。

##お茶にする。 

いったんプログラムの事を忘れて美味しいコーヒーでも淹れてみる。
 散歩してみる。 
帰る。
お風呂に入る。
 寝る。
なんでもいいから、いったん離れてみる。
 いったん離れてみると、視野が広がってアイデアが出てきたりする。

##とにかく思い込みから離れる 

思い込みの魔法に掛かっていることを意識すること。
大体、気がつくとなんでもないミスだったりする。

##ここに書いてある内容を忘れること。  

ここに書いたのはひとつの方法論でしか無い。
未来永劫使えるわけでも、誰にでも、いつでも当てはまるわけではない。
なので、必要な部分だけ持っていくこと。
あとは、さっさと忘れてしまうこと。
MT7 をインストールできない環境でコンテンツタイプっぽい実装をした話

これは「[Movable Type Advent Calendar 2018](https://adventar.org/calendars/2900)」、「[MTAppjQuery Advent Calendar 2018](https://adventar.org/calendars/3006)」の24日目の記事です。
今年も Movable Type 一筋の一年でしたが、みなさんはいかがでしたか。今回は、MT7 を導入できない環境で、コンテンツタイプっぽい実装を MTAppjQuery を使って実装した話を紹介します。

## 目標
MT7 のテーマ「Jungfrau」では、「イベント・セミナー」コンテンツの中を作成する際に、「講師」コンテンツ・データを選択します。MT6 の環境でも同様に、別に登録した「講師」情報を使って、「イベンt・セミナー」ページを作成できるようにすることが目標です。

## 必要なもの
実装するにあたり、以下が必要です。MTAppjQuery はコア機能といっても過言ではないですね。

- Movable Type 6.3
- MTAppjQuery 1.11.0

## 「講師」ブログの作成
最初に、「講師」ブログを作成します。ここでは、講師情報をブログ記事で管理することとします。

-  「会社名」や「役職」、「プロフィール写真」等の属性を、カスタムフィールドで登録します。
- 「ブログ記事アーカイブテンプレート」は作成しません。

「ブログ記事アーカイブテンプレート」を作成しない点が、最初のポイントです。講師情報（ブログ記事）のステータスを公開状態にしても、アーカイブで何も出力されません。また、MTEntries を利用して講師情報（ブログ記事）を取得できるわけです。

## 「セミナー」ブログの作成
次に、「セミナー」ブログを作成します。ここでは、セミナー情報をブログ記事で管理することとします。
「開催日時」や「会場」等の属性を、カスタムフィールドで作成します。この際に、「講師」も次表のように追加します。

| 項目 | 内容 |
|:----|:----|
| 名前 | 講師 |
| 種類 | テキスト |
| ベースネーム | seminarspeaker |
| テンプレートタグ | SeminarSpeaker |

## MTAppjQuery の設定
user.js について、MT のテンプレートで管理します。加えて「講師」ブログの更新をトリガーにして再構築するように設定します。この環境で、user.js に以下のように記述します。「講師」ブログのブログ ID を 5、「セミナー」ブログのブログ ID を 6 として解説します。

```
<mt:SetVarTemplate name="_list">
<mt:Entries blog_ids="5" sort_by="authored_on" sort_order="ascend" limit="99999">
'<mt:EntryID />': '<mt:EntryTitle encode_js="1" />'<mt:Unless name="__last__">,</mt:Unless>
</mt:Entries>
</mt:SetVarTemplate>
if (mtappVars.blog_id == "6") {
  if (mtappVars.screen_id == 'edit-entry') {
    $.MTAppMultiCheckbox({
      basename: 'customfield_seminarspeaker',
      label: {
        <mt:Var name = "_list" />
      },
      sort: 'ascend',
      debug: false
    });
  }
}
```

このように設定すると、以下のチェックボックスが「セミナー」ブログのブログ記事の編集画面に表示できます。

- 複数指定が可能なチェックボックスを表示します。
- チェックボックスのラベルが「講師」ブログのブログ記事のタイトル、値が「講師」ブログのエントリー ID となります。

## 「セミナー」ブログの記事の出力
前述の user.js の設定で、カスタムフィールド「講師」には、「講師」ブログのエントリー ID が、カンマ区切りで格納されています。
カンマ区切りのエントリー ID を取得して、講師情報を出力するには、以下の内容を「セミナー」ブログのブログ記事アーカイブに記述します。

```
<mt:SeminarSpeaker setvar="data" />
<mt:SetVar name="_items" />
<mt:Var name="data" regex_replace="/\n/g"," " setvar="_data">
<mt:Var name="_data" regex_replace="/[^,]/g","" cat="," count_characters="1" setvar="_length">

<mt:For var="i" from="1" to="$_length">
<mt:Var name="_data" regex_replace="/^([^,]+).*/","$1" trim="1" setvar="_val">
<mt:Var name="_data" regex_replace="/^([^,]+,?)(.*)/","$2" setvar="_data">
<mt:If name="_val" ne=""><mt:Var name="_items" function="push" value="$_val"></mt:If>
</mt:For>

<mt:Loop name="_items">
<mt:Entries blog_ids="5" id="$__value__">
....
</mt:Entries>
</mt:Loop>
```

前述のテンプレートの内容を解説します。

- mt:For のループで、カンマ区切りのエントリー ID を、配列変数 _items に格納します。
- mt:Loop のループで、配列変数 _items に格納してあるエントリー ID を抽出します。
- 抽出したエントリー ID を使って、「講師情報」を取得します。

## まとめ
MTAppjQuery を活用することで、MT6 の環境でもコンテンツタイプっぽいことができることがわかりました。
今回、Perl モジュールのバージョンの関係で MT7 を導入できなかったため、ちょっとがんばってみました。
[PHP]htmlspecialchars関数でエスケープ

```php
<?php
function h($s){
	return htmlspecialchars($s, ENT_QUOTES, 'utf-8');
}
```

「htmlspecialchars」はHTML用のエスケープ関数とのこと。



上記いついては、ENT_QUOTESで「'」と「"」を、ともに変換している。
utf-8は、もちろん文字コードUTF-8のこと。

つまり、ここでは引数$sに対して、「'」および「"」を変換し、UTF-8に固定しているという形になる。


参照：http://php.net/manual/ja/function.htmlspecialchars.php
[PHP]画像アップロード機能のformのテンプレ

```html
<form action="" method="post" enctype="multipart/form-data">
    <input type="hidden" name="MAX_FILE_SIZE" value="<?php h(MAX_FILE_SIZE); ?>">
    <input type="file" name="image">
    <input type="submit" name="upload">
</form>
```
htmlは上記のようにしつつ

<br>

```php5
<?php
define('MAX_FILE_SIZE', 1 * 1024 * 1024); //1MB
?>
```
php部分には、このように書いておく。
これで、「MAX_FILE_SIZE」が「１*1024*1024」の1MBだと規定している。
<br><br>


```html
<form action="" method="post" enctype="multipart/form-data">
```
これはおまじないとのこと。<br><br>



```html
<input type="hidden" name="MAX_FILE_SIZE" value="<?php h(MAX_FILE_SIZE); ?>">
```
valueで、ファイルサイズの上限サイズを指定している。
上の2つめのコードから、「MAX_FILE_SIZE」が1MBと規定している。

また、formの一番上に記述していることに注目。
一番上に書くことによって、アップロードを待ってからサイズオーバーでエラーが出ることを防いでくれている。

参照：http://doremi.s206.xrea.com/php/tips/upload.html
Scala-nativeは今？！

最近Scala Nativeについてあまり追ってなかったので調べてみました。

Scala NativeはLLVMによってネイティブコードを吐いてくれるもので、登場してからしばらくたつので周辺のライブラリも増えたと期待してそのあたりを調べてみました。Scala Native自体は、パフォーマンスの改善がここ最近のアップデートになっているようです。

## Scala Nativeはここを見ておこう

* [User Guide](https://scala-native.readthedocs.io/en/v0.3.8/user/index.html)
* [GithubのScala Nativeトピっク](https://github.com/topics/scala-native?o=desc&s=stars)
* [awesome-scala-native](https://github.com/tindzk/awesome-scala-native)
* [Community Library](https://index.scala-lang.org/search?q=*&page=1&targetTypes=Native&sort=stars)
* [C Standard Library](http://www.scala-native.org/en/v0.3.8/lib/libc.html)
* [Java Standard Library](http://www.scala-native.org/en/v0.3.8/lib/javalib.html)
* [C POSIX Library](http://www.scala-native.org/en/v0.3.8/lib/posixlib.html)
* [公式Twitter](https://twitter.com/scala_native)

今回はこのあたりを目を通してみて、よさそうなところをピックアップしてみました。

# [Native Lambda](https://github.com/rwhaling/native-lambda)
いきなりすごいのが出てました。AWS Lambda で Scala Nativeが動く！！
ちなみに手元では付属していたDockerfileがコケてしまいまだ動かせていません（泣）
12/4に出たらしいですよ。楽しみすぎます。

# [scala-native-jdbc](https://github.com/jokade/scalanative-jdbc)
SQLiteをScala-nativeから使えるライブラリ（今の所SQLiteのみ）
データベースが使えればもう、Lambdaと組み合わせていろいろできることが増えますね！

# [scala-json](https://github.com/MediaMath/scala-json)
Scala Nativeに対応しています。これでAWS Lambdaから何が飛んできても怖くありません。

# [sttp](https://github.com/softwaremill/sttp)
Scala native経由で、http/https通信ができるようなことが書かれています。（試せていません。。）
AWS Lambda と組み合わせたり、他のサーバーにリクエストが送れたりしたらブリッジとしても機能しそうですね。


# 最後に

AWS Lambda最高です。
FISTA = ISTA + Nestrov AG

#概要
FISTAは、ISTAにNestrovの加速勾配法を応用したもの

FISTAとISTAの違いがわからずもやもやしていたので、[元論文](https://people.rennes.inria.fr/Cedric.Herzet/Cedric.Herzet/Sparse_Seminar/Entrees/2012/11/12_A_Fast_Iterative_Shrinkage-Thresholding_Algorithmfor_Linear_Inverse_Problems_(A._Beck,_M._Teboulle)_files/Breck_2009.pdf)を読んだついでに、まとめておく。

#Iterative Shrinkage-Thresholding Algorithm (ISTA)

```math
\boldsymbol{b} = \boldsymbol{A\bar{x}} + \boldsymbol{n}
```
という観測モデルを考えます。

$\boldsymbol{\bar{x}}$は元画像のウェーブレット係数
$\boldsymbol{A}$は逆離散ウェーブレット変換＋ボケ作用素
$\boldsymbol{n}$は白色雑音
$\boldsymbol{b}$は観測画像

$\boldsymbol{b}$から$\boldsymbol{\bar{x}}$を復元します。以下の最適化問題を考えます。

```math
\min_{\boldsymbol{x}}||\boldsymbol{Ax}-\boldsymbol{b}||^{2}_{2} + \lambda||\boldsymbol{x}||_{1}
```
ウェーブレット係数はスパースなためL1正則化します。$\lambda$は正則化の強さを調整する定数です。解法として、以下のISTAが知られています。

__ISTAのアルゴリズム__
入力：$||\boldsymbol{Ax}-\boldsymbol{b}||^{2}_{2}$のリプシッツ定数

```math
L=2\lambda_{max}(\boldsymbol{A}^{T}\boldsymbol{A})
```

$\lambda_{max}(\boldsymbol{A}^{T}\boldsymbol{A})$は、$\boldsymbol{A}^{T}\boldsymbol{A}$の最大固有値

初期化：

```math
\boldsymbol{x}_{0}=DWT(\boldsymbol{b}), k\leftarrow1, 
```
$DWT$は離散ウェーブレット変換

ステップ１：停止条件を見たしているなら結果を出力して終了
ステップ２：

```math
\boldsymbol{x}_{k}=T_{\frac{\lambda}{L}}(\boldsymbol{x}_{k-1}-\frac{1}{L} \boldsymbol{A}^{T}(\boldsymbol{Ax}_{k-1}-\boldsymbol{b}))
```
ただし、$T_{\alpha}$はソフト閾値処理

```math
T_{\alpha}(\boldsymbol{x})_{i}=(|x_{i}|-\alpha)_{+}sgn(x_{i})
```

ステップ３：$k\leftarrow k+1$
ステップ４：ステップ１に戻る

ISTAは収束が遅いため、Nestrovの加速勾配法を応用したFast ISTA (FISTA)が提案されています。

# FISTA

__FISTAのアルゴリズム__
入力：$||\boldsymbol{Ax}-\boldsymbol{b}||^{2}_{2}$のリプシッツ定数

```math
L=2\lambda_{max}(\boldsymbol{A}^{T}\boldsymbol{A})
```

$\lambda_{max}(\boldsymbol{A}^{T}\boldsymbol{A})$は、$\boldsymbol{A}^{T}\boldsymbol{A}$の最大固有値

初期化：

```math
\boldsymbol{x}_{0}=DWT(\boldsymbol{b}),
\boldsymbol{y}_{1}=\boldsymbol{x}_{0},
t_{1}=1,
k \leftarrow 1
```
$DWT$は離散ウェーブレット変換

ステップ１：停止条件を見たしているなら結果を出力して終了
ステップ２：

```math
\begin{align}
\boldsymbol{x}_{k}&=T_{\frac{\lambda}{L}}(\boldsymbol{y}_{k}-\frac{1}{L} \boldsymbol{A}^{T}(\boldsymbol{Ay}_{k}-\boldsymbol{b}))
\\
t_{k+1}&=\frac{1+\sqrt{1+4t^{2}_{k}}}{2}
\\
\boldsymbol{y}_{k+1}&=\boldsymbol{x}_{k}+\biggl(\frac{t_{k}-1}{t_{k+1}}\biggr)(\boldsymbol{x}_{k}-\boldsymbol{x}_{k-1})
\end{align}
```


ステップ３：$k\leftarrow k+1$
ステップ４：ステップ１に戻る

$\frac{t_{k}-1}{t_{k+1}}$はいわゆるモーメントで$k=1$で0、$k \rightarrow \infty$で1なので、最適解の近くで遅くなる収束を加速する働きがあります。

#数値実験

[画像のボケ除去](https://qiita.com/kibo35/items/5b62e9fdecd64991c727)と同じ検証方法でISTAとFISTAを比較した。
[サンプルコード](https://github.com/kibo35/restoration/tree/master/FISTA)はこちら。

![images.png](https://qiita-image-store.s3.amazonaws.com/0/114365/a1759013-0368-136d-8ffe-d07b913e7b64.png)

![PSNR_vs_iteration.png](https://qiita-image-store.s3.amazonaws.com/0/114365/98f2c1b3-5a3f-bd83-c726-362da8c4cef3.png)

FISTAはISTAの約1/5の反復回数でピークのPSNRがえられた。

#感想

Adam使ってもいいよね
pythonということでFlaskを学びたいのです。

まずはじめに今回書く内容と同じ流れを踏んでいくためにはMACOSである必要があります。

さて、本題です。
pythonを学んでやっていこうと思った時に１度は目にしたであろう、フレームワークの一つであるFlask。

Flaskを使えば簡単にWEBアプリが作れるだのと書かれている！これはすごい！
「それじゃあ、サクッとアプリ作ってみっか！」
と思い切りよくFlaskと検索。
そしたらいきなり何度が高い笑　インストールだけで半日かかったわ笑
まず、Flaskをインストールするには、MACでterminalを立ち上げます。<img width="303" alt="スクリーンショット 2018-12-24 22.48.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/315942/c6da5389-f510-bc6f-973f-7279fbf70c28.png">
そして、以下のコマンドを入力します。
pip install flask

意外と簡単やんけ笑
そう思いましたね。
ここまでは簡単なんです！本番はここから。

それでは続きを明日またここにメモります。

よろしくです。
関数型言語、聞いたことあるけど結局何なの？

# 概要
エニグモ サーバーサイドエンジニアの @gugu です。
この記事は[Enigmo Advent Calendar 2018の24日目](https://qiita.com/advent-calendar/2018/enigmo)です。

関数型言語って結局何なの？と思ったので調べてみました。私が疑問に思ったことをベースに調べた内容を記載していこうと思います。

※関数型言語として主にHaskellをメインに調べているので、関数型言語すべての話ではない記述があるかもしれません。

# 対象者
- オブジェクト指向は知っているけど、関数型言語は知らないって方。
- 私と同じような関数型言語への疑問を持っている方。

# 参考書
- [すごいH本](https://www.amazon.co.jp/%E3%81%99%E3%81%94%E3%81%84Haskell%E3%81%9F%E3%81%AE%E3%81%97%E3%81%8F%E5%AD%A6%E3%81%BC%E3%81%86-Miran-Lipova%C4%8Da/dp/4274068854) （この略し方、、、センス良い！）

# 参考サイト

- https://qiita.com/stkdev/items/5c021d4e5d54d56b927c
- https://qiita.com/arowM/items/0305d4f439752f285438
- https://qiita.com/hiruberuto/items/26a813ab2b188ca39019
- https://qiita.com/wcsakurai/items/5c83a0dc8c8175861902

ありがとうございます！

# 関数型言語の疑問
## 「関数型」っていうけど手続き型でもオブジェクト指向でも関数を書くじゃん？
私がはじめに思った疑問です。みなさんもそう思いませんか？
下記のようです。

- 関数型言語の関数というのは副作用のない純粋な関数のこと。（詳しくは後述）
- すべてが関数でできている。Haskellだとif文も関数なのでelseの省略は不可。※言語によってそれぞれ例外あり。（そもそも何か値を返すのが「関数」、返さないのが「プロシージャ」と呼ぶ。C言語からプロシージャも含めて「関数」と呼ぶようになったとか。）
- オブジェクト指向ではクラス内に関数を書く。（お作法的に。なぜこんな話をするのかは後述）

## 関数型言語の中でもマルチパラダイム言語って両方使えて最強じゃね？
結論から言うとそうでもないらしいです。

その前に関数型言語の種類について説明。。。

- 純粋関数型言語　→　その名の通り関数型のみ。例：Haskellとか
- マルチパラダイム言語　→　関数型とオブジェクト指向の両方の仕組みを備えている。例：Scalaとか

オブジェクト指向が備わっているということは副作用が発生する可能性が増えるということ、つまり関数型言語の本来の目的とズレてしまっていることになります。（もちろん適材適所でオブジェクト指向と関数型で使い分けられるメリットはあるかと。）

## 別に関数型言語でなくてもオブジェクト指向で副作用なく作れば良いのでは？
### まずは先に副作用がないとはどういうことか
雑な説明かもしれませんが、変数が途中で変わらず参照透明であることです。

### 束縛
関数型言語で変数に「代入」することを「束縛」と呼びます。代入と違う点は一度値を入れると変更できません。

```haskell
x = 1
x = 2 -- error
```

### 参照透過性
引数が同じなら返り値も必ず同じになる関数のことを「参照透過性」と言います。

### で、オブジェクト指向でも参照透明に書けば良いのでは？
その通りで、オブジェクト指向でも副作用を避けて書くことは大事です。ですが、そもそも言語としてのアプローチが異なります。

- 関数型言語：副作用を排除する。というより普通に書けば排除される。
- オブジェクト指向：カプセル化して副作用を内側へ隠蔽する。

## 関数型言語は副作用が起きづらい？だから？
下記メリットがあります。

- テストや保守を容易にする
- バグがおこりずらい
- 再利用可能な部品を作りやすい
- （注目）遅延評価

### 遅延評価
副作用がないので実現可能に。
使用するときに一度だけ計算されキャッシュされます。無駄な処理を省くことができます。

## 関数型言語ってどうやって書くの？
これが代表例なのかわかりませんが、私が一番なるほどと思ったのはループ文です。
関数型言語は関数がメインなのでループをさせる際はfor文ではなく再帰を使用します。（Haskellだとそもそもforもwhileも無いみたいです。）

[Wikipedia(関数型言語)](https://ja.wikipedia.org/wiki/%E9%96%A2%E6%95%B0%E5%9E%8B%E8%A8%80%E8%AA%9E#%E9%96%A2%E6%95%B0%E5%9E%8B%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0)

## で、オブジェクト指向、関数型言語どちらで書くべき？
すみません、わからないです。。。（汗）
個人的な意見だと、やはり堅牢でテストコードの書きやすい関数型言語がベターなような気がしますが、オブジェクト指向のほうが「オブジェクト」を自然と意識して作れるので設計しやすいような気もします。ただ書き慣れているだけかもしれないのでやはり関数型言語なのでしょうか。

## 関数型言語の勉強にScalaは向いていないかも。。
関数型言語の勉強でScalaを勉強していたのですが、結局はオブジェクト指向脳を使ってオブジェクト指向で書いてしまうので、なにが関数型言語の特徴なのか理解しづらいです。関数型言語を学びたければ純粋型を学ぶのが良いかと思います。

# まとめ
実際私が関数型言語への疑問を中心に書いたので、偏った知識かもしれません。しかし同じような疑問を持っている方に少しでも役にたてばと思って書いてみました。

調べた感じだと関数型言語は良いことづくしなような気もしますが、数学的でやはりとっつきにくいイメージも大きいかと思いました。結局は「関数型言語を知りたければ関数型言語で書くべし！」なんでしょうね。。関数型言語と仲良くなれるようにがんばります！
windowsにopam2をインストールする

# 動機
SATySFiの環境構築に必要だったのでインストール手順を残しておく

# Cygwin環境
windows上でlinux環境を楽しむためのもの
windowsの場合opamはこのCygwin上で動かすことになるが
すでにCygwin環境がある人とない人でインストール手順が変わってくる

# インストール手順
基本的に以下のリンク先に従うだけ
http://fdopen.github.io/opam-repository-mingw/installation/

上記のリンクを開くと以下の画像のようになってるはず
![fig1.jpg](https://qiita-image-store.s3.amazonaws.com/0/296206/202cf9bb-00bb-92ef-eb83-7f4ee4b421e5.jpeg)

上の「Graphical Installer」がCygwin環境のない人用で
下の「Manual Installation」がすでにCygwin環境がある人用の項目となる

## Cygwin環境がない人
Graphical Installerのところに置いてあるインストーラをダウンロードして実行するだけ
これでopamが入ったCygwin環境が構築されるはず(自分はCygwin環境がすでにあったのでこっちは試してない)

## Cygwin環境がある人
Cygwin環境がすでにある人はインストールして終わりとはならない(と言ってもやることは簡単だが)
1. まずCygwin環境に以下のパッケージを揃える 
- rsync
- patch
- diffutils
- curl
- make 
- unzip 
- git
- m4
- perl
- mingw64-i686-gcc-core か mingw64-x86_64-gcc-core.
2.「Manual Installation」のDownload links:に置かれているファイルをダウンロードする(このとき32bit版,64bit版どちらをダウンロードしたかで,あとの処理が分岐する)
3. ダウンロードされたファイルが存在するディレクトリでCygwin環境のターミナルを開く
4-1.32bit版をダウンロードした人はターミナル上で以下の4つのコマンドを上から順番に実行する

```:
[user]$ tar -xf 'opam32.tar.xz' 
[user]$ ./opam32/install.sh  /usr/local
[user]$ opam init default "https://github.com/fdopen/opam-repository- mingw.git#opam2" -c "ocaml-variants.4.07.1+mingw32c" --disable-sandboxing
[user]$ eval $(opam config env) 
```

4-2. 64bit版をダウンロードした人は以下の4つのコマンドを上から順番に実行する

```
[user]$ tar -xf 'opam64.tar.xz' 
[user]$ bash opam64/install.sh  /usr/local
[user]$ opam init default "https://github.com/fdopen/opam-repository-[user]$ mingw.git#opam2" -c "ocaml-variants.4.07.1+mingw64c" --disable-sandboxing
[user]$ eval $(opam config env)
```
どちらもやることは同じ
5. ターミナル上で以下を実行して

```:
[user]$ opam --version
```
ちゃんとopamのバージョンが返ってきたらインストール成功

# 注意
opamのCygwinとの連携はログイン起動したシェルで行われる.


# 最後に
ドキュメントがちゃんとしててよかった
メモ：「３０日でできる！OS自作入門 」18日目

## dir コマンド

1) カーソル点滅制御１
- 対象のウィンドウだけカーソルを点滅させる
    - 一旦 task_a のウィンドウのみ

2) カーソル点滅制御２
- やりかた微妙ですが、どっちも対象のウィンドウだけカーソル点滅するようになった
    - （なぜかタブの操作にコンソールのカーソルを操作している）

3) Enterキー対応
- 今の行のカーソルをスベースで消して
- y += 16 して　'>' を書く

![スクリーンショット 2018-12-24 21.23.05.png](https://qiita-image-store.s3.amazonaws.com/0/109145/92883c18-265b-a435-675b-cded0ef0cbd0.png)

4) スクロール対応
- 既存の７行をコピーして最後の行を空行にする

5) mem コマンド作成
- ついでに背景に描いてる座標なども全部消す
- 改行書き出す関数のリファクタリング

- コマンドの保存しかたちょっと以外だったけど（`cmdline[cursor_x / 8  2] = i - 256;`)

![スクリーンショット 2018-12-24 21.35.32.png](https://qiita-image-store.s3.amazonaws.com/0/109145/58cda55e-c418-c6f7-51c3-969baf30fec9.png)

6) cls コマンドの実装
- 画面をクリアして、カーソルを戻す

7) dir コマンド
- edimg コマンドでディスクイメージはすでに作られてるので、ファイルを追加 (ipl10.nas, make.bat)
- 各ファイルの情報は 32 バイトの構造体に （FAT っぽい）

```c

struct FILEINFO {
	unsigned char name[8], ext[3], type;
	char reserve[10];
	unsigned short time, date, clustno;
	unsigned int size;
};
```

![スクリーンショット 2018-12-24 22.35.08.png](https://qiita-image-store.s3.amazonaws.com/0/109145/bea35e19-e4cd-f514-369a-a22fa70f8b23.png)
ぼっちAdvent Calendarをやってみた感想

この記事は[~~クリ~~ぼっち(´;ω;`)Advent Calendar 2018](https://qiita.com/advent-calendar/2018/botti)の最終日用の記事です


くぅ～、疲れました！いや、ほんとに(´;ω;`)

実は会社で「Kubernetesで何か発表してよ」と言われた際に
「もうこれQiitaに書けばいいんじゃないかな」と思ったのが始まりでした。
もうとっくに会社のアドベントカレンダーは埋まっていたのですが、
Kubernetes以外もいろいろ勉強しようと思ってたので、
どうせなら勉強しながらQiitaに記事を書こう、ということで始めてしまいました。
[エンジニアは全員技術記事を書くことを習慣化した方がいいぞ](https://qiita.com/HiromuMasuda0228/items/a71dea7ef4d77a30b118)等の記事に感化されたのもあります。

まぁ、他のAdvent Calendarに参加すればいい話だったのですが、
何を思ったか一人で始めてしまいました。

# 感想
## やってよかったこと
#### いいね！が貰えた
* 0いいね続発だと多分失踪してました。いいねしてくれた方々、ありがとうございます:bangbang: 
* 投稿2週間後とかに突然いいねがつくこともあり、誰かの役に立ったんだな、と思えたりしました
 
#### アウトプットには想像以上に時間がかかることを実感できた
* 記事に書かれている内容なんて試行錯誤の結果でしかなく、実際には裏側で膨大な時間がかかっています
* 大した内容でないのに無駄に時間かかったりします。
  * 結構「これで伝わるのか？」の判断は難しく、何度も書き直したり、1時間かけた章をごっそり削ったりもしました

#### これまで勉強しようとして放置してた内容に手を出せた
* 特にディープラーニングです。この機会がなかったらやってなかったと思います

#### なにはともあれやり切った
* なんとか25記事埋めきりました

## やってみてよくなかったこと
#### 時間制約が厳しく、1記事に全力を尽くせないことも
* 内容がない記事を書いちゃうこともありました。（後日追記していくと思います）

#### 企画倒れ記事発生
* 想定外の結果が出て「これどう記事にまとめよう」となったりしたことがありました。
  * 見切り発車はだめでした

#### 毎日投稿できなかった
* モチベーション維持や時間確保がうまくできませんでした。

#### 良記事を読む時間(´;ω;`)
* Advent Calendarにはみなさん力を入れているので、良記事もたくさん生産されてました。
* でもQiitaに記事書かないといけないから読んでる時間が。。。

# エンジニアとアウトプットについて
#### [エンジニアは全員技術記事を書くことを習慣化した方がいいぞ](https://qiita.com/HiromuMasuda0228/items/a71dea7ef4d77a30b118)に書かれていることと実際どうだったかまとめます

* しっかりとした知識がつく
  * だいたいその通りでした。
  * 曖昧なまま記事を書くことも可能ですが、曖昧だったことに気づけるのはアウトプットしようとした成果だと思います 

* 達成感を得られる
  * 得られました!!!

  
* より良いコミュニケーションにつながる 
  * これは実感わかないです。フィードバックがないので成長したかどうかが把握できないんですよね
  * でも慣れたのは間違いないです

* 思いもよらない機会に巡り会える
  * 今後に期待:relaxed:

# まとめ
アウトプットはいいぞ!
Nuxtで直接アクセスを禁止にするmiddlewareを作る

SPAで作っている場合、初期処理は別ページでするので深いページへの直接アクセスを禁止にしたい。みたいなことがあります。
そのような場合に、直接アクセスで別ページ（初期処理をするページ）にリダイレクトするmiddlwareの作り方の紹介です。


## デモ
#### 直接アクセス可能なURL
https://nuxt-playground.netlify.com/middleware-sample/direct-access/

#### 直接アクセスするとトップページに飛ばされるURL
https://nuxt-playground.netlify.com/middleware-sample/disable-direct-access


## 実装
### 直接アクセスを禁止にするmiddlewareを作る
仕組みは本当にシンプルで `from.name` と `route.name` が一致した場合に直接アクセスと判断しています。

```js:middleware/disable-direct-access.js
export default function({ from, route, redirect }) {
  if (from.name === route.name) {
    redirect('/')
  }
}
```


### middlwareを設定
これは先ほど作成したmiddlwareをmiddlwareプロパティに指定するだけです。
※`nuxt.config.js`にもmiddlwareを設定しています。

```vue:pages/middleware-sample/disable-direct-access.vue
<template>
  <div>
    <h1>disable-direct-access</h1>
    <nuxt-link to="/">top</nuxt-link>
  </div>
</template>

<script>
export default {
  middleware: 'disable-direct-access'
}
</script>
```


## あとがき
全コードを公開しているので置いときます。
https://github.com/howdy39/nuxt-playground

もっと良いやり方あるよって場合、コメントくれると嬉しいです。
C言語で文字列分割(4次元配列をつかって)

#内容
hackerrankの問題から
document→paragraph(改行区切り)→sentence(ピリオド区切り)→word(スペース区切り)


メモ用なので、関数化前＆コメントなし
もうちょっと練ってから書き始めればよかった。
似たような操作しかないので、しっかり練ったら芸術的なプログラムになりそう

#コード
```split.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char**** get_document(char* text) {
    char**** result;
    //result = malloc(sizeof(char)*strlen(text));
    //char* buf = malloc(sizeof(char)*strlen(text));
    char** split_para = malloc(sizeof(char*)*5);
    int index_para=0;
    char* ptr;
    ptr = strtok(text,"\n");
    while(ptr != NULL){
        split_para[index_para] = malloc(sizeof(char)*strlen(ptr));
        strcpy(split_para[index_para],ptr);
        index_para++;
        ptr = strtok(NULL,"\n");
    }
    char*** split_sentence = malloc(sizeof(char**)*index_para);
    int index_sentence = 0;
    for(int i=0;i<index_para;i++){
        index_sentence = 0;
        ptr = strtok(split_para[i],".");
        while(ptr != NULL){
            split_sentence[i] = realloc(split_sentence[i],sizeof(char*)*(index_sentence+1));
            split_sentence[i][index_sentence] = malloc(sizeof(char)*strlen(ptr));
            strcpy(split_sentence[i][index_sentence],ptr);
            index_sentence++;
            ptr = strtok(NULL,".");
        }
    }
    free(split_para);
    char**** split_word = malloc(sizeof(char***)*index_para);
    int index_word = 0;
    for(int i=0;i<index_para;i++){
        index_sentence = 0;
        while(split_sentence[i][index_sentence] != NULL){
            split_word[i] = realloc(split_word[i],sizeof(char**)*(index_sentence+1));
            index_word = 0;
            ptr = strtok(split_sentence[i][index_sentence]," ");
            while(ptr != NULL){
                split_word[i][index_sentence] = realloc(split_word[i][index_sentence],sizeof(char*)*(index_word+1));
                split_word[i][index_sentence][index_word] = malloc(sizeof(char)*strlen(ptr));
                strcpy(split_word[i][index_sentence][index_word],ptr);
                index_word++;
                ptr = strtok(NULL," ");
            }
            index_sentence++;
        }
    }
    free(split_sentence);
    result = split_word;

    return result;
}
```
jQueryのeachメソッドをアロー関数で書く

# キッカケ
each文を調べてみるとES5の書き方はたくさん出て来るけれど、ES6のアロー関数を使用した書き方がなかなか出てこなかったので試しに書いてみました。

# ES5までのeach書き方

```js:ES5.js
$('li').each(function(index, element){
  console.log(index + ':' + $(element).text());
})
```

# アロー関数とは
ES6にて追加された関数宣言方法。

## ES5 従来の関数宣言
```js:ES5
function hoge(arg1, arg2) {
  console.log(arg1+ ':' + arg2);
}
```

## ES6 アロー関数
```js:ES6
let hoge = (arg1, arg2) => {
  console.log(arg1+ ':' + arg2);
}
```

# eachのfunctionをアロー関数に置き換える
```js:アロー関数each
$('li').each((index, element) => {
  console.log(index + ':' + $(element).text());
})
```

積極的にアロー関数を使っていこう。
【メモ】to_sメソッドとは何？

Dateクラスのtodayメソッドを使おうとしたところ、文法についてすこし整理したくなったのでメモを残します。


今日の日付を表示したいとき、以下のような表記をします。
dateクラスは組み込みクラスではないので、require宣言が必要。

![スクリーンショット (243).png](https://qiita-image-store.s3.amazonaws.com/0/256858/4de4fd30-382e-dce9-10c3-5de2561b1fb2.png)




```rb
day = Date.today
```
これについては、dayという変数をDateクラスのtodayメソッドで定義するよ～という意味です。

次に出力する際の以下について、to_sメソッドはDateクラスのデータ形式が文字列でも数値でもないことから、CCYY-MM-DDという表示形式に変換できるようにするメソッドです。

```rb

puts day.to_s

#試しにto_sメソッドなしでやってみる

puts day;
```

###出力結果

![スクリーンショット (245).png](https://qiita-image-store.s3.amazonaws.com/0/256858/70c9a48b-ff12-824b-8207-e60f9d3ff43f.png)

一緒でした。ネット上を探してみましたが、to_sなしでも構わない旨の記事を見つけることができませんでしたので、基本的にはto_sメソッドを使用するという考え方でいきたいと思います。



##参考までに
ほかにもto_s()でいろいろな表示形式にできると記載してありました。以下の記事を参考にしました。
[https://qiita.com/ykyk1218/items/d5086dcb7618d4f918ec](https://qiita.com/ykyk1218/items/d5086dcb7618d4f918ec)