OmniAICreator/Qiita-1.07M huggingface dataset:
fileds_for の使い方

### fields_forとは
- 複数のモデルを扱う form　を作りたい時に使用するもの


#### 基本的な使い方
例えば`page`モデルと `page`モデルと`has_one`の`category`モデルを同じ`form`で扱いたいとするとこんな感じになる

```ruby
<%= form_with model: @page do |f| %>
  <%= f.fields_for :category do |ff| %>
    <%= ff.text_field :name %>
  <% end %>
<% end %>

```
http://railsdoc.com/references/fields_for

Controller

```ruby
class PagesController < ApplicationController

  def new
    @page = Page.new
  end
end
```

Model

```ruby
class Page < ApplicationRecord
  has_one :category
end
```

#### has_manyな場合
こちらも`category`が`categories`に変わっただけで、こんな感じでいける

```ruby
<%= form_with model: @page do |f| %>
  <%= f.fields_for :categories do |ff| %>
    <%= ff.text_field :name %>
  <% end %>
<% end %>

```
http://railsdoc.com/references/fields_for

Controller

```ruby
class PagesController < ApplicationController

  def new
    @page = Page.new
  end
end
```

Model

```ruby
class Page < ApplicationRecord
  has_many :categories
end
```

#### 子の方に最初から複数のformを出したい時
この場合はちょっとcontrollerの方で先に子の方をbuildしてあげれば良い
これで`fields_for`のブロックの中が3回繰り返される

```ruby
<%= form_with model: @page do |f| %>
  <%= f.fields_for :categories do |ff| %>
    <%= ff.text_field :name %>
  <% end %>
<% end %>

```
http://railsdoc.com/references/fields_for

Controller

```ruby
class PagesController < ApplicationController

  before_action :build_page, only: %i(new)
  before_action :build_categories, only: %i(new)

  def new
  end

  private
  
  def build_page
    @page = Page.new
  end

  def build_categories
    for i in 1..3 do
      @page.categories.build
    end
  end
end
```

Model

```ruby
class Page < ApplicationRecord
  has_many :categories
end
```
【WSL】LinuxにHomebrewを導入する

みなさん、こんにちは。
ノンプログラマーCogome(@cogome)です。

今回はWSLのUbuntu 18.04にHomebrew(Linuxbrew)を導入した際の備忘録です。

## 環境

- Edition : Windows 10 Home
- Version : 1903
- OS build : 18362.1 (insider preview)

## 初期設定

### タイムゾーン

```
sudo dpkg-reconfigure tzdata
```

### ミラーサーバー

```ruby:/etc/apt

sudo sed -i.bak -e "s/http:\/\/archive\.ubuntu\.com/http:\/\/jp\.archive\.ubuntu\.com/g" sources.list
```

### パーミッション設定

```
echo 'umask 022' >> ~/.profile
```

```ruby:etc/wsl.conf
[automount]
options = "metadata,umask=22,fmask=11"
```

### アップデート

```
sudo apt update
```

```
sudo apt upgrade
```

## Linuxbrewをインストール

```
sh -c "$(curl -fsSL https://raw.githubusercontent.com/Linuxbrew/install/master/install.sh)"
```

### 依存関係をインストール

==> Next steps:
- Install the Linuxbrew dependencies if you have sudo access:
  Debian, Ubuntu, etc.

```
sudo apt-get install build-essential
```

### 環境変数を設定

```
test -d ~/.linuxbrew && eval $(~/.linuxbrew/bin/brew shellenv)
test -d /home/linuxbrew/.linuxbrew && eval $(/home/linuxbrew/.linuxbrew/bin/brew shellenv)
test -r ~/.bash_profile && echo "eval \$($(brew --prefix)/bin/brew shellenv)" >>~/.bash_profile
echo "eval \$($(brew --prefix)/bin/brew shellenv)" >>~/.profile
```

### パッケージをインストール

```
brew install hello
```

## 確認

```
brew doctor
```

```
cogome@DESKTOP-TTPG1CH:~$ brew doctor
Your system is ready to brew.
```

## 参考文献

- [Homebrew Documentation](https://docs.brew.sh/Homebrew-on-Linux)
- [Manage and configure Windows Subsystem for Linux](https://docs.microsoft.com/en-us/windows/wsl/wsl-config)
- [Ubuntu 18.04のWSL上へのインストールと初期設定](http://www.aise.ics.saitama-u.ac.jp/~gotoh/HowToInstallUbuntu1804OnWSL.html#toc11)
RubyとRubyonRailsの違いは？ 初心者が超初心者に向けてわかりやすく解説してみる

初めまして、だるまです。

Webエンジニアになるため、とか、初心者は勉強しやすいと聞いた、とかで
RubyやRubyonRailsを勉強している人は多いかと思います。
（自分もその1人）

ただ単語の意味は知っているけど、RubyやRubyonRailsの違いがイマイチわからない・・・
と思っている方もいるのではないでしょうか。

そんな方のためにこの記事を書いてみました。
読んでもらえればざっくりとこんなものなんだな、と理解してもらえると思います！

#　まずは全体像を把握しよう！
RubyやRubyonRailsを把握するためにもまずは全体像を把握することが大切です。


よくTwitterに例えられるのでざっくりとTwitterでどんな動きをしているのか見てみましょう。

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/368450/bb1ce69d-6cc0-2f69-fd77-d95576b2c0fe.png)

もしPCでTwitterを使用しており、DM（ダイレクトメール）の通知がきてて見ようと思ったとき、
PCではクリックしてDMが表示されて終わり、ですが、実際は上記図のように
**①PCがサーバにDMの情報を要求**
**②サーバが内部でDMのデータを探してPCへ渡す**
という処理が行われています。

そう、このサーバが行っている①②の処理を実現するためのものがRuby、RubyonRailsなのです！

#　で、結局Ruby、RubyonRailsってなんなの？
ここでようやく本題です。
Webで探すと大体以下の言葉で書かれています。
**Ruby・・・プログラミング言語**
**RubyonRails・・・フレームワーク**

これが非常にわかりにくい！

この言葉のまま初心者なりに解説すると、
上記の図で説明したサーバの処理は、Rubyというプログラム言語で動いている。
ただし、Rubyで1からTwitterのようなアプリケーションを作成するのは超大変。
なので、よく使う機能が既に用意されているRubyonRailsを使用する。
という感じになります。

これでもわかりにくいですよね。
なので突然ですがラーメンで例えてみます。

ラーメンを作ろうと思ったとき、
**麺、スープやら全て1から作ろうとする→Rubyで1からアプリを作ろうとする**
**インスタントラーメン買ってきて作ろうとする→RubyonRailsを使ってアプリを作ろうする**
と言い換えることができます。

どちらとも最終的にラーメンができあがりますが、
麺やスープを自分で最初から作ろうとすると超大変ですよね。
ただインスタントを買ってきてある程度作られている状態（フレームワークがある状態）から作ると
簡単に素早くラーメンが作れます。

RubyはWebアプリを作るための大元の言語。
ただRubyで1からアプリを作るのは大変なので、
よく使う機能がまとめられたRubyonRails（フレームワーク）を利用してWebアプリを開発する。

なんとなく理解してもらえたでしょうか？
1人でもなんとなく理解してもらえたら嬉しいです！
RenderTexture(Texture2D)を画像保存すると暗い時

#概要
![D1TflLAVAAACF5T.jpg](https://qiita-image-store.s3.amazonaws.com/0/286581/88466ca4-690b-838b-25b8-7f8e7be088ea.jpeg)
© Unity Technologies Japan/UCL
下記のようなスクリプトで画像を保存すると全体的に暗い画像が保存される場合があります。この場合の原因と対策を書きます。

```cs
RenderTexture CamTex;

Texture2D tex = new Texture2D(CamTex.width, CamTex.height, TextureFormat.RGB24, false);
RenderTexture.active = CamTex;
tex.ReadPixels(new Rect(0, 0, CamTex.width, CamTex.height), 0, 0);
tex.Apply();

byte[] bytes = tex.EncodeToPNG();
File.WriteAllBytes("RenderTexture.png", bytes);
```

#原因
Edit > Project Settings > PlayerのPlayer SettingsからOther Settings > RenderingよりColor SpaceをLinearに設定している場合に暗くなります。UTS2.0などのシェーダーに関するスライドを読むと、最初に設定するように書かれていることが多い内容です。仕組みが分かると「まぁ、そうか」という感じですが、「原因」として書くようなことではなく、完全に仕様です。

#対策1
```cs
RenderTexture CamTex;

Texture2D tex = new Texture2D(CamTex.width, CamTex.height, TextureFormat.RGB24, false);
RenderTexture.active = CamTex;
tex.ReadPixels(new Rect(0, 0, CamTex.width, CamTex.height), 0, 0);
/////////////////////////////////////////////////////////////////////////////////////////追加ここから
if (QualitySettings.activeColorSpace == ColorSpace.Linear)
{
    // ガンマ補正
    var color = tex.GetPixels();
    for (int i = 0; i < color.Length; i++)
    {
        color[i].r = Mathf.Pow(color[i].r, 1 / 2.2);
        color[i].g = Mathf.Pow(color[i].g, 1 / 2.2);
        color[i].b = Mathf.Pow(color[i].b, 1 / 2.2);
    }
    tex.SetPixels(color);
}
/////////////////////////////////////////////////////////////////////////////////////////追加ここまで
tex.Apply();

byte[] bytes = tex.EncodeToPNG();
File.WriteAllBytes("RenderTexture.png", bytes);
```
方法は色々ありそうですし、上記があまり良い方法とも思えませんが、とにかくガンマ補正というのをすると解決します。この対策では厳密にはColor SpaceがGammaの時と完全に同じRGB値にならないかもしれませんが、誤差だと思うので気にしないことにします。

※コメントにてご教授頂きましたので、以下加筆します。

#対策2
対策1のRGB各色計算を以下のように書き換えます。恐らくですが、こちらの方が正確な値になると思われます。

```cs
color[i].r = Mathf.LinearToGammaSpace(color[i].r);
color[i].g = Mathf.LinearToGammaSpace(color[i].g);
color[i].b = Mathf.LinearToGammaSpace(color[i].b);
```

#対策3
これが最も簡単でスマートな方法だと思われますが、以下のように作成したRenderTextureのsRGB設定をチェックありにします。すると、対策1でスクリプトを追加した部分は不要になり、この設定だけで解決します。
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/286581/ca61b292-6200-662e-350d-796f9f74de66.png)

#結果
どの対策も目視では、ほぼ同様の結果になります。
![D1UMXVrVsAA-Gpy.jpg](https://qiita-image-store.s3.amazonaws.com/0/286581/c6431200-afb6-1b45-01bf-ae30f6fefc02.jpeg)
© Unity Technologies Japan/UCL

#仕組み
恐らく散々語られてる分野だと思われますので、私が下手な事言うより、検索した方が良いと思います。キーワードは「ガンマ補正」「トーンカーブ」踏み込むと「sRGB」「比視感度」などだと思います。

#参考
リニアのワークフローとガンマのワークフロー
https://docs.unity3d.com/ja/current/Manual/LinearRendering-LinearOrGammaWorkflow.html
ガンマ補正
http://w3.kcua.ac.jp/~fujiwara/infosci/gamma.html
明るさの調整(γ補正)
http://www.mis.med.akita-u.ac.jp/~kata/image/colorgamma.html
ruby-rubocop is not working in vscode


#解決策

```json:settings.json
{
    "editor.formatOnSaveTimeout": 5000,
}
```

#実際の流れとか

#environment
macbook pro 2018 13inch
visual studio code

https://stackoverflow.com/questions/48030698/vscode-vscode-ruby-rubocop-how-to-auto-correct-on-save
>Per this comment on the vscode-ruby-rubocop GitHub, you can use the following settings:

>```json
{
    "editor.formatOnSave": true,
    "editor.formatOnSaveTimeout": 5000,
    "ruby.rubocop.executePath": "path/where/rubocop/is/located",
    "ruby.format": "rubocop",
}
```

>Just applied them to my user settings on my local box and it appears to work. VS Code was throwing an error for my ruby.rubocop.executePath setting saying it wasn't executable, and removing the line appears to not cause that error to show, and still formats my code accordingly. Setting a lower timeout (I tried 2500) also seems to break auto format on saving, so I'd suggest leaving it at 5000.
ローカルボックスの自分のユーザー設定にそれらを適用するだけで、うまくいくようです。私のruby.rubocop.executePathの設定にVS Codeが実行可能ではないというエラーを投げていたため、行を削除してもそのエラーが表示されないように見えますが、それでもコードは適切にフォーマットされます。<font color="MediumVioletRed">より短いタイムアウトを設定すると（私は2500を試した）保存時に自動フォーマットを壊すように思われるので、私はそれを5000のままにすることをお勧めします。</font>

https://github.com/misogi/vscode-ruby-rubocop/issues/49#issuecomment-417617844
>following is working for me:

>```json
{
    "editor.formatOnSave": true,
    "editor.formatOnSaveTimeout": 5000,
    "ruby.rubocop.executePath": "path/where/rubocop/is/located",
    "ruby.format": "rubocop",
}
```

色々やったのにうまくいかなかった。
エディターの設定を直せばうまくいくとは想像できなかった。（ずっとrubocopの設定を検索していた）
まあ、これで自動フォーマットされるし、サボれる( ・∇・)!!

https://qiita.com/sensuikan1973/items/219a843e4654e6c2e10d
https://qiita.com/astronaughts/items/760d56fb5674707a9a0f
https://qiita.com/ovrmrw/items/86310cb9ad5707ea27ee
https://marketplace.visualstudio.com/items?itemName=misogi.ruby-rubocop
document自動保存

メモを手書きでマークダウンで書いてそれをそのままdocumentにすると手間が省けるのではと思いつき実践しました。

## やりたいこと図

<img width="548" alt="スクリーンショット 2019-03-16 22.35.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/99393/109037d6-075a-630a-37b4-5e2405fddd5d.png">

メモはBAMBOO slateというスマートパッドを選択しました。ボタンを押すだけでアプリに保存できる優れものです。保存した時にtextで保存できる機能をいかして保存したいサービスのAPIを叩いてデータを保存します。

## ファイルの参照

今回は特定のディレクトリ配下をチェックして変更があった時にそれをトリガーにしてAPIを叩きます。rubyのguardを使うことにしました。


```rb

guard :shell do
  watch(/(.*).txt/) { `bash ./script/main.sh ` }
end
```

### あとはscriptを書いてguardを実行

```rb
bundle exec guard
```





### 結果

実際に書いた文字
<img width="214" alt="スクリーンショット 2019-03-18 22.19.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/99393/b463ba58-ac6b-0308-99af-9b527748a982.png">

字が綺麗ではありませんね。

ドキュメントに保存された結果はこちら

<img width="265" alt="スクリーンショット 2019-03-18 22.20.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/99393/642597a8-d5f3-b63f-65ce-15768ec076d1.png">


やや成功といったところでしょうか。
やりたいことがだいたいできたのが成果ですね。判定が微妙になりそうな文字は自分で定義し直してもいいかもしれない。
簡素なログインプログラム(パスワード認証のCGI)の作成

#Abstract
Web通信やサーバーの動きの理解の一助のため、
「ただログインするだけのWebページを作ってみるとよい」
という助言を受け、実行してみることにした。

ログイン画面のhtmlは簡単にできたが、
本丸のバックエンドプログラムの作成でてこづっている。

ここでは、
「パスワード認証をするだけの簡素なCGI」
を作ることを目標にして、同時進行で様子をレポートしていきたいと思う。
# 自己紹介
プログラミング経験数週間の初心者。簡単なスマホアプリを作ることを目標にしています。
仕事にするかはわからないが、とにかく知識や技術をつけて、生きる力にしたいと思っています。
#要件定義
・パスワード認証機能（管理人が定めた固定パスワードによるもの）
#設計
１．ログインページのhtml(login.html)のformタグのメソッド"POST"を使ってブラウザによって送られてきたパスワード入力情報を、サーバーのCGI(login.php)にて受け取る。

２．受け取ったパスワード入力が、管理人が定めたパスワード"mintia"と一致するかどうか確かめ、
　　　　一致する場合はブラウザにログイン先のページ(youkoso.html)を返して、
　　　　一致しない場合はブラウザに「パスワードが間違っています」と表示させる。
【Gang of Four】Fly Weight

#Fly Weight
**[目次](https://qiita.com/Tonkachi0620/items/03986742efbb7e3a9bbe)**
書中では何やら難しいことが色々と書いてありますが、要するに同じオブジェクトを複数回作成していると色々な面で高コストになるので、Factoryクラスを作成しインスタンスを生成するのは一度きりとすることでそれを回避しましょうね。というのが本パターンの主旨です。

##目的
多数の細かいオブジェクトを効率よくサポートするために共有を利用する。

##構成要素
・Flyweight 同一インスタンスを大量に生成する必要があるオブジェクトの抽象クラス
・ConcreteFlyweight Flyweightの具象クラス
・UnsharedConcreteFlyweight Flyweightクラスを管理するクラス 行、列など子としてFlyweightクラスを保持するクラス
・FlyweightFactory Flyweightクラスを生成するクラス
・Client 使用者

##実装
※UnsharedConcreteFlyweightに相当するクラスはありません。
文字オブジェクト管理するサンプルコードを書きます。書中のサンプルコードも文字オブジェクトが例になっているので同じようなものになってしまいますが。

###ConcreteFlyweight Flyweightの具象クラス
文字クラス
文字を1文字管理するクラス

```Character.kt
package flyweight

class Character(private val character: Char) {
    fun print() {
        print(character)
    }
}
```

###FlyweightFactory Flyweightクラスを生成するクラス
文字製造クラス
文字クラスのインスタンスを生成、プールするファクトリークラスを作成します。
当該クラスにて一度生成したオブジェクトをプールすることにより、以前生成したことのあるオブジェクトを再度生成しない。

```CharacterFactory.kt
package flyweight

// シングルトンオブジェクトにする
object CharacterFactory {

    val characterPool = HashMap<AllCharacter, Character>()

    enum class AllCharacter(val value: Char) {
        A('A'),
        B('B'),
        C('C'),
        D('D'),
        E('E'),
        F('F'),
        G('G'),
        H('H'),
        I('I'),
        J('J'),
        K('K'),
        L('L'),
        M('M'),
        N('N'),
        O('O'),
        P('P'),
        Q('Q'),
        R('R'),
        S('S'),
        T('T'),
        U('U'),
        V('V'),
        W('W'),
        X('X'),
        Y('Y'),
        Z('Z')
    }

    fun getCharacterObject(characterType: AllCharacter): Character {
        // 未生成であれば、当該インスタンスをプールする。
        characterPool[characterType]?.let {
            return it
        } ?: run {
            val char = Character(characterType.value)
            characterPool[characterType] = char
            return char
        }
    }
}
```

###Client 使用者
文字を使う人
BANANAを生成します。

```Client.kt
package flyweight

class Client {
    init {
        val characters = ArrayList<Character>()
        // "BANANA"を生成します
        characters.add(CharacterFactory.getCharacterObject(CharacterFactory.AllCharacter.B))
        characters.add(CharacterFactory.getCharacterObject(CharacterFactory.AllCharacter.A))
        characters.add(CharacterFactory.getCharacterObject(CharacterFactory.AllCharacter.N))
        characters.add(CharacterFactory.getCharacterObject(CharacterFactory.AllCharacter.A))
        characters.add(CharacterFactory.getCharacterObject(CharacterFactory.AllCharacter.N))
        characters.add(CharacterFactory.getCharacterObject(CharacterFactory.AllCharacter.A))

        characters.forEach {
            it.print()
        }
    }
}
```

###出力結果
```
[output]
BANANA
```
インストールしたてのUbuntu 16.04に有線接続したメモ

###環境
- Ubuntu 16.04 LTS

#困ったこと
Ubuntuをインストールして，
有線接続しようにも，そもそも下画像のような有線の表示がなかた。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315412/04ec0078-4143-b516-7070-eae5ee4aadb3.png)
[ここ](http://rainbowdevil.jp/?p=1164)を参考に接続した。


#手順
- NICを認識してるいか確認
- ドライバをダウンロード
- コマンドの実行

##NICを認識してるいか確認
有線接続には，[NIC](https://www.nttpc.co.jp/yougo/NIC.html)とかいうカードをパソコンが認識している必要があるそう。
なので以下のコマンドを打って認識しているか確認。

```ruby:NIC
$ ifconfig
```
NICを認識していない場合は，**ローカルループバック**しか表示されない。
その場合はドライバをダウンロードすればOK。

##ドライバをダウンロード
以下のコマンドを打って，なんの種類のドライバをダウンロードすれば良いか確認。

```ruby:driver
$ lspci | grep 'Ethernet/ | Network'
```
下の画像みたいなのが出てくる。ここではインテルのドライバが必要だと分かる。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315412/ee07ca27-3eb8-b452-ccb5-3812ec80cdd2.png)

インターネットにつながっているパソコンから[こちら](https://downloadcenter.intel.com/download/15817)からダウンロードする。
USBに入れて，有線接続したいパソコンにうつせばOK.
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315412/60475b53-1ddd-69b1-e784-a45ccbe5fbce.png)


##コマンドの実行

フォルダを解凍して，srcディレクトリに移動して，以下のコマンドを実行

```ruby:e1000e
$ cd /home/フォルダを解凍した場所/src/
$ sudo make install
$ sudo modprobe -r e1000e
$ sudo modprobe e1000e
```

これでドライバのインストールができたので，確認のコマンドを実行

```
$ lsmod | grep e1000e
```

表示のどこかに**e1000e 数字数字数字** とでてくればもうおっけい

確認のため，もう一度`$ifconfig`すると，以下のようにローカルループバック以外も認識されているはず。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315412/add80628-0455-7f2a-e627-3fad987db969.png)


ネットワーク設定から
アドレス・ネットマスク・ゲートウェイ・DNSサーバーを記入して，保存すればつながるはず
GoogleColaboratory でGoogleDriveのをマウントするときのディレクトリの位置がわからなかった話

#ディレクトリの名前がわからなかった

GoogleColaboratory でGoogleDriveのをマウントする方法についてはこちらの記事がわかりやすい。

https://qiita.com/k_uekado/items/45b76f9a6f920bf0f786

こんなに簡単になっていたとは驚きだ。

ところでここで、マウントはできたもののディレクトリの指定がうまく行かず何度もNot existになった。

公式のここを参考にしてもうまくいかない。

https://colab.research.google.com/notebooks/io.ipynb

##解決方法

なんと公式のディレクトリ名が間違っている。

公式で挙げられているドライブのルートディレクトリはこうなっている。

/content/gdrive/My Drive/

実際には下記が正しい。

/content/drive/My Drive/


gdriveではなくdriveであるので注意されたし。あとはGoogle Colaboratory を使っていればgoogle colabというファイルがあるといった具合だ。
【Gang of Four】Facade

#Facade
**[目次](https://qiita.com/Tonkachi0620/items/03986742efbb7e3a9bbe)**
クライアントがあるサブシステムを利用する場合、そのままでは複雑なインタフェースを最低限必要なインターフェースのみにまとめるようなパターンです。
当該サブシステムをカスタマイズするようなことがない場合、Facadeパターンを適用したインターフェースのみ注視することによりサブシステムを利用しやすくさせます。

要はクライアントとサブシステムの結合度を弱めるためですね。サブシステムを変更する際も結合度が弱いためし易くなります。

##目的
サブシステム内に存在する複数のインタフェースに1つの統一インタフェースを与える。Facade パターンはサブシステムの利用を容易にするための高レベルインタフェースを定義する。

##構成要素
・Facade クライアントがサブシステムを利用するにあたって必要最低限のインターフェースを定義するクラス
・サブシステム内のクラス 利用するサブシステム

構成要素のうちサブシステム内のクラスだけ何故ちゃんとした名前がついていないんでしょう…

##実装
窓口を新たに作成するだけですがサンプルコードを書きます。

###サブシステム内のクラス 利用するサブシステム
プリンタークラス インターフェース色々

```Printer.kt
package facade

class Printer {
    fun startUp() { print("起動") }
    fun shutDown() { print("終了") }
    fun setToner(color: String) { print("トナーを${color}色に設定します。") }
    fun addPaper(num: Int) { print("紙を${num}枚追加します。") }
    fun login(name: String) { print("ユーザ${name}がログインしました。") }
    fun printOut(num: Int) { print("${num}枚印刷します。") }
}
```

クライアントがプリンターを操作する上で必要なのは印刷することだけなので、それのみの窓口を用意します。

###Facade クライアントがサブシステムを利用するにあたって必要最低限のインターフェースを定義するクラス
インターフェースを限定

```FacadePrinter.kt
package facade

class FacadePrinter {
    private val printer = Printer()

    fun printOut(num: Int) {
        printer.printOut(num)
    }
}
```

###クライアント

```Client.kt
package facade

class Client {
    init {
        val printer = FacadePrinter()
        printer.printOut(15)

        // 他のメソッドは使用できない
        // printer.startUp()
        // pritner.shutDown()
    }
}
```

###出力結果
結果といっても大したものはないですが

```
[output]
15枚印刷します。
```

なんかこれは自分の認識が間違っちゅう気がする。コメントにてご指摘ください。
【Gang of Four】Decorator

#Decorator
**[目次](https://qiita.com/Tonkachi0620/items/03986742efbb7e3a9bbe)**
いきなり話が脇道に逸れますが、デザインパターンやオブジェクト指向に関する書籍を読んでいるとよくオブジェクトに対する**責務**や**責任**といった言葉がでてきます。
これは当該オブジェクトにて出来なければならないことを指しています。
また単一責務の原則というのがありますが、これはクラスを変更する理由は1つであるべき、というものです。

例えば以下のようなクラスは修正する理由が2つあります。
 - **画面遷移**処理を追加したい→画面に関する変更理由
 - **引き算**処理を追加した→計算に関する変更理由

```画面計算.kt
interface 画面計算 {
    fun 描画(): Boolean
    fun 足し算(num1: Int, num2: Int): Int
}
```

単一責務の原則に則ると以下のように分離すべきです。

```画面.kt
interface 画面 {
    fun 描画(): Boolean
    fun 画面遷移(): Boolean
}
```

```計算.kt
interface 計算 {
    fun 足し算(num1: Int, num2: Int): Int
    fun 引き算(num2: Int, num2: Int): Int
}
```

この単一責務の原則というのも、やはり変更に対して柔軟に対応するための考えだと理解しています。脇道話は以上です。

では本題、目的に**責任を動的に追加する**とあるので、継承を用いずにオブジェクト（インスタンス）に任意のタイミングで機能を追加していくようなパターンですね。

##目的
オブジェクトに責任を動的に追加する。Decorator パターンは、サブクラス化よりも柔軟な機能拡張方法を提供する。

##構成要素
・Component 責任を動的に追加できるインターフェースを定義した抽象クラス
・ConcreteComponent Componentクラスの具象クラス
・Decorator Componentクラスに責任を追加するインターフェースを定義した抽象クラス
・ConcreteDecorator Decoratorクラスの具象クラス

##実装
テキストビューインスタンスを生成するタイミングで、いろいろな機能を追加できるプログラムを実装します。

###Component 責任を動的に追加できるインターフェースを定義した抽象クラス
###Decorator Componentクラスに責任を追加するインターフェースを定義した抽象クラス
Viewコンポーネントインターフェース

```ViewComponent.kt
package decorator

interface ViewComponent {
    fun draw()
}
```

###ConcreteComponent Componentクラスの具象クラス
テキストビュー

```TextView.kt
package decorator

class TextView: ViewComponent {
    override fun draw() {
        print("【テキストビュー】")
    }
}
```

###ConcreteDecorator Decoratorクラスの具象クラス
影をつけるデコレータ

```ShadowDecorator.kt
package decorator

class ShadowDecorator(viewComponent: ViewComponent): ViewComponent {
    val viewComponent = viewComponent

    override fun draw() {
        viewComponent.draw()
        addShadow()
    }

    private fun addShadow() {
        print("：影付き")
    }
}
```

スクロールさせるデコレータ

```ScrollDecorator.kt
package decorator

class ScrollDecorator(viewComponent: ViewComponent): ViewComponent {
    val viewComponent = viewComponent

    override fun draw() {
        viewComponent.draw()
        addScroll()
    }

    private fun addScroll() {
        print("：スクロール可能")
    }

}
```

部品が全部できました。使っていきましょう。

**使う人**

```ComponentManager.kt
package decorator

class ComponentManager {
    init {
        // スクロール可能 影付き テキストビュー
        val scrollShadowTextView = ScrollDecorator(ShadowDecorator(TextView()))
        // スクロール可能 テキストビュー
        val scrollTextView = ScrollDecorator(TextView())

        // 描画
        scrollShadowTextView.draw()
        print("\n")
        scrollTextView.draw()
    }
}
```

###出力結果
実行すると以下のようになります。

```
[output]
【テキストビュー】：影付き：スクロール可能
【テキストビュー】：スクロール可能
```
【学生に優しい】Microsoft AzureとAlibaba Cloudの学割がすごい【＄0.99/year】

# AWSコワイ
[Student Developer Pack - GitHub Education](https://education.github.com/pack)

Amazon Web Serviceは学生としてGitHub Student Developer Pack経由で登録すると，12ヶ月間有効な75-150ドルのクレジット（使用料の請求が発生しない無料利用枠）が付与されます.

しかしながら，EC2などのサービスでインスタンスを立ち上げたことを忘れたまま有効期限を過ぎると，自動でサービス停止をすることもなく，きっちり使用料を請求されます．初心者のミスで**意図せずAWSから高額請求を受けた話はよく聞く話**です（交渉次第で免除される場合もあるそうですが）．必要以上にAWSを怖がることはないかもしれませんが，それでもビギナー学生は使い始めるとなかなか安心できません．

## 参考

[クラウド破産について](https://cloud-textbook.com/84/)

# 学生目線のパブリッククラウド

経験が浅く経済力も無い学生目線で他のパブリッククラウドも検討してみましょう．
パブリッククラウドとしてはAWSが一番有名ですが，学生を囲い込むためにMicrosoftやAlibabaはかなりの大盤振る舞いをしています．Googleも学割はありませんが大きな無料利用枠を提供してくれるので，運用方法によっては良い候補です．

## Microsoft Azure
[学生 - Azure の無料アカウントを今すぐ作成 | Microsoft Azure](https://azure.microsoft.com/ja-jp/free/students/)

**Microsoft Azureなら学生認証すればクレジットカード登録不要！**
無料枠を超過した分は学生に付与される12ヶ月間有効な100ドルのAzureクレジットから差し引かれ，それを超過するとサービスが自動停止するそうです．

クレジットは学生の間は毎年更新できると明記してくれているのも嬉しい。

[Azure for Students の FAQ
](https://azure.microsoft.com/ja-jp/free/free-account-students-faq/)

>Azure for Students を来年もう一度入手することはできますか。

>はい。まだ学生であれば、別の ¥11,200 Azure クレジットに更新できます。更新時期 (サインアップの年次応当日から最大 30 日前) が来たら、通知をお送りいたします。学生アカウントを再検証するだけで、追加の Azure クレジットが付与されます。未使用のクレジットを譲渡することはできません。

さらに特筆すべき点として、学生認証後に[Education Hub](https://portal.azure.com/#blade/Microsoft_Azure_Education/EducationMenuBlade/quickstart)というページから**Visual Studio Enterprise 2017やWindows 10 Education**がダウンロードできます。試しにWindows 10をVirtual Boxでセットアップしてみましたが、これ利用制限とかあるんでしょうか。普通に使えます。
<img width="1056" alt="スクリーンショット 2019-03-14 0.10.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/273305/d629c4c8-cf43-dee5-a8a7-d7e2e0cbb760.png">

学生目線で考えると**Azureは最も親切なパブリッククラウド**ではないでしょうか．

## Alibaba Cloud

[Student Discount | Education Discount | Alibaba Cloud for Education](https://www.alibabacloud.com/campaign/education)

特筆すべき点は**＄0.99/year**という破格でElastic Compute Service（仮想サーバー）が1年間使えることです。
＄0.99は定額前払いなので少なくとも1年間は安心して利用できます．
クレジットカード登録は必要ですが，PayPal支払いに対応しているところがちょっとうれしい．
スペックは

- CPU: 2 Core
- メモリ: 4GB
- ストレージ: 40GB
- データ転送量: 600GB

なので、場合によってはレンタルサーバーやVPSを契約するより圧倒的高コスパであることがわかります。
このスペックなら月額1ドルでも安いと思いますが，年額1ドルはちょっと常軌を逸した価格設定ですね．

ただし、コンソールも基本的に英語か中国語なので、自信の無い学生はAWSやAzureで慣れてからのほうが良いかもしれません。

## Google Cloud Platform

日本の学生を優遇してくれる制度自体はありませんが、GCPの[常時無料枠](https://cloud.google.com/free/?hl=ja)の中にはGoogle Compute Engine（仮想マシンサーバー）が含まれているのでGCPは個人的によく使います。サーバーが担う機能の実装をよしなにしてくれるFirebaseも無料枠がかなり大きいので、サーバーレスでアプリを作ってみたいときに良いと思います。

GCPは学割が無くとも無料で小規模なアプリを常設したいときに重宝するのではないでしょうか。

ただし，GCPはクレジットカード登録が必要な従量課金制なので，料金のアラート設定やGCPからのメールチェックに気を配る必要があります．

## Amazon Web Service

ここまでAWSを下げる感じになってしまっているので補足しますが，AWSもAWS Educate Starterアカウントとして登録すると，クレジットカード登録不要で触ってみることができます．無料枠を超過すると自動的にアカウントが閉鎖されるので安心です．ただし，付与されるクレジットが少なくなるという制約はあります．

AWS Educate Starterアカウントは[通常のAWSアカウントとは異なる](https://aws.amazon.com/jp/premiumsupport/knowledge-center/educate-starter-account/)ので登録時に注意しましょう．

パブリッククラウド最大手ですし，AWSのスキルを身につけておくのは悪い選択ではありません．

# 学生という身分を最大限に活用しよう
学生は大学などの教育機関が発行するメールアドレスを登録することで、さまざまなソフトウェアやサービスを無料あるいは割安に使うことができます。アプリ開発 & 研究 & 学習のための環境を作る上で、このチャンスを利用しない手はありません。

**19卒だって今月いっぱいであれば滑り込みで間に合う可能性があります！**

社会が若者に投資してくれているのです．
この機会をしっかり利用していきましょう！
LLVM:IR:条件分岐コードの作り方


# 概要
LLVMのIRで分岐を実現するためには`IRBuilder`クラスのメソッド`CreateCondBr()`を使います。
分岐先を判定するための評価値へのポインタ、評価値がTrue/Falseであったときのそれぞれのジャンプ先のBasicBlockへのポインタを指定する必要があります。

# 簡単な例

以下の複数のBasicBlockからなる関数`main()`の先頭のBasicBlockのお尻を`CreateCondBr()`を使用して作成したbr命令に入れ替えてみます。（入れ替えることに意味はありません！説明のための例です！）

- 操作対象のLLVM IR

```llvm
; Function Attrs: noinline nounwind optnone uwtable
define dso_local i32 @main() #0 {
  %1 = alloca i32, align 4
  %2 = alloca i32, align 4
  store i32 0, i32* %1, align 4
  store i32 0, i32* %2, align 4
  br label %3 ; <--ここを入れ替えてみる！

; <label>:3:                                      ; preds = %9, %0
  %4 = load i32, i32* %2, align 4
  %5 = icmp slt i32 %4, 5
  br i1 %5, label %6, label %12

; <label>:6:                                      ; preds = %3
  %7 = load volatile i32, i32* @giData, align 4
  %8 = add nsw i32 %7, 1
  store volatile i32 %8, i32* @giData, align 4
  br label %9

; <label>:9:                                      ; preds = %6
  %10 = load i32, i32* %2, align 4
  %11 = add nsw i32 %10, 1
  store i32 %11, i32* %2, align 4
  br label %3

; <label>:12:                                     ; preds = %3
  %13 = load i32, i32* %1, align 4
  ret i32 %13

```

- 入れ替えるためのcppコード

```cpp
// Fはmain()を指しています！
// 挿入対象をmain関数先頭のBasicBlockに指定
IRBuilder<> Builder(&F.getEntryBlock());
// True時のジャンプ先を2番目のBasicBlockに指定	
BasicBlock * tr = F.getBasicBlockList().getNextNode(F.getBasicBlockList().front());
// False時のジャンプ先を3番目のBasicBlockに指定
BasicBlock * fl = F.getBasicBlockList().getNextNode(*tr);
// 評価値を生成（ここでは簡単のためtrueを生成）
Value * cond = ConstantInt::get(IntegerType::get(context, 1), 1);
// 先頭のBasicBlockのお尻の命令を削除
F.getEntryBlock().getInstList().pop_back();
// ここが本題！！
// condがtrueのとき2番目のBasicBlock
// falseのときは3番目のBasicBlockにジャンプするbr命令を生成している。
// 生成した命令はmain関数先頭のBasicBlock内の命令リストのお尻に追加される。
Builder.CreateCondBr(cond, tr, fl);
```

- 入れ替え後のIR

```llvm
; Function Attrs: noinline nounwind optnone uwtable
define dso_local i32 @main() #0 {
  %1 = alloca i32, align 4
  %2 = alloca i32, align 4
  store i32 0, i32* %1, align 4
  store i32 0, i32* %2, align 4
  br i1 true, label %3, label %6 ; <-- 地味ですが入れ替わっています！！

; <label>:3:                                      ; preds = %9, %0
  %4 = load i32, i32* %2, align 4
  %5 = icmp slt i32 %4, 5
  br i1 %5, label %6, label %12

; <label>:6:                                      ; preds = %3, %0
  %7 = load volatile i32, i32* @giData, align 4
  %8 = add nsw i32 %7, 1
  store volatile i32 %8, i32* @giData, align 4
  br label %9

; <label>:9:                                      ; preds = %6
  %10 = load i32, i32* %2, align 4
  %11 = add nsw i32 %10, 1
  store i32 %11, i32* %2, align 4
  br label %3

; <label>:12:                                     ; preds = %3
  %13 = load i32, i32* %1, align 4
  ret i32 %13
```

# まとめ
`CreateCondBr()`は、例で示したような既存のIRを書き換えるときに使用するケースは少ないと思いますが、今回は説明を~~サボるために~~簡単にするために使いました。

自作フロントエンドの作成に役立てば幸いです。

# 参考
- https://llvm.org/doxygen/classllvm_1_1IRBuilder.html
- https://llvm.org/docs/tutorial/LangImpl05.html

Happy llvm!
Muraak.
【Gang of Four】Adapter

#Adapter
**[目次](https://qiita.com/Tonkachi0620/items/03986742efbb7e3a9bbe)**

##目的
あるクラスのインタフェースをクライアントが求める他のインタフェースへ変換する。Adapterパターンはインタフェースに互換性のないクラス同士を組み合わせることができるようにする。

##構成要素
・Target 組み合わせたあとのクラスのインターフェースを定義する。
・Client 利用者クラス
・Adaptee 組み合わせたいクラス
・Adapter Adapteeクラスを組み合わせて作成したクラス

##実装
目的を読んで「そんなことできるがやろか」と思っていたらあるクラスに多重継承させて色々なクラスをまとめるような感じでした。GoF本のサンプルコードは基本的にC++で記述されているため、kotlin（もといjava）では実現できないようです。構造に関するパターンの一発目なのに。

色々調べてみるとjavaでadapterパターンを実現している（しようとしている？）ページが幾つかありました。
```is-a関係```または```has-a関係```の二つで実現することができる。とどのページでも書かれていましたがそれは本当にadapterパターンなのか…？と思います。

例えば```TextViewクラス```と```Rectクラス```と```ColorBackgroundクラス```というのが標準ツールキットに含まれているけれど、今から作るシステムには角を丸くできて背景色を変更できるテキストビューが必要なんだ!!!というようなときに本パターンを用いるもんだと私は認識しています。

もしjavaで実現できるならば、下記のようなクラスができます。
※kotlinだとextendsとimplementsの見分けがつきにくいのでjavaでコーディングします。

```ColorRectTextView.java

public class ColorRectTextView extends TextView, Rect, ColorBackground {
    // 角丸にしたり、背景色変更したりするメソッド
}
```

がしかし、javaは多重継承を許しません。これを```is-a関係```や```has-a関係```で実現するとなると

```IsAColorRectTextView.java
public class IsAColorRectTextView extends TextView implements RectInterface, ColorBackgroundInterface {
    // RectInterfaceとColorBackgroundInterfaceで定義されたメソッドを実装する
}
```

のような形や

```HasAColorRectTextView.java
public class HasAColorRectTextView extends TextView {
    private Rect rect;
    private ColorBackground colorBackGround;

    public HasAColorRectTextView(Rect rect, ColorBackground colorBackGround) {
        this.rect = rect;
        this.colorBackGround = colorBackGround;
    }

    public void rectMethod() {
        rect.rectMethod()
    }

    public void colorBackGroundMethod() {
        colorBackGround.colorBackGroundMethod()
    }
}
```

のような形になり単なる継承と委譲のような気がします。
最近のColaboratory

いくつか古い項目も在るが過去のColaboratoryから更新されて気づいた部分についてまとめてみる。

- ChainerとPytorchがデフォルトインストールされるようになっていてpipしなくていい
- OpenAIGymもデフォルトインストールされるようになった
- 右上に現在のランタイムのRAMとディスクの使用量が表示されるようになった
- Googleドライブのマウント2行になった

```python:google_drive_mount.py
from google.colab import drive
drive.mount('/content/drive')
```

- Tabキー押さなくても入力補完される
【Gang of Four】Singleton

#Singleton
**[目次](https://qiita.com/Tonkachi0620/items/03986742efbb7e3a9bbe)**
生成に関するパターンの最後はシングルトンです。これは誰にとっても馴染みのあるパターンかと思います。自分も一番最初に知ったデザインパターンはシングルトンだったような気がする。

DB接続を提供するクラスやアセットを取得するようなクラスは大体このパターンで実装されていますね。プログラム中で当該クラスのインスタンスの唯一性を保証します。

##目的
あるクラスに対してインスタンスが1つしか存在しないことを保証し、それにアクセスするためのグローバルな方法を提供する。

##構成要素
・Singleton インスタンスが1つしか生成されないクラス

##実装
本パターンはkotlinでコーディングすると下記のように鬼シンプルな形になってしまいよくわからないため、javaでコーディングします。

```SingletonObject.kt
package singleton

object SingletonObject {
    var str = ""

    fun print() {
        println("出力結果：$str")
    }
}
```

複数の画面からシングルトンオブジェクトを介して画像や音楽ファイルを作成します。

###Singleton インスタンスが1つしか生成されないクラス
シングルトンオブジェクト

```JavaSingletonObject.java
package singleton;

public class JavaSingletonObject {
    /**
     * staticで定義し自クラスのインスタンスを唯一とする
     */
    public static JavaSingletonObject instance = new JavaSingletonObject();
    private String address = "/assets/temp";
    enum Assets {
        IMAGE1("image_1"),
        IMAGE2("image_2"),
        AUDIO1("audio_1"),
        AUDIO2("audio_2");

        private final String value;

        Assets(final String value) {
            this.value = value;
        }
    }

    /**
     * コンストラクタをprivateで定義し、新たなインスタンスを生成できないようにする。
     */
    private JavaSingletonObject(){
        System.out.println("接続：" + address);
    }

    public String getAssets(Assets target) {
        System.out.println("シングルトンオブジェクトで資材取得：" + target.value);
        return target.value;
    }
}

```

画面1クラス

```DisplayOne.kt
package singleton

class DisplayOne {
    fun draw() {
        println("User1で${JavaSingletonObject.instance.getAssets(JavaSingletonObject.Assets.IMAGE1)}を描画!!")
    }
}
```

画面2クラス

```DisplayTwo.kt
package singleton

class DisplayTwo {
    fun start() {
        println("User2で${JavaSingletonObject.instance.getAssets(JavaSingletonObject.Assets.AUDIO1)}を再生!!")
    }
}
```

###使用者
画面管理クラス

```Manager.kt
package singleton

class Manager {
    init {
        DisplayOne().draw()
        DisplayTwo().start()
    }
}
```

以上でシングルトンパターンの実装が完了しました。```JavaSingletonObject```クラスのコンストラクタでassetsへの接続を確立しているため、本処理は1回のみ実行されることになっています。

またコンストラクタをprivateで定義しているため当該クラスのインスタンスを新たに生成することができなくなり唯一性が保証されます。

###出力結果

```
[output]
接続：/assets/temp
シングルトンオブジェクトで資材取得：image_1
User1でimage_1を描画!!
シングルトンオブジェクトで資材取得：audio_1
User2でaudio_1を再生!!
```
プログラミング学習記録30〜よりSNSっぽく〜

##今日やったこと
- Progate rails1~3スライド復習
- Progate rails4,5リセット復習＆スライド復習
- Progate rails6,7

レッスン6は今までのレッスンの総復習という感じでした。

なので、レッスン６は復習なしでいきたいと思います。

一連の動作を繰り返しやってみて、ユーザの表示・登録・編集機能は投稿機能とほぼ同じ作り方で作れる、ということを実感できました。

レッスン７でようやくユーザー情報に画像を登録できる機能を追加し、よりSNSっぽくなってきました。

レッスンの指示通りに動かしているだけとは言え、ちょっとずつ形のあるものが出来上がっていくのは楽しいですね。

このProgateのrailsをやり切るだけでも、簡単なSNSアプリは作れるようになるので、これを月額980円で学べるのは相当お得だと思います。

ということで、明日からも引き続きプログラミング学習頑張ります。

おわり
【Gang of Four】Prototype

#Prototype
**[目次](https://qiita.com/Tonkachi0620/items/03986742efbb7e3a9bbe)**
部品をプールし、クローンすることでオブジェクトを生成するパターンです。

##目的
生成すべきオブジェクトの種類を原型となるインスタンスを使って明確にし、それをコピーすることで新たなオブジェクトの生成を行う。

##構成要素
・Prototype 複製を行う抽象クラス
・ConcretePrototype 複製を行う具象クラス
・Client 複製を依頼するクラス

##実装
車を量産するために必要な試作品工場を実装します。

まずは試作品工場が作る部品から実装します。

**エンジンクラス**

```Engine.kt
package prototype

class Engine(displacement: Int): Cloneable {
    var displacement = displacement

    fun show() {
        print("【エンジン】"+ displacement +"cc ")
    }

    public override fun clone(): Any {
        return super.clone()
    }
}
```

**タイヤクラス**

```Tire.kt
package prototype

class Tire(num: Int): Cloneable {
    var num = num

    fun show() {
        print("【タイヤ】" + num + "個 ")
    }

    public override fun clone(): Any {
        return super.clone()
    }
}
```

以上が部品です。続いて製品の車を実装します。

**車クラス**

```Car.kt
package prototype

class Car(engine: Engine, tire: Tire) {
    val engine = engine
    val tire = tire

    fun show() {
        print("【製品】車 ")
        engine.show()
        tire.show()
        print("\n")
    }
}
```

今まで実装したEngineとTireを次々量産できる工場を実装します。

###Prototype 複製を行う抽象クラス
試作品インターフェース

```ProtoType.kt
package prototype

/**
 * 試作品
 * Prototype
 */
interface ProtoType {
    fun createEngine(): Engine
    fun createTire(): Tire
}
```

###ConcretePrototype 複製を行う具象クラス
試作品工場クラス

```ProtoTypeFactory.kt
package prototype

class ProtoTypeFactory: ProtoType {
    var engine = Engine(0)
    var tire = Tire(4)

    override fun createEngine(): Engine {
        return engine.clone() as Engine
    }

    override fun createTire(): Tire {
        return tire.clone() as Tire
    }
}
```

最後に試作品工場から部品を受け取り製品を量産する工場を実装します。
###Client 複製を依頼するクラス
車製造工場クラス

```Factory.kt
package prototype

class Factory {
    var carList:MutableList<Car> = mutableListOf()
    var prototypeFactory = ProtoTypeFactory()
    init {

        // 排気量を1000ccに設定
        prototypeFactory.engine.displacement = 1000
        // 排気量1000ccの車を3台量産する
        massProduction(3)

        // 排気量を2000ccに設定
        prototypeFactory.engine.displacement = 2000
        // 排気量2000ccの車を2台量産する
        massProduction(2)

        // 排気量を12000ccに設定
        prototypeFactory.engine.displacement = 12000
        // タイヤを8本に設定
        prototypeFactory.tire.num = 8
        // 排気量12000cc タイヤ8本の車を5台量産する バス？
        massProduction(5)

        for (car in carList) {
            car.show()
        }
    }

    private fun massProduction(num: Int) {
        for (i in 0..num) {
            carList.add(Car(prototypeFactory.createEngine(), prototypeFactory.createTire()))
        }
    }
}
```

以上で試作品を次々量産できる工場が実装できました。[Abstract Factory](#abstract-factory)パターンとは異なり、いろいろな車種を量産したくなっても```ProtoTypeFactory```クラスが持つ部品のメンバを変更すれば新たな工場を実装せずに済みます。

###出力結果

```
[output]
【製品】車 【エンジン】1000cc 【タイヤ】4個 
【製品】車 【エンジン】1000cc 【タイヤ】4個 
【製品】車 【エンジン】1000cc 【タイヤ】4個 
【製品】車 【エンジン】1000cc 【タイヤ】4個 
【製品】車 【エンジン】2000cc 【タイヤ】4個 
【製品】車 【エンジン】2000cc 【タイヤ】4個 
【製品】車 【エンジン】2000cc 【タイヤ】4個 
【製品】車 【エンジン】12000cc 【タイヤ】8個 
【製品】車 【エンジン】12000cc 【タイヤ】8個 
【製品】車 【エンジン】12000cc 【タイヤ】8個 
【製品】車 【エンジン】12000cc 【タイヤ】8個 
【製品】車 【エンジン】12000cc 【タイヤ】8個 
【製品】車 【エンジン】12000cc 【タイヤ】8個 
```
【Gang of Four】Factory Method

#Factory Method
**[目次](https://qiita.com/Tonkachi0620/items/03986742efbb7e3a9bbe)**
[Abstract Factory](https://qiita.com/Tonkachi0620/items/16526bace12161619b81)パターンの具象工場クラスの部分のみが本パターンに該当すると理解しています。

##目的
オブジェクトを生成するときのインタフェースだけを規定して、実際にどのクラスをインスタンス化するかはサブクラスが決めるようにする。Factory Methodパターンは、インスタンス化をサブクラスに任せる。

##構成要素
・Product 生成される部品の抽象クラス
・ConcreteProduct 生成される部品
・Creator 部品製造工場の抽象クラス
・ConcreteCreator 部品製造工場

##実装
プロスポーツ選手に主催者が宣誓してもらうようなプログラムを実装します。宣誓を行う代表選手はそれぞれのスポーツ連盟により派遣されます。

###Product 生成される部品の抽象クラス
プロスポーツ選手抽象クラス

```ProfessionalAthlete.kt
package factorymethod

abstract class ProfessionalAthlete(type: Type) {
    enum class Type(val value: String) {
        Soccer("サッカー"),
        BaseBall("野球")
    }

    val myType = type

    abstract fun athletesOath()
}
```

###ConcreteProduct 生成される部品
プロサッカー選手具象クラス

```ProfessionalSoccerAthlete.kt
package factorymethod

class ProfessionalSoccerAthlete(name: String): ProfessionalAthlete(Type.Soccer) {

    private val name = name

    override fun athletesOath() {
        println("宣誓！私は" + name + "です。プロ【" + myType.value + "】選手としてサッカーボールを使い正々堂々プレーします！")
    }
}
```

プロ野球選手具象クラス

```ProfessionalBaseBallAthlete.kt
package factorymethod

class ProfessionalBaseBallAthlete(name: String): ProfessionalAthlete(Type.BaseBall) {

    private val name = name

    override fun athletesOath() {
        println("宣誓！私は" + name + "です。プロ【" + myType.value + "】選手としてバットと野球ボールを使い正々堂々プレーします！")
    }
}
```

以上で選手（product）が実装できました。次は選手（product）を派遣（create）するスポーツ連盟（factory）を実装していきます。


###Creator 部品製造工場の抽象クラス
スポーツ連盟抽象クラス

```SportsFederation.kt
package factorymethod

abstract class SportsFederation {
    fun getAthlete(): ProfessionalAthlete {
        return dispatchRepresentativeAthlete()
    }

    protected abstract fun dispatchRepresentativeAthlete(): ProfessionalAthlete
}
```

###ConcreteCreator 部品製造工場
サッカー連盟具象クラス

```SoccerFederation.kt
package factorymethod

class SoccerFederation: SportsFederation() {
    override fun dispatchRepresentativeAthlete(): ProfessionalAthlete {
        return ProfessionalSoccerAthlete("サカ田 代表太郎")
    }
}
```

野球連盟具象クラス

```BaseBallFederation.kt
package factorymethod

class BaseBallFederation: SportsFederation() {
    override fun dispatchRepresentativeAthlete(): ProfessionalAthlete {
        return ProfessionalBaseBallAthlete("野球本 キャプテン男")
    }
}
```

最後に各スポーツ連盟（factory）に代表選手（product）を要求し、宣誓させる主催者を実装します。

###使用者
主催者クラス

```Organizer.kt
package factorymethod

class Organizer {
    init {
        var athleteList: MutableList<ProfessionalAthlete> = mutableListOf()
        // それぞれのスポーツ連盟から代表選手を派遣してもらう
        // サッカー連盟から代表選手取得
        athleteList.add(SoccerFederation().getAthlete())
        // 野球連盟から代表選手取得
        athleteList.add(BaseBallFederation().getAthlete())

        // 宣誓してもらう
        for (athlete in athleteList) {
            athlete.athletesOath()
        }
    }
}
```

以上で生成しなければならないオブジェクトのクラスを事前に知ることができない場合に用いることができるパターンができました。ような気がします。

###出力結果

```
[output]
宣誓！私はサカ田 代表太郎です。プロ【サッカー】選手としてサッカーボールを使い正々堂々プレーします！
宣誓！私は野球本 キャプテン男です。プロ【野球】選手としてバットと野球ボールを使い正々堂々プレーします！
```
jQueryを使わずにHTML+JavaSccipt+CSSでドラックアンドドロップを遊んでみる

jQueryを使わずにHTML + Javascript + CSS でドラックアンドドロップ(dnd)を使った、
画面上でのアイテム編集、追加のサンプルを作ってみました。

アイテム削除機能や表示済みアイテム名編集機能はエラーが発生する箇所があります。

[Githubのここに置いています。](https://github.com/pekokana/html5dnd)
AWS Lambdaのスケジュール実行をローカルでテストしてみる

# はじめに
AWSが公式で提供しているサーバーレスアプリケーションを構築するためのフレームワークである、[AWS SAM](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/serverless_app.html)を使うことにより、コードを書いてテストを行い、デプロイするまでを全てローカルで行うことができるようになります。
今回は、AWS SAMを用いてAWS Lambda Functionのスケジュール実行をローカル環境でテストする手順をメモとして残します。

# 環境
OS: macOS Mojave10.14
言語: Node.js 8.10
Docker: 18.09.2
SAM CLI: 0.11.0

# 環境構築
### Dockerのインストール
AWS SAMはDocker上で動くのでDockerが必要。
以下の公式サイトからインストール。
https://docs.docker.com/docker-for-mac/install/

### AWS SAM CLIのインストール  
Homebrewでインストール。

```
$ brew tap aws/tap
$ brew install aws-sam-cli
```

# プロジェクト作成
適当なディレクトリで、以下のコマンドを入力。
※samコマンドについては以下の記事が参考に。
https://qiita.com/gnk263/items/7f8796c26b9b61d33d96

```
$ sam init -r nodejs8.10 -n sample-app
```

すると以下のようなプロジェクトが作成される。

```
sample-app/
├── README.md
├── hello-world
│   ├── app.js
│   ├── package.json
│   └── tests
│       └── unit
│           └── test-handler.js
└── template.yaml
```

# template.yamlの修正
Resources配下のHelloWorldFunctionを以下のように修正。スケジュールの実行間隔は任意に修正。
※Lambdaのスケジュール実行に関しては以下を参照。
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/tutorial-scheduled-events-schedule-expressions.html

```
HelloWorldFunction:
    Type: AWS::Serverless::Function
    Properties:
        CodeUri: hello-world/
        Handler: app.lambdaHandler
        Runtime: nodejs8.10
        Events:
            Timer:
                Type: Schedule
                Properties:
                    Schedule: rate(1 minute)
```

# ローカル実行環境構築用の設定ファイルを作成
sample-app配下で以下のコマンドを入力。

```
$ sam local generate-event cloudwatch scheduled-event > event_file.json
```

# テスト
sample-app配下で以下のコマンドを入力。

```
$ sam local invoke "HelloWorldFunction" -e event_file.json
```

以下のような反応が返って来れば成功。

```
START RequestId: e832090d-203c-19f4-c6ae-580e00b3905f Version: $LATEST
END RequestId: e832090d-203c-19f4-c6ae-580e00b3905f
REPORT RequestId: e832090d-203c-19f4-c6ae-580e00b3905f	Duration: 13.40 ms	Billed Duration: 100 ms	Memory Size: 128 MB	Max Memory Used: 30 MB	

{"statusCode":200,"body":"{\"message\":\"hello world\"}"}
```

# 終わりに
色々試したところ、template.yamlのScheduleの所にタイポがあっても成功レスポンスが返ってくるし、実際にCloudWatchに正しいスケジュール間隔で登録されるかどうかはデプロイしてみるまでは分からない模様。うーん。。。
指摘等ありましたらコメントお願いします。
Pwn入門

# はじめに
学内で勉強会を開催した際に使用した資料です．CTFのPwnをはじめるために必要だと思われる部分を紹介しています．

# 資料
## 資料１
[Pwn勉強会](https://speakerdeck.com/m412u/pwnmian-qiang-hui)

1. Pwnとは？
2. Pwnの概要
3. 機械語とアセンブリ言語
4. レジスタ
5. アセンブリ命令列
6. スタックの動作
7. 関数の呼び出し方法

## 資料２
[学内Pwn勉強会](https://speakerdeck.com/m412u/xue-nei-pwnmian-qiang-hui)

目次
1. プログラム実行
2. スタックの役割と動作
3. 関数呼び出し
4. スタックベースバッファオーバフロー
5. バッファオーバーフローの利用
6. ROP

# その他
資料に間違いや問題等ありましたら，ご連絡いただければ幸いです．
Windows10にVirtualBox・Vagrantをセットアップ

# Virtual Box ダウンロード
- https://www.virtualbox.org/ にアクセス
![image.png](https://qiita-image-store.s3.amazonaws.com/0/269592/ca8726b7-e747-b211-6cf9-939c25e365b6.png)

- Windows Hostsを選択し、「実行」をクリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/269592/c734272d-116f-cb09-05a7-9a2a0bb7dff2.png)

- 「Next」をクリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/269592/553bad97-aa10-9d08-db08-c831afe4319f.png)

- インストール場所を選択して「Next」をクリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/269592/3873ea5d-7088-afdd-3b40-ebc29aeff8da.png)

- オプションを選択して「Next」をクリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/269592/cc5d5ada-f9ba-b503-98db-f0c5c6f82615.png)

- ネットワークの警告が表示されるが、問題ねければ「Yes」をクリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/269592/c4f3a660-cbeb-2d7f-2bb3-51105c44a0c0.png)

- 「Install」を押下するとインストールが開始される
![image.png](https://qiita-image-store.s3.amazonaws.com/0/269592/8bad5b32-9b5d-b754-18e8-64cf794d075a.png)

- 「Finish」を押下して完了
![image.png](https://qiita-image-store.s3.amazonaws.com/0/269592/7174350e-73c8-bbc9-d2e5-9c8bb787f1fd.png)

# Vagrant ダウンロード
- https://www.vagrantup.com/downloads.html にアクセス
![image.png](https://qiita-image-store.s3.amazonaws.com/0/269592/644e5658-c159-403f-73cd-9e5bd4ff4bce.png)

- Windowsの64bitを選択し、「実行」をクリック
- 「Next」をクリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/269592/53c1b133-d96d-1648-2710-40bc396c305f.png)

- 同意して「Next」をクリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/269592/c3c2ffb6-74fb-283a-6cb3-48e8ff28348a.png)

- パスを設定して「Next」をクリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/269592/8875e59d-d197-9bd0-8676-447d9efb8843.png)

- 「Install」を押下してインストールが始まる
![image.png](https://qiita-image-store.s3.amazonaws.com/0/269592/f05bbb4c-d545-d5f9-a2b8-953c30e5e776.png)

- 「FInish」を押下して終了
![image.png](https://qiita-image-store.s3.amazonaws.com/0/269592/3280715a-9c62-317e-3392-b2f2d905dd1c.png)

- 再起動して設定を反映させる
![image.png](https://qiita-image-store.s3.amazonaws.com/0/269592/8953b22a-3460-7225-eb7a-658ecc6e68e1.png)
Firebase hosting で急に文字化けが発生するようになった話

index.htmlには、

```index.html
<head>
  <meta charset="UTF-8" />
```

と、記載し、index.htmlの文字エンコーディングもutf-8となっているのに文字化けが発生。



かなり焦りましたが、firebase.jsonを変更したことを思い出しました。

CSVのダウンロードを作成するさいに、CSVはSHIFT-JISにするために、
Hostingの設定も変えてみた（実際はここで指定する必要なし）ことが問題だったようです。


```firebase.json
    "headers": [
      {
        "source": "**",
        "headers": [
          {
            "key" : "Content-Type",
            "value" : "text/html; charset=shift-JIS"   // <= この部分が悪さをしている。
          }
        ]
      }
    ]
```



以下のように変更することで解決。

```firebase.json
    "headers": [
      {
        "source": "**",
        "headers": [
          {
            "key" : "Content-Type",
            "value" : "text/html; charset=utf-8"   // <= 変更
          }
        ]
      }
    ]
```


2時間位ハマりました・・・。



## 2019/03/19 追記

どうも、この設定だとCSSが反映されないようでしたので、以下を削除しました。

```firebase.json

            "key" : "Content-Type",
            "value" : "text/html; charset=utf-8"   // <= 

```
python、djangoのurls.pyで設定するnameってなんやねん？？

python、djangoのurls.pyで設定するnameってなんやねん？？
ということをdjangoをやりはじめた当初はよく分かっていませんでした。
いまでも怪しいのでまとめてみましょう。


djangoをにはurls.py（djangoはurls.pyが2つ存在するのですが、アプリケーションの中にあるurls.pyのことです）にnameと書くことがあります。

```
from django.urls import path

from . import views

app_name = 'board'
urlpatterns = [
    path('', views.ListView.as_view(), name='board'),
    path('good/<int:pk>', views.good, name='good'),
]
```

こんな風になっています。ひとつひとつ解体していくと・・・。

```
path('good/<int:pk>', 
```

これはURLの設定。

```
views.good
```

これはそのURLに使う関数の設定。
この設定が無いとviews.pyで関数を作ってもそのページで使用できません。

```
name='good'
```

なんだこいつ？？
<br>
<br>
このname='good'。html部分によく使われます。
以下はフォームを送信するとurls.pyで設定したpath('good/<int:pk>', に飛びます。

```
  <form action="{% url 'board:good' post.pk %}" method="post">
        {% csrf_token %}
        <input type="submit" name="good" value="いいね"　id="test">（{{ post.good }} いいね）<p  style="color:red"><font size="1"><strong>押すと1ページ目まで戻ってしまいます！（いつか直す！)</strong></font></p>
    </form>

```
<br>

飛ぶのはいいのですがメンテナンス部分には問題があって、これって例えば

```
<form action="/board/good/"　method="post">
```
と書いてしまうと設定しているurlが変更になると該当箇所は全部書き換えですよね？
なのでurlにname='good'のように名前を設定しておいて

```
path('good/<int:pk>', views.good, name='good'),
```

formのurlも名前であるgoodに書き換えます。


```
<form action="{% url 'board:good' post.pk %}" method="post">
```

'board:good'と書き換えればurlが変更してもnameは変更になっていないのでform部分は変更する必要が無いんですね。
多分これは逆引きという方法だと思います。普通にURL書くのは正引き？間違ってたら教えてください。
他にもメリットがあるような気がしているのですが今のところよく分かっていませんｗ
<br>
<br>
ちなみに

```
'board:good'
```

のboardはurls.pyの

```
app_name = 'board'
```
です。
boardアプリケーションのgoodと名前のついたurlを指定しているんですね。<br>
djangoプロジェクト内には複数のアプリケーションを作ることが可能なので、app_nameを重複させないように気を付けてくださいね。
重複させたらどうなるのか試したことはないけれど。
Let's think... [UUID4-自作コマンド]

#UUID4という自作コマンドを作ってみよう

みなさんは、ユニークなIDをつけるとき、何を使用してますか？

システムを開発してるとき、衝突を防ぐためにユニークIDを振り、衝突回避してたりするかと思いますが、現状多くはUUID4バージョンがよく利用されているのではないかと思われます。

UUID4の仕様については、省き早速、コードを展開します。

```sh:/usr/local/bin/uuid4

#!/bin/sh
python -c "from uuid import uuid4;print(''.join(str(uuid4()).split('-')))"

```

とやる事で、ターミナルで、`uuid4`と打てば、自動的に"-"抜きのユニークIDが生成されます。
これを利用して、パスワードにしたり、ユニークIDとして割り振ったり、色々できます。
他にも個人的には、色々な便利コードを自分で作成し、CentOSでは、spでスクリーンショットを撮ったり、色々活躍してもらっています。

今回の肝は、`uuid4`というファイルを`pathが通っている`箇所に配置した事で、`uuid4`とコマンドを打つだけで生成されることです。
例えば、`u4`でもOK!
...もちろん権限なども付与しなきゃいけないです。

ぜひ、自作コードを作って、便利な環境を整えましょう。


UUID4を知らない人は、課題とします。
以上。
ubuntu 16.04 LTSをUSBからBOOTするメモ

###もちもの
- 自前のパソコン(Surface Laptop)
- USBメモリ

###USBからBootするとは
USBメモリにUbuntuをインストールして起動する方法です。
ノートパソコンでインストールしたOSをデスクトップで起動して使用する，という感じ。
[こちら](https://blog.mktia.com/how-to-make-ubuntu-live-usb/)を参考に行いました。

#手順
① Ubuntu16.04 LTSのダウンロード
② Universal USB Installerのインストール
③ USBメモリをフォーマット
④ Universal USB Installerを使ってUbuntuをUSBにいれる
⑤ デスクトップにUSBをさして起動


##①Ubuntu 16.04 LTSのダウンロード
まず，[Ubuntu 16.04 LTS](https://www.ubuntulinux.jp/News/ubuntu1604-ja-remix)のダウンロード。
違いが分からなかったので，北陸先端大のISOイメージをダウンロードしてみた。場所は適当。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315412/c73606af-0301-3292-6bc3-82bc1a412597.png)

##②Universal USB Installerのインストール
次に[Universal USB Installer](https://universal-usb-installer.jp.uptodown.com/windows)をインストール。
最新バージョンのボタンをぽちる。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315412/0ed3ee77-8e58-011f-cc3d-19a2017ecaaf.png)


##③USBメモリをフォーマット
使用済みだといけないみたいなので，USBメモリを右クリックしてフォーマット(初期化的な？)する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315412/a27f24d2-11d0-31a2-31b5-7f5d24c9cbed.png)

このときファイルシステムを**既定**にしといて，そのシステムを覚えておく。ここではexFAT:point_up:
それで開始。終わったらUSBメモリの準備はでけた。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315412/65e6784c-9d76-13c2-5f79-a1434626601e.png)

##④Universal USB Installerを使ってUbuntuをUSBにいれる
Universal USB Installerを起動すると「この不明な発行元からのアプリがデバイスに変更を加えることを許可しますか？」と聞かれるが，『はい』と返答。

- Step 1
    - Ubuntuを選択
- Step 2
    - Browseを押して①でダウンロードしたUbuntuのisoファイルを選択
- Step 3
    - 先ほどフォーマットしたUSBを選択。覚えておいたシステムはexFATでした右側でFATをチェック。
    - このとき，**ぜｔｔｔｔｔｔったいにShow all Driverにチェックをしちゃダメ**！！！！！！:rage:
- Step 4
    - 無視
- Createを押す(5分くらいでできる)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/315412/07f9af07-fc53-5ff6-8bbb-82dc1481f888.png)

これでUSBのなかにUbuntuが入りました。起動してみる。

##⑤デスクトップにUSBをさして起動
USBをパソコンにさして，電源を入れた`F2`キーを連打。
どこのキーを連打するかはメーカーによって異なる([参考](https://blog.mktia.com/how-to-make-ubuntu-live-usb/)は`F12`と書いてあった)。

めっちゃカッこイイ画面が出てくる。
ここの詳細忘れたので[参考サイト](https://blog.mktia.com/how-to-make-ubuntu-live-usb/)から引用。
>パソコンを何でブートするか聞かれるUSB メモリで起動、Ubuntu の GNU GRUB で Try Ubuntu without installingを選択します。

で，ログインするとデスクトップが表示される。

左上にあるアプリケーションをクリックして，
言語やら，時間やら，パスワーどやらなんやらして，インストールの種類の選択。
`ディスクを消去してインストール`を選択したと思うが，もろもろが終わると再起動してといわれる。

再起動しておわり。
ここからいろいろ設定をしたので，またまとめる。