OmniAICreator/Qiita-1.07M huggingface dataset:
Numpy > fileIO > 1次元のデータをファイルに追記する

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 16.04 LTS desktop amd64
TensorFlow v1.2.1
cuDNN v5.1 for Linux
CUDA v8.0
Python 3.5.2
IPython 6.0.0 -- An enhanced Interactive Python.
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
scipy v0.19.1
geopandas v0.3.0
MATLAB R2017b (Home Edition)
ADDA v.1.3b6
gnustep-gui-runtime v0.24.0-3.1
```

### 処理概要

1次元のデータをファイルに追記する。

取得したセンサーのデータをファイルに追記する処理などに使う。

Numpyでのファイル保存処理を使う。


### code


```test_logger_180304.py
import numpy as np

# on Python 3.5.2

OUTFILE = 'log.test_180304'

tpl = 3.14, 2.718, 6.022
tpl = [tpl]  # to avoid LF for 1-D array
with open(OUTFILE, 'ab') as f_hndl:
    for loop in range(5):
        np.savetxt(f_hndl, tpl, fmt='%.1f', delimiter=' ')

```

```txt:run
$ python3 test_logger_180304.py
$ cat log.test_180304 
3.1 2.7 6.0
3.1 2.7 6.0
3.1 2.7 6.0
3.1 2.7 6.0
3.1 2.7 6.0
```

### 関連

`tpl = [tpl]  # to avoid LF for 1-D array`
がない場合、[3列]でなく[1列+改行]*3での出力になる。

- [numpy > savetxt() > 1次元のデータ書き出しは、各要素に改行が入る > 2次元にする](https://qiita.com/7of9/items/36c6f6a5cb90afc20dda)
KOMAINOを使ってみる

#KOMAINO
[KOMAINO製品ページ](http://omniment.co.jp/komaino/ja/)
半年くらい前に秋葉原の千石電商で見て気になったので買ってみたんですが触る時間が取れなくてずっと放置してました。
まとまった時間が取れたので使ってみようと思ったのですが意外にハマってしまいました。
Webで調べても本家以外には以下の2箇所くらいしか情報がないので、もしかしたら役に立てていただけるかもと思いメモ程度に書いてみました。

[迷走の果て・Tiny Objects](http://edycube.blog.fc2.com/blog-entry-967.html)
[KOMAINOプログラミングで気づいた雑多なこと](https://qiita.com/kanehara/items/63f3aa5ff1673bfc6e8d)
#基本的な流れ
基本的な流れは本家のチュートリアルのとおりです。
http://omniment.co.jp/komaino/ja/start/

##ハマりどころ
ボクがハマったところを書いてみます。

###APモードでWi-Fi接続するときのパスフレーズ
これについては上記の「KOMAINOプログラミングで気づいた雑多なこと」にも書かれていたためすぐ解決。パスフレーズは`12345678`です。

###APモードで接続してもKOMAINOがシリアルポートに見つからない
これはだいぶ悩みました。最初はZIP版をそのまま解凍してインストールせずに使っていたのですが、ふと思い立ってインストール版のほうを入れるとUSBドライバも入っており、どうやらこれが入っていなかったために見つからなかったようです。なんとなくZIP版はポータブルに使えるもんだと思いこんでたのでこっちを使ってたんですが、そうではないみたいです(^_^;)

これで無事にチュートリアルの「2.文字を流す」は実行できました。
![KOMAINO-Hello.JPG](https://qiita-image-store.s3.amazonaws.com/0/142746/0591ef2c-ceb0-4dec-4c25-1e90111463e9.jpeg)

###Staモードで接続したときにKOMAINOがシリアルポートに出てこない
次に「1-2.KOMAINOをSTAモード(子機モード)にする」をやろうとして、またまたハマりました。

こちらはいろいろと試していてなんとなく解決してしまったので原因がよくわかっていないのですが…

やったこととしては、PCの再起動、FireWallの設定変更くらいでしょうか。
FireWallで変更したのは「アプリにWindows ファイアウォール経由の通信を許可する」のところでPythonの行でパブリックネットワークにしか許可されていなかったところをドメインネットワークでも許可したことくらいです。
（うちの家はドメインコントローラーがいるのでドメインネットワークなんです）
これでStaモードでもArdiono IDEからプログラムを送信することができました。

#最後に
2000円ちょいで買えて電池で動かせるしボタンと画面がついてるのでいろいろと遊んでみようと思います（時間あるかな…）
Cakephp3でViewのクラスを独自で設定したい

#やること
ViewをControllerごとに切り替えたい

#前準備
Viewの下に設定したいClassを作る
（例 : HogeView）

#やりかた

```AppController.php
$this->viewBuilder()->setClassName('Hoge');
```

これを書くだけ。
メソッドで変えたい場合は

```AppController.php
public function test()
{
    $this->viewBuilder()->setClassName('Hoge');
}
```

とすればメソッド単位で切り替えれる。

ディレクトリを切ることもできるので

```AppController.php
$this->viewBuilder()->setClassName('Fuga\Hoge');
```
と書くことも出来る
Rule of five

# Rule of five

## 概要

C++の３つのルールと言えばクラスメンバに以下のメンバを追加しておくことを言います。

- コピーコンストラクタ
- コピー代入演算子
- デストラクタ

これにC++11上で２つを拡張すると5つのルールになるそうです。

- ムーブコンストラクタ
- ムーブ代入演算子

が、著名なブログにはより正確に言えば「Big４(と半分のルール)」といった表記もあるようです。
The Big Four（and a half）

> [The Rule of The Big Four (and a half) – Move Semantics and Resource Management - Sticky BitsSticky Bits](https://blog.feabhas.com/2015/01/the-rule-of-the-big-four-and-a-half-move-semantics-and-resource-management/)

## 何が便利か

- 関数で生成されたオブジェクトを代入演算子で返して、そのポインタを代入先に割り当てる。
- いくつかのアルゴリズム（例えばswap()）
- 動的にコンテナを割り当てる。

このように、コピーをするとリソースが余計に必要な時に所有権の移譲すれば良いという考えで`C++11`で追加された機能。

## 左辺値、右辺値

ムーブを調べていくと、左辺値右辺値の定義なんかが議論されていて、
簡単に言えば代入式の左と右なのですが、突き詰めると下記の引用のように色々な意見があるようです。

- 左辺値という用語は、もともと"代入式の左辺に置けるもの"を表すために作られた。しかし、全ての左辺値が代入式の左辺に置けるわけではない。※1
- 右辺値は大雑把にいうと"左辺値ではない値" ※1
- 誤解を恐れずに言えば、右辺値とは名前をもたない一時的なオブジェクトである。また、左辺値とは明示的に実態のある名前付きオブジェクトである。※2
- Only modifiable l-values can go on the left-hand-side of an assignment statement.(代入文の左側には、変更可能な左辺値のみが入ります。)※3
- An r-value is an un-named object; or, if you prefer, a temporary variable.(右辺値は名前のないオブジェクトです。または、必要に応じて一時変数を使用します。)

引用元

- ※1 ビャーネ・ストラウストラップ著　プログラミング言語C++
- ※2 [右辺値参照・ムーブセマンティクス - cpprefjp C++日本語リファレンス](https://cpprefjp.github.io/lang/cpp11/rvalue_ref_and_move_semantics.html)
- ※3 [L-values, r-values, expressions and types - Sticky BitsSticky Bits](https://blog.feabhas.com/2013/02/l-values-r-values-expressions-and-types/)

※１には左辺値、専値、純右辺値に分けられるとかもっと深く検討してます。

※3から少し省略して記載↓

```
    int a = 0;
    int b = 0;
    a = b++++; // NG
    a = ++++b; // OK
```

## ムーブコンストラクタ・ムーブ代入演算子

`std::move()`を使って値の所有権の移譲をすること。
定義には`&&`を付けた演算子の宣言で可能。

[右辺値参照・ムーブセマンティクス - cpprefjp C++日本語リファレンス](https://cpprefjp.github.io/lang/cpp11/rvalue_ref_and_move_semantics.html)

```c++
class large_class
{
// ptrという名前のメンバをこのクラスの値にして比較演算子のオーバーロードなどをしているという前提。
.... // 略
	// ムーブコンストラクタ
	large_class(large_class&& r) noexcept 
	{
		ptr = r.ptr;     // ポインタの移譲
		r.ptr = nullptr; // 元のオブジェクトはnullptr
	}

	// ムーブ代入演算子
	large_class& operator=(large_class&& r)
	{
		ptr = r.ptr;     // ポインタの移譲
		r.ptr = nullptr; // 元のオブジェクトはnullptr
		return *this;
	}
.... // コピーコンストラクタ、コピー代入演算子は省略

}

int main()
{
	large_class tmp{};
	large_class y1{};
	large_class y2{};

	// コピーコンストラクタ
	large_class x1(tmp);
	// tmp != nullptr;
	// x1 != nullptr;

	// コピー代入演算子
	y1 = x1;
	// tmp != nullptr;
	// x1 != nullptr;
	// y1 != nullptr;

	// ムーブコンストラクタ
	large_class x2(std::move(tmp));
	// tmp == nullptr; // ※1
	// x2 != nullptr;

	// ムーブ代入演算子
	y2 = std::move(x2);
	// tmp == nullptr; // ※1
	// x2 == nullptr;  // ※1
	// y2 != nullptr;
  
	// ※1 使える「保証がなくなった」状態。今回はnullptrを使ったが、クラス内部の定義によってnullptr以外もあり得る。
}
```

`unique_ptr`は複数の所有権を持てないが、`std::unique_ptr<int> q = std::move(p);`のように移譲することは可能。

また、以下を満たさない限り暗示的に生成される。

- クラスがコピー演算を宣言していない
- クラスがムーブ演算を宣言していない
- クラスがデストラクタを宣言していない

## 個人的に思うこと

`std::move(p)`を記述するのは見た目的になんか分かりにくいので`p1 <- P2`とか`p1 <-(P2)`みたいな演算子にならなかったのかなと。
GAE と Angular で普通の SPA の作り方まとめ

* GAE/Go をバックエンドとした Angular による普通の SPA の作り方について記事を何本か書いているのでまとめてみる。

|記事|説明|コード|
|---|---|---|
|[導入編](https://qiita.com/nirasan/items/d877a75902498a717eb8)|Angular と GAE/Go のアプリケーションのひな形を作成する|[:page_facing_up:](https://github.com/nirasan/gae-angular-sample/tree/qiita.com/nirasan/items/d877a75902498a717eb8)|
|[デプロイ編](https://qiita.com/nirasan/items/f63b078246852dd17d56)|ひな形のアプリケーションを GAE にデプロイする|-|
|[認証編](https://qiita.com/nirasan/items/85b635ec2ccb580643a6)|OAuth を使って認証を行いユーザーを作成する|[:page_facing_up:](https://github.com/nirasan/gae-angular-sample/tree/qiita.com/nirasan/items/85b635ec2ccb580643a6)|
|[認可編](https://qiita.com/nirasan/items/2543c62e16c6b7bd88e3)|アクセストークンを使った Angular から GAE へのリクエストの認可処理を実装する|[:page_facing_up:](https://github.com/nirasan/gae-angular-sample/tree/qiita.com/nirasan/items/2543c62e16c6b7bd88e3)|
vnstatを日本語環境で使うときの注意点

vnstatは日本語環境で使うと文字化けする

![alt](https://qiita-image.cloudremix.net/vnstat-hsum-J.png)

#gdライブラリが原因
エクスポートに使われているgdライブラリが原因。

`locale`を指定すれば解決

```:locale
vnstati -hs --locale C -o hsum.png
```

vnstat.confでも設定可

```:/etc/vnstat.conf
- Locale "-"
+ Locale "C"
```

> RESTRICTIONS
>
>Depending on the font provided by the GD library, not all characters may end up shown correctly when a UTF-8 locale is used.
>
>Using long date output formats may cause misalignment in shown columns if the length of the date exceeds the fixed size allocation. 

[Man page of VNSTATI](http://humdi.net/vnstat/man/vnstati.html)
Cognos 累加グラフでX軸の最初の値のハイライトをやめさせる

#概要
累加グラフを普通に使うと、X軸の最初の値が異なる色にハイライトされています。
別にこのアイテムが特別というわけじゃないので、他のアイテムと同じ扱いにしたい時の手順です。
![001.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/33adc255-b984-d5ea-61bc-e2f97dcf7c47.jpeg)


#手順
レポートの累加グラフに、X軸に「製品ライン」、Y軸に「数量」を置いてます。
![000.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/e923ca04-d4ad-fc81-165a-9bb8cb749c95.jpeg)

このままレポートを実行すると、先ほどのように「アウトドア保護用品」が最初の値で色が違います。
![001.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/7273603d-1723-c070-9d82-95b158d6d6cb.jpeg)

レポートに戻って、累加グラフのプロパティの「累加グラフのパレット」から、「最初の値の塗りつぶし」のチェックを外します。
![002.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/1c40892e-8aea-dcb9-71bd-28dffa336aa5.jpeg)

無事に他のアイテムと同じ表示になりました。
![003.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/8a0a3e79-d10d-ed08-28fb-85deb4d2aa61.jpeg)

意外とどうやるのか見つけにくかったので、投稿しておきます。
WindowsをSSHサーバーにしたときにつまずいたエラー

自宅のサーバーにしていたデスクトップがしょぼいサーバーとしてしか役目がないのはもったいないような気がしたので、今までのサーバーをそのままにUbuntuからWindowsにOSだけ移行しようと、軽い気持ちで考えました。

しょうもないエラーでつまずいて6時間ほど粘ったのでみなさんがこの思いをしないようにと微力ながらまとめさせていただきます。

# 症状

あなたもおそらく[PowerShell/Win32-OpenSSH](https://github.com/PowerShell/Win32-OpenSSH/releases)をインストールしようと思ってこのページに辿りついたのではないかと思います。

そしてインストールを終え、sshdの設定を終え、いざ起動して快適なSSH生活が待っていると確信しながらEnterキーを押したあなたは絶望します。

```
> net start sshd

sshd サービスを開始します...
sshd サービスを開始できませんでした。

システム エラーが発生しました。

システム エラー 1067 が発生しました。

プロセスを途中で強制終了しました。
```

# 結論

原因はしょうもないので結論から申し上げます。

```
> C:\path\to\OpenSSH\sshd.exe
```

これを実行してみてください

```
> C:\path\to\OpenSSH\sshd.exe

. must be owned by root and not group or world-writable.
```

おそらくこんなようなエラーが出てくると思います。
出てこない方は、ごめんなさい。私はお力になれないようです。

最初の「.」はsshd.exeからの相対パスだと思います。
つまり、C:\path\to\OpenSSH のアクセス権がユルすぎますよ～ってことが言いたいようでした。

そうなればあとは簡単、OpenSSHのフォルダを右クリックして、プロパティを開きます。
[セキュリティ]タブからAdministrator以外の書き込み権限を拒否にチェックを入れて剥奪してやってください。
適用をクリックしたらもう一度！

```
> net start sshd
sshd サービスを開始します。
sshd サービスは正常に開始されました。
```

ありがとうございま～～っす！！


# 紆余曲折と愚痴

こんなことに6時間もかけてしまったんですね。

何をしてたかって、ネットの成功例を見ながら一度インストールしたOpenSSHを丸ごとインストールしなおしたり、GUIでインストールできる[mls-software.com](https://www.mls-software.com/opensshd.html)に逃げようとして「SSH1はもうつかえないよ」と言われたり、もう大変でした。

そもそもなんでnet startのエラーはsshdのエラーメッセージを握り潰して1067とかいうググってもおいしい情報の出ないエラーコードを吐くようにしてしまったんでしょう！

この6時間はいい授業料でした。
Windowsにまたすこし強くなれたので、うれしいです…
unityでunityeditor

#概要
unityでunityeditorやってみた。
animationclipのヒエラルキーを表示してみた。

#写真
![image](https://qiita-image-store.s3.amazonaws.com/0/18104/9a9f2771-a1df-8788-9695-7d9ac9221cdd.png)


#環境
unity 5.2.5f1

#サンプルコード

```
using UnityEngine;
using UnityEditor;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Linq;

public class test2 : EditorWindow
{
    public string Text
    {
        get;
        set;
    }
    const int width = 400;
    const int height = 300;
    [MenuItem("test/test2")]
    public static test2 Init()
    {
        var window = EditorWindow.GetWindow<test2>("test2") as test2;
        return window;
    }
    void OnGUI()
    {        
        EditorGUI.TextArea(new Rect(0, 0, test2.width, test2.height - 30), this.Text);
        if (GUI.Button(new Rect(0, height - 30, test2.width, 30), "OK"))
        {
            foreach (var clip in Selection.objects.OfType<AnimationClip>())
            {
                var events = AnimationUtility.GetAnimationEvents(clip);
                var srcClipInfo = AnimationUtility.GetAnimationClipSettings(clip);
                foreach (var n in AnimationUtility.GetAllCurves(clip, true))
                {
                    this.Text += n.propertyName + "\n"; 
                }
            }
            this.Text += "ok";
        }
    }
}


```

以上。
rbenvとrbenv-binstubsのパスまわり(主にsystemd対策)

rbenvを使うには`~/.bash_profile`なりなんなりで環境変数を適切に設定してやる必要がある。というわけで、systemdのように通常のシェルと環境変数を共有していない(`~/.bash_profile`を経由しない)環境でrbenvなRubyを使おうとするとうまくいかないケースがある。

# ``rbenv: version `XXX' is not installed``編

- 前提：
  - 環境変数`RBENV_ROOT`が設定されていない。
  - rbenvをシステムワイドインストールなどのために`~/.rbenv`以外のところに置いている(以下では`/opt/rbenv`にあるとして説明する)。
- 問題：`/opt/rbenv/shims/bundle exec ...`では動くのに、`/opt/rbenv/bin/rbenv exec bundle exec ...`では``rbenv: version `XXX' is not installed``となって動かない。
- 理由：rbenvはインストールされたバージョンを探すのに`${RBENV_ROOT}/versions/XXX`を見る。`/opt/rbenv/shims/bundle`は途中で`RBENV_ROOT`環境変数を正しくセットするけれど、`/opt/rbenv/bin/rbenv exec`はそうしないので、あるべき場所を探せず、見つからない。
- 解決策：`/opt/rbenv/shims/bundle exec ...`でかまわない。

# `-bash: ruby: command not found`編
引き続きrbenvは`/opt/rbenv`にあるとして説明する(が、こちらは`~/.rbenv`にあっても起きそう)。

- 前提：
  - `$PATH`に`/opt/rbenv/shims`が入っていない。
  - [`rbenv-binstubs`](https://github.com/ianheggie/rbenv-binstubs)を使っている。
  - `BUNDLE_BIN: ".bundle/bin"`である(すなわち`bundle install --binstubs=.bundle/bin`とした)として説明する。ちなみにパスを指定していなければ`bin`になる(これはRails4以降と衝突することで有名)。
- 問題：`/opt/rbenv/shims/bundle exec ...`すると`-bash: ruby: command not found`となって動かない。
- 原因：
  - どこかで`#!/usr/bin/env ruby`していて動いていない。本来はrbenvが`$PATH`に`/opt/rbenv/versions/XXX/bin`を加えていて、ここにruby実行ファイル(正確にはそのラッパー)があるので動く。
  - `$PATH`に加えられるべき`/opt/rbenv/versions/XXX/bin`は、`rbenv which`を内部的に呼んでその結果を使っている。
  - `rbenv-binstubs`は、`rbenv which`に割り込んで、`/opt/rbenv/versions/XXX/bin`より先にカレントディレクトリの下`.bundle/bin`を探す。ここに`bundle`が入っているとこちらが`rbenv which`の結果として返されて`$PATH`に追加されるが、ここには`ruby`は(当然)いない。`$PATH`に`/opt/rbenv/shims`が入っていなければ`ruby`が見つからないことになる。
  - (`$PATH`に`/opt/rbenv/shims`が入っていればこっちの`ruby`があるのでちゃんと動く。)
- 解決策：
  - とりあえず`.bundle/bin/bundle`を消せば動くようになる。
  - 抜本的には、`bundle install --binstubs=.bundle/bin`とせず、必要なgemに限って`bundle binstubs <gemname> --path=.bundle/bin`とするのがよい。
[ Nginx × KUSANAGI ] www 付きドメイン から www なしドメインへのリダイレクト設定

# 環境
- さくらの VPS
- KUSANAGI ( CentOS 7 )
- WordPress
- KUSANAGI で SSL 化済み

# 設定
- `/etc/nginx/conf.d` 内の `example_ssl.conf` の下記のように編集する

```
#=======================================
# example.com SSL
#---------------------------------------

server {
    listen 443 ssl http2;
    server_name www.example.com;
    rewrite ^ https://example.com$request_uri?;
}

server {
    listen       443 ssl http2;
    server_name  example.com;
    # 以下省略
}
```

- 編集後、`nginx -s reload` or `kusanagi restart` で Nginx を再起動
Spring Boot 2で/actuator/prometheusを有効にする

# 経緯
Spring Boot 2ではメトリクス機能の強化によりPrometheusにも対応をしていますが、公式リファレンス通りにやってもうまくいかなかったので、回避策をメモ。

検証環境
- Spring Boot 2.0.0

# 手順

## 依存関係の追加

POMに`micrometer-registry-prometheus`の依存関係を追加します。これが公式リファレンスには記載がありませんでした。

```xml:pom.xml
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!-- この依存関係を追加するとうまくいった -->
<dependency>
  <groupId>io.micrometer</groupId>
  <artifactId>micrometer-registry-prometheus</artifactId>
</dependency>
```

## エンドポイントの追加

application.propertiesでprometheusのエンドポイントを追加します。デフォルトではinfoとhealthのみ公開されています。

```application.properties:
# infoとhealthはデフォルトでexposeされているのでprometheusを追加
management.endpoints.web.exposure.include=info,health,prometheus
```

## 起動時のログ確認

起動すると以下のログが出力されます。/actuator/prometheusが出力されていればOKです。POMにmicrometer-registry-prometheusを追加しないとinfoとhealthしか出力されませんでした。

```text:起動時ログ:
Mapped "{[/actuator/health],methods=[GET],produces=[application/vnd.spring-boot.actuator.v2+json || application/json]}"
Mapped "{[/actuator/info],methods=[GET],produces=[application/vnd.spring-boot.actuator.v2+json || application/json]}"
Mapped "{[/actuator/prometheus],methods=[GET],produces=[text/plain;version=0.0.4;charset=utf-8]}"
```

以上です。
【Python】and演算子、or演算子はboolではなく評価したオブジェクト自身を返している

# はじめに
Qiita初投稿の新米エンジニアです。
仕事でちょこちょこpythonを使うようになり、ある程度コーディングもしていたのですが、恥ずかしながら`and`や`or`の挙動について勘違いがあったのでまとめました。
# どういうことか
こういうこと。

```Python:
>>> 'foo' and ''
''
>>> 'foo' or ''
'foo'
>>> 'foo' and 'bar'
'bar'
>>> 'foo' or 'bar'
'foo'
```

`and`や`or`はboolを返すものだと思っていましたが、どうやらそうではない。


`'foo' and ''`　→　`''`　
`'foo' or ''`　→　`'foo'`　
あたりは何となくわかりますが、なぜ
`'foo' and 'bar'`　→　`'bar'`
`'foo' or 'bar'`　→　`'foo'`
のように`and`と`or`で結果が異なるのか。

そのあたりの挙動について、[ドキュメントのブール演算子の項](https://docs.python.jp/3/reference/expressions.html#boolean-operations)を参考に以下にまとめました。
# `and`演算子、`or`演算子の評価ロジック
`x and y`も`x or y`も、基本的には以下の評価を行い、結果を返す。

* `x`の真偽値によって式全体の真偽値が確定する場合(`y`の真偽値に関わらず式全体の真偽値が確定する場合)は`x`を返す。
* `x`の真偽値だけでは式全体の真偽が確定しない場合(`y`の真偽値を見て初めて式全体の真偽値が確定する場合)は`y`を返す。

※なお、`not`演算子については、戻り値はいつでもboolとなります。

冒頭の４つの式についてそれぞれ上記のロジックに当てはめると、

* `'foo' and ''`
→`'foo'`は空文字でないので真。式全体の真偽が確定しないため`''`を返す。

* `'foo' or ''`
→ `'foo'`は空文字でないので真。式全体の真偽が確定するため`'foo'`を返す

* `'foo' and 'bar'`
→ `'foo'`は空文字でないので真。式全体の真偽が確定しないため`'bar'`を返す。

* `'foo' or 'bar'`
→ `'foo'`は空文字でないので真。式全体の真偽が確定するため`'foo'`を返す

つまり`'foo' and 'bar'`と`'foo' or 'bar'`で結果の異なる理由としては、`'foo'`の評価の時点で結果が確定するか`'bar'`の評価で確定するかの違い。

# ちなみに
この挙動を利用して、以下のように文字列にデフォルト値を設定することができる

```Python
a = s or 'foo'  # sがFalseなら'foo'を代入 
```
挙動としては以下と同じです。

```Python
a = s if s else 'foo'
```
CSSをどうにかしてPHPで書く

PHPの冒頭に```<?php header('Content-Type: text/css; charset=utf-8'); ?>```を入れてその下にCSSを書けば早いのですが、エディタの色分け表示等が無効になったので別の方法を

##条件

- 変数使いたい
- エディタの機能は殺したくない
- 外部CSSがいい

##いるもの

PHPは完全に初心者なので正しいかどうかは知りません

```php:style.php

<?php
header('Content-Type: text/css; charset=utf-8');

$color_1 = "#ffffff";
$color_2 = "#000000";

include_once('hoge.css');
?>
```

```css:hoge.css

.neko{
background-color: <?php echo $color_1; ?>;
}

.usagi{
background-color: <?php echo $color_2; ?>;
}

.tori{
background-color: <?php echo $color_2; ?>;
}
```

```html:index.html
<head>

<link rel="stylesheet" href="style.php">

</head>
```
CSSが変数用とメイン2つのファイルに分かれてしまうのが難点ですが、エディタの機能を殺さなくて済みます
コマンドラインでバックスラッシュのパスでも移動できるようにする

atomでパスをコピーした際にバックスラッシュを使った`C:\Users\`みたいなパスがコピーされるので、ターミナルでディレクトリ移動する際にスラッシュのパスに置換したい。

つまりこうしたい`C:\Users\`→`C:/Users/`
##コード

```bash:~/.bashrc
cd2(){
  local fullPath=""
  #「:」を「:/」にする
  local x=${1/:/:/}
  for (( i = 0; i < ${#1} + 2; i++ )); do
    # 引数を先頭からfullPathに代入
    fullPath+=${x:$i:1}
    # ディレクトリが存在したら「/」を加える
    if [[ -d $fullPath ]]; then
      fullPath=$fullPath/
      dirPath=$fullPath
    fi
  done
  # 「//」を「/」に変換する、しかし「/」が複数付いてても平気みたい
  # dirPath=${dirPath/\/\//\/};
  cd "$dirPath"
}
```
###こんな感じで使える

```
$ cd2 D:\documents\replace.sh
```

##メモ
置換するだけかと思いきや「\」(バックスラッシュ)単体だと以下のように消えてしまう

```
$ echo D:\documents\replace.sh
D:documentsreplace.sh
```
なので`-d フォルダパス`でフォルダが存在するか確認して、ディレクトリを確認するごとに「/」(スラッシュ)を入れる


```bash
  if [[ -d $fullPath ]]; then
    fullPath=$fullPath/
    dirPath=$fullPath
  fi
```
Electronを始めてみる-環境構築

普段は仕事でリモコンなどのハードウェアを作製してます

ハードウェアチェックやプログラムのブートローダーを、
C#で書いて運用してましたが、
electronという、webベースでシリアル通信などのコントロールも可能な
ネイティブアプリを作ることができるということを知り
興味がてら作成してみることにしました。
やること、やったことのメモがてらに書いてきます

とりあえず環境構築から

#　環境
- macOS 10.13.3
- node.js v8.9.4 言わずもがなnpmなどの導入
- electron v1.8.2　electronの基

# インストール
1. node.jsサイトより推奨版(8.9.4)をダウンロード
2. 下記コマンドでelectronダウンロード  

```bash:command
npm i -D electron@latest
```

# テスト
```bash:command
mkdir helloworld
cd helloworld
npm init -y
touch index.js
```

##window表示用のスクリプトを作成

```js:index.js
'use strict';

var electron = require('electron');
var app = electron.app;
var BrowserWindow = electron.BrowserWindow;

var mainWindow = null;

app.on('window-all-closed', function() {
  if (process.platform != 'darwin')
    app.quit();
});

app.on('ready', function() {
	//mainWindowを作成　サイズ指定
 	mainWindow = new BrowserWindow({width: 500, height: 400});
 	//electronに表示するパスを絶対パスを指定する
 	mainWindow.loadURL('file://' + __dirname + '/index.html');

	mainWindow.on('closed', function() {
	mainWindow = null;
	});
});
```

##テスト用のhtmlを作成

```html:index.html
<!DOCTYPE HTML>
<html>
<head>
<meta charset="UTF-8">
<title>Electron HelloWorld</title>
</head>
<body>
	<h1>Hello World!</h1>
</body>
</html>
```

##起動
```bash:command
electron .
```

これで一応は動作すると思われる　(ただ"Hello World!"が表示される)

ちょっとずつ今後も進めて行きます
JSでDDD & Clean architecture & Flux

# 概要

JSでDDD & Clean architecture & Fluxを考えてみた。
(注意: 筆者は上記3つを正しく理解していない可能性がある)

# 用語
## ユーザー
いわゆるユーザー。
ユーザーを識別するためのidとユーザー独自のタイムラインを持つ。

## タイムライン
コメントの配列。

## コメント
bodyと呼ばれる任意の文字列を持つ。


# ユースケース
ユーザーのタイムラインを取得する。

# 実装

```js
// Entity
interface Comment {
  body(): String; 
}

interface Timeline {
  comments(): Array<Comment>; 
}

interface User {
  id();
  // 非同期にtimelineを取得
  timeline(onFetched: (Timeline) => void);
}

interface UserRepository {
  // 同期的に取得できると想定
  findById(userId): User;
}


// Use Case
class FetchUserTimelineUseCase {
  constructor(userRepository) {
    this.userRepository_ = userRepository;
  }
  
  execute(userId, onFetched: (Timeline) => void) {
    this.userRepository_.findById(userId).timeline(onFetched);
  }
}


// Action Creator
class UserActionCreator {
  constructor(dispatcher, userRepository) {
    this.dispatcher_ = dispatcher;
    this.userRepository_ = userRepository;
  }
  
  fetchTimeline(userId) {
    this.dispatcher_.dispatch({ type: ActionType.START_FETCH_TIMELINE });
    new FetchUserTimelineUseCase(this.userRepository_).execute(userId, (timeline) => {
      this.dispatcher_.dispatch({ type: ActionType.FINISH_FETCH_TIMELINE, userId, timeline });
    });
  }
}

// Store
class UserStore extends ReduceStore {
  constructore(dispatcher) {
    super(dispatcher);
  }

  getInitialState() {
    return Immutable.OrderedMap();
  }
  
  reduce(state, action) {
    switch (action.type) {
    case ActionType.START_FETCH_TIMELINE:
      return state.set('loading', true);  
    case ActionType.FINISH_FETCH_TIMELINE:
      const userId = action.userId;
      const timeline = {
        comments: action.timeline.comments().map((c) => { body: c.body() })
      };
      return state.set('loading', false).set('timeline', timeline).set('userId', userId);
  }
}
```
docker + jupyter で画像処理用コンテナ

dockerで画像処理用コンテナをパッと作る。

## Dockerfile ##

```sh
FROM jupyter/base-notebook

USER root
RUN apt-get update -y && apt-get install -y python-opencv

USER jovyan
RUN pip install https://github.com/ipython-contrib/jupyter_contrib_nbextensions/tarball/master \
jupyter_nbextensions_configurator pillow opencv-python
RUN jupyter contrib nbextension install --user && jupyter nbextensions_configurator enable --user
```

詳細は以下に

+ ベースのイメージはjupyter公式の最もベーシックなものです。 → [jupyter/base-notebook](https://hub.docker.com/r/jupyter/base-notebook/)
+ このimageを起動すると`jovyan`ユーザーでnotebookが起動されるので、`apt`等でシステム側に必要なパッケージをインストールしてます。例とし`python-opencv`をインストールしてますが、必要なものをインストールしてください。
+ 便利そうなので、[nbextensions](https://github.com/ipython-contrib/jupyter_contrib_nbextensions)周りをインストールしてます。

## 起動 ##

`Dockerfile`を置いたディレクトリに移動して、

**build** ※`Dockerfile`を変更をしない限りは一度だけ実行すればOKです。

```
docker build -t jupyter_blog .
```

**run**

```
docker run -it --rm -v $PWD:/home/jovyan/work --name jupyter_blog -p 8888:8888 jupyter_blog
```

詳細は以下

+ `jupyter_blog` という名前をつけてbuildしてます。
+ カレントディレクトリをdocker内の `/home/jovyan/work` にマウントしてます。使う画像ファイルとか `.ipynb` ファイルとかをここに入れて使ってます。
+ あとは起動後に、 `http://localhost:8888/?token=****************` というようなURLが出力されるので、このURLにアクセスするとOKです。


## 処理例 ##

**gist**
[uitspitss/practice.ipynb](https://gist.github.com/uitspitss/ee3fef29d08177d2d9ea851acbfb5279)

```python
from IPython.display import display
from PIL import Image
import cv2
import numpy as np

img = Image.open('myicon.jpg')
display(img)

_img = np.asarray(img)
_img = cv2.GaussianBlur(_img, (45, 1), 0)
display(Image.fromarray(_img))
```
古いバージョンから自動アップグレードされたWindows 10を再インストールしたい

# OSのHDDを入れ替えたい。ついでに中身もキレイにしてしまいたい。
OSの再インストールという行動を長らくやってないんで
「OSは購入したディスクからインストールするもの」というところで頭が止まっており
Windows 7から自動でアップグレードされたデジタルライセンスのWindows 10てこれどうすんだよ？
というところでちょっと調べた。$\color{white}{ぶっちゃけると一番最後の「色々やったんだけどさ…」の部分だけ把握しときゃ良かったってオチ}$
HDD取り替えたりとかが無いのなら別にこの手順は踏まず復元すればいい。
# まずはライセンス認証されているか確認しましょう。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/241480/ed29b90b-d05e-ee31-0e4d-dadfe805f78f.png)

**設定＞更新とセキュリティ＞ライセンス認証**より確認。
面倒なのでタスクバーにある検索ボックスに「**ライセンス認証**」と入力して開きましょう。
はい、正しくライセンス認証されてますね。
# メディア作成ツールをダウンロードしましょう。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/241480/543376db-ee46-1d9d-c7a1-e853eb620c19.png)

[Microsoftのサイト](https://www.microsoft.com/ja-jp/software-download/windows10)よりメディア作成ツールをダウンロードしましょう。
PC への Windows 10 のインストールをご希望ですか?
はい、ご希望です。クレクレ。婆ちゃんオレだよ、オレオレ。
# ツールをインストールしましょう。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/241480/f87d5a15-24ad-4e02-50a9-327ccd4f3136.png)

素直に同意しましょう。
拒否したっていい事ありませんよ。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/241480/18e057cd-2f84-08af-dc34-c833c5aa2c9c.png)

「別のPCのインストールメディアを作成する」を選択。
別のPCって言われてちょっとたじろぐけど別のPCじゃない、おれはこのPCに入れ直したいんだ。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/241480/318b1bfc-d983-cb67-6a95-aaee36846f79.png)

特に何か変更するわけではないので「このPCにおすすめのオプションを使う」を選択。
これやると言語・エディション・アーキテクチャのボックスが非活性化するみたいすね。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/241480/5ae6c5f3-01ff-5059-09f8-a3294e2bae89.png)

メディアに「ISOファイル」を選択。
本当はドラクエ10やってた頃に使ってたWiiのUSBメモリが今使ってないんでそれ使おうと思ったけどどっかいった…

![image.png](https://qiita-image-store.s3.amazonaws.com/0/241480/67eb3c9f-027a-2d17-f254-a2df75f4427f.png)

メディアをダウンロード。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/241480/caf4e929-168c-df96-17f6-b320f78500f5.png)

「DVD書き込み用ドライブを開く」でドライブを選択。
なお、おれはリモートデスクトップで操作してたんでBD-Rドライブが認識しなかった。
素直にマシンで直接操作しよう。
書き込んだらツールの操作はここで終了です。
# さて、ここからスクショが撮れない操作なわけだが…
ツールで作成したインストールメディアを挿入し、マシンを再起動しましょう。
BIOSの設定によってはなにかキーを押しながら、或いは連打して起動メニュー出さないと普通に既存のWindows 10が起動しちゃうのかな？
おれが利用してるAlianwareの起動メニューが実行されるがその必要も無くDVDの方を優先して起動された。
## Windowsセットアップが起動されたら…
1. 「今すぐインストール」を選択
2. 「Windowsのライセンス認証」で「プロダクトキーがありません」を選択。
説明にも「Windowsを再インストールする場合には、[プロダクトキーがありません]を選びます」って書いてありますね。
3. インストールするWindows 10のエディションを選択
ここは各々で任意
4. 「適用される通知とライセンス条項」に同意しましょう。
5. インストールの種類を選択
ここも任意だが「カスタム：Windowsのみをインストールする（詳細設定）」を選択。
おれはOSを綺麗な状態にしたいんだ。
　![image.png](https://qiita-image-store.s3.amazonaws.com/0/241480/43400f89-e9ca-c856-f3ec-07ec9adf73ec.png)

6. インストール先のドライブを選択
7. インストールの完了を待ちましょう
8. 初回起動時の設定
任意。少なくともライセンス云々には関係無さげ。
コルタナさんが音量最大で喋って来てビビる。ハキハキ話してるのが「音声が必要無いなら～」で突然不機嫌になりよる。

# 色々やったんだけどさ…
ツールでインストールメディア作ってプロダクトキー飛ばしてインストールすりゃ良かったようだ。
過程の記載が無いと「途中色々出るけどどれ選べばいいのさぁ～？」ってなるんでやったことを列挙していった。

1. [Microsoftのサイト](https://www.microsoft.com/ja-jp/software-download/windows10)よりツールをダウンロード
2. ダウンロードしたツールでUSBメモリなりDVDなりでインストールメディア作る
3. インストールメディアからWindows 10をインストール。プロダクトキーは入れない。

こんな長々と記事書いておいて把握すべき点はたったこれだけで良いようだ。

さて、今週のポプテピピックも終わったしもう寝よう。
getUserMediaでオープンしたデバイスを閉じる方法

# 概要

WebRTCでgetUserMedia()を呼び出すとカメラやマイクなどのデバイスがキャプチャ状態になります。
これらのデバイスを解放するには`getUserMedia()`で取得した`stream`に対して、以下の処理を行うことで解放することができました。

```
stream.getTracks().forEach(track => track.stop())
```
Google Chrome バージョン: 64.0.3282.186

他に適切な方法があればコメントをいただけると幸いです。

# 参考

MediaDevices.getUserMedia() - Web API インターフェイス | MDN https://developer.mozilla.org/ja/docs/Web/API/MediaDevices/getUserMedia

getUserMedia: select resolution https://webrtc.github.io/samples/src/content/getusermedia/resolution/
pretty_midiでコード進行のMIDIファイル生成

#はじめに

以前コード進行を自動で生成してくれるサービスを作成した。
https://chordprogressor.herokuapp.com/
https://qiita.com/Giita2000/items/b0a500762a127b7ad69b
このときは生成したコード進行を表示するだけだったが，楽器を弾かなくてもコード進行を耳で確認できれば便利。

#pretty_midiを用いたMIDIファイル生成

そこでWeb上で鳴らすことを考え，生成したコードを鳴らすMIDIファイルの作成をpython上でできる方法を探したところ，pretty_midiというライブラリが良いみたい。
https://qiita.com/tackey/items/d0525798bddc4516f4f9

鳴らす音を一個づつ加えていけば良いので，コード進行を文字列で入力すればmidiファイルが出来上がるように関数化した。

```python
import numpy as np
import pretty_midi
import re

def midi_create(imput_chords):
    root        = {'C':0,
                   'C#':1,
                   'D♭':1,
                   'D':2,
                   'D#':3,
                   'E♭':3,
                   'E':4,
                   'F':5,
                   'F#':6,
                   'G♭':6,
                   'G':7,
                   'G#':8,
                   'A♭':8,
                   'A':9,
                   'A#':10,
                   'B♭':10,
                   'B':11,}
    
    chord_type = {'':np.array([0, 4, 7]),
                  'm':np.array([0, 3, 7]),
                  '7':np.array([0, 4, 7, 10]),
                  'm7':np.array([0, 3, 7, 10]),
                  'mM7':np.array([0, 3, 7, 11]),
                  'M7':np.array([0, 4, 7, 11]),
                  'dim':np.array([0, 3, 6, 9]),
                  'aug':np.array([0, 4, 8]),
                  'add9':np.array([0, 4, 7, 14]),
                  'sus4':np.array([0, 5, 7]),
                  '7sus4':np.array([0, 5, 7, 10]),
                  'm6':np.array([0, 3, 7, 9]),
                  '6':np.array([0, 4, 7, 9]),
                  'm7-5':np.array([0, 3, 6, 10]),
                  'm6':np.array([0, 3, 7, 9]),
                  '9':np.array([0, 4, 7, 10, 13]),
    
    }
    
    
    def split_chord(chord):
        j=chord    
        c=j
        if len(c)>1:
            c=c[0:2]
            if c[1]=='#' or c[1]=='♭':
                c=c[0:2]
                j=j[2:]
                              
            else:
                c=c[0:1]
                j=j[1:]
        else:
            j=''
        return c, j
    
    pm = pretty_midi.PrettyMIDI(resolution=960, initial_tempo=120)     
    instrument = pretty_midi.Instrument(0) 
    
    chords = np.array(re.split(" +", imput_chords.rstrip()))
    d_time = 1#コードを鳴らす間隔
    time = 0
    for chord in chords:
        
        croot, ctype = split_chord(chord)
        notes = 60 + root[croot]
        if ctype in chord_type:
            notes += chord_type[ctype]
        else:
            notes += np.array([0, 12])
    
        for note_number in notes:
            note = pretty_midi.Note(velocity=100, pitch=note_number, start=time, end=time+d_time) 
            instrument.notes.append(note)
        
        time = time + d_time
        
    pm.instruments.append(instrument)
    
    filepass='chords.mid'
    pm.write(filepass)

if __name__ == '__main__':
    chords = "C G Am7 Em F CM7 F G7 C"
    midi_create(chords)
```


コードタイプは思いついた代表的な物を並べてあるが，一覧にないもの場合はルート音をオクターブで重ねたものが鳴る。
退職院進の就職活動

#退職院進の就職活動
- 大学情報科学部　卒業
- 上流Sier 就職->退職
- 大学院情報科学研究科 進学
- webエンジニア新卒　内定

といった少し変わったキャリアを歩んでいるM2です。twitterをみてると退職院進をしてる方が思ってた以上に多いです。これから退職院進する方や、退職院進をしたいけど不安な方に参考になればと思いざっくばらんですが記事を書きました。

#退職院進を決めた理由
テンプレ通りのSIerクソからの退職です。
SIerクソは先人の方々が素晴らしい記事を書いてるので検索してください。

当時は某ベンチャー企業にも声がかかっていた為、そのまま転職するという選択肢もありました。
しかし、学部時代の研究が楽しく、査読付き国際会議にも通せたので大学院に戻って専門知識をつけて、選択肢を広げたいなと思い院進をしました。
社会人を数年経験していた場合、学部卒でも審査が通ればDから入学ができるというルートもあったのですが、力及ばず修士として入学しました。

#学部時代の就活
修士の就活のお話の前に、学部時代の就活の話を書きます。
学部時代はふつーに12月に説明会にいき、spiやgdなどの茶番を経て4月に内定を頂きました。(当時は12月解禁だった)
よくある普通の就活でした。学部卒だとアピールすることも、研究を行っていない為サークルなどで培った人間力(笑)で押し通しました。

#退職院進の就活
スケジュールは以下の感じです。【】は周りの動きです

- 3月【就活解禁！説明会ラッシュ!!】　論文投稿+趣味の開発に追われる
- 4月【経団連なんか関係ねえ！面接開始】　逆就活などを通じてやりたいことのできる会社を探す
- 5月中旬【内々定をもらい始める】　エージェントから紹介された希望通りの会社に内定をもらう

こんなかんじなので本気でやった期間は一ヶ月と少しです。
学部時代ほど苦労はしませんでした。
一度働いていた為、具体的にこうゆう業務内容なら働きたいというイメージと研究内容、趣味でのコーディングでアピールができた為スムーズに進みました。
以下に所感を書きます。

##新卒採用の定義について
まず新卒採用を受けられるかどうかという大きい壁があります
会社ごとに新卒採用の定義は違い「一度就職したらダメ」という厳しい会社、
「30までなら新卒だよ」というゆるい会社など様々です
ほとんど会社は就業経験ありでも受けることができ、受けれなかった会社は2,3社ほどです
なので退職院進をすると新卒採用＋中途採用の二つが受けられるという強い存在になります

##退職院進に対する反応
大きく2つに分かれました。

- 「前職を早い段階で辞めてるからうちの会社もやめるんじゃないの？」という悪い印象
- 「自分のやりたいこと学びたいことに貪欲でいいすね」という好意的印象

後者はweb系とかベンチャー系の会社が多かったです。
自分としては前者のみだと思っていたので、すこし嬉しかったです。
自分が興味を持った会社は後者が多かったのでスムーズに進めることができました。
前者の会社も受けることはしたのですが、あっさり切られた為時間の節約になりました。

##給与待遇について
前職を加味した給与で採用されることになりました。
そのため、前職にずっといた時よりも高くなり、福利厚生も良い環境で働けることになりました。
業務内容も希望に近いもので、結果として退職して良い結果にすることができました。

#まとめ　退職院進は素晴らしい
退職院進してもキャリアに傷はつかず、給与も待遇も業務内容もよくなるという良い結果になりました。在学中も好きなことを学ぶことができ、将来に対する不安要素はかなりありましたが、思ってた以上に退職院進にたいする社会の目は暖かいようです。学部卒で就職し、研究や学業に未練のある方、金銭面の問題で進学できなくて後悔している方はとりあず退職院進するのをおすすめします。Dまで行かなくても修士の段階で感じることがあれば自分のように就活をするという選択肢もできるため非常に良いです。
この記事が退職院進したいけど勇気が出ない方への参考になれば幸いです

~~そもそも本格的に研究する前に就活させる社会がおかしいのでは？~~
#2 ディレクトリ内の特定のファイルの名前を再帰的に変更する

# 初めてのプログラミング

第二回目です。
今回は業務自動化系です。

## 今日やったこと
1. 指定のディレクトリ内のファイル（ディレクトリ含む）をすべて取得する
2. 1の中に指定した文字列を含むファイル名のものがあるかを調べる
3. 2があれば、それを特定の文字列に置換する（つまりファイル名を変更する）

## コード
```PHP:index.php
<?php
// 再帰的にファイルを取得（サブディレクトリ内のファイルも取得する）
function getFiles($path) {
	$result = array();

	foreach(glob($path . "/*") as $file) {
        // 取得したファイルのファイル名に"2018-02"があれば"2018-03"に置換
		if(strpos($file, "2018-02") !== false) {
			$newname = str_replace("2018-02", "2018-03", $file);

			rename($file, $newname);
			$file = $newname;
		}
		if(is_dir($file)) {
			$result = array_merge($result, getFiles($file));
		}

		$result[] = basename($file);
	}

	return $result;
}
$path = dirname(__FILE__);
getFiles($path);
```

## 説明
このコードを実行するにあたって、今回はこのコードを書いたPHPファイルが設置してあるディレクトリ内を調べてファイル名の置換をおこなっています。
※```$path = dirname(__FILE__);``` の部分です。 

## 注意点
```rename``` 関数を使っているので、ディレクトリへの書き込み権限がないと、このコードは使えません。

## ダメな点
このコード内に、ディレクトリの権限を変更をする記述はありません。
それゆえに、あらかじめ対象となるファイルのある上流のディレクトリに書き込み権限を与えておかなければいけません。

## おまけ
「シェル芸よ！」と教えていただきました。
これを使うことでも、上記のPHPコードと同様の結果を得られます。

```shell
$ find . -type f -name '*2018-02*'|awk '$0="mv "$0" "gensub("2018-02","2018-03","g")'|sh
```

# 次回やること
再帰関数か単純なループを使ったプログラムを書いてみたいなと思いますが、いかほど。。
ツクールMVで突然マップが読み込まれない・表示されない時の対処法

ツクールMVで突然マップデータが読み込めなくなったり、表示されなくなる場合があります。
これで作っていたゲームが吹き飛んで企画参加に失敗した例も聞きます。
こんなことでエターナルの海にダイブするのは悲しいので、復旧方法をまとめます。

なお、このバグはver1.6で発生する内容の可能性が高いです。
ver1.5.2へのダウングレードをお勧めします。

#エディタを終了せずにdataフォルダをコピーしてバックアップする
まずdataフォルダをコピーします。
マップが読み込めない状態でも、map009.jsonなどのファイルが残っていれば復旧できます。
**この状態で新規マップを作ろうとすると上書きされて消えてしまいます。**
ともかく、バックアップを取ることを最優先しましょう。

#ベテランプラグイン作者に救援要請を出す
マップ関連のファイルはmapXXX.jsom(Xは数字)とmapinfos.jsonの二つです。
どちらもjsonファイルですので、プログラマーには読めます。
あわてず騒がず、詳しい人が対応できるまで待ちましょう。

また修正の際はプロジェクトをzipで転送するのが必須です。
あらかじめ圧縮して待機しましょう。

#実際に修正する
読み込みが失敗している場合、マップのツリー情報が破損している場合が多いです。
マップをフラットな状態に修正することで、解決する場合が多いです。
フラットにするには*"order"*をidと同じ数値になるように変更し、*"parentId"*を全て0にします。
親子関係は組みなおしになりますが、これで復活できます。

#おわりに
正直なところ、詳細は私も詳しくは理解していません。
ただ、こんな感じで復旧できたので、やってみましょう。
Playframework2で外部サイト/ドメインの画像を読み込む

#Play2系で外部サイト/ドメインの画像表示
筆者は非エンジニアなのでHTTP周りに疎く、詰まったので同じような開発初心者のために投稿。
今回はクラウドストレージの画像にアクセスしたいというシチュエーションだった。

プロジェクトルートにあるイメージファイル同様でいけるんじゃないかと以下のコードで対応。

```index.html
//他省略
<img src="example.png">
```
GoogleChromeでlocalhostにアクセスすると画像が表示されていない。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/151904/5d869f77-4376-7f05-733d-e44cf2bb1293.png)

```
Refused to load the image '画像URL' because it violates the following 
Content Security Policy directive: "default-src 'self'". Note that 
'img-src' was not explicitly set, so 'default-src' is used as a fallback.
```

デベロッパーツールで上記の警告が。
どうやらセキュリティ的に良くないからやめなさいとのこと。
コンテンツセキュリティポリシーについて詳しくは<a herf="https://developers.google.com/web/fundamentals/security/csp/">こちら</a>のリンクから。

## 解決法：セキュリティヘッダの設定を行う
Playの公式ドキュメントを参考に。
https://www.playframework.com/documentation/ja/2.4.x/SecurityHeaders

### filterクラスを新規作成
プロジェクトルートにfilterクラスを配置。
筆者はScalaだったが、Javaの方は上記ドキュメントからソースを取得。

```scala:filter.scala
//上記リンクから引用（https://www.playframework.com/documentation/ja/2.4.x/SecurityHeader）
import javax.inject.Inject

import play.api.http.HttpFilters
import play.filters.headers.SecurityHeadersFilter

class Filters @Inject() (securityHeadersFilter: SecurityHeadersFilter) extends HttpFilters {
  def filters = Seq(securityHeadersFilter)
}
```
## application.confに信頼するドメインを記述
```application.conf

play.filters.headers.contentSecurityPolicy = "default-src 'self'; img-src 'self' example.com;"
```
・
・
・
読み込まれた！
![image.png](https://qiita-image-store.s3.amazonaws.com/0/151904/b636188b-4fb3-0edd-9be2-828e176a7208.png)
Maritime RobotX Challenge公式シミュレータのセットアップ

こんにちは、本日は自動航行船ロボコンのMaritime RobotX Challengeの公式シミュレータのセットアップ方法についてメモしておきたいとおもいます。

まず、リポジトリのURLは[こちら](https://bitbucket.org/osrf/vmrc)です。
また本記事は[こちらのチュートリアル](https://bitbucket.org/osrf/vmrc/wiki/tutorials/SystemSetup)を参考にしてください。

#動作環境
##PCスペック
CPU:Intel Core i7 4770K
Memory:32GB
GPU:GTX1060
##OS等
OS:Ubuntu 16.04 LTS
ROS:Kinetic
Gazebo: Ver.7.0.0

#依存関係のダウンロード等
以下のコマンドを実行してください。
(path_to_ros_workspace)にはソースコードを置きたいROSのワークスペースへのパスが入ります。

```install_dependencies.sh
sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
sudo apt-key adv --keyserver hkp://ha.pool.sks-keyservers.net:80 --recv-key　421C365BD9FF1F717815A3895523BAEEB01FA116
sudo apt update
sudo apt install mercurial cmake pkg-config python python-pip git gazebo7 libgazebo7-dev ros-kinetic-ros-base ros-kinetic-teleop-tools ros-kinetic-teleop-twist-keyboard ros-kinetic-gazebo-plugins ros-kinetic-gazebo-ros ros-kinetic-xacro ros-kinetic-joy libeigen3-dev wget
sudo pip install --upgrade pip
sudo pip install packaging
sudo pip install vcstools
sudo pip install appdirs
cd (path_to_ros_workspace)/src
hg clone https://bitbucket.org/osrf/vmrc
cd (path_to_ros_workspace)
catkin_make
```

#ビルド中に起こったエラー

```
vmrc/robotx_gazebo/CMakeFiles/robotx_gazebo_generate_messages_java_gradle.dir/build.make:63: ターゲット 'vmrc/robotx_gazebo/java/robotx_gazebo/build.gradle' のレシピで失敗しました
make[2]: *** [vmrc/robotx_gazebo/java/robotx_gazebo/build.gradle] エラー 1
CMakeFiles/Makefile2:4866: ターゲット 'vmrc/robotx_gazebo/CMakeFiles/robotx_gazebo_generate_messages_java_gradle.dir/all' のレシピで失敗しました
make[1]: *** [vmrc/robotx_gazebo/CMakeFiles/robotx_gazebo_generate_messages_java_gradle.dir/all] エラー 2
make[1]: *** 未完了のジョブを待っています....
```

```
fatal error: robotx_gazebo/UsvDrive.h: そのようなファイルやディレクトリはありません
```
初回ビルド時には上の２つのエラーにであいました。
おそらくオリジナルメッセージのビルド周りだとおもうのでもう一度catkin_makeしてみたところビルドに成功しました。

#シミュレーション実行結果
```bash

roslaunch robotx_gazebo sandisland.launch 
```

![Screenshot from 2018-03-04 00-17-13.png](https://qiita-image-store.s3.amazonaws.com/0/160346/d714a6da-95dc-1ae5-231d-5f8700845cad.png)
Docker日本語 有効化 メモ

debianベースのイメージ（Docker HubのMySQLなど）で日本語を有効化する方法のメモ

日本語を有効化したイメージをビルドする

```:Dockerfile
RUN apt-get update && apt-get install -y locales
RUN echo "ja_JP.UTF-8 UTF-8" >> /etc/locale.gen && locale-gen
ENV LANG=ja_JP.UTF-8
```

タイムゾーンをjstにする

```
ENV TZ=Asia/Tokyo
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
```
webpack3とwebpack4でファイル圧縮率がどれくらい違うか確かめてみる

## 環境
- Ubuntu : 16.04LTS
- node.js : 8.9.4
- npm : 5.6.0

## webpack
- 旧 : 3.11.0
- 新 : **4.0.1**

## 検証(web)アプリ
[**これ**](https://qiita.com/nishiurahiroki/items/9f57536a34f2050926ea#%E3%81%A7%E3%81%8D%E3%81%9F%E3%82%82%E3%81%AE) (ソースは[こちら](https://github.com/nishiurahiroki/bingo-game-made-with-react))
[React](https://reactjs.org/)を[babe](https://babeljs.io/)った程度のシンプルな構成です

## package.json
webpackを『4』にバージョンアップ
加えて『4』では**クライアントツールとして「[webpack-cli](https://github.com/webpack/webpack-cli)」を別途インストールする必要がある**

```diff:package.json___devDependencies
-    "webpack": "^3.6.0"
+    "webpack": "^4.0.1",
+    "webpack-cli": "^2.0.10"
```

## webpack.config.js
『4』に合わせて修正します

```diff
 const webpack = require('webpack');
-const COMMIT_HASH = process.env.COMMIT_HASH || 'dev-environment'
+
+const isProduction = !!process.env.COMMIT_HASH
+
+const COMMIT_HASH = isProduction ?
+                      process.env.COMMIT_HASH : 'dev-environment'
+
+const mode = isProduction ? 'production' : 'development'
 
 module.exports = {
     entry: {
       filename: `bundle.${COMMIT_HASH}.js`
     },
     module: {
-      loaders: [
+      rules: [
         {
           loader: 'babel-loader',
-          exclude: /node_modules/,
+          exclude: [ /node_modules/ ],
           test: /\.js[x]?$/,
-          query: {
+          options: {
             cacheDirectory: true,
             presets: ['react', 'env'],
             plugins: ["transform-function-bind"]
           }
         }
       ]
     },
-    devtool: 'source-map'
+    mode
 };
```
ポイントは『4』の追加要素である「mode」
**production** : ファイル圧縮率高め。ソースマッピング無し
**development** : ファイル圧縮率低め。ソースマッピング有り
合わせて本番と開発、環境に応じてスイッチ出来る様に修正
(ファイル自体分けて運用した方がいいのかな・・・?)

## 試してみる
- 本番用のbundleで試してみる
 - modeは**production**

```sh
COMMIT_HASH=$(git rev-parse HEAD) webpack -d # 開発用の構成ならwebpack -d
```

### 3.11.0
```s
Version: webpack 3.11.0
Time: 23873ms
                    Asset     Size  Chunks                    Chunk Names
bundle.js  3.15 MB       0  [emitted]  [big]  bundle
```
### 4.0.1
```s
Version: webpack 4.0.1
Time: 14658ms
Built at: 2018-3-3 07:46:02
                                             Asset      Size  Chunks                    Chunk Names
bundle.js  2.77 MiB  bundle  [emitted]  [big]  bundle
```
結果を一部抜粋

 - ファイルサイズ
  - 3.11.0 : 3.15MB
  - 4.0.1 : **2.77MB**
 - ビルド時間
  - 3.11.0 : 23873ms
  - 4.0.1 : **14658ms**

## まとめ
期待していた圧縮率は「こんなもんか」という感じでしたが、ファイルの数等にも伴うのかもしれません。
今回試したアプリは全5、6ファイルの小規模なアプリでした(~~コンポーネント指向で作る必要はあったのか~~)

公式のドキュメントもあんまりちゃんと読まずに、勢いで試してみたので、間違い、勘違い等々見受けられましたら、ご指摘等頂ければ幸いです。
Lambda@EdgeでBasic認証する

公開前サービスの最終テストをしたいときなどは、本番と同じドメインで、Basic認証やDigest認証をかけたいことがある。セキュリティというよりは、正常に動作することを確認するため。また、Cookieを使った認証などとは別に動くので都合がよいことが多い。
ということで、Lambda@EdgeでBasic認証をした。何番煎じか分からないが、記録として残しておく。

## コード

```javascript
'use strict';

const BASICAUTH_USERNAME = 'username';
const BASICAUTH_PASSWORD = 'password';
const ENCODED_STRING = new Buffer(`${BASICAUTH_USERNAME}:${BASICAUTH_PASSWORD}`).toString('base64');
const AUTH_STRING = `Basic ${ENCODED_STRING}`;

const AUTH_REQUIRED_RESPONSE = {
  body: '<h1>Authorization Required</h1>',
  bodyEncoding: 'text',
  headers: {
    'www-authenticate': [{
      key: 'WWW-Authenticate',
      value: 'Basic realm="Authorization Required"'
    }],
  },
  status: '401',
  statusDescription: 'Authorization Required'
};

exports.handler = (event, context, callback) => {
  const request = event.Records[0].cf.request;
  const authorization = request.headers.authorization ? request.headers.authorization[0].value : null;

  if ((!authorization) || (authorization != AUTH_STRING)) {
    callback(null, AUTH_REQUIRED_RESPONSE);
  } else {
    callback(null, request);
  }
};
```

## 動作概要

- Lambda@Edgeでは、ふつうのLambdaと違って環境変数が利用できない。ということで、ユーザ名とパスワードがべた書きになっている。コードを管理するときは、CodeBuildでも使って環境変数に指定したユーザ名、パスワードを書き込むといった感じにするとよい
- Basic認証は `{ユーザ名}:{パスワード}` をBase64エンコードした文字列が `Authorization: Basic <エンコードした文字列>` と送信される。ヘッダが存在し、かつ文字列が一致するときは、何もせず、それ以外のときは、`401 Authorization Required` のレスポンスを返却する
格安SIMのススメ

### 本記事を読むとわかること
---
- 「格安SIMが安いらしいけど、何選んだらいいかわからないよー」人向けの記事です
- 本編にある画像ファイルのフローを進んだら、あなたにぴったりなSIMが見つかるかも?

### 本記事の注意事項
--- 
- SIMフリー端末や格安SIMが何なのかと言うのは、先人の記事が沢山あるのでそちらにお譲りします。
- あくまでも2018年2月28日現在の調べです。
- 格安SIM上級者の方には参考にならないと思います。
- カウントフリーが付帯しているサービスに関しては、そのカウントフリーサービスを多用するものとする。
- 通信速度は宗教なので、そこは保証しません。信仰心を強く持ってください。
- このSIMの選択による、読者の皆様の幸せを保証するものではありません。参考にどうぞ。
- 通話機能はあまり重要視してません。そちらを含めたものはまた今度。
- 各プランの料金は日々変動します。このフローでいい感じのものを見つけたら、公式ページに飛んで、よく考えてみてください。

### 本編
--- 
![sim.png](https://qiita-image-store.s3.amazonaws.com/0/125791/e50e7f11-c098-2f9c-a43a-31f36fe6c8b5.png)

以上!!
よき格安SIMライフを!!
質問はコメントでお願いします。

ブログ始めました、よかったら遊びに来てください
https://red-full-moon.com/
TableViewCellの並び替えでドラッグ移動と削除モードの制御方法でハマった。

# はじめに
Swiftを勉強し始めて半年が経過し、tableViewを使っている時にセルの並び替えの仕方を知らなくて困ったので今回の記事で簡単にまとめます。間違っているところがあれば、コメントお願いします。

## 環境
XCode Version 9.2
Swift Version 4.0.3

## やりたいこと
![sampleDemo.gif](https://qiita-image-store.s3.amazonaws.com/0/193112/9e56b9f7-3f9d-fee5-0c5d-248deb343e39.gif)

サンプルデモのように、セルをドラッグして並び替えしたい。
削除したいセルはないので削除モードはいらない。

## ハマった点

```ViewController.swift
func tableView(_ tableView: UITableView, canMoveRowAt indexPath: IndexPath) -> Bool {
     return true
}

func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
     return true
    }
```

`canMoveRowAt`と`canEditRowAt`を両方`true`にすることで編集モードとソートモードの両方使えるようになってしまった。
<img width="384" alt="failureDemoQiita1.png" src="https://qiita-image-store.s3.amazonaws.com/0/193112/99c2b9e3-f2da-3fcb-a8cf-5797519d9a58.png">

削除はしたくないので、
実装したいのは、並び替える機能だけ。
## 解決策
以下のコードを追加すると削除モードが無くなった！
全然そんなこと知らなかった。。。

```ViewController.swift
func tableView(_ tableView: UITableView, editingStyleForRowAt indexPath: IndexPath) -> UITableViewCellEditingStyle {
     return .none
}

func tableView(_ tableView: UITableView, shouldIndentWhileEditingRowAt indexPath: IndexPath) -> Bool {
     return false
 }
```
## 最後に
今回のコードはサンプルとしてgithubに載せています。<https://github.com/tomoyamatsuyama/sampleTableViewCellMove>

## 参考文献
【Swift】View Tableの編集モードの使い方。セルの並び替え、削除をする。<http://hajihaji-lemon.com/smartphone/swift/uiviewtable-edit/>
Gitの基礎　競合の解決

## 競合の解決
マージをしてると競合が発生しできない時があります。
競合が起きるのは以下のような場合です。

- masterでtest.txtを編集しコミット
- 他ブランチでtest.txtの同一の箇所を編集しコミット
- masterからマージ

このような場合はどっちのコミットを優先し残すかわからないためマージができません。
実際に競合を起こして見ましょう

```shell-session
$ git log --graph --oneline --all
* 4060b6b (testBranch) edit test
| * b728329 (HEAD -> master) edit test
|/  
* 29a0d87 wite branch
* 8b01a71 first commit
$ git merge testBranch
Auto-merging test
CONFLICT (content): Merge conflict in test
Automatic merge failed; fix conflicts and then commit the result.
```
競合が起きましたどこで競合の解決の仕方は以下の流れになります

1. 競合したファイルの確認 `git status` `git diff`
2. 競合したファイルの修正 `gitcheckout --ours` or `gitcheckout --theirs (file)`
3. コミット `git commit`

##競合したファイルの確認
まずどこのファイルで競合しているかを`git status`で確認しましょう

```shell-session
$ git status
On branch master
You have unmerged paths.
  (fix conflicts and run "git commit")
  (use "git merge --abort" to abort the merge)

Unmerged paths:
  (use "git add <file>..." to mark resolution)

	both modified:   test

no changes added to commit (use "git add" and/or "git commit -a")

$ more test 
<<<<<<< HEAD
test braaaaaaaaaaaagraph
=======
test bfffffffffffngh
>>>>>>> testBranch
hoge
```
`<<<<<<< HEAD`で書かれているのがHEADの内容(今回はmaster)
`>>>>>>> testBranch`で書かれているのがマージ先での内容です

見にくい時は
`git diff HEAD`で最終コミットとの差分を
`git diff MERGE_HEAD`でマージ先との差分を
`git diff --base`でマージの起点との差分が見れます

##競合したファイルの修正
競合の解決はエディタ(emacs)で編集して直してもいいですが
どっちのブランチを優先するかわかっている時は'git checkout'を使いましょう。

- `git checkout --ours "ファイル名"`で現在のブランチを
- `git checkout --theirs "ファイル名"`でマージ先のブランチを

優先します。
今回はmasterを優先して見ましょう

```shell-session
bash-3.2$ git checkout --ours test
bash-3.2$ more test 
test braaaaaaaaaaaagraph
hoge
```
testファイルがmasterの方になったのがわかります。

##コミット
最後にコミットを行ってマージは完了です

```shell-session
$ git add test
$ git commit -m "merge"
[master addfe61] merge
bash-3.2$ git log --oneline --all
addfe61 (HEAD -> master) merge
4060b6b (testBranch) edit test
b728329 edit test
29a0d87 wite branch
8b01a71 first commit
```

##おわりに
競合の解決は意外と簡単なものです
競合が起きた時にこの記事を思い出してくれると幸いです
GItの基礎 ブランチ

# Gitの基礎 ブランチ
gitのブランチ機能についてまとめました
gitのinit~commitまでの流れは[前記事](https://qiita.com/wataling/items/b730a1f5efdb5c52639a)を参照
osはmacOS High Sierra

## ブランチとは
メインのバージョンと別のバージョンを作る方法です
webサイトを作る時にメニューとあるページを別々にバージョン管理したいという時などに使います

##ブランチの機能
1. ブランチの作成 `git branch` 
2. ブランチの切り替え `git checkout`
3. 他ブランチとのマージ `git merge`

## 準備
はじめにテスト用のローカルリポジトリを作成し、コミットを行います
今回はtestディレクトリにtestファイルを作成しコミットを行いました

```shell-session
$ mkdir test
$ cd test
$ git init
$ echo "test branch" >> test
$ git add -A
$ git commit -m "first commit"
[master (root-commit) 97872e4] first commit
 1 file changed, 1 insertion(+)
 create mode 100644 test
```
## ブランチの作成
`git branch 'ブランチ名'`でブランチ名のブランチを新たに作成できます。
ブランチ一覧は`git branch`で確認できます

```shell-session
bash-3.2$ git branch 'testBranch'
bash-3.2$ git branch
* master
  testBranch
```

今いるブランチには`*`です。`master`にいるので新たに作成した`testBranch`に移動しましょう

## ブランチの切り替え
`git checkout 'ブランチ名'`でブランチの切り替えができます。

```shell-session
$ git checkout testBranch
Switched to branch 'testBranch'
$ git branch
  master
* testBranch
```

`*testBranch`になっておりブランチが切り替わっているのがわかります。

「ブランチの作成+ブランチの切り替え」は`checkout -b 'ブランチ名'`でもできます。

## 他ブランチとのマージ
マージする前の準備としてtestBranchにコミットを行います

```shell-session
$ echo 'hoge' >> test
$ git add -A
$ git commit -m "wite branch"
[testBranch 3681405] write branch
 1 file changed, 1 insertion(+)
```
現在以下のような感じです

```shell-session
$ git log --oneline
29a0d87 (HEAD -> testBranch) wite branch
8b01a71 (master) first commit
```
ここでmasterとtestBranchをマージします。
流れはmasterにcheckoutし、`git merge (ブランチ名)`でマージができます。

```shell-session
$ git checkout master
Switched to branch 'master'
$ git merge testBranch
Updating 8b01a71..29a0d87
Fast-forward
 test | 1 +
 1 file changed, 1 insertion(+)
$ git log --oneline
29a0d87 (HEAD -> master, testBranch) wite branch
8b01a71 first commit
```
masterとtestが同一になってるのがわかります。

##おわりに
以上がブランチの基本的な流れです
マージをしてると稀に競合が起きマージができない場合があります
競合の解決方法は[次回記事](https://qiita.com/wataling/items/f7d82b84d5f5f248bc53)で行います。