家族について考えるパパのブログ

普段の生活をいかに快適に過ごすかを考えて実践をしていくブログ

今、自分が思っていること 2017/09/03

こんにちは。

 

今回は、最近やっていることや思っていることを記録しておこうと思います。

 

<最近やっていること>

夜や休日の暇な時間を活用して、Javaとかについて気になることがあった時には積極的に調べていくようにしています。

その際に、自分一人だと怠けてしまうので、このブログを活用して学んだことを記録していくようにしています。(あくまで自分用のメモとして活用していく予定なので、記事の内容は重複などが今後発生していくかもしれません。)

ブログに記事が溜まっていくっていうのは、気分的に悪いものではないです。

 

<最近やってて詰まっている問題>

あるlong型の変数の参照を100万回するだけのスレッドAと、その同じ変数を0か-1かどちらかを代入することを100万回繰り返すスレッドBを同時に動作させ、スレッドAではこの変数の値を参照したときに必ず0または-1となるようにするプログラムを実装せよ。

 この問題、今の僕には正直手も足も出てないです。

これは今日本語でもどういう風にしたら良いのかがわかってないので、調べたりしながら考えている最中です。

(何年か後にこの記事読み返して笑えるようになってたらいいな。。。)

 

<なんでこんな問題や記事を書くことをやっているのか>

理由①:「巨人の肩によじ登ろう」と思っているから

以前先輩に「できる人は基礎がしっかりしている」っていう話をしてもらって、それが「心の中ですごく引っかかっていたから」というのが背景にあると思います。

今後、仕事をしていく上で根本的なことはちゃんと理解しておかないといけないな。。と思っています。

理由②:興味を持てるようになったから

「どうやって勉強していく?」と質問した際に、「興味を持って調べていくこと」と言われていたのですが、その「興味を持つ」っていうことの素地ができてきたから今やっているんだと思います。

正直、それを聞いた時は「興味なんてどうやって持ったらいいんだろう?」って思っていました。

しかし、今はそれぞれの事象が「どうなっているのか?」にすごく興味があります。

だから、「苦行」ではなく、「趣味」として勉強をすることができています。

「興味」を持った理由は、自分でも正直わかりません。

 

<最近の悩み>

①:「わからない」ってなった時に解決までどうやって持ってくかがフローとしてちゃんと整備できていない

「わからない」ってなったら当然調べたりするのですが、確信を持って調べたりというようなことは正直できていないです。

②:褒めてもらった時に困ってしまう

これは、たぶん23年間ずっとなんだけど褒めてもらっても素直に「ありがとう」っていうことができないということは「問題だな。。。」と個人的に思っています。

周りを見てみると、やっぱみんな受け入れることができているように思っています。

たぶん、反射で答えてしまっているから問題だと思っていて一回頭の中に入れて整理してから返答するようにしないといけないなって思っています。

反射で答えると素直に「ありがとう」って言えない理由は、

「褒めてもらったことに自分が全然納得できていないから」だと思っています。

仕事をしていると常に「自分が思い描いているデキには到底追いついていない」っていう状態になっていると思っていて、その思考をしている時に褒められても素直に「うん」ってならないと思います。

しかし、よくよく(帰り道とかで)考えてみると、自分から見たら「何やってんだ」って思ってることでも、褒めてもらえたっていうことは周りからはもしかしたら違うように見えている可能性があるってことだと思うので、それも物事の1つの側面として受け入れるべきだと思います。

なんで、自分主体でばかり考えるのではなく、純粋な周りの人の意見として受け入れられるようにならないといけないな。。って思っています。

これが中学くらいからずっと、悩んでることかもしれません。。。

文字にしてみると、すっきりしてくる感じはあります。(文章としては整理されていないかもしれませんが。。)

 

今思っていることはこんな感じです。

Java スレッドについて

こんにちは。

 

スレッドという単語にぶつかって全然意味がわからなかったので、それについてまとめます。

 

スレッドとは

プログラムの実行状態をスレッドという。

通常のJavaプログラムは最初に1つのスレッドを持つ。

 

このスレッドは実行中、mainメソッドから始まるスタックトレースを持ちます。

プログラムの中で新しいスレッドを作成すると複数の実行状態(スレッド)を持てます。

このようなプログラムは、「マルチスレッド化したプログラム」という。

 

スレッドの動作

スレッドは概念上、同時かつ並行で動く。実際、CPU(コア)が複数あれば物理的にも並行動作する。

しかし、CPUコア数以上の場合、スレッドはタイムスライスという動作をする。

 

タイムスライスとは

あるスレッドを一定時間実行した後、別のスレッドに実行を譲る動作のことをいう。

これは、非常に短い時間間隔でスレッド実行を切り替えるため並行動作するように見えます。

スレッドの切り替わりは強制的に起きる。

また、停止中にメソッド呼び出しのスタックトレースは変化しないので、スレッド実行開始後は同じコードの停止箇所から実行を再開する。

 

複数スレッドが同じメソッドを実行する時に気をつけなければならないこと

共有データの扱いは気をつけなければならない。

ある変数の値を複数のスレッドが同時に更新すると不整合が生じうる。

この共有データの不整合を防ぐ仕組みを同期処理や排他制御と呼ぶ。

マルチスレッドで本質的に難しいのは、同期処理になります。

 

スレッドの横取りが起きないと保証されている操作を「アトミックな操作」という。

スレッドの横取りで発生しうる不整合を防ぐために、Javaはロックという仕組みを提供している。

 

マルチスレッドプログラムの鉄則

マルチスレッドでデータの不整合を起こさないためには次のいずれかの処理をする必要がある。

・スレッド間でオブジェクトを共有しない(Webアプリの場合のリクエストスコープなど)

・不変オブジェクトにする

・適切な同期処理を行う

 

わからなかった単語

スタックトレース

 → これまでlogくらいの認識しかありませんでした、正確には何を表しているのかを確認する必要あり。

 

読んでいただきありがとうございます。

 

参考にしたもの

パーフェクトJava

Java 「文字リテラルが閉じられていません」について

こんにちは。

 

「文字リテラルが閉じられていません」というエラーにぶつかったので、それについて書いておきます。

 

エラー内容

---------------------------------------------------------------------------------------

./answer.java:5: エラー: 文字リテラルが閉じられていません

this.name = 'no name';

 

---------------------------------------------------------------------------------------

 

これ、どうやら「文字リテラル」と「文字列リテラル」の違いによるエラーのようです。

 

文字リテラルとは

char 型で表されるような1文字のものを表現するためのリテラルです。

ソースコード上では、「''(シングルクオーテーション)」で囲みます。

 

文字列リテラルとは

String 型で表されるような文字列を表現するためのリテラルです。

ソースコード上では、「""(ダブルクオーテーション)」で囲みます。

 

無意識の間にシングルクオーテーションで文字列リテラルを囲んでいたのでエラーになったと考えられます。

 

読んでいただきありがとうございます。

 

宿題(今後確認しないといけないこと)

Javascriptでは、このような区別はされないのか?

 → 以前Javascriptのコードを書いた際には、文字列も「''」で囲っていた記憶がある。

 

java 「シンボルが見つけられません」について

こんにちは。

 

コンパイル時のエラーでちょっと詰まったので、メモを残しておきます。

 

この「シンボルが見つけられません」エラーの原因には、以下のようなものがある。

① クラス、メソッド、変数の綴りミスや定義していない変数を使用指定可能性がある。

② コンストラクタを呼び出すときにnewを忘れている可能性がある。

③ 公開されていないメンバを呼び出している可能性がある。

④ 必要なimport文を記述し忘れている可能性がある。

⑤ クラスパスが通っていない。

 

エラー内容

--------------------------------------------------------------------------

./answer.java:5: エラー: シンボルを見つけられません

this.name = 'no name';

    ^

  シンボル: 変数 name

 

--------------------------------------------------------------------------

 

 

今回、自分がミスをしていたのは①でした。

 

単純なミスなので、ちゃんと見返すことが大切ですね。

 

読んでいただきありがとうございました。

Java コンストラクタについて

こんにちは。

 

コンストラクタがイマイチわかってなかったので、学んだことを書きます。

 

コンストラクタとは

「オブジェクト生成時に呼ばれる処理」です。

 

構文と注意

[アクセス制御の修飾子] コンストラクタ名 ([引数型 引数名, ...]) [throw節] { 

     コンストラクタ本体

}

 

コンストラクタは、返り値を持たない。

コンストラクタ内にreturn文を書くとコンパイルエラーになります。

 

 

コンストラクタのオーバーロード

メソッドと同じようにコンストラクタもオーバーロード可能です。

引数の並びが異なるコンストラクタは標準クラスでもよく見かけることができます。

 

this呼び出しとsuper呼び出し

this呼び出し

コンストラクタから他のコンストラクタを呼ぶthis呼び出しという文法規則がある。

ex.)

class Book {

    (フィールド宣言は省略)

     Book (String title, String author) {

        this.title = title;

        this.author = author;

        this.price = 1000;

     } 

     Book (String title, String author, int price) {

        this.title = title;

        this.author = author;

        this.price = price;

     }

}

上記のような2つのコンストラクタがあった場合に、見てわかるように中身がほとんど同じになっています。

このようなものの共通処理をまとめる際に、this呼び出しを使うことができます。

this呼び出しでコンストラクタを共通化すると以下のようになります。

  

class Book {

    (フィールド宣言は省略)

     Book (String title, String author) {

        this(title, author, 1000);      // これで下記コンストラクタを呼ぶ。

     } 

     Book (String title, String author, int price) {

        this.title = title;

        this.author = author;

        this.price = price;

     }

}

 

super呼び出し

これは、継承したクラスから継承元のコンストラクタを呼ぶ仕組みです。

 

注意

this呼び出しもsuper呼び出しも、コンストラクタ本体の最初の文でなければいけない。

また、コンストラクタ内で一度しか呼び出しできません。

 

デフォルトコンストラクタ

コンストラクタ宣言を1つも書かなかったクラスは、暗黙にコンストラクタが自動生成されます。

そのことをデフォルトコンストラクタといいます。

デフォルトコンストラクタは引数なし、かつ中身が(継承元のsuper呼び出し以外は)空です。

ただ、些細なことに気をつけないといけなくなる手間を考えるとデフォルトコンストラクタは一切使わないというのが現実解になります。

 

終わりに

コンストラクタもJavaを使う上では基礎なはずなので、きちんと理解しないといけないですね。。

 

読んでいただきありがとうございました。

 

 

参考にしたもの

パーフェクトJava

git clone後のリモートリポジトリ変更について

こんにちは。

 

git cloneした後にリモートリポジトリを変更したい場合にどうすればいいのかを書いておきます。

 

まず、現状の参照先リモートリポジトリ名を確認する方法

git remote -v

origin https://github.com/Taka/practice.git (fetch)

origin https://github.com/Taka/practice.git (push)

このように出てきます。

 

今回は、

https://github.com/Taka/practice.git

この部分を

git@github.com/Taka/practice.git

に変える方法です。

 

そのコマンドは、以下のコマンドです。

git remote set-url <name> <newurl>

 

なんで、

git remote set-url origin git@github.com/Taka/practice.git

と入力しました。

 

これで、git remote -vを押すとリモートリポジトリが変わっていることが確認できました。

 

読んでいただきありがとうございます。

EclipseでのTomcatの設定法について

こんにちは。

 

EclipseでのTomcatの設定方法を書いていきます。

 

ファイルをダウンロードする

以下のサイトでファイルをダウンロードする

http://tomcat.apache.org/download-80.cgi

 

Eclipseに登録する

ウィンドウ > ビューの表示 > その他 > サーバー 

を選択する。

すると、下のタブにサーバーが追加される。

「使用可能なサーバーがありません。」と出ているのでそれをクリックする。

そこで先ほどダウンロードしたファイルを参照先に追加する。

 

そして、完了ボタンを押す。

 

これでEclipseへのTomcatへのセットアップは完了。

 

読んでいただきありがとうございます。

デザインパターンについて

こんにちは。

 

今日はデザインパターンについて学んだことを記録しておきます。

 

デザインパターンはクラスライブラリそのものではない
Javaでプログラムを書くときには、便利なクラスが集まったクラスライブラリを使用する。
デザインパターンは、クラスライブラリそのものではありません。
デザインパターンは、クラスライブラリより一般的な概念。
クラスライブラリ : 部品となったプログラムそのもの
デザインパターン : 部品がどのように組み立てられているか、ここの部品がどのように関連して大きな機能を果たすのかを表現したもの。

デザインパターンを理解する上で重要なこと
「具体的なプログラムを読むこと」ではなく、どういう種類のクラスやインタフェースが出てきて、それらが互いにどういう関係にあるかが重要です。
そういう意味で、UMLを理解することが必要です。

takahitonakashima.hatenablog.com

Javaのクラスライブラリでのデザインパターン
デザインパターンは「クラスライブラリそのものではない」という話が出ましたが、Javaの標準的なクラスライブラリの中には、デザインパターンがたくさん生かされている。

具体的な例としては以下のようなものがある。
java.util.Iterator : Iteratorパターンが使われている。
java.util.Observer : Observerパターンが使われている。
java.util.Calender
java..util.Security
java.util.NumberFormat
上記の3つでは、Factory Methodパターンが使われている。
java.awt.Component
java.awt.Container
上記の2つでは、Compositeパターンが使われている。

デザインパターンの見方
デザインパターンの目標の1つとして「プログラムを再利用可能にする」ということがある。
すなわち、どうやってプログラムを「部品」として再利用するかを考えている。
そのため、以下の観点でプログラムを見ると理解が深まる。
・どのような機能が拡張される可能性があるのか
・その機能拡張を行うときに修正が必要になるのはどのクラスか?
・修正が不要なのはどのクラスか?
重要な点は、「プログラムを完成品として見ないこと」です。

 

学習法について
「自分で例を考えること」が大切。
プログラムを読むだけではなく、自分なりの例を考えてみると良い。

 

読んでいただきありがとうございます!

 

参考にしたもの

Java言語で学ぶデザインパターン入門

UMLについて

こんにちは!

今日は、UMLについてちょっと調べてみたのでそれをまとめてみます。

 

そもそもUMLって?

UMLとは、Unified Modeling Languageの略称です。

UMLは、システムを視覚化することや仕様や設計を文書化するための表現方法。

 

クラス図

UMLのクラス図(Class Diagram)は、クラスやインスタンス、インターフェースなどの性的な関係を表現したもの。

 

クラスの階層を表したクラス図

1.クラスは長方形で表し、以下の3つのものが順番に書かれています。

 ・クラスの名前

 ・フィールドの名前

 ・メソッドの名前

2.矢印でサブクラス(子クラス)からスーパークラス(親クラス)の方向へ向かう。extendsを表す

3.abstractクラス(抽象クラス)の名前は斜体で書く。

4.staticフィールド(クラスフィールド)の名前には下線をつける。

5.abstractメソッド(抽象メソッド)は斜体で書く。

6.staticメソッド(クラスメソッド)の名前には下線をつける。

 

インタフェースと実装クラスを表したクラス図

1.△のと破線の矢印はインタフェースと実装クラスの関係を表している。

2.矢印は実装クラスからインタフェースに向かっている。

3.UMLJavaのインタフェースを表現する場合は <<interface>> と書く。

 

集約を表したクラス図

1.白抜きのひし形がついた線は、集約を表す。

 

アクセス制御を示したクラス図

UMLではアクセス制御を表現したい場合、メソッドやフィールドの名前の前に記号をつける。

1. + :publicなメソッドやフィールドを表す。どこからでもそれにアクセスすることができる。

2. -  :privateなメソッドやフィールドを表す。クラスの外からそれにアクセスすることはできない。

3. # :protectedなメソッドやフィールドを表す。それにアクセスできるのは同じクラスか、サブクラス、および同じパッケージ内のクラスだけ。

4. ~ :同じパッケージ内からのみアクセスできるメソッドやフィールドを表す。

 

シーケンス図

UMLのシーケンス図(Sequence Diagram)は、プログラムが動くときに、どのメソッドがどういう順番で実行されるか、どのような事象がどういう順番で起きるかを表現したもの。

 

クラス図とシーケンス図の対比関係

クラス図は「時間によって変化しないもの(静的な関係)」を表すのに対して、シーケンス図は「時間に従って変化するもの(動的な振る舞い)」を表す。

 

終わりに

UMLは、システムの流れなどを表す際の共通言語だということなので、これを機に覚えてみるといいかもしれません。

僕も勉強します。。

 

読んでいただきありがとうございました。

 

※よくわからなかった言葉集

abstractクラス

staticフィールド(クラスフィールド)

abstractメソッド

staticメソッド(クラスメソッド)

集約

 →「持っている」関係を「集約」(aggregation)と呼ぶ。インスタンスを持っていれば、個数に関わらずその関係は集約。

 

参考にしたサイトなど

http://itpro.nikkeibp.co.jp/members/ITPro/ITBASIC/20010330/1/?rt=nocnt

http://www.uml.org/what-is-uml.htm

http://objectclub.jp/technicaldoc/uml/umlintro1

Java言語で学ぶ デザインパターン入門

java -jar コマンドで実行できるjarファイルを作る

こんにちは。

 

「作成したクラスをコンパイル・ビルドし、`java -jar`コマンドで実行できるjarファイルを作る」

ということをする際に詰まったポイントを記します。

 

コンパイルは、以下のコマンドでできる。

javac ○○.java

これによって、

○○.class 

ができる。

 

そこから、jarファイルを作成する。

ここでちょっと詰まった。

やり方の答えとしては、以下のようなコマンドを実行すればできる。

jar cvfe Answer.jar ○○ ../MANIFEST.MF

※前提ですが、MANIFEST.MFをマニフェストファイルとして用意しておきました。

※○○ は、classファイルを表しています。

ここでのポイントはJARファイル作成時に、eオプションでエントリ・ポイントを指定すること

 

※エントリ・ポイントとは

一番最初に呼ばれるメソッドのこと。

main()メソッドのことを表す場合が多い。

 

エントリー・ポイントを../MANIFEST.MFに記す指示を出していなかったので、

メイン・クラス○○が見つからなかったかロードできませんでした

というエラーがで続けていた。

 

ちゃんとエントリー・ポイントを記せば

java -jar Answer.jar

で実行させることができます。

 

参考URL

https://www.glamenv-septzen.net/view/1121

http://www.ne.jp/asahi/hishidama/home/tech/java/jar.html

http://www.ytp.ne.jp/tech/java/sineruka/jarhowto.html

https://ameblo.jp/syosinsyaprogram/entry-11775802006.html

http://www7a.biglobe.ne.jp/~java-master/java/command.html

 

読んでいただきありがとうございました。