OmniAICreator/Qiita-1.07M huggingface dataset:
【Python3】開発で使えるシリーズ　その①　コマンド実行

# テーマ：コマンド実行
```
【ポイント】
1. パイプで繋げてコマンドを実行可能
2. 複数パイプでのコマンドにも対応

import logging
import subprocess


logger = logging.getLogger('baseLogger')


class Command(object):
    def __init__(self, command):
        self.command = command
        self.arg = None
        self.pipe_args = []
        self.sep()

        self._stdout = None

    def sep(self):
        """subprocess.Popenの引数に渡す為、コマンドをブランク区切りでリスト化する。
           Pipe(|)が存在する場合は、最初に実行するコマンドをブランク区切りでリスト化し、
           pipeで繋げて実行したいコマンドは、ブランクで区切りらずに、そのままリストに格納。

        Args:
            self.command
        Set:
            self.arg
            self.pipe_args
        Return:
            None
        Raise:
            None
        """
        if '|' in self.command:
            command = self.command.split('|')
            self.arg = command.pop(0).split()
            self.pipe_args = command
        else:
            self.arg = self.command.split()

    def execute(self):
        """コマンドを実行する。
           PIPEで実行される時に使用する為、stdoutをインベントリ変数にsetする。

        Args:
            self.arg
        Set:
            self._stdout
        Return:
            r: subprocess.Popenモジュール
        Raise:
            subprocess.SubprocessError:
            subprocess.TimeoutExpired:
        """
        try:
            r = subprocess.Popen(self.arg, stdout=subprocess.PIPE)
            self._stdout = r.stdout
            return r

        except subprocess.SubprocessError:
            return None
        except subprocess.TimeoutExpired:
            return None

    def execute_pipe(self):
        """PIPEで繋がったコマンドを実行する。

        Args:
            self.pipe_args
            self._stdout
        Set:
            self._stdout
        Return:
            r: subprocess.Popenモジュール
        Raise:
            subprocess.SubprocessError:
            subprocess.TimeoutExpired:
        """
        if self.execute() is None:
            return None
        try:
            for arg in self.pipe_args:
                arg = arg.split()
                r = subprocess.Popen(
                    arg, stdin=self._stdout, stdout=subprocess.PIPE)
                self._stdout = r.stdout
            return r

        except subprocess.SubprocessError:
            pass
        except subprocess.TimeoutExpired:
            pass


if __name__ == '__main__':
    c = Command('ls | grep lesson')
    r = c.execute_pipe()
    print(r.communicate()[0])
```
パーシャル

#パーシャル(partial)

作成方法

```app/views/layouts/application.html.erb
<%= render 'layouts/header' %>
```
意味
`app/views/layouts/_header.html.erb`を探して内容を評価し結果をビューに挿入します。
パーシャルのファイル名はアンダースコアから始めます。コードの記述にはアンダースコアは不要です。
カスタムヘルパー

#カスタムヘルパー

あらかじめ組み込まれている組み込み関数ではなく自分で新しく作ったメソッドのことをカスタムヘルパーと呼びます。

カスタムヘルパーの記述は
`app/helpers/application_helper.rb`
にします。
Puppeteerでブラウザがヘッドレスモードかどうかを判断する

Puppeteerでは下記のように`puppeteer.launch()`のオプションでChromiumをヘッドレスモードで起動するか非ヘッドレスモードで起動するか切り替えることができます。

```js
const puppeteer = require('puppeteer');

// 非ヘッドレスモードで起動、デフォルトはヘッドレスモード
const browser = await puppeteer.launch({headless: false});
```

ところで、Puppeteerの処理中でブラウザがヘッドレスモードかどうか判定するにはどうすればいいのでしょうか。

`puppeteer.launch()` に与えたオプションを調べるというのが真っ先に思いつく手ですが、実はヘッドレスモードかどうかを変更する手段は複数あります（例：Chromiumのコマンドラインオプションに`--headless`を追加する）。すべての可能性を網羅したコードを書くのは大変ですし、今後Puppeteerのバージョンアップで動かなくなってしまうかもしれません。

## 解：page.evaluate()でヘッドレスモードかどうか確認する

ブラウザのモードについてはブラウザに問い合わせるのが正攻法のような気がします。

そこで、私は次のように`page.evaluate()`でブラウザ上でJavaScriptを実行してヘッドレスモードかどうかを判断するようにしました。

```js
const page = await browser.newPage();
const isHeadless = await page.evaluate('!window.chrome');
```

`window.chrome`はChrome拡張のためのオブジェクトらしいのですが、これがヘッドレスモードでは定義されないことを利用しています。

将来的にChromeの実装が変わって使えなくなるかもしれませんが、少なくともPuppeteer 1.19.0+Chromium 77.0.3844.0ではうまく動いているようです。

## 参考URL

- [Detecting Chrome headless, new techniques](https://antoinevastel.com/bot%20detection/2018/01/17/detect-chrome-headless-v2.html)
Railsチュートリアル3章

#コントローラの生成

```
$ rails generate controller StaticPages home help
```
StaticPages という名前のコントローラを生成します。
その時一緒にhomeとhelpというアクションも一緒に生成してね！という感じです。


###ルーティング
するとコントローラとアクションだけでなく、アクションで使うルーティングが`routes.rb`
の中で作られます

```config/routes.rb
Rails.application.routes.draw do
  get  'static_pages/home'
  get  'static_pages/help'
  root 'application#hello'
end

```

`get  'static_pages/home'`の記述方法を一般的ではなく実際には

`get 'static_pages/home', to: 'static_pages#home'`
と表現するのが一般的だそうです。

###ビュー
ルーティングに加えて、アクションに対応するビューファイルも生成されます。
`app/views/static_pages/home.html.erb`
`app/views/static_pages/help.html.erb`
※中身は省略します。

###テスト
アクションに対するテストも自動生成されます。

```test/controllers/static_pages_controller_test.rb

require 'test_helper'

class StaticPagesControllerTest < ActionDispatch::IntegrationTest


  test "should get home" do
    get static_pages_home_url
    assert_response :success
  end

  test "should get help" do
    get static_pages_help_url
    assert_response :success
  end
end

```

テストの内容は
"homeがgetできるべきである"
GETリクエストをhomeアクションに対して送信せよ
リクエストに対するレスポンスは`:success`成功になるはず
という内容です。

```
$ rails test 
```
これで記述したテストが実行されます。

#埋め込みRuby

埋め込みRuby(Embedded Ruby)はファイル名.html.erbの中で使用されます。

```
<%  ... %> #中に記入したRubyコードの実行のみを行う

<%= ... %> #中に記入したRubyコードの実行結果がテンプレート(ビュー)のその部分に挿入される。

```
#####メソッド
```
<% provide(:title,"Home") %>
```
Railsのprovideメソッドは第一引数であるシンボルと、第二引数を関連付ける。

```
<%= yield(:title) %> # "Home"が挿入される。
```

`yield`というコードはおそらく基本的に`app/views/layouts/application.html.erb`ファイルの中で記述される。
`yield`の部分には各アクションに対するビューファイルが挿入されます。
`yield(:シンボル)`とすると呼び出されているアクションでprovideメソッドによって関連
づけられたシンボルに対応する文字列などがピンポイントで挿入される。(はず)



以上です。
ImageFilterViewを使ったらかんたんに画像調整ができた

ImageFilterViewを使えば、画像を表示するときに明るさや彩度をかんたんに、調整できますよ！

ConstraintLayoutに含まれているので、build.gradleに追加しましょう。
`2.0.0`以上が必須なので、現時点で最新の`2.0.0-beta2`をインストールしました。

```gradle
dependencies {
    ...
    implementation 'androidx.constraintlayout:constraintlayout:2.0.0-beta2'
    ...
}
```

テスト用にSeekBarを使って、調整できるようにします。

```xml
<androidx.constraintlayout.utils.widget.ImageFilterView
    android:id="@+id/image"
    android:src="@drawable/image" />
<SeekBar
    android:id="@+id/saturation"
    android:max="200"
    android:progress="100" />
<SeekBar
    android:id="@+id/contrast"
    android:max="200"
    android:progress="100" />
<SeekBar
    android:id="@+id/brightness"
    android:max="200"
    android:progress="100" />
<SeekBar
    android:id="@+id/warmth"
    android:max="500"
    android:progress="100" />
```

```kotlin
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // 各プロパティによって、最大値を調整
        saturation.setOnChangeListener {
            image.saturation = it * 2
        }
        contrast.setOnChangeListener {
            image.contrast = it * 2
        }
        brightness.setOnChangeListener {
            image.brightness = it * 2
        }
        warmth.setOnChangeListener {
            image.warmth = it * 5
        }
    }
}

// SeekBarの値が変更されたときのリスナーを設定
fun SeekBar.setOnChangeListener(listener: ((Float) -> Unit)) {
    this.setOnSeekBarChangeListener(object: SeekBar.OnSeekBarChangeListener {
        override fun onProgressChanged(p0: SeekBar?, p1: Int, p2: Boolean) {
            listener(this@setOnChangeListener.progress / this@setOnChangeListener.max.toFloat())
        }

        override fun onStartTrackingTouch(p0: SeekBar?) {
        }

        override fun onStopTrackingTouch(p0: SeekBar?) {
        }
    })
}
```

調整できる主な項目は以下。

* saturation(彩度)  
    1 = 通常、0 = グレースケール、2 = 彩度強め
* Contrast(コントラスト)  
    1 = 通常、0 = グレー、2 = ハイコントラスト
* Brightness(明るさ)  
    1 = 通常、0 = 真っ黒、2 = 明るさ強め
* Warmth(色温度)
    1 = 通常、2 = 赤め、5 = 青め  
    (ドキュメントではこう書かれているけど、0にしたら青くなるので間違ってるのかも)

![スクリーンショット 2019-09-15 23.18.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94929/dbd27ecf-2a70-7ebb-3a21-82e09b2f1ae1.png)

# サンプルコード

https://github.com/tkt989/ImageFilterView-Sample
GitBucket on Ubuntu

GitbucketのHOMEを設定

```shell
cat /usr/share/tomcat9/bin/setenv.sh

CATALINA_OPTS="-Dfile.encoding=UTF-8 -Dgitbucket.home=/var/lib/gitbucket"

```

が、/var/lib/gitbucketが出来てない。。。

```shell
Caused by: java.io.FileNotFoundException: /var/lib/gitbucket/database.conf (Read-only file system)
```

なので、一旦、jarファイルを起動し作成。アクセス権もtomcatに変更

```shell
sudo java -jar gitbucket.war --gitbucket.home=/var/lib/gitbucket/
sudo chown -R tomcat:tomcat ../../gitbucket

ls -al /var/lib/gitbucket
total 84
drwxr-xr-x  4 tomcat tomcat  4096 Sep 15 23:30 .
drwxr-xr-x 38 root   root    4096 Sep 15 23:02 ..
-rw-r--r--  1 tomcat tomcat   205 Sep 15 23:29 database.conf
-rw-r--r--  1 tomcat tomcat 65536 Sep 15 23:30 data.mv.db
drwxr-xr-x  2 tomcat tomcat  4096 Sep 15 23:29 gist
drwxr-xr-x  3 tomcat tomcat  4096 Sep 15 23:29 plugins

```

それでもまだエラーがでる。systemdで読み書き用？pathの追加

```shell
/lib/systemd/system/tomcat9.service

ReadWritePaths=/var/lib/gitbucket/
```

apache2経由でアクセスできるようにおまじない。。追加

```shell
/etc/apache2/apache2.conf

<VirtualHost *:80>
  DocumentRoot /var/lib/tomcat9/webapps
  #ServerName yourhost.domain

    <Proxy *>
      Order deny,allow
      Allow from all
    </Proxy>


  ProxyPass /gitbucket ajp://localhost:8009/gitbucket

</VirtualHost>
```
積率母関数から期待値やモーメントを求めるまでの証明、デルタ法


##１．モーメント母関数（積率母関数）
####定義
・確率空間$(\Omega,F,P)上$の確率変数$X$と実数$t$に対し、$e^{tX}$の期待値$E(e^{tX})$を$X$のモーメント母関数といい、$M_{X}(t)=E(e^{tX})$と表わします。

####準備（積分論での結果など）
・確率変数$X$と実数$t$に対して、$e^{tX}$も確率変数となり、よってその期待値$E(e^{tX})$も定義できます。
・$E(|X|)<\infty$のとき、$X$は可積分であるといいます。つまり期待値は有限の値になるということです。
・[ルベーグ収束定理]
確率変数の列$X_{1},X_{2},・・・$が$lim_{n→\infty}X_{n}=X$、任意の$n$で$|X_{n}|≦Y$となる可積分関数が存在するとき、下記のように積分（期待値）と$lim$の順序交換ができる。$$lim_{n→\infty} E(X_{n})=E(lim_{n→\infty}X_n)$$
・[期待値と微分の順序交換]
$f(x,t)$は$x$で可積分、ある区間$t\in(a,b)$で微分可能かつ$|\frac{\partial}{\partial t} f(x,t)|≦g(x)$となる可積分関数$g(x)$が存在するとき、$t\in(a,b)$で下記が成立する。
$$\frac{ \mathrm{d} }{ \mathrm{d}t }E(f(X,t))=E(\frac{\partial}{\partial t} f(X,t))$$
※これは微分の定義と中間値の定理、上記のルベーグ収束定理を使って簡単に導くことができます。
※左辺が$\frac{ \mathrm{d} }{ \mathrm{d}t }$なのは、$f(X,t)$で期待値をとった後なので、$t$についてのみの関数になるからです。

####定理１
・$M_{X}(t)=E(e^{tX})$が$t\in(a,b)$で可積分とすると$Xe^{tX}$も可積分で
$$\frac{ \mathrm{d} }{ \mathrm{d}t }M_{X}(t)=E(Xe^{tX})$$
-証明-
$f(X,t)=e^{tX}$が[期待値と微分の順序交換]が可能であることの仮定を満たすことを示します。
$t$を$(a,b)$内にとると、定理の仮定より$e^{tX}$は$X$で可積分になり、指数関数は微分可能で$Xe^{tX}$である。さらに、正の数$\varepsilon$に対して$|X|=\frac{1}{\varepsilon}\varepsilon |X|$でテイラー展開の形をつくって
$$|X|≦\frac{1}{\varepsilon}(1+\varepsilon |X|＋・・・)=\frac{1}{\varepsilon}e^{\varepsilon |X|}=\frac{1}{\varepsilon}(e^{-\varepsilon X}+e^{\varepsilon X})$$
よって$Xe^{tX}$に対しては
$$|Xe^{tX}|=|X|e^{tX}≦\frac{1}{\varepsilon}(e^{-\varepsilon X}+e^{\varepsilon X})e^{tX}=\frac{1}{\varepsilon}(M_{X}(t-\varepsilon)+M_{X}(t+\varepsilon))$$
ここで$\varepsilon$を$t-\varepsilon$と$t+\varepsilon$が$(a,b)$に入るように小さくとれば、仮定より$M_{X}(t)$が可積分なので、右辺が可積分となります。よって$|Xe^{tX}|$について期待値と微分で順序交換可能であるので結論がいえます。

-証明終わり-

####定理２
・$M_{X}(t)=E(e^{tX})$が$t\in(a,b)$で可積分とすると、任意の$n$で
$$\frac{ \mathrm{d^n} }{ \mathrm{d}t^n }M_{X}(t)=E(X^{n}e^{tX})$$

-証明-
数学的帰納法により証明します。$n=1$のときは定理１です。$n$で成立したとするときに$n+1$では
$$|X^{n+1}e^{tX}|=|X||X^{n}|e^{tX}≦\frac{1}{\varepsilon}(e^{-\varepsilon X}+e^{\varepsilon X})e^{tX}|X^n|=\frac{1}{\varepsilon}(e^{(t-\varepsilon)X}|X^n|+e^{(t+\varepsilon)X}|X^n|))$$
$n$のときの仮定により、$\varepsilon$を小さくとれば右辺を可積分になるようにできます。
よって、$n+1$のときも成立します。

-証明終わり-

####系１
任意の$n$で$E(|X^n|)<\infty$のとき、定理２で$t=0$とすると下記が成立します。
$$\frac{ \mathrm{d^n} }{ \mathrm{d}t^n }M_{X}(t)|_{t=0}=E(X^{n})$$
これにより$n$次のモーメントがモーメント母関数から算出できることがわかります。

##２．デルタ法
デルタ法とは、確率変数$X$を変換したときに、変換後の平均と分散のおおよその値を求めるための考え方です。
####仮定
・確率変数$X$は平均$\mu$、分散$\sigma^2$になるとする。
・関数$f$を微分可能な関数とする。

####結果
・$f(X)$は近似的に平均$f(\mu)$、分散$f^{'2}(\mu)\sigma^2$となる。

-証明-
$f(X)$を$\mu$のまわりでテイラー展開すると、
$$f(X)=f(\mu)+f^{'}(\mu)(X-\mu)+\frac{f^{''}(\mu)}{2!}(X-\mu)^2+・・・$$
となりますが、右辺を１次の項までで考えます。
$$f(X)≒f(\mu)+f^{'}(\mu)(X-\mu)・・・①$$
ここで両辺に期待値をとると
$$E(f(X))≒E(f(\mu))+f^{'}(\mu)E((X-\mu))$$
ここで右辺の第１項は定数で第２項は$0$になるので、結局$E(f(X))≒f(\mu)$となります。

分散の方は、上記①で期待値でなく分散をとると、定数倍の分散は２乗になることから
$$V(f(X))≒V(f(\mu))+f^{'2}(\mu)V((X-\mu))$$
になって、右辺の第１項は定数の分散なので$0$、第２項は$f^{'2}(\mu)V(X)$なので、$V(f(X))≒f^{'2}(\mu)\sigma^2$が導かれます。

-証明終わり-

あくまで「＝」ではなく「≒」なので誤差が出ることを前提に考えます。
大事だけど、すぐ忘れてしまう、そんなアルゴリズムたち

##Rolling-Hash(ローリングハッシュ)
https://www.slideshare.net/hcpc_hokudai/rolling-hash-60984153
文字列に数値を割り当てる方法。アリ本の上級編に書いてあったので順次やっていきたい。

##Union-Find木
グラフの管理をできる。始め頂点がバラバラの状態から接合していきそれぞれのグループに分けていくのが得意。

```C++:UnionFind.cpp
class UnionFind {
public:
	//親の番号を格納する。親だった場合は-(その集合のサイズ)
	vector<int> Parent;
 
	//作るときはParentの値を全て-1にする
	//こうすると全てバラバラになる
	UnionFind(int N) {
		Parent = vector<int>(N, -1);
	}
 
	//Aがどのグループに属しているか調べる
	int root(int A) {
		if (Parent[A] < 0) return A;
		return Parent[A] = root(Parent[A]);
	}
 
	//自分のいるグループのノード数を調べる
	int size(int A) {
		return -Parent[root(A)];//親をとってきたい]
	}
 
	//AとBをくっ付ける
	bool connect(int A, int B) {
		//AとBを直接つなぐのではなく、root(A)にroot(B)をくっつける
		A = root(A);
		B = root(B);
		if (A == B) {
			//すでにくっついてるからくっ付けない
			return false;
		}
 
		//大きい方(A)に小さいほう(B)をくっ付けたい
		//大小が逆だったらひっくり返しちゃう。
		if (size(A) < size(B)) swap(A, B);
 
		//Aのサイズを更新する
		Parent[A] += Parent[B];
		//Bの親をAに変更する
		Parent[B] = A;
 
		return true;
	}
};
```

##二分探索木
左の子孫の値 ≤ 親 ≤ 右の子孫の値」という制約を持つ二分木のこと。
計算量はO(log(N))。二分探索を木にしてやっている感じ。

##組み合わせ(nCk)
http://keita-matsushita.hatenablog.com/entry/2016/11/30/111110
組み合わせの値がパスカルの三角形内の数値に相当しているという性質から動的計画法を用いて、組み合わせを求める方法。計算量はO(N^2)だが、配列として値を格納できるので毎回nCkを計算しなくて済む。

```c++:combi.cpp
int comb(int n, int k){
    int table[n+1][n+1];
    for( int i=0; i<=n; i++ ) table[i][0]=1;
    for( int i=1; i<=k; i++ ) table[i][i]=1;

    for(int i=2; i<=n; i++){
        for(int j=1; j<min(i, k+1); j++){
            table[i][j]=table[i-1][j-1]+table[i-1][j];
        }
    }
    return table[n][k];
} 

int main(){
    cout << comb(6,2) << endl; //15
    cout << comb(3,1) << endl; //3
    cout << comb(12,3) << endl; //220

    return 0;
}
```

##z-algorithm
http://drken1215.hatenablog.com/entry/2019/09/16/014600
ABC141を例に
Suffix Array
Z-algorithm
ローリングハッシュ + 二分探索
「ローリングハッシュ + 二分探索」の高速化
DP
の5通りを実装している

##suffix-array
アリ本の上級編に書いてあったので順次やっていきたい。
SA-ISという強力なやつがあるらしい。
高度情報試験対策　セキュリティ（暗号技術）

今回は高度情報試験（システムアーキテクトを受ける予定）対策にセキュリティの中でも比較的よく出され、かつしっかりと覚える必要がある暗号技術について簡単にまとめました。
なお、[こちら](https://yk0807.com/techblog/2019/09/15/%e3%82%b7%e3%82%b9%e3%83%86%e3%83%a0%e3%82%a2%e3%83%bc%e3%82%ad%e3%83%86%e3%82%af%e3%83%88-%e5%8b%89%e5%bc%b7%ef%bc%91%e3%80%80%e3%82%bb%e3%82%ad%e3%83%a5%e3%83%aa%e3%83%86%e3%82%a3/)の自分のブログの記事と同じ内容です。

# 共通鍵暗号方式
暗号化と復号に同じ鍵を用いるやつ。n人の利用者が使う場合、各利用者は(n-1)個の鍵を管理し、システム中には**n (n-1) / 2個**の鍵が存在する。
代表例
・**DES**（Data Encryption Standard） 56ビットの共通鍵を用いる。
・**AES**（Advanced Encryption Standard） Advancedという通り、↑の後継で、ブロック長は128ビット、鍵長は128ビット・192ビット・256ビットの3つが利用できる。
・**RC**　ストリーム暗号（平文をビット単位あるいはバイト単位などで逐次暗号化）で、RC4, RC5, RC6などがある。

# 公開鍵暗号方式
暗号化と復号化にペアになった異なる鍵を用いる。
情報漏洩対策に使う→**受信者の公開鍵**で暗号化し、**受信者の秘密鍵**で復号。
送信者認証に使う→**受信者の秘密鍵**で暗号化し、**送信者の公開鍵**で復号。
代表例
・**ElGamal**　離散対数暗号を用いた公開鍵暗号方式
・**RSA**　とても大きな2つの素数の積の素因数分解が困難なことを用いた暗号。RSAは人の名前（リベスト、シャリア、エーデルマン）の略。
・**楕円曲線暗号**　楕円曲線状の特殊な演算を用いて暗号化

# ディジタル署名、認証局
送信者の秘密鍵で暗号化し、送信者の公開鍵で復号することで送信者本人であることを証明する。
送信者の公開鍵の正当性を証明するのにPKI（Public Key Infrastructure 公開鍵基盤）が用いられるが、**認証局**（CA : Certificate Authority）によるディタル証明書が含まれている必要がある。
有効期間中に失効したディジタル証明書の一覧をCPL(Certificate Revocation List : 証明書失効リスト)という。
メッセージダイジェスト（送信平文をMD5などで圧縮したもの）を用いて送信者の確認と改ざん有無を同時に行える。

とまあ、こんな感じで駆け足でまとめてみました。この辺りの問題が大体毎回１問くらい出るので、しっかり押さえたいところですね。
GAS（googleappsscript）でtwitterapiからtrend情報をとる

# やりたいこと

* googleappsscriptからtwitterapiをたたく
* twitterapiからトレンド情報をとってきてgoogleスプレッドシートに値をいれていく
* 定期実行で数時間おきにデータを取得していく

# 実際の全コードはこちら

このnoteで全コードを販売しています。コピペで動かせます。

[【コード販売】GASでtwitterapiからtrend情報を定期的に取る](http://bit.ly/39mIheH)

他にもnoteでGoogleAppsScriptなどあまりプログラミング知識のないプロマネとかでも参考にできるコード集を販売しています。

[しょぼいコード屋さん](http://bit.ly/2IeleqB)

# twitterapiのキーを取得する

apiを叩く方法はふたつある

* 自分でapikeyを取得し、TwitterWebService.gsでapiを叩く
* gasのOAuth1ライブラリ
  * https://qiita.com/abeyuya/items/3863171d06b641cac9a8

以前は前者でやっていたがなぜか認証が通らなくなったので後者に変更。

## twitterapiの認証

https://qiita.com/szaking/items/466101cbe9b3846ba0f4

上記の記事を元に

- callbackurlの設定
- authのurlを発行し、そのurlを打って認証を行う

# trendのデータを取得

twitterからtrendの情報をとっていく。ちなみにtrendoの情報というのはtwitterの検索画面下にあるタグとかよくtweetされている文言とかが出ているあれ。twitterで話題になっている情報が分かる。下記のapiの情報

https://developer.twitter.com/en/docs/trends/trends-for-location/api-reference/get-trends-place

## 場所の指定

idに下記のWOEIDを設定する

「Twitterのトレンドを取得する際に指定できる日本の都市」
https://qiita.com/amidara/items/8e3224c4960e19b7a33a

## JSONで取得し、parseする

```javascript
json = JSON.parse(とってきたjson);
```

でparseして代入する。


## 定期実行

googleappsscriptの定期実行は下記の記事が詳しい

https://qiita.com/rf_p/items/267a8d9daa8c9f1ef027
AWS secrets.ymlからcredentials.ymlへ

#目次
1. はじめに
2. secrets.ymlとは?
3. credentials.ymlとは?
4. 具体的な変更
5. 変更によって変わった手順
6. 参考にしたwebサイト、書籍
7. 参考になりそうなwebサイト、書籍

#はじめに
私は、プログラミングをの勉強を初めてまだ2ヶ月の初心者であります。自分のアウトプットも兼ねてまだまだ技術は未熟ではありますが、私以外の初めて間もない方々の役に立つようなことができればと思いまして、投稿をさせていただきます。不備等ございましたら、恐れ入りますがコメントにてご指摘いただければ幸いでございます。

#secrets.ymlとは?
Rails5.2より前のバージョンにおいて、秘匿情報(secret_key_baseや外部APIのアクセスキー等)を記述していたファイルのことです。このファイルにはデフォルトでアプリケーションのsecret_key_baseが含まれていました。
#credentials.yml.encとは?
Rails5.2以降のバージョンにおいて用意された秘匿情報を保存しておくための新しいファイルです。Rails5.2からは暗号化されたcredentials.yml.encを扱います。しかし、secret.ymlも使うことはできるので、アップグレードの際にすぐに用意しなければならないというわけではありません。
また、credentials.yml.encの内容は暗号化されています。復号のやり方としては、master keyを利用して復号化することができます。デフォルトのmaster keyはconfig/master.keyを参照しましょう。編集の際は、rails credentials:editコマンドを使います。Rails5.2において生成される.gitignoreには、.config/master.keyが標準で含まれているので、gitリポジトリに誤って入れてしまうのを防ぐことができるようになっています。
#具体的な変更点
- config/credentials.yml.encを追加し、secrets.ymlの記述の際のように、各環境ごとに設定値をそれぞれ分ける仕様ではなくなった
- 開発やテストのシーン等、秘匿情報がの復号化の必要ない場面では求められなくなった
以上の2点が大きく変わった点かと思われます。

#参考にしたwebサイト
[AWS利用上のセキュリティを確保する方法](https://qiita.com/AK4747471/items/f8b5e2e6005d1d22670e)
[【Rails5.2】credentials.yml.encとmaster.keyでのデプロイによる今までとの変更点](https://qiita.com/katsu105/items/88675da5119762d73d92)
[Rails5.2から導入されたcredentials.yml.encを極める](https://qiita.com/yuuuking/items/53a37a2e998972be32b8)
[Rails5.2から追加された credentials.yml.enc のキホン](https://qiita.com/NaokiIshimura/items/2a179f2ab910992c4d39)
[Rails5.2からsecrets.yml*が廃止されcredentials.yml.encに統合されるよ](https://qiita.com/daichirata/items/da40e205d273ae69fcfc)
[credentials.yml.encによるアクセスキーの管理方法](https://www.ryotaku.com/entry/2019/05/11/credentials.yml.enc%E3%81%AB%E3%82%88%E3%82%8B%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%82%AD%E3%83%BC%E3%81%AE%E7%AE%A1%E7%90%86%E6%96%B9%E6%B3%95)
[Rails セキュリティガイド](https://railsguides.jp/security.html#%E7%8B%AC%E8%87%AA%E3%81%AEcredential)
[｢Rails5.2｣ credentials.yml.encを生成する方法](https://tabiya.jp/2019/07/31/archives/1978)
[Railsのcredentials.yml.encは、どういった運用ができるか？](https://tech.libinc.co.jp/entry/2018/11/27/101347)
[credentials.yml.encを環境ごとに使い分ける【Ruby on Rails】](https://fuchiaz.com/rails-gem-credentials/)
[Rails5.2 暗号化（Credentials）関連の単語メモ](https://blog.tanebox.com/archives/602/)
[Rails 5.2 の credentials.yml.enc に登録してあるデータを呼び出す方法](https://obel.hatenablog.jp/entry/20180520/1526810322)
[Rails の config/credentials.yml.enc を使ってみる](https://matt-note.hatenadiary.jp/entry/2018/12/06/135940)
[Rails5.2のcredential管理を試してみた](http://blog.naoshihoshi.com/entry/2018/06/18/153000)
[credentials.yml.enc やめたい…](https://qiita.com/takumiabe/items/f8c04e27220fc1ce27ce)
[Rails 4.1 の secret.yml とは…](https://donbulinux.hatenadiary.org/entry/20140527/1401220852)
[Rails 5.2の本番デプロイ時に secrets.yml でハマった](https://kei178.me/programming/1071/)
[secrets.ymlや環境変数をRails 5.2のEncrypted Credentialsに移行する](https://qiita.com/d-mato/items/aab2b6b2f587a8582631)
ABC141にチャレンジ

AtCoder初参加。結果はA, B, Cは解けて、Dはアルゴリズムは良かったけれど実行速度が基準を満たせず、残念な結果に。個人的には、ようやく時間前に椅子に座ることができたのが、良かった。

# A
Sunny, Cloudy, Rainyという単語に対して、適切な単語を答えるもの。連想配列そのものだったので、そのまんま実装してみました。

```python:heather.py
S = input()

dict = {"Sunny": "Cloudy", "Cloudy": "Rainy", "Rainy": "Sunny"}
print(dict[S])
```

# B
文字列の偶数インデックスと奇数インデックスのそれぞれに、使ってはいけない文字のルールが定義されている。愚直にループで回しても良かったけれど、偶数インデックスだけからなる文字列と奇数インデックスだけからなる文字列を、Pythonのスライス機能を作って実装してみました。

```python3:tap.py
S = input()

S_odd = S[::2]
S_even = S[1::2]
if 'L' in S_odd or 'R' in S_even:
  print("No")
else:
  print("Yes")
```

# C
多人数で行うクイズ。成果した人以外の点数が１点ずつ減っていき、最後に残った人を抽出する問題。「正当者以外の点数が1点引かれる」とあるが排他的論理和を取って「正当者の点数が1点上がる」という風に考えてみた。最後の点数を確認するロジックを少しだけ考えました。

```python3:attack.py
N, K, Q = list(map(int,input().split()))
A = [int(input()) for i in range(Q)]
score = [0] * N
for i in range(Q):
  score[A[i] - 1] += 1
for i in range(N):
  result = K - Q + score[i]
  if result > 0:
    print("Yes")
  else:
    print("No")
```

# D
「一番高い商品に割引券（半額券）を適用する」という作業を商品券の枚数分繰り返せばいい。ただAtCoderでは「繰り返すだけ」が時間切れの要因になるので、それを解決するのが大変。初めは愚直にソートして会えなく時間切れ、次に、一回の操作で値が変わる要素はたかだか１個であることに気づき、最後の値が小さくなったらbisectを使って再挿入する実装を思いついた。しかし改善はしたけど、まだだめ。今日はここで時間切れでした。
ちなみに解説見たら、優先度付きキューを使うと良いと書いてあったので、そうしてみたら制限時間内に終わるようになった。

```python3:powerful.py
import math
import heapq

N, M = list(map(int, input().split()))
A = list(map(lambda a: -int(a), input().split()))
A.sort()
heapq.heapify(A)

for i in range(M):
  a = heapq.heappop(A)
  a /= 2.0
  heapq.heappush(A, a)

amount = 0
for a in A:
  amount += math.floor(-a)
print(amount)
```
Chainerの「ディープラーニング入門」をやってみた。（第２章）


前回の続きです。
https://qiita.com/iaintsorrykamio/items/8f378c194e58b977a4ef 

今回もひたすら自分用のメモ書きが中心になりそうです。

# Step2. 機械学習とデータ分析入門
## 7. 単回帰分析と重回帰分析
* **単回帰分析**：一つの入力変数から一つの出力変数を予測する。
* **重回帰分析**：複数の入力変数から出力変数を予測する。
つまり、どちらも教師あり学習に含まれるようです。なので入力変数*x*と目的変数*t*をペアで準備しておく必要があります。

### 単回帰分析
* **目標**：1つの入力変数**x**から1つの出力変数**y**を予測する。（*y=wx+t*）
* **前処理**：データセットについて中心化（平均値が0,0になるように）する。（*y'=wx'*)
* **目的関数の決定**：今回の例では二乗和誤差を用いる。この目的関数の値が最小となる点を求める＝目的関数を*w*で微分した値が0になるような最適な*w*を求める。

重回帰分析は、この単回帰分析の入力変数が一つではなく複数の入力変数を扱うことになる。（*y=wx+t*が、*y=w1x1 + w2x2 + … + wMxM + b*となる）
線形代数の知識を使って、ガンガン計算していく（詳細は省略）。

## 8. NumPy入門

重回帰分析のアルゴリズムを実際にNumPyで実装していきます。その上で、特に重要になってくるのが**ブロードキャスト**の仕組みだと思います。

* **ブロードキャスト**：異なる形の配列同士で算術計算を行うときに、自動的に小さい配列を大きい配列に合わせる操作。そのとき、「2つの配列の各次元が同じ大きさになっているか、どちらかが1であること」が必要。

## 9. scikit-learn入門

機械学習における基本的な流れである、「データセットの準備」→「モデルの決定」→「目的関数の決定」→「最適化手法の選択」→「モデルを訓練」までを実際にやっていきます。

以下メモ。

* データセットは準備されているが、訓練用とテスト用にデータを分ける必要がある。
* 重回帰分析は、LinearRegressionクラスを利用して行う。
* モデルの訓練が完了したら、訓練用データセットとテスト用データセットの決定係数を比較して、精度の検証を行う。この差が大きい＝**過学習**してしまったということになる。→そこで各入力変数の値の平均が0、分散が1となるようにスケーリング（**標準化**）を行う。

## 10. CuPy入門

GPUでNumPyと同じような計算ができるライブラリの紹介です。速いということがわかれば十分（？）

## 11. Pandas入門

csvファイルを読み込んでデータを整理したり操作するパッケージ、Pandasについて基本的な利用法を学びます。

## 12. Matplotlib入門

グラフ描画を行うMatplotlibの基本的な使い方を学びます。

## まとめ

後半の方はわざわざ記事にする必要もない気がしてきました・・・。まぁ入門が中心なので、このチュートリアルに沿ってひたすらコードを実行すればいいので楽だし、雰囲気をつかむ分にはわかりやすいかなと思いました。（ただすぐ忘れますね）
Ruby+Selenium+GlideでFNO(東京)を楽しむ術

# まずはじめに
FNO前に投稿しようと思っていましたが、、、すいません

## 自己紹介
初投稿なので自己紹介します。
某ファッションテック企業でサーバーサイドエンジニアをしているものです。
普段は主にRuby書いていて、少しSwiftも触っています。

## この記事について
FNOはFASHION’S NIGHT OUT(https://www.vogue.co.jp/fno/2019/tokyo/#/about)のことで
毎年9月ごろにVOGUEが開催しているファッションイベントです。

限定アイテムなどが発売されるなか
FNOの醍醐味といえば
**ノベルティ** ・ **酒**
だと思っています。(個人的な意見になります)

効率よくまわって楽しみたいなと思うのですが、
公式だと
地図を見るのに毎度ページ更新して確認して
というのがめんどくさいなと感じていました。

そこで今回は`Seleniumu` を使用してスクレイピングをして
CSVを生成し、Glideで読み込みます！

# 実装

## 準備&&環境
chromeをダウンロードしてください。

```
$ ruby -v                                                                      
ruby 2.5.3p105 (2018-10-18 revision 65156) [x86_64-darwin18]
```

## スクレイピング
`selenium-webdriver`をインストール

```
gem install selenium-webdriver
```

chromeを開き、指定のURLに飛びます。
表示の時間を待ってから、スクロールする必要があります。(時間とスクロールは適当です)

```
require 'selenium-webdriver'
require 'csv'
require 'pry'

driver = Selenium::WebDriver.for :chrome
driver.navigate.to 'https://www.vogue.co.jp/fno/2019/tokyo/shoplist/#/item/3'
sleep(5)
driver.execute_script('window.scroll(0,1000);')
sleep(5)
spots = driver.find_element(:id, 'cat_result').text.split(' ')[0].to_i
```

必要なデータをCSVで抽出して行きます。

要素はxpathで取得しています。
xpathの取得方法に関しては下記を参考に。
https://qiita.com/ywindish/items/5a992c49387d81df900e

今回各wrap内のリンク先に住所等が書いてあるため、
もう一つDriverでchromeを起動します。
同じDriverでも問題ないですが、
JavaScriptの関係で再度待機時間などが必要になることなどから
別でchromeを開いています。


```
CSV.open('fno2019_tokyo.csv', 'w') do |csv|
  csv << %w[id name text image location link]
  driver.find_elements(:class, 'wrap').each.with_index(1) do |wrap, index|
    name = wrap.find_element(:xpath, "//*[@id='shopWrap']/li[#{index}]/a/div/div[2]/p[2]").text
    text = wrap.find_element(:xpath, "//*[@id='shopWrap']/li[#{index}]/a/div/div[2]/p[3]").text
    image = wrap.find_element(:xpath, "//*[@id='shopWrap']/li[#{index}]/a/div/div[1]/img").attribute('src')
    detail_link = wrap.find_element(:xpath, "//*[@id='shopWrap']/li[#{index}]/a").attribute('href')
    driver2 = Selenium::WebDriver.for :chrome
    driver2.navigate.to detail_link
    sleep(3)
    driver2.quit
    csv << %W[#{index} #{name} #{text} #{image} #{location} #{detail_link}]
    break if index == spots
  end
end
```

Driverを終了します。

```
driver.quit
```


## Glide
生成したCSVをGoogle Driveにアップロードして
スプレッドシートで開きます。

Glide(https://go.glideapps.com/)を開き、
先ほど生成したスプレッドシートを読み込むだけです。
<img width="1440" alt="スクリーンショット_2019-09-15_22_44_21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193664/9b4b335e-bac7-b163-0f33-9bf05a9b2ba6.png">

あとは好みでデザインを変更できます。

# 参考
https://www.seleniumqref.com/api/webdriver_gyaku.html
https://morizyun.github.io/web/selenium-cheat-sheet.html


# 最後に
下記が作成したものです。
https://x9kav.glideapp.io

神戸、名古屋、大阪の開催も10月以降にありますので
参考にしていただければ幸いです。

来年はドリンク、食事、それ以外のノベルティを
画像認識もしくは文字列判別で分類したいなと思っているところです。
yumコマンドでrpmパッケージのみダウンロードする

インストールはせずに、パッケージだけ欲しいんだ！

## コマンド

```
yumdownloader --enablerepo=remi-php72 php72 php-mbstring php-ldap php-cli php-common --destdir=./php --resolve
```

## 実行結果

```
# ls ./php
environment-modules-3.2.10-10.el7.x86_64.rpm  libxcb-1.13-1.el7.x86_64.rpm                   php72-php-json-7.2.22-1.el7.remi.x86_64.rpm  php-ldap-7.2.22-1.el7.remi.x86_64.rpm
libargon2-20161029-3.el7.x86_64.rpm           oniguruma5-6.9.3-1.el7.remi.x86_64.rpm         php72-runtime-2.0-1.el7.remi.x86_64.rpm      php-mbstring-7.2.22-1.el7.remi.x86_64.rpm
libX11-1.6.7-2.el7.x86_64.rpm                 php72-2.0-1.el7.remi.x86_64.rpm                php-cli-7.2.22-1.el7.remi.x86_64.rpm         scl-utils-20130529-19.el7.x86_64.rpm
libX11-common-1.6.7-2.el7.noarch.rpm          php72-php-cli-7.2.22-1.el7.remi.x86_64.rpm     php-common-7.2.22-1.el7.remi.x86_64.rpm      tcl-8.5.13-8.el7.x86_64.rpm
libXau-1.0.8-2.1.el7.x86_64.rpm               php72-php-common-7.2.22-1.el7.remi.x86_64.rpm  php-json-7.2.22-1.el7.remi.x86_64.rpm
```

## オプション
- `--destdir`  ダウンロード先を指定
- `--resolve`  依存関係のあるパッケージも合わせてダウンロード
【Rails】Turbolinksが原因でGoogle Analyticsが正常に動かない時の対処法

Ruby on RailsでWebアプリを作っていたら、Turbolinksでどハマりしてしまったのでメモ。

Google AnalyticsがTurbolinksの影響で正常に動かない場合の対処法を備忘録としてまとめてみました。


##Rails5で作ったWebアプリのGoogle Analyticsが正常に動かない
[力価計算.com](https://rikika-keisan.com/)という小児薬の服用量を計算するWebアプリを作ったのですが、Google Analyticsが正常に動いてないことに気づきました。

###ページ遷移したときにGoogle AnalyticsのPVがカウントされない
Webアプリ上でページ遷移した時に、PVのカウントがされていない。

 

例えば、トップページから計算ページへに移動するとき、トップページのPVは測定できるのに計算ページのPVが測れていませんでした。

###Google Analyticsが正常に動かなかった原因はTurbolinks
Google Analyticsが正常に動かなかった原因は、Turbolinksだったことが発覚。

 

Turbolinksはページの表示速度が早くなるというメリットがありますが、どうやらJavascriptの動きを邪魔してしまうことがあるらしい。

 

Google AnalyticsのコードはJavascriptで書かれているので、TurbolinksがGoogle Analyticsのコードの動きを邪魔してしまったようでした。


##Turbolinksが原因でGoogle Analyticsが正常に動かない場合の対処法
解決法は、以下の通りです。


###1：application.html.erbにGoogle Analyticsのコードを貼り付ける
まず以下のコードをapplication.html.erbにコピペ。

```application.html.erb
<% if Rails.env.production? %>
 <!-- Global site tag (gtag.js) - Google Analytics -->
  <script async src="https://www.googletagmanager.com/gtag/js?id=#{ENV['Your Google 
  Analytics Tracking Code']}"></script>
  <script>
  window.dataLayer = window.dataLayer || [];
  function gtag(){dataLayer.push(arguments);}
  gtag('js', new Date());
  gtag('Your Google Analytics Tracking Code');
 </script>
<% end %>
```

###2：application.jsにturbolinks対策のコードを貼り付け
次に、以下のコードをapplication.jsに貼り付けます。

Your Google Analytics Tracking Codeには、自分のトラッキングコード（UA-xxxxxxxx-xxx）を書いてください。


```application.html.js
document.addEventListener('turbolinks:load', function(event){
  if(typeof(gtag) == 'function'){
    gtag('config', 'Your Google Analytics Tracking Code', {
      'page_title' : event.target.title,
      'page_path': event.data.url.replace(window.location.protocol + "//" + window.location.hostname, "")
    });
  }
})
```
参照：https://github.com/turbolinks/turbolinks/issues/73


これで解決するはず。

ちなみに最初の行にあるturbolinks:load は、Turbolinksによってページが表示されるタイミングで発生するイベントです。

##これでも動かなかった場合
実は僕の場合、これでも動かなかったのですが、rails assets:precompileのコマンドをターミナルで打ち込んだら正常に動くようになりました。

 

あと、最初はgoogle-analytics-railsというgemでGoogleアナリティクスを導入していたのですが、どうしても正常に動きませんでした。

 

なので、google-analytics-railsを使っていて、Google アナリティクスが動かない場合は、先ほど紹介したような感じで普通にGoogle  Analyticsのトラッキングコードを貼り付けると良いと思います。


##まとめ
Turbolinksは便利だけど厄介ですね。

少しずつ勉強していこうとと思います。
python 正規表現で奇数番目、偶数番目の文字のパターンを見る

###正規表現を使った偶数、奇数番目の文字判定

pythonで文字列の奇数番目、偶数番目文字を判定した方法を共有します。

例えば

```
RDULULDURURLRDULRLR
```

このような文字列で奇数番目の文字にLが入っていないことを、また偶数番目の文字にRが入っていないことを確認したいです。

そこで今回は正規表現を使いました。

```python
import re

string = input()
pattern = re.compile(r'^([^L][^R])*[^L]?$')
if pattern.match(string):
    print('Yes')
else:
    print('No')
```

re.compileとしておくと繰り返しそのパターンを探していく場合に高速になります。

上記の正規表現の意味は以下の通りです。

r:文字列の先頭に書いておくとバックスラッシュ等がエスケープされます

^:行の先頭を表す

[]:どれか1文字

*:0回以上の繰り返し　　　例:ab*  合致パターン: a,ab,abb,abbb,...

$:行の末尾
dockerプライベートリポジトリの作り方

# dokcer imageをプライベートリポジトリで利用する方法

## 目的
 ローカル環境にプライベートコンテナリポジトリを作成する

## なぜ？
dockerやkubernetesで使用するコンテナイメージを自分用にビルドしたものを保管、管理したい。

## どのように？
コンテナイメージを管理する方法はいくつかありますので、以下の中から選択する必要があります。
1.[Docker Hub](https://www.docker.com/products/docker-hub)の利用する（有料）
2.[amazon ECR](https://aws.amazon.com/jp/ecr/)を利用する（有料）
3.ローカルオンプレ環境にOSSのリポジトリ環境を構築する

このページでは3の「ローカルオンプレ環境にOSSのリポジトリ環境を構築する」を説明します。

## 材料
- サーバ環境：CentOS Linux release 7.6.1810 (Core) 
- ソフト：docker-distribution
- 作業時間　少々
- やる気：多め

## レシピ１：レジストリサーバのインストール
ソフトウェアをインストール＆サービスを起動する

```console
# yum install docker-distribution
# systemctl start docker-distribution.service
# systemctl enable docker-distribution.service
```

#レシピ２：設定情報の変更
###レジストリデータ保存先＆待ち受けポートの変更
- 変更必要なら修正する

```console
# vi /etc/docker-distribution/registry/config.yml
version: 0.1
log:
  fields:
    service: registry
storage:
    cache:
        layerinfo: inmemory
    filesystem:
        rootdirectory: /var/lib/registry
http:
    addr: :5000
```

### hostsファイルの変更
以下の設定はbuild imageを取得したいノードにて作業が必要です。
- IPv6は無効にします
- ホスト名を登録します

```console
# vi /etc/hosts
#::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
<レジストリサーバーのIPアドレス> kbmster
```
### 接続情報を追加
```console
# vi /etc/docker/daemon.json
  "insecure-registries": [
     "kbmaster:5000"
   ]
```

#レシピ３：dockerの再起動
```console
# systemctl daemon-reload
# systemctl restart docker
```
#レシピ４：buildイメージをリポジトリサーバにpushする

```console
# docker build -t wp-tomcat:1.0 .
# docker tag wp-tomcat:1.0 kbmaster:5000/wp-tomcat:1.0
# docker push kbmaster:5000/wp-tomcat:1.0
```

#レシピ５：buildイメージをリポジトリサーバからpullする
各ノードから以下を実行するとdocker imagesがダウンロードされます

```console
# docker pull kbmaster:5000/wp-tomcat:1.0
```



※参考資料
https://sato-labo.mydns.jp/2018/07/install-docker-registry/
https://tracpath.com/works/devops/docker_hub_and_amazon_ec2_container_registry/#Docker_Hub
LaravelにFont Awesome5を導入する

決まったコマンドと貼り付けるファイルがあるので、メモをしておきます。

```terminal:ターミナル
$ npm install @fortawesome/fontawesome-free
```

と打ちます。

上記のコマンドの結果、package.jsonに

```:package.json
"@fortawesome/fontawesome-free": "^5.10.2", (バージョンはそれぞれ)
```
と追加されているのを確認したら、



下記のコマンドでパスを指定し

```:_variables.scss
$fa-font-path: "../webfonts";
```



scssファイルをインポートします。

```:app.scss
@import "~@fortawesome/fontawesome-free/scss/fontawesome.scss";
@import "~@fortawesome/fontawesome-free/scss/regular.scss";
@import "~@fortawesome/fontawesome-free/scss/solid.scss";
@import "~@fortawesome/fontawesome-free/scss/brands.scss";
```

以上で完成です！

```:ターミナル
$ npm run watch
```

あとは監視！
Railsチュートリアル2章

#Gem

railsにはgemファイルというライブラリがある。

Gemfile内に使用したいgemを記述、開発環境用などグループ分けすることも可能らしい。

記述しただけでは意味がないのでインストールを行う。

```
$ bundle install --without production
```
bundleに記述した通りにインストールが実行される。`--without`を使うと上記だと
production(本番環境)のgemを除いたローカルgemがインストールされます。

数が多かったりするとうまく動かない。(エラーになる)
その時は

```
$ bundle update 
```

を行う。

#バリデーション

```app/models/micropost.rb
class Micropost < ApplicationRecord
validates :content, length: {maximum: 140}
end

```

バリデーションというのは
>text入力内容や記述内容が要件を満たしているか、妥当性を確認すること

上記では
`:content`、投稿する内容の
`:length`長さが
`{maximum: 140}`最大140文字
というバリデーションが記述されています。

投稿する内容が140文字を越えるとエラーメッセージが表示されます。



他にもMVCなどについて詳しく書いてあるのですが
ほぼコピペになってしまいそうなので以上です。。。
RobomasterS1でどこまでできるか調査　#1

RobomasterS1 を組み立てていて気付いたこと。
タイヤの駆動力は部分は３つのボスでうける。スラストを止めるネジは一本
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497572/de20182e-e6d9-79a9-720a-6053872bccdc.png)

モータのハウジングのみアルミ。強度というよりはヒートシンク
配線の止め方のアイデアは参考になる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497572/aab0a90e-2142-2a75-bd0e-be898adc1061.png)

フローリングでの音は300mm/sくらいまでは気にならない 

モータはアウターロータでダイレクト。
900rppmで50mNmという記載ある。
直径は３５ｍｍ程度か。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497572/ca70c6cb-8f8c-9abe-42f2-9a7bd3f70162.png)


組み立てはだいたい二時間くらいで完了
Logic Appsのサブスクリプションを移動した後に必要な事

# 前書き

Logic Appsを運用していたサブスクリプションを「サブスクリプションの移動」で移動させてみたのですが、移動後に操作が必要だったので覚書です。

![2019-09-15_22h39_15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449038/779154a9-dcfa-74f6-ae9c-0bc097ed62ae.png)


# 移動後の問題

ロジックアプリ、API接続共に以降は出来たのですが

![2019-09-15_22h38_21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449038/2b49f382-6b08-2631-8d14-9f2f7142d701.png)

デザイナーで確認すると、接続が無効になっています。また、一覧から移行済みの資格情報を選びなおすことも出来ません。

![2019-09-15_22h40_17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449038/16b82d5a-7768-cab0-fbbc-723441bc1d74.png)

コードビューを見ると、connectionsで定義されているconnectionIdとIdが、移行前のサブスクリプションのIDになっています。

![2019-09-15_22h42_20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449038/91bdf3a5-2214-0919-f35d-a59a46ba67c8.png)

サブスクリプションIDを新しいものに置換してあげると、デザイナービューでのエラーは消えました。

![2019-09-15_22h45_22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449038/77708e35-98b6-22e3-8b46-65300e17dfa5.png)

# 後書き

ただ、この修正を行う前も、Logic Appsそのものは動いていました。編集にのみ影響が出来ていたように見えます。

サブスクリプション以降に伴う資格情報再作成までは不要ですが、ロジックアプリを一つずつ直す必要があるのでちょっと手間ですね。

（そんなに頻繁にやる操作ではないと思いますが）

# 参考情報

* [ロジック アプリのリソースを別の Azure サブスクリプション、リソース グループ、またはリージョンに移行する] (https://docs.microsoft.com/ja-jp/azure/logic-apps/move-logic-app-resources)
Kotlinと図で学んでみるデザインパターン -2章 Adapterパターン-


# Adapterパターン

既に供給されているclassを、あるもの(新しいAPIなど)に対して最適な形に形成して提供する。
100Vの電源タップから、アダプターを介し、12Vの電源を使用するイメージ。

## 継承
![Adapter Diagram (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187392/552372d3-8f0f-b57c-6070-be8da0b8b8ee.png)

```kotlin:
open class Banner(private val string: String) {

    fun showWithParen() {
        println("($string)")
    }

    fun showWithAster() {
        println("*$string*")
    }
}
```
```kotlin:
interface Print {
    fun printWeak()
    fun printStrong()
}
```
```kotlin:
class PrintBanner(string: String) : Banner(string), Print {
    override fun printWeak() {
        showWithParen()
    }

    override fun printStrong() {
        showWithAster()
    }
}
```

## 移譲
![Adapter Diagram (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187392/415797e2-0777-fa87-e36c-448f1ced21e6.png)

```kotlin:
abstract class Print2 {
    abstract fun printWeak()
    abstract fun printStrong()
}
```
```kotlin:
class PrintBanner2(private val string: String) : Print2() {

    private var banner: Banner = Banner(string)

    override fun printWeak() {
        banner.showWithParen()
    }

    override fun printStrong() {
        banner.showWithAster()
    }

}
```
```kotlin
class Banner(private val string: String) {

    fun showWithParen() {
        println("($string)")
    }

    fun showWithAster() {
        println("*$string*")
    }
}
```
## FileProperties ← Adapter → java.utils.Properties
```kotlin:
interface FileIO {
    fun readFromFile(fileName: String)

    fun writeToFile(fileName: String)

    fun setValue(key: String, value: String)

    fun getValue(key: String)
}
```
```kotlin:
class FileProperties : Properties(), FileIO {

    override fun readFromFile(fileName: String) {
        load(FileInputStream(fileName))
    }

    override fun writeToFile(fileName: String) {
        store(FileOutputStream(fileName), "written by FileProperties")
    }

    override fun setValue(key: String, value: String) {
        setProperty(key, value)
    }

    override fun getValue(key: String) {
        getProperty(key)
    }
}
```
## main
```kotlin:
fun main() {

    val p: Print = PrintBanner("Hello World")
    p.printWeak()
    p.printStrong()

    val f: FileIO = FileProperties()
    try {
        f.readFromFile("src/file.txt")
        f.setValue("year", "2004")
        f.setValue("month", "4")
        f.setValue("day", "21")
        f.writeToFile("newfile.txt")
    } catch (e: IOException) {
        e.printStackTrace()
    }
}
```

※ Java 言語で学ぶデザインパターン入門をKotlinと図で理解しようとしている学習用アウトプットです。UML書式に沿ってはいません。
GIthubWebhookでPR作成時にコミット情報をSlackへ通知

https://qiita.com/yousan/items/05b7c61ecca02bc3eceb

この記事の通り
自分の方は2のGithub Appで認証を掛けるまで完了していたので省略

３，４の`通知させたいチャンネルにGitHubを招待`と`/github コマンドでリポジトリを購読（Subscribe）`から説明

# 通知させたいチャンネルにGitHubを招待

通知を受けさせたいチャンネルに行って@GitHubと入力して叩くだけ

# リポジトリを購読させる

通知を受けさせたいチャンネルで`/github subscribe ユーザー名/リポジトリ名`で購読されて、 PR作成時やStatusが変わったときにチャンネルに通知されるようになります

```
# デフォルトで通知を行う機能
- issues (イシュー)
- pulls (プル)
- statuses (ステータス)
- コミット
- deployments (デプロイメント)
- public (パブリック)
# デフォルトで通知されない機能
- reviews (レビュー)
- comments (コメント)
- branches (ブランチ)
- commits:all (すべてにコミット)
```

これだとコメントをもらっても通知がこないのでコメントを貰ったときにも通知がくるようにします

`/github subscribe ユーザー名/リポジトリ名 comments`を叩くだけです

逆にリポジトリの購読を終了して、通知がこないようにするには`/github unsubscribe ユーザー名/リポジトリ名 comments`を叩くだけです
通知対象をデフォルトのものから変えてない場合は`/github unsubscribe ユーザー名/リポジトリ名`だけでOK

## 参考
subscribeする各機能についてまとめられている
https://innoaus.jp/posts/20190307_1/
型の別名定義(using エイリアス ディレクティブ)を入れ子にする (c#)

# 前提
- c# 5～


# 試したこと
- using エイリアス ディレクティブを使用して、型の別名を定義し、その別名を使用して新たに別名を定義してみました。

### エラー
```cs:
using SpreadSheet = Matrix<string>;
using SpreadSheetBook = Dictionary<string, SpreadSheet>;
namespace SpreadSheetManager {
```

```cs:
namespace SpreadSheetManager {
	using SpreadSheet = Matrix<string>;
	using SpreadSheetBook = Dictionary<string, SpreadSheet>;
```

### 可能
```cs:
using SpreadSheet = Matrix<string>;
namespace SpreadSheetManager {
	using SpreadSheetBook = Dictionary<string, SpreadSheet>;
```

```cs:
namespace SpreadSheetManager {
	using SpreadSheet = Matrix<string>;
	namespace xxx {
		using SpreadSheetBook = Dictionary<string, SpreadSheet>;
```

### 正解
```cs:
namespace SpreadSheetManager {
	using SpreadSheet = Matrix<string>;
	using SpreadSheetBook = Dictionary<string, Matrix<string>>;
```

```cs:
using SpreadSheet = Matrix<string>;
using SpreadSheetBook = Dictionary<string, Matrix<string>>;
namespace SpreadSheetManager {
```


### 別解
```cs:
namespace SpreadSheetManager {
	public class SpreadSheet : Matrix<string> { }
	public class SpreadSheetBook : Dictionary<string, Matrix<string>> { }
```
- 少し付け加えたくなることってありますよね。

# 解ったこと
- 同じnamespace階層では、定義した別名は、他の別名の定義で使用できません。
- 親のnamespace階層で定義した別名は、子階層の別名定義で使用可能です。
- using エイリアス ディレクティブを、入れ子にする必要はありません。
- 別名を付けるような場合は、手を入れたくなることも多いので、結局、継承クラスを作ることになりがちです。
【Bootstrap入門】グリッドシステム

##1. グリッドシステムとは
画面を12個に分割する考え方のこと。


##2. 画面の幅の大きさごとに、12分割の分け方を指定する

###2-1. 画面の幅：〜768px
Bootstrapでの扱い：__xs__ (extra small)
（例）スマホなど

###2-2. 画面の幅：768px〜992px
Bootstrapでの扱い：__sm__ (small)
（例）タブレット

###2-3. 画面の幅：992px〜1200px
Bootstrapでの扱い：__md__ (medium)
（例）小さめのパソコン

###2-4. 画面の幅：1200px
Bootstrapでの扱い：__lg__ (large)
（例）ふつうのパソコン

##例1：lgとmdを使用してみる

```html

<!--.containerと.rowの中に入れると、.colが有効になる-->
   <div class="container">
       <div class="row">
           <div class="col-lg-3 col-xs-6">テスト1</div>
           <div class="col-lg-3 col-xs-6">テスト2</div>
           <div class="col-lg-3 col-xs-6">テスト3</div>
           <div class="col-lg-3 col-xs-6">テスト4</div>
       </div>
   </div>
```

__画面の幅：1200px〜(lg)__
<img width="1276" alt="スクリーンショット 2019-09-15 21.58.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/366833/3d60e5df-52b7-8241-4ff4-3143f54d7c06.png">

__画面の幅：〜768px(xs)__
<img width="794" alt="スクリーンショット 2019-09-15 21.58.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/366833/24d91849-f028-6c0b-8682-9996b0238cdc.png">


__疑問点：今回はlgとxsを指定しているが、指定していないmdとsmの画面サイズの時はどうなるのか？__
lg（1200px＝）を切った時点で、指定された次のxs（〜768px）が適用されるようになっている。

##例2：hiddenを使用してみる

```html

<div class="container">
    <div class="row">
         <div class="col-lg-3 col-md-6 col-xs-6">テスト1</div>
        <div class="col-lg-3 col-md-3 col-xs-6">テスト2</div>
        <div class="col-lg-3 col-md-3 col-xs-6">テスト3</div>
        <div class="col-lg-3 hidden-md col-xs-6">テスト4</div>
    </div>
</div>
```

__画面の幅：1200px〜(lg)__
<img width="1278" alt="スクリーンショット 2019-09-15 22.13.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/366833/961a2e90-b0b2-599b-3804-b4830e854c1c.png">

__画面の幅：992px〜1200px(md)__
<img width="1129" alt="スクリーンショット 2019-09-15 22.13.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/366833/5a7bb0f2-d148-0866-5da3-756dbba3378b.png">
=> `hidden-md`が効いて、画面の幅が992px〜1200px(md)のときだけ"テスト4"が消えている。

__画面の幅：〜768px(xs)__
<img width="898" alt="スクリーンショット 2019-09-15 22.13.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/366833/2660ef5f-e780-1f0a-9bce-fa90321a3d9a.png">
【OtakuAssembly第4章】訂正・補足

# 【OtakuAssembly第4章】訂正・補足

[OtakuAssembly](https://otakuassembly.taprix.org/)第4章の筆者、miyagaw61です。
OtakuAssemblyの第4章にて、訂正と追記が必要な個所がいくつかあったため、ここに記していきます。

## 訂正

### p153 - デバッギOSの設定変更

`\.\pipe\com_0` -> `\\.\pipe\com_0`

## 追記

### p153

「デバッギOSの設定変更」の項の直後、デバッガOSでも同じ設定をしてください。
また、デバッガOSでは、同じタブで「存在するパイプ/ソケットに接続」にチェックを入れてください。
Unity+ARKit3のbody segmentation結果を配列として取得する

#既知の問題(2019/9/16更新)
以下の方法は、セグメンテーションのテクスチャに限り、端末の向きを変更するとそれ以降値が変化しなくなる問題が起きています。（デプスのテクスチャは問題なし。Orientation設定は関係なし）
そのため、あまり上手い方法ではないかもしれませんので、そのつもりで利用してください。

#やりたいこと
ARKit3を利用することで人物領域をセグメンテーションすることができる。
しかし、結果がTexture2Dとして取得されるので、そのままでは結果を加工しにくい。
なので、byteなどの配列として結果を取得したい。

#ハマったポイント
Texure2Dなので、GetPixels()などを使えば一瞬だと思ったが、関数がうまく機能しないらしい。

#原因(推定)
UnityのARKit3プラグインを確認していくと、このTexture2Dはネイティブで作られている模様。（CreateExternalTexture/UpdateExternalTextureでの作成・更新処理を発見）
Texure2Dはネイティブで作られたものをラップしているだけなので、GetPixels()などの関数が正しく機能しなかったと思われる。
参考（テラシュールブログさん）：
http://tsubakit1.hateblo.jp/entry/20140104/1388830289
http://tsubakit1.hateblo.jp/category/トラブルシューティング?page=1469026740#RenderTextureをTexture2Dに流し込む

#解決策
凹みTipsさんの
[Low-Level Native Plugin Interface を利用してネイティブから Unity のテクスチャを高速に更新する方法を調べてみた - 凹みTips](http://tips.hecomi.com/entry/2016/01/04/183121)
によると、iOSにおいてはid\<MTLTexture\>がテクスチャの実体らしいので、以下のようなプラグインを書いて、配列として取得することで解決。
id<MTLTexture>から配列としてデータを取得する関数は以下。
https://developer.apple.com/documentation/metal/mtltexture/1516318-getbytes

```objective_c:/Assets/Plugins/iOS/TextureExtention.mm
#import <Metal/Metal.h>
#import <MetalKit/MetalKit.h>

extern "C" {
    void GetNativePixels(id<MTLTexture> texture, int width, int height, int sizePerRow, char *buffer) ;
}

void GetNativePixels(id<MTLTexture> texture, int width, int height, int sizePerRow, char *buffer) {
    [texture getBytes:buffer bytesPerRow:sizePerRow fromRegion:MTLRegionMake2D(0, 0, width, height) mipmapLevel:0];
}
```

```c#:/Assets/Plugins/TextureExtention.cs
using System;
using UnityEngine;
using System.Runtime.InteropServices;

public class TextureExtention { 
	[DllImport("__Internal")]
	public static extern void GetNativePixels(IntPtr texturePtr, int width, int height, int sizePerRow, [Out] byte[] buffer);

	public static void GetNativePixels(Texture2D humanTexture, ref byte[] buffer) {
        // humanTexture は ARKit3で取得されたセグメンテーション結果が格納されたテクスチャ
        IntPtr humanTexturePtr = humanTexture.GetNativeTexturePtr();
        int width = humanTexture.width;
        int height = humanTexture.height;
        int sizeParRow = humanTexture.width * 1; // ボディセグメンテーションではテクスチャフォーマットはR8なので 1ピクセル=1Byte
        GetNativePixels(humanTexturePtr, width, height, sizeParRow, buffer);
	}
}
```

#補足
今回ネイティブプラグインを作って対処しましたが、Unity内でRenderTexture->Texuture2Dへの変換のようにテクスチャを本当のTexutre2Dコピーして、GetPixels()を使う方法でもできるかもしれません。
また、セグメンテーション結果ではなくデプス推定結果でも同じようにすれば大丈夫です。その際はテクスチャフォーマットがRFloatなので、その調整をする必要があります。

#動作環境
Unity 2019.2.5f
Xcode 11 GM Seed

#感想
GetPixels()が使えないという判断までも時間がかかったし、初めてのiOSネイティブプラグイン作成だったので色々苦労してしまいました…。
【受験記録】AWS Cloud Practicioner(CLF-C01)

## 前提
- SIer勤務3年目
- アプリケーション開発者
- インフラはほぼ分からない
- クラウドのメリット、デメリットはなんとなくわかる。
- 受験日 2019/9/13

##試験概要

問題数:65問
時間:100分
合格点:700点/1000点
- 問題は選択肢形式のみで、4つの選択肢から1つ、もしくは5つの選択肢から2つを選ぶのみでした。画面が与えられて選ぶ形式もなかったです。
- その他の問題は一度回答した後でも、戻って振り返り、変更をすることができました。画面で"後でチェックする"というボタンもあり、すべて回答後、チェックを付けた問題がどれかわかるようになっていました。

セクション名
- クラウドの概念(28%)
- セキュリティ(24%)
- テクノロジー(36%)
- 請求と料金(12%)

## 勉強方法
1. [AWS Cloud practicioner Essentials](https://www.aws.training/Details/Curriculum?id=27076)を視聴。
2. [AWS認定資格試験テキスト AWS認定 クラウドプラクティショナー](http://ur0.work/Dbvk)を1周読み込み。
3. 以下2冊の本を読み込み。(AWS SAA資格以降の本です。)
    - [AWS認定アソシエイト3資格対策](http://ur0.work/JVN6)
    - [この1冊で合格! AWS認定ソリューションアーキテクト](http://ur0.work/YM1U)

## 感想
- 各サービスについての理解は深くなくても大丈夫。(AのサービスはBするために使うという感じで)
- コストや管理に関する部分はもう少し自分で勉強したほうがよかったと思う。
- 難易度は前回のAZ900よりは難しく感じた。
- 1か月以内にはSAA資格もとりたいなぁ
自己紹介

# 自己紹介　はじめまして

Qiitaをはじめるにあたりあなたはだれ？を書いていきたいなと。

## プロフィール
-  尾崎充志(Ozaki Atsushi)　1992年5月24日生(27歳)
- 趣味：スキー・スノボ、ゲーム、飲酒(クラフトビールと日本酒が特に好み)

## 何をやっているの？
青森県を拠点にフリーランスエンジニアをしています。web制作を中心にクラウドソーシングや地元にweb企業様、直営業等でお仕事をいただいてます。　＊現在クラウドソーシングでの活動は停止中（理由は後述）

**フリーランス前は何をやっていたの？**
青森県の清酒メーカーで営業をしていました。創業して３００年以上の超老舗で、現代の日本酒を牽引できるであろうイカしたお酒を醸造する会社です。
酒専門店（スーパーじゃないよ）や飲食店等法人営業が中心でした。しかし社員が少ない企業だったので、配達や広報や商品作りや売上管理やシーズン中は酒造りや会社内のことは全てやってました。

## なんでエンジニアに？
**きっかけ**
営業の生産性を上げるために色々なシステムを組みたくなったからです。
営業をしている中、顧客1人ひとりのデータを整理して見える化し、より顧客に明確な提案をしようとExcelをベースに売上管理表とかを作ってました。顧客のデータベースから情報をコピーし、Excelにペーストするような簡素なものでした。全て手作業で行なっていたため毎日膨大な時間を時間を取られていました。当時の知見では自動化などできず、その時にプログラミングという分野を知りました。そこから営業の生産性を上げるべく勉強をはじめました。

**適性の判断**
プログラミングとはを知るためにProgateに手をつけました。書いたコードが実際に形になったり、適切に処理が行われた時に大きな高揚感や達成感を覚えのめり込んでいきました。

正直Progateで判断するのは早くないかと思う方もいるかもしれませんが、当時の私には十分すぎるきっかけでした。
当初は営業用のシステム組めればいいとだけ考えてましたが、次第にこんなサービスを作りたいと考えるようになりました。

**いきなりフリーランスになった**
勉強をはじめすぐの時に飲み屋でたまたまフリーランスでバリバリ活動している方とお友達になりました。その方から話を聞いていくにつれ、多様性のある稼ぎ方に憧れを抱いたのもありますが、それよりも**個人がお金を稼ぐのはどれほど大変なのか**という点に興味が湧き、それを実感したいと考えました。
また、プログラミングを学んでいる最中、私の田舎のたくさんの方から「こんなサービスが欲しい」や「これを解決したい」と話を聞きました。多く存在する小さな問題を解決していきたいとも思い、フリーランスを決意しました。
約半年の独学を経て、2018年10月よりフリーランスとして活動をはじめました。


## フリーランスとして
最初の方に書きましたが、web制作を中心にクラウドソーシングや地元にweb企業様、直営業等でお仕事をいただいてます。クラウドソーシングではコーディングやwordpressの簡単なカスタマイズ等を中心に行い、直営業は前職の繋がりから若手の飲食店等のHP制作をしました。web会社様からはHP制作やHPの更新作業等お仕事をいただきました。
営業から制作、納品までを全て1人で行うのは大変でした。しかし依頼主様から感謝の言葉をいただいた時は非常に嬉しく思い達成感も感じれました。決して裕福な収入があったわけではありませんが、多くのことを学ぶことができました。

## 将来への不安と目標の原点回帰
フリーランスの片手間にとある建具屋のお手伝いをしていた際に、「こんなアプリは作れないのか」というお話をそこの社長さんから言われました。その時私は「作れますよ。」と言えませんでした。web制作のみしか行なっていなかったので当然です。
私が目標としている小さな問題を解決できるサービスを開発・運用するエンジニアになるためにはフロントエンドだけでは足りないと、恥ずかしながらこの時に実感しました。今のままでは目標を達成できないと同時に、将来フロントエンドのみでは収入が安定しないとも考え、サーバーサイドをオンラインスクールで学びはじめました。

## エンジニアとしての将来
目標は変わらず、小さな問題を解決できるサービスを開発・運用できるエンジニアになることを目指しています。そのために開発としてモダンな技術はもちろんのこと、運用に対するお金の循環に関しても知識を身につける必要があると考えています。

**フリーランスではなく組織の一員として**
前職で働いていた当時、幅広く活躍するには個人でないとできないと考えていました。業界の知識がなく非常に狭い視野での考えだったと思います。
IT企業のほとんどが、人々が抱く小さな問題を解決し、またその小さな問題の根底にある大きな問題も解決するべく活動しています。組織に属しそこで貢献することでより多くの人々の生活を豊かにできると思い、フリーランスではなくエンジニアへの転職を目指しています。

## Qiitaの使い方
さて、長々と自己紹介をしてしまいましたが、ここでは学んだことのアウトプットする場として使っていきたいと考えます。
現在プログラミングスクールでの学習を終え、オリジナルアプリの作成も終わりました。そこで苦労した点や学びが多かった点を改めてアウトプットしていきます。
よろしくお願いいたします。

## 作品一覧
- ポートフォリオサイト： https://atsushiozaki-portfolio.com/
    - フリーランス時に使用していたポートフォリオサイトです

- 作成したオリジナルアプリ(Pes-Cate)：https://pes-cate.herokuapp.com/topics
    - youtubeの動画をシェアできるプラットホームです
    - Pes-CateのGitHub：https://github.com/AtsushiOzaki0524/pes-cate
CTFにつかえるツール

# 符号化

## base64

ASCII文字列をBase64にエンコードしたり、逆にデコードしたりする。

```bash:encode
$ echo -n Qiita | base64
UWlpdGE=
```

```bash:decode
$ echo -n UWlpdGE= | base64 -d
Qiita
```

改行コードをエンコード・デコードしないように、`echo` に `-n` オプションをつける。

# バイナリ

## file

不明なファイルの種類を確認する。

```bash
file obj_file_name
```

## GHex

バイナリファイルを編集するツール。

![GHex](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114392/888f4c8a-d371-2a95-fd86-619dd6bc2bda.png)

## strings

バイナリファイルから文字列を抽出する。

```bash
strings binary_file_name
```

# オブジェクトファイル

## objdump

オブジェクトファイル（ELF）をアセンブラファイルに変換する。

```bash
objdump -D obj_file_name > asm_file_name
```

## ltrace

オブジェクトファイルを実行し、トレースを表示する。

```bash
ltrace obj_file_name obj_parameter...
```

# 参考

- https://www.codementor.io/packt/reverse-engineering-a-linux-executable-hello-world-rjceryk5d
- [Intel x86 JUMP quick reference](http://www.unixwiz.net/techtips/x86-jumps.html)