OmniAICreator/Qiita-1.07M huggingface dataset:
CloudWatch AgentでCloudWatch Logsに転送するログファイルのエンコードを指定する

# 結論
パラメータストアのjsonに `encoding` を追加して適用します。

```json
{
    "logs": {
        "logs_collected": {
            "files": {
                "collect_list": [
                    {
                        "file_path": "C:\\Application\\appname\\logs\\logfile.log",
                        "log_group_name": "logfile.log",
                        "encoding": "shift_jis",
                        "timestamp_format": "%m/%d/%y %H:%M:%S"
                    }
                ]
            }
        }
    }
}
```

# ドキュメントにはエンコード指定の方法が載っていない？
WindowsインスタンスからShift JISのログをそのままCloudWatch Logsに転送したところAWSコンソール上で文字化けしてしまったので、エンコード指定の方法を調べたのですがCloudWatch Agentのドキュメントには記載がありませんでした。CloudWatch Logsのドキュメントには `encoding` を指定するように記載があります。

- [CloudWatch エージェント設定ファイルを手動で作成または編集する](https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/CloudWatch-Agent-Configuration-File-Details.html#CloudWatch-Agent-Configuration-File-Logssection)
- [CloudWatch Logs エージェントのリファレンス](https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/logs/AgentReference.html#agent-configuration-file)

そこでCloudWatch Logsのドキュメントを参考に、冒頭のようにパラメータストアのjsonに `encoding` を追加するとうまく表示されるようになりました。ドキュメントに記載はありませんがある程度の互換性はあるようです。
CloudWatch Logsで出来ていたあの設定、CloudWatch Agentではどうするんだろう？という時はLogsを参考に値を入れてみると良さそうです。

対応していない設定は`Run Command`でパラメータ適用時にちゃんと怒られるので大丈夫です。（Agentに`datetime_format`でタイムスタンプを指定しようとして弾かれました）

```
Start configuration validation...

Invalid Json input schema.

Under path : /logs/logs_collected/files/collect_list/0 | Error : Additional property datetime_format is not allowed

Configuration validation first phase failed. Agent version: 1.208.0. Verify the JSON input is only using features supported by this version.

----------ERROR-------

2018/02/21 12:28:25 I! AmazonCloudWatchAgent Version 1.208.0.

failed to run commands: exit status 1
```
AndroidStudioで使うTempフォルダを変更する

# Windows7にてディスク容量が足りない場合
AndroidStudioにてSDKのUpdateを実行すると、ダウンロードするファイルは一時フォルダに保存されますが、ディスク容量が足りない場合失敗します。

この問題を回避するには、ディスク容量を増やすか、一時ファイルの保存先を変更するしかないです。

##調査
Googleで調べるが良い方法が見つからず、次にStackOverFlowで検索するも、Linuxでのやり方しかヒットせず。

##シンボリックリンクで対応
一時ファイルの保存先のシンボリックリンクを作れば回避できると思い、調べてみた。
AndroidStudioの一時ファイルの保存先はユーザーのTempフォルダ。
Windows7ならUser/AppData/Local/Tempに保存されるようです。

Windowsにてシンボリックリンクの作り方。
https://dev.classmethod.jp/etc/make_windows_symbolic_link/

※コマンドプロンプトを管理者権限で実行する必要があります。

##シンボリックリンク作成に失敗する
シンボリックリンクを作成する場合、既にフォルダーが存在すると失敗する。
一度Tempフォルダを削除する必要があります。

##Tempフォルダーを消す
削除する場合、幾つかのファイルを起動中のアプリがロックしてて削除できないので、タスクマネージャーから該当のアプリを一つづつ停止します。
ADBとかAdobeとか。

最後にFXSAPIDebugLogFile.txtってファイルが残った場合。
https://answers.microsoft.com/ja-jp/windows/forum/windows_7-files/fxsapidebuglogfiletxt/132d5bc8-781f-4e32-90f2-bec2ca3fcbb2

#シンボリックリンクを作成
Tempファオルダーの中身を全て削除したら、Tempフォルダーを削除して、シンボリックリンクを作成すれば完了です。
※リンク先フォルダーが存在しない場合でもシンボリックリンクの作成は成功しますので、注意が必要です。
(旧版)Goでloggerを作ってみた

Goのloggerで便利なものがないかなと探してみますと、(自分には)なかなかしっくりくるのがないなと思ってました。
もともとpythongでloggingを使ってたので、InfoやWarningがあればなと思って作ってみました。
Go歴3か月なのでいたらない点はご勘弁を。

https://github.com/suganoo/gologger

# よさげだと思うところ
* レベル別にした。
* ユーザー、ホスト名も出力した。
* 呼び出しファイル、関数、行数も出力した。

# こんな感じ
```
package main

import (
	"github.com/suganoo/gologger"
)

func hogeFunc() {
	gologger.Debug("this is debug hogeFunc")
	gologger.Info("call hogeFunc")
}

func main() {
	gologger.SetLogfile("./testlog.log")
	defer gologger.CloseFile()

	msg := "hogehoge"
	gologger.Debug("this is debug")   // default debug is muted
	gologger.Info("this is info")
	gologger.Info("msg : " + msg)
	gologger.Warning("this is warning")
	gologger.Error("this is Error")

	gologger.UnmuteDebug()
	hogeFunc()

	gologger.Debug("this is debug xxx")
	gologger.MuteDebug()
	gologger.Debug("this is debug yyy")  // this debug message is muted
}
```
```
2018-02-21T10:07:44.277+09:00	INFO	hoge.sever	3892	fuga-user	1.0.0	this is info	main	[gologgerSample.go:18]
2018-02-21T10:07:44.277+09:00	INFO	hoge.sever	3892	fuga-user	1.0.0	msg : hogehoge	main	[gologgerSample.go:19]
2018-02-21T10:07:44.277+09:00	WARNING	hoge.sever	3892	fuga-user	1.0.0	this is warning	main	[gologgerSample.go:20]
2018-02-21T10:07:44.277+09:00	ERROR	hoge.sever	3892	fuga-user	1.0.0	this is Error	main	[gologgerSample.go:21]
2018-02-21T10:07:44.277+09:00	DEBUG	hoge.sever	3892	fuga-user	1.0.0	this is debug hogeFunc	hogeFunc	[gologgerSample.go:8]
2018-02-21T10:07:44.277+09:00	INFO	hoge.sever	3892	fuga-user	1.0.0	call hogeFunc	hogeFunc	[gologgerSample.go:9]
2018-02-21T10:07:44.277+09:00	DEBUG	hoge.sever	3892	fuga-user	1.0.0	this is debug xxx	main	[gologgerSample.go:26]
```

# カスタマイズ
おそらく多数の方が出力を調整してみたいと感じるのではと思います。
folkしてwrite関数の中身をいじってみてください。もしくはこれを参考に独自loggerを作ってみてください。
Update/LateUpdate/FixedUpdate



## Update
1フレームごとに実行する
複数あるUpdate関数の順番は保証されていない


## LateUpdate
https://docs.unity3d.com/jp/current/ScriptReference/MonoBehaviour.LateUpdate.html
https://unity3d.com/jp/learn/tutorials/projects/roll-ball-tutorial/moving-camera?playlist=45990

すべてのUpdate関数実行後に実行される
例えば「キャラが移動 -> カメラが追跡」の順番が保証される


## FixedUpdate

物理演算に使う

https://docs.unity3d.com/ja/current/ScriptReference/MonoBehaviour.FixedUpdate.html
https://unity3d.com/jp/earn/tutorials/projects/space-shooter/moving-the-player?playlist=45993

Physics系処理の例

```c:PlayerController.cs
using UnityEngine;
using System.Collections;

[System.Serializable]
public class Boundary 
{
	public float xMin, xMax, zMin, zMax;
}

public class PlayerController : MonoBehaviour
{
	public float speed;
	public float tilt;
	public Done_Boundary boundary;

	Rigidbody rb;

	void Start() {
		rb = GetComponent<Rigidbody> ();
	}

	void FixedUpdate ()
	{
		float moveHorizontal = Input.GetAxis ("Horizontal");
		float moveVertical = Input.GetAxis ("Vertical");

		Vector3 movement = new Vector3 (moveHorizontal, 0.0f, moveVertical);
		rb.velocity = movement * speed;
		
		rb.position = new Vector3
		(
			Mathf.Clamp (rb.position.x, boundary.xMin, boundary.xMax), 
			0.0f, 
			Mathf.Clamp (rb.position.z, boundary.zMin, boundary.zMax)
		);
		
		rb.rotation = Quaternion.Euler (0.0f, 0.0f, rb.velocity.x * -tilt);
	}
}
```

FixedUpdateが遅いと感じた場合...
過去の位置を参照してしまい位置ずれが発生しているので、
__Fixed Timestepを短くする__必要がある

とはいえ、本当に物理演算が必要な場合以外は、
Updateの中で経過時間依存で移動処理を書いたほうがいい


> 参考
[UnityのUpdate関数とLateUpdate関数の狭間でハマる](http://www.shibuya24.info/entry/2016/07/04/090000)
[Unityでゲームを作った際に「カクカクしている」と言われないためのTimeSettings.FixedTimestep講座](http://yaseino.hatenablog.com/entry/2016/02/23/234652)
SpringBootでValidationMessages.propertiesをUTF8にしたい私の覚書

## はじめに

* Spring Boot 1.5.10
* 日本語のみ扱うアプリを前提
* 色々てさぐり

SpringBootでバリデーションをするとデフォルトのエラーメッセージは英語です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/106858/47d8cae9-81d2-7141-648f-7096545a8ee8.png)

めいのっとびーえんぷてぃ。ぺらぺーら。

日本人向けアプリを作っているので日本語にしたいです。
日本語化自体は、ValidationMessages.properties というファイルを作って、エラーメッセージを定義すれば可能ですがpropertiesファイルはUnicode変換が必要なため、生で見ると読めません。

``` properties
org.hibernate.validator.constraints.NotEmpty.message = \u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044\u3002
```

IDE固有のプラグインで対応する方法もありますが、今回はSpringBoot側でUTF8を受け付けるようにする方法を試してみました。

ちなみに、UTF8で書かれたValidationMessages.propertiesだとエディタでは読めますが、画面表示すると日本語部分がこんな感じで文字化けします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/106858/46800186-6bd3-3afc-4313-bc638542c164.png)


## 追記 バージョンによる違いについて

下記、SpringBootのバージョンによる違いについてコメントをいただいたので捕捉します！

### Spring Boot 2.1

> Spring Boot 2.1では、特に何もせずともUTF-8化できました。
> JDKのバージョンは 11 にする必要があります。

### Spring Boot 1.5.3
> Spring Boot 1.5.3で試したのですが、public Validator getValidator()をoverrideする方法だとエラーになるみたいです。（エラー内容は参考URLで表示されているものと同じ）
> 代わりにmvcValidatorのBeanを設定すれば動作しました!

教えて頂いたみなさんありがとうございます:bow_tone1:

## やったこと

WebMvcConfigurerAdapterのgetValidatorをOverrideしたげる。だけでした。


**WebMvcConfig.java**

``` java:WebMvcConfig.java
public class WebMvcConfig extends WebMvcConfigurerAdapter {

	/* ・・・　関係ない設定は省略 ・・・ */

	/**
	 * ValidationメッセージをUTF-8で設定できるようにする
	 */
	@Override
	public Validator getValidator() {
		return validator();
	}

	@Bean
	public LocalValidatorFactoryBean validator() {
		LocalValidatorFactoryBean validator = new LocalValidatorFactoryBean();
		validator.setValidationMessageSource(messageSource());
		return validator;
	}

	private MessageSource messageSource() {
		ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
		//プロパティファイルの名前やディレクトリも変更可能
		messageSource.setBasename("classpath:/ValidationMessages");
		//UTF-8に設定
 		messageSource.setDefaultEncoding("UTF-8");
		return messageSource;
	}

}

```


**ValidationMessages.properties**

``` properties:ValidationMessages.properties
org.hibernate.validator.constraints.NotEmpty.message=入力してください。
```
読める。読めるぞ。

## 結果

![image.png](https://qiita-image-store.s3.amazonaws.com/0/106858/01752307-1651-14b0-2084-b5e8d8c3b133.png)

ひゃっほーい :relaxed:

## 参考
[Spring Framework Documentation](https://docs.spring.io/spring/docs/current/spring-framework-reference/web.html#mvc-config-validation)

おわり
mikan.js さいこ〜

https://qiita.com/trkbt10/items/9f8121ca084c80665e59

この記事にある、単語改行するためのライブラリを試して見た。
最高。

まるで乞食記事。

<p data-height="265" data-theme-id="dark" data-slug-hash="wyjgMp" data-default-tab="html,result" data-user="monpy4696" data-embed-version="2" data-pen-title="wyjgMp" class="codepen">See the Pen <a href="https://codepen.io/monpy4696/pen/wyjgMp/">wyjgMp</a> by monpy (<a href="https://codepen.io/monpy4696">@monpy4696</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

ぬ、Code pen が出ない？
Project Euler 34「桁の階乗」

# Problem 34 「桁の階乗」
145は面白い数である. 1! + 4! + 5! = 1 + 24 + 120 = 145となる.
各桁の数の階乗の和が自分自身と一致するような数の和を求めよ.
注: 1! = 1 と 2! = 2 は総和に含めてはならない.

```python
def hoge():
    # 階乗計算
    f = lambda n : n * f(n-1) if n > 1 else 1
    # 計算コストを下げるために0～9の階乗をリスト化
    lst_factorial = [ f(n) for n in range(10) ]
    # 999999(6桁)→9!*6=2177280(7桁)、9999999(7桁)→9!*7=2540160(7桁)、
    # 99999999(8桁)→9!*8=2903040(7桁) なので7桁が問に合致する可能性のある最大の桁数
    # 実質 9!*7=2540160 までチェックすれば問題ないはず
    for n in range(10, lst_factorial[9]*7):
        if n == sum( lst_factorial[int(m)] for m in str(n) ):
            yield n

print(sum(hoge()))
```

遅い。7～8秒くらいかかる。
高速化するうまいやり方が思いつかなかったのでちょっと~~カンニング~~調べたところ、
逆転の発想が必要みたいでした。
Arduino Uno を用いたパルス生成

#はじめに
とある事情でステージを動かしたかったのだが、そのステージを作っている企業さんが出しているコントローラでは加減速をしながらステージ操作が出来ないと言われ、しかたなく速度制御を行っているパルスを生成・制御するためにArduinoを使った. 

#必要項目
今回のパルスの生成・制御には、以下のような要素を持たせる必要がある. 

1. 発振回数等での制御
2. 最大10khzのパルス生成
3. 発振周波数等のパラメータ変更
4. 発振ピンの切り替え

発振周波数の変更や10khzの発振だけであればPWMを用いた下記ブログさんのような制御
>Arduino Uno – PWM周波数を”自由に”変更する
(http://blog.kts.jp.net/arduino-pwm-change-freq/)

を行えば良いのだが発振回数等を用いた制御にはちょっと不便だなと思った.(知識不足の部分が大きいが）
であるので今回はシンプルにtimerとdigitalWriteを用いて実装した.

#手法
今回用いた手法はTimerOneというライブラリを用いて時間制御を
パルスの生成は標準のdigitalWriteを用いて行った.

なぜわざわざTimerOneのライブラリを用いて時間制御を行うかと言えば,
標準のdelayだと8bit駆動でありmsec単位での制御しか出来ず10khzのパルス生成を行えなかったからである.
TimerOneで使えるtimerはは元々PWMの制御用のtimerらしく16bitで駆動する.
そのためusec単位での時間制御が可能であるらしい.


そのへんに関して下記のブログさん辺りが詳しい
>Arduinoのタイマーライブラリ - miso-engine 
(http://miso-engine.hatenablog.com/entry/2015/07/20/221014)

#実装
正直コーディングには自信が無いので雑な実装になってると思うが
とりあえず動いてるので良しとする

```c++:pulse_output.ino 
#include <TimerOne.h>
#ピン制御切り替え用のフラグ
int main_flg = 0;
#HIGH/LOW切り替え用のフラグ
bool flg_13 =false; 
bool flg_12 =false;
#発振周波数/発振周期
long hz = 1000; 
long us = 1000000/hz; 

#ピン番号切替
void choice_pin(){
    if (main_flg == 1){
        switch_puls_13();
    }
    else if (main_flg == -1){
        switch_puls_12();
    }
    else{
        puls_stop();
    }
}

#初期設定
void setup() {
  pinMode(12,OUTPUT);
  pinMode(13,OUTPUT);
  Serial.begin(9600);
  Timer1.initialize(100); 
  Timer1.attachInterrupt(choice_pin);
}

#シリアル入力によるピン・速度制御
void loop() {
  if(Serial.available()){
    int inputchar = Serial.read();
    switch(inputchar){
      case 'j':
        Serial.println("open");
        main_flg = 1;
      break;
      case 'k':
        Serial.println("close");
        main_flg = -1;
      break;
      case 'h':
        Serial.println("speed down");
        hz = hz - 100;
        us = 1000000/hz;
      break;
      case 'l':
        Serial.println("speed up");
         hz = hz + 100;
         us = 1000000/hz;
      break;
      case 's':
        Serial.println("stop");
        main_flg = 0;
      break;
    }
  }
}

#13番ピンHIGH/LOW切り替え
void switch_puls_13(){
    digitalWrite(12, LOW);
    if(flg_13 ==true){
        digitalWrite(13, HIGH);
        flg_13 =false;
    }
    else{
        digitalWrite(13, LOW);
        flg_13 =true;
    }
    Timer1.setPeriod(us);
}

#12番ピンHIGH/LOW切り替え
void switch_puls_12(){
    digitalWrite(13, LOW);
    if(flg_12 ==true){
        t(12, HIGH);
        flg_12 =false;
    }
    else{
        digitalWrite(12, LOW);
        flg_12 =true;
    }
    Timer1.setPeriod(us);
}

#信号停止
void puls_stop(){
    digitalWrite(13, LOW);
    digitalWrite(12, LOW);
}
```
発振回数による制御はここには書いてないが、まあ出来ると思う.
こんなところ.
Babel コマンドライン変換環境構築


# 対象

Windows環境です。
Babelのみで変換したい人対象。
Babelコマンドで変換します。
WebPackとかgulpとかなし。

# ファイル構成

どこかのディレクトリに次のファイルを配置します。

```
  index.html
  index.js
  output.js(あとから生成される)
```

index.jsには、最新仕様のJavaScriptを記載しておいてください。
index.js を babelのコマンドでoutput.js に変換します。

index.html は output.js をscriptタグでリンクしてください。

# babel インストール

決めたディレクトリのコマンドラインで次のコマンドを入れます。

```
> npm install --save-dev babel-cli
> npm install --save-dev babel-preset-env

>.\node_modules\.bin\babel -V
6.26.0 (babel-core 6.26.0)
```
これでインストールとバージョン確認ができました。

そのディレクトリに .babelrc を作成します。

```.babelrc
{
  "presets": [
    ["env", {
      "targets": {
        "chrome": 64
      }
    }]
  ]
}
```
これは、BabelでのJSの変換の対象を定義するものです。いろいろな指定ができるようですが、厳密にどのように定義できるのかの一覧などが手に入らなかったので、見やすい定義一覧などあればだれか教えてください。

# babel 実行

```
>.\node_modules\.bin\babel index.js -o output.js
```
エラー出力なく終了すれば、output.js が作成されます。

# 参考

僕がnpm installに-gをつけないわけ - Qiita
https://qiita.com/Mic-U/items/cd456d6bea72937464f8
> babel をグローバルでインストールしてたのですが、いろいろトラブったのでカレントインストールに変えました。このページの内容が身にしみた。

babel-preset-env を試す – アカベコマイリ
http://akabeko.me/blog/2017/03/babel-preset-env/

babel-preset-envを簡単にさわってみた。 - Qiita
https://qiita.com/ryuone/items/13f5d450c3865709ba10

イマドキのJavaScriptの書き方2018 - Qiita
https://qiita.com/shibukawa/items/19ab5c381bbb2e09d0d9
> preset-es2015 が古いものだと理解するまで、かなり回り道をしてしまいました。このページの内容はとても大切。

babel-preset-envの使い方（babel-preset-es2015からの移行） - dackdive's blog
http://dackdive.hateblo.jp/entry/2018/01/18/100000
コンポーネントに状態を持たせ、それを更新する

コンポーネントに状態を持たせるには、constructor(props）を用いて、this.stateの中に記述する。
参照の仕方は、「this.state.name」のようにする。

```ruby:qiita.rb

class Welcome extends React.Component {
  constructor(props){
  super(props);
  this.state = {
    name:'taro',
  };
}

  render() {
    return (
　　　　　　　　　　　　　　<div>
         <h1>Hello, {this.state.name}</h1> 
       </div>
    );
  }
}

```

この状態は更新できるのだが、this.stateを直接書き換えてはいけない。

更新する時は、this.setStateを用いる。

更新自体は色々なところできる。例えば、DOMのイベントを用いて,以下のようにすることで更新できる。



```ruby:qiita.rb

class Welcome extends React.Component {
  constructor(props){
  super(props);
  this.state = {
    name:'taro',
  };
}

handleMouseOver(){
    this.setState({name:'bakayarou!'});
 }

handleMouseOut(){
    this.setState({name:'usodayo!'})
}

  render() {
    return (
　　　　　　　　　　　　　　<div onMouseOver={()=>this.handleMouseOver()}
        onMouseOut {()=>this.handleMouseOut()} >
         <h1>Hello, {this.state.name}</h1> 
       </div>
    );
  }
}

```

これは、はじめに「Hello, {this.state.name}」でWelcomeコンポーネント内のname,「Taro」が呼ばれる。
次にonMouseOverで設定したhandleMouseOver()が呼び出され、カーソルを合わせることで「Hello,bakayarou 」となる。次にカーソルを離すとonMouseOutのhandleMouseOutが呼び出され、「Hello,usodayo!」と表示されることになる。


このsetStateは「stateを更新する」という機能だけでなく、「renderを呼ぶ」という役割も担っている。
なので、this.stateを直接更新するのでは、viewは変わらない。
Intel MKL FATAL ERROR: Cannot load libmkl_intel_thread.dylib.

[Intel MKL](https://software.intel.com/en-us/mkl)を使うと数値計算が速くなるようだったのでインストールしました。とあるライブラリのサンプルを実行しようとしたら、表記のエラーが出ました。OS はmacOS Sierraです。

原因は、/opt/intel/mkl/lib にあるライブラリが見つからないことですが、LD_LIBRARY_PATH を環境変数に設定しても効果なし。これは macOS の SIP という仕組みのせいだそうです。

とりあえずエラーが出ないようにするには、ターミナルから以下のコマンドを実行すれば良いです。

```
source /opt/intel/mkl/bin/mklvars.sh intel64
```
Macでwindowsの音量ミキサーのようなアプリごとに音量を調節できる機能をインストールする(BackgroundMusic)

普段あまりwindowsを使わないのですが、windowsの音量ミキサーというアプリごとに音量を調節できる機能が好きです。
Youtubeで作業用BGMを小さい音で流しながら講座の動画を聞いたり、色々と便利です。神だと思う。

なぜmacにはないのか不思議なくらい便利なので、似たようなものがないか調べていたところGithubにありました。
BackgroundMusicというものです。(https://github.com/kyleneideck/BackgroundMusic)
早速入れてみることに。

#準備
ターミナルを起動します。
まずgitを入れていない方はインストールしてください。

```
$ git --version
```
あとxcodeも必要です。Appstoreからインストールしてくださいね。

上記二つが準備できた方は下記を入力してください。

```
$ brew install git
```

#BackgroundMusicをインストールする

①ファイルをcloneします

```
$ git clone https://github.com/kyleneideck/BackgroundMusic.git
```
②Backgroundファイルに移動します

```
$ cd BackgroundMusic/
```

③インストールします

```
$ ./build_and_install.sh
```

もし、エラーなどで

```
You can also try ignoring compiler warnings with: ./build_and_install.sh -w
```
と出たら、

```
$ ./build_and_install.sh -w
```
と打ってエラーを回避してくださいね



#完了！

macの上のバーにこのようなアイコンが追加されていれば完了です
アプリケーションフォルダにもLaunchpadにも入っているので確認してみてくださいね


<img width="280" alt="スクリーンショット 2018-02-21 16.50.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/232752/1c7c561b-d835-1cdf-6dde-10ce44e8018d.png">

とても便利でUIもかっこよく開発者様に感謝しかないです。

#再インストール
もし再インストールしたいときは

```
$ ./build_and_install.sh
```
でできます




#追記

(コメント欄から情報提供/RenetButlerさん)
Homebrew-caskにもあるらしいです

```
brew cask install background-music
```
でインストールできます。情報ありがとうございました！
電子回路入門　PWM出力

#**はじめに**
[前回](https://qiita.com/aikawa_YO/items/a3002a0e687d9d6bf3ac "Lチカ")と同様にPSoCを使用して書籍を参考にしながら進めていきます。

#**PWMとは？**
疑似的アナログ出力のことです。なぜPWMが必要なのかと言うと、アナログ出力することができないマイコン等(ラズベリーパイとか)があり、そんなマイコン等でもアナログ出力のような変化する出力をさせてあげたい場合があるからです。
疑似的でないアナログ出力をしたい場合は[D/Aコンバータ](http://akizukidenshi.com/catalog/c/cdac/)を使用するらしいです。
また、PWMにはソフトウェアPWMとハードウェアPWMが存在する。

仕組みとしては、高速でON(5V)とOFF(0V)を繰り返し、ONの時間が長ければ長いほどLEDが明るく見える(人間は)ようになります。

計算式　`ONの時間 ÷ ( ONの時間 + OFFの時間 ) × 最大出力電圧(V) = 出力電圧(V)`

秒単位はあり得ないですが…
1秒 ÷ ( 1秒 + 4秒 ) × 5V = 1V 図上
4秒 ÷ ( 4秒 + 1秒 ) × 5V = 4V 図下
![PWM.png](https://qiita-image-store.s3.amazonaws.com/0/195542/b4baeea9-487f-781f-6cba-402c8add4617.png)

#**回路図**
[前回](https://qiita.com/aikawa_YO/items/a3002a0e687d9d6bf3ac "Lチカ")と同様

#**プログラム**
ソフトウェアPWM
暗い

```c
#include "project.h"

int main(void)
{
    CyGlobalIntEnable;

    for(;;)
    {
     LED_Write(1);
     CyDelay(1);

     LED_Write(0);
     CyDelay(10);
    }
}
```

明るい

```c
#include "project.h"

int main(void)
{
    CyGlobalIntEnable;

    for(;;)
    {
     LED_Write(1);
     CyDelay(10);

     LED_Write(0);
     CyDelay(1);
    }
}
```
ハードウェアPWM
PSoCでは簡単にPWMを使用することができるようなので、[こちら](http://udaudadensikousaku.blogspot.jp/2014/04/psoc5lpled_19.html "PSoC5LPでLEDをふわふわ光らせよう。")を参考に、明るさを変化させていく。

```c
#include "project.h"

int main(void)
{
    CyGlobalIntEnable;
    PWM_Start();
    int i;
    for(i=0;i<255;i++)
    {
      PWM_WriteCompare1(i);
      CyDelay(10);
    }
}
```
これ知らない人は人生損してる!!ランダムで表示される広告をdebugする方法（Android編）


広告の実装って大変ですよね
しかも、複数の広告ネットワークを割合で分けてたりすると「10回ビルドしてたまたまでるのをまつ」みたいなデバッグをしてる人もいるんじゃないでしょうか？

そんな人に朗報です。
Android Studioでbreak pointはって実行をとめれば、変数上書きできるので、100%自分がのぞむネットワークの広告を表示できます。
違う広告を検証するときもビルドし直しは入りません。

## 対象者
* 広告を出すのは運が必要だと思ってる人
* 広告sdkを定期的に導入している人
* ランダムな処理をデバッグする人

## 手順
1. 該当箇所にブレークポイントをはる
2. ctrl + D でデバッグ実行
3. 止まったら、`Evaluate Expression`で値をうわがきする
4. 進める
![ブレークポイントはる.png](https://qiita-image-store.s3.amazonaws.com/0/68146/cbe28124-3b36-56bb-f193-3371ab736ada.png "ブレークポイントはる.png")
![変数の値変更.png](https://qiita-image-store.s3.amazonaws.com/0/68146/b0216ddc-7a25-f26e-3566-5e474fa3e227.png "変数の値変更.png")


これで、10回ビルドしなくても、ほしい広告を得られるようになりました

めでたしめでたし
米株のティッカーシンボル名は何から始まるのが多いの？

## ティッカーシンボル名は本当にAから始まるのが多いの？

とあるストラテジーの検証をしていたところ，ひっかかるティッカーがA,B,C から始まる銘柄ばかりがでてくるという現象に当たったので，もしかして銘柄名はA,B,Cから始めるモノが多いのではないか？と思い， Quantopian で確認してみました．



```python
from quantopian.pipeline.data.builtin import USEquityPricing
from quantopian.research import run_pipeline
from quantopian.pipeline import Pipeline
from quantopian.pipeline.factors import Returns
from collections import Counter

# 銘柄名を取得したいだけなので，pipelineに吐き出させるデータは何でもいい．
def make_pipeline():
    pipe = Pipeline()
    five_days_return = Returns(inputs = [USEquityPricing.close], window_length=5)
    pipe.add(five_days_return, 'five_days_return')
    return pipe

results = run_pipeline(make_pipeline(), start_date="2018-1-1", end_date="2018-1-3")

syms = [sym.symbol for sym in results.loc["2018-1-2"].index.get_level_values(1).unique()]
data = [sym[0] for sym in syms]

counter = Counter(data)
df_initials = pd.DataFrame(counter.most_common(), columns=["initial", "count"])
df_initials["pct"] = df_initials["count"] / df_initials["count"].sum()
df_initials.sort_values(by="pct", ascending=False)

```

![Screenshot from 2018-02-21 16-41-51.png](https://qiita-image-store.s3.amazonaws.com/0/14019/df00cd0c-2697-961d-a40b-59d37fb36e64.png)
そうでもない．．．
（もし上場することがあったら目立つためにYからはじめよう）

## counter 便利！

イニシャルをどのように数えたらかっこいいかな？と思ったらこんな方法があるんですね！便利でした！
[Pythonで単語の数え上げとかするならCounterを使うと便利なはなし - Qiita](https://qiita.com/hatchinee/items/a904c1f8d732a4686c9d "Pythonで単語の数え上げとかするならCounterを使うと便利なはなし - Qiita")
これ知らない人は人生損してる!!ランダムで表示される広告をdebugする方法（iOS編）


広告の実装って大変ですよね
しかも、複数の広告ネットワークを割合で分けてたりすると「10回ビルドしてたまたまでるのをまつ」みたいなデバッグをしてる人もいるんじゃないでしょうか？

そんな人に朗報です。
xcodeでbreak pointはって実行をとめれば、変数上書きできるので、100%自分がのぞむネットワークの広告を表示できます。
違う広告を検証するときもビルドし直しは入りません。

## 対象者
* 広告を出すのは運が必要だと思ってる人
* 広告sdkを定期的に導入している人
* ランダムな処理をデバッグする人

## 手順
1. 該当箇所にブレークポイントをはる
2. 実行
3. 止まったら、`po`コマンドで値をうわがきする
4. 進める

![広告debug.png](https://qiita-image-store.s3.amazonaws.com/0/68146/e40590f5-f579-ece6-f148-ff3446952f0a.png "広告debug.png")

これで、10回ビルドしなくても、ほしい広告を得られるようになりました

めでたしめでたし
PicassoでRecycleViewに画像を表示する場合はfit()しましょう


RecycleViewに画像を表示させるとき(というか例外なく) `fit()` を指定するべきだと思います。
でないとスクロール時にカクツク！！！


## 最初に書いていたコード

RecycleViewのAdapterクラスにこんな感じで画像を表示させていました

```kotlin

override fun onBindViewHolder(viewHolder: ViewHolder, i: Int) {
        val model = list[i]
        if (model.icon != null) {
            //ここで画像をダウンロードして表示させていた
            Picasso.with(context).load(`画像URL`).into(viewHolder.~~~)
        }
}

```

指定している箇所を抜き出すとこんな感じです。

```kotlin
Picasso.with(context).load(`画像URL`).into(viewHolder.~~~)
```

この実装だとスクロールした瞬間にかくかくします。


## 解決方法

ちゃんと `fit()` で画像にImageViewにfitさせるようにしましょう。
これを指定していないと内部ではでかい画像をImageViewにはめ込んでいることになっているので
スクロールしたときのパフォーマンスが悪くなります。

```kotlin
Picasso.with(context).load(`画像URL`).fit().centerCrop().into(viewHolder.~~~)
```
sedコマンドで文字列を抜き出す方法 【自分用メモ】

シェルでデータ加工するときにsedコマンドをよく使ったので、自分用にまとめと利用例です。
文字列を置換したり、キーワード間の文字列を取得したり、<HTMLコード>〜</HTMLコード>までを抽出したりしました。
テキストの加工などの参考にでもなれば幸いです。

## HTMLタグを削除 よく使った

```shell
sed -e 's/<[^>]*>//g'
```

## キーワード間の文字列を取得

```shell
sed -n '/開始キーワード/,/終了キーワード/p' 対象とするファイル名
```

以下は、HTMLコード間<HTMLコード>〜</HTMLコード>の抽出。

```shell
sed -n '/<body>/,/<\/body>/p' sample.html 
```
Windows 2012 Server で利用可能なCipherSuite を設定する

とあるお客様からのシステム脆弱性チェック対応のために実施
調べた時にぴったり来るサイト見つけられなかったので、覚書として投稿

手順としては以下の通り、

ローカルグループポリシーエディタを起動※
 ＞コンピュータの構成 ＞  管理用テンプレート ＞
 ＞ネットワーク＞SSK構成設定＞SSL暗号の順位

※win上でgpedit.msc実行

この中に利用可能なCipherSuiteが優先順位順で記載されています。
ちなみにWindows 2012 Server R2 のデフォルトでは含まれているのはこんな感じでした。


|TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P384,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA_P256,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA_P384,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA_P256,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA_P384,TLS_DHE_RSA_WITH_AES_256_GCM_SHA384,TLS_DHE_RSA_WITH_AES_128_GCM_SHA256,TLS_DHE_RSA_WITH_AES_256_CBC_SHA,TLS_DHE_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_256_GCM_SHA384,TLS_RSA_WITH_AES_128_GCM_SHA256,TLS_RSA_WITH_AES_256_CBC_SHA256,TLS_RSA_WITH_AES_128_CBC_SHA256,TLS_RSA_WITH_AES_256_CBC_SHA,TLS_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384_P384,TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256_P256,TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256_P384,TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384_P384,TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256_P256,TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256_P384,TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA_P256,TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA_P384,TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA_P256,TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA_P384,TLS_DHE_DSS_WITH_AES_256_CBC_SHA256,TLS_DHE_DSS_WITH_AES_128_CBC_SHA256,TLS_DHE_DSS_WITH_AES_256_CBC_SHA,TLS_DHE_DSS_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_3DES_EDE_CBC_SHA,TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA,TLS_RSA_WITH_RC4_128_SHA,TLS_RSA_WITH_RC4_128_MD5,TLS_RSA_WITH_NULL_SHA256,TLS_RSA_WITH_NULL_SHA,SSL_CK_RC4_128_WITH_MD5,SSL_CK_DES_192_EDE3_CBC_WITH_MD5|
|:------------------------------------------------------------:|


あーもうカオスです。
今回は[誕生日アタック](https://sweet32.info/)対策でDES/3DESを無効化したかったので、この中から key と auth のどちらかに両アルゴリズムを含んでいたものを外しました。


ヒントになったリンク
https://msdn.microsoft.com/en-us/library/windows/desktop/aa374757(v=vs.85).aspx

上記設定変更後の反映はサーバの再起動が必要でした。
gpupdateのコマンドでは反映されませんでした。


確認結果はこんな感じです。

```
[hogehoge@server ~]$ openssl s_client -connect 192.168.1.132:3389 -cipher DES-CBC3-SHA
CONNECTED(00000003)
write:errno=104
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 0 bytes and written 99 bytes
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
---
[hogehoge@server ~]$
```

DES-CBC3-SHAを指定してハンドシェイクしようとすると、
サポート外として失敗するようになります。


ちなみにレジストリで値を追加して、指定した CipherSuite のON/OFFを過去のWindows Ver(2008等)では行えた様なのですが、2012では上手く行かなかったです。



--2018/3/8 追記--
検証中に気づいたので追記。
対象の"SSL暗号の順位"パラメータはどうも1024文字分までしか入力できない模様。
デフォルト設定の文字列が1450文字近くあるため、一部だけ削ってそれをそのまま貼り付けすると、後半部分がカットされてしまいます。もともと優先順位が下位にあったCipherSuiteなので、ほとんどのケースでは影響ないですが、古いシステムなどと連携している場合は必要なSuiteを整理する必要がありそうです。
これ知らない人は人生損してる!!ランダムで表示される広告をdebugする方法（js編）


広告の実装って大変ですよね
しかも、複数の広告ネットワークをABテストしてたり、割合で分けてたりすると「10回リロードして、たまたま出るのを待つ」みたいなデバッグをしてる人もいるんじゃないでしょうか？

そんな人に朗報です。
chromeでbreak pointを貼ってjsの実行を止めれば、変数を上書きできるので、100%自分が望むネットワークの広告を表示できます。

## 対象者
* 広告を出すのは運が必要だと思ってる人
* 広告sdkを定期的に導入している人
* ランダムな処理をデバッグする人

## 手順
1. chromeのデバックコンソールでSourceパネルを開く
2. 該当箇所にブレークポイントを貼る（画像の1のところ）
3. リロード
4. 止まったら、値を上書きする（画像の2のところ）
5. 進める

![分岐のdebug.png](https://qiita-image-store.s3.amazonaws.com/0/68146/bcc4fa1e-9f4f-9cec-9209-9c84d634a476.png "分岐のdebug.png")

これで、10回リロードしなくても、ほしい広告を得られるようになりました

めでたしめでたし
Itertoolsを使って重複あり順列の全てのパターンを列挙する

```python:qiita.py
 import itertools
 list(itertolls.product("abc",repeat=3))
>>>[("a","a","a"),("a","a","b")...("c","c","c")] #全部で27パターン
 ```
list(itertolls.product("abc"),repeat=2))とlist(itertolls.product("abc")("abc")("abc"))は同じ意味。
XcodeでPseudo Terminal Setup Errorというエラー

![スクリーンショット 2018-02-21 15.49.49.png](https://qiita-image-store.s3.amazonaws.com/0/28608/555a3eb6-3d26-9737-eb22-c6a52a9901e3.png)

突然意味不明なエラーが表示され実行できなくなり、
調べてみたら、SimulatorとXcodeの再起動で治るとのこと。
今後の備忘録に一応記載。
直前の実行までは問題なく実行できていたのだが。。。:innocent:

環境
Xcode 9.2

Apple　Developer　Forumsの以下では再起動でも治らなかった人もいる模様。。
Appleからの回答もないので、この場合はどうしたら良いのでしょうね:sweat_smile:
https://forums.developer.apple.com/thread/95777

どうでも良いネタ
> Pseudo Terminal Setup Error

擬似端末(Simulatorのこと？)のセットアップエラー
意味から察するにSimulatorの再起動だけでも良さそうですが、解消されなったです。
pseudoは「にせ、〜まがいの」という意味だそうです。
express4 + pug2のbasedir設定

# 問題
 - `include ../../../public/img/hoge.png` のような相対パス参照がかっこ悪いので解決したい

# 解決
 - app.js

  ```js
    let app = express(); // この定義は大体書かれているけど、 appが何者なのかわからなくなるので明示
    app.locals.basedir = path.join(__dirname, 'public');
  ```

 - pug

  ```pug
    inclide /img/hoge.png
  ```

# まとめ
 - IDEが解釈しきれずにエラーにしてくるので、ディレクトリ構成に問題ありと解釈し、相対パスの解決はできるが不採用にした
RestSharpでBodyに直接Jsonを記述する方法

#RestSharpについて
[こちら](https://qiita.com/kawaidainfinity/items/032d831187c08702fce9)をどうぞ

#やりたいこと
- RestSharpでパラメータではなくBodyに直接記入でJson文字列を送信したい。

#やり方
```C#:Program.cs
RestClient client = new RestClient(baseUrl);
RestRequest request = new RestRequest(Method.POST);

// パラメータやアップロードファイルなどあればセットする

// リクエストBodyの形式を指定
request.RequestFormat = DataFormat.Json;

// Body部分にJson文字列をセット
// 名前部分にapplication/jsonを指定し、パラメータタイプにRequestBodyを指定
request.AddParameter("application/json", jsonString, ParameterType.RequestBody);

client.Execute(request);
```

#まとめ
パラメータとして追加するときに、名前部分に形式を、パラメータのタイプをContentBodyにすればいいだけだった。
Flutter コマンドが `Unable to pub upgrade flutter tool` で失敗する場合には

Flutter のバージョンを 0.1.3 から 0.0.20 へ切り替えて使おうとして、以下のエラーに遭遇した。

```
> flutter doctor
Building flutter tool...
Package file has no versions that match 2.3.4 derived from:
- flutter_tools depends on version 2.3.4
Error: Unable to pub upgrade flutter tool. Retrying in five seconds...
```

バージョンを切り替えたあとの、初回の `flutter` コマンド実行時には、関連ツールのダウンロードやビルドが実行される。しかし、それ自体でエラーになっている。

0.0.21 で依存パッケージのバージョンが上がったのが関係しているかも、と思ったので詳細を調査する前にキャッシュを消してみたところ、動くようになった。

```
rm -rf /path/to/flutter/bin/cache/
```
java中的lambda表达式1

   java 中的lambda 表达式使用1

1、lambda表达式在java中后续可能会取代匿名内部类
2、java中的函数接口（FunctionalInterface注解）
   注:函数接口中只能有一个抽象方法，如果有多个方法则无法使用lambda表达式


lamda表达式替代匿名内部类方式如下

```.java
@FunctionalInterface
interface ExecuteAble{
    void say(String name,String msg);
}

public class RobotT{
    public void say(ExecuteAble exe){
         exe.say("Robot Lucy "," is laughing hahahaha......");
    }
}

public class TestLambda{
    public static void main (String[] args){
        Robot t1 _new Robot();
        t1.say(
            (name,msg) -> {
                              system.out.println(name + msg);
                          } );
        Robot t2 _new Robot();
        //change the contents of saying
        //annomous inner class
        t2.say(new ExecuteAble(){
             public void say(String name,String msg){
                 system.out.println(name + msg);
             }
        })
    }
}
```
tableの横幅がはみ出る時のCSS

tableをdivでラップする方法がよく紹介されているのですが、こちらの方法でもokでした。

テーブルの横幅は一定で、セルの幅がどんどん狭くなって表示されます。

```CSS
table {
  table-layout: fixed;
  word-break: break-all;
  word-wrap: break-word;
}
```
image_tagでsrcset属性を使いたいときのTips（carrierwave）

image_tagで画像を表示させる際の話。
ディスプレイがretinaの場合、画像のサイズによっては画像がぼやけて表示されます。

その時に登場するのが`srcset`です。

retinaに対応させた画像表示の方法はcssやjsを使った方法もありますが、今回はhtml側で呼び出す画像を選別できるようにします。

今回はその中でも2パターン詳解します。
一つ目は、carrierwaveによる画像投稿をしていて、app/public/uploads　配下に画像が配置されている場合
二つ目は、ハードコーディングで画像リンクを明記し、app/assets/images　配下に画像が配置されている場合


## carrierwaveを使って画像の投稿をしているパターン

例えば縦100px横200pxの画像を表示するとします。
まず、carrierwaveのimage_uploader.rbにversionを追加します。
versionの名前は適当でも良いですが、画像サイズが明記されていたほうが管理しやすいです。





```image_uploader.rb

require 'carrierwave/processing/mime_types'
class ImageUploader < CarrierWave::Uploader::Base
  include CarrierWave::MiniMagick
  include CarrierWave::MimeTypes
  process :set_content_type

  version :size_100_200 do
    process resize_to_fill: [100, 200]
  end

  version :size_100_200_for_retina do
    process resize_to_fill: [200, 400]
  end
// 省略
end
```

resize_to_fillやresize_to_fillとはなんぞや！？という方は[こちらの記事](http://noodles-mtb.hatenablog.com/entry/2013/07/08/151316)を参考にしてください。

これにより画像が２種類生成されるようになります。

呼び出し時は区別するために、画像のリンクの末尾に画面サイズを表す`2x`を付与します。

retinaのときは
`srcset="hogehoge.jpg 2x"`
と記述します。

呼び出し時に毎回書くのは面倒なのでhelperメソッドを呼び出すことにします。

```ruby:image_helper.rb
  def img_2x(url)
    "#{url} 2x"
  end
```

呼び出しの記述に移りましょう。


```ruby:_product.html.haml
= image_tag(product.image_url(:size_100_200), srcset: img_2x(product.image_url(:size_100_200_for_retina), alt: product.title)
```

これで自動的にブラウザが判別してくれるようになります。
どちらも呼び出してその分ダウンロードに時間がかかる、ということは起きないです。
ありがたいですね〜〜


## ファイル名を指定して呼び出すパターン

あまり考えずに書くと、下のようになりますね。

```ruby
= image_tag('japan.jpg', srcset: "japan@2x.jpg 2x", alt: 'japan')
```

先程のパターンだとsrcsetを記述すれば、簡単に実現できそうですが、うまく行きませんでした。

調べた所、この記事が参考になりました。
https://gist.github.com/mrreynolds/4fc71c8d09646567111f

これを先程のimage_helper.rbに追記します。

```ruby:image_helper.rb

def img_2x(url)
    "#{url} 2x"
end

def image_set_tag(source, srcset = {}, options = {})
  srcset = srcset.map { |src, size| "#{path_to_image(src)} #{size}" }.join(', ')
  image_tag(source, options.merge(srcset: srcset))
end
```

呼び出しの記述に移ります。

```ruby:_product.hmtl.haml
= image_set_tag('japan.jpg', "japan@2x.jpg" => "2x", alt: 'japan')
```

これですっきり書けました。

## まとめ
retinaが普及して以来、実装側も画像サイズを複数枚用意することも増えました。
ユーザーは美しい画像が表示されるのを当り前のように期待しているので、期待に添うような画像表示ができると良いですね！
Install Ambari with CLI : コマンド２行で、Ambariサーバーをインストール

#### Automated deployment of fresh cluster via blueprints (using ambari-bootstrap)

- Bring up 4 VMs imaged with RHEL/CentOS 7.x (e.g. hdp-ambari, hdp-[1-4] in this case)

- On non-ambari nodes, install ambari-agents and point them to hdp-ambari node (e.g. hdp-ambari in this case)
latest Ambari : https://docs.hortonworks.com/HDPDocuments/Ambari-2.6.1.3/bk_ambari-release-notes/content/ch_relnotes-ambari-2.6.1.3.html
2.6.1.3

```
export ambari_version=2.6.1.3
export ambari_server=zzeng-hdp-ambari
curl -sSL https://raw.githubusercontent.com/zz22394/ambari-bootstrap/master/ambari-bootstrap.sh | sudo -E sh
```

- On Ambari node, install ambari-server

```
sudo yum install -y git
export ambari_version=2.6.1.3
export install_ambari_server=true
curl -sSL https://raw.githubusercontent.com/seanorama/ambari-bootstrap/master/ambari-bootstrap.sh | sudo -E sh

```

- Confirm 4 agents were registered and agent is up

```
curl -u admin:admin -H  X-Requested-By:ambari http://localhost:8080/api/v1/hosts
service ambari-agent status
```

- At this point you could install HDP via Ambari's install wizard by opening http://<AMBARI_IP>:8080 and following the prompts to customize as needed. If you prefer to just deploy a cluster with default settings follow below steps instead

- Generate blueprint: you can generate BP and cluster file using Ambari recommendations API using these steps. 
For more details on the bootstrap scripts, see [bootstrap script github](https://github.com/seanorama/ambari-bootstrap)

```
yum install -y python-argparse
git clone https://github.com/seanorama/ambari-bootstrap.git

export ambari_stack_version=2.6
export recommendation_strategy="ALWAYS_APPLY_DONT_OVERRIDE_CUSTOM_VALUES"

#Select the services to be deployed

#option A: for minimal services
#export ambari_services="HDFS MAPREDUCE2 YARN ZOOKEEPER HIVE"

#option B: for most services
#export ambari_services="ATLAS HBASE PHOENIX HDFS HIVE KAFKA LOGSEARCH AMBARI_INFRA PIG SPARK SQOOP MAPREDUCE2 STORM TEZ YARN ZOOKEEPER ZEPPELIN"

bash ./ambari-bootstrap/deploy/deploy-recommended-cluster.bash

```
- You can monitor the progress of the deployment via Ambari (e.g. http://node1:8080). 

#### Reference:
https://gist.github.com/abajwa-hw/55cd937fc8c5e27b8f2ec8c506d86519
動的に Build types を生成してビルドする

# まずは手動でやる
パッケージ名や一部のパラメータだけを変更するような APK が必要な場合、 Android では Build types や Product flavors と呼ばれる仕組みを使って一部のみを差し替えたビルドを簡単に作成することができます。

そのためには以下のようにします。

```gradle
android {
	...
	buildTypes {
		release {
			...
		}
		debug {
			...
		}
		preview {
			// preview ビルド用のベースとなるビルド設定を記述する
		}
		preview_foo {
			initWith preview
			applicationIdSuffix '.foo'
			buildConfigField 'String', 'SOME_PARAM', '"foo"'
		}
		preview_bar {
			initWith preview
			applicationIdSuffix '.bar'
			buildConfigField 'String', 'SOME_PARAM', '"bar"'
		}
		preview_baz {
			initWith preview
			applicationIdSuffix '.baz'
			buildConfigField 'String', 'SOME_PARAM', '"baz"'
		}
	}
	...
	sourceSets {
		preview_foo {
			setRoot 'src/preview'
		}
		preview_bar {
			setRoot 'src/preview'
		}
		preview_baz {
			setRoot 'src/preview'
		}
    }
}
dependencies {
	...
	preview_fooCompile 'com.example:somelibrary:1.0.0-alpha'
	preview_barCompile 'com.example:somelibrary:1.0.0'
	preview_bazCompile 'com.example:somelibrary:1.0.1'
}
```

しかし、受託開発時などには動作確認用のビルドなどが **たくさん** 必要になることがあります。
しかも2, 3回しか使わなかったり、急に新しいものが必要になったり、とにかく手動でビルド設定を増やしたりするのはそれなりに手間がかかります。
ビルド毎に依存関係を変更しなければならない場合など尚更です。

# 動的にやる

そのような場合は動的にビルド設定を定義できると便利です。
Gradle では以下のように記述することが出来ます。

```gradle
def previewConfigs = [
        foo: [someParam: 'foo', dependencyVersion: '1.0.0-alpha'],
        bar: [someParam: 'bar', dependencyVersion: '1.0.0'],
        baz: [someParam: 'baz', dependencyVersion: '1.0.1'],
]

android {
	buildTypes {
		release {
			...
		}
		deubg {
			...
		}
		preview {
			// preview ビルド用のベースとなるビルド設定を記述する
		}
		previewConfigs.each { name, config ->
            "preview_$name" {
                initWith preview
                applicationIdSuffix ".$name"
                buildConfigField 'String', 'SOME_PARAM', "\"${config.someParam}\""
            }
        }
    }
    ...
    sourceSets {
        previewConfigs.each { name, config ->
            "preview_$name" {
                setRoot 'src/preview'
            }
        }
    }
}
dependencies {
	...
	previewConfigs.each { name, config ->
        "preview_${name}Compile" "com.example:somelibrary:${config.dependencyVersion}"
    }
}
    
```

このように `previewConfigs` を定義し、各種の設定ではその値を使用するように指定することで、とても簡単に動的にビルド設定を追加、変更、削除することができます。

# 参照
- https://stackoverflow.com/questions/20976946/dynamically-generating-product-flavors
Ubuntu 16.04 プライマリモニタにログイン画面を表示する方法

#何が問題か
マルチモニタを利用している場合、プライマリ（として使う予定の）モニタにログイン画面が表示されない場合がある。
プライマリモニタ以外を90°回転して使っている場合、ログイン画面も90°回転して表示されるため非常に厄介なことになる。
Ubuntu 16.04 ではXの設定ファイルでモニタを制御しておらず、これが原因で起きる現象らしい。

#解決方法
一度ログインしてプライマリモニタを設定後、以下の操作で解決できる。

```bash
$ sudo cp ~/.config/monitors.xml ~gdm/.config/
```

これでプライマリモニタにログイン画面が表示される。

#参照元
https://askubuntu.com/questions/11738/force-gdm-login-screen-to-the-primary-monitor
Swift4でコードベースのレイアウトを作成する

## はじめに

Swiftに関してはまだ学習段階で、StoryBoardを使わずにUIを構築してみたいと思い調べてみました。
ドンピシャな記事が[こちら](https://qiita.com/lovee/items/5e8c7752d7e383660543)だったのですが、Swift4には対応しておらず、諸々でエラーが出たので、そちらのバグを修正したものを書いていこうかと思います。

なお、[こちら](https://qiita.com/lovee/items/5e8c7752d7e383660543)の記事を書いている @lovee さんには多大な感謝を申し上げますm(_ _)m

進め方として、@lovee　さんの記事を参照して進め、エラーが出た際にこの記事と見比べていただければと思います。

## MainView.swift

```swift
import UIKit

class MainView: UIView {
    // ラベルのクラスを宣言
    let mainLabel: UILabel
    
    override init(frame: CGRect) {
        
        // MainViewのフレームサイズを定数に代入
        let mainViewFrame = frame
        
        // labelのサイズを設定
        let mainLabelSize = CGSize(width:240, height:30)
        
        // MainViewのフレームサイズとラベルのサイズからラベルがちょうど中央に来るように場所を計算する
        let mainLabelOrigin = CGPoint(
            x:(mainViewFrame.width - mainLabelSize.width) / 2,
            y:(mainViewFrame.height - mainLabelSize.height) / 2
        )
        
        // ラベルのフレームを定数に設定しておく
        let mainLabelFrame = CGRect(x: mainLabelOrigin.x, y: mainLabelOrigin.y, width: mainLabelSize.width, height: mainLabelSize.height)
        
        // mainLabelを作る
        mainLabel = UILabel(frame: mainLabelFrame)
        
        // mainLabelの表示テキストを設定
        mainLabel.text = "Change to Text"
        
        // mainLabelの表示テキストのセンタリングを設定
        mainLabel.textAlignment = .center
        
        // mainLabelの設定が終わったので、親クラスを初期化
        super.init(frame: frame)
        
        // MainView クラスの背景色を白に設定
        self.backgroundColor = UIColor.white
        
        // MainViewにmainLabelを表示させる
        self.addSubview(mainLabel)
        
    }
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

```




## ViewController.swift



```swift
import UIKit

class ViewController: UIViewController {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        let mainView = MainView(frame: UIScreen.main.bounds)
        
        self.view.addSubview(mainView)
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}
```

## AppDelegate.swift

```swift
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.
        // アプリウィンドウの設定
        self.window = UIWindow(frame: UIScreen.main.bounds)
        
        // ウィンドウをヴィジブルにする
        self.window?.makeKeyAndVisible()
        
        // ウィンドウのrootViewControllerをviewControllerに設定する
        self.window?.rootViewController = viewController
        
        return true
    }
    // 以下省略
}
```
Wiznode RAK811




# RAK公式HP

ホームページ（英語）
[RAK | The Middleware from RAK Enable IoT](http://www.rakwireless.com/en/)

ブログ
[Rakwireless IoT Hardware Expert](http://blog.rakwireless.com/)

サポート掲示板
[Home | RAK Support Center](http://support.rakwireless.com/)

ドキュメント
[Document download - RAK | The Middleware from RAK Enable IoT](http://www.rakwireless.com/en/download)


CH34x 最新のドライバ
http://download.makeblock.com/mblock/CH34x_Install_V1.3.pkg

「システム環境設定」の「セキュリティとプライバシー」の設定を「すべてのアプリケーションを許可」に変更、「ch34xInstall.pkg」をダブルクリックしてインストールして、最後にMacを再起動。

## Wiznode LoRa

### 製品ページ
[LoRa module - RAK | The Middleware from RAK Enable IoT](http://www.rakwireless.com/en/module/lora/RAK811)

### 回路図

![image](https://qiita-image-store.s3.amazonaws.com/0/49910/b4ac18cc-60e8-64ef-cfb5-fb000c5146aa.png)

http://docs.rakwireless.com/en/WisNode%20LoRa/Hardware%20Design/WisNode%20LoRa%20Schematic_20171129.pdf


## Github
[RAKWireless/WisNode-LoRa: LoRa ,RAK811 ,Open Source LoRa ,RAKwireless，CoIDE，LoRa Arduino](https://github.com/RAKWireless/WisNode-LoRa)

## Wiki & 資料

[WisNode-LoRa [RAK Document Center]](http://wiki.rakwireless.com/doku.php?id=wisnode_series:wisnode-lora)

資料はページ最下部に


## CoIDE

[WisNode-LoRa/RAK811_LoRaMac_CoIDE at master · RAKWireless/WisNode-LoRa](https://github.com/RAKWireless/WisNode-LoRa/tree/master/RAK811_LoRaMac_CoIDE)

このページ下部の掲示板でやりとり
[Using the RAK811 LoRa module with Arduino - Hackster.io](https://www.hackster.io/naresh-krish/using-the-rak811-lora-module-with-arduino-a38de8)

## 使用例


### Arduino Megaを使った使用例（Hackers.io）
[Using the RAK811 LoRa module with Arduino - Hackster.io](https://www.hackster.io/naresh-krish/using-the-rak811-lora-module-with-arduino-a38de8)

### Node RAK811+Arduinoの仕様例（うまく動かね～っていう掲示板相談）
[Node RAK811+Arduino - End Devices (Nodes) - The Things Network](https://www.thethingsnetwork.org/forum/t/node-rak811-arduino/10417/3)

### baud rate問題
Wiznode LoRaを使っている場合にはbaud rateを9600bpsよりも上げると文字化けする。
これはArduinoのバージョンにより、どのbaud rateが文字化けするかが変化する。
Seeeduinoは56200、Arduino UNO, Megaは9600以上で文字化け


### 5v問題
[How to fix WisNode-Lora shield not really compatible with an Arduino (TX/RX lines not 5V compatible) - The Things Network](https://www.thethingsnetwork.org/forum/t/how-to-fix-wisnode-lora-shield-not-really-compatible-with-an-arduino-tx-rx-lines-not-5v-compatible/7201)
既にある要素の９方向に要素を加える。

### 既にある要素の９方向に対して後から要素を加えられると便利。

||||
|:-:|:-:|:-:|
| ten7 |  ten8 | ten9 |
| ten4 |  ten5 | ten6 |
| ten1 |  ten2 | ten3 |

### 例えば画像のコンポーネントに後付でコントロールを追加する。
```css
.card{
 width:250px;height:200px;
 background-image:url('....');
}
```
```html
<div class="card">
  <div>the original</div>  
</div>
```
```html
<div class="card ctrl">
  <div>the original</div>  
  <nav class="ten1"><label>1</label></nav>
  <nav class="ten2"><label>2</label></nav>
 ...
</div>

```
### 多くの場合大きさは変えたくない、コンポーネントの上に配置する。
別の言い方をすれば、コンポーネント上の主要な要素（文字等）に被る。

```css
.ctrl{position:relative;}
.ctrl>nav{
  position:absolute;z-index:1;
  display:flex;
}
```
### 真ん中
||||
|:-:|:-:|:-:|
| ten7 |  ten8 | ten9 |
| ten4 |  ten5 | ten6 |
| ten1 |  ten2 | ten3 |
```css
.ctrl>nav.ten5{
    margin: 0;
    top: 50%;
    left: 50%;
    margin-right: -50%;
    transform: translate(-50%, -50%);
  /*or
  justify-content:center;
  align-items:center;
  width:100%;
  height:100%;
  top:0;left:0;
  margin:0;  
  */
}
```

### 全部
```css
.card{
  width:250px;
  height:200px;
  background-image:url('https://i.imgur.com/1JQ7yss.png');
}
.card>div{/*debug*/color:white}
label{/*debug*/color:orange;cursor:pointer}

/**/
.ctrl{position:relative;}
.ctrl>nav{
  position:absolute;z-index:1;
  display:flex;
}
.ctrl>nav.ten1{left:0;bottom:0;z-index:2}
.ctrl>nav.ten2{
 justify-content:center;
 flex-direction:row;
 bottom:0;width:100%;  
}
.ctrl>nav.ten3{ right:0;bottom:0;z-index:2}
.ctrl>nav.ten4{
 justify-content:center;
 flex-direction:column; 
 left:0;top:0;height:100%;
}
.ctrl>nav.ten5{
    margin: 0;
    top: 50%;
    left: 50%;
    margin-right: -50%;
    transform: translate(-50%, -50%);
  /*or
  justify-content:center;
  align-items:center;
  width:100%;
  height:100%;
  top:0;left:0;
  margin:0;  
  */
}
.ctrl>nav.ten6{
 justify-content:center;
 flex-direction:column; 
 right:0;top:0;height:100%;
}
.ctrl>nav.ten7{left:0;top:0;z-index:2}
.ctrl>nav.ten8{
 justify-content:center;
 flex-direction:row;
 top:0;width:100%;
}
.ctrl>nav.ten9{right:0;top:0;z-index:2}

```
```html
<div class="card">
  <div>the original</div>  
</div>
<div class="card ctrl">
  <div>the original</div>  
  <nav class="ten1"><label>1</label></nav>
  <nav class="ten2"><label>2</label></nav>
  <nav class="ten3"><label>3</label></nav>
  <nav class="ten4"><label>4</label></nav>
  <nav class="ten5"><label>5</label></nav>
  <nav class="ten6"><label>6</label></nav>
  <nav class="ten7"><label>7</label></nav>
  <nav class="ten8"><label>8</label></nav>
  <nav class="ten9"><label>9</label></nav>
</div>
<div class="card ctrl">
  <div>the original</div>  
  <nav class="ten1"><label>1</label></nav>
  <nav class="ten2"><label>2</label></nav>
  <nav class="ten3"><label>3</label></nav>
  <nav class="ten4"><label>4</label></nav>
  <nav class="ten5"><label>5</label></nav>
  <nav class="ten6"><label>6</label></nav>
  <nav class="ten7"><label>7</label></nav>
  <nav class="ten8"><label>8</label></nav>
  <nav class="ten9"><label>9</label></nav>
</div>
```
Web サイト対策確認ツールの個人的まとめ(lighthouse,PageSpeed Insights,WebPagetest)

Web サイトが適切な対策を行っているか確認をできるツール、サイトのざっくりとしたまとめです

 今回まとめたのは、無料で使える以下の 3 つ 

* lighthouse
* PageSpeed Insights
* WebPagetest

## lighthouse

Google が提供する Web ページの品質確認ツール
Web サイトのパフォーマンスや、アクセシビリティ、SEO などの測定が出来る

[Lighthouse によるウェブアプリの監査 | Tools for Web Developers | Google Developers](https://developers.google.com/web/tools/lighthouse/?hl=ja)

[Github](https://github.com/GoogleChrome/lighthouse)

### 使用方法について

[Lighthouse Chrome 拡張機能](https://developers.google.com/web/tools/lighthouse/?hl=ja)をダウンロードして Chrome に拡張機能を導入するか、
Node モジュールとしてコマンドラインでインストールする

```javascript
npm i -g lighthouse
```

### 測定結果について

測定すると以下のような html で出力される

![スクリーンショット 2018-02-21 14.29.49.png](https://qiita-image-store.s3.amazonaws.com/0/57423/7dda5d6c-ed32-c6ce-e0cb-ad863c7d9031.png)


#### Performance

Web サイトの現在のパフォーマンスと改善できる点について

#### Progressive Web App

baseline PWA チェックリストで指定されたプログレッシブ Web アプリケーションのパフォーマンスについて

#### Accessibility

Web アプリケーションのアクセシビリティについてサブセットのみが自動的に検出されるため、手動テストも奨励される 

#### Best Practices

モダンな Web サイトがどうかについて

#### SEO

ページが検索エンジンの結果ランキングに最適化されているかについてチェックしていない他の要因があり、それが検索ランキングに影響する可能性があります

## PageSpeed Insights

Google が提供している Web サービス入力した URL を  チェックし、推奨される対策を教えてくれる

[PageSpeed Insights](https://developers.google.com/speed/pagespeed/insights/?hl=ja)

[PageSpeed Insights について](https://developers.google.com/speed/docs/insights/about)

### 使用方法について

[PageSpeed Insights](https://developers.google.com/speed/pagespeed/insights/?hl=ja)のサイトに行って、URLを入力し分析ボタンを押す

### 測定結果について

![スクリーンショット 2018-02-21 14.50.51.png](https://qiita-image-store.s3.amazonaws.com/0/57423/8707d872-f6cf-888b-0a5a-4ce0abf41c5c.png)

モバイルとパソコン毎に速度と最適化の測定結果が表示
詳細については、[PageSpeed Insights について](https://developers.google.com/speed/docs/insights/about)を参照

## WebPagetest

Googleなどが提供している合成モニタリングサービス

[WebPagetest](https://www.webpagetest.org/)

### 使用方法について

[WebPagetest](https://www.webpagetest.org/)のサイトに行って、URLを入力し`Test Location`,`Browser`を選択しSTART TESTボタンを押す

### 測定結果について

![スクリーンショット 2018-02-21 15.11.00.png](https://qiita-image-store.s3.amazonaws.com/0/57423/2df5c850-19e1-18fd-c586-b71eda305aca.png)


#### First Byte Time

サーバーへリクエストが送られた時からブラウザでレスポンスが受け取られるまでの時間

#### Keep-alive Enabled

Keep-aliveを使っているかどうか

#### Compress Transfer

Html,CSSなどが圧縮されているかどうか

#### Compress Images

画像ファイルが圧縮されているかどうか

#### Cache static content

コンテンツのキャッシュが効いているかどうか

#### Effective use of CDN

CDNサーバを使用しているかどうか


## まとめ

ざっくりとしたまとめなので、詳細な項目についてや、対策については、今後調べてまとめていけたらいいなと思います