OmniAICreator/Qiita-1.07M huggingface dataset:
複数のソースコードファイルのパッチをまとめて作る

# はじめに

複数のソースコードファイルを修正してまとめてパッチを作りたい時ってありませんか．
自分は，あったのでメモ程度に

# コマンド

オリジナルのソースコードがあるディレクトリ(generic_src_dir)と修正したソースコードがあるディレクトリ(custom_src_dir)を用意し以下のコマンドを実行．
例として拡張子が"[csSh]"の場合

```sh
$ find generic_src_dir -name "*.[csSh]" -printf "%P %f\n" | awk '{print "diff -up generic_src_dir/" $1 " custom_src_dir/" $1 " > " $2 ".patch && if [ -s " $2 ".patch ]; then :; else rm -f " $2 ".patch ; fi" }' | sh
```
#　使用例

linuxのソースコードで，
① kernel/fork.c
② arch/x86/kernel/head64.S
③ include/thread_info.h
の3つのソースコードを修正した場合

```sh
$  ls
custom_linux_src  generic_linux_src
$  find generic_linux_src -name "*.[csSh]" -printf "%P %f\n" | awk '{print "diff -up generic_linux_src/" $1 " custom_linux_src/" $1 " > " $2 ".patch && if [ -s " $2 ".patch ]; then :; else rm -f " $2 ".patch ; fi" }' | sh
$ ls
custom_linux_src  fork.c.patch  generic_linux_src  head_64.S.patch  thread_info.h.patch
```

以下のパッチが生成されていることがわかります．
① fork.c.patch
② head_64.S.patch
③ thread_info.h.patch
【Rails】deviseのまとめ

## deviseとは
railsでwebアプリケーションを作成する際に、
簡単に**認証機能（ログイン・ログアウト）を実装することができるGem**のこと

## 導入
#### ①Gemfileを編集
```ruby:Gemfile
source 'https://rubygems.org'

# 省略

gem 'devise'
```
#### ②インストール
```terminal:terminal
$ bundle install
```
これでGemのインストールが完了

## 設定
#### ① deviseの設定ファイルをアプリケーションにインストール
```terminal:terminal
$ rails g devise:install
```
#### ② deviseで認証するためのモデルを作成
```terminal:terminal
$ rails g devise User 
```
#### ③ migrationファイルの読み込み
```terminal:terminal
$ rake db:migrate
```
これでモデルとDBの作成が完了

## 表示の確認
サーバーを起動し、以下のURLへアクセスすると画面の表示を確認することができる。
##### サインアップ（新規登録画面）
http://localhost:3000/users/sign_up
##### サインイン（ログイン画面）
http://localhost:3000/users/sign_in

## deviseのモジュール
作成したUserモデルの、devise以降に記述されているものが使用できるモジュール。

```ruby:user.rb
class User < ApplicationRecord
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable
end
```
各モジュールの機能一覧
（● = デフォルトで使用できるようになっているもの）

| 機能 | 概要 | デフォルト |
|:--|:--|:--|
| database_authenticatable | サインイン時にユーザーの正当性を検証するためにパスワードを暗号化してDBに登録します。認証方法としてはPOSTリクエストかHTTP Basic認証が使えます。 | ● |
| registerable | 登録処理を通してユーザーをサインアップします。また、ユーザーに自身のアカウントを編集したり削除することを許可します。 | ● |
| recoverable | パスワードをリセットし、それを通知します。 | ● |
| rememberable | 保存されたcookieから、ユーザーを記憶するためのトークンを生成・削除します。 | ● |
| trackable | サインイン回数や、サインイン時間、IPアドレスを記録します。 |
| validatable | Emailやパスワードのバリデーションを提供します。独自に定義したバリデーションを追加することもできます。 | ● |
| confirmable | メールに記載されているURLをクリックして本登録を完了する、といったよくある登録方式を提供します。また、サインイン中にアカウントが認証済みかどうかを検証します。 |
| lockable | 一定回数サインインを失敗するとアカウントをロックします。ロック解除にはメールによる解除か、一定時間経つと解除するといった方法があります。 |
| timeoutable | 一定時間活動していないアカウントのセッションを破棄します。 |
| omniauthable | intridea/omniauthをサポートします。TwitterやFacebookなどの認証を追加したい場合はこれを使用します。 |

## ヘルパーメソッド

deviseをインストールすると使用することができるメソッドの一覧

| メソッド | 用途 |
|:--|:--|
| before_action :authenticate_user! | コントローラーに設定して、ログイン済ユーザーのみにアクセスを許可する |
| user_signed_in? | ユーザーがサインイン済かどうかを判定する |
| current_user | サインインしているユーザーを取得する |
| user_session | ユーザーのセッション情報にアクセスする |

※モデル名にUser以外を使用している場合、それぞれのメソッドの『user』部分を書き換える

```ruby:モデル名が「member」の場合
before_action :authenticate_member!
member_signed_in?
current_member
member_session
before_action :authenticate_member!
```

## 参考
- [[*Rails*] deviseの使い方（rails5版）](https://qiita.com/cigalecigales/items/f4274088f20832252374)
- [Rails deviseで使えるようになるヘルパーメソッド一覧](https://qiita.com/tobita0000/items/866de191635e6d74e392)
Git pushで403吐かれた....

普通はこう

```bash:.git/config
url = https://github.com/ユーザー名/リポジトリ名.git
```

こうしてやればうまく行く

```bash:.git/config
url = https://ユーザー名@github.com/ユーザー名/リポジトリ名.git
```

自分が所属しているグループのリポジトリにpushするためには.

```bash:.git/config
url = https://ユーザー名@github.com/グループ名/リポジトリ名.git
```

これらをmasterとして登録すると.git pushで両方にpushできるみたい.

```bash:.git/config
[remote "origin"]
        url = https://ユーザー名@github.com/ユーザー名/リポジトリ名.git
        fetch = +refs/heads/*:refs/remotes/origin/*
        url = https://ユーザー名@github.com/グループ名/リポジトリ名.git
        fetch = +refs/heads/*:refs/remotes/origin/*
```

多分

[remote "origin"]のところを[remote "mine"]とかにして追加すると,
push先を変更できたりするのかもしれない.
railsでカラムを増やす方法

##マイグレーションファイル作成##
```erb
$ rails g migration AddTitleToMessages title:string
```
`rails g migration Addカラム名Toテーブル名 カラム名:データの型`

```erb
$ rails db:migrate
```

###カラム追加後にやるとこ###
- Modelのvalidates追加
- ControllerのStrong Parameterの許可
- Viewの修正
Memcached 1.5.13でTLS対応された

4/15日にリリースされた、Memcached 1.5.13でTLS対応が入った ([Memcached 1.5.13 Release Notes](https://github.com/memcached/memcached/wiki/ReleaseNotes1513))

とりあえず試す

## ビルド

```bash
$ wget wget http://www.memcached.org/files/memcached-1.5.13.tar.gz
$ tar zxvf ./memcached-1.5.13.tar.gz
$ cd ./memcached-1.5.13
$ ./configure  --enable-tls
$ make
```

## 動作確認
サーバ起動

```bash
$ ./memcached -Z -o ssl_chain_cert=~/server.crt -o ssl_key=~/server.key
```

クライアント

```bash
$ openssl s_client -connect localhost:11211
(略)

version
VERSION 1.5.13
set key1 0 0 6
123456

CLIENT_ERROR bad data chunk
```

なんかおかしい....要調査
ラズパイにやっすいLCDディスプレイをつないでI2Cで通信させて使う

せっかく登録したのに記事も書かないのはアレなので、しょうもない内容ですが同類の初心者に少しでも役だててもらえると嬉しいです。
  あとマークダウンの書き方の練習。でも半角スペース使わなくても改行するんですね。

## 目的
- 計測補助ツールとしてラズパイを活用する。
- 表示系としてLCDディスプレイ（I2C）を使用する
- やっすいのでなんとかしたい
- 簡単になんとかしたい


## 使うもの

- ラズパイ2&Raspbian：会社で遊んでいるので、プライベートでは3を買いたい。
- waves 1602 IIC/I2C/TWI LCD液晶 モジュール Arduino：700円以下だったので
  
## 方法

#### 参考にしたページ
Raspberry Piで学ぶ電子工作でオソヨーのLCDを使ってみました。
https://became-free.com/osoyoo-lcd/
Drive i2c LCD Screen with Raspberry Pi
http://osoyoo.com/2016/06/drive-i2c-lcd-screen-with-raspberry-pi/

####設定手順

- 上のURLのページをみて作業します。以上！
- だと怒られるので以下に補足程度に書きます。基本はURLとググルほにゃくでいける
- それでもダメならコードをググればなんとかなる。と思う。


設定I2c有効はGUIでもできるのでたぶんみんな大丈夫。（じゃないですかね）
nanoつかうところでちょっとん？となると思うので、
オソヨーさんのページ（下URL）の通りなのですが

```python

sudo nano /etc/modules
```
とターミナルで入力すると

![11.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352982/bec0c27d-2044-4543-b8bd-536de418e5ae.jpeg)

こんな感じの画面になります。nanoっていうエディタで/etc/modulesってとこを開いています。
ここに使うモジュールを追加していくわけですね。（んだとおもってます）

> modulesファイルに次の2行が存在しない場合は追加します。
i2c-bcm2708 
i2c-dev
次にCtrl XとYesを入力してファイルを保存します。

↑のとおり入力して操作してやります。文字列はコピペでおｋ
あとはほんとURLの通りで

> smbusとi2c pythonライブラリのインストール
端末に次のコマンドを入力します。

```python

sudo apt-get update
sudo apt-get install -y python-smbus i2c-tools
sudo reboot
```
aptgetの更新とsmbusのインストールですね。
再起動はいるそうなのでやりました。なしでもいいとかはわかりません。

####確認と実行

ここまできたら後はディスプレイを接続した状態でやります。
むろんURL先のとおりに接続します。画像用意は大変。
そして以下のコマンドを送るとI2Cで接続されているアドレス一覧を見れます。

```python
sudo i2cdetect -y 1
#または
sudo i2cdetect -y 0
```
１と０はバスを示しています。どちらかに3Fとか27がいるはず。
そいつがルパｎ…ディスプレイのアドレスです
どんな表示かって？↑のURLを…みれば…

2つ表示されてる？どちらのバスにもなんか居る？
そこまでできる方は僕より上級者ですね。ぼくわかんないや

そしていよいよサンプルプログラムを動作させます。

```
wget http://osoyoo.com/driver/i2clcdb.py 
sudo python i2clcdb.py
```
上記はネット環境が必要です。aptgetでも必要だけど
wgetでURLから "i2clcdb.py" をダウンロードしてきています。
でpythonで起動してます。これpython3でやりたければ、３をつけてあげます。

でI/Oアドレスがディスプレイのモデルで違うようなので、あなたが買ったやつ次第では

```
wget http://osoyoo.com/driver/i2clcdb.py 
sudo python i2clcdb.py
```
を試すと幸せになれるやもしれません。

####プログラムの編集について
でも表示させるのにサンプルのままなわけないでしょ。ってことで
以下の部分がサンプルの最下層なはずです。

```python：i2clcdb.py
～～～～

def main():
  # Main program block

  # Initialise display
  lcd_init()

  while True:

    # Send some test
    lcd_string("Created by         <",LCD_LINE_1)
    lcd_string("Osoyoo.com        <",LCD_LINE_2)

    time.sleep(3)
  
    # Send some more text
    lcd_string("> Tutorial Url:",LCD_LINE_1)
    lcd_string("> http://osoyoo.com",LCD_LINE_2)

    time.sleep(3)

if __name__ == '__main__':

  try:
    main()
  except KeyboardInterrupt:
    pass
  finally:
    lcd_byte(0x01, LCD_CMD)
```

ここの↓の部分で

```python

    # Send some test
    lcd_string("Created by         <",LCD_LINE_1) #一行目に" "の中を表示
    lcd_string("Osoyoo.com        <",LCD_LINE_2) #二行目に" "のなかを表示

    time.sleep(3)　#三秒待って
  
    # Send some more text #こっちに表示を更新する
    lcd_string("> Tutorial Url:",LCD_LINE_1) #同上
    lcd_string("> http://osoyoo.com",LCD_LINE_2) #同上

    time.sleep(3) #また三秒待つ
```

ということをやってますので、自分で変更したらいろいろできます。
実際に使うとなれば　`def main` を適当な名前に変えて
自分のコードに `import i2clcdb`　といれてから
関数として呼び出すのがスマートだし早いのでは。
自分は更新のタイミングをいろいろ細工したかったので、結局書き足して使いました。
なんてところはまた別の人の開設をみていただければと思います。

というわけで、すべてのビギナーに幸あれ。
railsのvalidatesとエラーメッセージ

### 書き方

```rb
before_action { self.email.downcase! }
validates :content, presence: true, length { muximum: 255 }
validates :email, presence: true, length { maximum: 255 },
                  format: { with: /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i },
                  uniqueness: { case_sensitive: false }
```

- `presence: true` => 空欄不可 
- `format: { with: /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i }` => 正規表現
- `uniqueness; true`   => 重複不可
- `case_sensitive: false` => 大文字小文字を区別しない
-  `numericality: { only_integer: true }` => 数値(正規表現)のみ許可
 
### エラーメッセージ

```erb
<% if message.errors.any? %>
  <div id="error_explanation">
    <ul>
      <% message.errors.full_messages.each do |msg| %>
        <li><%= msg %></li>
      <% end %>
    </ul>
  </div>
<% end %>
```
自分用勉強メモ2日目

# ksnctfの問題を解く

[ksnctf writeup](https://qiita.com/gky360/items/bf52feef8f0b7ba2cfbc) を参考にした．

## [3 Crawling Chaos](http://ksnctf.sweetduet.info/problem/3)

javascriptのコードであることがわからなかった．
jsに触れたことなかったのでwrite-upそのままコピペ．

## [4 Villager A](http://ksnctf.sweetduet.info/problem/4)

脆弱性を突いてスタックの値を書き換え，任意のコードを実行させればいいらしい．
難しくて理解が追いつかなった．

# format string attack

[フォーマット文字列攻撃](https://www.ipa.go.jp/security/awareness/vendor/programmingv2/contents/c906.html) はprintfとかを利用して関数のリターンアドレスを書き換えるもの．

共有ライブラリのシンボルを解決するときに以下の2つを使う．
- GOT(Global Offset Table)
- PLT(Procedure Linkage Table)

リンカはライブラリ関数を呼ぶコードにPLT経由でGOTを参照させる．
ローダは実際にメモリ上に展開された共有ライブラリのアドレスでGOTを書き換える．
つまり，
    *PLT→GOT→メモリ上に展開された共有ライブラリのシンボル*
いまいち仕組みが理解できていない．

# tips

macでoptionを押しながらWi-FiアイコンをクリックするとBSSIDや転送レートなどの情報を参照することができる．
Rで統計解析：お弁当の色彩の豊かさ


この４月から子供が高校に進学した。同時に、お弁当を作る日々が始まった。

まぁ、それ自体は構わない。しかし、もう４〜５年前になろうか、何かの機会に小学生だった子供に弁当を作って持たせた時、同級生から「色彩がないね」と言われた、とのお言葉を帰宅した子供から頂いた。つらい。

となると、色彩の豊かさをスカラー値で表現してみたい、と思うのが普通である。

弁当の写真を撮って、その彩りの豊かさを評価する方法があれば、改良のモチベーションを保つのに役に立つ。と思ってちょっとググってみたがよくわからない。ので、彩りの豊かさの数値化を考えた。一つの色は一つの波長だろうとも思うが、写真データは RGB に分解されているので、その比が色ということになるだろう。でいまどきの写真は勝手にコントラストやらが調整されていたりするが、まぁ安易に考えると、色彩の豊かさ数値化アルゴリズムはこんな感じになろうか。

　1. 明るい点と暗い点を５％ずつくらい捨てる
　2. 各点で RGB の三値から比を二回取る $r = B/(G/R) $
　3. $r$ の分散を計算する

この最後の値が大きいほど彩り豊か、という判断である。Ｒスクリプトを書いて、試しにおかず部分だけ切り出した、だいぶ彩りの様子の違う画像３枚に対して計算してみたところ、0.0357、0.0548、0.0574 であった。数値だけを見てもなんとも分からないが、弁当を作るたびに継続的にこの値の変化を見ていけば、参考にはなろう。

```R
library(jpeg)

# 弁当の写真のファイルは、JPEG フォーマットで拡張子は JPG に固定
# カレントディレクトリでファイル名に "JPEG" を含む全てのファイルが対象
# 画像の各ピクセルについて計算した R3 の値の分散値を彩りの豊かさを判断材料にする
for (f in list.files(pattern = "JPG")) {
  img  <- readJPEG(f);                    # 画像を行列に読み込み
  L    <- 3 * 0.05;                       # 暗い方の閾値
  U    <- 3 - L;                          # 明るい方の閾値
  m    <- img[,,1] + img[,,2] + img[,,3]; # 輝度値合計 0 <  m  < 3
  imgR <- img[,,1];                      # 赤の輝度値 0 < img < 1
  imgG <- img[,,2];                      # 緑の輝度値
  imgB <- img[,,3];                      # 青の輝度値
  imgR <- imgR[(m > L) & (m < U)];       # 暗すぎる|明るすぎる点を捨てる
  imgG <- imgG[(m > L) & (m < U)];       # 暗すぎる|明るすぎる点を捨てる
  imgB <- imgB[(m > L) & (m < U)];       # 暗すぎる|明るすぎる点を捨てる
  R1   <- imgG/imgR;                     # 緑と赤の比
  R2   <- imgB/imgR;                     # 青と赤の比
  R3   <- R2[R1 != 0] / R1[R1 != 0];     # 上の二つの比の比
  cat(f, var(R3), "\n");                 # 二つの比の比の分散
}
```

![bento1.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/377279/9b8fbc6e-c5f6-bd0c-e947-fc7146173680.jpeg)0.0357
![bento2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/377279/7b65a38b-cb17-79c2-3745-9f9af4620063.jpeg)0.0548
![bento3.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/377279/ab64a260-d950-e66b-6592-a83b6507568b.jpeg)0.0574

R のシンタックスハイライトでは、変数名に数字は入らない方がよさそうだ。
gitclone間違えてクローンしたので削除した話

###はじめに
初学者のアウトプット備忘録記事です。
ご指摘アドバイスありましたらよろしくお願いします。



#gitclone間違えてクローンした（泣）

今回もカリキュラムでAWS使ってデプロイしよう〜なところなのですが、コマンド、コマンド、コマンドでデプロイするまでに誤字脱字や操作ミスでかなり手こずってます。

得意の早とちりでgithubにpull,pushしてからgitcloneしなくちゃいけなかったのを、先にgitcloneしてしまったのです。（泣）


その後からpushしとけば上書きされるっしょ？？って考えでやってたんですが、エラー発生。
で、調べたところgitcloneのローカルリポジトリを一回削除して再gitcloneするのがいいようでした。

```
$ cd ..
$ rm -rf {レポジトリ名}    #削除
```

自分はこちらのrm -rf {リポジトリ名}で削除して無事に再gitcloneすることができました。
これもちょっとハマりました。
今後気をつけます。


####参考にした記事

他のコマンドもまとめられてます。
今回は削除しかしてないけども。

Git 不要になったローカルリポジトリの削除方法は？
https://ja.stackoverflow.com/questions/5734/git-%E4%B8%8D%E8%A6%81%E3%81%AB%E3%81%AA%E3%81%A3%E3%81%9F%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E3%81%AE%E5%89%8A%E9%99%A4%E6%96%B9%E6%B3%95%E3%81%AF
DockerのGUIツール

Dockerの操作はコマンドで行う場合が多いですが、
Docker for Windowsの場合は、Kitematicと合わせて利用すると直感的になります。

またWebベースのPortainerも使いやすいです。

#Kitematic
ダウンロード： https://kitematic.com/

解凍した後、Kitematic.exeをダブルクリックし、Dockerが自動検知されます。
Dockerがない場合はインストールする必要があります。

Docker Hubからコンテナ作成できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346425/f471f5b1-9634-41fa-d2af-e98446de67c2.png)


Gitlab-ceの起動画面：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346425/1e073afe-e286-0dbf-da26-ecd6bc4fbd32.png)


設定画面：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346425/c3a86032-0586-5771-3cf7-f34067d69906.png)

ポート：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346425/9fcac707-7fff-b781-9e47-ebe26e6915a5.png)

Volumes：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346425/8d74ab60-c013-ebbc-e188-9575e179f2b8.png)


#Portainer 
Hyper-v,Virtual-boxなどのDockerを管理したい場合は、WebベースのPortainerは便利です。
Portainer： https://github.com/portainer/portainer

インストールは簡単です。
>docker volume create portainer_data

>docker run -d -p 9000:9000 --name portainer --restart always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer

起動後は、IPから DockerサーバIP:9000/#/dashboard でアクセス。

Application templatesからコンテナ作成できます。
Application templates：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346425/1f887511-4f48-e84b-7af4-2652e38d7139.png)

ダッシュボード：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346425/41ccbe9c-3d69-54e8-67e7-453758768311.png)

コンテナ一覧：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346425/8dd348f5-1524-d87d-9b3d-f0914d782ba4.png)

起動、削除、追加、ログ確認など、いろいろできます。

コンテナ詳細：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346425/d1d5ed3f-3b8e-8d53-9580-1c7b8a7687ca.png)


以上
MacのLaunchpadにアプリケーションが重複する問題

# はじめに
Macbook ProのLaunchpadでアプリケーションが重複して表示されるという問題が発生し，無理矢理解決しました．同じ問題が発生した人の役に立つことを願い，投稿します．
MacOSのバージョンおよびMacBookの構成は以下．

```:MacbookPro
・macOS Mojave 10.14.4
・Touch barなしモデル
・第７世代2.5GHzデュアルコア
・Intel Core i7プロセッサ（Turbo Boost使用時最大4.00GHz）
・Intel Iris Plus Graphics 640
・16GB 2.133MHz LPDDR3メモリ
・512GB SSDストレージ
```

## TL;DR
以下のコマンドを実行すると直った（自己責任で！）。

```bash:Launchpad reset
defaults write com.apple.dock ResetLaunchPad -bool true; killall Dock
```

# 発生した問題
急にLaunchpadに一つのアプリケーションが重複して２つ置かれていた．

## 問題の細かいメモ

- ２つ表示されていたアプリケーションはVivaldi
- ２つのアイコンは同じアイコンではあるが，大きさは若干異なっていた
- 片方のアイコンはクリックすると正常に動作，もう片方は起動していてDockには表示されるのだがアプリケーションは起動しなかった
- 動く方のVivaldiを本物，動かない方のVivaldiを偽物と呼ぶことにした
- Dockに表示された偽物のVivaldiを選択時，Mac画面上部の「ファイル」「編集」などの項目を確認したところ，一部（というかほとんど）使用できなかった

## 対処
全体を通して以下の方法を試した．

1. Launchpadから削除できないか試す
2. Applicationフォルダを確認して整理
3. 再起動
4. Launchpadを初期化

### 1. Dockから削除できないか試す
まず単純に，Dockから直接削除できないか試した．

```：方法
・Launchpadでクリックを2秒ほど続けると`x`マークがでる
・LaunchpadでOptionキーを押すと`x`マークがでる
```
どうやら，この方法ではApp Storeからインストールしたアプリケーションしか削除できないようだ．

### 2. Applicationフォルダを確認して整理
MacではApplicationフォルダにおいた`.app`フォルダがLaunchpadに表示される．そのApplicationフォルダは

```:Application Folder Location
/Application
~/Application
```

の二つであり，それらを見たところ，なぜか`Vivaldi.app`が両方に存在した．これが原因と考え，どちらが偽物か確かめるために，

```:ターミナルからアプリケーションを起動確認
/Application $ open Vivaldi.app
~/Application $ open Vivaldi.app
```

とどちらが起動するか確認したところ，どうやら`/Application/Vivaldi.app`が本物で，`~/Application/Vivaldi.app`が偽物のようであった．そこで，念の為削除はせずに

```:偽物をどかす
~/Application $ mv Vivaldi.app ~/temp/
```

と偽物を`Application`フォルダから移動した．そこで，Launchpadを確認したところ，偽物は消えていなかった．

### 3. 再起動
`~/Application`に偽物がない状態でMacの再起動をしたのだが，Launchpadの偽物は表示されたままであった．

### 4. Launchpadの初期化
これ以上効果的な対処法を考えられなかったため，諦めてLaunchpadを初期化することにした．方法は[こちら](https://apple.stackexchange.com/questions/300109/how-to-reset-launchpad-order-in-macos-high-sierra)や[こちら](https://apple.stackexchange.com/questions/150965/how-to-reset-launchpad-ordering-in-os-x-yosemite/150973#150973)に記載されており，

```bash:Launchpad reset
defaults write com.apple.dock ResetLaunchPad -bool true; killall Dock
```

と実行すると良い．実行は自己責任で！
最後に

```:偽物削除
~/temp $ rm -r Vivaldi.app
```

# 結果
Launchpadの並びは初期化されたので，元に戻すために時間がかかったが，問題が解決したのでよかったです．
他に解決方法があったなら教えていただけると幸いです．
Unityで何も変更をしていないのにSceneに差分が発生する件

## Unityで何も変更をしていないのにSceneに差分が発生する件
Gitでとあるプロジェクトをローカルに落としてUnityで起動したところ、ヒエラルキービューにSceneを置いただけでそのSceneに差分が発生してしまうという現象が起こりました。

Git管理をしていると、変更したつもりもないのに変更が発生するため少し困ってしまいます。

調べた結果これはUnityのバージョンアップによるものでした。なので、コミットしても問題はなさそうです。
## 終わりに
私は現在、Web3のサービスの開発をしています。詳しくはこちらの記事をご覧下さい。
        [無料でイーサリアムが当たる、Web3時代の寄付サイトを作った話](https://note.com/kenroda/n/n814347fbdcd7)
mrubyでタッチパネル

mrubyで小型の液晶で良く採用されているXPT2046というタッチパネルのコントローラーからデータを拾ってみました。

![スクリーンショット（2019-04-19 23.35.20）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/d6039369-433a-eb17-aa0f-0377a968b727.png)

データ量が少ないので、mruby-bsdgpioで1ビット単位での処理になります。

```ruby
CS = 163
DCLK = 164
DOUT = 166
DIN = 165
PENIRQN = 130

XPOS = (0x80 | 0x50)
YPOS = (0x80 | 0x10)

def getxy(g)
  g.set(DCLK, 0)
  g.set(CS, 0)
  g.set(DIN, 0)
  x = 0
  y = 0
  trans = 8 * 5
  trans.times do | n |
    if n <= 7 && (XPOS & (1 << (7 - n))) != 0
      g.set(DIN, 1)
    elsif n >= 16 && n <= 23 && (YPOS & (1 << (23 - n))) != 0
      g.set(DIN, 1)
    else
      g.set(DIN, 0)
    end
    g.set(DCLK, 1)
    bit = g.get(DOUT)
    g.set(DCLK, 0)
    if n >= 8 && n <= 19
      x = x | (bit << (19 - n))
    end
    if n >= 24 && n <= 35
      y = y | (bit << (35 - n))
    end
  end
  g.set(CS, 1)

  return [x, y]
end

g = BsdGpio.new(0)

g.setflags(PENIRQN, BsdGpio::INPUT)
g.setflags(CS, BsdGpio::OUTPUT)
g.setflags(DCLK, BsdGpio::OUTPUT)
g.setflags(DIN, BsdGpio::OUTPUT)
g.setflags(DOUT, BsdGpio::INPUT)

g.set(CS, 1)

while 1 do
  if g.get(PENIRQN) == 0
    p "TOUCH"
    p getxy(g)
    sleep(1)
  end
end
```

この処理はSPIと同じでSPIドライバーがあればそれでも処理できるのですが、今回試したAllwinner A10のSPIドライバーが無かったのでGPIOのBitbangでの処理しました。

12ビットなので0-4096ですが、自分の手元にあった2.8インチのモジュールではx,yとも300-1600くらいの値のようです。

このチップはへんなアクセスをすると、ハングアップしてしまい、電源を切っても復帰せず結構手間がかかりました。
初学者が2ヶ月間で遭遇した問題と解決方法(ビュー編)

# はじめに
スクールで初めてプログラミングに触れて約２ヶ月。カリキュラムで与えられた課題を作成中に遭遇した問題と解決方法をまとめます。将来見返した時、このミスはもうやらないでしょと成長を実感するため、すごく初歩的なミスも含め、記述します。この記事ではビュー作成時の受難を記述。

### CSSの記述を変更しても反映されない
ざっくりとした問題ですが、何回も遭遇しているので・・・。
原因は様々です。検索すれば、原因リストが列挙されてますが、個人的に意外だったものと、やらかしたものを4点上げます。

- クラス名合ってますか？
初歩的なのですが、何回かここが原因でした。ビューが少ないなら問題ないのですが、複数枚のビューの記述をしていると、名前を間違えてCSSに記述していたり、HTMLでクラス名変更したのをCSSで変更忘れたり、ケアレスミスですね。反省。

- 単位つけてますか？
初歩的なやらかし案件その２。高さや幅指定、topやleftの位置調整するときにpxつけ忘れてました。動くときは単位なくても動くので、動かないときあるんですか！？となりました。
また、単位つける、つけない問題は奥がそこそこ深そうなので、またまとめてみます。

- ネスト変えてみましょう
haml/scssでネスト(入れ子構造)使っているときは、試してみましょう。scssのネストとhamlのネストが不一致だとクラス名が合っていようが、単位をつけていようが見た目に変化はありません。不慣れなうちは概ねネストのせいでした。

- キャッシュ削除してみましょう
これは意外な解決法でした。CSSもHTMLも目を皿にして確認しても間違いはないと確認したら、キャッシュ削除を試してみましょう。あら不思議！動くようになりました！！

### hamlの書き方が覚えられない
上記で名前出しましたが、後半はhamlを使ってました。正直なところ「〇〇が覚えられない」の解決法は、覚えられるまで色々試した上で覚えられないなら諦めて、都度調べましょう、そしてメモに残しましょうが最適解だと個人的に思っています。
また、身も蓋もない解決法ですが、html to hamlで検索するとHTMLからhamlに変換してくれるサイトがあったり、erb2hamlというGemを入れれば、コマンド１つでで拡張子erbをhamlに変換できるので、最終手段としてそれらに頼りましょう。

```
gem 'erb2haml'をインストール後、下記コマンド実行で変換できます。
$ rake haml:replace_erbs
```

### variable.scssを読み込まない

SCSSの長所である変数化をvariable.scssファイルに記述したものの、エラーが出てしまうとき、1点目、ファイル名の拡張子がscssであること、2点目、application.scssに@ import "variable";(※無関係なユーザーにリンクが繋がるので＠の後にわざと半角でスペースつけました)と正しく記述できていることを確認してもなおエラーが出る時は順番を見てみましょう。header.scssに変数を記述している場合を想定します。

```application.scss
#下記はエラーが出る順番
@import "header";
@import "variable";

#下記はエラーが出ない順番
@import "variable";
@import "header";
```
(importがカラフルになるのなんでですか・・・)
上から順に読み込まれるため、変数を利用しているファイル名がvariableより上にあるとエラーが出ます。 そのため、variableを変数を利用したファイルより上部に記載することで解決します。

# 終わりに
初めての投稿となりますが、アウトプットとして実際に書いてみると難しいですね。文章の構成、内容の正しさに不安が残りますが、何かお気づきの点がありましたらご指摘ください。
Git はじめてみた

いままでSVNを使っていて、Gitで混乱してるので、まとめまとめ。
ちょくちょく追記していく予定。

#Git基本用語
####リモートリポジトリ
大本のリポジトリ
**push**でここにマージする

####ローカルリポジトリ
個人のリポジトリ
**commit**では、ここに記録される

####GitHub
リモートリポジトリを置いておくクラウドサービス
ソースを公開して、チェックもしてもらえる。
有料アカウントのみ非公開に出来る。

#Git構築流れ
##初期設定
###1. Gitをインストール（詳しくは略）
Configuring the line ending conversions以外はデフォルトで。
###2. 初期設定
####全体設定
`C:\Users\{username}\.gitconfig`に書き込まれる。
`git config -l --global` で設定確認。

#####・ユーザー設定
```
$ git config --global user.name "ユーザー名"
$ git config --global user.email "メールアドレス"
```
"" を省けば、確認出来る。

#####・ファイルの大文字・小文字を区別
```
$ git config --global core.ignorecase false
```
#####・日本語のファイル名の文字化け防止
```
$ git config --global core.quotepath false
```


####プロジェクト毎（ローカル）設定

各ローカルリポジトリのフォルダに入って、

```
$ git config --local user.name "ユーザー名"
$ git config --local user.email "メールアドレス"
```

`gitリポジトリ/.git/config`に書き込まれる。

##プロジェクト初回流れ（リモートリポジトリ作成から）
####1. リモートリポジトリ作成（今回はGitHub使用）
GitHubにログインして管理画面から「New repository」ボタンをクリック。

***Repository name：***リポジトリ名 
***Description：***リポジトリの説明
***Publicを選択***　※Privateは有料会員のみ
***README：***READMEファイルを作成する場合のみチェックを入れる

設定したら「Create repository」をクリック。
「Clone or download」で出てくるURLをメモしておく。

####2. ローカルリポジトリ作成
作業フォルダを作成して、その中に入る。

```
$ mkdir sample
$ cd sample
```

そこで新規リポジトリ作成

```
$ Git init
```

####3.リモートリポジトリ名登録

```
$ git remote add [リポジトリ名（origin）] [リモートリポジトリURL]
```

リモートリポジトリURL に`origin`という名前を付けて登録という感じ。（originが一般的に使われる）
`origin`は自由に変更可。

登録済みリポジトリ名の確認は

```
$ git remote -v
```

####4.リモートリポジトリからローカルリポジトリを更新する

```
$ git pull
```

###※最初に必ずpullをしておく
その前にコミットしてpushしようとすると、エラーが出て出来ない…
`error: failed to push some refs to 'https://github.com/リポジトリ'`
「無関係なヒストリを持つ２つのブランチをマージすることはできない」からの模様。（Git2.9より）

```
$ git fetch
$ git merge --allow-unrelated-histories origin/master
```
`--allow-unrelated-histories`を指定してmergeすればOK！
その後、改めてpush。

##プロジェクト初回流れ（リモートリポジトリ存在済み）
####1. ローカルリポジトリ作成
作業フォルダを作成して、その中に入り、リモートリポジトリをクローン

```
$ Git Clone [リモートリポジトリURL]
```

#プロジェクト作業用

###ファイル追加

```
$ git add ファイル名
```

###更新ファイル確認

```
$ git status
```

###ローカルリポジトリに登録（コミット）

```
$ git commit -m "コミットメッセージ"
```

###リモートリポジトリにマージ

```
$ git push [リポジトリ名（origin）] [ブランチ名（master）]
```

`origin`は、リモートリポジトリ名（[リモートリポジトリ名登録](#リモートリポジトリ名登録)を参照）
`master`は、メインブランチ名（svnだとtrunk）
システム監査技術者のキーワード一覧

今年はシステム監査区分を受けることにしました。

※2019年度春期合格しました。その振り返りはこちら。
[情報処理技術者試験ーシステム監査（AU）振り返り - あ、はい。そうですか。](http://estaro.hatenadiary.jp/entry/2019/08/02/070100)

今までのはこちら

[情報処理技術者試験 高度午前キーワード一覧 - Qiita](https://qiita.com/estaro/items/411d3df7545850d7525e)
[ネットワークスペシャリストのキーワード一覧 - Qiita](https://qiita.com/estaro/items/e4432b66dc813ff45c6a)


# はじめに

なかなか馴染みがないのがシステム監査。
私のような開発者からすると、重箱の隅をつつくような、設計書のフォーマットだのにケチをつけるイヤな存在のイメージがあります。
この辺の偏見はまさにシステム監査というものを知らないが故であるとも言えます。
というわけでかなり基本的なところから勉強します。


## システム監査とは？

そもそもシステム監査とはなんでしょう。
仰々しく「監査」と言っていますが、法律で義務付けられているようなものではありません。

では、何故システム監査を行うのか。大きく2つの目的があるようです。

1. 経営者が自社のシステムの運用が正しく行われているか調べるため
1. 対外的にシステム開発・運用を正しく行っていることをアピールするため

1は内部監査にあたります。特にITに疎い経営者なんかはIT投資が十分な結果をもたらしているか気になりますよね。

2は第三者機関にお墨付きをもらうことによって発注者の信頼を得ることができるかもしれません。
ちなみに顧客が監査するような場合は第二者監査となります。

実際は監査をすること自体が目的になっていることもあるように思いますが (^_^;)

## システム監査技術者とは

IPAによる期待する対象者像。

> 高度IT人材として確立した専門分野をもち、監査対象から独立した立場で、情報システムや組込みシステムを総合的に点検・評価・検証して、監査報告の利用者に情報システムのガバナンス、マネジメント、コントロールの適切性などに対する保証を与える、又は改善のための助言を行う者

「独立」というのは、監査という立場上、監査人が監査対象の「お友達」では何を言っても信用されません。
某アイドルグループの事件を見ているとよくわかりますね。
実際はどうでしょうね。忖度、あると思います。

「ガバナンス」「マネジメント」「コントロール」は説明すると難しいですが、あまり気にしないことにします。

## システム監査基準・システム管理基準

経済産業省による、システム監査のよりどころとなる基準が公開されています。
どうしても汎用的にならざるをえないため、ふわっとしている気がしますが、一通り目を通しておいた方が良いです。

[「システム監査基準」及び「システム管理基準」の改訂について（METI/経済産業省）](https://www.meti.go.jp/policy/netsecurity/sys-kansa/h30kaitei.html)

セキュリティ版もあります。これは軽く目を通しておきます。

[情報セキュリティ監査制度（METI/経済産業省）](https://www.meti.go.jp/policy/netsecurity/is-kansa/index.html)


# 監査の流れ

1. 計画
    * 中長期計画
    * 年度計画
    * 個別計画
1. 調査
    * 予備調査
    * 監査手続きの策定
    * 本調査
1. 報告
    * 報告
    * フォローアップ


# キーワード

- 監査技法
    - ITF法  
    Integrated Test Facility。システムの中に監査人用の口座を作成し、その口座への処理の正確性を検証する。
    - ペネトレーションテスト  
    侵入テスト。

    
- セキュリティ
    - CSIRT  
    シーサート。セキュリティインシデント対応の専門組織。

- 法規
    - 刑法
        - 詐欺など実害あり
    - 不正アクセス禁止法
        - 不正アクセスを行う、ID/パスワードを流布する
    - 金融商品取引法（J-SOX法を含む）
        - 内部統制
    - OECDプライバシーガイドライン
        - 最小限の原則
    - 個人情報保護法
        - 民間組織の個人情報の扱いを定める
    - プライバシーマーク
    - 著作権法  
        - 言語、プロトコル、アルゴリズムは**対象外**
    - 特許法
    - 不正競争防止法
    - 労働基準法
        - 監査の対象となる
    - 男女雇用機会均等法
    - 労働者派遣法
    - 下請代金支払遅延等防止法
    - PL法
GoogleChrome開発者ツール便利機能 値のリアルタイム監視 Live Expression

開発者ツール上で、手軽に値や関数の戻り値をリアルタイム監視できる機能、Live Expressionが実装されています。
頻繁には使用しませんが、覚えておくとデバックする際に少し役に立つかもしれません。

Live Expressionの実装はChrome 70から
参考：https://developers.google.com/web/updates/2018/08/devtools
# 使用方法
DevTools（F12キーで表示）のコンソール内にある目玉のマークをクリックする事で、新しく監視する式を入力できます。
![chrome_2019-04-19_22-45-55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268013/f02fd3b6-a5a9-d64c-275f-c4cf03cf5272.png)

監視したい式（変数のみでも可）を入力し、他の箇所をクリックすることで監視が開始されます。
250ミリ秒ごとに更新が行われ値が再表示されます。

# Sourcesパネル Watch機能との使い分け
DevToolsには同様の機能として、SourcesパネルのWatchセクションに値の監視機能があります。
この機能も同様で、式を入力しその式の値を画面上に表示する機能になっています。
Live Expressionとの違いは

- 表示位置
- リフレッシュタイミング

の二点です。
## 表示位置
それぞれLive Expressionはコンソールの上部、WatchはSourvesパネルの該当セクションになります。
![chrome_2019-04-19_22-59-16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268013/6581df55-bf23-23f6-900f-0f3340ffb50c.png)

Live Expressionを表示するコンソールは、どのパネルでも表示されるので常に監視しておきたい値を表示させるのに適しています。
反面、コンソール表示とのトレードオフなデザインになっているため、複数の式を監視するのには適していません。

Watchは専用のセクションに収まっていて、複数の式を表示するのに適したデザインをしています。
## リフレッシュタイミング
Live Expressionは250ミリ秒毎、Watchは更新ボタンを押した際か、ブレークポイントで止めた後ステップ実行の時になります。
## 使い分け
Live Expressionは少ない数の式を、画面を操作しながら監視する用途に適しています。
使用例としては、画面全体で使用する頻繁に書き換わる変数を監視するのに使用しています。

Watchはステップ実行でのデバック中に変更される変数などを監視するのに向いています。
使用例としては、バグの調査の際におかしくなる変数を入れておき、ステップ実行で変数の変化を確認するような例が挙げられます。

# 注意
副作用のある関数を使用している場合、リフレッシュが走るたびに実行されてしまうため注意が必要です。
関数を監視する場合には、副作用のないgetterなどに留めておきましょう。
AWS認定ソリューションアーキテクト–アソシエイトに合格

インフラ経験のなかった私が、どういう勉強をして合格したかメモします。
849点でした。（合格ラインは720点）

#勉強方法
私は下記３つを行いました。

①AWS認定ソリューションアーキテクトアソシエイト合格教本（\2480+税）
　→用語の説明が多い
②AWS認定ソリューションアーキテクトアソシエイト教科書（\2380 +税 ）
　→サービスの実践的な利用方法の説明が多い
③AWS公式の模擬試験（\2000 +税 ）
　→実戦練習、タイムスケジュールを把握するためでも有効
　　いろんなボタンがあるので、本番を見据えて試しましょう。
　　旗のボタンは見直すときの目印にするなど。

※わからないところは、ネットで深く調べたり、
　実際にAWS（無料枠）をさらっと触って把握していきました。
　実際の画面見ないとイメージがわかないとかもありました。。
　あとは、①・②は2周して、2周目は赤線引いた箇所と問題を再度確認しました。
　
※Udemyという学習サイトを活用するのもありかと思います。
　https://www.udemy.com/courses/search/?src=ukw&q=aws

#合格後
合格すると、特典があります。
模擬試験が無料だったり、本試験が半額だったり、
AWSのグッズ？が買えたりします。

こういうのも、おもしろいですね。
React.memoの第2引数は、使わないほうが安全そう

関数コンポーネントをメモ化するための`React.memo`ですが、あまり使われていない（そして、後述の理由により使わないほうがよさそうな）第2引数があります。

## TL; DR

* `React.memo`の第2引数は、前の`props`と新しい`props`が「同じか」を比較する関数
* 比較判定と使用箇所が離れているため、バグの原因になりがち
* メモ化した下位コンポーネントに必要な値だけ渡す、という形にしたほうがすんなり行きそう

## 第2引数について

詳細は[公式](https://reactjs.org/docs/react-api.html#reactmemo)や[先行する記事](https://qiita.com/suzuesa/items/1bb3b1493ff526814f03#%E6%84%8F%E5%A4%96%E3%81%A8%E7%9F%A5%E3%82%89%E3%81%AA%E3%81%84%E7%AC%AC%E4%BA%8C%E5%BC%95%E6%95%B0%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9)に譲りますが、`React.memo`の第2引数として`function areEqual(prevProps, nextProps)`のような関数を渡せます。メモ化後のコンポーネントを`render`しようとした際にこの関数が呼び出されて、`true`を返せばレンダリングしなくていい、ということになります。

### 機能的な注意点

* クラスコンポーネントは`shouldComponentUpdate`という名前のとおり、更新したい場合に`true`を返しますが、`React.memo`の場合は逆になっています。
* `state`のチェックはできません（`React.useState`で作った`state`を書き換えた場合、コンポーネントは再描画されます）。
* あくまでこれは**最適化のヒント**で、「`true`を返せばレンダリングされない」ことに依存するようなコードを書いてはいけません。

## 問題になる点

もちろん、第2引数の関数に意図したとおりの関数を渡せば、きちんとキャッシュ制御がなされます。問題になるのは、あとからこのコンポーネントを改造する場合です。

たとえば、関数内で「`foo`と`bar`が一致するか」を判定していた場合に、新しい`baz`というpropを追加してしまえば、これはチェックから漏れることになります。また、`foo`が巨大なオブジェクトの場合にも、どこまでを同じだと判定したかと、コンポーネント内でどう使うのかが**全く別個に書けてしまう**ので、両者の変更がうまく噛み合わず、意図した更新がなされない、という事態にもなりかねません。

極限までチューニングしたいのであれば有用かもしれませんが、いわゆる「自分の足を撃ち抜ける」ような仕組みでもあるので、使わずに済むのならそのほうがありがたいと感じました。

## 代替案

幸い、ほぼ同等のパフォーマンスを、通常の`React.memo`で実現することも可能です。


### 細かくコンポーネントを切り出す

下位のコンポーネントを細かく切り出して、それに`React.memo`をかけることで、メモ化を適度な粒度で適用していく、という手段があります。たとえば、`<select>`1つとっても、中には多くの`<option>`があって、そのまま再描画させると中身もチェック対象になること、一般的な使い方で、ユーザーが1文字打つごとに`<option>`が切り替わる、なんて運用はそう多くないので、`<select>`と中身をまとめてメモ化したコンポーネントにする、というような感じで切り出せば、再描画を減らせます。

さらに、元のコンポーネント全体であれば再描画が必要になっていたところでも、一部だけ切り出せば再描画不要となる、という場面も考えられますので、さらに処理を削減できます。

### 値の変換だけして、中身は丸投げ

上の考え方を推し進めれば、「外部から使うコンポーネントでは値のフィルタリングだけ行って、残りの実装はすべてメモ化されたコンポーネントに投げる」という方法が考えられます。たとえば、propのうち`bigObject`が変化し続けるけど、いま使いたいのはそのうち`propertyOne`と`propertyTwo`、だけだったとします。

```jsx
const Main = React.memo(function Main({propertyOne, propertyTwo, /* 後略 */}){
  // propertyOneやpropertyTwoを使って描画を行う
  // bigObjectは渡ってこない

  return <略 />;
});

function Frontend({bigObject, ...rest}){
  const {propertyOne, propertyTwo} = bigObject;
  // bigObjectは渡されない
  return <Main {...rest} propertyOne={propertyOne} propertyTwo={propertyTwo} />
}
```

このようにすることで、「必要な値だけをメモ化する」ことが実現できます。`React.memo`の2引数版との違いとして、`Frontend`でフィルタした変数は本当に`Main`へ**渡されない**ので、「メモ化の基準として使わなかった値をうっかり参照してしまって更新異常になる」ことが起き得ない、というより安全な形となっています。速度的にも、関数判定より多少は遅くなりますが、メモ化しないバージョンよりはぐっと速くなります。
考え方まとめ

プログラムを書くとき、人と話をするとき使えそうな考え方をまとめています。
間違いが含まれていると思うので注意。


Module
---

何らかの機能を持った部品。
複雑な機能を作る場合、お互いに独立した部品を組み合わせて作ると、全体を制御しやすそう。

参考:
- SICP


Information Hiding
---

複雑な機能をmoduleに分解するとき、変更が加わりそうな箇所を隠すように分解すること。いざ変更が加わることになっていても、その変更は隠されていて他の部品からは見えない。したがって変更する箇所がその部品のみになる。

例えば、ブログポストを永続化させる仕組みを考えてみます。永続化の手段は、インメモリ、ファイル、RDBMS、等あると思うので、永続化は変更が加わりそうな箇所でしょう。そこで、どのような手段を選んだかという設計上の決定を、ほかの部分から見えなくさせることが、Information Hidingだと思います。典型的なのは、Repositoryというインターフェースを切って、インメモリのRepository実装はInMemoryRepositoryImplにする、等でしょう。

永続化の手段は、永続化がどのくらい続くかという観点で見ることができます。インメモリでは、サーバーが再起動すると、保存したデータが失われる。一方、ファイルでは、サーバーが再起動しても失われない。要件が変わってインメモリからファイルになっても、同じmodule構成を維持できそうです。でも、今後の要件次第では、現在の設計では隠し切れないほどの意思決定がなされることがある可能性はあるとは思います。

参考:
- On the Criteria To Be Used in Decomposing Systems into Modules


Abstract Data Type
---

抽象データ型。
Data abstraction (データ抽象) とも同義。

データの実現手段・表現方法を、そのデータを扱う部分から隠すこと。
例えば、有理数はその分子と分母を取得できる。有理数から分子と分母を取得する手段を提供し、有理数の表現 (consを使っている、クラスを使っている、等) は隠す。

たとえば、有理数とは分子と分母からなる数であって、consやクラスのインスタンスとは普通定義されません。有理数を扱うほかのプログラムはまさしく有理数を扱いたいのであって、consやクラスのインスタンスは扱わないはず。

おそらく、Information Hidingの一種。

参考:
- SICP
- Object-Oriented Software Construction


Single Responsibility Principle
---

単一責務の原則。

同じ理由で変更を受けるものを集め、違う理由で変更を受けるものは分離するという考え方。

たとえば、ブログポストを永続化するmoduleは、ブログポストの構成の変化と永続化手段の進化という二つの理由で変更を受けそうです。

参考:
- https://blog.cleancoder.com/uncle-bob/2014/05/08/SingleReponsibilityPrinciple.html


ユースケース
---

システムとアクターのやりとりを記述したもの。
アクターは、そのシステムとやりとりすることのできる役割のこと。

同じユーザーでも時と場合によっては違うアクターになることもあると思っています。たとえば、同じユーザーであっても、稟議の申請者になることもあれば、承認者になることも。

参考:
- TODO


Data Context Interaction (DCI):
---

ユースケースのアルゴリズムを、ユースケースに参加するRole同士の振る舞いで記述すること。


参考:
- Lean Architecture for Agile Software Development
GLSLで宣言時に配列を初期化する


GLSLで以下のようにすると配列の宣言と初期化をまとめて行えます。

```glsl
float[8] array = float[](
  1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0
);
```

`vec4`配列の場合は次のようになります。

```glsl
vec4[4] array = vec4[](
  vec4(1.0, 2.0, 3.0, 4.0),
  vec4(5.0, 6.0, 7.0, 8.0),
  vec4(9.0, 10.0, 11.0, 12.0),
  vec4(13.0, 14.0, 15.0, 16.0)
);
```

---

GLSL3.1からは以下のように二重配列を扱えるらしいです。WebGL2はGLSL3.1に対応していないので試せてないですが...。

```glsl
float[4][4] array = float[][](
  float[](1.0, 2.0, 3.0, 4.0),
  float[](5.0, 6.0, 7.0, 8.0),
  float[](9.0, 10.0, 11.0, 12.0),
  float[](13.0, 14.0, 15.0, 16.0)
);
```
ラズパイでの128G microSD Cardの動作報告

ラズパイでの128G SD Cardの動作報告です(Raspbianのインストール)

Raspberry Piで使用可能なmicro SD媒体の報告は多々上がっていますが、自分もその一つの人柱になりたく、試して成功したことを報告させて頂きます。128GのSDカードの動作確認報告は少ないようなのでコミュニティの一助になれれば幸いです。


今回は

Raspberry Pi 3 B +

にて

[microSDXC 128GB SanDisk](https://www.amazon.co.jp/exec/obidos/ASIN/B073XK1DNH/jinkakushouga-22/ "microSDXC 128GB SanDisk")


を使用しました。

結果起動、動作確認取れました。

__[手順]__
媒体への書き込み等は全てThink Pad X230　Fedora 29にて行いました。
Think Pad X230はSDカードスロットがあるのでアダプタを介して目的のmicroSDに書き込みを行いました。

まず媒体のフォーマット。

```
sudo mkfs.vfat -v -c -F 32 /dev/mmcblk0
```
にてFAT32にフォーマット。

次のイメージの書き込みについては

公式にある

```
dd bs=4M if=201X-XX-XX-raspbian-stretch.img of=/dev/sdX conv=fsync
```
というコマンドラインのbsを

```
bs=1M
```
として書き込みしました。

この変更は媒体の大きさにかかわらず行わないと動作しませんでした。
(アダプタやドライブとの相性などあるのでしょうか)。

今回動作確認を行ったのは
Raspbian Stretch with desktop and recommended software
の方でした。
32Gのメディアでは書き込み時に容量が足りないなどとうエラーが出た記憶がありますが、しかし今回は全く問題ありませんでした。

以上、報告でした。
Processingで作ったゲームをスマホで動かす

# はじめに

ここではProcessingで作ったプログラムをスマホで動かす方法をご紹介します。
ProcessingのプログラムコードをJavaScriptへ変換しているため完璧ではありません。
スマホで動かすには多少の変更が必要であったりしますので、スマホで動かす方法はここでは詳細は割愛します。

## スマホで動かす方法
Safariなどのブラウザで動く、ブラウザゲームにして、スマホの実機で動かします。

### やり方

https://processin.ga

processing.gaというサイトを使います。


<img width="600" alt="スクリーンショット 2019-04-19 22.54.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149597/5f51cd7c-1cb5-3509-efa4-8bc42b5f8d9e.png">



<img width="600" alt="スクリーンショット 2019-04-19 22.56.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149597/ce3ded8b-14f6-06fb-f0a4-3a6236142da5.png">


保存ボタンを押して、タイトルなどをつけるとQRコードが吐き出されます。
QRコードをスマホで読み取って動かしましょう。
完全重複データを排除する

## 利用背景
PRIMARY KEYなしの完全重複データが入っているレコードがある
そこから重複データを排除したい

## 方法
重複排除したレコードを別テーブルに格納し、元テーブルを削除。別テーブルの名前を元テーブルの名前にする(DBを作り替える)

- CREATE TABLE ... SELECT構文を使用する
- DISTINCT構文を使用する
- DROP TABLE構文を使用する
- RENAME TABLE構文を使用する

## 構文
```
CREATE TABLE test_table (SELECT DISTINCT * FROM master_table);
DROP TABLE master_table;
RENAME TABLE test_table TO master_table;
``` 

### DEMO
```
docker pull mysql:5.6
docker run --name test_mysql -e MYSQL_ROOT_PASSWORD=root -d -p 3306:3306 mysql:5.6
docker exec -it test_mysql /bin/bash
mysql -u root -proot

mysql> CREATE TABLE master_table (
    ->     account_id varchar(10),
    ->     report_date varchar(10),
    ->     report_name varchar(255)
    -> ) ENGINE=InnoDB  DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.02 sec)

mysql> INSERT INTO master_table VALUES('00001', '2019-04-20','1');
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO master_table VALUES('00001', '2019-04-20','1');
Query OK, 1 row affected (0.01 sec)

mysql> INSERT INTO master_table VALUES('00003', '2019-04-21','3');
Query OK, 1 row affected (0.01 sec)

mysql> SELECT * FROM master_table;
+------------+-------------+-------------+
| account_id | report_date | report_name |
+------------+-------------+-------------+
| 00001      | 2019-04-20  | 1           |
| 00001      | 2019-04-20  | 1           |
| 00003      | 2019-04-21  | 3           |
+------------+-------------+-------------+
3 rows in set (0.00 sec)

mysql> SELECT DISTINCT * FROM master_table;
+------------+-------------+-------------+
| account_id | report_date | report_name |
+------------+-------------+-------------+
| 00001      | 2019-04-20  | 1           |
| 00003      | 2019-04-21  | 3           |
+------------+-------------+-------------+
2 rows in set (0.00 sec)

mysql> CREATE TABLE test_table (SELECT DISTINCT * FROM master_table);
Query OK, 2 rows affected (0.01 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM test_table;
+------------+-------------+-------------+
| account_id | report_date | report_name |
+------------+-------------+-------------+
| 00001      | 2019-04-20  | 1           |
| 00003      | 2019-04-21  | 3           |
+------------+-------------+-------------+
2 rows in set (0.00 sec)

mysql> DROP TABLE master_table;
Query OK, 0 rows affected (0.01 sec)

mysql> RENAME TABLE test_table TO master_table;
Query OK, 0 rows affected (0.01 sec)

mysql> SELECT * FROM master_table;
+------------+-------------+-------------+
| account_id | report_date | report_name |
+------------+-------------+-------------+
| 00001      | 2019-04-20  | 1           |
| 00003      | 2019-04-21  | 3           |
+------------+-------------+-------------+
2 rows in set (0.00 sec)

exit
docker stop test_mysql
docker rm test_mysql
```

## ポイント
- 稼働中DBに対して行う場合、トランザクションの考慮は必要
- プログラム上重複し得る仕様であれば、設計に問題がある
- プログラム上重複し得ない仕様(例外の手動混入)であれば本対応の対象といえそう

## 参考URL
https://dev.mysql.com/doc/refman/5.6/ja/create-table-select.html
https://dev.mysql.com/doc/refman/5.6/ja/distinct-optimization.html
https://dev.mysql.com/doc/refman/5.6/ja/drop-table.html

## 雑感
そもそも起きない構造や仕様であるべきではありそう。だが実際に起きてたのでメモ。
【Python】appendとextendでよく間違えるところ

リストの追加でよく間違えるので、整理していきます。

### append()メソッドとは
引数に渡された値をリストの末尾に渡します。

例

```test1.py
>>> my_list = [1, 2, 3]
>>> my_list.append(4)
>>> my_list
[1, 2, 3, 4]
```

### extend()メソッドとは
引数に渡された別のリストを追加してリストを拡張します。

例

```test2.py
>>> my_list = [1, 2, 3]
>>> my_list.extend([4])
>>> mylist
[1, 2, 3, 4]
```

### 間違えるケース①
- リストを拡張したいのに、appendでリストを渡してしまう。

例

```test3.py
# 自分がしたいこと
>>> my_list = [1, 2, 3]
>>> my_list.extend([4, 5])
>>> my_list
[1, 2, 3, 4, 5]


# appendを使ってしまい、一つの要素として追加してしまう
>>> my_list = [1, 2, 3]
>>> my_list.append([4, 5])
>>> my_list
[1, 2, 3, [4, 5]]
```

### 間違えるケース②
- extendで要素を渡して、エラーを起こす。

例

```test4.py
>>> my_list = [1, 2, 3]
>>> my_list.append(4)
>>> my_list
例外が発生しました: TypeError
'int' object is not iterable
  File "C:\Users\...\test3.py", line 2, in <module>
    my_list.extend(4)
```

### 間違えるケース③
- 文字列の場合、appendで追加するが、extendだと一文字ずつ追加される。

例

```test5.py
#自分がしたいこと
>>> my_list2 = ['dog', 'cat']
>>> my_list2.append('bat')
>>> my_list2
['dog', 'cat', 'bat']

#上記をextendと間違える
>>> my_list2 = ['dog', 'cat']
>>> my_list2.extend('bat')
>>> my_list2
['dog', 'cat', 'b', 'a', 't']
```
以上

この記事が自分の初投稿となります。
記事の内容で、おかしな所や訂正箇所があれば、
ご指摘いただければ修正していきます。

コメント頂ければ、幸いです。
ライブラリを自分でコンパイルする際の注意事項(x64とx86の競合)

最近、CGの勉強を基礎からするためにOpenGLをしている(DirectX12をやりたいけど気力がない...)のですが、[SOIL2](https://bitbucket.org/SpartanJ/soil2)などの外部ライブラリを自分でコンパイルして使用する際に沼にはまったので、覚書程度に書いていこうと思います。

# 環境
- windows10
- Visual Studio 2019

# ハマったこと
OpenGLを開発するときにはプラットフォームを64bit(x64)にして開発しているのですが、ライブラリをコンパイルする際に、ダウンロードしてきたまま`hoge.sln`みたいなソリューションファイルを開くと32bit用で指定されていることがちょくちょくある。
![2019-04-19 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/250282/b80006c4-c6a5-53ff-3a67-235158c342a4.png)
こんな感じで`Win32`に指定されている。
それでコンパイルして`hoge.lib`などのファイルを作成した後に、自分のプロジェクト(x64)にライブラリを適用させて、実行してみると
>
LNK4272	ライブラリのコンピューターの種類 'X86' がターゲットのコンピューターの種類' x64' と競合しています

みたいな警告がでて、コンパイルが通らなかった。

# 解決法
単純です。落としてきたライブラリをコンパイルする際に、自分が開発しているプラットフォームと一致しているかどうか確認しましょう。

# まとめ
こんな単純なことで半日溶かす人が減ることを願ってます。この方がいいよとか、違うよとか、わかりづらいよみたいなこと言ってもらえると勉強になるので助かります。
Craft CMS で Matrixフィールドのデフォルトを設定できないものか？

こういうかんじで Matrix にフィールドを用意してみた
<img width="1073" alt="Screen Shot 2019-04-19 at 22.34.23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8890/016a7b96-31ef-2eda-43f1-25f041993229.png">
ただ、エントリ新規作成時にはどれかまずブロックを押さないといけないというのは若干だけど手間だなぁ。
<img width="1073" alt="Screen Shot 2019-04-19 at 22.34.36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8890/64ae08aa-d29b-3c5d-b714-c7c68359c367.png">
これをどうにかする方法がないかしら、、、

ということで @BUN @tinybeans に聞いてみよう
Processingの導入方法

## Processingってなに？
Processingはもともとは電子アートのためのプログラミング言語でした。
アニメーションなどの視覚的な表現を得意とし、プログラマーではないデザイナーでも扱えるように工夫されています。

### Processingを学ぶメリット
プログラマー向けではないので、プログラミング初心者にも非常に扱いやすくなっています。
かといって、ただただ易しいプログラミング言語という訳ではなく、本格的なプログラミングも可能です。
ProcessingはJavaをベースに作られているため、オブジェクト指向での開発も可能です。

またProcessingがビジュアル的表現を得意としているため、すぐに画面に表示できてプログラミングのフィードバックが受けられます。たった1行のコードで四角形や丸を描くことができます。

Processingは、余計なおまじない抜きにすぐに動かせて成功体験を積むことができます。
慣れてくれば本格的なプログラミングまで可能ですので、PythonやRubyといった他の人気プログラミング言語へ移行する際も、Processingで学んだ知識をそのまま活かせます。

また、ProcessingはProcessing.jsというJavaScriptへの変換プログラムも用意しておりますので、そのままスマホ用ブラウザゲームにしたりなど、アウトプットの場面が多く用意されています。



## Processingが動く環境を整えよう

### ダウンロード
まず以下のリンクにアクセスしてください。

https://processing.org

アクセスすると下記の画像のような画面が表示されます。画面の左側にある「Download」をクリックしてください。

<img width="600" alt="スクリーンショット 2019-04-19 22.36.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149597/91d47813-5660-1780-d3d9-225aaf9f4d33.png">

Windowsならば「Windows 64-bit」。Macならば「Mac OS X」を選択しましょう。

<img width="600" alt="スクリーンショット 2019-04-19 22.37.20.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149597/f7959b84-6d14-27fb-ea24-10158b722243.png">


### インストール
Windowsの場合は、ダウンロードが終わったら、適当な場所に展開しましょう。
展開したフォルダにprocessing.exeが入っていますのでダブルクリックで起動します。

Macの場合は、ダウンロードしたzipファイルを展開すると、「Processing」というアプリケーションが生成されます。「Processing」というアプリケーションはアプリケーションフォルダーに移してください。

### Javaのインストール（不要な場合もあります）
もしProcessingがうまく起動できない場合はJavaがインストールされていない可能性があります。
Processingが起動できた方は、このJavaのインストールは不要です。

Javaのインストールをする場合は、JavaのインストーラーをOracle社のページよりダウンロードします。

http://www.oracle.com/technetwork/java/javase/downloads/index.html

<img width="300" alt="スクリーンショット 2019-04-23 14.48.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149597/ef2cb126-969a-feaf-f278-5b892f092215.png">

<img width="300" alt="スクリーンショット 2019-04-23 14.48.36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149597/31557091-f88a-5ac9-05af-4f5cf866c0db.png">


Accept License Agreementにチェックを入れ、
Windowsであればexeファイルを、Macであればdmgファイルをダウンロードします。

ダウンロード後、インストーラーを起動し、指示に従ってインストールを完了させます。


## Processingを動かそう

```Java
size(600, 400);
```

この1行だけで、ウィンドウを表示することができます。
入力して、再生ボタンを押して実行しましょう。空白の画面が表示されます。


<img width="600" alt="スクリーンショット 2019-04-19 22.44.36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149597/8accb6f9-086d-c249-19b3-77dc54648c8d.png">




続けて、

```Java
size(600, 400);
text("HELLO WORLD", 100, 100);
```

こうするだけでテキストの表示もできます。

<img width="300" alt="スクリーンショット 2019-04-23 15.02.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149597/2bddaad7-f900-186b-fef3-7e2bbb3ed288.png">


どうでしょうか？簡単そうでしょ？

あなたのプログラミング学習の最初の一歩に、Processingを選択してみてはいかがでしょうか？
きっと無駄になることはないと思います。


## 日本語が使えるようにする
Processingのプログラミングコードのフォントがデフォルトだと「Source Code Pro」になっており、日本語が使えません。日本語が使えるようにしておきましょう。

フォントは、Windowsであれば「MSゴシック」、Macであれば「Menlo」などが良いでしょう。

Windowsの場合は、ファイル>設定>エディタとコンソールのフォント、
Macの場合は、Processing>環境設定>エディタとコンソールのフォント、からフォントの設定ができます。
rails s できない！

私の場合はこんなエラーが出ました。

```
=> Booting Puma
=> Rails 5.0.7.2 application starting in development on http://localhost:3000
=> Run `rails server -h` for more startup options
A server is already running. Check /Users/ユーザー名/projects/アプリ名/tmp/pids/server.pid.
Exiting

```
要約すると
「サバー動いとるよ。ヘルプ見なさいな。」
でヘルプをみる

```
Usage: rails server [mongrel, thin etc] [options]
-p, --port=port Runs Rails on the specified port.
Default: 3000
-b, --binding=IP Binds Rails to the specified IP.
Default: localhost
-c, --config=file Uses a custom rackup configuration.
-d, --daemon Runs server as a Daemon.
-e, --environment=name Specifies the environment to run this server under (test/development/production).
Default: development
-P, --pid=pid Specifies the PID file.
Default: tmp/pids/server.pid
-C, --[no-]dev-caching Specifies whether to perform caching in development.
true or false

-h, --help Shows this help message.

```

・・・ありがとう。で？エラーの解決方法は・・・わからず。
https://qiita.com/uloruson/items/78b0d2d5c30a1f79fc02
こちらの記事のエラーに似ていたので、
server.pidファイルを削除しました。

```
/Users/ユーザー名/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/puma-3.12.1/lib/puma/binder.rb:273:in `initialize': Address already in use - bind(2) for "127.0.0.1" port 3000 (Errno::EADDRINUSE)

```
そしたら、
「アドレスもう使ってるんですが」
ってエラーに変わったので、、、


思い当たることが
「サーバーが動いている最中に勝手にターミナルが落ちた事がありました、しかもエラーが起きる直前」

これだ・・・！！　

https://qiita.com/nagao_norihiro/items/aba40bd4e0eac9f9a92d
こちらの記事を参考に

```
lsof -i :3000

kill -QUIT <PID>
```
無事
サーバーが立ち上がりました。
アナリティクスツールであるMatomoをサーバーにインストールする。

#Matomoをインストールしといて
まとも…？
なにそれ…？？
どうやらサーバーにインストールして動作するアナリティクスツールみたい。
旧名はpiwik。

サーバーはUbuntuで、ftpソフトやguiツールは使えないみたいだから
ssh接続してコマンド叩いていくッ

##インストール手順概要

- phpをインストールする
- mysqlをインストールする
- matomoをインストールする

といった感じでやっていきます。
多分大体はphpもmysqlもインストールされていると思うので
matomoまではスキップしてもいいと思います。

###phpをインストールする

```bash
#リポジトリ管理に利用する「software-properties-common」をインストールします。
sudo apt install software-properties-common

#「ppa:ondrej/php」をリポジトリに登録
sudo apt-add-repository ppa:ondrej/php

#aptのアップデート
sudo apt update

#phpのインストール
sudo apt install php7.3

#インストールが完了したかの確認
php --version
```

###mysqlをインストールする

```bash
#aptのアップデート
sudo apt update

#mysqlのインストール
sudo apt install mysql-server mysql-client

#インストールが完了したかの確認
mysql --version
```

###matomoをインストールする
ここからが本題。

matomoの公式サイトは
[https://matomo.org/](https://matomo.org/)
上記サイトからmatomoのダウンロードリンクのurlを見つける。

多分
[https://matomo.org/download/](https://matomo.org/download/)
のページにリンクがあり
https://builds.matomo.org/matomo-latest.zip
こんな感じのurlになる。

```bash
#matomoをインストールするディレクトリに移動する。
#ブラウザでアクセス出来る場所に置くこと
cd /var/www/vhosts/test.co.jp/htdocs/

#matomoをダウンロードする
sudo wget https://builds.matomo.org/matomo-latest.zip

#matomoを解答する
sudo unzip matomo-latest.zip

#matomo/tmpに移動する。
cd matomo/tmp/

#matomoの動作に必要なフォルダを作る
mkdir templates_c
mkdir cache
mkdir assets
mkdir tcpdf

#matom/に戻る
cd ..

#tmpフォルダの全てのパーミッションを変更する
chmod -R 0777 tmp
chmod -R 0777 tmp/templates_c
chmod -R 0777 tmp/cache
chmod -R 0777 tmp/assets
chmod -R 0777 tmp/tcpdf
```

ここまでコマンドを打ったら
ブラウザで`test.co.jp/matomo`にアクセスするとmatomoの設定画面が出るはずです。
あとはガイドに従ってインストールを5分で終わらせて完了！

#編集後記
入社15日目
コマンド打つのに抵抗感が無くなってきました。
あとmatomoめちゃ凄いです。
これが無料…？って絶対なります。
バックドアとか仕込まれてるよって言われたほうが納得いくレベルです。
【kubernetes】kubectl get XXXの略称

``kubectl get XXX``のXXX部分にはpodとかnodeとかserviceとかdeploymentとかいろいろ指定するのだが、これには実は略称が使える。
特にserviceとかdeploymentとか長くていちいち打つの面倒だったりするので略称を活用していきたい。

##serviceの略称
「svc」が使える。

```Bash
# kubectl get serviceと同じ意味
$ kubectl get svc
```
##deploymentの略称
「deploy」が使える。（これでも個人的には若干長い気もするが…まあいいや）

```Bash
# kubectl get deploymentと同じ意味
$ kubectl get deploy
```

##replicasetの略称
「rs」が使える。

```Bash
# kubectl get replicasetと同じ意味
$ kubectl get rs
```

##daemonsetの略称
「ds」が使える。

```Bash
# kubectl get daemonsetと同じ意味
$ kubectl get ds
```

##nodeの略称
「no」が使える。これは略称使うまでもなくもともと短いけど…

```Bash
# kubectl get nodeと同じ意味
$ kubectl get no
```

##podの略称
「po」が使える。これも略称使うまでもなくもともと短いけど…

```Bash
# kubectl get podと同じ意味
$ kubectl get po
```
table 行列固定

# table 行列固定
右下のテーブルを操作すると、その方向に応じて行ヘッダまたは列ヘッダが固定されたり連動して動いたりする。
スマホ等の限られたサイズの画面内で表形式で巨大なデータを見たいときなどに便利。
イメージとしては、右下のテーブルを
Galaxy S5 SC-04FにLineageOS 16.0をインストールしてみた

はじめに
---

今までNexus 5を使っていたのですが、フロント・カメラのピントが合わないので、代わりに中古のGalaxy S5 SC-04Fを購入しました。今までいろんな機種でカスタムROMをインストールした実績があるので、今回も手間なくインストールできるかなと思ったのですが、root化ツールTowelrootが使えなかったり、Odin3でTWRPをすんなり焼けなかったりと、かなり苦戦したのですが、何とかLineageOS 16.0を使えるようになったのでその過程をログとして残そうと思いました。

なぜGalaxyなのか
---

以前はNexusやZenfoneを使っていたのですが、最近はGalaxyを使うことが多くなりました。その理由は下記の通りです。

:one:簡単にバックパネルが開いて、バッテリ交換が手間なくできる。精密工具を使ったり、ドライヤで熱をあてて両面テープを剥がしたり、といった面倒な作業が必要ないのでありがたい。傷もつかないし。

:two:AliExpressから純正バッテリが安価で手に入る。他のパーツも同様に。

:three:カスタムROMが充実していて、比較的簡単にインストールできる。

とりあえず
---

**保証外**、**自己責任**、**文鎮化**、といった言葉が気になる方は先に進まないでくださいね。

それではスタート
---

:one:[まもさんのブログ - Root化 for Galaxy S5　(SC-04F)　※自己責任](https://blog.mamoru-m.jp/2017/11/root-for-galaxy-s5sc-04f.html)の通りに進めます。

**注意点**

- **Odin3 v3.07**を使いました。どこかでバージョンが大事だと書かれていたので。他のバージョンでは確認していません。

- **SC04FOMU1XPH3**のROMを焼いたら、Odin3でTWRPを焼けるようになったみたいです。

- **TWRP**は[**twrp-3.2.3-0-kltekdi.img.tar**](https://dl.twrp.me/kltekdi/twrp-3.2.3-0-kltekdi.img.tar.html)を焼きました。執筆時の最新版はtwrp-3.3.0-0-kltekdi.img.tarでしたが、これでLineageOS 16.0を焼こうとすると**Updater process ended with ERROR: 7**になりました。
 
:two:引き続き[Misc Mods - DocomoのGalaxy S5(SC-04F, kltedcm)をAndroid9.0で使う](http://blog.livedoor.jp/miscmods/archives/16074249.html)の通りに進めます。

**注意点**

- **Lineage OS(Docomo版)**を焼いた後は、root権限を有効化するために[**addonsu-16.0-arm-signed.zip**](https://download.lineageos.org/extras)を、OpenGAppsは[**open_gapps-arm-9.0-pico-20190419.zip**](https://opengapps.org/)を焼きました。


動作確認環境
--
IIJmioのSMS機能付きSIMで問題なく動作しています。


さいごに
---

ちょっと古めのスマホでも新しめのOSが使えるなんて最高ですね。(=^・^=)