基本情報技術者、応用情報技術者、Java、IT活用

現役システムエンジニアによる基本情報処理者や応用情報処理技術者の資格への用語説明、Java、様々なITのお勉強をしたい方へ

M/M/1待ち行列モデル について

M/M/1待ち行列モデルは基本情報技術者応用情報技術者試験の午前試験でよく出ますね!

 

最初は難しいですが、落ち着いてやればチャンス問題になるかと思います!

では実際説いていきましょう!

 

お客さんは1時間に15人到着します。

1人を処理するのに平均で3分かかります。

M/M/1待ち行列モデルに基づく時、平均待ち時間は何分でしょうか?

 

この問題を解いていきます。

 

M/M/1は待ち行列のモデルの事です。

 

この計算ではまずは窓口利用率を出します。

 

            λ(到着率)(ラムダ)(人/時間)

ρ(窓口利用率)(ろー)─────────────              

            μ(サービス率)(ミュー)(人/時間)

 

 

その後、下記の式で並んでいる人数を出す事が出来ます。

           ρ (ろー)

平均待ち人数───────────           

          1 - ρ(ろー)

 

それができたら

平均待ち時間= 平均待ち人数×平均サービス時間

 

です。

では実際に問題を解いてみましょう。

 

窓口利用率を出す時に、時間の単位を合わせましょう。

・お客さんは1時間に15人到着します。(60分で15人来る)

・1人を処理するのに平均で3分かかります。(60分で20人処理できる)

 

この場合、

              15人(60分で来る人数)

ρ(窓口利用率)(ろー)=───── = 0.75(窓口利用率)            

              20人(60分で処理できる人数)

 

になります。

 

これで ρ(窓口利用率) は0.75になりましたね。

これを出すには時間の単位を合わせるのが大事ですね。

あと、ρ(窓口利用率)は基本的に1より小さい値になります。

1を超えたら時間内に処理できてないので溢れていってしまいますね…

 

その後並んでいる人数を出すのは簡単です。

 

1 - ρ(ろー) 分 の ρ(ろー) です。

いち ひく ろー ぶん の ろー と覚えましょう。

 

          ρ (ろー)     0.75

平均待ち人数─────────── = ─────────  = 3人           

          1 - ρ(ろー)     1-(0.75)

 

となります。

 

平均待ち時間は3人(平均待ち人数)×3分(平均サービス時間)=9分 となります。

 

如何でしたか?少しでも参考になりますと幸いです。

それでは頑張ってください!!

 

広告

 

 

Javaプログラミングの基礎9 substringの文字列切り出しを使う

substringは、Javaで文字を切り出したい時に使います。

使い方

substring(開始位置,終了位置)

開始位置は0番から始まりますので、0にしたら1文字目(先頭から)になります。

終了位置を5にした場合は、5番目(6文字目)まで切り出します。

 

実際に使ってみましょう。

 

これに対して、文字列を切り出してみます。

String moji="おはようございます。今日も頑張りましょう。";

使い方 説明 結果
moji.substring(0,5) 先頭である0番目から5番目の1つ前まで切り出す おはようご
moji.substring(2,5) 2番目(3文字目)から6番目(5文字目)までを切り出す ようご
moji.substring(5) 5番目(6文字目)から後ろ全てを切り出す ざいます。今日も頑張りましょう。
moji.substring(moji.length()-8) 後ろ8文字を切り出す 頑張りましょう。

 

それでは実際に使ったコードをここに記載しておきます。

    String moji="おはようございます。今日も頑張りましょう。";
               
        //先頭である0番目から5番目の1つ前まで切り出す
        System.out.println("moji.substring(0,5):"+moji.substring(0,5));
                
        //2番目(3文字目)から6番目(5文字目)までを切り出す
        System.out.println("moji.substring(2,5):"+moji.substring(2,5));
        
        //5番目(6文字目)から後ろ全てを切り出す
        System.out.println("moji.substring(5):"+moji.substring(5));
        
        //文字数をカウントする
        System.out.println("moji.length():"+moji.length());

        //後ろから8文字を抜き出す
        System.out.println("moji.substring(moji.length()-8):"+moji.substring(moji.length()-8));

 

文字数をカウントする時はlength()を使います。

なので、後ろから8文字を切り出したいという時は

moji.substring(moji.length()-8);

を使います。

 

結果はこちら

substringはデータベースのカラムの定義が100の場合、それを超えると登録に失敗するので、先頭から100文字だけを出力するといった使い方が多いです。

また、他社とのシステム連携や、ファイルに出力する際に、決まった文字数だけ出力したいといった事が多いのでとてもよく使います。

それでは頑張ってくださいね♪

 

 

OSI参照モデル 

基本情報技術者応用情報技術者試験では、かなりの確率でOSI参照モデルの問題が出てきます。

 

OSI参照モデルは、ネットワークにおける通信機能を7つの役割に分けたものです。

 

 ルータは3層なので、ネットワーク同士を中継するルーティングやIPアドレスによる制御はできるけど、それ以上の層の役割はないよという事を表しています。

 

ブリッジは2層ですね、だからIPアドレスによる制御はできず、ARPにより、同じセグメント内全てにデータを飛ばす事までしかできません。

 

L2スイッチ、L3スイッチの

Lはレイヤー を表し、つまり何層かを表しています。

とても、わかりやすいですね。

L2スイッチ=スイッチングハブ

L3スイッチ=ルータ 

の機能があると思ってもらえればよいと思います。

 

OSI参照モデル プロトコル 通信機器
7層 アプリケーション層 HTTP,FTP,DNS,SMTP,POP ゲートウェイ
6層 プレゼンテーション層 SMTP,FTP,Telnet
5層 セション層 TLS,NetBIOS
4層 トランスポート層 TCP,UDP
3層 ネットワーク層 IP,ICMP ルータ,L3スイッチ
2層 データリンク PPP,Ethernet,ARP ブリッジ,L2スイッチ,スイッチングハブ
1層 物理層 RS-232,UTP,無線 リピータ

参考になりましたか?少しでも身になってもらえると光栄です。

それでは頑張ってください。

 

 

広告

Javaプログラミングの基礎8 絶対に使った方がいい インデントを揃える方法。 

インデントとは、文字の書き出し位置です。

 

インデントを揃えるとは行のスタート位置を揃える事です。

 

インデントを揃えないパターンはこうです。

スタート位置がバラバラでとてもわかりにくいですね。頭が痛くなってきます。

 

インデントを揃えてみます。

TABキーで決まった量のインデントを入れられるので使ってみてください。

これでとても見やすくなりますね。

 

やり方は

for←スタート地点

} ←終了地点

のインデントを揃えます。

その中は階層が1つ下がり、TABを押してインデントを1つ右にずらします。

 

if←スタート地点

}←終了地点

も揃えます。

その中も階層が1つ下がり、TABを押してインデントを1つ右にずらします。

 

ifやforの中に入っていくにつれてTABで右にずらしていくイメージです。

 

これで二重ループでも、その中にifがあっても、わかりやすくなりますね。

システム開発は1人ではなく、複数メンバーが担当します。

なので、他の人が見たときにわかりやすいように、インデントを揃える、コメントを入れるは気にしてみてください。

自分も後で修正しやすくなるので頑張ってくださいね。

 

Javaプログラミングの基礎7 日付を文字にする SimpleDateFormat と日付の足し算、引き算について

今日の日付を取得して文字に変換し、データベースに値をセットしたり、データベースから検索したりといったことはよくやります。

 

日付型を文字列型にしたい時はこうします。

 

        SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
        Calendar calendar = Calendar.getInstance();

        Date dateObj = calendar.getTime();
        String format = sdf.format(dateObj);
        System.out.println("今日の日付は"+format+"です。");

 

上にimportの記述を入れてください。

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

 

 

SimpleDateFormatは日付をどういう文字列の形にするかを指定します。

  • yyyy=年
  • MM=月
  • dd=日
  • hh=時間
  • mm=分
  • ss=秒
  • SSS=ミリ秒
  • E=曜日

MMが月、mmが分ですが、これ間違えやすく、逆にしてしまうとセットされる時間がおかしくなるので気を付けてくださいねw

 

 

今日の日付を2022/12/21 としたい場合は

new SimpleDateFormat("yyyy/MM/dd");

とします。

 

日付の区切りをハイフンにし、時間までとって

2022-12-21 10:55:30  としたい場合は

 SimpleDateFormat sdf =new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

とします。

 

 

 現在日時を取得するところはここです。

        Calendar calendar = Calendar.getInstance();

        Date dateObj = calendar.getTime();

 

Calendar というクラスを使います。

その後取得した日時を日付型の dateObj という変数に現在日時をセットしています。

 

        int week = calendar.get(Calendar.DAY_OF_WEEK); 
        System.out.println(week);

で数値として曜日も取得可能です。

日曜が1、月曜が2、火曜が3、水曜が4、木曜が5、金曜が6、土曜が7です。

 

明日の日時を取りたい時はこうします。

        calendar.add(Calendar.DATE, 1);

2日前は-2とします。マイナスにする。

        calendar.add(Calendar.DATE, -2);

1か月後はこうです

        calendar.add(Calendar.MONTH,1);

3か月前はこうです。マイナスにする。

        calendar.add(Calendar.MONTH,-3);

2年後はこう指定します。

        calendar.add(Calendar.YEAR,2);

前年などもとれます。マイナスにする。

        calendar.add(Calendar.YEAR,-1);

 

では2日前を取得して表示してみます。

   SimpleDateFormat sdf =new SimpleDateFormat("yyyy-MM-dd");
        Calendar calendar = Calendar.getInstance();

        calendar.add(Calendar.DATE, -2);
         Date dateObj = calendar.getTime();         
        String format = sdf.format(dateObj);
        System.out.println("2日前は"+format+"です。");

 

 

以上が日付を文字にする方法と、足し算、引き算でした。

如何でしたか?慣れたら簡単だと思うので、頑張ってくださいね!

 

Javaプログラミングの基礎6 型変換とエラー処理について

まずはJavaの型変換について説明していきます。

 

代表的な型に文字列型と数値型がありましたね。

文字列を数値型に変換したい時があります。

どのような時でしょうか?

 

例えば100という文字があります。

ここに1を足して101にしたい時

こう書くとどうなるでしょうか?

        String moji="100";
        moji=moji+1;
        
        System.out.println(moji);

 

 

答えは1001

 

です。

あれ?101にしたいのにってなりますね。

 

文字列の足し算は後ろに別の文字がくっつくだけになります。

文字列を計算に使いたい時は数値に変換してから足す必要があります。

 

文字を数値にしたい時はInteger.parseIntを使います。

        String moji="100";
        Integer suuchi =Integer.parseInt(moji);
        System.out.println(suuchi+1);

 

ちゃんと101になりましたね。

 

これはすごく便利ですね。

でも、Javaとしてはちゃんとルールを守ってくれないとエラーになります。

どんな時でしょうか?

 

答えは数値に変換できない文字を数値に変換しようとしたときです。

 

数値に変換できない文字をInteger.parseIntをしてみましょう。

        String moji="僕は17歳";
        Integer suuchi =Integer.parseInt(moji);
        System.out.println(suuchi+1);
       



 

コンソールにエラーが出ましたね。これをExceptionといいます。

 

このエラーはどの場所にどんなエラーが発生しているかを示しています。

Exception in thread "main" java.lang.NumberFormatException: For input string: "僕は17歳"
    at java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:67)
    at java.base/java.lang.Integer.parseInt(Integer.java:668)
    at java.base/java.lang.Integer.parseInt(Integer.java:786)
    at MainShori.main(MainShori.java:10)

 

NumberFormatException はこの文字が数値のフォーマットになってないよ。

と言っています。

エラーを少しずつ下を見ていくと、自分が作ったファイルの名前が出てきます。

MainShori.java:10

ここです。これはMainShori.java10行目でエラーが発生しているよ。という意味です。

 

10行目は左の数値10のところなので、

    

    Integer suuchi =Integer.parseInt(moji);

ここですね。これを知っていれば、エラーが出たときにすぐに対応できます。

よくシステムの保守をやっていると、早く正確にエラーの箇所を見つけ、

適切に修正する能力が大事だと思っています。

 

エラーになっても、決まった適切な処理をして、システムが止まらないようにしたい場合は

try とcatchを使います。

こう書いてみましょう。tryとcatchの間に処理したい内容を書き、そこの間でもしエラーが発生した場合は、catchの中に入ります。

 

先ほどのExceptionの内容はeという変数に入りますので、

e.printStackTrace();でエラー内容を出力できます。

 

        String moji="僕は17歳";
        try {

            Integer suuchi =Integer.parseInt(moji);
            System.out.println(suuchi+1);
            
        }catch(Exception e) {
                //処理に失敗した時にここにくる

            e.printStackTrace();
            System.out.println(moji+"変換に失敗しました");
                        
        }

 

エラーを表示しましたが、システムが止まる事なく最後まで進みましたね。

 

 

 

以上が型変換とエラー処理でした。如何でしたか?

引き続き頑張ってくださいね!!

トランザクション処理とACID特性 について

ACID特性は、トランザクション処理に求められる4つの特性の事で、

基本情報技術者試験と、応用情報技術者試験の午前でよく出題されます。

まずはトランザクション処理について説明していきます。

 

トランザクション処理とは、

2か所以上のデータを更新する時に、途中で処理が中断したときにデータがおかしくなっては困るので、エラーで全てなかったことにして、

全ての処理が正常に終わったら全てのデータの更新を確定するやり方です。

 

ロールバック←全てのデータの更新をトランザクション処理前に戻す

コミット←全てのデータの更新を確定させる。

 

例えば、

生徒テーブルに生徒情報のレコードがあり、

教室テーブルに生徒数というカラムがあるとします。

 

トランザクション処理では、

生徒を1人追加する場合、

生徒テーブルにレコードを追加した後に

教室テーブルの生徒数カラムの値を更新します。

最後にコミットをし、2つのテーブルの更新を確定します。

 

もし途中で処理がエラーになった場合、ロールバックをし、全ての更新を無かった事にするため、生徒テーブルのレコード追加は無かった事にします

それをしないと、2つのテーブルのデータの整合性が合わなくなります。

 

Javaの場合、tryとcatchを使います。

教室テーブルの生徒数を数え直す。など、

tryの中の処理途中でエラーになった場合は、catchに入ります。

 

トランザクション開始

try{

 

 【データ更新】生徒テーブルにレコード追加

  教室テーブルの生徒数を取得する

  教室テーブルの生徒数に1を足す

 【データ更新】教室テーブルの生徒数を更新する

  

 〇ここまで来たらトランザクションをコミットし、更新を確定する。

}catch(Exception e){

 ここの中はtryとchatchの間でエラーが発生した時に入ります。

 〇トランザクションロールバックの処理を書く

}

トランザクション終了

 

では、ACID特性 について説明します。

原始性Atomicity、一貫性Consistency、独立性Isolation、耐久性Durability

の4つです。それぞれの単語をしっかりと覚えておけば問題無いと思います。

 

原始性(Atomicity)

これはトランザクション処理の個別の処理が全て実行されるか、1つも実行されないかのどちらかという事です。

先ほどの例の、エラー時は全てのテーブルの更新を元に戻す。

全て終了したら、全てのテーブルの更新を確定する。

という点です。

 

一貫性(Consistency)

トランザクション処理実行後も、「矛盾」がないという点です。

一貫性のある人って言動と行動に矛盾がないですよね。なので、一貫性=矛盾がない

と覚えておけば大丈夫です。

トランザクション処理後にデータがおかしなことになっていない。

という点です。

 

独立性(Isolation)

トランザクション処理を複数実行した時に、同時に実行しても、おかしくならないという点です。

先ほどの例、生徒の追加を同時に実行したときに教室テーブルの人数を取得し、1人増やすという処理がありました。

1つの処理がもし教室テーブルの人数を取得するタイミングが同じ場合、

本来2人増やさないといけないのに、同時に実行したために1人しか増やさなかった。

となってしまっては困ります。

なので2つ目の処理はテーブルをロックし、前の処理が終わるまでは待っているべきだと思います。

 

耐久性(Durability)

トランザクション処理が終了したら、データが消失しないようにする。というもの。

ログを保存したり、レプリケーション(データベースを別のサーバーに複製)するなどし、更新した内容が無くならないようにします。

 

 

如何でしたか?このあたりは試験に出ますので、しっかりと覚えておいてもらえたらと思います。

 

 

広告