カテゴリー
未分類

Vaio Type Yを購入

11.6インチサイズの安価なモバイルノートを開発用に探していたところAtomやAMD E450など、性能の十分なものが見つからなかった。

そんな時、ビックカメラに行ったらVaioのキャンペーンをやっていてついVaio Type Yを購入してしまった。

キャンペーンでは

Docomo加入で5,2500円値引き
Sony Store登録で3,000円値引き

というもので、最大55,500円の値引きとなる。

VAIOオーナーメイドモデルで構成を最低まで下げると3.8万ほどでIntel Celeron U3600のものが購入できる。

基本スペックは

CPU : Intel Celeron U3600
Memory : 2G*1
HDD : 320GByte 5400rpm
バッテリー: 標準 約6時間稼動

今回はカスタマイズで

CPU : Intel Core i5 470UM
バッテリー : Lバッテリー 約11時間稼動
保障 : 3年ワイド

にした。

この段階での価格は58,800円。

後に

SSD : Crucial M4 128G 12,980円
Memory : UMAX DDR3 8GByte(4GByte*2) 3,270円

を購入。

これキャンペーンの割引なしでは合計70,050円。

ちなみにSSDとMemoryをオーナーメイドで上記等同等にカスタマイズすると合計は124,800円。

70,050円からキャンペーンで55,500円を引くと14,550円。

Docomoは2年間縛り必須だったので基本料金の月1,000*24円+契約手数料3,000円=27,000円。

本体代とDocomoの料金の合計は41,550円。

11.6インチでこの価格でこの性能なら結構良いかな。

 

ベンチマーク等々は以下

 

cpu-zcpu-z_memory

windows experience index

crystaldiskmark

crystalmark

カテゴリー
未分類

ニコニコ動画埋め込みプレイヤー用ライブラリ

実はニコニコ動画の埋め込みプレイヤーも実はJavaScriptから操作できる。

という訳で今回は埋め込みプレイヤーをより簡単に使えるようにするためのライブラリを作った。

リピート機能やイベントリスナーのセットをサポートしている。

 

詳細はこちら http://axe1lyze-lab.appspot.com/nicovideo/#lib_externalplayer

カテゴリー
未分類

JavaでByte[]とObject(Serializable)を相互変換

意外と使うことが多いのでメモ程度にライブラリを作った。

public final class ByteArray {
    static byte[] fromObject(Object o) throws IOException{
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        ObjectOutput out = new ObjectOutputStream(bos);
        out.writeObject(o);
        byte[] bytes = bos.toByteArray();
        out.close();
        bos.close();
        return bytes;
    }
    static Object toObject(byte[] bytes) throws OptionalDataException, StreamCorruptedException, ClassNotFoundException, IOException{
        return new ObjectInputStream(new ByteArrayInputStream(bytes)).readObject();
    }
}

現在Androidの開発をやっているのですが、AIDLで通信するときにプリミティブ型(byte,int,String,and so on)のデータしか送れない。

本来ならParcelableを使わないといけないらしいのですが、そんなもの守る気はありません←

というわけで上のメソッドを使えば簡単にSerializableを実装しているObjectとByteを相互変換できます。

カテゴリー
未分類

AndroidでSSLSocketを使う

なんか、いろいろ難しい。

HttpsURLConnectionでKeep-Alive?

そんなことするならSSLSocket使って自分で処理します。

 

というわけで今回はAndroidでSSLSocketを使う方法。

javax.net.SocketFactory;
javax.net.ssl.SSLSocketFactory;

とりあえずこいつらを使います。

Socket s = SSLSocketFactory.getDefault().createSocket(host,port);//portは基本443で。

これでおk。はい、めでたしめでたし。

 

そしておまけ。

AndroidでBASE64エンコードするのは

android.util.Base64;

こいつをインポートして、

Base64.encodeToString(“文字”.getBytes(), Base64.DEFAULT);

これでおk。

カテゴリー
未分類

AndroidでTwitterのOAuth認証

どこのページに行ってもOAuthの事に関していろいろ書いてあるけど率直で使いやすいものがあまりみつからない。(俺の頭が悪いだけ)

というわけで今回はAndroidでTwitterのOAuth認証を簡単にできるActivityを作った。

このActivityに飛ばしてあげるだけでOK。

ここではTwitter4j 2.1.8を使っています。

getOAuthRequestTokenメソッドにコールバックを指定するとなぜかエラーで落ちてしまうので、それを回避するように作ってます。

 

onAuthorizedメソッドの引数にAccessTokenとAccessTokenSecretが飛んできますのでご自由にお使いください。

 

以下ソースコード

import android.app.Activity;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.os.*;
import android.view.*;
import android.view.View.OnClickListener;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.*;
import twitter4j.*;
import twitter4j.http.*;

public void onAuthorized(String accessToken,String accessTokenSecret){
    //認証後後にやりたいことをここに書く。
    finish();
}

public class TwitterOAuth extends Activity{
    private Display display;
    private Handler handler = new Handler();
    private LinearLayout base,form;
    private EditText verifier;
    private WebView wb;
    private Twitter twitter;
    private AccessToken accToken;
    private RequestToken reqToken;
    private final String CONSUMER_KEY = “xxxxxxxxxxxxxxxxx”; // Consumer key をセット
    private final String CONSUMER_SECRET = “yyyyyyyyyyyyyyyyyyy”; // Consumer secret をセット
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        SharedPreferences pref = getPreferences(MODE_PRIVATE);
        if(pref.getString(“AccessToken”,””).equals(“”)||pref.getString(“AccessTokenSecret”,””).equals(“”)){
            display = ((WindowManager)getSystemService(this.WINDOW_SERVICE)).getDefaultDisplay();
            base = new LinearLayout(this);
            base.setOrientation(LinearLayout.VERTICAL);
            form = new LinearLayout(this);
            form.setOrientation(LinearLayout.HORIZONTAL);
            verifier = new EditText(this);
            verifier.setWidth(display.getWidth()-100);
            verifier.setHeight(20);
            Button button = new Button(this);
            button.setText(“OK”);
            button.setHint(“PIN CODE”);
            button.setWidth(100);
            button.setHeight(20);
            button.setOnClickListener(new OnClickListener(){
                @Override
                public void onClick(View v) {
                    handler.post(new Runnable(){
                        public void run(){
                            try {
                                accToken = twitter.getOAuthAccessToken(reqToken,verifier.getText().toString());
                                Editor e = getPreferences(MODE_PRIVATE).edit();
                                String accessToken = accToken.getToken();
                                String accessTokenSecret = accToken.getTokenSecret();
                                e.putString(“AccessToken”,accessToken);
                                e.putString(“AccessTokenSecret”,accessTokenSecret);
                                e.commit();
                                onAuthorized(accessToken,accessTokenSecret);   
                            } catch (TwitterException e) {}
                        }
                    });
                }
            });
            wb =  new WebView(this);
            wb.setWebViewClient(new WebViewClient());
            form.addView(verifier);
            form.addView(button);
            base.addView(form);
            base.addView(wb,new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));
            setContentView(base);
            doAuthorize();
        }else{
            Toast.makeText(this,”You are already authorized.”, Toast.LENGTH_LONG).show();
            finish();
        }
    }
   
    public void doAuthorize(){
        twitter = new TwitterFactory().getOAuthAuthorizedInstance(CONSUMER_KEY,CONSUMER_SECRET);
        try{
            reqToken = twitter.getOAuthRequestToken();
            wb.loadUrl(reqToken.getAuthorizationURL().toString());
            wb.requestFocus(View.FOCUS_DOWN);
        }catch(Exception e){Toast.makeText(this, “ERROR.”,Toast.LENGTH_SHORT).show();}
    }

}

カテゴリー
未分類

TwitterのStreaming APIを利用する(Java)

この内容は自分のようなStreaming API?^q^やSSL?’q`な方に向けて書いていきます。

まず大まかな流れ。

1.SSLソケットを作る

2.BASIC認証用のキーを作成する

3.キーを使いリクエストヘッダを作成し送信する

4.データをもらう

これだけ。

 

Javaで書くとソースコードはこんな感じ。

import java.io.*;
import java.net.*;
import javax.net.ssl.*;
import sun.misc.BASE64Encoder;

class test{
    public static void main(String[] args) throws Exception {
        //SSLSocketを作成
        Socket s = HttpsURLConnection.getDefaultSSLSocketFactory().createSocket(“stream.twitter.com”,443);

        //入出力用
        BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream()));
        PrintWriter out = new PrintWriter(s.getOutputStream());

        //filterの場合、track=検索キーワードでキーワード検索の結果をリアルタイムで取得できる。
        out.println(“GET /1/statuses/filter.json?track=axe1lyze HTTP/1.1”);

        //認証キーの作成 ユーザーID:パスワード をBASE64で暗号化
        String key = new String((new BASE64Encoder()).encodeBuffer(“UserID:Password”.getBytes()));
        out.println(“Authorization:Basic “+key);

        //フラッシュしてデータを送信
        out.flush();

        //これでデータを取得し続ける
        String line;
        while((line=in.readLine())!=null){System.out.println(line);}
    }
}

 

取得形式はJSONだけなのかな?XMLもいけるとありがたいんだけども。

BASIC認証が使えるみたい。これはStreaming APIだけかな?

ツイートの投稿もこんな流れでできると幸せになれるんだけどなぁ。

自分が知らないだけでしたら申し訳ありません。

カテゴリー
未分類

JavaScript Object Dumper

JavaScriptのオブジェクトの中身を表示するメソッド。

http://smokycat.info/category_javascript/106 この記事に張り合って書いてみた。

理系の人のコードはやたら短いし、変数名一文字だし、凄いですね。

 

dumpObject(obj)

で戻り値はJSON形式になっています。

※Javaでいうprivateで定義されている変数までは取得できません。

function dumpObject(obj,index,objKey){
    index=index?index:0;index++;
    var returnStr = “”;
    var tab = “”;
    for(i=1;i<index;i++)tab+=”t”;
    returnStr += “n”+tab+(objKey?”””+objKey+””:”:””)+”{“;
    for(key in obj)
        returnStr += typeof obj[key]==”object”?
            dumpObject(obj[key],index,key):
            “n”+tab+”t”+”””+key+””:”+(typeof obj[key]==”string”?”””+obj[key]+”””:obj[key])+”,”;
    return returnStr.substring(0,returnStr.length-1) + “n”+tab+”}”+(!objKey?””:”,”);
}

以下のように使ってみてください。

window.open().document.write(dumpObject(eval(“(“+window.prompt()+”)”)).replace(/n/g,”<br>”).replace(/t/g,”&nbsp;&nbsp;&nbsp;&nbsp;”));

ほとんど必要ないと思いますが、以下のようにしてオブジェクトを復元できます。

eval(“(“+dumpObject(obj)+”)”);

 

Bookmarklet用

(function f(a,b,c){b=b?b:0;b++;var d=””;var e=””;for(i=1;i<b;i++)e+=”t”;d+=”n”+e+(c?”””+c+””:”:””)+”{“;for(k in a)d+=typeof a[k]==”object”?f(a[k],b,k):”n”+e+”t”+”””+k+””:”+(typeof a[k]==”string”?”””+a[k]+”””:a[k])+”,”;return d.substring(0,d.length-1)+”n”+e+”}”+(!c?””:”,”)})(obj)

この無名関数の引数(赤文字部分)にオブジェクトを渡してください。

カテゴリー
未分類

JavaのSocketで切断を検知(2)

以前にはデータ交換用と接続チェック用の2つのソケットをつないで、接続チェック用のソケットを使って相手が一定時間以内にデータを送ってきているかどうかで接続をチェックしていた。

あまりに無駄である。

 

もっと素直に簡単な方法があった。

Socket s = new ServerSocket(portNum).accept();
BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream()));
try{
    while(true)System.out.println(in.readLine());
}catch(IOException e){
    System.out.println(“Disconnected.”);
}

これだけ。どうやら切断されたらIOExceptionに投げられるらしい。まぁ当たり前といえば当たり前なのかな?

というのを踏まえて、複数人が同時にアクセス出来るメッセージ交換システムを作ってみた。

 

以下ソースコード

SocketServer.java

import java.io.*;
import java.util.*;
import java.net.*;

class SocketServer{
    private static ArrayList<ServerSocketThread> socketThreads = new ArrayList<ServerSocketThread>();
    public static void main(String[] args)throws IOException{
        while(true){
            ServerSocket sv = new ServerSocket(1024);
            ServerSocketThread sst = new ServerSocketThread(sv.accept());
            socketThreads.add(sst);
            sst.start();
            sv.close();
            System.out.println(“Connected!”);
            System.out.println(“now : “+socketThreads.size()+”n”);
            for(int i=0;i<socketThreads.size();i++){
                try{socketThreads.get(i).send(“Connected.”);}catch(IOException ex){}
            }
        }
    }
    public static class ServerSocketThread extends Thread{
        private Socket s;
        private BufferedReader in;
        private PrintWriter out;
        ServerSocketThread(Socket s)throws IOException{
            this.s = s;
            in = new BufferedReader(new InputStreamReader(s.getInputStream()));
            out = new PrintWriter(s.getOutputStream());
        }
        public void run(){
            try{
                while(true){
                    String str = in.readLine();
                    for(int i=0;i<socketThreads.size();i++){
                        socketThreads.get(i).send(str);
                    }
                }
            }catch(IOException e){
                socketThreads.remove(this);
                System.out.println(“Disconnected.”);
                System.out.println(“now : “+socketThreads.size()+”n”);
                for(int i=0;i<socketThreads.size();i++){
                    try{socketThreads.get(i).send(“Disconnected.”);}catch(IOException ex){}
                }
            }
        }
        public void send(String data)throws IOException{
            out.println(data);
            out.flush();
        }
    }
}

 

SocketClient.java

import java.io.*;
import java.util.*;
import java.net.*;

class SocketClient{
    private static Socket s;
    public static void main(String[] args)throws IOException{
        Scanner input = new Scanner(System.in);
        s = new Socket(“localhost”,1024);
        PrintWriter out = new PrintWriter(s.getOutputStream());
        new ClientSocketThread().start();
        while(true){
            out.println(input.nextLine());
            out.flush();
        }
    }
    public static class ClientSocketThread extends Thread{
        private BufferedReader in;
        ClientSocketThread()throws IOException{
            in =  new BufferedReader(new InputStreamReader(s.getInputStream()));
        }
        public void run(){
            try{
                while(true){
                    System.out.println(in.readLine());
                }
            }catch(IOException e){}
        }
    }
}

 

恐らくJavaプログラム間だけではなく、Java←→Flashでもいけると思います。

また時間があれば検証してみます。

これは面白いものが作れそうな予感。

 

もしこの記事を見た方で、「この人を我社に!」と思えた方がいらっしゃいましたら拾ってください!(切実)

カテゴリー
未分類

Google App EngineのChannel APIで切断の検知

いつの間にかこんなことが出来るようになっていた。去年(?)ぐらいから軽くGAEに触り、最近面白さをしってどんどん開発しているのですがこんなことは出来なかったような。

公式からはポーリング(定期的にデータを送信)でなんとかしてくれ。みたいなことが書かれてたような。

というわけでやり方をさっくり説明します。

Channel API Overview (Java)の「Tracking Client Connections and Disconnections」の意訳になりますかね。

ここではChannel APIが何かは説明しませんので。(もし質問があればTwitterで)

それでは説明

とりあえず war/WEB-INF/appengine-web.xmlに

    <inbound-services>
        <service>channel_presence</service>
    </inbound-services>

これを追記しましょう。

<appengine-web-app xmlns=”http://appengine.google.com/ns/1.0″>
    ・・・・・
    ・・・・・
    <inbound-services>
        <service>channel_presence</service>
    </inbound-services>
</appengine-web-app>

こんな感じで。

そうすると

Channel APIの接続があった場合 “/_ah/channel/connected/”
Channel APIの切断があった場合 “/_ah/channel/disconnected/”

にデータがPOSTされるようです。

web.xmlでここにサーブレッドプログラムを置いておきましょう。

Javaxのやつの場合はdoPostメソッドで取得できますね。

要するに “/_ah/channel/disconnected/” のサーブレッドに

import javax.servlet.http.*;

import com.google.appengine.api.channel.*;

@SuppressWarnings(“serial”)
public class Disconnected extends HttpServlet {

    ChannelService channelService = ChannelServiceFactory.getChannelService();

    public void doPost(HttpServletRequest req,HttpServletResponse resp) throws IOException{

        ChannelPresence presence = channelService.parsePresence(req);

        //このときpresenceに切断したユーザーのデータが入っています。詳しくはメンバ変数、メンバメソッドを各自ご確認ください。
        //ここ以下でpresenceをつかって動作内容を記述する。ここでは切断したユーザーのIDを表示するだけ。

        System.out.println(presence.clientId());

        //以下動作内容をちょめちょめする。

    }
}

これを置いておけば切断されたときにメッセージが出ます。が、デプロイ後はもちろん見れません(笑)

適当に解説を書きましたがわからない方はTwitterでご連絡をください。気まぐれですが説明します。

なお、Axe1lyzeは現在楽しく協力開発出来る人を募集しています!どんどん声をかけてね!

勉強中の人でもいいですよ!自分も勉強中なので(笑)

カテゴリー
未分類

クロスファイアのハロウィンイベントハック

日本のクロスファイアに関する裏ワザシリーズ第3弾!

このシリーズは知的好奇心を満たす目的で書いています。悪意のあるユーザーは使わないでください。善意でも駄目です。

今回の裏技は課金したくないけどGPやアイテムが欲しいというあなたにピッタリな裏ワザです。

この裏技を使えばハロウィンイベントで1日に1回一個しかもらえないアイテムが運が良ければ5個ぐらい入手できます。

でも使わないでください。

 

作業はすべてIEで行えます。

CFはすべてのページヘッダにブラウザを判定するスクリプトを入れるようにしてきたので、もうChrome(非IEタブ)やFireFoxでは使えません。

ハロウィンのイベントページから以下のJSを実行するだけです。

ここで意味が分からないぞという方は諦めてください。

以下コード。

w = window.open();
str=””;
for(j=1;j<=2;j++){for(i=0;i<500;i++){
    $.ajax({   
        type:”POST”,     
        url:”/Ev20111026HalloweenGetItem.cf”,
        data:{“gbn”:j},
        cache:false,
        success:function(message){
            w.document.write(decodeURIComponent(message).replaceAll(“+”,” “)+”<BR>”);
        }
    });
}}w.document.write(str+”<HR>Finished!”);

 

まぁやることはかなり単純だし、なんといってもゴリ押し!

一応質問はTwitterにて受けますが答えるかどうかは気まぐれです。