Programming Memo

RailsとかAWSとか色々

mysqlのコマンド

Login

$ mysql -u root -p database_name;
$ exit

Database

mysql> show databases;
mysql> user database;
mysql> create database database_name;
mysql> remove database database_name;
$ mysqldump -u username database_name > dump.sql
$ mysql -u username -p password -D database_name < dump.sql

Table

mysql> show tables from database;
mysql> show indexes from table;
mysql> create table users (
  id int not null auto_increment primary key
  name varchar(255)
  email varchar(255) 
);
mysql> insert users into (
  name, email
) values (
  'sample', 'sample@sample.com'
);
mysql> select * from users
where like '%sample.com' limit 10 order by id desc;
mysql> update database_name.users set name = 'updated_name'
where email = 'sample@sample.com';
mysql> delete from users where id = '1';

User

mysql> select host, user, password from mysql.user;
mysql> create user 'sample'@'localhost` identified by 'password';
mysql> select password('password');
mysql> set password for 'sample'@'localhost' = '*2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19';
mysql> grant all on database_name.* to 'sample'@'localhost';
mysql> show grants for 'sample'@'localhost';

MysqlAdmin

$ mysqladmin -u root -p create database_name;
$ mysqladmin -u root -p drop database_name;
$ mysqladmin -u root -p flush-privileges;
$ mysqladmin -u root -p status;
$ mysqladmin -u root -p password password;

apt-getまとめ

apt-getについてまとめた。

apt-getはDebian用に開発されたパッケージマネージャーである。 CentOSFedoraなどのRedHat系のディストリビュージョンでは、yumが標準でインストールされていてそれぞれのディストリビューションで使い分けられる。

apt-getと依存関係にあるパッケージマネージャーとしてdpkgとaptitudeがある。 apt-getはdpkgに依存し、aptitudeはapt-getより複雑なパッケージのインストールを担えるらしい。 dpkgでもapt-getでも同じようにパッケージのインストールが可能だが dpkg < apt-get < aptitude の順により高機能になり、例えばaptitudeでは対話型のインターフェスがある。 その分、aptitudeの方が実行速度が遅く、メモリの消費が激しいなどのデメリットがある。

apt-getとaptitudeって結局どう違うの(´・ω・`)? – もぐら王国

# apt-get: パッケージを取得してインストール
apt-get install # パッケージのインストール
apt-get update # パッケージリストの更新
apt-get upgrade # インストールされたパッケージの更新
apt-get remove # パッケージの削除

# apt-cache: aptライブラリのパッケージキャッシュにアクセスして情報を参照したり検索したりする
apt-cache search # パッケージの検索
apt-cache show # パッケージ情報の表示
apt-cache policy # インストール可能なバージョンの表示

# dpkg: インストールされたパッケージの管理
dpkg -l # インストールされたパッケージの一覧
dpkg -L # パッケージインストール時のファイルの一覧
dpkg -i # パッケージのインストール
dpkg -r # パッケージの削除 

# aptitude
aptitude search
aptitude show
aptitude install
aptitude remove

ついでにDebianで文字化けが発生していたので調べて解決した。 chonmeng-wong.hateblo.jp /etc/bash.bachrcに以下を追記して文字化けが治った。

case $TERM in
    linux) LANG=C ;;
    *) LANG=ja_JP.UTF-8 ;;
esac

テンプレートを利用してWAFのACLを作成する

テンプレートを用いたAccess Controll Listの作成

AWS WAFの英語版ドキュメントに公開されているURLを指定してCloudFormationのstackを作成すると、WAFにACLのサンプルを作成できる。 Tutorial: Quickly Setting Up AWS WAF Protection Against Common Attacks

On the Select Template page, choose Specify an Amazon S3 template URL. For the template URL, enter https://s3.amazonaws.com/cloudformation-examples/community/common-attacks.json

作成されるRuleとConditionは以下の通り。

ACL: CommonAttackProtection

  • CommonAttackProtectionSqliRule

    • URI contains SQL injection threat after decoding as URL.
    • Query string contains SQL injection threat after decoding as URL.
    • Query string contains SQL injection threat after decoding as HTML tags.
    • Body contains SQL injection threat after decoding as URL.
    • Body contains SQL injection threat after decoding as HTML tags.
  • CommonAttackProtectionManualIPBlockRule

    • There are no IP addresses in this IP match condition.
  • CommonAttackProtectionXssRule

    • Body contains a cross-site scripting threat after decoding as URL.
    • Query string contains a cross-site scripting threat after decoding as URL.
    • Body contains a cross-site scripting threat after decoding as HTML tags.
    • Query string contains a cross-site scripting threat after decoding as HTML tags.
    • URI contains a cross-site scripting threat after decoding as URL.
  • CommonAttackProtectionLargeBodyMatchRule

    • The length of the Body is greater than 8192.

削除する場合は、stackをdeleteすればACL以下のすべてのオブジェクトがまとめて削除される。

費用

このACLで発生する費用は 9USD / Month (ACL 5USD × 1) + (Rule 1USD × 4) = 9USD 料金 - AWS WAF | AWS - Amazon Web Services

AWS CLI

ここから先はAWS CLIで登録する手順。

まず、公式ドキュメントにあるStackを作成するためのサンプルポリシーをjsonで保存するか、自作でPolicy Documentを作成する。 AWS Identity and Access Management によるアクセスの制御 今回は以下の自作のPolicy Documentを利用する。

{
    "Version":"2016-09-20",
    "Statement":[{
        "Effect":"Allow",
        "Action":[
            "cloudformation:*"
        ],
        "Resource":"*"
    }]
}

IAMのポリシーがアタッチされたユーザーでstack作成用のポリシーを作成する。 create-policyメソッドで--policy-documentに先ほどのjsonを指定する。 同時に作成したポリシーのARNを取得しておく。

$ CF_POLICY_ARN=$( \
$   aws iam create-policy \
$     --policy-name AmazonCloudFormationFullAccess \
$     --policy-document file://cloudformation_fullaccess_policy.json \
$     --query 'Policy.Arn' \
$     --output text \
$ )
$ echo $CF_POLICY_ARN

上記のポリシーをユーザーにアタッチする。

$ aws iam attach-user-policy \
$   --user-name <USER_NAME> \
$   --policy-arn ${CF_POLICY_ARN}

続いて、ユーザーにWAFFullAccessポリシーをアタッチする。 あらかじめアタッチしておかないと、stackを作成する際にAccessDeniedExceptionでエラーになるので注意。

$ aws iam attach-user-policy \
$   --user-name <USER_NAME> \
$   --policy-arn 'arn:aws:iam::aws:policy/AWSWAFFullAccess'

stackを作成する。 10分ほど時間がかかるので放置。

$ aws cloudformation create-stack \
$   --stack-name 'commonattackprotection' \
$   --template-url 'https://s3.amazonaws.com/cloudformation-examples/community/common-attacks.json'

以下、作成されたWAFのオブジェクトを確認するコマンドの一覧。

# 全オブジェクト
$ aws cloudformation list-stack-resources
$ aws cloudformation describe-stack-resources
# ACL
$ aws waf list-web-acls
# Rule
$ aws waf list-rules
# Condition
$ aws waf list-byte-match-sets
$ aws waf list-size-constraint-sets
$ aws waf list-xss-match-sets
$ aws waf list-ip-sets
$ aws waf list-sql-injection-match-sets

不要になったらstackをdeleteする。

$ aws cloudformation delete-stack --stack-name 'commonattackprotection'

viの基本 他

今日インターンでやったこと。

  • [x] viの基本
  • [x] UNIXの基本
  • [x] Debianをインストールする

viの基本

知ってるコマンドを飛ばしつつ、一通り目を通す。

Filesystem Hierarchy Standard - Wikipedia

nanasi.jp

Unix

リンク先の記事を読みつつ、内容の幾つかをピックアップ。

http://pen.agbi.tsukuba.ac.jp/~RStiger/hiki2/?UNIX%A4%C8%A4%CF+%2F+CUI%A4%C8GUI+%2F+%A4%CA%A4%BCUNIX%A4%CA%A4%CE%A4%AB%3F

www.garunimo.com

テキストデータ処理

  • awk 列の抽出、計算、条件分岐、ソートなどの処理ができる言語とのこと。 awkを極めればこのコマンドだけで様々な処理ができるとの噂を前々から聞いていたものの、 まだ使いこなせていないためにその真価を理解できていません。 awkの書籍があるぐらいなので、そのうち目を通しておきたいです。

バイナリデータ処理

現状バイナリデータを処理した経験がなく、今回初めて目にしたコマンドの oddd

SSH

  • ポートフォワーディング

    SSHの強力な機能として、「ポートフォワーディング」というものがある。これは、あるUNIXサーバー(SSHサーバー)を踏台にして、別のサーバーに接続する技術である。たとえば、あるUNIXサーバー(これをAと呼ぼう)が、あるサービスを、特定のクライアントにしか提供していないとする。しかし、もしその「特定のクライアント」のひとつ(これをBと呼ぼう)がSSHサーバーであるならば、そのSSHサーバーに接続することができる人ならば、世界中のどのクライアントからでも、そのSSHサーバーBを踏台にして、サーバーAのサービスを受けることができる。

iptablesで設定できるFORWARDチェインのことみたいですね。

Debianをインストールする

プラクティスにDockerを利用する場合のリンクがあったので、 未だにDockerを触っていなかった私はいい機会だと思い、DockerとDocker Imageを利用してDebianをインストールしました。 しかし、あまりにも簡単すぎて自力でインストーラーを使ってインストールする方法を学ぶことができませんでした。 これでは本末転倒なので、次回ほかのVPS上などでインストールしたいと思います。

ちなみに以下がDockerにおけるDebianのインストール方法です。 これはほんとに簡単だ...。 あとはDocumentなどに目を通してDockerの概念を理解しておきたいです。

$ brew cask install virtualbox
$ brew install docker
$ brew install docker-machine
$ docker-machine create --driver virtualbox debian-docker
$ docker-machine ls
NAME            ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER    ERRORS
debian-docker   -        virtualbox   Running   tcp://192.168.xx.xxx:xxxx           v1.12.1
$ docker-machine status debian-docker
Running
$ docker-machine ssh debian-docker
$ docker pull debian:latest
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
debian              latest              031143c1c662        2 weeks ago         125.1 MB
$ docker run -i -t debian

Fjordインターン6日目(学習週) 前回の続き & CSSの基本を理解する

作業時間

20:00~24:00

この課題で行う学習内容

HTMLの基本を理解する(前回の続き)

  • [x] gistのtxtファイルをforkしてmarkupする
    • [ ] 課題を提出してレビューをもらう
  • [x] ブログをMarkdownで書く
    • [x] プレビューのキャプチャをgyazoでとりレビューをもらう

CSSの基本を理解する

本日は昨日の続きと CSSの基本を理解する」 を進めました。

昨日はgistのpushがうまくいかずにつまづいていましたが、 結局sshでgit cloneし直したところ問題なくpushできました。 つい昨日のことのことのはずなのに記憶がうろ覚えですが、 どうもpecoの入力履歴を見る限りhttpでcloneしていたようです。 一体私は何をやっていたのか…。 それにしてもhttpでcloneしたとはいえ、githubと同様のusernameとpasswordでなぜはじかれたのかはわかりませんでした。

gistをマークアップしたあとは参照記事を読んだり、 ドットインストールのCSS動画を途中まで進めました。

学習中に発生した問題・疑問・はまったこと

  • htmlのマークアップで一度pushした内容を修正して git commit --amend 後にpushしたら変更が反映されなかった。

次回やることメモ

  • CSSの続きを進める

感想

CSSも久しぶりでだいぶ基礎の部分がうろ覚えで危うい感じでした。 もう少しRailsの勉強が進んだら、フロントも集中的に学習する時間をとりたいですね。

それにしても日中活動したあとだと、なかなか集中力がもたない…。

Fjordインターン5日目(学習週) HTMLの基本を覚える

HTMLの基本を理解する

作業時間

10:00~22:30

この課題で行う学習内容

  • [x] gistのtxtファイルをforkしてmarkupする
    • [ ] 課題を提出してレビューをもらう
  • [x] ブログをMarkdownで書く
    • [ ] プレビューのキャプチャをgyazoでとりレビューをもらう

本日はプラクティスの 「HTMLの基本を理解する」を進めました。

以前にもドットインストールの動画や書籍で学習したことがありましたが、 最近HTMLを重点的に勉強する機会から遠ざかっていたので復習がてらプラクティスを進めました。

内容的には丸1日も時間をかけるボリュームではなかったと思いますが、 結局終わり切らなかったので明日早々に終わらせて次のCSSに進みたいと思います。

学習中に発生した問題・疑問・はまったこと

  • VimのEmmetのpluginを入れて展開するキーを設定しようとしたものの、なぜか反映されなかった。
  • git cloneしたgistの変更をpushしようとするとusernameとpasswordを求められ、Githubと同じものを入力するとInvalid username or passwordで怒られる。

次回やることメモ

  • gistのpushについて調べてこのプラクティスを終わらせる
  • 次のCSSに着手する

感想

Vimの予測変換やEmmetをうまく使いこなせなかったためか、 思ったほどスムーズにマークアップが進みませんでした。

他にも各HTML要素の使いどころが正しいのかどうか、 いまいち確信が持てないところがあったのでまだまだ学習とコーディングの経験が必要だと感じました。

あとはやはり Haml を覚えて使いこなせるようになるのが一番ですね。

Fjordインターン 4日目(作業週) 投稿画像非公開設定

作業時間

12:00~19:30

本日の作業内容

  • [x] kowabanaのgit cloneからrails sでlocalhostを動かすまで
  • [ ] 画像投稿の公開範囲設定機能の追加
    • [x] モデルに非公開フラグカラムを追加する
    • [ ] フォーム
      • [x] フォームに公開設定を選択できるラジオボタン(あるいはプルダウン)を設定
      • [ ] ラベルの日本語設定
  • [ ] 以下の場所で非表示設定
    • [ ] 画像一覧
    • [ ] 怖い話投稿時の壁紙設定

発生した問題

  • formのラベル用にenum_helpをインストールしてみたものの、うまく設定が反映されず…。config/localesの設定がおかしいのかもしれない

次回やること

  • 日本語設定の続きからチケットを終わらせるまで進めたい