OmniAICreator/Qiita-1.07M huggingface dataset:
RabbitMQ + Spark


##CloudのRabbitMQ
最近PaaS上でOSSがいろいろ使えるようになってます。
ちょっとQueueを使う機会があったので、
せっかくだからとrabbitMQ on Bluemixを
SparkStreamingとかSpark処理のoutput先として使おうと思った。らハマった。

##Queueなんで必要？
昔からシステム間連携の際のプロトコル変換などで利用されてました。
最近は単一のミドルウェアやサーバーは(HW障害などで)落ちる前提で設計することが多いですが、SPOFの排除とシステム全体での可用性担保のために使ったり、従来でも使われてたシステムを疎結合に保つために使われたりとかしてます。

* マイクロサービス間でのメッセージの保証
* 非同期にDBとかファイルストレージとかデータストアに書き込む際のデータの保証
* 非同期にブラウザへ処理を返す所とか

今回データ分析でSpark処理の出力先としてQueueを使ったのは
時間がかかる機械学習のモデル作成やデータ更新を受け取り側でポーリングしたくなかったから。ちなみにデータの入り口部分を扱うならKafkaの方が向いてます。RabbitMQ使うなら

* Publisher > Consumer

とデータ量がConsumer側で少なくなる場所で使うと良い仕事してくれます。
逆に

* Publisher ≦ Consumer

となるケースでは基本的にRabbitMQはPush型なのでConsumerが詰まるケースで取り扱いに注意。特にオンプレでRabbitMQ構築する場合にはHighWaterMark超えてDiskにデータが落ちるとConsumer側のパフォーマンスが著しく劣化するので。
大量のデータ扱うならKafka、即応性でRabbitMQという感じで使い分けてます。

##どんな感じで使ったか
Sparkの分析処理の結果を

* Spark処理の方ではrddをcollectしてDriverからRabbitに結果を投げる感じ。
* Streaming処理の方ではforeachRDDの中で投げる感じで。
* RabbitMQに一旦Queueingして、Node.jsでConsume。
* そのままWebsocketでブラウザに分析結果を垂れ流し

的な感じで利用してます。以下、絵でのイメージ。

![うさこ+Spark.png](https://qiita-image-store.s3.amazonaws.com/0/31585/edd98ba8-03f3-2c48-a325-7d1b061f1396.png "うさこ+Spark.png")

##CloudのRabbitMQ
Bluemixのアカウント持ってればボタン１個で出てきます。構築は以上。

![usako1.png](https://qiita-image-store.s3.amazonaws.com/0/31585/5fe5ae17-995e-4924-5531-3bb42251db90.png "usako1.png")

払い出すと以下の画像のような管理ページに飛ばされます。
サービス資格情報のタブの中にエンドポイントやユーザー情報が入ってるので、それを使ってRabbitMQにデータ入れたり出したりします。

![usako2.png](https://qiita-image-store.s3.amazonaws.com/0/31585/49468839-197c-2715-c1ed-e16982700226.png "usako2.png")


>ちなみに
Note: Compose via Bluemix does not give access to the "Compose UI" at this time, see here for more details.
なる注意書きがありますが、普通にRabbitMQの管理画面が使えるので
(ﾟεﾟ)ｷﾆｼﾅｲ!!

サービス資格情報タブから、uri_adminの項目のURLで管理画面にアクセス可能です。ID/Passwordはuri_direct_1のbasicの所のadminと後ろのパスワード使います。(パスワードは黒塗りしてる所)

![usako3.png](https://qiita-image-store.s3.amazonaws.com/0/31585/b3ffe0dd-c5f8-a4d2-3f67-36f9d14011f6.png "usako3.png")

おなじみのRabbitMQの管理画面です。

![usako4.png](https://qiita-image-store.s3.amazonaws.com/0/31585/80390ece-7e2e-4698-e886-3c4e003ea05b.png "usako4.png")

##ハマった所
今回PySparkからこのRabbitMQにデータを投げ込みたかったのですが、
上のサービス資格情報のイメージのuri_direct_1の項目見ていただいたらわかる通り、
amqpじゃなくてamqpsでのアクセスとなります。
[本家](https://www.rabbitmq.com/tutorials/tutorial-one-python.html)にPythonでpikaを使ったサンプルありますが、このままエンドポイントだけ変えて写経すると処理がこけます。

普段Queueってネットワーク内部に置くことが多いのでamqpsって使わなかったんですが
当たり前といえば当たり前ですが、ちゃんとSSLOptionつけたげないとダメみたいです。サービス資格情報タブのca_certificate_base64をURLの後ろにくっつけてあげるときちんと処理が通ります。

![usako5.png](https://qiita-image-store.s3.amazonaws.com/0/31585/ed3a26e9-f500-3096-c1f5-ce4db52ae989.png "usako5.png")

意外と忘れがちなので。備忘的に。

>同様にconsumer側もssl設定する必要があります。

Cloud上でいろんなOSS出てますが、サクッと環境作れるのは楽でした。
特に環境構築に時間使いたくない場合は是非。
smartyで連想配列を条件分岐したはなし

# テンプレート上の条件分岐によって、文言を変更

条件分岐に使用するつもりのユーザの情報は連想配列内にあるので、配列内にあった場合に処理を変えようとした。

## まず試したこと

```Smarty
{if 'hoge'|in_array:$value}
  true
{else}
  false
{/if}
```

これで配列__$value__内に__hoge__が存在した場合に_true_が表示されると考えたところ、表示されたのは_false_でした。

## 原因を確認

配列の構造を確認してみる

```php
array(3) {
  [0]=>
  array(2) {
    [id]=>
    int(2)
    [item]=>
    string(4) "hoge"
  }
  [1]=>
  array(2) {
    [id]=>
    int(1)
    [item]=>
    string(4) "fuga"
  }
  [2]=>
  array(2) {
    [id]=>
    int(2)
    [item]=>
    string(8) "fugafuga"
  }
}
```

どうも __in_array__は配列の次元が異なる条件には対応していないという事なので、別の方法を考える。

## 対応策

```Smarty
{foreach $arr as $value}
  {if $value.item == 'hoge'}
    true
  {else}
    false
  {/if}
{/foreach}
```

もっとすっきりとした方法があるはずですが思いつかなったので、今回はこの処理で実装しました。

## まとめ

- 配列を一つずつ処理したい場合は、ループさせることができないか考える。
- __in_array__関数は同次元でないと使用できない。

## 今後の課題

- ループで回していくのはいいが、その場合の処理にかかる時間や、データ量が多い時のメモリの扱いなども考えられるようになる。
- どのような関数があるか、基本的な動きについて把握しておく。機能の辺りが付けられると捗る。
- __プログラミングの基本的な考え方や作法を知る。というよりも知りたい！__
Try phoenix framework系列[1]


对于` phoenix` 来讲, 它是一个 web 开发框架, 它的设计实现思想和 Rails 还有` django` 等都是如出一辙. 基本上就是基于` MVC` 的模型来实现服务器端. 对于它来说不仅仅实现了高效的开发,而且还拥有者高性能的表现. 同时它还具有一些有趣的特性如信道, 可以用来实现实时更新的功能, 还有预编译模板等来提高速度.

对于` Phoenix` 来说, 它是基本` elixir` 这门语言来写的, 所以需要了解` elixir`, 如果你已经掌握了` elixir` 那就完美, 当然还不是很了解没有关系可以在[这里](http://elixir-lang.org/getting-started/introduction.html)学习.

接下来我们说说具体对于这个框架本身, 它是如何实现以及各个部分的组成.

[先可以看看这个视频](https://vimeo.com/131633172)

接下来说说具体的组成. 其实对于` Phoenix` 框架来说,它也是一个集大成者. 通过集合各个层面上优秀的实现来完成最终的任务, 同时这样的设计又不失灵活性和扩展性. 如包含了` Plug`, `Ecto`, 还有` Erlang` 领域的` HTTP` 服务器` Cowboy` 等.

### 组成

它有下面这些部分组成,各司其职最终形成一个 web 的开发框架. 这里就说说具体的不同组成和角色.

- Endpoint
	- 这个端点将会接收所有的请求
	- 提供了一系列核心的过滤应用到所有的请求
	- 分发具体的请求到指定的路由

- 路由
	- 解析请求然后分发到指定的控制器和动作上, 解析参数等.
	- 提供了一些帮助方法来解析路由生成资源路由等
	- 定义一些命名的管道,我们可以用来传递请求
	- 管道
		- 可以轻松应用过滤( plug)到一系列的路由上.

- 控制器
	- 提供一些方法,也就是`动作`来对应处理请求
	- 动作
		- 准备数据然后传递给视图
		- 出发视图渲染
		- 负责调转等

- 视图
	- 渲染模板
	- 充当展示层
	- 定义些帮助方法,用于模板, 然后一些数据的修饰用来展示

- 模板
	- 就是模板咯
	- 预编译

- 信道
	- 管理 sockets 了解,来轻松实现实时通信
	- 和控制器类型, 除了它可以允许双向通信来完成持久化连接

- 发布和订阅
	- 基于信道层,允许客户端来订阅不同的主题
	- 抽象出了发布订阅适配器用来完成第三方实现的集成.


### 何为 Plug

`[Plug](http://hexdocs.pm/plug/)` 即一个定义说明关于如何定于组装模块,用来构建 web 工程. Plug 通常都是可以重用的模块或者函数, 他们提供完全不相关的行为, 像是解析请求头或者日志等, 因为 Plug 的 API 都是小而且不变的, 他们通常可以被组装使用, 好比已给管道一样. 或者可以用于多个项目等.

Plug 可以用来被处理任何事情,从验证到参数解析, 设置渲染.
Phoenix 算是把 Plug用到了极致, 特别是路由和控制器部分尤甚.
关于 Plug 最主要的一个点就是它提供了 Http 服务器的适配器, 然后可以无限的给用户提供程序的内容,当前 Plug 只是提供了 `Cowboy`的适配, [一个 erlang 的 web 服务器](http://ninenines.eu/).

接下来可以从[这里](http://www.phoenixframework.org/docs/understanding-plug)了解更多的内容.

### Ecto

`[Ecto](http://hexdocs.pm/ecto)`算是一门单独的语言, 它集成了查询工具, 还有` Elixir` 对于数据库操作的封装. 通过使用 Ecto, 我们可以操作不同的数据库, 操作对象数据,进行复杂的程序等

对于` Ecto`, 它又下面4个具体的抽象概念

- Repo - 也就是一个具体的数据库.
- Model - 也就是对于数据的定义.
- Query - 查询是绑定到具体的 model 还有 repo 上的. 能够让我们很优雅的拿数据和赛数据.
- Changeset - 它声明了一种转换形式,在我们拿到数据和具体使用之前的转换, 包括验证, 转换等操作

默认的` Phoenix` 会使用` Ecto` 和` PostgreSQL` 来实现数据持久化.
BOOLの書き方

# BOOLの書き方

Reachabilityの中を見ていた時、
これがBOOL値の代入だと気づかなかったのでメモとして・・・むにゃむにゃ

```
typedef enum : NSUInteger {
    NotReachable = 0,
    ReachableViaWiFi,
    ReachableViaWWAN,
} NetworkStatus;

// ここで判定が入る
// netStatusがReachableViaWWANでなければlabelがhiddenになる
// netStatusがReachableViaWWANであればlabelがhiddenにならない
self.summaryLabel.hidden = (netStatus != ReachableViaWWAN);
```
Onsen UI (React) + nifty mobile backendのアプリ開発でつまずいた点

Monaca + Onsen UI (v1) + nifty mobile backendで
nifty mobile backendの扱いが簡単だったため
タイトルの構成でも簡単に扱えると思いましたが２点ほどつまずきました。

Onsen UI (React) とは？
------------
React Native + Material UIを組み合わせたようなことができます。
個人的に読み込むモジュールは少ない方が好きなので今回はOnsen UI (React) を試してみました。


Onsen UI (React) のインストール
------------
https://ja.onsen.io/blog/getting-started-onsenui-with-react/

nifty mobile backendのインストール
------------

```
npm install ncmb --save
```

### つまずき１
- ncmbをrequire(またはimport)するだけで下記のエラーが発生する

```
Error: apikey and clientkey required   
```

#### 解決方法
- node_modules/ncmb/lib/ncmb.js を直接修正 ([参考](https://github.com/NIFTYCloud-mbaas/UserCommunity/issues/456))

　- 末尾の下記３行をコメントアウト

```
  // if (typeof define === 'function' && define.amd) {
  //  define([], NCMB);
  // }
```

### つまずき２

- データストアに保存しようとすると下記のエラーが発生する

```
Error: SHA256 is not supported
```

#### 解決方法
- [webpack-sha-hash](https://github.com/dsebastien/webpack-sha-hash)モジュールをインストールする

```
npm install webpack-sha-hash --save-dev
```

- webpack.dev.config.jsのtry内に下記を追記


```
var WebpackSHAHash = require('webpack-sha-hash');
```

- webpack.dev.config.jsのplugins内に下記を追記

```
new WebpackSHAHash()
```

※上記の２つを解決してもwarningレベルのエラーが２つ出るのが気になる...



マテリアルデザイン
-----
Onsen UIは「iOSはフラットデザイン」「Androidはマテリアルデザイン」と自動的にデザインが使い分けられます。
どちらもマテリアルデザインで統一する方法

- main.jsに下記２行を追記

```
import ons from 'onsenui'
ons.forcePlatformStyling('android');
```
SpringBootでコンテナ管理しているオブジェクトの一覧を取得する方法

SpringBootでコンテナ管理しているオブジェクトの一覧を取得する方法です。
本当はApplicationContextからメソッド経由で参照したいけど、とりあえずDebugモードで値を確認しています。


オブジェクトを管理しているクラス

    org.springframework.beans.factory.support.DefaultListableBeanFactory

このクラスで適当にブレークポイントを打って、「beanDefinitionNames」の値を確認します。

|#  |Bean名|
|---|---|
|0|org.springframework.context.annotation.internalConfigurationAnnotationProcessor|
|1|org.springframework.context.annotation.internalAutowiredAnnotationProcessor|
|2|org.springframework.context.annotation.internalRequiredAnnotationProcessor|
|3|org.springframework.context.annotation.internalCommonAnnotationProcessor|
|4|org.springframework.context.annotation.internalPersistenceAnnotationProcessor|
|5|org.springframework.context.event.internalEventListenerProcessor|
|6|org.springframework.context.event.internalEventListenerFactory|
…
（すでに直ってる）chocolatey で hub コマンドをインストールしていると、nodejsのインストールに失敗する

## 2017-05-31 22:03 追記
現在は、この問題は発生していません。
同様のエラーが発生する場合は、早々に諦めて、（一時的に）手動でインストーラでインストールして使いましょう。

追記ここまで。

# 現象
chocolatey で、`hub` コマンドを先にインストールしている状態で、`nodejs` をインストールしようとすると、「エラー 1603」でインストールに失敗するっぽいです。

```powershell
cinst -y hub
cinst -y nodejs
```

たぶん、Visual C++ 再頒布可能パッケージ あたりで競合してるのかなぁと思いますが、原因不明で解決できそうになかったので、hubコマンドを使うのをやめました。

# chocolatey 経由でなければ、普通にインストールできる

chocolatey を使わずに、[公式のインストーラ](https://nodejs.org/ja/)を使って手動でインストールする場合は、普通にインストールできました。

#

再現できないとかあれば、もしかしたら私の環境固有の問題かもしれないので、コメントください。
click()とon('click', function())の違い 

覚えたてのjQueryを使っていて、「click()?.on?なにが違うんだ」と、とても気になったので、まとめました。

## この記事を読んで理解できること
- .on,bind(),live(),delegate()の違いが理解できる。

## 1.onの有用性

- onひとつでbind(),live(),delegate()を表せる

## bind()


- 基本的なイベントの設定
- 後から追加した要素に対しては利用できない

```javascript
$('p').bind('click', function(){
  //処理
});
$('p').unbind('click');
```

onを使うと、

```javascript
$('p').on('click', function(){
  //処理
});
$('p').off('click');
```

## delegate()


- 後から追加した要素に対してもイベントを実行できる
- イベントの設定は親の要素に対して行う。

```javascript
$('.parent').delegate('foo', 'click', function(){
  //処理
});
$('p').undelegate('foo', 'click');
```

onを使うと、

```javascript
$('.parent').on('foo', 'click', function(){
  //処理
});
$('p').off('foo', 'click');
```


### live()

***

- delegate()と同じく、後から追加した要素に対しても実行できる。
- イベントを設定するイベントの対象が、documentになる。

```javascript
$('p').live('click', function(){
  //処理
});
$('p').die('click');
```

onを使うと、

```javascript
$('document').on('click', function(){
  //処理
});
$('document').off('click');
```

### delegateとliveは何をしているの？

bindを利用するとページ表示時にすでに存在する要素に対してイベントを設定する。その為、後から追加された要素にはイベントが設定できない。

例えば、```<div>></div>```の要素の中に```<p></p>```の要素を追加したとすると、

```javascript
$('p').bind('click', function(){
  //処理
});
```

このようにbindで記述してもクリックイベントは実行できない。

```javascript
$('div').delegate('p', 'click', function(){
  //処理
});
```

と親要素のdivにイベントを設定することで、間接的にイベントを設定する事ができる。

liveとdelegateの違いは、delegateの中にliveが含まれていると考えると楽。じゃあなんでdelegateがあるのかというと、実行速度が早い！
liveは内部でdelegateを実行しているので、一歩遅い！

~~実行順~~
~~bind→delegate→live~~

~~実行速度~~
 ~~delegate→live→bind~~
  ~~（とはいえbindを避けるほどの差はないらしい。）~~

2017/02/02:@smzk様からご指摘頂きましたので、修正致します。
イベントをセットする要素に応じてイベントの発生順決まるため、一概にはこの実行順とは限らないです。

## 2.複数のイベント処理

- 同じ処理をする

```javascript
$('.foo').on('click blur', function(){
  //処理
});
```
スペース区切りで記述していく。

- 別々の処理をする

``` javascript
$(.foo).on({
  'mouseenter': function(){
    //処理内容
  },
  'mouseleave' : function(){
    //処理内容
  });
```
イベントデリゲートで複数イベントを設定する。

``` javascript
$(.parent).on({
  'mouseenter': function(){
    //処理内容
  },
  'mouseleave' : function(){
    //処理内容
  }, '.foo');
```

## 結論
特にこだわりが無ければ、.onを使えば良いんじゃないですかね。

追記:live() と die() は jQuery 1.9 で廃止されたようです。
[jQueryリファレンス](https://jquery.com/upgrade-guide/1.9/#live-removed)
[jQuery 1.9以降で「has no method 'live'」と出たら、 $(document).onを使う](http://qiita.com/seltzer/items/e60c4400e258f4f0d0bd)


参考URL
[jQuery便利なonを使おう](http://qiita.com/shizuma/items/d561f37f864c3ebb5096)
[bindとlive, delegateの違い。そしてon。](http://tabayashi.com/dev/null/1497)
[jQuery の on() と off() を理解する](http://tacamy.hatenablog.com/entry/2013/03/03/213113)
WN-AC433U wirelesscapabilities

Windows 10 今のドライバの状態の記録。dot11ac ですなー。

設定 ＞ ネットワークとインターネット ＞ Wi-Fi ＞ ハードウェアのプロパティ

```
製造元:	I-O DATA DEVICE, INC.
説明:	I-O DATA WN-AC433U Wireless LAN Adapter
ドライバーのバージョン:	5.1.22.0
物理アドレス (MAC):	‎34-76-C5-__-__-__
```

`netsh wlan show wirelesscapabilities` の出力

```
ワイヤレス デバイス機能
-----------------------

インターフェイス名: Wi-Fi 2

    WDI バージョン (Windows)                         : 0.0.0.0

    WDI バージョン (IHV)                             : 0.0.0.0

    ファームウェア バージョン                        :

    ステーション                                     : サポートあり

    ソフト AP                                        : サポートあり

    ネットワーク監視モード                           : サポートあり

    Wi-Fi Direct デバイス                            : サポートあり

    Wi-Fi Direct GO                                  : サポートあり

    Wi-Fi Direct クライアント                        : サポートあり

    管理フレームの保護                               : サポートあり

    DOT11k 近隣レポート                              : 不明

    ANQP サービス情報探索                            : サポートなし

    アクション フレーム                              : サポートなし

    ダイバーシティ アンテナ                          : 不明

    IBSS                                             : サポートあり

    無作為検出モード                            : サポートあり

    P2P デバイス探索                                 : サポートなし

    P2P サービス名探索                               : サポートなし

    P2P サービス情報探索                             : サポートなし

    P2P バックグラウンド探索                         : サポートなし

    5 GHz 帯の P2P GO                           : 不明

    ASP 2.0 サービス名探索              : サポートなし

    ASP 2.0 サービス情報探索       : サポートなし

    IP ドッキング対応                          : サポートなし

    FIPS                                             : サポートあり

    インスタント コネクト                            : サポートなし

    Dx スタンバイ NLO                                : サポートなし

    拡張チャネル スイッチ アナウンス                              : 不明

    機能レベルのリセット                        : サポートなし

    プラットフォーム レベルのリセット                : サポートなし

    バス レベル リセット                            : サポートなし

    MAC のランダム化                                 : サポートなし

    高速移行                                         : サポートなし

    MU-MIMO                                          : 不明

    Miracast シンク                               : 不明

    BSS の移行 (802.11v)                    : 不明

    構成されている IHV 拡張性モジュール              : サポートなし

    Tx 空間ストリーム数                              : 0

    Rx 空間ストリーム数                              : 0

    サポートされる同時チャネル数                     : 2

    P2P GO ポート数                                  : 1

    P2P クライアント ポート数                        : 2

    P2P モバイル AP クライアントの最大数             : 8

    サポートされる ANQP サービス アドバタイズの最大数: 0

    共存のサポート                                   : 不明

```
何かの時にスッと使える力技 - Reflection 編

# リフレクションとは

リフレクションとは Java の標準ライブラリに含まれている、クラスのメタ情報を取り扱うための API 群で、`java.lang.reflect`パッケージにまとめられています。

リフレクションを使うことで、クラスに定義されているコンストラクタやメソッド、フィールドの一覧を読み取ったり、そこからメソッドを呼び出したりフィールドの値を取り出したりということができます。通常であれば、リフレクションを使わずとも直接インスタンスを作ってメソッドを呼び出す手続きで事足りますが、リフレクションでは不可視なメソッドにアクセスしたり、`final`なフィールドを変更したりというチート技ができるようになります。

## リフレクションでできること

すべての型には、`.class`というリテラルがあります。`String.class`とすると、`String`クラスに関する情報を持った`Class`クラスが得られます。
`Class`クラスには、目的のクラスにどんなメソッドが定義されているか検索するメソッドや、定義されているフィールドの情報を取り出すメソッドなどがあります。この他、インスタンスメソッドとして`getClass()`がすべてのクラスに定義されていて、このメソッドを使っても同じく`Class`クラスが得られます。　

例えば、以下のようにすると、`private`で定義された本来見えないはずのメソッドが呼び出せるようになります。

```java
// リフレクションでアクセスするクラス。
public class Something {
  private String hoge() {
    return "hoge";
  }
}

public class Main {
  public static void main(String[] args) {
    Something target = new Something();

    try {
      Class<Something> clazz = target.getClass();            // class は予約語なので慣例的に clazz や klass などにする
      Method method = clazz.getDeclaredMethod("hoge", null); // 第二引数は呼び出すメソッドの引数の型の配列。無いときは null にする
      method.setAccessible(true);                            // 見えないはずのメソッドを見えるようにする魔法のメソッド
      String result = (String) method.invoke(target, null);  // 第一引数にメソッドを呼び出すインスタンス、第二引数以後は実際の引数
      System.out.println(result);                            // "hoge" が出力される
    } catch (NoSuchMethodException e) {
      // 文字列で指定したメソッド名に一致するメソッドが無いとき
    } catch (InvocationTargetException e) {
      // 呼び出したメソッドの中で例外がおきたとき
    } catch (IllegalAccessException e) {
      // アクセスできないメソッドにアクセスしたとき
    }
  }
}
```

## リフレクションで気をつけること

リフレクションをつかったプログラムを動かすとき、VM によってはリフレクションによるアクセスに厳しいルールを設定しているものもあります。その場合、`setAccessible(true)`を呼び出すと`SecurityException`を投げます。
この他、リフレクションではメソッド、クラス、フィールドすべて名前を文字列で指定するため、その文字列に一致するものがなければ例外になります。よって、ProGuard 等でコードの難読化をするときはリフレクションを用いたコードに気をつける必要があります（フィールド名やメソッド名が変えられても、文字列までは変えてくれないので）。
また、通常のメソッド呼び出しと異なりリフレクション API を経由するため、どうしてもパフォーマンスに影響が出ます。

言うまでもありませんが、普通ではアクセスできないものに無理やりアクセスできるようになったり、データを書き換えたりといった事ができるので、用法用量を守って正しくお使いください。

## ところで、決まりきったコード多くないですか

まとめて置いておきますね。

https://github.com/Drivemode/Intenso
Surface Pro 4 wirelesscapabilities

Windows 10 今のドライバの状態の記録。

設定 ＞ ネットワークとインターネット ＞ Wi-Fi ＞ ハードウェアのプロパティ

```
製造元:	Marvell Semiconductor, Inc.
説明:	Marvell AVASTAR Wireless-AC Network Controller
ドライバーのバージョン:	15.68.9040.67
物理アドレス (MAC):	‎B4-AE-2B-__-__-__
```

`netsh wlan show wirelesscapabilities` の出力

```
ワイヤレス デバイス機能
-----------------------

インターフェイス名: Wi-Fi

    WDI バージョン (Windows)                         : 0.1.0.21

    WDI バージョン (IHV)                             : 0.1.0.1

    ファームウェア バージョン                        :

    ステーション                                     : サポートあり

    ソフト AP                                        : サポートなし

    ネットワーク監視モード                           : サポートなし

    Wi-Fi Direct デバイス                            : サポートあり

    Wi-Fi Direct GO                                  : サポートあり

    Wi-Fi Direct クライアント                        : サポートあり

    管理フレームの保護                               : サポートあり

    DOT11k 近隣レポート                              : サポートあり

    ANQP サービス情報探索                            : サポートあり

    アクション フレーム                              : サポートあり

    ダイバーシティ アンテナ                          : サポートあり

    IBSS                                             : サポートなし

    無作為検出モード                            : サポートなし

    P2P デバイス探索                                 : サポートあり

    P2P サービス名探索                               : サポートあり

    P2P サービス情報探索                             : サポートなし

    P2P バックグラウンド探索                         : サポートなし

    5 GHz 帯の P2P GO                           : サポートなし

    ASP 2.0 サービス名探索              : サポートなし

    ASP 2.0 サービス情報探索       : サポートなし

    IP ドッキング対応                          : サポートなし

    FIPS                                             : サポートあり

    インスタント コネクト                            : サポートあり

    Dx スタンバイ NLO                                : サポートあり

    拡張チャネル スイッチ アナウンス                              : サポートなし

    機能レベルのリセット                        : サポートなし

    プラットフォーム レベルのリセット                : サポートあり

    バス レベル リセット                            : サポートあり

    MAC のランダム化                                 : サポートなし

    高速移行                                         : サポートなし

    MU-MIMO                                          : サポートなし

    Miracast シンク                               : サポートなし

    BSS の移行 (802.11v)                    : 不明

    構成されている IHV 拡張性モジュール              : サポートなし

    Tx 空間ストリーム数                              : 2

    Rx 空間ストリーム数                              : 2

    サポートされる同時チャネル数                     : 2

    P2P GO ポート数                                  : 1

    P2P クライアント ポート数                        : 2

    P2P モバイル AP クライアントの最大数             : 10

    サポートされる ANQP サービス アドバタイズの最大数: 0

    共存のサポート                              : Wi-Fi パフォーマンスを 1x1 に引き下げ
```
EC-CUBE3 ルートディレクトリ変更

今回EC-CUBE3にてルートディレクトリを変更したのでその手順を書いておきます。

環境

- さくらレンタルサーバ
- EC-CUBE3(3.0.13)

ドメイン設定は以下のようにしました。
hogehoge.com -> さくらレンタルサーバディレクトリ(/home/hogehoge/www/hoge/html/)をみるように。

html配下の.htaccessを以下のようにします。

```php:.htaccess
DirectoryIndex index.php index.html .ht

order deny,allow
deny from all
allow from all

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /

    # Authorization ヘッダが取得できない環境への対応
    RewriteCond %{HTTP:Authorization} ^(.*)
    RewriteRule ^(.*) - [E=HTTP_AUTHORIZATION:%1]

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !^(.*)\.(gif|png|jpe?g|css|ico|js|svg)$ [NC]
    RewriteRule ^(.*)$ index.php [QSA,L]
</IfModule>
```

あとはpath.ymlを以下のように設定。

```
root: /
admin_dir: admin/
tpl: /user_data/packages/default/
admin_tpl: /user_data/packages/admin/
image_path: /upload/save_image/
root_dir: /home/hogehoge/www/hoge
root_urlpath: /
template_code: default
admin_route: admin
user_data_route: user_data
public_path: /html
public_path_realdir: /home/hogehoge/www/hoge/html
image_save_realdir: /home/hogehoge/www/hoge/html/upload/save_image
image_temp_realdir: /home/hogehoge/www/hoge/html/upload/temp_image
user_data_realdir: /home/hogehoge/www/hoge/html/user_data
block_default_realdir: /home/hogehoge/www/hoge/src/Eccube/Resource/template/default/Block
block_realdir: /home/hogehoge/www/hoge/app/template/default/Block
template_default_realdir: /home/hogehoge/www/hoge/src/Eccube/Resource/template/default
template_default_html_realdir: /home/hogehoge/www/hoge/html/template/default
template_admin_realdir: /home/hogehoge/www/hoge/src/Eccube/Resource/template/admin
template_admin_html_realdir: /home/hogehoge/www/hoge/html/template/admin
template_realdir: /home/hogehoge/www/hoge/app/template/default
template_html_realdir: /home/hogehoge/www/hoge/html/template/default
template_temp_realdir: /home/hogehoge/www/hoge/app/cache/eccube/template
csv_temp_realdir: /home/hogehoge/www/hoge/app/cache/eccube/csv
plugin_realdir: /home/hogehoge/www/hoge/app/Plugin
plugin_temp_realdir: /home/hogehoge/www/hoge/app/cache/plugin
plugin_html_realdir: /home/hogehoge/www/hoge/html/plugin
admin_urlpath: /template/admin
front_urlpath: /template/default
image_save_urlpath: /upload/save_image
image_temp_urlpath: /upload/temp_image
user_data_urlpath: /user_data
plugin_urlpath: /plugin
```

なんかhogeばっかでわかりにくくなってしまったようなw
多分大事なのは以下のようなルートを指定している箇所だと思います。
root: /
root_urlpath: /

上記のような設定をすることでhogehoge.comで無事アクセスすることができました！
今のところプラグインとかも正常に動いてそうです！
PDFにページ番号を追加

# これなに
**Python** を使って、**無料で PDF を編集する方法** を紹介します。
サンプルとして、各ページにページ番号を追加してみます。

![image](https://qiita-image-store.s3.amazonaws.com/0/13955/15a7359a-2eb4-d8eb-1df5-101ef461a52c.png)

# インストール
下記を使用します。

- [ReportLab](http://www.reportlab.com/): Python用、PDF生成ライブラリ。有料版と無料版がある。
- [PyPDF2](http://pythonhosted.org/PyPDF2/): Page単位のPDF編集ライブラリ。
- [PdfFormFiller](https://pdfformfiller.readthedocs.io/en/latest/): PDFにテキストを挿入するライブラリ。

```bash:インストール
conda install -y reportlab
pip install PyPDF2 pdfformfiller
```

[Anaconda](https://www.continuum.io/downloads) を使っていない場合は、conda の代わりに pip を使ってください。

# ページ番号を追加するサンプル
日本語フォントとして、[IPAexGothic フォント](http://ipafont.ipa.go.jp/)を使っていますが、別のフォントでも構いません。
(Ubuntu では、apt-get install fonts-ipaexfont でインストールできます)

注意点として、用紙サイズを表す PyPDF2.pdf.PageObject.mediaBox の要素である FloatObject が Decimalを返すため、実数との加減演算でエラーになります。ここでは、無理やり、FloatObject が実数と加減演算できるように置き換えています。

addPage(入力ファイル, 出力ファイル) とすると、元のPDFに、ページ番号を追加したPDFを作成できます。

```py3:python
import PyPDF2
class FloatObject(PyPDF2.generic.FloatObject):
    def __add__(self, other):
        return self.as_numeric() + other
    def __radd__(self, other):
        return self.as_numeric() + other
    def __sub__(self, other):
        return self.as_numeric() - other
    def __rsub__(self, other):
        return -self.as_numeric() + other
PyPDF2.generic.FloatObject = FloatObject

from reportlab.lib.styles import ParagraphStyle
from reportlab.lib.enums import TA_CENTER
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
from pdfformfiller import PdfFormFiller

def addPage(infile, outfile):
    # Linuxでは、'/usr/share/fonts/opentype/ipaexfont-gothic/ipaexg.ttf'など
    pdfmetrics.registerFont(TTFont('IPAexGothic', 'c:/Windows/Fonts/ipaexg.ttf'))
    sty = ParagraphStyle('sty', alignment=TA_CENTER, fontName='IPAexGothic', fontSize=9)
    ff = PdfFormFiller(infile)
    for i in range(ff.pdf.getNumPages()):
        p = ff.pdf.getPage(i)
        ff.add_text('ページ %d'%(i+1), i, (0,p.mediaBox[3]-30), p.mediaBox.getUpperRight(), sty)
    ff.write(outfile)
```

- Windows, Ubuntu, Alpine-Linux で稼働確認しています。

### 追記

パッケージ化しました。

https://pypi.org/project/addpage/

以上
HDDにバックアップを取ろうとしたらシステムファイルがFAT32形式だった

C:ドライブのバックアップを取ろうとしたら、形式が違うからできないと言われたのでメモ
Win10です。

コントロール パネル\システムとセキュリティ\管理ツール
から、コンピュータの管理をクリック

記憶域\ディスク管理
から、ファイルシステムがFAT32になっているファイルを見つける。

私の場合、名前がないファイルがFAT32になっていた。
よくみたらシステムファイルだった。

本来は好ましくないが、「ドライブ文字とパスの変更」を行ってドライブに名前をつけないとファイルシステムをコマンドプロンプトで変更できない。
名無しのファイルって、ドライブ文字参照してないってことだからドライブ文字つけてもいいよね？？って感じです。

ってことでドライブ文字をつけていざマウントしようとしたら、今使用中だからだめって言われた。システムファイルだからそりゃそうよね。

次回起動時にマウントする。にYesで、再起動した。

再起動したら、無事マウントできた。あとは普通にバックアップを取って終了。

NTFSって完全にFAT32の上位互換なのになんでまだあるんだろって思いました。
システムファイルに名前付けちゃったけど大丈夫だよね
502 Bad Gateway

nginxをリバースプロキシとしてapache上でWordPressを動かしていたら、502 Bad Gatewayがたまに出るように。
nginxのログを見ると下記の様な文言がでてます。

```
1454 upstream sent too big header while reading response header from upstream
```

どうやら、apacheから返ってくるレスポンスのヘッダ（httpヘッダ？)がデカ過ぎるようです。
proxyのバッファのサイズを超えているってことみたいなので下記設定をnginx.confのhttpディレクティブに下記を追加もしくは変更。

```
    proxy_buffer_size     64k;
    proxy_buffers         32 64k;
```

意味は[こちら](http://mogile.web.fc2.com/nginx/http/ngx_http_proxy_module.html)を参照。
.onの使い方(jQuery3)

jQuery 1.7からイベントのバインドのためにonメソッドが追加されましたね。
jQuery 3からはbind()/unbind()/delegate()/undelegate()も削除されたので、これからはonメソッドで統一していくことになります。
しかし、ライブラリやフレームワークが変わっても実際に使用しなければ変わりません。いわゆるレガシーコードというものは誰かが修正するか窓から投げ捨てなければこの世から消えることはなく、いつの日か私たちの前に立ちはだかることになります。  
私の前にも人生n回目のレガシーコードをナウでヤングなコードに修正する作業がやってきました。jQuery 1.2時代の書き方がこれでもかと使用されていまして、そこら中にliveが使われているので頑張ってonに書き換えました。その際にonについてちゃんと学んでおこうと思い調べたところ、私が知っていたonは氷山の一角だったことが判明したのでまとめてみました。

## 基本

```javascript
$('#id').on('click', function(){
    alert('click!');
});
```
その名の通り基本形。  

## セレクターで指定
セレクターを指定してイベントを登録できます。

```javascript
$('#table').on('click', 'tr', function(){
    alert('click!');
});
```

```javascript
$('#table tr').on('click', function(){
    alert('click!');
});
```

上記の2つは同じようにイベントを登録できます。 ~~いまいち使いどころがわからない。~~  

**※2017/02/01追記**
両者の違いについてコメントをいただきました。

+ 前者は$('#table')に対してイベントを設定する。trが何個あってもイベントは1個しか設定されない。
+ 前者は$('#table')配下のtrであれば後から追加した要素でも発火する。
+ 後者は$('table tr')に対してイベントを設定する。trが100個あったらイベントは100個設定されるので前者より遅い。
+ 後者は後から追加した要素では発火しない。

目から鱗です。これからはちゃんと使い分けていこうと思います。

## 同じ要素に複数のイベントを登録
例えば一つの要素にclickとhoverの二つのイベントを実装することがあるかもしれない。  

```javascript
$('#id').on(
    {
        click: function(){
            alert('click!');
        },
        mouseenter: function(){
            alert('hover!');
        },
        mouseleave: function(){
            alert('unhover!');
        }
    }
);
```

オブジェクトに複数入れると全部登録してくれます。賢いですね。
hoverはmouseenterとmouseleaveになるとか知らなかった……  

## event.dataで値を渡すことができる
第二引数にオブジェクトを渡してやると、コールバック関数に渡すことができます。  

```javascript
$('#id').on(
    'click',
    {
        id: 101,
        name: 'jirou'
    },
    function(event){
        alert(event.data.id + ':' + event.data.name);
    }
);
```
これでもうグローバル変数に値を入れておいてコールバックの中で使うとかいう石器時代のコードとは決別できますね！  

### triggerから値を渡す
登録したイベントはtriggerメソッドで呼び出すことができますが、triggerメソッドからでも値を渡すことができます。  

```javascript
$('#id').on('click', function(event){
    alert(event.name));
});

$('#id').trigger('click', { name: 'tarou' });
```

### triggerから配列で値を渡す
配列で値を渡すと、引数として扱われます。  

```javascript
$('#id').on('click', function(event, id, name){
    alert(id + ':' + name);
});

$('#id').trigger('click', [102, 'tarou']);
```

もうこれで石器時代とは(ry

## イベントの伝播(バブリング)を止める
コールバックにfalseを渡すか、コールバックからfalseをreturnするとイベントの伝播を止めることができます。  

```javascript
$('#form').on('submit', false );
```

```javascript
$('#form').on('submit', function(){
    return false;
});
```

```javascript
$('#form').on('submit', function(event){
    event.preventDefault();
    event.stopPropagation();
});
```

デフォルト挙動と伝播の両方を止めたいならreturn falseでOKですが、片方だけ止めたい場合はそれぞれメソッドを呼びましょうねということですね。  

## まとめ
基本とセレクターで指定以外は全く知りませんでした……。もっと早く知っていればレガシーコードを生み出さずに済んだかもしれませんし、あの時に技術的負債を返済できたかもしれません。枕に顔をうずめてバタバタすることも少なくなるはずです。  
公式のドキュメントはよく読まないといけませんね。知らないものは使えないのです。知って初めて使えるのですから。
Backlogの予定/実績時間の入力を強制するChrome拡張機能をつくった

# なぜやるのか

プロジェクトの採算を管理するために、Backlogチケットの **予定/実績時間** の入力をチームにお願いするものの、なかなかうまくいかない。
個人の意識に任せるよりも **ツールを使って解決しよう** ということで開発を行った。

# Backlog Ticket Guardian

[Chrome ウェブストア](https://chrome.google.com/webstore/detail/backlog-ticket-guardian/pgllgfhhnciflmcmcicdfhgkffemcbln)
[GitHub](https://github.com/spookies-jp/backlog-ticket-gardian)

# なにをするものか

チケットのステータスに合わせて **予定/実績** の入力をチェックし **登録する** ボタンを無効化する。

- 未対応
	- 無効化しない。
- 処理中・処理中に変更する
	- **予定が未入力** の場合に登録ボタンを無効化する。
- 処理済み
	- **予定/実績が未入力** の場合に登録ボタンを無効化する。
- 完了
	- **予定/実績が未入力** の場合に登録ボタンを無効化する。

![backlog-ticket-guardian.gif](https://qiita-image-store.s3.amazonaws.com/0/159511/c29f10ec-cdd5-e64b-ca79-d33ccbf78e01.gif "backlog-ticket-guardian.gif")
HTML5でgraph描画ライブラリの作成

#HTML5のcanvas

HTML5で実装された「canvas」要素。２Dのグラフィックスの描画が可能となったということで、簡単にグラフを作成できないかと思い、作成してみました。

JavaScriptのES2016のお試しもかねて作成したのでIEでは動きません。

[GitHubソース](https://github.com/matsum0623/drawGraph-JSLibrary)

これから少しずつ改善と機能追加していくつもり


## 使用方法

### 棒グラフ

```html
<script>
    // データを二次元配列にて作成
    const GraphData = [
        ["1月",100  ,137 ,156],
        ["2月",200  ,32  ,176],
        ["3月",250  ,167 ,87],
        ["4月",120  ,367 ,257],
        ["5月",300  ,212 ,19],
        ["6月",80   ,78  ,91],
        ["7月",11   ,345 ,187],
        ["8月",0    ,198 ,99],
        ["9月",320  ,0   ,248],
        ["10月",278 ,10  ,378],
        ["11月",156 ,20  ,159],
        ["12月",367 ,30  ,234]
    ];
    // キャンバスのインスタンス生成(id,width,height)
    var MyCan = new drawGraph("MyCanvas",800,500);
    MyCan.drawBarGraph(GraphData);
</script>

<div id="MyCanvas"></div>
```

### 折れ線グラフ

```html
<script>
    //データを二次元配列にて作成
    const GraphData = [
        ["1月",100  ,137 ,156],
        ["2月",200  ,32  ,176],
        ["3月",250  ,167 ,87],
        ["4月",120  ,367 ,257],
        ["5月",300  ,212 ,19],
        ["6月",80   ,78  ,91],
        ["7月",11   ,345 ,187],
        ["8月",0    ,198 ,99],
        ["9月",320  ,0   ,248],
        ["10月",278 ,10  ,378],
        ["11月",156 ,20  ,159],
        ["12月",367 ,30  ,234]
    ];
    // キャンバスのインスタンス生成(id,width,height)
    var MyCan = new drawGraph("MyCanvas",800,500);
    MyCan.drawLineGraph(GraphData);
</script>

<div id="MyCanvas"></div>
```

### 円グラフ

```html
<script>
    // データを二次元配列にて作成
    const circleGraphData = [
        ['10代',60],
        ['20代',20],
        ['30代',30],
        ['40代',40],
        ['50代',50]
    ];
    // キャンバスのインスタンス生成(id,width,height)
    var MyCan = new drawGraph("MyCanvas",800,500);
    MyCan.drawCircleGraph(GraphData);
</script>

<div id="MyCanvas"></div>
```
PHP Imagickのノイズ除去はどうすればよいですか？

スキャナーなどで取り込んだ画像を、
PHP上で取り扱いと思い、Imagickを試しております。
ノイズが残ってしまい、trimImageのオプションでうまく消せないかと思ったのですが、
fuzzについて探してもあまり良い説明が無く、
他の方法でも良いので、ノイズを消す教えて頂けたら幸いです。

trimImageの参考
http://phpdoc.m-takagi.org/en/function.imagick-trimimage.html


```
$filename1 = $_SERVER['DOCUMENT_ROOT'] ."/imagick/img/smp1.png";     //読み込むファイル名
$filename2 = $_SERVER['DOCUMENT_ROOT'] ."/imagick/img/smp2.png";     //書き出すファイル名 
$image = new Imagick($filename1);
$image->transparentPaintImage("#ffffff", 0.0, 10, false); // 白を透過
$image->trimImage(0.3);                                   // 余白削除
$image->writeImage($filename2);                           // 画像書き出し
$image->clear();
```
ショートカットを活用しよう - 13 - Ctrl + Shift + Esc

# <kbd><kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>Esc</kbd></kbd> の効果
タスクマネージャーを表示します。
![image](https://qiita-image-store.s3.amazonaws.com/0/156225/ed0380b0-8782-da36-17ff-e9dfc05d986e.png)

例えば、アプリケーションが操作不能になってしまった場合、強制終了するなどや、OSの動作が重いなっと感じた際にパフォーマンスを確認するなどに便利です。

以上

|前回|方針|次回|
|:--|:--:|--:|
|[<kbd><kbd>Ctrl</kbd> + <kbd>+</kbd></kbd>](http://qiita.com/rrryutaro/items/42b17cb62424d31edf6e)|[記事の方針](http://qiita.com/rrryutaro/items/74d60a6e31ff149c5710)|[<kbd><kbd>Win</kbd> + <kbd>U</kbd></kbd>](http://qiita.com/rrryutaro/items/e13345c64a5989a68189)|
バイナリのデータをAWS IoT上でBase64エンコード＆JSON化して、後方サービスへ流す（例えばAWS Lambdaとか）

## TL;DR

AWS IoTのRuleで2016-03-23-betaから入った `Encode` 関数と `AS` 句を組み合わせて使う

```sql
/* Using SQL version を beta にしたうえで */
SELECT encode(*, 'base64') AS b64_by_awsiot FROM 'testing_awsiot/#'
```

これで、例えば `ABCD` という文字を `testing_awsiot/HOGE` トピックへ送ると

```json
{"b64_by_awsiot":"QUJDRA=="}
```

というJSONにすることができます
これはAWS Lambdaで読み取ることができますから、Base64デコードした上で色々と処理することも可能です

## なにで困ってるの？

センサー（正確にはマイコンですけど）からの取得できるデータの形式は、概ねバイナリだったりします
AWS IoT自体はMQTTブローカー(サーバ)として振る舞うため、バイナリを直接送ることができます※

※[１回の送信で最大128KBの制約あり](http://docs.aws.amazon.com/ja_jp/iot/latest/developerguide/iot-limits.html)

しかし、AWS IoTから先のサービス(e.g. Amazon Elasticsearch Service)は、AWS IoTからの出力がJSONであることを期待しているものが多く、なんらかの方法でJSON化してあげる必要があります
JSON化にAWS Lambdaを使用するアイデアは、AWS Lambda自体がJSONによる入力を期待するため、鶏卵問題となり、ダメでした
そのため、回避策として送信前(エッジ側)でJSON化してAWS IoTに送るというのが一般的でした

この辺のアプローチの違いは別途書きます → 書きました(2/9) [バイナリデータをクラウドとやり取りする際の設計アプローチ](http://qiita.com/ma2shita/items/c5f3a7b37652e26dfd76)

## あとがき

SQLシンタックス自体はβ何で、おきをつけて。 (2017年2月現在)
O(log N)の底は何なのか


アルゴリズムの計算量を評価するときに、O記法がよく用いられます。
O(log N)は、Nが十分に大きければ、その関数はlog Nに比例するということを意味します。

ところで、このlogの底は何なんでしょうか？

# 答え
気にしなくても良い。

対数の底の変換公式を使うと、以下のように変形できるので、底については気にしなくても良いです。

```math
\begin{align}
\log _a b &= \frac{1}{\log a} \times \log b \\
          &= O(\log b)
\end{align}
```
[Unity] ParticleSystemで連番テクスチャを扱う (TextureSheetAnimation)

## 実行環境
- Unity5.6.0b1 (beta)

## 第6回ゲームエフェクトコンテスト

![image](https://qiita-image-store.s3.amazonaws.com/0/102664/a1a888d7-c503-9fcc-cb51-4c453d46106b.png)

- https://www.gameeffectcontest.com/
- 2017年2月25日までエントリーを受け付けているコンテスト
- **第6回からUnity部門も開催！**
- 決められたテクスチャ群を利用するテクニカル部門とフリー部門が存在する
  - テクニカル部門は素材を1から用意する必要が無いのでUnityを多少扱えるエンジニアでも戦えそう

![image](https://qiita-image-store.s3.amazonaws.com/0/102664/bdd5526d-439e-c059-61db-e9b1f4a39733.png)

## 連番テクスチャ
- テクニカル部門の素材に含まれる以下のような画像がある
- このようにアトラス化されたTextureをUnityのParticleSystem(Shuriken)でどのように扱えば良いか？

![image](https://qiita-image-store.s3.amazonaws.com/0/102664/fd28d001-1c7f-398a-53c6-9d31b5ffca5a.png)

## TextureSheetAnimation

![image](https://qiita-image-store.s3.amazonaws.com/0/102664/d92e31ca-c52a-e778-60da-fe0829b47a4e.png)

- https://docs.unity3d.com/ja/current/ScriptReference/ParticleSystem.TextureSheetAnimationModule.html
- https://docs.unity3d.com/ja/current/Manual/PartSysTexSheetAnimModule.html
- ParticleSystem上のTextureSheetAnimationを使用することで連番再生が行える

|項目名||
|---|---|
|Tiles|X/Yのそれぞれに対して何分割するか|
|Animation|WholeSheetはテクスチャシート全体を左から右、上から下へとアニメーションする設定 / SingleRowはシートの1列のみを左から右にアニメーションする|
|RandomRow|AnimationがSingleRowのとき、どの列を再生するかランダムで決定する|
|Row|AnimationがSingleRowかつRandomRowが無効のとき、どの列を再生するか指定する|
|FrameOverTime|アニメーションのフレームが進行するにつれてどのように切り替わるか|
|StartFrame|どのフレームからパーティクルを開始するか|
|Cycles|パーティクルの生存時間中に何回アニメーションをループさせるか|
|FlipU|U座標を反転させて、水平に鏡映したように見せる|
|FlipV|V座標を反転させて、垂直に鏡映したように見せる|
|EnabledUVChannels|指定したUVに対してマスクを適応する|

## サンプル
### 下準備
- **Materialを生成**
  - 任意のShaderを指定 (今回は Mobile/Particle/Additive)
  - アトラス化されたテクスチャを指定
- **ParticleSystemをScene上に追加**

![create_material.gif](https://qiita-image-store.s3.amazonaws.com/0/102664/9d4bdee2-ed2d-7653-26b0-7713f21d66c3.gif)

### ParticleSystemの設定
- **Renderer**
  - Materialを指定
  - MaxParticleSizeを1に指定
- **TextureSheetAnimation**
  - 有効にする
  - TileXに8 / TileYに4を指定する
- **Shape**
  - 無効にして出現位置/射出方向を拡散しないようにする
- **ParticleSystem**
  - StartSpeedを0にしてその場に留まるようにする
  - StartSizeを10に設定に設定し大きく描画
  - Duration / StartLifetime 共に2に設定し、再生時間を調整
- **Emission**
  - RateOverTimeを0にし、継続して射出しないようにする
  - Burstsを有効にし、0.00時点でMin/Maxを1に指定し、1個だけ表示されるようにする

![particle_setting.gif](https://qiita-image-store.s3.amazonaws.com/0/102664/22db2050-8e07-7be6-f457-7263ab90d7c7.gif)

### 再生
- 通常再生

![particle_effect.gif](https://qiita-image-store.s3.amazonaws.com/0/102664/06a5a6cf-7183-785f-fed8-392de7736389.gif)

- フレーム送り (ショートカットキー: mでフレーム毎にコマ送り再生)

![particle_effect_frame.gif](https://qiita-image-store.s3.amazonaws.com/0/102664/47503b0f-e61e-62e3-2db7-89fe64e6fdf4.gif)

### 後は加工して好みのエフェクトにするだけ！
- (色味を加え、RateOverTimeに変更しつつ、ランダム回転加え、重力を逆方向に指定した図)

![effect.gif](https://qiita-image-store.s3.amazonaws.com/0/102664/a776500f-422a-1a1d-15d0-5192d75f4bda.gif)
[Rails]スレッドセーフにskip callbackする方法

# はじめに
最近RackサーバーをPumaに切り替えたこともあり、スレッドセーフのチェックをがんばっている日々。特定の条件で動的にcallbackをスキップしている箇所があるが、set_callback / skip_callbackはスレッドセーフでないので使えない。じゃあどうしたら良いのよ！？というのがきっかけで、skip_callbackと同等な動作をスレッドセーフでやる方法を調べてみた。

# 素朴な疑問(:callbacks => falseオプションが実装されていない経緯)
ActiveRecordの作成・更新系のメソッドにはvalidationをスキップするオプションがある(:validate => false)。だったらそもそも、callbackをスキップするオプションだって実装されていても良いのでは？という素朴な疑問が浮かんだ。調べてみると、railsのPull Requestで同じことを考えている人がいた。
https://github.com/rails/rails/pull/4885

結論としては、callbackをスキップするオプションが欲しいと考えてる人は多いようだが、結局railsには実装されず。理由は、Modelの外の条件でcallbackの有効/無効が切り替わるのはユースケースとして間違っている、そもそもcallbackを使うべきではない、ということ。じゃあ、update_columnsみたいなメソッドはどうなんだとか、:validate => falseのオプションはどうなんだとかツッコミが入っているが、、

# skip_callbackのスレッドセーフな代替案
### attr_accessorを使う  
attr_accessorを使って、callbackの有効/無効の状態を保持しておく。たぶんこれが一番きれいな方法。

```rb
# Model
attr_accessor :skip_my_callback
after_save{ my_callback unless skip_my_callback }
```
```rb
#controller
Model.create skip_my_callback: true
```

### Observerを使う
モデルの内部的なロジックに関係しないトリガーメソッドは、callbackではなくobserverを使うのがもともとのマナー（らしい）。
configで指定できるので、RAILS_ENVで有効/無効を切り替えたいときはこれが最適。
`config.active_record.observers = [:user_observer]`

### callbackのない別モデルを作る
callbackのない別モデルを作り、そちらのモデルを使ってモデルの更新などを行う。

```rb
# Model
class PureUser < ActiveRecord::Base
  self.table_name = 'users'
end
```

```rb
# Controller
PureUser.new( user_attributes )
```

### update_columns
DBを直接更新しにいくことで高速化を図ることが目的のメソッドだが、callbackをスキップするためにも使える。ただ、validationもスキップしてしまうし、after_save/after_updateあたりの一部のコールバックだけにしか使えない。
同じようなメソッド:
 update_column
 update_columns
 update_all
 update_counters

### gemを使う
サードパーティのgemを使う。ざっと調べて、以下のようなgemを見つけた。使うgemが本当にスレッドセーフか確認する必要があるが、、
https://github.com/einzige/sneaky-save
https://github.com/dball/skip_activerecord_callbacks

# 結論
RAILS_ENVでcallbackの有効/無効を切り替えたいときはObserverを使い、それ以外の場合はattr_accessorを使う。
Python > Slice > A slice offset earlier than the beginning of a string is treated as 0, and one after the end is treated as -1

@ Introducing Python: Modern Computing in Simple Packages by Bill Lubanovic
(No. 969 / 12833)

> Slices are more forgiving of bad offsets than are single-index lookups. **A slice offset earlier than the beginning of a string is treated as 0, and one after the end is treated as -1, as is demonstrated in this next series of examples**.

```
>>> letters[-50:]
'abcdefghijklmnopqrstuvwxyz'

>>> letters[-51:-50]
''

>>> letters[:70]
'abcdefghijklmnopqrstuvwxyz'

>>> letters[70:71]
''
```

上記は理解した。

> one after the end is treated as -1

の例が見当たらない気がする。

one after the end is treated by reducing by 1 (終端を1超えたインデックスは1マイナスして扱われる）の意味だろうか。
ビットマスク

# Python - 当初版
```bitmask.py
# b5-b3のマスクを得る. 
startbit=3   # startbitをb3
bitlen=3     # startbitを含めて3bitのビット長(b5b4b3)
b=0
for i in range(startbit, startbit + bitlen):
     b|=1<<i

bin(b) #=> '0b111000'

# b10-b0のマスクを得る. 
startbit=0 # startbitをb0
bitlen=11 # startbitを含め11bitのビット長(b10...b1b0)
b=0
for i in range(startbit, startbit + bitlen):
    b|=1<<i

bin(b) # '0b11111111111'

# b49-45のマスクを得る.
startbit=45 # startbitをb45
bitlen=5 # startbitを含め5bitのビット長(b49b48b47b46b45)
b=0
for i in range(startbit, startbit + bitlen):
    b|=1<<i

bin(b) #=> '0b11111000000000000000000000000000000000000000000000'
```

# Python - shiracamusさん版
```bitmask.py
def bitmask(startbit, bitlen):
     return ((1 << bitlen) - 1) << startbit
```

startbit=3, bitlen=3で具体化すると、補数的な感じでマスクが求められていることがわかる
1 << bitlen :
　1 <<3  = 0b1000

(1 << bitlen) - 1 :
　(1 << 3) - 1 = 0b1000 - 1 = 0b111

(1 << bitlen) - 1) << starbit :
　((1 << 3) - 1) << 3 = 0b111 << 3 = 0b111000


# C - 当初版
* bitmask(0,64)(b63-b0のbitmask)が作成できないバグあり(コメント参照)

http://melpon.org/wandbox/permlink/KAdTUEdphWrNncP0

```bitmask.c
#include <stdio.h>
unsigned long long bitmask1(
    unsigned char startbit,
    unsigned char bitlen
){
    return (((unsigned long long)0x1 << bitlen)-0x1) << startbit;
}
```

# C - shiracamusさん版

```bitmask2.c
unsigned long long bitmask2(
    unsigned char startbit,
    unsigned char bitlen
){
    if (startbit >= 64) return 0;
    if (bitlen >= 64) return ~0ULL << startbit;
    return ((1ULL << bitlen) - 1ULL) << startbit;
}
```

# C - 第3版
いろいろ考えた結果、あまり面白くない感じになりました。
* 間違いがあったため、修正(bm %= 64u; → bitlen %= 64u;)

実行結果比較
http://melpon.org/wandbox/permlink/hTrTCCmfgjORuGsT

```bitmask3.c
 unsigned long long bitmask3(
    unsigned char startbit,
    unsigned char bitlen
){
    unsigned long long bm = 0x0UL;
    if (bitlen == 64u){
        bm = ~(0x0ULL);
    } else {
        bitlen %= 64u;
        bm = (0x1ULL << bitlen) - 0x1ULL ;
    }
    startbit %= 64u;
    bm <<= startbit;
    
    return bm ;
}
```
GitHubにトピック（タグ）機能が追加されました

本日(2017/2/1)、GitHubにトピック機能が追加されました。

[Introducing Topics | 公式Blog ](https://github.com/blog/2309-introducing-topics)

![image](https://qiita-image-store.s3.amazonaws.com/0/35595/8fdbaba6-9f67-68d5-b728-1ad474eab9f8.png)

# TL;DR

- GitHubのリポジトリにトピック（タグ）がつけられる
- トピックは自由に設定可能
- トピックで検索可能


# トピックを設定する
`Add topics`というリンクが追加されているのでクリック

![image](https://qiita-image-store.s3.amazonaws.com/0/35595/b8554fb1-19ec-1fb3-0fbc-f983a4e81095.png)

## トピックの設定
スペース区切りで入力していく

自動でタグが提案されるのでこれを選ぶと楽。
ただし機械学習で提案しているみたいでまだ賢くない。
![image](https://qiita-image-store.s3.amazonaws.com/0/35595/b1d6b6bc-807d-946f-fa92-4beb5c521301.png)

---

提案されたもの以外も自由に設定可能。
![image](https://qiita-image-store.s3.amazonaws.com/0/35595/06ada19f-187f-c4d2-9d90-eda89751b056.png)

## 登録後
![image](https://qiita-image-store.s3.amazonaws.com/0/35595/74778395-02aa-f203-6cee-5efd8e29a677.png)

# トピックで検索する
トピックをクリックすることで検索ができる
※`topic: トピック名`で手動検索もOK

![image](https://qiita-image-store.s3.amazonaws.com/0/35595/e3e4821d-a327-a424-ac7a-ed9fe5c4962c.png)

## 検索後
![image](https://qiita-image-store.s3.amazonaws.com/0/35595/61a2472f-f9ef-6f53-940c-d2a479b88e29.png)


## さっき設定したやつは？
スターが低いので２ページ目に表示されてました。

![image](https://qiita-image-store.s3.amazonaws.com/0/35595/56bd0517-80a5-faf3-f9b7-dc2f99d26ace.png)
Linuxについての個人的まとめ

#この記事について#
自分の備忘録として、Linux全般についての自分の考えや調べたことを記載していきます。
ほぼリンク集として使用。
経験が浅いので、間違っていることもあると思いますがご容赦ください。

#概念

| 事項       |       説明|       参照|
|:-----------------|:------------------|:------------------|
|ファイルシステムとマウント|-|

#小技

| 事項       |       説明|       参照|
|:-----------------|:------------------|:------------------|
|SQLスクリプトをシェルスクリプト内に書く|-|[SQL*Plus使い方 - SQLスクリプトをシェルスクリプト内に書く](https://blogs.oracle.com/oracle4engineer/entry/sqlplus_-_sql_tips-3)|
|記法について 2>&1|-|[2>&1はどういう意味？](https://teratail.com/questions/1285)|
|/etc/bashrcとは|環境設定ファイルの事|[/etc/bashrc](https://wa3.i-3-i.info/word11796.html)|
|swapファイルについて|メモリが足りなくなったときに使用|[linux スワップ（swap）領域の作成](https://kazmax.zpp.jp/linux_beginner/mkswap.html#ah_4)|
|再帰的にファイルを表示する|-|[ls -lコマンドの結果をサブディレクトリ含めてフルパスで列挙したい](https://qiita.com/dwatarub/items/768c5eb263b49198952e)|

#コマンド#

| 事項       |       説明|       参照|
|:-----------------|:------------------|:------------------|
|test|if文と組み合わせて、ファイルの存在チェックを行ったりする|
[if 文と test コマンド](http://shellscript.sunone.me/if_and_test.html)|
[xargs](http://precure-3dprinter.hatenablog.jp/entry/2018/05/06/xargs%E3%81%AF%E5%87%BA%E5%8A%9B%E3%82%92%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E5%BC%95%E6%95%B0%E3%81%AB%E6%B8%A1%E3%81%99%E3%81%A0%E3%81%91%E3%81%AE%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89)|

#トラブル対応#

<b>logの追い方</b>

まずはlogを追う。
↓
logにエラーメッセージが出ている
↓
エラーメッセージでgrepし、発生ソースを特定
↓
ソースの前後で怪しいところがないかを1行ずつ確認
↓
落ちているところ/怪しいところを確認
↓
落ちているところを手動で実行してみる。
↓
結果を考察する
Rubyのクラス変数の取り扱いバリエーション

個人的メモ

クラス変数を取り扱うに当たっていろんなバリエーションがあります。
基本的にはセルフを使うことが多いと思うけど、クラス変数取り扱いメソッドが増える場合はHogeがおすすめ。
`class << self`内に書かれているものはself内を見てくれる。

```ruby
class Hoge
   @@count = 1
   class << self
       def count
           puts @@count
       end
    end
end

class Fuga
    @@count = 1
    def Fuga.count
        puts @@count
    end
end

class Haga
    @@count = 1
    def self.count
        puts @@count
    end
end

Hoge.count
Fuga.count
Haga::count
```
結果

```ruby
1
1
1
```

```ruby
class Moga
    @@count = 0
    
    def self.count
        puts @@count
    end
    
    def initialize
        @@count += 1
    end
end

Moga.new
Moga.count
```
結果

```ruby
1
```

クラス変数は何度でも書き換え可能である。
ちなみに、`attr_`シリーズは使えないので注意。
書き換えようのメソッドを作って値を変更するしかない。
F# を ubuntu/mono と Visual Studio Code で始めるメモ

# 概要

- F# で遊びたい。
- ubuntu で遊びたい。
- Visual Studio Code で遊びたい。
- cmake で遊びたい。

この様な場合の環境構築についてメモを残したい。

# 環境構築

## ubuntu

適当に用意して下さい。 16.04 を入れた事にして話を進めます。

## mono + fsharp + nuget

```
sudo apt-get install mono-complete fsharp nuget
```

この段階で `fsharpc` （コンパイラー）、 `fsharpi`（インタープリター）、 `mono`（ .net な .exe の JIT なコンパイラー）、 `nuget`（ .net なパッケージマネージャー） が使用可能になる。

## vscode + Ionide

1. [Visual Studio Code](https://code.visualstudio.com/) の .deb パッケージを拾って install
    - ref.: [vscode を ubuntu に .deb で install したら実行ファイルがどこにあるか探して手 symlink を貼る必要があったメモ](http://qiita.com/usagi/items/d800457a7ee355d7305d)
2. [Ionide](http://ionide.io/) を vscode から install
    - CTRL + P -> `> ext install Ionide`
        - ref.: [Microsoft - Getting Started with F# in Visual Studio Code with Ionide](https://docs.microsoft.com/en-us/dotnet/articles/fsharp/tutorials/getting-started/getting-started-vscode)
        - ref.: [Ionide - Use F# on Linux](http://fsharp.org/use/linux/)

## FAKE, Paket

`nuget` を使い、手作業で FAKE と Paket もシステムに用意する。

```zsh
sudo su -
cd /opt
nuget FAKE
ln -s FAKE.4.50.0 FAKE
nuget Paket
ln -s Paket.3.35.1 Paket
cd /usr/local/bin
echo -e '#!/bin/sh\n/opt/FAKE/tools/FAKE.exe $@' > FAKE
chmod +x FAKE
echo -e '#!/bin/sh\n/opt/Paket/tools/paket.exe $@' > paket
chmod +x paket
ln -s FAKE FAKE.exe
ln -s paket paket.exe
```

これでシステムに FAKE と Paket を導入し、 `FAKE` （または `FAKE.exe` ）、 `paket` （または `paket.exe` ） で何時でも使用可能になる。

- Notes:
    - この記事を読むタイミングによっては FAKE, Paket の導入されるバージョンは異なる可能性がある。 `ln -s` で作成する symlink を貼る際には適当に置き換える。
    - /usr/local/bin に symlink ではなくシェルスクリプトを用意する方法はそれぞれの .exe が依存する .dll の都合を簡単に解決できるためそのようにした。
    - これらをシステムへ用意する事が嫌ならプロジェクト毎に必要に応じて用意すれば良い。
    - システムへ用意する場合も手作業での方法は様々な方法があるので必ずしもこの例と同様に行う必要は無い。

# 使い方

後は使うだけ。適当にプロジェクトを作ってにゃんにゃんしましょう。

## プロジェクトのディレクトリーを準備し、 vscode を起動

```zsh
mkdir -p ~/tmp/hoge
cd ~/tmp/hoge
git init
code .
```

- Note: こうした作業も vscode で処理したい、あるいはそもそも git を使わないなどはお好みでどうぞ。

## vscode の Ionode プラグインでプロジェクトの雛形を用意

CTRL + P から:

```vscode
> F#: New Project
```

![image](https://qiita-image-store.s3.amazonaws.com/0/33891/ee573b38-2dd0-3dad-e006-118c40645a98.png)

今回はとりあえず console で作る:

```vscode
console
```

![image](https://qiita-image-store.s3.amazonaws.com/0/33891/d1ea4907-43a9-0ada-022c-2e0ff4030003.png)

プロジェクト単位の場所や名称を続けて聞かれるので入力して進める。今回は "hoge" プロジェクトを作成してみました。必要なファイルなど自動的に用意してくれます:

![image](https://qiita-image-store.s3.amazonaws.com/0/33891/2ddc6e94-cc6b-47f3-71ba-eeea60d210d2.png)

自動的に用意された hoge.fs:

![image](https://qiita-image-store.s3.amazonaws.com/0/33891/55fdc16c-9d2a-3d3c-d739-a74ed8d16956.png)

## ビルド

```
sh build.sh
```

![image](https://qiita-image-store.s3.amazonaws.com/0/33891/e87faa48-8030-0195-ee0a-9ad74930cc96.png)

### 実行

```
mono build/hoge.exe hello
```

![image](https://qiita-image-store.s3.amazonaws.com/0/33891/0b86c9a4-6941-c2d9-3e89-97bd6a22b24e.png)

Note: `chmod +x` すれば `mono` を明示的に経由しなくても `build/hoge.exe hello` の様にも実行可能になる。
Xcode8.xでのiPhone実機デバッグメモ

## 経緯
Mac買ってSwiftちょっと触ってみたけど、Androidみたいに所持してるデバイスで動かないとなんとなくモチベーションが……
とか思ってたらXcode７から無料実機デバッグが出来るらしいという話を聞いた(今更)
なのでビール片手にやってみたが、やり方忘れそうなのでメモ

## 環境
- macOS 10.12.3
- Xcode 8.2.1
- iOS 9.3.1

## やり方

### Apple ID登録
ここはやってると思うのでざっくりと
右上のリンゴマーク横の Xcode > Preferences... > Accounts からiPhoneに登録しているApple IDを登録

### SigningのTeamを設定
デバッグしたいプロジェクトのプロジェクト設定を開く
General > Signing > Team で任意Teamを選択

![スクリーンショット 2017-0じっこうぼたんを8.05.png](https://qiita-image-store.s3.amazonaws.com/0/148944/bf7c991c-3437-ea5b-ee25-c168ff6a12d6.png)

### デバッグターゲットを設定
General > Signing > DevelopmentInfo > DevelopmentTarget で実機のOSバージョン以下のバージョンを指定する

![スクリーンショット 2017-02-01 2.33.44.png](https://qiita-image-store.s3.amazonaws.com/0/148944/5db0bb31-7b92-0f34-7f60-429305283569.png)


### デバッグデバイスを選択
左上の停止ボタン横のエミュレータを指定する部分で一番上のDeviceから接続済みのiPhoneを選択

![スクリーンショット 2017-02-01 2.48.38.png](https://qiita-image-store.s3.amazonaws.com/0/148944/984a0321-00f8-9c7f-4199-fa203a795289.png)


### 実行
実行ボタンを押す
**Could not launch** エラーが出る場合

![スクリーンショット 2017-02-01 2.35.46.png](https://qiita-image-store.s3.amazonaws.com/0/148944/0750ce06-d4c4-45d2-fd66-f1c63f2b40e2.png)

iPhone側で 設定 > 一般 > デバイス管理
自分のAppleIDを選択し、**"AppleID"を信頼** を押す

![1485884411.jpg](https://qiita-image-store.s3.amazonaws.com/0/148944/71af2784-2872-feb9-2431-181050217378.jpeg)

再度実行ボタンを押す