Viを開かないで管理者権限のファイルに書き込む

今週からようやく梅雨らしくなってきました。紫陽花がいい色になって少し嬉しい今日この頃です。

さて季節とは全く関係ないのですが、今日たまたまこちらの記事「MacからNASとかWindowsの共有フォルダへのアクセスが妙に遅いのを解決する」を見ていて気づいたことがありました。

Viは難しい

近年Macを使う人がとても増えましたよね。MacはサーバOSとしてよく使われるLinuxをベースにしていますので、少し特別なシステム設定を変更したいとき、多くの人にとってはあまり馴染みの無い、ターミナルを開いて操作をしなければならない場面があります。

それがその記事で紹介されているような、/etc/sysctl.conf というファイルに net.inet.tcp.delayed_ack=0 という文字を書き込むといった操作ですね。具体的にviというエディタでファイルを開いて編集する手順が紹介されていることも、同様に多いです。

こういった場合、サーバのオペレーションに慣れている人はいいのですが、慣れない人にとってviという特殊なエディタを使うことはひどく敷居が高いと思います。その記事のコメント欄もviの使い方説明になってしまっていたほど、ちょっと普通の「メモ帳」とか「テキストエディット」とかとは操作の仕方が違うのです。

teeを使う

それよりはただ1行追記するだけでよいのであれば、ターミナルから以下のように入力します。(エンターキーを押した後、パスワードの入力も必要です)

echo 'net.inet.tcp.delayed_ack=0' | sudo tee -a /etc/sysctl.conf

このようにすれば、例え書き込みにroot権限(強い管理者の権限)が必要なファイルであっても、viエディタを開くことなく追記することができます。

Javaで作るTCPサーバ(1.5)

こんばんは。梅雨に入ったというのに、全然雨が降らないですね。天気がいいのはとりあえず洗濯物にとってはいいことですが、あんまり降らないようだと今度は夏の水不足が心配になってきます。

ところで今日は前回の続きというか補足をします。最初はノンブロッキングAPIを使う方法を書くつもりでしたが、ちょっと気が変わりました(笑)。

ブロッキングモードとノンブロッキングモード

前回も少し触れた通り、ソケット通信を扱う方法として、ブロッキングモードとノンブロッキングモードというものがあります。簡単に言えば通信をする際にいちいちブロックするのがブロッキングモード、ブロックしないのがノンブロッキングモードです。

・・・それではあまり説明になっていないのでもう少し詳しく言いましょう。ネットワーク越しにデータを読み取ろうとしたり書き込もうとしたりする場合、それ相応の遅延が発生します。その遅延時間をどうするのかという違いがブロッキングモードとノンブロッキングモードの違いです。

ブロッキングモード
読み込みや書き込みを完了するまで待ちます。つまりコード上、readやwriteのメソッドをコールすると完了するまで制御はブロックします。
ノンブロッキングモード
「今できる処理だけをする」ことを基本にします。つまりコード上、readやwriteのメソッドをコールすると今読み取れるデータのみをreadし、或は今書き込めるデータのみをwriteして、すぐに制御が戻ります。

前回 Java SE 7 においてサーバソケットを扱う方法は3通りあると言いました。クラス名でいうなら、

  • java.net.ServerSocket
  • java.nio.channels.ServerSocketChannel
  • java.nio.channels.AsynchronousServerSocketChannel

この3通りです。前回使った ServerSocket はブロッキングモードで処理をします。2番目の ServerSocketChannel はブロッキングモードとノンブロッキングモードのどちらでも処理をすることができます。加えて効率の良いChannelクラスを使って読み書きできますので、ブロッキングモードで処理したい場合であってもJDK1.4以上の環境ならば、ServerSocket より ServerSocketChannel を使用することを考えた方がよいと思います。 Continue reading

転職のご報告

私はこの5月をもって株式会社TAGGYを辞し、6月より株式会社medibaに入社いたしました。ここにご報告いたします。

まずはお世話になっている皆様にお礼申し上げます。至らぬ点の多い私ですが、これまで仕事を続けてこられたのは皆様のご指導お力添えのお陰です。新天地にても今までに得てきたものを活かし、全てのビジネスに関して最高の技術的解法を提供することができるよう、努力して参ります。今後ともよろしくお願いいたします。

またこれから新しい立場でお世話になる皆様、不慣れ故何かとお手数ご迷惑をお掛けすることと存じます。一日も早く戦力となるべくキャッチアップしていくとともに、ビジネスの質と量を向上できるよう新しい視点で貢献して参りますので、何卒よろしくお願いいたします。

今回職場は変わりますが、Webに関わるエンジニアリングという職に変わりはありません。今後ともより良いWebを目指して私自身日々研鑽を続け、また知識共有を推進していく所存です。何かの機会にはお声掛け頂ければ幸いです。

最後に皆様に重ねてお礼申し上げ、略儀にて恐縮ながらご報告とさせて頂きます。

2013年6月
子安 輝

Scala for Java Programmers

今回の社内勉強会はScalaについてでした。

Scalaを理解すること、使ってみることは、Javaプログラマにとって様々なメリットがあります。限られた時間の中でScalaの全てを説明することはできませんが、Javaプログラマにあまり馴染みの無い概念である「関数型プログラミング」と「トレイト」について少し詳しく説明し、またコレクションの操作、並列処理モデルのアクターに触れています。

Javaで作るTCPサーバ(1)

このところ暖かい日が続いているなあと思っていたら、急に寒くなって喉の調子を悪くしました。

ところで最近、なぜかSocketからサーバを作る必要があってコードを書いたので、自分の中の整理も含め、JavaでTCPサーバを実装する方法についてまとめたいと思います。

Javaでサーバソケットを扱う

Java SE 7において、サーバソケットを扱う方法は3つあります。

  • まずはいわゆる普通のソケットAPIです。JDK1.0の時代からあるAPIで、(つまりこの旧き良きAPIは1996年から存在します) java.net.ServerSocket を使います。
  • 次に「ノンブロッキング」と呼ばれるモードで処理を行うAPIがあります。java.nio.channels パッケージにある、ServerSocketChannel と Selector を中心に使います。このAPIはJDK1.4で追加されました。
  • そして最後に、非同期で処理を行う最も新しいAPIがあります。これも java.nio.channels パッケージにある、AsynchronousServerSocketChannel を中心に使います。このAPIはJDK1.7で追加されました。

Continue reading

MapReduceで巨大データ同士をJOINする

立春をすぎて、暖かく感じる日も増えてきた今日この頃です。さて春といえばミツバチ、ミツバチといえばHiveですが、今日はHiveを使わないで純粋なMapReduceで、巨大データ同士をJOINするための一つの方法を書き留めたいと思います。

よくある問題

具体的に考えるために、状況を想定してみます。例えば以下の2つのテーブル、アクセスログ(日時,ユーザID,アクセスURL)とユーザマスタ(ユーザID,年齢,性別,住所)があるとします。これらのテーブルをユーザIDで結合したいとしましょう。

join tables

SQLで言えば次のような処理ということになります。

SELECT *
  FROM access_log
  LEFT OUTER JOIN user
  USING (user_id);

つまり何ということはない普通のJOINなのですが、この2つのデータがとても大きなものであるとき、私たちは問題に直面します。 Continue reading

Getting Started with Glassfish on Heroku

新年明けましておめでとうございます。今年もよろしくお願いいたします。私は今回の年末年始のお休みの間、なるだけPCを開かないでおこうと心に決めていたのですが、前々から気になっていたHerokuを少しだけ触ってみようかな、などど思い立ってしまいました。

さて、HerokuにはJava・Ruby on Rails・Python/Djangoなど、いくつかのWebアプリケーション実行環境が用意されています。JavaのWebアプリケーションを実行するために、Herokuの公式ドキュメントではJettyを使用していますが、ここはGlassfishを動作させてみましょう。jarファイル1個で起動できるEmbedded Glassfishを使用します。

プロジェクトを作成してローカル環境で実行する

Mavenを使ってビルドを行いますので、まずはpom.xmlを作成します。packagingはwarとし、maven-war-pluginには以下のようにweb.xml不要の設定をします。

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-war-plugin</artifactId>
    <version>2.3</version>
    <configuration>
        <failOnMissingWebXml>false</failOnMissingWebXml>
    </configuration>
</plugin>

さらに以下のdependencyを追加します。

<dependency>
    <groupId>org.glassfish.main.extras</groupId>
    <artifactId>glassfish-embedded-all</artifactId>
    <version>3.1.2.2</version>
</dependency>

次にGlassfishを起動するクラスを作成します。リッスンポートは環境変数から取得するように設定しています。 Continue reading

Garbage Collection for Dummies

Garbage Collection (GC) についての勉強会を行いました。その資料を公開します。

内容は以下の通りです。

  1. JVM & GC – JVMのヒープとGCの基本
    • heap in JVM
    • Garbage Collection
    • stop the world
    • Generational GC
  2. Collectors in HotSpot JVM – HotSpot JVMが備えるGCを総ざらい
    • throughput & low-latency
    • 5 Collectors
  3. Ergonomics & Tuning – エルゴノミクスとGCチューニング初めの一歩
    • Ergonomics
    • JVM options
    • command line tools

Re: Javaでのパターンマッチを考える

@kis さんのエントリ「Javaでのパターンマッチを考える」がとても興味深かったので、私も書いてみました。

ユーティリティクラスを使って解決することにしたらどうでしょう?

Scalaの記法をよく見て、なるべく似たような形になるようにクラス構造を考えました。
caseなどのキーワードに当たる部分はstaticメソッドで乗り切り、マッチした際に実行されるコードブロックはインナークラスを使って表現します。 Continue reading

アノテーションのインスタンスを取得する

このエントリはJava Advent Calendar 2012の第19日目のエントリです。
昨日は @yoshioterada さんの「Concurrency Update (jsr166e)のご紹介」でした。
明日は @kis さんの「Javaでのパターンマッチを考える」です。

お二人に挟まれて、私は自分の少し恥ずかしい話をします。今日のテーマはアノテーションのインスタンスについてです。

事の起こり

私はある日、こういうメソッドに出くわしました。

select(Annotation...)

なるほどAnnotationクラスを引数として渡すのね、と初めは軽く考えてしまったのですが、実際にこのメソッドを呼ぼうとしたとき困りました。

最初に書いたコードはこうです。(笑

select(@Customized);

コンパイルエラーになりました。というかEclipseなので赤線が出ました。ここでアレっ?と思ったわけです。そこでコードを次のように直してみました。

select(Customized.class);

それでもやっぱり赤線が出ます。おや? メソッドが呼べない! もう大混乱です。

Annotationクラスって何でしょう

メソッドの定義がおかしいのでしょうか。いやいや、呼べないようなメソッドが定義されているはずはないので(なにしろJavaEEのAPIです)、私のコードが間違っている可能性の方が極めて高いです。頭を冷やしてよく考えてみましょう。

アノテーションでよく使うのはこういうコードですよね。

@Override
public String toString() {
     // ...
}

この@Overrideはアノテーションによる注釈付けをするときの書き方なわけです。

ではCustomized.classは・・・? 変数に代入してみるとよくわかります。

Class<Customized> type = Customized.class;

なるほど、Customized.classはCustomizedクラスを表すクラスインスタンスです。

とするとAnnotationクラスはどういった場面で登場するのでしょうか。こういうときは初心に帰って、Java docを開いてみます。java.lang.annotation.Annotationインターフェースの「使用」を見てみると、Class#getAnnotations()というメソッドの戻り値がAnnotation[]になっています。リフレクションですね。

@Customized
public class ObtainAnnotation {
     public static void main(String[] args) {
          Annotation[] annotations
               = ObtainAnnotation.class.getAnnotations();

          for (Annotation a : annotations) {
               System.out.println(a);
          }
     }
}
@Customized()

ようやく分かってきました。アノテーションによって注釈付けされた要素に付いている、実際のアノテーションを表すのがAnnotationクラスのインスタンスです。 Continue reading