OmniAICreator/Qiita-1.07M huggingface dataset:
MySQL(Ver.8.0)の基礎

　MySQL8.0系と5.0系では扱い方に若干の違いが見受けられる事と私個人の学習のため本記事を作成した。多々間違いはあるだろうがその際には教えていただきたい。また、Mac Osでの作業をメインに記載していく。

#1.MySQLの起動、停止、リスタート方法
　以下はすでにMySQLをインストールしていることを前提として始める。インストール方法については[@hkusu](https://qiita.com/hkusu/items/cda3e8461e7a46ecf25d)さんがまとめてくださっていたので参考にすればインストールできるだろう。

　それではMySQLの起動方法だが主に2通り。1つ目はシステム環境設定から直接起動する方法。システム環境設定からMySQLを選択するとInstanceからMySQLの起動と停止が可能。当然その際にはパスワードが要求される。

　2つ目はターミナルから直接起動する方法。
**・**下記コマンドを実行


```
$ sudo mysql.server start
$ sudo mysql.server stop
$ sudo mysql.server restart
```
　上からそれぞれ、起動、停止、リスタートが可能。その際にもパスワードは要求される。もし、コマンドが見つからない場合はPATHを通してない可能性が高い。MySQLは作業していないときは停止しないとPCが重くなるのでしっかりと停止する癖をつける。

#2.MySQLの接続と終了
MySQLを起動している状態で下記コマンドを実行。

```
$ sudo mysql -u {ユーザー名} -p 
```
　でパスワードを入力した後に接続が開始される。終了したい場合は```exit``` or ```quit``` or ```\q```で終了可能。

#3.データベース、テーブルの操作
　まずは、現在のデータベースの確認を行ってみる。

```sql
mysql> show databases;
```
により、現在作成されているデータベースの一覧が確認できる。
　
　次に、データベースの作成を行う。

```sql
mysql> create database {データベースの名前};
```
により、新規のデータベースができた。```show databases;```で確認してみるといい。

　作成したデータベースを指定する。

```sql
mysql> use {データベースの名前}
```
ここでは今まで最後に記述していた「；」が必要ないということ。まぁ、記述しても普通に動くんだけど....

 そして、現在作業中のデータベースを確認

```sql
mysql> select database();
```
　上記のコマンドを打ち込むと現在作業しているデータベースの確認が可能。ここで注意することは、データベースの確認は```show databases;```、作業中のデータベースの確認は```select database();```だということ。**databaseが複数形か単数形か**の違いだが、考えればこうなるのは当然。作業中のデータベースがいくつもあったらおかしいもんね。

　取り敢えず今回はここまでにしよっと。
Webサイトから CloudFunctions の実行と躓いたところ

# Webサイトからcallメソッドで呼び出し

firebaseオブジェクトを作っているなら、`functions`を作成しておくとリクエストが簡単になる。

```javascript
var myFunctions = firebase.functions();
myFunctions.call("helloWorld"); // 叩くだけの場合
myFunctions.call("helloWorld").then((data) => { // 結果を使用する場合
  console.log(data);
});
```

`firebase serve` を使用する場合は、以下の修正でテストサーバを参照可能

```javascript
var myFunctions = firebase.functions();
myFunctions.emulatorOrigin = "http://localhost:5000"; // <= 追加
myFunctions.call("helloWorld");
```

# CORSのエラー

CORSポリシー違反のエラー has been blocked by CORS policy

```
Access to fetch at 'https://example.cloudfunctions.net/helloWorld' from origin 'http://localhost' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. If an opaque response serves your needs, set the request's mode to 'no-cors' to fetch the resource with CORS disabled.
```

サーバ側にcorsの対応が必要
CloudFunctionsのプロジェクトで `npm install -S cors` を実行する。
メソッド実行部を `cors()` で囲むように修正。

```javascript
const functions = require('firebase-functions');
const cors = require("cors")({ origin: true }); // <= 追加

exports.helloWorld = functions.https.onRequest((request, response) => {
  cors(request, response, () => { // <= 追加
    response.send(JSON.stringify({ data: "Hello from Firebase!" }));
  }); // <= 追加
});
```
多言語メッセージファイルの指定

# はじめに
メッセージファイル(翻訳ファイル)に指定したメッセージをテンプレートファイル(Twig)で指定する。

# メッセージファイル／テンプレートファイル／コントローラー
## メッセージファイル
### yaml
message.xx.yaml
(xxはja,en,frなど)

```yaml:src/Eccube/Resource/locale/messages.ja.yaml
#====================================================================================
# 共通
#====================================================================================

common.select: 選択してください
 :
 :
#------------------------------------------------------------------------------------
# Sample
#------------------------------------------------------------------------------------
sample.shop_name: 店舗名
sample.maker_name: メーカー名は「%maker_name%」です！
sample.product_name: 商品名は「%product_name%」です⁉
sample.size_ab: |
  サイズAは「%size_a%」だけど...
  サイズBは「%size_b%」のはず。
  (A-B：%size_a%-%size_b%)
sample.size_a: サイズAは「%size_a%」だ。
```

sample.shop_nameなどがキー
%xx%が可変文字
"|"で複数行で指定可

### php
messages.xx.php
(xxはja,en,frなど)

```php:src/Eccube/Resource/locale/messages.en.php
<?php

return [
    //common
    'common.label.add' => 'Add',
    :
    :
    // sample
    'sample.shop_name' => 'shop name',
    'sample.maker_name' => 'maker name is "%maker_name%".',
    'sample.product_name' => 'product name is "%product_name%"!?',
    'sample.size_ab' => "size-a is '%size_a%' ...\n size-b is '%size_b%' .\n (A-B:%size_a%-%size_b%)",
    'sample.size_a' => 'size-a is "%size_a%" .',
];
```

sample.shop_nameなどがキー
%xx%が可変文字


## テンプレートファイル

```twig:app/template/default/Sample/index.twig
{% extends 'default_frame.twig' %}

{% block main %}

{{ 'sample.shop_name'|trans }}は"{{ shop_name }}"です。<br/>
{{ 'sample.maker_name'|trans({
    '%maker_name%' : '株式会社XX'
}) }}<br/>
{{ 'sample.product_name'|trans({
    '%product_name%' : product_name
}) }}<br/>
サイズ：A={{ size_a }}/B={{ size_b }}<br/>
{{ 'sample.size_ab'|trans({'%size_a%':size_a,'%size_b%':size_b})|nl2br }} !!<br/>

{% endblock %}
```

※直接値を指定するときは"'"で括る
※複数変数に値を指定する時は","で区切る
※複数行にするときはメッセージファイルで改行を入れて"nl2br"でフィルターする

## コントローラ

```php:app/Customize/Controller/SamplePageController.php
/**
 * @Route("/sample/{id}", name="sample_index")
 * @Template("Sample/index.twig")
 */
public function index($id)
{
    :
    :
    return [
        'shop_name' => $this->baseInfo->getShopName(),
        'product_name' => $product->getName(),
        'maker_name' => $product->getMakerName(),
        'size_a' => $product->getProductSize()->getSizeA(),
        'size_b' => $product->getProductSize()->getSizeB(),
    ];
}
```

#まとめ
メッセージファイル／テンプレートファイル／コントローラーの連携

ja,en,frなどは.envで指定
```
ECCUBE_LOCALE=en
```


#参照
[多言語化](http://doc3n.ec-cube.net/i18n_multilingualization)
Alpine LinuxのEdgeとかTestingとは何なのか

Dockerfileを作っていく中でバージョンに関する日本語解説が見当たらなかったので、Alpine Linuxの各バージョン・ディレクトリについて公式Wikiの内容を翻訳して解説していきます。
公式Wikiは[こちら](https://wiki.alpinelinux.org/wiki)なので、英語がわかる人は直接読むこと。

##バージョンについて

###v3.xとかv2.x
その名の通りバージョンです。解説するまでもありません。
大人しくこれを使うべきではないでしょうか。

###Latest stable
最新の安定版となります。よって環境を常に最新に保ちたいというのであれば、このバージョンを使うことになります。
しかし、バージョンが上がることでインストールするパッケージのバージョンも変わるため、上位互換性のない変更があったら死ぬかもしれません。

大体のシステムはphp version X.Xで動作確認済みとかするので、もしもECSとかEKSでシステムを動かす場合にこの設定だと、ビルドするたびにインストールされるパッケージが変わる恐れがあります。
使うのであればテスト環境でビルドしたもので動作確認をしっかりする体制が必要でしょう。それができているならセキュリティ的にも安定したバージョンと言えます。

###Edge
今回の主題。これは最新の開発中バージョンということを意味します。
[ローリング・リリース](https://ja.wikipedia.org/wiki/%E3%83%AD%E3%83%BC%E3%83%AA%E3%83%B3%E3%82%B0%E3%83%BB%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%B9)によって小さく頻繁な更新が行われており、最新の変更が適用されている。
しかし裏を返せば最も多くのバグが潜んでいるバージョンであるため、あなたがコントリビュータとしてコミュニティに貢献したい訳でもないなら使うべきではないでしょう。

本番環境で使う場合は注意してくださいとあるが、**原則として本番環境で使うべきではない。**

alpine linuxを用いたdockerfileがネットにはいくつも転がっているが、いくつかedgeを使っているので注意してください。


##ディレクトリについて
Edge,latest-release,v3.xなどのバージョンの下にはいくつかのディレクトリがあります。
ディレクトリにはいくつかのパッケージが含まれており、大別すると基本パッケージと追加パッケージに分かれます。
目的に応じてリポジトリに追加してください。

###main
メインのディレクトリです。基本的なパッケージが含まれます。

###community
様々な理由により追加されたパッケージが含まれるディレクトリです。６ヶ月以上はサポートされません。

###testing
全ての追加パッケージはまずtestingに入ります。追加されたパッケージは肯定的なフィードバックか、その他の良い理由により評価されるとmainへ移動します。
このディレクトリは安定バージョンには含まれず、開発バージョンであるedgeにのみ含まれます。

###non-free
これに含まれるパッケージはフリーソフトウェアではありません。[フリーソフトウェア財団](https://www.fsf.org/)のフリーソフトウェア規約に反している、改変および他者への再配布を禁止しているパッケージが含まれています。

###unmaintained
パッケージがもうメンテナンスされなくなったりビルドされなくなったりすると、このディレクトリに移動されます。
これは誰かがパッケージを修正しようと考えている場合に備え、元のAPKBUILD(パッケージビルド用のスクリプト)を利用可能なままにビルドサーバーを壊さないようにするためです。
ゼオライト系の構造解析アプリzeo++の使い方解説とスクリプトかいた

# zeo++とは

http://www.maciejharanczyk.info/Zeopp/examples.html
こちらのサイトにあります。主にゼオライトなどの多孔質物質の

* 穴のサイズ（入り口付近と真中付近）
* とあるサイズの球（プルーブ）が到達可能な表面積
* 空隙率

<img width="601" alt="bbbbb.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/208338/1685b5da-8489-fc39-0b7e-5ffff81da5de.png">

などをモンテカルロシミュレーションを用いて計算してくれます。

## インストール方法
MacとLinuxであれば素直にイントールでき、windowsであればcygwinで構築するのがいいみたいです。
今回はMacでのみインストールを検証しています。

まずは[こちらのサイト](http://www.maciejharanczyk.info/Zeopp/download.html)にアクセスします。

<img width="596" alt="aaaaa.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/208338/f5a3fb39-b1b6-96ca-b318-e785c078793d.png">

1. まず最初にメアドを登録する。The registration form is available here. となっているhereの部分をクリックすると下のフォームが出るので、記入するとメールが届きそちらにpasswordなどが書いてます。
<img width="601" alt="bbbbb.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/208338/986b44d3-25b1-9792-020f-f1c66c2353a6.png">
2. download hereと書いてある部分をクリックするとidとパスワードを聞かれるのでメールに書いてあるものを記入します。
3. インストール手段に従ってインストールします。大まなか流れとしては解凍したあとにvoroというフォルダに移動してmakeコマンドでmakeします。(zeo++はvoroに依存している)。その後にもとのディレクトリでzeo++自体をmakeします。長い辛抱のあと、``./network``が使えるようになります。


## 使い方
zeo++のディレクトリ下でコマンドを実行します。pathを通せるのかもしれませんが、ハマったのでpathは通しませんでした。

### 対応inputファイル
* CSSR
* CUC
* V1
* CIF
* ARC

### 用語説明
* probe 到達可能な表面積を計算するのに使う。探査機という日本語訳のとおり、どの程度のサイズの球体が到達可能かという文脈で使われる。
* channel ゼオライトなどの分子間の空いた空間のこと。ここを吸着物質が通ることから運河という意味をあてたのかも？
* void なにもない空間

####穴の大きさを知りたい
``-ha``オプションはhigh accuracyという意味で、このオプションを付けると時間はかかりますが正確な値を出してくれます。
``-res``オプションをつけると穴のサイズを出してくれます。

```
./network -ha -res output_file.res input_structure.cssr
```

出力ファイル

```text:outputfile.res
 EDI.res    4.89082 3.03868  4.81969
```
値のそれぞれの意味は 下の図のDi Df Difを意味します。

![spheres.png](https://qiita-image-store.s3.amazonaws.com/0/208338/056f9947-a9de-d5d7-77f0-93697549afdb.png)

####到達可能な表面積を知りたい
``-sa``オプションをつけると穴のサイズを出してくれます。プルーブのサイズとチャンネルのサイズは一致させるとよいと公式サイトには書いてました。サンプル数はモンテカルロシミュレーションのサンプル数です。

構文

```
./network -sa chan_radius probe_radius num_samples outputfile.sa input_structure.cssr
```

例

```
./network -ha -sa 1.2 1.2 2000 EDI.cssr
```

出力ファイル

```text:outputfile.sa
@ EDI.sa Unitcell_volume: 307.484   Density: 1.62239   

ASA_A^2: 60.7713 ASA_m^2/cm^3: 1976.4 ASA_m^2/g: 1218.21 

NASA_A^2: 0 NASA_m^2/cm^3: 0 NASA_m^2/g: 0
```

asaが到達可能表面積
nasaが到達不可能表面積
を表す。

## シェルスクリプトを用いて自動化
あまりシェルスクリプトを書いたことがないので稚拙なものですがこんな感じになりました。

```shell

#/bin/bash

CIF_DIR="ここにcifが入ったディレクトリを指定"
# ディレクトリのファイル数
count=`ls -U1 $CIF_DIR | wc -l`
# forで回すよう
i=0

for cif in $CIF_DIR/*; do
    i=$((++i))
    # 標準出力は捨て、errorはerror.logに追記 (tail -f error.logなどで確認)
    # 穴のサイズ計算
    ./network -res "$HOME/cosmos/`basename $cif .cif`.res" $cif  1>> /dev/null 2>> "$HOME/cosmos/error.log" 
    # 表面積計算
    ./network -sa 1.5 1.5 2000 "$HOME/cosmos/`basename $cif .cif`.sa" $cif  1>> /dev/null 2>>"$HOME/cosmos/error.log"
    # 進捗を％表示
    printf "%5s%%\r" $((i*100/count)) 
done


```

## python(cython) wrapperもあるみたい
ソースを除くとcython wrapperもあります。そちらのconfigファイルをいじってvoroのディレクトリを調整したのちsetup.pyを実行すれば使える様になるみたいですが、検証はしてません。
(レポート)NRIアジャイルハブ #9 この過労死がすごい

# はじめに
社内アジャイルコミュニティ「NRIアジャイルハブ」の第９回目企画として、#9 チームビルディング〜この過労死がすごいゲーム〜を実施しました。
今回はそのレポートです。写真を取りそびれてしまったのでプレイ写真がないことはご容赦ください。

# NRIアジャイルハブ
## このコミュニティのステートメント
* アジャイルにまつわる様々なプラクティスを実践・実験し、
* 多様な価値観・背景を持つ人々が知識・経験を共有し、
* 我々を取り巻くチーム・組織の文化・マインドを変革し、
* NRIを通じて世界をより魅力的にする。  
 
そんなコミュニティです。

## 大事にする価値観
NRIアジャイルハブは
* 失敗を恐れず実験するマインド
* 変化を楽しむ姿勢
* 多様な人とのつながり  
を大事な価値観としています。

・・・ということになりました。今後共よろしくお願いいたします。
Peatix のコミュニティページはこちら。ぜひフォローをば。
https://n-agile-community.peatix.com/view

# この過労死がすごいゲームとは
 [反社会人サークル](http://gamemarket.jp/booth/gm1503/)というサークルが作った同人カードゲームで、欧米でも「KAROSHI」として知られる「カロウシ」をテーマにしたカードゲームです。上司はカロウシを防止、社畜は自分がカロウシしないように同僚をカロウシさせる、というブラックユーモアにあふれたゲームとなっております。
今回、このゲームを選定した理由は上司役の人は暴走する部下をいかに止めるか、部下役の人はこの題材を反面教師としてチームでの立ち振る舞いを振り返っていただけましたら幸いです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/123578/fe697ace-244e-e77a-63c0-4b60844a0a73.png)

# ゲームレポート
本ゲーム、ルールが思った以上に複雑で事前にルールを読み込んでいた私は神視点から参加していました。
はじめはルールに戸惑いながらすすめていましたが、慣れてきたら皆さんサクサクとタスクを遂行（カードを切る）しておりました。

かなりのブラックジョークや当時のはやりの風刺が多く含まれていて、世代間がことなるメンバー同士では、「これ、どういう意味だろう？」という反応も面白かったです。また、ロウドウや時間外勤務（こういった種類のカードがありますｗ）をするときに、どんな内容の勤務をするのか、どれだけ時間がかかったのかで各人のタスクに対する肌感を知ることもできて非常に楽しむことができました。

今回のゲーム、幸いなことに人数が多く過労死の基準時間が低かったにもかかわらず、カロウシチャンスを引いて過労死する人が少なかったです。みなさん、プレイしながら必勝法などを考えちゃうあたり、弊社社員だなーと感心しましたｗｗｗ

# 振り返り
今回のゲームは、アジャイルになにか直接的に活かすというよりもチームビルディング要素が強いゲームであったというコメントが多かったです。しかし、個人的には心理的安全性ゲーム、価値観ババ抜きなどその他チームビルディングをするゲームが数多くありますが、アジャイルを遂行する上でチームはめちゃめちゃ重要なものです。そのチームのちからを高めることは非常に重要なので、こういった引き出しを積極的に増やすよう、皆様にも働きかけたいと思います。
【slick.js】最初の1枚目だけ切り替わりが早い時の対処方法

普段はあまり気にならないのですが、
自動で切り替わるスライダーを実装した時に

- 最初の1枚目だけ切り替わるのが早く、コピーが読めない。
- 2周目以降は切り替わる速さは問題ない

といった場合の対処方法を説明します。

##beforeChangeとslickSetOptionを使う

autoplaySpeedの初期値には __指定したいautoplaySpeedの値 + speedの値__ を指定。
1枚目以外のスライドに切り替わったタイミングで __slick('slickSetOption', 'autoplaySpeed', 8000, true)__ のように指定。

```javascript
$slider.slick({
  infinite: true,
  fade: true,
  speed: 2000,
  autoplay: true,
  autoplaySpeed: 10000,
})

$slider.on('beforeChange',function(event, slick, currentSlide, nextSlide){
  if(nextSlide > 0 ) {
    $slider.slick('slickSetOption', 'autoplaySpeed', 8000, true)
  }
})
```

## ○枚目だけ切り替わる時間を変更したい場合
〇枚目だけ切り替わる時間を変更したいというときは、
第4引数の `nextSlide` をうまく使えば実装可能です。
今回は1枚目だけ切り替え速度を遅くするというパターンです。

```javascript
$slider.slick({
  infinite: true,
  fade: true,
  speed: 2000,
  autoplay: true,
  autoplaySpeed: 10000, //1周目のスライド1枚目
});

$slider.on('beforeChange',function(event, slick, currentSlide, nextSlide){
  if(nextSlide > 0) { //スライド1枚目以外
    $slider.slick('slickSetOption', 'autoplaySpeed', 5000, true);
  } else { //2周目以降のスライド1枚目
    $slider.slick('slickSetOption', 'autoplaySpeed', 8000, true);
  }
});
```
あまり遭遇する機会もないかもですが、slick.js以外のライブラリでも考え方は同じなので、遭遇された方は一度お試しください。
GoogleTest + CMakeでC++の実践的なユニットテスト環境を構築する：その２（カバレッジ表示）

## 背景と目的

[前回](https://qiita.com/imasaaki/items/c56639c86627a8a950de)の続きの記事です。

下記に対応します。
> #### 背景と目的
> - ⑦カバレッジを行単位で表示できること（別途記載予定）

[前回](https://qiita.com/imasaaki/items/c56639c86627a8a950de)はユニットテストの実行環境を構築するだけで終わりましたが、それに加えて
htmlのカバレッジレポートを出力できるようにします。

## サンプルコード
本記事は、ミニマムなサンプルコードを追っていけば目的を達成できるようになっています
といってもコードのほうに詳しいコメントを記述しているわけではないので、簡単に解説を下記に記述します。
サンプルコードは[こちら](https://github.com/imasaaki/simple-googletest-cmake-coverage-sample)

## お試し環境
 - os: Ubuntu 16.04 LTS
 - tool: gcc-5.4.0, cmake-3.10.2, lcov-1.12
 - lcovがインストールされていることが前提です
    - lcovのインストール方法例（他の方法もあると思います）：

```bash
$ mkdir ~/tmp
$ wget https://github.com/linux-test-project/lcov/releases/download/v1.12/lcov-1.12.tar.gz -O ~/tmp/lcov-1.12.tar.gz
$ tar xfz ~/tmp/lcov-1.12.tar.gz -C ~/tmp/
$ cd ~/tmp/lcov-1.12
$ sudo make install
```

## 解説
 - [前回](https://qiita.com/imasaaki/items/c56639c86627a8a950de)からの差分を説明していきます。
 - まずは、test側のビルドオプションに「--coverage」を追加します。
    - このオプションは、gcov用のファイルを出力するオプションで、build/test/CMakeFiles/UnitTestExecutor.dir配下に.gcnoというファイルが生成されます
    - このオプションは、コンパイル時には「-fprofile-arcs -ftest-coverage」、リンク時には「-lgcov」に付けてくれる便利なものです。 

```cmake:test/CMakeList.txt
set(CMAKE_CXX_FLAGS  "${CMAKE_CXX_FLAGS} --coverage") # 追加
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --coverage") # 追加

set(MY_SRCS_MINUS_MAIN ${MY_SRCS})
list(REMOVE_ITEM MY_SRCS_MINUS_MAIN ${PROJECT_SOURCE_DIR}/src/main.cpp)

# [以下、省略]

```
 - ビルドする（[前回](https://qiita.com/imasaaki/items/c56639c86627a8a950de)を参照）
 - 次にテストを実行してから、カバレッジ結果をhtmlで出力するまでの手順ですが、
    - ①テスト実行
    - ②lcov（gcov）でカバレッジ解析
    - ③不要な情報を削除
    - ③htmlを生成する
 - 手順をスクリプトにすると、こんな感じです
    
```bash:runtest.sh
# run test to output gcov files
cd build/test
./UnitTestExecutor

# make coverage data 
cd CMakeFiles/UnitTestExecutor.dir
lcov -d . -c -o coverage.info

# remove unnecessary file paths
lcov -r coverage.info */googletest/* test/* */c++/* -o coverageFiltered.info

# make html report
genhtml -o lcovHtml --num-spaces 4 -s --legend coverageFiltered.info
```

 - テストを実行すると、gcnoファイルがあったディレクトリにgcdaファイルが出力されます。
 - 次にlcovを実行すると、内部ではgcovが実行されカバレッジ解析されhtml化するための情報が生成されます。
 - そのままだと、外部プロジェクト、testコード、C++標準ライブラリなどの結果も含まれているので、必要に応じて取り除きます。
    - 必要なものだけ抽出する方法（-eオプション）もあります。自プロジェクトのソースファイルには接頭辞をつける規約があれば、このようなときに役立ちます。
- genhtmlでhtmlを生成します。lcovHtmlというフォルダが生成されて、そこにhtmlファイルが保存されて終了です。
    - オプションは最低限にしています。
 - ちなにみ、参考サイトにも書いてありますが、作業ディレクトリをどこにして、どこにファイルを出力すればいいのか、というところでハマりやすい気がします。
 - 実行すると、

```
$ ./runtest.sh
```

 - 結果は、build/test/CMakeFiles/UnitTestExecutor.dir/lcovHtmlに出力されてindex.htmlを開くと、無事にカバレッジ結果が表示されるはずです。
    - それにしても、このデザイン、もう少しモダンにする方法ないですかね。。。

![lcov_top.png](https://qiita-image-store.s3.amazonaws.com/0/143120/f57f5605-4436-8e14-fb0f-7ee8881e7de5.png)

![lcov_rc.png](https://qiita-image-store.s3.amazonaws.com/0/143120/577f1138-e5b0-af8a-4b18-c9db8aa64592.png)

  
## 参考サイト
 - http://d.hatena.ne.jp/ku-ma-me/20090721/p1
Illustratorでアセットの収集と一括書き出しの方法


Photoshopで慣れていたので、
久しぶりのIllustratorでの書き出しに苦戦。
一応自分用にメモ。

## Illustratorから書き出し

- スクリーン用に書き出し
(command + option + E)

- アセットタブを開くと「アセット書き出しパネル」に登録されている一覧が表示される

- アセット書き出しパネルには、書き出したい対象をドラッグしていれる

### 注意事項！
- SVG・文字は思わぬ不具合を避けるため、必ずアウトラインをかける

### 余談的な
- PhotoshopからIllustratorに配置する時は、
Photoshoptから直接配置せずに、Finderからドラッグして配置する。
この時、必ずCap Lockがかかっていないか確認する事（ロックがかかっていると、画像のリンクが外れて埋め込み画像になってしまう。）

- IllustratorからPhotoshopにパスを持っていく時には、コピペでOK！
この時、スマートオブジェクトになっている事を確認する事。


## 書き出した画像にマスクがかかっている場合
一度ライブラリに配置後、改めてアートボードに配置する。
（思わぬ不具合を避けるため、必ずカラーモードがRGBである事を確認する事）


この、一度ライブラリに配置するという作業がちょっと面倒。
ドラッグ&ドロップで配置するから、元画像と同じ位置に配置し直さないといけないし、
画像が増えていくので元画像は削除するのか、もしくは残しておくのか悩む。

良い管理方法を知ってる方がいらっしゃれば、ご教授お願い致します。。

おわり。
【目的無しの泥臭調査①】使用Windowsツール代替のWebアプリを調査

・ふと気になったことを、淡々と赴くままに調査していく、この上ない自己満足記事第一弾。
・法外な浪費癖と、「無駄が一番楽しい」という歴史的本質教訓の支持者ということで、初回を書いていく。
・はじめとして、自分が使用しているWindowsツールの代替Webアプリの把握や比較等の調査をしていこう。
## テキストエディタ
・簡単なメモから文書作成、コード編集等に使用。
### ＜使用Windoowsツール＞
- メモ帳　・・・簡単なメモや一時的な記録用に作成。
- サクラエディタ・・・メモはもちろん、高機能の文書編集やキーボードショートカット等を用いたいときに使用。
- Visual Studio Code・・・主にマークダウン編集やコード編集等に使用。

### ＜代替Webアプリ＞
- [EverNote](https://evernote.com/intl/jp)　・・・メモ管理。文字だけじゃなくて、画像や位置情報等も扱える。保存はクラウド上で行われる。
- [Marxico](https://marxi.co/)　・・・マークダウンエディタ。chromeで扱える。Evernote連携可能。有料。
- [DropboxPaper](https://www.dropbox.com/paper)　・・・マークダウンエディタ。複数人編集可能。無料で扱える。

## IDE（開発環境）
・学習環境や個人開発等に使用。
### ＜使用Windoowsツール＞
- Eclipse　・・・主にJava開発に使用。
- Visual Studio Code・・・学習用に使用。拡張機能追加で、簡単な開発環境が整う。

### ＜代替Webアプリ＞
- [Cloud9](https://aws.amazon.com/jp/cloud9/)　・・・AWSで扱えるクラウドIDE。環境構築不要。無料枠あり。
- [PaizaCloud](https://paiza.cloud/ja/)　・・・Paizaで扱えるクラウドIDE。環境構築不要。無料枠あり。ipadでも扱える。

## 画像加工・処理
・画像編集や複数画像処理・圧縮等に使用。
### ＜使用Windoowsツール＞
- GIMP・・・画像編集に使用。無料だけど高機能。
- ImBatch・・・画像一括処理に使用。バッチファイルとして保存可能。

### ＜代替Webアプリ＞
- [PIXLR EDITOR](https://pixlr.com/editor/)　・・・画像編集サービス。レイヤー機能や投稿機能もある。
- [Kraken.io](https://kraken.io/)　・・・画像圧縮サービス。ファイルだけではなく、フォルダごとも可能。
- [Squoosh](https://squoosh.app/)　・・・画像圧縮。圧縮だけでなくリサイズ等も可能。

## ファイル圧縮
・容量の大きいファイルの圧縮に使用。
### ＜使用Windoowsツール＞
- 7-zip・・・ファイル圧縮・解凍に使用。7z形式等、扱えるファイルが多い。

### ＜代替Webアプリ＞
- [Online-Converter.com](https://squoosh.app/)　・・・ファイル圧縮サービス。7zやRar圧縮も可能。音声や動画変換機能もある。

## 比較
・テキストやファイル比較の際に使用。
### ＜使用Windoowsツール＞
- WinMerge・・・テキスト比較に使用。ファイル単位やフォルダ事も可能。

### ＜代替Webアプリ＞
- [DiffChecker](https://www.diffchecker.com/)　・・・テキスト比較サービス。テキストやコード等の比較が簡単。フォルダ毎の比較は不対応。

## 資料作成
・文書やスライド資料作成等に使用。
### ＜使用Windoowsツール＞
- Excel・・・見積書や設計書等の作成に使用。
- Word・・・文書資料作成に使用。
- PowerPoint・・・スライド資料作成やプレゼン等に使用。

### ＜代替Webアプリ＞
- [Google Apps](https://www.appsupport.jp/googleapps/)　・・・スプレッドシート（Excel）やドキュメント（Word）やスライド（PowerPoint）等、資料作成がオンラインで行える。Google Apps Scriptの使用で、サービス連携や簡単な自動化等が行える。
- [Office Online](https://products.office.com/ja-jp/office-online/documents-spreadsheets-presentations-office-online)　・・・上記のMicrosoftツールが、オンラインで同機能で扱える。保存はOneDrive上で行える。

## メール
・連絡や報告等のメールソフトとして使用。
### ＜使用Windoowsツール＞
- Thunderbird・・・メールソフトとして使用。拡張の豊富さやフィルタの高機能さがある。

### ＜代替Webアプリ＞
- [Gmail](https://www.google.com/gmail/)　・・・Gmailのwebメールツール。メールソフトとして、Gmail以外のメールも扱える。Google Appsとの連携可能。
- [Outlook](https://outlook.live.com/owa/)　・・・Microsoftのメールサービス。シンプルで、メッセージ管理がしやすい。Officeとの連携が可能。

## まとめ
- 初回はWebアプリ調査ということで、普段知らなかったサービスと巡りあえた快感が、全身くまなく帯びる。
- この気分を味わったことは、「過剰な泥臭調査による被害」をうちけしてくれたであろう。
- 尊敬に値すべき素晴らしいWebアプリに溢れる一方、それを上回る誇り高きローカルソフトもあるという、劇的な切磋琢磨道。
- 涙を流し切ってもなお、潤いを求めてしまう私は、また果て無き調査にいそしむとしよう。
setTimeoutにおける0ミリ秒後とは

### Javascriptにおける<code>setTimeout</code>とは
* nミリ秒後に何かを実行したい場合に使う関数
* 下記の例だと、コンソールに<code>now</code>と出力した1000ミリ秒=1秒後に<code>1 sec. later</code>と出力される

```{javascript:whatIsSetTimeout.js}
function hoge() {
    console.log('now');
    setTimeout(function () {
        console.log('1 sec. later');
    }, 1000);
}

hoge();

// now
// 1 sec. later # 1秒後

```

### 使い方
<code>setTimeout(callback, delay)</code>

| 引数     | 説明                                  |
| :------- | :------------------------------------ |
| callback | 実行したい関数                        |
| delay    | 何ミリ秒後に実行するか <b>(初期値は0)</b> |

### 利用シーン
一連の処理の直後に何かを実行したい場合

```{javascript:sample.js}

function fuga() {

    console.log('process1');
    console.log('process2');

    setTimeout(function () {
        console.log('setTimeout process');
    });

    console.log('process3')

}

fuga();

```

<code>setTimeout</code>の第2引数を指定しなかったので0が代入され、
この関数は下記のような順序で処理される

```{bash:result}
process1
process2
process3
setTimeout process
```

### 「0ミリ秒後ってなんだよ」問題

#### 実験その１
<code>setTimeout</code>の引数に<code>0</code>, <code>1</code>, <code>2</code>を与え、それぞれ同じ関数内で実行してみる

```{javascript:test1.js}
setTimeout(()=>console.log(0), 0);
setTimeout(()=>console.log(1), 1);
setTimeout(()=>console.log(2), 2);
```

```{bash:result1}
0
1
2
```

結果はなんとなく想定通りだが、0秒と1秒を指定したときの違いが分からないので次の実験に移る。

#### 実験その２
実験その１から記述の順番を逆転させてみる

```{javascript:test2.js}
setTimeout(()=>console.log(2), 2);
setTimeout(()=>console.log(1), 1);
setTimeout(()=>console.log(0), 0);
```

```{bash:result2}
1
0
2
```

え、、、<code>1</code>が<code>0</code>より先に来るのか・・・

### 結論
この他にもいろいろ試したが、
<code>setTimeout</code>の第2引数に<code>0</code>を与えるのと<code>1</code>を与えるのは<b>同じである</b>ことが判明した。
同じなので、単純に記述した順に実行される。
その他にも少数(0以上1以下)・マイナスなどで試したが、<b>1以下の数値を指定しても同じ結果となった</b>。

### 心の声
（だったら初期値も1で良くね？）
CentOSで、Openjdk10とmavenを使えるようにする

# Java10のインストール

* ここにJDKが置いてあるので、適当な場所でwget
    * https://jdk.java.net/java-se-ri/10

```
$ wget https://download.java.net/openjdk/jdk10/ri/jdk-10_linux-x64_bin_ri.tar.gz
--2019-01-25 16:05:56--  https://download.java.net/openjdk/jdk10/ri/jdk-10_linux-x64_bin_ri.tar.gz
..
Saving to: ‘jdk-10_linux-x64_bin_ri.tar.gz’

```

* tar で解凍
    * jdk-10 というフォルダが生成されます

```
$ tar -xvf ./jdk-10_linux-x64_bin_ri.tar.gz
$ ls jdk-10/
bin  conf  include  jmods  legal  lib  man  release
```

* 適当な場所でよいので、移動  今回は `/opt` 配下
    * java 動きました

```
$ /opt/jdk-10/bin/java -version
openjdk version "10" 2018-03-20
OpenJDK Runtime Environment 18.3 (build 10+44)
OpenJDK 64-Bit Server VM 18.3 (build 10+44, mixed mode)
```

# Mavenのインストール

* 以下にバイナリがあります
    * https://maven.apache.org/download.cgi

* wget で取得して、/optに配置

```
# ls /opt/apache-maven-3.6.0/
bin  boot  conf  lib  LICENSE  NOTICE  README.txt
```


# PATH と JAVA_HOME を設定

* これはどこでもよいですが、以下を設定

```
$ cat /etc/profile.d/java.sh

# Settign Java & Maven

export PATH=$PATH:/opt/apache-maven-3.6.0/bin/:/opt/jdk-10/bin/

export JAVA_HOME=/opt/jdk-10/
```

# 補足 MavenのProxy設定

* プロキシ配下の場合は以下を設定
    * `/opt/apache-maven-3.6.0/conf/setting.xml` 

```
  <proxies>
    <proxy>
      <id>optional</id>
      <active>true</active>
      <protocol>http</protocol>
      <username>proxyuser</username>
      <password>proxypass</password>
      <host>proxy.xxxx.co.jp</host>
      <port>8000</port>
      <nonProxyHosts>local.net|some.host.com</nonProxyHosts>
    </proxy>
  </proxies>
```
React (TypeScript): メモリリークしないaxiosの使い方

# Memory leakしないaxiosの使い方

ReactでAJAXのリクエストを送信する際にはwindow.fetch, jQuery AJAX, Axiosなど色々利用する事が可能です。

この記事ではAxiosを利用してmemory leakを起こさずに、AJAXのリクエストを送信する方法を記載します。

## 1. `state`用のインターフェースを定義する
```react
import axios, { CancelTokenSource } from 'axios'

interface IState {
    source: CancelTokenSource
}
```

## 2. Axiosの`CancelTokenSource`を`state`に保存する
```react
class AxiosSample<{}, IState> extends React.Component {
    public state = {
        source: axios.CancelToken.source()
    }
    ...
}
```

## 2.  AJAXコードの呼び出しは、`componentDidMount()`で行う
この際に`{ cancelToken: this.state.source.token }`を第2引数として渡してください。

```react
class AxiosSample<{}, IState> extends React.Component {
    ...
    public componentDidMount() {
        axios
            .get(
                '/api/samples',
                { cancelToken: this.state.source.token }
            )
            .then(
                response => {
                    // 取得したデータを元に処理を行う。
                }
            )
            .catch(
                error => { alert(error) }
            )
    }
}
```

## 3. リクエストのキャンセル処理を`componentWillUnmount()`で行う
リスエストの処理中にページ遷移等でコンポーネントのアンマウントが実行されるとメモリ・リークを起こす可能性があります。防止策として、`componentWillUnmount()`でAxiosのキャンセル処理を行いましょう。

```react
class AxiosSample<{}, IState> extends React.Component {
    ...
    public componentWillUnmount() {
        this.state.source.cancel('リクエストがキャンセルされました。')
    }
}
```

## 参照
* [AJAX and APIs](https://reactjs.org/docs/faq-ajax.html)
* [Axios Cancellation](https://github.com/axios/axios#cancellation)
Lambda実行時に 'No space left on device'とエラーが出るときの対処法

## 現象
同じlambdaのファンクションを何度も実行していたら表題のエラーが出ました。
検索をかけてもディスクの容量や、Inodesがいっぱいなので容量を空けましょうみたいな記事が引っ掛かったので確認してみても容量は十分空いていたため、そのままハマってしまいました。

```log:error.log
OSError: [Errno 28] No space left on device
```

## 結論
一時作業ディレクトリの`/tmp`配下の容量がいっぱいになっているようでした。
なのでlambda関数内の最後に、

```py:lambda.py
call('rm -rf /tmp/*', shell=True) 
```
を入れて実行毎にファイルを削除してあげると解決します。
AWS Elemental Live の使い方


こんにちは。streampackのktsuchiです。

この2月で、このチームに入って半年が経ちます。
あっという間すぎて、焦りを感じている今日この頃…

今回は、2015年にAWSの仲間入りとなったElemental社のサービスのうち
**Elemental Live**（ライブエンコーダ）の使い方をご紹介します。

- [AWS Elemental Live](https://www.elemental.com/products/aws-elemental-live)
![ScreenShot 2019-01-25 16.08.52.png](https://qiita-image-store.s3.amazonaws.com/0/277934/e1902510-6402-422b-05cd-25195241364b.png)

## ログイン

こちらのURLからログインします。
https://cloud.elementaltechnologies.com/login
![ScreenShot 2019-01-21 11.52.52.png](https://qiita-image-store.s3.amazonaws.com/0/277934/6f28ffe0-88cb-88fd-eead-ad1af8dd9734.png)
## サービス開始

再生ボタンをクリックし、サービスを開始します。
（「running」になるまで、**およそ20分程**かかります。）
![ScreenShot_m 2019-01-21 11.57.19.png](https://qiita-image-store.s3.amazonaws.com/0/277934/b35ae3fb-6185-b1d7-4076-150bcb452949.png)
（あらかじめ右下のボタンから、Developmentの追加が必要ですが、今回は省略します。）

### ちなみに

このコンソール上では、AWS Elemental Conductor（統合ビデオ管理システム）を通して、
Elemental Liveを操作するという形になります。

他のElementalサービスを使いたい場合は、「Services」からサービスを有効化すれば
**Elemental Server**, **Elemental Delta**などを利用できます。
![ScreenShot_m 2019-01-21 12.30.11.png](https://qiita-image-store.s3.amazonaws.com/0/277934/980495cb-9142-4788-a22d-6782bbc89efe.png)

## イベント作成

「New Event」から新しいイベントを作成します。
![ScreenShot 2019-01-25 15.11.26_m.png](https://qiita-image-store.s3.amazonaws.com/0/277934/42b8564b-8025-c61e-fbe0-bc0fafc8a5b7.png)
すでにEvent設定をXML形式ファイルで保存している場合は、
それを「Load」して使用することも可能です。

各パラメータの説明は、項目名にマウスオーバーすると表示されます。
![ScreenShot 2019-01-25 15.17.24_m.png](https://qiita-image-store.s3.amazonaws.com/0/277934/2fcedb53-2529-a624-f66a-c33ef1446e33.png)
作成後、Event情報は「Event XML」を押すとダウンロードできます。
![ScreenShot 2019-01-25 14.16.20_m1.png](https://qiita-image-store.s3.amazonaws.com/0/277934/91f2d1cd-410f-0112-7ff4-d761f43d4dc0.png)
何かあったときのバックアップとして、
設定をダウンロードして保存しておくことをオススメします。

## イベント開始
Eventを「Start」させると、エンコードが開始されます。
送られてきた動画を「Preview」ボタンで確認することもできます。
![ScreenShot 2019-01-25 14.16.20_m.png](https://qiita-image-store.s3.amazonaws.com/0/277934/0118ce9b-f0a9-b88a-91dd-8a43d2f625ca.png)

## ログ出力

- Conductor Log

「Diaglostic」 - 「Logs」から見ることができます。
![ScreenShot 2019-01-25 15.45.36_m.png](https://qiita-image-store.s3.amazonaws.com/0/277934/59faeaaf-d30e-a690-ce32-21119b50aac0.png)

- Event Log

「Events」 - Eventを選択 - 「View Logs」から確認できます。
![ScreenShot 2019-01-25 14.16.20_mm.png](https://qiita-image-store.s3.amazonaws.com/0/277934/364420b6-2163-29f5-a2e5-b7af7e5fc8d2.png)
### 注意点

サービスを停止させると、**Elementalのログは全て消えてしまいます！！**
必要なログはサービス停止前に、必ずダウンロードして保存しておきましょう。

## 参考リンク

- [Elemental Live 2.14.4 GA - API and User Guide](https://community.elemental.com/docs/DOC-3954)

Elemental公式のユーザーガイドです。
閲覧するには、**AWS Elemental User Community**アカウントが必要になります。

- [Elementalライブエンコーダーを使ってUstreamで配信](https://support.video.ibm.com/hc/ja/articles/207852447-Elemental%E3%83%A9%E3%82%A4%E3%83%96%E3%82%A8%E3%83%B3%E3%82%B3%E3%83%BC%E3%83%80%E3%83%BC%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6Ustream%E3%81%A7%E9%85%8D%E4%BF%A1
)

Elementalの情報はほとんどが英語で、日本語のページは少ないのですが、
Elemental Liveの操作に関する日本語ページがあったので、参考にリンクを貼っておきます。
【rails5】paramsとhidden_fieldを使っての、値の受け取り方について

#paramsとhidden_fieldを使っての、値の受け取り方について

###実現したいこと

管理者ユーザーでログイン。
編集ぺージで一般ユーザーの更新処理をした後、編集したユーザーのトップページ(show_path)へリダイレクトするため、一般ユーザーのidを受け取りたい。
find_byでやると管理者ユーザーのidしか受け取れない。

これがなかなか上手くいかずハマりましたが実現出来たのでメモ。

ご指摘などあれば是非お願い致しますm(__)m

以下のコード。

```
def show
  if current_user.id != params[:id]
    @user = User.find(params[:id])←これが間違い
  else
    @user = User.find(current_user.id)
  end
```

find_byでは１件しか取得出来ず、管理者ユーザーへ飛んでしまうので✖

思いつく限り試すが、シンボルは使えないというようなエラー。

```
@user = User.find(params[id: :user.id])
```

```
@user = User.find(params[id: @user.id])
```

先輩に聞いた結果、
「userのidを受け取るから、こうすればいいんじゃない？」とのアドバイス。

```
@user = User.find(params[:user][:id])
```

受け取れました。。


##今回学んだこと

**hidden_fieldで@userのidを取得し、form_forで渡す場合は、
コントローラー側のparamsで、「どのモデルの」「どの値なのか」を定義する必要がある。**

今回の場合、[:user][:id]とする必要があった。

どのモデルのidなのか？を定義する必要があった。

**idはビューから飛んでいたが、コントローラー側でidの受け取り先のモデルがなかった**、
というような状態だった。

今回はidだったが、仮に年齢である[:age]を複数受け取りたい場合、findは使えない。

findはidのみを複数検索するため。

上記の場合はwhereメソッドを使うこと。

１件取得するだけで良いのであればfind_byメソッドを使う。

```
@user = User.find_by(params[:user][:age])とかにする。
```

かなりハマりましたが勉強になりました！

その後調べていると以下の記事でとてもわかりやすく書いてくださっていました。

[f.hidden_fieldとhidden_field_tagの使い方【Ruby on Rails】]
(https://sakurawi.hateblo.jp/entry/hidden_field)
>
```
f.hidden_field :shampoo_id, value: shampoo.id
```
こちらの記述だと、コントローラーでparamsを使って引用する際には
params[:user][:email]に保存されます。
理由は、@userの、email属性に、valueで渡した値を格納しているからですね。
モデルのインスタンスの属性に格納しているのです。
Userのモデルのnameカラムや、emailカラム、それぞれに受け渡したい場合は、こちらを利用する必要があります。
Formrunを使ったフォームにbuttonタグを使うと送信されてしまう

#Formrunとは
メールフォームが作れるサービス。

公式サイト
https://form.run/ja

#今回のトラブル
Formrunを「HTML・CSSをオリジナルで作成」し、ボタンをクリックするとテキストボックスに行が追加される入力エリアを作った。

```html:form.html
<div class="form-group">
    <label for="area" class="lead">入力エリア</label>
    <textarea name="area" id="area" class="form-control" rows="10">項目1:
項目2:
項目3:

</textarea>
    <button id="add-line" class="btn btn-primary">行追加</button>
</div>

<script>
(function($){
$("#add-line").click( function() {
 var addText = "項目1:\n項目2:\n項目3:\n\n";
 var getData = String($("#area").val());
$("#area").val( getData + addText );
});
</script>
```


**参考にしたサイト**
jQuery でテキストボックスの値を設定／取得／追記／削除を行う方法
https://webllica.com/jquery-text-edit-get-add-del/

すると「行追加」ボタンをクリックしただけで送信されてしまった。
jQueryが原因かと思いscriptを切るが送信されてしまう。

#対処方法
jQueryが原因でないならタグが原因。
`<button>`を試しに他のタグに変更すると解消された。

```html:form.html
<div class="form-group">
    <label for="area" class="lead">入力エリア</label>
    <textarea name="area" id="area" class="form-control" rows="10">項目1:
項目2:
項目3:

</textarea>
    <!-- ▼buttonをdivに変更 -->
    <div id="add-line" class="btn btn-primary">行追加</div>
</div>

<script>
(function($){
$("#add-line").click( function() {
 var addText = "項目1:\n項目2:\n項目3:\n\n";
 var getData = String($("#area").val());
$("#area").val( getData + addText );
});
</script>
```

Formrunを使うときは`<button>`タグ使うのやめよ。

#補足
jQueryは今回関係なかったが、一応記述したのは問題解決の流れを記録しておきたかったため。
【メモ】BEMとSCSS

mainという親を持つ同じようなブロックがある
modifierによって子要素のmain_contentにそれぞれ異なるスタイルを当てたい。

```haml
.main
  .main__title
    タイトル
  .main__content
    中身
.main--loc__primary
  .main__title
    タイトル
  .main__content
    中身

.main--loc__secondary
  .main__title
    タイトル
  .main__content
    中身
```

普通？に書くと

```scss
.main, .main--loc__primary, .main--loc__secondary{
  width: 300px;
  height: 300px;
  background-color: #CCC;
  margin-bottom: 10px;
  &__title{
    font-size: 20px;
  }
  &__content{
    font-size: 10px;
  }
  &--loc__primary{
    .main__content{
      background-color: #F00;
    }
  }
  &--loc__secondary{
    .main__content{
      background-color: #0F0;
    }
  }
}
```

こんな感じになるかなぁと。
そこでat-rootやらインターポレーションを使って玄人っぽく書くと

```scss
.main{
  @at-root{
    &, &--loc__primary, &--loc__secondary{
      width: 300px;
      height: 300px;
      background-color: #CCC;
      margin-bottom: 10px;
    }
    #{&}__title{
      font-size: 20px;
    }
    #{&}__content{
      font-size: 10px;
    }
    &--loc__primary #{&}__content{
      background-color: #F00;
    }
    &--loc__secondary #{&}__content{
      background-color: #0F0;
    }
  }
}
```
わかりにくっ！ｗ


そんなことより

```scss
.main{
  background:{
    image: image_url();
    repeat: no-repeat;
    position: 50% 50%;
    size: cover;
  }
}
````
って書けるのを知って衝撃でしたｗｗｗ
Macでawkを実行するとエラー: "dyld: Library not loaded: /usr/local/opt/readline/lib/libreadline.7.dylib" となる問題の解決法

## 解決したいこと

`awk`を実行すると以下のエラーが発生しました。
（エラーが発生するようになった原因は不明で、調査中です）

```bash
$ awk
dyld: Library not loaded: /usr/local/opt/readline/lib/libreadline.7.dylib
  Referenced from: /usr/local/bin/awk
  Reason: image not found
Abort trap: 6
```

## 解決法

解決法は**`readline`をインストールし直す**です。

`/usr/local/opt/readline/lib/libreadline.7.dylib`がnot foundといっていて、実際に存在を確認してもなかったので、入れ直せばいいと思い入れ直したら、うまくいきました。以下は解決の手順です。


以下のように`brew info readline`で利用可能なバージョンを調べます。`libreadline.7.dylib`に`7`が含まれていたので、バージョンは7系が良さそうかなと思い、7系の最新の`7.0.5`が良さそうです。

```bash
$brew info readline
https://tiswww.case.edu/php/chet/readline/rltop.html
/usr/local/Cellar/readline/6.3.8 (46 files, 2.0MB)
  Poured from bottle on 2015-09-11 at 23:22:41
/usr/local/Cellar/readline/7.0 (45 files, 2MB)
  Poured from bottle on 2016-10-01 at 06:49:56
/usr/local/Cellar/readline/7.0.1 (46 files, 2MB)
  Poured from bottle on 2017-01-24 at 13:25:38
/usr/local/Cellar/readline/7.0.3_1 (46 files, 1.5MB)
  Poured from bottle on 2017-03-23 at 13:40:32
/usr/local/Cellar/readline/7.0.5 (46 files, 1.5MB)
  Poured from bottle on 2018-10-02 at 11:09:53
/usr/local/Cellar/readline/8.0.0 (48 files, 1.5MB)
  Poured from bottle on 2019-01-23 at 17:00:02
```



あとは、以下のコマンドを打って、無事に解決しました。

```bash
$ brew switch readline 7.0.5
```

以下のように無事にヘルプが出るようになりました。

```bash
 awk
Usage: awk [POSIX or GNU style options] -f progfile [--] file ...
Usage: awk [POSIX or GNU style options] [--] 'program' file ...
POSIX options:		GNU long options: (standard)
	-f progfile		--file=progfile
	-F fs			--field-separator=fs
	-v var=val		--assign=var=val
Short options:		GNU long options: (extensions)
	-b			--characters-as-bytes
	-c			--traditional
	-C			--copyright
	-d[file]		--dump-variables[=file]
	-D[file]		--debug[=file]
	-e 'program-text'	--source='program-text'
	-E file			--exec=file
...
```

## 参考
* [Mac & Rails でreadlineなエラーが起きた時に対応したこと - Qiita](https://qiita.com/siukaido/items/9143846d5421866b7898)
Cognos Analyticsのインフラ構築で必要な作業項目

#はじめに
Cognos Analyticsのインフラ設計およびインフラ構築で必要な作業項目について改めて棚卸しする機会があったので、ここにも投稿してみようと思います。

#設計作業

基本設計
詳細設計
　　OS設計
　　Cognos設計
　　Getaway設計
　　Cognos Repository DB設計
　　Framework Manager設計
　　認証設計

　　※Cognos BIを構築するような場合は「Application Server設計」も必要となる


パラメータ設計
　　Cognos Administration設計
　　データソース設計
    
　　※インフラ設計ということで認可 (Cognos上のレポートやフォルダに対しての権限設定) は除いている

運用設計
　　起動・停止
　　監視 (プロセス、メモリー、ディスク)
　　バックアップ管理 (データバックアップ、システムバックアップ)
　　ログ管理
　　監査
　　スクリプト
　　ジョブスケジュール

テスト計画
　　単体テスト
　　　　起動、停止
　　　　Cognosへのアクセス
　　　　データソースアクセス (サンプルレポートの実行、またはデータソースへの接続成功)

　　運用テスト
　　　　スクリプト単体テスト
　　　　ジョブテスト
　　　　監視の通知テスト
　　　　バックアップ・リストアテスト
　　　　
　　障害テスト
　　　　片系障害テスト

#構築作業

環境構築
　　Cognosインストール
　　Cognos Repository DB構築
　　Getaway構築
　　Cognos構成
　　認証セットアップ

スクリプト開発
　　起動
　　停止
　　バックアップ
　　ログメンテナンス

#テスト
単体テスト
運用テスト
障害テスト
    
#さいごに
ここに挙げたのが絶対ではなく、環境や要件によっては過不足があると思いますが、検討のスタートラインとして利用してただけると幸いです。
また、ここに記載の無い項目についてご存知でしたらフィードバック頂ければと思います。
Azure Web AppのVNet統合機能でExpressRoute先のオンプレサーバに接続する

これまでWeb AppからExpressRoute(Private Peering)先のオンプレのリソースにアクセスするためには、App Service Environmentを使ってWeb AppをvNetに配置するしかありませんでした。
でもApp Service Enviromentはお値段が結構するので中々手が出せずにいました。

この新しいVNet統合機能を使うことで、ExpressRoute先のリソースにもアクセスすることができるようになります。
素晴らしい！神アップデート！！

2019年1月時点でプレビューです。GAが待ち遠しいですね。

# 環境

## 構成イメージ
### Before
* 既にExpressRoute(Private Peering)環境が存在し、Azure vNetからオンプレServerへ疎通できることを前提にします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/7fb280ed-1169-f35a-604c-5f67683843b0.png)

### After
* ExpressRouteのvNetに新規サブネットを作ってVNet統合させます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/464cb238-e472-9948-e869-9aed72123c3a.png)

## 制限・制約
* VNet統合は空のサブネットに行うこと
* Web AppはWindows版であること
* App ServiceプランがStandard以上であること

# 手順

## 新規サブネット作成
* 既存のExpressRoute接続vNetにサブネットを追加する（VNet統合するためには空でないといけないので新規作成します）  
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/9b759274-98ae-b54f-28c6-71cca94ae883.png)

## Web App設定
* Standardプラン以上でWeb Appを作成します（手順は割愛します）

* 事前にオンプレ側に繋がらないことを確認しておきます。Web Appで[コンソール]を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/852b6a7f-8926-5dae-f2ee-163401287728.png)

* tcppingを実行してエラーが返ってくることを確認します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/8a0264dd-8743-fd25-8969-189f2842e82b.png)

* [ネットワーク]を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/288de87d-fbf1-e32d-5331-e2f09c9a0a87.png)

* VNet統合の[構成するにはここをクリック]を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/c42b9cca-069c-7adb-b12e-d7faac159b67.png)

* [VNetの追加(プレビュー)]を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/e95f5db1-63a4-f1bf-2e40-a154d70e09ff.png)

* 事前に準備したサブネットを選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/a1898238-372d-2091-8349-41a0da8e6005.png)

## 疎通テスト
* tcppingが通るようになればOKです。（5分くらい掛かります）  
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/8a3e68aa-4707-ae7a-b4c6-281ded4e16d3.png)

# 参考にさせて頂いたサイト
[新しい Azure App Service の VNET Integration を試した](https://blog.shibayan.jp/entry/20190118/1547742419)
CSVをPHPから出力する方法

https://qiita.com/ikemonn/items/f2bc4f9f834c989084ff

の

```php

<?php

$data = array('hoge,fuga', "hoge\nfuga");
$csv = '';
$filename = 'test.csv';

foreach ($data as $key => $value) {
    //カンマ対応
    $value = str_replace(',', '","', $value);
    //改行対応
    $value = str_replace("\n", chr(10), $value);
    $csv .=  $value . ',';
    $csv .=  "\n"; 
}

    header("Content-Type: application/octet-stream");
    header("Content-Disposition: attachment; filename=$filename");
    echo mb_convert_encoding($csv,"SJIS", "UTF-8");
```
がそれっぽいので
実装してみるっためメモ失礼します。
いつのまにかcapistrano(net-ssh)でed25519が使えるように

# どうすれば良いか
Gemfileに次を追加して```bundle install```

```
gem 'bcrypt', '~> 3.1.7'

gem 'ed25519'
gem 'bcrypt_pbkdf'
```


# 至った経緯
- capistrano使っててed25519でAgentForwardできない
  - net-ssh 5.x移行で使える
- Gemfile.lock/bundle exec gem list確認するとnet-ssh 5.10になっている
- config/deploy/staging.rb の ssh_optionsにverbose: :debugを追記してログ確認
 
```
E, [2019-01-25T15:09:40.146918 #667] ERROR -- net.ssh.authentication.agent[3ffff3118fcc]: ignoring unimplemented key:unsupported key type `ssh-ed25519'
net-ssh requires the following gems for ed25519 support:
 * ed25519 (>= 1.2, < 2.0)
 * bcrypt_pbkdf (>= 1.0, < 2.0)
See https://github.com/net-ssh/net-ssh/issues/565 for more information
```
- Gemfileを次の様に変更して動作確認

```
# Use ActiveModel has_secure_password
gem 'bcrypt', '~> 3.1.7'
～省略～
group :development do
  # Use Capistrano for deployment
  gem "capistrano", "~> 3.11", require: false
  gem 'capistrano-rails'
  gem 'ed25519'
  gem 'bcrypt_pbkdf'
end 
```

# 参考URL等
- [capistrano/capistrano: Remote multi\-server automation tool](https://github.com/capistrano/capistrano)	
- [net\-ssh/net\-ssh: Pure Ruby implementation of an SSH \(protocol 2\) client](https://github.com/net-ssh/net-ssh)	
- [\[DOC\] net\-ssh 5 and later ed25519 support · Issue \#565 · net\-ssh/net\-ssh](https://github.com/net-ssh/net-ssh/issues/565)
- [module Net::SSH
](http://net-ssh.github.io/net-ssh/classes/Net/SSH.html#method-c-start)
【C言語】バッファリングするAPIとバッファリングしないシステムコールの組み合わせに注意

###【概要】
文字列をファイルに書き込むプログラムでバッファリングするAPIを先に呼び出し、その後にバッファリングしないシステムコールを呼び出した出力結果を確認します。
APIはバッファリングするため、システムコールで出力した文字列が先に出力されます。

###【環境】
```sh
[root@vagrant-centos65 buff]# cat /etc/centos-release 
CentOS release 6.5 (Final)
```


###【コード】
パラメータでファイルを渡して、そのファイルに文字列を書き込む処理です。

####①バッファリング有りの場合
```C:buffer.c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>

int main(int argc, char *argv[])
{
	FILE *f;
	char *apiStr = "Hello, API\n";
	char *systemCallStr = "Hello, system call\n";

	if((f = fopen(argv[1], "w")) == NULL) {
		puts("fopen error");
		exit(1);
	}

	// fputsはバッファリングされる
	fputs(apiStr, f);
	// システムコールであるwriteはバッファリングされないため、即出力される
	if (write(fileno(f), systemCallStr, strlen(systemCallStr)) < 0) exit(1);
	fclose(f);
	exit(0);
}
```
#####実行結果
```text
[root@vagrant-centos65 buff]# gcc -o buffer buffer.c 
[root@vagrant-centos65 buff]# ./buffer buffer.txt
[root@vagrant-centos65 buff]# cat buffer.txt
Hello, system call
Hello, API
```

####②バッファリング無しの場合
```C:no_buffer1.c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>

int main(int argc, char *argv[])
{
	FILE *f;
	char *apiStr = "Hello, API\n";
	char *systemCallStr = "Hello, system call\n";

	if((f = fopen(argv[1], "w")) == NULL) {
		puts("fopen error");
		exit(1);
	}

	// バッファリングしないよう設定
	// あるいは、fputsした後にfflushでもOK
	setbuf(f, NULL);

	// 即出力される
	fputs(apiStr, f);
	// 即出力される
	if (write(fileno(f), systemCallStr, strlen(systemCallStr)) < 0) exit(1);
	fclose(f);
	exit(0);
}
```
#####実行結果
```text
[root@vagrant-centos65 buff]# gcc -o no_buffer1 no_buffer1.c 
[root@vagrant-centos65 buff]# ./no_buffer1 no_buffer1.txt
[root@vagrant-centos65 buff]# cat no_buffer1.txt 
Hello, API
Hello, system call
```

###【まとめ】
ファイルディスクリプタとFILEは自由に行き来できますが、このようにバッファによって入出力の順序がおかしくなる場合があるため、安易に2つを混ぜてはいけないようです。

###【おまけ】
printfはバッファリングされるはずなのに、システムコールよりAPIの方が先に出力される。
[追記] [angel_p_57](https://qiita.com/angel_p_57)さんのコメントより
>端末デバイスを参照する出力ストリームは、 デフォルトでは常に行単位でバッファーリングされている


```C:no_buffer2.c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>

int main(int argc, char *argv[])
{
	char *apiStr = "Hello, API\n";
	char *systemCallStr = "Hello, system call\n";

	printf("%s", apiStr);
	if (write(STDOUT_FILENO, systemCallStr, strlen(systemCallStr)) < 0) exit(1);
	exit(0);
}
```

####実行結果
```text
[root@vagrant-centos65 buff]# gcc -o no_buffer2 no_buffer2.c 
[root@vagrant-centos65 buff]# ./no_buffer2
Hello, API
Hello, system call
```

###【参考書】
[ふつうのLinuxプログラミング 第2版　Linuxの仕組みから学べるgccプログラミングの王道](https://www.amazon.co.jp/%E3%81%B5%E3%81%A4%E3%81%86%E3%81%AELinux%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0-%E7%AC%AC2%E7%89%88-Linux%E3%81%AE%E4%BB%95%E7%B5%84%E3%81%BF%E3%81%8B%E3%82%89%E5%AD%A6%E3%81%B9%E3%82%8Bgcc%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%81%AE%E7%8E%8B%E9%81%93-%E9%9D%92%E6%9C%A8-%E5%B3%B0%E9%83%8E-ebook/dp/B075ST51Y5)
システムの評価指標 応用情報技術者試験 対策日記@11

#システムの評価指標
##1.性能指標
###レスポンスタイム
データを入力し終わってから、データの応答が開始されるまでの時間。
サーバの処理にかかる時間のこと。
###ターンアラウンドタイム
データの入力が始まってから、応答が完全に終わるまでの時間。
レスポンスタイムにデータの入力時間、データの応答時間を足したもの。
###スループット
単位時間当たりにシステムが処理できる処理数。
###ベンチマーク
特定のプログラムを実行し、その実行結果をもとに性能を評価する。
有名なベンチマークにはオンライントランザクションに用いる**TPC-C**や、整数演算を評価する**SPECint**、浮動小数点演算を評価する**SPECfp**などがある。

##2.キャパシティプランニング
システムに求められるサービスレベルから、必要なリソースの処理能力や容量などを見積もり、システム攻勢を計画すること。以下の手順で進める。

①ワークロード情報の収集
**ワークロード**とは、コンピュータ資源の利用状況、負荷状況のこと。

②サイジング
**サイジング**とは、システムに必要な規模や性能を見極めて、構成要素を用意すること。

③評価、チューニング

##3.RASIS
システム信頼性を総合的に評価する5つの基準。
###Reliability(信頼性)
故障や障害の発生しにくさ。**MTBF**や**故障率**で測る。
###Availability(可用性)
稼働している割合の多さ。稼働率で測る。
###Serviceability(保守性)
障害時のメンテナンスのしやすさ。MTTRで測る。
###Integrity(完全性)
障害時や過負荷時のデータの一貫性を確保する能力。
###Security(機密性)
セキュリティ能力。

##4.信頼性指標
###MTBF(Mean Time Between Failure)
故障が復旧してから次の故障までにかかる時間の平均。
###故障率
単位時間内にどの程度の確率で故障するかを表す。
$故障率=\frac{1}{MTBF} $で計算できる。
###MTTR(Mean Time To Repair)
故障したシステムの復旧にかかる時間の平均。
###稼働率
ある時間にシステムが稼働している確率。
$稼働率= \frac{MTBF}{MTBF + MTTR} $　で計算できる。

また、二つのシステムA,Bの稼働率をa,bとすると、
AとBを並列につなぐと稼働率は(1-a)(1-b)、直列につなぐと稼働率はabとなる。

------
[ホームへ](https://qiita.com/k-y/items/dc2c9a3a8425712253e8)
[Laravel] DELETE・PATCH・PUT を定義したときは、@method を使うと便利

HTMLは `PUT` `PATCH` `DELETE` をサポートしていないので、これらを使いたいときは下記のように `_method` フィールドをhiddenで追加する必要がある。

```php
<form action="/foo/bar" method="POST">
    <input type="hidden" name="_method" value="PUT">
    <input type="hidden" name="_token" value="{{ csrf_token() }}">
</form>
```

## `@method` をつかうとさらに便利
もっと楽に `_method` input を作ってくれる `@method` というのもあるので、そちらを使うとよりらくちん。

```php
<form action="/foo/bar" method="POST">
    @method('PUT')
    @csrf
</form>
```

## 参考
https://laravel.com/docs/5.7/routing#form-method-spoofing
【キカガク流】人工知能・機械学習 脱ブラックボックス講座 - 初級編 - で学んだことをまとめてみる

##【キカガク流】人工知能・機械学習 脱ブラックボックス講座 - 初級編 -で学べること
この講座で学べることは以下の４つとなっています。
1.微分
2.単回帰分析
3.python速習
4.単回帰分析の実装

私の場合は特に１の微分について学びたいというモチベーションからこの講座を受講しました。
微分は、機械学習だけでなく深層学習を学ぶ上でも必要不可欠な要素です。
微分に関する専門書は多くありますが、数学から長らく遠ざかっていた身としてはなかなか厳しいものがありました。

本講座の微分の内容は機械学習に必要な部分にのみ焦点を当てつつ専門用語や計算方法もしっかりと解説しているので比較的すんなりと理解することができました。

１で微分をしっかりと理解した後で単回帰分析の実装を行ってみるとこれまで漠然としか理解できていなかった部分も
ちゃんと理解ができるようになりました。

udemyの各講座には３０日間の返金保証があるので仮に自分に合わなかったとしても返金してもらうことができます。
理解できるか不安という方もで安心して受講できると思います。

【キカガク流】人工知能・機械学習 脱ブラックボックス講座 - 初級編 -
URL:https://www.udemy.com/kikagaku_blackbox_1/


##参考になる資料
本講座単体でももちろんきちんと理解を深めることはできますが、以下の3つを追加の資料として利用しました。
1.[メディカルAI専門コース オンライン講義資料](https://japan-medical-ai.github.io/medical-ai-course-materials/)
本講座の講師でもある株式会社キカガクの吉崎さんも作成に作成に加わっており講座の内容を補完するのにベストな資料だと思います。

2.ゼロから作るDeep Learning――Pythonで学ぶディープラーニングの理論と実装
オライリーから出版されている書籍です。
タイトルの通りライブラリを使わずにpythonとnumpyを使ってディープラーニングを実装していく書籍です。
この書籍に中でも微分について触れられています。
講座の中では微分を手計算で解いていきます。本書にはpythonでの実装する方法が解説されており、
実際に実装してグラフとしてプロットしてみると一層理解を深めることができると思います。

3.人工知能プログラミングのための数学がわかる本
機械学習などで使われる数学を学ぶためにはベストな１冊だと思います。
私も機械学習で使う数学を勉強したいと思って一番最初に手にしたのがこの本でした。
卒業以来久しぶりに数学に触れる人や数学に苦手意識のある方には少し難しい内容かもしれません。
 

##微分を理解するためにやってみたこと
【キカガク流】人工知能・機械学習 脱ブラックボックス講座 - 初級編 -と上記でご紹介した資料を使って勉強すれば微分をきちんと理解することができます。

おすすめの勉強方法は、講座や資料の内容がある程度理解できるようになったら実際にpythonで微分を実装してみることです。

例えば、下記の関数とその微分を求める関数をpythonで実装してみます。

```math
y = 0.01{x^2} + 0.1{x}
```

```python
def func1(x):
    return 0.01 * x**2 + 0.1 * x
```

実装できたらmatplotlibでグラフとしてプロットしてみると視覚的に確認できるのでおすすめです。

```python
import numpy as np
import matplotlib.pylab as plt

x = np.arange(0.0, 20.0, 0.1) # 0から20まで、0.1刻みのx配列
y = func1(x)
plt.plot(x, y)
plt.show()

```

![Figure_1.png](https://qiita-image-store.s3.amazonaws.com/0/19516/47a7afe9-4303-00c3-0087-b5db48f76d84.png)


微分のもっとも単純な実装は以下です。

```python
def num_diff(f, x):
    h = 10e-50
    return (f(x+h)-f(x)) / h
```

ただ上記の実装では丸め誤差によりhが０になってしまうのでそれを防ぐために下記のように変更します。

```python
def num_diff(f, x):
    h = 1e-4
    return (f(x+h)-f(x)) / h
```

ただしもう１点問題があります。
x=5としてnum_diffで計算すると

```python
>>> num_diff(func1, 5)
0.20000099999917254
```
となります。
実際の計算結果は0.2であるため誤差が生じていることが確認できます。
これは関数f(x)の差分において誤差が生じているためです。
それを解消するために下記のように変更します。

```python
def num_diff(f, x):
    h = 1e-4
    return (f(x+h) - f(x-h)) / (2*h)　#(x+h)と(x-h)でf(x)の差分を計算する
```

変更後の計算結果は下記のようになります。
完全に一致してはいませんが誤差が限りなく小さくなっていることがわかります。

```python
>>> num_diff(func1, 5)
0.1999999999990898
```

実装でき計算結果が正しいことが確認できたらグラフにプロットしてみると結果が正しいことが視覚的に理解できるのでおすすめです。
![Figure_1.png](https://qiita-image-store.s3.amazonaws.com/0/19516/20ed33bb-ff67-d748-43c2-3d2035ed6d28.png)


##まとめ
数学が苦手な方、久しぶりに数学を学ぶ方にとって【キカガク流】人工知能・機械学習 脱ブラックボックス講座 - 初級編 -は最適な教材だと思います。

微分は公式が多く出てくるので最初は難しく感じるかもしれませんがその意味さえ理解していれば計算自体は比較的簡単です。
機械学習等で微分を用いる際は計算自体はプログラムがやってくれます。
大事なのは「微分は何を求めるために使うのか？」ということをしっかり理解することです。
slim templateのパイプで改行したいとき

計測系のサービスで「スクリプトをそのまま貼り付けてください」みたいな依頼があったときに必要なのでメモ。

なにも考えずパイプ（`|`）でさくっと対応すると、

```slim:sample.slim
| <script language='javascript' src='https://hogehoge.com/path/to/file.js'></script>
| <script language='javascript'><!--
| do_something('*****');
| //--></script>
| <noscript>
| <img src="https://hogehoge.com/path/to/action?hoge=1&fuga=2" width="1" height="1">
| </noscript>
```

変換時、改行がすべてなくなってしまう。

```html:出力結果
<script language='javascript' src='https://hogehoge.com/path/to/file.js'></script><script language='javascript'><!--do_something('*****');//--></script><noscript><img src="https://hogehoge.com/path/to/action?hoge=1&fuga=2" width="1" height="1"></noscript>
```

ので、パイプは最初の行1つだけに挿入して、インデントを整えると、見た目どおりに変換される。

```slim:sample.slim
| <script language='javascript' src='https://hogehoge.com/path/to/file.js'></script>
  <script language='javascript'><!--
  do_something('*****');
  //--></script>
  <noscript>
  <img src="https://hogehoge.com/path/to/action?hoge=1&fuga=2" width="1" height="1">
  </noscript>
```

slimの仕様だけど地味に知らんかったやつ :joy: 

追記
---
こういう書き方もできます :point_down: （こっちのほうがまるっとコピペしやすいので良さそう）

```slim
|
  foo
  bar
```

参考
---
- [How to keep line break with slim · Issue #329 · slim-template/slim](https://github.com/slim-template/slim/issues/329)
- [slim-template/slim: Slim is a template language whose goal is to reduce the syntax to the essential parts without becoming cryptic.](https://github.com/slim-template/slim)
ffmpegで一枚の画像から静止画動画を作る方法

１枚の画像ファイル`input.png`から、２秒の長さの動画を`output.mp4`に出力します。

```
ffmpeg -r 60 -loop 1 -t 2.0 -i input.png -vcodec libx264 -pix_fmt yuv420p  -r 60 output.mp4
```
logrus 使い方メモ

ターミナルではなくファイルへ出力
あと便利な使い方として、実行する度にファイルを作り直す処理

```go:main.go
package main

import (
	"fmt"
	"github.com/sirupsen/logrus"
	"os"
)

// どこからでも使えるようにグローバルで宣言
var log = logrus.New()

func main() {
	logSetting()
	log.Println("ok!")
}

func logSetting(){
	filename := "debug.log"

	//debug用、ログファイルを実行の度に削除
	if _, err := os.Stat(filename); err == nil {
		os.Remove(filename)
	}

	errorLogFile, err := os.OpenFile(filename, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
	if err != nil {
		panic(fmt.Sprintf("[Error]: %s", err))
	}
	log.Out = errorLogFile
	//log.Formatter = &logrus.JSONFormatter{}
}
```