nodebrewによるNode.jsインストール手順

仕事にてnodeが必要になりまして、、、
nodeのインストールにちょいと苦戦したので参考までに!
Node.jsをMacにインストールしてnpmを使えるようにする - Hirooooo’s Laboを参考にさせていただきました〜

Node.jsがインストールされているバージョンを確認

$ node -v
v6.2.1

Node.jsのアンインストール方法

すでにNode.jsがインストールされている場合は、次の方法でアンインストールしてください。

$ brew uninstall node
Uninstalling /usr/local/Cellar/node/6.2.1... (3,818 files, 45.3M)

しかし、macのOS的問題でこんな感じで怒られてしまい、すんなりアンインストールはできませんでした。

Error: Permission denied - /usr/local/bin/node

こんな場合は、次のコマンドで/usr/localのパーミッション変えちゃいましょう

$ sudo chown -R `whoami` /usr/local

これ以降の手順

先に書きましたリンクの記事を参考にしていただけるとよいかと思いますが、
Node.jsのインストールのところでつまづいたのでそこの解決方法だけ補足します。

$ nodebrew install-binary latest
Fetching: https://nodejs.org/dist/v7.2.1/node-v7.2.1-darwin-x64.tar.gz
Warning: Failed to create the file
Warning: /[Home_Directory]/.nodebrew/src/v7.2.1/node-v7.2.1-darwin-x64.tar.gz:
Warning: No such file or directory
                                                                           0.0%
curl: (23) Failed writing body (0 != 941)

なんだこのエラーは!!!と思い、次のようにディレクトリを作ってあげたらできました。

$ mkdir -p ~/.nodebrew/src

PrivateメソッドとPrivateフィールドのユニットテスト

表題の通り、備忘録として。

Target.java(テスト対象クラス)

public class Target {
 
    private String str = "test";
 
    public String getStr() {
        return this.str;
    }
 
    private String thisIsPrivateMethod(Integer number) {
        return number == 1 ? "One" : "Other";
    }
     
}

TargetTest.java(テストクラス)

puclic class TargetTest {
 
    Field field;
 
    Method thisIsPrivateMethod;
     
    @Before
    public void setup() {
         
        // Targetクラスのstrフィールドにアクセス可能
        field = Target.class.getDeclaredField("str");
        field.setAccessible(true); 
 
        // TargetクラスのthisIsPrivateMethodメソッドにアクセス可能(getDeclareMethodの第1引数はメソッド名、第2引数以降は対象メソッドのパラメータの型)
        thisIsPrivateMethod = Target.class.getDeclareMethod("thisIsPrivateMethod",  Integer.class);
        thisIsPrivateMethod.setAccessible(true);
    }
 
    @Test
    public void privateField() {
        Target target = new Target();
        // Targetインスタンスのstrフィールドに"tagbengers"をセット
        field.set(target, "tagbangers");
 
        Assert.assertEquals("tagbangers", target.getStr());
    }
 
    @Test
    public void privateMethod() {
        Target target = new Target();
        Assert.assertEquals("One", thisIsPrivateMethod.invoke(target, 1));
    }
}

こんな感じでユニットテストかけます。

JMockitを使ってprivateメソッドをモックにしてみた話

ユニットテスト書いてて、関係ないprivateメソッド通りたくないな〜と思ってググってたらJMockitなるすばらしいものがあったので忘れないうちに!

まず、
Maven Repository: org.jmockit » jmockitからpom.xmljMockitを追加!

<dependency>
    <groupId>org.jmockit</groupId>
    <artifactId>jmockit</artifactId>
    <version>1.30</version>
</dependency>

JmockitSample.class

package com.example;

public class JmockitSample {
	public static void main(String[] args){
		System.out.println(new JmockitSample().methodPublic());
		System.out.println(methodPublicStatic());
		System.out.println(new JmockitSample().callPrivateMethod());
		System.out.println(callPrivateStaticMethod());
	}

	public String methodPublic() {
		return "methodPublic";
	}

	public static String methodPublicStatic() {
		return "methodPublicStatic";
	}

	public String callPrivateMethod(){
		return new JmockitSample().methodPrivate();
	}

	private String methodPrivate() {
		return "methodPrivate";
	}

	public String callPrivateMethodTwoArgs(){
		return new JmockitSample().methodPrivate("TEST", 1);
	}

	private String methodPrivate(String value, Integer no) {
		return value + no;
	}

	public static String callPrivateStaticMethod(){
		return JmockitSample.methodPrivateStatic();
	}
	private static String methodPrivateStatic() {
		return "methodPrivateStatic";
	}

	public void callPrivateVoidMethod(){
		new JmockitSample().voidMethodPrivate(1);
	}

	private void voidMethodPrivate(int no) {}
}

JmockitSampleTest.java

package com.example;

import mockit.Mock;
import mockit.MockUp;
import org.junit.Before;
import org.junit.Test;
import org.mockito.InjectMocks;

import static org.junit.Assert.assertEquals;
import static org.mockito.MockitoAnnotations.initMocks;

public class JmockitSampleTest {

	@InjectMocks
	JmockitSample jmockitSample;

	private int sum = 0;

	@Before
	public void setup() {
		initMocks(this);
	}

	@Test
	public void mockTest(){

		new MockUp<JmockitSample>() {
			@Mock
			private String methodPrivate() {
				return "mocked methodPrivate";
			}

			@Mock
			private String methodPrivate(String value, Integer no) {
				return "mocked methodPrivate two args";
			}

			@Mock
			private String methodPrivateStatic() {
				return "mocked methodPrivateStatic";
			}

			@Mock
			private void voidMethodPrivate(int no) {
				sum += 5;
			}
		};

		assertEquals(new JmockitSample().methodPublic(), "methodPublic");
		assertEquals(JmockitSample.methodPublicStatic(), "methodPublicStatic");
		assertEquals(new JmockitSample().callPrivateMethod(), "mocked methodPrivate");
		assertEquals(new JmockitSample().callPrivateMethodTwoArgs(), "mocked methodPrivate two args");
		assertEquals(JmockitSample.callPrivateStaticMethod(), "mocked methodPrivateStatic");

		new JmockitSample().callPrivateVoidMethod();
		assertEquals(5, sum);
	}
}

privateメソッドのモックができましたー

クライアントとサーバの通信の流れを見てみよう!

入社当時Webの勉強のためにWebサーバ作っていたのですが、まだできておらずWebの理解を深めなきゃという気持ちで再び取り組みはじめました。
今回は、サーバとクライアントの通信がどのように行われているのかについて書きます。

まず、クライアントとサーバを簡単に作ってみましょう。

Client.java

package client;

import java.net.Socket;

public class Client {
    public static void main(String[] args) throws Exception {
        try(Socket socket = new Socket("localhost", 8001)) {
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Server.java

package server;

import java.net.ServerSocket;
import java.net.Socket;

public class Server {
    public static void main(String[] args) throws Exception {
        try(ServerSocket serverSocket = new ServerSocket(8001)) {

            System.out.println("クライアントからの接続待ち。");
            Socket socket = serverSocket.accept();
            System.out.println("クライアントからの接続!");

            socket.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

サーバを実行した後に、クライアントを実行するとクライアントからサーバへ通信しにいきます。クライアントからサーバで通信するまでに何が行われているのか説明します。流れは、次の通りです。なお、上記のプログラムでは3はやっておりません。

1.ソケットを作る(ソケット作成フェーズ)

まず、サーバがソケットを作成します。ソケットとは、パイプの両端にある出入り口のことです。その時に上記のServer.javaは、8001番ポートで待ち受けています。(「クライアントからの接続を待ちます」と出力)
ソケットができたら、ディスクリプタ(ソケットに割り当てられた番号のようなもの)が返ってきます。アプリケーションはこれを受け取ってメモリに記憶します。ディスクリプタでソケットを識別しています。

2.サーバ側のソケットにパイプをつなぐ(接続フェーズ)

「new Socket("localhost", 8001)」でストリームソケットを作成し、指定されたホスト上の指定されたポート番号に接続します(「クライアント接続」と出力)。繋ぎたいソケットを正確に取得するために、IPとポート番号が必要です。(考え方は手紙の宛名面と同じです。「住所=IPアドレス、宛名=ポート番号」)

3.データを送受信する(送受信フェーズ)

ネットワークを通してデータがサーバに送られます。そして、サーバ側からレスポンスが返ってきます。受信したメッセージを格納するためのメモリ領域を受信バッファと呼びます。

4.パイプを外してソケットを抹消する(切断フェーズ)

繋がっていたパイプを外します。クライアントでもサーバでもどちらから外しても構いません。その後、ソケットを抹消します。

ソケットについてもやもやしていたので少し解消できました!!!

Google Cloud Platformって結構気に入った

Google Cloudで始めるDocker実践入門に参加してました。
講師は、「プログラマのためのDocker教科書」や「Amazon Web Servicesではじめる新米プログラマのためのクラウド超入門」の著者の阿佐志保さんでした。
今回は、もう少し自分で試したいのでDockerの内容は置いといて簡単にGoogle Cloudについて紹介したいと思います。
Google Cloud Platformとは、Googleが提供しているクラウドサービスです。

リージョン

現在利用できるリージョンは、次のとおりです。AWSに比べると全然少ないですね。f:id:b1a9id:20161023220505p:plain

プロダクト 北アメリカ ヨーロッパ アジア
Cloud Storage カウンシルブラフス, バークレー郡, アトランタ サン・ギスラン(ベルギー) 彰化県(台湾)
Cloud Storage(Alpha) レノア, メイズ郡, ダラス - -
Cloud SQL バークレー - アジア
Cloud Datastore バークレー - -

ただ、なんと嬉しいことに2016年中に東京リージョンができるとのこと!その他、オレゴンも追加だそうです。

サービス

全部で48サービス提供されています。(2016年10月23日現在)
主なものをAWSのサービスと比較して紹介してみます。

サービス名 説明 AWSでは
Compute Engine Googleのインフラにホストされている仮想マシンを使った、大規模ワークロードの実行 EC2
App Engine スケーラブルなアプリケーションや、モバイルバックエンド構築のためのプラットフォーム Beanstalk
Cloud Load Balancing Google Cloud Platformのハイパフォーマンス、スケーラブルロードバランサー Elastic Load Balancer
Cloud DNS Googleの世界中のネットワークから供給される高信頼でレジリエントな、低レイテンシーDNS Route 53
Cloud Strage グローバルなエッジキャッシュを備えた、コストバランスに優れるシンプルなオブジェクトストレージ S3
Cloud SQL フルマネージドのMySQLリレーショナルデータベースを利用したデータの保存と管理 RDS
初めて使ってAWSより便利と感じたこと
  • プロジェクトという単位で管理すること

うちの会社ではAWSをつかっておりますが、お客様ごとにアカウントを分けて親アカウントからSwitch rollで目的のアカウントにログインするという運用をしております。毎回これめんどいなーって思ってるんですよね。しかし、GCPではプロジェクトという単位でサービスの管理ができるのです。システムごとにプロジェクトを作成すれば、他のシステムに影響を及ぼす心配もないです。もし、このシステムもういらないってなった場合は、プロジェクトごと削除してしまえばその中で使用していたサービスも一緒に削除できてしまうんです!

  • Cloud Shell

ざっくり言うとブラウザのマネジメントコンソール上にコンソールが起動しちゃうんです。
マネジメントコンソールの左上ヘッダメニュー赤枠のとこを選択すると
f:id:b1a9id:20161023220455p:plain
マネジメントコンソール上にコンソールが起動します。
f:id:b1a9id:20161023220505p:plain
ブラウザからコマンドラインクラウドリソースに直接アクセスできます。クラウドシェルでは、GCPAPIをたたくgcloudコマンドやよく利用すると思われるコマンドがすでにインストールされています。
また、Java、Go、Python、Node.js、PHPRubyの開発・デプロイツールがすでにインストールされているため、Cloud Shellのインスタンス上でアプリを起動してブラウザからプレビューを見ることができます。
1番感動したのは、Cloud Shellを終了してもコマンド履歴やファイルが残っていることです。Cloud Shellでは、Cloud Shellインスタンス上のホームディレクトリに5GBの永続ディスクがマウントされています。永続化されるのは、ホームディレクトリ配下のみみたいです。.bashrcや.vimrcも対象です!


こんな感じでけっこうおもしろそうなのでいろいろ試してみたいと思います。(AWSは12ヶ月の無料枠だが、GCPは60日の無料枠ていうのが残念)