OmniAICreator/Qiita-1.07M huggingface dataset:
UIテストでsuspend/resume

# suspendしてbackgroundに入る

これは簡単で、`UiDevice#pressHome`を呼び出せばできます：

```java
    public static void enterBackground() {
        UiDevice device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation());

        device.pressHome();
    }
```

# resumeしてforegroundに戻る

`UiDevice#pressRecentApps`でアプリ一覧を出して、そこでアプリケーションの表示名を探してclickします。
しかし、Recent AppsのUIレイアウトに依存するので、今後UIが変わった場合は対応する必要があります。下記の方法だと一応API14~API28までは動きます。

```java
    public static void enterForeground() throws Exception {
        Context context = InstrumentationRegistry.getTargetContext();
        UiDevice device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation());

        device.pressRecentApps();
        UiObject object = device.findObject(new UiSelector().description(context.getString(context.getApplicationInfo().labelRes)));
        object.click();
    }
```

参考：

- [android - How to regain Access on a Activity after sending it to background - Stack Overflow](https://stackoverflow.com/questions/23293301/how-to-regain-access-on-a-activity-after-sending-it-to-background)
CSS基本

#セレクタ

##CSS
![Screen Shot 2018-08-08 at 22.37.19.png](https://qiita-image-store.s3.amazonaws.com/0/274410/040f1818-f1c5-42c3-c34d-948a4b26483d.png)

- div spanはdiv内にあるspan
- div>spanはdiv直下のspan
- p + pは　pに続いてるp


![Screen Shot 2018-08-08 at 22.37.03.png](https://qiita-image-store.s3.amazonaws.com/0/274410/69d5acbe-c191-57ab-8ca2-ad35eff527a6.png)
【Java】オブジェクト指向

参考「スッキリわかるJava入門p263～p366」

#7章　要約

まず、オブジェクト指向を学ぶ理由として、
「ソースコードが長く複雑になりすぎて、開発者自身が把握しきれなくなる」ということを防ぐためである。

そもそもオブジェクト指向と基本文法では、学ぶものも学び方も全く違う。
そのため、本質を理解せずに使用している人も多い。

・オブジェクト指向の定義
ソフトウェアを開発するときに用いる部品化の考え方のこと

・オブジェクト指向の本質
現実世界の登場人物とその振る舞いを、コンピュータ内の仮想世界で再現する

オブジェクト指向プログラミングでは、プログラマはそれぞれの部品に、
「責務（役割）」をプログラムとして書き込む。
この責務は「情報保持」と「操作」
これらを果たすために、オブジェクトは「属性」と「操作」を持っている。

「属性」その登場人物に関する情報を覚えておく箱
「操作」その登場人物が行う行動や動作の手順

オブジェクトは互いに属性を読み書きしたり、操作を呼び出したりして連携し、
全体として1つのプログラムとして動く。

・オブジェクト指向の3大機能
カプセル化
継承
多態性
※これらはこの記事で詳しくは解説しない。

#8章　要約
オブジェクト指向におけるプログラマの役割
①各オブジェクトが負うべき責務を考え、「属性」「操作」の種類と内容を定義する
②各オブジェクトを仮想世界に生み出し、動かす。

仮想世界で活動する実体を示したい場合はインスタンスという言葉を用いる。
また、クラスからインスタンスを生成する行為はインスタンス化を表現する。

登場人物のクラスを作成した場合、それにどのように動くか指示するクラスが必要。
それがmainクラスである。

```
public class main {
	public static void main(String[] args) {
	}
}
```

以下、この本では「勇者とお化けキノコの戦い」を例にしてコードを書いているためそれを参考にする。
（Heroクラス、Matangoクラス、mainクラスを使用）

Heroクラス
・クラスの宣言方法

```
public class Hero {
}
```
・属性の宣言方法

```
[名前] name(String型)
[HP]   hp(int型)
```

・操作の宣言方法
オブジェクト指向では、操作を定義するためにメソッドを使用

```
	void sleep() {
		this.hp = 100;
		System.out.println(this.name + "は眠って回復した！");
	}

```

まとめるとこんな感じ

```
public class Hero {
	String name;
	int hp;

	void sleep() {
		this.hp = 100;
		System.out.println(this.name + "は眠って回復した！");
	}

}
```




クラスを定義すれば型として利用できるようになる。
クラス型変数が必要な理由としては、同名のインスタンスの中から特定の1つを識別するため。

mainクラス
・インスタンスの生成方法

```
クラス名　変数名 = new クラス名();
```

・フィールドへの値の代入

```
変数名.フィールド名 = 値;
```

・最後にメソッドを呼び出して「指示」をする。

実際に動かしてみた

Heroクラス

![Hero.png](https://qiita-image-store.s3.amazonaws.com/0/279359/7585b223-731c-7f3a-01a6-33b64844fa32.png)


mainクラス

![main.png](https://qiita-image-store.s3.amazonaws.com/0/279359/c5549d4d-132e-9579-eda2-d9b8ee09be8d.png)


実行結果にちゃんと表示されている。

まとめると、オブジェクト指向という明確な思想に基づいてクラスやメソッドが作られている。
現実世界の人や物、出来事をクラスに置き換えていくものとして考える。


#9章　要約
ここでは主にコンストラクタについて学んでいく。

```

public class Hero {
	String name;
	int hp;

	void sleep() {
		System.out.println(this.name + "は眠って回復した！");
	}
	Hero(){
		this.hp = 100;
		
	}
	
}
```

上記のようにHero()メソッドを追加する。
このHero()メソッドは「newされると、newと同時にメソッド内部で定義しておいた処理が自動的に行われる」
という性質を持っている。
このようなメソッドをコンストラクタという。

よってmainメソッド側でHPに初期値を代入する必要はない。

実際に動かしてみると初期HPに100が入っていることが分かる。

![main1.png](https://qiita-image-store.s3.amazonaws.com/0/279359/993b966e-167b-84f4-1b3d-aaabed6ad21a.png)

・コンストラクタとしてみなされる条件
①メソッド名がクラス名と完全に等しい
②メソッド宣言に戻り値が記述されていない

コンストラクタが引数で受け取れるように宣言することも可能。

```
	Hero(String name){
		this.hp = 100;
		this.name = name;
	}
```

mainメソッドにはコンストラクタが実行される際に渡してほしい引数をnewする際に指定する。

![main2.png](https://qiita-image-store.s3.amazonaws.com/0/279359/489c1549-cd95-5817-6341-da51c1f35282.png)

名前にミナトと入っているのが分かる。







#所感
私はJava初心者であるため、オブジェクト指向は今までなんとなくの感覚でやっていた。
実際にこの記事を書いていても本当に正しいのだろうかということや、
どういう意味なのだろうかということが、いくつかあった。
特にコンストラクタの部分が曖昧になっている部分が多い気がしたので、
まとめきれる部分が少なかったように思える。
ただ、そのような本質的な意味を理解することよりも、本を読んで、書いて、実行してみることが、
理解に繋がるのではないかと思った。
この本を詳しく見てみることで今までなんとなくでやっていたことが、多少は理解できたと思う。
この先の章をより深く学んでいくことにより、マスターできるのではないかと思った。
CSS基本

#セレクタ
##CSS


![Screen Shot 2018-08-08 at 22.17.29.png](https://qiita-image-store.s3.amazonaws.com/0/274410/7c00e4f2-f1d1-7848-fb3b-6d7c6f77e523.png)

##HTML
![Screen Shot 2018-08-08 at 22.17.17.png](https://qiita-image-store.s3.amazonaws.com/0/274410/d5212870-c6ba-5640-c3cb-a2713ab549f2.png)
GameObjectやComponentをnullと比較するときの落し穴


```csharp
    [SerializeField] private GameObject target; // 参照している。nullじゃない。

    private void Awake()
    {
        Debug.Log(target == null); // Falseと表示される
        DestroyImmediate(target);
        Debug.Log(target == null); // Trueと表示される
    }
```

上のコードは、Unityにいくつかある「はまりポイント」や「なんじゃこりゃってなるポイント」の一つです。

変数`target `がオブジェクトを参照していて`null`じゃないのに、`target == null`が`true`。

# 解説

`GameObject`や`Component`を`==`オペレーターを使って、`target == null`のように評価する際、変数がオブジェクトを参照しているのにも関わらず、`true`と評価されることがあります。

これらの親クラスである[`UnityEngine.Object`](https://github.com/Unity-Technologies/UnityCsReference/blob/2018.2/Runtime/Export/UnityEngineObject.bindings.cs)には、`==`や`!=`、`bool`のオペレーターが定義されています。

そして、その挙動が「対象の`GameObject`や`Component`が、生存していないならば、`==`で`null`と比較すると`true`を返す」という仕様になっています

内部でこんなメソッドを作って生存しているかチェックをしています。

* IsNativeObjectAlive
* DoesObjectWithInstanceIDExist

この挙動は、私はあまり好きではありません。「コードは、利用者の期待や予測に対して、驚きが最小であるべき」と思っています。この挙動は、`==`に対して利用者が予期しない「生存チェックもする」という驚きを与えてしまっています。

覚えておかないと、予期せぬバグを発生させることがあるので、注意が必要ですね。（多分、ごくまれに発生するめんどいバグを生み出す原因になりそう）

次のコードを見てみることもオススメします。

https://github.com/Unity-Technologies/UnityCsReference/blob/2018.2/Runtime/Export/UnityEngineObject.bindings.cs#L100

# おまけ。対応策

変数が参照するオブジェクトが破壊されるケースがあり、純粋にnullと比較したい場合`System.Object.ReferenceEquals`を使うことをオススメします。


```csharp
    [SerializeField] private GameObject target; // 参照している。nullじゃない。

    private void Awake()
    {
        Debug.Log(target == null); // Falseと表示される
        Debug.Log(ReferenceEquals(target, null)); // Falseと表示される
        DestroyImmediate(target);
        Debug.Log(target == null); // Trueと表示される
        Debug.Log(ReferenceEquals(target, null)); // Falseと表示される
    }
```

# 参考・関連

* [演算子のオーバーロード（++C++;さんのブログ）](https://ufcpp.net/study/csharp/oo_operator.html)
* [== 演算子 (C# リファレンス)](https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/operators/equality-comparison-operator)


# こちらもどうぞ

関連記事 : [Reshaper/Riderの「Possible unintended bypass of lifetime check of underlying Unity engine object」って何ぞや？](https://qiita.com/RyotaMurohoshi/items/5821f4776f3599797c40)
Java:WASをDockerで起動させ、自前のアプリケーションをデプロイする

# 始めに
Docker上でWebSphereを起動させ、自前のアプリケーションをデプロイさせてみました

#Dockerの設定
##Dockerfileの作成
[GitHub上のソース](https://github.com/triple4649/wassample/blob/master/Dockerfile)
イメージは「websphere-liberty」を使います
/config/dropins/にwarを配置すると自動的にデプロイしてくれるそうなので、gradleでビルドしたwarが配置されるローカルフォルダのwarをリモートの/config/dropins/にコピーされるように設定します

##docker-compose.yml
[GitHub上のソース](https://github.com/triple4649/wassample/blob/master/docker-compose.yml)
特に考慮する点はありません

#Webモジュールの作成
##gradleファイルの作成
[GitHub上のソース](https://github.com/triple4649/wassample/blob/master/build.gradle)
pluginにwarを指定し、ビルドに必要な依存関係を設定します
##Javaモジュール
[GitHub上のソース](https://github.com/triple4649/wassample/blob/master/src/main/java/router/SampleRooter.java)

[SImpleなJAX-RSアプリについて](https://qiita.com/triple4649/items/18e4473539eabf75906c)で作成したアプリをレスポンスのタイプをPLAN_TEXTに変更しています

#ビルドからデプロイの流れ
 1. gradleのwarタスクでwarファイルを作成する
 2. docker-compose up -dでdocker上に仮想環境を作る    
 (うまくいかない場合はdocker-compose build --no-cacheでキャッシュをクリアする)
 3. http://localhost/MyWebApp/sample/Areaにアクセスする    
 (WASはコンテキストルートとしてwarファイルの名前を指定する必要があるみたい)

#実行結果
![image.png](https://qiita-image-store.s3.amazonaws.com/0/136860/67b5f25d-555e-bb0b-cf08-a017586f099a.png)

が表示されれば無事、WASが起動していることが確認できています！
電車の遅延情報をMESH SDKで取得してLEDタグでお知らせ

# はじめに
電車の遅延を予め知っとけたら、こんな待たんくてよかったのになー。と思うことがそこそこある。でも、毎回調べるのめんどくさい。毎回、通知くるのもうざい。できるだけ、簡単に知りたい。操作なしで知りたい。
遅延情報を教えてくれるAmazon Echoのスキルもあったけど、聞くのめんどくさい。

いいのがないから作ろかなと思って、電車の遅延情報を知る方法調べてたらjsonで取れるサイトがあった。すばらしい。
[鉄道遅延情報のjson](https://rti-giken.jp/fhc/api/train_tetsudo/)


MESHのLEDタグを使えば、見ればわかる仕組み作れそうだと思って、妻にプレゼンしてみたて、まあまあいい反応やったので、作ることにした。

[MESH-100LE LEDタグ - ワイヤレスLEDライト | ソニー](http://meshprj.com/jp/tag/MESH-100LE-LED.html)

# MESH SDK
デフォルトの仕組みだけじゃ作れないので、MESH SDKを使った。jsonデータを取得して普段使う路線の遅延情報を確認するプログラムを書いた。

初めの方の設定はこんな感じ。ごく普通。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/184221/a90e3326-8a79-32ab-dfc0-30d8bec19193.png)

コードはこんな感じ。4ヶ所書く所ある。
まず、こんな感じ。

```javascript:Initialize
return {
    runtimeValues : {
        outputIndex : 0
    },
    resultType : "continue"
};
```

これは、からっぽでよさそう。

```javascript:Receive
```

メインの処理。データ取得して、for分でJR神戸線が遅延しているか確認する。
なんで、わざわざ`callbackSuccess`呼ぶのかよくわからん。サンプルコードとか見てるとこんな感じでやってるから、真似した。

```javascript:Execute
var url_delay = "https://rti-giken.jp/fhc/api/train_tetsudo/delay.json";

ajax({
    url : url_delay,
    type : "GET",
    dataType : "json",
    success : function(myJson){
        f_delay = false;
        for (var i=0; i<myJson.length; i++) {
            // console.log(myJson[i].name);                                          
            if(myJson[i].name == "JR神戸線"){
                f_delay = true;
            }
            if(myJson[i].name == "ＪＲ神戸線"){
                f_delay = true;
            }
        }

        if(f_delay == true){
            log("遅延しています");
            runtimeValues.outputIndex = 1;
        }else{
            log("遅延していません");
            runtimeValues.outputIndex = 0;
        }
        callbackSuccess( {
            resultType : "continue",
            runtimeValues : runtimeValues
        } );
    }
});

return {
    resultType : "pause"
};
```


最後に。こんな感じ。

```javascript:Result
return {
    indexes : [ runtimeValues.outputIndex ],
    resultType : "continue"
};
```

これで、オリジナルブロックの完成。デバッグが大変やった。

# MESH
構成を、こんな感じにした。
定期的に、遅延情報を確認して、遅延ありと遅延なしでLEDの色を変える。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/184221/555c70e1-cfac-279b-d57d-678651eeca31.png)

それぞれのブロックはこんな感じ。
まず、タイマーはこんな感じ。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/184221/51bb666d-8727-5fd6-1ef7-cb75521e7ef3.png)

遅延情報のブロックは特に設定項目なし。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/184221/271c9bf6-4911-8c87-51a8-93aeaae89536.png)

LEDのブロックは遅延時とnot遅延時で、色を変えた。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/184221/33de8c28-5ccb-b70f-ae20-095d12be2ade.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/184221/4b461899-a7ac-b47e-94b6-81565b005ce2.png)

# 結果
ちゃんと動いてくれた。UIがLEDだけなので、凄くシンプル。必要なときに目をやればいい。ダイニングとか玄関とかにおいといたら良さそう。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/184221/0f0b37e0-f81f-23fd-d262-86e602e7b735.png)

# おわりに
それなりに楽しくMESH SDK使って、そこそこ有益なシステム作れた。
デバッグ環境がしょぼしょぼなので、JavaScript＋HTMLで少し動かしてみてがんばった。
リダイレクト処理を実装

## リダイレクトとは？
リダイレクトとは、サイトにアクセスしたユーザーをアクセスしたユーザーをアクセスしたURIとは別のURIにアクセスさせること。

**index.js**

```javascript
'use strict';
const http = require('http');
const server = http.createServer((req, res) => {
  res.writeHead(302, {
    'Location': 'https://www.google.co.jp/'
  });
  res.end();
});
const port = 8000;
server.listen(port, () => {
  console.info('Listening on ' + port);
});
```

## 解説
```js
res.writeHead(302, {
	'Location': 'https://www.google.co.jp/'
});
```
以上がリダイレクトを実行する処理。
ステータスコードの302-Foundは「Locationという項目のヘッダで指定されたサイトに内容を発見した」ということを表すステータスコード。
node index.jsを実行し、うまくGoogleに飛べばおけ！

※2020年1月更新
##MENTAでコードレビューやプログラミング勉強相談を行っています！
お気軽にメッセージを下さい！
[プラン](https://menta.work/plan/1461)はこちらになります！
【Raspberry Pi 3】シェルスクリプトでLチカ

# 概要
Raspberry Pi 3でLチカをするための手順を書く。

# 必要なもの
- Raspberry Pi 3 Model B(Raspbian OSインストール済み)
- ブレッドボード
- ジャンパーワイヤ（オス-メス) × 2
- LED1つ
- 抵抗(330Ω)

# 配線
![Lチカ_ブレッドボード.png](https://qiita-image-store.s3.amazonaws.com/0/32950/2b3fcff5-86c1-ecfd-bcbd-c8aa31a61039.png)

この時点でLEDが点灯していること。

# コマンド
シェルスクリプトでLチカするための手順を示す。

```bash
# root権限昇格
sudo su -l

# GPIO3を制御する
echo "3" > /sys/class/gpio/export

# GPIO3を書き込み可能にする
echo "out" > /sys/class/gpio/gpio3/direction

# GPIO3をOFFにする(LEDが消える)
echo 0 > /sys/class/gpio/gpio3/value

# GPIO3をONにする(LEDが点灯する)
echo 1 > /sys/class/gpio/gpio3/value
```

# 参考文献
[GPIOをシェルスクリプトで制御する](http://www.e-ark.jp/followups/usp-magazine/2013-spring/gpio%E3%82%92%E3%82%B7%E3%82%A7%E3%83%AB%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%81%A7%E5%88%B6%E5%BE%A1%E3%81%99%E3%82%8B/)
ローカル変数とグローバル変数

#変数のスコープ
変数には使える範囲（スコープ）が存在する。例えば、

```php
$num = 200;

function total($var){
 return $result = $var*1.08;
}

echo total($num);
echo $result;
```
最後の`$result`はエラー。`$result`は関数の中だけで有効なローカル変数だから！
逆に関数の外で作られた変数はグローバル変数といって、どこでも共通で使える。ただし、

```php
$num = 200;

function total($var){
 echo $num;
 return $result = $var*1.08;
}

echo total($num);
echo $num;
```
こういうときのfunction内の`$num`は何も表示されない。関数内で使えるローカル変数として扱われているから。
グローバル変数を関数内で使える方法もちゃんとあって、

```php
$num = 200;

function total($var){
 global $num;
 echo $num;
 return $result = $var*1.08;
}

echo total($num);
echo $result;
```
こうすればOK。

>[ウェブカツ！！](https://webukatu.com/?afid=p5lxu1kvh03rayd2ctjsw4e9bgzq8nom)
真偽を表すメソッド名には末尾に「？」をつける

#真偽値を表すメソッド

真偽値を表すメソッドは、Rubyではメソッド名の末尾に***?***をつける。
こうすることで、オブジェクトに対して状態を問い合わせるというメソッド呼び出しが自然な形になります。


```rb
def enjoy?
  true
end
```
【Java】配列

 参考「スッキリわかるJava入門p133~p164」

#4章　要約
配列について曖昧な部分があったので「スッキリわかる」で復習してみた。

まず、配列を使う意味として下記の画像では、

![hairetu.png](https://qiita-image-store.s3.amazonaws.com/0/279359/0d1f8731-17dd-06bf-16d9-b35da79cdc70.png)

このように記述してしまうと
・科目が増えると面倒
・まとめて処理できない

などといった不便が発生する。

そのため、同一種類の複数データを並び順で格納するデータ構造が「配列」である。

**※配列の要素は0から始まることに注意。**

上記の例の配列は

```
int[] score = new int[]
```

で書き換えることが可能。

![hairetu1.png](https://qiita-image-store.s3.amazonaws.com/0/279359/d4579b38-9bf2-c6a5-ffe8-39a119845f37.png)

なお、配列の要素数は

```
配列変数名.length
```
で取得可能。

また、配列をforループ、拡張for文で回すことも可能。

・forループの場合

```
for(int = 0; i < 配列変数名.length; i++)
```
・拡張for文の場合

```
for(要素の型　変数名（任意）:配列変数名)
```



# 所感
ArrayListクラスについて学びたかったがこの参考書には記載されていないようだった。
ただ、配列の基本については非常に詳しく学べた。
私のような初心者にも分かりやすく紹介してくれていると思った。
変数だけでなく配列を用いることでコードが一気にスマートになると思った。

forループ、拡張for文の2つで回せるが、私は拡張for文によって、
ループ変数や添え字などを無くした方が見てて分かりやすいと思った。

次はオブジェクト指向について書いてみる。
関数

# 関数とは？
同じような処理を一つのかたまりにまとめる。

```php
$num = 100;
if($num === 100){

 $num = $num*1.08;
 echo '変数$numは'.$num.'です';

}elseif($num === 200){

 $num = $num*1.08;
 echo '変数$numは'.$num.'です';

}elseif($num === 300){

 $num = $num*1.08;
 echo '変数$numは'.$num.'です';
}
```
これが、関数使うとこうなる↓

```php
$num = 100;
if($num === 100){

 echo total($num);

}elseif($num === 200){

 echo total($num);

}elseif($num === 300){

 echo total($num);
}

function total($hikisuu){
 $result = $hikisuu * 1.08;
 return '変数$numは'.$result.'です';
}
```
このように、複数の処理も1行でスッキリ書けるし、メンテナンスの面でも良い。

# 書き方

```php
function 関数名(引数1,引数2,引数3){
  いろんな処理
  return 値;
}
```
#注意点
関数名が同じでも、引数の個数が違うと別の関数として扱う。
`function total($num){}`と`function total($num,$tax){}`はべつもの。

>[ウェブカツ！！](https://webukatu.com/?afid=p5lxu1kvh03rayd2ctjsw4e9bgzq8nom)
findの-typeオプションによるファイルやディレクトリの一覧表示

#findコマンド
以前の記事[Linuxのfindコマンド使用方法の備忘
](https://qiita.com/shotah1215/items/5fdcc0d095e7ce395afb)で、findコマンドの使用方法を少し記載しましたが、先日仕事で別の使い方して「これってめちゃくちゃ便利！」ってなったのでこちらに記載したいと思います。

##環境
本記事で記載しているコマンドは以下環境下で実施しています。
ローカル：maxOS High Sierra バージョン 10.13.4
リモート：CentOS release 6.9 (Final)

##findコマンドの判別式`type`について
findコマンドでは判別式に`type`といった式があり、検索条件にファイルやディレクトリなどを指定することが出来ます。簡単にどういうことかコマンドで以下に記載します。

・カレントディレクトリを確認

```shell
[shota@hostname work]$ ls -l
合計 12
drwxrwxr-x 2 shota shota 4096  8月  8 21:44 2018 dir1
drwxrwxr-x 2 shota shota 4096  8月  8 21:44 2018 dir2
drwxrwxr-x 2 shota shota 4096  8月  8 21:44 2018 dir3
-rw-rw-r-- 1 shota shota    0  8月  8 21:45 2018 file1
-rw-rw-r-- 1 shota shota    0  8月  8 21:45 2018 file2
-rw-rw-r-- 1 shota shota    0  8月  8 21:45 2018 file3
```

・判別式`type`で通常ファイルを検索

判別式`type`の書式は以下の通りで`c`に検索する種別を指定します。
書式：`-type c`

以下の通り、`-type f`とすると通常ファイルのみ検索されます。

```shell
[shota@hostname work]$ find . -type f
./file3
./file1
./file2
```

・判別式`type`でディレクトリを検索

今度はディレクトリのみ検索といったケースです。

以下の通り、`-type d`とするとディレクトリのみ検索されます。

```shell
[shota@hostname work]$ find . -type d
.
./dir1
./dir2
./dir3
```

検索できる種別はもちろん、`f`や`d`以外にも色々とありますのでぜひ使ってみてください。
※`man find`コマンドで使用可能な種別が確認できます。

以上
POJO とは

## 定義
>Plain Old Java Object (POJO) は、あるJavaオブジェクトがEJB（特にEJB 3より前のEJB）のように特殊なものではなく、ごく普通のJavaオブジェクトであることを強調した名称

## POJOではないEJBとは?
[EJB](https://nekop.hatenablog.com/entry/20140310/1394417531) (Enterprise JavaBeans)
>EJBは、多階層(3階層)の分散オブジェクト指向に基づいたJavaのためのサーバコンポ－ネントモデル

### EJBオブジェクト例
O/Rマッピングを使用して顧客 (Customer) オブジェクトを永続化（DBに保存）するサービスクラス（セッションBean）

```java
public class CustomerService { 
  
  @PersistenceContext 
  private EntityManager entityManager; 
    
  public void addCustomer(Customer customer) { 
    entityManager.persist(customer); 
  } 
}
```

以下の図の「Session Bean」に対応しています。


![c743b82d2c20468d02c92bfb6f7e8e70.png](https://qiita-image-store.s3.amazonaws.com/0/64293/0840fb03-3d45-9112-7a0d-7cce85b7eaea.png)


実装に関してはこちらが詳しいです。
[[Java]新人向けにJavaBeansの直列化やフィールド・プロパティの謎をPOJOとの違いを交えて解説 - Qiita](https://qiita.com/ukitiyan/items/3b7f1ea7eb3d208ed5fe)


##ちなみにオブジェクトとは?

* 固有の属性(内部状態)を持つ
* 他のオブジェクトと関係を持つ
* uniqueな名前を持つ
* ある共通の性質を持つものをまとめて1つのグループとすることができる : クラス (Class)
* 固有の操作を持ち，この操作のみが許される : カプセル化，情報隠蔽
    * 属性値の参照
    * 属性値の変更
    * オブジェクトの生成・消滅
* 操作名が同じでも異なるクラスのオブジェクトに 適用されれば，効果は異なる(Polymorphism)
* メッセージ通信による計算(Message Passing)


# 参考
* [Enterprise JavaBeans - Wikipedia](https://ja.wikipedia.org/wiki/Enterprise_JavaBeans)
どこjava使ってみた

#どこjavaとは？
開発環境のインストール無しにjavaのコンパイルと実行ができるwebサービスであるゾ。ふーん、便利じゃん。わが友よ、冒険者よ。

#使い方
ブラウザからhttp://dokojava.jp/にアクセスすると以下のような画面が出てくる。

![スクリーンショット (3).png]

この画面にjavaのコードを打ち込んでコンパイル、実行を押せばよい。実行結果が下に出てくる。はえーすっごい・・・

ただ、コンパイルと実行のたびに画面に出てくる数字を入力しなければならない。これが鬱陶しいが、ユーザー登録をすれば、出てこなくなる。

#まとめ
環境構築をするのが面倒だが、実際にコードを打ち込んでjavaを勉強したいという人には非常に便利なサービスである。
【illustrator】「Illustrator効果」を選択しやすいようにポップアップで表示【ショートカット拡張】

```
var cats = [
	["3D"],
	["SVGフィルター"],
	["スタイライズ"],
	["トリムマーク"],
	["パス"],
	["パスの変形"],
	["パスファインダ"],
	["ラスタライズ"],
	["ワープ"],
	["形状に変換"]
];
var commands = [
	[ // 3D
		["押し出し・ベベル","Live 3DExtrude"],
		["回転体","Live 3DRevolve"],
		["回転","Live 3DRotate"]
	],
	[ // SVGフィルター
		["SVGフィルター","Live SVG Filters"]
	],
	[ // スタイライズ
		["ぼかし","Live Feather"],
		["ドロップシャドウ","Live Adobe Drop Shadow"],
		["光彩（内側）","Live Inner Glow"],
		["光彩（外側）","Live Outer Glow"],
		["落書き","Live Scribble Fill"],
		["角を丸くする","Live Adobe Round Corners"]
	],
	[ // トリムマーク
		["トリムマーク","Live Trim Marks"]
	],
	[ // パス
		["オブジェクトのアウトライン","Live Outline Object"],
		["パスのアウトライン","Live Outline Stroke"],
		["パスのオフセット","Live Offset Path"],
	],
	[ // パスの変形
		["ジグザグ","Live Zig Zag"],
		["パスの自由変形","Live Free Distort"],
		["パンク・膨張","Live Pucker & Bloat"],
		["ラフ","Live Roughen"],
		["ランダム・ひねり","Live Scribble and Tweak"],
		["変形","Live Transform"],
		["旋回","Live Twist"]
	],
	[ // パスファインダ
		["追加","Live Pathfinder Add"],
		["交差","Live Pathfinder Intersect"],
		["中マド","Live Pathfinder Exclude"],
		["前面オブジェクトで型抜き","Live Pathfinder Exclude"],
		["背面オブジェクトで型抜き","Live Pathfinder Minus Back"],
		["分割","Live Pathfinder Divide"],
		["刈り込み","Live Pathfinder Trim"],
		["合流","Live Pathfinder Merge"],
		["切り抜き","Live Pathfinder Crop"],
		["アウトライン","Live Pathfinder Outline"],
		["濃い混色","Live Pathfinder Hard Mix"],
		["薄い混色","Live Pathfinder Soft Mix"],
		["トラップ","Live Pathfinder Trap"]
	],
	[ // ラスタライズ
		["ラスタライズ","Live Rasterize"]
	],
	[ // ワープ
		["円弧","Live Deform Arc"],
		["下弧","Live Deform Arc Lower"],
		["上弧","Live Deform Arc Upper"],
		["アーチ","Live Deform Arch"],
		["でこぼこ","Live Deform Bulge"],
		["貝殻（下向き）","Live Deform Shell Lower"],
		["貝殻（上向き）","Live Deform Shell Upper"],
		["旗","Live Deform Flag"],
		["波形","Live Deform Wave"],
		["魚形","Live Deform Fish"],
		["上昇","	Live Deform Rise"],
		["魚眼レンズ","Live Deform Fisheye"],
		["膨張","Live Deform Inflate"],
		["絞り込み","Live Deform Squeeze"],
		["旋回","Live Deform Twist"]
	],
	[ // 形状に変換
		["長方形","Live Rectangle"],
		["角丸長方形","Live Rounded Rectangle"],
		["楕円形","Live Ellipse"]
	],
];

function btnForm(arr,action){
	var win = new Window ("dialog");
	win.alignChildren = "center";
	for (i=0; i<arr.length; i+=1){
		win['btn'+i] = win.add("button", undefined, arr[i][0]);
		win['btn'+i].txt = i;
		win['btn'+i].onClick = function() {win.close();end=this.txt;}
	}
	win.cancelBtn = win.add("button", undefined, "cancel"); 
		win.cancelElement = win.cancelBtn;
		win.cancelBtn.onClick = function() {win.close();end=-1;}
	win.frameLocation = [1250,350];
	win.show();
	if (end > -1){
		if (action === true){
			app.executeMenuCommand(arr[end][1]);
		}
		else{
			if (commands[end].length === 1){
				app.executeMenuCommand(commands[end][0][1]);
			}
			else{
				btnForm(commands[end],true);
			}
		}
	}
	win.close();
}

btnForm(cats,false);

```
【Electron入門】ボタンを押したらnodeモジュールの処理を実行する

Electron、流行りなのかたくさん記事が出てますが、純粋にUIとnodeの処理の連携に対して「こうしていいんだ！」と落ち着くまでに非常に時間がかかってしまったので備忘録として書き残します。

# ボタンを押したらnodeモジュールの処理を実行する

```html:index.html
<html>
...

<body>
    <button class="js-button">
        ボタン
    </button>
    <script type="text/javascript" src="index.js"></script>
</body>

</html>
```

今回はログ出せればいいと思うので`electron-log`モジュールを実行することにします。

```javascript:index.js
const log = require('electron-log');

const button = document.querySelector('.js-button');

button.addEventListener('click', function (clickEvent) {
    log.info("ボタン押された");
})
```

これでターミナルとブラウザのDevToolでログが表示されます。

# ここまでの勘違い

Chromiumを起動してhtmlをロードするクラス

```javascript:app.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 = new BrowserWindow({ width: 800, height: 600 });
  mainWindow.loadURL('file://' + __dirname + '/index.html');
  mainWindow.webContents.openDevTools()
  mainWindow.on('closed', function () {
    mainWindow = null;
  });
});
```


てっきりこれがindex.htmlに対するcontrollerなのかと勘違いしてしまった。
bodyに宣言してるjsファイルでnodeモジュールの処理実行できない知識がぼんやりあったからすごく疑ってしまった。不思議な気分。
PC-88 z80asmでVBLANK (2)

実機(88MA2)V2モード4/8MHzでの動作を確認。チラつきは感じられなかった。

```vblank.asm
; z88dk / PC-88 mon
; z80asm -b -l vblank.asm

tvram   equ     $f3c8
vtvram  equ     $c000

        org     $b000
start:
        call    crtset
        call    vtinit
.loop
        xor     a
        call    vtcls

        in      a, ($00)        ; テンキー 0～7
        cpl
        call    vtcls

        call    vblank
        call    vtblt
        jr      loop

crtset:
        ld      hl, $e6b4
        ld      (hl), $98       ; アトリビュート
        inc     hl
        inc     hl
        inc     hl
        inc     hl
        ld      (hl), $00       ; ファンクション・キー表示スイッチ
        inc     hl
        ld      (hl), $ff       ; カラー／白黒スイッチ
        ld      b, 80
        ld      c, 25
        call    $6f6b           ; CRTSET
        ret

vblank:
        in      a, ($40)
        and     $20
        jr      nz, vblank
.wait
        in      a, ($40)
        and     $20
        jr      z, wait
        ret

vtinit:
        ld      hl, tvram
        ld      de, vtvram
        ld      bc, 120*25
        ldir
        ret

vtcls:
        ld      hl, vtvram
        ld      b, 25
.vtcls1
        push    bc
        ld      (hl), a
        ld      d, h
        ld      e, l
        inc     de
        ld      bc, 80-1
        ldir
        ld      de, 40+1
        add     hl, de
        pop     bc
        djnz    vtcls1
        ret

vtblt:
        ld      hl, vtvram
        ld      de, tvram
        ld      bc, 120*25
        ldir
        ret
```

![vblank.png](https://qiita-image-store.s3.amazonaws.com/0/257554/1867a5f3-1cce-73f8-141a-adaabd7d1ea6.png)
複雑なform_forを流れに沿って丁寧に解説してみました

#複雑なform_forを流れに沿って丁寧に解説してみました
message_controller.rb
```def index
   @message = Message.new
   @group = Group.find(params[:group_id])
end
```@messageはMessageクラスのインスタンスで、中身は全てnil
@groupはGroupクラスのインスタンスでルーティングからgroup_idを取得している

index.html.haml-messages
```form_for [@group, @message] do |f|
```以下のように変換される
html```
<form class="new_message" id="new_message" enctype="multipart/form-data" action="/groups/２（:group_id)/messages" accept-charset="UTF-8" method="post">
</form>
```form_forに関して二つのインスタンスが渡されている理由として、二つ目のmessagesテーブルに保存を行うためのルーティング指定にgroup_idが必要とされるからである。
順番としては、パスに必要になる@groupを先に置いて、その後の保存先のテーブルの@messageを後に置いています。（読み込む順番？）
@messageに関しては新しければ、createアクションになり、既存のものであれば、updateアクションになる。

message_controller.rb
```def create
@group = Group.find(params[:group_id])
@group.messages.create(message_params)
end
def message_params
    params.require(:message).permit(:content, :image).merge(user_id: current_user.id)
  end```
@group.messagesはassociationをしていて、Messageモデル。
引数にmessage_paramsを渡すことで、validationをかけた上で保存

大いに参考にした文献
https://qiita.com/shunsuke227ono/items/7accec12eef6d89b0aa9
manコマンドの表示を日本語化した話


ターミナルを使っていて、コマンドのオプションをさくっと確認したい時あると思います。
そんな時 `man` コマンドは非常に便利です。

<img src="https://i.imgur.com/WLQhjWC.png" width=600px>

`$ man [コマンド]` でコマンドの説明（manual）一覧が見れます。
でもデフォルトだと英語なんですよね。そこで日本語にした話をします。

参考: http://tukaikta.blog135.fc2.com/blog-entry-224.html

## 実行環境

- OS: MacOS v10.13
- Terminal: iTerms
- Shell: zsh

## manコマンドの表示を日本語化する

### 1. groffをインストール

brewでgroffをインストールします。
groffとは、GNUの、文書整形を行うコマンド（roff）です。

macではgroffが既存で入っています、 `$ groff -v` で確認できます。
ただ、文字化け等しないよう最新版にしておきます。

```
$ brew install groff
```

`/usr/local/bin/groff` が存在することを確認します。


### 2. `/etc/man.conf` の内容を修正

まだ `groff` コマンドを打っても、既存バージョンを利用する設定になっています。
設定ファイル `/etc/man.conf` を変数しましょう。

```
$ sudo vi /etc/man.conf
```

通常だとread-onlyになっているので、sudoで管理者権限にします。
内容を修正します。

```
#groffコマンドで、インストールした最新バージョンを利用するように。
95  JNROFF    /usr/bin/groff -Tnippon -mandocj -c #<-コメントアウトor削除
    JNROFF    /usr/local/bin/groff -Dutf8 -Tutf8 -mandoc -mja -E

#文書整形を日本語対応に。
105 PAGER     /usr/bin/less -is #<-コメントアウトor削除
    PAGER     /usr/bin/less -isr
106 BROWSER   /usr/bin/less -is #<-コメントアウトor削除
    BROWSER   /usr/bin/less -isr
```

`$ groff -v` が最新バージョンになったことを確認します。

### 3. 日本語のmanページをダウンロード

前提ですが、manコマンドの表示を日本語化するという意味は、

× manで表示される文章が日本語化される
○ manで表示される文章が、英語版ではなく日本語版を表示するようになる

です。英語版のmanualテキストは既にmacに入っていますが、
日本語版は入っていません。下記コマンドでインストールする必要があります。

```
$ curl -O http://linuxjm.osdn.jp/man-pages-ja-20180715.tar.gz
```

上記URL日付部分は、さらに更新になっている可能性があります。
[マニュアルアーカイブのダウンロードサイト](http://linuxjm.osdn.jp/download.html)にて最新版を確認してください。

### 4. ダウンロードしたファイルを解凍し、インストール

下記順番に実施します。
ダウンロードしたファイルの `INSTALL` ファイルにも記載されています。

```
$ tar xfz man-pages-ja-acl-20180715.tar.gz #解凍
$ cd man-pages-ja-20180715 #ファイル階層移動
$ ls #Makefileがあることを確認
$ make config #インストール前の設定
```

色々設定してくれと言われます。

1. インストール先を`/usr/local/share/man/ja_JP.UTF-8`に
2. 圧縮形式は `0` のnone
3. ユーザ名はデフォルトだと `root`
4. グループ名はデフォルトだと `wheel`
5. OKでよければ `c`
6. インストールするmanページを選ばない人はenter連打
7. OKでよければ `c`
8. インストールするmanページを選ばない人はenter連打
9. OKでよければ `c`

そして、インストールを実行します。

```
$ sudo make install
```

※sudo付けないでできるかもしれませんが、
`permission denied` が表示されたらsudoが必須です。

`/usr/local/share/man/ja_JP.UTF-8` のフォルダを見に行って、
manualファイルが格納されていることを確認します。

### 環境変数のLANGを修正

これだけでは、manコマンドで日本語マニュアルが表示できません。
環境変数を確認してみます。

```
$ echo $LANG
en_US.UTF-8
```

まだ英語表記を参照するようになってます。修正します。

```
$ export export LANG=ja_JP.UTF-8
```

ターミナル起動時のデフォルトで設定したい場合は、
上記のexport文を `.zshrc`などの設定ファイルに記載します。

### 動作確認

`ls` のマニュアルを確認してみます。

```
$ man ls #動作確認
$ man ls -w #参照しているマニュアルの階層を表示
/usr/local/share/man/ja_JP.UTF-8/man1/ls.1
```

ちゃんと `$ make config` で設定した
`/usr/local/share/man/ja_JP.UTF-8`内にあるファイルを見にいっていますね。

## まとめ

ここまでだと、すべてのコマンドに対応しているわけではないです。
今の状態だと、日本語マニュアルがあれば日本語表示、なければ英語表示になってます。
後日更新したい気持ちです。
【PHP】対象月の月初や月末の日付を取得する

# PHPで対象月の月初や月末の日付を取得する

よくわからないまま、次の月の初日をまず取得してから-1日してゴニョゴニョ、とかやっていましたが、もっと簡単に書けると知ったのでメモ。



## 月初を取得する方法

```php
// 当月の月初を取得その1
$firstDate = date('Y/m/01');
echo $firstDate; // 2018/08/01

// 当月の月初を取得その2
$firstDate = date('Y/m/d' , strtotime('first day of'));
echo $firstDate; // 2018/08/01

// 指定月の月初を取得その1
$firstDate = date('Y/m/01', strtotime('2020-02'));
echo $firstDate; // 2020/02/01

// 指定月の月初を取得その2
$firstDate = date('Y/m/d' , strtotime('first day of 2020-02'));
echo $firstDate; // 2020/02/01
```

## 月末を取得する方法

```php
// 当月の月末を取得その1
$lastDate = date('Y/m/t');
echo $lastDate; // 2018/08/31

// 当月の月末を取得その2
$lastDate = date('Y/m/d' , strtotime('last day of'));
echo $lastDate; // 2018/08/31

// 指定月の月末を取得その1
$lastDate = date('Y/m/t', strtotime('2020-02'));
echo $lastDate; // 2020/02/29

// 指定月の月末を取得その2
$lastDate = date('Y/m/d' , strtotime('last day of 2020-02'));
echo $lastDate; // 2020/02/29
```
初心者がVue.jsに入門する前に必要な知識まとめ

https://github.com/flaviocopes/vue-developer-roadmap
をテキトーにまとめたもの。個人的メモ用。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/267721/257ee0f3-71d0-3bd8-86d3-dff2d168b463.png)

##[HTML](https://www.google.co.jp/search?q=html&oq=html&aqs=chrome..69i57j69i60l3j69i65l2.944j0j7&sourceid=chrome&ie=UTF-8)
###Semantic html
セマンティックhtml。seo向上やコード軽量化など様々な利点のために、働きに合わせた正しい要素やタグを使用しているhtml。
https://bit.ly/2MxzFGQ
###DOM
「Document Object Model」の略。階層構造のこと。
https://bit.ly/2ATFLjm
##[CSS](https://www.google.co.jp/search?q=css&oq=css&aqs=chrome..69i57j69i60l2j69i61j69i65l2.689j0j7&sourceid=chrome&ie=UTF-8)
###Grid
マス目のグリッドに好きな順番に配置したり結合したりできる。レスポンシブしやすい。新機能。
https://bit.ly/2vs59HP
###Flexbox
boxの配置を簡単に指定できる。レスポンシブしやすい。
https://bit.ly/2M9ci9r
###Responsive Web
画面サイズ応じてウェブページのデザインが変わるデザイン。
https://bit.ly/2OiNtW8
###Media Queries
画面サイズごとにスタイルを指定できるやつ。
https://bit.ly/2nmpJES
##[JS Basics](https://www.google.co.jp/search?ei=Md9qW4PcMYH-8QXOv4mADA&q=javascript&oq=javas&gs_l=psy-ab.1.0.35i39k1j0i67k1l6j0.939.939.0.2393.1.1.0.0.0.0.121.121.0j1.1.0....0...1c.1.64.psy-ab..0.1.121....0.VGoafWHzi4o)
###Syntax and Basic operations
訳:構文と基本操作
###DOM manipulation
DOM操作。
https://bit.ly/2vNvDTu
###Hoisting
ホイスティング。[スコープ](https://qiita.com/Kazuuuuuki/items/3c40bbe6e7bb7ff84e3e)内で宣言された変数が、常に宣言は関数の中の先頭で行われたことにされること。
https://bit.ly/2M1ohXx
###Event building
イベント処理。
https://bit.ly/2MupCSF
###prototyping
プロトタイプ。オブジェクトの親的なもの。
https://bit.ly/2vzHPIj
###AJAX
正式名称は「Asynchronous JavaScript ＋ XML」。Googleマップなどに使われている。
https://bit.ly/2nkMU2r
###ECMA Script 6+
ECMA Scriptの分かりやすい解説→https://teratail.com/questions/61827
https://bit.ly/2OmrDkq
##General Development Skills
###GIT - Version Control
gitについて学べってこと。
###HTTPS protocol
HTTPSプロトコル。HTTPと違って、SSL/TLSプロトコルを用い、サーバの認証や通信内容の暗号化・改竄検出などを行うことよって、なりすまし・中間者攻撃・盗聴などの攻撃を防ぐことができる。
https://bit.ly/2vLVXxf
###Learn to Search for solutions
バグなどの解決策を調べる方法や、解決の仕方を学べってことだと思われる。
→[どんなことでも答えてくれる？プログラミング質問サイト5選](https://www.sejuku.net/blog/1017)
###Terminal usage
ターミナルの使い方を学ぼうねってこと。
###Data Structures and Algorithms
データ構造とアルゴリズム。
https://bit.ly/2KEbmoV
###Design patterns
デザインパターン。ソフトウェアの設計ノウハウを蓄積し、名前をつけ、再利用しやすいように特定の規約に従ってカタログ化したもの。
https://bit.ly/2OjaWq0
##Vue
https://jp.vuejs.org/

**完**
zend formでMultiCheckboxのlabelにclassを追加する方法

業務でZendFramework1にあるZendFormをよく使うが、
multiCheckboxを使うときに、labelにCSSを追加したい！と思っていて調べたらできたのでメモ。

#結論
setAttribsに「label_○○」でlabelへ追加ができる。


php側でformを作成する。
普通にsetAttribsに’class’追加すると、、、

```php
$element = clearElements('multiCheckbox', 'hoge');
$element->setLabel('ほげ');
$element->addMultiOptions(array(
   '1' => 'ほげほげ1',
   '2' => 'ほげほげ2',
));
$element->setAttribs(array(
　　'class' => 'hoge',
));
$this->addElement($element);
```

```html
<label id="hoge-1"><input name="hoge[]" id="hoge-1" class="hoge" type="checkbox">ほげほげ１</label>
<label id="hoge-2"><input name="hoge[]" id="hoge-2" class="hoge" type="checkbox">ほげほげ２</label>
```

inputタグの要素にclassを追加できる。
が、やりたいのはlabelの方にclass追加すること。
で公式サイト見てたらそれっぽいのを見つけたので試したらできた。

setAttribsに追加するキーを’label_class'へ変更する。

```php
$element = setAttribs(array(
　　'label_class' => 'hoge', 
));
```

と書くと、無事にlabelに要素追加ができる！

```html
<label id="hoge-1" class="hoge"><input name="hoge[]" id="hoge-1" type="checkbox">ほげほげ</label>
<label id="hoge-2" class="hoge"><input name="hoge[]" id="hoge-2" type="checkbox">ほげほげ</label>
```
BeagleBone BlackにTensorFlowをインストール ... 出来なかった話

BeagleBone BlackにDebian StretchをSDカードにインストールしました。

# 使ったもの
* BeagleBone Black Rev.C
* [最新Debian 9.4 2018-06-17](http://beagleboard.org/latest-images)

# 手順
1. 最新DebianでBeagleBone Blackを立ち上げる。  
   2018年8月7日ではbone-debian-9.4-iot-armhf-2018-06-17-4gb.img.xz
2. パッケージ情報を更新

    ```
$ sudo apt-get update
    ```

3. Atlusをインストール

    ```
$ sudo apt-get install libatlas-base-dev
    ```

4. TensoFlowのインストール  

    ```
$ pip3 install tensorflow
Collecting tensorflow
  Could not find a version that satisfies the requirement tensorflow (from versions: )
No matching distribution found for tensorflow
debian@beaglebone:~$ pip install tensorflow
    ```

    出来ませんでした！

# おしまい

残念でした。
CentOS7でKubernetesをall-in-one構成で動かす

参考記事：https://qiita.com/sheepland/items/d63bfe24c8e363132f7a

## Kubernetesのインストール

### ホストネームを変える

```
# sudo hostnamectl set-hostname 'k8s-master'
# echo "10.26.5.22 k8s-master" >> /etc/hosts
```

### 簡単のためSELinux、Firewallを止める（本番環境ではやらないでください）

```
# setenforce 0
# sed -i --follow-symlinks 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux
# systemctl stop firewalld && systemctl disable firewalld
```

### Dockerのインストール

```
# yum install -y yum-utils device-mapper-persistent-data lvm2
# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# yum makecache fast
# yum remove docker docker-common docker-selinux docker-engine
# yum install docker-ce
# systemctl restart docker && systemctl enable docker
```

### Kubernetesのリポジトリを登録

```
# cat <<EOF > /etc/yum.repos.d/hoge.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-$(uname -m)
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg
        https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOF
```

### Kubeadm（Kubernetesをいい感じに入れてくれるやつ）のインストール

```
# yum install kubeadm
# systemctl restart kubelet && systemctl enable kubelet
```

## Master Nodeの作成

```
# swapoff -a
# kubeadm init
```

kubeadm initが成功すると次に行う作業が表示されるので行う。
なお、同時に表示される`kubeadm join --token ~~`はall-in-one構成では現状必要ない。

```
# mkdir -p $HOME/.kube
# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
# chown $(id -u):$(id -g) $HOME/.kube/config
```

### ネットワークの作成
```
# export kubever=$(kubectl version | base64 | tr -d '\n')
# kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$kubever"
serviceaccount "weave-net" created
clusterrole "weave-net" created
clusterrolebinding "weave-net" created
daemonset "weave-net" created
```

### 以下のようになれば成功
```
# kubectl get nodes
NAME       STATUS    ROLES     AGE       VERSION
kubetest   Ready     master    1h        v1.11.1
```

## KubernetesのMaster NodeをWorker Nodeと兼任させる

ここまででKubernetesのMaster Nodeの設定は終了しているはず。
しかし、KubernetesのMaster NodeはDefaultではWorker Nodeとしては動作しない。
以下のコマンドを打つことで、Worker Nodeとして動作するようになる。
参考：https://mbook-x86.hatenablog.com/entry/2018/04/29/024210

```
# kubectl taint nodes --all node-role.kubernetes.io/master-
```
Cookieを取得してブラウザ上に最後にアクセスした時間を表示する

## Cookieとは？

 - Webブラウザに情報を記録するための仕組み
 - 有効期限を指定できる

内部的にはHTTPのリクエストヘッダのCookieという項目と、レスポンスヘッダのSet-Cookieという項目を利用することで実現

## Cookieを取得してブラウザ上に最後にアクセスした時間を表示する

**index.js**

```
'use strict';
const http = require('http');
const server = http.createServer((req,res) => {
  const now = new Date().getTime();
  res.setHeader('Set-Cookie', 'last_access=' + now + ';');
  const last_access_time = req.headers.cookie ? parseInt(req.headers.cookie.split('last_access=')[1]): now;
  res.end(new Date(last_access_time).toString());
});
const port = 8000;
server.listen(port, () => {
  console.info('Listening on' + port);
});
```

**解説**

```
const now = new  Date();
res.setHeader('Set-Cookie', 'last_access=' + now + ';');
```
nowという変数に現在時間のミリ秒の数値を代入して、Cookieとしてlast_accessというキー名でヘッダにセットしている。
```req.headers.cookie.split```でブラウザから送られてきたCookieの内容を参照できる。

``` const last_access_time = req.header.scookie.split('last_access')[1]): now; ```
Cookieが取得できたら``` last_access=〇〇 ```からミリ秒を表す文字列〇〇を抜き出し、```  parseInt() ```で数値に変換して``` last_access_time ```
に代入している。
もし、Cookieが取得できなかったら``` now ```を``` last_access_time ```に代入する。

``` res.end(new Date(last_access_time).toString()); ```
そして取得した最終アクセス時間のミリ秒表記を``` new Date ```に渡し、文字列に変換している。

## 所感
セッションが残って面倒な場面でCookieを削除することはよくあるが、仕組みを知るとブラウザに情報を保存できるCookieのありがたみを実感する。
localStorageで端末にデータを保存する

Asial様からの引用です。
<a href="http://blog.asial.co.jp/939">localStorageで端末にデータを保存する</a>

この情報で大変助かりました。

Monacaなどで、ログイン項目を端末に
保存するときに大いに役立ちました。
Asial様には感謝申し上げます。

キーを指定して保存するタイプのデータベース（KVS）となっています。
CSS基本

#css基本

- styleタグの中、属性の中
- 無効化は/**/
- 外部ファイルに作成可能。
    - リンクタグを利用する
- ![Screen Shot 2018-08-08 at 20.37.14.png](https://qiita-image-store.s3.amazonaws.com/0/274410/adc6f9b0-5da6-740f-fb2c-0110550d19fc.png)
アセンブラ入門メモ(ARM)

#この記事について
この記事は僕がアセンブリ言語に興味を持ち、理解したことをメモ程度に書く記事です。
勿論誤ったことを記述することが多くあると思うので、それを楽しむ程度に見てくれると幸いです。

なんでARMなのって思うかもしれませんが、手元に気軽に検証でそうなのがラズパイくらいだったからです


基本は以下のリンクを参考にさせてもらっています。
[\[アセンブラ\] ARMの仕様を見てみる](https://qiita.com/edo_m18/items/a7c747c5bed600dca977)


#レジスタ

32bit の `r0` から `r15`までの１６個

+ `r0` 〜 `r13`までは汎用レジスタ 

+ `r13` -- スタックポインタ

+ `r14` -- リンクレジスタ

+ `r15` -- プログラムカウンタ


別名など

|レジスタ|別名  | |レジスタ |別名|  
|---|---|---|---|---|
|r7 |wr||r12|ip|
|r9 |sb||r13|sp|
|r10|sl||r14|lr|
|r11|fp||r15|pc

#諸々
`@`でコメントアウト
`[r1]`とかの括弧くくりはメインメモリ上のアドレスのこと
`#`は即値(ただの値)

#命令

基本的に以下の構文

```
命令 デスティネーション 第1オペランド 第2オペランド
```


###mov
レジスタ間で値を代入する。
レジスタに直接値を代入する場合は`movt`を併用して上位16bitと下位16ビットで分けて代入するらしい。

```
mov r1, r2   @ r1 <- r2
```


###add / sub
デスティネーションに第1と第2オペランドを足したもの/引いたものが代入される。

```
add r1, r2, r3  @ r1 = r2 + r3
sub r1, r2, r3  @ r1 = r2 - r3
```

###ldr / str
`ldr`はオペランドに指定されたアドレスの値を、デスティネーションレジスタに代入する。
`str`はデスティネーションレジスタの値を、オペランドに指定されたアドレスに書き込む。

```
ldr r4, [r10]  @ r4 <- [r10]
str r4, [r10]  @ r4 -> [r10]
```

###push / pop
近いうちに書きます
...

<br><br>

とりあえずこんだけでも、少しはニーモニックが読めた!
また色々理解できたら記述していこうと思います
ポップアップサンプル「はい／いいえ」のサーバーサイド連携

ポップアップで「はい」をクリック後にAjaxを起動してサーバーサイドのAPIと連携するのをjQueryを使用して作成しました。
こういうピンポイントで利用できるポップアップを探しても無かったので自作してみました。
[ソースコードはGitHubに公開してあります。](https://github.com/YoshihisaSaitou/popup-sample001)

##使用方法
ソースコードをダウンロードし下記ファイルをHTMLから読み込みます。
`css/popup_sample001.css
js/popup_sample001.js`

読み込み例
`<link href="css/popup_sample001.css" rel="stylesheet">
<script type="text/javascript" src="//code.jquery.com/jquery-3.2.1.min.js"></script>
<script type="text/javascript" src="js/popup_sample001.js"></script>`

&lt;body&gt;直下に下記を記述します。
<pre>
&lt;div id="popup_yn"&gt;
    &lt;div id="popup_yn_txt"&gt;&lt;/div&gt;
    &lt;div id="popup_yn_notice"&gt;&lt;/div&gt;
    &lt;div&gt;
        &lt;input id="popup_y_btn" type="button" value="はい" /&gt;
        &lt;input id="popup_n_btn" type="button" value="いいえ" /&gt;
    &lt;/div&gt;
&lt;/div&gt;
&lt;div id="popup_background"&gt;&lt;/div&gt;
&lt;div id="loading"&gt;&lt;img src="img/loading.gif" /&gt;&lt;div class="background"&gt;&lt;/div&gt;&lt;/div&gt;
</pre>

適用するタグに下記を記述します。
`class="yn_btn"
data-text="ポップアップに表示する文言"
data-id="サーバーサイドに送信するID"
data-url="サーバーサイドのURL"`

タグ設置例
`<input class="yn_btn" data-text="削除を実行しますか？" type="button" data-id="1" data-url="/admin/delete" value="削除" />`
systemctl stop serviceは何をしてくれるか

# 結論
デーモン停止コマンドをたたいて（たいていはSIGTERM）、同一グループに属するプロセスにも停止コマンドをたたく。
# systemctl
Systemdが提供するシステムとサービスマネージャの管理用コマンド。 

下記コマンドでプロセスを終了できる。
```
systemctl stop [サービス名]
```

## systemd stopで実行されるコマンド
1. [サービス名].serviceファイルの`ExecStop`パラメータに指定されたコマンドが実行される。
2. `ExecStop`が設定されていない場合は、`KillSignal`パラメータで指定されているシグナルをサービスのプロセスに送信する。
3. `KillMode`の設定に従って、サービスのグループに属するプロセスにも終了シグナルを送信する。

`KillSignal`のデフォルトは`SIGTERM`です。 
`KillMode`のデフォルトは`control-group`で、サービスに属する子プロセスが終了されます。

[systemd.service]
(https://www.freedesktop.org/software/systemd/man/systemd.service.html)より
> ExecStop=
`ExecStart=`によって開始されたサービスを停止するために実行するコマンドです。この引数（パラメータ）は、ExecStartと同様の形式で複数のコマンドラインを指定できます。この引数は省略可能です。この引数によって指定されたコマンドが実行されると、サービスが停止したことが通知され、サービスのためのプロセスは`KillMode=`の設定したがって全て終了されます。`ExecStop=`が未設定の場合、プロセスは`KillSignal=`で指定されたシグナルを使って終了されます。指定子と環境変数の置換をサポートしています。（例えば$MANPID）
サービスを終了することを依頼するコマンドを指定するだけ（例えば、何らかの形で終了シグナルをキューイングする）では、終了するまで待つわけではないため、大抵は不十分であることに注意してください。このコマンドが実行されたあと、サービスの残されたプロセスは`KillMode=`と`KillSignal=`によって終了されるため、クリーンな停止が行われない場合があります。したがって、このコマンドは非同期ではなく同期された動作を行うものを指定してください。

## ExecStopを調べる
```sh
root@ytnk-VirtualBox:~# systemctl show tomcat8|grep ExecStop
ExecStop={ path=/etc/init.d/tomcat8 ; argv[]=/etc/init.d/tomcat8 stop ; ignore_errors=no ; start_time=[n/a] ; stop_time=[n/a] ; pid=0 ; code=(null) ; status=0/0 }
```

# 参考
- [systemd.service]
(https://www.freedesktop.org/software/systemd/man/systemd.service.html)
- [systemd.kill](https://www.freedesktop.org/software/systemd/man/systemd.kill.html)
OSSによくあるバージョン表記

OSSが育っていく過程を眺めながら、〇〇版について個人的に持っている印象を✏️

だいたいα版リリース、β版リリース、RC版リリースの情報をキャッチアップしています。
（α→β→RCの順に製品に近い状態になっていく。）

## α版
OSS開発者：何か不具合があっても許してね!
利用者：もう待ちきれない！不具合があっても、むしろ見つけてcontributeする！

## β版
OSS開発者：一通り要件は盛り込んで、正常系は動作を担保できる！けど、不具合や異常系はまだ存在する可能性あり！
利用者：本番採用はできないけど、気になるしちょっと試してみようかな！


## RC版
OSS開発者：限りなく製品に近い状態。リリースの候補バージョンです！
利用者：お！いよいよリリースも近いな。じゃあ導入検討してみよう！
Rails link_toで前に開いたページに戻る

### 実現したいこと
link_toを使って前に開いたページへ戻るリンクを作成する。

###エラーコード
```
No route matches [GET] "/products_path(@product)"

products_path	GET	/products(.:format)	
products#index

POST	/products(.:format)	
products#create

new_product_path	GET	/products/new(.:format)	
products#new

edit_product_path	GET	/products/:id/edit(.:format)	
products#edit

product_path	GET	/products/:id(.:format)	
products#show
```

###Rails　ソースコード
```erb
#index.html.erb
<% if @formerproduct.present? %>
<h2>先ほどの商品は<%= link_to @formerproduct.name,'products_path(@product)'%></h2>
<% end %>
```
```ruby
#products.controller.rb
def index
    @products = Product.all
    if params[:name].present?
      @formerproduct = Product.find_by(name:params[:name])
    end
  end

  # GET /products/1
  # GET /products/1.json
  def show
    @product = Product.find(params[:id])
  end
```

###試したこと
・公式[Rails Guide](https://railsguides.jp/routing.html)参照に@productを生成してpathが通るようにindex.html.erbに記述→No route matches
・products_path(@formerproducts.id)で記述→No route matches
・products_path(@formerproducts.name)で記述→No route matches

###解決コード
・[Railsでリンクパスを生成する方法](https://qiita.com/mm36/items/f266977e12df9d1dc548#xxx_path-%E6%96%B9%E5%BC%8F)を参考に

```ruby
product_path(@formerproduct.name)
```
def indexにて@formerproductを定義しているので、これがRails Guideにおける

```ruby
@patient = Patient.find(params[:id])
```
と同義であることに気づけなかった為に数時間悩みました。
新しい変数で前のリンクを定義しているので、そのままその変数を用いてpathを記述するば良かったのです。
macOS で英語のフォルダ名を日本語で表示する（ローカライズ）

# TL;DR

- 英語のフォルダ名を日本語で Finder 上で表示させる（ローカライズする）方法です。
- システムファイルはいじりません。
- ローカライズしたいフォルダ内に `.localized/ja.strings` を作成し、そのファイル内に表示させたい内容を入力し、フォルダ名に `.localized` を付け加えます（詳しくはこの記事の「方法」を参照）。

# 試した環境

- macOS High Sierra 10.13.6
- Finder バージョン 10.13.5

# 方法

まず、ローカライズしたいフォルダを英語で作成します。すでに存在するフォルダをローカライズしたい場合は次へ進んでください。

<img width="882" alt="localization-01.png" src="https://qiita-image-store.s3.amazonaws.com/0/120226/9af2f4e2-11b7-fec0-aa15-56a5819c9da6.png">

次に、ターミナルを起動して、ローカライズしたいフォルダ内に `.localized` ディレクトリを作成し、さらにその中で `ja.strings` ファイルを作成します。この `.localized` というディレクトリは Finder 上では不可視になります。

```bash
$ cd ~/Games
$ mkdir .localized && cd .localized
$ touch ja.strings
```

作成した `ja.strings` を任意のエディタで開き、`"<英語のフォルダ名>" = "<表示させたい名前>";` の形式で記入して保存します。

```
"Games" = "ゲーム";
```

最後に、**Finder 上で**ローカライズしたいフォルダ名の末尾に `.localized` を付け加えて名前を変更します。この「Finder 上で」というのがキモで、ターミナルから `mv Games Games.localized` というように変更すると、Finder 上ではなぜかフォルダごと不可視になってしまいます。 

<img width="882" alt="localization-02.png" src="https://qiita-image-store.s3.amazonaws.com/0/120226/2a02773b-775d-76e5-db0c-5f050cc53bcc.png">

正しくできていれば、以下のようにローカライズされた名前で表示されるようになります。

<img width="882" alt="localization-03.png" src="https://qiita-image-store.s3.amazonaws.com/0/120226/b04eb8e7-987c-b404-9e03-0ccf1c07ca6a.png">

ちなみに、このときターミナルで見るとディレクトリ名は `<英語のフォルダ名>.localized` になっていました。

<img width="682" alt="localization-04.png" src="https://qiita-image-store.s3.amazonaws.com/0/120226/36b26662-84cd-0f8a-2250-ce175e4ff7e1.png">

# おわりに

おつかれさまでした。以上の方法で、英語のフォルダ名を Finder 上で日本語で表示させることができます。

個人的には、ディレクトリ名にも `.localized` と付けないといけない点はちょっと気になりました。ちなみに、他の最初から存在する `Applications` ディレクトリなどはシステムファイルでローカライズされているらしく、その場合はディレクトリ名に `.localized` と付ける必要はなさそうです。

# 参考

- [日本語名と英語名を併せ持つフォルダを作る（.localized ディレクトリを作る） - 2番煎じMEMO](http://wakabamac.hatenablog.com/entry/2017/03/26/024450)
- [Mac OS X のフォルダ名を英語で作成し、日本語で表示する。 - joker8phoenix's diary](http://joker.hatenablog.com/entry/20120113/1326406354)
viperでファイルを読み込んで構造体にマッピングする

# はじめに
viperを使ってconfファイルを読もうとして、無駄に2時間程度はまってしまった。
同じような人もいると思うので、この記事に簡単に残しておく。

## ソースコード
やりたい事は、config.ymlを読み込ませて、構造体にマッピングする。

```go
//conf.go
type config struct {
	/*
		yml形式に合わせて構造体で記述する。
		先頭の文字が大文字でないとUnmarshalで読み込めない
		https://qiita.com/hachi8833/items/fe3d5d6b1285c5ef1821
		バグであるのかも
	*/
	Database struct {
		Host     string
		Port     string
		User     string
		Password string
	}
}

func Configure() {
	// 外部からconfの中身を参照できるようにする
	var C config

	// 設定ファイル名を記載
	viper.SetConfigName("config")

	// ファイルタイプ
	viper.SetConfigType("yml")

	// ファイルパスの設定。クロスプラットフォームで参照できるようにfilepathライブラリを使用
	viper.AddConfigPath(filepath.Join("$GOPATH", "src", "github.com", "yoshinorihisakawa", "sample-api-hoop", "conf"))

	// 環境変数から設定値を上書きできるように設定
	viper.AutomaticEnv()

	// conf読み取り
	if err := viper.ReadInConfig(); err != nil {
		fmt.Println("config file read error")
		fmt.Println(err)
		os.Exit(1)
	}

	// UnmarshalしてCにマッピング
	if err := viper.Unmarshal(&C); err != nil {
		fmt.Println("config file Unmarshal error")
		fmt.Println(err)
		os.Exit(1)
	}
}
```

```yml
// config.yml
database:
    host: "127.0.0.1"
    port: "3306"
    user: "postgres"
    password: "yoshi0923"
```

## ハマったポイント
・SetConfigNameでなくSetConfigFileとしてしまっていた。
　SetConfigFileを使う場合は、ファイルのパス全て参照させる必要がある。
　ライブラリの中を追いまくっておかしいと思い、docを見て気づいた。

・構造体の先頭文字を大文字にしなければUnmarshalしてくれない。
　ソースおってもよくわからなかった。
　ただこれは注意事項として覚えておいた方がよさそう。ネットでググって解決した。
VSCodeのターミナル部分のフォント設定

ある日、VSCode上のターミナルを開いたらフォントが全角のような見栄えに。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/32552/fc54fdb5-68b6-919b-2bc8-a387dea08dac.png)

## どんな設定になっていたか

```json
{
    "git.autofetch": true,
    "window.zoomLevel": 1,
    "editor.fontFamily": "Osaka-mono"
}
```

## 対処方法

terminal.integrated.fontFamilyという設定項目があったことがわかったので以下のようにしてひとまず解決

```json
{
    "git.autofetch": true,
    "window.zoomLevel": 1,
    "editor.fontFamily": "Osaka-mono",
    "terminal.integrated.fontFamily": "monospace"
}
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/32552/baaed169-4467-d41b-5dcd-8568e04a9864.png)
Jestで非同期関数が例外を投げることをテストする。

## 背景

バイトで、Async関数が例外を投げてくれること、そしてその例外がどの例外であるかをテストする必要が出てきました。そのときのメモを残しておこうと思います。

## やってみよう

expectに関数を渡して、toThrowしてやると非同期でない関数が例外を投げるかどうかをテストできます。しかし、この場合、expectにAsync関数を渡しても期待どおりのテストを行うことはできません。

```js
test('throws on octopus', () => {
  expect(() => {
    drinkFlavor('octopus');
  }).toThrow();
});
```

非同期処理が失敗したときに追加でアサーションを行うためには、rejectsを使います。この場合、Promiseが成功したときはアサーションが失敗します。

次のようなdrinkFlavorがあったとします。

```js
async function drinkFlavor(flavor) {
  if (flavor == 'octopus') {
    throw new DisgustingFlavorError('yuck, octopus flavor');
  }
  // Do some other stuff
}
```

この関数に引数`'octopus'`を渡したときにDisgustingFlavorErrorをThrowすることをテストします。

```js
test('rejects to octopus', async () => {
  const drinkFlavorPromise = drinkFlavor('octopus')
  await expect(drinkFlavorPromise).rejects.toThrow();
});
```

そして、toThrowに引数を与えることによって、そのThrowされた例外が`'octopus'`を含んで投げられたかどうかをテストします。この引数には正規表現を与えることも可能です。

```js
test('rejects to octopus', async () => {
  const drinkFlavorPromise = drinkFlavor('octopus')
  await expect(drinkFlavorPromise).rejects.toThrow('octopus');
});
```

そして、toThrowErrorを使うことで、その投げられたErrorがDisgustingFlavorErrorであるかどうかをテストできます。

```js
test('rejects to octopus', async () => {
  const drinkFlavorPromise = drinkFlavor('octopus')
  await expect(drinkFlavorPromise).rejects.toThrowError(DisgustingFlavorError);
});
```

## 感想

そこそこよくあるパターンではあると思うのですが、今まで出くわさなかったので、これを機に知れて嬉しいですね。