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

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

Javaの16進数から10進数への変換についてのメモ

負の数(2の補数)を考慮した場合の16進数から10進数への変換について、 なかなか求めている情報が出てこない(なかった)のでここにメモ。

やりたかったこと

16進数で負の数(2の補数)を考慮した値を考えるには、 2進数表記で桁数を何桁に設定するのかってのが大事になります。 (大学や情報技術者試験の勉強でそう学んだ)

その桁数を可変にできるようにしたかった。

結果

そういうライブラリとかあるかなって思ったのだが、
うまく見つけることができませんでした。検索で引っかかるサイトは以下

苦肉の策として2つ目と3つ目のサイトの合わせ技をしました。 2つ目のサイトで

    int n1 = Integer.parseInt(arg, 16);
    int n2 = (byte)Integer.parseInt(arg, 16);

という部分に"FE"を代入すると、 n1は254,n2は-2となる理屈を考えます。
それは型の最大桁数に起因するものです。

つまりInteger.parseInt(arg, 16)をbyteにキャストすると、 8ビット(16進数で2桁)の2の補数で処理されるのです。

ということで、byte以外の型でキャストすれば、桁数を(自由自在ではありませんが)変更することができます。

    // 8ビットの2の補数/16進数で2桁の2の補数として処理したい場合
    int n1 = (byte)Long.parseLong("16進数文字列", 16);

 // 16ビットの2の補数/16進数で4桁の2の補数として処理したい場合
    int n2 = (short)Long.parseLong("16進数文字列", 16);

    // 32ビットの2の補数/16進数で8桁の2の補数として処理したい場合
    int n3 = (int)Long.parseLong("16進数文字列", 16);

一度大きな枠組みの型にしてからキャストする必要があるので、
3つ目のサイト内のように変換はLong.parseLong()を用います。 受け取る型は、キャストした型かそれよりも大きい型だったら大丈夫なはずです(厳密に確認できていない)
もちろん今回の方法ではJavaに用意されていない型(ビット数)では処理をすることができません。。。

終わりに

調べきれなかっただけで便利なライブラリはあるのかもしれません。
(知っているという方は、後学のために是非とも教えていただきたい)

Java Gold SE8でStreamAPIめっちゃ出てくるのでまとめてみる。

StreamAPI何問出てくるんだ(そして何問間違えるんだ・・・)
一回整理しようと思います。
試験対策>>>実装なのでご注意ください。
思っていたより長くなったのでざっくりとしたことが知りたい人は赤字周辺だけ読んでください。

基本

StreamAPIとはJava SE 8で新たに導入された「データ集合の操作用API」。
データ集合の個々のデータに対して様々な操作を順次行うことができる。

中間操作と終端操作

StreamAPIを使用したデータ操作では、
ストリーム処理の中間で適応される中間操作
最後に一度だけ適応される終端操作の二種類が存在する。
各操作のポイントは以下の通り

中間操作のポイント
・ストリームオブジェクトを返す。
・メソッド呼び出しの時点で処理が実行される訳ではなく、終端操作の実行時に実行される→遅延評価
・終端操作が適応されるまで何度も(0回以上)適応することができる。

終端操作のポイント ・処理の最後に一度だけ適応することができる。
・終端操作が適用されたストリームに対して再度ストリーム処理を適用することはできない。
→再度ストリーム処理を行おうとすると「実行時に例外がスローされる」

具体的な各メソッド

Stream<T>インタフェースのメソッドだが、問題集やってると「全部出てないか?」ってなる。(主要なものについてここに書きます!)
公式ドキュメント→Stream (Java Platform SE 8)
上記リンクのJava SE APIをぼんやり眺めるだけでも、個人的には勉強になるのではないかと思っています。
特にメソッドの引数と戻り値が分かっておくと試験問題が解きやすい
引数にはラムダ式(SAM)がよく登場するので、そこも注意です!!!!

中間操作のメソッド

Stream<T> filter(Predicate<? super T> predicate)
predicateの記述に一致にするストリームを返す。

<R> Stream<R> map(Function<? super T,? extends R> mapper)
mapperの戻り値をストリームとして返す。

<R> Stream<R> flatMap(Function<? super T,? extends Stream<? extends R>> mapper)
イメージとしてはコレクションを含んだstreamを各値の一連のストリームにするメソッド。

Stream<T> distinct()
重複を除いたストリームを返す。

Stream<T> sorted()
自然順序に並べてストリームを返す。ただしストリームの要素がComparableでない場合、例外がスローされる可能性がある。

Stream<T> sorted(Comparator<? super T> comparator)
こっちはComparator型のインスタンスを直接引数に取っている。つまりcomparatorに従って並べ替えたストリームを返す。

Stream<T> peek(Consumer<? super T> action)
よくコンソール出力とかをやっているところ。

Stream<T> limit(long maxSize)
maxSize個までのストリームを返す。

Stream<T> skip(long n)
nだけ要素を飛ばしたストリームを返す。

終端操作のメソッド

void forEach(Consumer<? super T> action)
ストリームの各要素に対して処理を行う。

void forEachOrdered(Consumer<? super T> action)
定義された実行順に従い、ストリームの各要素に対して処理を行う。

long count()
ストリームの要素の個数を返す。

boolean anyMatch(Predicate<? super T> predicate)
ストリームの各要素のうち、一つでも条件を満たせばtrue

ちなみに

       boolean result = Stream.of(1,2,3,4).anyMatch(p -> p == 2);
        System.out.println(result);

を実行してみましたが「true」が一つだけ出力されました。
(ブログ書きながら、一瞬 false true false..とかfalse trueとか出てくるのかと思った)

boolean allMatch(Predicate<? super T> predicate)
全てが条件を満たせばtrue

boolean noneMatch(Predicate<? super T> predicate)
全てが条件を満たさないのであればtrue

Optional<T> findFirst()
ストリームの最初の要素を返す。Optionalについては後述

Optional<T> findAny()
順序は保証されていないが、最初に見つけたストリームの要素を返す。

Optional<T> min(Comparator<? super T> comparator)
comparatorに従って、ストリーム要素中の最小値を返す。

Optional<T> max(Comparator<? super T> comparator)
comparatorに従って、ストリーム要素中の最大値を返す。

試験対策の呪文1
Stream<T>インタフェースではmin、maxメソッドに必ず引数が必要

R collect(Supplier supplier,
BiConsumer<R,? super T> accumulator,
BiConsumer<R,R> combiner
)
ストリームに対して可変リダクション操作を行う(今回は深掘りしない)
BiConsumerは二つの引数をとって結果を返さないラムダ式の型

そして終端操作で必ずといっていいほど出るのがreduce
おそらくメソッド名は「減らす」というより「縮める」といった意味合いで名付けられているのだと思う。
reduceメソッドには基本的に、以下の二つの種類が存在する。
(実はもう一種類存在するのだが、reduceメソッドの具体的な使い方も含めて、以下のサイトを参考にして欲しい)

qiita.com

T reduce(T identity,
BinaryOperator<T> accumulator
)
(初期値)identityから引数を順番に二つとって引数と同じ型を返すaccumulator(BinaryOperator)の処理を行う

Optional<T> reduce(BinaryOperator<T> accumulator)
ストリームから引数を二つとって、引数と同じ型の結果を返す。

試験的に大事なのは戻り値の型が違うこと

Optional<T>はAPIドキュメントをみる限り、「もしかしたらnullかもしれないけど、nullも含めて値として入れておくね」っていう型っぽい。中身の値を取り出すにはJava Gold SE8の試験では2/3くらいはget()メソッドが用いられている。(慎重に処理するならOptional<T>の別のメソッドの方が良さそう)

要約すると、、、
試験対策の呪文2
引数を一つしか取らないreduceメソッドでは結果の値を取り出すためにgetメソッドが必要

もちろん他のOptional<T>を返すメソッド(minとかmaxとか)にもgetは必要!!!!

Streamインタフェースの種類

f:id:ashanoguzyutu:20180717004002j:plain

基本はStream<T>インタフェースなのだが、他のもちょくちょく出てくるので厄介。
上の図を見てもらったら分かるが、StreamAPIはどれもBeseStreamを継承している。

StreamとIntStreamの違いは?

Stream<T>インタフェースは参照型(T型)のデータ集合を扱うためのインタフェース
IntStreamインタフェースはInt型(プリミティブ型)データ集合を扱うためのインタフェース。

ここだけ読むと「ああ、そう」ってかんじ。

ただJava APIドキュメントを見比べると分かるが、
Stream<T>インタフェースとIntStreamインタフェースでは、メソッドの内容が似ている割にintStreamインタフェースの方がメソッドの数が多い

数え間違えがなければ、Stream<T>インタフェースは39個に対しintStreamインタフェースは44個のメソッドが存在する。

増えたメソッドの例

int sum()
IntStreamの要素の合計を返す。終端操作。

OptionalDouble average()
IntStreamの要素の平均を返す。終端操作。

つまり、中身がint型だと分かっている分、int型に特化したメソッドが追加されたということ
数値だと分かっていなければsumなんてメソッドは用意できない訳だ。
Int型(プリミティブ型)データ集合を扱うためのインタフェースとはそういった意味を指す。

Stream<T>インタフェースにも存在するが、かなり変化のあったメソッド

OptionalInt min()
このストリームの最小要素を記述するOptionalint(または空のOptional)を返す。

OptionalInt max()
このストリームの最大要素を記述するOptionalint(または空のOptional)を返す。

ここで呪文1の効力が出てくるのだが
試験対策の呪文3
InStreamインタフェースのmin,maxには引数はない

さらにOptionalIntにもgetは必要か?という話になる訳だが、ここではgetではなくgetAsIntメソッドが必要。。 ややこしい。。

あとIntStreamインタフェースで押さえておきたいのは、、
試験対策の呪文4
InStreamインタフェースのメソッドにラムダ式(SAM)の型が入る場合、ほぼIntから始める

何を言っているんだ、、となっているかもしれないが、
つまりStream<T>インタフェースで引数の型がFunction型となっていたところはIntFunction型になっている、という意味。

Stream<T>インタフェースの場合
filter(Predicate<? super T> predicate)

IntStreamインタフェースの場合
filter(IntPredicate predicate)

てな具合。
collectとかだと少し話は違ってくるようだが、概ねこのルールに従っている。
Functionインタフェースをよく理解している人なら、処理しているのがint型なんだか当たり前やんってなるのかもしれない。

Stream<T>からIntStreamへの変換

中間操作のメソッド(飛ばしてた)のmapToIntを用いる方法がJava SE8 Goldでは一般的
定義↓
IntStream mapToInt(ToIntFunction<? super T> mapper)

同じように他のStreamインターフェースに対してmapToLong,mapToDoubleといったメソッドが存在する。逆にIntStreamからStream<T>に変換する場合はmapToObjectboxed()と言ったメソッドが用いられる。

どのStreamインタフェースも自分に変換する以外のメソッド(IntStreamならmapToInt)は定義されているようだ。

総集編

「「Inteager型の数値の入ったストリームオブジェクトで、引数を取らないmaxメソッドを用いて最大値を出力する」」

プログラムは以下のようになり、コンソールには4が出力される。

       int num = Stream.of(1,2,3,4)           //Stream<T>のストリームオブジェクト
                  .mapToInt(l -> l)        //IntStreamのストリームオブジェクトに変換
                  .max().getAsInt();      //IntStreamインタフェースのmaxメソッドの利用
        System.out.println(num);

まだまだ細かいことを言い出したらきりがないですが以上です。
StreamAPIの問題を解くときの迷いが少しでも減ったらいいなぁ、と思っております。

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

今回は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に貼る場合は「拡張メタファイル」を貼り付けのオプションで選択。「拡張メタファイルは」一番扱いやすく、鮮明な部類である。

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

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

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

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

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