OmniAICreator/Qiita-1.07M huggingface dataset:
Fujitsu Server PRIMERGY TX1330 M2へのCentOS7.4インストール

## 概要
富士通のサーバマシン PRIMERGY TX1330 M2を購入したものの、CentOS7.4をインストールしようとすると、RAIDコントローラのドライバをインストールするのに一苦労が必要でした。結果的にうまくいきましたので、その手順を下記に示します。

## マシン構成
本体：Fujitsu Server PRIMERGY TX1330 M2 (Pentium搭載、ディスクレスモデル）
使用ディスク：[東芝 DT01ACA100 1TB アマゾン限定モデル](http://amzn.asia/3kzTTDz) 2台

2台のディスクでRAID 1を構成しました。手順は富士通のサイトでマニュアルを閲覧するなどしてください。

## 事前準備
RAID コントローラのデバイスドライバを、USBメモリなど、CentOSのインストールメディアとは別のメディアに保存します。

マシンを購入したときに同梱されている２枚のDVDのうち、２枚目の"Management and Serviceability"というDVDの中に入っていますので、そこから下記のファイルをコピーします。（ドライブ文字は適宜読み替えてください）
```
E:\SVSLinux\RHDUP\RHEL7\rhel7-u3\megasr2\megasr2-18.01.2016.1108.4fts-2.el7.3-000.x86_64
```
**megasr2**のほうです。ただの`megasr`のほうは不要です。

## CentOS7.4 のインストール

前項のUSBメモリは未だ挿入せず、インストールメディアを挿入してからマシンの電源を入れてしばらくすると、おなじみのCentOSのインストール最初の画面が現れます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/111700/798f068e-133b-a29a-85d8-dc668bcdf50f.png)

`Install CentOS 7`にカーソルを合わせたら、`Tab`キーを押して、下記のオプションを追加します。

```
inst.dd modprobe.blacklist=ahci
```
`=`の文字は、日本語キーボードなら`^`のキー（0の２個となり）ですので、注意。
下図参照。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/111700/74d89d3e-e473-1e53-7900-6b022da15bad.png)


エンターを押します。

すると、下記のような画面で止まるかと思いますので、ここでUSBメモリを挿入し、`r`キーを押します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/111700/10a3f046-3fab-ff56-2364-0165ee5fbf37.png)

すると下図のように挿入したメディアが認識されますので、1を選択。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/111700/88c4362e-e37e-447d-b520-5b4407c7e30e.png)

メディア内のファイルが表示されますので、該当するファイルの番号を選択。（不要とか言っておきながら、入れちゃってました…）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/111700/bbcd5fa1-bf3e-bf07-423f-ba41cf9ac4c8.png)

するとrpmファイルが表示されますので、1を選択。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/111700/c2a11c75-264a-9026-af12-9dce6436105a.png)

[x]のように選択された状態になりますので、続いて`c`を押して続行。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/111700/bd7f900f-3a22-f2cf-c0c9-42c22fe20c55.png)

そして初めのほうの画面に戻ってきますので、`c`を押すと、通常のCentOSのインストールが再開します。特にエラーなくインストール画面が表示されるはず！
![image.png](https://qiita-image-store.s3.amazonaws.com/0/111700/56545ab6-87f5-9d16-7b7a-71c0d12fb9aa.png)

RAID構成したディスクが認識され、ソフトウェアの依存性チェックも問題なければ、万々歳です！
![image.png](https://qiita-image-store.s3.amazonaws.com/0/111700/0514aa62-30b1-2e0b-3653-122f3c185885.png)


## （補足）試行錯誤
web上の記事を探していると、デバイスドライバに関して、「単なる`megasr`のほうもインストールする」とか、「`megasr2`のほうはインストールすると失敗する」というような記事も見かけて、いずれもうまくいかなかったので、混乱しました。

ちなみに、

- `megasr`,`megasr2`両方ともインストールすると、ディスク自体は認識され、GUIのインストール画面までは到達しますが、インストールするソフトウェアの指定で「最小構成」にしても依然性チェックに失敗し、インストールが行えませんでした。
- `megasr`のほうだけをインストールすると、GUIのインストール画面に行く前に、エラーで止まってしまいます。
フォルダ名として使用できない文字列を正規表現でいい感じに変換する

私はFirefox向けに[Tab Session Manager](https://addons.mozilla.org/ja/firefox/addon/tab-session-manager/)という拡張機能を作っています。これは開いているセッションを保存・復元するアドオンで，機能の一つとして保存されたセッションをファイルに書き出してバックアップを保存するオプションがあります。以前は保存場所を特定のフォルダに固定していたのですが，この度保存フォルダを文字列で指定できるオプションを実装することにしました[^1]。
[^1]: フォルダをinput type=fileではなく入力文字列で指定するのは，拡張機能から指定できる保存先がFirefoxのダウンロードフォルダ以下に限定されるためです。ダウンロードフォルダ以外を指定できないUIにしたいという意図があります。
フォルダ名をユーザに入力させる上で考えなければいけないことは，フォルダ名には使用できない文字列があるということです。この記事では，フォルダ名として不正な文字列が入力されたときにいい感じに変換する方法を説明します。

# 前提
ユーザは拡張機能の設定ページからこのようなフォームに入力します。
![入力フォーム](https://qiita-image-store.s3.amazonaws.com/0/207934/8de141e3-be8d-2822-2e43-8ae921f841d3.png)

ここに入力されたフォルダ名を指定してファイルの保存処理を行うわけですが，例えば`folder?`と入力されると保存処理はエラーを吐きます。`?`はファイル名として使用できないためです。したがって，`?`を`-`に変換するなどしてエラーを回避する必要があります。

# やること
* 今回は上記の画像の通りフォルダ名のみを対象とする
* フォルダ名に含まれる特殊文字はハイフンに変換する
 * `a:b?c.d"e<f>g|h` → `a-b-c-d-e-f-g-h`
 * 今回はフォルダ名が対象なので，ピリオドも特殊文字として扱う
* ディレクトリの区切り文字として使えるのはスラッシュまたはバックスラッシュとし，出力はバックスラッシュに統一する
 * `a/b\c` → `a\b\c`
* 2つ以上連続するスペース，バックスラッシュは1つに変換する
 * `a___a\\b` → `a_a\b` (スペースを`_`で表しています)
* フォルダ名の先頭と末尾のスペースは削除する 
 * `a_\_b_` → ` a\b` (スペースを`_`で表しています)
* パスの先頭と末尾のバックスラッシュは削除する
 * `\a\` → `a`
* OSによって予約された名前(CON,PRNなど)やパスの最大長は今回は考えない

# 実装
```javascript:replaceFolderName.js
const replaceFolderName = str => {
  const specialChars = /\:|\?|\.|"|<|>|\|/g;   //使用できない特殊文字
  const slash        = /\//g;                  //単一のスラッシュ
  const spaces       = /\s\s+/g;               //連続したスペース
  const backSlashs   = /\\\\+/g;               //連続したバックスラッシュ
  const sandwich     = /(\s\\|\\\s)+(\s|\\)?/g;//バックスラッシュとスペースが交互に出てくるパターン
  const beginningEnd = /^(\s|\\)+|(\s|\\)+$/g; //先頭と末尾のスペース,バックスラッシュ
  
  const replacedStr = str
    .replace(specialChars, `-` )               //特殊文字をハイフンに置き換え
    .replace(slash,        `\\`)               //スラッシュをバックスラッシュに置き換え
    .replace(spaces,       ` ` )               //連続するスペースを一つに置き換え
    .replace(backSlashs,   `\\`)               //連続するバックスラッシュを一つに置き換え
    .replace(sandwich,     `\\`)               //" \ \"のような"サンドイッチ"をバックスラッシュ一つに置き換え
                                               //→フォルダ名の先頭と末尾のスペースを削除，スペースのみのフォルダを削除
    .replace(beginningEnd, ``  );              //先頭と末尾のスペース，バックスラッシュを削除

  return replacedStr;
};
```
[サンプルはこちら](https://codepen.io/sienori/pen/JLLrdX)
こんな感じにすれば不正なフォルダ名のエラーを回避できる……はずです。
見落としている点やもっとエレガントな方法があれば教えて頂けると幸いです。
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x83　を解決したい

#Issue
Windows 10 Python 3.6環境で

pip install future　としたら
```
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x83 in position 87: invalid start byte
```
と言われた。コードを書き替えるなど不毛なことはしたくない。
解決法は散見されたが、無意味だった。

#Solution
```python
python -m pip install -U https://github.com/pypa/pip/archive/master.zip
```
これでpipの最新版（不安定）がインストールされる。このバージョンでは問題が解消されているのでエラーは起きない。

#Reference
https://ja.stackoverflow.com/questions/39360/pip%E3%81%A7pyperclip%E3%81%8C%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%9B%E3%82%93-unicodedecodeerror-utf-8-codec-cant-decode-byte-0
searchBarの二度押し防止

#searchBarの二度押し防止

``` swift
    func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
        //一度オフにして
        searchBar.isUserInteractionEnabled = false
        //0.5秒後に使えるようにする
        DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
            searchBar.isUserInteractionEnabled = true
        }
```
Java 10 で導入されたintersection型がスゴイ(?)

Java 10 ではvarという、型推論による変数宣言が可能になりました。
例えば、
var url = new URL("http://ukiuni.com");
とかすると、urlが型推論され、URL型の変数となります。

ここまでだと、「へぇ。変数の記述を省略できるシンタックスシュガーなのね。」で話が終わるのですが、Java 10 の型推論では、「表現不可能な型も推論できる」ようになっています。

。。。な…何を言っているのかわからねーと思うが、俺も何だかわからねー。

サンプルコードを示します。

```Sample.java
public class Sample{
  public static void main(String[] args) {
    var ins = (Foo & Bar) ()->{};
    ins.foo();
    ins.bar();
    ins.forFunctionalInterfaceMethod(); //☓ 実装なくても呼べる　→コメントを頂き訂正。３行上の()->{} が実装。
    ins.toString(); //Object型でもある。
  }

  interface Base {
    void forFunctionalInterfaceMethod();
  }

  interface Foo extends Base {
    default void foo() {
      System.out.println("foo");
    }
  }

  interface Bar extends Base {
    default void bar() {
      System.out.println("bar");
    }
  }
}
```

これをJava 10 でコンパイル、実行すると、こんな出力です。

```
$ javac Sample.java  && java Sample
foo
bar
```

つまり、
var ins = (Foo & Bar) ()->{};
のinsは、Foo型でもあり、Bar型でもあり、更にはそのインターフェースの親であるBase型でもあり、Object型でもある、という型になるのです。これが、「表現不可能な型」の、intersection型です。
これで動的Mixinのようなことができるようになりました。

。。。どういうケースで便利に使えるのでしょう。。。
見聞をお持ちの方、コメントをお願いします。
大学生の僕がゼロからWebエンジニアになった話 -3年生-

[大学生の僕がゼロからWebエンジニアになった話 - 2年生 -](https://qiita.com/uenoryo/items/3dee9aa3e4878e887d20)の続きになります。

高校時代まで陸上選手だった僕が
大学時代に勉強してエンジニアになるまでの話です。(ほとんど思い出話です)

## 大学3年生

1年生から2年生まで、プログラミングに出会ってから、
独学で勉強を進め、自分で簡単なサービスを作れるようになりました。

そして、間もなく僕は実際の現場に興味を持ち始めます。

「今僕が使っているサービスは、どんな人たちが、どんな感じで開発しているんだろう？」

僕は、 ~~大学で一緒にプログラミングをするような友達もいなかったので~~
複数人で１つのモノを作った経験もなく、開発に「加わる」ということに不安を持ちながらも
あるベンチャー企業にインターン生として参加しました。

***

現場に出てまず感じたのは、自分の無能さでした。
とにかく、言葉の意味がわからないのです。

「とりあえずxxにあるプロジェクトからクローンしてきてローカルで動くようになったら教えて」

というシンプルな指示でも、「は？」という感じでした。

今まで適当に手元のPCでなんとなく動かしていただけだったので、
いきなり手も足も出ない状況になり、勤務初日から途方にくれたのを覚えています。

その後、帰り道にいくつも本を買って帰りました。
GitやUnix、DBやクラウド環境など、とにかく仕事場でよくわからなかった知識を
次の出社日までに叩き込みました。

**技術を扱える以前に、会話についていけないと、自分に対する指示の意味すらわからないのです。**

そして、環境構築がなんとなくできるようになり、バージョン管理を覚え、
issue => ローカルでいじくる => できた！ => push
のような流れを自力でできるようになりました。

たったそれだけですが、そこにたどり着くまで
自分一人ではかなり苦労しました。
開発者にとっては当たり前のことでも、初めての人には意味不明なのです。w

***

なんとか簡単なissueが消化できるようになった後、
僕は同じ組織の別のプロジェクトにも加わりました。

そこで僕は次の壁にぶち当たりました。

そのプロジェクトには **リポジトリの番人** がいたのです。

最初に入っていたプロジェクトでは、レビュー体制も不十分だったのですが、
次のプロジェクトでは、番人がきっちりとレビューをしてくれました。

それが僕にとてもとても苦しいものでした。

ロジックはもちろん、インデントや変数名など
細かい部分も指摘を受けました。

**別に動いてるんだからいいじゃん(´；ω；｀)**

そう思いながらも、今までの個人の開発では全く意識していなかった部分で怒られ、
なんどもはじき返されて、半泣きでプッシュしまくりました。

当時はすごく苦しかったのですが、それはとてもいい経験になりました。

少しずつ、「動けばいい」という単純な考え方から、
様々なことを考えて実装するように変化していきました。

そして、「良いコード」と「悪いコード」 の存在に気づき始め、
さらに自分のコードを見直して、それが「良いコード」だと思えた時

うへへへへw

と思うようになりました。

***

インターンに参加して、１年が過ぎると、
僕は自分でかなり成長を実感していました。

それは、１年前に書いていた自分のコードを見て
なんじゃこりゃww と思うことで自覚できます。

そしておそらく１年後の自分は、今の自分のコードを見て同じように
なんじゃこりゃww と笑うでしょう。

でもそれがエンジニアとして成長することだと思っています。

視野が広がり、できることが増え、
仕事をするのがどんどん楽しくなってきました。

次回、４年生になり、僕は卒業研究を放置して
仕事ばかりやっていた時の話をします。。
アプリが落ちた原因をwindowsのログから探る

# アプリが落ちた！

windows10でアプリが落ちた、起動しない
もしくは自作アプリが落ちるけど、デバッグもできない場合、
OSのログに例外とかの情報が残っているかもしれない。
何が起きているかのヒントになるかもしれないので
以下の手順で探ってみよう。

# 手順

1. 左下のwindowsマークを右クリックする
2. イベントビューアーを左クリックする
3. 左ペインのwindowsログを開く
4. Applicationを左クリックする
5. 真ん中のペインに「情報」とか「エラー」とかあるので見てみる
Ubuntu カーネルのバージョン変更

#Ubuntu カーネルのバージョン変更手順

Ubuntuにてカーネルのバージョンをダウングレードやアップデートしたいときに困ったので載せておきます。

##目次
1.前提条件
2.カーネルのバージョンチェック
3.インストール可能なカーネルチェック
4.カーネルインストール


##1.前提条件
・OS:Ubuntu 16.04

##2.カーネルのバージョンチェック
現在使用しているカーネルのバージョンを確認する。

```
>sudo uname -a
Linux igaki-System-Product-Name 4.4.0-116-generic #140-Ubuntu SMP Mon Feb 12 21:23:04 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
```

##3.インストール可能なカーネルチェック
リポジトリに登録されているインストール可能なカーネルのバージョン一覧を確認する。

```
>sudo apt-cache search linux-image
alsa-base - ALSA driver configuration files
linux-image-4.4.0-21-generic - Linux kernel image for version 4.4.0 on 64 bit x86 SMP
linux-image-4.4.0-21-lowlatency - Linux kernel image for version 4.4.0 on 64 bit x86 SMP
...
linux-image-4.10.0-1004-gcp - Linux kernel image for version 4.10.0 on 64 bit x86 SMP
linux-image-4.10.0-1006-gcp - Linux kernel image for version 4.10.0 on 64 bit x86 SMP
linux-image-4.10.0-1007-gcp - Linux kernel image for version 4.10.0 on 64 bit x86 SMP
linux-image-4.10.0-1008-gcp - Linux kernel image for version 4.10.0 on 64 bit x86 SMP
linux-image-4.10.0-1009-gcp - Linux kernel image for version 4.10.0 on 64 bit x86 SMP
...
linux-image-gcp - Google Cloud Platform (GCP) Linux kernel image
linux-image-gke - Google Container Engine (GKE) Linux kernel image
linux-image-oem - OEM Linux kernel image
```

##4.カーネルインストール
上記の3の手順で確認したカーネル一覧からダウンロードしたいカーネルをインストールします。

```
>sudo apt-get install linux-image-extra-4.10.0-42-generic linux-image-4.10.0-42-lowlatency linux-image-4.10.0-42-generic
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
...
Found initrd image: /boot/initrd.img-4.4.0-21-generic
Adding boot menu entry for EFI firmware configuration
完了

>sudo reboot
```

再起動後、起動中の画面で[Esc]キーを押すと以下の画面に遷移する。
以下の画面にて[Advanced options for Ubuntu]を選択する。
![7712759805808.jpg](https://qiita-image-store.s3.amazonaws.com/0/182526/6f6240fc-a070-b381-7cbd-ed440fab8ff2.jpeg)


カーネルを選択する画面にてインストールしたカーネルを選択する。

![7712759845954.jpg](https://qiita-image-store.s3.amazonaws.com/0/182526/f732f119-446e-4c4b-0b77-c780c14f3e80.jpeg)

OSの起動後、以下のコマンドを実行しカーネルのバージョンが変更されていることを確認する。

```
>uname -a
Linux igaki-System-Product-Name 4.10.0-42-generic #46~16.04.1-Ubuntu SMP Mon Dec 4 15:57:59 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
```
【Python】myPythonHacks

Pythonの色々な方法についてメモ｡

### yyyyMMddHHssよりDatetime型へ変換

```py
from datetime import datetime

yyyyMMddHHss = '201804011200'
tdatetime = datetime.strptime(yyyyMMddHHss, '%Y%m%d%H%M')
print(tdatetime)
```
非同期処理を順番に処理する機能をUniRxで作る


![EventQueue.gif](https://qiita-image-store.s3.amazonaws.com/0/113504/4c12f8d5-d0c0-2106-a924-1373627036ed.gif "EventQueue.gif")

シャドバのカード演出など，イベントキューがゲームで使われる機会はとても多いので作ってみました．


```csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UniRx;
using System;

/// <summary>
/// 順番に非同期処理を処理していくクラス
/// </summary>
public class ObservableQueueWorker : IDisposable{

	bool running = false;
	List<Func<IObservable<Unit>>> eventQueue = new List<Func<IObservable<Unit>>> ();
	bool isDisposed = false;

	/// <summary>
	/// 非同期処理を追加
	/// </summary>
	public void Enqueue(Func<IObservable<Unit>> asyncAction){
		eventQueue.Add (asyncAction);
		if (!running) {
			running = true;
			SubscribeNext ();
		}
	}

	/// <summary>
	/// 先頭に割り込み
	/// </summary>
	public void InsertFirst(Func<IObservable<Unit>> asyncAction){
		if (running) {
			eventQueue.Insert (0, asyncAction);
		}else
			Enqueue (asyncAction);
	}

	/// <summary>
	/// 現在進行しているイベントが終わったらDisposeする
	/// </summary>
	public void EndLoop(){
		Debug.Log ("End Loop");
		InsertFirst (()=>Observable.Start(Dispose));
	}

	// 次のObservableを発火させる
	void SubscribeNext(){
		if (eventQueue.Count == 0 || isDisposed){
			Debug.Log ("Stop Running");
			running = false;
			return;
		}

		var e = eventQueue [0];
		eventQueue.RemoveAt (0);

		e ()
			.Finally (() => SubscribeNext ())
			.Subscribe ();
	}

	public void Dispose(){
		isDisposed = true;
	}
}
```


# 呼び出し側例

```csharp

		var eventQueueWorker = new ObservableQueueWorker ();
		for (int i = 0; i < 10; i++) {
			int index = i;
			eventQueueWorker.Enqueue (()=>{
				Debug.Log(index);
				return Observable.Timer(TimeSpan.FromSeconds(1)).AsUnitObservable();
			});
		}

		Observable.Timer(TimeSpan.FromSeconds(2))
			.Subscribe(x=>eventQueueWorker.InsertFirst(()=>{
				Debug.Log("割り込み2秒");
				return Observable.Timer(TimeSpan.FromSeconds(2)).AsUnitObservable();
			}));

		Observable.Timer(TimeSpan.FromSeconds(6))
			.Subscribe(x=>eventQueueWorker.EndLoop());
```


# まとめ
これから実際に使ってみてもっと欲しい機能があったら追加していきます．
改善できる点などあればコメントいただけると嬉しいです．
UITableViewの編集モードを使ってCellの削除を実装するまで

# TableViewのCellの削除の流れ
tableViewのdlegateなどは実装してあることを前提としています。
1. 編集ボタンを作ってNavigationBarに追加
2. 編集ボタンを押したらTableViewの編集モードを切り替える
3. 削除の実装
4. バツボタンの背景色を変える
5. 通常時の横にシュッてやるとdeleteが出てしまうのをオフにする

## 1. 編集ボタンを作ってNavigationBarに追加
まず実装したいViewを選択した状態でxcodeの上のメニューバーからEditor -> Enbed In -> NavigationControllerでNavigationBarを画面に追加する(Viewが二つになるがこれらがうまく重なるイメージ)
その後実装したいViewのControllerのviewDidLoad()に次のコードを書き込む

```swift:ViewController.swift
        self.navigationController?.isNavigationBarHidden = false
        navigationItem.title = "title"
        navigationItem.rightBarButtonItem = editButtonItem
```

ちなみにこのeditButtonは押すと勝手にDoneのボタンに切り替わってくれる優れもの

## 2. 編集ボタンを押したらTableViewの編集モードを切り替える
さらに優れていることにeditButtonを押した時の処理はsetEditingという関数をoverrideすることで書ける
のでここに処理を書き込む

```swift:ViewController.swift
    override func setEditing(_ editing: Bool, animated: Bool) {
        //override前の処理を継続してさせる
        super.setEditing(editing, animated: animated)
        //tableViewの編集モードを切り替える
        tableView.isEditing = editing //editingはBool型でeditButtonに依存する変数
    }
```

## 3. 削除の中身の実装
削除ボタンが押された時の処理は次のdelegateメソッドの中に書ける

```swift:ViewVontoroller.swift
    func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
        //dataを消してから
        datasorceArray.removeAtIndex(indexPath.row)
        //tableViewCellの削除
        tableView.deleteRows(at: [indexPath], with: .automatic)
    }
```

## 4. バツボタンの背景色を変える
3までで背景が白の場合などは違和感を感じないだろうがtableViewの背景が白以外だとバツボタンの背景色が白になっているので違和感がある。これはTableViewCellクラスの方に背景色を書き込むことで解決する。

```swift:TableViewCell.swift
    override func awakeFromNib() {
        super.awakeFromNib()
        self.backgroundColor = UIColor(red: 235/255, green: 225/255, blue: 213/255, alpha: 1.0)
    }
```

## 5. 通常時の横にシュッてやるとdeleteが出てしまうのをオフにする
cellのeditingStyleというのを設定してやれば良いらしい。

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

# 参考資料
https://stackoverflow.com/questions/47900063/how-to-change-uitableviewcell-edit-button-background-color
http://saruhei1989.hatenablog.com/entry/2015/09/08/190000
https://ja.stackoverflow.com/questions/37791/uitableview%E3%81%AE%E5%89%8A%E9%99%A4%E3%83%9C%E3%82%BF%E3%83%B3%E7%84%A1%E5%8A%B9%E3%81%AB%E9%96%A2%E3%81%97%E3%81%A6
アンドロイドアプリを作る。（４日目）

３連休が終わってしまった。

##テキストの調整
###行間
####android:lineSpacingMultiplier
```java
<TextView
   ~中略~
   android:lineSpacingMultiplier="1.5"
   android:text="サポートサイト、 http://www.suport.to/ です。お問い合わせは 0120-4567-7890 または web@wings.to からお願いします。"
   ~中略~/>
```

####android:lineSpacingExtra
こちらだと、単位指定ができる。

```java
<TextView
   ~中略~
   android:lineSpacingExtra="14sp"
   android:text="サポートサイト、 http://www.suport.to/ です。お問い合わせは 0120-4567-7890 または web@wings.to からお願いします。"
   ~中略~/>
```

###最大表示文字数
####android:ellipsizeとandroid:maxLines
以下のように設定すれば、2行に制限されはみ出した分は「•••」となるらしいが、上手く動かない。

```java
<TextView
   ~中略~
   android:ellipsize="end"
   android:maxLines="2"
   android:text="サポートサイト、 http://www.suport.to/ です。お問い合わせは 0120-4567-7890 または web@wings.to からお願いします。"
   ~中略~/>
```
![スクリーンショット 2018-03-30 15.35.59.png](https://qiita-image-store.s3.amazonaws.com/0/185846/36468569-9b39-7080-31c4-50e4a65638ca.png)

##imageButtonの配置
`res/drawable`に画像を配置して、drawableを右クリック。
`new` > `Drawable resouce File`を選択して、通常時・フォーカス時・クリック時の三種類設定するとボタンぽくなる。
![スクリーンショット 2018-03-30 23.06.31.png](https://qiita-image-store.s3.amazonaws.com/0/185846/a7df5833-b02c-fb9e-b300-1e9909dd99b5.png)

その後、`activity_main.xml`でimageButtonを配置すると、ウィンドウが立ち上がる。そこで先ほど作ったもの(button_icon)を配置すると、button_icon.xmlが`res/drawable`に表示される。

そしたら、以下のようにコードを書く。

```java:button_icon.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" android:drawable="@drawable/btn3" />
    <item android:state_focused="true" android:drawable="@drawable/btn2" />
    <item android:drawable="@drawable/btn1" />
</selector>
```

また、`activity_main.xml`のimageViewに以下を足すことで、背景が透明になる。
これを入れないと灰色の背景が表示されてしまう。

```java:activity_main.xml
android:background="@android:color/transparent"
```

#あとがき
仕事がある日は、お昼休みと終業後しかやる時間がないから、もどかしい。
Gitで開発するときの注意点

# はじめに
Gitを使った開発をして色々アドバイスをもらったので備忘録として。
基本的なことばかりかもしれないけど、適宜追加していけたら。

# Gitでチーム開発するときの注意点
## 1. gitで確保しておきたいディレクトリには**`.keep`ファイル**を置いておく
- ディレクトリが空だとgitに追跡されない
- .gitignoreに`!.keep`とすることでデータ用ディレクトリなどでデータは無視しつつディレクトリを保持できる

## 2. pushするときは`git diff`を見てからpushする
- 余計な変更が含まれているかもしれない(e.g. debug用のprintとか)

## 3. masterからmy-branch1を切って、my-branch1からmy-branch2を切った場合

- リモートをpullするとき

```bash
$ git checkout master
$ git pull origin master
$ git checkout my-branch1
$ git merge master
$ git checkout my-branch2
$ git merge my-branch1
```

- リモートにマージするとき

```
master <- my-branch1
# my-branch2のベースをmasterに変更（Githubのリポジトリ名横のeditボタンから可能）
master <- my-branch2
```

- 差分がちゃんと出る


## 4. masterにマージしたら`delete branch`する
- その際、そのブランチに向いているブランチがある場合deleteすることができない
- 3.のようにベースを変更することでdeleteできるようになる
- **消し忘れに注意**

## 5. 3.の様に一旦切り出したけど元のブランチにマージする予定のものは**その旨をプルリクの中に記述**しておく

## 6. conflictした時

i. 最新のブランチを持ってくる

```bash
$ git checkout master
$ pull origin master
```

ii. 自分の作業ブランチにmergeする

```bash
$ git checkout my_branch
$ git merge master
```

iii. conflictを修正する

```bash
$ vim '修正すべきファイル'
```

- 残すべき部分を残し、消すべき部分は消す
- それ以外にも修正したいところがあれば修正

iv. ステージに上げてコミットする

```bash
$ git add .
$ git commit
```

v. リモートブランチにpushする

```bash
$ git push origin my_branch
```

## 7. 特定のブランチをローカルブランチにマージしたいとき

```bash
$ git pull origin 'remote branch name':'local branch name'
```

## 8. git commit時にflake8でコードチェック

```bash
$ pip install flake8
# プロジェクトのルートで
$ flake8 --install-hook git
```

- .git/hooks/pre-commitファイルが作成される

## 9. **動かないコードはコミットしない**
どうして僕は、TOEICを受けようと思ったのか？

# **目次**
- なんで、英語勉強しようと思ったの？
- なぜ、TOEIC受けようと思ったの？
- 目標

# **なんで、英語勉強しようと思ったの？**
それは、主に、

**1. プログラミング書いていて、「あれ？これ英語勉強していれば、もっと深く理解できるんじゃね？」と思った**
**2. 英語知っていれば、より多くの文献に当たる事がで出来る**
**3. ~~モテたいから~~(嘘です。すみません。。)**

この2点です。
特に、2番目の方が理由として強いですね。

最近では、何かわからない事があった時、英語の文献を見て解決する事が多かったので、
**いつまでもグー◯ル翻訳頼りはマズイなぁ**と感じたのがきっかけですね。
それと、Scalatraとか、**自分の学びたい技術が書かれてる本が英語の本しか無いっていうケースが多くなった**ので、
英語力を極めたほうがいいのでは？と思ったのが一番の理由です。

後は、一番目の理由もプログラミング書いている内に、思うようになってきました。

例えば、Javaの抽象クラス宣言。

```java
public abstract class ClassName {
//クラスの中を記述
}
```

これ、「public = 公の,公開の」「abstract = 抽象的な」という意味なので、
ズバリ訳すと、

```
公開 抽象的な クラス　クラス名{
//クラスの中を記述
}
```

になります。これなら、

「公開って書いているから、誰でもいい的な？そんなオープンな感じのクラスなんだなぁ。でも抽象的だから、まだ具体的にはっきりと内容が決まってないのかな？」
とプログラミング得意じゃない人でもなんとなく分かるのではないでしょうか。

出来る人なら(そもそも訳さなくてもいけると思うが)、一発で「あぁ、抽象クラスで、"公開"だから、あらゆるクラスから参照できるんだ。」と秒速で分かるはずです。

つまり、英語が出来るアメリカ人は、**もっと、単純にブログラミング言語を捉えているのでは？**と思ったわけです。

「public = あらゆるクラスから参照可能」
「private = 自クラスのみ参照可能」

という覚え方ではなく、

「public = "公開"だから、あらゆるクラスから参照可能なんだな。」
「private = "私的な"だから、自クラスのみ参照可能なんだな。」

っていう感じの方がより覚えやすいし、**また、今までとは違う見え方があるのでは？と思ったわけです。**


**【2018/03/31更新】**
public についてですが、
以下の記事の内容が、すごく納得いったので、掲載しときます。
[http://kyokofukuda.hatenablog.com/entry/20090412/1239540615](http://kyokofukuda.hatenablog.com/entry/20090412/1239540615)

**public = "みんなの為の、全ての人の為の"**

という意味があるというのは、凄く腑に落ちました。
英単語帳でも、「公開の」という意味が書かれていますが、
**「全ての人に向けて,みんなに向けて」**という風に捉えると、よりpublicのイメージがしやすいのではないでしょうか？
日本語と英語では性質が違うので、改めて注意しないといけませんね。。。。

# **なぜ、TOEIC受けようと思ったの？**
さぁ、勉強を始めよう!
・・・・・・と思っても、流石に長続きしませんよね。

勉強するにも、何か目標は大事です。
そこで、就活では有名なTOEICに初挑戦する事にしました。
え？お前には無理だって？**やって見なきゃ分からないじゃない！**

# **目標**
### **夏までに、900点を取る。**
目標達成する様に、頑張ります！
プログラム初心者の電気系学生がクラスについて学ぶ　~クラス化の基本~

# まえがき
このレポートはSkype勉強会での活動を「書面としてアウトプットする」こと、「電気系の学生の成果物を作るための意識高い系のレポート」です。完全初心者なので、勉強会参加者の先輩たちから様々な］ツッコミを頂きながら書いております。それゆえに先輩たちの目から外れた誤字脱字等ございますが、ぜひともツッコミいただいて、私の勉強にさせていただければと思います。

# 復習
現在、「独習C#」のクラスに突入しております。
こんなコードを書きました。


```C#
using System;
using System.IO;
using System.Collections.Generic;
using System.Text.RegularExpressions;

namespace class_replay{//名前空間。クラスを分割している。名前の衝突を防ぐ。
    class Person //Personクラスを宣言。（位置はNamespaceの中かつ、他のクラスの外） 
    {   public string FirstName{get;set;};//Publicは他のクラスからアクセス可能
        public string LastName{get;set;}; //stringはLastName、FirstNameの型  
    }

    class Program
    {
        static void Main(string[] args)
        {
          var p1 = new Person();//Personクラスでp1という名前でインスタンス化

          p1._FirstName="太郎";//p1というｙFirstNAMEの属性に、太郎を代入
          p1._LastName="山田";

          var p2 = new Person();
          p2.FirstName="花子";
          p2.LastName="山田";

          Console.WriteLine($"{p1.LastName}{p1.FirstName}");//$は{}内の指示語展開のスイッチ（C#6で搭載）
          Console.WriteLine($"{p2.LastName}{p2.FirstName}");

        }
    }
}
```
と，ここまで書くのに，まずかなり時間がかかってしまいました。（汗）
これからもSkype勉強会をよろしくお願いします！
Symfony4を使った開発ではまったところ 2018春

# LiipFunctionalTestBundleが使えない

## 現象

`composer require --dev liip/functional-test-bundle` すると一応入る。(v1.9系)
が、最も使いたいfixtureをymlで書いてロードする用途では使えない。

具体的には、
nelmio/aliceを入れろと言われる `'nelmio/alice should be installed to use this method.'` <br/>
↓<br/>
`composer require --dev nelmio/alice` とするとnelmio/aliceのv3系が入るが、nelmio/alice v3系とLiipFunctionalTestBundleは互換性がない。<br/>
↓<br/>
`composer require nelmio/alice:"^2.0"` とすると、今度はnelmio/alice v2系がSymfony3+と互換性がなく入らない。</br>

## 解決策

LiipFunctionalTestBundle v2系を使う。ただしまだアルファ版。
`composer require --dev liip/functional-test-bundle:"~2.0@alpha" nelmio/alice theofidry/alice-data-fixtures`

なお、LiipFunctionalTestBundleのWebTestCaseで `$this->loadFixtureFiles(['path/to/yml']);` したいだけならHautelookAliceBundleは要らなくなった。
その代わりに必要になったのが `theofidry/alice-data-fixtures` https://github.com/theofidry/AliceDataFixtures

nelmio/alice theofidry/alice-data-fixtures をcomposer require後、実際に使うためにはバンドルを有効にする必要がある。
まだ（？）flex用レシピがないので `config/bundles.php` に手動で追加する。

```diff
<?php
return [
    // ..
+    Nelmio\Alice\Bridge\Symfony\NelmioAliceBundle::class => ['dev' => true, 'test' => true],
+    Fidry\AliceDataFixtures\Bridge\Symfony\FidryAliceDataFixturesBundle::class => ['dev' => true, 'test' => true],
];
```

`config/bundles.php` を更新した後はキャッシュクリアが必要（dev, testであっても！）
`bin/console cache:clear --env=test`

# NotFoundHttpException, BadRequestHttpExceptionなどHTTPステータスコード制御系の例外がキャッチされない

## 現象

404とか400にするつもりでコントローラ内でこの系統の例外を投げたら、500エラーになっちゃう。

## 解決策

この系統の例外を自動キャッチしてHTTPステータスコードを変える機能は、実は `symfony/twig-bundle` の `ExceptionListener` の働きだったので、同様のものを自前で書くか `composer require symfony/twig-bundle` する。
symfony/twig-bundleはレシピがあるので自動で有効化された。

# 機能テストをするとSQLのログがバーっと画面に表示される

`$ composer require symfony/monolog-bundle`
すると出なくなる

# TBA...
IBM Cloud Private (ICP) 付属のPrometheusとGrafanaでアプリケーションのメトリクスを可視化する

# 目的

IBM Cloud Private (ICP) は製品付属のモニタリングツールとして、PrometheusとGrafanaがkube-systemネームスペースで動いています。通常ではノードやICP関係のサービスのメトリクスを収集しているのですが、せっかくなのでアプリケーションのメトリクスも収集して可視化してみます。

検証環境
- IBM Cloud Private 2.1.0.2 (Kubernetes 1.9.1)

# 手順

## アプリのPrometheus用メトリクス対応

過去記事「[Spring Boot 2で/actuator/prometheusを有効にする](https://qiita.com/teruq/items/c233552f1cfaba7f2959)」のような方法があります。この場合、アプリのメトリクスは`/actuator/prometheus`で収集できます。

## PrometheusのConfigMapを確認

PrometheusのConfigMapは`monitoring-prometheus`という名前で定義されているので中を確認します。すると、怪しげなコメントが見つかります。

```
$ kubectl get configmap monitoring-prometheus -n kube-system -o yaml | more

      # Example scrape config for pods
      #
      # The relabeling allows the actual pod scrape endpoint to be configured via the
      # following annotations:
      #
      # * `prometheus.io/scrape`: Only scrape pods that have a value of `true`
      # * `prometheus.io/path`: If the metrics path is not `/metrics` override this.
      # * `prometheus.io/port`: Scrape the pod on the indicated port instead of the default of `9102`.
      - job_name: 'kubernetes-pods'

        kubernetes_sd_configs:
          - role: pod
```

実は、`prometheus.io/scrape: "true"`をPodのアノテーションで指定すると、このPrometheusは自動的にメトリクスを収集してくれます。また、収集時のパスやポートは`prometheus.io/path`と`prometheus.io/port`で変更することができます。

## アプリのデプロイ

以下のようにアノテーションを指定します。

```
apiVersion: apps/v1
kind: Deployment
metadata:
  name: kube-sample-top
spec:
  replicas: 2
  selector:
    matchLabels:
      app: kube-sample-top
  template:
    metadata:
      labels:
        app: kube-sample-top
      annotations:
        prometheus.io/scrape: "true" # 収集の有効化
        prometheus.io/path: /actuator/prometheus # パス
        prometheus.io/port: "8080:8080" # Podのポート:コンテナポート
    spec:
      containers:
(略)
```

## Prometheusの確認

PromethuesのUIを確認します。ポートが公開されていないのでport-forwardします。

```
$ kubectl get pod -n kube-system | grep monitoring-prometheus 
monitoring-prometheus-7994986858-4nwp8                    3/3       Running     0          5d
(略)

$ kubectl port-forward monitoring-prometheus-7994986858-4nwp8 9090:9090 -n kube-system
```

ブラウザで http://localhost:9090/ にアクセスし、メニューのStatus→Targetsを選択します。うまくいっていれば、次のようにScrapingが始まっているはずです。

<img width="1233" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/241424/77c2b8ce-101b-cecc-4602-6ac97a457f93.png">

## Grafanaの確認

ICPのダッシュボードからPlatform→Monitoringを選択するとGrafanaが表示されます。試しに空のダッシュボードを作り、JVMのヒープ使用量をグラフ表示してみます。

次のような条件を指定します。

<img width="555" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/241424/ad44c81c-8332-0ffa-35a6-6b2f34d4b444.png">

するとグラフが描画されました。

<img width="1279" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/241424/74a8179e-8f15-9926-63ad-002ecb331035.png">

非常に簡単でしたね。

以上です。
Lombokの@builderで親クラスも含めたい場合

https://stackoverflow.com/questions/44948858/lombok-builder-on-a-class-that-extends-another-class のコードをまんまコピペ。```@Builder```はクラスに付けることが多いが、コンストラクタに付与してそこに親子両方のパラメータを列挙する、という回避案が書かれている。

```xml
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.16.20</version>
</dependency>
```

```java
@AllArgsConstructor
@ToString
public class Parent {
	  private double d;
	  private float e;
}
```

```java
@ToString(callSuper=true)
public class Child extends Parent  {
	  private String a;
	  private int b;
	  private boolean c;

	  @Builder
	  public Child(String a, int b, boolean c, double d, float e) {
	    super(d, e);
	    this.a = a;
	    this.b = b;
	    this.c = c;
	  }
}
```

```java
Child child = Child.builder().a("aVal").b(1000).c(true).d(10.1).e(20.0F).build();
System.out.println(child);
```

```
Child(super=Parent(d=10.1, e=20.0), a=aVal, b=1000, c=true)
```
Effective DevOps devopsに対する誤解とアンチパターン


# はじめに
- Effective DevOps、`Effective` とつく本には外れが少ない(イメージがある)ので早速読んでみました!
- その中でも5章の `devopsに対する誤解とアンチパターン` が非常に参考になると思ったかつすごく耳に痛い部分が多かったので、要約・抜粋します。
- 良本だったので興味がある方は是非買って読んでみてください!

## devopsに対するよくある誤解

### devopsに関係があるのは開発者とシステム管理者だけだ
- devopsはdevelopmentとoperationsの合成語だが、devopsの概念には、異なる職能の人がコラボレーションすることでよりよくしていくという考え方で、開発者とシステム管理者だけに収める概念ではない。

### devopsはチームである
- 「devopsチーム」のような特定のチームを作るのは、理想的な状態ではない。元々devops文化がいない組織に、devopsチームという区切りは既存のコミュニケーションを悪化させることがあれど、軽減することはない。本質的な変化を根付かせるためには、背後にある課題に取り掛かる必要がある。

### devopsは肩書だ
- devopsエンジニアという想像される人物像
	- `コードの書き方も知っているシステム管理者`
	- `システムの基礎も知っている開発者`
- これらのイメージは非現実なもので、スケーラビリティでもない。devopsの本質は文化的運動であり、効果的なdevopsのためにその思想と原則を組織全体で取り入れる必要がある。
 
### devopsはウェブ系のスタートアップだけの問題だ
- devopsはWeb系のサービスが多いスタートアップでこそ重要だと思われがちだが、大きな組織でもdevopsの原則を取り入れることには大きな効果がある。

### devopsには認定資格が必要だ
- devopsの大部分は文化の問題で、資格試験で測れるものではない。

### devopsとは、半分の人員ですべての仕事をすることだ
- devopsはソフトウェア開発とシステム開発の両方の仕事が出来て、一人分の給料で働いてくれる人間を手に入れることだと思っている人がいるが、このような考えは有害だ。
- devopsは、企業で必要なエンジニアの数を半分にいしてコストを節約するわけはない。devopsとは、サービス障害の回数と時間を削減したり、開発にかかる時間を短縮したり、個人とチームの力を底上げしたりして、仕事の品質と効率を上げるための手段である。

### devopsには「正しい方法」（または「間違った方法」)がある
- ある企業のdevops戦略がうまくいっているからといって、それと同じプロセスがどこでもdevopsの正しい方法になるわけではない。

### devopsを取り入れるためにはX週間/Xヶ月かかる
- devopsは継続的なプロセスである。目的地ではなく旅の過程なのだ。devopsのかなりの部分は文化的なもので、改革の一部にどれだけの時間がかかるか予測するのは難しい

### devopsはツールの問題だ
- devopsの推進にツールは効果的だが、devopsは特定のツールを使って自動化をすすめるだけのものではない

### devopsとは自動化のことだ
- devopsはインフラストラクチャーの自動化や継続的インテグレーションなど、退屈な反復作業を自動化することだけがdevopsではない。だが、一番大きな効果を生み出すためには、透明性やコラボレーションの水準を上げて理解を深める必要がある。

### devopsは一時期的な流行だ
- devopsは技術、ツール、プロセスに縛られたものではないので、古びたり新しいものに取って代わられたりする可能性は低い。devopsは個人、チーム、組織のストリーとアイデアによって定義される運動だ。devopsは持続的な対話であり、成長や変化を導くプロセスアイデアの継続的進化なのだ。

## devopsのアンチパターン

### 非難文化
- 非難文化とは、ミスが発生したときに、個人レベルでも組織レベルでも、人を非難し、処罰する傾向のことである。ポストモーデムやレトロスペクティブの一部として行われる根本原因分析で犯人探しが行われる。責められるのを必死に避けようとする環境では、学習やコラボレーションに力は入らない。

### サイロ
- 部門や組織のサイロは、同じ企業の他のチームと知識を共有する気がないチームの空気を表している。サイロ化されたチームでは、目的や責任を共有せず、それぞれバラバラの役割を重視する。これに非難文化が結びつくと、立場の安定のために情報の抱え込みが起きる。結果として、複数のチームで行う仕事は完成が遅れたり、困難になったりする。

### 根本原因分析
- 根本原因分析とは、問題やニアミスのもとになった「根本」原因を明らかにして、再発を防ぎための適切な行動を取ろうとする手法である。根本原因分析は単一の問題の根本原因を究明することが出来るが、直接の原因に注目がいきすぎて、間接的に影響を与えたかもしれない要員に目が入らなくなる

### ヒューマンエラー
- ヒューマンエラーとは、ミスを犯した人間自体がエラーの直接的な原因だとする考え方で、根本原因分析の結果、よく根本原因とされる。しかし、過度に単純化されたものの見方でその人の判断やその実際の行動に移るための要因を隠してしまう。
GBDKによるゲームボーイソフト制作-3回 キー入力-

前回：[GBDKによるゲームボーイソフト制作-2回 文字を出してみる-](https://qiita.com/blackpman/items/40a933c6b77db554e4ad)
次回：[GBDKによるゲームボーイソフト制作-4回 背景表示-](https://qiita.com/blackpman/items/12258e6a9ee9f2d032de)
## 記事の内容
ゲームボーイのキー入力処理を試してみた記録。
## ソースコード
```C++:key_input.c
#include <stdio.h>
#include <gb/gb.h>

void main() {
	UINT8 joypad_result;
	
	while(1) {
		joypad_result = joypad();
		
		if (joypad_result & J_START) {
			printf("PUSH START\n");
		}
		if (joypad_result & J_SELECT) {
			printf("PUSH SELECT\n");
		}
		if (joypad_result & J_B) {
			printf("PUSH B\n");
		}
		if (joypad_result & J_A) {
			printf("PUSH A\n");
		}
		if (joypad_result & J_DOWN) {
			printf("PUSH DOWN\n");
		}
		if (joypad_result & J_UP) {
			printf("PUSH UP\n");
		}
		if (joypad_result & J_LEFT) {
			printf("PUSH LEFT\n");
		}
		if (joypad_result & J_RIGHT) {
			printf("PUSH RIGHT\n");
		}
	}
}
```

## 実行結果
![key_input.png](https://qiita-image-store.s3.amazonaws.com/0/246149/8fa00f97-6512-ed88-e8b4-1e4f1cf606f8.png)

ゲームボーイの各キーに対応した入力を行うと、押されたキーに応じてprintfで指定した1行のメッセージが出力される。
## 解説のようなもの
### 2行目
ゲームボーイのキー入力には「gb/gb.h」のincludeが必要。
### 7行目 while
ゲームプログラムで定番のループ処理。
### 8行目 joypad関数
今回の本丸。
「gb/gb.h」で以下のように定義されている。

```C++
/** Reads and returns the current state of the joypad.
    Follows Nintendo's guidelines for reading the pad.
    Return value is an OR of J_*
    @see J_START
*/
UINT8
joypad(void) NONBANKED;
```

#### ざっくり意訳
現在入力されているキー入力状態が数値で返ってくる。
返り値は「J_*」で定義されたキーごとのビット情報を表したもの。

「J_*」の各定数は「gb/gb.h」の上のほうで定義されている。

```C++
/** Joypad bits.
    A logical OR of these is used in the wait_pad and joypad
    functions.  For example, to see if the B button is pressed
    try

    UINT8 keys;
    keys = joypad();
    if (keys & J_B) {
    	...
    }

    @see joypad
 */
#define	J_START      0x80U
#define	J_SELECT     0x40U
#define	J_B          0x20U
#define	J_A          0x10U
#define	J_DOWN       0x08U
#define	J_UP         0x04U
#define	J_LEFT       0x02U
#define	J_RIGHT      0x01U
```

使い方（判定方法）はこのコメント文の中に書かれている通り。
今回作成したソースコードもこれにならって8キーの分判定処理をしているだけ。

ということで今回はこんな感じで。
このキー入力と前回の文字表示など組み合わせると色々遊べるかも？
Xcode9.3 XVim2 (動くようになりました。ただし...)

Xcode9.3でXVim2がうまく動かなかったのですが (2018/03/30時点)、下記コミットの時点で動くようになってます。
ただし、Xcode9.2以下と互換がないようで、Xcode9.2以下で動かしたい場合は"Xcode9.2"タグ時点のものでmakeする必要があるようです。(未確認)


```
コミット: 6bf85d2ed0b470f6fd8190aa34a08169624cc4c2 [6bf85d2]
日時: 2018年4月2日 21:20:22 JST
ブランチ: develop
```
Systemd Unit File チートシート

Systemd のサービススクリプトを作る時に毎回調べているので、その負荷軽減のためにメモします。
サービススクリプトを作成する際にご利用ください。

# サンプル

```sh
[Unit]
Description=名前
After=network-online.target

[Service]
ExecStart=実行ファイルの絶対パス
ExecStop=/bin/kill -INT ${MAINPID}
Restart=always
WorkingDirectory=実行ディレクトリの絶対パス

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

## 説明
サンプルのキモを説明します。

* After 依存するサービス。network-online.targetでネットワーク起動後に作動する。サービスは大体ネットワークに依存するので、サンプルに記載。
* ExecStop 停止コマンドで実行される。MAINPIDには本スクリプトで起動されたサービスのプロセスIDが入るので、どのコマンドでも（Ctrl + Cで終了できるコマンドは）このスクリプトで停止可能になります。
* WorkingDirectory node.js等、実行ディレクトリにライブラリが配置される構成ではこれが有効。golangのワンバイナリ実行ファイル等の際は省略可能。
* Restart サービスが異常停止した場合に再起動してくれる。
* WantedBy ランレベル３で起動するサービスはmulti-user.target

# ファイルの配置場所

```
/etc/systemd/system/
```

# よく使うsystemctl系コマンド

```
sudo systemctl enable xxxx #有効化
sudo systemctl disable xxxx #無効化
sudo systemctl start xxxx #起動
sudo systemctl stop xxxx #起動
sudo systemctl status xxxx #状態確認
sudo systemctl daemon-reload #Unitファイルの変更を反映
journalctl -f #ログ確認

```

## もっとカスタマイズしたい。
より良き仕様は[ここ](https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/system_administrators_guide/sect-managing_services_with_systemd-unit_files)を見ること。
負荷をかけない透明なボタンの作り方

- Unity のバージョン
    - Unity 2017.3.1f1

# 導入
みなさん、uGUI で透明なボタンを作りますよね?
さて、どのようにつくりますか?

一般的な作り方は、ボタンを用意して、それに紐付いている Image の Color を α値 = 0 にする方法でしょう。

しかし、この方法だと実は描画に負荷を与えてしまっています。。見た目では描画していないように見えていますが、実は Image の α 値 = 0 にしても描画されてしまっています。(α値 = 0 の Mesh が残っているため、描画対象になってしまっている)

## Button に Image を使ったときの挙動
<img width="1491" alt="ImageButton.png" src="https://qiita-image-store.s3.amazonaws.com/0/151719/0948056c-1cf8-39ea-aa6e-7a301067c466.png">
[Button の Image を α = 0 にする前]

<img width="1490" alt="ImageButtonAlpha.png" src="https://qiita-image-store.s3.amazonaws.com/0/151719/086e1a3e-0d24-bf76-ac35-52d9e1a94bf4.png">
[Button の Image を α = 0 にした後]

FrameDebugger の UGUI.Rendering.RenderOverlays -> Canvas.RenderOverlays.DrawMesh がボタンの描画部分
普通に表示しても透明にしても、Draw Mesh が発生する。

描画をなくし、当たり判定だけを取るためにはどのようにしたらよいでしょうか。

# 解決方法
Image の継承元である Graphic を継承したクラスを作成します。

```cs:ClickDetector.cs
public class ClickDetector : Graphic
{
    protected override void OnPopulateMesh(VertexHelper vh)
    {
        // Base クラスで Mesh を生成しているので、override で Mesh を生成させないようにする。
        // Graphic はデフォルトで DoLegacyMeshGeneration() を呼ぶようになっており、
        // その中で OnPopulateMesh(Graphic.workerMesh) を実行している。
        // Graphic.workerMesh (= vh) にアクセスしてしまうと、Mesh が自動生成されるようになっている

        // Mesh が生成されると、Sprite が貼られていない Image のように、白い画像が出力されるのでどうにかしないといけない。
        // vh で mesh が必ず作られてしまうので、Clear を叩いて Mesh を削除する。
        vh.Clear();
    }
}
```

コメントに書いてある細かい話のコードはこのあたり。
https://bitbucket.org/Unity-Technologies/ui/src/a3f89d5f7d145e4b6fa11cf9f2de768fea2c500f/UnityEngine.UI/UI/Core/Graphic.cs?at=2017.3&fileviewer=file-view-default#Graphic.cs-423

ここで作成した ClickDetector を Image の代わりに GameObject にくっつけましょう。

## Button に自作の 「ClickDetector」 をくっつけたときの挙動
<img width="1489" alt="clickdetector.png" src="https://qiita-image-store.s3.amazonaws.com/0/151719/3dcf8e57-a29e-4ec9-bee7-1045c6282661.png">
[Button の GameObject の Image を、 ClickDetector に差し替え]

FrameDebugger の UGUI.Rendering.RenderOverlays -> Canvas.RenderOverlays.DrawMesh が無くなっている

できた。
結局Reactは他(Vue.js, Angular)と比べて何がよかったのか。触ってみてわかった初めてのフロントエンドフレームワーク。

フロントエンドフレームワークも通常のプログラミングと同じように、第二,第三の言語の習得にそこまで時間はかからない。
選択に時間を使うくらいなら、何か一つ直感で選んで遊んでみるべきである。

私は、それを知らずにそれなりの時間をフレームワークの特徴探しに費やしてしまったので、過去の自分自身に送るつもりでこの記事を書いてみる。そして、過去の私と同じ境遇の人が少しでも参考にしてくれたらいいと思う。

これらは完全に主観であるため、何か納得できない点があれば、コメント欄に残しておいてほしい。

# Why choose React over Angular and Vue.js
上で述べたように、フロントエンドフレームワークの学習という観点では何から始めても大きな問題はない。ここでは、その'何か'でReactが選ばれる理由を述べる。

## Reactは小さく、シンプル。
Reactは、ちょっとしたReactとの対話方法を覚えれば、殆どが素のJavaScriptである。**JSXを除けば。**
だから、Reactの学習に対してそこまで臆病になる必要はない。**あなたが臆病になっているのはJSXの方だから。**

ReactはDOM操作以外の、例えばAjax通信だとか、そういうことに**一切関知しない。**自身はDOM操作をする機械だと思っているし、実際そのように行動する。通信やらデザインはお門違いだから、他にやらせておけばいい。

だから、**Reactを覚えるために通信やらデザインやらの知識は必要ない**し、必要になったときに必要になったツールを覚えたり作ったりすればいい。Reactはそれらを受け入れる準備をしてくれている。

この点は、Vue.jsも非常に似ている。

対して、Angularは巨大なAPI群を持っている。プログラマが考える機能はAngularが手伝ってくれる。何かをするのに、ほかから何かを持ってくる必要はないし、Angularを理解していれば他にはなにも必要ない。**Angularができることなら。**

## JSXを過度に警戒しなくても良い。
JSXがTypeScriptのようなJavaScript亜種、または全く別の言語だと思っているのであれば、それは間違いである。JSXは多くの場合、Reactを選ばない理由として挙げられるが、それは開発者の嗜好であり、JSX自体が醜い生き物というわけではない。
確かに、JavaScriptとは似ても似つかぬ書き方をするが、少しでもその世界に足を踏み入れると、HTMLとJavaScriptをうまく融合した、理にかなった書き方であることを知ることができると思う。

```jsx
render() {
    return(
        <div className='main'>
            Hello, This is main app!
            <SubApp {...this.props} />
        </div>
    )
}
```
はっきり言って、これには慣れが必要だ。特に、引数の渡し方や親との通信の仕方には**JSX特有のルールがある。**

しかし、それに慣れてしまえば、JSXはHTMLやCSSをReact内にうまく取り込んでくれることに気がつくことができるだろう。
下の例を見てほしい。こんなにシンプルなHTMLでも、実は超巨大なWebアプリケーションだ。つまり、ページの内容であるHTMLやデザインのためのCSSはReactの管轄内にのみ存在すればよく、**JavaScriptと同じように**煮るなり焼くなりできようになるということだ。

```html:index.html
<html>
<head>
  <script crossorigin src="https://unpkg.com/react@16/umd/react.development.js"></script>
  <script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/babel-core/5.8.34/browser.min.js"></script>
  <title>The Ultra Big Project</title>
</head>
<body>
  <div id="root"></div>
  <script type="text/babel" src="js/script.js"></script>
</body>
</html>
```

もちろん、コンポーネント指向のフレームワークでは全てにおいて似たような書き方ができる。しかし、HTMLに予め触れたことがあるのであれば、JSXを使ったDOMの描写についてイメージしやすいだろう。

## React-Nativeという武器。
ReactにはReact-Nativeという大きな武器を持っている。React-Nativeをかんたんに説明すると、**スマートフォン向けのアプリケーションをReactで書くことができるソリューション**だ。それも、WebViewのような張子の虎ではなく、UIパーツや処理も含めすべてが実際にスマートフォン上でNativeに実行される。

React-Nativeはまだ熟した技術ではないが、それでも個人制作やかんたんなツールで採用することができるレベルになって来ている。Reactに限った話ではないが、Webの技術は本当の意味で**フロントエンドを呑み込もうとしている。**この波に乗るか乗らぬかは自分次第だが。

それはさておき、React-NativeはReactを学ぶ十分な理由になりうるのである。

## 情報量が多く実用に耐えうる。
Reactが世の中に出てからもう6年が経とうとしている。その間、ES5,6の違いはあれど、React自身に大きな方向転換はなく成長してきた。
そのおかげか、企業のWebサービスなどでReactが使われているのをよく見かけるようになっている。この記事を投稿しているQiitaもそのうちの一つだ。
学習だけではなく、**実務のための技術を習得したい**のであれば、Reactはいい選択肢かもしれない。

# おわりに
ここまで、Reactの利点を上げてきた。Reactには、それを選択するための理由が多数あることをわかっていただけただろうか。

では、Reactを学べばその他のフロントエンドフレームワークは必要なくなるのかといえばそれは違う。適材適所という言葉があり、Reactが苦手な所ではその他のそれを選択してみるのもいいだろう。最初に書いたように、第二の習得はそれほど困難ではないということを頭に入れておいてほしい。

おつかれさまでした。
Twitterを使って外出先から家のラズパイをしゃべらせる

# はじめに
外出先から、自分の存在感を示すべく、家の中に家内放送したくなりました。
スマホTwitterアプリで投稿して、その内容を家のラズパイにしゃべってもらおうと思います。

# 準備
- Raspbian Stretchインストール済みRaspberry Pi 3
- Raspberry Pi3 から音が出ること

## OpenJTalkのインストール
音声合成にOpenJTalkを使いました。
OpenJTalkのインストールと女性の音声への変更と、読み上げスクリプト

```
$ sudo apt-get install open-jtalk
$ sudo apt-get install open-jtalk-mecab-naist-jdic hts-voice-nitech-jp-atr503-m001
$ wget http://downloads.sourceforge.net/project/mmdagent/MMDAgent_Example/MMDAgent_Example-1.7/MMDAgent_Example-1.7.zip
$ unzip MMDAgent_Example-1.7.zip
$ sudo cp -R ./MMDAgent_Example-1.7/Voice/mei /usr/share/hts-voice/
$ nano speak.sh
#!/bin/sh
TMP=/tmp/voice.wav
echo "$1" | open_jtalk -m /usr/share/hts-voice/mei/mei_happy.htsvoice -x /var/lib/mecab/dic/open-jtalk/naist-jdic -ow $TMP && aplay --quiet $TMP
rm -f $TMP
$ chmod 755 speak.sh
```

読み上げテスト

```
$ ./speak.sh 俺は、海賊王になる！
```

ちゃんと読み上げられれば成功です。

## TwitterAPI
Twitter
https://apps.twitter.com/
CONSUMER_KEY、CONSUMER_SECRET、ACCESS_TOKEN、ACCESS_TOKEN_SECRETをメモします。

## PythonのOAuth認証ライブラリrequests-oauthlibをインストール
```
$ pip install requests requests_oauthlib
```


## Pythonプログラムを書きます
5秒に一度、投稿をチェックして、前回の投稿日時と比較して新しかったら、音声合成でしゃべらせるプログラムとなります。

```config.py
CONSUMER_KEY = "xxxxxxxxx"
CONSUMER_SECRET = "xxxxxxxx"
ACCESS_TOKEN = "xxxxxxxxxxx"
ACCESS_TOKEN_SECRET = "xxxxxxxxxxxx"
```

```timeline.py
# -*- coding:utf-8 -*-
import json, config, time
import datetime
from datetime import datetime as dt
from requests_oauthlib import OAuth1Session
import subprocess

CK = config.CONSUMER_KEY
CS = config.CONSUMER_SECRET
AT = config.ACCESS_TOKEN
ATS = config.ACCESS_TOKEN_SECRET
twitter = OAuth1Session(CK, CS, AT, ATS)

url = "https://api.twitter.com/1.1/statuses/user_timeline.json"

params ={'count' : 1}
check_time = dt.now()
while(1):
    req = twitter.get(url, params = params)

    if req.status_code == 200:
        timeline = json.loads(req.text)
        for tweet in timeline:
            tstr = tweet['created_at']
            _post_time = datetime.datetime.strptime(tstr, '%a %b %d %H:%M:%S %z %Y')
            post_time = datetime.datetime(_post_time.year, _post_time.month, _post_time.day,_post_time.hour,_post_time.minute,_post_time.second)
            post_time = post_time + datetime.timedelta(hours=9)
            tstr = post_time.strftime('%Y/%m/%d %H:%M:%S')
            print(tweet['user']['name']+'::'+tweet['text'])
            print(tstr)
            cstr = check_time.strftime('%Y/%m/%d %H:%M:%S')
            print(cstr)
            if post_time > check_time:
                print(tweet['user']['name']+'::'+tweet['text'])
                msg = '/home/pi/speak.sh '+tweet['text']
                subprocess.call(msg, shell=True)    
                check_time = post_time
    else:
        print("ERROR: %d" % req.status_code)
    time.sleep(5)
```

# 実行
```
$ python3 timeline.py
```

# まとめ
これで、家にいなくとも、私の存在をアピールできます。
ubuntuを入れてみよう（ソフト編）

# Windowsで使っていたソフトとその代替え
## Windowsで使ってたソフト
+ ブラウザ(Chrome)
+ 動画(Mac-be)
+ 画像(フォト)
+ 動画編集(AviUtl)
+ 画像編集(GIMP)
+ テキストエディタ(Vim)
+ 3Dモデリング(sketch up)

## ubuntuでつかえる上記の代替え
+ ブラウザ(Chrome)
+ 動画(VLC)
+ 画像(なんか標準のやつ)
+ 動画編集(まだ)
+ 画像編集(GIMP)
+ テキストエディタ(Vim)
+ 3Dモデリング(sketch up)

## これから
動画編集ソフトをさがす！！
AndroidStudio3.1でエラーいっぱいでたお話

# はじめに
すごい独り言します．
AndroidStudioの安定版の新しいバージョンがリリースされました．
https://android-developers.googleblog.com/2018/03/android-studio-3-1.html
JetbrainsのIDEの新しいバージョンがリリースされるとワクワクしますよね．
いつもありがとうございます．Jetbrains．

よしAndroidStudio3.1に！
<img width="769" alt="スクリーンショット 2018-03-30 20.47.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/129578/d47d65c4-cc68-94fc-466f-ac1c2a048ddd.png">

すごいエラー出ました．

# 結局何がいけなかったのか
大きく二つあります．
## Null安全についての構文エラー

https://kotlinlang.org/docs/reference/null-safety.html
公式ガイドが一番わかりやすいですね．
https://qiita.com/koher/items/d9411a00986f14683a3f
こちらも参考になりました．

## 継承についてのエラー

```
Class 'RecyclerViewAdapter' is not abstract and does not implement abstract base class member 
@NonNull public abstract fun onCreateViewHolder(@NonNull p0: ViewGroup, p1: Int): RecyclerViewAdapter.ViewHolder 
defined in android.support.v7.widget.RecyclerView.Adapter	
```

abstractクラスは`NonNull`なのに，実装してるのは`Null`許容してますよ？
きちんと継承してください？
という感じのエラーでしょうか．

# 最後に
早く学生レベルから現場レベルのエンジニアになりたい今日この頃です．
何言ってるんだコイツってなりましたら是非突いてくれると幸いです．
独り言に付き合っていただきありがとうございました．:sunny:
MW WP FormのViewフラグの設定

#素晴らしきMW WP Form
Wordpress開発者であれば、一度はお目にかかるであろう「[MW WP Form](https://plugins.2inc.org/mw-wp-form/)」
簡単にフォームを作成でき、確認画面やバリデーションの設定も容易にできる。
マジでオススメ。（MW WP Formの回し者じゃないよ）

#この記事を書いた理由
このプラグインを使用している時に、テンプレート側で表示画面の情報を取得したい！
あれ、どうやるんだ？ってなった人向けにこの記事を残します。

#設定方法
早速設定方法をば。

```php:functions.php
function entry_mwform_setquery($url, $Data){
  if($Data->get_view_flg() === "input"){
    set_query_var("entry_form_view_flg", "input");
  }elseif($Data->get_view_flg() === "confirm"){
    set_query_var("entry_form_view_flg", "confirm");
  }elseif($Data->get_view_flg() === "complete"){
    set_query_var("entry_form_view_flg", "complete");
  }
  return $url;
}
add_action('mwform_redirect_url_mw-wp-form-***', 'entry_mwform_setquery', 10, 2); //***にフォームのkeyを設定
```

#取得方法
```php:template.php
$view_flg = get_query_var("entry_form_view_flg");
```

#あとがき
この他にもいろいろ便利なアクションフックが揃っているので、
ぜひMW WP Formを使いましょ！（MW WP Formの回し者じゃないよ）
Wordpressで現在表示しているテンプレートを開発ツールのConsoleに表示する方法


#使い方
ログイン時のみ使用しているテンプレートをConsoleに出力してくれます。
`footer.php`の`</body>`の上に記述するだけで使用できます。

※`footer.php`でjQueryを読み込んでいるときは、`wp_footer()`の下に記述してください

```php:footer.php

<?php
  if(is_user_logged_in()):
    global $template;
    echo '<script>console.log("'.$template.'");</script>';
  endif;
?> 
```

きれいなテンプレート構造にしてあればいらないと思いますが、
外部の会社から引き継いだWordpressのときとかに使うと、開発が楽になるかも。。。？
[Ubuntu] USBカメラの情報を確認、変更するコマンドまとめ

## 準備
- v4l2-utilsのインストール

```
$ apt-get install v4l-utils
```

## コマンド一覧
- デバイスの情報を表示

```
$ v4l2-ctl -d /dev/video0 --all
```

- 対応解像度の表示

```
$ v4l2-ctl -d /dev/video0 --list-formats-ext
```

- 解像度の変更

```
$ v4l2-ctl -d /dev/video0 --set-fmt-video=width=<width>,height=<height> --set-parm=<Hz>
```

- コントロール一覧の表示

```
$ v4l2-ctl -d /dev/video0 --list-ctrls-menu
```

- コントロールの変更

```
$ v4l2-ctl -d /dev/video0 -c <ctrl>=<val>
```
昨日頂いた指摘をもとに修正しました

<h1>昨日頂いた指摘の修正</h1>

```index.php
foreach ($db->query($sql) as $row) {
   array_push($stmt,$row);
 }
```
の部分はfetchAllで処理する形にしました。
sqlはプレスホルダで処理をするという記事をたくさん見たので、下記のような形に変えました。
エスケープは実行部分で使用するという記事を見たので変更。


```index.php
<?php
require_once('db_info.php');
 $statement = $db->prepare("SELECT * FROM 画像 WHERE nam LIKE (:nam) ");
 if($statement){
	 //プレースホルダへ実際の値を設定する
	 $statement->bindValue(':nam', "%".htmlspecialchars($_GET['search'],ENT_QUOTES,'UTF-8')."%", PDO::PARAM_STR);
 }
 $statement->execute();
 $result = $statement->fetchAll();
 ?>
 <!DOCTYPE html>
 <html>
   <head>
     <meta charset="utf-8">
     <title>記事の検索</title>
   </head>
   <body>
     <form action="" method="get">
       <p>記事の検索</p>
       <input type="text" name="search" placeholder="<?=htmlspecialchars($_GET['search'],ENT_QUOTES,'UTF-8') ?>"><br>
       <input type="submit" name="" value="検索">
     </form>
		 <?php foreach ($result as  $value): ?>
			 <p><?php echo $value['nam'] ?><br>
			 <?php echo $value['dat']; ?></p>
		 <?php endforeach; ?>
   </body>
 </html>
```
こちらのサイトを参考に訂正して見ましたー。
様々なご指摘ありがとうございます！
https://www.websec-room.com/2013/12/17/1339
Wordpressで管理画面の設定 > 一般に任意のカスタムフィールドを設定する方法

#この記事を書いた理由
営業さんからの
「これ、クライアントに設定させられないかな？」の一言
#設定方法
```php:functions.php
//Twitter／Facebook／InstagramのURLを設定するカスタムフィールドを追加
add_action('admin_init', function(){
  //Twitter設定
  add_settings_field(
    'site_twitter_link',
    'Twitter URL',
    function(){echo(get_original_input_customfield("site_twitter_link"));},
    'general'
  );
  register_setting('general', 'site_twitter_link');

  //Facebook設定
  add_settings_field(
    'site_facebook_link',
    'Facebook URL',
    function(){echo(get_original_input_customfield("site_facebook_link"));},
    'general'
  );
  register_setting('general', 'site_facebook_link');

  //Instagram設定
  add_settings_field(
    'site_instagram_link',
    'Instagram URL',
    function(){echo(get_original_input_customfield("site_instagram_link"));},
    'general'
  );
  register_setting('general', 'site_instagram_link');
});
//input fieldを返す
function get_original_input_customfield($name = ""){
  if($name === "") return false;
  $html = '<input type="text" name="'.$name.'" id="'.$name.'" class="regular-text" value="'. esc_attr(get_option($name)). '">';
  return $html;
}
```

#取得方法
```php:template.php
$twitter_link = get_option('site_twitter_link');
$facebook_link = get_option('site_facebook_link');
$instagram_link = get_option('site_instagram_link');
```