2009年5月9日土曜日

HTMLのrelative

<style type="text/css">
#test_div{
width: 100px;
height: 100px;
border: solid #000000 2px;
}
#test_div2{
width: 100px;
height: 100px;
border: solid #eaefaa 2px;
position: relative;
left: 100px;
top: -2px;
}
</style>
<div id="test_div">
<div id="test_div2">

</div>
</div>

2009年5月7日木曜日

GTKポートって何?

最近、WebKitの勉強していると時々GTK+portという記述を見るがなんとなく読み流していたが調べてみることにした。

IT用語辞典によれば。

本来のプラットフォーム以外で動作するように改造されたものを ○○○向けポートというらしい。また、改造する作業をporting(ポーティング)というらしい。

WebKitGtk-GNOME Live!の序文
原文:WebKit/GTK+ is the new GTK+ port of the WebKit.
訳:WebKit/GTK+はWebKitの新しいGTK+ポートです。

っていうことはGTK+ポートって言うのはWebKitをGTK+上で動作するように改造したものってこと?

自分で書いていて訳が分からなくなってきた。読解力がねぇ…

2009年5月5日火曜日

コマンドインタプリタを作ってみた。

Google V8についているshellを参考に作成。


using namespace std;

int RunMain(int argc, char* argv[]){
static const int bufsize = 256;
while(true){
char buffer[bufsize];
//↓インタプリタ感を出すやつ
printf(">");
char* str = fgets(buffer, bufsize, stdin);
//終了させるにはquitと打つ
if(strcmp(str, "quit")){
exit(0);
}
printf("%s",buffer);
}
return 0;
}

int main(int argc,char* argv[]){
int result = RunMain(argc, argv);

return 0;
}

C/C++をほとんど触ったことがなかったから、よく分からないがおそらく、pythonのインタプリタもこんな感じで動いているんだろう。

2009年5月4日月曜日

よくこれだけ忘れられると思った。

int main(int argc, char* argv){

return 0;
}
これがC/C++の基本だけど。
int argc, char* argvってなんだっけ?ってさっき思った。


#include
int main(int argc, char* argv[]){

std::cout << argv[0] << std::endl;
std::cout << argc << std::endl;
return 0;
}
実行
$./test ABC
出力結果
$./test
2

忘れてたけど0個目の引数は実行ファイル名になるんだね。

…記憶力がまずいことになってる気がしてきた。

2009年5月3日日曜日

WebkitでWebブラウザを作ってみた

GTKLauncherのコードを参考に作成。

コード:

#include <gtk/gtk.h>
#include <webkit/webkit.h>
#include <iostream>


static WebKitWebView* web_view;

static GtkWidget* create_browser()
{
GtkWidget* scrolled_window = gtk_scrolled_window_new(NULL, NULL);
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window), GTK_POLICY_AUTOMATIC,
GTK_POLICY_AUTOMATIC);
web_view = WEBKIT_WEB_VIEW(webkit_web_view_new());
gtk_container_add(GTK_CONTAINER(scrolled_window), GTK_WIDGET(web_view));

return scrolled_window;
}

static void destroy_cb(GtkWidget* widget, gpointer data)
{
gtk_main_quit();
}
static GtkWidget* create_window()
{
GtkWidget* window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_window_set_default_size (GTK_WINDOW (window), 800, 600);
gtk_widget_set_name (window, "GtkLauncher");
g_signal_connect (G_OBJECT (window), "destroy", G_CALLBACK (destroy_cb), NULL);

return window;
}



int main(int argc, char* argv[]){
//テスト出力
std::cout<< "START PROCESS" << std::endl;
//↓スタート
gtk_init(&argc, &argv);

GtkWidget* vbox = gtk_vbox_new(FALSE, 0);
gtk_box_pack_start(GTK_BOX(vbox), create_browser(), TRUE, TRUE, 0);

GtkWidget* _main_window;
_main_window = create_window();
gtk_container_add(GTK_CONTAINER(_main_window),vbox);

webkit_web_view_open(web_view, "http://www.google.com/");

//↓おまじない**********************
gtk_widget_grab_focus(GTK_WIDGET(web_view));
gtk_widget_show_all(_main_window);
gtk_main();
//**********************************
return 0;
}

コンパイルする:

$ g++ -o brow brow.cc `pkg-config --cflags --libs gtk+-2.0` `pkg-config --cflags --libs webkit-1.0`

なんせこんなことしたの今回が初めてだからよく分からないが
error while loading shared libraries: libwebkit-1.0.so.1: cannot open shared object file: No such file or directory
こんなエラーが出た。

調べてみるとライブラリが認識されていないために起きるエラーらしい。そこで
$lfconfig
$sudo ldconfig
を実行

再コンパイルしてみるとエラーは出なくなった。
出来たのはこんな感じ↓


…Javascriptも動くブラウザをこうも簡単に作れるのはすごい。感動した。

2009年5月1日金曜日

GTK+のコンパイル

前やったときはこんなに面倒くさいオプションいらなかった気がするんだけど。
g++ -o hello_world hello_world.cpp `pkg-config --cflags --libs gtk+-2.0`

追記:
  ubuntu 9.04(netbook remix)では同じ方法ではコンパイルが通らなかった。pkg-config自体は既にインストールされていたため
$ pkg-config --list-all
でめぼしいものを探したところ「gtk+」という項目を発見。ということで
  $ g++ -o sample_gtk.cc -o sample_gtk `pkg-config --cflags --libs gtk+`
と実行してみるとコンパイルに成功した。ubuntu8.10からの変更? pkg-configの仕様が変わった?
 後、これの前に
  $ sudo apt-get install libgtkmm*-devlibgtk2.0-dev
を実行。
さらに追記:
  コンパイルが通らなかったのはlibgtk2.0-devをインストールしてなかったからでした。

pkg-configはコンパイルオプションを自動生成してくれるスグレモノ。

バッククォートで囲んでいるのはシェルではバッククォートで囲んだ部分の実行結果を変数として格納できるから。
つまりこのコマンドを実行すると
pkg-config --cflags --libs gtk+-2.0
のコマンドの実行結果

-D_REENTRANT -I/usr/include/gtk-2.0 -I/usr/lib/gtk-2.0/include -I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/include/pango-1.0 -I/usr/include/pixman-1 -I/usr/include/freetype2 -I/usr/include/directfb -I/usr/include/libpng12 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -lgtk-x11-2.0 -lgdk-x11-2.0 -latk-1.0 -lpangoft2-1.0 -lgdk_pixbuf-2.0 -lm -lpangocairo-1.0 -lgio-2.0 -lcairo -lpango-1.0 -lfreetype -lfontconfig -lgobject-2.0 -lgmodule-2.0 -lglib-2.0

を「g++ -o hello_world hello_world.cpp」の後に付加してコンパイルを実行しているということ。

・・・これ書くぐらいなら楽なもんだなぁ。

VirtualBoxで印刷する

ubuntuを使い始めて半年が過ぎたが素晴らしい使い心地でWindowsに戻る気も起きることなく今日まで唯一不満でならなかったのがプリンタがまったく使えなかったことだ。

そのうち対応するだろうと軽く考えていたがそうもなりそうにないので自分で何とかするしかないようだ。

結論から言うと使うことが出来た。

環境:
OS(ホスト) ubuntu8.10
OS(ゲスト) Windows vista
RAM  1.36GB
USB-HDD  60GB
プリンタ lexmark x2550

※lexmark x2550について少し説明しておく。このプリンタのドライバは付属のCD-ROMに入っており、インターネットからもダウンロードは可能。ただしインストール時はプリンタのUSBをPCが認識している状態でないとドライバのインストールもすることは出来ない。

そこでVirtualBoxを使う。

ubuntuのリポジトリにVirtualBoxのオープンソースエディションがあるがこれを使うとUSBを使えない。困ったことだ。

1.Ubuntu8.10("Intrepid Ibex")のi386をダウンロード。公式サイトのダウンロードページ

2.GDebi Packageインストーラでダウンロードしたdebファイルをインストール

3.sudo VirtualBox
と端末で入力

4.アプリケーションが起動

5.新規というボタンをクリック。

6.ウィザードに沿っていけばインストール準備完了

7.設定ダイアログでCDのマウントを有効にする

8.CD/DVDドライブにWindowsVistaのDVD-ROMを挿入

9.起動というボタンをクリック

10.インストール作業が始まる。(私の場合インストールには1時間程度かかった)

今日はここまで。