にわとりプログラマーの備忘録

覚えたことをすぐ忘れてしまう、自分のための備忘録ブログです。

Eclipse4.2 error Unable to execute dex: GC overhead limit exceeded GC overhead limit exceeded

Eclipse4.2でandroidのアプリを実行しようとした際に、以下のエラーが発生しました.
「Unable to execute dex: GC overhead limit exceeded GC overhead limit exceeded」

f:id:t-yng:20150531163010p:plain

【原因】
Eclipseのメモリ使用量が限界を超えたときに発生するエラー(だと思います)

【解決策】
eclipse.ini」を開いて以下の部分を変更し、Eclipseのメモリ使用量を増やします。

変更前

--launcher.XXMaxPermSize
256m
(中略)
-Xms40m
-Xmx512m

変更後

--launcher.XXMaxPermSize
1024m
(中略)
-Xms512m
-Xmx1024m

ubuntuでログイン時にシェルスクリプトを自動実行

参考
ログイン時にシェルスクリプトを自動実行する - ubuntu日記

とりあえず、次の二つの方法を試してみました。

1. ~/.bashrcに実行したいスクリプトを追記

ターミナル起動時に自動実行される

2. 「/etc/profile.d/」以下に実行したいスクリプトファイル(*.sh)を配置

ログイン時に自動実行される

Ubuntu14.04のマウスポインタの速度を変更する

現在使っているノートパソコンにUbuntu14.04をインストールしました!

デフォルトのマウスポインタの速度が速かったので、遅くしようと思ったのですが、
既に最低速度に設定されていました... ∑( ̄Д ̄;)!!

f:id:t-yng:20150524231823p:plain

諦めていたのですが「ターミナルから細かく設定できる」方法があったので、
そちらの方法でマウスポインタの速度を設定しました。

最初にデバイス名 or デバイスIDを確認するために以下のコマンドを実行

$ xinput

実行結果

⎡ Virtual core pointer                          id=2	[master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer              	id=4	[slave  pointer  (2)]
⎜   ↳ SynPS/2 Synaptics TouchPad              	id=10	[slave  pointer  (2)]
⎣ Virtual core keyboard                   	id=3	[master keyboard (2)]
    ↳ Virtual core XTEST keyboard             	id=5	[slave  keyboard (3)]
    ↳ Power Button                            	id=6	[slave  keyboard (3)]
    ↳ Video Bus                               	id=7	[slave  keyboard (3)]
    ↳ Power Button                            	id=8	[slave  keyboard (3)]
    ↳ AT Translated Set 2 keyboard            	id=9	[slave  keyboard (3)]
    ↳ Panasonic Laptop Support                	id=11	[slave  keyboard (3)]

タッチパッドの設定を変更したいので、上記の"SynPS/2 Synaptics TouchPad"の設定を変更する。

以下のコマンドを打つことで、速度を調整する。

タッチパッドのポインタ速度を調整

$ xinput --set-prop "SynPS/2 Synaptics TouchPad" "Device Accel Constant Deceleration" 5

速度設定は1~10の範囲で設定可能であり、値が大きいほど速度は遅くなる。

デバイスの指定はデバイスIDでも可能らしいのですが、デバイスIDは変更される可能性があるのでデバイス名で指定した方がいいみたいです。

とりあえず、色々操作を覚えつつEmacsを触っていこうかなと思っています。

一台のパソコンに複数のMACアドレス

MACアドレスについて勘違いしてたので、そのことについてまとめておきます。

自分は「MACアドレスはパソコン本体そのモノに付与されている」のだと思っていました! しかし、実際は少し違っていたみたいです。

MACアドレス

MACアドレスとは、ネットワーク機器(パソコンやタブレットなど)のLANアダプタに割り当てられた唯一固有の番号です。

有線LANアダプタと無線LANアダプタの両方がある場合は、それぞれに異なるMACアドレスが割り当てられますので、有線接続する場合と無線接続する場合で、パソコンのMACアドレスが異なるということになります。(この認識で正しいのかな?)

MACアドレスは必ず一台のパソコンに一つだと思っていたのですが、一台に複数MACアドレスが存在することもあるんですね。

ビルドとコンパイルの違い

友達の話を聞いていて、ビルドとコンパイルの違いがよく分からなかったので調べてみた.

詳しくは以下の記事を参照しました.itpro.nikkeibp.co.jp

コンパイル

ソースコードC言語などの高級言語で記述されたファイル)からオブジェクトファイル(マシン語)に変換する作業

本来C言語等のプログラミング言語は人が理解できるように記述された言語であり、機械はマシン語しか理解することができない.そのため機械が理解できるようにプログラミング言語マシン語に翻訳してあげる作業がコンパイルである.

リンク

オブジェクトファイルの参照関係を結びつける.「ライブラリ」から関数を呼び出すためのファイルと結びつける.

例えば以下の「Hello world!」を出力するコードでは、printf関数は別のファイルに定義されている.このprintf関数が定義されている外部ファイルと下記のソースファイルを結びつける(リンクする)ことで、関数を利用できるようになる.このように複数のファイルを結びつける作業がリンクである.

#include <stdio.h>
 
int main(void)
{
    printf("Hello world!");
    return 0;
}

ビルド

コンパイルやリンクを一度に実行し、実行ファイルを作成すること(IDEなどが出てきたことで、生まれた言葉)

結論

つまりコンパイル∈ビルド であり、コンパイルやリンクなどの作業を一連の流れとしてまとめた、一つの作業がビルドということである.

IDEは便利だけど、それ故に仕組みをちゃんと理解できていない人になってしまう可能性もあるのでそこら辺はしっかりと自分で勉強する癖を付けていきたいです!

C#のSocketIO4Net.Clientで"Error initializing handshake with"が発生したときの解決策

C#のwebsocketのsocketIOクライントのライブラリを使っていた際に、
node.jsで実装したサーバーに接続を試みた際、「Error initializing handshake with "http://localhost:3000"」が発生したので、その解決策をまとめておきます。

クライント側のソースコード

using SocketIOClient;
    public partial class Display : Form
    {
        SocketIOClient.Client websocket;

        public Display()
        {
            InitializeComponent();
            connect();
        }

        private void connect()
        {
            /* インスタンス生成 */
            websocket = new Client("http://localhost:3000");

            /* サーバとの接続が確定 */
            websocket.On("connect", (fn) =>
            {
                NotifyUpdateState(INROOM);
                Console.WriteLine("connect");
            });
             
            /* サーバに接続 */
            websocket.Connect();
        }
   }


サーバー側のソースコード

var express = require('express');
var mysql = require('mysql');
var http =require('http');
var app = express();

console.log('server running');

/* port:3000で待機 */
var server = http.createServer(app);
server.listen(3000, function(){
	console.log("server listening on port 3000");
});

/* socket.IOのインスタンス生成 */
var socketIO = require('socket.io');

/* クライアントの接続を待機(IPアドレスとポート番号を結び付ける) */
var io = socketIO.listen(server);

/* クライアントが接続してきたときの処理 */
io.sockets.on('connection', function(socket){
	console.log("connection");

	/* クライアントが切断したときの処理 */
	socket.on('disconnect', function(){
		console.log('disconnect');
	});
})

}

次のページに原因が書いてありました。
sockets - SocketIO4Net Handshake Error - Stack Overflow

要はnode.js側のsocket.ioのバージョン1.0.X以上では0.9.Xとはハンドシェークの手法?(プロトコル?)が異なるので、通信が確立できないらしいです。

node.jsのsocket.ioのバージョンを0.9.17にして実行したところ無事通信できました。

因みに、npmでバージョンを指定してインストールする場合は以下のようにパッケージ名の後ろに@[バージョン]で指定すれば大丈夫だそうです。

npmでバージョンを指定してパッケージをインストール

npm install socket.io@0.9.17


通信の仕組みとか全く勉強不足で分かっていないので、そこら辺も勉強していかないといけないなと感じました。
クライアント側のライブラリを変更した方がいいのかな...

顔認識API「ReKognition」を触ってみた

最近、MicroSoftの年齢推定のWebサイト『How-Old.net』が話題になっています。
そこで顔認識のWebAPI『ReKognition』を使って、似たようなモノを簡易的に作ってみようと思い、APIのサンプルを動かしてみました。


直接画像をアップロードする場合(curlを使ってファイルをアップロード)

<?php
$ch = curl_init();
$path = '@C:/xampp/htdocs/example/dataset/test.jpg'; // Windows環境でローカルファイルを指定
$data = array('api_key' => '取得したAPI Key',
			  'api_secret' => '取得したAPI secret',
			  'jobs' => 'face_part_aggressive',
			  'uploaded_file' => $path
		     );

curl_setopt($ch, CURLOPT_URL, 'http://rekognition.com/func/api/');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
if(curl_exec($ch) == false){
	echo curl_error($ch);  // 実行失敗時にエラー内容を表示
}
curl_close($ch);

?>


パラメータで画像のURLを指定
(送られたURLを使って、「ReKognition」のサーバ側で画像を取得)

<?php
require_once('HttpClient.class.php');

$data = array('api_key' => '取得したAPI Key',
			  'api_secret' => '取得したAPI secret',
			  'jobs' => 'face_part_aggressive',
			  'urls' => 'http://localhost/example/dataset/test.jpg',   // 認識対象の画像URL
		     );

$fate_detection = new HttpClient('rekognition.com');
$fate_detection->setDebug(true);
$response = $fate_detection->get("/func/api/", $data);    // リクエストを送信して、レスポンス(JSON)を取得

echo $fate_detection->getContent();

?>


実行結果

{"url":"POST","face_detection":[{"boundingbox":{"tl":{"x":971.88,"y":441},"size":{"width":317.4,"height":317.4}},"confidence":1,"eye_left":{"x":1061.8,"y":565.1},"eye_right":{"x":1183.1,"y":560.8},"nose":{"x":1117.8,"y":626},"mouth l":{"x":1087.3,"y":681.6},"mouth_l":{"x":1087.3,"y":681.6},"mouth r":{"x":1179.5,"y":677.7},"mouth_r":{"x":1179.5,"y":677.7},"pose":{"roll":-2.15,"yaw":-16.55,"pitch":-2.73},"quality":{"brn":0.41,"shn":0.3}}],"ori_img_size":{"width":2528,"height":1856},"usage":{"quota":19963,"status":"Succeed.","api_id":"9WCxtBtyqwdx7DPd"}}


公式のサンプルをコピペして実行しただけですが、Windows環境でのcurlのファイルパスの指定方法がよく分からず「Couldn't open file 'xxx'」が出て苦労しました。
(結果そのまんまだったわけですが...)

WebAPIなのでJavaScriptからAjaxでリクエストを投げて、同様の処理ができると思うので次はJavaScriptで書いてみた後、How-Old.netの簡易版を作ってみようと思います。