なずブログ

インフラSE、Java開発、リモートワークエンジニアな人のメモ帳

職業訓練の授業65日目~JAVA:インターフェース、日付の取得~

f:id:nazuna_0124:20170303232129p:plain

JAVAは基礎が難しすぎです!


おかげさまで、基礎を乗り越えるのがだんだん楽しくなってきました。


その代わり、何か作れそうという光が全く見えてきません。

とりあえずGUI作れるようにならないとどうしようもないのかな…。


ついでに、今後使わないであろうクラスの量産も慣れてきました。

難しいので説明のためだけに特化したクラスなのも仕方ないです。


そんなわけで、本日はインターフェースです。


インターフェースには重要な事前注意があります。

クラス>継承>抽象クラス(メソッド)>インターフェース


この順番で覚えていかないと全くわかりません

(頭いい人はしらない)


変数>制御文>ループ>配列

一旦こういうふうにきて、配列に要素数定義するのめんどくさい、

コレクションどこーってやると


インターフェースが出てきてJAVAが嫌いになれます←


さてさて、先生の説明に抜けがあるような気がしてるのですが、

説明はこうでした。


フィールドが無く、全て抽象メソッドなクラスのことをインターフェースと呼び

また、クラスにはない機能もある。


機能としてはわかりやすいので、ひとまずこれでいきます。


わかりやすいものの、使い所の説明がちょっと不足気味に感じてます。

また、テキストの説明自体がそれいいの?という疑問が浮かびます。


親クラスには無かった制約を小クラスには定義するのが、

どことなく気に入りません


普通に考えて必要なはずなのですけどね…

継承された子クラスで親クラスのオーバーライドはできても

削除はできないというのが、影響がある雰囲気を感じてる気がしなくもないです。


もやもやするので、ゆっくり考えてみます。


そんな中、MapとListを調べてたら出てきたジェネリクス


特許が切れてるのかと思いましたが、関係ないようです。

これは授業に入ってないらしいのです。


そして調べてもよくわかんない…

誰かおしえてぷりーず!


後半戦はJAVAでの日付取得です。


JAVA殺意が芽生えたことを思い出しましたが

今回はなんとかセーフ。


ほんと順番ずつ覚えないとだめな子ですね…

比喩を使って本質を隠した説明をするときの注意点

f:id:nazuna_0124:20170403224602p:plain

試験も終わってすっきりなので、気になるところはがしがしと。


オブジェクト指向の話のところで、比喩を使っての説明はうんざり

などと言いつつ、自分もしっかり使って説明してます。


これは比喩を使った説明が2つの傾向に別れるからです。


対象の本質を例えを使ってわかりやすく説明する。


対象自体をわかりやすくするために、本質を隠して

対象を例え話を使って説明する。


私の説明が後者です。オブジェクトの理解を深めるための説明ですが、

オブジェクト指向(本質)の理解の妨げにはなるかもしれないということ。


そこで言及したいのがこちらの記事様です。

thom.hateblo.jp


のっけから全く納得がいかないので調べてみた結果判明。


完全に私の学習タイミングの問題でした。


ちょーどクラスとオブジェクトを覚えて、そうなったら

VBAの書き方も変わったのです。昔はRangeが死ぬほど嫌いでした。


オブジェクトってこうなんだー、このクラス書いた人すごいな!って矢先に

この記事を見かけたもんだから、オブジェクトでせっかく理解したのに

なぜ違うという話に??? になったのですなー。


比喩使っての説明は、相手のレベル時応じて使い分ける必要がある

というのが今回のオチでした。


ついでに、対象記事様には乗ってなかったので内容の調べた結果も残しておきます。

検索元はこちらのおふたつ。


www.relief.jp


smdn.jp


事象と理由を改めてまとめるとこうなります。

  • debug.print Sheets(1).Range(“a1”) Is Sheets(1).Range(“a1”) がtrueにならないなぜか。
  • 理由1:is演算子の比較対象の本質
  • 理由2:Rangeオブジェクトが呼び出されたときの特性


is演算子の比較対象とは?

リンク先様より。Is演算子は2つのオブジェクトを比較して

同一のオブジェクトを参照しているかを調べます。


出てきました!参照です。言及先記事様が比喩使った理由もわかるってもんです。

参照なので、要するにメモリ番地を見てるってことです。


そこでメモリ番地を調べる関数があります。ObjPtrです。

 Debug.Print ObjPtr(Sheets(1).Range("a1"))
 Debug.Print ObjPtr(Sheets(1).Range("a1"))

これを見ると一発です。確かに返ってきてる数字が違います

この数字を比較してるのがis演算子なら、falseなのは当然です。


変数に格納した同士ならTrueが返ってくるのもこれが原因だとわかります。


じゃあ なんでこんなことに?がもう1つのリンク先です。


が、Rangeとはそういうもので落ち着きそうです…

どういうわけか、呼び出される度に違うメモリ番地に格納されるのだとか。


さてさて、これで今のわたしはすっきり解決しました


が!! JAVAやってる最中だからすんなりわかる説明です。

ちょっと前だったら、こんな説明わかるわけもありません。


というわけで、大事なことなので2回め。

比喩の効果は(言われた、読んだ)相手ののレベルによって違う!

職業訓練生が情報技術者試験を受けに行ってみた

f:id:nazuna_0124:20170312082946p:plain

受験者の皆様、試験おつかれさまでした!

4月の第三日曜日は情報技術者試験春の実施日です。


この試験の一つの注意点として、上位は1年に1回しか行われません


そんなわけで、大きな声ではいいにくいのですが、基本も持ってないのに

いきなりプロジェクトマネージャーを受けてきました。


なぜか受けたいという直感を信じての受験です(合格は最初から諦め)


受けてみてようやく理由が見えてきました。


VBAやってきた人はプロマネの午後I試験を解いてみたほうがよいかも

とゆー説です。


この辺はいずれまとめます。

一社でも内定出た時点がよいかなーというところ。


試験そのものは、普段amazonの受取サインくらいしか

手書きしない私が、2時間で2000時の文字書くのはちょっと無理。


以下はさらっと注意点など書きつつ。


  • 朝混雑してるときあるから出発は余裕を持って
  • 遅れても30分遅れなら受けられる。また事前説明が長いのでおもったより余裕あります。
  • お昼は開催場所によります。コンビニ遠いとかありえるので事前確認を。
  • 喫煙所の有無も開催場所次第です。大学とかのときは恐らくありません。
  • 室内の温度調節は微妙。地域に合わせつつ、調節できるもの持ってね。


さてさて、改めておつかれさま!

結果を見てからでも構いませんが、だめそうな方も

諦めずにまた受けてみましょー。


そして、もう一つまとめるべき案件。

それは職業訓練に通ってる人は情報技術者試験を受けたほうがよいか、です。


これもまた別にします!

なぜたくさんある企業の中でうちに応募したのか?と聞かれて、他にも受けてると答えることの違和感

f:id:nazuna_0124:20170319171727p:plain

世の中の人は2種類に分けられると思います。


  • 言われた言葉の意味をきちんと読み取れる人
  • 言葉通りにしか受け取らない人


ちなみにわたしは…真の意味を深読みしていつも間違える人です。


あ、やっぱり3種類でお願いします。


というわけで就職活動なわけなのですが、

検索してるとひっかかりますよね。こちら。

matome.naver.jp


この中で

△<何故、数ある企業の中で当社を選んだのですか?

○<他にも受けてるよ。自惚れんな。


これにだけ妙な違和感があったのでそんなお話。


昨日書いたとおり合同企業面談会があってリクエストが来てるわけです。

そうすると、なんでわたしにリクエストしたの?って聞きたいじゃないですか。


(オブラートに包むとしても)このまま聞くと、とーぜんのように

「え 他の人にもいっぱいリクエストしてるよ?」


ってな具合に返ってきたのが、これじゃないですか。


このやり取りがもしあったなら、わたしが考えるのは一つ。


聞き方が間違ってた!です。


なずな<「リクエストを送るにあたっての御社の選考基準を教えていただけますか」

なずな<「また、その基準の中のわたしの評価で目を引いた部分があったら教えてください」


(答えてくれるかどうかはともかく)こんなかんじで聞いておけば

自分の知りたい情報が得られるかなって思います。


そんな感じでやる夫さんに振り返ってみると、

質問の意味を取り違えてる?となって、違和感になってたのですな。


質問のとり方が悪いのか、聞き方が悪いのかはおいておきます。


面接のときってやっぱり社風について聞いてみたくなりますよね。


うっかり聞き方をぐぐってしまうけど、

自分の中で社風の何が知りたいのかきっちリ把握しておかないと

だめだなーというのが、この記事のオチ。


そうするとわたしは特に業務のやり方の変更に対して

保守的ですか?革新的ですか? かな!


はい…やりかたにケチつけることがすごく多いんです…

ケチのつけ方はいくらか上達しましたが、性格はなおりません!

職業訓練生向け合同企業面談会

f:id:nazuna_0124:20170304205638p:plain

6ヶ月間の職業訓練では4ヶ月目から

訓練もさることながら、就職活動が本格化してきます。


こっちはプログラムで忙しいのに

職務経歴書なんかをしっかり揃えるのがこの時期です。


その一つとして合同企業面談会が行われます。


訓練生を採用する気持ちのある企業の方々から

学校にお越しいただいて、訓練生と直接面談するものになります。


説明会ほど一方的ではないし、面接ほど堅苦しくない感じです。


このとき訓練生から面談を受ける企業を選びますが、

訓練生の情報を見た企業側からもリクエストが届きます。


前もって送られる情報はこのくらい。

(わたしの通ってる学校のじゃないです)

www3.jeed.or.jp

リンクページの求職者情報一覧のPDFです。


意図的ですよね。わりと大まかな情報しかないのです。

ちなみに各訓練校で書式が違います。


職業訓練に通って就職できるかどうかは、

入る前にもっとも気になるところです。

こういう制度があるので、一つ安心してください!


転職サイトのリクエストに比べれば、期待度は低いかもしれませんが

それでも多いに越したことはなさそうです。


他の方と比べても多めのリクエストを頂きました!

わたしがもともと面談を希望していた会社からもあって、

期待できそうでうれしいです。


そして、プログラムの覚えがいまいちかも…と心配しているような方にも

ちゃんと数社リクエストが来てます。


書類ではねられずにアピールするチャンスというわけですな!

面接が苦手な場合はピンチともいえる


成果物を見せるチャンスもあるということで、

ここ最近はちょっと忙しいとか言っています。


職業訓練に通うことを検討している方は

こういうのもあるということで!

職業訓練の授業64日目~JAVA:オブジェクト指向の継承~

f:id:nazuna_0124:20170310221050p:plain

いつぞや未経験からプログラムを覚える方法はプログラムを書くこと

なんてお話をしました。


未経験からプログラム覚えるたったひとつの方法 - 職業訓練校のまいにち~職業訓練ではどんな授業をしているのか~


ではプログラムを書くにはどうしたら??


それは言うまでもなく、プログラムを書けるようになればいいのです!!


…… 今説明しますのでちょっと待ってね?


言葉の定義の問題もあって、無限ループにしかみえませんが、

オブジェクト指向に関してはこの視点があると教えやすいはずです。

(主に昔のわたしに)


オブジェクト指向では生まれた経緯の関係で、

説明する人はオブジェクト指向が必要なほど大規模な開発

のプログラムを前提として説明してます。


でも、初心者は当面そんなおっきいもの作りません。

小さいプログラム書けるようになればいいのです。


そこでオブジェクト指向を3つに分けます。

  • オブジェクト思想
    オブジェクト機能を使うにあたってのルール。

  • オブジェクト機能
    オブジェクト使う、クラスを作るときに備わった純粋な機能。

  • オブジェクト手法
    機能の使い方。特にオブジェクト以外では見られないもの。


普通の説明が恐ろしくわかりにくいのは、

思想の影響を踏まえて機能を説明するからです。


時間的な経緯としては思想が先ですが

目の前のプログラム作りたいだけなら、機能>手法と覚えて


実際に作ってみてから、思想を思い出す方が早道です。


というわけで、オブジェクト指向を覚えるために、

オブジェクト指向で書く

を言い換えて、


オブジェクト機能を使って書くことに重点をおいてみます。

思想には反した説明がでるかもという前置きでもあります。


ついでに思想を加味しないでの記述を

オブジェクト主体と定義しておきます。


などと、前置きが長くなったところで

オブジェクト指向の花形、継承のおはなしです。


こんな機能あったらなーとは確かに思いますが、

作った人はただの天才なのでしょう。とても便利!


クラスの記述に、フィールドやメソッドを引き継げるというもの。


すぐに記述を省略できる便利さに気がつくと思います。


そうすると、クラスの共通定義ができるようになります!


ここから出てくる便利な点は、クラス作成の分割ができること。

共通したクラス側の配列に突っ込めることです。


自分で見ても意味不明な説明なので、このへんは別途記事かきます。


ついでに出てくるオーバーライドはそのまんま。

継承した側で同じメソッド名は上書きできる機能です。


オーバーライドとオーバーロードの区別がつかない人は

機能に絞ってかんがえなおしましょー。


さて、この説明で伝わる人は

引数付きのサブモジュールを使いたおした

モジュール分割の名前付けで苦労したことがある

ループを回すために同じような名前になるように工夫したことがある

変数でメソッド呼び出せたらいいのにと思ったことがある


なんて経験があるのかなって思います。←


本当の初心者にはもう少し変える必要があると思うので

こっちも別に考えたいと思います。


ほらほら、哺乳類だの犬だの猫だの出てこないですよ。

思想はあとにして、あとでみんなで困りましょう


どことなく、民主主義で独裁者になる方法を伝えてる雰囲気が

ただよいます。


目下の目的は練習するだけのプログラムが書けるようになること、

なのでぶれてはいません。


でもこの目的はプログラマとして就職することに繋がるとは限らない

ので、そこは達成後に思い出してね!

オブジェクト指向でFizzBuzz イン JAVA ~手続き型で考えるとわかんない~

f:id:nazuna_0124:20170329192937p:plain

わかりやすく、表題ではオブジェクト指向と書きましたが、

いつも通り自信なし。オブジェクト主体って言いたいです。


昨日の鯛焼きで気がついたことの続きです。

オブジェクト主体でならすぐ出来るのに、手続き型で思いつかない!!


今回のお題はこちらです。


・3人で実際にFizzBuzzをやってみた。

・それぞれ苦手倍数があり、1%の確率で間違える。

・開始数字と回答順は固定。

・10回戦して勝敗を表示。


さっくりとやってみて確認すると問題発生!すぐ気づくべきだったかも…


3人だと順番によって苦手倍数が回ってこないので負けがありません


4人ですることに変更。ついでに、間違える確率を指定できるように。

(ほんと、こういう変更が簡単なのです)


ソースはこんなかんじ。Mainはわかりやすさ重視!!

本当はPersonは配列にして、ちゃんと回答順を入れ替えるべきかなって思います。


Main.java

public class Main {

    public static void main(String[] args) {

   //名前、苦手倍数、苦手倍数が回ってきたときの誤答率です。
        Person bob = new Person("ボブ", 3, 1);
        Person ken = new Person("ケン", 5, 1);
        Person emily = new Person("エミリー", 15, 1);
        Person tom = new Person("トム", 3, 2);

        for (int i = 0; i < 10; i++) {
            Judge j = new Judge();
            while (j.game == true) {

                emily.answer(j);
                System.out.println(j.game);
                if (j.game == false) {
                    break;
                }

                ken.answer(j);
                System.out.println(j.game);
                if (j.game == false) {
                    break;
                }

                bob.answer(j);
                if (j.game == false) {
                    break;
                }
                System.out.println(j.game);

                tom.answer(j);
                if (j.game == false) {
                    break;
                }
                System.out.println(j.game);
            }
        }
        System.out.println("ボブの負け数:" + bob.loose);
        System.out.println("ケンの負け数:" + ken.loose);
        System.out.println("エミリーの負け数:" + emily.loose);
        System.out.println("トムの負け数:" + tom.loose);

    }
}


Person.java

public class Person {
    String name ;
    int loose = 0;
    int weakNum;
    int missRate;
    
    Person(String name,int num ,int missRate){
        this.name = name;
        this.weakNum = num;
        this.missRate = missRate;
    }
    
    void answer(Judge j) {
        String res = "";
        
        if(j.cnt % 15 == 0){
            res = "FizzBuzz";
        }else if(j.cnt % 3 == 0){
            res = "Fizz";
        }else if(j.cnt % 5 == 0){
            res = "Buzz";
        }else{
            res = String.valueOf(j.cnt);
        }
        
        //一定の確率で間違う処理
        if(j.cnt % this.weakNum == 0){
            int rnd = new java.util.Random().nextInt(99) +1 ;
            
            if (rnd <= this.missRate){
                res = "miss!";
            }
                   
        }
        
        System.out.println(this.name + ":"  + res);        
        j.check(this,res);
    }  
}


Judge.java

public class Judge {
    int cnt =1;
    int endCnt = 10000;
    boolean game = true;

    Boolean check(Person p ,String answer) {
        int counter = this.cnt ;
        String correct;

            if(counter % 15 == 0){
                correct = "FizzBuzz";
            }else if(counter% 3 == 0){
                correct = "Fizz";
            }else if(counter % 5 == 0){
                correct = "Buzz";
            }else{
                correct = String.valueOf(counter);
            }
        
        if(answer.equals(correct) == true){
            this.cnt++;
            
            if ( this.cnt >= this.endCnt){
                return false;
            }else{
                return true;
            }
            
        }else{
            p.loose ++;
            this.game = false ;
            return false;
        }      
    }    
}


結果は至って普通に考えて出現頻度の低い15倍数が苦手のエミリーが強いです。


頻出の3倍で2%間違えるトムは激弱。エミリーを6%まで誤答率を引き上げると

だいたいおんなじ感じになるので、ほとんど出現率依存な雰囲気。


数学的にはさっぱりわかりませんが!!


というわけで、何の言語でも構いませんので、

ふつーに今回のお題を作っていただける方大募集です!