Saturday, November 30, 2013

C++11のためにGCCの最新版をインストールする

 
 最近The C++ Programming Language (4th Edition)を読んでいます.
これは最新のC++11に準拠した権威ある(分厚い)解説書です.
C++はちょとたしなむ程度でしたが,これを気に真面目に勉強してみようと思います.

 勉強のためにUbuntu上でC++11の開発を行えるよう環境設定をしましたので,その工程をまとめておきます.
想定している環境は以下のようになります.

OS
Ubuntu 12.04 LTS 32bit

GCC
4.8.1

参考にしたサイト
UbuntuHandbook


1.GCCとG++のバージョン確認


まずは現在の自分の環境を確認します.
・現在のGCCとG++のバージョンを確認します.
$ gcc --version
$ g++ --version 
 
私の環境では,以下のようになりました.
gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3
g++ (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3

バージョンごとのC++11に対するサポートは以下のサイトをごらんください.
C++0x/C++11 Support in GCC

今回は4.8をインストールします.

2. GCCとG++のインストール


 update-alternativesを使用して元のGCCと最新のGCCを共存させます.

・Personal Package Archive(PPA)の追加します.
$ sudo add-apt-repository ppa:ubuntu-toolchain-r/test

・GCC 4.8とG++ 4.8をインストールします.
$ sudo apt-get update; sudo apt-get install gcc-4.8 g++-4.8

・GCC 4.8とG++ 4.8をupdate-alternativesに優先度20で登録します.
$ sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 20
$ sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.8 20 

・元のGCC(4.X)をupdate-alternativesに優先度10で登録します.
ここでXは自分の環境に合わせて変更してください.
$ sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.X 10
$ sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.X 10
・GCC 4.8とG++4.8が使用できるか確認します.
$ gcc --version
$ g++ --version

GCC4.8系列が表示されれば成功です.
gcc (Ubuntu 4.8.1-2ubuntu1~12.04) 4.8.1
g++ (Ubuntu 4.8.1-2ubuntu1~12.04) 4.8.1


3. 元のGCCにバージョンを戻す方法


 元のGCC/G++のバージョンに戻す方法を説明します.
これは,2章でGCC 4.8がバージョンに表示されない場合にも有効です.

・configから使用するGCCを選択し,変更する.

$ sudo update-alternatives --config gcc
$ sudo update-alternatives --config g++

selectionの番号を入力しEnterキーを押せば,使用するGCCを変更できます.


GCCのConfig





 
G++のConfig











4. サンプルを作成する


 開発環境が無事に準備できたか確認するために,適当なコードをコンパイルしてみましょう.

・test.cppを作成します.
適当なエディタ(emacsやgeditなど)で以下のコードを入力してください.

#include <iostream> 
#include <vector> 

int main() 
{
     int array[] {1, 2, 3, 4, 5};
     std::vector vec;

     for (int& i : array)
     {
         vec.push_back(i);
     }

     for (auto itr = vec.begin(); itr != vec.end(); ++itr)
     {
         std::cout << *itr << std::endl;
     }

     return 0;
}

・test.cppをコンパイルします.

$ g++ -std=c++11 test.cpp -o test

もし,G++4.6以下を使用しているのであれば,以下のコマンドでコンパイルしてください.

$ g++ -std=c++0x test.cpp -o test

無事にコンパイルでき,以下のようにコンソールに表示されれば成功です.

test.cppの実行結果







以上で,C++11の開発環境の設定は終わりとなります.

Sunday, November 3, 2013

Maker Faire Tokyo 2013

 Maker Faire Tokyo 2013に行ってきました。
Makeに行くのは久しぶりなのですが、今回も非常に楽しかったです。

色々楽しい作品が多かったのですが、気になったものをいくつか紹介します。

BreadBoardManiac


 ここでしか見たことない、フレキシブルなブレッドボード。
カッターで切って好きな大きさにして使えるらしい。

 貫通型の非常に薄いブレッドボードはおしゃれだけど、どう使うのか悩みどころです。
多層の基板を構築することができるようですが、やったことないのでいまいちピンときません。
今後販売するようなので、ぜひ手にとって確かめてみたいです。


フレキシブルブレッドボード







貫通型ブレッドボード




















kadecot


 Web API付きのAndroidセンササーバ。
ECHONET Lite対応の家電を操作することができるらしい。

 OpenECHOというJavaで書かれたECHONET Lite用のドライバライブラリをいじって、自分でECHONET Lite対応の機器を作ることもできるとのこと。

 デモがマニアックだな―と思ったらSONYの研究所がやっている萌家電でしたよ。
写真のデモは空気中のエネルギーを集めて、美少女キャラが電気をつけてくれるというもの。


kadecot



















スマポン


 Android端末にガジェットを差し込むと、スクリプトを自動で流してくれるフレームワーク。
ガジェット内のスクリプトで色々なことを実現するので、スクリプト解釈用のアプリ以外は余計なアプリを入れなくて良いらしい。
らくらくホン使っている人や、鍵ガジェットがないとアクセスできないファイルをつくるなど、セキュリティーに使いたいそうです。

 SL4Aで実装しているとのことですので自作のガジェットを作れそうです。

スマポン













凸P


 レゴを画面に差し込むと、ゲーム内の挙動が変わるという拡張現実的なゲーム。
インタラクティブなプロジェクションマッピングといった感じ。

 自動で動くマリオを、プレイヤーがブロックを動かして操作し遊ぶことができます。
ゲーム自体のクオリティーが高く見ていて楽しかったです。

 赤外線LEDをブロックに照射して赤外線カメラでブロックを見ているそうです。


凸P



















DotFab

ドット絵を3Dモデルに変換してくれる3Dモデラーです。
3次元モデルを作れない人でも楽しくモデルが作れるかも?
ピクセルの色の明るさに応じて、3次元モデルの高さが決まるそうです。
完全に余談だけど多分この人はまどか☆マギカのファンです。

DotFabで作成したモデル













アニキと愉快な仲間たち


 マイクロマウス競技会の一部門である、ロボトレース競技向けのロボットを展示していました。
実はこのチーム名のアニキとはサークルでお世話になった大先輩です。

 下の写真はここの人が作ったロボットMETEORAです。
この方もサークルの先輩です。
このトレーサーはラインセンサを円周上に無数に配置することで、スキャナのように使用できます。
独特な円形状が非常にイカしています。


METEORA













METEORAの裏側


















 Maker Faire Tokyo 2013は非常に楽しめました。
いつかは自分も参加してみたいものです。



Saturday, November 2, 2013

pytextcheck

 お久しぶりです。
最近はブログではなく、別のWebページを作成に勤しんでいました。
私の記事を待ってくれている人がいたら、すみませんでした。

今回はpytextcheckというPythonから使用できるテキストチェッカーを作ったので紹介します。

このモジュールはテキスト形式の文書の中身を検索して、特定の語句を検出します。

Texで論文を書くために作成しました。

論文のように公開する文書内の語句には、いくつか規定があります。
例えば、ある学会では「行う」は「おこなう」、「。」は「.」と表記するといった決まりがあります。
文書を書いたあとに、1つずつ検索して禁止語句が含まれていないか探すのは大変面倒でした。
この前書いた論文では 208個も使用してはいけない漢字があり、とても検索する気が起きませんでした。
そこで、 今回紹介する、pytextcheckを書きました。
使い方は簡単で、以下のようにたった3行のコードで使用できます。

import pytextcheck
t = Text()
t.check_text('test.tex', 'basic.txt', 'sice.txt')

ダウンロードと詳しい説明はここからお願いします。
サンプルではtest.tex内で、basic.txtとsice.txtに記述された語句を使用されているか調べます。
もし使用されていらば、該当する語句とそれが含まれる行番号を表示してくれます。
現状では、あまり文書のコンテキストを読む機能はありませんので、漢字があれば拾ってしまいます。
例えば、「~の時」は「~のとき」と表記しなけらばならないとします。
そこで、禁止語句リストに「時」を入れると、「時間」「時計」なども検出するということです。
回避方法をいくつか思いつきましたが、用途的には余計なことをしてfalse negative(偽陰性)を発生させるよりは、
false positive(偽陽性)は許容するということにしました。
このあたりの問題は、もう少し色々な人に使ってもらって検討したいと思います。

 余談ですが、このモジュールを作成するにあたり、文字コードと改行コードには苦労しました。
改行コードは各OSで以下のようになっています。
・Windows
\r\n
・Mac (9以下)
\r
・Unix
\n

このようにOSによってコードが違うので、読み込んだ文字列から改行コードを削除しています。
また、Pythonで扱いやすいよう、Unicode形式に変換して検索を行っています。
今回で文字列を扱うときの注意点がなんとなくわかってきたのは、収穫でした。


次回もへばらない程度に、気を抜きながら何か記事にしたいと思います。
気長にお待ちください。