GIG

赴くままに技術を。

そういえばJava Day Tokyo 2014行ったんだった

出張先に「品川プリンスホテル」と書く後ろめたさたるや昨年と同じUDXで開催してくれたら良かったのに。会場めちゃくちゃ広かった…

f:id:hermesian:20140522100254j:plain

聞いた講演はこれ。 最後までいるつもりだったけど、仕事がスタックしてそうな予感がしたのと、 Lambda, Streamを触らず来てしまった場違い感から、Java SE8とJava EE 8の話だけ聞いておこうと。

  • [10:00 - 12:00] Keynote (Nandini Ramani / Cameron Purdy)
  • [13:30 - 14:20] Java SE 8概要 (Simon Ritter)
  • [14:35 - 15:25] JavaEE.Next():Java EE 7, 8, and Beyond (Reza Rahman)

発表資料一覧

http://www.oracle.com/us/dm/seo100304328-jp-jp-lw-ipi1-ev-2196625-ja.html

Keynote

話題はこらへん

  • Java SE 8リリース
  • IoT

Java Strategy Keynote (Nandini Ramani)

Javaの現状と未来について

  • Vice President, Java & IoT
  • 2000+ Registrants
  • Glassfishについては特に言及なし(keynoteにあるけど)
  • Javaプラットフォームの統合がミッション
    • APIが多様化してきた
  • Java ME8の言語としては、Java SE 8の部分集合 (APIは部分的に重なる)

IoTについて

  • データの増加
    • SNSの大量データ
    • 7.6 Billionの人口に対して50 Billionのデバイスがインターネットにつながっている
    • 2015 8000 EBが見込まれる
  • JavaはIoTにおいてもオープンなプラットフォームであり続ける
  • 小さなものから大きなものまで
  • SOCベンダと協力し、様々なデバイスも対応できる
    • Raspberry Pi
    • ARM
    • gemalto
    • freescale
    • ST
    • Qualcomm

PaPeRo (Shin Ishiguro, NEC)

  • コミュニケーションロボット(PaPeRo)
  • IoTのケーススタディ
  • クラウド(考える(集める・調べる))とロボットのセンシング(見る・感じる, 聞く・話す)

電子マネー決済端末 (Masaya Abuta, Panasonic)

  • Java ME Embeddedのショーケース
  • 電子マネー決済端末
    • 地味に聞こえるけど、業界的には増加傾向
    • 一つの端末に複数の電子マネーをのせる状況
    • ポイント等の販促サービスについてもサービスで必要
    • 300k stepの1/3がJava
    • 開発効率やセキュリティ面でJavaの利用が継続される

Java Strategy Keynote (Cameron Purdy, Senior Vice President, Product Development)

Java EEのロードマップについて説明

  • グーグルでの利用率も高い
  • Release June 2013
  • Major Field
    • HTML5 (WebSokets, JSON)
    • Easier Development
    • Enterprise (Batch, JMS)
  • Deliver More Apps to More Devices with Confidence
  • Positioning for the Future
    • Java EE 7 ; Develop Apps with HTML5
    • Java EE8 ; Cloud上でのアプリに即してセキュリティの強化

Java & Embedded Demonstration (Stephen Chin (Java Technology Ambassador JavaOne Content Chair)

f:id:hermesian:20140522111838j:plain

Java & Community (Simon Ritter, Head of Technology Evangelism)

  • Jav)One (September 28th - October 2nd)の開催通知。
  • 日本Java ユーザグループの紹介 (Yusuke Suzuki, Chairman JJUG)
    • JJUG(じぇーじゃぐと読むのは初めて知った) CCC 2014 Spring
      • 23セッション + 2ハンズオン
      • ユーザ主体の勉強会
      • 次回は秋
    • ナイトセミナー
      • 毎月第4水曜日19:00-21:00

Java SE 8概要(Simon Ritter, Head of Java Techonology Evangelism)

  • 何が新しいのか?
    • 3つのNew JSR
    • Update一杯
    • ガッツリ改良された

言語レベル

Core Library

パフォーマンスの向上 ベストプラクティスの取り込み

  • Concurency Update
    • 要はスレッドの性能を上げたというお話
  • Bulk Data Operation For Collections
    • java.util.stream
    • ストリームデータの処理を行える仕組みがでてきた
    • forループの入れ子でプログラムが汚くならない
    • Lambda記法で集計処理かいてなど柔軟な記述ができそう
  • Parallel Array Sorting
  • Data and Time API
    • new date, time API
  • JDBC 4.2
    • 特に目立った改修点はないとのこと。
  • Base64 Encoding and Decoding
    • 画像データの処理で利用?

Platform

  • Compact Profiles
    • Project Jigsaw(jarより便利な利用形態(モジュール)を作るプロジェクト)への布石

VM

  • Nashorn Javascript Engine
    • 既存の資産を流用しやすくするため、JavaJavascriptを処理できる仕組み

JavaEE.next() Java EE 7, 8, Beyond (Reza Rahman, Java EE/GlassFish Evangelist)

Java EE 7おさらい

  • 割愛
  • JavaEEでBatch作ったことなかったので、やってみよう

Java EE 8 ?

次はこの辺らしい

JSON Binding Security Simplication JCache Action-oriented Web framework/HTML 5 alignment (Struts 2みたい。JSFとは競合しない??)

NoSQLの取り回しの標準化があるかと思ったが、NoSQL自体の普及率の低さからまだやらないみたい。 やるなら、JPAベース。

なお、GlassFishは4.0.1からJava SE 8対応とのこと。 http://www.slideshare.net/iwasakihirofumi/future-of-java-ee-with-java-se-8 -> GlassFishまだ大丈夫?

Java Day Tokyo 2014 Togetter

http://togetter.com/li/670503

最適化計算をGAMSで行う

この分野について全くのド素人だけど、仕事で使いそうなので備忘録がてら書いていく。

この分野について

オペレーションズ・リサーチ(OR)は名前の通り、第2次世界対戦中に確立されたもので、あるシステムを管理する人に対して、適切な解を求めることを目的とする。最適化計算(数理計画法とも呼ばれる)は、ORの一つという位置づけである。

対象となる研究対象は、第6回 オペレーションズ・リサーチ(OR)---数学モデルを駆使して,経営戦略を立案する:ITproに分かりやすく概要が紹介されている。最適化計算の代表的な例題として、「巡回セールスマン問題」がある。これは複数の都市があった場合、どのような経路でセールスマンが巡回すれば、移動コストを最小化できるのかという解を求めるものである。

こういった問題をどのようにモデル化するか、どのようにそのモデルを解くかというのがこの分野の取り組む課題となる。

GAMSについて

先の最適化問題を解くにあたり、多次元配列をごりごりと計算することが必要になってくる。 幸いにして、いくつか最適化問題に特化したソフトウェアがある。

Mathematicaはもしかしたら大学等で利用していた人もいるかもしれない。競争力のない(金のない)研究室出身の私に取っては、うらやましいかぎり。

GAMS(General Algebraic Modeling System)は、Mathematicaと同様にモデリング言語と、その実行環境を提供するもの。しかし、個人的に利用する分であればライセンスは必要なさそう(扱える配列やソルバーといった機能制限があるみたいだが)。

日本語だとあまり情報見かけないので、 これから参考にしそうな情報のリンクを張っておく。。

GAMSのコードの構造

ユーザマニュアルのP.29にコードの構造が掲載されている。

GAMSのコードは、Data, Model, Solutionの記述に大別できる。 Dataは最適化計算で利用されるパラメータや定数である。Modelは最適化で良く目にする制約条件や他の計算式、最小化(または最大化)の対象式である目的関数が含まれる。最後のSolutionはModelをどのソルバで解くかと、何を結果として出力するかを定義する。

マニュアルに沿って、GAMSの構成要素を解説してみる。 おおよそのGAMSコードの構成は以下のようになっている。

  • Set(s) : 配列の添字を定義するブロック識別子
  • Data : Prameter(s), Table(s), Scalar(s)といったブロック識別子をまとめた概念で、要は入力値
  • Variable(s) : 最適化する際に選択肢となる変数(決定変数または内生変数)を定義するブロック識別子
  • Equation(s) : 数式や不等式を定義するブロック識別子。何を最小化(または最大化)するかを評価する式(目的関数)も含まれる
  • Model : どの式をモデルに含めるかを定義するブロック識別子
  • Solve : どのモデルを解くかと、どう解くか(線形計画法(lp)か、非線形計画法(nlp)か)および解くべき目的関数の識別名、最後に最大化するか、最小化するかを定義するブロック識別子

チュートリアルに掲載されている「輸送問題」を見てみる。

  • 農場(供給側)としてSeattle, San Diegoの2拠点がある
  • 市場(需要側)としてNew York, Chicago, Topekaの3拠点がある
  • 各農場、各市場間の距離がd(i, j)と決まっている
  • 供給量、需要量にそれぞれ制限が制約条件として課せられている
  • このとき、移動コストを最小限にするには、それぞれの農場からどこの市場に対してどの程度出荷すれば良いかを求める

ちなみに$titleは、モデルのタイトルを記述できる識別子。$ontext … $offtextは間に挟んだ文書がコメント扱いされる識別を表す。とりあえず、今はざっくり構成を把握して、詳細は別途調べとく。

$title Transport.gms
$ontext
This is tutorial model.
$offtext

Sets
         i canning plants / seattle, san-diego /
         j markets        / new-york, chicago, topeka /;

Parameters

         a(i) capacity of plant i in cases
           / seattle   350
             san-diego 600 /

         b(j) demand at market j in cases
           / new-york  325
             chicago   300
             topeka    275 /;

Table d(i,j) distance in thousands of miles
                    new-york chicago topeka
         seattle      2.5      1.7    1.8
         san-diego    2.5      1.8    1.4 ;

Scalar f freight in dollars per case per thousand miles /90/ ;

Parameter c(i, j) transport cost in thousands of dollars per case ;
          c(i, j) = f * d(i, j) / 1000 ;

Variables
         x(i, j) shipment quantities in cases
         z       total transportation costs in thousands of dollars ;

Positive Variable x;

Equations
         cost define objective function
         supply(i) observe supply limit at plant i
         demand(j) satisfy demand at market j ;

cost.. z =e= sum((i, j), c(i, j)*x(i, j)) ;
supply(i).. sum(j, x(i, j)) =l= a(i) ;
demand(j).. sum(i, x(i, j)) =g= b(j) ;

Model transport /all/ ;

Solve transport using lp minimizing z ;

Display x.l, x.m ;

GAMSのAPIを利用する

GAMSのAPIとして、Java, Phython, .NETが用意されている(C, C++など他もあるけどドキュメントが足りなそう)。.NETはドキュメントがPDFで提供されていないっぽい。

Javaを使って、上の問題を解くサンプルを動かしてみよう。 GAMSフォルダに移動すると、apifilesというディレクトリがある。 その配下に各言語向けのAPIやそれを利用する実装例が格納されている。

JavaAPIは[apifiles] > [Java] > [api]配下に格納されている。 また、上の輸送問題(Transport.gmsとする)を解くサンプルとして、[api]と同じ階層に[transport]があり、様々な実装例が紹介されている(それらを補足する説明がチュートリアルとして用意されている)。

それでは、pom.xmlの設定から始める。 GAMSに関係するところだけ。

簡単な輸送問題を解くクラスを作成

     <!— GAMSのインストールパスを設定 —>
    <properties>
        <gams.path>/Applications/GAMS/gams24.2_osx_x64_64_sfx</gams.path>
    </properties>

    <!-- GAMSJavaAPI.jar —>
    <dependencies>
    <dependency>
            <groupId>com.gams.api</groupId>
            <artifactId>GAMSJavaAPI</artifactId>
            <version>1.0</version>
            <scope>system</scope>
            <systemPath>${gams.path}/apifiles/Java/api/GAMSJavaAPI.jar</systemPath>
        </dependency>
</dependencies>

<build>
        <plugins>
            <!-- DLLを利用するために必要 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <configuration>
                    <workingDirectory>target</workingDirectory>
                    <argLine>-Djava.library.path=${gams.path}/apifiles/Java/api</argLine>
                </configuration>
            </plugin>
       </plugins>
</build>

上の輸送問題のモデル(transport.gms)を読み込んで、解くクラスは以下のようになる。

public class Transport {

     /**
     * Resource Bundle .
     */
    private static final ResourceBundle resource = ResourceBundle.getBundle("GAMSSetting");

    /**
     * GAMSジョブを実行するメソッド.
     */
    public void runJob() {

        System.out.println("check:" + resource.getString("WORKINGDIR"));
        System.out.println("check:" + resource.getString("GAMSDIR"));

        // ユーザの引数を与えて、GAMSWorkspaceインスタンスを生成する
        // 引数1 : Workingディレクトリを指定 (デフォルトだと, System.getProperty("java.io.tmpdir")で取得されたパス
        // 引数2 : GAMSのインストールディレクトリを指定 (デフォルトだと、環境変数PATHを見る)
        // 引数3 ; デバッグレベルを指定 (デフォルトだと、 OFF)
        GAMSWorkspace ws = new GAMSWorkspace(
                resource.getString("WORKINGDIR"),
                resource.getString("GAMSDIR"),
                GAMSGlobals.DebugLevel.OFF
        );
        // GAMSのモデルライブラリからtrnsportモデル(輸送モデル)を指定し、GAMSJobインスタンスを生成
        // TODO フルパスじゃないとダメみたい
        GAMSJob t1 = ws.addJobFromFile(resource.getString("INPUTGAMSFILE"));

        // t1ジョブを実行する
        t1.run();

        // ジョブの結果が格納されたデータベース(メモリ上?)からxの結果を取得
        System.out.println("Ran with Default:");
        GAMSVariable x = t1.OutDB().getVariable("x");
        for (GAMSVariableRecord rec :  x) {
            System.out.print("x(" + rec.getKeys()[0] + ", " + rec.getKeys()[1] + "):");
            System.out.print(", level    = " + rec.getLevel());
            System.out.println(", marginal = " + rec.getMarginal());
        }

        // Workディレクトリをクリアする
        // cleanup(ws.workingDirectory());
    }

    /**
     * 引数で指定されたWorkディレクトリ内のファイルを削除するメソッド.
     * @param directory
     */
    static void cleanup(String directory)  {
        File directoryToDelete = new File(directory);
        String files[] = directoryToDelete.list();
        for (String file : files) {
            File fileToDelete = new File(directoryToDelete, file);
            try {
                 fileToDelete.delete();
            } catch(Exception e){
                 e.printStackTrace();
            }
        }
        try {
           directoryToDelete.delete();
        } catch(Exception e) {
            e.printStackTrace();
        }
    }
}

ResourceBundleで読んでいるプロパティファイルは以下。

# GAMSの設定関連のプロパティファイル

GAMSDIR=/Applications/GAMS/gams24.2_osx_x64_64_sfx
WORKINGDIR=/Users/hermesian/NetBeansProjects/GAMSEJB/work
INPUTGAMSFILE=/Users/hermesian/NetBeansProjects/GAMSEJB/src/main/resources/Transport.gms

クラスを記述したらとりあえず単体テストしてみる。

package com.fujitsu.kime.gamsdemo.example;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;

public class Transport2Test {

    /**
     * テスト対象クラス - Transport2
     */
    private Transport2 sut2;

    @Before
    public void setUp() {
        sut2 = new Transport2();
    }   
    @After
    public void tearDown() {
        sut2 = null;
    }

    /**
     * <per>
     * シミュレーションが動作することを確認する。
     * </pre>
     */
    @Test
    public void testRunJob() {
        System.out.println("runJob");
        sut2.runJob();
    }
}

結局、環境変数にパスの設定が必要なのか…

上記の単体試験を実行すると、失敗して下記のようなエラーメセッージが現れる。

エラー発生:GAMS system directory [null] not found from environment variable!

環境変数に設定されてないよーというものであるが、 そもそも下記の記述でGAMSのインストールを指定していて、 ここの設定が先に見られるはずなのだが…

        GAMSWorkspace ws = new GAMSWorkspace(
                resource.getString("WORKINGDIR"),
                resource.getString("GAMSDIR"),
                GAMSGlobals.DebugLevel.OFF
        );

単体テスト実行時だからかな…不明。。

環境変数export DYLD_LIBRARY_PATH=/Applications/GAMS/gams24.2_osx_x64_64_sfxを設定して、とりあえず結果がでるか確認する。

runJob
check:/Users/hermesian/NetBeansProjects/GAMSEJB/work
check:/Applications/GAMS/gams24.2_osx_x64_64_sfx
Ran with Default
x(seattle,new-york):
, level =50.0
, marginal =0.0
x(seattle,chicago):
, level =300.0
, marginal =0.0
x(seattle,topeka):
, level =0.0
, marginal =0.036000000000000004
x(san-diego,new-york):
, level =275.0
, marginal =0.0
x(san-diego,chicago):
, level =0.0
, marginal =0.009000000000000008
x(san-diego,topeka):
, level =275.0
, marginal =0.0
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.143 sec

なんとか動いた。

TODO

もう少しシミュレーションっぽい機能を拡充したい。。

  • Jobキューの管理
  • データの分離
  • 可視化

AngularJSでD3.jsを利用する記事を読んだ

普段サーバサイドしかもSI側だからもっぱらインストールや技術調査見たいのしかやらないけど、解析プラットフォームをプライベートで開発してきたい。可視化は何よりも重要。

AngularJSについて超ざっくり把握

MVW(Model, View, Whatever)なんて説明されているAngularJS。 Backbone.jsを触ったことがあるけど、同じようにクライアントサイドのMVCフレームワークかと思ってた。

  • DOMとの切れ目がはっきりしない
    • AngularJS流のHTMLになる(DOMの再定義)
  • Modelがない
    • Controllerと切り離していない

AngularJSのプロジェクトを作成するには、Angular-seedから作るか、Yeomanから作るか。

D3.jsを使う

読んだ記事はこちら

基本的な流れ

  1. D3.jsをDIする
  2. 使いたいプロット手法(line chart, bar chart, etc)を利用するdirectiveをDIする
  3. Controllerからデータを与える

1.に関して、サードパーティ製のライブラリを使うのであれば同じ手法が使えそう。

  • D3.jsのコードをそのままコピペ
'use strict';

angular.module('d3')
.factory('d3Service', [function() {
var d3Service;
d3Service = (d3.min.jsのコピペ)
return d3Service;
}]);
  • D3.jsを非同期にDOMに読み込む
'use strict';

angular.module('d3', [])
.factory('d3Service', ['$document', '$window', '$q', '$rootScope',
  function($document, $window, $q, $rootScope) {
    var d = $q.defer(),
        d3service = {
          d3: function() { return d.promise; }
        };
  function onScriptLoad() {
    // Load client in the browser
    $rootScope.$apply(function() { d.resolve($window.d3); });
  }
  var scriptTag = $document[0].createElement('script');
  scriptTag.type = 'text/javascript'; 
  scriptTag.async = true;
  scriptTag.src = 'http://d3js.org/d3.v3.min.js';
  scriptTag.onreadystatechange = function () {
    if (this.readyState == 'complete') onScriptLoad();
  };
  scriptTag.onload = onScriptLoad;

  var s = $document[0].getElementsByTagName('body')[0];
  s.appendChild(scriptTag);

  return d3service;
}]);

後は各directiveで以下のように利用する。

angular.module('myApp', ['d3'])
  .directive('barBars', ['d3Service', function(d3Service) {
    return {
  restrict: 'A',
      link: function(scope, ele, attrs) {
        d3Service.d3().then(function(d3) {
          // d3オブジェクトが利用できる
        });
      }}
  }]);

html側は以下のように記述する

<body ng-app="myApp">

<div d3-bars></div>

これからすること

全然AngularJSの記述になれていないせいか、棒グラフ、ドーナッツグラフを作成するdirectiveをそれぞれ作ってみたけど、後のチャート機能が塗りつぶしてしまって、記事に出てたような縦に並べることができない(2つのdirectiveをチェーンに並べて、一つのコントローラ配下にするとできるが)。

もしかしたら、それぞれファイルを分けてコントーラを作るのか?(コントローラもメソッドチェーンっぽくそれぞれ記述していた)。

とりあえずプロット毎にdirectiveを作りたいな。 他の実装を見て勉強しておきたい。

Enterprise X HTML5 Web Application Conference 2014に参加してきた

Enterprise x HTML5 Conference 2014 - エンタープライズIT向けWeb標準技術のソリューション展

f:id:hermesian:20140228100039j:plain

"Enterprise"に焦点を当てたカンファレンスとであったので、 会社のお金で参加してきました。

聴きたかったこと

今回のカンファレンスは個人的にも、会社的にも聴きたかった トピックでした。

  • 個人的には...

    • AngularJS (Yeoman, Gruntとか)
    • Java + Client MVX
  • 会社的には...

    • オフライン Web Application
    • HTML5に関わるセキュリティ問題

個人的には完全ただのギークですね-。 人様に迷惑かけないレベルで使って行きたいなー。

会社の中の流れでは、既にいくつかの公的な機関でHTML5を利用した サービス開発案件が手がけられているので必須です。

聴いたこと

自分で予約とったけど、昼ご飯食べる時間NEEEEEEEEEEEEE!!!!!!!!

[10:30-11:45] パネルディスカッション「HTML5エンタープライズITの向かう先」
[12:00-12:45] 業務系Webシステムの画面デザイン、UI/UX(仮)
[13:00-13:45] リッチアプリーション開発を助けるOSSのJSフレームワーク「AngularJS」の魅力
[14:00-14:45] Webアプリ開発者のためのHTML5セキュリティ入門
[15:15-16:00] オープンソースで始めるオフラインアプリケーション開発入門
[16:15-17:00] Webアプリケーションにおけるクライアントサイドのデータハンドリングと可視化の実現
[17:15-18:00] JavaエンタープライズアーキテクチャにおけるHTML5

泣く泣く「業務系Webシステムの画面デザイン、UI/UX(仮)」をあきらめました...(どこかに発表スライドないですかな...)。

あと、電源とwifiNEEEEEEEEEEEE!!!! Mac book airのHPは10%よ...(良くもったな)。

聴いたことで、気になった点のみつらつらと書きます。。

パネルディスカッション「HTML5エンタープライズITの向かう先」

Webアプリ開発者のためのHTML5セキュリティ入門

これは...!
すばらしくまとまっており、教材で利用できそう。 WEB+DB PRESS Vol.71|技術評論社の「安全・堅牢なWebサイトの作り方」と合わせて読んでおこう。

特にREST jsonは割とやってるけど、盲目的にクライアントとサーバの両方でサニタイジングすれば良いと思ってたし、jsonをhtmlやvscriptとして開いてしまわないようX-Content-Type-Options: nosniffは知りさえしなかった。

オープンソースで始めるオフラインアプリケーション開発入門

結論 : Yeoman使おう!
タイトルにかすってもない!

もといSPA(Single Page Application)ではOffline機能が暗黙の要件として盛り込まれている。
アーキテクト、エンジニアはそれを考慮すべし。とのこと。

技術としては、こちら

  • Application Cache (IE9はサポートしてない)
  • WebStorage (SessionStorage / LocalStorage)

ブラウザにも依存するけど、最大10Mにどんなデータを保管しますかというところかな。
写真や動画のような重いコンテンツを持っておくのは考えにくい。

あと、これだけは読んでおけ!が以下。これは必ず読もう。後で読もう。

OSSのブラウザ自動テストツール「Selenium」を使った、開発・テストの効率化

Seleniumは以前、調査したときに利用したことがある(Javaで抽象化した機能を一杯作った...)が、日本Seleniumユーザグループの発表なので、もしかしたらSelenium3の話とか聴けるのかと(まだないみたい)。

本当はベンダセッション予約してたけど...(後で気づいた)

知らなかったことは、

  • Selenium(Webdriver)の標準化が進んでいる
    • WebDriverかな?
    • 各ブラウザで実装されるから、そんなにブラウザを意識した記述が減るのかな...(IEもお願いします!)
  • モバイル向けのサードパーティ製品が統合される(サードパーティは参照実装)
    • サードパーティ製品が公式推奨なのは笑った。でも他人のものでもいいものを推せるのは素晴らしいこと。

JavaエンタープライズアーキテクチャにおけるHTML5

最後の鈴木さんの講演は安定感があり、非常に聴きやすい発表でした。
Node.jsやりたいと息巻いていた後輩にはぜひ聴かせてやりたい。

今回始めて聴いたSPA(Single Page Application)というもの、まだふわふわして成功プロセスはまだトライアンドエラーなのかなと雑感。

サーバサイド見たら、RESTで、適切なプロトコルを選んで、Thin-server architectureなのかもしれないけど、クライアントサイドのデータの取り回しを含めて考える必要がある。

Cookieもらった

f:id:hermesian:20140228215105j:plain

CodeIQさん(CodeIQ|ITエンジニアのための実務スキル評価サービス)がブース出してて、「解答したよ」というとクッキーが頂ける。 最後には無料配布されてましたが、自宅に帰って解答した後に頂きました。 お疲れさまです。

CygwinからNode.jsを利用する

anyenvで入れてみる

前回と同様、anyenvを利用して入れてみる。

$  anyenv install ndenv
$  exec $SHELL -l

利用可能なバージョンを一覧表示して、選んだ一つをインストール

$ ndenv install --list
..利用できる一覧がでる
$ ndenv install v0.11.11

特に何も出力されずに終わった...?????

$ cat /tmp/node.build-XXXXXXXXXXXXXXX.XXXX.log
..特になにも出力されず

特にログも出てない....!!!!???? 試しにanyenvではなく、ndenvを利用してもダメだった。。 何が悪いんだろう。。 時間がとれたときにまた調査してみることに。

ええい、もうWindows版をいれてCygwinから利用してみる

node.jsからWindows(.msi)の32-bit版をダウンロードして、インストールした(特に変わったことはしてない)。

$ node -v
v0.10.26
$ npm -v
1.4.3

あるjavascriptのアプリを動かしてみようとしたところ、 expressが無いと。

$ node server.js

module.js:340
    throw err;
          ^
Error: Cannot find module 'express'
    at Function.Module._resolveFilename (module.js:338:15)
    at Function.Module._load (module.js:280:25)
    at Module.require (module.js:364:17)
    at require (module.js:380:17)
    at Object.<anonymous> (D:\software\cygwin\tmp\d3AngularIntegration\server.js:4:13)
    at Object.<anonymous> (D:\software\cygwin\tmp\d3AngularIntegration\server.js:14:4)
    at Module._compile (module.js:456:26)
    at Object.Module._extensions..js (module.js:474:10)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:312:12)

expressをグローバル(どこからでも利用できる形式)で入れる。 何か怒られた。

$ npm install -g express
/cygdrive/d/software/nodejs/npm: line 2: $'\r': コマンドが見つかりません
/cygdrive/d/software/nodejs/npm: line 4: $'\r': コマンドが見つかりません
/cygdrive/d/software/nodejs/npm: line 5: 期待してない token `$'in\r'' のあたりにシンタックスエラー
'cygdrive/d/software/nodejs/npm: line 5: `case `uname` in

Node.jsをWindowsインストーラで入れたら、Cygwinのシェルでnpmがエラーになる - 死ぬまでの暇潰しによると改行コードがCR+LFが認識できないみたい。

改行コードが CR+LF のシェルスクリプトを Cygwin で実行 - ◆ICT備忘録で紹介されているように.bashrcに以下を書いてあげるとCR+LFが認識される。

export SHELLOPTS
set -o igncr

これでexpressは入ったが、まだCan't findだと。 expressのパスをwhichで見て、NODE_PATHに追加してやる。

$ export NODE_PATH=$NODE_PATH:(expressのパス) >> ~/.bashrc

それでもCan't find。。もうローカルでいいや。

$ npm install express
$ node server.js

ま、これはできました。 node.jsのパッケージの探し方は調査しないとなぁ。

Rdenvを使ってrubyをインストール

開発環境を作るときの問題点

Rdenvインストール

インストール後に気づきましたが、riywo/anyenv · GitHubを利用した方が.bash_profileでの記述等を鑑みて、良かったと後悔...。

入れたもののサマリをしたの表にまとめておく。

パッケージ名 URL 説明
rdenv https://github.com/sstephenson/rbenv rdenvの本体
ruby-build https://github.com/sstephenson/ruby-build.git rdenvでinstallコマンドを使うためのプラグイン
  • rdenvのインストール

git cloneするときにgit://だと名前解決できないよと怒られた。 間違いなく自分のPCに原因あるな...。

   $ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
   $ echo 'export PATH="$PATH:$HOME/.rbenv/bin"' >> ~/.bashrc
   $ echo 'eval "$(rbenv init -)"' >> ~/.bashrc
   $ source ~/.bashrc
  • ruby-buildのインストール
   $ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/rucby-build

Rubyのインストール

   $ rbenv install -l
   .. インストールするバージョンを選択
   $ rvbenv install 2.1.0-rc1
   .. 結構長いので放置して帰宅
   $ rbenv rehash
   $ rbenv global 2.1.0-rc1

インストールできたか確認

  $ which ruby
     /cygdrive/c/Users/Owner/.rbenv/shims/ruby
   $ ruby -v
     ruby 2.1.0dev (2013-12-20 trunk 44301) [i386-cygwin]
   $ gem -v
     2.2.0.rc.1

anyenvを利用する

あとから見てやっぱりこっちを入れておけばよかったと後悔。。 以下のものが利用可能

上記と同じことをしてみる。

    $ git clone https://github.com/riywo/anyenv ~/.anyenv
    $ echo 'export PATH="$HOME/.anyenv/bin:$PATH"' >> ~/.bashrc
    $ echo 'eval "$(anyenv init -)"' >> ~/.bashrc
    $ exec $SHELL -l

rdenvをインストールする

$ anyenv install rdenv
$ exec $SHELL -l

あとは同じ

$ rdenv install (ほしいrubyのバージョン)

[トラブルシューティング] "checking whether the C compiler works... no"

rdenv install中に以下のようなエラーが出た。

checking whether the C compiler works... no
configure: error: in `/tmp/ruby-build.20140217161432.7816/yaml-0.1.5':
configure: error: C compiler cannot create executables
See `config.log' for more details

指示に従って、/tmp/ruby-build.XXXXXXXXXXXXXXX.XXXX/yaml-0.1.5/config.logを見てみたけど、 さっぱり。

gcc: error: unrecognized command line option '-V'
gcc: fatal error: no input files
compilation terminated.
configure:3098: $? = 1
configure:3087: gcc -qversion >&5
gcc: error: unrecognized command line option '-qversion'
gcc: fatal error: no input files
compilation terminated.
configure:3098: $? = 1
configure:3118: checking whether the C compiler works
configure:3140: gcc  -I/cygdrive/c/Users/Owner/.rbenv/versions/2.1.0-rc1/include  -L/cygdrive/c/Users/Owner/.rbenv/versions/2.1.0-rc1/lib  conftest.c  >&5
/usr/lib/gcc/i686-pc-cygwin/4.8.2/cc1.exe: error while loading shared libraries: cygmpc-3.dll: cannot open shared object file: No such file or directory
configure:3144: $? = 1
configure:3182: result: no
configure: failed program was:
| /* confdefs.h */
| #define PACKAGE_NAME "yaml"
| #define PACKAGE_TARNAME "yaml"
| #define PACKAGE_VERSION "0.1.5"
| #define PACKAGE_STRING "yaml 0.1.5"
| #define PACKAGE_BUGREPORT "http://pyyaml.org/newticket?component=libyaml"
| #define PACKAGE_URL ""
| #define PACKAGE "yaml"
| #define VERSION "0.1.5"
| #define YAML_VERSION_MAJOR 0
| #define YAML_VERSION_MINOR 1
| #define YAML_VERSION_PATCH 5
| #define YAML_VERSION_STRING "0.1.5"
| /* end confdefs.h.  */
|
| int
| main ()
| {
|
|   ;
|   return 0;
| }
configure:3187: error: in `/tmp/ruby-build.20140217185557.8052/yaml-0.1.5':
configure:3189: error: C compiler cannot create executables

gccがちゃんとインストールされていないかも。。と思い、再インストールしたら今度はうまくインストールできた。

$ apt-cyg remove gcc-core
$ apt-cyg install gcc-core

Cygwin(v2.831)事始め

インストール環境

インストールした環境は、Windows 7 Professional SP1です。 社内で実施したので、Proxyサーバのうらからインストールしました。

参考にした情報

以下の情報を参考にさせて頂きました。 すばらしくまとまっています。

Cygwin で RubyとGitをコンパイルして使おう - Qiita

Cygwin インストール

Cygwin Installationから最新版のCygwinをダウンロードしてくる。ダウンロードしてきたsetup-x86.exeを右クリックし、[管理者として実行]を選択する(たぶん不必要)。

[1] [次へ]を押下

f:id:hermesian:20140220123541p:plain

[2] "Install from Internet"を選択

f:id:hermesian:20140220123546p:plain

[3] C:ドライブがかつかつなので、"Root Directory"として、D:\software\cygwinと入力

f:id:hermesian:20140220123543p:plain

[4] インストールしたものが格納される場所を選択。同様にD:\software\Downloadsと入力

f:id:hermesian:20140220123544p:plain

[5] ディレクトリが存在しないので、新たに作るとさ

f:id:hermesian:20140220123545p:plain

[6] Proxyサーバの背後にいるので、Proxyサーバを指定する。Google chromeと同じでIEの設定を見に行くを選択すれば良い(ID, パスワードを設定している場合、この後の画面で入力が求められる)。

f:id:hermesian:20140220123546p:plain

[7] "Download Site"は国内(*.jp)を選択しておくことが無難。ここではftp://ftp.jaist.ac.jpを選択

f:id:hermesian:20140220123547p:plain

[8] あとあとapt-cygでインストールするため、ここでは最低限のやつのみ入れておく。

[9] インストールのサマリが表示されるので、[次へ]ボタンを押下

f:id:hermesian:20140220123551p:plain

[10] インストールされ、これでCygwinのインストールが完了となります。

f:id:hermesian:20140220123552p:plain

パッケージマネージャapt-cygをインストール

Cygwindebian likeなパッケージ管理ができるapt-cygが便利です(setup.exeをいちいち起動せずにコマンドラインでインストール操作が実行できます)。ただ、apt-cyg - PIB - Seesaa Wiki(ウィキ)を見るといくつか亜流ができているようで^^;

いくつかの情報で言及されているhttp://apt-cyg.googlecode.com/svn/trunk/からインストールしてしまうと、リポジトリのパスが変更になった(ftp://ftp.jaist.ac.jp/pub/cygwin/配下がアーキテクチャで別れた)ため、動きません。なので先ほどのリンク先のものを利用します。

$ mkdir /tmp/apt-cyg
$ cd /tmp/apt-cyg
$ git clone https://github.com/koulokada/apt-cyg .
$ chmod +x apt-cyg
$ mv apt-cyg /bin/
$ apt-cyg —use-setprc  <= setup-x86.exeのcache, mirrorの情報を引き継ぎ
$ apt-cyg update

[追記] 2014.02.21

もしパッケージが足りない場合、apt-cygすると以下のようなメッセージが出力されます。 「wget, tar, gawk, bzip2いれてね。」と。

$ apt-cyg install inetutils
You must install wget, tar, gawk and bzip2 to use apt-cyg.

Proxy環境でapt-cygを利用する

[追記] 2014.02.21

大事なことを忘れていました。Proxy環境から利用するため、 Proxyサーバを指定する必要があります。 設定するところは、なぜかwget。たぶんダウンロードするためにwget使っているからかな。 /etc/wgetrcに記述します。proxyで検索すると記述例があるので、それに従い記述します。

$ vi /etc/wgetrc

...(省略)...
http_proxy = http://proxy.example.co.jp/
https_proxy = http://proxy.example.co.jp/
ftp_proxy = http://proxy.example.co.jp/
...(省略)...

コンパイラやライブラリをインストール

あとは開発環境を整備するための環境を入れておきます。

$ apt-cyg install gnupg -X
$ apt-cyg install gcc-core
$ apt-cyg install make patch
$ apt-cyg emacs emacs-el
$ apt-cyg install libncurses-devel openssl-devel readline libsqlite3-devel libxml2-devel libxslt-devel

次回は、rdenvでrubyの環境を整備します。