読者です 読者をやめる 読者になる 読者になる

臥薪嘗胆

インフラエンジニアのあれこれ

Cやってみよう #2

昨日の続き

引数をとって何かを出力する

何作る・・・?

  • 無駄なやつ作る
  • ググッてビビッときたのが、素数checker

ひとまず、引数をとって出力するだけのやつを作ってみる

  • 引数は何個でもOK
  • int count; が無いとコンパイルエラーになった。丁寧。
chk-prime.c: 関数 ‘main’ 内:
chk-prime.c:16:10: エラー: ‘count’ が宣言されていません (この関数内での最初の使用)
     for (count = 1; count < argc; count++){
          ^
chk-prime.c:16:10: 備考: 未宣言の識別子は出現した各関数内で一回のみ報告されます

ひとまず引数をprintするだけの動くもの。

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]) {
    int count;

    for (count = 1; count < argc; count++){
        printf("argv[%d] = %s\n", count, argv[count]);
    }
}
  • argc ・・・ argcはargument countの略です。
  • printf を使って count を添字として配列から出力している

ふむふむ。
ここまではOK。

では引数が素数か否か判定するロジックを入れてみる

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]) {
    int count;
    int divisor;
    int i;
    int x;

    for (count = 1; count < argc; count++){

        divisor = 0;              /* 約数のcount用 */
        x = atoi(argv[count]);    /* 引数を数値にキャストして変数に入れる */

        for (i = 1; i <= x; i++){ /* 引数(int:x)回分処理をする */
            if( x % i == 0 ){
                divisor++;        /* 割り切れた場合、約数をカウントアップ */
            }
        }

        if ( divisor == 2 ){      /* 1と引数自身で割り切れた場合、(2の時)素数 */
            printf("%s is prime\n", argv[count]);
            /*
        } else {
            printf("%s is not prime\n", argv[count]);
            */
        }
    }
}
gcc chk-prime.c -o chk-prime.o

できた

[vagrant@CentOS-71 ctest]$ for i in $(seq 1 100);do     ./chk-prime.o $i; done
2 is prime
3 is prime
5 is prime
7 is prime
11 is prime
13 is prime
17 is prime
19 is prime
23 is prime
29 is prime
31 is prime
37 is prime
41 is prime
43 is prime
47 is prime
53 is prime
59 is prime
61 is prime
67 is prime
71 is prime
73 is prime
79 is prime
83 is prime
89 is prime
97 is prime

よさそう

Cやってみよう #1

仕事でほんとに困ったときは

  • C言語わからないのに、C言語のソースを追う必要があるし
  • 何やってるかわからないpatchを充てたりする
  • 最近流行りのmrubyもC言語で書かれているらしいのだ!

だからチョットでもわかるようにC言語の気持ちに近づいてみよう。
といっても何にから手を付けたらよいかわからないので、hellow worldしてみよう

まずここ流し読み。
おっと、helloそのままあるやん。。

見なかったことにして、環境を作ろう

vagrant

vagrant box add CentOS_71 https://github.com/holms/vagrant-centos7-box/releases/download/7.1.1503.001/CentOS-7.1.1503-x86_64-netboot.box
vagrant init CentOS_71
vagrant up CentOS_71
vagrant ssh CentOS_71

環境

[vagrant@CentOS-71 ~]$ uname -a
Linux CentOS-71.local 3.10.0-229.el7.x86_64 #1 SMP Fri Mar 6 11:36:42 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux

# gccもはいってた
[vagrant@CentOS-71 ~]$ rpm -qa | grep -w gcc-4.8.3-9.el7.x86_64
gcc-4.8.3-9.el7.x86_64

さっきのサンプルを

mkdir ctest
cd ctest/
cat << 'EOD' > hello.c
#include <stdio.h>

main()
{
    printf("hello, world¥n");
}
EOD
gcc hello.c && echo "OK" || "NG"

できた
実行権限付きだ

[vagrant@CentOS-71 ctest]$ ls -l
合計 16
-rwxrwxr-x 1 vagrant vagrant 8505 106 14:44 a.out
-rw-rw-r-- 1 vagrant vagrant   62 106 14:43 hello.c

実行してみた

[vagrant@CentOS-71 ctest]$ ./a.out
hello, world

ふむ。

明日は引数を取る何かを作ってみよう。

今更ながら、Port vlanの構成image を(過不足あればお教えください)

                                        port vlan image

        ┌─────────────────────────────────────────────────────────────────────────────────┐
        │ ┌─────────────────────────────────────┐ ┌─────────────────────────────────────┐ │
        │ │               VLAN100               │ │               VLAN999               │ │
        │ │             port 1 ~ 4              │ │             port 5 ~ 8              │ │
        │ │                                     │ │                                     │ │
L2      │ │ ┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐ │ │ ┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐ │ │
        │ │ │      │ │      │ │      │ │      │ │ │ │      │ │      │ │      │ │      │ │ │
        │ │ │port 1│ │port 2│ │port 3│ │port 4│ │ │ │port 5│ │port 6│ │port 7│ │port 8│ │ │
        │ │ │      │ │      │ │      │ │      │ │ │ │      │ │      │ │      │ │      │ │ │
        │ │ │      │ │      │ │      │ │      │ │ │ │      │ │      │ │      │ │      │ │ │
        │ │ └───┬──┘ └───┬──┘ └───┬──┘ └───┬──┘ │ │ └───┬──┘ └───┬──┘ └───┬──┘ └───┬──┘ │ │
        │ └─────┼────────┼────────┼────────┼────┘ └─────┼────────┼────────┼────────┼────┘ │
        └───────┼────────┼────────┼────────┼────────────┼────────┼────────┼────────┼──────┘
                │        │        │        │            │        │        │        │       
            ┌───┴──┐ ┌───┴──┐ ┌───┴──┐ ┌───┴──┐     ┌───┴──┐ ┌───┴──┐ ┌───┴──┐ ┌───┴──┐    
            │      │ │      │ │      │ │      │     │      │ │      │ │      │ │      │    
PC          │ PC 1 │ │ PC 2 │ │ PC 3 │ │ PC 4 │     │ PC 5 │ │ PC 6 │ │ PC 7 │ │ PC 8 │    
(server)    │      │ │      │ │      │ │      │     │      │ │      │ │      │ │      │    
            │      │ │      │ │      │ │      │     │      │ │      │ │      │ │      │    
            └──────┘ └──────┘ └──────┘ └──────┘     └──────┘ └──────┘ └──────┘ └──────┘    

port vlan はL2 switchの複数portを一つのNWに設定する手法の一つ

Monodrawというツール買ったので使いたくてblogに投稿

初めてイベントで話してきました

京都に行けたので幸せでした。
私の不手際によって2泊3日。
フリーな時間はingressしまくって、メダル3つ獲得しました。

で、イベントは以下です。

いやー。緊張しました。

話した内容は以下です。

speakerdeck.com

こういったイベントに参加させて頂いて、自信がつきました。
これまで外に出ていくことを積極的にできていなかったので、
自分たちのやってること(業務)が

  • 世の中的にイケてるのか?
  • 正しそうな方向を向いているか?

みたいなことを確認する場がなかなか無かったんですが、道が見えた気がします。

また表に出ることのメリットは語り尽くされてると思いますが、
人のつながりを作ることができたという点がとても大きかったと思います。

また所属チームにもどって、切磋琢磨して代表に選ばれるように頑張ります。

mysql5.6以降の初期パスワードについて

mysql5.6?くらいから、mysqlのデフォルトパスワードがmysqlに事前に設定されてる。

なので初期ログイン時はファイルから拾う必要があるが、mysqlを再構築する場合はどのファイルにパスワードが書かれるのかわかんなかったが、マニュアルを調べてみると

--random-passwords

なるオプションが追加されてて、これつけて実行するとカレントディレクトリに、

.mysql_secret

ってファイルができて、そこから初期パスワードを拾う。

cd ~
/bin/rm -rf /var/lib/mysql
/usr/bin/mysql_install_db --basedir=/usr --datadir=/var/lib/mysql --random-passwords
chown -R mysql:mysql /var/lib/mysql
chmod 755 /var/lib/mysql
cat ~/.mysql_secret

CentOS7でvncを起動させろ

前提条件

  • firewalld おとしとく
  • SELinux無効しとく

あとはここからやっていくと出来た。 深いところは調べてない・・・

install

yum groupinstall "GNOME Desktop"
yum install tigervnc-server.x86_64

rootユーザーでやった

vncpasswd

/root/.vnc/xstartup を編集 おまじないっぽいので、時間のあるときに調べとこう

#!/bin/sh

xsetroot -solid grey
vncconfig -iconic &
x-terminal-emulator -geometry 80x24+10+10 -ls -title "$VNCDESKTOP Desktop" &
exec gnome-session &

vncserver起動

vncserver
vncserver -list

vncserver停止

# display 番号を渡す
vncserver -kill :1

接続はいつもの、[Chicken of the VNC]で!

mysqldumpはこうした方がいいね(オンラインでバックアップの場合)

オンラインでバックアップを取る必要がある場合はロック出来ないので以下で!

  • dump取得後にgzip圧縮もしてる
  • --result-file=file_name, -r file_nameこのオプションで出力を指定していると、エラーが起きた場合、ファイルが空で作成されるのでおすすめしない。
DB=fuga
MYSQL_PWD=password
mysqldump -h example.jp -u hoge --force --single-transaction --quote-names --default-character-set=binary --compress --add-drop-database --add-drop-table --databases $DB --log-error=$DB.log | gzip > $DB.gz