2013年12月1日日曜日

東芝のNB100をサーバ化

NB100にCentOS 6.4をインストールしました。

事前に準備するもの
USBメモリ 1GB
CentOS-6.4-i386-minimal.iso(http://ftp.jaist.ac.jp/pub/Linux/CentOS/6.4/isos/)
Fedora LiveUSB Creator(https://fedorahosted.org/liveusb-creator/)
NB100のパーティションを20GB分切っておきました。

手順
Fedora LiveUSB Creatorを使い、CentOS-6.4-i386-minimal.isoのLiveUSBを作ります。
作成し終えたら、USBメモリの中にCentOS-6.4-i386-minimal.isoも入れておきます。

NB100にUSBメモリをさして起動します。
このとき、インストール元をLiveCDとかにすると失敗します。
がんがんいって問題ないです。
きっとインストールが終わっています。

設定
とりあえず、Ethernetの設定だけします。
ここを参考にして作りました。
http://blog.quall.net/linuxserver/182/

2013年11月23日土曜日

Mac book AirでX Window Systemのプログラミングをする為に

Mac book AirでX11がないと言われた

http://xquartz.macosforge.org/landing/

Mac book Airを購入していたから設定のメモ

・capsをcommandへ割り当てる

・homebrew入れる
ruby -e "$(curl -fsSL https://raw.github.com/mxcl/homebrew/go)"

・Alfredを入れた
option + spaceで起動

・zshにかえる
zshのパスを確認
cat /etc/shells
Terminalで使うものをzshに変更
chsh -s /bin/zsh
bash時代の設定とかを移す
ファイルを作ってここへ書く
touch ~/.zshrc
source ~/.zshrc

2013年11月6日水曜日

Win7からMBAに乗り換えて

この時期にMacbook Airを購入しました。

・実際に使用した際の戸惑い

  1. スクロールがWindowsと逆
  2. commandとcontrolについて
  3. 半角/全角キーがない
  4. backspaceがdeleteで、後ろの文字を消去するキーはない

1については慣れることで解消しましたが、設定でWindowsと同じにすることが可能です。

2については、GUIで使用していてcommandがCtrlと同じなのかなと思いきや、TerminalではcontrolとCtrlが同じだったりしたので、慣れが必要です。

3については、JISキーボードの場合、Spaceの横にある英数、かなを使用します。
USの場合は、自分でSpaceの左右に割り当てることにより実現しているそうです。

4についてはそのまんまです。特に不便はないです。

・Boot Campを使用した際の戸惑い
Windows 8 64bitを入れました。

USBフラッシュメモリと外付けDVDドライブとインターネットに接続できる環境が必要でした。

初めにBoot Campのパーティションを切って再起動した際には、なぜかインストールをせずにOS Xが再起動されただけでした。
2回目は、もう一度パーティションを切り直したところ、無事インストールができました。
しかし、Windowsの初期設定でキー入力を受け付けず電源を強引に落として、
「command」「 option」「 p」「 r」を同時に押しながら電源を入れました。

多分これで、設定を乗り切った。

そして、使用感の戸惑いでは、半角/全角キーがないので困った。
その他、キーの割り当てで悩みました。
他には、電源の持ちが悪いことや、紙芝居ゲーをしていると発熱がすごい。
70℃くらいまで上昇していました。


・購入してよかったかどうか

すごく使いやすいと感じた。
これから購入するのはきっとApple製品になると思う。
しかし、どうしてもWindowsでないとできないことがある。それは、Wordなどの資料や外部モニタでMacが使えない場合があるからだ。
サブで一応もっておくことも必要なのかな。。。。



スマホメーカー、曲がるディスプレーを競って開発を読んで


記事


以上を読んで感じた事。

これから、プラスチックの製造分野が伸びるかどうかはわからないが、お金を投入する企業がいっぱいいるので、材料系の企業に投資しておけばいいと思うよ。

ウェアラブルに力入れてきてんなって記事でしたね。

2013年10月16日水曜日

Androidで艦これをやる方法の考察

経緯
Androidで艦これをやるには、Flashや音声データ、その他Effectは無駄だと思えた。
というか動作が重い
なので、まともに艦これをやるために、専用ブラウザを作成することを考える。


艦これをしている時の通信を眺めていたところ、特に暗号化はされていなかった。
よって、APIを使用するだけなら、技術的なハードルは低いことがわかった。

次に、APIを使用するために、艦これのサーバとのセッションを作成する方法だが、これも簡単っぽい。(省略)

最後に、DMMへログインしてセッションを作成する。
必要なのは、token,mail address,passwordらへんだと思う。
tokenはログインページに直接に記述されていた。
あと、Cookieにsession idっぽいのがないとダメだとわかった。
どこから、Cookieをもってくるのかわかんね。詰んだ。

とりあえず、正しいログインができたとして、戻ってくるコードが302 Foundだった。
302 Foundから2回リダイレクトして、ようやくログインが成功する。

とりあえず、Cookieをどうにかしないといけないので、解決さくを考えた。

  1. ひたすらJavaScriptを読んで解析
  2. WebViewを使用する

1はどうせ、CookieをつくるのにJavaScript使ってんでしょ?とか言って、人力スクレイピング。
2はAndroidを使うんだから、しんどいところはWebViewを使ってログインしようぜ!ついでにCookieも取り出しちゃおうぜ!

とりあえず、試したところCookieは取れったっぽいから、WebViewは閉じて、Cookie使って、艦これtoken作ってAPI叩くところまで、妄想







2013年10月9日水曜日

JavaのRMIをつくるには


実装すべき内容
・サーバに名前をつけたインスタンスを保持させる
・クライアントはサーバにあるインスタンスを操作する
・クライアントでは、interfaceを持っているだけで、実装はサーバで行う。

サーバに名前をつけたインスタンスを保持させる
これは簡単で、HashMapを使用する。
KeyをStringにして名前を入れてしまえばよいからだ。


クライアントはサーバにあるインスタンスを操作する
これがめんどうである。
簡潔に言えば、プロキシインスタンスを作成しメソッドを実行したら、そのメソッド名と引数をサーバへ送り、サーバで実行し結果をクライアントへ返すという工程だ。

そして、この前段階にサーバのプロトコルを決めておこう。
RMIでは、サーバのアドレスとインスタンスの名前を送ることで、プロキシインスタンスを作成しているので、これに習ってみる。
ObjectOutputStreamでStringで名前を送る。
サーバでは、Stringを受信した時に、クライアントでプロキシインスタンスを作成するためのinterfaceを送信する必要がある。
なので、名前をつけて登録したインスタンスから共通のinterfaceを取り出すことにした。
reflectionを使用することで、インスタンスへ実装されているinterfaceの配列を取り出すことができる。
取り出すために、共通のinterfaceにはシンボルとして、Comfaceというinterfaceを作成し継承させることにした。
interfaceの配列からComfaceを継承しているものをクライアントへ送り、それでプロキシインスタンスを作成する。

次に、私はサーバにあるインスタンス名、実行したメソッド名、メソッドの引数の型、引数、を保持するクラスを作成した。
この際、シリアライズできるようにSerializableを実装する。
サーバでは、このオブジェクトの時にはメソッドの実行をするようにする。

プロキシインスタンスでは、InvocationHandlerを実装したクラスを渡すことで、メソッドの実行に細工ができる。
メソッドの実行時には、メソッドの名前や渡された引数がわかるので、それをサーバに送る事でRMIの真似事ができるのだ。
void型などのメソッドには気を付けること。








2013年8月6日火曜日

UbuntuでRailsを構築する上で


ここを参考に
http://www.oiax.jp/rails/zakkan/rails_3_2_installation_on_ubuntu.html

一部のパッケージが古いところにしかないので
/etc/apt/sources.list
のドメインをold-releases.ubuntu.comに書き換えよう

2013年8月2日金曜日

2013年6月22日土曜日

C言語で入出力がとばされる


C言語で入出力がとばされる事態が起きたので対処方法を記す。

scanf(),getchar()を使わない。

入力したときの改行が残ってしまうことがある。
なので、fgets(char*,int,FILE*)を使うべきだ。

そして、入力バッファが残る可能性があるので、のちのちに気づきにくいバグを産むかもしれない。
よって、fgets()のあとにはfflush(FILE*)を入れてやればよい。

2013年6月13日木曜日

HTC Jで開発するさいに起きたエラー

なぜだか、デバックができないので、HTC SyncMangerのプロセスを止めたらうまくいった

2013年6月1日土曜日

Scalaをeclipseでやる上で

Scala IDEをEclipse 4.2 Junoに導入しようと思ったが相性が悪そうだったので3.7 Indigoにした。
相性の問題とか、ほかのプラグインと干渉するみたいなことがどこかに書いてあったので別々に分けるのもいい手なのかもしれない。
まあ、ソースがないので信頼性皆無の手である。

以下から日本語のEclipseを前提で説明する。
ヘルプ->新規ソフトウェアをインストールを選ぶ
作業対象に以下のURLを入力
http://download.scala-ide.org/nightly-scala-ide-3.0.x-210x/site.xml

そしたら、Scala IDEの選択肢が出てくるのでインストール。
ガンガンすすめる。
たぶん悩むことはないと思う。
再起動してから、エラーっぽいのがでるからScalaの設定をいじる。
適当にチェックを入れておけばいいと思う。
わからなければエラーよめ。

アンインストールの方法は、
ヘルプ->Eclipseについてを選ぶ。インストール詳細をクリック。
インストールした一覧がでてくるので、Eclipse for Scala IDEだったかをアンインストール。
以上








2013年5月28日火曜日

Scala

面白い
関数をオブジェクトとして扱えるのがよかった

2013年5月3日金曜日

ServletでBase64を扱う際に

BASIC認証がやりたくて調べていたのですが、サンプルコードにBase64をデコードするメソッドが大抵書いてあるのですが、そのメソッドがGAEではつかえない。。。

それ以外の部分は動きそうだったのでその部分だけ自分で書くかネットのを流用しよう。
と思った。

maru sourceさまの
http://blog.h13i32maru.jp/entry/20110116/1295187291
を使わせてもらった

ただ、デコードの部分にバグがありbyte配列に後ろに0が入っているのでnew String(byte[]);としたときに変な文字列が後ろにつくことになる。

方法としては、後ろの0がある配列を取り除く繰り返し文を書くか、0 byteの文字列を取り除くコードを書くか(幸いJAVAのStringとても便利だ!)
あとは、新しく自分で作るだがめんだくさい

今回はファイル操作などせずに単純に文字列をデコードしたいだけなので0 byteの文字列を取り除くことにする
もし、仮にmp3などをデコード、エンコードしたい場合は一度バイナリファイルを見てみるといいだろう
自分でつくるか他に探し出すという結果しか出てこないだろう、

   String result = decodeToString("エンコードされた文字列");
   byte[] zerobyte={0};
   result = result.replace(new String(zerobyte),"");

もしくは一番後ろの文字列
   String str = encode("abcde".getBytes());
   byte[] result=decode(str);
   int length=result.length-1;
   while(true){
      if(result[length]!=0){
         break;
      }
      else{
        length--;
      }
   }
   str=new String(result).substring(0,length+1);

あとは有効そうなのはもともとの文字列の長さを他に持たせておきそのサイズだけ取り出すとかかなあ

2013年4月27日土曜日

Androidでネットワークアプリケーションを作るさいに

まず、ネットワークの通信を行う際には別のスレッドで通信しないといけない。
Exceptionがでる。。。

つぎにAndroiManifestにインターネットのパーミッションを許可しないといけない

2013年3月28日木曜日

Google App Engine for Java

GAEを使いServletを動作させてみた。
Webアプリケーションが予想していたよりも、簡単にできたのはとても意外でありEclipseの偉大さも改めて感じた。

ちょこっとしか弄っていないがこれからどんどん弄ろうかなと思う。

サンプルとして

import java.io.IOException;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@SuppressWarnings("serial")
public class H0tcakeAP1Servlet extends HttpServlet {
 //GETで呼ばれたときに呼ばれる。
 public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
  resp.setContentType("text/plain");
  resp.getWriter().println("http://h0tcakeap1.appspot.com");
 }
 //データがポストされたときに呼ばれる
 public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
  resp.setContentType("text/plain");
  
  String para=req.getParameter("api");//POSTされたパラメータ(api)を取得
  resp.getWriter().println(selector(para,req));
 }
 //リクエストによってAPIを判別
 private String selector(String para,HttpServletRequest req){
  if(para==null){
   return "null";
  }
  String respons=null;
  if(para.equalsIgnoreCase("ipaddress")){
   respons=req.getRemoteAddr();//グローバルIPアドレスを取得
  }else{
   respons="null";
  }
  
  return respons;
 }
 
}


データをポストするとdoPostが呼ばれるんだと知った。
実際に公開してみたが目に見える範囲はほとんどHTMLファイル。。。。

http://h0tcakeap1.appspot.com

内容としてはグローバルIPアドレスを取得できるものを作った。

サンプルコード

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;

public class H0tcakeAP1TEST {

 /**
  * @param args
  * @throws IOException 
  * @throws MalformedURLException 
  */
 public static void main(String[] args) throws MalformedURLException, IOException {
  URLConnection uc= new URL("http://h0tcakeap1.appspot.com/h0tcakeap1").openConnection();
  uc.setDoOutput(true);
  OutputStream os = uc.getOutputStream();
  PrintStream ps = new PrintStream(os);
  ps.print("api=ipaddress");
  ps.close();
  //受信
  InputStream is = uc.getInputStream();//POSTした結果を取得
  BufferedReader reader = new BufferedReader(new InputStreamReader(is, "utf-8"));
  StringBuffer sb= new StringBuffer();
  String temp=null;
  while ((temp = reader.readLine()) != null) {
   sb.append(temp);
  }
  reader.close();
  
  System.out.println("IP Adress:"+sb.toString());
  
 }

}


雑記:
MacTypeというフォント関係のソフトをインストールしてみたが素敵だった。

2013年3月5日火曜日

壊れたMP3を少し治す

前に自作したダウンローダを利用して保存していたmp3データが壊れていた。

理由はダウンローダにバグがあり、ところどころに0が入っていてノイズになる。
mp3の構造を調べないといけないのかなと思いつつ、とりあえず0を除くプログラムを組んだ。
ちょっとだけましだった


import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;

public class Repair {

 private File file;
 private int checkByte = 5;
 private int checkByte2 = 4;

 public Repair(File file) {
  this.file = file;
  if (!this.file.isFile())
   this.file = null;
 }

 public Repair(String file) {
  this.file = new File(file);
  if (!this.file.isFile())
   this.file = null;
 }

 public long execute() throws Exception {
  System.out.println("Repair");
  if (file == null)
   return -1;
  long start = System.currentTimeMillis();
  FileInputStream fis = new FileInputStream(file);
  File repair = new File(file.getAbsoluteFile() + ".repair.mp3");
  int d = 0;
  while (repair.isFile()) {
   repair = new File(file.getAbsoluteFile() + "." + Integer.toString(d++) + ".repair.mp3");
  }
  FileOutputStream fos = new FileOutputStream(repair);
  int ocount;
  int counter = 0;
  boolean skip = false;
  boolean wait = false;
  Integer ch;
  byte[] zerobuf = new byte[checkByte];
  byte[] buf = new byte[checkByte2];
  int zerosize = 0;
  int bufsize = 0;
  boolean first = true;
  while ((ch = fis.read()) != -1) {

   /////////
   if (first) {
    if (skip)
     if (ch != 0) {
      skip = false;
      first=false;
     }
    if (first)
     if (!skip) {
      if (ch == 0) {
       wait = true;
      } else {
       wait = false;
      }
      if (wait) {
       zerobuf[zerosize++] = 0;
       if (zerosize == checkByte) {
        //System.out.print("skip");
        skip = true;
        zerosize = 0;
       }
      } else {
       fos.write(ch);
       if (zerosize != 0) {
        fos.write(zerobuf, 0, zerosize);
        zerosize = 0;
       }
      }
     }
   }

   if (!first) {
    if (skip)
     if (ch != 0) {
      skip = false;
     }

    if (!skip) {

     buf[counter] = ch.byteValue();
     //System.out.println("byte"+buf[counter]);
     //System.out.println("\tInt->"+ch);
     //Thread.sleep(500);
     if (counter++ == checkByte2 - 1) {
      counter = 0;
      ocount = 0;
      for (int i = 0; i < checkByte2; i++) {
       if (buf[i] == 0) {
        ocount++;
       }
      }
      if (ocount == checkByte2) {
       //System.out.println("0 skipを見つけました");
       skip = true;
      } else
       fos.write(buf);
     }
    }

   }
  }
  fos.close();
  fis.close();
  return System.currentTimeMillis() - start;
 }

}

2013年3月4日月曜日

JFrame パネルの色を変更


getContentPane#setColor(new Color(0xFFFFFF));

JPanel panel = new JPanel();
panel#setColor(new Color(0xFFFFFF));

2013年3月1日金曜日

プログラムの多重起動を防止

参考になった
http://okwave.jp/qa/q2030088.html

キーワードとしてはミューテックスかな

2013年2月26日火曜日

どっかの大学の課題

課題を拾ってきて適当にやってみた。
こういうのって結構、教授とか調べてると思うんだけど。。。
http://oshiete.goo.ne.jp/qa/7965391.html
魚拓
http://megalodon.jp/2013-0226-1945-34/oshiete.goo.ne.jp/qa/7965391.html
切れててか題名がわからないけど、たぶん「3桁のクジ引きプログラム」かな?


import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

//@author aki
//2013 - 02 - 26

//抽選アプリケーション 
//仕様
//・「抽選」ボタンを出すたびに0~999までの間の数値をランダムで画面に出力する。
//・「3つの数値」「抽選」ボタンは画面中央へ「リセット」ボタンはなるべく端へ設置する。

public class Kadai001 extends JFrame {
 private JLabel numLabel[];
 private JButton cyusenB;
 private JButton resetB;
 private int[] numbox;

 //constructor
 public Kadai001() {
  super("抽選");//親クラスのコンストラクタ
  this.setDefaultCloseOperation(EXIT_ON_CLOSE);
  setSize(300, 400);
  //仕様内容から出題者の意図を理解したところ、
  //Layoutの課題だと予測され、Layoutを多用したほうがいいと思われる。
  setLayout(new BorderLayout());

  JPanel content = (JPanel) getContentPane();
  JPanel center = new JPanel(new FlowLayout());
  content.add("Center", center);
  JPanel south = new JPanel(new BorderLayout());
  content.add("South", south);

  //variable
  Font font = new Font(Font.SANS_SERIF, Font.BOLD, 150);
  numLabel = new JLabel[3];
  for (int i = 0; i < 3; i++) {
   numLabel[i] = new JLabel(Integer.toString(i));
   numLabel[i].setFont(font);
   center.add(numLabel[i]);
  }
  cyusenB = new JButton("抽選");
  center.add("South", cyusenB);
  resetB = new JButton("Reset");
  south.add("West", resetB);

  //listener
  cyusenB.addActionListener(new ActionListener() {
   public void actionPerformed(ActionEvent event) {
    Random rnd = new Random();
    for (int i = 0; i < 3; i++) {
     makeNumBox(i);
     numLabel[i].setText(Integer.toString(numbox[rnd.nextInt(100)]));
    }
   }
  });
  resetB.addActionListener(new ActionListener() {
   public void actionPerformed(ActionEvent event) {
    for (int i = 0; i < 3; i++)
     numLabel[i].setText(Integer.toString(i + 1));
   }
  });
 }

 //遊び心
 private void makeNumBox(int count) {
  numbox = new int[100];
  int num1 = -1, num2 = -1;
  if (count == 1) {
   num1 = Integer.parseInt(numLabel[0].getText());
  } else if (count == 2) {
   num1 = Integer.parseInt(numLabel[0].getText());
   num2 = Integer.parseInt(numLabel[1].getText());
  } else {
   for (int i = 0; i < 100; i++) {
    numbox[i] = i / 10;
   }
   return;
  }
  Random rnd = new Random();

  //1回目,2回目に出た数字を出にくくする
  for (int i = 0, num = 0; i < 100; i++) {
   if (i / 10 == num1) {
    if (i - (i / 10) * 10 == 0) {
     num = i / 10;
    } else {
     num = rnd.nextInt(10);
    }
   } else if (i / 10 == num2) {
    if (i - (i / 10) * 10 == 0) {
     num = i / 10;
    } else {
     num = rnd.nextInt(10);
    }
   } else {
    num = i / 10;
   }
   numbox[i] = num;
  }
 }

 public static void main(String[] args) {
  // TODO 自動生成されたメソッド・スタブ
  new Kadai001().setVisible(true);
 }

}

JavaでMP3を再生(2013/02/26修正)

http://akis-i.blogspot.jp/2012/09/javamp3.html
のソースコードの修正です。

以下修正内容
・変数名が気持ち悪い
・BufferedInputStreamをつかいシークを実装しようと思えばできるようにした。

問題点&いつか直す
・メソッドがきもい
・音量の調節ができない
・メモ帳でいじったからもしかしたらバグがあるかも・・・
・修正とかいっときながら雑
・変数の使い捨て前提

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.net.URL;

import javazoom.jl.player.Player;
import frame.compornent.PlayerCompornent;

public class MP3Player extends Thread {
 // variable
 private Player player;
 private BufferedInputStream stream;
 private boolean run;
 private long filesize;

 public MP3Player() {
 }


 public void setFile(String file) {
  try {
   stream = new BufferedInputStream((new FileInputStream(file)));
   player = new Player(stream);
  } catch (Exception e) {
  }
 }

 public void setFile(URL url) {
  try {
   filesize = url.openConnection().getContentLength();//ファイルサイズ取得
   stream = new BufferedInputStream((url.openStream()));
   player = new Player(stream);
  } catch (Exception e) {
  }
 }

 public void start() {
  run = true;
  super.start();
 }

 public void stopMusic() {
  try {
   if (player != null) {
    player.close();
   }
   if (stream != null) {
    stream.close();
   }
   
  } catch (Exception e) {
   System.out.println("IOException");
  } finally {
   setStopper();
  }
 }

 public void setStopper() {
  player = null;
  stream = null;
  run = false;
 }

 public void run() {
  if (stream == null || player == null || !run) {
   stopMusic();
  } else {
   try {
    player.play();
   } catch (Exception e) {
    System.out.println("JavaLayerException");
   } finally {
    stopMusic();
   }
  }
 }

 public boolean isRun() {
  return run;
 }

 public BufferedInputStream getStream() {
  return stream;
 }

 public long getFilesize() {
  return filesize;
 }

}


}
a

2013年2月18日月曜日

JTableにコンポーネントを乗せたい


参考になったサイト様
http://t2wonderland.blogspot.jp/2012/05/javaswing-jtablejprogressbar.html

以下、いつかJTableで何か書いたらソースを乗せます

2013年2月8日金曜日

Eclipse Marketplace error

Eclipse Marketplaceで、
java.lang.reflect.InvocationTargetException
とでてしまった。

http://stackoverflow.com/questions/10562012/eclipse-marketplace-error
を見つけて気がついたのは、Eclipseにproxyを通しているかも知れないことだ。

案の定、ネットワークの設定を見たところ、proxyの設定があったのでオフにしておいた。


2013年1月7日月曜日

ひゃあほおおおあおあおおさおあおおあ

JOSE RAMIREZ C650Pがきたああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああ

やうううでゃdぽふhwさfじゃうぇfすふ
せうてきあwせjrうぇふぁ
えふぁwgjmp;