このブログを検索

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
1Hello World
21 2 3
3おはよう!
を使用します.

・BufferedReaderクラス使用
コード例
01try {
02   BufferedReader in = new BufferedReader(new FileReader(textAd));
03   String line;
04   while ((line = in.readLine()) != null) {
05    System.out.println(line);
06   }
07   in.close();
08  } catch (IOException er) {
09   System.out.println(er.getMessage());
10  }

・Scannerクラス使用
01try {
02   File file = new File(textAd);
03   Scanner ScanFile = new Scanner(file);
04   while (ScanFile.hasNextLine()) {
05    System.out.println(ScanFile.nextLine());
06   }
07   ScanFile.close();
08  } catch (IOException er) {
09   System.out.println(er.getMessage());
10  }

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

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

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

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

実行結果(入力:123 456

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

参考資料
Scanner
BufferedReader

9.21.2010

test

001package SGM.main;
002 
003import java.io.File;
004import java.io.IOException;
005import java.util.ArrayList;
006import java.util.LinkedList;
007import java.util.Scanner;
008import java.util.regex.Matcher;
009import java.util.regex.Pattern;
010 
011import SGM.Data.Data;
012 
013/*
014 Training Set (9,603 docs): LEWISSPLIT="TRAIN";  TOPICS="YES"
015 Test Set (3,299 docs): LEWISSPLIT="TEST"; TOPICS="YES"
016 Unused (8,676 docs):   LEWISSPLIT="NOT-USED"; TOPICS="YES"
017 or TOPICS="NO"
018 */
019public class Main {
020 private static String FileAd = "D:/TESTDATA/Reuter/file";
021 private static LinkedList<String> fileList = new LinkedList<String>();
022 
023 public static void main(String[] args) {
024 
025  setFileList(FileAd);
026 
027  SGMReader sgm = new SGMReader(fileList);
028 
029  String line = "<TITLE>BAHIA COCOA REVIEW</TITLE>";
030  String key = "TITLE";
031 
032  System.out.println(getData(line, key));
033 
034 }
035 
036 private static void setFileList(String address) {
037  File file = new File(address);
038  String[] list = file.list();
039 
040  for (int i = 0; i < list.length; i++) {
041   String _ad = new String(address).concat("/" + list[i]);
042   if (isFile(_ad)) {
043    fileList.add(_ad);
044    System.out.println(_ad);
045   } else {
046    setFileList(_ad);
047   }
048  }
049 }
050 
051 private static Boolean isFile(String address) {
052  File file = new File(address);
053  if (file.isFile()) {
054   return true;
055  }
056  return false;
057 }
058 
059 private static String getData(String line, String key) {
060  int beginIndex = line.indexOf(key) + key.length() + 1;
061  int endIndex = line.lastIndexOf(key) - 2;
062  line = line.substring(beginIndex, endIndex);
063  return line;
064 }
065}
066 
067class SGMReader {
068 private String fileAd = "./reut2-001.sgm";
069 private String[] element = { "REUTERS", "DATE", "TOPICS", "PLACES", "D", "PEOPLE", "ORGS",
070   "EXCHANGES", "COMPANIES", "UNKNOWN", "TEXT", "TITLE", "DATELINE", "BODY", };
071 
072 private int testNum = 0;
073 private int trainNum = 0;
074 private int sum = 0;
075 
076 public SGMReader(LinkedList<String> fileList) {
077  for (String ad : fileList) {
078   this.Reader(ad);
079  }
080 
081  System.out.println("test:\t" + testNum + "\ntrainNum:\t" + trainNum + "\nsum:" + sum);
082 }
083 
084 public SGMReader() {
085  this.Reader();
086 }
087 
088 private void Reader(String ad) {
089  ArrayList<String> SGM = new ArrayList<String>();
090  String title = new String();
091  Data data;
092  try {
093   File fHandle = new File(ad);
094   Scanner fScan = new Scanner(fHandle);
095   String Mode = "Unused";
096   Boolean ReadMode = false;
097   String ID = new String();
098   Boolean SaveMode = false;
099 
100   while (fScan.hasNextLine()) {
101    String str = fScan.nextLine();
102    // System.out.println(str);
103 
104    if (this.haveKey("LEWISSPLIT", str)) {
105     SGM.clear();
106     ID = new String();
107     title = new String();
108     ReadMode = false;
109     Mode = "Unused";
110     SaveMode = false;
111     if (this.isTrainingSet(str).equals("TRAIN")) {
112      Mode = "TRAIN";
113      title = "TRAIN";
114      ID = this.getNewID(str);
115      trainNum++;
116     } else if (this.isTrainingSet(str).equals("TEST")) {
117      Mode = "TEST";
118      title = "TEST";
119      ID = this.getNewID(str);
120      testNum++;
121     }
122    }
123 
124    if (Mode != "Unused") {
125     if (this.haveKey("TOPICS>", str)) {
126      str = str.replace("<D>", "");
127      str = str.replace("</D>", "_");
128      String topics = this.getData(str, "TOPICS");
129      // if (topics.length() != 0) {
130      title = title.concat("." + topics + "" + ID + ".txt");
131      sum++;
132      SaveMode = true;
133      // }
134     }
135 
136     if (this.haveKey("<BODY", str)) {
137      str = str.substring(str.indexOf("BODY") + new String("BODY").length() + 1);
138      ReadMode = true;
139     }
140     if (this.haveKey("</BODY", str)) {
141      if (SaveMode == true) {
142       data = new Data(title, SGM);
143      }
144      SGM.clear();
145      ID = new String();
146      title = new String();
147      ReadMode = false;
148      Mode = "Unused";
149      SaveMode = false;
150     }
151 
152     if (ReadMode == true) {
153      SGM.add(str);
154      // System.out.println(str);
155     }
156    }
157   }
158 
159   System.out.println(SGM.size());
160  } catch (Exception e) {
161   System.out.println(e.getMessage());
162  }
163 }
164 
165 private String getData(String line, String key) {
166  int beginIndex = line.indexOf(key) + key.length() + 1;
167  int endIndex = line.lastIndexOf(key) - 2;
168  line = line.substring(beginIndex, endIndex);
169  return line;
170 }
171 
172 private String getNewID(String line) {
173  int beginIndex = line.indexOf("NEWID") + new String("NEWID").length() + 2;
174  int endIndex = line.length() - 2;
175  return line.substring(beginIndex, endIndex);
176 }
177 
178 private String isTrainingSet(String line) {
179  if (this.haveKey("YES", line)) {
180   if (this.haveKey("TEST", line)) {
181    if (!this.haveKey("NOT-USED", line)) {
182     return "TEST";
183    } else {
184     return "Unused";
185    }
186   } else if (this.haveKey("TRAIN", line)) {
187    return "TRAIN";
188   } else {
189    return "Unused";
190   }
191  } else {
192   return "Unused";
193  }
194 }
195 
196 private Boolean haveKey(String key, String line) {
197  if (line.indexOf(key) > 0) {
198   return true;
199  } else {
200   return false;
201  }
202 }
203 
204}

7.19.2010

花火

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

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

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

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

7.17.2010

Hello World

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

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

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

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