2011年9月24日土曜日

PDCruseをコンパイルしてみた

Windows/Linuxともに使えるTUI(Text user interface)が使いたくて探してみたら
PDCursesというものを見つけた。

http://pdcurses.sourceforge.net/
VC++2010でコンパイルする方法は
まず、スタートメニューからVC2010のDOSプロンプトを起動する。

次に、上記サイトからダウンロード・フォルダ展開した場所へ移動して
set PDCURSES_SRCDIR=C:\pdcurs34
nmake -f vcwin32.mak

を実行するだけ。
生成されるのはスタティックライブラリで
pdcurses.lib
panel.lib

の2つで
curses.h
panel.h

をあわせた4ファイルをどこかにまとめておけばおk。

使っているうちにボールドやブリンク機能、256Colorに対応とかカスタマイズしたくなってくると思う。
そんな機能を追加した人がいて
http://www.projectpluto.com/win32a.htm

ここのパッチを使うとより見栄えの良いTUIが使える。

余談だけど、PDCrusesで下記サイトのような事が出来たらいいなって思ってる(願望)
http://code.google.com/p/bashsimplecurses/


<コンパイル編>
VC++2010環境でサンプルプログラムをコンパイルできるかチェックしてみた。

VC++で新規作成:コンソールアプリケーション
インクルード・ライブラリパスと
使用するライブラリ:pdcurses.lib、panel.lib
を設定する。

firework.cからコピペしてコンパイル。
#include "stdafx.h"
#include "curses.h"
#include 
#include 

#define DELAYSIZE 200

void myrefresh(void);
void get_color(void);
void explode(int, int);

short color_table[] =
{
    COLOR_RED, COLOR_BLUE, COLOR_GREEN, COLOR_CYAN,
    COLOR_RED, COLOR_MAGENTA, COLOR_YELLOW, COLOR_WHITE
};

int _tmain(int argc, _TCHAR* argv[])
{
    int i, start, end, row, diff, flag, direction, seed;

#ifdef XCURSES
    Xinitscr(argc, argv);
#else
    initscr();
#endif
    nodelay(stdscr, TRUE);
    noecho();

    if (has_colors())
        start_color();

    for (i = 0; i < 8; i++)
        init_pair(i, color_table[i], COLOR_BLACK);

    seed = (int)time((time_t *)0);
    srand(seed);
    flag = 0;
       
    while (getch() == ERR)      /* loop until a key is hit */
    {
        do {
            start = rand() % (COLS - 3);
            end = rand() % (COLS - 3);
            start = (start < 2) ? 2 : start;
            end = (end < 2) ? 2 : end;
            direction = (start > end) ? -1 : 1;
            diff = abs(start - end);

        } while (diff < 2 || diff >= LINES - 2);

        attrset(A_NORMAL);

        for (row = 0; row < diff; row++)
        {
            mvaddstr(LINES - row, row * direction + start,
                (direction < 0) ? "\\" : "/");

            if (flag++)
            {
                myrefresh();
                erase();
                flag = 0;
            }
        }

        if (flag++)
        {
            myrefresh();
            flag = 0;
        }

        explode(LINES - row, diff * direction + start);
        erase();
        myrefresh();
    }

    endwin();

    return 0;
}

void explode(int row, int col)
{
    erase();
    mvaddstr(row, col, "-");
    myrefresh();

    --col;

    get_color();
    mvaddstr(row - 1, col, " - ");
    mvaddstr(row,     col, "-+-");
    mvaddstr(row + 1, col, " - ");
    myrefresh();

    --col;

    get_color();
    mvaddstr(row - 2, col, " --- ");
    mvaddstr(row - 1, col, "-+++-");
    mvaddstr(row,     col, "-+#+-");
    mvaddstr(row + 1, col, "-+++-");
    mvaddstr(row + 2, col, " --- ");
    myrefresh();

    get_color();
    mvaddstr(row - 2, col, " +++ ");
    mvaddstr(row - 1, col, "++#++");
    mvaddstr(row,     col, "+# #+");
    mvaddstr(row + 1, col, "++#++");
    mvaddstr(row + 2, col, " +++ ");
    myrefresh();

    get_color();
    mvaddstr(row - 2, col, "  #  ");
    mvaddstr(row - 1, col, "## ##");
    mvaddstr(row,     col, "#   #");
    mvaddstr(row + 1, col, "## ##");
    mvaddstr(row + 2, col, "  #  ");
    myrefresh();

    get_color();
    mvaddstr(row - 2, col, " # # ");
    mvaddstr(row - 1, col, "#   #");
    mvaddstr(row,     col, "     ");
    mvaddstr(row + 1, col, "#   #");
    mvaddstr(row + 2, col, " # # ");
    myrefresh();
}

void myrefresh(void)
{
    napms(DELAYSIZE);
    move(LINES - 1, COLS - 1);
    refresh();
}

void get_color(void)
{
    chtype bold = (rand() % 2) ? A_BOLD : A_NORMAL;
    attrset(COLOR_PAIR(rand() % 8) | bold);
}

マルチバイト対応する場合は、下記定義を入れておくこと。
#include 
setlocale( LC_CTYPE, "jpn" );

2011年8月20日土曜日

squeezeアップデートしたら起動しなくなった。

udevd[803]: unable to receive ctrl connection: Function not implemented

こんなエラーが出た場合、Kernelの設定不足らしい(詳しくは見ていない)
とりあえず動くように戻したいのでダウングレードの手法を取ってみた。

やり方は、udevのバージョンを戻してあげれば元通り動くようになります。

例:
 dpkg --install libudev0_164-3_armel.deb udev_164-3_armel.deb

2011年8月13日土曜日

PythonでUnicodeEncodeError: 'ascii' codec can't encode characters.. が出た場合


表題のエラーは全角文字をu'あいうえお'と指定しても出てしまう問題。
原因は、UTF-8をUnicodeに変換する過程でデフォルト設定AsciiでUTF-8を読み込んでエラーになっている。

Python3では仕様が変わって最初からUTF-8らしいけど、
Python2.X使ってるユーザは対処せねばならない。


Python\Lib\site-packages\sitecustomize.py
---
import sys
sys.setdefaultencoding('utf-8')
---
これを保存すれば解決。

参照URL
http://d.hatena.ne.jp/omiyan/20110105/p1

2011年7月28日木曜日

Djangoが使えるようになってきた

デバッグ環境が乏しくてコンパイルする言語と比べて開発に時間かかるし、
そんなにコード量かけないなって思っていたけど、書き方・作法が分かってくると
急に心強くなってくるWEBフレームワークだなあってのが最近の印象。

2011年6月15日水曜日

easy_installでビルドする時。

easy_installを使うとき、ソースコンパイルするモジュールがあったりする。
その時VisualStudio2010 C++入ってるから大丈夫って思うとvcbatcall.bat?が
無いと起こられてしまう。
パス通したりしてがんばっても先に進まないので、こうなったら迷わず

「VisualStudio2008 C++」をインストールする。

これに尽きる。

2011年6月13日月曜日

Django デバッグ環境を整える

今回は3つデバッグ環境について触れてみた。
 ・Logging
 ・django-debug-toolbar(IE9だと表示崩れる)
 ・pylint


○Logging
Django v1.3になって、setting.pyにロギングするコードが追加されたようだ。

使い方は簡単で、
https://docs.djangoproject.com/en/1.3/topics/logging/
ここを見ながら設定してみると、

setting.py
LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'mail_admins': {
            'level': 'ERROR',
            'class': 'django.utils.log.AdminEmailHandler'
        }
    },
    'loggers': {
        'django.request': {
            'handlers': ['mail_admins'],
            'level': 'ERROR',
            'propagate': True,
        },
  'app': {
   'handlers': ['console'],
   'level': 'DEBUG',
   'propagate': True,
  },
    }
}

views.py
import logging
...

logger = logging.getLogger('app')
...
このような感じに設定しておく。

○django-debug-toolbar
さらにデバッグしやすくしようと思って調べてみたら、
「django-debug-toolbar」というものを発見。
ここからいつもどおりの手順で導入していく。

1.インストール
sudo easy_install-2.5 django-debug-toolbar

2.設定
.\python\Lib\site-packages\django_debug_toolbar-0.8.5-py2.6.egg\example
サンプルを見ながら設定していく。

settings.py
INSTALLED_APPS = (
    ...
    'debug_toolbar',
)
MIDDLEWARE_CLASSES = (
    ...
    'debug_toolbar.middleware.DebugToolbarMiddleware',
)

DEBUG_TOOLBAR_PANELS = (
    'debug_toolbar.panels.version.VersionDebugPanel',
    'debug_toolbar.panels.timer.TimerDebugPanel',
    'debug_toolbar.panels.settings_vars.SettingsVarsDebugPanel',
    'debug_toolbar.panels.headers.HeaderDebugPanel',
    'debug_toolbar.panels.request_vars.RequestVarsDebugPanel',
    'debug_toolbar.panels.template.TemplateDebugPanel',
    'debug_toolbar.panels.sql.SQLDebugPanel',
    'debug_toolbar.panels.signals.SignalDebugPanel',
    'debug_toolbar.panels.logger.LoggingPanel',
)

def custom_show_toolbar(request):
    return True # Always show toolbar, for example purposes only.

DEBUG_TOOLBAR_CONFIG = {
    'INTERCEPT_REDIRECTS': False,
    'SHOW_TOOLBAR_CALLBACK': custom_show_toolbar,
    #'EXTRA_SIGNALS': ['myproject.signals.MySignal'],
    'HIDE_DJANGO_SQL': False,
}

3.確認
サーバ立ち上げて、管理画面を表示してみる。
右側に黒いメニューバーが表示されていれば成功。

(Firefoxはうまく表示されたが、IEだと表示バグがあった。。)

○pylint
コーディング中に構文エラーを発見したい人向け。
自分が使っているエディタはVIMを使っているので、
VIM環境で楽に使えるように設定まで行ってみた。

1.インストール
 easy_install pylint

2.VIM環境設定
 http://www.vim.org/scripts/script.php?script_id=891
 pylint.vimの最新版をダウンロードして、
 Vimフォルダのruntime/plugin/
 にコピーする。

参考ページ
http://www.hexacosa.net/blog/detail/54/

2011年6月1日水曜日

pythonでタグジャンプを使う

VIMでPythonをいじってるとき、タグジャンプできたらいいなと思い、検索してみたら
ctagでPython用のタグ生成できる事を知った。

やりかたはいたって簡単

 :!ctags *.py

これだけで生成できる。しかし、これだけだと同一フォルダ内のソースしかジャンプできない。

サブフォルダにもジャンプしたいよって事で、

 :!crags -R ..

こうすることで一階層下からサブフォルダにアクセスできるようになるが、
プログラム中の「from ~import」命令分にもタグが貼られてうまくジャンプできないケースがあって
思ってるようないい結果にはならない。。

ということでpython\tools\Scripts\ptags.pyを少しいじって
再帰検索に対応したタグジャンプ作成モジュールを使うことにした。

使い方:
 python ptags.py [カレントディレクトリ]

例:
 python ptags.py ../


コメント部分がオリジナルでコメント下に書いた文が追加箇所。
def main():
 #args = sys.argv[1:]
 #for filename in args:
 #    treat_file(filename)
 #>>> 追加:再帰表現に対応 >>>
 xdir = os.walk(sys.argv[1])
 for xpath, dirs, files in xdir:
  for xfile in files:
   fname, ext = os.path.splitext(xfile)
   if '.py' == ext:
    filename = os.path.join(xpath, xfile)
    treat_file(filename)
 #<<< 追加:ここまで <<<

 if tags:
  fp = open('tags', 'w')
  tags.sort()
  for s in tags: fp.write(s)
 
 
これでC言語のタグジャンプと同じ動きになる。

オマケ
 vimrcの設定でCTRL+Eキーでタグファイル生成するマクロ。 ptagsのディレクトリ位置や、カレントディレクトリの設定は環境に合わせる必要あり。

  nnoremap :!python d:\TracLight\python\Tools\Scripts\ptags.py ../

参考URL :

 http://d.hatena.ne.jp/t2y-1979/20080904/1220458000

2011年5月27日金曜日

PythonでExcel編集

便利モジュールを発見
その名も「pyexcelerator」

http://sourceforge.net/projects/pyexcelerator/

いつもどおりの手順
1.インストール
easy_install -U pyexcelerator

2.確認
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import pyExcelerator

# 読込みテスト
sheets = pyExcelerator.parse_xls('d:/test.xls')

for sheet_name, values in sheets:
    print 'sheet =', sheet_name
    print '------------'
    for row_idx, col_idx in sorted(values.keys()):
        v=values[row_idx,col_idx]
        print row_idx,col_idx,v

# 書込みテスト
book = pyExcelerator.Workbook()
sheet = book.add_sheet('sheet_name1')
sheet.write(0, 0, 'test')
book.save('test.xls')


pyExceleratorのサンプルプログラムに
罫線や画像イメージの挿入などするものがある。

参考URL
---
http://d.hatena.ne.jp/tenkoma/20060903/1157300072

debian ftpサーバ構築

SCPでファイル転送でも良いけど、
もっと楽にデータのやり取りできるようにFTPサーバ構築してみた。

いつもどおりの手順。


1.インストール
apt-get install vsftpd

2.設定
vim /etc/vsftpd.conf
---
anonymous_enable=NO
local_enable=YES
write_enable=YES
ascii_upload_enable=YES
ascii_download_enable=YES
chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd.chroot_list
force_local_logins_ssl=NO
force_local_data_ssl=NO

ログイン可能アカウントを設定
/etc/vsftpd.chroot_list
---


3.確認
FFFTP、FileZillaなど使ってみる。


参考URL
---
http://www.geocities.jp/yukke_no_kobeya/kurobako/de_100.html

debian localeエラー

apt-get updateしたら次のようなエラーが出た。

perl: warning: Setting locale failed.    
perl: warning: Please check that your locale settings:
 LANGUAGE = (unset),
 LC_ALL = (unset),
 LANG = "ja_JP.UTF-8"
    are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C").
locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_MESSAGES to default locale: No such file or directory
locale: Cannot set LC_ALL to default locale: No such file or directory

ベースがlennyで、squeeze(sid)へdist-upgradeした後、そのままの設定だったので
apt-get updateしたので、Wheezy(sid)のパッケージを見てしまったようだ。。
本当の原因は分からないままだけど、エラー文みて分かるとおり
locale設定が足りないだけなので、必要なパッケージをインストールした。

いつもの手順。
1.インストール
 apt-get install locales


2.設定
 dpkg-reconfigure locales

 選択した項目
ja_JP.UTF-8 UTF-8

 設定完了まで4,5分かかる。


3.確認
locale
---


問題のエラー文が表示されなくなっていれば成功。

ここで注意しなければならないのは、Sambaを使ってる時の文字コード。
EUC、UTF-8、SJIS、CP932、色々あるので環境に合わせること。
個人的設定は、
Linux周りはUTF-8で統一して
Windows系はCP932(SJISだと一部文字化けする)


参照URL
---
http://landisk.kororo.jp/diary/08_locale.php
http://gmt-24.net/archives/319

2011年5月26日木曜日

mini2440にssh接続

いつもの手順でさくっとインストール。
そしてサーバを立ち上げて接続を試みてみる。

1.インストール
 aptitude install openssh-server

 インストールエラーになったとき
  dpkg --configure -a


2.サーバ設定
 サーバ:mini2440のIPを調べておく(ifconfig、例:192.168.2.20)
 アクセス範囲設定
 /etc/hosts.allowを編集
---
sshd: 192.168.2.

/etc/hosts.denyを編集
---
sshd: ALL

/etc/ssh/sshd_configを編集
---
>セキュリティー関係なしにログインする場合
PermitEmptyPasswords yes に修正
# UsePAM yes コメントアウトにする

>認証機能を入れる場合
PermitRootLogin yes/noどっちか設定
# AuthorizedKeysFile %h/.ssh/authrized_keysコメント外す

#アクセスユーザの設定(最後の行に追加)
DenyUsers ALL
Allowusers mini2440


3.クライアント設定
 ○クライアント:PC側からサーバIPに接続
  ssh 192.168.2.20

これでログイン出来れば成功。



4.ttySAC0のコンソール出力をOFFにする。
シリアルポートが使いたい時、
u-bootの起動パラメータを設定する
---
http://ivis-mynikki.blogspot.com/2010/11/mini2440debianlenny.htmlより引用

setenv bootcmd 'mmcinit ; ext2load mmc 0:1 0x31000000 /boot/uImage ; bootm 0x31000000'
setenv bootargs 'console=ttySAC0,115200n8 rootdelay=3 mini2440=3tb root=/dev/mmcblk0p1 rw rootfstype=ext3 rootwait'
saveenv
---
console=ttySAC0,115200n8の部分で

ttySAC0の部分をfb0にする

参考サイト
---
http://www.linux.net-japan.info/install04.html

2011年5月17日火曜日

debian環境の設定メモ

Debian環境でMono/CLIを導入に関するメモ
http://mono-project.com/DistroPackages/Debian

・インストール方法(lenny)
source.list
>deb http://backports.debian.org/debian-backports main

>aptitude update
>aptitude -t lenny-backports install mono-complete

・非公式版
source.list
>deb http://debian.meebey.net/pkg-mono /



あとSSHの設定方法メモ
 http://mono-project.com/DistroPackages/Debian

・インストール方法
>aptitude install ssh

sshd_config
/etc/ssh/sshd_configを開き

PermitRootLogin yes /rootでログインできるようにする
AuthorizedKeyFile %h/.ssh/authorized_keys コメントを外す

# 必要があれば特定ユーザのみログインできるようにする
# DenyUsers ALL
# Allowusers etch

sshアクセス範囲を内部限定にする
/etc/hosts.allow
ALL: 127.0.0.1
sshd: 192.168.

/etc/hosts.deny
sshd: ALL

2011年5月16日月曜日

LinuxでUSB制御(検討編)

Linuxボードがあります。
シリアルポートや、USBポートがあるから制御に使うのが筋ってもの。

しかしどうやって使うの?ドライバーは?という疑問が多々あるので、
今回は導入前の検討編。

1.インストール
 libusbをインストールする。(Debian系列ではusbutils)

2.USB機器を接続して、「lsusb」ベンダIDを調べる。
 Bus 001 Device 001: ID 0123:4567

  ベンダID : 0123
  プロダクトID : 4567

3.サンプルソース(送受信周りがまだ未完成)
#include 

static struct usb_bus *m_bus;
static struct usb_device *m_dev;
static usb_dev_handle *m_dh;



static int USBopen()
{
 usb_init();
 usb_find_busses();
 usb_find_devices();

 /* search target device */
 for (m_bus = usb_get_busses(); m_bus; m_bus = m_bus->next) {
  for (m_dev = m_bus->devices; m_dev; m_dev = m_dev->next) {
   if ((VENDOR_ID == m_dev->descriptor.idVendor) && (PRODUCT_ID == m_dev->descriptor.idProduct)) {
    return (NULL != (m_dh = usb_open(m_dev)))? 1 : -2;
   }
  }
 }
 return -1;
}



//送受信
//アクセスするUSBデバイスの「bmRequestType」や「bRequest」、「wValue」、「wIndex」、「wLength」などとエンドポイントなどを調べておく必要がある。
unsigned char msg[8];
int result=usb_control_msg(dh, bmRequestType, bRequest, wValue, wIndex, msg, sizeof(msg), timeout);
if(result<0){printf ("Control message error. (%s)\n", usb_strerror());}


//read
#define USBclose() usb_close(dh);
#define USBread(readbuf, bytes, timeout) usb_bulk_read(dh, end_point, readbuf, bytes, timeout)


void test(){
 USBOpen();
 USBread(readbuf, bytes, timeout);
 USBClose();
}
4.コンパイル
 cc -o test test.c -I/usr/include/ -L/usr/lib/ -lusb


参考URL
http://penguin.tantin.jp/hard/libusb%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6.html
http://bake-san.com/usb004.htm
http://blog.livedoor.jp/eru_at/archives/1262118.html

Androider