ショートカット集(Windows・EXCEL・Chrome)
意外と知らなかったショートカットを備忘メモ。
あまりにも知っている内容は除外していて、個人的に知っていれば便利そうなショートカットに絞っています。
Windows
デスクトップの表示 Windows + D
タスクマネージャーを開く Shift + Ctrl + Esc
マウスの右クリックと同じ動作 Shift + F10
アプリケーションを閉じる Alt + F4
EXCEL
日付を入力する Ctrl+ ;
現在時刻を入力する Ctrl+ :
セルの書式設定を表示 Ctrl + 1
新しいフォルダーを作成する Ctrl+ Shift+ N
指定した範囲のスクリーンショットを撮影する Windows+ Shift+ S
パソコンをロックする Windows+ L
クイックリンクメニューを表示する Windows+ X
Chrome
タブを閉じる Ctrl + W
アドレスバーを選択 Alt + D、F6、
予測候補を削除する 検索候補の表示中に ↓→ Shift+ Delete
ページをブックマークする Ctrl+ D
ブックマークバーの表示を切り替える Ctrl+ Shift+ B
履歴画面を表示する Ctrl+ H
ダウンロード画面を表示する Ctrl+ J
ページを拡大、縮小する Ctrl+ +ー
ページを元の倍率に戻す Ctrl+ 0
DB2のコマンド整理
DB2を使うことになったのでよく使いそうなコマンドを整理しておく。徐々に更新していくかも。
対象バージョンはV 9.7
データベースへの接続
db2 connect to {データベース名} user {username} using {password}
データベース接続の解除
b2 connect reset / db2 terminate
※resetとterminateの違いは?
https://www.ibm.com/support/knowledgecenter/ja/SSEPGG_9.7.0/com.ibm.db2.luw.admin.cmd.doc/doc/r0001973.html
TERMINATE と CONNECT RESET は両方ともデータベースへの接続を中断しますが、 TERMINATE のみがバックエンド・プロセスを終了します。
ファイルのコマンド・SQLを実行する。
$ db2 -tvf FILENAME
-t: セミコロンをステートメントの終了文字とする
-v: 実行結果を標準出力に出す
-f: ファイルを入力にする
その他のオプションは以下のサイトへ。
https://www.ibm.com/support/knowledgecenter/ja/SSEPGG_9.7.0/com.ibm.db2.luw.admin.cmd.doc/doc/r0010410.html
データをファイルへの書き出す。
db2 export to FILENAME of del "select * from employee"
「of del」は出力ファイルの形式指定で、カンマ(,) 区切り文字付き ASCII フォーマットで出力される。
他の出力フォーマットとしてixf(DB2バイナリ形式)がある。
データをファイルから読み込む。
db2 import from FILENAME of del [insert|replace] into TABLENAME
db2 load from FILENAME of del [insert|replace] into TABLENAME
insertは追加、replaceは洗い替えを行う。
大量データの場合はloadコマンドの方が高速に処理できる。ただしトランザクションログを残さない。
インポート・ユーティリティーとロード・ユーティリティーの相違点
https://www.ibm.com/support/knowledgecenter/ja/SSEPGG_9.7.0/com.ibm.db2.luw.admin.dm.doc/doc/r0004639.html
リスト表示関連
テーブル一覧の確認
db2 list tables
SQLでも確認可能
SELECT * FROM SYSIBM.TABLES;
SELECT * FROM SYSIBM.TABLES WEHRE TABLE_SCHEMA = 'スキーマ名';
テーブルスペースの情報
db2 list tablespaces show detail
テーブル定義を確認
db2 DESCRIBE TABLE test_table
初めてAmazon CESを触る前にざっくりと調べた概要メモ
AWS ECS(Amazon Elastic Container Service)とは、Docker コンテナのオーケストレーション。
クラスタ
新規または既存のVPC内にAmazon ECS クラスタを構成する。
クラスタとは1つのかたまりとしてタスクを可動させるためのコンテナ(EC2)群。
設定画面では、EC2インスタンスタイプ、インスタンス数、VPC、サブネットなどを設定する。
コンテナは、Docker技術を使用しており、 インスタンスイメージはDockerfile から構築される。
docs.aws.amazon.com
タスク定義
アプリやバッチ処理をコンテナ上で実行するためのタスク定義を行う。
コンテナイメージのURL、CPU、メモリのハード/ソフト制限、環境変数の設定、
コンテナの開始時に実行するコマンドなど、様々なパラメータをJSON形式で設定可能。
具体的なパラメータは使用する起動タイプに応じて変化する。
サービス定義
タスクとクラスタを関連付ける。
設定する内容としては、サービス名とタスク数(起動するコンテナの数)。
また、ECSではサービスのコンテナ間のトラフィックを負荷分散するためのELBを設定することができる。
タスクのスケジューリング
ScheduleTaskをりよう
CloudWatchのイベントのルールやターゲットを使用して、cronのようなスケジュール実行の設定ができる。
ラムダ式その1
ラムダ式はメソッド定義を式として記述できるJava8以降の言語仕様。ラムダ式を使うことで、クラスやインタフェースより小さな粒度の振る舞いを抽象化することができる。
public class Main { @FunctionalInterface interface Appender{ public void app(StringBuffer sb,String s); } public static void main(String[] args) { Appender appender = (sb,s) -> sb.append(s); StringBuffer result = new StringBuffer(); appender.app(result, "aaa"); appender.app(result, "bbb"); System.out.println(result); } }
ラムダ式の文法
(仮引数列)-> {処理本体の文(複数)}
または
(仮引数列)-> 処理本体の式
(int x,int y) -> {return x + y;}
または
(int x,int y) -> x + y
// 仮引数の型名は省略できる。すべてを省略するかすべてを省略しないのどちらか。 (x,y) -> x + y // 仮引数が一つの場合は丸括弧を省略できる。 x -> x + 1 // 仮引数が一もない場合は場合は丸括弧は省略できない。 () -> 1 // 中括弧でくくった場合、returnする必要がある。 x -> {return x + 1;} // 中括弧でくくった場合、複数行の記述が可能。 x -> { x + 1; return x; }
ラムダ式とローカル変数の関係
import java.util.function.Consumer; public class Main { // Consumerは標準関数型インタフェースの一つ(入力があり、出力なし) Consumer<String> createProc(String paramValue){ String localValue = "local"; Consumer<String> proc = s-> System.out.println("s:"+ s + ",paramValue:" + paramValue +",localValue:" + localValue); return proc; } public static void main(String[] args) { Main ma1 = new Main(); Consumer<String> proc = ma1.createProc("aaaa"); // ラムダ式メソッドの実行 proc.accept("bbbb"); } }
実行結果
s:bbbb,paramValue:aaaa,localValue:local
標準関数型インタフェース
java.utilfunctionパッケージで定義される関数型インタフェース。
Function | R apply(T t) | T型オブジェクトによる入力、R型オブジェクトの出力 |
Predicate | boolean test(T t) | T型オブジェクトによる入力、boolean型の出力 |
Consumer | void accept(T t) | T型オブジェクトによる入力、出力なし |
Supplier | T get() | 入力なし、T型オブジェクトの出力 |
標準型インタフェースで初めの処理を書き直した例
import java.util.function.*; public class Main { public static void main(String[] args) { IntFunction<StringBuffer> create = StringBuffer::new; StringBuffer sb = create.apply(8); Function<String, StringBuffer> appender = sb::append; appender.apply("abc"); BiConsumer<StringBuffer, String> appender2 = StringBuffer::append; appender2.accept(sb, "def"); System.out.println(sb); } }
実行結果
abcdef
インタフェースの設計
インタフェースとは、振る舞いを部品として抽象化するための言語仕様。クラスと違い実体化できずメソッドも実装を持たない。インタフェースの設計にあたっては、クラス間の依存を少なくするよう留意する。
以下に留意点をまとめる。
コードの依存性
他のクラスへの依存性が少ないほど、そのコードは堅牢ということになる。通常、クラスへの依存より、インタフェースへの依存のほうが保守に強いコードとなる。
・変化しにくい振る舞いを規定してインタフェースにまとめる。
・クラスはインタフェースを継承することで、変化しにくい部分を表明する。
・可能な限りクラスよりインタフェースに依存するように書く。
インタフェースと抽象クラス
実装上、インタフェースの役割は抽象クラスでも担える。ただし根本的な目的は異なっている。抽象クラスによる実装を伴う継承関係はクラス間に強い依存関係をもたらしてしまう。そのため、インタフェースは実装を一切持たず、振る舞いのみを規定する機能に限定されている。
インタフェース :振る舞いを規定する。
抽象クラス :実装の拡張を行う。
インタフェース実装例
インタフェース依存によりクラス間の依存を減らすことができる。直接、メソッドを呼び出せばコードとしては単純になるが、クラス間の依存が強くなる。
MyFilter.java (インタフェース)
public interface MyFilter { String doJob(String input); }
ReplaceFilter.java (インタフェースの実装クラス)
public class ReplaceFilter implements MyFilter { private final String oldStr; private final String newStr; public ReplaceFilter(String oldStr,String newStr){ this.oldStr = oldStr; this.newStr = newStr; } @Override public String doJob(String input) { return input.replaceAll(oldStr, newStr); } }
CapitalizeFilter.java (さらにインタフェースを実装したクラス)
public class CapitalizeFilter implements MyFilter { @Override public String doJob(String input) { return input.toUpperCase(); } }
MyEcho.java (実行クラス)
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Arrays; import java.util.List; public class MyEcho { private final List<MyFilter> filters; public MyEcho(List<MyFilter> filters){ this.filters = filters; } public void exec() { try(BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in))) { while(true) { System.out.println("Input any text"); String msg = stdin.readLine(); String output = msg; for(MyFilter filter : filters) { output = filter.doJob(output); } System.out.println("You sey " + output); } }catch(IOException e) { e.printStackTrace(); } } public static void main(String... args) throws ReflectiveOperationException{ MyEcho echo = new MyEcho(Arrays.asList(new ReplaceFilter("he", "she"),new CapitalizeFilter())); echo.exec(); } }
テキストの整形処理部分を外部に追い出し、呼び出し方法をインタフェース化する。これにより整形処理に変更があっても実行クラスへの変更は最小限になる。
アノテーションによるコード呼び出し
アノテーションを定義する例と、リフレクションによるアノテーションのコード呼び出し例。
MyFilterというアノテーションを定義する。
実行時にリフレクションによる呼び出しを行うので、RetentionはRUNTIMEを指定する。
import java.lang.annotation.*; @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface MyFilter { enum Potion{ BEFORE, AFTER, } Potion value(); }
CapitalizeFilter.java 定義したアノテーションを適用する。
public class CapitalizeFilter { @MyFilter(MyFilter.Potion.BEFORE) public String doJob(String input) { return input.toUpperCase(); } }
次のコードでCapitalizeFilterクラスから、MyFilterアノテーションを適用したメソッドを呼び出しを行う。
isAnnotationPresentでアノテーションの有無を判定を行う。
getAnnotationでもアノテーションの参照を取得しているので、やや冗長かもしれない。
MyEcho.java
import java.io.*; import java.lang.reflect.*; import java.util.*; public class MyEcho { private static class Filter{ Filter(Object obj, Method method){ this.obj = obj; this.method = method; } final Object obj; final Method method; } private final List<Filter> filters = new ArrayList<>(); public MyEcho(String... classNames) throws ReflectiveOperationException{ // プラグインコードのロード for(String className : classNames) { Class clazz = Class.forName(className); // リフレクションを使用してクラス名を取得 for(Method method : clazz.getMethods()) { System.out.println("MyFilter.class " + MyFilter.class); if(method.isAnnotationPresent(MyFilter.class)) { // アノテーションの有無を判定 System.out.println("method " + method); MyFilter myfilter = method.getAnnotation(MyFilter.class); if(myfilter != null) { switch(myfilter.value()) { case BEFORE: filters.add(0,new Filter(clazz.newInstance(),method)); break; case AFTER: filters.add(new Filter(clazz.newInstance(),method)); } } } } } } public void exec() { try(BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in))) { while(true) { System.out.println("Input any text"); String msg = stdin.readLine(); String output = msg; for(Filter filter : filters) { output = (String)filter.method.invoke(filter.obj, output); } System.out.println("You sey " + output); } }catch(IOException| ReflectiveOperationException e) { e.printStackTrace(); } } public static void main(String... args) throws ReflectiveOperationException{ MyEcho echo = new MyEcho(args); echo.exec(); } }
実行結果
java MyEcho CapitalizeFilter Input any text abc You sey ABC
アノテーションの基礎
アノテーションとは、プログラムの構成要素に付与するメタ情報で、修飾子の一つとして機能する。Java SE 5 から導入された機能であり、 @Xxxxxx の形式で、Java の言語機能で表現できない補足情報を注釈 (annotation) として記述するための仕組み。アノテーションはコンパイラや解析ツール、もしくはフレームワークによって処理される。
アノテーションの役割
アノテーションの主な役割として「構文補助」と「宣言的プログラミング」がある。
- 構文補助
@Overrideなどが構文補助にあたり、活用することでJavaの文法の独自拡張に近いことができる。
- 宣言的プログラミング
プログラムを機能や役割で部品に分解し、形式的に記述する。ツールやフレームワークで解析することで、部品の間をつなぐコードを自動生成することができる。
標準アノテーション
Javaの標準ライブラリでで提供されているアノテーションのことを、標準アノテーションと呼ぶ。
アノテーション名 | 説明 |
---|---|
@Override | オーバライドしたメソッドであることを明示 |
@Deprecated | 非推奨メソッドであることを宣言 |
@SuppressWarnings | 警告メッセージを抑制 |
アノテーション型の宣言
アノテーションは型の一種であり、他の型同様に独自で作成することができる。
@interfaceが指定されているクラスは、暗黙的にjava.lang.annotation.Annotationインタフェースの継承クラスになる。
アノテーション型の宣言の文法
[修飾子] @interface Annotation名{ キーの型 キーの名前(); // アノテーション要素 ... } // アノテーション要素のある例 public @interface SuppressWarnings { String value(); } // enumを利用したアノテーション要素のある例 public enum eType {AAA, BBB, CCC} @interface EnumAnnotation { eType value(); } //複数のアノテーション要素のある例 public @interface MyAnnotation { String foo(); int bar(); class cls(); String[] qux(); } //デフォルト値を指定した複数のアノテーション要素のある例 public @interface MyAnnotation { String foo() default "aaa"; int bar(); class cls(); String[] qux(); }
アノテーション要素の型は次に限定される。
アノテーション要素のないアノテーションをマーカーアノテーションと呼ぶ。(@Overrideなど)
また、アノテーションの宣言は、抽象メソッド宣言と比較して次の制約がある。
- 引数は持てない。
- throws節が持てない。
- ジェネリックメソッドが使えない。
メタアノテーション
アノテーションを独自で作成する際に使用するアノテーションをメタアノテーションと呼ぶ。
あらかじめ用意されている標準メタアノテーション型は次のものがある。
アノテーション名 | 説明 |
---|---|
@Target | アノテーションが、どの要素に利用できるものかを宣言する |
@Retention | アノテーションの存在期間を宣言する |
@Documented | アノテーションをjavadocによる文書化の対象とする |
@Ingerited | アノテーションが独自に継承されることを宣言する。 |
@Repeatable | 同じ対象要素に同じアノテーションを複数指定可能(java8以降) |
Target アノテーション
アノテーションがどの要素(クラスやメソッドなど)に対して適用することができるかを定義する。指定する要素は enum 型の java.lang.annotation.ElementType で定義される。
値 説明
TYPE | クラス・インタフェース・enum・アノテーションの宣言 |
---|---|
FIELD | フィールドの宣言(enum定数を含む) |
METHOD | メソッドの宣言 |
PARAMETER | メソッドのパラメータの宣言 |
CONSTRUCTOR | コンストラクタの宣言 |
LOCAL_VALIABLE | ローカル変数の宣言 |
ANNOTATION_TYPE | アノテーション型の宣言 |
PACKAGE | パッケージの宣言 |
Retention アノテーション
アノテーションで付加された情報がどの段階まで保持されるかを定義する。指定する段階は enum 型の java.lang.annotation.RetentionPolicy で定義される。
値 | 説明 |
---|---|
SOURCE | ソース上だけのアノテーションで、クラスファイルには記録されない。 |
CLASS | クラスファイルにもアノテーションの情報が記録される。実行時にはロードされない。Retention アノテーションを指定しなかった場合、CLASS がデフォルトで定義される。 |
RUNTIME | クラスファイルに情報が記録され、さらに実行時にも情報がロードされる。JavaプログラムからリフレクションAPIを利用してアノテーションの情報を読み取るためには、この種別が必要。 |