簡易ブラウザを作ってみる

本日GUI講習会を実施しました。最初ということでツールの使い方が中心ですが、今時のGUIツールキットは充実したツールによって簡易ブラウザくらいなら簡単に作れるので作ってみましたので、その作り方を動画で紹介しましょう。講習会ではQtを扱いましたが、Mac OS XのCocoaだとさらに簡単に作れます。

Qt編

Cocoa編

Ubuntu/DebianでAVR

ご無沙汰しております。最近、全く更新されていないので活動してないかと思われていそうで、実際にInRoF終了後はあまり活動していないt-semiです。本当は学部2年生あたりやInRoFの製作日誌を書いた人に結果なりネタなりを投入してほしいところではあるのですが、あまり更新してくれないので学部4年のY.Oが更新させていただきます。

さて、ShiozakiさんがLinuxでAVRとしてavr-gccの詳細なコンパイルの仕方を紹介していますが、Ubuntuのパッケージ変更点を参照すると、どうやらFreeBSDのリポジトリにあるavr-gcc向けパッチを当てた状態で頒布されているようです。同様にDebianのパッケージ変更点を参照しても少々古いですがWinAVRで使われているパッチは当ててあるようです。

というわけでUbuntuもしくはDebianを使っている人は単純にsudo apt-get install avr-libc avrdudeとでもすれば、とりあえずのAVR開発環境がそろいます。FedoraやGentooではそうなってはいなそうなので、LinuxでAVRAVR-GCCの自前ビルドを参照して自力でコンパイルしなければならないようです。

追記

後から気づいたのですが、binutils-avrにはavr-sizeのパッチがあたっていないようです。このパッチがあたっていないと使いが手が悪くなるのでbinutilsだけ自前でパッチ当てたものをコンパイルした方がよいかもしれません。

InRoF おつかれさまです

InRoF 2010おつかれさまです。t-semi001としてSAIMONとLAURA(SAIMON Classicから改名)で出場したY.Oです。結果はあまりふるわず、どちらも自由ボール以外のボールも入れられたものの予選落ち仕掛けたところをLAURAの方は動画投稿したおかげで拾っていただけました。しかし、二日目はプログラムに一行書き忘れたために無限ループに陥ってしまい、あまり得点を取ることができませんでした。

さて、写真や動画を投稿したいところではあるのですが、動画ファイルが720pの60fpsで20GBあるので編集に時間がかかりそうです。編集が終わったらYouTubeのtsemi001チャンネルに投稿させていただきます。

追記1

一つ目の動画をアップロードしました。C11 SAIMONです。もとの動画が暗かったため色が少しおかしくなっています。

トランスフォーマー

しばらく投稿していませんでしたがM.L.B.のKoAです.
今年のInRoF用ロボットの本体がほぼ完成しました.7号機になる今年も当然,歩行ロボットです.名前はLILIUMです.

写真ではわかりずらいですがLILIUMもこれまでと同じく脚に車輪がついています.
これによりこのロボットは車輪と歩行の両方で移動でき,分類的には脚車輪型と呼ばれる歩行ロボットになります.
今まで作ったロボットは5号機以外すべて脚車輪型だったりします.
ちなみなぜタイトルのトランスフォーマーかというと変形することで車輪移動⇔歩行移動を切り替えるからです.(写真は車輪移動時)

次回はこの歩行ロボットの変形について詳しく書こうかと思います.

AVR-GCCで浮動小数点

AVR-GCCでは浮動小数点も使えてしまいます。実際の計算はGCCが生成するコードによってソフトウエアで実行されますので、あまり使うものではありませんけどね。ところでAVR-GCCにおいてdoubleは倍精度ではありません。 by Y.O

C言語の言語仕様ではビット幅が固定の型にあるように型のサイズが決められていません。浮動小数点型においてもこれは例外ではなく、floatとdoubleも必ず4バイト、8バイトではありません。それではAVR-GCC (avr-gcc (GCC) 4.3.3) での型サイズを見てみましょう。

バイト
char 1
short 2
int 2
long 4
long long 8
double 4
float 4
long double 4

このように実はdoubleとfloatのサイズは同じになっています。floatで精度が足りないからといってdoubleにしても意味がないので注意しましょう。そもそも浮動小数点はあまり使うべきでないので、できれば固定小数点を実装しましょう。

検証に使用したコード
[c]
#include <stdint.h>
#include <stdio.h>

int main(void)
{
volatile uint8_t sizeList[] = {
sizeof(char),
sizeof(short),
sizeof(int),
sizeof(long),
sizeof(long long),
sizeof(double),
sizeof(float),
sizeof(long double),
};

volatile double a = 0.1;
volatile double b = 0.2;
volatile double c = a + b;
}
[/c]

アセンブルしたコード(avr-gcc -O0 -S hello.c -mmcu=atmega88)

[plain]
.file "hello.c"
__SREG__ = 0x3f
__SP_H__ = 0x3e
__SP_L__ = 0x3d
__CCP__ = 0x34
__tmp_reg__ = 0
__zero_reg__ = 1
.data
.type C.0.1373, @object
.size C.0.1373, 8
C.0.1373:
.byte 1
.byte 2
.byte 2
.byte 4
.byte 8
.byte 4
.byte 4
.byte 4
.text
.global main
.type main, @function
main:
push r29
push r28
in r28,__SP_L__
in r29,__SP_H__
sbiw r28,27
in __tmp_reg__,__SREG__
cli
out __SP_H__,r29
out __SREG__,__tmp_reg__
out __SP_L__,r28
/* prologue: function */
/* frame size = 27 */
movw r24,r28
adiw r24,1
std Y+24,r25
std Y+23,r24
ldi r30,lo8(C.0.1373)
ldi r31,hi8(C.0.1373)
std Y+26,r31
std Y+25,r30
ldi r31,lo8(8)
std Y+27,r31
.L2:
ldd r30,Y+25
ldd r31,Y+26
ld r0,Z
ldd r24,Y+25
ldd r25,Y+26
adiw r24,1
std Y+26,r25
std Y+25,r24
ldd r30,Y+23
ldd r31,Y+24
st Z,r0
ldd r24,Y+23
ldd r25,Y+24
adiw r24,1
std Y+24,r25
std Y+23,r24
ldd r25,Y+27
subi r25,lo8(-(-1))
std Y+27,r25
ldd r30,Y+27
tst r30
brne .L2
ldi r24,lo8(0x3dcccccd)
ldi r25,hi8(0x3dcccccd)
ldi r26,hlo8(0x3dcccccd)
ldi r27,hhi8(0x3dcccccd)
std Y+9,r24
std Y+10,r25
std Y+11,r26
std Y+12,r27
ldi r24,lo8(0x3e4ccccd)
ldi r25,hi8(0x3e4ccccd)
ldi r26,hlo8(0x3e4ccccd)
ldi r27,hhi8(0x3e4ccccd)
std Y+13,r24
std Y+14,r25
std Y+15,r26
std Y+16,r27
ldd r24,Y+9
ldd r25,Y+10
ldd r26,Y+11
ldd r27,Y+12
ldd r18,Y+13
ldd r19,Y+14
ldd r20,Y+15
ldd r21,Y+16
movw r22,r24
movw r24,r26
rcall __addsf3
movw r26,r24
movw r24,r22
std Y+17,r24
std Y+18,r25
std Y+19,r26
std Y+20,r27
/* epilogue start */
adiw r28,27
in __tmp_reg__,__SREG__
cli
out __SP_H__,r29
out __SREG__,__tmp_reg__
out __SP_L__,r28
pop r28
pop r29
ret
.size main, .-main
.global __do_copy_data
[/plain]

Windowsで画像編集

Windows付属のペイントはあまり高度なことはできません。昔から存在する化石のようなソフトでWindows 7でインターフェースが変わったようですが、もともとデモアプリケーションのような存在なのでマイクロソフトも機能を充実させるつもりもないようですね。そこでペイント代替のソフトウエアとしてPaint.NETを紹介しましょう。 by Y.O

PhotoshopやGimpのように把握しきれないほど多機能ではありませんが十分な機能をそろえています。また、Microsoftから支援を受けており、とても完成度が高いことも特徴です。GimpはもともとLinux用のソフトですので、Windowsの流儀に沿っていない部分もありますが、Paint.NETはそのようなこともないので自然に扱えると思います。

Process Hacker

Windowsのタスクマネージャーに不満はありませんか?また、何かのソフトでファイルが開かれており、うまく削除や移動ができずに悩んだことはありませんか。このような問題を解決するためのツールとしてProcess Hackerを紹介します。 by Y.O

Process Hackerはスクリーンショットにあるようにプロセスの親子関係を表示したり、詳細な状態を表示したりすることができます(画像は一部ぼかしたり削除してあります)。タスクマネージャーが供えている機能は一通りそろえており、インストール時にタスクマネージャーを置き換えてしまうこともできます。

HackerメニューからFile Handles or DLLs を選ぶと、どのハンドルをどのアプリケーションが開いているのかを確認することができます。調べたいファイル名を入れてFindを押せば調べることができます。

余談ですが、このようなことをMac OS XやLinuxでやろうとした場合にはlsofというコマンドが便利ですよ。