OmniAICreator/Qiita-1.07M huggingface dataset:
Angular6でナビゲーションを利用したいと考えている開発者向けのサンプル

# _ResponsiveNavigation_ Angular6でナビゲーションを利用したいと考えている開発者向けのサンプル
[![MIT License](http://img.shields.io/badge/license-MIT-blue.svg?style=flat)](LICENSE)


_ResponsiveNavigation_ は、Angular6においてAngular Materialによりナビゲーションを実現しようと考えている開発者向けの初期セットです。

_フルソースコード_,
<https://github.com/Ohtsu/ResponsiveNavigation>

_ビデオ解説 (日本語)_,
<https://www.youtube.com/watch?v=X59LfgaGnrM>

_ビデオ解説 (英語)_,
<https://www.youtube.com/watch?v=F1GUUFpYc-g&t=5s>


## 概要 
   - _ResponsiveNavigation_ はリスポンシブなナビゲーションであり、Angular6におけるAngular Materialに依存しています。

   - _ResponsiveNavigation_ は、mat-sidenav,mat-toolbar,mat-nav-listなどを利用しています。

   - _ResponsiveNavigation_ はMaterialアイコンを利用しています。
  

## 稼働環境

   - node.js
   - Typescript2
   - Angular6


## インストール

以下のように、Gitからクローンを作成します。

```bash
$ git clone https://github.com/Ohtsu/ResponsiveNavigation.git 
```
次に生成されたResponsiveNavigationディレクトリに入り、以下のようにインストールを行います。

```bash
$ npm install 
```
## 起動

コマンドラインで以下のようにローカルサーバを起動すると、ブラウザにリスポンシブなナビゲーションが表示されます。


```bash
$ ng serve -o
```

  - ***初期画面*** 

  <img src="https://raw.githubusercontent.com/Ohtsu/images/master/ng6-material/navigation-initial01.png" width= "640" >


## バージョン

   - ResponsiveNavigation       : 0.0
   - Angular6                   : 6.0.0
   - TypeScript                 : 2.7.2
   - @angular/material          : 6.2.1



## 参考

- "Schematics", 
<https://material.angular.io/guide/schematics>

- "Angular 5, Angular 6 Custom Library: Step-by-step guide", 
<https://www.udemy.com/angular5-custom-library-the-definitive-step-by-step-guide/>


- "Angular 5, Angular 6用 カスタムライブラリの作成: 完全ステップ・バイ・ステップ・ガイド", 
<https://www.udemy.com/angular5-l/>



## 変更履歴

 - 2018.7.11 version 0.0 uploaded 

## 著作権

copyright 2018 by Shuichi Ohtsu (DigiPub Japan)


## License

MIT © [Shuichi Ohtsu](ohtsu@digipub-net.com)
Angularの環境構築

# Angularの環境構築

- 前提
- Angular Cliのインストール

## 前提

npmのインストールまたは、yarnをインストールしているのを前提とします。
npmでmacの場合は[node brew](https://github.com/hokaccha/nodebrew)、windowsの時は[nodist](https://github.com/marcelklehr/nodist)
yarnについては、[yarn](https://yarnpkg.com/lang/ja/docs/install/#mac-stable)は参考にインストールがおすすめです。

## AngularCli

[Angular Cli](https://cli.angular.io/)はAngularのコマンドラインツール向けのインターフェースを提供しています。

### Angular cliをインストール

```terminal
$ npm install -g @angular/cli # インストールが完了するとngコマンドがつかえます。
```

### プロジェクトを作成

```terminal
$ ng new sample-app
$ cd sample-app
$ npm install
$ ng serve # ランサーバーがたち上がります。
$ ng serve --open #ランサーバーがたち上がり、ブラウザを開きます。
```

[localhost:4200](localhost:4200)にアクセスして下記の画像ができれば、完了。
![Angular.png](https://qiita-image-store.s3.amazonaws.com/0/144543/35778a75-422f-6e84-f813-3e082f59b34c.png)
PEP 562 -- Module __getattr__ and __dir__を試してみた

Python3.7の新機能、\_\_getattr\_\_と\_\_dir\_\_関数を試してみた。

[PEP 562 -- Module \_\_getattr\_\_ and \_\_dir\_\_ | Python.org](https://www.python.org/dev/peps/pep-0562/)

典型的な例としてRationaleに2つサンプルが記載されている。

- 廃止予定の警告の管理
- サブモジュールの遅延インポート

2つのうち、サブモジュールの遅延インポートについてサンプルを考えてみた。

データを読み込む際に、読み込み先がファイルとデータベースで切り替えられる仕組みについて実装した。
main.pyのloader_settingで、LoaderDefのどちらを代入するかで、読み込み先が変わる。
→ main.pyに書いてしまっているけど、これを他の設定と一緒に設定ファイルでまとめて定義するといいと思う

``` Python3:getattr/__init__.py
import importlib


__all__ = ['file_loader', 'db_loader']


def __getattr__(name):
    if name in __all__:
        return importlib.import_module("." + name, __name__)
    raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
```
``` Python3:getattr/loader.py
from abc import ABCMeta, abstractmethod


print('loader module')


class Loader(metaclass=ABCMeta):

    print('Loader class')

    @abstractmethod
    def load(self):
        pass
```
``` Python3:getattr/file_loader.py
from getattr.loader import Loader


print('file_loader module')


class FileLoader(Loader):

    print('FileLoader class')

    def load(self):
        print('FileLoader.load')
```
``` Python3:getattr/db_loader.py
from getattr.loader import Loader


print('db_loader module')


class DBLoader(Loader):

    print('DBLoader class')

    def load(self):
        print('DBLoader.load')
```
``` Python:getattr/main.py
import enum
import getattr


class LoaderDef(enum.Enum):
    FILE_LOADER = 'getattr.file_loader.FileLoader'
    DB_LOADER = 'getattr.db_loader.DBLoader'


loader_setting = LoaderDef.FILE_LOADER
# loader_setting = LoaderDef.DB_LOADER

loader = eval(loader_setting.value)()

loader.load()
```
``` :実行結果
loader module
Loader class
file_loader module
FileLoader class
FileLoader.load
```
実行結果を見ると、db_loaderモジュールとDBLoaderクラスが呼ばれていないのがわかる。
なので、使わないオブジェクトの生成を防ぐことができている。

``` Python:getattr/main2.py
import enum
from getattr.file_loader import FileLoader
from getattr.db_loader import DBLoader


class LoaderDef(enum.Enum):
    FILE_LOADER = 'FileLoader'
    DB_LOADER = 'DBLoader'


loader_setting = LoaderDef.FILE_LOADER
# loader_setting = LoaderDef.DB_LOADER

loader = eval(loader_setting.value)()

loader.load()
```
``` :実行結果
loader module
Loader class
file_loader module
FileLoader class
db_loader module
DBLoader class
FileLoader.load
```
サブモジュールの遅延インポートを使わない場合は、db_loaderモジュールとDBLoaderクラスも呼ばれてしまう。

evalを使わずにもっとスマートに書く方法があるか考え中。
(main2.pyの場合、Enumのvalueは文字列じゃなくクラスでいいが、対比を示すために同様にevalを使っている)

**補足**
main.pyの最後に、

```
print(dir(getattr))
```

を追加して実行すると、

```
['__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__getattr__', '__loader__', '__name__', '__package__', '__path__', '__spec__', 'file_loader', 'importlib', 'loader']
```

となり、file_loaderだけがgetattrのアトリビュートとなっていることがわかる。

以下に続く。
[PEP 562 -- Module \_\_getattr\_\_ and \_\_dir\_\_を試してみた Part2 - Qiita](https://qiita.com/nakkun/items/d938e6c732af6e3bcd69)
Sequel Proで複合プライマリキーを設定した際のエラー「Multiple primary key defined」の対処法

MySQL(MariaDB)に対し、Sequel Proで複数のカラムをプライマリキーとして設定すると以下のエラーが発生する場合があります。

```terminal:err
Multiple primary key defined
```

## 対処法

### 「CREATE TABLE」で設定する場合

```sql:sql
CREATE TABLE TBL_TEST (
    item001 INTEGER NOT NULL,
    item002 INTEGER NOT NULL,
    PRIMARY KEY(item001, item002)
);
```

### 「ALTER TABLE」で設定する場合(主キーを追加する場合)

手順1：テーブルのインデックスを削除する。 ※テーブルのプライマリキーも削除されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/269537/8a947ca9-f722-a2ac-3996-7a13933a71bf.png)

手順2：以下のフォーマットで「ALTER TABLE」を実行する。

```sql:sql
ALTER TABLE TBL_TEST ADD CONSTRAINT PRIMARY KEY(item001, imte002);
```
ほぼコマンド一発でVULTRにKubernetesクラスターを作ったり壊したりする


# TL; DR

VULTR(VPS)にKubernetesクラスターをサクッと立ててサクッと壊すための [Ansible Playbook](https://github.com/rerorero/vultr-k8s-playbook/) を作成しました。

# 動機
### 検証用のKubernetes
Kubernetesは構築が面倒というイメージがあります。一度立ててしまえばそれまでですが、検証のために作ったり壊したりしたいということも結構あるんじゃないでしょうか。

非力なPCではローカルでクラスタを組むのも厳しく、またminikubeだとクラスターではないので検証用途に見合わないケースも多々あります。

なるべくお金をかけずにかつお手軽に立てられないかを考え、VPSを利用することにしました。

### [VULTR](https://www.vultr.com/) について
[VULTR](https://www.vultr.com/) はVPSを提供するサービスです。1CPU、1G Memが月$5という安さで、しかも1時間ごとの従量課金です。プランもいくつか選択できるので、潤沢にリソースが欲しいユースケースにも対応できます。

APIも豊富に提供されており、API経由でVMインスタンスを作ったり壊したりできます。さらにそのAPIを利用した [Ansibleの公式モジュール](https://docs.ansible.com/ansible/2.5/modules/vr_server_module.html) も用意されており、Ansibleからお手軽に利用することもできます。

今回はこの [VULTRのAnsibleモジュール](https://docs.ansible.com/ansible/2.5/modules/vr_server_module.html) と [kubespray](https://github.com/kubernetes-incubator/kubespray) を使って、Macから [VMインスタンスとKubernetesクラスターを構築するプレイブックを書きました](https://github.com/rerorero/vultr-k8s-playbook)。

# 事前準備
「ほぼ」コマンド一発と言いましたが事前準備が必要です 🙇

### 1. [プレイブック](https://github.com/rerorero/vultr-k8s-playbook) をgit clone
今回作成したプレイブックをダウンロードします。pythonやpipがあらかじめ必要です。

```
git clone https://github.com/rerorero/vultr-k8s-playbook
cd vultr-k8s-playbook
pip install -r requirements.txt
```

### 2. 鍵ペアを作成
VMにログインするためのSSH鍵ペアを作成します。後の肯定でVULTRに登録します。秘密鍵ファイルを `vultr.key` という名前で `vultr-k8s-playbook` のルートディレクトリに配置するようにしてください

```
ssh-keygen -f ./vultr.key
```

### 3.  VULTRアカウント作成
すでに VULTR アカウントを持っている方は飛ばしてください。
[VULTR](https://www.vultr.com/)ページからアカウントを作成します。決済手段もいい感じに設定してください。

### 4. VULTRにSSH鍵を登録
先ほど作った公開鍵を [VULTR](https://my.vultr.com/) に登録します。SSH KEYSを選択し、Add SSH Keyで、「my_notebook」の名前で登録します。

### 5. VULTR のAPIキーをローカル環境に設定
[VULTRのAPIの設定画面](https://my.vultr.com/settings/#settingsapi) からAPIを有効にし、APIキーを払い出します。APIキーは以下のようなファイルを作成し、 `~/.vultr.ini` に保存します。

```
[default]
key=<APIキー>
```

# プレイブックを実行
事前準備が終われば、あとは構築・削除はプレイブックを流すだけになります。一度準備すればあとはコマンド一発です。

### VM作成+Kubernetes構築
```
ansible-playbook site.yml
```

デフォルトのインベントリーは [このようなミニマルな構成になっています](https://github.com/rerorero/vultr-k8s-playbook/blob/master/inventories)
k8s-master01にログインして確認してみます。

```
ssh -i vultr.key root@<k8s-master01のMain IP>

root@k8s-master01:~# kubectl get componentstatus
NAME                 STATUS    MESSAGE              ERROR
scheduler            Healthy   ok
controller-manager   Healthy   ok
etcd-0               Healthy   {"health": "true"}
```

### 破壊
VMごと削除します。削除し忘れると課金され続けるので忘れないよう注意。

```
ansible-playbook destroy.yml
```
VULTRの仕様でvm作成した直後5分以内だと削除できないようです。その場合はしばらく待ちましょう

# おためしあれ
プランやクラスター構成の変更は `inventories` ファイルで設定できます。また、kubesprayの設定を変えたい場合は [このへん](https://github.com/rerorero/vultr-k8s-playbook/tree/master/roles/kubespray) をお好みにいじってみてください。

格安な検証用k8sクラスターをお手軽にたててみたい方、是非お試しあれ。
認証ありプロキシに対して認証を行う認証なしプロキシの構築スクリプト

# TL;DR

認証ありプロキシに対して認証を行う認証なしリバースプロキシを簡単に構築できるスクリプト(Windows用)を作ったので紹介します。

# これは何か？

会社などで外部インターネットへのアクセスを制限するために使用されている認証ありプロキシ[^1]はソフトウェア開発を行う上で障害となることが多々あります。[^2]
その忌まわしい認証を代理で行ってくれるリバースプロキシをWindowsに構築できるスクリプトを作りました。
これを使えば認証プロキシ環境下でも認証なしプロキシが利用できるようになり、幸せになれます:innocent:。

# 必要なもの

極力環境依存が無いように作りましたが、動かない環境もあるかもしれないです。

- Windows7 または Windows10 (PowerShellが使えるWindows）
- [Docker Toolbox](https://docs.docker.com/toolbox/toolbox_install_windows/)

# 使い方

1. Docker Toolboxをインストール
2. https://github.com/k-ishigaki/proxy-proxy からzipファイルをダウンロード（git cloneでも良いです）
3. zipファイルを解凍した中のinstall.batをダブルクリック
4. 認証プロキシ情報を入力（proxy hostはIPアドレスでもホスト名でもOKです）

  ```
  enter proxy host: 123.456.789.012
  enter proxy port: 8888
  enter proxy user: k-ishigaki
  enter proxy pass: **********
  ```

スクリプトが動作し終わったら、`localhost:8080`が認証なしのプロキシとして使えるようになるはずです。

# Q&A

### 1. Docker Toolboxのインストールオプション（インストール中のチェックボックス）は何を選べばいいの？

チェックボックスはデフォルトのまま変更せずインストールしてください。

### 2. インストール後にVirtualBoxの画面（ウィンドウ）が立ち上がるんだけど？
VirtualBoxのVM(VirtualMachine)を動かしているウィンドウです。このVM上でDockerが動作しているため、このウィンドウを閉じるとプロキシサーバーも終了します。
（Windowsのシャットダウン時にVirtualBoxも自動終了させるために、VMをウィンドウで起動させています。）

### 3. 起動させるために毎回install.batを使わないといけないの？

パスワードが変わった場合は毎回install.batからやり直す必要があります。
パスワードが変わっていない場合は、VirtualBoxを起動し、名前が"default"のVMを起動すればプロキシ情報の入力無しで再利用できるはずです。（再利用できない場合は、install.batからやり直すしか無いです…）

### 4. Windowsの起動時に立ち上がるようにはしないの？
バッチファイル内で勝手にスタートアップに登録するのは良くないと考えたため、自動起動の設定までは行っていません。
下記の記事の方法を使えば自動起動させることができます。
[【Windows7＋VirtualBox】ホストOSの起動時に、仮想マシンを自動起動させる方法](https://qiita.com/MarieKawasuji/items/d1a94b6ff57fb1ef0885)

### 5. うまく動かないんだけど？  
現在記号（"#$%&'など）ありのユーザー名の認証には対応していません（パスワードは対応しています。記号入りのユーザー名は今後対応する予定です）。
その他動かない情報があればコメントでお知らせください。

# 参考

Dockerfileは下記を参考にしました。
やっていることの仕組みも図で書いてあるのですごくわかりやすいです。
[認証ありプロキシを認証なしにするDockerコンテナ](https://qiita.com/yama07/items/b3ec857b6d5d26102a0d)

# 苦労した点

PowerShellは初だったということもあり、記号が入っているパスワードをエンコードしてDockerに渡す部分に苦労しました。
PowerShellはURLエンコード、Base64エンコード、Dockerfileはalpineのapkのプロキシ設定、Base64デコード、squidの認証情報設定あたりの試行錯誤が多かったです。
正直PowerShellは当分書きたくないと思いました…。:sweat:
また、VirtualBox、Docker-Machineのネットワーク周りの設定にも苦戦しました。。。

# その他

Qiita初投稿なので不足しているところがあると思います。
疑問点、不具合などあればコメントいただけると嬉しいです。

[^1]: この記事ではBasic認証付きフォワードプロキシを指す。
[^2]: 例えば、Java8から認証プロキシがデフォルトで通らなくなっている、など。（[JavaでHTTPSのサイトに認証付きプロキシ経由でアクセスしようとすると407エラー](https://qiita.com/kaakaa_hoe/items/d4fb11a3af035a287972)）
[Git] 間違ったブランチで作業してしまった場合の対処

何度も忘れるのでメモ用に。

## Commitしてしまったら
まず取り消す。

```
$ git commit -m "うわやっちゃったよこれもうどうすんだよ"
$ git reset HEAD~  
```
`git reset HEAD~`によってディスク上のファイルはすべてunstageされる(変更は残ったまま)
stageされたままでいいのなら、`git reset --soft HEAD~`を使う。

## Pushまで行ってしまっていたら
強引なやり方として、一つ前のcommitをforce pushする方法がある。
(もし、これよりも良い対処があったら教えてください)

```
$ git push -f [一つ前のcommitID]:[現在のブランチ名]
```

## git stashを用いて別ブランチに変更を反映させる
commit前に行う。`git stash`で一度変更を対比させ、ブランチ移動後に`git stash pop`で展開する。

```
$ git stash
$ git checkout [正しいブランチ]
$ git stash pop
```

## Sources
https://stackoverflow.com/questions/1270514/undoing-a-git-push
https://stackoverflow.com/questions/927358/how-to-undo-the-most-recent-commits-in-git
https://stackoverflow.com/questions/7217894/moving-changed-files-to-another-branch-for-check-in/7218106
PHP_Cording_20180710

#Mac買いました
ターミナルを使って早速のssh接続を試みる。

```
ssh -p xxxx user_name@IP_adress
```
ポート番号が「２２」なら```-p xxxx```の部分はいらない。
ポート番号が「２２」でないなら　```-p ポート番号```と指定しなくてはならない。

```
scp -P xxxx ./file user_name@IP_adress:指定されたディレクトリ
```
ポート番号が「22」なら、-P xxxxの部分はいらない。
sshとは違い-Pは大文字（ややこしい）

これphpの備忘録じゃなくてbashコマンドの備忘録になってしまった。
MiniMagickで日本語が表示されない


#はじめに

MiniMagicで画像の上に文字を書き出したいが、日本後が出力されない。
以下の例だと`testてすてす`と出て欲しいが、`test`しか表示されない。

```ruby:
def make_picture()
    color = "black"
    draw = "text 10,10 '#{sentense}'"
    font = ".fonts/GenEiGothicN-U-KL.otf"
    base = "app/assets/images/ogotte.png"
 
    i = MiniMagick::Image.open(base)
    #image.combine_options do |i|
      i.font "Arial.ttf"
      i.fill color
      i.gravity 'center'
      i.draw "text 200,200 'testてすてす'"
      i.pointsize '100'
      i.write "app/assets/images/22.png"  
  end
end
```

#調査
フォントが日本語に対応していないと表示されないという記事が多い。しかし、
今回は`i.font "GenEiGothicN-U-KL.otf"`で日本語対応のフォントを指定している。

実行しているクエリを確認したが、
`-type .fonts/GenEiGothicN-U-KL.otf`で フォントはちゃんと指定されているようだった。
絶対パスでも試したがダメだった。

```ruby
iMagick::Error (`gm mogrify -type .fonts/GenEiGothicN-U-KL.otf /var/folders/j0/d210w9lx3qg27c3321by91840000gn/T/mini_magick20180710-5786-a661kl.png` 

```

当初セットアップ時に以下の`Unable to read font`というエラーが発生して、フォントが読み込みできていなかったので、`brew install ghostscript` したことを思い出す。

```ruby
 iniMagick::Error (`gm mogrify -draw text 200,200 'testてすてす' /var/folders/j0/d210w9lx3qg27c3321by91840000gn/T/mini_magick20180710-7111-1tu4c2k.png` failed with error:
   gm mogrify: Unable to read font (/usr/local/share/ghostscript/fonts/n019003l.pfb) [No such file or directory].
   ):
```

`brew uninstall ghostscript`でghostscriptをアンインストールしてみと、
同じエラーが発生する。指定しているフォントではなく、
` /usr/local/share/ghostscript/fonts/n019003l.pfb`を使用してしまっていた。




#解決
乱暴だが`ghostscript`を再度インストール後、`/usr/local/share/ghostscript/fonts/n019003l.pfbをn019003l.pfb_bk`にリネーム。
`GenEiGothicN-U-KL.otf`を`n019003l.pfb`にリネームして、`/usr/local/share/ghostscript/fonts/`に配置したところ日本語が表示された。
Rubyのクラスでキャッシュ処理を実現する方法

## はじめに
RailsでWebアプリを開発していて、ファイルのデータを読み込み、そのなかから必要な値を返すようなメソッドがあるとする。
何度も呼ばれる場合は、ファイルのデータを毎度読み込むのはコストが高いためメモリ上に保存しておきたい。
そんな時にプログラムを書けばよいか、方式はいろいろあるが簡易的に変数に格納した値を再利用する方法を検討した。

クラスメソッドやインスタンスメソッド、クラス変数やインスタンス変数を利用した方法について検証したコードを書いてみる。

結論から書くとブラウザからRailsを通してアクセスする場合は、クラス変数を使ってインスタンスメソッドで呼び出すのが適当だ。


## サンプルコードでやること
* 変数にハッシュを用意する。
* メソッドからキー値を入力とし、
* ハッシュに値があれば値を返し、
* なければ"val"という文字列を入力値のキーにしてハッシュに格納する
* インスタンスメソッドと、クラスメソッドの場合でそれぞれ試している

## クラス変数を利用したサンプルコード

```rb
class Aaa
  @@hash = {}

  def instance_method(key)
    if @@hash[key]
      p "キャッシュを利用しました"
      @@hash[key]
    else
      p "格納しました"
      @@hash[key] = "val"
    end
  end

  def self.class_method(key)
    if @@hash[key]
      p "キャッシュを利用しました"
      @@hash[key]
    else
      @@hash[key] = "val"
      "格納しました"
    end
  end
end
```

### インスタンスメソッドの実行例
クラスをインスタンス化すればキャッシュを利用できる

```irb
aaa = Aaa.new
=> #<Aaa:0x007ff5e06edba0>
> aaa.instance_method(:bar)
"格納しました"
=> "val"
> aaa.instance_method(:bar)
"キャッシュを利用しました"
=> "val"
```

### クラスメソッドの実行例
クラスメソッドでもキャッシュを利用できる

```irb
> Aaa.class_method(:foo)
=> "格納しました"
> Aaa.class_method(:foo)
"キャッシュを利用しました"
=> "val"
```

## インスタンス変数を利用したサンプルコード

```rb
class Bbb
  def initialize
    @hash = {}
  end

  def instance_method(key)
    if @hash[key]
      p "キャッシュを利用しました"
      @hash[key]
    else
      p "格納しました"
      @hash[key] = "val"
    end
  end

  def self.class_method(key)
    if @hash[key]
      p "キャッシュを利用しました"
      @hash[key]
    else
      @hash[key] = "val"
      "格納しました"
    end
  end
end
```

### インスタンスメソッドの実行例
クラスをインスタンス化すればキャッシュを利用できる

```irb
bbb = Bbb.new
=> #<Bbb:0x007ff5e54c6a70 @hash={}>
> bbb.instance_method(:foo)
"格納しました"
=> "val"
> bbb.instance_method(:foo)
"キャッシュを利用しました"
=> "val"
```

### クラスメソッドの実行例
@hashはクラスメソッドのスコープが外れているため見えない。雑に言うと存在してないのでnil扱いになってるというわけでだ

```rb
Bbb.class_method(:foo)
NoMethodError: undefined method `[]' for nil:NilClass
```

検証結果よりインスタンス化すれば、何度もキャッシュを呼び出すことはできる。
しかしRailsのコントローラから呼ばれた場合は都度新しくインスタンス化する必要があり、キャッシュすることができない。
なのでこの仕組でキャッシュ機能を作る場合は、クラス変数を利用したクラスを利用してキャッシュ機能は作るべきである。

## クラス変数を利用したサンプルコードをもう少しRubyっぽく書く

もうちょっとRubyっぽく書いた class_method2を作る
||＝ でnilガード

この辺のキャッシュ機能の書き方は,　いろいろなgemで使われている。
先日見たコードだとこの祝日を返すgemでも使われていた(https://github.com/holiday-jp/holiday_jp-ruby/blob/master/lib/holiday_jp.rb#L14)

```rb
class Ccc
  @@hash = {}
  def self.class_method(key)
    if @@hash[key]
      p "キャッシュを利用しました"
      @@hash[key]
    else
      @@hash[key] = "val"
      "格納しました"
    end
  end
  
  def self.class_method2(key)
    p @@hash[key] ? "キャッシュを利用しました" : "格納しました"
    @@hash[key] ||= "val"
  end
end
```

```irb
Ccc.class_method2(:foo)
"格納しました"
=> "val"
> Ccc.class_method2(:foo)
"キャッシュを利用しました"
=> "val"
```

※ クラスインスタンス変数はややこしくなるので今回は対象にしていない
[クラス変数とクラスインスタンス変数](https://qiita.com/shun_takagi/items/cba48fbe8c4de81b3fac#%E3%82%AF%E3%83%A9%E3%82%B9%E3%82%A4%E3%83%B3%E3%82%B9%E3%82%BF%E3%83%B3%E3%82%B9%E5%A4%89%E6%95%B0%E3%81%A8%E3%81%AF)
Go 言語の path と path/filepath の違い

# Go 言語の path と path/filepath の違い

Go 言語でのプログラミング中に Delphi の`ChangeFileExt`、.NET Framework の`Path.ChangeExtension`に相当するものが欲しくなって調べたところ、ビルトインには残念ながら無いようだった.
そして不思議なことに渡した`path`の拡張子を取得する関数が2つある.
`path.Ext`と`filepath.Ext`だ.

それぞれのパッケージの Overview を読むに`path`パッケージはパスの区切り文字として`/`を固定で用い、`path/filepath`はOS定義の文字を用いるようだ. 確かに`path.Ext`を読むと`/`が固定で用いられており、`filepath.Ext`では`IsPathSeparator`を使用していた.

`IsPathSeparator`は[https://golang.org/src/os/path_windows.go#L13](https://golang.org/src/os/path_windows.go#L13)や[https://golang.org/src/os/path_unix.go#L15](https://golang.org/src/os/path_unix.go#L15)に定義されているとおりである.

正直なところ、Linux でアプリを書いている人が`path`パッケージを使って、Windowsでビルドしても動かないトラブルを起こす可能性が増えるだけなので`/`固定のビルトイン関数は廃止してほしいと思った.

それはさておき拡張子を置換するコードはこうなった.

```golang
func changeExt(path string, ext string) string {
	return path[:len(path)-len(filepath.Ext(path))] + ext
}
```

Python だったらスライスを取るときに負の値が使えて`path[:-len(filepath.Ext(path))]`で済むのになーと思った.
ゲームの作りかたお勉強の経過記録

# お勉強戦績
今までゲームに関する作り方をこうやって学んだよ的な個人的記録。随時更新中。突っ込みどころもお待ちしております。
## Unityの部

#### お勉強開始(2018/02 ごろ)
 - 当時の最新版であった2017.3に対応している本でお勉強

| 資料とか | memo |
|:--|:--|
| [Unityの教科書 Unity 2018完全対応版<br>2D&3Dスマートフォンゲーム入門講座(Entertainment&IDEA)](https://www.amazon.co.jp/dp/4797397659/)  | unityの基礎的使い方およびC#の基礎を学ぶのならこの本が一番だった。<br>なお、当時は2017版の本を使用。  |
| [Unity5 3D/2Dゲーム開発実践入門<br>作りながら覚えるスマートフォンゲーム開発](https://www.amazon.co.jp/dp/4883379671/) | 3DおよびC#の使い方をもう少し学びたかったのでこの本によるトレーニングを追加。対応バージョンは5なの最新ではないですが、2017でも問題なく動作しました。|

 - 公式の各種チュートリアルを読んだり学んだり。

| 資料とか | memo |
|:--|:--|
| [Tanks tutorial](https://unity3d.com/jp/learn/tutorials/s/tanks-tutorial)  | 動画自体は英語だけど公式で日本語字幕がついているから、学ぶ分には問題なかったです。 <br>自分でまとめたチュートリアルメモhttps://qiita.com/Ymimoto/items/6c3a3d5fab48dc435550 |

 - そろそろ自分で何か作ろうかと思い、とりあえずキャラの動作関連のC#コーディングを始める。
 - 2018.1公開と同時に、unity公式のゲームジャムが開催されたので、ProBuliderをつかってゲームを作った。先につくっていたキャラ動作のスクリプトも使用した。
   - 今までC#で存在は知ってたけど使う機会がなかったもの(構造体 等)を使用して開発できたのが、C#のプログラム面では一番大きいかなと思います。
   - ディレクトリのコピーと簡単なリネームのみでプロジェクトのコピーはしちゃいけない。面倒でもアセットとしてエクスポートして新しくプロジェクトを作ってそのアセットをインポートしないと、ビルドで泣きを見る。
   - 出来上がったもの。いつか作り直したいなあ。<br>
    https://unityroom.com/games/onigiri_get

## UE4の部

#### お勉強開始(2018/04 ごろ)
 - 本格的な開始は6月入ってから。インストールしたまではいいけど、エディタについているチュートリアルが理解しにくかったのが問題。
   - チュートリアル自体については、操作する箇所がハイライトされていてわかりやすかったのだが、機能が隠れている部分だとメッセージは表示されていてもどこを操作すればわからなかったため理解がしにくかった。難しいのだろうけど、非表示の機能についてハイライトするなら、一時的に表示してほしかったなあと思う。

 - 上記のため、先に理解しやすいところということで、udemyの動画講座に手を出す。C言語勉強中にunityのゲームジャムが開催されたので一時中断したけど、終了次第再開。
 
| 資料とか | memo |
|:--|:--|
| [はじめてのアンリアルエンジン【Unreal Engine 4】入門チュートリアル講座](https://www.udemy.com/unreal-engine-4-beginner-tutorial/)  | UE4の基本的な機能をざっくりと学ぶために受講。機能ごとにチャプターが分かれているので、機能ごとに復習とかするのにちょうどいいです。  |
| [作って覚えるアンリアルエンジン【Unreal Engine 4】～ダンジョンゲーム編～](https://www.udemy.com/unreal-engine-4-award/)  | 上記のチュートリアルでどんな機能があるかどうかわかったため、次は実際の開発方法を学ぶために受講。  | 

## 各種言語やライブラリの部

### C#学習
 - Unityを学び始めると同時に[SoloLearn](https://www.sololearn.com)を使用しての学習開始。SoloLearnについては、移動中での学習に使用していたが、英語のサービスなので翻訳機をつかった。
 - スクールにて、C#は基礎から再度学習中。スマートフォンゲームの開発やUnityによる開発はこちらの言語がメインになるので、今後のためにもきちんと習得したい。

### C++学習
 - C/C++はいつかきっちりと勉強したかった言語であったのと、C++はUE4で使用する言語だということでUE4を本格的に学習する前に4月後半から学習開始。<br>まずは手がかりとして、 udemyさんの[一週間で身につくC/C++言語](https://www.udemy.com/cc-lubmn/) での動画学習で基本的な文法を学んだ。<br>昔、Cを少しかじったことがあるということと、長年PHPやってたというのもあって、C関連独特のシステム以外はすんなりと覚えられた。 <br>とはいえ、基本的な文法であって最近のモダンC++でないため、UE4なりなんなりでアルゴリズム等を学びつつモダンC++も着手したいところ。
 
##問題点や課題、今後着手していきたい事柄など
### unity
 - 学習として、GW中に作成したゲームをいろいろ改修し、きちんとしたものに仕上げたい。
  - 各種有名どころのスクリプト系アセット。たとえばTween系、UniRX等。
  - ゲームマネージャスクリプトの改修、オミットしたルールの追加、等。
 
### UE4
 - 動画講座ではブループリントを使用してのゲームロジック作成だったため、C++でロジックを作りたい
  - やっていくうちに、「自分ブループリントでのロジック作成向いてないんじゃないか」と思い始めた。
 - 何かしら、自分で一から何かを作りたい
  - まったく新規で作成になるか、unityで作ったゲームのUE4移植のどちらか。
 
### 言語やライブラリ
 - DirectXを学んでいこうかと考えている。プログラムの力もつきそうだし、unity等よりもう一歩先へいってひたすら頂点といいますか、自分の限界を超えた先を見たい。ついでにC++の力も付けたい。
  - 世間のゲームプログラムに関する物理的資料はunityやUE4が主流であり、directXの資料が全くないに等しい。
  - 主流である11が難しいという話のわりには、公式チュートリアルがちょっと怪しい。WEBを探しても資料が9と比べて少なめ。
  - かといって9も時代遅れの印象。
  - ……ということで、いい感じの勉強法を模索中。たぶん、9の基礎部分を勉強してから11に移行するのがいいかと思うんだけどいかがでしょ？
eclipseをbrewcaskでinstallした際のlombokの設定

ハマったのでメモ。

brewcaskでeclipseをインストールした場合は、lombokのクライアントで自動検索ができない。

![Screen Shot 0030-07-10 at 11.53.32 PM.png](https://qiita-image-store.s3.amazonaws.com/0/175309/7c675c0d-04b1-68e4-499f-7c1fb1fd15e1.png)

そのため、ダウンロードしてきたlombok.jarを下記に写す必要がある。

```
/Applications/Eclipse JEE.app/Contents/MacOS/lombok.jar
```

配置したらeclipse.iniに下記を追記。

```
-javaagent:lombok.jar
-Xbootclasspath/a:lombok.jar
```

全体

```
-startup
../Eclipse/plugins/org.eclipse.equinox.launcher_1.4.0.v20161219-1356.jar
--launcher.library
../Eclipse/plugins/org.eclipse.equinox.launcher.cocoa.macosx.x86_64_1.1.551.v20171108-1834
-product
org.eclipse.epp.package.jee.product
-showsplash
org.eclipse.epp.package.common
--launcher.defaultAction
openFile
--launcher.defaultAction
openFile
--launcher.appendVmargs
-vmargs
-Dosgi.requiredJavaVersion=1.8
-Dosgi.instance.area.default=@user.home/eclipse-workspace
-XX:+UseG1GC
-XX:+UseStringDeduplication
--add-modules=ALL-SYSTEM
-XstartOnFirstThread
-Dorg.eclipse.swt.internal.carbon.smallFonts
-Dosgi.requiredJavaVersion=1.8
-Xms256m
-Xmx1024m
--add-modules=ALL-SYSTEM
-Xdock:icon=../Resources/Eclipse.icns
-XstartOnFirstThread
-Dorg.eclipse.swt.internal.carbon.smallFonts
-javaagent:lombok.jar
-Xbootclasspath/a:lombok.jar
```
Raspberry pi3上でChromeのheadlessモードによる小型低電力＆自動化環境への第一歩

## 動機

Raspberry piの小型低電力の特性を生かした活用方法の一つとして、headlessブラウザを使った自動化環境にチャレンジして見たいと思います。

一昔前だと、VXFD仮想ディスプレイ＋pyvirtualdisplayの環境で、ブラウザにiceweasel（現:Firefox）を使って実現していたようで、その辺りの記事はよく見かけます。
今回、Chromeに実装されたheadlessモードを使ってやってみました。
とはいえ、情報が少なく試行錯誤の連続でしたが、しばらくやってから冷静に考えると結構簡単に解決したので手順も含めて共有します。

## 試行錯誤履歴
* Firefox + VXFD + pyvirtualdisplay環境
    * VXFDはブラウザ標準のheadlessではないので、やり方だけググって見送り
* Firefoxでのheadless
    * `apt-get`で取得できるFirefoxバージョンが52で、まだ`-headless`に対応していない
    * しかも、GeckoDriverは64bit対応版しか公開されておらず、32bitモードで動くraspberry piでは扱えず
* Chromium-browser + ChromeDriverの組み合わせ
    * ChromeDriverを[debianのパッケージレポジトリ](https://packages.debian.org/stretch/chromium-driver)から探したが、GeckoDriverと同じく64bit版しか見つからず断念

## 行き着いた先
色々試して路頭に迷っていたところ、ふと`apt`でChromeDriveがあるんじゃね？と思って探すとあったんですね。灯台下暗しと言いますか・・・
chromium-browserがaptで取得できるのだから当たり前といえば当たり前なんでしょうが、取り組み当初は思いつきませんでした。ちゃんと全体を見渡してから一つずつ試さないとダメですね。
さて、気を取り直して以下、環境構築手順とサンプルプログラム。

## 最終的な環境
* Raspberry pi3
* Raspbian Stretch lite
* Chromium v65
* ChromeDriver v2.35
* Python2.7
* Selene

##　環境構築
### Chrome, ChromeDriverのインストールと設定

```bash
# chromeブラウザインストール（2018.7.10時点でv65）
$ sudo apt-get install chromium-browser

# v65のChromeに対応したChromeDriveをインストール
$ sudo apt-get install chromium-chromedriver

# chromedriverが環境パス上に無いので、/usr/bin/下にシンボリックリンクを張っておく。
# コードでパスを指定するので別にやらなくても良い。
$ sudo ln -s /usr/lib/chromium-browser/chromedriver /usr/bin/

# 日本語フォントが無いのでインストール
$ sudo apt-get install fonts-ipafont-gothic fonts-ipafont-mincho
```

インストールしたバージョンは下記。

```bash
$ chromium-browser --version
Chromium 65.0.3325.181 Built on Raspbian , running on Raspbian 9.4

$ chromedriver --version
ChromeDriver 2.35 (0)
```

### seleneインストール

Javaでよく使われるSeleniumラッパーでSelenideというものがありますが、それをPython向けにポートした[Selene](https://github.com/yashaka/selene)というのがあります。
Seleniumの面倒なところを吸収してくれているのでオススメのライブラリです。
下記の手順でpipを使ってインストールします。

```bash
$ sudo apt-get install python-pip
$ pip install selene --pre
```

### サンプルプログラム（python）

```python
from selene.browsers import BrowserName
from selene.api import *
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
import traceback


def main():
    try:
        config.browser_name = BrowserName.CHROME
        chrome_option = webdriver.ChromeOptions()
        chrome_option.add_argument('--headless')
        chrome_option.add_argument('--disable-gpu')
        driver = webdriver.Chrome(executable_path="/usr/bin/chromedriver", chrome_options=chrome_option)
        browser.set_driver(driver)
        browser.open_url("http://www.yahoo.co.jp")
        driver.save_screenshot('screenshot.png')
        browser.quit()
    except:
        print traceback.format_exc()
        browser.quit()

if __name__ == '__main__':
    main()
```

## 最後に
このサンプルプログラムを実行すると、実行フォルダに`screenshot.png`が作成されます。
ここまでできればSeleniumの要領でページ操作をすれば色々とできそうです。
まだ複雑なJavascriptが存在するようなページ操作などは試せていませんが、Chrome v65なので問題になるケースは少ないのではないかと思っています。
実行速度も比較検証はしていませんが、時間的にシビアな処理をさせるつもりも無いので特に問題ないでしょう。

このくらいであればRaspberry pi Zeroでも動くかもしれませんが、いずれチャレンジしてみようと思います。どなたかすでに試された方がいれば共有してくれると嬉しいです。
oFで起動時セカンドディスプレイフルスクリーンする時の注意

# はじめに
セカンドディスプレイ（サブモニター）でフルスクリーンをする記事はいろんなところに腐るほどでてます。
ただ、その通りやってみてうまくいかずちょっと困ったので残しときます。

# 問題
メインモニターでUI画面、サブモニターで描画画面をフルスクリーンで出したいというのが目的でした。

そこでとりあえずぐぐって最初の方に出た以下の2つを参考にやってみました。

[openFrameworksでマルチウィンドウ、マルチディスプレイの実装方法](https://qiita.com/aframeworks-blog/items/2244b11afbfa1a4218ed)
[openFrameworksで起動時にセカンドディスプレイでフルスクリーンにする方法](http://www.atnr.net/of%E8%B5%B7%E5%8B%95%E6%99%82%E3%81%AB%E3%82%BB%E3%82%AB%E3%83%B3%E3%83%89%E3%83%87%E3%82%A3%E3%82%B9%E3%83%97%E3%83%AC%E3%82%A4%E3%81%A7%E3%83%95%E3%83%AB%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3/)

が、うまくいかない。
自身のメインモニターの解像度は`1920*1080`なのでウィンドウ位置を`1921, 0`に設定してフルスクリーン化すると、メインモニターでフルスクリーンになってしまう。

# 結論
上の記事でも書いてありますが、フルスクリーン化（`ofToggleFullScreen()`とか`ofSetFullScreen(true)`とか）はそのウィンドウが存在するモニターでフルスクリーン化します。
また、例えば2画面の場合、そのどちらにも属さない状態でフルスクリーン化しようとするとメインモニターでフルスクリーンになります。

と言うわけで、サブモニターでフルスクリーン化した時の座標を見てみました。

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/153451/13ab2c1e-024b-f57d-bc3b-a7038cc9c920.png)

`ofGetWindowPositionX()`,`ofGetWindowPositionY()`で座標を取得しました。widthとheightはついでです。

お気づきの通り、y座標が3になってます。それ自体の原因はわかりませんが、要は**一旦手動でサブモニターでフルスクリーンにしてあげて、その時の座標に設定してあげればちゃんとサブモニターの領域に入る**ということです。

というわけで、基本は上記の記事通りですが、設定する座標に注意しましょうという話でした。
ちなみにこの座標の値ですが、メインモニターの解像度に依存するはずなので使いまわしは可能だとは思いますが、検証はしていないのでまたうまくいかなかったら再度手動で調べてみてください。

# 最後に
以上で終わります。
「ディスプレイ」と「モニター」とか、「メイン・サブ」と「セカンド」とか、言葉の使い分けが非常に面倒くさい。
うおーるぼっとG  忍者プログラミング！

今日は、マイクロビット の　うおーるぼっとG を紹介します。
　それは　コンテストで　特別賞を取られてました！！
おめでとうございます。
https://paddle.prokids.jp/work/show/236

Maker Faire Tokyo 2018 （8月4日、5日）のスイッチサイエンス社ブース内展示、　　ご自分のブースでは　先行販売されるそうです。

　うおーるぼっとG というのを初めて見た時　『OH NINJA ！』と思いました！　私も壁登りたい！！！
うおーるぼっとG は、ものすごく活発で、パワフルです！　

　Mbed祭りの講師もされています。
（　性格の良い穏やかな方で　お料理も得意な良いパパエンジニアの開発者の方です。）
　
※受賞作品は、Maker Faire Tokyo 2018 （8月4日、5日）のスイッチサイエンス社ブース内でも展示されるそうです。
　そして耳よりな情報は　ご自分のブースでも先行販売されるそうです。（数に限りがあり）

　MFTは、素晴らしいエンジニアが色々出るので　楽しみですね。
Ichigosodaも出ましたし、他にも色々紹介したいものがあり、とっても楽しみですよ。

　また
マイクロビットで、IchigoJamともできるのを作られた北海道の方も
マイクロビット の教材を作られている大分の先生も
東大のプログラミング教育で登壇された先生方に、
マイクロビット アジア代表の方も、
マイクロビットでIchigoJamもできちゃうとか
いろいなことが広がっていく　IoT  作ることの喜び！
とても、皆さん熱心で楽しそうで、仲良くしていただいて、エンジニアの方面白くて優しくて情熱があり　作品がみんな可愛くて　電子工作基板女子になってます。　

　あなたもならない？

　電子工作プログラミングも　少しやると初心者ができなくて壁にぶつかる時があるので、（私いまでも、可愛い基板をいただいたけど、できない＞＜、特にMACだけ繋がらないのはなぜ？など　質問したい　）
　壁にぶつかると辞めてしまう人が多いですが、その時にこそ、開発した　作品と、会ってください！　とてもやる気が出ます。　是非、私と一緒に頑張って行きましょう。基板が光るのが嬉しい！！


（　ビデオ撮影で初心者用にだいぶ前に撮影したのも　あちこちに行っているので載せたいもたくさんあるのですが、
キータの載せ方も初心者で、難しいです＞＜　
　教えてくれる人募集したい、　）
GASでgzipファイルを解凍する

# 背景
google apps script でgoogle drive内に保存しているgzipファイルを簡単に解凍できるかと思いきや、少し工夫が必要だったのでメモ。zipファイルは簡単にできるのに。。。

# zipファイルを解凍するには
比較として、まずはzipファイルを解凍する場合。

```javascript
function unZipIt() {
  //zipファイルが保存してあるfolderidを指定
  var folder = DriveApp.getFolderById("0xxxxxxxxxxxxxxxxxx0");
  //解凍するzipファイルを指定
  var zipFile = folder.getFilesByName("xxxxxxx.zip");
  var fileBlob = zipFile.next().getBlob();
  var unZippedfile = Utilities.unzip(fileBlob);
  var saveFile = folder.createFile(unZippedfile[0]);
}
```

基本的に上記のやり方で問題なく処理できるハズですが、エラーになるようならContent Typeを指定。

```javascript
function unZipIt() {
  //zipファイルが保存してあるfolderidを指定
  var folder = DriveApp.getFolderById("0xxxxxxxxxxxxxxxxxx0");
  //解凍するzipファイルを指定
  var zipFile = folder.getFilesByName("xxxxxxx.zip");
  var fileBlob = zipFile.next().getBlob();
  //エラーになる場合はcontent typeを指定
  fileBlob.setContentType("application/zip");
  var unZippedfile = Utilities.unzip(fileBlob);
  var saveFile = folder.createFile(unZippedfile[0]);
}
```

# gzipファイルを解凍するには
Content Typeはx-gzipを指定。
また、gzipされたtsvファイルを保存するときにもポイントが。

```javascript
function unGzipIt() {
  //gzipファイルが保存してあるfolderidを指定
  var folder = DriveApp.getFolderById("0xxxxxxxxxxxxxxxxxx0");
  //解凍するgzipファイルを指定
  var gzipFile = folder.getFilesByName("xxxxxxx.gz");
  var fileBlob = gzipFile.next().getBlob();
  //ここポイント！！content typeはx-gizp
  fileBlob.setContentType("application/x-gzip");
  var unGzippedfile = Utilities.ungzip(fileBlob);

  //解凍後のファイル設定値
  var contentType   = "text/tsv";
  var saveFilename   = "xxxxxxx.tsv";
  var charSet       = "UTF8";

  //ここポイント！！解凍後のファイルを変換してから保存
  var blobFile = Utilities.newBlob("", contentType, saveFilename).setDataFromString(unGzippedfile.getDataAsString(), charSet);
  var saveFile = folder.createFile(blobFile);
}
```
Home-Assistant(HASS.io)を入れていく

#前提
昔からハード好きだけどプログラムなんてできないマン。昭和世代。
BASICは雑誌の紙面を打ち込んで、多少パラメータ変更して遊ぶくらい。
ここ5年ほどで必要に駆られてVBAマクロちょこっと触ってたくらい。
UltimaOnlineで遊ぶために英語ドキュメントはアルク英辞郎やGoogle翻訳で
多少読めるくらい。

#あらまし
そもそもiPhoneにiPadにAppleWatchに身を固めているので
RaspberryPi2B手に入れて、HomeBridge入れていじってたんだけど
HomePod発売が見えなさ過ぎてGoogleHomeMini購入。
するとHomekitとGoogleのスキルの間の壁を埋めたくなって
HomeAssistantに出会う。

***

#HomeAssistantって？
海外ではZ-waveやZigbeeなどのメッシュ型のセンサーネットワーク規格や、各メーカー独自のホームオートメーション機器が発売されている。
それらは各社のスマホアプリでの操作となっていたりして各社のハブを購入しなければいけない場合も。
それらをエミュレートしたりして母艦機能を持つサーバープログラム立てちゃおうぜヤツ。

#んじゃ入れてみよう
ちょっと待ってほしい。HomeAssistantはオープンソフトウェアであくまでも母艦サーバーウェア。
それをRPiなどのEmbeddedハードウェアに入れるために最適化されたものがある。
Dockerパッケージにして導入しやすくしたり、アップデートやaddonが追加しやすい
エコシステム化されたもの。それがHass.ioだ。

**騙されたと思って Hass.ioを入れてほしい**

##公式サイト
[Home Assistant](https://www.home-assistant.io/)
[Hass.io](https://www.home-assistant.io/hassio/)

Piに入れるならここ参照のこと。
https://www.home-assistant.io/hassio/installation/

*ちなみに自分は、Raspbian StretchにHass.ioを追加したタイプです。*
*hass.ioとは別でサービスやスクリプト叩きたいこともありそうと思って。*

また入れてわかってきたことなどの小出しは次回。
日本語ドキュメントも少なくて名前さえ知られてないから少しでも知る機会になれたらと思います。
Windows 10 + Ubuntu 16.04.4 LTS + Docker + TensorFlow

#概要
WSLでDockerが動くようになったので。
# legacy WSLのアンインストール
Dockerが動くのは**store版**のWSLだけです。
legacy WSLがインストールされている場合は、いったん**アプリと機能**からアンインストールしてください。
# Ubuntuのインストール
**Microsoft Store**からインストールします。

# Dockerのインストール
管理者権限でWSLを起動し、Dockerをインストールします。

```bash
sudo apt -y update
sudo apt -y upgrade
sudo apt -y install docker.io
sudo cgroupfs-mount
sudo usermod -aG docker $USER
sudo service docker start
```

ここでサービスの起動は失敗しているので、いったんWSLを再起動します。
再起動後、あらためてステータスを確認すると、

```bash
$ sudo service docker status
[sudo] password for XXXXXX:
 * Docker is running
```

無事動作しています。
続けてdocker run hello-worldが動作するはずです。

```bash
$ docker run --rm hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
9bb5a5d4561a: Pull complete
Digest: sha256:3e1764d0f546ceac4565547df2ac4907fe46f007ea229fd7ef2718514bcec35d
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.
...
```

お待ちかね、TensorFlowのDockerイメージを起動します。

```bash
$ docker run -it -p 8888:8888 tensorflow/tensorflow:latest-py3
...
    to login with a token:
        http://localhost:8888/?token=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
```
ここで、ブラウザへ移動し、指定されたtokenでjupyter notebookを起動します。

最後に、TensorFlowでHello worldできたらインストール成功です。

```python
import tensorflow as tf

hello = tf.constant('Hello, TensorFlow!')
print(sess.run(hello))
```
```
Hello, TensorFlow!
```

お疲れさまでした。
Vue.js の同じ親を持つ v-for 使用の兄弟要素と key ディレクティブへの配列のインデックス指定について

# Vue.js の v-for で配列を指定する際にキーを指定しないほうがよいらしい

[Vue.js: v-forで項目インデックスをkey属性にしていいのか](https://qiita.com/FumioNonaka/items/d1d9c9335116426a8316)
[追加と削除が繰り返される配列要素のオブジェクトに一意のid番号を振る](https://qiita.com/FumioNonaka/items/63ce689b3599a6922182)

いままでばんばんつかってました・・・

# 親を同じくする兄弟要素がそれぞれに v-for で配列を記述する場合

配列のキーを使用しないほうがよいというのは前述の記事にて述べられているのですが
下記のような良くないパターンをあえて

```vuejs:duplicate-key.vue
<template>
  <div>
    <ul>
      <!-- list 使用一か所目 -->
      <li
        v-for="(number, index) in list"
        :key="index"
        >{{ number }}</li>
      <!-- list 使用二か所目 -->
      <li
        v-for="(number, index) in list"
        :key="index"
        >{{ number }}</li>
    </ul>
  </div>
</template>

<script>
export default {
  data() {
    return {
      list: [1, 2, 3]
    };
  }
};
</script>
```

同一の `list` を使用している `li` での `v-for` で
配列のキーを `:key="index"` として使用しております。

[実行例](https://codesandbox.io/s/7lz15oqxj)にて確認すると下記のようなエラーが

```
[Vue warn]: Duplicate keys detected: '0'. This may cause an update error.
[Vue warn]: Duplicate keys detected: '1'. This may cause an update error.
[Vue warn]: Duplicate keys detected: '2'. This may cause an update error.
```

# GitHub での issue にて

* https://github.com/vuejs/vue/issues/7323

  > `:key="it.id"` として複数の要素に同じ `:key` を使用しようとしたらエラーが
  > 仕方ないから suffix で対応した

* https://github.com/vuejs/vue/issues/7323#issuecomment-353959736

  > 同じ `ul` の子に同じ `:key` の指定をしたら発生するしこれは期待される動き

前述の事例は同一の `ul` 中で `:key` がかぶったから発生したようです。

プレフィクスとして `first-` `second-` を付加して問題をなくした事例

```vuejs:not-duplicate-key.vue
<template>
  <div>
    <ul>
      <!-- list 使用一か所目 (first-) -->
      <li
        v-for="(number, index) in list"
        :key="`first-${index}`"
        >{{ number }}</li>
      <!-- list 使用二か所目 (second-) -->
      <li
        v-for="(number, index) in list"
        :key="`second-${index}`"
        >{{ number }}</li>
    </ul>
  </div>
</template>

<script>
export default {
  data() {
    return {
      list: [1, 2, 3]
    };
  }
};
</script>
```
GAE+pythonでwebアプリ作って良かったとこ、悪かったとこ

仕事で初めてGCPに触れ、GAE,データストア,Pythonでwebアプリの開発に携わったので個人的に良かったところ、悪かったところをまとめる。

# 良いとこ

## ユーザ管理が楽

普通webアプリ作るとなるとログイン機能は最低限必要になる。よくあるものだから比較的簡単に作れるものだが、毎回作るのは面倒だし、セキュリティを考慮するともっとやることが増える。

しかしGCP上ではgoogleアカウントでログイン認証しているため、ログイン機能の作成が不要である。ログインユーザの情報の取得も簡単で、データストア内のユーザ情報とメールアドレスを結びつけるのも楽である。

## マイグレーションが不要

普通RDBのバージョン管理にはマイグレーションをする必要がある。テーブルの追加削除やカラムの追加削除するときは、更新する/戻すSQLをファイルに残す。webフレームワーク内の機能を利用して、最新のスキーマに修正したり、元に戻すということができる。
ただこの作業は結構面倒くさくて、結局スキーマ書いたSQLをリポジトリに置いて、それを元に直接DBいじるというパターンもバイト先とかで見たことがある。これでもコード上でスキーマを管理しているので、いつテーブル設計に変更があったのかという情報は管理可能だが、手作業でDBに触る必要があるのでミスする可能性もある。

GAEだとモデルを書き換えるだけで良い。
モデルを修正した後に登録、もしくは更新したエンティティ（RDBでいうレコード）は対応したカラムになっていて、既存のエンティティはそのままである。元データが残るのは気持ち悪いが、適宜更新すれば大丈夫。

# 悪いとこ

## GQLの自由度が低い

データストアの操作はSQLライクなGQLで書く。あくまでSQLっぽいという程度で、

+ LIKE句がない
+ INはあるがNOT INがない

などの問題があり、この辺は運用でカバーするしかない。

## 使えるバージョンに縛りがある

GAEの環境は大きく分けて以下の2つがある

+ Standard environment: 安い、無料枠ある
+ Flexible environment: 高い、自由度が高い

基本的にはStandard environmentを使うことになるが、これだと使える機能に制限がある。例えば現在Pythonは2系しか使えない。従ってnumpyは使えるがscipy, pandasとかが使えないとかいう問題がある。

# 所感

AWSやherokuと比べると独自の機能が多く、普通のwebアプリ開発と比べると慣れないところも多かった。とはいえ勝手にやってくれるところが多いので、結果としてやる作業は少なくて楽になる、はず。あとAWSよりコスパが良いっぽい。以上。
SpringBootでアプリを作りたいので、Spring Initializrを試してみた

SpringBootでアプリを作りたいと思い、試した内容をメモ。

### 環境
- Mac High Sierra 10.13.5
- Java 1.8.0_11
- Maven 3.5.4
- springboot 2.0.3

### 手順
[Spring Initializr](https://start.spring.io/)のサイトに行き、プロジェクトを作成

- Group はルートパッケージ名（今回はcom.example)
- Artifact　はプロジェクト名（今回はdemo）
- Search for dependencies　はwebとthymeleafを追加

Generate Projectで雛形をダウンロード。
zip形式でダウンロードされるので解凍して使う。

ディレクトリ構造
> src/
>  ├ main/
>  │ ├ java/
>  │ │　└ 以下Groupで指定したディレクトリ/
>  │ │　　└ Artifactで指定したディレクトリ/ - ①
>  │ └ resources/
>  │ 　├ static/
>  │ 　└ templates/ - ②
>  ├ test/
>  │　└ java/
>  │ 　　└ 以下Groupで指定したディレクトリ/
>  │  　　　└ Artifactで指定したディレクトリ/
>  ├ mvnw
>  ├ mvnw.cmd
>  └ pom.xml

①のディレクトリにControllerを作成する

```java:HelloController.java
package com.example;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class HelloController {
    @RequestMapping("/")
    public String index(Model model) {
        model.addAttribute("hello", "Hello World !");
        return "index";
    }
}
```

②のディレクトリにテンプレートファイルを作成する

```html:index.html
<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
  <title>index page</title>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  <meta charset="UTF-8" />
</head>
<body>
  <p>index page</p>
  <p th:text="${hello}"></p>
</body>
</html>
```

ついでに②のディレクトリにerror.htmlを作成しておくと、エラー遷移用のページができる。

次に、mavenのコマンドでjarファイルを作成する。
プロジェクトのディレクトリに移動して、

```zsh
mvn clean package
```

とすると、srcのディレクトリと同じ階層にtargetディレクトリが作成され、
jarファイルも出来ている。

実行

```zsh
mvn spring-boot:run
```

ブラウザを起動して、
http://localhost:8080/

```text
index page

Hello World !
```

と表示されればOK!
HelloController.javaで設定した、メッセージが表示されている。


### 参考

https://qiita.com/hikarut/items/d1273f99e5b124a887bd
https://qiita.com/paty-fakename/items/c82ed27b4070feeceff6
RESTful API叩くツールには Chrome拡張のpostmanが最強(追記あり)

##公式サイト
https://www.getpostman.com/

##Chromeウェブストア
~~[Postman - Chromeウェブストア](https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop)~~

##紹介記事引用
- [RESTサービスを触る際の必須ツールPostmanを使ってみました](https://www.xlsoft.com/jp/blog/blog/2017/06/23/post-1638/)
- [Postmanを使ってWeb APIにアクセスする その1](https://sendgrid.kke.co.jp/blog/?p=8673)

##自分的気に入ってる点
- ターミナルでcurl叩くよりとっつきやすい
- curlとかと違ってGUIでheaderやJSON形式の整形してくれたり使いやすい。
- Chrome拡張で使えばChromeの同期で履歴もタブも同期してくれる。
- よく使うものはブックマークのようにフォルダ階層形式で保存可能。
- ブックマーク時には、HeaderやKeyももれなく保存してくれるから呼び出したらsendボタン押すだけ

以上です。

---
#追記
[Goodbye Postman Chrome app](http://blog.getpostman.com/2017/11/01/goodbye-postman-chrome-app/)
**曰くChrome拡張版は廃止予定で、ネイティブアプリ使えってさ。**
kvm(仮想環境) インストールと管理コマンド

長年、xenばかり使用していたがkvmに変更した。今はxenよりもkvmのほうが情報の入手がしやすいので、新規で導入する場合はkvmが多いと思う。ホストOS/ゲストOS共にdebian stretchを使った。ここでは、簡単にインストール方法・イメージ作成・管理コマンドを紹介する。 

2023-02-27 bullseye (debian11用に修正）

# インストール
## kvm本体とツール
kvm本体とツールは、全てaptコマンドでインストールする。

```
apt install qemu-kvm libvirt-clients qemu-utils libvirt-daemon-system bridge-utils libosinfo-bin virt-manager libguestfs-tools
```

## ネットワークブリッジ
ゲストOSでネットワークを利用するには、ホストOSにネットワークブリッジを構築する必要がある。最近のlinuxディストリビューションは、歴史的に使われていたeth0ではなくenp1s0を使う。古い資料を参考にする場合には注意が必要だ。

```:/etc/network/interfaces
auto lo br0
iface lo inet loopback

allow-hotplug enp1s0
auto lo
iface lo inet loopback
auto br0
iface br0 inet dhcp
      bridge_ports enp1s0
      bridge_stp off
      bridge_maxwait 0

```

ホストOSのipアドレスを固定する場合は、dhcpを記述している部分を次の例にならって書き換える。

```:ipアドレスを固定する
iface br0 inet static
      address 192.168.0.14
      netmask 255.255.255.0
      network 192.168.0.0
      broadcast 192.168.0.255
      gateway 192.168.0.1
      dns-nameservers 192.168.0.1
```

## 再起動と確認
上記まで終了したら再起動して、ホストOSでインターネットへの接続とブリッジの状態を確認する。

```:インターネット接続の確認
$ping www.google.com
```

```:ブリッジの状態の確認
#brctl  show
bridge name     bridge id               STP enabled     interfaces
br0             8000.6805ca195b65       no              enp1s0
```

 
# ゲストOSの作成
環境変数$servernameにサーバー名を設定する。

```
servername=(サーバー名)
```

## イメージの生成とゲストOSのインストーラの起動
 
次のコマンドを実行する。上記の環境変数$servernameを設定しておく。
ここでは、DISK 60Gbyte /RAM 1Gbyte /CPU 1個で設定した。


```
virt-install \
--name ${servername} \
--ram 3072 \
--disk path=/var/lib/libvirt/${servername}.img,size=60 \
--vcpus 1 \
--os-type linux \
--os-variant debian10 \
--network bridge=br0 \
--graphics none \
--console pty,target_type=serial \
--location 'http://ftp.jaist.ac.jp/pub/Linux/debian/dists/Debian11.6/main/installer-amd64/' \
--extra-args 'console=ttyS0,115200n8 serial' \
--autostart
```

## インストーラとgrub

最後にgrubを導入するとき/dev/vda を選択することにさえ注意すれば、インストーラに従えば問題ない。grubの設定後ゲストOSが再起動するが、このときgrubを操作しゲストOSを終了させ、次節のゲストOSのシリアルポートとホストOSのコンソール接続の設定を行う。この設定をしないと、ホストOSの画面には何も表示されず、ゲストOSのコンソールにログインできない。grubは起動すると、数秒で終了しOS起動になってしまうので、素早くcキーを押しgrubのコマンドラインを表示させる必要がある。コマンドラインが表示されたら、haltコマンドでゲストOSを終了することができる。

- grubの操作(メニュー)

|操作|摘要|
|---|---|
|v|メニューを下に移動|
|^|メニューを上に移動|
|(enter)|メニューを選択|
|c|コマンドライン表示|

- grubの操作(コマンド)

|コマンド|摘要|
|---|---|
|halt|電源を切る|

## ゲストOSのシリアルポートとホストOSのコンソール接続

ここでも環境変数$servernameにサーバー名を設定しておく。



## 動作確認と、ゲストOSの起動

```
# ゲストOSの一覧
virsh list --all

# ゲストOSの起動とコンソール接続
virsh start ${servername} --console

````

## ゲストOS内 console 作業

これ以降は、通常のlinuxと同様にセットアップを行う。
終了し、ホストOSに戻る場合はCtrl + ]


# 管理コマンド
よく使うkvmの管理コマンドをまとめる。これまでと同様、環境変数$servernameには、サーバー名を登録する。(スナップショット関連については、後日更新予定)
## ゲストOSの一覧

```
virsh list --all
```

## ゲストOSの起動

```
virsh start ${servername} 
```


## ゲストOSのコンソール接続

```
virsh console ${servername} 
```

終了する場合はCtrl + ]

## ゲストOSの終了

```
virsh shutdown ${servername} 
```

## ゲストOSの強制終了

```
virsh destroy ${servername} 
```

## ゲストOSの削除
(スナップショットがあれば、スナップショットを削除する。)

1.管理から外す

```
virsh undefine ${servername} 
```

2.DISKイメージの削除

```
rm /var/lib/libvirt/images/${servername}.img
```

# 更新
2018/12/28  必要なパッケージの変更
2023/02/27  debian11(bullseye)用に変更


####### 誤りやもっといい方法など、ご指摘ください。
モジュールをファイルに書き込んでみる(後半)

（この記事は、「[fukuoka.ex x ザキ研 Advent Calendar 2017](https://adventar.org/calendars/2873)」の23日目です）
昨日は @hisaway さんの[「Elixirで関数の実行速度を測定する」](https://qiita.com/hisaway/items/2f075f1705b35e829c5c)でしたね。

#はじめに
[前回](https://qiita.com/Takeshi-Kogu/items/6a49c71918a7cfd614d4)は前半として基本的なファイルの作成やコンパイルなどをしました。今回はプライベート関数の定義などをしていきます。また、関数を指す時にname/arityという記法を使用します。

#名前付き関数
def/2やdefp/2を使うことで関数やプライベート関数をモジュール内で定義することができます。ex2.exという名前で以下のファイルを作成しました。

```elixir:ex2.ex
defmodule Math do
  def sum(a, b) do
    do_sum(a, b)
  end

  defp do_sum(a, b) do
    a + b
  end
end
```
では、実際に実行していきましょう。
def/2で定義した関数は正常に動きましたがdefp/2で定義した関数はエラーが出てしまいました。これはdefp/2で定義した関数はプライベート関数であり制限がかかっているため、モジュールの中でしか呼び出すことができないのです。

```
iex> Math.sum(1,2)
3
iex> Math.do_sum(1,2)
** (UndefinedFunctionError) function Math.do_sum/2 is undefined or private
    Math.do_sum(1, 2)
```
#関数のキャプチャ
今回使用しているname/arityという記法を名前付き関数の型として使用していきましょう。iexで[前回](https://qiita.com/Takeshi-Kogu/items/6a49c71918a7cfd614d4)作成したex2.exsを動かします。

```
$ iex ex2.exs
iex> &is_function/1
&:erlang.is_function/1
iex> (&is_function/1).(fun)
true
iex> fun = &(&1 + 1)
#Function<6.99386804/1 in :erl_eval.expr/5>
iex> fun.(1)
2
```
このようなキャプチャ構文は関数を作るときのショートカットとしても使えます。&1は関数に渡された最初の引数を表しており、&(&1+1)はfn x -> x + 1 endと同等の意味を持ちます。

#まとめ
今回は前回の続きとして学習していきました。前回と比べて少し難易度が上がったかなと個人的には感じました。初心者の身として勉強を続けて、より理解を深めていく必要があると感じました。
明日は@zuminさんの「」です。お楽しみに。
[UITableview] editingStyleForRowAtIndexPath

```objective_c

- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath
{
  if (self.isDeleteMode && indexPath.row == 0) {
    return UITableViewCellEditingStyleInsert;
  }
  return self.isEditOrderMode ? UITableViewCellEditingStyleNone : UITableViewCellEditingStyleDelete;
}
```
Vagrant上でCircleCI Localを動かす

# 概要
CircleCI Localって動いたり動かなかったりしない？
私はする。つらい。

あとWindowsだと動かす手段が…
WSLですんなり動いてくれれば良いんだけど、「[WSL上でDocker Engineが動くようになっていたっぽいという話 - Qiita](https://qiita.com/yanoshi/items/dcecbf117d9cbd14af87)」で作ったDocker環境じゃすんなり動かない。（試行錯誤中）

# ってことでVagrantfileを書いてみた
https://github.com/yanoshi/vagrant-circleci


# 勘所
何も考えずにシェルスクリプトを書くと、以下みたいなエラーが出た。

```
the input device is not a TTY
```

「ターミナルがないぞ」って怒られているわけでして。 Dockerコマンドの `-it` を消せばいいらしい。
しかしDockerコマンドを叩いているのはcurlで取ってきたCircleCI CLIの中身ってことで…sedしちゃおう。

そんなこんなで下記行が生まれました。

https://github.com/yanoshi/vagrant-circleci/blob/28cd1268b8044942f2c1a5647c0289f8d0c12eae/Vagrantfile#L34
ボードゲーマーがプログラミングやってみた

#はじめに

**ボードゲーマー**の**文系**学生である私がプログラミングを勉強し始めました。
自分でオリジナルのボードゲームを作ってしまうほどアナログゲームが趣味で、更に文系である私がプログラミングを勉強しようと思ったきっかけは**インターン**です。
プログラミングを勉強している友達が多く、ずっと気にはなっていましたが、なかなか自分で勉強しようという気にはなりませんでした。
そんな中で**未来電子のインターン**を見つけました。
未来電子のプログラミング養成講座を受講することで、プログラミングへの重い腰が上がりました。


#初めてのプログラミング
私が最初に取り掛かったのはHTMLとCSSです。
プログラミングのプの字も知らなかった私ですが、**[Progate](https://prog-8.com/)**というオンラインプログラミング学習サービスで勉強を開始しました。
Progateには様々な言語のコースがあり、私は**「HTML&CSS　初級編」**というコースをから手を付けました。
コースでは、実際に手を動かしながら学ぶことができ、プログラミング全くの初心者の私でも楽しく学ぶことができました。
指示通りに打っていくとどんどん反映されていくのは楽しかった一方で、単純作業になってしまいあまり身につかない可能性があるとも感じました。
作業に満足せず、初心者なので特に**復習**することが一番重要だと感じました。
新しいことを学ぶのは難しいこともあるけど、**ワクワク**の方が勝つので、これからどんどんプログラミングを勉強していこうと思います！


#今後の予定
HTMLとCSSをある程度学んだら、PHP、jQuery、Laravel....という風に学んでいく予定です。
まずは**HTMLとCSS**をしっかり学びたいと思います。
自宅で始めるフォレンジック～分析編～

# はじめに
分析準備として、ファイルシステムを手動で判断して、LVM内部のEXT4なFSのイメージを抜き出せたので、続きはAutopsyに食わせていろいろ画像とか取り出してみる。

ツールで分析された結果だけを取り出すだけなので技術的な要素はないけど、
とりあえずフォレンジックにはこの工程があるということで最後の工程をQiitaにアップしとく。

書きぶりと内容なだけに、重要さがそれほど伝わりそうにないのは承知の上ですが
本来はこの作業が保全の次に最も大事。
ディスクフォレンジックの工程をざっくりと分けると、たぶんこんな感じかなと思う。

1. 証拠保全（容量によりけり、160GBのディスクだと2時間程度）←[初回](https://qiita.com/segfo/items/19dcd8eb4248a3eab02e)
2. 準備（技量による、慣れれば数分で終わる）←[前回](https://qiita.com/segfo/items/73bf9e4b2c3d2cc31bb3)
3. ディスクイメージの自動分析（容量やファイル数による、Autopsyを回し続けて2日かかった）←[前回](https://qiita.com/segfo/items/73bf9e4b2c3d2cc31bb3)
4. 手動分析　←　今回はここ

例えばサイバー犯罪にかかわったかもしれない！という場合には
本来4番で、この人はどういうサイトを見た（どういう情報をどこで得たのか）とか
使用されたマルウェアを開発した痕跡はあるか、とか
いつどのタイミングでどのサイトにアクセスしていたかとか
そういうのをいろいろ見て回ると思う。

が、趣味のフォレンジックなので色々なくしたデータを拾っていきたいと思う。


# 某ベガス旅行に行った時の写真が出てきた。
細かい詳細は伏せるけど、学生時代にとあるきっかけをいただいて
ラスベガスに行った時の画像がいろいろ出てきた。
保管してた大本のHDDのデータが消えてしまって、さようならしたとばっかりに思ってたけど
当時持って行ったマシンがこれで、帰りの飛行機の中で保存してたから残ってたのかな？
とはいえ結構OSの再インストールとかアップグレードとかしてたはずなのによく残ってたな。

大体2013年のころの写真（管理してた大本のHDDが壊れてさようならした写真だったけど、残ってた）

「Carved Files」だからたぶん、ファイルシステム上ではすでに管理されてなくて、自動的にファイルヘッダとか見て収集されてきた画像だろうね。
運がよかった。復元しといた。

青くハイライトしてるやつは500gくらいの肉。でかくてうまかった。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/30037/c4c8adf6-b9a7-0195-dc5e-193b1c14be53.png)

# 暗号化されたホームディレクトリ

![image.png](https://qiita-image-store.s3.amazonaws.com/0/30037/9af00fb3-b37a-8b41-a8f0-eeab8639d94d.png)

このあたりを見つつ復号してみる予定（パスワードを覚えてれば、ていうか当たれば）
https://askubuntu.com/questions/71708/how-do-i-open-access-your-private-data-desktop


もうちょっと深堀りたかったけど、時間も時間なので今日はここまで！
Ruby on Rails5 入門の前に教えて欲しい基礎

Ruby on Rails5をかじりだして
入門用とされるdotinstallをやってみたものの

もっともっと基礎の基礎の基礎と思われることが
何も理解できていないことがわかってしまった……

分かり次第追記していこうと思ってはいるものの
これを記した時点では何もわかってはいません。

なんでそんなこともわかっていないのに
RoRをやろうとしているのかと怒られるかもしれませんが
これさえわかれば、とも思うので、
http://railsdoc.com/
https://railsguides.jp/getting_started.html
https://docs.ruby-lang.org/ja/latest/doc/index.html
このへんを読みながら、書き足していこうと思います。

#以下わかっていないこと

@post のように書いたこれは何？
> インスタンス変数のこと
>>特定の オブジェクトに所属しています。インスタンス変数はそのクラスまたはサブクラスのメソッドから参照できます。初期化されていないインスタンス変数を参照した時の値はnilです。


>Controllerの中に書くアクションの中で定義した変数を指すときに使う
@があることで、その変数アクションに書いてあるで。という意味になる
>>どっちかといえばこっちか？

post と書いた場合は？
> ローカル変数のこと
> あるいはその名前のメソッドの呼び出し
>>・小文字または _で始まる識別子はローカル変数またはメソッド呼び出しです。
・ローカル変数スコープ(クラス、モジュール、メソッド定義の本体)における小文字で始まる識別子への最初の代入はそのスコープに属するローカル変数の宣言になります。
・宣言されていない識別子の参照は引数の無いメソッド呼び出しとみなされます。

$post　のように書いたときは
> グローバル変数のこと
>>プログラムのどこからでも呼び出しが可能
いろいろなところから参照したいようなものはこう書くということか

Post　とか　POST と書いたときは
> 定数として定められます。
>>・アルファベット大文字 ([A-Z])で始まる識別子は定数です。 定数の定義 (と初期化) は代入によって行われます。
・メソッドの中では定義できません。一度定義された定数に再び代入を行おうとすると警告メッセージが出ます。
・定義されていない定数にアクセスすると例外 NameError が発生します。

　post.title のように書いたときの
↑ここと↑ここのそれぞれの呼び名
>オブジェクト.変数　たぶん
>もしくはオブジェクト.メソッド

post_comment_path(@post, comment)
のときのように書いた場合の
_　で結ぶ意味や理由
>調査中

|f|　これで挟んだときの呼び名と何を示しているか
> 呼び名未だ不明　(オブジェクト？)
>>挟まれた中身は変数である必要がある？
|f|やら|i|やら|num|やらが見つかる。
特に1文字でなければいけないとかいうことは無いようだ
>>> do |f|
処理 処理 処理
end
みたいにするときに、処理中に使われる変数を書くようだ。
||で挟んだらそれが宣言と同じ扱いになる…でいいのかな？

ちなみに

>f.read
>>みたいな形で d |f|　以下に処理が書かれていることが多く
>>.read はメソッドと呼ぶ。
 それぞれのメソッドは定形で、どんな働きがあるかはリファレンス見ると良さそう

配列.each do|f|
>配列の0から順番に取り出して処理を実行する
多分最後までやったら完了的な感じ

<%  %> これで挟んだときの呼び名
<%= %> これで挟んだときの呼び名
>Ruby言語で書かれた命令文をこの中に書く
<% ～ %>と書いたら、処理だけ行う
<%= 〜 %>と書いたら、処理して、その結果の値を出す

<% %>で書くのはhtmlの中(View)に書く時の話。
　
<% end %>　これをつけなければいけないタイミング
>Ruby言語で書かれた文章を終了させるときに書く。けじめ

created_at: のような後ろに :をつけた物の名前
>オプション　と呼びます。
なんかいろいろ種類があるらしいので調査中

:id　のような前に　:を付けた物の名前
それぞれどういうときに使うのか
>シンボル と呼ぶ（多分）
>>プログラム中のどこでも同一のオブジェクトを名前で表せるようにしたもの
:id ←これをサンプルではちらほら見かけたので、
各所で中身は違うけどidと呼ばれるものを使う。　みたいなときは
ひとまず :id で良いという感じなのだと思う。

オブジェクトに値を渡すときに()でくくってある時
>doc = Nokogiri::HTML.parse(html, nil, charset)
みたいなやつ。
>> doc の中には htmlを読み込んで得られた
>> html, nil , charset の3つについてデータが入ってるよ
>> ってことであってるのかしら



#以下ググったりなんだりで出てきた情報の備忘録

###”コントローラはクラスとして定義されましたが、アクションはクラスの中のメソッドとして定義します。”

###"render" とは　そういうメソッドのこと
>パーシャルと呼ばれる部分テンプレート(View)を
レンダリング(表示)してくれる機能のこと。
controllerとViewのどちらでも使える。

### require 'なんとか'

>と書くと、インストール済みのライブラリを読み込むことができる。

###　Get と　Post がどう違うか
いろいろなことはさておき、なるほどと思ったのは以下の説明
>Get　は対象URLにそのままアクセスすること
Post は対象URLに何らかのデータを持ち込んでアクセスすること
なので、とりあえずアクセスするなら全部Getだし
なんらかの入力欄があったら全部Post