我が道を行くしかない

タイトルはそのままの意味です。

本当に大事な答えは自分自身で出すしかない。

時にはそれは痛みを伴うものだが、自分の声を無視せず、

向き合い続けていれば本当の何かを手にできるはずだ、と最近は信じている。

 

==========================

ところで、エンジニアには最近本当に大雑把に分けると、

2種類のタイプがいると思う。

(PUFFYでいえばゆみちゃんあみちゃん、キンキキッズならつよしか光一

ぐらいの大雑把な感じですね、年がバレるわ、、)

 

一つはパズルをとくようにプログラミングすること自体を楽しむ

根っからのエンジニアタイプ。技術志向が強い職人タイプ。

 

もう一つは問題解決や自身のアイデア実現のためにエンジニアリングを活かす

イデアマンタイプ。目的の実現のためにエンジニア以外もする経営者タイプ。

 

エンジニアや人間には本当に色々な人がいるからこの分け方は乱暴だけど、

何が言いたいかというと、自身は後者なんだな、と最近思うのである。

 

30も中盤になり自分の傾向がわかってくると、なにかに自分の全能力を

振り切ることのできない根っからの変態天才タイプではないということがわかってくる。それは少し悲しいことでもあるが、僕は何かをふりきれる人が好きだし、

自身がそうゆうタイプだったらそんなことも考えていないかもしれない。

 

そして、自分自身がトップエンジニアになれなくても、アイデアを活かせば

世にでるアプリが作れるかもしれない。

要は自身が思い描く理想の状態を具現化できればそれ以上のスキルは

基本的にいらない、と考えてしまうタイプなのだ。私は。

 

最近は業務に加えてJavaScriptなどのWeb系の言語も「勉強」しているのだが

忙しい中で「勉強」するのがどうも無理が生じてきた。

それもそのはずだ。ほどよく怠けてきた人間がいきなり四六時中自己研鑽に

身を投じれば体が拒否反応を示すのも無理はない。

 

男の一人暮らしは自炊でもすれば時間はあっという間に過ぎる。

NETFLIXとかおもろいし。刃牙とか全話見ちゃったし。

 

ここで以前の自分なら「ああ俺はなんてだめなんだろう」なんて悲嘆にくれたりしたが、悲嘆にくれても時間がすぎてどんどん老けるだけでだれも得しない。

 

僕自身は本来の自分の行きたい会社に入るために転職後も勉強しているのだが、

確証のない未来にたいして人間の脳はどこまでも合理的である。

 

それなら、自分の作りたいものを具現化するための欲望に忠実になり、

プロセスを楽しむことが何より重要だと今は思えるのである。

 

なんだか文章を描いてたらワクワクしてきた。

 

 

副業でライティングを始める

副業でライティングを初めてみた。

理由は二つ。

①エンジニアとしての自分の価値がまだ低いため、給与が低い。溜まっている税金を清算したいのでその足しにしたい

②個人で稼げるスキルを積み上げたい

 

ネットをみると意外と否定的な意見があるが、コツコツできる人なら本業にもできるかもしれない気はしている。

SEOの知識や文章構成力はやればやるほどあがるし、案件に求められるルールが染み付いてしまえば、生産のスピードも上がり、収入も増える、はず。

 

まずは最初の報酬ゲットを目標にします。

 

あくまで本業はエンジニアですけどね。

1日1時間でも時間使えればいいと思う。

Java シルバー学習中(3)

黒本の学習も佳境に入ってきた。

受験日は28日。

LPICを受験した時より学習効率が上がってきている気がする。

しかしまだまだ効率はあげられそうだ。

 

あと、最近格闘技を始めた。

自分の体を追い込み、虐めて体が変わっていくのが楽しい。

 

せっかくなので学習の記録メモをあげておく。

 

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

 

Javaにおける継承のおさらい~

 

・継承とは?

-あるクラスを機能拡張した新しいクラスを定義すること。

拡張もとに基底クラス、またはスーパークラス

拡張したクラスのことを派生クラス、またはサブクラスと呼ぶ。

 

・差分プログラミング

-継承は、生産性を向上させる強力なプログラミング手法。

プログラムが多岐に渡った際、コードの共通部分を

別のプログラムとして分離し、それぞれのプログラムには

差分だけを定義しておいて後で結合すれば、何度も同じコードを書く手間を省き、変更時に修正するコード数も減らせる。

このようなプログラミング手法のことを

「差分プログラミング」という。

 

継承のイメージ的には、スーパークラスの特徴を

サブクラスは受け継ぎ、+@

サブクラス自身の特徴(差分)も併せ持つ、という認識??

 

・継承で引き継げないもの

 

①コンストラク

privaeなフィールドやメソッド

 

コンストラクタとは、インスタンスを作成したタイミング(クラスをnewした瞬間に実行される関数のこと)

 

・インタフェースとは

インタフェースは、クラスから「型」だけを取り出したもの。型とは、そのものの「扱い方」を決めるための情報で、変数を宣言するときに型を指定するのは、その変数の扱い方を決めるためである。

 

例えば、「3」という数値をint型で整数として扱うのか、double型で浮動小数点として扱うのかを変えられるように、種類と扱い方は異なる概念である。

 

・インタフェースの多重実現

Janaでは、クラスの多重継承は禁止されていますが、

インタフェースの多重実現は認められている。

複数のインタフェースを実現する場合は、

下記コード例のようにカンマ区切りで記述する。

 

public class ConcreteClass implements InterfaceA, InterfaceB {

//処理

}

 

インタフェースは扱い方だけを規定しており、

実装を持てない。

インスタンスを生成して動的に動作しなければいけないものは記述できない。

 

・抽象クラスの書き方

 

public abstract class AbstractSample {

  // 具象メソッド

  public void methodA() {

    //処理

  }

  // 抽象メソッド(サブクラスで実装する)

  public  abstract void methodB();

}

  

・オーバーライドの定義

オーバーライドは、サブクラスでスーパークラス

定義されたメソッドを再定義すること。

多重定義を表す「オーバーロード」と間違えやすいので気をつける。

 

メソッドを再定義するため、

メソッドのシグニチャ(メソッド名、引数リストの型、数、順番は同じでなければならない。)

 

・継承関係にある2つのクラスで同名のフィールドが使われている際、どちらが優先されるのか?

 

 

・フィールドを参照した場合には、変数の型で宣言された方を使う

・メソッドを呼び出した場合には、メソッド内の指示に従う

 

・抽象メソッド=実際の処理を自身にでは無くこクラスに記述させるためのメソッド。

抽象クラスを継承したクラスは、この抽象メソッドを必ずオーバーライドしなければならない。

 

・アップキャストとダウンキャスト

継承関係にある場合、サブクラスのインスタンススーパークラス型の変数で扱うことができる。

 

①サブクラスをスーパークラス型に変換=アップキャスト

スーパークラス型で扱っていたインスタンスを元の方に戻す=ダウンキャスト

 

ダウンキャストは、変換したい型を()内に

記述する。

 

コンストラクタは、メソッドの仲間です。 メソッドと違う名前が付いている理由として、「インスタンスの生成時に呼ばれ、インスタンスを初期化する」という特別な役割があるためです。

 

・継承関係にあるクラスのインストラクタ生成時の

コンストラクタの動作について

スーパークラスインスタンスがもつコンストラクタが先に実行されなければいけない

②サブクラスのコンストラクタには、スーパークラスのコンストラクタを呼び出す[super();]が、

コンパイラによって先頭行に追加される

 

Java学習 番外編

 

■thisとは??

this予約語で、そのクラスのオブジェクト自身を表す

 

クラスのフィールド変数の名前と、メドッドのローカル変数の名前が同じ場合に、対象を特定するために

利用することが多い

 

クラス変数は、メンバ変数とも呼ばれクラス内どこでも使用可能。

ローカル変数はブロック内でのみ有効。

ローカルというのは{}内部のこと。

 

コード例:

—————————————

public class Sample {

 

  //Sampleクラス変数

  String animal = "うさぎ";

 

  public void printAnimal() {

 

    //ローカル変数

    String animal = "ねこ";

    System.out.println("ローカル変数animal:" + animal);

    System.out.println("クラス変数animal:" + this.animal);

 

  }

}

 

—————————————

 

—————————————

public static void main(String[] args) {

 

  Sample s = new Sample();

  s.printAnimal();

 

}

 

—————————————

 

実行結果★

 

ローカル変数animal:ねこ

クラス変数animal:うさぎ

 

コンストラクタは、インスタンスを準備するためのメソッドで、全てのインスタンスが持たなければいけない。

コンストラクタを定義しなかった場合、デフォルトコンストラクタが自動的に定義される。

 

■null(なる)

起:nullとは参照型変数の値が定義されていない状態

 

承;参照型変数の値は参照するメモリ上のアドレスとその参照先の値を示す

 

転:この参照するメモリ上のアドレスとその参照先の値が定義されていない場合、参照型変数の値はnullとなる。

 

結:なのでnullからはどんなメソッドも呼び出すことができない。

 

例外処理の記述

 

try-catch文の書き方

try {

//例外が発生する可能性がある処理

} catch (例外クラス型 変数) {
//
例外が発生した時の処理

}

 

catchブロックの目的はプログラムを正常な状態に復帰させることで、このブロックの処理が終了すると、

「トラブルは収束した」として、正常な動作に戻る。

 

try-catch-finally文の書き方

try {

//例外が発生する可能性がある処理

} catch (例外クラス型 変数) {
//
例外が発生した時の処理

} finally {

//例外発生の有無にかかわらず実行したい処理

}

 

■try-catch文の構文の順番を変えると

コンパイルエラーになる。

 

例外とは、プログラム実行中に発生する何らかの

「トラブル」を指す

例外処理とは、トラブルが発生した時に

「どのように対処すべきか」を記述した

処理のことである

Javaでは、例外処理をtry-catchという構文で

記述する。

 

■ArrayIndexOutofBoundsException

配列の要素外アクセスを示すエラー

 

配列は、複数の要素をまとめて扱うオブジェクトであって、要素そのものではない。

そのため、要素をひとつも扱わない配列を

作ることもできる。

 

■try-catch-finally

catchブロック内でreturnされていても、

returnによって呼び出し元のメソッドに制御が戻る前に、finallyブロックは必ず実行される。

 

■try-catch-finally文の構文について。

tryブロックとfinallyブロックは一つずつしか記述できないが、catchブロックのみ複数記述できる。

 

また、catchブロックを省略することもできる。

 

複数のtry-catchがネストしている場合、

スローされた例外を受け取るのは、その対応に

最も近いcatchブロックである。

 

Javaのプログラム実行中に発生するトラブル

は大きく分けて2つ

 

①実行環境のトラブルなど、プログラムからは

対処しようのない事態を表すエラー

②プログラムが対処できる例外

 

検査例外と非検査例外

上記の例外は更に大きく分けて2つ。

検査例外と非検査例外である。

 

・検査例外とは、例外処理を記述したかどうかを

コンパイラが検査する例外。

 

・非検査例外とは、例外処理を記述したかどうかをコンパイラが検査しない例外を指す。

 

Javaの例外は、検査例外が基本。

なぜなら、ソフトウェアが巨大化、複雑化していく歴史の中で、例外処理をプログラマが記述し忘れる失敗が増え、バグの原因となった反省から、コンパイラによる自動チェック機能が盛り込まれたことが背景にある。

 

Javaの例外クラスは、大きく分けて

ErrorException,RuntimeExceptionに分かれ、

それぞれエラー、検査例外、非検査例外を表している、

 

非検査例外はtry-catchを強制されない。

また、throw句で宣言しなくても問題ない。

例外クラスが宣言されているコードが出題された時は、

検査例外か非検査例外を確認しよう。

 

エラーとは、プログラムから回復不可能なトラブルが

発生したことを指す。実行マシンのメモリが不足していたり、データが保存されているディスクの読み込みや書き込みの権限がなかったり、ネットワークの接続ができなかったといった実行環境に関するトラブルは、

プログラムからは対処のしようがない。

 

エラーはErrorクラスが表すが、実際に使われるのは

そのサブクラス。

OutOfMemoryError

NoClassDefFoundError

StackOverflowError

など。

 

■IndexOutOfBoundsException

存在しない要素を取り出そうとして発生するエラー

 

■ClassCastException

継承関係や実現関係にないクラスにキャストしようとすると、ClassCastExceptionが発生する。

 

■IllegalArgumentException

利用される側のオブジェクトが不正な引数を渡されたことを、利用する側のオブジェクトに通知するための例外。

 

■IllegalStateExceptionは、利用される側のオブジェクトが、まだ利用するための準備が終わっていないなどの理由でスローする例外である。

 

■nullとはリテラルの一種で、変数が

「何も参照しない」ことを実現するためのデータである。

nullに対してメソッドを呼び出すようなコードを記述した場合、実行時例外「NullPointerException

がスローされる。

 

■Staticイニシャライザは、クラスを呼び出す時に

一度だけ呼び出される初期化ブロックである。

staticイニシャライザを利用することで、

static変数の初期化が可能になる。

 

メソッドが呼び出されると、メソッドの実行に必要な情報がスタック領域に配置される。

もちろん、スタック領域は無限の広さを持つわけではなく、同じメソッドを呼び続ける「再帰呼び出し

を行なっていると、スタック領域が足りなくなることがある。

このようにスタック領域が足りなくなった場合、JVMはそのことを検知するとStackOverFlowErrorをスローしてプログラムを強制終了する。

 

■NoClassDefFounder

JVMが実行対象のクラスを発見で気なかった場合に

スローする例外。

 

ヒープメモリ

インスタンスを保存したり、クラスの定義情報を

保存したりするためのメモリ領域である。

大量のインスタンスを作り、ガーベッジコレクションが行われないと、この領域がいっぱいになってしまい

新しいインスタンスを作ることができなくなる、

かような事態が発生すると、JVMOutOfMemoryErrorを発生させる、

 

スタック

メソッドの実行順を制御するための領域で、メソッドを再帰呼び出しするなどしてこの領域がたりなくなると、StacOverFlowが発生する。

 

■VIrtualMachineError

OutofMemoryErrorStackOverFlow

親クラスで、JVMが壊れているか、または動作を継続するのに必要なリソースが足りなくなったことを示すためにスローされる。

 

■InternalError

VIrtualMachineErrorのサブクラスで、JVM内で何らかの内部エラーが発生したことを指す。

 

■returnするときに戻り値を格納する専用の変数が用意されている。

そのため、catchブロックとfinallyブロックの両方がreturnで値を戻す場合、どちらの戻り値が最終的に格納されているか確認する

 

■IndexOutOfBoundsException

ある種のインデックス(配列、文字列、ベクトルなど)が範囲外であることを示すためにスローされます。

Java シルバー学習中(2)

Javaにおける継承のおさらい~

 

・継承とは?

-あるクラスを機能拡張した新しいクラスを定義すること。

拡張もとに基底クラス、またはスーパークラス

拡張したクラスのことを派生クラス、またはサブクラスと呼ぶ。

 

・差分プログラミング

-継承は、生産性を向上させる強力なプログラミング手法。

プログラムが多岐に渡った際、コードの共通部分を

別のプログラムとして分離し、それぞれのプログラムには

差分だけを定義しておいて後で結合すれば、何度も同じコードを書く手間を省き、変更時に修正するコード数も減らせる。

このようなプログラミング手法のことを

「差分プログラミング」という。

 

継承のイメージ的には、スーパークラスの特徴を

サブクラスは受け継ぎ、+@

サブクラス自身の特徴(差分)も併せ持つ、という認識??

 

・継承で引き継げないもの

 

①コンストラク

privaeなフィールドやメソッド

 

コンストラクタとは、インスタンスを作成したタイミング(クラスをnewした瞬間に実行される関数のこと)

 

・インタフェースとは

インタフェースは、クラスから「型」だけを取り出したもの。型とは、そのものの「扱い方」を決めるための情報で、変数を宣言するときに型を指定するのは、その変数の扱い方を決めるためである。

 

例えば、「3」という数値をint型で整数として扱うのか、double型で浮動小数点として扱うのかを変えられるように、種類と扱い方は異なる概念である。

 

・インタフェースの多重実現

Janaでは、クラスの多重継承は禁止されていますが、

インタフェースの多重実現は認められている。

複数のインタフェースを実現する場合は、

下記コード例のようにカンマ区切りで記述する。

 

public class ConcreteClass implements InterfaceA, InterfaceB {

//処理

}

 

インタフェースは扱い方だけを規定しており、

実装を持てない。

インスタンスを生成して動的に動作しなければいけないものは記述できない。

 

・抽象クラスの書き方

 

public abstract class AbstractSample {

  // 具象メソッド

  public void methodA() {

    //処理

  }

  // 抽象メソッド(サブクラスで実装する)

  public  abstract void methodB();

}

  

・オーバーライドの定義

オーバーライドは、サブクラスでスーパークラス

定義されたメソッドを再定義すること。

多重定義を表す「オーバーロード」と間違えやすいので気をつける。

 

メソッドを再定義するため、

メソッドのシグニチャ(メソッド名、引数リストの型、数、順番は同じでなければならない。)

 

・継承関係にある2つのクラスで同名のフィールドが使われている際、どちらが優先されるのか?

 

 

・フィールドを参照した場合には、変数の型で宣言された方を使う

・メソッドを呼び出した場合には、メソッド内の指示に従う

 

・抽象メソッド=実際の処理を自身にでは無くこクラスに記述させるためのメソッド。

抽象クラスを継承したクラスは、この抽象メソッドを必ずオーバーライドしなければならない。

 

・アップキャストとダウンキャスト

継承関係にある場合、サブクラスのインスタンススーパークラス型の変数で扱うことができる。

 

①サブクラスをスーパークラス型に変換=アップキャスト

スーパークラス型で扱っていたインスタンスを元の方に戻す=ダウンキャスト

 

ダウンキャストは、変換したい型を()内に

記述する。

 

コンストラクタは、メソッドの仲間です。 メソッドと違う名前が付いている理由として、「インスタンスの生成時に呼ばれ、インスタンスを初期化する」という特別な役割があるためです。

 

・継承関係にあるクラスのインストラクタ生成時の

コンストラクタの動作について

スーパークラスインスタンスがもつコンストラクタが先に実行されなければいけない

②サブクラスのコンストラクタには、スーパークラスのコンストラクタを呼び出す[super();]が、

コンパイラによって先頭行に追加される