自分磨きのITノート

プログラミング(C#、VB.NET)言語やデータベースの役立つ情報を初心者から中級者向けに発信します。

情報セキュリティマネジメント試験に合格しました。合格率と勉強方法

平成29年秋期、情報系国家資格「情報セキュリティマネジメント」に合格してました。自己採点もギリギリだったので、モヤモヤした気持ちの1か月間でした(;´Д`)

やっぱり合格証書が届くのはうれしいものです♪
20171215_sg_syousyo



この情報セキュリティマネジメント(以下SG)は、平成28年度春期から開始された新しい試験です。よく似た試験に情報処理安全確保支援士(別名:情報セキュリティスペシャリスト)ってのがあります。支援士(SC)は構築/開発向けの資格で、情報セキュリティマネジメント(SG)は企画/提案や運用管理向けの資格になります。支援士(SC)よりは、難易度も低く受けやすい資格です。SGはITパスポートからのステップアップ資格とされており、レベル2の基本情報技術者試験と同等の位置付けです。

最近の情報社会では、IT人材不足サイバーテロの脅威のためにこのセキュリティ分野に力を入れている傾向があります。システム構築する側も、セキュリティ関連は避けて通れなくなってきました。

まぁ、私は会社から命じられて取得した者です。また、新資格なので採点が甘いのでは?という期待から軽い気持ちで挑みました。私がやってた勉強方法など書いていきたいと思います。

合格率


情報セキュリティ合格率
年度 合格率
平成28年度春期 88.0%
平成28年度秋期 70.3%
平成29年度春期 66.4%
平成29年度秋期 50.4%

段々、合格率が下がってきています。調整といいますか、基本情報技術者試験の合格率が20~30%なので、今後そのくらいまで難易度が上がるのでしょうか?でも、難しさは基本情報技術者試験のほうが上だと思いますので、そこまではいかず30~50%くらいで落ち着くような気がします。(勝手な想像です…)

私が受けた平成29年度秋期は、学生の合格率が23.3%で、社会人が53.8%なので業務経験があるほうが問題の意味を想像しやすく有利なのではないかと感じました。

筆者のスペック

続きを読む

VB.Net(C#)でExcelを読み書きできるライブラリEPPlusの使い方

ネットで”VB.Net Excel 読み書き"など検索すると、Excel Comオブジェクト(Microsoft.Office.Interop)を使った例が多く出てきます。しかし、あまりおすすめされていません

Excel Comオブジェクトは、バックグラウンドでExcelのプロセス(EXE)が実行されており、解放がしっかり行われていないとプロセスが残ったままになったりします。また、すでに起動しているExcelとの干渉を考慮しないといけません。

EXCELファイルの操作系ライブラリ(DLL)を使用することにより、自身のアプリケーションにライブラリをリンクできるため余計なプロセスを管理しなくても済みます。
Excel2007/2010形式からは、ファイルの中身がOffice Open XMLとなり、仕様が一般公開されているためライブラリは色々あります。(中身はXMLファイルで構成され、ファイル全体はZIP圧縮されている)

ライブラリの種類

.Net対応のEXCELファイル操作系ライブラリの有名どころは、NPOIEPPlusClosedXMLなどがあります。 機能が豊富で人気が高いEPPlusを今回を紹介します。

EPPlusは、過去のファイル形式である.xlsは読み書きできませんが、.xlsx形式は対応しています。
今後.xlsファイル形式を作成することも少ないですし、.xlsxが主流のシステムはすでに多いはずです。
また、ライセンスはLGPL ライセンスですし、フリー(無償)で使えるメリットは大きいです。

インストール方法

★このライブラリを使うにあたってMicrosoft OfficeのExcelはインストール不要である。

以下、2つインストール方法があるがお好みでどうぞ!

・Visua lStudioのNuGetで検索"EPPlus"を検索してインストール。
 →対外は安定板をダウンロードすることになると思います。

・サイトからDLLをダウンロード
http://epplus.codeplex.com/
 →右のダウンロードボタンより


Visual Studioのソリューションエクスプローラの[参照]の参照タブよりダウンロードしたEPPlus.dllを追加する。
対象アプリのプラットフォームが.Net3.5なら.Net3.5版。.Net4シリーズは.Net4版のDLLを使用する。

これを書いた時のEpPlusバージョンは、4.1.0でした。

XLSXファイル作成と値書込み

VB.NET

'// Imports OfficeOpenXml'
   Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
      Dim fi As IO.FileInfo = New IO.FileInfo("test.xlsx")
      If fi.Exists = True Then fi.Delete()
      Using pkg As New ExcelPackage(fi)
         Dim sheet1 As ExcelWorksheet = pkg.Workbook.Worksheets.Add("Sheet1")
         '// セルを指定して代入(ExcelVBA同様1から始まる)'
         sheet1.Cells(1, 1).Value = "write time" 
         sheet1.Cells(2, 1).Value = Now.ToString("yyyy/MM/dd")
         sheet1.Cells(3, 1).Value = Now.ToString("HH:mm:ss")
         Call pkg.Save()  '// 保存。名前を変えて保存はSaveAs()'
         sheet1.Dispose()
      End Using
      MessageBox.Show("出力OK!!")
   End Sub 

C#

        // using OfficeOpenXml
        private void button1_Click(object sender, EventArgs e)
        {
            System.IO.FileInfo fi = new System.IO.FileInfo("test.xlsx");
            if (fi.Exists == true) { fi.Delete(); }
            using (ExcelPackage pkg = new ExcelPackage(fi))
            {
                ExcelWorksheet sheet1 = pkg.Workbook.Worksheets.Add("Sheet1");
                // セルを指定して代入(ExcelVBA同様1から始まる)
                sheet1.Cells[1, 1].Value = "write time";
                sheet1.Cells[2, 1].Value = DateTime.Now.ToString("yyyy/MM/dd");
                sheet1.Cells[3, 1].Value = DateTime.Now.ToString("HH:mm:ss");
                pkg.Save();  // 保存。名前を変えて保存はSaveAs()
                sheet1.Dispose();
            }
            MessageBox.Show("出力OK!!");
        }

エクセルのVBAライクな書き方が可能ですね!
ExcelPackageはExcel全体の操作に使い、ExcelWorksheetで各セルへの操作が出来ます。

XLSXファイルの読み込み

VB.NET

'// Imports OfficeOpenXml'
   Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
      Dim fi As IO.FileInfo = New IO.FileInfo("test.xlsx")
      If fi.Exists = False Then
         MessageBox.Show("ファイルなし")
         Return
      End If
      Dim strVal = String.Empty
      Using pkg As New ExcelPackage(fi)
         Dim sheet1 As ExcelWorksheet = pkg.Workbook.Worksheets("Sheet1")
         '// Valueでもよいが表示されている値をとりたければText'
         strVal = sheet1.Cells(2, 1).Text & Space(1) & sheet1.Cells(3, 1).Text 
         sheet1.Dispose()
      End Using
      MessageBox.Show(strVal)
   End Sub

C#

        private void button2_Click(object sender, EventArgs e)
        {
            System.IO.FileInfo fi = new System.IO.FileInfo("test.xlsx");
            if (fi.Exists == false) { MessageBox.Show("ファイルなし"); return; }
            var strVal = String.Empty;
            using (ExcelPackage pkg = new ExcelPackage(fi)) {
                ExcelWorksheet sheet1 = pkg.Workbook.Worksheets["Sheet1"];
                // Valueでもよいが表示されている値をとりたければText
                strVal = sheet1.Cells[2, 1].Text + " " + sheet1.Cells[3, 1].Text;
                sheet1.Dispose();
            }
            MessageBox.Show(strVal);
        }

読み取りも書き込み同様にアクセスできます。

計算式やスタイル関連

171207_epplus_smple
▲画像のような書式設定をソースコードで書くと↓こんな感じです

続きを読む

C#でプログラミング入門 - クラスの継承

前回は、クラスの基礎を行いました。今回は、クラスの継承です。

構造体までは、すんなり頭に入ったかもしれませんが、このへんから具体的に想像がしにくく、頭が混乱するかもしれません。ソフトウェアの学習は、パズルとパズルが繋がることで初めて「そういうことか!」と、気づくことがあります。
プログラミング入門時は、とりあえず色々やってまて、動きを知ることが習得の早道だと私は思っています。

クラスの継承とは、親クラス(ベースクラス、スーパークラス)の機能を受け継いだ子クラスを作ることができます。子クラスは、親クラスの変数・プロパティ・メソッドなどを引き継いでくれるため、同じコードを書かなくても済み、生産性が上がったりクラスのメンテナンスが容易になるなどのメリットがあります。

ここに来るまでに変数やオブジェクトを使ってみて最初から色々なメソッドが使えるから不思議に思われた方もいらっしゃるでしょう。クラスや構造体・列挙体は定義した時点でSystem.Objectクラスが継承されています。その為、ToStringやEqualsメソッドなどがいきなり使えたりします。

では、サンプルソースで継承の説明していきます。

C#

class Program
{
    /// 果物クラス
    public class Fruit
    {
        // ▼非公開メンバー変数
        private string m_name;
        // ▼継承クラスからはアクセス可能なメソッド
        protected int Tanka;
        // ▼どこからでもアクセスできるプロパティ
        public string Name { get { return this.m_name; } set { this.m_name = value; } }
        // ▼継承可能なメソッド
        public virtual string getSyurui()
        {
            return "なし";
        }
        // ▼親クラスのメソッド
        public decimal getKakaku(int kosu)
        {
            return (kosu * this.Tanka);
        }
        // ▼ Objectのメソッドをオーバーライド
        public override string ToString()
        {
            return string.Format("<<< 種類:{1}、果物の名前:{0} >>>", this.getSyurui(), this.Name);
        }

    }
    public class Apple : Fruit
    {
        // 子クラスのコンストラクタ
        public Apple(string name, int tanka)
        {
            this.Name = name;
            this.Tanka = tanka;
        }
        // 親クラスのメソッドをオーバーライド
        public override string getSyurui()
        {
            return "リンゴ";
        }
    }
    // エントリポイント
    static void Main(string[] args)
    {
        Apple a1 = new Apple("あまいリンゴ", 86);
        Apple a2 = new Apple("おいしいリンゴ", 105);
        OutMessage(a1);
        OutMessage(a2);
        Console.ReadLine();
    }
    // 出力メソッド
    static void OutMessage(Apple a)
    {
        Console.WriteLine(a.ToString());
        Console.WriteLine(a.Name + "は、10個でいくらですか?");
        Console.WriteLine("{0}円です。", a.getKakaku(10));
    }
}

出力結果

<<< 種類:あまいリンゴ、果物の名前:リンゴ >>>
あまいリンゴは、10個でいくらですか?
860円です。
<<< 種類:おいしいリンゴ、果物の名前:リンゴ >>>
おいしいリンゴは、10個でいくらですか?
1050円です。

Fruitという基底クラスを定義し、それを継承してるAppleクラスを作成しました。
Fruitクラスのメンバー変数m_nameは、privateなのでAppleクラスからアクセス(取得したり代入したり)できません。protected にしたTanka変数には、継承したクラスからアクセスが可能です。

FruitのgetSyuruiメソッド(関数)ですが、virtual修飾子がついています。これは、子クラスからこのメソッドの処理を置き換えて実装できるように宣言してあります。子クラスのAppleは、overrideをつけgetSyuruiメソッドの動作を実装しています。

もう一つのgetKakakuメソッドは、Appleクラスに何も記述しなくても、Appleクラスのインスタンス(実態)から呼び出しが可能となります。

FruitクラスもObjectクラスから継承されているので、virtualのToStringメソッドをオーバーライド(override)することができます。

Mainメソッドでは、2つのAppleクラスのインスタンスを作って結果を出力しています。
注目して頂きたいところが2つあります。
1つ目は、OutMessageメソッド内で、親クラスのオーバーライドされたToStringです。getSyuruiメソッドが子クラスでオーバーライドした側が呼ばれているところです。
2つ目のgetKakakuメソッドも親クラスのメソッドを使って計算していることも確認できました。

小走りに色々と説明していきましたが、オブジェクト指向プログラミングは奥が深いので、今後もクラスなどについて書いていければと思います。

スポンサードリンク
自己紹介
【管理人】
なみやん
【コメント】
プログラムを組むことが大好きな30代男性。IT系の仕事を10年ちょいやっています。このブログを通して知識を人に伝えることによって、自分をさらに磨こうと精進しています。応援よろしくお願いします。
免責事項
当サイトで紹介しているサンプルソースコードは自由に使用いただいても結構が、自己責任でお使いください。また、記事の内容が主観的であったり、努力していますが正しくなかったりする場合がございます。読者本人の判断にお任せいたします。