OmniAICreator/Qiita-1.07M huggingface dataset:
pythonでタイミングチャートっぽいものを作る

# モチベーション
皆さん、タイミングチャートってどうやって作ってますか？

多くの方がExcelで作っているのではないかと思います。私もそうです。
（簡単に作れる便利なツールがあるなら教えて欲しい。）

扱っている製品の分野上、タイミングチャートを作成する機会は比較的多いのですが、正直、Excelで作成するのは面倒です。
（枠線に沿って線を一本一本繋ぎ、テキストボックスで凡例を添えたりなど）
設計ドキュメントに付属する場合や厳密なタイミング観点の設計検討が必要な場合はExcelで作ることも致し方ないのですが、そうでない場合（例えば、その場限りの議論の資料用途など）、あまり時間を掛けたくない作業です。

要するに、**重要度に応じて力の掛け方を変えたい作業**な訳です。

ということで、pythonとMatplotlibを使って、タイミングチャートっぽいグラフを（Excelで作成する場合と比較して）簡単に作れるスクリプトを作ることにしました。

# 入力データ
Excelでチャートを作る代わりに用意するのは時系列データです。ファイル形式はcsvにします。
今回は以下のような単純なデータを用意しました。（とはいえ、実務ではこのレベルのタイミングチャートが必要になる場面は割とある。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/389843/ecf84464-505f-5155-afe0-98b3141fcf6c.png)



# 実装
```python
import matplotlib.pyplot as plt
import pandas as pd

# read csv file
df = pd.read_csv('data.csv', index_col=0)

# グラフ情報
GRAPHNUM = len(df.columns)  # 数
LABEL = df.columns.values   # 種類

## X軸情報(X軸共通化のため別途定義)
x = df.index.values

# データプロットと表示レイアウト
fig, axis = plt.subplots(GRAPHNUM, sharex=True)  # 複数グラフを表示するときに使う.この場合は縦に3つ並べて、x軸を共有
for i, d in enumerate(df.T.values):
    axis[i].plot(x, d, drawstyle='steps', label=LABEL[i])   # データをステップでプロット
    axis[i].set_xticks(x)                                   # ラベル位置指定
    axis[i].set_yticks(d)                                   # ラベル位置指定
    axis[i].spines['right'].set_visible(False)              # 右枠非表示
    axis[i].spines['top'].set_visible(False)                # 上枠非表示
    axis[i].spines['bottom'].set_visible(False)             # 下枠非表示
    axis[i].legend()                                        # 凡例表示
    axis[i].grid(linestyle='--')                            # グリッド線表示
# 縦方向に、間隔を密にグラフをレイアウト
fig.subplots_adjust(hspace=0.1)

# グラフ表示
plt.show()

```


# 結果
* 提案手法の場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/389843/35da46f0-6a15-6016-66b2-8b3ab2178135.png)

* 従来通りExcelで作った場合
（サンプルを作るのも手間だったので、ラベル等の情報はありません）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/389843/fbb33463-7fc7-4ee7-7429-cf4468d0f1a7.png)

さくっと作成するのには十分なクオリティじゃないでしょうかｗ

# 終わりに
本スクリプトの改善案があればご意見ください。
また、冒頭でも書きましたが、簡単にタイミングチャートを作成できるツールをご存知であれば教えてください。
5/10 本日勉強したこと　Ruby　クラスの継承

**クラスの継承**
親クラス（スーパークラス）の機能を引き継いで、子クラス（サブクラス）を作成することができる。
コードの再利用性や拡張性を高める仕組み。

`class AdminUser < class User`
のように、「子クラス　< 　親クラス」で継承できる。

```rb
class User
 def initialize(name)
  @name = name
 end
 
 def hello
  puts "Hello! I am #{@name}."
 end
end

class AdminUser < User
 def admin_hello
  puts "Hello! I am #{@name} from AdminUser."
 end
end


nakamura = User.new('Nakamura')
nakamura.hello

sato = AdminUser.new('Sato')
sato.hello
sato.admin_hello
```

上記を実行すると、
`Hello! I am Nakamura.
Hello! I am Sato.
Hello! I am Sato from AdminUser.`
と出力される。

※親クラスから子クラスのメソッドは呼び出せない。

**メソッドのオーバーライド**
子クラスの方で親クラスのメソッドを上書きする方法

ここでは、親クラスのhelloメソッドを子クラスの方でオーバーライドしていく。

```rb

class User
 def initialize(name)
  @name = name
 end
 
 def hello
  puts "Hello! I am #{@name}."
 end
end

class AdminUser < User
 def admin_hello
  puts "Hello! I am #{@name} from AdminUser."
 end
 
 def hello
  puts 'Admin!'
 end
end


nakamura = User.new('Nakamura')
nakamura.hello

sato = AdminUser.new('Sato')
sato.hello
sato.admin_hello
```
これを実行すると、
`
Hello! I am Nakamura.
Admin!
Hello! I am Sato from AdminUser.
`
になる。
helloメソッドが上書きされたのがわかる。

---
Integerの継承関係

BasicObject
↑
Object
↑
Numeric
↑
Integer

クラスの親クラスを確認するには、superclassメソッドを使う。

---
なんやかんやでGCP

- 前日に[「余談：クラウドでやりたい」](https://qiita.com/ouraboros/items/919712669fd9c78f7f48#%E4%BD%99%E8%AB%87%E3%82%AF%E3%83%A9%E3%82%A6%E3%83%89%E3%81%A7%E3%82%84%E3%82%8A%E3%81%9F%E3%81%84)と思いっきり書いてしまったので有言実行
- クラウドにも色々あるけど、やっぱりGCPでGCE（なんか呪文みたいだ）
- 久しぶりにインスタンスを作ってみたら、画面右横に月額が表示されるようになっていた。う〜ん便利
　![スクリーンショット 2019-05-11 0.20.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138216/d2e98bdc-74c3-3940-b49a-67de1272f1af.png)

- そんな訳で一番安い（＄4.38/月 $1=¥110で計算すると約¥481）のを使用
- ダメ、眠いので寝ます。お休みなさい。また明日。
Tokyo2020公式チケット販売サイトに何人並んでるのかを調べてツイートするコード


並んでる時間に作れました。

が、コードを公開すると利用規約にも違反すると思われましたので自粛します。

#Result
https://twitter.com/oyahiroki/status/1126867445027729409


以上です。
laravel5.8にlaravel-ide-helperを入れてみた

Laravelのソースを読むのに便利だという話を聞いたので入れてみました。


```bash
composer require --dev barryvdh/laravel-ide-helper
```

今回のコマンドを打つことで生成されるファイル
_ide_helper.php

コメントで@crhgさんに教えていただきました。

>require --devで入れた場合はconfig/app.phpのprividerにサービスプロバイダを追加してはいけません。Laravel 5.5以降はパッケージ自動検出があるのでそちらに任せましょう。


```php:config/app.php

// これは、追加しないdesu.

    'providers' => [

    ++  Barryvdh\LaravelIdeHelper\IdeHelperServiceProvider::class,
```


```bash
// 最初にクリアしておく必要があるようです
php artisan clear-compiled

php artisan ide-helper:generate

php artisan ide-helper:meta

php artisan ide-helper:model

//  Do you want to overwrite the existing model files? Choose no to write to _ide_helper_models.php instead? (yes/no) [no]:
 > no を入力

yesを試したのですが、Modelにphpdocを書いてくれるようです。

```

つまったところは最後の```php artisan ide-helper:model```をやらずにいつまでたってもModel::find(1)のfindから定義元にジャンプできませんでした。

メソッドジャンプすると「_ide_helper.php」に一旦飛んでその中で同じメソッドからジャンプすると本来の定義元にジャンブできるようです。
すみません。この辺がよくわかりませんでした。

ソースを読むときにはかどりそうです。

参考サイト
PackagistThe PHP Package Repository
barryvdh/laravel-ide-helper
https://packagist.org/packages/barryvdh/laravel-ide-helper
「プリミティブ型をラップする」とは？

## 背景
プログラムを初めてもう少しで1年が経とうとしています。
そんな時に、[こちらの記事](https://qiita.com/kiimiiis/items/dab7ebbcab640b4f2aa0)を元に社内でペアプロをすることになりました。
その中の一つ、「3. 全てのプリミティブ型と文字列型をラップする」ってあんまりわからなかったんです。
だって、numberはnumberやん！！
…と思ってたんですが、今日ペアプロをしてくださった方からの説明で腑に落ちたので自分のために備忘として残そうと思います。

## この世にただの「1」がどれだけあるのか？
私もなのですが、型指定をする時にさらっと「number」と書いてしまいます。
確かに、numberなのですが、それってただの「number」 なのか？

たとえば、
1と1円玉は違う。
2はあるけど、2円玉はない。
と、いうこと。

同じ数値なのに、「振る舞い」が違う。
=>**同じものではない！！**

```typescript
export class TypeOfCurrency {
    constructor(readonly value: 1 | 5 | 10 | 50 | 100 | 500) { }
}
```

ただnumberとして扱っていたら、硬貨にも関わらず「2」という数を認めてしまいます。
しかし、「金種(TypeOfCurrency)としてこのようなclassを用意すれば、
扱っているものが金種だとわかることに加え、varidationの役割も担ってくれます。

私がこの話を聞いて腑に落ちたのは、

```
今から扱おうとしている数値に「単位」がある
　=>「振る舞い」がある 
　=>ただのnumberではない。
　=>ラップすべき！！
```
※数値だけでなく、stringも同じ。（名前とか、名カナとか…）

そう考えると、ただのnumberを扱うのは、数学者とかそういった方々くらいなのでしょうね…

「本当にnumberか？stringか？プリミティブか？」を意識して日々ソースを編んでいきたいです。
あとは、getter/setterかな…
はじめてのC++ 【47日目】

# はじめに
今日は記事を書く時間やコメント返す時間がなかったのでまた明日返します。

## ブロック崩し
### Vector2dにtemplate導入してみた

```cpp:Vector2D.h
#ifndef VECTOR2D_H
#define VECTOR2D_H

template <typename TYPE>
class Vector2D {
public:
	Vector2D();//コンストラクタ
	Vector2D(TYPE _x, TYPE _y);//引数付きコンストラクタ

	Vector2D& operator = (const Vector2D& v);//代入演算子の定義
  Vector2D& operator += (const Vector2D& v);//+=を使えるようにする
  Vector2D& operator -= (const Vector2D& v);//-=を使えるようにする
  Vector2D& operator *= (TYPE k);//定数倍をかける
  Vector2D& operator /= (TYPE k);//定数倍を割る
  Vector2D operator +();
  Vector2D operator-();

	TYPE x;
	TYPE y;

};

Vector2D::Vector2D():x(0),y(0)
{
  //引数なしコンストラクタの場合はそれぞれの変数に0を代入
}

template <typename TYPE>
Vector2D::Vector2D(TYPE _x, TYPE _y):x(_x),y(_y)
{
  //引数ありコンストラクタ
}

Vector2D& Vector2D::operator=(const Vector2D &v){//代入演算子を亭午
  this->x = v.x;
  this->y = v.y;

  return *this;
}

Vector2D& Vector2D::operator+=(const Vector2D &v){
  this->x = x + v.x;
  this->y = y + v.y;

  return *this;
}

Vector2D& Vector2D::operator-=(const Vector2D &v){
  this->x = x - v.x;
  this->y = y - v.y;

  return *this;
}

template <typename TYPE>
Vector2D& Vector2D::operator*=(TYPE k){
  this->x *= k;
  this->y *= k;

  return *this;
}

template <typename TYPE>
Vector2D& Vector2D::operator/=(TYPE k){
  this->x /= k;
  this->y /= k;

  return *this;
}

Vector2D Vector2D::operator+(){
  return *this;
}
Vector2D Vector2D::operator-(){
  return Vector2D(-x,-y);
}

#endif

```
書いただけでまだ試せていないが、たぶん使えると思う。

```cpp:
Vector2d<int> A(0,0);
Vector2d<double> B(4.232,2.232);
```
このようにすれば、使えると予想。
また明日試してみる。
# 終わりに
おやすみなさい
aws translateコマンドをシェルのエイリアスに設定すると便利

AWS Translateが東京リージョンに来ましたね。わーい。
https://aws.amazon.com/jp/about-aws/whats-new/2019/05/amazon-translate-available-mumbai-singapore-tokyo-canadacentral/

ふと、これシェルのエイリアスに登録しとくと便利じゃね？
と思いついたのでやってみたよ。

こんなエイリアスを仕込む。 

```zsh
alias en='(){ aws --profile minamijoyo translate translate-text --source-language-code ja --target-language-code en --text $@ | jq -r .TranslatedText }'

alias ja='(){ aws --profile minamijoyo translate translate-text --source-language-code en --target-language-code ja --text $@ | jq -r .TranslatedText }'
```

※ 手元の環境はzshですが、bashだと無名関数使えない気がするので適当に関数にしたらよいんじゃないかな。
※ `--profile minamijoyo` のところは複数のAWSアカウントを切り替えて使ってるので、適宜自分のAWSプロファイルに読み替えて下さい。

こんなかんじで使う。

```console
$ en "aws translateコマンドをシェルのエイリアスに設定すると便利です"
It is useful to set the aws translate command to an alias for the shell

$ ja "It is useful to set the aws translate command to an alias for the shell"
aws translateコマンドをシェルのエイリアスに設定すると便利です。
```

翻訳の精度は知らんけど。
コミットメッセージ書くのにぱっと英語で出てこないときとか、ブラウザすら開きたくないときとかによいんではなかろうか。

1点注意点として、料金は無料ではなくて、100 万文字あたり 15 USD (0.000015 USD/文字) です。
まぁAWSを普段使いしてる人がちょっと使う分には誤差でしょう。
https://aws.amazon.com/jp/translate/pricing/
列名変更あれこれ

1行目の列昇格だけではうまく裁けないケースがあります。そこで、列昇格以外で、複数列をまとめて列名変更するコードを書いてみました。
分解すれば、UIでも出来るのかもしれませんが、試してません。m(_)m

##例1：最初の列以外を昇格したい
 例えば、「フォルダから」メニューで取ってきて、下図のようになった場合。
![フォルダ取り込み後の様子.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370992/222e11c3-9c0c-d5ca-a923-a3984750e07c.png)
ファイル名を列名にあげてしまうと、こうなります。
![ただの列名昇格.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370992/88e684cc-b8b4-cf3e-6b52-726d75d219d9.png)

これだと、先頭列を用いた処理が入っているクエリは、「1901.csv」が先頭でなくなったとか、消した途端に、エラーになってしまいます。


###例1のコード

注意事項
　#"Changed Type"・・・対象となるテーブルの名前がこれだったというだけです。都度、適当に変えてください。
　List.Skipをかけた2つ目のリスト・・・この例では3行目（0始まりで2番目)に、列名にしたい値があるので、{2}としています。

```PQ:列名差し替え例
= Table.RenameColumns(#"Changed Type",
                    List.Zip({ List.Skip(Table.ColumnNames(#"Changed Type"),1),
                               List.Skip(Record.ToList(#"Changed Type"{2}),1)
                              }
                    )
    )
```

結果がこちら↓
![完成図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370992/af4032d9-2b24-0f6c-7d10-803feb347c6c.png)

###List.Zip()について
波括弧で囲った各リストについて、同じ要素位置ごとにリストにくくりなおす関数です。
上のコードを分解して実行してみたのが下図。
![LISTZIP.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370992/47f46eb1-9eae-e25f-1e35-53913b48935a.png)


##例2：DateTime表示でなくて、日にちだけの列名にしたい
　下図のように日付と数値が両方あると、日付はDateTimeの表示になってしまうようです。これではそのまま列名に昇格したくないですね。
![時刻が変な例.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370992/7a1d9d57-48ad-c57d-4ce8-0841e7eb9302.png)



###例2のコード
　#"Changed Type"は例１と同じく、対象となるテーブルの名前なので、適当に変えてください。
また、この例では1行目（0始まりで2番目)に、列名にしたい値があるので、{2}としています。

```PQ:列名差し替えその2
= Table.RenameColumns(#"Changed Type",
                    List.Zip({
                              Table.ColumnNames(#"Changed Type"),
                              List.FirstN(Record.ToList(#"Changed Type"{0}),2)
                              & List.Transform(List.Skip(Record.ToList(#"Changed Type"{0}),2),
                                               each DateTime.ToText(_,"yyyy/M/d")
                                )
                    })
    )
```
↓完成図（突然小さくてすみません）
![時刻版の完成図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370992/b3fed746-69d1-2d26-d003-93c8a2b94d20.png)
【Unity】オンラインゲームを作るためのツール選択

## 【Unity】オンラインゲームを作るためのツール選択
オンラインゲームの中でもリアルタイム通信が必要なタイプのゲームを考えます。
自分の経験からで恐縮ですが、このようなゲームを作る場合はPhotonを利用するか、自前WebSocketサーバーを作るかのどちらかが良いと思います。(自分はこの２パターンの経験があります。)

結論から申し上げると、まずはPhotonを利用して作り始めるのがオススメです。
Photonを使えばサーバーのコーディングをすることなくリアルタイム通信が出来ます。また、無料枠では20人までの同時接続が可能です。20人も可能であれば、開発中では十分でしょう。

自前WebSocketサーバーを建てるのはPhotonでは実現出来ないことを実現したいときに行うと良いです。
## 終わりに
私は現在、Web3のサービスの開発をしています。詳しくはこちらの記事をご覧下さい。
        [無料でイーサリアムが当たる、Web3時代の寄付サイトを作った話](https://note.com/kenroda/n/n814347fbdcd7)
インターネット限界おじさん風挨拶が出力できるシェルコマンドojichatをUbuntuで動かした

Yasuhiro Yamada氏が開発したツイッターの声優のリプライ欄にいらっしゃいそうなおじさん風挨拶を出力できるコマンドojichatがあったのでUbuntuで試してみました
(追記　5/31　記事を若干修正）

https://github.com/greymd/ojichat

#go-langをインスール

既にGOPATHを通してたり環境を構築済みの人はやらなくてよさそう


```
 sudo apt install golang-go
```


```
 export GOPATH=$HOME/dev/go
 export PATH=$PATH:$GOPATH/bin
```

上記を```./.bashrc```に貼って

```
$ source ./.barhrc
````
次に

#ojichatをインスール

```
 go get -u github.com/greymd/ojichat
```

これでojichatが使えます

#使ってみる

```
$ ojichat 
イツキちゃん、久しぶり💗😄(^_^)😃♥ オジサンは今日から大分へ〜😆(^з<)😃♥ (^з<)
```

この独特の感触はコピペじゃなくてスクショじゃないと味わえないです
![Screenshot from 2019-05-30 23-46-20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232732/6aa3f095-7326-a4df-b47c-04975909a34e.png)

引数に名前を入れても使えるようです
![Screenshot from 2019-05-30 23-47-24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232732/1d0cfac0-b2e1-cfa8-3b7d-4c9238ea7cf4.png)

使いどころはよくわかりませんが上司への挨拶が思いつかない時などに使えばよさそうです（多分）


#参考
http://is-tech-labo.com/blog/gopath%E3%81%AE%E8%A8%AD%E5%AE%9A%E3%81%A8go-get%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9/
Spring MVCでPost-Redirect-Getパターンを実装する

フォーム送信を同期的に処理する際のブラウザのリロード・バック操作対策として定番である、Post-Redirect-GetパターンをSpring MVCで実装する方法を調査した。

### まとめ

* Controllerメソッドでリダイレクトするには `redirect:{View}` を返却する。（[参考](https://docs.spring.io/spring-framework/docs/current/reference/html/web.html#mvc-redirecting-redirect-prefix)）
* Postメソッドを受けるControllerメソッドから、リダイレクト後のGetメソッドを受けるControllerメソッドにデータを渡すには、[Flash Attribute](https://docs.spring.io/spring-framework/docs/current/reference/html/web.html#mvc-flash-attributes)を利用する。
* バリデーション結果の引継ぎはTymeleafテンプレートで参照できるように以下のキー名でFlash Attributeに格納する。   
`org.springframework.validation.BindingResult.{クラス名 (camel case)}` 
* リダイレクト後に、初回のフォーム表示をしたControllerメソッドに戻る場合は、以下のいずれかの実装とする必要がある。
	* Controllerメソッドの引数のフォーム用モデルとする場合は、Flash Attributeのバリデーション結果をモデルにコピーする。
		* バリデーション結果を保管するBindingResultモデルが空のインスタンスで設定され、Tymeleafテンプレートでバリデーション結果を表示できなくなるため。
	* Controllerメソッドの引数をフォーム用モデルでなくModelインターフェースにする。
		* この場合は初回フォーム表示時のNullPointerException発生を避けるために自分でフォーム用モデルの初期化をする必要がある。

### 実装例

* コントローラ：[ToDoController](https://github.com/unhurried/spring-mvc-desktop-app/blob/master/src/main/java/com/example/app/controller/ToDoController.java)
* モデル：[ToDoForm](https://github.com/unhurried/spring-mvc-desktop-app/blob/master/src/main/java/com/example/app/controller/form/ToDoForm.java)
* ビュー（テンプレート）：[form.html](https://github.com/unhurried/spring-mvc-desktop-app/blob/master/src/main/resources/templates/todo/form.html)

### 参考

* [Spring MVC で Post-Redirect-Get パターンをやってみる](https://blog.tagbangers.co.jp/2015/05/23/spring-mvc-post-redirect-get)
* [Passing BindingResult through Redirection Attributes](https://stackoverflow.com/questions/15903238/passing-bindingresult-through-redirectionattributes/19051540)
* [Spring - Redirect after POST (even with validation errors)](https://stackoverflow.com/questions/2543797/spring-redirect-after-post-even-with-validation-errors)
畳み込みニューラルネット Part1 [TensorFlow2.0でDeep Learning 4]

([目次はこちら](http://qiita.com/kumonkumon/items/6fd05963df92e9eec8c0))

#はじめに
[畳み込みニューラルネット Part1 [TensorFlowでDeep Learning 4]](https://qiita.com/kumonkumon/items/ebeff45afc5743bb99d9)をtensorflow2.0で実現するためにはどうしたらいいのかを書く(`tf.keras`)。

# コード
Python: 3.6.8, Tensorflow: 2.0.0a0で動作確認済み

[畳み込みニューラルネット Part1 [TensorFlowでDeep Learning 4]](https://qiita.com/kumonkumon/items/ebeff45afc5743bb99d9)
([mnist_fixed_cnn_simple.py](https://github.com/kumon/DeepLearningExercise/blob/master/src/tensorflow/mnist_fixed_cnn_simple.py))を書き換えると、

[v2/mnist_fixed_cnn_simple.py](https://github.com/kumon/DeepLearningExercise/blob/master/src/tensorflow/v2/mnist_fixed_cnn_simple.py)

```v2/mnist_fixed_cnn_simple.py
from helper import *

IMAGE_WIDTH, IMAGE_HEIGHT = 28, 28
CATEGORY_NUM = 10
LEARNING_RATE = 0.1
FILTER_NUM = 2
EPOCHS = 15
BATCH_SIZE = 100
LOG_DIR = 'log_fixed_cnn'


class Prewitt(tf.keras.layers.Layer):
    def build(self, input_shape):
        v = np.array([[ 1, 0, -1]] * 3)
        h = v.swapaxes(0, 1)
        self.kernel = tf.constant(np.dstack([v, h]).reshape((3, 3, 1, 2)), dtype = tf.float32, name='prewitt')
        self.built = True

    def call(self, x):
        x_ = tf.reshape(x, [-1, x.shape[1], x.shape[2], 1])
        return tf.abs(tf.nn.conv2d(x_, self.kernel, strides=[1, 1, 1, 1], padding='SAME'))

if __name__ == '__main__':
    (X_train, y_train), (X_test, y_test) = mnist_samples()

    model = tf.keras.models.Sequential()
    model.add(Prewitt((IMAGE_HEIGHT * IMAGE_WIDTH, FILTER_NUM), input_shape=(IMAGE_HEIGHT, IMAGE_WIDTH)))
    model.add(tf.keras.layers.Flatten())
    model.add(tf.keras.layers.Dense(CATEGORY_NUM, activation='softmax'))
    model.compile(
            loss='categorical_crossentropy',
            optimizer=tf.keras.optimizers.SGD(LEARNING_RATE), metrics=['accuracy'])

    cb = [tf.keras.callbacks.TensorBoard(log_dir=LOG_DIR)]
    model.fit(X_train, y_train, batch_size=BATCH_SIZE, epochs=EPOCHS, callbacks=cb, validation_data=(X_test, y_test))
    print(model.evaluate(X_test, y_test))
```

と書ける。ただ、Prewittフィルタの表現が適切かどうかが不安が残るが、動作は適切。

めでたしめでたし。(1epochで、すでに精度高い)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127038/0432a52f-8f64-c0d2-b305-d5ac53b74b82.png)
scratch assay2

#画像読み込みから面積算出までの関数を定義
```scratch.py
import cv2
import math
import numpy as np
import os

def analyze (path, image):
    #入力画像（カラー）の読み込み
    img_src = cv2.imread(path + "/" +image, 1)     
    
    #エッジ検出、canny法
    img_dst = cv2.Canny(img_src, 30, 100) #出力画像 = cv2.Canny(img_src, 閾値1, 閾値2)

    #平滑化
    i=0
    while i < 13:
        img_dst2 = cv2.GaussianBlur(img_dst, (11, 11), 1)
        i = i + 1


    #膨張収縮処理
    #一回膨張処理
    img_dst3 = cv2.dilate(img_dst2, element8, iterations = 1) 

    #5回収縮処理
    i = 0
    while i < 5:
        img_dst3 = cv2.erode(img_dst3, element8, iterations = 1)
        i = i + 1

    #5回膨張処理        
    i=0
    while i < 5:
        img_dst3 = cv2.dilate(img_dst3, element8, iterations = 1)
        i = i + 1

    #2値化
    thresh = 60
    ret, img_dst4 = cv2.threshold(img_dst3, thresh, 255, cv2.THRESH_BINARY)
    #出力画像 = cv2.thresh(img_src, 閾値, 最大値、閾値処理の種類)
    #処理の種類(THRESH_BINARY_INV、THRESH_TRUNC、THRESH_TOZERO、THRESH_TOZERO_INV)

    #反転
    img_dst5 = 255 - img_dst4
    
    #面積を取得
    whitearea = cv2.countNonZero(img_dst5)
    return whitearea
    
    #輪郭座標取得
    contours = cv2.findContours(img_dst5, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)[1]
    
    #取得した輪郭を描く
    analyzed_img = cv2.drawContours(img_src, contours, -1, (0,255,0), 3)
    cv2.imwrite(path2 + "/" + "analyzed_" + image , analyzed_img)
```

#バッチ処理
フォルダの中の画像を解析して、エクセルにまとめます。

```batch.py
#ファイル名取得 ()
path = "/Users/hoge" #hoge:画像が入っているフォルダ
path2 = "/Users/hogehoge" #hogehoge:輪郭を合成した画像、および面積集計エクセルファイルを保存するフォルダ
files = os.listdir(path)

#面積取得
areas = []
for i in files:
    areas.append(analyze(path, i))
    
#処理した画像の名前(.jpgの前)取得 
samples = []
for i in files:
    samples.append(i.replace('.jpg', ''))
    
#エクセルに出力
import pandas as pd
import openpyxl
df = pd.DataFrame(areas, index=samples, columns=["Area"])
df.to_excel(path2 + "/" + "Result.xlsx")
```

#最後に
改良したいけど、もうrdkitとかdeepchemの方に心が移ってしまいました。
NGSの解析のためにR言語も学ばねば!

いろいろ勉強する時間が欲しいですね。
Raspnetesを構築するにあたり

おはこんばんちはあいおんです。

#はじめに
みなさん、楽しいインフラ生活送っていますか？
ところで、ラズパイって知ってます？知ってますよね。というか転がってますよね。
世界一有名なシングルボードコンピュータですね。
最初の出会いは2014/03/31、RaspberryPiTypeBでした。
これが出たときは衝撃で大学生でしたが即買いしいろいろ遊んではみました。
一旦そこではDLNA（メディアサーバ）、DAC用等、ミュージック系や、
ファイルサーバー、ウェブサーバ等本当に使い倒して勉強したものです。
シングルボードコンピューティングの強みを活かしてサウンドカードをつけてDACや、
電子工作等にもチャレンジしてみました。
（趣味が高じて年に二回自費制作の本を出すまでに笑）
とはいえ、マシンパワーもそんなに高くなく、思ったより本運用には活きませんでした。。。
ということでちょっとの間眠ったりなんかしていました。

眠ってたとはいっても継続的に動向はチェックしていて、
　新しいバージョンのRaspberryPiが発売されたときは何となく買ってみたりもしてました。
まぁ買ってもやはりスペックが上がっているだけで出来ることという意味ではあまり変わらずでした。。。

ある意味、HWが変わっても結局"何をやるか"が重要なんですよね。
（その安さゆえにぽんぽん変えてしまうのは一長一短ありますね）

#仮想化の折にふれる
そんな中、クラウド技術も発達してきて、Kubernetesなんて流行りものが出てきました。
今までインフラエンジニアとして、1筐体に1OS、更にESXiとかの仮想化が関の山だった私にとって、
　このDockerをはじめとしたコンテナ仮想化は非常にインパクトがありました。
どこまで仮想化が進むんだ！？なんて初めは思っていました。

また少しそれますが、仕事上でも異動があり、SpringBootに少しだけ関わる機会がありました。
研修でJavaに触れて以来の私にとって、このSpringは非常にインパクトの大きいものでした。
仕事の中でもEnterprise用の分散アーキテクチャのエンジニアをしていた（している）私にとっては、
　WeblogicServerだったり、Cosminexusだったり、WebSphereApplicationServerだったり、
　きちんとしたApplicationServerを構築して、その上にきちんとしたEARを乗っけて、
　異常時にもこんな風にリカバリープランがあって、、、という思想が植えつけられていました。
が、このSpringはなんと単体のJarで動作するらしいじゃないですか。
これは私にとって非常に衝撃でした。
このJar単体での動作はまさにクラウドネイティブというかコンテナ化すごいなぁと思っていました。

少しアプリケーションはかじりましたが、そこはやはりインフラエンジニア。
やっぱりこのコンテナ化を支える基盤技術を習得したいと思っていました。

が、Springほど導入は簡単ではなく、Docker?Kubernetes?なにそれ？美味しいの？的な感じでした。

何となく思っていたイメージとして、「なんかー複数台のーマシンにーまたがってーその上にーアプリケーションのっか

るーみたいな？」感じでした。

#Raspnetesにたどり着く

というところで、「複数マシン」にまたがってというところでふと思い出したのがRaspberryPiでした。

ちょうどうちにはラズパイが転がっています。
ということでこれを有効活用しない手はないです。
（やっと本題です）

早速ネットで調べてみると先駆者の方がいらっしゃいました。
なので、それらを参考にして作ってみることに。

CyberEgent
https://developers.cyberagent.co.jp/blog/archives/14721/

おうちKubernetes
https://qiita.com/go_vargo/items/29f6d832ea0a289b4778


基本的には先駆者の方のを参考にすれば作れます。
一応画像は貼っていきます。ぺたぺた。これでちょっとは雰囲気楽しめたらいいかなと思います。


https://qiita.com/aion0721/items/6595fd8cdd5fc4516f95


というわけで、SWもなんやかんやあって完成です。
おうちKubernetesさんのが非常に参考になります。
何回か作業やり直してますが、やり直しやすいのもメリットですね。

# 作ったところでの感想と今後の展望
作ってみると、結構所有感はあります。
あーKubernetesの基盤が今ここにあるんだなぁという感じです。

とりあえず先駆者の型通りに作っただけなので、まだまだオリジナリティには程遠いです。
　当面、以下やりたいことです。

Jarデプロイで対障害性
　コンテナが落ちてもオーケストレーションで業務継続させたい。
　やっぱり自分で作ったSpringアプリを乗っけられたらより楽しいでしょうね。

今回は先駆者にならってWifiルータを買いましたが、
　個人的にはこれは不要のはずです。
　つまり、Rasp01にてWifiを受信し、ルータし、
　子機にてWifiの親機としてRaspnetesネットワークに参加させる、といったことが出来るはずです。
　個人的にはこのネットワーク周りは好きな分野でもあるので、この方面でもとがっていきたいです。

何よりDockerの知識、Kubernetesの知識習得
　とりあえず構築しただけなので、何が何やらと言った感じです。
　なので、これらを理解して人に説明できるぐらいにはならないと運用している、とは言い難いのかなと。

#最後に
というわけで、結びはどの人とも同じような感じになってしまってあれですが、、、
Raspnetesはいいぞ！
【macOS Mojave】anaconda3とJupyter Notebook でopenCV4を使う

## Jupyter NotebookでopenCVをimportしようとすると"ImportError:No module named cv2"が出てしまう

最近、openCV4がリリースされたが、openCV3もしばらく維持されるらしい。openCV4で使い方を覚えていこうと思っている。単にこれからのバージョンという以外に、このQiitaの記事にあるように過渡期のせいかインストール構成の変更がこまめになされており、PATHの問題でバージョン管理に苦労したくはない。

[OpenCVインストール構成の変遷（OpenCV 3.4.3，3.4.4，4.0.0）](https://qiita.com/dandelion1124/items/eae435e601fba2adb0d1)

そこで、pipなりcondaなりに頼ることにしたが、色々検索していると、jupyter notebookで

`import cv2`

とすると、"ImportError:No module named cv2"　が返ってくるという問題がよくあるらしい。
よくある解決法を試してみたが、

- 検索すると　pip install opencv-python　を使う方法がよくヒットするが、管理ソフトの入れ子によるインストールはトラブルをまねく可能性がある。
    - anaconda cloudからのインストールだけで解決したい。 
- やってみたらpython2.7系に落としてインストールしていた例もあった。やはりpython3系で通したい

ということで色々試した結果…

## 今回（2019.5.30 現在）、以下のシンプルな手順で解決したのでメモとして残しておく

1. 環境
    - macOS 10.14.4
    - Anaconda3 (conda 4.6.14)

2. まず仮想環境(ここではopencv_condaという名前)を作成する。この時、以下のチャンネルのopencv4のみをインストールする
   `conda create -n opencv_conda -c conda-forge opencv`

3. 次にこの仮想環境でjupyter notebookを使えるようにする。
   `conda install -n opencv_conda -c anaconda jupyter`

4. ここでインストールされたバージョンは以下
　numpy                     1.16.4 
　python                    3.7.3 
　opencv                    4.1.0



notebookを起動して
`import cv2`
としても
`ImportError:No module named cv2`
が返ってくることはなくなります。
Laravel 2つの異なるテーブルを合わせて、ページネーションをかける


Apple・Lemonテーブル

```
public function test(Request $request)
{
    $subQuery = Apple::from('apples as A')
        ->select('A.id', 'A.name');

    $list = Lemon::from('lemons as L')
        ->select('L.id', 'L.name')
        ->UnionAll($subQuery)
        ->orderBy('name', 'asc')
        ->paginate(10);
        
    return view('test',
        [
            'paginate' => $list,
        ]
    );
}
```

unionは、重複を削除します。UnionAllは重複を削除しません。
[union allコストについて参考記事](https://teratail.com/questions/54361)

<b>異なるDBを見たい場合</b>

```
public function test(Request $request)
{
    $subQuery = Apple::from('sample1.apples as A')
        ->select('A.id', 'A.name');

    $list = Lemon::from('sample2.lemons as L')
        ->select('L.id', 'L.name')
        ->UnionAll($subQuery)
        ->orderBy('name', 'asc')
        ->paginate(10);
        
    return view('test',
        [
            'paginate' => $list,
        ]
    );
}
```

テーブルの前に<b>DB名.</b>で指定すると別々のDBを見に行ってくれます。
Bash_awkでrev

```
awk '{
  for (i=length(); 0<i; i--)
    printf(substr($0, i, 1),"%c")
  print ""
}'
<<COM
stressed
を
desserts
COM
```

# 参考
- [awk-howto-0.txt]
(https://www.aihara.co.jp/~taiji/unix-tips/a2asterisk/awk-howto-0.html#rev)

> "`rev`
行毎に文字列を反転する BSD rev(1) コマンド。実用したことはないが、sed で実現するには秀逸な技法が必要であった。しかし、awk では極めて単純に、文字列を逆順に取り出して出力すればよい。

>	awk '
{
  for (i=length(); i>0; i--)
    printf("%c", substr($0, i, 1))
  print ""
}'
このように、BSD rev(1) と同じ awk スクリプトは以上のようになる。"



# 次にやること

awkで奇数文字取り出す

# あとがき
コピペしても改良すればよし？なのかしら…
scratch assay1

スクラッチアッセイの画像の解析をpythonでしました。
jupyter上で作業しました。
各ステップで処理された結果の画像は以下のコマンドで表示しながら進めました。

#画像の表示コードについて
以下のコードを各処理後に実行して、都度画像の確認を行いました。

```scratch.py
#データ解読　(hoge:各処理で返されるオブジェクト)
decoded_bytes = cv2.imencode(".png", hoge)[1].tobytes()
#Image関数
Image(decoded_bytes)
```


#①ライブラリのインポート
```scratch.py
import cv2
import math
import numpy as np
```

#②画像の読み込み
```scratch.py
(hoge:画像が入ってるフォルダ名)
img_src = cv2.imread("C:/Users/hoge/image.jpg", 1) #入力画像（カラー）の読み込み
#img_src = cv2.imread("C:/Users/hoge/image.jpg", 0) #入力画像（白黒）の読み込み
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239363/82196e7a-2f02-099a-45bb-b4b697141456.png)

#③エッジを検出 (canny法)
```scratch.py
img_dst = cv2.Canny(img_src, 30, 100) #出力画像 = cv2.Canny(img_src, 閾値1, 閾値2)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239363/80c28800-3ae5-9efc-1f09-30f3de21d5e8.png)


#④画像をぼかす (平滑化、blur)
とりあえず13回繰り返します

```scratch.py
i=0
while i < 13:
    img_dst2 = cv2.GaussianBlur(img_dst, (11, 11), 1)
    i = i + 1
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239363/80eebe45-d9b1-c85f-a18a-9bec5ef390f6.png)


#⑤収縮処理 (erode) と膨張処理 (dilate)

```scratch.py
#8近傍指定の行列を作成
element8 = np.array([[1, 1, 1], [1, 1, 1], [1, 1, 1]], np.uint8) 

#一回膨張処理
img_dst3 = cv2.dilate(img_dst2, element8, iterations = 1) 

#5回収縮処理
i = 0
while i < 5:
    img_dst3 = cv2.erode(img_dst3, element8, iterations = 1)
    i = i + 1
    
#5回膨張処理        
i=0
while i < 5:
    img_dst3 = cv2.dilate(img_dst3, element8, iterations = 1)
    i = i + 1

```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239363/6e58cea9-4986-1b89-0bd1-0f67bf3347e6.png)




#⑥2値化
```scratch.py
thresh = 60
ret, img_dst4 = cv2.threshold(img_dst3, thresh, 255, cv2.THRESH_BINARY)
#出力画像 = cv2.thresh(img_src, 閾値, 最大値、閾値処理の種類)
#処理の種類(THRESH_BINARY_INV、THRESH_TRUNC、THRESH_TOZERO、THRESH_TOZERO_INV)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239363/9646adc4-b706-1292-2318-ef2612c5c36c.png)

#⑦白黒反転

```
img_dst5 = 255 - img_dst4
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239363/e94ed828-3b8f-5c08-dea5-79337f668336.png)

#⑧面積算出パターン1
白い部分のピクセルをカウントするパターン

```scratch.py
cv2.countNonZero(img_dst5)
```
結果

```
9895
```


#⑨面積算出パターン2
輪郭を検出して、囲まれた部分の面積を全部計算して (すべてのエリアのラベルもされる) 合計または最大部分の面積を返すパターン

```scratch.py
#findContours(入力画像、輪郭抽出モード、輪郭の近似手法)
#輪郭抽出モード (RETR_EXTERNAL, RETR_LIST, RETR_CCOMP, RETR_TREE)
#輪郭の近似手法 (CHAIN_APPROX_NONE, CHAIN_APPROX_SIMPLE)
contours = cv2.findContours(img_dst5, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)[0]

#算出された全部の面積の数字をリストに放り込んで最大値(max)、または合計(sum)を返す
area = []
for i in contours:
    area.append(cv2.contourArea(i))
#sum(area)
max(area)
```
結果

```
9625.5
```

#⑩面積算出パターン2で検出した輪郭をオリジナルの読み込み画像に合成
面積の算出対象エリアが正しいか確認したかった。

```scratch.py
analyzed_img = cv2.drawContours(img_src, contours, -1, (0,255,0), 3)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239363/310879f2-b04f-7716-bfd8-91df1dd4fe11.png)

#最後に
スクラッチされたエリアに細胞が島を形成したとき(囲いの中に囲いができたとき)、今回の面積算出法では対処できないので、何かしら対応しなければいけないかと思います。もう考えるの疲れたのでこの辺で終わります。
次回、フォルダ内に入った画像全部を処理するバッチ処理のコードを書きます。
SECCON beginners 2019 でド素人が使ったコマンド

# SECCON Beginners 2019で使ったコマンド
Team 283rd place   260 points
個人 483rd place
結局1問しか解けなかった。
```.bash_history```からコマンドがなくなってしまわないうちに記録しておく。

## 基本的に使うコマンド

### file
なんのファイルか教えてくれる

```
$ file flag
flag: POSIX tar archive
```

### strings
バイナリファイルの中のASCIIコードを表示してくれる

```
$ strings secconpass 
/lib64/ld-linux-x86-64.so.2
libstdc++.so.6
__gmon_start__
_ITM_deregisterTMCloneTable
_ITM_registerTMCloneTable

```
### base64
base64で暗号化されているものを復号化する
```
$ base64 -d file1 > file2
```


## Revrsing　「seccompare」
時間内には解けてない

### ltrace
ダイナミックリンクライブラリの呼び出しを追跡するプログラムらしい。
似たようなものに```strace```というのがあるらしい。
失敗したら出てきた。

```
$ ltrace ./seccompare 1
strcmp("ctf4b{5tr1ngs_1s_n0t_en0ugh}", "1")      = 50
puts("wrong"wrong
)                                    = 6
+++ exited (status 0) +++
```

### objdump
16進ダンプする
リダイレクトして、テキストにしたら、"}"を検索すれば近くに出力されているのがわかる。

```
$ objdump -s seccompare


 400630 c645d063 c645d174 c645d266 c645d334  .E.c.E.t.E.f.E.4
 400640 c645d462 c645d57b c645d635 c645d774  .E.b.E.{.E.5.E.t
 400650 c645d872 c645d931 c645da6e c645db67  .E.r.E.1.E.n.E.g
 400660 c645dc73 c645dd5f c645de31 c645df73  .E.s.E._.E.1.E.s
 400670 c645e05f c645e16e c645e230 c645e374  .E._.E.n.E.0.E.t
 400680 c645e45f c645e565 c645e66e c645e730  .E._.E.e.E.n.E.0
 400690 c645e875 c645e967 c645ea68 c645eb7d  .E.u.E.g.E.h.E.}
 4006a0 c645ec00 488b45c0 4883c008 488b1048  .E..H.E.H...H..H
```

### ghex
GUIのバイナリエディタ
objdumpと同じように検索で"}"を見つけることができる。

## container
これも自分では解けてない

### foremost
バイナリデータから画像等を抜き出す
```
$ foremost -i containers -T
```

## dump
これだけ自力で解けた

### 流れ
1. Wiresharkでpcapデータからファイルを抽出
2. 抽出したデータおよびファイル名から8進数表記のデータ部分を切り取る
　（データ部分だけ見ても8進数だとわかるが、ファイル名にhttpでgetしたときの
　コマンド　cmd=hexdumpなんとか　が出ていて、%20等を戻してあげると
　fileを8進数にして取得していることがわかる）
3. excel または LibleCalcで　8進数から16進数に変換（OCT2HEX関数）
4. 変換した16進数をテキストに保存（file1として保存）
5. xxdコマンドを使用して、16進数のテキストファイルをバイナリに変換（xxd -r ./file1 file2）
6. fileコマンドでファイル形式を確認するとzipファイル（$ file ./file2）
7. ファイル名をflag.zipに変更（$mv file2 flag.zip）
8. unzipするとflag.jpgが出てくる
9. jpgファイルを閲覧するとflagが書いてある

### wireshark
言わずとしれたpcapファイルを解析するためのツール
pcapファイルから受信したファイルを取り出すことができる。
file-オブジェクトをエクスポート-http-ファイルを選択。
（今回、http通信だったのでhttpを選択した）

### xxd
16進数を書いたtxtからバイナリファイルにする

```
$ xxd -r ./hexdump hexdump2
```

### LibreCalc
Oct2Hex という関数を使いたかったので使用
Raspnetes構築所感

こんにちは　あいおんです。

#導入
巷では「おうちKubernetes」や「Kubernetesのラズパイ包み」等で呼ばれておりますが、
RaspberrypiのKubernetesを私もやってみました。

#HW構築
まずはハードウェア部分を作っていきます。
##ラインナップ
![IMG_8937.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216765/5a90e783-3080-0ad5-71c1-a349755b6c77.jpeg)
##Raspberrypi本体
今回のためのもう一台追加しました。おニューです。
<img width="768" alt="IMG_8939.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216765/34421d27-b1e0-3a30-2e6b-b4076e1f09d4.jpeg">

###あけたとこ
<img width="768" alt="IMG_8942.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216765/9cfa5d7b-a424-811c-0089-6dedfa520a1b.jpeg">

###新旧比較
<img width="768" alt="IMG_8943.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216765/c2142ba4-ebfb-a046-3672-0b323dfbb767.jpeg">
下が新品です。ぱっと見は違いはわかりづらいですが、新しい方がピカピカしてますね。

##タワー部分
ほぼ一番有名な以下の奴を使います。
<img width="768" alt="IMG_8944.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216765/e0a17b69-6852-b727-b01f-1b3661bd79d1.jpeg">
皆さん言ってますが、フィルムがはがしにくいですね。私は爪でバリバリいきました

###のっけたとこ
<img width="768" alt="IMG_8948.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216765/bf2ac6c2-dd41-9056-ca50-3a63a6b6cc4c.jpeg">

###つんだとこ
<img width="768" alt="IMG_8949.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216765/ba351881-2979-7797-e31a-3682f90c76d3.jpeg">

##完成
というわけでなんだかんだあって完成です。
<img width="768" alt="IMG_9124.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216765/e96f391b-813d-d4ab-8e90-d061ea3988c9.jpeg">

#SW構築
結構つまりました。が、それはまた今度。
【Kotlin】パイプライン関数を作る

JavaScript への追加が検討されているパイプライン演算子を Kotlin で作ってみた。

この記事に触発されました。
→[Pipe関数の力](https://qiita.com/jlkiri/items/5aa539ee74be2cc99409)

## JavaScript のパイプライン演算子とは

```JavaScript
c( b( a ) )
```

↑のようなコードを↓のように書ける。

```JavaScript
a |> b |> c
```

詳しくは
→[パイプライン演算子 - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Pipeline_operator)

## Kotlin で実装してみる

```Kotlin
infix fun <T, R> T.pipe(unary: (T) -> R): R = unary(this)
```

`|>` というような演算子は作れないので、`pipe` で我慢する。

使用例：

```Kotlin
fun main() {
    "Hello, World!" pipe ::println // > Hello, World!
    Math.PI pipe Math::round pipe ::println // > 3
}
```

## やっぱり記号にしたい？

まあいくつかの記号は使えますけど…。

```Kotlin
operator fun <T, R> T.plus(unary: (T) -> R): R = unary(this)
operator fun <T, R> T.minus(unary: (T) -> R): R = unary(this)
operator fun <T, R> T.times(unary: (T) -> R): R = unary(this)
operator fun <T, R> T.div(unary: (T) -> R): R = unary(this)
operator fun <T, R> T.rem(unary: (T) -> R): R = unary(this)
operator fun <T, R> T.rangeTo(unary: (T) -> R): R = unary(this)
```

使用例：

```Kotlin
fun main() {
    "Hello, World!" as Any? + ::println // > Hello, World!
    "Hello, World!" - ::println // > Hello, World!
    "Hello, World!" * ::println // > Hello, World!
    "Hello, World!" / ::println // > Hello, World!
    "Hello, World!" % ::println // > Hello, World!
    "Hello, World!"..::println // > Hello, World!
}
```

`+` だけは `println` のどのオーバーロードを使えばよいか解決できなかったため、`as Any?` で明示した。

／以上
Bash_HelloWorld(awk

```
awk 'BEGIN{print"Hello World!"}'
#=>Hello World!
```

# 参考
- [説明のないとってもシンプルなサンプルプログラム集]
(http://simplesandsamples.com/hello.awk.html)

> "hello.awk
		
BEGIN{
	print"Hello World!"
}"


# 次にやること

言語処理系100本ノックをやる。
[言語処理100本ノック 2015]
(http://www.cl.ecei.tohoku.ac.jp/nlp100/)

# あとがき

`じゃなくて'なのがポイント。
AWS SAAを(ギリギリ)合格するのに役に立った知識

(パブリックには)初投稿 + SAA合格記念投稿

# ねんがんのAWS SAAをてにいれたぞ！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169808/9968aef7-4eab-bd3a-bb5c-fbbc661e74b5.png)

本日、AWS認定ソリューションアーキテクト アソシエイトを受験して合格しました。スコアは720が合格ラインで739。超危なかった。個人的には8割くらい取ったつもりでしたが、なかなかどうして。資格試験は難しいですね・・・。

# 個人的感想
よく３日で合格しました！とか１週間で合格しました！とか記事にしている方いらっしゃいますが**とんでもない。**よく合格できるな・・・と畏怖の念を抱きます。
私にはかなり難しかったです。ちゃんと勉強して、模擬試験受けないとたぶん受かりません。
現場の知識だけでなんとなく～だと、相当頭が良いか、サービスを知り尽くしているとかではない限り不合格になると思います。


# ここで話すこと
合格のための対策は色んな方が記事にされており、そちらを参考にした方がよろしいと思います。
ここでは実際にAWS SAAを取得するために役に立った知識、経験なんかをまとめます。
要は、試験勉強するにしても**「この知識無いと辛くない？」**と私が肌で感じたものです。

今から試験受けてみよう！と思ってる方に対して、「まず何から始めればいいの？」という方の参考になれば。

# 試験を受ける前に知っておきたい事
### システムの構築・運用経験 もしくはそれに値する知識
当たり前ですが**ソリューション(課題解決)**の**アーキテクト(設計者)**なので、
システム設計のノウハウ、障害やセキュリティへの対策知識は必須です。**これがないと最初から詰みます。**
問題自体が「AWSを使ってソリューションを提案してください」のような問題なので、たとえAWSを使わなくともある程度的確なソリューションを提供できる知識がないと問題はおろか、回答の選択肢の意味すら分かりません。

なので、システム構築や運用経験のない方はしっかりと身に着けてください。
個人的には周りの先輩方に教本片手に教えて貰うと一番手っ取り早いです。

「ロードバランサーってどんな役割があるんですか！？」
「3層型のwebシステムってどんなメリットがあるんですか！？」

と、かわいい後輩にキラキラした目をしながら言われると**障害で心が摩耗している運用者は喜んで教えてくれるでしょう。**

### クラウドの特性の理解
前述のシステム構築・運用の知識にも似ていますが、何故クラウドを使いたいのか？という事をちゃんと考える必要あります。

- 無駄なコストを減らしたいから
- 突発的なリクエストにすぐにスケーリングしたいから
- 高いセキュリティを保ちたいから
- 少ないオペレーションで全世界に発信したいから
- 管理の手間を省きたいから
- **データセンター行くの超しんどい**

などなど。これらを実現するためにクラウドを使おうとしています。
ですので、オンプレミスとクラウドの特性をうっすらとでも認識し、「そういえばこれクラウドなら出来るよな」と考えれれば、試験勉強も入りやすいかと思います。

### 英語から機能を類推する能力
当然ながらAWSの試験なのでAWSのサービスに対しての質問が出てきますが、
SAAの試験問題に出てくるサービス数は結構あります(教本の用語集の1ページ分くらい)。
そして半分くらいがサービスの頭文字をとった略語で語られますので、**素直に一から覚えようとすると頭から煙が出ます。**

そこで、英語や略語をそのまま覚えるのでなく、正式名称（略語の元となった呼び方）を覚えて、名称の意味から役割を類推する事をお勧めします。

例えば、色んなサービスについている「Elastic」は「柔軟」という意味なので、柔軟性つまり増やしたり減らしたりが可能なサービスに付く事が多いです。
そういった具合に日本語の意味と合わせて覚えていくと、サービスの内容が類推しやすいです。

※一部意味わからんやつもいます。Beanstalkとか。**豆の木ってなによ。**豆の木のようにzipのアプリケーションからサーバーが出来上がるから・・・？

### モダンなシステムの理解
最新知識を持っておく必要はありませんが、少なくともserverlessやDevOps、コンテナオーケストレーションなど、業界で広まりつつあるモダンなシステムへの理解はしておくに越したことはありません。

AWSはこういった業界動向をキャッチして新サービスを出したり、既存サービスをアップデートしたりします。
「docker？なにそれ？」とか思ってると、「ECSでソリューション提案しろや」みたいな質問が来たりする可能性がありますので注意してください。
試験勉強する際に一緒に覚えてしまうのも手です。

### 問題文と回答の選択肢を素直に読み取る能力
正直これが私には一番しんどかった。
回答の選択肢には「最も費用対効果が高いものを選べ」みたいに書いてあったりするので、すべての選択肢は**コストを度外視するとソリューションとしては可能だったりします。**
なので**「どれでもええやん・・・。全部正解やん・・・」**と思ってしまうともう泥沼。

素直に問題文を読んで素直に一番良い回答をすれば良いだけなのですけど、ここら辺は模擬試験とかをやってみて感覚を掴むしかないとは思いますが、素直に問題を読んで、素直に回答しましょう。

# 最後に
もちろん、上記に挙げた知識が無くても合格する方はいらっしゃると思いますが、例えばノースキルの方が「なんか最近AWS流行ってるし、取ってみようかな～」とか思っていたとして、**あまり簡単に考えてはいけないと思うよ！**という事をお伝えするためにこの記事を書きました。

もちろん、ノースキルからの資格取得を否定しているわけはなく、むしろ逆にしっかりと事前準備をして試験代を無駄にして欲しくない、という思いです。(16,200円もするからね！)

この記事が資格取得を目指す方の一助になれば幸いです。
Bash_1~10までの合計(awk

```
seq 0 10|awk '{s += $1} END {print s}'
#55
```
# 参考

- [awk で気軽に集計 - Qiita]
(https://qiita.com/kitsuyui/items/3647bd5b8a5b3e858d3c)
> "awk '{s += $1} END {print s}'"

# 次にやること
man awkを読む。

# あとがき

Bashの練習できるサイトありますか？
Leafletでマンデルブロ集合の表示してみる (2)

# これまでのお話

[前のお話](https://qiita.com/masaminh/items/31d38f657cce66d53578)
突然ですが、なんの脈絡もなく、マンデルブロ集合を描きたくなりました。
どうせやるならGoogle Mapみたいにスクロールしたり拡大したり…というのをやってみよう…ということで、手を動かしてみました。
で、前の話では、こんな構成でタイル画像を作ってみましたというところまでやりました。
↓こんな感じ↓
![qiita_mandelbrot_tile.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83499/38f63fe9-286b-fb46-60f4-4ccdb5dd9a39.png)

# Leaflet

で、[Leaflet](https://leafletjs.com)はこういうタイル画像を使ってスクロールや拡大縮小できるようにうまくやってくれるJavascriptライブラリです。

基本的に地図を表示するときと同じ使い方でいけるのですが、国土地理院の[地理院タイル仕様](https://maps.gsi.go.jp/development/siyou.html)に記載があるように

>西経180度、北緯約85.0511度の北西端を端点にもつタイルを(0,0)として東方向をX正方向、南方向をY正方向にとります。 

という座標系、ビットマップを描画する場合、左上が原点で、1ピクセル=1座標値、の方が都合よかったりするので、座標系として「L.CRS.Simple()」を指定するようにしています。
setViewで(-256 / 2, 256 / 2)としていますが、これは初期の中心座標を画像の中心にしている、ということ。
左上が原点で、上方向と右方向がプラス方向、緯度(y)経度(x)方向の順での指定なので、このような指定になっています。

```html
<!DOCTYPE html>
<html>
<head>
    <title>Mandelbrot set</title>
    <meta charset="utf-8" />
    <link rel="stylesheet" href="https://unpkg.com/leaflet@1.5.1/dist/leaflet.css"
        integrity="sha512-xwE/Az9zrjBIphAcBb3F6JVqxf46+CDLwfLMHloNu6KEQCAWi6HcDUbeOfBIptF7tcCzusKFjFw2yuvEpDL9wQ=="
        crossorigin="" />
    <script src="https://unpkg.com/leaflet@1.5.1/dist/leaflet.js"
        integrity="sha512-GffPMF3RvMeYyc1LWMHtK8EbPv0iNZ8/oTtHPx9/cc2ILxQ+u905qIwdpULaqDkyBKgOaB57QTMg7ztg8Jm2Og=="
        crossorigin=""></script>
</head>
<body>
    <div id="map" style="width: 600px; height: 400px;"></div>
    <script>
        var mymap = L.map('map', {
            crs: L.CRS.Simple
        });
        mymap.setView(L.latLng(-256 / 2, 256 / 2), 0);
        L.tileLayer('https://masaminh.github.io/mandelbrot/tile/grayscale/{z}/{x}/{y}.png', {
            maxZoom: 6
        }).addTo(mymap);
    </script>
</body>
</html>
```

# 完成品

完成品は[こちら](https://masaminh.github.io/mandelbrot/)。

それなりに楽しめました(笑)
今日のリファクタリング -1

お腹ぐるぐるヨーグルト
どうも k1y0です。初めてのqiita投稿。

# 今日のキニナルコード
```ruby

before_action :set_content #@content

def show
  if params[:type] == 'programming'
    @title = '速習　プログラミング!'
    @text  = @content.programming_text
  elsif params[:type] == 'food'
    @title = '美味しい焼肉屋さん'
    @text  = @content.food_text
  elsif params[:type] == 'money'
    @title = '爆速で100億稼ぐ方法'
    @text  = @content.money_text
  end
end
```

こんなコードがありました。

# どう変更したか
```ruby
#before省略
def show
  @title, @text =
  case params[:type]
  when 'programming'
    '速習 プログラミング!', @content.programming_text
  when 'food'
    '美味しい焼肉屋さん', @content.food_text
  when 'money'
    '爆速で100億稼ぐ方法', @content.money_text
  end
end
```
# 課題
typeごとにhashとか作ってkeyで受け取った方がわかりやすそう。rubyむずかしい
OpenCV4.0をソースでUbuntu18.04にビルドし、C++でwebcameraのライブ映像をウィンドウに表示まで

# OpenCV4.0をインストール
[こちら](https://www.trifields.jp/how-to-install-opencv-on-ubuntu-2742)(記事1)を参考にインストールしましたが、こちらにあるCMakeのオプションではビデオ系が入れられないので、いろいろいじる。

まず、dependency
こちらの記事の、Step2 のInstall dependenciesを、とりあえずすべて入れた（どれがどれだか今はよくわからない。）

記事1を参考に自分で書いたシェルスクリプトはこちら。

```sh:opencv4.0_build-ubuntu18.04_02.sh
#!/bin/bash

SOURCE_DIR="echo $(cd $(dirname $0);pwd)"
BUILD_DIR=${SOURCE_DIR}/build
GENERATOR_NAME="Unix Makefiles"

mkdir build
cd build

cmake \
-G "${GENERATOR_NAME}" \
--build ${BUILD_DIR} \
-DCMAKE_INSTALL_PREFIX=/usr/local/ \
-DOPENCV_GENERATE_PKGCONFIG=ON \
-D BUILD_EXAMPLES=ON \
-D BUILD_JPEG=ON \
-D BUILD_PACKAGE=ON \
-D BUILD_PNG=ON \
-D BUILD_SHARED_LIBS=ON \
-D BUILD_TESTS=ON \
-D BUILD_TIFF=ON \
-D BUILD_WITH_DEBUG_INFO=ON \
-D BUILD_ZLIB=OFF \
-D BUILD_opencv_apps=ON \
-D BUILD_opencv_calib3d=ON \
-D BUILD_opencv_core=ON \
-D BUILD_opencv_features2d=ON \
-D BUILD_opencv_flann=ON \
-D BUILD_opencv_highgui=ON \
-D BUILD_opencv_imgcodecs=ON \
-D BUILD_opencv_imgproc=ON \
-D BUILD_opencv_java=ON \
-D BUILD_opencv_ml=ON \
-D BUILD_opencv_objdetect=ON \
-D BUILD_opencv_photo=ON \
-D BUILD_opencv_python2=OFF \
-D BUILD_opencv_python3=ON \
-D BUILD_opencv_shape=ON \
-D BUILD_opencv_stitching=ON \
-D BUILD_opencv_superres=ON \
-D BUILD_opencv_ts=ON \
-D BUILD_opencv_video=ON \
-D BUILD_opencv_videoio=ON \
-D BUILD_opencv_videostab=ON \
-D BUILD_opencv_viz=ON \
-D BUILD_opencv_world=ON \
-D CMAKE_BUILD_TYPE=RELEASE \
-D WITH_1394=ON \
-D WITH_CUBLAS=OFF \
-D WITH_FFMPEG=ON \
-D WITH_GDAL=OFF \
-D WITH_GPHOTO2=ON \
-D WITH_GIGEAPI=ON \
-D WITH_GSTREAMER=ON \
-D WITH_GTK=ON \
-D WITH_INTELPERC=OFF \
-D WITH_IPP=ON \
-D WITH_IPP_A=OFF \
-D WITH_JPEG=ON \
-D WITH_LIBV4L=OFF \
-D WITH_OPENCL=ON \
-D WITH_OPENCLAMDBLAS=OFF \
-D WITH_OPENCLAMDFFT=OFF \
-D WITH_OPENCL_SVM=ON \
-D WITH_OPENEXR=OFF \
-D WITH_OPENGL=ON \
-D WITH_OPENMP=OFF \
-D WITH_OPENNI=OFF \
-D WITH_PNG=ON \
-D WITH_PTHREADS_PF=OFF \
-D WITH_PVAPI=ON \
-D WITH_QT=OFF \
-D WITH_TBB=ON \
-D WITH_TIFF=ON \
-D WITH_UNICAP=OFF \
-D WITH_V4L=OFF \
-D WITH_VTK=OFF \
-D WITH_XIMEA=OFF \
-D WITH_XINE=OFF \
${SOURCE_DIR}
```

で、後は記事1に同じ。

# webcameraのライブ映像をウィンドウに表示

映像を表示するだけのコードはこちら。(フレームレートのみ、指定)

```C++:captureimg.cpp
#include <opencv2/opencv.hpp>
#include <opencv2/videoio.hpp>
#include <opencv2/imgproc.hpp>

using namespace std;

int main(int argh, char* argv[]){
		cv::VideoCapture cap(2);

		if(!cap.isOpened()){
				return -1;
		}

		cap.set(cv::CAP_PROP_FPS, 30);
		cout << cap.get(cv::CAP_PROP_FPS) << endl;

		cv::Mat frame;
		while(cap.read(frame))
		{

				cv::imshow("win", frame);
				const int key = cv::waitKey(1);
				if(key == 'q' /*113*/)
				{
						break;
				}
				else if(key == 's'/*115*/) // when pressed s
				{
						cv::imwrite("img.png", frame);
				}
		}
		cv::destroyAllWindows();
		return 0;
}
```
他の値をいじりたいときは[こちら](https://docs.opencv.org/3.2.0/d8/dfe/classcv_1_1VideoCapture.html#aa6480e6972ef4c00d74814ec841a2939)を参考に。
botuiを試してみた

# botuiとは

botuiとは、手軽にチャットボットを作ることができるjavascriptライブラリのこと。
CDNでも読み込むことができ、webが繋がる環境であればとても簡単に導入することができるのが素晴らしいです。

最近、botuiに触れる機会があったので、忘れないように書き留めておこうと思います。

## はじめに、必要なファイルをインポートする

botuiを利用する場合、ファイルを落としてきても良いですが、
CDN経由でjavascriptとcssを読み込む方こともできます。
そこは好みや実行環境に応じてそれぞれで使い分けだと思います。
今回はCDN経由で読み込んでいます。

インポートするファイルは次の4ファイル

```インポートファイル.html
<link rel="stylesheet" href="https://unpkg.com/botui/build/botui.min.css" />
<link rel="stylesheet" href="https://unpkg.com/botui/build/botui-theme-default.css" />
<script src="https://cdn.jsdelivr.net/vue/latest/vue.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/botui/0.3.9/botui.min.js"></script>
```

botuiは、裏でvue.jsを使用しているみたいで、vue.jsもインポートしなければ動かない。

ちなみにIEのバージョンが古かったりして、promiseが使えない場合は、以下のファイルのいずれかをインポートすれば使えるようになる可能性があります。
（どれも同じものなので、お好みでいずれかをインポートしてpromiseを使えるようにしてみましょう）

```priomis.html
<script src="https://cdn.jsdelivr.net/npm/es6-promise@4/dist/es6-promise.js"></script>
<script src="https://cdn.jsdelivr.net/npm/es6-promise@4/dist/es6-promise.auto.js"></script> 

<script src="https://cdn.jsdelivr.net/npm/es6-promise@4/dist/es6-promise.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/es6-promise@4/dist/es6-promise.auto.min.js"></script> 
```

## 使い方

以下のようにdivタグにidを指定して、そのタグ内で<bot-ui></bot-ui>ブロックを作成することで準備完了

```botui.html
<div id="bot_app" style="padding-left: 40%; padding-right: 40%;">
	<bot-ui></bot-ui>
</div>
```

あとは、javascriptを書いていくだけですが、書き方も結構シンプル。
以下のように、BotUIをnewして引数にdivタグのidを指定しする。
肝心なチャットの部分は、

botui.message.bot({}).then(function(){　別の処理　})

でチャットをつなげていく感じです。
（名前空間は、定義していなくても全然問題ないです。）

```botui.js
var BOTUI = BOTUI ||  {};
BOTUI.botui = new BotUI("bot_app");

...

BOTUI.init = function(){

	BOTUI.botui.message.bot({
		delay: 300,
		content: "Hello !!"
	})
	.then(function(){

		BOTUI.user();

	});
}

...

BOTUI.init();
```

一応動くものを[github](https://github.com/bakepotato/botui.git)に置いていますので、よかったら見てみてください。

エラーなく起動すると以下のようにチャットが始まります。

<img width="323" alt="スクリーンショット" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407249/37977777-6aa6-a518-a7b7-0c137650b307.png">

以上となります。
さらに詳しく知りたい人は[公式サイト](https://docs.botui.org/)を参照してください！

## 注意点
botuiでページリンクを表示させたいときは注意が必要。
最新のチャットで止まっているときは、リンクとして機能するのですが、チャットが進んでいくと、リンクが機能しなくなります。

<img width="264" alt="スクリーンショット" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407249/25a260f8-1e6b-e3f3-6b37-f463bcfde09c.png">
（↑リンクとして機能している例）


<img width="273" alt="スクリーンショット" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407249/28afd886-10e8-9937-d5c9-497a8f687b16.png">
（↑チャットが進んで、リンクが機能しなくなる）

でも、全体的にめっちゃ簡単にチャットが作れるので、やっぱり素晴らしいライブラリですよね！！
Linux基礎②

この記事は『ゼロからはじめるLINUXサーバー構築・運用ガイド 動かしながら学ぶWEBサーバーの作り方』のまとめになります。

参照:[ゼロからはじめるLINUXサーバー構築・運用ガイド 動かしながら学ぶWEBサーバーの作り方](https://www.shoeisha.co.jp/book/detail/9784798146379)
参照:http://www.cc.kyoto-su.ac.jp/~hirai/text/shell.html


# シェル：コマンドを受け付けて実行するソフトウェア
シェルとは、コマンドを受け付けて実行するソフトウェアのこと。
コマンドと呼ばれるプログラムの入力を受けつけ、Enterを押すことで実行される。

```:実行の流れ
(1)プロンプト(=動作するよう促すもの)を表示('#')
(2)コマンドを入力
(3)コマンドを探して実行
(4)実行結果を表示
(5)実行終了
(6)プロンプトを表示

```

## シェルの種類:最も利用されるのはbash
| 種類       |       説明 |  
|:-----------------:|:------------------|
| sh | Bourne shell。初版が1977年と古いシェルで、UNIX系システムで使われている。
| bash | 予約語や構文などの言語の基本的要素は全て Bourne shell を基に作成されており、そこに C shell や KornShell の機能なども追加・改良され作成されたシェル。多くのディストリビューションで標準となっている。 | 
| csh | Bourne shell と共通の先祖を持つシェルで、言語の全体的なスタイルはC言語に似ており、UNIXユーザーには読みやすい形になっている。 |  
| tcsh | cshに機能を追加する形で改良したシェル |  

その他以下Wikipedia参照
[シェル](https://ja.wikipedia.org/wiki/%E3%82%B7%E3%82%A7%E3%83%AB)
[Unixシェル](https://ja.wikipedia.org/wiki/Unix%E3%82%B7%E3%82%A7%E3%83%AB)

## コマンド
・コマンド名と同じファイルの外部コマンドと、シェルに内蔵されている内部コマンドがある
・大文字と小文字は区別される
・インストールされていないコマンドを実行したりスペルミスをしている場合にはエラーが起こる
・コマンドによってはオプションや引数を指定できるものがある

```:書式
## コマンド [オプション] [引数] 

*オプション及び引数は省略可能
```

参照:[bash - コマンド (プログラム) の説明 - Linux コマンド集 一覧表](https://kazmax.zpp.jp/cmd/b/bash.1.html#ah_4)

## シェルの機能
#### 自動補完
・コマンドやファイル名などを自動的に補完する機能があり、入力中にタブを押すことで入力する部分の残りを自動的に補完する
・補完するコマンドやファイル名が複数ある場合には、その一覧が表示される
・実行したコマンドは保存され、あとで簡単に呼び出しができる(Ctrl + P/Ctrl + N)
・インクリメンタル検索で効率的なコマンド履歴の検索もできる(Ctrl + R)
->１文字入力するごとに、コマンドの候補を表示する
->入力した文字が履歴にない場合は、入力した文字自体も表示されない

#### パイプ
・あるコマンドからの出力を別のコマンドに入力する仕組み
・パイプ「 | 」を使うことで複数のコマンドを１度に繋いで入力->実行できる

```:実行例
# コマンド1 | コマンド2 | コマンド3

=>コマンド１の処理結果をコマンド2が連続処理し、コマンド2の処理結果をコマンド3が連続処理し、コマンド3の処理結果をターミナルに表示する
```

#### リダイレクト
・コマンドの実行結果をファイルに保存するときに使う機能
・「コマンド > (or >> ) 出力先ファイル名」で実行
・「 > 」を使うとファイルを上書きor新規のファイルが作成される
・「 >> 」に既にあるファイル名を指定すると上書きはせず、ファイルの末尾に追記する

#### メタキャラクタ
・メタキャラクタとは、シェル上で特別な意味を持つ記号のこと
・代表的なものに「 * 」や「 ? 」がある

| 種類       |       説明 |  
|:-----------------:|:------------------|
| * | 0文字以上の任意の文字列 |
| ? | 任意の1文字 | 
| [] | []内の任意の1文字 |  
| \ | メタキャラクタのエスケープ |  

### 環境変数：シェルの状態や設定値が保存される変数
・慣例的に、環境変数には大文字が使われる(シェル変数は小文字)
・環境変数の値を表示するにはechoコマンドを使用し、環境変数名の前に「 $ 」をつける

#### 主な環境変数
| 環境変数名       |       説明 |  
|:-----------------:|:------------------|
| PATH | コマンドやプログラムを検索するディレクトリのリスト |
| USER | 現在のユーザ名 | 
| LANG | 地域設定（言語処理方式) |  
| HOME | 現在のユーザのホームディレクトリ |  
| HISTSIZE | コマンド履歴の最大値 |  
| HISTFILE | コマンド履歴を格納するファイル |  
| EDITOR | 標準エディタ |  

#### 環境変数の値の確認
・`echo $環境変数名`で値の確認ができる

```:書式
echo $環境変数名
```

```:実行例-コマンド履歴の最大値を確認する
# echo $HISTSIZE
=> 1000(デフォルトでは1000に設定されている)
```

#### 環境変数の値の変更
・環境変数の値を変更するにはexportコマンドを使用する

```:書式
# export HISTSIZE=2000
=>HISTSIZEの値を１０００から２０００に変更
```
・設定を変更した環境変数の値は、シェルが終了するまで有効
・変更した値をデフォルトに設定したい場合、「.bash_profile」というファイルの末尾に追加することで設定できる
*「.bash_profile」はターミナルから以下のように開ける

```:.bash_profileを開く
vim ~/.bash_profile (vimエディタの場合)
nano ~/.bash_profile (nanoエディタの場合)
```
情報計画教育基本法（案）

この資料は、学校等における情報計画教育の基本的なあり方を示すために法律形式で案を作成したものである。法律、条例、規則、通達、勧告、推奨などいずれの方法で発行してもよい内容を含むようにしている。

情報計画教育基本法（案）

（教育の目的）
第１条
情報計画教育は、人格の完成を目指し、平和で民主的な国家及び社会の形成者として必要な資質を備えた心身ともに健康な国民の育成を期して、誤解、誤処理を引き起こさないような方法で情報、資料を提供し、もつて情報計画教育の本旨の実現に資することを目的とする。

（教育の目標）
第２条　情報計画教育は、その目的を実現するため、学問の自由を尊重しつつ、次に掲げる目標を達成するよう行われるものとする。
一　幅広い知識と教養を身に付け、論理的真理と物理的理論と生命の尊厳と社会的倫理を求める態度を養い、豊かな創造と探求心を培うこと。
二　個人の固有の価値を尊重して、その独特な能力を伸ばし、創造性を培い、自主及び自律の精神を養うとともに、職業及び生活との関連を重視し、勤労を重んずる体系を設計できること。
三　正義と責任、女男の平等、自他の敬愛と協力を重んずるとともに、公共の精神に基づき、主体的に社会の形成に参画し、その発展に寄与する体系を設計できること。
四　生命を尊び、自然を大切にし、環境の保全に寄与する体系を設計できること。
五　伝統と文化を尊重し、それらをはぐくんできた我が国と郷土を愛するとともに、他国を尊重し、国際社会の平和と発展に寄与する体系を設計できること。

（工業標準の尊重）
第３条
情報計画教育で用いる仕様は、工業標準化法にもとづき、日本工業規格を尊重し、規格との違いを明確に記述すること。日本工業規格が存在しない場合には、国際規格を尊重し、規格との違いを明確に記述すること。日本工業規格・国際規格がない場合には、業界団体規格または事実上の標準として広く公開されている基準との違いを明記して、容易に理解できるようにすることとする。

（公開の方法）
第４条　情報計画教育で用いる言語および処理系は、第２条の趣旨に沿って規定するほか、市場に存在する処理系で用意に試験できる条件下において公開すること。公開された情報が、そのまま試験できない条件下で公開せざるを得ない場合には、公開で試験できる条件を満たす場所を必ず指し示すこと。
2 公開の場に変更があった場合に備えて、あらかじめ複数の場所で公開しているとよい。あるいは複数の場所を指定しているとよい。すべての公開している場所で試験できない状態になった場合には、３０日以内に別の場所で公開するものとする。

（意見公募）
第４条　第３条にもとづいて公開した情報には、原則として日本語での意見および該当する仕様を試験できる言語および処理系にもとづいた意見を提出できるものとする。ただし、公助良俗に反する記述は、公開できない状態にすることができるもとする。
日本語以外の言語での意見は、暫定的な機械翻訳のサービスと連携した国連の公用語のほか、韓国語、ベトナム語、タガログ語、スペイン語、英語などで受け付けることができるものとする。

（教材の提供）
第５条　日本に所在地のある人または法人は、無償または有償で日本語での教材の提供をできるものとする。日本に所在地のない人または法人は、当該情報提供場所に、教材の提供にあたっての日本以外の住所地、国籍または法人登記を明確にして届け出るものとする。


教育基本法（昭和二十二年法律第二十五号）
http://www.mext.go.jp/b_menu/houan/an/06042712/003.htm