ITと創作でねこを飼いたい

プログラミングやITで勉強したこと、疑問をまとめます。

ラムダ式の整理(試験対策)

今回はJavaラムダ式の構文についてまとめたいと思います。
ラムダ式を使ってコードを書こうってよりは、Java SilverやGoldのための試験対策といった感じです!
しかし若干横道に逸れます(笑)

基本

まず前提として、「実装が必要なメソッドを一つだけもつインターフェース」を作成する必要があります。 このようなインターフェースは「関数型インターフェース」と呼ばれます。

例えば以下のような関数型インターフェースがあった場合

interface Func {
    void dosomething(String str);
}

文字列を出力するラムダ式

(String str) -> { System.out.println(str); };

と書くことができます。 ちなみに (肝要な部分ではないので読み飛ばして大丈夫です)

(String str) -> { System.out.println(name); };

なんてするとコンパイルエラーですが、

(String name) -> { System.out.println(name); };

はありです。(インターフェースの中の変数名と同じにする必要はない)

上記のラムダ式と呼ばれる構文は、関数型インターフェース型の変数に代入して利用します。
試験勉強だけしていると意外と抜け落ちてしまうのですが(斯く言う私がそうですが、、)
関数型インターフェースのメソッドを呼び出すことで初めて、ラムダ式で定義した処理が実行されます(少し考えてみたら当たり前ですね)
プログラムで書くとこんな感じ

       String out = "ABC";
        Func funcout= (String str) -> { System.out.println(str);};
        //ABCとコンソールに出力される
        funcout.dosomething(out);

個人的に、ラムダ式のすごいところの一つは、
柔軟にメソッドの処理を変えられることではないかと思っています。
例えば、

       String out = "ABC";
        Func funcout= (String str) -> { System.out.println(str);};
        //ABCとコンソールに出力される
        funcout.dosomething(out);
        
        Func funcadd = (String str) -> { System.out.println(str + "!");};
        //ABC!とコンソールに出力される
        funcadd.dosomething(out);
        //ABCとコンソールに出力される(dosomethingの処理は当然上書きされない)
        funcout.dosomething(out);

上記プログラムのFunc型のfuncoutとfuncaddではメソッドdosomethingの処理が異なります。
これをラムダ式を使わずに書こうとしたら、あるクラスでオーバーライドして、mainメソッドでそのクラスをインスタンス化して・・・といった一手間も二手前もかける必要があります。
これだけでもラムダ式なんかすごい!(実装できたらカッコよさそう)

ラムダ式の省略

さて、横道はこのへんで、、ここからは試験対策に戻ります。
試験ではよくラムダ式の省略形が正しいのか判断する問題が出てきます。一通り省略のルールをまとめてみましょう。

まずは基本の構文

  関数型インタフェースの型 変数名 = (引数) -> {処理};

ラムダ式の引数の宣言では()を省略することができます

  関数型インタフェースの型 変数名 = 引数 -> {処理};

引数のかっこを省略するのであれば、引数の型は記述してはいけません。
また引数が二つの場合は引数の()は省略することができません

コンパイルエラーのパターン

  //どちらもコンパイルエラー(関数インタフェースへの代入は省略)
  String str - > {System.out.println(str);};
  a, b - > {System.out.println(a + b);};

さらに、実行したい処理が1つしかないのであれば、{}を省略することができます。

  //「処理」が一つしかない場合
  関数型インタフェースの型 変数名 = (引数) -> 処理;

さらにややこしいことに戻り値が存在した場合
{}省略→returnキーワードは記述できない
{}あり→returnキーワードを記述しなければコンパイルエラー

省略できるけど「ただし」がいっぱいつきます。
試験では混乱しないように!

Java.util.Functionパッケージ

関数型インターフェースについてJava SE8から標準でいくつか用意されたものが存在しています。
関数型インターフェースと関数メソッドの組み合わせはよく出てくるので加えて書いておきます。
(Java Silverの場合はPredicateしか試験では出てきません)

Consumer
引数を受け取って処理をする。結果を戻さない、引数の「消費者」
関数メソッド→void accept(T)

Supplier
何も受け取らずに結果だけを戻す「供給者」
関数メソッド→T get()

Predicate
引数を受け取ってそれを評価する「断定」
関数メソッド→boolean test(T)

Functions<T, R>
引数を受け取って、指定された型 (R)の結果を戻す「処理」
関数メソッド→R apply(T)

Java SilverもJava Goldも試験料は高いですが、よかったら受けてみてください!!
(私もGold来月受けるつもりです!頑張ります)

Spring MVCのform:selectタグの使い方

今回は、Spring MVCのform:selectタグにフォーカスします!(課題でぶつかったので)

参考プログラム

まずは前準備
User.java(userId,name,ageのgetter,setterとコンストラクタ)

public class User {
    
    private int userId;
    private String name;
    private int age;
    
    User(int userId, String name, int age){
        this.userId = userId;
        this.name = name;
        this.age = age;
    }
    
    public int getUserId() {
        return userId;
    }
    public void setUserId(int userId) {
        this.userId = userId;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    
}

RegisterForm.java
Spring MVCのformタグを勉強している人にはおそらくお馴染み(?)
私的に言わせてもらうなら「欲しい情報を入れて取り出す、枠組みオブジェクト」

import java.io.Serializable;

public class RegisterForm implements Serializable{

    private int id;
    private String text;

    public String getText() {
        return text;
    }

    public void setText(String text) {
        this.text = text;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }
}

InputController.java
次は肝心のコントローラー!
今回はGetでindex.jspに飛ばし、Postで同じURLに入ってRegisterForm.java の中の入力値をresult.jspで取り出します。

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

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
@RequestMapping("/")
public class InputController {

    @RequestMapping(method = RequestMethod.GET)
    public String behaveCheck(Model model) {
        List<User> userlist = new ArrayList<>();
        userlist.add(new User(1,"a",20));
        userlist.add(new User(2,"b",22));
        userlist.add(new User(3,"c",24));
        userlist.add(new User(4,"d",23));
        
        RegisterForm registerForm = new RegisterForm();
        model.addAttribute(registerForm);
        model.addAttribute("userlist", userlist);
        return "index";
    }
    
    @RequestMapping(method = RequestMethod.POST)
    public String behaveResult(Model model,RegisterForm registerForm) {
        model.addAttribute(registerForm);
        return "result";
    }
}

ポイントはselectで選択するリストもmodelに格納すること!!
(今回はuserlistに相当します)

index.jsp
ここでようやくform : selectの登場です。

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>入力</title>
</head>
<body>
    <form:form modelAttribute="registerForm">
    ユーザーセレクト
    <form:select path="id">
    <form:options items="${userlist}" itemLabel="name" itemValue="userId"/> 
    </form:select>
        テキスト入力<form:input path="text" />
        <form:button>送信</form:button>
    </form:form>
</body>
</html>

ポイントは
pathの中の値はRegisterForm.java のフィールドだけ
form:optionsのitems属性にはmodelに格納したリスト(今回はuserlist)
form:optionsのitemLabel,itemValueにはuser(リストに入っているオブジェクト)のフィールドを指定する
itemLabel→jspに表示される値
itemValue→registerFormに格納される値(今回はregisterFormのidにselectしたuserIdが入ります)

result.jsp
InputControllerを経由してregisterFormに格納された値を確認
(EL式で出力しただけ!適当!)

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>結果</title>
</head>
<body>
${registerForm.id}
${registerForm.text}
</body>
</html>

${registerForm.id}でselectしたuserIdが表示
${registerForm.text}でテキストボックスに入れたテキストが出力

まとめ

これで出力されたuserIdの人が、がテキスト「〜(任意)〜」を入力したんだってのが管理できるわけだ! 今回は以上!

ipadでduetを更新したら一瞬使えなくなった話

どうも!今回はちょっとだけ戸惑ったことについて記事にします。

タイトルの内容に入る前の余談

研修でもちょっと教えてもらったので、今回からMarkdown記法で書こうと思います。

基本設定をMarkdown記法に変えて「編集画面反映されてないぞ?!?!」となったのですが、
一度下書きで保存していた記事は、編集モードを変えることができないそうです。
(この記事の下書きが一行だけでよかった)

そもそもduetって?

ipadを外付けディスプレイにすることのできるアプリです。
公式サイト
私が唯一課金したアプリで、金額は1200円ほどでした。
ipadデュアルディスプレイが実現できるので重宝しています。

ipadのアプリを更新したら・・・

ところが、ipadのアプリを更新してmacにつないでみると、
全然反応しない
えっ、お金払ったのに使えなくなっちゃうの??となった訳です(汗

ipadのアプリを更新したらパソコンも更新しよう

当たり前といえば、当たり前だとは思うのですが、
ipadのアプリを更新したら、pcのduetも更新しなければなりません。 これがちょっとだけ分かりずらい。

f:id:ashanoguzyutu:20180430233723p:plain:w300

まず、メニューバー右上の丸dボタンをぽちり

f:id:ashanoguzyutu:20180430233730p:plain:w300

ここで案外ひっかかったのが「詳細設定」を押してしまったこと
これは画面のサイズ等の設定なので違います。
歯車ボタンを押しましょう。

f:id:ashanoguzyutu:20180430233735p:plain:w300

メニューに「アップデートの有無を確認」があるので、これを押せば
アップデート内容確認が出てアップデートできます!

4月頭くらいに更新したときは若干安定していませんでしたが、
これで使えないという状況は打破できます!!

ではでは、今回はブログの書き方の練習もかねてかるーい記事でしたー
5月中はもっと記事更新していきます!

SQL文の基本(自分用のメモ)

今回はどうしても忘れてしまう自分のために、空で書けるようSQL文についてまとめたいと思います(ほぼ自分用です)

 

データベースの確認

SHOW DATABASES;

 

データベースの作成

CREATE DATABASE データベース名;

 

データベースの接続(正確にはSQL文ではない)

CONNECT データベース名

USE データベース名

注)SQL文ではないので「;」はつけない。

 

テーブルの確認

SHOW TABLES;

 

テーブルの作成

CREATE TABLE テーブル名(

  列名 データ型 [制約]

);

CREATE TABLE USER_INFO (

   LOGIN_ID VARCHAR(100) NOT NULL PRIMARY KEY,

  PASSWORD VARCHAR(100) NOT NULL,

  NAME VARCHAR(100) NOT NULL

);

 注)フィールドの定義を続けて書く場合は「,」で区切る。ただし最後のフィールド定義の後には必要ない。

([]で囲った部分は省略可能)

 

テーブルに新しいレコードを挿入する場合

・全てのフィールドを挿入する

INSERT INTO テーブル名 VALUES( 値 [, 値, ・・・] );

例)

INSERT INTO USER_INTO VALUES('123','abcd','aiu');

 

・一部のフィールドを挿入する

INSERT INTO テーブル名 ( 列名 [, 列名, ・・・] ) VALUES ( 値 [,  値, ・・・] );

 

テーブルのレコードを更新する

UPDATE テーブル名 SET 列名=値 [,列名=値] [WHERE 条件];

 

レコードの削除

DELETE FROM テーブル名 [WHERE 条件] ;

 

ファイルに記述されたSQLを実行する

SOURCE ファイル名

注)SQL文ではないので「;」はつけない。

 

<<レコードの検索>>

・一つのフィールド(列)に対するレコード

SELECT 列名 FROM テーブル名;

 

・二つのフィールドに対するレコード

SELECT 列名, 列名, FROM テーブル名;

 

 ・全てのフィールドのデータの取得

SELECT * FROM テーブル名;

 

・重複するレコードを除外する

SELECT DISTINCT 列名 FROM テーブル名;

 

・クエリによって抽出されるレコード件数を取得したい場合

SELECT COUNT(*) FROM テーブル名;

 

・クエリによって抽出するレコードのフィールドに対して別名をつける

SELECT 列名 AS 別名 FROM テーブル名;

 

・検索条件を指定してレコードを絞り込む

SELECT 列名 FROM テーブル名 [WHERE 条件]

 

例)EMPテーブルから給料(sal)が1250以上,2500以下であるレコードの抽出

SELECT * FROM EMP WHERE SAL <= 1250 AND SAL >= 2500;

SELECT * FROM EMP WHERE SAL BETWEEN 1250 AND 2500;

BETWEENの前にNOTをつけると否定になる。

 

その他

・列挙した値を含むレコードを抽出する→IN

例)SELECT * FROM EMP WHERE DEMPTNO IN (10, 30);

 

・文字のパターンマッチングに利用→LIKE

例)SELECT * FROM EMP WHERE ENAME LIKE 'A%';

 

・SELECT文の結果をソートして表示する→ORDER BY 列名 [DESC | ASC]

デフォルトはAscending(昇順)

 

・フィールドをグループ化する→GROUP BY 列名

↑グループ化した場合の条件→HAVING(WHEREではない)

 

ポイント

ほぼほぼテーブル名の記述が必要。

テーブル名書いてなかったら、「間違えたかも」と思った方あ良さそう。

 

 

論文の書き方(主に体裁について)

 初っ端からIT関連の記事ではないのですが、大学で学んだことで「これは覚えておきたいor役にたつかな?」と思える内容の一つをまとめたいと思います。こういった記事については、今後も何度か書く予定です。

大層なタイトルではありますが、自分が教授に注意されたことについてつらつらと書く形になります(汗)

(あくまで一例です)

言葉使い

 ざっくりいうと、「漢字にするか、漢字にしないか」の話。

例えば

する事がわかった→することがわかった

出来ない→できない

従って→したがって(接続詞は基本的にひらがな)

等です。学会ごとに規定が設けられているのが一般的で、電気電子情報通信学会なら以下のようにまとめられています。

http://www.ieice.org/jpn/shiori/pdf/furoku_d.pdf

参考文献

  これも学会ごとにまとめられていることが多いかと。上記と同じように電子情報通信学会であれば

http://www.ieice.org/jpn/shiori/cs_2.html#2.6

にまとめられています。「先輩の書き方をコピペすればいいや」と思っている方も多いとは思うのですが、それでも「統一感」は大事です。複数の論文からコピペして書き方がいつの間にか違ってる、ということはよくあるので注意が必要。

(参考までに自分が書いていた分)

日本論文

  • 辻宏之, ”アレーアンテナを用いた屋内外の無線局位置推定の実験的検証,” 信学論B, vol.J90-B, no.9, pp.784-796, Sept. 2007.

英語論文

  • R. O. Schmidt, “Multiple emitter location and signal parameter estimation,” IEEE Trans. Antennas Propag., vol.34, no.3, pp.276-280, Mar. 1986.

また引用した文献は本文中のどこで参考にしているのか、必ず文献番号を明示すること。論文全体でその文献を参考にしているからと書かないのはNG

図と表のキャプション

 英語の場合、キャプション、縦軸横軸のラベル。図中に書く文字は全て最初の単語の最初の文字だけ大文字、あとは小文字にする。(タイトルの英語は別)

図のキャプションは

Fig. 1 Configuration of simulation system.

のように、最後に必ずピリオドをつける。「Fig. 1」は「Fig.(半角スペース)番号」の日表記にする。

 表のキャプションは「Table 1」のようにし、Tableの後にピリオドは入れない。

(Fig. 1の場合はFigureの略なのでピリオドをつける)

Fig.と同様にTable名の最後にピリオドをつける。

また、文中で図や表を言及したい場合は、英語は英語、日本語は日本語で表記するのが一般的。

式の書き方

 式には式番号をつける。番号は右端の揃った位置に。(私の場合は「表」を見えないようにして調整していました)

式のフォントの大きさは本文と一緒。(ただし、変な位置で改行してしまうような場合、私は少し小さいフォントを使っていました)

<よく間違える↓>

式の後は、式の末尾にピリオドを書かない限り、インデント(行頭のスペース)しない。例えば、式の後に「ここでxは●●である」のような式の変数の定義を書く場合はインデントはしてはいけない。

式中で日本語を書くことはあまりない。「sin」「exp」などの関数は立体で表記する。

式を文中で言及する場合「(1)式」ではなく「式(1)」と書く。

英語の省略語

 省略語を使う場合には、最初に出てきた際にフルスペルが何であるか必ず書く。

例)RMSE(Root Mean Squared Error)

私はカッコにフルスペルを書いていたが逆の方が良い場合もある。

パラメータについて

シミュレーションや実験で変化させるパラメータの設定をいちいち文章で書かない。基本は表などにまとめる。文章に書くべきなのはパラメータ設定の理由など。

細かい色々

・英数字のフォントはTime New Roman

スカラー変数はイタリック(斜辺)

・ベクトルは小文字ボールド

・行列は大文字ボールド

・数字は変数の中に入っていたとしてもイタリックにしない

(f(t)などと書く場合()をイタリックにしないように)

・図をwordに貼る場合は「拡張メタファイル」を貼り付けのオプションで選択。「拡張メタファイルは」一番扱いやすく、鮮明な部類である。

(ホーム画面貼り付けの矢印を押せば出てくる)

・「図をみる」という表現は論文っぽくない。

・グラフという言葉も論文っぽくない(論文っぽいか否かは口語的かどうかに依存する)

・「の時」「のとき」→「の場合」にする。

・カラー印刷・白黒印刷は分けて原稿を作成する。

 

あけましておめでとうございます(ブログ準備中、簡単な自己紹介と方針紹介)

あけましておめでとうございます。

「逆さのくま」(現:ニックネーム)です。

 

元旦に新しいことを始めようということでブログ開設しました。

このブログではプログラミング、IT関連で勉強したこと、疑問に思ったことをまとめたいと思っています。

 

実は晨暉悠翔(しんきゆうと)というペンネームで小説を書くといった活動も行なっております。

小説家になろう、自作HP、pixiv(ここでは二次創作)などとっちらかっているのですが、「創作の勉強をする。創作する人を応援する」という意味では、はてなブログを含め一貫してるつもりです。

 

実はFC2でもブログをやっているのですが「創作(主に小説関連)」と「プログラミングの勉強(今後の仕事に関わる)」で分けるつもりです。

(ブログとしてはてなブログの方が中心になるかもしれません)

 

最後に自作HP紹介して、今回は終わります。

唖者の愚述

ではまた次回!「さかさくま」でした!