順次、選択、そして繰り返し

プログラミングのことやITのこと、たまに演劇のことも書きます。

カウントアップマクロ

個人的に今欲しいマクロを作成してみた。

'変数宣言
Dim szGetText As String
Dim szSetText As String
Dim iCnt As String


'*************************************
'コピーした文字列の末尾を取得して
'カウントアップする
'*************************************
Sub GetText()

On Error GoTo GetTextError
    
    Selection.Copy

    With New DataObject
        .GetFromClipboard       '変数のデータをDataObjectに格納する
        szGetText = .GetText    'クリップボードから取得
        iCnt = Val(Right(szGetText, 3))
        iCnt = iCnt + 1
        '改行コード(vbLf)を考慮
        szSetText = Left(szGetText, Len(szGetText) - 3) 
    End With
    
    Exit Sub
    
GetTextError:

MsgBox ("エラー")

End Sub

'*************************************
'GetText()でカウントアップした
'文字列を貼り付ける
'*************************************
Sub SetText()

    With New DataObject
        .SetText szSetText & Format(iCnt, "0")  '数値から文字へ
        'DataObjectのデータをクリップボードに格納する
        .PutInClipboard                         
    End With
    
    ActiveSheet.Paste

End Sub


例えば次のデータがあるとする
f:id:sndstudy:20160831222104p:plain

そのデータをコピーして
f:id:sndstudy:20160831222122p:plain

別のセルに貼り付ければ、末尾の数字がカウントアップする
f:id:sndstudy:20160831222202p:plain

やっぱエビデンスの番号紐づけぐらいしか用途ないな……。

■参考サイト
クリップボードとデータのやりとりをする:Excel VBA|即効テクニック|Excel VBAを学ぶならmoug

Office TANAKA - Excel VBA Tips[クリップボードを操作する(1)]

Microsoft Forms 2.0 Object Libraryへの参照設定を行うには? :VBE(Visual Basic Editor)

Excel VBA 入門講座

VBA 文字列の改行

VBA 数値を変換

Javaでちょっと気になったこと

新人3ヵ月目の時、よく理解していなかったが故にやってしまったこと。

例えばユーザ情報をListに入れるときに

package test.java;

import java.util.ArrayList;
import java.util.List;

public class ListTest {

	public static void main(String[] args) {

		List<UserBean> list = new ArrayList<UserBean>();

		UserBean uBean = new UserBean();

		/* 1人目 */
		uBean.setNo("1");
		uBean.setName("YoneSan");
		uBean.setMsg("MSG1");

		/* リストに追加 */
		list.add(uBean);

		/* 2人目 */
		uBean.setNo("2");
		uBean.setName("OzekiStyle");
		uBean.setMsg("MSG2");

		/* リストに追加 */
		list.add(uBean);

		/* 3人目 */
		uBean.setNo("3");
		uBean.setName("NagasawaKun");
		uBean.setMsg("MSG3");

		/* リストに追加 */
		list.add(uBean);

		for(UserBean ub : list){

			System.out.println(ub.getNo());
			System.out.println(ub.getName());
			System.out.println(ub.getMsg());

		}
	}

}

想定していた出力は

1
YoneSan
MSG1
2
OzekiStyle
MSG2
3
NagasawaKun
MSG3

こんな感じだけど、実際に実行すると。

3
NagasawaKun
MSG3
3
NagasawaKun
MSG3
3
NagasawaKun
MSG3

一番最後に設定した値が出力される。

そりゃあインスタンスが1つ(newが1回)しか生成
されていないのにそのインスタンスに対して値を変更したら
すでにリストに格納されているものも変わるよなって話。

試しにハッシュコードを調べてみる。

package test.java;

import java.util.ArrayList;
import java.util.List;

public class ListTest {

	public static void main(String[] args) {

		List<UserBean> list = new ArrayList<UserBean>();

		UserBean uBean = new UserBean();
		System.out.println(uBean);

		/* 1人目 */
		uBean.setNo("1");
		uBean.setName("YoneSan");
		uBean.setMsg("MSG1");

		/* リストに追加 */
		list.add(uBean);

		System.out.println(uBean);

		/* 2人目 */
		uBean.setNo("2");
		uBean.setName("OzekiStyle");
		uBean.setMsg("MSG2");

		/* リストに追加 */
		list.add(uBean);

		System.out.println(uBean);

		/* 3人目 */
		uBean.setNo("3");
		uBean.setName("NagasawaKun");
		uBean.setMsg("MSG3");

		/* リストに追加 */
		list.add(uBean);

		for(UserBean ub : list){

			System.out.println(ub.getNo());
			System.out.println(ub.getName());
			System.out.println(ub.getMsg());

		}
	}

}

出力結果↓
test.java.UserBean@659e0bfd
test.java.UserBean@659e0bfd
test.java.UserBean@659e0bfd
3
NagasawaKun
MSG3
3
NagasawaKun
MSG3
3
NagasawaKun
MSG3

@以降がハッシュコードを指してる。

ハッシュコードはオブジェクトの内部アドレスを整数値にしたもの
みたいなので、すべて同じところを指していることが分かる。

参考↓
Object (Java Platform SE 7)

なので値を設定する前にインスタンスを生成すればOK。

package test.java;

import java.util.ArrayList;
import java.util.List;

public class ListTest {

	public static void main(String[] args) {

		List<UserBean> list = new ArrayList<UserBean>();

		UserBean uBean = new UserBean();
		System.out.println(uBean);

		/* 1人目 */
		uBean.setNo("1");
		uBean.setName("YoneSan");
		uBean.setMsg("MSG1");

		/* リストに追加 */
		list.add(uBean);

		uBean = new UserBean();
		System.out.println(uBean);

		/* 2人目 */
		uBean.setNo("2");
		uBean.setName("OzekiStyle");
		uBean.setMsg("MSG2");

		/* リストに追加 */
		list.add(uBean);

		uBean = new UserBean();
		System.out.println(uBean);

		/* 3人目 */
		uBean.setNo("3");
		uBean.setName("NagasawaKun");
		uBean.setMsg("MSG3");

		/* リストに追加 */
		list.add(uBean);

		for(UserBean ub : list){

			System.out.println(ub.getNo());
			System.out.println(ub.getName());
			System.out.println(ub.getMsg());

		}
	}

}

出力結果↓
test.java.UserBean@659e0bfd
test.java.UserBean@2a139a55
test.java.UserBean@15db9742
1
YoneSan
MSG1
2
OzekiStyle
MSG2
3
NagasawaKun
MSG3

ハッシュコードも別々で想定した出力になっている。
これでインスタンスの理解が少し深まったかも。

シート集約マクロを作成してみた

同じフォルダ内にある複数のExcelブックの1シート目を
1つのブックに集約するマクロを作成してみた。

Sub CommandButton1_Click()

    Const AGG_FILE_NAME As String = "集約ファイル.xlsx"
    Const EXTENSION As String = "xls*"

    Dim szFileName As String
    Dim copySheet As Workbook
    Dim szAggFileName As String
    
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
    
    '集約ファイル名を取得
    szAggFileName = Range("A2").Value
    
    If szAggFileName = "" Then
    
        'ファイル名が記入されていない場合デフォルトの値を入れる
        szAggFileName = AGG_FILE_NAME
    
    End If
    
    'ファイル存在チェック
    szFileName = Dir(ThisWorkbook.Path & "\" & szAggFileName)
    
    '存在した場合は削除する
    If szFileName <> "" Then
    
        Kill (ThisWorkbook.Path & "\" & szAggFileName)
    
    End If
    
    Set aggFile = Workbooks.Add
    
    '拡張子「.xls」「.xlsx」「.xlsm」を対象
    szFileName = Dir(ThisWorkbook.Path & "\*." & EXTENSION)
    
    'ファイルが存在しない場合は終了
    If szFileName = "" Then
    
        Exit Sub
    
    End If
           
    '各ブックの1枚目のシートを集約用ブックにコピーする
    Do
    
    'マクロ自身は無視する
        If ThisWorkbook.Name <> szFileName Then
            
            Set copySheet = Workbooks.Open(Filename:=ThisWorkbook.Path & "\" & szFileName)
            
            copySheet.Worksheets(1).Copy After:=aggFile.Worksheets(aggFile.Worksheets.Count)
            
            ActiveSheet.Name = szFileName
            
            copySheet.Close
            
        End If
        
        szFileName = Dir()
    
    Loop While szFileName <> ""

    '空のシートを削除する処理
    Dim i As Integer
    i = 0
    Dim iSheetCount As Integer
    iSheetCount = 1
    
    Do While iSheetCount <= aggFile.Worksheets.Count - i
    
        If IsEmpty(aggFile.Worksheets(iSheetCount).UsedRange) = True Then
        
            aggFile.Worksheets(iSheetCount).Delete
            
            i = i + 1
        
        Else
        
            iSheetCount = iSheetCount + 1
        
        End If
    
    
    Loop
    
    Application.DisplayAlerts = True
    
    aggFile.SaveAs Filename:=ThisWorkbook.Path & "\" & szAggFileName
    
    aggFile.Close
    
End Sub

集約したシートを保存するブックの名前を入力して、
ボタンを押す

f:id:sndstudy:20160703231014p:plain


このフォルダ内の.xls .xlsx .xlsm の1シート目を
コピーして1つのブックに集約する
f:id:sndstudy:20160703231035p:plain

hoge.xlsxが作成される
f:id:sndstudy:20160703231538p:plain

hoge.xlsxを開くと各ファイルからシートがコピーされている。
f:id:sndstudy:20160703231629p:plain

JavaDayTokyo2016に参加してきた

かなり遅くなったが、
セッションについてまとめてみようと思う。

Java Day Tokyo 2016|日本オラクル


【基調講演】
Innovate, Collaborate, with Java

今後のJavaについて説明。
スライドに書かれていた『あなたはJavaを愛していますか?』に
少し笑ってしまった。
あとはJava9の目玉として「Project Jigsaw」という
モジュール化について説明していた。
「Project Jigsaw」によってクラスパスの問題などが
解決されるみたい。
[速報]JavaOne開幕。Java 9は「Project Jigsaw」でクラスパスの問題とJDK肥大化の問題を解決する。JaveOne 2015 - Publickey


JavaEE
Introduction to MVC 1.0 (JSR 371)

JavaEE8から追加されるアクションベースのMVCについての説明。
JavaEE7まではコンポーネントベースのMVCしかなかったため、
開発方法の選択肢を増やすために追加した。

コンポーネントベースとは
JSF Wicket Tapestryとかが有名
コントローラーが大体の処理をする
MVが開発の範囲

アクションベースとは
Struts SpringMVCが有名。
MVCが開発の範囲
リクエストが単位
開発者の負担が大きい

リファレンス実装としてOzarkがある。
→実装が可能だということを証明している

Ozark

JavaEEの中にあるものでMVCを作りたかった
モデル
CDI BeanValidation JPA
ビュー
→Faceless JSP
コントローラー
JAX-RS

【JavaSE】
JavaFX 8 and the future

SwingやAWTではなく、JavaFX使おう。
バイルも対応している。

GUIのツールキット
デスクトップ、モバイル、組み込みもできる。

JavaFX8でいいところ
Swingと相互利用ができるところ

JavaFX8の新しい部分
DatePicker
→カレンダーの定義 CSSもサポートしてる

TreeTableView

ModenaUITheme
→全体的に丸み、フラットな感じになっている
 シンプルデザイン

アクセシビリティ
→音声案内

ダイアログが追加
→アラートも出せる
 OSに合わせたボタン

JavaFX9(JDK9)
jigsawModularity
→実行に必要最低限な依存関係のみのモジュールを
 選択するようにする

モジュールを必要最低限にすることでランタイムの
実行が短くなる

JavaEE
What HTTP/2 means to Java Developers?

HTTP/2になった時、Javaではどうするべきかの説明。

HTTP/1.1での問題点
陳腐化したプロトコル

Webページの使われ方が違うのに
プロトコルが変わっていない

Webページのサイズが増えてきている

1.1は遅延性の問題がある
→速やかにページをレンダリングする必要がある

Head-of-Line booking
リクエストの順番にレスポンスを
返す仕様なので途中で遅延すると
後続も遅延する

HTTP/2は遅延性を抑える
RFC7540 7541

モダンなブラウザはすべてHTTP/2

バイナリベースのプロトコルであること
→1.1はテキストベース

1つのストリームで2つのデータを送る

バイナリフレームになるが開発者は意識することはない

ServerPush
→クライアントから要求がなくてもリソースを送る
 WebSocketみたいな感じ?

HPack
→httpヘッダの変更した箇所だけを送信するようにする

HTTP/2 Java
Jetty
JavaSE9で取り込む予定
JEP110
JEPのゴールは古いものを新しくする

http://www.oracle.co.jp/jdt2016/pdf/4-B.pdf


特に気になったのは「Project Jigsaw」と「HTTP/2」かな...。
ちゃんと理解ができていないのでもっと調べる必要があるな。

JavaDayTokyo2016に向けて予習

1.MVC1.0(JSR371)

JavaEE8.0の新機能。

JSFというJavaEE標準でWebアプリケーションフレームワーク
存在するが、コンポーネントベースのフレームワークである。

コンポーネントベース
→表示する画面とそれに対応する画面処理クラスがあるイメージ。
 (1つの画面に対して、その画面専用の処理クラスがある)
 リクエスト時はViewに直接アクセスする。
 Viewに直接アクセスするため、開発とデザインを分業できる。
 (JSPのように処理クラスを介さなくても、画面イメージを表示できる)

アクションベース
→全てのリクエストがアクションクラスを経由し、アクションクラス内で
 表示するViewを決定する。

JavaEE標準でアクションベースのフレームワークが求められている。
SpringMVCのような機能がJava標準の機能になるみたいな感じ。

【参考サイト】
Java EE 8先取り!MVC 1.0入門 [EDR2対応版] 2015-10-10更新
【JavaEE】今からでも間にあうJSF入門
JSR 371(MVC 1.0) Early Draft version 1.0 の日本語訳(前編) - Java EE 事始め!

2.Oracle Cloud Platform

Oracle Cloud Platformはオラクルが提供するPaaS。

クラウドサービスの種類について
IaaS
→ネットワーク・ハードウェア・OSとOSレイヤから
 下を提供する

PaaS
→ネットワーク・ハードウェア・OS・ミドルウェア
 ミドルウェア層までを提供する

SaaS
→ネットワーク・ハードウェア・OS・ミドルウェア・アプリケーション
 までを完全にサービス化しているもの

Oracle Cloud Platformは
Oracle Database Cloud Service」と「Oracle Java Cloud Service」の
サービスがあり前者がDB関係、後者がJavaEEアプリの開発/実行基盤関係

また、「Oracle Java Cloud Service」以外にもJavaSEやNode.jsに対応した
ものもある。

【参考サイト】
開発/検証環境にクラウドを活用する3つのポイントとは?:Oracle Cloud Platformを使うべき理由──他と何がどう違うのか (3/3) - @IT
IaaS PaaS SaaSの違い|クラウドエース(Cloud Ace)

3.JavaFX

リッチインターネットアプリケーションのGUIライブラリ。
AWTやSwingとは異なるもの。
JavaFX1ではJavaFXScriptという言語で開発する仕組みだったが、
JavaFX2からJavaAPIに置き換わった。

4.HTTP/2

GoogleがSPDYというプロトコルを作成していて、
その進化版がHTTP/2。

HTTP/1.1ではHTTPパイプラインという前回のリクエストを
待たずに次のリクエストを送信できる仕組みがあった。
しかし、サーバーはリクエストの順番にレスポンスを返すという
制限があるため、最初のほうのリクエスト処理が遅くなると
後続のリクエスト処理が遅くなるということがある。

HTTP/2では1つの接続にストリームの多重化を行うことで
HTTPパイプラインの問題を解消している。

JavaSE9でHTTP/2のサポートが実現される。

【参考サイト】
HTTP/2の特徴 HTTP/1.1との違いについて | REDBOX Labo






 

初夏のJavaScript祭りで発表されたスライドを集めてみた

5月14日(土)に開催されていたが所用で
参加できなかった。

初夏のJavaScript祭2016 inテコラス – JavaScript祭


なので、発表で使われた(であろう)スライドを
探して集めてきた。


14:55 – 15:10
フロントエンドのNPM活用法
hello npm // Speaker Deck


16:25 – 16:40
ES2015の今とこれから
ES2015の今とこれから


16:45 – 17:00
JAVASCRIPTでデバイス連携してみて出会える技術!広がる知識!
2016初夏のJavaScript祭り20160514


LT
Ramdaで手軽に関数型プログラムを始めよう
Ramdaで手軽に関数型言語を始めよう // Speaker Deck


今回はJavaScript祭りに参加できなかったけど、
21日にはJJUG CCC 2016 Spring、24日にはJavaDayTokyoに参加予定なので楽しみ。

Java8のOptionalを試してみた1

Java8のOptionalでは値が無い場合は
nullではなく、emptyというオブジェクトが返ってくるらしい。

以下、ソースコード
JavaTrial/OptionalTest.java at master · sndstudy/JavaTrial · GitHub

package test.java;

import java.util.Optional;

/**
 * Optionalのテスト
 *
 */
public class OptionalTest {

	public static void main(String[] args) {

		/********************************/
		/*				*/
		/*nullの判定(Optional未使用)	*/
		/*				*/
		/********************************/

		String hoge = "hoge";

		if(null != hoge){
			System.out.println(hoge);
		}


		/********************************/
		/*				*/
		/*nullの判定(Optional使用)	*/
		/*				*/
		/********************************/

		//値をラッパーする
		Optional<String> hogeOpt = Optional.ofNullable(hoge);

		//isPresent()は値がある場合はtrue
		//nullの場合はfalseを返す
		if(hogeOpt.isPresent()){
			//get()で値を取得する
			System.out.println(hogeOpt.orElse(hogeOpt.get()));
		}


		/********************************/
		/*				*/
		/*nullの判定(ラムダ式使用)	*/
		/*				*/
		/********************************/

		//ifPresent()はnull以外の場合に処理を実行する
		hogeOpt.ifPresent(str -> System.out.println(str));


	}

}

今までの値のnull判定はこうだった。

/********************************/
/*				*/
/*nullの判定(Optional未使用)	*/
/*				*/
/********************************/

String hoge = "hoge";

if(null != hoge){
	System.out.println(hoge);
}

Optionalではこうなる

/********************************/
/*				*/
/*nullの判定(Optional使用)	*/
/*				*/
/********************************/

//値をラッパーする
Optional<String> hogeOpt = Optional.ofNullable(hoge);

//isPresent()は値がある場合はtrue
//nullの場合はfalseを返す
if(hogeOpt.isPresent()){
	//get()で値を取得する
	System.out.println(hogeOpt.orElse(hogeOpt.get()));
}

ソースコード量はあまり変わらないが、Optionalを使用することで
"この値は空の可能性がある"ということを明示的にすることができるみたい。


ラムダ式で書くとこうスッキリする。

/********************************/
/*				*/
/*nullの判定(ラムダ式使用)	*/
/*				*/
/********************************/

//ifPresent()はnull以外の場合に処理を実行する
hogeOpt.ifPresent(str -> System.out.println(str));

Java8で追加されたOptionalを使いこなせば、
NullPointerExceptionが起きにくいコードが書けるようになるかも。