2012年7月23日月曜日

mac上でvirtualboxが起動きでなくなった時の対処

普段Macでvirtualboxを動かしfedoraを触ってるのですが、突然起動できなくなったので、対処法をメモ。
  今回でたエラーはこれ。

そこでいろいろ調べてみるとここにたどり着きました。 つまりvirtualboxを再インストールしてPCを再起動すれば治るとのこと。 ※アンイストールは必要ないです。 とりあえずやってみると、無事起動できました。 データも全部残っていました。 原因はよくわからないですが、ちょいちょいあるみたいです。。 そろそろ新しいVM試そうかな。。

2012年7月18日水曜日

ファイルアップロードのエラー

phpでのファイルアップロードで少しハマったのでメモ。

<input type=file>でファイルをアップするときのエラーの見方です。

http://d.hatena.ne.jp/pekeq/20100924/p1

ここに全部あります。

2012年7月10日火曜日

【C言語】システムコール関数でファイル入出力(1)

イトウです。

 今回も最近勉強中のC言語に関するエントリです。
※まだ勉強中のため記述に誤りがある可能性があります。 

・システムコールとは
OSのカーネルの機能を呼び出す機構のこと。
open()やclose()などがそれにあたる。

 ・高水準関数と低水準関数

【高水準関数】
・一般によく使われるファイル入出力関数など
・関数内にバッファ機能を保持している
・フォーマットを指定したり、高度な出力ができる
・printf, fopenなど

【低水準関数】
・低水準関数 ・バイト数単位で制御される
・入出力が即時に反映される
・ファイルディスクリプタという重要な概念がある
・open, read, write, closeなど

【参考URL】


低水準入出力関数
高水準関数と低水準関数の違いに詳しい


紫月庵-C言語-9.ファイル入出力
全体像、ファイルディスクリプタについてはこちら



高水準関数、低水準関数という呼び方も今回はじめて知りました。
実際のシステムコールの使い方については次回のエントリで書きたいと思います。



位置情報を使ったAndroidアプリを作る際の参考メモ

イトウです。

Google Mapを用いたAndroidアプリを作る際、参考にしたサイト&エラーについてメモしておきます。


色々サイトを見ましたが、簡単なものを作る場合は以下の2サイトでOK。

位置情報を取得するには/GPSを使用するには - 逆引きAndroid入門



位置情報サービスチュートリアル




マップの調整(ズームの縮尺など)は以下のサイトで。

MapViewクラス - Android入門




不明な点は公式リファレンスで。英語ですが。

Pgoogle.maps 公式リファレンス
マップの公式リファレンス


Package Index | Android Developers
Androidの公式リファレンス




おまけ

Android SDK をAptana Studioに導入する方法。

Android開発ツールの準備 - jsWaffle

Aptana Studio3にAndroid ADTプラグインをインストールするまでの手順

View more PowerPoint from kujirahand kujira



以上、最近Android開発を初めて右も左も分からないイトウの参考サイトまとめでした。

2012年7月9日月曜日

【C言語】strcat関数を自作してみた。【第二弾】

蝉がミンミンとうるさく鳴く、そんな夏がやってきました。イトウです。

【C言語】strlen関数を自作してみた。

前回の記事と同じく、ライブラリ関数自作してみようシリーズです。
今回は文字列連結のstrcatを自作してみました。


 自作のmy_strcat関数(my_strcat)
#include<stdio.h>

// str1の後ろにstr2を連結する
char * my_strcat(char* str1, const char* str2){
    char *top;

    // (1) 返り値用に先頭アドレスを保持しておく
    top=str1;

    // (2) str1のポインタを最後まで進める
    while(*str1++ != '¥0');    
    *str1--;

    // (3)str1の背後から、str2の文字をコピーしていく
    while( (*str1++ = *str2++) != '¥0');

    return top;
}


main関数
#include<stdio.h>

int main(void){
     // (4)ポインタで定義して渡すとエラー
     // char *str1 = "Tokyo";
     // char *str2 = "Japan";

     // 配列で定義して渡せばOK
     char str1[] = "Tokyo";
     char str2[] = "Japan";    

     my_strcat(str1, str2);
     printf("%s¥n", str1);

     return 1;
}



では、コードについて少しだけ説明を補足します。



(1)返り値用に先頭アドレスを保持しておく

strcat関数の中でポインタ情報を変更するので、別の変数を作って先頭アドレスを保持しておく必要がある。もし普通通りに return str1; としてしまうと、ポインタを進めた先頭アドレス(=つまりstr1の先頭アドレスとは違う値)が帰ってしまう。


(2) str1のポインタを最後まで進める

文字列の最後には'¥0'が入っています。str != '¥0' が成立するまでwhile文を回すことで、str1の最後の終端文字(¥0)までポインタを進めることができます。そしてその後の*str1-- により、終端文字の位置にポインタを戻している。次の段階では、この位置からstr2の文字をコピーしていくことになる。


(3)str1の背後から、str2の文字をコピーしていく

一文字ずつ、str2の文字をstr1にコピーしていく。終端文字までコピーが完了したら、ループを終了する。


(4)ポインタで定義して渡すとエラー

my_strcat関数に文字列を渡す際、ポインタを渡すとエラーが発生する。この原因は不明だが、メモリ領域に関係するものではないかと考えられる。
つまり、*str1, *str2と続け様に定義すると、メモリ領域の連続した部分が使用される。my_strcat関数内で、str2はconst(定数、つまり代入しちゃダメ)で定義されているので、str1のメモリ領域にズカズカ文字をつっこんでいくとstr2の領域に被さり、そこはconstだからSegmentation Fault!みたいなノリじゃないかなと。推測ですが。

本家のstrcat関数でも同様のエラーが発生することから、配列で文字列を定義して渡すのが賢いと思われます。






ポインタの扱いは難しいですね。。CはJavaなんかと違ってエラーメッセージがあまり詳細じゃないので苦労しますね。しかし、ライブラリ関数を自作するのは勉強になって良いですね。



【C言語】strlen関数を自作してみた。【第一弾】

梅雨も明け、蒸し暑い夏がやってきました。イトウです。

C言語の文字列、ポインタについて学ぶために、文字列の長さを返すstrlen関数を自作してみました。 実際にライブラリにあるstrlen関数と同じふるまいをします。


 自作のmy_strlen関数(my_strlen)
#include<stdio.h>

unsigned int my_strlen(const char* str){
    unsigned int length = 0; // (1)文字列の長さを入れる箱

   // (2)文字列の長さを数える
    while(*str++ != '¥0'){
        length++;
    }
    return length;
}


main関数
#include<stdio.h>

int main(void){
    char str[] = "Tokyo";

    printf("%d¥n", my_strlen(str) );
   return 0;
}



これだけなんですが、少しだけ勉強したことを補足します。



(1)文字列の長さを入れる箱

なぜintでなくてunsigned intなのか?
それは、取れる値の幅が関係してきます。値の取れる範囲は、
int -32768~32767
unsigned int 0~65535

です。
つまり、今計算したいのは「文字数」なので、マイナスになることはない。
なのでここで適切なのはunsigned intだということです。


(2)文字列の長さを数える

文字列の最後には'¥0'が入っています。なので、str != '¥0' が成り立つまでループを繰り返すことで、文字列の最後まで確認することができます。
また、引数はcharのポインタ型なので、*str++ とすることで、次の文字を見にいくことができます。




C言語で最初に直面する壁は文字列とポインタかと思います。大変ですが重要な基礎の部分なので、色々試してしっかり理解していきたいと思います。



2012年7月3日火曜日

offline access tokenがなくなるのでいろいろまとめ

開発者がFacebookのデータを使いたいときやっかいなのが
認証で使うアクセストークン。

2012年の5月まではoffline access tokenという最強(最恐)のトークンがあったのですが、いろいろあってなくなっちゃいました。

offline access tokenなくすからちゃんとしたの使ってよーってことが
ここに書かれてます。

このページの冒頭に

 Instead please check the Deprecation of Offline Access Permission document which explains how to start using access tokens that are valid for up to 60 days.

なくす代わりに60日くらい有効なやつあるからそっち使ってね!
って書いてます。

今回アクセストークンと呼んでるものは三種類あるアクセストークンのうちuser access token に該当する記載だと思われます。
ここに載ってないアクセストークンでもう一個app access token というやつがありますが、これは基本的に無限の寿命を持ってるっぽいので。。
ただできることは限られてます。
参考:http://wktcoder.blogspot.jp/2012/06/facebook.html


基本的にこのページをある程度日本語でまとめてます。
間違ってたら教えてくださいw


offline access token はやめますよー
アクセストークンはいろんなもんソーシャルにできたりするので使ってね。
offline access tokenやめる代わりに有効期限長いアクセストークン使えるようにしたよ!
基本的にはアプリに来た時に新しくアクセストークン発行するよ!(下に例外もあり)

・寿命短いアクセストークンの寿命伸ばせますよー
通常のアクセストークンの有効期限は1~2時間です。
寿命伸ばすオプションあるのでそれ使えば60日になるよ!
このオプションは一日に何回やったも最初の一回だけが有効だよ!

例外が3つ
例外1 デスクトップアプリ
デスクトップアプリの場合はFacebookにログインした状態で一回認証すれば寿命長いアクセストークンあげるよ

例外2 古いSDK使ったネイティブモバイルアプリ(iOS、android)
寿命長いアクセストークン取れる新しいSDK出したからそっち見てね。
古いの使ってると定期的に認証いるよ。

例外3 新しいSDK使ったネイティブモバイルアプリ(iOS、android)
新しいSDKだとユーザがログインする度に新しい寿命長いアクセストークン取ってるから基本的に気にしないでいいよ。



ここから新しい設定への移行のためのシナリオ5つ
このページにある設定にしとけば、過去にoffline access token取得してる場合はユーザにダイアログ出さずにいけるよ。

シナリオ1 過去にoffline access token 要求してないアプリの場合
基本的には何も変わりません。
もし、クライアント側でアクセストークン取得してた場合は

https://graph.facebook.com/oauth/access_token?             
    client_id=APP_ID&
    client_secret=APP_SECRET&
    grant_type=fb_exchange_token&
    fb_exchange_token=EXISTING_ACCESS_TOKEN 

ってやつ使えば簡単に寿命延長できるのでやった方がいいかもよ!

シナリオ2 過去にoffline access token 要求してたアプリの場合
過去に要求して取得してる場合は基本的にはそのまま使えます。
ただ、新しいユーザーに関しては要求しても帰ってくるのは寿命短いやつなので気をつけてね!

offline access token を完全に廃止する頃になると自動的に60日の寿命にしちゃうので気をつけてね!詳しくはロードマップで。

シナリオ3 サーバーサイドの開発者の方へ
サーバーサイドのAouthで認証したアクセストークンはデフォルトで寿命長いアクセストークンです。

cronなどで自動的に寿命を延長することはできません。
Aouth認証には有効な"authorization code"が必要でその寿命は1~2時間であり、それを得るにはログインしてるユーザが必要だよ!

シナリオ4 クライアントサイドで寿命伸ばしたい方へ

https://graph.facebook.com/oauth/access_token?             
    client_id=APP_ID&
    client_secret=APP_SECRET&
    grant_type=fb_exchange_token&
    fb_exchange_token=EXISTING_ACCESS_TOKEN 

クライアントサイドでやる場合は基本的にこれやれば大丈夫です。
寿命長いアクセストークンかえってきます。

シナリオ5 ページアクセストークン
ページアクセストークンはgraph apiで[User ID]/accountsみたいなクエリでとれます。
このときのユーザーアクセストークンが寿命短いアクセストークンであれば取れるページアクセストークンも寿命短いバージョン。
寿命長いユーザーアクセストークンでリクエストして取ればページアクセストークンも寿命長いバージョンが取れます。


以上がページのまとめです。

いろいろやってみた感じシナリオ3のサーバーサイドでデフォルト寿命長いってのはたまに違ったことがあったので、

https://graph.facebook.com/oauth/access_token?             
    client_id=APP_ID&
    client_secret=APP_SECRET&
    grant_type=fb_exchange_token&
    fb_exchange_token=EXISTING_ACCESS_TOKEN 

やる必要があることがありました。
まだ移行期間だからかな。。

間違ってるとことかあったらご指摘おねがいしまーす!