OmniAICreator/Qiita-1.07M huggingface dataset:
Sequel ProでLaravelのHomestead環境のDBに接続する

今日はLaravelのHomestead環境のDBをSequel Proで見れるようにしてみた。


## 設定内容
<img width="731" alt="スクリーンショット 2018-06-04 23.52.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/219138/951b79d9-ce41-0e26-d5ba-1993da5884e9.png">

入力するのはこの部分。

### 名前
なんでも良い。

### ホスト
`Homestead.yaml` の中で指定しているIPが入る。

```
ip: "192.168.10.10"
```
デフォルト値は多分こんな感じ。


### ユーザ名・パスワード・ポート
これはLaravelのプロジェクトのディレクトリにある `.env`　の中に載っている。

```
DB_USERNAME=homestead
DB_PASSWORD=secret
DB_PORT=3306
```
この内容をコピペすればOK。

### データベース名
作業用のところを指定しておくと楽だけど、別にしなくても接続できるかどうかには関係ない。


結構あっさりできた。
どこを見れば良いかさえわかれば簡単に設定できると思う。
.vrapperrc or _vrapperrc not found

上述のエラーがmisleadingであり少し困った

https://github.com/vrapper/vrapper/issues/622

vrapperrcが読み込まれない時はそもそも読みに行っているかを疑うべきというissueがググると出てくる．
そしてEclipseのエラーログを見に行って見ると，"not found"なるエラーログが残っているのでさまざまな場所に.vrapperrcを配置して見たが解決せず．

結局原因は.vimrcからコピペしてきたこの一行

```
inoremap <silent> jj <ESC>
```

vrapperはvimの文法の一部にしか対応しておらず，silentでsyntax errorがおそらく起きているが，エラーの詳細までは表示してくれないよう． 素直に`inoremap jj <ESC>`であれば動作．
matplotlib.animationを利用してgif画像を作る (FuncAnimation)

matplotlibはデータ解析の可視化ツールとして一般的に用いられています．

今回は，matplotlib.animation機能を使ってgif画像を作ってみたので，そのコードを紹介します．
最終的には，以下のgifアニメーションを作りたいとします．

![test.gif](https://qiita-image-store.s3.amazonaws.com/0/186664/d0bd12a4-833d-18d8-c6bd-0673131e5f57.gif)

matplotlib.animationには，「ArtistAnimation」機能「FuncAnimation」機能があります．
今回は「FuncAnimation」機能で話を進めます．
「ArtistAnimation」機能については，こちらのページでまとめています．
[matplotlib.animationを利用してgif画像を作る (Artist Animation)](https://qiita.com/chopprin/items/1c0293aa29bb92340504)

こちらのページも参考にさせて頂きました．
+ [matplotlibのanimation.FuncAnimationを用いて柔軟にアニメーション作成](https://qiita.com/AnchorBlues/items/3acd37331b12e844d259)

# 動作環境

* Ubuntu
* Anaconda3(Python3.6.6)
* anaconda

#Subplot機能を用いずにgif画像を生成

以下のアニメーションを作りたいとします．

![test.gif](https://qiita-image-store.s3.amazonaws.com/0/186664/69cc4f6a-43d4-60de-635e-431465dfa7c6.gif)

コードは以下の通りです．

```py
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation

def update(i, x, y):
    if i != 0:
        plt.cla() #現在描写されているグラフを消去
    plt.plot(x[0:i], y[0:i], "r")
    plt.xlim(0,10)
    plt.ylim(0,100)
    
def draw():
    fig = plt.figure() #figure objectを取得
    x = np.arange(0, 10, 1)
    y = x ** 2
    ani = animation.FuncAnimation(fig, update, fargs = (x, y), interval = 100, frames = 10)
    ani.save("test.gif", writer = 'imagemagick')
```

draw()関数を実行すると，test.gifが得られます．

以下，FuncAnimationの引数の解説です．

* fig : figure object
* 呼び出す関数(今回はupdate関数)を指定
* fargs = (x,y) : update関数に渡したい引数
* interval  : 表示間隔
* frame : update関数を呼び出す回数

#subplot機能と組み合わせて使う．

さて，本題です．
以下のアニメーションを作りたいとします．

![test.gif](https://qiita-image-store.s3.amazonaws.com/0/186664/c56a4593-225e-1a90-fdee-081560a42112.gif)

コードは以下の通りです．

```py

def update(i, x, y, ax1, ax2):
    if i != 0:
        plt.cla() #現在描写されているグラフを消去
    ax1.plot(x[0:i], y[0:i], "forestgreen")
    ax2.plot(x[0:i], -y[0:i], "darkred")
    ax1.set_xlim(0,10)
    ax1.set_ylim(0,100)
    ax2.set_xlim(0,10)
    ax2.set_ylim(-100,0)
    
def draw():
    fig = plt.figure() #figure objectを取得
    fig, (ax1, ax2) = plt.subplots(2,1)
    
    x = np.arange(0, 10, 1)
    y = x ** 2
    ani = animation.FuncAnimation(fig, update, fargs = (x, y, ax1, ax2), interval = 100, frames = 10)
    ani.save("test.gif", writer = 'imagemagick')![test.gif](https://qiita-image-store.s3.amazonaws.com/0/186664/cd7dd698-5e40-3f73-1046-5f7535d345d7.gif)

```

draw()関数を実行することでtest.gifが得られます．

# まとめ

animation機能を使えば，計算過程を可視化出来たるすると思います．
相手にも伝わりやすくなるかもしれません．
React-Native コンポーネント　イベント



this.props.onXXXXX でイベントコール


## CustomButton


<CustomButton onClick={() => this._onClick()}/>


```react
import React, { Component } from 'react';
import {
  View,
  Alert,
} from 'react-native';

// Import native-base UI components
import {
    Button,
    Text,
} from 'native-base';

export default class CustomButton extends React.Component {
    constructor(props) {
      super(props);
      this.state = {
      };
    }
  
    render() {
      return (
        <View >
            <Button info onPress={this.props.onClick} ><Text>aaaaaa</Text></Button>
        </View>
      );
    }
  
  }
  
```
  
  
## SlideSwitch


<SlideSwitch onValueChange={() => this._onClick()} value={this.state.enabled}/>

```react
import React, { Component } from 'react';
import {
  View,
  Alert,
} from 'react-native';

// Import native-base UI components
import {
  Switch,
} from 'native-base';


import SettingsService from '../lib/SettingsService';


export default class SlideSwitch extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      enabled: false,
    };
    //settingsService
    this.settingsService = SettingsService.getInstance();
  }

  render() {
    return (
      <Switch onValueChange={() => this.onValueChange()} value={this.state.enabled} />
    );
  }

  onValueChange(value) {
    this.settingsService.playSound('BUTTON_CLICK');

    //status change
    let enabled = !this.state.enabled;
    this.setState({
      enabled: enabled
    });


    if (enabled) {

      Alert.alert( '', '記録を開始しますか？',
        [
          {text: 'No', onPress: () => {
            this.setState({
              enabled: false,
            });
          }, style: 'cancel'},
          {text: 'Yes', onPress: () => {
            this.onToggleEnabled(enabled);
          }
        },],{ cancelable: false }
      )
  
    } else {
      
    }

  }



  onToggleEnabled(enabled) {
    this.props.onValueChange(enabled);
  }

}

```
Node+Express上でTwitterOAuthするサンプル

[NodeJS](https://nodejs.org/ja/)で[Express](http://expressjs.com/ja/)を使ったことがなかったのですが、
[TwitterのOauth認証](https://developer.twitter.com/en/docs/basics/authentication/overview/oauth)するには、Express上で利用できる
[Passportモジュール](http://www.passportjs.org/)の[passport-twitter](https://github.com/jaredhanson/passport-twitter)というセットで実装するのが一般的そうでしたので利用しました。

NodeJSの文化が不明ですが、Twitterで認証をする良いサンプルが見つからなかったので、
サンプルコードと共にメモをします。

細かい実装は以下にサンプルコードを置いてあるので省略します。
認証を利用するには以下の実装があれば良いようです。

```javascript
// ...省略
var session = require('express-session');
var passport = require('passport');
var TwitterStrategy = require('passport-twitter').Strategy;

// ユーザ情報をセッションに保存するので初期化
app.use(session({
  secret: 'secret-key',
  resave: true,
  saveUninitialized: true
}));
// passport自体の初期化
app.use(passport.initialize());
app.use(passport.session());

// passport-twitterの設定
passport.use(new TwitterStrategy({
    consumerKey: '####',
    consumerSecret: '####',
    callbackURL: '..../auth/twitter/callback'
  },
  // 認証後の処理
  function(token, tokenSecret, profile, done) {
    return done(null, profile);
  }
));
// セッションに保存
passport.serializeUser(function(user, done) {
  done(null, user);
});
// セッションから復元 routerのreq.userから利用可能
passport.deserializeUser(function(user, done) {
  done(null, user);
});

// 各種ルーティング
app.use('/', indexRouter);
app.use('/success', usersRouter);
app.get('/auth/twitter', passport.authenticate('twitter'));
app.get('/auth/twitter/callback',
  passport.authenticate('twitter', { failureRedirect: '/?auth_failed' }),
  function (req, res) {
    res.redirect('/success');
  });
```

サンプルコード

 - https://github.com/ctyo/express-twitter-sample

参考URL

 - [Passport.js Documentation](http://www.passportjs.org/docs/twitter/)
 - [Node.js + Express + passport-twitterで認証Webアプリをつくる - Qiita](https://qiita.com/itagakishintaro/items/e5a0481b51e6a17b304c)
Chefのattributeをレシピで設定する書式

attributeは、通常cookbookのattributesディレクトリーの下などに置くが、レシピにも書ける。
ただ、記述方法が若干特殊で、default[]などでは無く、**node**.default[]の様に記述する。

例

```ruby:recipes/default.rb

# recipeで指定する際には、node.default[]の様にする。
# attributeに持って行く際には、node.を取ってdefault[]の様にする。
node.default[cookbook_name]['編集']['file']['/tmp/test.txt']['content'] = "abc\n"
node.default[cookbook_name]['編集']['file']['/tmp/test.txt']['mode'] = '755'
node.default[cookbook_name]['編集']['file']['/tmp/test2.txt']['content'] = "def\n"

...


hash = node[cookbook_name]['編集']
hash['file'].each do |f_name, f_attr|
  file f_name do
    content f_attr['content'] if f_attr['content']
    mode    f_attr['mode']    if f_attr['mode']
  end
end

```


#参考

[About Attributes](https://docs.chef.io/attributes.html)
Chef社のattributesのページ
改めて見ると、いろいろ拡張されていますね。black_list, white_list, rm,..
これからPyTorchに入門するためのリンク集

# PyTorch超入門

https://qiita.com/miyamotok0105/items/1fd1d5c3532b174720cd

* 丁寧でボリューム感がある
* MNISTの例がわかりやすい
* PyTorchによるニューラルモデルの実装例が多い

# ライトニングpytorch入門

https://qiita.com/sh-tatsuno/items/42fccff90c98103dffc9

* カスタマイズが参考になる
    * 自作活性化関数
    * Loss関数の自作
    * ダイナミックなネットワーク

# 実践Pytorch

https://qiita.com/perrying/items/857df46bb6cdc3047bd8

* Fine-tuningでResNetを利用する際の解説が厚め
* 自作関数の作り方が掲載

# 【詳細（？）】pytorch入門　〜CIFAR10をCNNする〜

https://qiita.com/kazetof/items/6a72926b9f8cd44c218e

* CIFAR-10を用いた実装例を紹介

# Deep Learning with PyTorch: A 60 Minute Blitz

https://pytorch.org/tutorials/beginner/deep_learning_60min_blitz.html

* 公式チュートリアル

# Creating extensions using numpy and scipy

https://pytorch.org/tutorials/advanced/numpy_extensions_tutorial.html

* Parameterの自作方法を紹介

# jcjohnson/pytorch-examples

https://github.com/jcjohnson/pytorch-examples

* 非公式チュートリアル
* 非公式ながら内容は厚い

# practical-pytorch

https://github.com/spro/practical-pytorch/blob/master/seq2seq-translation/seq2seq-translation.ipynb

* Attentionベースseq2seqの実装を紹介
* NMT屋さんは必読

# PyTorchリンク集

https://qiita.com/sotetsuk/items/313d2e844959f28bc225

* このページで紹介したリンクの他に、強化学習系、GAN系のリンクを記載

# The Incredible PyTorch

https://github.com/ritchieng/the-incredible-pytorch

* リンク集。非常に充実しているが、日本語記事はなさそう
AWS初心者がAWS勉強会に参加してみた③

この前やった②の続きです。
②ではAWSのコアサービスの一つであるネットワーキングサービスについて書きました。
③ではAWSコンピューティングについて記載します。

#AWSコンピューティング
AWSコンピューティングですが以下のようなサービスがあります。

**Amazon EC2**

Amazon EC2のEC2とは「Elastic Computing Cloud」の略であり、様々なコンピューティングパワーをユーザに提供し、自身でコントロールすることが可能です。
簡単に言うと、AWSが提供する様々なスペックの仮想マシンを調達することが可能です。

調達した仮想コンピューティングにはAMI（Amazon Machine Image）と呼ばれる
テンプレートを適用することで、Windows、Linux（RHEL、CentOS）や
NATサーバなどを数分で調達することが可能です。
また、キャパシティ（CPUとかメモリのスペックなど）の拡張や縮小も
要件や利用実態に合わせて、素早く実施することが可能です。

**Auto Scaling**

Auto Scalingは「Cloud Watch」というAWSが提供する監視サービスと統合し、日、週毎に
使用量が変化するようなアプリケーションに最適です。
また、Auto Scaling自体の利用料金は無料です。（需要増により増えたサーバは時間単位
の利用料金が発生しますので、利用料金の管理には注意が必要です）

ユーザが定義する条件に応じて、Amazon EC2のキャパシティ（CPUとかメモリのスペックなど）を
自動的にスケールアウトすることが可能です。
つまり、サーバの負荷が高い時はサーバの台数を自動的に増やし、
負荷が下がってきたらサーバの台数を元に戻すということで需要に応えながらも
コストを最小限に抑えることが可能になります。

あと、Auto Scaling自体の利用料金は無料です。（ただ、需要増により増えたサーバは
時間単位の利用料金が発生してしまうので、利用料金の管理には注意が必要です）



**Elastic Load Balancing**
アプリケーションへのトラフィックを複数のAmazon EC2へ自動的に配分します。
これにより、アプリケーションへのトラフィックに応じて必要な量の負荷分散能力を提供し、
アプリケーションの耐障害性を高めることが可能です。


**Elastic Load Balancing（Health Check）**
負荷分散対象のAmazon EC2内で正常ではないEC2が存在する場合は、正常になるまで
負荷分散対象から外す、ヘルスチェック機能を備えています。


**Elastic Load Balancing(FAile Over)**
アプリケーションがダウンした場合にELBのヘルスチェック機能を利用して
アプリケーションをフェイルオーバーする、ロードバランサー自体のダウンした場合に
AWSのDNSサービスである「Route53」を利用して他リージョンのロードバランサーへ
フェイルオーバーするなど、様々な耐障害性を高めるシステム構成を実現することも可能です。





以上です。
今回はただひたすら箇条書きで書くみたいな感じになってしまった。。

因みに勉強会で上がったのは上記のものだけでしたが、
実はまだ色々なコンピューティングが存在しているみたいです↓
https://aws.amazon.com/jp/products/

ご覧になるとお分かりになるかと思いますが、
コンピューティング以外にもかなり種類があって面白そうですよね。

自分はまだAWSについての見識が少ないので、
これからどんどん学んで有益な情報を出していけたら良いなぁと思います。


次回はストレージとDBについて書きます。

https://qiita.com/Hiyajo/items/3192521904a56c2cce82
PDFのドキュメントを作るのはやめよう、asciidoctor-pdfをやめた理由


# 

前回、[脱Word、脱Markdown、asciidocでドキュメント作成する際のアレコレ](https://qiita.com/tamikura@github/items/5d3f62dae55617ee42bb)でasciidocをHTMLとPDFに変換する方法を紹介した。

- asciidoctor・・・asciidocファイルをHTMLファイルに変換するruby製ツール
- asciidoctor-pdf・・・asciidocファイルをPDFファイルに変換するruby製ツール

当初はドキュメントをHTMLとPDF両方のフォーマットで公開していた。
**が**、`asciidoctor-pdf`を使ったPDF変換は**あまりにも面倒**なので、メンテするのを止めた。
その理由を記載する。

## 理由1. 文字の色が変えられない

markdownと違って、asciidocでは文字色は変えられるが、asciidoctor-pdfのバグか、文字の色が変えられない。

## 理由2. レイアウトが崩れる

長い表の場合などレイアウトが崩れる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/10862/7c156fe4-5d4f-7f19-bfb9-2e17c017564d.png)

## 理由3. HTML/PDF両方確認するのが面倒

理由1, 2などにより、HTMLとPDFでは全く同じ結果にならないので、両方確認する必要があり、すごい面倒。

## 理由4. GIFが使えない

ドキュメントで分かりにくい箇所はアニメーションGIFを使っているが、
PDFでアニメーションGIFが使えない。

```
image:animation.gif[アニメーションgifは表示されない]
```

↓ PDF変換

![image.png](https://qiita-image-store.s3.amazonaws.com/0/10862/b1c6bf65-7582-de1f-75d4-bca3d9b74380.png)


## 理由5. HTMLとPDFの分岐ロジックを書くのが面倒

「理由4. GIFが使えない」とかでHTMLとPDFの差異がある場合、asciidocで以下のように分岐処理を書かないといけない。

```
ifeval::["{backend}" != "pdf"]
image:animation.gif[]
endif::[]
```

## 理由6. 別文書へのリンクが切れる

文書内でも文書外でも別の場所へ飛ぶときにリンクを貼ることはPDFでも可能。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/10862/ad0ba336-3219-7f5e-69f8-a5d766486f2a.png)

文書内リンクは意識する必要はないが、文書外のリンクは当然、そのファイルもダウンロードなどしておかないといけないし、相対パスもパスはちゃんとあっていないといけない。

でもぱっと見、リンクが文書内か文書外か、リンク先がちゃんとあるか、**判別不能**。

## 理由7. PDF変換が長い

adocファイルからPDFに変換する場合、HTMLと比べて**10倍時間がかかる**。
asciidocファイルをGithubで管理。プルリクエストがmasterにマージされたタイミングでJenkinsでhtml/pdf変換をかけているが、30ファイルくらいあると**ジョブが20分以上かかる**。

## 最後の理由. 頑張ってもみんなPDFを見ない

いつでも最新のHTMLと、**最新かどうかわからないPDF**、当たり前だが普通の人はみんなHTMLを見る。PDFで見る人はいない。

PDFにしたいと思われるケースとして、以下がある。

- ネットワークに繋がらない場所で見たい、ネットワーク障害発生
 - そんなレアケースのために頑張る？
- ファイルとして渡したい
 - ゼロではないが、HTMLをAWS S3にアップロードして、静的サイトで公開したほうがラクでは？（セキュリティが気になるならIP制限とかかければ？）

が、そこまでして頑張る気も起きず、「PDF止めます」と宣言しても、特に反対もなく、PDFをやめました。
Eclipseで関連する要素の背景色が反転しない

Eclipse上で選択した変数や型などの要素が使用されている箇所の背景色がマークされなくなった場合、以下設定で該当箇所にマークが付けられる。

ウィンドウ⇒設定⇒Java⇒エディター⇒出現箇所のマーク
AWS Summit Tokyo 2018で気になった内容メモ_今すぐ実現できるゲームのクラウド対応 〜GameSparksとAmazon GameLiftでユーザー動向に即応〜

AWS Summit Tokyo 2018の「今すぐ実現できるゲームのクラウド対応 〜GameSparksとAmazon GameLiftでユーザー動向に即応〜」のセッションを聴いて、個人的に気になった部分をまとめています。
まだ資料が公開されておらず、個人のメモをベースに書いているため、内容が全て網羅されているレポートではありません。
資料、動画が公開されたら別途ちゃんとしたレポートを書きます(多分)

# ゲームに必要なバックエンドサービス
ゲームのバックエンドサービスは、下記のような機能が主に作られる。

## 基本要素
- ユーザ管理、認証
- 課金管理
- フレンド
- チーム
- チャット
- リーダーボード

## ゲーム要素
- ゲーム内通過
- ロビー
- etc...

クライアントでこれらのを実装すると、クラックされてしまう恐れが強まるため。

## バックエンドサービスの大変なところ
- 実装工数がかかる
- リリース後もバグ修正や機能向上が必要
- 運用時に障害が発生した際、夜間や休日でも呼び出されることがある
- プログラムのバグだけでなく、データ更新に失敗した時なども呼び出される

# GameSparks
## 概要
- ゲームのバックエンドサービスをサーバーレスで実現
    - 認証、課金、ガチャ、etc...
    - 色々なゲームの機能があらかじめ用意されている
- 開発時間とコストの削減
- ゲームデータをリアルタイムに分析、更新
- 複雑な機能も、色々ある機能の組み合わせで作れる

これらを対応することで、バックエンドエンジニアの負担を減らすことができる。

## 充実したサービス群
- リアルタイムのデータリレーサービス
	- 数人〜数十人のリアルタイムマルチプレイも簡単に実現
- アナリティクス
	- 視覚的なユーザ動向の分析も可能
- UnityやUnreal Engineにも対応しており、Webブラウザからも使える

## Webインターフェース上で開発できる
Web上に管理画面的なインターフェースが用意されており、下記のようなことが可能になる。

- プロジェクト横断的に開発、分析可能
    - 同じGameSparksのアカウント内の情報は見れるようにできる
- データ作成
    - 例えば、ガチャのアイテムのリストを作るだけで、ガチャのデータを作れたりする
- 機能テスト、デバッグ
- カスタムインターフェース
- サーバーサイドのプログラムを直接書くこともできる

## サポート体制
- 24時間/365日対応
- 障害情報もWeb上で共有

## 始め方
- アカウントを登録すれば、簡単に始められる
- 無料期間もある

## 操作
- 開発ユーザの権限管理で、外部の開発会社の人も同じ環境に混ぜて一緒に開発することもできる
- Cloud Code

## Test Harnessというテスト環境
- すべてのWebのインターフェースからテストできる
	- Postman的な機能もある

## GameSparksのまとめ
- 開発工数の短縮
- 運用工程も簡単になる
	- 調査用のページを用意しておくことで、エンジニアじゃなくても障害時の調査がある程度できるようになるから


# Amazon GameLift
## 概要
- 複数人プレイのゲームセッションをAWSのグローバルなサーバインスタンス群で稼働させ、スケーリングも柔軟に扱えるソリューション
	- FPSとか
	- 非同期オンラインプレイとか
- 内部的にはEC2が稼働している
 
## マルチプレイのゲーム開発でよく聞く内容
- 機能の要件
	- チート対策
	- eスポーツ
	- 課金とかの安全性
	- コンソールやPCへの展開
- 世界展開を見据えておきたい

## P2Pネットワークアーキテクチャ
- 最初に立ち上げた人がhostになり、他の人がclientになりつなげる
- hostになったプレイヤーとclientになったプレイヤーで公平性が保てない
	- hostがやめるとすべてのclientがゲームをプレイできなくなる
	- clientが抜ける分にはゲームを続けられる
    - hostになったプレイヤーは自分がサーバのため、レイテンシ0でプレーできる

## サーバ・クライアント型アーキテクチャ
- すべてのclientに平等
- これをやりやすくするのがGameLift
- 世界展開とオートスケーリングで柔軟に対応

## GameLiftの機能
- サーバインフラ管理
	- オートスケーリング
	- 複数AZ
	- 自動リージョンフェイルオーバー
	- DDosプロテクション
- セッション管理
	- プレイヤー、ゲームセッション
	- ワールド管理

## GameLiftのオートスケーリング
- プレイヤーの参加状況に応じて増減させる
- スポットインスタンスに対応したため、よりコストを削減できる

## FleetIQとSpot Instance
- インスタンスをLatency、Termination Rate、Costというカテゴリに分類する
- カテゴリ分けした中から、ターミネイトされる確率が低いインスタンスをなるべく選ぶようにしてくれる
- 通常のサーバ構成でEC2のインスタンスが障害で落ちる確率より低いターミネイト率にできる

## メッシュ型ネットワークモデルからの移行例
- For Honor(Ubisoft)
	- 一部のクライアントのレイテンシの悪影響が全クライアントに影響してしまうことが起きた
	- リリース後にGameLiftに移行し、問題なくなった
- Friday the 13th: The Game(illFonic)
	- P2P型
	- ホストプレイヤーキャンパーになっていまうと、ジェイソンにやられると止めてしまう確率が高いので、他の参加者がプレイできなくなる事象が多発
	- レイテンシの問題も発生していた
		- ホストのユーザだけ早い
	- これらの問題解決のため、GameLiftへ移行した
- その他移行例
	- Quake Champions
		- P2P型からGameLiftへ移行

## GameLift導入に共通するモチベーション
- ユーザエクスペリエンス向上効果 > サーバコスト
	- P2Pでサーバコスト0として出していたゲームも、UX向上のためにサーバコストをかけてGameLiftを導入している

## GameLiftまとめ
- 対戦、協力プレイ用のサーバを低コストで導入・運用可能
	- かなり冒険的なサービスや価格の提供も可能
	- コストもかなり安い
	- 利用料はインスタンスが運用された時間の分のみ

# 感想
どちらも本当に使えればかなり良さそう。
特にGameSparksは、「これだけできたらサーバーエンジニアいらなくなるのでは？」と自分の仕事がなくなる危機を感じる程だった。
バックエンドエンジニアは、プログラムの実装、設計とか「作る」スキルだけじゃなくて、こういうものを「使う」スキルも身に着けて行くべきなのかもしれない。
RailsでPostgreSQLのシーケンス値を直接操作する

# PostgreSQLでテーブルを持たずシーケンスだけを扱う場合などに使用する


## 現在のシーケンス値を取得する

```ruby:sample.rb
ActiveRecord::Base.connection.execute("select currval('user_transaction_id')").first["currval"]
```

## シーケンス値をカウントアップし値を取得する

```ruby:sample.rb
ActiveRecord::Base.connection.execute("select nextval('user_transaction_id')").first["nextval"]
```

### 又は、`find_by_sql`を使用する

```ruby:models/user.rb
class User < ActiveRecord::Base end

# 現在のシーケンス値を取得する
User.find_by_sql("select currval('user_transaction_id')").first.currval
# シーケンス値をカウントアップし値を取得する
User.find_by_sql("SELECT nextval('user_transaction_id')").first.nextval
```

# 参考

http://akio0911.net/archives/2630
SSH環境下のCentOSで文字化けした場合の対処法

## 状態

ユニコード文字がエスケープされている

## やったこと

状態確認

```
$ localectl status

System Locale: LANG=ja_JP.utf8
VC Keymap: us
X11 Layout: n/a
```

Keymapを修正

```
$ localectl set-keymap jp106
```

再度確認

```
$ localectl status
   System Locale: LANG=ja_JP.utf8
       VC Keymap: jp106
      X11 Layout: jp
       X11 Model: jp106
     X11 Options: terminate:ctrl_alt_bksp
```

日本語のlocaleが使用可能か確認

```
$ localectl list-locales | grep -i ja
```

そもそもなかったので追加

```
$ localedef -f UTF-8 -i ja_JP ja_JP
```

再度確認

```
$ localectl list-locales | grep -i ja

ja_JP
ja_JP.utf8
```

これで文字化けしなくなりました。

## 備考

タイムゾーンは参考元と微妙に違う（多分大丈夫？）

```
$ timedatectl status

      Local time: 木 2018-05-31 15:36:42 JST
  Universal time: 木 2018-05-31 06:36:42 UTC
        RTC time: 木 2018-05-31 06:36:41
       Time zone: Asia/Tokyo (JST, +0900)
     NTP enabled: yes
NTP synchronized: yes
 RTC in local TZ: no
      DST active: n/a
```
## 参考

* https://7me.oji.0j0.jp/2016/centos7-locale-timezone.html
* https://qiita.com/you-me/items/96ad9a9aa89a3d239163
Python3で文字列をUnicodeエスケープ／アンエスケープした文字列を得る

# はじめに

Python3にて、全角文字を使えない箇所に対して、Unicodeエスケープをした「文字列」を設定したかったのですが、ぱっと調べて出てこなかったのでメモしておきます。

# 文字列をUnicodeエスケープ文字列に変換する

unicode-escapeでエンコードしたものをasciiでデコードします。

```python
text = 'Unicodeエスケープ'
print(text.encode('unicode-escape').decode('ascii'))
```

```:出力
Unicode\u30a8\u30b9\u30b1\u30fc\u30d7
```

ちなみに、エンコーディングをunicode-escapeではなく、asciiにしてもできます。その場合は、さらにbackslashreplaceを指定する必要があります。

```python
text = 'Unicodeエスケープ'
print(text.encode('ascii', 'backslashreplace').decode('ascii'))
```

```:出力
Unicode\u30a8\u30b9\u30b1\u30fc\u30d7
```

# Unicodeエスケープされた文字列を普通の文字列に変換する

asciiでエンコードしたものをunicode-escapeでデコードします。

```python
text = 'Unicode\\u30a8\\u30b9\\u30b1\\u30fc\\u30d7'
print(text.encode('ascii').decode('unicode-escape'))
```

```:出力
Unicodeエスケープ
```

ちなみに、こちらの方はbackslashreplaceは使えません。

# まとめ

対称性を考えると、backslashreplaceではなくunicode-escapeを使った方が分かりやすいですね。
Microsoft Flow から Teams にリッチテキストを投稿する

# はじめに

Microsoft Flow を使って、Teams に投稿する方法は

* Incoming Webhook
* Teams Post Message

の 2 種類があります。

Incoming Webhook を使った投稿の仕方は以下にわかりやすくまとめてあります。

* [Microsoft Flow を使って Microsoft Teams へ投稿する](https://idea.tostring.jp/?p=2737)
* [Microsoft Flow を使って Microsoft Teams へ投稿する（続編）](https://idea.tostring.jp/?p=3128)

Incoming Webhook を使えば、JSON 形式のメッセージを送信することでリッチなテキストを Teams に投稿することができます。
しかし、会社のセキュリティポリシー等で Incoming Webhook が禁止されている場合、Teams Post Message を使うしかありません。

そこで、Teams Post Message を使ってリッチなテキストを投稿する方法を調べてみました。

# 結論

Teams Post Message では、HTML がサポートされているので、HTML を使うことでリッチなテキストを投稿できます。

なお、Teams Post Message では Markdown はサポートされていません。

> **参考:**
> [Incoming Webhook と Post Message の比較記事](https://powerusers.microsoft.com/t5/Microsoft-Flow-Community-Blog/Posting-to-Teams-with-Flow-Incoming-Webhook-verses-Teams-Post/ba-p/97095)
> 実際に HTMML を使った投稿の例があります


## 注意点

Post Message のほうが手軽に設定できますが、投稿者が自分自身 (Flowを作ったアカウント) になってしまいます。
(Webhook の場合は、投稿者は `Webhook` になります。はじめに で紹介した記事参照。)
React+TypeScriptについての考察メモ（調査中）



# はじめに
Visual Studio 2017で、ASP.NET Core 2.1をインストールしたら、
ReactテンプレートがTypeScript→ES6 (JavaScript)に変わっていた。（2018.6.4に気づいた）

[ASP\.NET Core 2\.1\.0 now available \| ASP\.NET Blog](https://blogs.msdn.microsoft.com/webdev/2018/05/30/asp-net-core-2-1-0-now-available/)


Microsoftがなんらかの方針転換をやったのか？

2018.6.4現在、調べているが核心にまだたどり着けず。


### 以下、手がかりになりそうなものを見つけたのでメモ

[ASP.NET Core 2 React.js Template with ES6 (not TypeScript)](https://dev.to/dance2die/aspnet-core-2-reactjs-template-with-es6-not-typescript-f71)


[Why isn't typescript used more in the react community? : reactjs](https://www.reddit.com/r/reactjs/comments/7yxecm/why_isnt_typescript_used_more_in_the_react/)

[If TypeScript is so great, how come all notable ReactJS projects use Babel? - React Discuss](https://discuss.reactjs.org/t/if-typescript-is-so-great-how-come-all-notable-reactjs-projects-use-babel/4887)
ionic3での小技集（随時追加）

#ionic3での小技集
メモがてらに書きます。

##小技1 : Mainページ以外でTabbarを消す方法
アプリ上でタブはほぼ必須だと思いますが、設定や編集ページにおいてタブは必要ありません。そんなとき1行追加するだけで、タブを非表示にできる方法があります。

```app.module.ts
@NgModule({
  declarations: [ MyApp ],
  imports: [
    IonicModule.forRoot(MyApp, {
      tabsHideOnSubPages: true,
    })
],
  bootstrap: [IonicApp],
  entryComponents: [ MyApp ],
  providers: []
})
```
```tabsHideOnSubPages: true``` を追加することで、サブページにおけるタブが非表示になります。
Windows10 + Ubuntu コンソール で gitの日本語を見えるようにする

Windows10 でUbuntuコンソールを立ち上げて、操作できるのが嬉しくて、
Git操作は、全てUbuntuコンソール上でやるようにしている。
（TortoiseGitとか GUIで今ではできるけど、やっぱりコンソール上でコマンド打つのがなんかお気に入りの古い人（？）です）

ただし、デフォでインストールしたUbuntuコンソールでは、日本語が化けます。
そこで、以下の操作を行いましたので、備忘録として残します。

1.  日本語パッケージのインストール  
```
sudo apt install language-pack-ja
```
* LANGを日本語へ  
```
sudo update-locale LANG=ja_JP.UTF-8
```  
※立ち上げ直しが必要
* コンソール ウィンドウのフォントを日本語用に修正  
```
ウィンドウのUbuntuアイコンを右クリック→ プロパティ → フォントタブをクリック → フォントを日本語用のものへ修正
```
* gitのエスケープ設定を変更して、日本語が表示されるように  
```
git config --local core.quotepath false
```

以上です。

## 参考情報

* 【Windows10/WSL Ubuntu】日本語のロケールとタイムゾーンの変更 - The modern stone age.
    * https://www.yokoweb.net/2018/03/07/windows10-wsl-japane-locale-timezone/
* [小ネタ][git] 日本語ファイルの文字化けを回避する
    * https://dev.classmethod.jp/tool/git/git-avoid-illegal-charactor-tips/
【GIT】git pushするときに直接ユーザ名を指定する方法

git pushしたら、

```
remote: Permission to aaaa/hogehoge.git denied to [意図しないユーザ名].
```


ってでてきたりして困るときがあります。


git globalに意図しないユーザが登録されているからだと思うのですが、
僕みたいなgit初心者は「どうしよう！どうすればいいの！」ってなっちゃいます。

そんなときは、

`git push https://[pushしたいユーザ名]@github.com/aaaa/hogehoge.git master`

という形でpushしてあげるといけます。

多分はじめcloneしてくるときに上記のURLでcloneしてくれば大丈夫なんだと思う・・・
Webサービス作成までの道のり(その１)

##Webサービス作成の経緯
友人から軽いノリで「Web予約サービスがあったら便利だ」という話があった。
私の友人は、パーソナルトレーナー(スポーツトレーナーの総合個別指導のようなもの)として独立し、フィットネス施設を間借りするような形で、お客さんから依頼があれば指導をしている。お客からの指導依頼は、個人の携帯に電話やメールをもらい、予約を受けているのだが、「今から30分後にお願いしたい」など、急な依頼も頻繁にあるようで、指導中に連絡を取れないと、ビジネスのチャンスを逃してしまう。
そんな彼の為に、自身の勉強も兼ねてWeb予約サービスを作ってみることにした。

##サービス内容の検討
まずは、大枠だけ以下のように考えてみた。
■サービス概要
パーソナルトレーナーへのトレーニング指導をWeb上で予約する為のサービス																		
																			
■提供サービス
・会員登録機能
・登録確認機能（メール添付URLクリックにて登録完了）
・スケジュール確認機能
・予約機能（予約/取り消し）
・予約結果メール送信機能
・アクセスMAP機能（グーグルマップ連携）

■デザイン/設計案
・配色は白黒ベースで大人っぽさがある中でも、やわらかさが出るようにカラーを使ったデザイン
・利用者は富裕層（高齢者も多い）そうなので使いやすく、シンプルなボタン配置とサイズ
・予約、スケジュール確認がメインとなるので、カレンダー等が見やすく分かりやすさを重視。デザインもそこを強調
・管理者が後々、会員情報を利用しやすいような設計を考える

■動作検証端末
・PC(Chrome,IE)
・スマホ(iPhone,Galaxy)
※スマホは自身の端末でも試すが、テストは基本、Chromeのディペロッパーツールで、スマホ画面を確認

##開発環境
開発環境は以下のように検討中。
[ソフト]
・VMware Player6.0.7
・CentOS7.4
・Apache HTTP Server2.4.6
・Apache Tomcat9.0.8
・java1.8.0_171
・html/Bootstrap/JavaScript
・eclipse
・GlassFish
・postgresql
・セキュリティソフト（未定）
・Chromeデスクトップ

[ハード]
・windows7 32bitメモリ2GBノートPC
・windows7 HomePremium 64bitメモリ4GBデスクトップPC

自身のノートPCのスペックでは、eclipseでの開発に耐えられない為、自宅のデスクトップPCにChromeデスクトップでアクセスして作業をする。(リモートデスクトップを使用しないのは、HomePremiumがリモートデスクトップ非対応の為)
フレームワークには、Java EEの安定感と作業工数の削減を考えてJSFを使用することとする。

##開発手順
■環境構築
・CentOSでの開発環境構築

■デザイン作成
・xhtml/Bootstrapでのデザイン案作成（大枠）

■javaでの製造
・EclipseにGlassFishを使用しJSF環境用意
・JSFを使用し開発

■デザイン修正
・JavaScriptで動きをつける

■動作確認テスト
・動作検証端末毎に同様のテスト実施が出来るように簡易なテスト仕様書を作成し実施
・障害改修

■本番環境移行

##今後について
ある程度、作業に区切りがついた段階で、キータに作業状況をアップしていく予定でいる。
現在、環境構築を進めていて、tomcatの起動までは確認が済んだところ。これからデザインに入るところだが、勉強中の中での作成案なので、作業が大幅に変わる可能性もある。その際は、随時投稿記事も修正していく。

不明点が多い中での、サービス作成である為、アドバイスを頂けるとうれしいです。
[Ruby]消費税の計算結果「1836.0000000000002」を整数で表示させる方法

Rubyで消費税を計算しようとすると、計算結果が整数で表示されません。そこでどのように解決をすれば良いのかをまとめました。また、小数点以下切り捨て、切り上げ、四捨五入の方法についてもまとめています。

##消費税の計算
下記の計算式で消費税を計算

```ruby
puts 1700 * 1.08  #1836.0000000000002
```

結果が「1836.0000000000002」となってしまいます。

理想の結果「1836」と表示させるにはどうすればいいのでしょう。

###■切り捨て

小数点以下を切り捨てる場合、floorメソッドを使用します。


```ruby
tax = 1700 * 1.08
puts tax.floor
# 1836
```

「1836」と表示させることができました。

他の例で見てみると、

```ruby
puts 32.154729.floor # 32
puts puts 2567.87.floor # 2567
```

小数点を切り捨てる位置を指定する場合、引数に桁数を指定することができる。

```ruby
puts 32.154729.floor(2) # 32.15
puts puts 2567.87.floor(1) # 2567.8
```


###■切り上げ

小数点以下を切り上げたい場合、ceil メソッドを使います。

```ruby
tax = 1700 * 1.08
puts tax.ceil
# 1837
```

結果は1837になりました。



###■四捨五入

四捨五入をしたい場合は、round メソッドを使います。

```ruby
puts 563.568.round # 564
puts 3.44.round #4
```

四捨五入する桁数を指定すると、

```ruby
puts 563.568.round(2) #563.57
puts 3.44.round(1) #3.4
```
真の‪ツイートふぁぼマンになったので自動化した

#概要
色々あって友達とTwitterでやり取りをしていたら**真のおっぱいツイートふぁぼマン**になった。
ずっとTwitterで自動化したいと思っていたこともあったので練習がてら、その人のツイートに「おっぱい」が含まれていたらいいねをするツールを作ろうと思った。

どちらかというと初めてTwitterAPIを叩いたよっていう個人的なメモ。
#準備
##アプリケーション登録
**Consumer Key**
**Consumer Secret**
**Access Token**
**Access Token Secret**

を発行するために[Twitter Application Management](https://apps.twitter.com/)にアクセスして必要事項を入力する。
最初はAccess TokenとAccess Token Secretが発行されていないので、Keys and Access Tokensの下部にあるCreate my access tokenボタンをクリックして、生成する必要がある。
詳しくはググって。

##ライブラリのインストール
自分はtwitterを使った。
https://github.com/sixohsix/twitter

```
pip install twitter
```

#プログラムを書く
***参考にしたサイト***
[Pythonでみんなの呟きを解析して自動でツイートするTwitter Botを作った話](http://www.rikei-zukin.com/entry/2018/04/21/170000)
というかここのコードをそのｍ(ry
[Twitter REST APIの使い方](https://syncer.jp/Web/API/Twitter/REST_API/)
###プログラム
```python:twibot.py
# -*- coding: utf-8 -*-

from twitter import *

# キーとアクセストークンを設定する
auth = OAuth(consumer_key="***************************",
             consumer_secret="*******************************",
             token="***************************",
             token_secret="***************************")

t = Twitter(auth=auth)

# UserStreamを取得
t_userstream = TwitterStream(auth=auth, domain='userstream.twitter.com')

# @aokani_3の"おっぱい"を含むツイートを検索(リプライ, RTを除く)してふぁぼする関数
def like():

    tweet = msg['text']
    tweet_id = msg['id']
    screen_name = msg['user']['screen_name']

    if "aokani_3" in screen_name and "おっぱい" in tweet and "RT" not in tweet and "@" not in tweet:
        id = int(tweet_id)
        print('ツイート発見')
        t.favorites.create(_id=id, include_entitles="true")
        print('いいね完了')

# 実際にここが動く
print('start')
for msg in t_userstream.user():
    print('rooding')
    if 'text' in msg:
        like()
```

JSONで返ってくるので必要な値（```msg['text']```ツイート文、```msg['id']```Tweet ID、```msg['user']['screen_name']```ユーザ名(スクリーンネーム)）を取り出す。
[Tweet Object(ツイートオブジェクト)の説明](https://syncer.jp/Web/API/Twitter/REST_API/Object/Tweet/)を見ながら書いた。

if文で判定。
```t.favorites.create(_id=id, include_entitles="true")```でそのツイートをいいねする。
[POST favorites/create - いいねを付ける](https://syncer.jp/Web/API/Twitter/REST_API/POST/favorites/create/)を見た。

あとはfor文で回すだけ。

#結論
結論というほどでもないけど……

とりあえず、UserStreamが廃止されるのを知ったのでそこを変えるのを考えないといけない。
Windows10(64bit)にVagrant+VirtualBoxで開発環境作る2

# 概要

[その1](https://qiita.com/halnique/items/0cba26b4250e0b81d790)の続き

Windows10にVagrantとVirtualBoxを入れてCentOS7のVM作成までやってみた

今回はyumリポジトリの追加とかパッケージインストールとか

- Nginx 1.12 (epel)
- MySQL 5.7 (mysql80-community)
- Redis 4.0 (remi)
- PHP 7.2 (remi)

# 復習

```bash
$ vagrant ssh
[vagrant@localhost ~]$
```

VMにsshした状態から諸々作業していく

# epelリポジトリ

Nginxのインストールやremiリポジトリで使う

```bash
[vagrant@localhost ~]$ sudo yum install -y epel-release
```

# remiリポジトリ

CentOS標準だとPHP5.4系が入ってしまうが、今回は7.2系を使いたいのでremiを使う

```bash
[vagrant@localhost ~]$ sudo rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
```

7.2系が入るように、デフォルトで有効なリポジトリを切り替える

```bash
[vagrant@localhost ~]$ sudo yum-config-manager --enable remi
[vagrant@localhost ~]$ sudo yum-config-manager --enable remi-php72
```

# MySQLリポジトリ

MySQLを入れる前に、CentOS7系だとデフォルトでMariaDBが入っているのでバッティングしないように削除する

```bash
[vagrant@localhost ~]$ sudo yum remove -y mariadb-libs
```

で、[公式](https://dev.mysql.com/downloads/repo/yum/)のリポジトリを追加する

※ MySQL8.0っぽいリポジトリだが、5系も含まれている

```bash
[vagrant@localhost ~]$ sudo rpm -ivh http://dev.mysql.com/get/mysql80-community-release-el7-1.noarch.rpm
```

8.0系じゃなくて5.7系が入るように、デフォルトで有効なリポジトリを切り替える

```bash
[vagrant@localhost ~]$ sudo yum-config-manager --disable mysql80-community
[vagrant@localhost ~]$ sudo yum-config-manager --enable mysql57-community
[vagrant@localhost ~]$ sudo yum install -y mysql-server
```

※ MariaDBとMySQLどっちがいいの？っていうのはよくわからず…MySQLしかちゃんと触ったことないので

# パッケージインストール

リポジトリは準備OKなので、インストールする

```bash
[vagrant@localhost ~]$ sudo yum install -y nginx mysql-server redis php php-devel php-mbstring php-pdo php-fpm
```

# 確認

```bash
[vagrant@localhost ~]$ nginx -v
nginx version: nginx/1.12.2
[vagrant@localhost ~]$ mysql --version
mysql  Ver 14.14 Distrib 5.7.22, for Linux (x86_64) using  EditLine wrapper
[vagrant@localhost ~]$ redis-server --version
Redis server v=4.0.9 sha=00000000:0 malloc=jemalloc-3.6.0 bits=64 build=8e246a05989e6d22
[vagrant@localhost ~]$ php -v
PHP 7.2.6 (cli) (built: May 23 2018 09:50:51) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
```

とりあえず入ったが、疲れたのでここまで

# この先

起動確認した後に自動起動の設定とか

作ったイメージのexportとか

# 最後に

[Chef](https://www.chef.io/chef/)使おうよとか[Docker](https://www.docker.com/)じゃないのとかあるんですが

順番に学んでいきたいと思っております
Data Bindingのレイアウトxmlの中で拡張関数を使用する

# 何がしたかったのか

Androidデータバインディングライブラリを使用していて、レイアウトxmlの中でKotlinの拡張関数を使用する状況があったのですが、少しハマったのでメモしておきます。

例えば以下のような`Int`の拡張関数を定義していたとして、

```kotlin:Int.kt
package itmammoth.tengmoo.ext

fun Int.toStringWithSeparator() = "%,d".format(this)
```

これをレイアウトの中で、次のように使いたかったとします。

```xml:layout.xml
<layout ...>
    <data>
        <variable name="summary" type="itmammoth.tengmoo.entity.Summary" />
    </data>

    <android.support.constraint.ConstraintLayout ...>

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{summary.amount.toStringWithSeparator()}" /><!-- ここで使用 -->

    </android.support.constraint.ConstraintLayout>
</layout>
```

残念ながら、これはエラーになります。

```
****/ data binding error ****msg:cannot find method toStringWithSeparator() in class int file:...
```

intの中に（拡張関数として定義した）`toStringWithSeparator`メソッドが無いよって怒られます。これはデータバインディングライブラリがktファイルをコンパイルしてできるJavaのclassファイルを参照しているから（のはず）。

# 解決策

Kotlinの拡張関数は一定の法則の基づきjavaの単なるstaticメソッドとして定義されます。例えば先程の拡張関数は`itmammoth.tengmoo.ext`パッケージの`Int.kt`というファイルでした。Kotlinはこれを同パッケージの`IntKt`というクラスとして作成し、そのIntKtクラスのstaticメソッドとして`toStringWithSeparator`メソッドを定義します。

つまり以下のようにレイアウトxmlを書けば上手く行きます。

```layout.xml
<layout ...>
    <data>
        <import type="itmammoth.tengmoo.ext.IntKt" /><!-- ★import文を追加★ -->
        <variable name="summary" type="itmammoth.tengmoo.entity.Summary" />
    </data>

    <android.support.constraint.ConstraintLayout ...>

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{IntKt.toStringWithSeparator(summary.amount)}" /><!-- ★staticメソッドを呼び出すように変更★ -->

    </android.support.constraint.ConstraintLayout>
</layout>
```

要するにデータバインディングを使用するレイアウトxmlの中はJavaWayで書けってことですね。
Herokuの無料プランで複数のPython製botを動かす方法

## 重要なお知らせ

以下の内容はバージョンアップ等に伴い、利用できなくなりました。

discord.py で複数botを動かしたい場合はこちらを参考にしてください。
[【discordpy】issue #516 解読メモ | Qrunch（クランチ）](https://qrunch.net/@1ntegrale9/entries/6MLUUgNgMHyJlaIM?ref=qrunch)

## 前書き

自分はHerokuの無料プランで複数のPython製botを動かしていますが、
無料で動かしたい場合には当然1アプリ内で複数起動する必要があります。

botが基本的に非同期で動作する都合上、
起動処理を単に並べるだけでは1つのbotしか動作しないため、
複数のbotを動かすためには少し工夫が必要になります。

因みに今でも誤解が多いのですが、以前プラン内容の変更があり、
Herokuの無料プランでbotを動かしても24時間365日動作します。
※但し細かい制約があるため詳細は[公式サイト](https://jp.heroku.com)から確認してください。

## 手順

結論から言えば、マルチスレッドで動かすのが正解です。
threading.Thread や concurrent.futures を利用しましょう。

Herokuの無料プランでは1アプリにつき1プロセス(dyno)と決まっているので、
マルチプロセスで動作させようとするとエラーとなります。
(multiprocessing は使っちゃダメです)

下記のようなコードになると思います。

```py
# botのライブラリをimport
import discord
from mastodon import Mastodon, StreamListener

# threading.Threadをimoprt
from threading import Thread

# ここにbot本体の記述

# discord botの起動
job = Thread(target=discord_client.run, args=(DISCORD_BOT_TOKEN,))
job.start()

# mastodon bot の起動
job = Thread(target=mstdn.stream_user, args=(MstdnStreamListener(),))
job.start()
```

## おまけ

Python で discord bot を作成したい方はこちらを参考にどうぞ。
[Pythonによる実用Discord bot / discord.py解説 - Qiita](https://qiita.com/1ntegrale9/items/9d570ef8175cf178468f)

## 参考リンク
- [Pythonの並列・並行処理サンプルコードまとめ - Qiita](https://qiita.com/castaneai/items/9cc33817419896667f34)
- [Pythonでの並行処理と並列処理 - Qiita](https://qiita.com/ogihara/items/1b7f002b7d14a2710bce)
- [Python3.2以降でのマルチタスク処理はThreadではなくconcurrent.futuresを使え - Qiita](https://qiita.com/tag1216/items/18f37f22589a46082fd3)
unityプロジェクトをxcodeでビルドしたら「No known class method for selector 'positionView:inParentBounds:withAdPosition:」

xcodeで、
```「No known class method for selector 'positionView:inParentBounds:withAdPosition:」```

色々positionViewの違う引数のメソッドを試してみてもだめ。
//    [GADUPluginUtil positionView:self.nativeExpressAdView inParentView:unityView.bounds adPosition:self.adPosition]

でググったところ。



https://groups.google.com/forum/#!topic/google-admob-ads-sdk/M0NCtnTk0PY


このファイルを消す必要があるみたい。。
一度SDK周りを削除して入れ直した気がするんだけど。。汗

"Assets/Plugins/iOS/GADUNativeExpressAd.h",
"Assets/Plugins/iOS/GADUNativeExpressAd.m",




別で、"Unknown type name 'GADUTypeNativeExpressAdClientRef"こういうエラーがでたら、


こちらの記事が大変参考になりました。m( _ _ )m

http://combodevelop.hatenablog.com/entry/2018/04/15/113658
Cloud9 で Rails5かつReact.jsの環境を構築、material-ui（ついでに非同期処理も）を使える環境にするまで 

##Cloud9でRails5とReact.jsを使える環境を構築する
Rails5とReact.jsを併用する環境の構築方法について、あまり記事が少なかったので書くことにします。

始める前に前提として、**cloud9で新しいworkspace**を作ってください。

この際、**「Choose a template」で "Blank"** を選びます。
よし、ではやっていこう！

#Rails5の環境構築
##Ruby 2.4.0 インストール
```
rvm install 2.4.0
```
rvmはRubyのパッケージマネージャーというやつです。
バージョン管理を楽にするとか。

##Rails5.1 インストール
```
gem install rails
```
これでRailsの最新版がインストールされます。

##Bundlerインストール
```
gem install bundler
```
Railsのライブラリ管理ツールである、Bundlerをインストール。

ここまでで、とりあえずRails5の環境構築は完了です。

#React.jsの環境構築 ①

Reactをインストールするためには、npmというnode.jsのパッケージマネージャーを使います。
そのため、まず第一段階としてnode.jsをインストールします。

##Node.jsのインストール
```
nvm install v7.7.1
```
##npmでnpmのアップグレード
```
npm update -g npm
```
"-g" はglobally、つまりどのプロジェクトでも使えるようにするオプションです。

#Rails5側の準備
##Railsアプリケーション作成とディレクトリ移動
```
rails new sample
```
いつも通り`rails new`でrailsアプリを作ります。
この時、"sample" の箇所がアプリ名となるので、任意の文字列に変更してください。
##ディレクトリの移動
```
cd sample
```
"sample" の箇所がアプリ名となるので、任意の文字列に変更してください。
これから色々インストールしていくにあたり、アプリのディレクトリに移動する必要があります。

##Gemfile修正
```sample/Gemfile
gem 'webpacker', github: "rails/webpacker"
```
gemファイルに、webpackerについて入力します。完了したら、`bundle install`

```
bundle install
```

##Yarnインストール
```
npm i -g yarn
yarn install
```
##Webpackerインストール
```
rake webpacker:install
```
コントローラ作成
```
rails g controller pages index
```
この段階で、ページが開けるか確認してみましょう。
「Yay! You're on Rails!」と、仲良さげな子供たちの絵が表示されるはずなのですが...

##あれ、ページが開けない、、、となったので、yarnを再インストール
```
npm i -g yarn
yarn install
```
##application.html.erbに追記
```app/views/layouts/application.html.erb
<%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %>
```
上記を下記に書き換えて下さい。

```app/views/layouts/application.html.erb
<%= javascript_pack_tag 'application', 'data-turbolinks-track': 'reload' %>
```
#Reactのインストール、そしてビルドへ
Reactのインストール
```
rake webpacker:install:react
```
application.jsに追記
```
require('./hello_react.jsx')
```
このままビルドしようとするとエラーが出るため、それに従い
```
bundle binstubs bundler --force
```
ビルド
```
bin/webpack
```
サーバー起動
```
rails s
```
Material-uiのinstall
```
npm install material-ui
```
fetch-apiを入れる
```
npm install whatwg-fetch --save
```
これを使いたい箇所に、import 'whatwg-fetch'を書き込む

config/environments/development.rb
の、config.webpacker.check_yarn_integrity = trueをfalseに

標準フォント　Robotoを入れる

##Cloud9の設定を変更
まず、Runのmanageのとこより設定を開く。
Runの設定を、Ruby on Rails(default)にし、cwdをアプリのdirectoryにして、set as default
および、experimentalからauto-saveをオンに


#参考サイト
[Cloud9環境でRuby on Railsの開発をする](https://www.kazaana-akero.com/2017/10/01/cloud9%E7%92%B0%E5%A2%83%E3%81%A7ruby-on-rails%E3%81%AE%E9%96%8B%E7%99%BA%E3%82%92%E3%81%99%E3%82%8B/)
Unity + VS Code 連携 (break point貼ってデバッグできる)　メモ

MacにVSCodeをいれる

拡張機能として（１番下の四角いやつ）
C#をいれる
Debugger for Unity を入れる

Preferences→ExternalTools→External Script Editorより Visual Studio Code を選択
<img width="534" alt="スクリーンショット 2018-06-04 20.44.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/17904/e4284d41-0135-d294-d8cd-e27d6f7dbd8e.png">


Unity上で何かソースを開く


左メニューの下から２番目（丸いマーク）をタップして
上の矢印ボタンを押してUnityDebuggerを選択

<img width="590" alt="スクリーンショット 2018-06-04 20.40.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/17904/abc6d2d5-1f1f-ddde-d4c6-dbd76b2bb839.png">



参照URL：
http://baba-s.hatenablog.com/entry/2018/01/08/112000
【PHP】キーを指定して配列に要素を追加したい

## やりたいこと
配列にキーを指定した要素を追加したい

## 「$f["key"] = value;」でキーを指定して追加できる
```php5
$f = ["a" => "りんご", "m" => "みかん", "b" => "ばなな"];
$f["p"] = "パイナップル";
print_r($f);
```
実行結果
Array ( [a] => りんご [m] => みかん [b] => ばなな [p] => もも ) 

う～ん便利
AWSにEC2インスタンスを作成して、nginxを使い、webページを公開する【後編】

AWSにEC2インスタンスを作成して、nginxを使い、webページ・ホームページを誰からでも見れるように公開する。

[【前編】](https://qiita.com/ume1126/items/09e7cfc58ba003618bf9)〜　インスタンスの作成まで。
【後編】←イマココ


■動作環境 ==================================

macOS Sierra 10.12.6

===========================================



#0. AWSでインスタンスを作成する
[【前編】](https://qiita.com/ume1126/items/09e7cfc58ba003618bf9)に記述しています。

#1. インスタンスのパブリックDNSを確認する
作ったEC2インスタンスを選択すると、画面下部で確認できます。
![スクリーンショット 2018-06-04 19.38.22.jpg](https://qiita-image-store.s3.amazonaws.com/0/192887/bf2cf11e-293d-95db-5488-352738e8d1fa.jpeg)
ついでにすぐ下の　IPv4 パブリック IP も確認しておきましょう。次で使います。

#2. AWSにアクセスする
ターミナルを立ち上げ、Pemにパスを通します。
【前編】#2でダウンロードしたキーペア（Pem)の場所を確認してください。

```:localターミナル
ssh -i /Users/(pemの絶対パス)/hogehoge.pem ec2-user@00.00.00.00（IPv4 パブリック IP）
```
と入力すると、AWS
<img width="235" alt="スクリーンショット 2018-06-04 19.48.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/192887/7fe397d2-f566-4a6c-38ab-7b2b858a59e0.png">
にアクセスできます。

#3. nginxをインストールする
HTTPサーバーをインストールします。
Apacheが主流らしいのですが、比較サイトをみて今回はnginxを導入します。
参考：[Apacheとnginxどちらを採用すべきかメリット・デメリット比較](https://qiita.com/pink/items/7709218310b5cf11eabe)

```:AWSターミナル：yamのアップデート
sudo yum update
```
```:AWSターミナル：nginxインストール
sudo yum install nginx
```
```:AWSターミナル：nginxのバージョンの確認
nginx -v
```
```:AWSターミナル：nginxの起動
sudo service nginx start
```
起動できたら、ブラウザで`http://パブリックDNS`にアクセスしてチェック！

```:AWSターミナル：nginxの「再」起動
sudo service nginx restart
```
```:AWSターミナル：nginxの停止
sudo nginx -s stop
```

#4. ローカルからAWSにファイルをコピーする
htmlやcssなど、必要なファイルをコピーします。
権限で引っかかる可能性がとてもあるので、zipでまとめて送り、解凍することを推奨します。

`scp -i pemを絶対パスで指定 -r ファイル名 接続先(パブリックDNS):保存先AWS絶対パス`
参考：http://www.atmarkit.co.jp/ait/articles/1701/27/news009.html

```:localターミナル
scp -i /Users/(pemの絶対パス)/hogehoge.pem -r 送りたいファイル(zip)の絶対パス ec2-user@パブリックDNS:/home/ec2-user/
```

###！→　Permission denied (publickey).と言われる
権限がないとのことなので、`chmod 755 ファイル名`　で権限を付与する。
チェック項目としては
 - localの送りたいファイル
 - AWSの受け入れ先
 - AWSの受け入れ先の一つ上の階層
 - AWSの受け入れ先のそのまた一つ上の階層……と、だいたい ec2-user のところまで付与すると送れることがあります

#5.　nginx.confを書き換える

```:AWSターミナル
sudo vi /etc/nginx/nginx.conf
```
で、中身をviしていく。

locationのrootを、以下の様にソース(html,css)保存場所に変更して保存する。

```nginx.conf
# another virtual host using mix of IP-, name-, and port-based configuration

……

  location / {
    root   /Users/hogehoge/homepage/;  // ソースの保存場所
    index  index.html index.htm;
  }
```
参考：viコマンド　http://uguisu.skr.jp/Windows/vi.html
参考：[nginxでバーチャルホストを設定する（Mac）](https://qiita.com/megurock/items/c40200039f6838f51d94)


#6. nginxを再起動する
```:AWSターミナル：nginxの「再」起動
sudo service nginx restart
```

#7. ブラウザでアクセスする
http://000.000.000.000(IPv4パブリックIP)/hoge.html


#8. オマケ
Basic認証をかけたいとき
[【nginx】nginxとhttpd-tools(htpasswd)でサクっとbasic認証をかけるメモ](http://tweeeety.hateblo.jp/entry/2015/07/05/174239)
(空白) / (BLANK) ってなんだ

集計された結果が "(空白)" もしくは、"(BLANK)" ってなる。これはなんだって話なのだけど、集計対象が存在せず、その結果として表示されるもの。他アプリケーションやサービスであれば NULL とかいう感じ。表示自体を何とかしたいという気持ちはわからないではないけれども、その前に考えておかないとならないことはあると思うのですよ。

[Power BI Desktop でのデータ型 - Power BI | MIcrosoft Docs](https://docs.microsoft.com/ja-jp/power-bi/desktop-data-types)

>**空白または null 値型**
Blank - SQL の null を表し、null と置き換わる DAX データ型です。 BLANK 関数を使用すると、空白を作成できます。空白かどうかをテストするには、ISBLANK 論理関数を使用します。

>**Blanks/nulls type**
Blank - Is a data type in DAX that represents and replaces SQL nulls. You can create a blank by using the BLANK function, and test for blanks by using the ISBLANK logical function.

# こんなこと
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193509/feada4ff-5753-09f4-ca27-86def8ff4dea.png)

Dino Cat の [Value]列の値はないので、SUM( [Value] ) の結果は "(空白)" / "(BLANK)" になる。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193509/d22acf48-3238-3102-c65a-ff8ce3849891.png)

# ではどうするか

```text:メジャー(DAX)
SUM_Value =
VAR SumTotal =
    SUM ( Items[Value] )
RETURN
    IF ( ISBLANK ( SumTotal ), "None", SumTotal )
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/193509/9432710a-ea70-74fa-d0ba-09ca48241c79.png)

集計対象が存在しない場合を "0" としたいなら、

```text:メジャー(DAX)
SUM_Value = SUM ( Items[Value] ) + 0
```
集計対象が存在するけれども "0" と評価されたのか判断できなくなるので、本当に "0" でよいのかをよーく考えておかないと。たとえば アイテムの在庫で、

- 入出庫差し引き "0"
- 入出庫がまだ発生していないのに "0" 

同じで大丈夫か？という話。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/193509/e723729a-5f89-53cc-76bc-6aaa52e48dd7.png)


# その他
- [Power BI 勉強会 - connpass](https://powerbi.connpass.com/)
- [Power BI Desktop を使い始めるには](http://qiita.com/PowerBIxyz/items/6c4735cb5b5712e70981)
CSSのみで超シンプルなフェードスライダーを実装する。more Simple版

前回、[CSSのみで超シンプルなフェードスライダーを実装する。](https://qiita.com/osugidesu/items/8a8b9a611d86eec9d9ac)を書きましたが、
もっと単純明快な方法がありましたので、追記という形で投稿します。

#前回のイマイチだった点
`@keyframes` でopacityを切り替えていた点。

#今回の修正点
`@keyframes`で `backgroun-image`で画像を切り替えれば良い。
コードは以下のようになります。

```ruby:HTML
<div class="fadeSlider">
</div>
```

```ruby:SCSS
.fadeSlider {
  width: 100vw;
  height: 100vh;
  background-position: center center;
  background-repeat: no-repeat;
  background-size: cover;
  background-image: url(/img/example_03.jpg), url(/img/example_02.jpg), url(/img/example_01.jpg);
  animation: fadeSlideImg 15s ease-out infinite;
  animation-delay: 5s;
}

@keyframes fadeSlideImg {
  0% { background-image: url(/img/example_01.jpg); }
  33% { background-image: url(/img/example_02.jpg); }
  66% { background-image: url(/img/example_03.jpg); }
  100% { background-image: url(/img/example_01.jpg); }
}
```

##実装のポイント
あらかじめcssで表示させる画像を指定し、読み込んでおきましょう。
（読み込んでおかないと@keyframesで画像が切り替わるときに画像読み込みによる遅延が生じてしまうため）

デモはこちらからご確認ください
<p data-height="265" data-theme-id="0" data-slug-hash="jKWvyX" data-default-tab="css,result" data-user="osugidesu" data-embed-version="2" data-pen-title="CSS FadeSlide" class="codepen">See the Pen <a href="https://codepen.io/osugidesu/pen/jKWvyX/">CSS FadeSlide</a> by sugimoto tetsuharu (<a href="https://codepen.io/osugidesu">@osugidesu</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

前回のものよりスッキリとしましたね！
【turbolinks】WebページのJavaScriptがリロードしないと動いてくれない問題

#開発環境できちんと動いていたMaterializeのJS関連

https://materializecss.com/collapsible.html

僕が今回多用しまくったのではこいつです。
画面遷移しなくとも、動的処理を行ってくれる。JQueryに依存しています。

- リロードすると正常
- リロード前はJQueryが適用できていないように思える

#結局何が悪かったのか

- turbolinks

#turbolinksとは

[こちら](http://kray.jp/blog/must-know-about-turbolinks/)によると

turbolinksはbodyなどhtmlの一部の取っ替えを行い、CSSやJavaScriptを省略するgem。
何がいいかと問われると、高速化ができる。

私はRails4だったので、デフォルトで導入されていました。

これのせいでjQueryのReadyイベントが実行されないとのこと。
基本的にMaterializeはjQuery依存でコードも以下の通り、readyイベントの中にcollapsibleイベントが発火する形。

```JavaScript:collapsible.js
document.addEventListener('DOMContentLoaded', function() {
    var elems = document.querySelectorAll('.collapsible');
    var instances = M.Collapsible.init(elems, options);
  });

  // Or with jQuery

  $(document).ready(function(){
    $('.collapsible').collapsible();
  });
```

[README](https://github.com/kossnocorp/jquery.turbolinks/blob/master/README.md)によると、以下のように別イベントにするといいらしい。

```JavaScript:turbolinks.js
// BAD: this will not work.
$(document).on('ready', function () { /* ... */ });

// OK: these two are guaranteed to work.
$(document).ready(function () { /* ... */ });
$(function () { /* ... */ });
```
#やったこと
今回は高速化の必要もないので、turbolinksを消しました。
Gemfileのturbolinskのgemを消し、bundle update。
app/assets/javascript/application.jsのturbolinks関連を削除。

```JavaScript:app/assets/javascript/application.js
//= require jquery
- //= require jquery.turbolinks
//= require jquery_ujs
//
// ... your other scripts here ...
//
- //= require turbolinks
```

きちんと動作しました。

#参考記事
http://o.inchiki.jp/obbr/97
http://kray.jp/blog/must-know-about-turbolinks/
ネストしたリソースでlink_toを使う方法[ruby on rails]

Topicの中にたくさんのCommntを持っている構造。

ネストしたroutesファイル

```ruby
Rails.application.routes.draw do

  #ここがネストしている
  resources :topics do
    resources :comments
  end
  root 'application#root'
end
```

コントローラファイル
ここで「@topic」「@comments」の二つを取得してビューファイルに渡す。

```
  def index
    @topic = Topic.where(:id => params[:topic_id]).first
    @comments = @topic.comments.all
  end
```

ビューファイル

```erb

  <tbody>
    <% @comments.each do |comment| %>
      <tr>
        <td><%= comment.topic %></td>
        <td><%= comment.content %></td>
        <td><%= comment.like %></td>

#ここから↓↓↓
        <td><%= link_to 'Show', topic_comment_path(@topic, comment) %></td>
        <td><%= link_to 'Edit', edit_topic_comment_path(@topic, comment) %></td>
        <td><%= link_to 'Destroy', topic_comment_path(@topic, comment), method: :delete, data: { confirm: 'Are you sure?' } %></td>
#ここまで↑↑↑ をいじる。

      </tr>
    <% end %>
  </tbody>
```

ターミナルでrake routesをして出てくるパスがこれ

```ターミナル
                   Prefix Verb   URI Pattern                                                                              Controller#Action
           topic_comments GET    /topics/:topic_id/comments(.:format)                                                     comments#index
                          POST   /topics/:topic_id/comments(.:format)                                                     comments#create
        new_topic_comment GET    /topics/:topic_id/comments/new(.:format)                                                 comments#new
       edit_topic_comment GET    /topics/:topic_id/comments/:id/edit(.:format)                                            comments#edit
            topic_comment GET    /topics/:topic_id/comments/:id(.:format)                                                 comments#show
                          PATCH  /topics/:topic_id/comments/:id(.:format)                                                 comments#update
                          PUT    /topics/:topic_id/comments/:id(.:format)                                                 comments#update
                          DELETE /topics/:topic_id/comments/:id(.:format)                                                 comments#destroy
```

上のパスを見て、
topic_comment_path(@topic, comment)
edit_topic_comment_path(@topic, comment) 
topic_comment_path(@topic, comment)
にそれぞれ修正する。
AWSにEC2インスタンスを作成して、nginxを使い、webページを公開する【前編】

AWSにEC2インスタンスを作成して、nginxを使い、webページ・ホームページを誰からでも見れるように公開する。

【前編】〜　インスタンスの作成まで。←イマココ
[【後編】](https://qiita.com/ume1126/items/7cef8cb2c19959d25cb5)


■動作環境 ==================================

macOS Sierra 10.12.6

===========================================



#1. AWSのアカウントを作る
作ってください。

#2. EC2インスタンスを作る
・リージョン：アジアパシフィック
・サービス：EC2
・インスタンスを作成する
・Amazon Linux　を選択
・t2.micro　を選択
・インスタンス詳細の設定はデフォルトのまま次に進む
・ストレージの追加はせずにそのまま次に進む
・タグの追加をクリックする
・キー：Name
　値：インスタンス名
　（Nameタグは、のちにインスタンス一覧に表示される名前になる）
・セキュリティグループの設定
    - 新しいセキュリティグループを作成する
    - セキュリティグループ名（任意）
    - 説明（任意）
    - タイプ
        - SSH ：マイIP
        - HTTP　：マイIP
・作成でどんどん次に進む
・公開鍵認証に使用するキーペアを選択する
    - 新しいキーペアの作成
    - キーペア名（任意）
    - キーペアのダウンロード（2度と同じものはDLできないので要注意）
    - インスタンスの作成
・インスタンスの表示
・インスタンス一覧でrunningになれば作成完了

#3. アドレスの割り当て
・左メニューからElastic IPを選択する
・新しいアドレスの割り当て
・ボタンを押して割り当てを進める
・割り当てられたら、その割り当てられたものを選択して「アクション」から「アドレスの関連付け」をクリック
・リソースタイプ：インスタンス
・先ほど作成したインスタンスを選択して関連付けを行う

お疲れ様でした。


Next [【後編】](https://qiita.com/ume1126/items/7cef8cb2c19959d25cb5)
Unity2017にAppLovinSDK(admobメディエーション)を入れて、xcodeでビルドで「〜Property implementation must have its declaration in interface 〜」



## xcodeでビルドするとこういうエラーが多数。。

```
/Users/〜/Libraries/Plugins/iOS/AppLovinCustomEventInterstitial.m:26:13: Property implementation must have its declaration in interface 'AppLovinCustomEventInterstitial' or one of its extensions
```


## 下記で、「Enable Modules ( C and Objective-C)」 をYESで改善

![image.png](https://qiita-image-store.s3.amazonaws.com/0/37406/f3b5d20e-fc28-bd3e-da0a-0a19c6018c97.png)



備忘録。