OmniAICreator/Qiita-1.07M huggingface dataset:
Aceエディタ で日本語入力時のちらつきを解消する

#Ace Editor で日本語入力時のちらつきを解消する

:warning: **2018/5 更新 解決方法が新しくなっています。2018年リリース以降(1.3x?) のAceエディタの場合は以下のリンク先をご確認ください。（42993_さん感謝）**

[Ace EditorでL SEPという文字が出る（anopara）](https://anopara.net/2018/01/19/ace-editor%E3%81%A7l-sep%E3%81%A8%E3%81%84%E3%81%86%E6%96%87%E5%AD%97%E3%81%8C%E5%87%BA%E3%82%8B/)

これから導入予定の方、MSが嫌いではない方は[monaco-editor](https://microsoft.github.io/monaco-editor/)もおすすめです。練習がてら導入した記事がこちら。
[JSON同士の比較はYAMLが良い - WEBツール(JS)で「JSON⇒YAML」変換時に完全なエスケープ戻しを目指す](https://qiita.com/RAWSEQ/items/c2ef5423bf93b37d1dae)

Ace 1.2.6時点のバージョンは以下の流れで解決できる（はずです・・）

## **Ace Editorとは**
言わずと知れたブラウザ上で動作するテキストエディタです。Cloud9というクラウド開発環境向けに作られたエディタなので、とっても高機能です。
詳細は: https://ace.c9.io/

## **日本語入力における諸問題**
海外で作られているだけあり、日本語などで利用されるIME(入力補助機能)は例外視されがちです。環境によっては一部変換操作において、Enterで確定しない限り未確定文字が繰り返し出現したり、実装に踏み切ることができなかったケースも少なくないでしょう。
最近（私が確認した時点で）はクリティカルな問題は解消されていますが、まだ、日本語を扱う場合にストレスになる問題が残っていました。

## **日本語入力時のちらつきとは**
IMEモードでキー入力する度に左へカクカクする現象。四角文字が出たり消えたりする事によりちらついているように見えます。
IME制御上は問題ないですが、日本語入力をする上でストレスとなる現象です。

![chiratsuki.gif](https://qiita-image-store.s3.amazonaws.com/0/65983/53271693-32a6-f875-529f-1fc07119b15f.gif)

以前はフォントの指定によって発生する事象でしたが、ブラウザのバージョンアップによって顕著になっているようです。

**試行、再現が確認できる環境**

- Ace 1.2.6 (当時最新ビルド,https://github.com/ajaxorg/ace-builds)
- Windows10 (標準のIME)
- Chrome, Firefox

## **事象と対策**
四角文字の正体は[SOH(x01)]Start Of Headingという制御コードが機種依存文字扱いで表示されている事。

![chira.png](https://qiita-image-store.s3.amazonaws.com/0/65983/916d76a3-bbb1-02e6-d94e-2727b9d10a9f.png)

該当の制御コードにあたる文字のみを収録したウェブフォント(.woff)を作成、もちろんx01は横幅0にしています。

![font_ime_jp.png](https://qiita-image-store.s3.amazonaws.com/0/65983/e64ecaee-87e6-a048-ccb0-e64e169ac95d.png)

CSS定義でフォント定義及び上書きを行う事により対応。

```css:ace_ime_jp_font.css
  /* IME Fix */
  @font-face {
    font-family: 'ime_jp_rp';
    src: url('path/to/ime_jp_rp.woff') format('woff');
  }
  .ace_editor > .ace_text-input {
	padding-top: 1px;
	padding-left: 1px;
	letter-spacing: 1px;
	font-family: ime_jp_rp, Monaco, Menlo, "Ubuntu Mono", Consolas, source-code-pro, monospace;
  }
```

※CSSは適宜調整となります。
<b>結果</b>→ライブデモはこちら( http://grepreptips.ltside.com/ )


![nkai2.gif](https://qiita-image-store.s3.amazonaws.com/0/65983/cbff03fc-13e7-4a88-ef5f-a29e3a999f0e.gif)


# まとめ・ソースコード

① 以下のフォントファイルをダウンロード、任意の公開領域に配置
http://grepreptips.ltside.com/ime_jp_rp.woff
（ライセンスはApacheLicense(2.0)に準拠します）

② CSSでフォントを定義。

```css:ace_ime_jp_font.css
  /* IME Fix */
  @font-face {
    font-family: 'ime_jp_rp';
    src: url('path/to/ime_jp_rp.woff') format('woff');
  }
  .ace_editor > .ace_text-input {
	padding-top: 1px;
	padding-left: 1px;
	letter-spacing: 1px;
	font-family: ime_jp_rp, Monaco, Menlo, "Ubuntu Mono", Consolas, source-code-pro, monospace;
  }
```
「path/to/ime_jp_rp.woff」は①で指定された位置を指定。

※CSSは適宜調整となります。
<b>結果</b>→ライブデモはこちら( http://grepreptips.ltside.com/ )

ご指摘や、これ以外に現れる問題等あれば教えてください。（解決するかどうかは別ですが・・）
Intellij で正規表現をする時にグループ化した文字列の置換をする

## 概要
Intellij などの JetBrains 社のツールを使っている時に特定の文字列を残して置換する

## 例
```
<img src="img/logo_c.png">
```

これを、

```
<%= image_tag 'img/logo_c.png' %>
```

こう置き換えたい場合、

<img width="873" alt="スクリーンショット 2017-04-10 19.01.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/20733/08d5df97-657a-27f0-c3af-5df676d6bc05.png">

検索対象に

```
<img src="([0-9a-zA-Z\.\/_-]+)">
```

置換文字列に

```
<%= image_tag '$1' %>
```
で置き換えられる。

## 結果
<img width="887" alt="スクリーンショット 2017-04-10 19.01.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/20733/30e7ca2d-d1a8-29be-19f8-76adfa5de040.png">

## 詳細
1. ```Command + r``` で置換窓を出す
2. ```Regex``` にチェックを入れて、正規表現を使えるようにする
3. そのまま残したい部分は ```()``` を使ってグループ化する
4. グループ化した文字列は、 1つめのカッコであれば、 ```$1``` で置き換えられる
5. ```$0``` は検索対象の文字列全て

正規表現使いつつ残したい文字列を置換文字列で使いたい時にいつも忘れるのでメモ。
[Unity]HierarchyのGameObjectを非表示にする

#ヒエラルキービューからGameObjectを非表示にすることができます
この機能を使うことで、デザイナーさんやアニメータさんなど、エンジニア以外の人が作業する時に触ってほしくないオブジェクトを隠蔽して、効率的に作業を分担することができます。

## HideInHierarchyフラグ
gameObject.hideFlags の HideFlags.HideInHierarchy を入れることでヒエラルキービューからゲームオブジェクトを非表示にすることが可能となります。

```csharp:qiita.cs
gameObject.hideFlags = HideFlags.HideInHierarchy;
```

## エディタ上(シーン編集中)で動作させる
エディタ上で動作するようにクラス属性として`[ExecuteInEditMode]`属性を付与することで、シーン編集中でもゲームオブジェクトを非表示することの恩恵が受けられます。
非表示にしたいオブジェクトに下記のスクリプトを貼り付ければOKです。
`#if UNITY_EDITOR` ~ `#endif`で囲えば、リリースビルドでは無視されます。

```sharp:qiita.cs
#if UNITY_EDITOR
using UnityEditor;
using UnityEngine;

[ExecuteInEditMode]
public class HideObject : MonoBehaviour
{
    void Start (){
        gameObject.hideFlags = HideFlags.HideInHierarchy;
    }
}
#endif
```

## 問題
シーンに非表示のオブジェクトがあることを知らないメンバーがシーンをいじる時、簡単に表示させる方法を用意しておかないと混乱を招きますので、チームメンバーには共有しておきましょう。
`gameObject.hideFlags = HideFlags.HideInHierarchy;`をifで囲ってフラグをどこかで管理しておけばとりあえず十分かもしれません。

## 参考
こちらの方がより汎用的です↓
[HierarchyのGameObjectを非表示にする](http://tsubakit1.hateblo.jp/entry/20140423/1398264610)
コミットメッセージを修正する

## gitでコミットメッセージ書き間違えてコミットしてしまった時の対処法

あっ
コミットメッセージでミスったのにコミットしてもうた。。。

という時にコミットメッセージを変更する方法です。

・コミットメッセージのみを編集

`git commit --amend -m "新しいコミットメッセージ"`

これでコミットメッセージが新しいコミットメッセージに変わります。

・コミットメッセージ以外の情報も編集

`git commit --amend`

Please enter the commit message for your changes. Lines starting
with '#' will be ignored, and an empty message aborts the commit.
On branch ブランチ名
Changes to be committed:

みたいなメッセージとともにVimエディタが立ち上がります。

Vimエディタで編集したい方は後者でやってみるのもいいかもしれません。

pushまでやっちまったぜ。。という場合は[こちら](http://qiita.com/ykawakami/items/71b462057a8d714d7382)をご参照ください。
WodpressのDB接続エラー

どうしてもWodpressのDB接続エラーがでる

絶対接続設定間違ってないのにモキーって時は
PHPの設定がおかしかったりする

MySQLの設定のときにデフォから変えたりするとなる

```
#php -i | grep socket
mysql.default_socket => /usr/local/mysql/var/mysql.sock => /usr/local/mysql/var/mysql.sock
mysqli.default_socket => /usr/local/mysql/var/mysql.sock => /usr/local/mysql/var/mysql.sock
pdo_mysql.default_socket => /usr/local/mysql/var/mysql.sock => /usr/local/mysql/var/mysql.sock
```

シンボリックリンクはるかphp.ini書き換えるか
Dockerを使って日本語対応のcasperjsを手軽に利用する

#概要
Dockerを使ってcasperJsを使えるようにする。同様のDocker Imageはdocker+casperJsの検索で見つかりますが、バージョンが古かったり日本語対応してなかったりしたのでそれに対応したものを作りました。

#すぐ使いたい場合
作成済みのイメージをDocker Hubに登録済みなので、途中経過抜きですぐ使いたいのであれば以下ですぐ使えるようにセットアップできます。

- 導入+バージョン確認

```
docker run -d --name mycasperjs-daemon -v `pwd`:/home/casperjs  --restart always gsagawa/casperjs
docker exec mycasperjs-daemon casperjs --version
```

#ビルドして実行する場合
出来上がる内容は上記と同じですが、中身を確認したかったりカスタマイズしたい場合はこちらでやってください。

- Dockerfileを作成する

``` 

FROM debian:jessie

ENV PHANTOMJS_VERSION=phantomjs-2.1.1-linux-x86_64

RUN apt-get update -y
RUN apt-get install -y libfreetype6-dev libfontconfig1-dev wget bzip2 unzip fontconfig git python

#phantomjsのインストール
RUN wget --no-check-certificate https://bitbucket.org/ariya/phantomjs/downloads/$PHANTOMJS_VERSION.tar.bz2
RUN tar xvf ${PHANTOMJS_VERSION}.tar.bz2
RUN mv $PHANTOMJS_VERSION/bin/phantomjs /usr/local/bin/
RUN rm -rf phantom*

#フォントのインストール
RUN wget http://dl.ipafont.ipa.go.jp/IPAexfont/IPAexfont00301.zip
RUN unzip IPAexfont00301.zip
RUN mkdir -p /usr/share/fonts/ipa
RUN cp IPAexfont00301/*.ttf /usr/share/fonts/ipa
RUN fc-cache -fv 

#casperjsのインストール
WORKDIR /root
RUN git clone https://github.com/n1k0/casperjs.git
RUN mv casperjs /opt/
RUN ln -sf /opt/casperjs/bin/casperjs /usr/local/bin/casperjs
RUN mkdir /home/casperjs

WORKDIR /home/casperjs

#casperjsをデーモンとして起動させるための処理
CMD tail -f /dev/null
```

- コマンドラインからビルド、コンテナ化

```
docker build -t mycasperjs .
docker run -d --name mycasperjs-daemon -v `pwd`:/home/casperjs  --restart always mycasperjs
docker exec mycasperjs-daemon casperjs --version
```

#動作確認

以下のように実行させて、キャプチャーが取れればOK

```
docker exec mycasperjs-daemon casperjs test.js 
```

```test.js
var casper = require('casper').create();
casper.userAgent("Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:51.0) Gecko/20100101 Firefox/51.0");

casper.start("http://<<キャプチャーしたいサイト>>/", function(response) {
});
casper.viewport(1410, 690).then(function(){
    this.capture('capture.png');
});
casper.run();
```
AngularFire2のAPI速習



[AngularFire2](https://github.com/angular/angularfire2) のAPIがまとまってなかったので、まとめます。



![afire-logo.png](https://qiita-image-store.s3.amazonaws.com/0/34573/0474e20d-b28f-7b7f-effb-b5807f4dca62.png "afire-logo.png")

Firebase自体については、 [Firebaseの始め方](http://qiita.com/kohashi/items/43ea22f61ade45972881) を御覧ください。 
Angular2については、 色々記事あるのでそちらを。


### インストール

```
npm install firebase angularfire2 --save
```

### 基本の構成

```javascript:typescript
import {Component} from '@angular/core';
import {AngularFire, FirebaseListObservable} from 'angularfire2';

@Component({
  selector: 'project-name-app'
})
export class MyApp {
  constructor(af: AngularFire) {
    
    // 下記「FirebaseList」を見てください
    let itemList = af.database.list('/items');
    
    // 下記「FirebaseObject」を見てください
    let itemObject = af.database.object('/items/myObject');
  }
}
```




### FirebaseList

正確には `FirebaseListObservable<any[]>` で、Observableのメソッド(subscribeとか)も使える

```javascript:typescript

// `/items` データへの参照を取る。
// すでに`/items`があってもなくても、同じ動作をする
let itemList = af.database.list('/items');


// 自動生成の一意キー(`-`で始まる文字列)で対象パス以下にデータを作成
// 下記実行では `items/-KhLz7l_a6PnNyE_W_JV/` 以下にデータが作成される
itemList.push({text: '自動生成キーだよ', ammount: 3});


// 指定名で対象パス以下にデータを作成。すでに存在した場合は上書き
// 下記実行では `items/MyGreatItem` 以下にデータが作成される
itemList.update('MyGreatItem', {text: 'マイ・グレート・アイテム、という名前を指定したよ', ammount: 3});
itemList.update('MyGreatItem', {descriptoin: '説明追加だよ'}); // `description` 項が追加される
itemList.update('MyGreatItem', {ammount: 199}); // `ammount` 項だけが更新される。ほかはそのまま。


// 指定したキーのデータを削除する
itemList.remove('MyGreatItem');


// データの取得
itemList.subScribe(data => {
  console.log(data); // 初回取得時＆データ更新されたときに呼ばれる
})


// ネイティブ実装への参照。firebase(js)での `firebase.database().ref('/items')` と同じ。
// AngularFireの世界から出たいときなどに
itemList.$ref; 
```



### FirebaseObject

正確には `FirebaseObjectObservable<any>` で、Observableのメソッド(subscribeとか)も使える。

```javascript:typescript
// `/items/myItem`への参照を取る
let itemObj = af.database.object('/items/myItem');


// データの新規作成, or 上書き
// 当該名でデータが存在すれば上書き、
itemObj.set({text: '私のアイテムです', ammount: 4});


// 部分更新。存在しない場合は新規作成
itemObj.update({ammount: 299});


// 自分自身を削除
itemObj.remove();


itemList.$ref; // ネイティブへの参照。firebase(js)での `firebase.database().ref('/items')` と同じ。
```

### update と setの違い

update と set の違いは上書きか更新か。
set は内部的にremoveを呼んでる(のと同じ動き)



```javascript:typescript

// 当該データが存在しない場合は動きが同じ

itemObj.update({text: '私のアイテムです', ammount: 3});
// {text: '私のアイテムです', ammount: 3}

itemObj.set({text: '私のアイテムです', ammount: 4});
// {text: '私のアイテムです', ammount: 4}


// 当該データが既に存在する場合は…

itemObj.update({ammount: 299}); 
// {text: '私のアイテムです', ammount: 299} 
// 想定通り


itemObj.set({ammount: 399}); 
// {ammount: 399} 
// remove() されて update() された！


```
MySQL multi

ほとんど使わないけど



##確認



作業するサーバにいま存在しているMｙSQLの確認

```sh:
#ps awufx | grep mysql
```


※この辺を控えておく

```sh:
--datadir
--socket
--port
--server-id
--log-error
--pid-file
--innodb_buffer_pool_size
--slow_query_log_file
```

##手順

1.バックアップとっとく

```sh:
# cp -p /etc/my.cnf /etc/my.cnf.yyyymmdd
```

1. my.cnfを編集



```lang:my.cnf
[mysqld_multi]　←追加
mysqld=/usr/local/mysql/bin/mysqld_safe　←移動
mysqladmin=/usr/local/mysql/bin/mysqladmin　←移動

[mysqld1]
datadir=/usr/local/mysql/data
socket=/tmp/mysql.sock
port=3306
server-id = 「任意」
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
innodb_buffer_pool_size = 「再設定」
slow_query_log_file = /var/log/mysql-slow.log
mysqld=mysqld

[mysqld2]
datadir=/usr/local/mysql/data2
socket=/tmp/mysql2.sock
port=3307
server-id= 「任意」
log-error=/var/log/mysqld2.log
pid-file=/var/run/mysqld/mysqld2.pid
innodb_buffer_pool_size = 「再設定」
slow_query_log_file = /var/log/mysql-slow2.log
mysqld=mysqld
```

[mysqld_multi][mysqld1][mysqld2]→追加
この下のパラメータで、既存の[mysqld]配下にあるものは
[mysqld1]と[mysqld2]配下に設定を振り分ける


innodb_buffer_pool_sizeは[mysqld1]と[mysqld2]で併せて
実メモリの６割程度になるようにした。

３．新しく立てるMySQLのデータディレクトリは分けられていないといけないので
なければつくる

```sh:
# mkdir /usr/local/mysql/data2
# chown mysql. /usr/local/mysql/data2/　
# /usr/local/mysql/scripts/mysql_install_db --datadir=/usr/local/mysql/data2/ --user=mysql
```

mysql_install_dbで怒られたら--basedir=でMySQLのインストールディレクトリを指定
chownする時と--userはMySQLの起動ユーザで



４．mysqld_multiでは/etc/init.d/配下の起動スクリプトは使わない

```sh:
# service mysqld stop
# chkconfig mysqld off
```



５．mysqld_multi起動

```sh:
# mysqld_multi start
```

以下のようになっていればOKです。

```sh:
# mysqld_multi report

Reporting MySQL servers
MySQL server from group: mysqld1 is running
MySQL server from group: mysqld2 is running
```



６．初期設定

mysql_secure_installationは新しいポートのMySQLを見に行ってくれない。
手動で設定するかシンボリックリンクで何とかする。
手動の場合は

```
# mysql -u root -h 127.0.0.1 -P 3307
mysql>UPDATE mysql.user SET Password=PASSWORD('ぱすわーど') WHERE User='root';
mysql>DELETE FROM mysql.user WHERE User='';
mysql>DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1', '::1');
mysql>DROP DATABASE test;
mysql>DELETE FROM mysql.db WHERE Db='test' OR Db='test\\_%';
mysql>FLUSH PRIVILEGES;
```



７．mysqld_multi停止用ユーザ作成(新旧２つのMySQLへ)

```sh:
GRANT SHUTDOWN ON *.* TO `mysqld_multi`@`localhost` IDENTIFIED BY "ぱすわーど" WITH GRANT OPTION;
```
※127.0.0.1にしたらダメだった。localhostで。


８．停止用ユーザの情報を記載します。

```lang:my.cnf
[mysqld_multi]

mysqld=/usr/local/mysql/bin/mysqld_safe
mysqladmin=/usr/local/mysql/bin/mysqladmin
user=mysqld_multi
password=ぱすわーど
```

９．以下のコマンドで停止できることを確認します。

```sh:
# mysqld_multi stop
```
以下のようになっていればOKです。

```sh:
# mysqld_multi report

Reporting MySQL servers
MySQL server from group: mysqld1 is not running
MySQL server from group: mysqld2 is not running
```



## mysqld_multiで使うコマンド

**全て起動**

```sh:
`mysqld_multi start`
```

**一部起動**

```sh:
`mysqld_multi start 1`
`mysqld_multi start 2`
```
[mysqld1] = 1
[mysqld2] = 2



**全て停止**

```sh:
`mysqld_multi stop`
```


**一部停止**

```sh:
`mysqld_multi stop 1`
`mysqld_multi stop 2`
```

[mysqld1] = 1
[mysqld2] = 2
AWS Lambdaを利用してChatWorkにメッセージ送信

# 環境
## AWS Lambda

* Node.js 6.10
* Lambdaの実行権限だけつけて、No VPC環境で実行(単にめんどくさかった。)

## ChatWorkでやること
* 自分のAPIトークンの取得
* 投稿するチャンネルの用意(ルームIDの取得)
 * http://developer.chatwork.com/ja/endpoint_rooms.html#GET-rooms

*この辺はChatWorkのドキュメント見てください・・・*

# 実装

外部モジュールは使わない。

```javascript:index.handler
var https = require ('https');
exports.handler = function(event, context) {
    var body = 'body=' + event.message;
    
	var options = {
		host: 'api.chatwork.com',
		path: '/v2/rooms/'+ event.room_id +'/messages',
		method: 'POST',
		headers: {
		    'X-ChatWorkToken': process.env.TOKEN,
			'Content-Type': 'application/x-www-form-urlencoded',
			'Content-Length': body.length
		}
	};
    
    
    var req = https.request(options, function (res) {
		res.on('data', function (chunk) {
			// console.log('--- on  ' + (+new Date() * 0.0001) + ' ---');
			// console.log(chunk.toString());
		}).on('error', function (e) {
			// console.log('--- err ' + (+new Date() * 0.0001) + ' ---');
			// console.log('ERROR:' + e.stack);
		});
	});
	
	// console.log('--- req ' + (+new Date() * 0.0001) + ' ---');
	req.write(body);

	// console.log('--- end ' + (+new Date() * 0.0001) + ' ---');
	req.end();
};

```

## event
```json:event
{
    "room_id" : "{ChatWorkの送信対象のチャンネル}",
    "message" : "投稿するメッセージ"
}
```

## Lambda環境変数
* TOKEN
 * 自分のAPIキー 


## TODO
* API Gateway経由してWebhookをする。
* Jenkinsから通知
* GitHubから通知
* JIRAから通知
* 日時レポート的なやつの発行

## 経緯
SlackからChatWorkを使わざるをえなくなったためWebhookを移行するために泣く泣く調べてる最中なう。
ということで、サーバレスにしようということでAWS Lambdaで環境構築メモを残しておけば誰かの役に立つかもしれないと(いないか。。。)

## 参考
[Tattin's App History - node.jsでhttpのPOSTリクエスト](http://memo.tattin.com/nodejs/node-js%E3%81%A7http%E3%81%AEpost%E3%83%AA%E3%82%AF%E3%82%A8%E3%82%B9%E3%83%88/182/)
アップロードされたファイルにウイルスチェックを行う

LAMP環境において、ユーザがアップロードしたファイルにウイルスチェックを施す方法です。
PHP5.6 + Cent OS 6で検証しています。

# サーバーにアンチウイルスソフトをインストールする

今回は、Linux用のオープンソースのアンチウイルスソフトである「[Clam AntiVirus](http://www.clamav.net/)」を使用します。

参考 :
インストール方法は[こちらの記事を参照しました](https://centossrv.com/clamav.shtml)。
AWSのEC2インスタンスで稼働するAmazon Linuxでは、[設定方法が異なります](http://dev.classmethod.jp/cloud/aws/install-clamav-to-amazon-linux/)。

```
[root@centos ~]# yum install clamd

# ウイルス定義ファイル更新設定ファイル編集
[root@centos ~]# vi /etc/freshclam.conf

# Send the RELOAD command to clamd.
# Default: no
#NotifyClamd /path/to/clamd.conf
NotifyClamd /etc/clamd.conf
↑　追加（ウイルス定義ファイル更新をclamdに通知する）

# ウイルス定義ファイル最新化
[root@centos ~]# freshclam
```

# アップロードされたファイルを検証する

```php
$command = 'clamscan '.$filePath;

$out = '';
$int = -1;
exec($command, $out, $int);

if ($int == 0) {
    // ウイルスが検知されなかった場合

} else {
    // ウイルスが検知された場合、または実行に失敗した場合
    throw new \RuntimeException(implode(PHP_EOL, $out));
}
```

# ウイルスのテストファイル

ウイルススキャンが有効に機能しているかどうかを検証するためには、[EICARテストファイル](http://www.eicar.org/85-0-Download.html)と呼ばれる、実際には被害をもたらさないダミーのウイルスファイルを利用します。

1. [EICARテストファイルのダウンロードページ](http://www.eicar.org/85-0-Download.html)にアクセスします。
2. 任意のパターンのテストファイルをダウンロードし、実際に作成したプログラムにアップロードします。
プロジェクトマネジメントのアンチパターン

# アンチパターンについて　おことわり
以下は私が参加した幾つかの失敗プロジェクトに基づいたアンチパターンの覚書です。
実際には同様のケースでも成功する場合もあるかもしれません。１エンジニアの単なる経験則なのでご了承ください。

なお、増える場合があります。

## パターン１：上司がマネジメントを行っている
通常業務時の直属の上司がマネージャとしてプロジェクトマネジメントを実施している場合、通常業務のマネジメントとPJのマネジメントを混同します。
PJ実施中にもかかわらず、上司は通常業務の割り込み案件を差し込む余地があることを自ずとわかってしまうため、担当者の状況によらず作業の割り振りを行ってしまいます。
またPJメンバとの力量関係も自ずと生じますので、重大事項が報告されなかったり、隠されたります。

## パターン２：PJ開始前に水面下での決定事項がある
PJメンバー以外のステークホルダー間のみでPJ開始前に物事が決定していると、大抵の場合PJメンバーに共有されず、忘れ去られた頃にひょっこりと顔を出して遅延の原因となります。そして往々にして重要な決定事項であったりするのでプロジェクトは破綻します。

## パターン３：WF開発プロセスで開始時に非決定な案件がある
非決定な事項は大抵の場合重大事項で、決定するのはテスト時です。

## パターン４：見積もり工数に＋αのバッファを取った
バッファは使い切られ、見積もりエラーが発生します。

## パターン５：リスク管理表に「納期遅延の場合」
リスクマネジメントできていません。納期遅延の原因となる事項の洗い出しが必要です。

## パターン６：PJメンバーが３名のみ
すなわち、課長、主任、担当。パターン１と同様ですが、ステークホルダーの洗い出しもできていませんし、この場合すべての作業が担当者１人にのしかかる事になります。
悪い例えですが、担当が事故にあった時点でこのプロジェクトは失敗します。

## パターン７：PJメンバーが他PJにも参加している
マネージャ間の連携が必要となる場面ですが、大抵の場合連携できず、担当者のキャパシティ以上の作業を任せてしまい、結果見積もりエラーとなります。他部署との連合PJをしている場合によく発生します。

## パターン８：手の空いている担当をPJメンバーにした
マネージャが上司の場合よく発生します。納期、品質を考慮 対 個人の力量を考慮せずアサインすると見積もりエラー発生の原因となります。

## パターン9：PJの振り返りが行われない
プロジェクト開始後の振り返りが行われないと、各事案に対してなぜ成功した・失敗したかに関するノウハウは次回プロジェクト発起時には忘れ去られています。
しかし、ノウハウはあると思い込んだまま、前回プロジェクトよりも低い工数で見積もった次回プロジェクトを開始してしまうため、予想よりも多くの工数を同一問題で消費してしまい、結果見積もりエラーが発生します。
プロジェクトの成果物は、ソフトウェアだけではないのです。

## パターン１０：パターン１０は欠番である


# 終わりに
失敗するプロジェクトは開始前から独特の『ニオイ』がします。
『ニオイ』のもとを指摘できるかどうかでアサインされたメンバーの生死が決定します。
コマンドのメモ

  


指定のディレクトリ配下にあるファイルの中から、特定の文字列を含むファイルを探す  

```bash
[root@hoge ~]#find /home -type f -print | xargs grep 'fuga'  
```


対象ファイルが上書き編集(バックアップなし)  

```bash
# sed -i -e "s/AAA/ZZZ/g" hoge.txt  
```

対象ファイルが上書き編集(バックアップあり)  
※-iとダブルクォーテーションの間は詰める。  

```bash
# sed -i".org" -e "s/AAA/ZZZ/g" huga.txt  
```

日付名のディレクトリとかファイルとか作る  

```bash
mkdir /home/work/`date +%Y%m%d`  
touch /home/work/`date +%Y%m%d`.txt
```

zabbixでログ検知テストとかするときの  

```bash
echo `date +'%Y/%m/%d %H:%M:%S'` \[Error\]  test log  >>  /var/log/messages  
```

カーネルとOSバージョンあげたくないときの

```bash
# yum update --exclude=kernel* --exclude=centos*
```
deviseをインストールする

deviseを使用するためには、Gemのインストールに加えて **devise専用のコマンドを利用して設定ファイルを作成する必要があります。**
##deviseとは##
deviseは、ログイン機能を簡単に作成することができるGemです。ログイン機能をGem無しで実装するのは非常に大変です。しかし、このGemを使うことで比較的簡単に実装することができます。


##インストール##
①Gemfileの最後の行に下記の記述を追記

```Gemfile
gem 'devise'
```

②bundle installを実行

```ターミナル
$ pwd
  #現在のディレクトリが~/projects/pictweetであることを確認
  $ bundle install
  #bundle install の実行
```

③ローカルサーバーを再起動

```ターミナル
$ rails s
```

④コマンドを利用してdeviseの設定ファイルを作成

```ターミナル
 $ rails g devise:install
```

⑤コマンドを利用してUserモデルを作成

```ターミナル
 $ rails g devise user
  # deviseコマンドでモデルを作成
```

⑥rake db:migrateを実行

```ターミナル
 $ rake db:migrate
  # 作成されたマイグレーションファイルを実行
```
BeagleBoneBlackでWi-Fi接続する


久々にBBBを使おうと思いガラクタの中から引っ張り出して最新のdebian imageを焼いてみたらWi-Fi接続がうまくできなかったという話。

Imageは下記を使用。
* Debian 8.7 2017-03-19 4GB SD LXQT image

Wi-Fiドングルは下記を使用。
* PLANEX GW-USValue-EZ 802.11n Wireless Adapter [Realtek RTL8188CUS]

かつてのようにwpa_supplicant.confを作成してもうまく行かず、調べていたらconnmanというのに変わっていたんですね。
もしや昔から？

以下、connmanctlを使って接続の手順。

```
sudo connmanctl
connmanctl> enable wifi 
Enabled wifi 

connmanctl> scan wifi 
Scan completed for wifi 

connmanctl> services 
    <SSID>              wifi_XXXXXXXXXXXX_XXXXXXXXXXXXXX_managed_psk 

connmanctl> agent on 
Agent registered 

connmanctl> connect wifi_XXXXXXXXXXXX_XXXXXXXXXXXXXX_managed_psk 
Agent RequestInput wifi_XXXXXXXXXXXX_XXXXXXXXXXXXXX_managed_psk 
Passphrase? <パスフレーズを入力> 
Connected wifi_XXXXXXXXXXXX_XXXXXXXXXXXXXX_managed_psk 

connmanctl> quit 
```

ifconfigで確認してIPアドレス取れていれば成功 

```
ifconfig
```

参考記事
https://groups.google.com/d/msg/beagleboard/v4_A2x1I5gs/FiAJM0MOAwAJ
初めてQiitaに投稿するとき1枚も画像をアップできなくなったときの対策

初めて投稿する人は2MBの制限があるようなのだが、それを知らずに何枚かの画像のアップを試みていたら、いつの間にか[Payload Too Large]()が表示されて、1枚も画像をアップできなくなってしまった。
そういう方は、一度アカウントを削除してから、再度アカウント登録してみましょう。

私の場合は、同じメアドで再登録できましたが、すべての情報は消えてしまいますので、自己責任でお願いします。
開発環境不要でPython機械学習。Azure notebook (jupyter notebook on Azure)で、『池澤あやかとプログラミングで学ぼう！機械学習のための数学講座【ベイズの定理編】』を受講してみました

Azure Notebook は、マイクロソフトのアカウントで利用可能なjupyter notebookの環境です。
便利そうだったので、試してみました。

お題はこちら
池澤あやかとプログラミングで学ぼう！機械学習のための数学講座【ベイズの定理編】
https://codeiq.jp/magazine/2017/03/49158/

※引用まずければ直ぐに削除いたしますのでご指摘頂けると幸いです。

数学が苦手、機械学習の内容に今一歩踏み込めない、pythonの環境構築がハードル、などの方におすすめです。
MSアカウントだけで、python codeが実行できちゃいます。 所要時間は５分程度です。

- - -
#Azure Notebook でNotebook を新規作成
https://notebooks.azure.com/ へアクセスし、必要な情報を登録(Get Start)するとこんな画面が出ます。
![image](https://qiita-image-store.s3.amazonaws.com/0/123399/273be606-d9cf-ee8a-e680-48d4609c334a.png)
＋new で新規Notebookを作成します。
language は Python 3.5 を選択、ファイル名はbayesにしてみました。
![image](https://qiita-image-store.s3.amazonaws.com/0/123399/990792e4-fb1c-b91a-520a-571374c354bf.png)

作ったファイルを選択するとこのような画面が出てきます。
![image](https://qiita-image-store.s3.amazonaws.com/0/123399/d981e94d-f709-e828-8ffe-ca14ddc141e6.png)

#早速使ってみよう！！
最初のpython programを実行してみます。
![image](https://qiita-image-store.s3.amazonaws.com/0/123399/59aa978b-5bd1-23c4-497f-6046ca792b69.png)
in:と書いてあるテキストボックスに貼り付けて
![image](https://qiita-image-store.s3.amazonaws.com/0/123399/fc12ac1a-59e8-2c96-8918-b812a8eff688.png)
ボタンで実行できます。
結果は以下のようになりました。
![image](https://qiita-image-store.s3.amazonaws.com/0/123399/ddd528e0-e3b2-099d-dded-94ecba22bc21.png)
jupyterではprintが要らない(※1)ので、print文を除去して実行しました。
![image](https://qiita-image-store.s3.amazonaws.com/0/123399/6086cf19-1625-0e20-2644-16d7f8a05d6f.png)

#その他引っかかったところ
こんな感じでできてしまうのでやってみましょう。
その他チュートリアルの一番最後のアプリケーションでprint以外で引っかかるところは以下です。
###1.from janome.tokenizer import Tokenizer
　→ 不足ライブラリは以下でインストールできました。
　!pip install janome

 　jupyter では、!を先頭につけることでコマンドが実行できます。 例えば、 !ls -l と入力するとファイルの一覧が取得できます。

###2. フォルダ作成とファイル作成
　一番最後のアプリケーションは、動作前にファイルとフォルダを作成する必要があります。
　下記コマンドを実行しました。

```
!mkdir train_data
!mkdir train_data/baseball
!mkdir train_data/soccer
!echo baseball > train_data/baseball/baseball.txt
!echo soccer> train_data/soccer/soccer.txt
!echo baseball > test.txt
```

最後まで実行したものはこちら（printを除去しています。）
![image](https://qiita-image-store.s3.amazonaws.com/0/123399/91bc1bff-9066-3044-bcaf-6ec2a6a27d40.png)

---
※1 (2017/4/13 追記)
SSAS3さんよりコメントいただきました、print文について補足します。
採用したコードにおいて、printでsyntaxエラーが発生する原因は以下です。

```
print文でエラーが出るのは、Python2系ではなくPython3系のため。
Python3系では、print文が関数になっているからです。
```

printをPython3系の記述に修正すると以下の結果となります。
![image](https://qiita-image-store.s3.amazonaws.com/0/123399/705e745b-9bfd-3518-0754-f955953f0bd1.png)
jupyter notebookは変数値のみを記載すると、結果をoutとして出力する仕様なので、
便宜上print を利用しないことが多くなります。

---

よい jupyter ライフを！！
Jリーグの試合予想をしてみた（データ分析）

##概要
Jリーグの試合予想を過去データを元にしてみた
勝ち、負け、引き分けを55%の確率で予想できた
(学習データ2573試合、テストデータ200試合)

##免責
記事内容の利用による責任を一切負いません

##きっかけとこれまでの取り組み
Googleが2014年頃にワールドカップの勝敗予想をした
<a href="http://gigazine.net/news/20140704-google-predict-worldcup-2014/">"Googleがビッグデータを解析してW杯を予測すると全試合的中、準々決勝も当ててしまうのか？"</a>
この記事を見てJリーグの予想もしてみようと思った。
Googleの取り組みで気になった点は
OPTAというサッカーデータによって選手、ボールの位置すべての情報がわかること。
（データ探したけど個人では取得はムリっぽい）
それをモンテカルロ法で１試合まるごとシミュレーションすることなどだ。

##データ収集
Jリーグに関しては結構いろいろなサイトがある。
ご迷惑がかからないようにひっそりじっくりデータを集めた。

###＜入力データ＞
####試合状況<br>・・・天候、観客数、曜日、祝日かどうか、キックオフ時刻、など
####ホーム、アウェーチームの過去6試合の戦歴<br>・・・1試合につき得点はもちろん、シュート数、パス数、パス成功率などの変数を多数入れた。平均化はせずにそのままつなげて入力。
####スタメン参加選手すべてのデータ<br>・・・それぞれの個人のポジション、身長、体重、出身地、過去数試合の得点数
（全学習変数は754個になった）

###＜正解データ＞
勝ち、負け、引き分けのどれかで0,1,2のラベルにした

##データ処理、成型
今回はhtmlからデータを抜き出すのにはじめて本格的にbeautifulsoupを使った。
便利すぎる。もっと早く使えばよかった。
あと0〜1への正規化はしたほうがいい。np.maxとか使って２行くらいで簡単にできる。

##学習ソースコード
かなり普通のscikit learnのコード

```py3
import numpy as np
from sklearn.metrics import accuracy_score
from sklearn.model_selection import GridSearchCV
from sklearn.metrics import classification_report
from sklearn.svm import SVC

all_input_np = np.load('input.npy')
all_label_np = np.load('label.npy')
train_input = all_input_np[:-200]
test_input = all_input_np[-200:]
train_result = all_label_np[:-200]
test_result = all_label_np[-200:]

tuned_parameters = [{'kernel': ['linear'], 'C': [1, 10, 100, 1000]}]

clf = GridSearchCV(SVC(), tuned_parameters, n_jobs=4, scoring="accuracy")

print(">>>START")
clf.fit(train_input, train_result)
print("Best parameters set found on development set: %s" % clf.best_params_)

print("Grid scores on development set:")
means = clf.cv_results_['mean_test_score']
stds = clf.cv_results_['std_test_score']
for mean, std, params in zip(means, stds, clf.cv_results_['params']):
        print("%0.3f (+/-%0.03f) for %r" % (mean, std * 2, params))

print("The scores are computed on the full evaluation set.")
y_true, y_pred = test_result, clf.predict(test_input)
print(classification_report(y_true, y_pred))
print(accuracy_score(y_true, y_pred))
```

##結果
```
             precision    recall  f1-score   support

        0.0       0.61      0.56      0.59        87
        1.0       0.51      0.78      0.62        78
        2.0       0.00      0.00      0.00        35
avg / total       0.46      0.55      0.50       200

0.55
```

55%が正解率
ラベルは0が負け1が勝ち2が引き分け

ここで、ひとつ工夫点。
サッカーの試合は引き分けになることは全体の20%程度らしい
そこで、全体の正解率を上げるため、学習は引き分けは勝ちとして予測を行い
勝ち、負けのみを予測させるようにした。(逆に言うと引き分けは予測できない)

##ニューラルネットワークを使った結果
正解率50%程度だった
多層パーセプトロン(3層、elu、dropout率0.5みたいな感じ)

##感想
やはり限られたデータにしかアクセスできないのは厳しい。
今回集めたデータでは数理モデルを限界まで高めてもせいぜい６０％くらいの正答率かと思う。
Googleがやったような１試合まるごとのシミュレーションについてはいいアイディアだと思うと同時に
サッカーをただパス成功率とかの数字だけで再現できるかは懐疑的ではある。
やっぱり試合の何らかの画像のデータをリンクさせることで人間には気づけなかった、あるいは、
人間では膨大で負うことのできない分析処理ができるのではないか、ということが１点。
もうひとつはデータ分析の過程を可視化できれば
モデルと入力データの改善の方向が見えてくるかと思う。
大車輪のシュミレーション

#概要
大車輪のシュミレーションをbox2djsでやってみた。

#写真
![](http://jsdo-static-contents.s3.amazonaws.com/images/capture/0/A/y/0AyF.jpg?t=1491813015)
#成果物
http://jsdo.it/ohisama1/0AyF
GitHubレビュー機能：「修正必須」でマージできなくなった時の回避方法

レポジトリーの「Branch Protection」が設定されている前提の話すですが、GitHubのレビュー機能を使ってPull Requestに対して「Changes Requested」、つまり「修正が必須」というレビューが出された場合、そのレビューを出した本人が「Approve」（承認）を出すまで、マージできなくなります。

これは、安全性を考えた便利な機能ではありますが・・・

運用していると、「修正頼んだ人がいないのにリリースしないといけない！」なんてことは、やはりあります。

### 逃げ道

「Branch Protection」の設定次第ではありますが、「人のレビューをオーバライドしてマージさせる」方法があります。

マージ拒否になったPull Requestの画面に、赤い×が付いているレビューの横に小さく「Dismiss review」という文字があると思います。

![pull-request-dismiss-review.png](https://qiita-image-store.s3.amazonaws.com/0/155732/2bfddc6a-f7ad-f224-6167-d3620b9b1cc8.png)

この文字をクリックすると、該当レビューを「ただのコメント」に変えられちゃいます。

人のレビューをほぼ、「なかったこと」にする事なので、ちゃんとその理由を書いておかないと行けませんし、気軽にやっていい作業ではないと思います。
そして、「Branch protection」の設定によっては、この作業ができる人が限られている可能性があります。

その場合、権限を持ってる人に頼んで、もう一度レビューをもらい、依頼された修正が反映されていることを確認してもらって、×となってるレビューをDismissしてもらいましょう。
ちなみに、Dismissされたレビューのコメントなどは全て残りますので、後で見返すことなども出来ます。

まあ、リリースの前日ぐらいに、PRを修正して、レビューしてくれた人に確認取る方がいいと思いますが、そうは行かないこともあるし、緊急事態は、緊急事態なので、抜け道を紹介しました。

※DismissについてのGitHub本家のhelpです：

https://help.github.com/articles/dismissing-a-pull-request-review/

### おまけ：実際の運用体制

ちなみに、うちの会社ではほぼ全てのブランチにprotection設定をつけていて、レビューがApproveされることを必須にしています。そして、レビューのDismiss権限は4人しか持っていません。

若手などが多いチームだとその方がお互いに安心だったりしますし、deployの事故とその後遺症から若手を守れますので、おすすめです。
GitHubでのブランチの削除

誤ってブランチをつくてしまった場合にブランチを削除するコマンド。

##ブランチの削除##

ブランチを削除するには、branchコマンドに -d オプションを指定して実行します。

```
$ git branch -d <ブランチの名称>
```

issue1ブランチを削除するには、次のコマンドを実行します。

```
$ git branch -d chat_picture
```

Deleted branch chat_picture (was ea4afee).
これで、chat_pictureブランチは削除されました。branchコマンドでブランチが削除されたかを確認してみましょう。

```
$ git branch
* master
```

##エラーが出た場合##
以下のようなエラーが出てしまった対処を記載します。

```
error: Cannot delete branch 'chat_picture_create' checked out at '
```

これは作業中のブランチがありますよ。ということを言っているので選択しているブランチをmasterに戻してから、再度コマンドを入力してみます。

```
Deleted branch chat_picture_create (was ea4afee).
```

無事に削除できました。
Windows7以上でデバイスドライバー消さずに簡易的にsysprepを行う方法

Windows7以降、デフォルトのままsysprepを実行するとインストールしたデバイスドライバーがすべて消されてしまうという設定になっています。
それを防ぐため、sysprepを行う際にデバイスドライバーを消さずにsysprepを行いマシンをシャットダウンする方法をメモしておきます。

## 対応OS(確認済みOS)
基本、Windows7以上であれば、どのWindows（サーバーOSを含む）で対応可能なはずです。
　

| 対応OS | 
|:-:|
| Windows7 |
| Windows8  |
| Windows8.1  |
| Windows 10 1607 ～ 22H2 |
| Windows 11 ～ 24H2 |
| Windows Server 2008 R2 |
| Windows Server 2012 R2 |
| Windows Server 2016 |
| Windows Server 2019 |
| Windows Server 2022 |
| Windows Server 2025 |

## sysprepを行いたいPCの中で以下を作業します。
以下の内容を書いたファイルを「C:\unattend.xml」として保存します。（保存場所は任意）

```xml:
<unattend>
<settings pass="generalize">
	<component name="Microsoft-Windows-PnpSysprep" processorArchitecture="x86" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
		<PersistAllDeviceInstalls>true</PersistAllDeviceInstalls>
	</component>
</settings>
</unattend>
```

以下の内容を記入したSysprep実行用のバッチファイルを「c:\sysprep.bat」として保存します。（保存場所は任意）

```bat:
C:\windows\system32\sysprep\sysprep /generalize /oobe /reboot /unattend:c:\unattend.xml /mode:vm
```
1. 尚、上記のunattend.xmlファイルは保存したパスを入れてください。
2. /mode:vmは、Windows8(Windows Server 2012)以降でないと利用できません。Windows 7等の場合は、このパラメーターは削除してください。

## sysprepの実行方法
sysprepの準備ができたら、sysprep.batを実行するだけです。
【Salesforce初心者】トリガのテスト（Saveresult, DeleteResult）

トリガのTestクラスを作成するためのメモです。

SalesforceのDMLで、以下の書き方があります。
Assertを入れる時の受け皿と一緒にまとめてみました。



|DML|Result for Assert|
|:--:|:--:|
|Insert|SaveResult|
|Update|SaveResult|
|Upsert|UpsertResult|
|Delete|DeleteResult|
|Undelete|UndeleteResult|
|Merge|MergeResult|

Assertを書くときは、上記の実行結果を下記のように書けば良いかと思います：

```
System.assert(!result.isSuccess());

```

TrailheadのトリガをFireするためのテストコードが以下です(Insert, Update)。

```
//トリガ
trigger RestrictContactByName on Contact (before insert, before update) {
  
  //check contacts prior to insert or update for invalid data
  For (Contact c : Trigger.New) {
    if(c.LastName == 'INVALIDNAME') {  //invalidname is invalid
      c.AddError('The Last Name "'+c.LastName+'" is not allowed for DML');
    }

  }
}
```


```
//RestrictContactByNameトリガのテストコード
@isTest
private class TestRestrictContactByName {

    @isTest static void TestRestrictContactByNameByInsertOneRecord(){
        //LastName = 'INVALIDNAME 'のレコードを作成し、Insertする
        Contact newCont = New Contact (FirstName = 'Jay', LastName = 'INVALIDNAME');
        //insert newCont;
        
        Test.startTest();
        Database.SaveResult result = Database.insert(newCont, false);
        Test.stopTest();
        
        System.assert(!result.isSuccess());
        System.assert(result.getErrors().size() > 0);
    }
    
    
    @isTest static void TestRestrictContactByNameByUpdateOneRecord(){
        //テストでのレコードをinsertし、LastNameをINVALIDNAMEにしてupdateする
        Contact oldCont = new Contact(FirstName = 'Lucy', LastName = 'Test');
        insert oldCont; 
        oldCont.LastName = 'INVALIDNAME';
        
        Test.startTest();
        Database.SaveResult result = Database.update(oldCont, false);
        Test.stopTest();

        System.assert(!result.isSuccess());
        System.assert(result.getErrors().size() > 0);

    }
}

```

メソッド名前が若干長いのがちょっと気になりますが、まあいいか。
【OSX】afconvert【音声ファイル変換】

OSXには音声ファイルを変換する`afconvert`というコマンドラインツールが標準装備されている。ファイルの情報を表示する`afinfo`と、音声ファイルを再生する`afplay`というコマンドもちょろっと紹介。


# ヘルプとフォーマットを表示　
## afconvert -hf 

```
afconvert -hf
Audio file and data formats:
    '3gpp' = 3GP Audio (.3gp)
               data_formats: 'Qclp' 'aac ' 'aace' 'aacf' 'aach' 'aacl'
                             'aacp' 'samr'
    '3gp2' = 3GPP-2 Audio (.3g2)
               data_formats: 'Qclp' 'aac ' 'aace' 'aacf' 'aach' 'aacl'
                             'aacp' 'samr'
    'adts' = AAC ADTS (.aac, .adts)
               data_formats: 'aac ' 'aach' 'aacp'
    'ac-3' = AC3 (.ac3)
               data_formats: 'ac-3'
    'AIFC' = AIFC (.aifc, .aiff, .aif)
               data_formats: I8 BEI16 BEI24 BEI32 BEF32 BEF64 UI8 'ulaw'
                             'alaw' 'MAC3' 'MAC6' 'ima4' 'QDMC' 'QDM2'
                             'Qclp' 'agsm'
    'AIFF' = AIFF (.aiff, .aif)
               data_formats: I8 BEI16 BEI24 BEI32
    'amrf' = AMR (.amr)
               data_formats: 'samr' 'sawb'
    'm4af' = Apple MPEG-4 Audio (.m4a, .m4r)
               data_formats: 'aac ' 'aace' 'aacf' 'aach' 'aacl' 'aacp'
                             'ac-3' 'alac' 'ec-3' 'paac' 'pac3' 'qec3'
                             'zec3'
    'm4bf' = Apple MPEG-4 AudioBooks (.m4b)
               data_formats: 'aac ' 'aace' 'aacf' 'aach' 'aacl' 'aacp'
                             'paac'
    'caff' = CAF (.caf)
               data_formats: '.mp1' '.mp2' '.mp3' 'QDM2' 'QDMC' 'Qclp'
                             'Qclq' 'aac ' 'aace' 'aacf' 'aach' 'aacl'
                             'aacp' 'ac-3' 'alac' 'alaw' 'dvi8' 'ec-3'
                             'ilbc' 'ima4' I8 BEI16 BEI24 BEI32 BEF32
                             BEF64 LEI16 LEI24 LEI32 LEF32 LEF64 'ms\x00\x02'
                             'ms\x00\x11' 'ms\x001' 'paac' 'pac3' 'pec3'
                             'qaac' 'qac3' 'qach' 'qacp' 'qec3' 'samr'
                             'ulaw' 'zaac' 'zac3' 'zach' 'zacp' 'zec3'
    'ec-3' = EC3 (.ec3)
               data_formats: 'ec-3'
    'MPG1' = MPEG Layer 1 (.mp1, .mpeg, .mpa)
               data_formats: '.mp1'
    'MPG2' = MPEG Layer 2 (.mp2, .mpeg, .mpa)
               data_formats: '.mp2'
    'MPG3' = MPEG Layer 3 (.mp3, .mpeg, .mpa)
               data_formats: '.mp3'
    'mp4f' = MPEG-4 Audio (.mp4)
               data_formats: 'aac ' 'aace' 'aacf' 'aach' 'aacl' 'aacp'
                             'ac-3' 'ec-3' 'qec3' 'zec3'
    'NeXT' = NeXT/Sun (.snd, .au)
               data_formats: I8 BEI16 BEI24 BEI32 BEF32 BEF64 'ulaw'
    'Sd2f' = Sound Designer II (.sd2)
               data_formats: I8 BEI16 BEI24 BEI32
    'WAVE' = WAVE (.wav)
               data_formats: UI8 LEI16 LEI24 LEI32 LEF32 LEF64 'ulaw'
                             'alaw'
```

# ファイル変換
## afconvert -f [出力フォーマット] -d [入力のbitdepth] 入力ファイル 出力ファイル

Ex. ビッグエンディアン１６ビットのファイル(bei16input.m4a)をaiff(output.aiff)に変換

```
afconvert -f AIFF -d BEI16 bei16input.m4a output.aiff
```
※ 解像度は `afinfo` で確認できる 

```
afinfo bei16input.m4a
```

※ `afplay`でコマンドラインからの再生が可能

```
afplay output.aiff
```
CSS Grid Layoutについて調べてみた〜Part 5: レスポンシブデザイン対応してみる

何番煎じか分からないけど、CSSのGrid Layoutについて調べてみたのでまとめてみる。

Part 1: [Grid Layoutの概要](http://qiita.com/k_tada/items/bfd6dfa64e0d0b683834)
Part 2: [使い方（Grid Layoutの用語と基本）](http://qiita.com/k_tada/items/e53de899235a9c3e7642)
Part 3: [使い方（グリッドコンテナ、アイテムの作り方）](http://qiita.com/k_tada/items/5203c9582cca3cff6639)
Part 4: [実際にGrid Layoutを使ってみる](http://qiita.com/k_tada/items/973b348ba640c3cee73c)
Part 5: レスポンシブデザイン対応してみる（イマココ）

# レスポンシブデザインに対応してみる
[Part 1](http://qiita.com/k_tada/items/bfd6dfa64e0d0b683834)の最後に説明したような、レスポンシブデザイン対応をしてみる。

こんな感じ。
<img width="679" alt="スクリーンショット 2017-04-06 20.17.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/16629/e76d2434-d95f-1ea5-4f0f-012725bb93bf.png">

## レスポンシブ対応イメージ
ざっとまとめると、以下のようなイメージでレスポンシブに対応する。

* グリッドコンテナで各エリアを定義する
* 定義したエリアに各グリッドアイテムを配置する
* media queryでエリア名を変えずにエリアのレイアウトだけ変更する
* レスポンシブ(ﾟдﾟ)ｳﾏｰ

## まずはLandscapeを作る
前Partまでで説明したとおり作る（エリアを指定する方法のほうで）

### DOM
```html
<div id="main">
  <div id="board"></div>
  <div id="title"></div>
  <div id="ctrls"></div>
  <div id="score"></div>
  <div id="stats"></div>
</div>
```

### コンテナ
```css
#main {
  display: grid;
  grid-template-rows: 80px 1fr 100px;
  grid-template-columns: 200px 1fr;
  grid-template-areas:
    "title board"
    "stats board"
    "score ctrls";
}
```

### アイテム
```css
#board {
  grid-area: board;
}
#title {
  grid-area: title;
}
#ctrls {
  grid-area: ctrls;
}
#score {
  grid-area: score;
}
#stats {
  grid-area: stats;
}
```

## media queryを使ってPortraitの方を作る
各エリアへのアイテムの配置は既に定義済みなので、コンテナのエリア定義を変更するだけでOK。

こんな感じ。

```css
@media screen and (max-width: 480px) {
  #main {
    grid-template-rows: 100px 80px 1fr 100px;
    grid-template-areas:
      "title stats"
      "score stats"
      "board board"
      "ctrls ctrls";
  }
}
```

これだけでレスポンシブ対応出来る。

イメージ
![gif.gif](https://qiita-image-store.s3.amazonaws.com/0/16629/07f34145-d674-9daf-281e-81e3c847d034.gif)

デモ：https://jsfiddle.net/enj2wxp3/

次回：~~Grid Layoutの用途を考える~~何書こう・・・（Coming Soon）
PrometheusのMetrics名は命名規則に準拠しないとエラーで読み取ってくれない

# 概要

* PrometheusのMetrics名には[ルール](https://prometheus.io/docs/practices/naming/)がある
* 守っていないとエラーで読み取ってくれない

# 経緯

1. [fluent-plugin-prometheus](https://github.com/kazegusuri/fluent-plugin-prometheus)を使用する
2. メトリックス名を「2xx_count」にする
3. エラーで読み取ってもらえない

次のようなfluentd.configを定義（抜粋）した。

```
<filter status.*.*.*>↲
  @type prometheus↲
  <labels>↲
    tag ${tag}↲
  </labels>↲
  <metric>↲
    name 2xx_counter↲
    desc 2xx counts↲
    type counter↲
    key 2xx_count↲
  </metric>↲
</filter>
```

Fluentdを起動すると次のようなエラーが出て読み取ってもらえない。

> text format parsing error in line 1: invalid metric name in comment

これは、PrometheusのMetrics名の[ルール](https://prometheus.io/docs/practices/naming/)に従っていないから。
`name 2xx_counter↲`ここを`http_response_code_2xx_count`に変更したら、正常に動作した。
レイヤ2 データリンク層 機器

## レイヤ2：データリンク層 機器のメモ
## リピーター
電気、光信号の修復と増幅をする
ポートが1つしかない

## リピーター・ハブ(別名：マルチポートリピーター
電気、光信号の修復と増幅をする
ポートが複数ある
衝突ドメインが起こる

## ブリッジ
LANとLANを繋ぐ
フレームの宛先MACアドレスが外部にある場合、通信を通し、内部の場合、破棄する
ブロードキャストは通す

## スイッチ
ハブみたいに通信を全ポートに対して送るのではなく、フレームを解析して宛先MACアドレスが繋がっているポートに対してのみ送る
ブロードキャストは通す
全２重通信が可能
MACアドレステーブルを持っている
アドレステーブルは通信が発生する度にフレームを解析して学習していく
jsdoでconvnetjs その5

#概要
jsdoで、playground.tensorflow.orgのclassificationやってみた。

#写真
![pl.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/bdbd8dec-fec9-1232-3c8b-0c8de9900f65.jpeg)

#実際

http://playground.tensorflow.org/#activation=tanh&batchSize=10&dataset=circle&regDataset=reg-plane&learningRate=0.03&regularizationRate=0&noise=0&networkShape=1&seed=0.77333&showTestData=false&discretize=false&percTrainData=50&x=false&y=false&xTimesY=false&xSquared=true&ySquared=true&cosX=false&sinX=false&cosY=false&sinY=false&collectStats=false&problem=classification&initZero=false&hideText=false


#写真
![](http://jsdo-static-contents.s3.amazonaws.com/images/capture/e/4/r/e4rN.jpg?t=1491803502)

#成果物
http://jsdo.it/ohisama1/e4rN
pl/perl installation on CentOS7

### installation log
```shell-session
# yum install postgresql94-plperl
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
 * base: ftp.tsukuba.wide.ad.jp
 * epel: ftp.riken.jp
 * epel-debuginfo: ftp.riken.jp
 * epel-source: ftp.riken.jp
 * extras: ftp.tsukuba.wide.ad.jp
 * updates: ftp.tsukuba.wide.ad.jp
Resolving Dependencies
--> Running transaction check
---> Package postgresql94-plperl.x86_64 0:9.4.11-2PGDG.rhel7 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

=====================================================================================================================================================================
 Package                                       Arch                             Version                                       Repository                        Size
=====================================================================================================================================================================
Installing:
 postgresql94-plperl                           x86_64                           9.4.11-2PGDG.rhel7                            pgdg94                            65 k

Transaction Summary
=====================================================================================================================================================================
Install  1 Package

Total download size: 65 k
Installed size: 167 k
Is this ok [y/d/N]: y
Downloading packages:
postgresql94-plperl-9.4.11-2PGDG.rhel7.x86_64.rpm                                                                                             |  65 kB  00:00:01     
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Installing : postgresql94-plperl-9.4.11-2PGDG.rhel7.x86_64                                                                                                     1/1 
  Verifying  : postgresql94-plperl-9.4.11-2PGDG.rhel7.x86_64                                                                                                     1/1 

Installed:
  postgresql94-plperl.x86_64 0:9.4.11-2PGDG.rhel7                                                                                                                    

Complete!
```
FreeNAS Corral（FreeNAS 10）のストレージ設定

FreeNAS Corral（FreeNAS 10）で新規ディスクを割リ当て、共有ディレクトリを作成するストレージ設定手順を記載する。

①ブラウザに設定したIPアドレスを入力して開く
②ログイン画面が表示されるのでrootで[Sign In]する
```ユーザID:root　
パスワード:(インストール時に設定したrootパスワード)```
![img4_login.png](https://qiita-image-store.s3.amazonaws.com/0/171475/3bd81692-b51a-8f1d-9f26-9d2495bcc96e.png)

③ダッシュボードの[Strage]を選択してVolumesタブの(＋)をクリック
④割り当てるディスクを選択してクリック
![img3_strage set.png](https://qiita-image-store.s3.amazonaws.com/0/171475/671748d2-9302-61eb-59d6-c5513eec8b01.png)

⑤[Name]に割り当てたディスクのvolume名を入力（入力例：vol1）
⑥選択したディスクを「Data」にドラッグアンドドロップして[Save]ボタンをクリック
![img6.png](https://qiita-image-store.s3.amazonaws.com/0/171475/eb76b004-1a72-02de-cba7-d7f8ec7d611f.png)

⑦ダッシュボードの[Strage]を選択すると先ほど割り当てたディスクのvol1が表示されているので選択。さらに[Shares]を選択してのSharesタブの(＋)をクリック
⑧今回はSMBプロトコルを使用して共有ディレクトリを作成するので[New SMB Share]をクリック
![img7.png](https://qiita-image-store.s3.amazonaws.com/0/171475/36299bef-334a-9fa2-72bb-61453591a2f3.png)

⑨[Name]に共有ディレクトリ名を入力（入力例：test）
⑩[Guest Allowed]をチェックして[Save]ボタンをクリック
![img8.png](https://qiita-image-store.s3.amazonaws.com/0/171475/75e2e50c-51db-da31-6e22-53285360338d.png)

⑪エクスプローラ等でFreeNASのIPアドレスを入力して先ほど作成した共有フォルダがあることを確認する
![img9.png](https://qiita-image-store.s3.amazonaws.com/0/171475/3d98d29b-f1c7-c278-b9c4-61bc5a000b52.png)
TeXに貼る図の作り方 EPS or PDF

# はじめに

TeXで図を貼り付ける際，ベクタ画像をいかに貼り付けるかは悩ましい問題です．
ここではWindowsを利用したTeX作成における図の作成として，EPSやPDFで貼り付ける手順を紹介します．
EPSとPDFのどちらを使うかは，好みで選びましょう．

# EPS編

## 環境設定

- Metafile to EPS Converterのインストール

https://wiki.lyx.org/Windows/MetafileToEPSConverter

上記URLからmetafile2eps.exeをダウンロードし，インストール

## EPSファイル作成

- Metafile to EPS Converterの起動

![metafile2eps.png](https://qiita-image-store.s3.amazonaws.com/0/156444/99f98549-9e93-26a6-8e8b-6cd7f9365b43.png)

- Power Pointなど図を作成したアプリケーションで図を「コピー」
- Metafile to EPS Converterで「貼り付け(Paste)」
- 「Export EPS」で保存

# PDF編

TeX環境が入っていることが前提です．`pdfcrop`コマンドが使えることを確認しましょう．

## 環境設定

- Perl環境の設定

`pdfcrop`コマンドの利用にPerlが必要なので，Perlをインストールします．

http://strawberryperl.com/

上記サイトからダウンロードできます．
インストールしたら再起動してください．

- 以下のbatファイルを作成

```bat:crop.bat
@echo off

rem PDFから余白を切り取る
pdfcrop %1

rem .bbファイルを作成
ebb %~n1-crop.pdf

rem 一時ファイルを削除
del tmp-pdfcrop-*.pdf
```

## PDFファイル作成

- Power Pointなどで図を作成

このとき，図の周囲に余分なデータ（改行文字も含む）を入れないようにする．

- PDFファイルとして出力

- 作成した`crop.bat`にドラッグアンドドロップ

- 同じ階層に`***-crop.pdf`として余白がトリミングされたPDFが出力される．
GitLab Container Registry を有効化して、Dockerから利用する

GitLab Container Registry を GitLab 9.0 で有効にして、
Docker から利用してみます。

# 1. 前提条件
* GitLab を Omnibus package installation でインストールしているとします。(こちらを参照してください
http://qiita.com/masakura/items/0a0f00dfdddc8ce27f29)


# 2. 設定

以下を設定する。

```lang:/etc/gitlab/gitlab.rb
registry_external_url 'https://registry.example.co.jp'
registry_nginx['ssl_certificate'] = "/etc/gitlab/ssl/example.crt"
registry_nginx['ssl_certificate_key'] = "/etc/gitlab/ssl/example.key"
```
SSLはいろいろ面倒なのでLet's Encryptなどで取得すると良いでしょう。
設定を反映

```
$ sudo gitlab-ctl reconfigure
```

# 3. Dockerから使う

GitLabのプロジェクトからRegistryが出てきます。

![image](https://qiita-image-store.s3.amazonaws.com/0/15176/4b9e72c1-4040-7c98-123b-014ef8376ee0.png)

## 3-1. Dockerからログイン
インストラクションの通りですが、Dockerホストからレジストリにログインします。

```lang:bash
$ sudo docker login registry.example.co.jp
Username (XXXXX): <GitLabのuser_id>
Password:<GitLatのuser_password>
Login Succeeded
```

以下のようなエラーが出た場合は、gnupg2 passというパッケージが足りないそうです。

```
Error saving credentials: error storing credentials - err: exit status 1, out: `Error spawning command line “dbus-launch --autolaunch=2fb346aaad55463a89ab59d4438349ab --binary-syntax --close-stderr”: Child process exited with code 1`
```

以下のコマンドでインストールしましょう

```
sudo apt install gnupg2 pass
```

DockerHubへのdocker loginが出来なかった場合の対処 - Qiita
https://qiita.com/developer-kikikaikai/items/03131dd1a9ac2b99e340

## 3-2. Docker HubからのイメージをGitLab Container Repositry にコピーしてみます。

良さげなイメージを検索

```
$ sudo docker search nginx
```
Pullします。

```
$ sudo docker pull nginx
```

コンテナーイメージを確認

```
$ sudo docker images 
```

イメージにGitLab Container Registryのタグ名を付ける

```
$ sudo docker tag nginx registry.example.co.jp/hogehoge/hogeproject
```

registry.example.co.jpにPushする。

```
$ sudo docker push registry.example.co.jp/hogehoge/hogeproject
```

# 4. Docker Run

Pushしたイメージを起動してみる

```
$ sudo docker run registry.example.co.jp/hogehoge/hogeproject
```


---
参考：
http://qiita.com/masakura/items/802f4b8ce322d2543c80
cocos2d-x-3.14.1 の iOS static ライブラリをビルド

# 目的

1. cocos2d-x アプリのビルドを速くしたい
    1. ```cocos new``` コマンドで作成した Xcode プロジェクトでは、クリーンビルドの度にライブラリ部分も再ビルドする
2. Xcode が cocos2d-x ライブラリ部分に対して表示する警告を見たくない
    1. cocos2d-x-3.14.1 の libcocos2d iOS で 229 issues

# 環境

1. Mac OS X 10.12.4 (英語)
2. Xcode 8.3.1
3. git-2.12.2 (brew)

# 方針

1. iOS Deployment Target は 8.0
2. iOS SDK は 10.3 (latest)
3. アーキテクチャーは arm64 armv7 x86_64 i386
    1. [アーキテクチャーとデバイスの関係](http://iossupportmatrix.com/)
    2. armv7s は build/cocos2d_libs.xcodeproj のビルド対象に入ってないし armv7 とほとんど差がない模様
4. bitcode をサポート

# 手順
[cocos2d-x-3.14.1](http://qiita.com/ken1ma/items/51d6add23e5adc6376f5) ディレクトリから

	$ cd build

	$ xcodebuild -project cocos2d_libs.xcodeproj -scheme "libcocos2d iOS" -configuration Release -sdk iphoneos10.3 \
		clean build ARCHS='arm64' VALID_ARCHS='arm64' IPHONEOS_DEPLOYMENT_TARGET=8.0 \
		TARGET_BUILD_DIR=tmp/arm64 BUILT_PRODUCTS_DIR=tmp/arm64 OBJROOT=tmp/arm64 SYMROOT=tmp/arm64 \
		OTHER_CFLAGS=-fembed-bitcode

	$ xcodebuild -project cocos2d_libs.xcodeproj -scheme "libcocos2d iOS" -configuration Release -sdk iphoneos10.3 \
		clean build ARCHS='armv7' VALID_ARCHS='armv7' IPHONEOS_DEPLOYMENT_TARGET=8.0 \
		TARGET_BUILD_DIR=tmp/armv7 BUILT_PRODUCTS_DIR=tmp/armv7 OBJROOT=tmp/armv7 SYMROOT=tmp/armv7 \
		OTHER_CFLAGS=-fembed-bitcode

	$ xcodebuild -project cocos2d_libs.xcodeproj -scheme "libcocos2d iOS" -configuration Release -sdk iphonesimulator10.3 \
		clean build ARCHS='x86_64' VALID_ARCHS='x86_64' IPHONEOS_DEPLOYMENT_TARGET=8.0 \
		TARGET_BUILD_DIR=tmp/x86_64 BUILT_PRODUCTS_DIR=tmp/x86_64 OBJROOT=tmp/x86_64 SYMROOT=tmp/x86_64 \
		OTHER_CFLAGS=-fembed-bitcode

	$ xcodebuild -project cocos2d_libs.xcodeproj -scheme "libcocos2d iOS" -configuration Release -sdk iphonesimulator10.3 \
		clean build ARCHS='i386' VALID_ARCHS='i386' IPHONEOS_DEPLOYMENT_TARGET=8.0 \
		TARGET_BUILD_DIR=tmp/i386 BUILT_PRODUCTS_DIR=tmp/i386 OBJROOT=tmp/i386 SYMROOT=tmp/i386 \
		OTHER_CFLAGS=-fembed-bitcode

	$ lipo -create -output "libcocos2d iOS.a" \
		"tmp/arm64/libcocos2d iOS.a" \
		"tmp/armv7/libcocos2d iOS.a" \
		"tmp/x86_64/libcocos2d iOS.a" \
		"tmp/i386/libcocos2d iOS.a"

	$ rm -rf tmp


  1. この段階で libcocos2d iOS.a は 236.0MB


# 確認

1. ```cocos new``` コマンドで作成した Xcode プロジェクトから `cocos2d_libs.xcodeproj` サブプロジェクトを Delete すると ビルド時にリンクエラーが起きる状態になる
    1. 作成した libcocos2d iOS.a を Finder から Xcode で開いたプロジェクトの Frameworks へドラッグ＆ドロップするとビルド成功する
       1. クリーンビルドが早くなった


# bitcode

1. これだけだと Build Settings / Build Options / Enable Bitcode を Yes にするとビルドエラーが起きる

		ld: '.../Build/Products/Debug-iphoneos/libcocos2d iOS.a(CCEAGLView-ios.o)' does not contain bitcode. You must rebuild it with bitcode enabled (Xcode setting ENABLE_BITCODE), obtain an updated library from the vendor, or disable bitcode for this target. for architecture arm64

    1. これは [cocos2d-x-3rd-party-libs-bin](https://github.com/cocos2d/cocos2d-x-3rd-party-libs-bin) で bitcode が有効になっていないため
        1. [cocos2d-x-3rd-party-libs-src (v3-deps-116) を bitcode 有効にしてビルド](http://qiita.com/ken1ma/items/d920263e25f2b896fa82)してから上記手順 (`xcodebuild`) を実施すると bitcode を有効にしてビルドできるようになる
      1. libcocos2d iOS.a が 276.4MB になった