OmniAICreator/Qiita-1.07M huggingface dataset:
Ionic2でサードパーティのJavaScriptライブラリを使う

#はじめに
ionic/cordovaを使ってハイブリッドアプリを作成している時、ionicやcordovaのプラグインなどになっていない通常のJavaScriptライブラリを使いたいことがあります。
いくつか設定するだけで簡単に使えるので、その方法です。

#前提
以下のライブラリを例にします。

```
<script src="http://cdn.peerjs.com/0.3/peer.js"></script>
```
これはWebRTCで使うシグナリングのサービス用ライブラリです。詳しくは以下のサイトをご覧ください。
[peerjs](http://peerjs.com/)

また、ionicのアプリは

```
ionic start ionic-peerj blank
```
で生成した物です。ionicのバージョンは3.9.2です。ディレクトリ構造は以下の通りです。

```
├── README.md
├── config.xml
├── hooks
├── ionic.config.json
├── node_modules
├── package-lock.json
├── package.json
├── resources
├── src
│   ├── app
│   │   ├── app.component.ts
│   │   ├── app.html
│   │   ├── app.module.ts
│   │   ├── app.scss
│   │   └── main.ts
│   ├── assets
│   ├── index.html
│   ├── manifest.json
│   ├── pages
│   │   └── home
│   │       ├── home.html
│   │       ├── home.scss
│   │       └── home.ts
│   ├── service-worker.js
│   └── theme
├── tsconfig.json
├── tslint.json
├── typings
│   ├── cordova-typings.d.ts
│   └── typings.d.ts
└── www
    ├── assets
    ├── build
    ├── index.html
    ├── manifest.json
    └── service-worker.js

```

#設定
###JavaScriptライブラリの読み込み設定
`src/index.html` の`<head>`セクションに使いたいライブラリを記述します。

```html
<!DOCTYPE html>
<html lang="en" dir="ltr">
<head>
   |
  <script src="http://cdn.peerjs.com/0.3/peer.js"></script>
   |
</head>
<body>
   |
</body>
</html>
```

###型情報の設定
typescriptでコンパイルを通すためには型の情報が必要なので、使うライブラリの関数の型情報をファイルに記述します。`peerjs`では`Peer()`を使うので、

```
declare var Peer: any;
```
を`typings/typings.d.ts`に記述します。さらにこのファイルをtypescriptで使うために`tsconfig.json`に以下の記述をします。

```
  "files":[
    "typings/typings.d.ts"
  ]
```
###ライブラリの利用
`src/pages/home/home.ts`でpeerjsを使う例です。

```ts
import { Component, OnInit } from '@angular/core';
import { NavController } from 'ionic-angular';

@Component({
    selector: 'page-home',
    templateUrl: 'home.html'
})
export class HomePage implements OnInit {

    peer;
 
    constructor(public navCtrl: NavController) {
    }

    ngOnInit() {
        this.peer = new Peer({ key: '<yourkeyhere>' });

        this.peer.on('open', (id) => {
            console.log(`id: ${id}`);
        });

        this.peer.on('connection', function (conn) {
            conn.on('data', function (data) {
                // Will print 'hi!'
                console.log(data);
            });
        });
    }
}
```
milkodeのmilk webをサービス化


milkode。いいよね。重宝してます。
milk webをよく使うのですが、いちいちコマンド叩いて起動するのは面倒なので、サービス化してマシンを起動した時にmilk webを自動起動するようにしてみました。
CentOS7以降前提です。

公式サイトはこちら↓
http://milkode.ongaeshi.me/index.html

1. 起動スクリプトを作成して適当な場所に配置。今回は「/opt/milkweb.sh」

※環境変数HOMEやmlikの場所は人によって違うと思うので適当に補完してください。

```milkweb.sh
#!/bin/bash
export HOME=/home/centos/
/opt/rbenv/shims/milk web -n -o 0.0.0.0
```

2．mlikweb.serviceを作成して「/etc/systemd/system/」に配置。

```milkweb.service
[Unit]
Description = milk web

[Service]
ExecStart = /opt/milkweb.sh
ReStart = always
Type = simple

[Install]
WantedBy = multi-user.target
```

3．起動

```
$ systemctl start milkweb.service
```

次回以降はマシン起動時に勝手に起動します。
思ったより簡単だった。
Nintendo Switchを買いたくてNode.jsでアマゾンを監視してみた話。

当方はNodeを三日間ぐらい学んでる初心者で、試みにNode.jsで監視プログラムを作ってみた。
約10回ぐらいページの値段を獲得することはできたが、その後獲得できなくなって、おそらくブロック
クローラ対策かなっと考えられる。
請求の回数を減らして、また他の方案を考えるとさすがに知識不足なので止めた。
結局、運がよくアマゾンを閲覧しているところ、突然入荷で無事購入。

```Node.js
var express=require('express');
var superagent=require('superagent');
var cheerio=require('cheerio');
var schedule = require('node-schedule');


var app=express();
app.listen(3000,function (req,res) {
		/* body... */
		console.log('app is running at port 3000');
	})

function getPrice() {
	app.get('/',function (req,res,next) {
	/* body... */
	
	superagent.get('https://www.amazon.co.jp/%E4%BB%BB%E5%A4%A9%E5%A0%82-Nintendo-Switch-%E3%82%B9%E3%83%97%E3%83%A9%E3%83%88%E3%82%A5%E3%83%BC%E3%83%B32%E3%82%BB%E3%83%83%E3%83%88/dp/B072FGP433/ref=sr_1_10?s=videogames&ie=UTF8&qid=1502075389&sr=1-10&keywords=Nintendo+Switch')
		.end(function (err,sres) {
			/* body... */
			if(err){
				return next(err);
			}

			
			var $=cheerio.load(sres.text);
			var items=[];
			$('#priceblock_ourprice').each(function (idex,element) {
				/* body... */
				var $element=$(element);
				items.push($element.text())
			});

			res.send(items);
			var array=items[0].split("");
			var p=Number.parseInt(array[array.length-6]);
			if(p===3){
				$('#a-autoid-1').trigger("click");
			}else {
				console.log("do not buy");
			}
			console.log('success');
			console.log(p);
			return p;
		});
	});	
	

}

var rule = new schedule.RecurrenceRule();
rule.second=10;
var j = schedule.scheduleJob(rule, function(){
  
  console.log('getprice is running');
  console.log('scheduleCronstyle:' + new Date());
  var pri=getPrice();
  console.log(pri);
});
```
linuxコメント 名前に指定文字列が含んでいるファイル全部削除

linuxコメント 名前に指定文字列が含んでいるファイル全部削除
例
20170808efg.log
20170808abc.log
20170809abc.log
20170810abc.log
20170808def.log
下記のコメントで、上記の第２，３，４行目のログファイルを削除できます。
サブディレクトリでも、削除できます。
find -name "*abc.log" | xargs rm -rf
Single Board ComputerのDeep Learning(Single Shot Multi Box Detector インファレンス)パフォーマンス比較


#概要
SBC(Single Board Computer)ですので、Deep Learningといってもトレーニングのパフォーマンスではなく主にインファレンス（推定）の速度が気になります。インファレンスはできるだけ、実際のイベントの近くで実行したいという思いがあります。ただ、インファレンスといってもDeep Learningの場合、モデルが大きく、メモリやCPUの速度は必要です。できるだけチューニングして、インファレンスの速度を比較してみました。
MXNET上の実装のSSD（Single Shut Mutibox Detector)になります。
以下からクローンしてビルドします。
https://githhub.com/zreshold/mxnet-ssd

手順は[こちら](https://analyticsai.wordpress.com/2017/04/21/raspberry-pi3%e3%81%a7single-shot-mutibox-detector%ef%bc%88ssd%e3%82%92%e5%8b%95%e3%81%8b%e3%81%97%e3%81%a6%e3%81%bf%e3%82%8b/)を参照ください


また、SBCにはUbuntuを構成しました。(beagle born blackはUbuntu 14.04です。それ以外は16.04相当になります）


| SBC         | CPU|    Memory   |
|:-----------------|------------------|:------------------:|
| Raspberry Pi3     |  ARM Cortex-A53 1.2GHz 4Core |        1GB       |
| pcDuino4          |  ARM Cortex-A7 1.5GHz 4Core |       1GB       |
| PINE64+            |  ARM Cortex-A53 1.2GHz 4Core |        2GB     |
| Beagle Born Black  | ARM Cortex-A8 1.0GHz 1Core  |         512MB         |
| odroid XU4           | ARM Coretex-A15/A7 4Core/4Core |       2GB       |

![WP_20170424_17_15_30_Pro[94].jpg](https://qiita-image-store.s3.amazonaws.com/0/177932/e0e01511-8aad-d6c8-ba0b-3e01b63e7540.jpeg)
（左上からRaspberry Pi3 pcDuino4 PINE64 Beagle Born Black)

##評価と比較
MXNETでの実装のSSDですが、パラメータをいくつか試してみましたが、openblasを使うのが一番高速でした。その結果から、以下のパラメータでビルドします。
config.mkの中で以下は下記となっていると思います。

```USE_OPENMP = 1```

標準での線形計算ライブラリとしてatlasが使われていますが、openblasに変更します。

````
UNAME_S := $(shell uname -s)
ifeq ($(UNAME_S), Darwin)
USE_BLAS = apple
else
USE_BLAS = openblas
endif
````

標準ではインストールされていないと思いますので、記事の手順に加えて下記を構成しておきます。

``sudo apt-get install libopenblas-dev```

demo.pyを使って、何度か実行し、平均の実行時間を下記に示します。beagle born blackはスペック的にはぎりぎりのようで、Swap領域を広げないと動作はしない状況でした。SBCではないですが、IntelのCompute Stickでの実行結果も比較のため提示しておきます。
![fish-bike-jpg.png](https://qiita-image-store.s3.amazonaws.com/0/177932/03ce06a1-b859-34f3-4b9b-3996481bbfcd.png)

| SBC         | 実行時間  |
|:-----------------|:------------------:|
| Raspberry Pi3     |  14s |        
| pcDuino4          |  34s |       
| PINE64+           |  8s |        
| Beagle Born Black  | 180s|         
| odroid XU4           | 12s
| Intel Compute Stick（CSTK-32W）        | 8s

カタログスペック上、Raspberry Pi3とほぼ同じはずのPine64が一番高速でした。OSが64bit化されているのが大きいのかもしれません。
odroid-XU4は8Coreでスペック的には一番有利ですが、非対称であることが災いしているのか、ほとんどRaspberry Piと変わらない実行時間でした。
動画の処理には無理がありますが、10秒程度で処理が終わるのであれば、静止画で監視用途等であれば。使える領域もあると考えられます。
また一台がかなり安いですのでEdgeの配置して最低限の処理を実行させるという方向で使えそうです。
Debug.isDebugBuildとDevelopment BuildとCloud Build

`Debug`クラスには、`isDebugBuild`というプロパティがあります。

これは、「デバック時だけパラメータをいじることができるビューを表示する」など、デバックの際に活用することができます。

[リファレンス](https://docs.unity3d.com/jp/540/ScriptReference/Debug-isDebugBuild.html)

次のコードは、`Debug.isDebugBuild`が`true`の時だけ、GUIのボタンを表示する例です。

```
using UnityEngine;

public class DebugView : MonoBehaviour
{
    void OnGUI()
    {
        if (!Debug.isDebugBuild)
        {
            return;
        }

        var width = Screen.width / 4;
        var height = Screen.height / 16;

        if (GUI.Button(new Rect(10, 10, width, height), "Show Debug View"))
        {
            ShowDebugView();
        }
    }

    /* 略 */
}
```

`Debug.isDebugBuild`は、Unity Editorで設定する場合は、File > Build Settingsの中から、`Development Build`をチェックするとtrueに、チェックを外すとfalseになります。

Cloud Buildでは、設定タブを選択 > 高度設定を表示 > 高度な設定を変更 > 開発用ビルドのチェックボックスを編集することで、`Debug.isDebugBuild`を設定できます。

Unity Editorでも、Cloud Buildでも、`Debug.isDebugBuild`を活用して、デバックを円滑に行いたいですね。
linux コメント　自動的にファイル削除

指定時間毎に自動的に行って、指定パス配下の固定時間前のファイルを削除するコメント
例：60秒毎に自動的に行って、「/home/log/」配下の2時間前に出力されたファイルを削除する用コメント
`watch -n 60 tmpwatch -m 2 /home/log/`
立方体の面をタイムラインで動かす

[立方体の展開 (1)| three.js](http://labo.project-nya.jp/threejs/develop_cube1/)

使い勝手の悪い印象があったTimelineクラスを使ってみると、
意外と使いやすくて、素晴らしかったでござる。

Timelineクラス凄いっ！

参考：[TweenJSのTimelineを使ったテキストアニメーション | kudox.jp](http://kudox.jp/java-script/createjs-tweenjs-timeline)
参照：[[CreateJS] トゥイーン (5) ～parallel～ | にゃあプロジェクト](http://blog.project-nya.jp/1736)
【TypeScript】シンプルなMD5変換方法

Node.jsでのMD5の変換を調べてみたら、`crypto`という標準ライブラリがあったのですが、
https://nodejs.org/api/crypto.html#crypto_crypto

もっと簡単なライブラリがあったので、記事にしてみました。

## NPM

https://www.npmjs.com/package/md5

```bash
$ npm install md5 --save
$ npm install @types/md5 --save
```

## 使い方

DefinitelyTypedのテストコードを参考にするとわかりやすい
https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/types/md5/md5-tests.ts

```js:md5の使い方
import * as md5 from 'md5';

const message = 'hoge'
console.log(md5(message));
```

**なんとシンプル！！**
水没ラズベリーで猛暑を乗り切ろう！

# 今年は猛暑です？

夏になりました。

気象庁が発表した3ヶ月予想によると、7月〜9月は平年より気温が高く猛暑・残暑になるそうです。

我々のオフィスは地球温暖化対策として、冷房がエコな温度に設定され、そこで働く従業員はクールビズで快適に過ごそうと努力しています。

 
**"頑張っているのは人だけではありません"**

 

そう。僕らが所有するラズベリーパイも絶賛クールビズ中なのです！！

なんと、服を着ていませんww（お金無くてケース買えなかったんやー！）

 
![razu.jpg](https://qiita-image-store.s3.amazonaws.com/0/197848/ebfd0a31-2af6-a34f-8600-0027c2b236b6.jpeg)


そんなラズベリーパイですが、CPU負荷が高まると[50度]を軽く超えてきます。

クールビズしたって、本人が熱中症で倒れたら意味ないですよね。

 

ってことで、ラズベリーパイがどうやったら猛暑を乗り切ることが出来るか

考えてみました。

 
![kousou.jpg](https://qiita-image-store.s3.amazonaws.com/0/197848/9960fbc9-50c2-bd28-002f-e2ffc70f9498.jpeg)


# 選ばれし「水没ラズベリー」作戦

熱中症対策に水分補給は欠かせません。
それは、ラズベリーパイも同じなはずです！！＼(^o^)／

我々、ラズベリーを熱中症から救う会では画期的な手段を考案しました。

その名も 「水没ラズベリー」作戦 です。

考え方は簡単です。

ラズベリーパイに魔法のアイテム"Never wet"を振りかけます
水に沈めます
快適なSummer Lifeをenjoyします。以上。

# やってみようｗｗｗ

"Never wet"買ってきた！！！

![neverwet.jpg](https://qiita-image-store.s3.amazonaws.com/0/197848/0512b784-2250-9df5-df12-bc22e89281aa.jpeg)

なんか感電怖いよね。。。
こんなのいるかな。。。

![tebukuro.jpg](https://qiita-image-store.s3.amazonaws.com/0/197848/493ea3a3-48e8-1007-c058-e410ca2c238a.jpeg)

と、まずはここまで。

この完璧な「水没ラズベリー」作戦
ラズベリーパイくんは無事夏を越えることができるのか！！！
reducerのstateをrootレベルでリセットしたい


## 書くこと
combineReducersでreducerを分割しているケースで、例えばユーザのログアウト時にすべてのreducerをリセットする方法


## 前提

userとmessageのリソースがあり、messageは、userが所有しているものとし、
userがログアウトされると、messageはカラになるようしたい。


```:rootReducer.js
import { combineReducers } from "redux"
import sessionReducer, { CLEAR_CURRENT_USER_SUCCESS } from './sessionReducer';
import messageReducer from './message_reducer'

const rootReducer = combineReducers({
  sessionReducer,
  messageReducer,
});

export default rootReducer
```

```:sessionReducer.js
export const CLEAR_CURRENT_USER_SUCCESS = 'CLEAR_CURRENT_USER_SUCCESS';
const initialState = {
  currentUser: {}
};

const sessionReducer = (state = initialState, action) => {
  switch(action.type) {
    case LOGOUT_SUCCESS: {
      return initialState
    }
    default:
      return initialState
  }
}
```

sessionReducerをカラにするには、ログアウトのaction経由でreducerを更新すればよい。
が、他のreducer（この場合だとmessageReducer）も初期化更新するのは、
reducerが増えた時に大変なので、reducerのrootレベルで初期化する


## 対応

```:root_reducer.js
import { combineReducers } from "redux"
import sessionReducer, { LOGOUT_SUCCESS } from '../sessionReducer';
import messageReducer from './messageReducerr'

// combineReducers箇所をappReducerに変更する(名前はなんでもいい)
const appReducer = combineReducers({
  sessionReducer,
  messageReducer,
});

//ログアウト時、appReducerを更新する
const rootReducer = (state, action) => {
  if (action.type === LOGOUT_SUCCESS) {
    state = undefined
  }
  return appReducer(state, action)
}

export default rootReducer
```

## 参考

https://stackoverflow.com/questions/35622588/how-to-reset-the-state-of-a-redux-store
Nginxの設定(www, https, IP)

# 動作環境
- CentOS7
- nginx/1.12.1
- Let's Encrypt

# やったこと
- 強制https
- wwwなしに統一
- IP直打ち禁止


```default.conf
server {
    listen 80;
    server_name www.example.com;
    return 301 https://example.com$request_uri;
}

server {
    listen 80;
    server_name example.com;
    return 301 https://example.com$request_uri;
}

server {
    listen 443 ssl;
    server_name example.com;

    ssl_certificate     /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
}

server {
    listen 80  default_server;
    server_name _;
    return 444;
}

server {
    listen 443  ssl default_server;
    server_name  _;
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    return 444;
}

```
Windows CreatersUpdateをしたらWindows.Speech.DictationRecognizer がUnityEditorで使えた話

#概要
Unityで使える音声認識機能に、Unityに機能として備わっているWindows.Speech.DictationRecognizerがWindows10では64ﾋﾞｯﾄ環境で使えなかった（UnityEditorで使えないので不便）が、WindowsCreaters UpdateをしたらUnityEditorで使えるようになった話。

#症状
利用環境はこんな感じで試してみたら、UnityEditorでは動かず、ビルドする際にもx86しか動作しなかった。
Unity2017b4
Windows10

ネットで同様の症状がないかと検索したところ下記の記事が見つかって、
[Unity – 音声認識DictationRecognizerの制限について](http://mizutanikirin.net/unity-%E9%9F%B3%E5%A3%B0%E8%AA%8D%E8%AD%98dictationrecognizer%E3%81%AE%E5%88%B6%E9%99%90%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)
Unityのバグなのかなあとあきらめていたが、

Windows環境をWindowsCreatersUpdateに更新し、
Windowsの設定→プライバシー→音声認識をオンにすると無事使えるようになりました。
CreatersUpdateをしないと上記の設定をオンにしても無駄です。

これでUnityEditorでも64bitビルドでもUnityの機能で音声認識が使えるので、超絶開発効率が高まります。やったね。

同様の症状で困っている人がいたら試してみてください。
AWS CodePipelineからMicrosoft Teamsに承認依頼を飛ばす（超簡単版）

# はじめに

AWS CodePipelineではPipelineの途中に「手動承認」のアクションを定義できます。

```
[ Build ]
    ↓
[ Beta環境にデプロイ ]
    ↓
（Beta環境で動作確認）
    ↓
[ 手動承認 ]
    ↓
[ Production環境にデプロイ ]
```

手動承認はManagementConsoleの以下のような画面でコメントとともに承認または拒否します。

![2017-08-15_23h22_30.png](https://qiita-image-store.s3.amazonaws.com/0/117772/f528c57a-a7c8-96bd-5dc9-933ae0e963e5.png)

Codepipelineでは手動承認が必要になったタイミングでAmazon Simple Notification Service(SNS）を経由して通知することができます。

本記事では、この通知先をMicrosoft Teamsの任意のチャネルに設定してみます。

# Teamsのチャネルへの通知方法２種類

チャネルへの通知方法は２つあります。一つはメールを使用する方法。もう一つはコネクタを使用する方法です。

本記事では、とても簡単な「メールを使用する方法」を書きます。「コネクタを使用する方法」は別記事で書きます。

# 前提条件

* CodePipelineとSNS Topicが作成済みで手動承認の通知先にSNS Topicが設定済みであること。

* Teamsが利用可能であること。

# 設定方法

## Teamsで通知先チャネルのメールアドレスを取得

Teams上で、通知したいチャネルのメールアドレスを取得します。

![2017-08-18_14h09_54.png](https://qiita-image-store.s3.amazonaws.com/0/117772/9d4494ee-d19b-aa12-240b-3b47884c145e.png)

## SNS TopicにSubscriptionを作成

AWSのManagementConsoleのSNSから`Topis` -> `(CodePipelineの通知先Topic)` -> `Create subscription`を選択します。

Protocolに”Email”を選択し、Endpointにチャネルのメールアドレスを設定します。

![2017-08-18_14h14_25.png](https://qiita-image-store.s3.amazonaws.com/0/117772/fb6f9333-adda-8bbb-571c-9de9a64298f4.png)

## Confirmする

Subscriptionを作成すると、Teamsの指定したチャネルにメッセージが届きます。


![2017-08-18_14h17_05.png](https://qiita-image-store.s3.amazonaws.com/0/117772/8ad4ba5c-aaae-487a-acca-08411ffd5fff.png)


メッセージ中の”Confirm Subscription”リンクをクリックすると、以下のページがブラウザで表示され、通知が届くようになります。

![2017-08-18_14h18_27.png](https://qiita-image-store.s3.amazonaws.com/0/117772/65cc6c85-7ef6-bab0-900c-36db4b1a2970.png)

# CodePipelineを実行する

CodePipelineを実行し、手動承認待ちの状態になると、Teamsにメッセージが届きます。

![2017-08-18_15h09_36.png](https://qiita-image-store.s3.amazonaws.com/0/117772/434d67dc-9a74-891f-be4c-35a35682822e.png)



これで十分通知の役割は果たしているのですが、Teams上の見た目をもう少しいい感じにするために、Lambda経由での通知を次の記事では書きます。
sync.MutexとDIコンテナを使う時の注意点

実際にやってしまったので戒めのためにメモしておきます。

DIコンテナで生成されるstructはシステムグローバルなシングルトンとして扱われ、２つ以上のリクエストをまたいで同じオブジェクトが参照される。つまり、DIコンテナの内部では２回目にstructを生成する時は、１回目に生成したstructをそのまま引き渡している。

もし、プロパティに「sync.Mutex」を持ったstructがDIコンテナによって生成され、同時に２つのプロセスがそのstructを参照すると、１つのsync.Mutexを共有して使ってしまうことになるので、片方のプロセスがMutex.Block()したまま処理を終了すると、もう片方のプロセスのMutex.Block()が永遠にBlockしたままになってしまう。
これは「sync.WaitGroup」でも同じ危険性がある。
kotlinでandroidのtextdrag

##概要
TextViewを長押しでドラッグする

```kotlin:MainActivity.kt
import android.os.Build
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.support.annotation.RequiresApi
import android.view.View

class MainActivity : AppCompatActivity() , View.OnLongClickListener {
    lateinit var  vi : View
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        vi = findViewById(R.id.text)
        vi.setOnLongClickListener(this)
    }
    @RequiresApi(Build.VERSION_CODES.N)
    override  fun onLongClick(v : View): Boolean {
        v.startDrag(null, View.DragShadowBuilder(v), v, 2)
        return true;
    }
}

```

```xml:activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.nimani.drag.MainActivity">

    <TextView
        android:id="@+id/text"
        android:layout_width="121dp"
        android:layout_height="66dp"
        android:text="Hello World!"
        android:textSize="30sp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        tools:layout_editor_absoluteX="109dp" />

</android.support.constraint.ConstraintLayout>

```
それだけ
新たにEC2インスタンスを立ち上げてデプロイするまでの順序

AWSのインスタンスを立ち上げるなんて毎日やるわけでもないので、やるたびに忘れてしまいますよね。ちなみに今のいままでほぼ完全に忘れていました。以前一回やったことがあったのですが、数ヶ月前だし、一回しかやったことないし。

そこで、備忘録的にメモしておこうかと。

# 登場人物
- ruby on Rails
- capistrano
- AWS
- itamae

# 手順をば
大まかには以下の通り。
1. インスタンスをつくる
2. itamaeを新たに作成したインスタンスに向けて実行する
3. capデプロイコマンドを実行する
4. EC2インスタンスのドメインを変更する(Route 53) 


## 1. インスタンスをつくる
詳細なインスタンスの各種設定は他のQiita記事やドキュメントに譲ります。だいたいは既存のインスタンスを複製する（「同様のものを作成」っていうボタン）パターンが多いのかなと。

が、新規でインスタンスをつくる際にいくつか注意すべき点があるのでそれらを特記しておきます。
### pemファイルをダウンロードする
既存のキーペアを使う場合でもそうですが、AWSで保存しているパブリックキーとの照合を行うために、必要なのでこれは絶対にとっておく必要があります。チームで共有しておいた方が良いです。これ無くした場合、インスタンス作ったものの入れないよーん…ということになります。

コレはあとでEC2インスタンスにssh接続するときに必要なので、消さないように作業ディレクトリにでも一時的に保管しておきます。が、itamaeなどで管理している場合は必要ないかもしれません。下記に記載の通り、GitHubで公開鍵を設定しておけば、それ経由でssh接続できるためです。

### 公開鍵を用意しておく
詳細は以下のリンクなどを参照してください。EC2インスタンスにパスなしでコマンド入力して入れるようにするために必要です。プロジェクトメンバー全員で共有するなら、シートか何かにまとめておくと良いかも。
[4.3 Git サーバー - SSH 公開鍵の作成](https://git-scm.com/book/ja/v1/Git-%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC-SSH-%E5%85%AC%E9%96%8B%E9%8D%B5%E3%81%AE%E4%BD%9C%E6%88%90)

新たにインスタンスを作成することができたら、pemファイルと共にssh接続で入っていきます。

```
$ ssh ec2-user@11.222.333 -i ~/.ssh/hogehoge.pem
```

入ってから、`.ssh`ディレクトリを見てみると`/authorized_keys`というファイルがあるので、ここに自分の公開鍵を入れておきます。こうすることであとで行うitamaeで「指定したIPに入れないよー」と怒られることはなくなります。

## 2. 新たに作成したインスタンスに向けてitamaeを実行する
itamaeの作り方は他の記事に譲ります。
おのおのenv環境のnode/以下に環境ごとの設定ファイル（`production.yml`や`staging.yml`など）があると思うので、-yオプションを指定して実行します（いちいちyesと答えていくのは辛い）。

```shell-session
// --dry-runで問題なく通るかをまず確認する
$ bundle exec itamae ssh -u ec2-user -h your_ip_address -y node/staging.yml --dry-run sabaku.rb

// 問題ないことを確認したら実行する
$ bundle exec itamae ssh -u ec2-user -h your_ip_address -y node/staging.yml sabaku.rb
```

## 3. capのデプロイコマンドを実行する
インスタンスにitamaeを流し込んでもろもろ環境が出来たら、今度はGitHubの作業ブランチを指定してデプロイします。
作業ディレクトリ/deploy/以下に環境ごとの設定ファイル（下記コマンドを叩く場合は`fugafuga.rb`が必要）があるので、下記コマンド実行時に指定するのを忘れずに。

```shell-session
// この場合はfugafuga.rbを元にデプロイ
$ BRANCH=hogehoge bundle exec cap fugafuga deploy
```

## 4. EC2インスタンスのドメインを変更する(Route 53) 
デプロイが終わったら、パブリックIPを直打ちしてサイトに行くことはできますが、なんだがいちいちIP書くのめんどくさい。
そこでAWSコンソールに行ってRoute 53というサービスを使います。
ここで、取得したドメインを登録しておけば、そのサブドメインなんかを気軽に登録することができるようになります。
下記に簡単な手順（といっても２点しかないですが）を記載しておきます。

### `Create Record Set`ボタンで新しいレコードセットを作成する
![スクリーンショット 2017-08-18 14.36.42.png](https://qiita-image-store.s3.amazonaws.com/0/156176/cc8ce473-d201-6d1d-6728-cc68e1d62c5b.png)

### レコードセットの設定を行う
Nameの部分の任意のサブドメイン名を入力します。TypeにはDNSレコードの種類を選択します。
Aliasの部分なんですが、Aliasを張らない場合はValueに直にインスタンスのパブリックIPを記入してしまうのが、一番手っ取り早くて簡単かと思います。
![スクリーンショット 2017 08 18 14.36.55.png](https://qiita-image-store.s3.amazonaws.com/0/156176/18d3c3db-764e-ebba-11ae-15d791932638.png)


よし、これで一件落着。
自分で設定したhoge.mydomain.comみたいなURLを叩けば、IP直打ちしたときみたいにサイトにアクセスできるようになります。
これで、次回インスタンスを立てることになっても、大体大丈夫でしょう。
JAVAで文字を結合するとき、プログラムの負荷を少しでも下げる方法

#文字を結合するとき

JavaでSQLのWHERE文を生成したり、
取得したデータから文字列を作成したり・・・よく使いますよね

##ついついやってしまうこと

文字列を結合するとき、ついついやってしまう方法
こんなソース見たことあると思います。。

`code`
String str = "ああああ";
str +=  "いいい";
str +=  "ううう";
str +=  "えええ";
・
・
・
この方法だと、毎回新しく文字列のオブジェクトを生成するのでプログラムの負荷を知らないうちにかけているようです。

#StringBuffer型を使おう！

この方法だとオブジェクトの生成は一回で済むのでプログラムの負荷を減らせるようです。

`code`
StringBuffer sb = new StringBuffer();
sb.append("ああああ");
sb.append("いいい");
sb.append("ううう");
sb.append("えええ");
String str = str.toString();

参考URL
http://qiita.com/lrf141/items/f2fc30214a26dd6ba0b7


#追記:シングルスレッドの場合、StringBuilderが良いようです。

参考URL
http://zudoh.com/archives/429
argparseの数値引数バリデーションチェックで無限個の許容範囲を指定する方法

Pythonスクリプトの引数関連の処理をサポートしてくれる標準ライブラリとしてargparseというものがあります。argparseでは有効な引数をバリデーションチェックも加味して追加できます。
今回はargparseで「数値の有効範囲あり」の引数を指定する方法を記載します。

# argparseの概要
argparseとは、コマンドラインオプションと引数の解析を行なってくれるPythonライブラリです。Python2.7から使用可能で標準ライブラリとして搭載されています(なので、pipをわざわざ使う必要がなく、他のユーザに頒布するときに「このライブラリ入れてね」と追加で記載しなくて済みます)

Python公式ドキュメント argparse
https://docs.python.jp/3/library/argparse.html

この手の解析を行なってくれるPythonライブラリはargparseの他には以下のものがあります。

- docopt.docopt

Pythonistaなら知ってるオプションパーサ
http://qiita.com/petitviolet/items/aad73a24f41315f78ee4

# 許容範囲のチェックを入れる
argparseを使って引数解析の処理を入れるには以下のように実装すればOKです。(以下は整数値オプション「-s」を追加。)

```python:引数チェックsample.py
if __name__ == '__main__':
    parser = argparse.ArgumentParser(description='LightsOut Solver')
    parser.add_argument('-s', type=int, help='LightsOut Size')

```

`ArgumentParser#add_argument`の引数`type`にstringやintと指定すれば引数として指定された値がその型として扱うことができるかチェックしてくれます。

上記のような引数追加の条件として「許容範囲」を指定するためには、`ArgumentParser#add_argument`の引数`choice`に許容範囲を示す値を入れればOKです。

```python:引数チェックsample2.py
if __name__ == '__main__':
    parser = argparse.ArgumentParser(description='LightsOut Solver')
    parser.add_argument('-s', type=int, choice=range(1,6), help='LightsOut Size')

```

しかし、このchoiceにベタに値を指定できるのは「配列表現できるもの」に限ります。つまり有限個の範囲しか絞り込めません。無限個の範囲(たとえば「2以上の整数」とか「0以上1以下の実数」とか)を指定するには、「範囲を指定する配列」でなく「許容される値かどうかを判定するfunction」を指定すればOKです。
以下に、「2以上の整数」を範囲として指定するサンプルコードを記載します。

```python:引数チェックsample3.py
class range_check(object):
    def __init__(self, low_limit=None, high_limit=None, vtype="integer"):
        self.min = low_limit
        self.max = high_limit
        self.type = vtype

    def __contains__(self, val):
        ret = True
        if self.min is not None:
            ret = ret and (val >= self.min)
        if self.max is not None:
            ret = ret and (val <= self.max)
        return ret

    def __iter__(self):
        low = self.min
        if low is None:
            low = "-inf"
        high = self.max
        if high is None:
            high = "+inf"
        L1 = self.type
        L2 = " {} <= x <= {}".format(low, high)
        return iter((L1, L2))

if __name__ == '__main__':
    parser = argparse.ArgumentParser(description='LightsOut Solver')
    parser.add_argument('-s', type=int, choices=range_check(low_limit=2), help='LightsOut Size')

```

なお、このコードを使って組み上げたサンプルプロジェクトをいかに記載します。
https://github.com/LyricalMaestro/lightsout-solver-python

# まとめ
チェック用のメソッドを駆使すれば、argparseを使って自由度の高いvalidation checkができます。素晴らしいスクリプト作成に活用してみてください。

# 参考文献

Python公式ドキュメント argparse
https://docs.python.jp/3/library/argparse.html

Pythonistaなら知ってるオプションパーサ
http://qiita.com/petitviolet/items/aad73a24f41315f78ee4
特定のSSIDの電波強度RSSIを表示する（mac）

macにはiwconfigがないので作る。
:::cd ../../usr/local/bin
:::sudo nano iwconfig

```shell-session:iwconfig
#!/bin/sh

/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -s

```
:::sudo chmod a+x iwconfig 

できてるはず。
iwconfig叩いて確認しましょ。

私はプログラムの中で使うので↓のようにテストしました。

```python:test.py
import subprocess as spc
rest=spc.check_output("iwconfig")
list=rest.split()
ss=list.index("探したいSSID")
ss=ss+2
RSSI=abs(int(list[ss]))
print(RSSI)
```

０に近い方が電波強度強いらしい

python上でコマンド動かして出力を整形してるだけ（強引）
Node.jsでブロードキャストアドレスを取得する

Node.jsを実行している環境でネットワークの[ブロードキャストアドレス](https://ja.wikipedia.org/wiki/ブロードキャストアドレス)を取得したかったので、やり方を調べてみました。[ip](https://www.npmjs.com/package/ip)モジュールを使うと簡単にできました。
参考：[Stackoverflow - Get local IP address in node.js](https://stackoverflow.com/questions/3653065/get-local-ip-address-in-node-js)
複数のネットワークが存在することを考慮して、配列で返すようにしています。

```js
const ip = require('ip');
const os = require('os');

function getBroadcastAddresses() {
  let ifaces = os.networkInterfaces();

  let results = []

  Object.keys(ifaces).forEach(function (ifname) {

    ifaces[ifname].forEach(function (iface) {
      if ('IPv4' !== iface.family || iface.internal !== false) {
        // skip over internal (i.e. 127.0.0.1) and non-ipv4 addresses
        return;
      }

      let broadcastAddress = ip.or(iface.address, ip.not(iface.netmask))
      results.push(broadcastAddress)
    });
  });

  return results
}
```

```js:使い方
let broadcastAddress = getBroadcastAddresses()
console.log(broadcastAddress) // ['192.168.10.255'] とかが取れる
```
GO/GAE + TaskQueue + Dataflow + Bigquery でログ収集基盤のLTしてきた


[【一休 × JapanTaxi】サービスを支えるデータ分析基盤](https://ikyu.connpass.com/event/63408/) でLTさせていただきました。以下資料です。

https://speakerdeck.com/munaita_/spinappwozhi-erudetashou-ji-ji-pan


## イベント感想
- ログ収集はKinesis -> lamda とか fluentd あたりをつかってRedshift or BigQueryに行く構成が多かった
- 既存の資産との共存が結構肝になってたりする
- システム構築の背景から聞くとログ収集基盤とかのお話は大変趣深いなと思った
- 運営の方ありがとうございました
viewDidAppear後にUICollectionReusableView/Headerの縦サイズを変更する

stackoverflowにも書いちゃったけど自己解決。
https://stackoverflow.com/questions/45747953/when-uicollectionviewflowlayout-is-used-can-i-change-the-vertical-size-of-the-h


func collectionView(_ collectionView: UICollectionView,layout collectionViewLayout: UICollectionViewLayout,referenceSizeForHeaderInSection section: Int) -> CGSize {
が最初によばれるでしょ。
困るわー

storyboardでUICollectionViewにtag=1しておくこと

```
class testo: UIViewController,UICollectionViewDataSource,UICollectionViewDelegate,UICollectionViewDelegateFlowLayout {
var xxx:CGFloat=1000
.
.
override func viewWillAppear(_ animated: Bool) {
}
override func viewDidAppear(_ animated: Bool) {
    xxx=2000
    let aa = self.view.viewWithTag(1) as! UICollectionView
    aa.reloadData()
}

func collectionView(_ collectionView: UICollectionView,
                    layout collectionViewLayout: UICollectionViewLayout,
                    referenceSizeForHeaderInSection section: Int) -> CGSize {
    return CGSize(width:self.view.frame.width, height:xxx)
}
```
WebアプリでFacebook/Twitterシェア機能の表示がおかしかった場合にやること

例えば、こんな事が起きたとする

* Htmlのog:imageを変更して、Facebookでシェアしたのに、画像が古い
* twitter:image:srcを変更して、Twitterでシェアしたのに、画像が古い

上記の場合、そのページに対してFacebook/Twitterがページクロールして以前のページをキャッシュしている。
そういうときはキャッシュを消してあげる。

## Facebookの場合
キャッシュを消すツールを提供しているので、それを使用する。

<https://developers.facebook.com/tools/debug/og/object/>

このツールの入力欄に、キャッシュを消したいURLをコピペし
「新しいスクレイピング情報を取得」というボタンをクリック。

これでキャッシュは消えたはずなので、もう1回シェアして確認する。
ブラウザキャッシュなどあるので確認の際は注意。

## Twitterの場合
キャッシュを消すツールを提供しているので、それを使用する。

<https://cards-dev.twitter.com/validator>

このツールの入力欄に、キャッシュを消したいURLをコピペし
「Preview card」というボタンをクリック。

これでキャッシュは消えたはずなので、もう1回シェアして確認する。
ブラウザキャッシュなどあるので確認の際は注意。
日本goss使ってみる会

# これは何？

goss というサーバー検証ツールの使い方とかを日本語でアウトプットしていく会です。いわゆる「日本○○ユーザーズグループ」みたいなもんですが、ユーザーズグループみたいにしっかりとしたものを発足したわけでもなく、ただ単に日本語情報を発信して goss の利用者が増えるといいなぁ…というボンヤリとした思いで作りました。

ということで、このアカウントで日本語情報などをここに書いていく予定です。

* [gossを使ってみよう](http://qiita.com/goss-ja/items/0084927c221e7263089c)

と、ここまで書いてから既に他の人たちが goss について書いていることに気付きました。f^^;

* [kt_higa](http://qiita.com/kt_higa)さんの[テストツール goss導入・使用メモ](http://qiita.com/kt_higa/items/d3d452e43618014d2721)
* [kyanon30](http://qiita.com/kyanon30)さんの[dockerコンテナ自動テストツール dgossを使ってみた](http://qiita.com/kyanon30/items/9ad2ceb4933b85f96c0a)
CentOS7　Dynamic DNS サービスでドメインの取得と DiCE の設定

# はじめに
ドメインを取得します。

- Dynamic DNS（MyDNS）サービスでドメインを取得する
- MyDNS で登録した [domain] [username] [password] を控えておく
- お名前.com などでドメインを取得（1,000円/年程度）した場合、DiCE は不要

# 設定手順
## DiCE
概要
　・Dynamic DNS サービスに自サーバのIPアドレスを通知する DiCE をインストール
　・1日1回、IPアドレスを通知するように設定

wget パッケージと glibc パッケージをインストール

~~~
yum -y install wget
yum -y install glibc
~~~

DiCE をダウンロードし、解凍

~~~
cd /usr/local/bin
wget http://www.hi-ho.ne.jp/cgi-bin/user/yoshihiro_e/download.cgi?p=diced019
tar xzvf download.cgi\?p\=diced019
rm -f download.cgi\?p\=diced019
cd
~~~

DiCE の設定
※DiCEは出力がEUC-JPとなっているので使っているターミナルソフトの文字コードを「EUC-JP」に変更すること

~~~
setarch `uname -m` /usr/local/bin/DiCE/diced
~~~
~~~Text:setup
:setup
IPアドレスの検出方法を指定してください
(0) 自動検出
(1) ローカルのネットワークアダプタから検出
(2) 外部のスクリプトから検出
<現在:0>
(N)変更しない  (P)戻る
>0
-------------------------------------------------
プライベートIPアドレスも検出対象ですか？ (Y/N)
<現在:いいえ>
(P)戻る
>N
-------------------------------------------------
IPアドレスの検出をテストしますか？ (Y/N)
(P)戻る
>N
-------------------------------------------------
IPアドレスをチェックする間隔を指定してください(分)
設定可能範囲は5分以上です
<現在:60>
(N)変更しない  (P)戻る
>60
=================================================
DNSサーバーの負荷を軽減するために頻繁なDNS更新を防ぐ必要があります
前回の更新から一定時間DNS更新処理を行わないように保護時間を設定して
ください(分)  設定可能範囲は10分から1440分です
<現在:60>
(N)変更しない  (P)戻る
>60
=================================================
設定を保存しますか? (Y/N)
(P)戻る
>Y
設定を保存しました
=================================================
~~~
~~~Text:add
:add
新しくイベントを追加します

DynamicDNSサービス名を入力してください
"?"で対応しているサービスを一覧表示します
(P)戻る
>MyDNS.JP
-------------------------------------------------
<< MyDNS.JP >>
URL: http://www.mydns.jp/
*** 情報 ***
ドメイン名、ホスト名についてはマスターID(ユーザー名)にて管理されています。
IPアドレスはサーバー側で自動検出します。
（これらは入力しても無視されます）
=================================================
ドメイン名を入力してください
"?"でドメイン一覧を表示します
(P)戻る
>[domain]
=================================================
ホスト名を入力してください
(P)戻る
>[domain]
=================================================
ログインユーザ名を入力してください
(P)戻る
>[username]
=================================================
ログインパスワードを入力してください
(P)戻る
>[password]
=================================================
登録するIPアドレスを入力してください
空白にすると現在のIPアドレスを自動検出します
(P)戻る
>
=================================================
このイベントに題名を付けてください
(P)戻る
>MyDNS
=================================================
このイベントを実行するスケジュールを設定します
-------------------------------------------------
実行する頻度を指定してください (番号入力)
(0)１回のみ (1)１日１回 (2)１週間に１回 (3)１ヵ月に１回
(4)その他の周期 (5)IPアドレス変化時 (6)起動時
(P)戻る
>1
-------------------------------------------------
時刻を指定してください
入力例) 23:05
(P)戻る
>23:05
=================================================
=================================================
このイベントを有効にしますか? (Y/N)
(イベントの有効/無効は"EN/DIS"コマンドで切替えられます)
>Y
=================================================
イベントを保存しますか? (Y/N)
>Y
イベント"MyDNS"を保存しました
=================================================
~~~
~~~Text:quit
:quit
~~~

Diced を起動する

~~~
setarch `uname -m` /usr/local/bin/DiCE/diced -d -l
~~~

起動スクリプトに登録する

~~~
echo "setarch `uname -m` /usr/local/bin/DiCE/diced -d -l" >> /etc/rc.local
~~~

# 次回予定
apache で Web サーバを構築する
ファイル転送が異常終了したらどうなるか

システム間でファイルを受け渡すにあたり、その転送が異常終了したらどうなるのか検証した。

# TL;DR

- cp の場合、コピー先に中途半端なファイルが出来上がる。
- ftp の場合、転送先に中途半端なファイルが出来上がる。
- scp の場合、(調べてない。編集リクエスト募集)
- HULFT の場合、(調べてない。知っている方は教えてください)
- sftpの場合、(調べてない。編集リクエスト募集)
- (そのほか知ってる/知りたいファイル転送方法があれば編集リクエストで教えてください)

# 確認手順

## ftp

手元にあった Windows10 に入れた BlackJumboDog を FTPサーバとし、Git Bash に入っている Curl で FTP転送しつつ、ぶった切ってみた。

```shell-session
$ yes | curl ftp://username:passw0rd@localhost/dest.txt --upload-file -
別シェルから
$ kill -9 curlのPID
```

結果、中断した時点までのファイルが出来た。

## cp

手元にあった Windows10 に入っていた Git Bash に入っている cp でコピーしつつ、ぶった切ってみた。

```shell-session
$ cp hugefile.txt hugefile2.txt
別シェルから
$ kill -9 cpのPID
```

結果、コピー元より小さいサイズのファイルが出来た。

## (そのほかの転送方法をここに追記する)

(ATDK)


# 発生し得る問題

- 送信先システム側でファイルをポーリング監視しつつつ、受信後に何らかの処理をしている場合、中途半端なファイルを使って勇み足で動き出してしまう。
- JP1/AJSのファイル監視ジョブは、ファイル転送中(他のプロセスがまだつかんでいる場合) は待ってくれる。らしい。

# 考えられる対策

- 巨大ファイル転送中は一時ファイル名としておき、完了後にリネームする。
- 巨大ファイル転送後に、別名のファイルをサイズゼロで作成して、それを完了フラグとして扱う。
- FTPサーバの転送完了ログをトリガーとする。
- FTPサーバの機能を使う。 JP1/FTP/FTSの伝送カードは完了時だけ動作する。らしい。一方、リネームではトリガーしされないのがめんどい

- - -

# 残確認事項

- BlackJumboDogではなく、IISのFTPサーバだとどうなる?
- LINUXだとどうなる?
- ファイルシステムによっても違うのか
- S3とかは?
- HTTP POSTのときは?
- TWSとか Senjuとか Hinemosとか SystemWalkerだと?
- バッファサイズとの関係があるか。サイズがある程度小さければ考慮不要なのか、合計2byte中の1byteだけ飛んでしまうのか。
PHP Encrypt and Decrypt

メモ : 暗号化/復号化
----
```php
$key = 'password to (en/de)crypt';
$string = ' string to be encrypted '; // note the spaces
```

# To Encrypt:
```php
$iv = mcrypt_create_iv(
    mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC),
    MCRYPT_DEV_URANDOM
);

$encrypted = base64_encode(
    $iv .
    mcrypt_encrypt(
        MCRYPT_RIJNDAEL_128,
        hash('sha256', $key, true),
        $string,
        MCRYPT_MODE_CBC,
        $iv
    )
);
```

# To Decrypt:
```php
$data = base64_decode($encrypted);
$iv = substr($data, 0, mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC));

$decrypted = rtrim(
    mcrypt_decrypt(
        MCRYPT_RIJNDAEL_128,
        hash('sha256', $key, true),
        substr($data, mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC)),
        MCRYPT_MODE_CBC,
        $iv
    ),
    "\0"
);
```
Vagrantの共有フォルダ設定時にエラーが出た時の対処(CentOS/7,v1611.01)

Qiita初投稿です。Vagrantfileで共有フォルダを設定したらエラーが出て止まったので、その時の原因と対処法を残しておきます。

## 環境
vagrant boxの種類。(Vagrantfileの設定)。さくらVPSも使用しているのでそちらのCentOS7のバージョンと合わせています。

* vagrantのバージョン:1.9.7
* config.vm.box = "centos/7"
* config.vm.box_version = "1611.01"

共有フォルダ設定で次の一文を記載すると下記のエラーが発生  

    config.vm.synced_folder "./provisioning/share", "/home/share"

```php:エラーメッセージ
Vagrant was unable to mount VirtualBox shared folders. This is usually
because the filesystem "vboxsf" is not available. This filesystem is
made available via the VirtualBox Guest Additions and kernel module.
Please verify that these guest additions are properly installed in the
guest. This is not a bug in Vagrant and is usually caused by a faulty
Vagrant box. For context, the command attempted was:

mount -t vboxsf -o uid=1000,gid=1000 home_vagrant_share /home/vagrant/share

The error output from the command was:

mount: unknown filesystem type 'vboxsf'
```

どうもGuest Additionsに問題がありそう。

## 原因
vagrant up後のメッセージを読み返すと、以下のメッセージを見逃していました。

```
==> default: Checking for guest additions in VM...
    default: No guest additions were detected on the base box for this VM! Guest
    default: additions are required for forwarded ports, shared folders, host only
    default: networking, and more. If SSH fails on this machine, please install
    default: the guest additions and repackage the box to continue.
```

そもそもGuest Additionsがこのボックスにはないと言われてますね。

## 対処
Guest Additionsをインストールするため以下のプラグインを追加。[詳細](https://github.com/dotless-de/vagrant-vbguest)

    $ vagrant plugin install vagrant-vbguest

再度vagrant upを実行すると途中で以下の一文があったので無事にインストールされた模様。

    Installing Virtualbox Guest Additions 5.1.22 - guest version is unknown

問題なく共有フォルダの設定が出来てvagrantが起動しました。
esa.io > HOME > Recently updatedペインの表示 > ブラウザの横幅が1150程度以上で表示される

```txt:動作環境
Windows 7 Pro (32bit)
Google Chrome バージョン: 60.0.3112.101（Official Build） （32 ビット）
```

esa.ioというナレッジベースのサービス。

HOMEを選択時、選択したカテゴリの一覧が表示される。
実は、ブラウザの横幅がある値（1150程度?)以上になると、右側に「Recently updated」というペインが現れる仕様でした。
(1920ピクセルの横幅にて2等分で使っていたため、気づかなかった。。。）

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/902e5262-2ad2-cb11-edaa-c06b12605e34.png)

この「Recently updated」ペインに表示されるのは全カテゴリの内容のようだ。
【Eclipseプラグイン】ER図用GUIエディタER Masterのファイルが開けなくなった場合の対応方法

#現象
ER Masterのファイルが開けない。
特定の条件下でファイルが肥大化し、ファイルが開けなくなる模様。
https://teratail.com/questions/24091

#原因
ER Masterのバグが原因で重複行が大量に生成されていた

`
			<columns>
				<normal_column>
					<id>16</id>
					<referenced_column>47</referenced_column>
					<referenced_column>47</referenced_column>
～以下、同じ内容が約30万行続く～
					<relation>1</relation>
～以下、同じ内容が約30万行続く～
`

#対応方法
重複行の削除

##サクラエディタを使う
1.サクラエディタでxxx.ermを開く。
2.「Ctrl」+「a」で全選択。
3.「Alt」＋「m」で重複行削除。

###参考URL
http://shota184ne.com/204

##（linux環境がある場合）uniqコマンドを使う
以下コマンドを実行して重複行削除ファイルを別名で保存

`uniq xxx.erm > 保存したいファイル名.erm`

#結果
ファイル展開時に固まらなくなった。

#懸念
根本的解決ではないので再発する可能性あり。
PhpStormの日本語化(Windows環境・Pleiades利用）

### 2019.09.06 現在、この方法では日本語化できない場合があります

私の環境では Rubymine 2019.1 より この内容を適用するとRubymineが起動しませんでした。
pleiades公式インストーラで日本語化できるようなので、そちらをお試しください。

pleiades http://mergedoc.osdn.jp/
参考記事 https://qiita.com/daigoro7/items/00819e5686f6c4d682f8

----

# はじめに

PhpStorm の日本語化の手順を紹介します。
※ [WillBrains](http://www.willbrains.jp/) の [日本語化マニュアル](http://www.willbrains.jp/page/4) を参考にしています。

JetBrains系のIDEであれば同様の手順で日本語化できます。
（WebStorm, RubyMineは確認済み）

実行環境: Windows10/PhpStorm2017.02

### 1. Pleiades をダウンロードして解凍

1. [Meagedoc project](http://mergedoc.osdn.jp/#pleiades.html#PLUGIN) にアクセス
2. Pleiadesの最新版zipファイルをダウンロード
3. **浅い階層で** 解凍する。自分は `C\tmp` フォルダ内で作業した。  
※ 解凍はWindowsエクスプローラーで行う。Lhaplusだと上手くいかない。
4. plugins/ **jp.sourceforge.mergedoc.pleiades** フォルダを確認  
![image.png](https://qiita-image-store.s3.amazonaws.com/0/151078/eda91af4-fc9e-e055-c97d-16cfa48e849a.png)

### 2. PhpStorm 構成ディレクトリに配置

1. **構成ディレクトリ** `C:\Users\{ユーザー名}\.PhpStorm{バージョン}` を開く
    - 隠しフォルダになっている可能性があるので注意
2. **jp.sourceforge.mergedoc.pleiades** フォルダをコピーして配置  
![image.png](https://qiita-image-store.s3.amazonaws.com/0/151078/d9bab7ed-daf3-fa75-84cb-a11adb699d3a.png)

### 3. カスタム VM オプションファイルを編集

1. PhpStormを起動
2. Help > Edit Custom VM Options... を開く
    * vmoptionsファイルを新規作成します 的なメッセージが出る
3. `C:\{構成ディレクトリ}\config\phpstorm64.exe.vmoptions` を開く
    * たぶん **2.** の操作で既に編集状態になっている
4. 最下部に設定を記載

```
-Xverify:none
-javaagent:C:\\{構成ディレクトリ}\\jp.sourceforge.mergedoc.pleiades\\pleiades.jar
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/151078/4dca0106-de77-6509-19bd-29dc5c4d91e9.png)

### 4. PhpStormを再起動

再起動後、日本語化されます。

----

参考になりましたら **いいね** をおねがいします 🙄

### 参考

http://qiita.com/cypher256/items/a87179fbe8dd7f63ec4e

2018.09.14 手順を簡略化した記事を投稿しました。とりあえず日本語化したい人は以下からどうぞ。
[超簡単２ステップ Windows IntelliJ IDEAの日本語化](https://qiita.com/tmak_tsukamoto/items/752ab458bf615ba722eb)
SharePointOnlineの5000件問題メモ

# オンプレなら閾値、Onlineなら制限

SharePointにはリスト・ライブラリが5000件に達すると色々と問題が起こります。
登録できるアイテムの最大数は3000万なのですが、システム上問題がおこならないように制限をかけているようです。
ただし、オンプレ環境であれば管理者が設定を変更できますが、Onlineだと変更ができません。
なので何かしらの工夫をする必要があります。

# フィルターしてしまう
基本的な問題として「5000件を超えたデータは正常な表示がされない」というのがありますので、フィルタリングして5000件を超えない表示にしてしまおうということです。

ビューの設定のなかにフィルターの項目があるので、登録日時が1ヶ月分とかにしてフィルタリングしましょう。

1. 変更したいリスト・ライブラリを開く
2. 画面右上の歯車メニュー、もしくはリボンメニューのリスト・ライブラリから「リストの設定」または「ライブラリの設定」をクリック
3. 「ビュー」の項目で使用しているビューをクリック
4. 「フィルター」の項目で「次の条件に該当する場合だけアイテムを表示する」にチェック
5. 必要な情報がフィルタリングできるように条件を設定
6. 「OK」をクリック
Ruby Tips(自分用メモ)

# 配列

### [20170818] 10~16までのスクリプト実行ごとに変わるランダムな配列

```ruby:a.rb
h_concentration =  []

for num in 0...10 do
  h_concentration.push((rand(10000..16000)/1000.0).round(1))
end

p h_concentration
```
```
$ ruby a.rb 
[12.4, 14.4, 12.0, 15.8, 10.9, 14.9, 11.2, 16.0, 10.0, 13.2]
$ ruby a.rb 
[14.2, 14.1, 14.2, 13.1, 13.7, 10.1, 11.8, 15.3, 10.9, 10.6] 結果が変わる
```

### [20170818] 10~16までのスクリプト実行ごとに変わらないランダムな配列

```Ruby:b.rb
  1 h_concentration =  []
  2 init_seed = 12345
  3 b = 0
  4 total = 10
  5 
  6 for num in 0...total do
  7   prng1 = Random.new( num == 0? init_seed : b )
  8   prng1.seed
  9   b = prng1.rand(10000..16000)
 10   h_concentration.push((b/1000.0).round(1))
 11 end
 12 
 13 p h_concentration
```

```
$ ruby bb.rb 
[14.6, 14.2, 15.1, 13.3, 13.9, 14.4, 14.2, 14.1, 11.8, 15.2]
$ ruby bb.rb 
[14.6, 14.2, 15.1, 13.3, 13.9, 14.4, 14.2, 14.1, 11.8, 15.2]　結果が変わらない
```

頂いたコメントをもとに書き直してみたやつ。

```Ruby:bb.rb
  1 init_seed = 12345
  2 
  3 prng1=Random.new(init_seed)
  4 #prng1.seed
  5 a = Array.new(10){(prng1.rand(10.0...16.0)).round(1)} "これで10と16の確率が半分になるというのは問題ない？"
  6 p a
```

```
$ ruby bb.rb 
[15.6, 11.9, 11.1, 11.2, 13.4, 13.6, 15.8, 13.9, 14.5, 13.9]
$ ruby bb.rb 
[15.6, 11.9, 11.1, 11.2, 13.4, 13.6, 15.8, 13.9, 14.5, 13.9] 実行ごとにランダム配列の結果が変わらない
```

### [20170818] 等差数列

```Ruby:c.rb
init_value = 9.95
class_interval_width=0.9
max_value = 16.00

i = ((max_value - init_value)/class_interval_width).ceil
class_interval = []

for num in 0...i do
  class_interval.push( (init_value + class_interval_width*num).round(2) )
end

p class_interval
```

```
$ ruby c.rb 
[9.95, 10.85, 11.75, 12.65, 13.55, 14.45, 15.35]
```

c.rbと同じことを簡単に実現する。

```Ruby:cc.rb
init_value = 9.95
class_interval_width=0.9
max_value = 16.00

class_interval = init_value.step(max_value, class_interval_width).map{|i| i.round(2)}

p class_interval

```

```
ruby cc.rb 
[9.95, 10.85, 11.75, 12.65, 13.55, 14.45, 15.35]
```

# [20170818] 配列内の最小要素の位置を取得

```Ruby
irb(main):020:0> a=Array.new(10){rand(0..100)}
=> [72, 84, 98, 14, 50, 81, 18, 36, 16, 67]
irb(main):021:0> a.each_with_index.map{|v, i| v == a.min ? i : nil}.compact
=> [3]
```

# [20170822] find_index

```ruby
irb(main):024:0> a
=> [10.0, 10.9, 11.8, 12.7, 13.6, 14.5, 15.4]
irb(main):026:0> a.find_index{|i| i >= 11}.to_i
=> 2
```

# [20170822] do

```ruby:d.rb
a = (1..10).map do |x|
  x*3
end

p a
```

```
$ ruby d.rb
1
2
3
4
5
6
7
8
9
10
[3, 6, 9, 12, 15, 18, 21, 24, 27, 30]
```

# [20180629]

```ruby
irb(main):001:0> str="abcdefghi"
=> "abcdefghi"
irb(main):002:0> str.split(//,3)
=> ["a", "b", "cdefghi"]
irb(main):003:0> str.scan(/.{3}/)
=> ["abc", "def", "ghi"]
irb(main):004:0> str.match(/.{3}/)
=> #<MatchData "abc"> 
p "abcde-fghijklmno-pqrstuv,wxyz".delete("f-u,-")
=> "abcdevwxyz"
irb(main):020:0> str = "Ruby"
=> "Ruby"
irb(main):021:0> str[0..-2].swapcase
=> "rUB"
```

随時追加。よりよい書き方、方法があれば教えてください。
serverless frameworkでDynamoDB streamsとトリガーの登録をする

以下の記事などが投稿された頃にはできなかった
「eventsでFn::GetAttを使ってDynamoDBのstreamsと紐付ける」
が今はできるようになっている。

[serverless frameworkでDynamoDBとLambdaのイベントを関連付ける](http://qiita.com/abtc/items/d1aa34ee7684d0c47d07)
[Serverless Frameworkでやったことをまとめてみた](http://qiita.com/YukiYonekura/items/f3f477439455c6ec9eb6#dynamodb)

[PR #3111](https://github.com/serverless/serverless/pull/3111)で対応したっぽいのでバージョン1.9以降なら使える。

上記のPRや[Docs](https://serverless.com/framework/docs/providers/aws/events/streams/)に記述されているように、以下のように定義する

```yaml
functions:
 Hello:
    handler: handler.hello
    events:
      - stream:
          type: dynamodb
          arn:
            Fn::GetAtt:
              - MyDynamoDbTable
              - StreamArn
# ...

resources:
  Resources:
    MyDynamoDbTable:
      Type: "AWS::DynamoDB::Table"
      Properties:
        TableName: my-table
        AttributeDefinitions:
          - AttributeName: id
            AttributeType: N
        KeySchema:
          - AttributeName: id
            KeyType: HASH
        ProvisionedThroughput:
          ReadCapacityUnits: 1
          WriteCapacityUnits: 1
        StreamSpecification:
          StreamViewType: NEW_AND_OLD_IMAGES
```
【Mac】Pagesを使って数式を入力する

#この記事について

本記事は、統計学を学習中の自分が大学ノート以外にもiOS,OSXで簡単にノートまとめができないかと思い、調べた内容です。

主に、
・Pagesを使って数式を入力する方法
・代表的な数式の入力例
となっています。

#Pagesで数式を入力するには

1. まずは下図のようにPagesの挿入を選択します。
![スクリーンショット 2017-08-18 11.31.14.png](https://qiita-image-store.s3.amazonaws.com/0/124071/3fa302bd-f76c-0680-110e-ef71f086c6ba.png)

2. 挿入＞方程式を選択します。
![スクリーンショット 2017-08-18 11.33.40.png](https://qiita-image-store.s3.amazonaws.com/0/124071/13ac474d-297a-e6d1-691b-034a5bfffcfa.png)

3. 方程式入力画面が表示されました。
![スクリーンショット 2017-08-18 11.37.40.png](https://qiita-image-store.s3.amazonaws.com/0/124071/eb77069d-7a16-991c-ee45-6f579859bc52.png)


#数式の入力例

こんなのとか
![スクリーンショット 2017-08-18 11.40.45.png](https://qiita-image-store.s3.amazonaws.com/0/124071/4778496e-f736-6fcd-a99b-66d11c26403a.png)

こんなのも
![スクリーンショット 2017-08-18 11.42.24.png](https://qiita-image-store.s3.amazonaws.com/0/124071/70796366-8180-6efc-a46f-154471d21ddf.png)

#実はApple Supportに記事があった…
https://support.apple.com/ja-jp/HT202501

色も変えられたりとわかりやすい資料やノート作りに活かせそうです。
どうしても大学ノートにとってると字が汚くなるので、
これだけは忘れたくないものをきれいにまとめておくのも良さそうです。

#Appleの記事に載っていない記号など（順次更新予定）

平均（エックスバー）
![スクリーンショット 2017-08-18 12.02.31.png](https://qiita-image-store.s3.amazonaws.com/0/124071/5f1fec70-d4bd-a5b4-3fb7-a1fdaf1d346d.png)
Windows PCのバックアップをddで取るとき、事前にntfswipeしておくと容量を減らせるよ

# 要旨

PCをHDDまるごとバックアップしたいとき、LinuxのLive USBを使ってddで取り出す方法がある。

このとき時間に余裕があるなら、ntfswipeを使って空き領域を0で埋めることによってgzipでの圧縮効率を高めることができる。

## 手順

今回はKali LinuxのLive USBを使用してLet's note (CF-NX1、HDD: 250GB、Windows 7 Pro 32bit)のバックアップを実施。
リカバリディスクから復旧し、現時点までのWindows Updateをすべて適用した状態で、他に余計なデータは入っていない。Windows上での使用領域は約32GB。

Live USBから起動したら、まずは`lsblk`でデバイス名を確認。

~~~bash
root@kali:~# lsblk
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
loop0    7:0    0   2.5G  1 loop /lib/live/mount/rootfs/filesystem.squashfs
sda      8:0    0 238.5G  0 disk 
├─sda1   8:1    0   2.8G  0 part /lib/live/mount/persistence/sda1
└─sda2   8:2    0 235.7G  0 part /lib/live/mount/persistence/sda2
sdb      8:16   0 232.9G  0 disk 
├─sdb1   8:17   0  14.7G  0 part 
├─sdb2   8:18   0   300M  0 part 
└─sdb3   8:19   0   218G  0 part 
~~~

`/dev/sdb`以下がWindowsがインストールされた領域と回復パーティション。

各パーティションに対して`ntfswipe`を実行。

~~~bash
root@kali:~# ntfswipe -av /dev/sdb1 && ntfswipe -av /dev/sdb2 && ntfswipe -av /dev/sdb3
~~~

`dd`で出力したもの`status=progress`で進捗状況も確認しながら`gzip`で圧縮。

~~~bash
root@kali:~# dd if=/dev/sdb status=progress | gzip -c > CF-NX1GDHYS_BASE.gz
250046562816 bytes (250 GB, 233 GiB) copied, 5024 s, 49.8 MB/s   
488397168+0 レコード入力
488397168+0 レコード出力
250059350016 bytes (250 GB, 233 GiB) copied, 5024.77 s, 49.8 MB/s
~~~

1時間半ほどで無事250GBすべて`dd`から書き出せたので、できあがったgzファイルを確認。

~~~bash
root@kali:~# ls -l
-rw-r--r-- 1 root root 24920396778  8月 17 20:17 CF-NX1GDHYS_BASE.gz
~~~

桁区切りを付けていないので分かりにくいが、出来上がりのファイルの容量は約25GB。
`ntfswipe`をしないで`dd`->`gzip`するとgzファイルが235GB程度だったので、大幅に容量を削減できた。

※ HDではなくSSDの場合は書き込み寿命を縮めてしまうので要注意
Goの開発環境構築(mac版)

#MacにGoの開発環境を作る
macにGoの開発環境を作った時の作業メモです。

#諸元
- macOS Sierra 10.12.6（16G29）
- goenv 1.0.0
- go version go1.8.3 darwin/amd64
- vim version 7.4.8056

#goenvをインストール
今回は、調査のためにGoのバージョンを切り替えて試す必要があるのでgoenvを入れた。
cf. [Golangをgoenvを使ってインストールしてみた](http://qiita.com/walkers/items/761b2a5e58849176a633)
Goのバージョンは最新版の1.8.3

```
$ goenv versions
  system
* 1.8.3 (set by /Users/yamatmoo/.goenv/version)
```

goenvでバージョン指定すると、GOROOTは以下のようになってるはず

```
$go env GOROOT
GOROOT="/Users/yamatmoo/.goenv/versions/1.8.3"
```

# Vimのカスタマイズ
Go Syntaxが使いたいので、プラグインをインストール
cf.[VimでGoの開発環境を設定する方法のまとめ](http://qiita.com/koara-local/items/6c886eccfb459159c431)

自分の場合は .vimrcに以下の項目を追加した。

```
let g:netrw_altv=1
let g:go_highlight_functions = 1
let g:go_highlight_methods = 1
let g:go_highlight_structs = 1

"### errをハイライトしたい
autocmd FileType go :highlight goErr cterm=bold ctermfg=214
autocmd FileType go :match goErr /\<err\>/
```

ほんとに便利な時代になったな。