うなすけとあれこれ

2014年03月20日

HTC J butterfly(HTL21)のダウングレードからROM焼きまで

だいぶ前にやったのを思い出しながら書いてるので間違っている可能性があります。実行は自己責任で。

用意するもの

※リンク貼ってないものについては自力で

ダウングレード

au HTL21 HTC J butterfly 1.36.970.1から1.15.970.1へのダウングレードについて (HTC速報Dev) ここを参考にやりました

ROM焼き

HTC J butterfly 対策版1.29.970.1 / INFOBAR A02のS-OFFが可能に、新S-OFFツール「revone」DLX向けが公開、利用してみた。 HTL21 HTC J butterfly Sense 5 ポートROMについて (HTC速報Dev) ここを参考に

というか

どうやってやったのか全く覚えてない自分がいる…… SuperCIDは2の連続にした記憶がある。あとHTCのデベロッパーも登録もした。

2014年03月20日
2014年03月17日

Shure SE215 Special Editionを買って、なくした

写真

なくした なくたんだ ポーチがなかなかいい感じ

音の印象

低音はいい。振動してるのが耳で感じられる。でも低音だけ鳴ってるんじゃなくて全体的に聞こえる。(ボワっとしてない)

おすすめする点

音漏れを気にしなくていい 耳が痛いくらいの音量になっても隣の人にはほとんど聞こえてなかったくらい音漏れが少ない。電車の中で大音量で聞いてても安心できる。

でも、なくした……

2014年03月17日
2014年03月13日

Macでpkgからインストールしたアプリケーションを削除するpkgUninstallerを作りました

pkgUninstaller

pkgからのインストール

Macでpkgからアプリケーションのインストールをした時に、アンインストーラがついてくるものとついてこないものがあります。 ただ.appを削除すればいいというものではなく、他のディレクトリにもいろいろインストールしてくれるので不要なファイルが残ります。

pkgutil

pkgutilコマンドを使えば、そのアプリケーションがどのようなファイルをどこにインストールしたのかがわかります。アンインストールするコマンドオプションもあったようですが、現在は削除されています。 参考:新・OS X ハッキング! (94) pkgutilでインストーラパッケージを削除する マイナビニュース

pkgUninstaller

上リンクでもスクリプトを用いてアプリケーションのアンインストールを行う方法を解説してはいますが、見る限りどうも怪しいです。 そこで、Rubyの勉強も兼ねて、pkgからインストールしたアプリケーションのアンインストールを行うpkgUninstaller.rbを作りました。 unasuke/pkgUninstaller

使い方

こちらでも動作のテストはしていますが、予期せぬシステムの破損やデータの消去が発生する可能性があります。実行は自己責任でお願いします。 まず、-sコマンドを用いてアンインストールするパッケージのIDを探します。部分一致で判定するので、メーカー名やアプリケーション名(アルファベット)を入力して下さい。 例

$ ruby pkgUninstaller.rb -s goo
shell(#<Th:0x007fcf090bc8b0>): /usr/sbin/pkgutil --pkgs
com.google.pkg.GoogleJapaneseInput
com.google.pkg.GoogleVoiceAndVideo
com.google.pkg.Keystone

お目当てのパッケージIDが見つかったら、-uコマンドでアンインストールを行います。まずは、–noopもつけて、実際にどのようなファイルやディレクトリが削除されようとしているのかを確認して下さい。 例

$ ruby pkgUninstaller.rb -u com.google.pkg.GoogleJapaneseInput -n
delete /Library/Input Methods/GoogleJapaneseInput.app/Contents/Resources/GoogleJapaneseInputConverter.app/Contents/Frameworks/GoogleBreakpad.framework/Versions/A/Resources/Reporter.app/Contents/Resources/English.lproj/Localizable.strings
delete /Library/Input Methods/GoogleJapaneseInput.app/Contents/Resources/GoogleJapaneseInputRenderer.app/Contents/Frameworks/GoogleBreakpad.framework/Versions/A/Resources/Reporter.app/Contents/Resources/English.lproj/Localizable.strings
delete /Library/Input Methods/GoogleJapaneseInput.app/Contents/Resources/GoogleJapaneseInputTool.app/Contents/Frameworks/GoogleBreakpad.framework/Versions/A/Resources/Reporter.app/Contents/Resources/English.lproj/Localizable.strings
delete /Library/Input Methods/GoogleJapaneseInput.app/Contents/Resources/GoogleJapaneseInputConverter.app/Contents/Frameworks/GoogleBreakpad.framework/Versions/A/Resources/Reporter.app/Contents/Resources/English.lproj/Breakpad.nib
delete /Library/Input Methods/GoogleJapaneseInput.app/Contents/Resources/GoogleJapaneseInputRenderer.app/Contents/Frameworks/GoogleBreakpad.framework/Versions/A/Resources/Reporter.app/Contents/Resources/English.lproj/Breakpad.nib
delete /Library/Input Methods/GoogleJapaneseInput.app/Contents/Resources/GoogleJapaneseInputTool.app/Contents/Frameworks/GoogleBreakpad.framework/Versions/A/Resources/Reporter.app/Contents/Resources/English.lproj/Breakpad.nib
delete /Library/Input Methods/GoogleJapaneseInput.app/Contents/Resources/GoogleJapaneseInputConverter.app/Contents/Frameworks/GoogleBreakpad.framework/Versions/A/Resources/Reporter.app/Contents/Resources/ReporterIcon.icns
中略
delete /Applications/GoogleJapaneseInput.localized
/Applications/GoogleJapaneseInput.localized is not empty.
delete /Library/Input Methods
/Library/Input Methods is not empty.
delete /Library/LaunchAgents
/Library/LaunchAgents is not empty.
delete /Applications
/Applications is not empty.
delete /Library
/Library is not empty.
160 files and 0 directories deleted.

ほにゃららis not empty.と書かれているディレクトリは、中身が空でないため削除されないディレクトリです。(実際の実行ではないため、本当に削除されないことを保証するものではありません)

それでは実際にアンインストールを行いますが、この時、管理者権限で実行しないとパッケージの情報の削除を行わないままファイルの削除がなされるため、えらいことになります。どんなことになるのかは僕も怖くてやったことがないのでわかりません。 例

$ sudo ruby pkgUninstaller.rb -u com.google.pkg.GoogleJapaneseInput
delete /Library/Input Methods/GoogleJapaneseInput.app/Contents/Resources/GoogleJapaneseInputConverter.app/Contents/Frameworks/GoogleBreakpad.framework/Versions/A/Resources/Reporter.app/Contents/Resources/English.lproj/Localizable.strings
delete /Library/Input Methods/GoogleJapaneseInput.app/Contents/Resources/GoogleJapaneseInputRenderer.app/Contents/Frameworks/GoogleBreakpad.framework/Versions/A/Resources/Reporter.app/Contents/Resources/English.lproj/Localizable.strings
delete /Library/Input Methods/GoogleJapaneseInput.app/Contents/Resources/GoogleJapaneseInputTool.app/Contents/Frameworks/GoogleBreakpad.framework/Versions/A/Resources/Reporter.app/Contents/Resources/English.lproj/Localizable.strings
delete /Library/Input Methods/GoogleJapaneseInput.app/Contents/Resources/GoogleJapaneseInputConverter.app/Contents/Frameworks/GoogleBreakpad.framework/Versions/A/Resources/Reporter.app/Contents/Resources/English.lproj/Breakpad.nib
delete /Library/Input Methods/GoogleJapaneseInput.app/Contents/Resources/GoogleJapaneseInputRenderer.app/Contents/Frameworks/GoogleBreakpad.framework/Versions/A/Resources/Reporter.app/Contents/Resources/English.lproj/Breakpad.nib
中略
delete /Applications/GoogleJapaneseInput.localized
/Applications/GoogleJapaneseInput.localized is not empty.
delete /Library/Input Methods
/Library/Input Methods is not empty.
delete /Library/LaunchAgents
/Library/LaunchAgents is not empty.
delete /Applications
/Applications is not empty.
delete /Library
/Library is not empty.
160 files and 52 directories deleted.

これでアンインストールが完了しました。それでも削除しきれないディレクトリなどが残ることがあるので、明らかに不要だと思われるものは手動で削除して下さい。

コマンドオプション

–serach(-s)

パッケージのIDを検索します。部分一致で検索します。

–unlink(-u)

インストールされたファイルとディレクトリを削除します。

–noop(-n)

–unlinkオプションと併用した時、ファイルとディレクトリの変更、及びパッケージ情報の削除を行いません。最後に削除されたファイル、ディレクトリ数を出力しますが、これは–noopオプション無しの実行と必ずしも一致しません。

–quiet(-q)

–unlinkオプションと併用した時、削除されるファイルとディレクトリの名前、ディレクトリが空かどうかなどの情報を出力しません。削除されたファイル、ディレクトリ数は出力します。

–help(-h)もしくはオプション無し

オプション一覧を出力します。

最後に

アンインストーラが付属する場合(virtualboxなど)は付属のそれを使って下さい。

2014年03月13日
2014年03月06日

Windowsの「スナップ」をMacでもできるようになる「Shiftit」

WindowsがMacに優っている点

といえば、「スナップ」が挙げられるでしょう。 スナップ - Microsoft Windows 画面の端にウィンドウを持って行くと、自動でウィンドウのリサイズを行ってくれる機能。これがMacでも使えたら……

Shiftit

Shiftitを使えば、スナップがMacでも使えるようになります。 検索すると、Google Codeのページを紹介しているサイトが多いですが、今はgithubに移っているようです。 ここからダウンロードしてインストールすれば動作します。更新が1年前なのが気になるけど。

使い方の様子

controlとoption(alt)と⌘(command)と矢印などの同時押しでウィンドウのリサイズを行います。 コマンドはメニューバーのShiftitのアイコンをクリックすることで確認することができます。

2014年03月06日
2014年03月04日

MacBookのXcodeでプログラミングをする人のためのBBUDebuggerTuckAway

Xcodeは素晴らしいIDEです

Xcodeは補完の強力な、iOS開発には欠かせない素晴らしいIDEです。が、MacBookで使うとなると、どうしても気になってくるのが画面の狭さですね。 画面が狭い

BBUDebuggerTuckAway

BBUDebuggerTuckAwayは、入力を開始するとデバッグエリアを自動的に隠してくれるソフトウェアです。

インストール方法

まず、適当なフォルダを作ります。~/workspaceでもなんでも。

$ mkdir ~/workspace

次に、githubのプロジェクトをコピーします。

$ cd ~/workspase
$ git clone https://github.com/neonichu/BBUDebuggerTuckAway.git

gitが入ってない場合やめんどくさい場合はgithubのDownload ZIPからZIPファイルをダウンロードして解凍すればまあ同じことです。ここからもダウンロードできます(Download ZIPへの直リンク) そしたらフォルダ内の.xcodeprojファイルを開いて…… これを開く そしたらコンパイルしてXcodeを再起動すると…… こうする このように、入力開始とともにデバッグエリアが自動的に隠れます。

2014年03月04日
2014年02月24日

vim-gnomeとvim-gtkの違い

vimの種類 vimが入っていないと、このようにインストールを促される。 これらのvimの違いはなんだろうか?

vim

vim。

vim-nox

GUIのないvim。今欲しいのはこれじゃない。

vim-tiny

コンパクトなvim。これも今欲しいものじゃない。ってかubuntu系ならデフォで入ってる。

vim-athena

vim-athena ちょっとお引き取り願えますか。

vim-gnome

vim-gnome うん。これが欲しかったんだ。

vim-gtk

vim-gtk えっ、さっきのと何が違うん?

vim-gnomeとvim-gtkの違い

apt-cacheでそれぞれの違いを見てみよう。(少し整形) vim-gnome

Package: vim-gnome Priority: extra Section: editors Installed-Size: 2530 Maintainer: Ubuntu Developers ubuntu-devel-discuss@lists.ubuntu.com Original-Maintainer: Debian Vim Maintainers pkg-vim-maintainers@lists.alioth.debian.org Architecture: amd64 Source: vim Version: 2:7.4.000-1ubuntu2 Provides: editor, gvim, vim, vim-lua, vim-perl, vim-python, vim-ruby, vim-tcl Depends: vim-gui-common (= 2:7.4.000-1ubuntu2), vim-common (= 2:7.4.000-1ubuntu2), vim-runtime (= 2:7.4.000-1ubuntu2), libacl1 (>= 2.2.51-8), libbonoboui2-0 (>= 2.15.1), libc6 (>= 2.15), libgdk-pixbuf2.0-0 (>= 2.22.0), libglib2.0-0 (>= 2.12.0), libgnome2-0 (>= 2.17.3), libgnomeui-0 (>= 2.22.0), libgpm2 (>= 1.20.4), libgtk2.0-0 (>= 2.24.0), libice6 (>= 1:1.0.0), liblua5.2-0, libpango-1.0-0 (>= 1.14.0), libperl5.14 (>= 5.14.2), libpython2.7 (>= 2.7), libruby1.9.1 (>= 1.9.2.0), libselinux1 (>= 1.32), libsm6, libtinfo5, libx11-6, libxt6, tcl8.5 (>= 8.5.0) Suggests: cscope, vim-doc, ttf-dejavu, gnome-icon-theme Filename: pool/main/v/vim/vim-gnome7.4.000-1ubuntu2amd64.deb Size: 1084468 MD5sum: b6989046fc1929c55752133fc2f58417 SHA1: 776f256a6b7c2cb88d737e2006f4056456ca6266 SHA256: fd6f7bed4bfdaa13be8b24d3b738f309efb72b93818afd0effa047cc1530ec14 Description-ja: Vi IMproved - enhanced vi editor - with GNOME2 GUI Vim は、UNIX エディタ Vi のほぼ互換版です。 . 多くの新機能が追加されています: 多レベル undo、文法強調、コマンドライン 履歴、オンラインヘルプ、ファイル名補完、ブロック操作、畳み込み、Unicode 対応など。 . This package contains a version of vim compiled with a GNOME2 GUI and support for scripting with Lua, Perl, Python, Ruby, and Tcl. Description-md5: cd4a76134bce59404c52749b68c94208 Homepage: http://www.vim.org/ Description-md5: cd4a76134bce59404c52749b68c94208 Bugs: https://bugs.launchpad.net/ubuntu/+filebug Origin: Ubuntu Supported: 9m

vim-gtk

Package: vim-gtk Priority: extra Section: universe/editors Installed-Size: 2526 Maintainer: Ubuntu Developers ubuntu-devel-discuss@lists.ubuntu.com Original-Maintainer: Debian Vim Maintainers pkg-vim-maintainers@lists.alioth.debian.org Architecture: amd64 Source: vim Version: 2:7.4.000-1ubuntu2 Provides: editor, gvim, vim, vim-lua, vim-perl, vim-python, vim-ruby, vim-tcl Depends: vim-gui-common (= 2:7.4.000-1ubuntu2), vim-common (= 2:7.4.000-1ubuntu2), vim-runtime (= 2:7.4.000-1ubuntu2), libacl1 (>= 2.2.51-8), libc6 (>= 2.15), libgdk-pixbuf2.0-0 (>= 2.22.0), libglib2.0-0 (>= 2.12.0), libgpm2 (>= 1.20.4), libgtk2.0-0 (>= 2.24.0), libice6 (>= 1:1.0.0), liblua5.2-0, libpango-1.0-0 (>= 1.14.0), libperl5.14 (>= 5.14.2), libpython2.7 (>= 2.7), libruby1.9.1 (>= 1.9.2.0), libselinux1 (>= 1.32), libsm6, libtinfo5, libx11-6, libxt6, tcl8.5 (>= 8.5.0) Suggests: cscope, vim-doc, ttf-dejavu, gnome-icon-theme Filename: pool/universe/v/vim/vim-gtk7.4.000-1ubuntu2amd64.deb Size: 1084618 MD5sum: 5a27b6e1f70a2848a0787e81d89fa57c SHA1: cbe534640d1977e77874776b92f1be93125019b1 SHA256: cfcb6c33b3dfa119d7fdc79a9397cb0493b172fc4748e280c28b840616a9dd4a Description-ja: Vi IMproved - 強化版 vim エディタ - GTK2 GUI 付き Vim は、UNIX エディタの Vi とほぼ互換のバージョンのエディタです。 . 多くの新機能が追加されています: 複数回のアンドゥ、構文の強調、コマンド ライン履歴、オンラインヘルプ、ファイル名補完、ブロック操作、畳み込み、 Unicode 対応など。 . 本パッケージには GTK2 GUI と、Lua や Perl、Python、Ruby、Tcl でのスクリプ ティングのサポート付きでコンパイルされたバージョンの vim が含まれます。 Description-md5: 2c68094b1efcc4728d91370c494d0111 Homepage: http://www.vim.org/ Description-md5: 2c68094b1efcc4728d91370c494d0111 Bugs: https://bugs.launchpad.net/ubuntu/+filebug Origin: Ubuntu

よく見ないとわからないが、依存するライブラリで差が生まれている。 vim-gnomeのほうが依存するライブラリが多く、libbonoboui2-0libgnome2-0ibgnomeui2-0 がvim-gtkで必要なライブラリに加えてインストールされる。 (どれもGNOME関係のライブラリ)

どっちがいいのか

KDEやxfceなどのgnome以外のウィンドウマネージャを使っているならvim-gtk gnome系ならどちらでもいい ……と思う。僕はvim-gtkにした。

2014年02月24日
2014年02月08日

JavaのSocketを用いたテキスト、ファイルの送受信

ソケット通信でファイル転送その2を参考に、JavaのSocketを用いてテキストの送受信、ファイルの送受信を行うプログラムを作成した。 Java初心者なので「これはおかしい」「これはいくらなんでも変だ」「こんな書き方は許せない」などがあるのは許してほしい。

サーバ側プログラム(FileSendServer.java)

コード

import java.io.*;   //入出力ストリーム
import java.net.*;  //socket

public class FileSendServer{

  /************************定数宣言***********************/
  public static final int INPUT_STREAM_BUFFER = 512;    //入力ストリーム格納バッファサイズ
  public static final int FILE_READ_BUFFER = 512;   //ファイル読み込みバッファサイズ

  //引数は使用しない
  public static void main(String[] args){

    ServerSocket servSock = null;
    Socket sock;    //socket通信

    OutputStream outStream; //送信用ストリーム
    InputStream inStream;   //受信用ストリーム
    FileInputStream fileInStream; //ファイルを読むためのストリーム
    byte[] inputBuff = new byte[INPUT_STREAM_BUFFER];   //クライアントからのコマンド入力を受け取る
    byte[] fileBuff = new byte[FILE_READ_BUFFER];   //ファイルから読み込むバッファ

    String absolutePath = new File(&quot;&quot;).getAbsolutePath();
    File file = new File(absolutePath); //カレントディレクトリでインスタンス作成
    String[]    fileList = file.list(); //カレントディレクトリのファイル名取得
    Boolean hiddenFileFlag; //隠しファイルフラグ
    Boolean lsFlag;
    int recvByteLength;

    //大きすぎるtryは身を滅ぼす
    try
    {

      //6001番ポート
      servSock = new ServerSocket(6001);

      //ソケットに対する接続要求を待機
      sock = servSock.accept();

      //入出力ストリーム設定
      outStream = sock.getOutputStream();
      inStream = sock.getInputStream();

      //コマンドの入力があった場合に行う処理(1文字以上読みこんだとする)
      while( (recvByteLength = inStream.read(inputBuff))  != -1 )
      {
        //受け取ったbyte列をStringに変換(構文解析のため)
        String buff = new String(inputBuff , 0 , recvByteLength);

        //スペースで区切り格納し直す(sscanfのような)
        String[] getArgs = buff.split(&quot;\\s&quot;);


        /************************コマンド解析*********************/
        //lsの場合
        if( getArgs[0].equals(&quot;ls&quot;) )
        {
          //ファイル(フォルダ)数繰り返す
          for( int i = 0;  i < fileList.length; i++)
          {
            //String→byteに変換して送信
            outStream.write( fileList[i].getBytes() );
            outStream.write( &quot;\n&quot;.getBytes() );
          }
        }

        //getの場合
        if( getArgs[0].equals(&quot;get&quot;) )
        {               
          //受け取ったファイル名のファイルを読み込むストリーム作成
          fileInStream = new FileInputStream(getArgs[1]);
          int fileLength = 0;
          //System.out.println(&quot;Create stream &quot; + getArgs[1] );

          //最大data長まで読み込む(終端に達し読み込むものがないとき-1を返す)
          while( (fileLength = fileInStream.read(fileBuff)) != -1 )
          {
            //出力ストリームに書き込み
            outStream.write( fileBuff , 0 , fileLength );
          }

          //ファイルの読み込みを終える
          //System.out.println(&quot;Close stream &quot; + getArgs[1] );
          fileInStream.close();
        }

        //exitの場合
        if( getArgs[0].equals(&quot;exit&quot;) )
        {
          //ストリームを閉じる
          outStream.close();
          System.out.println(&quot;close server&quot;);
          break;
        }
      }

      //ソケットやストリームのクローズ
      //outStream.close();
      inStream.close();

      sock.close();
      servSock.close();

    }

    //例外処理
    catch( Exception e )
    {
      System.err.println(e);
      System.exit(1);
    }
  }
}

gist

動作説明

サーバ側は6001ポートで接続を待機する。接続確認後はクライアントからのコマンド送信まで待機。 コマンドを受信すると、スペースごとに区切り、引数として格納。 コマンドがlsの場合、実行されているフォルダのファイルの一覧をクライアント側に送信。 コマンドがgetの場合、2つ目の引数に格納されているファイルをクライアント側に送信。 コマンドがexitの場合、クライアントからの入力待ちループを抜ける。 ループを抜けたらsocketを閉じて終了する。

クライアント側プログラム(FileRecvCiant.java)

コード

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

public class FileRecvCliant{

  /***************************定数宣言***************************/
  public static final int INPUT_STREAM_BUFFER = 512;
  public static final int FILE_WRITE_BUFFER = 512;

  //引数として、サーバのIPアドレスとポート番号を要求する
  public static void main(String[] args){

    //引数エラー
    if( args.length != 2 ){
      System.err.println(&quot;argument error&quot;);
      System.exit(1);
    }

    OutputStream outStream; //送信用ストリーム
    InputStream inStream;   //受信用ストリーム
    FileOutputStream fileOutStream; //ファイルの書き込むためのストリーム

    byte[] inputBuff = new byte[INPUT_STREAM_BUFFER];   //サーバからのls出力を受け取る
    byte[] fileBuff = new byte[FILE_WRITE_BUFFER];      //サーバからのファイル出力を受け取る

    String command;         //キーボードからの入力を格納
    int recvFileSize;       //InputStreamから受け取ったファイルのサイズ
    int recvByteLength = 0; //受信したファイルのバイト数格納
    int waitCount = 0;      //タイムアウト用


    //キーボードからの入力受付
    BufferedReader keyInputReader = new BufferedReader( new InputStreamReader(System.in) );

    //tryが大きすぎる。訴訟も辞さない。
    try
    {
      //ソケットのコンストラクト
      Socket sock = new Socket( args[0] , Integer.parseInt(args[1]) );

      //ソケットが生成できたらストリームを開く
      outStream = sock.getOutputStream();
      inStream = sock.getInputStream();

      //ここからループ
      while(true)
      {
        //コマンド入力を促す
        System.out.print(&quot;cmd:&quot;);

        //キーボードからのコマンド入力
        command = keyInputReader.readLine();

        //スペースごとにコマンドを区切る
        String[] getArgs = command.split(&quot; &quot;);

        //キーボードからの入力をそのまま送信
        outStream.write( command.getBytes() , 0 , command.length() );


        /************************コマンド解析***********************/
        //lsの場合
        if( getArgs[0].equals(&quot;ls&quot;) )
        {
          waitCount = 0;
          //入力を文字列として表示
          while( true )
          {
            //ストリームから読み込める時
            if( inStream.available() > 0 )
            {
              //byte→Stringに変換して標準出力
              recvByteLength = inStream.read(inputBuff);
              String buff = new String( inputBuff );
              System.out.print( buff );
            }
            //タイムアウト処理
            else
            {
              waitCount++;
              Thread.sleep(100);
              if( waitCount > 10 )break;
            }
          }
        }

        //getの場合
        if( getArgs[0].equals(&quot;get&quot;) )
        {
          //引数で指定されたファイルを保存するためのストリーム
          fileOutStream = new FileOutputStream( getArgs[1] );
          waitCount = 0;

          //ストリームからの入力をファイルとして書き込む
          while( true )
          {
            //ストリームから読み込める時
            if( inStream.available() > 0 )
            {
              //受け取ったbyteをファイルに書き込み
              recvFileSize = inStream.read(fileBuff);
              fileOutStream.write( fileBuff , 0 , recvFileSize );
            }

            //タイムアウト処理
            else
            {
              waitCount++;
              Thread.sleep(100);
              if (waitCount > 10)break;
            }
          }

          //ファイルの書き込みを閉じる
          fileOutStream.close();

          //書き込み完了表示
          System.out.println( &quot;Download &quot;+ getArgs[1] + &quot; done&quot; );
        }

        //exitコマンド入力でwhileループを抜ける
        if( getArgs[0].equals(&quot;exit&quot;) )
          break;
      }

      //ストリームのクローズ
      outStream.close();
      inStream.close();
    }
    catch(Exception e)
    {
      //例外表示
      System.err.println(e);
      System.exit(1);
    }
  }
}

gist

動作説明

クライアント側は引数として受け取ったIPアドレスとポート番号に対して接続要求をかける。 接続が確認されると、ユーザからのコマンド入力を待ち、スペースごとに区切り、引数として格納。 コマンドがlsの場合、受け取ったデータをStringとして標準出力に表示する。 コマンドがgetの場合、2つ目の引数に格納されているファイル名で受け取ったデータを保存する。 コマンドがexitの場合、ループを抜ける。 ループを抜けたらsocketを閉じて終了する。 入力はタイムアウト制とする。(InputStreamのreadメソッドの返り値として-1が吐かれるのはストリームが閉じた時であるため)

ライセンス

こんなしょぼいコードにライセンスもクソもあったもんじゃないがあえて言うならMITで。

2014年02月08日
2014年02月07日

第13回さくらの夕べin鯖江に参加した

ATND 第13回さくらの夕べin鯖江 さくらの夕べ

公演について

福野さん「webの着こなし最前線」

高互換性コンピュータ言語XML←かっこいい でもまだデータ形式としてはXMLの先があるみたいで、RDFになればいいね!だったけどRDFについてはよくわからなかった。調べてもよくわからなかった。

さくらインターネット田中社長「世界最強!?石狩データセンターのひみつ」

正直、内容のほとんどはもらったパンフレットとかはてなでの見学記事に書いてあった。でも、これから高温超電導であれこれやっていくっていうのには夢というかロマンを感じた。つららパネェ。

ポテトサラダさん「脱ざんねんWebデザイン CSS編」

Speaker Deckで公開されてます。 CSSってすごい。改めてそう思った。やろうやろうって思ってるWordPressのテーマづくりにも活用したい……けどいつになることやら。

懇親会、LTについて

LTしたらさくらインターネットのシャツがもらえるっていうので行き当たりばったりでLTした。懇親会ではさくらインターネットの方と少しお話出来た。

感想

何もわからない状態で参加したのが惜しい。話の内容がさっぱりな部分もあって歯がゆかった。さくらのクラウド2万円券を頂いたので、とりあえずIaaSで何ができるのか手探りながら勉強していく前に進級したい。

2014年02月07日
2014年01月30日

MacでC/C++を書いてコンパイルするなら?(授業の課題程度)

コンパイラ

Macで使えるC/C++のコンパイラはgccとclangの2種類ある。どちらがどう優れているかは授業の課題軽度では比較できない。 あえておすすめするならAppleが力を入れているclangがいいのではないだろうか。

インストール

まずXcodeを立ち上げ、「Xcode」から「Preferences…」をクリックする。 手順1

設定画面が開くので、「Downloads」から「Command Line Tools」をダウンロード&インストールする。これでOK。 手順2

エディタ

Macを購入したら絶対に導入したい!私が3年間で厳選した超オススメアプリ10選! この記事に載っていないものでおすすめしたいのがmiである。 モードを設定すれば自動インデントもしてくれるし色分けもしてくれる。軽いのでささっと手軽なプロクラムを書くには向いているのではないだろうか。

コンパイルと実行

ここではclangのやり方で書くが、「clang」をそのまま「gcc」と書き換えても動く。 たとえばこんなコードを書いたとする。

#include<stdio.h>
int main( void )
{
    printf( "Hello World! );
    return 0;
}

これをコンパイルするには、

$ clang Test.c

とタイプする。 するとこんなエラーが出る。

$ clang Test.c
Test.c:4:13: warning: missing terminating '"' character [-Winvalid-pp-token]
    printf( "Hello World! );
    ^
Test.c:4:13: error: expected expression
1 warning and 1 error generated.

これを繰り返して何も表示されなくなったらコンパイル成功である。

#include<stdio.h>
int main( void )
{
    printf( "Hello World!\n" );
    return 0;
}

実行するには、

$ ./a.out

と入力する。すると

$ ./a.out
Hello World!
$

こうなる。 また、ここで-oオプションを使って、実行ファイルの名前を好きに設定できる。

$ clang Test.c -o Test
$ ./Test
Hello World!
$

C++をコンパイルするときは、コマンドを「clang++」(g++)に書き換える。 以上!

2014年01月30日
2014年01月17日

DELL AX510を買った

モニターアームを設置する前のこの写真と 設置前の机の様子

設置後のこの写真。何か欠けているものがある。 設置後の写真

スピーカーである。 今まで使ってきたスピーカー(サンワサプライ MM-SPL2)をこのまま使い続けるのもいいが、モニターアームと合わないので、ディスプレイに取り付けるスピーカーを買った。

買ったもの

DELL AX510 ディスプレイによってはACアダプタ付きのAX510PAを買う必要がある。

開封と設置

中身はこの半分しかない 半分の中身

ケーブルの長さは1.5mはある。 ケーブルの長さ

電源はディスプレイから取れる。 電源

ケーブルの取り回しをして設置完了。 設置完了

下がスッキリして見える。 設置後の全体像

感想

音質については評価できる耳を持ち合わせていないので何も言えないが、今までのスピーカーではヘッドホンを接続すると(無音時に)ノイズが聞こえていたが、これは聞こえないのでおそらく良いものなのだろう。

お年玉で買ったシリーズは終わり

2014年01月17日
新しい投稿
古い投稿