OmniAICreator/Qiita-1.07M huggingface dataset:
mysqlで泣き言(macbook 再起動後のエラー)

…サーバー動かしたまま充電切れてしまった…


## 1　(おなじみの)
Mysql2::Error - Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)

## 2　（どうせpidファイルかなんか足りないんでしょ）
cd /usr/local/var/mysql

## 3 　（…あれっ、ファイル足りとるやん）
ls -la

## 4 
落ち着いてls -la


```
drwxr-xr-x   28 _mysql  _mysql       896  7  7 20:33 .
drwxrwxr-x    7 xtl124   admin        224  2 24 23:04 ..
-rw-r--r--    1 _mysql  _mysql         0  7  7 20:23 1
-rw-r--r--    1 _mysql  _mysql         0  7  7 20:23 12
-rw-r--r--    1 _mysql  _mysql         0  7  7 20:23 2017
-rw-r--r--    1 _mysql  _mysql         0  7  7 20:23 8928
-rw-r--r--    1 _mysql  _mysql         0  7  7 20:23 _mysql
-rw-r--r--    1 _mysql  _mysql         0  7  7 20:23 xtl124
-rw-r-----    1 _mysql  _mysql     34575  7  7 20:33 xtl124noMacBook-Pro.local.err
-rw-r-----    1 _mysql  _mysql         5  7  7 20:33 xtl124noMacBook-Pro.local.pid
-rw-r-----    1 _mysql  _mysql        56 12  1  2017 auto.cnf
-rw-------    1 _mysql  _mysql      1680 12  1  2017 ca-key.pem
-rw-r--r--    1 _mysql  _mysql      1112 12  1  2017 ca.pem
-rw-r--r--    1 _mysql  _mysql      1112 12  1  2017 client-cert.pem
-rw-------    1 _mysql  _mysql      1680 12  1  2017 client-key.pem
-rw-r-----    1 _mysql  _mysql      5225  6  6 16:42 ib_buffer_pool
-rw-r-----    1 _mysql  _mysql  50331648  7  7 20:33 ib_logfile0
-rw-r-----    1 _mysql  _mysql  50331648  7  5 18:55 ib_logfile1
-rw-r-----    1 _mysql  _mysql  79691776  7  7 20:33 ibdata1
-rw-r-----    1 _mysql  _mysql  12582912  7  7 20:33 ibtmp1
drwxr-x---  231 _mysql  _mysql      7392  7  5 21:06 kbr
drwxr-x---  279 _mysql  _mysql      8928  7  7 20:23 mysql
drwxr-x---   90 _mysql  _mysql      2880 12  1  2017 performance_schema
-rw-------    1 _mysql  _mysql      1676 12  1  2017 private_key.pem
-rw-r--r--    1 _mysql  _mysql       452 12  1  2017 public_key.pem
-rw-r--r--    1 _mysql  _mysql      1112 12  1  2017 server-cert.pem
-rw-------    1 _mysql  _mysql      1680 12  1  2017 server-key.pem
```
↑これ、mysqlディレクトリの権限がrootになっていたので

```
sudo chown -R _mysql:_mysql /usr/local/var/mysql
```
これで正常な権限が与えられている状態に戻しました。
からの`sudo mysql.server start`で無事起動終了。




：参考にさせていただきました
https://qiita.com/carotene4035/items/e00076fe3990b9178cc0







おまけ

`sudo tail -f /usr/local/var/mysql/(開発機名).local.err `
でリアルタイムで流れるログが見れます
kaminariをRailsエンジンで使いたい超特殊ケース解決法

Railsの超優秀なページネーションライブラリ「kaminari」。
Railsエンジニアだったら説明の必要がないgemだと思いますが、今回Railsエンジン内でも使いたいなぁ〜という（おそらく）超特殊ケースの対応をしました。実装に少しコツが必要だったのでまとめます。


# kaminariとは？
フリ文にある通り、Railsエンジニアだったら説明の必要はないと思いますが、簡単に。

[[GitHub]kaminari](https://github.com/kaminari/kaminari)

超簡単にページネーションが実現できるgemです。汎用性が高いので、ページネーションを実装したい時はkaminari一択と言っても過言ではないかと。

viewもカスタマイズ可能で、テンプレートやテーマをいくつか作って違うデザインのページネーションを使い分けることもできます。

※テンプレートは名前空間化して区別している場合に使い、テーマは同じ名前空間内で分けたい場合に使います。下はkaminariのviewカスタマイズ用ディレクトリが作成される場所です。

```
テンプレート：   ~~/views/admin/kaminari/
テーマ:       ~~/views/kaminari/admin/
```

ちなみにですが、kaminariもRailsエンジンで実装されています。

# Railsエンジンとは？
[Rails エンジン入門](https://railsguides.jp/engines.html)
（こちらの内容から必要なものをピックアップし、簡単にまとめたものになっています。）

Railsエンジンは簡単に言うと、ミニrailsアプリケーションのようなものです。というかRails::ApplicationクラスはRails::Engineクラスを継承しているので、より上位の概念と言ってもいいでしょう。

Railsでは、そのRailsエンジンを**プラグイン（gem）**という形でアプリケーションに組み込めるようにしていて、名前空間化された**ミニRailsアプリケーション**をアプリケーション内に作ることができます。

つまり、Railsエンジンはそれ自体がgemです。
なので、エンジン内でgemを使用したい場合はその依存関係をGemfileではなく、エンジンの.gemspecファイルに記述します。
またその書き方もGemfileとは異なり、以下のような書き方をします。

```~~.gemspec
s.add_dependency "moo"
```

# kaminariのRailsエンジンでの使い方
Railsエンジン名 ```admin```の場合

## 1. エンジン側でもkaminariをbundle install
Gemfileではなく、admin.gemspecに記載する

```/admin/admin.gemspec
s.add_dependency "kaminari"
```

ターミナルで

```
admin [User]$ bundle install
```

## 2. views-prefixを使ってkaminariのテンプレートをgenerate
ターミナルで

```
admin [User]$ rails g kaminari:views default --views-prefix admin
```
エンジン名をprefixとして指定してあげると、/admin/app/views/admin/にkaminariのview用ディレクトリを作ってくれます

## 3. viewからの呼び出しはviews_prefixオプションを使用する

```erb:/admin/app/views/hoge.html.erb
<%= paginate @admin_hoge, views_prefix: 'admin' %>
```
prefixとしてつけたエンジン名を指定してあげる

以上で使うことができます。kaminariのテンプレートを利用した裏技的なやつですが笑
Spring Boot：Restful APIサンプルプロジェクト

[Spring Boot](https://spring.io/projects/spring-boot)を使ってRestful APIを実装してみました。
ソースコード：https://github.com/unhurried/spring-boot-rest-api

#### ライブラリ

利用しているライブラリは以下の通り。

* ビルドツール
  - [Gradle](https://gradle.org/)
* JAX-RS
  * [Jersey](https://jersey.github.io/)（spring-boot-starter-jersey）
* アスペクト指向プログラミング
  * [Spring AOP](https://docs.spring.io/spring/docs/2.5.x/reference/aop.html) (AspectJアノテーション)
* コネクションプール
  * [HikariCP](https://github.com/brettwooldridge/HikariCP)
* データベースアクセス
  * [Spring Data JPA](https://projects.spring.io/spring-data-jpa/)（spring-boot-starter-data-jpa）
* トランザクション管理
  * [Spring Frameworkのトランザクション管理機能](https://docs.spring.io/spring/docs/4.2.x/spring-framework-reference/html/transaction.html)
* コード生成ライブラリ
  * [Lombok](https://projectlombok.org/)
* 設定ファイル読み込み
  * [spring-boot-configuration-processor](https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html)
* ロギング
  * [SLF4J](https://www.slf4j.org/) + [Logback](http://logback.qos.ch/)
* 単体テスト
  * [spring-boot-test](https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-testing.html)

#### EclipseでAPIを起動する方法

* DBMS（MySQL）と DBスキーマを用意する。
  * MySQLサーバーをインストールする。
  * `/src/main/resources/application.yaml` にMySQLサーバーの接続情報を記載する。
  * `/sql/create.sql` を実行してDBスキーマを作成する。
* Eclipseに[Spring Tool Suite](https://spring.io/tools/sts)をインストールする。
* Eclipseにプロジェクトをインポートする。
  * `ファイル` → `インポート` → `既存プロジェクトをワークスペースへ`
* パッケージ・エクスプローラーのApplication.javaを右クリック → `実行` → `Spring Bootアプリケーション`

#### APIリクエスト・レスポンス

ToDoリソースに対してCRUD操作を行うAPIが実装されている。

```shell
# Create a ToDo item.
$ curl --request POST \
>  --url http://localhost:8080/example/api/todos \
>  --header 'Content-Type: application/json' \
>  --data '{"title":"Test","content":"This is a test.","date": "2018-06-01"}' \
>  --include

HTTP/1.1 200
Content-Type: application/json
Content-Length: 71

{"id":1,"title":"Test","content":"This is a test.","date":"2018-06-01"}
```
Yesodでコマンドライン引数や設定ファイルを扱う

`main`関数内でコマンドライン引数を読んだとして、ハンドラからどうやってアクセスするのか悩んだので以下に方法を書いておきます。

# tl;dr
**ファウンデーション型のフィールドにデータを格納し`getYesod`でアクセスする。**

[Initializing data in the foundation datatype :: Yesod Web Framework Book- Version 1.6][Yesod Book]

注:ファウンデーション型というのは`Yesod`のインスタンスにするデータ型のことです。以下のコードでは`Argument`にあたります。

# ハンドラからコマンドライン引数にアクセスする例
以下は、引数付きでWebアプリを起動すると、`/`にアクセスしたときそれらをhtml内で表示するという例です。
やっていることはtl;drにある通りです。

```haskell
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE QuasiQuotes       #-}
{-# LANGUAGE TemplateHaskell   #-}
{-# LANGUAGE TypeFamilies      #-}
import System.Environment (getArgs)
import Yesod

data Argument = Argument { args :: [String] }

mkYesod "Argument" [parseRoutes|
/ HomeR GET
|]
instance Yesod Argument

getHomeR :: Handler Html
getHomeR = do
    args <- args <$> getYesod
    defaultLayout $ do
        setTitle "Argument"
        [whamlet|
          $forall arg <- args
            <p>#{arg}
        |]

main :: IO ()
main = do
  args <- getArgs
  warp 3000 (Argument args)
```
# 関連技術
[optparse-applicative](https://hackage.haskell.org/package/optparse-applicative) - コマンドライン引数を扱うライブラリ
[optparse-generic](https://hackage.haskell.org/package/optparse-generic) - 上と同じだがよりシンプル
`RecordWildcards`拡張 - レコードのフィールドを扱うのに便利。上で挙げた[Yesod Book]に使用例があります。

[Yesod Book]:https://www.yesodweb.com/book/initializing-foundation-data
前段にWAFがあるWebサーバにmod_rewrite設定した後、特定IPだけ許可する設定の問題点と解決方法

##背景
ある日、ざっくり以下のようなインフラのWebサーバに2つの設定をする必要がありました。
`【Internet】` ➜ `【WAFサーバ】` ➜ `【ウェブサーバ】`

※ 設定内容
 ① RemoteIPヘッダーがWAFのIPで上書きされないようにする。
 ② ApacheプロトコルのアクセスをWAFのIPだけ許可する。

##初期対応
最初対応した内容は以下の通りでした。
### ① RemoteIPヘッダーがWAFのIPで上書きされないようにする。

```sh
echo "RemoteIPHeader X-Forwarded-For" > /etc/httpd24/conf.d/mod_remoteip.conf
echo "RemoteIPTrustedProxy <WAFのIPアドレス１> <WAFのIPアドレス２>" >> /etc/httpd24/conf.d/mod_remoteip.conf
service httpd24-httpd restart
``` 
※ RemoteIPTrustedProxy 
`The RemoteIPTrustedProxy directive restricts which peer IP addresses (or address blocks) will be trusted to present a valid RemoteIPHeader value of the useragent IP.`

### ② ApacheプロトコルのアクセスをWAFだけ許可する。

```conf
# 2.2系以前のApache
Order deny,allow
Deny from all
Allow from <WAFのIPアドレス>
 
# 2.4系以降のApache
Require all denied
Require ip <WAFのIPアドレス>

//or

# WAFのIPアドレス 以外からのアクセスを拒否
RewriteEngine On
RewriteCond %{REMOTE_ADDR} ^(<WAFのIPアドレス1>|<WAFのIPアドレス2>)$
RewriteRule ^.*$ - [F,L]
```
※ 参考
🔗[Apache Module mod_remoteip](http://httpd.apache.org/docs/2.4/mod/mod_remoteip.html)
🔗[Apache 2.4系でIP制限の設定方法](https://ex1.m-yabe.com/archives/2154)
🔗[mod_rewrite を使ったアクセス拒否いろいろ](https://mgng.mugbum.info/691)

##問題
しかし、当然の結果として①設定によって②の設定が意図した通り反映されませんでした。
（RemoteIPヘッダーを実際アクセスしたクライアントIPに調整した後、
  RemoteIPヘッダーでアクセスを制限しているから）

##解決方法
Apache設定だけで解決出来るように頑張って見たんですが、
結局、iptablesで対応しました。
(CentOS7場合firewald)

### iptables 設定（WAF以外から80, 443 portアクセスを拒否）
```sh

iptables -I INPUT -p tcp -s 0.0.0.0/0 --dport 80 -j DROP
iptables -I INPUT -p tcp -s <WAFのIPアドレス1> --dport 80 -j ACCEPT
iptables -I INPUT -p tcp -s <WAFのIPアドレス2> --dport 80 -j ACCEPT

iptables -I INPUT -p tcp -s 0.0.0.0/0 --dport 443 -j DROP
iptables -I INPUT -p tcp -s <WAFのIPアドレス1> --dport 443 -j ACCEPT
iptables -I INPUT -p tcp -s <WAFのIPアドレス2> --dport 443 -j ACCEPT

service iptables restart
```

👏
vscodeの設定で環境変数とかを使う

`"args": [ "${env:HOME}" ]` みたいにすると`$HOME`が使えたりする
環境変数だけでなく、`${workspaceFolder}` とか使える変数が色々ある

- [Variables Reference](https://code.visualstudio.com/docs/editor/variables-reference)


## 公式の例

```json
{
    "type": "node",
    "request": "launch",
    "name": "Launch Program",
    "program": "${workspaceFolder}/app.js",
    "cwd": "${workspaceFolder}",
    "args": [ "${env:USERNAME}" ]
}
```
多次元配列の複数人のスコアから順位を配列にて返す方法【PHP】

## **多次元配列の複数人のスコアから順位を配列にて返す方法**
　行いたいことは、例えば、5人のスコアが1人目から順に
　｛80,50,88,100,55}と異なるスコアから順位を返却したい。
　戻り値としては、順位なので、｛3,5,2,1,4｝と返す。
　初心者がプログラミングを行い場合、どうやって返却値を返せばいいか
　思いつくことは、総当たりの比較やmax,min関数を使用してからの順位算出。
　いずれもコードを書いてしまうのであまり好ましい方法ではありません。
　そうすると他のやり方は、ソートで返すやり方となります。
　以下のやり方で説明します。あくまで5人のスコアが全て異なる場合です。
　同スコアが複数いる場合、仕様によっては、同じ順位で返す、
　もしくは、書いてある方優先で順位付けするといったことになると思います。

```php:function.php
function s_juni($n0,$n1,$n2,$n3,$n4) {
$wk = array(
    array(
        'id'    => 0,
        'score' => $n0,
        'juni'  => ''
    ),
    array(
        'id'    => 1,
        'score' => $n1,
        'juni'  => ''
    ),
    array(
        'id'    => 2,
        'score' => $n2,
        'juni'  => ''
    ),
    array(
        'id'    => 3,
        'score' => $n3,
        'juni'  => ''
    ),
    array(
        'id'    => 4,
        'score' => $n4,
        'juni'  => ''
    ));
foreach ((array) $wk as $key => $value) {
    $sort[$key] = $value['score'];
}
array_multisort($sort, SORT_DESC, $wk); // ①
for($i=1; $i<6; $i++) { // ②
  $wk[$i-1]['juni'] = $i;
}
foreach ((array) $wk as $key => $value) {
    $sort[$key] = $value['id'];
}
array_multisort($sort, SORT_ASC, $wk); // ③
$wk2 = array();
array_push($wk2,$wk[0]['juni'],$wk[1]['juni'],$wk[2]['juni'],$wk[3]['juni'],$wk[4]['juni']);
return $wk2;
}
```
まず、array()で、id=>プレイヤー、score=>スコア、juni=>順位（初期値は、空）
にします。
もともとの初期が、id昇順です。これを、scoreを降順としてソートを行います。（①の部分）
ソートを行った後、5名分の順位を割り振っていきます。（②の部分）
その後、ソートをid昇順に戻し（③の部分）、順位を配列に詰めて返却します。
そうすると、｛3,5,2,1,4｝の値が返却されるので呼び出し側では、
```
$wk = ｛3,5,2,1,4｝
```
のようになるので、
```
$wk[0] = 3、$wk[1] = 5、$wk[2] = 2、$wk[3] = 1、$wk[4] = 4
```
となります。
もし、人数を追加したい場合は、引数を増やす、配列を増やす、forでLoopしている$i<6の部分を加算するなどする。for文中で順位を入れているので同順位対応といった場合は、
裏変数として人数をカウントする変数と順位比較で前のスコアを保持しておく必要がある。
FactoryBotで1対1や1対nのモデルを複数作る

# 前提として
**Rspecで1対1の関係のモデルのテストデータを複数作りたい**

うーんってなったので忘れないようついでに他のパターンも一緒にまとめました

- モデルを複数作る
- 1対1のデータを1つ作る
- 1対nのデータを1つ作る
- 1対1のデータを複数作る ←今回やりたくて悩んだのはここ
- 1対nのデータを複数作る

ここで例として扱うモデルは
1対1も含めたいのでよくある1対nの親モデル`User`と子モデル`Post`にしました

# まず、FactoryBotでモデルを複数作成するには
`create_list`を使います

```ruby
FactoryBot.create_list(:post, 3)
```
で`Post`モデルを3つ作れる

# 1対1のデータを作る
## パターンA
```ruby
FactoryBot.create(:post, user: FactoryBot.create(:user))
```

## パターンB
```ruby
user = FactoryBot.create(:user)
FactoryBot.create(:post, user: user)
```

## パターンC
```ruby
FactoryBot.create(:user) do |u|
  FactoryBot.create(:post, user: u)
end
```

# 1対nのデータを作る
## パターンA
```ruby
user = FactoryBot.create(:user)
FactoryBot.create_list(:post, 3, user: user) 
```

## パターンB
```ruby
FactoryBot.create_list(:post, 3, user: FactoryBot.create(:user)) 
```
`User : Post = 1 : 3`のデータを作ってるんですが
ぱっと見、`Post : User = 1 : 1`のデータが3つできるようにも見えません？
自分はそう見えて「1対1のデータを複数作る」にはどうすれば、と悩みました

でもまぁよくよく考えてみると妥当な挙動だと思います

# 1対1のデータを複数作る
これこれ　これがやりたかった

```ruby
FactoryBot.create_list(:user, 3) do |u| 
  FactoryBot.create(:post, user: u)
end
```

# 1対nのデータを複数作る
1対1のデータを複数作った時点で目的達成なのですが
せっかくなのでついでに1対nについても考えてみました

## パターンA(力技)
```ruby
3.times do
  FactoryBot.create(:user) do
    FactoryBot.create_list(:post, 3, user: user)
  end
end
```
これでもいいんですがRubocopにシバかれたので考え直してパターンBにたどり着きました

## パターンB
```ruby
FactoryBot.create_list(:user, 3) do |u| 
  FactoryBot.create_list(:post, 3, user: u) 
end
```

これで
`User : Post = 1 : 3`のデータが3つ作成されます

ブロック使うことでイメージとしてはcreate_listがfor文みたいでちょっと読みやすいような
データベースの設定（Rails環境構築）

# はじめに
RailsのdefaultのDBはSQLiteだが、 Mysqlに変更したい。
railsアプリを新規作成する時に指定できるが忘れてしまったので。

## gem mysql2インストール

Gemfileに"gem 'mysql2'"を追記

```bash

gem 'mysql2'
```

# config/database.yml
```[アプリのルート]/config/database.yml

default: &default
  adapter: mysql2
  encoding: utf8
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password:
  socket: /tmp/mysql.sock

development:
  <<: *default
  database: [アプリ名]_development
```
終了！
Scalaの継承について

2018/7/7 20:55 追記
最後のObjectの継承順を間違えていたので、修正しました。何度か挙動を確認するために書き換えていたものをそのまま投稿していたようです。すみません

ご指摘ありがとうございます＞xuwei_k

---


今までちゃんと意識していなかっただけど…

```scala
scala> trait TraitA {
     | def greet(): String = "Hello, World!"
     | }
defined trait TraitA

scala> trait TraitB extends TraitA {
     | override def greet(): String = "Hello, Japan!"
     | }
defined trait TraitB

scala> trait TraitC extends TraitA {
     | override def greet(): String = super.greet
     | }
defined trait TraitC

scala> object ObjectA extends TraitB with TraitC
defined object ObjectA

scala> ObjectA.greet
res0: String = Hello, Japan!
```

てっきり`TraitB`は`TraitA`を継承しているので、`Hello, World!`と出力されるのかと思ったら、`super`の向き先は`TraitB`になっていて、`TraitB`のメソッドが起動した。

`super`がどこを向いているか、よく把握しておかないと「意図した挙動じゃない！」ってなりそう。
[Atom]snippets登録で捗る(自動補完)

##こんなことありません...?
atomの自動補完を使っているとき
<img src="https://qiita-image-store.s3.amazonaws.com/0/235684/e4e697d8-19b0-e7e9-bb17-a2b77526ed64.png" width=50%>
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
<img src="https://qiita-image-store.s3.amazonaws.com/0/235684/c5fabc75-9f79-31ad-95fc-85473e97dd01.png" width=50%>

**これを自分好みの自動補完にしたい!!**

##さっそくやってみる。
困ったときのgoogle先生に聞くと、
atomのファイル>snippetsを選択するといいらしいのでやってみる。
以下のファイルが開く。

```coffeescript:snippets.cson
# Your snippets
#
# Atom snippets allow you to enter a simple prefix in the editor and hit tab to
# expand the prefix into a larger code block with templated values.
#
# You can create a new snippet in this file by typing "snip" and then hitting
# tab.
#
# An example CoffeeScript snippet to expand log to console.log:
#
# '.source.coffee':
#   'Console log':
#     'prefix': 'log'
#     'body': 'console.log $1'
#
# Each scope (e.g. '.source.coffee' above) can only be declared once.
#
# This file uses CoffeeScript Object Notation (CSON).
# If you are unfamiliar with CSON, you can read more about it in the
# Atom Flight Manual:
# http://flight-manual.atom.io/using-atom/sections/basic-customization/#_cson
```

readmeみたいなのでこれを読んでいく。
11行目~によると、

```coffeescript:snippets_template.cson
  '何言語でのコマンドか(どの種類ファイルで適用するか)':
     'コマンド名':
       'prefix': '"キーボードで入力するもの(選択候補として出るもの)"'
       'body': '"選択されたとき展開するもの"'
```
こんな要領で書けばいいらしいので、　　←~~適当過ぎない？~~
以下を追加した。

```coffeescript:snippets.cson
#cpp snippet
  '.source.cpp':
#iostream
    'cout':
      'prefix':'cout'
      'body':'cout<< <<endl;'
```

で冒頭述べたものも以下のようになりました(std::などを省きたかった)
<img src="https://qiita-image-store.s3.amazonaws.com/0/235684/c6e53c6f-b37d-6f59-bb64-67d010662edd.png" width=50%>
##さらに...
###1.キーボードの位置
補完内容を展開後キーボード入力をどこに置くかを$で定義できる。
tabキーを押すことで$1→$2....→$Nに移動できるようになる。
また${N:"keyword"}とすることで展開後選択される文字列で設定できる。


```coffeescript:snippets.cson
#cpp snippet
  '.source.cpp':
#iostream
    'cout':
      'prefix':'cout'
      'body':'cout<<${1:variable}<<endl;'
```

###2.改行を含むスニペット

\nを用いることで改行を含めることができます。
ただしスニペット内に\nを用いるときは工夫が必要。

```coffeescript:snippets.cson
#cpp snippet
  '.source.cpp':
#iostream
    'cout':
      'prefix':'main'
      'body':'int main(void){\n return 0;\n}'
```
##おわりに
本記事ではc++についてだけ行いましたが、すべての言語で設定できるようです。

本記事等について何かガバや改善点があれば、お気軽にお願いします。
~~(初心者なのでガバを生成している可能性が高い)~~
Ruby:ブロックを用いて、スコープを思い通りに飛び越える。

#ブロックとスコープ
rubyにおいて、スコープを思い通りに飛び越えて変数を共有、変更するために、
ブロックは引数+αの要素として、メソッドに渡すイメージ。無名引数のようなもの。yieldで渡されたブロックを呼び出すことができる。

##通常のスコープ

```ruby:sample.rb
def mymethod
  x = "Goodbye"
  yield("cruel")
end
x = "Hello"
my_method {|y| "#{x},#{y} world" } # => "Hello, cruel world"

def just_yield
  yield
end 
```
ブロックを定義する時、その時点でその場にある束縛を所得する。
メソッド内にも別でxという変数は定義されているので、この場合、goobyeの方でxが書き換えられてしまいそうだが、実際にはブロックが定義された時のxを見ている。メソッドにある束縛はブロックからは見えない。

```ruby:sample.rb
top_level_variable = 1

just_yield do
  top_variable += 1
  local_to_block = 1 #新しい束縛
end

top_level_variable # => 2
local_to_block # => Error!
```
このようにblockの中で変数を定義することは可能ではあるが、ブロックの外に出ることはできない。

```ruby:sample.rb
v1 = 1
class MyClass
  v2 = 2
  local_variables # => [:v2]
  def my_method
    v3 = 3
    local_variables
  end
  local_variables
end

obj = MyClass.new
obj.my_method # => [:v3]
local_variables # => [:v1, :obj]
```
また、rubyでは新しいスコープに入る度に以前の束縛は新しい束縛に置き換えられる。よって、MyClass内に入ると、v１はスコープを外れて見えなくなる。
ただし、インスタンス変数はそのインスタンスが保持するものであるため、メソッドから、、同じオブジェクトのメソッドを呼び出したとしても、変わることはない。

###スコープゲート
スコープが新しくスコープをオープンする場所は3つある。
・クラス定義
・モジュール定義
・メソッド
プログラムはスコープをclass,defなどのキーワードによって、判別するため、これらのスコープゲートを超えてローカル変数を渡したい場合には、単にclassやdefなどを使わない定義の仕方をすれば良い。

```ruby:sample.rb
my_var = "成功"
MyClass = Class.new do

  puts "クラス定義の中は#{my_var}"

  define_method :my_method do
    "メソッド定義の中も#{my_var}"
  end
end
```
このように記述することで、スコープゲートを飛び越えることができる。

###instance_eval

``` ruby:sample.rb
class MyClass
  def initialize
    @v = 1
  end
end

obj = MyClass.new

obj.instance_eval do
  self # => #<MyClass:igaerig324 @v = 1>
  @v #=> 1
end
```
インスタンスに渡されたブロックはレシーバをselfにしてから評価されるため、レシーバのprivateメソッドや、@vのようなインスタンス変数にもアクセスすることができる。
また

```ruby:sample.rb
v = 2
obj.instance_eval{ @v = v }
obj.instance_eval{ @v } # => 2
```
このようにインスタンス変数をローカル変数で書き換えることもできる。

### instance_exec
instance_evalのもう少し柔軟になったバージョンにinstance_execがある。

```ruby:sample.rb
class C
  def initialize
    @x = 1
  end
end

class D
  def twisted_method
    @y = 2
    C.new.instance_eval{ "@x: #{@x}, @y: #{@y}" }
  end
end 

D.new.twisted_method #=> "@x: 1, @y: "
```
instance_evalはselfをレシーバにするため、呼び出し側のインスタンス変数はスコープから溢れてしまう。
これを防ぐためにinstance_execで@yの値をブロックに渡せば良い。

```ruby:sample.rb
class D
  def twisted_method
    @y = 2
    C.new.instance_eval(@y){ |y| "@x: #{@x}, @y: #{y}" }
  end
end 
```

##Procオブジェクト
Procはブロックをオブジェクトにしたもの。

```ruby:sample.rb
inc = Proc.new {|x| x + 1}
inc.call(2) # => 3
```
このように、ブロックをオブジェクトとして、保存して、後から評価することができる。

```ruby:sample.rb
dec = lambda {|x| x - 1}
dec.class #=> Proc
dec.call(2) #=> 1
```
メソッドに特別な引数を用意して、ブロックに束縛を割り当てることもできる。

```ruby:sample.rb
def math(a, b)
  yield(a, b)
end

def do_math(a, b, &operation)
  math(a, b, &operation)
end

do_math(2, 3){|x, y| x * y} #=> 6
```
##メモ
### ensure
エラーが起きようがおきまいがどっちみち実行する。
React NativeでTwitterクライアントを作った

# はじめに
新卒エンジニア4ヶ月目。
Webやネイティブアプリに関する知識は全く無かったのでいろんなものを参考に自分でも作ってみる。
そろそろツイッタークライアントアプリを作りたくなってきたのでやってみた。コードの汚さは反省すべき点。

# コードについて
Githubの[ここ](https://github.com/Ikeponias/twitter-client)に上げてある。

# Twitter APIについて
ネイティブの仕様とかOAuthとかで頭を悩ませていた中、[こちらの記事](https://qiita.com/watanabe_yu/items/ed06658d0e270bf787c5)で面倒なところをほとんどやってくれていたので遠慮なく使わせていただく。ありがとう@watanabe_yuさん，ありがとうQiitaさん，ありがとうnpmさん。

# Reduxについて
Reduxでかっこよくアクション決めようと思ったが非同期処理はRedux-thunkやRedux-Sagaなどを使いこなせないと難しいようで、それ抜きでやったら死んだ。明日から本気出す。

# AsyncStorageについて
アプリの起動のたびにログインするのが面倒だったのでAsyncStorageでトークンを保持することに。自分ではさっぱりわからなかったが、周囲の天才が教えてくれた。圧倒的感謝。

# アプリについて
## GET
自身のタイムラインを閲覧できる。検索は実装していないが見た感じ難しくなさそうなので次回以降にできたらやりたい。ちなみに画像中のHogeAccountは後述するPOSTで投稿したもの。RetweetやFavoriteのPOSTは実装していないが「いずれやりたい」のでボタンにはしている。
タブ切り替えでタイムラインの更新はできないが、RefreshControlは実装しているのでリストをシュッとやると更新できる(おねがい通じて)。
![スクリーンショット 2018-07-07 19.15.54.png](https://qiita-image-store.s3.amazonaws.com/0/212284/8c843416-3397-fc7d-b2a8-13b4860fa72c.png)

## POST
ツイートを投稿できる。文字列だけ。画像はImagePickerを使用しないといけないようで、色々面倒そうだったので次回以降に(以下略)。
![スクリーンショット 2018-07-07 19.15.44.png](https://qiita-image-store.s3.amazonaws.com/0/212284/c3920f7c-45a2-bfc0-0c29-04831938d982.png)
spring-securityのユニットテストでAuthentication#getDetailsする箇所の対応

## 背景
spring-securityのユニットテストでコントローラメソッドが以下のように```Authentication#getDetails```している箇所があり、ここが```NullPointerException```になってしまった。

```java
SampleDetails details = (SampleDetails)auth.getDetails();
details.getHoge();
```

WithMockUserにこれを設定する方法は無さそうだったので別の方法を考えた。

## 対処

```xml:pom.xml
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.0.3.RELEASE</version>
	</parent>

	<properties>
		<java.version>10.0</java.version>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
	</properties>

	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-thymeleaf</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-devtools</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-security</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework.security</groupId>
			<artifactId>spring-security-test</artifactId>
			<scope>test</scope>
		</dependency>
```

以下がテストコード。

```java
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.test.context.support.WithMockUser;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.MockMvc;

import kagamihoge.springmvcsample.controller.SampleDetails;


@RunWith(SpringRunner.class)
@SpringBootTest(
        webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT,
        classes = App.class)
@AutoConfigureMockMvc
public class SecurityTest {
    @Autowired
    private MockMvc mvc;

    @Test
    @WithMockUser
    public void whenGetCustomers_thenStatus200() throws Exception {
        UsernamePasswordAuthenticationToken auth = (UsernamePasswordAuthenticationToken)SecurityContextHolder.getContext().getAuthentication();
        auth.setDetails(new SampleDetails());
        
        mvc.perform(get("/hoge"))
                .andExpect(status().isOk());
    }
}
```

まぁ恐らく間違いなく```UsernamePasswordAuthenticationToken```が使われるだろうと信じてキャストし、```setDetails```でテスト用の適当な値を入れてしまう。この方法で対処した。
Bootstrap 4でcarouselのindicatorを丸くする方法

Bootstrap4ではCarousel(画像をスライドさせるやつです)のindicator(何枚目を表示してるかを示すもの)が長方形になっています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/87888/cc439bb7-45cd-9bf4-ceaa-e039a9079c6b.png)
使ってなかったので知らないのですが、Bootstrap3では丸かったらしいです。

ただ、個人的には丸くしたかったので以下のようにCSS(正確にはSCSS)を設定することで丸くしました。

```scss
$carousel-indicator-length: 10px;

.carousel-indicators {
  & li {
    border-radius: 50%;
    margin: 1px 3px;
    height: $carousel-indicator-length;
    max-width: $carousel-indicator-length;
  }
}
```

幅と高さを同じにして`border-radius`で角を丸くしているだけです。
下のようになりました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/87888/a9dfebc8-c926-0087-1df6-baeb8df3254b.png)
SSL通信の暗号化プロセスと各種証明書の役割まとめ

暗号化の反対は復号とのことで
`- 復号化`
`+ 復号`
としました、ご指摘いただいた方ありがとうございますm(_ _)m

## はじめに
サーバーをSSL化する作業はよくやっていたんですが、生成しているファイルがSSL通信で行っている役割がしっくりきていなかったのでまとめました。

## 概要
![ssl.png](https://qiita-image-store.s3.amazonaws.com/0/56262/f41bfb9a-8b75-27c7-379a-8252429322d1.png)


## 登場人物
- クライアント
ChromeのようなブラウザであったりAndroid/iOSのようなネイティブアプリのこと。SSL通信では共通鍵暗号方式の共通鍵を生成する役割を担う。

- サーバー
SSL証明書をもっている。SSL通信では公開鍵暗号方式の公開鍵/秘密鍵を生成する役割を担う。

- 中間認証局
俗に言うSSL証明書発行業者。開発者がサーバーをSSL化しようと思ったときに`csr`を渡す相手でありSSL証明書(`crt`)を発行する役割を担う。

- ルート認証局
SSL証明書を発行する作業をしていても特に意識することのない存在。中間認証局が持つ中間証明書に署名する役割を担う。ルート証明書はあらかじめクライアントにも渡されている。

## 詳細
### 1-3 サーバーをSSL化するとき特に意識することがない部分
##### **1.ルート証明書の発行**
 自己証明が可能なルート認証局からルート証明書を中間証明書に付与する、ルート証明書の検証は不要

##### **2.ルート証明書で中間証明書に署名**
 付与されたルート証明書で中間証明書に署名する。

##### **3.ルート証明書の発行**
自己証明が可能なルート認証局からルート証明書をクライアントに付与する、ルート証明書の検証は不要

### 4-7 開発者がサーバーをSSL化するときの作業工程
##### **4.`private-key`,`csr`の作成**
 SSL証明書を発行するとき最初に行う作業。 `openssl genrsa`で秘密鍵を作成、`openssl req -new -key` でcsrを作成する。csrにはコモンネームなどの情報と合わせて対応する公開鍵情報が付与される。
##### **5.csrを送付**
 作成したcsrをSSL証明書業者に送付する。
##### **6.csrに中間証明書で署名**
 SSL証明書業者ではルート証明書で署名された中間証明書を使って受け取ったcrtに署名を行う。
##### **7.SSL証明書(crt)を発行**
 署名された署名ファイルを送付する。一般的にSSL証明書といったらcrtファイルのことと考えてよいと思う。
 

### 8-14 ユーザーがSSL通信でサービスを利用する工程
##### **8.DNSリクエスト**
 urlやエンドポイントを指定して接続リクエストを送信する作業。
##### **9.SSL証明書の発行**
 必要があればMITM対策にSSL証明書に記載されているCommonNameとDNSが一致しているか検証を行う。　
##### **10.SSL証明書の検証**
 SSL証明書に署名をした中間証明書が妥当なものかの検証を行う。工程3で既にクライアント側にルート証明書が存在するので、SSL証明書にチェーンされたルート証明書の署名の検証が可能。
##### **11.共通鍵の生成**
 クライアントからデータを送信する際の暗号化に用いる共通鍵の生成。厳密にいえばシーケンス的にはここで行っていないと思う。
##### **12.共通鍵を暗号化**
 SSL証明書に添付された公開鍵を使って共通鍵を暗号化する。
##### **13.暗号化された共通鍵を付与**
 暗号化された共通鍵をサーバーへ送付
##### **14.暗号化された共通鍵を秘密鍵で復号**
 共通鍵は公開鍵暗号方式で暗号化されているのでサーバ側にある秘密鍵でこれを復号する。

## 参照
https://milestone-of-se.nesuke.com/sv-advanced/digicert/digital-certification-summary/
https://qiita.com/kawaz/items/f90810b9ea823b6556a8
gophernotes 環境を作るよ

コードを試すには`lgo`のほうが良さそう
[lgo - Go (golang) をインタラクティブに実行するための Jupyter Notebook環境](https://qiita.com/yunabe/items/d4f4c0ca7d1764075e4b)

# Gophernotes とは
[Gophernotes リポジトリ](https://github.com/gopherdata/gophernotes) 
[Gophernotes docker image](https://hub.docker.com/r/dwhitena/gophernotes/)

golang の jupyter notebook / nteract kernel
go での機械学習が捗る
式評価に gomacro を利用している

## gomacro
[gomacro](https://github.com/cosmos72/gomacro) 
go のインタラクティブインタプリタ、REPL
(試験的な Gnerics を持っている [generics.md](https://github.com/cosmos72/gomacro/blob/master/doc/generics.md). 独自 debugger も持っている)

```
$ go get -u github.com/cosmos72/gomacro
$ gomacro
```
で REPL として使える


# MacOS への環境構築

## docker hub からイメージを持ってくる場合

```
$ docker pull dwhitena/gophernotes
$ docker run -it -p 8888:8888 gopherdata/gophernotes
```

## ローカルに構築する場合

### 事前準備
* Go 1.9+
* jupyter notebook / nteract
* ZeroMQ 4.X.X
* pkg-config

### install
```
$ go get github.com/gopherdata/gophernotes
$ mkdir -p ~/Library/Jupyter/kernels/gophernotes
$ cp $GOPATH/src/github.com/gopherdata/gophernotes/kernel/* ~/Library/Jupyter/kernels/gophernotes
```

MacOS 上で
gomacro のサードパーティライブラリをインポートする時に使う `plugin` パッケージを動作させるためには Go 1.10.2+ が必要みたい　
[gomacro/issues/12](https://github.com/cosmos72/gomacro/issues/12)

`$ strip /path/to/gophernotes` を実行してはいけない(Go 1.10.2+ on MacOS)
`strip` コマンド: 実行ファイルからアセンブラやリンクエディタからの出力にくっついているシンボルテーブルを削除したり、変更したりするコマンド

gophernotes/vender 下の [pebbe/zmq4](https://github.com/pebbe/zmq4) は, ZeroMQ 4.2.3 (2018/07/07 時点)
ZewoMQ のバージョンがシビアなので、ローカルのバージョンを合わせる

参考にしました
[Homebrewで旧バージョンのパッケージをインストールしたい](https://qiita.com/KyoheiG3/items/912bcc27462871487845)

目次ページ
[Machine Learning with Go 読書記録](https://qiita.com/ysaito8015@github/items/77797d4a489115b9d386)
RequireComponentとは＆有用性

#RequireComponentとは?
Unityのスクリプトリファレンスによると...


RequireComponent属性は、必要なコンポーネントを依存関係として自動的に加えます。

RequireComponentを使ったスクリプトをゲームオブジェクトにアタッチすると、必要なコンポーネントが自動的にそのゲームオブジェクトに加えられるようになります。 
これはセットアップエラーを回避するのに役に立ちます。 
例えば、あるスクリプトではRigidbodyが同じゲームオブジェクトに常に加えられる必要があるとします。
RequireComponentを使用することでこれを自動的に実行し、セットアップで間違えることがなくなります。RequireComponentは、コンポーネントがゲームオブジェクトに加えられる時点で、欠落している依存関係のみを検知します。ゲームオブジェクトに新しい依存関係が欠落していても、そのコンポーネントのすでに存在しているインスタンスにそれらの欠落した依存関係が自動的に加えられるわけではありません。

まあ、簡単にまとめると...

アタッチする`GameObject`に対して**必要不可欠な属性(RigidbodyやAnimator, Scriptなど)**をスクリプトに書き込んでくことによってアタッチのし忘れを防止するおまじないみたいな感じです.

#RequireComponentの有用性
では, どういうときに`RequireComponent`を使うのかというと例えば...

```ExampleScript.cs
using UnityEngine;
using System.Collections;

[RequireComponent(typeof(Animator))] //AnimatorをアタッチしたGameObjectにComponentとして加える
[RequireComponent(typeof(Rigidbody))] //RigidbodyをアタッチしたGamaObjectにComponentとして加える
[RequireComponent(typeof(MovingScript))] //MovingScript.csをアタッチしたGameObjectとして加える
```

なので、使える場面として
・たくさんのGameObjectにアタッチする予定のあるスクリプトの時に使える
・Componentに入れ忘れやすい人
・エラー回避

ぜひぜひ使ってみてください〜
第19話 ラマヌジャンの式

この記事は[仮面ライダービルドの数式](https://qiita.com/izmktr/items/e26a624e79bce3edccc9)の第19話です。

```math
7\sqrt[3]{20}-\Bigl(\sqrt[3]{\frac{5}{3}}-\sqrt[3]{\frac{2}{3}}\Bigr)^6=19
```

立方根が出てくる気持ち悪い式ですが、意外なことに答えは19とスッキリします。
ラマヌジャンが発見した式で、見るからにラマヌジャン以外にありえない、
というオーラを漂わせていますね。

ラマヌジャンが書き残した元々の式はこんな感じだそうです。

```math
\sqrt[6]{7\sqrt[3]{20}-19}=\sqrt[3]{\frac{5}{3}}-\sqrt[3]{\frac{2}{3}}
```

本当にそうなるのか、6乗の式をみてみましょう。

```math
\begin{align}
(a-b)^6&=a^6-6a^5 b+15a^4 b^2-20a^3 b^3+15a^2 b^4-6ab^5+b^6\\
&=\{a^6+b^6-20a^3 b^3\}+a^2b\{-6a^3 +15b^3\} + ab^2\{15a^3-6b^3\}
\end{align}
\\
a=\sqrt[3]{\frac{5}{3}}, b=\sqrt[3]{\frac{2}{3}}
```

3乗すれば立方根がとれますから、3乗になっているところだけまずは計算してみましょう。

```math
\Bigl\{(\frac{5}{3})^2+(\frac{2}{3})^2-20\cdot\frac{5}{3}\cdot\frac{2}{3}\Bigr\}
+a^2 b\Bigl\{-6\cdot\frac{5}{3}+15\cdot\frac{2}{3}\Bigr\}
+ab^2\Bigl\{ 15\cdot\frac{5}{3}-6\cdot\frac{2}{3}\Bigr\}\\
=\Bigl\{\frac{5^2+2^2-20\cdot5\cdot2}{3^2}\Bigr\}
 +a^2 b\Bigl\{-2\cdot5+5\cdot2\Bigr\}
 +ab^2 \Bigl\{5\cdot5-2\cdot2\Bigr\}\\
=-19+21ab^2\\
=-19+21\frac{\sqrt[3]{20}}{3}\\
=-19+7\sqrt[3]{20}
```

根気よく計算すればスッキリまとまるんですが…。
どういう考え方をしたらこんなこと思いつくんでしょうねぇ…。
【Rails】ログファイルをクリアする

開発中、ふと気づくとログファイルが数百メガバイトを超えていることがあり、

これまではファイルそのものを削除してしまっていたのですが、

ログをクリアするコマンドがあったため、メモしておきます。

## 環境

- Rails 5.2.0

## コマンド

`rails log:clear`
RPAの前に、サイトの利用規約をチェックしよう

今回はUiPathに限定せず、RPA全般の話。

　RPAツールに自動でWebスクレイピングさせたいのは誰もが思う事で、私も自宅のPCに住んでるロボが毎朝いろんな情報サイトの新着記事を集めてメールしてくれるので、それを通勤中にまとめて読む便利生活が送れてます。

　が、実はサイトによっては利用規約に**ロボットによるアクセス禁止**を明記してるところがあるのを最近知ったので、いくつか挙げてみます。（私は法律の専門家ではないので文言だけで勝手に解釈してますが、的外れなところがあったらご指摘下さい。）

# "ロボット禁止"の利用規約
[Amazon.co.jp](https://www.amazon.co.jp/gp/help/customer/display.html?nodeId=201909000)
「利用許可およびサイトへのアクセス」の項
> この利用許可には、アマゾンサービスまたはそのコンテンツの転売および商業目的での利用、製品リスト、解説、価格などの収集と利用、~中略~ **ロボットなどのデータ収集・抽出ツール**の使用は、一切含まれません。

[Facebook](https://ja-jp.facebook.com/legal/terms#other-terms-policies)
「2. Facebookで共有可能なコンテンツおよび認められる行為」の項
> 弊社から事前の許可を得ることなく、**自動化された手段を用いて**製品のデータにアクセスしたり取得したりすることや、アクセス許可のないデータへのアクセスを試みることを禁止します。

[Instagram](https://help.instagram.com/581066165581870)
「Instagramで禁止されている行為」の項
> 不正な方法を用いて、アカウントの作成、情報へのアクセス、または情報の取得を試みることは禁止されています。
> これには、弊社から明示的な許可を得ることなく、**自動化された手段を用いてアカウントを作成したり、情報を取得したり**する行為が含まれます。

[Flickr](https://www.flickr.com/help/terms)
「4. Restrictions」の項
※訳が間違ってたら教えて下さい。いまいちmay notのニュアンスがわからないなぁ。

> Except as otherwise expressly permitted herein, you may not use the Services or the Flickr Materials to engage in any of the following prohibited activities:
> （この利用規約の中で明記されている別段の許可を除き、以下の禁止行為によるFlickrのサービスや写真等コンテンツの利用は認められない）
> ~中略~
> ・scraping or otherwise using any data mining, **robots or similar data gathering** or extraction methods on or in connection with the Services;
>（マイニング、**ロボット、又はそれらに相当するデータ抽出ツール**によってFlickrサービスからWebスクレイピング等を行う事）

　これらはいずれもグローバルにサービス展開しているサイトで、今のところ国内企業のサイトでは利用規約でロボットに触れている例は少ないですが、RPAの普及に伴い利用規約が追加される可能性もあります。

　そもそも人間にサイトに来てもらって、その人間が気に入った広告をポチったり商品を購入する事で収入を得てサイトが成り立っているので、自動でロボットがやってきて情報だけ取っていく事をサイト側が快く思うわけがありません。

　一定の間隔で定期的にアクセスするようなケースでなければ、人間によるアクセスかロボットによるアクセスかをサイト側で見分けるのは難しいと思いますが、知らずに利用規約に反する行為を続けて後で訴えられるリスクを抱える前に、利用規約は事前に＆定期的にチェックしておきましょう。
　企業で使う場合は法務部門にも相談ですね。

---
今回はここまで。
テクニカルな話ではないのでQiitaに投稿するべきか悩みましたが、私自身、利用規約にロボット禁止が書かれている事を今まで知らなかったので、RPA開発に関わる方々に知ってほしいと思い投稿しました。

## 番外編
ブラウザゲーム（[インペルアル・サガの例](http://www.imperialsaga.jp/terms/)）
「第13条 禁止事項及び処分について」の項
> (18)**プログラムその他手段を用いて自動的に特定の行為を繰り返す**ことにより本サービスを利用する行為

　まぁロボットで自動的にレベル上げやコイン稼ぎされたら運営側も確かに困るよなぁ・・・RPAで出来るほど単純な操作じゃないとは思うけど。
　でも人はいつの時代も考える事は同じで、昔もSFCタクティクスオウガで一晩中COMのクレリック同士に石を投げ合いっこさせて自動でレベル上げる（で、翌朝高レベルになったクレリックにチーム全員で背後から石を投げまくる）なんてやってたよね。
Unity2DでiPhone10対応を行う

iPhone10が登場して最近困ったのが10の上部分であります。
ほかの端末と異なり10は上部が出っ張っているため専用の対応を行わなくてはならないのでそれについて今回は書いていきます。

#開発環境
Unity　2018.1.5f1
Visual Studio 2017
Windows10


#対応方法
今回のテーマの対応法はいくつかありますが、本件ではiPhone10の上部のサイズ分ずらすというやりかたでいきたいと思います。




#UnityでiPhone10の画面サイズの表現
iPhone10の高さと幅のサイズは1125x2436なので
![iPhone10画面の下準備.png](https://qiita-image-store.s3.amazonaws.com/0/269147/272c87a6-8c61-c475-86f5-8ad979c1b9ae.png)

四角で覆っている部分をそれぞれ設定してiPhone10の環境を作ります。
※カメラは必要ありません

#実際にiPhone10を想定して画面表示をしてみる
まず初めに、何も考えずに左上に文字を描画してみました。
![左上描画.png](https://qiita-image-store.s3.amazonaws.com/0/269147/98bae87a-dbb1-dd2c-dbe1-f51856f294fd.png)



上部分がかぶっているのがわかると思います。
ほかの端末ですと特に問題はありませんがiPhone10だと文字が一部隠れて見えなくなってしまいます。


#対応
まず初めに画面をずらすための下準備をします。
![mudai.png](https://qiita-image-store.s3.amazonaws.com/0/269147/ef8304f2-f891-cbe0-7305-2d6113df4c63.png)

もともとCanvasの下にtextがあったと思いますが。
画面全体をずらすためにオブジェクトを追加しその下にTextをいれます。（この対応を行うことで以降、新規でオブジェクトをDisplaceWindowの子として追加した際にそのオブジェクトは全てずれてくれる）

次に画面をずらすための処理です。

```C#:iphone10_supported
[SerializeField] RectTransform gameWindow;

    float left, bottom, right, top = 0f;

	void Awake()
    {
        //今回は上部分をずらすのでTopのみ修正
        top = ;//任意サイズ

        //gameWindow.offsetMin = new Vector2(left, bottom);//下部分をずらしたいときに使用
        gameWindow.offsetMax = new Vector2(right, top);
    }
```

上記で作成したスクリプトを
任意のオブジェクトを指定→Add Component→iphone10_supported
の順番で適応しgameWindowに、ずらしたいオブジェクトを追加してください。
![タイトルなし.png](https://qiita-image-store.s3.amazonaws.com/0/269147/754ad209-68d6-f005-4298-871a1690e573.png)

上記の設定後実行してみると。
文字がずれてiPhone10の上部にかからずに表示されるかと思います。
![実行.png](https://qiita-image-store.s3.amazonaws.com/0/269147/5183b1c9-8399-36fd-cd05-c9eb73175421.png)
pythonのジェネレータ式で卒業生総代を求める

Pythonのドキュメントである“Python Documentation contents”においてジェネレータ式の例として次のようなスニペットがさらりと紹介されています。
https://docs.python.jp/3/tutorial/classes.html

同様に、Guido Van Rossumの「Python チュートリアル第3版」においても、「#卒業生総代」のコメントの下、同じものが掲載されています。

```python3:
#卒業生総代
valedictorian = max((student.gpa, student.name) for student in graduates)
```

もちろん、これだけを実行してもエラーになってしまいます。「これくらい、推測しなさい」ということでしょうが、初心者にはさっぱりわかりません。そこで、このジェネレータ式がどのような文脈によるものなのか推測してみたいと思います。ピント外れだとしたら、ご指摘いただけると幸いです。

まず、登場する変数の意味は、次のとおりです。

valedictorian:卒業生総代（が述べるスピーチ）
gpa（Grade Point Average）：学生の成績評価値
student in graduates：卒業生

これにmax関数を用いて計算をしているので、まず、成績評価値が一番高い学生に卒業生総代としてのスピーチをお願いしようということが想像できます。
次に、”max((student.gpa, student.name)”とあるので”student”というクラスがあり、”gpa”と”name”はそのアトリビュート（変数）なのかな？と推測しました。
ここでは、例として卒業生は3人で名前（name）と成績評価値（spa）は次のとおりとします。

name='Tom',gpa=90
name='Bob',gpa=80
name='Ben',gpa=100

さっそく、studentクラスを定義し、Tom,Bob,Benの3人のインスタンスを作成するとともに、”name”と”gpa”をセットします。


更に卒業生3人分のインスタンスを、graduatesというタプルにまとめて条件が整いました。
次のスニペットを実行すると、最もgpaが高かったBenの名前と成績評価値の組合せがタプルとして返されます。

```python3:
"""
ジェネレータ式を使い、卒業生総代の点数と名前を調べる
"""
#クラスの定義
class student():
    def __init__(self, name, gpa):
        self.name = name
        self.gpa = gpa

#卒業生ごとのインスタンスの作成
Tom = student(name='Tom', gpa=90)
Bob = student(name='Bob', gpa=80)
Ben = student(name='Ben', gpa=100)

#卒業生のインスタンスをタプルにまとめる
graduates = (Tom, Bob, Ben)

#ジェネレータ式を使い、卒業生総代を調べる

valedictorian = max((student.gpa, student.name) for student in graduates)
print(valedictorian)
```

結果は(100, 'Ben')となり、望ましい答えを得ることができました。
Python3.7にアップデートしてパッケージをインストールしようとするとエラーが出て失敗する場合の対処法

`Python 3.7`が公開されたので早速使ってみたのですが、`scikit-learn`を`pip install`しようとすると以下のようなエラーが大量に発生してインストールできませんでした。

```
sklearn/cluster/_dbscan_inner.cpp:6034:13: error: ‘PyThreadState {aka struct _ts}’ has no member named ‘exc_traceback’; did you mean ‘curexc_traceback’?
     tstate->exc_traceback = local_tb;
             ^~~~~~~~~~~~~
             curexc_traceback
```
`scikit-learn`以外でも同じエラーが発生してパッケージがインストールできないものがあったので、原因を調べると、`Python 3.7`の C API の改善の関係で、Cythonが吐き出すコードに修正をする必要があったことが原因のようです([参照](https://github.com/cython/cython/issues/1955))。すでに`Cython`の方は`Python 3.7`に対応済みなので、パッケージの方のCコードを再生成するとエラーは消えてインストールできるようになります。

ソースコードをダウンロードして`pip install`するとインストールできるようになる場合もありますが、scikit-learn`の場合は、GitHibのリリースからソースコードをダウンロード( https://github.com/scikit-learn/scikit-learn/archive/0.19.1.tar.gz )して、そのままインストールしようとすると次のような別のエラーが発生します。

```
[17/40] Cythonizing sklearn/metrics/cluster/expected_mutual_info_fast.pyx
    Error compiling Cython file:
    ------------------------------------------------------------
    ...
    # cython: cdivision=True
    ^
    ------------------------------------------------------------
    
    sklearn/metrics/cluster/expected_mutual_info_fast.pyx:1:0: 'sklearn.metrics/cluster.expected_mutual_info_fast' is not a valid module name
```

`Cython ファイル名`でそのファイルのCコードを生成できるので、解凍して以下のコマンドで`scikit-learn`のインストールが成功しました。

```
cython scikit-learn-0.19.1/sklearn/metrics/cluster/expected_mutual_info_fast.pyx
pip install scikit-learn-0.19.1
```
`scikit-learn`の場合であれば、`Python 3.7`に対応した`PyPI`のパッケージがすぐに公開されるのでそれを待てばいいのですが、マイナーなパッケージの場合は対応に時間がかかる場合があるので、このことを知っれいればパッケージがインストルできないので`Python 3.6`に戻すというケースを減らせると思います。
Angular6の地味な変更でRouting処理にハマった話し

Angular5のサンプルプログラムを元に開発していてときの話しです。
Angular5→Angular6の地味な変更でハマりました。

## プログラム
```javascript
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { RouterModule, Routes } from '@angular/router';

import { HomeComponent } from './home/home.component';
import { UserListComponent } from './users/user-list/user-list.component';

const routes: Routes = [
  { path: '', component: HomeComponent },
  { path: 'users', loadChildren: 'app/users/users.module#UsersModule' }
];

@NgModule({
  imports: [CommonModule, RouterModule.forRoot(routes)],
  exports: [RouterModule],
  declarations: []
})
export class AppRoutingModule {}

```

```javascript
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { RouterModule, Routes } from '@angular/router';
import { UserListComponent } from './user-list/user-list.component';
import { UserDetailComponent } from './user-detail/user-detail.component';

const routes: Routes = [
  { path: 'list', component: UserListComponent },
  { path: 'detail/:user_id', component: UserDetailComponent }
];

@NgModule({
  imports: [CommonModule, RouterModule.forChild(routes)],
  exports: [RouterModule],
  declarations: []
})
export class UsersRoutingModule {}
```

```javascript
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { RouterModule, Routes } from '@angular/router';
import { UserListComponent } from './user-list/user-list.component';
import { UserDetailComponent } from './user-detail/user-detail.component';

const routes: Routes = [
  { path: 'list', component: UserListComponent },
  { path: 'detail/:user_id', component: UserDetailComponent }
];

@NgModule({
  imports: [CommonModule, RouterModule.forChild(routes)],
  exports: [RouterModule],
  declarations: []
})
export class UsersRoutingModule {}
```

## エラー内容
`rejection: Error: Cannot find module "app/users/users.module"`

リンクをクリックとブラウザのコンソールにエラーが出力され、画面遷移できない現象が発生します。
**※Angular5では正常に動作します。**

## 解決策
該当箇所のパスが悪いようで`app/users/~`を`./user/~`に変更することで解決しました。

```javascript
  { path: 'users', loadChildren: './users/users.module#UsersModule' }
```



## 最後に
簡単な修正でしたが、以前は正常に動いていたという先入観からドハマりしました。
メジャーバージョンアップで壊滅的な変更があると聞いていましたけど、情報が出揃うまでは気軽に新バージョンを利用しないほうが良さそうです。せめて互換性は残しといてほしいかな・・・。
幸せなプロジェクトと不幸なプロジェクトを考えていて、ふと思ったこと

休み中にスーパー銭湯で湯に入りながら、なんか、ふと思ったのでまとめてみました。
*PMだけでなく、PL、PGや他の役職の場合も同じかな・・

[順風満帆に成功するプロジェクトのPM(超優秀)]
・メンバーが、一人で自宅やカフェで作業する時以上のパフォーマンスを出せるように、環境づくりできる
・アサイン、タスク管理の仕方がすごく上手い
仕事だけでなく飲みにケーションの仕方も上手い、たまにメンバーと一緒にランチしたりもする
(実践できる人はおそらく、どの会社からも重宝される)
・タスクが遅れたら、人ではなく事を中心にして(責任追及ではなく、どうすれば解決できるかを中心にして)、課題解決につながる方法を迅速に考える
そもそもタスクが遅れる前に、メンバーが困ってることがないかを積極的に相談する

[成功するプロジェクトのPM(優秀)]
・メンバーが、一人で自宅やカフェで作業する時と同じ程度のパフォーマンスを出すように、環境づくりできる
・管理は要点を絞り、メンバーの進捗報告などに必要以上の余計な時間をかけさせない
出来るだけ、メンバーが作業に集中しやすいように、余計な手間を省いてくれる
・タスクが遅れたら、人ではなく事を中心にして(責任追及ではなく、どうすれば解決できるかを中心にして)、課題解決につながる方法を考える

[(特に大きなトラブルなどがなければ)成功するプロジェクトのPM(普通)]
・メンバーが、一人で自宅やカフェで作業する時に比べると若干パフォーマンスは落ちるものの、出来るだけ作業に集中できるように環境づくりできる
各phaseで、ところどころ遅れが出ることはあるものの、全体として大きな遅れは出さない
・市販に出回ってるような本に記載されてるやり方で、タスクを管理(git issue、backlog、redmineなど)
メンバーが、なるべく作業しやすいように配慮したり、課題を意識する
・タスクが遅れたら、少し時間はかかるものの、人ではなく事を中心にして(責任追及ではなく、どうすれば解決できるかを中心にして)、課題解決の方法を考える

[炎上するプロジェクトのPM]
・メンバーが、一人で自宅やカフェで作業する時には普通に出来ることまで、出来なくさせる
そもそもの顧客要求仕様に必要となるベース知識を持っていない、理解していない
・管理が細かすぎる(極端な例で言えば、メンバーが進捗報告だけで1時間以上も費やされるなど・・)
or 逆に全く管理しない(全放置)
*但しメンバーが元々優秀な場合は、放置したほうがパフォーマンスが捗ることもある
・タスクが遅れたら、他責する、陰口をたたく(自分は悪くない、メンバーが悪い、顧客が悪い・・)
jQueryを知らなくてもHTMLで登場アニメーション

今回はサイトで使えるように
誰でも簡単に出現アニメーションをつけれるように作ってみました。

divでもaタグでも何でも使えます。

注意点 "marginが消えます。"


![y93ta-z9ng2.gif](https://qiita-image-store.s3.amazonaws.com/0/264677/98c2ba1a-1890-9bc6-0df8-8ef6274518a0.gif)


##使い方
```css:css
body {
	overflow-x: hidden;
}
[vector="left"]{
	opacity: 0;
	margin-left: 1000px;
}
[vector="right"]{
	opacity: 0;
	margin-right: 1000px;
}
[vector="top"]{
	opacity: 0;
	margin-top: 1000px;
}
[vector="bottom"]{
	opacity: 0;
	margin-bottom: 1000px;
}
```
```html:html
<h2 class="anim" type="linear" time="1000" vector="left">左へ 1</h2>
<h2 class="anim" type="linear" time="2000" vector="left">左へ 2</h2>
<h2 class="anim" type="swing" time="4000" vector="left">左へ 3</h2>
<h2 class="anim" type="linear" time="1000" vector="right">右へ</h2>
<h2 class="anim" type="linear" time="3000" vector="top">出現</h2>
```

まずclassに **anim** を追加します。

typeは **linear** と **swing** の2つがあります
これらの違いは、linearは一定速度で動くのに対して
swingは真ん中辺りが一番早くなり、最初と最後は緩やかになります。
振り子みたいなものです

timeはアニメーションが終了するまでの時間を
1000 / 1秒 で指定できます。
つまり4000を指定すると 4秒間アニメーションします。

vectorは加える方向を指定します。
まあ移動させたい向きを指定してください。


JavaScriptのソースを貼ります
くそソースだけどゆるちて

```javascript:javascript
$(window).on("scroll", function(){
	$('.anim').each(function(){
		let elem = $(this);
		let anim_type = elem.attr("type");
		let anim_time = elem.attr("time");
		let anim_vector = elem.attr("vector");
		if(isScrolledIntoView(this)){
			async function anim(){
				await animate(elem, anim_vector, anim_time, anim_type);
			}
			anim();
		}
	});
});
async function animate(elem, anim_vector, anim_time, anim_type){
	let vec = "margin-" + anim_vector;
	elem.animate({
		opacity: 1,
		[vec]: "0px"
	}, {
		duration: Number(anim_time),
		easing: anim_type
	});
}
function isScrolledIntoView(elem){
	try {
		let docViewTop = $(window).scrollTop();
		let docViewBottom = docViewTop + $(window).height();
		let elemTop = $(elem).offset().top;
		let elemBottom = elemTop + $(elem).height();
		return ((elemBottom <= docViewBottom) && (elemTop >= docViewTop));
	} catch(error) {
		console.log(error);
	}
}
```
プロンプトの設定変更

# プロンプトの設定変更

Macのターミナルで使っているBashの設定を変えたので、個人的なメモとして残しておく。


## 要件

- 個人情報
  メモとしてターミナルの表示をコピーしたいので、ホスト名やユーザー名などの個人的な情報は、載せないようにしたい。

- 時間
  時間を意識した作業を行っていきたいので、日時を常に表示しておきたい。

- カレントディレクトリ
  `pwd` を打つ頻度が高いと思ったので、絶対パスは常に表示しておきたい。

- 色で識別
  情報を感覚で識別したいので、カラフルに色分けした。

## 現状確認

```  
echo “$PS1”  
```

## 変更と即確認

設定したいパターンを`PS1`に代入して試していく。

```
$ export PS1=“$” 
```

## ジェネレーター

[http://xta.github.io/HalloweenBash/](http://xta.github.io/HalloweenBash/)

## 決めた設定

```  
export PS1="\[\e[1;36m\]\d \[\e[1;32m\]\t \[\e[1;33m\]\w \[\e[0;31m\]\$\[\e[m\] "  
```

## ユーザ識別

- rootユーザー
  `#`

- 一般ユーザー
  `$`
spring-securityで自前ログイン画面のリダイレクトURLがおかしくてログイン失敗する

## 現象
spring-security環境下でログインすると最初だけ失敗し、二回目以降は正常に認証される。

## 原因
自前ログイン画面へのリダイレクトURLの組み立て方が誤っていた。

### 詳細
自前のログイン画面の表示には以下のようなコントローラーを用意していた。

```java
@Controller
@RequestMapping("/login")
public class LoginController {
    @GetMapping
    public String index(Optional<String> error) {
        ...
    }
}

```

次に、```/```に来た場合に```/login```へリダイレクトさせるのに以下のようなコントローラーを用意していた。

```java
@Controller
public class TopController {
    @GetMapping("/")
    public String index() {
        return "redirect:" + MvcUriComponentsBuilder.fromMethodName(LoginController.class, "index", "").build().toUri().toString();
    }
}
```

しかしこの指定方法は間違っておりリダイレクトURLが```http://localhost:8080/login?error=```になってしまう。このURLは端的に言えばログインエラー表示用のURLである。

まず、このURLにリダイレクトするとログイン画面が表示される。ところで、spring-securityには```SavedRequest```というログイン前にアクセスしていた直前URLがあればログイン後にそのURLに飛ばす、という機能がある。この場合の直前URLはログインエラー用の```login?error=```である。このため、ログインに成功するとログインエラーのURLに飛ばされる、という動作になってしまう。

### 対処
MvcUriComponentsBuilderの使い方を変えた。

```java
return "redirect:" + MvcUriComponentsBuilder.fromController(LoginController.class).build().toUri().toString();
```

ぶっちゃけ```MvcUriComponentsBuilder```と<code>Optional<String></code>の関係性が良く分からなかったので妥協した。
オフラインリアルタイムどう書く E25 の実装例(ruby)

問題 : https://mtsmfm.github.io/2018/07/07/doukaku-e25.html
実装リンク集 : https://qiita.com/mtsmfm/items/9e06456b4330305d4ed0

で。

ビッグセブン という問題を解いた。

30分ぐらいで解いて、そのあとちょっとまとめたのが以下の実装例。

```ruby:ruby2.5
# frozen_string_literal: true

require "json"

class Seven
  def initialize( w, h )
    @w=w
    @h=h
  end

  def inmap?( p )
    0<=p.real && p.real<@w && 0<=p.imag && p.imag<@h
  end

  def create_seven( s0, s1 )
    return nil if s1==s0
    d1 = s1 - s0
    s2 = s1 + d1 * 1i
    return nil unless inmap?(s2)
    s3 = s2-d1*2
    return nil unless inmap?(s3)
    [d1.abs, [s1, s2, s3]]
  end

  def find(s0)
    @w.times.flat_map do |x1|
      @h.times.flat_map do |y1|
        r=create_seven(s0, x1+y1*1i)
        r ? [r] : []
      end
    end
  end
end

def result_of(r)
  return nil if r.empty?
  maxd = r.max_by{ |e| e[0] }[0]
  cands = r.select{ |e| e[0]==maxd }
  cands.size==1 ? cands[0][1] : nil
end

def solve( src )
  w, h, x, y = src.scan( /\d+/ ).map(&:to_i)
  r=result_of(Seven.new( w, h ).find(x+y*1i))
  r ? r.map{ |e| "(#{e.real},#{e.imag})" }.join(",") : "-"
end

DATA = JSON.parse(%q!
  [
    {
      "input": "4,7,(0,3)",
      "expected": "(0,0),(3,0),(3,6)"
    },
    {
      "input": "4,6,(3,3)",
      "expected": "(2,5),(0,4),(2,0)"
    },
    {
      "input": "200,200,(24,134)",
      "expected": "(0,45),(89,21),(137,199)"
    }
  ]
!).freeze

$stdout.sync=true

DATA.map{ |o|
  actual = solve(o["input"]).to_s
  okay = actual == o["expected"]
  puts "%s s:%s a:%s e:%s" % [(okay ? "ok" : "**NG**"), o["input"], actual, o["expected"]]
  okay
}.all?.tap{ |x| puts(x ? "okay" : "something wrong") }
```

いつもどおりテストデータの大半は省略。

総当たりで解決という作戦。
もう少しなら計算量を減らすアイディアはあるけど、今回のテストデータはこれで0.3秒で終わるのでこのままで。

劇的に計算量を減らすアイディアはない。

平面上での回転を使いたい問題なので、複素数ととても相性が良い。

あと。

珍しくクラスを作ってみた。
画面キャプチャ Win+Shift+S キー

[PC Watch:画面キャプチャアプリ「Snipping Tool」の削除を予告](https://pc.watch.impress.co.jp/docs/news/1130121.html)

Snipping Toolがなくなるかも

Winキー＋Shiftキー＋Sキーで、「四角形の領域切り取り」ができてクリップボードに張り付けられる
Qiitaは、そのまま張り付けられるから便利。
【Unity】Material のプロパティの値をゆっくり変える

Unity の有料アセット ShaderWeaver を使ってゆっくり表示するということをやりたかったが、本家が手動でゆっくり表示していたのでスクリプトから変更できるようにしました。

**本家の動画**
[Shader Weaver Tutorial 7 - Alpha Node](https://www.youtube.com/watch?v=rDUe-eCGBGM)

**内容を翻訳されているサイト**
[【Unity】「Shader Weaver」チュートリアル６ - 少しずつ浮かび上がる文字を作る](http://baba-s.hatenablog.com/entry/2017/09/29/094143)

シェーダーを設定している Quad に以下のスクリプトを設定

```BankruptShaderScript.cs
public class BankruptShaderScript : MonoBehaviour {

    // coroutine を呼び出し
    void Start () {
        StartCoroutine(UpdateBankruptShader());
        
    }

    IEnumerator UpdateBankruptShader()
    {
        // Material 内部の progress プロパティ値が 2f になるまで繰り返し
        while (this.GetComponent<Renderer>().material.GetFloat("progress") < 2f)
        {
            // Material 内部の progress プロパティの値を 0.01f 加算
            this.GetComponent<Renderer>().material.SetFloat("progress", this.GetComponent<Renderer>().material.GetFloat("progress") + 0.01f);
            // 0.01sec 待つ
            yield return new WaitForSeconds(0.01f);
        }
    }
}
```

以下のように徐々に表示されます(でてくるのが物騒な文言ですみません。。。)
![GIF.gif](https://qiita-image-store.s3.amazonaws.com/0/166357/6fbeb90e-84cd-6c80-9600-ba361c6fbc62.gif)

**上記のフォント**
[FZイモケンピ](http://zone108.main.jp/font/fz-imokenpi.html) (108号様)

**参考にしたページ**
[マテリアルのプロパティをスクリプトから変更【Unity】](http://kan-kikuchi.hatenablog.com/entry/Material)


現場からは以上です。