misc.log

日常茶飯事とお仕事と

Visual Studio 2017 でインストーラーを作る(準備)

Windows用に作ったアプリは、Webアプリで無ければPCにインストールしたり、どこかのフォルダにおいて使う必要があります。フォルダにおくだけの場合は別にそれでいいのですが、複雑な設定や、特別な置き場所におく必要があるといった場合は、一般的には「インストーラー」と呼ばれるプログラムを作り、そのプログラムを通して、作成したアプリをPCに導入します。

この「インストーラー」、昔だと「Setup.exe」というファイルを動かすと動き始めたり、そのあとはWindows Installerと呼ばれる、拡張子が.msiのファイルを実行すると動き始めたりするものですが、これらも誰かが作る必要があります。で、このインストーラーをVisual Studioで作ろうという話。昔のVisual Studioでは普通にこのインストーラー作成機能が盛り込まれていたのですが、最近はインストーラー不要なWebアプリケーションなども増えてきており、必ずしも必要とは限らないようになったためか、オプションで後から追加する必要があるようです。

参考にしたのはこちら。

kazukiio.hatenablog.com

Visual Studio Marketplaceで手に入る拡張パック扱いなんですね。ダウンロードはこちら。

marketplace.visualstudio.com

ダウンロードした拡張機能インストーラーを実行、完了後、Visual Studioを立ち上げて適当なソリューションに「追加」で新しいプロジェクトの追加を選択すると、選択肢の「その他のプロジェクトの種類」のところにVisual Studio Installer関連のものが出てきました。

f:id:frontline:20190201100421p:plain
Visual Studio Installerプロジェクトを追加

このように、インストーラーは配布したいアプリのプロジェクトとは別のプロジェクトとして、同じソリューションにインストーラープロジェクトを追加し、そこに「このプロジェクトのこのアプリを配布」といった形で設定していくことで作られます。実際の作業はちょっとやってみてからまとめます。

はてなブログに見だしベースの自動目次を入れる

はてなブログで見出しを作っている場合に、見出しへのリンクを目次のように表示するスクリプトを使っています。元々は「はてなブログ脱獄ブログ」というブログで紹介されていたものなのですが、ブログは閉鎖されたようなので今はコードだけが残っている状態。

<!-- 目次生成 -->
<script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<script type="text/javascript">
$(function(){
    var list = "";
    //中見出しを検索
    $(".entry-content h4").each(function(i){
        var idName = "section"+i;
        $(this).attr("id",idName);
        list += '<li><a href="#' + idName + '">' + $(this).text() + '</a></li>';
    });
    //中見出しが2つ以上あったら目次を表示する
    if ($(".entry-content h4").length >= 2){
        $("<div class='sectionList'><h3>目次</h3><ol>" + list + "</ol></div>").prependTo(".entry-content");
    }
    //スクロールを滑らかにする
    $('.sectionList a').on("click", function() {
        $('html,body').animate({scrollTop: $(this.hash).offset().top}, 600);
        return false;
    });
});
</script>

このスクリプトをデザイン設定の「記事→記事上下のカスタマイズ/記事上」のテキストエリアに貼り付ければOK。

この、真ん中あたりの「.entry-content h4」のところで、見出しの深さ何段までを目次に出すか、また、見出しがいくつ以上あれば目次を作るかを決めています。また、この処理自体は1ページに3記事などを表示している場合には発動しません。1ページ1記事状態で表示された場合だけ動くので注意してください。

ちなみにはてなブログ自体の機能で目次を挿入する事もできるようになったようですが「[:contents]」を各記事に貼り付けないといけないというところが難点。

参考まで。

ハッシュ値を実際に作ってみる

宅ふぁいる便」というオージス総研がやっていたサービスで、480万件のアカウント情報が流出した件、パスワード情報が平文*1で保管されていたという件が盛り上がっています。

internet.watch.impress.co.jp

これで「パスワードが暗号化されていない」という話がチラホラ出てきていますが、実際のパスワードはこうしたシステムでは「ハッシュ化」という処置を施して保存するのが主流になっています。ハッシュ化は、暗号化と違って元に戻す(復号する)ということを想定せず、特定の計算処理で一定のデータ変換を行うというもの。情報自体は計算の過程で欠落したりするので元には戻せません。しかし、同じデータは同じ結果になるので、パスワードなどはこの状態に変換して保管しておき、パスワードを確認する際は、入力された文字列を変換して、あらかじめ保管しておいた変換済みのパスワードと比較します。

こうすることで、仮にパスワード情報が漏洩しても元に戻せないので、読めない。悪用できないというメリットが出てきます。

このハッシュという処理はいろんな方法があり、メリットやデメリット、すでに古くて使い物にならないものなどもあり、どれを選択するかといった事もシステム開発時のポイントとなります。

ちょっと仕事でこんな話をしたところ、どうもピンときていない人たちが多いようだったので簡単なハッシュ化のサンプルを作ってみました。

gitlab.com

たいした内容ではありません。.NET Frameworkが持っているハッシュ処理に文字列を通して結果を16進数表記で出しているだけ。SHA1などだとこんな感じ。

/// <summary>
/// SHA1を使ってハッシュを作成する。
/// </summary>
/// <param name="source">対象文字列。</param>
/// <returns>ハッシュデータ。</returns>
private string MakeHash_SHA1(string source)
{
    return BitConverter.ToString(new SHA1CryptoServiceProvider()
        .ComputeHash(Encoding.UTF8.GetBytes(source))).Replace("-", string.Empty);
}

ま、

  • どんな長さの文字列も決まった長さのデータに変換される。
  • 1文字でも違ったら全然違う結果になる。
  • 処理自体は案外簡単(1行で書こうと思えば書ける)。

といったあたりの説明用に利用しようかと。

以下、自分用メモとして参考にしたサイトを記載しておきます。

qiita.comstackoverflow.comarchive.codeplex.comcsharp.keicode.com

サイバーセキュリティプログラミング ―Pythonで学ぶハッカーの思考

サイバーセキュリティプログラミング ―Pythonで学ぶハッカーの思考

Hacking: 美しき策謀 第2版 ―脆弱性攻撃の理論と実際

Hacking: 美しき策謀 第2版 ―脆弱性攻撃の理論と実際

*1:平文: 暗号化など難読化されていないデータの状態。