vimのTips

vimの便利な操作方法を見つけたら忘れないようにメモする

  • [s]でカーソル位置にある文字を削除&挿入モードに移行
  • [f] → <アルファベット一文字> でその文字を検索 [;]で次[,]で前に移動
  • [I]で行頭から、[A]で行末からの追記モードに移行
  • [Shift] + [c] — カーソルの右側にある文字列をカットする
  • ビジュアルモードで範囲を指定して[>]or[<] — 指定した範囲を1ブロックだけインデント
  • [*] でカーソルが指している単語を検索(下方向)
  • [#] でカーソルが指している単語を検索(上方向)

ゼロから始める(た) Travis CI

Travis CIって?

Travis CIを使うと、GitHubにコードをプッシュするだけで自動的にコードのテストを行ってくれる。
さらにテスト結果がメールで届いたりする。
SignUpからテストの実行まで,一通り行ったので手順をメモっておく。

このページを読むと…

Travis CIを使って、プログラムの簡単なテストが出来るようになる。

前提知識

“ゼロから"と言っても、やはり多少の準備は必要

  1. GitHubのアカウントを持っている
  2. git commit,git push等ができる
  3. シェルの基本的なコマンドの意味がわかる (echo hoge > hoge.txt とか)

逆に言えば、これぐらいの知識でも使いはじめることはできるということ

準備編

練習用のリポジトリを作ろう

GitHubの自分のページに、練習用のリポジトリを作成しよう。
practice_Travis_CIでもなんでもOK。

Travis CIに登録しよう

Travis CIのページにアクセスし、Sign Up ボタンを押す。
GitHubのアカウントとパスワードを入力するだけで登録完了。

リポジトリTravis CIに登録しよう

Travis CIのページの左側に、[My Repositories]ボタンがあるのでクリックすると、自分のリポジトリ一覧が見れる。
f:id:katorinax:20170328155620p:plain
リポジトリ名の左側にチェックスイッチがあるので、テストしたいリポジトリのスイッチをONにしておく。


これで準備完了。

実践編

実際にテストを行うには最低でも以下の4つのファイルが必要になる。

  1. テスト対象となるプログラム
  2. テスト内容について記述してある.yml(やむる)ファイル .travis.yml*1
  3. .travis.ymlによって呼び出される、テストを実行するシェルスクリプト
  4. プログラムの望ましい出力結果が記述してあるリファレンスファイル

スイッチオンにしたリポジトリに更新をgit pushすると、.travis.ymlファイルにある記述に従って、自動的にテストが実行される。

それぞれ実際に作成してみる

1 テスト対象のプログラム(target.py)

何でもいい。今回は0~10までの値を標準出力に書き出すpythonプログラム、target.pyにした。

#!/usr/bin/env python
#coding:utf-8
#0から10まで標準出力する

for i in range(11):
    print i

2 .travis.yml

テスト内容について記述してある.ymlファイル。

script:
    sh -e ./test.sh

意味

  • カレントディレクトリにある test.shを-eオプションで実行してね*2

3 テスト用のシェルスクリプト(test.sh)

#!/bin/sh

python target.py > result
diff result ref
echo $?

意味

  • プログラムtarget.pyを実行して、結果をresultってファイルに書き込んでね
  • resultとリファレンス用のファイルrefの内容を、diffコマンドで比較してね(一致すると終了ステータスは0になる)
  • 終了ステータスを吐いてね

4 リファレンス用ファイル(ref)

プログラムの望ましい実行結果が書いてあるファイル
中身

0
1
2
3
4
5
6
7
8
9
10

こんだけ*3

テスト実行

先述の4つのファイル(target.py, .travis.yml, test.sh, ref)を作成し、git add -> git commit -> git push すればOK。
今後はリポジトリの内容を更新してgit pushするたびに勝手にテストが実行される。
結果はTravis CIのページで確認できる。メールで報告も来る。

テスト結果

成功すると(するんだけど)こんな感じ
f:id:katorinax:20170328162625p:plain

target.pyかrefを適当に書き換えると、テスト失敗が帰ってくる。こんな感じ
f:id:katorinax:20170328163006p:plain

もっと

これ↓とか詳しい
knowledge.sakura.ad.jp

おしまい。

*1:このファイルは必ずリポジトリのルートディレクトリに置いておく

*2:-eオプションをつけると実行時エラーが出た時点で処理を中断する

*3:もちろん追加できる内容は他にいくらでもある。これはあくまでも最低限の内容

ROSのlaunchファイルの書き方

launchファイルとは

launchファイルを使うと、rosの複数のプログラムを同時に立ち上げることができるので楽ができる

launchファイルの場所

立ちあげたいプログラムが入っているパッケージに、launchディレクトリを作成.
この中に .launchファイルを作成する

launchファイルの中身

中身はxmlで記述する。*1

具体例

<launch>  
    <node pkg="パッケージの名前" name="ノードの名前" type="実行ファイルの名前"\>
    .
    .
    .
<launch>

実行方法

どのディレクトリからでも実行できる。

$ roslaunch ./launch/ hoge.launch

その他

roslaunch にオプション –screenをつけると、出力を直接見ることができる。

ファイルのバイト数を数えるCプログラム

概要

  • 引数に指定したファイルの中身が何バイトあるかをカウントするCのプログラム
  • ファイルがバイナリでもテキストでもOK

プログラム

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

int main(int argc,char *argv[])
{
    FILE *fp;
    unsigned bite = 0;

    if ( (fp = fopen(argv[1],"rb")) == NULL)
    {
        printf("ファイルを開けません\n");
        exit(1);
    }

    while(! feof(fp))
    {
        fgetc(fp);
        if(!feof(fp)) bite++;
    }

    printf("ファイルの内容は %u バイト\n",bite);

    return 0;
}

使用例

ファイルの中身を確認

$ cat hoge.txt
hoge 

実行

$ ./a.out hoge.txt
ファイルの中身は5バイト

4文字プラス改行文字?で5バイトみたいです

確認

ファイルのメモリ上のスペース数を調べるlinuxコマンド du を使う
-bオプションで単位はバイトになる

$ du -b hoge.txt
5     hoge.txt

合ってるみたいですね

もちろん

使えるならduを使ったほうがいいですね。

C言語でバイナリもテキストも読み書きする方法

概要

  • Cを使うと、バイナリファイルもテキストファイルも同じやり方で読み書きできる
  • ファイルの中身を1バイトづつchar型の変数にコピーして用いれば良い
  • 引数に指定したファイルの中身を、もう一つのファイルの中に書き込むプログラムを作成
  • ファイルがバイナリでもテキストでも関係なく実行できる

具体例

./a.out photo.png text.txt

と実行するとtext.txtの中身がphoto.pngに書き換わる(テキストファイルが画像ファイルになる)

プログラム

/*
バイナリであれテキストであれ引数に指定したファイルをコピー
ferror()を用いてエラー検査を行う
*/

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

int main(int argc,char *argv[])
{
    FILE *from,*to;
    char ch;

    if((from = fopen(argv[1],"rb"))==NULL)
    {
        printf("コピー元ファイルを開けません\n");
        exit(1);
    }

    if((to = fopen(argv[2],"wb"))==NULL)
    {
        printf("コピー先ファイルを開けません\n");
        exit(1);
    }

    while(!feof(from))
    {
        ch = fgetc(from);
        if(ferror(from))
        {
            printf("コピー元ファイルの読み込みエラー\n");
            exit(1);
        }

        if(!feof(from)) fputc(ch,to);
           
        if(ferror(to))
        {
            printf("コピー先ファイルの書き込みエラー\n");
            exit(1);
        }
    }

    fclose(from);
    fclose(to);

    return 0;
}

.vimrcの設定

自分のvimの設定をメモ。

  1. vimの設定はホームディレクトリにある .vimrc というファイルの中身を書き換えることで行う。
  2. $ vim ~/.vimrcとコマンドを送ると編集できる。
  3. ‘=’ の左右にスペースがあってはいけない。

  • set tabstop=4 … タブ文字の長さが半角スペース4つぶんになる。(デフォルトだと8つ)
  • set expandtab … タブキーを押した時、タブ文字の代わりに複数のスペースが入力されるようになる *1
  • set autoindent … 改行時に自動インデント
  • set shiftwidth=4 … ヴィジュアルモードで範囲を指定した後、[<],[>]キーでインデントを入れることができる。この時何文字ぶんインデントするかを決める
  • set nu … 左サイドに行数が常に表示されるようになる
  • set clipboard=unnamedplus … カットやヤンクした内容がクリップボードにも保存されるようになる*2
  • set cryptmethod=blowfish2 … :Xコマンドで暗号化する際のアルゴリズムをblowfish2(強力なアルゴリズム)にする
  • nmap <C-c> :%s/./&/g … :Ctrl+C で文字数をカウントできるようにする

*1:タブ文字を入力したい場合は ctrl+b を押してから[tab]

*2:普通のvimだとできない katorinax.hatenablog.com