このブログを検索

10.19.2010

KDDIとSkypeの戦略的包括提携「Skype™ au」の提供について

無断リンクですが,以下のことが発表されました.
au携帯電話でskype
あくまで素人目線の意見ですので,聞き流すくらいでちょうどいいかと思います.
それでも読んでくれる方はどうぞ.

私がPCに触りだしたくらいは2000年くらいだったと思う.
そのころ使っていたメッセンジャーはYahoo!だったかな.
すでにボイスチャットとかはできていたから,現在と考えて表面上ではそこまで技術進歩してない(あくまでユーザからしたらね,転送速度・容量とかは変わったけどさ)
まだ携帯電話ももってなくて,PHSを持ってた気がする.
それくらいのときから,電話を急にするようになって,電話代で何度怒られたことか.

本題に戻ろうか,携帯電話でskypeは,油と水みたいに混ざらないだろうなと思ってました.
skypeID間の通話は無料(パケット料はかかる)みたいなものですからね.
事業の1部として,無線通話を扱っている業者からすれば,いい迷惑だろうと思います.
それをやってのけたauは挑戦者だと思うし,どんな策略があるのだろうと考えました.

考えられるのは,誰もやってないことに挑戦することでの,ユーザの確保.
また,通信技術・端末性能ともに高性能化する中,止めることができないと判断したのか.
今,ぱっと考えられたのはこの2点です.
1点目は,他者との差別化を図るには最大の武器になる点です.
公式には国内の事業者はどこもやってないことをやってのけることで,集客も見込めるうえに,流出も防げる点があります.
2点目はそのままですね.

それにしても,この発表は,驚きでした.
今までにできる端末などは知っていましたが,あまり身近でなかったことから手を出さずにいたのですが,
この発表で少しauもいいなと思いました.

近い将来,音声通信が無料になる日も近いのでは…

だらだらと続けるわけにはいかないので,ここで終わりにします.
なにかおもしろい記事があったら,また感想などを書こうかと思います.

10.03.2010

自己組織化マップの応用1-序章-

自己組織化マップを利用した巡回セールスマン問題の準最適解を導く-序章-

今回のキーワード
「巡回セールスマン問題」
「自己組織化マップ(SOM)」
「準最適解」

今回は序章として,問題定義と解決方法並びにSOMについてを記す.
結果等は次回の投稿にて行います.

まず,巡回セールスマン問題とはなにかから入ります.
巡回セールスマン問題とは,別名が多くありますが,要するに目的地を最短で回るためのルートはどのルートか導くことです.
最近の話でいうと,Google DevQuizの第3問あたりであったかと思います.
あの問題では,距離が問題なのではなく,移動時間に焦点を当てていました.

本題に戻ると,巡回ルートは都市(以降データ点とする)が多くなれば指数的にルートが増えていきます.
数学的知識を使えば,巡回ルートは減らすことができますが,それでも指数的に増えることには変わりありません.
では,どうやって解けばいいか.
コンピュータを使って,解かせるのが一番早いでしょう.
今回私が用いるのは「自己組織化マップ(以降SOM)」です.
SOMの一般的な使用法は,高次元のベクトルを二次元に射影することで可視化などを促すことが,多いかと思います.
この射影することができる点を利用し,巡回セールスマン問題の準最適解を導きます.
具体的にはマップではなく,1次元にして利用するので,「自己組織化リング」とでもいいましょうか.
準最適解しか導くことができないのは,学習系のアルゴリズムであるため,精密な距離計算を行わないことから
必然的に最適解に近い結果しか導くことができないからです.
しかし,データ点が増えても短時間でルートを算出できる点や,膨大な時間や複雑なアルゴリズムが不要である点など,
多くの利点があります.
(まぁ,ほんとのことを言えば,最近SOMばっかり使ってるので,ほかのことにも応用させたいと思っているだけなんですけどね)

早いですけど,今回は問題定義だけ行い,グラフィック化させるシステムができれば,解答編を描きたいと思います.

まとめ
今回の目的:巡回セールスマン問題をSOMを利用して解く(データ点に関しては,乱数なり実際の都市なりを利用)
自己組織化写像wikipedia
巡回セールスマン問題

9.23.2010

[Java]Scanner VS BufferedReader

ファイル入力の際にいつもBufferedReaderクラスしか使ったことなかったですが,
ふとしたときにScannerクラスの存在を知ったので,
違いと個々の使い分け法記します.

また,説明する際に使用するテキストファイル内容は
test.txt
Hello World
1 2 3
おはよう!
を使用します.

・BufferedReaderクラス使用
コード例
try {
   BufferedReader in = new BufferedReader(new FileReader(textAd));
   String line;
   while ((line = in.readLine()) != null) {
    System.out.println(line);
   }
   in.close();
  } catch (IOException er) {
   System.out.println(er.getMessage());
  }

・Scannerクラス使用
try {
   File file = new File(textAd);
   Scanner ScanFile = new Scanner(file);
   while (ScanFile.hasNextLine()) {
    System.out.println(ScanFile.nextLine());
   }
   ScanFile.close();
  } catch (IOException er) {
   System.out.println(er.getMessage());
  }

上記のプログラムを個々に100回繰り返した時の時間を比較したところ,
BufferedReaderクラス : 0.015秒
Scannerクラス     : 0.062秒

Scannerクラスのほうが遅いことがわかる.
では,Scannerクラスを利用するメリットはないかといえば,そうではありません.

メリット1 キーボード入力
  Scanner scan = new Scanner(System.in);
  String line = scan.next();
  System.out.println(line);
  line = scan.next();
  System.out.println(line);
実行結果(入力: hello world)
hello
world

メリット2 型指定キーボード入力
  int line = scan.nextInt();
  System.out.println(line);
  line = scan.nextInt();
  System.out.println(line);

実行結果(入力:123 456
123
456

以上のようにBufferedReaderを使用した場合、よりScannerを利用した方がコードは簡潔にすることが可能です。
暗黙的に2つに分けると決めていたのですが、実際使用する場合は、
  while (scan.hasNextInt()) {
   int line = scan.nextInt();
   System.out.println(line);
  }
と、書くといいかもしれません。
また、使用する際はExceptionが発生した場合に対処するためtry文なりthrowなりで対策する必要があります。

参考資料
Scanner
BufferedReader

9.21.2010

test

package SGM.main;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import SGM.Data.Data;

/*
 Training Set (9,603 docs): LEWISSPLIT="TRAIN";  TOPICS="YES"
 Test Set (3,299 docs): LEWISSPLIT="TEST"; TOPICS="YES"
 Unused (8,676 docs):   LEWISSPLIT="NOT-USED"; TOPICS="YES"
 or TOPICS="NO"
 */
public class Main {
 private static String FileAd = "D:/TESTDATA/Reuter/file";
 private static LinkedList<String> fileList = new LinkedList<String>();

 public static void main(String[] args) {

  setFileList(FileAd);

  SGMReader sgm = new SGMReader(fileList);

  String line = "<TITLE>BAHIA COCOA REVIEW</TITLE>";
  String key = "TITLE";

  System.out.println(getData(line, key));

 }

 private static void setFileList(String address) {
  File file = new File(address);
  String[] list = file.list();

  for (int i = 0; i < list.length; i++) {
   String _ad = new String(address).concat("/" + list[i]);
   if (isFile(_ad)) {
    fileList.add(_ad);
    System.out.println(_ad);
   } else {
    setFileList(_ad);
   }
  }
 }

 private static Boolean isFile(String address) {
  File file = new File(address);
  if (file.isFile()) {
   return true;
  }
  return false;
 }

 private static String getData(String line, String key) {
  int beginIndex = line.indexOf(key) + key.length() + 1;
  int endIndex = line.lastIndexOf(key) - 2;
  line = line.substring(beginIndex, endIndex);
  return line;
 }
}

class SGMReader {
 private String fileAd = "./reut2-001.sgm";
 private String[] element = { "REUTERS", "DATE", "TOPICS", "PLACES", "D", "PEOPLE", "ORGS",
   "EXCHANGES", "COMPANIES", "UNKNOWN", "TEXT", "TITLE", "DATELINE", "BODY", };

 private int testNum = 0;
 private int trainNum = 0;
 private int sum = 0;

 public SGMReader(LinkedList<String> fileList) {
  for (String ad : fileList) {
   this.Reader(ad);
  }

  System.out.println("test:\t" + testNum + "\ntrainNum:\t" + trainNum + "\nsum:" + sum);
 }

 public SGMReader() {
  this.Reader();
 }

 private void Reader(String ad) {
  ArrayList<String> SGM = new ArrayList<String>();
  String title = new String();
  Data data;
  try {
   File fHandle = new File(ad);
   Scanner fScan = new Scanner(fHandle);
   String Mode = "Unused";
   Boolean ReadMode = false;
   String ID = new String();
   Boolean SaveMode = false;

   while (fScan.hasNextLine()) {
    String str = fScan.nextLine();
    // System.out.println(str);

    if (this.haveKey("LEWISSPLIT", str)) {
     SGM.clear();
     ID = new String();
     title = new String();
     ReadMode = false;
     Mode = "Unused";
     SaveMode = false;
     if (this.isTrainingSet(str).equals("TRAIN")) {
      Mode = "TRAIN";
      title = "TRAIN";
      ID = this.getNewID(str);
      trainNum++;
     } else if (this.isTrainingSet(str).equals("TEST")) {
      Mode = "TEST";
      title = "TEST";
      ID = this.getNewID(str);
      testNum++;
     }
    }

    if (Mode != "Unused") {
     if (this.haveKey("TOPICS>", str)) {
      str = str.replace("<D>", "");
      str = str.replace("</D>", "_");
      String topics = this.getData(str, "TOPICS");
      // if (topics.length() != 0) {
      title = title.concat("." + topics + "" + ID + ".txt");
      sum++;
      SaveMode = true;
      // }
     }

     if (this.haveKey("<BODY", str)) {
      str = str.substring(str.indexOf("BODY") + new String("BODY").length() + 1);
      ReadMode = true;
     }
     if (this.haveKey("</BODY", str)) {
      if (SaveMode == true) {
       data = new Data(title, SGM);
      }
      SGM.clear();
      ID = new String();
      title = new String();
      ReadMode = false;
      Mode = "Unused";
      SaveMode = false;
     }

     if (ReadMode == true) {
      SGM.add(str);
      // System.out.println(str);
     }
    }
   }

   System.out.println(SGM.size());
  } catch (Exception e) {
   System.out.println(e.getMessage());
  }
 }

 private String getData(String line, String key) {
  int beginIndex = line.indexOf(key) + key.length() + 1;
  int endIndex = line.lastIndexOf(key) - 2;
  line = line.substring(beginIndex, endIndex);
  return line;
 }

 private String getNewID(String line) {
  int beginIndex = line.indexOf("NEWID") + new String("NEWID").length() + 2;
  int endIndex = line.length() - 2;
  return line.substring(beginIndex, endIndex);
 }

 private String isTrainingSet(String line) {
  if (this.haveKey("YES", line)) {
   if (this.haveKey("TEST", line)) {
    if (!this.haveKey("NOT-USED", line)) {
     return "TEST";
    } else {
     return "Unused";
    }
   } else if (this.haveKey("TRAIN", line)) {
    return "TRAIN";
   } else {
    return "Unused";
   }
  } else {
   return "Unused";
  }
 }

 private Boolean haveKey(String key, String line) {
  if (line.indexOf(key) > 0) {
   return true;
  } else {
   return false;
  }
 }

}

7.19.2010

花火

今日、バイトの仲間と花火をしました。
この年になると、手持ちの花火とか、噴射系の花火とかに魅力を感じないのはなぜだろう。
とかいいつつ、噴射系の花火を手に持ってあばれていたのは私です、すみません。
*よい子は真似しないでね*

線香花火が一番!
だけど、風が強かったり、ちょっとグダグダになって申し訳ない。
そんなこんなで、楽しかった夏の日も終わり、明日からは学校!学校!学校の毎日です。

学校で習ったことや書き留めておきたいものを書いていこうかな。
最初の題目は、ニューラルネットワークの導入部分でも書こうか。

てか、機械学習って需要あるのか謎だけど気にしない!

7.17.2010

Hello World

とりあえず、はじめまして、くに タッくんです。
この名前は、あだ名?呼び名?である「くに」と
一部の人から呼ばれていた「タッくん(これ、すごく気に入ってます)」を合わせただけです。
一応まだ学生をしていますが、そろそろ社会人です。

今現在は、研究室と家とバイト先くらいにしかいませんが、
たまに近郊で開催される勉強会などのイベントに参加していますよ。

前回はandroidのイベントだったかな。
楽しかったので、もっと勉強して、また参加したい。

短いですが、hello worldはこのへんで。