OmniAICreator/Qiita-1.07M huggingface dataset:
製薬企業研究者がRで使われる演算子についてまとめてみた

# はじめに

ここでは、R初心者向けに「演算子」について解説します。


# 算術演算子

四則演算を行うための演算子です。

```R:operator_1.R
int.1 <- 1 + 1 # 足し算
print(int.1)
int.2 <- 2 - 1 # 引き算
print(int.2)
int.3 <- 2 * 3 # 掛け算
print(int.3)
int.4 <- 6 / 3 # 割り算
print(int.4)
int.5 <- 2 ^ 3 # 累乗
print(int.5)
int.6 <- 7 %/% 2 # 割り算の商
print(int.6)
int.7 <- 7 %% 2 # 割り算の余り
print(int.7)
```


# 代入演算子

変数の定義、更新などの時に使う演算子です。

```R:operator_3.R
var.int <- 3
print(var.int)
var.int <- var.int + 2 # 元々のvar.intの値に2を足して、numの値を更新する。
print(var.int)
var.int <- var.int - 2 # 元々のvar.intの値から2を引いて、numの値を更新する。
print(var.int)
var.int <- var.int * 2 # 元々のvar.intの値に2を掛けて、numの値を更新する。
print(var.int)
var.int <- var.int / 2 # 元々のvar.intの値を2で割って、numの値を更新する。
print(var.int)
```


# 比較演算子

左辺と右辺を比較するときに使う演算子です。

```R:operator_4.R
var.bool <- 2 == 2 # 左辺と右辺が等しいどうか
print(var.bool)
var.bool <- 2 != 2 # 左辺と右辺が等しくないかどうか
print(var.bool)
var.bool <- 2 < 3 # 左辺が右辺より小さい（左辺が右辺未満）かどうか
print(var.bool)
var.bool <- 2 > 3 # 左辺が右辺より大きいかどうか
print(var.bool)
var.bool <- 2 <= 3 # 左辺が右辺と等しいまたは小さい（左辺が右辺以下）かどうか
print(var.bool)
var.bool <- 2 >= 3 # 左辺が右辺と等しいまたは大きい（左辺が右辺以上）かどうか
print(var.bool)
```


# 論理演算子

真偽値（ブール値）に対して用いる演算子です。

```R:operator_5.R
var.bool <- 2 == 2 & 3 == 3 # &で結ばれた条件が全てTRUEかどうか
print(var.bool)
var.bool <- 2 !=2 | 2 != 3 # |で結ばれた条件のいずれかがTRUEかどうか
print(var.bool)
var.bool <- !(2 == 2 & 3 == 3) # カッコ内がFALSEであればTRUE、カッコ内がTRUEであればFALSE
print(var.bool)
```

# まとめ

ここでは、Rにおける演算子について説明しました。
何気なく使うものなので、あまり意識しなくてもいいことですが、頭に入れておくと良いでしょう。

# 参考資料・リンク

[プログラミング言語Rとは？統計分析に強い？](https://pharma-engineer.com/basic-programming/r-summary/)
Terraform Tips

# スクリプト
## バージョンを固定する
- 環境差異によるトラブルを防ぐために必ず記載する

```    
terraform {
  required_version = "= 0.12.12"
}
```

## プロバイダバージョンを固定する
- AWSを使う場合は下記の通り
- プロバイダバイナリは進化が早く環境差異が生じやすい

```
provider "aws" {
  version = "= 2.35.0"
}
```

# コマンドライン
## コードフォーマット
- `-recursive`オプションで再帰的にフォーマットしてくれる

```
$ terraform fmt -recursive
```

## バリデーション
- 構文エラーをチェックしてくれる
- これは再帰的には実行されない
- `$ terraform init`を実行した後にやる

```
$ terraform validate
```

## オートコンプリート
- terraformコマンドを補完してくれるようになる

```
$ terraform -install-autocomplete
```

## プラグインキャッシュ
- `$ terraform init`時のプロバイダバイナリファイルをキャッシュできる
    - 設定しないと毎回ダウンロードされる

- ホームディレクトリに`.terraformrc`ファイルを作成し、以下を記載する

```:.terraformrc
plugin_cache_dir = "$HOME"/.terraform.d/置きたいディレクトリ
```
- 対象のディレクトリを作成すればよい

## TFLint
- `$ terraform plan`時に発生するエラーを検出できる
- brewでインストール

```
$ brew install tflint
```

- tfファイルがあるディレクトリで`$tfint`を実行すればよい
- 不正なインスタンスタイプなど、リソースに関する整合性を確認してくれる
- オプションをつけると詳細情報が表示される

```
$ tflint --deep --aws-region=ap-northeast-1
```

## tfenv
- ディレクトリ毎に使用するTerraformのバージョンを変更できる
    - Pythonのpyenvに相当
- プロジェクト毎に異なるバージョンを使用していることもあるので、ローカルの環境とバージョンを合わせましょう
    - バージョンの相違でtfstateが参照できなくなることがある
- 詳細は[こちら](https://qiita.com/kamatama_41/items/ba59a070d8389aab7694)

# tfstateファイル管理
- tfstateファイルには、対象のリソースの状態が記載されている
- デフォルトではローカルに保存されるが、チーム開発時に複数の環境から実行される場合は整合性が保てなくなる
- また、ファイルが復元できなくなった場合にTerraformでの管理ができなくなってしまう

## S3で管理
- スクリプトに以下のようような記載をすることでtfstateファイルがS3で管理される
- バケットとキーは自由に設定

```
terraform {
  backend "s3"{
    bucket = "store-waf-tfstate"
    key = "production/terraform.tfstate"
    region = "ap-northeast-1"
  }
}
```

- これにより、実行のたびにS3上のtfstateファイルを確認→更新をしてくれる
- バケットにバージョニング、暗号化、パブリックアクセス禁止の設定をしておく

## Gitを使わない理由
- Pullを忘れると整合性が合わなくなる
- tfstateは平文で保存されるため、機密情報が入っている場合は危険
    - DBを作成するときは、ユーザー名やパスワードが記載される
- S3にはバージョニング、暗号化、パブリックアクセス禁止の設定があり、安く可用性も高いためAWSではS3の使用が推奨されている

# 参考
- [実践Terraform　AWSにおけるシステム設計とベストプラクティス](https://nextpublishing.jp/book/10983.html)
- [How to manage Terraform state](https://blog.gruntwork.io/how-to-manage-terraform-state-28f5697e68fa#aeb7)
【Fire base+swift】学習記録（１）Fire base+swiftの環境設定でハマった３つのこと

##Fire base+swiftの環境設定でハマった３つのこと
いろいろな人が同時に交流ができるアプリを作りたく、Firebaseを勉強し始めたので記録します。
最初は[【Swift】Firebase Realtime Database を用いてチャットアプリを爆速コーディングしてみた。](https://qiita.com/tetsukick/items/638501babc692ec55858)
を参考にサンプルアプリを作ろうと考えましたが、環境構築に見事にハマったのでそれを書いておきます。

##①.xcworkspaceを利用する
pod.installしてから`.xcodeproj`ではなく、`.xcworkspace`を使ってランしないとエラーが出ます。
podfileがちゃんと反映されていないものだからということなのでしょう。

##②GoogleService-Info.plistの取得
Firebaseのページから[Download GoogleService-Info.plist] をクリックして、Firebase iOS 構成ファイル（GoogleService-Info.plist）を取得するのですが、このファイル名称がちゃんと`GoogleService-Info.plist`でないとエラーが出て、アプリをランできません。
僕は何度もこのファイルをDLしたため、名前がGoogleService-Info.plist(1)などとなり、そのままプロジェクトに入れていたので、ファイルが正確に読み込まれずエラーしまくました。

##③DBのルール変更
DBのルール変更をする際に、
<img width="1532" alt="スクリーンショット 2019-11-17 11.39.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321729/c5137473-8b9f-100c-3059-00f4c1997d27.png">
赤い枠線の部分がRealtime Databaseになっていることを確認しましょう。
出ないとうまく変更できません。

以上、Fire base+swiftの環境設定でハマった３つのこと
普通だったら10分でできるのですが、ハマりにハマり4時間ほど戦っていました。
備忘録まで。
【Twitterの紳士たちへ】.jpg-largeを.jpgに一括変換するscriptを書きました

# What is?
前略

あなたがTwitterでヱロ画像を収集していることを俺は知っている...。
そして`.jpg-large`を毎回ハンドで`.jpg`に直して保存していることも知っている...(してなかったらすみません)。  
  
そんな! あなたに!!朗報です!!!  

このスクリプトで崇高なるヱロ画像のファイル名を一括変換しましょう!!!!!  

# ダウンロードはこちらから
https://github.com/ykaito39/useful-script-for-photo/tree/master/rename_jpg-XXX_to_jpg  
  
# 使い方
```bash
$python rename_jpg-XXX_to_jpg.py
```
※Windows環境でのみ確認  

基本的に`.jpg-large`があるディレクトリにコピーしてダブルクリックで実行すれば実行可能です。

# 中身解説
めちゃくちゃ簡単なスクリプトで、自分が初めて作ったまともに使えるスクリプトです。
2年くらい前に作ったものですが、バリバリ現役で使えてます。

#### おまじない
```python
# coding: UTF-8
import sys
import os
```

#### 対象のパス指定
```python
if len(sys.argv) == 2:
    DIR == sys.argv[1]
else:
    DIR = './'
```
本当はOS毎に分けて書いてたんですけど、結局ダウンロード直下にコピーして実行するほうが一番直感的でわかりやすいなーと思って修正しました。

#### 本体
```python
#ディレクトリ内のファイル一覧を取得
#DIRが不正ならここで終了する
try:
    file_list = os.listdir(DIR)
except os.error:
    exit(-1)

for file in file_list:
    print(file)
    if file[-6:] == '_large':
        #変更対象のフルパスを取得
        full_path = os.path.join(DIR, file)

        #ファイル名から末尾の_largeを消す
        replaced_path = file[:-6] + ''
        replaced_full_path = os.path.join(DIR, replaced_path)

        #ファイル名の書き換え
        os.rename(full_path, replaced_full_path)
        print('[REPLACE]  ' + file + ' >> ' + replaced_path)
```

ディレクトリの内容一覧を取得してlistのスライスでファイル名末尾に`-large`がついていたら消しているだけの処理内容です。
例外処理も適当で、大した内容じゃなくてすみません。
  
# 開発環境
Python3.6
Windows10 pro x64 1903

# 連絡先
[@ykaito39](https://www.twitter.com/ykaito39)

# Thanks
見てくれてありがとう...
iOSでタップイベントが反応しない

そんなことよくありますよね。
「swift タップ 反応しない」とかでググれば以下のような情報がわんさか出てきます。

・コードでつけた部品ならその部品のisUserInteractionEnabledをtrueにする
・storyboardを使っているならUser Interaction Enabledにチェックを入れる
・同じ部品を再配置して古いReferencinc Outletを使っていないか確認する
・それでもダメならUITapGestureRecognizerを使ってみる

などなど。

ただ、私の場合どれも正しく設定されていて、それでもなお動かず色々と試しているうちに気づきました。

**「上のボタンは反応するけど、下のボタンが反応しないことがある」**

実はUIScrollViewを使っていたため、ボタンを配置していた親Viewの高さが一定ではなかったんですね。
なので、親Viewからはみ出したボタンは反応しなかったんです。
もっと言うと、同じボタンでも親Viewからはみ出した部分はタップ出来ません。

これがわかっていたら「swift タップ 領域外」とか「swift タップ はみ出る」とか調べると思うのですが、それって原因がわかった後なので、調べている時は頭が回らずものすごい悩みました・・・。

同じようなことで悩んでいて「swift tap 反応しない」とか「swift タップ 動かない」とかで調べてこの記事が役に立てば幸いです。
vimrcを複数PCで共有・同期する方法

## やりたいこと

デスクトップとノートPCでvim設定ファイルを一緒にしたい
gitをpush、pullするのが面倒なので、1つを変更したら、自動で他のPCに反映させたい

## 前提

わからない単語があれば、ググってください
mac, linuxはpathを適宜読み替えてください

## 方法

1. Dropboxや、Google DriveをすべてのPCにインストールする（今回は、Dropboxを使用)
2. Dropboxの適切な場所に、適切な名前(vimの設定ファイルだとわかるもの)のファイルを作成し、そこに設定を書き込む(今回は、Dropbox直下に、`vim_settings`という名前のファイルを作成)
3. コマンドプロンプトを管理者モードで開き、User直下(C:\Users\xxx\)に移動し、`mklink .vimrc Dropbox\vim_settings`とコマンドプロンプトで実行する(Dropbox\vim_settingsは、絶対パスでも良いです。自分が決めたファイルのパスに置き換えてください)

以上
Q.E.D.
Rubyで学んだこと

#Rubyはどんな言語？

* サーバーサイドで処理する言語である。
    * ブラウザからのリクエストを受け取って、サーバー上で処理をこなす言語。
    * ブラウザ上の操作によって処理するフロントエンド言語(JavaScript)とは役割が異なる。
    * webアプリケーションを構築するなら、フレームワークは「Ruby on Rails」ほぼ一択になる。

* インタプリタ言語である。
    * Javaなどのコンパイル型言語では、事前に機械語にすべて翻訳されてからサーバー上で実行される。
    * インタプリタ言語では、コードを上から順に一行ごとに機械語に翻訳されて実行される。

* インタプリタ言語のメリット/デメリット
    * メリット
        * コンパイル型言語では、実行前にすべて翻訳しなければならないので動作確認に時間がかかる。
        * インタプリタ言語なら、コードを書いてからすぐ実行できるので、動作確認がしやすい。
        * 小規模、中規模（千人単位のユーザーアクセスまで）のシステム開発に向いている。
    * デメリット
        * コードを一行ずつ機械語に翻訳して実行するため、 コンパイル型言語に比べると実行速度は遅め。
        * 大規模(万単位のユーザーアクセスするような)システム開発には不向き。
        * if文のネストが深かったり、冗長なコードも実行速度を落としてしまう要因になる。
        * そのため、 できるだけ一行で処理できるようにリファクタリング(最適化)を意識しながらコードを書く必要がある。

#Rubyの特徴
* コードが短くかける。
    * 文字列と変数の連結は式展開が使える。文字列はダブルクオーテーションでくくる。

```
コード
name = "yamada"
puts "こんにちは、 #{name}さん。"

実行結果
 % こんにちは、 yamadaさん。
```

まだQiitaへの投稿になれていないので、今回は以上です。
Laravelでmake:bladeでbladeを作成するコマンドの自作

Laravelではコントローラーなどはmakeコマンドでテンプレートから作成することができますが、
bladeのmakeコマンドは用意されていないため自作してみました。
「php artisan make:blade hoge」でhoge.blade.phpを作成できるようにします。
確認したLaravelのバージョンは6.5.1です。

# コマンドの作成
まずmake:blade用のコマンドを作成します。

```
php artisan make:command MakeBladeCommand
```

app/Console/Commands下にMakeBladeCommand.phpが作成されます。
このファイルを以下のように書き換えました。

```app/Console/Commands/MakeBladeCommand.php
<?php

namespace App\Console\Commands;

use File;
use Illuminate\Console\Command;

class MakeBladeCommand extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'make:blade {name}';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Create a new blade file';

    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    {
        // スタブファイルの内容を読み込む
        $stub = File::get(app_path() . '/Console/Commands/stubs/blade.stub');

        // 〜スタブファイルに対して置換などの加工処理などを行う〜

        // bladeファイルのパスを作成
        $blade = resource_path() . '/views/' . $this->argument('name') . '.blade.php';

        // bladeファイルを作成
        File::put($blade, $stub);
    }
}
```

スタブファイルを読み込んでコマンドの引数で渡した名前でbladeファイルを作るという処理です。
makeでクラスを作る場合はGeneratorCommandを継承するやり方がよく記載されていますが、今回はそのままCommandを使用しました。
なお、上記のソースではviews直下にしかファイルが作成できないため、例えばディレクトリを分けてbladeを作成したい場合にはFile::makeDirectoryでディレクトリを作成する処理を入れて下さい。

以下のコマンドでmakeの中にmake:bladeがあればここまでは順調です。

```
php artisan list
```

# スタブファイルの作成
次にbladeファイルのテンプレートを作ります。
上記のCommands下にstubsディレクトリを作成し、テンプレートファイルを用意します。

``` app/Console/Commands/stubs/blade.stub
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Blade Template</title>
</head>
<body>
Hello World
</body>
</html>
```

# 動作確認
実際にbladeコマンドを使ってbladeファイルを作成してみます。

```
php artisan make:blade hello 
```

resouces/views下にhello.blade.phpが作成されます。
次にrouteに上記bladeを追加します。

```routes/web.php
+ Route::view('/hello', 'hello');
```

ブラウザで「URL/hello」を開くと、「Hello World」と表示されます。
height プロパティが有効になる条件

# height プロパティが有効になる条件

基本的にheightプロパティが有効になるのは、親要素のスタイルにheightが指定されているときである。

```html
<div class="parent">
  <div class="child">aaa</div>
  <div class="child">bbb</div>
  <div class="child">ccc</div>
</div>
```
```css
.parent {
  height: 600px;
}
.child {
  height: 50%;
}
```

##例外
要素が絶対位置指定されている場合（position: absolute;かposition: fixed;が指定されている場合）は親要素にheightが指定されていなくてもheightプロパティを指定することができる。

```css
.parent {
  position: relative;
}
.child {
  position: absolute;
  height: 200px;
}
```
BigQueryの永続的なユーザー定義関数でコード名称変換を実装する

# 背景
2019/07/01、BigQueryに永続的なユーザー定義関数（persistent user-defined functions）がベータ版として機能追加[^1]されました。
※追記：2019/11/22、GA[^2]になりました。

永続的なユーザー定義関数[^3]は、FUNCTIONをリソースとしてデータセット内に保存でき、クエリからFUNCTIONを呼び出せるのが特徴です。
それまでのUDFは一時的なものだったため、データセット内に保存できず、毎回クエリの先頭にFUNCTIONを記述する必要がありました。

# やりたいこと
他のシステムのデータをBigQueryへ取り込んで分析する際、コードに対応する名称を付与したい場面があります。
これを、コードと名称を対応付けたテーブルのJOINではなく、永続的なユーザー定義関数で実装してみます。
更に、定期的にコードと名称の対応付けが変わることを想定し、その判断に日付項目を利用してみます。

# 実装
まずは、永続的なユーザー定義関数をデータセット`f`に作成します。

```SQL:get_sales_statusファンクション
CREATE OR REPLACE FUNCTION
  f.get_sales_status(code STRING, target_date DATE)
  RETURNS STRING AS (
    CASE
    WHEN target_date <= '2019-03-31' THEN
      CASE code
        WHEN '10' THEN '新規受付'
        WHEN '20' THEN '入金済'
        WHEN '30' THEN '対応中'
        WHEN '40' THEN '注文取消'
        WHEN '50' THEN '発送済'
        WHEN '60' THEN '購入処理中'
        WHEN '70' THEN '決済処理中'
        WHEN '80' THEN '返品'
        WHEN '99' THEN 'テスト用'
        ELSE NULL
        END
    WHEN target_date <= '2020-03-31' THEN
      CASE code
        WHEN '10' THEN '新規受付'
        WHEN '11' THEN '予約受付'
        WHEN '20' THEN '入金済'
        WHEN '30' THEN '対応中'
        WHEN '40' THEN '注文取消'
        WHEN '50' THEN '発送済'
        WHEN '60' THEN '購入処理中'
        WHEN '70' THEN '決済処理中'
        WHEN '80' THEN '返品'
        ELSE NULL
        END
    ELSE
      CASE code
        WHEN '10' THEN '受付'
        WHEN '20' THEN '入金済'
        WHEN '30' THEN '対応中'
        WHEN '40' THEN '注文取消'
        WHEN '50' THEN '発送済'
        WHEN '60' THEN '購入処理中'
        WHEN '70' THEN '決済処理中'
        WHEN '80' THEN '返品'
        ELSE NULL
        END
    END
  )
```

このUDFをクエリから利用します。

```SQL:UDFを利用するクエリ
WITH
  data AS (
  SELECT
    '10' AS sales_status,
    DATE '2019-03-31' AS process_date
  UNION ALL SELECT '11', '2019-03-31'
  UNION ALL SELECT '10', '2019-04-01'
  UNION ALL SELECT '11', '2019-04-01'
  UNION ALL SELECT '10', '2021-04-01'
  UNION ALL SELECT '11', '2021-04-01'
  )
SELECT
  process_date,
  sales_status,
  f.get_sales_status(sales_status, process_date) AS sales_status_name
FROM
  data
```

クエリの結果は以下のとおりです。日付項目の値により、名称の切り替えが実現できています。

| 行 | process_date | sales_status | sales_status_name | 
|--:|:--:|:--|:--|
| 1 |  2019-03-31 |10 | 新規受付 |
| 2 | 2019-03-31 | 11 | null |
| 3 |   2019-04-01 | 10 | 新規受付 |
| 4 |   2019-04-01 | 11 | 予約受付 |
| 5 |   2021-04-01 | 10 | 受付 |
| 6 |   2021-04-01 | 11 | null |

# おわりに
永続的なユーザー定義関数が追加されたことにより、各クエリで重複していたロジックが切り出せる点が便利です。
関数をどう管理するかという課題がありますが、ファイル化してバージョン管理したり、スプレッドシートから関数を生成する仕組みを用意することで、管理しやすくなると思います。

[^1]: https://cloud.google.com/bigquery/docs/release-notes?hl=en#July_01_2019
[^2]: https://cloud.google.com/bigquery/docs/release-notes?hl=en#November_22_2019
[^3]: https://cloud.google.com/bigquery/docs/reference/standard-sql/data-definition-language?hl=ja#create_function_statement
LaTeX の ref で図 ?? のようになってしまうエラー

#執筆動機
日本語で解説しているサイトがすぐに見つからなかった．

#問題
LaTeX を使用していて，正しいスペルで label と ref を入力しているのに，図?? となってしまう．

#原因
main.log 等のログを閲覧してください．
そして，うまくいかなかった label や ref の名前でサーチしてください．
下記のようなログはありませんか？
>Package caption Warning: \label without proper reference on input line 6.
See the caption package documentation for explanation.
LaTeX Warning: Reference `fig:soft_arch' on page 9 undefined on input line 21.

これは label, ref の使い方が悪いことが原因です．

#解決策
キャプションは図番号を更新するため，キャプションの前にラベルを挿入してはいけません，
・キャプションの中
・キャプションの後
いずれかにラベルを挿入すべきです．

ダメな例 :
>\label{hoge}
\caption{hoge}

良い例 :
>\caption{hoge}
\label{hoge}

#参考
https://tex.stackexchange.com/questions/431676/problem-with-label-and-references-and-subfig-subcaption/431695
Vue-CLI4系でPostCSSプラグインを導入する方法

# はじめに
Vue-CLI4系はpostcssがデフォルトで入っており、package.jsonのPostCSSのプラグインへ今回使用するライブラリ(postcss-simple-vars,postcss-easy-import)を追加するだけで使えるようになると思っていたのですが、うまくいかずハマってしまいました。。。

開発メモとしてVue-CLI4系でPostCSSプラグインを導入する方法まとめましたので、同じようにつまってしまった方はご参考にしていただけると嬉しいです。

# 1. Vueファイルに直接PostCSSを書く場合
Vueファイルに直接PostCSSを書く場合は、拡張したいプラグインのライブラリ(今回はpostcss-simple-vars、postcss-easy-import)をインストールし、package.jsonのPostCSSのプラグインへ対象ライブラリを追加するだけでOKです。

```bash:コンソール
$ npm install --save-dev postcss-easy-import postcss-simple-vars
```

```bash:package.json
  "postcss": {
    "plugins": {
      // プロジェクト作成時にデフォルトで入ってるプラグイン
      "autoprefixer": {},
      // 今回追加したいプラグイン
      "postcss-easy-import": {},
      "postcss-simple-vars": {}
    }
```

```bash:sample.vue
<style lang="postcss" scoped>
$white_murky: #fafafa;

.header {
  background-color: $white_murky;
}
</style>
```

# 2. Vueファイルに外部PostCSSファイルを読み込む場合
Vueファイルにimportを使用して、外部PostCSSファイルを読み込む場合は、上記のやり方ではうまくいきませんでした。

Vueファイルに外部PostCSSファイルを読み込む場合とはどのような場合かといいますと、以下のようなケースです。

```bash:sample.vue
<style lang="postcss" scoped>
// importしたいcssファイル
@import './colors.css'


.header {
  background-color: $white_murky;
}
</style>
```

```bash:colors.css
<style lang="postcss" scoped>
$white_murky: #fafafa;
</style>
```

上記1のような実装方法だと、シンタックスエラーとなり、うまくいきませんでした。

公式サイトをみると、`postcss.config.js`使えるようなので、上記1の`package.json`をいじって実装するのをあきらめ、`postcss.config.js`へPostCSSのプラグインを追加することにしました。

https://vue-loader-v14.vuejs.org/ja/features/postcss.html

```bash:postcss.config.js
const postcssEasyImport = require('postcss-easy-import')
const postcssSimpleVars = require('postcss-simple-vars')

// 使用プラグイン
const initPlugin = [
  postcssEasyImport({}),
  postcssSimpleVars({})
]

// 実行
module.exports = {
  plugins: initPlugin
}
```

こうすることで、無事外部ファイルのcss(colors.css)を読み込むことができました♪

上記1の`package.json`をいじるやり方でも問題なく外部PostCSSファイルを読み込むようにできるのかもしれないのですが、PostCSSファイルのプラグインのオプションとかを使用する場合は実装が特殊になりそうなので、ボクは`postcss.config.js`をいじるやり方のほうが好きです。

ちなみにPostCSSファイルのプラグインのオプション利用する場合は、`postcss.config.js`の以下の部分へオブジェクト型でコーディングします。

```bash:postcss.config.js
  postcssEasyImport({/* ここにオプションコーディング */}),
  postcssSimpleVars({/* ここにオプションコーディング */})
```

とはいえ、`package.json`をいじるやり方でも問題なく外部PostCSSファイルを読み込めるようにする方法やPostCSSファイルのプラグインオプションを`package.json`へ書く方法について、個人的には気になっててモヤモヤしてるので、もしご存知の方いらっしゃいましたらコメントください><

# さいごに
2020年から個人ブログはじめました！

フリーランスエンジニアになって得た知識と経験をもとに、フリーランスエンジニアに関する情報をはじめ、IT技術情報や業界情報、エンジニアライフハック等のコンテンツを配信していく予定です。

まだまだ記事数は少ないのですが、週単位で更新してますので、もしご興味ございましたら、みていただけると嬉しいです。

https://yacchi-engineer.com/
PDFファイル解析のためのリンク集

ググると、PDFの情報ではなくpdfファイルそのものがひっかかりがちなので、リンク集を作ってみる。

# 対象読者

下記をやりたい方
- PDFファイルを生成したい
- PDFファイルから情報を取り出したい

# 公式

- https://www.adobe.com/devnet/pdf/pdf_reference.html
 - 公式の仕様解説：[Portable Document Format – PDF 1.7](https://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&uact=8&ved=2ahUKEwicxcnatO3lAhX3xosBHXQxBWAQFjAAegQIBBAC&url=https%3A%2F%2Fwww.adobe.com%2Fcontent%2Fdam%2Facom%2Fen%2Fdevnet%2Fpdf%2Fpdfs%2FPDF32000_2008.pdf&usg=AOvVaw1-RSI9319qZLGt7YE-l-gc)

# 解説サイト

- Hello worldはここがおすすめ：[詳細PDF入門 ー 実装して学ぼう！PDFファイルの構造とその書き方読み方](https://itchyny.hatenablog.com/entry/2015/09/16/100000)
- [トラスト ソフトウェア システム - PDF 構文　ファイル 解析手順](http://www.pdf-tools.trustss.co.jp/Syntax/fileStruct.html)
- [手書きPDF入門](http://www.kobu.com/docs/pdf/pdfxhand.htm)
- [PDFタグの付いた記事 - Qiita](https://qiita.com/tags/pdf)

# ライブラリ

※使えてないので有用性は把握できていません。
なお、ライセンス条項はよく読んだほうがよいと思われます。

- 公式：[Acrobat SDK](https://helpx.adobe.com/jp/acrobat/kb/2558.html)
 - [解説サイト(個人サイト)](http://pdf-file.nnn2.com/)
 - [Adobe Acrobatもってないとダメらしい(Readerでは使えないらしい)](https://stackoverflow.com/questions/48019761/get-app-instance-using-process-handle-of-acrobat-dc-in-c-sharp)
- [一覧(Wikipedia)](https://ja.wikipedia.org/wiki/PDFソフトウェアの一覧)
- iText ・・・オープンソースだったものが商用化されている（？）
- https://github.com/brendandahl/pdf.js.utils/tree/master/browser
- [pdf.js](https://mozilla.github.io/pdf.js/getting_started/#download)
for_eachを使用したAWS WAFの設定

# 動的なブロックの作成
- Terraform 0.12からfor_eachを使用して動的にブロックを定義できるようになり、ブロックの数を変更する場合の修正が容易になった
- ここではAWSのWAFに設定するIPアドレスを例に紹介する

# バージョン
- Terraform 0.12.12
- AWSプロバイダ 2.35.0

# AWSのWAF
- WAFを作成するには以下3つのリソースが必要になる
    - IP addresses
        - IPアドレスの集合
    - Rules
        - 上記のIP addressesと組み合わせ、「そのIPアドレスにマッチした場合」、「マッチしない場合」などのルールを決める
    - Web ACLs
        - 上記のRulesと組み合わせ、そのルールに合致した場合の許可・拒否の設定、また合致しない場合の許可・拒否の設定ができる

# IP addressesの記載(for_eachを使用しない場合)
- IPアドレスの設定方法は下記の通り

```tf
resource "aws_waf_ipset" "ipset" {
  name = "tfIPSet"

  ip_set_descriptor {
    type  = "IPV4"
    value = "192.0.7.0/24"
  }

  ip_set_descriptor {
    type  = "IPV4"
    value = "10.16.16.0/16"
  }
}
```

- このように、IPアドレスの数だけip_set_descriptorのブロックを記載する必要があり、IPアドレスの数が変わったときにこの部分も修正する必要がある

# IP addressesの記載(for_eachを使用した場合)
- IPアドレスの設定方法は下記の通り

```tf
variable "ipset" {
  type = list(string)
  default = ["192.0.7.0/24", "10.16.16.0/16"]
}

resource "aws_waf_ipset" "ipset" {
  name = "tfIPSet"

  dynamic "ip_set_descriptors" {
    for_each = var.ipset

    content {
      type  = "IPV4"
      value = ip_set_descriptors.value
    }
  }
}
```

- このように、複数のIPアドレスを変数にリストとして定義し、動的なブロックとして定義した"ip_set_descriptors"の中で`for_each`にその変数を記載する。
- ループの中で繰り返し設定する値は、contentブロックの中で指定する。ここでip_set_descriptorsに設定する必要があるtypeとvalueの記載をしている。リストの要素の受け取りには`Dynamicブロック名.value`を記載する。`type="IPV4"`は各IPアドレスで共通なので変数化していない。
- `Dynamicブロック名.key`でリストの要素番号(0スタート)を取得できる。
- 変数にはリストではなくマップを指定することも可能。
- 変数の記載をvariables.tfにまとめておけば、登録するIPアドレスの数が変わった場合でもそのファイルだけを更新すればよい。

# 参考
- [AWS: aws_wafregional_ipset - Terraform by HashiCorp](https://www.terraform.io/docs/providers/aws/d/wafregional_ipset.html)
- [Terraform 0.11→0.12で追加された新機能 ｜ Developers.IO](https://dev.classmethod.jp/tool/terraform-0-12-new-features/)
学習メモ　JSONの基本とjson_encode / json_decode

#JSON
JSONとはデータ形式の一つ。
JavaScript Object Notationの略。

データを扱う際、誰が書いても同じであるように、また機械が判別できるように書き方のルールが決まっている。HTMLやCSVなども１つのデータ形式であり、JSONもその一つに含まれる。

###JSON形式

```
{
  "user": "Tom",
  "age" : 18,
  "gender": "male"
}
```

##json_encodeとjson_decode
今、PHPについて学習中だが、PHPではデータをJSON形式に変換したり、JSON形式にデコード（変換されたものから復元）できる。

###エンコード：
ある形式のデータを一定の規則に基づいて別の形式のデータ
に変換すること。

###デコード
変換されたデータを逆に、復元すること

例：

```
//配列
menu_array = ['coffee' => 'menu1'
              'tea' => 'menu2'
              'juice' => 'menu3'
             ]
```
###json_encodeでエンコードする

```
//json形式に変換
$json = json_encode($menu_array);
```

結果

```
{"coffee": "menu1", "tea": "menu2", "juice": "menu3"}
```

###json_decodeでデコードする

```
$menu = json_decode($json, true);
```
結果

```
Array ( [coffee] => menu1
        [tea] => menu2
        [juice] => menu3
      )
```
ゼロ幅スペースを含むGroovyコードによるMissingMethodException

## 現象
```Hello.groovy
println​("Hello World!")
```
こういう風に見えるプログラムを実行すると

```
groovy.lang.MissingMethodException: No signature of method: Hello.println​() is applicable for argument types: (java.lang.String) values: [Hello World!]
Possible solutions: println(), println(), println(java.lang.Object), println(java.lang.Object), println(java.io.PrintWriter), print(java.lang.Object)
```
などと言われてしまいました。
## 原因
どうもどっかのドキュメントからメソッド名をコピペした結果ゼロ幅スペースが入ったみたいで、xxdでバイナリ表示させると

```
00000000: 7072 696e 746c 6ee2 808b 2822 4865 6c6c  println...("Hell
00000010: 6f20 576f 726c 6421 2229 0a              o World!").
```
printlnの直後にe2 80 8bがあります。
ソースにバグがあるのは間違いないにしても、これでMissingMethodExceptionというのは分かりにくいですね。
## 余談
ちなみに上のソースをコピペすると、ちゃんとゼロ幅スペースが入っているので実行するとMissingMethodExceptionで失敗します。
display: table; の使い方

# 使い方
横に並べたい要素に`display: table-cell;`を指定し、その要素を囲む親要素に`display: table;`を指定する。
`display: table;`はHTMLのtable要素を指定したテーブルレイアウトをやっていることは同じ。それをCSSだけで実現できる。
高さを揃えた横並びのレイアウトや、縦方向への中央揃えが簡単にできるようになる。

##例

```html
<div class="parent">
  <div class="child">aaa</div>
  <div class="child">bbb</div>
  <div class="child">ccc</div>
</div>
```
```css
.parent {
  display: table;
  width: 100%;
  border: 2px solid red;
  margin-top: 10px;
}
.child {
  display: table-cell;
  border: 1px solid blue;
}
```

<img width="1440" alt="スクリーンショット 2019-11-17 9.53.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496792/179b502d-e503-cf54-0475-e1e147ea958f.png">

`display: table;` を指定したした要素はそのままだとこ要素分しか広がらないので、画面横幅いっぱいに広げるために`width: 100%;`を指定している。

* `width: 100%;` を指定しなかった場合 <br>
<img width="109" alt="スクリーンショット 2019-11-17 9.56.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496792/c64a7798-9267-1728-f4cf-37b1bd7ca9f4.png">


# `display: table-cell;` で指定した子要素どうしに間隔をあけたい場合

子要素にmarginを指定するのでなく、親要素に`border-collapse: separate;`,`border-spacing:`プロパティを指定する。

## 例
```css
.parent {
  display: table;
  width: 100%;
  border: 2px solid red;
  margin-top: 10px;
  border-collapse: separate;
  border-spacing: 10px 5px;
}
```

<img width="1440" alt="スクリーンショット 2019-11-17 10.06.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496792/4f7f8b1d-7c07-4c22-ee2a-44773fd43ebc.png">


# 複数行にしたい場合

```html
<div class="skill-wrapper">
          <div class="table-row">
            <div class="skill-box">
              <img src="" alt="">
              <h3 class="skill-title">HTML</h3>
              <p class="skill-text">テキストテキストテキストテキストテキストテキスト</p>
            </div>
            <div class="skill-box">
              <img src="" alt="">
              <h3 class="skill-title">CSS</h3>
              <p class="skill-text">テキストテキストテキストテキストテキストテキスト</p>
            </div>
            <div class="skill-box">
              <img src="" alt="">
              <h3 class="skill-title">Ruby</h3>
              <p class="skill-text">テキストテキストテキストテキストテキストテキスト</p>
            </div>
          </div>
          <div class="table-row">
            <div class="skill-box">
              <img src="" alt="">
              <h3 class="skill-title">Git</h3>
              <p class="skill-text">テキストテキストテキストテキストテキストテキスト</p>
            </div>
            <div class="skill-box">
              <img src="" alt="">
              <h3 class="skill-title">jQuery</h3>
              <p class="skill-text">テキストテキストテキストテキストテキストテキスト</p>
            </div>
            <div class="skill-box">
              <img src="" alt="">
              <h3 class="skill-title">XML</h3>
              <p class="skill-text">テキストテキストテキストテキストテキストテキスト</p>
            </div>
          </div>
        </div>
```
```css
.skill-wrapper {
  display: table;
  width: 100%;
  table-layout:fixed;
}
.table-row {
  display:table-row;
}
.skill-wrapper .skill-box {
  display: table-cell;
}
```
【無料ツールレビュー】App Storeに出す前のプライバシーポリシー・利用規約どうすればいい？

# 目的
App Storeにアプリを載せるためにプライバシーポリシー (通称「プラポリ」）が必要になります。
利用規約は必要ではない？みたいですが、ある程度規模のあるアプリ/課金系の場合、あると安心ですね。

# 読んでよかった本
インターネット上にサービスを展開している人全員に読んでほしい本です。
1. 利用規約
2. プライバシーポリシー
3. 特定商取引法に基づく表示
という三種の神器についてわかりやすく解説してくれます。

結局、こういったものは自分を守る「武器」ですから。

【改訂新版】良いウェブサービスを支える 「利用規約」の作り方
[Amazonで3000円以下で買えるよ](https://www.amazon.co.jp/%E3%80%90%E6%94%B9%E8%A8%82%E6%96%B0%E7%89%88%E3%80%91%E8%89%AF%E3%81%84%E3%82%A6%E3%82%A7%E3%83%96%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%82%92%E6%94%AF%E3%81%88%E3%82%8B-%E3%80%8C%E5%88%A9%E7%94%A8%E8%A6%8F%E7%B4%84%E3%80%8D%E3%81%AE%E4%BD%9C%E3%82%8A%E6%96%B9-%E9%9B%A8%E5%AE%AE-%E7%BE%8E%E5%AD%A3/dp/4297103265/ref=pd_sbs_14_t_0/358-4625259-9390443)

# 結局どう書けばいいん？
## 1. がちテンプレを使う
上にすすめた本(『【改訂新版】良いウェブサービスを支える 「利用規約」の作り方』)からでもテンプレート（日本語・英語両方) をダウンロードできるが、かなり詳しく書いてあるため、まだコンセプトが定まっていないサービスだと書きづらく感じるかもしれない。

## 2. 無料ツールを使う
色々使ってみたので感想を書く。
英語のプライパシーポリシー/規約を出すことを想定しています。
どのツールでも、利用規約 (Terms and Conditions)とプライバシーポリシー (Privacy Policy)をセットで作れることが多いようです。

### 
### Termly (おすすめ😍)
https://app.termly.io
<img width="1405" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/343755/a03ab546-18aa-9275-0b38-596c31e7c019.png">

**GOOD:** tooltipsや、専門用語の解説が親切なので使いやすい。ヨーロッパのGDPRやアメリカの法律に対応できる。項目ごとに"in short"みたいなサマリーがあってユーザにとって読みやすい。
**BAD:** アカウントを作らないといけない

###  GetTerms.io
https://getterms.io/

#### App Privacy Policy Generator
https://app-privacy-policy-generator.firebaseapp.com/

**GOOD**: 開発者にとって使いやすいUI、開発者が積極的にリポジトリを更新している
が
**BAD**: あくまでOSSなので、開発者は法律の専門家じゃない。
[GitHub](https://github.com/nisrulz/app-privacy-policy-generator)のissuesを見た限り、GDPRの対応(個人情報の保存期間の指定, etc) などはまだ足りていないようだ。

#### Free Privacy Policy
https://www.freeprivacypolicy.com/

**GOOD**: 色々対応している。アカウント登録もいらなかった?みたいなので、Basic機能だけでよければすぐ作れる。
**BAD**: GDPR対応は結局課金オプションになるので、Freeじゃないです...。


# 決めたあと
利用規約/ プライバシーポリシーはアップデートしやすいように、アプリ内ではなくどこかにhostしたほうがいいと言われる。(もちろん、改訂した場合、改訂した日付の表記とユーザーへの通知は必要)
サービスのウェブサイトを持っていない場合、Note/ Wix/ Firebaseappなどで静的ページとして表示。

# References
- [個人開発者がAppStore用にプライバシーポリシーを書く] (https://qiita.com/Hiroki_Kawakami/items/94f012d20afdb692df20)
redirect_toで思いどおりのページへ ❏Rails❏

#redirect_to "ページ先"

これだけで好きなページへ遷移させることができます。
指定方法は以下。
<br>

##URLで指定

```ruby:xxx_controller.rb
redirect_to "http://www.manbow.com"
```

<br>

##prefixで指定

```ruby:xxx_controller.rb
redirect_to root_path
```

<br>

##アクションで指定

```ruby:xxx_controller.rb
redirect_to action: :new
```

<br>

##指定したコントローラーのアクションで指定

```ruby:xxx_controller.rb
redirect_to controller: :users, action: :show
```

<br>

##個別のリソースを指定

```ruby:xxx_controller.rb
redirect_to controller: :users, action: :show, id: 1
```

<br>

##前のページを指定

```ruby:xxx_controller.rb
redirect_to :back
```

<br>

---
<br>
僕は基本prefixを使っています。

<br>
ではまた！
Git操作まとめ 〜コミット履歴に名前をつける(git tag)

この記事では、Ubuntu18.04LTSにインストールしたGit(version 2.17.1)を使用しています。

## タグとは

- リポジトリの任意のコミットに名前をつけること
- 開発の区切り(リリース、バージョンアップなど)がわかりやすくなる

タグをつけていない状態で履歴を確認すると、次のように表示されます。

```shell
git log

commit 76d180faf45d1da99905f225830a07f7b9c31603 (HEAD -> master)
Author: xxxxxx <xxxxxxxx@gmail.com>
Date:   Tue Nov 12 08:30:47 2019 +0900

    initial commit
```

## 軽量版タグをつける
以下の方法でタグを追加します。

```shell
git tag ver.0.0.0
```

```shell
git log

commit 76d180faf45d1da99905f225830a07f7b9c31603 (HEAD -> master, tag: ver.0.0.0)
Author: xxxxxx <xxxxxxxx.2016@gmail.com>
Date:   Tue Nov 12 08:30:47 2019 +0900

    initial commit
```

コミットナンバーの後にタグがついたことが確認できました。
なお、この方法では直前のコミットにのみタグをつけることになりますので、注意が必要です。

---

## 任意のコミットにタグをつける

いくつかのコミットが進んでいる状態で、任意のコミットにタグをつけたい場合も出てくると思います。
その場合は、git tagコマンドにコミットナンバーを指定する形でタグをつけることができます。

まず以下のようにいくつかコミットを増やしておきました。

```shell
git log --oneline

07dc0ac (HEAD -> master) fourth commit
11c93c0 third commit
cd4ce0b second commit
76d180f (tag: ver.0.0.0) initial commit
```

※コミットが増えると、git logでは長くなるのでonelineオプションをつけます。

2番めのコミットに「ver.0.0.1」とタグをつけてみます。

```shell
git tag ver.0.0.1 cd4ce0b
```

```shell:実行結果
git log --oneline

07dc0ac (HEAD -> master) fourth commit
11c93c0 third commit
cd4ce0b (tag: ver.0.0.1) second commit
76d180f (tag: ver.0.0.0) initial commit
```

---

## 注釈付きタグ

注釈付きのタグには、タグをつけた人の名前・メールアドレス・作成日時・メッセージなどを情報として持たせることができます。

```shell:書式01
git tag -a <タグ>
# このコマンドの後、エディタが起動して、メッセージを編集できる。
```

```shell:書式02
git tag -am <タグ> <メッセージ>
# コマンド内でメッセージを編集できる。
```

書式01の方法で、third commitにタグver.0.0.2をつけてみます。

```shell
git tag -a ver.0.0.2 11c93c0
```
実行するとエディタが開いて、メッセージの編集ができます。

タグとタグメッセージを確認するには次のようにします。

```shell
git tag -n
```

```shell:実行結果
ver.0.0.0       initial commit
ver.0.0.1       second commit
ver.0.0.2       ver.0.0.2のコミットです。
```

---

## タグの削除

タグを削除したいときは、-dオプションをつけます。

```shell
git tag -d ver.0.0.0
```

```shell:実行結果
git tag -n

ver.0.0.1       second commit
ver.0.0.2       ver.0.0.2のコミットです。
```

ver.0.0.0タグが削除されたことが確認されました。

---

## タグの名前を変更

タグ名を変更したい場合は次の2つの手順で行います。

１． 編集したいタグに新しいタグをつける

```shell:書式
git tag <新しいタグ> <編集するタグ>
```

２．古いタグを削除する

```shell:書式
git tag -d <編集するタグ>
```

---

### 本記事目次ページ
[Git操作まとめ](https://qiita.com/tsweblabo/items/6aec9d022c08954f5024)

### 参考サイト
[Qiita:【Git】tag関連コマンド](https://qiita.com/chihiro/items/cba40015b1aa2c73b78a)
SlickでAutoplayをtrueにしているのにhoverするとAutoplayが止まる

[slick - the last carousel you'll ever need](https://kenwheeler.github.io/slick/)

![_2019-11-15_10.19.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111089/080ba734-eea0-76cc-e835-ec6531dd952b.png)

なんと、初期設定で、

`pauseOnFocus`と`pauseOnHover`がtrueになっている。

なので、初期設定ではそのスライダーにフォーカスした時（フォーカスした時ってなんなのですかね、ホバーとなにが違うのか）と、スライダーをホバーしたときはAutoplayが止まるようになっていた。これが原因。なので、オフにしてあげれば良い。

```js
    $('.mainVisualSlider').slick({
    	autoplay: true,
    	autoplaySpeed: 6000,
    	pauseOnFocus: false,
    	pauseOnHover: false
    });
```
nickelで簡単APIサーバ

# 環境
- winodws 10
- wsl2

# Rustのインストール
wsl2上のRustの開発環境をセットアップしておく。

```bash
$ curl https://sh.rustup.rs -sSf | sh
入力を求められるので
> 1
$ echo 'export PATH="$HOME/.cargo/bin:$PATH"' >> ~/.bashrc
$ source ~/.bashrc
```

## インストールできたか確認
適当なディレクトリで

```bash
$ cargo new hello
$ cd hello
$ cargo build
$ cargo run
> Hello, world!
```



### 実行時このようなエラーが出た場合
```
note: No such file or directory (os error 2)
```

buildに必要なものが足りていないので、build-essentialをインストールする。

```bash
$ sudo apt update
$ sudo apt install build-essential 
```

# REST APIの実装
[公式のチュートリアル](https://nickel-org.github.io/)を見て実装するもエラー吐いてbuildできなかったので（JSONのパースでこける）ので、ゴリゴリ書く。

```toml:Cargo.toml
[package]
name = "hello"
version = "0.1.0"
authors = ["ubuntu"]
edition = "2018"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
rustc-serialize = "0.3"
reqwest = "0.9"
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"

[dependencies.nickel]
version = "*"
# If you are using the 'nightly' rust channel you can uncomment
# the line below to activate unstable features
# features = ["unstable"]

# Some examples require the `rustc_serialize` crate, which will
# require uncommenting the lines below
# [dependencies]
# rustc-serialize = "*"

[dev-dependencies]
serde_derive = "1.0"
```

```rust:rust
#[macro_use] extern crate nickel;
extern crate rustc_serialize;

use std::collections::BTreeMap;
use nickel::status::StatusCode;
use nickel::{Nickel, JsonBody, HttpRouter, MediaType};
use rustc_serialize::json::{Json, ToJson};
use serde::{Serialize, Deserialize};

#[derive(Debug, Serialize, Deserialize)]
struct Person {
    firstname: String,
    lastname:  String,
}

impl ToJson for Person {
    fn to_json(&self) -> Json {
        let mut map = BTreeMap::new();
        map.insert("firstname".to_string(), self.firstname.to_json());
        map.insert("lastname".to_string(), self.lastname.to_json());
        Json::Object(map)
    }
}

fn main() {
    let mut server = Nickel::new();

    server.post("/", middleware! { |request, response|
        let person = try_with!(response, {
            request.json_as::<Person>().map_err(|e| (StatusCode::BadRequest, e))
        });
        format!("Hello {} {}", person.firstname, person.lastname)
    });

    server.get("/raw", middleware! { |_, mut response|
        response.set(MediaType::Json);
        r#"{ "foo": "bar" }"#
    });

    server.listen("127.0.0.1:6767").unwrap();
}
```

これだけ書いておけば大体の人は使えるやろ（適当）
Androidで64Kを超えるメソッドを使用している場合について。

Androidビルドでは、プロジェクトで使用されているメソッド数が `65536` を超えた場合、ビルドエラーになります。

Monacaで開発するプロジェクトでも、多数のCordovaプラグインを組み込んでいるような場合に、下記のようなエラーが表示される場合があります。

```
例1
> com.android.build.api.transform.TransformException: com.android.ide.common.process.ProcessException: java.util.concurrent.ExecutionException: com.android.dex.DexIndexOverflowException: method ID not in [0, 0xffff]: 65536
```

```
例2
> com.android.build.api.transform.TransformException: java.lang.RuntimeException: java.lang.RuntimeException: com.android.builder.dexing.DexArchiveMergerException: Error while merging dex archives: 
  The number of method references in a .dex file cannot exceed 64K.
```

このエラーの対処方法については、[64K を超えるメソッドを使用するアプリの設定](https://developer.android.com/studio/build/multidex.html?hl=ja) に記載されているような対策を行う必要があります。

通常は、Cordovaプラグイン側で対応されているのが望ましいのですが、Cordovaプラグイン側で対処されていない場合があります。

[64K を超えるメソッドを使用するアプリの設定](https://developer.android.com/studio/build/multidex.html?hl=ja) にも記載されていますが、gradleファイルに下記の設定を行うことで対応することができます。


#minSdkVersion を 21 以上に設定している場合:

```gradle:gradleファイル
android {
    defaultConfig {
        multiDexEnabled true
    }
}
```

#minSdkVersion を 20 以下に設定している場合:

minSdkVersion を 20 以下に設定している場合は、Multidex サポートライブラリを使用する必要があります。

```gradle:gradleファイル
android {
    defaultConfig {
        multiDexEnabled true
    }
}

dependencies {
  compile 'com.android.support:multidex:1.0.1'
}
```

# Cordovaプラグインで対応する

gradleファイルの設定を変更する場合は、Cordovaプラグインを利用することで対応することができます。
現在、下記のようなサードパーティー製Cordovaプラグインが提供されています。

- [cordova-plugin-enable-multidex](https://github.com/adriano-di-giovanni/cordova-plugin-enable-multidex)
- [phonegap-plugin-multidex](https://github.com/phonegap/phonegap-plugin-multidex)
- [cordova-multidex](https://github.com/jwall149/cordova-multidex)


プロジェクトに組み込まれているCordovaプラグインの設定によっては、対応できない場合もありますが、上のCordovaプラグインを使用することで、ほとんどのケースは対応できると思います。

# おわりに

Androidビルドの際に、メソッド数の上限を越えたエラーが出力された場合は、今回紹介したサードパーティー製Cordovaプラグインを試してみてください。
React + Material-UIで確認ダイアログを作成してみた。 

#### Reactのカッコ良いダイアログを作る

最近、ようやくReactを本格的に初めまして、
入力ダイアログからの確認ダイアログというのが思いのほか綺麗にできたので
これはダイアログ史に刻もうと思い、Github博物館に寄贈してきました。

[■React & Material-UI CommonDialog](https://github.com/pepaperonp/react-comm-modal)

![ダイアログ1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533968/171ca21c-351d-39e8-56f0-0a891754e663.png)
![ダイアログ2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533968/d93d2720-be1b-5ab2-b8dd-7f569ed0c032.png)

デモも貼らずに記事立てとな、とおじゃられるとアレなので
ちゃんと用意してきましたよ。
<a href="https://w2p13.csb.app/" target="_blank">■DEMO</a>

こちらCodeSandboxさんを使用させていただきました。
<a href="https://codesandbox.io/">■CodeSandbox</a>

#### コード解説
##### コンポーネント`<CommonDialog ... />`
```JSX
import React, {useEffect} from 'react';
import Button from '@material-ui/core/Button';
import Dialog from '@material-ui/core/Dialog';
import DialogActions from '@material-ui/core/DialogActions';
import DialogContent from '@material-ui/core/DialogContent';

const CommonDialog: React.FunctionComponent<
    { msg: any, isOpen: any, doYes: any, doNo: any }
    > = ({msg, isOpen, doYes, doNo}) => {

  const [open, setOpen] = React.useState(false)

  useEffect(() => {
    setOpen(isOpen)
  }, [isOpen])

  return (
      <div>
        <Dialog
            open={open}
            keepMounted
            onClose={() => doNo()}
            aria-labelledby="common-dialog-title"
            aria-describedby="common-dialog-description"
        >
          <DialogContent>
            {msg}
          </DialogContent>
          <DialogActions>
            <Button onClick={() => doNo()} color="primary">
              No
            </Button>
            <Button onClick={() => doYes()} color="primary">
              Yes
            </Button>
          </DialogActions>
        </Dialog>
      </div>
  )
}
export default CommonDialog
```
#### コンポーネント配置
- msg ... メッセージ
- isOpen ... 呼出し元の制御ステート
- doYes ... 「確認Yes」での実行処理
- doNo ... 「確認No」でのクローズ処理

```JSX
        <CommonDialog
            msg={"Message"}
            isOpen={commDlg}
            doYes={execute}
            doNo={() => {setCommDlg(false)}}
        />
```

#### 用法
``` JSX
const FormDialog = () => {

  const [commDlg, setCommDlg] = React.useState(false)
  ...
  const execute = () => {
  }

  return (
    ...
        <CommonDialog
            msg={"登録しますか？"}
            isOpen={commDlg}
            doYes={execute}
            doNo={() => {setCommDlg(false)}}
        />
    ...
  )
}
export default FormDialog
```

:thinking:
**あるコンポーネントに振舞と状態を持たせて、その組合せでビューを構成する**
このReactの思想はしっくり来るものがあります。
yum コマンドの使い方メモ

「yum コマンドの使い方メモ」をdnfコマンドでどうなるか紹介します。

### 1. 更新の確認
インストール済みのパッケージで更新可能なアップデートを確認する。

```
yum check-update
```

### 2. パッケージの更新
パッケージを更新する。更新するパッケージの依存関係またはパッケージに利用可能な更新がある場合は、それらも更新される。

```
yum update <パッケージ名>
```

### 3. セキュリティー関連パッケージの更新
セキュリティー更新が利用可能なパッケージのみを最新のバージョンに更新する。

```
yum update --security
```

最新のセキュリティー更新を含むバージョンにのみパッケージを更新する。

```
yum update-minimal --security
```

### 4. パッケージグループを更新
パッケージグループを更新する。

```
yum group update <グループ名>
```

### 5. パッケージのインストール
特定のパッケージと、そのパッケージでインストールされていない依存関係をすべてインストールする。

```
yum install <パッケージ名>
```

特定のパッケージと、そのパッケージでインストールされていない依存関係をすべてyesでインストールする。

```
yum install -y <パッケージ名>
```

### 6. パッケージの削除
特定のパッケージと、 それに依存するすべてのパッケージをアンインストールする。

```
yum remove <パッケージ名>
```


### 7. パッケージの検索
パッケージ名と概要から検索する。

```
yum search <検索文字列>
```

パッケージ情報の全てから検索する。

```
yum search all <検索文字列>
```

### 8. パッケージの一覧表示
すべてのインストール済み および 利用可能なパッケージに関する情報を一覧表示する。

```
yum list all
```

glob表現に一致するインストール済み および 利用可能なパッケージを一覧表示する。

```
yum list <glob表現>
```

インストール済みのパッケージを一覧表示する。

```
yum list installed
```

glob表現に一致するインストール済みのパッケージを一覧表示する。

```
yum list installed <glob表現>
```

有効なすべてのリポジトリーでインストール可能なパッケージを一覧表示する。

```
yum list available
```

glob表現に一致する有効なすべてのリポジトリーでインストール可能なパッケージを一覧表示する。

```
yum list available <glob表現>
```

### 9. リポジトリーの一覧表示
リポジトリーの ID、名前、使用中のシステム上で 有効な 各リポジトリーでのパッケージ数を一覧表示する。

```
yum repolist
```

リポジトリーの詳細情報を一覧表示する。

```
yum repolist -v
```

```
yum repoinfo 
```

有効および無効なリポジトリーの両方を一覧表示する。

```
yum repolist all
```

### 10. パッケージ情報の表示
パッケージに関する情報を表示する。

```
yum info <パッケージ名>
```

### 11. ローカルリポジトリの作成

事前に`createrepo`と`yum-utils`をインストールする。

```
yum install -y createrepo yum-utils
```

### 11.1. パッケージをダウンロードしてローカルリポジトリを作成

```console
# cd /root
# mkdir -p yum/my_repo/Packages
# cd /root/yum/my_repo/Packages
# yumdownloader --resolve <パッケージ名>
# cd ../..
# createrepo my_repo
```

`/etc/yum.repos.d/my_repo.repo`ファイルを作成

```repo:/etc/yum.repos.d/my_repo.repo
[my_repo]
name=MyRepo
baseurl=file:///root/yum/my_repo
enabled=1
gpgcheck=0
```

### 11.2. メディア（isoファイル）内のPackagesをコピーしてローカルリポジトリを作成 

```console
# mkdir <mount_dir>
# mount -o loop <iso_name> <mount_dir>
# cd /root
# mkdir -p yum/all_repo/Packages
# cd /root/yum/all_repo/Packages
# cp <mount_dir>/Packages/* ./
# cd ../..
# createrepo all_repo
# umount <mount_dir>
```

`/etc/yum.repos.d/all_repo.repo`ファイルを作成

```repo:/etc/yum.repos.d/all_repo.repo
[all_repo]
name=all_repo
baseurl=file:///root/yum/all_repo
enabled=1
gpgcheck=0
```

### 参考ページ
> [第9章 Yum Red Hat Enterprise Linux 7](https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/system_administrators_guide/ch-yum)

以上
「SMILES Transformer: Pre-trained Molecular Fingerprint for Low Data Drug Discovery」を読んだ

- この記事は https://arxiv.org/abs/1911.04738 を読んだので半分自分用の備忘録的なまとめです

# 概要
- 化合物を特徴化する手法（Fingerprint）を生成する手法
- 特徴化するために，Attention AutoEncoderで教師なし事前学習
- AutoEncoderの入出力は化合物の文字列表現であるSMILES

# 背景
- Fingerprintはこれまでたくさん開発されてきたが，それらはrule-basedなもの
- 一方でGraph Neural Network（GNN）を使って化合物をグラフ表現にして入力することでend-to-endで学習する手法も開発されてきた
- しかし，GNNを使うためには大規模なラベル付きデータを用意しなければならないがそれは難しいことが多いため，GNNという手法には限界がある．
- VAEなどを使って事前学習をして化合物のベクトル表現を得る手法はこれまでもいくらかある．
    - ただ，データセットが小さい時についての議論が足りてない
    - SMILES TransformerはNLPの分野での事前学習手法であるTransformerをChemoinformaticsに適用したもの．

# 手法
- 画像は論文中より引用
<img width="615" alt="スクリーンショット 2019-11-17 1.02.31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188403/8ac5e144-e9c6-100b-e20f-83605656096b.png">


## AutoEncoder
### 入力
1. SMILES
2. シンボルに区切る(e.g. "Br","c","1","(","=")
3. シンボルをlabel-count encoding (論文中にはone-hotって書いてあったけどコード見たらlabel-count encodingっぽく見えた）
4. depth=256次元でembedding
5. PositionalEncoding

### 出力
- Linear層に突っ込んでsoftmax

### Pre-train
- 861,000化合物をChEMBL24からランダムに取得
- Canonical SMILESのバイアスをなるべく除去するためにSMILES Enumeratorを使ってRandomizeされたSMILESを生成
- encoderとdecoderはそれぞれ4層のtransformer層

## Fingerprint
- encoderから出てくる行列は(（分子のシンボル長）,256)となっていて，このままだとFingerprintとしては使えない
    - この行列はシンボルレベルの情報を持っているらしい
- シンボルレベルの情報を分子レベルに集約するために以下の４つを結合（256*4=1024次元）
    1. encoderの最終層の第一成分のmean
    2. encoderの最終層の第一成分のmax
    3. encoderの最終層の第一成分の先頭（最初のシンボルに当たるもの，のはず）
    4. encoderの最後から1つ前の層の第一成分の先頭
- ECFP4に合わせて1024次元にした

# 結果
そのうち書く

# わからんところ
- Fingerprint化する時にencoderの最終層と最後から１つ前の層の第一成分の先頭を持ってきたところのお気持ちがよくわからない．集約せずにどっかの情報を持ってきたい気分はなんとなくわかるが先頭でいいの？
【rails】PCからrvenvだけを間違ってアンインストールしてしまって鼻血が出た話

#コトの顛末
EC2に自分の作ったアプリをgit cloneしまして「さて、bundle installじゃ！」という時に、
エラーが出まくり。どうやらrvenvをアンインストールして、再度入れ直すと良いという事が書いある記事を見たのでやろうとしたら、タイムアウトしていたよう。
ローカル場でコマンドを打ち込んでしまい、PCからrvenvをアンインストールされrails起動しなくなってしまいました。

勉強中の身ではありますが、開発中の出来事で発狂しそうになり、
物理以外で初めて鼻血が出ました。

#もう一度入れようとするとクセあり
最初に環境構築したように、普通にrvenvをもう一度インストールすればいいんでしょ？って思ったらそうも行かず。

rvenvのインストールはうまく行くのですが、
そのあとにbundlerを入れるくだりで下記のようなエラーが出る。

```
$ gem install bundler
ERROR:  While executing gem ... (Errno::EACCES)
    Permission denied @ rb_sysopen - /Users/okachan/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bundler-2.0.2/CHANGELOG.md
```
これを解決するためには「/Users/(ユーザー名)/.rvenv/versions」配下にあるファイルに書き込む権限がないからコマンドが通らないそう。

書き込みできるように権限を変更するコマンドを入力してから、再度入れ直すという流れになります。

#権限を変更するくだり
```
$ sudo chown -R okachan:staff /Users/okachan/.rbenv/
```
[okachan]の部分がご自身のユーザー名が入ります。
パスワードを聞かれるので自身のPCのパスワードを入力。
logもでず、スン...と完了するのでちゃんと変更できているか確認します。

#権限変更できたか確認するくだり
```
$ ls -la
```
これをすると下記のような結果が出ます。

```
~略~
drwxr-xr-x    4 okachan  staff    128  8 14 21:28 versions
~略~
```
上記に似た感じのlogが30行くらい出てくるので.versionsを確認
staffに変更されているので構築用のコマンド入れていきましょう。

#rails sするために必要なコマンドを入れるくだり
```
$ gem install bundler
$ gem install rails
```
これで足りないものがインストールされています。
「$ rails -v」でrails入っているか確認してバージョンが表示されていればOK。

何かのサイトを「rails s」をすると
下記のようなエラーが出ます。

```
$ rails s
Could not find rake-13.0.0 in any of the sources
Run `bundle install` to install missing gems.
```

サイトもbundle installしてあげましょう。
全部のgemを再度installし直しているらしく結構時間がかかります。

さて、gemインストールできましたら、rails sしてみてください。

これでできるはずです！

#おわりに
これをやらかした時に、検索してもただインストールし直す記事ばかり引っかかって、解決法にたどり着けませんでした。

自分だけなのでは？
変なコマンドいれたからもう直らないのでは？
これは解決する問題なのだろうか？

と途方にくれましたが、根気よく探したら同じような状況の記事があり助かりました。

助かるうううう

タイムアウトの確認を必ずするクセつけないと、いけないと感じました。

#参考記事
Rails cが実行不可能、Permission denied @ rb_sysopen – /Users/…の対応策
http://infinity108.com/114/

Ruby on Railsの導入方法とエラー対処
https://qiita.com/raihara3/items/8ea7228b36e82a1b0eab
素人がAWSに手を出してみた様子-2

どうもはじめまして。

前回初めてAWSのEC2インスタンス作成してみました。

前回
[【素人がAWSに手を出してみた様子-1】](https://qiita.com/entakar/items/4ee87782e02e34eac14d)

EC2でインスタンス立ち上げただけなのですがね

## nginxの設定を終え
EC2でなんとかnginxの設定を完了させindex.htmlの表示が完成
ただそれだとEC2じゃなくてS3で十分じゃん！！！


## 何をするのか
そもそもAWSに手を出したのはlinebotをphpで作成した環境が
さくらスタンダードの環境があったので試してみた。
から始まっています。
その時に、そうかこれはAWSを構築してBOT用のPHPをAWSにおいてみれば
AWS構築の勉強にもなるじゃないか！

でした

## そして・・・課金の壁
linebotで使用するmessageAPIそのフックとなるのが
【Webhook URL】これがhttpsでないと設定不可（2019年11月時点）
もしかしたら前はhttpでも大丈夫だったかもしれないけれど、
近年https通信が当たり前になってきたのでこれも時代の流れなのだな。。。
など思いながらふと見てみると

EC2そのままだとHTTPじゃん！！！！

ドメインが無料じゃないようで一旦足を止めてしまう。。。


## AWSそもそもどんなサービスあるの？？？
<img width="1059" alt="スクリーンショット 2019-11-17 2.50.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50979/dbd565fc-b9a6-7e67-57f8-f72bdac9d10d.png">
こんなにあるの！！！（まだ下に隠れてるよ）

そうAWSは単にサーバー置いてdb置いて、じゃないようです

見てもいまいちわからない。。。気がする。。。
などと弱音を吐きながら眺めていると、

APIの文字が
<img width="257" alt="スクリーンショット 2019-11-17 2.53.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50979/d40c0d58-0516-f15d-14cc-00264c9eb794.png">

これはなんだろう？？？
使えるものだろうか

## 次回!!!lambda????
続く

2019/12/02 release
[【素人がAWSに手を出してみた様子-3】](https://qiita.com/entakar/items/8418c4405e28be7e43a4)
インストール済みプログラム・コマンドの新バージョンリリースを確認

こんにちは。
インストール済みプログラムの新バージョンリリースを各種確認してみました。
コマンドを実行し、現状インストールされているバージョンよりも新しいものが入手可能となったことを確認します。homebrew, chocolatey, pip で管理されているプログラムが対象です。　

* ```brew outdated```
* ```brew cask -v outdated```[^1]
* ```chocolatey outdated```[^2]
* ```pip3 list --no-cache-dir --outdated```
* ```newsboat -q -u ~/.newsboat/urls```[^3]

[^1]: これは macOS アプリケーション向けです。
[^2]: これは Windows アプリケーション向けです。
[^3]: これは RSS リーダーを用いてリリース情報を確認しています。```~/.newsboat/urls``` の中にはアクセスするサイトを一行一行書き入れておきます（例：```https://github.com/mapbox/mapbox-gl-js/releases.atom```）。
【R-igraph】エッジの重みを濃淡で表現する

Rのigraphパッケージを使ってネットワークグラフの可視化をするとき、エッジの重みを表現する方法で結構悩んだので解決案のひとつとして共有します。

例えば、重みをエッジの太さで表現すると
![失敗.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504259/9869aaeb-d017-1f1d-866c-f71d9fa89166.png)
・エッジが重なる
・矢印が埋もれて向きがわかりにくい（edge.arrow.sizeにE(g)$weightを指定しても大きさが同じになってしまい、太いエッジでは隠れてしまう）

ということがあるので
![g1938.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504259/49bcbd6c-cd46-0018-7012-d3b586aa20ea.png)
こんな感じでエッジの濃淡で重みを表現したいと思います。

ggraphを使ってやる方法は以下のページで解説されています。
[Draw Network in R (control edge thickness plus non-overlapping edges)](https://stackoverflow.com/questions/7521381/draw-network-in-r-control-edge-thickness-plus-non-overlapping-edges)

## 方法
plot() のオプション **edge.color** で **rgb()** を指定し、**引数に重み**を渡すだけです。
ただし、 rgb()の引数にするため、**重みを0～1の範囲に変換**します。
変換方法は可視化の目的に応じたものを選べばOKだと思います
(正規化すると重み最小のエッジが消えてしまうので注意)。
今回は単純に、最大値で割るだけにします。
1から引くことで重みが大きいほど暗く(濃く)なるようにします

```R:
# g はグラフオブジェクト
w <- E(g)$weight
c = 1 - (w / max(w))
```
plot()の引数で

```R:
edge.color = rgb(c,c,c)
```
と指定すれば最大値に近いエッジほど濃く描画されます。
#####例
冒頭に載せたグラフのコードです

```R:
plot(g ,edge.width = 1, edge.curved = 0.2,
	layout=layout, edge.label = w, edge.color = rgb(c,c,c),
	vertex.size = 50, vertex.color = 0)
```
【Ruby】配列を作るときに使う%記法まとめ

## はじめに
Rubyで入力を簡略化出来る%記法についてまとめました。
**文字列・シンボル**の２つの配列式に絞って記載してあります。

この記法は**キーを打つ回数を減らす**のにはもってこいですね:point_up:

参考にしたのは以下Ruby公式リファレンスです。
[リテラル (Ruby 2.6.0)](https://docs.ruby-lang.org/ja/2.6.0/doc/spec=2fliteral.html#percent)

## この記事が役に立つ方
- 配列はつい`[“a”, “b”, “c”]`と書いてしまう
- Rails初心者

## この記事のメリット
- 配列を作るときの%記法が書けて、読めるようになる

## 環境
- macOS Catalina バージョン10.15.1
- シェル：zsh
- Ruby 2.6.3

## まとめ
まず先に、表でまとめておきます。

|  記法 | 型 | 式展開 | 
| :----:|:----:|:----:|
| `%w(配列にしたい内容)` | 文字列 |  なし |
| `%W(配列にしたい内容)` | 文字列 | あり |
| `%i(配列にしたい内容)` | シンボル | なし |
| `%I(配列にしたい内容)` | シンボル | あり |

**小文字がシングルクオート**で囲われる、
**大文字がダブルクオート**で囲われると理解すれば簡単ですね。

また、配列にしたい内容は**空白区切り**で書くため、**タイピングがかなり楽**です:clap:

## StringとIntegerを配列にした場合の出力例
### 前提
式展開が有効になることを確認するために、以下のような変数を用意しておきます。

```ruby
dog = "cat"
```

### `%w()`

```ruby
%w(dog cat bird)
=> ["dog", "cat", "bird"]

%w(#{dog} cat bird)
=> ["\#{dog}", "cat", "bird"]

%w(1 2 3+4)
=> ["1", "2", "3+4"]

%w(1 2 #{3+4})
=> ["1", "2", "\#{3+4}"]
```
式展開されませんが、`\`で`#`がエスケープされます。

### `%W()`

```ruby
%W(dog cat bird)
=> ["dog", "cat", "bird"]

%W(#{dog} cat bird)
=> ["cat", "cat", "bird"]

%W(1 2 3+4)
=> ["1", "2", "3+4"]

%W(1 2 #{3+4})
=> ["1", "2", "7"]
```
変数と計算式が展開されています。
個人的には**一番使うパターンで**す。

### `%i()`

```ruby
%i(dog cat bird)
=> [:dog, :cat, :bird]

%i(#{dog} cat bird)
=> [:"\#{dog}", :cat, :bird]

%i(1 2 3+4)
=> [:"1", :"2", :"3+4"]

%i(1 2 #{3+4})
=> [:"1", :"2", :"\#{3+4}"]
```
`%w()`同様で、出力は式展開されませんが、`\`で`#`がエスケープされます。

### `%I()`

```ruby
%I(dog cat bird)
=> [:dog, :cat, :bird]

%I(#{dog} cat bird)
=> [:cat, :cat, :bird]

%I(1 2 3+4)
=> [:"1", :"2", :"3+4"]

%I(1 2 #{3+4})
=> [:"1", :"2", :"7"]
```
`%W()`同様、変数と計算式が展開されています。


## おわりに
ちなみに、`%i`の`i`は何の略なんでしょうか？
シンボルの持つ意味からすると、`Identification`？

ご存知の方がいらっしゃれば教えていただきたいです:smile:


## 参考にさせて頂いたサイト（いつもありがとうございます）
[リテラル (Ruby 2.6.0)](https://docs.ruby-lang.org/ja/2.6.0/doc/spec=2fliteral.html#percent)