OmniAICreator/Qiita-1.07M huggingface dataset:
知っておくと便利かもしれないSlack Tips

# これは何

コミュニケーションツール「[Slack](https://slack.com/)」を使う上で、知っておくと便利かもしれないTipsをいくつかまとめました。役に立たない情報もあるかもしれません。

* 基本的にSlackのMacアプリを前提としています。
* Slackの設定画面は Slack > Preferences から表示できます

![image](https://qiita-image-store.s3.amazonaws.com/0/8292/aff456d4-ecf6-0afa-918f-039ba7f9618b.png)


# 起動時のローディングメッセージを変える

![image](https://qiita-image-store.s3.amazonaws.com/0/8292/533280d9-ab64-ded5-d1b9-f631633f17d3.png)

起動時に表示されるローディングメッセージは[こちらのURL](https://slack.com/customize/loading)からカスタマイズできます。

チーム全体から見えるので、メッセージの内容にはご注意ください :laughing: 

# 絵文字をカスタマイズする

![image](https://qiita-image-store.s3.amazonaws.com/0/8292/d3dbf8d1-4ba2-d5c6-3eb9-6faa497e6339.png)


[こちらのURL](https://slack.com/customize/emoji)から絵文字を自由に追加できます。

例えば `:marimo:` と入力するだけで、マリモの画像を表示することができるようになります。

# 未読があるチャンネルだけ表示

![image](https://qiita-image-store.s3.amazonaws.com/0/8292/a5dfceaa-4ad4-d270-85a9-7cf368ffcda7.png)

これは割と有名だと思いますが念のため。

![スクリーンショット 2016-06-11 9.54.00.png](https://qiita-image-store.s3.amazonaws.com/0/8292/97eb241f-53ff-106b-e40b-905e421e336c.png)

設定画面の Advanced Options > Channel List から様々なオプションを選択できます。登録しているチャンネルが多い人におすすめですね。

# 時間表記を24h表記にする

![image](https://qiita-image-store.s3.amazonaws.com/0/8292/015295e6-705b-5691-8883-378078dd4b60.png)
![image](https://qiita-image-store.s3.amazonaws.com/0/8292/06fd951d-d465-8884-d231-892759107c59.png)

デフォルトだと「1:41 PM」のようになっていることがありますが、設定画面の
Messages & Media > Display Options > Show times with 24-hour clock 
から24時間表記に変更できます。

# 太字、斜体、取り消し線を入力する


`*太字* _斜体_ ~取り消し線~`

と入力することで、

![image](https://qiita-image-store.s3.amazonaws.com/0/8292/95ab4fe8-121f-71ec-4117-2058f95346c2.png)

のように表示されます。

MARKDOWN 記法と若干異なるのでご注意を。

# 誰がタイピング中かを非表示にする

![image](https://qiita-image-store.s3.amazonaws.com/0/8292/2f9ed15c-af14-3490-0dd8-12e2593bdb8f.png)

デフォルトでは誰かが文字をタイピング中に「hoge is typing」と表示されますが、設定画面の
Messages & Media > Display Options > Display information about who is currently typing a message
をオフにすることで非表示にすることもできます。

# Surprise　me!

![image](https://qiita-image-store.s3.amazonaws.com/0/8292/d386add3-6afb-9e10-becd-0f92fda97e5a.png)

何が起こるかはお楽しみ :tada: 

# おまけ：iPhoneアプリで誰がリアクションしてくれたかを確認する

自分の発言に誰がリアクションしてくれたかをiPhoneアプリから確認するには、絵文字を長押しします。

![image](https://qiita-image-store.s3.amazonaws.com/0/8292/b56f759c-dd9c-e450-debc-03e99e28a94c.png)
脆弱性スキャナVulsのログを使ってシステムに潜む脆弱性を可視化しよう

# はじめに

脆弱性スキャナ[Vuls](https://github.com/future-architect/vuls)ではスキャン結果を、色々な形式で出力することができます。
しかしスキャン結果を細かくフィルタしたり集計・グラフ化したかったため、JSON形式で出力されたログをソースに**システム全体の脆弱性を分かりやすく可視化**するツールを作成しました。

#### Github
[VulsRepo -VulsRepo is visualized based on the json report output in vuls.-](https://github.com/usiusi360/vulsrepo)

# 出来ること

デモ動画
　Youtube　https://youtu.be/DIBPoik4owc

## 1.ブラウザからExcelのピボットテーブルライクに集計・フィルタリング操作ができます
![image](https://raw.githubusercontent.com/usiusi360/vulsrepo/master/gallery/image001.png)

## 2.集計した内容をグラフ化できます
![image](https://raw.githubusercontent.com/usiusi360/vulsrepo/master/gallery/image002.png)

## 3.脆弱性の詳細にワンクリックでアクセスできます
![image](https://raw.githubusercontent.com/usiusi360/vulsrepo/master/gallery/image003.png)
![image](https://raw.githubusercontent.com/usiusi360/vulsrepo/master/gallery/image004.png)

# インストール

ZIPファイルをダウンロード・展開し、VulsのJSONファイルにリンクするだけです。
詳細は[github](https://github.com/usiusi360/vulsrepo)を参照してください。

# さいごに
ピボットテーブルライクに項目の組み合わせ・フィルター条件を色々変えて見ることで、システムの特性や運用ポリシーにあった分析が出来るようになります。
システムに潜む脆弱性を俯瞰し、対応漏れのないセキュリティ運用に繋げられればと思います。
ZYBO > XPS_IRQ_INT_ID for Core0_nIRQ > XPS_FIQ_INT_ID関連の調査

## Core0_nFIQ

http://qiita.com/7of9/items/31cbcebd30dfe4ca5d5f
で使用したXSDK上の実装コードに以下の記述がある。

```
#define FPGA_INT		    XPS_IRQ_INT_ID
```

PL-PS Interrupt PortsのCore0_nIRQ割込みを処理するのに上記を使っているようだ。

一方でPL-PS Interrupt PortsにはCore0_nFIQ割込みもある。Vivado上のRe-customize IPでの説明は「Enables fast private interrupt signal for CPU0 from the PL」とある。

Core0_nFIQを使う場合はXPS_IRQ_INT_IDの代わりに以下のものを使えば良いのだろうか？

```xparameters_ps.h
#define XPS_FIQ_INT_ID			28U	/* FIQ from FPGA fabric */
```

実際に試したが、FIQ割込みは発生しなかった。

## XPS_FIQ_INT_ID使用コード

XPS_FIQ_INT_IDを使用しているコードを見つけた
https://github.com/ATaylorCEngFIET/MicroZed-Chronicles/blob/master/main_part106.c

```
#define TMRCTR_INTERRUPT_ID	XPS_IRQ_INT_ID
#define TMRCTR_FINTERRUPT_ID	XPS_FIQ_INT_ID
```

```
TmrCtrSetupIntrSystem(&InterruptController,&Timer1CounterInst,&Timer2CounterInst,
						TMRCTR_INTERRUPT_ID,TMRCTR_FINTERRUPT_ID,TIMER_CNTR_0);
```

IRQ_INTとFIQ_INTを引数で指定している。

FIQ関連の理解が必要だ。
CSSだけでグリッドレイアウトの最初の行のみ挙動を変えたい！

## ブロックの並び

通常、CSSでグリッドレイアウトを用いたブロックを並べる場合は、左から順に配置になります。

![image](https://qiita-image-store.s3.amazonaws.com/0/39134/131c36ee-c90b-c56d-2765-5c6748499b5a.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/39134/e0aca7d3-1093-c2b2-669e-adb15bc6f31e.png)


2行以上になる場合は左揃えのほうが整って見える場合が多いのでそれでいいのですが、もし1行で終わるのであれば1行目だけ均等配置、中央揃えなどにしたほうが収まりが良いレイアウトもあると思います。

![image](https://qiita-image-store.s3.amazonaws.com/0/39134/f503bd17-c085-5a0e-0e0d-d41126c913b2.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/39134/d2e6e2b9-116b-a631-bdfc-4430992a90ea.png)


しかしながら一体どうやってCSSを書いたらいいでしょうか…JSで数を数えてやるのが早い気がしますが…
ECサイトを作成してて、商品一覧で1点〜数点しかない場合、なんとなく中央もしくは均等配置のほうが収まりがいい気がしてきたので、できないかなーと思ったらできました。

## Flexboxでできた


<a href="http://codepen.io/tanshio/pen/aZdRbN"><img src="https://qiita-image-store.s3.amazonaws.com/0/39134/fbb9180a-d76e-bc77-2667-58db940d7e74.png"></a>

[Change first row by flexbox](http://codepen.io/tanshio/pen/aZdRbN)

いろいろやったら出来たので、CodePenにアップしてみました。
カラム数やボックスの量などを調節できるようにしてあります。

flexboxで一旦並べ、最初の行をnth-of-typeで制御するといった手法です。
marginとの合わせ技で1行目のみ均等・中央揃えが再現できました。
たぶんJS使わずに共通クラスのみでやる場合、Flexboxを用いるしかやりようがないような気がします。

## コード
重要な部分の抜粋

```scss

.list {
  display: flex;
  flex-wrap: wrap;
  justify-content: space-between;
  margin: $gutter*2 $gutter*-1 0;
  
  &.is-start {
    justify-content: flex-start;
  }
}

.list__item {
  box-sizing: border-box;
  flex-basis: calc(100% / #{$columns});
  height: 300px;
  margin-bottom: $gutter*2;
  padding: 0 $gutter;
  
  .is-justify & {
     &:nth-of-type(-n+#{$columns}) {
      margin: 0 auto $gutter*2;
    }

    &:nth-of-type(n+#{$columns}):last-of-type {
      margin-right: auto;
    }
  }
  
  .is-center & {
    &:nth-of-type(-n+#{$columns}) {
      margin: 0 0 $gutter*2;
    }
    
    &:first-of-type {
      margin-left: auto;
    }
    
    &:nth-of-type(n-#{$columns}):last-of-type {
      margin-right: auto;
    }

  }
  
}
```

キモはmarginにautoをかけるところだと思います。
１個しかない場合はonly軍団を使っていろいろやるとか、そんなこともFlexboxだったら簡単にできそうですね。
レスポンシブでも大丈夫なので、ブラウザ幅に応じてカラム数を増やしたり減らしたりなどしても真ん中や均等に配置できるのでECサイトとかだと使えそうです。
高さも揃えられるしFlexboxは本当に便利。
とりあえずChrome、Firefox、Safari、Edgeで確認したのでモダンブラウザ対応でOKであればいろいろ使えそうです。
IE9以下はもういいんじゃあないでしょうか :innocent:
Link > MicroZed Chronicles > ソースコード @ github

MicroZed Chronicles リスト http://adiuvoengineering.com/?page_id=285
@ Adam Taylor blog

上記関連のソースコードがgithubに公開されていた。
https://github.com/ATaylorCEngFIET/MicroZed-Chronicles

blogにもdocxファイルで添付されているが、こちらの方が可読性が高い。
ZYBO > Interrupt from PL > EMIO (ピン54) / Core0_nIRQ

```txt:動作環境
Vivado 2015.4 on Windows 8.1 pro
```

## 試したこと

http://qiita.com/7of9/items/55d4aa0c488c6023c886
で見ていたPLからの割込みを試した。

XSDK上実装のソースコードは以下で見れる。
https://github.com/ATaylorCEngFIET/MicroZed-Chronicles/blob/master/main_part38.c


Vivado上での作業、XSDK上での作業をそのまま実施。
blog上にあるソースコードをXSDKで実装して実行した。

~~ZYBOでも割込み処理が確認できた。~~
FPGAの割込みが動いていない。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/9d30760e-003b-dbe5-fa91-c8749236aac2.png)

## 未消化事項

2点未消化。

### 54ピン

未消化な事項としては以下で定義している54ピンというのがどの情報から来ているのか。

```
#define intpin	54
```


### 割込みの回数

MIO51のボタンの押下をチェックしているが、１回押した時に「Push button Interrupt Event」が2回表示される。2回割込みがかかっているのだろうか。


## FPGA割込みの認識

FPGA割込みが機能してなかった。

> Re-customize IP > MIO Configuration > GPIO > EMIO GPIO (Width) を1にしている。

で追加した GPIO_0のGPIO_O[0:0]をCore0_nIRQに接続するようだ。
ブログではxlconcatを使っているが、1ビットなので必要なさそう。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/09362898-4c7f-e05c-c0b1-f1c013688437.png)

GPIO_O[0:0]はBank2?で54ピンが該当するようだ。

```xgpiops.h
#define XGPIOPS_DEVICE_MAX_PIN_NUM	(u32)118 /**< Max pins in the Zynq GPIO device
					      * 0 - 31,  Bank 0
					      * 32 - 53, Bank 1
					      *	54 - 85, Bank 2
					      *	86 - 117, Bank 3
					      */

```

ボタン押下時にGPIO_O[0:0]がHレベルになり、それをCore0_nIRQで受け取りFPGAの割込みが発生するようにはなった。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/f60a2b2b-a119-f2af-01ad-241fc0622003.png)

"Push button Interrupt Event"が2回発生するのは未解決。
技術英語 > [How practical] do they say this scheme might be to use iron filings to effect climate change? / put into practical use

@ LOE > May 30, 2003
http://loe.org/shows/shows.html?programID=03-P13-00022
> <font color=red>How practical</font> do they say this scheme might be to use iron filings to effect climate change?

http://ejje.weblio.jp/content/practical
> 実際的な、実践的な、(事を処するのに)現実的な、実務向きの、手際のよい、働きのある、実用一点張りの、散文的な、実用的な、実際に役に立つ

<hr>
関連して思い出したのは

> put into practical use

http://www.linguee.jp/%E8%8B%B1%E8%AA%9E-%E6%97%A5%E6%9C%AC%E8%AA%9E/%E7%BF%BB%E8%A8%B3/put+into+practical+use.html

>  innovations of the operation of the ship that <font color=red>have been put into practical use</font> recently ...
めざせNode.jsライブラリマスター （8）html-enclose

#【ライブラリ説明】
　文字列にタグを付けることができる

#【プログラム】
```js:html-enclose.js
var enclose = require('html-enclose');

var str = "sample string";

// タグ名はなんでもOK
console.log(enclose(str, 'p'));
// <p>sample string</p>
```

#【参考サイト】
　[npm](https://www.npmjs.com/package/html-enclose)
　[github](https://github.com/morishitter/html-enclose)
CakePHPとRailsの遅延ロードの定義は違う件

## CakePHPの場合
* CakePHP2.0からモデルに追加された機能
* モデルの初期化時ではなく、`find`操作が発生する時にアソシエーション先を読み込むSQLが実行される仕組み

## Railsの場合
* ActiveRecordのデフォルトの機能
* `find`した時点ではアソシエーション先は読み込まれず、アソシエーション先の値が必要になった場合に初めてSQLが実行される

## 両者の違い
### CakePHPはfindした時点でアソシエーション先が読み込まれる
* CakePHPでは、デフォルトでは`find`した時点で1次アソシエーション先を全て読み込むSQLを発行する。そのため、めっちゃ`belongs_to`してるモデル多いとかだと処理時間が半端なくかかる
* そのため、CakePHPのfindには`recursive`というプロパティがあり、これに`-1`を指定するとカレントテーブルのみ取得される

### Railsはfindした時点では読み込まれず、値が必要になった時に読み込まれる
* デフォルトがCakePHPの`recursive:-1`の状態になっており、カレントテーブルのみ読み込まれる
* とてもスマートだと思うが、逆に`n+1`問題という別の問題が発生する場合がある

N+1問題 / Eager Loading とは - Rails Webook http://ruby-rails.hatenadiary.com/entry/20141108/1415418367
N+1問題は1+N問題 - Qiita http://qiita.com/hisonl/items/763b9d6d4e90b1606635

* 例えば、prefecture(県)とshop(店)という1:多の関係があったとして、View側で`shop.prefecture.name`というように県名を取得しようとすると、県とのアソシエーションを取得するためのSQL文が店舗数だけ発行される
* 店舗数が100件だったら、最初の全件取得のSQLと合わせて101件(n+1)
* これを解決するには`Eager Loading`という仕組みがあり、`@post = Post.all.includes(:user)`のようにすると、必要なアソシエーション先を指定して先に読み込むことが出来る
* つまり、CakePHPのrecursiveの動作をRailsは明示的に指定して初めて行うということですね。しかもモデル名をシンボルで指定できるとか、さすがRailsはイケてる。
* ちなみにRailsの場合、`where`メソッドを使うとこれは条件をActiveRecord::Relationオブジェクトを返すだけで、値が必要になった時にSQLが実行されることも遅延ロードと呼ぶらしい？(うろ覚え)

## さいごに
* CakePHPはデータが全て配列だから、Viewでアソシエーション先のオブジェクトを取得するとか気のきいたこと出来んのです。全て最初にやっておかないといけない子。
* 最初にn+1問題を聞いた時、CakePHPならループの前に`<?php $prefectureName = $shops[0]['prefecture']; `みたいに書けば解決するかなと考えてしまった。自然に配列脳になってしまってますね。Rails側のコードもたまに読むようにすると、非常に勉強になると思った。
MacでPC内部で鳴っている音楽を聞きながら録音する方法

MacのQuick TimeでFile->New Screen Recordingすると、録画しながら、音も録音できますが、マイクがデフォルト設定ではbuild-inマイクになっており、外の環境音まで拾っちゃいます。

## 解決策1.Sound Flowerをinstallする
- [ここ](https://github.com/mattingalls/Soundflower/releases/)からSound Flowerをinstall
- System Preference -> Sound -> Inputタブのところに Sound Flower(2ch)が増えているのを確認
- System Preference -> Sound -> Outputタブにて、 Sound Flower(2ch)に設定
- QuickTimeの録画マークの右にあるMicrophoneのところをSound Flower(2ch)にする

これで外の環境音は拾わずに、PC内部で鳴ってる音を直接、録音することができるようになります。
だけど、OutputをSound Flower(2ch)にしてしまったので、音が聞こえなくてこまりました。(´；ω；｀)

## 解決策2. Audio Midi SetupでMulti-Output Deviceを追加
- MacのSpotlight Searchなどで、Audio Midi SetupのAppをみつけて起動
- 左下の+ボタンをおす
- Create Multi Output Deviceをおす
- UseのチェックボックスでBuilt-in Outputと、Sound Flower(2ch)を選択
- System Preference -> Soundで、Multi Output Deviceがふえているので、選択

これで、PC内部でなってる音をじぶんで聞きながら、録音ができるようになりました。めでたし、めでたし。
factorio headless server の準備

# factorio について
factorio は 工場を作って、ひたすら自動化していくゲームです。
ゲームの紹介は割愛しますが、プログラマーならハマると思うのでおすすめです。
ゲームクライアント単体でも遊ぶことができますが、友人とオンラインでマルチプレイを楽しむためにサーバーを用意することができます。
このドキュメントでは CentOS7 での手順を記していますので、異なる環境の方は適宜読み替えてください。
また実行は factorio ユーザーを作成して実行するのが良いかと思います。

# ポート開放
factorio はデフォルトで UDPプロトコル で 34197番ポート を利用します。

```
$ sudo firewall-cmd --add-port=34197/udp --permanent
$ sudo firewall-cmd --reload
```

# ゲームの開始
[公式サイト](https://www.factorio.com/)から headless server 版をダウンロードして実行します。

```
// factorio をダウンロード
$ cd ~/
$ wget https://www.factorio.com/get-download/0.12.35/headless/linux64
$ tar zxvf linux64

// ゲームを初期化
$ ~/factorio/bin/x64/factorio --create [ゲーム名]

// ゲームを起動
$ ~/factorio/bin/x64/factorio --start-server [ゲーム名]
```

# ゲームの設定
一度 factorio を起動して終了すると、`/config/config.ini` というファイルが生成されます。
ポート番号の変更や、自動セーブの頻度などが指定できますので、適宜編集するのが良いでしょう。

```
// 設定例

autosave_interval=2  // 自動セーブの頻度
port=34197           // factorioのポート番号
```

# バックグラウンド実行
手軽に行うならば以下の方法でバックグラウンド実行できます。
サーバーの再起動にも対応したい方はデーモン化するのが良いでしょう。

```
// 起動
$ nohup ~/factorio/bin/x64/factorio --start-server [ゲーム名] > /dev/null 2> /dev/null &

// 終了
$ ps aux // factorio を起動したコマンドの PID を探す
$ kill [上で見つけたPIDを入力]
```

# アップデートする
[factorio-updater](https://github.com/narc0tiq/factorio-updater) を利用します。

```
// factorio ディレクトリへ移動
$ cd ~/factorio

// python系のアップデート
$ yum -y install epel-release
$ yum -y install python-pip
$ pip install --upgrade pip

// アップデーターをダウンロード
$ wget https://raw.githubusercontent.com/narc0tiq/factorio-updater/master/update_factorio.py

// 現在インストールされているバージョンを入力
$ python update_factorio.py -p core-linux_headless64 -f 0.12.35 -x

// 現在インストールされているバージョンから順番にアップデートを実行する
$ ~/factorio/bin/x64/factorio --apply-update ~/factorio/tmp/core-linux_headless64-0.12.35-0.12.36-update.zip
```

# 参考記事
- [factorio@jp wiki](http://wikiwiki.jp/factorio/?%A5%DE%A5%EB%A5%C1%A5%D7%A5%EC%A5%A4) に大体のことが書いてあります。
他言語設定 Ubuntu 14.04 / 16.04 への 日本語入力モジュール追加手順

他言語（多くは米語）でインストールしたUbuntu環境への日本語入力モジュール追加方法をメモ。

Ubuntu 16.04 LTS と 14.04.4 LTS で確認しています。 
日本語入力モジュールは ibus-mozc を指定しました。


# Language Support を設定する

GUIで System Settings の Language Support を選択すると、言語サポートのインストールが始まります。
Time Zone で 東京を選択しておれば、この時点で日本語が追加設定されるようです。

![Screenshot 1.png](https://qiita-image-store.s3.amazonaws.com/0/81674/70e3f1a8-b954-c485-f779-bde7a4797459.png)


# ibus-mozc をインストールする

ターミナルで、 ibus-mozc をインストールします。
```
sudo apt-get install ibus-mozc
```

ここで一度 Software Updater をかけて、再起動したほうが良いかもしれません。
 

# Text Entry に ibus-mozc を指定する

System Settings の Text Entry ダイアログボックスで、 Input sources to use: の項目に + をクリックして入力ソースとして、初期状態では選択肢として出現していなかった Japanese (Mozc) を選択、追加します。

![Screenshot 3.png](https://qiita-image-store.s3.amazonaws.com/0/81674/40c4a4f2-bc21-0512-d355-2d5c22d56f86.png)

![Screenshot 5.png](https://qiita-image-store.s3.amazonaws.com/0/81674/05a9eaed-8df3-8446-7b54-9d08b3009231.png)

左下のチェックボックス Show current input source in the menu bar をチェックしておくと、メニューバーに現在の入力メソッドが表示されるので便利です。

![Screenshot 6.png](https://qiita-image-store.s3.amazonaws.com/0/81674/40d28328-38fe-abe8-e277-e01bfc174c5a.png)

入力メソッド切り替えのデフォルトは、スーパーキー（WindowsキーかCommandキー）とスペースバーの同時押下です。


***
**メモ**
*多くで紹介されている、日本語化サーバーへの（明示的な）信頼関係追加の手順は必須ではありません。*
*（明示的な）関連モジュールの追加は、（この例では） ibus-mozc だけです。*
***
トラッキング/ウィジェットタグの作成方法（like GoogleAnalytics, Facebook）

アクセス解析やウィジェットの表示に際して、
埋め込みをさせられるscriptタグについてのロジックがあまり出回っていないので、
作って解説してみました。

以下、サンプルとして載せているコードはほぼGAやFBのコピーです。

## hoge/index.html

```html
<html>
<head>
  <title>TestPage</title>
</head>
<body>
  <script>
    (function(d, s){
      var js, fjs = d.getElementsByTagName(s)[0];
      js = d.createElement(s);
      js.src = "./app.js";
      fjs.parentNode.insertBefore(js, fjs);
    }(document, 'script'));
  </script>
</body>
</html>
```

## hoge/app.js

```js
// お好きな処理をJSでどうぞ
```

こういったものを用意し、
ウェブページオーナーに `script` タグを貼り付けてもらうだけで、
そのページにアクセスしたユーザーに `app.js` の中にあるJSスクリプトを実行させることができます。

`js.src = "./app.js";` の部分には、
任意の呼び出したいスクリプトを指定することができます。
外部サーバーにあるファイルの場合は、
`https://www.google-analytics.com/analytics.js` のように指定することも可能です。
※ 上記URLはGAのもの

呼び出し先のスクリプトなどには `uglify` などを使って難読化をしておくとよいかもしれません。
最近のAndroidについてGoogleの方に聞いたことメモ

某勉強会の懇親会にて、Googleの方とお話したことのメモです。

※ 口頭で聞いたことなので、私が誤った解釈をしている可能性があります。
※ お話を聞いたのは2016年5月末時点です。仕様は今後変わる可能性があります。
※ 「話したことはネットで公開しても良い」とGoogleの方に許可いただいています。

以上をご注意の上、穏やかな気持ちでお読みください。

また、その場で一緒にお話をしたegugueさんも[メモを公開されているので、こちら](https://gist.github.com/egugue/933e63a4b060b610323a34410ed8d7c2)も併せてご確認ください。

---
## マルチウインドウについて
- マルチウィンドウでウインドウ同士を移動するときのライフサイクルはまだ調整中
- マルチウインドウで大きさをずらした時に`onCreate`が呼ばれまくるのはおそらくバグ。これから治る予定
- 縦固定にしているアプリなど今はマルチウィンドウにできないパターンもあるが、最終的には強制でマルチできるようにする予定

## AndroidTVについて
- NexusPlayerがGoogleストアから消えたが、Googleが別にAndroidTVをやめたり縮小したりするわけではない。
- NexusPlayerは元々開発者向けのもので一般ユーザーに向けたものではないので、早かれ遅かれGoogleストアから消すつもりだった。
- これからはソニーブラビアとかにAndroidTVはどんどん入ってくし、携帯電話と違ってテレビ買い替えのサイクルは遅いので、ユーザー数が伸びなくてもあまりまだ気にしなくていい。
- 実装において、スマホの方とパッケージは同じにしてほしい。Youtubeは.tvがついて別アプリになってるが、Youtubeはちょっと特殊なのであまり参考にはしないほうがいい。

## デザインについて
- デザイナーはアプリごとに別々にいて、みんな違う思想を持っている。G+とかYoutubeとかは特殊でデザインガイドライン無視してる。(下タブとか)
- Googleのアプリからマテリアルデザインを参考にするならPlayサービス系のアプリが良い。
- FABも最初は1個だけって決まりだったが縦並びもOKになってる。デザインガイドラインはよく変わるので注意。
- ちなみにGoogleのアプリはFABを縦に並べるために一部C言語で書いてたりする。Javaで頑張ってるアプリもある。

## Instant Appsについて
- 目的はランディングページみたいなもの
- 20MBのAPKをダウンロードするためにはお金かかっちゃうような国で真価を発揮するが、日本で使うのも大いにアリ
- Instant Appsを作るときはAndroid StudioのGradleでモジュール分けして作る。最終的な成果物は完全に別APKになる。
- モジュール分けて実装した上で、本アプリと共通処理の部分はまた別にモジュール化する必要あり。
- 共通モジュールとInstant Apps用モジュールで合計4MBを超えないようにする必要あり。
- その別APKはPlayコンソール上の専用の場所にアップロードするようになる予定。
- webからリンクを踏むと裏でGooglePlayが起動してダウンロード＆インストールが行われ、ユーザーからすると一瞬で画面遷移するように見える
- APKは4MB制限なので、pngでなくvector画像でやることを強く推奨
- どうしても大きい画像があって4MB超えちゃう場合はインストール後に画像ファイルを落としてくるやり方もあり
- 今のところInstant Appsの通信制限は設けてないので、APKを4MBにしても起動後に30MBのデータダウンロードさせるような本末転倒なことできちゃう。(ゲームとかでありえるかも)
- サンプルアプリの提供や実運用開始日はいつになるか未定。早くても今年の末とか。IOではthis yearとかnext yearとかまちまちで言ってた。
- IO2014で「ChromeOSでAndroidアプリが動く」と言ったが実現したのは2年後なので、そうなるケースも可能性としてはある
- まだ詳しく決まってない部分もあるので、とりあえず今はvector対応だけして続報を待て。

## ConstraintLayoutについて
- もともとはGUIビルダーみたいなのほしいよねってなって作った
- RelativeLayoutやLinearLayoutで十分ならそれでもいい
- 一度ConstraintLayoutで作ると簡単には他のレイアウトに移行できないから気をつけよう
- まだこれから変わるかもしれないけど、xmlの構成は変わらないはず

## ライブラリについて
- Googleのアプリでは通信部分はVolleyでなくHttpURLConnectionを基本的にそのまま使ってる、アプリによって呼び方は違う。
- HttpURLConnectionの中にあるokhttpは元のやつからかなり改変している。(いつのokhttpから派生したのかは当人は知らなかった)
- Googleの外向けのアプリではサードパーティ製のライブラリ使わないようにしてる。ライセンスが微妙なため。
- Googleは開発者個人が最高だと思ったライブラリを使っていく社風なので、Googleアプリで使われているライブラリ=Google的にオススメってわけではない。
- IOアプリでVolleyが使われているのはそのせい。
- DataBindingの一部でKotlinが使われてるのもそのせい。
- Spacesとか最近のやつはKotlinかもだしXamarinだったりするかもね(?)

---
現場からは以上です。
S11059-02DT モジュールをラズベリーパイで使用する

# S11059-02DT モジュールをラズベリーパイで使用する

 [Ｉ２Ｃ対応デジタルカラーセンサモジュール　Ｓ１１０５９－０２ＤＴ](http://akizukidenshi.com/catalog/g/gK-08316/) 
をラズベリーパイで使用することになり、使用方法を調べて [python パッケージ](https://github.com/NariseT/CsCntlr) を作成してみました.

- [モジュールのマニュアル](http://akizukidenshi.com/download/ds/akizuki/S11059_module_manual.pdf)

S11059-02DT について、以下を参考にさせていただきました.

- [データシート](https://www.hamamatsu.com/resources/pdf/ssd/s11059-02dt_etc_kpic1082j.pdf)
- [データシート（英語）](https://www.hamamatsu.com/resources/pdf/ssd/s11059-02dt_etc_kpic1082e.pdf)
- [カラーセンサーs11059をArduinoから制御する(I2C)](http://qiita.com/akira-sasaki/items/1cb4238787063aa63a56)

以下の Arduino で使用された例を参考にさせていただきました.

- [カラーセンサーS11059-02DTをArduinoで使用する(準備編)](http://jakalada.hatenablog.com/entry/2016/03/29/005509)
- [S11059-02DTを使う](http://numanohate.hateblo.jp/entry/2015/08/28/111202)

## I2C の有効化と smbus のインストール

ラズパイのコンフィグから I2C を有効にして、
ターミナルから以下のコマンドで、smbus パッケージを導入しました。

```
sudo apt-get install python-smbus
```

## 配線とチェック

以下のようにモジュールとラズベリーパイの配線を行いました.

- モジュール +V  -- ラズパイ 1番ピン（+3.3V）
- モジュール SDA -- ラズパイ 3番ピン（I2C SDA）
- モジュール SCL -- ラズパイ 5番ピン（I2C SCL）
- モジュール GND -- ラズパイ 9番ピン（GND）

`i2cdetect -y 1` とターミナルで入力すると以下が表示されるかチェックしました.

```
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- 2a -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- --
```

## センサーについて

S11059-02DT では、赤、青、緑、赤外の 4つの色の強さをそれぞれ測定できるようでした.

センサーには、2つのモードがあることがわかりました.

- 固定時間モード
- マニュアル設定モード

### 固定時間モード

固定時間モードでは、一色あたり、以下の 4つの積分時間を選択でき、
積分時間を長くするほど、感度が上昇することがわかりました.

```
0: 0.0875 ms
1: 1.4 ms
2: 22.4 ms
3: 179.2 ms
```

### マニュアル設定モード

マニュアル設定モードでは、一度測定すると自動的に待機状態になりますが、
固定時間モードよりも積分時間を長くすることができ、
より高い感度で測定を行うことができるメリットがあるようでした.

積分時間は、一色あたり、以下の 4つの積分時間が選択できるようでした.

```
0: 0.175 ms
1: 2.8 ms
2: 44.8 ms
3: 358.4 ms
```

マニュアルモードでは、更にこれらを何倍するかを選択できるようでした.

```
min: 0
max: 65535
```

### その他

Gain を選択することができ、Low gain と High gain の受光面積比は、
1:10 となっていることがわかりました.

## python パッケージ

これらの設定ができるように [python パッケージ](https://github.com/NariseT/CsCntlr)を作成しました.

### インストール

PyPI に登録をして、pip でインストールできるようにしました.

```
pip install CsCntlr
```

### 使用方法

[データシート](https://www.hamamatsu.com/resources/pdf/ssd/s11059-02dt_etc_kpic1082j.pdf) 4ページ目のプログラム例は、以下のように実行します.
Low gain で、一色あたりの積分時間は、546 ms （全色で、2184 ms）に設定されるはずです.

```
from CsCntlr import *
cs = CsCntlr()
cs.useManualSettingMode()
cs.cntlr.auto(gain='low', man_tint=3120, tint=0)
```

[データシート](https://www.hamamatsu.com/resources/pdf/ssd/s11059-02dt_etc_kpic1082j.pdf) 5ページ目のプログラム例は、以下のように実行します.
High gain で、一色あたりの積分時間は、1.4 ms （全色で、5.6 ms）に設定されるはずです.

```
from CsCntlr import *
cs = CsCntlr()
cs.useFixedPeriodMode()
cs.cntlr.auto(gain='high', tint=1)
```

センサーをコントロールするプログラムを書くのは初めてのことだったので、
何かしらプログラムにバグがありそうな気がしますが、
ビット演算の方法などを色々と調べて作成したので、公開してみました.
Docker環境内でeclipseを走らせる(noVNC)

はじめに
==========
DNNのライブラリなどunixで走らせたいライブラリを用いる際は，私の場合，ubuntuのデスクトップorサーバに（windows pcから）sshで繋いで環境構築したdockerのコンテナを走らせて開発していました．プログラムを走らせるだけであれば問題ないのですが，デバッグ等をやりたいとなると少し不便でした．データの前処理など計算ライブラリを使用しない処理はwindowsで実装し，残りをvimなどで実装していましたが，dockerでvncサーバを走らせることでGUIアプリケーションを動かす方法を知ったので使ってみました．

前提
==========

サーバ:

* ubuntu/centOS
* docker/nvidia-dockerの環境あり

クライアント:

* windows

要望:

* eclipse+pydev（などのIDE）で開発したい，結果を直接ビジュアライズ(matplotlibなど)したい
* tensorflow/chiner/caffeなどのライブラリを走らせたい(windowsには入れづらいライブラリ)
* GPUを使いたい（cuda）

Dockerfile
==========

``dorowu/ubuntu-desktop-lxde-vnc``のDockerfileを参考にさせていただきました．([gitHub](https://github.com/fcwu/docker-ubuntu-vnc-desktop))

cudaへの対応
----------
上記のdorowuさんのDockerfileを参考にさせていだきますが，cudaを使用したいのでベースイメージを変更します．幸いdorowuさんはubuntuをベースイメージに使っていますので，nvidia/cuda に変更するだけで動きました．

eclipseのインストール
----------
eclipseはダウンロードして展開するだけでいいので，Dockerfileに以下の記述を追加しました．

```dockerfile:eclipse
ADD http://***/eclipse-***.tar.gz /tmp
RUN tar xavf /tmp/eclipse-* -C /opt/
RUN ln -s /opt/eclipse/eclipse /usr/bin
```

ターミナルから起動してやります（スタートメニュー的なところに追加してないので）．

javaのインストール
----------

eclipseを走らせるためにはjavaが必要です．とくにpydevに関して，java8が入っていないとインストールが正常に完了しても使えない(メニュー等に表示されない)という問題が発生します．とりあえずcracleのjava8を入れました．

```dockerfile:java_install
RUN apt-add-repository ppa:webupd8team/java && apt-get update
# license
RUN echo debconf shared/accepted-oracle-license-v1-1 select true | debconf-set-selections
RUN echo debconf shared/accepted-oracle-license-v1-1 seen true | debconf-set-selections

RUN apt-get install -y --force-yes oracle-java8-installer
RUN apt-get install -y --force-yes oracle-java8-set-default
```

eclipseのプラグイン
----------
例えばpydevを入れるとして，本当はDockerfileに記述したいところですが...
とりあえず，GUIで操作してimageにコミットしました．まぁGUIは開発中に使うだけなのでいいかなと．いい方法があれば教えてください...
eclipseをインストールしたディレクトリをホスト側と共有orホスト側からコピーしてイメージ構築すればいいかもしれません．

開発環境の導入
----------
上で作成したイメージを継承して各ライブラリを導入します．ベースにnvidia/cudaを使っていたイメージ([これ](http://qiita.com/ymfj/items/6d2658240aaa02663453)とか)であればFROMを今回のイメージに変更するだけで良いはずです．


vncの接続
----------
今回参考にさせていただいたイメージではnoVNCを導入しています．これはブラウザ(HTML5)からvncできるアプリケーションです．とりあえずこれで試します．クライアントソフトを使って接続もできるはずですが，ブラウザでも割と快適でした．
Ansible で AWS EC2 にコマンドを発行してみる

Ansible を使って AWS の EC2 にコマンドを発行してみます。

使用した Ansible のバージョンは 2.0.2.0 です。

この例では yum update を実行します。

まず、適当な場所にフォルダーを作り、cd しましょう。

```
$ mkdir ~/yumupdatetoec2
$ cd ~/yumupdatetoec2
```

次にプライベートキーを使用して SSH ログインができるように ssh_config を編集します。
ここではプライベートキーファイルが、~/.ssh/myprivatekey.pem にあるものとします。

```:~/yumupdatetoec2/ssh_config
Host aws
  User ec2-user
  HostName ec2-xxxxxxxxxxxx.amazonaws.com
  IdentityFile ~/.ssh/myprivatekey.pem
  StrictHostKeyChecking no
  UserKnownHostsFile /dev/null
```

次のコマンドを実行して設定が正しいかどうか調べてみます。正しければ EC2 にログインします。コマンド末尾の aws は ssh_config の先頭行にあるものです。

```
$ ssh -F ssh_config aws
Warning: Permanently added 'ec2-xxxxxxxxxxxx.amazonaws.com,xxx.xxx.xxx.xxx' (ECDSA) to the list of known hosts.
Last login: Fri Jun 10 10:42:34 2016 from xxx.xxx.xxx.xxx

       __|  __|_  )
       _|  (     /   Amazon Linux AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-ami/yyyy.mm-release-notes/
[ec2-user@ip-xxx-xxx-xxx-xxx ~]$
```

ログインができたことを確認したら exit しましょう。

```
[ec2-user@ip-xxx-xxx-xxx-xxx ~]$ exit
```

次にインベントリーファイルを作成します。インベントリーファイルは ansible が接続するホストを列挙するファイルです。ファイル中にある aws は ssh_config の先頭行にあるものです。

```~/yumupdatetoec2/inventory.ini
[mysection]
aws
```

Ansible が接続する SSH のコマンドライン引数を指定します。ここでは先ほど指定した ssh_config を指定しています。

```~/yumupdatetoec2/ansible.cfg
[ssh_connection]
ssh_args = -F ssh_config
```

プレイブックを編集します。先頭行の mysection は inventory.ini にあるものです。

```~/yumupdatetoec2/yumupdate.yml
- hosts: mysection
  tasks:
    - name: Update Yum
      yum: name=* state=latest
```

さぁコマンドを実行して yum update を実行しましょう。

```
$ ansible-playbook ./yumupdate.yml -i inventory.ini
```

実行結果が以下のように、ok のところが 1 以上で、changed、unreachabe、failed が 0 であれば成功です。

```
PLAY RECAP *********************************************************************
aws                        : ok=2    changed=0    unreachable=0    failed=0 
```
postfix でメールが届かない status=bounced (unknown user: "hoge")

# 問題
自分のサイトに設置しているメールフォームで自分宛てのメールが届かない（自分以外には届く）。
ログ（/var/log/maillog）を見ると status=bounced (unknown user: "hoge") などと書いてある。

# 間違った解決法
エラーメッセージで検索してみると/etc/postfix/main.cfの inet_interfaces の設定値を変えると良いと書いてあるブログがあるが、**これは関係ない**。

# ただしい解決法
問題は同設定ファイル中の mydestination の値。送信先メールのドメインが自サーバーのドメイン（\$myhostname か \$mydomain）と一致するとサーバー内部のユーザー宛てに送信しようとしてしまう。このサーバーでは "hoge" というユーザーは存在しなかったので unknown user: "hoge" と出たというわけ。
ローカルでメール配信することはないので
```mydestination = $myhostname, localhost.$mydomain, localhost```
↓
```mydestination = ```
としてpostfixをrestartで解決。
CDH5をUbuntuにインストール　その2(MRv1 SingleNode 編)

#1.前回
前回で環境を一旦作成したので
http://qiita.com/yuki_saito_/items/36e80def1a4b0b0d4c71

続きを実施していこうと思う。今回はjava(1.8.0_91. 2016/6/101時点の最新)のインストールと、CDH5 MRv1のインストール、virtualboxのスナップショットを取得するまで。

本家
http://www.cloudera.com/documentation/enterprise/5-4-x/topics/installation.html

#2.手順
##2.1 javaのインストール
    sudo apt-get install oracle-java8-installer

java -versionでインストールを確認

##2.2 CDH5のインストール
###2.2.1 パッケージの取得
    wget https://archive.cloudera.com/cdh5/one-click-install/trusty/amd64/cdh5-repository_1.0_all.deb

###2.2.2 リポジトリに登録
    curl -s https://archive.cloudera.com/cdh5/ubuntu/lucid/amd64/cdh/archive.key | sudo apt-key add -

###2.2.3 リポジトリのアップデート & インストール
    sudo apt-get update 
    sudo apt-get install hadoop-0.20-conf-pseudo

###2.2.4 ちょいと確認
    dpkg -L hadoop-0.20-conf-pseudo

パッケージの一覧が出てくればOK

###2.2.5  HDFSのフォーマットと開始＆初期化
    sudo -u hdfs hdfs namenode -format
    #HDFS開始
    for x in `cd /etc/init.d ; ls hadoop-hdfs-*` ; do sudo service $x start ; done
    #初期化
    sudo /usr/lib/hadoop/libexec/init-hdfs.sh

####  2.2.6 MRの開始
    for x in `cd /etc/init.d ; ls hadoop-0.20-mapreduce-*` ; do sudo service $x start ; done
Jobを司るMRを開始する

###2.2.7 MR用のユーザディレクトリの作成
    sudo -u hdfs hadoop fs -mkdir -p /user/test
    sudo -u hdfs hadoop fs -chown test /user/test
 
###2.2.8 HDFS用のユーザ作成
    sudo -u hdfs hadoop fs -mkdir -p /user/test2
    sudo -u hdfs hadoop fs -chown test2 /user/test2

###2.2.9 入力データの作成
    hadoop fs -mkdir input
    touch test.log
    echo "BE a Human . BE a Cool Bee Boon" > test.log
    hadoop fs -put test.log input
    ※　hadoop fs -ls inputでファイルの一覧が見れます

###2.2.10 実行
    /usr/bin/hadoop jar /usr/lib/hadoop-0.20-mapreduce/hadoop-examples.jar wordcount input output
※再度実行するときは、output内のファイルを削除してからもしくはoutputフォルダを変更してから出ないとエラーになる。

###2.2.11 確認
    hadoop fs -ls output
上記コマンドで見ると「part-00000」とかいうファイルがあるので以下のコマンドで参照
    hadoop fs -cat output/part-00000
そうすると、単語の数と単語が対になって表示される

ちなみに/etc/hadoopがホーム

### 2.3 インストールを終わって
インストールはかなり簡単に完了。次はYARNあたりを攻めたい。
今回はこの状態のスナップショットをVirtualBoxで取得して終了。
WindowからOracleにアクセスするとsetQueryTimeoutが効かない！？

Windows上からJDBCドライバを介してRedHat上のOracleにアクセスする際に、`java.sql.Statement#setQueryTimeout(int)`が効かない事象にぶち当たりました・・・ :sweat: 指定した時間を超えてもクエリーが返ってこない :scream:

# 解決方法

いきなりですが、解決方法を紹介しましょう。この事象は、JVMのシステムプロパティとして以下のプロパティを追加することで解決することができます。

```text
-Doracle.net.disableOob=true
```

検証はしていませんが、「[OracleのJDBCドライバのJavaDoc](http://docs.oracle.com/database/121/JAJDB/oracle/jdbc/OracleConnection.html#CONNECTION_PROPERTY_THIN_NET_DISABLE_OUT_OF_BAND_BREAK)」に定数定義があるので、JDBCのコネクションを作成する際に指定するプロパティでも指定できるのかもしれません。
この解決方法は、（調べた範囲では）Oracleの公式ドキュメント上には明記されておらず、ぐるぐるググっていたら、「[Oracle SQL Developerの掲示板のスレッド](https://community.oracle.com/thread/2366779)」がヒットし、この解決方法にたどり着きました。

さらにOut Of Band(OOB)でOracleのサイトを検索していたら、「Oracle Database Net Services Administrator's Guide」の中に「[Disable Out-of-Band Break](http://docs.oracle.com/database/121/NETAG/profile.htm#NETAG1585)」というパラメータの説明がありました。説明を読むと・・「中断メッセージ(キャンセル指示)を「緊急データ」として送るか否かを制御するパラメータ」みたいです。

# Out of Band(OOB) Breaksって？

正直なところ私もちゃんと理解できていないのですが・・・ :sweat_smile: コマンドであれば「Ctrl + C」などを使ったクエリのキャンセル、JDBCであれば`setQueryTimeout`で指定した時間を経過したあとの`cancel`処理の際などに、Out of Band Breaks「緊急データ([URGパケット](http://www.wdic.org/w/WDIC/URG%E3%83%91%E3%82%B1%E3%83%83%E3%83%88))」としてOracleに通知される仕組みになっているみたいです。これは、先ほど紹介したJavaDocの定数説明にも記載があり、11gから採用されたようです。

# クエリーがキャンセルされなかった理由は？

何かしらの理由でお使いのプラットフォームがOut of Bandをサポートしていない場合は、Out of Band Breaks方式でクエリーをキャンセルすることができないようです。そのようなプラットフォームでは、In Band方式を利用することでキャンセルすることができます。（Windowsはデフォ？だとOut of Bandがサポートされてないようです・・・）

# まとめ

単なるJava開発者にとっては、ネットワークは奥が深すぎる・・・ :sweat_smile: とりあえず、解決方法がみつかってよかった・・・。
【誰得】nyagosからLotus Notes経由でメール送信

最近NotesのCOMコンポーネントがあることを知り、
またnyagosが外部DLLなしでOLEをサポートしたこともあり
仕事を~~さぼって~~休み時間を利用して書いてみました。

```lua:.nyagos
nyagos.alias.send_mail_via_notes = function(args)
    local server = "YOUR/SERVER"
    local dbfile = "YOUR/DBFILE.nsf"
    local sess = nyagos.create_object("Lotus.NotesSession")
    sess:Initialize()
    local db = sess:GetDatabase(server, dbfile, false)
    local doc = db:CreateDocument()
    doc:ReplaceItemValue("SendTo", args[1])
    doc:ReplaceItemValue("Subject", args[2])
    local body = doc:CreateRichTextItem("Body")
    body:AppendText(args[3])
    body:AddNewLine(2)
    body:AppendText("from nyagos via Lotus Notes")
    doc:Send(false)
end
```

###### 使い方

```bash
$ send_mail_via_notes your_mail_address@your.server.com "foobar" "hogefuga"
```
生産性を上げる。プログラマによる個人的健康管理術。


# いきつけの食事処を開拓する

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/4305b7f3-8392-0d28-7961-4dc74ef3c5f2.png)

定食屋でチキン南蛮定食を食べたり。
ラーメン屋で野菜炒めやレバニラ炒めを食べると、次の日の体調がまったく違う。肩こりもマシになる気がする。

味に飽きないように、いくつか「行きつけの店」を見つけると良い。
ちゃんとした夕飯は、コンディションへの投資だと考える。

栄養的には、ファミレスも良いかもしれない。(サイゼリアの「ほうれん草のソテー」とか)

# 伊藤園の野菜ジュース

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/23ee180f-2561-79ce-7c67-3a9c2b8422d3.png)

Amazon で 24本セットを自宅に買い込む。

一気に飲むより、何回かに分けた方が良いと思う。
自分の場合、朝に1本、夜に1本が日課。

同僚に勧めたところ「体調が良くなった」という報告を受けた。

伊藤園は個人的な好み。

# 朝昼抜き

自分は基本的に、夕飯しか食べない。
そうすると昼も眠くならないし、心地良く働ける。

ただし体質による部分だと思うので、いちばん自分に合った食事法を見つけると良いと思う。

# 疲れる前に休む

出来れば。
人間は労働時間じゃなくて「根を詰めた時間」によって疲労すると思う。

つまり、リラックスしていれば、労働時間は長くてもそれほど疲れない。


# Apple Music


![image](https://qiita-image-store.s3.amazonaws.com/0/89618/b217faae-e760-9c6c-233d-8ac169787af5.png)

Apple Music は月1000円ぐらいで音楽聴き放題のサービス。
Apple じゃなくても、他にも色々な聴き放題サービスがある。


これで自分の好きな音楽を「シャッフル再生」で聴きながら働くと、テンションは上がるし、自分を「フロー」に近づけることが出来ていると思う。

なぜシャッフル再生なのかというと、好きな曲が巡ってきた時の「偶然感」がすごく良いから。

「音楽を聴きながらだと集中できない」という人もいると思うが、自分の場合はむしろ音楽が無い方が集中力が落ちる。

「体内感覚」が心地良いと、疲れにくい。


# マッサージ枕

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/04a340a0-d1c1-e523-de02-64cd623487ef.png)

これを自宅にひとつ、会社にひとつ持っている。
びっくりするぐらい肩こりに効く。

これを昼休み、会社のソファーに寝転びながら使っている。(どうか禁止されませんように)

1万円ぐらい。値段に対するコスパは最高。

やや壊れやすいので保証書は取っておくと良い。
自分が使っているのは「ドクターエア」のマッサージ枕。（他は考えられない）



# フットマッサージャー

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/f4aa1003-bd08-35d1-0455-1d7a6f604578.png)

これを会社のデスクの下に入れて使っている。
体の一部分が心地良いと、集中していてもほとんど疲れない。

昼休みとか、会社に残る時とか、他の人が周りにいないときに使っている。

これもオススメは「フジ医療器」というメーカーのもの。
5万円ぐらいだが、心地良く仕事するためなら高いとは思わない。

# マッサージチェア

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/b098a3ae-7f40-4a17-b7fd-d841153e4038.png)

自宅にマッサージチェアがある。
こいつに乗りながら iPad で技術書をひたすら読んでいる。

体を癒しながらの読書はほとんど疲れない。

最上位機種なので35万円ぐらいしたが、奮発して買った。

しかし10年使うと考えると、1日あたり100円程度。
これで生産性が上がって、（給与体系によっては）給与も上がると思えば、安いものだ。

ちなみに買う前に、ヨドバシカメラの体験コーナーに5回も通って試した。
個人的には「フジ医療器」が断然オススメだが、大きな買い物なので、自分の体にどれが合うか体験してみると良い。








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
slackに当日の自分の作業分のgit logを流す

# どんな記事か？
その日に、どのくらいコミットして、変更を加えたのかを知りたくなったので、slackに流すようにしてみました。

# どうやったか？

色んなところで使えるように、incoming webhookにリクエストするシェルスクリプトをつくって、それをcronで実行する形をとりました。


```daily-git-report.sh
#!/bin/sh

HOOK_URL=""
slack_channel=""

REPO=""
AUTHOR=""

cd ${REPO}
COMMIT_LOG=$(git shortlog --all --no-merges --author="${AUTHOR}"  --since="midnight")

LINES=$(git log --all --numstat --pretty="%H" --author="${AUTHOR}" --since="midnight" | awk 'NF==3 {plus+=$1; minus+=$2} END {printf("+%d, -%d\n", plus, minus)}')

MESSAGE="${COMMIT_LOG} \\r\\n [insertions, deletions]: \\r\\n ${LINES}"

PAYLOAD="payload={\"channel\":\"${slack_channel}\" , \"text\":\"${MESSAGE}\"}"

curl -X POST --data-urlencode "${PAYLOAD}" ${HOOK_URL}
```

これで、次のようなのが、slackに投稿されます。`git shortlog`でコミット数とコミットメッセージの1行目を、[こちらの記事](http://koyamay.hatenablog.com/entry/2014/10/06/022654)をもとに、追加・削除した行数を算出したのを出しています。

```
author(10)
  commit message 1
  commit message 2
  ...
  commit message 10
[insertions, deletions]
+XXX -YYY

```

あとはcronで、

`30 17 * * 1-5 /path/to/daily-git-report.sh > /dev/null`　

などと、平日の定時のタイミングで実行させれば完了です。

コミットメッセージの書式は最低限のルールは守らないと、綺麗に表示されないので気をつけましょう。[こちら](http://qiita.com/itosho/items/9565c6ad2ffc24c09364)や[Gitのコミットメッセージの書き方](http://postd.cc/how-to-write-a-git-commit-message/)　を参考にしました。

# 何が期待できるか

開発チームのチャンネルに投稿することで、

- 自分の進捗や作業内容を報告
- 人目にさらすことで、コミットメッセージをわかりやすくしようとする
- コミット粒度にも意識するようになる

と、なるのではないかと。とりあえず、自分だけでまずやってみます。

# 参考サイト

https://www.generation.ne.jp/topics/gitessagetoslack/

http://stackoverflow.com/questions/5113425/how-to-make-git-log-show-all-of-todays-commits

http://qiita.com/take4s5i/items/15d8648405f4e7ea3039

http://qiita.com/takashibagura/items/6d03cdd9ab2f88df828d

http://koyamay.hatenablog.com/entry/2014/10/06/022654

https://gist.github.com/eyecatchup/3fb7ef0c0cbdb72412fc

https://gist.github.com/lexqt/2720263

http://qiita.com/rubytomato@github/items/6558bfdb37d982891c09

http://dqn.sakusakutto.jp/cron-maker.html

http://qiita.com/itosho/items/9565c6ad2ffc24c09364
テーブルの結合について色々(3つ結合、whereの場所、最新・最大のものを取得)

・まず基本をこのサイトで押さえる
http://www.dbonline.jp/mysql/select/index15.html

・3つのテーブルを結合する場合
select * from テーブル1 left join テーブル2 using(list_id) left join テーブル3 using(list_id)

・whereの場所
select * from テーブル1 left join テーブル2 using(list_id) left join テーブル3 using(list_id) where 条件

・指定したカラムの値が最新や最大のものを取得する場合
select * from テーブル1 left join テーブル2 using(list_id) left join テーブル3 using(list_id) where 条件 order by カラム名 desc limit 1;
(順番に並べて一つだけ取得する)
AWS Summit Tokyo 2016 / IoTハンズオンの資料公開と反省会

公開資料
------------------------------------------

> OpenBlocks IoT BX1 (以下 BX1) を使用し、富士通コンポーネント社製 温度・加速度センサーデバイス “FWM8BLZ02” のデータを “SORACOM Air” の回線で “AWS IoT” に送信し、Amazon Elasticsearch Service(以下 Amazon ES)上のKibanaでグラフ化するところまでを解説します

* テキスト
  * [オンライン HTML](http://iot-hands-on-powered-by-openblocks-soracom-aws.readthedocs.io/ja/latest/)
  * [PDF](https://s3-ap-northeast-1.amazonaws.com/ma2shita/IoT-Hands-On-OpenBlocks-IoT-SORACOM-AWS_1.0.1.pdf) (5.6MB)
  * [ePub](http://readthedocs.org/projects/iot-hands-on-powered-by-openblocks-soracom-aws/downloads/epub/latest/) (12.3MB)

文中でリファレンスしている資料等

* 自習室: AWS IoTのThing Shadowでパトライトを制御する
  * [![AWS IoTのThing Shadowでパトライトを制御](http://img.youtube.com/vi/B7TAs97aNd8/0.jpg)](http://www.youtube.com/watch?v=B7TAs97aNd8)
  * AWS IoTへ状態を報告する [reporter.rb](https://gist.github.com/ma2shita/905a4d4a8a58377736154f79e769806f)
  * AWS IoTの通知をデバイスに伝える [commander.rb](https://gist.github.com/ma2shita/197bc9b328bd21b20083dbc6fe14ff9b)
  * [MQTT over WebsocketによるAWS IoTへの接続のコア部分](https://gist.github.com/ma2shita/905971e4af2a0b9f73add70b75ee9fc3)


AWS Summit Tokyo 2016お疲れ様でした！
-----------------------------------

2016年 6/1〜6/3 の３日間で行われた [AWS Summit Tokyo 2016](http://www.awssummit.tokyo/)

10,000人以上が集まるというオバケイベントなのですが、そんな中でAWS ioTを使用した [IoTハンズオンのセッション](http://www.awssummit.tokyo/devcon/iot.html) を持たせていただくことができました

![IMG_4831.JPG](https://qiita-image-store.s3.amazonaws.com/0/22754/733b50ee-fb82-6370-0f81-9793b134399c.jpeg)

そちらの資料の公開とともに、 反省会の記録です


反省会
-----

* 20名/回程度なら2名で対応できるかな
* ってか、この分量、100分じゃムリだって (完走者が１名いらっしゃったようで！)
* Wi-Fi混線問題はOpenBlocks IoTのWi-Fi周波数を5GHzにすることで回避できたけど、BLEが混線(?)
* SIMを挿すのって(アダプタの話も含めて)難しいですよね
* ハンズオンにタブレットで参加するという強者が！
* USB給電って機種によってマチマチなんですね。[仕様化された](https://ja.wikipedia.org/wiki/%E3%83%A6%E3%83%8B%E3%83%90%E3%83%BC%E3%82%B5%E3%83%AB%E3%83%BB%E3%82%B7%E3%83%AA%E3%82%A2%E3%83%AB%E3%83%BB%E3%83%90%E3%82%B9#USB.E7.B5.A6.E9.9B.BB)のって最近だったのか！
* Wi-Fi 5GHzにしかつながらないPCって存在したのか？！

こんなところでした

特に初日に参加された方、BLEセンサーがつながらなくて本当にごめんなさい m(__)m

あとがき
-------

リベンジの機会を是非ください
Interop Tokyo 2016出展振り返り

Web Music Developers JPというコミュニティの一員としてInterop Tokyo 2016に出展させていただいた。
3日間のイベント出展なんてはじめての経験で、いろいろ得ること気づきがあったので次回の自分のために振り返りを記録しておく。

だしたのは↓でした。(見て頂いた方ありがとうございます！)
![缶たたき機](http://dfm.lrv.jp/temp/interop2016/flyer.png)


# K:

- 使うカラーを先に決めてアプリやパネル等のデザインを同時に進めた。これにより作品イメージの統一感が取れて良かった。
- 中華街ロケは成功。キャラクターの採用で作品イメージをより強化できた。
- 時間できるだけ都合つけて展示会場に行けたのは良かった。（ただし今回はたまたま運に助けられた）
- パネルA3で大きく作ったのは良かった。イーゼルではなくマジックアーム型スマホスタンドを採用したのもはじめての試みだったけど、机の表面を占有せずに大きなパネルが設置出来たので良かった。

# P:
- ハード不具合が多すぎた。結合試験が不十分だった。
- 操作説明的なものがなく、せっかく見に来てくれた人が目の前で何をしたらいいかわからない、といった感じになってしまっていた。少なくともタッチセンサーの缶には厚紙などで「←ここ触ってね」みたいな感じには書いておいた方が良かったし、パトランプを回すためのmidiコンも同様。
- ネットワーク接続失敗してても画面上分かりにくかった。認証付きネットワークを想定した設計ができていなかった。
- アプリがミラーで並行してテストできる環境に対応していなかった。
- アプリの状態が外部からわからなかった
- 輸送中に缶がつぶれた。箱が小さすぎた。箱は到着後崩壊した
- 缶の音もう少し大きくて良かった
- Chromeと比べてOperaの方がCOU負荷軽かった。しかしこれに気づいたの展示前日。十分な検証が行えなかった。Chromeだけで開発を進めたのは失敗だった
- 送るときはヤマトだったけど現場は佐川だったので発送時同梱した返送用伝票が使えなかった
- プログラム書きこみ用標準BのUSBケーブルが足りなかったので不具合調査の都度展示を止めることになってしまった。
- 何を見てもらうか。パネルはA3、周りには多くのデバイスが机の上に所狭しな状態で正直MBPは埋もれていた。あまり画面に注目してもらえなかった

# T:
- 全部繋いだ状態での試験を十分実施しておく
- 複数のブラウザで検証しながら開発する
- タッチセンサー基板は静電気の影響を受けて停止する現象が発生とした思われる。アース処理を強化する
- パトランプはパトランプ電源とArduino電源を完全に分離する、パトランプ内部のモーターノイズ軽減のためのコンデンサを追加する
- mi:muz:exprのusbラインpulldown1.5kは誤り。4.7kに変更する
- 音量Upのため抵抗値を少し下げる。3.3Ωは大きすぎる。1.8と2.2、0Ωの3種類のケーブルを用意しておく
- WebSocketサーバーは接続中クライアントの状態を外部から取得できるように機能追加、コンポーネント化しておく
- 展示用以外に標準USBのケーブルを別途用意しておく
- 箱は大き目なもので送る
- 画面も見てもらいたいならパネルや周りに設置するデバイスに負けない大きさのディスプレイが必要。24インチサイズ程度のディスプレイあるいは小型プロジェクターを用意しつつPCの設置方法を工夫する
Qiita | ユーザー名を変更したあと、同じユーザー名を再取得できるか試してみた

# 結論

できる。

( 2016年6月現在 )

# 検証

### 設定ページから、これを。

![image](https://qiita-image-store.s3.amazonaws.com/0/90607/21ec42c0-ecaa-3f7b-7df0-57f709452e27.png)

### こうじゃ。

![image](https://qiita-image-store.s3.amazonaws.com/0/90607/67ddc029-067e-e391-e70e-0d6b346495ca.png)

### ユーザー名が変わった。

![image](https://qiita-image-store.s3.amazonaws.com/0/90607/296534d7-492e-3bee-2833-622f6fdcd6bc.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/90607/6ace26e2-2b55-1b53-7f10-8471b34c52d5.png)

### URLも変わった。

![image](https://qiita-image-store.s3.amazonaws.com/0/90607/b1169128-f646-9aa3-c3da-8960c18177cf.png)

### 元のページは Not Found になった。

![image](https://qiita-image-store.s3.amazonaws.com/0/90607/69f7253b-c230-88c7-994d-c690d92b1aba.png)

### もういちど設定ページで、ユーザー名を戻してみる。

![image](https://qiita-image-store.s3.amazonaws.com/0/90607/45cf3a4a-f1c4-199b-4bad-6b7d27d21389.png)

### 戻った。

![image](https://qiita-image-store.s3.amazonaws.com/0/90607/bb873bb2-70cf-9c03-ab52-43d80a83e55c.png)





<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# メンター受付


https://menta.work/user/5694

<!-- Update From Qiita API -->
Kubuntu 16.04 インストール後に画面が表示されないバグ

先日、開発環境としてkubuntu16.04をVirtualBoxにインストールしたんだけれど、
以下の様なエラーメッセージを出して画面が真っ暗になってしまうバグに遭遇したのでメモ


```:エラーメッセージ
All shell packages missing. This is an installation issue, please contact your distribution
```


(画面としては[こんな感じ](https://launchpadlibrarian.net/254770132/VirtualBox_Kubuntu_20_04_2016_15_45_21.jpg))

同様の問題は[launchpadでも議論されていて](https://bugs.launchpad.net/ubuntu/+source/kubuntu-meta/+bug/1571564)、英語以外の言語でインストールした場合に起こるらしい。
私の場合は以下のパッケージを導入することで解決した。


```.sh:Terminal
$ sudo add-apt-repository -y ppa:kubuntu-ppa/staging-misc
$ sudo apt-get install kde-l10n-ja
$ sudo apt-get install plasma-desktop
```

plasma-desktopが入らないなんて、結構大きなバグな気がするけど、
リリースから2ヶ月経とうとしてるのに治らないのはなにか理由があるのだろうか・・・
FTPサーバにファイルを転送する

#概要
PHPでFTPサーバにファイルを転送する基本をまとめておく。

#基本サンプル
```
<?php

$ftpServer   = 'XXXXX.com'; 
$ftpUserName = 'XXXXX';
$ftpUserPass = 'XXXXX';

$localFile  = '/Users/Test/test.txt';　//転送したいファイルを書く
$remoteFile = '/home/XXXXX/Test/test.txt'; //転送先での名前を指定する

// 接続を確立する
$conId = ftp_connect($ftpServer);

// ユーザー名とパスワードでログインする
$loginResult = ftp_login($conId, $ftpUserName, $ftpUserPass);

// ファイルをアップロードする
if (ftp_put($conId, $remoteFile, $localFile, FTP_ASCII)) {
 echo "successfully uploaded $localFile\n";
} else {
 echo "There was a problem while uploading $localFile\n";
}

// 接続を閉じる
ftp_close($conId);
?>
```
Chrome DevTools の Enable paint flashing と Animation controls を使ってバグ調査

以下のような機能を持つアプリケーションがあるとする。

- ヘッダーのアイコンをクリックすると「運営者からのお知らせ」を Bootstrap の popover で開く（クリックのたびに open/close がトグルする）
- 未読の「お知らせ」がある場合は、ログイン後に popover を自動で開く

しかし機能のテストをしたところ、バグっていたとする。

- 未読の「お知らせ」があるのに、 popover が自動で開かない
- ヘッダーのアイコンをクリックしても popover を閉じられない（一瞬消えて、またすぐ開いてしまう）

こういうバグの調査をするのに Chrome DevTools の Enable paint flashing と Animation controls を使ってみた。

## 期待する動作

![demo-1.gif](https://qiita-image-store.s3.amazonaws.com/0/339/751c077d-dade-0198-7719-740a9e63a723.gif)

## バグってる状態

![demo-2.gif](https://qiita-image-store.s3.amazonaws.com/0/339/83c2930f-dbab-a654-1f2b-220c1b4639cd.gif)

## Chrome DevTools の Enable paint flashing と Animation controls を有効にした状態

![demo-3](https://cloud.githubusercontent.com/assets/10515/15965291/da186e44-2f57-11e6-9168-da809bd3d4a8.gif)

## 得られた知見と考察

- ページロード後に popover の領域が DOM rendering されてるっぽいことから、 popover が自動で開く機能が壊れたのではなく、 popover を自動で開く機能がダブって実行されてしまい、開いてすぐ閉じられてしまうため、「自動で開かない」ように見えているのだろう、と思われる。ここまでわかれば popover を開く処理の呼び出し元を順に調べていって、ダブって実行されうるコードパスを突き止めればよい。
  - なお、実際に直したバグは、 Backbone.View インスタンスが `listenTo(this.collection, 'sync', 'showPopover')` などとしてる状態で collection.fetch() を二回呼び出していた、というものだった
- クリック時に popover の領域が再 rendering されてるっぽいことから、 click イベントハンドラの中で popover を閉じる処理が実行されてしまっているのだろう、と思われる。ここまでわかれば click イベントハンドラ関数を調べればよい。
  - 実際に直したバグは、「popover の外の領域をクリックしたとき popover を閉じる」という振る舞いを実現するために `document` に対して popover を閉じる click イベントハンドラを追加していたが、そのイベントハンドラの中で popover の open/close トグル処理をになっているアイコンの　DOM 要素自身をクリックした場合が考慮されていなかったため、 `$(document).click` で一回、 `$(element).click` で一回の合計二回 popover をトグルする処理が呼ばれていた、というものだった

## How to use it

<img width="728" alt="スクリーンショット 2016-06-10 21.50.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/339/12c62ba6-f056-40cf-1f80-cc01a03a721d.png">
<img width="727" alt="スクリーンショット 2016-06-10 21.50.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/339/98276b88-0bf5-afa2-eac9-6cac98d64430.png">
<img width="726" alt="スクリーンショット 2016-06-10 21.50.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/339/8a58a276-5211-9e35-9c95-caba9dfe5449.png">
【メモ・超初心者向け】CocosCreatorでWebSocketに接続する

CocosCreatorでWebSocketに接続出来るか検証しました。
使用したのはHTML5で標準でついたWebSocketです。

tnakagawa様の[いまさらHTML5 （WebSocket編）](http://qiita.com/tnakagawa/items/f7c764d044ba56d9e0fd)を参考にしています。

```ruby:
cc.Class({
    extends: cc.Component,

    properties: {
        // foo: {
        //    default: null,
        //    url: cc.Texture2D,  // optional, default is typeof default
        //    serializable: true, // optional, default is true
        //    visible: true,      // optional, default is true
        //    displayName: 'Foo', // optional
        //    readonly: false,    // optional, default is false
        // },
        // ...
    },

    // use this for initialization
    onLoad: function () {
        var uri = "ws://から始まるURIを記述";
        var webSocket = null;
        webSocket = new WebSocket(uri);
        webSocket.onopen = onOpen;
        webSocket.onmessage = onMessage;
        webSocket.onerror = onError;
        webSocket.onclose = onClose;
          
        // 接続イベント
        function onOpen(event) {
            console.log("接続しました。");
            var mes = "送信テスト";
            webSocket.send(mes);
        }

        // メッセージ受信イベント
        function onMessage(event) {
            console.log("受信しました");
            // ソケットを閉じる
            webSocket.close();
        }  
        
        // エラーイベント
        function onError(event) {
            console.log("エラーが発生しました。");
        }
        
        // 切断イベント
        function onClose(event) {
            console.log("切断しました。3秒後に再接続します。(" + event.code + ")");
            webSocket = null;
        }        
          
    },
});
```

接続した結果です。
コンソールログに表示しています。
![結果.png](https://qiita-image-store.s3.amazonaws.com/0/104377/98affb49-1a12-c6ed-dd92-59c9de88ba48.png)

CROSの問題もありそうですが、ひとまず接続、送受信に成功しました。
注：Cocos Creator ver1.1.0で検証。今後やり方が変わる可能性が極めて高いです。
「Sketchy Talks #1 CSSについて学ぶ」のメモ

我が社で初めて開催した勉強会 [Sketchy Talks #1 CSSについて学ぶ](http://connpass.com/event/32342/ "Sketchy Talks #1 CSSについて学ぶ")のメモです。箇条書きでごめんなさい。

#CSSアニメーションはじめました

- jQueryアニメーションは重い
- 結局CSS3とVelocity.jsで書いた
- jQueryのアニメーションのところを置き換えるだけだからそんなに学習コストはかからない
- Velocity.jsはjQueryと互換性があるので動かないブラウザでは勝手に対応してくれる

#CSS filter

- 案件ではちょっと使いにくいかも
- 色相回転は角度でやる
- 透過PNGだとbox-shadowは全体に影が、drop-shadowだと中の文字とか
- グレースケールとセピアスケールは一緒に使わないほうがいいらしい
- スクロールをしたらぼやけてるのがなくなったとか

#CSS設計とスタイルガイド /小畑タカユキさん

- スタイルガイドを作ろう
- 製作者たちのスキルを均一にできる
- mailchimpのシンプルなスタイルガイド
- 新しい人が入ってきた時にあるといいかも
- スタイルガイドをgulpで自動化して作ってみる
- FontNoteやAigisを触ってみた
- FontNote、記法を覚える必要がある
- Aigisより見やすそう
- スタイルガイド結構重要かも

#案件規模✖︎CSS拡張

- CSS拡張メタ言語を使うタイミングは？
- 案件規模と導入可否には法則があるはず
- 案件規模と学習コストのバランス
- 学習コストは担当者次第
- Sass導入は案件規模ではなく制作体制であるべき
- 技術的な試みに理解がある人の数
- 制作チームの把握
- ジョブ多すぎ
- デザイナーとエンジニアの比率
- CSSスプライト（？）
- まずはクローズドな社内をオープンにする
- 導入側もちゃんと説明しないと

#ミニマムなCSSフレームワーク

- Skelton
- scssも用意されている
- 最初にフレームワークを使うのおすすめ
- ヤフーのやつはメンテされてないっぽい
- ノーマライズとしてスケルトン使うと良いかも
- インブラウザデザインにいいかも
- ブラウザ上でデザインをする
- 大きいフレームワークも良いけど規模によるとちょっと扱いづらいかも、なのでミニマムなやつがいいんじゃないかなー

#詳細度

- 詳細度が高いと上書きできなくなったりする
- 詳細度グラフ
- 右上がりになるといいらしい
- セレクタの中でインポートすると詳細度がゼロにならない
- BEMが大事
- ユニークな名前にするならBEMにせざるを得ない
- DOMとCSSの構造を一緒にしない

#感想

ラフな感じだったのでワイワイすごくたのしかったです。
たぶん発表が苦手な人でも参加しやすい勉強会なのでぜひともみなさんご参加おまちしております〜。
iTunesConnect の TestFlight (外部テスト) で審査をスキップする方法

## TL;DR

同一バージョンであれば2回目以降は審査が行われないので、一度審査に出しておく。

> 注 内部テストは使ってないのでよく分かりません。

## TestFlight ?

皆さん TestFlight の機能は使っているでしょうか？

iTunesConnect の TestFlight (外部テスト) の機能は 2000人までテスターを登録してアプリを配布できる非常に便利な機能です。

テスターからメールアドレスを教えていただくだけで簡単に登録できて 100 デバイス制限も関係ないので大量のテスターに配布することができます。

さらに、 AppStore の申請に出すものと同一のバイナリを配布できるためテスターに配布したものと AppStore に公開したもののビルドが微妙に違うという問題も起こりません(下図参照)。

![image](https://qiita-image-store.s3.amazonaws.com/0/17704/92a1dfd7-3b03-1e2d-0439-520c8b30af3f.png)

## ちょっと不便な所

便利な TestFlight ですがテスターに配布する前に審査が発生します。

通常1日程度で審査が終わるのですが、 Fabric などのようにアップロードして即配布というサービスに比べるとちょっとまどろっこしいです。

しかしこの審査をスキップする方法があります。

## 審査をスキップ

TestFlight の審査は同一バージョンでは最初の1回だけ行われます。

例えば v3.0.0 (ビルド番号1) のアプリで一度 TestFlight の審査を行っていれば v3.0.0 (ビルド番号2)では審査が行われず即配布可能になります。

これを利用して

1. とりあえず iTunesConnect にバイナリをアップロードして TestFlight の審査に提出する
2. 審査通過したら配布せずにそのまま放置...
3. テスターに配布したいビルドを iTunesConnect にアップロード
4. 3 のバイナリは即配布可能なのでそのままテスターに配布する

という流れで好きなときにテスターに配布できます。

1 のアップロードはナイトリービルドなどで行っておけばそんなに手間じゃないと思います。

僕はアプリを公開したら次のバージョンを iTunesConnect で作って、ナイトリービルドで新しいビルドがアップロードされたらそれを TestFlight の審査に提出するっていう流れで作業してます。

## 自動化

- iTunesConnect へのアップロードは [fastlane](https://fastlane.tools/)を使っています
  - マジで便利です
- テスターの管理は [fastlane の pilot](https://github.com/fastlane/fastlane/tree/master/pilot) を使うと便利っぽいです
  - 数回程度しか使ってないのでそんなにノウハウ溜まっていません
- 特定のビルドを TestFlight の審査に提出するところがまだ自動化できていないので何かいい方法があれば知りたいです