2010年10月14日木曜日

ターミナルによるandroidアプリ開発の準備

hello worldのビルドまで簡単にいけると思ったら尋常じゃないくらいハマったので記録する。

参考ページ1
参考ページ2

自分の場合は参考ページ1が解決に役立ったが人によっては参考ページ2が役に立つ可能性がある。

必要なパッケージの準備
$ sudo apt-get install openjdk-6-jdk ant

SDKをダウンロード

解凍

環境変数の設定(PATH, JAVA_HOME, CLASSPATH)
$ emacs ~/.bashrc

export JAVA_HOME=/usr/lib/jvm/java-1.6.0-openjdk
export CLASSPATH=${JAVA_HOME}/lib/tools.jar:${JAVA_HOME}/lib/dt.jar
export PATH=${PATH}:JAVA_HOME/bin:~/Downloads/android-sdk-linux_x86/tools

$ source ~/.bashrc

$ android create project --path ./test-app --target 7 --name testapp --activity TestAppActivity --package android.app.testapp

$ ant debug

この後も色々...

2010年9月11日土曜日

2010年9月9日木曜日

gtkmmで動的にウィジェットを追加する

参考:
gtkmm-2.4のソースコードのなかにあるexamples/stock
gtkmm_helloのソースコード(時間短縮のために流用)

#ifndef GTKMM_HELLO_H
#define GTKMM_HELLO_H

#include <iostream>
#include <gtkmm.h>

class GtkmmHello : public Gtk::Window
{
public:
  GtkmmHello();
  virtual ~GtkmmHello();
  void on_button_clicked(Gtk::VBox* vb);

};

#endif //GTKMM_HELLO_H


GtkmmHello::GtkmmHello()
{
  set_title("gtkmm_hello");
  set_border_width(10);

  //manageを使わないとsegmentation faultになる
  Gtk::Button* m_Button = manage(new Gtk::Button("click"));
  Gtk::VBox* vb = manage(new Gtk::VBox(false, 0));
  m_Button->signal_clicked().connect(sigc::bind(
      sigc::mem_fun(*this, &GtkmmHello::on_button_clicked), vb));
  
  vb->pack_start(*m_Button, false, false, 0);
  add(*vb);
  show_all();
}

GtkmmHello::~GtkmmHello()
{
}

void GtkmmHello::on_button_clicked(Gtk::VBox* vb)
{
  Gtk::Button* b = new Gtk::Button("new button");
  b->show();
  vb->pack_start(*b, false, false, 0);
  std::cout << "test" << std::endl;
}

int main (int argc, char *argv[])
{
  Gtk::Main kit(argc, argv);
  GtkmmHello window;
  Gtk::Main::run(window);
  return 0;
}

これが










こうなる

2010年9月6日月曜日

C++でURLをデコードする

#include <iostream>
#include <cstdlib>

int main(){
  char* enc = "40";//%40は@になる
  char* end;
  unsigned long ascii = 0;
  ascii = std::strtoul(enc, &end, 16);
  char dec = (char)ascii;
  std::cout << dec << std::endl;
  
  return 0;
}

2010年9月1日水曜日

HTC desire を買った

キャンセルが出てたまたま余った一台を発見し、勢いで買ってしまった。

今年中は忙しくて、androidプログラミングなんてしてる時間ないんだから別に今買う必要は無かった気がしないでもない。

2010年8月24日火曜日

ubuntuでgoogle mockを使う。

参考ページ

パッケージとかの準備
* Automake version 1.9 or newer
* Autoconf version 2.59 or newer
* Libtool / Libtoolize
* Python version 2.3 or newer (for running some of the tests and
re-generating certain source files from templates)

$ sudo apt-get install automake autoconf libtool python

$ automake --versionでバージョン情報を表示。1.9より古かったら
$ sudo apt-get install automake1.9
$ AUTOMAKE=automake-1.9
$ ACLOCAL=aclocal-1.9

準備が終わったら
$ autoreconf -fvi

表示された中にerrorがなければ
$ emacs ~/.bashrc
ファイルの最後に
export GMOCK_DIR=~/GcodeProjects/gmock
export GTEST_DIR=${GMOCK_DIR}/gtest
のように環境変数を追加

$source ~/.bashrcで変更を反映

$ g++ -I${GTEST_DIR}/include -I${GTEST_DIR} -I${GMOCK_DIR}/include \
-I${GMOCK_DIR} -c ${GTEST_DIR}/src/gtest-all.cc

$ g++ -I${GTEST_DIR}/include -I${GTEST_DIR} -I${GMOCK_DIR}/include \
-I${GMOCK_DIR} -c ${GMOCK_DIR}/src/gmock-all.cc

$ ar -rv libgmock.a gtest-all.o gmock-all.o

出来たlibgmock.aをテストを行うディレクトリに移動。
(ビルドが成功したかを試すために参考ページにあるソースコードを使用した。)

$ g++ -I${GTEST_DIR}/include -I${GMOCK_DIR}/include \
your_test.cc libgmock.a -o your_test -lpthread

テストの実行
$ ./your_test

2010年8月9日月曜日

Google C++ Testing Frameworkで述べられているプライベートメンバー関数のテストについて

参考ページ

原文:
If you change your software's internal implementation, your tests should not break as long as the change is not observable by users. Therefore, per the black-box testing principle, most of the time you should test your code through its public interfaces.

If you still find yourself needing to test internal implementation code, consider if there's a better design that wouldn't require you to do so.....

訳:
 あなたがソフトウェアの内部の実装を変更したいとして、ユーザに分からないような変更に時間をかけるべきではない。あなたは、他のクラスとのインターフェースとなる関数のテストに時間をかけるべきだ。
 もし、まだ内部の実装をテストしたいなら、その必要が無いようなデザインをもっと考えたほうがいい。

個人的な意見:
 そうは言っても、Composedパターンなどで多数のプライベート関数が生まれることは避けられないのだから、プライベート関数をテストすることは、必要なのではないの?

2010年8月6日金曜日

C++のクラスを書いていて分かったこと。

gcc = C言語のコンパイルに主に使う。

g++ = C++のコンパイルに主に使う。

#include 

using namespace std;

class ClassSpike {
 public:
  void set_int(int i);
  int get_int();
 private:
  int I;

};

void ClassSpike::set_int(int i){
  I = i;
}

int ClassSpike::get_int(){
  return I;
}

int main(){
  ClassSpike cs;
  cs.set_int(1);
  int j = cs.get_int();
  cout << j << "です。\n";

  return 0;
}

こんな感じのファイルをコンパイルしようとすると、gccではエラーが出た。
g++では何事もなくコンパイルに成功した。

gccでもクラスをコンパイルできるが、アクセッサ、ミューテータを実装しようとしたところでエラーが出るようになった。

2010年5月24日月曜日

ubuntuでWEBサイトをまるごとローカルに保存する方法

$wget --mirror --html-extension --convert-links 保存したいサイトのURL -P 保存したい場所のパス

2010年5月9日日曜日

gtags, htagsについて

ソースコードを読む時、クラスや関数の定義がどこにあるか分からない場合、gtags, htagsを使うと効率が上がる。

インストール:$ sudo apt-get install global

ソースコードのあるフォルダに移動。

$ gtagsを実行

ソースコードに関する情報がまとめられたフォルダが作成される。

$ htags -aを実行

HTMLというフォルダが作成される。

HTMLフォルダに移動し、中にあるindex.htmlなどをWEBブラウザで見る。

2010年5月7日金曜日

ubuntu 10.04でpython2.5をインストールする

参考ページ

$ sudo gedit /etc/apt/sources.list
開いたファイルの最後に
deb http://ppa.launchpad.net/fkrull/deadsnakes/ubuntu lucid main
deb-src http://ppa.launchpad.net/fkrull/deadsnakes/ubuntu lucid main
と追加し保存。

$sudo apt-get install update

$sudo apt-get install python2.5

警告がインストールの前に出るので、もしかしたらあんまり安全ではないかも。

2010年3月19日金曜日

Javaのインターフェースについて現時点での考え。

UMLによるJavaオブジェクト設計第2版を参考。

インターフェースが無い場合、オブジェクトのプロパティ・メソッドを呼び出す場合、そのオブジェクトが何のクラスから作られたかが重要になる。
class Hello {  
  public static void main(String[] args){    
    World w1;
    World2 w2;

    w1 = new World();
    w1.greeding();
    
    w2 = new World2();
    w2.greeding();
    //Hello World.
    //World2.
  }
}

class World {
  public void greeding(){
    System.out.println("Hello World.");
  }
}

class World2 {
  public void greeding() {
    System.out.println("World2.");
  }
}

これに対して、インターフェースを用いると、同じような時、インターフェースを実装しているかどうかが重要となる。
class Hello {  
  public static void main(String[] args){    
    IHello hello;
    
    hello = new World();
    hello.greeding();
    
    hello = new World2();
    hello.greeding();
    //Hello World.
    //World2.
  }
}

class World implements IHello {
  public void greeding(){
    System.out.println("Hello World.");
  }
}

class World2 implements IHello {
  public void greeding() {
    System.out.println("World2.");
  }
}

2010年3月1日月曜日

Google Go LanuguageでShellコマンドを実行する。

参考ページ1(Google Code Search)
参考ページ2

test_exec.go
//コピーアンドペーストの産物
package main  

import (  
       "fmt"  
       "exec"  
       "io/ioutil"
)  

func main() {
  //序盤の2つ以外はおまじない?
  cmd, err := exec.Run("/bin/ls", []string{"ls", "/"}, nil, "", exec.Pipe, exec.Pipe, exec.DevNull)
  
  //例外処理?
  if err != nil {  
    fmt.Printf("ERROR EXECUTING COMMAND: %d\n", err)
    os.Exit(1)
  }  
  
  //cmd構造体の中にStdin, Stdoutはあったからexec.Runを実行すると
  //なんか色々起こって、これが可能になるんだと思う。
  cmd.Stdin.Close();
   
  buff, err := ioutil.ReadAll(cmd.Stdout)
  if err != nil {  
    fmt.Printf("ERROR READING OUTPUT: %d\n", err)
    os.Exit(1)
  } else {  //改行するとエラーが出る
    fmt.Printf("COMMAND RESULT: %s\n", buff)
  }  
}
そんなに沢山の言語を使ったことないからわからないけど、凄いクセのある書き方をする言語だと感じた。if文の書き方まで厳密に決まってるし。

将来的にC#みたいに言語仕様がどんどん変わってJavaとかに近づいて行くのか?今のスタンスを維持して独自路線を突き進むのか?

個人的にはGoogleには後者であって欲しい。

2010年2月27日土曜日

Google Go Languageをgeditでハイライトさせる。

参考ページ

参考ページのgo-jp.langっていうリンクをクリック。

ダウンロードしたファイルを
$sudo mv Downloads/go-jp.lang /usr/share/gtksourceview-2.0/language-specs
などで移動する。

geditを起動する。

[表示] -> [強調表示モード] -> [ソース]とたどり、中に「go」があることを確認。

本当にハイライトできるか確認したい場合は、goのところのラジオボタンをクリックして、funcなどの予約語を入力してたしかめる。

Google Goをスクリプトでインストールする。

本家サイト(Google Go Language)
参考ページ

$source install_go.sh
管理者権限を与えずにインストールを開始する。

install_go.sh
#!/bin/bash

#make working directory
mkdir -p ~/gcode/go


#set environment variable
GOROOT=$HOME/gcode/go
GOBIN=$GOROOT/local/bin

echo "export GOROOT=$GOROOT" >> ~/.bashrc
echo "export GOOS=linux" >> ~/.bashrc
echo "export GOARCH=386" >> ~/.bashrc
echo "export GOBIN=$GOBIN" >> ~/.bashrc
echo "export PATH=$PATH:$GOBIN" >> ~/.bashrc
source ~/.bashrc


#prepare to build and install Google go 
sudo apt-get install python-setuptools python-dev build-essential mercurial bison gcc libc6-dev ed gawk make


#Download Google Go Sourcecode
hg clone -r release https://go.googlecode.com/hg/ $GOROOT


#build and install go
mkdir -p $GOBIN
cd $GOROOT/src
./all.bash >> install_log.txt


#make "HelloWorld"
echo "package main" >> $GOROOT/hello.go
echo 'import "fmt"' >> $GOROOT/hello.go
echo "" >> $GOROOT/hello.go
echo "func main(){" >> $GOROOT/hello.go
echo '  fmt.Printf("Hello 世界\n")' >> $GOROOT/hello.go
echo "}" >> $GOROOT/hello.go


#Compile and Execute HelloWorld -> It's not works in bash
#8g $GOROOT/hello.go
#8l -o $GOROOT/hello $GOROOT/hello.8
#$GOROOT/hello

#!/bin/bash

#make working directory
mkdir -p ~/gcode/go


#set environment variable
echo "export GOROOT=$HOME/gcode/go" >> ~/.bashrc
echo "export GOOS=linux" >> ~/.bashrc
echo "export GOARCH=386" >> ~/.bashrc
echo "export GOBIN=$GOROOT/local/bin" >> ~/.bashrc
echo "export PATH=$PATH:$GOBIN" >> ~/.bashrc
source ~/.bashrc


#prepare to build and install Google go 
sudo apt-get install python-setuptools python-dev build-essential mercurial bison gcc libc6-dev ed gawk make


#Download Google Go Sourcecode
hg clone -r release https://go.googlecode.com/hg/ $GOROOT


#build and install go
mkdir -p $GOBIN
cd $GOROOT/src
./all.bash >> install_log.txt


#make "HelloWorld"
echo "package main" >> $GOROOT/hello.go
echo 'import "fmt"' >> $GOROOT/hello.go
echo "" >> $GOROOT/hello.go
echo "func main(){" >> $GOROOT/hello.go
echo '  fmt.Printf("Hello 世界\n")' >> $GOROOT/hello.go
echo "}" >> $GOROOT/hello.go


#Compile and Execute HelloWorld -> It's not works in bash
#8g $GOROOT/hello.go
#8l -o $GOROOT/hello $GOROOT/hello.8
#$GOROOT/hello
最初の作業ディレクトリのところと8行目の環境変数GOROOTの定義、環境変数GOBINの定義はお好みでやるとしてそれ以外はほっといてもインストールできる(はず、自分はできた)。

っていうかgccの開発者がそのうちgccにgoのコンパイラ統合するって話だから、こんなことしなくてもよかったのかもしれない。

追記:
アップデートしたい場合は
cd $GOROOT/src
hg pull
hg update release
./all.bash
とする。結構な頻度でソースコードは変更されてるみたい。

2010年2月26日金曜日

Ubuntu9.10 Server EditionをUSBにインストールする。

参考ページ

途中のパーティションのところでUSBを選択するのが面倒くさいので、HDDを最初に抜いておく。
後は、手順どおりに進めばインストールされる。

起動後、◆に文字が化ける場合。
$ nano .bashrc
最後の行に
export LANG=C
と追加。
$exit
で再度ログイン。

起動後、インターネットに接続できない場合
とりあえず、
$ifconfig
表示された中にeth0,1,2...が無く、loだけだったら

$ sudo lshw -C network
logicalのところに表示されているやつ。ex) eth0とかeth1とか。を確認
$cat /etc/network/interfaces
で表示されるやつ
ex)
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet dhcp
の中の「eth0,1,2...」がさっき確認したlogicalのところに表示されているやつと同じか確認。
違っていた場合、
$ sudo nano /etc/network/interfaces
でlogicalのところに表示してあるやつにeth0,1,2...を修正。
$sudo reboot

$sudo /etc/init.d/networking restart

自分はこれで何とかなった。

2010年2月25日木曜日

bashで複数のコマンドを一度に出す方法

誰かのブログ読んでて偶然不思議なコマンドの書き方を見つけて、実行してみて発見。

$ mkdir foo/;cd foo/
コマンドの間にセミコロンを入れることで可能になる。

2010年1月23日土曜日

ChromeOS ZEROをUSBメモリにインストールする。

本家サイトのトップページ
参考ページ

本家サイトのUSB Imageの1,2,3のどれかからファイルをダウンロード。

そのファイルを解凍。

インストールはubuntuであれば
$ sudo apt-get install usb-imagewriter
$ imagewriter
でGUIで簡単に作成できる。

コマンドでは
$ sudo dd if=ChromeOS-Zero.img of=/dev/sdb bs=4M
でできるらしい。してないからわからないけど。

使ってみての感想
  • Inspiron mini9では有線LANは認識したが無線LANは認識しなかった
  • 起動は20秒くらい
  • オフラインでのログインはユーザー名:facepunch, password: facepunch
  • Ctrl + Alt + Tでターミナルを起動できる
  • ターミナルの使用感はubuntuにかなり近い。コマンドやディレクトリ構造などなど
  • CRUDもターミナルからなら可能。ただしviの使い方分からないと厳しい。
  • シャットダウンは $ shutdown -h nowでできる
  • 日本語化は窓の杜を参考にすると簡単にできる
  • 場所は忘れたが、chromeos-installというファイルを不用意に実行するとsdaにchrome os zeroがインストールされてえらいことになる。
  • flash playerは入っているが、youtubeはなぜか見れなかった。

2010年1月22日金曜日

ubuntuでwmapの動画を見る

参考ページ

流れは
  1. mplayerのインストール
  2. サイトからall-20061022.tar.bz2をダウンロード
  3. 解凍
  4. 出来たフォルダをcodecsにリネーム
  5. それを/usr/libに移動
  6. sudo ln -s /usr/lib/codecs /usr/lib/win32 とコマンド打ってリンクを貼る

大体こんな感じで動くようになるかな?
#!/bin/bash

apt-get install gnome-mplayer

wget http://www.mplayerhq.hu/MPlayer/releases/codecs/all-20071007.tar.bz2 -P ~/Downloads

tar xvjf ~/Downloads/all-20071007.tar.bz2 -C ~/Downloads

mv ~/Downloads/all-20071007 ~/Downloads/codecs

mv ~/Downloads/codecs /usr/lib

ln -s /usr/lib/codecs /usr/lib/win32

2010年1月13日水曜日

UbuntuをPPPOE接続からルータでの接続に移行する

インターネットに接続できなくなった。

インターネットで調べてみてもルータは大体ほっといても認識するということなので色々調べてみた。

参考ページ

これによるとインターネット接続に関する情報は/etc/network/interfacesにあるらしい。ホームフォルダにbackupフォルダを作成しそこにinterfacesを移動する。
$ mkdir backup
$ sudo mv /etc/network/interfaces backup/
再起動。

インターネットにつながるようになった。

深くは分からないが、PPPOEの設定がルータでの接続を邪魔していたのかもしれない。