Refactoring My Intelligence

技術的/非技術的な雑記,備忘録等々

シェルスクリプトのTIPS(備忘録)

ディレクトリdir以下で拡張子が".suffix"なファイルのステップ数の合計を出力する

for i in $(find dir -type f -name "*.suffix")
do
  l=`cat $i | wc -l`
  sum=`expr $sum + $l`
done
echo $sum

testコマンドでシェル変数に値があるかどうかを判定する

# 真(true)の場合
$ VAR=somevalue
$ [ -n "$VAR"]; echo $?
0
# 偽(false)の場合
$ [ -n "$VAR"]; echo $?
1

-nを付けると対象文字列の長さが0より大きい場合に真(0)そうでない場合に偽(1)を返す. このとき,シェル変数の中身をテストする場合は,""でその変数を囲まないといけない.

C言語でのファイルサイズ取得方法

巷ではfseekとSEEK_ENDでファイル終端位置をftellで取得するという方法が紹介されているが,これは潜在的な脆弱性を伴っているらしい.

参考: FIO19-C. ファイルサイズの計算に fseek() および ftell() を使用しない

結論としては,ファイルサイズの取得にはfstatを使えとのこと.

Cygwin + Mavenでproxyが通らない問題とその対策

Proxy環境で,Win7PCに構築したCygwin環境にMaven3.1.0をインストールした.Proxyを通るようにするために~/.m2/settings.xmlをドキュメントの通りに設定したが,mvn installで外部ファイルを取得する箇所でいつもエラーとなってしまっていた.

問題はMavenがこのsettings.xmlを見てくれないことなのだが何故そうなるのかが分からなかった.ネットで調べたところどうやらMavenCygwin上のホームディレクトリの.m2/settings.xmlをみるのではなく,Windowsユーザーとしてのホームディレクトリの.m2/settings.xmlを見に行っているようだ.

Windows7だとホームディレクトリはC:\Users\myaccountになるので,その配下に.m2/settings.xmlをコピー(実際は既に.m2は存在していた)してCygwin上で再度実行したらちゃんと動いた.

素数の列挙

プログラミングの定番課題の一つである,素数の列挙を自分で実装してみた.うちの会社のエンジニア志望の応募者にも課題として出題している.社員の自分が書けない(書いた事ない)というのはまずいかなと思い,30分くらいで書いてみた(効率はそれほど考慮してない).

python2.7で書いてみたけど,結構直感的にコードが書けるからやっぱりpython良いですね.

#!/usr/bin/env python
'''
 prints all prime numbers less than or equal to n
 usage:
   python thisfile.py n
'''
import sys
import math

numbers = []

def primenumbers(n):
    numbers.extend(range(1, n+1))

    for i in range(2, int(math.ceil(math.sqrt(n))) + 1):
        for j in numbers:
            if j != i and j % i == 0:
                numbers.remove(j)

if __name__ == "__main__":
    n = int(sys.argv[1])
    primenumbers(n)
    numbers.sort()
    for i in numbers:
        print i

Django1.5 tutorial Part6 個人的メモ

このパートではスタイルシートと画像の追加方法について解説している.

DjangoではJavaScriptCSS等は"static files"と呼ぶことにしているらしい.

自分のアプリのルック&フィールをカスタマイズする

最初にstaticという名前のディレクトリをpollsディレクトリの下に作成する.Djangoはテンプレートファイルを探すのと同じような仕組みでstaticファイルを探す.次にpollsという名前のディレクトリをその下に作成し,そのディレクトリの中でstyle.cssファイルを作成する.つまり,

polls/static/polls/style.css

というパスになっているはず.

これはDjangoのデフォルトのstaticファイルを探すモジュール(AppDirectoriesFinder)が<app name>/static/配下にあるstyle.cssを探すため.staticディレクトリの下にもう一度<app name>ディレクトリを挟んでいるのはstaticファイルにも名前空間を持たせるためのようである.

ちなみにこの動作を変更したい場合はsettings.pyのSTATICFILE_FINDERSの値を変更すればよいらしい.

以下のコードをpolls/static/polls/style.cssに記述する.

li a {
    color: green;
}

次にpollsのindex.htmlの先頭に以下を追記する.

{% load staticfiles %}

<link rel="stylesheet" type="text/css" href="{% static 'polls/style.css' %}" />

背景画像の追加

次に画像用のサブディレクトリを作成する.作成場所は

polls/static/polls/images

で,その下に例えばbackground.gifなどの背景画像データを格納する.パスで表すと以下.

polls/static/polls/images/background.gif

そしてさっきのスタイルシートファイルに以下を追記すれば背景画像が取り込まれる.

body {
    background: white url("images/background.gif") no-repeat right bottom;
}

以上.より詳しいことは,

などを参考にするとよいらしい.これらは気が向いたらそのうち翻訳するかもしれない.

Django1.5 tutorial Part5 個人的メモ

自動テストの紹介

自動化テストとは

テスト作成は何故必要か

テスティングの基本戦略

ここまでは省略.この辺の話はテスト駆動開発とかのキーワードでWeb検索するか書籍等で勉強すればよい.

最初のテストを書く

Polls.was_published_recently()にバグがあるのでそれを直す.

バグを暴くためのテストを作る

polls/tests.pyの内容を以下のようにする.

import datetime

from django.utils import timezone
from django.test import TestCase

from polls.models import Poll

class PollMethodTests(TestCase):

    def test_was_published_recently_with_future_poll(self):
        """
        was_published_recently() should return False for polls whose
        pub_date is in the future
        """
        future_poll = Poll(pub_date=timezone.now() + datetime.timedelta(days=30))
        self.assertEqual(future_poll.was_published_recently(), False)

テストを走らせる

以下のコマンドを端末で実行するとテストが走る.

python manage.py test polls
Creating test database for alias 'default'...
F
======================================================================
FAIL: test_was_published_recently_with_future_poll (polls.tests.PollMethodTests)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/hikida.satoshi/study/django/ENV/projects/mysite/polls/tests.py", line 12, in test_was_published_recently_with_future_poll
    self.assertEqual(future_poll.was_published_recently(), False)
AssertionError: True != False

----------------------------------------------------------------------
Ran 1 test in 0.016s

FAILED (failures=1)
Destroying test database for alias 'default'...

結果はこんな感じ.アサーションエラーとなっているのが分かる.

バグを直す

def was_published_recently(self):
    now = timezone.now()
    return now - datetime.timedelta(days=1) <= self.pub_date <  now

で,テストを実行すると

Creating test database for alias 'default'...
.
----------------------------------------------------------------------
Ran 1 test in 0.001s

OK
Destroying test database for alias 'default'...

こんな感じになる.

より包括的なテスト

was_published_recently()メソッドをより包括的にテストするように以下のテストコードをさらに追加する.

def test_was_published_recently_with_old_poll(self):
    """
    was_published_recently() should return False for polls whose pub_date
    is older than 1 day
    """
    old_poll = Poll(pub_date=timezone.now() - datetime.timedelta(days=30))
    self.assertEqual(old_poll.was_published_recently(), False)

def test_was_published_recently_with_recent_poll(self):
    """
    was_published_recently() should return True for polls whose pub_date
    is within the last day
    """
    recent_poll = Poll(pub_date=timezone.now() - datetime.timedelta(hours=1))
    self.assertEqual(recent_poll.was_published_recently(), True)

Viewのテスト

clientテスト

Djangoはviewレベルにおけるユーザーとの対話をシミュレートするClientテストを提供している. んだけどコード写したり翻訳するのもう面倒くさいので以下略.