OmniAICreator/Qiita-1.07M huggingface dataset:
Galaxy ServerをDockerを利用して起動した時にユーザー登録をできないようにしたい

#自由にユーザー登録できないようにしたい
昨日の記事では登録されていないユーザーがGalaxyのToolを勝手に利用できない用にする方法について述べた
もちろん、登録ユーザーは自由に利用できるのだけれど、ちょっとした問題が有る
それは、ユーザー登録が比較的容易にできるということ
![Screen Shot 2018-12-13 at 23.00.52.png](https://qiita-image-store.s3.amazonaws.com/0/213053/bda50155-53c9-43d4-e818-87ddd1945c3a.png)

そこで、ユーザー登録についても制限したい場合にどうすれば良いのだろうか
Galaxyにはそのような場合に備えた設定が有る
設定項目の`allow_user_creation`がそれに対応する

|Parameter|Description|Default|
|:--|:--|:--|
| allow_user_creation | Allow unregistered users to create new accounts (otherwise, they will have to be created by an admin). |true|

上記の設定項目をFalseにすることで、外部のユーザーが勝手に利用者登録を行えないようにできる

```bash
$ docker run -d --rm \
    -p 8080:80 -p 8021:21 -p 8022:22 -p 8800:8800 \
    --volumes-from galaxy-store \
    --privileged=true  \
    -e GALAXY_CONFIG_ENABLE_BETA_MULLED_CONTAINERS=True \
    -e GALAXY_CONFIG_REQUIRE_LOGIN=True \    
    -e GALAXY_CONFIG_ALLOW_USER_CREATION=False \    
    -e ENABLE_TTS_INSTALL=True \
    bgruening/galaxy-stable
```

Docker上での運用で無い場合には、galaxy.ymlに`allow_user_creation: False`を追記して欲しい

この設定でGalaxyを起動すると
上部のメニューの対応部分が`Login`のみとなり、自由にユーザーを追加することはできなくなる
![Screen Shot 2018-12-13 at 23.17.20.png](https://qiita-image-store.s3.amazonaws.com/0/213053/d07750d1-2548-ce0f-8fe4-536dba601b4c.png)
この設定にした場合には、ユーザを追加するにはadminの権限を持つユーザーが処理しなければならない
今回はここまで:smile:
SpringBoot+ThymeleafのアプリでCSSが読み込めない

サーバーサイドの勉強のためにSpringBootで簡単なTodoアプリを作ってるのですが、CSSが全然ロードしてくれなくて結構な沼にハマったのでメモ。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/181516/b2e77bbd-c763-6b10-c274-5a4434a28311.png)
#パスの問題？
まず疑ったのがパスの指定の仕方。あるあるですからね。
いろんなパスの指定の仕方を試しました。それでもうまく行きません。

```
src/main/resources
├── application.properties
├── dump.sql
├── static
│   ├── css
│   │   └── style.css
│   └── js
└── templates
    ├── category
    │   └── list.html
    └── todo
        └── list.html
```

../../static/css/style.cssってやってみたり、css/style.cssってやってみたり・・
#ステータスコード400
ここで注目すべきなのが、コードが400であるということ。
一番上の画像を見てください。404 NOT FOUNDじゃないんです！
つまりパスが間違っているわけではない。これに気づくのにめっちゃ時間かかりました。
Abortedってなんや・・イミフ・・
#ブラウザの問題かもしれない
そう思ってFirefoxでも試してみました。（もとはChrome）
まあもちろんそんなはずはなく。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/181516/ee54d4f6-e6d3-98e9-0d38-b18f2c0183c3.png)
#あれ、なんかChromeより長い・・？
![error.gif](https://qiita-image-store.s3.amazonaws.com/0/181516/ca4a1c0f-dcb9-0492-d23d-a836e09ec12c.gif)
なぜかFirefoxさんはご親切にJava側のエラー内容まで教えてくれました。
####Failed to convert String to int....?
"css/style.css"部分をint型として処理しようとしている・・？なんで・・・？
ここでようやくハッと気づいたのですが、実はコントローラーでこんなものを作っていました。

```
@Controller
@RequestMapping("/{category_id}")
public class TodoController {
```
このパス変数category_idはint型なので、どうやらベースURLの直後に入ってきたものをなんでもintとしてコントローラーが処理しようとしちゃっててエラーになっていたようです。

というわけでコントローラーのパスを/categories/{category_id}に変更したら、無事CSSがロードしてくれました。

ありがとうFirefox。
（Spring側のログに普通にエラー内容書いてあった。）
「ペチャバト」を支える技術

12月12日水曜日に「[ペチャバト](https://itunes.apple.com/jp/app/id1444974380?mt=8)」のプレスリリースを出しまして、予想以上の大反響を頂いて感激しています。

![d29595-2-636457-4.png](https://qiita-image-store.s3.amazonaws.com/0/111366/94a7677d-8522-1946-7072-a8e1d2c78242.png)


ARKitにこの１年コミットしてきてようやく成果が出たという感じがしています。まだまだこれからですが、**モバイルARのヒット作**を自分の手で生み出せたことを嬉しく思います。

ということで、今記事では「**ペチャバトを支える技術**」をご紹介したいと思います。

# ペチャバトを支える技術

- Swift 4.2
- ARKit
- 独自技術(企業秘密らしい)

**アイデアが良かったのと、共有体験のプロセスの簡略化が鍵だった**と思います。あそこでCloudAnchors等を使って時間をかけていたら、多くが離脱していたでしょうし、ここまでバズらなかったと思います。

# 球のアニメーションと当たり判定

![image](https://camo.qiitausercontent.com/27f74a5d49c22453bc6b0ab80b4136a6cb48f293/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f3131313336362f33336239353462322d326138392d623431312d323135312d3664333733643332393165362e676966)

[ARオブジェクトの座標を操る方法チートシート](https://qiita.com/k-boy/items/7237219766856149c8d8)の記事で、球のアニメーションの方法を紹介しています。

当たり判定については、SceneKitの[Physics](https://developer.apple.com/documentation/scenekit/physics_simulation)です。

Physicsについてはまだ書いてなかったので、今回のアドベントカレンダー中にまた書きます。

# 空間共有の方法

![image](https://camo.qiitausercontent.com/e39c851ead36ae01372e718d8405e9befbebdf47/68747470733a2f2f7062732e7477696d672e636f6d2f6d656469612f4466417471535458304141546c72742e6a7067)

先日僕が書いた[ARKitで空間共有して端末間通信する方法22選](https://qiita.com/k-boy/items/e9adf3e4b64be9ed4635)にヒントが隠されています。この22通りの方法のうち２つくらいを使っています。

# 技術的制約
- iOS11~対応
- 空間共有のためのプロセスをより短く

この制約があるため、ARKit2.0のWorldMapは現状使っていません。

# ARKitを勉強したい方へ

ペチャバトを見て、ARKitをやってみたい！という方がいましたら僕の公開しているUdemyの動画講座が参考になるかもです！

- [【ARKit2.0対応】6つのチャレンジでARKitを徹底攻略 | Udemy](https://www.udemy.com/kboy-arkit/?couponCode=KBOYARKIT)
- [サンプルコード ARKit-Emperor](https://github.com/kboy-silvergym/ARKit-Emperor)


# ペチャバト！ダウンロードしてね！

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">「ペチャバト」早速FOLIOでも遊んでみたけどカオスでめっちゃ楽しい、AR系アプリで久々にテンション上がってる <a href="https://t.co/uwYS31Yvmy">pic.twitter.com/uwYS31Yvmy</a></p>&mdash; 広野 萌 (@hajipion) <a href="https://twitter.com/hajipion/status/1072701863156318208?ref_src=twsrc%5Etfw">2018年12月12日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

[ペチャバト - ARシューティングバトル](https://itunes.apple.com/jp/app/id1444974380?mt=8)

# 追記 2019/3/3
現在は独立してフリーランスになったためペチャバト開発には携わっていません。これからもペチャバトをどうぞよろしくお願いします！
Redis Module事始め

この記事は 富士通クラウドテクノロジーズ　Advent Calendar 2018 の13日目です．
昨日は @Ken-Moriizumi さんの「溜まったアレをごっそり年末に掃除する話」でした．

# Redis Module 事始め

こんにちは @blue271828 です．暫くRedis を触っていなかったのですが，いつの間にか Redis Module という新しい機能が追加されたことを知りました．Luaスクリプティング機能だと届かなかった痒い所に手が届く感じで素敵だったので紹介したいと思います．


## Redis Module とは

Redis Module とは Redis 4.0 より追加された機能で，C, C++ で実装したモジュールを Redis にロードすることで色々な拡張機能を実現することができる仕組みです．例えば複数の key を一度のコマンドで操作したり，独自データ型が作れたりします．


## やってみる

[redismodule.h](http://download.redis.io/redis-stable/src/redismodule.h) をインクルードして実装します．引数の文字列を key にして，"Hello, World!" をリスト型に追加するシンプルな処理です．


```c:helloworld.c
#include "redismodule.h"
#include <stdlib.h>
#include <string.h>

int HelloWorld_RedisCommand(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) {
  /* 引数の数をチェック */
  if (argc != 2) return RedisModule_WrongArity(ctx);


  /* 引数の値をkeyにしてLPUSH */
  const char *hello = "Hello, World!";
  RedisModuleKey *key =RedisModule_OpenKey(ctx, argv[1], REDISMODULE_WRITE);
  RedisModuleString *str = RedisModule_CreateString(ctx, hello, strlen(hello));
  if (RedisModule_ListPush(key, REDISMODULE_LIST_TAIL, str) == REDISMODULE_ERR)
    return REDISMODULE_ERR;
  RedisModule_CloseKey(key);

  /* クライアントに値を返却 */
  if (RedisModule_ReplyWithString(ctx, str) == REDISMODULE_ERR)
    return REDISMODULE_ERR;

  return REDISMODULE_OK;
}

int RedisModule_OnLoad(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) {
  if (RedisModule_Init(ctx, "helloworld", 1, REDISMODULE_APIVER_1)
      == REDISMODULE_ERR) return REDISMODULE_ERR;

  if (RedisModule_CreateCommand(ctx,"helloworld",
                                HelloWorld_RedisCommand, "write", 1, 1, 1) == REDISMODULE_ERR)
    return REDISMODULE_ERR;

  return REDISMODULE_OK;
}
```

実装したファイルは，コンパイル後に Redis にロードすることで利用することができます．コンパイルは次のように行います．

```bash
$ gcc -O2 -shared -fPIC helloworld.c -o helloworld.so
```

ロードは Redisクライアントからロードする方法と，redis.conf などの設定ファイルに記述する方法があります．Redisクライアントで読み込む場合は，次のように入力します．正しくロードされると "OK" と表示されます．

```
> MODULE LOAD /path/to/helloworld.so
```

設定ファイルに記述する方法は次のよう書きます．

```
loadmodule /path/to/helloworld.so
```

## 動かしてみる

ロード後に実装したコマンドを使用すると，利用できるなることが確認できると思います．

```
127.0.0.1:6379> LRANGE hoge 0 -1
(empty list or set)
127.0.0.1:6379> HELLOWORLD hoge
"Hello, World!"
127.0.0.1:6379> HELLOWORLD hoge
"Hello, World!"
127.0.0.1:6379> LRANGE hoge 0 -1
1) "Hello, World!"
2) "Hello, World!"
```

Redis Cluster の場合ですが，通常のコマンドと同様に key hash に応じて各ノードにリダイレクトされます．ここで少し注意しなければならないのは，全ノードにモジュールがロードされていないとリダイレクト語に `unknown command` のエラーになってしまうため，Redis Cluster でモジュールを利用する為には事前に対象ノードにロードしておく必要があるようです．

```
127.0.0.1:7000> HELLOWORLD hoge
"Hello, World!"
127.0.0.1:7000> HELLOWORLD hogehoge
"Hello, World!"
127.0.0.1:7000> HELLOWORLD hogehogehoge
-> Redirected to slot [5990] located at 173.17.0.3:7001
"Hello, World!"
```


## あとがき

コマンドという形で Redis を拡張できるようになることから，Luaスクリプティング機能とは違った形で活用できる場面があると思います．個人的にはロードした処理をハッシュで呼ばなくてよくなるだけでも，かなり有難かったりします．また今回はあまり深堀りしませんでしたが，恐らく Redis Module ならではの拡張もあるのではないかと思いますので，また機会があれば紹介できたらと思います．

ちなみに明日ですが，どうやら @foobaron さんが何かネットワークネタをやってくれるそうです．お楽しみに！
Ruby on Railsにおけるeach,mapの性質

<h4>eachはブロックの引数を返す。</h4>
<h4>mapはブロックの戻り値を返す。</h4>

<h3>each</h3>
`a=[1,2,3]
b = a.each do |n| n+2`

と定義したとき、
`b = [1,2,3]`
となる。
ブロックでn+2と定義しているが、eachは引数をそのまま返すため、引数としての配列の要素は出力時にも変わらない。

<h3>map</h3>
`a=[1,2,3]
b = a.map do {|n| n+2}`

と定義したとき、
`b = [3,4,5]`
となる。
mapはブロックの戻り値を返すため、配列のそれぞれの要素nを＋２した要素により構成されている配列を返す。

<h5>条件がついたとき</h5>
`a=[1,2,3]
b = a.map do {|n| n+2 if n=4}`

とmapの戻り値をifで条件づけたとき、
`b = [nil,4,nil]`
配列の要素のうち条件に含まれない部分はnilとして出力される。
nilとして空白を含む配列ではなく、実数のみで構成される配列を返したい場合は`select`を使う。

<h3>select</h3>
`a=[1,2,3]
b = a.select do {|n| n+2 if n=4}`
と定義したとき、
`b = [4]`
このように、条件に合致している実数のみで構成される配列を返すことになる。
引数の数値を日本円表記に変えて戻り値とする

タイトルのとおりです。
基本的に[数値しか入力できないフォーム](https://qiita.com/kitsunecat/items/e5c5e2dbfc03f88ce434)に入力された値を使う用に書いたので、
数字以外が引数に入ってくることは考慮されていないです。

引数に数字を入れたら円表記にして返してくれます。
引数に`1000`とか入力したら`¥1,000`て返ってくるはずです。
返ってこなかったらごめんなさい。当方でも動作確認はしたんです。

無駄なコード多すぎだろうとか貶さないでください。僕も初心者なりに一生懸命考えて書いたんです。

```.js
// 数字を円表記に変換
function(money) {
    moneys = String(Number(money)).split('');
    let moneyLen = moneys.length;
    moneys.forEach( function(val,index,array) {
      if ((index+1) % 3 === 0  && index+1 !== moneyLen) {
        moneys.splice(moneyLen-(index+1), 0, ',');
      }
    });
    moneys.unshift('\¥');
    moneys = moneys.join('');
    return moneys;
  }
```

実際に使うときは

```.js
jQuery.extend({
  jpyen: function(money) { ・・・ }
})
```
とか関数定義して、`jQuery.jpyen(1000)`とかいう使い方をしています。
PHPの変数のスコープについて

PHPは制御構文(ifなど)でブロックされていても変数のスコープ(変数が使える範囲)が制限されないらしい。
スコープを狭くしたければ関数やメソッド内で定義するとよいらしい。
jsにこの辺は、似ている。

```php
<?php

$global = 'global';

if (! empty($global)) {
    // $globalはどこからでもアクセスできる
    $global = 'globaltest！！';
}

function local () {
    // 関数やメソッド内で定義するとこのブロックの外では使えない。
    $local = 'local';
}

// 使える　globaltest！！
echo $global;

// Notice: Undefined variable:
echo $local;

```

一年前くらいはローカルがなぜいいのかわからなかったが今ならわかる。
全然、覚えてないことろで定義した変数でバグるからだ。

パーフェクトPHPを読んでなるほどと思ったことをアウトプットしてみた。

参考文献
パーフェクトPHP
小川 雄大  (著), 柄沢 聡太郎 (著), 橋口 誠 (著)
出版社: 技術評論社 (2010/11/12)
https://www.amazon.co.jp/%E3%83%91%E3%83%BC%E3%83%95%E3%82%A7%E3%82%AF%E3%83%88PHP-PERFECT-3-%E5%B0%8F%E5%B7%9D-%E9%9B%84%E5%A4%A7/dp/4774144371/ref=tmm_other_meta_binding_swatch_0?_encoding=UTF8&qid=&sr=
HTML5ゲームエンジンの徹底評価[日本語訳] (3) PhaserとEgretEngine


こちらの記事の続き

- [HTML5ゲームエンジンの徹底評価 \[日本語訳\] (1) 2D・3D対応とプログラミング言語の比較](https://qiita.com/motoyasu-yamada/items/f4e03f98442b3ec164be)
- [HTML5ゲームエンジンの徹底評価 \[日本語訳\] (2) Three.jsとPixi.js](https://qiita.com/motoyasu-yamada/items/0139a933ded6f478f92a)

# Phaser コンセプト

意図的にPixi.jsを先に分析しました。というのもPhaser自身はレンダリング機能を持っていないからです。Pixi.jsのようなコンセプトで、Phaserは「デスクトップとモバイル向けのHTML5ゲームフレームワーク」というコンセプトです。Phaserは、ゲームエンジンではなく、ゲームフレームワークと定義されています。だからPhaserの機能やレンダリングは見慣れないものです。

> **ここの翻訳は自信なし**
> 所以，当你看到Phaser的功能设计和它的渲染内核时就不会经验了。
> →
> だからPhaserの機能やレンダリングは見慣れないものです。

##設計思想
Phaserはゲームフレームワークと定義されているとおり、ゲーム開発に必要な機能の大半を提供しています。Phaserは独自のレンダリングエンジンを持ちません、Pixi.jsをそのまま使っています。Pixi.jsのレンダリング性能が高いため賢い判断です。プログラミング言語は上に書いた通りです。ゲーム開発には複雑なロジックとたくさんのアルゴリズムが書かれるため、PhaserはTypeScriptをサポートしています。

アーキテクチャという点で、Phaserは、高度にカプセル化をされています。Pixi.jsを使ったことがあれば、レンダリングの設計思想には、Pixi.jsと違いがないことに気づくでしょう。APIはとても使いやすいです。Phaserはゲーム開発に必要なものをすべて提供しています。

ゲームインターフェースを作る際のPhaserの初期化時に、各段階で発生するイベントをカスタマイズすることができます。

```ts
var game = new Phaser.Game(800, 600, Phaser.AUTO, 'phaser-example', { preload: preload, create: create, update: update });
```

このコードでは、 Phaser は、`preload`、 `create`、 `update`などを定義しています。リソースが読み込まれたら、Phaserは`preload`コールバックを呼び出します。スクリーンがリフレッシュされたら、`update`コールバックが呼び出されます。Phaserの一番の機能は、イベント管理およびプラグイン管理だということができます。

## 機能
Phaserはたくさんの機能を提供していますが、大多数はサードパーティによって提供されています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/302078/85c43120-3dee-b7d4-a270-818189fddf31.png)

#Egretのコンセプト
EgretはHTML5エンジンとしては新しいエンジンです。たんにHTML5ゲームエンジンだけにとどまらず、公式サイトでば、「ゲームソリューション」と記載されており、HTML5には限定されてはいません。HTML5技術にもとづいたゲームエンジンの提供のみならずネイティブアプリにパッケージングするツールやその他周辺製品を提供しており、ソリューションと位置づけられています。

##設計思想
Egret EngineはTypeScriptに対応しており、2D/3Dの両方に対応しています。アーキテクチャはPixi.jsに近く、Adobe Flashの成熟した2Dアーキテクチャを参考にしています。APIもまたActionScriptを参考にしています。それだけにとどまらずTypeScriptのおかげで、イベントシステムでは、イベントのハンドラーを登録するメカニズムは`addEventListener`といった形で、ActionScriptの似ています。

EgretEngineのコア部分はモジュール型になっており機能ごとに分割されています。さらに興味深いのは、Adobe Flashの素晴らしいダーティーレクタングル(差分描画時に更新が必要なエリア)が実装されていることです。

Canvasモードでは、描画性能を向上させるためにダーティーレクタングルが実装されており、他のエンジンにくらべてそこが優れています。Adobe Flashに慣れていれば、Egret Engineで開発をはじめるのは大変ではありません。

##機能
モジュール型の設計のため、Egret Engineは機能はモジュールに分割されておりライブラリーという形で提供されています。下の表は対応しているモジュールのすべての機能をあわせたものです。ただしWeChat APIパッケージのようなプラットフォームAPIは含まれていません。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/302078/6b4e5c07-82e7-8a3b-012a-157549960691.png)


続く
[HTML5ゲームエンジンの徹底評価\[日本語訳\] (3) enchant.jsとcrafty.js](https://qiita.com/drafts/0402bf1759f823405355)
3カラムのHTML　参考記事の切りはり

「ヘッダー部→メイン部→サイド部1→サイド部2→フッター部」
の順番がベターと言えます。
なので、文章構造の順番を意識して、HTMLコーディング

```HTML
<body>
 <header id="header">
  ヘッダー部の中身
 </header>
 <div id="wrapper">
  <main id="main">
    メイン部の中身
  </main>
  <div id="side01">
    サイド部1の中身
  </div>
 </div>
 <div id="side02">
  サイド部2の中身
 </div>
 <footer id="footer">
  フッター部の中身
 </footer>
</body>
```
Amazon Personalize(preview)をAWS CLIから使う方法

#Amazon Personalizeのpreviewに当選したが...
今年のre:inventでもいっぱい新サービスが発表されたから片っ端からpreviewに申し込んだ:sunglasses:

そしたらAWSAmazon Personalizeのpreviewに当選した:kissing_closed_eyes:

さっそく↓のAWS公式ブログを参考に使ってみようと思たら...

[Amazon Personalize – すべてのユーザにリアルタイムパーソナライゼーションとレコメンデーション](https://aws.amazon.com/jp/blogs/news/amazon-personalize-real-time-personalization-and-recommendation-for-everyone/)

あたりまえやけどまだAWS CLIでPersonalizeが使えんかったわ。

#困ったときはドキュメントや
とりあえずドキュメントを見てみた。

そしたらこんなページを発見。

[Getting Started (Python Notebook)](https://docs.aws.amazon.com/ja_jp/personalize/latest/dg/getting-started-python.html)

ふむ、「notebookではじめる」か...

ちょっと気になったからGitHubのnotebookを見てみることに。

[personalize_sample_notebook.ipynb](https://github.com/aws-samples/amazon-personalize-samples/blob/master/personalize_sample_notebook.ipynb)

そんで気づいたわ。これブログの内容やん！ブログの内容より詳しいやつやん！

#てことで、CLIで使う方法

notebookに書いてある通りやからわざわざ書くまでもないけどせっかくやから書くわ。

```
wget -N https://s3-us-west-2.amazonaws.com/personalize-cli-json-models/personalize.json
wget -N https://s3-us-west-2.amazonaws.com/personalize-cli-json-models/personalize-runtime.json
aws configure add-model --service-model file://`pwd`/personalize.json --service-name personalize
aws configure add-model --service-model file://`pwd`/personalize-runtime.json --service-name personalize-runtime
```

#わからんこと

いつもコンソールで甘えてるからわからんけど、AWS CLIてこんな風にplugin?みたいな感じで機能追加できんのかな:thinking:

#で、肝心のPersonalizeは...
データをインポートしたいけどS3の権限周りでエラーでまくりですわ...

S3の権限周りの機能多スギィ:rage:

以上、ばいにゃら。
Selectorで文字列からメソッドを呼び出す(Swift4.2)

# はじめに
つい最近、文字列からセレクタを作成してメソッドを呼び出すというのをやりました。検索すると引数なしのメソッドの書き方はすぐ見つかったのですが、引数ありの書き方が見当たらない...ということでその辺りについて書きます。

# 引数なしの場合
引数なしの場合は下記のように書きます。

```Swift
perform(Selector("testAction"))

@objc
private func testAction() {
	print("testAction")
}
```

Selectorの呼出がObjective-C方式なので呼び出すメソッドには`@objc`が必須です。
Selectorを呼び出す前に下記のようにメソッドがあるかチェックを入れたほうがいいと思います。

```Swift
let selector = Selector("testAction")
if responds(to: selector) {
	perform(selector)
}
```

# 引数ありの場合
引数なしの場合は単純ですが、引数があると少し苦労します。（小一時間悩みました...）

```Swift
@objc
private func testAction(value: String) {
	print("testAction value=\(value)")
}
```

上記のようなメソッドを呼び出す場合`perform(Selector("testAction:"), with: "value")`で呼び出せるかと思ったのですが、これではダメなようです。

上記のメソッドを呼び出すには下記のようになります。

```Swift
let selector = Selector("testActionWithValue:")
if responds(to: selector) {
	perform(selector, with: "value")
}
```

`testActionWithValue:`というようにObjective-Cの形式で書いてあげなければいけないようです。

## その他呼び出し色々
引数ラベルなし

```Swift
let selector = Selector("testAction:")
if responds(to: selector) {
	perform(selector, with: "value")
}

@objc
private func testAction(_ value: String) {
	print("testAction value=\(value)")
}
```

引数複数

```Swift
let selector = Selector("testActionWithValue1:value2:")
if responds(to: selector) {
	perform(selector, with: "value1", with: "value2")
}

@objc
private func testAction(value1: String, value2: String) {
	print("testAction value1=\(value1) value2=\(value2)")
}
```

引数に数値

```Swift
let selector = Selector("testActionWithIntValue:")
if responds(to: selector) {
	perform(selector, with: NSNumber(value: 10))
}

@objc
private func testAction(intValue: NSNumber) {
	print("testAction intValue=\(intValue.intValue)")
}
```

# 最後に
文字列でのメソッド呼び出しについて書きましたが、Selectorを使うなら通常は下記の実装になると思います。
文字列でやると警告出ますし...

```Swift
let selector = #selector(testAction())
perform(selector)

@objc
private func testAction() {
	print("testAction")
}
```

サーバーなどから通信でメソッド名を取得して呼び出すとかあるかもしれませんが、その場合は文字列ではなく数値でもらってenum切って呼び出すメソッドを切り替えた方がいいと思います。

今回はどうしても文字列でメソッド呼び出したいっていうので、このように書きましたがほぼ使い所はないような気がします...（だから検索しても見当たらないのかも）
Shinyを使ってCIログを分析している話

本記事は、[Shiny Advent Calendar 2018](https://qiita.com/advent-calendar/2018/shiny)の14日目の記事です。

2018年ももうすぐ終わりますね。アドベントカレンダーの趣旨とは別に、自分で勝手に今年を振り返ると、今年もいろいろとRとShinyに触れることができた一年でした。[useR!2018に参加と発表](http://gingi99.hatenablog.com/entry/2018/07/22/223504)できたことは仕事とは関係なくともRをもっとやろうと思えて、刺激的でした。

という前置きのまま、、、今年作ったShinyアプリの1つを本記事では紹介します

### この記事でわかること
Shinyを使ったログ分析ダッシュボードのケーススタディ （つまり、技術の話はないです）

### 背景

- Gitlab CIを用いてデータのETL処理のジョブバッチを定期的に行っている
- このようなETL処理のジョブバッチは複数のプロジェクトで、それぞれのデータに応じたパイプラインが存在しており、ジョブの失敗ログを横断的にモニタリングするツールがほしい
- ログをモニタリングするだけだと、OSSのDashboardツールで十分なのだが、**分析**（例えばメッセージログ同士の類似度に基づいて、クラスタを組み、どのクラスタのログが増えてるかも見たい)をRでやっていると、そのままRのコードからダッシュボード化できたほうがリッチなこともできる

また、GitLab Advent Calendar 2018 の[Gitlab APIでデータ活用を進めよう](https://qiita.com/gingi99/items/a10d1a868a2bf6fe8a7c#%E7%9B%AE%E7%9A%843--%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%A8%AA%E6%96%AD%E3%81%A7gitlab-ci%E3%81%AE%E5%A4%B1%E6%95%97job%E3%81%AE%E3%82%A8%E3%83%A9%E3%83%BC%E5%86%85%E5%AE%B9%E3%82%92%E5%88%86%E6%9E%90%E3%81%97%E3%81%9F%E3%81%84)に背景やデータの集め方も書いています

### なぜShinyを使った？
- Rでのデータ分析者にとって、分析のために書いたRのコードをすぐにWebアプリケーションとして比較的容易にデプロイすることができ、かつ非常に習得コストも小さい
- 閲覧者が何百人といるわけでなく、開発・分析チームが確認できれば良いので、3 - 最大10人程度が同時閲覧する程度のスケールで十分であった
    - つまり、パフォーマンスやスケーラビリティを求めないPoC的なアプリケーションに適している
- 単に**Shinyが好きだから**

### どんなアプリ？

（ほとんどモザイクかけてますが）

![gitlab_ci_dash2.jpg](https://qiita-image-store.s3.amazonaws.com/0/69266/5cd4af7a-8627-40a4-231e-b647f6a831dc.jpeg)

#### UI
1. プロジェクトを```selectInput(..., multiple = T)```で選択
1. ```dateInput```で時間幅(startからend)を選択
1. ```actionButton```でデータをロードする
1. 時間粒度(group_by)もリアルタイムに変更できる

シンプルにまとめれる```shinydashboard```を使っています

#### Output

1. ```plotly```を用いて、プロジェクトごとの失敗ジョブ数をbarカウントで表示
    - クラスタごとの失敗ジョブ数も同様に
1. 生ログから確認したい情報を取り出して、```datatable```で表示
    - エラーの文面やJobの詳細URL等

### ダッシュボードの効果は？

- プロジェクト全体のCIのJobを集約することで、マネージャークラスが容易にチームの分析ジョブの状況を確認できる = 最近安定して動いてるか？基盤が調子悪くないか？等の問題発見の気付きにもなる
    - 日々のジョブの失敗数を1つのKPIにして、分析基盤が安定しているかのアプリケーション指標の1つとしても使える
- 最近失敗JOBが多いかどうかを長期の視点で確認するのが非常に楽。さらに、量子化の程度（時間の集計単位）も選べるので、見た目が良い可視化になるように調整もできる

このように、プロジェクト横断したモニタリングをShinyを用いた話でした（まだ未完成部分もありますが）

### 課題は？
- 開発時の課題として、RStudioサーバ上で、プロジェクトごとに`packrat`を用いてライブラリのバージョンを管理しながら、開発している。デプロイする際に、Shinyサーバに開発で使用しているライブラリ群をアプリケーションの中で閉じて使いたい
    - 開発環境とデプロイ環境で、微妙にライブラリのバージョンが違うためか、謎のエラーによるデバッグが発生した経験があったため
- datatableの行にグループごとに色をつけたい
    - クラスタごととか、プロジェクトごとなど
- どんなログの種類（クラスタ）が増えているのかに、ログのクラスタリングをするが、データが更新されるたびに結果が変わるため、結果の再現性を担保しながらクラスタリング結果を保存したデータを蓄積する裏の仕組み
    - だんだんと肥大化していくので、こういうのは突貫で作るものではないですね…

### おわりに

背景とは別ですが、Rで分析やってると、ふと**あれ？これShiny化したら良いかも？**と思うことがあったら、速攻でShiny化して、他人もそのデータに触れるようにするのが、Shinyの良い使い方の一つだと思ってShinyやってます

みなさまの現場でも、良いShinyアプリが生まれますように！
【Unity】Assets「DOTween」Can’t add script　エラーが出る場合の対処法

Assetsで「DOTween (HOTween v2)」をインストール。
https://assetstore.unity.com/packages/tools/animation/dotween-hotween-v2-27676
<img width="1055" alt="スクリーンショット 2018-12-13 21.11.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/93155/b1433ba7-3277-7790-fdf5-ef967f06959b.png">
ゲームオブジェクトにスクリプトがアタッチできない。
エラーメッセージ
Can’t add script
<img width="421" alt="スクリーンショット 2018-12-13 22.10.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/93155/cc847ce6-c8ab-a3ab-562e-f0cefc3b6066.png">

Can’t add script behavior TMP_CoroutineTween.The script needs to derive from MonoBehaviour!

<font color="Magenta">スクリプトのクラス名とファイル名が違う場合、このエラーが起きる</font>
WordPressとionicで自分史上最高のノートを作った話

# はじめに

これまで私の勉強方法といえば、動画や本に書いていることを、紙のノートやブログにまとめて書くというものでした。

しかし、書いたとしても見返すことはなく、見たいと思ってもブログやノートのどこに書いてあるのか分からずに止めてしまうという問題がありました。

そこで、スマホアプリのように素早くページを表示でき、見たいページを素早く探せる。かつ、書きやすいエディタを備えている何かを作りたいと思い、ノートアプリを作ってみました。

# 何で作ったか

使った技術はWordPressとionicで、アプリのホスティングにはFirebase Hostingを使っています。

目次データだけはgithub.ioに設置し、アプリから取得して目次を表示しています。

ionicはまだあまり普及しているという感じはしませんが、一言でいうとwebアプリもスマホ(iphone,android)アプリも一つのHTML/JavaScript(TypeScript)コードから作れてしまうというものです。

最近流行っているものではReactNativeが近いでしょうか。

詳しくは知りませんが、裏ではCordovaが動いており、Angularベースでアプリを作っていきます。

WordPressは記事を書いて保存しているだけです。普通にブログを書く感覚で書いています。

WordPressを動かしているサーバは、無料でSSLとプラグインが使えるxreaというところです。

他にも未来サーバやxdomainなど試したのですが無料枠内ではプラグインが使えなかったり、SSLが有料だったり、最終的に行き着いたのがxreaです。

![studylog.png](https://qiita-image-store.s3.amazonaws.com/0/82541/a29e664b-8368-0a4e-f18c-c6590b03f1b8.png)


# どんなアプリか

今回作ったのは、こんなノートアプリです。

* トップページ

<img width="370" alt="File.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/82541/8109660b-97ba-7fc0-f341-a5fcc318735e.jpeg">

トップページはカテゴリを選ぶページです。

いろいろありますが、ちゃんと埋まっているのはまだHaskellだけです。

圏論は図が大切なので、カテゴリを作ったはいいのですがこのアプリとは相性が悪かったです。

* 詳細一覧

<img width="375" alt="File (1).jpg" src="https://qiita-image-store.s3.amazonaws.com/0/82541/7b7f9277-7061-fa9d-8458-46d1ee685fe9.jpeg">

詳細ページへのリンク一覧です。

ここに出ている名前は記事のタイトルと一致するようにしています。

* 記事ページ

<img width="375" alt="File (2).jpg" src="https://qiita-image-store.s3.amazonaws.com/0/82541/a0accc20-0d2e-43a2-e443-f08578359cc1.jpeg">

WordPressで書いた記事をAPIで取ってきて表示させています。

# 使い方

まずは勉強します。

勉強した内容はWordPressで作ったブログに記事を書いて保存します。

次に、gitで管理しているjsonファイルにタイトルとIDを記述しておきます。

IDはWordPressが発行するIDで、APIから記事を取得するときの記事IDとなります。

jsonファイルの中身はこんな感じです

```json
[
  {
    "name": "haskell",
    "title": "Haskell",
    "topics": [
      {"title": "始めの一歩", "id": "31"},
      {"title": "関数呼び出しと定義", "id": "33"},
      {"title": "if文", "id": "35"},
      ...
    ]
  },
  {
    "name": "haskell2",
    "title": "Haskell(モジュール～)",
    "topics": [
      {"title": "モジュール", "id": "133"},
      {"title": "モジュールのインポート", "id": "135"},
      ...
    ]
  }
]
```

ある程度勉強したらjsonファイルをコミットしてgithub.ioへpushします。

このjsonファイルはカテゴリページのカテゴリ一覧と詳細一覧の記事タイトルを表示する際にgithub.ioから読み込んで使います。


# 作ってみた感想

今回初めてionicでアプリを作ってみましたが、これぐらい単純なアプリであればionicの入門書を一通り読むだけで作れました。

また、当初はネイティブアプリにビルドしてスマホアプリとして使おうと思っていたのですが、作ったwebアプリをスマホのホームに追加することで、まるでネイティブアプリのように使えることに驚きました。

いまでもネイティブにビルドせずに使っています。

また、scssでデザインを自由に変更できるので、フロントエンドエンジニアの方やJavaScriptも書けるwebデザイナの方々でもすぐにionicでアプリを作れるようになると思います。

アプリ自体も我ながら使いやすいと感じています。
隙間時間にぱっと記事を読むことができ、どこに見たい記事があるかもすぐ分かるので作りたいもの通りのアプリができました。

ionicアプリ側のソースはこちらです。
https://github.com/suotani/study-log-ionic
ILSVRC 2017 画像分類 Top の手法 Squeeze-and-Excitation Networks

ILSVRC 2017 の画像分類タスクでは Squeeze-and-Excitation という手法が 1 位を記録しました。
シンプルなアイディア・実装で、既存モデルの拡張にも利用できるうえ、精度も 2016 年の top 1 と比べてエラー率を約 25% 減らすという大きな成果をあげています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/39030/20b939b8-c65b-ce06-4525-37ccfe19c7a2.png)

### Reference

- Jie Hu, et al., https://arxiv.org/pdf/1709.01507.pdf

文中の図表は論文から引用しています。

この記事は、Wantedlyの勉強会で取り上げられた論文・技術をまとめたものです。
[2018年に読んだ機械学習系論文・技術まとめ at Wantedly Advent Calendar 2018 - Qiita](https://qiita.com/advent-calendar/2018/wantedly_ml)

## Squeeze and Excitation

この論文では、SE block というブロックを提案しています。
SE block は特定のネットワーク全体の設計の提案ではなく、ネットワーク中の 1 component として振る舞うものです。
SE block を既存のいろいろなネットワークやモジュール（ResNet、Inception、...）に組み込むことで精度が向上することを実験で確かめています。

SE block は非常に実装が簡単なので先に実装を見てしまったほうがわかりやすいかもしれません。

```python
def se_block(input, channels):
    """
    Args:
        input: (N, H, W, C)
        channels: C
    Returns:
        tensor: (N, H, W, C)
    """
    # Squeeze
    x = GlobalAveragePooling2D()(input)  # (N, C)
    # Excitation
    x = Dense(channels // 16, activation='relu')(x)
    x = Dense(channels, activation='sigmoid')(x) # (N, C)
    return Multiply()([input, x])
```

SE block は、通常の convolution の出力をそのまま使うのではなく、 **各 channel の出力を重み付けして使う** ようにすることで、チャンネル間の関係性の学習を可能にするブロックです。

### Squeeze

既存のモデルは、convolution と activation を重ねることで、局所的な特徴を獲得していきます。
層が深くなったり pooling したりすると、局所的といいつつも広い視野を持っていくことになりますが、視野を一歩こえた先の情報などはまったく考慮できず、画像全体におけるチャンネル間の関係性を表すことはできません。
そこで、画像全体の特徴を活用するために、 global average pooling を利用します。（Spatial Squeeze）

### Excitation

そうして得た「画像全体のチャンネルの状況」をいくつかの layer に通したのち、sigmoid に通します。
最後にブロックに入力されてきた値 `input` に、 sigmoid 関数を通して 0~1 の範囲に収めた「各チャンネルの重み」を掛けて出力しています。
この部分が Excitation とよばれる部分です。

## 既存モデルへの組み込み

SE block は既存のモデルへの組み込みが容易であることも大きな強みです。
いくつかの組み込み方が提案・実験されています。

<table>
<tr>
<td>
<img src="https://qiita-image-store.s3.amazonaws.com/0/39030/76082379-9db4-4f02-7236-355f6804908b.png">
</td>
<td>
<img src="https://qiita-image-store.s3.amazonaws.com/0/39030/4c3fa967-234c-57ee-36a9-1c15fca7c603.png">
</td>
</tr>
</table>

組み込み方もシンプルで簡単に試せるのですばらしいですね。

## まとめと感想

かなりいろんなセットアップで実験をしているので、詳細は論文を参照ください。
Wantedly People で使われているモデルにも実験的に組みこんでみたところ、確かに数%の改善が確認できました。
この論文の続編的なものとして、segmentation タスクなどの fully convolutional networks 用の SE block 亜種が提案されています。
この advent calendar のどこかでそちらの紹介もできればと思います。
【Ruby】 Object#tap と break でハッシュの追加更新

## はじめに

```ruby
"hoge".tap { |str| str.reverse }
# => "hoge"
"hoge".tap { |str| break str.reverse }
# => "egoh"
```

`Object#tap` に渡すブロックの中で `break` すると、その引数を返すことができる。
このテクニックの活用方法はこれまでもいくつか研究されてきた。

* [TapがRubyの新たな制御構造の世界を開く - hp12c](http://melborne.github.io/2012/10/29/rubys-new-control-structure-by-tap-and-break/)
* [tap 面白いよ tap - Qiita](https://qiita.com/setsuna82001/items/75d6b1ae7e7d58cd29b7)

自分もつい先日、コーディング中に tap break を使うタイミングを見つけたので、そのことについて書いていく。

## やりたいこと

```ruby
table = Hash.new
ary = ["aa", "aaa", "abcd", "bbbb", "ccc"]

ary.each do |val|
  key = val.size
  if table.has_key? key
    table[key] << val
  else
    table[key] = [val]
  end
end

table
# => {2=>["aa"], 3=>["aaa", "ccc"], 4=>["abcd", "bbbb"]}
```

キーに対応する値が配列となるハッシュがあり、入力されるデータを分類しハッシュに格納していく、という場面。
ここでは例として、入力されるデータは文字列、分類基準は文字列の長さとした。
素直に if を用いて書いたが、tap break を使えばもっと短くできるのではないかと思った。

### `group_by` 使えば？

```ruby
ary.group_by(&:size)
# => {2=>["aa"], 3=>["aaa", "ccc"], 4=>["abcd", "bbbb"]}
```

やりたいことはまさに `group_by` なのだが、いくつかの理由で今回は使用しない。
ひとつは `ary` は別々に順次入力されるという状況だったので、 `group_by` の結果を毎回マージするのが面倒くさいから。
もうひとつは、先ほどのサンプルコードでは省略しているが、追加する `val` に加工をする必要があったから。

## tap break 最終案

```ruby
ary.each do |val|
  key = val.size
  table[key].tap { |t| break table[key] = [] unless t } << val
end
table
# => {2=>["aa"], 3=>["aaa", "ccc"], 4=>["abcd", "bbbb"]}
```

* `table[key]` が `nil` である場合
    * ブロックの中身が戻り値となるので、
    * `(table[key] = []) << val` となる
* `table[key]` が `nil` でない場合
    * レシーバが戻り値となるので、
    * `table[key] << val` となる

Ruby2.5で `tap` の親戚みたいなメソッド `yield_self` が追加されたが、 ブロックの中身を選択的に捨てたり返したりできる `tap` 楽しいよね、という。


## tap break じゃなくてもいいのでは？

まあ、はい。
or演算子のやつはスッキリしてて個人的にいいと思った。
`table[key]` が `nil` のときだけ右辺が評価されるので。

```ruby
ary = ["aa", "aaa", "abcd", "bbbb", "ccc"]

# 条件演算子、三項演算子　を用いる場合
table = Hash.new
ary.each do |val|
  key = val.size
  (table[key].nil? ? table[key] = [] : table[key]) << val
end
table
# => {2=>["aa"], 3=>["aaa", "ccc"], 4=>["abcd", "bbbb"]}

# or演算子を用いる場合
table = Hash.new
ary.each do |val|
  key = val.size
  (table[key] || table[key] = []) << val
end
table
# => {2=>["aa"], 3=>["aaa", "ccc"], 4=>["abcd", "bbbb"]}
```

## おわりに

読みづらいので他の人が読むコードでは書かない方がいいと思った。


## 参考

* [TapがRubyの新たな制御構造の世界を開く - hp12c](http://melborne.github.io/2012/10/29/rubys-new-control-structure-by-tap-and-break/)
* [tap 面白いよ tap - Qiita](https://qiita.com/setsuna82001/items/75d6b1ae7e7d58cd29b7)
* [サンプルコードでわかる！Ruby 2.5の主な新機能と変更点 Part 1 - Qiita](https://qiita.com/jnchito/items/f182b6f0093a6a3701a1)
* [Ruby2.5で導入されるyield_selfについて - Qiita](https://qiita.com/guppy0356/items/8195f3a03859bcb10920)
Haskell でサウンドプログラミング（TidalCycles）

[公式](https://tidalcycles.org/getting_started.html#running)のインストール方法
#1. Tidal-bootstrapをmacにインストールする
以下のリンクからダウンロードしてインストールする
[tidal-bootstrap](https://tidalcycles.github.io/tidal-bootstrap/)

#2. Haskell、Atom、SuperCollider、Gitインストール
以下のリンクからそれぞれダウンロードしてインストールする
[Haskell](https://www.haskell.org/platform/)
[Atom](https://atom.io/)
[SuperCollider](http://supercollider.github.io/download)(version 3.7 以上)
[Git](https://git-scm.com/)

#3. TidalCyclesパターンエンジンをインストール
ターミナルで以下のコマンドを実行してインストールする
```cabal install tidal```

#4. SuperDirtシンセをインストール
SuperColliderを起動して、
```include("SuperDirt")```
を入力して```Shift + Enter```でインストールする

#5. TidalCycles Atomプラグインをインストール
Atomを開いて,
Atom　>　環境設定　>　インストール（edit > settings > install）から
TidalCyclesを検索してインストールする

#TidalCyclesを実行
SuperColliderを起動して、
```SuperDirt.start```を入力して```Shift + Enter```で実行する

Atomを起動して、
拡張子が```.tidal```のファイルを作り```d1 $ sound "bd sn"```を入力する
Atomのメニューから、パッケージ（Package） > TidalCycles > Boot TidalCyclesを選択する。
```Ctr + Enter```を実行して音が出たら成功です

おわり

チュートリアルは[こちら](https://qiita.com/mk668a/items/6e8e0151817f484a526c)
いろいろなポアソン分布ヒストグラムを描いてみる

*プログラミング学習者です。
間違えている箇所もあると思いますので、申し訳ございませんがご指摘していただきますと大変助かります。*

#ポアソン分布ヒストグラムとは？

ある特定の時間あたりn回起こる確率を持っている事象がある特定の時間内に何回起こるかを回数別にヒストグラム（度数分布表）に表したもの。
ちなみに次の事象までの時間に着目したものは指数分布といいます。


###コード
```python:poisson_hist_1.py
import numpy as np
import matplotlib.pyplot as plt

p1 = np.random.poisson(1, 1000)
p2 = np.random.poisson(4, 1000)
p3 = np.random.poisson(10, 1000)

fig, axs = plt.subplots(figsize=(9, 6))
# axs.hist([p1, p2, p3], bins=20, ec='gray', color=['c', 'm', 'y'],
#          label=['p1', 'p2','p3'])
axs.hist(p1, ec='gray', color="c", label=['p1'],alpha = 0.5)
axs.hist(p2, ec='gray', color="m", label=['p2'],alpha = 0.5)
axs.hist(p3, ec='gray', color="y", label=['p3'],alpha = 0.5)
axs.set_ylabel('count')
axs.set_xlabel('n')
axs.legend()
plt.savefig('figure2.png')
plt.show()

```
###結果
![figure2.png](https://qiita-image-store.s3.amazonaws.com/0/302092/4567f525-51c3-2f6c-2ac7-1064f1182b6a.png)

あれ？なんかおかしい、私のバーの大きさ、違いすぎ...
***

###修正
histの引数の中に列記すれば重ならずに表示できるらしいので修正しました。

```python:poisson_hist_2.py
import numpy as np
import matplotlib.pyplot as plt

p1 = np.random.poisson(1, 1000)
p2 = np.random.poisson(4, 1000)
p3 = np.random.poisson(10, 1000)

fig, axs = plt.subplots(figsize=(9, 6))
# axs.hist([p1, p2, p3], bins=20, ec='gray', color=['c', 'm', 'y'],
#          label=['p1', 'p2','p3'])
axs.hist([p1, p2, p3], bins=20, ec='gray', color=['c', 'm', 'y'],
         label=['p1', 'p2', 'p3'])
axs.set_ylabel('count')
axs.set_xlabel('n')
axs.legend()

plt.savefig('figure.png')
plt.show()
```

![figure.png](https://qiita-image-store.s3.amazonaws.com/0/302092/441797c9-e633-779b-6a20-44a6073d5762.png)

なんとかできました。

##感想
本当に統計って面白いですね。ビッグデータもAIも機械学習も統計とは切っても切れない関係なのでこんな便利なツールが出てきたのも時代の要請と技術の発達のなし得たものなのでしょうね。
Salesforceの影薄便利機能に光を当てる(ユーティリティバー・お気に入り・クイックテキスト)

#はじめに
この記事は[LIFULLその2 Advent Calendar 2018](https://qiita.com/advent-calendar/2018/lifull2)の14日目の記事です。
日頃Salesforceを主に触っているので、この機会に"便利なのにあまり使われていない"機能を3つご紹介します。
※"便利"や"あまり使われていない"の判定基準には主観が多分に含まれています！ご注意ください！

#実は便利な！でもあまり使われていない機能3選！
###1. ユーティリティバー
まずは画面の左下にレポートグラフなどを表示できる「ユーティリティバー」を紹介します。
以下のようにページ遷移をしなくてもレポートを表示したり、Chatterフィードを開いたりできます。
レポートを確認するためにわざわざレポートタブに移動したり、別タブで開いておいたりしなくてよいのでありがたいです。
Lightningはまだまだページ遷移が重たいところがあるので、ユーティリティバーで作業時間やストレスを削減しましょう！
![ユーティ1.PNG](https://qiita-image-store.s3.amazonaws.com/0/260521/2ee220db-cade-3956-aa81-abcf898d06a4.png)

ユーティリティバーは、[設定]→[アプリケーションマネージャ]→[ユーティリティバーを設定するアプリケーションの編集]から設定することができます。
![ユーティ2.PNG](https://qiita-image-store.s3.amazonaws.com/0/260521/c351e893-d1ff-5d32-dc8a-6758cccf08ba.png)
表示されたアプリケーションビルダーの画面で、サイドバーのユーティリティ項目を選択しましょう。
「ユーティリティ項目を追加」ボタンからユーティリティを追加することができます。
![ユーティ3.PNG](https://qiita-image-store.s3.amazonaws.com/0/260521/599d8c32-ed23-bb89-ee4e-ebc30c81c88a.png)



###2. お気に入り
続いてはシステム管理者にとっても嬉しい機能「お気に入り」です。
画面の右上の星印から登録・遷移ができます。
![お気に1.PNG](https://qiita-image-store.s3.amazonaws.com/0/260521/f2f29f15-02f4-d814-00a9-4056979fcba6.png)
ここによく見るレポートやビューを登録しておくと作業が一気に楽になるのでオススメです。

###3. クイックテキスト
最後はクイックテキストです。
この機能は行動やToDoを入力するときに定型文をあらかじめ用意して、自動入力できる機能です。

まずは、設定画面からクイックテキストを有効化します。
![クイテキ1.PNG](https://qiita-image-store.s3.amazonaws.com/0/260521/29390825-2bd1-f98e-457a-1b399e3a36e2.png)
クイックテキストが有効化されたら、クイックテキストタブが表示されるはずなので、新規ボタンからクイックテキストの作成をします。
便利なポイントとして差し込み項目の挿入ができますので、関連するレコードに既にある項目は差し込んでおくのがよいです。
チャネルにはクイックテキストを使用する予定の機能を選択しましょう。
![クイテキ2.PNG](https://qiita-image-store.s3.amazonaws.com/0/260521/2b939c25-2ee3-7a6a-a968-a967feb9d057.png)
さて、準備は整ったので早速使ってみましょう。
今回はケースクローズ時の報告用にクイックテキストを作成したので、ケースの関連リストから新規の活動を作成します。
すると以下のように説明欄にフォーカスを当てると右上に吹き出しマークが表示されます。
![クイテキ3.PNG](https://qiita-image-store.s3.amazonaws.com/0/260521/ffef4393-a9a1-fabf-7c38-dd317550f278.png)
吹き出しマークをクリックすると、先ほど登録したクイックテキストが選択できます。
![クイテキ4.PNG](https://qiita-image-store.s3.amazonaws.com/0/260521/4a6c6689-cf8b-2a8e-d3a4-cad6c5c5cfda.png)
「ケースの完了報告」を選択すると、以下のように報告内容の入力ができました。
![クイテキ5.PNG](https://qiita-image-store.s3.amazonaws.com/0/260521/3079be8b-817e-9107-38cb-d0c1c5c3b7e6.png)
営業さんの入力負荷軽減やコールセンターの対応速度アップなどに使えそうですね。

#最後に
Salesforceは便利な機能がたくさん用意されており、すべてを把握して使いこなすのは至難の業です。
その中でも今回ご紹介した機能はすぐに活用しやすいものとなっていますので、是非1つでも使ってみていただければと思います。
せっかくそれなりの月額料金を支払っているので、どんどんSalesforceを使い倒しましょう。
それでは良いSalesforceライフを～( ^_^)/~
嵐を呼ぶジェネレータを通してVue-CLIでプロジェクトを作成して公開する

2018年の漢字は「災」らしいですね。順当だと思います。

さて、今回はVue.jsで簡単なページを作って公開してみます。
ページの内容は「クレヨンしんちゃん」のサブタイトルみたいな画像を生成するものです。

# 使用技術
- Vue.js
- GitHub Pages
- CANVAS

なお、メイン部分は僕が書いたので説明できるのですがその後ちゃんとVue.jsに書き直す部分は共同開発者たちがやってくれたので[ソースを見る](https://github.com/AfterSchoolStudy/generator_of_call_a_storm)か[こいつ](https://github.com/tyokinuhata)とかに聞いてください。

# 自分の環境のバージョンとか
- npm 6.4.1 (適宜新しいのを入れていいと思います)
- node.js 8.9.0 (同)
- vue-cli 2.9.6 (同 なんか今見たら3出てるっぽいですね。)

# プロジェクトを作る
ここまで書いてなんですが[ここ](https://qiita.com/567000/items/dde495d6a8ad1c25fa43)とか見てもらったほうが早いです。ありがとうございました。
あと[このへん](https://mseeeen.msen.jp/organize-vue-js-dev-env-by-cli/)も参考になります。

プロジェクトができたらいい感じに変えていきましょう。適宜上のページを参照しながらやってもらえると嬉しいです。
あと今回vue-routerは使いません。SPAどころかSPなので。

# とりあえずvueファイルをリネームする
`/src/components/`内にある`.vue`のファイルみたいな感じで適当な名前のファイルを作ります。
そのあと、`src/App.vue`ファイルの中の`HelloWorld`になっている記述をリネームしたファイル名に書き換えます。

ここらで一回コンソールで

```$ npm run dev 
```

を実行して表示を確認してみましょう。（注: Vue3だとnpm run serveらしいです）
ちゃんと動いたら`npm run build`とコミットしてGitHubのリポジトリにpushしておきましょう。
GitHub側の設定は適当に「vue.js GitHub pages」とかでググると良いです。（丸投げ）

# 本題:文字をCANVASに動的に描画する
ここから本題。

```vuejs:generator.vue
methods: {
  generate () {
    // 描画
    let ctx = document.getElementById('output_field').getContext('2d')
    this.drawCaption(ctx, 'test', 'left', { 'x': 400, 'y': 1350 })
    this.drawCaption(ctx, 'text', 'right', { 'x': 2480, 'y': 1350 })

    this.src = ctx.toDataURL()
 },
  drawCaption (ctx, text, align, coordinate) {
    ctx.textAlign = align
    ctx.lineWidth = 5
    ctx.fillStyle = '#FFF'
    ctx.font = '90px cursive'
    ctx.fillText(text, coordinate['x'], coordinate['y'])
    ctx.strokeStyle = 'gray'
    ctx.strokeText(text, coordinate['x'], coordinate['y'])
  }
```
上記のコードで
`<canvas id="output_field"></canvas>`
に文字(test text)を出力されます。

その後、
`<img class="output_image" :src="src" >`
に画像として置き換えられます。
vue部分の`data(){}`の中に`src`って属性（？）を追加しておきましょう。

これで多分基幹部分は完成するはず。(試してないので後日やってみます)

# 文字の生成に成功したら
あとはテキストの文字列を動的に切り替えたり、位置を替えたりフォントを替えたりもろもろでいい感じにするとあなただけのジェネレータが作れるよ。
よかったら[ぼく](https://twitter.com/kakimoto_itc)とか[ハッシュタグ](https://twitter.com/search?q=%23%E5%B5%90%E3%82%92%E5%91%BC%E3%81%B6%E3%82%B8%E3%82%A7%E3%83%8D%E3%83%AC%E3%83%BC%E3%82%BF&src=typd)にご一報ください。


# なんでこんな記事かいたのか
[アドベントカレンダー](https://adventar.org/calendars/3072)で今日だったからです。22時に書いてます。お疲れ様でした。

# 良いお年を！
[java]独自クラスのListを比較するときにやったこと

equalsメソッドとhashCodeメソッドを追加すればよさそうだったので、`org.apache.commons`のライブラリを使ったら短くできました。

``` Hoge.java
import org.apache.commons.lang3.builder.EqualsBuilder;
import org.apache.commons.lang3.builder.HashCodeBuilder;
~~省略~~
    @Override
    public boolean equals(Object obj) {
        return EqualsBuilder.reflectionEquals(this, obj);
    }
 
    @Override
    public int hashCode() {
        return HashCodeBuilder.reflectionHashCode(this);
    }
```

gradle使ってるなら下記記載。

```build.gradle
// https://mvnrepository.com/artifact/org.apache.commons/commons-lang3
compile group: 'org.apache.commons', name: 'commons-lang3', version: '3.0'
```

古い記事ばっかだったのでほかも調べたら下記みたいな事でも実現できそうでした。
※試してはいないです

```Hoge.java
@Override
public int hashCode(){
    return Objects.hash(name, length, children);
}

@Override
public boolean equals(final Object obj){
    if(obj instanceof Bean){
        final Bean other = (Bean) obj;
        return Objects.equals(name, other.name)
            && length == other.length // special handling for primitives
            && Objects.equals(children, other.children);
    } else{
        return false;
    }
}
```
`Objects`はnullチェックでお世話になっていましたが、こんなメソッドもあるのは知らなかったです。

Eclipseの自動生成でもできた気がしますが、個人的には動けばそっちでもいいと思います。
VSCode拡張のPlantUMLプレビューが表示されない場合の対応

# 概要
VSCode拡張機能のPlantUMLが非常に便利なのですが、プレビューモードで正しく記載しているにもかかわらずプレビューが表示されないケースが多数発生。。。
調べた限り、あまり同じ解決方法が出てこなかったので、他にもハマっている人がいるのでは。。。
備忘のために渡しの場合の対処方法を記載します。
誰かの参考になれば 😀

# 対応方法①
結果を先に記載します。
**ほとんどのケースでは、setting.jsonにPlantUMLのJava起動オプションを追加してあげると解決します**

## ①設定画面を開く
<img width="723" alt="1-1.png" src="https://qiita-image-store.s3.amazonaws.com/0/202800/36a9dbdb-5be7-ddfe-2f50-fc451dfc8ac8.png">
<img width="722" alt="1-2.png" src="https://qiita-image-store.s3.amazonaws.com/0/202800/28d70d53-8521-ffa1-5d8f-bf6ab7d3d2b3.png">

## ②PlantUML設定へ移動する。
<img width="721" alt="1-3.png" src="https://qiita-image-store.s3.amazonaws.com/0/202800/5937bcf9-6066-76a2-e040-6ad53fbc8131.png">

## ③CommandArgs追加画面へ移動する。
<img width="721" alt="1-4.png" src="https://qiita-image-store.s3.amazonaws.com/0/202800/609d0312-70fa-e539-7a14-f081078f0ae7.png">
<img width="1044" alt="1-5.png" src="https://qiita-image-store.s3.amazonaws.com/0/202800/0fc5c26b-a980-ba57-8aa1-39c5227976e2.png">

## ④plantuml.commandArgsを追加する。
以下の1行を追加します。
`"plantuml.commandArgs": ["-Xmx2g", "-DPLANTUML_LIMIT_SIZE=16384"]`

それぞれの引数の意味は以下のとおりです。
`"-Xmx2g"`・・・Java起動時の最大ヒープサイズ設定(ヒープサイズは各々の環境に合わせて変更ください。)
`"-DPLANTUML_LIMIT_SIZE=16384"`・・・表示ダイアグラムの最大height&width設定
<img width="1045" alt="1-6.png" src="https://qiita-image-store.s3.amazonaws.com/0/202800/b702e855-68e8-2aad-5804-da64fc82ebee.png">

# 対応方法②
**前述の内容でもだめだった場合は、以下の設定をするだけで数倍は早くなります。**
## PlantUML公式サーバを利用する。
<img width="719" alt="1-1.png" src="https://qiita-image-store.s3.amazonaws.com/0/202800/6c1e7c37-bc48-ee43-f7ea-b1888a1a85d3.png">
上記のようにレンダリングするサーバに外部のサーバを指定します。

# PlantUMLは素晴らしいぞ!
とても便利なので一度使ってみてください!!
インストール方法などは他の方が記載してくださっていますので、それらをご参照ください。

- [Visual Studio Code で UML を描こう！](https://qiita.com/couzie/items/9dedb834c5aff09ea7b2) (Windows向け)
- [PlantUMLを使ってみる(MacOS) ~Visual Studio Codeでもっと使いやすく~](https://qiita.com/tomoaki_takaichi/items/8e03258c3c956d4848c4) (Mac向け)
macOS/.NetCore2系で、utf8jsonのIL2CPP向けのCodeGeneratorを動かす

みんな大好き [Utf8Json - Fast JSON Serializer for C#](https://github.com/neuecc/Utf8Json) だけど、
IL2CPPで使うのが一手間必要で、Androidでの使用を避けてました。

とはいえ最近避けてもいられなくなったので、いい加減覚悟をきめて対応しました。
で、予想通り色々ハマったので、その際のメモ。

> なお、emacs + Makefileでの完全コマンドライン開発です。

## ハマりポイント1： macOS向けのCodeGeneratorは自力ビルド必須

githubで配布されてるパッケージは.netCore1時代に作られたもので、ランタイムのバージョン不整合（？）で動かない。
故に、自分でビルドする必要がある。

```
git clone git@github.com:neuecc/Utf8Json.git
cd Utf8Json/src/Utf8Json.UniversalCodeGenerator/
dotnet build -c Release 
dotnet publish -c Release -r osx-x64
sudo mv bin/Release/netcoreapp2.0/osx-x64/publish /usr/local/Utf8Json.UniversalCodeGenerator 
```

あとは、Makefileにこんな感じの記述を追加して、
ビルド前に呼べばOK。

```
CODE_GENERATOR_BIN    = /usr/local/Utf8Json.UniversalCodeGenerator/Utf8Json.UniversalCodeGenerator
CODE_GENERATOR_OUTPUT = ${PROJECT_PATH}/Assets/Scripts/Utf8JsonGenerated.cs
CODE_GENERATOR_TARGET = ${PROJECT_PATH}/${TARGET_SCRIPTS_DIR} # 複数定義する場合はカンマ区切りで列挙
CODE_GENERATOR_DEP    = ${PROJECT_PATH}/${TARGET_SCRIPTS_DIR}/*.cs

${CODE_GENERATOR_OUTPUT}: ${CODE_GENERATOR_DEP}
        ${CODE_GENERATOR_BIN} -d "${CODE_GENERATOR_TARGET}" -o "${CODE_GENERATOR_OUTPUT}"
```

## ハマりポイント2： 生成したコードは初期化時にセットする必要がある

忘れがちだが、Readmeにも書いてある通り適当な初期化のタイミングで、

```
#if ENABLE_IL2CPP
Utf8Json.Resolvers.CompositeResolver.RegisterAndSetAsDefault(
	Utf8Json.Resolvers.GeneratedResolver.Instance,
	Utf8Json.Resolvers.BuiltinResolver.Instance,
	Utf8Json.Unity.UnityResolver.Instance
)
#endif
```

とか実行して、生成したリゾルバを注入してやる必要あり。

## ハマりポイント3： Enumを含むシリアライズがGeneratorで生成したResolverだと例外を吐く（未解決）

デフォルトのResolverだと問題は起きないが、CodeGeneratorで生成したResolverは、Enumを含んだオブジェクトの解決に失敗するようだ。（Genertor側に手を入れれば多分対処可能）

```
Exception : Utf8Json.FormatterNotRegisteredException: MyClass+MyEnum is not registered in this resolver. resolver:CompositeResolver
  at Utf8Json.JsonFormatterResolverExtensions.GetFormatterWithVerify[T] (Utf8Json.IJsonFormatterResolver resolver) [0x00059]
```

とか出る。

ちょっと嫌だけど、Enumで抱えていたところをintにして、キャスト対応することに。

## 参考記事

- [Utf8Json を macOS で動作させるまでの記録](https://monry.hatenablog.com/entry/2018/05/31/015307)
- [.NET Core で 実行ファイル（.exe）を作成する方法](https://kagasu.hatenablog.com/entry/2017/04/16/192117)
- [【Unity】Utf8JsonでJSONシリアライズをする](https://ooee-81.hatenablog.com/entry/utf8json)
シクシク素数列  awk編

こちらは [シクシク素数列 Advent Calendar 2018](https://qiita.com/advent-calendar/2018/4949prime-series) の17日目の記事です。

「平成最後の」が流行語になった年に、awkです。
Wikipediaによるとsince1979らしいので、来年は40周年を機にawk再評価のムーブメントが起き~~るやもしれ~~ません。

### ルール(転載)

- 数値に4か9を含む素数をシクシク素数と呼ぶことにします
    - 19とか41とか149とか。
- 標準入力として正の整数 N を与えたら N 番目までのシクシク素数を半角カンマ区切りで標準出力してください
    - 例 N = 9 の場合、 19,29,41,43,47,59,79,89,97
- N は最大で 100 とします

### 実装
`awk '{for(i=9;$0;i++)if(match(i,/4|9/)){for(j=2;j<i;j++)if(i%j<1)j=i;printf(i<j?x:--$0?i",":i RS)}}'`

### 懺悔
文系出身の万年素人が、ワンライナーをキメる仙人たちに憧れて、
何とか１バイトでも短く書きたい、という煩悩を最優先してシクシクHackしましたが、
これが精一杯でした。

### 雑な説明

awkは入力を行ごとに処理します。`$0`にその行の内容が入ります。
今回の場合、正の整数 N が入ることになります。

forループの中で、シクシク素数を見つけたらそれを出力しつつ`$0`を減らしていきます。
ループの繰り返し条件に`$0`とあるのは、
awkでは真偽判定の文脈ではゼロは偽（ゼロ以外は真）であることを利用しています。

match関数でシクシクかどうかを見ています。
この文脈では`i`は文字列として扱われます。

内側のループで素数かどうかを見ています。
割り切って抜けた時は`x`を出力。
といっても何も代入していないので、この文脈では空文字です。

最後まで割り切れなかった時に`i`を叫ぶのですが、
カウントダウンしている`$0`がゼロでない間はカンマをつけます。
文字列を連結するには、ただ並べて書くだけ、というこの大らかさ。

ゼロになったら、カンマの代わりに`\n`とするのですが、
awkの組み込み変数`RS`の初期値が改行コードであることを利用したのは、
前述の煩悩のなせるわざ。


### 結果
```awk:シクシク素数列
$ seq 10 | awk '{for(i=9;$0;i++)if(match(i,/4|9/)){for(j=2;j<i;j++)if(i%j<1)j=i;printf(i<j?x:--$0?i",":i RS)}}'
19
19,29
19,29,41
19,29,41,43
19,29,41,43,47
19,29,41,43,47,59
19,29,41,43,47,59,79
19,29,41,43,47,59,79,89
19,29,41,43,47,59,79,89,97
19,29,41,43,47,59,79,89,97,109
```
それっぽく出てると思います。


###おまけ
```awk:more4949(almost_sick)
$ seq 4 9 | awk '{for(c=4+9;$(sick*sick);c++)if(match(c,/4|9/)){for(q=sqrt(49)-sqrt(4)-sqrt(9);c>q;q++)if(c%q<49/49)q=c;printf(c<q?sick:--$(sick*sick)?c",":q RS)}}'
19,29,41,43
19,29,41,43,47
19,29,41,43,47,59
19,29,41,43,47,59,79
19,29,41,43,47,59,79,89
19,29,41,43,47,59,79,89,97
```
LambdaのイベントソースにSQSが追加されたので使ってみた

## はじめに
追加されてから半年ほど経過してしまいましたが、LambdaのイベントソースにSQSが追加されたので試してみました。

## workerサンプル

今までも、Lambdaをworkerとして定期実行させ、処理を行っていました。
ランタイムはpython2.7です。（古い。。）

```handler_before.py
import boto3
import json
import re

# ## globals
sqs = boto3.resource('sqs')
queue = sqs.Queue(QUEUE_URL)

def handle_queue_msg(queue_msg):
    upinfo = json.loads(queue_msg.body)
    if 'url' not in upinfo:
        return
    if not re.search('^http', upinfo['url']):
        return
    upsert_url_mapping(upinfo['url'])

def get_messages():
    return queue.receive_messages(
        MaxNumberOfMessages=10,
        WaitTimeSeconds = 0
    )

def upsert_url_mapping(url):
	〜DBにurlを登録する処理〜

# ## main handler
def handler(event, context):
    msgs = get_messages()
    while 0 < len(msgs):
        for msg in msgs:
            handle_queue_msg(msg)
            msg.delete()

        msgs = get_messages()
```

実装内容は、一般的なSQSポーリング処理です。

1. 10件ずつメッセージを取得
2. メイン処理
3. メッセージ削除処理
4. 0件になるまで1〜3の繰り返し

## SQSイベントを使った処理

SQSイベントリソースを使用した処理に書き換えてみました。

```handler_after.py
import boto3
import json
import re

# ## globals
sqs = boto3.resource('sqs')

def handle_queue_msg(queue_msg):
    upinfo = json.loads(queue_msg['body'])
    if 'url' not in upinfo:
        return
    if not re.search('^http', upinfo['url']):
        return
    upsert_url_mapping(upinfo['url'])

def upsert_url_mapping(url):
	〜DBにurlを登録する処理〜

# ## main handler
def handler(event, context):
    for record in event['Records']:
        handle_queue_msg(record)
```

AWSがポーリングをしてくれるので、event引数からメッセージを取得するだけでOKです。
処理が正常に終了するとキューも削除してくれるので、削除処理を記述する必要もありません。

## トリガーにSQSを設定
ソースをデプロイ後、トリガー設定をします。
![181213-0002.png](https://qiita-image-store.s3.amazonaws.com/0/68003/494bf7eb-3310-2422-43f6-6b6be78a707c.png)

バッチ数を設定します。（最大件数10件）

![181213-0003.png](https://qiita-image-store.s3.amazonaws.com/0/68003/3f559bca-6901-3a42-d9d9-5fcf44da3df2.png)

## 同時実行数
RDSと連携している場合、大量のメッセージが登録されると自動で並列処理が行われるため、<br>RDSへの接続数があっという間に消費されるため、同時実行数の設定で同時実行数を定義しておくことをおすすめします。

![181213-0001.png](https://qiita-image-store.s3.amazonaws.com/0/68003/dc3395b2-f6a3-ac72-1c91-98ffc8f07f5f.png)

## おわりに
今携わっているプロダクトではバッチ処理はすべてlambdaでおこなっており、<br>SQSのポーリング処理の実装がまだあるので、時間があるときにSQSイベントに変更したいと思います。<br>(あとpythonの3系への対応も)
webpack利用時にエラー: Uncaught Error: Cannot find module "net"

# エラー内容
webpack利用時に以下のようなエラー時が出ることがある。

```bash
Uncaught Error: Cannot find module "net"
Uncaught Error: Cannot find module "tls"
Uncaught Error: Cannot find module "dns"
```

# 対応

`webpack.config.js` の `var options = { ` 以下に追記。

```json
  node: {
    net: 'empty',
    tls: 'empty',
    dns: 'empty'
  }
```

# 備考
- https://github.com/hapijs/joi/issues/665#issuecomment-113713020
AWSCLIにおけるS3の帯域制限について

AWSCLIのS3帯域制限ができるようになって1年くらいになります
間違ったコマンドを見かけるので、コピペできるようにしました


#### 「AWS CLIがS3とのトラフィックを帯域制御できるようになりました」
https://dev.classmethod.jp/cloud/aws/rate-limit-aws-cli-s3-transfer/

10MB/sで帯域制限をかける方法

```
$ aws configure set default.s3.max_bandwidth 10MB/s
$ cat $HOME/.aws/config
[default]
region = ap-northeast-1
s3 =
    max_bandwidth = 10MB/s
```

結構コピペしますよね？


#### みなさんprofile使ってませんか？
AWSCLIで複数のIAMユーザー(AWSアカウント)を使い分けるための方法
参考）https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-multiple-profiles.html

profileを使っていると上記コマンドじゃダメですよ

↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
`$ aws configure set profile.[profile名].s3.max_bandwidth 10MB/s`
↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑

```
$ aws configure set profile.test.s3.max_bandwidth 10MB/s
$ cat $HOME/.aws/config
[profile test]
region = ap-northeast-1
s3 =
    max_bandwidth = 10MB/s
```

一応ドキュメントにも記載がありました
https://docs.aws.amazon.com/cli/latest/reference/configure/set.html

逆にsetコマンド時は--profileは不要です

コピペだけじゃなく、ドキュメント読みましょう。。。
Ruby on Railsにおけるwhere,find,find_byの性質

<h2>find  　　　-「データベースから検索」-</h2>
`モデル.find(引数)`
・引数には**IDのみ**が入りうる。
・返り値として、指定したモデルの中の引数に合致したインスタンスを出す。
・取得したいデータのIDがわかっているとき使用できる。
・引数のところに配列が入ることで、複数のIDを指定してデータベースから複数のデータを引き出すことができる。

<h3>例1</h3>
`Book.find(3)`
Bookモデルの中からIDが3のデータを取得する。
<h3>例2</h3>
`Book.find([2,4])`
Bookモデルの中からIDが２，４のデータを配列で返す。

<h2>find_by　　-検索条件を指定して（IDではなくてもよい）最初の1件を取得-</h2>
`モデル.find_by(条件)`
・条件に当てはまるモデルを検索する。
・条件はID以外のカラムを用いて指定することができる。
・返り値として、指定したモデルの条件に合致するインスタンスを出す。複数合致した場合はそれらの中の一番最初のものを返り値とする。
・**1件だけ**インスタンスを取得するときにのみ使用できる。
<h3>例1</h3>
`Book.find_by(author: Edogawa)`
`==>Nisendouka`
Bookモデル全体から、authorがEdogawaであるインスタンスのうち最初の1件を返す。
<h3>例2</h3>
`Book.find_by(author: Edogawa, Published: 1951)`
`==>Geneijo`
Bookモデル全体から、authorがEdogawaであり、Publishedが1951であるインスタンスのうち最初の1件を返す。

<h2>where　　-検索条件を指定して（IDではなくてもよい）該当するデータ全て取得-</h2>
`モデル.where(条件)`
・条件に当てはまるインスタンスを検索する。
・該当するデータ**全て**を取得する。しかし、戻り値は配列ではなく、ActiveRecord::Relationというオブジェクトとなる。インスタンスではないため、`.where`で取得したデータをそのまま使用することができない。
<h3>例</h3>
`Book.where(author: Edogawa).first`
`==>Nisendouka`
Bookモデル全体から、authorがEdogawaであるという条件で絞り込む。その中で一番最初のインスタンスを取り出す。
CaseIterableにindexプロパティを追加する

CaseIterableを拡張し、indexプロパティを追加する実装です。

### 実装コード
```swift
extension CaseIterable where Self: Equatable {
    var index: Int {
        guard let index = Self.allCases.firstIndex(of: self) as? Int else { fatalError() }
        return index
    }
}
```

### 利用例

```swift
enum Season: CaseIterable {
    case spring
    case summer
    case fall
    case winter
}

let season: Season = .fall
print(season.index) // 2
```
Swift4.2  foreground、background オブザーバー

# Swift4.2  foreground、background オブザーバー

```
import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        NotificationCenter.default.addObserver( self,
 selector:#selector(background),
name: UIApplication.didEnterBackgroundNotification,object: nil)
        NotificationCenter.default.addObserver( self, selector: #selector(foreground),name: UIApplication.willEnterForegroundNotification,object: nil)
    }
    @objc func background() { print("background") }
    @objc func foreground() { print("foreground") }
}
```

参考箇所　スーパークラス

<img width="852" alt="スクリーンショット 2018-12-13 21.20.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/131469/3d7b7bd3-d3f3-820e-958e-459178fd6334.png">