【Excel】VBAでマインスイーパー作ってみた(コードあり)

以下、過去記事の追記修正版 です。

Excel VBAにトライしてみた

身近なところからプログラミングを始めたいという方におすすめのVBA。 Excelさえあればプログラムをつくる&動かすことができるので気軽に始められます。(一般的な言語だと開発環境を構築しないといけないので結構大変です)

以前、VBAの勉強会に参加した後、勉強がてらマインスイーパーを作っていたのでそれを公開したいと思います。

 

画面レイアウト

爆弾の設置箇所はランダム。セルをクリックすると、当該セルに隣接する爆弾の数に応じて数値を表示します。

f:id:window5296:20160611213552p:plain

爆弾をクリックしたら赤くなります。

f:id:window5296:20160611213557p:plain

 

?

ソースコード

いろいろとツッコミどころのあるコードですが書き直したくないのでこのまま晒します。

各自修正してくださいね。

標準モジュール



'初期化処理
Public Sub initialize()
    Randomize '乱数系列の初期化
    
    Range("A10").Select '初期選択セル
    Range("M2").Value = bomNum
    
    '対象セルを塗りつぶす & 爆弾解除
    For i = 1 To celNum
        For j = 1 To celNum
        
            Cells(i, j).Interior.Color = RGB(0, 115, 176)
            Cells(i, j).Font.Color = RGB(0, 0, 0)
            Cells(i, j).Value = ""
            
        Next
    Next

    '爆弾の設置箇所を決定する
    For i = 1 To bomNum
    
        Dim ranNum(2) As Integer
        ranNum(1) = Int((celNum) * Rnd + 1) '乱数 行
        ranNum(2) = Int((celNum) * Rnd + 1) '乱数 列
        
        '既に爆弾がセットされている場合
        If Cells(ranNum(1), ranNum(2)).Value = "A" Then
            
            'スキップ
            i = i - 1
            
        Else
        
            ' 爆弾セット
            Cells(ranNum(1), ranNum(2)).Value = "A"
            Cells(ranNum(1), ranNum(2)).Font.Color = RGB(0, 115, 176)
        
        End If
    
    Next
End Sub

' 爆発処理
Public Sub explosion()

    For i = 1 To celNum
        For j = 1 To celNum
        
            Cells(i, j).Interior.Color = RGB(255, 0, 0)
            Cells(i, j).Font.Color = RGB(0, 0, 0)
            
            If Cells(i, j).Value = "A" Then
                Cells(i, j).Value = "★"

            End If
            
        Next
    Next
        
End Sub

標準モジュール2


Global Const celNum = 9 'セル幅
Global Const bomNum = 15 '爆弾の数

Sheet


Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    
    On Error Resume Next
    
    'リセットボタンだった場合
    If Target.Value = "R" Then
        Call initialize
        Exit Sub
    End If
    
    
    '爆弾だった場合
    If Target.Value = "A" Then
        Call explosion
        Exit Sub
    End If
    
    '範囲外
    If Target.Row > celNum Or Target.Column > celNum Then
        Exit Sub
    End If
    
    '通常セルの場合
    Dim rowN As Integer
    Dim columnN As Integer
    Dim count As Integer
    count = 0
    
    rowN = Target.Row
    columnN = Target.Column
    
    For i = -1 To 1
        For j = -1 To 1
        
            ' 選択セル同士の比較はしない
            If Not (i = 0 And j = 0) Then
            
                If Not (rowN + i < 1 Or rowN + i > celNum Or columnN + j < 1 Or columnN + j > celNum) Then
                    If Cells(rowN + i, columnN + j).Value = "A" Then
                        
                        count = count + 1
                        
                    End If
                    
                End If
            
            End If
        
        Next
    Next
    
    If Not count = 0 Then
        Target.Value = count
    End If
    
    Target.Interior.Color = RGB(142, 209, 224)
    
End Sub

ThisWorkBook


Private Sub Workbook_Open()
        
    Call initialize
    
End Sub

 

エディターもExcel搭載のもので、自動的にエラーチェックもしてくれます。

(Alt+F11で起動します)

f:id:window5296:20160611213601p:plain

 

だいぶ前に書いた記事であるにも関わらず、一定数のアクセスがあったため今回こちらのブログで再公開することになりました。意外に需要があるのかな。

【過去問解説】平成29年度春期 応用情報技術者試験 ネットワーク(午後 問5)

平成29年度春期 応用情報技術者試験 午後問5

問5 レイヤ3スイッチの故障対策

難易度:★★★普通

設問1

a:どのノードに対してpingコマンドを実行したのかが問われています。DNSサーバの経路障害を疑う一文が解答欄aの直前にあるため、DNSサーバとの通信を調査したいことが分かります。

したがって答えはa:イです。

b:OSPFがルーティングプロトコルであることを知っていれば、その内容を知らなくても解答できるはずです。ルーティングプロトコルを設定すれば、ルータ間の経路情報を自動的に交換することが可能となります。この方式は、経路情報を管理者が事前に設定する"静的"経路制御と対をなすものであり、"動的"経路制御というものです。

したがって答えはb:コです。

c:問題文をよく見ると、PCのデフォルトゲートウェイは図1から変更していないとの記述があります(27ページ4行目)。図1では、PCから一番近いL3SWのポートはL3SW1のp10となっており、図2ではこのポートに171.16.2.250と明記されています。

したがって解答はc:オです。

d:L3SW1のp1が故障しているため、L3SW1を経由したPCからのサーバアクセスは不可能となります。したがって、PCがサーバにアクセスするためにはL3SW2を経由しなければなりません。つまり、PCから「ファイルサーバにアクセスしたい」というパケットが到着したときには「L3SW2を訪ねてください」とPCに伝えるためにルーティングテーブルを更新する必要があります

よって答えはd:カです。

e:サーバにアクセスしようとするPCはL3SW1の故障を知らないため、デフォルトゲートウェイであるL3SW1にパケットを送ります。しかし、L3SW1経由ではサーバアクセスできないため、L3SW1がこの事実を送信元ホストであるPCに伝達する必要があります。このような場合に、最適ではない経路を使用しているホストに対して最適な経路情報を通知する機能がICMPリダイレクトです

よって解答はe:クとなります。

?

設問2(1)

K君のPCでpingコマンドを実行した理由が問われています。いま、J君のPCからは業務サーバを利用できているがK君のPCからは利用できない状態です。この事象をOSI参照モデルをもとに考えてみると、「利用できるという状態=ネットワーク層のレベルで接続できている+ネットワーク層より上位層が正常に動作している」と切り分けることができます。

IPアドレスを使ってpingコマンドを実行することで相手先ホストにIPパケットが到達するかどうか(=ネットワーク層のレベルで接続できているか)を調べることができます。pingコマンドの実行の結果、パケットが到達しない場合は経路上に何らかの問題があるといえますし、反対に、パケットが到達すればネットワーク層の段階では問題なく接続できているといえるでしょう。

したがって、解答としては「業務サーバへの経路に障害があるかどうかを確認するため」となります。


設問2(2)

問題に答える前に、J君がDNS周りの障害であると判断した根拠が何なのか考えていきましょう。まず問題文に書かれている事象を整理します。

  • 業務サーバは正しく動作しているが、一部のサーバからは利用できておらず、IPアドレスをもとにしたpingコマンドを実行すると正しく到達していること。
  • 他の社員から、ファイルサーバや営業支援サーバも利用できないという連絡があった。

これらのことから以下のことが分かります。

  • 業務サーバ、ファイルサーバ、営業支援サーバは正常に動作している。
  • 人によって利用できないサーバが異なる。
  • 業務サーバ、ファイルサーバ、営業支援サーバいずれについてもIPアドレスによる通信は正常である(業務サーバへのping結果からの類推)

これらのことから、IPアドレスを使用した通信は正しく行われているが、それ以外の何かを使った通信ができていないと言えそうです。つまり、FQDNの名前解決が行えていないのです。例えば業務サーバに「Gyomu-Server」という名前を付け、それとIPアドレスとを紐づけていたとします。DNSが正しく動作していれば、PCから「Gyomu-Server」へアクセスがあった場合、それと紐づくIPアドレス172.16.1.1をPCに伝えることで正しく通信できることになるわけです。

さて、問題に戻りましょう。DNSサーバが利用できない状況でなぜサーバを利用できているのでしょうか。答えは簡単、DNSサーバを使わずに各種サーバにアクセスしているためです。サーバにアクセスするたびにDNSに問い合わせるのは非効率的ですので、PCはDNS情報を一時的にPC内に保持しています(キャッシュ)。

したがって解答は「PCにDNSのキャッシュが残っているから」です。

 

設問3

L3SW1のp1故障時にルーティングテーブルがどのように更新されるかが問われています。P1が故障しているのですから、それに対応する項番1の内容を変えなければなりません。設問1のdの解答より、各種サーバにアクセスするためには172.16.2.251にアクセスする必要があります。L3SW1にサーバ向けのパケットが到着したとき、そのパケットは172.16.2.251方向に転送されるのが適当です。

したがって、VLANインターフェースはp10と紐づく「172.168.2.250」、VLAN名は「VLAN20」となります

 

設問4(準備中)

準備中です。

解説について

・解答(太字部分)は

https://www.jitec.ipa.go.jp/1_04hanni_sukiru/mondai_kaitou_2017h29_1/2017h29h_ap_pm_ans.pdf から引用しています。

・明らかに解説が誤っている場合はご連絡ください。

問題冊子・公式解答

IPA 独立行政法人 情報処理推進機構:問題冊子・配点割合・解答例・採点講評(2017、平成29年)

参考文献

応用情報の勉強時に使用したテキスト(最新版)

にほんブログ村 資格ブログ IT系資格へ
にほんブログ村

 

【過去問解説】平成21年度秋期 応用情報技術者試験 ネットワーク(午後 問5)

問題冊子・公式解答はこちらから

情報処理推進機構:情報処理技術者試験:問題冊子・配点割合・解答例・採点講評(2009、平成21年)

 

試験問題:平成21年度 秋期 AP試験区分 午後 問5

問5 リモートアクセスに関する問題

 

設問1

a,b:認証に用いられる技術またはシステムを答える必要があります。しかし、解答群の用語のうち、認証に関わる用語は2つしかありません。CHAPはチャレンジレスポンス方式を用いた認証システムであり、またRADIUSは利用者の認証・利用記録を一元的に行うシステムです。したがって答えはa:ウ、b:クとなります。


c:サーバ証明書を発行する機関またはシステムはCA、すなわち認証局ですので、答えはc:イです。認証局という名前ですが、公開鍵にディジタル署名を行うことでディジタル証明書の発行を行います。


d:IPsecにおいて暗号化機能を有するプロトコルはESPですので、正解はd:エとなります。なお、AHはメッセージ認証機能を持っていますが、暗号化機能はありません。


当設問1はセキュリティよりの問題が多く、かつ覚えていなければ解答できない問題ですので、基礎知識が定着していない方には難しいと思われます。

 

設問2

案1:案2、案3では暗号化に関して言及されているにも関わらず、案1だけ認証のことのみで暗号化にはまったく言及されていません。そのため平文での通信が予想されるため、秘密情報が盗聴される恐れがあります。したがって、答えは暗号化の検討について述べた、案1:イです。


案2:SSL-VPNには、Webブラウザのみの利用(HTTP)であればクライアント側での設備が不要であるという特徴があります。言い換えると、Web以外のアプリを使用する場合は専用ソフトウェアのインストールやクライアント側の環境設定が必要となります。しかし問題文にはクライアント側でSSL-VPN用の設定を行うことについて言及されていないので、HTTP以外のプロトコルは使用できません。よって答えは案2:アとなります。


案3:IPsecでの暗号化通信を行うにあたり、通信機器同士が鍵を交換する必要があります(IKE:Internet Key Exchange)。その鍵交換を行うにはお互いが正当であるか確かめる必要があり、その手段の一つとして事前共有鍵認証が存在します。そのため答えは案3:エです。

 

解説について

・解答(太字部分)は

https://www.jitec.ipa.go.jp/1_04hanni_sukiru/mondai_kaitou_2009h21_2/2009h21a_ap_pm_ans.pdf

から引用しています。

・明らかに解説が誤っている場合はご連絡ください。

・ 設問3は別で公開します... 

参考文献

 

応用情報の勉強時に使用したテキスト(最新版)

にほんブログ村 資格ブログ IT系資格へ
にほんブログ村

【過去問解説】平成21年度春期 応用情報技術者試験 ネットワーク(午後 問5)

 

平成21年度 春期 AP試験区分 午後 問5

問5 DHCPに関する問題

難易度:★★★☆☆ 普通

設問1

a:DHCPを利用する目的について問われています。DHCPの目的自体を覚えていなくても、DHCPがないとどのような問題が起こるのか?」を考えてみればわかると思います。

DHCPがなければ、接続の度に重複していないIPアドレスを探して手作業で設定しなければなりません。一方、DHCPがあれば自動的にIPアドレスが採番されるので、すぐにTCP/IP通信が行えるようになります。

DHCPによって設定作業がラクになることが分かるので、答えはアとなります。

 

b,c: この問題もaと同じように、「もしリース期間がなかったら何が起こるか?」を考えてみましょう。リース期間がなければ、割り振られたIPアドレスはいつになっても変更されることなく、コンピュータに割り当てられ続けます。まったく使用されていない場合であってもです。とはいえ、DHCPサーバにとって使用することのできるIPアドレスの数の上限もあるので、使用していないまたは不要になった場合はIPアドレスは返却してもらいたいわけです。

リース期間があれば、一定時間ごとにIPアドレスを回収することができるのでIPアドレスを効率的に再利用することができます。そうすれば、DHCPサーバに登録するIPアドレスも減らすことができます。

したがって、答えはb:エ、c:アとなります。


d: DHCPリレーエージェントにはDHCPサーバのIPアドレスを設定することになっています。

そのため、答えはd:イです。


e:図からも分かるように、サブネットワークは建物ごとに設定されることが予想されるので、DHCPサーバは利用可能なIPアドレスを無作為に割り振るわけにはいきません。すなわち、DHCPサーバは、DHCPディスカバを送信したクライアントが属するサブネットワークに応じたIPアドレスを割り振る必要があります。そのためには、DHCPサーバはサブネットワークごとにIPアドレスなどのネットワーク設定情報を管理しなければなりません。

したがって、答えはe:オとなります。

 

f:DHCPディスカバを受信したDHCPリレーエージェント(ルータC)はすでにDHCPサーバのIPアドレスを知っているため、そもそもブロードキャストする必要がありません。

よって答えはf:Uとなります。


g:一方、DHCPリレーエージェント(ルータC)からDHCPディスカバを送信したPCに対しては、ブロードキャストでなければなりません。なぜなら、当該PCにIPアドレスはまだ割り振られていないからです。

したがって、答えはg:Bとなります。

?

設問2

h:DHCPオファーは、DHCPディスカバを受信したDHCPサーバから送信されるものなので、

答えはh:192.168.10.190です。


i,j:リース期間の延長は、DHCPクライアントからDHCPサーバに対してリクエストされます。したがって、

送信元IPアドレスはPC001のi:192.168.10.150

送信先IPアドレスDHCPサーバのj:192.168.10.190となります。

 

設問3(準備中)

準備中です。

設問4(準備中) 

準備中です。

解説について

・解答(太字部分)は

https://www.jitec.ipa.go.jp/1_04hanni_sukiru/mondai_kaitou_2009h21_2/2009h21a_ap_pm_ans.pdf から引用しています。

・明らかに解説が誤っている場合はご連絡ください。

問題冊子・公式解答はこちらから

情報処理推進機構:情報処理技術者試験:問題冊子・配点割合・解答例・採点講評(2009、平成21年)

参考文献

応用情報の勉強時に使用したテキスト(最新版)

にほんブログ村 資格ブログ IT系資格へ
にほんブログ村

 

【2017年2月更新】データベーススペシャリスト試験に合格するための勉強法

こんにちは。ゆきはら@window5296)です。

次回のデータベーススペシャリスト試験に挑戦しようと、勉強を開始した人も多くなっている頃だと思うので、一発合格までの私の道のり(勉強の方法や工夫など)を共有しようと思います。

データベーススペシャリスト試験とは?

ざっくり言うと… 

  • データベースに関する知識・技能を問う国家試験
  • 年1回(4月中旬)実施
  • 応募者数15,355名 / 合格率17.6% / 合格者平均年齢31.9歳 (平成27年度)

   (出所:IPA, 情報処理技術者試験 統計資料 平成27年度, https://www.jitec.ipa.go.jp/1_07toukei/toukei_h27.pdf

 

挑戦した理由

  • データベースに関連する基本的な知識・技術を習得し、実際のシステム開発業務(要件定義、設計、開発など)に活かすため
  • 上流SEが習得すべきであろうモデリング能力を身につけるため

 

学習期間

  • 6か月(約180日間)

 

テキスト

  

※合格教本は平成26年度版、重点対策は2016年版を使用。
※重点対策は解説がひどかったのでおすすめしません。

 

選択した設問

  • 午後Ⅰ 問1 データベース基礎理論、問2 データベース設計
  • 午後Ⅱ 問2 概念データモデル(おすすめ)

  ※午後Ⅱの問2は、問1と比較して試験内容が固定的なので過去問学習で対応しやすいです。

 

試験対策(午前・午後共通)

6か月使ってゆっくりとテキスト学習を進めました。

一区切りついたら章末問題など、午前Ⅱ問題を解き、理解度を確認します。

そこでは、"なんとなく"で解かず、"論理的に"解くように心がけました。例として以下の問題で考えてみましょう。

データベースの論理モデルに関する記述のうち、適切なものはどれか。

ア 階層モデルは、多対多のレコード関係を表現するのに適している。

イ 関係モデルでは、子レコードはただ一つの親レコードに属する。

ウ ネットワークモデルは、行と列からなる表で表現できる。

エ ボイス・コッド正規形は、関係モデルで使用される形式である。

(出典:平成20年度 春期 DB試験区分 午前 問29)

"なんとなく"で解くと ...

「んー・・・ボイス・コッドは正規化で勉強した気がするから「エ」が正解かな~」という具合で正解してしまいます。これの怖いところは、

完全に理解できていないのに理解しているような気分になってしまうことですね。試験本番で間違いなく爆発します。

"論理的に"解くと...

「階層モデルにおいて、親レコードは子レコードに対して一つのみ許される。したがって、多対多で表現すると主張しているアは間違いである。(略)そして、ボイス・コッド正規形は関係モデルにおける正規形の一つであるので正解はエである。」

 実際ここまで細かく考えてはいませんが、上記のように「なぜ正解/不正解といえるのか?」を明確にしながら解答を出すようにしました。

この解き方であれば、「あれ?階層モデルの定義ってどうだったっけ?」とか「関係モデルの表現方法って表?レコード?」とか、いろいろと気づくことが多くなります。

 

試験対策(午後Ⅰ)

以下の流れで学習を進めました。

  1. 応用情報技術者試験の過去問(DB)を解く ×約10問
  2. 午後Ⅰの過去問を解く ×約10問
  3. ②で解いた過去問を再び解く

①では、関数従属性や正規化理論、SQLなど、データベースの基礎知識を身につけるとともに、アウトプット力の基礎をつくります。

②の過去問学習は、試験対策としては当然ですが、単に解いて終わりにしないよう注意しました。答え合わせをして自分の解答が間違っていた場合、解答例をじっくり見て内容を理解するのではなく、まず解答例の概要だけざっくり確認します。

そして、その概要を念頭に置きつつ、テキストやノートを読み返してでも、自分なりの答えを出すようにするのです。解答を覚えるのではなく、それに至るまでの論理を理解するところがポイントですかね。

また、重視すべき学習分野は関数従属性と正規化理論です。特に、正規化理論は確実に理解すべきです。なぜ正規化する必要があるのか、正規化しないとどのような問題が起こるのか、いつでもスラスラと論述できるくらいには理解しておきましょう。

②の過去問学習も重要ですが、③も重要だと思っています。②での学習を通じて「理解した!」と思っても、案外理解できていなかったりするので、再び解いて理解度を確認します。もしまた間違えたなら、重点的に学習するのみです。

?

 

試験対策(午後Ⅱ)

過去問は5、6問ほどしか解いていないと思います。ただ、以下の2点に留意しました。

  1. 午後対策本に頼らない
  2. 過去問は1度にすべて解かない

①はですね...頼らないというより頼れませんでした。詳細は言及しませんが、ほんと××みたいな解説で本に何回ブチ切れたことか。

頼るものがなかった私は、ひたすら自分の頭で考えて解答を作っていきました。取り組み方は、午後Ⅰの対策ですでに述べた、「論理的に解く&自分なりの答えを出す」と同じです。

仮に午後対策本に頼っていたとしたら落ちていたかもしれません。というのも、分かりやすい解説を見ると、なんとなく理解したつもりになってしまうからです。これも午後Ⅰの対策で述べたことと関連しています。

 

②は意外に重要です。 午後Ⅱの問題を解き、答え合わせをして振り返りをしようものなら、少なくとも3時間はかかります(1問あたり)。ここで懸念すべきは、試験勉強をしている人の心理です。

例えば、「毎週日曜日に午後Ⅱを1問解く」と計画を立てているとしましょう。計画したのですから、その人は可能な限り計画通りに進むことを願っています。そして実際に1問解き始めます。

おそらく、「難しい」「早く遊びたい」「あーせっかくの土日が...」という思いが沸き上がってきます。そうなると、「んー、まあこんなもんでいいだろう」と中途半端に勉強を終え、"勉強したことにする"のです。

あくまでも私の実体験に基づく予想ですが、そうなってしまう方も多いのではないでしょうか。

以上のことから、午後Ⅱの問題は数回に分けて解答・学習することをすすめます。

私の場合は解答と振り返り学習を2日に分けるようにしました。解答するときは解くことだけに集中し、振り返るときは苦手分野の学習と学びの概念化(教訓を生み出す)だけに注力するわけです。

問題を解くなかで分からなかった部分には?マークを付し、振り返りの際には、解答と異なる部分と?マークの部分を重点的に学習します。もちろん例によって、解答や解説に頼らず、自分なりの答えを出します。

 

試験結果(平成28年度春期試験)

 f:id:window5296:20160731150433p:plain

高得点ではありませんが、午後試験でも十分な結果を出すことができました。

 

最後に一言

情報システムに関わる人間にとって、「どうやってデータを扱うか?」ということを学ぶことは大切なことだと思います。

実務経験のないor少ない方でも合格できるので、これからITエンジニア、ITコンサルタントを目指す方は挑戦してみてはいかがでしょうか。

にほんブログ村 資格ブログ IT系資格へ
にほんブログ村