sedのお勉強1

sedは奥が深いデスネ。。いっつもsed&awk特集でsedはちょこっとawkどっさりなイメージがあるけれど、あらためてsedを見てみた。

sedはtextを1行ずつ読み込んで処理する。読み込んだ1行を保持するのがパターンスペースで、明示的に保持しておくためのバッファにホールドスペースがある。

ストファイルはこんなファイル

1111
2222
3333
4444
5555
6666
7777
8888
9999
0000

-n は明示的にprintをしない限り、出力しない。

パターンスペースの内容を吐き出し次の行へ。ふと思ったけど、nextのnなのかな?
nありの場合
[root@testsv sedtest]$ sed -n '/3333/p' ./sedtest.txt
3333
nなしの場合
3333を読み込んだ時に一致するので、出力している。
[root@testsv sedtest]# sed '/3333/p' ./sedtest.txt
1111
2222
3333
3333
4444
5555
6666
7777
8888
9999
0000

{}はコマンドブロック。まとめて実行してくれる。

{}なしの場合
[root@testsv sedtest]$ sed -n '/3333/n;p' ./sedtest.txt
1111
2222
4444
5555
6666
7777
8888
9999
0000
{}ありの場合
3333の次の行がパターンスペースに追加されて出力された。
[root@testsv sedtest]$ sed -n '/3333/{n;p}' ./sedtest.txt
4444

ホールドスペース

3333から5555までをホールドスペースに保持し、末尾に追加する。
改行が入っているのはsedの仕様かな?
[root@testsv sedtest]# sed '/3333/,/5555/H;$G' ./sedtest.txt
1111
2222
3333
4444
5555
6666
7777
8888
9999
0000

3333
4444
5555

まだよくわかってないので、もうちょっと勉強しないと。。

conohaを申し込んでみた

vpsサーバが欲しいなぁと思って探していて、sakuraとconohaが候補にあがったけど、1000円クーポンがもらえるらしいので、conohaを申し込んだ。 どちらも900円だったけど、1000円クーポンがあれば1ヶ月お試しってことだしね。

yahooとかでconohaで検索したら広告で ここから申し込めば1000円クーポン!の表示がある。申し込み自体はすんなりでけた。

(以下はお友達紹介のリンク。ここから申し込んで頂くと私が得します。)

ConoHa - スマート&パワフルなクラウドの新提案。ひと月900円から。


申し込みからsshへの設定は以下のまとめがわかりやすいと思う。

ConohaにVPSを設置して、SSHログイン、ポート番号変更、rootログイン禁止までを30分で! - Qiita

ネームタグはコントロールパネルに表示されるサーバー名みたいなのにも使われていたので、デフォルトのままOKしちゃったら、後でショックを受けた。 webサーバとかつけたかったのにみたいな。。。

私はsshの設定の前に、申し込み時に選択できた「接続許可ポート」が気になりすぎて、、、コントロールパネルからも操作できたんだけど、、 とりあえず、全部開けるのは嫌なので、「ssh」と「web」だけにした。

f:id:foxtrot0304:20151129022629p:plain

それでOSインストール後、sshでログイン&iptablesを叩くと22番ポートしか空いていないようにみえる。 (どうでもよいけど、OSインストール中に一回エラーメッセージが出た。どうしようかとまごまごしてたら、勝手にインストールが終わったので、良しとしてる。)

[root@server ~]# /sbin/iptables -L IN_public_allow -n -v
Chain IN_public_allow (1 references)
 pkts bytes target     prot opt in     out     source               destination
    5   308 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:22 ctstate NEW
[root@server ~]#
[root@server ~]#
[root@server ~]# /sbin/iptables -L -n -v | grep -e 80 -e 443
[root@server ~]#

なんでだろうなぁーと考えていると、そもそもCentOS7なので、iptablesじゃなくてFirewalldではと思いつき、ググりながらwebのポートが空いているか確認する。

[root@server ~]# firewall-cmd --state
running
[root@server ~]# firewall-cmd --list-all
public (default, active)
  interfaces: eth0
  sources:
  services: dhcpv6-client ssh
  ports:
  masquerade: no
  forward-ports:
  icmp-blocks:
  rich rules:
[root@server ~]# ls -l /etc/firewalld/zones/
合計 4
-rw-r--r--. 1 root root 315  4月 14  2015 public.xml
[root@server ~]#

なんかよくわからなかったけど、webのポートは空いていないような気がスル。。
もしかしてサービスを起動しないとfirewalldも対応してくれないとか。
早々とつまづいてしまって、なぜ気軽にCentOS7とか入れたんだろうとちょっと後悔。
firewalldを無効化してiptablesを有効にする方法もありそうだけど、そこはこらえてCentOS7を勉強します。。

複合キーのauto increment実験

前回に引き続き、mysqlのauto incrementをさわってみる。 今回は複合キーのauto incrementについて。 複合キーは複数のカラムで1つのキーとみなす。つまり同じカラムでは重複を許すけれども、複数のカラムを合わせてみると他のレコードと重複していないようなキー。 それにauto incrementをつけてみる。

まずcreate table。MyISAMのみ許される。InnoDBの場合は怒られる。

mysql> create table test ( id1 int(2) , id2 int(3) auto_increment , primary key (id1,id2) ) engine=MyISAM;
Query OK, 0 rows affected (0.11 sec)

mysql>
mysql>
mysql> create table test2 ( id1 int(2) , id2 int(3) auto_increment , primary key (id1,id2) ) engine=InnoDB;
ERROR 1075 (42000): Incorrect table definition; there can be only one auto column and it must be defined as a key

こんな状態のときにinsertするといい感じでauto incrementしてくれる。

mysql> select * from test;
+-----+-----+
| id1 | id2 |
+-----+-----+
|   1 |   1 |
|   1 |   3 |
+-----+-----+
2 rows in set (0.00 sec)

mysql> insert into test(id1) values (1);
Query OK, 1 row affected (0.00 sec)

mysql>
mysql> select * from test;
+-----+-----+
| id1 | id2 |
+-----+-----+
|   1 |   1 |
|   1 |   3 |
|   1 |   4 |
+-----+-----+
3 rows in set (0.00 sec)

追加でid1に別の数字を入れた場合もいい感じにしてくれる。

ysql> insert into test(id1) values (2);
Query OK, 1 row affected (0.00 sec)

mysql>
mysql> select * from test;
+-----+-----+
| id1 | id2 |
+-----+-----+
|   1 |   1 |
|   1 |   3 |
|   1 |   4 |
|   2 |   1 |
+-----+-----+
4 rows in set (0.00 sec)

このときのauto_incrementの次の値をみてみると1のまま。毎回計算していれてくれているのかな?

mysql> select auto_increment from information_schema.tables where table_name='test';
+----------------+
| auto_increment |
+----------------+
|              1 |
+----------------+
1 row in set (0.00 sec)

なおid1を指定せずにid2だけ指定してinsertした場合、id1にはdefaultの0がinsertされた

mysql> insert into test(id2) values (1);
Query OK, 1 row affected (0.00 sec)

mysql> select * from test;
+-----+-----+
| id1 | id2 |
+-----+-----+
|   0 |   1 |
|   1 |   1 |
|   1 |   3 |
|   1 |   4 |
|   1 |   5 |
|   2 |   1 |
+-----+-----+
6 rows in set (0.00 sec)

mysql> show create table `test`;
+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                                                        |
+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| test  | CREATE TABLE `test` (
  `id1` int(2) NOT NULL DEFAULT '0',
  `id2` int(3) NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`id1`,`id2`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 |
+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

調子にのって再度id2だけ指定してinsertしてみると、怒られる。当たり前だけど、こちらはauto incrementしてくれない。

mysql> insert into test(id2) values (1);
ERROR 1062 (23000): Duplicate entry '0-1' for key 'PRIMARY'

mysqlのauto incrementを調べてみる

auto incrementは勝手に連番を振ってくれる機能。 これがあれば、採番テーブルはいらない?

作成するためには、create tableするときにauto incrementをつけてあげればOK。

mysql> create table test (
    -> id int(2) NULL auto_increment,
    -> name varchar(20),
    -> primary key (id)
    -> );

あとはinsertするたびに増えていく。

mysql> insert into test(name) values ('test1');
Query OK, 1 row affected (0.09 sec)

mysql>
mysql> select * from test;
+----+-------+
| id | name  |
+----+-------+
|  1 | test1 |
+----+-------+
1 row in set (0.00 sec)

mysql>
mysql> insert into test(name) values ('test2');
Query OK, 1 row affected (0.10 sec)

mysql>
mysql> select * from test;
+----+-------+
| id | name  |
+----+-------+
|  1 | test1 |
|  2 | test2 |
+----+-------+
2 rows in set (0.00 sec)

auto incrementの次の値はinformation_schemaでみることができる。

mysql> show columns from information_schema.tables;
+-----------------+---------------------+------+-----+---------+-------+
| Field           | Type                | Null | Key | Default | Extra |
+-----------------+---------------------+------+-----+---------+-------+
| TABLE_CATALOG   | varchar(512)        | NO   |     |         |       |
| TABLE_SCHEMA    | varchar(64)         | NO   |     |         |       |
| TABLE_NAME      | varchar(64)         | NO   |     |         |       |
| TABLE_TYPE      | varchar(64)         | NO   |     |         |       |
| ENGINE          | varchar(64)         | YES  |     | NULL    |       |
| VERSION         | bigint(21) unsigned | YES  |     | NULL    |       |
| ROW_FORMAT      | varchar(10)         | YES  |     | NULL    |       |
| TABLE_ROWS      | bigint(21) unsigned | YES  |     | NULL    |       |
| AVG_ROW_LENGTH  | bigint(21) unsigned | YES  |     | NULL    |       |
| DATA_LENGTH     | bigint(21) unsigned | YES  |     | NULL    |       |
| MAX_DATA_LENGTH | bigint(21) unsigned | YES  |     | NULL    |       |
| INDEX_LENGTH    | bigint(21) unsigned | YES  |     | NULL    |       |
| DATA_FREE       | bigint(21) unsigned | YES  |     | NULL    |       |
| AUTO_INCREMENT  | bigint(21) unsigned | YES  |     | NULL    |       | ★
| CREATE_TIME     | datetime            | YES  |     | NULL    |       |
| UPDATE_TIME     | datetime            | YES  |     | NULL    |       |
| CHECK_TIME      | datetime            | YES  |     | NULL    |       |
| TABLE_COLLATION | varchar(32)         | YES  |     | NULL    |       |
| CHECKSUM        | bigint(21) unsigned | YES  |     | NULL    |       |
| CREATE_OPTIONS  | varchar(255)        | YES  |     | NULL    |       |
| TABLE_COMMENT   | varchar(2048)       | NO   |     |         |       |
+-----------------+---------------------+------+-----+---------+-------+
21 rows in set (0.00 sec)

mysql> select AUTO_INCREMENT from information_schema.tables where table_name='test';
+----------------+
| AUTO_INCREMENT |
+----------------+
|              3 |
+----------------+
1 row in set (0.00 sec)

alterコマンドでauto incrementの次の値を変更可能

mysql> ALTER TABLE test AUTO_INCREMENT=10;
Query OK, 0 rows affected (0.14 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql>
mysql>
mysql> select AUTO_INCREMENT from information_schema.tables where table_name='test';
+----------------+
| AUTO_INCREMENT |
+----------------+
|             10 |
+----------------+
1 row in set (0.00 sec)

mysql> select * from test;
+----+-------+
| id | name  |
+----+-------+
|  1 | test1 |
|  2 | test2 |
+----+-------+
2 rows in set (0.00 sec)

mysql>
mysql> insert into test(name) values ('test3');
Query OK, 1 row affected (0.10 sec)

mysql>
mysql> select * from test;
+----+-------+
| id | name  |
+----+-------+
|  1 | test1 |
|  2 | test2 |
| 10 | test3 |
+----+-------+
3 rows in set (0.00 sec)

auto incrementの値におかしな設定は入れることができない。

mysql> ALTER TABLE test AUTO_INCREMENT=1;
Query OK, 0 rows affected (0.10 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql>
mysql>
mysql> select AUTO_INCREMENT from information_schema.tables where table_name='test';
+----------------+
| AUTO_INCREMENT |
+----------------+
|             11 |
+----------------+
1 row in set (0.00 sec)

mysql>
mysql>
mysql> insert into test(name) values ('test4');
Query OK, 1 row affected (0.13 sec)

mysql> select * from test;
+----+-------+
| id | name  |
+----+-------+
|  1 | test1 |
|  2 | test2 |
| 10 | test3 |
| 11 | test4 |
+----+-------+
4 rows in set (0.00 sec)

mysql>
mysql> ALTER TABLE test AUTO_INCREMENT=5;
Query OK, 0 rows affected (0.11 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> select AUTO_INCREMENT from information_schema.tables where table_name='test';
+----------------+
| AUTO_INCREMENT |
+----------------+
|             12 |
+----------------+
1 row in set (0.00 sec)

mysql> insert into test(name) values ('test5');
Query OK, 1 row affected (0.09 sec)

mysql>
mysql> select * from test;
+----+-------+
| id | name  |
+----+-------+
|  1 | test1 |
|  2 | test2 |
| 10 | test3 |
| 11 | test4 |
| 12 | test5 |
+----+-------+
5 rows in set (0.00 sec)

googleの検索結果をcurlで取得する

もうほとんど以下のサイトに書いてあるとおり! 若干ページは異なったけど、選択肢とかは一緒だった。

google custom search engine(CSE)を使って、検索結果をjsonで取得する - ryutamaki

google apiキー」と「検索エンジン ID」を手に入れたらあとはcurlを実行するだけ!

curl 'https://www.googleapis.com/customsearch/v1?key=google apiキー&cx=検索エンジンID&q=検索キーワード'

ちなみに検索キーワードは日本語とかでも大丈夫でした。

何をするでもないけれど、なんか楽しい。

アカマイの本を読みました

アカマイの事業内容がわかるのと、意外とインターネットの仕組みについて、簡単だけど知れたところがよかったです。
アカマイって基本的にCDNの業者なんですね。ただその世界中にサーバを持っているというスケールをうまく活かしてよいサービスを提供しているという。
クライアント側からどうやって近くの拠点にリクエストさせるのかという仕組みも実に興味深かったです。
簡単に書くとCNAMEを使って、アカマイの権威DNSサーバに誘導し、そこからはtracerouteとpingを使用して作成した情報に従って、一番近いリージョンのエッジサーバを案内するという仕組みでした。
たぶん全然わからないと思うので、詳しくは本を読んでください。。。
また、BGP とかトランジットとか、ASとかtier1とかよくわかっていなかったインターネットの仕組みを入り口だけでも知れたのもよかったかなぁと。
このあたりは普段はまかせっぱなしなので、LAN側しかさわらないですもんね。
ただここを知っているとNW障害のときとかわかりやすい気もします。

あと、平易な文で書かれているので読みやすかったです。
全然まわしものじゃないですが、興味がある方は是非。

mdでRAID構築後、再起動すると/dev/md127などのデバイス名がふられる

mdでRAID構築後、vmの母艦を再起動すると、ゲストOSを自動起動にしているにもかかわらず、起動してこないことに気づいた。 どうやら、RAID構築後のdevice名が/dev/md1とかではなく/dev/md125とかになっているみたい。 そのときのメモ。

/dev配下のファイルは以下のような感じ。 mv127とかにリンクが貼られていた。

[root@vm01 test]# ls -l /dev/md/
合計 4
-rw------- 1 root root 228  7月 20 22:31 2015 md-device-map
lrwxrwxrwx 1 root root   8  7月 20 22:31 2015 vm01.test.local:1 -> ../md127
lrwxrwxrwx 1 root root   8  7月 20 22:31 2015 vm01.test.local:2 -> ../md125
lrwxrwxrwx 1 root root   8  7月 20 22:31 2015 vm01.test.local:3 -> ../md126

/etc/mdadm.confを作成していなかったことに気付いて、作成してみる。

[root@vm01 test]# mdadm --detail --scan >> /etc/mdadm.conf

リブート。 今度はうまくいっていた。

[root@vm01 test]# ls -l /dev/md
合計 4
-rw------- 1 root root 222  7月 20 22:52 2015 md-device-map
lrwxrwxrwx 1 root root   6  7月 20 22:52 2015 vm01.test.local:1 -> ../md1
lrwxrwxrwx 1 root root   6  7月 20 22:52 2015 vm01.test.local:2 -> ../md2
lrwxrwxrwx 1 root root   6  7月 20 22:52 2015 vm01.test.local:3 -> ../md3

md-device-mapファイルの中身はいかのような感じ。

[root@vm01 test]# cat /dev/md/md-device-map
md2 1.2 320bdc1a:064bf1f4:d59f1bc5:aa04bc16 /dev/md/vm01.test.local:2
md3 1.2 9db6208b:f19c62e9:f8be6c74:2803a158 /dev/md/vm01.test.local:3
md1 1.2 405025a2:4ee28ae4:6d8394e8:917f46b9 /dev/md/vm01.test.local:1

作成日付をみるとリブートした時間になっていた。 ここのファイルは毎回作成しなおされるのかな。 そのときに見ているのが、/etc/mdadm.conf ? /etc/mdadm.confがなければ、ランダムにデバイス名が決定されるとか?

以下とかそれっぽいことを言ってた。

http://ubuntuforums.org/showthread.php?t=1764861&p=10953357#post10953357

assembleするときに/etc/mdadm.confをみるとか情報もあったので、あながち間違ってはいなさそう。 boot時に毎回assembleしているイメージなのかな。。。